pax_global_header00006660000000000000000000000064142506512320014512gustar00rootroot0000000000000052 comment=fb64bf66e0216dd34421f0ca29c10235553d9ea8 numptyphysics-0.3.10/000077500000000000000000000000001425065123200145325ustar00rootroot00000000000000numptyphysics-0.3.10/.github/000077500000000000000000000000001425065123200160725ustar00rootroot00000000000000numptyphysics-0.3.10/.github/workflows/000077500000000000000000000000001425065123200201275ustar00rootroot00000000000000numptyphysics-0.3.10/.github/workflows/build.yaml000066400000000000000000000060251425065123200221150ustar00rootroot00000000000000name: Build from source on: push: branches: - master tags: - '**' pull_request: branches: - master jobs: build: runs-on: ubuntu-latest strategy: fail-fast: false matrix: platform: - sdl1 - sdl2 - emscripten - mingw steps: - uses: actions/checkout@v2 - uses: mymindstorm/setup-emsdk@v9 if: matrix.platform == 'emscripten' - name: Install dependencies run: | sudo apt update sudo apt install -y \ libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libegl1-mesa-dev libgles2-mesa-dev \ libsdl1.2-dev libglib2.0-dev libgl1-mesa-dev - name: Install MinGW build tools and dependencies if: matrix.platform == 'mingw' run: | sudo apt update sudo apt install -y \ gcc-mingw-w64-i686 g++-mingw-w64-i686 wget https://galogen.gpfault.net/releases/1.0/galogen-1.0-linux-x86_64.zip unzip galogen-1.0-linux-x86_64.zip chmod +x galogen ./galogen gl.xml --ver 3.0 --profile compatibility mv gl.[ch] external/glaserl wget http://libsdl.org/release/SDL2-devel-2.0.14-mingw.tar.gz tar xvf SDL2-devel-2.0.14-mingw.tar.gz wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-2.0.15-mingw.tar.gz tar xvf SDL2_ttf-devel-2.0.15-mingw.tar.gz wget https://www.libsdl.org/projects/SDL_image/release/SDL2_image-devel-2.0.5-mingw.tar.gz tar xvf SDL2_image-devel-2.0.5-mingw.tar.gz cp /usr/lib/gcc/i686-w64-mingw32/*-win32/libgcc_s_sjlj-1.dll . cp /usr/lib/gcc/i686-w64-mingw32/*-win32/libstdc++-6.dll . cp /usr/i686-w64-mingw32/lib/libwinpthread-1.dll . rm -f SDL2_image-2.0.5/i686-w64-mingw32/bin/zlib1.dll cp -v SDL2*/i686-w64-mingw32/bin/*.dll . - name: Build from source run: | WRAPPER_SCRIPT="" if [[ "${{ matrix.platform }}" == "emscripten" ]]; then WRAPPER_SCRIPT=emmake fi $WRAPPER_SCRIPT make PLATFORM=${{ matrix.platform }} V=1 - name: Package (mingw) if: matrix.platform == 'mingw' run: | mkdir -p dist zip -r dist/numptyphysics-win32 numptyphysics.exe data *.dll README.md AUTHORS COPYING - name: Package (emscripten) if: matrix.platform == 'emscripten' run: | mkdir -p dist zip -r dist/numptyphysics-html5 numptyphysics.{html,js,wasm} - uses: actions/upload-artifact@v2 with: name: build-result path: dist/* if-no-files-found: ignore - name: Upload Release if: startsWith(github.ref, 'refs/tags/') run: | gh release create "${GITHUB_REF#refs/tags/}" || true gh release upload "${GITHUB_REF#refs/tags/}" dist/* || true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} numptyphysics-0.3.10/.gitignore000066400000000000000000000000741425065123200165230ustar00rootroot00000000000000*.d *.o *.a numptyphysics mk/main.mk platform/*/platform.mk numptyphysics-0.3.10/AUTHORS000066400000000000000000000000711425065123200156000ustar00rootroot00000000000000Tim Edmonds Thomas Perl numptyphysics-0.3.10/COPYING000066400000000000000000001045131425065123200155710ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . numptyphysics-0.3.10/README.md000066400000000000000000000043031425065123200160110ustar00rootroot00000000000000Numpty Physics ============== [![Build from source](https://github.com/thp/numptyphysics/actions/workflows/build.yaml/badge.svg)](https://github.com/thp/numptyphysics/actions/workflows/build.yaml) Harness gravity with your crayon and set about creating blocks, ramps, levers, pulleys and whatever else you fancy to get the little red thing to the little yellow thing. Numpty Physics is a drawing puzzle game in the spirit (and style?) of Crayon Physics using the same excellent Box2D engine. Note though that I've not actually played CP so the experience may be very different. Numpty Physics includes a built-in editor so that you may build (and submit) your own levels. Numpty Physics is released under the GPL. * [Home page](http://thp.io/2015/numptyphysics/) * [Project page](http://github.com/thp/numptyphysics/) Gameplay Hints -------------- Each stroke is like a rigid piece of wire with a mass proportional to its length. A closed stroke is just a wire bent into a shape, it has no substance apart from its perimeter. The ends of a strokes can (and will) join onto other strokes when drawn near enough to another stroke. These joints are pivots so you can use this to build levers, pendulums and other mechanical wonders. Jointed strokes don't collide with each other. Join both ends to make a rigid structure. Editing Hints ------------- It's handy to pause the physics when making a new level though this is by no means necessary. Sometimes it is handy to let the physics run for a little bit just to let the items settle down. From the editor palette you can choose the crayon colour and then additional properties. You should make sure that your level has at least one red item (player token) and at least one yellow item (goal item). Token strokes will only join to other token strokes. Goal strokes will only join to goal strokes. Other strokes will happily join to any non-token non-goal strokes. Compilation Instructions ------------------------ On a Debian based system, you may install required packages like this: apt-get install build-essential libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev to compile, you simply issue: make if all goes well, you should end up with the `numptyphysics` binary. numptyphysics-0.3.10/data/000077500000000000000000000000001425065123200154435ustar00rootroot00000000000000numptyphysics-0.3.10/data/C00_Title/000077500000000000000000000000001425065123200171265ustar00rootroot00000000000000numptyphysics-0.3.10/data/C00_Title/L00_title.npsvg000066400000000000000000000464051425065123200217520ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C01_Tutorial/000077500000000000000000000000001425065123200176515ustar00rootroot00000000000000numptyphysics-0.3.10/data/C01_Tutorial/L01_tutorial.npsvg000066400000000000000000000563771425065123200232310ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C01_Tutorial/L02_jetstream.npsvg000066400000000000000000000027361425065123200233530ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/000077500000000000000000000000001425065123200176065ustar00rootroot00000000000000numptyphysics-0.3.10/data/C10_Standard/L05_plane_sailing.npsvg000066400000000000000000000017411425065123200241150ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L10_the_leap.npsvg000066400000000000000000000113371425065123200230670ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L15_trampoline.npsvg000066400000000000000000000156771425065123200235000ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L30_see_saw.npsvg000066400000000000000000000127561425065123200227440ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L35_pendulum.npsvg000066400000000000000000000111751425065123200231460ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L35_pusher.npsvg000066400000000000000000000200161425065123200226150ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L38_box.npsvg000066400000000000000000000124221425065123200221040ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L40_tree_of_life.npsvg000066400000000000000000000115221425065123200237270ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L50_nautilus.npsvg000066400000000000000000000351751425065123200231640ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C10_Standard/L99_Gravity_Test.npsvg000066400000000000000000000075011425065123200237510ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_butelo/000077500000000000000000000000001425065123200173445ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_butelo/balloons.npsvg000066400000000000000000000312501425065123200222350ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_butelo/basketball.npsvg000066400000000000000000000127611425065123200225360ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_butelo/roller.npsvg000066400000000000000000000052451425065123200217300ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_catalyst/000077500000000000000000000000001425065123200176765ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_catalyst/L100j.npsvg000066400000000000000000000200701425065123200215420ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_catalyst/L101j.npsvg000066400000000000000000000061261425065123200215510ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_catalyst/L102j.npsvg000066400000000000000000000156771425065123200215650ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_catalyst/L103j.npsvg000066400000000000000000000075621425065123200215600ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_catalyst/L104j.npsvg000066400000000000000000000157451425065123200215630ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_christeck/000077500000000000000000000000001425065123200200315ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_christeck/christeck_basic_cubes.npsvg000066400000000000000000000045631425065123200254210ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_christeck/christeck_block_on_hole.npsvg000066400000000000000000000017331425065123200257500ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_christeck/christeck_treasure_chest.npsvg000066400000000000000000000211611425065123200261700ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_christeck/christeck_weird_wheel.npsvg000066400000000000000000000113721425065123200254510ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_dneary/000077500000000000000000000000001425065123200173345ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_dneary/L96.npsvg000066400000000000000000000173001425065123200207660ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_dneary/L97.npsvg000066400000000000000000000123271425065123200207730ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_dneary/L98.npsvg000066400000000000000000000135331425065123200207740ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gesualdi/000077500000000000000000000000001425065123200176475ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_gesualdi/AlmostEasy.npsvg000066400000000000000000000541531425065123200230170ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gesualdi/Bell.npsvg000066400000000000000000000043651425065123200216140ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gesualdi/GarbageCleaner.npsvg000066400000000000000000000340031425065123200235500ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gesualdi/GetOutComeIn.npsvg000066400000000000000000000107151425065123200232340ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gesualdi/Hanged.npsvg000066400000000000000000000142061425065123200221170ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gesualdi/Inverse.npsvg000066400000000000000000000044251425065123200223460ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gesualdi/Packman.npsvg000066400000000000000000000343401425065123200223040ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gnuton/000077500000000000000000000000001425065123200173645ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_gnuton/eyesInTheLake.npsvg000066400000000000000000000276561425065123200231550ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gudger/000077500000000000000000000000001425065123200173275ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_gudger/Bullseye.npsvg000066400000000000000000000131241425065123200221730ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gudger/Playground.npsvg000066400000000000000000000272161425065123200225420ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_gudger/TowerPower.npsvg000066400000000000000000000064401425065123200225270ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_guile/000077500000000000000000000000001425065123200171575ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_guile/CatchMe.npsvg000066400000000000000000000407231425065123200215500ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_guile/FlytoSun.npsvg000066400000000000000000000772171425065123200220370ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_guile/Innardio.npsvg000066400000000000000000000064151425065123200220070ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_guile/Pizza.npsvg000066400000000000000000000524721425065123200213450ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_guile/SqurrelNuts.npsvg000066400000000000000000000501221425065123200225450ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_hurd/000077500000000000000000000000001425065123200170145ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_hurd/breakdown.npsvg000066400000000000000000000201001425065123200220400ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_hurd/hoist.npsvg000066400000000000000000000143711425065123200212270ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_hurd/hurd1.npsvg000066400000000000000000000212131425065123200211150ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_ioan/000077500000000000000000000000001425065123200170005ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_ioan/ioan1.npsvg000066400000000000000000000105741425065123200210750ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_ioan/ioan2.npsvg000066400000000000000000000050251425065123200210710ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_ioan/ioan3.npsvg000066400000000000000000000046521425065123200210770ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_ioan/ioan4.npsvg000066400000000000000000000051571425065123200211010ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_ioan/ioan6.npsvg000066400000000000000000000121041425065123200210710ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_ioan/ioan7.npsvg000066400000000000000000000241061425065123200210770ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_jhoff80/000077500000000000000000000000001425065123200173165ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_jhoff80/ManintheMoon.npsvg000066400000000000000000000330571425065123200230010ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_leonet/000077500000000000000000000000001425065123200173405ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_leonet/L110ParadiseIsland.npsvg000066400000000000000000000354651425065123200236550ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_melvin/000077500000000000000000000000001425065123200173445ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_melvin/melvin1.npsvg000066400000000000000000000272161425065123200220060ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_melvin/melvin2.npsvg000066400000000000000000001124351425065123200220050ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_melvin/melvin3.npsvg000066400000000000000000000451171425065123200220100ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/000077500000000000000000000000001425065123200200265ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_noodleman/Noodle_Grail.npsvg000066400000000000000000001062601425065123200234500ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_Pegboard1.npsvg000066400000000000000000000406131425065123200242150ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_Pegboard2.npsvg000066400000000000000000000413651425065123200242230ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_Pegboard3.npsvg000066400000000000000000000646151425065123200242270ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_bungee.npsvg000066400000000000000000001166211425065123200236610ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_menhir.npsvg000066400000000000000000000313071425065123200236730ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_one.npsvg000066400000000000000000000301641425065123200231720ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_rocker.npsvg000066400000000000000000000334441425065123200237020ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_sea.npsvg000066400000000000000000000625211425065123200231630ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_noodleman/Noodle_trapeze.npsvg000066400000000000000000000134711425065123200240650ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_papky/000077500000000000000000000000001425065123200171765ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_papky/papky1.npsvg000066400000000000000000000165041425065123200214700ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_perli/000077500000000000000000000000001425065123200171655ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_perli/L02_hammer-tut.npsvg000066400000000000000000000237401425065123200227520ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_perli/L03_kickit-tut.npsvg000066400000000000000000000545701425065123200227650ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_perli/L11_easterbunny.npsvg000066400000000000000000000467261425065123200232370ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_qole/000077500000000000000000000000001425065123200170125ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_qole/L97_saved.npsvg000066400000000000000000000265641425065123200216430ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_qole/L98_saved.npsvg000066400000000000000000000166241425065123200216400ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/000077500000000000000000000000001425065123200173635ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_siminz/L02_bridge Gaps tut.npsvg000066400000000000000000000405241425065123200237700ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L06_Scribble tut.npsvg000066400000000000000000000336001425065123200234070ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L11_Bulldoze.npsvg000066400000000000000000000441001425065123200226360ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L12_Caves.npsvg000066400000000000000000000351021425065123200221220ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L12_Fix Car.npsvg000066400000000000000000000210741425065123200223000ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L13_See Saw.npsvg000066400000000000000000000276601425065123200223230ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L16_forest.npsvg000066400000000000000000001064511425065123200223750ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L18_Elevator.npsvg000066400000000000000000000612261425065123200226560ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L25_Propeller.npsvg000066400000000000000000000541011425065123200230310ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L26_MouseTrap.npsvg000066400000000000000000001112611425065123200230060ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L26_Pull_Pins.npsvg000066400000000000000000000434611425065123200230020ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L32_tarzan.npsvg000066400000000000000000000331771425065123200223740ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L34_dump truck.npsvg000066400000000000000000000664171425065123200231600ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L38_Pac_Man.npsvg000066400000000000000000001075551425065123200224030ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L39_Square_Roll.npsvg000066400000000000000000000463351425065123200233340ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L52_Dominoes.npsvg000066400000000000000000000310561425065123200226460ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L54_Funnel.npsvg000066400000000000000000000636471425065123200223350ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L56_david.npsvg000066400000000000000000000654511425065123200221720ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L58_Monster.npsvg000066400000000000000000001051761425065123200225330ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L60_pulleys.npsvg000066400000000000000000000362441425065123200225710ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L62_Kong.npsvg000066400000000000000000000773311425065123200217760ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L63_Roped Rocks.npsvg000066400000000000000000001112311425065123200232000ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L70_Factory.npsvg000066400000000000000000001164221425065123200225010ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L80_Bottomless_fall.npsvg000066400000000000000000000017551425065123200242260ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L80_Dark_Caverns.npsvg000066400000000000000000001056741425065123200234440ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L80_Desert_Bricks.npsvg000066400000000000000000001002401425065123200236050ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L80_Invisible_Walls.npsvg000066400000000000000000000431061425065123200241570ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_siminz/L80_Lullaby.npsvg000066400000000000000000000276671425065123200225130ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_szymanowski/000077500000000000000000000000001425065123200204505ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_szymanowski/szymanowski1.npsvg000066400000000000000000000144641425065123200242170ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_therealbubba/000077500000000000000000000000001425065123200204725ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_therealbubba/grassy_knoll.npsvg000066400000000000000000000412161425065123200242640ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_therealbubba/surfs_up.npsvg000066400000000000000000000257561425065123200234360ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_werre/000077500000000000000000000000001425065123200171765ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_werre/pengu2.npsvg000066400000000000000000000262001425065123200214550ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_werre/rotate.npsvg000066400000000000000000000257401425065123200215630ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_zeez/000077500000000000000000000000001425065123200170275ustar00rootroot00000000000000numptyphysics-0.3.10/data/C50_zeez/hanging.npsvg000066400000000000000000000151671425065123200215330ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_zeez/jungle.npsvg000066400000000000000000000061621425065123200213770ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_zeez/pendulum.npsvg000066400000000000000000000111751425065123200217440ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_zeez/pusher.npsvg000066400000000000000000000140071425065123200214160ustar00rootroot00000000000000 numptyphysics-0.3.10/data/C50_zeez/ship.npsvg000066400000000000000000000371021425065123200210540ustar00rootroot00000000000000 numptyphysics-0.3.10/data/M00_Menus/000077500000000000000000000000001425065123200171465ustar00rootroot00000000000000numptyphysics-0.3.10/data/M00_Menus/Main.npsvg000066400000000000000000000322461425065123200211200ustar00rootroot00000000000000 numptyphysics-0.3.10/data/M00_Menus/Menju.npsvg000066400000000000000000000217131425065123200213070ustar00rootroot00000000000000 numptyphysics-0.3.10/data/M00_Menus/MenjuX.npsvg000066400000000000000000000124301425065123200214330ustar00rootroot00000000000000 numptyphysics-0.3.10/data/SourceSansPro-Light.ttf000077500000000000000000010746701425065123200220170ustar00rootroot000000000000000BASE‹”±`€:DSIGpÝ /`¼üGDEFƒ$‡´#DÂGPOSwßÇ'ýGSUB’¢‰$$iaáaë:ë:ë:ë:ë:ë:ë:ë:ë:ë:ë:ë:ëë:ë:ë:ë:ë:ë:ë:ë:ë:AAA\Á4Á4Á4Á4Á4%4 4 4 4ã4ã4ã4ã4ã4ã4ã4ã4ã4ã4ã4ã4ã"ã4ã4ã4ã4ã4ç4ç4ç4ç4ç4ç4ç4ç4ÿí\\\åÿÿå=åÿèåÿÎåÿôåÿ÷åÿèå;åKå%å%åÿÞå\åÿßÐ\Ð\Ð\Ð\íAñ\4\í8í\íÿöíï ,\,\,\\\\\\\\\Ù:44444444444(44444.P44444444=\==>=\=J=J=ÿô• • • • • • • \8888888UUUUUUUUUUUUUUUUUUUUUUU­­­­´ ´ ´ ´ ´ ´ ´ ´ ”””””< \\åÿßÉKóT \ \ÁÁ4 4 4ã& 4ð\ã&e&«5¼'5ñÿå!5!5æ4² ÝU\\&\ñ6+ïÿ™ÿýí\\\,U,U,\ÿó\\4¬4‡4=ÿü=ÿü=ÿü=\2\Ú\Ú*• åÿßñÿå8%*U² ­´ ”¢”–¤¤ûB!÷!ÿ!!%!8+8+8+88ÿø88!8+88+8+8+8|a 4 4 4 4 4 4 4 4 4 4 4 4 4 . 4 4 4 4 4 4 4 4 4!5!5!5!5!5!5!5!5!5å\åCê\4\ååMåÿ÷åÿ÷ç þ!Baåa-a2aŒ7ða.aëÂa|aþ/Œ7za%a/ ¿·0âœF“. #ÿéŸÿéÿéðÿò ÿéÿ鿤ÿé4 YÇ  ;³44WúBï\ÏTÍ\½ ˜# 4-X4¹ñF‡4Æ ŒF¢:§4WúL‡44³4Wï\ïÿõ 4ñFñF¢:ïÿìñFÿüÿò Šÿó„ÿò‰ÿóƒÿò>ÿè>ÿè^ÿó^ÿò#ÿê#ÿé¼ÿó·ÿò»ÿóµÿòÛÿóÛÿòŸÿêŸÿé8ÿó3ÿò7ÿó2ÿò&ÿè&ÿèLÿóLÿòÿêÿéªÿó¤ÿò©ÿó£ÿò˜ÿè˜ÿèðÿððÿüÒÿóÇÿò¢ÿê ÿé:ÿó6ÿò9ÿó3ÿò€ÿòSÿòÿêÿé¯ÿò®ÿò¡ÿè¿¿ÖÿóËÿò¥ÿë¤ÿé>ÿó9ÿò=ÿó7ÿò ÿè ÿèüÿüÿòxÿórÿòvÿóqÿò,ÿè,ÿèmaÈÿóÈÿò&ÿó!ÿò%ÿóÿòÿèÿè}.Ãÿó¸ÿò,ÿó&ÿò+ÿó%ÿòÿÿèÿÿè4444444444444³4³4³4³4³4³4³4³4WWWWWWWWWWWï<ï-ïï>ïÿíïÿäïÿíïÿîïÿðïÿðïÿÞïÿøïÿÏïÿìïÿìïÿÞ 4 4 4 4 4 4 4 4XXñFñFñFñFñFñFñFñFñFñFñEñFñFñFñFñF¢:¢:¢:¢:¢:¢:¢:¢:¢:¢:¢:444444444444WWWWWWWWWWWW¢:¢:¢:¢:¢:¢:¢:¢:¢:¢:¢:¢:ÏT 4Ã4’\ÜÛ0ÛCÛCÛRÛGö ÿéï\ÔÔÅÂö…|…†ˆˆg„„v\ÿó\ÿò ÿê ÿé¹ÿó´ÿò¹ÿó³ÿò¨ÿè¨ÿè8aBaåak!a ÿóù$.„a„a+a+a*afÂaaŒ7za%a47 ëÉ0âraCGFaKaÊþa8a4&sa2aa§åa47 .ðaðÿòðÎ)~Ÿa«+a*a*a„aëza`Œ7öåaú%- %ÿô%$.]aVaVa¹ÁÁ„a47¿¿HGCaða ùÿóù)aˆ>„aŒ7Œ7ëëë:<ð\\õã4zzÿú{¼**\*\Ö\Ö\Ö\ù j\&\4\ \Á4¹´ Ä4—\êBÎ\Ì\D|\Ü\ÁÌ\ñ*ã4ã4\Á4• åKåÿôçåÿßÄå\Ö\Ö\Ö\*\´ "\14¼ –\•!ÿú¼*ù\ù\ù\MMM$\Á4² ² »èB\z{ÿú{í\ë:Aã4ã&*\44´ ´ 4QC?$ß0ßTß'ßßßß4ß,ß(ß+ß0ß08Y9æ'ßï ßø?Ü,ÿ9ø488ß0ßTß'ßßßß6ß,ß(ß!ö8Y9å.ßößö>Ú,ö0ö)ß0ßTß'ßßßß6ß,ß(ß+ÛCÛ0ÛCÛ0¢hWW’%’3ÛShSÛ:Û:h:h:Û:h:+6+6+(+(à( (Ü(˜(ß( (ÛC(ô ô þ;X b#e â_eâ_‹F¤<¤<ß2*b_þW %}W}%”"bbWbWbbå3ã3‘bb bf.4ò4ß$åKÃaî7aÍa¨a7Baða£)ëa¡apa=a>7óa>7ôaÉ.Å9_¥˜¤€Ø2ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃö¶¶%aî7î7î7î7î7aaa-%ÍaÍaÍaÍaÍaÍaÍaÍaÍaÍaÍ`ÍaÍLÍaÍaÍaÍaÍa777777777BaBaBae$ððOðÿñðÿÓðÿòðÿüðPðÿñðAðRð,ðÿð£)ëaëaëa¡U¡a¡a¡a¡a¡¡a¡papapa=a=a=a=a=a=a=a=a>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>.Í7>7>7>7>7>7>7>7>7>7ôaôaôaôaôaôaôaÉ.É.É.É.É.É.É.ˆ.9bÅÅÅÅÅÅ9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_D_D_D_D_D_D_˜˜˜˜€€€€€€€€Ø2Ø2Ø2Ø2Ø2-%øa9>$aáa=aÃa±aáÍaØ2Ba>7ðaëa¤pa=a¿/>7<aóaÍ/Å€q0¤PF9,ðÿò€´2a),Ãùaa±a!Ía‘ Þ/=a=aëapaBa>7<aóaî7Å£j0¤1aGçaéad­aùaí&aóÍaÍaJ±aì7É.ðaðÿòð£)ò!aRëa=a£9a>7¬±aÆ%½ Þ/ahDaî7€€Ê Gaða‘ öÍa9>=a>7>7££ò$Þ8M9³&¶È#¿#ÖC›!Ü:Ò4WW’/’=ÛShSÛ:Û:`:`:+(›(ª(X b#j(j^j/j(j.j(j2j2j1j)ÛBÛ)Ÿ,Ÿ"j(j^j/j(j.j(j2j2j1j)ÛBÛ)Ÿ,Ÿ"j(j^j/j(j.j(j2j2j1j)ÛBÛ)Ÿ,Ÿ"j(j^j/j(j.j(j2j2j1j)ÛBÛ)Ÿ,Ÿ"Q*o%h!\~=t"’=U=<="¨=¡=4s=6=Õ=¥=°"s=°!u=YY¦<GC +ÿþbQ*o:.!o%J·L"d:™.ÿê=:¢:$:g:h!o:o%Ý:Øk9-Ò+Û6Û6€ÿª)JJJo%o%™:Ÿ,ã([(1(7*ßß;ß6ßßßß>ß ßAß6ßßßÿóßEßß4ßßAßIßß"ß"ßPÿ[Pÿ[Pÿ[%(Š(üJJ(J$/J$/$(2.J$(JJ$($(JI$(ß"ß"ß4ß"æÃß"ß"ß"ß"ß"ß"ßBß"ß(ß(ß"û)\ó$+:1-“.çŒ^u .ll+l&l+Š-ŠŠ#Š-Š6Š6Š-Š-Š6Š6ŠŠJJPÿüßó;ÛRhRÛGÛRÛ:Û: ! ˜Ö_Ú6Úÿø_gvª¾åÀÕN4ÿÿÿ·ÿËÿ×ÿëÿvÿyÿ\ÿ[ÿ…ÿ„ÿ…ÿ„ÿkÿmÿxÿxÿÚÿØÿ‚ÿzÿÉÿÉÿŸÿ¨ÿ³ÿ­ÿvÿyÿâÿNÿIÿkÿxÿÕÿºÿÖÿÉÿ»ÿ³ÿ»ÿøÿÄÿ§ÿ§ÿ§ÿ§ÿÚÿ‚ÿŸÿ¬ÿ¼ÿ¬ÿ¬ÿÊÿËÿëÿ‹ÿvÿkÿkÿ\ÿ…ÿ\ÿÎÿ‹ÿ‹ÿcÿµÿ\ÿ[ÿíþ;ÿ„ÿ{ÿyÿ„ÿ{ÿyÿkÿƒÿ{ÿ„ÿ{ÿ„ÿÿÿGÿ„ÿÿ~ÿtÿkÿxÿkÿxÿkÿxÿvÿtÿ…ÿ‚ÿ…ÿ„ÿ{ÿqÿ}ÿzÿzÿ}Çß……}þ!ô!$ê,$ êø ÷|Á¨Á@€™š£ÖxŒwŸABCDEFGHIJyzÜÛÝ~¿ ›¡œá– !"#$%&'()*+,-./01234567 žã<?S]™¢Ñûúüþý ">=?A]dcegf”“•—¤¦­©¦•§‹º¸»âN¯æàÞߪçèíîqé`bXt}åê®ä늋{8;¡°uŽ„…‚ƒÙ±ë¾¬ˆ‰–—¥”†‡Â:^9`\|}{Ÿ žÎÏÍIÆää /@`~¿Ñßñ~€“¡°ÂÜãçëõùý7CQX\hjnv{~„’•™Ÿ¢°³¹¼¿ÁÌÑÞã  *,14=BEauz~ŠŒ¡«°ÂÎÑÕ×ÙÛÝá /6:W\_cu“›£«³·»ÂÑÙãéïóCIMPRX[œ »!%+;ISco…—žù !)19AEIMQWY[]ai}‡‘—¡§´ÄÓÛßïôþ     " & 0 3 5 : ? D I q y  ‰ Ž ” ¡ ¤ § © ¬ ® ² µ º ½!!! !"!&!.!R!Z!^!‰!“""""""""+"H"`"e#% %³%·%½%Á%Æ%Ê%Ì&&j''R'ç.%.;ûþÿÿÿ 0Aa ÀÒàò€’ ¯ÂÍâæêôøü7CPRY^jlox}€ˆ”˜œŸ¡°²·»¾ÁÆÐØà#,.49BEatz~„ŒŽ‘£¬±ÃÐÕ×ÙÛÝá 07;X]br– ª®¶ºÀÏÔâæîòCGMORV[œ »  $*2>RXl€Ž’ž   "*2:BHJPRY[]_bj€‚ˆ’˜¢¨¶ÆÖÝàòö     & / 2 5 9 < D G p t } € ” ¡ ¤ ¦ © « ® ± ´ ¸ ½!!! !"!&!.!P!S![!‰!""""""""+"H"`"d#% %²%¶%¼%À%Æ%É%Ì&&j''R'æ.".:ûþÿÿÿÿõÿ“ÿh@ÿ‡þÿoÿqÿpÿpÿqÿpÿoÿnÿkÿjÿ@ÿ_ÔONÖJÈ100/-)%$ ÿöÿõÿéþÒþ°þ«þ¨ÿ‹ÿŠÿ‰ÿˆÿ…ÿ®ÿ¯ÿ±ÿzÿ|ÿ~ÿ´ÿ¶ÿ¸ÿ¹ÿ»é:é6é9é7èãèâèÛâ(ãéãèã}ããÞãÛãkãmãÓãÕãcãdãcã¿ãÁã½ã¹çŠäUæÔæÓäOæzå¸å¶å³æ ææ æ æ æ æææåÜãœã™åÆåÂåsåtåLåaäæäåäßäªäÈä¾äœä‚äzá’áUáGáEáAá?á0áTàñàšßðߦÜÌÖ’ÖVàþ\–Ôö2FHJJhjlnprtvtxzvxr~„šœ– ¢²ºÜÎÐÖÜæìîøúü "$&8NPflvx€0>DR`nlp~ °ÀØô:>LTX\^Z^bbXTTNDD. (|Á¨Á@€™š£ÖxŒwŸABCDEFGHIJyzÜÛÝ~¿ ›¡œá– !"#$%&'()*+,-./01234567 žã}­©§ª¢¦¸`Šåº¦à*+ç§”)b‹ÃÄÅ89:;<?NS\]^`{|}õ™žŸ ¡¢دÍÎÏÑéö‹úûüýþ "=>?A»]cdefgÙt“”•—¯¼±=ÿ>MTUWVX[a#b$c%l._!o1p2q3r4w8z<~@€B†H…FIù¿‡JˆKN‹ORŒPŽQ’V–Zš^˜\bø½£h­r¤i°u¸}»~¹¿„À…‡Á†Ènj̒ЖҘәԚ՛ݣæ¬ê°ëð¶ò¸ñ·®v±vÞ¤@‚C¥jÖœ×ØžÙŸÚ Ps5·|n0—[OÈɎÀÈÎÏÐÑÒÓÔÕÖ×ÙÉØÛ†Ž“• š›ˆ”!$')+-/3579;=BDFQRSTVXZ[lnYhZ[\_a‡RSTUVWX]`~€ˆbcdefghijklmnopqrzstuvwxy‚…ƒ„†ÁÂÃÄÅÆ É#Ê$Í'Ð*Ñ+Ò,Ó-Ô.Õ/Ö0ר14Û5Ü6Ý7Þ8ß9à:á;â<ã=~€‡‰Œ‘RYZm/t6x9y;‰LŠMST‘U“W”X•Y›_œ`a®sº€¼½‚¾ƒÄ‰ÅŠÊËäªå«ç­ì²ó¹ôº:‘ABCDEFG H I J K Ld&e'f(g)h*i+j,k-ƒD„E¦k§l¨m©nªo«p¬q²w³x´yµz¶{ۡܢߥà¦á§â¨ã©è®í³î´ïµíîïðñò‰ŠŽ‘’ö÷ž¡¢£¤¥¦   §¨«¬­®¯°Á34789:;<ÄÅÈÉÊËÌÍëìøù  %&56ÏÐÑÒÓÔÕÖKLØÙÚÛÜÝÞßWXáâãäåæçèóôA>BõI“”‹ŒÎqpr|MJNU—˜Ÿ ×vxz±²©ªwy{./01!"-2Âý¾»}~tYVZ=aµ¶ÆÇàus’Ž“¨‚ƒ†„…‡¤¥•”©­—˜ª¬«(…23Š´¬¼¹º?¹ÎÓÔí×Úê÷–—• %œ!  !!|""##Á$$¨%%Á&&@''€()™**£++Ö,,x--Œ..w//Ÿ09A:;y<<Ü==Û>>Ý??~@@¿AZ[[›\\¡]]œ^^á__–``az{{|| }}ž~~ã  ¡¡}¢¢­££©¤¤§¥¥ª¦¦¢§§¦¨¨©©¸ªª`««Ь¬å­­®®º¯¯°°¦±±ಳ*´´µµç¶¶§··”¸¸¹¹)ººb»»‹¼¾ÿ¿ÀÄ8ÅÅ?ÆÆNÇÇSÈÊ\ËË`ÌÎ{ÏÏÐÐõÑÑ™ÒÖž××ØØØ¯ÙÛÍÜÜÑÝÝéÞÞößß‹àäúååææççèêëë"ìî=ïïAðð»ññ]òöc÷÷Ùøøtùû“üü—ýý¯þþ¼ÿÿ±=ÿ>MTU    W    V  X[a#b$c%l._!o1p2  q!!3""r##4$$w%%8&&z''<((~))@**€++B,,†--H..…//F0011I22ù33¿44‡55J66ˆ77K88N99‹::O;;<<R==Œ>>P??Ž@@QAA’BBVCC–DDZEEšFF^GG˜HH\IIbJJøKK½LL£MMhNN­OOrPP¤QQiRR°SSuTT¸UU}VV»WW~XX¹YYZZ¿[[„\\À]]…^^Â__‡``Áaa†bbÈccddÇeeŒffÌgg’hhÐii–jjÒkk˜llÓmm™nnÔoošppÕqq›rrÝss£ttæuu¬vvêww°xxëyyðzz¶{{ò||¸}}ñ~~·€€÷’’®““v  ±¡¡v¯¯Þ°°¤ÂÂÍÍ@ÎÎÏÏ‚ÐÐCÑÑ¥ÒÒjÓÓÖÔÔœÕÕ×ÖÖ×רØØžÙÙÙÚÚŸÛÛÚÜÜ ââPããææsçç5êê·ëë|ôônõõ0øø—ùù[üüOýýÈɎ77¾CCQPPÀQQÈRXÁY\Ê^gÎhhÙjjÚlnÜovàx{è}~쀄ó”•þ˜˜™™ÉœœØÛŸŸß¡¢°°„²²†³³Ž··“¸¸•¹¹ »¼ ¾¿ ÁÁ—ÆÌÐÑ˜ØØÙÙÚÚÛÛÜÜÝÝÞÞšàà›ááˆââãã”!$')+-/35  7  9  ;  =@BDF H#&Q''V((X)*Z,,\.1]44a9=bBBgEEiaajtujzzo~~g„„l……n††Y‡‡hˆŠZŒŒ^ŽŽ_a‡‘¡A£©Rªª]««`¬¯~°°ˆ±ÁbÂÂzÃÉsÊÊ‚ËË…Ì̓ÎΆÐÑ{ÕÕ}××bÙÙcÛÛdÝÝeááf® · ¾Š“/™06ä7:í;WóX\]_bbÁccrrÂssttÃuuÄ‘‘’’Å““––Æ—— ˜˜É™™#ššÊ››$  Í¡¡'¢¢Ð££*ªªÑ««+®®Ò¯¯,°°Ó±±-²²Ô³³.¶¶Õ··/ººÖ»»0ÀÁ×ÂÂ1ÏÏ4ÐÐÛÑÑ5ÔÔÜÕÕ6ÖÖÝ××7ØØÞÙÙ8ââßãã9ææàçç:èèáéé;îîâïï<òòãóó=CC}GG~HI€MMƒOO‡PP‰RR‹VVŒWX[[’œœ  ‚»»–R  Y  Zm/  t!!6$$x%%9**y++;22‰33L44Š55M6677S8899T::‘;;U>>“??W@@”AAXBB•CCYDD›EE_FFœGG`HHIIaRR®SSsXXºYY€ZZ¼[[\\½]]‚^^¾__ƒ``Äaa‰bbÅccŠllÊmmnnËoo€€äª‚‚僃«„„ç……­ŽŽì²’’ó““¹””ô••º––:——‘žžÆ  A¡¡¢¢B££¤¤C¥¥¦¦D§§¨¨E©©ªªF««¬¬G­­ ®®H¯¯ °°I±± ²²J³³ ´´Kµµ ¶¶L··¸¸d¹¹&ººe»»'¼¼f½½(¾¾g¿¿)ÀÀhÁÁ*ÂÂiÃÃ+ÄÄjÅÅ,ÆÆkÇÇ-ÈȃÉÉDÊÊ„ËËEÌ̦ÍÍkÎΧÏÏlÐШÑÑmÒÒ©ÓÓnÔÔªÕÕoÖÖ«××pØجÙÙqÚÚ²ÛÛwÜܳÝÝxÞÞ´ßßyààµáázââ¶ãã{ääÛå塿æÜçç¢èèßéé¥êêàëë¦ììáíí§îîâïï¨ððãññ©òòèóó®ôôíõõ³ööî÷÷´øøïùùµéí ‰ öú•™ !þ"'()*/¡01 27 89§:?«@ABEHI³JM·PQ#RW'YY¼[[¿]]À__Á`a3bg7hiÄjoÈpqërsøtuvw xyz{%|}5€?‚‡CˆÏ‘K’—O˜ŸØ ¡W¢§[¨¯á°±ó²²A³³>´´B¶¶õ··I¸¹“º»‹¼¼Î½½q¾¾p¿¿rÀÀ|ÁÁÂÂMÃÃJÄÄNÆÆÇÇUÈÉ—ÊËŸÌÌ×ÍÍvÎÎxÏÏzÐÑÒÓÖÖ××ØÙ±ÚÛ©ÝÝwÞÞyßß{àã.äå!ææ-çç2èéÂêë½ìì»íî}ïïtòòYóóVôôZöö=÷÷aøùµúûÆüüàýýuþþs  ‘  ’  Ž  “  ¨  ‚  †  „  ‡ !¤ " "• & &{ / /” 0 0 2 3 5 5 9 :ˆ < <© = =­ > ?— D D¾ G Gª H H¬ I I« p p( q q… t y, } ~2  Š € ‰6 Ž@ ” ”ž ¡ ¡¯ ¤ ¤° ¦ §± © ©³ « «´ ¬ ¬¬ ® ®» ± ²µ ´ µ· ¸ ¸¼ ¹ º¹ ½ ½½!!ï!!?!!¹! ! ¼!"!"»!&!&ì!.!.ð!P!PÎ!Q!RÓ!S!ZÆ![!^Ï!‰!‰Õ!!“ñ""è""ë""î""í""×""¿""Ú""ê""æ"+"+é"H"Hä"`"`â"d"eÞ##®% % õ%²%³ù%¶%·û%¼%½ý%À%Áÿ%Æ%Æö%É%É÷%Ê%Ê%Ì%Ì &&&j&j'''R'Rø'æ'ç².".%´.:.;ûûûû–ûûþÿþÿ•ñjñk½¸,K¸ PX±ŽY¸ÿ…¸D¹ _^-¸, EiD°`-¸,¸*!-¸, F°%FRX#Y Š ŠIdŠ F had°%F hadRX#eŠY/ °SXi °TX!°@Yi °TX!°@eYY:-¸, F°%FRX#ŠY F jad°%F jadRX#ŠY/ý-¸,K °&PXQX°€D°@DY!! E°ÀPX°ÀD!YY-¸, EiD°` E}iD°`-¸,¸*-¸,K °&SX°@°YŠŠ °&SX#!°€ŠŠŠ#Y °&SX#!¸ÀŠŠŠ#Y °&SX#!¸ŠŠŠ#Y °&SX#!¸@ŠŠŠ#Y ¸&SX°%E¸€PX#!¸€#!°%E#!#!Y!YD-¸ ,KSXED!!Y-°+²+²+·x^T<+·[J@.+·x`<,+·x`<,+²+° E}iDK¸`RX°°Y°Ž$$.= ÿ3 æ  > ~  È ÈÈÈÈd,ÌTÐ@x¸ ¼Èl    ˆ 8  p ô p\”ð|@à`ül˜øä„,”p¬ $ ô!”"<"°"È"à"ø##(#@#X#p#ˆ# #¸#Ð#è$$$8$P$h$€$˜$¸%Œ&X&p&ˆ'd'|'”'¬'Ä'Ü'ô( ($(<(L(d(|(”(¬(Ä(Ü(ô) )$)<)T)l)„)œ)´)Ô*˜*°*È*à*ø++(+@+X+p,d,|,”,¬-l-„-œ-´-Ì-ä-ü..,.D.\.Ø.ð// /8/P/h/€/˜/°/È/è00„0œ0´0Ì0ä0ü11,1D1\1t1Œ1¤1¼1Ô1ì22242L2d2|2”2¬2Ä2Ü2ü33,4@4ü5Ø5ð66 686P787P7h7€7˜7°7Ð7è88808H8`8x89h9€9˜9°9È9à:d:|:”:¬:Ä:Ü:ô; ;$;<;T;l;„;œ;´;Ì;ä<°=`=x==¨=À=Ø=ð>> >8>P>h>€>˜>°>È>à>ø??(?@?X?p@0@´ApB@BÄBÜBôC C$C<CTClC„CœC´CÌCäCüDD,DLDdD|D”D¬DÌFG„GœG´HÄHÜHôI I$I<ITIlI„IœJ¬JÄJÜJôK K$K<KTKlK„KœK´KÌKäKüLL4M8MPMhM€M˜M°MÈMàMøNN(N@NXNpO0OHO`OxOO¨OÀOØOðPP°Q,QDQ„QœQ´QÌQäRlR„RœR´RÌRäSSS°SÈSàSøTT(T@TXTpTˆT T¸TÐTèUUU0UHU`UxUU¨UÀUØUðVV V@VXVpW€X¬Y„YœY´YÌYäYüZì[[[4[L[d[„[œ[´[Ì[ä[ü\\,\D]L]d]|]”]¬]Ä]Ü^¨^À^Ø^ð__ _8_P_h_€_˜_°_È_à_ø``(aaÄaÜaôb b$b<bTblb„bœb´bÌbäbücc,cDc\ctcŒc¤c¼cÔdÜeÐffôgÜhÔi¼jÐklllmxnŒoPp<pLqrrès¼t”u,vHwLxxØyðz˜{\|@|¬}@}¬~¸ˆà€Ìü‚ìƒô„°…p††Ì‡¨ˆ¨‰4‰ÀŠp‹‹„ŒŒ¸ÌŽ`(´”‘l’’€“L“ô”h••Ж—— ˜L˜ü™xš<›0›H›`œ\äžLždž|ž”ž¬žÄžÜžôŸ Ÿ$Ÿ<Ÿì  À Ð è¡¡¡0¡H¡`¡x¡¡¨¡À¡Ø¡ð¢¢ ¢8¢X¢p¢ˆ¢ ¢¸¢Ø£ü¤ ¤$¤<¤T¤l¤„¤œ¤´¤Ì¥ ¥$¥<¥T¥l¥„¥¤¥¼¦,¦D¦T¦d¦´§ §0§@§P¨¨$¨4¨¨¨¸¨È©@©P©¸©Èª4ªDªT« «0«Ì¬¨¬À¬Ø¬ð­­ ­8­P­h­€®¤¯ °T±X²P³ ³Ð´|´ÜµÀ¶l·D·à¹ ¹ÈºŒ»T¼¼ ½d¾H¿¿èÀäÁ”ÂÃxÄlĄĜĴÄÌÄäÄüÅÅ,ÅDÅ\ÅtŌŤżÅÔÅìÆÆÆ4ÆLÆdÆ|ƔƬÆÄÆÜÆôÇ Ç$Ç<ÇTÇlDŽǜǴÇÌÇäÇüÈÈ,ÈDÈ\ÈtȌȤȼÈÔÈìÉÉÉ4ÉLÉdÉ|ɔɬÉÄÉÜÉôÊ Ê$Ê<ÊTÊlʄʜʴÊÌÊäÊüËË,ËDË\Ëtˌˤ˼ËÔËìÌÌ$ÌDÌd̤̄ÌÄÌäÍÍÍ<Í\Í|͜ͼÍÜÍüÎÎ4ÎTÎtΔδÎÔÎôÏÏ4ÏLÏdÏ|ϔϬÏÄÏÜÏôÐ Ð$Ð<ÐTÐlЄМдÐÌÐäÐüÑÑ,ÑDÑ\ÑtьѤѼÑÔÑìÒÒÒ4ÒLÒdÒ|Ò”Ò¬ÒÄÒÜÒôÓ Ó$Ó<ÓTÓlӄӜӴÓÌÓäÓüÔÔ,ÔDÔ\ÔtԌԤԼÔÔÔìÕÕÕ4ÕLÕdÕ|Õ”Õ¬ÕÄÕÜÕôÖ Ö$Ö<ÖTÖlքִ֜ÖÌÖäÖü××,×D×dׄפ×Ä×䨨$ØDØd؄ؤؼØÜØüÙÙ<Ù\Ù|ٜټÙÜÙüÚÚ4ÚTÚtÚ”Ú´ÚÔÚôÛÛ4ÛTÛt۔܀Ý@ÝôÞPÞÄÞÜÞðßß,ß`ßtߨ߼ßÐà(à<àPàdàxàŒà à´àÈàÜàðááá,á@áTá¬ââ<âLâ¨ããTã¤ä€åXåhæææ æàæðè é|éèêÈëXëpì ìäí(íÄíÔíäíôîîî$î4îÌïŒïœð ðññˆòò¸ó8óèôÔõ€õ˜õ°öxö÷D÷T÷d÷|øø øüùÀúPúhû<ûŒû¤û¼ü,üÈýxþþxÿ8¼´|TЀ„ô€ 0 @ ä ° P Ô ä ü ´d|Œ¤´Ìäô $4(Ü,ØèððÈ`x ð,¸„ðXhxÐàxˆøtèhðˆ  ¨!","D"\#X#p$$($8$P$è$ø%È&h&x&'l'¸'Ð'è(X(ì(ü)˜)ì*d+ˆ- -¸. /h0$0˜1L2,2|33´4@4ä5¬6@6P6h8L8ô999,9D9T9l9„9”9¬9Ä:Ì<0=œ>>?,@@ÀA„BTBÄCèD¸EhF$F¤GG G°GÀGÐGàHPH`HpI$IÜJ\JÐKpLPLäM˜M¨NNNÐNàO<OÜOìOüP PPxPˆP˜QQŒR,SS¼T|ULU¼VàW¬WðXDX\XtX”XðYLYôZœZÈZà[,[x[[¨[¼[Ø\\8\P\h\\ \È\ð]]@]h]x]Œ]Ø^^(^l^°^ð_(_`` `Ôaa,a`aaàb4bÈc¬ddTdld„dœd´exe¤eÐeüf(f€fØgg0g\gˆhitj€k4l\m8müoDpœq”q¤r<ss˜tt”tôu¨v$vdvÌwhw´x|yyÀz8{{¼|”|ì}p}à~¨pä€X€p€ˆ€ €¸€Ð€è0H`x¨Ààø‚‚(‚@‚`ƒ0ƒè„„„ü……,…D…\…t…Œ…¤…¼…Ô…ä…ü††,†D†\†t†Œ†¤†¼†Ô†ì‡‡‡4‡L‡lˆ,ˆDˆ\ˆtˆŒˆ¤ˆ¼ˆÔˆì‰‰ìŠŠŠ4Šð‹‹ ‹8‹P‹h‹€‹˜‹°‹È‹àŒ\ŒtŒŒŒ¤Œ¼ŒÔŒì4Ll„ŽŽ0ŽHŽ`ŽxŽލŽÀŽØŽð 8Ph€˜°Èàø(@Xp‘¨’T“,“D“\“t“Œ“¤”ˆ” ”¸”Д蕕•0•P•h•€•˜•°•È•à•ø––(—— —8—P—h—€˜˜ ˜8˜P˜h˜€˜˜˜°˜È˜à˜ø™™(™@™X™p™ˆšHšü››,›D›\›t›Œ›¤›¼›Ô›ìœœœ4œLœdœ|œ”œ¬œÄœÜœô Àž<ŸŸÔ P¡ ¡¡,¡|¡è¡ø¢¢¢Ü¢ì¢ü£h£x£ˆ¤¤¤h¤x¤ì¤ü¥ ¥È¥Ø¦h§H§`§x¨$¨°©¤©´ªLª\ªl«(«8¬P­$­°­È®t¯ ¯¯,¯<¯L¯\¯l¯|°°Ì°Ü±L±È²<²¼³D³Ü´Tµµì¶Œ¶¤¶¼·„·œ¸L¸\¸l¸„¹¹(¹øº°»@»X»p»ˆ»ì¼„½D½ä¾@¾Ä¿ôÀèÁ¬ÂpÂøàðÄPÅÅ´Æ0Æ@ÆXÆpÆ€ƘƨÆÀÆØÆèÇÇÈ€ÉÉ\ÉôÊÈËhÌ,ÌüÍhÎ|ÏLϸÐ,ÐÈÑhÑxÑÑ ѰÑÈÑàÑðÒÒ@Ò„ÒÄÒüÓ4ÓôÔ¨Ô¼ÔÐÔäÔøÕ Õ Õ4ÕHÕ\ÕpÕ„Õ˜Õ¬ÕÀÕÔÕèÕüÖÖ$Ö8ÖLÖ`Ötֈְ֜ÖÄÖØ×HרØÈÙPÙèÚ˜ÚøÛàÜŒÜÐÝÝXÝÀÝÔÝèÝüÞÞ$Þ8ÞLÞ`ÞtވޜްÞÄÞØÞèÞøßßxàààèá4átââDâhâ¸ããHãØäDäÀååÌæ@æøç0ç˜çèè”é(é„éØê|ë,ë¤ìLìðídî”îðï<ï´ðð\ññtñìò˜ó@ó¨ôpôôõ|õÌö\öì÷„÷Ôø0øxøœøèù°úlû(û¼üxýPýtýÔýøþ þHþÀÿ¬Àœ`ø´`´À ( ø  ø  üð´„4 p¤´Äè@dˆ¬Ðô<`„¨Ìð8\€¤”¸(€ü(h¨üL¼xô 8P`0À   , Œ Ì!ˆ"d" "ô#0#€#¨#Ô$”$Ü% %L%|%Ø&&L&„&è'P($(˜) )˜)Ä)Ü***(*8*L*`*t*ˆ*œ*°*ä*ø+++(+<+P+d+x+Œ+ +´+È+Ü.(.\..¸.ì/ /H/˜/è0p0ð11D1T1d1Ì242”2ü343x3à4T4°5 5l5Ì6 6\6¨6ô77\7¬8 8p8¸99L9\9ˆ9´9à: :l: :Ô;;<;P;d;x;Ä<>>`>Œ>È?t?Ì?Ü?ì@8@|@üAŒB BˆCC”DXDØE`EøF˜FìGLG HH|II¨J\JØK\KØL\LüM¨NhO O¤P4PtP¼Q4Q¬RXRÐSHSôSôSôSôSôSôSôT T$^” g¸EX¸/¹>Y¸EX¸/¹>Y¹ôº9¸¹ ôº9º9º9º901!!%/#?!^¼þDx];=_ 5VþäW6“`‘‘”ýl'¤ii¤M\››\ ýüþüÿ“ T¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸/¹>Yº 9º 9¸ /¹ ô01'.'#!#3#|*$$*÷þûN.è.è0 {;l==l;{'â“ýma“#[¸EX¸/¹>Y¸EX¸/¹>Yº!9¸!/º!9¸¹ô¸!¹ô¸¹#ô0132+2654&+2654&+a²dv42@N#@Z8¿ eY^[w…cqnf…“MS4M OE0H0qC:F9üþµJOHDþÛ7ÿôŸ!9¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô¸¹ô01".54>32.#"3267K=fI()Jg?:XH-6W= Y¸EX¸ /¹ >Y¹ ô¸¹ô0132+72>54.+a™LqJ$$JpLš”Ca>>aCf“.VxKK{W/'+NkA@jL*ý»aÔ“ M¸EX¸/¹>Y¸EX¸ /¹ >Y¸¹ôº 9¸/¹ô¸ ¹ô01!!!!!!aiþÅþøEþ“(ù(þÞ(aÈ“ C¸EX¸/¹>Y¸EX¸ /¹ >Y¸¹ôº 9¸/¹ô01!!!!#agþÇ þ÷.“(þú(þÃ7ÿôŸ'M¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô¸¹ôº" 9¸"/¹$ô01".54>32.#"32675#53R@hJ)*LlA!7,# H69Z?" =Y8-OžÊc 0YON~Y/(*MnEEoN+Í'þû!*a“ I¸EX¸/¹>Y¸EX¸ /¹ >Yº 9¸ /¹ô¸¸и ¸Ð013!3#!#a.a..þŸ.“þß!ýmJþ¶a“%¸EX¸/¹>Y¸EX¸/¹>Y013#a..“ým)ÿôo“+¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô01"&'732653Ë7R#=*<:.'> 2/*$IQÛþ (E4a$“ e¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸/¹>Yº 9º9º 901333##a.?7Òï5Ú†.“þ’nôþa|™ãa¿“+¸EX¸/¹>Y¸EX¸/¹>Y¹ô013!!a.0þ¢“ý•(aa“]¸EX¸/¹>Y¸EX¸/¹>Yº 9º 9¸¸ и¸ к9º90133>73#467##'##aAŠ    ‰B-3Ž(4+“þ}$I%%I$ƒým±)_*“þxˆ“*_)þOa“[¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸ /¹ >Yº 9º90133.53#'##a0J,0þêJ,“þ/ƒ0`0”ýmу0[0þg7ÿôVŸ'5¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô¸ ¹ô01".54>32'2>54.#"F;dH((Hd;Y¸EX¸ /¹ >Yº 9¸ /¹ ô¸¹ô0132+#2654&+a¦8Y=!|o|.Ÿebefm“,F3a_þåBHQS>þÖ7ÿdXŸ6K¸EX¸&/¹&>Y¸EX¸/¹>Y»3+¸¹ô¸&¹ô¸¸0Ð0132>54.#"#".'.54>323267g :S22R; ;R22S: ñ +*E7) 6ZA$(Hd; LEqO,,OqEDnM**Mnýà'55YzJN}Y//Y}NJzY524a“Y¸EX¸/¹>Y¸EX¸ /¹ >Y¸¹ôº 9¸/¸ ¸ и¹ ôº 9012654&+##32X]^Wƒ?³Œ.½1P8[N¶UGIJ=þéþ«/þÑ“*B/OZ þÎ.ÿôàŸ3I¸EX¸/¹>Y¸EX¸/¹>Y¹ôº9¸¹!ôº)901"&'732654./.54>32.#" Hp'$d9LX +d0'3G)<]N2BP"(d2&7N 7, )0I;+ - '5%$;+/ %@6(, (7&&A/ï“3¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô¸Ð01#5!##ïÒÒÒ.k((ý•_ÿô“3¸EX¸/¹>Y¸EX¸/¹>Y¹ ô¸¸Ð01".5332>53<*P>%.0?#$A1+&>P =fM–þoBW55WB‘þjMf=ç“@¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸/¹>Yº90133>73#1z  z/Ø1“þY¸EX¸ /¹ >Y¸EX¸/¹>Y¸EX¸!/¹!>Y¸EX¸/¹>Yº!9º9º! 90133>733>73#.'##0S   g/g  S-“3x  v2“þ|6k66k6„þ|6k66k6„ýmÄ'G''G'þ<Ñ“[¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸/¹>Y¸EX¸/¹>Yº9º 90133>?3#'.'##׸2ll/¸Æ2ss/U>Â((ÂþÀþ­Ê22ʼ“@¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸/¹>Yº90133>?3#ÈÅ1d!$d/Æ. ˆÎ$F$$F$Îþxþõ2ê“ E¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸Ð¸/¸¹ô¸и/017!5!!!2{þ¦”þ„þHP(ý°(:ÿôœì!/q¸EX¸/¹ >Y¸EX¸/¹>Yº9¸/¸¹ ô¸¸и/º9¸¹"ô¸¹%ô¸¹&ô01".54674.#"'>32#'#'2675Å2&•¡,$0P %.6*:$&%U(*L-Jf>%  2"PS7+&!  2C'þÍ>-&(&£ $.$ \ÿôìÏ%z¸EX¸ /¹ >Y¸EX¸/¹>Y¸EX¸/¹>Yº 9¸и/º 9¸¹ô¸ ¹ô¸ ¹"ô¸¹#ô01"&'##3>32'2>54.#"#K"%,%T-``";M,$>,$:)$N+(J !1ÏÐ^,…p=`C#' :Q1,L7)&þã"4ÿô§ì!9¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô¸¹ô01".54>32.#"3267/O;!$Y¸EX¸ /¹ >Y¸EX¸/¹>Yº 9¸и/º9¸¹ô¸¹ô¸ ¹ô¸¹ô01"&54>32'53#'#'267.#"û[l";M+,A$,&O*(I&&C#$>-(; z:^B#XÆý1>-')&"!9O-0N74ÿô½ì%Q¸EX¸ /¹ >Y¸EX¸/¹>Yº 9¸/¸¹ô¸¹ô¸ ¹ ô01".54>32!32674&#".Q<##;K(Vbþ¦/B)'?ELLA8- "A];;^A#tj  -M7"][0D+! ÛV¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸ /¹ >Y¸¹ô¸¹ ô¸ и¸Ð01.#"3###5754632&%oo,BB>9##§85h&þFº"kHH4ÿÜì5I[‡¸EX¸/¹ >Y¸EX¸/¹>Yº-9¸-/¹Rôº-R9º$9¸$/¹6ôº6$9¸¸и/¹ô¸¹@ô¸¹Jô01"&54675.54675.54>323##"&';22>54.#"2>54&+"&'ù[j&!$%.># £p-=#+&6gQM ;T;-"!.-"#-%(B.96g!!SçH= < & - D,%>-%?&%>- %59;-£$22""12$þ"+(!4-8\¿ÏX¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Yº9¸ и¹ô¸¹ô013>32#4&#"#\,&N2KF,3;+F,,ÏþÆ&1Z^þÌ.MI--þ–K›£5¸EX¸/¹ >Y¸EX¸/¹>Y¸¸и/¸ Ð013#"&54632\,,àþ Tÿßÿœ£;¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô¸ ¸и/¸Ð01"&'732653"&54632" (-4å$;.6ýÇGE9\ÄÏ e¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸/¹>Yº 9º9º 901333##\,í3œ¶1Ÿl,Ïýî#¾þÞ~ƒ\ÿô·Ï+¸EX¸/¹>Y¸EX¸/¹>Y¹ô01"533:7—;,  Lýk$\Øì ‰¸EX¸/¹ >Y¸EX¸ /¹ >Yº 9¸¸и/º 9¸ и /¸ ¸и/¸и/¸ ¹ô¸ ¹ô¸¹ô¸¹ô0133>32>32#4&#"#4&#"#\& O(:> *O*-47AO,48AO,àJ%15--5¸þÌ.MIZþ–.MIZþ–\¿ì[¸EX¸/¹ >Y¸EX¸/¹>Yº9¸¸и/¸¸ и /¸¹ô¸¹ô0133>32#4&#"#\&%N2KF,3;+F,,àJ%1Z^þÌ.MI--þ–4ÿôãì'5¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô¸ ¹ô01".54>32'2>54.#" +N;##;N++O;##;O+$?--?$$>--> "@]<<_@""@_<<]@"'8N/0N99N0/N8\ÿ'ìì$~¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸$/¹$>Yº"9¸"¹ô¸¹ô¸¹ ôº9¸¹ô¸¸и/01732>54.#"'33>32#"&'#ˆ*H$>,$:)$M,,&#S-``";M*"H&,Y" :Q1,L7)&j<,…p=`C#þø4ÿ'Äì%~¸EX¸ /¹ >Y¸EX¸/¹>Y¸EX¸/¹>Yº 9º 9¸ ¸и/¸¹ô¸¹ô¸¹ô¸ ¹ô017#"&54>32373#'267.#"˜ O0[l";M+,A"%,—(I&&C#$>-(; _,z:^B#,ýGô)&"!9O-0N7\AìI¸EX¸/¹ >Y¸EX¸/¹>Yº9¸¸и/¸ ܸ¹ô0133>32.#"#\&E+  G,àY-8(7Dþ¹ ÿôrì3I¸EX¸/¹ >Y¸EX¸/¹>Y¹ôº9¸¹ ôº*901"&'732654.'.54>32.#"Ð6Z F499")7,(9&&I6%(  )8-*< '!#9&" +/#   /#1%ÿô-kO|¸ /¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô¸ ¸ и¸и¹ô01".5#5?33#3267ß#. KL&‹‹! * &6 5"‹‹&þÇ% $ UÿôµàS¸EX¸/¹ >Y¸EX¸/¹>Y¹ ôº9¸¹ ô¸¸ и¸и/01"&5332673#'#æKF,3:+F*,%#N Z^4þÒMI/3bþ P*2 ¦à @¸EX¸/¹ >Y¸EX¸ /¹ >Y¸EX¸ /¹ >Yº 90133>73# 0l    l-²4àþÓ#F!!F#-þ •à![¸EX¸/¹ >Y¸EX¸!/¹!>Yº!9¸¸ и!¸и ¸к9º 90133>733>73#.'##0V  W5W  U-Š:T   S5àþÉ!? ?!7þÉ!? ?!7þ *#C##E#þ؉àI¸EX¸/¹ >Y¸EX¸/¹>Y¸¸ и¸к 9º9017'33>?3#'.'##±–1N   K.•£1UR/ûåz''zé÷ƒ,,ƒ ÿ%¨àG¸EX¸ /¹ >Y¸EX¸/¹>Y¹ôº 9º 9¸ ¸Ð01"'7326?33>73I  -< Å0t   g-¾ '3Û 'H7*éþÒH H.ýä:,zà E¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸Ð¸/¸¹ô¸и/017#5!!!ý6þå%þ¡¢&þ^'ÿÿT&"ÿÿT&%ÿÿG&(ÿÿB&*ÿÿ&6ÿÿ &,ÿÿG&1ÿÿg&:ÿÿI&>ÿÿÿ>“&3üêÿÿ_&8ÿÿt&wÿÿt&yÿÿƒ&{ÿÿ&}ÿÿÿ>G&'(3üêÿÿ&ÿÿ&ÿÿ«&ƒÿÿž&…ÿÿÿ>G&'13üêÿ3*“ %W¸EX¸/¹>Y¸EX¸/¹>Yº# +º9º9¸/¹ ô¸¸иÐ01'.'##"&54>7#'!#3327|*$$*˜ %#1  MþûN.è.è+ {;l==l;{þB (*$  ââ“ýmAú“|¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸ /¹ >Yº 9º  9¸ /¹ô¸ ¹ô¸¹ôº 9¸/¹ô01%#!5##!!3#›= I(þ¡Þw1mnþÙõõÿl8s<…×(ÙÙ“(ù(þÞÿÿúV&N%Dÿÿú &N,D!#“ +_¸EX¸$/¹$>Y¸EX¸/¹>Y¹ô¸ и иии$¹ôº9¸ ¸ и ¸#Ð01%2654&+3#32654&++5#5732"broe…¦¦qfY^[wèIU#@Z8¿NN²cv:;%LPHF|!MBA@9þó PE0H0²ÀNR3Lÿÿaÿa“&+#ýÿÿ7ÿ%Ÿ&WSÿÿ7ÿôT&%Cÿÿ7ÿôG&(Cÿÿ7ÿôI&>Cÿÿ7ÿô!&4Cÿÿa%I&>.ÿÿaÿ>%“&3,üêÿÿaÿa%“&+,ýÿÿ%:“õÿÿaÔT&"ÿÿaÔT&%ÿÿaÔG&(ÿÿaÔI&>ÿÿaÔ&6ÿÿaÔ &,ÿÿaÔG&1ÿÿaÔ!&4ÿÿaÿ>Ô“&3(üêÿÿaÔ_&8ÿÿaÔB&*ÿÿaåt&wÿÿaÔt&yÿÿaÔƒ&{ÿÿaÔ&}ÿÿaÿ>ÔG&'(3(üêaÿ3á“ ]¸EX¸/¹>Y¸EX¸/¹>Yº+¸¹ ôº9¸/¹ ô¸¹ô¸¸Ð01"&5467!!!!!!#327Ÿ#1,þÍiþÅþøE! %Í(*&B“(ù(þÞ(' ÿÿaÔ±&‰ÿÿ7ÿôT& %Yÿÿ7ÿôG& (Zÿÿ7ÿôG& 1Zÿÿ7ÿô!& 4Zÿÿ7ÿ%Ÿ& TTÿÿ7ÿôI& >Zÿÿ7ÿô & ,Zÿÿ7ÿôB& *Z7ÿôS7W¸EX¸ /¹ >Y¸EX¸/¹>Y»+¸ ¹&ô¸¹0ôº5 9¸5/¹7ô01%#".54>32&54632.#".#"32675#53cA@hJ)*LlA%;7(  H69Z?" =Y8-OžÊ?!*0YON~Y/ */$#%*MnEEoN+Í'ÿÿaG& (?ÿÿaÿ>“& 3?üêÿÿaÿ“& /?üà${“s¸EX¸/¹>Y¸EX¸ /¹ >Yº 9¸/¸ܸи ¸и¹ ô¸¸ и¹ô¸и¸и¸Ð01!!7##!##5753!533þŸawI.þŸ.QQ.a.Iï}}þJþ¶ïƒƒƒƒÿÿ¡T& "xÿÿOèT& %xÿÿÿñÿG& (xÿÿÿÓB& *xÿÿÿòþ& 6xÿÿÿüô & ,xÿÿP !& 4xÿÿÿñÿI& >xÿÿA¾_& 8xÿÿSÿ>Ÿ“& 3yüê,ÿ3Á“5¸EX¸/¹>Y¸EX¸/¹>Yº+¸¸ Ð01"&5467#3327€#1$ ."  %Í(*)8“ým6! ÿÿÿðG& 1xÿÿ)ÿôÛG& (Tÿÿaÿ%$“&TBÿÿaÿ>$“&3Eüêÿÿaÿa$“&+BýÿÿQ¿T&%zÿÿa¿Ô&?]ÿâÿÿaÿ%¿“&Tÿÿa¿“&wø"ÿÿaÿ>¿“&3üêÿÿÿþÿ>¿ &&,z3üêÿÿaÿa¿“&+ýÓ M¸EX¸/¹>Y¸EX¸/¹>Yº9¸/¸ܸ и¸ и¹ ô01%!'737Ãþ¢Na.»Í((*4iþ«c kîÿÿaaT&%`ÿÿaa!&4`ÿÿaÿ>a“&3büêÿÿaT&%CÿÿaT&"CÿÿaI&>CÿÿaB&*Cÿÿaÿ%“&T?ÿÿa!&4Cÿÿaÿ>“&3?üêÿÿaÿa“&+?ýÿÿ7ÿôVT&"Fÿÿ7ÿôVT&%Fÿÿ7ÿôVG&(Fÿÿ7ÿôVB&*Fÿÿ7ÿôV&6Fÿÿ7ÿôV &,Fÿÿ7ÿôVe&<Fÿÿ7ÿôVI&>Fÿÿ7ÿ>VŸ&3Füêÿÿ7ÿôV_&8Fÿÿ7ÿôVt&wFÿÿ7ÿôVt&yFÿÿ7ÿôVƒ&{Fÿÿ7ÿôV&}Fÿÿ7ÿ>VG&'(F3Füêÿÿ7ÿôVG&1Fÿÿ7ÿôV±&‰F8ÿéZª 3u¸EX¸./¹.>Y¸EX¸ /¹ >Yº#. 9¸#¸Ü¸ ¹ôº1. 9¸1¸ܸ ܸ1¸ ܸ.¹ô¸#¸&ܸÜ01732>54&/.#"#"&''7.54>327±M/2R; J-2S: w#%(Hd<6[#BF #(Hd;4Y#<e"%+OoE?f&!*MnD=e&º-yLNZ1(%X^-xJN}Y/$"Q7“!U¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô¸ к 9¸/¹ô¸¹!ô¸Ð01!".54>3!!3#!%#"3oNuN''OuN˜þÙõõ1þ¡?EeC CeE/W{KKxV.(ù(þÞ('E*Kk@AkN+;ÿôZ 2G¸EX¸+/¹+>Y¸EX¸!/¹!>Y¹ô¸+¹ ôº+ 9¸¸-Ð01%2>54.#"#".54>32654&'J2R; ;R22S: :S&8/4;(Hd<;dH((Hd;E8^+OoEDnM**MnDEoO+"$/7+`NZ11ZNN}Y/ H  ÿÿ;ÿôZT&±%Fÿÿ;ÿôZT&±"Fÿÿ;ÿôZ_&±8Fÿÿ;ÿôZB&±*Dÿÿ;ÿ>Z &±3Füê7ÿ3VŸ#7I¸EX¸/¹>Y¸EX¸/¹>Yº+¸¸и¹$ô¸¹.ô01"&5467".54>32327'2>54.#"e#1 AgH'(Hd; ë+OoEDnM**MnDEoO+ÿÿaT&%ÿÿaI&>ÿÿa!&4ÿÿaÿ%“&T#ÿÿaÿ>“&3#üêÿÿaÿ> &',3#üêÿÿaÿa“&+#ýÿÿ.ÿôàT&%ÿÿ.ÿôàG&(ÿÿ.ÿôàI&>ÿÿ.ÿ%àŸ&W ÿÿ.ÿ%àŸ&T ÿÿ.ÿôà!&4ÿÿ.ÿ>àŸ&3 üêbÿôWŸ,U¸EX¸/¹>Y¸EX¸/¹>Y¹ôº9¸¹ô¸¸и/º#901"&'732654./7.#"#4>32 5\ F-AF0UCšH9Yh.#@X6K_œ=S31C )& $"M<3* #ª(7jsþg¦<]?!K?ª %3?#&B0ÿÿïI&>ÿÿÿ%ï“&Wÿÿÿÿ%ï“&Tÿÿÿ>ï“&3üêÿÿÿaï“&+ýï“I¸EX¸/¹>Y¸EX¸/¹>Y» +¸ ¸и¸и¹ô013###573#5!.V)ÒÒkÿ!þ¶J((ÿÿ_ÿôT&"=ÿÿ_ÿôT&%=ÿÿ_ÿôG&(=ÿÿ_ÿôB&*=ÿÿ_ÿô&6=ÿÿ_ÿô &,=ÿÿ_ÿôG&1=ÿÿ_ÿôg&:=ÿÿ_ÿôe&<=ÿÿ_ÿôI&>=ÿÿ_ÿôw&s=ÿÿ_ÿô±&l=ÿÿ_ÿô¯&u=ÿÿ_ÿô±&o=ÿÿ_ÿ>“&3=üêÿÿ_ÿô_&8=_ÿ3“-G¸EX¸/¹>Y¸EX¸/¹>Yº(+¸¹ô¸¸и¸"Ð01"&54>7".5332>53327Z#2  0T>$.0?#$A1++8(, &Í(*  >fK–þoBW55WB‘þjAV:%> _ÿô…4';¸EX¸/¹>Y¸EX¸ /¹ >Y¸¸ иܸ ¹ô01#".5332>53>54&'r&&>P+*P>%.0?#$A1 0.4##(þ„Mf==fM–þoBW55WB‘)(  ÿÿ_ÿô…T&Þ%<ÿÿ_ÿô…T&Þ"<ÿÿ_ÿô…_&Þ8<ÿÿ_ÿô…B&Þ*<ÿÿ_ÿ>…4&Þ3<üêÿÿäT&"ÿÿäT&%ÿÿäG&(ÿÿä&6ÿÿ¼T&"ßÿÿ¼T&%ßÿÿ¼G&(ßÿÿ¼&6ßÿÿ¼!&4ßÿÿÿ>¼“&3áüêÿÿ¼_&8ßÿÿ¼B&*ßÿÿ2êT&%ÿÿ2êI&>ÿÿ2ê!&4ÿÿ2ÿ>ê“&3üêÿÿ2ÿaê“&+ý%:“!Y¸EX¸!/¹!>Y¸EX¸/¹>Y¹ô¸!¹ ôº!9¸/¹ ô¸¸и ¸Ð01%2>54.+3#2+#57 Ca>>aCf££kLqJ$$JpLšQQ'+NkA@jL*ÿ!þÛl.VxKK{W/L&a“9¸EX¸/¹>Y¸EX¸/¹>Y» +»+01332+#72654&+a.†7W= |o†.©ebcd{“u+F3a_¦ÍHQR?þÖ>ÿôQŸ#K¸EX¸ /¹ >Y¸EX¸/¹>Yº 9¸/¸Ü¸¹ô¸ ¹ ô013267>32#".5465!.#"m!7M/duþa!c?€‹&Gd>>aB#äpk3X +>eG&) +°¤QY.2Y|Kš%aÿô2Ÿ)U¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô¸ ¹ôº 9¸¹ô¸ ¸и/01"&'732>54.#"#3>32“( *2E)21-..,151T=#,9 +GtWUpC'ýõ“X$#O€\c…R#aÿd€“@¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y» +013#"&'732653a..±! (.“ýmœ':.œý^ÿÿ:ÿôœò&!þÿÿ:ÿôœò&$þÿÿ:ÿôœá&'þÿÿ:ÿô¢Æ&)þÿÿ:ÿôœ &5þÿÿ:ÿôœ‚&+þÿÿ:ÿôœÓ&/þÿÿ:ÿôœã&9þÿÿ:ÿôœá&=þÿÿ:ÿ>œì&3îüêÿÿ:ÿôœå&7þÿÿ:ÿôÏ&vþÿÿÿôœ&xþÿÿ:ÿô´&zþÿÿ:ÿôœ&|þÿÿ:ÿ>œá&''þ3îüêÿÿ:ÿôœ!&~þÿÿ:ÿôœ!&€þÿÿ:ÿôœ9&‚þÿÿ:ÿôœ&„þÿÿ:ÿ>œÓ&'/þ3îüê:ÿ5²ì4By¸EX¸#/¹# >Y¸EX¸ /¹ >Yº/+¸ ¸)и)/¸к# 9º# 9¸#¹ô¸ ¹5ô¸¹8ô¸¹9ô01"&5467'##".54>74.#"'>32327'2675q#/5#%U02&%LuP,$0P %.6*:$&0 %´*L-Jf>%Ë()&E7- 1"(<, 7+&!  2C'þÍA  å(&£ $.$ Aÿôêì8IR›¸EX¸/¹ >Y¸EX¸/¹>Yº9¸¹ ô¸¸1к19¸¸к#19¸¹9ô¸(к69¸6¹>ô¸¹Bô¸#¹Jô¸ ¸MÐ01".54674.#"'>32>32!3267#".''2>7.5'%4&#"Í2'–›-#-O $-3;E W6U]þ´.?$';$* 4*! 0m&./. Fb><IA5)  1"PT7+&!  A77Atj  -L7# $.5& #A" $.4,ò]]1E)ÿÿAÿôêò&$žÿÿAÿôê‚&+žÿôìÏ-¸EX¸'/¹'>Y¸EX¸/¹>Y¸'¸&ܸ#ܸܺ 9¸ ¹ô¸¹ô¸¹ ôº9¸¹ô¸¸"и"/¸&¸*и#¸+Ð01732>54.#"'>32#"&'###57533#ˆ(J$>,$:)$N+%T-``";M*#K"%MM,¾¾Y"6J-(E3)&+,|g9[>!!1Eii!hÿÿ\ÿaìÏ&+ýÿÿ4ÿ%§ì& V ÿÿ4ÿô§ò& $ÿÿ4ÿô§á& 'ÿÿ4ÿô§á& =ÿÿ4ÿô§¤& 3ÿÿ4ÿô(ò&!? ÿÿ4ÿ>ÄÏ&!3(üêÿÿ4ÿaÄÏ&!+'ý4ÿôÏ+¸EX¸(/¹(>Y¸EX¸/¹>Y¸(¸'ܹ$ô¸ܺ"9¸"¹ô¸¹ô¸¹ ôº9¸¹ô¸$¸и¸и/¸'¸*Ð01.#"3267#'##"&54>32'5#53533˜&C#$>-QM(I&wK&O0[l";M+,A$ªª,Ke"5G)Xl)&ßý»>,xr6W>!X^!iiÿÿ4ÿô½ò&"!ÿÿ4ÿô½ò&"$ÿÿ4ÿô½á&"'ÿÿ4ÿô½á&"=ÿÿ4ÿô½ &"5ÿÿ4ÿô½‚&"+ÿÿ4ÿô½Ó&"/ÿÿ4ÿô½¤&"3ÿÿ4ÿ>½ì&"3üêÿÿ4ÿô½å&"7ÿÿ4ÿô½Æ&")ÿÿ4ÿôÖ&"vÿÿ"ÿô½&"xÿÿ4ÿô½&"zÿÿ4ÿô½&"|ÿÿ4ÿ>½á&"''3üê4ÿ5½ì2;Y¸EX¸/¹ >Y¸EX¸ /¹ >Yº-+º 9¸/¸ ¹!ô¸¹3ô¸¹6ô01"&54>7#".54>32!32673274&#"c#.  .Q<##;K(Vbþ¦/B)'? ,  & LA8-Ë()# "A];;^A#tj  -M7"(%" Ù][0D+ÿÿ4ÿô½6&"ˆÿÿ4ÿÜò&$$ÿÿ4ÿÜá&$'ÿÿ4ÿÜÓ&$/ÿÿ4ÿܤ&$3ÿÿ4ÿÜá&$Uÿÿ4ÿÜá&$=ÿÿ4ÿÜ‚&$+ÿÿ4ÿÜÆ&$)ÿÿÿí¿n&%(t'ÿÿ\ÿ>¿Ï&%3üêÿÿ\ÿa¿Ï&%+ýÿÿ\ÿ¿Ï&%/üà¿Ïm¸EX¸/¹>Y¸EX¸/¹>Y¸¸ܹô¸ܺ9¸¸и¹ ô¸¹ô¸¸и¸Ð01>32#4&#"##57533#ˆ&N2KF,3;+F,,MM,¾¾s&1Z^þî MI--þ¸Eii!ÿÿÿÿ§ò&I!rÿÿ=åò&I$rÿÿÿèüá&I'rÿÿÿÎÆ&I)rÿÿÿôð &I5rÿÿÿ÷í‚&I+rÿÿÿèüá&I=rÿÿ;¸å&I7rÿÿKÿ>›£&&3süê%ÿ5·£!A¸EX¸/¹ >Y¸EX¸/¹>Yº+¸¸ и¸ܸÜ01"&5467#3327"&54632v#.(,% &Ë()&<àþ :  %ÿ5·à5¸EX¸/¹ >Y¸EX¸/¹>Yº+¸¸ Ð01"&5467#3327v#.(,% &Ë()&<àþ :  ÿÿÿÞÓ&I/s\ˆà%¸EX¸/¹ >Y¸EX¸/¹>Y013#\,,àþ ÿÿÿßÿüá&¾'rÿÿ\ÿ%ÄÏ&(Tÿÿ\ÿ>ÄÏ&(3üêÿÿ\ÿaÄÏ&(+ý\Äà S¸EX¸/¹ >Y¸EX¸ /¹ >Yº 9¸¸и ¸к9º 901333##\,ì3œ¶1Ÿl,àþÝ#¾þÞ‚ÿÿAÿôÚ‡&)%j3ÿÿ\ÿôíò&)?åÿÿ\ÿô6Ï&)wž"ÿÿ8ÿ%ÐÏ&)TŒÿÿ\ÿ>·Ï&)3Œüêÿÿÿöÿ>ìd&)'+qâ3ŒüêÿÿÿaÏ&)+Œý ÿôÕÏG¸EX¸/¹>Y¸EX¸ /¹ >Yº +¸ ¹ô¸¸и ¸Ð0173:7#"5'737‰  ;AS,9L:$L,*69þà&3ÿÿ\Øò&*$˜ÿÿ\ؤ&*3˜ÿÿ\ÿ>Øì&*3£üêÿÿ\¿ò&+$ÿÿ\¿ò&+!ÿÿ\¿á&+=ÿÿ\¿Æ&+)ÿÿ\ÿ%¿ì&+Tÿÿ\¿¤&+3ÿÿ\ÿ>¿ì&+3üêÿÿ\ÿa¿ì&++ýÿÿ:|¼'+½ƒÿÿ4ÿôãò&,! ÿÿ4ÿôãò&,$ ÿÿ4ÿôãá&,' ÿÿ4ÿôãÆ&,) ÿÿ4ÿôã &,5 ÿÿ4ÿôã‚&,+ ÿÿ4ÿôãî&,; ÿÿ4ÿôãá&,= ÿÿ4ÿ>ãì&,3 üêÿÿ4ÿôãå&,7 ÿÿ4ÿôã&,v ÿÿ(ÿôã&,x ÿÿ4ÿôã&,z ÿÿ4ÿôã&,| ÿÿ4ÿ>ãá&,'' 3 üêÿÿ4ÿôãÓ&,/ ÿÿ4ÿôã6&,ˆ .ÿêéõ .¸EX¸)/¹) >Y¸EX¸/¹>Yº)9¹ôº )9¸ ¸ и)¹ ô¸¸к )9º9º!9º,) 901732>54/&#"#"''7.54>327™/C$?.$.E$?-$*#;O+R;6:#;N+(I6L28N/R839O/Q84 V6<]@"8BF T6<_@"A4ÿô+ì';Di¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¸к 9¸¹(ô¸и¸"и ¹2ô¸¹<ô¸2¸?Ð01".54>32>32!3267#"&''2>54.#"%4&#"*L;"";L*:f_:Ubþ¯.@$'>E6?d`?$=++=$#=,,=M@6* "@]<<_@"GGBLtj-L7#LAFG'8N/0N99N0/N8ñ]]1E)4ÿôõ‚5?¸EX¸./¹. >Y¸EX¸$/¹$>Y¹ô¸.¹ ôº$.901%2>54.#"#".54>32654&' $?--?$$>-->ú &'0#;O++N;##;N+2*c8N/0N99N0/N8g#* hH<]@""@]<<_@"S  ÿÿ4ÿôõò&v$ ÿÿ4ÿôõò&v! ÿÿ4ÿôõå&v7 ÿÿ4ÿôõÆ&v)ÿÿ4ÿ>õ‚&v3 üê4ÿ5ãì';I¸EX¸/¹ >Y¸EX¸/¹>Yº"+¸¸и¹(ô¸¹2ô01"&54>7.54>32327'2>54.#"&"/ -O;"#;N++O;#):#!* %,$?--?$$>-->Ë()""A\;<_@""@_<3N;*>  æ8N/0N99N0/N8ÿÿ\Aò&/$Èÿÿÿ%Aì&/Toÿÿ>Rá&/=Èÿÿ\A¤&/3ÆÿÿJÿ>Aì&/3püêÿÿJÿ>C‚&/'+È3püêÿÿÿôÿaAì&/+oýÿÿ ÿôrò&0$Òÿÿ ÿôrá&0'Òÿÿ ÿôrá&0=Òÿÿ ÿ%rì&0VÖÿÿ ÿ%rì&0TÙÿÿ ÿôr¤&03Òÿÿ ÿ>rì&03Ùüê\ÿôÙ9i¸EX¸$/¹$>Y¸EX¸/¹>Y¹ôº $9º$9¸$¹ô¸¸ и /º.$9º5$901"&'732>54.54>54&#"#4632o'D5 & .7.$/09E,]N!3$%/6/'5 !$#, -$$4/1",8TZýû]h$1'7//$$6*2&ÿÿÿô-ò&1?ÿÿÿ%-k&1VÊÿÿÿ%-k&1TÈÿÿÿ>-k&13ÉüêÿÿÿaCk&1+Èýÿÿÿô-%&15‚…ÿô-k#g|¸/¸EX¸/¹ >Y¸EX¸/¹>Yº +¸¹ ô¸¸и ¸и ¸и ¸и¹ ô01%#".=#575#5?33#3#3267-*#. KKKL&‹‹‹‹!  &6 g­"‹‹&­!k% ÿÿUÿôµò&2!ÿÿUÿôµò&2$ÿÿUÿôµá&2'ÿÿUÿôµÆ&2)ÿÿUÿôµ &25ÿÿUÿôµ‚&2+ÿÿUÿôµÓ&2/ÿÿUÿôµã&29ÿÿUÿôºî&2;ÿÿUÿôµá&2=ÿÿUÿôµ &2rÿÿUÿôµ6&2kÿÿUÿôµ5&2tÿÿUÿôµ6&2nÿÿUÿ>µà&23üêÿÿUÿôµå&27Uÿ5Ëà%g¸EX¸/¹ >Y¸EX¸ /¹ >Yº +¸ ¸к 9¸ ¹ô¸¹ô¸¸и¸и/01"&5467'##"&5332673327Š#.0'#N2KF,2;+F*,*, &Ë()&>I*2Z^4þÒMI/3bþ :  UÿôŒ"Y¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸ /¹ >Y¸¸ܸ¹ô01#'##"&5332673>54&'ý %#N2KF,3:+F*'/Œ"$+þ7P*2Z^4þÒMI/3b.-  ÿÿUÿôò&¤$ÿÿUÿôò&¤!ÿÿUÿôå&¤7ÿÿUÿôÆ&¤)ÿÿUÿ>Œ&¤3üêÿÿ•ò&4!Wÿÿ•ò&4$Wÿÿ•á&4'Wÿÿ• &45Wÿÿ ÿ%¨ò&6!åÿÿ ÿ%¨ò&6$åÿÿ ÿ%¨á&6'åÿÿ ÿ%¨ &65åÿÿ ÿ%¨¤&63åÿÿ ÿ%¨à&63hüëÿÿ ÿ%¨å&67åÿÿ ÿ%¨Æ&6)åÿÿzò&7$Ûÿÿzá&7=Ûÿÿz¤&73Ûÿÿÿ>zà&73Úüêÿÿÿazà&7+Úý<ÿôÖÔ<U¸EX¸7/¹7>Y¸EX¸ /¹ >Y¹ô¸7¸3и0ܸ1и*й ô¸0¸и3¸:Ð01%2>54'.#"#".54>32.''7.'77 );''&&)=*,!%E Ž#Y¸EX¸/¹ >Y¸EX¸%/¹%>Y¸EX¸ /¹ >Yº# 9¸#¹ô¸ ¹ô¸¹ ôº 9¸¹ô01732>54.#"3>32#"&'#ˆ*H$>,$:)$M,,,$R-0I0";M*#G&,Y" :Q1,L7)&YþÖ+#@Z8=`C#þù\ÿK¿ì Y¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¹ôº9¸¹ô¸¸и/01"&'732654&#"#33>32S! (3;+F,,&%N2KF3µ$:.TMI--þ–àJ%1Z^þ£GEÿßÿ‰à+¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô01"&'732653" (-4å$;.6ýÇGEKÿ£+`¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y¸¸и и¹ô¸¸и¸ и&Ð013#"&54632"&'732653"&54632\,,~" (-4àþ TüÇ$;.6ýÇGE9Tÿô¶ì!/m¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¸и/º 9º 9¸¹ô¸¹"ô¸ ¹,ô¸ ¹/ô01".533>323267'>54.#" 3F+&&^1.#•  7,.K #+3¤Je>!(T0 5G()H&..TY5-&!  á &1! )0\ÿôìì%u¸EX¸ /¹ >Y¸EX¸/¹>Yº 9¸и/¸ ¸и/º 9¸¹ô¸ ¹ô¸ ¹"ô¸¹#ô01"&'##33>32'2>54.#""I%'&#S-``";M,$>,$:)$M,*H .à>-…p=`C#' :Q1,L7)&þã"\ÿôìÛ.ˆ¸/¸EX¸/¹ >Y¸EX¸ /¹ >Y¸EX¸/¹>Yº9¸и/¸ ¹ôº9¸¹ô¸¹(ô¸¹+ô¸¹,ô01"&'##4632&#">32'2>54.#"#K"%MG%#71%T-``";M,$>,$:)$N+(J -.R[$L>Œ,…o=`B#' :Q0,K7)&þå"ÿôì!5¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸¹ô01"&'732>54.#"'>32³.LB&'?.-<"*8F8)K9"";O $ 8N/0O8#!A^=<]@"4ÿ½£ì 2g¸EX¸//¹/ >Y¸EX¸/¹>Y¹ô¸ܹôº 9¸/¹ôº9º!9º'901%2654&#".#">32#"''>7.54>32+9 !G ,¡8#%@/$U-04KBB7& #($Y¸EX¸/¹>Y¸EX¸/¹>Y»+º9º9¸¹ ô¸¹#ô¸¹$ô¸¹'ô01"&57#"&54>32'533267%267.#"ù2/ O0[l";M+,A$,  þú(I&&C#$>-(;µ>Cs,z:^B#XÒüù-5$Ð)&"!9O-0N74ÿô2Ý/ˆ¸EX¸/¹>Y¸EX¸/¹ >Y¸EX¸/¹>Yº 9¸¹ô¸¸и/º9¸¹ô¸¹"ô¸ ¹#ô¸¹&ô01"&54>32'4632.#"#'#'267.#"û[l";M+,A$72  #&O*(I&&C#$>-(; z:^B#£FC $:.ý±>-')&"!9O-0N7&ÿô¯ì'M¸EX¸/¹ >Y¸EX¸/¹>Y¹ôº 9¸ /¸¹"ô¸ ¹'ô01"&'732>7!&454>32.#"Õ5JC'*A-þ¦3G++I5!:P~QB 8) "7M-  5R9#A^;;]A"Wa.E.4ÿôÄì%y¸EX¸/¹ >Y¸EX¸/¹>Yº 9¸¸и/¸¸и/º9¸¹ô¸¹ô¸ ¹ô¸¹ô01"&54>32373#'#'267.#"û[l#:N++A"'&O*(I&&C#$>-(; z:^B#.þ >-')&"!9O-0N7ÿÿ\Æàæ&ÿô¯ì%Q¸EX¸/¹ >Y¸EX¸/¹>Yº 9¸ /¸¹ô¸¹ô¸ ¹#ô01".5<7!.#"'>32'267!ç*G3Z*<'*AK6,K66I,DQþÍU :W8  *H5"!A]<;^A#&h[e^&ÿôyì 7Y¸EX¸*/¹* >Y¸EX¸/¹>Yº +º4+¸¹ô¸ ¸ܸ*¹#ô¸ ¸-Ü01732>54'#"&'#".'%.#"'>3273267R V?"7%ø 0?1G,-H4TU6,=H6EhJ  ¦BJ":L+*4 3\D(6H)‡CB"OK " 5ÿô•ì1M¸EX¸/¹ >Y¸EX¸/¹>Y»#$+º $#9¸¹ô¸¹+ô01".54>75.54>32.#";#"3267î)C2'&,-:!,D9#* BH/=HOPA'A#(L &4 );%.  "(6$6019 'ÿô‡ì/M¸EX¸/¹ >Y¸EX¸/¹>Y» +¸¹ô¸¹ôº& 901"&'732654&+532654&#"'>32Ï3L)$@(APPH=/HB>/#?I- 9*,&'1D  9106$6(., .%;) 4&5ÿôãì1M¸EX¸/¹ >Y¸EX¸/¹>Y»*++º +*9¸¹ô¸¹#ô01".54>75.54>32'2654&#";#"ü-I4'&,-=#2V@$$>T/TbgU5EAH'HNS &4 );%. @^?>^? &peer,.(6$6019ÿåÿèàM¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¹ ô¸¸и¸и/017##"&'73265#57533èY48" (]]-Yìþ»GE$;.BÓÓ5ÿ3g)8u¸EX¸/¹ >Y¸EX¸/¹>Y»#+»*+¸¹ôº 9º9¸ ¹-ô¸¹.ô¸¹1ô01"&'732657#"&54>32'4632.#"267.#"0U#$J&KKQ0[k";M++A$72  #d^(H&&C#$=.Rå#TIm-w9[@".EC $;-ýýVe )&" 7L,]r5ÿÄì.w¸EX¸/¹ >Y¸EX¸/¹>Y» +¸¹ôº 9º9¸¸и/¸ ¹#ô¸¹$ô¸¹'ô01"&'732657#"&54>32373267.#"0U#$J&KKQ0[k";M++A 'd^(H&&C#$=.Rå#TIm-w9[@",ýöVe )&" 7L,]r4ÿô°ì#O¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô¸¹ôº 9}¸/¹ ô01".54>32.#"32675#531RY¸EX¸/¹>Yº9¹ôº 9º9º9¸¸$Ð01732654&'7#"&546733>73Ø+++*±0l    l-#L""J#8M",66,"M8¾þß"; ;"!ÿôÍì&:q¸EX¸/¹ >Y¸EX¸/¹>Yº9º19º19¸¹ ô¸¸и ¸к19¸¹'ô01"&54>7.#"'632>32.#"'2>54.'îQN#/ ? ()M##M))  !?/#NR+ )*+ VI<96%+!5''5!+%69<IV'!,431134,!Uÿ'·à\¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Yº9¸¹ ô¸¹ô¸¸Ð017#"&5332>73#‹'O2KF,3:&&&,,q-2Z^4þÒMI %býG\¿Ûf¸EX¸/¹>Y¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ôº 9¸¸и¹ô¸ ¹ô014632&#">32#4&#"#\MG%#71&N2KF,3;+F,,.R[$L>˜&1Z^þÎ,MI--þ˜\ÿK¿Û)h¸EX¸/¹>Y¸EX¸#/¹# >Y¸EX¸/¹>Y»+¸#¹ôº 9¸ ¹ô¸¹ô01"&'732654&#"#4632&#">32S! (3;+F,,MG%#71&N2KF3µ$:.RMI--þ˜.R[$L>˜&1Z^þ¥GE\Êà ?¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸¸и ¸Ð013!53#5!#\,,,þê,àÐÐþ èèè£ K¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¸Ü¸ܸ¸ и¸Ð01"&54632##5#57533y^Z,]],ZTþ˜ììÓÓ+ à A¸EX¸/¹ >Y¸EX¸ /¹ >Y¹ô¸¹ô¸и¸ Ð0173#53#3#+ZZàZZà'“&&þm'ÿ™þäð£ 1u¸EX¸*/¹* >Y¸EX¸/¹>Y¸*¸Ð¸и¹ ô¸ܹ%ôº'%9º%9º'9¸¸ܺ.'901"&54632267&#".'#".54632653}‹#( ,- %æ*;+'4321- 3Tüí &]$<! #,#ýô/$F+ÿýÿôÏ *S¸EX¸&/¹&>Y¸EX¸/¹>Yº( +¸(¸Ð¸и¹ô¸ ¸и¸"Ü0154.#"33:7#"5#"&5463233{ !%>  ; ;8&  ,Zo  !þì$L,"' þ !\ÿKñϸEX¸/¹>Y» +01"&533267¾3/,  µAEþý-5$\ÿ Ï*o¸EX¸(/¹( >Y¸EX¸&/¹&>Y¸EX¸ /¹ >Y¸EX¸%/¹%>Yº (9¸ ¹ô¸¹ô¸(¹"ô01%6#".'732>54&#"'!#3!#5VY¸EX¸/¹>Y¹ô0133!\,íþçàþG'UÿôÐà!¸EX¸/¹ >Y¸EX¸/¹>Y¹ôº9¸¹ ô¸¸ и¸и¸к 9¸¹ô¸ ¸и¸и/01"53326733273#'##"&'å,48"F(,47@P,%!N):= *O ¸4þÒMI--jþÒMIZjþ K%25--5Uÿ'Ðà!ˆ¸EX¸ /¹ >Y¸EX¸ /¹ >Y¸EX¸!/¹!>Y¸ ¸и ¸к9º 9¸ ¹ô¸¹ô¸¸и¹ô¸¸Ð017#"&'#"53326733273#¤$O(:= *O*,48"F(,47@P,, n*05--5¸4þÒMI--jþÒMIZjýG\ÿKØì.¸EX¸#/¹# >Y¸EX¸/¹>Y»+¸#¹ô¸и#¸)и¸к&)9¸&¹ôº#9¸¹ô¸#¸и/01"&'732>54&#"#4&#"#33>32>32m!  47AO,48AO,& O(:> *O*3µ$&TMIZþ–.MIZþ–àJ%15--5¸þ£GEÿóÿK¿ì Y¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¸ и /º 9¸¹ô¸ ¹ô01"&'7326533>32#4&#"'  )%N2KF,3;+F,.µ$5- J%1Z^þÌ.MI--þgEA\ÿK(ì Y¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸¹ôº 9¸¹ ô¸¸ и /01"&54&#"#33>323267ô3.3;+F,,&%N2KF  µAE]MI--þ–àJ%1Z^þ -5$\¸àI¸EX¸/¹ >Y¸EX¸/¹>Y¸¸ и¸ к 9º90133.=3#.'##\,È"++É"+àþÇ:0Z'ðþ :;0Z(ð4ÿôãì%Q¸EX¸/¹ >Y¸EX¸/¹>Yº9¸/¸¹ô¸¹ ô¸¹ ô0173267'.#"72#".54>_.>%K`_E";-«,O;"";O,,N;"";Nê1M6nb$Wa0D+Þ @^?>^? ?^>?^@ 4ÿô›ì+]¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹"ô¸и/º 9¸/¹ô¸¹ô¸и/01".54>32!#3#3!'267.#"2V>##>V2.óÊÊýþá.++)D33D !A^==]@!%­$Å%'  6O45P64ÿ'SÏ /s¸EX¸-/¹- >Y¸EX¸./¹.>Y¸EX¸#/¹#>Y¸EX¸"/¹">Y¸#¹ô¸Ð¸-¹ ô¸ и-¸и#¸ Ð01%>54.'##5.54>753Y)J7!6K++)J8!!8J)+2ZE)*FZ0+0ZF**FZ0+ 7O00N77N00O7 Ð"?\;;]@"ÏÏ"@];;\?"åÿüÿôáàK¸EX¸ /¹ >Y¸EX¸/¹>Y¹ôº 9¸¹ ô¸¸ и /01"&'732673#'#,   G,%E (7EFþ Z-9ÿüÿôáÏK¸EX¸ /¹ >Y¸EX¸/¹>Y¹ôº 9¸¹ ô¸¸ и /01"&'732673#'#,   G,%E (7E5ý1Z-9ÿüÿKJàM¸EX¸/¹ >Y¸EX¸/¹>Y»+º9¸¹ô¸¹ô01"&=##"&'73267332672-E+   G,  µ?DŒ-9(7EFýô-5$\ÿKAìH¸EX¸ /¹ >Y»+¸ ¸и/º 9¸ ¹ô¸¹ô01"&533>32.#"3267¾3/&E+  G  µAEY-8(7Dþ-5$\6ì/¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ ô014>32.#"#\(6+ -<,@+A+&ICþÈ\°àK¸EX¸/¹ >Y¸EX¸ /¹ >Y» +¸¹ô¸ ¸ к 90172654&+'##32ê@II@bö†p,™%@-H5Œö233-ÅöÑÑà3$>BÔ*~àK¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸ ¹ôº9¸¸Ð01%#";#".5467'335Rb@II@b,™&?-H5Œ2†pî433.ºþ  3$>CÑÎÎ ÿKrìDW¸EX¸A/¹A >Y¸EX¸/¹>Y» '+¸A¹ôº A9¸¹/ôº7A901.#"#"&'3267#"&=732654.'.54>32C6%(  )8-*<'&C "73F499")7,(9&&I›   /#1%9&$EGV 9&" +/#ÿßÿÝ5¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸¹ô01"&'732654632.#"" (9=  4å$;.§GE$&ýYGEÿåÿ Ý%U¸EX¸"/¹">Y¸EX¸/¹>Yº +¸"¹ô¸¹ô¸ ¸и ¸и/01.#"3##"&'73265#574632 YY48" (]]9= ­&þ¿!þ»GE$;.BDGEÿI-k8¸EX¸ /¹ >Y»+¸ ¹ô¸ ¸ и¸Ð01".5#5?33#3267ß#. KL&‹‹! *·&6 à"‹‹&þ& $ ÿôà ¸EX¸/¹ >Y¸EX¸/¹>Yº+¸¸Ð¸¹ôº 9¸ ¹ô¸¸ и¸ и /¸¸и¸и¸ Ð01!326?##'##"&=#5753!533—þø3:+F*…Y%#N2KF^^,,YQMI/3…þýP*2Z^W¼¼¼¼*ÿôéà-Y¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ ô¸и/¸¹ô¸ ¸"ии/¸ ¸!Ð01".54>75#5332>54&'53# 3O6"k©0?*>)(>*?0¨j"6O %?R,)E9+&!rQ'G6 6G'Qr!&+9E),R?%UÿôÌì!E¸EX¸/¹ >Y¸EX¸/¹>Y¸¸и/¸¹ ô¸¹ô01".5332>54&#"'632ÿ#>.,".&:(.0 AE4M 2N7þë0C*'BZ3W^&hm=jO- ¦à 3¸EX¸/¹ >Y¸EX¸ /¹ >Y¸к9013#.'##¾4´0l    l-àþ -#G G#þÓ•à!W¸EX¸/¹ >Y¸EX¸!/¹!>Y¸к9¸¸ и¸ к 9º!90133>73#.'##.'##¡:U    R6Ž0W  X4X    T-àþÖ#C##E#(þ 7!? ?!þÉ7!? ?!þÉ ¨ÛK¸EX¸/¹>Y¸EX¸/¹>Y¸¹ ôº9¸¸к901>32.#"#.'##Õ (3   ,<Å0t    f-=9, &H7Kþ.I HþÒà7¸EX¸/¹ >Y¸EX¸/¹>Yº9¸¸ Ð01733>?3#«¨0QP1¨,­3›44›þÍ­ÿKÙàK¸EX¸ /¹ >Y¸EX¸/¹>Y»+¸¹ ô¸и ¹ô¸ Ð01"&=!5#5!!3267¥3.þ×ý6þå  µ@D1¢&þ^S-5$ÿ°°à $Y¸EX¸"/¹" >Y¸EX¸/¹>Y¹ ô¸ и /¸ܸܸ¸и ¸и/¸"¹ ô01%2654&#"'23632+'>7#5#5!+.17ž<8W',GH= # ¦ý5&*7<•,&+>'$¢&ÿƒà&I¸EX¸/¹ >Y¸EX¸/¹>Y¹ ôº9¸¹ô¸¹ô01".'732>54&#"'!5!6Á$:.$ '16)OM×þù@Ô5VY¸EX¸/¹>Y¸¹ô01>54&#"'>32#œYVJF;L#.8#(F3/A',H0dHAO0.E-,E:2þÒ‘Û/¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô01.54>32.#"#É&A/6I+!5+!G7KPWY-.2:E,-E.0OAHd0þ¸Û I¸EX¸/¹>Y¸EX¸ /¹ >Y»+¸¹ ô¸¸и¸Ð01#573>54&#"'>323##§¢LaTTKF;K$-8#(F4R?™½,""0kAAO0.E-El*&þÞŸÛ"I¸EX¸ /¹ >Y¸EX¸"/¹">Y»+¸ ¹ô¸¸и¸Ð01#53.54>32.#"3##ѽ˜5&6I+!5+!G7KPTTaL¢,"&06=#-E.0OAAk0"þÞÿî7» +» +¸ ¸и¸и¸и ¸Ð013###5735#57333œee$rN$rN$$eL{!þVª{þ!Bÿô¹Û+C¸EX¸/¹>Y¸EX¸/¹>Y»& +¸¹ô¸¹ô01".54632'2>54&#""&54632ý,F0bYZb0F-5'Q?>Q&5 +[Žc±¿¿±cŽ[+'%P€[¤¥¦£[€P%*!*Û*z¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô¸и/¸¸$ии¹ô¸ и и¸ и¸(и(/01.#"3#####5754632.#"354632'$oo,ß,BBD>) "++ß=9##§85h&þFºþFº"YKM $ =8VkHHÿÿ!­Û&&ÿÿ!ÿôÉÛ&)!ÿôÛ.z|¸!/¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸ /¹ >Y¸и/¸¹ ô¸ и¹ô¸¸и#и ¸$и¹+ô01%#".5###5754632.#"3733#3267+#- »,BB>9## &%¼%ŒŒ !  &6 5þFº"kHH$85h‹‹&þÇ% !ÿôÛBÓ¸EX¸(/¹(>Y¸EX¸/¹>Y¸EX¸*/¹*>Y¸EX¸/¹ >Y¸EX¸#/¹# >Y¸EX¸2/¹2 >Y¸EX¸6/¹6 >Y¸EX¸/¹>Y¸6¹ ô¸ и ииии¹ô¸(¹.ô¸¸8и9и¹?ô01%#".5#####5754632.#"354632.#"3733#3267+#- »,ß,BBD>) "++ß=9## '$¼%‹‹ !  &6 5þFºþFº"YKM $ =8VkHH$85h‹‹&þÇ% + “ =¸EX¸/¹>Y¸EX¸ /¹ >Y¹ ô¸Ð¸¹ô¸Ð0173#53#3#+ZZáYYá(C((ý½(ÿÿ+ T& "ÿÿ+ T& %ÿÿ$G& (ÿÿÿøBB& *ÿÿ#& 6ÿÿ! & ,ÿÿ+ !& 4ÿÿ$I& >ÿÿ+ _& 8ÿÿ+ÿ> “& 3Ÿüê+ÿ3 “U¸EX¸ /¹ >Y¸EX¸/¹>Yº+¸¹ô¸ ¹ ô¸и¸и¸Ð01"&5467#53#53#3#327¢#1'dZZáYYS $ %Í(*&?(C((ý½(= ÿÿ%G& 1aÿd“S¸EX¸/¹>Y¸EX¸/¹>Y»+¸¸ к 9¸¸к 901"&'73265#'##33.53°" (þêJ,0J,œ'<5у0[0þg“þ/ƒ0`0”ý^ÿÿ4ÿôÄìÈÿÿ4ÿôÄò&È!ÿÿ4ÿôÄò&È$ÿÿ4ÿôÄá&È'ÿÿ4ÿôÄÆ&È)ÿÿ4ÿôÄ &È5ÿÿ4ÿôÄ‚&È+ÿÿ4ÿôÄÓ&È/ÿÿ4ÿôÄã&È9ÿÿ4ÿôÄá&È=ÿÿ4ÿ>Äì&È3üêÿÿ4ÿôÄå&È7ÿÿ4ÿôâ&Èvÿÿ.ÿôÄ&Èxÿÿ4ÿôÇ&Èzÿÿ4ÿôÄ&È|ÿÿ4ÿ>Äá&È''3üêÿÿ4ÿôÄ!&È~ÿÿ4ÿôÄ!&È€ÿÿ4ÿôÄ9&È‚ÿÿ4ÿôÄ&È„ÿÿ4ÿ>ÄÓ&È'/3üê4ÿ5Úì$5‰¸EX¸/¹ >Y¸EX¸ /¹ >Yº+¸ ¸к 9º 9¸¸и/¸¸и/¸ ¹%ô¸¹(ô¸¹)ô¸¹,ô01"&5467'##"&54>32373327'267.#"™#/0(O0[l#:N++A"'V %¨(I&&C#$>-(;Ë()&>7-z:^B#.þ 4@ æ)&"!9O-0N7ÿÿ5ÿÄìÑÿÿ5ÿÄò&Ñ$ÿÿ5ÿÄá&Ñ'ÿÿ5ÿÄÓ&Ñ/ÿÿ5ÿĤ&Ñ3ÿÿ5ÿÄá&ÑUÿÿ5ÿÄá&Ñ=ÿÿ5ÿÄ‚&Ñ+ÿÿ5ÿÄÆ&Ñ)\ˆÏ%¸EX¸/¹>Y¸EX¸/¹>Y013#\,,Ïý1ÿÿC܇&7%l3ÿÿ\íò&7?åÿÿ\7Ï&7wŸ"ÿÿÿ%¶Ï&7TrÿÿMÿ>™Ï&73süêÿÿÿ÷ÿ>íd&7'+râ3süêÿÿÿ÷ÿaíÏ&7+rý ÕÏ ?¸EX¸/¹>Y¸EX¸/¹>Y»+¸¸Ð¸¸ Ð01#'737‰,AS,9„þ|l*69þà&ÿÿ!¡Û&#7ÿÿ“ÿÿa“aÈ“/¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô01!!#agþÇ.“(ý•“ 5¸EX¸/¹>Y¸EX¸/¹>Y¹ôº 90173!%'#ä0ãþ ÄzLMzxýˆ(ZÝÝþ¦ÿÿaÔ“ÿÿ2ê“ÿÿa“ 7ÿôVŸ+C¸EX¸/¹>Y¸EX¸/¹>Y»+¸¹ô¸¹"ô013#".54>32'2>54.#"Íòòy;dH((Hd;Y¸EX¸/¹>Y¸к 9013#.'##Ü1Ú1z    z/“ým746647þÿÿaa“ÿÿa“/Г C¸EX¸/¹>Y¸EX¸/¹>Y»+¸¹ô¸¹ ô017!!!!!!/¡þ_NþüDþs((r(I(ÿÿ7ÿôVŸa“@¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô01!#!#a¸.þ¤.“ýmký•ÿÿaö“/í“ 9¸EX¸/¹>Y¸EX¸ /¹ >Y¸¹ô¸ ¹ô0175!!!!/ðëšþ¢ßãþB4)(þåþØ(ÿÿï“ÿÿ¼“0ÿꇩ /A}¸"/¸./» -+»#+¸¸Ð¸ ¸ и-¸и#¸ Ð01%>54.'##5.54>753q5V< Y¸EX¸/¹>Yº 9¸¹ô¸и ¸и¸и¸Ð01#.=336=Vs-s~-Ä-Ä“¢yrþüry¢¡Âhþ˜Ä¡.eŸ1W¸EX¸ /¹ >Y¸EX¸1/¹1>Y¹ô¸1¸йô¸и/¸ ¹%ô¸¸/и//01735.54>323#5>54.#"#./%&Ge>>dG&%/Õ7+9S55S:+7Õ'ž& mÿÿÿ鯞& mÿÿÿòþ& 6xÿÿÿéÿôjŸ&mÿÿÿéž&\mÿÿ¼&6ßÿÿÿéyŸ&Xm4ÿôì&9¸EX¸ /¹ >Y¸EX¸/¹>Yº 9¸ ¸и/¸¸!и!/¹ôº$ 9¸¹'ô¸$¹,ô¸¹-ô¸ ¹2ô01".54>323733267#"&7#'2>?.#"è(B0":L)0*" ,   &/;^7+ !&( ;-J Y¸EX¸2/¹2>Y¹ôº !29¸ ¹ô¸!¹ôº) 901732>54&#"'>54.#"'4>32#"&'#„'Z,5'PR ,?( *?K+-D. ;-72QW3D%1]&,p2#+<&E[& &27!1!dd 1R<"*>*9Y hQ.J5$*?w@ ÿL±ì P}¸/¸EX¸ /¹ >Y¸EX¸ /¹ >Y¸EX¸/¹ >Yº 9º901>454.'73>73#Ë#8F#+70& 3*- /@+-´D›”ƒ,#et|<2ikl6=orzH*`*;ÿôÕÛ>Q¸EX¸;/¹;>Y¸EX¸'/¹'>Y¹ôº ;'9¸;¹ôº';9¸ ¸1Ð01%2>54.'.#"#".54>7.54>32 );'!,^h.:ØEY"5/(7:-4K0&K;$ 7L-7+$7'*_B3D(#:1*pO)B/q()'(0;H.3UY¸EX¸/¹>Y» '+º ' 9¸¹ô¸ ¸#и#/¸'¸$и$/¸¹-ô01"&54>75.54>32.#"3267&"#"3267òWg%&(/=#,I >%-!?H HKPF*B&*N N@)<%.  "(6)6019 !"4ÿIÏ/G}¸//¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô¸и/¸¹'ô01>54.'.54>7""5!#2 /%&C1-:@ACHD4-eV8,;"!3#¢#"  4P;*ZYVK>&&#l~…;2D,;&WÿL¼ìU}¸/¸EX¸/¹ >Y¸EX¸ /¹ >Y¸¹ôº 9¸¹ ô¸¸и/01>54&#"#4&'33>32#+1*(,,+)V7B;,´yôuMI 2&þ¾f8%nB8Z^þBÿô¸Û !C¸EX¸/¹>Y¸EX¸/¹>Y»+¸¹ô¸¹ô0132>75.#"2#".546o%43&O<Y¸EX¸/¹>Y¹ ô01"53327A-  RšÒÎ$TÿùÒì$q¸EX¸/¹ >Y¸EX¸ /¹ >Y¸EX¸$/¹$>Y¸EX¸/¹>Y¸¸и/º9º9º$901.'#4&'33>7¢21-" *,HNP$*[0/6:CIK"-2N*f@<»6dS: +K9$OPKÿùÃÛ[¸EX¸ /¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸ ¹ôº 9013'.#"'>32##Ó8/ $ 1' ¼-œ·ðSX ' 6N3ýø»þ>\ÿLøà(_}¸(/¸EX¸/¹ >Y¸EX¸/¹>Y¹ôº9¸¹ ô¸¸ и¸и/¹ô01332>73327#"&5##"&'#\,19%&(, #L,%8-àþÒHN,%UjÏg$/640%);21 §ìQ¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Yº 9013.'73>73#È'08 +5.% 0'-ZF.B‚{p/*mwy71mpo5|è|#ÿI–ÏE}¸E/¸EX¸/¹>Y¸EX¸/¹>Y»,3+º3,9¸¹ô¸и/¸¸!и!/¸,¸/и//¸3¸0и0/¸¹=ô01>54.'.54>75.5467""5!#"3267.#"; /$'E4+9 -?/($"%mp3'+3#D7"0>""2"¢#"  -C1&B5$J93G&&$4! 4%+-B+*8$;&4ÿôØì'5¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô¸ ¹ô01".54>32'2>54.#"-L9 9L--L9 9L-&=**=&&=**= !A]<=^A!!A^=<]A!'8N00O88O00N8ÿôà#Y¸EX¸/¹ >Y¸EX¸ /¹ >Y¸Ð¸/¸¹ô¸ и ¸ и /¸ ¸и¹ô01"&54>7#'>5#57!#3267Ï*'Ï .sC·d.  -1Tdj-näiiâm$(/lfT1$XÿLæì)O}¸/¸EX¸/¹ >Y¸EX¸ /¹ >Yº 9¹ô¸¹!ô¸¹'ô0174>32#"&'#72>54.#"X 8H)bc!8G%,M&-Æ 8*%:)9+)Mÿ;Y;„q=`C#!,#;9;#Ï :Q1,L73N6‰34ÿôà+I¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹"ô¸и/¸ и /¸¹ô01".54>3!.#'2>54.#"*K9"#:L)*M*28 8I*":*(:%"<,,; ?\<@\<)jL;Z? '6M/(K:"4M3/M6ÿôŸà=¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô¸ и¹ô01"&5#57!#3267+"¬CB­)    -1h"&^µ[1$Fÿô³ì)M¸EX¸"/¹" >Y¸EX¸ /¹ >Y¸EX¸!/¹! >Y¸EX¸/¹>Y¹ô01".54654&'332>54&'7ò$>-,$/5',4F +E10]08%3563(7!3M5Y¸EX¸#/¹#>Y¹ô¸Ð¸-¹ ô¸ и-¸и#¸ Ð01%>54.'##5.54>753Y)J7!6K++)J8!!8J)+2ZE)*FZ0+0ZF**FZ0+ 7O00N77N00O7 Ð"?\;;]@"ªª"@];;\?" ÿ@Éì ‚}¸/}¸ /¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹ >Yº9º  9º 9º 9¸ ¸ и /¸¸ и /01733# þ,§’0­Î*¹­´V<þàþÃþ¬<þÄFÿLNk)e|¸/}¸ /¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸)/¹) >Y¸EX¸ /¹ >Y¸и ¹ô¸!Ð01#5.=4&'33>54.'  ƒr*pt,_[*_h  ì 989!Ѝ¨wj8%3/+# YaPý°sp457!:ÿôhì?M¸ /¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô¸&и ¸/и¸9к= 901".54>732>54&'332654.'7#"&'#Ó8*#&" )$4%0?  '" (9!'DC 8U:+LC>9>F+-C. 5(A%%A(5 Zc)C<8 Y»#+¸¹ô01>54&'.54>32.#"1"A4 7I('! 3#!9*-:& #-" 5O;:Y=  4J-2C,  C&WÿôíÙ<S¸EX¸4/¹4>Y¸EX¸)/¹)>Y¹ôº4)9¸¹ô¸4¹ôº4)901732>54.#"5>54.#"#".54>32‚$49"7((=+JB‡v)?Kµ,D.5G*"J>(-C.:-;:ä>N,):#!=. %iH!/ `dn 4F*,H35WA"1R;!)>*9[Lÿô¸Û 5M¸EX¸$/¹$>Y¸EX¸+/¹+>Yº$+9¸¹ô¸$¹ ô¸+¹ô017.#"32>7.54>32#".5<.'z=jQ);%/@ )3'Z{J *9 Ð3F(!8)-%F3 QtI!Fþº91)7!J~a >S*)A-þ“o’V#*D0%4ÿLSí7X}¸!/¸EX¸/¹ >Y¸EX¸,/¹, >Y¸EX¸"/¹">Y¹7ô¸Ð¸¹ ô¸"¸Ð01%>54.#"'4632#5.54>7X+J7 ".!/)E6%?-)F[1,0ZF*($&"9J)!:Q0-K7FIHŒÝVW"@Z8<_B$+T+ª)G@948A'1J3ÿÿ4ÿôõ&b&ÿÿ4ÿôŸõ&f&ïÿÿWÿL¼õ&h&ÿÿ\ÿôÇõ&j&sÿÿÿõÿôñ &j5sÿÿ4ÿôØõ&p&ÿÿFÿô³õ&u&éÿÿFÿô³ &u5éÿÿ:ÿôhõ&y&Qÿÿÿìÿôúö&jmsÿÿFÿô³ö&uméÿÿÿüž& € ÿÿÿòž&ÿÿ ž&‚$ÿÿ  ž&m$ÿÿÿóŸ&{„ÿÿÿò|Ÿ&v…ÿÿÿó€Ÿ&z†ÿÿÿò{Ÿ&u‡ÿÿÿè6¡&0ˆÿÿÿè6¡&0‰ÿÿG&1ÿÿ &,ÿÿÿó0ž&\€ÿÿÿò0ž&\ÿÿÿêôž& ‚ÿÿÿéôž& mÿÿÿóŸ'¹„ÿÿÿòˆŸ'´…ÿÿÿóŒŸ'¸†ÿÿÿò‡Ÿ'³‡ÿÿÿózž& \€ÿÿÿòzž& \ÿÿÿê>ž& ‚ÿÿÿé>ž& mÿÿÿóן' ¹„ÿÿÿòÒŸ' ´…ÿÿÿóÖŸ' ¸†ÿÿÿòÑŸ' ³‡ÿÿÿèÆ¡' ¨ˆÿÿÿèÆ¡' ¨‰ÿÿÿóëž& \€ÿÿÿòëž& \ÿÿÿꯞ& ‚ÿÿÿ鯞& mÿÿÿóHŸ' ¹„ÿÿÿòCŸ' ´…ÿÿÿóGŸ' ¸†ÿÿÿòBŸ' ³‡ÿÿÿè7¡' ¨ˆÿÿÿè7¡' ¨‰ÿÿÿðG& 1xÿÿÿüô & ,xÿÿÿóÿôœŸ&F€ÿÿÿòÿô‘Ÿ&;ÿÿÿêÿôlŸ&‚ÿÿÿéÿôjŸ&mÿÿÿóÿôŸ'¯„ÿÿÿòÿôŸ'ª…ÿÿÿóÿôŸ'¬†ÿÿÿòÿôýŸ'§‡ÿÿÿòRž&\ÿÿÿòPž'”ÿÿÿêž&\‚ÿÿÿéž&\mÿÿÿò¬Ÿ'ð…ÿÿÿò«Ÿ'ï‡ÿÿÿèž¡'â‰ÿÿ¼G&1ßÿÿ¼ &,ßÿÿÿó«Ÿ&XF€ÿÿÿò Ÿ&X;ÿÿÿëzŸ&X‚ÿÿÿéyŸ&XmÿÿÿóŸ'X®„ÿÿÿòŸ'X©…ÿÿÿóŸ'X­†ÿÿÿò Ÿ'X¨‡ÿÿÿèã¡&X~ˆÿÿÿèã¡&X~‰ÿÿÿôÔ“&p ÿÿÿüÿôÞž& &€ pÿÿÿòÿôÜž&&pÿÿÿóÿôPŸ&{&„p‰ÿÿÿòÿôJŸ&v&…pƒÿÿÿóÿôOŸ&z&†pˆÿÿÿòÿôJŸ&u&‡pƒÿÿÿèÿô¡&0&ˆp=ÿÿÿèÿô¡&0&‰p=ÿÿaÿôE“& p~ÿÿÿóÿô¡ž& \&€pÚÿÿÿòÿô¡ž& \&pÚÿÿÿóÿôþŸ' ¹&„p7ÿÿÿòÿôùŸ' ´&…p2ÿÿÿóÿôýŸ' ¸&†p6ÿÿÿòÿôøŸ' ³&‡p1ÿÿÿèÿôì¡' ¨&ˆp%ÿÿÿèÿôì¡' ¨&‰p%ÿÿ.ÿôXŸ&Xp‘ÿÿÿóÿôœŸ&XF&€pÕÿÿÿòÿô‘Ÿ&X;&pÊÿÿÿóÿôŸ'X®&„p=ÿÿÿòÿôÿŸ'X©&…p8ÿÿÿóÿôŸ'X­&†p<ÿÿÿòÿôþŸ'X¨&‡p7ÿÿÿèÿôס&X~&ˆpÿÿÿèÿôס&X~&‰pÿÿ4ÿôï&b7 ÿÿ4ÿôä&bEÿÿ4ÿôò&b!ÿÿ4ÿôò&b$ÿÿ4ÿôõ&bŽÿÿ4ÿôõ&b‹ÿÿ4ÿôõ&bÿÿ4ÿôõ&bŠÿÿ4ÿô&bÿÿ4ÿô&bŒÿÿ4ÿôÓ&b/ÿÿ4ÿô‚&b+ÿÿ4ÿôÆ&b)ÿÿ4ÿôŸå&f7ïÿÿ4ÿôŸä&fEïÿÿ4ÿôŸò&f!ïÿÿ4ÿôŸò&f$ïÿÿ4ÿôŸõ&fŽïÿÿ4ÿôŸõ&f‹ïÿÿ4ÿôŸõ&fïÿÿ4ÿôŸõ&fŠïÿÿWÿL¼å&h7ÿÿWÿL¼ä&hEÿÿWÿL¼ò&h!ÿÿWÿL¼ò&h$ÿÿWÿL¼õ&hŽÿÿWÿL¼õ&h‹ÿÿWÿL¼õ&hÿÿWÿL¼õ&hŠÿÿWÿL¼&hÿÿWÿL¼&hŒÿÿWÿL½Æ&h)ÿÿ<ÿôÇï&j7s ÿÿ-ÿôÇä&jEsÿÿÿôÇò&j!sÿÿ>ÿôæò&j$sÿÿÿíÿôÑõ&jŽsÿÿÿäÿôÈõ&j‹sÿÿÿíÿôàõ&jsÿÿÿîÿô×õ&jŠsÿÿÿðÿôö&jsÿÿÿðÿôö&jŒsÿÿÿÞÿôÓ&j/sÿÿÿøÿôî‚&j+sÿÿÿÏÿôÆ&j)sÿÿÿìÿôúö&jpsÿÿÿìÿôúö&jmsÿÿÿÞÿô&jqsÿÿ4ÿôØï&p7 ÿÿ4ÿôØä&pEÿÿ4ÿôØò&p!ÿÿ4ÿôØò&p$ÿÿ4ÿôØõ&pŽÿÿ4ÿôØõ&p‹ÿÿ4ÿôØõ&pÿÿ4ÿôØõ&pŠÿÿXÿLæï&r7 ÿÿXÿLæä&rE ÿÿFÿô³ï&u7é ÿÿFÿô³ä&uEéÿÿFÿô³ò&u!éÿÿFÿô³ò&u$éÿÿFÿô³õ&uŽéÿÿFÿô³õ&u‹éÿÿFÿô³õ&uéÿÿFÿô³õ&uŠéÿÿFÿô³&uéÿÿFÿô³&uŒéÿÿEÿô³Æ&u)éÿÿFÿô³Ó&u/éÿÿFÿô³‚&u+éÿÿFÿô³ö&upéÿÿFÿô³ö&uméÿÿFÿô³&uqéÿÿ:ÿôhï&y7Q ÿÿ:ÿôhä&yEQÿÿ:ÿôhò&y!Qÿÿ:ÿôhò&y$Qÿÿ:ÿôhõ&yŽQÿÿ:ÿôhõ&y‹Qÿÿ:ÿôhõ&yQÿÿ:ÿôhõ&yŠQÿÿ:ÿôh&yQÿÿ:ÿôh&yŒQÿÿ:ÿôhÆ&y)Qÿÿ4ÿAì&biÿÿ4ÿAï&b'i7 ÿÿ4ÿAä&b'iEÿÿ4ÿAò&b'i!ÿÿ4ÿAò&b'i$ÿÿ4ÿAõ&b'iŽÿÿ4ÿAõ&b'i‹ÿÿ4ÿAõ&b'iÿÿ4ÿAõ&b'iŠÿÿ4ÿA&b'iÿÿ4ÿA&b'iŒÿÿ4ÿAÆ&b'i)ÿÿWÿA¼ì&hijÿÿWÿA¼ï&h&ij7 ÿÿWÿA¼ä&h&ijEÿÿWÿA¼ò&h&ij!ÿÿWÿA¼ò&h&ij$ÿÿWÿA¼õ&h&ijŽÿÿWÿA¼õ&h&ij‹ÿÿWÿA¼õ&h&ijÿÿWÿA¼õ&h&ijŠÿÿWÿA¼&h&ijÿÿWÿA¼&h&ijŒÿÿWÿA½Æ&h&ij)ÿÿ:ÿAhì&yiHÿÿ:ÿAhï&y'iH7Q ÿÿ:ÿAhä&y'iHEQÿÿ:ÿAhò&y'iH!Qÿÿ:ÿAhò&y'iH$Qÿÿ:ÿAhõ&y'iHŽQÿÿ:ÿAhõ&y'iH‹Qÿÿ:ÿAhõ&y'iHQÿÿ:ÿAhõ&y'iHŠQÿÿ:ÿAh&y'iHQÿÿ:ÿAh&y'iHŒQÿÿ:ÿAhÆ&y'iH)QTÿFÒì*e}¸ /¸EX¸*/¹* >Y¸EX¸/¹>Y¸*¸и/º9¸¸ии/º9º$901'>7.'#4&'33>7¹*[0/6:!I!3)F10-" *,HNP$ÁK9$OPK5_&*Y,CHJ"-2N*f@<»6dS: 4ÿLØì*C}¸*/¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸¹ô¸¸$Ð01%2654.#".54>32#LX*=&&=*X9)F3 9L--L9 2D(-ta0O88O0at%%@Y9=^A!!A^=8Y?&&$*4ÿI©à%C}¸%/¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô¸и¹ô01>54.'.54>;&"#"(( )F5#?T2E-Ve/?#@6¢#"  "7Q8@\<)gg0D//)>#\ÿLxà .}¸ /¸EX¸/¹ >Y»+¸¹ô01!#3##\óÝÜ-à&ü$Už[ÿN¾¬ º+01'>54&''%&''%.'OW‰^1 + E‚KJ‰O$-ƒU¬1¯Æg3^00\/)P' ;$%‚DA"?%$…U‰-ÿÿ0ÿe¥Í'w~xÿÿCr˜Íw~ÿÿCD˜ŸwPR唵 º+013#i+ µHˆG‰Ð¸EX¸/¹>Y¸Ü01?3#Q+HˆÐÿÿö/Yõ& ÿéß6ž¸EX¸/¹>Y¸Ü01'/,!ž¸ÿÿ1›ömÿÿÿA`ÿ¾i\ÿôǸ/¸EX¸/¹>Y¹ ô01"533267A-  RJX£U$ÿÿÔ?Qå7 ÿÿÔ?Qå7 ÿÿÅABäE ÿÿÂ/ õ# ÿÿö/Yõ& ÿÿ…0iõŽ ÿÿ|0`õ‹ ÿÿ…0xõ ÿÿ†0oõŠ ÿÿˆ2Ž ÿÿˆ2ŽŒ ÿÿgC¯Æ) ÿÿ„1’öp ÿÿ„1’öm ÿÿvV q ÿóßož¸EX¸/¹>Y¹ô01>54$,),!"ú "  #ÿòßož¸EX¸ /¹ >Y¹ ô01.54>7"P!!,*,% ß#  " ÿêß7ž¸EX¸/¹>Y¸Ü017/!—¸ÿÿÿéß6žmÿóßП»  +¸ ¸и/017'>54&'7ƒ/ «" *;.—¸ $ ).&2ÿòßËŸ»  +¸ ¸и/017'.5467~/!n/;*C—¸2&.) ;$ ÿóßΟ »  +01/>54&'7 ., }" *;.ž¸ $ ).&2ÿòßÉŸ »  +01'.5467š/,!@/;*Cž¸2&.) ;$ ÿèÌÀ¡&d¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹ >Y¸¹ô¸¹ô¸ и /¸¸и¹ô01>323267#".#">54'7  1G-=f" " | # ÿèÌÀ¡&`¸EX¸/¹>Y¸EX¸#/¹#>Y¸EX¸/¹ >Y¹ ô¸#¹ô¸#¹ô¸и/¸¸Ð01.5467'>323267#".#"j=-HŠ  Ì # " " ÿÿ“a “M¸EX¸/¹>Y¸EX¸ /¹ >Y¸¹ôº 9¸¹ô¸ ¹ô01!!32+72654&+aþ¯’5W="wpĸcbed†“(ù+C.aa&JPKAþÚÿÿa“ÿÿaÈ“C!ÿDJ“ #O}¸/¸EX¸!/¹!>Y¸EX¸/¹>Y¹ô¸ и!¹ ô¸ ¸ и¸Ð01!#5!#'53>7>7!ý   ]t'þ3'   ,k1TRT04L8$ Cý½ʼ¼Ê6ZD4ZW]8ý•ÿÿaÔ“ ÷Ÿ3ƒ¸EX¸/¹>Y¸EX¸ /¹ >Y»+¸ ¸ии¸к 9¸¹ô¸¸и/¸¸!и¸'й-ôº3!901!#####'.#"'6323337>32.#"÷5½o,o½5ÏN    Qk,kP    NKþµKþµb®!&. 1(°!þß°(1 .&!®ÿóÿô ŸQ¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y»+%+»6+¸¸ и¹ô¸6¸1и+¸<и%¸Bи¸NÐ01#"./####"'732>?'.#"'6323337>32.#"3267  bx+wb    aD   ! Ex+xE !   Ea   0(ÛþµKÛ(0 .& Ù´&. 1(°!þß°(1 .&³Ú &é“»+¸¸и¸Ð0133333#####ÙÆ5¸e.e·6ÇË3»h.iº4d/þß!þß!þÑþœJþ¶Jþ¶.ÿôøŸ3M¸EX¸#/¹#>Y¸EX¸/¹>Y»+¸¹ ô¸#¹ôº,901"&'732>54&+532654.#"'>32Km1-16 $A1pcC/g](7 2Wf<(H473=Q$=R /4" '9%LH&DD. % .*='7Q UH-I2a#“I¸EX¸/¹>Y¸EX¸/¹>Yº9¸¸и¸ к 9013373#467##a.K1.Jþå1“þl0`0‚Òým™0[0þ-ÿÿa#G&”2Fa&ŸW¸EX¸/¹>Y¸EX¸/¹>Y»+¸¸и¸и/¸¹ôº901!###337>32.#"&4Ûˆ..Š`!   _Kþµ“þß°(1 .& °aÿô4Ÿ*C¸EX¸/¹>Y¸EX¸/¹>Y»+»+¸¹'ô01#"./##337>32.#"32674 !|Š..Š`!   `}   0(Ûþµ“þß°(1 .& °Ý &a“ » +01333###a.rá8ñõ5áy.“þß!þÑþœJþ¶ÿô“A¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸¸и/¸¹ô01"&'732>7>7!##2     &*.×!  & , (I>mÓuýmkgÆeGZ2ÿÿaa“ÿÿa“ ÿÿ7ÿôVŸÿÿa“Pÿÿaö“ÿÿ7ÿôŸÿÿï“ÿôæ“G¸EX¸ /¹ >Y¸EX¸/¹>Y¹ôº 9¸¹ ô¸ ¸Ð01"&'7326?3373{ &,â1–/+Š0ßA + #+þ qq`ýÓ6<0ÿô™Ÿ Y¸EX¸/¹>Y¸EX¸/¹>Y»+» +¸ ¸Ð¸¸и¸и¸Ð01%>54&'##5.546753yw{{w)w{{w)Š––Š)Š––Š)|p_^ll^_pÁ~qr‚bb‚rq~bÿÿÑ“aÿDQ“ =}¸/¸EX¸/¹>Y¸EX¸/¹>Y¹ ô¸Ð¸¸ Ð01%#5!3!3Q'þ>.N.(ʼ“ý•ký•Gâ“7¸EX¸ /¹ >Y¸EX¸/¹>Y»+¸ ¸Ð01#".=332673#´?+6W< -1H-*?..7/L7  -=%3ýmaå“ G¸EX¸/¹>Y¸EX¸ /¹ >Y¹ô¸¸и¸ии¸Ð0133333!a.ý.ý.ý|“ý•ký•kýmaÿD*“E}¸/¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸ ии¸ иÐ01%#5!33333*&ýd.ý.ý.(ʼ“ý•ký•ký•š“C¸EX¸/¹>Y¸EX¸ /¹ >Y»+¸¹ô¸ ¹ô01#5!32+72654&+ûÞ ‚5X?#xo¸¬cbidvk(þá,B.ba'IQHDþÚa“ I¸EX¸/¹>Y¸EX¸ /¹ >Y»+¸ ¹ ô¸¸и ¸Ð01332+72654&+3#a.|6V>!xp­¢bcedpà..“þá,C.ba'IQJBþÚlýma“ 9¸EX¸/¹>Y¸EX¸ /¹ >Y»+¸ ¹ ô01332+72654&+a.Ž6V>!xp¿´bced‚“þá,C.ba'IQJBþÚ&ÿôþŸ I¸EX¸/¹>Y¸EX¸ /¹ >Y¹ôº 9¸/¹ô¸¹ô01>32#"&'73267!5!.#"9c<=cE%&FaY¸EX¸/¹>Y¸EX¸*/¹*>Y¸EX¸#/¹#>Y»(+¸#¹ô¸¹ ô01%2>54.#">32#".5##390N77N00O77OÑ*CZ69`D&&D`99_D&¨..+OoEDnM**MnDEoO+TFoN*/Y}NNZ10Z~Nþ¶“þßГT¸EX¸ /¹ >Y¸EX¸ /¹ >Y¸EX¸/¹>Y» +¸ ¹ôº 901#";###.54>3¢‚X]]X‚..“½6Â$;,9P1l=JIG>ým/þÑ3,>(/B*ÿÿaÔT&"ÿÿaÔ&6ÿôo“'S¸EX¸/¹>Y¸EX¸/¹>Y»+¸¹ô¸¸и/¸¹ô¸Ð01"&'732>54&#"##5!#>32Á#  .&cZ B.¾ßóB"4V=!2> (&>/WNþ§k((é1N6:N0ÿÿaÈT&C%7ÿôŸ M¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ôº 9¸/¹ô¸¹ô01%#".54>32.#"!!3267&^@?fH'(Ig@:YJ-hy.þÑym3P$R,2.XRR~W-0%ˆ{(“™)(ÿÿ.ÿôàŸÿÿa“ ÿÿÿòþ& 6xÜ =¸EX¸/¹>Y¸EX¸/¹>Yº+¸¸ и¸Ð01"&546323"&546323#8pf..ÕBýmÿÿ)ÿôo“ ÿôM“,U¸EX¸*/¹*>Y¸EX¸/¹>Y»,+¸¸и/¹ô¸*¹ô¸¹"ô01%2654&+2+##"'732>7>7!Zccfddp6V>!xo¢Â!  &    &'IQJBþÚM,C.bakgÈeGY2, (I>mÓuþáan“c¸EX¸/¹>Y¸EX¸/¹>Y¸йôº9¸/¸и/¸¹ô¸¸и¸и/01%2654&+2+!#3!3{cceddp5W=!xo¡þ©..W.'IQJBþÚM,C.baJþ¶“þß!þád“E¸EX¸/¹>Y¸EX¸/¹>Y» +¸¸и¹ô¸Ð01>32#54&#"##5!# C jt-[ZB.¾ßó‚\iÈÈVGþ§k((ÿÿa&U&–%8aÿô4U.C¸EX¸/¹>Y¸EX¸/¹>Y»+» +¸¹+ô01'7#"./##337>32.#"3267#}Œ !|Š..Š`!   `}  Ã{!üÅ 0(Ûþµ“þß°(1 .& °Ý &aU  » +01333###7a.rá8ñõ5áy.®}…“þß!þÑþœJþ¶Ú{!qÿÿa#U&”"FÿÿÿôæF&¡2ïaÿD“ A}¸/¸EX¸/¹>Y¸EX¸/¹>Y¸Ð¸¹ ô¸¸ Ð01!##5#3!3Â'É.\.¼¼“ý•k0¿B¸EX¸/¹>Y»+»+¸¹ô¸¸и¸Ð01%2654&+2+#53533#Ab_bgXd6W=!spš––.öö&FPH@þâD*A-b] ''Ÿ7ÿôVŸ !C¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô¸¹ ô013267'.#"2#".54>eyffzxaawàY¸EX¸/¹>Y¸¸Ð¸/º9¸¹ô0133>7>32.#"#1z    P.)   ¢6“þ746647?8-%*ýßaÑ?5|¸/¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô01!#!7Ñ þÇ.= ?Ôý•“¬%Ý“ U¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ôº 9¸/¸ܸ¸и¸ и /013###57!¤££.QQgkþ÷!þ¿A1( ÿD Ÿ8‘}¸/¸EX¸/¹>Y¸EX¸ /¹ >Y»  +¸ ¸ ийô¸ ¸к 9¸¹ô¸¸"и"/¸ ¸%и¸+и¸1к7%901%#5#####'.#"'6323337>32.#" '½o,o½5ÏN    Qk,kP    N¸(ʼKþµKþµb®!&. 1(°!þß°(1 .&!®þÆÿôÿ@ŸTݸEX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸/¹>Y»0*+»; +¸ ¸и¹ô¸;¸6и0¸Aи*¸Gи¸QиQ/¸RиR/01#5&'#5./####"'732>?'.#"'6323337>32.#"33& %bx+wb    aD   ! Ex+xE !   Ea -¶· 30ÛþµKÛ(0 .& Ù´&. 1(°!þß°(1 .&³Ú-'ÿ@“Z¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸ /¹ >Y»+¸¹ô¸¸ и¸Ð01%#5#####33333& »h.iº4ËÆ5¸e.e·6Ç´(ÍÀJþ¶Jþ¶d/þß!þß!þÑþÄ.ÿDøŸ6[}¸ /¸EX¸./¹.>Y¸EX¸ /¹ >Y»+º9¸ ¸и ¹ô¸.¹'ô01#5.'732>54&+532654.#"'>32j=Q 7J*'Bc--16 $A1pcC/g](7 2Wf<(H473_ UH+E2±±/0" '9%LH&DD. % .*='7QaÿD;Ÿ c}¸/¸EX¸/¹>Y¸EX¸ /¹ >Y» +¸ ¸йô¸¸ и /¸¹ôº 901%#5###337>32.#";'Ûˆ..Š`!   _Î(ʼKþµ“þß°(1 .& °þÈaÿ@4Ÿ*X¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y»+» +¸¹)ô¸*Ð01%##5./##337>32.#"34&|Š..Š`!   `} 6 ¹µ .#Ûþµ“þß°(1 .& °Ý-'aÿ@4“9¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô01%#5###3334&áy..rá8ñÙ(ÍÀJþ¶“þß!þÑþÄ´ŸS¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô¸и/¸и/¸¹ô01!####5!37>32.#"´4Ûˆ.ÒŠ`!   _Kþµk(þß°(1 .& °ÿôŸ,¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y»+¸¹ ô¸и/¸ и /¸¹ô¸¹)ô01#"./###5!37>32.#"3267 !|Š.ÒŠ`!   `}   0(Ûþµk(þß°(1 .& °Ý &¬“9¸EX¸/¹>Y¸EX¸ /¹ >Y» +¸¹ô01!####5!33¬5áy.Òrá8ñJþ¶k(þß!þÑaÿDc“Q}¸/¸EX¸ /¹ >Y¸EX¸ /¹ >Y¸йôº 9¸/¹ ô¸ ¸Ð01%#5#!#3!3c'EþŸ..a.(ʼJþ¶“þß!ý•7ÿDŸ$C}¸/¸EX¸/¹>Y¸EX¸/¹>Y¸и¹ô¸¹!ô01%#5.54>32.#"3267#S7'9^C%)Jg?:XH-6W= Y¸EX¸/¹>Yº 9¸ /¸и ¸ܸи ¸к9013###57333>?3~‹.ŠU(¸1d!$d/%!þünÎ$F$$F$ÎÿDç“e}¸/¸EX¸/¹>Y¸EX¸/¹>Y¸йôº 9º 9¸¸к9º 901%#5#'.'##33>?3ç'ss/Ƹ2ll/¸¯(ʼÊ22ÊU>Â((ÂþÀþÕGÿD'“G}¸/¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô¸¸Ð01%#5##".=332673'&F?+6W< -1H-*?.(ʼ7/L7  -=%3ý•aü“7¸EX¸/¹>Y¸EX¸/¹>Y»+¸¸ Ð013>32#54.#"#a.?+6W< -1H-*?.“þñ.M7ÈÈ-=%þ¥ÿÿa“ ÿÿ ÷F&2ÿóÿô Fg—¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸)/¹)>Y¸EX¸+/¹+>Y»+»A;+»L+¸¸"и)¹/ô¸L¸GиA¸Rи;¸Xи/¸dÐ01#".'332>7#"./####"'732>?'.#"'6323337>32.#"32673&&3* #$ 3  bx+wb    aD   ! Ex+xE !   Ea  F-%%-$$ü³ 0(ÛþµKÛ(0 .& Ù´&. 1(°!þß°(1 .&³Ú &éF+'»!+»+¸¸и¸Ð0133333#####".'332>73ÙÆ5¸e.e·6ÇË3»h.iº4n&3* #$ *3d/þß!þß!þÑþœJþ¶Jþ¶Æ%-$$-%ÿÿF&2ÿÿú“NÿÿaÔF&2ÿÿ>ÿôQŸ÷ÿÿa# &”,Fÿÿ7ÿôV&6Fÿÿ7ÿôVŸÂÿÿÿôæ &¡,éÿÿÿôæe&¡<éÿÿ:ÿôœì<ÿôáÚ5W¸EX¸0/¹0>Y¸EX¸(/¹(>Y» +¸(¹ôº0(9¸/¹ ô¸0¹ô01%2>54.#">32#"&54>7>7!9*(;')V.W+=]A%%]0.I3 8I)hs)NoE 8O/(F2,;  u‰“  9iZ//!;T3:]B#™‚œV$ \Æà"M¸EX¸/¹ >Y¸EX¸/¹>Y» +º 9¸¹ô¸¹ô0132+2654&+254&+\­NY.!$cU²œK@=Ey}“OLuà8>.0 'FC/)*,®êg.1Æ\uà/¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô01!##\í,à&þFÿTÚàO}¸/¸EX¸/¹ >Y¸EX¸ /¹ >Y¹ô¸и¹ô¸¸ и¸ Ð017!##5!#'53>?!ž  ¸&&þ–' ø/D2! “þm¹¬¬¹.O>âþGÿÿ4ÿô½ì"iì/¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸ ¸ии¸к 9¸¹ô¸¸#ии¸и#¹)ôº/901!#'##5##'.#*'63235337>32&"#"i1„c(c„1–-   6/^(]06   -ççççr++=vÒÒv=++sÿúÿôìOɸEX¸'/¹' >Y¸EX¸)/¹) >Y¸EX¸:/¹: >Y¸EX¸Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y»4+¸¸ и¹ô¸)¹#ô¸4¸/и#¸@и¸LÐ01#"./##5##"'72326?'.#*'63235337>32&"#"3:7 J[([J #L2   2[([2    3M  ( ‹çç‹ ( +0Žx+) vÒÒv )+xŽjà»+¸¸и¸Ð017'3353373#'##5##µ™2M+NŒ3š¤2“R+R’2þâÒÒÒÒâþçççç*ÿô’ì1M¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¹ô¸¹ôº(901"&'732>54&+532654&#"'>32Ý3X(#K+2&PHY¸EX¸/¹>Yº9¸¸ и¸ к 90133>73#5467##\,(Ø+,(Ø+àð'^0:=þ ð(]0:þÃÿÿ\ÎÐ&î0\ÆìS¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¸и¸и¹ôº901!#'##337>32&"#"Æ2“y,,x2    2ççàÒv )+v\ÿôÕì"e¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô¸¹ô01#"&/##337>32&"#"3:7Õ ,]x,,wA.!  A^,­çàÒ‘,!+•­\Æà » +013373#'##\,tŽ2š¤2“y,àÒÒâþçç ÿôà=¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô¸¸и ¹ô01"'73267>7!##0  #  ,³  5 *:>R£Rþ ºK”KPL\à!]¸EX¸/¹ >Y¸EX¸!/¹!>Yº!9¸¸ и!¸ к 9º 9º!90133>73#467##.'##\4s    q4+  p(r  *àþû==þ M#2þø2#Mþð\Êà ?¸EX¸/¹ >Y¸EX¸ /¹ >Y» +¸¸и ¸Ð013!53#5!#\,,,þê,àÐÐþ èèÿÿ4ÿôãì,\Àà3¸EX¸/¹ >Y¸EX¸/¹>Y¸и¹ô01!#!#\d,þô,àþ ºþFÿÿ\ÿ'ìì-ÿÿ4ÿô§ì Ÿà3¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô¸Ð01#5!##Ƭ…¬-º&&þFÿÿ ÿ%¨à64ÿ'Ï%6G˸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸%/¹%>Y¸EX¸/¹>Yº 9º 9¸ ¸и¸к9º"9¸¹&ô¸¹)ô¸¹*ô¸ ¹-ô¸&¸7и-¸Aи¹Dô¸"¹Eô017#"&54>32'53>32#"&'#'267.#"!2>54.#"L1Rb1A&1,8WW1A%4,^,12$$4 2$ 3$24,Iz:^B#GÃÃH…p=`C#H­ôV!9O-0N7 :Q1,L7þ¨ÿÿ‰à5\ÿTûà =}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¹ ô¸Ð¸¸ Ð01%#5!3!3û&þ,,'¹¬àþG¹þGBŽà7¸EX¸ /¹ >Y¸EX¸/¹>Y»+¸ ¸Ð01%#"&=3326753#b^^,IN),,ÑHT?6éþ \rà C¸EX¸/¹ >Y¸EX¸ /¹ >Y¹ô¸¸и¸и¸Ð0133333!\,É,É,ýêàþG¹þG¹þ \ÿT³àE}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¹ ô¸ ии¸ иÐ01%#5!33333³&ýÔ,É,É,'¹¬àþG¹þG¹þGà C¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸¹ô¸ ¹ ô01#5332+72654&+Ó¹åbUaaUŽ„KHHKXº&¿GHII&3981Õ\ à I¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸ ¹ ô¸¸и ¸Ð01332+72654&+3#\,WUbbUƒzKGGKNl,,à¿GHII&3981Õºþ \¯à 9¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸ ¹ ô01332+72654&+\,qUaaU“KHHKgà¿GHII&3981Õÿôì C¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸ ¹ô¸¹ô01>32#"&'73267#53.#"%G9*K9"!9P.1N@*O\íìZB+;±$?_A?^?$jf$[]\ÿô˜ì.e¸EX¸,/¹, >Y¸EX¸/¹ >Y¸EX¸*/¹*>Y¸EX¸#/¹#>Y»(+¸#¹ô¸¹ ô01%2>54.#"'>32#".'##3Î#9))9##;**;§"6F)*I77I**I7!{,,8N/0N99N0/N8ò5S9"@_<<]@"!=Y9äàÓ*”àK¸EX¸ /¹ >Y¸EX¸/¹>Y» +¸ ¹ô¸¸ к 901#";7#5+#7.54>3h]DOOD],,n›4¡7J0C(»-332êþ ÑÑÕ A=$3ÿÿ4ÿô½ò&"!ÿÿ4ÿô½ &"5ÿÞÏ,~¸EX¸&/¹&>Y¸EX¸!/¹!>Y¸EX¸ /¹ >Y¸&¸%ܸ"ܸܺ!9¸ ¹ô¸¹ô¸¹ô¸%¸)и"¸*Ð01>32#"&'732>54.#"##57533#†&O2U\0F+  4%#4#)F-,MM,¾¾v&.ˆœu˜Z$$ O‰iFa=)-þ´Eii!hÿÿ\uô&ç$ù4ÿô§ì C¸EX¸ /¹ >Y¸EX¸/¹>Y»+¸ ¹ô¸¹ô01%#".54>32.#"!!3267§L./P:!#Y¸EX¸/¹>Y¸¸Ü¸ܸ¸ и¸Ð01"&546323"&546323#9fa,,Vvþ ÿÿÿßÿœ£'ÿô—à(U¸EX¸&/¹& >Y¸EX¸/¹>Y»(+¸¸и/¹ô¸&¹ô¸¹ ô01%2654&+72+##"'73267>73×KHHKEOUaaU{ª $  ) þ&3981ÕûGHIIºFšM)9&*9?Q¢T¿\¸àO¸EX¸/¹ >Y¸EX¸/¹>Y»+»+¸¸йô¸¸Ð01%2654&+72+5##3353øKHHKEOUaaU{ÿ,,ÿ,&3981ÕûGHIIèèàÐпÿÿ¿Ï<ÿÿ\Æô&ð$ \ÿôÕô&e¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô¸¹#ô01'7#"&/##337>32&"#"3:7í†"X ,]x,,wA.!  A^@ý!,­çàÒ‘,!+•­\Æô » +0173373#'##Õ†"‘,tŽ2š¤2“y,W—`ÒÒâþççÿÿ\Îô&î!ÿÿ ÿ%¨Î&60å\ÿTÆà A}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¸Ð¸¹ô¸¸ Ð01!##'#3!3Æ%¡,,¬¬àþG¹kB¸EX¸/¹>Y»+» +¸¸и¸и¹ô01#53533#32+72654&+¿¥¥,ÈÈcUbbU†KGGKZ¿'……'žGHII&3981Õÿÿ4ÿôãìæ ÒìE¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¸Ð¸/º 9¸ ¹ô0133>?>32.#"# 0l    @+(  y9àþÓ#F!!F#Â=:+&*þ‘\„Œ/¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô01##37„ô,÷ ŒÒþFà¬!|à I¸EX¸ /¹ >Y¸EX¸/¹>Y» +¸ ¸и¸и ¹ ô013##5#575!,BBº¹!ààß&ÿT„ì4‘}¸/¸EX¸/¹ >Y¸EX¸ /¹ >Y» +¸ ¸ ийô¸ ¸к 9¸¹ô¸¸ и /¸¸#и¸'и¸-к3#901%#5#'##5##'.#*'63235337>32&"#"„&!„c(c„1–-   6/^(]06   -'¹¬ççççr++=vÒÒv=++sÙÿúÿT„ìJ¸¸EX¸'/¹' >Y¸EX¸)/¹) >Y¸EX¸:/¹: >Y¸EX¸Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y»4+¸¹ô¸¸ и¸и)¹#ô¸4¸/и#¸@Ð01%#5./##5##"'72326?'.#*'63235337>32&"#"„&.J[([J #L2   2[([2    3M '¹¡,6‹çç‹ ( +0Žx+) vÒÒv )+xŽ ÿT„àZ¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸ /¹ >Y»+¸¹ô¸¸ и¸Ð01%#5#'##5##7'3353373„&!“R+R’2£™2M+NŒ3š‹'¹¬ççççþâÒÒÒÒâ×*ÿT’ì4Q}¸ /¸EX¸,/¹, >Y¸EX¸ /¹ >Y»+¸ ¸ и ¹ô¸,¹%ô01%#'.'732>54&+532654&#"'>32*%,;"$+M##K+2&PHY¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô¸¹ô01%#5#'##337>32&"#"á&"“y,,x2    2‹'¹¬ççàÒv )+vÖ\ÿTáì!T¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¹ô¸¹ô01%#5./##337>32&"#"á&(]x,,wA.!  A^ '¹ *­çàÒ‘,!+•­\ÿTáà9¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô01%#5#'##3373á&"“y,,tŽ2š‹'¹¬ççàÒÒâ×=ì]¸EX¸/¹ >Y¸EX¸/¹>Y» +¸¸и¹ô¸¸и/¹ôº 901!#'###5337>32&"#"=2“y,¹åx2    2ççº&Òv )+vÿôLì$s¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y»+¸¹ ô¹ ô¸ ¸и¹!ô01#"&/###5337>32&"#"3:7L ,]x,¹åwA.!  A^,­çº&Ò‘,!+•­=à» +» +¸ ¸ Ð01!#'###53373=2“y,¹åtŽ2šççº&ÒÒâ\ÿT àK}¸/¸EX¸ /¹ >Y¸EX¸ /¹ >Y» +¸ ¸йô¸ ¸Ð01%#5#5!#3!53 &Cþê,,,'¹¬èèàÐÐþG4ÿT§ì$C}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¸и¹ô¸¹!ô01%#'.54>32.#"3267§C($*F4$Y¸EX¸/¹>Y¸EX¸/¹>Yº9¸¸ и¸ Ð01333>73#Ź0l    l-µ,àþÜ#F F#$þ Ù ÿ'¦àX¸EX¸ /¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y¸ ии¸к 9¸ ¸Ð0173##5#57333>73ý‡“,—N<¬0l    l-!!ÙÙ¿þÜ#F F#$ÿT¢àe}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¸йô¸¸к 9º9º 9º 901%#5#'.'##7'33>?3¢&UR/£–1N   K.•‰'¹¬ƒ,,ƒûåz''zéÐBÿTÐàE¸/¸EX¸/¹ >Y¸EX¸/¹>Y» +¸¹ô¸¸Ð01%#5#5#"&=3326753Ð&C^^,IN),'¹¬ÑHT?6éþGÿÿ\¿Ï%ÿÿiÎ&ê0>ÿúÿôÎeÓ¸EX¸=/¹= >Y¸EX¸?/¹? >Y¸EX¸P/¹P >Y¸EX¸R/¹R >Y¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸)/¹)>Y¸EX¸+/¹+>Y»+»J+¸¸"и)¹/ô¸?¹9ô¸J¸Eи9¸Vи/¸bÐ01#".'332>7#"./##5##"'72326?'.#*'63235337>32&"#"3:7Ñ!7**7!( (( Ö J[([J #L2   2[([2    3M Î4**4*  *ý* ( ‹çç‹ ( +0Žx+) vÒÒv )+xŽjÎ+'» +»$+¸¸и$¸(Ð01".'332>73'3353373#'##5##>*7!( (( (!7³™2M+NŒ3š¤2“R+R’2<*4*  *4*þÂâÒÒÒÒâþççççÿÿ\ÿô·Ï)ÿÿ:ÿôœÎ&0þÿÿAÿôêìÿÿ4ÿô½Î&"0ÿÿ&ÿô¯ìÊÿÿ\΄&î+ÿÿ4ÿôã &,5 ÿÿ4ÿôãìæÿÿ ÿ%¨‚&6+åÿÿ ÿ%¨î&6;å4ÿôÐÚ@Q¸EX¸;/¹;>Y¸EX¸)/¹)>Y¹ôº ;)9¸;¹ô¸ ¹ô¸ ¸1Ð0172>54.'#".5467.54>7>7þ)=)!-_g+9ñ.6P6)5":+6M0&I9"pb6+!?[9 4F(#8/(qQ&?.“ 09E.3U>"7N1`t#"#$( CÿôF‹,@LP‡¸EX¸/¹>Y¸EX¸/¹>Y»MP+»G7+¸¹ô¸¸и/¸¸ и /º 9¸¹ôº$9¸M¸-ܹAô01*/26533.4=463:"#./#".54>32'2654&#"3#W31^/I40^/J'6((66((60::00::Köö %Y¸EX¸%/¹%>Y¸EX¸ /¹ >YºB"+¸%¹ôº"B9º %79¸ /¸ܸ7¹ôº/ 9º? 9ºI"B9017267.'>54.#"&'#".54>7.54>32>73æ)J5c#'(7 .$,1{AL$X8'F3%1$268+7#a3#4+9(#@' 0x@$'+!5%ô!G$$(+@ý¹<%./B)!6/)*S& 6'D4 6/+?v--m?D{3% 0ÿô®‹ 5¸EX¸/¹>Y¸EX¸/¹>Y¹ ô¸¹ô01"&54632'2654&#"ï\cc\\cc\COOCBPP ­¡ ©© ¡­&•““““•T¢ C¸EX¸/¹>Y¸EX¸ /¹ >Y¹ô¸¹ô¹ô¸¸ Ð0173#5>733!T–r'=$‹þ²' ý¨''±‹A¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸ии/¸¹ô017>54&#"'>32>;!)OvO'CH,L$W;V^*LmB7ÚþxPiY*Y¸EX¸/¹>Y¹ ôº%9¸/¹ô¸%¹ôº-901".'732>54.#52>54&#"'>32è&>1'"+5! 7(5U<7M/F;-J!T8%@/E54(5G  %4 !6''%36A) .'9%?M*7"*C/À ]¸EX¸/¹>Y¸EX¸ /¹ >Y»+º 9¸¸ и¸ и ¸и/¸¸Ð01%5467###5!5336 ¼z_+þÚ)(_åêB&þø&¿¿¦þfÿô¯(M¸EX¸/¹>Y¸EX¸/¹>Y¹ ôº9¸/¸¹ô¸¹ô01".'732>54&#"'!#>32ã&=1&"*4! :+TH%5'ÿ6#(H4#9I  -?'NW+'ç1M43O74ÿô´‹0C¸EX¸-/¹->Y¸EX¸%/¹%>Y» +¸%¹ô¸-¹ô01%2>54.#".#">32#"&54>32/"!5$"R'(;¬8&D4!S-U]0?$ap'AU.-A,;"";++53S;! JyX)0ea,I5œ’dŠV%",µ7¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô¸ и /013>7!5!#¼.F0þ¯‰9K-0a¡ƒD'LŒ‘ž^(ÿôµ‹);MM¸EX¸/¹>Y¸EX¸/¹>Yº*9¸¹2ô¸¹<ôºF901".54>75.54>32>54.#"2>54.'ó,J6%-!-=#)@- (3H)+!1-!0="7'!7F%1@*: /@& 8-#  %+":)-=$1*"  &2 #=-[!I*/$,"1%þ¾$0%3'O53&+ÿôª‹0C¸EX¸%/¹%>Y¸EX¸-/¹->Y»+¸%¹ô¸-¹ô01267.#"32>7#"&54>32#"&'â"S&);'0""4j8 &D4!T-T]0?$`p'@V.-B#,53S; +;"#;+Ó JyX(0ea+J4›’eŠU&"0ÿô®‹ #G¸EX¸/¹>Y¸EX¸/¹>Y¹ ô¸¹ôº9¸¸Ü01"&54632'2654&#"7"&54632ï\cc\\cc\DOODCPPC!!"" ­¡ ©© ¡­&–’’‘‘’’–ñ0ÿô®‹]¸EX¸/¹>Y¸EX¸/¹>Yº9¹ôº9º9¸¹ôº90132?>54&#"72#"&546mPCO' PC&<u\cc\\ccÞA[“–d) M/“‘00…© ¡­­¡ ©8ÿôÊ‹ 5¸EX¸/¹>Y¸EX¸/¹>Y¹ ô¸¹ô01"&54632'2654&#"ahhaahhaGTTGHSS ® ŸªªŸ ®'•’’’’•9Ø5¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô¹ô01#5>73#¬s(<$,9 ý'°‹A¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸ии/¸¹ ô017>54.#"'>32>;!*NvO'"5$,L'W9U^)MlB7ØþzPiY*4&0$+3bQ0_iwF(ÿÿÿô«‹Dÿÿ ÐEÿÿÿô¯Fÿÿ?ÿô¿‹G ,§7¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô¸ и /013>7!5!#²-D0þ½{9I+0a¡ƒD'LŒ‘ž^ÿÿ9ÿôÆ‹Iÿÿ4ÿô³‹J 8ÿôÊ‹ #G¸EX¸/¹>Y¸EX¸/¹>Y¹ ô¸¹ôº9¸¸Ü01"&54632'2654&#"7"&54632ahhaahhaHTTHHTTH""!! ® ŸªªŸ ®'•’’’’•ð8ÿôÊ‹]¸EX¸/¹>Y¸EX¸/¹>Yº9¹ôº9º9¸¹ ôº90132?654&#"72#"&546vUHU) UHT*~ahhaahhàA]“–d&@_“‘`…ªŸ ®® Ÿª0ÿô®G 5¸EX¸/¹ >Y¸EX¸/¹>Y¹ ô¸¹ô01"&54632'2654&#"ïYffYZefYDNNDCOO “——’’——“&‡}}††}}‡T¢; C¸EX¸/¹ >Y¸EX¸ /¹ >Y¹ô¸¹ô¹ô¸¸ Ð0173#5>733!T–r'=$‹þ²'Í ýì''±EA¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸ии/¸¹ ô017>54.#"'>32>;!)NvN("4$,L$W;U_+Mi>7ÓþxBjXL&3&0$)6aQ,RXa9(ÿ­«G7F¸EX¸%/¹% >Y» +º%9¸/¹ô¸%¹ôº-901".'732>54.#52>54&#"'>32è&>1'"+5! 7(5U<7M/F;-J!T8%@/E54(5GS &4 !6''&36A( .(9%?N+8"*C/ÿ¹À; H¸EX¸/¹ >Y»+º 9¸¸ и¸ и ¸и¸Ð01%5467###5!5336 ¼z_+þÚ)(_Œþ>-þð'¬¬»þQÿ­¯;(<¸EX¸/¹ >Y» +º9¸¹ô¸¹ô01".'732>54&#"'!#>32ã&=1&"*4! :+TH%5'ÿ6#(H4#9IS .?'NW,(ç1M43P7ÿÿ6ÿô¶‹G,ÿ¹µ;"¸EX¸/¹ >Y¹ô¸ и /01>7!5!#¼.F0þ¯‰9K-0Ga¡„D(L’ž^ÿÿ(ÿôµ‹I!ÿ­«G/2¸EX¸$/¹$ >Y»,+»+¸$¹ô017267.#"32>7#"&54>32#"&'Û&U()=(3%"6c0D$A2 !V1Y\2C%co%?T..CÎ,66Y?#/>$$>-Æ4GsT)/jc-M8Ÿc‹V' ÿÿ8ÿô¶GY9Ø;5¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô¹ô01#5>73#¬s(<$,ô ýÅ.¯EA¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸ии/¸¹ ô017>54.#"'>32>;!1NsL%!3$,H$S;U[)Ig=7Êþ‚BjXL&3&0$(7aQ,RXa9(ÿÿÿ­«G\ÿÿÿ¹È;]ÿÿÿ­¯;^ÿÿ>ÿô¾‹G ,ÿ¹§;"¸EX¸/¹ >Y¹ô¸ и /01>7!5!#±-D0þ½{9I,0Ga¡„D(L‘Ÿ^ÿÿ0ÿô½‹Iÿÿ)ÿ­³Gb0ÿô®Ÿ 5¸EX¸/¹>Y¸EX¸/¹>Y¹ ô¸¹ô01"&54632'2654&#"ïYffYYfeZCOOCBPP ª®¬§§¬¯©&š˜•˜˜•˜šT¢“ C¸EX¸/¹>Y¸EX¸ /¹ >Y¹ô¸¹ô¹ô¸¸ Ð0173#5>733!T–r'=$‹þ²'% ý”''±ŸA¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸ии/¸¹ ô017>54.#"'>32>;!)UxK##4$,L$W;V^'KkC7ÔþxIob-7)/$)6gU5jmu?(ÿô« 7S¸EX¸%/¹%>Y¸EX¸/¹>Y¹ ôº%9¸¹ô¸%¹ôº.901".'732>54.#52>54&''>72è&>1'"+5! 7(5U<7M/F;-J!T8%@/E54(5G  &7!"8(''58B( -);%BQ,9#+E0À“ U¸EX¸/¹>Y¸EX¸ /¹ >Y»+º 9¸¸ и¸и/¸¸Ð01%5467###5!5336 ¼z_+þÚ)(_åý>-þñ'¾¾ºþRÿô¯“(I¸EX¸/¹>Y¸EX¸/¹>Y¹ ôº9¸¹ô¸¹ô01".'732>54&#"'!#>32ã&=1&"*4! :+TH%5'ÿ6#(H4#9I  0C)Q]+(æ4O76S96ÿô¶Ÿ0C¸EX¸-/¹->Y¸EX¸%/¹%>Y» +¸%¹ô¸-¹ô01%2>54.#".#">32#"&54>32/"!5$"R'(<¬8&D4!S-U]0@#ap'AU.-A/>$%>.,47[@$) JxX(/ig-M8¦›d‹U&",µ“7¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô¸ и /013>7!5!#¼.E2þ¯‰;K,0d¦”ˆE(M‘–£a(ÿôµ›);MM¸EX¸/¹>Y¸EX¸/¹>Yº*9¸¹2ô¸¹<ôºF901".54>75.54>32>54.#"2>54.'ó,J6%-!-=#)@- ( 3H)+!1-!0="7'!7F%2?*: /@&":0%  %,$;*.?%1+#  )4"#=-c!L*2%!-#2%þ¶$0'6)V73&+ÿôªŸ/C¸EX¸$/¹$>Y¸EX¸,/¹,>Y»+¸$¹ô¸,¹ô01267.#"32>7#"&54>32#"&'à&R&(=)/#!4i/E#A1 !R0S]0?$`p&?S,0D#.47Z@#.?$$?.Ó5!JxX'1ke.L8œ“j‘Z'"Cÿô˜O ¸EX¸/¹>Y¸Ü01"&54632n 0ÿe¥O¸EX¸/¹>Y¸ Ü01>7#"&546320"*:-}=*&!7TÿÿCÿô˜Í'w~wÿÿ0ÿe¥Í'w~xÿÿhÿô_O&w%'wvwÇWÿô¬ž¸EX¸/¹>Y¸ ܸÜ0153#"&54632k.!WGGþ\¿WÿB¬ì¸EX¸ /¹ >Y¸ܸÜ013#"&54632k!.w¤þ\GO%ÿô`ª+*¸EX¸ /¹ >Y» +¸ ¸&ܸÜ017&>54.#"'>32"&54632£ ($ +%CO4$:($)!³)C9214+ !!-)8!"9437?&¿3ÿ6nì+*¸EX¸&/¹& >Y»+¸&¸ ܸ Ü01".54>'33267"&54632Î%9($)!) ($ +$CO*Ê)8!"9527?&)C9214*!" .[S݆µ º+01'3#T3 !pEE“ÿÿSݵ&€€:à¡¿ » +01632#"&5467¡!"-(¨6+# 6L:Ý¢¼ » +01>5#"&54632:!"-)ô6+# 6Lÿÿ:à.¿&‚‚ÿÿ:Ý/¼&ƒƒÿÿ:ÿ~¢]ƒý¡ÿÿ:ÿ~/]'ƒý¡ƒý¡+HͰ º+01757+‰{{é&¡Ÿ¡6Hذ º+01?'76zzŠŠ[¡Ÿ¡&¡ÿÿ+HZ°&ˆˆÿÿ6He°&‰‰(æ  »+013#(ÜÜ 'ÿÿ(æ Œ(è¸  »+01!!(þp $(èø  »+01!!(Ðý0 $(è´  »+01!!(Œút $(èp  »+01%!5!p÷¸Hè$(è¸  »+01!!(þp $ÿÿ(èø ÿÿC˜pw!(šñv º +017".54>32Œ$$%%š())( ÿ‹èÿ± »+01!! Üþ$O& 9è` »+01!! Üþ$`'þ;ÿÅÿ± »+01"&'73267ƒÞd_àvvà_dÞêC?<;;<?CXÿQ÷Û º+01.5467Ü>FF><<<<¯dÝ„„Ýd_ßwwß_ ÿQ¿Û º +01>54&'7 <<<<=GG=Ÿ_ßwwß_dÝ„„ÝdbÿhÄ»+»+013#3#b }} ÄüÞÿhµÄ»+»+013#53#}}  {"ü¤#ÿhÄ43»1+»+» +º( 9¸¸3Ð01".54654.#52>54&54>;#";#à)"")".."˜ 1&8a4 6a8&1 251Y6-2  4+6Y152ÿhôÄ3+»2+»+»$%+º %$90132654&54675.54654&+5323"+..")"")"{251Y6+4  2-6Y152 1&8a6 4a8&1  ÿ``ƸEX¸/¹>Y¸Ü013#:&þÏ&Æüš_ÿƒî º+013#_$$îüÿ`]ƸEX¸/¹>Y¸Ü013#&2&Æüš_ÿƒî º+013#3#_$$$$îþ);þ*FÎEȸEX¸/¹>Y017'7737'i7Z ^ _ Z6@BâX$fd$XSS<ÿ°iÈ !»+¸¸и/¸¸Ð015'37'#À„„*„„* *™™*ý¦<ÿ°iÈG»+»+¸¸ и /¸¸ и /¸¸и/¸¸и/0175'75'37'7'#À„„„„*„„„„*I*ÏÏ*™™*ÏÏ*™2ÿÌ­©I»1*+»F+01%>54.'.#"#"&'732654.5467.54>328$'-CL"*-CLM5&$ *>I>*1&'44P;..6*?I?*3&"2#*Fµ*)(3$.&'1#‹ !)!)<.29).!#2#"+ (:.0?(*!*ÿ°£“%¸EX¸/¹>Y¸EX¸/¹>Y013#".54>;u..R7\B$">V3,“ýD1O88O2þa_ÿîº+¸¸и¸Ð013#3#_$$€$$îüèüÿÿWÿô§ž&||ûÿÿ%ÿôÚª&~~zÿÿWÿôKª&|~ëÿÿ%ÿô&ª&~|z"ÿôbª".<¸EX¸)/¹)>Y» +¸)¸#ܸܺ9¸ ¸ Ü01>54.#"'>32#'32#"&546É&!,&DP4%;(%*" +7125!+!" #,)7 #;527>%*D?þmb° »+013##b }#°ýlµ° »+01#53#’} #”ýPbÿÏ »+0133#b#} ýmÿϵ »+0133#}# “ýPbÿhBÄ '»+»+¸¸и¸ Ð013#3#7#bàyyàI)ÄüÞ"üÞÿhõÄ '»+» +¸¸Ð¸ ¸Ð013#53#7#yyààÀ){"ü¤"üÞbÄ »+013##b }#ÄþoµÄ »+01#53#’} #§þRbÿh »+0133#b#} þoÿhµ »+0133#}# {‘þR3ÿô²Œ'ED¸EX¸/¹>Y» +¸¹ô¸(ܸ¸2ܹ9ô¸(¹?ô01".54>32'2>54.#"7".54>32.#"3267sAtX33XtA@tX33Xt@9gN..Ng9:gN..Ng?$?01A$(8- 0W{LKzV//VzKL{W0,OpDCoO++OoCDpO,i3I/+F0RDKV#3ÿô²Œ'2;<¸EX¸/¹>Y» +»:(+»3/+¸¹ô01".54>32'2>54.#"32+#72654&+sAtX33XtA@tX33Xt@9gN..Ng9:gN..Ng4†9NN9])z0880Q 0W{LKzV//VzKL{W0,OpDCoO++OoCDpO,Þ67ô01".54>32'2>54.#"32#'##72654&+È%B22B%%C11C%8((8 7((7$E 1%'/ = D2G,,H33H,,G2+<$$=--=$$<+ VLLgKqC¤]¸/¸/¸Ð¸¸к9¸/¹ô¸¸и¸ и¹ ô¸¹ô¸¹ô¸Ð01#53##33?3#57##'##mkýl&Æ4424%S"S%##þð3~VV~þÍ¡bÓÓb¡ eC©';{¸:/¸(/¸:¸Ð¸/¹ô¸(¸и/º 9¹ôº9º6:(9¸6/¹+ô¸(¸.и:¸1и.¹4ô¸(¹8ô01"&'732654&/.54632.#"33?3#57##'##Œ!7(1&7*.#15y4424%S"S%e  $"&+  %" 3?~VV~þÍ¡bÓÓb¡e_©1K»++»#+» +¸¸Ð¸/¸¸и/¸и¹ ô¸Ð0133?3#57##'##"&54>32.#"32674424%S"S%ß32#"&'##".54>3237332>54.#"3267'2?.#"„H{Z3AmOHuQ,"6A(5=#*0E,5 "$"^3)'HgAE€c<,OoC2R$V}2:!"6%.’/YSbŸq=.SuG@aB!%')"3"$PB+0(½‡9R5@jJ)8g‘YIuQ,6ôC­#6B9.4ÿî¿©IWk»C+» 9+»J+»P%+¸¸и/º%9º(%9¸J¸/и//¸¹Lô¸(¹Mô01".54>32#"&'##".54>3237332>54.#"3267'2?.#"gBpR/gJ)0<%-:%&-D,( $%)-$"A\:@vZ6(Hd<%D#LA0: 3$,(NrKX‘g8(JiB;Z= ($)!/#L?)(©H?4L2;]A#2]ƒQDgE"ÖCš 3>2.$ÁŠ›¸EX¸/¹>Y¸EX¸ /¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y»+»+¸¸ и¸и¸и¸и¸и¸и¸и¸Ð017#537#53733733#3##7##?#wSWX\#•"RUV[#•#×–Ö$ª$ÂÂÂÂ$ª$ÖÖÖúªªÿÿK›£&» T¸EX¸/¹ >Y¸EX¸ /¹ >Y¸EX¸/¹>Yº 9¸/º 9¹ ô01%'.'###3#A""ÌÚ>.Â/Â0Í]/N--O.]%¨þaÕ#W¸EX¸/¹ >Y¸EX¸/¹>Yº!9¸!/¹ôº!9¸¹ô¸¹ô0132+2654&+2>54&+a™Te-,6Eq_¤‹THMKal'@.ZTl;C':  <5LJ 100+¼ü , 62Ú7ÿôÈ 9¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô¸¹ô01".54>32.#"3267"4W>"#@X60J9&[feX+A"N %Fc?=cF%&yijz$&aå 5¸EX¸/¹ >Y¸EX¸ /¹ >Y¹ ô¸¹ô0132+72654.+aƒ@a@ @`@„ne3P7S#B_;;_C$%th1P9 þJaž M¸EX¸/¹ >Y¸EX¸ /¹ >Y¸¹ôº 9¸/¹ô¸ ¹ô01!!3#!!a3þûÝÝþÃ&¸%×&a” 9¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¹ô01!!3##a3þûÜÜ.&Ä%ñ7ÿôÎ !O¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ô¸¹ôº 9}¸/¹ô01".54>32.#"32675#53(6Y?#$B[87I:-^kg^%=€¬U %Fc?=cF%'xji{™%Ô aá Q¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸ /¹ >Y»+013!53#5!#a.$..þÜ.ÜÜþüüa%¸EX¸/¹ >Y¸EX¸/¹>Y013#a..þ)ÿôD+¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô01"&'732653´0F!3"21."7 *% 7>nþ 7*aá e¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸ /¹ >Yº9º9º 901333##a.5±Æ3°o.þì¿þ¿!q°a‹+¸EX¸/¹ >Y¸EX¸/¹>Y¹ô0133!a.üþÖþ''ao¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Yº9º 9º9º9013373#467##'##a=p(*o<**r"r++þÛoo%þ@ N"rþØ(r!O þÀaÛ[¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸ /¹ >Y¸EX¸/¹>Yº 9º90133.53#'##a0ä=*/ä>+þ¡f&N&+þ^h&K&þÑ7ÿô %5¸EX¸ /¹ >Y¸EX¸/¹>Y¹ô¸ ¹ô01".54>32'2>54.#"3U>"">U33U=##=U3)D00D)Td0D &Fc>>cE%%Ec>>cF&) ;T54T;xj5T; aÅ 9¸EX¸/¹ >Y¸EX¸ /¹ >Y» +¸¹ô0132+#72654&+a›^kk^m.–SLOTdAQNJÖú6=>0á7ÿr 2K¸EX¸"/¹" >Y¸EX¸/¹>Y»/+¸¹ô¸"¹ô¸¸,Ð0132>54.#"#"&'.54>323267g0D*)D00D)Td¡ &G_.L6">U33U=#8M.J3 5UcE%%Ec>:_F)/,aÈT¸EX¸ /¹ >Y¸EX¸ /¹ >Y¸EX¸/¹>Y» +¸ ¹ôº 9013254&+'##32j–MIj”r.¢*D0J@–l9.þ%ää!5&=H ç.ÿô  1I¸EX¸/¹ >Y¸EX¸/¹>Y¹ôº9¸¹!ôº(901"&'732654./.54>32.#"í?]#S2>F$F.",<$5PB)6A4.G/ /B +!! '6-    )0"$0*'( ,3&¨3¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô¸Ð01#5!##̯‹®.Ù''þ'_ÿôÚ3¸EX¸/¹ >Y¸EX¸/¹>Y¹ ô¸¸Ð01".5332>53%E4 .'55(+ 4D 0Q=:þË3C((C35þÆ=Q0  7¸EX¸/¹ >Y¸EX¸ /¹ >Yº 9¸¸ Ð0133>73#1cb.´1þÞ/O..O/"þ{!S¸EX¸/¹ >Y¸EX¸ /¹ >Y¸к9¸¸ ик9º 90133>733>73#.'##/C    U,T    C,|1ca2þÛ*S**S*%þÛ*S**S*%þR77þ®“o¸EX¸/¹ >Y¸EX¸ /¹ >Y¸EX¸/¹>Y¸EX¸/¹>Yº9º9º  9º901'33>?3#'.'##·š1Y   W0š¦2^  ]0 ÷!!úþú—''—~7¸EX¸/¹ >Y¸EX¸/¹>Yº9¸¸ Ð01733>?3#©¦0QP0§.Í3š55šþÍÍ2¨ E¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸Ð¸/¸¹ô¸и/017!5!!!2:þáWþÇ=þŠÀ&þ@&ÿÿ»Þ&Ã"áÿŠÿÿ»Þ&Ã%áÿŠÿÿ»Ñ&Ã(áÿŠÿÿ»Ì&Ã*áÿŠÿÿ»¨&Ã6áÿŠÿÿ»•&Ã,áÿŠÿÿ»Ñ&Ã1áÿŠÿÿ»ñ&Ã:áÿŠÿÿ»Ó&Ã>áÿŠÿÿÿ>»&Ã3áüêÿÿ»é&Ã8áÿŠÿÿ»þ&ÃwáÿŠÿÿ»þ&ÃyáÿŠÿÿ» &Ã{áÿŠÿÿ»'&Ã}áÿŠÿÿÿ>»Ñ&Ã'(áÿŠ3áüêÿÿ»'&ÃáÿŠÿÿ»'&ÃáÿŠÿÿ»5&ÃáÿŠÿÿ»(&Ã…áÿŠÿÿÿ>»Ñ&Ã'1áÿŠ3áüêÿ3ß $W¸EX¸/¹ >Y¸EX¸/¹>Yº! +º9º9¸/¹ ô¸¸иÐ01%'.'##"&5467#'##33267A""] %#1,=Ú>.Â/ * Í]/N--O.]þ~ (*&B¨¨þAˆk¸EX¸/¹ >Y¸EX¸ /¹ >Yº 9º 9¸ йô¸¹ ô¸¹ôº 9¸¹ô01%#!5##!#3#]4;ÐþÕº_/09óÊÊÆ*Z-d &¡¡&¸%×ÿÿˆÞ&ó%ÙÿŠÿÿˆ•&ó,ÙÿŠ%æ+g¸EX¸$/¹$ >Y¸EX¸/¹>Yº +º+¸¹ô¸$¹ôº9¸ ¸ и ¸"и"/01%2>54&+3#532654&++5#5732 '@.ZTl‘‘]THMKaË6Eq_¤MM™Te-," , 63[bþ201+Í <5LJ„];C': ÿÿaÿaÕ&Ä+ýÿÿ7ÿ%È &ÅWÿÿ7ÿôÈÞ&Å% ÿŠÿÿ7ÿôÈÑ&Å( ÿŠÿÿ7ÿôÈÓ&Å> ÿŠÿÿ7ÿôÈ«&Å4 ÿŠÿÿaåÓ&Æ>ÿŠÿÿaÿ>å&Æ3üêÿÿaÿaå&Æ+ýÿÿ%ö›ÿÿažÞ&Ç"ÿŠÿÿažÞ&Ç%ÿŠÿÿažÑ&Ç(ÿŠÿÿažÓ&Ç>ÿŠÿÿaž¨&Ç6ÿŠÿÿaž•&Ç,ÿŠÿÿažÑ&Ç1ÿŠÿÿaž«&Ç4ÿŠÿÿaÿ>ž&Ç3üêÿÿažé&Ç8ÿŠÿÿ`ªÌ&Ç*ÿŠÿÿaÐþ&ÇwÿŠÿÿLžþ&ÇyÿŠÿÿaº &Ç{ÿŠÿÿaž'&Ç}ÿŠÿÿaÿ>žÑ&Ç'(ÿŠ3üêaÿ3« ]¸EX¸/¹ >Y¸EX¸/¹>Yº+¸¹ ôº9¸/¹ ô¸¹ô¸¸Ð01"&5467#!!3#!#327j#1+þ3þûÝÝ"  %Í(*&B&¸%×&' ÿÿaž;&ljÿŠÿÿ7ÿôÎÞ&É%.ÿŠÿÿ7ÿôÎÑ&É(.ÿŠÿÿ7ÿôÎÑ&É1.ÿŠÿÿ7ÿôΫ&É4.ÿŠÿÿ7ÿ%Î &ÉT(ÿÿ7ÿôÎÓ&É>.ÿŠÿÿ7ÿôΕ&É,.ÿŠÿÿ7ÿôÓÌ&É*.ÿŠ7ÿôo2Y¸EX¸ /¹ >Y¸EX¸/¹>Y»+¸ ¹%ô¸¹+ôº2 9}¸2/¹0ô01%#".54>32&54632.#".#"32675#53ÎU76Y?#$B[8- 0#   :-^kg^%=€¬+ %Fc?=cF% "' !"xji{™%ÿÿaáÑ&Ê(!ÿŠÿÿaÿ>á&Ê3!üêÿÿaÿá&Ê/!üà$@o¸EX¸/¹ >Y¸EX¸ /¹ >Y¸¸ܸ ܸи ¸ܸ¸и ¸и¹ ô¸¸и¸и¸Ð01!!7##5!##5753!533ÇþÜ$yK.þÜ.QQ.$.K\\þýýbbbbÿÿ¡Þ&Ë"xŠÿÿOèÞ&Ë%xŠÿÿÿñÿÑ&Ë(xŠÿÿÿÓÌ&Ë*xŠÿÿÿòþ¨&Ë6xŠÿÿÿüô•&Ë,xŠÿÿP «&Ë4xŠÿÿÿñÿÓ&Ë>xŠÿÿA¾é&Ë8xŠÿÿRÿ>ž&Ë3xüê,ÿ3Á5¸EX¸/¹ >Y¸EX¸/¹>Yº+¸¸ Ð01"&5467#3327€#1$ ."  %Í(*)8þ6! ÿÿÿðÑ&Ë1xŠÿÿ)ÿô®Ñ&Ì('ÿŠÿÿaÿ%á&ÍT ÿÿaÿ>á&Í3 üêÿÿaÿaá&Í+ ýÿÿU‹Þ&Î%~Šÿÿa‹^&Î?Gÿlÿÿaÿ%‹&ÎTÿÿa‹&ÎwÛìÿÿaÿ>‹&Î3üêÿÿÿ>‹•&Î&,~Š3üêÿÿaÿa‹&Î+ý ]¸EX¸/¹ >Y¸EX¸/¹>Yº +º+¸¹ôº9¸¸и¸ и Ð01%!5'737þÖNa.¯''¼*5þøS\ªÿÿaÞ&Ï%8ÿŠÿÿa«&Ï48ÿŠÿÿaÿ>&Ï38üêÿÿaÛÞ&Ð%&ÿŠÿÿaÛÞ&Ð"&ÿŠÿÿaÛÓ&Ð>&ÿŠÿÿaÛÌ&Ð*&ÿŠÿÿaÿ%Û&ÐT&ÿÿaÛ«&Ð4&ÿŠÿÿaÿ>Û&Ð3&üêÿÿaÿaÛ&Ð+&ýÿÿ7ÿôÞ&Ñ"ÿŠÿÿ7ÿôÞ&Ñ%ÿŠÿÿ7ÿôÑ&Ñ(ÿŠÿÿ7ÿôÌ&Ñ*ÿŠÿÿ7ÿô¨&Ñ6ÿŠÿÿ7ÿô•&Ñ,ÿŠÿÿ7ÿôï&Ñ<ÿŠÿÿ7ÿôÓ&Ñ>ÿŠÿÿ7ÿ> &Ñ3üêÿÿ7ÿôé&Ñ8ÿŠÿÿ7ÿôþ&ÑwÿŠÿÿ7ÿôþ&ÑyÿŠÿÿ7ÿô &Ñ{ÿŠÿÿ7ÿô'&Ñ}ÿŠÿÿ7ÿ>Ñ&Ñ'(ÿŠ3üê.ÿê /…¸EX¸+/¹+ >Y¸EX¸/¹>Yº+9¹ôº +9º +9¸+¹ ôº+9º+9º +9º#+9º-+901732>54/.#"#"&''7.54>327 2M*D0%@'*D1%E#=U3/N<@">U3]><Q5 cF&FK#[9>cE%Y¸EX¸/¹>Y¸¹ô¸ к9¸/¹ ô¸¹ô¸Ð01!"&54>3!#3#3%#"3A†„!BdBTóÊÊýþÕ0si6S9ˆw;_C$&¸%×&&¶ti1P97ÿô —1G¸EX¸*/¹* >Y¸EX¸ /¹ >Y¹ô¸*¹ ôº *9¸¸,Ð01%2>54.#"#".54>32>54')D00D)Td0D 6++1#=U33U>"">U380., ;T54T;xj5T; z,8 "pK>cF&&Fc>>cE%/ ÿÿ7ÿô Þ&T%ÿŠÿÿ7ÿô Þ&T"ÿŠÿÿ7ÿô é&T8ÿŠÿÿ7ÿô Ì&T*ÿŠÿÿ7ÿ> —&T3üê7ÿ3 #5I¸EX¸/¹ >Y¸EX¸/¹>Yº+¸¸и¹$ô¸¹.ô01"&5467".54>32327'2>54.#">#17Y>!">U33U=#UN+(  %0)D00D)Td0DÍ(*:&Fc>>cE%%Ec>f€#> ê ;T54T;xj5T; ÿÿ7ÿôÑ&Ñ1ÿŠÿÿ7ÿô;&щÿŠÿÿaÈÞ&Ô%ÿŠÿÿaÈ«&Ô4ÿŠÿÿaÈÓ&Ô>ÿŠÿÿaÿ%È&ÔTÿÿaÿ>È&Ô3üêÿÿaÿ>È•&Ô',ÿŠ3üêÿÿaÿaÈ&Ô+ýÿÿ.ÿô Þ&Õ%ôÿŠÿÿ.ÿô Ñ&Õ(ôÿŠÿÿ.ÿô Ó&Õ>ôÿŠÿÿ.ÿ%  &ÕWîÿÿ.ÿ%  &ÕTüÿÿ.ÿô «&Õ4ôÿŠÿÿ.ÿ>  &Õ3üüêÿÿ.ÿô_ &ÕÕ¿bÿô  +]¸EX¸/¹ >Y¸EX¸/¹>Y¹ôº9¸¸ܸ¹ô¸¸и/º"901"&'732654./7.#"#4>32r-O4F47'E6;0IT.6L-AR2E*(9 "5:-%,RWþÅF.J3A2€'13'ÿÿ¨Ó&Ö>âÿŠÿÿÿ%¨&ÖWÛÿÿÿ%¨&ÖTâÿÿÿ>¨&Ö3âüêÿÿÿa¨&Ö+âý¨Q¸EX¸/¹ >Y¸EX¸/¹>Yº9¸¸ ии¸и¹ ô¸Ð013##5#5735#5!ú~~.U*¯‹Ù¾!úú¾''ÿÿ_ÿôÚÞ&×"ÿŠÿÿ_ÿôÚÞ&×%ÿŠÿÿ_ÿôÚÑ&×(ÿŠÿÿ_ÿôÚÌ&×*ÿŠÿÿ_ÿôÚ¨&×6ÿŠÿÿ_ÿôÚ•&×,ÿŠÿÿ_ÿôÚÑ&×1ÿŠÿÿ_ÿôÚñ&×:ÿŠÿÿ_ÿôÚï&×<ÿŠÿÿ_ÿôÚÓ&×>ÿŠÿÿ_ÿôÚ&×sÿŠÿÿ_ÿôÚ;&×lÿŠÿÿ_ÿôÚ9&×uÿŠÿÿ_ÿôÚ;&×oÿŠÿÿ_ÿ>Ú&×3üêÿÿ_ÿôÚé&×8ÿŠ_ÿ3Ú-;¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸¸и¸"Ð01"&54>7".5332>53327<#1  *J6.'55(+!+(, %Í(*  1Q<:þË3C((C35þÆ3D. > _ÿôB¡(;¸EX¸/¹ >Y¸EX¸/¹>Y¸¸!иܸ¹ô01#".5332>53>54&'/ % 4D%%E4 .'55( -1¡"(þà=Q00Q=:þË3C((C35.% ÿÿ_ÿôBÞ&„%ÿŠÿÿ_ÿôBÞ&„"ÿŠÿÿ_ÿôBé&„8ÿŠÿÿ_ÿôBÌ&„*ÿŠÿÿ_ÿ>B¡&„3üêÿÿ{Þ&Ù"LÿŠÿÿ{Þ&Ù%LÿŠÿÿ{Ñ&Ù(LÿŠÿÿ{¨&Ù6LÿŠÿÿ~Þ&Û"ÂÿŠÿÿ~Þ&Û%ÂÿŠÿÿ~Ñ&Û(ÂÿŠÿÿ~¨&Û6ÂÿŠÿÿ~«&Û4ÂÿŠÿÿÿ>~&Û3Àüêÿÿ~é&Û8ÂÿŠÿÿ~Ì&Û*ÂÿŠÿÿ2¨Þ&Ü%øÿŠÿÿ2¨Ó&Ü>øÿŠÿÿ2¨«&Ü4øÿŠÿÿ2ÿ>¨&Ü3þüêÿÿ2ÿa¨&Ü+þý%öW¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸¹ôº 9¸ /¸ и ¸и ¸Ð0172654.+3#2+5#575óne3P7S‘‘U@a@ @`@„MM%th1P9 »!ÚÛ#B_;;_C$ÿàaÅ 9¸EX¸/¹ >Y¸EX¸ /¹ >Y»  +»+01332+#72654&+a.m]lk^m.’SOPRdZBPMK|¡6=>.ß>ÿô 'M¸EX¸/¹ >Y¸EX¸/¹>Yº!9¸!/¹ô¸¹ô¸¹$ô01732>7%>32#".5465!.#"k/>%&@0þ¨T64T; ">T33Q:”^W*Få.J55J.ç'&Ec==cG&'Ga9eu aÿôï &a¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸¹ôº9¸¹ô¸¸и/¸¸и/01"&'732>54.#"#3>32e# ")8"*)% ..U.)G3%3 ( 6YB?V3þpD1?dGLhAaÿr€7¸EX¸/¹ >Y¸EX¸/¹>Y» +¸¸Ð013#"&'732653a..±! (.þŽ(;.ûýþŒaÿrÛ S¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¸ к9¸¸к 901"&'73265#'##33.53}  "ä>+0ä=*-Ž%70^h&K&þÑþ¡f&N&+ýöBBÿÿ»ÃÿÿaÕÄa•/¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô01!!#a4þú.'þ'Ç 5¸EX¸/¹ >Y¸EX¸/¹>Y¹ôº 90173!%'#¾0¾þTzd>@cæþ&««þÿÿÿažÇÿÿ2¨ÜÿÿaáÊ7ÿô +C¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¹ô¸¹"ô013#".54>32'2>54.#"¼ÆÆc3U>"">U33U=##=U3*D00D**D11D"%þ÷&Fc>>cE%%Ec>>cF&( ;U55T;;T55U; ÿÿaËÿÿaáÍŸ 3¸EX¸/¹ >Y¸EX¸ /¹ >Y¸к 9013#.'##¸3´/dd.þ#/O//O/þÝÿÿaÏÿÿaÛÐ/ C¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¹ô¸¹ ô017!!3#!!/aþŸBßß:Qþ¯&&"%&ÿÿ7ÿô ÑaÛ3¸EX¸/¹ >Y¸EX¸/¹>Y¸и¹ô01!#!#az.þâ.þÙþ'ÿÿaÅÒ/¨ E¸EX¸/¹ >Y¸EX¸ /¹ >Y¹ô¸Ð¸/¸¹ô¸и/01?'5!!!!/ÈÃ[þÞ¹½?þ‡êä$×ß&ÿÿ¨Öÿÿ~Û0ÿîA%G»+»+¸¸ и¸и¸ܸ¸и¸#и¸$Ü01%>54&'##5.546753N.I3j\+\ii\+pƒ"?Z8+8Z?"‚q+^*;$JUUJHYgg\-H3LL3H-\gMÿÿ“ÚF K¸EX¸ /¹ >Y¸EX¸/¹>Y»+¸¸и¸и ¸иÐ01#5.=336= ka,ak, , `YÆÆY`}”þê”}, 1Y¸EX¸ /¹ >Y¸EX¸1/¹1>Y¹ô¸и1¸и¸и/¸ ¹%ô¸¸/и//01735.54>323#5>54.#"#,w' Y¸EX¸/¹>Y¸ к 9º 9¸ ¹ô¸ ¸Ð01.'#3#'###"¿HÂ0=Ú>.ˆ.*/N--O.]3þ¨¨fþfšaÑO|¸/¸EX¸/¹ >Y¸EX¸/¹>Y¸ ик 9¸ /¹ô¸¸Ð013#3!53#5!#£..ý¾.$..þÜ.šþfÜÜþüü,È 5_|¸/¸EX¸/¹ >Y¸EX¸5/¹5>Y¸ии5¹ô¸ии/¸¹)ô¸¸3и3/013#%35.54>323#5>54.#"#š..ý’w' Y¸EX¸ /¹ >Y¸¹ôº 9¸¹ô¸ ¹ô01!!32+72654&+aGþçw-I5f^©žQQTQm%» 4%NJ$7<70ÚÿÿaÕÄÿÿa•£!ÿT !O}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸ и¹ ô¸ ¸ и¸Ð01!#5!#'53>7>7!ß p&þw'   Ú$?=>$JS³þM¹¬¬¹+C3'DBG+þ'ÿÿažÇ ˆ 4…¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸ ¸ии¸к 9¸¹ô¸¸и/¸¸"и¸(и¸.к4"901!#'##5##'.#*'>3235337>32&"#"ˆ2žZ+Zž2­@    AX+XA   @üüüü„+&ˆÝ݈&+„/ÿô³ /M¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¹ô¸¹ôº(901"&'732>54&+532654&#"'>32ô?\*'L75([Q9)UJF5(HW2#=-/*3D4F %' $ +96"22-3 ##0+> A7$9(aÛE¸EX¸ /¹ >Y¸EX¸ /¹ >Y¸и ¸к9º 901!#467##3373Û*=ä0+>ä//&K&hþ¢þÕ&N&f_ÿÿaÛ´&Æ2#ÿnaå W¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¸и¸и/¸¹ôº901!#'##337>32&#"å4³o..nR  PüüÝŠ%,ƒÿôºA¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸¸и/¸¹ô01"&'732>7>7!##,   .® " + 9/U¡YþÚM•K8H)ÿÿaÏÿÿaáÊÿÿ7ÿô ÑÿÿaÛ°ÿÿaÅÒÿÿ7ÿôÈ Åÿÿ¨ÖÿôŸG¸EX¸ /¹ >Y¸EX¸/¹>Y¹ôº 9º 9¸ ¸Ð01"'7326?3373k % ¾0y)$p.º8 )!þúZZþQ,10ÿô<  U¸EX¸/¹ >Y¸EX¸/¹>Y¸ܹ ô¸Ð¸¸ܹô¸и¸и¸Ð01%>54&'##5.546753Jacca(acca(ss(ss(jQGHPPHGQUaYXbSSbXYaMÿÿ“ÚaÿT =}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸Ð¸¸ Ð01%#5!3!3&þ}..'¹¬þ'Ùþ'G§7¸EX¸ /¹ >Y¸EX¸/¹>Y»+¸ ¸Ð01%#".=3326753#y5#.I3-SJ!2..í&=,}}D5ìþa† C¸EX¸/¹ >Y¸EX¸ /¹ >Y¹ô¸¸и¸и¸Ð0133333!a-Ï-Ï-ýÛþ'Ùþ'ÙþaÿTÈE}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸ ии¸ иÐ01%#5!33333È&ýÅ-Ï-Ï-'¹¬þ'Ùþ'Ùþ'7 C¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸¹ô¸ ¹ ô01#5332+72654&+Ö¹çj[nj^™QQRR`Ù'ÚBKNK'5<81ÚaLI¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸¸Ð¸ ¸и ¹ô013#332+72654&+..þC.a[nj^†QRRRWþÚBKNK'5<81ÚaÍ 9¸EX¸/¹ >Y¸EX¸ /¹ >Y»+¸ ¹ ô01332+72654&+a.u[nj^¤šQRRRkÚBKNK'5<81Ú&ÿô¶ I¸EX¸/¹ >Y¸EX¸ /¹ >Y¹ôº 9¸/¹ô¸¹ô01>32#"&'73267#53.#"3"J62S;!"Ë"%Dc=BeE#-#qo%[faÿôã .e¸EX¸,/¹, >Y¸EX¸/¹ >Y¸EX¸*/¹*>Y¸EX¸#/¹#>Y»(+¸#¹ô¸¹ ô01%2>54.#">32#".'##3ü)D00D))D00D¼&

"">T32S=#‡.. ;T55T::T55T; 6V< %Ec>>cF&%Db=üÜ‘T¸EX¸/¹ >Y¸EX¸ /¹ >Y¸EX¸ /¹ >Y» +¸¹ôº 901#";7#5##7.54>3cjIL•j..y™5ŸY¸EX¸ /¹ >Y»+¸ ¹ô¸ ¸!и!/¸$¹#ô¸&Ð01>32#"&'732>54&#"##5!#é2!+H4*5  %OJ /.ž–Ê*'<*-<$& ."@:þúÙ''ÿÿa•Â&£% ÿn7ÿôÈ M¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ôº 9¸/¹ô¸¹ô01%#".54>32.#"3#3267È"N64W>"#?X52J:)QdøùdX+A>$&%Ed@?cD$&c^%jvÿÿ.ÿô  ÕÿÿaËÿÿÿòþ¨&Ë6xŠÜ§ =¸EX¸/¹ >Y¸EX¸/¹>Yº+¸¸ и¸Ð01"&546323"&546323#8pf..^^þÿÿ)ÿôDÌÿôÅ*S¸EX¸(/¹( >Y¸EX¸/¹>Y»*+¸¹ ô¸и¸и/¸(¹ô01%2654&+72+##"&'732>7>73ôQRRSLV[ni^†š "   ì'5<81ÚÿBKNKÚM•K8H)+ 9/U¡YÚaôc¸EX¸/¹ >Y¸EX¸/¹>Y¸йôº9¸/¸и/¸¹ô¸¸и¸и/01%2654&+72+5!#3!53#QQRRMW[nj^†þé...'5<81ÚÿBKNKüüÜÜÚ E¸EX¸/¹ >Y¸EX¸/¹>Y» +¸¸и¹ô¸Ð01>32#54&#"##5!#é2!Xc.KF /.ž–Ê*FW––E4þúÙ''ÿÿaåÂ&È%ÿnÿÿaÛÂ&Æ"#ÿnÿÿÿôŸ´&Ñ2ÒÿnaÿTÚ 7}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¸и¸ Ð01!##'#3!3Ú¤$¨..¬¬þ'Ùâ"H¸EX¸/¹>Yº+» +¸¹ô¸¸ܸ¸и¸Ð01%2654&+72+#53533#QRRSHR[ni^‚||.ÍÍ&5<80ÙþBJNJ“"mm"o7ÿô #Q¸EX¸/¹ >Y¸EX¸/¹>Yº9¸/¸¹ô¸¹ ô¸¹ ô01732>7'.#"72#".54>dfS)D1cNNdº3U=##=U33U>"">Uýkv:T5%^dd^ê$Dc@?dE%%Ed?@cD$Æ E¸EX¸/¹ >Y¸EX¸/¹>Y¸¸Ð¸/º9¸¹ô0133>?>32&#"#1d @&#    …8þÛ.M/*)(Í7-* þ`a«5|¸/¸EX¸/¹ >Y¸EX¸/¹>Y¸¹ô01!#!7þú. «Òþ'«%ª U¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¹ôº 9¸/¸ܸ¸и¸ и /013##5#575!¤££.QQ4ÙÄ"óóë' ÿTœ 9‘}¸/¸EX¸/¹ >Y¸EX¸ /¹ >Y»! +¸ ¸ ийô¸ ¸к! 9¸¹ô¸¸#и#/¸!¸&и¸,и¸2к8&901%#5#'##5##'.#*'>3235337>32&"#"œ&žZ+Zž2­@    AX+XA   @”'¹¬üüüü„+&ˆÝ݈&+„í/ÿT³ 2a}¸ /¸EX¸*/¹* >Y¸EX¸ /¹ >Y¸и ¹ôº* 9¸/¹ô¸*¹#ôº2901#'.'732>54&+532654&#"'>32<3D.@$%6P&'L75([Q9)UJF5(HW2#=-/*A7!7(¡¡%# $ +96"22-3 ##0+> aÿTû c}¸/¸EX¸/¹ >Y¸EX¸ /¹ >Y» +¸ ¸йô¸¸ и /¸¹ôº 901%#5#'##337>32&#"û'³o..nR  P§'¹¬üüÝŠ%,ƒíY i¸EX¸/¹ >Y¸EX¸/¹ >Y¸EX¸/¹>Y¸EX¸/¹>Y» +¸¹ô¹ ô¸¸Ð01!#'###5337>32&#"Y4²o.¹çmR  PüüÙ'ÝŠ%,„aÿT#Q}¸/¸EX¸ /¹ >Y¸EX¸ /¹ >Y¸йôº 9¸/¹ ô¸ ¸Ð01%#5#5!#3!53#&DþÜ..$.'¹¬üüÜÜþ'7ÿTÈ C}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¸и¹ô¸¹ô01%#'.54>32.#"3267È L3%-I4#@X60J9&[feX+A>#% ¢+D]9=cF%&yijzÿÿ~Û~U¸EX¸ /¹ >Y¸EX¸/¹>Yº 9¸ ¸и ¸ܸи ¸к90173##5#57333>?3ä`m.mU š0QP0ä!ÃÚ55šÿT©e}¸/¸EX¸/¹ >Y¸EX¸/¹>Y¸йôº 9¸¸к9º 9º 901%#5#'.'##'33>?3©&^  ]0¦š1Y   W0š'¹¬—''— ÷!!úßGÿTèG}¸/¸EX¸/¹ >Y¸EX¸/¹>Y» +¸¹ô¸¸Ð01%#5#5#".=3326753è&D5#.I3-SJ!2.'¹¬í&=,}}D5ìþ'aÁ7¸EX¸/¹ >Y¸EX¸/¹>Y»+¸¸ Ð01>32#54&#"#34#.J3-SJ!2../%=,ššD5þ÷ÿÿaËÿÿ ˆµ&Ä2Hÿoÿÿ»µ&Ã2áÿoÿÿˆóÿÿažÐ&Ç2ÿŠÿÿ>ÿô ÿÿaÛy&Æ,#ÿnÿÿ7ÿô&Ñ6ÿoÿÿ7ÿô ðÿÿÿôŸy&Ñ,ÒÿnÿÿÿôŸÓ&Ñ<Òÿn$ÿôå I¸EX¸4/¹4 >Y¸EX¸"/¹">Y¹ôºC4"9º?C"9º"C9º?9º "49º4"9¸4¹ôº, 9º< 9ºF?90173267.'7>54&#".'#".54>7.54>32>73P!- =-Q#2F&!#*B>!K/";,(+/.$-Q++)/"7…($[08ì5 !)1þ= #%4 +$ ?+!:*)%!/X!"S06^'8ÿô¦ 5¸EX¸/¹ >Y¸EX¸/¹>Y¹ ô¸¹ô01"&54632'2654&#"ïX__XX__X>LL>>LL }~~}&wprssrpw9Ì3¸EX¸/¹ >Y¸EX¸/¹>Y¸¸ܹô01#5>73# g$6$,À þ&ˆ =¸EX¸/¹ >Y¸EX¸/¹>Y¹ô¸Ð¸/¸¹ô017>54&#"'>32>;!*EiF#;?'D"O3MW%D_:3´þ¢>dSF!0?&$)OB&MR]6'ÿô€ /M¸EX¸/¹ >Y¸EX¸/¹>Y» +¸¹ô¸¹ôº& 901"&'7326544>54&#"'>32ÏDXJ;9J[k1C*>3&DL3":+>-/#0A .'<14@#'+2$!/2=!-!6&#© W¸EX¸/¹ >Y¸EX¸ /¹ >Yº  9¸ /¹ô¸Ðº 9¸ ¸и¸Ð01%5467###5!533* ¢PT+þù+T»¯6Ë$——Oþ»#ÿô(M¸EX¸/¹ >Y¸EX¸/¹>Y¹ ôº9¸/¸¹ô¸¹ô01".'732>54&#"'7!#>32Õ#6*"  %.2&J=!0 ä0$@0 3C    "2;Eô&³ (=**@+Cÿô¦ +M¸EX¸(/¹( >Y¸EX¸ /¹ >Y»+¸ ¹ô¸(¹ôº (901%2>54&#"&#">32#"&54>32+;BK#I¿(="=.L*MU,;!Yh#Y¸EX¸/¹>Y¸¹ô¸ Ð013>7!5!#˜)<+þàX3B'/Lpi6&Y¸EX¸/¹>Y»&<+º &<9º<&9¸¹,ô¸¹4ô01".54>75.54>32>54&#"2654.'ó(D1!)4*8 KR $/A$(=90=*6 =H0>"*>&5 %4,$ :(/"M;'!  (1%; *;3*'ÿ8,) ?*(4ÿô“ ,M¸EX¸!/¹! >Y¸EX¸)/¹)>Y»+¸!¹ô¸)¹ôº)!9017267.#"32>7#"&54>32#"&'ÛJ"GF*:A3"î!)P_!.7E«:\D&RO$;+}xPoEWÿô¬-¸EX¸/¹ >Y¸EX¸/¹>Y¸ ܸÜ0153#"&54632k.!½CCþö¿W¬ 1¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¸ܸÜ0173#"&54632k!.C þöC±/ÿôV &*¸EX¸/¹>Y» +¸¸!ܸÜ017&>54&#"'>32"&54632£%!16F3I1EL"'³,"!(#56%F3!/$ '¿=ÿàd '*¸EX¸"/¹" >Y»+¸"¸ܸ Ü01"&54>'33267"&54632ÎEL"&)%!26!=H' F4!/# ',"!(#5%ÑÿÿS~†V€¡ÿÿS~V&€¡€ÿ¡ÿÿ:¡`‚¡ÿÿ:~¢]ƒ¡ÿÿ:.`&‚¡‚ÿ¡ÿÿ:~/]&ƒ¡ƒÿ¡ÿÿ(û"Œ(þq" »+01!!(Iþ·"$(þ‚" »+01!!(Zý¦"$Xÿƒ÷o º+01.5467Ü>FF><<<<}R·mm·RM¹``¹M ÿƒ¿o º +01>54&'7 <<<<>FF>mM¹``¹MR·mm·RbÿšX»+»+013#3#b }} Xý|ÿšµX»+»+013#53#}}  I„ýB#ÿšX43»1+»+» +º( 9¸¸3Ð01".54654.#52>54&54>;#";#à)"")".."f * 'E& 'E( * )+#=%,2  4*%=#+)ÿšôX3+»2+»+»$%+º %$90132654&54675.54654&+5323"+..")"")"I)+#=%*4  2,%=#+) * (E' &E' * ÿÿ(ŠB(D–ÿÿ^–ÖE–ÿÿ/–7(F–ÿÿ(Š4(G–ÿÿ.–=H–ÿÿ(Š9I–ÿÿ2Š=(J–ÿÿ2–7K–ÿÿ1Š6(L–ÿÿ)Š4(M–ÿÿBN²aN–ÿÿ)N™aO–ÿÿ,ŽsÙP–ÿÿ"+}ÙQ–ÿÿ(ÿIBçDÿUÿÿ^ÿUÖÛEÿUÿÿ/ÿU7çFÿUÿÿ(ÿI4çGÿUÿÿ.ÿU=ÛHÿUÿÿ(ÿI9ÛIÿUÿÿ2ÿI=çJÿUÿÿ2ÿU7ÛKÿUÿÿ1ÿI6çLÿUÿÿ)ÿI4çMÿUÿÿBÿ ² NÿUÿÿ)ÿ ™ OÿUÿÿ,ÿMsÿ˜PÿUÿÿ"þê}ÿ˜QÿU(ÿôB’ $¸/¸EX¸/¹>Y¸ ܸ¸Ü01"&54632'2654&#"µBKKBBKKB/77//77 kedjjdek![TTYYTT[^Ö† ¸/¸EX¸/¹>Y¸¸Ü01#5>73#°R)!&Dþz/7’,¸/¸EX¸/¹>Y¸ܸи/¸¸Ü017>54&#"'>323#82I//'/A%6C,?%Àÿ.H:1+2$+=>8:?%"(ÿô4’*<¸/¸EX¸/¹>Y» +¸¸ܸ¸ܺ! 901"&'732654춮&#"'>32±.G9"%6J@;?-&/;&1E+  $0 -#+(&*2" )$61%1 !+.=†N¸/¸EX¸ /¹ >Yº +º 9¸¸и ¸и¸ и /¸¸Ð01757###5#5733ß8Iß:$±±$:’WhSl rrÿô(ÿô9†"0¸/¸EX¸/¹>Yº +¸¸ܸ¸Ü01"&'732654&#"'73#>32µ3D6&(54+'Ǧ #."$0 -#9-/7 ¹$w "1!2#2ÿô=’ *0¸'/¸EX¸/¹>Yº+¸¸Ü¸'¸Ü0172654&#".#">32#"&54>32Â&/,-07„!*#5<>!-@O-; &7)(6CHF )A.G70"d\Y¸¸ܸ и /013>7#5!#‹- Ø%0(6]UR*"/XX\41ÿô6’*9D¸/¸EX¸/¹>Yº 5+º 59º5 9¸¸%ܸ¸+Ü01".54675.54632'654&#"2>54.'³0". A02C  #'#04/ ,;""+A2 ''9' -87..#)á(1$&#'Ï  $;1)ÿô4’ )0¸/¸EX¸&/¹&>Yº+¸¸ܸ&¸Ü017267.#"32>7#"&54>32#"&'¨/6/&/--!*#0;<>!-@O-;'³CH7)(6ˆ )A.-G70"d\54&'7)***++*8;}BB}::~QR~:,ÿøsC ¸EX¸/¹>Y¹ô01"&54632O"ÿ•}C+¸EX¸/¹>Y¸EX¸/¹>Y¹ ô01>5#"&54632"+#Q (%?ÿÿ(BŸD ÿÿ^ Ö“E ÿÿ/ 7ŸF ÿÿ(4ŸG ÿÿ. =“H ÿÿ(9“I ÿÿ2=ŸJ ÿÿ2 7“K ÿÿ16ŸL ÿÿ)4ŸM ÿÿBŲØN ÿÿ)Å™ØO ÿÿ,sPP ÿÿ"¢}PQ ÿÿ*ŽÛ}ÿÿ%Ž5ÛŸÿÿ!ŽEÛ‹–[F +¸ /¸/¸/º 9º  9¸ ¸ Ü01'.'###3#ø    Ÿª1&™)—(EK'G&'G&K °þP=–dF!7¸/¸/º9¸¸ܺ9¸¸ܸ¸Ü0132+72654&+2654&+={BP'&07YKƒp@7::LT?GEATF27!3 4-??ô(*'$Õ,3-+·"Ž^N¸ /¸/¸ ¸ܸ¸Ü01".54>32.#"3267Ü)D22E*';.#7'NE!3?Ž:S43S;2E+Yh!=–oF¸/¸/¸¸ ܸ¸Ü0132+72654&+=iedddjiSNOU?Fscdv eUUaþ=–7F #¸/¸ /º+¸¸ܸ ¸ Ü013#3#3#=ôÍ­­ÓúF!™!µ =–1F ¸ /¸/º+¸¸Ü013#3##=ôÍ­­'F!£!Ë"ŽcN##¸/¸ /º+¸ ¸ܸ¸Ü01".54>32.#"32675#53á*G23H,-:/#$:(PJ2d‡CŽ:S43S;!2E+Yh€ °=–kF ¸/¸/¸ /¸/º+013353#5##='á&&á'FººþPÕÕ=–dF ¸/¸/013#=''FþPŽøF¸ /¸/¸Ü01"&'732653…&7'''& +Ž"034þÈ.#=–pF 1¸ /¸/¸/¸/º 9º9º 9013373#'#='Ê-‹ž+ŒU'Féé¡þñò`’=–*F¸/¸/¸Ü0133#='ÆíFþp =–™F;¸/¸ /¸/¸/º 9º 9º9º90133?3#467##/##=3Y"!X2%#Z[#$Fõ^^õþP A^ùù^Aþó=–iF'¸/¸ /¸ /¸/º 9º90133.=3#'##=*¯1#(°2$FþÙVB üþP'V = ÿ"ŽN!¸ /¸/¸ܸ ¸Ü01".54>32'2654&#"Ø(C00C((D00D(BMMB 4&NŽ ;S43S9:R34S; !iXWf1F+Xi=–XF ¸/¸ /º +¸¸Ü0132+#72654&+=}IUVHV'v????OF7CB?µÕ-44&»!/’N ,+¸/¸/º)+¸¸ܸ¸ ܸ¸&Ð0132654&#"#"&'.54>323267INAAMMAANI9K$<+1C((C0*;#:'qXjjXVffþp6*#;O13R9:Q30P:$ =–[F)¸ /¸ /¸/º +¸¸ܺ 90132654&+'##32dR9;;9RËrY'BQ:1uw,//%þpÁÁ°5?3< ÄŽ@N/+¸/¸/¸ܺ9¸¸ܺ(901"&'732654./.54632.#"²0JB%07 B J8(?3!*1 B!LŽ$,&#0<(! "6D–HF¸/¸/¸ܸÐ01#5!##š‰7ˆ&%!!þq<ŽiF¸/¸/¸ ܸ¸Ð01".5332>53Ó7)& (*#)6Ž*D3þü*8##8*þú3D*–HF ¸/¸ /¸ /º 90133>?3#)N   N'Ž*Fõ(B''B(õþP–ðF =¸/¸ /º 9¸¸ ии ¸к9º 90133>?33>?3#.'##(5  B%C   5%a+L  J+F÷HE#F$÷÷$F##F$÷þP..þã –:F;¸/¸ /¸/¸/º9º 9º  9º901'33>?3#'.'##Œz*C   D(zƒ)H    H(vÐzzÒÞ€  €ÿþ–-F¸/¸/º9¸¸ Ð0133>?3#ƒ…)@    ?(„&Cƒ--ƒþý­–FF '¸/¸/¸ܸи/¸¸ܸи/01#5!3!öàöùþجy!þ‡ *ŽÛ$5¸/¸/º+¸¸ ܸ¸и¸ܺ901"&54674.#"'>32#'#'275‹+6bl<C':-504]J$Ž/,56 "  D9È' 1f ," :ŽJn L¸/¸/¸EX¸ /¹ >Yº 9¸¸и/º 9¸¸ܸ ¸Ü01"&'##3>32'2654&#"¾1%3B@'3,:-3/52Ž؆?VJ)@-!K@9G2²!ŽÛ¸ /¸/¸ ¸ܸ¸Ü01".54>32.#"3267·!7()6"-!0?>2'/Ž+>((>* K;32'53#'#'2675.#"®@I'3.%-+/%2ŽYT%;*9þ(%!³#/AKŽ-Û%1¸ /¸/º 9¸/¸¸ܸ¸ܸ ¸"Ü01".54>32#326774.#"¶ 7('4&1 æ>5-41 #,8Ž*>)&>++2 9G  ¾( <3–Éw+¸/¸ /¸/¸¸ܸ¸ ܸ и¸Ð01.#"3###5754632À JJ%..**O'@þá<08"ÿBÛ4@OX¸/¸EX¸/¹>YºH,+º5#+º,H9º 5#9¸¸и¸;ܸи¸AÜ017"&5475.54675.54>323##"&';22654&#"2654&+"&'¥=F.   + iF *  "C84(;& 11 #..+3?%#@ '5ÿ.** ,* (*#('.%&,+'%.ù,"!:–2n¸/¸/¸ /¸/¸¸Ü013>32#54&#"#:%9 9,&-1%n…F!C6ÌÅ+4ì.–nZ ¸/¸ /¸Ü¸Ü01"&546323#N"%%  IþÃÿêpZ¸/¸ /¸¸ܸ ¸ܸÜ01"&'732653"&54632  %& #qþ“51  :–8n 1¸ /¸/¸/¸/º 9º 9º 9013373#'#:%—-l},iD%nþ±´¾¢PR:Ž„n¸/¸/¸Ü01"&533:7j% Ž£þW:–îÛ"C¸!/¸/¸к!9¸¸ к 9¸!¸ии¸ܸÐ0133>32>32#54&#"#54&#"#:1 F8 5,%)+&)*%Ó/ ?%C6ÌÅ+4ìÅ+4ì:–2Û-¸/¸/¸¸к9¸¸ и¸Ü0133>32#54&#"#:7 9,&+2%Ó/ C6ÌÅ+4ì!ŽEÛ¸ /¸/¸ܸ ¸Ü01".54>32'2654&#"³6''66''61::10;;Ž+>'(>**>('>+!J<Y¸Ð¸/º9º9¸¸ܸ¸Ü0133>32#"&'#72654&#":3B@'34%ƒ,:-3/52Ó'VJ)@-32373#'275.#"2AI'3/%\+1/%2|=XO'>*þ8¤+¹#132.#"#:+  .'Ó8!#!+ÔŽüÛ/<¸/¸EX¸/¹>Y¸¸ܺ9¸¸ ܺ(901"&'732654.'.54>32.#"%?0 !% # &1! %<Ž"   *4ŽÒ0<¸/¸EX¸/¹>Y¸ܸ¸ ܸ¸ и¸ и¸Ü01"&=#5?33#327™1$23 ]] Ž8.¿]] Á% 9Ž1Ó>¸/¸EX¸/¹>Y¸¸ ܸ¸и¸и/º901"&=3326753#'#ž9,&2%7ŽC6ÌÅ#ëþÃ/ –%Ó &¸ /¸EX¸/¹>Yº 9¸Ð0133?3#'D!#D&x.Ó¾]]¾þÖÂÓF¸/¸EX¸/¹>Yº9¸и и¸к 9º90133?33?3#/##)46(83&\035/ÓÅWWÅÅWWÅþú[[º–ÓP¸/¸EX¸/¹>Y¸¸ и¸к 9º9º9º 901'33?3#/##we+1!.*dk+3%&3)<—J44Jš£P99P #Ó<¸/¸EX¸ /¹ >Y¸¸ܺ 9º 9¸ ¸Ð01"'7326?33>?36 ( „'J >&z$ ",#@¼0.¼þ¥(–Ó '¸/¸/¸ܸи/¸¸ܸи/01#533#¹¤Õ¹¿ð« þù –w¸/»+01.54632.#"#‡* N:-9.#048<%Z!&-=?$1*.@ Ø6¥À$¸EX¸/¹>Yº+¸¸Ü0173#3#i 3oo3 kkÀj6¥m º+013#6o3 mjÿªè”z » +017"&'573267Z+ ]y   è,3"%0#, þ!Ó %P¸/¸EX¸/¹>Yº9¸¸ܺ9º 9º9¸¸$Ð0132654&'7#"&546733>?3”      u'EE%™0.%1&&1&#¹''¹Œ-Œ )9¸/¸/º+º9¸/¸¸ܸ¸&ܸ¸)Ü017".54>32#326774.#"Yc 7('4&1 æ>5-41 #,8tqþ†*>)&>++2 9G  ¾( <3Ž-Œ )9¸/¸/º+º9¸/¸¸ܸ¸&ܸ¸)Ü017".54>32#326774.#"‡ch 7('4&1 æ>5-41 #,8qnþˆ*>)&>++2 9G  ¾( <3Ž)Û1¸/¸/º9¸/¸¸ ܸ¸ܸ¸Ü01".546736&#"'>32'267#'2 å56)0"CMO=,7Å,Ž,4 5E  UQNY :;0E%Ž5Û#P¸/¸EX¸/¹>Yº 9¸и/¸¸и/º9¸¸ܸ¸Ü01"&54>32373#'#'2675.#"®@I'3.-+/%2ŽYR%<*þÃ%"³#/AJ%5Û.P¸/¸EX¸/¹>Yº +¸¸ܺ 9º9¸¸и/¸¸'Ü01"&'7326=7#"&54>32373'2675.#"¬9103.AI'42+H9,/&26-2WI%<*&þ®;F¼¨"/9F:–_n ¸/¸/013#:%%nþ(,ŽsÅ º+º +01"&54632'"&54632OŽì(I¾h º+013#(––h(L4h »+01!!( þôh(L h »+01!!(âþh*¿¬»+» +01".54>32'2654&#"œ)  ))  )#--##--¿,,,, 1%&22&%1rÀ""6J¸EX¸/¹ >Y¸EX¸ /¹ >Y¸EX¸/¹ >Y»#+¸ ¹-ô01?.5467'7>327'#"'72>54.#"AAB= =CBAC= B2B¶2%%22%%2ŽC<#%=DEED=%#<CD-D<(9"":)):""9(;ÿ’£í1‡¸EX¸+/¹+>Y¸EX¸/¹>Y¸+¹ôº+9º+9¸¸и¹ô¸¹ôº+9º&+9¸+¸-и-/¸+¸.Ð01.#"#5.'732654.54>753x$4@+@K@+WC'4VP4?C+@K@+&4'1>(A2,5'!/G9HVcc-,D71=+",?36)cc(6¬‹,[¸EX¸/¹>Y¸EX¸/¹>Y»  +¸¹ô¸и/¸¹ô¸ ¸#и ¸$Ð01%!5>54&'#573.54632.#"3#¬þ82dB [O4E6(/ ¥&"(( h:$!&K'O[*"$0(I'$#>R!Ák¸EX¸/¹>Y¸EX¸/¹>Yº+¸¸ик 9¸¸и¸и¸и¸и¸Ð017#535#5333>?33#3##ئ¦¦˜¬0^ ^.®š¨¨¨-¥"G!PÁ!C%%C!Áþ°!G"¥ÁO¸EX¸/¹>Y¸EX¸/¹>Yº+º 9¸¸и¸и¸Ð01#5333>?33##ئš®0^ ^.°œ¨- "SÁ!C%%C!Áþ­"þöÿôÚ‹5q¸EX¸/¹>Y¸EX¸/¹>Yº +¸ ¸и¸и¹ ô¸¸$и¸%и ¸-и¸.и¹2ô01%#".'#57&45<7#57>32.#"!!3#3267Ú N8,J8&A>>A&ÿ䳌'7»+»+¸¸ и¸и¸#и¸$Ð017#5.54>753.'>7ÿ 7'OE´I,"*G35F("0@6"%>ö 1B'Nf #lm";R34Q;"om#þ ÿž»Ÿ(1»%+»+»!+¸!¸ и¸ Ð01.#"3##"'732>7#5737>32¯ $ŠŽ$5$& %_C  DD#i -:C%þö.J4" ,<$!?^m Aÿ’Èí5©¸EX¸ /¹ >Y¸EX¸#/¹#>Y¸EX¸&/¹&>Y¸EX¸(/¹(>Y¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸&¹ôº&9º&9º9º1&9¸¸2Ð017&#"%#7&'#7.546?3623273&'>7Ï$E!?B# L4  &39`U    $D&;5D’mQ|&*2bcw‰(—g„¨ichs  ýÈ)&6¬‹9k¸EX¸/¹>Y¸EX¸/¹>Y¹ôº+9¸+/¸0и1и и0¸ и+¸и+¸*ии¹!ô01%!5>5<'#573.'#573.54632.#"3#3#¬þ82lA&V?  [O4E6(/ ³ªš–&"(( h:  3O[*"$02" " >R!Ë -á¸EX¸%/¹%>Y¸EX¸)/¹)>Y¸EX¸/¹>Y¸EX¸/¹>Y»+»(+¸¹ô¸¸ и¸ и(¸ к%9¸%¹ô¸¸и¸и¸и¸и¸и¸и/¸¸!и(¸#и#/¸(¸+Ð015#3#3/#'3/#3##'##5#575#573333Y]E:=wLB>II6Vp)MMMM6^h)I?D!½ÞDDc¾òD!óóóóDþøþøÐ m¸EX¸/¹>Y¸EX¸/¹>Y»+¸¹ôº9¸/¹ô¸¸ и¸и¸и¸Ð01267#3.##+##575323®R\ØØ[S"BuZ0+PP[-L8!B+DG‹1‚H:¦YVþù¶¥(>-ÿóè )™¸EX¸/¹>Y¸EX¸/¹>Yº+¸¸ иии¸к9¸¸!ик 9º9¸¸к#9¸¸%и¸&и%¸)Ð01#37/##37%#####57333333Ja  $H TC+60J.3-IE+.$Q(2(S"+)?6€€°J‘I!€€þÊ6þÊ6(þØÿ(þØEÑ¡/L¸EX¸/¹>Yº),+¸¸ܸ)¸$иܸ¸иܸ)¸и,¸/Ð017!!.#"3267#'##"&54>32'5#5353POþ±0 , <97zQ!:>-; &3’’)""‚&3GR!…þD/!`\)B/]-"NNÐ 1‹¸EX¸,/¹,>Y¸EX¸#/¹#>Y¸,¹ô¸+и(ии(¸'ии'¸$и и$¸ ܸ+¸и¸и¸и ¸и ¸!ܸ¸1Ð01>54'#267#3.##3#+##575#575323`Ö%EVÐÎUB"DCInN0+PPPP[LlK«C€/1`1O+$n CAþù‹Cr4>4ÿ’¸í)m¸EX¸/¹>Y¸EX¸/¹>Yº(9¸(/¹ô¸¸и¸ܸ¸ܸ¸и¹ô¸¹#ô01#5.546753.#"32675#5¸H*&/M6oa&,F8#.G1.B+&@x9ý #cc2VwIŽ­ db.%)LkCCmM*Ä'ÿôÈ‹=m¸EX¸3/¹3>Y¸EX¸/¹>Yº"+¸¸и¸ии¹ ô¸"¸&и3¹,ô¸&¸<и"¸=Ð013!3267#".5467#573>7#573>54&#"'>323,0úþçB>/FU4$@._A7-ÐCµ(80*5C5!7(yd%!9#.;-0&6#"7%<))8 *%2(<!Aÿ’Èî'Y¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô¸¹ô¸¸ и¸и¸#и¸$Ð017#5.54>753.'>7NT)<'¶E0$0M66N0$,G5!#8b ˜{?iM.7'1cc2VxIFtT4ec-$ý¶($I»c¸EX¸/¹>Y¸EX¸ /¹ >Y¸¹ô¸и¸ܸи¸ܸи¸ܹ ôº  901#3###53267!573.+5!»” +B@_MÉ6ÅRKW`þüC¿ ^NKr^7%"RZ þå'FK7/&ÿó½#c¸EX¸/¹>Y¸EX¸#/¹#>Yº+¸¸Ð¸¸ܸ и¸ и¸и¸и#¹ô015755753772>54&'7'‚ffff.°°°°$QC,(4Wr>4$4R4$5DZ\$\R\$\þë.D/  Y¸EX¸ /¹ >Yº+¸¸ܸи¸и¸и¸ ܸи¹ô¸Ð0177#5575575#5!ŒŒŒŒ-ŒŒŒŒ¶—ZÃI%HRH$HýæH$HRH$IÙ%%"¹ 9¸EX¸ /¹ >Y¸EX¸/¹>Y¸ ¸ иииÐ01#57!##!!ضCT´-¶—þið!þ!#k¸EX¸/¹>Y¸EX¸/¹>Yº 9|¸ /¸Ð¸¹ô¸ ¸ и ии ¸и ¸и¸Ð0132654&+3##5#575#5732#‰%X\]W%ÏÏ+PPPP[/O9 9N/:INM>þ¼C"³³CE*B.0F.ÿ[ÿôñŸ¸EX¸/¹>Y¸Ü013#Ë&þ‘'ŸýUÿÿÿ[ÿôñŸ¾ÿÿÿ[ÿôñŸ¾ÿÿ(ÿôýŸ'D '¾kD»(ÿôbŸ #/;GK~¸EX¸/¹>Y¸EX¸0/¹0>Y¸EX¸J/¹J>Y»+» +»*+¸¹$ô¸¸6и$¸<и*¸Bи¸HÐ01"&54632'2654&#""&54632'2654&#""&54632'2654&#"3#µBKKBBKKB/77//77çBKKBBKKB/77//77—BKKBBKKB/77//77þŒ&þ‘'kedjjdek![TTYYTT[þÒkedjjdek![TTYYTT[!kedjjdek![TTYYTT[ŠýUÿÿJÿôÏŸ'Eÿì '¾VH’ÿÿJÿôߟ'Eÿì '¾?F¨ÿÿ(ÿôâŸ'G '¾…H¥ÿÿJÿôÛŸ'Eÿì '¾9G§ÿÿ/ÿôîŸ'F '¾kGºÿÿJÿôàŸ'Eÿì '¾9I§ÿÿ/ÿôóŸ'F '¾kIºÿÿ(ÿôóŸ'G '¾jIºÿÿ.ÿôŸ'H '¾xIÈÿÿJÿôÚŸ'Eÿì '¾CJÿÿ(ÿôíŸ'I '¾jJ°ÿÿJÿôÞŸ'Eÿì '¾9K§ÿÿJÿôÝŸ'Eÿì '¾CL§ÿÿ(ÿôðŸ'G '¾jLºÿÿ(ÿôðŸ'I '¾jLºÿÿÿôÜŸ'Kÿí '¾8L¦ÿÿJÿôäŸ'Eÿì '¾CM°IÿôöŸ)-^¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸,/¹,>Y»$+» +¸¹ô¸¹ô01#5>73#%#5>73#"&54632'2654&#"3#›R)!&«R)!&#BKKBBKKB/77//77þÔ&þ‘'Qþz7þz kedjjdek![TTYYTT[ŠýUÿÿ(ÿôîŸ'D '¾jGº"n½& »+¸¸и¸Ð01#53533##Û¹¹)¹¹)7&ÉÉ&É"7½] »+01!!"›þe]&4‡« %¸EX¸/¹ >Y¸EX¸/¹ >Y01?'77'4¡¡¡¢¡¡¢¡£§§©©§§¨¨"m½%!» +»+»+01!!"&54632"&54632"›þeÍ]&ÊhÿÿÃqw€"ÿÿ"Ò½Ã&×f×›"’½ ¸EX¸/¹ >Y015%"›è……è6,¤+Z33Z+"’½ ¸EX¸/¹ >Y01?5/5"è……è›þe½Z33Z+¤,¤"½ ¸EX¸ /¹ >Y¹ ô015%!!"›è……èþe›þe8. +X22X+s%"½ ¸EX¸ /¹ >Y¹ ô01?5/5!!"è……è›þe›þeÃX22X+ . s%"½& 8¸EX¸/¹>Y»+¸¸и¸и¹ ô01#53533##!!Û¹¹)¹¹)¹›þe6%ËË%ÉH%B"ž ¸EX¸/¹>Y¹ô013#/##Ø.—+M43M+žþ„Ë……Ë"P½D7»+» +¸¸Ð¸ ¸и¸ и¸Ð017#537#5!733#3!#‘o†fìO)Oo†fìþýO)Ñ&¦&&¦&( ¶Š+º +¸¸и/¸Ü¸¸ܸ¸Ü01".#"'>323267I/+(&;/+(&; "#*)"#)(ÿÿ(¥¶ð&ãfã›"n½] »+01!5!#”þŽ›)7&ï)§Òî)5ES»6+» @+»0+»* +º 9º9º-9ºC901%".'##".54>323>32%267.#"2>54.#"4 60, ",6!3'(64*")09!$;**:þd/M&H,,=?¦+.1R)1R§!.&"'6"8'!'-$*;$$<-5?+1;523< !+."A:?<ÿÿ\ÿLøàm$ÿôÍŸ72¸EX¸/¹>Y»4+»)+¸¹ô0172>7.#">32#".54>326454.#"Õ)B2!)O%.B*%0DJ,*I5$B]9">08P5-T!*9" >%B\7.%1A$"8)E""JuRT‹c61F,0R:!)#  Kg?:ÿb)»+»+01"'732>54.54>32&#"d   +"    +ž$-A)5ˆŒ†3.P:"$.B(5‡Œ…4/O;!1ÿ—4 »+01'73>73#…Em~½&Ù)N 3þ‡  -ücÿÿ“Dÿÿ.eŸXÿˆç (¸EX¸/¹>Y»  +¸¹ô015!!!!õ©þ‘ïú™þ,W[Z!'þ±þ¯(^ÿˆ.¸EX¸/¹>Y¹ô01!#!#^Ð0þŽ.ý Ïý1ÿôfÛ 1(¸EX¸ /¹ >Y» +¸ ¹.ô01>54&#"#".='>74>323267–AS( .Ð9&2%'!,1@3F(# ) E£S=1KNþ#,B,  17M0IH0c_Y'()8$.ÿôò”2K¸EX¸/¹>Y¸EX¸/¹>Yº%+¸¹ôº9¸¹/ô012=4'.#"3#".54>32!"3267l *n>Ao*ö2’VJ`77`JI`8ýÂ)pADv*N¸ ,25- ´ÖY¸ܺ901'3'#"Û Ü'Îç þóçþ&ÿòM »+01%7!5!'7&æþææ þó Ü&Üþøþø+ÿè@ "¸EX¸/¹ >Y¸ܺ901?37#+Û'Üþøõçæþçþó-ÿÄ]ô º+01!!-0üÐôüÐÿ°q º+01 ¬¬þT\¬þTþT#ÿµh';»+» +01".54>32'2>54.#"7".54>32ÅS˜sDDs˜SS˜sEEs˜SH‡i@@i‡HG‡j@@j‡G6eL..Le66eM..MeK8lžecm::mcežl8%2b^^b22b^^b2g'IiBAiI((IiABiI'-ÿÄ]ô »+»+017!!%!-8ø.üþìý5Æ.ý8Íý36ÿÄT º+013!6üâ:Bü¾6ÿÄT »+013!% 6üâãþ¬þ¬:Bü¾$Òý.-ÿÍqë º+013#-Bü¾ëþsþs-ÿÍqë)º+º9º9º9013# -Bü¾öý0ëþsþsTýX6ÿ°Tô º+01 #5!Tþsþsòü¾B6ÿ°Tô »+01 #5! TþsþsýTTòü¾B$ý.ÒÿÍ]ëº+º901#53]ü¾B3ÿÍ]ë3º+º9º9º9º901#53 ]ü¾Bý Ð3þqþ¬¨JÿöÐ 5¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸¹ô017!!%!J5Q-ý§CýÞr+ýŽ5!Eý»Jÿö#b¸EX¸/¹>Y¸EX¸/¹>Y¸EX¸/¹>Y» +º9¸¹ô¸и¹ô01.'73>7!!!7!>7Mz%8G*#&D"yLþ"–*)-ý§54Ggò‚N><‡Cuíjý»Ù'/ý‘5|+ 9ÿüÿìU©/¸EX¸/¹>Y¸EX¸/¹>Y¸¹ô01&'73>79Z"*GSgx? @xhT7¢ƒ?FY¶¬š= <•ªºaÿëŶ&º+º 901"&54>323'>54&'~(7(7#"!!) DA,9%!'%  ..2%? (1VþN%7%;ÿö¸ž5¸EX¸/¹>Y¸EX¸/¹>Y¹ô¸¹ ô013#?/#;¦1¦¦1DLLDDKKDJTþ¬þ¬&‹£¡¡£‹R唵 º+01'i+ µFˆÿÿRå!µ&G創 º+01/7l +åˆFÏÿÿR唵ÿÿ:à¡¿‚ÿÿ:Ý¢¼ƒÿÿ!"ábS%ÿÿ"áLM%ÿÿ˜>@ò! ÿÿÖ>~ò$ ÿÿ<•á' ÿÿ=•á= EϸEX¸/¹>Y¸Ü013#+Ͼÿÿ^ü‚+ÿÿ6>Þò$kÿÿÿø> ò!kÿÿþ÷EÿµZ0ÿÿgC¯Æ) ÿÿV‰ 5 ÿÿ^†‚+ ÿÿv: Ó/ ÿÿª$lã9 ÿÿ¾9½î; ÿÿåT1¤3 ÿÿÀÿ%XVÿÿÕÿ5gX 4ÿôì #/;GS^jv‚˸EX¸N/¹N >Y¸EX¸Y»*$+»e_+»+»‰ƒ+» +¸ƒ¸и/¸‰¸и/¸_¸0и0/¸e¸6и6/¸<¹Bô¸N¹Hô¸$¸Tи*¸Zи¸kи¸qи ¸wи¸}Ð017"&54632'"&546327"&54632"&54632"&54632"&54632"&54632"&54632"&54632"&546327"&54632'"&54632m  +    @    \    \    @    *  anoþÑþd¶þe#€þÒnn!ÿ>5ò¸EX¸/¹ >Y¸Ü017s"†ÕÿÂ)T¸EX¸/¹>Y¸Ü017p}3!{ÿ·/õ |¸/¸Ü017I3+!ë ¾ÿË>sò¸EX¸/¹ >Y¸Ü0175†"U—ÿ×ÂpT¸EX¸/¹>Y¸Ü017)}…Ù{!qÿë/Nõ ¸/¸Ü01'3B!õ ¼ÿv<Šá*¸EX¸/¹ >Y¸Ü¸¸к9013'#'*urrá~~ÿyÇG*¸EX¸/¹>Y¸Ü¸¸к9013'#',qqqGqbbÿ\C¤Æ0¸EX¸/¹ >Y¸ܸи¸и¸ܸÐ01".#"'>323267L' " !' "  C$6'-#$7&-$ÿ[Î¥B0¸EX¸/¹>Y¸ܸи¸и¸ ܸÐ01".#"'>323267M(!!-)(!!-Î)#/?*#/@ÿ…^{‚ ¸/¸Ü013#{öö‚$ÿ„ç| ¸EX¸/¹>Y¸Ü013#|øø $ÿÿÿ…^{‚+ÿÿÿ„ç| ,ÿk:•Ó ¸EX¸/¹ >Y¸ ܸܸÐ01".'732>7&6#!))!#6:+4*##*4+ÿm<“Î ¸EX¸/¹ >Y¸ ܸܸÐ01".'332>73*7!( (( (!7<*4*  *4*ÿxƈG ¸EX¸/¹>Y¸ ܸܸ Ð01".'73267!1!!2002!!1Æ$,&::&,$ÿxƈF ¸EX¸/¹>Y¸ ܸܸÐ01".'332>73&3* #$ *3Æ%-$$-%ÿÚT&¤ º+01"&54632TÿØÑ(! ¸EX¸/¹>Y¸Ü01"&54632Ñÿ‚V~  º+¸¸ и¸Ð01"&546323"&54632Y¢VÿzÕ† (¸EX¸/¹>Y¸ܸ¸ и¸Ð01"&546323"&54632b´ÕÿÉ?Få ¸EX¸/¹ >Y¸Ü¸ܸÜ01>54'7!$U-!"[." ÿɾF_ ¸EX¸/¹>Y¸Ü¸ܸÜ01>54'7!$U,!"Ù-  ÿŸ$aã º +º+01"&54632'2654&#"*77**77*&&&&$5*+55+*5% && %ÿ¨¼Xg º +º+01"&54632'2654&#"&22&$44$!!""¼/&(..(&/ÿ³9²î¸/¸ܸи¸Ð017?MV#^kV#^F¨¢ ¨¢ÿ­Ä·e$¸EX¸/¹>Y¸Ü¸и¸Ð01'7'"`è"`eŒ ”Œ ÿv=Šá&¸EX¸/¹ >Y¸ܺ9¸Ð01737#Šrru*Í}}ÿyŇI&¸EX¸/¹>Y¸ܺ9¸Ð01737#‡qqq,7bbrÿâ$ò º+013#&ò2œÿN9Mî¸/¸ܸи¸Ð017?²#V(#VÛ¨ ¢¨ ÿIÄSe$¸EX¸/¹>Y¸ܸи¸Ð017?·"X0"XP” Œ” ÿk9•Ò¸/¸ܸܸ¸ Ð01>32.#"•#6''6#!))?4++4+""+ÿxƈG$¸EX¸/¹>Y¸ܸܸ¸ Ð01>32.#"ˆ!1!!1!!2002Ë,$$,&::&ÿÕ'*Ò º +01632#"5467* ) &º(= :ÿºA7ä º +01.54>7"!-U$A  !.ÿÖ&+Ò º +01>7#"&54632* ) &?)= ;ÿÿÿÉ?Få7ÿ»ÿ Mÿà »+015#5353+pp"ôK!K·ÿ³ÿ Eÿà »+01#533+""p©K·K!ÿ»<MÄ »+015#53+p’54'70.& J9Ô/!4< ÿÄþý2ÿ¼» +»+01&546"723;;3*##*þÿ3--2& &ÿ§ÿ8Yÿû+¸¸Ð0153533YH"HÈ!jj!ÿ§ÿ Yÿ—»+¸¸Ð01#5#53"H²Šjj!!ÿ§ÿ Yÿà » +¸¸и ¸Ð01#5#53533"HH"H©KK!KK!ÿ§ÿWYÿx »+013#Y²²ˆ!ÿÿÿÚÿ>&ÿŽ3üêÿÿÿ‚ÿA~ÿ‹5üëÿÿÿŸÿaÿ¿9üÜÿ¬ÿ%Dÿà º+¸¸Ü¸ Ü01>54&'7TA0)$ 9.JG½! ')ÿ¼CTẠ+¸ ¸ܸÜ01.5467#9.JGA0)$ C! ')ÿ¬ÿ%Dº +¸¸Ü¸Ü01>54&'73TA0$*)# 'JG½WC')ÿ¬ÿ%Dº +¸¸Ü¸Ü01>54&'73TA0$*)# 'JG½WC')ÿÊÿ5\ º +01"&54673327#.,,#* &Ë()&B>  ÿËÿ3a º +01"&54673327#1+*#'  %Í(*'B>  ÿëþ÷ÿµ º+013#*K¾ÿ‹ÿuÿ« »+01##53#V¬êvoÿÿÿvÿ#ŠÿÇ=üæÿÿÿkÿ•ÿ³/üàÿÿÿkÿ•ÿ²Büàÿÿÿ\ÿ$¤ÿ§)üáÿÿÿ…ÿa{ÿ…+ýÿÿÿ\äF)þ€ÿÎþý<ÿ¼ » +»+016548'2*##*3;;3è& &2--3ÿ‹ÿuÿ¨ »+013353#u¬êXnnÿ‹ÿuÿ¬»+»+013#75#uêêˬT˜ YYÿcÿÿ­ K»+» +¸¸Ð¸/¸ ¸и¸ и /¸¸и¸и/01&6323>324.#"#54#"'œ.(&'(.  4"4  àM@""@M"+ __ +"ÿµ4KÉ %¸EX¸/¹>Y¸EX¸/¹>Y017'77'K33333333K33333333ÿÿÿ\C¤Æ)ÿÿÿ[Î¥B*ÿíÿALÿ¾ » +01"&=33267&'   ¿!&6! !þ;/ÅÊ º +01>32.#"þ;dÞƒƒÞd_àvvà_I>CC><;;<ÿ„V|6'¸/º +¸¸ܸ¸и ¸Ð017"&546323"&54632&U]J£Îhbfÿ{Õ…± 4¸EX¸/¹>Yº +¸¸ܸ¸и¸Ð01"&546327'"&54632b•g~ÕÜbrÿy1‡ö'¸/º +¸¸Ü¸¸и ¸Ð01/"&546323"&54632.BE¾ö »"ÿ„V|6#º +º+¸¸и ¸Ð017"&546323"&54632NUh£hfÿ{Õ…±4¸EX¸/¹>Yº+¸¸ ܸ¸и ¸Ð01'7"&546323"&54632g^~µ6bjrÿy1‡ö '¸/º+¸¸ ܸ¸и¸Ð01"&54632?7"&54632f .+bZ’ ¾)ÿkV•%17º +¸ ¸,иܸ ܸиܸ и¸и¸&Ð01>32327#".#""&546323"&54632• %) %) £Ã33jÿƒV| 'º+¸¸ܸ ܸ¸и¸Ð01"&54632'3#"&54632Y3øøÖV¶!•ÿ{Õ…w 0¸EX¸/¹>Y¸ܸܸ ܸ¸и¸Ð01"&54632'3#"&54632b)øøÞÕ¢!ÿ„V|55º+¸¸ܸܺ9¸и¸и¸Ð0137#'7"&546323"&54632]`&`£çN\\ßÿ{Õ…¯>¸EX¸/¹>Y¸ܸܸܺ9¸и¸и¸Ð01737#"&546323"&54632|ggh(Nµ›MM^hÿ„=Ñ º +º+¸¸Ü¸Ð0173'#%'|i&ihhdS\\LLÆoÿÃËt ,¸EX¸/¹>Y¸ܸܸ¸и ܸ Ü0173'#?s_(_^^²^dÖTTDDPa\ÿ=| º +º+¸¸Ü¸Ð0173'#/7|i&ihhvnS\\LL?lpÿGÃst 0¸EX¸/¹>Y¸ܸܸ¸и¸ܸ Ü0173'#/7s_(_^^RLÖTTDD:`eÿ„=¶'º+¸¸Ü¸иܸܸ ܸÜ0173'#7>54'7|i&ihhÉG-=S\\LLR+ $ ÿõƒ4¸EX¸/¹>Y¸ܸܸ¸иܸܸܸÜ0173'#7>54&'7s_(_^^¼%$-=ÖTTDDM# ÿ~=‚#7º+¸¸Ü¸и¸ܸܸ и ܸи¸#Ð0173'#'>323267#".#"|i&ihh$  $  S[[KK†     ÿtÃŒ#D¸EX¸/¹>Y¸ܸܸ¸и¸ܸܸ и ܸи¸#Ð0173'#'>323267#".#"s_(_^^,$#ÖSSCCŠÿk:•!#º+¸¸ܸܸ¸ ܸÐ017".'732>7%T[ '6# ** #6°qlb+4+##+4+ÿxƈ,¸EX¸/¹>Y¸ܸܸܸ¸ ܸÐ01'".'732>7Bf!1! %% !1bn$,##,$ÿk:•!#º+¸¸ܸܸ¸ ܸÐ017".'732>7NT '6# ** #6qb+4+##+4+ÿxƈ,¸EX¸/¹>Y¸ܸܸܸ¸ ܸÐ01'7".'732>7f^!1! %% !1"bin$,##,$ÿk:•9%+º+¸¸ܸܸܸܸ¸ܸ!Ð01>54&'7".'732>7!(*0D '6# ** #6½!"% g+4+##+4+ÿxƈ«%4¸EX¸/¹>Y¸ܸܸܸܸܸ¸ܸ Ð01>54&'7".'732>7%$-=!1! %% !18$ W$,##,$ÿv:Š/3º +¸ ¸ܸи'ܸܸ,иܸ!и'¸/Ð01".'732>7'>323267#".#"$2!52&!2§$  $  :%1%‰     ÿtÇŒž-/¸/¸ ܸܸ и%ܸܸ*иܸи%¸-Ð01".'73267'>323267#".#"!1!2112!1­$#Ç%//%‡ÿ…={+º+¸¸Ü¸и¸ܸܸ ܸÐ0173'#7".'73267zg&gffh-,--,-QOO??|##ÿ‚Ã~ž8¸EX¸/¹>Y¸ܸܸ¸и¸ܸܸܸÐ0173'#7".'73267s_(_^^`.----.ÖSSDD$$ÿ…^{6º+¸¸ܸÜ0173#;…VööÖ`"X:$ÿ„ç|± ¸EX¸/¹>Y¸ܸܸÜ0173#flqøøLe^,$ÿ{0dõ,¸/¸EX¸/¹ >Y¸ܸ ܸ ܸ¸Ü01.54>77'2($'^0AB !™ »ÿq0Uõ,¸/¸EX¸/¹ >Y¸ܸ ܸ ܸ¸Ü01.54>7?<($'.0+B ! ¾ÿ}2ƒ(/¸/¸ܸ ܸܸ ܸܸ%иܸи ¸(Ð01.5467'>323267#".#"<-G¡"$  $  2 # y/    ÿz0mõ,¸/¸EX¸/¹ >Y¸Ü¸ܸܸ¸Ü01>54&'77'p'$)¥0A\! ³ »ÿz0^õ,¸/¸EX¸/¹ >Y¸Ü¸ܸܸ¸Ü01>54&'7?p'$)k0+\! © ¾ÿ}2ƒ(/¸(/¸ܸܸ ܸܸܸиܸ и¸Ð01>323267#".#">54'7ƒ"$  $  GG-<Ä/    v # ÿÿ!´Û&#&ÿÿ!ÿô¾Û&#)(æpp…$Œp@°ð`c } ‰ “¢5O^ c o y „  à˜ *x ¢ H° *x €ø &x Àž 4^ ’ 2ª &Ü 4   6  T  ^  v  Š     ¶Copyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'.Source Sans Pro LightRegular2.010;ADBE;SourceSansPro-Light;ADOBEVersion 2.010;PS Version 2.0;hotconv 1.0.78;makeotf.lib2.5.61930SourceSansPro-LightSource is a trademark of Adobe Systems Incorporated in the United States and/or other countries.Adobe Systems IncorporatedPaul D. Hunthttp://www.adobe.com/typeThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL. This Font Software is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.http://scripts.sil.org/OFLSource Sans ProLightSlashed zeroStraight lAlternate aAlternate gSerifed ICopyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'.Source Sans Pro LightRegular2.010;ADBE;SourceSansPro-Light;ADOBEVersion 2.010;PS Version 2.0;hotconv 1.0.78;makeotf.lib2.5.61930SourceSansPro-LightSource is a trademark of Adobe Systems Incorporated in the United States and/or other countries.Adobe Systems IncorporatedPaul D. Hunthttp://www.adobe.com/typeThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL. This Font Software is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.http://scripts.sil.org/OFLSource Sans ProLightSlashed zeroStraight lAlternate aAlternate gSerifed Iÿµ2˜$%&'()*+,-./0123456789:;<=DEFGHIJKLMNOPQRSTUVWXYZ[\]­ÉÇ®bc     dýÿËeÈÊ !"#$%&'()*+,-ø./01234567ÏÌÍ8Î9ú:;<=>?@ABCDEFGHIâJKLMNOfPQRSÓÐѯgTUVWXYZ[\]^_‘°`abcdefghijklmnoäpqrstuvwxyzÖÔÕ{h|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’ë“»”•–—˜æ™š›é휞jikmlŸ n¡¢£¤¥¦§¨©ª«¬­® ¯°±²oþ³´µ¶·qpr¸s¹º»¼½¾¿ÀÁÂÃÄÅÆÇùÈÉÊËÌÍÎÏÐÑutvÒwÓÔÕÖרÙ×ÚÛÜÝÞßàáâãäåãæçèéêëxìíîïðzy{}|ñòóôõö÷øùúûü¡±ýþÿ    å ‰~€ !"#$%&'()*+,-./ì0º12345ç678êî9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëì›íîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º »¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæ«£"¢ ¶·´µÄž¿©ªç²³èéêëÇBìí >@^`_?è ‚Â†ˆîïðñòóôõö÷øùúûüý‹þŠŒÿ#      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡ž¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâã䃽…–åæ„çèéêëìíîïðñòóôõö¼÷øÆõôöùúûüýþÿïð¸ !”•“Aa§¤’ ˜œ¥  ™š  !"¹#$%&'()*CØá+,-./ÙŽÚÛÝßÜÞà0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥ÀÁNULLCRAmacronAbreveuni01CDuni1EA0uni1EA2uni1EA4uni1EA6uni1EA8uni1EAAuni1EACuni1EAEuni1EB0uni1EB2uni1EB4uni1EB6Aogonekuni01FCuni01E2uni0243uni1E06 Ccircumflex CdotaccentDcaronuni1E0Cuni1E0EDcroatEcaronEmacronEbreve Edotaccentuni1EB8uni1EBAuni1EBCuni1EBEuni1EC0uni1EC2uni1EC4uni1EC6Eogonekuni1E16uni01F4 Gcircumflex Gdotaccentuni0122Gcaronuni1E20 uni00470303uni0193 Hcircumflexuni1E24uni1E2AHbarItildeImacronuni01CFuni1EC8uni1ECAIogonekuni012C Jcircumflexuni0136uni1E32uni1E34LacuteLcaronuni013BLdotuni1E36uni1E38uni1E3Auni1E3Euni1E40uni1E42Nacuteuni01F8Ncaronuni0145uni1E44uni1E46uni1E48Omacron Ohungarumlautuni01D1uni1ECCuni1ECEuni1ED0uni1ED2uni1ED4uni1ED6uni1ED8uni014Euni1E52Ohornuni1EDAuni1EDCuni1EDEuni1EE0uni1EE2uni01EARacuteRcaronuni1E58uni0156uni1E5Auni1E5Cuni1E5ESacute Scircumflexuni015Euni0218uni1E60uni1E62uni1E9ETcaronuni0162uni021Auni1E6Cuni1E6Euni0166UtildeUmacronUbreveUring Uhungarumlautuni01D3uni01D5uni01D7uni01D9uni01DBuni1EE4uni1EE6UogonekUhornuni1EE8uni1EEAuni1EECuni1EEEuni1EF0WgraveWacute Wcircumflex WdieresisYgrave Ycircumflexuni1E8Euni1EF4uni1EF6uni1EF8Zacute Zdotaccentuni1E92uni1E94uni018Funi014Auni0132amacronabreveuni01CEuni1EA1uni1EA3uni1EA5uni1EA7uni1EA9uni1EABuni1EADuni1EAFuni1EB1uni1EB3uni1EB5uni1EB7aogonekuni01FDuni01E3uni0180uni1E07 ccircumflex cdotaccentdcaronuni1E0Duni1E0Fecaronemacronebreve edotaccentuni1EB9uni1EBBuni1EBDuni1EBFuni1EC1uni1EC3uni1EC5uni1EC7eogonekuni1E17uni01F5 gcircumflex gdotaccentuni0123gcaronuni1E21 uni00670303 hcircumflexuni1E25uni1E96uni1E2Bhbaritildeimacronuni01D0uni1EC9uni1ECBiogonek iogonek.duni012D jcircumflexuni0137uni1E33uni1E35 kgreenlandiclacutelcaronldotuni013Cuni1E37uni1E39uni1E3Buni1E3Funi1E41uni1E43nacuteuni01F9ncaronuni0146uni1E45uni1E47uni1E49 napostropheomacron ohungarumlautuni01D2uni1ECDuni1ECFuni1ED1uni1ED3uni1ED5uni1ED7uni1ED9uni014Funi1E53ohornuni1EDBuni1EDDuni1EDFuni1EE1uni1EE3uni01EBracuteuni0157rcaronuni1E59uni1E5Buni1E5Duni1E5Fsacute scircumflexuni015Funi0219uni1E61uni1E63tcaronuni0163uni021Buni1E6Duni1E6Funi1E97uni0167utildeumacronubreveuring uhungarumlautuni01D4uni01D6uni01D8uni01DAuni01DCuni1EE5uni1EE7uogonekuhornuni1EE9uni1EEBuni1EEDuni1EEFuni1EF1wgravewacute wcircumflex wdieresisygrave ycircumflexuni1E8Funi1EF5uni1EF7uni1EF9zacute zdotaccentuni1E93uni1E95uni014Buni0237uni0133uni0250uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0251uni0299uni0259uni025Auni025Buni025Cuni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni029Cuni0268uni026Auni029Duni026Cuni026Duni026Euni029Funi026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0278uni0279uni027Auni027Buni027Duni027Euni0280uni0281uni0282uni0283uni0284uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0294uni0295uni02A1uni02A2uni01C2uni0298f_ff_f_if_f_lf_tf_f_tI.aIgrave.aIacute.a Icircumflex.aItilde.a Idieresis.a Imacron.a Idotaccent.a uni01CF.a uni1EC8.a uni1ECA.a Iogonek.a uni012C.a uni014A.aa.aagrave.aaacute.a acircumflex.aatilde.a adieresis.a amacron.aabreve.aaring.a uni01CE.a uni1EA1.a uni1EA3.a uni1EA5.a uni1EA7.a uni1EA9.a uni1EAB.a uni1EAD.a uni1EAF.a uni1EB1.a uni1EB3.a uni1EB5.a uni1EB7.a aogonek.ag.a uni01F5.a gcircumflex.agbreve.a gdotaccent.a uni0123.agcaron.a uni1E21.a uni00670303.al.alacute.alcaron.aldot.a uni013C.a uni1E37.a uni1E39.a uni1E3B.alslash.afl.aAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 Alphatonos EpsilontonosEtatonos Iotatonos Iotadieresis Omicrontonos UpsilontonosUpsilondieresis Omegatonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigmatauupsilonphichipsiomegauni03C2uni03D0uni03D1uni03D5 alphatonos epsilontonosetatonos iotatonos iotadieresis omicrontonos upsilontonosupsilondieresis omegatonosiotadieresistonosupsilondieresistonosuni1F08uni1F09uni1FBAuni1FBBuni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1FB8uni1FB9uni1F18uni1F19uni1FC8uni1FC9uni1F1Auni1F1Buni1F1Cuni1F1Duni1F28uni1F29uni1FCAuni1FCBuni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F38uni1F39uni1FDAuni1FDBuni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1FD8uni1FD9uni1F48uni1F49uni1FF8uni1FF9uni1F4Auni1F4Buni1F4Cuni1F4Duni1FECuni1F59uni1FEAuni1FEBuni1F5Buni1F5Duni1F5Funi1FE8uni1FE9uni1F68uni1F69uni1FFAuni1FFBuni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1FBCuni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1FCCuni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FFCuni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1F00uni1F01uni1F70uni1F71uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1FB0uni1FB1uni1FB6uni1F10uni1F11uni1F72uni1F73uni1F12uni1F13uni1F14uni1F15uni1F20uni1F21uni1F74uni1F75uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1FC6uni1F30uni1F31uni1F76uni1F77uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1FD0uni1FD1uni1FD6uni1FD2uni1FD3uni1FD7uni1F40uni1F41uni1F78uni1F79uni1F42uni1F43uni1F44uni1F45uni1FE4uni1FE5uni1F50uni1F51uni1F7Auni1F7Buni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1FE6uni1FE0uni1FE1uni1FE2uni1FE3uni1FE7uni1F60uni1F61uni1F7Cuni1F7Duni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1FF6uni1FB3uni1F80uni1F81uni1FB2uni1FB4uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1FB7uni1FC3uni1F90uni1F91uni1FC2uni1FC4uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1FC7uni1FF3uni1FA0uni1FA1uni1FF2uni1FF4uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FF7uni03D7uni03D9uni03DBuni03DDuni03E1uni037E anoteleia anoteleia.capuni0374uni0375tonos tonos.cap dieresistonosuni037Auni1FBEuni1FBDuni1FBFuni1FFEuni1FEFuni1FFDuni1FCDuni1FDDuni1FCEuni1FDEuni1FCFuni1FDFuni1FC0uni1FEDuni1FEEuni1FC1 uni1FBD.cap uni1FFE.cap uni1FEF.cap uni1FFD.cap uni1FCD.cap uni1FDD.cap uni1FCE.cap uni1FDE.cap uni1FCF.cap uni1FDF.capuni0410uni0411uni0412uni0413uni0414uni0415uni0416 uni0416.a uni0416.buni0417uni0418uni0419uni041A uni041A.a uni041A.buni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407 uni0407.auni0408uni0409uni040Auni040Buni040C uni040C.a uni040C.buni040Duni040Euni040Funi0462uni0472uni0474uni0490uni0492uni0496 uni0496.a uni0496.buni0498uni049A uni049A.a uni049A.buni04A0 uni04A0.a uni04A0.buni04A2uni04AAuni04AEuni04B0uni04B2uni04B6uni04BAuni04C0uni04C1 uni04C1.a uni04C1.buni04D0uni04D4uni04D6uni04D8uni04E2uni04E6uni04E8uni04EEuni04F2uni0430uni0431uni0432uni0433uni0434uni0435uni0436 uni0436.a uni0436.buni0437uni0438uni0439uni043A uni043A.a uni043A.buni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457 uni0457.auni0458uni0459uni045Auni045Buni045C uni045C.a uni045C.buni045Duni045Euni045Funi0463uni0473uni0475uni0491uni0493uni0497 uni0497.a uni0497.buni0499uni049B uni049B.a uni049B.buni04A1 uni04A1.a uni04A1.buni04A3uni04ABuni04AFuni04B1uni04B3uni04B7uni04BBuni04C2 uni04C2.a uni04C2.buni04CFuni04D1uni04D5uni04D7uni04D9uni04E3uni04E7uni04E9uni04EFuni04F3 uni0431.srbuni2116zero.0zero.0s zero.pnumone.pnumtwo.pnum three.pnum four.pnum five.pnumsix.pnum seven.pnum eight.pnum nine.pnumzero.0pzero.0ps zero.tnumone.tnumtwo.tnum three.tnum four.tnum five.tnumsix.tnum seven.tnum eight.tnum nine.tnum zero.onumone.onumtwo.onum three.onum four.onum five.onumsix.onum seven.onum eight.onum nine.onumzero.capone.captwo.cap three.capfour.capfive.capsix.cap seven.cap eight.capnine.capuni00ADuni2E3Auni2E3B figuredashuni2015uni203Euni203Funi2016uni203Cuni2047uni2049uni2048uni203Duni231Cuni231Duni231Euni231Funi27E6uni27E7uni2E22uni2E23uni2E24uni2E25uni2117uni2120u1F16Au1F16Bat.casei.trkA.scB.scC.scD.scE.scF.scG.scH.scI.scJ.scK.scL.scM.scN.scO.scP.scQ.scR.scS.scT.scU.scV.scW.scX.scY.scZ.sc Agrave.sc Aacute.scAcircumflex.sc Atilde.sc Adieresis.sc Amacron.sc Abreve.scAring.sc uni01CD.sc uni1EA0.sc uni1EA2.sc uni1EA4.sc uni1EA6.sc uni1EA8.sc uni1EAA.sc uni1EAC.sc uni1EAE.sc uni1EB0.sc uni1EB2.sc uni1EB4.sc uni1EB6.sc Aogonek.scAE.sc uni01FC.sc uni01E2.sc uni0243.sc uni1E06.sc Ccedilla.sc Cacute.scCcircumflex.sc Ccaron.sc Cdotaccent.sc Dcaron.sc uni1E0C.sc uni1E0E.sc Dcroat.sc Egrave.sc Eacute.scEcircumflex.sc Ecaron.sc Edieresis.sc Emacron.sc Ebreve.sc Edotaccent.sc uni1EB8.sc uni1EBA.sc uni1EBC.sc uni1EBE.sc uni1EC0.sc uni1EC2.sc uni1EC4.sc uni1EC6.sc Eogonek.sc uni1E16.sc uni01F4.scGcircumflex.sc Gbreve.sc Gdotaccent.sc uni0122.sc Gcaron.sc uni1E20.scuni00470303.sc uni0193.scHcircumflex.sc uni1E24.sc uni1E2A.scHbar.sc Igrave.sc Iacute.scIcircumflex.sc Itilde.sc Idieresis.sc Imacron.sc Idotaccent.sc uni01CF.sc uni1EC8.sc uni1ECA.sc Iogonek.sc uni012C.scJcircumflex.sc uni0136.sc uni1E32.sc uni1E34.sc Lacute.sc Lcaron.sc uni013B.scLdot.sc uni1E36.sc uni1E38.sc uni1E3A.sc Lslash.sc uni1E3E.sc uni1E40.sc uni1E42.sc Nacute.sc uni01F8.sc Ncaron.sc Ntilde.sc uni0145.sc uni1E44.sc uni1E46.sc uni1E48.sc Ograve.sc Oacute.scOcircumflex.sc Otilde.sc Odieresis.sc Omacron.scOhungarumlaut.sc uni01D1.sc uni1ECC.sc uni1ECE.sc uni1ED0.sc uni1ED2.sc uni1ED4.sc uni1ED6.sc uni1ED8.sc Oslash.scOE.scOhorn.sc uni1EDA.sc uni1EDC.sc uni1EDE.sc uni1EE0.sc uni1EE2.sc uni01EA.sc uni014E.sc uni1E52.sc Racute.sc uni1E58.sc Rcaron.sc uni0156.sc uni1E5A.sc uni1E5C.sc uni1E5E.sc Sacute.scScircumflex.sc Scaron.sc uni015E.sc uni0218.sc uni1E60.sc uni1E62.sc germandbls.sc uni1E9E.sc Tcaron.sc uni0162.sc uni021A.sc uni1E6C.sc uni1E6E.sc uni0166.sc Ugrave.sc Uacute.scUcircumflex.sc Utilde.sc Udieresis.sc Umacron.sc Ubreve.scUring.scUhungarumlaut.sc uni01D3.sc uni01D5.sc uni01D7.sc uni01D9.sc uni01DB.sc uni1EE4.sc uni1EE6.sc Uogonek.scUhorn.sc uni1EE8.sc uni1EEA.sc uni1EEC.sc uni1EEE.sc uni1EF0.sc Wgrave.sc Wacute.scWcircumflex.sc Wdieresis.sc Ygrave.sc Yacute.scYcircumflex.sc Ydieresis.sc uni1E8E.sc uni1EF4.sc uni1EF6.sc uni1EF8.sc Zacute.sc Zcaron.sc Zdotaccent.sc uni1E92.sc uni1E94.scEth.scThorn.sc uni018F.sc uni014A.sc uni0132.sc uni014A.scaAlpha.scBeta.scGamma.sc uni0394.sc Epsilon.scZeta.scEta.scTheta.scIota.scKappa.sc Lambda.scMu.scNu.scXi.sc Omicron.scPi.scRho.scSigma.scTau.sc Upsilon.scPhi.scChi.scPsi.sc uni03A9.scIotadieresis.scUpsilondieresis.scAlphaiotasub.sc Etaiotasub.scOmegaiotasub.sc uni0410.sc uni0411.sc uni0412.sc uni0413.sc uni0414.sc uni0415.sc uni0416.sc uni0417.sc uni0418.sc uni0419.sc uni041A.sc uni041B.sc uni041C.sc uni041D.sc uni041E.sc uni041F.sc uni0420.sc uni0421.sc uni0422.sc uni0423.sc uni0424.sc uni0425.sc uni0426.sc uni0427.sc uni0428.sc uni0429.sc uni042A.sc uni042B.sc uni042C.sc uni042D.sc uni042E.sc uni042F.sc uni0400.sc uni0401.sc uni0402.sc uni0403.sc uni0404.sc uni0405.sc uni0406.sc uni0407.sc uni0407.sca uni0408.sc uni0409.sc uni040A.sc uni040B.sc uni040C.sc uni040D.sc uni040E.sc uni040F.sc uni0462.sc uni0472.sc uni0474.sc uni0490.sc uni0492.sc uni0496.sc uni0498.sc uni049A.sc uni04A0.sc uni04A2.sc uni04AA.sc uni04AE.sc uni04B0.sc uni04B2.sc uni04B6.sc uni04BA.sc uni04C0.sc uni04C1.sc uni04D0.sc uni04D4.sc uni04D6.sc uni04D8.sc uni04E2.sc uni04E6.sc uni04E8.sc uni04EE.sc uni04F2.sc ampersand.sczero.scone.sctwo.scthree.scfour.scfive.scsix.scseven.sceight.scnine.sc exclam.sc exclamdown.sc question.scquestiondown.scquotesingle.sc quotedbl.sc quoteleft.sc quoteright.scquotedblleft.scquotedblright.sc hyphen.sc endash.sc emdash.sc parenleft.sc parenright.scbracketleft.scbracketright.sc braceleft.sc braceright.sc zero.supsone.supstwo.sups three.sups four.sups five.supssix.sups seven.sups eight.sups nine.supsparenleft.supsparenright.sups period.sups comma.sups zero.subsone.substwo.subs three.subs four.subs five.subssix.subs seven.subs eight.subs nine.subsparenleft.subsparenright.subs period.subs comma.subs zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnomparenleft.dnomparenright.dnom period.dnom comma.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numrparenleft.numrparenright.numr period.numr comma.numr ordfeminine.aA.supsB.supsC.supsD.supsE.supsF.supsG.supsH.supsI.supsJ.supsK.supsL.supsM.supsN.supsO.supsP.supsQ.supsR.supsS.supsT.supsU.supsV.supsW.supsX.supsY.supsZ.supsa.supsb.supsc.supsd.supse.supsf.supsg.supsh.supsi.supsj.supsk.supsl.supsm.supsn.supso.supsp.supsq.supsr.supss.supst.supsu.supsv.supsw.supsx.supsy.supsz.supsuni02C1uni02D0uni02D1uni02DEuni02E0 egrave.sups eacute.sups uni0259.supsa.supag.supal.supa colon.sups hyphen.sups endash.sups emdash.supsyen.CNEurouni0192 colonmonetarylirauni20A6pesetauni20A9donguni20B1uni20B2uni20B4uni20B5uni20B9uni20BAuni20AEuni20B8uni20BDuni2215 slash.fraconethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215Auni2150 oneeighth threeeighths fiveeighths seveneighthsuni2151uni2152uni2189uni2219uni00B5uni2206uni2126uni2113 estimateduni2190arrowupuni2192 arrowdownuni25A0uni25C6uni25C9uni2752triagupuni25B3uni25B6uni25B7triagdnuni25BDuni25C0uni25C1uni2610uni2611uni2713uni266Auni2032uni2033uni2035uni02B9uni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CCuni25CCuni0300 uni0300.cap uni0300.guni0301 uni0301.cap uni0301.guni0302 uni0302.capuni0303 uni0303.capuni0304 uni0304.capuni0305 uni0305.capuni0306 uni0306.c uni0306.cap uni0306.ccapuni0307 uni0307.capuni0308 uni0308.capuni0309 uni0309.capuni030A uni030A.capuni030B uni030B.capuni030C uni030C.cap uni030C.auni030F uni030F.capuni0311 uni0311.capuni0312 uni0312.guni0313 uni0313.guni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0323uni0324uni0325uni0326 uni0326.auni0327 uni0327.capuni0328 uni0328.capuni0329uni032Auni032Cuni032Euni032Funi0330uni0331uni0334uni0339uni033Auni033Buni033Cuni033Duni0342 uni0342.capuni0345uni0361 uni03080301uni03080301.cap uni03080301.g uni03080300uni03080300.cap uni03080300.g uni03080303 uni03080304uni03080304.cap uni0308030Cuni0308030C.cap uni03020301uni03020301.cap uni03020300uni03020300.cap uni03020309uni03020309.cap uni03020303uni03020303.cap uni03060301uni03060301.cap uni03060300uni03060300.cap uni03060309uni03060309.cap uni03060303uni03060303.cap uni03020306uni03020306.cap uni03040301uni03040301.cap uni03120301 uni03120300 uni03120303 uni03130301 uni03130300 uni03130303uni00A0uni2007 space.frac nbspace.fracuni202FuniFEFFÿÿ ø|7MNlluu……¯±··ÝÞ÷ø..4477FFGGIIPPtv||ŒŒ£¤¼¾ÀÂÄÄÆÓÕÖÚÚßçéìîîððóý  ##-.3377AAEEGGIIOOQQTTXX]]``bbffhhjjpprruuyy‚‚……‰acceepprrxx{{ŠŠ””––œœ¡¡¤¥©©«­ÂÂÒÓááääççéêîîððööûûþÿ  ,-;;ÃÜòó**TTZZrrƒ„žž¡¢¥§©ª¬­¯¯±±³´¶¶ÁÁÃÄÆÆÈÈÑÑ  !>@ik!!!#$&'))++--/033557799;;==@@BBDGUUfgkkmnprttvvxxzz||~~€€‚‚„„††ˆˆŠ äRDFLTcyrl,grekRlatndÿÿ  SRB ÿÿ ÿÿ  ÿÿ !"AZE 0CRT >NSM LSKS ZTRK hÿÿ"ÿÿ#ÿÿ$ÿÿ%ÿÿ&ÿÿ '(kernòkernøkernþkernkern kernkernkernkern"kern(mark.markDmarkZmarkpmark†markœmark²markÈmarkÞmarkômkmk mkmkmkmkmkmkmkmk"mkmk(mkmk.mkmk4mkmk:mkmk@sizeFsizeJsizeNsizeRsizeVsizeZsize^sizebsizefsizej                             ¨¤ œ˜”Œˆ„  (08@HPX`hr 0J¶   f Ê 2 #Ô$Ö$ð% >DfÂ…þ¹®dÅÐÆ4 Î0ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊʃ &,28>DJPV\Vbhntz€†Œ’˜&žž\¤\\ª°Vž¶¼ÂȶÎÔÚÈàæìòòztøPPPVVþ\  bhn&z€Œ ’’"¶(¶8.4:ž@FÔL@RX&^\Œdjpv|‚\zz\ˆŽ”𠦬²¸¾ÄÊÐÖÜâøøuÚ øÚøÖäûøsÚq¦t¦qÚ˜øø øÇøÒøy øÚøVøËøåøÜøžøsøÁø öøø øøêøôöëøáøÖøýøyøøœø øŸøÁøgøø ø² öøïøøø!øLøøøùø>øøçøKøÈø{øüøá2 22÷2!2x2282&222ã2Â2 Å ¼'øÈÃÊ ŠPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPhØÞäêðöü &,2,ö8>DJPV\ÞØbðhntzD€†Œ’˜žžØ¤ðª°¶,¼DðÂ>ÈÎ,\\,ÔÚàæìòøþ "(.(4:@FLRX^dÔjì((@FF†àpìv|‚ˆ©©©A©.©©©Y©>©x©U©2©y©`©C©F©'©©©<©õ©©ò©ß©D¶E©©J©D©S©O©-øy2úøœ©©{©Fª8ªé©Š©©©©á2 2 D222.2!2x2'22~282&2222ô2ã22Õ2L2Ö2Â2÷2Ù2 )ª#ÍÁ†ÁŒ   øÚøÁpÁx && "(.4:@FLRRRFXS  ÚÎîÛ'Á"ÁD j€€€€€€€€€€€€€€€€€€€€€€€(.4:@F4LRX^djLpv:|‚ˆŽ”𠦬²¸¾ÄÊЦÖÜâÖèî¸ôúÖ $ˆ4*Ö¸¦²0¦²¾6<BHN<T¾ ¦Z`èèflllÖ<Br x~<„ЦN– œ¢î¨F®´RºdâÀ¾¢v0ÆÌÒØ–Þxä¢ÌÒ œ¨ä´RdÀ¾¢vÌx¢¨.ÿêÿê'ÿêSÿê,ÿê+ÿêyÿê>ÿêxÿêôÿêEÿê ÿêbÿêFÿê{ÿê ÿêÿê<ÿêøÿê…ÿêïÿêáÿêÿêõÿêÿê ÿê&ÿêÿêzÿêúÿqÿê0ÿÿê¡ÿêÿêmÿ&§ÿ&ÚÿêÇÿêÿêVÿêËÿê¸ÿDÿêªÿêÿêöÿêÿê ÿêéÿê÷ÿê ÿœÿêüÿê­ÿêÿêÿêÀÿêžÿê ÿê´ÿ&sÿêLÿêÿêÿê ÿê(ÿê!ÿêÈÿê8ÿêýÿêãÿêÿêÕÿêÞÿêþÿ꿽¢   ñ'ñ¾æ¾ì "(.4:àˉhàêœîÁ šà¾¬¾²  $*06*<BHNT—€ˆ:œHæé'¾`¾f " "(.4:@@FL.RXRË_F<ƒlE¹È¾ Î0ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊøÙ¨½6Œ"4^hntz€†ŒBàªð:@ Ê T Z l z „ Š æ ø   B h ~ ” º à þ    > d Š ° Ö ü"HZl~¢´ºÄÊÐÖÜæìòü $.4:@Fpv|‚ˆŽœ¢´Þü0N|’¤¶¼â<V€š°þLRX^„¦¬²¸"4FLbt†œ²¸ÒØÞð2<^|Žœ®Øî 4v?%@'A'B% =>?:@=A=B:C7DGH:xz±ÿþ±ÿþ±ÿþ±ÿþ±ÿþ±ÿþ-ÿëÿöÿÿÿë7ÿ÷ÇÿëÈÿëÉÿëÊÿëËÿëÌÿëäÿÿåÿÿæÿÿçÿÿèÿëéÿëêÿëëÿëìÿëíÿëîÿëïÿë¶ÿ÷·ÿ÷¸ÿ÷¹ÿ÷ºÿ÷ûÿ÷üÿ÷~ÿêƒÿö…ÿöŒÿöÿöŽÿöÿö’ÿö“ÿö£ÿĪÿê¬ÿê­ÿê ÿö ÿö§ÿìÿõÿëÿö ÿý!ÿý"ÿý$ÿö,ÿý.ÿý3 4 5ÇÿìÈÿìÉÿìÊÿìËÿìÌÿìèÿëéÿëêÿëëÿëìÿëíÿëîÿëïÿëúÿöûÿöüÿöýÿöþÿöÿÿöÿöÿöÿöÿöÿöÿöÿöÿöÿö ÿö ÿö ÿö ÿö ÿöÿöÿöÿöÿöÿöÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿý ÿý!ÿý"ÿý#ÿý$ÿý%ÿý&ÿý'ÿý(ÿý)ÿý*ÿý+ÿý,ÿý-ÿý.ÿý/ÿý0ÿö1ÿö2ÿö3ÿö4ÿö5ÿö6ÿö7ÿöcÿýdÿýeÿýfÿýgÿýhÿýiÿýjÿýkÿýlÿýmÿýnÿýoÿýpÿýqÿýrÿýsÿýtÿýuÿývÿýwÿýxÿýyÿýzÿý{ÿý|ÿýª « ¬ ­ ÄÿýÅÿýÆÿýÈÿýÐÿýÑÿýÒÿýæÿýçÿýèÿýÿýÿýÿýÿýÿýÿýÿýÿýÿý ÿý!ÿý"ÿý#ÿý$ÿý%ÿý&ÿý'ÿý(ÿý)ÿý*ÿý+ÿý,ÿý-ÿý.ÿý/ÿý0ÿý1ÿý2ÿý3ÿý4ÿý5ÿý6ÿýŒÿõÿõŽÿõÿõ’ÿõ“ÿõ”ÿõºr ÿìÿìÿëÿöÿöÿìÿñ#ÿÿ$ÿö1ÿõ3 4 5ÿþ7‡ÿì¿ÿìÀÿìÁÿìÂÿìÃÿìÄÿìÅÿìÇÿëÈÿëÉÿëÊÿëËÿëÌÿëäÿöåÿöæÿöçÿöèÿìéÿìêÿìëÿììÿìíÿìîÿìïÿìúÿñûÿñüÿñýÿñþÿñÿÿñÿñÿñÿñÿñÿñÿñÿñÿñÿñ ÿñ ÿñ ÿñ ÿñ ÿñÿñÿñÿñÿñÿñ0ÿö1ÿö2ÿö3ÿö4ÿö5ÿö6ÿö7ÿöŒÿõÿõŽÿõÿõÿõ‘ÿõ’ÿõª « ¬ ­ ¶·¸¹ºóÿõûüÿÿÿÿÿÿ@ÿÿƒÿö…ÿöˆŠŒ  Ž  ’ “ ¡ÿõ£ÿغ»ÿô ÿö ÿö–ÿÿ—ÿÿQ ÿØÿìÿÿÿþÿÿÿì'ÿö7ÿë‡ÿØÇÿìÈÿìÉÿìÊÿìËÿìÌÿìèÿþéÿþêÿþëÿþìÿþíÿþîÿþïÿþðÿÿñÿÿòÿÿóÿÿôÿÿúÿìûÿìüÿìýÿìþÿìÿÿìÿìÿìÿìÿìÿìÿìÿìÿìÿì ÿì ÿì ÿì ÿì ÿìÿìÿìÿìÿìÿìJÿö¶ÿë·ÿë¸ÿë¹ÿëºÿë¾ÿöÏÿöãÿöñÿöòÿöûÿëüÿëwÿìxÿì{ÿì†ÿì‡ÿìŒÿþÿþŽÿþÿþ’ÿþ“ÿþŸÿì£ÿõº8»ÿìÿõÿâÇÿìÈÿìÉÿìÊÿìËÿìÌÿìèÿâéÿâêÿâëÿâìÿâíÿâîÿâïÿâ£ÿâÿìb ÿÔÿöÿé$ÿö'ÿ÷0ÿö347ÿö‡ÿÔðÿöñÿöòÿöóÿöôÿöúÿéûÿéüÿéýÿéþÿéÿÿéÿéÿéÿéÿéÿéÿéÿéÿéÿé ÿé ÿé ÿé ÿé ÿéÿéÿéÿéÿéÿé0ÿö1ÿö2ÿö3ÿö4ÿö5ÿö6ÿö7ÿöJÿ÷„ÿö…ÿö†ÿö‡ÿöˆÿö‰ÿöŠÿöª«¬­¶ÿö·ÿö¸ÿö¹ÿöºÿö¾ÿ÷Ïÿ÷ãÿ÷ðÿöñÿ÷òÿ÷ûÿöüÿöwÿÙxÿÙ{ÿÙ‚(ƒÿþ„(…ÿþ†ÿÙ‡ÿÙˆÿìŠÿìŒÿëÿëŽÿëÿë’ÿë“ÿë”ÿíŸÿØ¡ºO ( ÿþ ÿþ (b ÿÔÿöÿé$ÿö'ÿ÷0ÿö347ÿö‡ÿÔðÿöñÿöòÿöóÿöôÿöúÿéûÿéüÿéýÿéþÿéÿÿéÿéÿéÿéÿéÿéÿéÿéÿéÿé ÿé ÿé ÿé ÿé ÿéÿéÿéÿéÿéÿé0ÿö1ÿö2ÿö3ÿö4ÿö5ÿö6ÿö7ÿöJÿ÷„ÿö…ÿö†ÿö‡ÿöˆÿö‰ÿöŠÿöª«¬­¶ÿö·ÿö¸ÿö¹ÿöºÿö¾ÿ÷Ïÿ÷ãÿ÷ðÿöñÿ÷òÿ÷ûÿöüÿöwÿÙxÿÙ{ÿÙ‚(ƒÿþ„(…ÿþ†ÿÙ‡ÿÙˆÿìŠÿìŒÿëÿëŽÿëÿë’ÿë“ÿë”ÿíŸÿØ¡ºO ( ÿþ ÿþ (ÿõŸÿì£ÿžº8»ÿæ£ÿ²ºÿè»ÿèº8»6ÿá-&jÿüÿìîÿ¦ðÿ¦úÿÊûÿÊüÿÊýÿÊ ÿþ ÿþ  ÿê""ÿ¦ ÿ¦Dÿ¦Fÿ¦pÿü±ÿú ÿÿÿÿ ÿÿÿÿÿÿÿÿ úÿüûÿüüÿüýÿü ÿþ  ÿå úÿüûÿüüÿüýÿü ($$   úÿüûÿüüÿüýÿü ($$ úÿüûÿüüÿüýÿü ($$   (ÿÿÿÿzz¯ÿþxz¯ÿü úÿüûÿüüÿüýÿü ($$ úÿüûÿüüÿüýÿü ($$ úÿüûÿüüÿüýÿü ($$ úÿüûÿüüÿüýÿü ($$ úÿüûÿüüÿüýÿü ($$ úÿüûÿüüÿüýÿü ($$ úÿüûÿüüÿüýÿü ($$ úÿüûÿüüÿüýÿü ($$ƒÿþ…ÿþ ÿþ ÿþƒÿþ…ÿþ ÿþ ÿþƒÿþ…ÿþ ÿþ ÿþƒÿþ…ÿþ ÿþ ÿþƒÿþ…ÿþ ÿþ ÿþƒÿþ…ÿþ ÿþ ÿþw$±ÿÖÿʯÿü±ÿó¯ÿü¯ÿü±ÿÖÿʱÿóS±ÿÖÿʱÿÖÿʯÿü¯ÿü±ÿó±ÿó¯ÿüxz¯ÿü¯ÿü š €$$‚6ƒ$„6…$ 6 $ $ 6è$è$¯ÿüÿýÿýè$xz¯ÿüNÿöOÿõPÿöTÿë MÿöNÿãOÿíPÿöQÿØRÿöSÿíTÿáVÿì­ÿáNÿöOÿöPÿõRÿöTÿõVÿö­ÿõNÿìOÿöPÿöRÿôTÿìVÿõNÿêOÿöPÿõRÿöTÿëVÿõNÿôOÿõPÿõRÿöTÿìVÿö­ÿõ MÿëNÿíOÿìPÿìQÿ¥RÿãSÿâTÿíUÿâVÿì­ÿÖNÿëPÿöTÿëVÿë­ÿõNÿìOÿöPÿõTÿëdÿîeÿöfÿõjÿìjÿì cÿödÿâeÿöfÿëgÿôhÿëjÿâlÿö­ÿódÿöeÿöfÿõhÿõjÿìlÿó­ÿõdÿëeÿöfÿëhÿëjÿâlÿë­ÿëdÿâeÿöfÿõhÿõjÿálÿõ­ÿödÿëeÿöfÿõhÿõjÿálÿö cÿëdÿìeÿöfÿögÿ×hÿëiÿöjÿìlÿö­ÿìdÿëeÿöfÿöhÿöjÿëlÿõdÿìeÿöfÿöhÿöjÿâYZ8[&\8^&_a&Œ—$˜8Ÿ$ 8©$ª8µ¶&¾ÆÇ&YZ8[&\8^&_a&Œ—$˜8Ÿ$ 8©$ª8µ¶&¾ÆÇ&ÉÿþÉÿþÉÿþ =?L@LALBLCLHLJL‘6ŽÿØ™ÿì¸ÿìèÿêóÿêÿêÂÿêÉÿþÉÿþÉÿþxZwÿ®xÿ®{ÿ®†ÿ®‡ÿ®ÃÿÙÅÿãÉÿãÌÿŠÑÿãÓÿãÕÿÚÜÿÛÝÿÙÞÿÙßÿÙàÿÙáÿÙâÿÙãÿÙäÿÙåÿÙæÿÙçÿÙèÿÙéÿÙêÿÙëÿÙìÿÙíÿÙîÿÙïÿÙðÿÙñÿÙòÿÙøÿãùÿãúÿãûÿãüÿãÿãÿãÿãÿãÿãÿãÿãÿãÿã,ÿŠCÿãDÿãEÿãFÿãGÿãHÿãIÿãJÿãKÿãLÿãMÿãNÿãOÿãPÿãQÿãRÿãSÿãTÿãUÿãVÿãWÿãXÿãYÿãZÿã[ÿã\ÿãdÿÚeÿÚfÿÚgÿÚhÿÚiÿÚjÿÚkÿÚ–ÿÛ—ÿÛ˜ÿÛ™ÿÛšÿÛÿÏØÿáàÿáêÿá÷ÿáØÿáàÿáêÿá÷ÿá±ÿدÿþØÿîàÿ÷êÿ÷÷ÿîØÿáàÿáêÿá÷ÿáØÿ÷àÿ÷êÿ÷÷ÿ÷¯ÿþØÿîàÿ÷êÿ÷÷ÿî¯ÿþØÿîàÿ÷êÿ÷÷ÿî±ÿØšœž¯±³±ÿرÿØØÿáàÿáêÿá÷ÿá¯ÿþØÿîàÿ÷êÿ÷÷ÿîØÿ÷àÿ÷êÿ÷÷ÿ÷ÿý¯ÿþØÿîàÿ÷êÿ÷÷ÿî ÿ÷ÿñ ÿ÷ ÿöÿúÿçÿðÿôÿòÿð ÿðÿöÿÛÿöÿõÿíÿí ÿøÿõÿöÿí ÿôÿöÿí ÿõÿ÷ÿõÿö  ÿõ ÿö ÿõÿõÿÓÿçÿíÿíÿöÿô ÿï ÿöÿöÿñÿö ÿð ÿöÿöÿè ÿõÿô NÿêOÿöTÿÞVÿódÿëeÿôfÿóhÿójÿ×lÿýMÿöNÿíOÿëPÿëQÿ›RÿëSÿäTÿìUÿíVÿöcÿëdÿâiÿâjÿákÿëlÿöOÿöPÿöeÿöfÿëhÿöjÿë N OPQÿìRdÿöefghk lÿö§©òª2 ÿìÿöÿöÿõÿôÿôÿôÿú&&&&&&&&&¦¨ª ªÿõÿìÿìÿí¦”ªª.ÿë ÿôÿâÿôÿâÿõÿë ÿôÿâÿôÿâÿõÿõÿõÿËÿÆÿØÿõÿöÿõÿìÿôÿöÿõÿöÿõÿìÿôÿö¥òª`ªúyÿôÿúÿ°ÿæÿÈÿÜÿÄÿöÿ²ÿ°ÿžÿõÿëÿáÿõÿÖÿÔÿãÿìÿáÿÖÿÔÿâÿØÿõÿëÿìÿëÿìÿÖÿóÿöÿêÿóÿëÿêÿìÿäÿôÿãÿãÿöÿíÿãÿõÿöÿõÿìÿâÿôÿõÿ·ÿžÿìÿìÿÆNÿ ÿ ÿ²ÿÛ&ÿëNÿ ÿÛÿìÿÆÿöÿÛÿ²ÿì&ÿâ&ÿìÿöÿâÿëÿØÿöÿ÷ÿëÿöÿöÿØÿõÿìÿõÿÔÿâÿëÿôÿöÿÔÿôÿØÿëÿâÿôÿíÿ÷ÿíÿöÿõÿÛÿÛÿôÿíÿí ÿõÿØÿÈÿìÿÃÿÃÿ×ÿÃÿìÿ×ÿöÿìÿØÿìÿÈÿìÿëÿëÿìÿìÿëÿôÿíÿëÿìÿìÿêÿõÿíÿÖÿáÿ×ÿëÿëÿìÿìÿ×ÿõÿöÿõÿõÿöÿöÿ×Cÿ®ÿ®ÿ¼Cÿ®ÿáÿ×ÿáÿ¼ÿÒÿìÿæÿÒÿæÿÒÿìÿæÿóÿóÿèÿóÿëÿëÿèÿÒÿóÿëÿõÿìÿÆÿõÿìÿìÿØÿÆÿõÿìÿÆÿØÿõÿÚÿíÿì  ÿÚÿíÿÆÿìÿìÿÆ ÿìÿÚÿíÿÚÿíÿì & ÿÚÿíÿ²ÿìÿì &ÿ² ÿì ÿÚÿíÿÐÿíÿì  ÿÐÿíÿžÿìÿìÿž ÿìÿÐÿíÿ÷ÿºÿºÿÕ$ÿö$ÿØÿØÿØÿ×ÿ×ÿëÿ×ÿöÿöÿëÿ×ÿö$ÿ°J$ÿ°ÿõÿìÿèÿöÿöÿôÿõÿýÿõÿýÿìÿöÿìÿöÿìÿØÿëÿñÿöÿëÿýÿõÿöÿâÿôÿìÿöÿìÿõÿìÿØÿ놙ž@KEÿõÿëÿöÿëÿöÿÄÿ¼ÿÖ ÿ÷ÿâÿöÿöÿ÷ÿöÿøÿíÿêÿÛÿØÿÐÿõÿÔÿõÿõÿÉÿœ ÿëÿ÷ÿöÿöÿ÷ÿï ÿõÿìÿÆÿÔÿØÿ¹ÿØÿõÿõÿöÿöÿöÿõÿöÿëÿõÿìÿâ   ÿì ÿõÿìÿûÿñÿõÿõÿöÿöÿõÿöÿìÿõÿëÿõÿö  ÿöÿïÿõÿõÿùÿíÿú ÿøÿõÿìÿûÿêÿìÿóÿêÿëÿìÿØÿèÿöÿõÿöÿöÿëÿõÿöÿõÿìÿìÿõÿöÿëÿöÿìÿöÿØÿñÿõÿôÿìÿì ÿö ÿöÿöÿöÿìÿöÿë ÿõÿíÿöÿöÿéÿöÿö1EC(ÿ×ÿìÿì&((OZOÿñÿöÿõ1ÿõÿö9ÿìÿõÿõ ÿöÿ¹$$ÿ¨ÿö ÿØÿëÿõÿÄÿõÿáÿÜÿöÿðÿñÿëÿâ6ÿœÿsÿðÿõÿöÿìÿöÿëÿõÿì ÿïÿ¯ÿìÿñÿÛÿöÿÝÿÂÿìÿèÿöÿõ ÿöÿöÿõÿõÿíÿ«ÿëÿìÿõÿÚÿõÿñÿâÿõÿõ <ÿüÿûÿöÿõÿìÿõÿá  ÿîÿõ  )ÿôÿõÿõÿôÿôÿýÿö ÿêÿØ   ÿë ÿÙÿØÿóÿèÿùÿìÿêÿìÿöÿõÿìÿöÿôÿëÿìÿýÿöÿõÿöÿúÿìÿëÿìÿêÿôÿ÷ÿöÿØ  ÿõÿõÿØÿöÿðÿñÿõÿóÿõÿöÿöÿõÿïÿöÿöÿõÿöÿøÿóÿ÷:ÿõÿõÿØÿ¬ÿúÿ°ÿæÿÈÿÜÿÄÿèÿ®ÿôÿêÿÙÿðÿˆÿµÿºÿÃÿtÿ×ÿêÿõÿÍÿ°ÿõÿìÿöÿèÿìÿÃÿÅÿ°ÿ°ÿ¯ÿíÿæÿáÿæÿõÿÄÿØÿÉÿëÿöÿöÿìÿØÿìÿí ÿìÿôÿÈÿîÿØÿìÿÜÿöÿñÿìÿÛÿìÿô ÿìÿãÿøÿûÿõÿìÿðÿêÿìÿýÿíÿãÿëÿöÿìÿØ  ÿöÿôÿì ÿìÿëÿáÿõÿ÷ÿëÿõÿÙÿøÿìÿëÿÙÿ“ÿîÿÿâÿöÿÏ ÿœÿõÿÐÿÎÿöÿëÿ¢'ÿˆÿkÿöÿõÿÙÿçÿÚÿìÿìÿ¦ÿê"$ÿÙÿíÿëÿõÿö&OÿÔ$$ÿöÿöÿëÿìÿØÿöÿíÿúÿöÿóÿöÿèÿõÿö   ÿö ÿö$ÿøÿëÿòÿöÿàÿâ ÿõÿìÿëÿöÿìÿýÿÃÿý ÿöÿìÿ÷ÿöÿëÿìÿõÿýÿí ÿô%ÿöÿõÿõ ÿµÿØÿëÿ¶ÿáÿìÿõÿìÿêÿöÿì(ÿíÿöÿõÿìÿëÿõÿöÿâÿÚÿìÿöÿÛÿ® ÿãÿÏÿŠÿÛÿÙÿõÿ´ÿëÿõÿ¼ÿ½ÿÞÿÈÿãÿãÿãÿÚÿÈÿìÿœÿÃÿ²ÿØÿëÿÄÿëÿÆÿÏÿìÿÄ(ÿˆÿÿÑÿÚÿØÿÑÿÚÿ²ÿÄÿ²ÿÖÿ®ÿØÿ›ÿÏÿ ÿÈ ÿö )*,N 2ÿÚ***ÿö:ÿûÿìÿì:*ÿõÿÃÿìÿõÿâÿâÿ÷ÿ÷ÿöÿíÿëÿÙÿõ  ÿöÿí ÿöÿÚÿÖÿöÿöÿ×ÿìÿøÿõÿôÿìÿìÿöÿö8ÿØÿëÿöÿìÿöÿöÿíÿÄ&ÿöÿöÿ¼ ÿø ÿÆÿðÿñÿõÿ÷ÿöÿ÷ÿâÿöÿî63ÿ¼ÿ²ÿöÿøÿøÿóÿøÿêÿóÿîÿêÿåÿòÿÆÿìÿ÷ÿëÿøÿëÿôÿñÿöÿõ6ÿâÿôÿöÿõÿ÷ÿ÷ÿîÿÐ ÿûÿ÷ÿ½  ÿáÿíÿ÷ÿ÷/ÿÏÿ´ÿ÷ÿîÿöÿöÿöÿöÿ×ÿëÿÚÿóÿáÿèÿìÿöÿöÿö6ÿôÿõÿëÿìÿõÿöÿìÿì ÿõÿôÿìÿöÿìÿö ÿì  ÿØÿöÿöÿôÿöÿöÿöÿõÿöÿõÿöÿöÿêÿõÿõÿõ ÿìÿìÿì8ÿØÿõÿëÿöÿì ÿöÿõÿöÿöÿìÿ¹& ÿìÿëÿžÿõÿõÿñÿõÿêÿè ÿì ÿêÿîÿ±ÿØÿÂÿõÿêÿõÿßÿáÿöÿã&1ÿœÿœÿñÿõÿëÿáÿõÿÄÿßÿÄÿÔÿÖÿäÿ²ÿØÿõÿýÿãÿÛÿôÿäÿö$ÿ÷ÿöÿöÿøÿãÿ÷ÿ÷ÿ÷ÿîÿÚÿìÿâÿåÿÚÿöÿõÿ÷ÿõÿöÿøÿðÿÄÿíÿ÷ÿìÿíÿìÿäÿöÿíÿÚÿâÿíÿíÿëÿíÿñÿæÿØÿØÿ÷eÌz |®9Fÿô ÿô ÿìÿâÿ¼ÿöÿøÿÖÿíÿêÿÛÿØÿÐÿöÿöÿÔÿÉÿëÿ÷ ÿÏÿöÿõÿõÿõÿìÿÆÿÔÿœÿØÿìÿõÿêÿìÿõÿöÿõÿöÿöÿõÿöÿõ ÿë ÿìÿìÿ÷ ÿöÿõÿõÿâÿöÿ÷ÿ÷ÿìÿöÿãÿÚÿìÿöÿöÿëÿáÿèÿãÿôÿíÿõÿìÿöÿêÿôÿíÿöÿõÿõÿëÿìÿõÿóÿìÿì ÿõÿôÿìÿõÿõÿìÿì ÿØÿõÿôÿöÿöÿöÿöÿóÿëÿêÿõÿõ*ÿé ÿìÿìÿíÿõÿöÿýÿôÿâÿöÿÔÿöÿöÿÌÿÇÿêÿÃÿëÿëÿóÿÉÿÔÿýÿöÿóÿÂÿüÿýÿõÿöÿõÿõÿöÿöÿöÿìÿöÿìÿëÿë ÿíÿëÿéÿöÿíÿöÿöÿëÿíÿõÿêÿèÿöÿöÿìÿØÿüÿüÿöÿöÿüÿöÿÄÿâÿìÿ¬ÿãÿÅÿÅÿìÿÄÿãÿÈÿ¦ÿÈÿžÿìÿ”ÿØÿÄÿôÿôÿÙÿÉÿÏÿâÿxÿŒÿíÿØÿ ÿ¢ÿŒÿÙÿ¿ÿ¬ÿ²ÿ´ÿ·>ÿ¢ÿÚÿÙÿ¹ÿ½ÿöÿêÿìÿ÷ÿöÿõÿóÿóÿèÿìÿìÿóÿùÿêÿôÿòÿôÿëÿìÿýÿõÿìÿëÿìÿýÿêÿêÿõÿôÿõÿØÿöÿõÿðÿêÿöÿóÿØÿöÿôÿöÿïÿöÿêÿóÿóÿžÿõÿéÿôÿÖÿöÿõÿöÿüÿüÿüÿöÿöÿüÿöÿãÿöÿìÿõ ÿõÿÙÿìÿöÿ°ÿÖÿÚÿéÿíÿõÿàÿìÿîÿÚÿáÿëÿè ÿóÿìÿüÿôÿüÿôÿöÿ¥ÿíÿÏÿõÿõÿãÿíÿãÿìÿâÿ÷ÿêÿãÿöÿØÿì(ÿíÿêÿÃÿöÿÙÿëÿìÿÙÿ“ÿîÿÙÿöÿë ÿÏÿâÿœÿõÿÎÿëÿöÿ¢ÿõÿÇÿØÿôÿçÿëÿíÿÖÿçÿÚÿìÿØÿÌ1ÿ¦ÿðÿðÿÈÿöÿìÿôÿØÿìÿÛÿÜÿìÿôÿý ÿöÿõÿãÿìÿðÿêÿìÿìÿýÿíÿöÿì ÿëÿöÿôÿìÿìÿØÿõÿÙÿóÿëÿëÿìÿöÿêÿöÿ÷ÿÜÿîÿíÿÛÿõÿÚÿ÷ÿîÿëÿëÿÙÿìÿÄÿâÿÏÿÅÿëÿìÿìÿîÿêÿìÿöÿíÿöÿíÿØÿöÿÚÿëÿ»ÿäÿäÿÚÿãÿìÿãÿõ )ÿîÿõÿõÿìÿìÿìÿíÿíÿõÿ÷ÿìÿõÿúÿìÿëÿõÿìÿâÿìÿöÿÛÿ® ÿãÿÏÿÛÿÙÿõÿâÿãÿãÿáÿãÿ¼ÿãÿÞÿÚÿÈÿìÿœÿÃÿØÿìÿõÿÄÿëÿëÿõÿÄÿÑÿ·ÿöÿÄÿíÿÙÿÂÿÏÿõÿÄÿÙÿÈÿ²ÿÖÿØÿÉ*ÿµÿÈÿâÿÌÿÏ$ÿ›ÿíÿöÿóÿöÿöÿíÿõÿíÿöÿôÿöÿöÿìÿ¹& ÿìÿëÿõÿõÿöÿöÿöÿöÿêÿØÿõÿê ÿõ ÿêÿîÿ±ÿØÿõÿõÿêÿõÿñÿãÿáÿÕÿßÿìÿãÿßÿØÿüÿßÿõÿØÿÄÿÔÿäÿà>ÿõÿõÿóÿØlÿ²$.ÿù&ÿù6ÿöÿöÿõÿöÿìÿìÿáÿìÿöÿöÿãÿöÿêÿëÿéÿôÿéÿèÿÌ.ÿáÿì&ÿáÿêÿëÿì<ÿõ6ÿøÿ÷ÿîÿÚÿìÿâÿÚÿöÿÙÿíÿíÿøÿðÿÄÿ÷ÿ÷ÿîÿíÿìÿõÿõÿíÿëÿíÿæÿÙÿíÿæÿÙÿäÿØÿØÿãÿàÿÚÿ÷ÿíF¸`Üd¬;pÿöÿõÿëÿêÿöÿÄÿ¼ÿÖ ÿÅÿ÷ÿöÿâÿíÿöÿíÿêÿÛÿØÿÐÿõÿõÿÔÿØÿÉÿœÿÙÿëÿ÷ÿêÿ°$ ÿöÿÆÿöÿöÿõÿØ ÿïÿõÿõ ÿõÿõÿìÿÆÿÔÿØÿ¹ÿØÿáÿ×ÿìÿöÿøÿöÿïÿöÿâÿôÿöÿíÿÙÿÚ ÿíÿÚÿ÷ ÿÔÿÍÿõÿÄÿØÿêÿóÿóÿÖÿíÿôÿìÿÚÿ×ÿœÿÕÿÂÿáÿôÿëÿ¹ÿõÿ°ÿêÿëÿ±ÿÆÿýÿõÿíÿöÿõÿüÿêÿýÿêÿýÿêÿìÿØÿöÿìÿëÿëÿýÿÃÿöÿý ÿëÿöÿìÿìÿöÿëÿìÿâÿýÿíÿöÿìÿôÿöÿñ%ÿêÿöÿöÿöÿõÿó ÿõÿìÿìÿìÿôÿÐÿìÿíÿõ ÿìÿìÿÏÿâÿíÿíÿ°ÿìÿÚÿÖÿìÿõÿõÿéÿÖÿõÿìÿîÿÚÿÄÿëÿÔÿöÿÕÿá ÿìÿíÿíÿÑÿÑÿãÿÙÿøÿëÿìÿìÿ“ÿÿØÿîÿÈÿÈÿöÿâÿÏ ÿœÿõÿÐÿÎÿÇÿöÿÄÿëÿìÿõÿìÿˆÿìÿkÿýÿÅÿÚÿìÿöÿ¢ÿ¢ÿ ÿ ÿçÿ¦ÿõÿöÿìÿìÿõÿöÿöÿö ÿõÿõÿïÿëÿù ÿíÿìÿõÿûÿöÿêÿìÿìÿØÿóÿêÿëÿØÿÖÿìÿØÿØÿØÿìÿèÿíÿìÿõÿöÿõÿöÿìÿõÿëÿ×ÿœÿáÿÇÿõÿõÿÄÿìJÿõÿÐÿöÿöÿöÿÈÿÚÿÐÿöÿõÿëÿÄÿâÿâÿîÿ¬ÿãÿWÿâÿìÿÅÿÅÿ±ÿ±ÿ½ÿâÿÉÿÛÿžÿÈÿ²ÿìÿ”ÿØÿžÿÄÿ½ÿŒÿ³ÿÆÿŠÿôÿÙÿÜÿ´ÿâÿ‹ÿLÿ´ÿÇÿÈÿ:ÿÈÿØÿØÿ´ÿ¬ÿ²ÿÏÿxÿxÿ‹ÿ‹ÿŒÿ¾ÿ¢ÿ²ÿ½ÿ½ÿÚÿóÿëÿÚÿâÿèÿìÿöÿõÿöÿöÿôÿöÿ÷ÿìÿõÿëÿôÿõÿêÿöÿìÿõÿì ÿõÿõÿìÿôÿôÿöÿìÿëÿöÿÖ ÿìÿêÿØÿöÿàÿõÿôÿìÿöÿöÿõÿöÿöÿöÿìÿêÿõÿõÿé ÿöÿöÿëÿêÿöÿØÿñÿõ ÿì ÿìÿöÿíÿöÿöÿöÿìÿöÿõÿëÿä ÿìÿõÿíÿÚÿäÿöÿîÿöÿéÿöÿöÿäÿöÿöÿëÿöÿê ÿöÿí8&ÿÖÿíÿíÿí<&rÿö  ÿöÿí(:(ÿÄ:%ÿÂ:ÿõÿõÿíÿí(<(ÿù*ÿõÿìÿùÿíÿ°ÿíÿöÿÚÿöÿØÿí%*ÿöÿë"ÿ°ÿœÿö:ÿì:ÿÚÿêÿÚÿÚÿÚÿÚ:ÿðÿõÿ÷ÿìÿì:ÿêÿØ  ÿëÿöÿö ÿöÿÙÿØÿôÿêÿýÿöÿô#ÿüÿöÿõÿìÿëÿõÿôÿýÿöÿìÿíÿíÿõÿìÿöÿâÿâÿÚÿÛÿÚÿëÿëÿí%ÿöÿíÿõÿôÿôÿêÿôÿãÿîÿôÿÈÿØÿìÿÜÿöÿñÿïÿôÿìÿÛÿìÿô ÿìÿíÿõÿøÿãÿìÿêÿìÿìÿýÿíÿãÿêÿöÿëÿìÿØ  ÿöÿôÿêÿõÿìÿöÿôÿì ÿìÿõÿëÿõÿáÿèÿäÿíÿöÿëÿëÿöÿõÿáÿìÿ²ÿ±ÿ²ÿÚÿìÿìÿìÿìÿ´ÿ°ÿÔÿõÿöÿöÿàÿôÿöÿÂÿÍÿõÿõÿÍÿÚÿêÿíÿóÿóÿÂÿõÿóÿõÿäÿìÿŠÿÖÿ´ÿëÿöÿëÿíÿöÿ´ÿöÿöÿÆÿíÿêÿ´ÿ ÿöÿöÿìÿëÿíÿéÿõÿëÿéÿìÿøÿõÿõÿìÿâÿ÷ ÿìÿõÿìÿêÿßÿöÿöÿØÿìÿì6ÿíÿÙÿöÿõÿìÿëÿõÿöÿõÿõÿâÿìÿÚÿìÿîÿ®ÿö ÿãÿŠÿãÿõÿÛÿÙÿÏÿÇÿÇÿÐÿöÿ´ÿëÿåÿ¼ÿÚÿ½ÿãÿãÿÞÿìÿœÿÃÿ²ÿØÿÙÿŸÿÆÿÐÿÿìÿÄÿëÿîÿÇÿÑÿžÿˆÿÈÿÑÿÚÿÿÚÿìÿëÿØÿ²ÿÖÿÑÿ ÿ ÿ´ÿ³ÿÄÿ›ÿÑÿµÿÆÿÏÿÏÿÈÿ ÿõÿØ( , ÿõÿö&&8ÿöÿìÿìÿöÿô('ÿöÿìÿõ> ÿöÿöÿ÷ÿöÿõÿëÿêÿìÿöÿÔÿËÿÄÿÙÿêÿêÿóÿóÿÔÿüÿöÿõÿÚÿÂÿÖÿÂÿóÿýÿôÿ»ÿÆÿöÿÄÿÂÿýÿõÿôÿôÿìÿìÿìÿõÿõÿýÿöÿØÿýÿìÿýÿõÿõÿõÿõÿöÿÂÿœÿâÿõÿõÿáÿáÿõÿìÿêÿëÿ×ÿìÿìÿ®ÿôÿëÿØÿìÿõÿÄÿàÿôÿ°ÿêÿá ÿõÿÖÿ˜ÿêÿõÿíÿˆÿíÿìÿëÿèÿìÿêÿØÿêÿõÿÃÿÃÿÄÿÃÿöÿØÿõÿëÿêÿâÿâÿëÿëÿëÿÞÿöÿöÿõÿìÿöÿõÿãÿõÿãÿöÿ÷ÿöÿõÿãÿöÿëÿâÿìÿâ ÿí ÿìÿöÿä ÿäÿõÿõÿöÿöÿûÿöÿõÿñÿõÿìÿ÷ÿõÿøÿøÿÔÿ×ÿôÿØÿÚÿíÿíÿóÿóÿÖÿìÿëÿìÿ ÿÖÿÆÿëÿëÿìÿöÿÆÿÄÿõÿèÿÈÿÄÿìÿöÿìÿöÿôÿìÿõÒ7–8* ŽPÿìÿìPÿì&((ÿö&ÿìÿöÿìÿÃ(((ÿìÿ²ÿö&(ÿ°ÿöÿ°ÿ‡ÿèÿÖÿÔÿíÿÖÿìÿÅÿÆÿôÿãÿÜÿ³ÿžÿìÿêÿÆÿôÿÖÿ¥ÿôÿãÿÜÿ³ÿžÿºÿôÿãÿÜÿ³ÿžÿìÿðÿìÿÅÿÆÿñÿÐÿáÿìÿºÿÃÿ¯ÿ³ÿöÿõÿâÿâÿêÿâÿâÿöÿöÿöÿÛÿìÿêÿØÿêÿìÿöÿÛÿÄÿÄÿöÿì ÿîÿãÿÛÿÖÿõÿÆ ÿØÿãÿÛÿÖÿãÿÛÿÖÿîÿöÿôÿëÿõÿêÿõÿöÿëÿóÿìÿëÿõÿõÿêÿêÿêÿìÿôÿõÿêÿìÿìÿêÿêÿöÿäÿöÿäÿõÿôÿõÿõÿØÿÆÿìÿõÿõÿØÿõÿõÿõÿØÿôÿôÿõÿìÿõÿìÿìÿìÿìÿõÿÚÿìÿõÿöÿõÿöÿõÿõÿõÿõÿäÿõÿõÿîÿâÿèÿôÿâÿîÿÔÿÔÿØÿêÿÚÿÙÿØÿÄÿÚÿÙÿØÿõÿÚÿÙÿØÿêÿöÿõÿâÿôÿëÿõÿõÿêÿõÿìÿõÿëÿõÿëÿâÿëÿõÿëÿìÿìÿÚÿìÿÙÿìÿÙÿÚÿìÿóÿÚÿ½ÿÄÿÀÿìÿÀÿØÿÄÿÄÿìÿìÿÚÿìÿÚÿÄÿìÿÚÿìÿÄÿÚÿìÿõÿëÿõÿüÿÐÿÉÿö8ÿÉÿîÿÚÿÄÿÉÿÚLÿìÿìÿÚL::ÿìÿ ÿÐÿÉÿõÿÚÿöÿÅÿ ÿÉÿÆÿõÿvÿÙÿ½ÿÄÿ¾ÿ¾ÿ×ÿÄÿìÿÚÿ¶ÿ¶ÿÚÿ¶ÿ¶ÿëÿØÿØÿ´ÿÓÿÇ:ÿÓÿÖÿ ÿ´ÿÓÿíÿÈÿÇÿˆÿ ÿÉÿõÿîÿîÿãÿØÿ°ÿ¬ ÿ¬ÿÖÿ®ÿÚÿÛÿÛÿÚÿÛÿÛÿöÿöÿÚÿöÿöÿöÿÔÿìÿÔÿÔÿÔÿìÿ˜ÿ¶ÿê0!#$&')+-/03579;=@BDEFGUfgkmnpqrtvxz|~€‚„†ˆŠ‹ŒŽƒ !"#$%&'()*+,-./01234567.GItuv|£¤¼½¾ÀÁÄÇÈÉÊËÌÍÎÏÐÑÓÕÚàáâãäåæçéêëìðóôõö÷øùúûüý#-.7bfhjpruyceäçéêîðöûþÿ ,-;¡¢¥¦§©ª¬­¯±³´ "%(*,.12468:<>AChlosuwy{}ƒ…‡‰h MNl…¯°±·ÝÞ÷øÒßî Š”–œ¡¤¥©«¬­ÂÒÓáÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜòó*TZrƒ„ž¶ÁÃÄÆÈÑJ VW  01ÅÕÖr³¶ HILTZ` beii-7±±3ÞÞ4÷÷56II7vv8¤¤9¼¼:ÀÂ;ÆÊ>ÌÎCÑÓFÕÖIÚÚKßáLççOéìPîîTõúU  [\##]..^77_bb`ffahhbyycÃÒdÔÜtTT}rr~„„¡¢€¥§‚©ª…¬­‡¯¯‰±±Š³´‹¶¶ÃÃŽ  aK,2Ñ× X "&,2IÀÇÊ Y  Ú ÃÇËÑ×T'35Œ 5vwxyz{ÀÄÇÓÕßéìî÷øùúûCFJRSTVW_`gowz¼½¾¿ÀÁÂà  bŽ¡¤§±¿ÃÄÅÐÕâãèýþ $*,-./MOPQRSTUVcdefghijklˆŠ™›Ÿ®°²Ór¿ÀÁÂÅÓÔ×áñòóõøüý   ¨©ª¬ Úîm€‚ƒ„…†‡>—˜ñòþß÷øùúqÒÖ,-Tj}”Ÿ¡ú   "%(!<II3KP4RU:Wº>¼½¢ÀĤÇÈ©ÊÊ«ÎάÑÓ­ÕØ°àã´åæ¸èéºìí¼ïð¾óóÀööÁûüÂÄ6Å99õÃÊöÌþ,0Q2›V À——ÄAprd0ff#pp$¡½%ëìB!Š“–™µ ·»(¾Æ-ÉÊ6ÍÍ8ÐÑ9ÔÕ;ר=Ûê?íðOó Sn r#${''}*+~.1€5=„¾ÅÈÈ•ÌÌ–ÎÔ—×ØžÚÜ Þã£çë©íí®ïù¯üýº¼ Á w|~~€’“™™››©®°°"²²#  $ îîmm €€‚‚ ƒƒ„„……††‡‡$  "##$$,,..11334466SWnvž·/07c|Œ’ª­®µÄÆÈÈÐÒÓÓæèóó  6@@ÛÛ Ž• –—ddnnttww˜˜ññòòþþ%ääåå èèéé óóöö ùù úúûûüü ÿÿ    ''++ ,-//5677 :; <=ÐÐ ÕÕ ØØ àà êê ïï ÷÷ ýý ÷÷øøùùúúqq ÒÒÖÖ,,--TTjj}} ”” ŸŸ¡¡úú   <\m m tmm];<>@_B`j "l##k$$8&&s'':,,l..l11v22w33=44?55^66A77x8M\QQ7SWm[[7nvmzz9‡‡tž·m¿Å]ÇÌ;Íã<äç@èïBðô`õõ7÷÷uúj/l078=HsJJ:c|lŒ’v“©wª­?®µA¶ºx¾¾:¿¿sÀÀwÄÆlÈÈlÏÏ:ÐÒlÓÓAÕÕwàáwãã:æèlñò:óóvööwûüxkk6l@@kAASDDVFF[HHiKKSNNZOOiRRYSS5TT6VVUWWXYYr``6bbaddbllWnncppdssdttevvdwwTyzd}}d~~aƒƒd††d‰’r“”SÂÃ6ÎÎSÏÖréõa d3=d>IaVadcddŠŠLŽŽQ““&™™œœhŸŸh  3¡¡¢¢££O¥¥¨¨3««&­­#°°3²²h³³M··q¸¸ºº3¿¿ÁÁPÂÂhÃÃ1ÆÆQÉÉ&ÍÍ3ÑÑhÔÔOÕÕØØQÛÛLàáhâãääfååæçèèéégêê'íí$îðóóôõöög÷÷ùùgúúûû4üügýýNþþÿÿ! g    gp24g0  '##$$$''**++g,-0..N//11'56f77g99:;g<=4wx {{ ~~ € ‚‚ ƒƒ „„ …… †‡ ‰‰)‹‹)ªª ¬­ ÂÂsÃÃÅÅÉÉÌÌ.ÑÑÓÓÕÕÖÖ×רØÙÙÚÚKÛÛÜÜ/Ýòøü,,.C\dkllomrs‰ŠŽ•–š/¡¡R¦¦J¨¨n««R¯¯n³³H´´I¶¶GººI»»R¾¾*¿ÁÂÂÃÃÄÄ(ÅÅ%ÆÈÉÉÊËÌÌ,ÍÎÏÏ,ÐÐÑÑ-ÒÒ+ÓÓDÔÔÕÕÖרØÙÚÛÛ%ÜÜÝÝ"Þßààááââ,ããCäåççFèèééêêëìíí-îîïï ðð,ññEòòôô(õõ%öö÷÷øøùù,üüDýýþÿ(*, -ëëV      –—k¿)    ")+).15;>ADGJ' ""## $$%%#(()) *+#,-'..9//,00/11322933<44?55B66E77H8MNP QRSWX[)\m nvwyzz{†‡‡ˆŠ‹‹"ŒŒ’"“ž¯)°° ±¶&··)¸¾.¿Å1ÆÆÇÌ5ÍÝ;Þã8äçAèïGðôJõõ)öö2÷ø)ùù'/078<#II9KNOO PPRU Wb#ct'uuv{$||'}ƒ,„Š/‹‹Œ’3“£9¤©6ª­?®µE¶ºH¼¼'½½#ÀÀÁÃ'ÄÄÇÇ'ÈÈ9ÊÊ'ÎÎ'ÑÑ9ÒÒÓÓEÕÕ9Ö×#ØØ9àá9âã#åå9ææ'èè'éé9ìí,ïï9ðð/óó3öö'ûüH 3 6999ÃÃÄÄÅÅÆÆ(ÇÇ ÈÈ ÉÉÊÊÌÌÍÍÎÎ!ÏÐÑÑ(ÒÒ*ÓÓ(ÔÔ-ÕÕ0ÖÖ4××:ØØ=ÙÙ@ÚÚCÛÛFÜÜIÝòóõ ö÷øüý( ,,-/00!27!8BCR(SS TY%Z\(]c-dk0llmr4sƒ:„‰7Š@Ž•F–šI››(ž(Ÿ —— ¶  )*4  "0##$$/&&B''7*+;,,0--;..0//;00112233+44,55-66.7758MNP@SWnv‡‡)ž·¿Å*ÇÌÍãäç4èïðô ú>/007/<<>=HBII;JJ7NN;Wa;c|0}ƒ;„ŠŒ’“©ª­,®µ.¶º5½½;¾¾7¿¿BÀÀÁÁ;ÄÆ0ÈÈ0ÉÉ;ÏÏ7ÐÒ0ÓÓ.ÕÕØØ;ÚÚCßß;àáââ;ãã7äå;æè0ìì;îî;ððñò7óóööøøDûü5 =60@@wxyz{{||9~~!€#‚‚"ƒƒ„„"……†‡ˆˆ2‰‰6ŠŠ2‹‹6Œ1’“1””šš8œœ8žž8ŸŸ:¡¡$££©©9ªª!««9¬­!¯¯8±±8³³8ºº%»»&ÂÂBÃÃÄÄAÅÅÆÈAÉÉÊÊAÌÌ(ÍÐAÑÑÒÒAÓÓÔÔAÕÕÖÖ ×× ØØ ÙÙ ÚÚ ÛÛÜÜÝòóõ?÷÷AøüýÿAAA,,(-6A8BAC\]cAdkmr s‰ Š Ž•–šœœAž A'!!3##<  "    "–—pAABBCCDD EEFF8GG+HH#II+JJKKLM+NN5OO#PP+QQ RR(SS.TT2UUVVWWXXYYZZ[]+^^#_`2aaccddee ff gg6hhii/jjkkllmmnnoo3pp!rr!ss&tt,uu0vv!wwxx0yy!zz%{{||/}}! €€‚ƒƒ!„…0††!‡‡ˆˆ0‰”•œ²+³º#»» ¼Ã2ÄÍÎèöý þ "!#203=!JUVa!bbcc!dd)ff$pp¡¡¢¢££¤¤ ¥¥ ¦¦7§§*¨¨"©©*ªª««¬­*®®4¯¯"°°*±±²²'³³-´´1µµ¶¶··¸¸¹¹*ºº1»½*ëë ìì‘AADD>FFHHKKNN%OORR$SSTTUU5VVWWXXYYB``bb&cc'ddee(ff)gg;hh*ii-jjkk*ll+mm?nnoo:pp,qq3rr"ss,ttuu.vv,ww!xx.yz,{|-}},~~&)€€*‚‚4ƒƒ,„….††,‡‡4ˆˆ.‰’B“”ÂÃÎÎÏÖBààéõ&öý)þ*    4   4 ,!""#2.3=,>I&JU*Va,bb*cd,ee?ff9ppwx yz {{ ||0~~€‚‚ƒƒ „„…… †‡ ˆˆ1‰‰2ŠŠ1‹‹2Œ/’“/””ššEœœEžžEŸŸC¡¡ ££©©0ªª««0¬­¯¯E±±E³³Eºº7¡¡¢£6¤¤<¥¥6¦¦ §§6¨¨©ª6««¬­6®®@¯¯°±6²²A³³´´ µµ8¶¶··¸¸=¹¹6ºº »»¼¼6½½=###Dëë>ìì      ¢ŠŠ‹Œ8ŽŽ/!““8”•)––!™›)œœ$)žž ŸŸ  ,¡¡5¢¢ ££¤¤/¥¦)§§/¨¨'©©)ªª'«¬$­­)®¯°°±±²²³³ ´µ)··¸¹'ºº2»»!¾¾)¿¿5ÀÀ)ÁÁ:ÂÂ$ÃÃÄÅÆÆ!ÉÉ8ÊÊ!ÍÍ!ÐÐ/ÑÑÔÔÕÕ/××)ØØ!ÛÛÜÝÞÞ$ßß)àá$âã5ååææ6ççèè-ééêêíí6îï(ððóõ(öö"÷÷(øø"ùùúú*ûû3üü"ýýþþ-ÿ(-%(%"(         %0(3(%"  ##6$$''**-++..//-000116788"99(:;"<=3¾¾¿À7ÁÁÂÂ.ÃÃÄÄ ÅÅ7ÈÈ ÌÌ#ÎÎ ÏÏÐÐ+ÑÑ4ÒÒ ÓÓÔÔ.××.ØØ&ÚÚ&ÛÜ#Þßààááââããççèé&êê1ëë íí4ïï9ðð#ññòóôô õõ7ö÷ øø.ùùüüýý. ## 4h% % j%%(*-02k###11'33+6618MhSW%nv%‡‡jž·%ÇÌ(Íã*èï2ðôkŒ’'®µ1ÓÓ1óó'## i@@#ŠŠ‹nŽŽQnS““G”–n™™Rš›nœœ žnŸŸ   ¡¡E¢¢Z££¤¤n¥¥¦§n¨¨©ªn««G¬¬n­­F®¯n°°±±n²² ³³N´µn··C¸¸R¹¹nºº»»n¾¾n¿¿EÀÀnÁÁ! ÃÃÄÄnÆÆSÉÉGÊÊnÍÍÐÐnÑÑ ÒÒIÔÔÕÕÖ×nØØSÛÛÜÜmÝÝnßßnàá âãEääååAæç_èèééUêêJëëWíí"îð_óóôõ_ööU÷÷_øø^ùùUúúûûDüüUýý:þþ_ÿÿ___; U  <  _  U  e=_<__D_UB_[  J##"$$_''**_++U,-B..://11J5677U88\99_:;U<=Dwxyz{{||a~~4€6‚‚5ƒƒ„„5……†‡ˆˆL‰‰HŠŠL‹‹HŒK’“K””ššfœœfžžfŸŸV¡¡7££©©aªª4««a¬­4¯¯f±±f³³fºº8»»9ÃÃbÅÅ$ÉÉ$ËËoÌÌcÑÑ$ÓÓ$ÕÕ&ÖÖd××)ØØ,ÙÙ.ÚÚ/ÜÜ3Ýòbøü$$ +o,,cC\$dk&mrds‰)Š.–š3¾¾¿Á`ÂÂOÃÃ`ÄÄTÅÅ@ÆÈ`ÉÉPÊË`ÌÌÍÎ`ÏÏÐÐ ÑÑ?ÒÒXÓÓ ÔÔ`ÕÕÖ×`ØØ ÙÚ`ÛÛ@ÜÜ`ÝÝ]Þß`àà áá`ââãã äå`çç>èèPéé`êê ëì`íí?îî`ïï ððññ òò`ôôTõõ@öö`÷÷ øø`ùùúúüü ýýþÿ`Tl`` ?M!!Y##g  5    5–—#wxyz{{||~~€ ‚‚ƒƒ „„…… †‡ˆˆ‰‰ŠŠ‹‹Œ’“©©ª«¬¬­­      A X247:Z[€ ".##‚$$ƒ'' *+Œ,,.--Œ...//Œ00„11033544855Y66;778MNP‡‡ ¿ÅXÇÌ2Íã4äç:èïðô[ú€/.07ƒ<<IIŒJJ NNŒWaŒc|.}ƒŒ„Š„Œ’0ª­8®µ;¶º½½Œ¾¾ ÁÁŒÄÆ.ÈÈ.ÉÉŒÏÏ ÐÒ.ÓÓ;ØØŒßߌââŒãã äåŒæè.ììŒîîŒðð„ñò óó0ûü‚‚6.@@‚AAqDDuFFWKKqNNVRRUSS+TTUU%VVTWW&YYpZ\|^^{__}``aawbb#ccrdd\eesffvgg~ll]nn^pp'qqerrzss'tt)vv'wwSyz'}}'~~#vƒƒ'††'‰’p“”q•˜| |§ª|³¶{»»|¼¾}ÂÃÄÇwÎÎqÏÖpØÙ|áâwéõ#öýv '!"z3='>I#Va'cd'ŠŠnŽŽ““P™™   ¡¡¢¢££K¥¥¨¨««P­­N°°³³H··¸¸ ºº¿¿ÁÁ"ÃÃÆÆÉÉPÍÍÒÒcÔÔKÕÕØØÛÛnÜ܆ÞÞ‡âãäämæç‹èèééêêQííOîð‹óó ôõ‹öö÷÷‹ùùúúûû üüýýJþþ‹ÿÿ‹‹I‹M     ‹    o ‹ ‹‹ ‹‹‰  Q##O$$‹''**‹++,-..J//11Q56m7799‹:;<= NNCTTFddBjjEllAwx…{{…}}ˆŠ€?‚‚=ƒƒ>„„=……>†‡…££ÃÃ-ÅÅ/ÉÉ/ÌÌjÑÑ/ÓÓ/ÕÕkÖÖ1××3ØØ6ÙÙ9ÚÚlÛÛ<ÜÜbÝò-øü//,,jC\/dkkmr1s‰3Š9Ž•<–šb¡¡$¤¤t¦¦a¨¨(««$®®`¯¯(²²_³³*´´,µµy¶¶i¸¸xºº,»»$½½x¾¾ÂÂÄÄRÌÌÏÏÐÐÑÑLÒÒÓÓgÕÕØØààââããfççhêêííLïï!ððññôôR÷÷ùùúúdüügýýR L  D@Gëëu  =  >  =–—‚ \¸DFLTcyrlPgrekÂlatnúÿÿ (2<NXblv€Š”ž¨²¼ÆÐÚ SRB >ÿÿ )3=FOYcmw‹•Ÿ©³½ÇÑÛÿÿ  *4>GPZdnx‚Œ– ª´¾ÈÒÜÿÿ !+5?HQ[eoyƒ—¡«µ¿ÉÓÝ"AZE TCRT ˆNSM ¼SKS ðTRK $ÿÿ",6@R\fpz„Ž˜¢¬¶ÀÊÔÞÿÿ#-7AIS]gq{…™£­·ÁËÕßÿÿ$.8BJT^hr|†š¤®¸ÂÌÖàÿÿ%/9CKU_is}‡‘›¥¯¹ÃÍ×áÿÿ&0:DLV`jt~ˆ’œ¦°ºÄÎØâÿÿ '1;EMWaku‰“§±»ÅÏÙãäaaltZaaltbaaltjaaltraaltzaalt‚aaltŠaalt’aaltšaalt¢c2scªc2sc´c2sc¾c2scÈc2scÒc2scÜc2scæc2scðc2scúc2sccasecasecasecase case&case,case2case8case>caseDccmpJccmp\ccmpnccmp€ccmp’ccmp¤ccmp¶ccmpÈccmpÚccmpìdnomþdnomdnom dnomdnomdnomdnom"dnom(dnom.dnom4frac:fracDfracNfracXfracbfraclfracvfrac€fracŠfrac”ligažliga¤ligaªliga°liga¶liga¼ligaÂligaÈligaÎligaÔloclÚloclàloclèloclîloclôloclúloclloclnumr numrnumrnumrnumr$numr*numr0numr6numrzero Dzero Jzero Pzero V##########          //////////           $%'()*+,-. $%'()*+,-. $%'()*+,-. $%'()*+,-. $%'()*+,-. $%'()*+,-. $%'()*+,-. $%'()*+,-. $%'()*+,-. $%'()*+,-.†$%&|$%&r$%&h$%&^$%&T$%&J$%&@$%&6$%&,$%&N'(F'(>'(6'(.'(&'('('('('(@)*8)*0)*()* )*)*)*)*)*ø)*+,- +,-+,-ö+,-ì+,-â+,-Ø+,-Î+,-Ä+,-º+,-¤!ž!˜!’!Œ!†!€!z!t!n!""""""""""2fnv~†Ž–ž¦²¼ÄÌÔÞðø (08@LT\dlt|„Œ”œ¤¬´¼ÄÌÔÜäìôüÖ,–”’˜–”âô  (*ðp‚Šœ®ÀÒää*hfŒDÚô 08pnˆŽ¨ÎøöôZnlnž ²´ÌÐ&$"¢"¬# œ# # #&EG## Y#  &,28>DJP'+'+"'"+,',+ 5I5"Ì"Ø"Ì"Ø"Ì"Æ"X"Â"´0"´" 1"¨:d¦Ø $x!v$|)†/z7 $€!~$„)‚7„g$*06<n!p#k$m&q)r+t=qg &,‹!‹#Š$Š&Œ)Œg &,Ž!Ž#$&)g!¬&0:DNXblv€’œ¦°ºÄMXlXu)…X·XÝXX=.X 7)4VFXP=|XŒ=£X3V!2D†ˆò4>ˆŠj¬|HZä´ö 8 z Ô .>FNV^fnv~†Ž–ž¦®¶¾ÄÊÐÖÜâèîôú ÐpEÏpGÔpŠÒp‹ÖpŒÓpÑpŽÕpÐiEÏiGÔiŠÒi‹ÖiŒÓiÑiŽÕiÎp‹!Œ$”+“/ŠE‰GÎiŠŽ‹’ŒŽ‘$*06<—!˜$–E•GœŠš‹›™Ž:BJRZbjrz‚Š’š¢ª²ºÀÆÌÒØÞäêðöüÙpEØpGÝpŠÛp‹ßpŒÜpÚpŽÞpÙiEØiGÝiŠÛi‹ßiŒÜiÚiŽÞi×pŸ! $žEG×i¤Š¢‹¦Œ£¡Ž¥ "(.4:@FLRX^d°{©!ª$²+±/]5¨E§G®Š¬‹­«Ž¯$*06<µ!¶$´E³GºŠ¸‹¹·Ž»E  &,28>D½!¾$Ã+Â/`5¼EÀŠ¿‹ÁŒ:BJRZbjrz‚Š’š¢ª²ºÀÆÌÒØÞäêðöüâpEápGæpŠäp‹èpŒåpãpŽçpâiEáiGæiŠäi‹èiŒåiãiŽçiàpÄrÊxÆ!Ç$ÅEàiˊɋ͌ȎÌ4<DLT\dlt|„Œ’˜ž¤ª°¶¼ÂÈÎÔÚAi!Bi$@iE?iGIigFiŠDi‹HiŒEiCiŽGië!ì$ô+ó/êEéGõg>iðŠî‹òŒïíŽñ$*06<ø!ù$÷EöGýŠû‹üúŽ08@HPX`hpx€ˆŽ”𠦬²¸¾ÄÊMi!Ni$LiEKiGUigRiŠPi‹TiŒQiOiŽSi!$ÿEþGgJiŠ‹ŒŽ$*06<BHNTZ`flrx~„ ! $+/‚5 E GgknqŠ‹Œ Ž$*06<!$EG Š‹Ž "E!G$*06<BHNTZ`flrx~„%!&$/+./…5$E#G-g1k0n2q*Š(‹,Œ)'Ž+08@HPX`hpx€ˆŽ”𠦬²¸¾ÄÊYi!Zi$XiEWiGaig^iŠ\i‹`iŒ]i[iŽ_i5!6$4E3G=gVi:Š8‹<Œ97Ž;$*06<ÐEÏGÔŠÒ‹ÖŒÓÑŽÕ$*06<ÙEØG݊ۋߌÜÚŽÞ$*06<âEáGæŠä‹èŒåãŽç $*06<BHNTA!B$@E?GIgFŠD‹HŒECŽG $*06<BHNTM!N$LEKGUgRŠP‹TŒQOŽS $*06<BHNTY!Z$XEWGag^Š\‹`Œ][Ž_ª 1J1tt1hh1\\1P>1F21:&1.$¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸²¡¥§©¹¯´º¸¹ºðy¡¡¡¡¡¡¡¡¡¡¡¡¡¥¥¥¥¥¥¥¥§§§§§§§§§§§©©©©©©©©©©©©©¹¹¹¯¯¯¯¯¯¯¯±±´´´´´´´´´´´´´ººº¸¸¸¸¸¸¸¸¸¸¸»»»»»»»»»»»»¼¼¼¼¼¼¼¼¼¼¼¼½½½½½½½½½½½½¨ÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ[\RSTUVWXYZ]_^`abcdefghijlmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¡¥§©¹¯´º¸¡¡¡¡¡¡¡¡¡¡¡¡¥¥¥¥¥¥¥¥§§§§§§§§§§©©©©©©©©©©©©¯¯¯¯¯¯¯¯±´´´´´´´´¸¸¸¸¸¸¸¸¸¸»»»»»»»»»¼¼¼¼¼¼¼¼¼½½½½½½½½½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåçèéêëìíîïðñòóôõö÷øùúûüýþÿ þÊ  !"#$%&'öÝÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%'()**+,-./0132456789:;<=>?@ABCDEFGHIJKLMNOPQ[\RSTUVWXYZ]`_^abcdefghijlmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ&|L¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåçèéêëìíîïðñòóôõö÷øùúûüýþÿ ¿RSTUVWXYZ[^_\]öDEFGHIJKLMPQNOê!êô1êú1üòè1ð}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–œžÆ_P()*+,-./014523¨¢£¤¥ 6789:;<=>?BC@A„MNOPQRSTUVcdefghijklfYZ[\]^_`abcdefghijklD > @2iABCDEFGHIJMNOPQRSTUVÀ"%(*,1468:<>AWYlosuwy{}ƒ…‡: 789:;<=>?¡@88þ4 !"#$%&'()*+,-aŸ ./0123456       ü ú "(.4:@FLRXm €  ‚ m „ … † ‡ ˆ ‰ ¬®#1#1¬ÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ[\RSTUVWXYZ]_^`abcdefghijlmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œŸóôõö÷øùúûüýþÿ      !"#$%'()**+,-./89:;<=>?@ABCDEFGHIJKLMNOPQ[\RSTUVWXYZ]`_^abcdefghijlmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨ª«¬­®¯°±²³´µ¶·¸¡¥§©¹¯´º¸{|}¡¡¡¡¡¡¡¡¡¡¡¡¥¥¥¥¥¥¥¥§§§§§§§§§§©©©©©©©©©©¯¯¯¯¯¯¯¯±´´´´´´´´¸¸¸¸¸¸¸¸¸¸»»»»»»»»»¼¼¼¼¼¼¼¼¼½½½½½½½½½i¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåçèéêëìíîïðñòóôõö÷øùúûüýþÿ ¾ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåçèéêëìíîïðñòóôõö÷øùúûüýþ ¿ LdefghijklXNOPQRSTUV¢$%&'À&aŸ ¡(*,2468:<>AEGWYlosuwy{}ƒ…‡@ $*06<BHNT\bhntz€†Œ’˜ž¤ª°¶¼ÂÊÐÖÜâèðöþ $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÜìü ,<L\ltz€†Œ’˜ž¤ª°´¾ÈÎÔÚæòøþÃcÄdÅeÆfÇgÈhÉiÊjËk ÌlÍmÎnÏoÐpÑqÒrÓsÔtÕuÖv×wØxÙyÚzÛ{Ü|Ã}Ä~ÅÆ€ÇȂɃ.Ê„Â˅͇̆Έ7ωЊыҌÓÔŽÕÖבؒٓڔەܖ  ! " # $%&'()*+žÝÞßàáâãäå æ!ç"è#é$ê%ë&ì'í(î)ï*ð+ñ,ò-œ/012345608193:2;4<5=6>7?ž© ©©>¿ÿ7  RD(6MYLK SE)7NZ TF*8O[UG+9P\VH,:Q]WI-;R^XJ.<S_YK/=T`ZL0>Ua[M1?VbcXWcAdBeCfDgEhFiGjHkIlJM^P4B_Q5C£ ¤!¥"\N2@#]O3A#"&%01xGXŽ0’G¶æDEFGHIJKLMNOPQ"%(*,1468:<>AWYlosuwy{}ƒ…‡“&ø!$DF/1å ^a £ #ehµ^  e/a£#h$µXF'/5EG !"$&),12.AEGIOQTXbfhjpruyÎ×à>JV8ÅÇù¨AaÛ‰èüŠ\“–c™µg·»„¾Æ‰ÉÊ’ÍÍ”ÐØ•ÛãžÃj§mŸO¡º‚¾åœç Ä!$')+/3579;=@VXknrtvxz|~€‚„†"%(*,1468:<>AWYlosuwy{}ƒ…‡µå¶æbz~ˆéa 8ùAa܉èýŠ]“–d™µh·»…¾ÆŠÉÊ“ÍÍ•ÐØ–ÛãŸAJ@@|…ŒŒ Ž ™ž 7ú9;HZJMhOalc’½­¿¿ÙÊÊÚÐÐÛÂÂÜ äêíðó ( -#$6''8*194>AAJwx ™š ŸR[DQ¾ÀR_DM’“7ÊÊyŒŽAJYb AJMV AM2hYZ[\]^_`abcdefghijkl¿!$')+/3579;=@VXknrtvxz|~€‚„† )OPQRSTUVˆ—v4ú``}}c$$07ƒƒ i {†I±²\\§°KW#Q8z‡÷Cùù´µ /Ã89Ó;HÕJMãWaçcò’½ ¿¿LÐÐMAHNJaVccniiovvp‰°q³è™hhϊГ–×™µÛ·»ø¾ÆýÉÊÍÍÐØ Ûäæêíð!ó%B G#$P''R*1S5>[@@eKKfNWgdlqyyz|…{›ž…¿¿‰ÂŠ``‹}}ŒƒƒˆˆŽ''))++‘11’33“55”77•99–;;—==˜@@™DDšFF›VVœXXkkžnnŸrr tt¡vv¢xx£zz¤||¥~~¦€€§‚‚¨„„©††ª——«7{†4øø@úAW07YOVaÊÊiIIj±²kååm44nAJoMMyYczwx…ŒŒ‡Žˆ™šŠ!!Œ$$//Ž0FµåRSTUVWXYZ[\]^_!$')+/3579;=@VXknrtvxz|~€‚„†ideoromnDFLTlatn ÿVçß0‚Û *†H†÷  ‚Ì0‚È1 0 +0a +‚7 S0Q0, +‚7¢€<<<Obsolete>>>0!0 +ŒÍwí쥪,IŠì9¿zÛ+)ÿ ‚”0‚î0‚W ~“ëû|ÆNYêKšwÔü;0  *†H†÷ 0‹1 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 121221000000Z 201230235959Z0^1 0 UUS10U Symantec Corporation100.U'Symantec Time Stamping Services CA - G20‚"0  *†H†÷ ‚0‚ ‚±¬³ITK— Ø%y‘"W*oܸ&ÄCsk¿.PZûÂvŽC%C´¡âEôè·{ÃtÌ"×´”÷Mí¿´·D$kÍ_E;ÑDÎCs‚‹i´+Ë™¬r&Mq±1ÝûQaS¦ªõI,xE¥/‰Îç™çþŒâW?=Æ’ÜJø{3äy ûðuˆAœÿÅQ™ª×lŸ“i‡e)ƒ…Â`ÄÈÉ;ÚÀð tÞ’"«Ê÷ût|'æ÷J§Ãž-®Šê¦æª'}a÷˜q¼âP¡Kå]úå§,Ÿªe ÓØ–èÈ|¥NHDÿâD’ ×h„€]jxdEÍ`F~TÁ|ÅyñÉÁq£ú0÷0U_šõn\ÌÌtšÔÝ}ï?ÛìL€.Ý02+&0$0"+0†http://ocsp.thawte.com0Uÿ0ÿ0?U80604 2 0†.http://crl.thawte.com/ThawteTimestampingCA.crl0U% 0 +0Uÿ0(U!0¤010UTimeStamp-2048-10  *†H†÷  ›yïY0ªïhµúã »O‚]7_¦RŸê’ DnõmëX|0èùi#s oG©®9ø*±›°ÃŽëY–­Î M²Ð1¦\*züâzWL¨eéy@b%–nÇÇ7jƒ!ŽAêÝÙW?wI‡*^¦8j"£Qƒ~¶0‚£0‚‹ Ïô8Èþ¿5nØj˜P0  *†H†÷ 0^1 0 UUS10U Symantec Corporation100.U'Symantec Time Stamping Services CA - G20 121018000000Z 201229235959Z0b1 0 UUS10U Symantec Corporation1402U+Symantec Time Stamping Services Signer - G40‚"0  *†H†÷ ‚0‚ ‚¢c 9D¸»#§DI»ÿ¡ða S“°˜Û­,JÅnÿ†"hcSš½it¬Å<’àüØu0‚j0‚R lYï©ááãºà)%Y0  *†H†÷ 0Ê1 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1:08U 1(c) 2006 VeriSign, Inc. - For authorized use only1E0CU7ƒ 0ºµD˜ýェ€5±\­÷£‚†0‚‚04+(0&0$+0†http://ocsp.verisign.com0Uÿ0ÿ0eU ^0\0ZU 0R0&+http://www.symauth.com/cps0(+0http://www.symauth.com/rpa04U-0+0) ' %†#http://crl.verisign.com/pca3-g5.crl0U%0++0Uÿ0*U#0!¤010UVeriSignMPKI-2-2140U£ŽÏB=1á«!‰„mËÙy¢²²Z0U#0€Óe§ÂÝì»ð0 óC9ú¯3130  *†H†÷ ‚jó¼_MÞùII­=v–ºCæô†BuxÇ ÂåÄ4O©éJ´¾A„‡êô‡´LÛI;÷ߺ„ø·Gë[ePó£Jq{áõÖí¿PVoø™³©Q¶F®Æ—àç› >»({1£ó.‹‡H‰‚ï _I žÈö–£{šuÈGð>?o P)l+xL0üä` @Ö8u©ydýÊ<äïH“ à Hÿk;ƒÑfÕ¹á˜ôŸiÄ.U.–}~„ €vu6ËýFaôiÌd+ºnéRÚ™¡Z°ƒÄ¼G€¦'Mz6<¾a˜cËŸîÝ•’÷îPÔcܤ$y¿0‚‰0‚q ާ XæqúƒMÓ'Ã0  *†H†÷ 0Œ1 0 UUS10U Symantec Corporation10U Symantec Trust Network1=0;U4Symantec Class 3 Extended Validation Code Signing CA0 130730000000Z 150725235959Z0ô10 +‚7<US10 +‚7<Delaware10UPrivate Organization10U27481291 0 UUS10U California10U San Jose1#0!U Adobe Systems Incorporated10U Type Font1#0!UAdobe Systems Incorporated0‚"0  *†H†÷ ‚0‚ ‚ß6›ñá?ùFúàÛª÷, ÊoY¡Bïã~mɘºË‡öTZñ嬳-•õL ™ Wà1FãR˜P;ã«bŒÈ±ÙÍMº$¬ ïÏQ¹·ÿV§ß'uKRÞèHy|Q/(ÒeM2óÚ5g&¹`oõce‹<7bñ»õGÌ9"@§Ô ÞV°ùŠ„Z)ÖcoNˆUöA«vˈ%ôÌ›µíMkåÔ”½ØËâ)Zéè×Þ +€iB‰Àû“”;^D”U-^‚Ô󵯡ƒžúŠ9(bN™¶›99%”ÿ¤ô?wÅæï¶…™ø4×YKœV j}„¿k–壂{0‚w0.U'0% #+ 0 US-Delaware-27481290 U00BU ;0907 `†H†øE0(0&+http://www.symauth.com/cps09U2000. , *†(http://evcs-crl.ws.symantec.com/evcs.crl0U%ÿ 0 +0Uÿ€0r+f0d0,+0† http://evcs-ocsp.ws.symantec.com04+0†(http://evcs-aia.ws.symantec.com/evcs.cer0U#0€£ŽÏB=1á«!‰„mËÙy¢²²Z0  *†H†÷ ‚w*¼-oþ‡®û6D¾dHÅÁm„°KbƒT×;Ê*Z_%ŹÝnN ‚3s`w3“ÿ#jÐÈ›numptyphysics-0.3.10/data/femkeklaver.ttf000066400000000000000000003101641425065123200204630ustar00rootroot00000000000000 €0OS/2@ý¼8Vcmap¼˜»Ù@VgaspÿÿlglyfN^° t~ôheadîl ›¼6hhea.Æô$hmtx½'[°locamz˜Úmaxp0­ namez!Hú‰hºpost¿¥J Ž$ECðÈ¢_<õ ÄQ­\ÄRÒþªþN$>þNCßþªþ¬ìì­Cš3š3Ñf€§PJHL @ ûÓþQ3>² Adüü 8öJ“ÿØZöö¥ö4-ž4-S9Æ5öiöZöKö-ö-öCööaöq--öxöaöxìRãJ° ÿýMìŶ‘‘ê7ÔžFËU ‰ˆŽÿþFûdöi9ÿÛöiöC«šN]ü„ƒ8Øÿˆ /™ò¯ÿ½1´¾¢™?ã’dÿù×öpö«öqöb söLözîö«öxÑŠdˆ°®öWŠdž¢<ööö<œ]ühöΰe¬¬¬ìFw‘‘‘‘îNNNNNö¡NÝÝÝÝÑ`ãšššššš®‰ÿÚsTòòÿùòòòöSò·¡’™dÿùòdÝÝþÛ˜OqêÙT8-º-w-wŽºŽwŽwöGöFØw®weVþªö0öLì0‰ßÙöM9ë0¶xöWööB™ÿ¸ö^öWöW19L0F@~ ¬­ÿ1ÇÉÝ~    " & : D ¤ § ¬!!"""""""""+"H"eðûÿÿ  ¡­®1ÆÉØ~    & 9 D £ § ¬!!"""""""""+"H"dðûÿÿÿãÿÁÿÀÿýûýúýìü à·à´à³à²à¯àà”à6à4à0ßÇß¼ÞÝÞÚÞÒÞÑÞÃÞÇÞ»ÞŸÞ„ééDBwä   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a„…‡‰‘–œ¡ ¢¤£¥§©¨ª«­¬®¯±³²´¶µº¹»¼ÒpcdhÔvŸnjÞti†˜åqèéfußâáækz¦¸bmäçàl{Õ€ƒ•ÊËÏÐÌÍ·¿ØeÖ×êëÓwÎÑ‚Š‹ˆŽŒ“”’š›™ÀÁÈoÄÅÆxÉÇÂVVVVn2èZH | Ž î v â r –Œš²À’>ú¼HhPpä¨!Â$ & '˜*ž-¾/„1.2`3 5"67Š8¾:;€<ð>v?ìAJBlCðDæFvG®HøIÔJdKBK²L2LâM|N4OO°PpQŽRnRàSPTTêU¨V˜WDWüXØY¤[D\v]l^€_P`€a>aôc>d"d0ef4f4f4fzfîg°gÄiÈjjŽjŽj°jÂk\k\k‚k‚k‚k‚kškšk¶kØllll"l"l"l"l"n’n’qs¬vbvbvbvbyÀ} €„4…¾‡JˆæŠ´Š´ŒdŽΑ”“n•h•‚•‚–ü˜v𛾛¾›¾›¾œ°¢ž¦Ÿ¼ ò ò ò ò¢£ ¤H¥¤¦¦š§(§è§è§è¨öª«&¬Z­®®ð®ð°Z±È³D´ô¶¶¶¶¶0¶B¶P¶j¶š¶À¶â· ·4·B·N·f·~·–·À·ê¸¸b¸â¸ø¹P¹d¹x¹ˆ¹Âºº¼½z½z½z½Ê½à¾¾8¾F¾Z¾Ð¿¿>¿\¿z¿z¿zdœš$83!%!!67632#&5454&#"7632#"/&54d8üúÔý,¯5;\p.@?H #£B:&@9 8 8 =šúf26ì_P1cPPh/&_a3LK9Büÿ: < > G ˆ@FMU[msyƒ•ª´¸ÀÆ2273'#373#'75#'#&=35'7&5&5675##54735'375'235'#375'#'6327'7&'35'37535'35775&+"375#275#32'#&54654'"7#375"'375#èm,( @H($P  9C4@(( 8 d€Ø88`444dH+9(Lì(TX,X_&" XPCMR:  þìÔ\," @805<f€($4tl€6&0,H,A/x$ˆ* fþrƒ‹’þUË5x% 4 Šj‘ß       ý[^C)né» þJ>>h4 4 $9 ? å /%}œz"ªT 6D…sh­9 /9 0Œ#BU[_esw{ƒ‡'##'565'54763276=4+%'723#'6="'&5476365336=4'#"35'37375#'#357'675353657'37#T01s$H5YFL(QþM88\/@ 8dt4œ¼À  þè$˜($P #HÉw$(Ô%3,d˜( Ph¿=(  4 Ò68$<°' $4 9Û8iWS/,$(  |<pþø pX h$   S^ciosv|3736;"3737#33&=5##'67#'5435575#565'574%7533733%4743%77365#375357375Â5"A5&z¿&\E&˜D5=6dþ=5,0556k[ôTþ¡=2TkÂ.ý¬ø.þ5‚ký~S #÷  5"Ÿ)M  Gþ·ª ~™þüW; ‘þ  S#1{)eh(þˆ²b)üļß)!þý)/ þ65/#4Ηßäó?CTgms|‡Œ”22##&'7322#'53'75##'75&5'4;3'527'5757'54/5335"/523'5635'673735653'#'6=#'#527#3'#353'&5653'57"5'37327'54735336='?/7&/75#'573237'53&/7&54#3#'542+5##&54%75'75?'274#'#'+'#'57'575'6356=7'75'5'32#'#7'7'3'735'35'6=&35375353''iy0#k w b E Å #tHY~5$ú ?Gs>G #  ¡ G Dn- A°  ? $H5k ˜1 i8#')-G? 5#k >#Z#»!-  5BÅ #-Y~#,H H>  $ G -!0$}Q$>[  tZ-75ZG&- G5  ?è2-¶,þëH    .+   65- P   HYk  ? , > > þ­ Ù è þS ’-—(œJº4 s.FeÁ¹\y s KstK,+"Qyb tKWÏQ- Eb V) 1:t.4"DK@³#(#( þì´ 7%8. Eh]9h@"o -:?œWbK 2)nQ#-€. Å¡ @%QhE)~Ð ‘Vh  (@Bf(](y(@­þ¾  Ð4n  ‹…V:#§h)( .@":Q4 …"@/P…K(. EQ/-V:Kn þƒ) ø— *AIT^lw‚Š“—ž¢§3#&'6 "'54736?#562'3#327#5252=4'#"3754'35'575347=3$5##3636=&372354+3654##365'375&5#'35#pþ¥þ£dµ afÃþmãR²/Ɉ–K»qŒ WÕ>ANþÄý× Ÿ 0B²‘q zþ¦& Èþ¸K Ÿô&Ÿþúþð »&Ä^4 Bþÿ BQ; © ³LμuMÅ Å þ‰ 8 B/8% üã  —NýôþI¾ª<9â4åD<1ªxÔ.Tû/ÁÎËS)''ýôýŒë-o'eO•7[—N'S*7N7V?eGËþZf +-þbžûNnX7=†LXm^neþÈn{—m%@˜‚DŸ?'GVF7> f'¤(¼ ÿØ-DTYw|€”°´¹¾ÈÏ765776767%'%#'7#$/&%7&'?767676?7&%3'&7'&'?''776%6'&?775&'#/&'7757?76?'&/7'%''7'7''67?5'½º! Ìþ¢AÐ gN"   +=  3V þñ  i gþ€Iþ 5 3˜þG C2#* iÛÍX  Š  Îßý™hqC DQ # Ÿ Cv A ûJýç ), ýæŒV „# ¯jžá  G [Šˆ«¬T0—(þc? zo+; ûV0"¯:"€z’ •·^"ŒFcsœ.¿/Iz [þûM&7‰pJC = n bì.#‰Q”ñS,¥=zIJ ½145!eN    oÇ Š%K¬]ßF=\«þhýøž/^<)ÐRr™4_SŽ  …T ,$Kå(Mn¥¡  N6  ¨7ì#49FJNT[bhlq;#5323"'+4'5754'5327654'&'7&'35&'3354'53537'657537'36737#375"/¬" (  « + , ( lPx 58\LAhìà Ð<<ì  -K=;¬0ì( He³, @4h4 Yt¬<ˆ¢>G   ¸EW4 D€<\‹?U< ¤tP€9G*V(þ‚¢ø)#73$&5475&'5?5˜9 :þêbV0ústþúå¤[ïEþ›þóÝe0W&ø  ®òuþFþ…äG!B&ȸãt þˆþÉÀÐþÇκåxÖ‰Hþ‚¢ø)5735#5$765'&/7=' 9 :bV0ústå¤þ¥ïEe Ýe0W&þ‚  ®òuº{äG!BþÚÈþé¸ãþŒþôx7ÀÐ9κåxþ*‰H ¥Öõ]pw}‚ˆŒ‘— «3&573233737373'#3''75&##5475&+"#7#565&'"'53'732?5'573'5#6;25&'7/65#37#"75327#"3537"35'5&23'#&#‚ ) >d)1 2; F) $$ 03 -MG< "~ Š  6R1 @Z ‘Y3$? ¢ •M   R  þK| °{VI^">4T/ij2 1= j" . .   _"*QeCEP"eŒ0B*5–&)_PfH " YCb&27+D&!3"@ 4ÒŠ‘\`emrv{®´º¾ÂÈ327373'#"'4375&+3"#'#3724335'3&'57/#''75&5354#"56736765#5355##5'65#353'2'#2'2#&##"'575"=75'5763375#"37'#353535'ÃCI"`' ' >8º)¯ D®{"  " '-" 8 xD<[HC '08þ‚- ýv † öe> -v   8D |82>Ê %"I>þ >O =D_>>‘$û    ¶I ¿1 /*Æ ÿ -¡   %hT 5    þá $Rm4ÿ$  D§¼^  $Æ?%%    Ú*%$/S P$$CˆþÜî 6:B2##'#&5737'733'52754#&54347'53276=4'#"5753765!>8XhP7R0#DC86EnR3)"" 9Et]%"0Y0b^²cà5  PH V!;'6² ž+8+Ž*„§?H.þ@'7T4÷POHPVZ^d33277'##'7'#&+#636337'53##"#'543754+#573'7&56;5&#75!353575'#d Ikph   bf8 %+1¬¨ À6  (( P0,\0< Àˆ€0 O @<  € œ <@D(\    ¼Sw 28<FN2#"'5475#563723&+7324'#"3;27&+"35'35;27##"75#'ûn„a'L Q02& @(@40T50 F&B€ô(T:)#.,,( ˆjtD $($<D8p0  Xÿ¦ Û$(.LRX\`"#5##75#3'#&567"57554775365#73?433'56;37375375575L%jø. 1G”'ð±\¸#j2ý®FÆN1¸ *qÆÿj°+88Mþ‘#Ûj’ý^˜­<! Ф.  û÷"“«(`Ö&1ýžFõJŒŒB ü‘ 59S;elƒ‡Ž²¶¼ÇÌ27+&5&'&=356736#&'#3265'#"'&/#2353#"#5##4'#'54'53354?625&34763'5727#&'37#3753""5#&576725336767'733535'#"325675270MH:þõYN#›S# ÐD>7þš ƒ$D£ñz) I“$|+H:NŽ0) +M< *#H# á  : þÇ YY' cN"Š.B¾ ¬**‚/eq)qA5 ;wB™WýºÛ-y(¬$/ SXc̤ýÖÒ2.7^Ñw@ q@þ ¤‹ÒÁ 4± ‘Ý&·îT.Bo©'k ½Õ'|‡xr.p9  œë  -?þ'„ŒjÍ…p-GRq°` Ýl‘ +þ°¾3  /ã*¦+†þx?ˆgCã&&þ²9Fr 9Ol i`Taejpw¤¨¬°;2337#'"/5%37#'7#'"5##4'57535"5?5'7354##'#'#'?'6747277537365#327'#"#'#"'733757'#'7#'#75#5273'3535î&M`  fM& sþn &s8 ? &@ -3   ’Æ™-  _'#0 ,Ò†z [J²   ì Zr:  Š‚ ˜¡þú  mL†T  Gj¦d#þb) p‚ #  5 G   G v> øó Éa d 5;š1(IE Apþý ýá A5ø; ;)±Úw( ±üÀ š Z’[•™Ÿ¥ª®¶¼Ä32'5337#535#'#57'52765#4/#&+2'""354767+##5#733$5#'533234373676754'#3''#'73'63'56763#3#35'37'373536=3275#375'#ÉEŽ“*JIJ ,#'* “/ [)9#x%% B*™I'3yd%^N„x *% % 4 ¨‰*þº:þôD %I?®P³~*I_ ::T!4 (  Ò?5þ U%þÔ 6MþÅtdI[@¢ÜNpkÆ2ðœžgZ:7+@9)3ðMj2#<­8e¯é@ª1T9žsçUw,o+*8ô4$@1xcŽj}#“%q9þ cþ5$KtLfq¾ÄËÐÔÚáçðøþ 22353#'535#&'"'#'633'53;275#5754''7'2?54'##575##'"#5#527675#56775&#&##57"3472#3772#"/3576?4'&##'7375"=367'&'#7375#37537"5'375#37&73546=#57';75"535'67535'ë¨MP w  P"¶a?l}: " (} +%DD UJ.Œ*ƒA1 "((aD#K™ (#O}3x%0>bþô "%E"°HRr0 P(&5"3O_š)Ž3ÓP>P 5(.3"KD[`¡/n9 &à þü rPD «.  þ[3«Ó  þwPULz—u:E†¯]zžt  O##z] ";F  #‘/ ‘ž:#j9Q@W?# ^d # n])þº€‘ €L†:#–B F@ºŒ.: *>  }º(µ^  N6X3`4hþþ)ÀEþÀ  LzFH2 u>~ ##R: )@@@:3© -¨Lj¨¬²¶»¿ÈÌÒ"34;3673375'73327343'#32'2#'#'5##"53#'75'525'75'##"'5'57547337#525#73676=7#67565'374#'#4#757'#+5674353753537535'#375#35375#» H"XJ Y03 !v O  {Œæ ¾e:&"p  8=3"{ÕC2 '¾'TCZŒ Iz? 2¦®pe-þ¯O3CN¢ Æ þùHCL  þ ` !åH 'ßAÒ-( o!@P (; B!&O' o v55' å4\”ýÝi     – «'O#ØHË..ÄþÆ(Ï[!iv v ý]  þí''‰ -™LÖÜàæï÷û$,32#5##'#+34;757&=3;'#"'57375"'565654'Ȕ54'##'"'35734?5&=35'75#"3775'73#527#"'&'#"5##&5##'7&##'57325236=&#'#"5##5#'7'#'57'336;273'5$5#"3535'354'#354%35375#34'35&375235&#35'36=67#»(ï[ &ŸŸÅŒ3˜ Yò[9 \cy 2 [=¾ë F>T 39™?-†‹`_ ˜¸9 L‰þS Ų&,S…T+C<##3],   ! - ø’"pLÄ   : ¥l9?l_ýË>Š© ¾Ö _3þ™E&þ2ûýR Yl?¥Œ,97J %4 WLþÅ*#"S/)€ëK‚ð )"7K >) #[WZ_§¢Y0 n7 $ :7) Rþ:=="7k\¤g nR!2Î"=7"`¹00*6~) Tät`` `GþàtYjŒ.G"¿o7R.$0 72 "7‰GO`=7*¿/##>÷:0Cÿø¾K2`djtx…‹–œ¤«¯³¹¿Ä3#4##"'"'75'#&5/#47334675"=4%373#3537#327654'#5"5676=7'375##5#32757#32#&=47635'#;2754#"347535'75375353535'327'5(OBPI·2> À`¤‡ <( !ïq%"…]?$P þº.qÁ/wBWC±Y~ï5…2¦I þâO" +O(PI´ ³™%R.(d J{+q’ (.  þ­þâ!Ä '0DÍKÌU÷ @O2–"€ôV~. SM#Ãxh>(µ“´  LZ”ý³wnh½-4  (›“®˜X" x;}. þ5l#y x¡9n>"E4¦?(  ¸a9·x4 #Jb? "mi9QV# [aVKE9  ÿÛŠL049=Awƒ‹“ '57575&+376;'##'57'7##'757'#7577535353533+575##4753'575#276572766736=3536?#"7535Í0‡ LsðØ1+®) ‚i+”21 $ch>þ§ ™  xk UE%×oÝ ¿7 +8ŸJ>%uD+Jý½J =$- CLP Ö Æ %þÅ%  :û   Ö + @&þÕ óþ¨ K 1ï_w ý›a~0kK +¶KBC%Ë%k`¥ üT  & a’S^cmqu£ª²¸¼ÂÈÎì-3:#'&5'547675"'&5'4%#'#37656=4'&5#525#56=4'&'&+535'#'"76535&=7%55!237'#'#"=435&573676=&+7254'#343535'355'375275"/##"'7'47336734#57'7#;5&5327'3375'#"%3754'3475335"/47537532?Ìn»m4ysLŽ‘yÔs&BÎI 1%m%Úsþz=$ < b_o $[<1>0C+1yUs? þð… UH*H7 ‹0U*h+%Zd^ø(0Î Àýa*$ Èg©+j?$/s|! ì = [\)s2_o5  IB‘Ó +ýæ6·C*žBžN1ü00‘¨>dS –o­;t§{PäU 8;Z%yÙ9" ltIÕwþÀItY&?pjW= "!kza^{* X3B>5bI ¯]É#(þäL ?@ÁhD ^[S   C`‘m&  1H—Vl$*   $1=/lr%$$`Uuw I =…%`… ß m§Ia(-:ª„OBIy3=g*mU 3psVP©Î6 ¯<µT=O þsq¡S±·¾ÄÊÐåêõø$/6<@I7#'#37'3#5'74'&+"3;7'5673#75#+'&57#&5#7332727'536553##&/#3#"&5373633432#'#353#&'#367#32767'#67#"'35&54763473'775'347#"35'35'37&322#'2#&=4765'3275&#"%75'47355'#2?5#";5&5'375#;75#"'75#375#355&5„EWE  8ÑhN7l2S8CQb 4f7C€-e N T>…`(5F u= fy8*~2&9‡H =>   ND 1Du(La>QgÈU":¥ 'Y8pCp_I-þÒj-PYZOTù"2O !ö®’!‘"þèT’N3¶$A þ!(8klp!Z|t þ«28{‡!õ=-pe5;N3NCþÞT  -S!›_€'u^6)C-!Hp›TœaŽ­  r m˜u'!ÿT‘TD6o! j‹,('"Y¦Tþ’þî‹ "'  G?' ! €5K.6{1H¾UŸÊs¬€<>ÆN  ! { b !"YC,z -Z<“Y= ¸HNjBzy € ,,U j.j ' ,!¾2þÙ S" !2'3o çt  -37?Saipy‡2#"'7'4726=4'3654'#"3#327&#7#5'75"'"7#+"/54%5#5!37326=4'327&#%35&'&547#733275"/‚CÙDoñC> 'Wþ÷t²H Õ1›:z )þÑ ,)šH›> jo:!,Qhª Hf 0"Rö{QE*;Á' þp‚0& oxC[d+fv$th.Q4;9 cK1RyFNA:OyQV ED .< Kþw Ü4W.V@  *snWn 22 y6!5-:2 4cV .b#ÿñ°  AW[c"=4735'35436=4'"2##'#&5737'733'52754#&54347'53276=4'#"5753765•8$¸©°9##8þcqY%…A:ZlS8U1$GE:8GqU5*#$":G…x`&$1\1e`° Vp0dkP!0*zP0 Tý¥¥\Ð1  ID O7#2¥ “(4'…'{›;C+ þ`%4N x4XJNRW^—¥©·½ÅÊ3?3"#5#&'&'&'7335&'#575'#'%337'7'75"#56?32763773537575254#53354#57#'##&#&'&''##'754'575##72735'&#3'73##"'535';5&'5&¨MK¼ Ú>©S`-# ßDe› @0<ôþì$ˆ' ™™¡`-í (|€ øþeût-  (G%S¡GU <<   þèDhõ/$    þ°ªQoø3X1?l  „L`¦&[9\. M| FF,Ø$( 4 œä›1 mT00X`D€P`´HPœ%ÃT$$  ($¤ $dcS, P$¸D@G-Ä H œ,$<$<$`>"„ ( aé¥AKQUYk’¡§4/'57&+"475#53735'367675'##4+##'7#6=3'7573375353#2'#2#'"'"54'##' 543743%256=25#56;363'##632%3751tŒXXDÌDXP Ø” 4þL 1Œ¼0Ø\ ¨ ð$à!  ìÜ((˜Á?l LÛ¡C5Ä)€xÌþÍiH¬`    ý[    ,   þð    GD›M$RNh < h( $,³  $ H$( 408È$$ x4XJNRW^—¥©·½ÅÊ7'567##'27'7'367&/73#%'#7337#'57#27%3#'675"7#65#75#7675'%'7'&/"'3#'#3'7'733'7337343'353"%5'#%75'&'375#%'#&'35'532'5'#%5&+'&'ìMK¼ Ú>©S`-# ßDþèe› @þÐ<ô$ˆ' ™™¡`-í (|€ øìeût-  (G%S¡GU << þà  Dhõ/ýÜ    PªQoø341?l  „L`¦&[9\. N| FF,Ø$( 4 œä›1 mT00X`D€P`´HPœ%ÃT$$  ($¤ $dcS, P$¸D@G-Ä H œ,$<$<$`>"„ (RÀˆŒ–¦ª¶¼ÁÉÒÜâøþ 2#''#2#'#&=6765754''#3#&'"#5#563472#&5#275&5676765#&#&+5#5##5#'##'63#"'47634?75#"36=4#75##4'35375"5&#3753673475#367'7#"5ȿ5'"'547#&=47375#;6=4'#3675"3#p£n;-¥H1$%tL:ªp$5 "1  V:X!E®) %¡1 S…&S(      ³dA^?y5x} :„‡UQþø$ Z "À  Å:7þÆ $:R1L $ ΪgcP2D$ $¯$>t DH::“#%07-1k  ˆaK,+u88š)%b &q »8ã+&T/= \ 206Ø0<§b©z&@7$Lf MQ¨T3"* Q    -Üf61 ˜ý7 q/6cò'*l& )C1J1Q!l&%­Q=&  þ¸>iÞ1;6 <Q ;ã'kj3)@-"$ ag ’L 2d¸6 JþyOàmpv…3#'#&'&5##"'54%77336537'275'74%'"#'373;76733263'573"575'#'#$'4'&76735';2754#59yœcá‰(,¦F>p,±,; 0;X9þFξþI;,LÌ…,;-z»…w&Jþ÷ÝXXÀ„vþ®ìÝP¹óB,þd)iƒ…¿þ­,à$þËíýÝ$=-(…¶0òo /”mª U6 UmIóU%$¥Ôþ‡ÆþíÓE H äXž †lçU’…ªþñãz 1 QA¡ø±šÑ³‚%þ> aI$¶0zzma5ü×  #ô—MTZ”š¡§ÃÎÜçì÷þ #*.2;CNSXaekosy32#7'#'#535'#'6565#"''#2#53#&5#57&"'6674%325&#2&###6?5"73#75'35"5672'5675#3275#&'375#347#%3543'"#"'#'75##'67232354/%54';752=#27'75375'375#3575#35&#'7537"375!3435357'357#'437537335&'3737#7"6=3'375#3575375#¥F¸QF=#¶1bF T#*pG( 01[ ej=H…BX¨E·9ZýÒ#žb%(#-À,!*1#[˜A["+6HìþäHEíMF¡wZmEþWš ,Ã1 )j#Gu„/%1 ÑþÆ8?:#1Êmý½#ýà8##}14Ø ý¨fý¡1f1ýÄïýç7!aýÙ¨oLS#—ý¶…Ñ?ÒL1 ¢å8YNd/p 8*#7WowAò PŒŒ#TwýþO¶?0 ª*##Izæ+5L°0_ BR2S…–=„ j1h,8Ëo8F‹>21>¨bŒ#lX%/,*E*1"’\?Wþ‘þOÞz**S?1o?ØT?S„w#11#}E)"h#L))>MF##Œ#w1~`88#?T‹S}9u##‹#(ƒ—,0=Bv}„ˆ¤«±½ÁÈÎÒÚÞäíô")IO\`fjpu~‚Œ’©¯¹3;723#5"%'67#747'53343'3353757#'57#"75#32'#"3253325736567&'&+'547'#56=4'&#5&#3#3535'!732'57'5##'54'735'#35'37654#!3537&#365"3565&3532537'75235%2+"/335'5673237##473"235&#'37#"35&'737#7332754'&5&#"35'36574'3535'3537'37'3635'65327337#367#"5#'#'#;2527375''#7327#R @«ÇB3 S°MLelr²þ×    3Y «37L 3_-?_?Ø‘F,   ä RL/# 92 YS½f…| NÓ.i8z8 !!-,Nd33C’TC_pO'C8d3O!g%EC C 7! 'à—­µ¿ÅÔØÝáåêðö *06<AGKPTZ_c3353#+#5#4'525754'#'372733533'5473+#&'#&5"'36;2%&/754'#"#'&'#;6?67'57'7'7#"'#&'&'&54747275##56767435&#327335#%35&35'57365565535357537'375#375#5#3753753&757543535#'3&#'35'35&5&#%5'35'27"37'535'673#(ð [9"­I "ša".P~?6<D4  ¶˜/(A˜3 ÂA%B+a„ kÞKs¯"ÇBRMÛ1.·OU'@ *aF¯V=:9C¦aV  b!WYxa(9 ý‡(P¡ ýN   P ýþ   ä  Â # &þî¼P"? f3 x ü_ ýÈ DEà þ>—%+ 0eƒ3. (K839}[ @Á0 ±þö$Ê7þ¤ØÌMtm"DrÑ.? (Á:.>q5 nN™·Ÿ$  ­_¸'D?( >?l  ,9"  -3 9  #   (.#( K ?9PDJ   (  (  ## m  l"3Pl(%‰g" g ‰Žrg -ƒþè ÿý~’")-7;BGLUlpа´ÆÊÑÕÛáí6?667'&'6&7'676?'7'?''67'77'767'77'%&#'&' &%667'&'&&%7'76&'776/76?''/676/'"'&'77%'7'$6/7'767'7'?'7?'7'77''à ''¸%cªAÉ—  7þð>> þÔ¯GZ15& 0×/8' è< xB ë þ} / ,ª%  ”+¯ & €þ( 6»æ 2%3 y«Ô¾Ô ¿s°C)'  ) 3 ue+  ÜAz% PA‚  _   ^Ä;Q ý0 ;* þ¼T¯7H.þÆ™A) Fn%"% 1•¶0Y‹þî¿4 üÓôýz  #C !l  # rýkýúM8žT¼Î%c b ä|3Mê:® %:#þ¢8s€VWU}ÑqD jKþë' '¬®³º,44þO þô1þ½   8  )  ,ÿÄM—´¸¼ÀÊÏÓ×Ûàêîó÷Š’—›¡¥«¯¶½ÄÊÏÔØßãçëðøü  )/4873373'57375"=3"#'##75#&+"'5#"77#'75##5#"'##3"37725337357233#5"#%%&5275##55##6'7377##5733633275637353353535'#'#!;53733'3'#37537575'37%5'353753374%&'3232567'#&%&'&5335''''575##7'5357335'75'575'73367435#5''#''435&57'547'73767575'4'#&+''535"5!35''!3737374#35375#755'375#325#37535577536753#353#355'75'3#"5"35'235475'75''735&'3#'#35735~fr f&3 - - Wny& 3 L  M %&93'9$ ,  9 @þáþU’  3 ?L-& (- l'&M þÎ39  D ø   -  “ ?@l¸ %& F ü˜ +",ƒŸþõx J!*T-_y3 Kþóu]& ŒZL&  ,  ¹  - f 9 ,--_ÿyL33F-SŒ-&²l ±†? ªü `Yœþè:L3S &f9 þµ 9¬Åß  þ¨  M þb3& ß ™&Å 9  þ¢ Q  ) @+9LMY -3,“æ¤& —  ý  ',  •%T^# , h2& !     2 /Œ B<È GbðcÀ  1!!'          Šì &þçþt°Bs!!-GCINTX_djotƒ‡‹“—›Ÿ¦ª®´¹ÁÅÊÎØÜáëñõþ &*.9>;6737##&5'37373373##56=#'##"#"'6=4'35"535"535##535#5#7327675'336335'37327#353753'337335&#75!237'3755435&+!7537'335735'#34;227#3375''#3#'#3;35'757'57#'5376=637337&57'''75'7'7'736;275335'"/35735&3373&7'#3753';5'35#35'35337'33375373#3#3#%37273#3#3275353#35'3753737'7537'3373375#5753535#375'75#337535237565375#37'37'7537537'75'27"5#"375ßd™##F?64_ÂA#5d)‡' A/ dG# Çv$$     s-h@$%Gn °# ý"  X  * /)L :¼dþ #üž LG KLG#)ýäÓ  )   þæþ«) a­   )AX #//U' # ;¶¡O lþ®K±X¦# & m# ¶þ+  Ón6x#þÛXRá5   Aü~   _ ü§  F)PNVþ)þ¥ =  ë ) LÍ þà ¤) ¼L)){ /Ú 5  )  F' E  Ë^   °  Åk T0 *;Új*³RÉWi0U0% 50$  &      %*%      %   ' %%% *þ|o:{E z%0U+@ êE% Š ++   @¿  *zº  :      /*% >*…@:  5KEEU    %+ % @J*5 %0J&'… 0 EÕ5@0Ez0+E5;+;0+& §—vzåëñ÷!)/37?FLQ5'52#53&##'67'3;5##74#4'"372672?'6;'5"='73#'"#4'#'##&'&'&=473'52?6733675#63537533773#4#5'535'7#"373353327&=723473"653#57#3#'3"'&'5335##5476367"37535'773'#'575''5&+35353533536=35'53'3735'35&35'375ÕŠ™D5. -=¯ânþÑ@LLEœX”B5£!ZO5&-6LšL¨>'XÊ=5.5)‰!­&Š<¬³[m$c9ýø‘6Î'5þÞMrET5oXk<O;T%L‘5T&E3Opn&& #•U.þ°&6TÖ¨=å.5&-þ‘[å.°&†&'þ==ô=6¨. '\‚.0+1X#—"[α( [V9P•#-9Ì£ûþ6ˆV3ü"( ƒ#þÜ \k­  &—#¼¤<O³ r½:l#HR 4þ{? 4()O   a  #¸"m?¡D P " *-9""A# ? š7Ö?¦.¥K „9:((g„" 9:a üå 4 .  ¦#     4?3 dSäêðôúþ&.5;3737#57323533#537'4#&=3675##55"57'3'5##'#%#'#"'#535'75'75272563'3575#57'3737357#5###"5#75##'37+57''7'25'7'435#75'7'737437;73'533'"'57535'35'375#3554'3537'#"357575+'#73537&5375#53275#375u;<&%÷KKxS4-5€VåþÛ »LJ-Ú%-¥K 4bwZ&C-R'þÝ&54ð-CK'5%<'<&-KþZÏia»KüÖJ&<þÜ D´»S-þ®-þÉ3(k™w 9`3D ™þÚ|Ý3w˜( -Æâ ·à-"'3N-' qþû 3 " ?8v»_ µ>" }TÀ  =T  `Df33þÚ ýjZ k>".-( - $(SKOS…“𠥩°´¸¼ÈÌÐÕÜ24323633432573#'#7###"'532?'##'67352=735#'56743535#3=7#565#327365'7'#7'7'65'75##&#37'753573353753753535353535237"=353535#3753275'\(P   gEj*O1°HŒ(ÐTH 4440Ö0$ þè$40@/Ñ (<   /ÑEa   þT$ Hh 0þ$D$T(S)þþçãîb$./9 /% 0 .…ˆMN  $9üÝ ½r Ùüéo ]þwþŠ.)fæ¦HD|=à/$9$ S*‚–NNXD9h4/ ..w)/9«þÉ339))°M *4I9 3)fSTŠŽ’–›¡¨®µ¹½ÇÌÖÚä377433#'#""#"'&/#36;35332?336=#7''/5475373'5367677#"/#676?''25'%735353737#35'3#566=32=75735;75#&7275"'#37557;67#'K`Uò # 8u"$Pk&"+(#!+j - #}Gj)3 ;  h-AK)Y 2G [«h '3þͰ ¶ i   #(þh3 7y8#- #-ü ØB-%Û S& Z7¡S  þÿ†V¡þ];›qF@H  !5[›0tƒ5- 2­…  ª"+þÉMT|Œ@F¨/ =97ª;  –M ö 6FFþ¾‘3#].B 0  †0  k` ; 1+¬6( ‰S­³¸¼ÃÉÏÕÛâéïþ3#%#'##5675##5#'5275&=#"'73?5'737&#5'735'467333=##5773&5#7373#'##'&/5735'"#5#"'#54"=733776?336735'353535'37537537527535"53337&5&734337337&'337"535&533535AÁkþÜOcy (N ´·#GVëOhX8#Ö5/ò92ÁcŽœ þÙ« 3À.v²(@9#B«Hcc#’.+ý*#A]«]«$+¬z`k$_} ';-kUSª†§R [}0&mÛ›,1þ”ýzÎ&éb<–9T&’2+gÏQþ¿*2 +!lþ þëU   ‚  & «Ï L1ä&WA ú™E þc²gQ&!&!!6ß’“r!!³7¾Îï+& !6&%*¬W\<L1‚³(1,7³b6G ÝDnu{ƒŠŽ’—›¦ª%637337375"'5375&#'2+#5#"=3'7336576;23##'#'#'#''7'5'7'5/75375#75#35#37#7335353527#35"354#35 <þÜ$" C[…È*=Q)¼ *+çB  s mÂ)0  $ùÿ3.gI  Þ+ %æa7 æ* 1 Ï=Ï þŽü  Ú6D#&@6!f\ýfi 6&    ½g  AFoyl ü{ þÇ& + QÂqK Çþ|        ½½1+A0ãDq¢¦ª¯µº¾ÂÈÍ×ßäéíõùý 273#5#3'7'7###'#"/#74'57#737327'##53#'#3%?33575#'#'53535"'73767#4'4/#'3333!&54375#'56355'35'75#37'7'3573&37"75435'!2=35'3537'7'353536=37[;ÊÝ)!) !Å B 911!Ä1!F  )Ä ½$¬! ) ›b”z)R]ý9ÄJfy¡)j21þ¹ (!!ÝZQþWJ)!1>J)!9)pýý Þxü®! ‘þ¹BÍ )  üÏ  !!D+*@þÉþcÿ?*+9EÍ j[Ö9…*$†æYNNª9ýey#*öú± $+À¼-ö˜U$þˆýº‡? U¸°+#\+9$xþÝ#*1#$28N]£$8+c$ã†G#ÎN#$11\9G]F@$>S Ÿ£©­²¶¾ÃËÏÓØ37#"'5257#!3%3'5'#4'375'3357'3573'73#5#'##'#&'#3537##"5#"5&=7'7'7'75'7'732'#"'"#75&73'52353535'3575353675#7#373'%3435;5¯[;;U‘© ý U''þÚ   $7uŠ    . +'o Mþç!! ؃'   ˆ   3à€ƒ ý’@ þôˆü$¼. `UýWUv .!U Mþùo!ª;[S     þþ«…kq,5[V](þ2L­Àœq?Ï ³ŠÜ'} m= H,þýV-5~$ª #6$Î$ #   , k þ/tÄ6m+Å-j% "8¿ ýb,? Y Yk c–7 æD cüí6-6, $W ý—?\! þ QP MS&.8IsBŧL˜ê§Oˆ-φj3½=ˆò§5yEþ¸~=¯ÜŸs†,(´&¶5.þçj=-&b&5 .'6q&&—&-ŸDbc"HrcbSc.[[DSD q&c 9.-EQU§&:)V+.&5<%%-¶.þïìLaeimrx~‚ˆŒ‘°µºÌÑÕÝáåëñõü77332#2'##'#'57#'56?"'57&=335332?2754'&'##"5'#'5'56?33'3373535'7375#355375#3&54'#2'547'"5335"#57375#3'7336336754'35'3536?'3575675#75#375375#×+++³f¬$s}Œ$@e2ãe@ ¨¬+]º}6Æh»ìß+þÄH+VA#AHzýü9#!—d]þ’2¿.³z#++dA2ž ZD0»Òý»Ld$ý´HdCMÐA+2þÚV2L  zJpÊ@K. *þ»: NE %š…%0õ ^’_ûþ²þÖþÜMÚ  (      pu6)kU nG %:%0   •% m2:0 %%P…uSo?00 j" @% SS5;@uy}¢«ÓÙßåëñöû32#'##5##"/"'#3#"/#&676%772#35'&##'#533277327336375&'572753375&'&%''57#%347#322##&'#373'$/75'4767375'#"'#65435&'567'337356=4'#"%35'375#%37537535"37#753535ì ½ES  A 8Rù 4@ÉÇ—  ˆº J«71¸7J«×H°Š@ 7ù'Iý  /1b&o%¥/R A c^Dt ,' @bþÍJ$  þ3})!üè. KJí_%.(b Ë mK%þÞE7 ¸µ"” oS+Í eË\œ%7;¾  . ÊŠGþû. .ý` A7þ} n DË.7 S “Aý…„ SþÏþù+Gþ†$$#y ­€G>#êG9xI¨Î¿PLþÝ*2@ýÞ‡‡ÀyoID<@Ƈ§Ž#r\îŸ8,$ |#'#\²‡Ü8 ¬c²>¯q1©³r@#¸[¥çC I@27WG+\dœyyUN+ Ü91þy@1#\ÕLˆ–›Ÿª®²¹Üàùý 2##'7'3#"'##52527&/575''57365#653&'&'#7357/7'67373'32#&5#&'#5##'#"& '636;5#"35'37576=4'373535'72#5'#4'75&='7'757'547'765354374'4''57#'353'753753535'§©×?Î7–à  !s )—i*€ ¦, `‘±Ã3´ T - &G3KS aEZ &  ma9  / 1VM6CTSþ.ç:FÀýe ‡'œ+:´m-9- šþr  GÇ -Ttþ“'¢ 4á   LV6a H8ØA J˜ †î  JnkFŒ  Q/=‡}¢¥ V$þaþt7 ¬I1  ;P7Tˆ|ÂQ8$ {Œ +% Ni¾  ŸC$ %b7 öyIt;‚­µ++++ OOVgW1%V%C +*I %Öa_ ),$[+\b%1 $O þ¼$ %ŠSQ[aÂÆÓØáèìðöþ 2+"5&'#2#"'"'&=725?37"3275'&'4'535"'#&=6?325&#&#3435'#73#&5&563347#'35332?27"'&'735&'4'#&/7&'676;2;533235'7&'&#"736;7335'3735'7535&5343'5&#3&55'35367'&'\Ì *#”>G·MÓFþ…@WtIb*#Gw1ïCWi0dTMX“ l¯qŒq3S3(›2¶…;Š#~#wM¾i ›\%8…»¥M  .Qq,ôFXT%R&*CeG]ß®[bb$#Mš~#*&$$G þ0#MFi þ¶8-S10¥6CbCRmX ,`]fa%=…<2nUDB$h  VÛ¥0z)8 O‡~%n€ zg  =éuH<>0ˆœE/+G3+VI %gKA7+7I±0Œ8<=PN $OwW#m=0=ª%sgf€žO  7=[¤1 V~# *†0/3&rs10t °ULK{ƒ‰“—›¡¦ª®²¸¼ÂÎÔØÞäéíñõ7 532353#'#4'5'3#''#'4'+57"563257''&''5?'7'236;2##"7#573354'53533255&'$35&#'53%5#"3535375375#!4'35353535'3535'325335'35'#375377375#3'3353'33'Žœ•dÜ92+d22#òäG7 +Ü+9$$Sµ„$ €#.#2+]J=xäýUŽGuÙcüÀNUÀ2ò9²2+k*þ#OþÝ!-€d€jñþU$]qL7BmTµg  HþTè I 71* `˜ 1 ¼ Oþ× Úþj‘A ¢0  34%þÝy *m[ $     žUUNstžIþ×$1s’ª     SPT•›¥«¯·¼ÁÅÊ32273$5&##"'##'7'7337&=65333;65'6='35&'67673'353##$'4##&'4#4'332736?5##6=7'7"37535'37'35'35327673'37#;5Gp+N 49…¿ÅþYsB  % › E<,Š=µ 4¤y34+µ"3,x Xü¼ 1 Š"=h^þÒ Ç=#1QNg­ 7KF;”Î¥‘ …A= "+ x@¾ú<= V . û742PEEéüT4=E "ý R8SØâöÿhX?ˆ/T +1®2ý9 —,?ÆF % aþÕu ­V?md3E9wš•X ~ þ©¨Ð:Št@ ý»þpPqFY=ã0ap“Š?9‡,50‹Š93&&þ÷e&,^…,Šx,Ýx;Xþ×RX92,§LJRVZ^cgp¡§¬²¶¼ÂÈÌÒÙÝâæëñ÷ü 733'5334733'53#2" '#565'3"#'7#+'''#'4767332?6375'75277533273557'''373#57'#'#75"'###7%37"'5'3753535'3'3753'375363'353537275375375275653535É  // ÏP PY:!¤J&*"( \<Â!ð( I%/Ü 2Œ d…#þ ¢J(ý6]d ´È< <™e /5C/Õ( /dø.(þ@./þ‘ $JJýéá . þ žÔþí[¡=T‰Ô6.^ 1–.å& k±4¦7UDExˆjqþF'Z &&þ°SC  ", &$ `\Ae(/C^ XIþú6/ 8ÇP( €((P5ýõ+W¬F&þø/¨Œ(è"^ed(!<_Ö5(y !eë/#  ^yE’ 5erdŽ(ë× QJ† 9 LÎx" 9( (/5ñ6„8Š–.(1&þù)@S†!CBJ(  þô eSDHPVƒ‡“—›Ÿ¤©¯µ¹¿ÇÍÒØ23"#'"#$'477/535'7273#7##'#366;635543536=37#"475#'#'#"'%3537375#35353535''53753757537535&#35'2=35'R 9 K,cþ›M8Öþúò ?,8wü ã&? 9üóD˜? Ð pÄ&9~wL!ke8  J3Öþëýé E»þ(? 3/X E þ[Cv'~ww ‘23SD­lNô±ÁCmD/UW †:{}: S <þþ ZQ4$    hÚËN  WþÇ: p  ˆ3l¡·H Ë^Y ]m*   X: ¶'þt mS CTSƒ )9$$$  [X]e¨¬°´¸¾ÂÅÉÏÔÚàäè277373273776376573373'#373#5#'''7/65736#&'#"53&775773353727#'75#$536527'"+#"575'67'7'75354!&+&5?5337753775'35#3'!3'35'375365#375#335+#oj\/î_l#£+9dFqþÁxN+@úõ7^¿Sž$9*1UŽ$GÆIÒ9jÎ2b–*ÚÎ@œ*$þãh!*8#þž¨t#N21Î99Ž$q#ýfE#1*ñÓ[%&    }þÕž 6  ·§   &%! ç'ß{&x<;  hÕ0·þØQžyC¤%!!c A  :Ç+  (     þØ þ7 +;0FFi¢€<Bƒ‡‹”327#5#'7373&''57547543737'337#'57375'35'73%7'634;'#"'#"#32737'535"'"'77535353'57'375#'÷Ã?S Jd ?‰  ‡'* i?Mþü%t £::*%D @%   :: 1ö 5Ji/Jþþn? 1 " ÃÓ þ¯E?5D€ N¼ èþÐù    fÂ0Vg,¨0Fýòþ_A;bQ10w &7‚ +6,   & ­¿Lþ%%A\\þ)6; LØÿÛÿËu$(.LRX\`'#'#'53'##'##&''95#35'44'35&=3235'52335'35''55ÖPn˜Ð" €=+ (Ö[ B7+™\Û¬b$ Ÿ+ C«=þH11I +ä .þ\ýŠ !<­˜¢’j üõFb1&Ö`(þU“þÞþ üJŒŒP üƒi¢€<Bƒ‡‹”3&'$'#3737372'535'7355'##'&'57;7375#'#37$=735'5;75#&+#"5'56=75'327237'7573535375''#375:£ t%þüM?i *'‡  ‰? dJ S?ÃED%*Ž " 1 ?nþþJ/iJ5 ö1 ::   %@ ¾ Ý FD5?Ep0¨,gV0Âþš    ù0è ¼N QLýAþð­ &   ,6+ ‚7& w01Qb;A¡ýý%%A\\þ)L ;6ØÅ{F*.EM3##'&'"#5737475'735"5635&#36367537'"53737å~eE.' ! ¥I´y þè'À< G! Y','¥Íl?AY‰tsÛ ÷H1 F HV' ¨Œ)*è6    6åaYq6èþ÷  Cÿ=·]?HLPTZ73!#732#'5"5"''52=&#3?73%#&%#'375#53#4%5"'#35353535'ÃYç¬   sÉþ¨(þì“®þ" 4 ¤åoÈüИ ° ¬],  $ p0 0 ¨ <$4$ttˆ  «Ûƒ =BIQV\`ei67'?/&'&'7?'&'57'&/66'&/&7&77&7&'76'&7'7'&7'?'7'>‡ &8e®4TA >CŠ(ĤJB„Z• $°ka€1 &*"'C8Eš ˆ1&¼0&"9#-$®!"b ì4A'”.D (%10DUYO]l + 4[8 '3). #:D Û<.d1œ* 5«)Fò$%  0 ¡¿!*5;BPV[bj2732747#"'+"576335&+;2574'#373475+"'3272=;'35%5/"35&5>—kE43y<@—`U4ùx_M¨ £_ NÎ{¸d Ïþö Èl¨+<%K¾M"þ  E¥E"þ+Mp¿^^:0€ /uF¤¨ê9‚#þŒ€_ SÞ/ $ /ýýÞ0^£Ys=.RŒ#% Æö/ R°F/ FRi/ /&8 ]##/# (Bõò/3;?HNS]chlrv|323536372'5475&'7#'##57#47#'5673532735#337&+754'35'3674'#375#2757527#75365'àgI[*@Sþ¦l[[F*TM3‘*)y?ÒþËÎ(DA?Ná1*?þŒéaýà##ýžš yn 8**1ò•þã1£sþ–¢K ^r1%N9,bUm>ùÕ99þø+2cGV #9îvf¾\+UNGþNy7GU+ "PW^bgmsz~‚ˆŒ”˜3#'##'57"#575##65&##'"#5##375"=3276=32+"'&='36635'25&'3573'3&'35';5'37735'335533535‰ )8(197:0Mc©yéo sPÑuS(ƒ®(Cmx'zN0.¾e!X˜ !ývOz² ±\,™ýæ0¡(8H(È0X(`PE`Ž*(<<R-Co[R•S5jœa–6´‡4x2M5Ê…‡K<+D*%­%þ8Ê¡1q-- % æê?DUY]aglqu#37##'#'&'##''#&5"54743633732'533573347547533676&+"775353535'7537535Ù $&_"6Q Œr e)665_5=C(ýÃ"" 0 )/Z&sBR63@DDXþJ )6/Žê"6ýý$" 0) 9–Mr7â¤7Î\>7Ký„þ±"t=T)_<^=007""ï77g eû49@GQVZ_einsy}2#'#36?'673'533""##'#"&=74737535&'675'"37&#%35352755&'753&357375#'37ŸƒÆ'' YeþÜ5eÄwlN/'rši'>cy…N > u6ë9ƒ?þê“KK±A•;ý‚ýW*,@$þYSf''Vû–1#a.ÿÃ¥Ja5Lˆ÷ÒKDC€„x% F'$- þUu˜KOVZ~„Š–› ¦¬±·½ÄÈÌ33733#575#73#73'3##&5##'5335##&=7&#"#5'47673527&#5'35'733673675'73733754'"35'35'37535'3'275753757536="75#36=#7535‡ |Eh@O2v2h ¦#  'Kr cŽ-My>*, Õ    Z  m<Çäý  Y  ¨@*t0T<'A '˜A~ð &„Ê_&ýÂk,F31YW9 BjßBYF e3'ƒR·‘þý h ,7 8 -ÅJ2FL  -k&,9˜xe 9 žEEüR¼     þU?ûEL]bfkouy~ˆŽ“™232572#"53634337327?'757#'#&=75"'5335'47625&'33736?&#"%5&37"37"3535'3765"35'7'5"375#367#35'ã5-%s#6 */HYa™»k?mE © Q †ù%> ˜TDÖ &46 ªˆËH%,þ\ 0!G4Ïš=uOh'*;þs ã ýÄ5 ,Y ˜6™> , „- # @ úP ?û'@- A GT½ýò0A4[Š%XG6• M»@:  ‡nMà–AM4%ïÕ ÆŽnm»2@`'A'!&&þÊ  ÛgþÝ-TG-;ü G  ÿ[æã7=AGK637#'#+7'5275##4'"#'#" 7'737'735'3'375#35EOc ¥!EÆ81 < !$ žE   #{   Z   ¼ ãMþ0LkäEþGq ¼%œ.~,Rü ,8kR  Š 9þT¶ªkþŸ88 îL )/4DI ##"'567'567#24'35&325&+35'5&2#'5"/75q75$gN+U•  , +"igЂРBþÍ®E_h¤4, 4  T +4 , L`%` ~)<0 Z+$a*m*mþÇ0$ýoIB BI $®BH* f ÿˆþUÐS )/4gtx}ƒ‡2##"'567'567#24'35&325&+35'5&2''#&6737363"32652'#3652753'7#7&7#ÂÜ& H8=i JIb\b0Ù{1DJu$% r< ˆ++¤20 7 1& #/4‡#Jn ×  P {1)ÏSp*p“0F8##!h2*p1~#1~##þ•8*ýþÎ,*Jv¸J#?F86*?IB[. Bm2ü¤]=R8Œ81*# ÿ[Ý=mqu{…‰”š676336?5'3#'65632=3237&'&'&'##&##&#'5"'#75#'57'535'533554343'73535543753535335'#375#´(À?šd]ïòB rIãP®F !^5Jq†—‚!:.† (" 5B$  ýÏJq"/==TýÕz• ?~_µØE CU?Q…<§ÃE þÞ   (b G¨Aþ€8 D¾22?Ĥ9 Š8ë qFý–%%899ÖL .@9 99e 3E EоFJNTZ^bhlquz…3373373367#'36?33735435"'55&'##6=7'73347353537535'7''#375#'5'35'374#375#375'È *:  \3 :*E/A8E / m›4r"0  j:  “ o /5T  Y  0¾-'-u ³ó«K ¨—†N3C"J =†T>ö8 >!(^ MP 'p8-@Ô§'Œ{{ý - "   ! Kïlqw}ƒ“—¢¨737673#57"'#54'5635'#""#5##'6=#'"#&#&5##'#'75'533'533637'5634!375#75'67#%7354'35'7#%35'3735'D F°> a  2 Ë,# 5jK 2F)@   #  oFCva  ,,  #5 &p©|= “Ö$þï s= ,þÌ(S *!5Xý¡, #öO F¤ þ%õ  ïJPkþî]6",Nþ¨//'9»¾’GG"ïVþcN7/:qˆ¤þkÄ '."þ×+¥¬>¬7/nf3J>bœk N7NFNF++''>fN þÍ·SW]afjptx733373#'5&#'"5##"'##'#57"#'#75#575#57'77337323637#35'#756753535'3535"!t:l2)™xK ;C×*   % B![[" ! û 2¦B­&-S2 ×þ1 -þÄþ´"4w•þn«C-œÎ*•öþì…Q4i&çhJ4a- <%a÷LwŽC~AHþù%%4;޳oxxŽ--¿ó 48<AJPU\bitz $476%3635#"35335';276='3354'&+&35377547534727535&535'3275375#+"'335'‹4þÞ/éþ{£\‘ jK-Z67$ ýÏAk-±°Q ¾6$ Ð[HÄT=*E ý~ H?š R[\.'ü¿#¤¬v "$aTœþ†`yµ #A-.b£þóO^þd †? TFàí g<&æ'‰MC& >t† d"¶ n" ð } MM ¶ªó)I} ¥:2SBKIKR¾ R›Uþ!:!!2ž8) 6gß•11 ) <S !7J))Kþ@' |aµ J9þ¶K:k=.¥,&))11”[4 þd]ûFMQX^nrx€„ˆŒ2343#4'5#36733##56253'57'57''&'7&525&5672?75&#7#235&375#73765&# 75375365'35353535ÌP6KC"dT!´› þ¡2\: 2T:K_ 32'x!¸u $ó2eJO«Ú m"!¨BW`þü";Cš **Kþ  ûf¿ çXÍ“ Äþ†M†@ 9 &9 _ÝnS 3  Y_ þ &?T!…—_&SM…@? þÈrY†Mr@@S&&3&ÿNNTY^hlpuy„Š•™¡¥ª®´¸¿ÄÈÏÕÛßæìïôú 533#'#&'&'3&'#'##'5##'&'527'565"=65773753676365#35'5'373375#35537#7'276=&#73675%5'375#37'7#3527"327365327#"!3767#36753';5'375#367#35375'37535'5&35&%37;5"'35'35'Þ5[h|4ºq^&.y~ Q4{ws V*ZÛ   (,.#: 'uD (.9› ##@K þæ*y þìVÀO$¸(,o þ¸. )EmG2mÓ ýð ÅWýÆ ìýWIV?5 þ  É9VÏ ;.b"Š#(4mÛ~ "E?gc9Wþu î#. \]b#4Š  þÓ=2þï:E'Q39m%/ ?@T½X¥ ,& . 2t lFD!>L& 3   þ¼.8&L@¥™!  9 d_'-??, àL__ S#03   ,9  ²²DM ?`[; bs’-&S33}\bgmsw|…Œ”š ¥ª°·ÁÇÌÐÖ32#&#'54'#"3#&'3&5374'&57'5637363365254'&/#&5##"'6733635'5&'75#74'37#3775&53&5&535'35'5'3&'5'36='#275'35'653735'g¯8œ TA •@,@:lDXz·=//eç  ‰I8• Žv3° ·)`¯='Ò/#_QsX "/e"6fŽL "QQýý 06(aqSÉ/)3mfþ÷6F4H0"(ÅD)fô7!2b^Q[#+M9RQž= wL-X BÓ A3-}TR · £7z› –-,& 2 _'TD"9F/j& 5 HHF\222Y)=M‹0[ H‘‚onWH '  ¢Ôjnrx~„ˆŒ’–›Ÿ¤©¯3373373347363363#'36?33735435"'55&'##6=7'73347#+'675#'7#'5476?3535375375#35'7''#375#'5'35'374#375#375'd 2 F 2„;Œ'U1bœL  E3S9OCS 9 ƒ»@‰)9!  ,]/ Œf %ø@ &'þ»  y … 9@f  l  9Ô.'-w ·ÿ 6 8( *%iºP3D"K ?ˆU?û9 ?")` NQ 'r9-=¬$  3+¨‰(Ž~}ÙýÒ. "   "äûdhntx|€†‹‘—£©®³¸¼Á34334373337'326566=335335733273367367373##'"=#'&5#75733564353753753535353752=3753&35'35'37#35'3'!353&367#h((wXh (0"&0g/—(HègH§ =ýâ·HHþ-‡88þQGþš'Rýƒ( ˆ ýÚ6 ý;( ä$û0)0£þ ^=6*<·2Z¨"D0f(D þâ=þÒ…7?K]"s0é))f""·mª[œ=þ¦>>‡>–/Dàál7((DDz{6/67C)R‚"0 706= ! """  1SY_ciptz…‰“235732333673367336736732'##'#'57'#"'773'5735'7335'735'35'3535'#35'3537537537527356=MÆ_hq`b%C* =C þÁ5N3  y &  &m  3  --&3RSS¦@?L:-- .uHþä~þ-¢¨äÉK ‹ZtLlþ G)!I ' dDS8 ¸ ZHïþï ‘S­ê,,22j!{d ðå>Œ‹¢!dp uNv) ,Ûûvz€„‰–¤ª°´½ÃÉÏÔ3#5###&##&'#"'#&'75##''7#&335473235335'336733474737336337527654'737&53353753#%27'37575'37&35'37535'357'57'35'35'33756=Ë6HO&87 'v/07W /o?¶R4 __8v0 7?O0އH=/?W—ž?'(ûÓB G0§¶('l  þ«00þ<¼'8('ý(ûo-) 8þbþ©Q2V~8 —®)_L)B#e"+° [“`ÅP 9 tþÎþøÖ6[(R (lþñKþ³¦§C›>'r[N Qü“Ž t 833-<# .íAü7#(f—VQ ~ƒ~$(((GG3 ÿ—Š™KTY^chlv|€335'35&=3$373&#'##&'##&'##''7#'7##56%34/7'735'335&'367#35&773753735&/36575fÌ {,'5#Bþã‹ yœ8%:œlþÒ3XII,;ÅR23W_ÿoý“P11þã¯et¨¨:ÔJ{‹ÌÌø$™Õ+K¬gN/â eþúÿ'   õ‰> ]}&Åëþó,d2 L TÞò %>µEˆr‰H]qPoþíŠAœœ#þ¦Ź© ¦– ÿùþb,¡JU\djo776?'473'76'73767'5&?''#'6'6767/&7''67767&'7&'%767'7'?º ½  M+q  q  7$­_¸jB# ;šN¥7 d>h0!u   Sœ H <WRH­¶. •Oþ¯-þÕ¡þØ‚Kd?ˆ". ? #ƒ˜Šþt³³N( %’Þx$w4 #½=;uþLX 5GН7?4þD¼ò 6 ý¯  ÿ×ó}‚ˆŽ“˜œ¢§«°µ¼ÁÇÍÓÚÞãê257327333365733733733653327'6337'533&=35"'"'7''5473365'67675"'#57'#6733763'3&567775757535'3737367'2735353755'37575'37;567#ô   3U ˆ & a”‚3o7r \ @  ˜&+)i+&r67 +&;%m~’RiDKS1 ‘,N%g1<ùXV—Ù#þ¯êbr&—ab¾1 A1L! /[³É6! ÿ! 0 A6#/ó $ k @ƒS)/5!WÐÏ“GL2P™0)_/dMlWvA1($5  ¡Ï«ˆZ/ (*†ÐM)”:0;>Ï!¨—¥;#jˆAÉM  þG9v 00   $ GG5   /    pÿctÄgmrx|€‡™¢2";/5235&/56=7453367363"'#32'#&'&&#&'5435"57'73276767375375375#435375'35&535"'&5335ÒE›k+&Bpp2‰7 DK] 2 , \fa@S%  `IYQD½6D ' ‰&2D KOG%S{µ  c& µEKp  9, $L8W,JÄœnþ”MC1T+wþæU_6f ê G,$ª I} Z„Rt¥ó3(< fN¿Z 8^o´-  ؼ¦Ÿ?Ì**þ&HB‘  r*`|F6W\n+00`o0•ˆ#Vb1#R e -5(G5JK9 rS ,F5ƒG , ,    h’]149$‡ˆ X Xr B,rc%#,b$4SL¨®0&+"!!!27!7654'&'#53&546;2#&ìHXdZT5hþ²#¢’‚;1gý1»"¡‡:÷·KÝ:Ce]”‡Š<?K¡Ö„ç2î´MB 54&'&'&54632;2632!2#!!2#!#"&#"#"&54676767>#þ Óyþ¨ 3+Aƒ` ÀD9!!ž )  / 84‹F & ?T©C þ’.eÿýî ›C[ë Jáò  ¬  9bÅ   D+Ý"F Œ   f Î  9o  ' ×rH   D«þ^K*3#3#«    süëÌüë%xþd?-t~”˜ž¥«±¹¿ÃÛßåëñûÿ  &+/6<BPU\lp#'##"5#5654/#"2'#&5&'7'573437334;75&53373327'5737'&535&'&5475&57'4%3754'#673237&#5'34775375343&27'#75#3'7'#"34'373&=3275&+535'"%3%37535&35&374'353753'753'354'5'3#35'37"3#36=5'35'#'3'5275'37'5'&'675+''353íD=>±[ L™M>T..™ "BZFý6-&&56Š'Ig·’°#¤‰ = DM‡V·.‘6.¬0—5Fcd'&&6) 9)(sE+p+9)uEEÇkE\“41hMzþí==AI56'þËþ™..TEE‚M.&õwþ¥=cdþ-&&ô=-D9ID\¡T=$ ¸\47&\'&c=¨-IAGY+ \ 'ðma)1WT[“ ØYf'8y n@oP >%K8f;;!32&u‚’‘[je;ŠŠ:N4+|)Š3m_ ),\=‹I,IIþÇXJ`e;$$2)þì'8'Sf$ÌH„¶ƒƒVm$3WB8K,$$3A:½$$ +qF6%½,¶,B̃If> ½:3$P ,t3,,? B,+5++3Ñv]'7632#"/&54%7632#"/&54ßG E E L {G E E L  H I K V H J L W dÿî&°/Z2#"$'&5476$3267>54&'.#"".54>323273#&'&+2653H‘hfqqjiþô•’þøjjoohfþ³_ffabò‡‰õaahh]`ø†‰úŽô€ƒô„&J'*H,4OHKV¡)! u[H^|Œ5Á°qheþî’“þòiimoih •”ghqþý`÷ˆ‰ôa`fe_b÷‡†û^`ggûÒˆê~~ì… Æ^~rZ^yÎ1(pFd.Q®°K3#3#®VÍÍVÍÍß/%þöþö%//%þöþö%WŸÿ!#!WHbýÿþˆdÿî&°9Qi;>7654'.#;!53254/"';!53254+5!2#"$'&5476$3267>54&'.#"ï!= 0AŒRd2"þ¦-EK**$5þÄ+%%+d@=32#_#)!)þ¶E_#((Ë]¡›####.5463¡R¦T®Ëײ›Fú«Uú«â½—À8{F7632#"/&54‘R P P  X äTV Xe hþ^32654'&#"73672#"'hUCB91(>0?% V`ufmPþÞ4+--°hQILY e°7#553#553sÍÍVÍÍV°%  %þÑþÑ%  %þÑ(ôý)/6=‹’˜ÒØßå %*5<BFKRW\ahlpyŒ‘–Ÿ£©­±·343##7"'"%52765&=3637&%435';5&'237532#7'#'#535'#'6565#"''#2#53#&5#57&"'6674%325&#2&###6?5"73#75'35"5672'5675#3275#&'375#347#%3543'"#"'#'75##'67232354/%54';752=#27'75375'375#3575#35&#'7537"375!3435357'357#'437537335&'3737#7"6=3'375#3575375#& Ù“  §0³gþ¬+OENl—V'Eb(BýýO 1g7 K+7 •F¸QF=#¶1bF T#*pG( 01[ ej=H…BX¨E·9ZýÒ#žb%(#-À,!*1#[˜A["+6HìþäHEíMF¡wZmEþWš ,Ã1 )j#Gu„/%1 ÑþÆ8?:#1Êmý½#ýà8##}14Ø ý¨fý¡1f1ýÄïýç7!aýÙ¨oLS#ý&R%0 ‡ RK,?  ;r($+s =6#Xý¶…Ñ?ÒL1 ¢å8YNd/p 8*#7WowAò PŒŒ#TwýþO¶?0 ª*##Izæ+5L°0_ BR2S…–=„ j1h,8Ëo8F‹>21>¨bŒ#lX%/,*E*1"’\?Wþ‘þOÞz**S?1o?ØT?S„w#11#}E)"h#L))>MF##Œ#w1~`88#?T‹S}9u##‹#'ô*.EM›¢¨âèïõ*5:ELRV[bglqx|€‰‘œ¡¦¯³¹½ÁÇ3##'&'"#5737475'735"5635&#36367537'"5373732#7'#'#535'#'6565#"''#2#53#&5#57&"'6674%325&#2&###6?5"73#75'35"5672'5675#3275#&'375#347#%3543'"#"'#'75##'67232354/%54';752=#27'75375'375#3575#35&#'7537"375!3435357'357#'437537335&'3737#7"6=3'375#3575375#2t\@*$  ˜C¦o þþ#±8 B R$(#˜½c:J"   x$ $È /.ÆSM a/È ä fý¶…Ñ?ÒL1 ¢å8YNd/p 8*#7WowAò PŒŒ#TwýþO¶?0 ª*##Izæ+5L°0_ BR2S…–=„ j1h,8Ëo8F‹>21>¨bŒ#lX%/,*E*1"’\?Wþ‘þOÞz**S?1o?ØT?S„w#11#}E)"h#L))>MF##Œ#w1~`88#?T‹S}9u##‹#(ô'PU\`®µ»õû$/=HMX_einuz„‹“œ¤¯´¹ÂÆÌÐÔÚ32&5&+"3##'#535473236=6;#"'&#"3276;236?'52=#"'7335'4375&53532#7'#'#535'#'6565#"''#2#53#&5#57&"'6674%325&#2&###6?5"73#75'35"5672'5675#3275#&'375#347#%3543'"#"'#'75##'67232354/%54';752=#27'75375'375#3575#35&#'7537"375!3435357'357#'437537335&'3737#7"6=3'375#3575375#p5!Ä}"57'?ÄË7cQW'^:?†•/'?VF%?V/…7?si ý7?" 7þþF¸QF=#¶1bF T#*pG( 01[ ej=H…BX¨E·9ZýÒ#žb%(#-À,!*1#[˜A["+6HìþäHEíMF¡wZmEþWš ,Ã1 )j#Gu„/%1 ÑþÆ8?:#1Êmý½#ýà8##}14Ø ý¨fý¡1f1ýÄïýç7!aýÙ¨oLS#ÄaJl4)  CTQX8 1]4v‹*%$° R)  $8 >„X / 1 –ˆý¶…Ñ?ÒL1 ¢å8YNd/p 8*#7WowAò PŒŒ#TwýþO¶?0 ª*##Izæ+5L°0_ BR2S…–=„ j1h,8Ëo8F‹>21>¨bŒ#lX%/,*E*1"’\?Wþ‘þOÞz**S?1o?ØT?S„w#11#}E)"h#L))>MF##Œ#w1~`88#?T‹S}9u##‹#.ôé!&8>DPWajsÁÈÎ7BP[`krx|ˆ’—ž¢¦¯·ÂÇÌÕÙßãçí32#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"'32#7'#'#535'#'6565#"''#2#53#&5#57&"'6674%325&#2&###6?5"73#75'35"5672'5675#3275#&'375#347#%3543'"#"'#'75##'67232354/%54';752=#27'75375'375#3575#35&#'7537"375!3435357'357#'437537335&'3737#7"6=3'375#3575375#š+þøU2V/1/)f)_"R).Lý¥"f_}/7 þÁtC"ze _J]$s("(ýïXKX9 ñF¸QF=#¶1bF T#*pG( 01[ ej=H…BX¨E·9ZýÒ#žb%(#-À,!*1#[˜A["+6HìþäHEíMF¡wZmEþWš ,Ã1 )j#Gu„/%1 ÑþÆ8?:#1Êmý½#ýà8##}14Ø ý¨fý¡1f1ýÄïýç7!aýÙ¨oLS#é,’'g‰6GF&bx ! 49,AWCLK 1g,I /D !m 1bA.1 <¿ý¶…Ñ?ÒL1 ¢å8YNd/p 8*#7WowAò PŒŒ#TwýþO¶?0 ª*##Izæ+5L°0_ BR2S…–=„ j1h,8Ëo8F‹>21>¨bŒ#lX%/,*E*1"’\?Wþ‘þOÞz**S?1o?ØT?S„w#11#}E)"h#L))>MF##Œ#w1~`88#?T‹S}9u##‹#1ÿÄMý)/6=òöúþ (,15ÈÐÕÙßãéíôû !%).6:KRX^gmrv343##7"'"%52765&=3637&%435';5&'237573373'57375"=3"#'##75#&+"'5#"77#'75##5#"'##3"37725337357233#5"#%%&5275##55##6'7377##5733633275637353353535'#'#!;53733'3'#37537575'37%5'353753374%&'3232567'#&%&'&5335''''575##7'5357335'75'575'73367435#5''#''435&57'547'73767575'4'#&+''535"5!35''!3737374#35375#755'375#325#37535577536753#353#355'75'3#"5"35'235475'75''735&'3#'#35735& Ù“  §0³gþ¬+OENl—V'Eb(BýýO 1g7 K+7 þDfr f&3 - - Wny& 3 L  M %&93'9$ ,  9 @þáþU’  3 ?L-& (- l'&M þÎ39  D ø   -  “ ?@l¸ %& F ü˜ +",ƒŸþõx J!*T-_y3 Kþóu]& ŒZL&  ,  ¹  - f 9 ,--_ÿyL33F-SŒ-&²l ±†? ªü `Yœþè:L3S &f9 þµ 9¬Åß  þ¨  M þb3& ß ™&Å 9  þ¢ Q  ) @+9LMY -3,“æ¤& ý&R%0 ‡ RK,?  ;r($+s =6#X  ý  ',  •%T^# , h2& !     2 /Œ B<È GbðcÀ  1!!'          Šì &þçþt°Bs!!-GFJ[bhnw}‚†3##'&'"#5737475'735"5635&#36367537'"5373773373'57375"=3"#'##75#&+"'5#"77#'75##5#"'##3"37725337357233#5"#%%&5275##55##6'7377##5733633275637353353535'#'#!;53733'3'#37537575'37%5'353753374%&'3232567'#&%&'&5335''''575##7'5357335'75'575'73367435#5''#''435&57'547'73767575'4'#&+''535"5!35''!3737374#35375#755'375#325#37535577536753#353#355'75'3#"5"35'235475'75''735&'3#'#357352t\@*$  ˜C¦o þþ#±8 B R$(#˜½c:J"   x$ $È /.ÆSM a/È ä f  ý  ',  •%T^# , h2& !     2 /Œ B<È GbðcÀ  1!!'          Šì &þçþt°Bs!!-GR>G…F .a)E ,? yg .\=+. 9‹KOS…“𠥩°´¸¼ÈÌÐÕÜû 24323633432573#'#7###"'532?'##'67352=735#'56743535#3=7#565#327365'7'#7'7'65'75##&#37'753573353753753535353535237"=353535#3753275'343##7"'"%52765&=3637&%435';5&'2375\(P   gEj*O1°HŒ(ÐTH 4440Ö0$ þè$40@/Ñ (<   /ÑEa   þT$ Hh 0þ$D$T(.do ~$‡Mÿ! <4;R2A4J1þ|ü%M* 9 *S)þþçãîb$./9 /% 0 .…ˆMN  $9üÝ ½r Ùüéo ]þwþŠ.)fæ¦HD|=à/$9$ S*‚–NNXD9h4/ ..w)/9«þÉ339))°M *4I9 3)Ì&R%0 ‡ RK,?  ;r($+s =6#n$KOS…“𠥩°´¸¼ÈÌÐÕÜôú 24323633432573#'#7###"'532?'##'67352=735#'56743535#3=7#565#327365'7'#7'7'65'75##&#37'753573353753753535353535237"=353535#3753275'###'6?3373676375#375#3$?#"%375#5375#\(P   gEj*O1°HŒ(ÐTH 4440Ö0$ þè$40@/Ñ (<   /ÑEa   þT$ Hh 0þ$D$T(†#KþÙ0b%$xÄ" ,þOEF\3)&þ¯U ' þSzuS)þþçãîb$./9 /% 0 .…ˆMN  $9üÝ ½r Ùüéo ]þwþŠ.)fæ¦HD|=à/$9$ S*‚–NNXD9h4/ ..w)/9«þÉ339))°M *4I9 3)ë6 ¬/! +P/| þéÅ 0)¼ÑþÊ@;ŠKOS…“𠥩°´¸¼ÈÌÐÕÜ "*24323633432573#'#7###"'532?'##'67352=735#'56743535#3=7#565#327365'7'#7'7'65'75##&#37'753573353753753535353535237"=353535#3753275'3##'&'"#5737475'735"5635&#36367537'"53737\(P   gEj*O1°HŒ(ÐTH 4440Ö0$ þè$40@/Ñ (<   /ÑEa   þT$ Hh 0þ$D$T(’\I 2" x5ƒX ÌŒ,4A x–O-/AdTT ´4$S)þþçãîb$./9 /% 0 .…ˆMN  $9üÝ ½r Ùüéo ]þwþŠ.)fæ¦HD|=à/$9$ S*‚–NNXD9h4/ ..w)/9«þÉ339))°M *4I9 3)Ï>J"   x$ $È /.ÆSM a/È ä ;–KOS…“𠥩°´¸¼ÈÌÐÕÜëþ!-4>GP24323633432573#'#7###"'532?'##'67352=735#'56743535#3=7#565#327365'7'#7'7'65'75##&#37'753573353753753535353535237"=353535#3753275'32#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"'\(P   gEj*O1°HŒ(ÐTH 4440Ö0$ þè$40@/Ñ (<   /ÑEa   þT$ Hh 0þ$D$T(#œ227<L8 1- þœ<8I ¼D(HL<<8,7D  þÈ4,4!S)þþçãîb$./9 /% 0 .…ˆMN  $9üÝ ½r Ùüéo ]þwþŠ.)fæ¦HD|=à/$9$ S*‚–NNXD9h4/ ..w)/9«þÉ339))°M *4I9 3)] lLd (44HX     &* 0@1 8  h7 $L 6"2 ^P$H 0"$,>$'PU\`là $,04932&5&+"3##'#535473236=6;#"'&#"3276;236?'52=#"'7335'4375&53537#"'5257#!3%3'5'#4'375'3357'3573'73#5#'##'#&'#3537##"5#"5&=7'7'7'75'7'732'#"'"#75&73'52353535'3575353675#7#373'%3435;5&,¢uh,- 4¢©.RCG N04 n{'!3H:4H 'o-4_V   ý±4ð-Öo[;;U‘© ý U''þÚ   $7uŠ    . +'o Mþç!! ؃'   ˆ   3à€ƒ ý’@ þôˆü$¼. `UýWUv .!U Mþùo!ª;[$ÄaJl4)  CTQX8 1]4v‹*%$° R)  $8 >„X / 1 –Ô     þþ«…kq,5[V](þ2L­Àœq?Ï ³ŠÜ'} m= H,þýV-5~$ª #6$Î$ #   , k þ/tÄ6m+Å-j% "8¿ ýb,? Y Yk c–7 æD cüí6-6, $W ý—?\! þ QP Mî&R%0 ‡ RK,?  ;r($+s =6#&.8IsBŧL˜ê§Oˆ-φj3½=ˆò§5yEþ¸~=¯ÜŸs†,(´&¶5.þçj=-&b&5 .'6q&&—&-ŸDbc"HrcbSc.[[DSD q&c 9.-EQU§&:)V+.&5<%%-¶.þïÿ#.5<jt¥©·ÃÈÓ×ãëð!%*.5###'6?33736%6375#375#3$?#"%375#5375#327353#5##75#'#"'&5'63653&+"#'#3#"5##'3 7'567'565#56754&#'"53356#5"5'#'26=34757'352&/47235&#375;7332574#3753755&535735'377567375#õ#0kþ\E‹#53¬0#>ý—Îd„J:6þ å8ýž­¦| RO 6Y<›t  X.…? } Y‹“-ð½} ä 6 }B,-Î  û   <€> ³ŠÜ'} m= H,þýV-5~$ª #6$Î$ #   , k þ/tÄ6m+Å-j% "8¿ ýb,? Y Yk c–7 æD cüí6-6, $W ý—?\! þ QP Mÿ6 ¬/! +P/| þéÅ 0)¼ÑþÊ@;E&.8IsBŧL˜ê§Oˆ-φj3½=ˆò§5yEþ¸~=¯ÜŸs†,(´&¶5.þçj=-&b&5 .'6q&&—&-ŸDbc"HrcbSc.[[DSD q&c 9.-EQU§&:)V+.&5<%%-¶.þïê*.EM{…¶ºÈÔÙäèôü '+26;?F3##'&'"#5737475'735"5635&#36367537'"53737327353#5##75#'#"'&5'63653&+"#'#3#"5##'3 7'567'565#56754&#'"53356#5"5'#'26=34757'352&/47235&#375;7332574#3753755&535735'377567375#¯~eE.' ! ¥I´y þè'À< G! Y','¥Íl?AY‰tsÛ ÷H1 þJ RO 6Y<›t  X.…? } Y‹“-ð½} ä 6 }B,-Î  û   <€> ³ŠÜ'} m= H,þýV-5~$ª #6$Î$ #   , k þ/tÄ6m+Å-j% "8¿ ýb,? Y Yk c–7 æD cüí6-6, $W ý—?\! þ QP Mê HV' ¨Œ)*è6    6åaYq6èþ÷  i&.8IsBŧL˜ê§Oˆ-φj3½=ˆò§5yEþ¸~=¯ÜŸs†,(´&¶5.þçj=-&b&5 .'6q&&—&-ŸDbc"HrcbSc.[[DSD q&c 9.-EQU§&:)V+.&5<%%-¶.þï'PU\`Ž˜ÉÍÛçì÷û&,3:>EINRY32&5&+"3##'#535473236=6;#"'&#"3276;236?'52=#"'7335'4375&535327353#5##75#'#"'&5'63653&+"#'#3#"5##'3 7'567'565#56754&#'"53356#5"5'#'26=34757'352&/47235&#375;7332574#3753755&535735'377567375#¾8"Ì“ƒ#7:)AÌÔ9gUZ)b ³ŠÜ'} m= H,þýV-5~$ª #6$Î$ #   , k þ/tÄ6m+Å-j% "8¿ ýb,? Y Yk c–7 æD cüí6-6, $W ý—?\! þ QP MÔhO!u8-  H[W^= 5e8€—‹!-''½ W-  '> B_ 4 5¢¸&.8IsBŧL˜ê§Oˆ-φj3½=ˆò§5yEþ¸~=¯ÜŸs†,(´&¶5.þçj=-&b&5 .'6q&&—&-ŸDbc"HrcbSc.[[DSD q&c 9.-EQU§&:)V+.&5<%%-¶.þï!Ò!&8>DPWajs¡«Üàîúÿ "'9?FMQX\ael32#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"'327353#5##75#'#"'&5'63653&+"#'#3#"5##'3 7'567'565#56754&#'"53356#5"5'#'26=34757'352&/47235&#375;7332574#3753755&535735'377567375#.!þæ[6[3542,m,Šf$Y,1Qýz$mf…3: þ«{H$‚Š=mePd&|,$,ýÊ_O^< ^ RO 6Y<›t  X.…? } Y‹“-ð½} ä 6 }B,-Î  û   <€> ³ŠÜ'} m= H,þýV-5~$ª #6$Î$ #   , k þ/tÄ6m+Å-j% "8¿ ýb,? Y Yk c–7 æD cüí6-6, $W ý—?\! þ QP MÒ6!µ0€¨BXW/y”("@G5QkR ^¯\ <7%Z:Sž)‡ =y%"Q:!=IÉ&.8IsBŧL˜ê§Oˆ-φj3½=ˆò§5yEþ¸~=¯ÜŸs†,(´&¶5.þçj=-&b&5 .'6q&&—&-ŸDbc"HrcbSc.[[DSD q&c 9.-EQU§&:)V+.&5<%%-¶.þï¡sU' '7'77û÷c÷÷c÷øb÷÷cj÷c÷øb÷÷c÷÷cý)/6=Ž’ÍÓÙãéíõúÿ343##7"'"%52765&=3637&%435';5&'237532273$5&##"'##'7'7337&=65333;65'6='35&'67673'353##$'4##&'4#4'332736?5##6=7'7"37535'37'35'35327673'37#;5& Ù“  §0³gþ¬+OENl—V'Eb(BýýO 1g7 K+7  p+N 49…¿ÅþYsB  % › E<,Š=µ 4¤y34+µ"3,x Xü¼ 1 Š"=h^þÒ Ç=#1QNg­ 7KF;”Î¥‘ …A= "+ x@¾ú<= V . û742PEEéüT4=E "ý R8ý&R%0 ‡ RK,?  ;r($+s =6#œØâöÿhX?ˆ/T +1®2ý9 —,?ÆF % aþÕu ­V?md3E9wš•X ~ þ©¨Ð:Št@ ý»þpPqFY=ã0ap“Š?9‡,50‹Š93&&þ÷e&,^…,Šx,Ýx;Xþ×RX92,#.5<‘ÌÒØâèìôùþ###'6?33736%6375#375#3$?#"%375#5375#32273$5&##"'##'7'7337&=65333;65'6='35&'67673'353##$'4##&'4#4'332736?5##6=7'7"37535'37'35'35327673'37#;5$2nþPF$74°1$@ý†ÛfˆL<7þò9ý޲«Qp+N 49…¿ÅþYsB  % › E<,Š=µ 4¤y34+µ"3,x Xü¼ 1 Š"=h^þÒ Ç=#1QNg­ 7KF;”Î¥‘ …A= "+ x@¾ú<= V . û742PEEéüT4=E "ý R87 !¯1! ,Q0~ þäÉ 1*¿ÕþÄA<TØâöÿhX?ˆ/T +1®2ý9 —,?ÆF % aþÕu ­V?md3E9wš•X ~ þ©¨Ð:Št@ ý»þpPqFY=ã0ap“Š?9‡,50‹Š93&&þ÷e&,^…,Šx,Ýx;Xþ×RX92,ã*.EMž¢Ýãéóùý 3##'&'"#5737475'735"5635&#36367537'"5373732273$5&##"'##'7'7337&=65333;65'6='35&'67673'353##$'4##&'4#4'332736?5##6=7'7"37535'37'35'35327673'37#;5º\I 2" x5ƒX ÌŒ,4A x–O-/AdTT ´4$p+N 49…¿ÅþYsB  % › E<,Š=µ 4¤y34+µ"3,x Xü¼ 1 Š"=h^þÒ Ç=#1QNg­ 7KF;”Î¥‘ …A= "+ x@¾ú<= V . û742PEEéüT4=E "ý R8ã>J"   x$ $È /.ÆSM a/È ä ŒØâöÿhX?ˆ/T +1®2ý9 —,?ÆF % aþÕu ­V?md3E9wš•X ~ þ©¨Ð:Št@ ý»þpPqFY=ã0ap“Š?9‡,50‹Š93&&þ÷e&,^…,Šx,Ýx;Xþ×RX92,­!&8>DPWajsÄÈ #+059>32#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"'32273$5&##"'##'7'7337&=65333;65'6='35&'67673'353##$'4##&'4#4'332736?5##6=7'7"37535'37'35'35327673'37#;5 *þÿ S1S.0.(c'~ ] Q(-Jý´! c]y. 5 þÊpB!v } c ]I[# p(!(ýýVIV7 p+N 49…¿ÅþYsB  % › E<,Š=µ 4¤y34+µ"3,x Xü¼ 1 Š"=h^þÒ Ç=#1QNg­ 7KF;”Î¥‘ …A= "+ x@¾ú<= V . û742PEEéüT4=E "ý R8­2¨,vœ>QQ,p‰ & ;A2JdLW¢V8v3#T 5N“&} 9q!!J59 E²ØâöÿhX?ˆ/T +1®2ý9 —,?ÆF % aþÕu ­V?md3E9wš•X ~ þ©¨Ð:Št@ ý»þpPqFY=ã0ap“Š?9‡,50‹Š93&&þ÷e&,^…,Šx,Ýx;Xþ×RX92,¡4)/6=_hsy€Ž”™ ¨343##7"'"%52765&=3637&%435';5&'23752732747#"'+"576335&+;2574'#373475+"'3272=;'35%5/"35&5ù Ù“  §0³gþ¬+OENl—V'Eb(BýýO 1g7 K+7 þ1—kE43y<@—`U4ùx_M¨ £_ NÎ{¸d Ïþö Èl¨+<%K¾M"þ  E¥E"þ+Mp4&R%0 ‡ RK,?  ;r($+s =6#g^^:0€ /uF¤¨ê9‚#þŒ€_ SÞ/ $ /ýýÞ0^£Ys=.RŒ#% Æö/ R°F/ FRi/ /&8 ]##/# (B¡c#.5<^grx“˜Ÿ§###'6?3373676375#375#3$?#"%375#5375#2732747#"'+"576335&+;2574'#373475+"'3272=;'35%5/"35&5#KþÙ0b%$xÄ" ,þOEF\3)&þ¯U ' þSzuN—kE43y<@—`U4ùx_M¨ £_ NÎ{¸d Ïþö Èl¨+<%K¾M"þ  E¥E"þ+Mpc6 ¬/! +P/| þéÅ 0)¼ÑþÊ@;=^^:0€ /uF¤¨ê9‚#þŒ€_ SÞ/ $ /ýýÞ0^£Ys=.RŒ#% Æö/ R°F/ FRi/ /&8 ]##/# (B¡8*.EMoxƒ‰ž¤©°¸3##'&'"#5737475'735"5635&#36367537'"537372732747#"'+"576335&+;2574'#373475+"'3272=;'35%5/"35&5Ä\I 2" x5ƒX ÌŒ,4A x–O-/AdTT ´4$þn—kE43y<@—`U4ùx_M¨ £_ NÎ{¸d Ïþö Èl¨+<%K¾M"þ  E¥E"þ+Mp8>J"   x$ $È /.ÆSM a/È ä u^^:0€ /uF¤¨ê9‚#þŒ€_ SÞ/ $ /ýýÞ0^£Ys=.RŒ#% Æö/ R°F/ FRi/ /&8 ]##/# (B¡='PU\`‚‹–œ£±·¼ÃË32&5&+"3##'#535473236=6;#"'&#"3276;236?'52=#"'7335'4375&5352732747#"'+"576335&+;2574'#373475+"'3272=;'35%5/"35&5,¢uh,- 4¢©.RCG N04 n{'!3H:4H 'o-4_V   ý±4ð-Ö$—kE43y<@—`U4ùx_M¨ £_ NÎ{¸d Ïþö Èl¨+<%K¾M"þ  E¥E"þ+Mp=ÄaJl4)  CTQX8 1]4v‹*%$° R)  $8 >„X / 1 –^^:0€ /uF¤¨ê9‚#þŒ€_ SÞ/ $ /ýýÞ0^£Ys=.RŒ#% Æö/ R°F/ FRi/ /&8 ]##/# (B¡!&8>DPWajs•ž©¯¶ÄÊÏÖÞ32#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"'2732747#"'+"576335&+;2574'#373475+"'3272=;'35%5/"35&5j !à ?%?#%…#K_ G="8þB KF\# ( ëU2Z _ŒK F7D UþyA7A) ~—kE43y<@—`U4ùx_M¨ £_ NÎ{¸d Ïþö Èl¨+<%K¾M"þ  E¥E"þ+Mp/ž*p“;LM*j $ 8>/G^HR™Q 6o0!O 2J‹#v 5j G25 AÁ^^:0€ /uF¤¨ê9‚#þŒ€_ SÞ/ $ /ýýÞ0^£Ys=.RŒ#% Æö/ R°F/ FRi/ /&8 ]##/# (Bep)/6=rw~…”˜£§¬±·»343##7"'"%52765&=3637&%435';5&'23752#'#36?'673'533""##'#"&=74737535&'675'"37&#%35352755&'753&357375#'37Û Ù“  §0³gþ¬+OENl—V'Eb(BýýO 1g7 K+7 þ°ƒÆ'' YeþÜ5eÄwlN/'rši'>cy…N > u6ë9ƒ?þê“KK±A•;ý‚ýW*,@$þYSf''Vp&R%0 ‡ RK,?  ;r($+s =6#g–1#a.ÿÃ¥Ja5Lˆ÷ÒKDC€„x% F'$- eˆ#.5<qv}„Ž“—œ¢¦«°¶º###'6?3373676375#375#3$?#"%375#5375#%2#'#36?'673'533""##'#"&=74737535&'675'"37&#%35352755&'753&357375#'37ü+^þcy…N > u6ë9ƒ?þê“KK±A•;ý‚ýW*,@$þYSf''Vˆ? &Ê8' 3^7“þ¸è92Ý÷þ’KF–1#a.ÿÃ¥Ja5Lˆ÷ÒKDC€„x% F'$- e1*.EM‚‡Ž•Ÿ¤¨­³·¼ÁÇË3##'&'"#5737475'735"5635&#36367537'"537372#'#36?'673'533""##'#"&=74737535&'675'"37&#%35352755&'753&357375#'37Ú\I 2" x5ƒX ÌŒ,4A x–O-/AdTT ´4$þ¹ƒÆ'' YeþÜ5eÄwlN/'rši'>cy…N > u6ë9ƒ?þê“KK±A•;ý‚ýW*,@$þYSf''V1>J"   x$ $È /.ÆSM a/È ä 2–1#a.ÿÃ¥Ja5Lˆ÷ÒKDC€„x% F'$- e!&8>DPWajs¨­´»ÅÊÎÓÙÝâçíñ32#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"'2#'#36?'673'533""##'#"&=74737535&'675'"37&#%35352755&'753&357375#'374 %Ý H*G(*·("U"k PE"&?þ UOh( . þö`9f k¿U O>M `""þGI?J/ +ƒÆ'' YeþÜ5eÄwlN/'rši'>cy…N > u6ë9ƒ?þê“KK±A•;ý‚ýW*,@$þYSf''V,–'jŠ7IH'dz ! 5:,CYDN‘L 2i-J /E ƒ!o 2dC/2 =w–1#a.ÿÃ¥Ja5Lˆ÷ÒKDC€„x% F'$- =)/6=MR343##7"'"'52765&=3637&%435';5&'23752#'5"/75y!Z f m?Ð 0* 0Bø5*<(þÅÍ>" ." ÷T +4 , =5 W40 ) &IJ'Z#ö0$ýoIB BI $®BH* f#.5<LQ###'6?3373676375#375#3$?#"%375#5375#2#'5"/75ïAþ)U gª & þŠJ"   x$ $È /.ÆSM a/È ä ’0$ýoIB BI $®BH* f Î!&8>DPWajsƒˆ32#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"'2#'5"/75¸œ227<L8 1- þœ<8I ¼D(HL<<8,7D  þÈ4,4!—T +4 , Î lLd (44HX     &* 0@1 8  h7 $L 6"2 ^P$H 0"$,È0$ýoIB BI $®BH* f¿h)/6=JRV\rvzˆŽ“š §²¸343##7"'"%52765&=3637&%435';5&'2375 $476%3635#"35335';276='3354'&+&35377547534727535&535'3275375#+"'335' Ù“  §0³gþ¬+OENl—V'Eb(BýýO 1g7 K+7 §4þÞ/éþ{£\‘ jK-Z67$ ýÏAk-±°Q ¾6$ Ð[HÄT=*E ý~ H?š R[\.'ü¿#¤¬v "$aTœþ†`yµ #A-ýWÁºd4þÞ/éþ{£\‘ jK-Z67$ ýÏAk-±°Q ¾6$ Ð[HÄT=*E ý~ H?š R[\.'ü¿#¤¬v "$aTœþ†`yµ #A-J"   x$ $È /.ÆSM a/È ä 2þBþÐŽD3IeÙm—XH80ýûÿˆs4?¨o@(F‰€O:H ˆ7jUPŠeß9¶; ×· wר·×88˜PPW0'¿x'PU\`muy•™¢«±¶½ÃÊÕÛ32&5&+"3##'#535473236=6;#"'&#"3276;236?'52=#"'7335'4375&535 $476%3635#"35335';276='3354'&+&35377547534727535&535'3275375#+"'335'¼,¢uh,- 4¢©.RCG N04 n{'!3H:4H 'o-4_V   ý±4ð-Öµ4þÞ/éþ{£\‘ jK-Z67$ ýÏAk-±°Q ¾6$ Ð[HÄT=*E ý~ H?š R[\.'ü¿#¤¬v "$aTœþ†`yµ #A-„X / 1 –ˆþBþÐŽD3IeÙm—XH80ýûÿˆs4?¨o@(F‰€O:H ˆ7jUPŠeß9¶; ×· wר·×88˜PPW0'¿!&8>DPWajs€ˆŒ’¨¬°µ¾ÄÉÐÖÝèî32#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"' $476%3635#"35335';276='3354'&+&35377547534727535&535'3275375#+"'335'd &æ J,J)+É*#X#p SH$(Býó XRl* / þìd;j pÑX RAP d$$þ5M@L1 ï4þÞ/éþ{£\‘ jK-Z67$ ýÏAk-±°Q ¾6$ Ð[HÄT=*E ý~ H?š R[\.'ü¿#¤¬v "$aTœþ†`yµ #A-=E$ 2F< &a#2 I4P–#K KX9,(ë }"+P9l-þË 2 €› Kþ"TxïwþÑ~ A2 !=-2}rþŠ(#F5 ß¡=; W0*1A}ZP&9<.1#&S(#.} 18MQ 'BJ Y@4QE ^  )8  u 0 E =)þµA ] M$ OI0MA)55^( ,0E(!90-% ä~)/6=¢¦¬²¶º¾ÄÉÏÕÛáçìñöúÿ343##7"'"%52765&=3637&%435';5&'237534334373337'326566=335335733273367367373##'"=#'&5#75733564353753753535353752=3753&35'35'37#35'3'!353&367#ê Ù“  §0³gþ¬+OENl—V'Eb(BýýO 1g7 K+7 ýj((wXh (0"&0g/—(HègH§ =ýâ·HHþ-‡88þQGþš'Rýƒ( ˆ ýÚ6 ý;( ä$~&R%0 ‡ RK,?  ;r($+s =6#u0)0£þ ^=6*<·2Z¨"D0f(D þâ=þÒ…7?K]"s0é))f""·mª[œ=þ¦>>‡>–/Dàál7((DDz{6/67C)R‚"0 706= ! """ äñ#.5<¡¥«±µ¹½ÃÈÎÔÚàæëðõùþ###'6?33736%6375#375#3?#"375#5375#34334373337'326566=335335733273367367373##'"=#'&5#75733564353753753535353752=3753&35'35'37#35'3'!353&367#_$3pþJH’$85³$2%Aý|âi‰M<9þ û:ý‚µ®5((wXh (0"&0g/—(HègH§ =ýâ·HHþ-‡88þQGþš'Rýƒ( ˆ ýÚ6 ý;( ä$ñI,$ê@-:m@© þ† A9ÿþZWP0)0£þ ^=6*<·2Z¨"D0f(D þâ=þÒ…7?K]"s0é))f""·mª[œ=þ¦>>‡>–/Dàál7((DDz{6/67C)R‚"0 706= ! """ ä]*.EM²¶¼ÂÆÊÎÔÙßåëñ÷ü 3##'&'"#5737475'735"5635&#36367537'"5373734334373337'326566=335335733273367367373##'"=#'&5#75733564353753753535353752=3753&35'35'37#35'3'!353&367#®\I 2" x5ƒX ÌŒ,4A x–O-/AdTT ´4$ý®((wXh (0"&0g/—(HègH§ =ýâ·HHþ-‡88þQGþš'Rýƒ( ˆ ýÚ6 ý;( ä$]>J"   x$ $È /.ÆSM a/È ä ^0)0£þ ^=6*<·2Z¨"D0f(D þâ=þÒ…7?K]"s0é))f""·mª[œ=þ¦>>‡>–/Dàál7((DDz{6/67C)R‚"0 706= ! """ ä!&8>DPWajsØÜâèìðôúÿ "',0532#"'6;6!3373#"'6;65'#57&#275'#335&#35'34/475#347#3275'#"#3&57375#"'34334373337'326566=335335733273367367373##'"=#'&5#75733564353753753535353752=3753&35'35'37#35'3'!353&367#> %ß G+G(*¼("V"m PE"'@þ UPi( - þóa9g mÄV P>O a""þBK?K/ ((wXh (0"&0g/—(HègH§ =ýâ·HHþ-‡88þQGþš'Rýƒ( ˆ ýÚ6 ý;( ä$.š)m8KJ(g~ " 7<-E[FP•O 3l/ L 1G ‡#s 4gE14 >0)0£þ ^=6*<·2Z¨"D0f(D þâ=þÒ…7?K]"s0é))f""·mª[œ=þ¦>>‡>–/Dàál7((DDz{6/67C)R‚"0 706= ! """  ÿùþbV=#.5<‡’™¡§¬###'6?3373676375#375#3$?#"%375#5375#776?'473'76'73767'5&?''#'6'6767/&7''67767&'7&'%767'7'?;&Sþ¸6m*'†Ú& 1þiNf9-+þŠ{ , þ#‡‚Þ ½  M+q  q  7$­_¸jB# ;šN¥7 d>h0!u   Sœ H <WRH­¶. •Oþ¯-þÕ=6 ¬/! +P/| þéÅ 0)¼ÑþÊ@;5þØ‚Kd?ˆ". ? #ƒ˜Šþt³³N( %’Þx$w4 #½=;uþLX 5GН7?4þD¼ò 6 ý¯  Ú¾%;!53254+5673Hd.þF.do0Þ'0ß­22­°M,EqÝ7#š3#'Ýèvè:éé7cþØØÝ6#š373#Ý:éé:èvšÖÖþœþ«(5!þ«}}Û7#E 332673#"&Û3tmmr3”{z–EIDCJ…‰Š˜vo]7>32#"&/.546¦E GG  K HL  L W  O7²š 32654&#"4632#"&›:**:;));LfJLggLJfé*::*(;;(KfgJKggqþ^á!3267#"&5467€GO6.(;$mAFXye>s7/8!?DG7L¡7êl(f+"'&#"#>3;267(aN2?B0'+ 6bP.C@0$,fgf)3ji(.Ù7&š >323>32Ù+(Íã+(Í7,&(&Ô,&(&Ô8£5!8ä£xx£5!£xxºø¶) "&5463?,YŽDIøƒVmë++“w**wøs) 2#5674'5î,YŽDI)ƒVmë++“w**wþès 2#5674'5î,YŽDIƒVmë++“w**ºø) "&5463"&5463?,YŽDIê,YŽDIøƒVmë++“w**}ƒVmë++“w**wøÔ) 2#5674'5%2#5674'5î,YŽDIØ,YŽDI)ƒVmë++“w**}ƒVmë++“w**wþèÔ 2#5674'5%2#5674'5î,YŽDIØ,YŽDIƒVmë++“w**}ƒVmë++“w**Gþò°2&'&5463267632#"'&'#67#"&54632æ.9H<9K7. `Qe1<7- hU^fj&lf `Re1;7, iUþaQe1;7, iU^.9H<9K7. °eþ4ýþÌe° -9H<9K8.Fþò¯[%67632#"'&'#"&54767#"&54632&'67#"&54632&'&5463267632#"'&'^Uh -7<1eQ` .7K9þç7654'.'&#"#'7;27654%.547%#"'&';!53254+5!323!6732#.#""'&#"#"&'#™)C9; DvUB88 }³"5G17;9F\;;þýeVIþ8)2¶cd[!faýÐ`gg`j\Y[42 Ø2*D6Ÿ*{H@Mëz[Sf~:/|chýj f3,†nW\tÍ*#þ$ýSQ&À‚,,45Sf|4xUyIe]r@þÏë22ë`ë2<>sq|cþŸBTI "' ´¹"œ'' 7Œ gH-D6'0 “4,5j“—àlT $ÝÙz""!J–j/#+ 1ƒ"O:6S Ö" S &#+W1þÍ5 þœ"1¯" ¶þl 1"\ "?  Xu´k]:ˆ‰a  W; 1 I X;"k:1þÈ=#Ka{ *  1( ( !81"O1‚ ?  …‚B J  E  X     "-   —$  ¢£vJ'0(@,, l^h;?,Š7 66^" 8       E " # _y  ' 66pÀ¨'5ž€ õÀ1§f #D' D Ø6‰;I- ; lg ,   H©l vÅ;  z' '6 ØqR¶ Mÿ穳1327>7654'.'&+#".54>32&'5 è_G@@FsaGA? DtÁqÍppÍqtÎlmgTþÕ±2¢)&zØ95ƒrIL*+zÛ82rT…„ð‚Aë 7ýÆ1š ! !þj!þ–ûÕ«ûÐúf0þ^»š#";!53254+5!#";!53254#ÿffaýÐ`gg`‹affaýÐ`gghëúÿë33ëë22ëúÿë22ëëxþ`xš !273!527 !#&#!#üì{‚;1güg>,—ýi,>™g1;‚þ$ün¶è25 [92è¶W‡Ÿ5!WG‡Œ‹373#µ¤JUØ–Hg#¹¾<B`·:+O&'&#"327>7327>76=.'&#"67>32#"&'&'#".54>32·;.& 1W3. /W; RE6 >oC:%'Cx0 "zCCzDDzCCz" ^44`33`44^óg E2.,0R  CT`90 P=66 îŸ++þÉÐýçþ†^›'#"&#"5>32326#"&#"5>32326›?v9<ë;3qI@v7@ë74qI?v9<ë;3qI@v7@ë74qœH3a8TœI4c8þøœH3a8TœI4c8WŸÙ 5 5!Ÿýqü¸Hü¸G2þ™þ§áSäû(Œ‹WŸÙ 5 5!WHü¸qýGÙþSþ§cgûÐŒ‹'Ú4 ;4; ;*S ; ?} –¼ ÌØè lø  0d  T”  ~è  – f  – ´v„ –– –¦´ – –$Ä-Ò  – –  –  –Typeface © (your company). 2008. All Rights ReservedRegularfemkeklaver:Version 1.00Version 1.00 May 15, 2008, initial releaseThis font was created using FontCreator 5.6 from High-Logic.comoby ejnénormalStandardš±½¿½¹º¬Typeface © (femkeklaver.nl). 2008. All Rights Reservedfemkeklaver:Version 1.00Version 1.00 May 15, 2008, initial releaseThis font was created using FontCreator 5.6 from High-Logic.comNormaaliNormaleStandaardNormalny1KG=K9NormálneNavadnoArruntaÿ'–ì  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a£„…½–膎‹©¤ŠÚƒ“—ˆÃÞžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€ìîº×ØáÛÜÝàÙß²³¶·Ä´µÅ‚‡«¾¿¼÷ Œ˜¨š™ï¥’œ§”•  uni00B2uni00B3uni00B9uni02C9lirapesetaEuro afii61352uniF001uniF002ÿÿnumptyphysics-0.3.10/data/help_text.html000066400000000000000000000045511425065123200203320ustar00rootroot00000000000000

What To Do?

Harness gravity with your crayon and set about creating blocks, ramps, levers, pulleys and whatever else you fancy to get the little red thing to the little yellow thing.

Drawing Stuff

Strokes

When you draw on the screen you create strokes. Each stroke is like a rigid piece of wire with a mass proportional to its length. A closed stroke is just a wire bent into a shape, it has no substance apart from its perimeter.

Joints

The ends of a stroke can (and will) join onto other strokes when drawn near enough to another stroke. These joints are pivots so you can use this to build levers, pendulums, bicycles and other mechanical wonders. Jointed strokes can swing past each other without colliding. Join both ends to make a rigid structure.

Different Strokes

The Tool Menu allows you to create some special types of strokes:

  • Ground -- a fixed stroke that does not move.

  • Sleepy -- a stroke that does not move until hit by another stroke.

  • Decor -- a decorative stroke that does not have a physical presence.

    Cheating

    There's no such thing as cheating - it's all in your head. Sometimes it's handy to pause the physics when making something complicated. This is by no means necessary but try making a bicycle with live physics. However it is commonly held that changing the pen colour and drawing a red thing right on top of the yellow thing is almost certainly a cheat's solution.

    Controls

    Basic drawing is with finger or stylus.

    Undo by tapping the proximity sensor or one of the undo Shortcut keys.

    Swipe from the right for the Play Options.

    Swipe from the left for the Game Options.

    Shortcuts

  • space or enter == Pause.

  • U, backspace, or down arrow -- Undo.

  • R or up arrow -- Reset.

  • N or right arrow -- Skip to next level.

  • P or left arrow -- Go back to previous level.

    Play Options

  • Pen -- change the colour of your pen.

  • Tool -- modify the how your strokes work.

  • Pause -- freeze time in the physics simulation.

  • Resume -- unfreeze time in the physics simulation.

  • Undo -- remove the last stroke.

    Game Options

  • Menu -- access the Main Menu.

  • Reset -- reset the level to its original state.

  • Skip -- skip to the next level.

  • Edit -- edit this level or create a new level.

    numptyphysics-0.3.10/data/i18n/000077500000000000000000000000001425065123200162225ustar00rootroot00000000000000numptyphysics-0.3.10/data/i18n/de000066400000000000000000000015771425065123200165470ustar00rootroot00000000000000%d stroke(s)=%d linie(n) %d undo(s)=%d undo(s) %d while paused=%d während pause BRAVO!!!=TOLL!!! CHOOSE=AUSWAHL Create jet stream=Jet stream erstellen Edit mode=Editier-Modus Erase mode=Lösch-Modus Exit Editor=Editor verlassen Gameplay paused=Spiel pausiert HELP=HILFE MENU=MENÜ Move mode=Verschiebe-Modus NUMPTY PHYSICS=Numpty Physics (DE) PLAY=SPIELEN Play=Spielen Review=Anschauen Save level?=Level speichern? TOOL=WKZG again=nochmal cancel=abbrechen decor=Deko done=fertig edit=bearbeiten erase=löschen exit=verlassen ground=boden interactive=interaktiv jetstream=jetstream level=level menu=menü move=bewegen next=weiter pause=pause pen=stift resume=weiter review=anschauen rewind=zurückspulen rope=seil save=speichern skip=überspringen sleepy=schlafend time: %dh %dm %ds=zeit: %dstd %dmin %dsek time: %dm %ds=zeit: %dmin %dsek time: %ds=zeit: %dsek tools=werkzeuge undo=rückgängig numptyphysics-0.3.10/data/i18n/it000066400000000000000000000015671425065123200165720ustar00rootroot00000000000000%d stroke(s)=%d linea(s) %d undo(s)=%d annulla(s) %d while paused=%d durante la pausa BRAVO!!!=BRAVO!!! CHOOSE=SCEGLI Create jet stream=Crea stream Edit mode=Modalità Modifica Erase mode=Modalità di cancellazione Exit Editor=Esci dall'editor Gameplay paused=Gioco in pausa HELP=AIUTO MENU=MENU Move mode=Modalità di spostamento NUMPTY PHYSICS=NUMPTY PHYSICS (IT) PLAY=AVVIA Play=Avvia Review=Rivedere Save level?=Salvare il livello? TOOL=STRUMENTO again=ancora cancel=cancella decor=decora done=fatto edit=modifica erase=cancella exit=esci ground=terreno interactive=interattivo jetstream=stream level=levello menu=menu move=sposta next=prossimo pause=pausa pen=penna resume=riprendi review=rivedi rewind=riavvolgi rope=corda save=salva skip=salta sleepy=addormentato time: %dh %dm %ds=tempo: %dh %dm %ds time: %dm %ds=tempo: %dm %ds time: %ds=tempo: %ds tools=strumenti undo=annulla numptyphysics-0.3.10/data/i18n/ru000066400000000000000000000021611425065123200165730ustar00rootroot00000000000000%d stroke(s)=%d лини(Ñ,ии,ий) %d undo(s)=%d отмен(а,Ñ‹) %d while paused=%d при паузе BRAVO!!!=БРÐВО!!! CHOOSE=ВЫБОР Create jet stream=Создать Ñтрую Edit mode=Режим правки Erase mode=Режим лаÑтика Exit Editor=Выйти из правки Gameplay paused=Игра на паузе HELP=ПОМОЩЬ MENU=МЕÐЮ Move mode=Режим Ñдвига NUMPTY PHYSICS=Numpty Physics PLAY=ИГРРPlay=Игра Review=Обзор Save level?=Сохранить уровень? TOOL=СОФТ again=Ñнова cancel=отмена decor=декор done=готово edit=правка erase=лаÑтик exit=выход ground=Ð·ÐµÐ¼Ð»Ñ interactive=намёк jetstream=ÑÑ‚Ñ€ÑƒÑ level=уровень menu=меню move=Ñдвиг next=далее pause=пауза pen=перо resume=дальше review=обзор rewind=отмотка rope=Ñ‚Ñ€Ð¾Ñ save=Ñохранить skip=пропуÑк sleepy=Ñонный time: %dh %dm %ds=времÑ: %dÑ‡Ð°Ñ %dмин %dÑек time: %dm %ds=времÑ: %dмин %dÑек time: %ds=времÑ: %dÑек tools=Ñофт undo=отмена numptyphysics-0.3.10/data/icons.png000066400000000000000000001332221425065123200172670ustar00rootroot00000000000000‰PNG  IHDRš6XØTösBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxœìw\SçþÇ?O63l=Tp£¸÷ª©ŽÚ´´Bé^öÖÒqm·­··åÚÖ¶·S…ZÚØjµj­»NTÀ,Q6ÈÞI ëüþ8I –Êôy¿^¼^93OÂÉùœç; Ã0 P( ¥»àôö( …2°¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n…×Û  â¢Ã†À@€Ô𘛽:0 …Òë†az{ ”~N\t˜/€GMl>óW‰B¡ô!¨éìDÅ›K¢â¹½=ŽÞ$.:L `9L‹ LŽ‹sëÁ!Q(”>ÑA±0Àu†aêuë±ÈR,˜÷l”Ÿ•ƒ«3ápØ0P ^œÝkïEâ¢ÃØÁn%~ ÑöÀ(JãžBÈ ÷xÀ\"ݦR°OéÖ0šùB´V®y޾£2ý§-M;{5è6]‘FïêÁ¡÷:qÑav^BÇ3cÀ¿CÂcÔÝ?*JO³a]0àÀ€ € k×Ç—÷î¨(}‰{Fht&.1nÝ-NüøÁÅçßcæ¶‚"¸°7ýÁ0aÖi¨*1Ë:·P/2"Kq…ûˆ©|ÆÏ¿æàP£Õ¨IÍÍ+‘¥ÒLìШ»Yª‹oXe_8èŸ{éïiJy½ ܼ–<éú¹ƒ'-’K¢â㥑Á÷Â4q&Ú1™5Èšxï}vèÁO×-ù’߃ã¢ô‹8v°@€  ë‚3_»>ž†¼w€$)“À@™4È¿ß?¨ ¡‘DÅ›½ùCÛP€‹û¶LѨ•"š[W-|ù‹-æ6Žúí.±sRgêX[W¿ú žO>geÊÑMשּׁ++ô€«‡¥ ý&Ü—K8\ÍÝú\}‘Žf3yE5–ïqhUm]£=!DàLÏŽÒèü2£»x˜?ÿ ë‚į]OƒCZ IÊ䂿¬tëä8& ò¯èÅáÝ6ý^h$Qñ¬Ÿ`>ZOáMR[’ë¡=djÈQc‘é,fÖöMSY»çÐ7k_ÒjÔ|E]¥KNòѦ„íŸh‘ÑÑælæüå§Ï6Ÿ”ÈäJ±¥…°À…ðYÏÒ˜ãöïãXnX¼} ˆ$)Ól² ØÍBפAþ¾·H’2},àõy9ææÎƒ¹"‘%€ü$I™Ri¿³ôë<IT¼€g,E'E䵕Îúמ£gäÞîûÛ¹©ZXWé—y|¡ƒNø,íÍföJüñ7ÇŸ’É•bð¹ ÐÙÌ@¥Q÷w»˜w—ÆÒ£BÌ !„$eNð<ØÏ`"€‡¬‘$eîè|’¤L{IRæcž„NdR¾ÿjÄÇ~ñìÿ½9ÓhW‰nÖÓ¯è—B#‰Š$‰Š `Pgc´’vl‡¿FÕd fê†uÁÞˆû„gÜp@µP,>Wyõò#0=»X!IÊlÓ%IÊàYC .7Ûbßòàǯnúz¹Z¡0/8zpæ_/[‘õáx²‰£;§G[çë«ô+Ó™$*Þl®Ë(tá†^”~Þ鯹ýcʲ¯ŽR5É­ôëͬíËîd<ŒVCÔJV´@­jª‘FS€)t³™fÉ™-C>üâð‚¤«E“[î/“+ {lp”cú`.ØÄf³ŽöÍ-¬¶Ù{(}^AqíHý:owÛË/>9y7ØßðX×»m°wBÈ‹þg¼NYW7ñðÓ¡^ ‚OŒ{ýískqË\1!ØYÈ&i¿Üxƒ$)3lU œ~óÕÙÇOg´š[3†!U©Ã«2R‡çÚ?iäÓ/î²ò±E’¤Ì?¥AþEÝñ9»ƒ>!4’¨xk°É^^œ\, Ví3ìÔ´Óӯмt›ó;¿ ®-Íbj»•ƒëE¿¤ÿ½k¨ªQf \¾ ÑÁkXÒœ¯Ðl6S[ßÈ_·á¯å¹…ÕCõëx\ŽJ­Ñò@­ÑV@\t˜'XS‰5Ø‚›åކ„Ç(zrð”;cú`k°þ¹hGd†Á®i3o”®®U´.?D`•9bÃºàøµëãû´â`£a™Ã©fÆ C´*¥ gßîù…ÇOö̾᫟Élq¸-ØPïÃú’¤L?èD&-æû€»wLm(*lw¦ÒX]åüÙV¹LšZbåå!IÊ<- ò?ÜÞ1}…^IT¼€§ðV»˜)‰Š?à XÙøÎžS£jâœßùÕÔüË'fiuù0zxB³'Ÿ)¾^ñ9µäNÆ~ãÂ_Sõ¯ýÆœ·´s9v'çëËÄE‡™Ã(Ê(;¿Êêƒ/K*«å.úu~^öéž®6EÇÎÞ˜BO À¯Å鼌ˆ‹; )$<æ^,9Ö.[~KZ˜y£¼Õ W‡–³~k}Zh¼ Ýý’+\~pÿÉ]E'z]úêÓû++@%k°JùîËå6C~p6³ee„aK’29`Åzf}^ŽåÉÈW¬½‘ÕêAØÒÝ#ß'ä¡­ZÅ•Ú=4UÓÔh¦U«ù—¾útòŒ ÿ; `ª$)ó¬4È¿¯w½+4’¨xØ„/¾‰Í–‚ÁÞ¤:F™}á çå[CjnÙE aì݇¤zξ4dÊ’l—wÇ7¶S?4§¡ò¦'{zŽÖo⯥‘ÁU× „îz¹œvÓþ£oŽ=!W(­õ'Žñ8½î幇?ùîïÙúuA£Ü|´5k4vv“×m£¦Ü6¬ ‚NˆLì΋³E†¢uq´¼ÎãrT7kG‡ÓLh•w}ÀwBˆ%€§ôË£_XsQ s|B*ð^¼ôÛK_msãíóT2™¥V­æ{ÿíÁ;ömŠmTF§±—$eZx€_ÖïÛ|.µáa•LfixWc0,cÄS/œtŸ5·Yr«Ø÷ûŠË_þT\¹à(XëÂç»ïÓßz{F3í'| ÑI‘©//2OرqAE^Z³ˆ(3±}ÉØà§â¼g™´gÖ–æ[X9¸Ê»">Éþ0® å´!ÄÙoôy÷SvöøþF\tMƒ„‹ùΟn:ÚØ¤¶ØÉýó†í{úщÉPS§0üpì,:•4Thús;Úa{\Ê”+%³ôË®ÎÖO.»×ÎÆ\±3þêD½Ðæ3šºµëã•Ý0Þ»É °aËÚØ–úKV®WÂå2c×¼yÉyüä⯿ð4£Ñð«*/~þñ„Éÿú¸eÄå“®|÷ÅÈÔ-ß=l\•Ä10èÒØ×Þ:n?bT­©Xûø’6 —gœBA…¦xÞé †AòÞïƒn\øk¾F¥ÔćÇWúŒ›{lüƒ/œkKD²Îîó¹¸oË ‘¥M夯îvöÓî“•RÑÀ;ýó”\¿4A¿Nììy}Úãï¼- î÷Ù»í0€ýß Ùn_þxúq¥J#>«ŒX5á×à99úëeM†YŽƒ­ygj\ ‹‹ ¹òúº23îèÀñ¿÷Pú¸ — è—,o¼øÄäß®n–Õ|5|ÇøIßzúà k×Ç_¸ËC¿›LÓ¿p6+…pZëºNŸUæ³äÁ£Ù{w.€²äÄ´íw¨¼zYœñStˆ^dxffò‘ϼ´gXèS×Ú@UÚUÃ9W 0æN§uô&½-4VïbE}µ íèo£ ®žž ¨«r6Þfç68mâòWغú™¼Ñ1 ƒ„ß>žwéø\†aˆ¬ºÔýøæwŸsôqÉuؤL—ÁcJÅ.ÞõºÒ3š&YÝÉŒ“„g_økqcC­ƒþ<æb‡›s"Ö+0³8u»Ÿ£¯Æ°pÿñLï¶{T­Ö @Àç6¾6ý癓|šÍe2¥áêhoÙ™Ðf3°ÎÒ~™ñ9ùW½ÈÞ¬µÎ7Š:›4Ö#Åèp`ö†uÁ—ûðÌÆð`éÔf$刧ž¿”÷Ç|F«åÈn¹×åf[X{ûü'ŒFCά[û°FÙ$¡Ø¦zî÷?EÛ Úáï¤øôßÃõ¯íG޾a´é†‰Ýû½&4’¨x1nC SϺ\;½w|ynÚ(­F-0Þ&4·®1oU¼ÿôÚüò嵿cþõPÍÍœföf­VÃ+½qe|é+ã€Ã婿VÕªFY¥F¥|-DÑÂÖùˆy«^2³¶OÈ!ͦþñ×ÕI[w&¯Ôh´< y²×Ÿž;y¬g«"‰2Å-¡±0ã«Ê«d†Y&ŸÇÑÚX›µ¼™¨ÀVú¥ôt"ÖOÚ.'ä 9rêÆÃŒ.ÝÀÆZTüâ“¥f"¾!btÏ¡ô9 ÃpÀÉÁòÆð!N-¯ oX³v}|Ÿ !„˜ƒ5O„0n³æ¶©jéæ®°t÷̯ÏÏõüqÞ£ž{Åk”𯷦5°~]G;îu;;#2ù‡ ª¹–a¸_ù=¸BNÀ¹Ûûd=KoÎhF£ ¹0je#÷Äï/Ò 1.Oé>rÊ™‰Ë^9Åš›4Á0 ƒÔ#Û†gžÞ;_)¯·Õ¯·´sÉרUE]¥‹ñþZšßX_íÀ©Å©j¼ÚPU²µ³cï¯ÄE‡Yÿ²ûâóÛ÷]yD«eoæ"~ýÛ/Îù)p¸k«H“RÍÑûnà½Ï½Ør.‡h„B¾ÌLÄ“»:YùyÙŸÜ}0ÕŒ¡‰}‰9è„È$\,ðŽ?–¹R/"V–²çC'ýle)4.· Ú{5-ȳ­Jž`K¸t* ´§˜ùÙ·6'_‘0 û,IiW-Ý=Jêós½@^Vj0#ç>0(ï¯}sôËžóýí½(¤Ã<˜ÆªJAò†?ÈèLm6C2'LÖ›ø3¥Aþýâ!­7…Ædn‹)jnæXØúáJYu©»ñz3k»R÷SGÌ[uÅÌʶÍiwÆÉ݃3Oþ1W^[ѬŠÀ ÿ „O¬;Äáp™œ¤#ù)§‡Õ•å{46ÔÚjTM-g[6ØÄ0Ì…E÷>þöøûg’òVé/rK AÍ»/Ïûiøg“wAqM‡7'–áÊJk¹Bi]Y-wIÉ, ð!äØd¸Ã̽Ò$©¢›ÍŒèh¿K©7Ýöü•ö¨VËör²0T>ûØÄŸìlÌ ¹QÉW‹ÝÏ$æë—½Üm®LïÕ^'Ú™Ö§õ•Y$)ÓÂmæœGDöö劊rg0 ¹yö¤³wðmšÏDvös}cU¥%4ÕÖð?ù`£ÕrÀÒÍ#òûŸœìèý›jkø‡#[¥¨(w§šøÏ÷ë6WØw'Ÿ¯'éM¡qîx6'æxô{ûalùdÌxè´Oм6{¿h5j’~ü÷€‰§ÈªJ›%BqùBŰYËö5,ƒï„ù¾äƒ-†·gÛ›KT¸Õf ›a˜{ʇ ò_iRª_…nÖim)ªzÿµù[{;˜¬j eU2s>ŸÛÔÞyU*©ÊÚ°þ€¥2!_تo§MéQ¦ ƒÒTiYeÎÛ÷¥<¦Ö°þ:3¿6bÕøŸœ, þˆ’òzË]RWj† b+Ñͧÿgïí ¶oT_Éx ¶pó(QT”;@EÊe—ö…ÆÁð(ëØ¯Sk_ZÜT]e\°iÊúÿþÁáóÛSF£!é?möO^¨¬«µÑ¯²\rÀ(*mŸ4È¿ßü>zSh 7F«!™§ö .J?ï¯V6Š4*ÖYfåè~³©¡ÆJ/2„­ï„'.{¥M»dCU‰ÙÕCÒqEéç&( bãm.Oiåà;å‘×·uó €.d€@:ØŠ9ÒÈ`FÉ@â]ýÄýBÈZÿÕ/ÛŠÍÊ>|}a¬—›M»æ­©ã¼Jv}úq{ûÈUÜü¢«œ‚*Ûä«E>×ó*WTÉŒgš¾ðoBÈÿb¦Mq£ÜuÚí/STZg%Ýsù1•JcB¯!lŸ­îƒÄ†ÿ‘J¥áÄlO^ÙÔ¤¶Ÿ+rù¸ßŒý6í`‡^IR¦Ø*$Þ öñ-©¸œ<êór[šÒ›¡U© „ËÓ¤ýøƒÙÅDCZÿÇVïsh2BµäüYûkÛ¶Ž+KN¥’54ó {?pxÜÚw’u‹IÒ ÿ~Q¶GO¯$*^°³ŽÄ=ßN,L9=©ÉÈo¢§¶4¿YÁ=Ÿ ù‡Û™¢ôóN'vMªÈMݲáp4Î~£Ï{ûÆÙß>=­ÃA°ÑN@42¸¯F¼ô(„÷¼¯_v°³(þèE?r²º+åbÌE|M€ŸcM€ŸcÍâÙþ9ŽfÜ(·ÙwyÂåô›ãô¡Ó`³Å_°’ò<Ã0= Sº™\Éù-I¢>ÛúpàO>žvÍL©ÑÛ“WÕÈ=]žÕü€®b“ù!&h·—Tw#IÊ´[¬×h$´µ7ÌRÔ y»ãSÉ Û —§MÝòÝýúeû£®ŽyñµSÇ%öŸ±×~ýyI³:g¸B‘bðÃ÷úÛz‘Éß…Ô'è­G}y‘ùß?¾¿¼¾¢È§3XÚ¹äO\ör‚ñ:­FMÒÿÞ韓txR}E±wËc¸|¡ÂeH`òðÙ+9x ûFl( ¡‹ëÓÉ= !äcoê—]­ò?~k±ÔÞÆ¼]sØàçXóÞ«óÕ74ß¶÷ÒèS‰¹«kú'G7{ !¿x…a˜;*„J¹=´Z†ü =¿¬¶¾Ñ`$d~Àv?Çf¥Vrò«l¯çVv&Œq?4yœgnÞª·Û=/„‘È€ÀÚÚpýkš­Ž0B-—„¦îÆ5/µBn| Ëúio4éS9ýÖšÙù‡Ì2^Ç33—9M¸2îòôÒ㬰MäßïrÎzEh®Ù6)ãÄ®çT·*)ëEÁÖÕï¦À̲±±¡Æ¼ºø†k}y‘kcCµÃ¤kö—U“œ›òWì˜Ü‹Ç§5ÉëìZžßÌÚ®ÔcÔô³#æ>r@di“ A,o¹……° C_€­çðds#êíÅ¿ZZ;cîh†FËÊ*™°¬²Á¼ªFaÆáfòXÏ›<§]'¯•¥PõŒdRÒ3’IIÒ=—†þº÷Ò\æ–/ï÷B†ÙÛÕ1Q:ÊÔÊw$Ï/.­7„ØN òŒŸä™Ór¿Ó‰ù†J.ŽVY+–ŒLh¹O;ÈÁúH{IR&¬é¶BkC… RÙžÐ0*ù­Ocu•!çnÔs¯ì±äf²R†¬ä¦áÆáñT^‹BŽOxë_ \‘È8m¢€Täß­}ÝE !ÄËlШtù„0ž£¦ÿЋ§…æÖ-/òfÓLE}µàr|Ì„ÂÔ3“UMŠfN„ÆfOæàÉKÎ ž´(ÀÒÈàâîü,ˆWa$2¾žv韼¼S$äuùÉélr¾Ëg›Oñ{À̇³:sü©ØWä¥7«eÆå ]†&˜»ê¼½§¿±x0*4@ñðoýr€Ÿã•ÿD.ÞÝÑìé×JmÿûÃß«ME–)UÑõ¼Êá×ó*‡ï;’<|ˆó%ÉgFú»´Yˆ4h”Ûüm_>šw$]ñËž‹÷7È”6`¯Ù_ !«î±‰X“1 lž‰H÷wcóÆ€î Ti6ó/)¯·<•˜·X¿ìâh•¾2Èd]¿¤”"¹Be |>W1m¼WgÖZ‡×®ïín¬&g+ Å…†|‘­][¾¦xå…¢Ùµ/´±­šöŸÏµ÷¦£_xõlCa¾‹>ÿÔ óškþF‰š L PB äsøü"+Oo…Í­ÛÌ9¯KŒï$I™'œ–ùwÙRq'ôôŒæ%³õ £<¾³³"V®eyéž@(÷=óÔèEO&µ‘C3À‰;ï½Àrè*4ØÙ˜þûE{nGd éj‘»^d¸\ŽÚÂ\P+ðõ²&E£Ê0ÕhnJfIÐ;ÿ=0nÌ0×Ä__Юs3dÞ°ì±#\7½uàIï† `!Ul"ÖdÀ>‰N0²Åæak2Ø»ycÀ]3 oXÌ[èÖÀޏ« Ôj­,Í•ÏH&üÎá˜~ª?rúÆ­„DW›4} š(àöi» ÀÁµëãÛLUèa´˜Õ(ÊËn ½ÉðþiÿÜŠJ#„÷úÛ´¨âÜ »€uKvìûéÒWÆ”%'®ÏËñluÖ°Uîý´*jod¡öFòÄ!ñ“ªÆN¸ê÷àŠ«®Óg•MÆuУ¿›])‡·ôË£¦ÿ=lÖòv ɵÄÞ}hINÒ€ÐB\=iÅš³íìî ‰Šç7O£˜d¶þEÐ(·TŸ{ÛåtŠJnÕ›èqæíæúó$¦:&$çû^N¿9¼¤¼ÞäRZñ„¯:[ñâSÚ­@ëæ"–ôÆ¢ŸÞŽ:ðdMÂìµ»RÍ0Ì‘Ûs_#bM†?€I`›¶Wc,lùÿµ³OW6p%½dP~qÍ(ýòâ9þgýsàøµ‘å•2࢙7ÍÏÔoS àµëãûd; iµ$)ó ŒŠh@ce…AhÌœM Í „Lû?¸LœrÁ{ñÒNùœôU \€ò‹‰¶…ñª¹~Í®ôüÙ Ö^>NV^>^„ËÕjš•â¦êjqS]­X-—Y *+ÊÚZÛÂã‡g?<ÃÌÁ±tü[ÿ·Û}ö|µ$)SØ“þžžœÑ<c—/2¯›´ü•.¢tòmˆHQÔV:3 ]áKÊísÀb8v–}"}î±ÉçoGpêš ~±•¨YÎÍøQîåãG¹—8wäôuñ)sŠJj}ààÉk Gu.š5Ù·Ýü ÷AbÙ¿ßX¸õŸÿ=°º¦®Ñìõû?BÈ(†aúõEÄš €eèDV¾k2ì7o ¸[ѓ͜Õg“óÇé_{¸Š¯N t7ÙΡ¶®QxêBÞBýrÀÇ„!>ö¦Ætº¯ŠŒGÁö^2\ËM5Õ¡±äfJhìÁF˽i¼rÒ{½ÝA8Ž_í8v|5Øü¾\°¿Q“~•LÆ­ÎL×ÞÈ7æÛÈKKIJ’b»š¬Ì!š¦&C­AEE¹ó™wþ±:èw·ù=´bt¢Öô¤Ðܧá5fÖi¾È¢Ë7Yu©áŸÏšÉ¨ÈܾûáªÕZÁ¡“Y /\.Z2æÀýó†u©2¬¼Qe(Ûcm%j3ïfÞ´ÁÓ'xÿüºÝae• îZ-Ãùö—„•C}¿ë(_ÇÓÕFöáë ·þc}ÜK:3]Ø­ßve¬} È,[ë««øáî…éfPÅ¥õV¹…Õ†Ṳ̀@6}BÛ÷¥ÌiRª-@$äÕ-_šQ„èØ€Ë(Í]îÆŒa˜î¯Mø§qªœÆMh&âj…œ›µCêWpôàÈꌴ­ZÍ×(•ÂäÏþ³Âm最 M»¥&î2†RÛ£§ßViëòœ«†Â—<¡™¬±¡¦Ý˜vJÇ0 “<'àY[±™!?¥¦®Ñáé¹ÇŸy{×êÏ6ŸœþwB¶›Z­íPÕåŠ[Bcc%j×w ð´o>?ûw¡€§™\iýÙæ‹:34C¾’ IDATfowÛ†™|Œýoÿ"„Üvˉ>ÀBÜžÈ,åÔÖ;nXü2X±ƒJ¥álý=i¥Þ7ca&¨š4ÖÃälæJzÉ ¬œŠ‰úåé½ZY ¯ø Àwþ»v}ü®µë㯯]ߪœÁÈ ¥U©ˆq›Áþ¦f4Cx"³U0 &à[[w6AµÛà™™k†=qmÁÛwMûxc4WÄ>ü©r‹Ä¨ç€$)³GžÖ{Dh!ƒÀ:ÿBê;j0Ö5%¹¡‘×”»îý8쵓±ÿž[_^dªÝ@9õÏtŽçŸ¬Ùôñ²ïçO|Ï»U«ìfY×±³7æmØt"â‘—~‰|íƒ?WlþõüØy•Ö¦ÎÓØtKhlŠ+¶ÅP‡ÚG—îÖ/gfWŒºšYÒ*/ÊÏ<6霙ˆ¯¯?ç„f‹þBÄš ­*’w+wòþÖs<ÖüˆÙ‘¼°ªFá°‰™Áóü÷˜:V£Ñ’½‡ÒïgöÆìì`y}áÌ!©dk×ÇË×®/éÃ=fÚ¢YXþͳ'´*•ø–Vufަ>ÏaôØéÆ+Öâ>U6É}öü9÷¢ú*R.-‘$e¾ àŸ’¤Ì%’¤ÌvÛÝ)=5£©ÍBF«¹-;{—òE·º6jTJQáÕ33â?{þµ[?˜¯Q+?ÉR”æÄE‡Yð xÚWæŸÝø÷5|ˆS«)µ>øóµ·>Ù¿´¦NÑlF©hT„ÆÑ΢SÑP˼ææl ÃØ?’gtæ8s_3qŒÇ&£Uÿ „8´y@$bM†/ :h,ÖE›7Üiìi` YÊ*,®çV¬“Çz˜8Æ=ßÔ;÷§N®­o\Q­¥Ï|ï&²¶hQWzᜡ3¨¥»G›>DçISšÝÓD6¶}Jh`ô k ‡£EY©{í,°æÍ ^–$eŽj÷w@ Ã02è å1Œ 0õì öhu< 08ìòƒÿŒý"`ÆC{…bìH«ÕðŠÒÎMÛÿù‹¡õÅú›¥$*þvÀ÷#`d*ðtµ‘}òVðž/ÿµô³å‹Gý1l°Óe sA«MêµÒ±/¼»û¹ã Ù†Ö J•ÚðTäì`Ùé°ÛŽ4˜ÁÒ¯—N¿^fÓÞþzÖ>3s Xû?Àvê¼ãÖà=….ø¿×ž™´bͯî#¦Là+‰Šß# î+1ú}Џè0Ú0ÛøxØÕûxØ]Î4s)­ØáxBöÐÔk¥þúðäú†&ÛÏ6Ÿ ÿ;!;aúït}s4—£[‰ÚÍ0fѬ¡¹;÷§ä—”×{2 ÃÙ{(-pØ`§ã¦“‹[ÎRû¶vîKèDfÚøý‰_3/?ûè´â‚³£f/üïvWÉ-MÍZû6o èRz@43/gfWJÈ ìØ¦U`û¾”`F˱•¨dyðȳ`ócL&sö¼ÑâªÏÏ5càø6g4cÆÖ˜98–é{Ç(ëëÄ ÿz; @L{mŒQÖÕò.}ùßñŧO6VU:0M—nú\¡°QdïXná2¨ÜÒݳBì7¤Üat`…ýˆÑ5„ꡞlj ÷ÜÚìë-ý{æ`Ý3»ò¾¡'…f-€³,šdµöû>}î%‘ÓÎŽ]~Ah!6Ü”TMrnqF¢sÖÙ¸ñ¹éc†mtlÓ?W.xùs©¾ƒ&áp™óV¥˜·*ý쯦ç^:> C”Šñé_>6{ùÞÑ B¯‚ͨÝÒƒŸ³?᣸ÿöîZ¡ëªyìé·vVWÕÈ?Wª4"†aHbJá”Ä”Â)†“ºÛv¹„ù䱞—vLõ€â²ºÎ8¸3hù|n½JſЄ¼vK¸÷"Ödx¡‘¹’¸É??ûè4PÈ*œ®¥íæê1¹e*À‘ͺZÞ¥-š=ÔÔ5¬ ÓÆ{¥·Þ8tòúð’²ú¡@´SÇ{ý‡Ëå³v}|ö‹6ó6UWñ++œ¶Ä•û¬¹íV±=6£ðèAÃ5ÈhµœÄO>\i0â{±ïàvK.Ug¦[y&ôé.&j6CÓÔ$’zÈŠ =Ê’oMDõæ2}ã5=Þ‹BLu3…þ,4 äBž°Q7),s’ß—{ñØ\¾È¼ž/2¯×ªÙöÉzq1¦®¼ÐwÿÆ—žœöþoÖNÍþiSV­=eç>¸äòþ­Ë4j¥H«QóSüº¬<'ÕgúãoDÅÛJ#ƒûEËÓ¦«¦&5€í›>^V”_5äÓM'–æ×4kå@aî›>¤ËåQ†ú8LUòΆ€7Fuö¾˜ÊþþgLôy8.:ìrHxÌÕ®¾O±&ÃÀ ´ñ»«®Ì²LNøú!ý²­ý¬Y >6•ov_ÄšŒ´ÍîÆ5m0q*U<}[f‡hLøÙªjäf'äÂx_ÆÍøò.Œ£/ÐÌ?Sø÷QW}wY‘½C™ÐÖ®ÝY:£¾Õ‹†Ãã©´j5_%k°:ùú‹+ÿ¶÷'®@ØfÔ]â'Ìk)2| Ëzsg—R W÷2‘½C=£Vsµj5‡Ñj8Zµš«–ÉDŠŠ2ÛÆªJ[e]Mˆqi[ßOE¶vmÌ´Ä&ÖÝ1=Z‚†a˜î#&o(ËN1Tnf´®R^o£”×›´Ë‹¬lËë«@VUêqè›×Ÿž¼òõmnÃ'5³‰úO𺭫ߦÓÒOV5ÖW;@Yvʸ}Ÿ>ï5xÒ¢\Do2uþ{œ®„Æjl ¹féëiWÿõ‡þ²mï¥áIŸ/W¨¬À0DòÀØß—Ì è²3xô°A†róõ²F[™\ɳ0´÷tìfCt[c“ÚÀò¸è0¯ð˜¾Øæv:€6Û]_IܨѰMÿ„"qÍ‚¥ßî"¤M7ê(ÜK ÆàÔÖ7’ûøg†Ã!ÅZ-óî]C_!F%h*S¯¢\­<½;lƦUª ÷SDZã/•%žÏ0 ©/Èó:ýæ«óf~þÉšg*™Œ[•žjÈ•±òôΙóõ–ímU{6ÁM­R™—³o7#»Y°õ‘ÚÒü#Syý´ñ¾"Kå‚?Ûuyÿ×3OíÖ¨UB†Ñòì!„ÜÏ0Ìáý´}›“;±_jHxŒ!_#$nÎâN‡£ÛX›ÝòÑ4ª»5»ùv‰X“ávFÓ&6v¾2€½Á¨Tr‹ä„ÿu¥¸f‡ÄÆÆ <`iuuµÿ_|±º°°ÐCCѺ»»æöu+o¯„ ¥… "bÕø?tuT€$)ÓÀ ¨JKkUl7MžÈLÞQÔ˜FÙÄQ5Ô[l@ŒÝð‘µàš®r\¬‘DÅ+T~\¾P;ïÙOþ<·ccENÒáù Ãp4j•0ýï–d] ˜&yëO+G7Ch¦½§í¨ù’½÷m‘tâý¬LÑý „è} Û†¹ëqæ½IHxL€ýqÑa…„Çt©ðaHxÌ͸è°Íº×]i˜6l&•Ôš–Ôúê7̘èÓ騵ò*™Á¯ci.Ô;¦KuÚ¯˜³èÓ¿vþâ§lª·Öj5¼+I[¬¬Ètßý_ärM†Æš¡EiSÄÆÆº‰‰‰.©©©† „ûï¿ÿåË—3 ‡§Y¶2ì0—+P¤¤¤fe;ŸÇÕ¾6÷ŒFY¯ÿ]e8y·O!IÊ´€î;€êŒtƒÐX¸ºu,4Y†@¡mñ6µX=öÕ7wŸûðŸ«Á0¤.ç†ß©È—§Oúʤ €Ã¨ÀšÅ¿î‰>úüêeú.›™¿l]ä{ÿ²–nî G¤AþVßùJ’27uYègüJyí‰Ôݦ7|4]!G|¤‘ÁUÒÈàX¿}êÆ¤kÎN•¼¹Ed)ÖWDuqvÀ/_y!íØŽf6ú€™g9ùŽJ._Ðhãâ}ÍkÌÌcöCw‚ýÑT mÆø?‰„n« Ô›tUdŒŽcº"2ºÙÌ,ýò¦mçgè« 8;Xø9Ö´yp ªj䡱¶êM€}­³j§Ì-šæoŒ™Ù®Ã¢¼Ó“vý¼ô‰ºÚ|SfÁÇ"Öd´.m„ÁT“œœì«òvwwÏ2c\öØé‰“§„ÄÜ\¤$ž>Ø¢À¯k×Ç÷ت˜£êËe/ªiÛ ¸ÙÑÁ¥çÏzë_›98¶ê¹ã»ôá|·³ &´‚£‡æ _õJ&kÓÊ#Û¨f}þÝ| Ëz€­ºœð^ä©0a2k )-O䟡ûËîI‘z^hºz#kÕ¥Oœàý²çèÅ!olú~ÐÐq†/^­l´¸|àÇU‡¿}ãE]¥¡ÐôÇßþkæ“ï}·âÃ]Ÿ,~íëmS%ožXðÒççýd_(Ã03†q0¬™a-€­`jÆ –öB»øY(·ÀI©Òp¢¾ÿ{fÒÕ"C„Ìô Þ]Êx¯©Sn¢bkQ€ã!á1Elõ4×t*BËÍsjÅCíÞdï8Ì•_W“ï·]^Q–Ö²j¶€ÕÃõ[ZZjpp>¼Ý™ù…Ä+¿’ÿïl‘•g:€_üÔ«2·‰$)ÓF¥˜ŠOŸpT”•ºáp5CW>–ÑÑ9Ê’Î>M›iò{ºþÓ„ùUAùÊ¥Ñû}àÉöê”™;»4xê9C0NùåäÀ3ÆÖšèÓô¨ÐH#ƒ•`{†w†id°ÉZNÒÈà\;>_d¡žýÔ‡Æ?ôâO3 ƒ­±<7-0þ³ž¿ž°ß`#Ü܆O*mÑ0Íló,Ã0% ÃdæS†aV3 3ltÍcô¦oÿèäç ¡›Í̾p¥ÐéÙwvEœ<Ÿc(Ìèín›¹zùøÎD³¨¬‘"}äÊ !á1ÇïÞhï›7hй(=€¹…£òAɮ탖&º$…¼Òaÿ®ÕáÅg[Fz9×µh ƒ(TVV„ÆÅÅ¥Mÿ[rr²sVV–¡îYÐÄ™g,ì†ÿ±v}|ÖÚõñ·R݇£ÙLáñÃ3®Íà!Y%NæýµÏ­©Vš.6}äq“%˜xææÇ­v®ÈÞÁÐvAV\èq8BÚžØ {"âšýˆÑ†P}µBñA§>U¢7LgqÒ*t”ÙÝ*|oÈäàœÅ¯}ó­ƒ×0ÃZ©h_øãOæ]>áÚr#Ú …e¦a)€VÏjkJk!"BÈœçþùÇ÷O¿µóÍ¿<òlE•ÌPWËÙÁ²à­çgïíêy‹Kë Aç/l»[ãí.€uÀvÖ4‚Y ?9=nò+;ôá±Ê¦zñ¡?_ Ϲ¶¿åµlàɈ5 ašj°•`nnnH°,))1™@«V«ÉO?ýô€¾³³sÞ¤I“ކ††ö;¿W'iö=¨rƒèXº{vèŸÉ‰ûÃ0›±9:gfnÊ,•à Ã0MýujïËÿÒoÝ,v;! mªm»Z÷ä÷?>@GošHéóuýŒé ¡IE‹B~&øMÜž¿ÒÈà$°¾•fOeæb‡¦û^ذÛsôŒãúu<¡YƒûˆÉí%"ùK¢â;±·Ìã !}2œ¶· „p!s!ïBâ !‰„,BH)X?ÅÑ¢’Ú§õUš€Ëå¨ï›>äà÷ÿYãæ"îtk¸–S!–É•zsR-t7辈®.Y4ôí2LS ÀNèLmŸKŸ2럿p¸|%¨U ó‡Þy¼¡®Hdâø k2Z…Ά††Ê k)àãã“£_ýúuoSƒØ²eËÔªª*¶Ï —«~ê©§öp8œýø˜ý•rãMc£á†ÏáñÚõe4UWñË/'¢Á¼ÞoÊçU 6|Xï¨ôîú„€ÇV¬d7‹ÝŽ¿üôm½µ·¯Œoe©ŸÕ÷µ7®¾F 42Xà˜®*pLÜ©~:ÓÚ×`”’Áƃ_p©² Óðƒs2ö"—'hÏ?$ðº$*þ_’¨ø$Qñ£%Qñ¦¾ã8s‚%Öïe!¾`óŽxlÿô °eÇ`"+ÞÍÙ:çƒ×îûî•°ig¹Òe›sÂÅ|ãä߆aút«àÍÊ7o ضÅñ°Â’§{ý€¯7o ÈÞ¼1@ 6èE ÃF?š3kÁÇ[y<]+^u£ÙÑø×–(ä•-[™óÀÎl,КÓJ½¼¼ Oèµµµ­f4iiiö ³õËS§N=P £â›fáô"GC^Y]nv»½³N¬}i‰Z.·Ø"˜~,kÙˆ®ÀÏ-rT ÔŒ}í­‹þ«žøS¿²*-eĉ¼0ŸÑ˜l )WÉdÉFËýª}¯„7ë*)o“DÅ[³ `ó/²¤‘Á]Š†Ðµkn4@Þ,ûQÿzØÌ‡“[n7~vâàas%Qñ¶½‰¸%ÎÙ Ãô™ZZ½‰Nd.¡ƒd\.—“;|ˆSå(ÿAÙ³'ûæ r²êŒ)©M޽aÑf¨h_cóÆ€t`Þ¼1 ?bMÆÏ ð\,«¿¹ûü© @yiÊÈß·.òøøÁ )¯—Úqšß²ÔÒ Î†ïÌÞÞ¾¼Å>øñÇ—h4žn{qXXX€”ÐÐÐãü7A1؇Fø,^šuýwÖ [›}ݯ,ù‚Ó¸ Í"Éd7‹D§Þ\R•–bH¬¼lÕÂå?0Õˆm†, òg$I™Z·ö亼l§›gOM€¢G§Å-[ä1öµ·âÝfÌ)Õ—«QÕ×_`4šÇŒNÓ¯jÌ}÷Ê„.Á²‡+_õŸ½ÿ½ÍS)ü ®Ð™ÉÁæÀ†aVÞùhû7„¬8@_ÚG ÖDt@X“V€Ú?·¬v°ún¼oì®d»íû®¼l´j Ã0 wãÜ}‰ˆ5žÐ‰ ìùuÅòŠÒ«Íªˆm}r~üÏXÇp“«°qóÆbccý<š™™iûù矯–ËåÖ0gΜýaaaçõçQ«Õ$""âŸZ­–Ka^{íµïK|ÚJ”’¤Lw+ÁæÑaOðìgäe%ƒÀÌÁ±tú'_þê0fl Üøc‡×Å/¢ÖW‡1ã.ß·EºÛè” b¤Aþ­Jò& ·D¦ÀÛwpÞÄTÜ€¹ Ã<Ë0Ìv†a.2 “Í0L…nöWŽ®‡¸·¢¢Z¦ý=>e¹Ñª­Qdvf6¤X Kùí÷QAá»ù|sC¸tmuŽÏ…Sƒý¿ 66Ö\£ÑoÙ²eòÇü¼^dÌÌÌê—/_Þ, æÚµkvZ­– Õe.t‘ØÄFßC×* (rÝ^}†¢¢Üùȳ¡/î[¶ø‰½÷Ï8ÿÑ{O‹ŒóøI‰³¿øÞ¸ ¬¹¬­:‚Í ÙrBíbéž_¼Ó7)MS£YÍõkCož=9ÓHdàþ$2@ÿ¨ p; 4U›¥é;ƒV£ö%„,[®FÏ+ Ãô˾èÝÀ"£×?3 Óf¶xHxŒ,.:ìZô©ï"ò—ÞÝ3ZË0zÛy €×îà|}žÍò"ÖdH™q$þÕಛ—F›™ÛWX‰= aýB¾RÈ%ן[üÖ ×³RG njjÒ'[‚¢]´hÑ++«f¦ßk×®²ámmm+À¶_ïr$`Eä/ð“$)“ë>{¾¥¥»{NCAþG Ãp´j5¯./§Y9ÏÌ\6ò™÷ }ªeFR[UuõÔZE¹rø|fêGŸp1;;}ë–õ…y𯯖ÁF561 ÓïÍ T¡ÉJj†q¬-Í·;{v¹¤¹¼¦\tlË»o‚uhëÙÉ0LÌÝèÀø»éLF~ n_hnH^Ùæ$S(mÕ/2 3 Š;šbóÆ€Üo ’q IDATˆ5Ñ`MBsK§¦K¿»x Ó_¿Äáðµ¹×¹”ß<4®¼äêÐ’›yÖ £måT¶µµ- Ý3~üøf7B¹\Î;|ø°!§‰a˜‹~ íÓÝ.k¾y¹Ÿ˜98žÒ4*¤*™¬YÕykoßìéŸ|ñ‡ØoHK_IZûÇŒ1öó¶Â{ñÒBïÅK·@ñé¢ÿx>‹Ñh‚Àú¡gæŽüš½Å€ôÑ!äØ* :;û©:ÝôLÕ(ã%ÇmŸùÄ µ²ÑÜhÓ3 Ó¯qÝ !$·ìÍáí‰p\t˜7€%ÐÕ8ë"e=ó“H­Ñ~j´îw†aVÜÆ¹ú-k2¬Ò/×Õ䙟:üòô!*eÛýæE"QøqãÎ=õÔSgø|~3ñËå¼Ï?ÿ<833s¬nU€@:k¿!ÄÀ$ۡô“ßÿØÅfˆËÄÙz°!äÛ+ï"IÊ|lÞSg8* òïkå”n‹:£€ü %YÉ|ÿ¦pøì• ƒüƒÚ´77TÞ4Ë<µgxNòÑ™ªF™q¹fÐÐqq³ÂÞ—g´$*þ¼.ÚÒ< ÑÜÔqÑaæ`+5šÚÞ TO¾¾ÝY­Ñ¾g´î €§nó|ý™L°&°¶ñ’{Y”ZY‘ágjg ‹ÚÑ£G'M˜0!kРAõÇðd™››k””äyäÈ‘¹ Æ&æ5TdšÃ0L.€\$e°æ/{°>Ç:פAþ‰Bíl)þ˜ˆ¦í¯ Ø Bá–£ vöʲuõÍç Íš"ó&Âá2•×ÜkKò¼õU­²mù"‹ºá³—ï>g¥q½£\Û¤‘ÁÝÖ¿¡¿@ÙàuÝb$Ã0Í"üâ¢Ã<ÀFóÜN"äU›½u`h]CÓƒF«¸Ÿa˜Øá±C"ÖdLC‹„=¹¬\rîÍ'®¦œukïXBˆV$ÉÔj5_¥RµJú´¶¶>T[[»ÀÔ±”;G’”9À¼vÓøº`‚~Ç@žÑÀË6ƒ­Ì ¨-ÍR[š×¡€/4kð œ}2pIx_ت¤„7€0IT|¬42øž¼ÙaÕg˜±ÄE‡ À'‹ÛˆnllRs¿‰=;ñxBö4†aŒx¸¿Úªï `¯ià ÒÜÂQºú½+—/ª>°ÿߪÊR“³K†a8ú^4Æ…BÙ¼yó<ðÀÏtß°)`}” Mò@`€ÏhôB¦ò¢wÕʦ…Ófÿ@B8Z [§"'ßQécC".Ì,;2ÅI#ƒïòpû„ô ƒe\þܲzØÖÅ]ŠøS«µäLRžkbJ¡wbJá¸ú†¦–¶ìŸ<Í0Ì@Nìk2Vh–Oãç^((m ¬´P”rå´øZÆYe}}½µ\.·R(VjµÚQ.vvv%îîî…?þøi;;»¡¡¡÷ðG¹ç$e>Œ[i-I°Ã¨\Í€` Ïh ܰ˜Ëãû[Ø8=g&¶ÀF«V™iÔ*¾¹Ø¡Êyð˜ï±³ó…â®dûÄžé]‚a˜TBH1WNSÆy= À¥3Ç^Ï­°NÍ*sÊίt¾‘WåU\Zç©RkLU±½6¤|À4Úº ¤ …ÐTÖÚä»:–‰'g÷Æ…‹—¯Zy_³"¶555‚¢¢"+KKK¥———q ï*ô£ê ýiÿ.IRf*Ø¿þaJ¶5óî&2À=2£1…$*Þ ¬3Ù¦£}Û!KüË]R¿…ò#€'Ù×`|=íÓ‡ºfgcÞ`&â«ÌD|UE•Ì"¯¨Ú±¸´Þ©¢JæX]«pT©5Õkª°lîÀ€ûñÝ k2¸`{&5˵pw*lmÙàÎ!Ú&«úd.WÓ?â1BCCr=³>‡$)“ö¡¬ª3Ý2û3÷¬Ð€$*Þl¨èíŠM²42øžIhk BÈ,°‰}-su—S¤Öhÿ{óû“a˜níeÞŸ‰X“á 6\ÜãÁ! Ç×=¸“]U6Ÿ§îÌÍëZhh¨´ÛI¡àDÅ;x]¿I6øŠ°B‚.±&c Ø$ØJ•<®¦pZ`²?° µ¦:pjÁ–[‰ ítël åv¸ç…$Qñæ`Ÿ ‡ƒ-ÿß⥑Áç;ÞíÞ!.:lÆÅÔ¢GŸº><¿¸ÆM­ÑòÔj-O­Ñòø<®ÊÉÞ¢ÜÕÙºÜÇîl”¿K¹û ±^¤Uv„„ǘì¨J¹}bccy`£½pëÚ.p%44”&Sz*4FH¢âÁ†ú0ÕÓC ¬#6KL¿<#â¢Ãü„vrw ذç+Ž„„ÇÔuÛÀ(J¯B…¦ $QñöháhP& ¾çCkÛ#.:l!Ø~(íql9„„Çt©ÿ…BéP¡¡ÜUâ¢Ã8`g5>&6+ÀæÜ ¹ç«*P(÷ Th(w¸è03øëþXscbHxÌ€ã¤P(­¡BC¡P(”ne vؤP(J …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº*4 …BéV¨ÐP( ¥[¡BC¡P(”n… …B¡Pº^o€2°Ixf³€-€ÒÉ?Dh{{< ¥ç! Ãôö(Œ„g6Ûà ÀL·º@üä"òtûؘÀ@€Jg&ÿÑÔó#¦P(Ý Ê¡@ €€U¸%0-¹ @ @wœ1å~üCDe÷Œ–B¡ôTh(·EÂ3›˜ÀÍh5£ûkÓ÷wðú¹ÿgï¼ã¢8ó?þy¶Ò{g)"ˆbC\k°ÄMb¢“á.É]L»”»ü.¹\λË%—~„\LtÓ-ب+ˆ Ò–ÎÒ·ïÎóûcv×—΢À¼_/_îÌ<3óÌ;ßy¾Ï÷ûùç×J_}ÒÝÁEo£‰@¦4=¥jH;Ì©<ŽÈ$ùÜžcØá G¿‘¥f̰׎Hz¤®£Éឯ_|BgÔ‹Ã<®lŒ]y ¯êBXacyX‡NíÂ#„ácd˜Š:eÓ˔ҽö¹‚±ƒTç vô @ ÀQ™$¿âºvŒcLÁŽ~!K͈p‡õº‹ en¹U‚.6”U´Ö¶hÚ=Jy”RC)¡ #KÍØX¤¨œöÊÁÿ­,n’GÕqƒÝ|+‰_mdŒDmÐ v›~¶¶8–‚š]sïSJªóvLFæ^°®²ž¨ð7ª±?ÙÉ Ñîë¡INRfn®âìä€hþÜœP˜”™{Ãß?ÎÐpô Yj†ç΢cÿ~ýÈçkUz‹õ6HíïâUêî_íVãÞà <>Ãçñ¨€Çgø„G[5JQM‡Â¹AÙìܤnsnÖ´; Ÿ¹wê’³Ñ>amÖÇüâÜe߬3-êL ”– ÓåŽX¤ò¸ nàÒ[[ŸÊ$ù¥vìÒ˜&;9ÁÀTsô4ò7x7)3·¹›ã¸XÖÈX£p0)3÷Üt×np ›}"#ÿ§ [Noßhdåriý´[ŽÜ9»?bM}itßÔ[Š~¸økiEkÝ8B‰›ßû²ÔŒ'¥é)…éÿX@*“HBÿ‚4ú3gÆÑ²“–˜‡¾Ý>Ø(Îïl'¬‘qµ±Ÿ7€Û³“Ê“2sÛll¿!à$h8z剹÷s~ÿ_ÍFÆA R=;ÃgŸ®þ¿¯ûidúErìòƒæÏõÊæE:£~½,5ãNYjß^ç©Håqó,C?#Á†“s 1ÙÉ Ó$¢÷cjvrB§‘hvr‚À=°mdÌLçºaõ#š¬œx!€X>`­¿#€ƒëóŠ®kÇFçë¯<צUz€ˆ/ÔþgÙ¦gNèÓÈd0Ü:a^Å[G¿lWê5®:£^œ]|\²*:‘à&KÍøJšž2¦’„¥”‘Êã¸y‡ `]/CˆÉX,¥Î(8RÙt¾¡#ˆRJ]Ä-7…{•»:¨lìJÀº×:¬ÖÍàÕ‡ÓÎÌNNØ¿lkžì3N  …RzCDµjC“•ï`¿.›ÖgåÄ_°c}b^ûð÷lä KÍp×ôÓÍËóB§#c&Ò;¤øLmÑ È©8µ*:±À8“œ®~ÜHBœì0Î{¥çkQÿðà¡É$ù CØ5–•5íZ¯´ãe ÏÕµÏ4RÚiþEAæØàm«'ÛØ×ò<2,íË O×¶y¾°·ðs«põ¹ÞAÙàJé¡]ÊÐ0j !d6€ `Bai˜<ËÍ8c®{õ’;ýlMvN ðýpös"Õ3KÆp‡Ž$O²š õeQö™6u}yK,0š÷¶þ»ã”ò—έýYsÙ¯¬¥Ú»º­ÑK,éb|ëç…N«ç¤ìi_?gOm«o¥¼­> vËÆGy‡œ0vUžy °*¸ )Ó†•l*›ùÞ¸_{ÙS`—L’ڞݫ4kô·¿t hƒZotOµ1Vòýý-.²’&ÕÑÿÈJ——4©&@e«f|晪ÉÉӃσô˜-oÓ8ýi_áºz¥.¸Ë¦œ±Áßß7%È •5ý|¹~ÖùúöXÊÎÿ¼43†îªûƈͣ!„ˆÀ™ù¦UFY^~¢=w?|S}•Öó©¶ñ…g:,_ª“ ¿õ[&èí/êi™غ>1¯Ä~½¿ñ‘¥fx¦¨™ONmŸ”~â‡{ÌÛ}=kï]¾ç®˜…W¬÷«not¥4Ûô9ƺÑÍ+}*î|0èGóry±jâß»t‡ÑØ£OÛÀê¡ëêˆäš¿ÍK~wpí”%?óÏh^צUz)*'ÊÛêú32ßìæ[ujyÔœ½óB§•¸ù•óMÇa(Ãÿ¦`ÿ­ŸÞiSÖ&1tZ-!ìV¡jókR·¹``á¼#©ß5çÄÛ‚»=.ÇÉNN0íl][¸yÝd_—¾•jãƒÜúm\(ïƒ¼Š‡”ò[5ïç÷®{oȨ."9 ­ƒð™Ý—Ö7ªt@˜õSƒ·m˜tì3¼Wu‡7ËsŒ\‡ÆHÑX[~³\wŸúGäÞ© nÇÍËEÓ7?^xí¹Š½nP=ÁHÓSjÀV¼¼†)~-ï¬|z{öýiÿ|í–ÇÞŸ2å°#L?ctRêÔÿwÇŸW½ºø·»nŸ8¿Ü–‘€øàIŠ·W<µÕUìÔz£AôñÉ_âlµuŠÕæÏmZ•ìßnÄ /sÄ •ljÌbý¦LAÄ¡buÌ·~Šx-t‹ÐGÐÉð2ZÆ¡yoë|ÅOÍç !¯BšsÃa›› Mk°dôºŠ{J‚5‚­2› îÖ ~u÷N ´¤XÔuh%¯þZ’d^Vꌂ§v_¼¯¶Cb^wOLà&#Óg´FÆ260TÝS[{0’ µæÕDÓÿ‘=íðÜvM™åfBžíˆýðï¥ÝI7´®OÌÓ™çzŒ¹w:¨æ‡ÅþçhŹ7(¥û)¥Ã$MO)ð!€åýÃ=•«¢-ùG+ÎÎÒ3†kÜš"¾Ðbô•:•9$½Û‚QHÌ/WÖß½ºä{ŸOùŒÜ©ï‡oùÌc›Là!°htð4€bBÈÓ¦`ŽAœVM:£ÅÐø8‰º†›9 ìd.Lu‚’§ŸOŠô5»þq¦®-îdM›O‡Î xz÷Å{ªÚ4–èÛ¢ý¶?8CÒï’Ö†FÏÐ#=íÁ°¹Î²râ`ß@•`³_;Ö'æõ<žè™Kæ’qŽK²râO CÏ¿9aÇæM…äÂÉöYptbÑÄX—Ê…«|Ë»4K±î8 @ ÖMÙÕw\ `§4=¥Û·7izJ«,5ã4€ÀžNòàŒ[ ¾»pp©Æ sêЩݲÎdG?0cå%ë6ž%© ƒ^6:pLÔ¨1ÍÍ̱¬°ÑPÚy®‘ õOö-õOö-ƒìòWäÞu™ ¨ŽN15ñð:€Ç!ÏSJ¿îr.W°²'A`eLÔË$ùr{\ÛH%;9À*XF©7Z¢ÅüŶ M Ø€ ›…èž”†Ë.4´GV¶jÆS òßüŠ[T:£KƒÉ]°QlƇHó«[­KFTäƒaXF4Y9ñ°IHëÀ†Ì>à‰¬œøãâœjÍŸFº¬*€¸/û>÷Ÿ ;BJ€R¬wåwU•©»†ÞвÛÃ4=…JÓSò¼Öè° @º4=ekOFÆŠ<Ùè!ïÅEähˆޱDœ.?=¹k›Ú…åå¢P#MO+®Íx°#ìD°eKO±“< ìe‰"¡dƶÐ?ÑÅ­6ÀW„\BȽû;Jåq‰þÖ6?-Ào¤ò¸•&÷K<€0ó‚9w‚ÝlÉZy€M&ïv$ùPlÈbº£å-ê(k#“êùkw¡Ò}!¿¦m’ÕâÏ=Î@±»¡ÉʉŸ à!°¢–Ö¸x +'¾ëú¾sêÃχ[|–õÕÚ–éóµðù„>¹yü6'6KW£2º¼ù§’5V‘hùë󯼡1#MOQIÓSöIÓSIÓSÎIÓSúüF$MOa¤é)ÇÀ«<°‰±×°`ÜLK¹æV­²SUÈÂÆr7s h!_ ›#™\ Œ©m©<ÎVáú؄ͫôI ðÿ˱²)øoôÝÎsâY»Nâ|QŸÕXSühéß4¥Z»S»;llsd''xƒÍ´· 10–7[®©^_ªç„xÔMòu¹Æ-6?ÌëЋ7EH_6˜ ¬Ee=}M){cWC“•ïÖíÒÝy\Á–înaVNüô¬œø²râŸÍʉ¿=+'^ `uø'¥‹ëƒ6¨P¶¯©·j‚wT®{L²ÍüvX[©÷þ_¯Ü 6{zX“™ÆÒô”izÊv°>ê#®ÀJ9ØEäh¨õC<•¶(?ºxWñyü Òô”QïÚ”ÊãØJ™N6+ÛBû.CÏó˜ðWCNÄžü¶Ç·½`ÝbF͸+~n^pnéÅǯÇ*,Úš¨±>ªÉNN‚•íïvdÒSXso<2+t?Ÿ‹›˜ôØàÜ^>X$¢ÔÒßÓ”Òa/tgïÍLô>än’òïDVNüT°“—wûc›«š’qŽeæöûl˜ÕßÎ-ºÍ·LºØËò¦{°ù¦O߬ÐqAöCšžb¦§ì‘¦§|À"™R¬¨´¼ñ¹ˆœ:ù¸ó«/7÷¬0¨Þb2lHÄ>¬æhúP¡ŸPy$ê¿Ib‰èu¾ ß’ÜÉhqÃWŠ[NI ­ù nB—]¸x3VY‰k«\QÞÎmñÁî–èX±¼›’}âL]{óÅÆŽßZ­ú|P ö64݆wÁâßÌʉçgåÄß ` ¬Äm±äN_ËÄXÉ%åä’ 6…3{äÑÿ‹8æP°ó5{¿¯žb3qcè¥faJºe(Åî’\KXs¨»¿Å5WÝÞèx¡¡Ô<‘¿qYcAzF* ;WU§9š~‰ivÂk…Gtì±)3OO};ø‰Ào…ÞWçp MïŠÍU÷J8—ªø©9Èz·žo¤“œ0lm«kàb á—·iœlµé+Ïÿ5ÂÓ©ÐM,h¾s¢ÿ`¶Ûÿ¼¯p9®M»àíÁôm ØÍÐdåÄóôÕålµÏ=èã[“t±WµeRŸ/óíŠE½íÓžÜù£3›]M)| „t}›ãZ¸åW_ò¾ÿ»¿ÞWÞR„º:ææ3æFÿ;ùK¬1 ÀÇÉýÊÆØŸ\§þ7ÞèÆÐ5fç <1‘<x>öø”üÖùìâ‰y–½®Fxåéòdu‘Æ,3&ç.³“xè¬FÒ _g‘ååè`YSø`Îåå(Ô½¿rò—_ß=ãíÛ'úTsQýÛŸ „†šsr(€Jéu£µçˆÆÀ5.1Pæ7©U0Å¥÷•[Öøå˜?ŸWNËz·²ßʤ¡ªßü1l ³ ! Ÿà<­¿ÇâèEqÓ^=ôÉ3w|ñÜÿßþÆïKšª,F}¶dòñ9!SàBC©û¾+y–<'¥N³Yšžb°uÌQH÷A2ÝäÑ ž˜ÇŒûWèñ©{&½ãžèšGøì[:£aÊ^¬\@.“ä%%kÂÐÃhnœ§“%=â\]ÛuO$ÞrZ>³¢M½Ù¼êîø3¥ôÈõê= M_u•t´Y9ñQèE¯Ç·¬ñ»2aª‹å x÷·õ+NüÚÐßãH{m‹žîrŸO”@)ꫵ9ϼ6áéÁ„aed©.o,{ÜÓÓÑu%ŸÇY$îrˆš”ž<³ýòÑuMÖ.Ì ™zì_KÝ:µà…=¬ÕtNÀçñëÔmÖõ¸ŽëD·â¤„gßúsãΉ_Díû›Äò}­\›ÿ IDAT·m;9ãìM„1ç:3,è©Í¬ wËÈãb£rJ“ZÝb·ž­Žùê|ÍÝÔôâã$ª}miôùìä„e½ík/ì¦Þœ•ïà¹>6ß6v@ ¤Êvƒà¹äó)- ½?¸¸ š7ó_/?Q_‡‰õ`•æÙ­|ôϲdƒžŠÀÙ•ßòÂ[Ñ…OpÚàØ—ùúļ²ôw´óüüäà¢&ù3…å‹‹ò :£¾ÛH%¯ŸàZxǤ›òLešÑªé>±ó­;.5–ǬºóŒÀ¨;NT]úe¸®áz#•Ç <6ÿ¢ _)B¯1odÖ[b&ûE<|¥¹êMA×m] !O “¸ûUÌ›~ní”%—¼Ý,¡Í;‹d’·e_Ý٢鰼9/7óíWò7Ù»ï7RyÜJ°ù+høFrå©ò‡@*®Œ=2ùöꃮJçpi}ñru‰¦³™‡Æ€ý¶‡½,)³ZKÁ*FIò‡=ûÜd''LùÚ+ÿ=Q1óûKu«ÀEÄoý|MìÛ">o0ê'ýâË‚š‰Ÿ©º›¡”ž†זNü4ĽS^OIRfnæpõÉŒ½%hŠLÊÉVHöÿØ0«´P­×1ÃR¸¼H51ýesR_?ÖKS%¬Œ ܴ§B­4~™õ®ü>†¡ü¶fƒÏæ'.'ÿõÉ[ºŒ’‚Ü à{°Byc_gÏ6ªZ®ꉛ'ú„Mð ­Ž Š®ŽŠiäóx sƒªEüĜŠ3ó¬eU‚cÿcÉ#ÏGÿo$L946ƒbH§<û¾ßˆ‚Ešicî;rr €W`~³gàSûqýFu±æø„#vóÄ<ììQO©<î}™$زö ;9à–¾¶ß0-øìÎâ†EãÜ¡3ºYPsÿôàž Ñ _¯‰¶62îbâK¢?ëbd€^ «Ù {åžïê#2Ó*×1 í¶þµ½8¼«qIô4—ª›Wv*ßÜ[™ÐHºÛ¿D«a¾ý&£ênÊ€×Ü  xõ…ë7o™ü©ƒ#¯«ñü¬œøZ°ß§@ÓúÄ<›ŠÅ£‰»ß…ªõYó²³È±}VÐÄÓË¢¤„Ï´© ÔkøÿÍû!6·ê|Lek}8C¯& ŠøBí²(éç/Ì¿ÿ9izʰ«ÍÞ„ájXjgxª¨³¾pI&É¿Š „m ØÈsäý‹Q1>Ðz¨mö¹%&|2þÇHËCÍÀý¼ÁC?ÌÎ"¾!!Ø#ï×ò¦]Ò8oÝÔ óƒIàì ¯-»¯´q‰yNÆM,hÞ¼8úÓpG[šk£ÏÐüœUµí㪵ÖFÆÅMÐåT"=á(! „J(gúlµžRJŒFÊ3À7(ßh¤<ÆHùµQÜÖbðèh5x¨•FWjõÃcCž+ìüap¸c¿KoK¼¤Õ0ßÿ”Y³šRújmÈ–7Ê¥¿{q\×è X-7fåÄï+å e©žÑëìH$ÈÕ§òý[ÿø¹¿‹W·‰¯oûjæ/—,PêÔ×ÝýppACÖó螦E Û×tsÒ]~çÆMtî© š€ä¬œø ¶ÑÍrµ^k™SY7-é@OFfó¯ŸJ.ÌIêº>ÀÅ»jḙÇ—Þó´4=¥ÌN}½á‘ÊãœÐƒ¡é"AcO~‘Iò•¦>ñÀ&QOz ôS¶Oü¦dSYbã÷M‹@A ãÐôKó‚–Ý-sܹç†ý_ð1)âœd’ügµ_O²“<Hû»ŸÄÍA5?Ôë׃eŠE°ïŠb±Rgl}R:®ÐÝA 7RJødð#œ‚úvÏ¿.¹·Y­÷3¯ ru({eaÔ7·•® öÜÁ®†F¥d, ›« úÙžFDb3ašKó„i.ͽ·î;)Ï…9Ÿß>µµIïk0Páǯ—'½šóMv›àvq(ûs#!K͈0ÁœT îbçn£ýŽUžóÝqù¨EÐE䨶8"þèÚ)‹ Æy)ìËFÆÄô ¥eí:£ös“Iò/#³]æ2ǧ…ç¸Ìp®®z«f…^aðFGÅÍ»Zæ·n›)ðžEFjHzø||R~ä\][ŒB­@dò–5ë¶6†¡à%»Ë^^5àÑúwk#·œ®Zc. 3Ýr_^•݇àƒ~L*ì© ÐjŒ™kŸ›5F"1Yó› æå²BUÌîmõ}V/±¥å6ŠXFzµ°’“СۤÊï.šnnàâ]õÓº¿ýüüäã&#³_šž2VtÌl"•Ç9‚-rÖ-Äþs4ívX-¯;çr þø^™qbê{AøÎZÂÆ¨dœµåÚ­„¿Ø¡ÃÁ€¿W±€×¶:&`1K±‘R¾¡B†Rþ‰êÖ㥃¾8W=é£üÊuf#Ã'ÄxWLÀ›Gï샑)KÊ̽.Ñ€öLØŒô [ S?ÐeÇsÙE·ù–ENv¶øœø´fywõƆà#ðÉÕ‰zUs·ZOjƒÆò–6í´£Pl[«æ[izʯÝí7†˜…Þê*u’ ¸ÖYü$“ä«@*‹+fÛ-D@hȳAçfœ˜ú~ð¦€m|7¾µ[ù%BH†ó¥sLvø,ýDÅ… ÞÎ+„üktùn óúu î³eMqÔÊú:‹ªçH<»mìŽ}9çP`OC+u?o^8™Ó"-/RÙŽ¢!<ü|ønè ­Yïsêh‹_oû˜ð´c·®²Ô 7°!Þ¸ùYÞ”ÎÔõ§dÃ!HÓS†% tpMÑ·®P]#8OÊ$ùE •Ç…èë ˆ€PÉ3AÓöNz<˜UÑy2!#ªl|Rfn€¾>ÀÍ”ø()3·þÅ›"ù:Ãn•Þh™»”¸9\ùóüñéÏ΋pÂäÂq^'x„XF.µÚ?î¹ôØŸ÷]^Ö‹˜ç¹¤ÌÜÊžw°Øåæ›Ê6G/»Çÿ¢¹¸˜VÃ8¥½Xrw‹âúI3 –àpGeèx§"órîÁæ^KG›±×Ü ñ0éÙMô ³Ì¿•4WukhTz­eDã(ë\’¦§´Ø³“#“@¯//­‡Ú,•Eþ¡ÔS€­† ©Þ‡f­±@WqÅ_nŽ´K>Xb¨gMb¨gæO…u_¯]ªPé ´E=á±ç÷謰oGxg'eæ^—H3kìeh­~û§qG=¼…;¿¬»Õ` B£ ÏvÄží°"Ô^¡š-Mz¿SÇZügÎótù_y©ÆâÚI_$ë¬OÌЇÁHLª¶%„ÜßÛþöÆ#šn#b¦KÝÒ¾–qü@sàÞïëã*ŠU‘:-ã ×Q1ˆx*G'~‡£ ¿ÃÙ•ßáâ.èps*ݽ^¾¢ß@qG@ˆ¸Ã?ÈAeË ÖT¯¿öÇ¢5f5ðöU?±9ò§Á\e€­ïVÎÜû}ý2£ ÀÝKذæ7AÖ‘R'ÁNŽP¿>1O1˜sŽ ‚U·upwpÑß+Û]’»vÉGzIê×M»¥èÙÝï-.m®ŽØ*šÉÓ—™ Wëç*½Îåéêõm>Çñ`%ù `çfEõozÁ`BüÁº‰ý­¶·H¢”ÚÔ»-Büͼœìqtͤ¾Í «ôFþÃ?¤˜]_ C¿¸{ràåÞö³ÅêIÅ1¾®éÞWxRo ;˜x›ò ¥ôº•@·‡¡ ë­Áì…ž5³zZj‹P0)>Ä<ñkK@Æ¿Êîéh3X&í¢œ.½ðæ„ï\Ü}-Âv {¾«øikíÒæÅÎÃíÉÙ|>¡`ç)~\Ÿ˜gþ£µ*¶¦§ÊR3¾ð ¼pÓÆ#ÊÆËÛêÃ((ù0ïû»¶]8PWÝÞhñûÏ ŒÎŸàj~Ó+»ݾQéõï”﷌ڭ„ΰtÇØ/“ä7B\¤¡³‘ikdNØÞut@ñð%LÏÓqå‹7ïsÎÊ¿–.0Ø_ªˆ¨¡€‰>Î5Ç…Üönnù†J¸‹ù¼¿xb Ç,öoîW)f < #£™TÀ¦„ÍÖ·+g¾ó—’ßX™™ó<޼òѤ¯jdNüÚð솂 Ÿ¾Y‘lmd<¼…õOý#2ý–»üJLýúÄÊÈŒU,.2ˆùϲM_»‰[@ÏDÖFf¼Wðåÿ,{Üj©Ä(v-€^]a|¾ECÎØftlò Øu_Ôûû¯8=§ ŸòX ­µ–;ðŠ…Þ‚U”Òãƒ<Ç ak6df—Ñø7E~Ó×:4§jÛ¼eòæN.æ²Vuä©Ú¶ÁŒôµË"}o];9ÐRx¤d''$e''ô+j¨°‡¡ékÈo_¸à½õ‰yÿð1l„¾ûÒ•›w}S·Êhd‹” ED{WJð×Oý3r¯iÄÑ/J.(Ý_þÝÅ;ßúsño«Ë¯V‰nö"σ¯mòÑt©{€RcÈEfYjF º¼\„¸û©^Zð›/œ…ÿ4!„Nñ‹8ûáªç¾ñ… ؇âž1Z ;òÀ–™èb-?C`L’B&Éÿ @:Øb|vÇØndNÆsÓÊu—¼«ù%çiNâ‹b³fžžv“TwI+m´ò<s‰d†R¬ïåÔç(¯CeMQæ53”‚÷ñÉÊŃè“'²aZðyŸ§q.R(“{«böñ͉]«†G9]\÷û}13]­G-m~àŒŒ…n…‹ÈѰ&fA©Õ*À·.JÓS¸ïÏ6‡À>¤BmnµÑèªu¶¾{»¨P(ϪܪުIh=ÜÇh:ÿNøÎ<¥ÏïC¡/çómºŒn–Êã.É$ùõöèÛuä]\}†îƒ) )3÷Dvr‚l¢gAµíZ‹[~~¨ç9†RrY¡œ™g«–.ç½e0 v[ M±B À¼ìä„“&™aÁ†æ Øä¦¢°o}bž%Ó6+'ÞV9¹›w~Uw«y90Ô¡´¿FÆh¤ä«åÓþܸP¥4ºYoó W¬~(hObÒ5e ÚlYŸ˜w]ŠÝ Ô‚^êËß@=gdºG&É×Iåq[Àʶ܌Î#ÆÍm1LŠÙ°­0Ü ?Zs=ÒðEcXÝÖÆxej’9Ç Ï‘×æ}«çñ?ç ½{œ å˜StÚh€²ìýØ ŽG(¥ÖF¶½LM©h¨Sj%ìñÀÄ»WGû87>»§0†¡”WÝ® û² fâ½S/ ´Ÿã=jòªZ•msøºì¼ê®·¿ØkD£ГÀÀN^æ‚•û? p}b^Wƒaq%ÔÊ5N¿V¶Ö<'ãé#¬{éý‰_ôÇÈìø²6jÇuKZšôäÜ<…ËïñÛ»jC`¡Ýª|»>1oHkÝŒt¤é)FYjF!ú ib2Ø·vŽnIòg¤ò¸s`翌`Ä”ª?Y5µehZ{~½Â ¬J«™Ö´½%A_¯·•DZè~³Û®¨÷ÇuðÝø}ýݶ—³­>¿C)í4½¨py¾&Ñü9ÚÛå|¨»£€rŠŸË©³uíqy¦jM„§ãG Á ¸ˆ-£¥Îh-j<>;9—”™Û§ …Á2ä†f}bž6+'þÉܺivÀv“k¬Çøú¬œx¬ja¤o.[ªl7º€HÌS?þÊø/ûY&Û×ômFÕÒZ¹6Üz½ƒ#¯Ý'@üÏ¿eLRE¼®Ikí`3à¬O̱5uìŒ }74Í×s˜ N§py‚N.¶ M9z˜ãé}£ATŸÕ0¾å@ÛDU:šÑ^#óD‰ˆp›ëúUô§‘Bƒ¯ÍuÏh›³vål½ÁT³G¯Î—5­K0¯hQø}Bا²/ŽïÐ=Œ” ¾*¨™“ìñã@:yY¡´Lcø8‰¬ó®|ÁJ Kðˆ]‚Ö'æ5dåħ˜Ößìg:W5€ÝëóÊúq¸q°êgc­ÎòÅÝ~àOQS]zý.»¬rûøßå·”^Rvz „D³ç‘;6¾ô솂ÃY9ñì¤;Øq€R«€Ž.ÈR3¿õP[‚-#ôÖ{­ðÈ ÞxVè#Ðb`B›fŠe’üQchÀΟ™¹H)µvNG­Ç®l>\r›ÆÀ>œ…ü¶?Ío]Í´À§G*š”Î"ÁY•Þ8ÍÈPÁ¿r®¬|gEŸÊÇw¢ºCc14S|]»F° [ù’a o6šobɳÐëÃ\ýQ¤ÿ£4yûµW¢œ*]ùjGg¾®½ÕàXQ¬æžm¥ ^àa}°qÏoø½d_ôt×+8=À~id©Ž`G2~ ¥00žˆ/dÎ×—ºë/Æ7¼õÕC[/4”Ž×t£AåZ¼vÊ’‰¡Ó|d©ïHÓSÆtÒ`ÓÐÈ$ùZ©<. À ³‹«MÖáU•V#m?ÞKõ´S>…ÐWØàšà|Ág÷EÏ¥îÖÚ€ƒ»ÕØ>ˆýoDb­>w­YÓ£ ùÃ3ËZÔ–2Íüàç,2‡¤SÛ’2s•07Äó£½W߀¢&eLÆÉÊØ”™!}~^5ªtâVÁ`ƒ fKÜ­§)(†Q5ýFΣ1c‰üŠx̃O‡}þ¿×Ë×ôT¤×QqÙeÕ¤²ËªI½„Ï'uËïõýÞßI®€Œ;˹ĆÉ]¶€R¯á?¾ý?w\h("àñõˆ1 \ÅN­íZU'qÕUãOT]Œò)üçÒG‹e©¿JÓS†Br,a=¢¹—ò1¥ôšÑ¡L’ß*•Ç} žÑ2‹j?n˜¦ø¡i†ê’zºØŠÃÄ’§÷ø¬ö²©¼1ô¾‘IòG[Ít«Ï'ÍL‰áÝít©QéþËåú$ór|»lå?ëðÿ‹I™¹ÿÌÜq'TºgjÛfÀ¶ µ·uèŒOHÃe車- ç^Ž¢zQ§€©£I™¹C}¿»e$šF°oEpÓ Ÿ YŸ¿'¿ÃZr¦Šü`4Òÿ¼µf´Åñ;²Ô Xw™su{£ãã;þsoU[C(£å ¹«‘±¦HQýÈϯ½öæòMŸ#5c€}\ÈsŸ9kõ9À«„”R­u#Bˆl¢äm Xz­M$ªxÀ÷Pà#þÖÕê€/d’üÒ^[Ž<ÆY}¶VpD¨o»²ÊÀ°‚¿žŽÂúæ·®SCqm4fû ‰{Ù~>´Y­÷£ÙUÜÔ¤Ö¹ýuÁ„ݤ—qæ/—ë¥æÏ¼œ¬_Fäfé'BéÿûÎʉŸâçO´yÛ×ÕX«ójo5è*KÔu C[ÁŽXJœ¢”^÷¢?£YjÆ$«K›«ûåõ›5í=j2ñϸ&fÁÎwÿæ—Æ]j,·Å q÷/ûúžW?Öþ£4=¥_ɶc“¶Ö«¸Z¹`U4¾ °5‚’`£\Æ)Ʊ(à!¿£¾k½í5šÔøÜ\:`´Ay¬â5À†6?ÙÉ Ka#âRൣWæ(U,b÷óâüÈæ…zZ»²v&eævÒ…3þX§Ôº=¿·ð¾šv­%‰w‚·óù.‰þÞIÈ¿¦Š­ÆÀð7í¼]Þª¾x„èÞYó—ñ^NçÀF%–$eæÚUA¢+#ÂÐ@VNü4·áÚQ˜ÀÙëó´×ìÈ1$ÈR3æ¸&ýK2æï.>nQfX5gïsÖ—·Õ;ï*:yºÔüÖ IDATörÔÂqqgTzH­× šyëY/G7ÝÛ²¯g|Y°w¥”ÀÃq·}óÐÌU|-MOá^ ú!„ €´·¶VÈ|â}‡×÷‘ï„ßnŸž`çT·È$ùƒ®ÿt£B™öûؼ¥õ”ÒíÙÉ ÷Àªºp«Æ ãí(t x|‘Š5ÆA¥7º1”vRðuÕ|xë”ÿ9‹ø°“ñ¿$eæv[Z$;9!lÐ;¥ÀŸ÷.?YÓ–Ð]{ìp'¥ôº–KQ††ãú KÍø ¬Â[ËÏû<±ó­ÇV•yWò››ÝÄÎ}v{®-ò|äç×W±SËîûÓÒÀúô?—¦§” mïG7¦‡Þ°®eW°sì ”Ú|€Iåq£1Ô¢+šyB&ɿƕ3!„Ìðú¨VO˜ÙÁÇþ87â ÉÈP[’2sË{Û×äB›Vm@ðúÑÒ¹J ”ö4Ç®«,ý6½ò#!€ã:bš—é”C1= ªI,©µ#¥”|wá`ä3Vö9ÿèlm±ebZcЙó›D`ºË† ÛcÓCdú§#–Á<XUóŽË$ù=—7ePJOB¦-ͰÆVPo'Q]¸‡cÙ­üNK%ÊÉí‹‘€¤Ì\=€ýÙÉ yf>3wœjý´ #Ÿ¬Œ­Cgp¢.`“G8`;¥´¦§ã'œ¡áèk²‡"f¢OØ¥3µE3à£üŸî®éPì~4~õIw›r@j½–Ÿu6{âÞ+y3Ë[j-®ž(/‰uÄWÖyxÈûvìÜ[Ãn¸ `»L’?h]µ‘Œ©4ò]„P~ŽB¾ãC±’µ¡§£P#qsPz8mà‹`ÕžûERfn;€CÙÉ ‡øþ óÀàº?¬p®3Ž‘¥fx¸ëú“Õ…^Ïï}ÿ~ë0f±@¤žêq~¼—¤&Ê;¤AkÔ ”-ÎEŠÊÀ“Õ…±jƒ¶“Ъ£@¬útõ_Þ q÷3KkèlæBíT7l˜z’1ëÀ–n¶%:Ë ;9!lŽYwò.…¾NÊÌ.F3œ¡áèYj†À °ñ@*RTº>µ+m}£ªµ_õ‡ ÷ ,Ù0}Ù¯+¢æTZmjð>gh†©§ØO²“D`ƒª“2sÇtêgh8zE–šÁp7€‰Ýµ12 Ùvá@Äù†Ò ê¶ŸFU«·€Ç78 Tnb'ålÉ䢵S— y‚îþàÎKÓSú-È1x¤ò8s!¬` ެ6¡À™$ÿº†ÆrŒ|8CÃÑgd©¡f‚¤`ýÍ•`}÷õ&€};h›™Þ[ý™f°£—8e€ëTG8÷ÇPÃŽ~#KÍ`¤é)×D˜ÉR3xÒôÆôy&€•`KùvEà€SÒô®F Ç(†34vE–šá`9³’¬ìèizŠ­yŽQgh8†Yj†?%7záà{p††ƒƒƒƒÃ®ðzoÂÁÁÁÁÁ1p8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW8CÃÁÁÁÁaW×»c‡‚Eq<žš¦ìϧ׻?á”û½sØ—‚EqÁæˆ  Pà”ýù—¯gß888ìgh8ìFÁ¢¸póŒï¦ ðÙ”ýù¥ÃÖ)Ža‡34CNÁ¢8÷íCófLÙŸ¯³o¯888®Ü ÇA™è"àßïá¿Âß«f©¯G ŸÞÞd<ÁºÕôp\ gJiáPö—ƒƒcxцfÓ¾ ¼´Å[™ëÝ€²ÀŽƒ[q ±|žz·»ló¤ðÃB^‡ßuEÁ¢¸@Aj„l4Pú !ä{§”ž²ÓepppØå:Û´oƒ?€Ù|x8@–¶x«ñzöm¬ì(ÞW­Ñ-²µ-ÈA$ÿgLøw3Ü]š»Ù}ç”ýùÇ `QœÀmüÌ—+x°J£³vÃ} `#¥T5DÝçàà°##&fÓ¾ RÌëûwÁ´À#›öm¼ŽÝÓ|9kÒâz­þ&óòdW§óN|^‡y¹Z£“êκ]JX@á©VåÑ_­sà°¢uòAg­š¸ww•‘á+Õ‘æåþ^…ó½ÝäjíÉÜ–ö8ø¬²~Á½Á¾¥`]©ë ۇS°M^šB lÒlMü&oƒ6î¢èLm†·—c‡´ìÎ÷cSÒµ÷#-»óýØ”4òîÇ ohÀÎÉô»õ‚ÂÙÈ·¯±Å2I?ÎÉáJˆ£XݵýoÃr͆¦D©‰Pè "o‘ ×¼™ja:†ŠÀ]Èo™ïíÖ›ÆN>Y8ƒ¡àUªµ¡_W7†ßäSÖÅ6À95Cp©£†¼4… €E¦áêïÞ—¦¨ðSü&4Å ±`ç@‰Õ¾ù¶Çoòæ"<‡ˆ´lÛ÷#-›½›’¼Ò²mß´lö~lJ9÷c$š®Á=Ñ›öm€}àL7­o5m“¥-ÞZ;´Ý¸Ð®’˜·E¹8Èmí3Í͹ÕW,¬kÐêý” ¾ªjˆzt\àùÞÎuHÑjÉNvu¶HÕLssnéîrúDKÇLø´¢îf“¡1ÎÐXÈKSÌûPwÙ$ûûZ›—¦¸ ¡›CÄpÊKSl³5âèiٽߴìÞïGZ¶b›­ÐÈ kh6íÛà6̵[׊ ä›ömð°V‘K`C¡vç“´Å[¯znÚ·vx: ìD€ .¥-ÞªÀ%Œ:º(Si‚ÍŸ§»¹Tu·ï w—K»ë›ýà°¢uR_ Íùv¥e~æfo÷NÉšOŒ>|ÿÉÂX†‚W¡Ö†7êô"‘Ðßt«tŠX3rò›‹QG>:—½ùÈ»|ï%BH\_û4š0eé§ÀÊÈÀ¡ÆÖ#¥|ð š%6ægÌ,ñõ¨åbCÅ:½¨§sî¨k²¸Í"‹ø¼kŒ‡ŸXØhþ|±Cmmhrz¹¤±ÀM`ýûC‰wïM8ºaLßëê:#„lð€¿Bžz|ïú2°™ÿ}FÙ¨÷ǽk›+ÛÆßYÒ>>1Dæ⦈Z^îæï¬éf7S(ô2\DZÐXÒìºã•ÃkZªÚìVß à%BH€?SJ+úÓÏ‘JÁ¢¸yÃÆKI^K‡Åmâ(îÖmfÆÏS) FW¨Óê¬\]×pªµÃâ6“zºÚ,%ì j¸Ø®šeJÙÐOÙŸ?¦çgòÒþ°O^™#!ÄìoÆÀ¯”ÒV;œgT‘–ÍÝëfh!/52;óñÖßüR”ô¼Ÿ}#=ÛûrŒÆ’f×ÿt`½R¡öRïz1ûÊRÈÍ*P.yZúyÔ‚0[î¸&³üÌ…G3N¯Ñk ¶²Ø € î"„cúßÈ#|¦¼¡X`3¬¢¤!Çü“RúË0_ãHâšûñþ kVt´6º1F#Ÿ1øŒ‘½ cà3F#”Ÿo$<ö~ðx#Ïgx|‘Çã Ï4Tœûq] !äY/w]ßTÞõÍãÙ†ÅåNö‘ϼ'¦Û¢Xu… ÷žÛÿ ¶Cg3X@¯68ïþ×Ñqë¤["*»l™þu¢¥ªÝ)ç¿'×õŒÈÔOÆ'ÂãrCIóÄ.M¼Kù€[)¥å]5Ò)X‰Œ TªµC3Ó£û@3N|žE›L¡ÓwëýÎJ ØQ,sÛÔ4ó ,®ºƒøhÊþüòn¸ÈKSÄëúÉB¾°SÑåꂈ–ÅP»Z`•·³!ÓFãï`°¤e+âýd¾ óý¨¾RÑÑ:vîǰÏÑB„þbµê€ƒ›øŠyÁ 3:”©œòÛK‹ã5r%ò¶Ä› áÆ+ܽ˜'àé­ÛõŒhß²{_—Íé‹xè¡÷NÌ7‘“°}É¥[îûDNÂŽnv™à(!dJ¯A,Š‹«ÆÐ-õZ½X¡3øì¨ãfo÷^ÃÆ]|‹ÁhÒºUqY©ĺ9wû²Ñ Ó;›?×ht'9#£ˆ¬h(Y³ä…ñÏ<òîí·þ’û¥%5€OøC•sAÁVG=…«AnøÿöÎ<¼òZãïh´Y¶åEÞ÷$¶³XIœ(NÙˆÄ!„°…Á…Ëz¡-ˆBi>”½—–[ ·(…†b ”²„-q‚MV²euìÄv¼ï¶d[û>÷‘F²-yI¢ ;ßïyòà‘Ç#¡×Ö™ï;ç¼Øz‘®?eP•i²{ÛÏÝôäæ¿øó/¯Ûxd—WŠwyéñC¬hƒíâ€Ö’·7>•yõnÕ‘%5» ]—LZsÂöçö­¾æÙ•Ã/àt¸¨¶Ýó<Ç‹nÍûléÝóOYõ6þÉ/j³¶Ïé©ÓÎr9\—“¡«wœ[×QÕ›³þ×Ë>Kȉõ»]ÓS«‘¶ª; <Ç[ò¾ò¬„¢R"Ú4.'³lɳìž«¬•ýg˜X…\HRU¨à¸@ÁXçîìíç 8âD‚žhß>Úù ¡y\Îl @ ±»êœÑ2Ýs¼!16à š«Ý÷—{^&ÀÍïûÚ<³Í$Q×Ptõ·%l\|ëÛp׺Gw˜,¡€/tŠb‡P rŠø"§P vŠb'¢«ÝBÛVÚê°Òv‡gcÿËþsÚxqÒ$SþŒ+¾þÑóKÿE-°ì¶ÐUEE2 3®m祈ªŒÕãÛO^›g³˜$õ'(ú{Ú¯eõXwÛ£;,&ƒ/:"±C 9ùB‘S ;B±“âÑŒÝf¡v+í°Yi‡ÝÆsØ­´Ãn£vítØxÒØ$SFÎü²*ØBƒ‡¢zü†³’„ öÆfD`Š»â|cNÍ7/ºFÓ8ç´®8RzªsqÉÜß œú¼vºÍdd¯Á7..‘ŸQ¤ÐQ°E~¦`‹üLÛ±.Ù®?ºQßcL€6Ý´?²óÏ­z;C‘܇aÔìjÌq9Ù *ibx›âÖ<îîšgV~‘náÑÔ9_«ŠJûÜde`K¦gPµa˜£ù½ºd¸ƒÌõ`ûˆÆD=`à²ÃÅ^¢;ø]­~ѭɰº\b`¨€?ZÍVßeêehܶ2·}Wó §ß²9kOx¾þÑŠ{üýìy0»R¥I,Pʺ†ÙOQÔY°-k¥rb”Ÿ½,pÛÊÜ @TSéÕcÎb¯+6]˜ú^á×ï<¿à‹·Ÿý ØvŒy ÃÔ„ª?Dy3wW/™v¦ q¦lð¶×7| ËŠâ’¿GJ«nh:Ü>¤^\Û¢ãö6ã³ckiáÈehÚ‚$Í[¯}kÆŠô½”{Ê£Ãê +{þÀ­úãˆü€¡×Äåzâsb‡Ì°—&G˜y4Å€îAeyI,Ã0ûÁÎEñpý¸þïCªBvôò¸‚ ÔÌ\E^¾4b\x. š‚ß½ÌòÞ!n£NÔtIõ9¼l €b¿¯Û'ëêoKvÞ¾ú§c6Åž†v´ûºAŒgt÷åÀ ±uÇ÷Éú{¼z¬¾éâèñÉkO*ž»sá#·¿»ÞlŒŽˆŽÛÊ0Œçf<$õø!ͧž/Úu³‡M1›ž_ýIX”H .‡K°ó…ƒ·ê: Ü6I˜Ôۯ᲻®Êh!íºæ™•ß=¶d«'c´Êv½ppÍðsMZ3h"$£¼~€Ç¸Þçñ€ù¤IÀzà brºè‹û_=®‹a¸ß7^€ϧtF.Ь’EÌÏ€Þ]*íæ² 4•*M4€¥°íP©çNÙÉsê’cÓ•÷_(‹*Uš •*Íz_èkÕ¤ç›4¨Ê¼z*óê‘ϳu—àô©Èuð¹I¨¬ÝϸÇdG…Çj¥’è ÛÇ7tžáŠrcR+Ušô¥lxsôåÂ=j{õ—Æj%ç§GËÙ£Q_ÿã÷7xŽ“3gÕÝûlé.ß㡳٫GL|ê ªL“®, =.Y Q–—$bØgÖ’Ôž¬%©ÖíiI®ÛÓ<ÓØgŠ1ö[b¤¢Á¬%©5s¯Í©—Ĉýúaåß8ëÜñÏ´éºi Ãð½sr³ÓáúäŠ;ç¨ì8ýu}æÁ­'78¬Î0€mÆÌX”<¢Á°øÉeŸ|õÌÞ-F­9ÚOö,l?Ù3Úà5;€Ç†™Ì–ôšD¹O;˜àYIHhžaQtĸîœNêŒQ&§+„<ʺ4&rH‰ù7½©žN¼HÐÈ ÀC«ÙÊm›Eдç¦!½ªPAË+ÔSÚ½¹R¥É…·„PÕ¬æ>ä£S.I¸®ãt²ç뤘t XÓÕø`»”¨ÊFêÑ|Æ«GtÜùéa³šyÿŸ{nö$þÃ"¢ï}ö½Oýèhðê“Zz\’@£,/¡À.+ý¾C9«2:sVeL8™~Ýï ÿùñ£»þÃ4`‰c\ ïÈ»§6×ì8wenaÖa¸Àj3Ù…‡Úçj›¹fJŠ¢˜,üØŸáfÒì¸ÁÛÞØðÖg¿*¿±¯a`¬ñÑm~Ä0ÌÁ‰¾î£(ƒT¸_æL‰xÜ¿Äû5:®Á3Y,잣96hàªe¦ãº& 7M5’O{æ ÂO‘ÁTÂ=cæªáwõ·qïGœ4i´ªÉ‹F]Çi®±¶ we3BÀ þRãž1sÕðÇû{¼zHeç§ÇÛÏݹ®¿§5(ϵù§/|$KÊ èÞÑèÕ#7?´ôz Q–—ðÀ6/¥uîD‰É¯ÿCÑ;Ÿþ⛻̃ÖXÐ÷šRÔVûíiáÑ”C~MÎμ Ùó ’±íÖ×6|xø“òvÌÐkŠ1õ[¢Í:k´8B¨sÚ]Û’åñ'—Ý· =*9"CY^2ÀUQi0«|‚I€ugyv£Éïù:=L4î;µ*½‘+‡ž! á‹Vk4sF. 3ÐT鼆ž)b‘gu´_^¡žÐ m²¬Åú }Ü /62>èÝà5­Ç¥ï4>Íw¬]p½ß骗~õ0 xõˆŒž¸;?øãì3ê ®ôŠâ’ŠÕ›ú ¶Ö—z¼ÓhšïX°*´ô¸+šõZ|Q‰›m¸áÅ5ßÿúÑm'ºx,l†@IžrÕO ¹2¿4¾ðhŠYz÷üS~¾ÕÀ 6àûË•¡,/©ëpIî&/ò µ¾ªPQqdê°Ø¸@3]"w‚³Ñdån4æJ%Cþ\ Ðnöö嬒EhL–á×àO³)C¥J#F{ Ac?×S'MW¹ù…°ëè§ÜÝsª,«%\9¥·+ý¡* ¬‡QïÕC;1=ÎUŒÙùÁKœ×`Zöüê[”/ígŽîñê!KÎjKBK eyÉ,ž{}ш›m¸þ…ÂíƒúÝß½}bq«.™Gó<šrñ…´mþ3¿Ÿ±,}LÓÇq0Zâ<l¾ãƒ‹ð<—y…ú£ªBÅYk1Æà¸«0–)aåã£ÓIwYlÜ–ÛJYÔ;³Z]¼oÞ'?*|Ô`mq¹x]èWÇE·øJ^¡žÒÛf`‹iFÞHЛ¼=E1éA_Ño8Ä}°ÍÉXàqÒ°ûyCŒ€z˜G ¡£ÓIDAT ^=bX=\N5Ð×)­qSÓÕöÎó÷Þâ°YE.•iï{ö½ÏÇz! U^=2rCO ÷–ÙÚ`]ßúSXbnlçú_/Û3¼|y¢èºb}·Q"”ìÑ©‘&A.¾ÍÝwãàº/3iD 18Ü4Ód±pÌ™2g f.?ã³>F­SQ otj[ÅN—“>-°ÇIM¾k{Ñg%5u×…;œ>h¡--nš€¶@) 8š{ Pmw«Øådõ ù{BzŽ.J–üžQ×ÿ38{t÷âïËÿujQÑÚ «åløkOm.ñ 2knyäÓâÛ¯Ï én­ wºõ ùB[\2«‡²8tôVù›À˜v _þfOñÙŠ¦ÂÑ‚ À~ПÞ^_üÞý_ýØó˜Ýì ·šÿ±mRõ‡Õ×ÿãŽmw÷·êüf´¨;ã>¸ÿëû|ƒ Å£œb©HKñ¨!K\»Å!é©Õä•ýîÀ½ïܱí®Ÿ>ìrcÎe™lT*DæõÛ½~pb/`™¥/ï¶us«™Y’33ÂÅÆáçX].Îw.‚OúÇádªÁdá3ïÎHŒðdU¡" “ÃaÄDXMݵÜ6M¸(BàÍ¥ì(€ ¸Ôwœæ,Ÿ¤’hÏÁ¤ôú»êÑÝêÕCÆêÑÑXý°46ñ€çñí¥ÿ»¾ûjkÖËÊ⊬&»ÐÐcŠ2ô™b´-ƒ™V½-ÚôY'?¯6oSnã‘ÒSr»Ù¢p¡nÑ–¼¯Òò»íf}¶¼)·vwÓrÏ÷uÝÆ´”;ï½æ·+KSç% i0tÚœ¼ÿ}`‹EoåcÖ’Ôƒk¹ôÛ°(‘}ÿ_Íï©Õ¤éº‰º.C|üº; {_U—ØÍŽÝÆÍ¯IS–—¤«ŠJC¢QêB©*TÜ }Ðîä„¦Ç 4v‡@=`äÀõÉ2µ¿ól.†û£äóF 4ï¶õdN)ûxÆ5ñÑ`·,o¨*TDË+Ô{Æz]“”s`ÝxGXµkš¹m›ÃÚP ”y¶[ÆíÚ0š{ê¹¶è™§p#dÆ_"ê¡éòêá°[”Ųn%àxËcO|ó¡j·Ëå¤5M/þ¬èæös'g{(ŠbVlº÷«ëî}öøðkŽFO›Wˆ¨ÐÔ#[g³ÀŽ ˆÓæäøë±MžcYVTÝ­¯oø€æóFloÙÍúÓ_•oêªî›§¿®/˜·)·±nw3w§Ô÷ë‹.-§û1ÒcbÏ÷u¬®*TôË+Ô'Çzm“¥Ì^©Ò|à~ «têhçî Í6“ï{Üv¼ïXnä¢CÛÂåd‘ `›dǵÍ3UPËìª2ÿz ôzõ°Y¼zl¸ó©ÃÍg9{ôÛ¥ÐV‚s……7Þõô'ç3MÛåÕ#2&4õÆÖÙ˜}$u{ZRL–8 <ۚǗ~å/È€ ŒïÌT$sA„â±¹£ÖÛ8Xp{Þˆ;IŒØvõÓË÷,ÿÏ…xfÑØ-ÉñÏpýl&;]³³a¥ç8wuæ6rVetnxfÅ·7«Ö}vËŸ‹_áfæ8þáwO­ó9•[_¿Òï…& U…Šp°g€‘€«¦ÓûXôû£Ùl•|Ú©áòt+eR5/@êÔÉxÇ2„Ó¼€§õ&iÁœ°Uowg&ú[!%ûylJP ”õ‚çÔ„îþvßA~>çÛÁ–Û_Ô*ÈÞÁ.ïÀèä}—Y~ ,ö¯G¯=”Å2û’u·>$Š‡è‘–ÝøÈËe¯ŸïÔÍAWh«G(åg€àšN°i:ÜÎå5’fÅNœ)5Ü~ª'Ëóµ(\h4õ[„N÷6¦Q)‘·qlžUŸ㬯<Ç-ßwr[9ûß8ºÈf´K@(VýdѨMQ¾$äÊt랸òŸžc“ÖÏ0#b¥Â]1YY Ÿ»µT±Ë¯Œhž¬nZovº$ÀÚÌJþgÀ“ŒuÎ[Í] OÕÛôpñ¹ùR¿ý6v£žL(eÕJÙß¼à}[wýÄס¡eØùõ^pÞ&›olÿ}Þ+ÛžÉo×4‡€VßÃ}°¥Äf „æž\j”ŲjeñP=Žî¬Ç;¿»_-‰ŸñÇ$¤·?ñÆþw“³f»©sû»¿ÏÛö·gò5]¬ú~¯±I¡©ÇEß:S•º”å%ÍrÓ]«å4%b'€`FÐt¸=¡ýDÂsœµ$¥NÛ4À-Ma‚Éåá,Ø<«æèGÕ×e°Ä5nOÈZ’ÚÓ{®Ÿ«^Ê^™ñ(rb¥Ð‹’{y4ÏárºøN»KØS«4Åò1IËdûd„yùF§+`cç“ÕMËO錜ª ¸'-L´Àr«q786—‹÷]¿~çxS’¬2À©£6œN ”2+€Zp=âòíNÿÞϹºJ•¦ @Öx¯owØ »Ž6ëÀé3*N|¹ÜérðçM[üFª,Ó<`Ðp[5™ ÙƒZ£\.(‹½z<â]“~àåÅko›ÝÞPueLBZæi›ä°Û Ç÷~6ëôá3Nør¹ËéàO›³ø YR¦Ù óꑚz«f'Xo³0ß´l܇AMYÃ[k_°"lßG‹=ɲج¨ú›g×uÑpIi‡ÕÆ0̈ù2¾tœê•q=1ž-yN¼,:+—KŠÏŽ™psSMYC†ËÉæ-ø"¾Y–í¯Qn&o ’/‘ ù6>E9 Ãw2 ]k0G o¾|²ºiù—ÝÚ"Ÿ‡Þb¦Ìýõ¾ªBEØâ‚ ñóŒîÑÍ‘|Z÷ã´„@wmßMôÚ“Š¢¤<Õ’Nøéƒ¢(ŠÿÒ}ï-ºÔ–Þ†¨Nmk´ÎÔ/q1.ŠaŠa\”Ãé ­v‹Àæ° =ÝÖ×”Â0þo&tæî:;%¯îXÂøô@Í_qí—3®rõ¶7D½ÿLJ®4éû%ŒN‡ƒ¶Û,‡Í"´õt_g`=Ìz¯)ÓBS UQi¯²¼äàǘâQ:ž!=aNƒÍg iðÜ÷šzA‹n:PåZù ¢ €%i–ìMwHtÚ]ÂuWXæ¢dÏö™ ¬5v-Øx¢ÞßÜžÏÜÎ0Œ¿üY† ÀK‹:{­öDø~Àv]’w*௪›Vµ[li@S”óéÜŒ£üáM±ý>”W¨/†q꤂a=EQwø€@M«NFÍ|ZК›*§ReY D|—ËiÓê{;Û5Í-íšæ6†qéÁZ×´í±½À=ܨ@)›Œ7PAc¢zÐ|Akêt9%K΂À­‡~ ·SÓÙÜ¢éªÇ‹_Œ­‡²84õ¸Ô£œ=¼à°‰ÛÙš)Š:Ö9 >B¢Há^Ù´èÞ»ÿ«á“ÿ à!3Ý×ÙAQÔÍ ÃÔQ%‰ »Úª·Ýî è7þתw}-l¦/K;á 4ÍßwÎw9™ƒ£YÕœÞ^Ÿyà¯Ç¯ómîL™›plÍãWŒ5ül\æ“¡ˆ¼Bý‰Ûl³€tIL¤&FÀ×ôÛþ|ìÎø9Ã0_ŒrɦáÌŽ”´4ä@yïÀf%K -wôe–÷¬ðœ·))¶¼(>Ú7˜0Ø+¯POÆ­É‹Ã0»äS•¶JÐ v…g`cæ¼]­+UšW\öïÌuR¶ã|¯;• ¦ª²Àz(‹CWÊOIî¥ybŠzÀoÇ8í%†¢¨k|éó¶[77S^&0\ûÜÊ­i ’†|à[tVÁ[·|ò §mŒÏ‰­)ztÉç 9±ýð)d¨.;—¡þgõUý­ºi¾?ŸYrhÃoV|3†³ó €×TE¥“ÚËí  ?÷±_;æ÷·´`s1;lefÌÕªBÅ\7Â}CÑa±‰o8Rý3Ϩgg‰ðû5v»Ìîv ˜.ŸûtñœRŸ^Àò µ¿d+á"S©ÒÌ»2×¹ÿi ”²Ëm›2dP•ÔCYºzü†`3€',ðù–ìñ‹ Ãüm×¹À«°=%ã®~zÅ?²§øõ}úâéÝk¶/óyÈ.”:"â%v§Í)´í‘uˆo_H[—ÌݶhKÞ™1^žÀÛª¢Ò±ë¾P•vëó['Îç­ªP±Ä} ü©¡cÞ[Í]7ø;7Œæ™ÞWÌ|-;|H…Û6y…:P^Œ@ „?X ò"(j-Ø*´jg†™Ð6EQ l» çÙ¬ðÊM/­Ý›:/aôW0.fpkɶ}ñ¶1Ÿ‡G¹RäñÇW<°p{R§ À>°æ…«1´jÎàߪ¢Ò+5 ª 3pF©/ŸkŸÿY§f…vضܣ3R?¸+#Ñ÷}<#¯Pn%!EHš‹EQ|°ÕQ Ãpw»Êò’p° hu@#€oUE¥Š¢Öø5üØÆP<Ê™:/áø•÷äïKš7ÖÒ£ÀQUQi‡û9x`“æ°e¶ZUQéÔysƒ@U¡"Àõ¾9†ú´S“)¦yŽ4±È%‡%ÿ»üC^¡³Q—@ „S*ÐŒ…²¼„ˆúUE¥~ûf(ŠŠ;Ç#3ivÑmy9ÉsâÄaÑân°Iý:ÇUE¥!5“{2â/ÐŒ 2Â$ä² 4çƒ;8¬N.>U…ŠT÷óôoË+Ô“º¨‚@¸!†ðƒRU¨ø€¸1NsxM^¡î»/‰@ \d‚5a“@/ã™saòB ᇦ¬ÕM t`ílÂ$…lB‚ªBÅt°–Bq`ËÆÏ8¶”ù²íú'¦$ÐB ·#¯P÷3#“hTHކ@ A…@ hTH !BP!†@ A…@ hTH !BP!†@ A…@ hTH !BP!†@ A…@ hTH !BP!†@ A…@ hTH !BP!†@ A…@ hTH !BP!†@ AåÿX_‡Ÿ\dÃÀIEND®B`‚numptyphysics-0.3.10/data/paper.png000066400000000000000000021107711425065123200172710ustar00rootroot00000000000000‰PNG  IHDR àÒež¢ pHYsaa¨?§i IDATxLÝY¯l[v'ôèÛÝîæÍ{ÓÎtb»ÈJä.Jx@V‰B !Ä„T%p©: xà ø ÀG@âGK”TÂ:}ÿþ= jª5“‹ÍùÄ”Kÿ¤÷¸ÛlïïvðœÀh6- Ã:yxxhx8nïÎÎ.`~¸»çk€!ŽbuÓÉyƒÑP%õ˜[ǃÎîv»mk$•“éa\Íúº½½žC=›…Çáh=ŸÝ¾}û¿ý¯ÿË¿ó·ÿà£O>yÜ·‡‹ó™î4Y¯WÍøûÍãb2FÞz º 9™ød$ˆDüÇÉáx·ßŠ ïß¿uk»Ýœ¯×¸ º\Ò‚‡h†41™ÎgËÑt88¿ýöëå|6ŸE°Ë³s&1î6[È‘1ñšÑ'ßýôüŸÿ§ßþí_ÿƒ?øÛïÞÞžák<±:žîŸ"Cýºš‘Õj…¼vóÙt¾X¬ góùô›o¾™Î’_^^‚/ÿ:²«ñèÀp°<Žff¡yðäëà8š-檠‹ÅìøtØ>>l·÷m6ËåŠXÈŠã#Û 19Mag< m‡Ý#K04AÌúì|» Ç‹Õz÷ð@¼ê/®¸Ï/^¼øúë¯ÝRï+^œõÕWîÞÜÜàð|:cXÈÿüò‚*]`X ¦°©ùb>~÷îréb©ž‹QëíMš¿yóæóÏ?‡@Ó†Y_ãÂØáa‘V4Cfü2½IbêTðÜÄð1ÉýÕ·‹³0¦Èpÿ´{ÿöÝOògë÷ÿæìl­ß»»”¬Î.6Q"*ÿ: Æ üÆèAžG¡HÐft€ß…˜Û‡ûÉxAAZ¡dµ^²R]£–Q©A9x±Ne*Œ¦ÛûÍQ«k½sÚT Q¢4£I‰2Fj}1¦1 º@< —‰# *€ThT¾Ž§#’ï` ¸{‰¨EJƒ¯@j”<œFUõOF‰G´v‹ ÈAÍ`øtÄ+àjˆ¦Î7Ûo÷;v¾ÙÜóªýã–”( €æº† /š G¥‚¯q‡ÃAÊì™-Eàü\\®Ø¢U×;2&RJá#­@2.ø`Žiüñ!ÃŽOG¢&X(œŽâSð&—‡\ÙÝñl"rëÈ¥Y!I¹… /Áhæ,à··Úb6ªKڀ͇´lÛGÍYæÍÝx+Ÿ_~öùŸÿô§ï¾ýê7¾ÿ½?þþÙ_ýüÏ'/~ÿïþø¯ÿþÙÙëád=ž Ôëãh1L®..t# Gs—²î´*´‡©ñd*±H&\¸‹wŸ÷O>Œ®%.˜á”^nŽÇ½&ÚŒ9žP¢_NÎaÔ.ÐǮ畸¬._¢™ÕF;¢Õ1*8ƺ"Û$! Â9>¿,⋟áh™”*q™X$Å u½^Rc¬"äU)ãTN&4ž$ØéÐrFóõr®R¿¾®õ®´š¡7Î_Ž a”èlP)èE¯<3-[Ùj§°21dØíNAP/$ÖtA†RæFòꉤ2k3¡Íd$÷w7„ƒ5)¢`̘³ØÚ›V“ósb¦)eAGs3iDÙ?<Ýx42‡¤ò ˆœÉ‡ £>Áq”ìa<ˆ½zùIåCÉÊÃýÃýÑ}ôñw~ðƒÄ(·ûÉðÉcµ ö-ÕÊt¢Ðíc{Ú˜Í>á•À!íé…J¸ñ˜Áu2Avõ~{gÌ[­çç—r¾ñtþ½O_€ä×û¯L6OH•Ž—v4gö.ò G;¹Ë!QÍp¢ÑÌÅ`üêÕÓ’‚¼À,Á:»Xìit´äG‡ù43Ÿ#zŸ¸V´ ¹„µM²R)Û†YÍöaÃÒø9Þ£2¦±”´QøS¾œóeRL©xÿtõâ ¶áx ,Rº®v⢃Õ* ”W CÔx¶XJ—a&ÏÍ]Bó~—i¾Ú#FÚ 2‚ò¬f_sd å*á$m}ûN¶G>$ì+úo7Û›ÍÖ¬AsÁ–¢‘ᢓU]Àà«òVf9[‚9É1Y…ظ\¬§“%ùÜÞÞ›áhîÓ uvv>H¬#øáj™) ˜˜ú^Ò–¬Ë(<ŒyJbÉx>”ÜÅÓûŠõ^H WO5©Æš®‹DýãÿøüêÒ$N¡6ä!FA+IuÜýºžO¦{è+'Sb1¡úôÓO¿}ÿŽÕgfYY1—½k"YÌ–O³øù=¿N ªéIÍ·)ê[Œ}J‹H4Èyïn®õnâ f˨šJ v‰µ”e¼8Þ\_»kR ûíaCSH¹{ؽ|ùòi?ž/ÎVËõ& Gòld„/J‰ƒši,Ç™æ'ˆ¹ô‹ ·âMø3+tÏC÷(- 9ìcÒããx’<>n•9ztMY5Ç£­ZGªòD³ù‚Læ 9 g§\ÍõøôhY!sf¸‰kbĬɡ†t¡¬=æK³U#þÂ&Õ‡ÚÑp}F2 ¤ÇÁ¦LŒX˜[»G¡•iÑ3ô¸N®O »Û†°2*ÈpAGAC b´_ùk˜–/=˜„<ÁWx_ Ò6NÁõÀ‹ó²g¶Úd7Âæ´# “‹ jÄT/äP8`W†k4·åóU/¾úÔÃkÈÀÂå3iO2”¬ ª"âƒNoïïEŒ×¯_üïܼ{÷öÝW¿þƒßxÜo'?ú›g2]ŽVgg«µù÷x,í¡î2… wO—ˆ¦ßwïo80º¯®®Ô4Aº'ÃI“Në ˆÃr-ÿD"‡ä†¾V]2T’u)Fº“IF³ºX¬…-8qáÓ‚³ÛÙbò¸Ù¶'ú'ŒkI°*<”î X¼cfš" ÛÜèK6… 1~c‡™&§å(у³Øl¡£­š»”Qe~IÌ>ôe¾«ž‰…ž©8.ìî3lLÒ•_^^ùÄ ñ˜¬`~qõ VáxŒ…Õð#§‰¬ÜJö•`”1[ ×aLX _af~ÀÔèÝèÊ¡ ؤ8!Œßƅƒ 3|²` 73•*ø)CyØ<ÌâƸ#£æHüÜ2™|ëñö#_ KÆ}˜Á°ó>6šî82w¼d*@dV÷hf5YL3! À/yÆš—«sb¡eüÊý.Î_hˆæäƒb_g,gItbfCYÆ?ãµKšO`ønŸÁ&vKˆÒï!5RXr 1 Fïr ’D§JVaÒ+9ÑÐW“ϲ”3}4úUß*s Úà|¾t ¡B2a›M—Û‡D‡Éìâ2Ì>øŸ{)ÄÁdº¸Îb'Z3__.ˆ=ôV¼³~t÷µÆ¦_mg㬬ì’Ñd zä(ì à²FVض‡ýlœYfFßuVŒóo b/^¼ú½üÞÙúÜœ1WKtGƒ :¬E¦bçp,ó=N3ñÀcKC*e¢CÉr¾Ræ>Ô™©|Èbåã¨òÑô0˜<>‘ðr¾ÌšâöáÎ,™ýQ¾!“+îÉ$ß( ‚øtiƒ„pb<™'iGç«‹ûóíÃ6žÓeUȤh4YÌ ™43½£|<0À§aB¸ŒZNÆ ¸¬€.¥ÂˆJð\´u*MÙm-HÌvÇX8óaóQ4 a £á£Lhp¤Pz¡,³¡™U.>8‰³;CE•d”©Ml½}]TI¬·ø€MB….ždnLÔ3)íd8x0? .º‡¿­ºžÏ ‡±jtŠáÔjø|Üà–và‘³RAè©—åÔÄŸ˜@2cλ›¤Ë¨². r®Ï.ÅRmYÙúìSå—k)Ôx¼>¿2VÊGúªìVôåƒæ¢á–ÃY‚«whÛ6ˆÜ°€ cĶüžZ9ƒ¯Á¢}ꢗ¶hv)¨l®“[8­ •–‹JwIt\žVUN^‡$ð0#ïWä–(g%i|6žï’,î¤f[ËÆ16½Ðïú|-»º™“óž;™gêZp*6Ó< £Iò @]EŽër‹’ÄpõIµ¥o«Ë¼EŒW²~Íë1a‚-ï2ze/`ß5ô©²;E‰[]vKAMµÊz@‚×ñ_CIæTYŸuâǡ٤b4Ðd¶?l²–±& –& gkÁŒqŽgÓ˯~tui5gòbº¼¸|9ÎïML ¾»ë'÷×Ô#‹ZÌ«PPºLÿü“›ü¾ˆC2DÒ1@Ïü 9Y 2*¶kUÖÝDµbÅQQV=žºQÃ]Ƽ¥ˆÆtêÑj ‘‰siDšƒd``µSa|@¸:Ën éäC’Ùl3}@®ëh¢†U½ÃàjÝðj9•óLúÒƒìÄt$Þ¡¢WYIROjÅØïj,/.£<À>UªÁÙ¥Q0ªE¹ñ@§É&¶ EIéÒ]M”¡Å£VF„,•kUy†)`.]ˆ5îf8Üíæ«$R Æ\øqr†pMãà…*3í~d[é£u° _dKß–«Ì'ж£!swgÎ÷úÍKxÂ-âí”n7Ù3Õ×Ó²Ö*…Šù ׯòYf`—/³ÚÁrFóÑÝõ¸fƒs# R+ 2%%gg¤JØDâ‚^VA³á´4e%ñÈEò––§ÇcÆ9qt¿{bc&1éñ™5ƒ±‘BKZvB-UHX J 8+‹É¨ë 1Õu: Sd•V¢De(¥HÞƸ˜ú}Rý¢V%›ô•Ÿµy”¾brÑE ?¨" À‰õÏ>uq™Ý dT ƒÀ}æÀ²¤§­JƒŠrŠ,¸==½þè;ß~ûî7û_n¶ÖÓ$³:ÞQÖžH–ëÐW*Ÿ`ohƒœ‹¤Ñåù< *)ÒEs½õÒË«—¯ô~w{v‘Ĉ~‘º:›îÍû£–ñ|i«bp¼O®Fq0³Æ‹‹õt¾µÛXê 3ÖIÈr …\]½dG–ŠÂ”¤kK©¤'á†ÑWD~¸d+µ…(aj|­úx:vôò¡2 YH©[Ò–ééÌÀr€IÃÞb°qÎ^Ãqo8×YrnakDvIè”$-íf5W¿"’ ,Ì26JE'j³îR\+·+à¥mÆÔ”[r{â=»ýúêù˜ë¯Â2³‰ƒÄËyȳÓãÙ*fY3‡ÙÃý¦×ÌQ¥Ìº°È„0îRÖÜ-8UÒfK G9Ç›År¤ª¨b Ø$IŸè÷Ý ƒ†è.vgy&¦ú“ƒ¸¥ßÖAA®wDÊ-`É,¡­ÅÙ˜:JÔ"À–°èãåd–µ ׳‹+å¿õo|zͨÖ$¹°æik>k¨`â_Ö>+=$X"Í0‘´²édȲˆ¤a9$0^ÃÀ1¤"€éBs~–I f§sS>‘>¡ZŒXÐyš=mno|]­)—´-òøZɱE«H‹‡½*”f2F»•?ù„_'ÈZ†T×ui‹Šc ¬è¸È¡ ÁcðérêÁþ7s?ìÊÑÐ U\€Ñ,æ»Ú0<·ÐàÂ…qœhªœ°¦Q²©ú@¡Q@H¬ókŒƒlR¥¿öKÖ+s~ÓΜ‘ÀÞéV­AcÅ–V0±Í1ÛæJ ݪ‰àÒ€K¹ÁèLÔ£’ãÆÛo¾yùò5Ö¢ãSжF~–N‹N‡ãàüòÊŽìoýîÆïïýç9úa¿`±4‹ÜÛãdzf†ød‹××7V>_¿~óêÕëñ`¿)#7tü³U«?¼šøaÆdä®<e:v“ñ=î2Ìhñ Gà°þ†µt7VÌY¹$­áIbœrõ¢ÉÃÆüü¹Ít ݤb5³ŠkÚ6X­/„ìØ¼ÔÍZNb_v…\é·Ö‡Ê,O™/jé–Oäjp÷+5É„8´‡ú,Þù”é¾V^M8j¢si<ãÖ-3ÒUà æBZ$v_MŒøF‘0bxXɪxV3x¸t.—BæJò h BÕšÌ'0Š&ÞI`­I²ÎÙ<‘) EÉÜ…BÆà›ÍåúŒXýYç»zñr¾Zo,UΦŒáòê­ŽLUŸJPHÙnîSÓ3\Ú\s„e/Ø¡‘ƒÍeíï•¥\>ÏÖ°Qœ½ÎÚæc]‘§q.Ë ùÏ åhHÔ1[2¥ẻÝ÷§-˜[oî rƒ²˜«)­‚ûáq¦÷ˆE«V“rÛ!©ò/J—{‘!z\ >ÕPvEÎuº«ËwHX€£¼ÉtdŠCƒ IQm ‹ÈǃÅèÆ„*£/˜q­…*ÛÊm$dkMïœN1åLS¢w_©O ÉßÞÞØÆŠåäJ2 }ºkfw¾Z=n7Ÿñ™“kûø™äçÃma‹Qmxq%7··š†æHl’dä<¦©û{êj[½ƒp'«W_›³·ïßií\;ÍÁ·:Gb¬HĈ;_\^Ñ)ÅM– ¥}¹kÆS–úvOÒŸüäÏ^¿º|ùòÕÃfk0#i(-\ñÅǘÃø3z˜Sâ5$ 0à DJ›.­SÉ–2Æ"…5 ^¿{»Ë®ÌRÄýÝݵB{F´±nJy{{7wtƑϤAÒÄD¤`—§ZùÉIŠ˜[0¹¼º¢ÝÑ#;´/?“%s·CKr¶óó 2i— y¥¬4©ã 4Kþt¾^Ѿ5ã(œ Û®IȨ†ÙÌg¨B¿ÌXCÍáôéÊV‹Ü‚êRDJ¤•±g"»£#V¤8§µõÙ:‹8æ«$)ÔXsɾVò%b-›dêvÒí'Zì{ÌbÁtœû•ès Ä“ûE3S‘–ù¾\­¾}ûVÙ¼?«­ó™`jòID¦õì¹MÕÐ9°„‚YE– ÈT(0º?9Fgw›kˆð!&Q.ù_ÊN|æDÁ‚’¼½Y¨²1Wç9Àöâ´å|0‘DŠ…ôB"Ù YwÓÊj.ƒŽ‡ŽôH»pjK­ð0æ™Çnÿ)•-À;»"‹ÂïJ­VëµxÅ¿ˆRC‹0똩'P®º,®tž¤EìS†8€eÔSÍÖJ)„CÐÐ2«k¯= b`XД# ™c.ŽÌÀ:œÂ*fm´ÀõS1´ð0'$Ñ r¡Æ×/N:‘Ó"”cà0X/…€$Å L¤Ÿ!CÞo‘=cS(±¬‹rÀ¦G6ù†y™-ö‘qÒ%/lÁ9 ÊʸÌý!O”cŸYH> n¥_Þ`ɪÁ|¦¦HŒ QînœÁ*†¥ÐÚæÓ婞6ëRïR„‰éF‰ ™CÒ·Ü%x·0™20ÔëÅÐu¼½¹~ÿîÈFM`¦¼CC¨ºUÒ¶Œ, Ó²f^<þ/þ«ÿ ×p'ÇÝöÖ˜¸˜ŽöÛ;:% ™Ó›ï|,»¢¡Ì&³°Ÿc†:ø|‹¸r6EéHrñþÔ¤45¢¬8ª"Šá#¬PŠú`m%Íò%ÑÄ PR™ 9ÖÀjXð“`L'WÖ·Ü‚ÊåîönÃ=dó|ËB’J¢ås÷› ¿RŠ;1‚ºËÔµBKò9¼ÝèVźÀd›²³h„F"à±>¹÷3;,¡DV¨…¤Cd$ù˜-ä2ô¬ á¢úMJ·Ùf0 ñ³»4-Pá!>BK¨Ê¨˜)@i0 Úfºù|X•ŒÜ¥‘º.©ØˆšÓ,"ˆŒ'\Ä ‡B%²K ÑâýæáâòR®°y°›ëí1ÐçÜã$®ûÙbƇîmeùG1NÜܾ§îñùö©óœÌ@% ½~ælrÔ’þãŽôLâ—Æ©-!>Šb XœW Å'Á„h¶ë#´Ç¦J2¼ÒDv!Q¥ âMe"‚ùbÖ²4žØïD|ᥥË#6öͲ°—¡ã$ЉÈem!›ˆË•Y޲~Yw{%‹ñ©àH•î¬TÌüC¡T®,èé’ ÔàO/ÁoŸW³Ápó¸¶@Ú:Þl¼ ãí†Me†Í0Oý3¸Ö©Û¾"«­B2õòòò|}öýÓú×þ•]½xáÉ ¾¶uW|ìCôëó3ËpͦÏè+‰áI¸áqµÊ)DR=ßA6©­ÏÏÉáìüÜY®:)%5D¹ %c¼ôVh…aÔ:îc§ Ø¡ä8›ÔFSÏclwWW/\[Á#2˜N~þó_H’÷wt}}{çTä™<†#÷Ó-$ŒkfEÌu¤9]Ávë ”Ù7t"yvVÙ±IÏ…”õ(`WÁ°qÄŒ&“´T à¶æwÉÞ¨"°ú£Ö"u° Ö±Å(n­ßŽAQ•ŠÄâLÁú$Hk˜DwÆhqVæ/£•åÜ\ß„òZxÀ»V‹"Æ­½Xin6; ŠîjxË`‰ßó‹ó¶œÕúÌFþp"ž s´UÒ\N|T»8IsóUÀ ;¯at!£DsÈ#-3$CÊ”=8u—Ediª<;ŒÁ&‹âM–(öw2þ-È‹™‘¶ÎuWBÎiZ£`†]ÙÝ”æâH bG±Šú|£/Û f›55rbK„š…Þá‘D,¤b 9¸ëDS<¡¥ûº#/Fƒ;dPG2ÝŒÙPÊêˆ+¬d ÖÈ• t>(:ÄøÉ@¾"ϸ8?Ó«È&súbu!Øê8Ÿÿ&"½èNKÔ¨c]lL—2+Å—z— ‡j6YÙ©,#£9“?#C[‰â57P¯st‹¢"bÖ}•™‡xáñ‘y.|+™="@¿4KøZdþùh*ÒÓ’º“ŒF<îY‡´ k†€Muîp(BV¹ƒ#¿`÷i™t"‹g._]j1ŽL:µjꈄ”¨ôÛìÐQfæ40¸ævþ³¬ž0'x’9ÞQØãoÃhI¿"Α’²š¯Øb…>,C¢>"ʨm@‰•Š´H5Ô¼i†ß0Q´çÃ-æW©jòQù_b|B¸G÷;áN0Ô¼¬,£¶EÑr\õCe È ˜Éááèhûîn7—ü&o¿xË^½ühõê’}ëÛ Ý\«£6JšˆPïk‘›é ›cc¥þ°’ÎÀ§ïJ€èTÔç«HQDdá·¼"VˆDiu25.n‰@¢PwÑfê{¸áA›•Åcæë [DŒÍXœ³wÙ^Ù#]ÛV˜x›³Ìs†œ‰FQÎâÝ…'ù^ ŸEFhk"ÍqÕ˜»„¤éôãï~×-*aþ&ÊÕ<+R5‚CÌÐëŠvs'F™g6F™HƒMþs-ÀesÁ IR¤:·4ÉÝ*û„Då £Rv8b‘@ù­Ðá«À§FŽkè«®y´6̧Ÿ¾à IDATC’JÙÒ—žäkÙsàk ç–•+$/3š$øÊ YŸ]úÊ'bÚºð)îžý9¿ñº?Mì¦ë_¬ÈÌ~ºp>TžS'db?V¤#í²Š<Æ•ùËØ°'J”±dî#›º WHme%AJÜñ©y"Ò(K0[Çêó,XÉMàâ-ÔÒ6๔¹”5÷éBvBÎë4ஸ<ÈÂx÷ ¬Ä®Œp†®Ã–s¨:Ê„R½ÇKöñv±¬âãøÑ¦â Y,TŒ.Oï`c?19:_™×f`ðÌÞsJÚœždýœS°!ùSI¿É³sz ø`þ›ÝÃýë—¯~ó7¨9¹Ñ™g¸Lª*^d<Ûå¤_?À•ƒ2Xs…—çõ ¨œ ¸³¦ ­è”Eˆ©5&`ãÙÚ^‘%amÓ‰õ’'ä9×L¼µ˜-r¨–³3¯Å—,c$Æ Ï¬òÙx©{{±‡dëžPš˜Ogkû›·ß&_®}K0ëµgú²SŒ0É$шÑ.ƃ8ý’\âs%øð|4›3V²Êµ33„á¢vâ„bDbêâÒ44<¡!›AÂýñðâåbn2>“æäY&;öÍÙ|4ŸÇŸy…®eC¦¾N6:z6™¨OûÊ <£‹wï¯Å ³%…ZS§2ù}&‡zB#7·w²6;:es«Õ»oßjˆÈÛë›Õežû±6 ÀˆnæšÉkÒËéÝ­mK;ûã‡Z…yîëàY)ã­Oá=ÈDc1ÇzXȱgKÃÿæ9ôe¤ðàέœÉuÌ`6[yä".`[λû̺åþî»§Œ—H›‡i&¼ 6’Qœ(5Ó»'¾v™b¦Ò/g¶Ø€hìáÇ÷ï"ò™»<\’G` þÈÊSMAÜ×9¶)ê"©³¯”)G%-\I× *¼ˆ7:z<æ©î0ådüN¦žå ºFª *æ§MÒ¨röhÎÂO%p‚ÎQôØK5:2C;&ËJ¤%8Ÿ%„“WV§ÆæI3Þ+ûf;‰MI@<®AàšË#X${6H)$Ñ( 3gxN"5²ª •xñI§"ƒJúÉ(¡!#™bÍf}º¥›Êð¸ë “My/š$aâìP™Î mèr.ðîúÛpøÄÑL÷õèy„ð4IºP f î²ÔÄUv¶ „:EñÜ$*a¾[j"D*,kA¯C›t™˜/½Û¤E¤4K0j(Dƒ‹5ë½Eä$2@¦hPùF„F¥óh˜nÞ!W¤dè©Ãx€)NW·èÄwMšG¨{ 5™BFFý¿ûŸüÇǃ¨É#a—o^÷û?p^Ë8¸¹½‘Ñ¡U—,5ðj¬ ³–NÑÚF:€Õ4ç´šk.„J/vKˆˆÈµ™`Õzƒ‘•˜M&D S^gKˆ…V±d *½ƒW#>h[Œ-ËNÈN¨Z[žÚw·ð«ºRÍŸ²hd-Ã37IBaCAË+ ¿O5) 3øÕ׸üÀð®[YL<ävÉåfÉJ kô ¸?ÝD(ç@¹×P§áQæêèD³p—;h«eÍölš™>ªQº*G„y ¸zy^Ñ …Y@nîvx”§–‰éÄŸÑÍ®‚©L9öÎŒ9ái8X.œª$ˆ!æ±#…p45ÈÁz”ɧÁ®¦‘1;"±é|á)‰«+ÓÊGKRâZÙÆ¤dkO,Ÿ§%rú*›P¯?Ò(Ú‹‡’3U.=p¤>|Œ‘O `ùÈ^¢ËZÎÔãdÙrÔB0úÎVh¿vß9vʺ’ý»«UHM.+:¢'fÏ“ªÍ@Q *ò€Ã1§‰H2Oe6ÉóÊFwö»L‰P•ÉPDšMgO zÞÎ̼á°Ixb?Î9ÃÍèØ‰µ L4«/dÛ;Ba‡ûRÛ/xüµ_ÿ5¿3ò9Ã"ZBã¶üÑ;<„a˜ Q5ÑÇf›G%„ cÆI ä¤2ý©\D•µ¼¿¾FõŠ£!É Ððà¸fðYBBÍËY—u¦lîÐã̃¹ ‰›eÚ²½hL[YùŸüé?'àþð·p FùãWV2ùÎB#¥X6˜Ø’## b–öЈóì⌔{ÍCÒ²ÔÇ|j…2+ ¦arï‹q<€ HpM6<Dq!a§\.s2rV— pôKà’`>«¾œËšœ'çcØ\ C–KM]êþaË~pŠGDbX3Îʤ,B€º³Ò& {Œ‘š-° sŠ·²^4t´µ+•¢Ö~‘2yÒ)‹py3 |Z ý±Ž,ˆ¾¾R=æñZ˜3É'j>E2Ä¥±æ9S—g¾³€§ÊšPeŒò Ù^¶&X¦;I–bq+Ë`9]#‘œJÜùŠ#0Y›ÔqåFß2-Ä­îHÙ¬•jtÌ`Ø^ Ÿ—äe:–±ÞLXC+¿!œ<í±·ï¼2t‰]œ¨æêÔjÄר«dîA8ÌŒÁ VÁX¶››áºÊäÄk<Ø?2q  úÂKEW™"‘[N†F0ppw­wf!B:O1g5Se„Ñ]=ÃÛV„:q/.2Á/WM\:w¯¬‹pe1b³– €"l6%1‚NæDZZ¡¼¾4ÉX¨“Ѝõª5Œÿ£ÿðß%——¯Þ|÷»¿¶Z]r¶ÍýÝæñÞ‚ʈc(cv\Pl‚/ÛÁ˜þD:fļ٬‘„ËS…<\0@â,‡%¡‹š|–ÅWÙ¬±E•‡Ø“D Ñá­DÒŒH3äbF¸šç„aC ù“bxd\3*aŠ/y„s:¿ÛÜ'9ÉT +â™[q¶ÓÊ KÈ=yìˆè”îžp– ”¼æ/q KPY Áù7ië”M ³nz\-N„ä@‰¦üÙÈRŠðÀ`É¢9dõÒðÀhŒi2ñͲªm;}ø×&5¢Ï‚b¤Ô¹%²B³Oi´ÞÝÊS½‡½á+Ï¡oîP ¡»É±bU5A»~ ÄÛÐËš!ì°øµ 7/B”+ñTÚánˆ·½Ó¸­ðD4˜q˜Þⶉìõ'7er2œS¥ãGyb1›¤{ù¨õ¼ú‡Ɩ„c¼HIÞBŠQ4VrŒÔI6Ã@|/´Å~b äK„9b)­Œ.¦E€©¦G똠bAÇÕÄcS„hÛU¸G°y#ì­¼ÿ)ö†T‘ G^TÅ/‰Åæ9pÞ%›"l@”J7$«]Þb…#ëLb\d˜ADpñ…û<»†‡hÐq~uáˆD:ãg™ØÑÔµ­Ð9€gÐF^0ãýÔ˜ F‹Ý&æ(Œƒþ4Bæ.Qýçõ`g›[ à¶²òà$È©µœ´ˆ_ØÜ,Kï(̨o^hO¬.ˆÃ:‘Ó,¼ßçWD{¿×óæ)É ú/†Až„#12l$«pâÊžT³(Žx¿eNIoLé8\®—&¨F“(½Ö©¬—ˆ2øᬨ'œ9èüËϾôRªþð_ÊÙ´ÓÕrñÍW_9kœ……hf¬_–¯ÐH°˜ØÆ€IDLŸx@ÎÄ$x/[忢/Üaͬ뽤‘‡†DW fX“Èz½Ä%g£^í½ko—Ê>¦ùº€îmFŽ©xƒÉ0Ͻً ‰ÂÁ,#t²äÙÜÊÓçŸýòþöæü,‡AIÞëÌ«hÇ»t+O¢9Âh=2G…°"¨ðWEŽi&c@B*¬ä9OÓ Ïó’–Ïœuäñ%Iêר“Ofë2÷`)˳lµc3YlNºX&M–’籓åX €`œ-–Ê;È‘Ÿf×Tã!󙆃­WrDÇqδcáFz˱#¬¾4J£Vdеñ‚}ÎÆsÓcbä¬Ðh*ãË”¼DfCñR/Jô SÐ5Åßkì4šêŽõù4=°î/ð"+¶QÃS4»°x73x"mqQFëmFÄj&aÍ<ÕhiT“82"a˜æ3óN0¡¢ Q5cXº¿d‚"MŽ\6 FwMy³BhŸÎàdˆÄ1̲*f9H;‘z®¦p±‰CL¶x'ô$ Ï§ž5ƒ6ÃgøË’†¯m‘PÂE|>ôÀXާ/CŽX’̹qŒœX:íñ1/­„õæÝgwátÂT:HðöüƒKæD’àëkv—È 7øµX‚¡f{F$F(¹-.Á0²ŒXÏ\çˆ61㓜¦°¥ªoÔÆ+¼ö'1ƒXE%I±WmÉf·bT¥Ç<¼`ƒ€‚\R1Ÿ²8Fòéì4AÕŸZ±û”‰Ê(‚6&¤cCù„_Ê€)C;…¢'¢'‹Î˜¡ä FK„Ô»Òa!yÑ®<.Á.8#ñŒ–¾¬E--€¥¸Ë‹«»Û;GX²Éeú%+õ0ÔzåÀSŠy›X¤h’à”rãÝæI;œnrëÑ݉7‘Þ›ÍÚÉÄ“›Î$ñD±ýòð I gäÕcYQž¼Ï90sq$Z&ƒ/n¥§Ë˜e®Ìƒ $P)´ÙvVé|õÃf“YZ>1BF-@Ä`²¬CkÕI Ê]VWþÁ*›áåÕLSMMi¼˜Ô™¤½>éÈz»÷ÞÝÛýèÇß|ó&=04F¯µPŠ-¯”Ä<ƒmgW'¨J¥HrŸ5mî ’bæ4g&„ˆËT!RROzÊÑ̀Ħ˜Ll¯fqhO.ÂD#VÁiôHŒ°é%RòœÁý븒e`ÍŒMh3k·0øÅ_‚äPoÞ|”-ϳ›™…ÊI=ñGéN͹ÑVǘ²Z‰ ·Š°Ø_ÑfÖQ’ ·ßi¢R¶]²r €6=‘­Ì[ÂW!?‡,I5‰u=©Ó> dFq€±žÇÆSð%4Ʀv2¦f.DŒ^úà™ÇŒÆ,”Б2%ë¨9US]Ä•H˜àI[Bd$iNà[éÐÁ¾Êž3Êĺ²–f˜Ù•Hµš´ãkd¥Õ‡ õ†OÃvð׃фY„É3Æ¡¸‚'ë"@åZPôî–Úå@¿\pxi‡ô+31J¯ÔÁT¦—¬gBˆºè¥·2Hó•8Bƒ¯cˆi…F¯ Úð¯WÞθòµTYi‰yoR&dà¶\ÃMet†6hN>¡×°)T@¡»ðè jXEËŠvÀëñ¦¯•O%Äæu «Í«ŽËB ²u gæ’|€Ã11ÒT#“I«â·÷âZ(‰Ê¹hŸ”y]y¹P€Ð.THÛ!·Ž n«-ÎcËîf8(Þ+ßÖ»h¥V%yøä‹ækê¡Eƒ[ß`¬åÞ=P€“ XwWã“Ì ÖM‘v ƒšÖ>zøìKGî“<‚CRvLÒ»÷}`½==¶·€É‡•Qea³XAdš 5X¶ÝçÍ9ÐV‡¢üɦ P³$Zd;`ÚÚ ±òí._ ú$¶9Õa-$»×\”€‘m™PUŒ-'juëDŠ”;-e‰ô|máE²BV00V2Á¦þud|å=q€·ÑV8³…ä®M‰Êó²¢e!"”?î—‹œ0‹´ëÐC½`ÍÜ#‡Óµ3UsB5>pŽ&@÷%®q6éà¨÷ÈL5eò–‘DÊLÃzzMÔÄXMošH·4A­Èna€– Ü»`bh¤ÑœUhë/Æí¡Ò#à†Ç=Q(£,;’xÇ]1®Û÷ï¼K}aÕ…[ÝÜ?xo!ý´c/¯š {ŒçîáþÊ1Ao(ˆ¶Ò‘3ÏÞþå®îdT6/Þ}óµO¹ `¡³rrSN}Ö#§ËÍn3­×ýÛÍ!%ä¹0h‘Zï Ý &¦äš²?µÈ‹N¼@H±ÊW“ 9ÅG2Ño©Ë­JÓãò€Û¹IQÖ`VH7Mûœ¥}œeÞ™7±À/"Þ *‰5s+ZiK\F*Îei‚Å1ûÖ*˜+œDêUÔ­Ÿ‚È3ó„é"yÒÐñÙC ÕI8s²ò‰7xÉ-'ÃUóä0äm•5ÙU5%¨±ÜPV“0⫋̼˜¥Ë°úf!‰\à°ÁTÃbÒÖJm-e”üe›Xð"Öëû¯_¿ú’ÅüLÒh±ÊL¨ÔuE»$C0’ƒ×ª#wzl˜pTa6:íÙl­ ªëzŸðô-ú‚›Ìu‘W!Ô¿Q_2Òo´œBæàñ¦¾6hÚejÖ‘ g ¶¼C:"NÖ³Aé½hÐSPÖL¥ø¡BÉß󨹥쓟åó9áHÞ&O­Ø ¾ˆMd>^wÎNta ; •wFAKp×õÜ<ƒ”¯ìŒ²ù§Ãj-˜ö‰þø^1'ô’Iž“0)–‰ˆVæ`#7ÍÝ¥ÀÄÒi™2‚ÊgP™K8 X¯Ußdøæ.JT†ÒÖWª®+‚)˜¦5Lب$²6kÕWìÃX +Eí:.‰ZÁ]Mô…A LFâòn«Â”®3” A$x2kò|‚ÔQ_AÞ‘¶Ø÷U=$.åê"¿¯ ŒA]¯Ü4&h_´4 ›Óµ(`°P[ÖˆUbA†¶ /Á‘á¦qv¥ %0ñ޹²:¨È\§]N?÷ë.ç‹qý2’­œdùä µrx4—Þ ŠÏø™.ç5]y µì'y[RÊö›ò‚3ð²^ 9÷±“¬ó›.Ä}d-õ®QbÑI2•ÊPµÅ><`ÉÕž"ñ•mº:š†’Ë/Ñ òB#™vÉå`æ˜×72fwÉSòù×/Xõ`MÚ&àÔ³uÒÇ–s¸h˲n]÷¯OÜ¡˜2œ4Ëï:´ñ5J¡w{)13Ÿ<¢åuM»%d–ÅHs½{Ë!éf0/ªy’÷Q‚6vD;ã„ù·by!œ>3犿œB_²Ä õĨÞ ´<wÞ—¢¡UÔ‚°‹]!’új ÀgÒ;­p¡ $´Ô—×Ìvv[ù œhÀ®£²Œseü6kZŽ§è«Œª: µ5¢CÙÄUs4nñB•¥ÙŒèî8~G«y˨;ÀÖã¨Ì#ŒÆ§‹3xwõhËZ züÈøû©Á^ÙÕLéÅ¥IßXv *}j´uiª|ºªÚTÖù*#HzH_#~”:N×HªwX¨éY¡…O½Ox¸6áAŽqò«îNÒ†44÷^M$Üq/>ÒTPv5…EWÒ5 zq¯“?xBªc·Ô(BÒ͵"ðÄÓìíÆ—í»d’à yŽ*ÄÍCeS ¬ HC#¨˜@Føëõå΃Å6âêEߺ9ˆ^B¶–ES«“6€&êúì»Êj­Qœ‘g^çÍ'Å܈‘”zvyÔF_õK‘žVqÌòše,¢ mYFÒ)¤÷„O³FÁˆ•€Tƒ åÜ­Ð*K‹?“‹/Š%s¡¤ L¢‰Ó×6)thâ‚P™Ý ¼¯zQ“ÄöYj\n56Ÿ‰¿ÜµÖˆ1Ûζ;pPKÜÆo0eù½~îyœDÌÐüŒäÔ×`°^å‡ÿtG6L)Ée¥üe`â¯#DްÄîSop(Jp‘.ÊK•¹JÇtÐMöhG¢b¦uWAÑ6“‰ìIG¯z fV‚W^i‹*¦?‰°ÉÁlܵ&‘U]×´»Ò1Èøž3QŸt!;xËB³Œ€£„]d0DÖÈD!h€?R<¡5&Zu1Ãáäß‹Yë˜5Û&^¶ú+™Èt ÃZu¤/³ ~ªóÛ_‹÷x¨Ž–|UÏ’ø’bÞ;zò50(àR¾­ŸRp±á:Ää-7¤$ö…kì¨#g¢¸¹Û¬›rê|·÷¼âݵî‹ÊV/¡eÁi8v²ž~ý`Η_~}qþr/´¦Ïà4ZXÒ×pbV ³ އ¬ ÓˆUÔ3!Ñ*N¢’–-b± =Ö˜´A¶ZDVj (5|ˆxŽ›?TžÎ3+¹lçõ?å¼=›“¶ÍQvLªá‡“>ûò3i–ÃàY­ÍÓ‘‰@6]³]F–£†ù³WG¬”IÏÐKnõSЧA±uj*LE€5qRÓ†J†ìQð™K:Œ<ŽWõ °“3Eµ¬¯—,m%ýÉjà ye:u'%±«0+à ¿¶ÈÖ¯†!>®ŸÍ„dkŒ×BµGŒ²JLA`¡—$/.òäxÒÍÄþœƒ!,¤%»ÊîJíŒ6‘šÐÈX¬ƒ¢ÝõÕ4¶~Šr´8¸[YÛËði‡wP„®ÁCKo$åk+<Û`:Ÿä’øŒñßÅiA¬M _ôZ'Ì‘0جAÕØš€";”CíËÅÅäì³¼àYø™~œ,ðCÛn.DêÅå+<8 Q¿2&ªÔ…š&¬?Ëh; ´u¡Ms·š—:¼ê½\¿Œ—èqÇYJÌÀC¥’NµG×À¦».ðL×(4›ÏrÎvÛj F¤«;’BôdÆÝ¨¯Xoñ¹žÀKÔU¡.ìk ¹›÷gؘêô{ty:ÁÖ†uÍì"«+ “‰,?:m„Á%ØÂ¬„^b·Õ:{æàÊU¢DA[¢ˆ IDATe ý!(hâðJÜJÿøý}w#N#ŽôˆWǰȳ­—ŒÉ¥ã5’I¾$[iAK!µÖŸ»né q¾úd:ÅTâ¬z—®ë @¬D¸Ôƒ/ñ%ѨÐ<(GÜ%߆Dz-SûlH…lÔ‡ÐÖŒøòëx‚00ÇÝÐáD9ü˜'È€¹òŒ,—¨aÒ¦[­´ëu˜u5NÈ5÷é²÷_“sP@­¸•»s?[sÚRÅd¶H eÎ$¹ž Ñ"â‘sI_é!x•>U¤/ÐúÍÆ#Rû>,F§®ò‚ŒQ+¾óÎâHX_"Z3›°eFã®ãñ\2qÙY^uæLÿèÍ© ­ló@O„y´:–Åë ;.à+Ku?K$ò÷JwtÁw`#\Ž~ʤ”XmO‡”ç¨òÚE²0’Ý _Ó‘”´3ý‚„G©Å¨w¬*«DCÈ~žËf•¦ä U !`$›yb*PéB¥KMñž2<.·\2‰d“u ׎ϖ7_]£áç?ûË_üÕÏ1’½- /|ÕamÏ"a3kò9«>’á•·g`ŒÞ½»öl¾#àtÌÐæ`•zä1 ÞxÄvÚA›4Þƒ¸bq˜F?Îý‚u_šl,’3ÆY5Éa…H ƒ¨ÒSšø„ÁEbcÅm;oƒ·­žôÜ•æ±2NSýãM¬6Ï-æ°­œˆ«KÚçw~æ o’C¼·DþõèŸýÅ_üüg?óÆd«YºìÍæùÅèÓƒfãÄn½$¤:o©fFI˜ê³¨=eÉøs@R5z ôé£+ÁÈ™|“òᇢsfÏëÊ ‚RsÖÀC-ø£ÄP[¦”ø® §²=ØïöÃwøïînñeýó/?3 #«bðÎ yç°rð“à¶zž¬èP^YB¡X3Ïp`¨Ö†D#±Rˆ '4#MN]@ë/‚Z…²Äºæ×W\øšè£ëù0«ö² •1ýÚja®<‚QÉ ™ i38r”S›"j)7s-9Tô$Þ×óó,Öæ#.°PÜqœD'`m*|.ꦀLOâ´>S(C 55^Ô2·ä2d¥QÖæ÷„„»/€ÉL·–^²XxŠ9n¥Ó,n1ctÆú"œª!)g~Û 2tάžÊD…î$Ì/@áJ¡è7rÀ¬’¡GN^LSŽ·ô¢I ^¡/w]Ê>¢Å²_»Š¶ämJ×àEv÷‡éšA ãã>˜D×ÀZb!Ú UzQ@R‰+¯zvÚ–ƒ-uƒ ´Û*ÊuÔ0ìB¡"F%u·©jÝRÐÝI¥3ŽëÕÔ®˜D´».ß"·-OÞ¨’ó‘ˆç2©·!àÁóZÝ×fh }ûU ô³ ŸÎªSAÔ·N2¼Âß× ‡JtÕI]j>PËTÔkârþHÓ¦J==YKó®f-ÃxÀk¶ úJÿb²$Œçñ.t@¿ôŽÚ1À|뇜|×"´æ+³RWäøÁ€Êaà Þ]ŸE«:vÙÊ‹ŽÝjáú‰&S(£ou Ù9c¶±6µE0—ƒ9û_¨iïu®×±Ù ¦úö¤5Š*J"GzÍ@ÛXÑ O­¦ç½ %8Š1 8ŒÔ.A ¡­$´(#˜-%S‹T2Ú׈¸-3{7`ˆÚP=®¹ÐÆ”š yªñ¾¢"¥—z©áÛ°s·44AD·*¿ô™Ÿ|8ëß™2ž$3S-AÍ|PìKŠnãiDá•­!mè Þ(¿Ž3…Á¦R†^yÖdŒ’m„‡ÇÂéÇç—%·rÈÒ»”Ô³H~Ä-‰)±® ŸT ÞÊN“¡Ò2nSWÓ\BKΗ®Œk dˆŒÀd4 Bmi_Sew]ä© 9rÓÔª)aÆ‘R ËKB‘KóüE ùa0³þd„a´©»U7ÔÖEÝØÒÔ»›o.´JVíõHûW/_ýò—ùg?ýËïÿû¿õ½OµByÂÍp¥šz9H¯14ñ°¹‹ÓˆûüXµ_/òú¥š]¬/ïà‹IœÂËÇ™v^›UÙ¿!œ:P/î×H °9”·åkP‹’CaÄ-l;`.eŠTÑ$­êB0€GBø /Ã@0“(s"¯¨ äÖOœo +“£¬ìsö=Wx|²…$!âÅœÉWøX5ðÓ#éÚª§Z—ú𾙞H+ƒGIó©§Ó5ü>[qMaK¶–€…b:+ÓkŒ@ Ħ†´g!jN•Êãô÷ÿk]'Eˆü <9%DâTžIÎX~ O¦,Æe±Ç¥´*d––ñ;?‹K½Pf~Ì5€EU¾F¸Ù”JŒÂZ:‹GæcÃFݰ¦$¶!„Ÿ·44¢8Ý¢|êËc¥‘Rï)œü ž¤u¡G¬Þº Yõ—ÓšNÑú!?œžw Dl#¶˜œC‹dÍåòþ Cÿ?Âiš ü™Žd„fŽ j.,äY‚úµ3¢F#9+àTЪü0\6ôXq$;tñÛwß²-÷=à ˆxM‰=-Jm…A*°¬AŃN5Ý;Bwj¸¥‡ô¾L›¸ñÙ8±Œ Ø´ïBPMÍc$®Zȼ„•Ò#Õ¹ÍÎ`À—!ú ˜A«ˆô•ôº˜±? '&¹tË a’Hª9.RUbZÈxKì+~5!ã™ÈÎ8cr mpp+8k¨®(C€±ƒBr†A§È×:| m6ubá‡*ðÑq*OeÙïSÏe0‚6ð(QSÄ×Q×3ðïÞ½—ƒY8ôR€Ÿüé?ÿöÛ¿þ{ÿÚÇŸ|’—"Ë,k{OrD{/èZjlwÈü>G‡Xøq½\½{ûöò₎ööy÷;ÄK-~)ñxá3å,O¶Ãƒ`$½âKGÓ£ìtÓ#º#ªZñ.?¢ñƒùYŸ+פě±EE¯ FÌ ­Œ–/Ô>LdUÈ “‘sõžŒÙƒ…„´K«y+D^BA‰I¢¦B!sÂF=ÖgöÒÄš|~öçþË¿úÅÇŸ~*7éY’v=mJucv„lëø# Ò¡åP[4e—Sz"U^àž¬PU#½PÈ~ÐŒND¯›?2Ù#ú%¯òÑ$ù•/ӲФ @òô—`š¤÷8«Îàøáε§JÙÛj<èDpï¯ï¼'É£GzÔè‚õr+dœéQO!*ã«í™RºG¤º¥•½E&_zŠ}UÝY;×DF6ä’^äp¦7Îè/óf„¥åh¯n‡äÈ€I׋ÁPfñ0t*#½L€õ+·ªÖÙÜ<žçX«óûÞ€A°½?êÉ›;öyÿb4ŒH¢*Óò©’äôˆ 4D UÆ£».ð.ZUSÂúámfõV[5FST¦µr·%ö$I`ÖµHKûúÂB}¦’ÔHYï®nëT¨Å×êkì×bàr9³ksÃ*‰D#9S¨.#Ír.O«î ïˆ)UZÕÈh¥¬wÚSPƒ6e5¾ºëÚ&àdµÍÍÒà.êNR‚¨¿zKÓŒ—R¢® B@¶ÏvX{BV’*­4a`>5á™Zu¶Œ[6ÀNüî3Œ=ðl .ü¬™¨ÍJ/¾¦Ç¢¤¹pKs•‚FcWzðáÎðy{âÒ#xÙ·E¹Þ59dÄïq½èî4´ù±ãÌIƒ”T¬~N‡r3E»zß^6òÈ*CH‡xÚw|µ–LnØ®a:ƒoÄ’‰–±XÓ„V½ Fr_ÑÙ…ZEŽÐìÚ³3@àœ” ¹2àˆÞ%~d51¶F“ñþáéÜC}Êb ç¦$Ì‘ÌlâwXAuë°D½¹N² wŸeÊtc§#Ï9 4ºÐ1Ì #x;†‚Õn~+ñì|¥Lè°Ù¨dçõØ3Š+¸äA¤ÌäÐaE½b™¡v?rDÇÛ›r>:ï‚- y^׫G_|ñE˜9ðY{.H†ÉÃÞ†A 0 s„Œq›çäm¨`…ÊE½å,Ñ „à‚JOy± M¦’ÕÈœŽ2†%×v’.vWËf†.$7d~«ÒxÃÎ:5.+¢~ЉôeËM\B8ɲuÔ ¼*‹áD4ñó’0¦ƒ¤¿-RBƒBâåOºÏéaÇ|c†X-¥IäIìI†ê²eƒ ›9šž ð‚*eöŒäÊ…²ÊX^­œ=lxŸ¾hNè@¢±‚.aŽmÑSd—7Ç$i Wyµ=Ì&J8‹c:R*±ËIˆç³MÖüŠf‘Ûê‹oík’œ¥^{­K°†P§åÿì+ŠYìÝxVñ¨’D;)Hƒy-žñÍÃm"¼#3â¨wºXŸè¯Þóóp/ÛæÌ€ÕyÚëÂqEoؤÈ~™&lÅ©òòaÙ+Ä„uìºË"üÒ¯gkAÛ‡›ùØÛü ö×ï¯o—ëËÿÝ›²îonü" ÅžQ„-4ðl¸²¨À*Œ1‰·HÇæô‹/¿ôÓ.o>zm¶À8%$촲ݕ*Q®!_[z-{ŒáD‘'V–gg^íí}ª¿£ /\†_/Yeäõô2fˆdØY• O úC׈ â yC—EGVˇ’~fˆ`•™}EÚIAøÛËÍ0½›»l)ÁÎ:Fpä¼­“ÅyÓ‚/®^ÖÏ1å]œJ¿›D¿’ÎÙ|õ‹_~ö“?ùãßùßùÎ'ŸÞå‡uØO– ž)XëQ >S¨u¼ü†ޤu˜)^TçëéŽ1UˆLCw¦@|JP¢Dy÷0Ut\‚0V‘/þÅ÷ü$¢5\æóYÐåYN“`8ÆùZ¬:ÄÚ Ðòí>&æõƒ–d”Žíì½¹m9óºˆ ËYžÄn²œ:Ì ЈÈO”0Ññ_á.{ ¬,£’°Æz9BFÇd°FÁ*[R‚«?JgHQvôžË­x{ί1Z"5ßÁ´“:‚‰þ¹|~(‰»yE…µ+F® E`3(1P»/:—MÊ’€Ù°Bmƒæ’¼Œ-V¼Ñ¹woЧkö v!ÄÔ0‰€¥a³yGR"j†¡ÇžéNU“#zÔP¨«IõÀê×µ ~uW`@}õêTŸ‰ÕõHT©E`|:ñoû`4$_¶wùâŠHÉQ`g<à]X"+ðÖÛŒ(a'óŒq0wwÊ(ô ¹JDã¹¢=GÌ/?f±/yà©hk®kB ¿jhhã©EÓ´+AÀ³å$k%'ÌÉÎ:qáíÓ“8”Oj(€ˆTx ÙÔ™¬Ï.5$|ÍWì°O/ 1:+щŽÐÂZŽ^ Œ9zd¯@t-vBçe’Ç6ÓN©56&>3&ØëRÖ«G*ÿãøX6_çI(X™k~І[ão¥y•)· ŠJ}4ÅJl¬>4c„e˜3›WR…2ŽÌ LÚµ•Øá—…¨éÕòaƒ+ÃÒJ¡ÚõY“”™@. Ùµáè=’X4ŸÕ<Ù1bÂE¥“Ö£‘]к¬­!=æAŒÛR×·zR¢}ÐV¶^DņdQ'ÕÉ|õG1d‡¶3hÌ¢ìI”u»gQVÁìG_\H‚9m++Ú³Xâ«îÈGߦ˚‹ø ^½í?à[ξ*ÇÀ «/$àk´Xj. ¹Gó«ñD#¬S£Ä)jõwóë ÊZ„Ñ4±Y^¨HÑU«|t jI‹¯n8ƒ—,Š/úr8xlL)/J0hÈâ9Fæ’§Rh¨€¥8C;¾³Ez0/7?7ÍT£jÀ§I%èW¶u…5Á–ⲓÉ:=¾ñcZ)²ƒÕyQ‚wR7ËÞ~î*ig:’€â]qùÝÝh¹]ÀVï<è÷ïýŠÉµæ}ç»~Õ˜7yn0Gñ*G+EEHɲöžé €’OÖœ—ÔÇ­ÁžÍº2ѯw i#jôš+¾³>d•(G¸bxuLÄihÊÏ›ôýˆ—äkí3¤‹Î,€*­sx!„3ä˺n™ žä@6JÈšý”pc$„8bœÃx¾ò‚."™—z±„-ÖSx¢§h½PYÍ&* ‘Êæ-pcÁöå—_üŸÿÇÿþïýûÿi†…ïçD$CõªRá ®È±G¤újœð/Ö#»Üô´×@I;&—Ézü† ÄIÓcjD^O =xK+¡z[YwAÃèÏH8m0) ¸ÃEáÓyàcåR.Où1Á<åš!ŽbüIÓBIvmò[ ‘õâ_e){Kp’Dg˜Œy;B~f§.w¡wò{¬hÀbHÖPÉ…Õ÷£$úÍÝŒ…èÄÕ„âJò2XƒzžqI/—b*íwÜÇàaÅaö (#²Ê„­Ip?=ª$·;oÜßnd˜º½~/sViyyC|R“¼a³ŒM5Ê„xo¥r7«ƒLL'’7ÆT?ØiÏ.óÌIhà8pèk®Ä20‡{–~ÐÉz9•ù±Wµ1‰Ýàg¿ø…Õ˜O>ùÁfëý$¿—>|ýõ׳ҿÃk H•43ÀLÌ*˜îp‡¼3¿!蘆L=q`˜îe‡ù ãéã}~ѯAV ‘X~–Ô{P§ÞŒÚÊ kY N|£/:×P|+ZPÆ‚+îûÍ›7~þùç¿uõX=*ŸeT•÷O&­Uw 3gWŽÖ«¹èÈ]_#äÏžgnÄ«Ò-·4lÂtM‰ZStO9°5¹µ[ ¯C‰Õ³ô¢¡ÑL¼7Y]{E¡©*lÆ<é7yp™=‘&£%€w±ÐSè= –QŸý@ÒѲO»-2˜ÙôÒ‰ÛÛäâ~ÇO°Â=´Ý|…r|3ÛšõS¨O§,]èš*ä¦Ce^TV?À—5[ë6Æþ{qyŒ¦Ä0Z Üb‰ NÇNÂÏžò¨)fU¹ÓgXV|~¸~Ý…Zö"¦E~h¥m°«o‰;Êð‹°…‚!]—ÉÖ$- º^ÆY×É1»­Õ\Cða*£Ob‘‹4ÂvÙ’0Ωq—` ‰NóóDʲè‹6$8—­%Šýf¢G²3Ø ZgF÷<;Vs¯ ²gxŠáU[Å:ânIFk—&¹Zq§IEpØOr—%ØÐ¦ ”hl]Ó’Q¯•K¥¶\AU± ^|ÅnÉ&d$€“Y”ñw§¬›Ý ÓUà50@¨yD—¡$\ðYdWëD!ôÃé4%$_}Q@Hân”¡OWu_oÊé‰ÕSLN£ßJ:N$µ^¤2`z4¤±dÚ–$ hÊ]_•|ìòJæ™r˶O¸s}&MÌl„4T‰°n®ìÒ–0ð—Êj¨8ªQªŽ4A'`º…*‡ƒ¸6£ñûßü“N¬$DQ^öÅUŒ8¤'?6°&=jäÖ<¤?å3ðùÊjuYTEål@¯.š'E„*ûÄv ¤áF#ð*5Q Dx…Ýõ5ÂmVÀÅp†:>@…bèQ‘¶„Ä`Ïë[â8Bž†¤‚ -5¨áü‘oËsG6DÖú.C …R0à›*&±@Rioº—$7Ï|”³,t˜ˆÂÐF%v¡®ºV΄fü«×]ªJšø´z^5 U†pÄŽ xï,ždZ\4IÛO„¹2 Öª‰¯–1B@Ǫ•m"Pec&& €‚O±fžåç2\¥D¼Ú L–¸ä»Œ’@Ëbz䘯k Ø[mT»‡{bN‚PŒ4n[&¡É©ëêð$%ôX°¢‹5—óžïÀ(©q›b«Ò9Ù#ÅóÒ¸t3åø¬"7»Ð…Z3e¶Ége9êI M…3‡ÓÑ,3`c›þd–™9ÅÚýzƹÅçó³K©“W§Æ5X>³äPBN†db‹™ÑbÖº#Úñvs:]‹KY\øÕ«×„€#Jìô×,9­Ah1Õ4˜»™Î{¶ß µõ¹½¿ùéOþÅç?ÿ™×¶˜ÐúÁGÛâ"ImLDòÙ˹Ÿ¤#Û,9™ Þ èÑVÛyea:ÁHØu¾F}Û’N‘Ûú¥ð.ûŒjË­NæZgרƒ¯8•ÿþ Ùv©ñ0ÖÜr!7RÖÂíTY÷ùòÿþ«¿÷7®^¼Ž]yST*ŠÍ»´í¯…$§sky:[ã~}ò˜=µ™Y!å·\à‰ÇWT•з#7ý"–›è1 éÍêu„ñ²G¯¿HìÖ]­‚¯a Ñ/öÃN2 „å,ÅlÉ9‹<Ô‚U@È(™%h0ñìùŠùùýoqγ–våTwœ1ϵq¢„¯ôqëW oï|eœÒe?,ƒ¬@—37·ï}V_9вòµ<‹U"!|•vßzpÄNÄ⎕)ÔÐv4Ú˜¥dÅÈS- áÅ‚JTò— yO–fëèMt“=‹ e}vV‚_Îa«È!E百Â>0ØÔSMmK Ðž|6Ëý¸ËÊnX¨ñÏ]Ô„¶3`•xÑïJ$Nl>ÅX5Ùý¬p¤95¹e‰°ÔhP/áO ÂfãÉãlûßì(rH¦ÚVw¦êÈ•5oÂj=÷‘ÌTóæ€Bø+–ô¢ ÆÑ‰ÎNƒaü.”C’Á¯LÕ‰§öšH4u‘YÄ–÷ŽT%DdWÿÑt¢>Hª‹$_¨Z¨‚ž,ÁX‘D¤d^ÒY£xnËA’®?è^¹­-@óNþ 3´¡%ðIÎòF;¼9²`ҤЪ‡ª÷òJMQš¶ÄÍ¥=e%  úÂľÉó¡+šÉQ·\¿ÐÉ Ùå°òךä•`ug´«`ëwîdÿ~_2‘!޶­5€Õ3³zr°ænaßÓÀüÜNS}eÂQ"®4‰ó¨iÞ)JŒðû‰.ùýíÝõ_}FVö§úÇÿ÷?{qu鬀_3”r•ùíîüŒÃƒ;ƒ§_üâ—Àˆå^‘`Ä—CØo'L'jJ‡'oèÉ ýe0•¼/(á»êÉ6´=û¾ùÈŸd w·Ò¶[ ¢C/`¨ONö¤njNmcÉQA™zÌý—Ÿöíg¿ø7ÿ­û:Êñt Ö†>,-Ôz'Á&ÈøÄ]—[/èäû> ejí¡ƒ­MXÑRâňÙA‹åR¨8ºˆxÓVÈ1Ü€S%úÁ?ëB⛋~5!óa)5«—Yö"õ’„apiîb¢š¢fª![T2l4èÌ £>ÌzÄ‹NuÁ`|uIà@ŸŸ³2<¢Wú扇¬:NÔÆM ‹»8@Eì°m¢‡cR%C‹šÐC0”—€¤I~5üåÞÅ*o6¬¿•5³E¯t4w%4¤¶Äâ¢Í ¬__¦ Œ»îý†·Ø©Hð'€fbñÈ)ÓÊ¢K³x­…¦åJÞ—3Cˆ$µTÆ|‰gD¸ ‹® ðÊMÚ@¶²4L…`@ô>ÝÅ‘ú"Õ© žœ€Z²‹ZÊa$_MÄf˜MTœw”…ä1B0Ÿe™YˆÒQckâ©’S€tõ@X™fȹ)Ô 6WõUªI¬ ˜`Ë¥Æg5Œˆuên‡ex|  Ò'6ÙR¸ˆ%'POÊ j@ê ÑP)è¥ës+•9”³¯$z.äÝ\HÉg Ö4x7+äz;ǦNc–Å‘@Öy;?F8Z5©èôML—Öznÿ•ŠPº”]†jú9Êõa£¹`5aÎ mæÆè ¥I銌¹„,.HäÄP`;ÝNª«ö®ÚûÝç¿ÿëyÚ³ÞZ{®¹Æç9æaÍ5ŸTÅì@m­pRÊqKE Žsó÷~ﯙÎ#T ²L²ìÎä’5¾å,æH*%J™®(0];$+Ys$÷î&^ÆÆ.Å»‰ 5*0*Q娏ÎךNZ~5žá¸ä¼áÅV5²4 <°á<ÒòC‹±ÂCÌíc¨h;E]Ú*lŠ}÷”«iðªèWp9h!Æ ÜPMâyÕ|ÑÃ…p™¿Œ¹µ× Ç,…ôü¤>?Àjþ³—–Tzkó¢äŽií+i-ZLÜÇá"ǹ 2,óæˆà‡Í·Ÿz .ªÒ,•tžfÁ0stŸ™£ö:79 ï€!Aj6¹Ÿ[¡•EîVRc´$ 7½“o_ûeë<¦­šÃX¯jì5Æó™sÎ" ¡5a¡ŽTÊ#/d›'¬l!a®KóµHÉ3`Ž; è”ÿ?yòX²s÷‡?úÁoþ{¿yÿáåw¾ø.„ýjï(ÙVÈgO¿ÆþKÎ ahLÒOÛwüôé×Ô.˜ÍX43ôȧÏI>ØwÏ †;ˆ¡Þ6ºáúàŸ–p«‡çK±=NE»Ä°ª–=®¤Ã, ÕÕä‹D†J!×>yòþÑÿþæÅ׿ö—~ìçï”P/Ó‡iß2g7[º¨Œ?4» “«¨Pa,»˜Äö¡Ž`އg!‚ ª·ü:[nåU„=Ó‰ê€yŒx•3Ä„ À/]1Π”Ðs;¦ê´R­¥ã* Ž·6*Ɔå±Ó܃¿qæ©RÄÞ¯ýü³Ïñôâ›çp>|xiMŒå¬ÑUmy”ú¬—OÄYœb(Ö2ÐÑy>K n)‡Ëcf\1ýÑ%-l »f¶0M¸È6g[ÌwÐ}pN3>ăɒ[žKJ3~l` f¾Tì%Q[æ=J×5™VËgVó,ËTZ$¼Áϲ6©Ë}<~Ïô™÷§µR,SµBFô¥6f¢š±×¼çÌp.TPNAà… äæßøíÑôÈÉÓ†´ðëŠn9ŒÐm/ag ®„[µzTsæ4b ŠZze1šçø·ŸÚL#ãKÚB“8bÎTœö–è~!D¥qˆÛãí ä1'lì¼l«²z$q†-Gk‚§’Û–V¥ ¼ë>•¬]{UÚàO…ÓºEf˜"©vNlIÛ­å7\äD47h}殮îÜÉŸ §`²"mLÇ[”C‚›!½ÕǦӎèv‡ËE€úbn©–·Þi8m·¦‹–[•ÈXE³U`UŒ×Ïy#0„4Ø´ cX ÞþF9+)XDG†[\áœ,%êƶ¡š×ð|œ \4’x;Ršß»nϨ–—ìä¾ùwþößXÖc6hg_ 'ù½úã¸Ó¶³AJHOÉ ~õEGnñ‡³lV««aëÃ8ÙV1žËƒÇE\©n8¶Ç¹#„êæmšaS Àš¤ŒÍC]æµ®RúF„h°¡¼TÀó{®öQO ŒCÌ0N®Ù ¯©¯­#½|"C’h5°l ã'yöìM1æ3¶²åST+7êŠmodQ¡Ña!;Qêè ³™Ê3˜Å‹~¦¨÷Eü¦7eÁ,BÚxÀ«ä©»±²®+fd³0®nSÉÞ­„`^Š,+êŒëgåú‰åf Oj¡Œr&®eMåveÀÚÞçö˜éy_BÚBÇøâ*í“ ëãÖ£ºªT)Û´žCÒ>…ß#ÊG|"kA¿ˆ1Ák@£Ûft`èVüċ䀯PwŽŠZì¤Sœø\Û™xxôgÄQB‹Ž:fÊ0#7Rï¹H·’Û ƒÛ×í×LÕù°ý=â0kEÞ6i¼qÝgó†& û°ÙJIs‹—mÿîÞø¢bz§é-ùxuÐL}Æ'Z44@¹‡lìñ{«ŒBmã¥uKžÒµ]^<÷è]0ÒËbF]!ýT$éꊗ±‰ú*»»;5Êà:FVåf0áV±êûh•<øÐ~ì6RôÍüà=Ò™)œfÐJ²ŒÀþác?OÞ圗ÈGf!À¨bĆ ä:=Í(Éss=F›Ô |5ÓªìÇ"@î›ß ¶¸]Í«…ºnøèºÚ"š–°Ÿ×^§äÖ-Cˆµ7ü”áKáT‹2Ú€¿˜è§.úmÞ’(YÞVRäÐj¼ÞT˜A#Ç#ÈÂÉÅ,Ô„%Ê4§eñiêÝÉŒ"NÑÐèЄÉ{Þzè‘ôê·²£÷ƒùIßc÷›}'š{Ü´œ Š]k–ÍLñüzR°ËåÃ-»yiVʱäiºoԫа|Ͳŀ†€é„éDìð’¡ ’ÅŽ‚&Y23)Rªeèc{–1 ·á…Ž_¼ÑçâÆ ^9XйLµ¯4Tv¢Fiºü9TÈ=x8‡òuæä…6BFÌó¤Î‡œÙ‚Ð*œ3ê5°é?PWÐ8ÏR3 W‚ytHµ©ñ%r]^>€Š ­·±‹\q+iaƒm0`º…_Y›|ÿò™_HüúÙóÇOž`J¡¾–yQU]‚|‹îYÏÊÉåò¬®3§jÉ1XgÈ)ÿ†—nUÔ,½,Û=ÇÇj6 Á(© ·›F·Vƒ_!é€qÞë‘H:–¡ÿ‹ùH{Ï ÒgzÎÞ«‚TbxÍU©‡D^öáÄLjüJuNBü´;">¯_·%ëÑgOSÆÆ;gˆèöåæh-…Ï ,s 'Ÿã–sج©UœÌÛ²hèh(´H´ÕvöN; ŒðÓÞŠq`ë0 ÇY*Žä#œÃ–W\·&÷°[DÌŽ:I²Ýœà=ºw¿Ùˆþ ZÊlÞ4ñsZ®6R<@:,WHl›vDñ¯Dš€ZëfqWÔYÄŸ•LΠ­&‰É­å*“qË&Zc²&ÀZ=t $ Ú£—+…³ˆÂÇpÅpŒ„"ä|'T7C4=ÄÑV^›„×q!UÓòzÑð_ÈY#bݵ»bRæ`©§–å:¡,ÙIê¨Èй˜ÍfýÂ@–+R¾ •a0µ—ðÔ—1e$ÕåÁ{J£+òöÈAQã]ånÕ’”àß0B]Iù°¤ÊFŒfª0zŸz}lE­Ý_Ÿ‹…DLP‘öðgöÒ:D†&|ÒÃG•‹K^ú€$‰EÙDƒãØzäo°!aÄÉ‹”>%ž°@{g8‘ä­V(Þ7fÖÃ8rIõVXˆl±}L–ì9W¿0«üæþŸþ'ér:<–ó½d7‘Áú¨µq™Óã¹)ö±6V”<-ª+Ï÷ô)ú€4Òê1†ŽO3`f±c³äéj°EïÆ"ïRMmäÓCðc03$aT™ЈVOÅ:ÆÒûRí˜@ÃrG×uï>Y”gŒؼ¼îµn•y¶_o÷eV›m&zy=óö¸äRqTRp¢8C­&xOÖN uWÕûõjRÚ¶„O=’Þˆ8 d}‚gÄe‘fºC£t=…v†zQñ–‡Pi™YÁ2~spS.¬õ/²{“]} ÊØÂ³ÐO'ÚœðhL”Ñ*–˜9ûÍ\ð>‚‘ÅÈFZ0”iœa•bš.wÒ¯š€"\\n¹‹j..ÞõýMví‰,`„ƒÒ'>ªŸŸ×(îš¼á;…6ò˦ӓÑVcC0:7 ñ–Wu03C"lc²Ô¢k¬²cÐ"&ãÈd8#b¢vbJWó}tkõÁXŠHø-À™p[_Q’wÅQž„®¸½&!JHà†cµö_Rc]µ“æ*´ZÌkž“MÌùáüC6lÀÜ’¤4!GÒªùY;$F¯K¨F‘¶9>ÓV•×:!†V"1 \ÎU¢¾þí³§O\xßÌÆºs“cÇ´u€SÛR®õtZF¨ßô¦Õoàô»MUÖ§Ös¦[x|)ĹóV_,û™'˜\ZIJz H‹ûºã¼˜²;ÿŸ¿sãŽúÜöᥠÔÛãÛOÿå¿xþÕÏ..?ùì{wî8ëÕ9eN{å‘§ôç¸/j«sŽ~Ž ggÃ¥<ÁOlOÏ~Šuã Å:0Õ vÅÇAî?¹VÎ?æ+ʬÕâW7Ò…KÜg´Aü<7T$‰J{Ú ¹¸Þ|ÝBb<_]½4mÂê¾³@U-Ë{JrÔÙ?‹º¼–à¯ÁL÷é¿!Káר×mt˲ê‚ET“='˜ñtÿÖH¹¬D¶½Ý/Bz6]uƒ¶âAa„õ1©–bRËÄ¢¥ G+ñ†¼ãþ¦ Øš/©0ÃFKü -†éU!;ý¥W 0]L¿HLR„¸ÏëúÍ8]I–iÕÂgD[hJÖm᎒›âz±N0…Ånɹäp x•#¼(!5V}‚ž’3S¢ µ& ;ž~í0ŒÙžyåÕÚý“4…@l§3þ °¤Ì ‚ô6üˆ$Åp`I/UÄ0‹*-)jY5–ÀO¢ ªnU;®ã C{äZæ×dò¸•ðbÈ&åeNu…m^,Ë#¢±³Bñ7]Œ °•—ärÅjæQ´,äcÀAÁDžr9úœ¶Ð¦1%b¦ÛÔ¾ôƒ¬û™!×]¨Ù¶ )¤Í,ÑS"ÎcXR‚÷ÊÅe6¯ê*ÁÓÙÔE.î 1R6GÂ<Ök>l0§„i(£áVYt&L[`êúwùÔMðI%n%¬¿Ž¼ÊP¨tc)?ˆA)û.©cs¡e/r¼ÜÈ/1W…n!é=Kov±)KùôqæLdˆw|³ )ç<¤·ê Ç‚$†dp.c¸$] 5S¶z¼ 8FŠ2nÙ@=Mlàa ˆ‘?ŽØ<)k¯ùžÆ=9zå uÕ!‘‘ w¥xü©èv¯–«Õ ”'V“¼¡c¸çíä:à©ÌÁ#”ñŠN± ‘ÇScXr›Õ›.`R#/ÈŽN¦¹Ž¿P)œ¨bfÙ$¸·žWÝ0Wm»$éFŪ~ NDwjê·²«ÎpÊ7Ю€ËüZðÀ§ÉægµÍ°ùrn `dj`Ñn~ˆÊº–H$¡¾ídŸ®ªOT â$z4™ìHõCbÜ)®`` Ø06lxéMw¡|6ÀlÅa¸¥2¡@×;#ÚzÊÕpUZlkx·mH­)Lí2L·òËc`Ü`Ë îì‹MŸíƒŽìTC¡E_²è«–“ñ´g¯ÿñ?ù'ĵL¥ä·û·Ÿ>{ÚH¯ÐoYuinj+Ø»6è „Ú&`T@ ŽÕǯ¾üò«§_Ï›Ý$Ö©Ñ!ædwpnU-W–²fKŸæâ«…˜YaS/-èζÊW!¥Ü<¸| ¸RMÆ~Øš“wC"PcÖXZ¡¹wÏŽ{j³ÒóòÅK[ÅÄTãÖñýÓïÿWâüü…ï)WaüÃÃ'Íî5‚Ã[ÓÉÞãðÌgÊYø¡›á®]³põüå¦ê]ÙLŽš´4›åXxèl1`[H¢U85*Ýr Ø`"”C ?tÂh˜ ×ô.iIFÍ+|ß¼„{W´¼o–1…ªmgó~äõ«·–ÿÍ—_¾¸ºúá~TCïSÄÛO?öÊjàûÚ^ulp®çôWT\ã|’6EvÅþrÔ‚›0 £ >t—Fµwæ™ ö ~ÓF׿Ãp3+,âîP´øJ2ú‚(8CLøì)!ã[¯žER+eˆ§\BÔŸæB‹iS}Mñü8TvC7ã9¸Ð°Prq ´ ˜Sv4÷0p›ÛLÂ̪ȕ– e»íãÜ"Á[Tqp€Ëš x(´óÎ!Å,þñV‡¤†VõiUÉ£•b åƒçàA ¹ðÕ f9ó£pQ©"ï `(f)ˆ=…JùñHoi¹~>PUNRåFÔÓy… %[eP½e¨E!·àÝboŒSÄC*PÏ4U˜S9„5=È'= yJŽÑ£÷DÑÀZJ^=@±¢ ‰DX1§Ñk­½gà»såfg IDATflˆs«4&ƒçËÕ˜¸Æ»)Eù\zŽã†ÝÅÏ«EEOݺBË  Œip-xz')ìLµ`EÐ&ÝT$xûý¿þ{jJÞex¬È{`øR{˜± 뇴äÖæã æ ëUÈc·¬¬pÂÝ R}N`Ôê’ïJ†úfì MbÔ@T,9™B0Å þ6íÓTÉSô“3`¼Ì 1¹Ày/cçßë»w•ð®¨Cà*? 7p¡Dµü¯pjù7/6ךåQ>Öuãfô^`rÿÚ?ɡǷ݋Û׫+ÝÚØ&Þ„¹š"xTÈ£[ZBÊ(ÏÛȽ]ýÃŒC ,oЄkžæédÜÔÀîhr¡-üñVª ¨=P‹¹ÁçQŸ½hDó”EØzÄ ç <ÓÇ¿OkWwu'$à !ûÏ´ÆUøaºÕù$%Q£–Ñá²D.Ejs-h©hŸÒ’Blô”-&ÍË)úâšm5Zab£él@«»z,¿¶¿“f#¬p,Ó¨[ŽÏV[GJÏpkŸª¿1IKâžsÄÖ±Ûñ:¡ïv¿Df)ËyÍkuðIàûǘqþH$ææs™Ü;z($?–honCCÛUœG€ÕÊIÛrPœíÓ-cdß,ÜÉÉwŽ[06†»n¯¶ø±ª:̘‘Ç)dàayxÜz¤–BU6É'žÄÆCx¤Ð#Ý5Q%°M¬¦F*Â?Û ÌY@é%a§“°!þ©ùåêο|žcè‹1°Å©·R§èýÃ7fâŸC“ã6n”l•ðŒrÚPá8ꓘ«%F †cdz¹fºïnÌh_EÕUq•öå£÷zÎ7ÿîw¿øƒÿáj³¿ó;¿s·E{?qó…KOŸ~þäÑ/þõÏÔÅÆÏ~ö³ï}ÿ‡Ö3M¢AHä'O>ðà‘“°7öÙÆ!09–úÚø’ùÏi}š˜F'c%V&Ñ&¦h;ve$j¦¡y‰Òîx¿fJc×Tk*q.­ÑUÕhï ˜!ð‰Ÿ'?çÏÀ÷¿ÿ}¼5j|ùÆ AþU~çþOÚŽQ´NÚNÎ×PÁ!.ZM1Ú3&-VëÞ÷õ>ìp0X ‡™t9ÃÃ4@½ûGð·ù¡hbñؾ–Ât^-D3`ÅîXY–íè„DÜ@6SÁàו"œÝsHšì1]CsM·Ýœp•†EüyºMF úâ»ß¹zn-¿Öê ƒ`¯íts<|qýåÇ5¢m&Y*£Aq†øì{‚K^„2 »®zíär>|F}Æü‡?Ò¥²ž‚Á0c~ø—톄C®ŽÂèähÅJ@z$…*Ák¦ðóÈV]0ûuÂ;“^öàZP “«ëJàOØ0P³ŠyñÐ@,Ýi.žM[’kV…麶À*aù iE[´èº¿.*c vXb°ÖE!HäæµlqïÌ•ŒZ®ø_HO‡ŸFZ GKW^*=¥¬ªN>y¢«` žèª¿ÛÅ£Åñ©•®TQ¾]O ç;uUÔ )Þi§àB](ÐJc3)xûi ªõ14ÆFÃ!‡d]*­õâžC•›Û(¿ 2 W+åá§S?:Îi!sÀ°ÍXõCÿ‘nó¢x)†L£#ÈáEÀ G}u¨ 5AH4^(ÙÆpƒ3 é–€ò®›WÞǘàžs묕eÛ„ÓQÏ>4±åч\0~\tqÕÛWÇš  Þúš!Û›íwÿ*ÍühÆÌªÕ‘”ŒTZi8¼n4 £û3¯ æš´†E;’¸c Úûd&jì $ãi`”@–ÎØáS i/pÁxµ'#æ,Ǫ¬ 8‘7ï*­¦–fú«Ä»Ck°ë i¯5†*žæ4Ú‡?bÎ{1 Ÿø2½ ãD/Zøa>ç¹™¼D0²æË×ð”ð' Ù*jÅ„Œ?/UR̸[0yl` iûÝìÒxfn†rŠ˜=ûZ©Ú-ލ^ ßEb”¹Š÷Ð4=€™X¤oÄñ¾†/Zr}·ü›ëÑÎOþò_þõßø 4ž|ö™U,%iäæ­§Ï¾þ_þ§ÿùÿøã?þ³?ý“‹ËûŸñ=Œ-áZ°’2 ê„özæÇ,«X’°ªxâAÎG©Ü¨öG*ÓUôU–=Þ*«üx*¿–­©hûë)1exžG‘Ùk0xÔ0ÈSœlàòª-v:êÕæ”4éÑD¼Þ¿¢'rÕ™ü2¡ Þ”Ë`fo=(ÚÇ*q€y,¿Æ ¤Ã DZTðÈÀ˜}Ÿ®¤˜ÄšGúAa#ž€…[Äç)§*!Ïh2ª`H™xó:b€Û`—÷ô²(%~ˆÀdÔ.ž =Ìjaº†6ð`v-«fÅÀi;«Ÿ‰~ª´%®gf TŠV–«B\åe\·º qÔEKà ç–úò3ªjµÊõE;šÉLj­Ó‚'5ŽpeDåÌåK.Þf¢9ÙUAéˆ0È›À{&žk›.BÄ¡™§‡žå- dGÔSŽ1Áo-r¾™ÝÎ¼ÍÆ±y¥­|:J~ÐÐ&[«šmo} 4å‡DÆQ²§‹#¾FÁ$ñ£ñiÓ;AÂç-ø\ÉlžµmW?Ê Du0#fÚÄêpžp>¼åñ#72±%òÌʨ.ÂCÕtk5üP½gÜ2Á.$–”œ¯›QÂX$’YT:>TT²iƒ˜öÛ¤ žÁ+_æKžªBò` « ]ÝÒ¡*ÜÞHÒ^ùÊ'Æ‚4ðÒ’”@3š9ˆ`F‚A’¼lhÈÑŠá)cÃLUœ©~°õŽF6ƒyl$o@Z¹–M&áÜ^ ªeX MŽzG§ÓQ×'ÌZì´H½À¶U]•ª7¾H™oÓ2F±F•¤GW9TŸ‘@«µ;})rÒpAÂS‰Úýô­[ÃHŸ@*IcDy¼rã›ç¿ù›æ+Ôšx84P̽81›ëM›WÞPB{qQ®<Îð!C³9òb¤¥™0ø›we–z?xç^{á}|K,éâ²h’ÇHP©ÈóåñêE6aNWÔân^´ë¯µ{%S8ðí¯= ,£\˜6}¿0Pë%=üsÖŠ+—2$&Ò§yT¡M‘íÇ¡ëR†P*žªjà¯Ê êJ"Ai3ÎBKÉân&s|”÷0=Áó¥öÉߢ)­ þ–Šìl¸Ó/ SKKfÛ<–¨h´çÄÛÞÍé´”Ë(g©‘Ï .ÕâåS&¾X{CK´ÚÓñ{q‡2½Â1íi0¡sž_«fÄÏ¥˜ ½õ2'%À P’‡ªÓÐTã72Ö%[rè·qÀ#)¬ªˆ¾yi62KÇÒ̲©„£û4V›<”d6È—øÅÖCeBP Ìö*ÞÄ•2ê%£ ï$´¶2ÕM|½nÕ¢:úÄ‚Öj¬íèpƒ ΫÁü-¾@8Wëq%Â$®Zê•^^õ›€^jÒ°!AjÉȃhă…-kCõš:Íöï÷c;?øá~õ×þ-o}p§ÛŠ®pBÉŒË/ dœµ1‘sµ þZŠ¢+,GÒ_–hR•!M¨<–¾ñyÝsÔ‚ñ¨QÖ±«¯ý˜4ɾjpS¹Xä«ÁÏà†8zVÕá^íq1¢fäùHÐzÞ GüÑÿöG¿ñWþÝïýÊ´h®ìwõXfÏ}ØoE4ý¥9’³È§ÝÙ†ŒÃá¶wî¢ÛpX¡®Xá'}±HédmdÀö&m–Nä%äÈb˜l#zû[§kb. ráyЦ$öS²·®£ù:WÂMBÚ9¶{C(&=E˜eÙñÆ´Ê”J ×l·œ~üôµµ+£+ïÔ„> S#ï…„G ¡Öƒñà@ÂÌ(SÇ ’bXó(®Š¬3ÔVÚ(’að¿>˽ 6gO4‡s”XCQ­Õ0*êÚ©„.Ák …=Iq‡ `P*<ò÷y§A_ý<ùi/Ù XóáÖ‰øÌm(ÁûðIL™KÏ0wOÊAÓßQ·Ú œ)~”¡ÐŸÆs1x Gxˆ<]Qކ !¦o s¼î«7Qá@›9Æ yÕÒ×X‚í„£&lÅL…ô ‰¤0*šm-E³)/ –ò‚h%'3r¬ u£¢œž­ë^ÏCÀÓ¥Å"›AçÀ`éê#ÜåÁ£áªÁ î4pU°ÃJ¦ >9dð¬D‚mà[áFE‰Œ´¦÷Hðr{hº!…HC;¬ökÀÉý³ËµÂ²•°6¶ T“!‘+l[¸<ËÃ9Î ¢„?»¤­n!—–ŠêÂSÀüM9çÆ†ûè1k¶†LEéŸV”#1be»uCøĬÛ5ÒõHuüû"‡Íìz|ýò•Í„Ö/L‡–yœð—á$ºùßýÝÿ6"Âe\Úk¬;™ NÞÜê"NÉ+öm»Âù´5_y Ùv OyÇÊlæEͼ/åM:™a;C;ýü¨à|CºF©Ó ›.˜Õê®(bký).ýÔOV8â§]!_6h NÌ–?ö£t?Íc”V’4²zŠ?­Î±:¶jyÏëýè|ß«®(AôsbÇÌaÍÞŒ \›pÕ…™–â§c6ŠütN.¹võò¹PerœgÃ0ì„Cºæ;h³²:­—¿jÁ=–•ëbëÔ1¿„m“ SA1¹^gÖØ‚ÑôJ˜÷Ô‚"åôAï­ˆÈ.è*’hãÓß÷2¸šàÂEFØ®>žÇÁ˜J,Oko\¢ÛÈî³îBWQL#Ú›fc’ö¡œu’Z#ÝÖ;̲7Ds¢ Nb˜Ï`l¸¡^®A¥áÛ÷­áùf»oÚ†‰yóQ“!Gôšˆ³ïŸýJÈŸx—#)(‡RÚœá¼ê« WmÆ‚…]Ã*²$rM;i±—hõ0µm^­mØ—{Ø€9Ø1›·uì>ñ‹ºT¡Š í¿“g«gã’:"ˆn·Í«…ÄT·'JG·û– Æ °d¸êrÝ-/j5^ÀZ3™ŸL/«Ô(CõÙü Ï4òñóöÔÙ ¢¤ovÚYD÷ ‘Þ=MCã–³öfyRÿQjôÖ—GIÕ‰HúÈ|³3Z‹u¶5¢Õ‚ð1Õ±èAå¦;dÍtb“ßüÚ‰µ4ctš°8ßuKØz÷êå«‹‡LËü^öý¯ÿø³/ÞýàW~C¼yóÊÙ/ï]ZŠ{iS½ñAøº)Nã)¼¢ÍÔŽ_ùbÀÛ?<8!ÂhñÖ{=Îê~3˜ågé°ÓNuVðMý¢Ù£6BˆáùæK?Tpû–Ðé¬BaäåÕ·bÛË+ßÞöU”#¶ß¼¾2o©=¾~ùΉÅ@q™ÄÜÈž:ý gÓE*4ùã¶Äì‹-+ ÷è¥L,‘ÿ6Êô“—võR5Kµ±±¦!”ã†àp²¾eGÍöÁÍÏ*¼ûèô©¤à$®´ÌHZS•w¥æc2FÉZõ ²ð‡ ޽BðÇÃé#áj'ŠðL(f<ÛÀê¸Z›I A𸣄†ÛZ­±t$HÁ¦¥Õ¡[At°ßkÃ/F㧦 î4Oê#Åm|ò«Q ®šsp¶&H!Ìc¹æ}ÍPvE ˜¤áŠXöbbj3fìE™B±öX[ šÉl}U‹ÍÎ8½²›ª$ÀœøeV£é¥¨Y¿^°ÐXçãµ{÷ ˜0NˆpjƒM ò’dFóÆœ°WW2Ú™1ÆÍv¬9˜Í‰N6åúdA:'y57QâêÅ·xüš•8¸;žÞ8cñVË­r 8¿ §›÷ˆïÈw|ù,Ï€””óº9Õ“E­Î>œE,^U4Y(õßÄÛæÛTWÃöGy®n3 ­q÷÷&ºaE"%õz*ÍÓJ@óü£'ªÎrÉë·¯9RçYÄl‰ŠðÖv-!”E[É; ›>Á2oñ–9&W`CUøyò„)”ÔlïëÞûí³ùÁ ?ŒE¤ ÿœÂ…‘ÑÅ6³ T½%gP sbüb”€€¨³g'¥‚ør^?ªkäà¸>çšÑ%•Šn¶ô`˜Ã嬌ϫŠMóœÀè‰{| h…,6³ü¬MtÈ{$uQʃ&À·rwrPp ù´¢ãÕ8B«P?¥úJ¸ø]·nØÛ R:>®™9ßYшêG‡¢Ž¤qZê X;6È›íwyŒ çð›ó+·–¶·f*àYÈ6ͶNUg·‰’9€Õ%,¨W2[X÷V‹PPa@?+,ÈÃF^\©ÂÞÈ’cÕ+Jlå^^Áànçù±Eo «ç=È„Q$V!Zàåøg¢ÚÙ†À¤QÉ‘(ÙÒµJáB:¯Ë5I·ŽóñTƒ„*)g~—P<&ÉBãT0“;ïr‹„ ƒ~‘Úc|ûm¿_»t ž|H•¸ÈèÓt üªÞÔë²0âKg]℞¿øâ‹vBº¶±;ÉÌðÉë~£Kòêàð’öYva°Ýz¼00ZrÕŽ«xŒKV®8ÿÄùŠ&C…n™|’ìnIAxÀ³GJTÇT‹gn?Y³ €ëQSÈmµÙ¥è˜ºnëž½†Û‘˜ûÙGµ`Ý HxŽ4¬*Á„ «s„jàÓ­Ìzâõwí’ö«èA $…@„m€Ã’ê$j=uNS_­»M“\ŠÐçsv¼iZúoiO@È 5 ©‰+X¦g_H¶†U—ºËù¶ë¸êðõ 'BoRÌ[o ‡‡QÏ¢!wæ˜KE‰|T®·¸%o¨0šH'fw6@¢.¯Æžþ ÿyöÍ× céäÀÉ™Ïz4%Ø@fùÅ­üƈCÃH@¥VM ĭ쮫0JåÂÆfä!¬îŒ¹”¯zÊdžnZ䮀·6iy;ãô¨æÓÏjÕ`­ò|º“ɬ/æ•­tDŽûåmcï#?ð@r1l¦ß›º®55nàÑ;oZ¸´da£#<{AN­û{uGëüñ¶ˆê”ÝWoŠ˜j‹V}èa}”+âÕB”x´J¡M½vË'0Íñ‰éb¼_ß§/+üä©MÉŠ¹(@>£aSh¡RKfa T¢–Œ5ší,N·GG{" e†t+A"¿Þ Cá¦s äÆÕ4EåÕE«‚yt×Kdë`Ð&[kζd|)ÙéMÿ¨®rDy¶Búl-ÁUïèªyû³ú=&ÜÜÇìƒ ´õðŽý…ĤàP¤j·ì %ÿ7!…Ó"pÖÚåL,ŒÕˆnÕ‹«…º¤îÈ^žƒØæ‰ e\צÊAºžé0ï„v¥XµR9ü0 {%÷ œ IDATaS|«œ9-⊊gËAnF]Ø– AÅ­¤Ü-¿´GôŒãqO %¹æºühk%¸…‡…b>Ҧף¢Ü[m™¶ÁJ?ÿÀÖ¿êB"·È]¢#%r®Pí•ášâ¹Ï¯â\Ìö(›ž)Ç „õ„Ö’ÂS¬ä:®¥/B¹*_${«:]é¶]át×#"­åWƒ†9AmÀ>ájâ–Ü!\/²wq.~Øš´+ …´ 3bbªU8Õ0 ªò­d9‚fƒ8¥ux¶–`ˆ¹³ØVK`Ò+Óˆ6²úÔt?ÖÈü@‘3Hí™®¿Ö€Ì*.W e$%[¾mŸl!þ•c` ²—[ž6ÁxŸÄA·XDµTÿ ScœSó™£e¶K?ð2®žæ;˜ é:T­LÇÜ«ÞñXcµY iñ·Nm—Ò½_ ¸å›­T ³ÞNm·ºenÑù«¯¾²3̰L!)þôOÿT¬ð åW_ýÂf;c_hø}ÀW¯_:“ùî§{é6JâoúqyðŽ/ƒ H‘¾b9-ã|¥áA!`%Œ­‘,Àv´0l´Øð98“}«È¨ó `àK#– ëæŽz¿iñ©kj©¾Þ{ÎË´¶r²ïb׬j,-¤±½¤{Ò±™æéab<) ÿí¶Þ¼¶oÜŒ}›ð«•]NÚ œBKöÄÿ”Kë~uÖ1½¶ZÙ´æÍ³g_ke>ÿÂH\ðÂé1Žô# ejªðãBTä•Ȱ©Ìê-¦Q›@©ä4r©(5"œ%µôaà£4ß´˜çQA#…{ʸš±`ÊÓ89¤s˦\éÙQÿ¨ ´<0KäDSÏK==ÚxmP~ Qv+-ÀøÔöY5RåJÊm3¶±Ý>r]$2`¤ÅƒI)¤'´ûÔu+Ê`r«ƒ!9}JÇF#Š…Œ$øHì¥N@û6u=…â¼/¬ÖìÛo:§ÏYfÿ-›wÚ;cØ’<ü†’TX`Q_5%žFi2žJp?GÚ³…[O9Ì*)òãÁ y'ò3ÓRVZ$®‹Üî!QqB%¨0¨Lá\sšáóõàƒ³4:NãØ¢’©ïì[¿Ãê3®ÔŸqYE)°I2¤êÊ ª–Wy0çòiÙÕž ƒ@¶ôH« Êá.’Z´oåÃ!g¦9)Ûø@æ<Ö¬Êü)ìa¼.ñ’b-GϬ9¾Þ˜ã_D™=Ña2Þüä £÷oõp8aÒl=n‡‘.û”ß@»úñtlô‡µ©AuضºŒ[À˘ëX0‡°WhWWàeÜŽ‹)Kq4vŸG*jõÿÊᜧ¨äÁ“c£æˆ0è—”'ËH ¨(CWË›æ›òÐzuúÞZcž³\)4NÛZBM0Ä÷¨•lZå)½î\U¨”~\SÌäq¶Z↗äóÁÆa>¾="äØ<làN®¸îÝÆY´(3Ón„i•½v×ÿ#6 èz&ã*y机-l72 Ššá¼_ƶÛ@gcè?‡w(¤F10åË3kLõؓ׆šL¢ö¥èÚ+:;y\Ï[-Î(¨lsc(6ñiŒ@gªQV=š1®G! ^åÓÇo_<ôøÁÃG—Ž}÷k2ÚÖ»Ž$¸ì}›mL€‡¢ÛÁïèc_ƒnÉ‚PÄYËži–03Ú0Yo›f2‚Þ°òæøßP¶–FK]ü í©ü0Ò@ª>,E$éÀìaò"§§f~ß x ’yÏ™ZpåöÖìOpê­Z胦]Çaô;S7}^rJ$yðprrw»±ŠÂ)iH´À®›™J¿Œ0‹Í#¤]¥½ IÕf4B]Ë90lϤ%6g7B⺞*g_ð«(d¶º§x|ë*—q…ÇÀÔ¢/=#« UN½Zqjœ¯¸C¨–§~{g>zóêª-wÛ¤k9ÿè ±¥¹ÂÈhp± äу±¥¶éÕ\‘Q¦%áv^çˆéÀƒI|n£-#¬ -ü§P¬wâàµB³X¡¤ÝlÓ´"Ô ^oê—ÃÛÞ…õÜ lùé-îÒE…Xžú™°w׎‚)ì¦~~ô@#ûh®r²Ñ;¿‡Ó»BI3§^¼}ñòùŃ/ $·ã¹…øQ)Z’¼êR¯›Æù!q«|ŸÚ~Äm䱨 °©¢Œ’•N³B×u:’¸ec*’—¢*’|CùYWk Uÿ³•i‰Ÿ"7Š5?jŽòör½Ý….] +€‘ž­Æ€´Í[³o=Ûy*‹zPQ—ƈ¢ c“‡@ÝåÊó‹³,¨À ¯ éV‚ðšqC$ìûHÒ3( u…+ì.ïÁ³HxØÊâ– ‹vœJ¤ã4¦ÛÆÄäôUž´€œAŒª=’‘âanfÕKÁhÁ©P‰ü”ëlp˜Cë(Jðx¤)É#Ì8`f ˜A§Å’­à—œL‹TÓ+àgI¸J{KÒÞ]ÍP'Óeö¤LD€!²òð ݸ˜–›F×ÍÆÖ£d5Ç ®Ëðt2üÄÒhÆÉÔ`¶ÿ<2ø)i,“°S~¸ô4‘#Öã¤G…x›ÿ[¨¨ yÃ&ÿ/'ð ¸OUŒåÙ›²îgtÒÙý©`h8.N{ ´ƒ;ýCN9£5B{–Î#ž~¤=š|Ý[Ô)¼…¤^dP,ÅA6ZŸ_Ñcô‰LÉTlj4c!×K$O*Ä*g#¼IŠÖa?–Í1>køêË_Ü»üøãÿ¦Gf’3,óê3RL'zæ_â_Äöµ–oA«N0¶‘“¡4y0XG‘–èJ‰ŒÁC‡3ëÕ%g–<5bÈw#Y\¢ò¹0¹º{î­”æo3¦Q¹åŸe%c#Tg1ûÃíöÿ²ÎM³p|>züD¿ â€í}ò«Àœ„ðrû¥–ð¨Akj..måÅÐ"„°âD€j1ÀCÎ'•ŒzB„ÜËS»®ßè ¹ôËš* Ó+-¤€Á¢vh#¿CWCWev Wq¾35Qo[K È$JÝ•y4E†fË=PÜ¡ŒA]æžÒ»+9€ ì•7ð"(¿jh:qÝÓ’†\fÓ*dü7G]„FLïìõ®ð¸ü»`A½°?“_'‡Ý¹—¨+1wDzM½£üì;_ˆ3¯ÞÚí6à{bùûîýF½xçg×Úºl˜[± ˜G3 -¹ê¢^«õH¼äò`\)P¡‡†xJ?´·.ó U—W¸eR7“Â3+I'´Çðe>·=e¯hééj 3åô¤‹vM f•äV ý´JÖÆ›äŠòtVCUIïFÔP‹5]Óy tp•˜nšûM­V}0àU¯§ž—fÜsÛ^K’ mj_nÔ•‘À[¬w õ 7ØŽ–¼Q†¦¼£}DÁC¥PÚŠ®dN¸ñÅ3!8=’‚v5²``¤} Ï™ 0ö<‰µ Á1Í& •H2€—„¼´U@ÚíèW/œ2ýÊ‚ŸMÿ¦%Ì Ìð™§âA­‹ Ç@¶¹•p ¡B*ñ“ ð?zœ+œYR¥×, ˘éc 3ja•¶XT€Ç8ÞSßÃ, LcPiõ°" L»V@WÀ𯺖Ud Ìcšu»5„*2«ÿ3œJ–œº$™“† ¬)º*64ܾÀ²:åYÙ-­ À&æRÝü+>0<¸ªµ|zD„%ºŒ ž|äªÚS0x8ƒixn~ðhÕåVj°2Á•%„èæ•Cë 'H™å‡2Ø×l.¨| 7ó‚)ÜŒ«„jáÙuß§gä³$šÑÛ5íÌ3¿%`k ö‡O†V³aæˆJK†M8¤yUÉ»"(”¡aäx2´ÄYÅsý\K/ò,+¸»]&e R+1Gp'^úkøB õŠVVß½4T‡çKꪨpeT}3`ÄŽquõÜ/¸ßÛa§ã%_¼|óàÑçž|!($Ð{ù ÜùÇŸŒýŽ}‘qêî-ªÕ©OÆÕücÞö(0¿l¸.{¨s’4(!õÚ"Ág#”[0¸¥4…Ú,$P)QŽ)µt¨À¤}”´¥"õlHÓ@¶‰¾ÝôNølý^oݽcJK®vâ>ÑÅÕÛ7NÆ¿oˆ3q7Ó W ,‘{{Øñ`oÞ¿÷д™ŽïÞ±y¹7;~Zgz¸ùL¶˜æ]á‘HJ ®žºbç8 Ï«å`CÞ#U¶ey*yºðòfÕœ…8«áY»²±M;º[ŽŠ¼+Tj¹ölžŽ†ò1…Òâ?SQâ$(âao•hÊ~‰Nº8ék$}i ÜíÔ~çå('n¨.`_xa6Hf÷ÕÜÎ\ÁÉ=´è¾óÚFÊ:O$-á™Nà±ÌâN:\nÿæ{>ÒíçÊWƕ MU9=ƒ7ó£#Îaøƒ§ÈÍÒv# u·­EhG†aÞîIE®çº]lÄQ¾„Ê£¸À õÞðdÅ%¼Iž¢¹’•n3»Ì2«Ÿåc ,£Š¤Ê&`躺õT’q ÞÕ-&—%yØ{ê7m\ñ&ö÷âýƒïé>:ôEûâÞô§7ûðÉâS?ú„ø»N@¶Å¡w¶*Q%Êé‹Å¬²%Ô¹úÍœ"Ü,¦ê¥ôpšsV°¯Iôƒ·g5>U:ÒHúìûöÛ aù"é´ÓÎúzïJ#'üðó}3gL@±¼Š¦hÛ’¿]§ók,Ôk©JÒålÉ¢–YÏ(ú",¼¨i cl$ èŸÏ 'hÞs:†ºëìóÏFŽŸ>Þg‰Û·ÌÙÒpë-± á6Îz9å×ÐCaóå/¾tBûu*|ûöñÃGÆXÀˆ{h„Þ¾s{Û"ŸF„1Ç_®9 5£gÇq™êiÚë«lX_æør?œCdÇ¥˜8 ¥~žÒe~Å–~^\½¶HÖŸ}ë8Lã†ÔÞë£dÇ’ÕVE`©µÞ寗-²¾´°¢0ô4@±‹TWrçnŸÍ+ß!œÂ©—êïßÙ—=‹„ ÖŒŸî˜ÒRÒ9×þ„òk¿J<À /p­Ï™‚ا=Sa1Ú'i &ŸøY™>¾‡p: ÀûyKÚ¬À²cqª?¿š£4¼y §·{9!¦›ñ}žyK_ˈ«\€ÇO¿ú…åÆK'}yԲķì¢6;„sß©:h£i Áo[a“Ñ­Øâu–Í¢– 4‘ûÎc;¾âß“'*+ÃNí\οˀ—0I$†—jnÓPÒA­½ãû¸•­Ásò×o® &‘c¾¡:H`váSÔá-A¹„mYMȼ>K„é˜Xœ· Ú`G´ZÜ›þKá³§ßP—W\W±ÖÊÌ£ð´ÄòäéYøÒ ?¼àC×+Tñ>W²K„ƒe]a– ]uïÓ n˜`…ÆŒwp[4ãyóæ V8ü[t?Öe £4 ¸§½- Š!ïú¸á•6ç¤ü@LÍsޱur)VWÓsVö«+ÊÕ¯9ç‚ÞßøýßôizB K`«Ù‘H¶¯µg𡍩ÆôÜwØCtw•²Ø €2þ4€1@“¨«@\ µæ\8}9c½(R*%žM  UY´–7åC·Aün‘£ð…—m¤eî?åƒGhàÇ;`½’cZ¥Ÿ>Q$À! v3vŒéAص´„°„ · "íí2¿°îÙ›ˆ†ht}ûøò!ç¼€YéÜBë ‘©H×Åå^\½r‚¶fâè‡5 'Ð!Åp¦~GãÞÒ`ÂÇ?_jBùÖ-¯K/3×'YÓÙÍb¬=&ÑŒo–m}–ŒHgpŒ„ŽÄ- Lc”~¼ª6oÿ¯1ñ<Þ£ªœÔ«C1pfãG g)Ófádül„˜ÀkKt¥liõô†Ó}‚_‘Wù Xê¥~(í/¶‚>\f̌ͫ⑺’Š‹ÐSx¸ƒÛÉgeêùƒ\-H”ÐMк “àÎ"?«n­vÒøAH—-¢´ºS! r&5ª0Á–.3‘E-ä·ú`Ø'58ø¿?s#ÌÐŽnj±cúþáà/û{%P‘@áäƒDí ¿ÂºRÈ‚v»ðhWA/Î ó”î"ÐL%Äj ØPIŠEŒªv 4CMQuah`i‘7<í¹îšϣú&®é²¤n×Ö¢Œûeã ÿHùˆƒÉú”˜M“h9¤Så|ÅUüU(ŒhJ`š5Îdu‡­;¯üé¿þ7Úëý‡Ÿ½~á$À;æâÖ›ö·/1!§.WxP„V~…ÑaNü$Åèð @Uª[ç]ô)Uw¤ÜHÄ#I!%„è$5B›'H·2 ²œ€W¢®BÈ20 FíN¤™Œ î8°µž®cÐØ_¼´ F½ó-ÒÝ;VßòŠO4ÊÙðIMôß{¡ó 9í_ë… €±Ž&ŒÜp)QQi'[3±¼v¨Moë,J% ‹yµà¤·êŽK v2Èe¬Ç}«X ÆP ]D Ësp‚+²3†ZÞ[@dïNß^Z¥ò‰•ÔdF¢'˘Ú•Á½ÄL<‡¥­*2Œ)³øL®Z³I‚ÉÂo´¼æUÍ Y8.TÊцBWV%ÒPÎÊ’<{zJç¼IÒµæ^\PÒÌj”aÈNa$2>Íx “U~ŽIW¶Ç¼T$í*A”øÙe¼…{B¾a#JUO!±Å1p‰«ŠÊ]×Å]Ï"Çh^FËll<L£«“ÇZ5eU·&3†z«G6ÜÏ`}ub»^>}B¥Êš3n×Çh ¼„AÞ›NŠòã0 «L©–´²Àæ)}rHT$`£HO‚‘ÊMÿ.³Œ-ëVL ñ8÷ lM]zÃëV…mV³T‚Í„ýÀ?}q³5Ë´ bˆ÷ŠŒ™í0ÿþƒµa¯eˆ–cTnuÛµ‚pHZ‚º7ÿ¿ú]P4cÎ÷^¹Äß^ 7R°3öY Ê¹jWú¼¤µöd@€Wn±zœ»GÇ)ðš ¡G#žs%§[ThÝ- #R”<¬ñd°+Ÿ$³—\‰ KøV5n'âGaÌÌ£ÍUFŠx„v½™ñ;ÞÌ™,êt*’!_·Ú'Fc˜CàÓ<<ÕŽc!=ÂòÏÚ¡*†/Ô¢Û6(ìH ³uk)1&êNfŒbÔß6V«z%a‡cq9"ìËz¢Ûu¯áP;'c΄ȃL¥åËX,oø[¢(¤I‘ |‡¤Ò½50ä. Ú*.ü€‘p®Q4|}yßË>Ìç”ûT¨<Ó†§ØZ+&¯ÎéÁ–)kÑ3³Y¹Ôr{N0H¤à!F`ˆ£D9}, JÔ¥3שÓëÔé™’T^®w㟿lÒ˜U»éH„y&o3(¤Ê{¤ÜÿK¥|µ¨ÇýÉ˵tã8êÇÛ¨(É‚9ØÁímÔ»‡Âp‰s×5œ qȸB&~bNÚ wÜ”±޳«^•~¬i´ºZZøÍÃ#£âzËôÁ½%x±Ídq³'·Màãc€ù¡¶?&h_…’UÌ8|ñK]²L Á$ALj4ðÇ|S·háÈ[§¥Ï('ï®Ë”ÀLhöR5_…_'Ýä¾Í‹wü2ù?ÿgÿçƒËk—O¾ûíÓç0ëõ*öPpTHE´q2†+íöÐÌ„îhÉÏÁ€D$TÿŒuäªn3Ù¬HÎFÌuÂöøŽ¤ Û*'n¡r+¿‘jyÓ"4ÜæÛKwY­Ù§³¯özºñ2èþÝ~›Ù­<&ºV=ð<òyaéEŠå'í\xýW0”pKÓðó·®à$øÑ5oâ V wXlj} ¤(6Jãºò2þHÄØ4&³ÉhFPLØÛjì‰9;G!èÄ‹lÂÓþ$_“Ü»sqÿ‚¹j½ÿpùÐoaÕn©ž:ÇÁ<éwìwÁ¿ÚlcG˜›_NÊ G}ª40¸V“Õí­HJ8½ò§Í$ž†zÚ*êxÞ¥y®êåWÖ9ùX:9½±éZVóÊÕŠ{õ±Ø„Ù“ÞEêþÈHá ¦-i°`(Òà øAšMaq8¨Jc;ãQ0Vß½sô˜„%¤§b·X’_1=Z'D"å·þ$8+®»Á˜+ÍùÓ*‡œRøøW‹0‡\¬;‡7À¢gr2Së{G|œ „kÎ6’5âcP=Œë*¤$cãö=)©'JÌ„a®¤s ìœáÏʉ¬pt˜ÿcØ7ÏžãûT FŽ&ÑUE9ÞTWÑ­ü_DËâK®Q»Iô âávõF9¸‡_RIÃ,a`Ï·£A¬›¹¢kã›ë]„P)¶Ì[a-Q%ô¤sF Œ TÑ£,ÝÙšù}͸î;{JJ.ïÚaÀ¥ë2µSk®¯·¿Š´ƒ™íÙ›5$â†õZÕº.é59x·çGV; 1¶ÌÈ+Dn6_wÏY5= óm“V™¡äÏêÆ¼ß;ý4têÁ!±®âƒN©¥õá33‹7D—+…0«â B2{ùÁ+Š)ÞkØ”3Kè‚¿5»v;ŒCh%ó3& » N§v Óëƒák]h‰à5¼«ç¦ ¨·¤9qðfÖFÂÑà'„Dn›Ù`X9T—ç+7 ¼OjZ­Ì…Gy2ŽºRÂâ$lâÏ8ÆS…†5†%‡5ÁxJå¨H€äaBÚ£­>05”€wm@ü~–$ï^jêâB.N^UX¼rÀ®Ü5HV Ó×ÌØôzKƒNÞ5&'Nd¤¡yx §É1XlÔBoIGFDñÈ‹Ü-“øY„ =ÝŠc–¦Éy*Œð$%”|®8 LpÏ£8§×*a¥Q)JÿtbìèkÁœ•˜Û<û0>WÛGKYËB„æàˉÕv§^j6W…XÛeêžEÙòÁ&¨Ø"¿t‘´af=*yT‚„‡àðib¿BÖ1píT»exør¢îš›À¡Úõ²"Ë÷]/EØò³Ö%³y×øŸSc`@W+#A ~`3Dí4±Oeô ÀÆ$ðÎ7©›ÕÏ>Z°-¤F…ȹßàãCã?ííäÒäõ1$ß>¿ÒÌ•À=/¤êÃl¯2+^[,*X‚ MH&Sc<“æ=ûêk&€Á¨åÖuÁ #/#F4É£P„r@"°½A•VEïúÇ7óåmëÿÿ?Y÷Ú£W–ödñZÅ"»§ÛÒŒ#Y²<ŠÁ/‚À€¿’Y3ºXròÁòÆðÀ0 F`8¥Xˆl]¢ÑLwOw³ÉbY¼å÷_ëyjdwõá>{¯½î{íËÙçÜ£%›²ÄT‚“Å9yÞkìb’fJð_3šžâÅáJUZIÀ¬êŒ _õ•_Üó B€\KƇH…/n¿ùòÙÅÅOOŸ~úîõ‡ÇçgÞO1QòP–>Øh»3BäëTÙ’a©,6¸šn²+‚+ȪÌr°Ô› 3š?Üš‹‚Y„®vnöv"±TVßò<ÓXÎYÇ+Aðv J‚LI¾Ôñnô7x ~ 5ç®Zñ>ãö/_9Þ´b€Õk6zþæ›gLã…©9,ÜVü/ÜlôžÈÉôk}$:cÔòկݳ{Æ´»Ô«J¨Å-ݺ.¡_ÿˆÆlêìr®é½ù‘‰Ž-wl+çµÚîu­zôÆUN[ïšy’K« óêÉ+-:ñ @¬ß†ÍùÙc¤ Sü<×ãºêþžæoïv¤¬ƒð"hqŽî´¢”I 娫-$=È΀!!ï L?šúFB ¹¼ó I×&Þâ6ååEþÑ‹Çm gøÏH3>@V¥ÚrÀºã<Þ6p’R¸ÒeŒÈ‹¼“È>„t׺%0 ( Ë´ j%›ŽêÊ…dúu‘TÒÎW:p ÁÀÔb- ñ©'ÏH¦“i•˜NG ™ýV‰X9~• xåÞgõCÚYþj8Ú‘Á¼ V{òþ($' sNÖM€ju˜RN0Œ·$™„è*Íômô–%·âSÑ(á ÊQëºHp%Ê:Ѭd•)ƒ®ß¤Û=öa8¥WµJHÒÙSìÖMÏ:±ZHve”*§9ÙC‡JêGó0‘Dd$`¬j›WD`4Å 7£Ä ü+ò:0«-Ã4ì`¬ï~ç—¬/aÓ»?¶ ùjW0§u=ñ‘-–³ÿíßýõßüßßûµßôLIX~éëÞlzØï*ènC´ßÿyWÔWu«äo†ÄöÊlž~­ d²oqÈ{UÝ®0l‚– ò[µ-Å\⸠TKuì(É,<°¥k ˜Š°¨jõ9ÔÄ×¶>éÖQçHØÐË×+<<½xqÁ(¦g§NѦpLâW8;}d4Ç¿†Ôg`@yxj޵ûaó’C3Ýãj¹±SÛ[ÌËnp"„ØÐ•ÜâdÂòG§g&œúõ°Üœ ?a}™€8Ú‰û`°Sâ«i‡¤ ûC¸"oœ_Y«¥·Þ²l÷ ØSntתÆã<Ë$ •°ËªåÆÊhâð µò9‹…‰ ÎíÌþ+oP˜Ük¸MЫo4Âa‰F\M1¯7¡¨VBÝÀÏJ`Ðçäep2.t˜g«EÚ)?> |æÁbšïšPl'²Cb%âŠz®Z·ÁÌ~Û¨1¨•ù‡1wÁÂZ0¸]&éʦ®Áß3<3h¶ p;À;B府¡ÖvÃô©HóV…°áLšiô4’6ãQ}£|Ø~f± €ón!lܘ\bóZÅá,2¨•Væaº)²Å„f˜UNoÒmÖ6¥qåyz³DïãÓ2{fï«W‚ÔÄkòQOOûä/ÕY\΋ƒ'¿ÿƒ! ‹ËË«>ŸŸH½¨á?ÈÓ0„?-UÕz§ ¥s\é5)@`e>7ìgáûV²ä–‹)¦»»Î¸ôáÅÅ ëwgÊf™×Ìf ©‰°,¹ÊïTtzE‘3Ê‚‡-Ÿ˜¤!ŨâT2€^nö³i€•C Nê_ýà”Yíâ°daMã v­ü¢ˆí“¾@'x¬"¡&ËMÀ añnf«À"4_ÆZö”?x•šX?ï8à0’ƒ0þñ鼺æ€÷:NÏÑÛ¾*´%Eþ-„ÕvzKr‡’ÍÑE\‰øáŒ·»?÷œ~Mý%›ažØ"Ôˆ31Ú|<*ÄË€æCç@ùnýMo©Pê tðõ^+)ܾº£Òªäñ-"†xt…–F|®¬þ†yåR,ãÞ?a,®eW™¾ûíôÙhÔ!‹Hûß`ä4š÷>­Ç =FUaXm%ê5ò–ƒû¨7t¥ÎsŒ·ËÍšøÔåà h? ÎvIúàW,!§–o`Z¡Û)©·ât¾WÏ-ñÉÕ<0ŒSªli°b-cµ~h¹¹¡Å|9“aÀÁá^ªd»*ïœ=?ÓGœbëð3²öôIˆ¸a,N8X1­²x)ð¬Éƒ{>‹oGü¨8ŸaéØ7©¼ásÔÓ°'*ØÕ}$^ŽXm[šÇõ%WnÓ6Õó¾`Iœy»› 6´>ÿÉ—ñçÿù7ÿÉÿ|ÇÂ;®¤Û$¤@aÆ$BãiÛ­D"yWå®0“,òÛÓW'ò#ĉ{ðp+!Y µºJ$U‹þå÷–t 3V&‹Ö²4·ÄR%èÂÌ¥·p:©¥ÝƒSêt¾þŸ¿¡û&ikSÍ”,~õÙqi#p¿ hÛÕ4~ùõWÔ°n["¿ÐC1àI¯ˆqeÂk‹Ÿei­&O<ÌàŸêìQ¸Û•¥žy™*½ƒ§áêXK‚•Û×–qÔAÀ/¾L$q€*DSÑ›£¦ÆÖ3Óâ©Ôèð¾m½´C®-itAÊô#Ò&ûŠ^ÄÀ¾ß¹ºã9§A ‡z™­æ"öô¦í/Iª¹/ûÏIŒÕ-†À‡-”€qktû %+)¿±ež–¸¿2HÌTOC \½…|IF /uÕzé"°``&Š2:hKKf4õ–yÓH_0[ôi$ƒ¯ÿ¸µ ¢i/<1Em³ÑÕ«8¡U´úÊÃãs´dÀ,$†ãg^ò@9t²×t`j×É}jÇ­Ä™™‚T¢ ¤©ç*éStžoÈ‹1·Æ8h¹½ Îô¹Ž±Ô¹ x"‰¶»åê§Ë­©rTªœ ÑÌ?yN¼áˉ¢KË ¢qKÒ5ñаœSÎ&UL [ íê‘8Ü78WjS)†] Ã^ó<.»v×I\éõ9r§%õì‹'úÉ'v.ü3‹®q¼9²Ñ:Ÿ˜/_’‘\ç6hÿà_ý¾à8ÃùjÐF°@è °“³¡-2;Ÿ†cÒ¦Z¶+ÌÉô[bYê€XùüC*ž¡*ræg¯®ÄÑ«íö3Y½~~ùìÙOyqñþ#ï—¬¦x3ŽEK›ó´oÌfé5s33}mH/OÑ ¡EB«¹fq­/·FÑw©Y¯W‚j"œ©j—¥!PÌ¡£'çOfê•£«Â!©©TG›_¿¼ðP¼G¿âØõõÑ0É¢ä%Ä %#Ÿ¶8\6ÂyÊþð¶öñßúE…v×b’ú<¼rÆ¿AÁ°Ú¢¼V‰k3lý„ÓªñÕ¾f·ô‡VœY1j¾Rä2Í[¹P÷ÍÑÐ1ªŸ8õ"70« Ù@Ö‹xaŽ8~©­¸9KŸÆ­ébÛ"g¥g;bUê  æN½gÚœ-Ì>Û&\lhA ÿv*.A6(Õjhôç—äV -;Š çLlû’Å,°Á3–3‚Íã!LøÐdµÆDN*^‹¹4¤· €nÛËž}I€ˆmiƒC0¶³WöNð5“ÎT_Ón4·ï²O|BÕy•ì•Ù):×ç¾Z‡ÌC4-½Ë. 6;eTw‹kÉΟÑÂmãÚW’ÍÍÉîMZã–~K¿”rß÷ z&ë;Od®^_é‡ï>Œ6Œ€ÜA7B´'ì3ÊTHéMoÁÅW]cuaÞBYü& GùZÍÌ’´y…D´У@ÂÙú¶†£–æîÚ²Š2H„N­°¡Ò6øb8齿Õ×< <1)OžÈah³¹~Z ­;~¸xy‘?7ˆšÓ'šó×>ÊÀžœôúÅ‹g_þݯ~ÿŸ¼~éçû/¯^9²pûä‘O¯‹tþ<.7•é`³ ·¥î=hŸ‰ò{Rï|õ€\:×¹‘G¯º>+uâÛî™ÍÔa鄨†v]›0ŒŸÀ@¢‘Ó׉z·ºé5ÅŠ#ûh(hÏæ{súI@J„Ð<‚R0ÜöŒ‰!{IYg °«š·_Ä“ùž\o¿²Ì»g^âä£'O¾øâs”pòìÙ×çOÛº~õòêåå‹§ûð{™á…­=xÂNv<¦­äë (&ãakç°‚‘ß>l°TMfbëKbi±Ç:{DãdÍŠLSœì¤;U ˽”ͲÖô c`Í ¢y2¤«HzeŸœòΠᆠù¨º&ŽˆulßÎèô2.ÄÈråÄ’ƒ¬M­êDV(½0Ž„æpŽ4 p¯ØZÕ¾›Ö[ G6&Á{· ÷Φ¥Í…Ùb„2ŸÉ3©Žo™àÚ&Œgo {pÑFíóH;³‘×ìôµ¹÷ðL§ÆÏ¥³%½^üÌ'a¶ikÄœËÆ 7˜h˜ ›Ô˜ ª:Zße¤Ì±àª´) Ø“ô®šð„žo¢Ò$=í‡ “´]~êéµëºáQcèèã§uü8ïÓSËeJ!Ý0Ý Ÿö?^ì³U }ã­‘‘†«¾åa&©ÀwÏQcIÆÐÉú–'Wñà©qÚ¬£3$¶â#L7iUCÃ7µiQw%—ƒËŸ¾‰aÔ[ÈM •‘Ÿa­è½MÄ23ù"10a̱]c_’(íÙ×_¡ûô©/ñ ô1‰–'6ÓM.zP®‰‰>ûøÌíT=˜¯WY=sF9ïjªõß}ñüJÆ«o§Íò8)2Ìÿö¯ÿˆ]‘@x9Cx'¥[Œ™oÿëcøŬ ÙOò¸‡„#r2`¨Ëš$М°ÎÞþœ4Íôßt¨\ðí½YVaØû÷ÎîžáÝZr IDAT>;õþŒlÁÁ …\+©oføm™‰pæW3­Ç˜]„F×b øí¼`àY—U%’©èã H‡(šâ0q‡—³{aÁh¸š¼ÑÃÊný ÌšCŽ–r™žªšŽÈBÊíÕšox~Åy–Ô{²Þ‰aÇ₤"·W—WÖOÎÀ0½¯w'‘(žNìî†1î)T•¼Ù¤ðê–ÉH tÄo²¨ ´ry“ÔÁÓÔYZø1L'³‰ÿz¸Ëé‚9D¡H"†‰«&lé\—B<i/v~6.ß)ÒŠš¢ßtmÍudö]êèje¢£äᣖYÜ ý.8Ƈ•0ê\#ùŠãZ¹@ÜžÖ¼Š?ìá[ —¬Å®Y²Ç)>y×lÅ9T”|ìHàÙþìSafN<Ú>Ñ>CgA ½üú)l”ÄÏ5ÄaD-ç`j•`•Œú¾ ²XSBÍ˧»®t Ñ d4Ó,VWØŽ_™ýƒh-Ýœ·?²x›{¾<Ê«rUóÃøIîr_UÖ:&¬H‚KJ$ìÙáí¥axÈÎJp\Bž'l®¾öSÏS2„Ò°)+'Òu;ýd«ÈE áS"Éàö”ËãP/–_*nÀJ‡êMÒKvµn!q¶s·ÖŠZ”Sj_›!…}›ž¹Ä†-oå‚7Ò[Usžl‚GT_‚›z Ì€§$>QKÛs˜Ýº„¿êIÇ*1ÆpPÀàšÉv­/ Ï‚à ÔºOéÐÙ蘰‰7Ï0;üýZùЊyÌùé“/6°,",Ï„EECt=CQ+Ï7H¹¨äóÌÐÂàíNìÜôZÆÌã)êâų_þî·’Þ9/Ñüûââù{Ž8À"!Á‰G0»÷4˜¹ZQK->s’q¹Ëåv¹¢ ÷:ûÒÌxÊÉ‘tLŒy ÷·‘+¿’Ì—À¼z}©_0Jæ‹qRå.¨+ʃ'¸õ`䨮¡ã› Úœ0;@9êz#Zà-UÚ: ¡†åa60ÛIºsçéGç ›%M·RÛéþ¦v‘/–”¡åø‡sœ`®0ȘbX:Lm·ÇÌ|ómb…‘ǦŸ±Ò#ˆŽðOùäö‹ç¯0)@Þ÷µF¡®”‚MBC@Œ£ˆ{·MTç Õ΃c}#;ú­§““‹çßð"$H'Qì |®5;®E6yŽD›_ñÙuÉþ°šn³j€÷ª-c¹Ebá™çü´ß0r ¯œ3}{}.ƒ-ÀR„AC‚1.Á\!„W+̘åÐîâÄ9ü¨À&û|† ˉH(¶pÍI[Ȩ_¨aÕå0MΣØS¹y[Pø$ ÿÒ6}5ç–L¦œwA¢3XåóèÊoÏ¥AŸ¡'•×¼_\¾L)Éø[sIÞZÃüm=?üô’˜èaÅi¿ÏÓwþG'2÷ÞÊk%¿Ã넾0¯dpxÓ r1¨’F9šK2ÒÖ’QžbY“[«P«½ÃÏö¦exä3š § ºµšïSÜ*±Õçv¸õëùØ(e÷&é°ºïÒÁÓ³þ?ø½ß5©æŸ&žÓ)R·wv¯©Yd!Å6ã{”_•Våjå ÉvàM„¹|ÏÂÞµþV@³jO“vA‰`SY¼æ¡~:ÃW—G!0ÜZ‰S!K7Ù Ûa#‡@î†M$&” €é)=¯­Û;³’ BUØzT°A'„de¬ÆtÍõN|ÐÙ¥/^€aNIÀÜZ6ÖéÃñrb]…ŸK¢ *™„â£áûÃ?ÔÕæ6";ø©nvÚÈ»`£·ÙùYž&X Úrd„3qÆç•¨Á5ŽuSd#À4ĆrRÊÍ(„ÿá›ÏÀ€N(Ðò0÷ÄÞ=iKLÁñþ½o}ë“Ï~ü·¾”ôä[ßþéßþÔ6íð°³'õ˜µ}Ì ð`Ú§Íó%‘Å,’ þÖ?¸W(æ`‹°oÀÚt,à÷•WJXÜò·#Ûœ¤K¤ÜR5$P­–\13óÝ"<ÍCÿ­…ÝÿPÙ¥8wâ$7²@%¿"@µq*® æ L+i%Eb€ûH€‘4Y\sFxò8ú˜~»3ÜÔ)[“¤„±ZÀœžq"L½ëdU¾¬‹Í`Ê@x5Ä8^0ü|6)Ù_J¦yÛ]†VùÉ~ø;”Hñ €Gý™‘8TTääââþô ÍH;.­ ó»@gþÚÔM¼Ya³á6“Wëh§"è,ˆ½ëŠ>ƒ¤çï‹Ó|@ mB²'îFp%$AK"+} ÝÃ(¾ÍÁàÁUGšS™ž´ÇžZ[|ú]Ûðí'§ªlªoºG3 i¤Ó¢Ï=0Ÿ?‚{¾+3ždæ.à;ìwûmÌÙËÏF_!ƒÛiE¹>I ÏhßÎÇápxÀÌÀP×1—†âoæ^®”ªíð²üø€&Œ%v`¦ÆBŽõ#f„|Μ¹ÁàpëX›R”B´´«ÛPËÈ Ì£Mð°·ôOZV8t`n×®0ަsòjèÖ`´£%¨ô ñÖkÏZÅ#KáÙÌ(¾r¤}fâ0L˜†M2_qå(þ=‡H”×%T]0©7&]‘ªÉh{áÁæ9ðwa·Dó©s¸äu“þ¦Í}„qð rÝ f“Vôꯕ ñžPúÂèa5€Æ6/X©•àÐP/"L&ÝÀ†<ûhrkQw»À„]Ò+Eþ9?E F0kv[ w$†Jx‚¸>J_7ÒeàTPLÀ=’•435f*N,‚šð•Õ˜‹²þB"ʺéΠ8® xdk¬¿ ÀzŸy”éì¦On>yúä/þôÏ~ù¥_þþO~üÙ£Ó‡ïnŸ?¨ŽMâŠJDÓ8·Õ´At¬x8éV¤»áD[–CE"²*W -,¬®,NÀ©EÔ•^_]Þpµx4aÆr« ÍpǪLÕ V†(åöq9©]ÊËË~Z¸¥ä¦\VÄzU¦xÍQå‡n¼áÖúI·ûôDQ˜íÆ.Ñ;ö[`òd!oª›¤päãÓ (Hj«ÄuÍ -ä[¸­4GÂ,*·V¯w%XcK#£5’ŸßŽ.|P5Ǻ?.çÌÆláäB [vOä íÍUU"L È,£DÕò¬ŠtÅ1ÈØ;… # ©Ë’xk8xàŠöäW´u¤k€td¤‡¡C‘?¼“§ˆÎiVÿf‹Y;¦%Qm•)ÏÊÈ©•’¥^åüMûÿõ~&Ù—»1kW}›EóðÔ‡…45GE!$Ø6άOî­Ú éç}¼éIÜ»×›\Œ¹;µéaâ ÂÆÞòšËKjQQ¢B0ìØ²›êfÜQnûË >5‡­˜:y’SœZsLJ³¤*á³h Ú8Ûïû~øè£4òMskŸOðé^/‚^}è“¿i²ð7}6r÷ƒû©cËÌ"’-zg}·[Á ¶=’LlðXýb,/oæá¯Þ_묀Á¸Nz×HBKsÏ‚çMÿuký ?x!{¼&£^$Ö.j×CY°ÇTéÕ(KƒÙ0§ÅFý}Öcšàmhݶ ¯êÅó—:8ÒX¿('l”9»föƒ Ί'Ái/Œ=µr§ÛòÞ2S X9pú!2š_$ñ[jk³ËÂåV¹VšV•VÚz啎a6-vëGøð¦J?¤Ã¬Û;Ò®ŒÛEbª˜"ýÖ—7u˜X1½Be§àƒªY‹†øÑ'Ž›»­!)xω!PpðíúÆC^>{ì5mvÍÌ»¶GÍ{G-®T¿z BË#·Ê‘q«áZVQÑ$)èöøñ BM¨Ûíía£a'|N|Š „Ô?'ÔõÝXH…’†F %6¥»xnÆóÆe•%m{mãþ½W—E§`[P;‹ÞŒ„VóXˬ„rœ€gq0<“½À<ßЀëbÆÕ2-ShƒJÊ¡°ú…[UÀ#4ºžƒ[ÒªÀl­v€ãs,åzCâÆµþ}Õm[8—+·Ò(]ã`RC‚œÔ;Oi½ÌÊs å†Y\­Bå”/o ݪZä–Šˆ7ä‡Ç;ðϽÕ5èŠ&Áwû‡ør oŒ’ WcˆQ€f¾óðA?Y°òË u’ͬväI¦V£ªÂÔ¨rÊ& xŒßv·…ðñL®SÔ›©b!$$Ñ–›¸Š_°©’¿Š_0«yb˜U\’÷Þм¶Ö⇳äêaý¤8RÏ\aUé 3e4%…ÇŽùI©±’}¬¼ŠK9é<¯uhÑ?š£ìƒßßèÏòÒtì0Å^ “dcChÀ5¶ šÐ*n¿N[S=( À¬ž>ShõÆï®÷âLÊ÷+§¾;ІRËú”W3㪿v»C­eÌ5g ÛN+`€Y`$ðŠIxHK3LªJ†¤Ð&Ÿ Ä}mñ_í"™²ŸGR¼Ñ!X=ªh'J Ï2±U”Â1VA3uD)‡ïhK³EÁxæˆþ²Ùq1„"!Z+™aœ¼½¥aOT¨ <7µË*¢€•ß°-#)„McS€`ÑÍ{Fnmµj€1’k ºñÙlÀ-SÈV­*Ù-e)ÍFJ§sñï4“ê¶k‡ dä\f›O“qܤ‘ׄs²~`#­V ¡—a+åSå,‘ïÚ#{ñîä¡#îÆÇ»¼ñUŽÓSšI¯=b±™´¹¬öwžøC(ìgv‹(S¾,øAÇ)hÍð)ÏÑ_pGcªJcJx4W>îÍv^ûMi»8ÖÐ5ŠÕ‰BâqÝã³Öý;ÐCKsã‰×Rå(iNEHyË’æb‰6¢¥îˆè§AJNW$ Á§a¸á¥ïz…³0òb5üœm;ŒL—:vUØXD+’Éß\ƒ˜’CoLÏÎÌ£H½‚B/S§7ô–MpuCKè¾è]sÌÈÀ©•Œßœ&Ôj…Un‡(wòž°ÈË׌{)ì«6´ G 9åëW9ËŸûQº\p½ì–Öã?ï9Ì]|Ϊa}y { ÛØwo‘Ç[ÄìåA±ëX©jÀãz3¤-‡r‹hcðûóPØKÏÙ ´^ÉàVR̬½†1‡IC= 3&XI²U¨S=þ ióÕ6$,½«mìÙ<cJ¨®V3²¯w!AÏÅæœ9Gögœ°1 ˜-Õ—¬Õt«Ñ³wô®‡p(j7îЛF¼™–Mµ°S@?iCTmdEÚ®±”c[¢ê`Žû JÈâvÜ«üˆ'Ó× “Z$èßæý’ä¹ "KËŒÓϱ{GD9š¾ò¸­(ä²W‰ÃíµL+l@ ' ŒRzÝ.©Ã0/“㓲x0@tRh$Ê”éæáMÌÀ¯ +òr rñÀ)Ó–OoüèWæãéÑ¡úzFÚ`,á´ý<­†€eȱt2:”áU8“@ÔvòüœÕ(ÇÂ"Ýn1æ³õ,HÄ®‡2ÒN-¹6)1˜¡‹ayädFBC[ŒH('¯&?Gb×U5B#—4pæÏ1ÑlaŽ~+–Á#!µ¦,œlÆ…XïÒÈÕe_‚QÐ2¼Rh»])=k0]•_,:p®|¦Ô·¼FwzúèòâÅøãó½_ý +Ûm—fW(~¸eÛƒ pI‰ k…Ó’çîÐÜ}ÃZ!nw¤‘ABç"~\'­ŠŠ•q;G茳Ð-‹ƒèFØ&µ¹RÝU-$9θn®•‹¤)uµ3a>ú@) øÚHs/ªô¯×—´h0¥á¯á8Îq5n×±—60”Zìî3‹æ¹Ø8ªE´BZJˆôŽi¯ð£E4qmã­½œöÕÔQÊ9øi¥Æ>Ð êÄ4?îwëúêÂk¬Dòµº™Áìy îË "6/ùøÉ«9Ë$ÕGï²AË*“33u¿¯ç }臰D•¨ŸzÓÉí[Ž-R.ŒƒèŒwž>ýÈHõgÿáßýʯýæ“O>½|éÉÑCzÞOPõÍ*ÓŒ4[wOT½CÒÙiÃÔ­ß «\ÌÑÉ´´DgÍv˜gTÚIS×l<Ÿäam%ê˜ÞŒ%̃ „ïªÆ0ãí¥Y³ÕÉzÏÿ¾ÞDÝ×ï®×y†M£¶ŠÄOòäšsø—Ï~NrÄ^|+4  ‘; IDATDG+ c>Ë”·¬å&¦¥³@)þ[2p˜SªñÉNÌìëŒ8´S¬ˆ Dч>ÛÌè¾¥ÕÇ!ú}X­i4"FKG.§‡r(y Å©îÑË4ܦp‘DE.í‹7Þpɦƒ^øò@N‡èh¥ìÑ=Z‚–zW'8Gl…(؉4d™)—&ãÍÉ(„Ž£»Ï× ´ë•O}Å Ïüi€s´šð¥¨Ùñr­O o.ÐȤ¡+¢81s"/’”V°x'jµ„ ô>J/upñùªÙOóMçÆ³ ðÊt(ðÎ~µ¯Áµ!çJàÕR½Îb@%3¹ô÷™‡µéEyòø™\º5îûúÞmYŽ%6•N>ÜñÉ| ÄÚRêÄpçÊ™×µ+„•û4ƒÍ„M§g pÒŠ³qâÛú±¡µmsgÛQºÐ5 Fy|á,céÜùf‘ lË„;BŸp~ìëìØq ’ó¨ ‡ ¸e!Ô”…L/^\˜î$²/Ìú~>>^ÅO a¦`ÆL¨Òbh_ëô6šá™÷ßòu8çf§°ð,®tÔiX+¬zÖÙ[2™uç“ËW/õÚã‘ü|@†ó`ÍQ\ºÖ‡h§ßZí'4:gËó}P –Û'¾4d÷Ñ7ÑŒ¨ë±b»æ'ÿëý¡îÁ}¥ƒ:|{×ã­PCËõóVŠ[½¼xyþø¬_¿ð€ùåÇ îoëyM±V;ˆ¾}óšÛÓv~|ñœõÚ‚xJ’v­:O¡¡d`¢¯>;Âi›KUSxP9‰€µ3ܯy½ßçÙ͌Ӥ‘¯0oÈ÷¾áÈÓNÕ<é‹´]9Á§îԇ¨¶Í¢¥9è¤>3`ÁÄCXGR ;¬M¶îßoŠ+ØZè«ÉÕ4©vTÂiÞŸñ›ÿؤl¼h||f£4ÀÚ.‡ ÈK X=í+ýN@˜Âžñ×GºÌ¤I†÷¹|.1D19.Áƒ³:§q÷VCi1@ÈÅ&n€ôu{\iF×–@úú¥°bÒÎ<ãk­mÖgšLt6.D›áÀéöcZíMŽºkÂüɬ›±€I¤RxLŒÍˆ¼ù±E,±ÕÀ4³·»Y›qzÀ¡*,Ím[!"ä¶ùúô#qÝ ƒh,pxRÍRB\i‚@[¡ãç‹.¦Áp¾×/ ´že{"×Êü¤É%ýS $á\Gúýßý!wTB#1(E€Ãúô”¹÷ùÔÉm§¯L°Ì|Ô{ŽîųeŒÍÚ±óNܧ äUA#\LÏÖ² #ë¯èR¯  …¨3ߢ|U4@7šd)¸,i%>fÜÔ)`€hhuÓ²Õ*6q›Oéà´ù }j“n',¬Y•kFZâY*nÁKƒWYŒá ó/›¶É~#¾òº^ÿs0”Å¥´‚Ä„¤’\ºän's‹Q`’_À†t£ÿdø Û¼Qw¿¿ ŠOÏ~üñÇ"—‡ƒ}ëã·o®>ô¸Ô{16}P–m/OvèóŠbÌÉ4é=w”½Cï0ìóÝ>5Ñàcòh50[Ä>)çðN? CÀctøã®DÝéõ1¥=é×ëðêáKëTïã—3ikVb¦b¶ï(*ŸËÞYºp†òšÎU¿WêSåj ‚Jh?¹@y`ƒdì4ÝIùF.åH¬o-d¨Ò¸úæ¤P^¡™¯|:ÒëgjÜ*Çà äà8à™&Å ±WÒj=`›h5W±¡ 'v¤0Ã.Ö9¨ÊÁ۱м he†OívÞö³3Ñè"´¹j«\˜ëMCyt¥- ²ýÎ+Òm[Ç¿jÿ ãÛ–³B%¿"?ìÇ5g/Fó}ØVL—=¨v–"Bíì 1Z×EB†+VÌêæÌ×ô«z Z %t9†oná—ÀHx›c ú'ëH°µ*ùá?%àmDÞ`QW‚aéV  ý3ñWMÚÃ8óiöÂõÀÅÄãÀ¿Ø A:ž›‡êpa~üP‰´(nÄÁð—ÑÈB/î´ÅxUJ†Ó“ë·½YB?o¼ùÚZ_@¼E>£ òÍ/5/Ð}xÇÈÒo’óp6‹ê!EË8M°*TÃ?¾]œÅAt|³Jp«Èo¾þŠ»žŸ=¾|Õ'œ V‹cÁ÷¿ÿýÿô_þ+õ‰ôpχˆf Ûa Ô žñ3íEôâŒ&:òÈØü ̲¡|kUé ØÔ6»Œ½Tt«V¹B­èsñ¨•nm£mcRÛ‡S¢wÇä`«Ã¾™Óî2hºY­Hƒ–n}@$?;.–‰û|C-A–7ªL{ó“ KÑÌæ`…˜—wE%™i´óÅ_èæX6±¾þúk¶xt«²0Û)©].'N½´\kÏFâõ#×Êz̪p3šgÇYá5Óæ#Ì^³QN@.3z®o0,ŒÛMnq²ÌkåW®ÐÉm÷…°ÇÇà~ueIŸ7"Gxnãjè’ ÌFÂUÑ6Ak¹ÒŠ0Ã#O>㯶©…0'9€Õ€cþò×0 é_y\¹Š+¥Ã6š\qÜLqnFëC…ìbbâ˜G„FX`Z™5ftÕ9ða‹Ž…F&A”íN¡q^B€(À´ÅZ,麣´dTµ;šh(¶qw¡uÜÎD‘_ÃÉ".6üåÌj!—dÔNèÈëÀàV"ã$˜†Ÿ\$®xp58?º6rKè©òMŸ¯¡˜`¥pén+,(€y(]G =&Ʋñ–€ïüV²gÎmãùžµ‚),T÷ïz=¹¯<>yúq~Õ׈:{Œõi^¶Ýß‚€ë6Úîdw5€1tÁÓts¦ì­O·_‘’'/t, Ķù .õMö««—w^}xã”Ô½‡—_ùÅτŻ神k_uðÈœñ®m›×W—ÆÊÏŸ?>ý´^óÖo¯_‹¤¶NŸ?8=¿¾íí릮ÜÃsÛ¯U]s0¼Šœ½wz‡”·üĺm)_æÕBêÄÁ«ož}•ƒ>ûìäì#¯½òäÑ!¾9yet7ë$…}ô%C)BlRÄB3TÍX5ý äzÉ*k,‘ë§ñcø^t«ðhã ŒDlGëðk¬Cº…çíÆ{ °MZ ÔÊù˜'™gûª[fWùikþáyLÌH k<)'žõ»Öõó”PtVu˱Ñ*É€”Q(ãvK\•,0Ul$×Y¢T¹’ε™¡ùK+ i% ÆÃ&ÈÁÉó™:|Þ]+DU©NÉ 98¬ÃÜÚtù¨êiÛûðz ›DΣÕ‡ý…j•æÓÅŠ2ßÖùfÉÙ|»„"ोŠD"œÀ¦ùf’Ú­ŒiëÛ‹Ù`nå¡Ú·0@(áP¡VÚ¸I3ÃÓ4brÆK6×E·[®ÑóŽš©h«dhä&ùm{Ó|¹BZ9~VÄåÓŸ¼ÁÀ °×ýôSð?ùéç0C¢y™Güê–_6ó2(A}š½g•ý4 Ï´áâå›|ßéz4FŸšCŽè20W&èÅ|‹/ðz'ûsdêa#æuØE¢É6‡JF¡&«aWi%BTR¥­"ôý‡Žs½Ù¼ª€Ÿ° œÛ&¢YîØ4j‘>–ÀÉ’`(¯=O4+n!–„ê/uäÀ»…WSº^†„hú¸«5¯u¶ˆ „„¹ÿååë !ÑŒ–a[)”ȯS1±@éÑs´Î£÷A·êkÞü›ŒÚŸOV:Žgf`;aØfâT4ã9$7*ÕÃ+šk4†ÉÍË£æé… Ÿ£ºa­¡qÍÕm2±=&iBÍ7ÒòEîFQ2VÖ3 Õ%!ô¿B®%.&9p]  %US¾~M¥Èµ}Þú¹gƒ°Ð7&Û)u=“Ò •k¸5d®&p¢-V ¤ÆQ¸òQ’ý§õ¬ ¨À§–‰â–zÚSêñþÄb”UA¾€n#Jþ Ê-vÜ\´ à *Wl€”Ù*Ë6B*Ò*oi‘¿6—!0öR%!Í©hL¹ÛÆîÖÿ~¢×—™ó…ªÖ·—„ÛvRbœË «ró´}ò4‰™Ú.Ÿ®«+ä¤ås3ú匎õ¶,´Á?ÇêÍ É†ÅP¸u¢@º½c:K%"ü˳ÉZ G3á ¡þÞ›2˜ž õ˜`^ ¿¥4Ä4VÚHÓèaszö‘â£Mø—ôúäìÌÏ„é|ŽM0«T=ˆúêg_øÜ['=#·nñããø’gFæ[θôLò]›3ÙÆÂ7í¥Ê[U.D]{ù³o®žùw·®/ÞÙ¶sHI4j_Í`ç›ïßþäOÿØ6ÉýÓ'¸²²¶‹¼¶!!iás¥Vö3@c»ÍŒ¦,•H<ž‘å]–ÁÓš2;"Nó%P­hÿºrnÕ’Z^´oÀš7–›jxl—y¿e Ô QMœ,7üC…ØëùñŠ~¡¤n Ÿ¶íÆ”x(B²xX ‡(ÑÕÔ²YV¢H`’.  ¹j˼þ&4+¿ÁâöÌØ4qÕ!6ÑVrëºzˆqzDa rFth5³…ÈEc•£s¶‹™›‚ç….rŒ˜±þNݸ¡LN8›%H¤Œ}rÈ`å zØ-q  Nœé$ÑB°æ2{•Ñ O1ƤÉU·Ÿo k=T´]ãJ2º0ãG¿ÅZÆÎäIja6î6v΄[Iº*2¦Lµcꕇv+8Àc¤Â#Ÿ1¿0ÈBuÝ!*˜öÌ{¦©0Ôà*0®7ÈÍ/./® ,P—>© kÙð?›öaš?Æ7WƒÓl.^ª„+H,é×Ä…_'B+fS]là }xûÚü zùø£üĽG+”óçþß^}õãóO¾}uýæ£óÇžÙXtû¹_u ºIoÏê ixÐi×ùáÜã–ŠìÔ2¸¨È+Ä©!'^:\ÈK *-“Ñ}[sð@”éü¤A*[þ݂ю*üëVy]4žz<9q‰€-qÜzSc-xlÞ² ùµ`åã]2,²·ÞþQ¸]oÄÉ-£Þ‘‰ƒAcì8À®ùŒ[aècËܾ7ðÙW‡b»„í`–7 Ø êõ.Ϲ¼Õ‹™¡ì’Àä÷í ‰‹ˆÅÓõ2Õ3ä ¾ìUwõG%`4d#|/puã ® ÝB®¹äv]û5´ ȹÕ%øòª“ÔÀ›®7.gP·qÒïèA%Éï9`x Åƒ* ü ù+Ǩƒ˜êÎhØWæáÜ& •æåÇO°‡GÒãbªŸOgúƨƒò…wjl¡™]p K_ZAEMKNž8(ÔsEKª¾åœL³R%EÂ3+¬Ñ¬¶¸ºãc8­#gǤ*¿Ï­° SÿQ†¦m¨œ–FøÄÉr‹º¼ë~ÈÇç$åР݃nwn RsI•<3íð~µ-*G‹iVÆLìó1C?06åx¸ö ²nG9ÛÇå‹3窫NZ%Œß-“!ÓðçFÇäSB±ŒÇ^Ø0)÷(NàW&Xné?ø4é.RZém8ܘ?cAŠ®³LÇWßRœ¨xâO:— Jƒ^’'?Ú¶îIkFÊ`„]­ÆS•_^zX¹ûÉ'ŸÔðêò‹Ï?s9Ë×ÕWÛbçA,2bïNú^õ«KŸ«Æž€+W—›oü"éêí›Ëo¾|wñåWóŸýµßZõÑå‹go®^^>&.ûXýßü÷ÿç¿þÇ]|öWgwß?v¬¾Áï¦QoÂ3FóhÛܼ©Á¹uf0Éê£Ê4„ÌïÌ]íh¦`Ši¤njÆU ¶)ÄJ=:µNå&ˆa07€>³¾¹„¢’½ÂƒÕ­]ZÃo #HVÕ34òÅUï¼÷§$–U*ÑP+…—/_]]ök-™•/·HHJ\A"M>Á*qýƒ>–¡á&&ŒÏe’‡È §Pfó"!°ÕNÀHö?¼éV`òÍÙæ/ýK`nCâ§âì%øVµÁÖ¡f?¤k€2Ÿ^–j[Éc’hn™~”¸•–ŸÍã–ÆhfeÁ-` Ãû¦(& ·o¥2‚Æùb ÿ¼ÇŠ.Ç  T¾óÑMcÍéýƒ“û?C³Ÿê¼|åAqJÏ´œ?ÕÕ^¿ýðàìÌó.³ÃG0LΟے»45{÷ÚÇ6eþ¶Y IDATLj–|óîõùãÇ/žÙò9?â-ÓGÞt¸¾º~þ“³g—_Ù:¿wû±ÙÑ“ï}÷ÖÇ¿üàÃío.žž×YÇ«Ÿý÷[¯ß¾xuõãÿø¿ïú§ßûÇ¿uûþùkÏ1ïrIî啬–uô®!ëÙ?óe‹Ÿ»ð®¾Æ{XMЍ”BÛúÌÛkß国úÎ$š¦H7ýÐÇýL[}ö“/:‡;ÚcQdVMÍý0‰—ö½bå[8ÌÜ’ÕwMê":ÕìT±0ü :ä6F2»uRÐÛ—º(Gìô£ö7×JNîsâ÷~üA™~À˘0 cZÔ‹ãN'¼ºLvC1êl/‘qºV †¶x¶`Õ­SÕâ%«)Õ_½¾Ô5”õH ÷(›ŸÎ+ÀjIÊoNž?žÄ ¬®wÖˆÉÞ¤õŽÁ-oºª" x”ËÖÐ{©®õ“Œh0!¯y“9‚ö)G÷=‹ýò¦~P4¥…Ð z/ÈÜ×DMô9ˆ ²Ë&§×Ì ØgÉÌ)Þ0ÊAmv5±l禇 ¯DWLó’<²ol ’†œùCÓz‡þtážCŽ®Ì:Q§è®å×¼ƒgÀ·ß3]ŽàÒU¿‘‡„“O\Â2ÆLÜ{ò-jAÑŽ·N:P›y" ‘™k+Çôv³Uý\Ÿ>F-}W–PQ+eyÄ,äƒh|ʯi25÷ÅÅùU;«nBY+Srjy××h´ÅÓs{W˜Åî'#¬AŬ`2bßiÂêÒß:äã÷Y2nàäåïí´‰"$µùz§‡ýZèéãÿòþç_ÿ­ß8{pþÆþ‘1èêõ[‡-} ¦m3‹u/Ìræø#¯¡ ñX] åXï¥Zslí¿SØìç¹€G:®ÅÁ‰C NçÊ8…iˆ-GtmnQ/ÍsHcÞ£yC×þI?|¼Á¦ô÷˜Q9í®­ž«:u_Ϲýá¯þò¯.¾ùìÉ'¿¤w¼vŽþé£|ýì›}†ûý÷ïØá¾}}÷äìâêËÏ~üg¿ð+¿öðì#ç OîŸz™ÙôÝflÎ³Éæ’EPaU¾`LsXžFeÖÜ|Ý˜Š“Án¢A{éóâvq”–âàf`VçúE«ÍÆ›¸Ð´—sdÒf,ÌÖîh…37!¬ zÓ+\@äÙÓ½wjol¨2¼­ip2ó¼¦-M•ë¥þ©ý@ÂŒ«%ñâ›çÜB·ØT•<å®N[åðµ>>¨r™Ö÷ÛÑ—SÆC6ÓÁ'øörœU²¥ä!rñ¿ÂÇ|ä-$8®d¥|Š…ŒV”£' Ž]‘˜TÄGù·!¬fGq0†Ó6l0¤ýqÉÞls¥ž¾Õ%ð]Oš0DxºÆ˜dP\ñѯ¹÷ƽ呈ÉxH]$}XdBa–Õi©Q{Ò(ª…>?á«HÈ3‚ „Ð’®˜¦¿ÌnжÊíÔ [íqïSF9l‹A¿# `‰.Ã@¦©Â#†³cÈçRÀ¹Õ„‰æ1Òc‚´ä ·f½20II©Ñ»= WÌ€S0zç¡ÅVú·õ•µpˆôòß s¤‰}ƒ'1W:È%¼«…Sí–+Ézþ[»b™ÿFØhiÄ+ôJJú?~ôoþÑÿðëßþö/]\ !WO>ºèC¸¾4ÝÛ+áoî ¶=dV¨„õ«ó:a¹ñ·ecyPÞ”ÅUR˜ æI œŒÑ¼ò0‘s’Bµ¥D~GArÕ‰úˆqãý⪓+Ôd.ÔB#oöí`é3I{!Î@k˜œ‡ce–ºã 4$2xnŸ]xs Ÿ§-ž€w…-JÃ)¨dYÝ|s¯{Áí'tê&UÍT&¦¥¼eºOÖh­}×ÿáYê{¨]ž€úꟖâ8sK·’ØF!ZÜII^•«òmèºåŒ‚.IHÐÅM„Äù:¡÷ Ãvüª»Ž€‡Ù, G-°æŠcµV×ÒÞ«Îù¶vuˆ%$–1øÁh(sÄÐÓIµhIÚ¡« €Â•Ñíæ·pÛ’Q¹”¡&Dx΀^\ÅXH­\ÆyV-+Ô IK„c3¢Ö1§MÈçk>ò"•Ã3¶öTþéŸþé¿ûѾýÝïôI4³{""Î9Dz6¥ÐNËéïwl6ኌB¢Ó6cYÏÅÚÚ-*˜! X׸?k]jW’ÕæU³Çgç:þI£|$ug•Ò„&°­ZxA“¤ãÇ`Wd¢i%o†Qóyn Ÿé›i% ÷ Hj\ÏLCÂí̫؋êrN8èÐðM.máq»I~¹¢ ÆJðÍb[9;¥Úys}d|˜\ƒvêƒyäêy.lna+ú»±Ð¢2›úˆÒh]¿“£Ëä@¹³/ù´Ï¹ ·÷è»×—·_]>×êÕ‹o¨ØjîÝ«‹'ÿà/®®ž=½|wçôþ£ûu™}-”·O¾y~²=xLg¿õÉÝgÏžÛÛú‡¿úk—ÏÏ=ãzpÏ¿[_üìÿ}w÷ìâ닇§Ï/Ÿ~÷é½7W—¯˜s>Uÿ>ù…÷¿ðí³su­»c?¼kÁz}ëúe[ëbÊ›wj7wÖ9-ᬳ\óYÇÑuy yÉf’Fä^…¸æè3æÑ4ü³²)†j¢/ø@ÙëW-Ñèåél¶]hV^[…öäÝ®ñ\CuÝ€Ê>Èqb¶%×Ì®`ÔãüÖº÷1ÕÏî²ô`¸‰iÓ :9… K™PD8|·QB¹fµJQVøÍsÜ(^ÎãÖÜ µc½Tså|H+„0æV!a•¸b^ „ú»Ù O)ÌÌ0£©5kejha³ò„ —2>Íù m%o<,3®PA»â»*1Ç¿Æn1÷sÞŸ¶e1C|`,»’*\>Ýʛܦá¼)²BØu ÂC¢m²l¬Ò kgìÃmßé·G ¡–in쎷Í+ŸÙÈAÏã¢sp‡jZL·Cli2@ Št]àEÝ̬Y@®aˆÒû"Õ¶™· Â葘żc¼áe(*×jí:s)ÜíjÚái)?î3‰ …S¹d CƒÜí»¾1¾‡Ì”SEî³a(?Á—[¼ä3//„„¯¿ûoÿìg_Ø|tê#X¯µçã-ûil¥ÀÞùÓ'ÔõúµOe6¨ë$-9~»N»ŒéHé2éíø¾ !é³3@Žòסݮ  ºm¯8ÜLúšÅÏñÖÆLó?[!JP—÷DŒ”zìÏsŒ:u=˳áÿpÜ›NL¤Í┘‹B—ˆ‚t ÁʃÖh;cÍÓ€uùÏ>ûìóÏ?÷Þ¨3Ž8<ó›¹bvÆ3óåÖ&RÆGk×§Ÿ<ÕV“ÑžImH‰ˆ€B¤-^ ß«M3~%²ªD„¼úÇäð¹ÜúM{<3Äaë¸Ü€Í.4…QL*¢1ü+áe[®~åc…|FÉ\ùps#Àܦs1‡jµ =\ReNX „+ïÀwYd YŠJlëâPT|ýγ¾Nõ¬ô­£«0 •BÇ®ÛrõS9ÿ"÷žp™„V4´É'fKœ#W¦ÿÎlÌš‡A´"“1ÃŒù‡OýRØ/|ò1ëÛ<}õòÂ! ó'ç,O†‡½>F[¦"õ1’inr}uÙ÷‚¼Ð¾~óÖ)b<8yrùáêέë÷—ßp´³þ¡a¯þòÃÙG÷Ÿ>ò}¼7/^ØOùì¯ÿòÖÅõÓ_üîû;~ÿÕ³M_Ô´h6ã{9Œ'xß%I¿•Ê­ç‡B¸4!v÷;ÏÏ6¶ M4õ#;Tí]´õÚt¸Z¥gŒyz’âL‡ç$ ÀpHóܮݮ™[N Aާ#ž“±Ÿ!ÃLßlz4='—E1Óvš§ò§¦9MjŒd/‚Ñ9Z‰>-!Øad $É„sÐbÏ-Í{z«o“Õ7°srÍ«ëXÉùÜÂßÅ Æÿlj…wb¯R,Á )“Gãu‰©°'{í7ÑÑV•2nvU±gø6,Ú¾âKL Iû©íšòÉ"Û¼—ÒC[X>;).ÏyÑ|àM—ħò¹ò´G£ÞT¡Dç“1ÕaWijq%¯óì"ƒŸÅÜu–UÓvž%Uº,-PáaØ8lAA¹ˆùY0Iv`ÜÕQx•±ìéInó_“¦´1JÀ§î®Oœˆ«¼ÔôZCê€x&µÀƒדüö?‡[HCíc+i‚Õö̈î€2š6Ø_&ÎÔÃûöQ¾úêKÓª¯¯.Þxcðâùù£ÓÞ˜§¸[¾·ËB=úºÿ«;íÑ,Éû^{efeUuu÷ g8$E‘K½ô [?a‰G"m~áïdÀ°_Ú/ ¶ Ñ‚ée’"gØžé¥ö̬½üûŸódÎÀÑÙ·â‰qö8q"nܸ€ÐŠÑ–Ï›õ4ë´gTö¯·O-ÝyÿÚG”n|öëïüùóù?ý·~ç<ÿùOÞ~|}óóÅ'ßûüý»{×m+ëÃ>‹îR 2DU"GŠÅ”(øÔûDÅ+Æ=Ùx!JéÍ¡Ñ(ánZêH~Æ2Å¡¥~Wõ§w×mÀ×V²ÔÙÕ&Ü”¤•4R54#‘w6Ñ©L©ê˜Ë"€ÖU7ÖÚÚŠ:~Z’5írkZöÒœÍ4³?ÀÕ´c´íΙÇšC´ÍimÙqK9Ô®c­C46OVȃL"jxFé ¤¸¦YïeÛ3GûÙ¢Ÿ ³ªq» sú’F,j½Ã;ˆÁ˜ƒ^2ü„Qœ5t5®›“W[ d”¨&Ãì•Ô|Ê'Ü™Ç1Ì ïªiÂ*paÊæ į•Òq %nM+ºëÅí0*ÜjïKÛûZã±FbñX¨@rV&`á@SÞ¬ér6ŒÔÚοH9 bCãþôýhŒ¨¡¤nÌ£2AècFOñVòK›÷¿T í`ü.¢q+ý\š+œµj¯JÐ õÜSf@`ôXEã÷в„Ù~ËV¥éêK[W¨‚kEͱ¬ðéNý¡Çð“y“Šu4ùé–æ°7jCK(à <Ð<Ÿúêç?ûÖ£ûñ£=úöwíÐjüw6·—- _¿æÙ…AÆÓz]‘Ðt]@c9(ARÄÍJX9zgÄ”Ê<ÐáÏ]Ä/…ðJšKØ\{’Ðk€`Ä]WI[…n)ÁÎæýüÕ&pº«¦BÀX{×·ÌRcý‹p Ÿ‰Ýû¢E<ðÝèJÛR Ôš,„%ƒ×TîX Y ñSФÍkˆý­é>\S åóþ„ùžÌë}½€x<]ÒÅhÀ‚<É(]?F!ƒ%w÷áÔ7`e@2vX¶óA‚]džFÆAMqRpÂç'U¯DFµ†}¶¦~…þØóÎ9Fró GÛ(4ç7)šY’xN¨c,¢ê‚,i»ÌMàSGž*W·jæÿº6ãÝùU èJ6EŒZ5_¼Cê¡ýICÉR.#¡ Çê/^Ê»ªí Ž«„A GéùÉ’%5ApcÊ5ÜjG*;°F/â*ɆStÂGÆ +¬††gÏŸÍ.ˆTOþæˆo.|ïÅão¾~úøk/í íÔkD¸Q j™HË´&¬Úzˆ4…ègán­G¶ž4ô@§²$_§0 bc£+m¾7m×o/¨†_e4l(œ=Uf\xQTAÂ’t+ŸÍ'F/Ãõ–’DªXêXÅ(¨%ˆÑ‚j3”äᑤ­Ú Q˜¸wÆÒwK â–Ìè4Âü*Ð=¬«%Rkx$L8»èƒŽVÅ’úµëgŒàòÀ¸ý賦ErsdÙFšºâråtæÑl[‹J«fÜÅiÌòiSd`•“t9Qn+–ïÔipR¾ZaLÛmÜÝeûCÚŸEÕ xµËdS?©2ë2©' ÉÚ"¢~òÙ™+­Ôeýd…ò™~‘Øáª2øRÆpa„ByºkªÑÃAÖ…žzÐÔW@Ýfäã¹rGïá­¶ã_€C€~‚»~]”žÝ;@bdœ ëZV,Ñ1M "¨q„BRW(#áböí6ØO ¨ã Fñ\m'EÿÒíÀºÙÊæNÖ&dn «>W‚_B4)¨¦ÖdÓ¶³rŽwL!•/b³èí•À¶´·í)½Ì`£'¯‘Jºþ4yS±:ò`NÀp˜ÁŽÓe\ 0›“ÕÝDðÀb‰‚aÞo2ZgÔÔA—žúïTs%㮣zªÐTM,©ô¥*޳ž ¼aŠ"„UÐÊ IKÆÆë Dzá÷NpýšÑY© G¨¹B ¸ÕÇ(ÒþtM"9µJ$3UI0RÁXiÓžI£î9tÀ.Ïko_yïöoÿêß~û7ËË9÷ïÙ¾G§§÷KàRG†Ds|8¡~Cìˆ1‰1¢ð€©2ÿ³glfC9ã™çl/vÓE6÷sÝ:èsñuO³쮂«úq=ye¸M ‰íUkÒª¬D*“HLEG3cç±6ÄdDÊG\ *_}ÉØ µ OÉ:í j†Ú’š®îÒ(‹6 B9cV®‰Âñ?ô€ËX—iA¹ª4õ„&^l#vUt×üxêd8à{dø­'º4 X)‘­¸rLjú=2\²·Nç¡j Ùǹ幾ï]™œÆg*ãÂu¬+XÍi8N…éhh*¨ÛÂáÈ|µ¯|+XµT‡Ü˜æã[Vïä¬ê a(?Wpº5£•Ÿm‹Â½±¥@ÀxY¹5zg< Èn5Y-²š—´ˆEÂ!1¶¬tó¦íÑó ë½7ô½ç…f}ÍŽxGjÚ!;F&#–w„ÅI‰>¡‚‹gOŸ\´sü®S*½1@j<ÌÖ°@P¤Çc{)#`Vï7>Ú뢦„w~Ù{ ¨&¹qݤ?a(3m€SB_¿ €&ˆ†Ü@ì±ãްõkÿÛÒÕȳÎH™ªMÈbGt­nŒj´Iõò*¯éê{KÞØÆÂn$ä³ ?ß{˜ &@¹%Ã;òód#&@¬p®„&Þ»þú“ë~¾¨]¨³ï^•òƒ ‰Z¦‡ÛQêTÅÅ2¤C²b#ºa÷~r|úàÎÑ=ß¾`ÝX¼8vqö¼Q¸§ÈmÅàÜ,Z—ôµfkWççÌú¤¥…Þ$?»}ç Ò‡©=xÄño}ÿ÷|òíóWOŽ~Ëûþ/þúwçï=øõ[G7½ô†yM}˜»ã˜Yôk«2ŠÞšLK²ÓfrsxïÚ8š_Æ'Y€@Ÿ¬›¬6gD Ý’Åê[­‡±l$!yµ- ùÊgc‚ìÆ£€—GÎßÉðocpírSÙ«ÐÉ,s+­ˆÓ§ù~i©uõqË\CJêggŒ†ÈûWFð,ƒÉ sÅ3T ̧ $- >5ŽfØÖP ¸¤µ A¦YôåÞçù [î#r耗Wœñø0qõ ꨠ¿©pé~ ÚüTn¨&Iôìè´[€sGä`É›¨ìº{®Û–ö €1ù'R‹4€¤©†Hƒ„‹´^8,ÇAî»éÀ–œóÜš¯…·Ü2dçå4ŒÁ–ùן¤bM/Ö5}ÓºŽÜ@Ž öÂF0ˆ+F+oñ)O]ØU« Mïéå;+¨)x:ìh¥1©~xgk#DhãcïyyíÞ½O}rt|xÍQ¸±JÕO¦M{p½º8ós¬²…¥&’³¿s7<$6Q¯)Ú¸e5×fæ9ŒüÁ¨øø#[VÄ¢¢wöž¥ ¾´–g7þDu IÆh¤Î IDAT•XUVA+õ+™Ädùº«ñhÊr«z%]{¥wêͦܖoUŽ—1o„…¨m‚fY:Õ‘QîIE\áB·b“’¥–ÐJcê@wó_üàÏE°sžïPóFñ¥„ˆý4ŠìDíõù™À ¬j†Ä"žÓÞÐ*X|Õiç½¢ û½ÇxïÔá ^[²%œW,Êìa 9øÒ–-´f&olÉ/V¯„Ü}yöúýG1ÇN!½v˹g7nßýµoÝ}ý©ƒHn\{ûÍãÿõù}†þÑ·~“3cn–!ÆAõÞ)­z:JµLFPÿú¡¦…  ç?¼×*¾ÓgæÜ¼ EEÞ›¨3°­ºÄü!Ç`9î8ç‚â½NÊ„a*‹? FY95dâÔˆ»YÓä½Éð ê,P35l7 ‚dgÉF×ÔôjÒVm…/®©/ŽW•±Á:·H¯~µ'ªÏNX\C ‘$ƒ­¤ hb…ÑÌ­í±… ó¥^TÉ À:ŒÁ⪕ÇR uË!ø.#m%aÈe~·oÛßS4`u^ýlvàAèuÆÝÃpÇÒ"XÔúéÕz±ð+€sôf¯Øù„x—&[½+mm ^hv¼06a‘ÔrûæÒ¤•ÔùÊÐq£¹-†á…[ëòÜ)úÕ‘„×Д}»ú© 2.‹E‰Mš¸1Ί陲šîReNq^À¦&„ŒžÐãÆx}›Ìã–“‘ç1ìÄÂ᫯“ë/±Â‰÷¸ÌuÚJƒieC2›dZ›!ý‘m&:=—º–òƒÇ‡K+¸úlUë­¡£Xdæ"g\G¶‘Ç÷È1£†#Crka }2õj´ˆ¨ ÔÕiùA•¬”^–r¾Õ0¿Ä+ٚˈºõÒy¥Fˆ×zÀHl€äOå‘ôt|A¡ Ifaº²ÔD•jhø )öÐ3F8Åa5ÝÊ›ÊÅE&³;ðJhš`M¹×Í&£‰ÁO€uïôÞ0̾@5±x/2zg¹KžŸ3 ×O‘­ øjÊ ÅÀ:±4L [ñ&Ò*B+¯¸§p³)¢þ´óÌU¯ŽæZñršû Ýb\±Œ…¸küJR–:FI¸+2Ù:âBsæ »‡9½{i+âŒî9´I~Ù½Îùã†a®uOß­=Ûß|ÏåèÄ‘ÏÏ?yò kä7 EÌéz%[-%Lý ÙF¨d1 äz¸ÜAÛ‡ûÜ¢$‡¤\£B¼[Ü:>ºÇBTÞ™¶d‹;m±FBþ° £Öev‹\Ë 2ášåëˆJ¤úûtžžpÀ¨¯vµ.²'>µEêƒÍ*˜ ý€À¯Ÿ2LRØÎã'ߨß>›@fž˜hÕIÖÓO@t~Ç‹|ŠÓ_&rhveÓÂ0˜·÷ÿÖ‡ëæŸüà&®^Ìå×™LÑf:žÕû IÊYƒ¾Þ@¥Fç1fŽímyçœãB¹è~ïû&½‡Ü[ GN‚&ÆfäÆ+×Ç">¼{}n4sž–Ùf"¸)€ó9亟eX¸tB^q¦wnÜ{è|¬ë¾y—óµÿFìöêʇŸþÆ÷}¡Ç[ŸðX$ó½ò££{D×ñþìåó§^øöª£ÎŸšo\ëŒ3ëQ¾K­?Ïf,\дBb¡*õ³ÚÆiŒ“ƒ?¦& ¥ZÖ!´èÁWÐ$Ð*Æ*’†Èªyáô¬¥ö£ :¸—þæÍëÛ|:{ÕjÜMú¦lá¦!²•ŸùÔ;ï›»{%cd"qÐXßG@G³nQ ñäÉSîšéb/›*NêŽÄ B‡©®î3–-ØuF†>í@d¤›ÅS½6h\ªK¡Ã£?Œo…`&¯ÍoˆõÄM1³†ÿËÛÀ×ö@øŽ™ ¿½c¹ñƒ³›[" ìh ïúâÅóMB£¿ñ±Mîeb¿ˆ¢y$øš´ÞØÃ;#º&ºÊ{ñÌ8ìdQ£¸iÕ4‚ï~{zÏ ‡ïRñõ Šþt*ÕjÃ&ó<U×`c­³⨎‚fËRxÏÕÔ¿„ßÒ#8ºëè”7ïß¼rpÓAHÍcðpNLߨuxw¯É´VÛŸ‘?³Ra߬5‘›Cq¯Ÿ8=®…ÎÅFЦ°j6/.\i[$1ÜaAä”èêøÀ—Ÿ(a6ì,ãéÓU¢ŸŒCmÙå3Š]±Ó)éa¶%!RÕ›¢ÕÇÔÌ£NNM×LNHÀtÅ ¯ýÉ1U½Uúq—³ì=qõt.¡sÃ…u‘Ö9oÝ}ùò̉WóêÀGžÝ¹$d5€£‚ŠÈÕÎ鏿ÈÎÌ»ñþíW/žýÆoÿ;§Ç^ž½`rn“ñ›„_ˆÕn<]ûÏ!‚ä™éâÛ§rs·œøê8ÓÃÃY­ÌÀ²Gw:Œj> ôƧUs¦ ^hú཭O¿mÊeÞÏ´éçý»^¢Áébƒ¤o¼±tΊ™+á}§Î _¶ Q䤦 ;깆mQÚGñV/5g£#âœFÆmx6¶eÞÊ9nå|’ù䌧^bíýاžØsFÕ$ýzý¶êº,.Ö\ãì锯 4bÿF&ƒçsœNÔ›ü 6Hj|š8¬†cºO¸«ÙG'bzÝAPŹvVœ––ø#%ZuˆXöõ¦¢\g˜9ƒ’‘ú´@æKçh¥¸Æ»†!ØÚ¯æ`õe=Q™ ô\·8Qg¯& Àþ°øÆò‹E‰¬ ›T€ÑÖ”fP½cYj¡f™4kgc\Ý7>lн—´&x¸Vw9C°èa† ùÓw 5'“"©û×_y!`=ù.˜ëúÍÛ³‹3ƇŚ­¥FÌNG³¡e¦.¬£‰_‰ÿtØé ï7 ð[ZáÅôÇ[¿ý•OÍÙsþòâ)¡„} ÎšñÅë³92a«ÙÙ -êBÏÉÁ!b%:ÓY Šyì˜,Õ¶Hì;ßN•ëY^ŸVªßñ%Ö×Ìx†šE?³#™…{äŠrWD¦è1§ÂîÊÁKtW K½!ul": P‚Ó 9ÆAb^i8ÇĹUÏÂîˆîÐCÅB@ëóˤ,}®ç×çyc+¤(nN$« A«¼Ø3rнƒà0JœÇ÷ì›—O~ñýßû÷>Ý/öˆõôøÀ‘9¯ÏmzׯõI¬‘,)“5>•±‰<œ¦Õ1zòRˆ~õT6ƒ^t€‹|æxòÁ‚ ê \3…™ò"x&OÖïâ”FÙ4Ï‚µÜ§d¦­|¼góI ê£caC‘gäm¾!^Æ_@;á"Bª¤Ú®“¹•Ë™çú£.ë¿à@µªŽwvÅå˜/‰ùÑ8 ÚèH¿qOßCvõóú†üØIn#m?—_”lÿÇ‘s—´=«å ‡Š¦fü)T …ieò & ‹[Õlp¾~(G4:â,Ý£®Yø[OúvÖÁ²d3z1Êß+h*¢AŸ'=…LK‰âNA‰^Ä`z=X¾¾Q¶7´"•Q¨ üÑV¢ ýŠ+¢^Ô£&/†…5¨cí’)÷4Ù¾£ŽrbQGBØÚ•ry„Á¥­BwWÅø¢8@¶Ïê§n­ãÊ„{UGLd5{Å¼ê¸ Á ’:J¶pﲂͱ̵Œ­^Ã÷™)OG@øÌ÷ÎEŸ†À'Uê5dób:<ó1š²-"MÎå™Ô¡<Ô—dó}khñÛbз¾ó[G÷N/^zwX¬ä°ÄºmáöÇ''§>÷{úàÓ[øO%à¸ò•®¸å õAZS‚*ÞÅ:gÏ%©gšÁQàôj®LÑĈ6„qW²óã!]Q0TëXkò£¼¬}ð&Û%ÃÕÝn‰ ÛÑé†Ä† mý@• 8“Wˆ·² &”µ íëNªÁ Å6ôS~Q+áà•ÔJÆ]u(–$ÈA|~…łÔ¥­/‚¤¡Vh^ãQ" †ˆÑ3 Ô¤Àã1B4Ôõš@¹ë_+:@£å›ÑVž.¸ÕWNà9„iÈN×dz8ÞQ5Îéíœóc’XV§9 $§%GšXòÑj†U? j§aóôdB1­ÔG92& ;¹fŒÔœ0-N˜ˆy²ƒwÇ}(Q»Àjý”_ù Ìò'kOÓéB³"¤‚ƒB«ŒJ"EB@yŒo©ï—ëÖý=H¶úÐÆ#­W“š¬÷¿Q?žŒØÖž=ûæüìé˳g° I/Fsž¶›êžsµõ™¬²@ckk~£0[ƒ¡)f&Š:âIÒþöAêF2Á é7Á1¼{„×i·¬S®%Ô‹åi4–Éü²‡­úª¡P‚HfPfÆ/57Á¸¢ÐwÕH5¡}h~*ø¥õ‚£Ý¬™(l]\‰jW?%:Bf?oݤ/õÉ‚9mô‘6D.4%ˆÀdÀWN°rZIjº¦Gb0`1ªMk7ÿÙý¤œ‰OË%h~9˜éN ¡h±ªânuøˆõ3çÕ\…·Ýë‘giÆùüùs[uD:žWî˜ÐSa¡E7cYë:­ˆ)JëŒ5MîiÂ5¿xöìÎõw?ûëõõ“O¿û[,M÷"à±ÍÁh—/+j¸€ž!#é-|W”º—¼š“)<•†×\\:¾ˆ¶4'ÝÍp6^hå³^½åü æÿ‡q±Ã&•B½tâ‚ô<Ì-äc¥v‹"ï–C€Z\Xj§iý +a„-?ÖÁSGÚd$‹t Ã2Ä s/6IÒ—ù´äÀ Eÿ20N™1óüËV»½©ÿìÙc²#âtº£ãÓûâ…#à=pœ'Øë3g•1Fv*d¬£“§g,ň(má`xÑø7{t ³T¡_ïÇ¢8gžâåîPˆWwœ„œGg³Ë-!'±9¸¼/ÃÁ8:Mȳ#YMÖ­Z<Žy_‰:4o[…ã¢ZÐ:q­NÃÑ„€1*¶ >Ù¸ÿ&C «‚¸€ =’E”F•Kw9Ð:YXâkUTâöØc…™ìtà)ëÏê/_Ì‘zø±3×Ux#D†¬—+ E +gv)•ûl×jÔ¶½­—sk;Èûâyà<¬{÷`>‚¬Ö—çt‡¿‘úXDaÃ"ìˆ2âµî5–À9 ,bÒ›í_Cž¸à–÷Éë4APºf‘±#ôö5WòVæÖ°“ß]³ó±Š™ïj)™u¬ÀÑDåµ,·‘¼†üjýt«¹âišçr±‹ûÚr’®ÒtÁ,mêïJØ’@ÖŸnèO vtžèŸ$SîW:øÙ-Gií¡ù`õP˜³Œc©] Ù»èqWšÇ¯úÝžAò9‰!×Wi0ÓEœ.®›@cÌàÓNºžŽšhEž+@Ã5Ñ °ÁMe8Û…gÛpÆà}úä1½'‡K!,ü+jkÛl'-ƒ¶ÕäØLŠ.%BÄ€¼wUªÉ¸"‚=íg]w:CQ‰?%oìURyg“B4°&Ò‚U™e T{€ÎÀAÊ¡“æq‡.Kî.LõWìøbcf­>°vwŽÈ[Öåe Ûj Á©¯.Ó­Ü?{öäë_|ùâùó¯¿úêÓÏ?;¿8[?‡*m¥w©m•#F·äYȘZ å‡ëµ^Q“€Íåîx«OåšþüÛG`ê`®„"qß·Ÿ”A᳂}³¨¾ŒÍT…± ¢E5y Éf­vÅÊ+Ôðj6`éD'7U e£?ÌÐAÛÉIÜÁï«s³ëço|çµ%Ö³×F ›÷Nîñô×ïžh`Ô\@Š·|Ñbè]‘uëu}üižÍcGÂþò2Ô5â^e°¼i‘&š±ÊÚ†î®Âh—YQ“Úhºož#©’™[ÃF¢°A“IÒMëIñ­@çR{ZÆBÔÌ”a\ýD̼}Ct¼Ÿ-0HxD°®Žk®Pfå—»Ú: ãþ}/ŽøŽÒËóó³>zô)ŠÜºK …1ôó¢ÊJ`…02ɘÔw•Ô‘TÞ¼¥ 9rö Õh¾u\¥„pX(Zt,8q¹ªé.ü S1²Vª‰ÀX5·s¨¬ŽÕPµ·êëA›ñii†TI…ƒh0€êŒ§k5ža#XšÊ¹ Îé@çô\„¹E; ÓO'庪 ÉCëØqÉB B À¡ûÁÎk‘ìI5ìA“`ù~NZ:cÄÞŽyk•?å á?ñÔž*XfŒi<Övw¦µØ@‰#Ð3ÉO(Ñ6<Æ›vDt•‘7À±èw‹Í1¶/Ï!ÕéÛ¸Íù^ó-3“ÊŽÏ…€ÐÍ£gí:ƒ%+çÎ7ÊY2ÖðŒ º-\ذu÷ÖW_}üðѧŸ}ëýë _ðÀ¡‡80ÖöM_ ‹;\7ÂëpD¨Eã T W3 gÊ‘áŸf ýl¢¢*ß3s÷~;޲0®*Ü~dŠD{+LwSñý2³)“”µ´ÞÅŽžAwè­‘QoÓësÛ„dÆ8 m7Àv>›~ °¢c¡&’ü쀮L{]. UKÞ¾È;ÉÈKplzɬ瘫äµXç,Û‹†æÙ´hÙ‚…=õ6£Ùbé-MqFÛ„[iœ-®¤]²¬ŠŒQ2 ©)ô£D}øäTäLz‚§;'÷mxkÿ`=\ß3"šºÆïôéóéÕÈÆøˆ+¿0|­èýÄi‹ZæÍó›åe…+¯¦ûÕ™ÈC[ãÅ`œt#siU‹- ðÌÆl]çSë-#ºõ€êðéëÛÌ^†¿ÖZc­^2k=U5$¥pgÒ°f6BˆÔUÇdŠ2‡¼ÌH&X‡¶1¡ÇBøÙj*W誠ŒàP “>RªÂz|¢kú ’ü; V~ªio!F+—®ÒU!2ø¦‘±äÄè$ƒÎ>*º‘¶Ë…Œ»š¬‚TK"Xȳ_$?*é)†jâIöëh(²]âÊr†¤šh©ÂÖžVx®j•Ô¤‡j_~ù‹Ý‰k·t` Ù?G¹5犆–r[õÀ&Œ[ß³ YÛéÒÑŠ‘©2¹…³” @†w$Xš]j«|9."QŽ;ü«,)ÙK!,šl@OËp ÀE×­’=ÏIzò]Ž«Y/ñ¢V}xÕAJR [pÓn}}Ï‹ÏJUÆ®jðÀJ8ø6*©)!\x&ˆÈ­§™©ß¼ñ¿ÿÙÿö𓇿ýý঩ˆ])9ì.£+ʱILŸäª3q\#È Ržöf± ÂÔÑøÀn%¥±«é’uÜi½rЋ™+ª$•½©ŽMR“WÿÀˬhcaQËlå­œŸ ¹»0 YïD Aé)~‚F úmÙzÏ3˜7¨L‰P@V¤Ñ>+‘z.btmäðøïô—„€8½yàÄ -#ɘìíÓ$ÜÉË Ä/ù‚9­ }< ìY­Ëf01&R l³‰ø¨{ìî]ê>^cóŒN…Û·OòVá͵Êä·'Èciªûñ3’ºùh_ç¥Òy„ªž6(ß9?÷±¤c 왢ˆ­‡¢ƒø IDATØ>{nšP ìl†N§½ù¦—|>Çpl:½ñÞ¾ýó;7%PÙ.¨Âf"T£Î„SPg¬ã|—gw%”¨¢ßÝ(XÄ‹BRÿê§ü˜ ÁÒ))Í’ÀØ18{OºÇ©³HŒAÊG=„ ~scÒ½{Ž {wqþÒÁ\²‘mòX™p >ÐUцÂzi´‘¡šè0rtîwLĘDŽ€ù gµ•K†¡ùÙtås¬íºïÁ¡ô­r\à—¾ÄP~jrGªÝºæSUJlda0°ÈKƒ!jå™& \¿+JÈi¨ £rìT>ˆÔòhaKùšÐ‚U¸¼‡ŠÃÔÁíj¢P÷`ÔEhÌÌ}Ê6fœõ½ªm¤ÿ—”Žä'h2JHVTB@Û_ü¬ÂjÖDMäE3Î÷A—ÞØ©#ПN+ú9õ'oÛõ¨è¦·\Y“ ¦&ºZüw ë°6Ä, Š%ĸ"{¯K­Bõ_Ÿ7mE ¤¢ %ôxÇ7ν 2 ¹l·DÌhÖ„p–lyá­É;ošÿLŸ}„¦{Æò)8¸ryÅØáñÉ@…Ü+çt©òäÖÑ ó‡OÊ«¬Øü‡,Ñ8ÇÖ8ËÙÝ0×Uâm9ǦH€sð²Ô`zvq!Ž3Ѽöêü/ÿò'¿÷ïÿÞ÷¾÷½//¬wß½ýìB„—ßtÐqÚŸŽcÕOÃ$?j’ Ëx¤   Å2žïПºä5¤-óMŒäãtÁ­”fÛÍPŽ @Ö‚¯-²LPè@B¨‚ŸrŠãá´Žm¨„^\õ 5•o\Q»*ËŠr뜺ú8•—dÙÀÂÌÈÞ’—á†\åµÚ ˜’7½t}å@ÕŠÄ>ÌÊDA[ˆÆÆ¯Èpx90Iã]É„< @“K–›žI«Ï…K yoí]·¯-´Ëë,a× þIFÀ@fª ŸsÐP‚ ºU~× ¤ã‘J‚õN„ò†ÄÉ}¸V}Ë]ô §ZÉ—ŠC}MäÛ‚Š×ÑÇ3¢§…o_b{(‹©³4ÀÛ,/ƒ/I^Ú¼+íc y¶ÁŠô Jk‚ñnAŽHzÀþBÒwu|ôè‘ã“p¤²#vÃe/DŸ: ~ß>ÕnÅ9à£×À“õa¸i8vªÅñIo8¡RsáÂÈ@l”ÃÓ‘AùüQV–ùÁ± ’†®ã4…5"ï6¢_À窹 ‰‘ÑÚkE 8Ö혖®^ß#RsKý¢sƒR–2 ä%–:ÏåœÛÏ%•ú؈Íúø|° ¸QS- Rsé\Åi2¢_}ð]— wL{ÌÚHÌDç‘èìFXìhSFèXàP¸“Ö|y(_:y3%ž€£dëRª]ŠWX`ô)Bå-ùk¥òé½co£³g«_0²|F%À:µ¹ÇDZTäoF+Sx.±ES`5ÇS—Äšž&â]/ézÝúX½bY¨Í<À¥7wq„ø¤‚ÚÔ˜LütUw]ùù­9 q:~è#cÞ4b9”w*xßK5–ª·¦Êgçg^ˆÚ÷ïOï;—N×.~Üx £:¤§9РàÅG€½BÈ~¼³nóûñÑ©Þ×ð{óæË/t„{'q=hך)wIM …†M¼m'ä5ª2@*C—Ë`)h³ë qT£Æ>fH* qƲ±œl[R¶ªç—üˆÖ´¢l4ïkΖŒ2{lªi€Ù³GI&=Z\ãt `¶îÞ©?,Œo,}¿~c±u‚y†ãxs¨‡¤ÆJ4H ÇuÁ¦Ÿ«N>OqQ§p˵gµ7oÚðMŒœš@ÓÜÈÔû:ÿüȦ{)tôJéÞŠ4´ˆNí¢kù1Š8/ü®µîp¦o­ý´ž%Fá%ÏÍ2gWÙëJ„±˜Z ²ý‘3’y¹ôˆ5dö~³¼1Æ œ}ŒVKXAsfbu”­°ÿÕùë—OŽn}|röúúÕ9qNÅû7ïlµòžFáׯ‰ ÆŽ€jª@ 3<!È‹E×o1O.„â®ñO%Q‚|’Kù~©É'örI¡u§øSA¿Â¹§Îå4-ðY¡0ªog@”þ›%‹3˜»•$†·?.œNO üªÅD¦¸Îf{™ˆv\°Ã‡Øœ@Ò„ŒáÆxÒ´%oi¯)Å{fÙ\÷Ó–ÊR£‘2r2"žÍÔ0Ž noß9¶„n¤"Uºò~´G+ÂK£¶Î»V Ä–À‘‰<™+D¤ ¤ý:ð>j#sR®Ï¾xæôšNj©Ëµ`vݲ=UêMH¤\WX@P_FÀ¹02E•Ájzt[¦ÔáÿFø=Ä.ITqнóNœc;Þê–º¢þ~ øDz/ʾvrzožË7ò1ÑÜïõëÄæ&ø¤Sr¶ÞsÿáýWoX½€À)>>Ÿe¢ŒK§9Fèa5ig9–ý¸ª×o¿<ûâGùû¿ÿÔÍ9ãWÏŸ¾|~ãCÇ'Lø8\”¯í&•æI©†H­¨Ê,Сcpe{™P.-0äa±ÜÁBF ;Ò-ûÁlˆüÍëÖ6+Á-(ØëìXW-VÕ„T9±ûÓ#Ãzñ치ËqJî‚31w†I ¸Q¹Í:ó܈ñøDÏíµy0_8Ó³½»Êçõ!EÞΫpâ6¿Ñšºe_F$ö“=Üî;n¼=K úá£`ö?ýmv>ab™"[i@W w Zµ fvät”F£9g¢ŽE¨Ér„!ÿÕkÜ© ‰j$ïJ¼èÕ„ßúX—Ÿj­Ž¬è&tö¨ZLObíû†žéžÞ{À÷ uv$eP`¶óЈ"Ñé,H FÝ×ÁKï“u=‹ÿðvâ;Ë[,d0UC ¤Òf¨TáÙ¢ ƒîÔ§ámneM%>ÙÕ €e<|oiHjJâ:õÈ|Üé8žÎK‚ä|u_@èm@2¡1ÒI5®ßqôM'³?àÖ,™ëg˜4Ò±kTеSÝ…žt s!yÏÿòÙ|Wy,#Cwð“Wd ÍÆ™“SQ‡ »Œ—GA娛92Ûy‡98ÄÙ<³8ƹbmž6&b±o#Zz§8«†9½ÂföNÉÔÅù‹€¾. ¨cÏ蘫#8¹[H:«!_[Ó^;©àôÇ^¯½q|¬ ïÜRÄ;±«ÌŽŒ¶Aúã<¦ò„ÜëA3+CÛsœ Êõ&øéŽ1ë>;>²Þuþ”ó1Nv¼ï3Ý9K4Ⱦ?ñâ›/¿¼ù_þé?O ×o üuhÈqÒ4¢Ï íó@!8V*cbQáïSœW±MMØ¢,%çÚ`áÄç§û³9&¨ë-h;±²—aÀv|#EêO'“ü¯sÛGx܃œý1²&8u&ÃI‰úÒº£³”"_ìižÌùÄt–iº+ûC?.XôÃicaüÎ:g…~/W ¶¤!ðºÃí2\Í‘ŠòÂ$§ÑvEO*šˆM·È;O<Ž5âëá ~Ý™Únem@."¶gJÿ[F`Üú@¬wTc¸êc‡MƒQ¼ÓRQs#dH‚žÍ“›r%~Â(¯>úuHNPFjb¦dÁ}q¹ÞwQY‚шHŽ\‰ÀFÃÆ  z]¡ A¨©hZ„k„§¤w”•‰h #]wu€‚w"ÉSd¹¾¡žƒľhoÌÎi‚)©ó21T¨´Z±âºœ‚:BÇ¢He{i3ék×|óNuÄ+(ùp'd' {t1ô_çsý;¶“±¤«©ÇbÜÂÒ\xf£1~×p =s7‹ºÒBëv4Õa3Þ»Öow€Ü¤™L¦ˆ2-„XÀ pçú8³ê``õù$©bšÂ 2¸Kv2*1³À’ç‘îaáÁcËËtºß€Áj_3À´ C}ßW[dÐ\_MI€õå—_þÚw¿÷7?ùñßýÝïß{ô™¥1ÉÞt6–ï¶U¦cX° ƒBÿÍ?±#á‚[0P«‰6]rkÎNüiV²쮴j­í¨@uægs?·TÃZ©ZÖ*£æ#O’Å”÷ïãåñãÇ pc~j(„\ùø©É6Ta“[ ËoùÂ4(¡á¡±VL 3k÷jà6©|66m+Wè¤\߈kHÿþOÔ‹~ÞwŒÁ›7:×÷ÍkÃEŒN OAšèb”,£ZøF;2Ãx;G—‡ÍU¹ Ç9dä ?› †•#·Þ0šÒgõë‘d5·9Óv'‡Ù5 îš3¨FÂx+êOŒ™&Ú#Ãâ„ (”*œ„žmNœõˆvªYN® RGZä¢IÖ¾dƒÐ‡÷­¬¹šq1}–wU•ÉÃ-LYí•A€]ð$ ·E Dtš™MLLø&á¡Ê: îìÝDÈ1{ÙeøEs0Ü G•^‘>!vцÉ-ú¢MžTÅ©[ý<|ºã1\¦d¦.ÌênNdñˆ;Ó ï/_¾ ò„w`ׯå{ÏñÌ~D e{eµ¤& -8ÿ\éð+Ž»eã¼u¢™ç«†ËF!ʦ׬f•€Þ©4 )JÿVsݤBTMòQQRÁ@$ÉZ)S±ðL×FÊ>%¡o$ÆúÛßþ¶¸Š}êx»}³'¸Øõ$v÷@é#è “2kë™48a;8ôlÒΉW3׿uë¤ÙSM[Ie]a¡Å€[ïž_01ž:n¡óαåÍ£³‹óö¿˜ùv!/£{Üö?©³+5©¢«5”pŒ2vÓ{((ÿÎw¾³£)¸…qÜ¡_Jˆ5›Þu]rEªæ*$0™KÓ¿¦›‰Ð úØž—,2´Y )4gX³û’7i23¯÷§ ã#n bnXˆA3Èæå&SFzÕ¡êsÑÌ(Ì›¤(š TFj߸m¥1æ* nQ«5Ug5 Ú4i=ÞZÙ_°';ûÎ×ìÁ°jÈÄ=à~.×J’®ãpòJt0,Ð+ÎüyòÙ“ç.®®ÛV+&¦Œú[a¢IÊvo2.é}=ïfPãš«}¯Øм|ÉN(Î$ Ïh> T_ûÄrüŽÌi_¡x'å[ÔG ’ ¤Ü9H¤×þå¯nñƒ1+ÚÈl‰Th¤¡Æ›·+Ý€1ýzî¼·…Â>»NµjåJ¤VvQ…ŸîÊï]dh!¯D9Â¦Ü / ÿΟW†[Ü©ü¬5æñ1…5öa1Â×ò„‘¸ÑŸˆ²’KªÒ&cÓ VSd®çÊu|Ü‹ñç6Ì6±³äüü“O>¹NÂI­=j*§›·"s9Ì d?ØÃû¼&jë¨ùå[·|ÜÙ’Æž5È@tWxuÏÂØí“}²Q™^ëAï^½eÁ:’**¬¾4ßuJbïþaþ18–²:Ê5×U}ÔU¡[[‚*c!šKÛDÉOuêíãÜš*ùyVå J6áZ9îÈI‰Ÿ®æ.hØúà m1ns T^QȨÆË…®‹µX‰_ä`ê$¿Þ ^X°7„¥*™ÕSbʆ4lÔ–›´V·¡×¹MzjdB ,m0vˆ(t à‚LÜvnÍúzãå/åã–:Mþ{½©D ‚Dõ C®ØèÇÔwƒ‘ôR<É€¯²]9œ'òž®^Ü)¥ÍìÁ®^<ƳÚїРšúRp/G?åq=ïì7iQmD­W–G²ÌcûéOÿVøôÓÏI@9˜ÈÖÜ•4Œ#x9¹wßokóš¨ 5 ¹u›|r±íÇ=.ëðM[ßu89>Õ=ŠGtZUsìs% щ`à¼J7ºkìØNÃÒ A­±ëCÇ¡„IÃEqáÐ#Né9/»ŸÜ†I6kS4è¯eÅÒ<ž-mÛšB)‹œEͺ?€Ê‘!¶ˆbtmhñ߀»+²½° “›¹¹i‘®3HŠ aÆ ?EžQ`½vàk®Ðu.åJütÕP‰D>‹KMŒ»»Äm5ÜU‡£KIµáX÷¤KiÆS«pÍaÜCŠã&lÑÖOF7²N±ÿâ½.`©ô{·]?ÐÕÍþ= Étœ$Xá%éz:¶þÅ:1ÙgšÀ4,(ߤ:Œ®~.czÄô|/…¾6Ž(ް¾³W¯OúòÈÆ®t;…¬ïf<ž!TÎøÿò0tÁ\i‰D” â*tŠ"#‚7ç31ºu@“¦S÷sisU %éi¢oÕdp4­Œh·Íu@V¨¾ë¦m ÌòkävÝóÄN£PCãUÉx^If§‰1@©à':Wu÷…¤I®dF/‡Ö{Þjãç|ÒDe jÞ†¡ÛEåª/_ ˆ™];ò½À—l­¶Ž—”Í(‘7CÀ!h+7'œ‰Â“·56ñ°BÏ·.}}ƒ fG q.À85­—W ]µb'S39mõå¥E ï¶Z"g»}ãŠU§fÚ>V8r/½_Ìi¯lqÚSÖÛ S«9 «¯|xë/ pi.£k{þë @cp¨›Ræ5u]È‚+ë  WЃfZöZÐöŽ_w]Ï{¦$?–)Vïo5¯D9&®†QƒöÀÖ‡š$ôl\È †–äq¨Ùዞú£E¾¦h_ŸòFE'´©Òü¡ç2NIe& ê´ne¦ƒ:3Âx|&&Õ•¡†-¹D Çà-ƒöÙ£Gî!Eâ½Ü@¡ñ8n=}úÜ-‰e>ö””HŸ¢• "ú²#U¬ýJØqË.t”}öù·__¼zúøkëh/_<=>ºóøüS¤ôm»¼“¼Ñ Ê·ë…öGJ íÉ0Á"@‰š“Ô¢¢Yf VÞ-D[YŸ9ƒBwÃ2ŠS…¸²•›ë ªmMMÐÌ:Oõy·X‘¤|JòÚ €¬þráŠÈ¢æâR‚ðhï9vñÖü̳é¡~Jªÿ0t Ø-tb…J¶&8"žý µ´ãý4]sÌÒ·#+íUœÛaÀÛ̘Ä}Öõ$<ËÀ¬K2CÚÇV9IÛ¹—V>?^¼ûpqþ‚[Ÿ/…<Ãß6aÝÂþÔVZ7‹ryå* BMÝøH}ŒíÕYà’ш©*ë ¨­Ð ƒ•ô8´'¡TN#I?³ IˆÜݼšÚ%Þ¼a…R^Òd+,ãòÉ—æ ›Å©F†Î¤}·HæwçûŸ:, ýé_°¬•è¼PãZÍã“SouxĬW¢M ¾T†Z¼.“¢Û/kX?w÷õÅkð#uÏ;">–2dJ ƒÙ$iIUh3*ÁÞrÔ‰‘]Cô‘ÈÅKÛO½ºxO 4å3¬ÓpýÂ#Á\‹"’›oå…ÖyÑ×áE'^°F~æõ¾hpG'/ánë· A–@^…ŒóçÃJßQÅICo•QÈv¢><ªj…Ì©C>˜{`gø…K5¸,‘Õà9àظ…ÀABØ^Ÿ®Q½ÉD"“;ÈMS÷ úlU$ü)4ë PTõtíOÿŶ¾ß6Ux‘Ѳ6#¨ ÄþÞige'úttÅ,)ÁªÈÈ•Z =¼ÌÖ»nÉ2êVnÚ¹ÙY - çé¨ßÞã@cQwoñj¨s]Mh¨› ­h·ú¼ÂÇë÷cÀ‚`ʲ¸üŒ£Ù³=½ni¹‹gg ©R‘ŒAmýd>ãÈJWtò®~,_ÃÑž—Úû‰=`Ý:ç…M$óHŠmNO&¬·„G€WöšN?Ÿ0Ks¥ k ±¥YboŠ—MZN“ƒYªŒÚ¥S5¶±®©iyX~Á]66,·”¡ÍÔo<Øacû Ÿ,ØÉ×ö7ÀKíºLß |óÚÁåTƒ=Ÿô£&ìãÝ3eÏb|ÓÕ²× Ye½Á‚´Õi߆2ÒÐhömpÍuüÆiß3ð!”Ûfíùæ«/ÿæÿùóÿäýGçÆ ß²¿õæ“cG*Úê‘™áDbÙó³äx¿¯Ø\±`ŠÒ”Öe©+€ˆ—a¶ Ô0ãÎ8å!êšQœ€r jB°*H %ˆˆad¢g™ÈÓ®u(jëçÓ´vA!RFM`AJ<á?—MWýÝ­0s¸ÒôG™@¦-QíN4k>ëX»\Ç q‘Ê®›¨`‰µ-×d»†æ -‡ãÕ³FÑ“¸¤d­¨µTá]eMÀWA'å—>¡’°o`;ßÁ÷gV­ø.Úy£ñˆÞØ›´48O‚{ß²<0ߣ(0"M $™©¶Á¶JÂxÑû¢(ŒVÌPb:fè!Í&º¾â„Æ:‹¾t æX°5­N8+ë“iÿ6ìR ò‡ÚO Ád¾nj%:¥»@¡[íR%‚ÛX±Ë(G‰Þ·Ä»›ì¨¶ø5N•ˆ)´kû@ì…·S™Ÿtމ­¨·ì;ÓSõÁ€QÂR …€Š2.©ÊêÎ&-µL¥Â-ôj;Lã’rc³ ‚©TÖŽ¢W-îr–«±`9ñ¨Êõ0åö]X/ó€˜C Äá…%ØWæk¤ðÔÑ€*7Ì’$)銶5³êV§òyT*CÕn®›3aê_HÒš¨,*Èòû S:ž‰b…{-³ÀŽU€‘-%ný‡s'o zÑ%Íâ&îWŸ+MZ®zÄ‚RÚêt¶ˆ¬%'·QlœUþÄxãXCòåК¼Ø‹>gÚ9 GòÙ-‚À_öÇÍäŽÌ©TWÙ¶¾!À˜a€èµpmÑìʵé¶zÛl¸¬@r+3;ð‚Ú6ÃèKä$@Ê#2㻼g ¤³­ÖWÒíŽ+"‡ëC¸ƒ/zd`aÓ­D7ËŠ‹üMïÁô½íñiíþÇ";ey&Iž#½ÆZf³wAád- gJâT´3dÄÑ!µW¸ÁYå¥P5I^P¿2D1ðÓŽ`Žp;:¡O‡Ýpß¶]p–GÔ°×¼ÏÌ«WŒ®8âgE*t+s6™kµЍ‰60B,”ÑZ=:¹wbzãJ¼F]v´Ry ø9„WŽ$©8B”³œÙkͯÒB¯ÕOaN‰[ARy¥¢ kÛè‡÷TŽ-¯ìibÄ2Ô­4ÏÛå“·¯ã:a‡Ó b•'$â.ª”¡vc† zuO‚$Ry†~wH2ùòK+¯T“Y Ï¥MZ¾b3óMk`Œÿ¼f”?¬½ºU8V “Q¿Ú)ªfƒK¡Œ•?º¨°/Ñœõß›?øãª+±Zˆ=\¥Hú Ã6cZo÷¤éâ\ð`afÖªù‚™ã\ÿr0Êg/ì""nRvk?¡Š÷o!âið«…È‹!ƒ¶EÀ¶.tå¯{#øZEV$}d®úoŒîäµ[Ê„FnT"L"=] „±È»«¦ ŒjDƒ¶ØvB%þ߸g×ù-+Uõ“¿xúøI{Gš4å Äžºçç1ÝmÝËœŠã{'ÄŽpÁ¾0ñþJÒ{vD•šiÐíIëp–’äS¿nëñS.6QÈ€•/õ=ïË£ÌáTÂõgp#½mÂÅ]ZÕL@!–±õSÉK”ïº Dé_M¥(¹:ƽ]ü=%u(S;,P ë½dß } ü×çç<:È;$ -)WRÂòaxUŽ…›QÓ­E:õ30·¤ ç.r•z¹žr½&è½ùOÿÉÆQÉË—gWqÖ5›^—,Њ ¦¹Q<|ºai Ÿ åi(¸!¸‰2uÌsÊ&ìããûc¡Œê °‹ñF°x„H´²šÎj~÷èÄ—iµöH¨uËk-€7¼ÏlGÖ(ì™ÙìüÍæ¢'¿ÆVHl(€ê÷G_¡v2S¶+\+k·&S¹šòJ€’Ù«Ÿ˜MYs4ÈÚW9=ËÛ[AóDoê¬æâËÒ !\¡pW2:â,éÍÄ drê¼(îð’>iIsdCP«HèàÈ §·ùfÝ…ëd¨#¡kšŒjr÷ ãE¿Õ¤wuøC »¤Î¨î¶Ç=|K×­H‚ ‘œçÙ¿™šEáC’vZL{®h&4Ó+Èg´IxˆÔMFV‡Uy… ‘ÔÛÕ/3b/zaª©3â-²÷ûÛE­ˆ ‚”Q2ïå:šE«Ã”qEÑ­b£…$Ã<¬Ã)áדY9°(P5.b4>èVõ€Hj"X 4·z_¦ý Q‡¿4ëõŽWö‚ì“ܱ1µIa–3 @i"Ch{4W®›Ó‹þ×g¨¼œ¢SgÕʉË?ü?þìöÑÍwOn^¿{ÿþ'·ïÝoV¾¢œJ2¨÷³ä™#YѲ×ÒŠ—ŸIiôHE%í‘í÷éþòIìò|»ƒlT´ÕIS=tnÁK<ŠN· Iî.ÀU(® ?BGÅtïê"•— …ZÉKÊÃu™üd * {¥¦÷ÿ³=%È` °Ð‡¶}Æ.#ò3±›>ÇŠ`ö2²¥…iD$GáAàW{á²1r}j^O*#R[þÄ!g»2{¤køÆó,3ä|4„Œ'h7@Dó} #í%ùmgLë-“[õçÆ8Q‚×ÞæI„' ÁXð˜ofÝÁê.ÉUxÄú5Açš…Ø“-²+NÏ]mFGë¡ôüé‡ñ„åõÅÙ ³/;D˨6bäkY ¸§ãʼééOLŽ„B^ß»y÷=9;ÌÆkÄm˜3¢°;3¢ñt„f~LÄ´á ¨1SSI:f¡Þ»i‹†@ˆ(­PëŠQ@Ó½‹á£Â7L&2/'Ι¨Ð€¬Ã5<ãVŸA•â'6É•qWs•çéR>ZžÔˆ•>è:½ÜS SXÇr÷ª}TÁ¾Åï ›]æãZ%%°÷œN'cLKóý@ö´UGÕÕùYŽc|\¼4ÿîìÕ bâAôhQu:k`¬TC©¼Ï˜EËM('ôæØ.Üe(è$fä#ÌpØø›Å®$“I5Å!Ÿ† K CoÔ5µa3ÔÖyµ½zÝ·róзv—äi5¨íøÃ~³‰ôb&Ñ+¸EÁÄB¯C•%7Ý©‡å|„6䆸TÐGâf¿ÿ¢óË™RÔÄЕfä~×ã$xf› 8è/ÖKç 8­e^.‘Â<\àŠ/1NtøÒÊÚ`.²u>uPÛÑ>''÷ï8e·'ιòWŸÐäÁA'»t¾)¦¼va|plf1–ITna¶“cŸe¨ß›í3e7 ÏÖŸ±1zs\dS@cÿ|©É{º ?°XôpÀËéX<(ô«ùiÑÀÿæú‚­¨ZÚ¨m&‚Kç{þ⛯¿þôáÃj¿{|ÿ‘öo}ˆÝWÆ‘äÁýµg¯ÞR@±Ô óÑŽËzñìÉ'Ÿ~þöÚ­Ç_ÿâ“GÙeÙ*G¯a$CE*áeœB·0ê“?ÿ⯾þÅ'÷þÆoÿ.¹Ÿ˜Bp7ó~;êLbñc>)È`ÒŽÚ„7[ImLŹM;TŒ Ê¡Ñ5‘Ú oÖöúÖu3(ö£›hßJNƒ\Áº?R èÙz²2ehð™§®ì MyQÌ©#Á$(AF«³áLMÔâTÍ1B^¾,Y‹x©ê?ð²=š{Ò}:aÕZ!K¯9;oI†Ûâæ Ugž²Nõ½,éÔB³w{ʧû40äÌf°±Ê–8ù‰»Ö Ç]üÞp8"S¿Íˆw¼P²òNƒý0ÞYzûñÅ_ ªÙÖ|Ž—ì‘JˆÔ"oC“–ØÃD»·­õ»|Zo1+'Q]ÊŸŸô˜!>å§âÝU…ê×L-÷ÇM¡Âÿš}ré¼"×0J«×{sâãcÞ½7lÍAšN3?ïñJ\ XàèÚ¸æ\,jуx1âN‘@•†±3/Ñ>7ÅSÛÀoÈ£T f*„†&E—­]¡'O;¡§Öœ§½\|g$éϯÏ_q·ì§W‘˜èGGŽûÚwQÛz©s2m,)j¤2ßã<¹÷àÜs’¿OO\¼ÂÔ1}¼~ëÕRÍØ¤û÷NÁôIcò4Á`ÄÂ9 ÓVæ¾´úöƒmì°á{h¶j{r١Έl[©ŽŒ_­•ਅƬ‹DËïß½öLÐaLú£ƒû Žž¥Œê’èâùs{°¸&ß#γ±-ðï?ð1ñäNg ³ø-ß ˜®èq…äiŠñBIt¼8ŸÉ¶ Èt>»&Ć¿*·‘ëÃ÷Ÿ~óøÕ‹—?ùáÿöoþÆpüé£Oô1Ã1’4›¼žÕ_Ã’®ª§[ €†+`Ô »“©g\Žç»÷GvÔiÐ_æn¸# mùôâÅË›?ø£?K¢ }#N®]?¾{,ú±Àe-¦{ß¡gh±­*›æ5D'úYdë AzgáDs#E18¢¡Ô1¶W=]òZ{’Lˆ˜æZg5àí¡o$4W>ôÊ|Ña¸¹fêÁ®P9OG-ÒH±>§PÒ–:òˆ!|dïƒçصQÀfÜÅïjH´Á«¶ƒkûu²Sâ–Þ«w%Ä9ØÚ¦fÐ]€éê³^–Õ”oŽ­rl¥¥uå m›ëtðÊ,Ĭó­þ ~J$w7ÉkînÊÉšümoJ4³­aYá>À@w øŒbìj à'P°/ïòRÕ¡žQpq1!Í\Ä#¾5! ì9USs4ë Ë×P˜²SG†ÐÛ1ðù‰T'Ì98tð¦¦m«¦lò?ÌMYª%.ó•žiè™Ð¼yÖhÄûp&¯3O%b…q:[€Jd–ÎíÃÛûÈxýìøDµ wf¥ÄýCRˆ²¢ {B›¥ì"GŸUT%%:T†…\ƒªé[ɪ€›€Ñ¨P@NÄÛ“²1ˤ´ô«3ƒ\ ¸ºÉÄFPhè.°jîOùÉd0öÐHSw˜Îåf¶½ª' …Ú"saéàdž[ÝÀ³/?ûì3åÞ4T×y¿ôÂ;Ym‚éÙ‹ç<ûKŽïú&ƇçÏ_üÿý÷á­ãC}z2Ù øîBI´—0fESŸBF‘þôlè±D ~üþkÛ²ã·ÿÞѽ‡{œ h|"½Öß-œ·Ù#­É€`Ç9JúÄ/¹›Q*%M"x0EBõÓ1~pZä N¶­Î¦$2³ð`¶l<[XòΓ¦3RuŽ åûv¨ÀÝ[³‡¬nžz¿œ·˜Á4 Zç^z(—èÉÔí/ú±FõUBĦ( Q2WëMªù N£Qæ‘[Ðd–_z$ã!jÕˆŽ­šRe™æÜ‡Y„»Ì>²–ÑhP(qÕÏýéÓ0e ͂ÊLÒ2B Ši›UÏ ¶4¯ùØiÕI5)éç)CZµ†m¿›,‹ "e³à$“Qk Œ|òŸÀÕ7*·7ôÖ ö#´á(ìÖuж²¢ÊŒOö/9 X ð¼ —šd£D¥á¥eKB”_ýn}…RxÇÉh¡¹ P~¨Ž“gX°u¼vK– 7@J„©aÕÆÏBÙEî÷z‡Ý *èܺZžØ4i‰ÁÏÏ^Z¹ñðá;ßý5{A-¥˜ãMr"¬.Âv&6®õ)fiëóA ~J+áµ9Ô[DâºËé!“JøBv5dëS ©CsSY|«æÛ@ýüç?wM²Bw±À«²šxA Q¥‰¤D+å1¨@+’„Ë-w{ÚFóšËüëõ¯~ò£ýÍW'ÇÇ¿ý»¿ãñÅý‡Å7ˆ(£Æ„³”$F[8dEc­I@b¸J Žf-\ŽjYêГíÕ ²pC&ªÁ±…æÕŹünþÑþçŒ{Ùr>¢LC³dîí½wrjÈñpˆÔɘšþf=f®êPÒ QFµì>Â’ÔôÎ¦Õ ÈÝ‘ˆ WŒ¢H—P¶=„‹Žíúúè$kNG/³3ß8„Õ'–Ê é%¦†,;!E£Bïs=i¦‰Õ/…2bâz²)t3ÈÝ=²V±®,±RájQÞ,€ìêð34j‚b©*liºÂtC\™”ž¢`H^+¾m`¶ð(C$Ct$å®ÿüÛªÁ•<;+ØûYÉ>$¢4{n æó/ÿçßüõ_ó±Îw|"+§ï¹y¶ðUÌ ëì&·­%·ÕÖDn\\`ÆYNœµd#ØY¡_ äªÿ"iá(wE æ’GV+(ºžÂL}ˆ#MVMÊHžLHÔnVj{8µêÝd­¹¶à»Êâ–NM,AV6v¼L.Ln±/µ.ïÛV¾ž_WÉ\Ç6{ŒN2ê«Ã—uö ¨cxc,œ7gÕ]O9ßxV› ¢¡„þTB“”»Kn®ü«¨;É!X§¶êÐ-­ÀÇ P§è¤›’[ X÷Wã.düÔ,—õe\J>¬jd¥ÚJ#àÓjKŸÞq „JtHÐ<¼²Á#ŠT ™¼ÑGì‹p·çÂEÔQ5GŸŒP•”$å›`iDžò+ú÷§Ï°ñzÝ›>¨*àXp%…Õ ÿ°{é®ç•ýÀÂ]Pïø–IuGÈ8kû Jø@î…59¡”È+#Š…§O_xOŸDŒÈ¢¡GŸ}ê)$ïì„U³Û.åÞ0P_po%ØÙÕx¤& È™³)Ø+éu޶’—8¡£èdVz•úã§ 4Òï¯÷»þ©ÇC¶b=1kÐp~yÈ…VhÃëÿÇÔ6k’\‡}¿=·×Û{Ï &)Ya+¼|&GÈ‚¹@ )ÛúJ~áð§`ð _Ør˜²C$%bÌ3½Ü¥—éžöïÎóô æÎÓYY'Ïž'OfeUm;‹;m‡åê¦RsßéH9xD ¨-ó©¼ qW Î÷} L¾{úç?ÿù̆{ °¦Öøt¯?ÑíE/_12þé¬ëM€‡ŒI…ŒKMʦ,Ùh·T»wîŽa#¿%w‹‡Íãi?-Áãœñ•eq~ËdÅ ¬•ߣ¡Ø=9oí²ÄÍsXØ·/4”–j2‰V•Ö ¬ ¸‚‡‡‚Š<ñG'ÛmbCÀŒaQæ˜d¨¤G•¨yºÙd]‹dl<>”®9£s×üK2§Ùt=ÔÇU#ý¬©biT %¸3+wÌ  ¦–Û€Ú£$ðfémN¥ƒ°—¹Q¶k2!’°ªCÓ‡úÕ9m‚µQFóƒ» i ™µÌ;»‘ô| Ã!0„ÌÁp(«qŠG¢Hpxš*sPÇút„™”ÄÐܺ¶É¸17)€à[F1‰æ”(8`ϸ³Û_B¡&«AÞ2™#ÓóA¸*ñOvÆ)f”Õpæa0±ãÒ[©& ¦=”Q’>ÂsÈêêKj0³=|¸Ûa²™†à£ÆUʱBÈXµ3ŒÚÒ!^&!ì1r/s£eΣ§¡¡,ïÑ×LH,ªá›aI­‘SŽÛÆÿÇcgã« ÀšC+}Nç÷»^F@nS™„Fõ÷^wg48— }Ö\P+ǨåýïÐöüy»Ôe2c‘¸òüù³ÿä÷ÔCáa@ºó Gv ©â™›zÙwÕY“tA¡Þº'}Ðäj‰2©QÊûÍ—ÿøâÙož|öãk×½ÇoœI+é€~Ö¬¢£h8á%Ïqq:EŽä’3JÈî`¶øQ]Fª]£^V#r ÷ð1àÞ¬Ù“ªŽÆ3æÞCÔò¯pä$ðŠ ±Å0n“o4‰ï .­ÕÔwi&£ï¨·‚&“àœ–Õô›«Ï]ce¾ÙƒÛÜÆ•×}öË¡Ês6w“H¡~€§Q¬À6ÅF#Çê¾ñ¹¶î.y¬Öh'»t¦‘9‰¤ÔM Ôj¨° Ãð 8֮Л¾è Æ)˜ýUp™¶ˆIt¹¡#¸%´Ú^` QIW4¶L}f¡¨ñÛP×°7&-:E¥0Ø~Útª¬UW[å/"…¤h¶ž‚íÊ8ñ§|´‘«£‘ao7 Üæ0ÃQ,3†¶Î$Y|Ó}‰Å®†ÎøÁ3ä^A„AJaSM©÷îù*@{?ì s+ÆZ ÄÎÉ·$/–“‡ë?¾“fÕïÅ‹K¨´2T €nnR‚&u…kÝnöÑÕyfšèn½½±äC]bœØ ,€o[È&YËÑÆ*ŽìiÉ)cüôftVÙ~½¾>\Îôðá#‹‚Ôb;ç™… R?Ï:ý$vlü¹ƒÖD!=NœÌµFó׊YèÕñ)Wû·îÀhv/øœ³¤ÄMIIhwW% f½€5‡ ëE çõ”Üï(HW\Òøhâ­!EHZ¹HšW3³Gòªá·HY’4øžþñŸüO0Ò/X ÚøÕ±Ðw†-»aR“J†‡M×g05ìŽy¼Rq$…Ì–g{9Ž¨á¦¥€1mgR8 8!£|e}Q¡A²™J‡a >#ˆÛ§×lÓ‘‡2ô$ì´½îÕ§úæÐŠûŽÊR“¾9&ÉE2Zvòo9Ê„Âú9€ˆ}4¯w› +~êU8œ†F²› spŽ™dÓM×¾1™ë´ ±5¯\‡Ôjì WËçQ© IDAT0²Â¦>õîF $ÅpRÌR¯†G“QDéá%Ã)Œ(¼?ÓŽÜŤMG¦ç8ë# eïFªÙéOŸ*Óø(pe¹…åÁ¯GÙ®Cj‘G#àÙkT*·†»—áJCˆÆw‘p`läAÛ=£0¸`昻×| vÿ¸Wh–Æ×%R¨þà³€¼qýÎÅóœ’;x£Þù¹o?_ó@‰ƒnN‚L]¦§ÖåÓÕbu5¬ŸäV-ùÜzsþõÕÅs_C½ûà±é5+0Ë£ÿ:ÑHZWÂdÕ3ß… Z×G± €¡áU‘zÎÈfœÚC†ÿ•™ø.„ù{Óñã“‚,ºÀHrn!Ú32I{^Îʨlÿ¸*5©×c7 M'½é zâ <Û|ñÑ÷¦àüÇÁÄë`p®qµ¢t‰2õz¹#Á°oÕ$u™×DNõ¤PpJñX…Gyê[NÆ'`T 2L*!á*Ei¸²h²H\b MÔ,d\ÕÙ‡âõ.¨P¬í¬ßší€½zÞ>C«É¶©~ -'D«F¨ g DÀ[¦;z@Ëñ¡[(k«•·IA»:¡mÕk '.­rT*\uFðŽAxr~!§)Œ8pH—V ÃbwkH:BI [l-x±£!)÷%_ï¸ùââ\óVáæ¡rogè:ÝÒgƒw×A”ÉÆš Œ¤ú…ÿà<ã9Ò^«Èú±ùÊ[C½]‚d·y|£÷¸áޝ]o¯"tûÔ4W#‘Ói±o(ÙvOEh>ŒÚÆSÒeóÆ[ÚZl0¹ƒ ( Íñß-Î"m¦G™‰™üKÉíj Ì£ß.iذwíäödÖóò ^ã6³­‚>ÏùN#´ö˜þþÝÐUdiÿÆIÏBÞ¸U Q„ßäM™ä¨»vW¥™bܪÇÿ›W½9¤V0åb¦õ‚‹Ï¥Í.1®ÅE«áÂû…y[¦–I+)ã§ÑNä»´„¶áXŸ,…Âõ+Ot¢ <š/-e¬jȰ…7…å_Yýâ_‘I@t+y¶<Ä3ÖܰëÑHÈZRžgz-@.®’Š&œ:,âdfÓ¬²óv Ã¶뫇Ωbýä v6Á~’½×CÛKž6t çþ¬šmCe3 e#½3.s¨ÛÄœºòAðêÕ "vÓ×PC'~W¥~]­D9ÍíYtžKø!4 äÓ½g5…Ó‚‰ úØ„þºzq¸Äp©'@R”¾úî;¹ˆÍ×ÃfI3Ó —C5p®¤. ÅEÀ‚ì¥1KÀDšê§¹{äDR×w5Gu½Æé““ ë@^_]ªœÜ,ùòòüÑÇ/ž[¢¿þðþÝWæÓo¿»÷èñ]ëo·oú4ÄÅ›d€[ŠØÁp,Höº-ýWõWÿâ~ʾ/žŸ¿={‡çÆV^¿V7D!ýN7žCK^–÷KΟKS™æÑÖaòá7œÝðjxIigÍtŸà6@g/tçÄO‡ ø]BfuijNM ]rð ­–Ô¡‚Mî:K³”ÕFoD·æB‚‰9KeÎ5Ýæ5.=âÿÈBÓÓ¸ûH¢ß6Ù•[A”!V`XÁé›]e>˜WåC´_Œ{z5†ÊËÁ Ý–1ÎlÉ=øLC”¶ZiëÀáÖ(Ƕõ¶™€m󨌢>´B}Ú…§æÎ§f‚‡P=V¡vI_WCµÝ󘫩OAók¦CuøÏce^¥‰ºJ3Ý*)ñRf2ÝLОøÖw> QOÉv~,«N—ôò¹<,jVÉzqí釔Ô#-vvãòêÜ›ëaN+wúº0r}JZç’oM PÀ¾n«bmÁf)ŠÞÄu!áÐO?:¹²_Šá®ß´þ„®²KòóÏ~ø¨0ìqž$Íz\¿&Ó%‰\¼Ù¸UmEyxèã(OŸ~bON~üã{Q)AØXÈR€ ZZRÀ6yi¤C¶F½ô¬,L¹Ue'“«Rj,+`q€d|qåóÞ1q­÷B¯Îq®ùݳֺ8Û¼·µˆ19 •ٙ˗odÚt6Nà<-Ëñg—´jäZ÷T‡Þt.Tø³×¾ˆ_­iÍš¢Ž·3$i8T´9 ‘ÑlŽÊCÔ™ÂÀLt§R=M<(’cƒÅþÚé¿û_ÿrö¯9mwÛ¶Ä_Œj\Va?ÁŽ_~Ó-€y§´Ñ#}:g , =ërXØ…µÝô5ÿvóˆÙ¦'¬"3:d/ämãÓQ¼%åë©üŽK¬‡I#f€Asͺ´ï›)Aá­*Nn™M|d‘l•Fvy _Çlv«s(fŠ9b`û ,уõ¹Y¸Ù~^쨳û•a#wꎫ`ò°sV™ÝèEï›êÜ¢òÆ„À«t ç·ŽqØÑ%•|Hå±ü=cd-”WÝè¦ÃuYTp¾‚Àc@ˆ€óØÕÛÕÖx<¯«Tµ K†ïì p·s†çStÕå°ÏÜXZ¹Ã!ŸÑpð£6öô­µ ž>¤UZÔ ©«…³îƒ^LŠš('ÜFv5$ý[ÅY“÷$–„Ôs®7·šaªgº”{°÷ß]P ¹"P2¿Ë$Em¥Ó¡ª {Ÿ4ª¿spl¥_8þ…a4ßÍa¦dä—¢§>2ë§ž½Jwi(t!f‘-§«—Ð&²°«rhÝ@!v Ü§ ÜìB,§!0—À ®áž¢X=€-øö²`èi¨% •lB–ÅL²ZÏÖjÿÀ‰w¿ÀlÁßEýΫˆá‡}gÂÚåO?~ô«_þÃ/ùŸ~úGÿŒœvBÀ+es ÉÒö‹òwáÛݫٱmÙFÞ×/¾ùÉç?|í5,5„xªÆÐ!$á_Çô -uN.º<¸4øÙÚοº6žñOg„òWý¬³ê€]ØÞ.ª}°9ÕA®U ON¬m€‡_ôÓv³õ‹Œ‚ÃTTÙáR#ÁäµÑ\å:Þ ®,UºÕC¾å¶ºØàoo^½ºÚ°Œí†½_ÖbÇ8Î'LXÕ©‰¤hP]1íêrB|ûDí}ÖVÍ´Ê•†ßÿ*GXòæZPN-µ¢à…ÂRªN‡tZ¼NC1ŠhwÀ\g„Bd_¢®­6@ªqêwt–i\b§ËŒ«‹a…Ú^:¢·&ì¼¹ì6ÔÄ®cˆ Ût =.˜‘,±ÊÒ³o%–: Z±Çå˜Xólc&¹fAÈò¤ñaõ–M)\ÿŠD7øZ³!ÔË×^‘#™‹*‹‰ è” †.ŠåáœuULw(´:‚—þÃßÿ½Lx¾¼8·wK3¶BUAV»‘¨Âx–NµÅ¦ñAMꇇõÙÖ¦ø¿ù›¿±èõÓŸþÔt)ˆ»Š2¶}ðbc,®’Ë \øp7à Ì3¹C¤U˜‡ìL’¼(—?4;ÈcU Å ¿ŒN``f=¢÷Ñ»´·D×÷®0¨ÐƒvSO4¤à 68™qQã ÈßZÂNzÆtÞ’ FjÑ»x¾{çTdANÆÚÏg¾‹ÇCîB yjÿ¬´[šßíã™ß×ÖÆ`tˆçFšƒÐw´Mîv¾M¨y€gäβ0XñÕgÙ’]Vpðá]÷™Ø‚,¦¥V\šc©áÚj(Ñ@PðžGÄë6ÄÝȨ»xå3E.-Ð s:"-/=‚Àô¢K7c¥,ܽÁ¬õÆyÂE(L¨nÓÖ3Ñf¼¶ðG`iVëh£Ö"‹‘Þ¼RÖ¢‰ˆAû™9§Ñê¨Ð1- a$q甓‰ª€‘Àט+¯Œå^ÃÏ2žL¶-ß8M!ä°T†HÈñ³ )ÜÕ=Ø?À†\¥¾22Û†Œ½ ÞaãêôFI6ÝTSB™Îªl_`üÛõĘ!—_6ƒz “;þUkÒ·`ôÞec™Ô¼ú=œºªÊÐ+&FKÙ%Žq8Ôj¸5ž µ;¢ uNØX],Ò]L:𦗊êum}‹p¯=‰=›Êª_›îØ22_ïÆË#½ìCLóäU?ta;žWñIXÀ`\òË…QQ­8ÂDÔN„%¡R˜G~ó›ß˜X¥—¤aV,BÈwá§|ñU¯£ i7ž©_½#†[²PÑWº°AÏêYVäUS–%Rˆå1)ìx2ŠË005âÊ„ß=Ô/€«¼'ÐËÜéŠD$%=T8ýý­·­hò;özöüéÿñ¿ÿo¿üÇ¿ÿÃ?úC«Ïz¬Î[›þEZ˜Í¡‰ ŒÓÂ|&ãà Líjy³táÚÿ÷ÿŸÿå?ûƒoίž_¼*˜Ú°B5³¡8etõ:#½yÝ‹ŒJ3:æÍcûEK*I©@d½2÷ë?j’ªžirÑ “y€ŽBô’ÁÝÕz$à3cƒf¾ Îñì„ ¸R6,s†¥3Å2®ØEù& Læª*eÈGwõÉnî>Y 3F‹R=ÉÑÚ¿¸1S»t8â0ŠÅAÖŽº [B 9Ka[ j;l{€Ê/¹‡¾`¤¤K°†`…°ð(ø%¯‚úƒrr§ ]j±Ð9ªÕyâ½õ­êgË&_EúÃ`¦œßúOÿÐ^ö‚`Ê%X£œC0qº´Hks(„Ùæ¸Lªgûø0rù Úž—ãÏ…¬ÒŽ8x‹ͪŒõ™];å<Ù)…ð¹øÙ5±xЯ­´Ížåd=ŽæÙ:8v0s°ee<;`Øz0€Î=,¦QЭ‰y£ñ˜•Ê,¤áºB•É@"6‰_Å$šƒ«ØñáªýŽTÍ:‚9÷à‘%aUo%¶Ôf#‰ÆÒ<. EÁ >äÒž÷ÇßÚpãÉãÇøD6ñÓ¾%L⟦ɮ@3¦ø÷]¬´sHL‹fFœ ë}byÏU²ˆn*ÿhh_ž'…Å0XWɜԌªúÁÃÚ‹i(?ãÒg/mæšõ\­â×&WzäfÊ4X63›‰Á˜ŒÙÉ _y,ƺš!Û¾qȦ[øõX…¨æõeÛy ªåîñϾ‰+±ï hzG$fY‡^†±*Ýà¬ÚR̬´œNÿø_ÿkŸ“'ÊÐû¬¢y«ÁGo¾³¼vËÛÀš×™£PçÜq?ýÎÔüíùåK]½~ö«k¯Ÿ›Z¿ñ.Ž›R1o•74+Š0onÃZÙ½)ZcçÉü‰D>:&ýºÑ‹0$>|‘²oO'ôÎVnKBÞ6JœDáL%a-¹%ïLøkÖ ‹ 6‘tOÀë™gú¢Zà+@­èfSé*÷BN<rhk­z{qY(¡yf&ˆz¨F]ð-…o G¨9…Jð-×}tBSÖz±…k,ñŒÅõË>ÇËuTÓŒN´=a¦ã=¥³hSÍ­[w$õ:ë¾W¥'š-‡k`sd) NÕsD{u*#w‘/X i¹K¡–Xy£5R”½´?¬ÐTÈjÍ‘}©!Ez·‘gf*%Æ'–wÅú¶‚SÍ!Ä{&Nº÷¥F2B º€Î•Ý[×…š>;&q¿ƒø¨DŒ=z¾9t~ÂïíÜ6y}w‘¨´ï¤2„a&=[‹ÔzvÊØÐ=Ð\zRhÌ;¨D“ø°q¤Lj.õ¶7£b5+6ëþr&c[%Ô-xË î\×=Êø“bêø´¯®.N½ª-¢¶'×ý,j?1?SíQ;ÏÍzu£i87>ª C‰}99!BK@4r‰h^­bü¦@ßT†ó}C42YX²Ê&²{¡Î+˽]‚5¡lb$?3ˆ˜e1ø cIfÍ_4ÓJg­£ ¾TÁ¾àñìÙsäLŽøêŸÿWÿÍ“O?'¦«œ1%gˆ¶Rµ½Îé ÚöKxLymHÓûÑì§»yóîo¾úÿüÿë_?ýêëÏ=øL:qí;Ûu3+7p'B^ 5Ú1Ì¡§Ë¹zãb¡ß'ÉKßùÒ¼÷Ãr¼($“÷¡°ãˆFµ¶w£fßš{¶]óKõ{MÍ#`xìÒhX-ÙðÐÖM.H}¦U=\ﶈç-Zi Ƨ¾ùòÕ•[::}H øœn¢óØS aĘU‹ÐÞJիĽF8È©B_&ä>¨ï’2ÐSÐ&}âŒwmô @l2.rH£3ÆðoO«Þ ¤|óͳMwí¬¸÷¾þ™&úk+ [ð¹-ÃJ­AL¢3îêÎâywN[ÅFnrò8îšVŠcÅ^Þ8|²Ò!òš†êGTIç§y/šºÏÄ"fiWœù<¥{´€e…k— ð4X1l\zäe }¥ƒ¢!õw|7XcL÷Ññ;Ò$Äqâ…XIp€JÅŒý-ååí¸0Ñqˤˆq¿öà¡·ÚA8³;ÈG:©LHLÞGÈÙK_ÀžØDûÚlá Œ'pÛlÄ—J—™NóÐ Z°aŒZ¨äxË)EaÕ à$+úøÅÕ…vÆÀ=ñ­?>ȸć$ë‹gØÊ]= ×·wõw·jÝÿyí­`TnÚõÒË 8GèoÝÖ“g}»T‹C}BM òñÇu±S±¥ ›®#Nx\ñÜÆ&]¢ÜqÞG?~’J錘Z㫟«« …ûîʸ]v"&§[g ¨Cš± \Ÿ´•†®K†ö²¶—.Ét- ¼¯®.aèîWû®^Œ¹"{=zx_izÒ‚ŠyŠX:ž¡Ëpf_øâ\QýT ÓCâ×øW®–æÜÓ7Ǩ?ˆ¥Á­ahz1:F.9²éãŒ#3”ÌÒ@lpÝœ‡¹ªòôÏÿÍÏ»1Yì.P*hÌtøücú‰Q¡.G¡%¯å>n¢øüª^ðÛ¯½oÃêÖaÓ $TƒAR1¶SÚ ×oˆ_•Ò;†'B1SGO¦Â}%CYóýA.’ïZ$ƒ=Ô0ÏK¬¬ nARŠrt>U?ÔÄ©_À®âaECWÁ)ßU¯<äO¡®' #BŽ…»03„f·Ò)ïož½e3˜„Û8ë!ç·{×€§É„êŸÃ›x\D¦m½o¸Ô¸[<*™À½„ê…¥;£ä® n  í „P…s6Ÿ Z¹äè߃RØUÀ2Ô²KqߊÚÌ–©«!Ór"L*Å&¾Ôh²Óp•°LîUõFPσ±GXÕ ÝÁ\dÜ«¤]®$1°Ê-¸Pñš 4…’?ðÈ3qã^âG%øzæ¬ÎÅýIä7ª“‹ãâBß NJ=α0)v Øf ^Ø=ËÙ‡äPËìüºK«v¦²4Bùê’—À ,Fc)%f…ÐÎbpRÛUFÁ0»ê´í üV:œ²Âù°£¢b(:Tn€¨CˆM™2-1‡³@"JK–_JЬŒP ÀuK³ÀbPnbˆ÷6µlŒâz©2î!n0£’óê¶;UÃg ~ØàØýŽ?¯ÞGëõ/õÈ›|æÒk ¯½vùü‹ßû½Ÿþ?ÿïßÞ¾{ÿî^Tè&®†Gi Kí¼6‘éC C1UrâŠo¬ûöh ]OpÎió° …§ŽéS1†n†ÎV¹äqj¼”'D;Tnssêö SÃÑr>½;À*–È®@'im•Õ(3„Kµd;ÊQIÙšo‡òñW‹¯íP‘‚`¹úp)ìw¶É»ÃÀÊÜ–näX¨¼)Ö¯2»éátb؉L¯ÈõçR|ý¢¥´ÁÒ\sÌßKvQ¼VÔ+M+÷2 ,Ï8£"OÌeÉ@€±èÎCxËM¦ã/·*h‚èBj¸|žåW®bƒ§ú¸çÜÃjžI…"`¼àv²·¦RÞêÀëØÈ%fÒôúñ·V‰fıf´”^Ár†­è ¢ô†É1ȦãuoÒÂþIÎ8›Â¥ÑJöOú„ Ëb›Ó:f”kv Ï/BÑlà žµºƒOûµ”În›<4àæ×±¦—{Ÿp_AéÊÔ´9âû;·[Å4%%²§.-°½¼òªÕ`̉®¶5_%PŸWC 3‡]Å_ÞLg,nà6ÂÃúSê¢tªSÃâ!•€W–ù³ÿñ_Ytq¿kÀKà¢h$¼æuä–¦í @AÁ×v<Šíf†;ëWÜIêž)©>~Y0«ÛŒ ‚{ýʨƭcV;bq²zÄ ÒÁÃ$ÉqÈWŸšè~”…ô´šàؘTœ¥Dó­hLy:EBYrJv§`aSæš´‚«ÒBÂÛ~U†Ï®³PC®³Ô™ÇÎ:`E¢ˆC‰Äà|g r^·ÜXa…ëÅŠéQ[9C`ËdâcI´tïeÒ€»0N,fÑŠ¦%~K­†ó¼++òè¶{^p–¸3ðH!ÑV§¬ ˜í6Àô+vÓy&Ð¥4Ñ œŠàÁøU9D*xèâ_I†Ç й)Vw»:B¸f.ðØ£—p¸â(ТZò%΃¦p‚Šc€ì§&†ktÌBFÖ‰2 „Ã'µ$¼ca[ñÐlÀK7`rh$Ú®.wp3cVÖ@Ô©ùxe’$²L“þñÒLÆÔÊ9l[¬.¦Lwð£i‹¯‰Hó†òÆ$ì é‰Lp¢åFô¶QLwöÎ:¬èê{Î*‹UC¡t„wÚp/€@fŸŒ° 1UÏ3õÓ_šüÍÊ^Îï]ätÉÜÍùÆ4ì…‡gšk‡Eë¿þõ—q7L‚WF×ïšRß®Ž±Ò†ŠÛÖhg< $‘Abi«™~{.cý¿þý¿¿ÿøSû…Øäìîc·h`€¶`vNŒY)/ï í CF~+Ã@“Ù³ñÐZkžS•x9¶KÓLyZïçê-°5^?5k2“&/³ZöïƒÙ38eÕ¶ÙçB¢˜&ü“¦tTÔ2Òlà³6£"àò¶>ã*?ÕÊ©Ðà4Vf¶9yìÜ 1cdÒV‰Me®žÏº“åTû *-gŠ?˜›%ð÷†ŸËÏ^¼xæMÆúÿúÙSbúp^Q5Zõ eV¶><»ê†MÝb Ú1M^B€Cô@“މè.‘blR ÊsŒ°€S݇_¨ q¼òøÕÌCü’:r3‰ªÿŒ½ê£(¿‹{ëfÛP=r;Þ´ñ»õ†ðíÚ*1æîœržzñô¾„]ž©ÚÕÓÔ‡ªïô΋T6WšÎBp¼qhA¡…¢Bž† *—ðù–0i|úô)ꔩ­‚z“(Aâ”+®þÛ,5¯Ê«k|LúШšs*¡[ vu\h_¼x®F¶;·-6?{q¾7Q(mB~ª†ß¯Óˆ¶g.§§è ÔòÛ¯¿Z”éa²‚åêmù„§W‘E ¬©amäf-i· •.˜Kì·äø9öHç’¤Í)é(ž®ƒzLÌaij |^i6Û! ïf:­yseKD¯. hs¯fºL:]ÍM ¨fÜÿ°@_Ê€”ö0¢‚S•Ì{ k¼áVL lé·6Z>”ùÕ£-eþù/þÔ„aÉI¹ñÕLãÔ¯óšÉlt#4Qì,!ôu ŒðN@ÄÒ£, HŠ$´…¢-\î˜ÌGQxíÇ_!5G)ž~t~ÙS˜¡«¥¸2Du€t¤‚9§{I«5ƒ+#P /Üäï°*¦Y0j– Š0lÍ`= Þ£“™ƒ–nrAJs€ŒsWáp¦é-6ÔæûÛÿ9.ª9‡Ù²ª¦óú`| Åe-4W „åÄ}ŠÁVv«c,‡j8(HL`e 6˜ýÆÜt¸úðjÌ/€q¡:eî_è)C²°hÁ8Sf»ÐNß ÀYº•T" *¹à[»÷ 'S<¢ärýP©y¶«‰eä‡Ij‘B±–Ž^º¼Q%ñwßEÝ*r¤Ôs´éK5’ äQ;9}±³žÃ˜þf¹ÛĦ?µ3ÄÎ{ŠÓ¨Ì¹™ IDAT6ó¥0æmãÑG>6þI€y3& óÖ†H–j4®Y38L1 Qwn{)Ÿ©”±Ó‚GsPwý&)ž2!BîÕÅOFHðÇ—ˆ [G­aF¬Ñ0G&nòÀÃËGêCb ‡ÜVdW@Î+q(07”‡Á^‡«¹ :„àÿ„öÆaÛ(rîîñÝ‘ÀÉ)#„ÇZœOÖÙÑ?,}dCÈvÓÖ2ÓǨdg¬L,ÛLâíÅ (îÏ.P‘+5²²±gXÐtéÞý;_üݸmßÕ;W so?ÿüÇ—îrzFt§–vãåÀh€7È!S3…á@‚ådi>™æ;Të4ƒ<©Á~/ 1¿?4­ý0±dk <Úíj%ÆÑƒÑ—ÑoPzôᑈ`V™ìhÕ³&Ðus{Rx>…ŒõRS…VË­`ÙÒ+ =*Í)!\” æð‹Hñ {P :7ÍÔ[¿}ãmÝæñŸ~ö¢}üɧ>>ë’?­—+Œ)à*W¤[ƸOI{ I¯®âD+0HÔä±ò½Y]S©Éʵ­übj›€wlk\ãíSj°ºœð\§-üÖSûYÌÔ«¡F‡BK œ¬æ]@ÚÎ5mh¾¾XZ~C{V³¨nŒÐ7ˆÌ©Ð•J ˆÍ™ûZZZ=ÄÐe~ÖM€`Þ¥îû’r2ªœ µîVèÐÑdódä'^ÐºanôÐépuÇhÝD+¹%®!wI—TI <:»óór}–3éÓä¿þ'”†šÀ¼††+ª@´LË|K·jjßäV.H:ìC”µµ¬-ZÊv#óæœ‚) :¾ >1)Ij¶¶Î fí’Xr‰BHM—û 5$­:»["ȵ¹¡5êÐMNd!÷Û7—/<ÐÙÛ·^à‡–½¼8„JYÎ0üGå8‚m=‡çr["sòö Ì ü «iUÁÕQo4ᨥœ õnYÚýc¯2Dª÷u¯tãu­lßÞ×À2Ž5¡pä4|ÔÁÍoÜyõúÊ"·}˜˜$J‡‰¢.d7À%D~Ã"š…3×Õ¸VØB›C$Úôd`|BCÂc²_þÜ[·Ô5‹~ºx¨Ø·+9B[©íjGOr) áÂÚx *ÆE5Úzш1­Õ05U˜°–N`ov«¹Cͽ[·ßÌîc$¸í#\æ"fÿmpã¶G< Â³@©’δ·à|—¦ 6+†Õ¼V`ÉöUS«ÁétðÎÐ0mb`0ð* ¤i˜b¨W=„#˜?p²†# je=VxâÝ“…ZQóPжEP¥š!Û%ØÀ+¨†vË¡ÑqB§4Ïë8 B<”s¢?¡Rpƒ±cäNðÅ¡Z0„­0–9æ½Ri»á žíy“85’vÞvÓ˜i®·J˜ôå½±Ü))&ÊðãIµ‹Ë—º%nßjÍöaŸTÓ DÚä÷æª/õ5›6 N¯¡ÏK+;0YüêµÒqªfK8,mË•rÔâ‘íåø¡³Y}J à•Z ˜‡¹¥%[ÂÆó'5®jcGø'­¯WžÞ2ŒK6Ü(º–0–sR|Þmm‡¥éÊu]€…  Q[ã’œ¹‚®‡áWI+R §ÞO• .úÜ«¨)éÒVìW¯Þ<}öõ§Ÿ|þ⋯Þ£äÒšmÿb‚:#ŸA1oÄÊâ ^çŸ^?½`Ùˆ'ûµËfS/N°ÁY\Å!óð½$jâ&–‘Í)!±jጼâ~¬•ÎaMì™tBJ§À&JÑ’Sø¨Þ,~"ûË!§Ë‹‘ø¡ëáîäüyN i$Êcu|R|+3Íÿð¢ëY?pïª[x`Û4ñ4Æ>wU—×|vA´ŽË«Ó°_<“þÕS'ü€·¹ûoÓ°I2B|?tëTC­h»–rM¦wH˜—2 €Õ€&fâÏÕåó´wjo’­lßÚðtqyN®s¯;>ùîG?üìέþÜ™½xñÜŒÀî^ŠÂ˜÷oâNÔuqe¨ vÐ$mäTÖˆ6c·¸§èFŸ&½KåØ#ð£‰_‡ù{{v'9†®¬Š(œþéŸü "Hí0A ÖÒÈdá'¬Þr4n]ö€¦ñÊ`€ŒT£þá·E6=Ç<’µ$ŸýT6!è¡°¶ûÉo]C~–à"n©!9Q‘Eȯ#ÓͱAô”86GMª™ ̪•kHL˜›)šV0€'±K1>G©ètW±¤$–@JÉ1fAE> Q§`ÐÃ%ˆL­šàs:bÓ_Œ[ŠkWk'2$xT‚AY=‹CëŸò€£ñÔˆ&ü ~L)fÂÅ`m_=´B6!Yƒ“Á©…àM{m±7åb–XLÄl=#)hR~ ŠiŽ%|ÌO¿ÚŠ+ W«[a|c[ÝB%º8Ü›âp| Êœgº,ÓÔ(ÌD®Eä)—r*Ô 6¿™…"›.qH#‹'k—±ÅaOÞ˜.-\"WÄZy_~(¥*ɲ‚"(ÐO®XÍp­Ïz8Ò¬‘6Z‘š&PÉ{;‘Å£^ØA4Ô 2n®±§ãBÌ ÒðrýÙ…0·J¹/öP!ðXec:ˆ6«Si,–°­õ´ ?"Œò[0ÃXk]G=+Ôx\Œ2ýöß̼]šõ§Þ¹Ï¸=b|ÎF‡6ðŠó5ìî˜5›*Û­Ç1V_4ñWK‰Û¹†×™*ŒbMjqË9Òk-´H’ðœ\Kæ1sú’ÄI°t¸¬[g§“¸d/:嫨±wÿÑýÿüÿÎÖðn=øê·ç¿ÿ_üøÆõÛ'6‚p¸éדŸ§>9¿!›ÑsO•Óð8ë"§^[ÎJvd6aóü6ÝN‚%ä;u0õxl‘×)Ö¡7ÿ‡ )é1à@Ó$yžQèö4Å_ÿõ_+”úG_mŠ(câ–žM”´Ä¸óžš"‰'B¬ýÛÞÙί·°&Z:ÒYb5/Ÿ~wçì6¢fž¬¹OíjûäñÇò9n` ÛCâ®Àe‰‹˜n_x¾˜ÒàñÇYì/oùÆpˆ+Ú›Ï6UæËc,1¶ˆDU)cÔ8aô0c$ŠFP!šr^qÈxVçiŠš™d`TV67’—,3xà$]Uª/ôp± Á'ÂÞACAϸ•àýª„ÄätLÀë1$r.‘ ˆÏ5œ\™ðîaè¤Àç÷¨flÂz89ña(Þ¾T6yý0Ýæ”=.Š Z9®=mm*ms$ö ÙmüSòuDõ9ÀH;è_%Sª§‡á¹dE=ë#ÆŽsöÕIøÃÏÕó ÌÏ{ƒËà˜#éÙ±÷æW¿úÕóçÏÒâ!µYyÂR]>±¹Ÿ› @‚IÖ…ÐA '°¦Ãoƒ*Gr…˜Á¨˜‚óñ»e¶óá1´{7%¹1³¦=6No{€¥§h_=öìË/-ìeâ–^xìµõs¡ž•gìåhå²9d«jã3ˆRybfÆü&3ÎÆŸ†S=¢Å¼­  û¥DŽ|ñŒÈ.~wú¿øSÒl/àóz:Æf£Õ.éæÑôÇ¿ÔÏHúþŽOdÇOÀ¡¸ˆahL≭žkã ÄÚK7æÄ)l²rÜ4xŠ#†¾§‚Óð¢k±K%Nšl’MiòýÆœ9Tο)E«Ñ]X×0瘉>k€ë§âgyVVCš ¸ñfEÕXÀá"Ge^•.'< º¤™Ÿ1V6c5ÛaX²¶:Ã1ÁøÒ{<8&ÍÞ\Atچј '³¤älYeYããÔvn”3XÀÌòFœ‘´¾ÚòJRöXuWõœõã…ßE»:YáHœ³> ðCdá GЦ¯Ž¼-fP+Aâê(m™ÌY‘CW—!è*G%©ü¹@Ø%‡4pJSŸê¦ÖBšPxcPÒ‰ž¸ ~Ù¶,›â’û$V¡ ·¹¿7|¬Uà†\ÕQwX\R$¼JÍÆÖþËšñ`KKÑ}RÏã6™•WÇ\½ÚŒB4çɽ+ն娋Ðjb€Ç+dZ90á/ÃO7t%/ÊQ5‘‹ 0..Ÿê!ܲ_†s†C¼)`/»kŽ{½i@âÐ “x¹õ|6‡í­ù4$Lp ïeñkÓ§¡³Ø6_€‡Úz±W0’¶æß˜e%J`Ma~—WH;=ˆ<+‹ÊÛG—Û†¼¼Áâ Å\¢]Ãä™UŸ—/^ø^êÅÕµ{>ýÁž¼|é•<©ÂAFŽÊÍ†Êæ:}nà'_dЩñØ7UŽ‚gº˜ ¢TŸî³Åô:•HøÕƒZI’uéõ»úÞ–;š8ÌL¢N ®º@N_ãë|YÕ©C>dc²-¦‘zKóf5¯ÎnÃ9ÕäÞ¦rÆ`øáêFM•¬œ†g+•'!ô07ÎÆz9Z1b㡯¬<~üDRÅç<{@$ÍÝ@øøÉcëî*Mî©_CʇđŠôSæŸÞê´£ˆ4¯Éö4ÙÉ~ˆ©Óóšq{ºÈÁ…T2 BäÒNÌ(S…J´üB‰(Z5CF>ÔÊЂÁ#p»´¬KÀjà0IçTus—dß®(ÔÅ­ácÉÁ¦°WÉêt¸ªw‡lžö^lТ˰%Χ—ÍraŸ¦,Ǥ;I:ßoùíoƒù|ö™ÍÄ:ÁR$æ˜uƒóAŠäO¯é9<8àñë’†§ÚN±Xç”jY_ 0öUéop’[xƒV˜‚Ê#øö“O>•¼äl8 ï0ÀFA•Ðâé‹/¾pêÇ+hØ䎗û½Å óëôÓ÷õ5qØÛWŠÀ±É+¯PŸ,»s1̳ 6ç C}³®ì_óËm>K_˜G°«~MH(‹½E{ÐPå(ŠZé‹"§iÓ'§nÜüôó=ùø Çyp¯(g¶6?¼³À…™õ+÷ÊexEN¥ÿÉ8½ Êèlû“.Öm=ÊÆrè@é6Z©“bæc.9”1FŸ÷¸dcNi;rÿó¿ý…HÅà–+ÌWf bœ.X:‰ÞÙ*Ç}ñ2ŽÓU··Ê„àõëˆêG±ƒÑÃ}þë¿/zϘA{€C6v`”±¬îäÔ Hx5ÜB¿%¡KÆ—6 †ä¸F²ìágéRP†¬%×øJA¿Dýª_žQ„<6Ɖ¸º`ŒGVréoô´N©¹ ó&Öh…%5¶FY[å#'‡:ÎhÁN¢Öu› ãwÖ!™™U’’Këe’!LÅq¨^Ÿ=ÜnÔÈ̤FÊëØÞÃNuðÕjlÛزü>*EȵU¨­mLöHÊ*z)ps¦ÕŒlÁéQùö>Øä-r” 8bx+†¢S„†Åë%Íû³øâ\ñ~üðu§RØžiyé\a‘ÖÆ^>cGy«>.´1"íCâªPtÄql´Ô/ £…¹.wÓmr8Ÿ‚3µâÛg§"£LðR ¿¨ŸC;Ül §·oµõ`¡¨€í.ºŽ*Ô— dmme[éÊ ER„ú'Ew2¯cpa#’æaÃ?s·õ‚£nש F+cÆŒB›¹/I½ÓôG=šÍyëÒâ 'E»Œ$V¾–dy7¾ÝˆÁŸ¨¾%õQ·ðp«½ÄÏótV=Ç.ë† Vs J„U׺" „ÃåÓ/uÁ«†.¨ Ñ&Zõ/)ÂÅÓ_ÿæ—/¿½ùÃý¾þtëæÙÕ«s¯†“2M%ÙF‹$Bš¥F6äöº)V 26&†ÏtÈ”:B}!êXʲyB>™[CíÓÑàÔªDlº[F¥Ur3Ï+xþc0Üy¬úY€în#Q¬`‰`&åP!¤£…µ¸J|üï7Lºç.[~æì³Ù6a†#AÚíMÏ1è}µ)v¶ fÇk­œ‘Âá…I6ÛŒ^ò1w¬:PËååÅnC¦˜±Á£%ÊèàØüS'ÖŰ2ƪO¶ûê-õ¨,H.ƒã¸º£ K«ðCÜF°&À𣬯ªTCŠÁ0î9q¹M ©¬ÿО‘vl%ß“" Þ/yãpWÜgrõ…‹ÉZйJ¤áD¹ ÈãŽx§n"Scyê|‹$AJ›„4ìÒòæÂóY—tb,¡õøÉãü 7ªiwúŠ("L†"Có"^®‰úè²ËgPıÜÒÒ¦¾-Pš/9eÍY€CÛ»÷ï™òX›!ÍDˆæ-ñicŸv¾‹yýŒz$ñs«.B¸§¿Ê´´VÐÇëÚ‡iIÌèÚ=îcDÐ>¿í-µ†q@ÇVéjù\ÑðI^SPG¦÷:{ýWaÇ3ððmùå•»–g®Pˆ®í½»´wþÂZìx¸ôhôá'ÿAT>$`ß&¥í›·î=xdòÁO¼–¥ï©ø,U9z,ÏǾîã„°‡!é#é0'„~Q§d0z?î¡Ââ¨%%³¹Sxbüx¨f`®Š.éÇïºëéÏÿøgæìßD†¿Š‹ÅUØnŠ’^[Ò—–À½ÖÜw[©¾fíΗÈ<¾B)¥ïÜÑ*¢L²]±3“A±ÅmZÀÖxPnmpì­0F¬ìÔ¯eðÞuá»ÝúB/,Ž¥\Œ’Á²­ð‡7T\`òÄá A$„ŸF¸A”í¦ÇÒh)åéJüÌUæö§¼àt:ªÁa=­ÑNÞ‹“F–EšdÀ:fÒr´ f»?Ò9Qé‘{þZdšWGt‡bȉSÏ1@1ÞÜý­ ÛÇŒw_€Uhá„`„b×VÈýóêåkm(´^:› %¯z‹_0¸û; "醺lƒæ-ûað©§1MÁwç—sÑB2ž±DŸx¡"ö6X÷½U‡W)ö(¨ÒàóSÏsÝÛa–.™»‰!ðj±×Z”ãs‡¥)ÌÌ’û¦¡R~çõ{|ˆ”¦¾ô2žæu>ÙìúM÷ŸL0X.ÞëÁÜHmQ.ý1*.2Jë XE}Ân¦ K FÌfÒ&dÈAåù>¶×H$šGl´BiïOñÍo¼¯¼íÛ¤Ã?y4F·ãiM'BÖ®Æ^¸"gp£¨U ‘Ç7žìñp) ºán©&uBçÜ©¬.=“šÈéÛÝÂM7VßPjžc©Ã¢²ŒdBd.3ås:Á Mĵ]k5Üô)ƒØíB_œxo—Xï¥ËI8MÁö[x—âÝ3ïA(vP/a±AHàQÉŽozÛøM©ÄÝÛgÛh¼xúÍ‹çÏ8Þܶl¹Ç‹iëÛ2òÞ?R Lœ D§²n+xÃÓ¼ª€†°P‘Z*Ð0Üæn墳ñåo¾øÛ¿ýÿò_þ‹‡¼;¹ùæ×#åëévœOBügIS½{ß–ÙtÏá´Ä0]·1Ÿ:zsÜìXa·±±nlº“³Eè V„½ïÌýVÑ i¦çzÔA·ÔůùÄ(ÊÎY«€Xð·H–b¯o* 9†™P¼^ªÌ ¯^^qƒyƒ£¾»ºpÿÝÉéMö˜µE™aËŠÆ6Ÿ!2 NJ|êv"Z’id¥LCš7eôdÃm›m$vÖ|WÛ2 A,œÖÒêÈsØ"ýØ.à> iÂ}³ô¬†åñ.-nÊZسdf8¨ןEPåt2ªù…²Žo‘L˜ârÜÒ0FÕê9BJó.@ákÞÜÆ@´ä”ÊcеU©‰‘ˆêè±A¬·LùÌ\¦H=·ŽÀo„„‹7Ìiˆ ~s6ž@dUè3 cDÀØpLΧ*¨f¿¹P/4χe¢:¥±”þªžhÄ7ºxK‹·–ˆ™F¿ÅVe9=5ÏÃ|aPð™°ˆ.‡÷‚&R{6v‚pÉGÒ5Ú¦I¿:™ßâËèd1¶A{ÞI‰õ.…Ý×Ã3>LO{ .çu4vGJQûhÌÙ‹Ë ²fµYvZ;úåÚÌç_w[¦$­7c‰­ó "ǬäÏHÔtJ®õæÁ½ûEƒy¶‡ˆ²D^•ð`vÂsìiÓœó¸J^Ë?âjáNZÅ^IÝ·^üÇ»À'½˜ÏV­SÛ[½«¯®Kd¥×¼Ãëm÷Éxvg¶í߸Ñg¤÷ÒwÅRï7é 4zc½¦0[o*N5Õ¼Ó¾·œ¿›óo§åV×<¼bá³þJ]UŽÏ§Ûî åá¤V 3ü‡Œ½ˆÏîÌi‚Œ°B§ÿîùK’§£Q§†J((¨* ´JÔ¦œ$ï-o%*ÝÒºˆCï44´…ñlÜa‘®[kàp¦ï Ájô@Œ 8-äO6Ô§å0ðŒ»M0U3×€­’RGCjtø²7EìMo°íp FaQÑB»éÓÅDR¶‡rñ À˜+*,ÃêQ$Â0¾ñ§K4ôË]ý’«BŽKãƒQ£°$¶†kƒ_*0«Ô^]]MCÔšn%ãˆPÚ1·Œ7‡ÃÇ JsÏtaøÀRÙ®m²ôœŠÔˆBz(–¢uŽ}qî•W ”º¦.k—€-ut %¨µCoä'*qM­Ô$ Ê,´.Ú+…MZNÿÍŸý1=¦¬±qSÈYËÕ—0žüâuÍ{V8ܬܪœK¹¤ÞѾiß·áÙVMDmÓ>[+æÑwÄ„páÕ¿äf"Úgq…„x—JÝ 8qK,…$RÍUÈóVш‚Þ(ø`¿ñ†1›¬g)ÆÒƒ"ÑrõÕT¦#å(ÎÁÎFÀ¼„Ó€AÑ¡€ ‡½û]4'…JW­+Ô]G%¥\p°„èÕ3Ô›Âg7è,¤kÃjc3 ¨–Z«´ïÙ.hì8@ ´“ðC08Ñèns”9̈òGèe¤€ÃЭ§¹Èè­vÄÏŒÃèÒ¶ÄÔ0‹‡C,Ö“5Lcð´ )$Û|¢â Dx÷ÒFQ">]WoùJ!ÿé!Ù¾ŽýhaÒ©í£Þ`@¥6C¡Gµõ´%me¸bovÄ$ÅõY«* fщÂt²·Âa•±AMÈÛ>¥ïm Z `&Õ8&|/·úéÄ,÷2^Ç/·1™ ÅøT¹ØÏ-kB®è§X>ç"§/|Q‹¿œÇo³·™1cÒËŽ‡²çš-·fUg*ó:ÿjFäþæ”úΓH¯ÐЩ'èRŽïO6ß—s°ÀÍè æôÙ°þJ‡Å` çA®Ñï˜sIWÍ)ß¾~é>Á7ß<}øøRijiŠÙWoPâ䃼þ…ª IDATë*©ZìZ÷‹,zCXyj™¿”¯3e¨ê;…ìżðx^‡p­šÑò'Úïp©«ãöF £D”¹”ÙžSLâpU -=(;¤/÷ïÝ3þ™ úX(ÙÔ¼lu¶"ñ0máäœÂÿŒq{ÿþƒWn ¾¸8»w©å¸VïÝ¿'EkZˆÜé©ìŠŽñA?öVû¬“Ù—¤mu8Õ‹¼Þ.{yÕMÆ•h]{LÉ^èb?þr¶áž6¡5ŒðkÃrDÍ¿üòË~þ£¯¾újWEïØ®Ô×Q'kÊUš²&äYÉ´suºHû˜3°¥Vˆ:rž ª 4wÉ¡~þµŒV„Ð Øm¨‰J0äÚæ[ÃÿÀþ­!̯2=ä*s‡W¥ï `[¿©EÏÒtc¿ý9i~縵¡ „hÔ+˜‘²·±wU<7°*8ô¦,”%Çf_ ©ªâÕd94¼âÀSÁ-àñ®åN~ý«/ž={êÁºç/|wné°!ϯ…Ïá¢É"A—ãü}£‚\b xŽ$»ZHÔáˆÛ±…‚Vš+H¡„M˜œ:V¨®Î«Ajâ˜zek~)6„ÃíÂÏX–œ:†a8:ì5ÔGð¢;ÄnÈX¼4ÇóQp7xE°ÖË­#¶ˬCï›§æ9E:š!޶‚JÖœµ¨ƒ+GjBË.[³Â"ŠÃ{Ë™Fý¶û:5Œñ>ÌlåE–€FA³È«:º×f)¹dyýöµHÁLƒ$6€¹—˜oûîåwç‹gP‰w^Í×äÃÒVû fNåË Æe'ã‹]Ñ\k³fáÒ „ti˜>L¹ßš M”7_AT%n¥€­ u4Æ‹Ô*AZá#å ‚|^ÁøêŠKÝæ„r(;èAÙ"¤fT´[•Ëpkœ2.üpuð-akonå¼rOrö rl#”˜×ê4 NÅLm®Lº0®ß]'ï’3YT@š8RÏÀ|Oáåå9*¾†€+‡ ØZ)t]äv(Ú˜Ò({£»ïÔIôô>e ÏS³„­j…þ& <À£N´x¶¶ I•»_YRYМ©Ò”†ï`IH´…võìTÅše3}Í+í{1¦û"Êo&ÅAï –ïÌ`Ò˜&ÛjµÚÖmº‘šàÃZ|ܪÀ@Ô/“\}ñ4r¿¹†&V̧¡üô•Ií€Úè@ÂO:§éhÈù…|E^)RÅ-7ðÝÛ*ƒ|}ÒÊe³Óõ͹‡úÁ–Š*­õ /,²wÓ\àW¸‹-Ã+Ç6 aÓZÉfV_˜aQ ày-áZÖ &°9V"EÚà0”ƒ‰”æîÍû4¶r¿Õ’NúÛ†bSGÍg[ H§–;<ÙH`ùµž5)æ¤Þ—„Ó%üÂ:±" pvÄ©[E\Þƒ-êÝí§ñG(PP£gß»c'_á“]YŸÐÍõYnÖZ¦…NU×N>¿&Çm@´õäì̯&t·®ß¶¯åž êÁ=È¿øÇÿ¬OA+éùÉO~ß›-<|tçLV¢Œ‡ó«^íH>´ ]ñ¹ßòƒy˜EáSÍʘ¡'¨:µKçî½;Ôüúê¥øÚëÁ®}÷“ßûÑÕË = Z­GyõÓ´7ÒÖ%ÞP±#EKjT‹ÞÏÓ…}¦c‚´:þCÆ­×Ûl‚ ¨Àð¿š3…P©ùå]Ó°ÜNÈO§ÚBhíÕj^S%w`&±ÐQta˜·Ü›çöîÈegL)«ˆ˜­ÉÝÔžH>fëár¸Ž«Õ! j†b˜I´W±äÀ å»jã[®®]øÃømœˆi±B*,6ø¯^—œArv·©Ž&¾hèmd}èËsi½õ†L3p»2¦:¿Dýj«óʨ·§ÅmÍý¢òàÁ=89p¥R!¦§ y5†´KP¥Ò£É@.o~M¸±u/)6xÀ8yÃ@ „¸õ­d8ú¶¼êO££ q’¦ë·>ºãÔ»^^Þ?ó`ŽøÑ¨'ýÒ'ÌØ~ãv_ï¡~§¸Ë¡gá*´ÓCéVº˜Ä°¶Š@Ãþº$lÛT´tÍ¡[2üË?ÿùZ]¢§}½|v{(k¬e<×çsA,ꊰ[5IR ©þ‰&1½Ï~ìÙ¬C×o¼zy!}gø ¢$ñ‰ïRþ«˜§4†4ú¹‹b¦äÔý È稇XÉX~ÖÕª1oæv‡MŽÍkà‰“ ³ò¡K:Õ$éå×î¯KÊÛDc(¯*Èâ¢)%Ó½6_Ð $Õé¨láoîÇZH÷Bb¨ÄO÷xRˆV—Ú—¡ ®ýï‹’i€¸šÊÖ?N©+Ú¼jHqÜVG•ÝDǪ±8–©ïøAA¢¹C9UT´XZ 0«uª9…}Ïd5ØkÌëÚ˶&ÎèÍoP- Ž"QKh€ Éy|Öò>4il¦"iF<£‹=JCvúß°xTloY›‚ ÷jU^ €ür¾z6îн›9`ÛØ>»õœÚQ™Ë7®¾l³B@Æn°æQýÎÜKY[²ëC®¡¨cü'žÝ˜ü8lB±U«™céÂ&íá„àFçÌéêNå×0C‚‹Ð€´«ŒXªìPà'*G Ö4­#6 |«¥à:†Õ; %4¶Û¨×—@n !¾ÄDÚ$ cõ1G½“ƹã½ÚYù̆0Ã@Rë5 —ðì”9‰¼²@NO9¤UšÙg†*݇[K~̧ k‚ûººhýê£.Ÿ¢®2ZqÏZéPŤ«ã-éJ+ð0 X¤9ê—~Á£siX¶dðO÷ìîv×üþìCå³Ï>“õ‚´ܼÕʸ&bØÄ€TäÐROÙsgÛ³&4«ÝÛ57â€ÄʳZ]醙²CÍÂì/à-àœ 9Ή6û*èŒEËve׊¿øUIa¨ë–í(Ýæ¤Ù>†‘cMÊ] 7£is&橎ÿ¡‹0ˆ†Ê›WÙOUG^½¼)) ªœUÃ3k¸,Á¦žÖ]QØæ‹ÊÀV>4p ºEá2{@1ܨ þ$lÛù]ÎäøÆÝC²ÜãeÀݹæ}ß±!B¯.O¼¬‚o{òu{uµ1š$÷­å.éMÜ|›6;^y q`¬ÿÇNÔäÒŠ§‰Î^Í(ýàÝOOf3²2ëÃc–hÔ„tÔ 'Fa3¾–ëVžä6a´x9‰‘Ä÷«¹íZðØž`Ú O ­wJþµ2¹a~GwÌÌ8·ë6‡S·¾ Êp" ÃlÚ³¸”u¯]€4mkeuOCÌ‹@9«êŠrµÜb ÒŽ¹k4ŸŸÌ"Í´B äåL0©ämÄ­/¦î±*81â(ð1eõkíÌÈiHŸ0b<"\m£)yñy%Ww^Ùzè‡ @xÞ†,ê T#TPvÐ`}+§‘Û:I> ÉB®Ô`ªXØJ´XPxÒp9#i¦Ò3kÈ%ã2ïˆÏ™k2ª£¹‰YE𕨶ki™a ˜h¥f"‰Ô¹í¨š½ä"VÓ§ÒdÀîÝŒ oâQ£ ê6_i8 ‹<ÖVW– ÔkUáùò+l\^´uà†FNºÞ!Ü« ŒƒÇÛ<^]¿y& O(^‘H<ü³v˜Ã—©Øåee*×½Lß!tP£§¬0ƒá 1 BödÖ0Wò)žÌtÜdÀ}ƒæ¬,ç X*(Y¡“X¶‘hé8½D„T³‹̸gê…Žºú‹( §9D)-ÒI¤ÉÖ›|i„Ÿõ ‡û7PÅÌün¡Txcå¢,´`F‚% ÚGZxW÷Ø@¼„U=.c_ÊË×­s«€ÌŠ‘lüÒ^Éy”N^\¾Ða‘pOïââêÆ¹âÌ'Í-ñâÝÈ•äâô}›ÛØÃeÕ§éN‚\øùM›£µÌ ÐÇŽSþÚÍh½¿á™` `©‰¢þ›Sbº>3i'*icur`žÖr‰ø-', ¥ÞÙ¹œM %sW”i†—ºVlÏ"3f 9à4'3FÃÕù…Ãi1# )z.@»”'¦¬—//Ü Ð„‘ HÄA][òtsæû%]eîC€ë0^=à@º‚ë9Ö]æZŽCõábñq*s;°ã„‡¯Æ%¬‚eD"ïQ’3Íe&C'N)CTBMÙÄ««ÔkrU£fõpfáUQôg ¡uüyú=ËÙFd©ßàiÑD$Æf]V[ñÃÀâ/= *º#„ëqk}¿#XÃO+6ÅÛå?Œ–6+³Òã¬.gå’µàüxff‚eðœTbÓ yJמî·Þ Ãv)´àíõ«6HÕ7Ç 1£>óÊè$—h)p˜¶¡NbÓ&µ‚çÕËËzâÛÞ¡ á“¶@Ø’‰äo"jøV ¦QB;ZJäuÔ‘ˆP*ø›BÖ- LÆácīӥa™}‹ð¥SS([È8‡A…Nvv÷ö•¯çÝ»sï—¿üÕ?ÿ¼îgXÅh‹öùL,™¥M\ÞÓíxÈa°Ä'áêÓ÷¦UýK¯¼ŽNwô Íèí0’i;‘¼ðê€ÁÀV”Ç"NÃ3ÊÙò¸SáaïRKMHåAEKPÆ´é›pšp.p‘rö¥9e²‘îT¦=é×½S´ÿî=x€$V&Œdæ(a#Ö$F,^D/ö®×³³¯¿þ­Æ?ô©¯~ý+W¼$éÅùyIÏÛß<}f–KÏž?EÛ¢™žC Wm~ç›4ƒC5Ô‹%"„{RCz ÍêK´¦+SŸõ}Ÿ¹¤7 (¤,!ìIï³6G¨î=¸O imôæ—àŽ¥¨ãO”è)W€¤ù¹Ê‚Ó¨¨¸6piô‰£,W+5äë/ñ-ŠGÌHÌa¬­c„jàR¼¹W—–ß6Çë&ªÌàÿ…\JCêÜáÚ‰žëiP‘ miè|… 5pâVyxÆi´bØâuÛ¤?tmÖ5H¸¿UÓu‚[~˜&#ÎC‘ Ýë=g*ÓꋆØ0Å0FÛ)o[Ÿ¶DØèM“m)tè,ýäR#h?èÄ]3yOíˆèB®“²GOæ %Z ¥ðô0Ãñ„Á§icòQznºEÒtë¦yÏx2ÄŒh% FXõ™QµbýQ¾o8k½¤Fç[¯èE5D6^L Q–øø›ÌC`XV‡9!«ÔBꈴM9G~„$S߃â6^á©"á# ,7:-Úw­^ôþôçò³áûðë$˜”"FçðÐ$`]…ú(K”r÷^kÑgp²rãêâÒ*±z8ÄÛ^Ræ¼ÒIHêƒe,j˦¹ˆ'=i‚C‹šü²4®(×DNžÄ9ü&Û1yø8x'çÄHª“kzsÞä,xï©ßhMÇK­“™ûÕŠÒÕ¨2 ý„†'“N„%)W£2¢ð?e¿e§Ý›ÛæØŽÃ!Áºô‡JvÁmÓ’«duÅ ºœ¾”Ô “¼ÃHƒaÅ_‹mƒÁ0™àN‡±C¦åô¬oî¾½wßöÖ»Üú‹ú§füݧïÏn´q÷BA@@î,þ/óÆS²³,´4†…ÇêÁi—¦Ã¬~p¢r¸í>‚ÂU`i»Håü> #®dnÇFŽ‘ŠfmrBó[£‘p “èp˜ÚæëËjöyp !­@¦v„u7\øâÿ¸D'bx—£­ÔPVc`Ó‚† §|•E¤W^.Ÿÿ¤Ži‹®cÚ¶È4œ7ʨq Vgmäþ½û½àÔKê_Zˆð>†-¢ŽnÝt¦sÝš5Õ ¢ÁãQ>=]“‡÷ðg¤™ÀÌW pÝôŒgŠ¢ó9šÖLk¾ÜBë®ØvŒâì0œss•Æ—:åܾswúàÜ2:Œ½¼’5¶.Ž1r‘¸ûã™>°ïH­°¨Ú®‡êTºÌ,¾òºì2á«<'FðÕ}Ó%³öéÁ.ÑO±Õ|ìNF4¥¹®«…x>é™ÈgûpO2<¯}ú³õ?è¢àÚŽ0¡Šë뀲ÿÃ4ßã09¤ëÍ׳\O¯½î …æÇäðö›Ó{ݸîm¹¤ ÷¦$±íœ¦5œÎ„Ø6áÊãëYÑûE|'hnGv ×|龈i›¤oéØH•'ó¢³êÓ5ù™¾ªóÍf£BW¤w a*≽‚²Í=*hÀý…6Ba’ÙðïH–ìy÷Fd#•‘Ù{÷uâØ ì T"Jr +”‚ ™wqøzO½Z 0=°½“Ad–º{~të•´²ÙÅÓpmq-²ÛÂÕ8”1ƒ˜yš¬Ÿ—ùêò›ÉóæáYªÕÁd—&£Fììõ¬=‡ÌúÂÜ[£¯­Í2x«¹ÖÚ4CÝÚn¾ñíÝ3‹²L¯=ÔqŒ5F®®ts¿Háóo÷ §u×2A8º‘Iú@ ™ý‚lMŸÚÔS¸¸~„aþeÄâ-ô¦«œ_ŠÑ͘MyuÀ¼,ƒPZb]¥HНS’úúyïYþH@QV:mû4ûÕWÞ¿|õòÑ“OÜP¦ì³Û7uu )TM¹š½ô1o-³éöÎm¯DÇ,6¥ž×‚Ÿ4ÌçØŽÐrî¼T‹ÿ2Ñ\O·,æêÈ6î²¶P5]µZÐ Ýt°2xÚ@ E}Ì/-4û>¹vå[«½6ÇRRޤ,¯¥U]ÙòÖ“ÚSl‘Éý¦·ˆ8Ùd‰º$¼O>þÚÝXÉáïß½¯¹²U§§ÀÉ­Ó抴Jª¯f^W‹+R0_òW¯”0ùî¤>r²w¦Œ!=¸³Ý_szÓÍq%vqó 3Øà¤dÿŒióÉmÅâ~YÖŸÞ¤×Àƒ=a‡sŽ_q%Óìt£ƒ›ËÁ‰ywaèü*Œ­Ó¶®-gš7–ÙôY¹Í(öD¥Ibå"ÍC ªK’jf†9sG*…\CÁE²#7È\Ýë&6ä ísàëÏMYÊ 7Ü8n†ŒV þ±A\þ®û~;×d}ðÞ_vú‹Ÿÿl°”¬ÁžAyÄDC5°8Wÿ¡] xuãë ÝLñ¡û„#’±ÁUN²÷ª4N`¶o…ZjÅÀ@“ Öåmü†[¨J5èŒ7NÌÝYªyÿ²äÔÜ#<!†´0LÇK`ê#:ʰ¥û• 4má BúšÄ¥U%•$`W~&àR‘7”è¤MÄ3€Öò“:­;`|‚¬HkÖZZ/b S'Q`“t¸6+àOñþ¾÷TEðK)û£g Õ Ž"„#&<¯.^X=6‰ÿò×ÿd³E„n¸] Î‹¤[ƒäë1<†KÂZó$Ñ¡µhDgÑË0¡Íoæ>t0£Ã8\7(ÑiÔ\ñHmë>ê,æwêÀfG9É —L?šË¥)éÍ=ÔóÎ2Äßʉsc_ç`,ü8ÁÁß­4c§„ͦi† ý`PgÀùÞwÇ4”Ì0Z¸ýK•Çë3-´©º=ŒD‘[Ôx Ѐ𥑉d›Ëï°_QæßþQv’c0C'/ì6º°‡Ý8«Õ‡ß-è;˜ñÒÄ4˃܉5yÁÚ@GeäF×^€"8¹&©V«I €Ü/wªæ0.døcôäý½»÷¸ÒòQà1éŠ\*æå‘úÈdà–­”mŠRŸ‰·5_‡ ù韉bR$ÐÏÑhÁF+gñÍÿ‚´x ƒ©Œx‡“Æb&Úb™o_^þ§ø{LÜpÿáÇ}èC’¤?x_3 Ê<‡¹‹ÅÚ¹uîtÕˆVbÍ{™éx5‰•\rV›-$c¹iF&ÙXGßZ¶Ðo2Ó-¼„®}ƒ¬øwÆ@Z’º• U“å–ö›5U8˜t8Ó ˜‚_p5E¼ >† i IDAT>)/ïŠàLl ‡ª%ÿwK¤¸…]¡¯š9ZŽb…Yùö` ä´QúËUîxW¤íð=Ó ­W6œÝ¹GYifÖé½vR‚%UuŠ¢ó ¥Nxbcϯ3C0žÑäud‡p½z®¶PÁ (vÅÑ–Î ˜–zóp^i­x}¢6P`íT§t ‡½OÜîUï°!Gl^-ÒQ/‹ë'³Ž†Cñðb?úÄ?âó®;”‹6ŽnÞjf¨ó- *BtYæ,jÆ lÁü³)]-õ8)ÎÅ­³šwÊLs “e{Tù‹sužÙ•ØH3/ÿÔÑ9òh©ñN_µÌæñ&œÄâ“ÂÂŒ­Íd —AFo¾žYã}ûü$j­ Iʨ™á-ÌȤW/M€Ä¸]7H ^àùÈÂgêl¯®&ý“b9ßV jIçT§²4CO¥¡š«¬¦úÿ3uwMz$×ßiÝ@ã•3Ã!%JÔJÔzíØÐ†½ö…/þ2v8´’–ÒÚÞðçò½#|ç°uciiQ!JÁ7iHg €F7ÞýûŸótS5˜§³²2Ïû9y2+«ªCG"\I4’…Ùð8L2$i“˜ŽL¥íD{PXvl%¤¹²Û.2!©ð—ÜÊê¨ÀÞ—&€OœõKž„=c{¤ží5S a™à´Q9ý2²õ|½4GwtÅ¡fLvÿ-©£ÿq«A‡‰úÄZ†áÐq[.(8)4MñÔxÄKVÃåLÈ6Ê,ý¬£E’ó©±6¶p ö¨©äO@`¯b¢Žêa=ð>èÁ-hzýŬð—%ôv ¯À8ä|hæÚ„e¼M?³~ŽyÝáMJ¥•è·ïÎ_ù¬S’‘0Í¥°x±¯Ÿ>|ÃÈ.:kM/Å ão|øûøûGžxÖéØ÷yÐ%Ú`­Q›3ZªÁ “ï)%PoŠ?yR”ä¹Q+’äP…ˆ”<X±€;¡F¡c9/. SÌgü#*þËè((£ACH¯Ô1 =¨f_m‘3aÐËä ºËf‰‹ú«ÊPG¯‚C%’€>$õÏíõRÓ^ºëÎŽ€¿¤ ð’?#½õ^þQ ŒÝជ  §P™SB/·èÛÆ˜F&K—;àQTÈS µ6u\èÝ{ OHU©LŒÚ›I „bål\V‰`e×ѯÙÔ»ÁšÃî%ÃN#íïá{eû„Õ,mzñPRé¥ ^Óæ¼1`ÖbÈ愳~´Y£•Uè†òÃvsÓuš¢ØýèGó7û½ïý¾S››Pƒ‰E̘¤Þ…¹Ô»é‘íthm$-hýù¿ÿcW4¥[×Vy4¡Þ¨*râw Œ`Â’ IÓ[Qè ¹÷ïõÖY…ÆÜX=Ïoî7³s‘°õÌYl|ì3¢>ÀV RÐc +K^cñÉméôëf„Ê!m}õ0`W3ÉMÌ"ÊÁ͘i÷•f¬bð(Z^ ût¡ÓjQ|GÔ1>á8Æ9󵡶af¬A/²ÝÔ0oÞY¨@3qZ±"•päØr¼ÆF²,ý±_¢(â[²ênžÉ4H8¿ŠžC¾—Ê€ò«^Lþñþ–- <|ø ”ÉÌ×Xéàî`hJï¶>h …˜‚šù:5PnŸ\ÛኀxþøO ak6Zuá% |(]¾´‡É·†—Ìc9Êj+æÎnÎéïdWS(XTH­äAÝ-˜ù\ÀçüÁtÌ©ÞEf2ys_P‡Á½­×ïß”L‚¥‹e,‹à¤Ô>´ëæ‚™¨úi$p%/$ܱ«¢`l5k1ì†ÉÓ$EÖ<@pÃWj“µ‘aˆ.Ê_¦ÅÌÚš¾Ôïð>À´Œ’!Ãj%­%¶áÍ !×\m Îãê($ÔY²¶ã*0sî’ƒ †¯R‡è²<ØTà+^ªâ±"O,Þ4qOtC}ü¶Æ"¸G#¬{רt]p¤«*‡UcèÄCpÙ3ÀCTÔû^‹šä‘y‡È#,uyw)¾{yÇ,À{§Ç_}ùcøìÛ¿%DÛK |–V2§Ã@¾â*ð7ÆÍ¹BHJó’ØÌmŽx“ ‘b/Ê5D ÂÊ fîî4 7x4ˆ±и’¾ ‰Z–á!¼Ž3ÉÒñ”„Æ%Ѭ°šM&3 Ô§à(!uŸšQ Éf²Ö/š©$:Öü⥇ì‚C+)äOv2™y‚)\àìÝ4! 2…}ÑYL^ø1Åìës¬=W¶@Gް B…X VúG4"<ÚMfN]©¤!ÔÊuu”fC§Ày[ÙAÍbùä ƒj÷…Ñ´<Íð>x‰.é ìÞ0„l@ Õ¸nJÚ qV¥4eg‰iæß(‡Ñ)îЄذeYPö/‹•æòØŒízî>—@’xÚt˜“k1  QßzOÓG3ÑžûSИ”Uè*Ú@ï.õ&¾‰‡2¤…õq€6óí&m‡p³ªü=cšãKF:}æ×YÍó"ä¹C ¸*èœn \ì>LÍâÆáÒ‚ÒÒéþK \ú³O3á;v¾7AKÁF·A*SÐ+QO&N’É©÷@ošo?‘›ñÀø‘ €Nü‚ÞH_þàBSÖݱ…ÄÅô÷ýoú\*äc†¤š¤8µG¹gk·¯Jìûu:biú"”Õc[A‘%e÷t^30B ÈÝj½ªä7øEÌV´í±)CB[ŒH‡ÒvC6`ílÓÆ|»=ûmfÔ| 3céF½FMˆA$ÔŽ¡3¥ OâP84˜¾¥±8B̨µ!‰¯¬"4Fá<¸•ƒF\ÕÞ¡À±šè>½ÖÚGÑP@’Šà Û+Yr«w,+1Ì}=R ª3ÂþôZ“k>%;Q¨§YõµoÛM»³L©/ÐP.²p–˜¹ã"H˜„Bþ˜ñ#ÏÆNfB#jŽÜèC÷ƒÞédŸ;é$o†ðáÕÅ¿ú‚ºï÷ÿÐŽVF~ûNŸˆÉÅfD¡ÊÐp{%c(ÆY,AቜHÏoœŽLÌ5…8P¬㔵$µtšÊL°µ3RfF#ºÚ´ì›d¦±Ó‚C]Ò—ÂbP1¥Î‡šÁPc-·m :PÈŠdE¡=…cÕ*åFD4ÃyOö½<Í}z÷t–‘š7š¾ÛkÕc.oÞ}ýì@“WZÜ9¹MnÇÒXÎØl¦+š=yò•ÑFŠ;r»&»2#óy^”ˆ'n?c yxIj²ÕW.åw.˜"»M¯;í2áÃ×äëÚ8Ðæ’VK0È‹Z¥ò Ó ¥Ô\½ÛÁZJ üºÚæ«PôE¢±9¢ë¨1›1¾­ò*ª²#‹¬ >ÂDéwŽ_€÷)ïm‡cuDÕŒ# èMJ)hâ\•f–ëFAåfÕT?o InܽÿÓ”6Ùdào%Ôƒ¸Ú7\ôÎmÑà 8èèÑÞ%ôDKuvãØsÙÌOLTÿÅ¿2yøðþŠn8*ž Vw¸(6 Lú¥~Ä–Ø…ñ¹‘Ú¾{oK8ú‹ïÿiz›©2ç¨Å¦fÓ<NŸå6h±¢8*[ òdV7øóri"Òl )2»fòBɘ&V-3ŒÔJ†Hʓ؜ScŸÜr@Gxæ¥,ÊÌ1qש‡ÐÈ«*™Æ»0öãdîEÐ _ÌtOPhÕ}%+¡JÑš‘ébš¨à€NKÍ”AÅG?ÑÌÕ¶G42ÈDV2N¨ÐU xO¾Þ娦 ¿Öò#¾mq‘±äËŽªºµZi‹On'yˆZÓRÖæÍ„Ã`P9ÏÂÑã4maãôôöËsÛŠKçÅ%œŠËL ¶ôë…fÝÁ*t‘d$1úÚøS›Å¢½–f¨pgüá20å5 y¿:jy ¤aŒp\r¨' I ³ÓmsN@ZS-Ûû)^¸õ|íŒß¥Î Èž†4ÖêftàŠéq¿A4òL~–Ï?q„Â9Hêæ¦É³|eõ¿ ®’¡ñ»JOY»1OÉGê?üe-+—\D­<ŸàSÝi£¢/,{B@Œ­>I…žS´:ê¢Fð%Ug@–rqÖmA§Öï´¼‚¦OÌuLày΃´¡ ƒ/nÆiÿ½L÷õE÷Ðñ>97…&gŸgT Ð_0ò…I­ÖŒ2r\¤a¨cœ’ \*hë Q’Ê.ýP—½ÄùM»°…ƒyXuÏň¨yÈŃðrzz®IâQ+ßè¸mË'ê–NáUú¦îù¬iêÈ Ú,¥ï0ÊÁ>úhÇ´…wÓž^ö§-¥)pVíÅ ’Ÿ<#‡"Ô”ä·YŒÝ U°'ÖÐfï’Àö¬ª¶(ÄùW|§ŽB•ìA ‘‡@G;M©‰þ¯ÿê¯?ûæg¿ÿ½ï}õÕ/Å2Èî= M¥#ŸÌÒš4kaDáwÅH\%ÌÓm+êf<³÷$\ÄÑÜΰ„–ãÎÖ{´OÝWäòŽ¢ÛÿÙ$V0KnãÎF ÔÔ¬ãŠ-hî06?Ñ•|˜.v(¯=h ³whƒ)ŠFXÄòëÔ—m¬iiÆÝ$ú謽Âuß^V¶ÜQ]\ºx-A>æðsW÷0e{oC›Çï­(}þOÿˆo úÆ7>>õ€ú-ß.<»sÇ3¤ ØšÃJù¼ŽDv¹r`1Eæd¨cÙa-n¸! m9ð<4Š*Þ ¥•†a¼›´]ùZ¹àó´.ÎjJŒP˜HG> êa4`kk´€Ö‚«ãzàS/°K#€KNåpB‚Ó4k'Zv Ño ëÛ´y+uÖz§Á²Û§“I wúÈVmJ‚Ÿh^Ýi@:‰´CWÌàãqWY³ñ¬nŨߡÝ%\ë¢;è\Ô«±´©FGˆ¼cB3e60<ÆäBð»}WÛL˜Äè‹BëŒDœ+0Bí..Î Ú¼l¶À*×éä–6¤%6Hq€¥ÓAÎÇÛš97jÊr²™ü޲ÚÃà>ûÖïP£µ ×Ѓ÷±¨VWµ7ÔúÅ&P-9÷yYÔŒG/¤"[/®Mt1kê]2ô¶¸Ó–ž^Õa D£d;𗋍·Üíõª£žñT‰ø‰™oÜ‚W!ØSÞ¼«8—yØjBû#o5˜´Ûuº¯;Z¢Š–3¡¼î[„2R> âg™ÂØt÷›÷[Ðh œÅ–¶[æùA¾¨$ÁPôqb‡Ÿû‰„ö?bÆÆ1ÑÚâ„–·O½·£;†¯_¿ôlË›×=Â-ܱO÷ˆùm·ÞçÄÂqbc×2©ÁÓ²¶ñ‚¸ð˜¥_‚(—H„K“Ä#ž1¹.H95A:‰i6fDqw.8¼áßöÒ¹m4\0U6ˆ*0\k“QeZ››¼¶¶bÅÔƒPb÷ƒû÷äëœgÙ†³4oJ£­fî½¥{7l#LW¤© ’ w¸|¯þØF%ȇÎâEi(óš¡‘Ûkfܬ«6º`ûêŽØIï­ }À¤y0ƒFÆJö3aí>9í]Јž ÃuЩS«¦V"CŠÌN¢].GAmȰ£^K…?F‚£¥¸§ûŠ_ó‰"Î 'ê%ÖÃľkGòýÖÇ q.vŸûÝŹ{¦Ô¾—âE#II?ƒ§ÅKlÎ-®0rhjŒLC~Qgù³üÚML¬E7N5ãg©ŸXF‘@¢¦f`U×™©A™mûKz“Kǘ"]ðŸzf·¡³"BäžÈ¼_ ×@’.bÄ3¼­ÌŽÌî#IvçŸèÀêò†f ‡ÁÒî Í‘ƒHÙm;k.¼‘ãk‹öBI»W  ±Þ ‡XyÔÛ•œâÓðFU<(ùNì;elü`úˆïì÷²¥|›83iK¥0JÅÁÜYÇÒ«–_‘UøÃØ¿súb'Ô¥.®1Í¢«³N£†‘P"àÉ„6éÊÃŒ¸xOG¥­ûéßýåïþÁï}ú?ü‡¿ýO7Þ{§€¯úôá*š!|l‚oüœÍRG·šH¬G÷˜Zé!gP$LS:Æ—t®1š×[ÆfAŸ¡¦ê¾xËÎM…åyí>âºÝò m“yqÁ#þ›ñIJFÉ?ä±T|ê`–…}@˜‹>[ƒ©JAGiÅÅù9)Ëk]gH™4&⢚¹=K†¦s½Ìv»Oæ±ö|««·z{§õ³ ßËjïpñG°:{ñŒ>sà#0iéh¹ Ý[úM‘ÀÐT‚>Û¿ô;&AVÔJ¶N Ù¬ÒýDr +•ŽÀ™£6ËJÝÍúfù^[KrBŒKS)nîVœd¤Dë™y—ÊÖËa•™ IDATà,hãÈô)xuqû#mž3d‡ =—+çD%1-lÛ4kß*@d O+m*‡³×Û±¿~úµ±Ãáùyï(î`ƒgDíâ¥kfÆWѪÕ| u¡¦…·|gÍ`FŸÆêwQ{ŠaMYæÉm®M^ˆ™pѫΔ‰LÁs¸;¯!"•V¦ù£†ÄB…#×KõpÍø5Óݧ#¥g/Ü,6@LÞ6Š0cÊ÷/z´ÆŒ9ðÎÝU¸ŸûÆ; |iBzá»O¾úêýkñÜ.߀w·Ç Í´úPÀòÆÁ»w_žÙ—!.a( nß½›àfÆN9@‰i¦žµgý—«®[Öƒ‹VXBqùŸ©W{Ioú œwPõÖÆ±ÿÂÍŽ¹­ Ñ“Wãv³õ-Ù*ýa•2³JL ÃXÞ ™…Cdq¬´Òä­‰qæ§.ÆRTçÞšp^^i¥ÕwÊåri®#!‹¯ZÌ¥¹&$pMÜ™«á%‹+1jݾÿïÿ‚È,“³¦,ÄÙû wa ¬5šÌºÓ,0›`½3[­û…J{š(þβ°6|‹‡cN[%ÔÙe"‰"‘YSŠ‚ë(ªœ2s 1³ä`ïZÖ¶Aµ6à—µ”#OwÇ\*#VöëÐÀU(]b{[Ø–Ê m.5¨ ¢±mÖ8&â… SØ…æ—‚FllˆOrÒìhi(ŸõmäKð´'ÀhCæÆ¶Y"Ábû"¯_ŒoD»¤pyÉ,¨oßN´å%žGl áLrË™¨\ÙjæØS©‰`aüÖ}Úò¨ óž½±,î×[½«p Tã ÙZ!qnÔ^tbœÁ;SÞ;Re$‚œöĨåRkk‰—ãA*¢©ç ±–¢%Ïeõ¹ô8ÒHnÆLo ò]¶Ro©öÎ[ßÜ‚zÙgãhV g¥´ Ž<úú ‘çÝÛÓ}o–“xÑÖËc¬Rt£¹÷¾€ÀÂKPj8FKÜŽ!) U•[!ï/wÐË…†®+£'t&¸$°Dj 6%vW¢€.YDIK4TFLsß„¯Ü’FýŒs^ƒâWpDu¨”¿¡PAG5€8Y—È,‘‚˽Q®]É›ÀKŽ9bcŽPåqNÖøË>ƒßæ'q¼‡ÒW‡:_¼[ ‡–’,— D ãÉÍãýà/ÿàÿÕÑÉý_þü§Þ^¼|õæÎñé­;}«‘¥9ÌìŸ={¦K¦¹h/ÞÉ úÉÉúÈ7÷! 3ÆÞ.˜%ˆÙxÑäI¿ö#|3¨ž€ðEÛ=æ=&f5`&ßxý¯¡ý.iÓï(B jýne´Í“eÆ0.†~§ÊÊ“å¸DÛà€£Œ¥BF©âêxUzŒÿÏ}ƒR+¹W7qâ¡z]dHÖDGGò3³#,›ÐÛÊEk¾ÖF \© å™^Ï]¦¨ ¥cI‚e¹pºŒ(¸ À¶qšGÊ,ËÑ{u$³JɃ, ËÆbƒ²‘§îÊÂ]ÒE—¯çêL~P¸NæØÒÝ%ÝÕ(ô¢Ÿ¦[Y&Û0#º‰x‚µ6Ž0"dfŒöì½ûwD8™†ƒýõ³§¹Ã¤w¨êšÅíüPwbPˆ@X¨1)ëK8 "ŒÅuôh³¼è‚ªÐ+£Ôƒc°ÕqªŒ/WõÝfj”aq§hÑ8³Õ6cÌÛ]&4Wë"Ô5¦O˜…Èü†Å†:ö?·&@“Š‘-§i›°ðÖ£ü/^úË[™‘OâðÖ†ÚI0">ñÜbÕ£o|ŒÃ0,Þæ 4Â4ð é!É©w$ßÕ¬A]Ç6ÆØð謾aÍ5Ò@­7ºÙE°}›¼•õ_Nt –†ÜÃs:È®jö Æ'ë©"xD•.Áb¾f±J °rUF`|jäkE„Ìe-tÏ):Ùœùn³dò1£pƘ¤™JÐFÊ~ÕÌY?š9S£€æ-lƒ•x ÆÄ÷ ºã£—¾3âGÉhq 5¢Ý´ <­Dr]°,WÄ‹í«Ÿ£Rk×!L¤Åâ&Ý“uµ²E£ÒÎJß®ÔYÑ**Ç‚Æ&4ã‰JW, PbQ3á¨øØŒ"Z» à m»èîÊ DXQ B‡µ€o˜ï™Hуh!sTu]vå°Ô¤1ÑæÝÖ³ƒ.í…›nñÍ¢¬o5¾ƒLa‡*p嚃Z™Mï¿ÊÆ'²¹„*p`i`ÐEaâáNh%ÍÊhËÉœ"¬ö—þìÔáª!Áj±×ÌÔz–[įý‹ÿøÇO嫨r™³ó3ÍÒÒH»}°£´3ËV§.y0'•ʦq:f0,¦txr›aèÒ¥iB.©€6…[pWBÕ¦÷I!Þß9õd>¦®]&ð–¢uÔScÓÝ9Ä~[~ËìÈ-¬ù 3úô?%äiM¨:e„rãeç­º( ³Ø·|€/¿ÓUIj He¼M²'¿ÔÕýKA®9X<jŒŸÿäo}òéË×ξ~üúõ‹ãÛ^–ùÀãs±((<ž½~Œ¹P+̉‡­Ìµ Ê3Òp¼s:’IËñŸíòêìÌ‹3/¿’4cóÞX‘ T3·æÕÀTtU¹vj²œ9‡Eöo&K\Ù¢²»øî º¹É„»ƒ2+ ìØÔ0Ç‚Ò+Í °t:‡eÕÛ¼!ºZœ^K³vë5î=pŠ#Z¶Àlàñk€d[½’Ðràäú(ÙD˲eoÀ)\áBÑFŒ+ µDÀZ¦òðžHÙ`) ’ûøìJ/ ¦o–ÉÞÔ­GÎ{ðÕzá,Þ˜¸³evìM“ND6*¦j^²xØÕ„2]HÙ±xý’º^ê}vÝ»¥Y"¡î"ªF²ƒ¹F¢‹0¦ÆÁDqªÁª€rQä ™Óèäð¡mÞÆ*ìÏtW–«^ÃWDªI‡s7#jƒTýp™“ºt Fí1Ž*²xyæ¦^K•Zk–pF¶$~þü]2éòEËW€ ÖpÌN.¼æÊÛ zµÐß_ÁÞ¼ÕmšR|ëTM¹gS¯eƒ;Xˆ5-+jQ‹ÞQ‚SÓGÞ^Û§c– \sl³¤06¬fû:G¼9ûQ#2˜·wo´Ï9g“x\ù(¨±» ¬vü*ãExGuSo„9gP/êõ€NíAðK¤j÷»ºg4º]IX3W ‡zCƒß=èN¥N½ëOœð l-%!>Xéé2Þ“oëI7ô¬‹rHF¾.) 7çŸLB/À¬’ÙK˜½ÏþõÓÛ݆—,ã„­°uŒ{ ŽÛ“Opšå”"¬NXŽ2à0b›{të·•¶Þ{d\(BYWñ¹CAdnwBŠwRÐ%AŽNe.êš»¤R3s ªòȦ9Ê®ŸáŽ­ùjìo4þ?,7>5ÐÛà_'„&÷5RFï0È ºš<;²Èá…‡ Å­¶J ÂÁ-“À×7JÔP¬ õ€ Ñ@ëgÈ;0…ð1Ùƒç7•b3€@\Þ£‘”êãó  †}!#õˆZ, f}·»lL3½ñ øÒ‘GòibúˆVn“ù\2ä©Sô2Q÷ƒfFrëOãÏTT÷q}©†A£7Yée ¥oñOåV Tt4”Кé Éðhã1…l&†ÒÃ7oþú¯þ_ƒ÷¿ý·ÿÍý÷}IûáÃoH ZlÕ:"ã¤S·~[Ç:lï`äxDÄÖ %V–9jfSSíhœâÔè é6hbÓi”Œ¯‚@Á¤1ÖäÛRÐ÷°, 4 ôÂHóTƒÄ,ðXKgƒTæÒvÑ×¢~ÎÒÊŸeðl} ÊíñY?Ž£òEèÆUñk‘º¸€kCXÊÙ”‚‘¶Œ\‘³B”¨iüášG[(q!LóÉÄ Ïõ|ù^7b&ùèþéÙÙS_Åøä“Ï$qÚSÁˆ2¤8Å/ŽÀ Y,vJc3Nû©´–fçsc´ 2Ž©ñªc”êæƒ°h‘4 ï[¹¿øuàK› !øgGÐ@EyûžØ‚:Â5î‹È…Û¶¥3µdì=Ø éè Â縒³3½œ¶ìÔß gX‘uxךU*v—¼©o QSvå_ÊZ- ÊŒË)˜ZúUfZ:.ñ[PFª«4« »z¿{Z›Œ¿cÚGIˆ§™‡¾Ž-û»6]D‰cL{-Ä„$ÓØ."Èq«Ù÷6,U“t#¬äàb·Ll—䣶P ‚Vפ¼Dä‰cí9õ H¤ˆYÉPÓd¢««õœcÒ$Á|]\B˜«ê‹^Ú¸<ƒTÄœ÷¦1œL”«ëÀê‚xŸ¾qêTÙAMT¤%pê5Þ^€\8šk¿3iÑQÛuÐèÁšéX±Lw+–ZjCžZ°¼xãˬ¼ôqˆ<“óÎg/ÂtñÍ€èuÿîoú€Wþ ’ pÞò ”Ó oV²ø†© +ÞõlºJª0¢¨zKa…áιìJ¥uV-IP—q“¬„EâW% –`5Ëb ü‹â ýºS¡!­5éN™R…F¦Ç±v¡@ )©!az˜'1«e[p7f`ƔƄ°ŒÄT@cJw®Ê)x^6ØbU©\¤´©¢}!Í85ó7\°%ÍT‚‚«Ð49?¼Ÿiên Ѥó~ä·ƒ¤–#kƒt½»:1½ö.q;˜Žï“Kp¢ìøŒÑxWªà"!‹+ˆG³_æµBw‰ë;…wX(4¬}/ÿ~q°W¥I†‘=æ3D¦Ìwj8Ê„ŸÏ.‘a9®  ª}ÀQøãH{ˆBFÜB‹CktX¢N©ˆW¯@ü©ôäļÑH"CÄD¸ÀOz|¤a£š< LŒ;¨ÀU×.• j×<@ :]U¿d¬Éj<õ¿Y Scâ‚*Í–qúÐq£¨Båki|H.v(Ôè•mÌ“S~‚f䢬åâÕl(t§Bì«ñ4¼¿>{{z,¬Ãx°–ZÕ°@Áêða†‡xxa\jrî>ü®ˆüºD @¹ÁÏ©^Ž-Ð "ÿÛÿî¿wU|õÖ“‰we(펵01‰‹»[Fh~¾ñR †ì!U¢žý‡$“xôë¸<äDŒP±5€8”µQ E’$@d«VÁ¯´‘„æ…è÷B<ãèôÎ\ÓÇìä]FRôÀ\ÖÎ?œ—wŽaHúí X‚¡Ð †,:t n9Ú5‰8í¸¨ Jã% ‡S”„t‚)LœŽ’ì»BÁÙ˾k¹WÑ/›³Â‚ ЮØDë¼yãóÏ?ðégßùî'oÏžªç-Bµ\ƒ(¤¤¤ÇwÚü‹6 ÐÑuHŒ8±¥f2Ý4Åñ—RMÕŒ¥2׆‹³ÀåXðD$¹Ûe Œº»ê€Ëžž ƒl!»œ<ÍhSSÚO!åŽä ;bSh¿ ½tÊ¡¼ÇÂÙš¡ EÅW÷ÖCn 6´ˆÁì[¼H·íAÑ}›ùÈ €Ë´üðìé™/?ùŒŸT ZÊ8…¨W/,{>{Ú7—N¾ñ »\ô2ÁÝóçíÿ“¬[Ñ1a³ûty‰Î™¸h†Y£ÁB;q£8%4õb šÉ™Nôª¦dD:7úµôA‘ÖSgu¿Á´Ér²Z%2^œê>´u•Ø×F¿®FôtUK]üFêP¢°Wýnû+˜[ S¦E\ZÊ_6®ðõÿêØÓýÕþ Â±Ï^Ó€ •¹àaÔ§TÞH6Ór `ÓèËÄwÄ·É´æÃg&0®)¨ü é …¿I>ô²‹ôXO¡Ðð?³ÉäIª(Јç¡'§:">!'ÄA‘ÝË”žÞ™5ú-ò¤ãÜÏ~ëuI³I´kMs]lbÚwFp¯Ý{KêäWº5óœ] šî  È éÌÕ™úå}ÌŒ7y"Fm¡7ŽFh}¥‡ÒòeÚ 0fHÁ™dZô]N²Ð†võÊÔfƒ-†€O5ñEÑ@>@¹ö 䣠ž‰lÜÄ—P#·%ìíݺ Ap6_Q¯‹z¼€à”̆…ä™>š‡Åó×RÀáݲ6cÛY‘–;ꃦ›³f'»î}Æõ¡nßb¾Äý4kŵçÜèi˜­›‘Ðî›ÁÍÈäCFâàh‰ –/õ ³¢¬ôr)›l‘ê "„Q9yާ©qs6hJß,ë³.€ï¸ÅŸ:,\554C*{‹pmFJyõ°jeƒ(ÕàKõv€™ÐÓjÔkŒ~Ç‘q/ ´&_œB¹;;‘P{¼öiä^èWX‡‡KP½†×Ž4è1¨àÃ[øFŒÃU‹vº$mÒiiËKäÑ&ÍVL7Ÿ¨z°J›z™Ì yècK KŒ«¦+ (°Ë¨÷ì¬'·ïÝ=%ŽFL®îضİ4³Ø‹—_ÿú§Dÿé·¿{|ãú—¿þÅéƒ>ú”°5ûroý‰4Å`j¼ÏO¦iÕ™‚¹xêeÌhV†è·Ç ’ÇÄ ²ÃZ¯%ø®ÒŒS úÕuyY9(;ªŸŒT»™œÎD“-N/.ê)‡]3î¥8³s… ‘éý !: {¬0ÄçS¬Y¿‹«&½1Œ¥ÄïЀÈh0˳ÈÍkŒ¢.(GÊ+Ûâ×±×î5h9Ì&„”6]ÿŒÈl¯¾(Р˞jã@°K0ê%¦©aÛe ^Êm†ÍT¯ å(¨×‹Óñ‹ Sƒ6꣛ÉžC:Ì:,ÁƬG{¦Ø{þ™DFcZoö`%[|IDÔpƒ~ ±ä/pµ%¦™Ž¾î…y ®ç FKX\úÌkDãª`©²û*]¥²Ã°­  z AcÒñgT€0ÔhãP¹5&(¿W÷ªSÙiM';\éGÉ”ð¥#8HIóqf³¨„1V‚ãhj€²è«’MJ6Ôˆ@è5#äµgÏ_œÜ,öò’çg¾ã,w5>¹-ëõ@:³U¾‚‡xßΤ±ú#RJc‡(±ßÑó¾Ó +rE!B”¯¸tt¬ŒÜ€3þžõ‰înƒVºÄ`Ÿ|N¶ˆm¹P¿|ÙD¿6{uoõõ$° ÀT£¼¿ .e!c“[ yâq¨k2àØ˜/`€€éWƒí¨ÀÕŽOð&÷?ÓRm‘ %pÚuQ»I’œª4¦PêƒBqÍŸðÌ=äÔ¡û·Óëöˤ¹<†bËåm|±Ns{ßZ$Ñ æFfõ…çèAw£™Êjê€1· à–´#çj–4² /ÿÔDj Ê«ÆŸ#¼ªI:(^î=Üà(tBsݬäÿ&ʨ.‰g!@šèNâJVÖ×ü:Å‘ñ@å•má×¥Ð΃„`e|¨ö`«ê2ý³^Â+Êö2¬tAÍ(J×qpièì'h—sh¸VPÒNrRk?4ü&3åºcÍ!Eƒ×)Ø~WIŒvõ þì¡ÖCXópu:¦Ú¬d>?  {дÉ”i•WsõV±ÜPC«qÚÛ€îžfÆ ‡ª8’?õ꜕2*rÈásÜÖøa ^G•3ˆ*“Ø×‚3¾Vï yº“ÑPo³ä{» ±eÏLân·K­.l—F²ÓÜ™";8†zÈx¬¢—±yq²h’ÛH´K:æí |lÆù-Ñ‹‚«ûP #qdB cÊ‚Ê)^˜Â&ãNÔÒ ø0ΑÔ w¨ËWÓÔ²P"\’ްå´‹Ö‚fº©ý,(ƒÓŸ7‡oØCÛ*ñ„i¢·á0)4ô¸Ú¯— *ºÕÁÂH+‚a  %§íB­E]XtŸÔ§…‰%ûDpi$×àÖÍÓàÏ–rj—k¬u¬µÅöãaÈÍ%¶Þ…y‘šÈ@wp”UûUVÃF³yì6àE³Ͱ Äá6.ɘã<Äh' g®®9áY"§uïp&o0Hú¼ ^ÕN3´ðÕþ˦Ò/ÁFÀ|ÙÊW¼sˆvUsélÆ(bžÈ šG·y—ÄÜWÅ}nþ P]ÔŒw½A*RrìyÅ¿{ÚݶzvÓÊp©ÏŸ>õŠ>+o {Ì!yÍ /þè¦ ˆ€€¯²zj­fw/åÌÝÑ×#¼%1¿I°” ÐÁBtg DÍ4¶d}»z$x(¼)˜&ÚÉz2d˜­&1çZÚØlK"hŽG¸sÏŽNãÍö°BøT¾²(Â!*à R £“^ëâòh ÇÇ1ÃwöÃÄ€g6¸vÓò®lþgL‡BµŽØÌq‚Gé–M¬iÉ呪=Ù~ùOÿð³ü§oÿÎ÷Þ½:yñâáÇß:ºÕìE²²XHrÐM¸—¹ZNM¤£… ܽc!“¡¹×í=Úw8íwB²Uc_†ùެtå¯ñ³ŠÅee…®Nœ¡‹:\ÎQÊ€Jƒ€ Þ‘ °\¾UAÏ3N‡rRmÚWžñlJÐæ ¬ÂUÞšQS‚@Q‚Åk&†0p]\ó/Jã—pTÊèÀÙ`&±žãnàGç¼´ÏÛ^¬ã6K‘Åè8±(l{=Ø%*‚ƒHÚYÖ@@aBAŸ%Íöæþ ñ0sÕ„ª;ÿvÖ€I}ÐѸJÝÑŽf~zaß-~…b¤„bÈhü°òPdÐ/CÕ·ˆTê;?ɳ¨ãZÀµwI­z×O ¸I7ÂÞ˜.i Ôˆ7ÐX€öõV6‰H•½Ql>ÛEéúpÿ®Yô>áê(˜ƒ× Ðø¥ýȶµW®š #ƒwM+íWS4qqŽÍ±Š¢„‚KÄ ¶j€R•øùm‘{imŽ»&BÙ5H FSw·ßy1QæÁùÆ ALE­§Ýf:ôÁû>ÿâó#O#ÙÜùêÉã»}‡Ô²ôÆh/ f“ 8·µ‡—4»•O-ܺIØ$¥Ü­' ½ ]0NOqíöØTÛþ)Ww¬Gr™Á$+3u .\º.Ž»Dk«)]0È É¡”épen? ÂÄXü|ÿâé“_ýâs÷Xo!&ǺmÇyÊOàò}nóMölxðüùÙëW/ïßxþØËio‹˜lÏ7E3Øç»,‹!9G&Õ˜äžÆeØm-¸~Ó¬FÞ)ÓC¤—bú®›×P\ã=r€‹Þê™Ö3„·12s-m°Âµ¼ñÁkŠa0ls?""³#Iê&ýA»ÕZ2ÚÕ"üñÉ=ˆ @‰0ÙÀµkOç±÷\¯¡çi”&i ëí0Ç9óâ^NUb(á”j`+›k™œûP/WÿïŽþ—¿ø>€HД8¨cXË€øÑÓЇ넾u;äRt5’ Ólw0>ß»/Yìßõx0S†’¸!çVpc*L;dfHRìÙNêcкOð5ÎÌÒy\ºãP‡GŒ!JK•åš ˜mý`£¨Çxº3ælúÎi  [I¸{)¦&›Ñl(Ì3@Cì½>ŽÑ\ÿˆ¹pEþbð›E=¥|çîRö½Imº?Ù`Ü’ÀOÎÐJ€ãÂÿøA,;ã‰Ò‡J~·íÈ´ ;*ôPÌ)‰Û•Iè1b9pC¡_¦Àh5cÌv¶‚xƒ´UÂÄ£«êñ¥œi̾³vš ”¾™AtQ¶öÓ™÷•îý®âÜào'Ì cƒeÇÕè%ÂI ÌèwhÁ_€#†äaöŸ ÍQÀJóÓÒ/Ûs¸N‡Ñ\šR–¤7ú‚C³a§^N•‘ä7³¹¼‘¯ã #^²…º¦¦ŠqbÏ5Úñ&|Ý}–öC§¸AQkv€UºÒ%d»D€5›ÅÝ]^ÛÐpª=›G+ He-uQp`6jEëɱ.qµêd«„15-ñ5ô\k9J‹ì"ŽEé ä!UB6#f Me¤Î¬n@eÛÄ<¿KeèëaÔÅ/–­Û•]ä&ë,ežxåF^ƒkû,õmÿ,;âéÈjŒ;~™„¸=†7¿]ûè—¿ú»»·?ýÅ/~|tëý7¿ùÝÇVä·ñ³¼aØŒ÷†É óžÓœfg óK,cêä;vâË•‰šL´B˜Æ©f$Œý(œ=‡ú[nEJõV¢¿rS˜,R9,sð`Ã0Ñ=yüÕ㯾úôÓOOìÁo#ÔÕøªX_ÝIJøäÙ$—¯ÉV3'm˜ #U÷ÒH(M‡€Bâ5PwÈp IX×Û©téR;WhEX†ªÜÍš€P¥™²f:‚ ©6C³:G{aÕLD„)dØóKŤKà¥/í”u;ÈÊ!Ášh¦0„gÆaÁ ¿š ÆiÖÉhÝp,^H@é” @vØ0tzûɓǸ ÃbDàÈvÈLXAÖofËÕ kÅó!Cµq0þqIŽNþb«r;…&?d3»‘DÚÔåÒ V4ÑZt%F–FV’~у#2aÄã¡&ÒWsŸŸÿôgÖ<,' ’«¶‚Ø !ÍÛ°¬ ¼“ueãƒÎïa0–dmŒÍý¨Û|aüv÷ᘑ|̺Š ˆwâ[ƒ7øÐéqÉVêvÀ¾‡«’‚¶¡†|«ŸdX‡«PlßX9â’&·HÝêà/ýTTSäýÈQ2ÔCLÖ*Â@p@ˆ*T5«™™auû5›ujútÊ#{°@Mæ#Åçgöe`Ž„>ÅF -N B”ܸ8}ïÁÃFž¹1mìph¦×bGA¸oÞ•—ö²ö3S ”@êPÐÅ¥•’èÙ)2”ñH¤wùK,PLI>¦‘Dx8tq¸ DáÐÅåRXç’Áa¼hWÈ8‘fÖ®üžy7¨—‘6iŒ&gõGù믟‰'b›WH°I_¥,¸Ý¸e9Øž+ÖßøøãÏž‘ï)qê ûdM{@§CÔ/1è•&™zZ`÷3ád¢[5$¤2ØY£<Á=5»ú(ýÅÁð²¼\$µ_ý®x•¡ÃÚæsÛ dW 7¢ŠÙ :ÕqÚ÷ƒQMéô  £åD°ƒšâkîG`\câò ãdM¯i³y‚zùëûžúE˜ ~!U8úÓ?þ ˜3н]"£¦½é?iYÚÕeâþ¶º˜WI§0IË*ÜVŒEt·x©VË„N÷NaЈUC«& eýÝî„ ) 2›öšÈžQÏéíµ»K>È3—%º£sÙ‹­`aMØ‚_´è6Á¢d‚¸Žê=çÉÔ·FÜ4#ŽÃ\›qzyèêUÅ£œ¿g—r9 å«U?ADŽ͖©AÚð"æ°`p$[ .sÊ6l‚)ªÿn*¡ŠÀUêbÙzÇ •df¥Pa¨›þX#Xí›ÚÎ ó¼ÕÜWÝ›Ä ?ú&bÚ¦ºêì&Ô³1æsíR›ân!¯DSKl2-Ðô-‚LœõÛÛ˜ãô_Ó\#I˜š¢De Ct;²I¾ÒIÍàS¯ÙrZr3n–=  UL_wéCÈ$zié# =¾ú¦!ÈÔ³Þ%‰ƒKú(fNÆ„˜=`öƵ̡YÑ'Çî)Â4À¢^/fL{z {ˆqu`yò“{÷Ž×–r~-½³µÇ‘Þ`Ϻ/‘üV3,ë#åKLø»nZÉ5·WØç©+i@†$"‘Šk&@S8Kªe-FÂ{œØ^?SëÍ· •.!f µtUJ˜Ü–,R¡j¹o]¹=ûb‘†œEaê(Œy#ý{f®н¸nô²2”Ý3?ðŸ=ùêóŸÿ܇žÿ_þgúÛ!¿&f¥`7–ÈBX–`¿¸Ô,( ö€ˆ1QѰ –Q©Ý’¤É= JdhOÛP¥ 8Û"eÐþy‚""†1sÿhš¡Ô>6‘![ywÿá}±Ô+Ý fJ;¿G¼rÐÆÎk–¶^]› IóËEØg[‘H§ñƒh£¿hÐyIt½cô¸´1¡m¯±šíèס—Csé0.8lÉÿè)Dß2ý͇üÆ©–",z¸$© 3H—„‘=ÝzÍX)H¸DÈH„ˆbNÚéÀ\€t½}¯¡``„ßÃL ú:@´ô‹±Í×ÏÎzK$ŒëP¬ƒ2 À°FKÆû¢AyþG¾×nöE R¥ÁX&qC…𹛿w¤WDR½.ËöÚÆ±4Ú©ãÀ'H Ša™ñÖ*Ñèé‚. »°¿º;œ¦ÝÃL óNì­ÝTXBX Äf[6zˆòº'W¹¾Ähìý­"/ä·¯.¼€Ô@зFp»}:ð‚?|xn®~çÎý{¼Aš§ß{xŸ!0v(n±ptqïÒ™ü’ŒmnõÝìžøìvÐ ¨sKËe™¥øIŸo¢µY€ˆk5Žä2¡,ha‰U@dÆÂ••ê5{Oã ;ŠÌåÄ=ͰÂ×(ã'Pc ¥e™ïaBx˜Œi¦û"UñH’xÔ¦« àwu¡Fý*HpöÔÕ­¬×Ÿüñÿ¸pÍ yºÔTð¥7þì¬dd÷LgsôîÖ˺,cË~ÌÅ}e£±N>nd+93#[‹LjY<ÞÑãF©íV8^Ç‹Ñ5ˆk—½åúÙ#Ivö9aõ¥¶n@%bÇpØ’ÌÅQ‹½™WÌ7´´·Ã€ˆÚV@,§ËHAlL–„ÕNŽ…<ˆ2w§ÈÛÄe8U˜¸Ðȧ⧘R`T‡Zê—#uÿ©Áî£^¤á*úµ“œåÕS(d6ËúЖ©Q¨“ª.fë[QvÛÇQ×"s\‹ Àºòê9v#TÕ†•¨Úáõõ©Ucº&ž•Ì Bn¾J‹ó?ѹ|]½ÞVÁÂÆîQé&~©ä‘UCÅ$Raá“8Á‹1rqÙ¤Æ4ºÕ¨¶d2¼æÁsHš—‚F&¿Î‡Ñn b^ã%fq4ÕøƒA?¨gdí~ º2æ€]–ý½D7ìcÇ´4ˆMÔë²öø:oøf»HÅé¤ƒÊ Qaäs¯JÓD#."ñå¶}<¾}g)k›ÁÏ—_íÕ;ÒËÊ$@¿HÔ ¦+Díã.¦r“íK_« ¢Ús `´Ù}C‰×33¶1­É‘ ˜s2õCaÄh ›«9éjÖ ¾@9™o­"@„_0Î7àWéA@3’ÚÈÆ²ó|{àÇ™„Ä0øä‹çÿçÿñ¿ÿË?ü×ÿê¿ø¯¾zöØë{ªÕƒÉÁD¢.+")³(ÄÃÑ”Ÿw¯m¾q4Î¥Y®˜JšË\i~}ý ý~q†U«‚C3 ü‚7®}Äp,Hpi§j`Ðn ê=3÷>ÅZô"Ç¿¨q¾Š¨ñr ¸F””$ ¦¬Ä2ß×Ò)2ÖV]…‡0FåLµÚR媦YÚ¸!ò–µ=« ^Õ^[«FZlËÀòø«iäŒú²$§piŒÇvT¯¬—Ó«_Ý©£_erC¾Íä/óEøPëÁå­ONwÙEDj£4eé"ŸÐ[øQ'º¶G6“î U÷<0Ó.0ÇF¹; Æû6Y5:aS”¶òxeš:WYYâEƒŸ|iˆ+,»?X8™ y°å™ ¼§~]òK~]í•üEÉ¡^³ —f/€*1¨~áàݱêSoÐÔF_"š| ÀP¨†ôÀ ePx¿h4å‹Ní¾/Å™Øâ÷ìÙxìç± -úò*FEDÐYsrç–ãÛ'î!JN¥Eytˆ,M!³=I¼”3«A•1ÊPaô[¾Xlsª]èç-f„w?Ô(PÈ1¤ê8t&¢‚…Å’jw¸´Ít×@3Ǭ„%I5îÞÈgy¬ÜE€¯‹è(Dåæ#ÛœÁËeË´¦¬/Ý©Rzçm .¹ÇjÁh? §1ø*ñ»ƒ®. [&À'öfÎKfÁuàÜo ›OéíZ-ªì»õÕv”k÷®}×&|4êSˆvÕ\ó¬—m3wcþø–wZ r¦ÝºŽ¾ü°‘}Ñ$0Yw ;‹‰ÉF޵¹Ö%¤ª®¯Ì¸3o),Ò­tVœ¼›d“K»Íª½¬¶7U’°.­mã °¯†™±È•‹x1öœ¥j¶G¢˜AB­$Ìà2}—4¶°æ’‘Kc¡•òLÓ¹òåëíÚ±\m‹Ÿ#P19É€ïAÜ]®6ïEF )‰†ÖzÉ\û°W@o´ké*©Z 'sõ4ÈžÌÑ]u jha½õ,‰C1£ÑÜ::¾Þ·H‘¿eÉn¾ÍÓiÄÖèÙ ”½4…ìÈÇñlá ˆZ ±øK°OBö¦uÉäÜrÂð2|e¦›Ž ƒ¦–®îT[ëç­w"¡1]½Æ`jŽÐª š¡N„©£C3•{,(e…½º¿Î€Êe0Õ¦-/H²¬fnÙÝà–…¯{³Kӵߨ’möfE0‰ÑÂâß,Ö÷­ßú¶%0E:do ôZì\)öça~´x£5n÷sˆb*щr¶24°5E¼‰‡8@Ð]u{ªÁ„Ñi5C`…ÆaþI Ùö!Lp,"(-Ê@q("ø.HÕØÏÌð„aZwüª´Ùd”±‹Èë¼âÀU߸Sò°öÌÉøôãß}óêÅw~û·On?úèü©Û†GïÏÌÉp­^€Y # éL°[zª]—µth:t–P–6ŸlMÎ3í¾\þYë0êÔ¡ ˜JŒ€ïÄï”Õƒºª™‹µþÚk„>¼½}«ÍÆéëZÞÇMŒîV±ˆTŒNp4ИüÀrZ%MÌ`¬ é%–SH!äÔÊ £ëè² ç$7jÀãÜ(‡õ-(¿:º:ø3*\Ñ¥;éº[º%Kí5«vŽ<ÂÆ6¸a_O>¸…§€8Tú]A-FQ‘ê ï›}} ÎíE—²'mt0AX»|Œ°öëej@vDÞ<°25)B_pPߨf7Ù˜•ÓÙ»f_Ãí“{-U /<ža¼ñBðÂ(¢c…ɉ@°%X²¹ïaÛ±çe¹¨bË‹ypé¥ËÊ$9©kV5«ù‚Úÿ°r\Ö´@»²æLDÈ…å}dR¾µGàä ÅÉîæÏ–—â›ÙôÉ ýá;KÞ—~Á$FÛñ‹5wB>ûì3òD–ŒÜs r¬kÖqâµ;÷¼zûæW_|õÉ7?{öôë6ŸœÜ]:¬¸æ€ÞÉ#XßTÙÆÃˆÒ—V^f«8éjàF¤—ˆz\QƒMë—YL»š 5 P•jËUa9ò+ÓóŽ.½40ö13½@[ÕøÅ/Éo64è46.ÑW ‚ŽÔ¿A°`Êæ¶Ì˜v$}õë/ê£Gãn™(ÄhéÎÄ€¹ò1Üà ¿9,«>?ú³?ýŸVµÉþL†¥i)B4ªðšŒéÉ®PCŒ6D‰ó6 | 8{uþÂZŸ‡©ÉçXâòØ Ä@1ÛýÎÂ7cëå¹Rݹ“×÷hÕ›W ë€Çsa "™ Sm Œà7:d¡Ljì =E!¯wp Z“xÌ\@5¾ˆlí dGa­i»äX%± ˆS‡.¦ «ãyZÎv0kÄêÞ_/áèmÅ(Á¯îhÃÒkÏû°ÞìÎDˆgƒÿ¡É@µ–êu¤-év+g¾({Ú¨Íþnð>·¼n ÕËu€Ð©bg– tÅš{à-n£ _ry´ñœ}‰ŽÔcP¥èæ×¡FG°F˜d›L¶¦Æeî= ¥ÁÈ?íÔ¢ç¶X›¡‘¸Ü™YeÀQeÝžöjªÔø ¼pÉo’[Ž·’¦­YÅŒá‡Ù©'í‰T¿íÖ´™—À¢&ã3½f°™ÂAMÓ9u“aRꈇž®:÷;b …Jjp§fâ`§¬·;ƒKK4`£îz8 $3wT&ù”x4.Ì#– s¶D«3hŠq¹ú‘HçKê˜TŒ5©D˜îÀlYÑÏl¦åÒÖRz¯‹R‹¹îïìÊ_p$÷%%~š¯Mrršéc”t÷ŽÊ½`A¶¦œöóhe€5j¢ÒAÌÚ-¶lvœ#™á‰í@i£«C-jaλóBB¾Yã=é¼~ÿÃü_ôoþËw×=÷òìŃ»§2ôY©ÌæFäù5zHu´œ¿OMy‰²'Ÿ’–ýŸvýÊÞÇÆÆžéNtb·ziŸîÚáTÎwÊ%¬%”9âb( N†e® “‘ÁDM½XΉÚs%È»{z¿Ãf_IAk• ‰·Ä2gk¥åÙnÄgû ‹íù©íh©Ð­Dï’Ô%­Jšé>šcfÝêêÐ>ЃUN“bš W¦Í& š4bw¬Ï”îH§Ú/< ôZøé7³Ù4Š"†šÎQëT¥™Á]«Wò´JÓ©K~uœ.5iy?$d÷&Î{ÕÓa3¸Üvo"öïU&HÕ„d´œ%Æo„²I|ö&Añýöo}ëÁÃFž±¢T&dZnWp,aW$*× ‹ ËÎ^mn:Qͯ^DDnäŽ<’¿f0—ë•€N·ýŠ‚ØÉSÆkBxÑË<Å÷ Ù 9ëeùÊ}<­ttJYvb7úß9¹“õZ|8èüÂ; ¬f¨¹s÷ôé×Ï,ò “Äkq»Ðy^$D9A %w¹É{ JÂ{÷^Ü¡œ£®™­Í¸ª½–ã/±Ô5¿#¢¨õy˜èEl °Ï–¸ä?½,v4—C§ŽØr8‰%mìÍIL™¢Ñãpi‚§h˜JD\D­Î¨ÖzòtCkX°f…Q¾½–ZHÕ@Jõ8"7¼{“{ß" Û‡¾¥ê²®ˆ»fÁÀ*z 0wÝ,Ú¸iâÔK†zÁ«öFcC¢/D^œ—¸ékÄkhºäüMW4•Tbdé²à;I­-Þ·L³|Éc—ÉÚŽÚx'ØŒ³±Åfœ3´ o*qBÊàÛá;#Á$XR É [Ù¾ØÖ_ Ñ3/‚b$«HRÅÈè&·×†ø•¯¬ŸèF·ƒ}ž|ß-~Í‹*<û–ý­²ïCÇr¼7ÐÝÿ9º`ÎRŸ^J9ï¼Üx;0ÙS;·Ð`H¦M4ƒI R¾Øüàv‰ Mº P².ñ;c3`AŒ•áù»,ÈÔÀì´§µ3*G!/:Üu;²¸|X JŽ7 -Y¶Ã½2½šIÏŠôM÷|çóG¡‹HÃÜ;‹Mˆhl0:³Çš Ö^pL[êÄ IDATtMüF_sÄ’QŒ9Å2°CÑu)ô‹<’Ÿ7åFdø-w•±©ñËîݱks£=J‡MÜ!^GÇ\Œw‡̯WünKý+jð}㊃ï¹®.—v ©¯Î^žNÔÐBwÞ`W+÷…ïTgä༽jY —=˜—pl hiXøXR„˜R«ŽFÙ’éFw‚ ½CB¬9Â8Þzâ§ñU—VÐâußµMÔÚ`‘Ñé!v(,H·‘¶yÂTbÀKC`¿ÒŽKdîꌧµDÕIN»1y™*ì°á™»>ìsꩊeúº¦'þǚƿ£=:Õ÷žc?CÕí}ŸO¦'0Hjl¯' ÓžXd>¼ „ 8"˜‚ƒH±¶d+¬p¨-Dl(<Ú2”¶¤Âÿzn®5Î×G^lK†›Ò¬rr÷È¥YôE{@anrG/(Ð "5ˆ*5@øoE–±¼&EK¡x¢¯1þn»ãk©]²«dÆ…¶?¥Ÿ*ÙµS-Õ¬@œê®™ ¸©A«UN4ÓQaËœE={¶C|:f?jèVtñê ™µŠQ·'d1 #Å={ö”ôÈܯÀ&}uÑNbï«0ñ;¡ ÿ2ktÈÑÂwx޽?ˆs ddNc2d¾;½w×I#ÆÐìQ4‡Ô^²ãE Šõâž–(Âhr\P\šø òtǬöZ²I5ŽåbÄÐ>3Üá’–”bȳâèÔ$©2Ð=1“,[?:`OæäÑH.Ø©NݪpàŠ4ýg‡¨e7êÑØŸj¦S¹4 Þ­ò à>^ –ôãœVmGê ÊÍi‹IÖzh‚3Þ4 Þ…5=ØÜñK_'¸~ãôáÇïQñòüîé]7ÎîÞ>ùâ—?þøWwm”¿óÐÎú—g€Ê¢nÞxácsl“fÛÒoyt;ÜM,6Snµ³ÜÅ{—ÛÅC£î CÄt÷Þƒó‹î©>¹}ëË/¿`Ý'¼ÁH²þŒ+㙓d(>m5BAÍ t|qörÞûœ5À#e†‚ÖÍØ¦0fDâûç©ÆI{m %i/ÉV e1I‹yãœOÉžIOOò Ê‘„ÎÙâ†GJ¥&”`‰-˜‡a/\§EkŠÇ7|°Ÿl vüctl‚LàòSL@vÝ$µšðe Yó f'¶Já_3Þš)€‰¶ã¢ÅnÞ‹N¯$1{³Èîn±s¨|aì’¾ä¿ÇÞ2wÓ÷X^3Uɘ"Ž*p”/p);AÕ…W ÷â°ÄÆ›ã_ôçŒ-~PŸ1 ‘4T‹™³0 ƒN­–I¯Þx­ËMaàD4Gˆ'0)cMÙUJl™ûư7èÌM‹” Ðí?`ä˜"Ž E†6™‡±œÅé`v Ô½»¦b<…EçºÙH«ýÍ !±Wc…lA._ró"›ë«¨ <.Iœ¿œ« (W LQ[4+÷8ªͬŽ9ñG¾éÈNR6½O;ðì€Ú`“=ƒV€û(Ÿ7hž9k7®U ¿}Ó’‡4Œ Ø?ÃoFd#œqòÿ›!% M›®R–åóÁ˜^‰ /G$~GÔb ñÑ-r ;ŠþÂRƒK¨M“²H1ÖèJ5 Œ¯cÐÛìt{ò«ŸÜûÖßÿð/ï}òÉéõÛ/^µ—™`19d£JÛœº`-¥˜D\Àj<+jàô£›‰—1ü^¿1ÏMÏ¥¤Ñ„Ê}›è Ù³×Poä©SSf6,4ÝýVpû»û2‡ 73‘ AhÕçkãø¢?¥Òû¥,•YꬃëEÈÙ~Ĺ'âì„#Kc8þÉ?tÙ¹y¥/ðr Ât?A@y·S±«× S–­9·¼Æ€ðóÆkò¶¦\¯,«“ȰÒ‹Óè›W7nwä諯¾ÔÏž?±KS`¤ãèjzmD!Ë­ßÊ„`B¢Z´Ë­Þ¿÷¢]ŽÙëëF8â ® CMŽ[-£…¤D ¡(Ó>f÷IJ …*ˆHŸY‰µÎèpgX mgy¯ m·×ûö›^3ás¿§÷Xõ³çÖ¨,+X @ZŸÒ¸)`ñ,1n?~úüÑ'Ÿq¨³s;LN@VÄËB‰Åt ÜÔ[÷Ð:é)¬FXQïðD—ØÏÐöÎDzG_SHã#K&ܱ—.×òÍôÜÃÂ-\á¿Üpî–;mÏØŒ–ç2!‹mÉ¡Xã9°!cnÁ8^€¥//·GǨ™ÐÇÇ›Œ}w„.¯æxsqf±‰¼…z«Ìí‰3üE^`¹À}U»§„¡5Ä M™„j Ö¿CDøKLÊ8v•Q²;gV£º÷Ðä:D=3˜7¯^r[S:K½hÕæ­ ~ëö}œˆnù ´ ‰GÀIÌ餖æüG,$kÍü&¦ žÉãë§(¹sz· 7e ×d” H›dÚÍ×^RÀEÊ8û|ý#ÏuÌÌÏa!ªç3½€›JÁX º\'À:Õ …]šÏàè…6½Š#@jÍy2µ©ÖŒ™ùUãІ­êi¨Œf—ãÿM€€ ³?* ¾Ê¦à%sÝ»Ê æP—”xp¬ù5 ¸÷Ô†¥*ÈñrUƧÃhŒ›3  ©wyf~ß¼øQÞ/JëùIJ&„ ÷œ\Íܑʈ9v\EÃÕ¥ÔâFf7ˆ£‘¿^ɰ1Ò!Z!fô¶Ë]MÙ¦ |ÇCÖº»°õ}ñ•ç¬QAŽº[ø{*ÿÜ6Ú» /±¤M[{Ú`QˆD€øûá¿¢ín°K_FhƀءUÇ(ÎÖ²R¥z:›—¡p‚ <géçÀEÙ‡ŽµŸ«²Â„ã¦Huiûîï¶ŸÆ™@Ûp-"WºãkY&ŸÕ;³ tûl$áÃDíÃ`h© €œ‚<Ä+†3€ ÔG›#;kLÍgNDþ'’6vu,*vÆZ 0JK¤í¥-13zëÄÖâ?~þÃÿôÿçô__{÷Ñ»ùîŸ6°³|T-µºëÛ+gËzM ºÕ«¦r¢g"•޵‡al<¯ÛRhÛ¬7-d¿Q:IMóVù1 )8ÜR׀ϥ•ÕÒ£¯Óµ1åm€u ¯Bu¼o¹)J ƒE%Uh<”â’ÆjjàAéùFªqmÀ¦ËŽP°TêxXÊ“a”jòñÆ’®6øÿ©º³&Í’ä0ÏUY[nUÝ=ÝÓ=3­! ¢ÉŒf’nq£ß¢ Q `@\ú]â¥ÌÄI“D3‘Ø`¶îžZr©5õ¼î_æ§³OÅÇÃ÷ððXN󑇊°Dë[ 6 þèZNmtŠhõ;‘ƒÇÑB[ü—r×>F€11E¸»:¬ÀCQzÐæÍª¢P„;rØ]PŸk¥§oò”# wöYÔ𡎶Ï[ÁÀEŠž¹ä†‹›ÞZ<Å/‹8®F•••9N&Òjïæ-;©ÃšŒî ,2|ƒ%ÝT ÆNœÞœdZ(„Zõ.ahÈhº”K8›Yus'©„>Ò §pA°ŸŠ˜éSÒÏy"//ßNå"-ãùÎbE‘æIƒH]~Žr¤ @2k?¾÷¾EùÆ~­ØÇƒ*‰i[_EÑççÏŒBÅX“sŸ˜âjé¹ó†Utx-¹ª¨—gg‘gŒpÖæf–ü»‘`?éë •æ¢( ^t›Í1‹÷a!‰-G+:Åq´8õ8.?"±òß§ªâp†Ä4eVä…â‘ qä´ˆvmC@,¼6Å„·9’ =2Ü?2‹û¨!OZútŸ<|Ò«OWO£R`ÆE†"Ã&&âkˆ_O—qwi0{¤=ÂÙœàÇý$Þ¤=×¢ºƒ÷SãkX;lš«wn޵Yª–™  Š<ТíT WJ£dD—:üOlèn7ðÅÁºÒ™UEüDWhΰ”uÉl°h0™ëµà MOç›’W£©xâŠ"R½¶q—M Y݃{ìÏä€}::h©Z©Ê9˜w‚Kz€‚bzµêå1©ƒXƒÁNS¦•öf~ÌÔή2¸Þ8…„¼fµ¼§ ?÷̵²#Þ}*ǵêÞü#<ØDf*ê.ÓOí…·š†VûÝ|µxäç‘ ©"£é.gŽ…!‘NÈ5¡,çIˬUƒ )ÿkÓîMÎU«wTÒø§Kq9,iéT`f¾³gì õª Š»FI²Õ´ °6zzBC½®´Œ$L<ÝÑ<üa0øHÕFJ&§M×òÀß´¡ì'Ï$óؘ)²„7m‡÷¢:ƒ7Ã[I{Ö[ºì‚Y¾{(¿2ÑgŠºé«ÂÉ!žÇª­q¢þC‡~zCHrV‘çÃòOnZ«2.ÒÖèÑÊ‘§¦ÖÀ“pKl3o:¼JJ~†yZ.ªìÏÑ7"ž€& pcB~C¬.hÁ€ù­ £ÈÉD¼$Žýd6ºÂƒˆ< ˜ik¤- ÕT '°ŠM‘íÑC1×—צæ4‰¾üÐëØùɳós˜µ‹zVÖ")·ÂB™Ö‰rnQ&úY4ë}ò-p;L±Æ679,1î›à_\^’ªŸ¦¾ÎÏOͱŸŸ\ÏöM¨¦ì¼]ۈṢX¹­ppùŠ1w‰] 0B1ÕåƒNñ¾NE Âæç å „B¡‹]s`‚ÞÐ×Ò>è .m5ÅC±äW;3…6V ÏÎNüÞïþOˆP}â2P \ó ªic/æ=÷Ÿ6 'Œ”áùÐ{I›ÁÊ™Öîp<턞(m ·ÂÂíµVUü<è°àêõnˆéúœ“â2ämRibqh“óíO?…Ê 7<æÆ<€ðˆÐÓ›t«¡&ÏM?£SùQŒøžå¼j±îžÁRíŹ£'!e+Z ñíÌЩGÉG##ªFpŽÚvõml­RCLÞ |+#J)B’P(½KÃÏ(г$ €[—‡x÷?a‘ɸŪ¦*Õ¡VqdJBádZ—ã|b*e7«” 4>íyy¿K3¦Ld ÈÍu¾ƒ[H1 /ZföÒ‡Îyá`€aÞaC¼|-LŽz Ui"e-³`…Vh¥¿r#¿þ ™„Í™ª„…îj‹¡”Å“Eo¿êW&ÛfKnnØ·”zµáe“¨f‰©<‡yª[.<ï2Ä7€S7XˆL/ßû²F~Óhj*Ö³¿¾º°r:ã¶x‡Ó5.õë‹Í*B’Úáç¿S\­`²Iȸ!+šh>Ž# ¤¢GZ·vþôŒrZ^üçÿüûá_üÅûßý7—WµM¬k¤¤5êîí o5*µ¼Ü¡9†PìcJdË+J·ò6?V×øR»P »ìnQ-=Æ$ ­­ÚósbÚ;ŒßŸœâàäÌgãk+ DY8щ/ Q`9¿ÿ¿ü#%2«&`½…®Mò_¹ƒe€}‘˜ÃoûMcQàE×%Ú`aëLp™QœÏ@Þ;rh+Ñ#QPÎ1)4íÁØÔ Yd‘óé4AI’šH·¨drÔ%ÍEÛvçpä¼ê|Ú ïì©×noìñ@“—äÈ·K %ÂZ† ãšV£þÄt~J.7Æðæül&ÆJ˜È2(Ã_VrÛ¢Pä'£€ ˜‚ÑÆ` ÉñH‡ØŽËVé8ŸÅ˜Ô¢AkØŸP“`Cȶ^ª:Ð pš_Pk¤ "w Kšía–²EW¢%.ŒtuˆÞCÔ7Ãï¦E-ãHuA"ôÔ,K r” Ì€ y<æÜ¬‚–ïD„6B!ÛU&….¼âu9ã× $;ÚXÈ‘òIkåP œó·Ö“¥"‡%E–ºT…U¥Õ·+,Íš”nT™(úà¾MlwWÌÏ<$îÛëÈ«{wØ+öþ‹ñ¼xñüÓO?#†¤ )_’áNMz1–1¹xÀYOÓB'–ÑàÒzÑ£OWäã²6@ÚFQ&í%tJ8™F;ãòq1ûSy‡}²Ut®ŠíÒ„xêrwMXÞYŽ8"Rð0 k&`Ê”ÞOͰï@su-eưÿª‡Û —€g¥íŽàE«2„r€‴ab²ŸÑض#¦ÆlxŲíZY=‚™Tòƒâ6®í »í 6Çè5‡ïÓóó‡÷ßÿÍ_ÿäÿüWÿû§_|ùɳOO?þȤÌêþþêÖOâ]Ðî}é×r,¸€AÏÆzœŽmÛÒÝi4I×c¥š‘OS\$£ø[½@9¡â€Ø!q =‘á)$VìÄë§´im”U€Gç^ò%véMÚµ¨d»Ã¿LÁÀØ@˜¬¤G˺ð)ÈÓF4+ÔäëÁP£¿?í vЍ¤â·Ä€ÕùÍÏ€€É ¢iàíã”FdúeÍÍT"/ÊSJ¨<¤asùM®+–¨jÝ)eØ„—³–þn&°Ž~˜”(a›Ç¼_%6]1Ù€§tê7£…ež¢¹•/ÕMþ6 °]úÚÂH†)ÁÞ7ÍÓÛBÞÄÒ®ý¼fª]H½#žZÇË£ÈæTŒGàЗ,n™E ‰49Ç¥«Ô­»ÐrWÚ£¦|„§ËŽ)v˜ 0ËjŒ×¥jjè' ô§ )ŸÒ™Ê%C¨ís?=9›¯ÀY'©$ÈÈ98˜Å–»yÇ_ åA¬‡ù™ûž^Î1ÈCG© „6©×Å4I\X¼‘X± UY%LèØìKuà j>ûìÛ6 <={ªûÁxN¥Ä&<9^NYW2¼m_ûÙK3=•†¯+öéþ2 }U(áøtÍG‰&ƒt##´&˜ê™{ƒMè)ä‚¿=WÈv+>ƒýú°s<ýÁo`®£ïWaªG(æ^ƒâƒcE‡éQšgkƸ+1ñØ3ÍíŒ3Ù|~¬ ‘È¡£Ë`¨ÚºQžH¢9¶$~á»Hïx¡±S ÖMèþòÀ“ÔLƒe‰k ²o ¶i°(Œm‚5çn‘œÄí¼÷kÇÚ†¦Õ6uÉÈ‘'àrÇvèÀrûðÈÁ‹0jôªU§ŠV,ÜÑ#c 8}ƒYqM-UÍÄ»É`û÷w56_Ïòœä@0(/Ÿ™Q˜ ™.aÌ“(ƦdŸ%¯j;ñ„ÓSíÓgæ*Ól®-î§ BtÊ‘ 42AÔä}7j(j )­OEÑw.EäÊ Œ¹ý9nE€Ý ¬Z¦`L xñßl;Õˆ¨„>’]ŸDMKŠrh®R6òà2àŽõ^v§C^ €44IO;¦e^®æ‚=G<üTÊ›ËSi´oV'ìPü·û·ONŸÔ‰86âõLz7m~iÑYSfJo( §J‹ßëh·iåYˆ€'Çük– “£fH¸ÞR&ÂŽ†pL†`‰ÚÉܲYÀ)rù[ä€g:{i™ rY)“ÎÝÁ©|r¤-‘Ë…Á[ÖfÂßu |öl©Ù§ k &íö´É¤ÊÈÆsÄLt!Q2¬pP€Â†uÉ–Z½Õ‘éËâ©Þ´³î™_iƒoÿèG?ú™«În\…}Cöš÷¯‚iÃdˆpá+Á6á’gàÐNu•r!¸AÂlÿZ˜íï¥<™Wi¾âðbK‘qf‰m6Xì\éD­plëu'ÒŦҥsª®Â¹ Pl¢ž0¯HMC$$¶©f]`|ȇ„ñ¸C­ ØìM±ŒÕ~^­³£Y, l ©µq˜‰$¯hvïûÎSh— FÛw>aYÿù%½lm,t Æ&tá pDâ îQÄA»­PÍ¡- (IÜSFç®6ÀÛðƒ*}°óu³:Ѻ¥Þ[ˆeÉÂî¹…t aÂOéÍ>Î%N‡€!ZñhÅÇ å4,~¥o½ÙíèH]òËœâµÚ™ìßÈÀõ¸gš±½á‹›"ÄîÂúp¹akì+U«ÄAãJþ'K@$œÐq–§¦)N—Ár|m0ûÃH.”IÅo¥Ê.UžòÏÚä#€ƒÏTµœ%[Zy¢’ä°wŽ€ëC’Õ€pŠ—lT*†7`ñÝ5ðȳ²ò‚¡´ýœϹ٠&z!h”oQ%’&¨="Nù¦8Ü$Òîˆf“g¬—§µ ˆ øöçßÑ [G0s6r;„bŠ‹o|SQ¦  Hp! !™»ã€t“/ý¤Ï'€·É=ã™ Zê©¿JMðg‹›æ8‘ªIj//}îÏ4÷„TóbAÑCÀ² I,;zéøûÿ³‹CkkÝhên‘/r¬yÍBIJl̤±¼ç<UO÷NÏŸ¶Ã|6üsÔŒä²(îÂi=j³'ãõÛë³Ó3¤PîS]£],| Ýä9´t$:~âDåb;€˜MŽ µ¦¸ž ËS‘”¶® ý“3#VE¬GŠQ„jÜÙI§Õa˜À)[Ýš+²‰yåŒ9‹Wb©§Œd„À2ý¬®=¬Ú£ÇHëvƒ³Õ%4©w@ÛZÀ‡Ñ<ßüm-oˆ™1D=S!‘^m¢(º6‘Ò9¸š‡æ‚Ù†u¡”_GüÞM± ±®Nùæútsš†n÷Õ¾ë0üþÕµM03;8a1y {ù;ÒÁ²°[)—¨z· RetŽvhc8”v  ¡¯ên>V…xº†mã ̉ÐaH(Yp&àe~ s`v»1ûUG‘Ó´´&ª‘®Uä÷íSB‹Í[qåøHŒ&§¨”õSaÇ©4‡Aê×>WFMmV°åtÆi¦B IDATÊuxcézØQüYƒ»RÚ‘LÔhƒ¬;~ïîÄh àç^ˆ”@žkÁÐ&g•¾÷A›K §ÚÇ`ˆ ä4Û¼ íûY¢Më]„8aä¡9¦²òoÑN Z8-Á+¨H284B½™úÇlõm&³ëJiª†6_D–á™ùWOeÓOF6¨_Ú­Â R4ÈøXßx¶25ãÓGGׯ[ÏüåoüÖã§f½Ì?<™÷½ëR²3B8TMšg™oÄzZ„Â'HïÊT\6ŒÈ1é8sÛé³Ö̵—F+dÀ„ Ÿ—¾ßÖ‚æµ=Na e"u|$ªŽàz‚S~‘t×z óJƒ—ë’`ÄØQµÀ8«:x昪U1ÚdÌë 2ùá¨.†æ„c–Àa±3IËSp,Ú¾/Ž›ˆE—6«l'TSéÐÀÖ×tGïÀ—O#M¡®œ‰”w%ÛY–AŠ©9&Ê™q¾³ð”ÒGõxAOL †,* &–VG‚µ6G$HÊñ”N©ÏÒÅÖò= (ˆ6”gÒŒá.J–r癄**ØŠ9´CM膯RÓHµci³ÎúNs–§?mÒ·>T>´¸S| ‚#”ÀAvŽˆX–Ý -¾Þ£Ðˤàl"äÞ|Øw6º)ý#^CÓWMª„m…ãçæl&`dÀïCëgï{”Þ,@·à‰à½j £‡‚ò7¾ @žöãŠôN——¯L­y›I…èƒSÏÈÕÚtS3Ð*u; ’@ÃßùGÿƒŠ¹Ñ–ðf.Î-fÆ*@ÙÑgL÷Á© ´[É1!ÅPF’þwl2@>ZP6dQïšIµ¹!Îg¼·†%"‚Üô¦ÿÈx-C«ÐN(CBXMÒKñŠ#[¯È— /ÃaLêÕovñéùÃ@-ã{r|f¦.öšv™e.ÑŠ7-€¼Ô‚MwMjA x9¸3SAg.ém!ÀT5 Ë|e2ƒ\LÓÏdÊqd³{'ÃâlÔ:¼ÔÓÌžhÇ8 tárA‹±ÉÜ~òeÁ5šàB†BM(\‘›Gx4Cƒ0ä¶¼HìÞNãÿå®Õ-_Ú$‚s ã;‚ÈÃ(þ{ -ÅBo Á÷ðBs;³àH F)œ½ ¦fM»÷Ž;Jžú!$"Ó´Ìwz¦x™}¸<„Š Bž=MBºÁŒPá<£‚Z¢÷)E?FYð ‚V©Ë “´½ùtF•¿Tðè§ÌõGà=rÉÌGsŒ V‹Î(8îí%ëRNu Ÿvüú‘o|Q Ãh$J0B{ÀØ^VÚKÂÓÑrÉZÙlݦÈ< ŠÎæ’¹¼¸ËX ñ‚H9î2÷î'’Ü÷’©>ÒC!ÆIi²ýVúZ„PÑ¢’0ØCØÐ–FR‹¿ë›I/ÖMÃ{»ñø>ꛂN+Œ¼LqyÞ ¾ UÝÁ ‘5éá7ÆuTèÉ CÛÕ -o@a˜å|–©<™?b]6ˆÞ¼zyõÃ?ùã‡ÇO¿ûÅ÷ßžM‚a#xWÐL×3ËzÆẸ́΢d/½Ê£eÑ2–²éüæ ,¾“ü;J¶åbaøÊ 'Í‘mb3Ì0-0huDk¥Ò‰eîê¢4¬qr_S<œrÀxä®g:;I-‚!ê`K|«ü^ª¦D›Ô&ѯjdlP蕵Š5u*^Q¼!@ŠÍ+QNbÈî¥ë­˜ûŠjÝ2gû¢MuÔ» B+±\ƒ"š6ê–† À|Ý=¢u5jqùèqß 1¦õͳò@fêèñÍõ[‡¬(=}îOqšéki¨©SCѦ6™è¸s°Ô¾üä -âMT×M”»d'[JÇá<=ûæë¯MJhkì £žüé¿ÿwþÃ?ÿ/¾÷½?þüÑãÓǧ ±ƒÍxɶTK--J¨2CODm÷Ä+’MVé6:r:ˆB%ô(1d7ä˜2ͳ]Õ9Dú3¨€Ý#R]ph*߈5â(ÇM¬+|­Ì8PôÆá¢ Ï%'š}|©m¬mÔk@ÛqVãBç3V”ÏÍ(U2l¯w“¯Šk† H±k†eP:˜:€ÞìsdÉ~H£à@!w;ÁCb—l~›^ÌàµÁæòE¸ìR-rÒ,»®9æ64AŽw,“Ŷ*rÍ’-¸M< qóÖ3»ÜÜÎÑ£ç/_¨:íåµù9ÞL8²žA-ì“_IüBm.Ú(KÄ̈…e8¿Üš Ê`3ú9¼jœ•èJW'8¢D;Ì"Ù]Ú¶kGU‹<š™Ò94œ¦)Q—qùÌ0ÛôOƒRµë#1]´ï¼ÀZBæñzŸ‘€4«ñüJÆ„•&aýQs¦5¢É0rѵSJÜF%džüªYçcw>"˜FŽÓ ?‰aùé(#L&z_°ž#4Ñc!QóV¥E‰–\¿c}Çý²“¦LT1]” ›¨ t¥÷[;çÉs˜ÒÍ£Dé!CÓf'ø¢÷íq4)—ÏÓá]þèɉˆÇì1ì¬*VE  8Y‚â.é$YGŸCà™aráÉ w×ì#Säž)”+àsÈ1(NÝÚõ4ŸIsÕ¶q£¸oÞ^Y¹±Ç€#qîƒ&l ˆ{ùSz–¢Ñ‘žåE\ldZ®„¼Ú4̱C…3÷çQÍ©êÍËM™³Dixæ¦yòO—¯^™…Y0I |Ä+6ÒÓ`Dº &ˆç.xÇîâú•¸†7ogŒô‡ð{Ú1\GÅjK”M^¤èæ$7Òçô@R˜;‚×î4ظ°_ì¨ó?ò€4LjêÉë!)ªHß×Êzá“X]þ!ÉÑ›,øåPH\©&( ‡{aº¨¹tþɈP2±#Fó¼0)Ž0¥¼éPÓIyE6:;4þñɹÈi[3˜ðhŸrBi5ª¼¦L%-æ‚ Z«®† Ô©©7Ôsü¢9Ç™+:ªAVËæ(»lÂ$á.HdâÙà#ï–ÝË$)»0Ϧ=øiŽƒäåTCÇõáਠ…:šâ¡! DÓ%)2†Ë™fÐH½Ö8ê–‡qd£&‡5Ñ þÑIúˆE'ÁRJöoÌ·Ïìú=9 Ä ʳcp˜§csš(Ìh+¾9ŒtâX&mû#Â:ãzÞz)Lo}n“ÏE a®¶˜¦‡(°ï’ƒ—eaå,B¿NÁJhrþ8e¥Úºßf‘ÌÒqÌà LÚÄ¥=éSÅéšïy”?Àà“0Uƒɧ¥”EÞ¬Wx#ÐnŽ":q7-NæÈ'“»ãB”yÇÎf"¤ÙÖ­1 SªË5TìX6+õtšÌ:Ù±­±@ULu¢’ž€`Á GQpKmtEª®u0½ 2 Wï!qhb±@y ÉsœióElÃEkÄÂ*Š •UTõÔO-–>8==ÿ£󯜌úýïÿèበ®ÞÙÉSg~U]s+pÝ-2 æBph_2¨6Ëš¥§—UVNÀÓ6ýDŒ;Tpê Z½ÕvngàÊœ RÌCïâ‘9ûQ4îRÂWãfÄÒ¤¦"r`ð›à9³%äè• Jj¹‰k0¿¨~†ì\žGu±£qøóŽ32²¨±ó”¢chà‘ ‰KëSÄ¥ÈÞ=ï§ûð…d+r‰†’ Ïnì´¶7 08.›©Íaëòñ¢c/í\œ¹Oȳ¦ÚºÅp¬ÂứÍ*?S:ÂU*M’ ŠÀ䓘üzÁró.ÀªÖ€áë¤A8ü¯×M˜Kx`M-*"vú²¼ØD ŸFq ×vWöÏi }‚•ýçêý¸UM'8 É¥.±9Ñi÷~…ךz=PΧõu—G"ªÙ3Ð…[é‚ÞÑE6Öj!l5v‰—¯T'‚ÝΗ]Ù·À1[m È7B†“¬È‰µ(¤ÙPÓÌÈ;Ë ä 3¹Î°ÍOD’»6ù¬ "ø¼¢` x`ªÖ­ø¹¤Vã4"ÕÁ6¡m½ŒŸÓ]H›æ:rŒ˜îx¬=2$šÀ€aÖ"UA_ÉSä,ŽYÙ€=Ön£Ç1ã(¬MyÙÃ$rà Ù)³ªyÒ˜ˆ$àCƒGQk{´c´¯_é›T±4qrüúíÕË—Tj‚M§’ˆ‹ÿTV¹¬Ëèa¶$BÛ>ŠÉ€Úä4¡¨qÉ(7§\±ÊŽæõ¤dÔ‘ól,šfG9SÒÔdæûh¨gÂïÞÛ¢Ÿ¶,bšdX<4øúMŸ¶¨‡2èPð-V}ÕCßHj“ÇôÑЦ€Ø"t´´s¨ØEçÏ ÉdBÍ„ƒCL5gÖª 2WbÓF¤æi"·¾¹&z- c9)Žr>»ŒÛ=Ø]=Ešzñ8ä~!²ZfÞ1™µ£%f-\]«He%¶ºðߺö¦Èm·Ìfj <~#ØS9ötâ•ÉŒŒim¥XpoÓ!;&_í0aú ƒv„$åÃàzpÓiÂÑy„Ó‡ÆÔJ6 ¨u_${¥æ‚ F$à„éÚû¯Y¤„Æ5 :Ë G=åª&da†*A%Á ܲP¾Eø²B`É-ئv&¤F.­ààn¥þ™jzÈ7IË7o²U3 [ÅÅÅKK „FÔ|AÂHJ}ª]ÏÑ„¦Å ާFRM=ä’ZzãÚJÀ™ 8IRŽ*’ü›6ˆäí†ÂHm«·©­ºj}ÇÚ¼­†;–)÷-®ÈfîOi—Ì5ÈýÜGŠl)?]+"OeJS+üœ ‘'‡šd®Üî€Á¸ä«B0ŒD¨ €Œ ¶‘Sä8 í|OݿˬâPŒŸBk,¯ ÁË©”æ0‘&0l€O†ð]†ÎÎUxŸ.N<‰¥PAév!PS½uMxêE|­[Yaÿ䈂)¥¡Ù­à€‡Ó&92mEìh2$~ÎTTbq­¸asT MþpçWYŽo>¼»Ÿ=5´ê‡È*»½ªf.ùXvI˜`šóE~zlf…ˆ­Æ×šN¬1m/½Ü¨˜›HIÆlâ*:ÕCä3‰1šLt*l>ôCEFˆÐÑ`»ÂœLçALïQÚéƒÈYÚ£›¬ N}´ƒÓóT-< .µÃ%¨V¤ªvÜüŠ Ûr ²hÁ`RT·¨§0yrÞö| - W—¯õ,ÛM¼|ù¼¼™’^!޾ÕgMÞÙù3ï‚Øòÿ¸ïDØâÀíÞ{{s8—ÇÂ+ʰ€/TàHO‚×f¢UòǨZ§áÞ1hr©ƒ)M‰näì˜/Eí0~¦˜;$þ…ÓÒ9ÆË8x—ù®A[œ*1U{=Y¢xƒ;òÛœ„94kÏ^ÎñäQ!A¹R ¹`·pP½žÊôhŒ®Îkâ…‰¹då|j€K*$Ãë’Ck}‚¬´èÆ>’ÖÒŠó\ŸŸ7‡~ÿð¢áþ=kÏõµ ¦Ë¿Ð°t! œ¢fï‰ÀR0ňˆy÷."§0Í]HDýõ›yåÁ·Æ,Jõ©£AHÁ]Þ>Ò˜o›¹¬šñ¿œ—Šub™ú ¼f( }hi¦ÄM*bƒYH„iÈQ´'ïÍÑÒĬ ´æ¢n&8j ÇüÉv{ö8¢œÔ4X˜¡‚EÛÈËÎÅá®ôWÐ8žÃþkÞ(ô(Y¹¾éL³U䚤JafkÀX‘§‘˜öXFááA‘ÃWjv)„Z÷ào£t†0ož»aö)ÿ¶F9 n zâe îdÖÂÇÓ»—Aöµ,µì Нè( ¾˜£¨î³‚ej«ï÷J <ÖO!êÑt:LYÁå\5<»|Ž3;ð-×¶ª^V¦Z¢gf;üT6Ç4FŽôæo¥[—;Ñmq…bvö”Hl§C•Ü7¡ìòËü¦‡þUüŠ€•ÕaÓÞ¶ÚôEÔÂß¿xùʨ$ѾŒàá—cý¤iõ(ÄÚ"ìÑã/¿üÒüâ}òþ¨¶¬éBˆ[°`í_FxÔÉ!Uq.µû‰Zod+4“ qýI¯ö›É¡‘„š£ ù¨°¹²ƒ{|ÃÇ€ÐìÆý'6,~eEƒÛâËŽJÙèNq”²¨49iÌÒ>0†À#DB…#ùkï)08GæaÆÕÁ¡e0{­Þ•Šþ"ÀƒÝf}coˆVÕNPY`È=…«PDî0ì5EÖæ/FÈõ˜œlf. `Ì~gËÑ Æ.ë“=CzÀ²‡m_‰Ÿ ô"búž)­Aˆ’þ$CHYX˜JÕÓ%—'‡Ó²ø)Ø0FrÞÕÅå7Ëݼ¯“—@•ªìï–ž†ÓàPM&yn6xÍÏòãl&œ6 ©Ò&3Š¡"M¬*ƒ`à3íÚS“1œ.¿£[¹¼êg„)®jÔº¼Q´}Üþ¤ ã“'õ ç*eÛT=š‚N çOOfÇNlØzRà8½ª±Æo¾ùFÀüÙgŸ}òÉ'WËä” M>6‰®Ä)ªàÐûW5yèYLºÎMk´Þ!õ§ïzQ-ɯÜ$È\Y™P­ð"=Ës5øu†`6Ÿ]­ÑupZ b0޳F¥ F4é‰+:Q­àqN·Xi+SÓeƒ·"1J1 `©´®Ç#øE÷$]3œ&x˜()sIˆzÎO [Í[êé„9Ä«˜ŸŸok*øçöƒ™Ù¬í%—…é@î=øÁïýŽ@a ÓÔ#;$Lì2‘Ä´‚±B³í^ˆG &EVˬ^³q]Ûƒ"â{sýòâå/=úôÔfRß9î;ʘláªï5ÆrÞÆr®œiò /ú`ÞQBI „¿$iƒDÀí§¶†½>¥¾Y6aÑ–{Ó‹')ŒEÀ#;¥†˜iÌЫ‹I™ßFL¦! ¤x”ó}?uÃùG~ô{¦”KÚ¨Æý®ã\$î ÌST–9ªì&-'_3ãBÚýÖÔð>ìfÙ  ¡E@ß*Ž ­vâ–±ÉägµSEt.%T,­C¦åxº5z*¼ûÕåSF:¢²±þÌÔS×­©{ÄÔ–¯eÐÏ*ÒÄc­VÇ:•¨ŒF€ÙîCÎXƒj$½©9ÁŒE³Ñ伦Û×TQëo ÒVoÎÐ’\XðGŠx ¿k©WBE´ljL}¨c;‘Ò>Ã~Ÿ-»×& –Š‘ñÂ5„8šÎ’#Þvá'$êõHïÐ ® ²’±˜¡õƒLÚ£™ƒ©.®®´[íåMi{B¼0{B¶htÁ—¡ 5ñ’6…ô.[Mƒ„=u­Ü÷gíx¨¥g3±ÂFà&r²^OW ¿0ÒòA%‡F—òwÐLÂÀ–1 ð®-ùã…År6=ŠãhmI44:ñ'Í­Ý?;9ÿÓ?ù÷§g?ùÖ§>´úøØ2‚2·{àñ`2³uÞj¹V ­;—©X6Ytм_\ ËJi{Y§¯%BK àŽÎÄ4”!š ñJàg&ç'÷ž´g²Gíú§zê™ë…3fÇ>ל¶.ið[cô9tÊÕ»k]±hd^>@ü­¬Æ˜T´Û¶ ¨õ¤UÓ“[¯áÍ(’DÌRFëAÖ®q´ÄÔ²Fð/ XTÊ×u gE~ØÉ8©‚»N0‹ `q½êÐV0‚~Ó<*‚_gs32ˆ+ÍÄðêwÙiÃ郇§g§ÓçÛ³€q\£aæT âmÞ(qs¶±÷¥E63ëNá6­qrvvnºHEhƒMIQ&J¶jE±;¦Ÿ~’7{ÏE¯ó1‰h^¨R$ÚêÔôóMéq[5+fà¿twHgXÕ}Ä{×jkКöaF†­]ÒîxÙŽIûTt2Ÿìã ˆXšõö(#T—ÀoêpŸ¶–?8Â5Ë#ÚTýñûf$h<ÓHר&nÍÈE@®" *‡ösùêR‡NtÚA, BŽ\¼|iµ¾NÓ&föJ!iH/’;Í-⟰àU\àê¾úhbýïŬ±ÀbW§z¶'šm:•ô½>ÛL¤]^¾|ï@©7W¯.^¼ éˇ&%:£Ã‡Dâ·åIF†Ó˜Ù@Ij„E¤Ì;‡évæ5Ê«ÉååÊywcö¡n)5tÖ ÈGâòúÊòºªÒÝ\”D’d¹*õº¦:{›æÈ¢ïòX¿ Z/×*½#-€™4µr'ËÈ»iãneryá\ØO—f;¦ÓS™kOèíD¸ñHz’½Wñ·ÚÉÁ.Æ…ÉTg IDAT¦í¬„׿©zdn»ÞÔO$¡ÖIy+aŵù2¡‚¹M›.<³ø…Âóý > ŒÐà\Ž9Ì~¢aÅmñQh:³¤ˆ­qƒÜýܧò)L;“2$5ZÞ’žöR(Ó®øYnñDŸ¨%Úl8ƒ|ë•/¡F‰éJY/&ß…¹¬=IÞ¨ Ë”C›ÒÑYt•Ë"3C|t/=ẕKT9¶{Òîí¦É!X†ªà ŠaKƒ‡vs4…¶=ã³5ÊtÇ8 #NºÒ»ÉW<þ˜ŒsUEèN-s¬wþ€su¦3²?-¼‚ªË·ÁÍ‘WêÔh^J¦#KÔë²Pi/ã€m§S㥠^~µ09ÚW)äj ÔfýD¶KæˆîÐ`åxêÎÂ_-Ú– rJk§ï®¼‹÷+s]äJ™ÆÖ¼s’>_7n}«ƒdÁOHw —„|ë$Ù ÐÊ<º±Ê´IÏ$µ÷Õ&V“âèY¾ÜC:9‹y\¨¤µCú¥ê¬™ÂûAÍÏןB(«ev]:U ÷~Çgn뺩"»íû¢ZsÛ$þf_˜KŠ5(oæÃzX„ã°—øñy›”©QP¬“L9z$?‡…X£nu×lLEÑê¬Î®ß¿»vœ¨föò›_Ùë‹Çö’œoH>ºð}D3™¯¯ ¬ÆÚ7iÓî –Ý•8’xsÇ~F†=ËQ{ÁÚÇ‚FÝÒæ¤"¡µ Sïµ92Ïò„Ð(^fÑJ¡ÜûxXj °9F™êQWÕMãˆf¬¶þ¥*´Î5P®A/˜[±7§í´.Uk®ú šó*÷­n‰h®Ù™³ØêÀ dÚs‘Š‹`§mˆtçuxQFA}潟éÅ1!Ð ñ1€­Hq2Iz»{ˉ(!¯~õšÎÚ½4€ãÿ•õÌ¢•Vä® Þ‡6!ì‘*$Ônv©Q€ÿ§`™hðK‰|Êfdž¶Ùß–ä¼›†Jud_Ÿ:Q#`@ ³®±‚ÀTÌÀ°žÿÁ·´v•Wžõ—gOÏ 4!Þúµz¤w€ Eܦ¦e3#õ-…X“¸Ó&Ì.9pªQ1`ÌÃqmí r[¦ç§AîRdw 9OZ@™ñ딃˜½ÚþQr¼ãÂOwµ++G‚`²áñN³«ÝH†×©Åˆ5è¥|!•• ·-¥"ªl2î”Rª¥ 33öÔM·ÍM&™†Ä„O œØª›#@hæ¡^aÏ»wg'm2~ñò¥}~Æ™BS¡kTõ5½Y‡•†[uþÉþ±@´Hy²àç[²`¸s »†¯“ K]!dC€Þ¿½zõÂrBmê¬TŠX6ôb+9N¯cÌ+T5 ÁÎ+Ó±>{؉F¨î$/"À^8pn’iö°5Þ%ñðc6ú4½÷Žú ÷vij&NÁ„›š-ã†?âÕ¢Ô4“3ÑŽ’­Ï’³*¦pd˜Ï!ª•¾ŸCù= IH…D~ÆÈ¶ÎÈ;4$àg Øˆ|—ô$ÛéíPÈ_>çoDIÂÀˆÝÔªÚLjd[XÀ¯4އ1Ð(¬P—ŽJ«Õ¯ÑMVØd-E5…ŽH¿xL!Ú*P ?æ`¢^´Àð#“9ó_çwªÐ%XѼ‡Îdî"~Rk–M78ctC¹œÓ=L׳V>PµGÃàp}*ÌÍÂg®ô´wŽðÐÐvuL½»Úíh’U^àgMã^Å ÞgHDä! £ˆ.6“ÆBaMçƒl)ˆWìA¬¢åBaËì,Êl6FåªIØÓdTëeÏEKÛP›ÇÑ æ•<*1‚-¢5F8 a[È¥DZéT=´ÃÑ8µD_8å’‰Ђgqè<6si£ËÒªNîìæ?]21ë.M×±0‘ºŸjYæFÃЪtí ƒ.€,6ðkć*ÏÉòÎï®ì&s>ƒHÉ2œ6M5­«Þ¼ÿèüÙÿÛûô£³ßú­ßzñâêôü™ L‘Ú4É lwÍ|2=’?¼c­~JZq§¾°OäM¤r‚»ß™dÒ{ù ‰§A…Ó±Õ#Èô“4¾ùæë%†”¢/ *p×]nx ù +1æÑÂ?“a¶Øî‘.¨¢AðÁ1¨BÂdªpÑž<‰ådXêÅò].Ä{*/`:ósÝ—.›×&'0§)Y¹êmÙY-ïÐ×ãã3}¶ú#‚VÂú…ìîwþñÿH[RjšC„½É%ºaÍUÔ0ã¡‚Îht¶ïþêÅ/MV½y}qóè¤Óf¬¹\½º¾xþõ/~j±eá›÷ß:¾ÿöåÅë/Þ¾ýæáëkNéýÃO?¼{‘45d}Þ˜–zLNy+ƒe¤$k%Ây€°W_ý ŽsÑfšÕFXL“_C’c;¶4í¶m+‚— ¡ 8«W};Éo»„ ÀÔBm69»©¿Q@ZO€keE^P© äj´"|œnï#=½÷Ô¼œ†1£/7GSÿ´qݵ(sK”´ù bªöÆ€= T®__Rót·u&nf èÑût±øÞÿ®oñ­’yËÎ8ó­‰ °<~¼ }rb•‘µ|©2¾¦—«§™É$Ï¡Êé#¼|#‡ñœ&B©PDÜžÖfI’iQÅšj0à#D~Ê‚Œ6–c²Ö«5‚,äqix}²íÁ‹÷~Yy«›F­ÊܾL "vòöÚùj™¥n¢üdÞðƒflðÎfY „Ä(©Ë—/Y”ðŽ—¯DD¢P‘‹SP71{jÿ„zÇOÕÏáhå"‘ñïdË•¸Ã¯ êÞÌà’R3Ñûõ|8o 9ÿP\ŽB˜Oëmz!(Z YVT§^G²Žfñ{FCè`V 1RðÝiœ¯9«>_ïö”»ðIÎ(âÙˆÅæT6e²Ç³È¥þ…YvÖ†Öª÷³eó¾íd&WˆÃ¥Ó"^ÍJCüñgŸÿüïþÒ¶ùoÿ¿4®|üàÃë÷­ËVµ…ª9‡3¿|Dày-MS19#ÁKD{{¢8 >1XN†½pV{‘ùÆÔ‰(ßf€íï¬æc\eJz5‰à²"9©;I!TuÁ\^‡-uî?/\L£™j™‰wß} ›¿Mx¯×i”ȸjøYàÓn ä±Õ‚*uE†Ø~ýM}§w»¬šx—¬9¯üSGùœ\µÍq$P=‚gé(˜}©u ,kœý¦ú¡¦I jã‰L‰ /Te‰ B¸|²?'æ6§s«#Á”&æ²®b#ß'¶%´%KÇY1-J¢ê¨I•0ÉR°å";ºb*úQåÐÔ«Oé‡m9š²ÐÇ8ÃÖ2ÙFûŸà÷m3bêú&ò7¦Ÿ4\ÙD›¦2nÓœ^¿ï`L+nÚf‚`Ì#ÅÔãÜc f9Á0oƒRF© ”-‰¢ h²+Ü¢<=.Qc*뵯kBùq,9øÑàþúúwW¯mPÉårˆhÖ¾ôª5Î6¶R"¶¦Í•1Xf‚HÝôXHùûJÐ…Ì U¶s„ôzY}гyõnA'r ¹yÃlGÉ©€®…¤ÄÈxrY|E‡­{Osú»÷£õЗšihn~6dÏÌYÅL“N3:YØ0Èw‰®PBÍH’ùüù œ|ôÑ3îQÄÛ!Kú¼‡½{ËH‹œÐ¬%2c†—G˜ɋےšc“škUãÈ ÙZ&}1”¸«F@"»)ú'e™˜;]õÕÏÆ/Ö=iŸ*’O&½Ê}ê阰R¾Ð;ލu¼n¼ Ïo¯ßŬÊ|õøÄÛ ŽU{M¦Ù§©1k¶——¿$]‡1(©¥ öúÍ?éÓ^äöàŸüþïq4HTM¦3£4WBô›3’Ÿ†9?âŒÐi[ô0-Ê‹šáÇŸ~ÛÞ‹o~!V¸¼xŽ=bxõâ›ï}ë»?yùúúþ‹ÇoŽ.¿º>ùôÛW¯?{xqòÑ·bì}cYwRã`±Òب‹j#A M?¤ff[wØxL²;Þ5ç˜z‰wˆÉ·YÅ™xqÛ€Ú÷õ’hh&L]l!_kY!DmP»gcR‹B-‹G[mÏN†…ß«—ž‚tw)»WŒþ8’P/€_³/¿y ghµˆ`ùšÂ‚Þ„á¹¥™d7(Wo¦Wv1£J-ƒjçBòo¹Þù¿ ý©ü‹]t:þZF=4Â]zÊ]§LCYæ†$GÚ†äMÀt©~ÄîÎxüI«ý§´£p×0òôé3u"; *›ÜáVÝ£9,zxÔf3ui5â(½`›G9¯KÊ:Äp™¹§'=ŸÃã ç@Ú÷oOÏÎØPsó³s+EÚ‰„ÜÇ…æ¯ÔÈ-’PqÓ,8¾Ô§Œƒr'åó§OY©ªwßó,è7é®,Tò å§ã¥ "5:³À×76ÞÛŠ§^Í­³”ᣆø|Ž*²òAÉè*Àn¾‡§E¼üÍqä5È¡kÚ1H€Y[°)êœ6X6€¢ö#óíF€àÕ;ZH†Î ®Fžd>, ã&+„õSð„ xµÛ UfÄNþÆŠˆ!ËmV F¤¡¢ .rçÁW¬¹Ê×2†i+ã÷ê«zwîFkH¾Öe.Œòš×ÜÏGΫ6‘ýƒü®€­ž=WUøèUQÄq†",ˆÖ,’ÝÄÕf§ Pzçk »ã¿{ídôÇ_嬛wg–(?üúç?»ÿîúòÅ7_¿yþ½ÏÎî]}sþì³GÏ>zqõ³×¯¾zýÍ‹ËlË‹9gÏ>2ÂuB+jpK5‰d”DÖé~6c¢_>1Ý ‹tŒ·‘¿Ò‘f„9ÃåiÞF¬d:<7ÈÁ“iÊ  eáQ©òا!÷¸ü–€íÄ~Že0Ä{gíæÉ"eºï%íR½MUÑÔÚôaùÉæ‚É"'LQÒâ}cÐzE¿À0–Až÷Q—Ή:s&+Þvª/ÊB'ÌÃWNM&ú‰à1ÁÀAG˜9 ^3d ªXûˆ!ïyK›+åâôø2aãF1‰®šM«ËÏ ŸjŠ{‰ßÑç‰,†æ®aõ±gî‚ SÌLûð¢ÏЬ‹IÝØʧe`¶ð—2«ÝEäFöÍ<íKTj¼é¥V4,ëDü4µàŽwwYõ†¶‰(ia.4T€§˜ƒ¶ß½ÿ–Œƒ–Ù¬ÍÂÊL!G‚d/g|Q#~3«Ž.`ÌïG’|w–@²&´=…èyüÌ­tÝ '2R…ÝémôF,®­q3)qÉ€YïøÐƒ’M`PuÙöaÀ¦T<žÛ#ÓHÓy6Ô˜)®Õ—¾W¿Äp"x|‡„¿x¥.x#„À[ôêpwÛH=B0ÚX)€R÷©‡h“Vø`Í÷©”9^v¢ŽÇ'Oþê/þ”ù~ï×ÿ~ÂÓBOÎŒÉeå(àŒcÜ+øCÕŠŽá£)I.½ÀÔNrÑ1H:!" ŒF×î³³i»ð$ë¹²ŠœgWZœþž å+"³¼ÛHAµÙàhéœr aÔŸÉÍØÊçºlœˆ$‘âÈ[$B]~®=ÃÉ®¹ŸèðS¯Æ†F¹k’4ž 3›§O­zw$„Ùb+à &ŠbT@ÈÜAô Ͱ°ÐxGg Ð qÁ¸à„D])r–q˜êL.¾xù¢°¯‚T9_‚Ÿ“÷5_µ4‚Vë´ 9°•gÈ;ûh‹ñ‰ÓágòÆSU¸¦:•€ñ(ÎØ³Oy#¤ë°¹P¦'Ó#nÐþz ÀÜ o®¢ÒÄ¡à]ËZSi°ŠˆáŽYô(;¶@=þK‡yR7íçæÄc©rwº@îäÉCZùºöš™Ç惣‹‹W0/€eîÅ`ýy4ä¹÷~"< —ùXƒ‡päŒmV’EˆÂ8S` w&) ü‘YäK¢cT8ʽt”Ãkƒ¸ ÁdsQºî.@37‘¬æ¡êV&M,9±²_%u: Í@úé¸8¾µ…ËY;á åì q{Ýoú_[àA¹V‰„€§ÝI`ÜÅè÷/ áoþ€Xtĺ“æ}R?iuÁÙ—­//;Kêˆä0ÞSÎ*²>;HbÜÞp$³„œßpV ê â®þ]ê25…`H8IÔXë'z"·ûµ9tAîì}eâ3Ï¡‹™¿iwžQ¢Ew¹Ò` )(®'·ŽÀsŒ™%°Hß6`zxùÒ@JK¤<±ä÷¾üÎ_ÿù8í£4>d'ðüß|õóGç¯?ùü¿~r|tïêÕëGÇ\‹á+Í´÷":ÒÊ/_¾€“ ð¬^4l«0R3 õ¡$År:<³?R0& 9EÆ×ç2X ¦K:ŠÀCk£ËŽLHÔ"º“˜Æˆ)m•“ãPÛF3Y¿ŠÚ†°¶Zà ÏZÿb›.õÐ@zª¬G¦Wš0&£Œá¡“Ž?ô54Ž"-ÔäÎ’IvvÿÚIîÓ+L#5o€Õìñího«SD¥ªXçϵ÷]š(©×$I¡¡²ˆ«*fêx4xªìt”{†TŒÜñ¾QYÄÏ[c0ef#ÆœUžÚ7ÚÈS” CnÞ8û6„Í$¼%šØ±[•û ^½Â2†§”Ÿø` =páç-?«x=ĶöæR]À‡þ%ÿaAúÜA|o|Ù©®ËЏþ€Ð(ÚqÓÈó‚™=džž{wÕzüðsÀ?[%ѯàrQÅ·µìXPíc´Ù€´·':ÔÞotI2³A*S]ò‡òm£°¦n#RTŠ+”Á¯K›/½ÝÕ`JˆHÁC¾`ÒYÀкgÙ‡õÐvÕìÎŒìj>ÚSpR 1ò×Â!i£á‡fþ` H8 moH"b²Å,9úW $Š8Êv‹ãìÞ#í% !Q|.é~6¯—G0\¶Äs?ÛCµÙ „"Z´q˜¢1˜“Uá`Ÿ– C2y£wá”9¶Q(gTSoþ*Žf6NÎЖØ]¨ãÔE*ÒòÜÙÝO1“èF‰Ìe¾m/šÂ,¡-`¨À+è®^?‘¶9”|ªI¹©Õò÷I—Ѱ0€Is ‘Jðí©„» °æ«.+‰îjñÈÝåQ­l‚¯¿þÚ«ú”Ù”ÞÉž‚QKŒàqI»&iïÎ ú¤!‰ ÷M¨G>.=ÚK©ž%o½‚;º‰ ð]dëžãñHOñàsŒMíEº|³Ò·Ì!—³4ãØ„ø¼ÉËDüÍ|KžÑeqäR…»@‡H¹9¥èp[ôÚ>¦ÖoœËwröw?þ«ã“³_ûò{ù'ÿáæüõ§¿öù»Ï^_\]ø¶ÙÉÍçï³û¯;ôöÆË„ê¢ TòûÐBŽÿMžÑ’¨³¦D¦S»žo{r‘¼ê¬½xõRÓ™V÷ær¶Ž²x‡–I‹è’eäîò§Ó¥µO­µæ >L0Ôš© h`úv×ÉôÑÓ¡3‘J¸«}¯Ío$¬ÁÏËÆjA.º×Ù`\CªÝ5§øxCQÖ´œB¶®,´›Ht“³•¢*w2a4¡i¢²ÝÇ1ù68ç Àe!Ÿí.ˆ?àïÚŠJ¾Pª2Å?RËÁ+¾=´$ ÝaFs±Ócl]o ]ÑL[X€Ûw¥’HmkDwÔôAg¦GvHDÇfgs7J\°©‘²¨X¼¢,àêÒcÍ`Wz¨‚¡|ð_ýwŸ}û ê£[ðp¢*éÙd&ȯ½šõ(]cßÐx#‹úþÊ SPq4p «n02Uçg¢7 ëz$€PãàéÒS‰a…“ªócÊ&6F$¨¦€Ÿ™)](á¼T? Y›‘)Mºtú™"Ÿ©CšÐ‡¡šì=T‹*ÇÞ—6eÕ²M^üÄøJ•]&%ù©oZ©»1øëÎ@&º¥Qí¨D—§È›±é„/¾øâo~ôCµë½¾õìÙìqžfÓNÊn‡„ŠçÁÂѳÔÞe"…îhF‰»Ÿ`\ëX+‚IC‘Á ðŸ%ÊÎ/y(+xÂéç—¹ŸºU¨'T¹(K“+¯ã)ñƒ鎘[òZmq@RëÂø ä$#*¹¸²¥š7Ÿ=|3ˆÑuÙBä†~9•ÕÍ'ÜÚ>#ÛÓ‘ IDATRK*±Àïš;ù»TÍZGO£ÃoË/Ó‡£‡­’Ò`ÙÛÙÓsãwû%À ’œÄYìXË?2Í ð©qa¤ù¾È²]h†ÅCÞJoYxÿ¡Y+i™xT_ÊZÜtô‚LÍ&´öeö¶ûƒöµ$äÓÓfÇOÒIà[ûT”)*)Ýžw:ýDª0E¶Ì*(g„в†Lrc…>ùXã‚VÙ-EX~þüóÏÁ¬Ù(«—Ÿ0øG½,‹zÚ®"Bm©®™!‹zÒ\"J¹kŸ¦»¾òMzQu. 4O QC¨dúÊ8=òs®Z¢H!(7•æÊ°¼È‘³÷;î[¨6~0^—^Mz«A‡EhŒð/ÿ¾»o2©JUýŸb“»Í\~. #ðÓÂÕ¾ü^J`軓‡á ®s‰‰ñ覗ɯk#6öá"E ¨3b åíT ™=“Ì# ,ÁÅŒNÞNíBxÿØ”£3¡Dñ.\ðô³ï#MW;o4+uùò•y ¶‡8V[Dþƒ?øÁïyP³‚È„» 2el/kd§´Iªš)gNQ )šŸdÒëÔLôYŸ˜&}”I@»l68ùò7^ÿô/þæ/þõoþÃÿþèü‹ÿôß1š‹›ã{oDV>@Êï{ša»D=ÖÁÏÄõP²c©ìžËB³ª]~ªnöÁZŒ(cªÃœ w¬cÜEŒfú’ ö!4£ö-î.r ŠÙÆC:´³-û%lI­éP}†½J-vnJ*oBƒ¿úÓ”ÖÊÇeµè¿+“*R•¦0Bãl?_~ÕRÀ\ä'¾ÍmÕ¯¤xd¶ _ƒB˜BÑ6MËfâã'Z´ÿW­$¯DΑ*sZ:Û‹ì Àt€fc&ðæ{€©EÛ…–$Öñ&ÕâS±¶š*å²SµI‹ˆêQdb‡!ÉOó:úY:‚Ïäž`3ÁŽ“Czl¬5‘'gðg Z/JÆ`“¤JÙ‹èð)|¤NŸí§›éÖ \ü(N|wü¤q–Ù4!l¤'˜Éø±Ó ’fƒB: ¹ø§"òçsSgª¬†³$h8U_•®•B­)fI`Ð3zÌýU·«)ü,TE‚¡Ö_´YÆî;jJ s)"Í(qIÑ´wö‚° &JšÜ–cŒ¤ˆéa=G ŽjÑßõo¶iÚ:ÑpúmøÃ´çÒ3ÈêƒKŠx®ÓÓÕBµd@¢Fw5æ^ HŒáªjÄò¦É=ÒŠñT7ðáó"_¿z~ñòÅÓO¿ãû_6HÙìÌäóŒªÓCG3Îp:ŠH¼.m:V~‚ßV<ÒÎTP%_B¥ &£ö`7–õ‹zeîF†Öë³”ø™¨k‚|a[«?V³Z¾àÒ‘ ሣµòÁ¹`¨Ò^>Ó]‡†A¸í€|#ð\*ÔŽ?4ûHvö\œ§zU¢=.ºdÍŠüQ fÚÐ4X¤Do옹!ÉD—ÿ‹räËéñ-_jÇ‚G*#P joNkœaÒ±¡£UKN·W’(’8+ÀЍ£`{pNN¸0´µPÁ3XWv«ÔNÒ4øÔÚ3q„ˆq H¦ÝYw-ï!§\nÉZ9âKJLJÅH#';äC)‹\x„rC²?ph§%W‹¾ÌrLˆÙär!YóXŽülÁ+I"J»¯á'%ÁMë µP²äüª¢ÉTuBÀ”HÁà£HqâαP¥j:ÅÈ`x ýj¥Ô‚1¼­_iÇŽòêm ¬–4œ¢~'Æì¼Ž÷2를ª'¦TjëÚ|“‚®d2QÁ0S  Ð8AèÊ™$h#LDÒþðË·ŒQ³ç² ƔֱG­‹Ùã”RøI ö¦Â{®ÈN‡¨1Þh¥Oq l(¨ÏòÅ…^g¹Ïƒwý¥ñð—9ËŽt !La¸¶Df>%À³Š@¢ˆ8fSˆ»ëDžž©èëo¾Ê»±IS㌱K $ ÓlÀïÿþïŽDjÆSwãþ„jƨÑ?4Å{7£¢·–¸'é]ïâ-Wìܤӧ>ŸnPŽ!uÊ«ëןçK{&œ†ýÉ·ýÕóW¯~òóã³'OíïŸ=ýò¸ûúlÛ¸­u:&í6¸iÖ¢r\!&KÍDL®ÁѵLt‰j*Íò¶åÈTØOl'J ƒÉ7[ß’™ Rò1«JÁ•i3æ„)Qµî «èòS&œbÖm¼LÖ0³©^Œe@ð¸¿+²+KZƒaÕ†/ÏÕF<Æ]O5<Ýg­XÏ›PUÛ‘`Í{fÃ9qó#"Œ`Vù[5èiŠHÈFL}IVF?qY1²¤íšc’ÈÕt¦ «ï¶jC\#œzz~€‰Ó¤·lfˆ¢—a Û fÈıé'ê¥pÔ2]TgN­·^ `6Á$À­7Ì…’ñ¿r§6Y$ËÜ6jäzÚ\©vWRË’ëbq¬kÇI/“‰ž_ÇZjúödA`j\Ï×Zö$ØÝ 6Ó%Xî%’ÙÂÞºÇEÒ6ÜÊßN‰›w‚!¢Ã÷Áb~4¬W¾ðZSÆÁ曀usÓèÒ)§¾³dèç’êUh‚‚\3šfȤ¦âèœJþÖ[SšYpeÕ‚NoŽþñÿ•eÉž‚€Œõ“¢À_½6­ˆ!ó1‹vŒä6Ĥ5Õ0H»&ãçë+kÖ}b•nDòõ_,YäT†fƒDžáèÕ‹WLVóÆ$Q/ÏqLü'5àÕúTª·ƒíÁþáðƒnU£‰‰ T•¯¯½dØ+£^žÞPÑÆåï…ju>_úf³¹ñ—/4{?Ó9o'OÚê$¾;}úôÑã“‹«w÷_ýôý“£“O¾ûË‹^óWo¿±"þæÞ3‡ª±?Ví܇|Ûî--Ÿ[j©°±)³¿™£3ÆèÅË®z+Š ûÅ/~æpÛ41 uiqpÄWG¸ ÆO¶.J“#JçØÑP8%,&ÈÕ`iÜÁ©:µ.¼§àý”@ZÔ·ë­}i7 &µ¹ ÉPBžRè¯"†¯ø ç×ëF¼â”¨µšÁFÖ–âÝî ±;‡gg %x+€ÙÉD[UÆXó5E— ¢SJ3À ÝÓ"ˆƒG‹æ!ÏS\ßi¹"$À¹-xÐ9½NóÞžÇiŽØÊ· È£Ë^ÅòËÕ”€†antç8!‡9ÁêÒfŠ‹-æ#fAVÁ°E€WÂÓ»î¼t*E»vAH~Yÿn0ìgèü/œò4"î ¡zSú ¾Q|»`ÝþóŸe´óå0!r¬¨ð”kR_Ûq¦ÃX3cõaÓ.HYq9<º"8S£êl³õ“ 1k2Wš¸Ä FËFb*‡5«'ôÛ™o ·¢¼ùÈ?ÍŒÞÍÊ,8UÈOÓ--™®t:Õ©%åŒã6쾸¸ôN’OgÀ­Íãkæ 7ŠR5È[ƽ`#áÄOí¤ æùÎþáŒv,ÓªC6õyÈ€Y¼ áZ‘»Æ%Œâ~¢Ê®^ÈÌ#?ÍVxªÁâ­þi„‰‘Ó“Ç<çÙãÿÏÿõÇçŸ|N¼ÏÎÏ®ßò§Üô” 'ºi‘£.5Î0yIµÞ„*cße!_<ÓŠ«ÑQ“½.?— z\+ðeJ°Ð<ŸqZncqO]jwÁ‰¶-ÈÈ¥eþJ;sP-—¬Ï`Æh&bÂ1>%+îØD~ GòÒzǪiYyb‡J¬à®.€èd½xù œ#ĸh/½Úp¤(·¬FŠFªðH>¬—¾à‘C,X#&ùÕ!`Á/™E™ œ%*9ةҹtð0€÷k͸¥–K¿$ãŸó§Ï&T¸yúÑÇ D­èQ;p@P¶Ã¯¸"pÈA{”£œd£¢d(ÊÉþ SäG;£Ó!^ÚгüŽ£þúGù—?üáó/tÌßýîw5-¯Ë²âbMìÍ1žëÿ)ËôÅ–`LHS‹/ô:³:Ùªí uÐàÐ-qláѤ‹wã6¡BYâÙ¦“%$Ò[IâNÁ$Ð7VXþá ª·âMÏn–œÏ™æ†/¤*U¸<'E©Ã°:.âøñN€Gby$¢v'X˜'â#T¨¥Aó%Þœ•@à m½t_KŠ©îcçŠû Ò%at³m©P)+˜í€5²=@²…Á3¨20~R¶º m%0EàJ©EÀÒ–8ÔFǺ~X8ì—õhLnæ,õÛw?ûÙÏ4¬¡WLŒZþÊØ’Åj>Í&l-êc[ËciNО#C°¯æKÀöæÒÄU6|sßÛåßúôã×W—¨?;7€éó—Îò3ÂÒ¡ålÅQó:΃ÿõŸýSHmI6ŠÏ(êZr¯¦Ê8K  ¯a}_­÷ÏNšoi†© î?Ê8àC1Œ3C?ÿì;Ï¿x|òéÙ§ßyôô£Óg_>ýèÛ¾¹úp~úñýw—ùÇôöoÿã½*½]><;xznmÿôôÙ±/% –¼ô°7e˜Ó¯ýw¦xÔ’ÕÎ`ãá³gOéˆÃ¡z.eºìÄ>®žð¤!–ŸHYãzþ =™øýûIDý õY·ß,1á1ª¶^ܰ4kNÛž…tÉûw652VÝÛ‚ßPUü ËKOcÙк¢>7‘òkÀfSf ‘@q¡::H\LÑ^”Ûu1ç]N'd`{÷D¼»×£®¯¨–í™úR9?f†Ó&zækÞâq§_bJH S.dð)xtm“`Ù.R­®c°(q.säpûãnìOŸ6œãšQÒlœ©‚­ôåJX㦡BÉ–ÕˆPMÚšOO4#c=ÍT›PHè¬qIÕߌæ–w€‡Ê¼6‘ìÁ˜ÀjÔÃÁqça“ØÑã…)¬A¨Þ/ž¿|ù‚m`›¡ ùÿùŸý¤`ŒH´TŽIEÇ'PgÕà>_>«`|QìÎáaOçª"Z4s…‘¬t˜:h–Lð–{ÎÏŸÚx$‘1i“‰3/³žÌÅ.›½ Jt>14GyM”HÂÞ£3{×Yk^X‘oË u”?Š3\Füľ\Ií‘$›¿üR1kQ…ü……øÎÂÉøHUzA‰¤pYžÍ'Ú‚*˜¢‚#ŠLWÍrAªãå‹çÏžúL[ž£ÁþýQ1ërÃ5£€qÀ–zå¬%æYG)3Z›ÁíEÎyÙÒÍý“£÷×G§öGÿòË¿÷›GO½~zöäÁ,ÔÕ<±‰àáH#"ô®]ˇak×Z)N]–dj‚*B["Éé7f‹»FŒü+{ÜR”Žôû÷Ÿ<ûˆWüÉOJ¦9”‚?Np&p$ºç0ùÅÍ-@«ÞѾXÎ".‰TâC¿„8 §‡Êèk¤2ú½¾8‰ô|R€#šùbm;˜Q\>­{`ò²kÐVYÎx²pQ*ÌÒn{ 3îúèyÂSúøÊ£ÜÌÒ=;ÌðjÈ…ÞÙqó–f}n• †>²·f²øCêÝÎd–q HÉ:ÔN’åb®zÀ³ÝH/õí'¿4ç‘7ô­û>§£åFæ¡dª‰Ïwot@Vfk÷²©™‰ãOC%³M}Q{œóSlãùäÎã±M]Ú0Ðs ü!;ËÛ MH‘w\Õ[ÚoIˆnÙèîñ‘Nï®Hl™È`g m3±úæÑó§OÞ]<óF]øÎщÀl];ï72ޝn»E¨»›×w):÷‘ÖðEÑJ'X-4NHÞÛ‡Áä~@EÚ¦ÙEÍ+–†Hrrÿ>ÇzþìüÕ›wæÐîýÜ:}øæúíãû?þ‰?á­p·ïßyxïÕÍwwn()òö …·5Å¡QúÕÆR“Œ’ôÜ6súyzEG²×]±Ñ°\áCªDù~’3à;}ð °Ü‚`[ÏSµÕ9µÝ£5wÖ¨˜—Le#VutÏŽI0⨪ÛIW¾’À²+#_L®¡F¬ë¬<-kšf¥Yã_ŸÕ2Š¢eÖ…„šë«š3;„bÍéé)<ÈmFù£?úöãGîÏüé§OzÅmlÈõ C ‡†UÖoGcPU93u—àÖõ©Lš+Ëá xð‡Hôg­¬‹¢E¯D±Ì/fÈTºÊ\ò+—BÙr,/Õt8i háM}Ž1¾:–Ì€k÷Ò#òwCéhu!æç@.íÔ Ûvë­ŽÒÆ‹lJ TŽÁÃP †]“È?aq-¥ò˜ë0ÅŽ¹?âb™D«â-GÍŠHYÈR?œ‹› ^C±°¸òµÉn—`˜ñ¹jg ª>¾}ã廫ø»ÿË×~ò›G§‚¡EwÖmœ9ËS‘+É8Sêø7 ¾Ã(ÞA±ÜE`ðƒé•KómhPoµ;/š»Ûöç‘K%€9Ò! Q”VÌ­°âfÉ 0«\W_©f§: ¦yPåWž^ÜÜv²µ;Ì.ȸóÀ]õ”ô a¦•Œñ*ý«’†­ÝâgýVëxаèß<¬1‚¾è„99v!^j5VQoŒåÒsDôRÚÜغè qæk‰LAQ0»NÏÚÒ+ܼeÄšv½¿Ú–Ç?šu§oðH¡«Và 8ØPØ3l ´T®z›éýdÓ­$¾‘õÞ½ã>T0ÕSÂt K³PÎòS]Õ#'®24g¶³J處%7ÄGÓý ò"Añ?”]AX§+ZäÛr 镼݈M9š¤E|ûhØë^z¬±*繚¢ü„ ¦X÷FËU­€O5e1‡‰½á Z1Ô0…3£ðvÔ¥v*&Ãc2ð2¾bPeúÆDAìÐ#)5¡œ±Hˆ«ÕLYÕ \£aFÇxzhŽÒ}ž°›~ÌÒe ÿ8„ÓY%sðŽüà<Ó–}n0T š·›ödôQSjAÔ1Hê°«+DYÜù² øþéÿÒžî®f`£wJUj¥R5–ìN™Ûå•ÈžÜkÇ-©X‰M†:å7VÛÆÄÞÐQ)ž)òÞ‡Ýè…ÝlLmø˜­Ÿ¿ù¿6=D·êÃb€¦½QA´ñÒº^›ÑôΖӯZî‘Í£Ý/LÛîµëý&>fwýÍó·ç‡•³gço?þÆ7ß^»sÿ£oÜ>ýÈsÞ¼RÂ_–V›zXb&I -‘+×™ñ@~j¨AÔSpåu¦Ñ`ýS2•)¥_¥Ã²´ƒÙ.mFó`(‚ãnŸY˜0‘×6ƒõçÈx<Z±Ù¥ ÜVÌÛ¨Ø7d$â€Oé6â<€~á ½ˆrØ*—ÒŸÈ£é8l8‹&jð€g?‹Ü°ˆK•k›-üÛÚÓ-Õæ!rfZûÓ™\Έª …¹îâ±a€#‹OgƳVOJäV¦¦ï!]â¡•æ\ >ý°j•ãAwp‚×KW–½º|Bëçjð6Y>e/.‘ÚUõÚ ¬Kh›-iÌët§Õ-ˇOsu:­ãÙy©lß6äpýÇúé?õÍŸ6«;}pßAÂ0k‰ÔUqÚd0E½ð°Y\BÔ=eäœqë’J…~ÎÎô©l°8ý„Ùyš¾­B›Š!gîÙ‚P“ËP ˜ á$ ÒœNРu¨Tî9ÓæE"•¸uVvPé89m'…㲠Ⱥ+¶Ö šl=q€Ñ*} ³‹«P™©G-jpè Õ «•&Ó}zy­º¡Ü˜ºë’+ä3¬›§.à  ‡˜SvXëù¿ÿùwÎ>ûΟü3¿ø6ô7¼a¯»Mó)é «ïˆ7?W(eœØä¹—ŠPÎIõB€\†‡Z> Æ­Ä pö<ˆ¯zñÀU5¬(i ËsSf\h‰£+g!‡ÁÜR‚hFDKÑ¿<¹…3ׯ(º$1ƒ;€B€ 'øŒÅ¯˜šS¤m.H8ðFšèÙy>V‘¦Ë$-½Ò 9 þ©ZB`.±KùtüçB žq²ÌÓ‰&#—be?²\’’¥AYÔÐ;à7¥qVÞñrƦƒã¡ÔŠIá½@ dQ.ÉoüÄi¼Dee,vš9¼+HÀ³e?]ÉÖd.)cX+ Þ¼K€k>3QW“¹ù* 7Å̦gÛJsœ#ut±¡Œ»íuÀ‘èK;Ù»xa{µµáîÃX©K ‹à‡º¿,eƒ?Öd kð+¼ÝéGö³P"Z Væ öóÎÛº<Zm²øm—Õû`¥Õh(œ8ñ‹wÐߘ›@ˆ·:>¢ÉEy€VØCÝÓ|¦Í 4ƒ*…ž-‚Z Í.´\Nxè*sp•xphë'*Êø—‰KZA«F9Mfw ¬˜a±8xî­r ñY½—{QEL®¯f«oŒò×à›W‰Š:z£Q…eÔ<S®‚§ y‡JËUœó?ø‚¦>üðC«Y×nJÊîë«ÑBÎdçC£ë¿ý›¿N'^SÍþ˜µ–ëÌñSê•6SëæzÙƒûð ï»rµ]%é³\ØÎSx_„@Â_Ξ|i9⢗±6i–7Ýx{¡Þ§¼îbsn˜Ü¼vÇÓŽf¢7ïÙU˜_JýR‹BÜ„ ÈÕУþ?îc-‡Ë¢bÇç\¹zžáÛÕÞ¾3‹Oço[µ44ëºpxÊÕÌQzµ7ï1Ê^fK+‡zgNVHJ^uÒTé<˜Ÿ j\]“$Ðeøò6:À R‚…â½ü[%.<0î†ìâ,,ÒÎåÛ‰4ÍqÞç@3B ªÆŒ-¸š¦/‡[Ð)ª¤³ ‚7ñsösĉcºª¡ŸãÁˆHHl£ÈÅÁ@ÆÁ}“`Ò©inâHSV2<‰ïì)»òšÝ–aƒD+8aÿ¥Ó>Æ`vU]YnØ m•"ñqû%;À3–k—ú_|ÔÛt~— qÌDÙchíhÙ>‰äÊŸ~úé|ÔCU^WMŸoƒßUºen(Z ™mE 8RO‡ Hè¬Èi¤¬ ˆãvGw°$såè Ò´¦ ‡ú9è¼=ðÐ#´³NîxU ð(ªÆ£ùˆº€pÆëà «ÀÒÕûžúbÓÕ;àJê;< $®*`¹ÿ'Âykm! »"‡4 Òmn X‡­CÛă¢º[B;¸"€,®NœÕfƒ‘h–rÝ»&ïø<óë IDATÁéüÑ?}ýäû?óó¿ôòm·~Ο?³J' Ц®I§ŠæÑJÌÔ5QWÊ29¬f„è“×Úž@LŒ©ÕfÛIcéj^T½v§V8¨q³–É?Ò¶vcç5zÎ3T ¬ ³2…†Ü¡’ŠÒ³õ'[ïé¨)S_«4jÒ•l/ŽÓC/°b-6bh™5È*3˜±Ö ©Ö¨Ü“C+§—@ÏŒ¢/h9ªI9ig\¥'¶÷qƒéiÂ,!§*¸±‰²'ïù¡öR¬8–OÿVÛÑY«â ^g£ÞNYi ©FÜw¶• .R1MXÇ¡Éþ õ‡Åü†<ÀÖ” ¡ŸHqåßO‘„\æŠÅÓÙ Æè¶Ëbæ„ëK”¦SSå¸Ñ¯áön4VH:s >ú¹’jÛHï÷h¢æ³’ÌêV ûH4-l´îj8xcS]gê*wѵßúÍ_zåÑŒ=ÔÊÁn_¾:åîÑqJ»Ñ€DkÓîU|ÄSS!@ÿ÷ý¦×Ïž<”Ä[‰¬ôë÷žÛÊñîÍÙã/ÿøõ˧~¿zy~óø4gcC·3ÞºcOD?ÌÊaã Øu´IÜ™7`?®ô¨?‰ì%káttW«‘Ë.ÚfET“{ûövÔ\ éÙÔ2«å“ôDn6tB†‡ÄÙ[ÎØƒ÷SÎ:ÄX% w¥ô 9Ï©L]`Ôì™\ÊëX³– ‚C×Í¥°Lã„àZÅÕ0=6H–è’XÈÒ‹‰é+õòL$ˆÀH à Á¨oÃCó°mÃ,üMžÿCÿ?¦WL—pÿ¬µ@ؼâêxf²/˜K ¬€Ñ\ýVòGcóe|É9½: ¿|„ŸAÂ+ʺÀhkÏ)W "°kº¯mt³†ƒÙ¶Ð¢jo¼£ \Z¾º{|·1ü m¡cPžƒ"=›Õéÿ-ÔÊ¡~ÏË?Pø—~â!e~*ïO0š830¡KS㟠ª&%üÈdkuB+¸`Í¢6Г4Ÿ¯Un¼¶¨r4¹œ ~Õâ’C’ ¸±§aŽ0áihoœ®®D«â€þÓ’y -Îm¦ˆÐbXý¬ø‚BDs‚{IÀÍ›G¦VÓÊ1jq3Ÿ ˆÍ¸uÚµD‰ÔÓš\ŠÝõM_ÍÑcçòî¡Ü–¢}^-£?àB½2®ç`Å1YVú¡3Õ0¯~Öo˜ÈÕ­£C8“䤌}÷F¹ælÐò8WäUEÒ¹”\_Y®ëQàéW݆3Z0RÀpxB¢!lÍ?ÂÁCûåg]ÈOe`V#Á"¦¾ ©¸!t£M;håÒŒ«ä †„ÓsŸ‚ÑQœ¸¤Œ=­À¯®@.BgÃâ@¨^–“ Ü zùÂsIöCÒ·5ßfvcEHÒ#šäiB“M”^–¯´5R ¸b¥çL$Nn·›>q†ãZ‚#õ”Ý™3øÝâ¼9¥ÖRóÞµÙ®Ÿ#oø'Ž2ê.¡¾Òù9¡voŠMz5[ó2õ#yYâ_ŽU>:znNV½Ï†ÎXN£Ô¢†’\š™ëZ„^²æ\E—/ꄱMiðeÂ_8µjóò½W8/Ü[?}­öè¡@ 65MEüt+G Px¯|ͱ¤†£#Þ£‡ÏJxbË¢ÖhF¢Ò8Þ>2&‚Zi²ldÇq•çÏÏ„îò­ÿöïüäÏüìïý8IõÓÈ¡?Áƒ*¥%°µn•a®Vûü"oRgô$0Ž„ÓlÃétõ,>Á ði¹ÓÙoba0©0£•”ƒ@â 3„kÎì©ÁØö5ût0¼{ûnfÔõе[i³3¯žÑ*´rëy‰<‚Õq¾[Ü­½Ãƒ×¯ïÞc)€G #ŸÎ¾ Á8ÜöŠ‹å„8·K6sm¦zÈ:Ò ÿ˜~­¹ŸP9à¶#M—Pf‚õ̵÷*ébÀÐw8d®"`¨rçÉW€~Ó²iX®Iúg El@˜Š¦£­ziä2ì Ls—ƒ¡Oš(XzPØ¡3Z¡´þí}ëP©ÑÐø"ʃ܆¥`S6l²U‡ÑWŸa›×²wÏŸ=!Ë"±TÃz÷»«Ö§Œ­?ã·§á ²“džXÞ–ê”ì^8îa†lðe8Õ€TÁ Õ*°Ðÿìì’¶-ð”ù[ $•‚ÑP rTV;PŠ~þ€‰ŽÝ,òÇ>ÊΆ]£ôbYBJ+2ê}•”iú*DµZÓ±çú WÄ,1Aây ‚€l³>ÅC|’Ã% öZÜȆéY k°žÈ6yÞ`w"/€ýE6œ¡¥Æ#ê©Á•íLE^Ø@N¡!Raº6vVfPÊg8€26”¡bQ#Q’îü¤Îö5izw´äÕ<ëìÉ# i½F¦ñêÍ‘­®óŒÍCÅƤÝ/¯ÿÆoþ Á&¥ôêð‰P“3¥J:[òâŸ^]œÛ”…Ei¬J¡‚aéɳ§wn\û?ñ‰ûÏÏŸ6|Wp»xý…:äà·n¹í{ë¦ÅÙú»‹óGWÞz&‚¯Ï6!¯Ô­P…oc-êíNÈúWlŠï38èÆý,úI`eë·³ªrz¾:A#s%7¢Ühû, Ünñ8ó?Æà.„…ÊBÛŒŽY'½ %_i%©Mùå= ƒ–Öc¼{ç ©í¢õ”áÿÿq>™"ÕÛó‘uwÈœwqI¤äWˆ(cºÁZ¬Là&—¾×¼p⎟<ßÙA%(¾/stu¬IU %\Êšì-ÒãpÛÐÙ(¦†§² õâ™ R4f´cmgyÛt â&ïžÑ…I·¥1e2ºªLÙ d Ûpúp9 ~\L” ÀŠº&gÏÍøÝmtŸ9Ó¼|å™”yÿûdŸ$‘-}­![ÂSó3?v:Ë©&qQÐ]Å_Ü,KµZ,ÄiÌŠF7ÆGªSi*Ücžu!Œ­‰±º:ô»`z¹”e>g|&9<€é`ÙOHÿiaÆHåäÝ[*E)Û~ ÷‘Ó ©âæð–½VŸcº‚P5—Ë[ñdÿC4^14Çv£ç¤ ïÁ0¦ ðãY 1ÕŒ)´cûH‡±ÄÙe`H;"œ|iÒ8‹Òpï‡xTů &0¾~q~®míÄU b ã;·|ðù÷ÿ·oýôÏý­#Oþ~¥q%’ò‰òRD ]g?©ÚÜÛÅ ¦×¸”yg×ãÂäõˆšïaé£Â ‚"ŠBÕl_°õíœnÜI%´ÀàqöÓÿèAÊèb˜CN[}³aL(Ä':Àª{ü*æû¿õ¯üï¢+øÔŠ'ëEmHˆÔf²ÁÞ£KÇܺ‰[oy¸xew¾nbFŠÙËDb]ÈM–͸x6Õr|€v5ã¼Õh…ÿ– ÚiìÒ3‹9>áµb.ò®Â8³‘´1+¦ƒ¹”Q!•š(#1ÏåÑêØ¡ÔPšDž'q¸ ¹ßötØ@°˜[2€¢~x;H,áõÖ­Yð3l]ãiPþpFTÓÌWv0 D2†F·>ì!’`qzn^€Ô3(Nó¢ãâ“€P½7´«•ÄǰòÐ]Ï1¥nã'µ@¦~ AFŸ¥•ëL9 nYÿÖ¤ »ÍåÜoy æMÞRÌœsÉMçuÇùåmßrëUvŒÏ9zÈÜö€âÝÌëÊ` r ¿æÂÔ=|ðÅã§Ÿÿ‹?ú‰?ù§¯ß:²”Ϋ˜ofÙ ëëø]öê¿3¦â ˜ÃOÈGÍð“eß'X ¶ü+ƒÌçÎMi® ›rle&‡´´n†4àÕÒ8ÀC¢ “[ ê}ŸNá‚ç¡g úK´™gxÀ*MNTðÌ—ïÞ„Êͦ•ºQðfoBáªÞC°íŸœ`аÏû´"0ƒVfÑЫ‘Ö#DtÀw×uhú‰Ïî<Œÿh*•«CgPÄ󌡉Eó`PÙ+žg€!»QÂ%úÿj¢Boý.ªÕA¢BdØaÕ¸ÓË_&’’0}]h5OK‹°ž Îb…nÌZ~8£)y‹ÜÆQ—BõÊ5÷€üóUãk³V6a Ö f¥ÿ~B52Æš6B7¯ý†6Å€èäl emÈ:­ڷޠ͈YP BžÖ $Uì™2\JÏó® gkϤ 0üW)mP†ÒýáI.ñÖ˜j=¬§Únß :7Ç1!ÛÎÁL)ÒÑÈâ1êÙNÈb”}‡oß>}þ|\[f¨nÿo÷˜0‚:Ý@ñu&ñU˜Û¤½t4ÿ¡ö›ËûáÁd§-@$(n0¨»U2ýà•°ÐRá\"/rÎ(jHÒ¶&j3ôL6àÁ*€eÕÏîkÝÔËܦ¨­z#ûh,Îçg!J+æcF½~Lƒç*EFT {]XÁûé"¿zXã;ºsóã‡^}|U‚uïÁ‡Ož>Ó=%»´³R;梢k×ÿÖïüÖ³Ç_\yýâúoZº~öòÜ Ž€ Àp!ŸJÕüâeR7¸éknTxõ‡ÿø]ys&1»î­›¾“ã£Ë#?›¾ª7Y@º¸zåŵ«ójLR¼þæJï0$3›¥Ý¾{ÒKüïœÞ<¾wÕû º‰^Ï$—»˜nè%øÀ†JºK?“Qu¿¹Çû.={P G×c<Õ.Ž·Õ Ý֝޽ìD&¡¹s‹8Ø-UQÁ›Qù•Ѹ×ÌèÞàÑñ ¥7^!¦OÞ¾k(ÆžÁhBéc¼v“ ­øà®C‹á)Ì›orš× r½Œ[fd9Dêên¥R.É*à7M<’kùF\w/<Ê÷ƪ¾ûS/™Ýq¬xn¬š„W~Z`Ë/gb„<"êô5D9“èÊö\uÚ†düXA˜uÿüÙóY’j÷Úô’ŽkWå4®‹=ɳþj “§ZU­û:ï:öpX§š1)NÔ†ÖP«Ê-ÔodĆ^Ê¥‚€\Ý› {ÓŒXÒýzà 3¸ËÞÚ’÷;Ìç¢ðñòÜí?¸Ï¡û8§´ `Œô™Õ›·¿øü¢êôúng7Að<³;è½9¿¸öê¥÷ûéíˆI¤Ür`c¿ÂÓ(jZ,¹žç1E1‹º™ÙšdÅå?òÜ£¯:ÌsÈ«òšK "þÞØÛ+c3«H×Éûìqs akòO½>wÕcÒfëŽ\ Œ7áMøæ‹Xu·‚WšœÅY„Ÿ`=ŸÙµ7oXèжÞ3ù ŒbU²ž×/Æû ©Õ ‡’SÍ^&_KíÁL*‚gÑ*øË¬ìÓ’ % øÑ;Füôûúå ú¡™¾#Åq p£&‘f3¾V^¤a ëÍùÙõwþ‹¯|ïôôãóWϽ Ø ¿Î ?` E^«Y;iGph¾.WáZ»K%(m¶pÉ.'Ð×Ò§œ9›NŠãñšÞ»í¶‡ùuªöéÖ$ø‰÷zí…ô‰¯'¼ô\¤®šGxi Qmžå;táÆ×2EÃk½JxbéV¸ãU¤FDê‰É¯lŒˆM½`“Μ¹×Yõýï·¯^ô¿y2¢=‹²+ýT¯Bx'¿(NZ<´ŠÐ\i÷…e­sÏ!†ÜswtÞ€y73y;³ÑUƒ®‰D›ý ç\HrSD"ˆgFŸ:ÔNê¼±ëÕÅÙS^Ì_ëD.ûŠÑlEÕ 8E,M(À áùZ¦4˜§ŸñÏ„W÷õ7‰éÝç^mPÊc¿ ¡{~qÆ üLW… ~%ªc· “Ô52蘻P m?$…¹V=«wYÇÜýYE,Ðó`_ðÉÐ W¼¹‚°#2¡­G¸‹GA.Ç>Ä…M¾ÂG±4yïܲÑÂv +jf2¥‰Ø[xoé ±b_Ÿ×d¾ ¡« Á£¨LPÕ„:õP 1 ’o Ýõkú'ÒòEW•*¦ !“§pM»62–Üp 2…»Oø9:9ƒ‚¶ú µ_˜Ü™l|w²«-jQ‡CâŽxlù@Ïcqf5Q2€ÎòÁ_»3ï¾JY›GêwBAË„õb<)ÑÁRãö»Ñ°Ø:Ój~ÌGœÄ§Aœ¦¿à×;ºnß™ÌS)Ó%ë†4s~æå”¶C®6~Þ´Js@=¹Ä-P;W¢~`ÛSZ0Æ3TsçL–cÙUáÌkð* ¸íÆÄ+“„2¿ë>£¤s¹³Ç+ÌòwÛyŠÇ¿õÛÓ«¹ùø:¿o`#sk%“IŠÀœ/ÁZʲÄbëKsÖÄt"Kô¯óŸüX#séa}øÙ“gúmrà—g¯_ž?üèÕ 7.À6ðp ž2ƒé1õ"¦à%–õ$ä5<8ŠZtá Üô4ÏøYþ¹RÖj±½O5»J õ©ò÷á^pbnähÐ+.^œûl'Ý'”ÐFõžÓVpqÃâôÞ=$ÈÎ "—]pbC—–9qH¾Í+)P˜8D\aæ+M5À ’0\¼`–Ä ›hÑ¿³!ix>x8ÕㆂÐÁК®ÿ,N5+é0Ð"Í6]\Be°<…rãK©Ú¡ ç¶BK `çí‰Óò ÊÓ Y:÷6ñ½¶®Np#.¼Ñùâ¢á“K3åŒÂ߈™c æzéˆèô\3 Íð)´Ý?Ã…p¡bTº‰~«ž +ôõ"ê™|K¾^[ûéƒñìÛ³½Üi 6À˜Zêãm £@M&WÙCf¥~n5Q  žY'ènŽ#ôv8ÊÙÞø*äkõ{ ѼveWñàìÀ-ä žƒvÝÏ58¯¿âýòh]Aÿj\;ŠSÞ;ñJ©;ggO¯]·Hkue×N36wB—.Vkj¨É¡Æ(J]¹>¦Ç'Ò©°É¸Uˆtì¦Ë×j"—8#k2‚öìùs­`s¦÷/¿t³9çf'–6Ù²DO›ž±¨±fiüþÇZ5gªØÖM=ÒÕ‚Üv•KþsT¢Œ½›ÛÎÅé&ñå±F@€08°NÆ´ÕcO}üÌôzûºkÒÙÜ(%È û$KÑœÉtE—Ðçê ˆ·…d ‚C*¤4õ8BK}€eieÆ9z.ĬTç*jð0Æ5çõÎTʱe<(*kN·B†ˆÔwïÏhZdAZÒqÓQG¬Ío0À!ÁºœB=`MÀ”ZäÜþÅÀ4·½z^ßuõêùó³ý†Òö7¨VÚb ?k?±IyÙP¯†Uhf J‡bW9xsÁRzƒŠÂõ Î&TÖ*°A¢´- L²></HÄ ¯‹´t5¡YWÌÌ—£ £2°å9.ÇÛ]š_¨WLá- ±„ѽ„ ˜!ôs/a ÚhL'‚‡aÎŽèEmÖQëà w”…óQˆ)ÍNÇsNøÇS*ßÙÔwâmJvàß!RcI—ÁÛ°'†hã³€§@vÛªàWÿðüÏ_ÿÆ7n}tëî/¤ÿ¿Ô·Ì6Y·ð“Â=Î^½|¡Ó¨TˆÈ­V 'T¡°½¤Ã?û³Ü;‹ –—D`=Miå5‡Ù¶~ª7yãáØ†q]ó²$¨øÌ¤ ,Ì.ÁiEXx¡š±FT¶aKsž•ƒÛD§‹·2¸!×ÇÛ„‚Ò»-ÿ×åŃ u©\¨¼¤Õºä–9!=kî*9¯Ú%Â\Àºô{º?Hß›Rd²”À¥' GÆRà 8ðR$]­q¢90WnVìxDœl1“€c¢Y…‚)’nHÍj‡Q‡£qÏòCL{ÔÓwAÄO yUƒ ’­êL:² Oñ‡tv¨ê…)¼Ñ„þ!!Uç[¾~Ó`á´À Ì) €&]rQ±gqÙ\r Ëú­àœ§±‚«4ö!là ‘Ó$Æk’K=ý; ÷(ùéØ`b¯íJ×&‚¹û™ M±S))©lÇ£Ý „Oð ãM 5 þÆúºç†²bžéuÊ^gK·Ðܼ"Ç’>e_ yëM@âÂõßþõ¿æ[ˆOI•UÙ»GžD¹/’  e„C;¼õ#ÌÖm’)<ñîö¹›=gÏŸÝ9>qUBf(5؈n|Î&§&\lù•ûâǘ0–xУ€¾|<¶¹yÿþx=ÝÑÍ>ñ–ï–[o¶•’]‰žpݳIT°ä›«X®÷1V<̪Ò&X†4×À;4¡©„ÉpZZ ¡è¡Ÿãí̵ƒG¶ÿǸ‹\y5°„ößcÖ½Äm5S^`úUöÿÙE·;q<©-äÔmb†¦œ…½3ÅR$“¸2ÊR™×C0IuŽG8™‰¾( s;Yq™g¯»c80‰âó°¡ë˜Áþ†¸íÎüˆ°¯W‹Ã3Ý¢4–5!ð;¡¯ýºe~Òö²†«æ™}CÆXebžÍô‘·ðÀb€Èê¹oHŒ#åpÿšÇ¡D'Gœ”<"ç“8Q¹˜[ÒC=gæÃ[ºÝl ãÛ¦n»ÛdRÑÓa7X÷iAK½æz¢%.T I3Žô]ÎÅÿ#´R>½8Ö¸Ú*ã†î޲(àà`‡›ÅuI5B »o–† =ÄÏ`@Z™‹g[[þCc®j¼?NúÒ êÊŸ3² «¹„V±t€©×(ï1Ó´’ øÕƒ„ ì{%5ÇÞzƒišPÈj[a‡Aa•¯ÀzR;¿ÞKÓ¤þË©'ŒЖžQ1~QÀ°–ç‘ÝòG* À ‰ÎÉ;Çšc{“‡Œ›vô$™ÃGBù³ÐAõ*gà ³òŽÌÅ`8†0œ íѽþkÿÑ_qûPJñÁ‡ݸu·WÜ—2_?q!àÃ'ÍP#ÿF mZ1âôu$w®­éØõcPˆ–Á¾#>܃ª›Í¾³+÷ÒÇšøèZ·÷‘o$j·ÓèÈXò\8Jû‚ÛŽ§g²“î¨s£Ë{¨>A'd;_æ2ýÌËï.U¶rX|Éê)ðJï*l½írô¶X&ùM#óo°¤t!?f*ㆺØ+tl[-Ã!§û-'³Úzpw aC žÇIœ±›QUí½ç)ÎV-¶A‘;yóU×ÇxÓ‹PÄž! »ÕðVa³«ŒÿNbw[2¦ KÐ ‰ÅR£Ú(°ä Kº¨àï5 RÕãéº}-ÄÏRÌ^QÑöFÁ¥à)œ´Fe¤ôê¹$Ä3êêãl:ÉDûÏð c„Ù$‰Èà-ráAßÀ•†@V €[q8‰æ`W)ÖO jB.$"µK#H³À£ã£œÖg8ާØYT‘›D¢âjœŒì ”Ò¡ n…GaQSÀhíYTÕŽyR]Vi.¡ ÁÅÆ º0S#$j´‚ðÅ‹3bº­E“žB Æ]x"–yg.–¢²æ®:«qÀé -TÊ™Ÿ¤îdÁ¬R+‰Šór¢FÁ%5Ži§É A\ŽbŒB¥[$b`ìØh·  kkô&Ãv]´"+¼£äW?Îq;<3ÎÚÌ‘»§LQÌ78MKwݸ7Y(G¤Ûþ”ß;zöèñã/þ•‰Ç'?ù³LnýãaaV˜$cãðä…Ãv"ãgqVÈO´Ïc§ÒÕ†vǨ"Íì²g7C²&£qT½xáQÜVÎË0•Î[£¡Ÿ.©˜svçQsŽ7 Pxu›K¥¡Å69P¹‚Ÿþ« ?ÀÈgÃg½EÒÜЛ'¸¤§¸ŒÃÕÁ‘çhî`èì熅Í<0…÷,A¥j)ê‘,m¡6íäc²áyuܸS†@¸ò€¹ÉNtl@ ÿTF}’#¸¢ÌÒãìòߨ8|«ÚÄBÿ.%˜‘²F8Et…ų†+,U+üP3ø¹Ú@Ž ¨A²ðÔÄ¡’]]T~:Àã|ù÷ÓU¨tm•E¶ó33jNÅWóg„‚“ÑhoÄ/An¯B²mA&ì©kúKc%¶5çÕµ°¯ÀŽZM{`p&Ñ1‘ õK$TØY‡3…ÏRlhIðôp©P­—Ig5ˆ"¨‘rò-7j½Í¤,Afþ³ø§Ò#&øãBužd. jÄÃ8¶›cÞU*‰#êZgû®8Ê"÷Ss /àXÖ²*+i09Q °/ÂŒÛÖî–Ó:žåÈ…4 –{,»X­\[‹í®ªdåéÄ}ÙsM‰Ät5ݤM–"¤š,O®>}òä»ßûô–Ç!îÝ/k„ŸÑw¾¦Ä#FfÓ—\ƒK/}¾{Û ú´|ã†õÉ™¡®mì¾K}÷ØÀFvIYÜd´‘ïå‹nÌ{¦†@xûÈÇ{iòf"õ”Šd 9vY#C®àX S „'Ý%û¸5ÅÊœ8¹&3k½òøñ—”ŽëÕ»ˆ`>U~o}ûääÔlÃX•÷õóÊþ¬ÍD”7Î3ñ€5 „ÚPºz;>-öiÅ1’ž©ÕeÊr: »2 6ÇŠu… •ŠÜEŽ‘{ —V¯‘ÿÙUecbJôA3<öÐ7æQ:ÓR•à‡¶É±‚i·3©é žÊåš36ÀFÝÆT•ئBd–g•Ö#¡Rö€ó&[D_-A®¼qd;øTÏRøÙ”ȇTî|‚°šø‰Wg俥ð;4tÕ%VQZÃU¿ Ôg à°íדƒîº"GL7ðkÁ4ÆXT²†–;*“0Æ0ã¬c~¤ˆôj‰&ñàÖ«­‡†½™‰ô½µ•„€Zµíàœ38ÕWtŠ™8ss‡—ylÝÂ3Ç&8>ÅÄä»» |Ï$æÛPç2õˆT­°+£´‘¥îè$4|ÈtáÁÇU†/'­ž‰™¼eŠË‹”\ÕŽB<µÇS„5z˜¬^X’ R·×Óü)/ÃáHB‰í¤žC5¿¹ç¶ ¡L‡MYb¢¨ÃD1&ŽðéuzüÏ¿óùwÿï{¼rãøæ²m>‰Ð(*nŠx Ÿ˜™W rqî«£q6.•*sÒ ækëÃè¾Ü…ÛŒ:Ô>…X3`™Y(‚qÑà§J5ÎäÚŽã*£õà±WûIüTP³ÝAACçl“EP'HSˆÑìü3¡€8!jZ÷¶”‰âºm«€ý 'l ãª÷—®¢í5b^u®Iä¥Éúš)§ÁwšáØÞ Ý1a§pôVæ”1¬Ö–£÷Ì•xˆ Þ"9÷Ý(‡Tä\À~ÛœÐ%­Ôô0šqzÖÞ8³¯$ôïN8S޼3êÎq9‡2TŠ u›™´Œßà¨~nufU¹?4ǰCAÍê*0uÇËC¤TÃQÅ)ÿ2½&†öžî˃±°²…eu‘w ¢ .CéÇØ ÔüÕ‰g"ê \–\A¶q1mâùc i‚s#›,&Æ»›â›‰Ùiëbh/¥OµEÏ`ÿ:'œˆƒ•ÉÚ·ÐQ>бsp9^*á¦%¬Š·Lâ’²VP)+€0Œ«HkÛ#pâ7%HqT:ü¤dõ[ÎM0Tú¹lÃóv=½ ŒN”Vê§c¶QÒÏm¢­Ÿ1ã¬/4XÌŠÜ >›zë³!G¸¦qTŒøP.{b‘»ƒâøëÿÙïüÎ?øœLìã>z8w3ú2ÌãžXáThÁe,çô,c5þ<êßÖÄýµáüuÇ„¦¬«Xrxá¥{‰ÞÒÑÝ‹ÕI°ˆCjûè‘LZpýLGjÕ×WÖ[µº)UœÜߎMQÚ ­´Àk eR^²MIÚPÌcè‘U‘1dK¾ùH>Þz’ŽÊ˜ÖEžø(Ãëuv3œ=?{êá ½TéÒÙÙ =XÒ†=8uxlh8á㺄 ¹õ9¬¦ºYá©~Ì—ýTÒ'´‚‰ÖìŽgwvøäøóóªfl0³1„ÿ^Ñ̪&r­gÂä°u­·>4ú úöGã9Zë¯x€r0ð+WÁ€;SFè˜|&} ,3ÞÔ)9”z#¥Å }õËGÆàIÞêäU3hƒ+xh^}D%¨ó ¬zœ´ä¹y꼋A¬’‘e¬hîÆèðÎÊ<ÐýB$™!²91uyÔ.©'»’/ZÝè¹’bfQÖÏéJ%ë«jv)ÒF1ÒPæè¶ù J»M¿ØÍæ2}ÜŠ<“uáC×û&$°–>ÁÀ£ˆY˰áDÛ½GgØ8D­ðCÉÏXÝæ€§T£~7ƒ"hèæ gå{ÀM{×H„—h>€ËˆÉ•x‡M‡UKqiÅÂó¥fò7ÊY‚ÆúšÏè2ÔciÂxa.v þG6ü3ȇÉapy®WêÍû]ˉ†D ×®pà@«µˆzM¬˜³À÷¾óǯ_|ù½ï}ïô£O|¾Ñ&ƒÙ$þBj•›ÍèŽ[Jì¸h£ýL4õåq¹Cö¬Ç¡ÅK×R3V­>SþLúKn\‘1íD¬ìÍu%W‘N-³là⊼5\€ ç'0TÔ` X_I¹Ùó4|B¨ó•C±4k‰.—„©î=ŽÙ 9wGpfêLÁÀËM ]ÌàÕ›Iý‡™%G»û²Í身5ɇ¾ƒ.ÏWÇKI‰ce\ŠÐò´‚Ða ®£iÐm“Æ ¨‹Ç2¥§j­Kq$*¤’íeP9ôëšn³v @×Ðæ’n·•Ç'¬.Ü”Ð냷¯p~.Ͷ¼ú ƒldOÌh ‘›îO$ôIg—(`"<åÀŒŸ Юc¨A¶„í)h»ÑÒ૎]¸„‡ofºT?•K3¸H²ÚDW5â3$©É8=ir K{®¾g#f<þ7œEtkÍ—¾Mþž7rb,}ÌÜR+­¦,¿ð3t)5ß[®:èö«â-‚8À6Ò‰U%Èñ%zà13ïÂð3ÐqZÀð€œ€”ŠÖ¸jjE‰Æ‰âX£ÒÊs3Œòºõb×±±QsHèv•ÁZ™ (r+…³8#ãWphµ,Áóà16üЋ‚«`‚ÁN‚“-‡¢ÊåÑÅYÍÄ^¤ùÉ‘½Ú^êÙp£iß__üZ°±†Ã°a.*Ê®jwh®ÿÆßøë÷OO?ùÆ×l«²Ÿ¸õ¾¬#Yâêå÷epX´+J“Ýë>¶ A¬ 5ã™—zàœ!šγ9Ç'§DÊëIã©«‹Weäsõ§·oOO޼›àêc£ñ½Ó-'ˆ þÆËrî\¿ånT·£ô6qÕ³$föÛ Ác¸|õE‡½cΔHÚu†”¸ øÙÓ§)Ò£³ÇGGHKgØŠtüáÇ#zt|üôÙ3Yj“Q@¢¦‡Ï=,LÎ}n["ÞAE(ü¬µDO ¡Ö©¹ñàÁ¨ðé°šBfŒ‘I_=DR+¨ìÉ yåv[ùŸÎ1 ‡Ô–•ÍJ­‚nÌéŽCæ:„0IžÚ=}Ó@^+*R X UÃð£wãªCÇ*)Äm@•%1Ýð¥ñseaH.‰.D¼}ëx–nyXÁh½†Ç5M&é—,6À¬Z GéºÖ ®Ô«Î6@¸~i`fMî¶M˜ŽOm®f _g9ïÂèzë ˆò[)™†=%êiÐÁVʾ„VÎdw^ÿ!¬Ê£†ÔË7¤‰Ë¿J50à‡Zj»AÒ˜gͬ/|»¯{aáÈËa-âwVD£=¿åþ Ç ¡^Í£ú<¶Sà¬/!g„PQÜžý7óoõ˜w,d"äžR^z"Ʀ݇­a±Íø‘žý©!{/ó*+ÊF0¯Z†HæcnÁÚ5 C¨'ê2ÎvJÛ& Çt­ÁLÀï*¶Æ¿ìËÇÖ”€\…ÄÐo«å bËêM8…ZÓ5ð·/Ÿü³öOü›?wWze]ynS®80à6ž¬Œv Ùþ¸â«+Ó³7t˹Ï^œÙ<@(`€]ëèÅØ˜õ->  íþ$÷×;ø*+/ÿÎÜÝ•íUµö€A<…Ò÷Õ6MÖO´gÄ×Fj „ßYÍ ÆOÕP´€-÷˜pb>Öm¹ ·6.é}`Û§ù4AE+50o*?YPoÀ&®~”–A+èWX¾[(~Ï„À؆¼FüCäñÚ¬æß GEBt­s#ý^„¤HK8u.Lù Ì DÛY®æ’ÿÒH¦CÌX¾/¯êÉüC/ ›¨ðÍ–az4#é¡›/WÛ@A:âdni©AÝÕe@<ö<ÌO 5,°°ÊŒÕYL¤†Û, ¦hcïÄ–%Ší™j¦pWEEøx½BsqÕYOdžÊņ4 âÿhnšˆB㜰\¼îé6­yI;U:¸¢€Ì«•]…„-PìnÒÐEZ îøó}ZÖïù9îëzƒ· ¾³ÿA•Ø£1h™ à °9/e_ÒZa€sK…% =Ó˜è­àª2~· ©¡Rïì@ÚÙÕñÌ€jBhñ¥Üˆ>Þ=?{nÔ.[ˆÏPa˜Èš,®Ê`G¦ä«ò+y¤A0Ì€—+g (Q‘¨Ìí+ADÈÔEBvi¼ÞÐjNÛ‘ ô†ÕLŒéÒÞ\àúü—ÿÂ]ÕÛÁzÍ}™ÙßǡڥïeW=˜íVo’§Qª°j# ndW£ˆº±Vx8ú¥—½úz3-¹„oL›„øf·Þ¼sïöÑÉÙK_ün Z“9[&?yzíÖû¼ RþqëôäžmYn-JAÏž=~öøKÊ<}pêC†„X}¡ÈÆ´Æfj`kjsË‚S‹ÞK~wÉD˜™½ö^«™HÊ77ï“Þaò¯LéFïÑŽîžØ¢þÙ÷¾ûìÉS ¦Í"61‰$CÕŒÄc¶6c±„]ü¬Ï÷dlöécæ0x\¿ñ»¿ûÿÉïýcoý1çÄ™% öÀïÏr¯|éz|ëªgìk©o³ì Ÿ-Áµd•δ¼Íª9 `ÍiF|nÚÇ8"Yjx#呂Bž0'…FvÐ"ÎR¾pšDz–ÛöAã_ÿr—Ÿ®ÄžÖ{XÚ,ÙDЛºD1ö}~~Q70ƒ7¨‹Î-ŸöAϪ@sMÑŠ3š ¡@9‰·¦Q%W˜ÞX\›73±)E5 ç+ó~;o2³ªg˜âð;›|õæ_þáÿõO~ÿ÷ÿÜ¿ùçM½NO,MYøÉ­ ­¤À*»ÔG&ЭÒÈ>?Ås|ßÄŽ†=OAÑ•“P#ÖÚ³ƒÕ{U8’/uqL¼3;]ÉìrËðÜöP´‰@z¶xÿΤRÿù€ô –VШ‚ýù‡ŠÖÜï^å×%gÀË™f e1€iü¡…“‘¨e ËUÍ(ê˜DSmHLN×]£dò€š¼ÇOL:gPbn–¿Î¹ÏÊbAs?¥IzúgÆWγÎï?c«¤Õ÷C¥G)mäÊ2@꛸£V½Ï°§ƒ¨Ä´Ÿrú´ÆÛ`4pu”#k¼0Œ×é„ФÐ#Ø3˜Í¨ay£ý©¢¢èà‘ABñXóaqUžCxvÑ#|0ßNœ­ÙØŠr™!ñàu¶=Á5ö§ó«“Ú>ñF´+Àuzjʰ ¡®ªž6¯þœõ#£ƒ11Ç/И74AÊTÜ K:l$ á-™¢t¿†}Ť×éÉ9Ü«a5ñ¤]€ ‰ÖóJÎàô¡´Ñ Ý÷:‰…oÑÒ{ uwÛÅ1>EêÕ0¯{mD³›:Ta¡XÝzÚ”£q˜QJi¼ÎCK‚p#Å,j­õ[7õ¼—åÞ^:c}âE¦UD§mÍæ¨8!b6Ï|uö¬ÄŽ®à¡IÁ‰*`¦:®—np˜â£ÞŒ°Æ¾²7ù¬aY•3Ÿ¬¿´TO»d—[Wõú‹s t+Vs2w¨¼÷u¬™ñÄÛ}™*‚kÃL¡½{EZs Iê=•ŒkÔôI‚uä®…  •ݯ^½xví–­½on]¿ÓÓc67yêÉ×Í (€§°cx Uÿõ_ýK¨€³Ü”ꄊ–Uºƒ¶®f|ÒYÖ«’ÜÕ~#FòRß÷O]z>{2$è^ú¥·Ãê«V˜³— ··4¿„¿Ìãö]Sb“ðíîÉ=ïoñh=ÒÒ{&e÷PoïžÓ½æKF÷˜Ä« TG¼bKA»…6 èêL%ÑD‚Q­!Í0æv¡LâõÑÝcÀ^ A¿¤H³ë‚Ç÷»ÿ Q–ö¦†>úÈBg@«D=ä9Y”ùÙ ð6 <Îì·ŽkFòíoûoÿíÿü~þç嗙͎OŽíͲ4eBÆZ\•[ Ãÿ:jýªûµú9}hñOEI¥«—Ó0–‘Ìððª·ÐÍÂÈ„4=8 ïa+®6Ó ‰Âªˆ×kƒ“f¿-€5rs,lóe<¯NÎ;¼´éæÑìßïÝßœÛd×Z}Æ #prš²uÈ2Ï]Ú*(ôy¥¾®x÷ãqÞâ_µ#Êo ³ÃÙÈ íô"ª(qÁÃ$ôåÍž?Êõ‡yÕºpÚjPC#cš¨ì‰YdÒ¿óÛüa†Üc2Q‹cÔØ(ä`yòRæŒë¨ùã`t(Q¾²¡–ŸpZÀ°,\«™U÷šû†ÃAL@z ¯ÊUþÆ‹e¨ ®@q:B)—!ªÌI´@¬ì­>’Þf Ýj`Ï0HQ‡gö‡$J?åaª)ÏPqÎPœt¼ ·Y™®æÀO cH—ˆ´Æ‚ÆæÅéîåˆâeö-5% ¼m7+Çp•iÔ³¦&:å-¹‚Q™YùNTÚÄ:üpznªÖ0˜©{Kp –O-ô=*HÆ”†Ä«¾ÉýìÉgøûÿ«bþøOÝûàèÎw!KÃ!&S ª×{bwy .H¨sÌJ9 lÔ8º`Ù E,ÑÌõ¿öþ&Ä65„TakàžHòZJ:³A9cÑþ½:¨UFiؚ쵨5Ǩ~Ø?Ý›o¹•zŠU-D÷}Ä;GÇ7ï{k¯-72דÓ ØçÏÏK™lw½ùÚMnÛ`Kó Á ö §#Ǩ¯úæ¾ó ¡FMàÀ(Ñ´ÜBÁ{kèͰ~ȺÚxë[ßúÖ£G_|ó›?uÿž5+ÛGÖWZÛ05“`u·+þ¹š«†d „E‚Ý;U|Á>¾{üÿâ_ø•_þ%A!xoTzýúôôž@‰ÑÏ'Ò+`çmÞÒu6O­Ù%MŸö©@ÂÝ :ço:T&v‰ÓKŸeN»×<,©¹c”“uöX­®ãHÝS@VòŽª›úc¯UÈRÜæjÀ+«Äðä4=”á”Ý{?Öy_ÀùX˜n‰5ÀØ^ Ýzr‹"îµÕ 5>"½Äè$Äèoh(´edµä¬’øÄg!uqCx½Ëï«´$-«É"œˆinýæÉÓ§ÌçËW3é÷ÂsúrJ`š™JÖxÛâ5cQ›ɦ!9ã x·¡p6êå¢`¶àð`0¬’ÐÞ¾¥^ó…øoý½ÿúÇêë?ñÓ?{óÖÉw$}+ H`ð‰%é™AëÅ…®>Òî.½©ÉÉnG}×,\g”ƒ½,Æ­mîÉG0gIÛBÔ…wë7?n©›ž®xbÑV¢°²+¦Î Ô¨H|—þ(̰bx.@;jþeåÔcÖñéçŠ6úi¶æ’JNK–&³}J U¬{ÃÏœÂ²Âø§&ya*üB•#Œ‡¯ê„r;J§¾/j «lÈÑ``‚åJÔ‡t0Ìè_{É*W£qITúél¬pS·4µ„¸úô í‰ìRaXˆ£-H-*ƒ£pÁIV£mêš Ë«.QÜ3ýž±ÆÊ"ÄÆŒbZiBåôÈ“ŠDn÷ôPŽ tuÕySei• L·+&T©zõÚ‚Á³2  W+²Æ+ã0¤«Zõ’ÇÞÿn¯§.è’™FîtâhÃéaU¿$]Ë9P¡·†×ÿä¯þe}Ò2²¤”¯^!œŒ5¢å%—B 4fAB£ÍfV‚Èw¯·ÆˆlÐÊ“l&˜Åi¿ v™Gêtûøž/㔾kÓô‰û‚øFØ}"¼Š¸gÁ‹Ë”ÅAïópm£›³tÊ`9iAã=6ˆmájÍC¶gÏçã£óF> ¸{¥±y¿ Äd0¼3·ì©úú×?¡:òSàg"ž5X\Ö¯áGÅž|·aÄ# ÖáîŸ>€[lyrÜZâÓgOYÝdüÉÓ'º‚G:5Õ´Ô›7Ï$ƒÝF„x}«<òµ]Ff6¯×£'½;[ìÁü=kyËÒŸÈî©y‘©ÒäÉÎúnð0vY h¤-w§¢r2lóŠŽäN–Ÿâ€ù—ê8êu†a€öõÞˆSVAE A·Z“Ö œÌs‰ªµ1˜Ûa`kø0YdMCˆ¶ úI£ÚPiKŽóózEa{¨4âödê§6gt ¶e€¼uŽgDÎÅ—˜4ªÌMºÄlº;óššHÌUò‹8«:‹Ê%*ÚñIˆquºHÏl7mrTÖ>³Y4¶Pñ(b{¤kUŒS¹ªf–r£Z#²”È€Y‰%°3#ì¢P˜øêÙtCî0¢õ¾FYÛý -† «¶fÏÔO壗þ©wWot§L$´ô¨ëèD±ÒF \„6f˜g™Í·¬„¨h¤sAûé§Ÿ:»ÏŒJ XMìιA©ž^Ô0uÃ’úûÿãßý·þíçôÁ×oß9ï}§7¢RÉqõxœÃ'œ-®¼ýÊwH »ªGêIôÝèo8¸¦ÏŽ5ûpn¥ d‡ÍÈmÍÖ=ë§ðð8[toL•ûÐÐ) ¸ñ³ñpr_wçõÙ>{ÂŽþø28s÷IÊ2xØ3~Pt,cÄg—Qu#N¡oº:~bâÔÆãg“êÁO¨äL`’Žæü/‹@VRN@ 7š{‹2„uÒî ¶Ã9ëƒîžÅkùVíènA‰o£Ž¶ê‘Pv¸Š9ž"!òÄt‹Ù˜x³­žÛyþþ´*«ÀÐÚ6ä9.t-Ô'7Á˜v?ó*[ 4+`Þ5,ÁŒI×16>ƒY‹OuçY°eí¨Ìòë(qš‚TŽÝC]È&ã¥B`6â$`‹¥ñ|e"+¯ty¬F±9ɶ¥Ã¶´ŠÕL­H¡<]IŸÊÖx~Õ–ÍòW¯/ü:±ßÔƒZD§j£§P³ÌøI!4LØA§þ‚¨…˜å³Þ3áš~b{ü?*õÁ6Q˜C¶ðaX?úèk¢þóÇ?8üùm:³Bé•ÂG÷ÜYƒÐOjDÔHí š×ã×~U`#˜n,« ê«wÍDy–óã©[Ês¸—9Öù¡BBœNw4Ī€«…¬NêÐ:ˆøÛÂAÝ‘)}­´w®öÖuO-úhÎÑ­Ï}özf¢óàD÷±ƒaÚÈ1F§d(1œÁc”¢†H ȹfËDÁåúi°Ä$åsª´_˜«øwñáÇ'¶Þ»oj+Rù¦b%"ÆŠ6WöÀv3!Ñ™ƒŸžž XŸ ÿ}ÄI'³Ä€¡]Š>ãp$bsòË!W•&ìN¦žøàôij+6 ^T@1ÖV)‡+é|Íóçqæ:K÷ ?‰Œ¦ÂxlÜá]GÒαÜTpP޳&ØÀz7àF·}_§9¼=CP]T€qŽø&³j“SîÔCfæ1J“ÌÏofŠñ7í° ~Xß™OªAd¼ŸÔÚ…Í3áMý· #6†ß:š>¨­zžºH¢7f4¡†mî ~¥®°éÑ$©äUén~µRÖ ‘³3Z’4WaP´œ)žŒ€¤p¹Q5w„7ø,Z’Æá<²³}s¬‘‰Ê÷ÊÃv"W@ÚY—( ¡cÀ`ȵê0ùU¦IyEEúÔ"£©Êa¯JW„‚v±ùÉ|—ÓøåËÃa½~Ýb•Ž&Á’u ³00)&®Ÿ>õðûKãE±÷Æõû¼béÀUªó¤¤—YR?e]†¯úoËf†f=±‰®#îcŒ£Š iþýü‡+¦1Š7Ã1¶e?59`ÿY=yÄO' Q³+hµ*‚Y%lépöB ¹à1äl ¦Q¦¦ØQT“±¦öI[:ºsËSÿ¼Ó?g0”ê\p놦TA¯ìëɤ…9[tæ™ø^Ø©+aC¥¶™{¦÷¤ƒ«tR«f4Ž·/l±=:á~o_žŸ=yªÇY°µõ ÃÃ@ éu/1ó® /~y¨ùþ _Ê:^•ÒI9 ­ˆo|‹cŒÃ¼ªì¬Œj×E<&5±}U(ÛÐPäm´}â®7'ù&«÷„çÂȽ“ã/>ûþãG_˜ÌܽÿÁd¡˜¦FÍiG[âÁ£5)8ð3iw£²Ÿë |‘ü†ñ´ÿƽ8ël-²Ö{ØÝÀ¶¬J÷L-½JÂ,ZL†‡â‚éÃsv/^±ãiI=LLaÑ£“c7#X<6f9êºÉÇŸ`ÏVk;ß™üɓǭÉÉ‘GÉÎtzöWWNö(¸«xÑvò¶ºcÈ·( gÌü“ø F+î ­pÃ{жâÑ|Þ’²ÔÊW¦ÏëûP¹Ë>“<7ƒôÄÞ‡.ë£RÚ %x6î (,À`~0H¸MøõÅKoê§Y=Ìátÿ±Ã‹õ¸‰m7YYÚz»%‰õس¢ÁŠ,¢‘¡‚I1À!}êDƒ—¦;5ÖcX¾þö‡bˆÞ„ m— qh¸ÙÏ /Oš2d0ãׇž0£G´ô<Íäàל}qO.²;TR¾¨T„Ê[G‘€ò±fÕ7šUOWj‹=É-&ݬ92ÚY(öGeØã .¬WcƒnÜ'7a#& …ÖX ÁÜŒ:%dõ]Ot("¢ˆVCN-0TP¡$P1èžD~:û9žådröéyµ¡‘PÎSi$~Ø:Ó‘-¢Îð,(¨8ûÊ‚ú 1w3ñ ´&çäÉ™­D­Ï“ªë±¦[ã(¶Û|ãöÙ³³ÿéø{¿ô‹¿|òà!}Í­…埓RSH­ üìó/(–V|pª#S K¹ŠOõ­C»ÏDzÓ;`ÐÒ¸%[·œ¦S L.»ðrÞ> ×í½÷Û7{£2V4ÔI|‚š¢½S…59'6¸¢`èÏJ"k לU¶ˆ·ÜcØ»TÎ.Í–Üè€ô°¦YÁ‰@ã>E9<§a\be³·fÙˆd#]c‰Ÿš…ª8l``ß<›ôJ¶þò–lªà—n „7xt3çB¶[£³ºÆûÇK¶€¨ïp ’F3 ó½?ZThDä'yÂ<¤Ì.I!’6%¨Ç9¯BâÜÞ}ËÀ &L=Ƕeië¼ñùêeÓéhŒ?;B»ó=”æë+þ']6—˜x8Í5A}c%õc!tÐ]'b÷%XŒ¢*üdT­¬eJ­¸")5±°Ÿð LÂÅl'Ôù b£ÞÒMþ¹ü¨oÎß®p8ýT Þ/kÆ´Š5,=þ,‡oZÛ˃€½šõQøý¤­¨Åϸ2)¸¯ y’Ê¡áÙÔò ³LŸ.vž!ƒ@ãÍuÉ‚ û ÈVj¤á‡ý}æ“€á×jã6éÔøäЂֱ•£¥Ã%t!§[øk &qú §Ú€Æ%‡œ¼­û--N[5ŸÎXÖE·KQ ”ƒâR_YZ¯>54,²Ë å'È5™(‰n‚·š Ë aMìL~}ëîÉõ»ÞÌ×§݃òLN!b¨ du„3!í¸þWÿʿ咽8ttìÃ:Mc…Ã:a}ã”zŠ#žæô ¦P8ý0‡áà‰ï’Š1|{z|µŽ4 !ØÓ—8ž']Ë%ËÄmÚ—}÷»ßSþøã£.›7P.¿“ÌÕ®mqÚŠ_$÷“³^ &RÖd™VïAAGƃÎÎ` šè-ÛÇÀïÕ‰½ç/ʨ\ìܤåï|ç;–Ú,À2•'+½˜T¨¢ ­Nû°¹§ K!Êg »ÝSO$òî‰V°>ñ¢_ôÑCX¡ ¯n" eÈ£‘.pßìMÙðÓ)H‡"àõBâ©!¡èînÅŽë >þ: ³·$’8Z¹´W13ŒÞåÈXé(JÞ&ß œ(’ÂÁ©í,™ø§ÜßDóû„ö‡öê [ç0Ç»xq®K29¡%%:ZJ½E­åV~ïÁºx5ELóÜÏ0ßËÓûÕJI••pYP¿Âü´ò jóxÍ]bYML¼“€c*?USCÛÛaÔD=LM a0mH"ЍGµö ÉPüt`f;—gVXs¸Êœá¡F>),¦LøÒ!à¡ZWQéöùž—ú9K ˜‹±mÎà\ŽÝðLôµZàã~6š`™fšN ÈQTûQ†ý†I®Ó{/Õxy«ŸA™†‡–ðÚ8Aå{FI;æâC$Ùxm€§‰'ÏLÚôÜ‚2˜ÊÖ®ÐMÔ‚eìØÉªyãA"ša´ Ð`LN š¶ùs(T1+g¾zöâ¥û“ÿÝó_þÒ/þ‡_ûĬ, ÏhG]˜#xä 'Lùøã‡}øªy¸÷,”µß•Hè«Õ§áBj3²¢•e"²£?ø?ÿw//N~\`b¬y(Ï=ëàl§iˆ•`–N—²”GÎ0Àqí¨r=DˆØ.¼’™Ò°´²3NèM¥ŒE cT>zô¨è,²é¨‡K–__vÈ®R+> ‰F´´ªCA‹ô{}‰œ«põÊÓ¶õ'®‚±P×~¹0dµµÅ{Ó¨N snJúŽð®rË¢Õí¿‡Ï FáPuuìîLÔHµg òz1žÁZ˜«ñ¤ÚÅÕ¶«ä¼m,h}eŠéÖ2êäÅžu>ú‘ù™]qq“P«4Æ]¡´Š±é6¼‹-šÏ å!Áþe1^ƒ/¥3"ZÁЄ>ëíW®>{òRèántõN·3ù€<5^ »áŸ°®z«™z§UYÁÒ60³:À ¬&)DzÁÈäLRK:!Z{~öغK±,Èæ—P¡.ä9#ê€Y3ý˜­ZèN™þX¢jáŸ~’M ë»ã¥fázŸ€2~üA†EeùôežÌ+•Õ2Ž›ÕGË$4‚„õŒÛ9¦»Õ÷ã>'ÅypŒ ³‰ì¦YÝÐìq¯a›ÎÊF—蟚0&6,|8«ÿàƒDÓ›på*îÆ;2 1’·8 %~öýï|ûþwÛÌò§æZmIé–eÀ uIö>ùäëšã9³ÎmVÑvLٌ߱FÑVAÉ{ ØF"s*!ùé»ô‘Ÿ3S( ï\ꊉKŽIÀó0f.€‡é;þE´!õyf¥¡âÿcêÎ{ýL²Ã¾skî¼Üz™‘F£%–Ä@€6'’ @^H°li<’` Ñ« ÀF?D‘-!r‚H€$K£™žf“M6—Kò²¹åó=çw¯ôôíë©§êÔÙëÔòÔ£ÜhZL[Ò<¥ÒnG¬Ü0D`F¸ª0¬Í(,šÃd¼¤&MãõA%ÃO0A–¿ƒÕ:ö®Z.¡.PX§¤Ksrª0ƒ\Ú n‰|¬u™¦ ·ÊÇhÑaáD8™éŒÕ’£˜ºü“GK»†øOµñHغE8~Å´ôNNX] Óü«i!jtÖ:¹)ª¸Xàgú™ÿ2îíØ¡w?æcx5TÕÖ¼ i¿K×Òâ×…|j+EÍ)O±| la¨°þB1•–½  uÄ"JÐTW^s.· nÞ¸Â(ÏúhQŠ4®†{áyv€d¹ÐBX»M„¼Ô˜]™õèí[ šA” ·I¸³!.‹6» ÒîÆlŠô-œÑ³íZ‡íŠž?â²:a4ò½sšI"VqñdAî€6^µGêcѺ†´n—H³™d¶n+¯uÓá”åNGZ}H(3 R`E¸íº=SŒi® ݱò ‘*­+¦¼bP{û2³|ÈöV¸mùè)èaEûåè§bÒ =PuvŽ®ßq¡¦’…ªª{ª–k ׄ$ï;Ú§iâìs×îÂÓOž=yõì[}™žþÍG'L5O7âdòftøâïÿþï7»5o‰Û@'Â3PS £ ãò&¡h>³3Çüî J¯tô}’<…ÓÚÙ(ksK0«×̦2*úAöò‘ª< ¢f{ã¦þ^1.æ*¢R‘êLSÈ2e#Evc¼„·‹ÌÜjQAñ®^éq<µ2 %s0Aѵ+7-D4{ÚÊÝç÷ïÿñÿÛ¯þå÷¿ø<´Þ½uªÂóã:<ëž,U u¨Ì̦$cSÛ5Ê?z=û¼u"ffèÓ”Œhíò…«ÏOŽGZŽÔ,_À®´å¸|Ç@¿ºŠèÓ@¼bí…ÇíaC˜Ø‹G²±J­ñlÆÏ çséévs<ã}òC n×[å1dÆXíM¡ßäÞVbêl‡ræëiuŠ8æà¬ÝJŽtªî#«kCŸxSkö˜ßíP«W³‹&Wúöäé×?ÿk&nÝ!¡¹éOdÎLâœÕd‚Sµ>ÓŒ#¨;<ø ;?>X>>ö>s£vVÍ2Íä¢Këf­Öoú×Ü8ž!tâ)úÐ_t›ét°J£ (Š,…àA-Âz£Ä+î#ÛÅO½ØhÂÜ.XŠY…'Úõˆ‡ñ7K™í…z5_ÏÀ(Gúݼ —FtŒOÏ_ß»û~°|Š­õÊÓf† 2sc…ª©8Ë2Z Ô¾EPÂf3Ë@/r¬ÒçZA¢¨éÌv¢@†¤g½Bƒ#¿t¾wX”·.©©ù#y»­…&ú€p®]ÂT1ËÂ7?“Â+„øþzüK#ª°ï“Î0J7`.·ÈÞºÜÞìݧÞ$ÅçÝÙóÆ 5gÔY­h[ì nDNöZûI¡Q‡­„5©–ج)ûš»ANûEúì{m¨pe IDAT{ûžç¢Ï¶ !Ê×)“sš6‹öñ‹ÇòçÿΧ]oÞ¾û ¿ô«üÜ(<´‰{‚àŽ{Ö—X‘ÇCFíõKp˜¹66éÃÀÔ¯3j.•ïUkt2&uÀ²¯Ñß¼aùÚ°,§iúµm¥¸!Rì‹Ò$Žóhl:Û«§×Òqz¹½ÌÁM5ѵh¬ËÒC+0éæáh¬®qø,…HS” žª«U VO·]AÒ³ÞA:t§-#šKŠt%¿T8;Ða®‡t¯Q¥vI¸Ì…T¯-ŸÍ¦ ‰â`È1ë»ýñi 2 |âQæB­§cíïl>o¶‚ UÑCï߬(hªC*ßžjÔ?’Ž|ŽŽŠ•'W$ªgô¾6Aµí4½ç‘’°X¶­0À"‹Túúså5ÊÍ< }Ý4.¥ƒúï4´Gs¤f4À¦Þ”ðkæU߈>Æ,ԫׯDŠF­`hM¿ÀY5T“iÙ6´X A¦ÅAÁ:£hxÙçꩽ׹ÖkqÅJ"\HÄ/±êÌÝ©’Ø2êyCMÿip’m÷ÙSü¥‚îI&ú/Ë5>1ñe;m½öí9"ºæ†cc¼ ˜¯p&bâKW¯]燚jÏÆfí0-È‘oX2ŽN—$¾I‹p²×Îs†¶ZcéöŠ&émç[ÀJ4méØˆXúlvV£^œçÆ@À’Ù$Îf–Vð„gh›E›6›ìlš<íÉ›—èÏÓ $ZœM!¹Xøïª&.àd ØCK¯ÄPÊ-wÂÜ$²)óÐdQ÷—ÛÕ¾CÔêf᥼ñEÁO‡GÚ ‡: rÃ!ös<õŠÊxQÿÒ»ÞÒ5©Ka ª••éÅßùño èô£ÂÛ|bcñ—Òª4‚V?ÃFz†Tò€´DÉtæBÓ³YÎo–‡Ü´%c…ᚣTŽ€„Y~G€LÆÁ6G{á¥ÙûœÎPNÇøMöÙùubÔæ«Hi(Ùª¬ìm‘‡rÒ•’_|ñ½ožÛ—`{hôsz©œéÀ h"‘–z}šR^ô)÷d®‹îKÄ,S"¹C /°´‹G·oùnëÓ§}xG1¦ +›ê–:,ÉÈW@E×ΔéV±5þ×ps„°Ko½ƒ§Hó«î¤ÛœÈôŽš &ñŽóµª«”Âø#E°Ò&ЙðqmUìºkZ9ñ朥ýIÀRQƒ]]'¤ðûŽ-°HÛƒ»‘p‘ËœlY' ¢ºfI‡g—GÊ{h2À_ÿé7_ܲ…„jx…ÕN¹ón”wJQ©©¢™šm½Ö9p'"cƒVÁèôóoýä¯þ¿GüÇÿø?¿}÷ [²V-VI-fY.½øâ¨î¥˜Ì¥…ñmxÉý£¥j C k,s¿·½Âw–Æ4¨=ž`6ñÁ]1œ\UhæÛ=|#‰¹m©pŽK`„!+J,R ™r\\Í‘©¼|üºä¸´èJÆ5 ÂUñhKª5˜¿ì3§bNp†˜2Ûú`5½ £uS½1¤Z…\™¹¹Lìˆ(Ðü*ãéÔ­umy›gM’é >ë@ôVY´ÅB*fø–7F©ZT(ŒK:‰]¦•Ãí¢Š{r=´îrë—YjnuOÅžÎ,Pž+±·9“!©™Œ†x“`Ó¹8X@¦åD51Î6b‰LCg}Š’ø &Kܶ”w)ŸbÏu Hÿ¬d|úXOqÔB5ôÚŒÑ ø. *gšñtúD£x¨ë“S‹3%†yü$ïMùon6^Í4*9Û¤ulÿõ”/Nâ& Í ¼§ Íâ¸d–?—êP‚»$d†ˆ¦ð€,¶POUIÿöhOÇ@1\ûäÒòà9c»Âî¦Jj)º092* YNªŒYÕ(VÈWR,2³ ¢&ýHU0V ”­2”fH“¿U}X‘WÔ°º6#(zä×.Áßm@£³©)x+é„Éá[‚£{Ï›;z³~vaëux…„£›GèŠþK­HÞ<ºÅ!«î<Ò¤ÌÌ#?–ËTvÚA&X‘‰ƒª7hòÿ½Ù®Ð„ã¹ iøui1V×–ß±ÊIÍX­ÊÇ8U g\0v §Æ¹ÃßÄÉY7\œ†ÔÈ„ìÁœâÇô@ˆ”pÉA Ar»~›#ËÉ4mKb—¯~…x;z/\¼ÿâųû÷ï;øÒÖÏ?ÿ…)Bœêâ§á&%ë¨ßªÇ˜.üùˆyWš6c¡ãzí@Ô£†Èô„QÙ)dó–„Âß|óM–}Z¤`kæzüöÊu«`¹…¶‚¡ @ÒrYy'\š÷üÙñí;·ÓU1S¾ÀBìÆõö´‘9žå‘ä€$Ä@Ë(¹stçŽ~Ö·Ù·x¼*òðÑ#¡r'ß½»éEªóèá~ñ‡?ýéO`„½¬©0qדP6¢×.œ]šC©¦å(¦!À¥]–X7R¤•O-‡’ù‘ˆM¥©¿ c^iÜs¬GJÃÃs®µíJyO®¬¸¢FÑœ™)ÅêÉÏgàŸ‰‹4ªir¹xªµix Àh:PKDæ¼&,±×hrþÙEA4A/Ö‚f!,ô4²[ù<›L W¤åHûį0Èi¤¹ÅÇœáÕ®*Ò4M›`žª\Ý¥'€Ya·!P`šôÑR¯qJ©R Ö/^“º.Üó àŠÉ#…å S‰Ò —žÀw«Ë\ÒP¤ µ´úݹ6EXvP& Ç|$¦L½hHBq:;ù€,¨‘TGù D?×r² ÿq/~=Ý_„µ[¿Š™¶xUÀuŠ€¸­(gá8>~Nýf—T¢ÙuˆQê‘Á¯€½hE„…ÅÃêâ{pÚj½CSS¯¦¾<·@d˜  פ-U dþ{Üu¾Zà+sƒ_9Òã-#ÛàÉà¤×ÁâØÉÉK^½*fv*&w3U‘ƒ©x?Wg'Sù×#ÐÁü åЃ¬Ê³Ãv«@5LÔÈmê£Yzjѯ2ÚuI¨ûõƒ|ÂgŸ}&G+ú)š¯î¡úHJ1Êšé+]ž¨I£êº ™¢Œ—£nm>¿-ï¬(A’#µSbüHÁ ýнª¥ÅhiêôòÅÿΓ7‘ÂM,Öîå–ÎÉY÷ bMîÇD7v Ý 3X$s(:Z 󡜖LVÊ\Cû‡›4ƒëa4¬¨—,uëÀë ?~t ƒ å‚J-ßöá™x¿vÕn¾yò$_dh”0gFÃm¸€,S­˜Ñ†t&ÁN¾óþÑ[|¬úѤiÚ6XÑeÊ6’ Éõ}9Z¹ÁwͦìÛh›à`”å0Ú£º¶>|Ø*¢xÿYÖ x83«@´ñp!¿TàhC߯‰eö©|i7Ì]õ¥Ã C‰å$Üz Vô×a†Ì—ŽZæ<} màˆ®t]Jyš)€lv –D|WÉ:Ê;“Q£ýPm¢~vx¨Ë«ˆ{È_EjwÆi æ…—ñ˜M¹á¬€ïÕEš*Êû•†°Ò{A@B¦‘r”1-·ULÃÄÉòaKz„.h¨•Á°¾A±££›XÚ¾Ô¢¯;´¿§…`«É†ƈh—WÂY5é)ÝSŒÒ²´¦‡½SõZßРGE„Ks†œ–èúbŽ(kÆ47®ûƒ~¸épðfªLH´®ºŽ¬¾zÚ5Ú02M¬(ÙN»N±'ö”•¥\¹Öº•?æ.’f(èaëª.±iÎfAUK$”í^@UöÒt|n’4nKË?KÌíø‡‡É#,ÕÐþnáušSɽؚàÚŽW¸b‡(4Ž_Z)f,ÑÖðíÂ×_}ùöäùƒ¯ý§ÿÅmÖÙ„Â"(-°xNèÔ( áÝVÏôV.h(‰ i•ƒ™;O†³–a›¿Y¿÷ô;®·mZßcBQ¥0bHòäNšP”ÇÖE@ âTæÙÖ¢ÙhU•ÓnXyL‚^@'pñHÚÔOÛ]rèWy‚üÞ_Õ%0M¿_E&9«®ŽÔ@:HgæxÔ¢ Ó l9Újñ77ØéÕŽøƒ%ù½)\"±ñR£˜³TÌ›€Û”ßâEÿàC¸áv«ÁWEy߸¤ÙË«ð€*ÂÛ¥—Ž«.D+¤å0ÕÓðQæš*žæ!O9|Fµ%ýÌmLü\n¨µ¯X‹‰{7_s-#ú«£ÉÛ7Á œ™!Õ`Å!4¸û»Øª5ø´ÕmdåÓ³[ËÈ@~f»ZVÖ øÂ0å ;=Uin%ÀA´zÙ¢crͤwéªSLa:A —òÓŠG¨“¯i|M-9û<ÊüÁw¡ÎÅ0—?ªãSø„§X‚GÛ³´ð:ÖÐÒëV™¡.bÑŽ¿šÖ#èŽÏ¤ CLP+‚˜{¤-%õ \qB¦¡°LK{0Çd%Tò)dºçW]3#˜Àáo-Md4C9Ü€!G­p3šÅèIpJ"b|æ Ô3Éüs¯¯š€ç¬o—Î|fudôB¼•/8k@Óji9öwÚJ‘üîïþ8À£ë~ñH&/ QhxˆmaŠ`Ñ&¡˜ó;bGƒËY\C#®È—©ƒ¡'8h\>}ðNg:ïy5ðmѺTËËV TUbbüâU k\€€¨²W,*ª [Ý¿êX9,Bé c~[)þ;ðù‹×^ ²ŠÚÈý\‡ÀÎÄ8FÕ6ÂS i®(D&YæR§|0ç Øvàˆ]óò©‘„¶tøÉ'wî=|øÍ矞“b«3ü.¼‰Õs¬‡-}#•££;fªH“ì$«•± ÄÐ@¯Lè­hbHÛz­w•L&(×ê®Lø‹8åã¾ôò $?xðàÿøƒ?ø¿þð¿ýö‰HôÓ/¾¯<øØ;ÓB§Ï¾‹æÛ91¢FÍØ}<ÿòÅ3"U’ô9ª»¨ÍÀÿ`BsüÕ 8f¾Ýyô—/Û*çKO6yڜԎàÜÕª2!¯–[@@[Фeî-.`NMÌžÙšt’mGûÌVN»·S†ð,Š›8¥EM¤˜ùÒ5@|ºO†]Fóº¥J†öyòA£¨nñ@bÑb¢˜>ÞÇ+„G4rVØ©.Cá"zõ,[ -Ú¢°ŠB¬á•†€uÕ䤗FÜp‹û¨Pk¼m™s”<”Ò«¨²¦^Ï1†`îVgæ6ó\ÚUsÊÛ7¡Øôý•™Î&[îˆ5B‹‹ÃíMPfF:hôh;à“pÚ¹ÜЄ˜‡Ñ­ÃÚvµFåšSÁ ·Æ$s¡0cÈegÂY9UŒ.™¦ùÍÛWfrm øË?ûmªûGÿä¿|þJ0û‰Å C(ãKê6ÀäTô{] ,ÚAcÈI 8³XÙ1/ÞWÊ-‹Ñ?¾7$Å¢)¯b‹ª)1Ϊ9< Q´A†>¸=pÅ@2uLJgñ¶8xUÁ*ƒÜ4l=}›GÒ.Ü“ ʦÖÊ]y\ž.'¥Ò˜_™*b‹2€¨µŠç©Ʋ=ÂòáXÐhh\[&®2á"+w½÷>°Ó@´¨ëBbÛR§““®Eöú|@`rÄ—((asn dX'ÄÄ΃ `òB¬rfqPäp£®]sJ*Vz^XS2½˜V“ƒdùxâZ%©¯1½˜Ð fʶ½Òø§Öç1øªhú” aiÕJçy·Áv/óá£Åð4 ÑYhzåsô$hּѣ1|‹’Ô†°  -ŒWô/†Û¾²TkWÚŠLh"Ÿºh®†ÆïÉÔ"ý‡–e4A±è¿HB Û½3¦m bõMQú5f"bkù°È>‡ƒ& §0º ¿àCuû ШU"ÞÒLœ1"" 0 tnWU™™HîN΋ckIv {ê"dN+9[Š»BÁ€2@/CX6g®-ñ›V  m’S¯!nß`fÔÀ#|ƒXûn©Õ¬<ÀÎ_Y­„_ýŒ$ Û gÜÒ¿1À£¦¸rž( _¤QLÐŒ¢)ÇŸý蟫ä™úžÁujæž_ å)Kluæ‚€*6rÊ…\oM+9Di,C;oO à•¤c\ÙˆÂmLËŽšÐÂìrbEéì„ø”#+Zš!Y»ð0|™­×$£ãl ]ómáÔþ¢7óDn¿ ¯_½ûìÓÏž2o¬¿î¾C¤š·Ï+Æx†Ç \æ×-u¤ü&§þŽ-,@1ùË–õ{ËдèoÑð %mùvf‡ùѤæ˜Óۺ؋ó£3:¡ÌróÏÒܦ7!­¿ƒ‰Š ¸]ä+pä¢Ô­§„ófžF¸E'y„O.é,(X-|ñÂk"ïÞó¶Î#ýÉ¿ù?ÿ%oݳڃ€Õ1uyXFÍo,XÌ4R—Æ+­ÀyÚÊ{jN¦ŠÈ\dž&ÝȘûk”Â5å~6‘$Ö_öÆåq›€¦‰V{q˜RÉÅ@ùÈ\VÀ…™Ú…” íw––X?&M¾¥¼(‡bgl¤2÷R(üÊQ@E¸L#‡~±Ë|€RFIå!ã×U|> Sô>+RÌ$Þ9_¥Aˆ\DS©âxÒ°Ã/×WÍSr–Š­+YMÚMC ßï»"®ÌMëR~5Ç0‡CQ· äE…5›Kκè+ ÖöËÂòyÓ*mõmK%<Ç#~ÌL|0"P`.“Âð‰¤°W„ú¦‰E‚éOÞRoˆEæøY*— PªÒeÜ,),ó#–§šX°òÕ”Ò²hÎp&tÃDEž„–¦‰¾øæ À|™¢9DÑù€+Àù#ÛàYØÊ|dj@çOWxVþP¾“€xB-ó }bÄ<}GÞëÇk¨v÷µ¶˜Z;ìkYç-“}zJ ¡DÛyй<% |S¬Ö[¥»B:/®)¬"òaèZEÕ®Z¥V}èÒ©-¹ÅÍ‹áXáLJzÃé%›°WÞ¯¿ ޏ­1 d„hˆ¬ßæ–óB¸j¢’ ©êó w`öiÄa'&¡Ò ·úÍ-ö²ÂÐ ”õTÚh)ÂéåÖüv/þÞ$²aNb¨Büðˆôµg`©ˆX/xt9mÐå DðWfTô(Áë­¦GÊ/Nª/LÅ\ÑøP›eב±’‘7Þ{«Ãm<5•9<¢:†;çï}z¯ÓØ{ÍŽæOîݽƒ4›lùCØôÔ²Taÿ9-¬‰)»)íƒ5ïcøÐV…A†³£¥‰Ç¶õÛd;C;Õ·‰ÙéÌÆDÙóÅÙæÖÖÌéb“èØÙ—/ÅyüxÝ · +¨»"¾mÔG@½|ùúömÇ’i 7²äI³1Ïø@‹qÝZÄ1u=ÍÏ|Sb33ÎYS jJ"DæïU‘«(êÆ­[tM€(,dTk|……¬º!*!r%GB¹#6eÄ‚~qf«(¯·Äɱ Ÿ)¼IBd«ÙQ¿7ÆÒ7êfÜAÄ¢ZÄ¿Ð[*4¥Ó@lˆ…]šFiüê4¹'ÍA’=s1EÚ£'[Xxºú¸ÐÅÞ`M·nÞ+¼Ü`kš ¦ö}L3¢åÓÌïà°6õƒoèïÙz¡¾ÏÂ;J€faK#K ºäZî G¨|S[k[âàÈxF)¡4 )ŠÒ¤Z1tÐÖâ‰é‡²ô‰_Ù>º!§0¢\ò—~™,Î@¹]Öy$¡9åð‹ü1 ÄYwæ/„ÌhB\ŠsJŒ·‘Z·!0ä§šƒ³ ûWÇ@ƒHeN¯Ec*î1]y$‚ÏÜêÔPÑ„ÈXd•øŒ“7—.{ïòÃÏþú/ùW~ø“ñmÐ9  r”È4¾Oܵ”‚/ô|Ì·ÖuÍ¥%#}Î¥b©V#œÁ¢ ±j®%…? +SέÈs˜}Ǻ¦ñÆŠW©K¬¹^WÄIU·!Ø.>ğЮêûHœÈȺ-ØÌ$á%è\ÙÁ_äl§Õ`™na«ÆÀzÚò«-å]ß°”fáoöN‹PP¦JO£åJ²÷ˆ›>~!hhÛZ8›9z|îW_Žê YÓ <ߎ@¤5jÜ0XëÊ ðjNº1«.uĵ„”˜·&™à2ªZe>êºÜÊêŠHä4Á¥цº‡>˜Œ:h@o½ã¤é²þaÍ­¾XÕÔi«.°†fÛƒÄDJy$ªå×¥Ñ3KѲü8žª5¿*5n¡*rÄÛôJ>Hº”ÂxF³Ü ÖÐϦ@s%SžšS Etµ6x²´uü¢ƒ~¬Ñsꃼ¼¬%È– ˆtûØÛ ¶F7òʨ¡`dHÁÉ ‡PþöoòÍ7ø¯¿}õÕ—¿ô‹¿Huºvu^ùäº#Ê€½{÷žÈnf•|ù\‹†úZÛth#Ÿ>ŠuÎÙ댘s€†µ¼ÛGξJ>8!EѨºôWÈ£šu"/ž{ƒ,-.R&ePÍ¥RqØÂü g­;D#>k‡ê´+à£W9>áÉ7rŠÛsêãömyæUãç.:¬á%ò®éF§©ú#/V½ŠnFHjWðîµ¢µð‡Õ,pé#ÝÍŸÐIº ø7é-X4ß3T4d¹}ûd3Iè%<™¨Ã•QNC:}µÎËj3ðª¾PÒeƒXä}f\P4 Ð¢úð­kÓ½•dßw¾Ú½ÿå)FÚû„Ìk׎ÀP5«˜Ó¡x(SJ¾Ú2u"\»øPC¶…èÖUÑ ¡÷öj :*Ë×Ó©Ä„–o{ë°¢æê†y©âm=MNáÑ2Á“KÉó¥-¾T…‘ iâ¹Å‚3%–. hš_>k<ä)n°_hƒLúQÝZƒïˆ[8>Œ:”×Äþ¦üBoËË ?} ÏJe;KbºŠlzF¢¸\s˜ÅPRÈ.9Ç’»œÕ´©F'"Ô-'*fÛYÎuïn-­h¯#”Áe4WáI[+Q4“auÁšào„®‰ŒþýþªÏ[øäƒX–ªó˘?ô†Pbu.­º_J2r©öê4GF¸çJ¦Ð£#¡î{uؤÌìfâŠx0¬ lqñg`c»HˆFÙSãLN=©ZL4–\gÀ Ýd1—|„«âw§ˆu« XI,ÚÉYrÎ «+LÔQ³‘cÈÅ®zÊ\1[Ñê:-Ť=u ”’‹â‰‹>+cŽ~bHçù)læ·¨±Šõv‹¼_à³.Ò2#îc[,¨øðñ«A¹µ¢Ë) <—/g/ÀùJËô« 8.¼ü±5™¡>ŸîÌH̯ZWÀ”y*ì…-_•vÂþ»iÃ[~ ÂZZSª¼E³í)¬pcø6rAQ:?³8Š) H’™±7þŒc™M&³OXcxJ 8›¬OWgv£“ÞlbB ¼û-„}æàivKC•™ØÈ/hà;aóÉ·O¾üòçöw{ ¦bä´!)ʨ1Kc%<1•rÂ)É”c‘ùT&'‰Ó(@v#÷Ø…±þ&Q °è¹ë`M²P•‘ kk¿œØë!@U$Ô5ñ¬!-Žj5„ÿH¿­â”ßÂÊ Aצ¢æ"$›;X=œ"¤í'*Õ©Z|&®“BQú3òýmÓ#0߉"¨1±z´¬ Ñ'ÜxK³˜ƒ€œƒ 0i vFuýª}ñ7ÿÙ?Í0<#lÆ'±€W@¥šV¼¿®·¼zeü).w0ÀOQj…Û\òLTý²hTº·²K•=ÖÙÒBܧºüä)+›o ïÙþBw…"ó÷¾GvÅ·7Ìv>±âxO}‡d fæh[£Ïž<Æv6/Ñ[JÎ88òiæÛ^Ì¿}箞cxn+÷óG¿zû¶O>9ÇÅ1HÖåÌ12r}Η?û‰®çûßûÞÃo™ñtÊ"Jáé…Œ9ˆÈô‰±×^ÛÚÅ`/½6;Úã#94µnuùûºiz ˜®„>_´ñö»×Úeù®¦ýü×ÇjœÈå½×°Ò„`Ù¬Š×#Ù¦7À¼%I†´NDÊìyGø8Úw"nJé@ÛD°ECMna 묕gŽG›óV#Æ…&¥ñEš¬L¬ç(47î<ÿÞ©ŒçŽHF'à¸v­ƒÇnÞºæø"6©º‰}¤·'¯ß<"V4ê¼öE=2Ù²)@:D©Æ ,ÎæzLrŽÖ"ä/;ç²€²·.¨!Y2+‹-PôúÕ æ7˼¬w•‘b²½·òæÄÁ»LV8 góÂ2Õ£–¹‹ÑŠ™8ë4꡹±Sï·Ò´œãmXŒmôÊœœùu Ròé&#v&‡­ûX9Áy£Ãb,#¨™˜›p­ÈÛ Ÿynæ´}}Š?)l¢Æ8jΧ»u'õнDBXï¼ÕÜa¶ÆŠÆ (í5Ìs¤Yè ª,µ¡K‹ÆZDŽlýŸT!„å©èüýºÀñ¶ÚU’p‹‰¼Þ8=GÌÏ ëÝçéó4Ê÷ú‹'U_¹,^]?HñLg®ÚÛ¾A80'LNÑáÍ|Ntø`²\´nÃ"¨õÍ2 Öi)üé¼O…2£rCÕ¿üó?µCø‹ïÿà‹ÔÎ>-T¸ IôJöö0W`ñ— wË™>´mc5¹ŒíjWˤ‚3l!Ù+VÖSô / Íloc?øƒœì¥O|ækz;Æ­?뛸Tþ<%ÛЃ³üT2®*j©9ÿä.~SOEä5Ä)h:+ɤ/þg)˜š’T“OptscÎ¥Bζ°yà¼]m‹*L$DKÒ9• &:ásõ\ óÇ‚ŒÂKggL¿%f c™ðº°q™‹Â}rÑ(àȉâÛjcl¨É& šmY€*)ƒœa,2cÆ>•ièûüÙ šŒ¼4¢$¹ë¦¢¼bK©šJá!¨V~ñtúJ».ð`…D… gŒD (†'ŠÜ‚Što" öˆIß’{ÚgœÏq>¶ ΊÑ=€DæÊ8Ñíøåqæù®˜~2›ƒž’}¯¢íÛ½$NuÙ 7¯÷Rì:Ü|¡}f2D!Ó]Ž/ªG¨!6Úäj\¯.µ4wì¼gŽTˆ gð“˯gŠW7Lûñ7-}½ûîµþL×Rw÷žC¼ì<`ZLÕûW´Ã'>ë„9‚ 'œùùó·Žn¡ƒ"XÒAøƒèùO³  ]…?yÀÐëPp–¦N6‡ö|ê°E:Ä^uÇXГ×^EyõÒQ¾DAøÅ¦ã^“ÔŸÛLÐ}ã‹|uëY4ð㙸NQ†Wªk¶ÚuvàÁ¯íí)œ5±A©ñ äýŸ%а«-.â‡ö^Øê)>8~óZŽrô·6¬ø¢-ás4¤kÌJŠåÀœñR½Žên¡¡Ó– sež’àºàOŒ ñ­½Y7º”Uu ù.V­ÛL3A‚8UvšlÆéW¾ÙiùÂ|ßãtM\=ÁPÈŒ&ôÁšO è‡}b´“O‚ƒ|Lvz€¡·Ç ÎÐãé>°aÜs)Ù¡Ý…‹}ø¥µð¸]݆ t¿‚Qøãû¡Æ>ý^°8C‘LmEíŽ+©b¸ue&â¶¿ÊÈ¥TÌP1fæv\|5šæ«Õ+,…zAS†‘uá/íŠVøEé4W Uƒ çtÇv}¥B3=ƒ$%CtBiùpv¦˜ŸJZ>ĸlOÇÜ:«„£Šà©ë@c-OXSÂíp*és¼š«¥~¼Á0À€»UO›ìž-*‘%ök=ML?û´£T-e]dÁ…Äy\ÊS¼xþ\€î¬×çþâé“Û÷?›ÉnËÍm½‚ÛrO‡•d.þ|„iKœoç}p-*8ÜÞóêÕ÷¶,P‚¡* hšÔ8D,æÇý’¿„©JÔærIyµRÌh( ¹ ØÛ-î¡mEBÓ¨ËmìÙ¡ÚÒªl­mK~ãŠV½Y^¯ýºSRв~‚"j&ÿÒ.$ÊŸbYÐ&ÔåuýºÆÖÐQ¯™¢vNQötPb$8^¸~¾Dw´M$4ÆEê*¼À÷?±Ç“q;MßÒ£argqÕÞ„ ËUܺ4ºØÊßôè'ÛÑ"n⨵!äë€ZOÇ%bÕzœ?ôS¸QÔ 7m(0ø˜N6cT°ÊCÆßØoÞU¾Í åöHa _ A™BÌš?@·µÈ7NT×­–Tì&º@ Ó®8Ãíi“vûÅmÛN€õRTN/ 2œFQuM5?#>¢™y†¼ôñ͇™{TEŠ«E‚vf£êiι_?üúóÏ>Õ‹A̘Ž`ð‰OŠ£¢È¾Ñb .€à/®‚ÕϾüR[&à†!\âòVa­‡Þa"–L»`3n³Ð?¢Çk)£: Ü~DæYeçTW Úª—GA±U¾€ç›þO£Ù€äàÝ ­BAÏr16.B.1CeùJ†ß\ò©€_­‡[Ø™ú1"u®²<ûñ¨é“\(œ™ˆöYÁM•4úÛªIÁrpG.Øš–)[\ÙVG2Ó¹Ò=r*’¢ç‹îÀJïX— uÊ.fR{n¥ €\*€ÚØ+•)ݪ6"l ŠºÑ;&¬.ˆìø‰[ϧ$W9X/€›‰œ}Uãõ‰7Ô„½”‡ÒiZd‘NyA˜bC¥7o‰yÅúÆpB~ÌÂS ä0MyõÃÔÀà#qšÒd«Oå3!b7éþLêö%••TÅÑ )÷¹Ž‰ÃCƒTûCb‹ù .€Ãú7 G_g— Ã¥ü Ä@ Á7}ÝÓDôëWΉIÃ1(ÁG'4,U„†µÒŒd³­´8Y·°å[T£É`ÍŸ«ò“°dsm>¥¢}ÐNÉ©Þç±òb*< ¶ps¢‡Išó3AEY&ßKÚr"|Vxµ7ÖA æ°dO sŠIMŽ—eŠŒY«À@³E:(C/$ÅÓåç÷‡vMÐøðÔŠ`Úbh¤°b´T nI.mŸ¯œb’Ut«@um;›®@¾ÛrºZÛ"zexÂ`§`Õ‹ó‚SÛø¼—ƒ6¡HR  Ž7nsë¿+8¿X P§¢W©³“!<©]i±4f–¡¯LÕÖé5DÅ0¡4î©Q ç°Å=|–ÉTÒå_m Wµßþ‚Ü„†ÏÌB9 ¡@ÇV 7z:dV %C;”F÷¦Ñˆ­#Å\ùv¹ñUxaDkä¹Ï^ÿóϾùê'¯Ž_|úÙ÷Ö®ZŸ¥@OH»4½9@›©&(­Œi€e²t.¨Î¸Þt¨"ge1ØÒ={PŠ•wÑ“)K¸[µ} •DãTñëiÉŒ¥Gõ=*n>l•ͬ–§~AX|ü¢pò¦ºÅ‡f›@§¶›Ô/Zö “zù S#¥NC7Ð\©Ó öQ`O/!SO?%À¬1%l©À w–PVhgÅ0Ó-àÒº’Èœ†Ò ÀTʯjÑ[·Ê¸”Ÿž"†{$Gu—44ýªÕY*sÉß&TŸ§X=…O_o¬xKN ”?ŽW™úf-s¯’í¸´VðÀ¢Š9WÕ4eV>:~­·KïÀðµNÙšl_LXÂÃ1ÑØL`7¦:0ç|Röž²è}Iƒ¶ÈÙÊèP`ÈšðˆÌëô) C!óƒìB/¼àæÅó¥>Sqã&³aF†âh0Y;jó[3i-¾ãÌ¢Aªš~ðà+­X®‡÷n^3ÿ?ƒÃy‹ª.í¢b\w1TY1Á‰Å¨¸§.µpÕ…WôP10Õ³vW¨½†é_’¯N^À®0VÀô\›Ö"ËäÈi#¼v‡WiG*JñÞ4|h•5A”„¹&ìC!ð´FC"kQWp°!,n]kFåaŽ{û( n”aG„y\k6(ºVÂa%z=}’9³AªJsUøÝñÛ JÂŒ´j¾è8 C6<à„eÒK<}åÝÅŠ:Kö¡Q¬.%lVØ”›±nµ7F›æ–‚vÌZÞÇS¨, W½Ûö êÞjb™ ·3ú5„ n•¤Ð¼§K‘Ncîe´÷öHM/_Ý€QoÑχŸÞ½§º¥)èCèöl4ò±#³=ß|óÍ ¦#Ê.»´r÷Þ=S&ÚÒCúÐ51Ä¡cÓÓŽ…ä qÉòœWõ:Ò{~¦!1cE/!Èj d–ÏLÏò³\ ðÄ"™˜ã–Ù…;µ”a ZFlNòÙ·ßÝ9ÂŒ×PÎj ÏÛÝ…íéHº%r׸§ºpÆÂî5”ÆÏ8I1X‹$h'lcl“ÓBCF?Oh\ÐáÝåšðΠ±a’ˆS}0o¸ PcŸ¶'ÛwP¢M"ö‰k»Ô_™k6(×ÀAŠhϽ~¥î4›øÕ4TýîÔîvÛÚ&"“µPŠíAY´á <3 1ÔÄíÎã·OwŸ=ïKõhTŒÆï“£ÕÙoÌb®,T¤¬!—ªÃA üà YjKoìÂ÷¹ä+ ò¬èµî¹¨¥M˜›W—ß`ÈòêUßó:Ä"esCçÚñ=ñÖÒ;H Îøi¤‰‚|† ½ŒZæ€ÈaO<ÇÁµºA ðqpìŸh‰o0ajr´ r¡xÊï¥Eܨ*ušA°_3›z|]tSûMÑÒ (¼| âØ>‰å‰§…Ž3¡ëµÌ–'>iÕÉÚ®¹ÉÝ»sôgÿ÷ýÍ_ýå?þ'ÿÙ›w¬œr@gþJ+ë Lc0TÀ­‹eR*“m* 89n±%MÏëwqÞœQô,_ý²Èå êÇqaö˸&ÀšZ‡°ƒÞëÜá°¨jJ°u«u·›#S-™àK¸•öëv |ÈñÌ k0Œ±Åu³Ÿ]ûCl`QùÊ,´ ¦K3ËðY«Gn•¼ò‰ó2ê~¤™×ªPšVÒm¿µ8Äüëv1òèÙ:%ÜUå §‚’2µ²Eå†ÜúË…3œ\Æ4ÝÁ6±p4Á$A>ktù3l¬Hèò©ñAÏå û§ò‹–Pgºz*ê2[¨:ßİì¤`¾«6 5m“ÀØ6®Ì›¿{\ÖàXõ¥Žù"P1zžÔڭ̽g,zÆGåãp •M·Pþ™eH—¾ëE™°l[Ò r‚«à³cNUˆŒ7œ˜ÞÐdV„œ|÷àá×wïÝ‘°J£ ¼ÿ¨Èó·|8¶˜Á›)*ߢï–ðãœäàÅÝwÍ3 “÷®cê4] °Kw&á©_‚'(œŽ@”Q}{ÅÜbçSePó+ß[M…‚Ð|n¸©œ ²G© ¿§ Ð\5Tñ9Ü6ðîS~ºÔ4{hä7€íÕ“ap/ÊÀg¹ü}ˆEF)dŸŠ sMø]QjÂ#ÕYa1TãC9¼bFZd£…afæ0³ÃÔƒ‡fÉwþò*Ñòãý¸J·fÖăniÙ(‘¹ae]5´ñã9kœðl hVçÄ ‚¤™ ™5ÛBÀz®ÑàeF²{²€£6/ó÷¢¤Õ}bQÆtE2 kÌ&‘âwª&‹à&Ä)fO3d*f´;‹·D<~çœÏÎ^çjuù:–ƒ ¶‰Þ y[ßK1LȲ!³­ªw⥋<Ř#£ø›ëh¼¯èUhìª'Ó"KÆ+yª¢ ­O·`…:þéAñúBµZ€hZIðä¸UM a²|1ƒ–ÄRÏŸ=ýìÓû¨ÑZ º4êÝv:™ÖLuì 4¿ø†.´+³ šªÍLïâmÒʇÌü¶¿>y‰·ä Èx[Pàæƒ`䢤þÛ˜íÍ›ÎË€Øn$S6ìÂ@î£5Dg¸j¼Uï³kmbSÆ|Ãt™«Çƒb«œ$ØÎú^‘£PX¡º_]Xd© òÅ•2É4”ƒJ·ô$nt©ÚÿÉ·#y¬dÕá->§?.Ãòò•Á Ápo§ºJ©wSbãûp&/˜ Ó~N»Ñe=Å/”c© v¦-n¯ç»]㿊à‡ÛŠJ‡îy›V]:áFöÊÈL/Ž6íÒm_¼àÞüôßÿüËŸýWÿÍûâøÄ&÷‰JÃ( iqx j‰…| ¨‘1ƒ§ËÞ¡±kVÖrejQy¿gi—ÕJÒ£Ø=E¨6飊`Rެj¯ä”YÃtm8ðà,¶[x˜ õ gÿ´µn‡%9Iuõâ`â…ÀQ:IP~4££”_|Ø*•^´ÙÆ íJÛ´´K™tnúNeæéÆjqXPÊoIOeºdî£á2µ‹3Êl`yA¤À½"ª¶Yµóšq-(@@P}®c”ä,2ŠMN:©Œ[¢ÙÑNâv¦vÛÚê§Uq)ω«ž|û-#ªŸûôÓ Ùc¬ò®ÕyÇΑ9sö'„Ì(vœ¤L~“f=s}ò/ç"|À¢B6ƒe©=ƒãˆµ IU<|÷Þ*É3_Ò9>f$rõºÓPmuŠ ¹L#{@VC£AU×ôªL—r¸å ÿµ.í—UÓKÀMÅA²îæ-‡‘ªâB‹95&£©ÌÂÁµw?-ÑÁ¥†(7Zp€Gs«´îMgÃPœ).û(uöã•¶ÅìØ:oÃr>çÝë7ÃT¤vVÊUw ^NÄg}Ât¤àþõ×_³j'WnOl³ÏV¯Þµ’•Ë3º}ß6I²vK¥!Ï{° ûC¿zð%¤¼Õ{4vg&ÊÔ í‚ hÔu”Mç Rµ$;…Ë¿OÔ¢N˜6¢hŒ®bðk²Ý ªÌèlTD‘V%4¤hÞ`Ý0¤î{±·I&fÅÔÄF øÔ cÜä€Äš2ýÖ÷@Ð`M˜È#\¢Pj¬•𻽣ËùÊz>ólYl'µ) ¼^ϟѹ6Á;˜‚³¾|Àá†Rz¨•¡ðíÛâ€X8ÿBZ¾(R}QÂÆ{Òhja;°WóÞ¾ùóÿçm4ùÁ¯üšïû™Ü59Wáñ‰ AzëÁE"VCÊÔl,ÍúÆïëø1¡WÆ&(‰prôT1í*/íRWàêæÓf,ë©òá:$P œMš¸>iå¯'ƒ@B­[)/±÷Uƈé­ô’ ü·ªœ]ªÀa:¢Qײå鎭'½’iÈm0Ù)ÜÐ¥%8ûu«?VÛ§g ¨¾ü±ò>-vŽ`J6[f×´ò‹¶›X˜giø»<]Š$¶Šºòsêûqcz² ÃJþÏØòôõª,>íÅ¡9ƒ+­ò¯ß<çÛzÓÈŸRa̯T‘ùt á’É”­ÓÇU9ƒEÁœ\·c1‡ò@qSª(ÃA²¸Mëõq®Ýè3©xÉ…a¬2Z„yD9úgãЭ,Vš| Z0dÀ&QÊC• ÑÅWÇ¶Ž´¡ƒc_sçq»É{“»«oT>c§tjBÏñ¥ w x¸GÄ*[´Up -àëÌauÁǸ˜=;Wh–ÛŸÊmÒgßÌ5#µKÂ0Ñë _µž°q˜ÇY샒>N1$È!‹—µ>Àêq‡ÞÃâ º cv¯BÊq)¬ºG Ku ËïþÔõIã³’ò!àRÆ P …Ñš6þW@]‚¯ÛÅNÉ”„–{Ë[Ϩ:Ä\@ØÎ0@“éõ¨v¨Õ¡æ6ZÕ¨§0”¿­#T òõìji½8>› ·„ h“eù5`ÕÌȦޢºbìoÿ¶ƒF]µ5Mdð¸ÉÇ¥óì¯y^fËLe¼€V§pŽLbÝh¾È„Ÿêm7Ä3͉‘@ˆãn+¦Iå;®ðpÎçsaÅÀ¸ ¿§^U¦4ˆ»A¶ºˆ$]þ:>@zTG~NÇN ° àÝ¿°Æ&qå“Ü»fŒ/zÍð«¯údáøKo¼ ñÝ›#Ñ̳Bg²“Ö¡Q߇OðZ‘«÷Çô=Ïž?RŒ mK*&ÇPëÒg·8 Á[ôdÄ!«Ý²1„PkkgálŒZîIÙ` |0Tüô(“ ‡ôL{6,F@ÀñxDhÛŠòÒ3,ŽŸEÜ€¾ ‡Ä19Û BÇ\r.Ó7ÕŸÁ§VÆCEÕŒ(ÚðuÃ:%yö»æêüô³ IDAT¤!±%°lð_Týzª!$HLš4WoÇšÁŠÎÖºÎa:ÂÐ6’ã¤<Íúu»-J”Šsñ¾^e¿ãË—ÿû¿þ_ÿÃßøõ›·ï}öý_œ7 WW%\à€ìWZå@ ’Ò2Aõ;´‡$sÁ ¨ÓVQx+Ê–Ü0$x+ G1DTÌáLŒ¢$¨‹º&5$«r÷ŽîïCVw«R£ºãÓÜvѲ*[ Úò«ÂI:þb\½ ׿i6e›ö¨‘ñ[ç¨ý˜c$mfLhð—€gG²r¸À]ÒØ‚ø}DN-RŒ˜_´"^&ø]Üö@—ôÙm Æ!ËQwó'>¢:òºþãìiž|˜¬i×Ä…-¤(ïÖ/lyã#-º•Iv†Ê¬˜§š½qÅRàxê‘bìEm*/oÄcT àý¸bOVYÏœ_5–ƒ‘Ì8?ë¶"œ!,E˜fJþxòN}ÚUu=…LN gèU+õwàß$«&±¸áVWOBé ½^`©íbj@¹ÆIc(Jä4‘Ÿ„WD„w­ˆJ0güØ÷lüš Þk…T©"gÃq›^F*\%=!¢9ì>¾ÐZŽ$å»ÂyzT·aæj!Lpyõ¹0¦‹®ÃR…X%üÂpÐ^ñæ«áµÝ–§K\ò WqQEðAP`UH¾±ù„ESk#ú\rPf/%ᣤº+}Â5„^{rÓe ËÑ‹!‰Ônݼ‰Au¾XÜ4pv çe°0ó"¾i[ÏàÀ±n:©¬`†ýÀé7& SÛúÂÿðßÿwKáBј'qa¦ÈNÞµcšÆ°hèx¨Ï¼‘*š÷yb Ö 1ì9t|BVL•ÔA‰&HŽZ­||Q>Qe𘵧„å4i`«hÛƒ’  ËIÒyt¸ ÐfŸGKXuçÖÜèÇ­£Û1³áH¯%›{þâ™s¡þzE{áO^¥²ÄÀt}0YN%…X¯°Rôù˜±¥C2}`ìbîT-A› Ä»Fõd/ݾ‡'Îz(éȨ¬•ºv"ƒÿ*Á0¤×ÄÒð(rŒ&Ah˜.d› 3 ÜaÆb—•´$\ó}p\N2xeiۼɲHaô†Ð¾qÓÐäðÅ™GƒƒFý*ŒŸ*J(VÔÉÈN eº¶— þðAþ°ŽÑ;QÍœ^ |²oÀõ—óT!Iñë‹c/´Š±ýÂ1å®ÒÉñË¿ø‹¿ÀjÎÚåÆ-"½~ãêñ‹—Í¿ÎmG](3º~þùñ ô –àIÛª\8ç¬T; Šœš¿I˜Ü»&†‹KtÿЃד[›ÅJlìåí¶Eæ2‰nšÃ>j9“æxXÞIZ2¤€Ì°‘+¡™b}u !Q7ņ ß§ºPÜp|®"™²¸- `¶Dçà¨>¿@ôµA¬sö p+/$p"Ò¬ƒ»Q1E=íS¥]ªÀPóoµ;*2ü$±@6 õ…¯ú¶%á4^mĆŸÂG<ö^öjBRøYýXWX³:°¦ª 1†'ߥxBo]\àÙG`é *ó1m€f8ò݇ ¾úòñƒŸýð—~pt÷óËFå>0:S@)ã‚§F±+”FµV¶€Â,Ú;ãùÅqh|bnjf,@ü*¿›Uï·Í]ÁS£˜àÊ`#lgÎRB»4³îðây¶ Œ ~cæÌ‚«[¿.ð]0LÇ•B*ìX#ŠM»u©¢ð P[± 2"S㽕‰ŠÌ–W}õºÌ… ³™;tyK™À«"«7hþŽ€ ¨ˆCA ä†-ã¡AÓ`‚.Ï&±6S Kž‹`V2“ýiÊ— ¼¸ J( wýUó¤8ÄÈGInS|ÑH¶ ëw«G°aÓTñ:”ÄÀ/ú§Ý,MèV FÐÒ.dœ÷öËNS¦€“äcÓóçOõ˜LïW'‡Ÿí寢wÙnݼµjÁ²z[e>`D¼¸À)›N Cá<¬hû·=†á_h›XR8gÖLÁk3Ø6­ˆ¡­ñöC³r3Xà{+T·’b$E?ùÉOlÞZÍ0*2ó­$Jé Ç=¬–=˜¤KªC¾~9nø§Ì²:öÍðb³ ­¾Ñp@VM HnWXgÚ(Gueä`¸êàøÔÊ5l›GGØh5ÃÔºþE¯­WÂdTÛ ï4js‹„×!^‡Å¢züâ£ä‡wœÀ»]½Ò¢2ÐðXB)|¡Ëñá#ï¡‚ÚÁɈ=ÂÏëáÄÁñˆ ( ¥‹ÿò÷~ H禣;1dÒFß” µPÓRíÙžÙ í×LìØŠ‹Ë×ÊW;ÓÂ;E-OˆÕ00®–lÂOù…Ö 1޹jí<ÕdJ!ÌoîÏyÍMX}¸qùÊœíÔ{3Í6\']p¿(q —`Žegw}ðßÛu,q½'Æ"Ô ^ÄvåÊÑ­;3•FJ—„ñöµ“ÂO{é×û„ó‰TŸ˜*Š‹Ç/Ôº çŸýìož<ùúÆ ïZ*m2Æ¢‰tc**.K|æX”ÛwocHêyAˆnŒÔ“9:%¢µhìµoQ¿<ºyÝQ`´‰ßÁ#nÉ~‚)€(Ì]]•úöÙ·Þ¥v=4n…½)`ä¦oùôáu–Çq“I¦ß:ÉÌ ƒž·¹"å¹BÝ,¥Å²µ4 g3Á³5‡|áWº\3zûÐf ÖÎ*!¾ÔÀ—ƒM޶¼¬‡fêrßݺ~]›^úyîÌÃñ†Èô‡¯·éµþ!(Ž˜í3ê&“éþ'@[Ä/øc†^ä6Q˜Ô¼’ t›¯ @¿ø2¼pÁ'ú£Xòjù8¿ƒ„Æ´d)”>ï…_¼åIZ)£U„÷ùKïÏ}çt¡ûÿî?ùG¿þù~U‡páÃù×o”©[á \Î8Ç?™QhãþY¶N{0Ÿî‘ø•øùNœÄ#3½Al}9$Ïkä’žÃ^=’2%í͉Ýmf}¿ Õ.Ί•ˆwMtE&rS&3X–bœ\b¬•·ùœ7¯Ž¯^·àÒÄÆVÑ:d²‹FÍ £wÑu²š™Öl± 6NpS“Þá·±†U´×F ]†°‘k†×wâÔÒñà†#J»$ O›j¨Ã4”©—¼B⸙'îõŠ<„YF`а!A W«®!»i_pѹ‘hzŸcwyŠ12ü˦p S]t%>ÖÍø¤’P1ëS¦•(÷Ú¿ø¹©ˆKì:‰œNk‘‚L¤ú›ðˆ€‚ïB#8fŽE2‘Š|\`ày9Ÿ6ž¼²"Q÷•h ›tOµf¸‹9ôÁÖ\žáº³—tUâ½Ä©k/B½xøõ¯r³_®O䇳¤ŽŒA]‚¥À’ñºz]ˆõçëuØTÈFÛNèŸqÞ™ÂÆn#F~Þâ]ç6ž$¬‹N&ºmszÍyˆÛ½2‚~‚‘ây±Gjg`ðöÆ5“I ö¼&”òFTBï";µ(ªœ¾È…àÞ÷¿Ü»u}„ þ»ìˆÝ‹} \ 1¨AÊŒHfª+Ä÷ÐA µs¡ÑÈòœß [úÓz® Ê'GÚNˆ„2éÜ£˜¯~:/A?íC‡Yo©3ËÓcH©ŒnÚl€ÚiÀlãÀ’ž>ý¶ö J8nT‡®¿æà,¿VúÆW鉵Nn¡ïù¾>qn1AÉPo©.ÿYDŸ¹Q”3¨½!žËÜÚ! Ž<Ñk7:דˆÿú¯þJ…¶ù:ë·þù?¥¦¨BdÚgã‘!á’æ7“]ñHô@ÉàAx” ‡•Lu`AÜøüãLu´n5®6o ”«Úçç–™;!ú¸–ž­UP—)+5%]32 ,E áÔëÀ1"dÒÊ4ËÊç€cý>ÂdÁâ'à°U)8,_9\ˆæ®9xº¦vÈ &;%S™y…P-’N:½œÅùQ™fàa8Kcì 4·œ”Ø4…&J¤À- ¸:®½ÈõNûyÞ¿¿{ï¾bÏž>³µ¼·Þjˆ*Ø‹ý¦ÍiêÑÑ]ô" |üÁ=iÇTœæÚøo4pñ¼(L }Îë„/ ÇÁôäÖ;·¤ ùu.>w`*s)FL'ä†z¯D© [&.H¸X8ÆÐrVF=ÞçÙšÊI£ùE,. Üh”¨}êÖ©µÜ€‰Lª…]Ü7ш§ÐÃ4ʃo«Š¥º ¼}{óF¯>¸L›ÄEßù†¹29í¼¶À­h8£ ´¾òì’q $Hð‡¼G©´kΡ1e6(¾» 0Ô7Ldƒ¢å]Qf_õv JúU2¥êÉ:€|J3^4>"e²Åö*¹”œÌ±Ó2²Êm;‡fõgÄ—k« %][Ø­~‚$‘ì)˜9ˆÒ ‡jž÷èèOÿÍŸ~þ½›G÷¾N‰ÜDƒ¿,fXOœ˜?S‡ü«¤ "ÂíÝ /4§]ž”u@˜báž×P ”!‹¡p%=¬Ô3ti©}3—ØEæJKÇ ú¸ÃEêÿÓ«Ký‡°‚û™í£Þ*®ž®:È(ò áÒáu‰“™ ô4F"Ø_3‚Љ–PáKê2ï#ë¹B98sÖÖ¦ÔJ¹Ñ?M€{U””€kÏYÏÚß%|ùU ]@©Èçx:6’Êt«ÀÁÐ dÜu ­@ EJÆîM­ã•Ìn©Ê+Sq5$÷vê(«KÔæaÕš$Ûê¡+PILóŽžÒ ™ö¦¨tfz´zÁ§Cü<ü@1u3¼áó½ãœªþ]2¬B§êÜ.èY@ð˜&úÖê9\ ©ûæ=”\RU5Q¿îBs.åy™šÛŒp¦'FB³úÜ·í‹ Ã¦ñ(öx‰ø¯"ºœÒH]Ôu©ƒK¯¦ÍôkѦÕ/¾ø‚–}ܩьvͱ…¤x¶¢½t“˜"oVf.K[(nnU\2–Ž«L²qQö-{ŸË>›KÌyÃMÜãÒôBÓ.VÀSQªnïìUõÈ­P Ý„[­ûeÕš“ÐÄ–WÀ#i™d =¢Ñs³ÙUïi[®cLŽ ‘*Q13£ \PÊ;`,ÀŽX¬nô¢ý%f/f Ö¢°’gô˜BDnÑyo9Ô¯²]üÑoý3í(¶Òx¨ŸëV“Ø!áÙS¸†ÂºEèzä—ͪ5ž§~ê®r¸/hܰq¥5Çä+¿lò ˆÂࣀZ@TŽ*Bo¼`“NWz`«,…1Ž÷²}dêé«b Ö9k[“™Rjn.B7"™±¬‹[÷?û”y˜ku®)„¹S‡ùšQ¦W^7°p+°»Ë̲Ù^q1uYÌgO÷!º¢Áñ³IØ)(`Û{3wáùû†ÿº÷D(¾˜Õ4aÁi@þñŒ½|Çt¥)"ÉEP€m°U†cé¤FÝŒŠ-ÙÎÁ¡ «f–5o«G1µ´çMëlUÀ.V­bœÄ-07 Rv¤{srÆÑaìöΖ¾goÍ—Ù4LIŒf…MMÆÌâþ ™b7)uá‚nžôÁÔ8œ$é×ܪ«¤c´GQ³–‹“€á³…†.Hƒ•;ÃQ×òót‹Wv²êãZ*¡·FT·QÖLiCLÈ'ÓÓ¾ð=c3p  ’‹¯— PˆÆ[¿c¶EÊЮ} ¦ZéÁ¬HJ{„‡£tÒæ'Q¤˜Ì8^dR§@ÊÒÓb®g¸8@TTxËKËyíÝŒ>àáùÉÕyo,OgòH=sæØk&8ÿL½óó  ƒïpŸ×¯²iÇÅßû‰®P¨dþ¼ R& O—HNþnÃÛÕx¾Õ✩&I:ЦM ÕSf!)Žá)„z«:…ùØdøÎÃ+¿ŒC¯áu‘¨qÛ8t|_ö^‰âP·C3{S. šÐ˜ÁQw‹nª¸, [çB‘v}n0'¨jA­)}Ì#Kà†FB}!–oÀXþ¾ƒ‘Þ}gr˜ñíÀ‡ÑUÀ{ò†!œRÂ!dœö‘>KÔ+€‰Épî; ÄLà»Åâ(`¾‡=Ô8¶Ëjuü `‘¾¸Ó"2¬L-´ b¸ª—3¼°¯uf³p“Ñd…Ð𢪀CEzrÞ÷é:Þ†b-¦3³”«µŒ³_øVÌåËÔk½É(a•MqRvDQV¬ΠZt¢ÃöÉÐJè#Y–ê µa]¢uºfø -hÒ8,•“Ùk…Ã.$+yµÉdaܵ°½ô ã·¨jžL£x¹fÌD5mŸ~fõv‹ÌêÒîž!5±Ë%­Šk¡ƒ`H~ lW?|Õ^#Ä6“@9?µð«â"3øD‹LAö»i²ð¨2­VÄ O«“Q¿8‚M›5’–†+¶MH#°I'‰ï•Üs¤§ÝIâ(Þ?Jt†õ|ªKžZæX•œ%澫2€šæ*† Œ½™½ Ñ©iÛ¯÷~´h%qÕ”QØ­Zm¯x\!ÕA¾£3y'0MîC?Þãq€N†oqC5q/¬Àt‹4n žãrOŸÙy¢BO7iLãÓ¶¢[-ºëö4{ýßûmWèÌõèöôðÎ/ë·>ºÒõU3 'Í{w7ߥ0'ã):Ãrâƒj;EÁl^ LmMp*bU8—'‘ èò3¿‹FŽqƒX¡½n(p6GBsDCca"MÇ¢m¢C µô0#c¸púPâ«—/„ü€èrb©¢Ù ª%h‘¬—Ü8ïäå+Ý!µ€Ö­ë/xáÝ=-Ì®j¸ik!Ö{!& 1WE&ˆÝvhÈì«&Ì«hIK³.Æ%ð‡0ÆÂ¥Gc´|I¨h×d`hdW­E#V¨…™ø ZTÏ‘ÁÔÝ”¡ì5‚«›NÊ}^º ¿ŠÁÙE¹y 0}ÃMSªÆx‚ö±‡9 ÐÕu¡HZ™sð„EH3”=L|O– •H>9a½fp4‘#í;TÖø½Çà›/´Àá¾*slÖùO®šÔÕ'µN¿*ÄXÀä±NdjÅdÜ›ßôVs@|0vŸ«‚· Ì~|Ì:®#_-¨º4ªnÂL#Оn;_­¥úÖ´²®8ƒ¬MOÁÖI˜Ìr¾5ßfiŸ+ýú¥yé&ÆÑècÙü”iˆ ñ_¾4ê´F¯àÓnƒ&ÏSêjk&œÚ`¤é ÊdGs¬ÿòÓ½á¸]cŽ K> 2ùo¸Á}œ*jzêÖßèLó”€oaµŽK¸*Y5¦™Wy*gñTQ§O²¼"uƒeŽõ’i—º'oߨ—÷Õß~õêäñ~å7®ß¸å+Žm ldõÜz !µüÅPõáder…)E#òmŽ€$ˆžÝÐ×–†D=\—Öo^sþD!¬(oµ|Z–ÎÊâµóÛ n§Ÿf%á-¾ÁªÓ õø ¾ß…¯‰M¤CP¦ü}mMŸ@ÂòpEu!œõ»S­q³}Û*ÍÇæÙ2Ŷ…é1%Z¦«êá $¦Jlé5Õ,|ÌñtT&›Zl5𶻕¯Eå=·ñqŽ>(,cKœ”gËlB1W½7h³8å©2pÅ\žBrÓC ¦Sƒ@X.4&á—0‹Fy0;ê¬ ÷2K]ÛºËÓémXeMÍÇ„°¶4Š·2‚=æKƒ‰(¬†<žh&¦‘”—¯n¬Î`[u¼Q€9¨KŽ^b3*hƒ Iïú ­yòôNæP˜â’¥´._¼®ÑqÎ\:¹$/ß»›þ›ê¨¢®¹{¸Ù½„Iã}[‘ï‹&ÉÒs3¦ðÔéÀW9[¦Ø˜LÁ›h‡óaü_~ùÓVÒ,Ð3ƒÓ¡Nò­iÄ ÐÀAP^KBøh †p&ëůmåš”ñÔÐW﹄òH‡†¿ Ë^`±n¹A¸s›&£T-U^q+E.Í@JpèÝL­ÄU3)¾“}Òæ Ùˆ½˜×dÁ,ÔÈßV¶Š_O?zúõ—ÿÛ¿ú_œ©ïÌï}ÿôÎÌ-šà͵²®œq2ͺ‘63Ð °ª¿±é ãi›TðLÍm/žÏ#¯tò88²¼ÖGZ.cI ó)¤¥˜§ ƒ’¼i5œA*¶¡±yKnUÙ%ÚÍJ.ôçU,M»äb䣘ô²X-Æ8²‘ñ^/UÓ‘«|¤%­ªìx†öW9kàÛ§OQãÃã¾ê%ç"8“»ÂRðâY›®¯]±åp|EõÛ'Oà¯Ö:šbªƒ\ë».Ûî׫ε‰LbˆoŽÍöŸ%½}—ý¬´±É$Ö,ÈÊÄœaE´8+”øÛŒß],¼`²4g˜'ôiÍl݆ïo£ùx¨õ·­Çg†ê—å¥=:b`ß>~Òvêþñ¼ãî–{Ø‹4ÕRWÂ%>¢‰=9Ì ”äŒ t–ñãLG•ªóSEy×qß'¾æ³ˆv;„U—z}ä7Ö—ãÕ“¦¢7óÝ.™ÚÒ.Ý©ŸÃ1·bÃö‚Υ̊ ÛTš› IDAT—F9Ê{v«§º· oyúà´™nv©åU*G?È»Í|ø(§süëí9£›‹ùy¢¼t=·¢.þÓ.Ç)Û¤ »Ýí·–À„mÝ/ðÁ´mðmÂÌWÀ9§œ| `%S(HßôóÐõ´œÃ¨9Þ…¬¤†ö&“Ù²³ÂòÕ2+ºÜ³÷×S mE¿uõ§CI…ÏÒ4³½iã´òÞ#°›±SËìþ‚¶¬“P]/ôþ2¥M .—4Œ7nÝ8éLã0ìÓO=«œ`²G·ž bQ‘з°G®O¼§’eäjXF) 8C©| GÎ*©I+¶`ÕÚº&¶3´ËÌ %6*ã ÇF­€ âþz*G1YÒ(ZøºÒôs†×˜ì¡Ÿ®2 yù¶Ðäa.àôC„ùlé­Q\]äĪ‘|…AvMyEˆ@ùƒ ài³2Cë%òCîpJKTtÌŒ üuF¬Ñ˳A3•ô!kNáÁŠpcÅ÷P¦ËSx‚ã×ÕÍü³91¡Ž,ƒaAm¥V]=÷È1@<0àKi¿’T®lÎGH}gè2‚@HjkEÀ‚€LÀ#m$«˜ò68q)"KÀUY½rÆÈâª(q¤íJ†ði$„ûÑù G·ï’oåÈâFàÞkÞhd‚ªÂÉF×ïuâß½¶—£%šðáÆW^ ïCŸƒ£9tî‹ç" —ô²hä•u¨%ßÓ†êô*BÏ L…q9ËÍQ øE#ÐF¡½eW‹2 㿞 ´Á$ÅÛ|`>4°ñgó—?ÿé¿?÷þÍãGßܿ׌Œëý‰C éfsNŠ·*¤¼FmbkÖvžû”-ËqRÁÅßüÍÿÑ’)6 8ÜWS‚ÒeHÿýk†Ë$z0ø-Æñ¼]Í&1:ºIWÏy%ÀVÞEW9/nW½T§<Õ᜘Œsð–„8x°ª &)œe¤è ¯±ùl–¬·óÔ# ÌZ7[ÙÔ±‚ÊWEìéYšW„ Ô1¬‚¼}ë£îÀž ,bJ»Å&ïlüôþ½Ÿ?|`RÔærƒƒwîß§Ækà“$ña#ŸòP†ûCæiÚƒs“;B7sd+ÄìsW Ü¢;Ï6ÎÑîTøÈ»ÊkkW[èÓ÷B®Ãœ:;ªÓ˜©Yâ£ç)C»”Td#•ϱբmfxJz„„mQÚ…º ¼#JϾíÌÕ$ûÿSugKz%Éß Hì $€Zº MrDŽh2™.ô<ºÑ…Hv“ÝÃ-|«Ñ;HWzƒ6Ù g$’Õ]…Z°'@bÑïïþe’:•u_œßÃc9qúÝ·ß~;†sÍkˆQ %UÄÜ$e™Ò¨ÀÑ­$†… ´ US–éÂådâ­—î|sþ΄üÏO“AVüW¼e*гåKëq©y?Òà()a(†4—w˜ Ó—É…‘§’iËä(I¸ÒiðÌx-þ2ÑECÕ¤˜3#iIÏñµLBY˜¸§…ádaÔ#$ë°ø>„QRÏF‹M¶Ægã©´µng¨L”ÉXzÐ °ø©pˆ qk‹2§bj°cY…¥›ü-oœ„Pbze9{ÁÝlèA3ÚÁJsê|À§êENíòIá4²¯½Vá¥å»/[M+/g3÷®uOmàûkn®Ì }jƒÈÍkG¿ýáüÃóõ¯ÿ›W§gwm7žþúЈªJâPTˈ(ÈYܸ8-"JåórØ=ÜâÌj¨Hfs$´ñIy0Uß;;’ã§§à«âÚ§(k¹¶­uAž†~“HàSªxÅ×å,,(¬€û&”ÇÀW!÷D+º?TwIJ Ø«¢ØeT]Èõ›ÏY `UKEÔͽžÌÐaiˆ’´28ø S¢Q˜xx@Þo†‰oÉS€ÏLá”_%WÙȉQ㾪7Ö·™‹jhÏ%Óåç%{%üÔ¨k±: MÍÄDe8Ÿ5™È„ƒb«T‡b`Õ?$ žH+¬Tç1„4°Ö¯a"­¸0óèZáBgý‰V”äÅ1ÓS­Œ9`”j¦&Ó4GMB÷Õª ÏÆ Z74ð·„bÇ…ëá÷µ…óP„†“œ©¡CüÜ}IôÍŸi Ò¦³“Éè! «Þ©„ö²¾J2uj6u±\™* 8:xO]”er¢@Âz:éE{}ù¾xù —*¦¬÷Þ¼sâèŸÚíe© êíë9òÊAÙóâž©+ A˜;ÂW¼L^Å¢ggA ™êŸ|;ôˆL…ª Ÿœæð‡bsÑÎYð·ål>æHk]ª€v µX4¸Øî®0nhå½÷èdËšÓƒ?~ê<ø8%Áœ¶ê%UÁ½ÿëÿü?Žï8‡¯˜éèúí?þ¯þôöÝwŽO¬“ #°ÂÑðœ¢5#è_4c¤yÿº©Ÿ 9úío­Ú‘.‚zmk’CÆ6©UíuËC݃§~.«óXáå`6¬iÛÑŽ›£”講¿Õ«] ib\Q¤¶¼UÏjÒ¨ýÔ”…àc.ãâƒêÊ» Æ#ˆþ¨â‚›mbºyoErsîfPQdp‡­6³‹´ &Áðì@R>ÈŠ/æ·¾üB»6tóÕ/0ñw¿ûÝ?þã?þùŸÿ¹ÕôçŽQðžÂ¬c®]wªC- ,9kn¢“/ôè3¿}ÓAãà›¼èò†™œXûãB¨Awܨ®à½OÍ|,Õ ÿ9©œ§Í4–Ývãí="h©pìÒi¦sÎ4wŠütoJ¥‘ã SujEIãU‡I|¸8¿]òÏμØZ­XóÕk卵?zô i꘠$>A'š„Àñ4iªïî àC£´Ùø)xbšÜm³lG@J]‰ù&bÃc‡øÙrk"ª=^ìÁ¾Þìûï¾c=Ò(~ÆØÙõudx¨»®ajÃqtQ z°m …†lrg'qOäDe-(]Õ¢X),]*p]t^€Ž]ºIAUª@ͼ±| %ñk7í?P†`3&’½êÝä$óâÅKCÿaxñ"p[Eý—O `úI¡íÃ@ŽŸˆÓJ‰ÙIŠQšÃ1ÅIÛ%ÛU… H“‰o!Q< ®•ÍqOàÒZ1w)€ð0ßÄ äÀx˜Ðä TY?ÕF¬ê /&c"*„åÈ]§uáßÓïcÀ¦Ê»Ã'}Ÿ%*9Â9D™“êÎÎÖ\½òŸ~÷÷·î||øÕ1¢÷oÏmæ¬Ô£ì*b vAHïÿjú4lðW̪½F'ß—XüÖœ ¬Ç“„¤§RE.?YGeæÂØù7Z6OU*®­ ˆ;d¸³Ó(èŒsr0á௪52j ’£A¹xeüD”?”îQUÅÌTµ€C€ÜyNÓ/ÁžéRÓ„À éÈ{!¶±N3"~ª(ñyÅÊ›‘L^zXxIqBͨÎ^þ:SúåìÎK(°)Ó¢ÏDG’6ÞÒ8´Ù(M—j¿ÚÀ§ÞY‘v¾œãRÌG¿’æÙçU5ã*v•Ošw40SãÔŽb02E&:=âDPž—}«ÃŠ ¯¼÷7ц•ŠCŒ- ¤Ô4ªÈwtbÞÉ7ß<ò•É•¸C( 8sÞ:,nÓ@ºƒ@ó¦(SqÛVa5ýhÊ#¨JÐ=úâWƼ.§æMx1z¨YÞóUóà |‘VüoµºýéøfŽ[Ô†±qTÓåU{aÆÚÚk·,çç“Ó„öØ5$]sPBÅp[=¬§pv&xLÒwø¶Ì§ õ€ à&?Í/úÑITëš)¶é W%ZÌö¸× ±å5 ÕæoìçÍ{*L^4äàëq¦©Ðâ’àRï¶À7Lš‘ôNwÕƒÎUp` 7,{ò…¡ÑTüœ€<]&9Êq×£„íÄ*T“Rö %þÈlÙD”mÃ…??ÿáøäKÞ_È)Ô†º!ñMÒ6Ìt¤iÈÌO0 ý\ñ¢bVÖQª0ì‘á‘ÁÑØ á§êù£ŠË@ê„·h\Yà ]¦Ûb¶·ï΄ƒxÞ+u?µâãµæJgYavGøÝ9x{~ʪ¬Ë†s{ð?¼³‹úèŠ9þ>lÂã ‰kÉåênr§†3‚b¡ÌÀGßgf&9¶ÃžIi­òº*7"Ï *ͳ\ÐfÖ4ã–Yœ4}&¹TæVAþxÿ¢‹8$”•Êå4ç;Ç ³bå‘P¡sb•@yµæ!0Hß šTy΃ 1 þœùDL,gW-ÒOKiùõ¢a*Ó˜pü|±Z\Ÿ.B7«˜àŒëÁ¢‘o‘X‰Ç}F¦7ï 7¤ìUÁ½iŽÂÆñº†"Ö䀛~Ð5Åè‹I€]âì« (hL/nŠHqöôçŸÿãÿý;açÅ#àƒ¸AÄC†¸[êÎî~ú©OÓò -rÙñÖž°ÔZ¨nÇG2ÌÈÍ݉µgsþœmsíÅÕã¢Ø¢ ÓTY1·ß‘uGLJ£ÔÐ7“žx™ÒâW^TÐvn~÷¼·²:¶ ³FLGפOï{9̀ȶ1Ç‚(W©.nZõ„mƒìñmÍPB*wÙTÖ|Q–@9¹_u:¦p ¥Ö ˆ“ÕкLÔéeÖMa8z«3{"uŠin½›=$ft²¦ßÿá÷ÞR·|Ä ¤ê,{sô2Ûò½ôVo…{'ÇJʼ߀/]œ›Ýêt̶ ¦-’aªW5?ÿüÑŸüñý‡_|þÕWßüò—ì™á=?¾ƒF®©¡_nŸ,ødœé5l}b§Wš«/?}ãÀÈ[G¿ùÍ_‘ŽÓ$ÖÅ‚‰2aµ”7ù8ÛÕ£éaFõêH³ª&±…ñË£±ÿ@ÉÜ‹IÊ'ÛhX°£|U“129 !GÅŒŒÀñ¡3ã#t Îá‘w„ªä–'!ú9?Öéñù{Û‰ŒiXÝ•oMx=›ûdë©m¿í`tṉ̃¥ß/¾üêÕéK¾ÜàЫž˜)‰G/_9Q½õo©5ªŒå Êr2à.±rt$0äMx;<á)pf3⎇÷?ßpùô&m†r'²\ÃA,—퀨+\ÆLȯBªk6ý€ IŸ #8oØ?¸Íè]BnæEس³‘D(ú€iémËè·$ „Q®Œ­w¼š°áX¢hÞ‡‚¯³ìqR‹Îaªì„ðj2ÁÑi·yy( zÝÅF¶õõ iy'òb¤JC{Ñ3€P…ÕԾح¥Ä”iÕÔ"æUé*“Ë¥Ï)ö93I çÅ« §¦êÔfôÈÃB+ߺÕ' ¬ŒWÜ §æu¡ Œ9äøgŠŽ^A¡„T\syޱ 䢖wh;=¬°‹dE¨Œ\·-¶Ï$@’j¨Í€×=qÏÓZaôXžG‰[I¬^ìk´a™¯¥a1¥œcq õ÷Ê[±Ö_&4QgF´¬.hR]å±%EòÓšÅèöÒ(=Áo"G7É|Ðr¨ 21;¬êlÆ”ƒ¯„ŸXª¶1'äX<’ãÑBS½ÌNE?ŒõÔ'#sƒÓÇ+‰cŠ\Ògp‚9½¾V–î.%Aó¨nc#ä(ƒí^–ñupÓ&çX 1qvC‹0h)ÇEóÁ¤Š«Õ*}Î8ØSNhÃS?¥6ì ïF¢3³Và8쨆£H'®Š¥HzÊ'ˆ GðJ¯è>jN0_’ òðV7Ü=ÚÌ-7]µ`8ÈÆ$HËÜZ¤¦õÌÁ8eæü ÜÊEu……•¤(±l¤§³?I[®%±Ð^—4&hÏ¥=mFwÌëd.]Tv‘¶2sI»V»JTT46ñ%ŠfØ)jQv¹ÎÐ"=•ƒiþ\*©áÎ{à<£Ó›Ï”Fóá G%ÃÍYç‹*=ád¦.ä-uçÞùÕºÏZ˜‰Z>°eÈ@O#â! ˜ˆŸÑº|;öˆ¥ ³Š'þ ·ÒÚE#ê1›ƒŠÈÁ@c!ºŒHþ“¶·¤åÃ<­h‘u ÏÁ¬ÃjÌòJ.±…<»/r8Ã[ªëEQ£AÞ ÓBF3kþæ†U|(6” çR,=Dzi¬GÒ¢Š4Z”¡ö(…¾.¬Áú®´þ÷éÓgf¤ŒK•WXEê .¡\%*JíÍýÈ7 "}Í&€*c™Àù*šM½…Å7o´µßlŽ9‡^k³hCʾ·6|„<>›R"~8ﬧVh‹‘¤¦SƒÃÌJ*¦øH㘙<ø8KȰm&Ê|ú-ï yQzG‡Ç"Ráú/È㡦õ¿ÌòèßþÛ¿1 —¤åm’Èï™uxsøˆ–iÒ%ÿ’+u Ö\°^½½6¨TQK*‚éî§KÚ]1G·Ü*#W†—ÇY©( %wÁ}OÄË<ÌÎPbÑû'÷R´eDÑ„éÖ´>‚D£äosâ£>þ“¯¤tÞœpô^c>^0~ñå—h™ž£ÕŠÏï?ˆÅ3ñã¸vaýÐh…[É:ÓÛ‘„>'vCc^¯›^þ°±N»ftF_ XÛ!´»f¨°ðÙb–ÎàËþë˜oOUËG}÷Û7jšµJ„åLt‚oÐhâIòᎠ³û÷OBƒXçE:…æ 24ÇýÞ|Y=~2Ì]Ú‘£:1 Ø2gÞé!TãB!gi%õDìW˜k [Ò\žÓ+Ì$äŒ:y1…­½‘‡̨›ªÌî^½r:i” ÁI¸­ÆÍ°¥6øY¯©nUê Z7Qò“Úš‰zL³Å‹ƒ©iƒÎ4Ñ©è*“gx £´Lȃ 1‹3HPŠà1gðP[£mnˆiÓ®ÖE Œ&^ñÈ/QÇ“:É\àšNë %ÀnkkSÞ…oÞö*v-g<õ³Öf3…Ò¸j¬ûógr~8¾ë…v'¶¿³ˆ,Ÿà¾žT pø,2 ù)½ÌTXMo±ELs!4 Î2a¢Š2Òr$ögi#› FǨ¹‘G6;†”Y€$2§Šò̦ÓÇqµ†ÎÓò?ðòÀ…  U³ûkÂîDÞáÈG‹¨È/ªî°ÚLù——’.ÜP@b‘Aˆô®!×–—¸„£ŒÌXd'Ý'Îðˆ’z* ˆZÙïÎt ߪÕÒ{ýtØŠÕ&’PgxøLò"À‹T„Ûv Ò¼Îb1—Ðèâ)¡59.%±°¢œF(šŸ­x2ï]rzØ 0„! ¦q‹òt†ã0—e¦0bíU—ï½&v$§ ˆœ…,@£DIÚö0èþ}v櫯a¹®æøö±y7=·â'4½wrJèY³pǸ (8€(&ß G'do«ÖòõП5è ‹Ýé¾Â¢À×SÄôüÌé,ÍYÈÇUáéæÀß•Dsü"!ä#!H§ä¡z¥½ä> ç•}Tœ)1ìjã¼I»rF)3ž_Nš»Â Ô±)9QR"1tÂB›¨¸HŒ÷ÓEˆ”G¡¤9ÈP{ôJxäR&cJÍ:q4ùØÌÓHØÅ(¬‰5Æ6ºÌãVH¹L“!«'rÓ^_8=íb¸õ„Ó>ÐÒ^@¨¹C¤)¦:,`¥íÉ\=3ËJEvÄEíM“§•HòH/n³ÕX±ÉûÍqÐb.Í ÌA½QmP] H¹š Zî]9ž÷!qÇO¨Ä¿ø’ aÐæPz!ro¿ç®7eð¨€i©‘8ï<5i º|%‡†xq¡o‰PÀF'È’ælu¡!€ŒPmÜâºê•É—™Å¥!ä“™H§Åzj(­ü¬yV/Sx#]9ÏŸ?Õºü;wï9…òæµ; z!íÈ“kWE÷ßÿá;38j'õuò†ûHôëÓtKl´|€L³¾#4[¬&ôý¡b+g$nâôÔV^\ÈOõ…ãó×Nóþ€(9j±Rå©&°·ûj²e֗°%vY—žÈ1ѺAon ‡=@½f[•Çw”Ê B³ 9™;Å@¾ÚZw쑊Q’âjWŽÙÌÑ(ù¤¦W[ðv¨$—ဋ‡(eìuéMc£H@3!CZ°X' ˜ª‚½ H¢ZC:|v }ùÕW|öüùÝ{wNîúÚL¢çr¡†Èfά&äŒoßÚ£O °IlA¾ð ãêû¼‡!4àžf§V>fYŽ(²Ê¨#TÑú£!.V¨è‘€L?«uµ–7éù¼v¦ÑSˆùŒ¡·*…½ ZW—Ô`+†´˜a¯º‡i°z+|Ó>‰¡‘‰HÌÐÛ¾~Z`·…µh|q`¸‹Ï>RwŒ”±zÞt¶%êìl¢):¡¼Õ`:S Ûä4 8EbÉ4lT„£¿þõ_†®H°~ŽÔ²M»N˜˜2õ S’Ð éÂeŒ r«è£ˆ½î¤˜*Uœ}¸Š)ì'ÈmE™`«»µQ…zAdápv {:µ™Õî襎!j­¬Í FiCÈô’ö¦Ÿuöw‚4Y"j¶qßÝÀ/ aÅ 2z©Í6v,óƒñ¤™o΄Pùññ¸/~ñµpGôƒKšà⡨u±õƒÏÒèAÃ_»éV!°¼‹®¾î—ešºÐ"8HÐ2g‡‰µyî‘dF IDAT=.Dâ&ÎÆ %³ç6M7Òž|1Äå‘KXÍ,$»kÚðÉ#…ÑÎæµ9wH†‰æ´"g™¬°vÖ¢Zã¯ZPàbüÄ|Ó.%˜E`P—\Èé];ØŽM+9CXiW™¦ ÒTß/„v ®C¨ç«½Ш™ bŸ²úÅ£>á„m‚ †U $î)<à›n!æa”µnÝÔ‚2;A³;ôø)üÙbhÊK­™t: ²&äˬõñMëP´ˆqp>ýSRB€ª» dóùóáˆ9€óí ÷é–ñ5;£fl mŒQ ;¿¸ÊÄ.½ÒuŸVÌDúØe¤¹ZK‹¾Q½˜<ãKì%xo³ÝtfOÑÛ±õtÔûwð‡›± ¼&a…&4]Âr& 2ÇlYÕ?á'*üaòHðPS®;xC?A+Ëv^ØëjW¾ÓØ çømª`­|¡¬QùîÚýþûÅ×ß(ÞXÙ<‹éØyCÉÎ1õ­kKb¡È ”deºËt)¶²ö½[füýéŽd8H0P’ú—¨â5Ö¦ò±hº«)ÙCkúz˜í°T†\aݘvÔ…© êÀÄ7 9Z1üǨ‰œ(6‰¬Pä,-×¢»×Ò‚œÍY— rÔ]n,Qî[R¦DvZX£`þÇõUÊ™—”ùú—³¬e/ š^Pž&…™È¯è€ºD,çZ*A…Ë«ÃcÖ‹ }öÄ^Z†0È.õ¤Ý=š~ˆ>ä"ð¦Œþòµ%çÑÙUbâS 7þªï,r&˜Å±sÜ.Ôc¾Q‹~Z]ºqO¥9v¡ibÒÁ_B³›ìúMKLÀ^j½¶-ÎmìyõêKßx¾{§HÚ9޶éÍûnHpqþ¼éêÒæà!Fר"LB .àº&Æ]ìkï,®Ž 0‡o‘ÈC/¬ ³”Ñó´öÔjžÔ%ùúÎè—Ðñºhê¸Dã à€ŽÖ¨X“ßés^ºE·é•`ϰbfKöW5ß“Jºz%÷0ce7š/ O rVf—Ÿªü`ÅÍån â£<}¾ÙÊõöƒœŸû61µ¥¤w®A ¯¦.çºwrâ[ÃÖ¦˜‰ âLÆ õjuTˆçö~(t¼ª·@zwÛÁ—í6®Øàm<Ô¨§»2»ª+¿¨¾ vº»ÜµÎÖÒ­|køGòWlÄ9¥"lEE f[÷a•zj)¦étk4Mé ¾ýLÝw©Fr×4 ˆ2­Œ‹6Dc¥eCÒPÐS2™èõëF‘0b“€öR# Ô·Øf(ÐaB ¢w­oÁ;¨š‘“p4>ÕÿBMZhΙ|–)ŠP=%j*[[û Ù¤:MÇ:‡| €°¾9_ñ¼¦{ž}g°<¢²ôDÓr4­³C¸öY!wX‰2Óò9ãh©¨µ¬NQ:dÒµ)˜1»Eï3€ÏlŽ1¬— Ò¥z·=È'µx[w¯ÆÙ%Dú‰/mzp£$½æÃéÓqý¥G ÀdUTÚ%°Ã0&8ÑCFæÄL1–‹ñppÀdìBchÉ@"éDê.^×€D!|$%>§Þ#èØ£ZÔ•TÒUW”}Ág e›ÜͲ8ðÃéº(—òœ‰zÆ‹´ =h&²õõðcà‰^w”4f Lu™ÉÂ0 cõa‚Ô޷茕‘ŽÇ:!’õž„ t1ÁY±(œ­;ªw¸_@| Œˆ¯s 1A^¡EZVƒ}Ä”ÿí?ýâ_CâùóbýÃüܸ¹¨Ë{A{]OtdóSß$üßO òRŒC•bOuúO,Š øJ3µ©”_R`«ûÐ@V>8îgÒ…Ó݉M ê:䌬Ӷ“»@ƒ¶’Ò„©º x0ØòyT9ËÆeË6!­Ì¦•dáH»<ÚÂî{ ÓÕ. ùîS\òMûM b~þ0‡ÍªãWOgÚ‰¾ý×Ûm»ýœKbÌÿ¬Ñ‡¸hÀ–éâd•[Bx ¨Äª ÄüTÀ£Më®%6‡`¡ª/F È`ú—¦ñ‡úÔÎsš«7¦rgdšŠñÅÀ¹îµqô“ÿ¦ó?¾m?î,°\ñ%®Û¾CoÃIç,\3Úl_ö´¶W‘4áæ)·Oë?{OH_+J h‡-”4Ç¢o^»ÑyèÓÁÁNÝ$G¤9ʉ } Î/Æ…Xª´Žzw_(Ö(k¸Ê¿ÁŠŽih-PG6±K‡QAÚ`@|ÆOêÖé5äiE9󾄡$·Ït‰ÒS%·É³ÁpØÛÊó|#8­÷«ÿ{3ÿ#Ø#¬·_M-!&¡¢þÒ‘‚O€õTE(afñ-+^ÿ:?¾{,Œ{9§¤z]€ 1fŽöÌéayKuõöxÁ„MXãÆöµh db\¨VVe}uM]-²{­eŽkìÎlWÊ“æ`E3Áã7<)ü]½esV–­ ˆ(¢W:¸ÖÙš‚¥Àº˜»ùwû›•çS 3þÓ–ˆ;F}AÖi”ÒãH ¨ã¨ ¸äè>¢0¡{(Gá\˜ì§¤ÂªH€<pÀkÏG+0þ(§·£Ö,ËZ›"ˆ¶`¨Ž}LŒˆñ¦öNÖm ›_À*,@K`3Nþ˜Ï'ÝÚ¹ºú<ð­¡CGƒPÖ¾9³`-à”bºt]Õ÷6¬ã¬2äào>ÂnèsLžù^fßx¦”6µÉÑ7Ÿ[OJjgdüÙÕwïßܱÖ{o_Hä‹4*"&ëô5[w?Wà c \ò™b¶•ñÓs †1†(¶$ÒTôãÊ;´á#)`Ú¨Y, „n¯>˜“ÂóIô y2lŒé’òúcMÀPå\bÁ!…!@¾«”eZcáò=Ã:üøz+««Ñ9ÔÍç¥ÑG™%œ) œ6yg¯%A'ƒ½V°n-×pš´»èÌìh5s:°2oˆÍö#:òÃ?¨ëšÿðþwÁõý°–gÓ»ªÈïå¿<ý±3hËX§)îix³TÚgÞa·™ ;ŒæUA)$e(Ƽȇˆñ‘ZïõCçº%šÂß遲B5ã¾( 8T(íJhÀ ûVÞ˜†B"„ƒ|^äº 2kÂ)ø¦#ómŸ'OŸÂœmbiþ0–¯Öi‚ÓÆ˜0F¼É C Ù}ãÛ®u(¢ºÖ霧uûØKh £ÜÿÍ,¾oОèg„³"ÖîógÏÖи+6˜I¡‰./O_X€ÒºæÄ^fø`;)›‰w–„ónL(>yò” ¡ÚÿcéÝ;¾ëÐ|œ—  µ8`î)f E<Ô´ò£ SéZg˜–rÑí™ãéÛôŠ4Ç: Ôp dz6“ÍTÛUý«¿ÔðôàY./ãˆG8if £ K3C2ÔsÜ­‘åÝê`üLг6 Œp(œÕ*SpÓqy.ð[cS@Y•Ñ¡]âD2:êRe­ÅÚG“ËMð‚Ð]âQF[ÆÏnàT Ó௉’̯˜Ž2G"öÓwKIa[üp–?Ð>œ}®– (ç<Ò]Q¼x}FÒÞÅÅV#ð"f]ï‹ç>nب‚œD„Æ.š¥FŸ?|¨k1e‚.'¤çsœR^szó+øC0(ƒÂa_ogž†?Œ‚$¨å’ÎÒ.z>g ´lŸÞÐgÉU”RêÉÛŸ^eŠÕérÅ«{#\$ºø‚Ѫ-°ñÊ,štÁXö /׸k:OhãO˜Í'ö FE~) –!—©uöÆyÁq¸âžfb„‡þ>É2þ‘r^ÕàæÑç„ Ž] -2ÎÌ&h}/pÈÚÀEÓžzÿ€+ ¾ÞÌ-oE(N§¶NÿÑp¦åŒZ<èŒAÇA£ŒëAB€ó "xœ„€N"“mâ†ý LSü@É .yL™!fA ô8T`ĺ½/ô ‰w†J1x×Ýrk3;]Z‚çò.ðwö¹I$¸’¹P”].ŒQÖ-4˜Búì4_o‰»ÐÈKñIƒ³¾É«‘¨ÃÅ 7üñiíÕãú\^­„|H4ñœ/Vxåg J¨ ð “3ÄÞÛ:Så®3úæüCð —§97Û‡?.Õ¹`‚`àµÔLùŸ~úÑk¼†Ô#ŠižP×ÿ*nz^€+n¢Y¶Tã&¤Ó¨’.™îJö4{¥À†+©±¾+qó„³^¯ âä‚õ“V¨¥Ì?7½»ÖP8ƒ.Ÿ W@7sãÓÆ`óþ€´eqF”v¤6ÁÜ6§­å»ŸåÏrBu ÷Ïx< \Šdç)áFð=÷HŽk K€¹´HSM¨“ìçùª•#å5~Éj\ŠñWîÛú¡ÖľrðG-ÅðˆG$[MK4¸ŸÍÿñuÍÚeM)P™(ÙŽ'ô>üæ‹gOÄ^åíi°¯ƒc`òú#F'ÚXùÂŽóQÒ¸2üžy$á¡“Æ`:­x9Jäz|ï®ÈlH¸> ˆ›qîCÎ/žwî”­¨òsDÆK½ë]¿¢UÆ—·ýVGÕIæ‰:ESÓ˜ƒ@h þ½/?—ÓÓnYJó„µ:‡9¨ùÁk­Å£Ü‘ºøÀÃèæ˜‰óAtö€ Ùa…"¢bŽÔÉ0u=ã!ô’`±péVÀfÖ•±;Á™êH˜Ž«Wq”–Ò{Ž\"@P¥ $å(£³‚’AªÞ ™Ò€#þ<‚Îq š& åtçlQĹS¬Y´=öÎ^ÌQ'LpWÉ÷–q½ÑÏMå¢ À?ˆÞÌV GìýÔŠ^cû˜±k9¾l×4Gvˆ¨.|Bì  é’‡¿•á™[V׿ßñá;i³<u °Ü´–ÿœi›¤óë¿ø„4‚)kJ6èC…Ã-L6¿:Ç hŒkàæ˜Ûld³|&‚+XÆ2ÂUÍc‘Ù&tµM?Ž„ìB0Úð({€²5JÍ À$’YgIþV‡¥‹EÑ%áÊH4ñþƒ·öŠä0=¯ÜA ¶ãÙ‹¦é6ƒu¢ÓéHœ€Õ&U$Ø’d¡m\†h@íšM/±èìµs ¹1ç‡~´îÆöp0?n÷XÝÉ $Þ'x?õÎÍÒ“ &1“=àcjgû³W®×Azõ‰%Ý»÷À!œ—ÉÁ³çO„¸»õÔ‚Œ#ÛÀÏPª_ÁÖaÃ#t˜õz:¬ë\1 ŒØãÒh^±,ÙSF»‹ë/…•œÈ¼‘Çt°Œhî²îT`ƒsVðèÒHeÌI]*ê)¸éôÉ-ºÆ0Dí}%+¾Éä’y§9¡íæ%²¬ÖtN´§!vý†Q…@Ód/’©®3îáþäÉtÉw™)ÓƒÒ«—ÏÄ`E7-ØÏ÷sœy N›¯-tR ÁµN=‹$”¤_iúÛ×t÷ÞÝc„6‘c0D¦¢1…ÔA«5gÌœßaQ¾½3alF¼éóô Úy"dcN#ä;>‘ä»4õ ½¯KÁ±ÆJ–½sä$zcÓoßa™‚Xèšõk¨JÓj•vMŸé*CM1¸—‘]{ò¸ZÓ±ºí¼O}›ÈÊ¡y‹‚§–fäd¢T1|(ío„„Ñ Ï˜w“+¶02Åm¹>@¯ò #ß܇mj^­øÐ6Þtp6_KôÎígŽìºÑ‘3W”Ñ»7&Û€`÷&)¤Uù#\#™Ì–MQRÉüš×7ƺÏM÷ÓjÞƒþ˜®!6’ÑóáZMÇùÌd!rfБ—¨§ö£nx<Ú‡óçOöUPê$åuPë"–H±xô Éõ0“W] ÃpþXä ”+0‘¦ÛÙsJâÈœ ž,ÁAÃa›FG‚ïÂ’œ•nxç°õ yZs§ïd†(Ý>ãö­Û¼u«]*bù­Ù{¥ ¯DåÕ£¥ø© bià´† `£µr&‰WZuXFCáúWšðÚ{Xb‹¨)¶?‚@,žq5éD„³Aô5õ+G $pÈ:QMÛ,æ^ÓHÕIC—1ù:z'PÐl~¹×4H¤˜ÚÞ{㣶F±ñÌd6¹Â0§¬LÊ u¼ZÕy²ƒžë~é^ É„Hî˜0ƒUéx=ÎG2-çÀ ¦û‡iËœ,ñj/…8Þ æÃ¯ŸÝ=ÌYzÏAúìôõ‹ºšyçKTD™ëà•ðÍÇwZÔšÃmB‚¦õ©o}ý‹Gßܽw—æ` ¯ XJ1¤ås¼!¢Ï®8}Zgœ³3ÃoªÂ7’&­ŠÁðͼœ„f³h‚•L¹XÊY‰Ž‚útÖ`L—ô ÚmâÄ%h3éuë¸W¾Žì(¢eŸØùm¡†øsôêé:¼å§/£Qºúîø9ïìÃêTœåxV=ÊóçÎC0Ñ•I¿xúâžáÍÕ«g§m˜¡rªð³·oß7„X€Oâ0aç}ìñ³Oÿôÿ`û¼ÙÖ!èäaÌ÷¶õ0¯9ó&ùd’Їü+Ï©×fe4ª…)ÊÙé•YÄÑ«ÓW÷> f¥ºZ<ø¸Ø³ŸrF’+Þ‰sÑ¿¬êR’–&Ïf»}‹Wyh»À`/§SB‹£õ³W®ˆ;}¼ÚÒÉcMp@fÌL ³NîÝmÒ£ïáùâŸc9wMNÕŸ5¯>¼S9@tÖ{—ömŸÖµ%¦À«ýöסã•×un¨.À}s (ÔwúãJ\ðx¥•?õ^Ô–ÚÀJ™VY)–fæõãú ¶Ô!ŽÊÏϵ¥8¹¬,¨Á|üÒlù,ÍS†é!½s[gƒZgHúQR`6ž"ßÓé¦mßyGþ,”„ßVÜ™Så‰@À]EX ã>zB% ú ٤€0ž‹Ùe%#¸W/ôBRaƃ^ ñS1G?XJ—3/›Ä4G?=þÁqî %êH·Å, ¡Cß„uË4½ –_¤âB<ÁÇ•(É+Å4öL 9ú>àÚwÍtºÊÈäŽ>ôº wVG»c>ŒkFM°“U1&ÒªV¤QQ×5Ãýåƒð•³–^’1?E®¦j•abM†¤i…1MìHÈÅNsªSÂy„ýÌt [ጜ %›Ð T%'Ó\6ož¶Ž¹uzûŒš¬Âó†)bztÊPcç’KÓ€õˆRiÍÏXp³é+49²íw¼Ók´þ˵²F9\Ï4š÷ÄRÍ0ÉÚ±TkŽö((yè`‹o. í n®éá"?·úpFP›†ÓC(O·uk9áÖú*vNfW@FÏ51€GUêßM‡†^æ &Záé¸FÐöÒL—çÇzMkkžD²t}5‹«÷”¶·;¸Þuž‡0÷Æ[íÒ£‡%Ü•OLcÂS7-b Í~OÄàé²Ea9Œ:»iyÐà[ü‘~d…í¬«#ÎLé7¼i`OØ]Ÿs@¹^08I‘¯=(Œ©q 5Ä9‚ŠÊ@¸GM°5Y¥!ý„Pd¬ŠMñܦ‚«M7—oê«yœËThÚÝÁ÷ºs9…AöÈOi#"å;¸±ôC/Ư̂k˜èYIŽ Kc£Èû’? >†!43ì!:šrÅÍ-‘«»‚XĤ]HÆ®ØôLcQÆh?0‰b¦)ã©èGx·$ãTg˜O†‚-/œåÞUäB®7 Ð7':¦XêZŽWašˆÃ79øäZa3©ÆÏîSÜÒ–ÂÚ4B@Ž´S&»ÛËOùª žïâC¤qÀOÔ±,—ºldáB’ «å‹U$ðÇ0ñ"¹{Š4r¼qýŽq„qÉŸ÷½7wïÜthVœÛ <}ê„‚ûË1˜ðoˆ0¶ˆv¡ä> ˆA f%îän_wÕœ.ÆÝ”?Yï'`éjž[§ƒwk~VÀ…|Oá&1#Àcb…(pñû:‘^ÂÓ:A€DÌpB¸º)„!Ðì*sÖ¥Y¼1T&(ܸÓÎäÔ½ã‰!Bs¡Ýõ̤w]íu«Ëã%D¶„Ú½“ûÆZ¡ ÔWYǨ®ÖÝ”§õŸ· &²Ô#Ò‚Îu_*ø3ZfA2ÓÎY#’Çßÿ»î?øÜMÈd“8 -&JppO-íbïEE ÇWš…7íß°íÄ€‡O/§¿cVüFc{0›×0ܱ5;Ø s<€˜ýâ§ ]É`ÖIUÄpTÃ'U™Ù,ô¨.f8ú›_ÿjúýp,ú”YçæøT„ºÒð¦ŽhnŽr&$–<€¡za™€g@«8-¥L®\ îpMN…‰ÓKV“p §4 o“kçR×›—9R H8ÌÜ"€z ¸Q-à¹ð·‡óúä¸IŽ|Ø–YàÑ;é<›K`}ÁéÕŽùï¬ýù,‘†>[•7€x9uƒz±!©ç ¢nµš.D>œmdÔ”ê˜÷š‘è(‚¹¸Šº†t#!´`os1‡Nºðß[*>,õËó”Rÿ‚g«ÁLr†ÅÅÎ"Œq=9nþ‘Lé8WÃþ•þµëp‡L2ÇDÝbæ¨!ðIa»Š´;A ß"ÜfFÅÔ@² î3r9D`åQÂû·ßþôi(3ý|Þ™9¦ ‘B,µŠ§iu BQÌ€Ÿ2=šê±—?Dñ5Ô4I4ÏÞ¸Ö”&-gV®£  8Ït˜¥tq•Ùé¶Ç‘¢‹D¬}ŒuÇ+Ò>¢T¦Ž´ ‚•š­ª÷Ó#͹»”qIhË#ŽˆÁ+­ïžh1Ã))S—41¥…ƒ1 nÎæçXAX ™"[¦Ô¡laÁT>Ô9çCc37ÆCŽ·9ÑŒ®v;+¦'¡Þí]™u‹”Ähœ²U²Ã9±ªWã•WXs¦'&è» ¬cã1èâŽí²CS³&¨f Ô°VEÐÄmòNU,pSé9ø {áçηcgrï…ªhz3U@?8cÏÑ÷ß÷÷ÿ÷&;NîØÅÅXD¾~óðóÏ›³ Ò:Çü!A Š“i²9¿•ç_ÅX±ŽPÚià‚°ž÷ú”–×):yQÑS2 ÑÜ׊Á˜+=ÄÀ¶ùó“KQ†2–’ Ëæ5 ìUµTòèßÿû¿mô6½¾\Xb“¿*WéC¹ÈôC°‰ 4(¤9Mn2WãVrªÔ· |ô¨¾wå%ÆÄT:lõ(5W8Ôbe¶tŸ÷ IDATÊ.>jäñ‡ëtBÆU6fU 4‚䣯åÄ9š)Œ]ôÉÛX1nb9q´ÞúÓɽ{(åÜ"rH”~[äòè믿†-PÊ?zônÒÊ,bPZ5]Tu6ÖÓ%¼&jñ•¦J:V6úÆ‹b9‰94HÓ†G +\ÞD»X% ¾†0|¸mr•AòbùÖ‹òöÚ#Æâ7â@\ϹiW[ß–eöŸG€‹cDQUlv¤Év?5„+ ÅÔ— oi™~jÀæ'á”b¶§pžŽs¹'JR ’ùꢾüò 9CW“CdçÚâÄ ‹À¼=ïEËw©Ž:0cìôÊ~*ïè“K˜îîÄ·rh!PØ‹Í."s'Ã$÷‘Doêð¤#RA`'Éš³ (óˆa ô…ceoýa²¦F•_Åa°. Z3*€*33j X?Ý]P•ãŽp¸¤›aø‰ædH7‡+¦šèÎct¥{jõa¿ދW ǼÝ^ñOÂ…U­Ì²&¨ŸJOCµ »ü&8XPKE†!’ °’©h8X=l#¡4Ô¹€À|”ù—¸)E›¶óoSÆ‹^Æ€ C·[¼5¯ ΀ ©8ð8ðÉ m‰_½µPñê¥Ya' Þ¿ÿ`Dƒ²øãZVk]Nz1JË—\Êà2’eÒLÝÆéô¢”ƒTx7‹/#ïxj–“ù<$,px#XZ[~nCà+ÃýjEz;Ôm´üÈô#½`©-u)¡®½ÃÏðâ¸4>Mҹʺ˜„ó¨96ˆån!&áoÄÔ„îDBhÇŠ¼¥È%àÛ=!õ¼e|Z]€ÍÔœòDÎ"»f½Lb¨6UÆT}=×ÇI>Ø nw³IshŒrÍùBh”͘ÈXÉò=¡Ü¡ b¢8£=ú¤•‘Ú]P’“Í%Á…bŽˆh­ µÕý> ?<•‰^Å‘ß6'0|™œó̔ׄà>P˜CoSæénq …Ÿý'HöGIPG޲é#êѦؑe&…õßÜ™mãuí,lÉÏ”–|OµÆkœÜÇ|3EÝ0`uÁ|¨µ>š’”?³'×Q?àÀk2äg5ìÀ@€gÚÀ€C£n1ï*Ô# Ê#_+fšŽ®@iuÌŸñaUŽÎX-ušùèj–G–h„_ȱù˜ÄlùÇ@+øÉõêU¡´!ÆRý”5c†æM-&š °`Ks€Òœ2ÆCÕ¡ÄçP–èõó†%¹,"‡9òk£Ž5çþè¾=BãËO½×ÉÃCcd6*ý™Í$Ä¥:Úv%ÔOÁá0IÁX¤E­nÏšÏH$%™dÀõàäá݉à]­*ÉÖüD´Šá†aÇÝN,zã›Ù¦B‰ïåó¾3{ô7ýWÔ¢à=É­èa©Û°®L_i-ÈOóõœ5Ô‡þºF`9ß,$&Ž™y:š dh¹/ •ÕÌSä2³ ¹Îà uùîTÂS2Q™£Ï#{䮧Ѧ’Ê[ÉôT×.'IGfܨÁe]=ñÀRI·†f¸b7€"Wcƒ‰‡°ÂÆwpÜ™MßËè¹ä0 iÐ^+³`y!öîù(±á™avNñÀD¯" D”\ýe›s"—LV&>çŸ1!… q@Ïò£¨)«H˜%BˆGx9mfêÝx‰é3Üá[Qí9":öÏÓ²´%½¼Irš5_…ⳉª‡sÁ‚§´20—`™ö 1räóì:2ݾ$a„‡·œ:7 /æj뺵aÜ’ ¶y˜ !ù˜S|™tt[i‘l[™Ö؈Ùš‚í£nž ‹±Ô`÷²4êîw€Þ8;Ÿ+ñºJÊø&pGº) ]îÏÇeêUäsºµ;÷$áu¦òá¦ä!{ô|¡ &ÄÀ)£¡ŠNaÁ¯º–9†/ký‹tM*¼» ewè H¬ܵBñù»Ågk-u Q.iêyP¶zîh7¸¯Š±ÓγÁ“W²í*U»žÒgè™Ö€,w*Dx%¢B‚b€/¥Ê+ë ¯/äߦûW@?Aë+?•Yl_íóH6@¼gDŸìcÔσN4P¸¬ÀÖº¨HXæ5Sö.“ §À¸á§Â]Êhë"d‘Tr/ùèÔ-X† ŒŠ(gká¡iNRšz{äU”ßGj¹F¦Ù¦pƒ¶L]r¢qj¹kEö³cß»X®°E1tiÝ“)Ûx«ÉÞûsiqÊÇC䔦ê}›eµ%ê)§Äv=õ[sJºÁpsÀ¹|´ˆ§ë:‹ 4„ä¢î^E²sÔTŠh9ç/L@¡»Àuœ.‘ƒvkñÜWº‹9Áiþ ˆ0L¶9-•ß ‹d `VPŽÅü³xJoy9ðäî ‰K®\ÙJ|Þ¡[|žGDÐÏY¿V }ÔÃÜ Ú}ûæ´'o^£eÇ -ïÎKÖŠEÉX.8˜ õñ«ù=… F.Òø¹âs˜ŸF¡\¢–Ôʨ¨ Ú¦õ óá÷P,H“ocû9£N™§FUT i£˜…&OµfUG£ÕaY,NAV,Ñœ{뵈WUT€{@­Ù(fÉÊ4$ßÞWà8Õ\Z_‹EVKÙ/ªŽ]Û1Í$ÖgL“,y%7+e×í§lƒ£ê,~ù¶¦GFà+”˜§fìhº´?Ú²W}7É¡\D@­êí}\³´ n‹ÿ½c;k³‹qJšÖµTª2ñåêÉfº“£2©ÕÌ+‡G‹ÝSX]0zBÒ”³£øÖžS ZT Iï”7p’X½Ž«… ¢ –•;úͯþBèG§5¯ŽÇÊÁF20õsmè6y”ßHNDœŸÕdM*ã#3P7Á_xáu1á3—ê4sËø‚8=œ¹ŠôÀ]>àkÞƒw18¼¥å“‘êÛ:qb,Éy:ƒUö‰½¼’/¿ZêlSùrs-v>|ܶ›Ž6E¿=¦ç×vcmµù4}˜æL~˜niÅÍO8‰Ä ƒÏ»*_8çwSÓm”A ÖCr¸Çˆú /¶Ôr€’bÓƒ%_y‰Ä<#lšÎí2QIíQÒÕ^FFVäá^ýÀ´VZƒÈü¨…‹|ù;Õ¡ïŒsë”õa Ä#hjà ǥÅ%pƒ6ÖjÎ:„Dø¡ÃÜ(éâèêËÓQoö&ÞaŽ¡ Ä @ƒƒ¶°j¶ö #cëµ DP]¬öºáøµNAÎe«»¸Q(>ðÛÏt½MÒDðÁë¢Z˜©x'ø]±œ¿ òØ¢inÈ}—ÌÕ Ó€©×lïhž#Yu±å0Ñ¿)¢l&è2Ö½ÆÕ‘—»K•EÒÝ#¯ 0?ž¯‹èß‹ßw†nº — ÛoÎæ¤‘ÙDKÆœpU§ÆKµÞE1_@³ƒÌ€)V÷ Ô‘ƒEátåÇûÄ¥‰Ðñ±Œ eÅTÌ [½¸4~§Í›bapàÙ¦ŽÚÆÄᆺ˜°NCà£NÎ67˜d¡FÁOÎП>5X«iWü[ ýÔǘ hΧ½_&iO¯œûVÂÙãº}ÇòDn"(»j4¢³úð,5¯§ùFAÆÍäÙáFá4‘Ó"æTq6OнU ] ¨’Î¥Ì^LU­@Í´¡ù2u¨jI V€:*OhZ0cI¹VTÙ¦Ã|DÏ *¨EW!WQ~Ý¿»¶\Jú9ðs¶òùª€¦u«ÿÔL°kƒ£=Û”¿Â€`õ™­ò3›«ÛVk«/4?5±hÀÁOf‚@¶ýøñcÝtq‹Í0©ÓTb_d8.X׉zæ6f-2M&yñ¡„TBZ·¢ LTÔ¨KI?‘éZ&xļ=’ã¾h‹ÅpçpÂàᆞ)sU´Û·¹¥xâöúp~‘—òÛ"ßh°ΩMQÛ‰XÿØY†´Ñä6÷"–2Ù3AÂ5³ø~n£hb˜6îb8|¨Ðò(¶“Î<N¢}ØÒ ŽU1.JàƒXOéÍ  ðÂäÒw2¦E**2øo(æuø $LÛÈ8ž Õ*ÚJYhÜŒÞ4LÑžTxRa§G ¶34=t4,]¾«ƒ™âRàí!æ;<”\[½B䳿'w鞺ÐÖéHP³Kä¡jÅDf˜ç«¯“dPAg|VXçËxصüößÚ¢á0JclœƒjñGtþö¤¯´Íðo¦ix#ÌE¾o-Su ŸÎO Uü„˜´ÖYűŒ¨asª¥žÎ “SãùöÚî Pï‚-—ôüÌÛ¸¨ª†àO} ”g>d”ê#øŸ£¿ûŸ[¨Þ~áºR;´Yµ× ùIÓòŠÌâhöíÓUDÊoÔ¤ŸðuOÆc<þíòX¨+ǘŠiÜΚN,Àv¡“+hCÞ ›2?$qŒª pê²ÀŸ´N‹©3[Èó `Œ{WÚ¡{¸(º®‚‰Ð¶VÈš‰Ítˆ€ÒzE™‡XÚƒp}¯hæ±Oñ |ÒBl‡†ayúBÖ‚­ìjpDÅü¬7ê !Ͳ ŠIâIüÐß)sº=`92<éi=A=ñ†Qª¼È«¨ êJy¤½+¡s­wœa±vñX¾3§ôŒ iQ|UŸ]‘¤†zeæÚ6(!&§¢XÜK ˜ —ÖÝ•0fM¿òÎ…DH†m¢œw(É#Ze Ëx4̓#8ÐE+¶*Üq‚¿ÿý?}÷Ýï½Ã¨ ´fóÓþD~¬¢¢ÈA@!Î^ë¢$2)…i6\Kð³*?=J &ZN¥!ßÏ9lnHçQŠò­ö«ù-‚è°¾ôŒÁCVš*"*ퟅŒ£ÐŽþô©ò:⢓éZ®z§ŒyW«O²y<ë8ðÌ©MgìL\— ƒ7hƒF‘Ò¡ô¹Ø¤e †åCx{ù“ ±AŸ›Ra‹Ðè@MÉe"mChÐÍ!ÉO@3'Í€(1D±ШôæpšTJl¥ÇʈɰûÍ‹ŸžýøûÿòŸÿãù‡oÿÛÿî¿7®5sgÁ RÍQNÜuR -8•4ÀGïùÐpÐÖ´r¡aѸ,&_Ž*ú ÔmÉ!Jò ¬ŠÊÈ׺Ÿù«ù˜Ä¶¨€‘ÃÀŽó¥é¼V¾U/|ƒÄãO¾2ú;’òe(†ˆçåê~°· ^E90tÇ(m-‰½½Æ~®c„íí;ÛX7ãЙ Ü¡×}› Ä fב¯$hƬŠÈáXv¢‚t”ÑëSè&6X×Ú¨šý×&ßìˆrbŽº¨pq»CÔ§OŸ¶îd‘‹#œ%{eVîš_Å5"üdÓ~º³ÐV" «¢°;ƒ£¨þÌ@#§9~ÀqöÃ0ülZt^l¸2š;0몀Õ=µöœË f}O³ Z÷—|º24nPåY´½ï<°¸úvÛ1FŽèÝ/Ùˆ>;õT°5?B–¦®åP «Q ô”`]ÙÍ>0ìÂPøhB£tie¤ŒÍ£cñ©ký7[”×N—ÆêÊßI øÏø…‹(úÜQ1—"²ùá‡om²åý¬ýF½×=Y‹ÿöÝÖ?}öà!Yg)p–°œ% gÀ‘)‘ëÖ9R ¬3˜Îu“>ÓðÕàæ™¢köòz[p@‚lpï}OFk¥ý^Õ‡`§}èŽtÑÃÀÊf Ð.ï­> {îØ16¯“ƒWÁ}¯á‚æQ$mi{á·ot,¾D:ý²—UÓ›P1xz¤$“ÄpéDœë2aæWŒÕûP:²hÈÍ`¨«aÏsy¯³Ð"Ù¢·Â1kô5úë¿ü /¼RxþÖ¡œø€528qŠ8À~Æ€i©øwf†o6_ó®¾ÞZˆS¨<ŒÉ68Lá¦UhSR—"M/Ϥ=2ŒLÇDwJ?^xÄP!MîÄ:Á®GÁ³º¶´Â231P"òY1é`ÉÚ xAt¥‹]fn‰bõlÔ×»<ÀœiÆ©[åÇ\0V >/vðè¤ÅŠÇz^fßû3UH ø,cs*Ű˜bº‚ËBV‚¸'Q$4¯j³GøÈAÏŒ‹1\Þóणðð–Ú+CA·!''žo8ïMÌÒ&­(o¦Q,`9¬9åc÷ø¶"m—.Ï0H¨po%´øÙ~¬GcÜôË”ƒ‡Wi˜ ¿È¤ñJEÈ+)aþÙ½¯”ÇÀ¯‰y$´}sæcˆFœåC‡Ø¤ YÁCèfTç¬"Ô3´#z‹“ûÇî‰#×®Þ@Çý“¦Â_ª¥Éj&ˆ¯‹î,Uéà⦸-¥Õû2_š#W+LešÛ~± b.²óÍqb|-Êôh´·ýa¸í?—mlQ@žâ‘<±ÃÞ„¾aÓÄ¢¼þCauñNؑ֌&LáȰ=·xy­°´Hý„IØëò>l!ßѱÍï*‰>÷|!e¨Ÿo(ËeÁÞSÆÉÒ á +× Är#ípÊ·úiYX1M LŒ¶ÿp¢´Wý­ñÆñ¾ùÙù¼+ÿóâ§ÇïÏ^P¶ï|ò'úo¨–•‚vàÍÑJôòarÔŽ`–îòs-P¿ ÿás†ïÂuðá [Xá rÔZŸ7 »ù›À'À=Eˆ×rOžLU–'<,Yd¡^£×Œà‹ñ„¸Á™‚³%´Û Ð*› "iTª;Ñö¨5N“ ƒ¹¶´B­VîKˆb”§(`6Zèot$ TZCpÀ ]½|倂*ΜÑ1z[ÄÐN„»8ÄÙÓ¡Ó/¡†q”±`›GÔáÐÀÁœ³7§XŠvÊŽKtl<ªu±œ 8:SL– ÚhµùVTË-iƒFâ†0—,´9VwÜp%ëœuóÄÊhB 0_‚‹zë ˆR†ISD;Ê3~âQožYCk3Fútúúå³çOu@èJ7®^{÷æ¹ _~ù¹ Ê%ð%g\ù æFÝb ›à¦Âøé§Ÿ¤Eö„l1‰Š*\ës=ÕQ¯ðYy×&àO‚¼”Í”+VDa…°zý®½¿wï€ º2¾úêË/}·ÅÓÇßG7DB¶í°XE”œÙ¾.ƒýø©. DãÌ k0æQ¨Î«ëè1GEŸxA‚·˜¬xDu´sö9à›°Ë(@[åvek#ÈTÚî¨ +!¬–”i]X¾2êxîn“ûo_>¡¼ÌÙë×½ù9¾ŠVYY§Œ8øk øHùè [%v§CCÀcÞ×·àÎwF&ÒÛ]Ód¯*HÂDÒÑOh…*ã'¯9£Š†ãlà ¶’ȼÕõ>'nÑ·hÁöÃñ Vþ¨Á™õ=ô0Ýì"yzÀMÏ̇wD[:±…/ú{®ÿĦ¬ÅqXC6ÛQÁ”JÑNoµS_‰"­¾Ь £‡{0OÓBý»÷ÇwŽoÝð^‰(jv;£¿ñ>­ÿ82/Gu fRL±f ìÒîô§Ù Ë/Ð Ö¨÷5ÓI½¥sóD>ÿ-¤×õE¨Ö¼Åü+ÔŸipeäp›l¡CD®ÒÍ}iĺA'ÅıºÒ«Tù­•B¯Ôëc°åTí['D*ö£ý:˶¿EÇÚ¹›õ¯Xô4ÙÕa›™6)³=΋Όe99YKû}?Û馂ÄGÞ–c\[ŠÑ‹zfOçç§ûªtÖØŽÎêQqC¯ dUv(›æ#&°ÀˆÂ›c^›1ëi”²½«aæùøøäìùzyþL`pÓ:ÀGàõÛã¡EN¯_:|ÏKÇu# Æ_{¥uGêÁ‡ãb kï±MKYÚL‰£EX f‚ÀÙ´žLE6;ÇA³XÆöĘr?}þ,SÇÊkWÎ?3*¸ê´³L¼ Ë(f# 3iÜ\GÖ¡‹"qL(ƱJOµ‚ÉYµ³•{M+*M™É”$sבÅË7‡‹»Ùüß’ÐD•ãµ¼’݈MôPúæ,Î ~è†ïg;›tzwŽÂ8bƒ­ ×Ȧ3jfÂÄàÖȼÎÄ—˜ã 7„¥€-½°ØyYì±Ê Ý×>ñ—~uúòÉ“·¿ü£_Šõìʵ•vþÚ=ØI™â;ÝMìN´lÅ“OW Ú“ñ¾îˆlËUà Àà@Xi,¦àL3²E ÌyõŠCFóñJy\;’«’J;AþöˆäNM©¥nç}ÌûpÖcA&n6ÎèÁÕ¾=„lâ—>èk¹X· Ê,U6g>mÚÍéëOrà´Ñ^…†gœ J i”¼qÝŽxÁ*SÔ"¿°;àI̧´ˆ‹¨µÔíVËŽím/eÒg’:E¦ˆ¦ ÙÔV™Æ~û·\©öÕÖR ýß^œI~øh¸KÍ@ܸu£½ìaÚˆÂ'§“iD à¤ü†?jqó&y ÐÛ$Šœ0Ǿب+NÂm?IA]Àt :2BR ãˆ,Šçˆ,ÕÚÊs±ì8TÛ[|ûåK;Ì=¤6šæ¾²Nï3kzFìÒ¶ÛÑJ», 6i¤D†ï“kǼ8WpO|ðÙ»Çô>Ó|µ–¨[#›ÉW ŽÏ„kIy¬B qÓ) ¾×Çǽb2ï|úê%P=ÒWÇciuǘXíõêÜkŽeqt®zã–Ê ­…T7nH>}þÄ×)ìñ­»­úêè_WŒ@îÝè×Û>G5ë¶bCm`ç­½·ç§·ïÞ1ÃæŒ;ŽÛFyý…æíßwÞX!œÃqZqSÝ tFÒ{oÊSeô¶^ê´N†FAßM!Á¹öõ £Þ#‹³é £ ÔÜUGÄÎ,×J®ÇØñã; ¿‹z/jMË3³ÊÆfDÛ"œågB'žgWeÙ ”|š±3íþ‡ñ|ÌS”aC˜´lÔ®¾vTØ(0oÿ)ï´$WÁ%MÃò=²À1?]•Y\5çìµ?w†ÂPº¨žÍý,b‹’JPÑÈê•ò Zqoæ°‚Õ)4Gœøž×îW+ækþ²êNµÄF9 4|ê[ºá\^üä¨F£/4O–v‹8õ Fl¢v>Rõal2 (—ÀÅ ók,t¬hÜJ©t{ø¬„àä0fgªòqÊpc—¦·¬Mùh¯îìÕ›j£½é@¿¥UN@\ôCÔ¶˜ø BÁÀ+ú5ó.ª œ¸aé&µ Nš€)JxKK_qåÝã¾?=;ÿæOþøÞÉ=šN€Zô4¡œŸðÁ]ÎNއÖ¹tÊ’3ýÖoïs5ÿWL¿ µú9soêí#ø¯.IŒ5i®‹Zb£„btuÎFWªKÓ·-€aUlœ¸¡ƒ¿UQÊxê¾Wåj~L]:.}.ÆÄ´QÍSpGâXñ¡+9ÏgºÅ$ýª´k²ƒ™;ê{bbN,FMÔҢɈ† $=ÌLsb¼´Ù³bJ@§"M-™g%¦kmçp˜³‚¢"j¡—ss-ßX°¹£BdW^º¨bPd¨#AÝáIјk}¾&ä³}v·m…ÆÅR/£S%¨¹ú¶Ó áÛ§ž¯°Öf5$Áº•qœ¦¾OÔÖœ;øšÛ¡£û¤'t»ê\«>÷)z×[%”¼}†¬|£•ÑÌ%SÏ2¾EO]2¼¾â !‡àâëW¯±?%‡Àí›EE­À0mïWìè §7gŸñ%7"¦äž?ª°q?°æºDÉR×ÿtÜ”á’ÈÒ¨ü&!¤q>Wæ3ÌoÞ(‰:/÷pîWwRûé’Š·|†îM~&&t܃=ïiWëL`ôÌñ¡‡eÍ£ãÛÇ£lÎ) Vý Æžl8¾.)÷“1‡Ã@PH ¡Ó [š6_e—ý ÿï?ü?þèÏþÕŸþ™É‘çv–€hTC8³;‡¤G^aîÒub’Š]âÀíÔÖÄŽ0‡É²b ?] Óê-–hW2ÝF=Ñapž/üqA;ˆí’¦Z 'w¢-ž,Ey\[)@Q¦á2° üöKˆ`(‹æS£ÿš(ÜÝSž(Æ gÞ£-ãjŠÀZ›ëb#*â}Ø55ßdpù31*¶³¢€`ôbAmx‘2­nÁ6Ät§íঠƒpF¡âòSaÜP’)À…ŠIç –ÀtåÀ­y‹Ì¡£#§«Š“€¸« ‚"u4Ì”-îhÌû Òf—R†ItYùzøð!ÜŒdàe:DúÇdt°]àî`ânbuôn&êv@N.Ì 2„ú,ùËpî,PÄCJè2´KµÐ>ìÄ„1-gùƒK–ÔI¯äógO¹, ¦mfK$Eù¨s5³Ü7ëP4!_yð=f ºTïi¡ƒ—Lç[Uü‡±Á[ ˆ%‚¦ßv)6ç‰3øc†I0Þ$Sžåc }ª¯»Â*PIJj6]„Äß=$. YA·ýVÛî%ø¥ ²f Ùv#øÛbƒ9_¼:µ•ÏÖÅXŽº¢fïœÈbzÕÂtøoW(Bºîí(`Y¢ò)d¼ÌÛਢ!CÑ¢ “@ï03Ÿ†|Òa«Q “ÐHP çá_|àYE$\ÜëÊA @i×#lwgõ`*¶b­~/^mGÑÛÝüÃ?Ö™Àûwû[|l=YQRó$:ß4¬ XLý^åÖöæû b÷Âê¾ŽÄ å¼f±ï3ä¨3»*F‘ë’ÍìÉÄ&üZu“)6‚Ÿþ +¥Ù¸:úÍÓdÀò]`‚¶,9%• UøÐc™‹!¯™-SÔ1mfðt§vþXu!ã)¹JÀ¤9öYgÔ–’{§DöÀäÝ}cäfkUÿ×r•(³7é06PxëK>mJð¼ 24p¢Ò)lÎpCÓxUW1ñXç¯z¬QO;äz<ÂT'z¢ßW‡ ¡ne!ß…îšPÒ’s¯Ò´BÒ1‡1—œŠù§ Óì§D>øésÁþµ¹ 3YT‰¨)+RzÕ—Ô™a„Ï"f_[ uFI+gOfã0è`BL&~º Pþp¾&d)y¾º¥¼)yׯ¢œôô€›lcW Ê•èOµm"Ü,žÂÌD_ÅÙ1-—ELN!JMBÚÐËŒ?2þË–”„•ÖW4 µ‚9#vºs”‰§üK`ûô!ZRQùš^ÎÇá™Õ‘¯¯C”Ûœð¨·A‹$M¢¡háòè0S…±®ÅŸ(däÀP]@4 aíjÂ…uqo˜#s®òá©ÝÅ%\ì{YÇ{ú CQ'+Ï1e‹‚kJÂp!ÒfÑs³í#=†–·ulRPá°r-¯ }9“‘IÊZ ™Öjó0E‚„üõ–^+ã2¦ÀœTÔ'{´~ëú•Ç¿ôË?3ùÿJÿtÓKïuÕ* B;GuXIC&žjÕX K¦(° D/9Ð#ìD&²Ò©>GÁ«îzzÕù®ž¯Úë'€@±OôÊР ËË;¼ CÞJjNá8-”??wš”žLä6À °V»´‚±(’0DIítðfȇu O-téçBqZ´ø)¡ hÅUÃm¾~KVw¶¶A»óAÒyHÊ_ø ‹ne¹ù Wƒ i ‘aUbðѺ¾\E´‡ÿÈZ9îª&ýúÌRWªŒvã=ó8?Þä²@¦p£Î‰Ã/=’À7„ DTÁVÂæ’ö/äÍR(¼8 Az›na‘lÎ6̲á°Å¾(‚^ç³Óæ?†®+}ñ½?]H &;¤vY 7ìò“÷Ó(—"ŒsÇj`•¡?b`ÚH0{‡–g]Ã+kë¬#5ÃXÛ9 äfzt„€jÎg99uûl(󇩞¾z²†´îéóg/¦ g:pªzL_òyif †­P‹Ë[ËçjzÛO2-Œ~ï­º&bM¨":J_zµëϬ zçÎ ïO<5ñæ ¯e#–¤>`qjÔ«í…Š+áêíeõ²¡“WmÔð!hgkQ{ßä\Š1¼eÉez ÏéŸ]íÆÉßÿá;w~ÒZ¬)r´ÂàLï! cÌÚ¶¦á‰ß."ð4™M<Š?ùy,"w^:×<«%V~=úå„(;¤ÝÇQÕŽ~™·HîsƒÒÑØq$Ô»Xàå%¦0OXl£i‹¡?ÿô£¥RÎðèïþîµß8wÁ.~š $`}š®v0ËV僘P§ý\ÆÅösh(¤—†òŠC‹xÑÓô`˜cKN±3èXxîäÓNo¨Ò~¨Noi¡ßD— ÝfåÁ™m)Õj‹;|¬Þ?9!GŒG‹LÓ0’¦½Ç#ïRÙFRq†+ްýØ¥˜½Œ¦ þžxÕF-™Ì€Cƒ*+jÀ{½?ùù©a#Yhƒ!mü49úï{¡îŒLÓ øð‰óÚ5Ÿë¹ßK 9Þ5ý›ð +pIaø6ökáÒ†0<ä'q[(4Øætq -tؽ0°Oñôý’™Í•˜Q´5J/DU¶ÞÞñÅeG- èZkbYÍSú ÄZJ¢÷½1q~®:Ålª…ZµWÏÀ5ÕÁ’zâ¶úÂǤY+{ÇqBãÁ!ÒD—ÂtCEÛ²Y2>ü\`í‹5qX×Ðû7‚ÝæMi ôŒ‰a*.RòzŸÁáƒÂðÀÀÁÄõ©R‡4øƒžá&¾·Â8ú»ÿí‰Ãéob#‰¥d&ÂŒ—–IŒýðÖãˆI@ˆ FiÅlì§T@z^è”›íÿÿ©;[ò+Ëû 1%2‘™@…ººZZæ ;B¼‘|¿…#d)Ìî&Ù¢B/d_ùÂ;te“¡‡m1ä%K$Õ${¨ sΉ!¿µ<•upþûìaí5﵇£cjP¿NêíÖ]Ó® kŒA3—,Ú”_NwB*%Í$óкËÈ`3 Gã”WKÄ0Œ ñ±ÎL€iåÁg‰è ´•…$Z¬(A›–5; 4¢ãB¸&À4“†«Ýý!Š!CÛ»Œ×g^`ä:©]©H^]XªDë:.Iº²ªBnAiÿNÎÑ+—7 ê´w:Œ*[Û¢¡äB؇eÔ<I¦"ÁPý£êsIgdÇå%ĵø£ÉWa ð ѯ-ؘ â(ÒZÓZ}±cÝ^ÜÒ ¶H¯óWÍîç;ŠŸSœ½n1Ào ¡˜ÒŠ$††•sÜqHÁáΆõñTs—èÒ-[Ž’€¶ï‘F]Æ'ã°ØÊj¶®Ó®£°.Ä'Nšê†rÇy:î­ë&H@n=oN<€¾°Dmêìt-þ‘Ó]f¤ MMÓ4¾ç3ú—î§ õwöy´ìCY¯\2ÁZé¬f¢©&¤®Ú*ND]™Û‹×Ö”Õ·˳¢lçÀÌ|Ÿ”deüÒz>­¸y[s¸k¬*Î 'yÔ¨W‹&ª“ M„$žî¬ÔQŸœ"W„ÊPF#™]ø{º—Z9Õ§ Ëë5õD¾DaÃ~M¨ j £N Õ4G^ÌXhe €è-Ï@mÃÝŽ¶ã•R:¦ßkEÔË—§>,HÇ6†Œþs½Ö¥«‚`zwÅÄ/燿ñr’ow¹Ù3`@8+}ÃÌ€‡èu¸]Œ'À$òÃÚçљ᷄p4eÙ»x)à/"R¶0·Š0%¤=ÀdºOÊ܆ùOzǵ]ÍSɷɾÈå+›,øêë¯u_µ‡"@>bĺswI0 «CWBиÌ!Òí>†MÒ÷ö÷aFfÔ”O‰ðkàJ„=ƒ‹¬Z†>‚žL:óÿà‹P¯õЪ…UMP¡kª7]«£C!&Ï[ºK+´˜Ì<”={œV3˜!BØÇ_òS˜-I%¬¨‚RÔ¾,ò;³4ðõÆýø8»t*š âŽh˘Ùzw£R­®¨’¹/ó aˆöVF¢°œ½ïˆÂWb73ÙpGˆ- F•  ¡A݆€ÚâÚØ¥rz›9¨¹‰,tØÀmã’ŠÅÇ~2œØ.À•vA皆 ¶*9Lò2ûT ʱvxbŒ`–1/i¶$ˆ©Ldœ ß¿y´—j=§§èT£pà6Š5cÓÇžZY’z`¢2*{ä)Þµ4ØZ™ñvé!|ÛØTUÓ/77gy=Ü.‘[íj¢²t0ä³Vm×Tƒ¶iROÌ/à3ÀÏgf ÐY«jf¯ÇkZèNV©5§´¥ßÊ€/iÛâ^$“ú S@ JºÃëå4Ž#Âr7i–Õ¼EhÒ?‹pÌtð (&ÃÃ]ï/ZÅ3ÝÎ!UdÁ[754¿à ¥åͲ•FÆ)Ô¦@ü\ÃMC@ØI‹QG-ÂL[&½ó`DZλ‚`ÝÖ5¾ñàU Qà >ÕìR%ÊI1Èo(…oê>"™'Òzòp/‘ßæM)«¸ #ÕDA´ ]ÁhŒÿ†—BÑj]­“¢ij±:ü!”{{p#@Ì_ŒåÒž÷]ýU‰FU~# «‡ BžcË·¹Ô¬ž…4K. ãNÃ2Ûøš˜xdÊËKŵ¢6ÜA]ö бD¡§ócû*w¶,ÅxÑ¡ odã@×DUõO<]“ƒ$Œ”r›ö륮$5Óš@Šèõ¢e¥„„߸r©ûg\é~ö^/q[¶•î è‹z¥<Ù´îg¦Ñð8Ôáa ÕÜðRñ³…áE¬†m}èHÅÐP…8œ)‚¯Tæ^ öMLHJÛIµø+ä4NÎ'ÓfnžtP¹47yðwƒá^A ø‡|ðäœ,,:ªë»IQŸ»†<|Mµ¬mú~IÃUc#°—’_Âu1­×ôšô6þ2’–Ñ#`¨3̃o.£$ùáNM3.0Ë£œ²”˜gõ€­NÎ+Ì}kËÔ•oWt@Rìï?×¼[„§Z½ÖtÀõ V׌£€×rõ¼µ¨tBP@UØŸ£Ñu ¶}ðû/ÄÒqjàöÝ=ó à>E¡¥‚`M|¯Ÿp;¼ÑÂð?þäôüØš3ï…¥ñeLË?Ÿ›ÎA ¢|‘ÅžëÃãC‰ð¼÷¹™;wL×Y”ŵ::|© £Õߊ@—™8ƒ¦£ã#ZÝ™ ²ÚžÖáUZµ¯%‚âÐ¥¨%0/&¤—UBÄ@nùÓƒ‡¼Ü´›ñΗ‡Þ!ñ©îˆ~)ë«2\œ­í;âWÎK Õ9¾7™ùñdÓ¨T¨k¹£Oò´ øß¼9:9¦ùÔÜJш  Tã3Í.®)dkiƒ ¹…·Q‡Ç ˜·M"EeÿQ²xÉuè4¸VA…¾žAAɲAÅb8ÕÁ­ùŽÄŒx³¥ Üè f0è¸I²|& %'*`¹¿~}ÆIã&¢åªV¢¾,K ³ñ®%¥G¾ÞØØÔªU›í=X×¥-sË{–OñH™*iˆüÚÕ1؈kÍ„ž¿2èñ–DÀTÛ‚^g/*‹ÎNH]SÎA0 ÍõãèpE½Š9…+Þ¦a© Áfã-hór¶ˆPÀ `€ЏtB\Rû¼4õ²åÉ'ðdB\¯=r1˜œ\Ø M±)É™ñ‘uÈÉÔ⓳sA»F¦95këÒ²ê8ÕPëXG÷& ëYÍê€sôºÎ`ÐTŠ%—Ö òIf¬K; ›Ùùq¹Ns€5°Ëê¨_%à‘ÙÏèRôRAžöïÝìoŒâüò»Ë©Q®(èyeåƒOͱ`TÜüÇxÃ4Dh”m† ÉE5ðF_{ÿòùã/ùK“?〈íݻƦBNO66U);ý]DIØÃDˆòä€üæüí×_}}oo/€ õŽo^>,øÊ —ÒÌüÌRM ¡œÓ—Òp2‡„ypÖ+¥TcËTKŸæS¾£¾ÂÆ@b<p“GÕƦrü‘D¨jò iªO¿eð{e¶ÁªO2EÚ^á,2 è@¿hGÍ. kÍlpêGÀ´4m¦¢È%®°Å¥jÒ¢Z”R!hÕ}AåÄð \Õêøô1]¤]oty9ÊÓ’Ysô¸Î‡ŠNò ò4}ŽMÒxåD¦p1Í .§ÆÀ¶°'qµ¥ÙÈ ªt`¨p Q]P'`[ýRü”‡åƇ*ôJS¨©¬RkÞ£ 6?eò$4¤³Ú2b†JÀ¬g;5 Åóï—ÕycŠÈÀáÚ‚nÁÂ-Àïô|4Ž8¿wbÆ^,Ç]GÖ|Øc¶Â‰Jà%*‘M„‡A´T㵘Óè(‹vîn³Y@¶MUCT1aÑ1àé‹>NØû0üÑÁK*iÏ´5¦gÓ‡‡²÷îlÝu"£Ý&™æ›¯!Гޞë dºîîÜ#eÃfÑ *÷v{g÷ö˜29=ó‹Ü©{ûû&îl;°  ÆÝ¼Íýp-ëÇá9ðî`^ä´y\dR3ÒhBŠõHˆQOáÓ3ZÈöH¢šW ñÖ³"øo±^ììî 9Q¿I@2¶ø<Õ1QíÅüB£ÅZ7U¥ðeÖœt²\aš2E7yd0w™ƒ…}þàG?ÚÜÜ›aÞØx#!’£˜h¤‚ܽTRV½áŸ™ о˜%@kxÁ8zýæt{o»C“nÜqËÅ›³Wg‡7œª±¹cXEãÍ1ÍjUÈŒjÅšûôirq··¯Ï®^œ?ÿö›ý{»Ëlø¬GÒä8Ea²nžF£´Lf~;îÛàׂ„Ý¥Dñtß’p` 'æà¹ú”+2¬ð…ª2ímÜvŽ87…TìŠÖ™à‡ã̸ó#袎ۥގâá \Á)½Aøâ¼™aÝó(è™: y4•ûuþîöÍMk ïÞ»_$Š:x礌Ý*ÑzˆZǠцtüt®oN%Xaì–•Ë>¬›» KÞ¡±¹yú8H°\ý´™ºëWN:Ù¥7ª‚-j}ÔG wŽ/ÞO Š‹‰@ h"æåŒ–·mDA™•ÂfiaçYø:£¼8}O¿÷!¹÷ïœæ²³µmˆptâ”ü†eËE8,XuýšÏùöýŠ÷­m]2Ñ`áMqmãööÝ]>íRè9»Gð–u’’Q§v%Ú¾ÑÜYÈ3a ÜŽ„ –¸Sw6·Üë,{|æ#í˜ò-#Æ“Äv©´þDVä9œ({Ͱ9nØr6Ä¢“½¦8®0¤V4¾pþ'°:<)RÎ]*$™ñóMŸìð«ãÇ`ˆEÂ,æ€j9‘¤sœº~€ Æø"ñvÓ:H+ðœcD›,¶¼þæâ•a•&i ÌcЫ)ÖÒ„çRóM âd£eÀðDm. ›Yû¢kuæê5ö …ïîî:(Ë:h¶º§•ñKüë8 ô¢‡)1,¸r¤}“>hwâVaŒ[9.f9L‰Ðêzª-V ¨&p;ã-)LN1¶žðíÌÈ F*zt£A”`¦ïópƒD­Ó¢¦éb ù1a¤{A®ÆáC%Œ‹·Ýé–¶o7§AùÿXTïEªÄÞ0€¾ðKé$ó(DðÎÖåéÇ‹²2ë pþ²ç IDAT_ÊCM2Ož‚‹ÖhY׈rÀ ¾âh~0–Ó 6ÏŽé¦Xä7Š wØÑŒWr~B‡¯PÐÖö=NLµÍ ÿà ¼}EE×øsΕ° íÎf¡š gºö•à ÜóÐ U¼|ù<ávÖQ´e•ÕfÐuü‚4ô¹͈¨ÖÁQpëçáÑh0€‰sN*œ~eÙü5îëÏ÷͹„·sŠzÆÔw¾á²âÄØÃ„}!ØYPñBh ò$ONœ(qvr.Ð!O—ìýÙÙ§ßûÌÏ?a’>ØGuëŒß˜J´Íü©%k|î‹ ‘Ñ!üB@%¤SHúv|ôòÅó'öïŸóÒÒ]„€cÔqKõ7­q‚¸j¼rÖçªEç\ÏÃσ9TÓ™M¨³ã™GŒõîÂá½ fñï¼ó[7}Åè]ß°d×,#8Ö ã.QØQ(ÈÔ²›9â˜é'?ù18ÐލÔF)‰¯KZÏàó„xî$ åH¤‹ã<ùX¨—•4òGx%²Ö77o?~ö¼¯îthcƒEL«m@#LàÍ…d!]ü<|yˆ?þ¿–è }>ד9ÇdB¤K€Y€!ƒ»Œý^ê) g1¹¬TªqìS#3ôœwO•(îÒ}éºïòSµõ~¨<8Ø}1¨² Ê/…Þq§Ü*Îf&3gL‘z  yTÙžêD·©(‰¦òŸSh¯wÇníâ>MŒzºàÂËé'ì©ÄØWŹñpAý¡[. Fb ··ïàQ±=*0zÏÎçKÙN’bœ3¡²µ‚´ ¶V€^rB‰Á¤l~³eæPÌùÖeƒ$c2«ãÅØLÉݺñòÅŽcDgòé+6Àd°ºflc•8³]a&­•¢|£³šü€ªãa¯úÃ[ܨ[¦Þʦ†È/„àÚr±D\ZˆUh>$çX¾4Á9 fvŽ¿Y$9üÏiºQª`S9y<â&[‹â¬Nx.¢KLàÁ[‰ZQ¶ñ˜— [2­î¤)±‚°gK Çgª›#nÀ¨ª^å«ÔPÙ?¬Í “ͺ®  ›˜H>¼Á¡€1¨¼Îrwô.`, ¤ë>à¢ùøz“1fuÑ¿j6¡ •Ó(¨.ÌFåÒô®êÊD|׃WºœÄ¢CQ̼U6RøÇVoX$ëߎ†½ ZðQ>Åã»´è>u%ƒw6 mÞºöôq›†øÒ§G/^ÙùõâàÙ·\Îw¯ÿçÿñøöÉ—ÿÕù_c\ `­Òmíy>l|Í¿‰Ã CJÁ $°`§Íྡ6,—¡Ã«kÌô§1ü*§rÖ݈")ºà´Ø–¶uW§D $dú îváÒê5˜K \ ¬œ Zä† UVë[=*É)j£ëeXë- ˜GDïݱ†Gh#L5Eƒp×ü¡ôáÚ0Nדð£‘Ø¸`«*oá$¶XH&`”‘3ðôkºÙóê^MAÍhamô·Ó20ç©`Hݪ©A¤Á„eo;±sð6ìfä¦ïZQ-?Ò¥i¥È7^õœ»6À¨A6—RIßPÁ]/\+}ÞË@Ê ×ɫŷ J´¶ŠPѰ¬ZG 5&èØÛ“õhÏÄl¹"JÈ6í4ó™ÚÍ¢éö¬òº‹6âø O´W´©I<³Zä, (’ésœ‰Ž2ép¥ Qm*îoälräæ]Fúúë¯ÔL(§B¸X'‰3ïÞŽŽøBV š3þûû_}ù%.TеâEJ×ìÅfe°ÆÑñ:†¾;u§wÞôà!Q‚vcl›`D­o ßð›²v/ºÌÎJ³¼È·–¼¥´bɯ_›æbÑÔcý™Zú±¹K Çy5?˜eÛÐAð3C!¡o<$ÒUûâàÅ·óéý™å‘‡*Б£ãCwïîbvÈ¥Yüé¶ñªúxå ¤Ñ;Â'E^?ùæ[E ™*`¤kf27SÏ¢*ûŒ¡†a5Lx//”ƒŠ‰2R©<„T¹<†?ýãŸdÓ§ZÒ·)+”’;Eƒë¾Ä.Ðàe5ŽÿžâÆŠ4~ ìŒßYüèÄúw§ç·?¹»óp<ÈLŽJh/={ùòA!3¨ )È&!ç4sQ›žáÿMqlôØNK[ÖU<›…Yñ³øM1—ÊýÆ:Â¤à‹”ÿ\4æ[jW&tJŽ®ôêã*?¯½ç%è2õÈd‘œ¢¯ŒÆ%ç'Ãr¢˜Ì.­À[/'Sîx Á<Š–½jl âBiº˜(¤áÞjÙÑð¹kt‡³RNsŒæÂÜUr¹fVñt»)¦žÑS¯* ž¯íì:ØãBЈ@8ÆäøàÅé±u…'¾FnBóŠê+²MѲ±z¼E}^ ZŒåà“⇙H—á o@ÔYgÁ¥ÀÓ3¢`JOevy¥cþQbÖùx¡ΰYò?i!üÉà´ëqø¦r†” Šsj§¦ø˜0K‹ÃÄt°V¸—Æ&µÑåPkè‘ιCéÆ4`&XœÆ"F Ó òå·ùhÉ–£-íjjñÕä©€rà÷Ó¬ä*+7"& *ãe ˆ-H3RS_Ji‘¸·3Š jËà¾Æ ôD­FaŽÛ8žSMÌ%'.¥æ¢†s©û‰áø>J%­S°6Zò¢ÅêNwx’ôZ3™¹ˆ”9 QÓ :FA=hW ¯ï±©JZϘÇO¸ujó”;¦Ú(|ya&Ю‚,™"o 61Ýawîþëãƒ'€0¦öø¾ÇùñÁÉá³WV¼>;zþÍïýÃÿâç¿øëßúÝ´sÿÞ ñöÂîî¡uxŒ áŠ@&ÏÀ–¨¯‹[²}g¢EW2¤Í:›ŸÙÀˆ æÈ—6u¸a•JÅ—EƒÓ5)nÔ„éB;f™FIBíj׃D¢á¶…%Ï.Ù\ëYºŸ»ŸS}^ˆ!wêWÛJ©k¹bÑ AÕ:d9=Uƒ<.µ)¸H·èY>“âNÙ¸5\Y¨{): ­VäGV€­ŸŠõ&h}*_ÕªHJÉï¹Ú?=\TO¢gN j®l°®éñBÎ-: S‰Á„²³‘¦ë@Õ†= Â-” ½:hWpJk­‡)”DLÙ`“¸Ò×ÉÑ[y½Å@‚'xàsŒFž€u6µN1Ìš“sY˜Ñ®ÖÓ ïó_—ê#!­â¹yÕV´RʲÁ`ødZêôÔrI£:(xS„JƒS×”çaY¥T¢:—WñçÄ,FÕåÇ™3œ[ªæäèXo„UP6«!@\JÆp2 …Anå7¥ª ‰E‰j† ­“b@zØÛ»§]«Úõu^¼1Ñ51¼=a »XCPb=þ‹_0Væ[ùpöBÏ¢1:™¶ÄG¡ŽÊa`Jº_9SË ÐkŽ1?±÷prxŽá.(ÞØ›l¦R0Ì:è¢JÐ:ÌÏZgJus{‡ž%TM»p2øÀ–e€g¶Qî‘t][ŠZCZ$*p¤Ãƒ7þäO~š ÏxJ–JáÆP² CD|Pg¡­«Åh#nmf~ÐØh÷ÞÙÑÁó§_íï;†¿ùÛTD‰£*5B\Ñìr:¦/1ùŠBŒU ኱9hˆzÃèY¿9ã„×"é½aç!|ê’s¢# õ<"š.©Â©³¹:Rhްlï'†ƒŒTtnÖ4*^(ó,·î#“¡ ¾ÐŒ9‡ 2Ú½ÒVÈœ¥c#5ZHÆ##¥A: &©¿vÉy Óª›:“ÊFÔ} 8;43#p¥˜?ää¨VkÕ,´¹%šbº°DT¡®6è+žF×Þ¿yòø›ÿøÿý¿f ÙHìæLQÀê™Ñá1G’óKÔΩ0ÌÇ¥ÒØx ùЄš5D=ÉHÂÕ0ÓùÅoF«4¬çÚÃ!ƒ çñôátäkº:6‰¼±.3’Sé"”jŠ×AèÒס¬švàÍ\óõ†µNÎ…7T‹ÿ, ñÿ›©Ê6è Žï"331üà=†CÙGCîç|¼¶Uÿ.ËIGNOC…J©•*hs(êÔ˜\vêŒsdÿ¬L!ó€©tŸ8–ûÅÒeÜâîÏ”Gö(’fEÀáˆUQ¢T³¨ ƒÅ„ˆÒOÄ2²\òÓÃbK¥–Ò\ŒQEÀçŽ#ùå†êÿxj`wÁàAº—ž—rÏ÷0ø±MÚô‰5u¾q Ý 5¨G…ájpªR‚…øvÐ.ƒ…ªçoÎ;Ëž?yü-÷ç··‡‘ šaLmXNµ,» .‘-ÃÒcÊY0ag{Û:†½ý{>þíÍ;ß|ý-ì± Üƒ  ©Þ-®èʆÛØé9itá^zåäåìN|„RËÌR$šªt6æª!ˆE? cZf‹*B»¸g†7¶Ž[ Dó×H@†u-Ø@E¼Ü‹€˜œƒÊÌM@Ë,ihéIíΫºx(Vø×ΘH\Óå¸EC2˜›PƒÌë¤Ëlb ã"û©69ÃT:Y¨¯ˆÑ%œt0É›½®²Éã•lèµRI©óʳh÷Ô¬‰?ÔѾÉ‚|>lá»1T ÅUb}$G„êT‰âêÑ3x elÐê¬ûºd " dåù®”·^-È/áŸv<ànÕQ—“m•-ÈMRÏAw2Ìñ˜×7·Ú’¶²Qeú¾ƒ›ïjÖw‹rÈ%Šˆàé <˜_õè2oÃ` OH¯µÚm”òžm}-x3`¼»dhéºC\¯Bœ B§N(r×ìj‚nܹ»ÃBÊÆÃ‚ü+¾â‹“â˜é« ßÄÐH’÷îïbKuꚬÞzøôÓOÉ‘D’.Å3Æ[‘þÏããa8:S7J'Øc|¯]ùøÑ#¦AA(ºÿàÆ’gàñ·¾üòKž€¹\+Q+ºànÆãñÓ'>5ø7?ÿùŽèw­ÎÚ§[xx–˜`ÙâcùRŸÝ».Ò¨©LAëÏ>ûL§ž>}úùçŸ{žÊæŽo#R)>v¡6S)L êš~ñÕTµ.êƒfÆvšF3|»ceθép ñ˜×»B©Âö9µ¦æ½rhS¶Ì¥8dÊ^Pƒ(‡h”'öÃø0ÿüO~:„DÔ\¸V¦úT¿ÃóQ«Ø·ŸúêHªDs2ºàðFL&…| óåá7_þüW¿üëO?ûD8>ÿ6OQ¾rZp0Ô¥²íP¥/úT!³\.¹}µxСŒ-KtPÞI+.G Ç(2î—¡1¢2]¸H9 ªð›ØFÌ«w‡[m¨•TÈ×}õKëgÇûöJUPÐ î†Ý!˜Q ?y†Ç©ÙÜYÇ:¯Rît2ì8>üJÅÌgãtª!rV®™AˆÊ`¯‰žjF÷Â#qy’ɘ|vΡ/`ôñ™Ã×H÷£™ÇVËS§œŒÔð·ܵº©_Œ\ËðW¢Ö=¨ÇÛ©-%§TöÃA©Ì’͘Öè64ÒÕß(Þ:ÂN\Ø[81ð€G`é;œSÖ‹ôÀ€«%˜rz»˜Ð[˜Ác !SsóHñ÷Ø-wþZ÷sÒÓãx@©!‰X}Ät²i‚¨r-5íÕ"“;Àêû µ!~Jç.GÄk×¾üå¯ öá£G†¡œ†íÝ=zÛ±yç®q<„0·´ÓÎî=Ühª³Hêu#¬ÍÛŽó!\wöîY6»©äƒ‡ÿõßüíó£ƒßúÿè›§ßéN#I[ëc¶E½›ž6õøƒ!t a°¹+âªûã0©ƒbáK±@qv‰n;÷7»ŠÊêH?©Øƒj1!*¦d&À#…f‡Æ<ç\, ÐÐTrZ@Ê\)gÏDUÏ)Ò’)Û¾£:NÒ19’Øî`öS_\ÃzuD%ßU«f¥ DO½ðÓµ\+y\^™G)&‰~ÊïÁê[9¥kEŠçƒÉ£•Ek95­BðÀ˜ ¦‡F&VbáÌp«òÕ 31Ä3R\¯ÎÍ”­­ãHÑC3¤‘a:Ô“l¤ÒUþa¶¡”…g?é(?±—ŒºÞÊàa]žà¾.}ñ N ×\Ïé‹¶;¸Ÿ €Y¢Åav®õÊc%šÊ(8*ÑpH¯%Ÿ²ôË%’MwhE½°zB¨SóVÒ}¬Vî°šù—¦åùê«_Á3‡?i•`—“kAôj7¶dvuPi²‰}Hu}ú"³ymÚÏä¹L@Œ7·¨ôåqé\‚Xª¼±±É;spÓÎÐÒäš Ã>JóýÏ¿÷òÅKñ<ŠAFgš¾ê,ÖATÜ/ë=4NÉ™ì^òõ0›ïMòb§Tœ¶ø}ô裻h¸zMéĵ×6 –^ÚP9c~–ß»ÿÑC³^´Äá½ýýýCg__߸¿¿Ï- “X¨â…>¼cm†Õ´V¸_¡ÞL{Qõü]®’º ¶µ®ƒ)mÜô½Ò{ëvÀЮÍýõìáý¤@)ÊjL0§°oz’~¤”2æ+.…jä ‰DflÃË™ jMÛÆuÓ‘Àð~ã§?ý#ÿ@.<2pºäd¸"»>’ž¨?J¼ú Nš¡¡I¢çOŸxç•/ìÝÛÓ‘Û›Û “'äRT\†ÏŸS¬‹mظ<Ñ5¤«èóY§§GxUȬ!Ë–J÷5ÚU|.t€rà-m;¼˜8A›JA9U¥¤>„š=cYØñjH™Ô÷À*ò1žeð AõzΧ‘fÖ]Áê¿^NPYÍ>H(¢ÓŒþå„÷%òî8o+âïZŒ m¼^?½" îÔ“8$¿Ë–aÅ-‚Q6eÖPL3qZž„ö+’ f-„¿þìÙã¿ùëÿôÃþq²úäê ŸS°\ÐÒúªNßÁO(L¹Á˜J<[qEñ6Mxz†Î-yÙ݃ºV/ŽcÄ–s¯ùLšÕö“ÇÓ7oá`u"¥{”=ë+]" p 0pµˆý™TVVÍè‹XÒaUåóœ+;²æ£Ãa#r™C‚p=è­ü¬(D˳Ü,ä€#G‘Æ»aÍfwùu¦Fæ ³2B(Nu€gøFÅüÓ`EU;¤ãFq ÆÇäþàVrx ÚüÉ cœâfŸùÞÒGºdlâgõ#ÉÖ¦—gˆä§. ²D@ê×#ÿXÃö eÕ/^ºün&ÝèhMËHÂȰˆ”.þAèyq‘¥jUnN4“0ÖZ Ð)uÒ¨B0˜lÇ2{…XGÄ1E,îõùÙë>E2KŒ¹Sœ ã'áõàÏXùá6ÍŠ²}üé'Ÿ}#ȾjJåQR);”ôÙYcw(ˆ·h}+N÷>"¾ÊÊ»ÚÚµâª%¿æŠ¬ÁÛµÛçÞΣOøoÿÝÿsG¦?RÇ—j à]nŠ[Ætå”à«…7Ô– rä\ÔÇ2¥XÝ8^£"`!adbÆùú‹?Õ3—2uê„>úZ-5q¯I‡‘õå[ÔAÍ©ŸnT$šÔÐP)õ>ÈQE"鑯æÈLÊrPŸ+ Àï8ŸóŠPjI†zè_o´NÔ­ØFsÀªß./ÂR­Æ›KŸKïW>ÿ¥½_ULÈ?öX5Ht)®Ø+]·Sõ öô)b8>ñâ9•f)¸BDA¨Æ‚eÍ1Uö²x`¿uMýjNƉÔ)0@Q#®oæi9¹ãÿ­GqéßuSñõJâÔf¤ ŒÒ[”&eT…ŽyEÐÌåábeQЏÃÞx2í(jn Ð1C.xk7S“¦ª,¯„ÿyTœæÀã§PºÞ×UæõžxÎ̆&¼R &˜%@Z¹¸¥µ­ŸòÀ/˜=ÔP²Ñ^;›}> œ©RªE¸S2Œs‡äUô1c3»ÞÔ ²å' CÕÆ-®º£ù'ß|]¤íž}·÷¤Ï(´Ù wt¤H»{÷÷ÁF–ïܹ o ÊrÝW§Km!{vÉ0X³`7—`bK ‡#'(jK[ÂÆF5 Ñ„–‰ÂÒÉ-zϵR!hYœæ¾ÖTiN×°bž£u8W¯íí8ݪµñ”˜ž‹BM,êÖ¾%˜›Šm–²‚íò’äàäÝ=á+“ ¢¶ô5”'¬ÅBX7„êÏ6—FQ@ï\~ºËzðàÙ‹Çww¿gM'Ô¦1Z*­>Ì(‘«¦ à¡.¸/y‡ž¦šØvÅ:d¡Y0KôŠÌŠ:©>¨‚@HP¿â×¥S:¦ ‰:¾,T¤Ë—{=ë Ìä„«…¥&7B«î~VÍ8Ä2 ·ü ¡© ào¼²Àˆ­Ò]=cX´>J,pþ¡æpN´Ò[9|Ë…Ê-ä[ ÏQ¨H7µÕýc¦™f<šdh†~«˜ ´«;JÁ¤ŸZ¤!1hB!Üâ,‰5gIŽ|´{F uŒ5aI-ÄlO|r–IVÊê%hFf‰7f »:[Ó5j!PG¬ŸJ­<ò{ðÖà=‚Hp?øñ²à…yL¶ÐSà‘“²Õ;–Û³ü뢈Iá…SpÒÌô»ÿ®;ù¢ˆ# 5­&¼µÄÐ3ヱ,óÑk.®F`ÀÈ v{¼Ì’{ÿÁ½'O‹ l5º0Pž‰ýHW äx»°4øÏ¨ S¢º2 .´Ë€nd§ËÇò§¨^JñeD›„qÚ{óìä*øo¯NÏ;äÝ ÖJ±³LæÕ£¹o¾}l²Å²0tÔ+f½ ´x¥;Ž8°¤ïÖ-'׳ô׬¦ÊôzrãæÝÝm&¾Ø Ë»3"­>†ÈúÃæò§y:`FâF®6ÐÌù :l±®ñz±Ìktá*Þ³D{V@ª €Y)0£ˆ24#°>–ŠJwmüèGÿÝ"^÷b˜U§':¦¼ÄÒ[ØDÅä¦!ÔëüÆB‡W]Ýò¡›÷E¸] S·î!ÄÑñËWoN®¼ixGÇìlßUòîÎn–Ú²è̘€Ý-:xGd`& 9›T(t5aÓôD¶ù ‚;ž]¯žÛ·!HJeŸ,K²Ùίk…GƒÂeËýt5¤Ÿå#:_ê„;)ž1‰Òk)~z–‡¨{†A?¥»{†VXÒî°`q€¡ì-{äúkƒ«QÙú!JßngE””j]Ô‚zhÜ@e•G?ò€JDÂvâÌÖ›oŠHI´‹%&³h›m¤•a™¿‚cÍYòɧ¢}Vþˆ¬q`Y`ÄT‚m} a‚ú‚±s ÆF`¯,Q$á0 ªa×ñ]”ë¾}[Ü îlÞQmû—ˆÕ‹u‰ôúÉCs&œ×êd¤ږԭ!5"ZÖÊ;Ém&züÔwÍÉ 3*ñà-DÆ> IDAT"áêš…™Œl.&KwDä—ãDºN%-'Ôd‰M……84ù‘¤öÃP“µñÙšÔ¨õC걪G)(²;×.êhKâ\ÀP ,†s}`c@ÌÃK•[Î×çÇ\U™Š2¢M'~ûêôÄ0rrnˆÒ•§+› ½‹Ù ‹À3,gª»äœŽ6X­£´lö ÇÑ¡¯-1w–Œ0$©4Ô¡¶œ¹EJê M<ÚðÅX™ä¬Øíœ™b\Ád@œ¼ìý¨0fã´A¨U±D öveƒLì.LШ‰;•X mñálðF¬kŒVËŸóÿZG€Ž–Ñ8"ì¸9>9€€Á†òp¨-!´w¯ÏœØ"°öõïomî[Ibͼ1•>úú]ôU$â"àÁƒD•Àç@[,GOYdj˜qÅðËj£”ßZ–‚,A’9O3,‰…œ$zR`-¬¾åip»kÊ)U\:Eó´b¦òîç|:»©Î!? ?ekNö`5 `ëˆå†Ä ±§HÛÇ ²§íoÔFÊ` ný/E¨6bñä2c”ŸT$ò¦0ºS&ªŠ#õÖÚ3:à§p40™Á° *èÚ™FÙ,¯›" "Ž{òëŽN^ ¶ÓO3ˆO®^e}+8á õ|pÊãîDj?Ú`95zÕÕ´aF~z£w¥dX7BŽœ\‰~ÊPbõ*Qb¿\ ~`¶, 󻬯kF2¾zïƒÊÄmµ£G©ôGº"£?Á¼»·Ãï$>Ó–;‘fÐîÏ~ö3wjœgfpJßÞÚ|ñÒ±ìçE›®t¬ŽPhW_<zxpˆœÚíÛo¾ñ5?áU]pZ‚Ja£ü9ýð‚ÖPBšôšHÁ·àÚ߀Úi!¥}ß|õ•²¶(AÒ!§ „"X‡‡{»»ypïß›zkr™ÿ8Ÿ¸Á p$Ý Ü¶$ õ±:T`e¹G‹I@Âàà ƒÕ$CÊGMÞò‹4B„@‚<ˆ´ tVdº²±»wïãO>ÈSç©R›ûû¸tF†s(†7[jàÔ!ŠcC° ²8FÔ·î MÍ"0j?l]Û8><ÂöL8Q¶yjÞ½yƒ£•¹YŠò> ¥N„/ ".DÐ )Yoa}œŸ‡²Á’jQ¶±[{> tãþè'«¤¬ràÆÓ“cmnn/Ï—ÚQ—:g[õæÉé9õ¦¼å¨Ô"_ÏgùÌCݺá„û³šš9?;4 Å±è9%p7o½rÖþ„ÐM³Nqƒ¹¨\Zj Õõ[œIÃrãIXƒò$èâÂéMÖy½dN2.òŽj…¨Ñ½0V0âv~©Ux¯N‰Õƒ2íË)e#†Ì*t“È¢‘)¯W.<è¬Wî¼Ø \°œ'Hö î‰ a›¾Ã¨ÐœgÔƒª­F­æ)˜ ñ—˜¤‡Q+ÃúrsÛ¯_BÛpýxfÜ2vÄõŽi.«§QݧT.g÷QÚÕÌ2‹a¾÷‚Ló]tö“@Ÿ\»òæäè9¤a$}1W­Pïlß=8>àì_y}UîGä‰È•Õ!f··wv‹™„j\ ï ßë·Å¥#¢ÃÍÌÛ ,?qw-ðša™ˆ  “`±çÌ DuÜHÀØrËjJÎ Wì(òšPMƒ|\V¼ÃÁ€ƒ hªósZƒÊ¾.|òœÜåÇ­¶F¶fþü„¡æ½{ã¤9éGŒ½} ¯^´O¤aÜûÃ#›9+r;÷:R¥xÞÙÁ[_`QOýïâÓu”Ò«Co9³<-gjE¨–·çD[¡ÏN8¬Jù¶`•“§R´ù!Ê–³ ×7lƒ%&¼P|5Ò äæ@‰#Q"¸ia,uCYS¤ÇB˜‰Ö^܈UÖГ ”ÒÚ³o®­ü"vv‰óuWü™ØÒ8t !Ú~µZÓ’;Ç4؉ÊM¼ê13–03ÐÜ…TAãfVÄ©gO3øc¤ƒÚnåTò ½Q³" ¹ŠnÒ¤æjåLE§N§Ë„ßÛ[øÉ÷"ø† íÕ Ñ†€I¼î(ν&`þÊw7¯Ýöä/ÿ§ÿå¿ÿÁ~wïÁç¼D³Lf™ƒ4àr§ƒ$¬X°{3-í›{”"ÔJ òÓ…—س™°—j6îçæ—/¥Ì0m‡$]jRVvfa%çÃ,m§º´ìsšM;zf¦ GËë©Ù ß×sxSg“GUƒJÓÔw¦þ6,DA‰sÓ¬´™hh!¶ÓD®øPi´ñ™m£;Î0utëNcxÈeOéñó !{ 5g’púG åTÌ9ž"–bDŒû3o&h5^øK«ÎŽË-Éœ Hßð Uí³™nƒXuÄ žG.·/ýI êΩ§—“ƒ8‡ÓNí€Æ…B1]çPÚòˆÄ‘mÇkÊŒÉB.’¢ ªi}ø¶½r f£ŠABÆý/ãq¤ÂÁÕ‚Öy‡™ªÙŽ£ËfªóÄpÂì>¡“é,üXýkàçü l;²(x­2(?›²úZ$¡ ¨M¬|KÌ’Óäú8k•ŒlwÄ®LÁà9Õ]?‰<ÖR‰†Y¥ÍíMc¡æhnܤ@BÝÀpB½ð€ ÙÂsVT ´èU5ä¶—š#££¥G1c0…²wwvž=!GÌn˜U¯nÙ]{vvÛwoøµ°›¸¢Æ)„7gÎŒ:Xgïæ8=<`…¸®·6o9æ±.͜߃‡œ^½{g—/á?ƼFÿÔŸå¥Ô‚oi4£Úò»håЭ››7_¼|Adˆ'E­6\kÂUYí|SìtB³{êÕY_Ð"F1y‹•í.ô‰ë=Ì6-tR° Âu¿ÈÈÛ×¾÷ŠJ#t åˆ3¯(K¤æYŒÅøâ&’˜ÔÓHœoè4DÄ8£lášÝ¶¶zÔšÁm+›Ÿ>{º³·ç(”ó³ãƒƒ'‡/ŸlüÁüS½b±P¸#ia-ζ´Ö¤5³KJ=ðCkqAD ¦«ne.ø RݤèáøD²•ÔDOdÀäº'Û€ü)‘(;ûkTs€©ƒ@‘Ò°‰+ΰ¡·®ÁŽªª‡ ÊïY °½ë¹gÐþªà–žlÄíMlæûðÒy`òLå—®ñ±3ˆj­(pÉ6V»ê¯¿k9mñÆŠ—3„\^­7nœßkJ75æk Q¿ì e_åQœ€1éâÄh”Ú0< «m÷ÞžQ…kùú믧5Dä0‘;“ëF6óDuð¨@†­ŒF—Þð‰Ñ‡}Œ&"«¸õÒÍŒ°xç±Ù…€­“ñnŸŸ:lÖrGtf#ÏNáD•4¿"¬ g˜O`,Á˜éÅH ø—F&¦(ÏÏŽr~›×sÚç‘ ˆ¯ÏOlηÉ_¤íìôc“îå^³¼RÇÛ6Ó–Àù”¸ u¼oêóèð…c`9Jêa`ÅœaŸXˆÖÞ–F!t÷‹/iüÑéI«˜šÌ °:.‹ÓVø+Îoþz-i¢;±çÙ¥|5ˆ[\FÃ4—ú¡NEÛóõ ­ʴıCÙ8-\R4áa5dl‡ î*—“µX|£)VÍJ21ÌØ†žrŠ,î–³ðu3AÉ,¸«g••Áó±Õx…UR0#Ô) ¯¸Þ®KJ˜\ØÝ5öOX®ÑN„ÌöYוPﮚUD}µs\>„Ćo–t“ÕŸ¸ËOeç~Å€§Î4í-­ÃõÅš§¯žùðѽßüûÿðàÐfYÙ…³Ã“á­ŽÏ rÁ¼RÜý”‡£Íü =@=”hÉÚÜz¥ÈÊ’F‚2-ºhbaÎ]š@z)‹X´êjÎÏ…ç…®uë"=gѨ…ŒÙ¥1KÅUUK T™½"`P;Müâc¸ iõE[AõaTC8›»‡fÂäC©ÅÎM+N /çŽÈ&EqTƒ ) ìu×ÊÊ0?dž91ç|Öß'Ï'MÔ&¾‡0ø™€ñ4x»Dc±ö™aˆæcS0ÒpÔe8*@BÕÃópk†K× Òpš¦å‘ÓOÌ¿¨ƒd=«$´Nm6ó³h–ѨAf¯>TÕ¶hµÁOê½úó?ÿ×ÿúÿþ?øÃJQO˜yo;mê]‹Tж<ƒ¿Ìð†n¶ê€ ©s5÷/¯G´´ÿU²ð°:%…*æAÑçê3÷€”bÞ*^ž9l]=E¡Þ6<ãE©o +Éâ àFJl˜ò<ôLµÿœ<3 I›œñ5ùå*ר»©3Öä“”Ö³JG4Þ9”6ÉÕÆÔ“Àü[ë™ø@èÁÿÓ«Æs­÷¸iHow7¥"Ÿ|5jPÏ9@d ”Œ'Ç«á r}C=­¼16¶Þ|¶RêãX·ÄÒvv¶}?[×@‰zäL v{"Á,_‹ÄÌŽN P#}GR·¥‘à ‡Àg#ÕKÃ}%UáàܲN”P-Db³ÁKÂ}ê³9K¿yÕÊ=º@NS !¼É×›‚ê\$n 6£é"‚&šXáBÕŠ}"îÆO~ôOP¡˜ˆ¤³]̲Œßl»ºxýigPxKÓ58nñë*FÓñ–gy“ Lç©„aÜ‚Û5Ò)vóÉÂÙN2سg(7-ªÔ±’‰†d­%“Ò„øû@åÌǧ·ëŽÌ ˜||ͬÇüeà!Ìòôl.9ý _ø‰Ãë%R»šžW“!Wd“¾ê‘¢Ñ šÖÅ™”]ÏÔ ˜¾£1—…zÕo+¬&oã9Õ*® b.zX¿Ò{ÅÃ5ç-€ší#°ï}¯:wâäE"Nç²169·Ñ¼-me—„C±vvGî‡WA˜®×™I €Å'^­þŽÐŒbÃ4²n#åì1dtd–‚\RV+¤FCòp°VUƒäDØœ-•C$¥¯Ô ÕaBàì¬%Mt‹ËÊ]‹n·ïn›G!‚FrÅDB….!O¡E-ø±´ëãÓŠSï/fV‘jÿÕ¯~Å „7+Єí@ ÑÂIÔ'ô¬A»NeË…èèõ,å,¿[Š9l‰”´8D»f ‡ˆw·w N:šÁp”Õ»áKð»Ï_‰sT•^™ 5Àð€¾ä§Ôl†Ža)€W¯ŒSQA ½mž„óÛ¹~Jˆ®>†ð†ùn½È8Î-"ĺ¸Ê$²^©?)œgf]K‹É­=t¬æ|bQ,•hÅ6QÑK×XGˆªsƒä—æYMè:ò×Þ P’–Ï3DOЫ²ï®<ýæ—}JÓYð§-u0ÙÀÆÊ wÑÏ>ƒ‹}æéÔŸqÒ•‹WÖ¾|&*ÁÇ²Šˆgûâécƒ®Ìßþìg¤öAójÎê5g÷øÛo^>{vtp`vJTéÙ³'øÉÜ–Aq§pjCè·o|ʰkùDC¦$ÙUÈøæmßF°t$oÛ¾Ç^»½}ÿæÍ;–,õ¿«öX„‡ÜÐ6q3öܸuöú­…v¦"­ÞÚ½÷Ðb£Ý}g”Ú$ñÙç?ði]îGĨ{µ"î`“ûéù+E8ïph©#™1kj†ïp‰ˆZzÕ¦ Ë-o%b\VqˆÜ¤ÔRë¸Ñ8iá¼1äÇR9JY Â3GXŠ›ÿb>œD§&1?\f$ýˆ[0ÀŒh}<`Äæ>”w:>ºÖç]¡Ž¨ÃÛ,ÎkγO×ñ³Z ÏŽc*c²»Ô±ÐÂ(µ0þ”W­â˜<~Ï]D­©ýnPÅPÈ„‹ªsv°r¢X—¥GøKfÿF }œ ÏìÌ*i\ì0=³ô5ý0ö‹¯=_ÌäŸ5¿€VÏàO0PñKâøHcwb~~4dTÙÈ£@ê%„aÕ‚©WÞ2è?üû¿ã½Ã¯MÑ(n]ó°.¸"›jp-¥ñ!½XWƒy¹. )0Ê뜦Èo듬„, ¤ìw“sU¥çòàgÎý¤äÀæ•ÿ»Ì‹á½•â®]åàY‚²:»Z‘¢ìº¤€ÿ»J”ROØgš\ð£®DÚ·xÿÂU#¨" ôÌð€;¡JA¼7f..Dn<¦­€ÚtÊ`¦lsy¥À^ãÛ96i<ìåLœÛ¦Ò¹)a25)q£JôBêq_ø÷,ÝÝ+MyˆÇ[?Üõu³P¡”¤•Úh)èaÏäÂCm{ƒDÊj‚70ÒÑ…Ô©”–'®D—M[+þÅßÿÁ¾øýßÿ}S<ÍÀº×’ƒ¨NöÒ]eª‚qy'`¬sò+“WjÓ2IÍ*Ѻ)4°iGÚÌ+ÝÚa¼8ŒW›ŠMÈì­Vüœ>¥ÃéÕ"¹þMŒ ¯^î [³@×Z–>…騯-qÑtòßÄkŸóR¿_~Ó æ‚D€Ô‰Ÿ%5Gf9 ÖA¿µmQ|ãÏc[7÷îïsÈÞ½=ç… ê³§Oš(JtÅ\«¨ÿÆy{»{-‡¤ùgbÇ‚±äcôG͆A­¸#gëß·[‘éÄBà”Ëb36 <Ùë¡ÀLßmí8šuŽ~é‹<&2YÖ‹·ÏŸ<&¸QÕdÐM|cË›–b÷é(Iw!½ª V€Ç‰à‚+l†‰Q°Yy?ÉÁ;Š„³2Ž}©*ˆ%b*!\§Ò¢–¹Ÿ¼x¾ÙaDJ1B­¿ÝøÃŸüˆLªË/s)&&ˆcN œAL‰·)Ø®1*Îe`žÈ•]M´Ùe°ƒÌ.uêÕ Ùd„$þ ÁŒ/ž=nX4>˜œô,;'Ñ´ÕŽý!ëÓ°«3Ö§TžÅ›¬† ˜£d–äóBC1 ä óCùÈ•8$ýž€µÔêR—ô"3m *™µåµtMxvQ»d|yzlHeDž¢_àQjd¾Ž£™I%¨hÒP±­ž3c¥g¨ÂàA5’Y7M»P. £è'SíŒ}?œ>/]~¥ôVÓöƒø˜c³B¯^íßßûÓ?ý3r²·sï°ïx[•É·ñäÛ‡rrbgG“÷ŠÆa$†2Ïž=§Õ >À‰›QÐ*qf#É„mÁsú7çi™êÙܼkuÖÎ]«­ÍÜýì{_Ð¥ ýÝmÂõàÎæÞÖÛ·¬{ Ëwïîí>ü葞‚œOKòT8äí75²`þö–È“(…LoÝñ±*sŽ©dÞ’ìîà1Kmظɣj¹øu[Hv­%U!÷¦H¡óºl•°7¢o¶[vÊ s°­Uޤס…¾qËcËÝ·X—œC)Ý-XÕÛâdB‡G,Œ^¢`<¿Sµ5üPußäºá¤¾®a‹xnä|HB»÷ÈpGb„T9±³ÒP µY(- h/ÎYB«UyïAŠ÷@á±4Ä9ß0 ÇÉîr#€½cÏ’’¾.¬¿cˆLݧYp‰¡Ð» ,ÿÝ|"‡ðOF®YBJ4À €DC³€l)ZSüZŽ]åòŒMÌàÌŒyÔ=¥CHÒ1vt´§žuɉ'ö¢IÕT›Ž,¥0ÒTm.2¦+t5Ê©³8þú¯ýðÐò1«aھРY•+¢f]p×!ouhꯦvHLll@Ô4GBê x @Ñ*uïª`$l/8ëðQ¿g<â§Wq£Ji~¦ 8…‚W³-s·zŒA˜ñ§¡WƒØUCMÑÃÆ‡PÍjË]žÕzK`[A‡ÌÈØƒaÞ+P늾Œ^]þ¤¨ BˆúÃõ =¹ºàUÜVZp›PÁ’%+åò¬ ”¨|–·ë>Ï‚oØ5ÆjrßEi¡‰o™Òmbd©DYÀ¯•ù¹ œB¿ŸöelSÑ3SIa IDAT#¦©Y0, ,>ÔöÂŒ ,¿Ä©¼“ŸWsîJy;.Kºk•Z˜ôŠ<MÈf™¶Vhh¸xôèáïüÎo¿xy¸ÿàá8ˆí2…c²sˆefž$â|ÿ¯1çÃhE.0r¾g»¢ã ¢š£q^¾Ä%R„BùGοîS3ÀtE# `ó5dЄ3´Å¦påÔ,¢´;²É›N‘suÙÝôÎÐ+ÓFݙѳR ÷o!\=D_Ý!âúN§°2Ûïeœvsö *™tǨ'OžBœhƒxû NóÛ,)±-qÛâß{÷/‹Cìòç£?¡ªïXGA“XårÅv¢CÐÌyC1ö–3;:ŒZ€Ç•·‡è§gÇ/ž¿ð x ™ü§e¬âWê”â°\Ôo¿Îû‹/õ ШÅ0VïîîÌYëŇ&+æ*۸ûÒwÙ Bµµª|Ê9r¸–ŠðªñálhUviy WÁõ ³ŸëVx•ýÝ7OŸÛ“úêõ)„1zÈ.Â?¤ÉÈ »’´¦ÄH‰>P¹úe!¿&¬›öð¬jÎè¼Z½nyÆÌP5=¸Â 3hÅòåÞlÕÛij«i@+øš¡‹H°gÎìãïý`oÿÑgßÿ5GlþůmíìѲw}[áÞGdð“Ï>ÿø“ï‹yµÿðc3Ö5"ÎÖÎÝ­ÎÀÍër@§'k{ë†#I ¼6n:拪7ÏyËɘ‡9TÉŠ( tö:¶ÜÒŽ:Ó¦…§ ~Üæ`ve_3ˆµÿ8<¯0Ã|鈟¤×ÅfT1gÖ±¡OŸ™ÓÃÀ§]¶ÛØ“ ¬¹Æˆk ³Ð®Å%nXˆôSàp¥?®dÛ>˜ MèæÂÌê¬lÔ»ÿܺr³§76þê?ý ´\7ÖS\˜÷ ùž gÌà÷ ’ˆ•œX[ É% Ѓ»Ý„eʬuJ”«t¦gɉºÓ—¿ú‹ÿø¿þƒö}Þì£ì©…+¾s²ñÏþä™ãQY…:: Q \¬YOe™…œÕ÷ÇV¯½4—ÄSsSʦ}Pƒ^“ÏŸ>¥;Ìq’´Ô¼ 4ÔŠNMº¿\9SÅx]å4¤æiYà+Hçë:½¶é,‰—«U«ñ«ÞrŒZB1æØ˜^:^ŒáH†ÏÃc.U)H*åwÁ×¢YÏÖt¿x©~Èú}ZYò¹+›’Â h© ®•a½Ey°8:=ø¹‰¯™ŽÔÝ>ÏçJ%"š³j±ˆ:Q\žILb›Ø¹ÖIEÑÑ"|e <_Jukëþ½}úÎ]mbkkÌ‹ Ï!X¼hTáèQ!¨›·¶œu{s—®}wÕ¶7wï´a’n¦ÞLݼ½í°m‡pùÕcѤýGŸ‰aØiuåµÙc:ƒAi?ùû‹ã³“½»¾ÇlÊ0Ã6uSîE igÛ::æûì<$¹ë8‡; ò™ûw •5@)‰E)BMÒVÑG¢˜Äˆ`Q^¡2“}ã¸ìC~«Èí_#rZ€g‡Ð©Ü.,ÖП‘C#ˆ…L«29¯ËB[éÙØÈ3\¾+¾•¼Qˆãs (o2m±†#…o³Ž£¦¼Q{~@– 4 @5­¸„ªÀl»_%⚘`InÄèÐàŽuÄiš ±ê/¬B";VÍDY7lcǶ-DY:š¶m³ž%}c^U® 4ÐúI÷˜5׋p1‹^Á†?©TÙdvI‘yÁ&l‡Uý";éz?¯i~c°›ÜDÉÂÔž#¸Ô«¬dýÕ‘p8öÏÝ¥þõʳ “ætwu#œ¶xÝâU4¾ƒiž={ü½ÏþÞ±ÃhÝPíÖî'µ)¥ ¶ØØ¡È7éúÍ^Oð‰ua$V`6wRÔÒÚÆYÍ@ì þQ¡ BÔ¹.ó䨬é°Fü[:YˆÂÝ%§ËÃ*®h rªL”žŸŠ¯Å7šPš‡sâ(BÇÄ«E÷,‹ â^\¿EërRXm'kKCêQÛ"n@O k-õIÈãž‚šµž ÂU„ø$`û¹RÜWOmòLÊ¡±xÈiEqœ ÁÊÀÂÞs®&aòI\§Ôê }Ÿ¬èèg«“KP€Fý\«é÷‘ÛÔjì}½-ŇºÔ‘ž=ï˜þ½÷I5£Æ[š­£-ç¤ «œìv—®/F¼ô§t0+A#zÁwª=´*9ºK¹µŒL~è=:r×éÏ~öW=|`ó-ÎÍ"»—‹q‰™ôZßG õ{ËÏK1ª3}†Á´"ÅÂñ˜ñ®ÌV¶r^<"ÖÊ©fœ¯æ¿üË¿ÀûôÓÍ™dEˆE‚'ÏžmüãòO›Ž™O³‰𵓢n^ۻ㫦‡{ûvûÎíÏ›\<9rÆõíÝ]T$rŽkkÄI\{Çjæ6íÌø¢å…Áhšf¨1± î ‰xÄsxï¤÷÷ïÝ)ªvrû–0˵¥’ÿaç§H¸ÙÀi’“Ñ,Š^)vª“!…ñ§#ÌYkæp×µ«/ž|#ÞcèfY˜¾ÕóîÕ‹O¯]´ý ^_ŠHgÇÄËCž°9Ñô!žÃ2X`¶<ôUD¡2–FµN·ð“êÛvM`ˆÊÍÚˆ7[›×9¤ÖÔYØDKtÀÛé¡8—“Ç;Åùòœ7 íCóü^Ú'ƒ †bþëý†ÈŠþ¥Í:||vW\¡vÙ3#,ÅÅ5¾ßÄó¸È+¹ÆÔK§ÊÈ:žHÎ[…—#’ó‘”5Ü$•d[M¶’RÈf ‡¹RîQCs¨Ã£â“´¸ê†ÀY²¯­@ÿÉ÷2Á;'ê^8yÁ!=Á çôYx§ÁÈ2E}+”_¤6lËGåÅ-š,Ñ}ÚÂ»Ì •àh¸€Vl9Ä,ídŸtÞù"ŵ`‹òig*aš£SëT•÷ï8¾r€f¹€‰¿r¾·Âiú ùÄà§àÜYŠÖWbÎR4O—!ŸFÄÂ!f/’zËæš6ˆä&$ñc‡ö´RstG t×äd’XE ¨l?£Ñ J±Ì>‡I‹ {_Z_ªfçgÊOíÔ¥{®Õš’oŽÏVß0n’æ-1€OaT3œ…Ö´w­oPÂÖÔ껾Ägãð¨E©PÎw¥Ññ]BÆzP@f"Ræ|)¬„@:؉ÿ…yœŸfzgáB¥•Y¹<AhP2iÁ2Œª!ã 1P.¹BÞ¼ˆSvW:ð¶ [5GHgøØê}›¸ùу‡ÿê_ýŸ~þýÍí;za«»©˜f3™yÝÑØefè’B fì°_¥Äàðž‘ÓÞøTÐ:”D/“0Ý®kãº@2Šš6Ka¬5®Õ;S܈9-YÝsÝA½õÆÑ>Óíäô€1€<@]£IH ݳ+õþ0Ø|QêúœfÒ˜¡}Žh!ƒl0›Dg-–gRytfõ3(í à™6<«Gš—gù 5‰Ý°gç?‹_ŒÜ,Q9›§¥td«:õ}Óê Á ¥£š+ôU¸W¾@Ÿˆ]®Žè¾5öcf0*G´¦ÀâþÎ|§€©9 £þD=F‘ãE¿BW„ª$’)¢SòÖfSFJÆï¡ÆU…¾(.õÈﮃu‰9jZw#·°ëûåÑÁ­B1j16³<¨É®sº`x|¹àõ])=…é,’Ün¯\ZÀ]z¡Î¯Ÿ|m‚¾I„»{L–ÀŒ±ñÖÝ=,Dc 5| û\Cã'<3B’­l*Åæð-'ö¥OÄ)!R¤_ñ0a”¢É4kXžélÌyÓa'Ç(rðòÀÉŸˆpÄ}ñÍ¢¢q˜¢ñ‘ƒWï(gJ_LźW" ’}õõ/r7yöPä 2Î¥úÏ}R­o’Gº³?ç‰×ñqªL}ø¢ßÍo¿ýöÁþž£¥Îß²;I®µn”Âc6|Nd5øâÅÕ³¿ÿKX ’Ï`TÏ}ìh§[-䢹ŒßD:åáÎ'Ÿ}ïW_ûñgŸßÝÙ3Så€Áçë#oØ?b–[ÐÖ“VŒ1CC>¼‘ô ¹íîpû¬pŒÙçØ!}›ñÙ&Â*z.]ÀD bÕꎭ¬×Á¿÷ƒ/(C–B­AF7~üã?²Ü…œaÏ­Fþ+Ÿ.+E8¿ ˆ™# ¹ì›÷ï?À|o( VŸÉÁ[&ÁÜ1Ù?gT„|ö˜­ésÛÐÄ]i"p'MXïý†³1ÍO)ÇIeÄ-åñóúÖž>×nm¿·…ÈÚœ½ý[[Ç眼êqé³¾¡")äÏv pêYŸ 2)º†6m¥#îÝ¿ïðÛOL<=öܪ·G?ÆBs®kq¸”oKsú²#{¬.cuf@Gs6ˆ!9À[ «?zÀs㱦Æ9r‘„/¸ÉXÅ´±³woÛê<Áœ[>´www×QÎM•FÇq7oÍ„mçàÖcºˆ¶—Qhÿg®¶€Þò6œaj´Q@G2/C­1÷,E-ôׄrLt§…râ3´°Œ+Öá(£¯·†xqe¦2,6¢Ôl½ué8ÖøÁÀ‚t©AÈUR¼Tqo]ñé8ƒ²ã ±u±o^”L™ éý ´zN寧R"DÔ¯õGƤ,œ(ÏOÆ„S:ÑPŠzE‹ÍsrÐ÷Åúâõ!/§ÏY*@÷Ö~kÙvå—¨®x»¥Tg#›:2ÍL‹­ZÙ@¸À¦Ó ¶ghQ§~Afõ̸jªjðí sA”¥,Œ)«QEtëïì LuÅžE+ôÙ‡ظÅB`eÕxtƒ»vW‰•&d[¯ô1ÍÞæU@òøŽþ ÷ÁŸ ¶t$b´Î¬00(𨠨ÊJœ~d³áÞ¯AEu..ê{ëaa@Y5UNÚ¤Ól5¨Š|*èA7­˜ÔsÏYÞ<,{/Úi°kÿ©-F÷öv}òYä÷³Ï>ÏdÌ„¦âê0½‡Áž÷ô%úÂ2€eÐ" €~ÏÏËNút0 ! e\)¶Å¿©²Ù†tWä×­…4Ã,$2*žNÑü]Æü¯…æ !DX•¸ü\,V”¢B5q5¤tm-°¥{–²º óìc`ÝtÉ '<÷ÿ4¬þyÓ­Ê'd/¿gy<È~>xo~zåü³€L#k+<ÖzáGYBÅ‚¢yšŽáž(‘·8*ÊŽS¨mýbù]—ÝÑЇM.mÉPr¼qù§+i‚šezô¡§‘Qq )®ˆtH›¶Ö½-Qý "Rüleu üS Î#V‚¥& o ²†àïøS$b´íë+ÑM‹Eg ÷R’ª/ÜÝóÒp¢ïÓxòK1'Ù1V+¦—²ñÌ—c4Ó¸³ñÝæ-³}¼SkQƒF\¬0Ã*]§–†,ü>M­ÞBA…Ê|yú¨s8eøòË/},tÛiGéÌ‚—yY3€„¥¬Å¬öm§[—’ܸ\㌅ƒ©e ld³³³§à öÂ[M0+®Ã¢q2ÔŠùgöù0±ñ‹,Ê~¥@¨6À6¡ó°XE% “bxr .~zA¡œ5rz*’­ëNv4ç”ËLe§Õ›Ò"V—l.Þ$$Àîê”·D»‚ú¶BìS^ê¸isMÜñ±Š¸àPXZ5£¬¶ ¼eö`aØÆOÿÙŸh´‰CŸ¹íHó7:V½§Ýîho[#¼Р♹Šs ƒOZÊ[;ܲŽH¹.¤Ä5Áé Fc YæF±ñRq‰YHw?uT„`¥ZEL ³Å~ ÝÓ%¸` wê0= ? wr4 é§`¾tÑ­Aq„»¼ôHQZã®Üñчfo„™}*þ ¬ûû›ŸÿâûßÿA1¦X4…Oµ@µ¥ #M. gIG_â†|¥ºñÁ«ˆ"#RXA‘R%~êË2½à–¢x]×ÿÏÖ½üø•d~'™$“ÌL&_Åên©KòXÀ0lxeð_à×^ø10<’FjI3ch0+ûïóF+/$ÙÒ¨»Þ¬"™|“E¾çü2Õ|+ë2nÜ'Î+NœxÜøi/r¸ƒTõ‘€ßœ2’äú̇i‚pÐÞ;=ìéD°¦‹Z¡¶\ƒÌE¥ji×’á‘(6í¾ ðx厘pvâO“^îŒPH¹ý×Ûü{Hcsœ~M p’²4NÁÊY"'g~øk%'–/Í>gÏc'³ßƒ8!aöî˜ãYˆkÅ¡cÐÒòÝ3õ=­£ÉàC´‡ÊQK“î›@?Hw,»Ô3εù 94i—·ë=$TJzK9ð‘4E¿¨”•ÃË-ã0TÑø©húMè&0Ðf?>}ê\ÀÎä” ÉÛëC(]¾Ž@ TLÓÕQ)L±Rk+Ž9þ¼½%²>0Ò¨¦¨šÙ„*Œ¥/p±£.ùᾚsf2Ÿ-f}?×|G_Z¸äxV¯4ùpãé³ôøñÊY ~°>nÖ¬¹5XÕˆ‘2qo”1–دßÕYö‹®vs÷ËF­&lxôÙgrü™‹RP¥¤G’Òj7Çõ˜ÄÅ­™ zeEÉ1 :¢¯œt ³ÙÚŒËAço~ó™:5# µð i@«á“½P—Ñ>%‚'úõÊÌŸy¬}$ØÍ¤Ém¤ºN¾¶y ¨íšS %N/X½¤GÅ€¡%dó÷C^1ƒLâr7Øhš¤_’6Å?¿›ÇÇþô“³éþèþÐ÷Uý²Åó§~?C›Ð/êôŸ?ûÞ`Õ¬[ÓÔíBôæåçãÆ(g̨o´ã{NWb?­¹jdîã \ÓÈLÂzYžý+sL³Ї·V…qï¬È<áŒ|'å8Rû¹CÁß9ÅûÕ‹w¯_¾yùüå³§~ÏpÔíØŽç{Ï—/M® tDHæâ°a¼„;’Õß6ÑTs­E‰8È„Ý|ûíw ú믿qŸyè¦nÛÑsâ“},F^š °Š=àÌ'µ#ò¾jẹcl·|6â¾c¢öôìÜA'[4òICvüÖ2™)AކA%rÌ·+nÞUUWÒ¥Vi|¢¢êjö¡î¹Š“±|Quy„´‚:¤ëp”‚ý΋K©VNöu û6 |MT3P5¾ê›[Ìn±u^䪣wÏ?|4&i±]0rØ1Û…µðk´ê’/öbЪ&mÒ™YÀà ›ö!TaŒÑrM¦9у”pyþ<æ˜6¿°ÊS0IÂpĉü-ùлkíBäf,g·$Th—ÃêÌ·šWÄ\“ôªó=ÃÑ?ÿŸþ{k’ׄ@/,%ÎÝ2è~.ðèñÃO¿ÿŠÏ=R§c´“öíkÖ_å ƒœ¯¦-u& [Ÿô¦>Äx+ÒUãÏ~89ñ½×Ù¶ K¼¯^]Ø>¢ô§¶È‹ö^Y27¨Ú $céìÈ‘mx'c’¢L›gOOM-’ÔéIýýD7Û*4>×’˜‰¹Æ3b&Dê§„åþ\ׯ=zôHŽ›8Hn‡v3¬züZŸ²iNì¢ïÚ,¹j{5D²’ŸoLšÉì'îÌ#|(©^,Ì ._ÔØ IDATCh•«sǵ&*•¯¶k; Xõ“ä£×`Jñ½Êñ<‹G?9z$IЮQéÔrÇòh…È BÓüæ^—L~ÒÐjHÃ…k´ Ö¬4ÑsëÚýY ÑÚxX‘“ðKè 9îÌ}MÙ!‚œö.“aÁ `\a•¸Zõf¸ò@¢U,Q;wÀð£'–Uùðì[™öl+’^â%ô$¿4£º~²(ëÒ0.©@[kkEšB4Œ@‡.[g" 3–õpœ‡;òÜq¶<*˜ £ÖÜ„ê$("BwEˆUzyY¥UoJ‘u°GD¡‡‘XÂOD>ÐU*ÞÝ£K¥·j™(ôèŽP† 'äJËb)ÿ14õÚP…°äëßLd&e8%h IèD1¯ôîm¾™G ,*bã­]2oѳÌ"‰‚dÂÌ$d’¸ZkDÓrbP4¬± ƒƒ€.S·ñ¿‰@xÖd:P¤ùÔkŸüʹÃ>þöÿnËo¸ÚÒf<¯ÚÒ¦ÕØ^*Hx 6§R²­Z;t±ƒŸ ëæÑ¶¶$±H6“™ƒ$.dºð(ü†! ÕÔáTë6º)·pŠkK¶Eè>}ÉÁÈa–ã)@RM=’ÖÙ§Þ«%U4ha^ø)W#¢P)}ˆœ7D_ÚH`ìM°þ¤v2¶-G1ø°ºTºòÁÜî8Ñ x<=÷:L­CA¥gˆï–äFbK0Hà!%ìÿÓ½%™45$hrºrIm4H4WC)¬kpô²:ÆzÈÑ¿}c«£#ºï=zø¹¸üøøì³Ï~n üu¡Œƒ–Î9céH~òîä̯šQÍ»·vKú01\5²YÂÂ~d®&ô`¾ üú믘Œ½D²·$òâb~QËvú‘, JÄm™ÎĪÀ®¿™²f@².šƒÜ¥KÖö,f0SF/Ç[+TäÐlT.fÙ´ãìš뻘Ä1ŠûdQN®Ÿ´ëTf&fÉC!lÒØ!:%i©ÕOntO­`$è.sï ¦i¯F»èI „‡Ä‡þ$?´J­Ñ0n F ž²À{ËÙ §˜ÉdøÙ±â¤ x›“ÙrÈ€¡ýËŽV*ÂËqL»ÊÊD:{ mÑnë"0þxýiDšéí©Â*íô‹h@ $œNK&•A/&9ôC،üÈîÆÐ¼‰×‰ ‹°hötмdŠƒyV~Id#;…b>a¬›Ò±,ß´e¹ŽVtN.®.'”äÙ럔Ū¤Èœº>nŒµùµ@ºÁ#ˆqãú31SË.ê•éR£ûŒB¸]2¹d­É_z0³_8*·ìlU/…‰Ð¬Œ ËÄ; «M"]šÛ,œm`!×Ö«8óV\>ÚŒM5~!"¼2°q®ž+÷¨MP ¡ÌL ,·Ó~ÝÄ>Æ£¦âdÕ„S•XÝÇpTÑ”êЉ°•¹L¯à$´D1¯° ä’ ¹WØÞ|wøå€'GWÑŒ©œìÜ&TèÜW+ü÷ï_ÚÍi«ŒÂÛt„ŒYš€s¦ùëõWzŠÀ鮊¡Ð¾Fh&f.ž?÷Å6­J Wc¤ëE±jtqª(\§dèÅѦF9 ©š=”&Ì– ´qTê•y8]¸ó“žº[äÙ°ËfaYc!qqh“y9‘ fˆYA‘œ8yK¾xT$ÉÌºŠ ÐˆP»º¨È+EÕ@—ûææ8+¿uk›2Ìøân¿÷{ïÑã“{÷~þäçýŽ´1ÆON­È L~HìÕ+‡ÀÂnôæ'Lî[~õÅþ«·ŸÎΞ?|Ôü†3?,Ì5{ä'S̺ëMoÂã–•8m×19öÐhL?©’ynº$ÔÅíŒ%p‹¾[¿òêå ŸkB‚E‘™i6á†qvÞoÏsd§fñ ~áiÉM1qVÌe¥Íf§=rÚDLß97AƒÈ‰¶µ(·H``¾ƒC¥”wÁ€lþI3˜óÑ•â1”ÑXÒŽGÚ7%¦ÜÀ’H»i¦Iš‚’h]gBÁuÑ4=%´ð„ì/þ%@¾Gy–矛WhÄãàò)^ýìgŸƒ÷HS¯ý´|³AJÑ2“­õ¾j>ƒªÐ¢ÒÍ(ÅÝB(e_±PnÁ¸m–ö(³Ý?3AEÑI‡Xï= ÁBŠ6ý]óI„%“9)Ž trPÒê‘pg-ÁØ1QÔ Š[NÄK£Pý: 2Ôn‘•Æ‚/±ïò¨Ù@ëøJz1ë2ú,|™z½nHÏZ[UѲ ¬k5â^-Ó…û ÷â†ÔÝO‰KD¯ål‘J^^¤$ iŒfQ5Íî-™ëø02bi2NR+ègIUë§uü™«ï¥gŽÆN.»ðЊD±h^ŠOu¡MFõÓš €f¶¼º(Ȥ…Ë8F ÕEjJt+RD¾k¬¥•Oà6*ÝM0B ¿üýÿà7¿þõüGÿÔ™R©À.8W&Ãï¿´Ë[F‚m=ñnÈ+s[\kô ©ˆ$³Á…;J¼Œ@dÊAç&@’¡|RÅÊÕ[wšYŸê–E¨ÌqB2È‹­³Š˜½T ­»ÞÅ$ä"3)”™IÀ,ØR»Ò lòÙ9–É|ýfÈÄ ]JaGÂ[>~]´+Å86õs yþ°‰lÓTo’@9®rzë3 õýf«6-TMhnžC ²t)ìÒ) ˜[@*üÒ%f)Ç#bÆ Æ†çq33ÄF¤·Ÿ–ID mEˆ”ã®f¥á-.æŸ9äº'c냜儨ÜI° Jï=³¼8U§…4lÀxþìéLà5¾E¡‚ú‘<Þœ6ìúèGÍÁþUÏ¢JWtR·mØ+ÿdÆ#µ?„U´áÕ6¨è ÀÝŒ£”P’_¾º`u'§ uÛ2¥«ã»B83Ö„³Ñ T.”C‡†!x¾¾šÐô(tÛH¡“¦$@&Ñ­â/^xå×6ô0)-Öqqj_ï:]["õ “(ŒK›óž¶xÝ~984‚1%–§‹¥«N[„P¥&;/_ËÂH25Ix%Áhé.ßb ²]zÛÙ–]lÍ’qä’:¨8ž<“žãi Û„:H`¤ç|uiƒ^ OO}Þñ¦ÀÖ 3ÖÕ¬rr—¾‚dtBLÍîóœä¿ùË¿°…ÑxOìãœIpûÄÑšàƒÇŸ›iT=~òù“{B¢Æ,B’“6™j|6kOÛä~ç÷7­&E²g)9MõÓõ;6?žš9P¹¯ÏÂtÒ1cí·gIwl”½srì,oŽë˽:KIÙtÅx‡Y¶8Øeä»i3ÌÐ#bšÊAU´ERúgÆÁ ôXÈ”ã;ä™Ó_ Y8}D Ym¦p—i!òÙs[=ÊpŠB&ÒnYßÎI²MFIC+Ðñ$÷ùìyãbÃp‘@g„ËqéJLÉè²ÓØÍ›50ˆJ”z¦GQ<Ø• ”‹ÎÐ ¹4z4uøq4‘¯‡Z&’õ‘”°ƒt&†8Ô¬I“/im¸óÞxÓÞrÅk.Ul+rÞÝFT2™,.Ñ÷ß}¯1àU¿øâ ?G*º²RCf‰vuù*S)[ß4RѰ^÷' á²ÓòÅ6¥5˜®ë*rCÚ&›LÎòŽ`¾Üß¶nȘ‚:¤ÇÜñxh*•o? zÉØ±Ž¨’SXÊ~ì× Žñ¹ÅZa´}›uÒ`¼QP/²2wô«ö›Nr:sàÓl¦VY¥\D'6¥(ÀÊçö|†û×prºè| ®(øX*$GÒå¡L•’†W.Rè¥_l8ÌÆqjc…ÎÅ4øfͬk» i %)½´9tZ‹¶D1f¶jÒLv ´ü›YñXÃN•Ï%ß¿.©¦1êÈúHœeyÒåpߪ09;8ñ'êp>&ÅÕ¦ÏÍØñËß#Q§ÞK_IÙö—¼K Û/ÖÆf¤«Ã¯BSDîúFÌáŸáqEåHžÅéÔ±FÝëXÑÎoÔÂz€-/~>Œùµ@£…ÖIh¹š­>ŽIxÀ@1¬¡0j]°mÂ}Ép'ù уZ‰…Á‚ªª¢v2„™¤Õ¥ÈÆ#º¡£|!Ùâèäeµ3Ê×Ey›¾a!Wª £Çj”:ƒœ×oú¥ α°U¤õVÍíÌ£ P.ÕÕ|FðÈ–­çó(Í{H,IKöÕ]ÙÕŽNŒ§@¶—åÎÔ81:öò¡$Ýå*ÅU'“‚$fœ°1UŸ ­·^Ä‚ª%PBÎÚ 9ˆLr~÷úÂþdë4„ÌçP¦Y]Û—/<|„x°Oø¦Ho‡a‹=r Á²¥I4À3…¨B‘©¢É]ÔM\³2ðZ—‹H”, 1‚Öáˆða3RÃiÿvÌ,ÒšeP$9k—C`Z™¥€ ðˆ=Ö`–nz†[óäAÿÀ½£~`ðÈ,­j ò‘Þ@Ç:•ª>x Õ`*%Î%ÁŠ=‹6NOµz,+e•Ã[â¶¿Ê&´­pµ®¢•¿ÚÁàÚiG¤7¦ÞÉ…™°C­ÂfÀS'ž1ogÖt&:cì( ‹dñc…Ä‹`"U¯ÇÁSÇ ­RUêQ á톘ó™]m­î¦ß-à{ƒ_‚É]aŠa ^éXv>ƒ¶hLÑ¡ÏáÕØo×Ó?ý“?Ñ P­b&•Û¹h)_s”Žaµî‡(ÈcX7_Lã“õã;6­Øsî‘‹¡@ì ¬…V"rì òG´hIëþOÎÏ °¯H‘,îÍjpeƇ†¿ŽˆèÇâ³!×Ͷ2ðüÃ,µõ¡9à™¢ñgÇp­3´‡ÕhÚ­ íÁÔÆp»kFAj@iævºsÊ#YíÖA1-ßjÌÛ¥:±i9½¨”À/M“[¾ìò´'¡¿fáè‡v¶CËÈ{=~q¤ÙKÀŒ¯0¹¥ÏkÝ)BžKö‚pW³0ÍGÙFÓbY¡æX¢ Ï»¾¨GÏrÊRÙ€ùêcÊÒómÈ­¿ÿ»¿»~®©hâkÊϰ¨€´ívÂäÜ:{@ZÆ C6ÎÐ.„ÿÑ2Q7Å}ýˆN¬¦‰X6 íƒaoŽÏÈM´ÊÓw÷0ª%׳×}p†PÎ s–ŒI¾œŽÆ[¡Àx£ÒÚ!(‚%(wfÈUÇff#ˆŸG¶³Êþ1hUíe-m~ƒÌO¡*XDÜ`ÀðŽ¡¾ç8ìßCé}óõ7÷œ“*uªÅÄ?ýJ€äÃÙ4{¤A‡ ´j­ÛöCc¹9[[*uB½¿Ÿ?W]mÛ4R ôfCÅýœµÿq…õÍ\£F®gJ›0D*CJ­¶y“­Uw"B2ë¢ D6š¹}l†5˜P¡%È$aŒ™Á,Î7»:ùù#ÚWœXè’úª"ö>‚«§"Ù1Ýð3nAÉ̲4eiMAÙØFý®¢ì@ûFƒ¶ü¸9A 45ý"Üâüæ#[ùÔ2uÈü’¶tjAðèÉg?<ûôéóÇÏD´:‡˜“„¤†@@ bÒ®‰Rrà, ™e TjG­9`î’#hóD.(HÙ*®Õ(äiìñ<1Oc<“5È•`F5FRä„b½°wµÔO×tEНóŠÑ£{†ó,¡A‡†Á¬Íš\nn›mä¼á„PÜ…ƒ¡I^þðR"]ßÐmsàªDX³t.<ÛKxd…cÆ}ÇãiümK*5ÜøÞYI­‚f;@fUÆ‚~ˆþ8±ôRà<Ã'^§ÃàAgCÆ9¥™‚]‡ñ:Y2ç>+n[-gW¤P[‡ÇxÔKJ´'ò -¤Þp@Ô…(Ö[UC²všÒ¡Ø5aS“Ç+7ë†ù`À·v“@<üZš"èInÌ£ØTÃ!T·cl÷]~X¢ß˜š-t‹VÝ(­ê‰é‡Óê½L;jœ>¾¹Nuä•é‚§»he-}l³2¸)~¨ ƒïšÖ„frf4ÿL€MoXÓ¬?-"ž¦U¯ßâI¢ã–oíGÊM5Ìæt[ÆhÃh¦9kl:õQŒ6ÂDóšªI‚ð-PY©òµ3+Ùö;–ÜYKI5À9%›·³>?¬¥“3lÏ~|n1„Ã¥»´{ÄJ«áˆ¦›þ Т쨬aƒ„yvCz­ Lž^ÈAÇkÍ9û&2ÏV?ÏHRSù˜zã¬V˜Nkc›0û扽!4Ë—XÌÇÎ6 R­.ó£2í@2C§ú=|¤Ñ‘<°§ßÿþß¿ö‹ïocÅoÛûüìÕ ãýëõ§„®yš)dÌœ}2 b˜²Qä×N:"ϱæÞj~ŠØ¬^ÏÁ§¹Bu™ÔƒyÇ‘AEÊ0ÕMMN³Á< JgÙe·OçŠÒ´cnÅ™—1ªµàÄ$CC´ mÀ!Ÿ=âüðÃSOCz-²f.bj¡ˆ§zgißD%!=Jš¢Q»Ê Æyº E·‘ R&ýi¨Â/ú†Ê#³ Gx„ª„_|À% lk²„ä?ijÌjÙÂP»ò5K~žl±CÝ›¥oÕ¾Õ‡_;k}Ðá ÓÓó}ëOàcÇ äò§6· ‘ûfs$– AåÚŽ´÷ËFžÏ‚°™-î…7T¯3, ×ÈÇÔËxfª”·rbg\Í)»ÚDêÖÿì²èÖ4] /Ù?†H‰fC€:] \Öˆ ñõpÖ5lœ[×UÇFK¤šÀ§o“ƒm³À¼"%&S—½¥/Þg"­™ÃÈ×Õ jzÀ*€y”S›gy¾:@VÚjEW°qyFiDë§@!6U±.˜ZŠkŽ"RÅ•¢ÊGÞÐ.=~Ù±hMÈÃϼÕιzß$ûT¡>œ¬l;úÛq‰Nù@µâRd·‹Â€6®AU·‰È¸˜)CT®×•ŠzÉœ¶_ÌÇLQ¿ü §ß’˜î'W‚ÇEåŽqÂéJ0íÙïŸË©x„¹²æUKí3# =E¼•Pcªâ#ºJúGçjÖ‡/§÷ŽíKè³c{5/ÐJÝpZ¹ùXÁ£K¥°¹ïå­êá´ZŒ×^Às:Êñ{“Ú\‹j ºËc®y5f9[y°¾[.‚Ü©#ǺÎl½ºtçJÉ/¾l‰?aèÄjXC‰0lÚ£„âràÜå(è’@Œ·ljáe^’WL¶5ÊTУf É Qãá=ßµ*[”K*Cx8¤=+„ÒÕùiï5(“¡ÌglX½`\0¬*øF(©%ÍRšW;T[GºrÀ³%€Ù’W`< :ÓМJ«NK”¾jŠÀ{ôJ;Ú*õëCd+E¦§>úÕ¯þ8~úYbÍ¿ZÌC¸‹æP`Ñà.ÝÁP:Û§©Ù²ýæxBNQ^UNÇ;)ûãú8ßD²×¦%lÍizcv¾O;ÑÆ¹Q=:EÕÇ6¨J4uqó9¡£‡ºŒ &ºÏªˆC]îÓŠ£j«\„þCŸK ŒÛ|FKÖ¢i*äíW.^ùÉOÂc"bSƒ§ID¬bÄâ6¶…}g÷‹ÓµirÀ%©ˆÚjÒÈÛæUÿÄÝõü¼]6ŠuI$†qyxjý[o´¯ ryTå!Ã%gÓØQfØêt5˜&l‘3ÁòVë"RÑjÛñæÃ=0Š[ÊàK™/9èo›½3öÒ¹ÎÿN2×Á÷;¯ý¶¼ž²`²BÆŒúx=Óo =ÉGèA°œñ5ñÒºØ4fµOÑmf\èm‚6Üu–#œ3ÊùòñÀ4®BeeJ œ*Uâaý†ÒåLHãàr ¾&½M«âÓ-M{û8“Þõsª_-²Ín‹Ñ0ðT$²a{#.©v˜á‰Æ!D6sbff³EV Sö“-¥K§‚hÀ­ÈÙñ4œ#¢NÖæËTÃuNNÞ0ÈéÕÈ^IJ4V›–Gß–šöPÏ(j¢¢&R‰ §c¨ö”n4h”Bžõ ZèJµ`}ÎÁš"«G2 ²þ².¦lë¡ã¬ò8T)³·#SÕs!Rf›YǵqeCE}04LÔcáÆA íšòj¬ŠëæüòòÂÜ «í‡{ùÉ—Â\ ЍIYÞB‹RÑʸ6±w¼@UsIp‡É.^ÊñÊ%-sÓ‹d šf–©T'º ?¦™Ò— wu<…Å}Üî²&W/Ñ$J „"¼QJqô3¡à†~w\ò+4$“vI\Õ2A.Ùî ɦ·ºæ™÷ïYjOªGN½©'ÀZž#çïîÌÒ8iSaŒ¬•Ω(Ín-$°µëêä@1TPš ñP­¯`6 { 2 ~F¥+™KðÄoy°it‡a*lŽRŒ6³4RÕ® kêÍ´\`HCÎÊDŽ"2GY…Óo¡:üâÎ_ù1 Þÿª &OSR&…JhŒ)µ+½øQŸäQGë²å8w4'ïÈt­ZÕ%ajбSµèÇ+øG¤ÆhwºBV¨Aå×[i}‚öú5 ¯fÊŠ[OÈHJþ®u>+4e½v’öº54€Q#/íÕzH~%2½†YCÞ~$LuÂ>ÍŒ¡B˜†é ™L fwúR/áèv@Bö§,02lß3HîÖ#í®^ùLNE„U³O2Ž…»ùdˆ$"9ìäò%°‹T§\ô, B¯Å—£š- œZÄH‘±Š"¼KÈC3—ƒ¯”XÔd™èØvšw^뢸M5š#8ú7ÿú_±qŽÀÌ¥è¢t¾0rPkQ¶3Nï›C´Îkg5ˆ‡,8¢•-«e‚D‹‰Ü™ÂxÀNÆjQËNu¯†áªÉNy‰*EW}¦ã^~bìК[+BÔÉhk.3ó”!òk¼ª¡k=âTZãäÛÄ.H@³áD~¼‰kÓ0µC}° |ûí7ˆ4õmšE’ 4òÔ‚F 8²¹9¯(Iì‰0EØÄH¶Yb a!)Á:©Ù4™ã-niMF µóHjm®î‘^R6œîJItÏËü£O³WyYÇ¥û¦x¯hZ×vzDŸÖ{|×"}_.hòæ¶C³©¬” 9 IDATšúz1˜áT!¾¤UMPñ#(”£¹zÔæñÆó~k¨Íª– i ÕìÞ#~— q²e¯ø‚gÍN²²«*¢Ù¾ã÷¯PÌò'`ÎR >¯@"• '!C~„OƒGEÕUSœµ4 0*S’”¥åõb^­lq `Ë22¤ (µ¹(ÑGÚæ3mCE[$ªˆZ«¢|4S½Úo>倭‰8˜xUãѵä+Õ ¸Ñ›Iì–††4.¿àîë"Z_§Œ2Y“€VÂ%‡å_>"ƒÁ€A¥±øaƒ02LuGžíL—F¾ÌæÇ|ßvˆÉf0[œ©~Å _ kÜE™è'd2—*¤ÕℼŻªU•cäd$2&+ÏÔkŠõÕB†¤Þd2"=<ÌíÅ+ÆHÖ/^ü@Õpܼ}jý×ÏÔkâ *òX‹Ù½°¨–’y[[’aJm«LÑÜW8[ÐãŒ\m_NhžuiŒÍBAp6Áž"‰¥ñÞRR»V´îkTFöFLqÚ¬c¦’ƒFnëyVûKü® "ót3–2ãX|¼­ü¡r©îÈ e ô¡AÆ:@x€ªºóKÅ‚u]}caÚ©'3Dü푀˟ 8XÓ•£1~ÐE’L<®Ÿ”&„5w E!g©Ó-¢g˶ÄóÁŠ—RÚùê—yÌEŒ=oCaE¦ô蔊a*‰$¬¡_ƒ¾›[j­…Šq‡ ¼ØE2óÕ|~FÎ8¢ý%©”šM63B×eJø#nO•µgtczþ0§#.µ¨Ë[¼°gz3°ä1€“³^HjΘÔ%x÷̆fóí$ƒŠx¿äé÷îГoÙα&iÂq¾aÇkÆo?qÌy4îqq93MbA;ná›3€¢M&MDbäÚ¾•nÁ•¤“7P¥!ãÜZÓúyÝ’È|*mç»G¼Pl6‚ÞD*l';ŒbDñÝ -áUÄr¿¤—pgÒ`‡GÙ-gßG)ŽÁÈØöº¯ä¼ä©ÚµeA&ˆ193?cY³ƒŠêmlgÒ´úª®©»ó”­ù¯"Ã\gÃVÞ ÝI?·ŽO>8÷+*~¬O4Rcm÷ÎÙÑŸÿùŸ6ED:ïš~$Va ¥µ©¸™†"zCxŒi›ÔË»BÊ)ªõ`ËÃx#Š©JîcæªV5¾‘rZMÉuD_…ÜÂËûõM—SûøýS;Γlœ(8Î]Aµ(è•þS 㬠,æ• Èc*7äí"ýñ•&œÚÖ綬£ºÍïîÓ*êã©mú¤‚ iPÜ îA<Æ F‹TAªm¨Q$*Þb"¢—Ä3÷kŒm{Ò§åiü…SámÖ¥¯mð”ÅÔÆ&ö1A¸S‡Wô"_$P"__ŒƒX„­JÕû±Ø•ÓðÔ¨è²#¡¹0@ŽYŒ#@Ž´b,­ íjço bC„&ZàB À$0X=ƒS©½4Eàt÷J¥[cæ]?žÐ_ÿÕtÀÁ¯ì ³Z%ÌÐ(îõt-Nà\ɾ¾ŸãØŠÈU4jIFA÷•ؾ%h‰BË,p§F`w)^…ðC{Î"²Æ½%µ¡¸C(P -¯ÞUª”*Ü0+¾ÓZÌÆb«v¤ß‘¿b! Àiüº¹U¡ (/#ö⎰@.ÀÀ ›;xwŠX3Œ²îº+eÝ—÷­‚ö_­P ¿ Áœ!Žòòw³º‰ñ}oÚÚQjúöˆ’«ªåx ÏÞåóN¸Èò¼ÓÏܲÀD3Óe1DØ]¨ˆK½îõ[{ôN{­z ð–6¥U*í0÷z ‡n|èSAìÕQ–"rŒjàlÇ¢ÇeyÛ€·:-Í£²–ÿÀƒA©¾ç˜+Õ`A&' äz8ý¦D׬¡@>»ÓaÄþjÄfX9ØR)ÊÝaP—Š6­,Ìð«—7A*bX< ô;xÿåÓ§>h2háy’¶"0¸$ŠžË¨õÏ\KÕBVß4Ÿ+Q#IÀ½/˜".™$v•ðh7·²Ëû*à ¸[Ü=^áWdsT!ÓSóOìP«¡åÊÁ¸kSJ®š§ °=eU“˜™³Â{/g¥P•ÚJ[ÒRnzˆr5*ï¥gFQî.SŽê Ç›©o­[›ÉL«·fÔJxƒ„аàZ™È÷þ fÐ:³»¥¯º³´±¥PËAwy¾šØPU3—€VÎöåáq¿ÂC3TË‘R§¸æ_”ø’ӭɨÀX{øAºpÀi>ðE–#ºrÇ >PO¤`é§êÔ ÝÛ\EMÊ\ áÄAþÓê¿Á˜ê`À`&BqŒ« <îS5ynd°}v΀'¤84=Gêõúp3(&ÎÃ;šM£qú½„ k`V*°¡ß#ªÈA¥+XÎù`fW^i& ”<±Ý¡ˆÇ!#‹]%bm¨wËÌB™NìI Z^…Òšª³Ê}÷‹-ÂAÑE‡~ù®1ò¼¨þØûÖ k§ˆ‚djÌü–xˆÑÉÊñ8½0×Hþ0d³¥Å ´ ¡Ý2_ƒY"‘¯,œr¤YÌJÍU¦%7xHÕ[ðL€Æû›/¿ô-¡ÓêE´qnÒ½òéè/þâϨ]#l¨ýüøG½°‘ !éP \rÄ ŠõödÈ>ÓÓÓD±h°7Ó`~«¹ƒ&T1`ŸmÜ΢€(„×@eŒÐûа±~\¼kã0«3KÏ}É3•pGu%uwâªCV ÕBGÐÚðkÚ‰ÀщlúÕ÷6­U8·¼õäñg?<}ʃܿî1“¬/SšUŒòÜIR*6‰E¬À¦UŸ«Q¦t£DØ»j[°a^$§x\m‰¶SÊ¥o‚ò½ ” ¼}ôêê-ù¬X«Uù¯‰GXÇŽˆB84þçÈí£÷™ŽRŠfˆÆx†14òžÑù˜Kv£í[ŒëaÕ/^ø!Χ!CýÃ?ü&bÇäúágä‰Af%—¹h ©HÌÃ)!‡x—¯dÛ”d"À¦z‡ Ë‘MÈÉätÀCyím¬\;!aHU*S’ª9‰ÈklfÍÞ¡$Ál=Øå´ù8ñ‚!Uð&Fê€I†T¤Àü…V†B;GQU?âÃàþ#ÀÑ5_¥+®õV܈$ذ å 1êbó(4áLjtd“†˜ñÑ-dc§/Sk3>”† ³|H%À‘Înaõd¤Á‚Æu¦fF*¨ ðdDJÂÁÈÈìRSÝ ÎYÍœ‚úù­u(jË˸ rå/-ð•¦XHr€ ·ˆg F(®+Žl‘´»ÊÒTþ· 0S[6í‚m‘xòÊ· oß¾äaÎî=~öì…ýè F`0޾"—i˜©]Ž„K^Ìåµ+Ø)XŸêÍ‚¹/d5¶†Û”›(DD6S—šÜÌ£"-Z»³wØ Y<ûHÐøî“vÅ4Nˆ>_/f&;O«žCÙ®ù‰$í€&u®Cl£g"ߊÜáˆ~i¼\–Í dRMhf*t€‚eê[lÉ¿3Õæ\UiàcœX@Iv.*:²çRÂ@ˆIŽ\Wž(®áµT¬Â©+pÕl抗e²|µjÚ)².­°+wuÏõÄ{áBÁÀ?ŒÔ;IÙÅæ‘Ò¨—Ø€í+0„06–ö!qÉ©ýN;tÊËÕLƒS ÀZPíz.dy_í㲤¹qÈÕ¸lR›ãx]àÝ_¾ŒÂ¡¹J‡*À6ÂÔw*ŠWæ÷Ñ)ØŠŽy…ÿ™m¯~L™f¿)vÅAzœX\ÜØã¢BÏUBææ»ƒu?¤{ÐðùÑQ5$éËΘ(¤á¡ýJfãè°¬––_6E.1W³î‚9#ÇÆ >B×· \~ZÏRº²‚®¬wLw«:-ŶÃFÚ°KÑTyè‰Õ׫¬ü>xš3~¶˜‰*Þ¼6:êg9Ew\O ÇØkGaS{ñL¡cQ§›?š‘Á@ŒŠ¤¡íõІ§á‘õ©ˆôÊ}‰—†D;U_!ÆB/ +Y$X[Q€dºÐz„Ê£W¬X|¶ö'µ½µŸ}Ùš=dð“†O42,õÊY¾èzÅ% 5F‘egª5:ò¬uIËÇź3*-˜¹ýÚy†Ÿ~r釸ɉì(õÙ ¢fûqæLèoßm»O#’bÃ6•÷šŽBσí¬gº!2&“N±bSãŽÝ¬pË ì'¾A¢:KKªöfù_ €Ç³+î]»^rLŒ'Z!ITF(*',"@ÙHDàsE®ùÇgOm<ô•œ†D VEÕÇ7}F{džÎÏ'Õ?0™×èÁÞ¡(%õ«õÄmıfæX"rg±(×Grø 9CK#>³‹ëšsðûA1R`@¢, ÅD"73nQf/Ì6㫸Öqªó•¬Uý©°àf–ŠÖг•OæðÒÞaÂPõ6 øîÛï8±"ã]k×KLP¿ò·ÔFÇ·N|¢¤À¸‡Ä,dB•1å6û¸W´a˜Â ÿÍ׎ù<=ïÌ}™<#Æ­” äÑ&æÒœÖ.5] %mVhßç¢ö¶”ÃRð2C+¾µ˜‰÷Ó@N†š­Æ2 3ÆÜz;ó4“¹Ù€hèÇ›©Û?49LÎÆ<Ú‹‹gF4>\èÝØó90Ž`3ä6–¶eäÈ:¸ýòÅ"DM†°ÍªBÍØ€ŸœÁg´{¸(ÛÒWõqµ¹º#!|ÑJ®ÊÈÂì‚­¸~–Õ¨ÃLóŒ /”2žî0¶£ ôŒ©^mÕá1ÊN Þ’a¿ úî :C–Њ@!±:£{‰5ÆpüØXaS›ÐŽ´ýØyÞa7UðŽXgMª¾ú¬W+ef͈ ÏT’ý&§ óæmçˆæÂ'˜»í(èxúh®âµ:°O¹sr^ïcK©Ïˆc¶Fb¶i:0ô`™ÜÈD‚@H†Ï…qÈhqjV–âN‘nÇgŠ×Ïn)Åê\Ò›ðvtÄýæ±Q(ÿ(SÖU‡Ú|@£)þg¹ÓÚÉFw¥]ú{`hä›|Rìó æ«:ß¹Ó&É™­:²#nu=} H†¡™ø³T_ÖÎ@ç ;]ïí÷ßÚÙ5ñ%ëöcbßáûˆ½YLÓá«‹ï¯_3d¿xk…Å6ÙOHÆîw¢Ö"éÉwvQîmöò+Eur·³@œî@”@x•Xs°œ.–±‘-¹&‡¤Ð4X2!:H\Ò ’¡r ðV¨À1 ð2‹•Tõ‹Òî« 0¶>: ~Ø8„Ñ]‹ùé¹@BÂ¥ÃU7¶û0{ \šI`YG ó ÝÓ#Ÿ-Æ 2•ýñ§ÿ>ûüÉИ5ÀÀ ?X á×£µ>36fÃæš™›F7¸ƒ. s„¡4Úr&®µItš_šM½ Õßá À mÅ¢ —F4VܧÇ`ýÕŠæO“Q6ðW8q¹L]pjàĵR¥8õ'ÚŽâÚ|¾e–žEt5ê*($gZFƒµÄ™«½ì$G;t+Nõ⛸ ¤§ÅÛÎà'´ëS¶ÚþD'ã¯Ë×o;á›Ò¯³ß²òÄÉá6›T‘y*›ë&騙¨U®Ì›»~ËJgHðQ­³>v>žN0Øwg9kK~› V çåÅœ°cÐ [G`Él؇àZßþ~¶Þ*;û[²Þ4¡çÅK?¸W gc].>Œ¹u=Ï~xJ àµÝºšŒeÀ?ýwÿÇÏ^Ýxuv|OóàÑc?Ã|뺯ù>ßòEôÓ;§Ü²^\¸¨7'ü#õHdY[!•m4˜ÉEºc˜ª&(ÊÙ­‚Q(­âŠÉ›‘XäX(cæàýFŒøôß'g'ä^d–DÅi]¤¶¿Hp²a#£µÎyß”éæ3 i–¶òÔÈ]ë,ba€±àNùÑŸar8Z‘õxœkígÒ4h$tøe7ªãÏ|ÚÊ×ûæxNîž¼¼¸ÈÐ2ý†¼¦(Ôˆêa($Fè[©„vk׺í¼óŒƒ·IÈxÞÜ xÜap‘󴮯ˆH^ ‡g}šý2ÁàCŠBÌuiiNh3¢êWç&VKôXGü4ÔqÁòÙgÑéüU˜DWÖÏïµìÅÝíW_¹Œù‘ãšm£]x¦ûw@n1ïâQ E¨5ª|µä` MÏ´-AâI¾Ð“C@8Õ2P9¼!³–ɦ.Z!¨…`D?wSnóÁ©a^P?¨¢è¹“28¦EªÐÂ?é¤1¯,Ÿ9œÖm±Ç-îøÓG1ä¬}EÇLXr ¦u7MàÃW_}y~v/9sÁ¯›P*¤5þCŸ=­1H)(Gç8÷ÛŽx5³Dï¬iMB)ÄhtmÒþñ“F&DÐ膂\©)e.˜eî…;y8¥Ž¡ª1ŽŽ Wfþ_ò¤:Aa¾¯c4Æj.a ´/6^Úª¥i GˆCŽŠà‘9­^ÄÐ ¯Gdˇg|BƒÔf˜’Œ—]ÞÊìÌ $cÜ×>zëb*ù¢[7^<¿ èÇŸ=é°Ç‘3 ©Ïïk]N,‡&œC@xgÏ$ä+"1æ4“s³yµOÙäæZ.I‰{b5ù¤Õ‘ôRŽqî<ì¹±ÊbPŠlçÕȦ ‹Àb*Ù[*^:Ë1m°¸iÔÀškíVÎXõ¡ëE¶¡(QÀ¨ÅÑQu7ôgž)ü¿²¹~þåèö½û~’õnCÜ£SŒ6A—>eš.vlk(A0¦/^\Ì”p¿²¤*5ÊJÌåUS&±%`.o®Šüv&´¸Ð‚Üa`ŠÜE„p}´6»“ƒôé^Âh´ ­Ö\õåºñzÜ30°kÛfâS‘SH'F”Ö*rè»Ô¾oíT¹"BƒÊ@b„Q¡Ÿ ­ÄŒaL9#SçbRÁÈ:ïJ‚é¬c?¨b”¥9ȇýkõUuvL“ýW|Îm%pDÁt±JÕ)‚æøï6Ï‘Hщ¤½P£ü¥_B~êaóVz‰ß|Üábípùõ¶âã%d*µÀîkuÌœWä ZÔ%á&³^£za+ž)Õ^1Ânæwæ;Çàxòœ½Â€óÊc¸`ùÆ<Ô!ï*T­ÈvŸc3ÇÁò«íY/0×r¡±OSJø…ry+n€ÖþêWÄÅ–Tù—ri™ˆq©—Ïq÷Ê}«Ø; ®åµÕ^zd"ñJ¹Èǃþ6qÌ(0oÝ{5áœñÊäcJö†ë5æÑàTKtNû8úßÿòÏü ßÇßÝö=ÿÓãë?Ý>7cdÏ‹tHÚk®/ž>ýš_5?uëŽYú´µ¤K¯žÆ¯–É ¥ã®ˆ¤¶š¢cqHŒJ¯'V€Á¾™jÔ€-:ÛÞ®Á¼RíLç¤çgj%Ì౉êÐŒö³ÄX‹pgblÞÖ¯:‘˜šbôb,ÊiºƒgaLòçw~GípN'†xݾm£½¾Ù’ß+MSô«gäh/¿¦FÒTõhÝO.&:½©œm?×äÓŒ+ÛÅX¢tOu0®UíªS&ÂÀH¨‚š #ÚÝx’àÁ`1™ÐœÏ4”Xó:V»Nw%¦û˜°cy}³+‰‘»‚3àk¸3]{«rKáÓïŸ>|üÐOØØw_¸Ù›·ÎmßžãÑÕE §`“ó ¢ÁFfê¹Äd¬Î€^ŒO€€5à{÷NÝQ‰‚x…GŽ}h"ðt› rÜ¢)˜I”‚¶nŠ ~Z°ˆû~Xú}›Ÿ´§òçÃf…‹Ë[ýö€è@FRçRT#P|=‹%Zqa ‰\kš3%CÔÊóF…ŸàÎ7•TßïbMK·(¨äŠ9w×ê•sO4!{˜-<¿wÁZ Âýç_-r›÷,IËdŸis~;ûÐÆ“0¤f *ŽT N“'£R¥–£å]˜ØÈBê¹]CI]Ëæ‘â±;ÒÃÈ"Quó.ý×å‘Ù€‘V9îr ì±Ÿþ1L>‘ ò ÔÚȘGV\) ¸/žbÀ8} ÔY•3 **zõò5ÂÇæÏùȃ«;ð®¡$ªP¸\`„Älê:t<´Ÿ’f1«X1Æàlk­-‘ëþY§ RRœž ²âFË@R☱B{©T©Ý·aÌ‘lYHÖ¼U~[׊%ö‡…¼XQgì‘Жr,Ãb¼aj‡AÕ2íIÝDL€%!_˜¡±t§›×0 ÅÑã>`‰Ž:xÙ‹ajQo³¶´Œxžm_)(ØÝµÒ á·º€»·röò4±´NJ›p箓ãhÁ0ü¬ÄKžÌ­e_Õ+ç1"€4¶àTð ÌïçTOã(‡Ô·™Ý+×â@°©Š\Cåªé|º&f½ÿŸ©c‚"AÝòûéS,Âá4ßµ’÷ À¥Êì[h H´%.jƒ?é+KðVÙ­óý¸ßì€.™À–`8±~9YÈ!œ•4ý¬RÞ©>W;ÐÄPfMžtð r ¨Ê‰Ü^ú µ]VnbÈPçÿÅÿptzïþùg¯ß¿úòoÿ¯OÏ¿òóõ/Ÿ¿¸}úÀ1Pv¨˜œw¼™À{÷ïöägü˜ œúoÑL§H¨ËÑk «ªåmšqd9Ÿ,/1ï­¿y,ÁŠò“·Mâ¾˜Š°ªå·óf™ãrăC)>BÏôWµäˆg^B¯¶Kóû9É×´MÛ >ŒÃÚ ‰4¸ëÀü“ò(“}ûíw9¡y;]›Á ŠN\XkaõújAƒËIJF¢¯…4'b¿ª!~@C-p>î@0PÒÉL>”‡Kíš6ÇÚZî•£"µøWË•OË5•m½šß ™¾ˆ´ÎfCû™ŽZÕb‡@ôSÔ$=Û»Œ4 ŽßÊÕKÚ.£A<ùì ±Ø4¦É Rs¦lj—ݱˆ^Õó¹ÈF­©,³fÌüœ¨=X9)’D•ÆC;õWyœ+¯G¬!T©O}<)³¨œÇ„8Ix”EN°N5’ Êÿê¯þêÉãÇ]ÀýO˜êzežƒÍ~;šN?û©Š·²ò9Åjccò7÷0 Íi®µx„räiJc$î‡É0¹4XÈU yÊÊOPãÙá‘H×$ŠáÉ”#áñPdšÉV:}J_„i}(¥le64Ã!ô‘£^Õ!@Z´|ˆó¾¾ß¡ºåGÇ•:=»¯´AŽË`L0Ç’ŒÈËKûг—å@îq8j ÃLÛL;½t¯¼‚sÿÏþ!Gä 9I`?Ô³èSµó–2•….i³€;/›Ý.w`Š…&ª€JUòéR×”=ô ò=’ÒÒ©žX¥<²cÞŸ+ð¯¿Á¤³áOS½]²Úƒ«Ñ®m?ÌÚ"ûÐ`IgÚ}jÞþe."k¯³ägHغ|>–GÞTª˜GìÚLrX°0aœ¾±äŒlH–MrPDYoGž{„ÊAk2§øocSÄãL'Rx Öôa¨§ê@zµr Û´÷µ¶¦™Ð'jJ!QE ‡a„àÑ¥”LžG)ei†“Tmo0’giùnÑmAƒ|ZÍX8$ ‰i‘Ç2ÛäÄËÈyV¦†5d¨EÕK ¦ä¸ûúj¯qÉßxø}T…GiÛƒ'$ >Uõ¹¤¼mæ·%Xñõ*›^!³Æ—·ùaÕL"FÿE&ü$[é)-a¨ªàÒ°oÝñ«j±ˆ½T9âK¿]ÝÑí)Ørá‘oOR÷ X_@SáÄ8+U„ Y2Ë‘^í§”¹ÖéA%É[’T±—Çd¥¤ª·ÛÝG*0Ø›Ÿi³o‹êæŒ ËáóôÝþ)ŸHüügŸûÑ^âõV‘rý7ÿÕü;¿üÅ£ó~øêÞ;ÏøîÞ“ß}ðó?𱼄ó÷ïÞ½wvþðÑg¿89¹?9UiŠ´e¦N¢!ê1Œ)t£&»VB«D#ßt`®â²…ö´ ,¼ Ö~ÙùÚæq´½8¼•®³Õ45&ÏéÀ«Ô]½®µv¸¶µ"fëšØ%jÅâ:Å>ò1ÓN€Ñ¡Ÿ%g†.˜¾OÚ¨äÃÜÖÕ¡SH+Ræ. T™¯Úº¨;j4ÂÓ ;ï¬aäS,c9´­mÔ2IÓG7}1À9 ³ôx ×ß7qåcmÄK£ã U¯2­ÒȰˆ†6F ¡æ¥§š¶X&<É7²Qä.ïaf„Ò„oö…LóჇbk¥É'ÝwOü¦9U‹}áQ50*‚Ç%€Ð\¾­Ó-֪懿ÇõYz³kª%×YÂ[Oaʵ+µþŽ9AU+² Ú•Šž=wìþ[[Ý‘ª÷BéPî7gšÃÐãKÆÅõ|, ç˜GvÂâi:ŒA@\ìV·bš@ ?ÕL­G§Œ\x«œé¨ew‹õ ´F`„iÕR'¤,‰ê ÈdbÄ¢ j}¾®…°aÓD¿ùæ›'Ÿ¨ŽÝö™™M‹}œšý×'±£Jd«7³@Ëè*W"‡À5¼Ø¹aIÿdfOóIëÙW¤Š¨Tù+áæg‡ùê.31]zC5º€¯·­_ÌSHdd¾T‘i¹î“_GÛëÙ· ÅyÚª‡ðz&zøMHÀ IíË—KS#˜­«Uuvûî-7ÜoŽ;»•Q-¼¸zÏW³>2fî²aŽ˜aAÈXJFàáŸJ[ •Æ ­I€‘¯Ô<. J¾´L¸3ΡQÊþeBÊ×ô`²ÞÐÊ3‡ºT©H-2á‘B—z¶Þ«Wêâ2”R‘´Kž‚”‚vÞfÿý¶•ŠÌâ ‰SEYsËË­‹)«æq?:HO ¢„a¸Ú8|Ü¡t®’¬ C êQÙ¶R€‘mxq'^ tæFfl  3À<€•‹"Êð(Ó[eeJ¸C§8<.Å·Šˆøid-x‘^$Š«¤»:˜|ô¤èiDkr}w̵â K*zM«•9Ò€&R¨ÈÏËÖ¤h¢6ehKLúÍZŸ‘ØÌ$Ú ¾=»´A¼èRBÔÓæÜUs5”R‹|‰qüB¦–2f c|s€„ÌÜÇÕ£\½q­¸²{I+¢¬,ü¼|0‰ÈW&VK§sY‰–@m¾hTà%Œa%‡j”ÒtÌGz¥4S ÿhÒ¨f%ÚîŠ<‡´ê8Éë—Ý¿üòK›>ò9&õlÜÚtDJÎÒ<¶ñËшDíùbZ„ÀÏã]EfXÚ¼1–Ÿ8¹`k‚h¾V‘‰¶Á¤öu•?œe}‘ 1zK È0Xs"öIhój^ÃÄÑûûƆuy¯Žþ»ÿú¿üîëÿçñÏÿ“O×_ß}xö³/îœ=üxëž!Òˆ¯½·¾ÞÁ¹S!Í­R0®!¨˜^,îé  &gUènÂx¸ë6¥3‚ð¤T $åjd~Ø`y£ÑG»Œ¥t0ƒxMèª^ 8U-³wÓD˜Hj/†r³#†þÄ'yÍK½=´ 1%–<¾{ÇŒRÅŽ,‰ÖAêõMvrÖuó#Yî©ò¥AU -¼zù‚éÏäM³Y¸h2ÉZò]ß:ª^\°i®UYùqÞ”FÞO·În²TH”œE?$гª$Øxt®Ù³IÚàB1³¸‰¥»ãÆ?¢xJÔ*éèAäälò° Ôj —©T«{óÑìÛׯ.8Ì{ Ö»¾'@ªâ0T ^8!Á€8ûÉ…NÀñ¿ñöûï¿Ë˜~êŒ(õò8 YNâ=ÌfðxzäÓl¹§OM‰É?¿ç2†¾g62Æ?™³_¥$É:JLtO3ôÔ’¥Çÿ̨ڎkÊÈ×ïò+Ù°þè«Z‡¹‘Öx®´C,³°6vÍ'íP9ß–¦ƒ(H09~‡y÷§yóʪ G¿ÿû¿§VVwÿÞ¹ßÇ!Ì%TñTáN³èŒÉ&cÐé5O<þE>²£¼}–ÌÚVH$qçG(ןŽcÍr„PÄà¢ZÂ<}õöúñù£‡wn|x{ýç ëÅ‚’Çø.ÁØé†HÕ ríf©õ´ØŒ²-™Âˆ,YŒ^ÝuF³G5?2½TG„!.õ:w±à÷£méúrþ‚› ¼Œmã¶Nþ<yË9¶1Þ¥M.MH|CÊÞÚN¨ƒ¼w~€ûxUAù‘dPsóîËNmHÚzDÑ×cB ÀàïG‹É ÛxäÃ1m¹¯¦nØ¥43ó B7ÿéÕë +÷º°H¿£Kc/_µ¿Iª3³)á-ä+wD’-nÈ/‡S[‚5âÝ€#%F1 F\8l6a "‚×OQ-XEè†eùM“%6µè¥äÏà'o{zv¶fMÞ¾xù—ƒ÷ÎÓqÖAb5~|gÿþßÿ=NõyÚ ±ý$™7F(î?@3J… ñœ¶ØOƒ¸yíèåÅK{½•b…àïݵ"9›²± ÑZçÄaÃr(¿Å;r•ÒÆsšÚ˜J`<õ½ÆñéH,S{É·J…û„ ºØ~a3pzfcÙúVŽX|®B’­puü†YÜJêôs×g§6O香Š;ÁjêZ˜Mê¥b¡©—Jý¾gºž³9Œ‹Þ‘íÛNºBƒ],‡ vL‹-6#~xWã0ðž Á<É×µåæD‡³½}êJhó¶ÔðL¦ÁϲiÔ4H‚«§J:B’kA)&†Zžƒ…Óœô:+'çô8Ú„ŸÌ‚bk»ëq—jûîÈ ç¨=@|¢¹jQŒúÖøIiÀ3<ð`ÌÖ É[µÔ–g>ï?ÿü«/¿Ôñ»_ôtž¨xHs!²¸ÄaÈSÆØÜ«tºy÷1˜jáW\Z¥ŠjŒÖ€ÀÛÐ]^‹Äi«RŠ€œâf¥Æ<ÏQÔÍêA3'‡wû¦Á0 ‰RÀD£`Ãô!lºÔ¨fãeBPÍ8X´yåI&Y•9]»L¯ì™ÀåèSÃdˆ~§ÒÙ{Dá0GÜm 6‚âð´DhéE?€N¢¥.úb ÑðI“öG«4^1Fˆþ¦¥W\ëpQð´RÚ·TÍJ-ñ ‘Nˆüس¢*úÿ $$ÒHÅìoqY¦§åôƒô™A—Lz\"|Ú†c}ɰ ow*•kÝ‚‚ÓèÐ/Áüªµ—‡I®ýc üŠNÎäøîé›Wµð(á- àm3D¬[NS‡º4lZÚe +©jֲ„dG@(åèXoDŒN ŠÍõfЩÝ#lëë¤Õ>\çÜ$Rá,5,§*’ 3-:ÝU7p}_vÈc¹çF29…ðÓ1.J{¸ð .óù”·Su1‡ª·´kÉ@Õ’W³˜ÈR»£Wà¼üjçß`Žà õf3É4Û¶Ø4ͼžA½ÒDÑðr>>óçÇ”E „°M"WK32ô-<–gñQPÃd"D¡9”¶M2 Mó$^¼hÎrT4ùqG´ ”7H3Âáäq*¾sþ%R,‡ýáýóóÏ~é0ŽçÏü ïÓ»'oŦG„Ú.Ne¹#ÅBu#ãw¹$D¬dÝUC=ÙÊ ]H'øSÇxpÒÿäkÈq=×uçôª[B{ µUÔælôÁŠ·]ìzºl #˜á8ÏCÜMK N=ŒÊ) r&]+œ¹ÙCÕ³-Æø‹£ÕÝ^ˆ]ÌEPxŠaQ˜ïzƒ,ž={îÇ‘^<ÿÁTº^Ó¢ ]Ï£‡ç‡Æ›1ŽOb¨™O½m¼wRsŸrKÌDë<¿®54þJÈkdAC*±àMÄÉÕæ6ðSûièÀb4ŽØ®‘š“½ÔVF`1í‹$jÇÐ)]lÓv¥)ï³Ä»-C0`²bÄb“r™KöHþBXm’¦Fž©ÌP•*(4 0d  †¤tÛ‘T?èv @^»aÔ·ß|%LçDÌlžžüõ_ÿõ£G=b”-—£„~Qfèâ#ïÆöøxûêÂâìé z÷ÖSÐÉCÌüêâùýó3™„tñò¹-MÜHk¾c*ņ ÀLoGò¼@CL?vÔx‹¼EE':«¾á¾|_iãˆàãæ ó<}¬Sç´À>œ$—8rðÜaè夢é'™ášAs˜æáçúi|¢‚f¹@‘)…T³CÄÍ 3¤LºCà°O4eúsB#ÇœfuTȘ©‚±]OV;ã3 ¨V­F-ì.ƒ•Õ¥3Ñ7@BüØûØ2÷†Î Z¯°° ³Äï6±Nºq –8’;ð»ÎJªýÎmSêÀ°Å}ˆÆëmhã÷?¼»sìd×*áßSWñÁRˆá ßÚQä0n´ù¨±ÃC÷'èP•AÎ)÷­}‰yü¸(uˆãX¦F1¾¥¶Ìoj›”\Ä6Q£ÌÜ/ÓÝœŸ½óÝ÷ßÜ<>ºwÿ³7ﯿû`ßÞD M×é’m÷®U¡•>ÐÉêh„}®C4ͳ߱†”DŠo>é!œ©F$OÅÙ½ËoCµqN7. ,®1̨nrk2©“èîô“ñ5ElÐ$cw”—VVAR³—¼ÅM+ksJ$C™ZŠÔ¡¥x´D™ 0 Ÿo? šs¡mŒ'‡> ‰f½ÒôWyW]dæ›MøÎ%-Ü->|ôÄ שÓÔj‰BêQŠA(‘43•fOŒºIb4™ ‹óݶo´M4Þ»ÿ ƒv€RRÇC²–€ÓiÜ­l œÜ˜ŠþZSÊä Ef¡$1"Ÿ@øÐ6”;¯G›ôk{ÐÉM”"ÃРÍÎ@‚ÍèšW˜;©ß몯9_æèßýåÿ&h ?ñØÝ³óköÄ}j‰,Ö¦ÕM"¸>YÁaŒ˜4ÇèݽÕv²‰Ëï˜nqC#ªmûjñ°o¥Ë€s ]ŽÞe.9Þ‚Q¹{eN*žn:àÖ ½Ò1ƒq©*øÉáþ—C4ÔŒƒ™œhåN½5@"ýë_ÿúþùýG7³ÑÏä™<3ÏGÓ7³lĶÐVKÖ·`S0S9:}ó8ˆTÊãZz®ˆ§Kò´Ã|“âh! 阕¥Åš\ávhŠïT‘‡øÉ!@ãÆP©Òâ3­ºñq‡ykTDa2]ØU£L9K Ðò]Þº»›ð£Òv¢)EJó#áèö Æ/¾øB¾@GL0m¦â®<Íõ£÷Ï…ìÍWôaÝ;? ùNàZÂl¢ÈOËçJtý œ`”°daÐ 3¾÷ÆPf†mÍfÿMxx¥UÛ`׌ØË×Ôp™By÷ÁNrK¼›âhK¶ p³:\3ë*©yÃ)4´¡ð½~å:ØåK›aæ¥"¤QÁ ÍjLŠ3 I)ªÀVu`̦Ígk¨³MU…+G˜)vúTxìÙÒµƒF“[œ/  Û3Â3‘fïN IDATÍ{\'çATG]e$}§ÏoukÒ³ Ee ˜¥`ŽÌ¦Ãùl§¾åè&F¼" 3’¯®ù^¤‰#‚¶:Ô91‘A&H”«$hpSæ³gˆÄ6^Ñ0ÝÀ"D2d‹N%3ìé£2u4^9n£Yj+ŒV¥¸`Ú.Ûã»Âñöˆ¨·J#²¤NU*Õëµ>*×›UC×5åcà~tåÌRõ\Xû¹º—_ϲ,±ë÷ÆóÞ¸ñȬ̪¬¦Ûn·l#!¢`À€$’1cˆéîzØ·Ä_€‰BóÆ–Ækà–81mGzäÍñ5QÇ~®¡Qªd·õ¥yU—iÛ"p0¼`O'¾éKȦ5¸|eWLZÓe!ÌS-†ÿìT“‰r\Àø•ã)øÞèo¥m~b½.RžÜN/9þö·¿õ¡-§ì$¿ú è‰J× :ç"œ?~zõæõýŸÝc{xîcÒZQ”¦˜>Ä:­m!ŸœÚö—»1e°²,ö‚-"I¦¬\ΰQþÎiÇÕÃa!çboï,ºƒa6AŸv¸™¹ê4Ù¨˜¡æJf^Á[²°CoÆGà »\ö à4 ÍAGtx¸s]‡pà ˆz€óHÆg¬—ˆ Hðr4¾vlÐ`CÚ'FÊ<æãᜪ¥uP}#ÎYv+ÌÇy –@u#jæw©pàR“Ñ*Sã•Z¡|.#®é‚C}¶4{WÜèâOXDìw¢f^cÈÒ@…F‚á<ªÞ@d”ADo7(Æîé“"®Ð!¹Ôø«ŒC¨.ÑVdHÿöüÅ·ß9»çMŽ6Ÿ’T#K1U@XòWE52¸oÎ}¸·É-è)m\¥Lg²§91pZ×ḟ Ipµ#v™¼ˆ7^U‰Ò ‡ Ë1ÓTb:.0iEOix\jáLCâ-z¤‚+83,A…© ñA@þ|µ ¿[¾Þ¿É YK±#jö|hZ΢Dš»ëx=ñksWcÝAKW¸™{y´WŽÆóˆ8°‚\ÙþÔŽKÚò» -ìÞëÕµ¾XmZ+žÎoÁº¶T³Ìá'lB{!«âÑPpˆÏÜB…4•vI[˜ªÈaû2=]Ì;ê´ )ИpTM»CrNÃ`•m“ó ÜóŸˆN“×_1åÉÀʯÔú·)“b±ÅM×ëNìåíL•Ü_OG%2ÃÆ4½göë0µÓ$а¢ú©™hPEH¤ œi/„—dBcú‚FËK*¸DrØá¯9¥^‘Ñï䱟 “ ÎêžÈ jyÊ"ÿéSµú47·Êw„3ÖÄ·Žª4£þ:,êÃSÑ=PÀÇi}ñàÐ|W£¢(”‡ÛË£y›õ¾€Ï‡Ôú¦ÞXÙ"œ{A²F_>Æ^ôÔÞŸÕÑðì’°–c~!®i˜ãîIÀÓ¢9ñÉR$½— ÃØ"™-#gÓ<6†Žþet ½˜(“Ò98‡cñ0^ùpîk¼ÜÎ?ü³?ƒªù‰Î壴ŠE‚a(ˆÛØöaªì­‚‹œ%]û*J‡¤ÍÂÅØâ¼9·°TXÂEðg#¡K€ ìÓ¥gx1˜ÆýEÐÜ„»5­A©ÀËÑê×:ù$’þÖÁD†(ƒ›ØdŒ®³QJƒþܘÄb;µ“N(|ïîeqЧÑÿã§ž?/RæM?ßàëMÇ¢9wóXTªÂ€$ ÈÒ IX!\-:G#§4FŽNå‰@—¿êú…•@‹¤¡:ã73% 3ßS6¦²ìê騆ê€ÃD÷)Îc n•YnøuìWì„SІA34zæ ú Gf“ã̬ÀJ lW¬K”4޹úgþH#õ!Z3ïÒpz®yN#-¯´iLÎJ™l%ô§v‹Yí•¿O§ËÕ+ädroÆž Uû¥Œê˜×§XšÈ‹§z¡ í ´ ‚T4ÐÁ¤Ó>ðrãöÍÛB?¦DûÄS8¼¢I`I(j‚j˜b… ù <^PB×}0sr‰úñ³ã?ÝöÁĶÄ>º~óTï‘¶„•ñ6©Eïdè— ÚoñÅ¢«ôîÜù4´÷áoã‹æ§wÎbZ\‹iC)Â] },|‰ÕvOåcEš<KÜÃdžF8c¡ ‹€Z>†"It!¿9Á íÆ)•Es›Ê-ZÈ ‹Æ f¡Û–DNÿç0¤zÐHÊŸŽ3ÓNp ´ÀìÐUÙ„6‘c¡ ’#¾‚B"#h´en£}”Á¤5„¡?¼P]ÅPžË¿æ¡!ìÎ#ø/+´%§*9ÉôTŽ’Ò!Ü2(¿ËdÚA·hšnOÎ(Å,@Oõnf¨îÒb¤·MälVrQw‹ÉßV¶Qù¿‹¤´ ÕöÑæ`]ñJ Ÿ+6oœ©ü!ÞRF•‘åÀ¨„æ\ ìµk/_ŸêŸWˆ¦²òtBb‰ò«é… =·Mï?ïq“’ü+±¾:©5ŽÁS8`ž?{kÖ'¯«V€:U.µ!w¿®üFü,–Zfb‘Ý;½óìéã_þÕ/¼ÎÿÙƒ-†ÐUÃ*/¼÷öC&M‹´"çÙÓ§LFk`¯¿¹´Àµ¸C ˆ¯RiÅ­*üÝóµŸ|DNǧs©˜&äL/f¬¯Š‹Å0zZcáØxîø'?þS¾ÉÁWöŠiûÎéGÁxê\ˆÔX›^THö¸p)rO×~ÆiÓÝ‹0PÄ*G14drÊqÉA‰’µraÀP÷(¦ü0fWôùVùÍY‚É]Ô+—n¦ å©uhÎfgá¾ñ î+f•:la¶ñÜçwÎÏÅr‚ÅS´LuƒZ=÷Ëç>»gùÆh£`«áÚa9i¯µ…„¡. –&ãU5S¸†é Ai©pû3ÆO5xœýBƒ'eÑ»§‰ªQÌ!°Ÿ!”nÜ‘ ?A[&hcÅ1@kÑ\­£| q;¬à ³êÂÿÚⳈzÊ'áí˾>fÿĨ¯®ÛWÑNOîÁV”pˆż…ûœÏl¦”V1  ®Ðî ‹tdEo *)çP¾Ž-¸ê⃄kZmÜb£[Ê#J‡$GÍâW•ýy´&~*3B< _ÑÅw-æ–Rá8Õuv¸ë²¢øQÓ{mCh¹äy¶9 Udª®3X ~TÀ#éAémEXUO3oþ¢Ž‚«f-IˆX… ë×9Íê¼`HË"éôd®-¿Êà¶i.2‘³K2ÇKÔ—“˜F™ ܹ©±Ë|)ëкÐ@u!õ޼*²T×|ž-€ÒÀZ±•_àÛ(1£]~çÊÈô(°ãX †²N'/fSäÍ«]Rð©PCM¨Ø–‡dQƒç3Ò³½„^g6ß:ܨ¿ƒ*9§½›æbf2;¶Àdµ‘ã_ž/¯äKP÷ù­ÇºDxkAX&Ö‘‚G4~óUZD󖮉‹ÑCÎǤåS$aÊ6Aáƒ9þ#Ï6}3c]Rt*¶–;¬ËO¦8œ‰ÔÇ?ûg?£ßÿê÷ŠEÆõŒ†4‚RQsözøÅ‹.à«ÈT¥í¬h0Aý_V[· €ªZ˜q>é•`ÈÛ×,Šdò;¦Û×$0 ð?þOÿþOè.a,ƒàÕTgGò4æëoiSf‰û ï_þtö^„à¬@)¬Iø-wH–:Ý! §¦Oq©ˆ““өÉÖïÐ*­šIWe0•ÄdÇ¿€«àéÈ;¬\šsKõU!2 R™€²@éSv˜bæ#¤û¨K‘J« /_Ñ¿Bד><þÖg‰Ï}_=:»{—Œíéa–½€6¸Öµ¨Ï‚ɘ®«pм Û_Þ¢ I„ÕÔ *{æ?ë¸äd]Óc)æiü/ð8Dô*—.ßw¦Sâ¸ɶc_·=6Ú?ã¡èÇ&0a‰±^bƸË¿[´±œ>tÞ™õø@KoÏfaJ!ŸÒ·ë•çYmnªÊ›{sR¦-bbÖ{÷ÏðWElŸkêóÏ>Óí™Ü7 -É#AÈ„+íÊìó…õÚ0)îùã%ô èZû—À^Ðjý±…Bͱ}£:ÂzÂØŒdœ—Æ´‰3b•Ðå\ï)üfá<Ú¯çŒ<óLÛ•_æHOÓŒˆ˜2e—ÌÍ'?쨡¹bf!2ûôÕsøà<­@&\$Šä{Çdã0ƢÀ¸bpèã ;K1_Õ@‹ò¡.aºã,ãZ£þÈáUQ„g®?åƒF+Äv`¢’P>Ø8f‚ôP‘1!æEëeÄü«G/Ï_ˆEvR´gx (ø¥‘6‹ÓòÁ÷Ë.ˆµþ;û§ <‡,˜€§§âéz†QKncñK2$•—vùtq=ˆØôÚÑ‹gO¾}ôðäÎÝ“;´3]ìÌrµ²œ@¬_u±ˆÔq†Ç>Ô”W1<³*í´ ªBÙ ØWš0o.ãÛȨ”¯w£z14€åWß¾ëDétã"ÆEIxÎÛ‘6ÝÂÎc)F=Ö•‹óóY40S[P]—(±˯ÜXqOû u_j§LàãXÌcKí8·(ù*ˆÛäÎ_šãÁ¨«æV üFÚ¼þ‚K¶ì"¦\<• lÿ.¿Ò¦üH¦'ê.ÌŸH€#_Âos?9ž¢ÅS |غû Èæà ° ÀŸÚH»‚L…á,1üH+Š•Ô<êm‰¹¦ŸR‚¾öú‹‰ØÜàï2XO§­Z#¶mKÞ›Ÿ7<$·›§ döAWuhTLăËçV¥iˆÍÔ³3Ë à4…¡±{ ­Ogœ‚a ÒäD¬­ò³w6Bú|rAd¿6Ú^ »5m”k夨cA@¼;²½›_Utmh@WÕÁê § 7¹]íµi´°4|qè&?VȨQ™ª[ÒÒƒi(£ÃÁˆñ ©K=O£;/ä²¢e”jã.ÜèÅky†mvß÷ú¼o„tr¾-¶9­htÂÑtÉ­KŽè’ÞR¦„½<$–cx|kzâãÝû÷¾ÿ½ïÛ߀h³ŽQxÕæ}cQ® ¨ÀÜ®,TØ+‡-½êÔ‰¦ÅhÂz-á’_Ž> Mnmä„óvÊ5¶aòPâÏÍÌDÑcà1¤¡JÖº’ ,«Wͼ‘mGðùñßûOþcìD3ÆÎl¸¸ \iߤ%X2W˹èQúï$¤Ie$ôp"ÎB(Ãgú¤942˜t•gAÁâwo¥åx$ÅÒ³–Á„`šZ“ 5^ø8.K£«]€Õù.ø.²Ê_†V±™hÑ –‰¼d‚@ê"ã…—/žA¢6³®Qî펳£:K‚vñ¤óaùã«ÖwîÞ³’("„ž¾-1qßé¥jCÈÒí˜sÑïRVOi! —|¦‹l±Ÿݱê¶030É|Èx¤÷7ö<ü/æäñíröRÅ=•ÕÐâ _ζë·MJÃg^à WéÄÕ¼ÌÑW±wÖS¨0M =¾@±gÂÓ/seÌ"0Ÿ˜&é“9p…ÚZØ>›ûîÒckÄ8Y_Å&Óiþw:9v²Cp˜Â3âÌ´ŠÄÆÇM´EÒƒ&–“J‚YŸ´ã×™n”И+DÛ„Ä*°O½¾·3˜èe8kð•Ä+UøJ˜§ÐSȰkp¸òúík]¢’ˆõˆƒa[3ãgõ!ì „¾±ÇïyÆÓÊã<õ"rD`ñ[¹ÚËÇ C×{‚àQî…c‰`øƒùò‚q§N(ßò¢Ò€P­+ŸX=5ã¤\)ÀHM,jFUE Æ:VW5D” ˜&!ȧò09‰Þ”2Ò9Ñ£ÈÚ¥–×íFâ=Zj4OÞ×ëaW~Ã6 CÂêšA°xÉ;`æLÍêÔ?¼ï³w: =ý§÷¿üå¯ g¾øîWV4§Ã`Œ(—êØAFLÿâ/þâþà¯qJYw.èýý¬û‹´êp(ôp–Ù¾{k¿W:f.…° †R0ickt{½+¨FaY„@æ«H+Bé †‰ã£*žª¥Šß¦áë×#´¢lËv"¿NʳáŠw,^[÷±¸,ìÈòäk›ÂJù„;â_Öí/ÈÊO¶§(α‡I'R¦$~ÉåÜJ#‹¬%·wK%à |YD]g3 lap®Ù™Aß´_Ī¢¹-¼ÍãòHÓàH+ã í'/SaÀ]«¥ÒÊ€¦ ùóBœñ± E¿«S¾MaUÜJK(ιmÉíï±ÕÂxi“A‡ÈvòÙ1êm>ƒmàP?=ÛÛ=–sé©4 9‹°Ø¨†§qÕ©(ƒÝBöty€bƒð‹(ó?Øj±Ù­®Z¤BÅëTfŸ“è gè¿ÊŒ,ùÒ'ŒETaÄ„ª [šöCÖ ) ±k1äùä(ìW¦ä%+=‰šÝG›)?PÃXú3ååP³;R ðí<36ˆ« ÐÒƒcKé^ê] AÏ [8ÀSæJÜs+0 ááʨx¥!hsEÚ· ã›ßüÖ«i÷<ð"HV—íýŠá¼Áj[A/ÖÌ<ãÉ4/ ñ ¨Ô //˜ =œ&ßﲂÿ_õƒ¡L·º3Rð4SX2ñªÕÑHÐbŒšZj}ü£ý)Ù(Ãgp'©¼mÝ"¤£ñÑ懲„‡|‹[Äo«|$p©.VË)FMeqVEÅÂo\!¶Ž.GªøC+j©â’piË#ùr¤]ó0ìÆ±fWÒÃëÑ•NåÎq¨kl*a€CyÐæÃ–€À‹Y6¡M‡4˜;¢IX¾UQRG [îßKꎸÿÞ°ÎFÔwö¿‹ Xjk^À¦XÞX ùníºÜn&Èx-qI”4äý¢ŒäpzZ'Z¸ç ꥣ‡V†­šôùžæ…öô8 ÖG®M-0A ©,a¡…gÄ#¿±LÄyÕݹ4çW­e&”;óؘãR¥D¦‡b÷•F·~ò+9´…ÑùôÙ33H„‰Â8¬ózüío´”N¦ro-@Ö£ó.¤Öœ;uà˜vÊBÞÔ-áÖÒ…!ô‚·îœ|ûðaBo@¿þîêëwoø!TЉ5³ÃQ TÉ’P¥¸ª®÷%5*Q‡™8®ÀÆ5”Ö"ZÜ’%*e.~†‰›éwäØQœxé–ÎkAùG#ßBI/~˜²o-ÞIÐ/ ¤ÜˆÊF7h(ÑRG0]‰Q¡ÌájØŒE,V rÄÆ¿i2º[jšÅî$îº%U¦t« ƒ›±ýû$2\m‡g£'‚.^ñM0'>…!£ G¦u°5P`wÊc”öjGÉ0ÓÑ «Ã¯Îᆖpž^äÕÓ¯+|å Â(¼[Íiz„ ·‚ÁgOŸ!ÿæõãGß~ýó_üÕßýþµ·‰[UÛBëBˆZz¬ÖÊ炳ùæiáèþèì!¬ðì9SR%ÑžY¬5âü0™n´ÐwW m¬i·µµ.àÑóϘ*˜9ôjuL æüžG /?—É‘ÖSM§«–ÐÊ4”qêÏ”tà’ÂrÝBn°ÎYüýŽɇ€UôHBC[ œÍÙ¥£Æ½¦ ìU¡Ôå»%9ŠÉ&^p7ù½Ð”ô¾§´Âž*¹—ASØ/¦º§Šyªº©™[^U™~ XtÐ(¤`´Ý‡úF… üÕ˦+úÀ‹_º@Mà™Ò72)9>Io™Úbù3X¥Ñ ¸ìž€ ”\ ø-rC>ªëÈ0wýñ“9f=®Õü^0ÔȨÄ2K¾á: a·ñ—Ä=]ûëCˬ¹AWï0m‡Šb< 0²`àCBî% 9f*Çusn„`Ù«íh|+…ÂÐ0 ôâÑÕ_iâ’9ÓW2¯<|ø[9È%Sè¡}Vh¤-àŒ8Òâv”.žçÛnæ$ÍQYóÁ•:ÄY œ¼°¥B½‰¨`¬¢æ$bGp1½ªQQ* ,uNÍÆ6ã8j!æ4W/rê¨HóþQqdÃ6â–høÞ¦Ü|×ÄÙM||`ýHM쀽Õ­26õ"3çÁÈÖ¿ÐÉã?éKÄ×tN \¦Ìê~ZB ¸Ùë¬ABÎ*‡æá‡ Ý“´.±"òFƒ˜šB›2áq‹Ï?xq€` €ºÎ¶f0·Côà6é—Ù7•·½ Ñíœç¼±ï„qŽ!*G¦C½ðª¨Û6ÓTc>† >jxåÎm‹€4* 6cÙ œí9Ç놥•›§æf¯w ÑËÛ×´Y²MHâ]ÝŸ¡=“âÙd=Çb=}öÍæxð9¿fS{¾Þ·Ù—ŽEë…ŠÄæÕ>°‰muįzÇŒù9Mëÿ7Íy1D‘†8ƒW̃ø‰ì—‹oŒ$Þ°é¶ù W1 ‹ñé ~Ôz (m‡Ë,¼[éhBŽòâã~\¼u³C¶PIဲxÝ&î+}ÿáôÊŽèV_õbÐ/„””®±ÎÖ,]~Š®¿'èYÿèHy3®ãÝ!&Z!>šEÜ•"ápÊ­„•¿~û¦àIº(?ºâø®æQ82ÚÈ5äµrM?gOa@1„½ýÈ_;¯¹T?è4% J²ƒmë›·½m*°néÙOÄšæCÃÇõt096a…KØâ‰“h<ÒbÊëƒ>yõSg‚Ì–;=Å}º>P¨ Ûöh OÚ3VAèÝ8ßåo¸^Ôh­ûjk¼¡9n€×¢*…!zä ž°G¢¢‘“‹!/%Äs4òŠd±¥€X«L‰^Qþ;£w= IDAT§¾kmöÓÉíSÏ3(ôu¯dšûÔzÁÊ뾟ýb¬^lk:<„E»*!¶}†ÜaNçÍ`·Nê“ÐÑ8çÞWo_ÿöÛoîž=¸}æƒ0ÞW½KÄ–_¦Wv®PÕ4¦MéŒ´ê¶ žøvÂñõ_ýú¼J Ü9?ÎÎÛu[ü@—õ¦.w,×CC/,ïŇ·Íœ± +ÞÏ% L`w0§6D0<´´„ÀÂ.^Qô…3”Go'{Òr<*0BRã"oõè ,qÉÝ‹÷ù Ÿ“¢Ép ¯“fêÑ¥¡3x*M¬æ á¡(¦Ájctiµý`,Î̈QÌ1î׸e^¼ÕÛ)!ÌRK(ÕÅÀ(µLV¥(6Ëk‰[HD†ãy±úç ú2G¡BΤ˜˜Ì]_ÂÀöš7ë;vaÚ¢J”fF¡*Ž·Ð$¨É¢Y­V’z2Š“XÉûÁ*/Ê zÃÓØ#G¢[”TŒ9Ð…DhA#fÎëD°ž¸g»¡¯UEçÿ™ÀˆžJ`ˆeë¯4ÄZYÅÚ){ Éӛ™'i0À#Ù¸ZÇp¨ ªqIEµhôâÅ…€*òåø-›o->¿ùÑÞ’CÆAmõJè%Sá ”ømÕÕMìÍ>t¼J 7_Ô¡°øž)’—•ŸYq"ʦ¶QÎd{Å+4öÑÇÎc)žjÔ„18#ÔK¹×+Ñ4¢Ê\}cJ4ËÌä'ñ4§Õ8Ouù(Âÿñ½!±>S;Jz.Âׄ Bí>ú""lÞ®§³ލÔzãÞ±Y´‚T@1ÑÑªí ‡«½akTŠ=Z]ñª»Â.µ¦½bÖ§°öÊG§^c›HFD¡•×Î÷! ANj´Í9ßNÍŒÌju}¨ D\C%8}}¸ç`ÚßöÖ'<ª+uŵYTå±,@F¹Ê/=ÇÉ£<î79Ô410 Ò’~4ì~p$ÕËçW ëÑ·öÄÈd„tŠÌJBIùS+3×DÀ‡•£=9éjÉ™MÊÃëñ íðC›ûÖØ˜=Þ­½å·Î½êÓÓ€àPÚÌ$È/>DHýgHA¨§Í£šxªÀ•[ìëí“o?‘(Ÿ]$ûãuK“èŠÒ¦îšYZ´GlÈC½ (äñã'0¤(Ís ç›BÇ$šªèŠ`Y!ž™}#Q  õ[0Úð›1A˜j¢L‹lq¥.dgÆn“ËZÚ%ª¢Ã8-”^ÎÌ_gM8ˆ>ßj“–¹ßìvø‡€7ìP¬o å›á§}½Âÿa)Ïž‹îÜõê‡s‰^<÷Q ¾ÕÝ  Ár&fê P.[:Xµo54g þÄô¢7.7%+Ff½)^_ñê,Ùöškkè©:¶"Ñ(—Cb‡Ý û ApVQë~]¾Æ¨ƒ·¤Á¶‡Û â¼rMÏ8Äðt¹ ùdš ·i£ºôIs}òBõð~âã™Fo?t#Çe‚_ê¥`’ô­HÎJ0_ÃEE' h‰˜±‚8ñY±JìŠxÕžWÅôªíóM ¬5ÀžZ\Ì%¢yº ¿ÐЖ„§&qm·uǸ&&Ãá›|+•¥jAd™Ü×E»øÍbÍ|®Ê@Ôˆ98#SvøYÜŒáJ 'Ä9uòäñÍãOŸ¼<¿}óÔ0‹Áql!sÈwÏög=8|¨“A8qÕu{?ÿùÏ~þóŸñï(…€¶&0‡†¨†î&b%†.¢¹}ËVÑco±˜ò‹¸@ÓË®&H_rÉsÅ–!žÊ‡<ÑKËOjsÉwm1ÿ‰-KáÀLØê—0cz“¦™žCE©Qr_‰W.4ê—TòÍkh})¼N¦ÇƒžZ.iä÷HµT1¹>‘m,‡?å'^¿XO ZÀfP"Pi¸ ’ù¥ñÖŽ-l·ëÅØL¼H{A¦,N)Ó\ Ù¹ M€Muj“Z^Üw¯x† 9T» ƒjÜ›‘/멲 r¢Œ&.n#MŽßiÓšÀΔ†L@KrʣȒœ|pðÛÿÒæÐAˆp®RIUÀTJÒJ²ˆ* JP¥¶N öÕ´šsoæÌúÉ SÔËCIbUÒ#š»d¶Îh­9êÁ®¡æs©å)ôFæñÖ£¥zX¡—÷¡åçt[sT"òoܰg‘†,ÎNZìcÙ2ÂËÍ™ÌãüX\z %N”H`Ñ ÆºÙ[¦#óùÀ¿ÑXû ÕÖå/d¡ 78‡:ÉzÚ€­\ üz‘E†l2Ñ}} <•\JÁ´ûöí|÷f)EÎëuã­ðý…¾d/½0Tׯ®·MÙçã})ÛŸÀÖË×Ia»§Š©kEK•ÛsÌÉÎ@,-©pÚ•ž¯á`Âõ;ÁýÃþ)ñ­ UCp s,Ü%Ì´¡&¨hcöå”Ó !. pªc¾›ºê8^äØ;í‘?%c†êJãMÑ=ŠTÎ7&*Óí$*ì© €È”=9[F&gZaümò³PldGX³pTGš[µÖ2AX•s€ “J2;œüDËkk›øíE1õˆ§·oÝùå?þ¿ö³ÿçoÿí#À»v|òéÈ÷ ïxÙ†.¼žÙ5C̤ÄÞ9ÅGÓ òÛo¿5É)ß^hhz1¤µ˜ÌÔN4¼SÀX¡žÊŸãotdÝl¶SkûÜv­7ì°1–?=uìBÑŒ!ñ¦¾3òÇ} äå6ƒ/\Sz˜7¶0|HδP]& Cïˆ* 0 +ß*:þÖyRf¹]¾‘„‘à€ðY† Ðäð#’VC´E»ˆdRЄÛ5òUÒ6|…à6œ(Ü¢]IZ¶JWT¢%SL‚Æàf“xª…Rò’³DùÕ® >Ë|µ py ‚—ˆ€óRÁÞLU·[…›ójŒ^=Ñ¡8õÔ¯8é]ß=ãæm5’DëË!ÁKdôÃf-E®æKÐÛçeLYӖƈ‹ ž"Ä ÿ[ì‚•[E©LF-mkšÀ¨ç¦`Plé…ÿ^ J  ¡@VÌU°8G|‘rãžôÚ‘o‡è ´âÚ’ŠÓp¿{†Í qè¼§µT\߀ÕË|ƒ=e8m¬«"\9>öõõ“³wbBˆ:íf¼„Ÿ†Û¥‘4ÕýpvvRÐÖç OÿÏÿã¿ÿÁ~ð¯aì7ßüZðóŸÿ¥GÙ}e5Òv#ÿ3‘Dt­Q`\ÄwEæ“9M¦”GRO ,íRËíù£gsašÌÁöàÊdÖæ\x2bÍ´¹ &”¿”—G©YMè„+Õ–áJ.{z_å ólAbÛÅÔJci«ÛUð®B¼•çRŽéÅ·:P¨,’õ_M‚1VÃyLh«ÇMQFÍ“NAGâ<¤>Ã+µµÎMÁyZ“íÒ›¾š-Çå·LŒ«ÚùèÔSFDyBÝ9/§Bl, lÂ|Œ¦É :JfƒcqÊàÛ°¶˜F‹£Ø‘¸¨*,=¹à&_B¿žæ7γžMî)hfé ÜV÷ü*Ô:¥Ðžcu·ibZà~]L&h—2ëpâû\ºÔ¸™®Oa±¶²vá&”••à)xµ0Ä4·ÀY ‘/sˆ¥ºlmöäŒ×"·E¯ZÆ<N7û$†;b /u(Á_–n¦VªK÷[hhίr𩈑òMÍÆ½wP‚8mf|.(`M9pGäË<’{hfQôà^'©QiŠ¢ºÄB0LËDyÚFFOaQ_Þævêe<¥Šn%–3ò5³Id3¦ ¨¹% ¹þú˜»È_:¿SÈ›ž€Ÿu ùº,ž@YÖ8UBQêuÂþÿ'Ób½B̈c¾\ÓÈ ®ò‹(½…×Áer¤’„ºèÁÚ¯Öváö»Ð Úàu-‚Øê ˜RÞ5F¥©®ÚØán2cÙšË^HÓ¹ïºU´ì¦Õm6SИ¥Æ!Á„[\P¦ÊoZù‰âû2È£€tÕMiN}­«F?ut¯ÙW,4LöñÓ§Ï «OÎnžÝùü—¿ú m|úüñû&3LÅé•ñÄö´ÀÓ £·‘[úœ¦Ìg²Éös8Kg¬q¤ ׌¤{ œ jršH×/^`Ûð‰Ÿ‚Ò8› QÙ¡iê×£×B˜3J‚hÓ€³M*(ŠÚ˜/”ésãæV@˜VT–óŠiÅÀ90B&Bäp+œ9â*³P"N•qOIÊͱÚ" LÓ)çoRMB-ˆ[ÓÅfa q›•&ìE;+—˜ÅáK‹ Òý'ПX„Å7Évn©"S´mKœ!ðWŒx|[™5ä+/ÄŠQ4 O éV®¨ù§oȃýü†áÅ'B¥Á¯yùöYÏÔ©/‘GTYGó«qß|þüñݳ{wNÎ~õ«Ÿ³Á¿öûýüõ[ghýÏÿãÿôë¯i<ó{ßÿÊÜ/oKU_ƒ·)Ã\›ot€ó{fAX}>Àyø’D\ܧfš7Æ §ü¢%¶Œ§ª‘¡Ôo<™w<=­åyw]‹5õ8²?àÓ»Ó|–Sź-_ãi+dÕš¸ä ±m…-jæo»ä ¿n›ÈL ’ÀjÑ莞¹E nÓõƒ6˜—XI{ªŒø¸%RÈKó íÔamNhsêX DÕ‡®­XÛGÑ,½wn§·M‹àMWØ`ʳÍxê0Çî©%¾Oõ| _‡"å©M–2½¾ø+áRf©óÔa™rF¸!ΚÑ7$–&bʬ‡vPà—†ê5ÖÇ›—]TrE€'­TR6éË:3Œ¤bµÌqÎ'ƒ8Žk[õ,eâ«,Ÿpб á¤/)!Sûír«"ÕCD>éL5:Áê( bW@0wÚ¤~°Å9€Lëyv 9U4Gœžœ4pŸØ C–uêó“ ä"Úéªè 7É1ߪää;òÞätc'Rã ½o¶2I\P+2`sïáÖÔTÑáŽW¤¥)›§^tgd·Õ嘻â§4¤dä‚§!÷½ùpÖá*£¢ÂZ¤Ex;®¸ixm¬)U†í”Ôy5Dl ÝÎí¬.Ñ=Õ•Y»6H&>}žw~‰Ûÿ³øŸ¹Ñ "U°¢7ÂPïàݦÍÍ]éN´’ ùvjQˆÊ•Mi%TÑ›â¸|ºãZ¶&žYÑ€.ôtºL·­¦Í犤W•Ö„’ô0.* §ÊHO׳ñeº‚Yà /¶JÂYŒ²N¹€b€x*áR¥§sÉd C@]HóâF”ïÌ¿ºóàÎÛ÷¼{rý>Ÿ#~½vä|«K-Û‘VA{õ†ðx |AR}çôXFÒpƒîˆwõPô›¯sÜ–ç X^÷Ù|#zc¼K6lÁN¶‹!p-"O’cM#”Iæ77n6«t©£Ê°gÌifQP“›F¯&Š/Á™tŽC-èé—9žjqÚ-<²Û¿¦Oôó½-(=˜4aÌ+Ä‚ Dò˜½.“…Òj÷K*>yò¤¦ß÷²ŒŠ8¶’MC;=&šÉ¾+yáÜUW^çB‘É!¦¢ÈÁxZþ«_q1o«Ybm¹l[ׯ|Å\NÊ %J‡¢æaq&À.[°S+  ´gÏž2[˜=¶ô§3!`K]U‘`­C¯Ú»PÅ:¿s>LXsýùó CÆ#F£!íζ^ø0ïÉ Ûî0«o0«üx½FÛó¡$tz*N` °b†W×,L4y—}–„âª{}Qg´¬ÂÇÀ%\uJ[oÛÔ…¨±@dŠGñʺí,ͨ+(§ðINrÇ\`zº¬4ÉάF®€+¿xv‚ ëžïýëoŽ?<¹û¯ø+«Î÷îÝwâ)B ª4ÐîÆëÇ'¿úõ?±ÅõìÎýö—¿øõ׿øÁ¿ñ¯›ˆŸ.óößü[óoüá_ÿþ÷¿ŸL(¬¢F7ÀJ£¦çðL>à3e3[@¢Ÿz¼·DÃ}ªi¬öëÂC§‚°Ù-êW/âwºþ˜ï¿šë"â¹ÿ3jÅd9$´Ûòa9дЧ^²ÐeéÁšõðÙæ¾<%¸©›!+ƒ·jéÖ ÒX¡ŒGòeANNëÆÜ†ÚÌÊ•¹ §ª9—Lׂ•±·ôJ¯¸g<_Qp\‹§â ãVËþ·@OúÈx½£Ú–,ê ‡îp›UR졎ÒÂP]>9ni œUƒuêÊñ«–|Ñ:ÈrTñH¬ß6mrp ¢ÊŠˆõOóu‰XMŒ³=ø(úx¹eÖ#(ጒPE¬œE9àxŠ%;ÈWxýª§¸Jì)÷P=ì9…°kI[î/€**‰? +CÆrz"®וԬ9*sÌ-ª‹|#°m©ÌªfP;þ4>Ê") &œ5áVI ù( +bs‹3–›äСEfhGµ»:åú¥‹`N±"ŸåA~@5©¯zAæ|“ðpZWWÅáyK ñªïÿä¾bZ·ºrCÍÖýè3|‰ÏiçÇ?ùÉGš1W“@”ßAÈ —ˆ®ÔGZ(\ËS×m$Ϲö$à i$–ÝP$µ]—­•™—«1H•—<Û|¿Jz¤Œôk{xÇãÈ„êeZÅÚ.¤(Â¥Õ6£­uy¤â^ʸ¦é—Y¼4\àóšc¹ž(¬ãæ}æsÒ>˜àûB¯è¾·C‹ŠoÛBd3QqÏÇÏ­à}þùAKƒ87€ï0!EØ!>~a®E™†ÑXŠwÐQ²~q·²áOah؆¸³ïø^éóÕ\•PnŽúD°N|Å–‘Qi9h4§óè®4µ\ÒŠkÄ¥E¥X±¾¬„òà!\ÉÊì´Y7Ê6L`ûâÅ3ÓTÊ{µzÉ„„&Y¬ZüµœTùCÇ<öŒ¥ÀÍå)T­‘kq+næ:¼é49ÊN-üQE™’ zê†ätÏ`mŒÂ¢>4è %mªU†Æ¼·y‘$nf`äQ¸HbÂYd©<òñíÖ{ñh…"íiDÍ|­¶Dœè²¥€™¹à?޵SXðÈ/F€ͬgÔ0{×øYÓ¨6-}ïû‰ÚÔ„Öµ5Šœ%›`‡´Wšðá°F[ZwÆaÝ€¶8Ò•ÍÌn‡Ü‰:ÀòÓwŽ{*š/ì1@IfË.¦±ð_ƒØ^ÿڻ塓NŒ‚ ¿n¡:O¦¯ê=D³ñ¹¿:í™ÃÐ:¡P<Ž„³Ö2[—G.p¦+ªEÿÉaO“ŸJ+nÁïõ»×çOŸüöáãO?ÿò÷w{åºõðSDAMèöìÎÝÿõùßþøOþ£üà_þÿÖ¿òë_ýæÓ6èñéSáîÝ3›½f$Ù‘B¼›ê` ã¬qÙH[ c|Û$2I?ÚRzžÖt_÷î6j/:ìe‹§2«Ü»Å1.·.·~1|…Œ´ ùÑ1Mš2£ÇM+ψj¦<ãVÀ˜÷rÊèY½gƒ™zŠ­ÌEïÒI˜ji"»›ò^P@ºBth ´7lµ(3ìqsèÕº„ÛÅwŒËi'ø\Ó\ˆ‰ØM˘ò-:þüXʀϛ«ntonQ1†ÖÕpMžF‰Ù…\nØ„§€@ÙÅ\šÙ dàhË%¨)æ)àû+_B&§à´QË(‡ƒ2ôÖSìr‹Ÿ ó!€K0‹ýÓHÏ“Kð@B,Y \šTÑõÂF(/¬ çAã_‚•Ð CCsÒ§'-(ŒLˆ¸Á½´dºÐ²éh™9¹8>ß#Y” ÈÆ¿+¦º*+è&¾†»Ú'X Ž—õC‰lì"ôl\Øêplû•;餰ëü>>DÒ'¦ 3é¶YgáÕ]|»Û'YÃO1vé ÿÙC†]š¯@Àc»)â@Ĩ^¬–I‰!j 48$]ô5öjbùcÓÎ]h…VPMhÊ©¨Oÿ ˜ ÝŽò§Õ¦Ša JïL׃3衼« ŒðQÅ–Æb&æ_yòø±ù•æâDT°\ ÓŽejNÛ©£šËYe(<¸ÉQ‹6AåT”/˜ão{ÕÙ„1m uê‘D­Ì£-GQB7ÎÖ•º´åV¦’3ÒÊSì%_æ"\ÏK3i—öG9›®ÀÁÄ <3$И4†#á° ˜ÑØTG*³rÌ‘íù«g ›8 ß\ÿôîÑógO¯¶6ñìü»_}õôYS`â˜: ¤5z,–9e³4yT[– ej´3¾åøêáà7üß/°UK‹× 58hTáÓVÄy>Ô¯ÛFPdßýÛ^Z©VÆP§®`D‚ô%TŸ&ÊŸ’Aã“助¤eCævTW^B1j %ÓêÎVL¹ Ï.e~xóþÕËç´ÚÛ‹6ä~ú`î­n%m°Óø.<üïÿÛÿîÿý¿þñÇ÷¯ÿé_þô‹/¾8¹û]Ñùó¹MÐ&Œ ›ú!OU쫇Ù<cŒ ƒ…ýʧJׯä”Õíø7c–½ä·=š‹¸Ýêï4„¨­…œp¾¸Ìˆ‰Ò—éše·MZÛÒ¬ŽÄ¤ƒ˜ñôÙ«ÖÀj(H̨´®ñðüC“¦­ê=)³æàÌÕRh TýRcqcó=bJpVW+2/©D¾œE¾*\ɼ=oÖKª˜s»@Oa9txá@XŽn! 9¿—¢ôT:fN[…2sµ¢6š#ñTÝ¥<_ÎÅq¶‰1v5p¬XAhˆ±á€°RoŠx(ü–MåнêjŽŠæd*, øÌ 与­)¦«ºÑbq¬Òûߺwǧr~D°Aƒ¶ D<ªq@è³ü0‘›¸^_ŠÅ}­¸i[ÿÜ‹Å&ñ&i@±ÈþÂ[ÁCCŠmøSÈ=Â#%™Õ&=ˆÆY% RµGˆù±"J[ó‹EäÈ~÷^¿8Ïß. ;r`Žl¥ÕUS1¿Ø·ø<ˆ¢LTZž.YÈ&»5ö¥7Gͯ|¸uìË>ãúŠ·¬wtõìÍ›¢¸qÞNtUWB&¤µ¥‰DñþݳçÏÞ½cœM lОÕô(YCé69e„g5„P`È’“׌zÓ­éí´»äpV°ÄRnQ£ Dò¨þ0Í’\“Ox)>D4CžTN¦âûIà{°dmŸ²Â+AV2L‹Ÿ^¤‚â%l‘ ¥vÏ|8ì7D ©y?E»#â+ù—ÿôóÏ¿#ÓGâ,ÌÁÎ ÊŠOC—M( õbµ™M±AC ®æNŒ0Èe˜œ–f–³¦ÎMÍŽíà0d^Ÿ{o#õ†<€@" Îft… `°=¸y«É­ø?4BÓäL+­¦"8#5΢¨ºÐ(OgY<Íš¯“>¨r»W›Å@Ñ”h›e8paÔ¹ g… #Ç(ÚÆ¤Ý×u­Eí±±Tsì0°"—,gºðófI{AA¯…Ϲ™-æ\Q— cWËÁf’¶ÃÓ»P•öðÒgU墜ÈAò…è©HÞpÕX¾ku)­¨|«idG@Ð6•)@A3Ÿ„×S°å IDAT!,-&7ˆ5÷VÝ̯Æ:“ ˜@&™†^þèÊ o9Qã¿üìæÕwnݼóäü-phêK¼ í_üâÿõõßüÿßú;ÿî¿}vöåg¾÷ÎÁ^X;>iv /ŽŸ‹ÕfˆE1ìd5 4ÂÍ›+ÓAŽ3ÈÔë“ ¯…%2¥`CòÏe[㻼ʚÁ@ü½r«Œ[“¸ËLxN[Õ3ï ÿyT ,g+f2c‰#ÒÖÅ”ÁŠÄšVÑÛ¨0C12…rî÷@ \6¨ŠòÃÃÂd*€lOüÅ·,å+¦-c”ahžœ[ü7мXÕ• t½§ ŸÅšUU@Hã¹hõH©}u W¯:iYsˆÅa5›éæ³E#âæWk„kKI§­BQK›+Od ˜¹5 œG©ôn„—¯!­êª.£¤fá¥2©G·}©…"›ûÂø“Ó9etd²Z.ÄHå·’xÎÝb¢÷a½´a‰ð‡+!ýŽÓ~„aBvÝ¡a‡³+ÉY„Ô4`ÈšÓnÕËŸÞ§INç?9Ê™k5ø`ZBVªÿÓ™¿>eÚÓÜIß—È?4È@ô@ì–./À[ AšÞ4Çà ‰WmNjù}Öª°˜Ø(ZâDÒMê°¶t€Î>‡8ç$A d>‘á’Ì!fØõOùPaφ4àÔ•ŒbQG_T †^?}þìÆµwGŸÌ`Ýí¼ÃWß½útëô”Ÿ0þ½aýâ½™VМËxûÚ1 ·ñ„*ÓmFmàEà&,b>9Mêo{ć6ß9¶ÇÖ.ªïµ]BÓïG}|÷½/[¿çÆ>¾=;±þ蓜zI;zõò)õ°ª=ï!¦èPu0#N‘ÝÍ['°tÌŽî R„6&ÍpM„ÎY3†q²N×xÏh´Y‰?°…i-y^3åàê¡‹Q,›Î'eÜ TÐÈp/Ï…_ÕmtàÆòK™N.0ªóu^_¤ÝDÆ×P90mR`Ý4èeUÜä}°%¹zÕ°;ÇAïŠ(:FHˆ ˆØð»wÜŸë|[l;”£ëýíS±/Aèøaš#pz&–I Œ-øoázŠ"Ξc=À.ݽ"éKMHdnÛä=vùóMʬ½‘u½^|䈽1úÚ:;»k¿†9 رçíKltŒŠ æôÔ&îpÀ±ºÓã"]̹…´æo¶‡†‰Õ¹¾xí™fû™Ù‘/ðÁDIL::uLᥠñÿcÖ¶ÿ;gg¢U¯ý'wnwÏuÛ3ß‹‘6@$zj¡[fäºR6i÷1òœ¸3pD6½1Is± ! S¨ÚüDÂ-˜á~¨ƒ/â–ºüQ+¿¬UoMg(IŽ¢w#Ú$xËpðƇێ©:þòÊñ[HêšÚŠ‹<þÊÎâqÇÔæßû»ÿÎßýþÃÏ?ÿ}@®\ƒŒnÂÞ»›!s›.Íßq—7o½xþ„|ÿüÏÿœÖöàã"ñù̶ÈÒ,‹—=[Eu¥óJc>¯ˆòæÿ(æGÿtc}ÆÄTô,=lØDø”¶" *¼Pµ!-€Ë=¸ùþ]ŽCNÞ°«‰ÌqXðý.÷@Ï­ |×¢m Áè¿æe-µQCÉ44\Ú2&/4s¬«S’iê,]'PR«÷¨ÔòN‡¡ÈÒ ù%Žê:ÀØtPoá˜~Ôï|µeJí†U kDkx’*Õ3Æ4\•+¶;jIE1R\")œVjòåiò¥¸Ã^õ :>–H5‡ˆ>¡²*WõÁêÂÜ/Iih|r+žà7üà<¥Ljp“¯Mˆ‚êBË š·…˜y™Y…é¬<5}2G£ÙXa /ì}:¾À2çÀÈh¢ÍÀ*‡isÄ_”α½üÑF;š9 &5:¯ÍNÕ®ióStCQ'W«ÃL@1°Ö­ Í'¤ÄsÈôË9³~==Þá§ !½óŽçñ‡›G¢¹»ú²ç¯Ì`u€òêJëçb —ôèÉÓ'Ø»æ?Þ?W€.MÊ_W¥7ùìóïˆõÓ³Âðäžßáó!ô/˜&Ï‘:š:¡¨~–7ŸOÙ  u¹ÝäXPï‘+l.ô°ìè𑸶m )º%‰Ñ´èe:]ÆNcU7R8¢¼‚2©„&jx%ÃêjÓœu]"+a ^öt̤ý[‚·˜SH¤Wkgns3*ƃéó$àÁÜJà†’õp3I@@ìn8™±Ð“%Pe"w ¥e ê2E¨ühƒ³™ûú~¾Px€&f&ÜÙ¶PŽ"^Ú7Ë,a åQÕª \Jº–“@á[œ.n›–éÖS—×Þ„ô&–)òÌD‚¿Ý*:÷ÆQ0]“Àœ=VÖ ÄR6½4ýz;ðöˆ&ƒüuJ»ŠZA—·뽕’Q—‚ð€^ä `R“Žª›­H´¬„[éå ü‘,¿™¤ JÒÞñçÊhËÓA>Í”30Då{;O=­èƒÛŠ&ò}z8a€2>àÁíÓ(8x*[y N-ÿòçŠa”LO§õéßÓåb_`Ãöø€¼—Êy˜¸¤•q]ëƒgzn¢%·ïŽçlëDæ|×áªñ¹=çHØ‘ÿÒ›Œ/hÁ%Ÿv Ê6ÏÕ©6ãsDüðïÓXT»h/ÂqHé@j9ÿò¥C­ß[Õ)À‚7ÚvJIÂ-<Z5Ë¿À“ ‚lÛíÞþa]{ÂŽ6•šìe6ZRŠí“¸À‚€Ë( ûV]EÝÇX‚Gnö‘‚u„rô…™Ñ¤Ú\ñVi{¢“qß10ù ¸mÚý[E5ÝÖEe‡F_|ÃÓÙ8uPÊæ?\ªØeÅé>ß¾yõôÉonÝ<³™þSãº7/¯Ü?»yýø/ÿó¯¾ýþ¥ó·oÍi7Ù 5\æVrzê#<½ý+˜MvÓ)–ZAŒ:ŠlÌpÈ÷Á>ëîÈ1£ÏÀN+Íé븿äÝ€ÃóŠåš¡ÌöçËz8@ ¸A=Ï6‹Á3‚rV×®Q"3îg ˜@vš€¤ƒàfÍ2Ÿ=µðPaÙ#CZ‡Xç™T㹡•ÀæÒ‘4D>«1Z[¸ær1FHGašJOÐ+ë…+Íå5D6Áp%èíREùÅ?iænJè¸Q×HòZ‡¡blFÅ ùaö¶ãïköÊuR½AÝð-—íDc> 3§(ÛBy;Ù!ÚñYë£ù)-†¬–‚àŒ ]YáÒÍZ˜ 'Ì&˜Ãˆ!KHÚR—¯TÜ# õX‡ÕÇ…ä+ v9{É‘¯0ãòãüg`-ß,‚¿¤ãr!CµRÝc;#â­îÝ@ܶw gø×àÞ$3‘Löž)Xñ4Óû.ùÛ¿ÆÞÃP(d”$ ‘>$¤[ —Õ¾£§$•ž2MkDxQ˜5¼½àÛÚ·™E™!9Ö÷ÄÊÃõûç¯_¼xûþÞÙ}ѰªWq«¶'Û9IÀjÙ«0Q>s´ ÑαèÒ!>¸ÿ™)3@”l)¹+šA“Â5¼L†·S]»KÚ¬‘¦¢¶ÈÄO¿ P‹Þ¸º* ™Et¬™au“R]êÞˆ¸>àñ±•§ÐŒ{sI¸@v™t¡dú «é-Fš¬Ri*@ÖÅ×l«òEö&$ô¨3ËÚ|6ì´«1 ”§Ï„¾ zk —@u`!:ÎMN 6Ýd®ûMË=àȤ ÒõCõÖ¥ç(ÚZ àºq8Œ­‹ÉtñZ 60áÛ‘oVÌïŽÀW(+m&­¿›–pEN´TÎ~]ÉQþ²®[6z*qYÀÔ¯brHÐ/†P`œ n“é}ëJ†=0ÇFgÚ!Û:ø`*ª®Kbác8þ»Í$—Ÿsm\´AÃ…9èãǸú02X¤$¶OÇA)ì2•ApK)‘™ ‰7ËO‰ ÁqÙ¦ÂQa†2<ÈÀBIõ•©[™Ëi«£}µå2€òË¥û0Z©6¨ñØå„|.k®¹M±IÃ)œFT3Ï“¸;éЭÚoWŒšv9l¬›€ƒÛ¥]ñíÈJGEOý–“ö6Å å×c{üîyñ øòå(¨;UÌ_Èô%Ý^ æH™RFïç·0,oJ4ϲÑxÑk}‹'4Ð|æDB­%DáüUótWРeº]Kœ GRï:Q¤÷’¬’%àô"VZ ^dg´äôQ±€I}DÐh€Ã,e"7ÃÙŠR,hÎò‚í˸ü@ÚSˆCÛ¥<¾ÄåÃT„C œÙß 7Øœùye?FfS·Ð„å+4™hrÄ©f8©ã×_ÿÕÇ/ïܾk7üë·¢®Scü÷¯õ‡ß»÷ÕWwîÜ¿~ìpv:üøéÓgÞÞŸÄÄ PÌØ”‡"¨VyÃtÛŸôEŸ<Á˜Bl¼p^^ÁŠQyoñå«ÖF-¦ýìšÂv‚†«â­.Câè®–ëc†Õy1@8P`5¤ P.ôT}Øb¿üsòU š+Ó½‘à¶)Ö£>¶ Ïy]Y‹Míø“€C> `°AðjH7Ô‚ó}“T̈†ŒÿTsk.ÑŽª@pÇ•˜¡ñˆµ6öºe9*Nrš;Zy‹Ø€ÏkØIq4 !ªŇbùÀ>è¡LO Q‚m€3‡ëª>íµaŸï°D}Rÿ|SoÜt¶2µ@pËgÜSdO^èu c2eBLŠ~¨î–…™9 ¾=Ι‰:HŽCnë$M0Y¤–¹T2£e†% kÈ=z¹9i` ˆ‚pgþkøžKÊY U¨ü‚ ‡Ù¶2SÝu‡òç‘Fó­ãFxƤ炿ö©ÙtkÇÎß>}õääøêͳï~óÍ_y‹P€u ¹­-‰Ôr‚z-º÷+“nÀ™X}æXL`/[pÑÒ´V1h^Ï‘Tqkþ&åãæ:¸GºÎ¹ÛÃ|\Œæ10VË: ÖšähB®€Ï¬-å¨_Áñ‹j¥âÿp@ƒú–ÆHc‹?%]#OS€ìúa nÂïëešr[‡‡¥-NQöcÚ‚ ˜rº3%+-jniñkb‚##˜†ª‹2“±’ÔÆÅÅ©ˆ´Pj妴°ÊSôãƒ*¤àwiÇ"U&%1ÅI2D€ÀS™8¹…±©ÑÛvXv…˜úr7 ¨¸_ˆ©²·rÀ‘vÁJz/ù—6!ÿ² €2•¯Ð 2Ѳ1üR¸Š)£9­èøeäS#>Òü“æà#¡ª+6|P]ÏA¦ný.±è²¯ £ 'W Î\ùdlMY$ßñ6‚.·þh"$1ÞïºP˜Œ@ÓA¤/ Æ«©OŠ—ÄÁ—XÃß×2¸ å xf¾v‘D À| €V %ÿ`CÚá#‰3ªÀž‹X¦›NFS o3îi:©i‚¦ð|±Ì¾ÞmE?”VL–б‹ü¡ ¨å­G«ô**¯0 ±WC$FÌ£œä¶®º”Qâsy´ÔqLBˆMÌPfðå@Ä‚¢k„f™´ËzE磴•œÝ]F~öãÿðwbÌÑà ʩ² Œ6RF-tDÛ¬Å`©¤ñÊ׋˜ç€:‚óÝcZˆ¶éÁRŽO!6SmÿÓº¯e µW7Û~®©k:x9òº)ºLÿ8ÊØ7΂~H(¯Lƒ°yõw4à0 Aܶߕð ™,ÁíH7“€‡¾‹ %Å4ׄö˜¢³¤9àõ7ßüêã‡×÷îÎc¼}ï\g™;ÝêäôË?zwõì¶EBûjìÃ:úüóÏ •# .3.½ ý¾½‡ÚGÛ8Žæ·²®+WLYA†ì9¬µ1AÉë·¸òvT8RvÙ«¨Æ‹—ÏÌy1À…q2±] ê%Šnס g ³bIdbLV ×spØ2ösäógä•(§kQ¯ˆžUN4ÜÔˆ¾b<{{qæuãÆ¦æÃ@Àv…‚âr"q‘ÓÉíg(<}òÔØÔJ&‹RÒĘÜRV  ’PõèÑ£G2—^L`îZ=ÄGÅÜJxTSß\® ›8 mYO› µH¯ÜÑ£°ºDã, øx‡¾m€óú“¿„€2ªˆñaåÒWuKv•7-×ì\‹¡î¤9—us‹¿¶àO &&¡3,“à¸fÞÓâ ˜Ú…žò`ºÀ¡*ì& ó3[¯€ªÍ“öò§~Gâþµ‚ÜD½>JE@V>ˆ‚°y¿o1ouÅÔŠAI{0&kÑåÌr‚b0!btyâ×¥}£k­ÌðPþ. myª"`ƒvžZާ* 0œZ\µXôéíÝ›Çwî}ÿá·¿63ëC„áùÿ ]½}z;ßG¬4ÀI›Nïõ¢nv7ál£wnÛWD àt„h±UŽkÛZ žG£|¿.ieç~Ôr[QE?ôµ·OîÞ`kÛùÙégpyñêÉ5ƒÂ÷Ž®ØaøÙƒÏž<7Nyo¿M[áf†Üâºþ\°²Æ" gý÷lÑ …ÚÂ.[[tc‰¥u X×nYóí&çR ±i/Ù™ !ãÄgäë„â h‘ô©íu¤he^×ÂuâþsjÊ«(JŽc)n0?DàÀºDZ% D,Œ=UsT4¹î ŒF•A&' ØÖ–€㳠¥>{àC¡´OL`Žp<¸ʨ¨:¶pC ˬCo#Ôí/|®Üûõ½X=h<}ú h|+J›ÉÓ*ûâPÔ\´Âhöj¬ôDöÙ'º,b‹¯24:Ml'Þ?¸aǦ·{Z†7q8¥èƒ¬) nƒàZª—ÚÒŠvÝ.3ýJ»øÏQÏ(©‹:ÓuÚD2`0‡ƒ¦1ÜS6"\SQJ˜J˜o0–ŠfÂn6;ïdÜÜ(ÏÁMËÁL%Ú~K:Ó‹kåÄPµ^¡“ýd§ÉÈ6Ãb_œlb?ôàf= x{¿VH·&P¿ùÉÇO¼Î/³ýn‡ŠÕ½K.A™74ôŠcز¿iKäeÝ.—a·Z» 6HÀºìݘ‰’âk®@XríÃõOonÜ÷æÅÕ·îÞi}ÁjéHûè;9}ü‘‰­Ó炆¦aV-ó<Œ–øT„íPmF*ÆRB>ÃxÏͲw~évÓJmyd[„ùºN ü¬ÓªºG„²™©‚fÖ4F—ðT& æ0æ” TÍãa_sã™sÎx°H‹Üzš³ô žº†Ië-T§6¸úòùsá22`}˜Äðm¢¥q ›Þ¯ AKK%gµtqÚ~‡SZ·`BX4d.-âf4s0|Ž£‰ïEº ™fѪ«b&[­eeÔe‰ÝÖ·]0é-ÍÁÐ@Ж©&#¥±æÀƨy‘ŸåbžZc±3µš´b }`æ!óXEÚ_MƒìÌÊ$¾ JwÈAÓdÄçvÍ_¼F­¦Lœ ‡™’¦ø°ÜMÓkNê‚­§ #GIFC%Èty*]ýò–2å@’X<• ÚTQ ¢4*4e””#a¡“e®ÑLðgÉ $j¯xîH?Ñ Â† ^Ì, ëÌ‚ ΈUsr.»ÅU9¨@£9b%ù!§A¾­§AF …÷‹2ÿaÝ+“Ã÷-Â?a`IÀÞeÆšÁh‰SaÃòµãà–ÅD À£7o}e¦mž={Ê#C+³»eÜÏ’ÇGª*;"ܧ h~DsÞ¤ÛF4®-6I뇔¤ã]¸?ÐÔ_LÔ¿n/„”òW Céø’ð¼Q‘ò3Œc<å²·¸nÝ£x+šÜ2¿ßê{wžíHÃâ†ê¢+8,’°¢°¥D˜$õQhA‘ÃÁµùM&£Öê£o[€äw˜YogŠ[Ž&€7TgðÚ†:uôkG£pfvÎy²­ ÚhѳÂ+Ô5Õ£ ÒžáÕ6Äa¬®X­ƒ¼½Å¢ª¼x-_²lØÕÔÕÀ¬}øN…´~Ö7Eˆ‰ÅÓ‡¯ðŽ;SÅ24{ðÁ:ÊGB¬t8SOv!ÄùUÎéûêkAÅs|¦˜ný,IQ懟ü‰Þ]1frþò¼јa!| èŸjPŽ_™£«é9hpÑ…N¯òõýE…¬âoµØ2‚ ªÃ¼µå[¹f¦:Î+„¾¿|åùÊÀËx‘˜ƒ ÏAÀŠX)GBu8¨åZlåO‹‹¡XªØE¾vtéµ IDATP».CpX>ÌŒ£º÷G›:~öâÛëWñêîÓgOïŠÑçà{$ ¨ÖD‹ <ÍÖöÄ^™B#àtÎk!·0?_yp┼- qfÆý€ IC80g\ä¶ö(ûØx-Àá¯QáÌ!#GIð±T¾[™@É„¤_Åä»ä»•ЖG.9‘6€V¯{ˆ«1vJ…¸Uq«hZ‚ý:×MaÑÉ,5\±…ß„·wà÷#¸ÌöóÑCá‚ñØçŸ}¦É'ŸˆzxAjUA%j} Yp# íM¬œu$PéØH‰[°Ø¥nÃ^®¢eæCOQÄZ%\j¹ÜâªPÅI²æ\¢¢h|õò…2Þ…m(5†ŒCJÆ’Áá ÉÝF!P=/”­) Œ|e\0—/Gy×ï>òdׄ’…A yÔ«²ÂJ+>²¯¨ I9%¸B^-8ï-¸K24€Ä-˜hÆvå1@9EÌ4Šuõ3ªVòðÉŸLM^õA­E$sóRÞöîNÉ%wé­ÉSå6æ$U<™šl?{é ˆ¢xš(ê¿„!Û*B6ǨÅÙ‡G£), šPKë\ÜP! kùã ‹]rô« rT÷{‰à­€®@^]'€ûÔèQb£uÛ„§ÊÇÕQš¿XCD0…º‡Låá<ýlèá ?tZ}€èô¹4¼#œHjâ,³ã½Å=1¹‹­‘üÇü÷Ð o€V~ƒb L(¦‰Y—ñ]jj–ºðÆVÌZ¹z~mg¨"Ù€&Å UÑœ_cÍ©‰˜Ûa²-çéà$ÀLf-6ÛñðáCµN<£š$á̆nÃ#uT‘^°@aÓP[W-Ýj ’ ¯,U§Èecœ»¬ƒ|ˆµ»F¯>éÀ··>XiŸû›ØÞ<>?rûÑÑ·¿¾çK·¾8·âûê—& Àßáéx–Ó“(Âh#KÁ™¾ò¦±½ù…VÓz“+pŸ‰êN%ŽYÆ%Äb/C§SѦÁ0#jƒVF‡À6ï³gG‘69A…ê“\¶ B°ÐÃÛŸd¸YÔq4°E!q0S⇨|±ƒïBÜx2q 7OYœ_—l9È×¢_ Å¥¨¢ÔL§Ç éWؽZæéY‰1æóó'øÕ–ÿÉOÿ¿[gÓ/&Ú/¼ê*søOŽºø?tí8!=Ä7¤QàçÏÚÛB†™òÁ®np¦è¥ÿÀY_èŽ:éî8C~<ºÈe¿v TwݠȦFçëÜ鋿ónDÝt?ÈWPh’[G+š€°[éU -Òm¨@Ù:i'í¶-Ù^Š´1<&‹üEx+Þ¸yëɓǶß:p@"^”4]y\xoæR ”P Œ ¥^º9n(‚×Mxƒ5·TG¥%p#‘AÆÎ§‰H°B4r¤mIZ!äjõ±…À¸ˆ¨¦eóŽ{ü€3à—}dŽ*%”¯ÝÑÐLßëÛ  Ge…U‹Qí»ÁõÀeºï ,8¼ªL¡+£$V<[þÈ_PªôCCT ´Ñ"‚(´¨¹®LCAžK¦2n]ê¢}Ô)v©ˆ_²Û¶6Å[›‘ NON-éóy?[œÕÅ1…éfœ bFLÕ|F–´ÿÎÜü¡, `ÞMÉ–VÑ‘'0eXK*Ÿ¯ÕЉÙÏåä$FÒš¥m…ó×ùRù€£M蔳¡*›®éµ£xwz÷.%ðœ\ìû9=íÀ$1¡9:u“ÐlW‚É…’ÞBïÞ„YJNÈBéê 9©2,¥+ù”¢Ú¯×›Í™åÙ2fèÎß}8·>u튯î½xòøËßûƒã[_~óõ/OíŸ9½yãÁ—çŸèÁÕÛ×®pß÷ÎΞ>ñáç:t‚OÍrFÏë2Ä ¾ýÖa`¦²¸cË‚ºÏG¾Îˆàš“„<þqÙŒÖ\ ©‘W}üî¹Ý'ô Ö²ìN>哯WŸ|ûðéãÇßýÎçço|Âö u¯Ø"‚F ëÚQ»¶UWöôñô&æKµ£_OF# ¹ï| gè¬Y8ëCõÔúðëlæ)ÞÒOᦀÅÊ)J8¦ß¶Ç–ÀuV;;Ekõý£ýl¬WNE¤LÖš/1†ŠÀ9堹äùñÓÓ§„‡Îôò¹ÛÝü™U¬ ßI›|eÒì„}B À}#ò£· ôUäh^—.šì„ùãGx…m•s¦ vB.ÁùŸ3u¯MzÙaç4@\»7ÎP3òìØ–÷õFlø 9’lYsÑÊ·ýV„¡…dWâp8$@7® `ÿsž†TlòÉ:yîyòdVVÕg×o#Š–‘zsÏ;·b¤!ÜÈœ™—p­JÞÜm“:?7ã·J#êq®K{šû@MN°+ÄD¶ðÞè+L(ñ`€iR"·”‹h¢&à¶\xáÐÌŸþþïÿÞR ‘p rI‰LiÜ•æé¿LÈÿM:IGù½³TïÓ‡áW¶æW@1vZ†í½hÍïu"ÈõZ2÷^-ÓʼÆS›h•ý@)ZáðÕëÚ•Ý<, =pÔª ‹lû¼5SrçU{Fy> —qŒNØ`º´R¸wZ¹%þ͵D -e–¢üÑ&oß¿y÷úÜ‚æÉÉÍó7ï^½¦j³ÔˆIÀ!‰;}«ššÀˆTëØôV0Yaïß%¯ÅD_Z÷é Âbƒó0øÀ:´4q ?!ˆ>è* ÜßšŠ-L&í§ý4©àÃÌMOÞØÄ‰íz¸,A ÏkbŒÖsך\Â=Hi¸œ‰Ò ×…i¾]üÇ3'›òyŠùEvo7Ç@Ÿ3÷ð/ÑiWŠÈå;Ú&©êÚµž}¾ðZ í¶{ L[CêsÈõÇÚèh^¨û¤ÈºW@·ˆ×®XS¤Aò0‚Ò°ð/1ÂŒˆÀ8¢¦7š1jÖkÆÌ>ÄæOÖ½•þûí7Ïžýðàá#æ‚B­Á#j4" ÃÌìpàÀݦúðá‡gÏ ¦Þ.W3R’n\8ì7Pƒ:B/“H1¥ghi^Á%ø_Xkà÷5z¼ƒÍ^1«°úEw¾¬|×GdœÞ:o­e¹JO}éð/f/œÛ)2±¹NXžÞ#wjoh€é±î9¡2l*eSM.ôiÜA˪£ìŸ€Sc‰Ú[YФP#Ò7NÜ" 45ÌľF(3I&ub­õl×0ñÛiš~„bWK†Å‰N<üÍ7ß|íó_f›“–<éGßvðþ¬àö>ªÀÊaÊjñÖ8ÞÛ9&FµËȦaÑæu+ÞäÙsƒ›þ-iº]À(Ø ‹Õ _~’‹Åü¼%GôY&N*d<#‹ “™Ÿ`’V¶çŽvZ{ŒÉ×P÷Z9R8V™wÍb9÷^¥±ƒ‡È¹È¦þŒ‚V,1³[fG\¨è:ãfñî.†wÈ‹ZöžŒ@þ@@Ï|Ý¿wÌcõÁ£?þ·ÿÆ+J5Öí¦½ôÙ„¦Y>bÚàÉÙOˆéˆUÆö¶OJEÉÖ¥#úÕFÚ¨ ‡`ššÄ(j¥&¿ï%¶½}@d€¶©ÿ¸€¸ÖG”ïÞcù» Fpy~öf)«‰7¼{ž<ùæË/¿|ôø!Ü+˜ñ>ç$6}쉼´i”-¤‰D:šû8™ãàÄ IA:•XU˜Ç‹Jw¸‰!#¿?ºòúå‹“ã»ÞCvþúÍÍëW$4æ‹7=Pª…Ä‚ózAíÍ›Oø¾ùá>9ê ÿ ^ ä‹fŸä"¸*]‰íüÀ`¶4tð¶í‡Ìéà‚ôÔî#éëŸ6É»q|rÜ(q³WÄÁll"5:÷¦ÖŒÀÀL)ÑÁ€‘ýCJpɘdß½6DCØ›Šr&õjÌô"ò´28™\*[0´4 "dûS×€d1hç*ðäåëÝ,·yK=…Ié0áz”áœ{2»ÁÑt"+PsWæþæÍ™â›™Üºs[/Òm 0ÝmÉÊBÂ+æÁYäÝZù’‡Á GÈç{&Ÿ&Êæç§, )µÙ0€+£$hÝX{××?i’\*šÀ¹ª^6ØÎO弋RÆ]Pä}Î4ÍFêøê\ð7ØØú#Ø7*”ûâÍEÑÂå ÒðãîphSŽ&¨Ã»^ÆvŠËždE—ÑGRH\ÏA„å–ʱ$ljdäv8€ß!“Oì¿þúklܹw׋yoß»kàMÞroL¶ ȇE?D!æð¨M†H;`#)%Œ·Äƒ"½?×ÊÎÊë™É3h.e¯IS¤®ÂFo:cmÇO¨Œ]À‹kM7!]UŸ¢°ðã·Ú¦ÃqoÃøz«ãA‡Î§mýWĨëµ1hYšåþnÎ`c‚¹¿ý…˜4phé­”32J¹TïKÎ1À»4wö¸ŒÈ^jàÉe°K`;¬<éÝ(Â)Ð$•ðml_AÐ…‡«= .Á ~¥ @‡}Ô52v·ÛA"Ôâ_ªÐDAM0ãÏÛ¡ü„ÁUI6­; hªÇgä¯>ùªwcÞïÄÉ8ZõÎ<T•RkN'ÀÔ•¼U é‚l}§õlq fæïçPñ2€Êг¶µj.Za™„9œvqÙœs%B¦Ü08°Ííµ™žgYúU_é†Ð¾‘+GÿîOþØM¬ù‘“…²¼$¦µÉEòèBm¿cÙT—ª‹¹uéYÓ–ÐhEG"êt•áb÷  .0Ÿ€¡`g&idBÛUƒ“ríÝ!“M›­ï% ‚MÆ=þU\ãtø1ë·5]¶½ŒÊV³V\dߥõ˜¦Mb °…tæ¡›þ¦neîå}ÿäÛ¯{ÿáýY¹âòfFüÞâø¿þçßž<´M[ ¹y»kÍwÉ+¾`€–¼¢š›­ê×”@‡{^8wU+Úsû\$ÒC¾ýö[½ÏÝ"•¨à8/¯—u`Þm³=Þ€¶ä"k¦ô>®\|tÕì(Œ«°cL‘Š›²4¬järeê)ÖìmÇX÷˜«%jÀHk¾ØHá²/á¨]c©ú’4Qg ~²î„¨üœ´°à~*Ë8=µò&–û1ó`(£"º"®`Ã9$B0-¸I± óp2¥e3³x÷|ÑzH^äšÉ x¤±4®hý@1†l`X%öèFoLH€Z Ýþ)ÁŸ‡àt ÿ=ÊÇÇ_? ¾8)­Œ3YgYq†c,Ûˆ¢NÀމ­ ö‚§J Ó¥‰ð¯ Ô¬ÔŠèp`€YZç§K4ã§&ÊSÈO¬žÂ¼ ç!ËFjxòb&ïÚQjÑ~™»ð‰(bÙðƒä®< fk²rñ™•…@;ÝEDRX0ÛßÈSz\C$áÞÅtI•bÁ i–r÷öñ=O¡¾ô‘Ùï8¿%±UKþ ƒi,L ìÛÔ/`¤I„øƒ>çky‡ %BͲòUAOÓ¥6ÕЯ¬ŒòÀ L´¡!Vá skåWpSµŸEΈ®Pà£Ûª·é5ÅœZ+Ü…`œÎÒvù‰¹™œŒK€¤vÈR)N`3iÔ“d¤R /¢ºwÞg=cžJ)01Y¯yò]{*`øöÉ“Ï?ÿ´æ`0ó@Å¢Õé¤ÎèF¨÷ò4£†äLÃPqþv'Ké–àébù5Ҝޜxd‚ŽÉ …þ4w¦af; ¯\Ã%ö¯à '€)H ãÓjLj“?/Î~ühç“75Ñœàeu„¶ÿ×ßýÆø·Ù’Ÿ¨cóñãÏOOñ¯G‰æj<ŒËÂ_8²l{.»ÇücŽ;ªüø±iß“'O>|ˆa¯D|ðà‹žFd[iÓZ€–Ð’Í‚°&Ò›ìÊx¯ŒÐôíÆ‚HùQÑû(^ÿ¤1}.?f,pÑÀš;çÏ30Š<Bn[^V¯ÍÀ†5Žuô¡PSÏ€5äë%ÁMBfc£ÒR“mÞ{ÚÖvød¹&Fd„Ž!0àRcØOZ‘RstIE[ JZú‚ÂÒ¬̳ç~N±ż ΗZ¾ûî»í¥šÀÙ·#: +|üÜAIô7,nФůßz Æ}c$V ¯³f¡†„1&pg¼·ÝH?ïÿQùÀÈ%”÷ˆÂ,“OÔÜ[³ºÊIÇ''«WVYÇÙÄÚ÷Ëé<‹nŽÅó ð¬é^1Wk\ð‚€3L>|ô¿¶•æ<Ù…u­%¯‘PèÉ1ÏÏ”Ð$ŠøÊn3?µ©f倬X>C?ÎÃŒ Q4äŽêŸü÷ÿñß-{”÷ôô!ºã,1ñ-ÞîÔ4 ¹1—# ¿D3UøüWVB¹'³ºÅÔ½]ùkϽpdú6hŒ2që§«Ž¡ÕO¡ ^Xº9j, Z-B/*?ÌKWC¥-&.i«¡Û>°¬o¨AȤ­»`Övšë8Ê8ÑËФ<èó›z´q]€ÂHщ]ìÐÐZˆ^ÆÓ¼2ެ9¯ÿXRÐN8$0?Wp0 üÃH ’"öZí‡ ƒõâ2È“ó« 0S täxÐ×0NË]3ÖÚ‰‰‘GfL!öî`oDŽÆó=.¤Ò¼Þ Ÿí€«R37øZŽyŒ æH‡Ý$re„v59&˜à?Ÿ1Àf¦p%NXðIœÊp×ý™À& m÷Öf¨ékÅŸ\£C6áÝÄ)˜ú›éBDiŒã–ð4*5‹èŒ"Héß´„œò^ŶƒJy&ü¬Öcš;´F¨Ì ßâ¶Ñ­_%êZ-¼ŸÊcå&œÂ0l(+¸¤3*;–Ã3`n‚_¹ßûÌ—„Á4ÞW“¥+¬™C2³ä æ£HFQx̽áwi´:þ`_ùÞÛéöŽ«-1ÈA}7̈ɼ×ܺ¤  ’ ¡ Aqo/Egð+hÈ8šŒ% éÖ Tí'óo“ [J(XaZÕlÜczÀˆÍilqØ|¶o}æÍJ¾ûâkIóÈmßí-9ú¥Mî“!²Éà0pR"ò£œ:ÞÚf JÖmW’§êà×r¨R}üÍ\Á&šlÜeÆ‘»ç¬^R3®• Ä ‡áÖî¹+1c<0‘§Ì@ÞÚ«[E GÏ­+(âcšWžÞ˜“Nø.›×$‚†O—4Ç* Ã’æêë½s LQ^<'£ôÏŸùLÍ;ß,»ÿà>Z¶³àíáƒGó6¹¸d±Œs vfÌx&òÜ…)ÆñT€i…ˆ/ÁáG4Jưa«tK6`Â"!¥gÆ ä°Ÿá›¾í@‚‘‹p¸Eo: gÒ\9„3GÑJp9ë1)aág«šà¡ å,覞ˆZ‡àˆP€µ¥"Mü„ü–‰° c•hήb@å.MPŸËNwr†œB‚wi›X¡fÆÕVëCV·ÔŠÁÃVÊ5<À¶€Õ;”i^’zÿþC©™Nñé¹$~l‚n$6¯¢ ÷1¸¼wg±‡°èÒVÿÅùúõ¹ù†6D<ᣠ-š³ËKàÄ1™‰Q1³µÃÓÕ+üÁæ°°b’°Öuæþ{ù e€5tÀ3‚&6Œ*/c€•ÑmX42Í´gƼ~n·Åóò£¹f[s´]r^7«üÁZBû)‹’ÓYìe#¿nƒ¯ìì0•ÒV½{~UghTƒ íàEÔ×^6^Ú†w†¢W5±ïBY>–ÕA¿ÖÏC\šNÐ8¡ÌÙ!DýÄŒöêÕÿý›ßÕ$äÑãH8ŽÆw{×FúÊõ¬Ré<¨]¨â¾=@2Þ%„¨AÂhÍÕaŸ‰t>ãª3ü§=[v ºÝiæ&·0[°Ùdrü¿×I´û ’1²¨‡m¹Øg¯ÊWÚÔ/nÐ(ñ1FQú2N ¥­QJfÒµ—BSšôŸ·³H×U‚¬§QPç YGôo!ŽÞd,So«Û’Z`Ó¿Ð*.ò:¹Eù›À "4‚¢çˆÐ¢ˆ£m³©r•³õÎÃx}YY pÆ êË »Ã'T´âØÃôúeEŸ=×ÄLò’Ú†Txð0v¹êÝ5|’˜­Î”ØÙ¤Ñw ý"¿&æ£HÈÕ 0v$×êÄ3ÓSr°ÝRr¨pYÓ¥<p?g ÊNÊþ²j©˜| (CÔ&$Ïa‹‚L‰:³;¹v¾j@™I‚ñÙw?Æ1°ai®šn]™ÛvõÍ+ÁðoÒë,Ä¡H½¨ ØÁ%€!½?Ñ¢mæã¬ž­QÔ¡Y\×ÖÇê–m—©N˜±±öRãÐWR«ý“K)s”Є!¼¹ê¼t“ylm¡Á•”U¿x#Š¡™ç³øí2‚¿è.†Dzù×ÊO"šß2‘`žÃàçí¾t™Jý\Ê+2?qÓY½¹ä ?ЉÀTÂì 7ª¬€$ƒ÷ÄaÖ™+*ƒ‰¨f³…ÑžI» ÔÕyV NŽÅÕ‘Hã‡õdaü½Ïf ì<­ÿêŒGÿþOÿä®/æ°S×”…œZmüØÄ •8PæŸìNZícÂ,4ãM 1ÈÜd¿Å¶m5q•™õjëü”F6—¤^ ÿÒ/ÞÜ›ëŒVˆªï^@kf½8xn°“55D!D+=–ö`§P˜~E¥¡õöU/Åq;Zj<£Ió¨Ð6SZà¨ÉtcJĤy0õüÕ$ïäôQÍ–€Ø!Á6Oßxòä÷:LO‡¾{{öÂ×é‹3WpƒÏò‡iNo‘~#\û¨ð‡é«VEð—ò&4øÑJN¦Ò(’Ç\ýðõ׿Õþ@c8ž` ÉßgóÕñZÍËQ€AE(;4i´œ»×Â%‹ÃkøÕ/™Èo‹k‡Â5ß]8 È‘ÔÂ}üQ5``.!ÊA•éÇO$ÓÜÙ¥%­R|d ¨1,Dåï[ÕÕ@I«ÌýÙùâéýf’ÑôþÓ(–è» %*ŽMÔ÷a8ò3ÃTFK%HçO†Sï'þ©Î~aÉ|y柞Íôðl[nÀ`Hs¨XGÅa’fºModQCç+„jœý¤¢ÑX™œæÎ+ x¨Ü`1=S#ðhãœÐñÕ—¿EôÞɱ3}-]^— ÓŠ†rÍfeHàM¹)ßx;ÅjÕ—ÐÜ“ñÚ‹÷¶ä?µšÕL"k·–Û!Á6®Vo®*#ŠÌZeæÔÛøÎ@£ùúžùÎd,ãÆ¹‡Ãàµ`” f5<|¶J’«Œ#a5ÿ™5BŒoºcRC2™’1áè/~õK»ä:ºªM—f¸.Ëy†KìxÀ’°I 085…jÆxkTvPùRÄrÄ\™à¬•­æÐ׌±¢^³ÏnØÕ;ºÏÎ3ZšCëÞ\zìÅ•ÝÁ$˜°xæUªƒ“Rk›G  6Õ|¦­<»¥iê+4óÔfºMµÝL"4Õ.@«õjîÐŒ!¸‡]Ïóf×1Ìû²½Q·ýë4¹Š"ÎmªÝ°ñŶªw?þñe‡nÿíáƒÇ‚‚áÛ£9Ò,q)Љ¤AÁ!• ‹eTH­€O“tjô- ’·ŒaÂà…e–#ÈÓÌ$RäçÓå`PžŒçpÕ¸¦[·Zç˜ H»%ãTÇ çt hÕ8ï±þ+¼©¡æYË£¶±v2J­À¨§a­”û•@,Ù5ŸUöÑr¾mcž~­cçi—ÌùõOõŽÑFÉe!7} DQüÅ‹n"ÛuôäÉwôprïž HÁ^¦JžÒâ%Í‹E“F‹â¾'4=¥×Ò©5ne›öõdµÄ‰CÒ-OMê–«fº“9DCnŽ´MKjehÝé.I“±¬âÕ‹­´_o©ü“PPÂÃhõã{%dôsu¨ò“Ϋ4§F6%‘<üܱNÖdÚÒ’!Dê9Î\>êÍÔb:Tl© †0k•+Zbñmsê˜kRðžÖÁ`¯”tüŸÕ²Ô¤Ý)gÜC+ñÇ’!…°>ÞØÉ¥¥’J{q® ÿKøÄ2y?r=í\Nì}So¿ü‡¿÷ §µÉW>aÃÍî“hÆcvy~vGqN <}Ǫ›>»ÎÓ^—u¹kª{›/eñEfÚ`‘©wVní¦×yE’à²;;ÙwsÐéPZ§¸´7_¤PI Þ²ÊÑ–žµÅ½9Ó†`o•Ì©HkâdI*»D†ƒAŽÃ"!D†ƒÎSëË*,iÏÞð^²0Í ô©r­y‚ßμŸ—ƒ\Y[àgû8rÛFMÒæR}_cu°±[²Œ¥Æ×gôZxµDÆùªÅ0­²«”z§?#ÅýÓSC¦V$J{ ç¨o‡à†[­ {xÐGP‚¢òñqK*!Wž8Ä_Îcñr]\`¤[$ Ï¡KBè(ªÑgÀÊy`£‡Î5ù:0à f%Í3n#5•혰1o¶å-?¡ÊZN$Æ<’§Œs]£[®«ŒgSo#3Èa;gÇvd·|F>ñŸ9vrHµu[ [æŽË¶”áW*]u^BK ïšë¬ôù8-öz§0ò’]!dÓa·ÕƒßK®ÓlcÍ=±^S蛩C×§,DÍæôК²Í²¥A‡æ!×놊ýˆírWÁú1Ñ e½°[“&*ÂÖ¤†3òF 1ôñ\vÇ1)$ë¡%X)Z[Úpv‰þSèEõOãZNB4œŒÓ¯á;­š³q6}r»Œ 'R Kv7Çø«^Ã9ñã,Lý¿ÿå¿ Àƒ+ü„`#|]ÞÅN5`”y>¸QéÒÅqãíKýQ öEÈ„ÓÏû±Í‰Íx ë†öÕÛvþrsÂ2*@>TšŒ‹—@ˆï4?IÔkP¬›¶ñÚž†¤åã-ÿn!ÿ¤Òð¤,\!þ³ñh„Ç( ò•ŽšèBÎ,‘ÖDòeHäO(xQ½7|óí÷0 Ù81…+ˆº\ÆxÿÑþ|6`¯TòÃ×_}m§îñ½M{!Ên-2° ®ê´¨Š23gb6 §lV7 )ûœšâ)Ò»äÀ¼K×®xj½ï1ºŒ.=øé væÓP+æVÆmpxzÀß4ã4nÊ04­»º:¿æ3/1“cub:›.ëK@ˆîp…Çøk3Z°4†®¯‚dUôq4¹]»æ ')äVó“®ã­2Õx̪ÇUt€YoðØçÕ]ëy~n §áhb>…ÃÊ$î3ñ~V/xå‡vó×Óò=WõñøØ^Ÿx’j_÷À‚Û¿V(…]ŽÊ ó´‘$›§åÍ<ž0õÆ%U9xzçÍ‹§ÿßoþîôÁ£Ÿþÿ'XiÝpöÊøÀEò"op0¸X@{qöºmœÕ+shðâõ­žø6>¿;¾ëkTí5Ä**d4¢pTŒµ8Íq›w‰8¿bÞt"@£‚DWý/Ì?u‡I¿²[óïÞ1¸NJv™ü‚®Ê¹-"3ËYè“OêæŒâ ËòXž,JÃôSbÚóJH¯ê§«¼†”9R Þ·yÛ˜f.!§ìÞŠ4ÂWêïp¿F˨6áa\ù¥_ºšê›Ÿé ¥’˜™Ñ¢¡B$¶‘3äç« QÈ྾GÒvÃQªî†7}ºÞñèÑçÓëåönzx+››Ñ=™EFã⸟qšþM~¸%0NEPCCÔ› •۴ʈŸÉœ,Ò‹¹íÅTCr,ÁÌ*Yä¸]]!Á- €UºD«z1»‹¦´·Î æÁðýÓyýo±™ )à¥_‚ëLWnz§¡Ä‚kw#Û‹‡Üˆh|3r Lþ¨KJ?ïðáMð¬K`U¼4ÕIl…ybŒæ'b4Ì#I½ûئäq åAØížIƬ1Ϩsá2 ½ømv<·ËŒ–‚w²™ çØóNTbΌ˜ã¦çlÇLót¼á„N5÷©VáB¬Ê Bþ3 Žh˜gÄD„™*Û4÷°\%‚ Øá»;Ï%y]Í™_Ñ[´^åre«ÆyÑ»×,d (Ö™!¡×øéö×uw©ÑÆ> ‚Â/ByN‰E¬“úÉúoL!&k,¿ç½ŒØþóuûšç¹3ûꥭœ"Ä;1°qß®öW,‡7PdJD=hdp³ /úP f—=¾ûxçøDXó'pýòÿ+-”_mÚĽ±ão^ÂÄiõ ? Iï(ÅÃŒsÕK1ûv5“dÆÖsH½ Ÿ^†F³o_·íÑí¤æg Œ´˜·Uêè¶`9¾2Fɳ0Sî½É<ýA}ÄpsE s㎇EËic*€µÊÆyo7þüDÅÑChà”Ö( Ú@$—,¤UËíž¿wOVwË^æuq×\Bå»Å&Öítûþû8¶õy?;„Ož<±Æ`1€ß[å2h!Jmæm†jÀ¢  ]Þ‰‡"µ«o'ƼUT«"?³¤LKØÊbR§¡JœVR¦«‚æÓïP€\¶­••ìù(õ…¬}æRÝÉ °axrð˜]3½ÌilŽ61lŸ§@egxÐÝ]Ž4¶õã®T@˜Ô-›@ª7égz„Š#}%5Ò)̈@u_|ñð/ŒC…îÒ¢%e*ŒçMzÒK¡³Ù7]9\šXÑW®áQ#4ÓŸ{ù\7kû´qw| Šm˜¢fQÐOeÔ¡·ÂãS%ßêomÕäi …PÁkû9¶\æÔ*½}çÕ/"Ÿ €ãmPoºš±ú¢À…”aJJñ NL•œ[ þÕŒ_'Ì'žñI;f£8¡;©}=æ‘Ä#Ù?»Þî–Á¹Y —|cq.¦s”tm²Ï¡#rk€ÜðòÙä1„aµ‘`ª(vtÓF²¹¥{Ë›çž?}òWÿí¿ý_ÿ÷¿>yø¹ötˆ åižL êkn”–å›u•ž©·5­}l¶k, ÒE‘À;;Ø‘×ѳ^ÊÀ« ÿ,Je€Ír>䜈£Fm/wÅ™[W½S†ÚÑZ¡œA€2É…„ŸfBHíÜñž1þªÕ>=+Pêçæø‰«QgTSük=ÊUlŸ0–¹ñ@ŠR² kØ›w<|½,FÞà*mI»—áÁpðjÝWËö˜éC=*ËÉÌ©kâCÊòxHý£%`‡‚&pÙÁ¿°¡R¯aŒ”%òÚélò?]Ì·ÓÉ ¡KÚRÄÂ/EDÇÔ Åܲ_…¥éWjt¬ö¨S7Ñó U©`,5Ê B,Ã<ÉBÓq6 3N¤A`¤ш)^çýú•Q\hé+†¡l…ƒ0Ì™@Kl«¿í‰‰¦9îËP¢C®urlàJ[Ø%¬wï‘c^®Œ^ÈMVuêI­~ÄɆë¬<’í® ñÁVI4âCȃ‘.ØÕá½¾«ÛQÍ4Aº{„™¬ÓãĺT{°˜€a@ˆc[¿ä뀤zªs¡“ŸF l†„eÎåÖÕË5›,¥¨× 1W·hiÅh›×[FÞ6°Uš»B?þñÖ®NOð1mÄ)\”Áº ¡-å ‚U…r¹‰¿ÄÑI±bòÌlð܉‚K´a±¡d^jL¼9ðLÏ:•¡]1U*hŽ+gNµÊá!÷îÝEh^ZÖ.¡«+4íÓFÄœžbdQƳC°fÜò_•V^\µr„‘qŽ´åBÌ’6ž”Ù7¤óz[£#orO:­F‘õ!5ÎpâY²!þ51r®Ä™žñB:¡ !Ó¸¦ä³Q—r „jm´^ê9uþÛ\ÄxÁéZpBŽm•‘ca,ZuR6R“/!ê'°óç?:_ýöË[Ç~öÏÿÕ4i˜!œÔcˆðh@ÃÅùë7,ÍbܰT¤@qÇMc[ÃUÒÚîUð^'±s0$楦­PŽk5‘ÆãkøêUs!÷Ÿtv…ؘÀ%öAeÐÅ€)/g&pN9³ÛW{l?"®äZ`²¦·1Í€J(ªÀ!U¬WdO¹B>cÏìfŠCA_Ã9`hý/òø ]Ãô‚8`x2¤j\U3nt Áê.¡ËD„xÍÚÈ%|:ƒâðÓ£«”èïG±´f wº›^¬3©Œ8 ¾õ …¢8ƒ.+ àI=:®Nezp,cš»4ŒåEÊKZ~5äR "ŽàRþ6ÇÔáS¥V0;Á­ó„—➸å'a…ÀAPWÒÜO0Êüg‚˜”½å Y‚.@öI\ÊÁ F Xâ™3što9†ÓÿÈÛTgùÙùç¶Zö„>M*WWÎEôy%:ôÊÚ€ZtG¢Tôìùs zÂñU[ŸËEršÔ?œ¤×Ü¡­1×™z\ÂÍYHVÀ˜&Ãv1qÓ©ÛâÈñŒF‹ˆ7Á‚„™fLõã¿ ޖãŠè؆"ä‡³Ùø?ü' ŠÂ£Q˜ ™O˜=ØK0Ä‚€Ç{û0ÈÝ;Çä‰rFá³Ï°é+™ëkWXL^¨×Ò‰Dâ“û)¸êO!©ùõXÉVÍ‹3Pòlµ;^ºªŸ|ìùWxÚß½Éëò««ÆZòsGg1êùivKê2 ÿ ‡²n‚-0Fˆ±“ļ­T3ˆànû‰« Öéõöé'ÄoÝñEº>ÐfsÝŠÃ4šw·‘[çât7þ”£g¶¨uŒ^230¡W0[gâýÓP}­[[;ô:×KúóM_êZ-**+ºë£ó ξ¾b-á†ynG9ä9õ"·„~mù+AL Å¸¿ýÛ¿ —·QÚ0ËHÔÂ?8"ŸÑ„6†n“•ö3Õ½‹wâ#Im_ñf5 àÑÆ°Ÿ˜Ã° Fõl`4ÿï¾ü­JÁª®?æ,Û EÁ“pÂ4`ûó»éýÊç,„±:—Uãêbžd"5xc#ü`˜˜P)cbežÀ¾cºÏ!ti€ƒæ±Fá´YSHªfüÀp‰‘½ -læ bÕ´2¦ lTª9ÕU²/!ØØ_ŸŽ—à’7,©]u~#k·ÊÜ(–ns˜átÖСE5Pí¹™SO¿¶[|¬ÀáÛ¯Cpá#Ò³Ó‚Š0;rB|ÒÆ3ÌX…™oŽÃ·Až©v\„sR””fs+¿e3‚‘&éAe«HŒv ¬ ‘Ö\a”ÀÏñžõñ?BÉ6J:W K_.+;k`Àl¦°•^e „ûBÎÏ] áÆ8‡_+ÌØs:ÓÒ\T0Ìèu ‰¦DGï€Ã>IÄ—zûbÁÚÆ`ð K ™´´KxО¿x&ûþ»ïnÞùgÿâ_:RèÉÔKC3cx(Ÿì¸MeÞ<éà`¼‚P¦çÖé-Æ´Â?7¤I+yÓÞÌ[u0¨‚ïù^;H¼±©?W1l.iž|ÖöŠóÂá§Iq¦‡Æ›ONÉ0 ˆq8‘ÀC »»\¸Ú à’å̱o”ûöÊY­ì˜‘«XÙ¸xÒ DCF³Èe•´A?ʹJ?*³ò8Éô> —G=4‹v&–ˆ[&filVøaÀ›¸çv6ërWËóÀV\CÅë`üe 9ý˜ª ðo?Âó¨«yÂàI0ÎS8„-.af9”¼ÃÄcïu=ª-ó úÐOªpiI¯– Ï“'_㪠ÒÁ`”ìö‚1ÚzŒØ§zŒkeTš¶†ÖsV™÷Ò¹†Å€n×ï@ºJ4(åq§ÃÀGŸ0 @<Ì"$Ëí2ìì*´F´C„ÁÕ`nÍÌ4s!ãô°•>ÐÅj.’tmŽoèÎmƒÃÉêBŠC€•!'š¨DžÁ@:°—:záö¹},I=÷åÁ;P7nú²È#wˆ·3F;[Ü2.‘š—°S °a€’É"OBø•]¿M55úŸ`øIÞHܹßz›ž’r¥4&E·úh~ðçÏ–5Y#æõ0œa{® \9b¢GkܾŒB¡”ÊÇÙ‰‡ºË˜ðñè¿øsÚÁ=ËòBe:ÚöRÙ^‰!„®/âeËÆ-‚QÐÃŽ1FN‡zL( ـÙQ–7ƒŠÐºŠÐНcBlyáoãàÓ/ºi¢gu›ƒ°˜Ôp~Õ»(€[lÏœëÐp¨«Û„ÖÒTšÁWj«Œôô¨d˜¡N+M(˽T<ƒÞéëÒ fø!„ØFs“§aèÈ[°þæoþÆ"o[†„ÕA±Ò-•C‹IC£¶Æ3´À#d„Æ$ð)%0´M2¬K ¬á¨º€HäÜe6¿£2Ò¥|‡ðÊX3ÜÖUº‘?´ºJg!‡ …«¨“ã[ A¨­|yåà9àİErC|e”aÉí yëaC8ËDöÞ[cXm…OÇ &GÂæA¯’5‘3é½.çµÁ^?˜B[2‰¬ïMïÖ½A*ê‚ ˜3þf5»Eù„2€1uÿ“')ì±âó€Ña_µ 1u\¢A®!°5éQ@ÿÙ©±ñ´ñ¤ƒbbì IDATKƒÓ¨ÓÆð6#~ìQShñãn2–ø3•` àW h‚ô“TC‹ ÏTáª[Ó ÿ`¼×ÐÀä dÎèGcÃaÁQ“%AÊÚªÜcÊ1 IO ^Ë35ÄÌB®\ôÑëݸS=YúYÆaMب€; å7TÇ tÆIÆ,VGÀtµn "ìI=YêqRgf´oÅg_½ò%Ouþæ7¿yø£/~ò‡ÿ\CŠÄ&q«}7òª°«â¡gÎs°Æ³”ÆÔË$µ¥"lŒŒIŠÜŽ"z1qÔàc—)„p§F»:¬î*lW…¤<Û !˜u‚°…Q{'¨ªwhµm¹ÆrØ¡1™^ Û¶šúV”ÇqüêÀ0-ÍHg¶Á1V*Y:â“!4+Uh¥ Ìz­¨øÎkyuAPç œÓäÃ^S0HOݧPên×Ì-…‚±'¸F•䢀•Ž…®ØÈ!·€Õ,5±nñ#ƒ??×úf&¨¬Jɵ"^TÂÃLóS*êS?xÊæütP.ýP†\Á%$L]hF[¨V ÎŽ­ccµ”r¦Ÿ‰åÒÒjQqÑ…„6jG¨Düî­& Ñö6Ž|™2-ÍW¢—D´­òºS$€Rl¯;³ˆ?5ˆŠJó“q¿‰½-Ï.8P¤y‘“!ˆƒš¨`Ïìë@ÈOf˜~*ãA×p^ÁÑy‹ù¯I^§Ì,ÀP1ÀÑ€ñå—ÿ`ä¢xéªNÕl>i•JÌÌ%ÞïZl{Vk« uUìµ?a¶y/‹GèÕP…0<zîÀ4˜­a}ϱE‘#Ë Ðê…Þ@Á.ß€Ó õîжâàm&F“&œÊHÑòj㣤µζrNÏ¿üå¯ÔÎðÖæƤ¬+˜ª2U2+ÔQä›Y2r3â6&©Y&ðL{g2!#ÃX“ìa&œåM…6]ÎS$ÊX²H«Ê"ÚÚTFyÜ÷¬ÍLÔëb[¯× Ùü¸XWæ¿¡zIŠY¤E`C>£5–[Œì/͉¡O³Š<ýÄL:¥¨™(½YþáÁ3ð=ÔÀo~ö³Ÿ9‹¤žà¦wTr8?W˜ù úÝW_=xð°›‚£8<û4³ À6Rs©a)3C¢’N𩉂Õg"€wu"Lih+‰¼ÛÕiòÑž>»ßÅ>¨VÌ|=ãy «xDR½K!÷ˆl=,¢À8õFy}nºÙ&Fãß5$…ƒe³ÂE I³17Z3ìé×Pøc ¼9„ *RÀ˜C£‰ ¾VÝáôeeb=€Kä]„òȸ“;¶jÔ# FA/ öÌ‹&¬/\ÁÙlhZËÀ˜)Z§Dé*'íPoÈgH0‰Ššt “Á¥F70Âæ'å–Í[@Ü·n‚æuð8…éÁ×À 9õjij°ªúÅÏèH6Á£À‹•lG/âºÞÈ€ »ä'öÒÛìÁBË!zâvñsÿžl¸ð¼H“Ú{.á0åÝÎ¥•+´—#Å|6Bbuî¾¹©›sÃÿÂgÖp¦!±O[ýKlñÙS¦3`Ì(€-è¸À£['‰ïª¨ I –5^öþ³+ŸÝüâŸýÜ8;>ƒT™–`…Ü¿c–ø”× =Fë?#åaèÍ MQ¸g(þÂ5ASÈbÿ¿1/f«×[>Éd³Hláæ»ïž.Çès¿"„NÝV‡tÜd©;Å«(xÑr ²,±æÐj BÑNl5ÔLÿ0cž 5Ì@{ÊPëÕØpí7î 2Êo¼ÀŸ‡–Ó!’lúby®•†A V@†ÃÛw¼5*m :¨å|ú §Â¢RãPÐTfÏ13©Ô 0=<îCjaó>Ó@eÜÕñõs$ܪÇ2¸‘!Ì­VWh*¸ºWd?ÁÛuÓì­;oifB‘û³òtÉ\W7±ò$¨N|À¨œaå—Šñ‚xºH,¨‹HÖØ»4$òÛÒ_þn‹Âa˜XlTÚÇÓ)„]²Ð³Ý´¢hcL^W°bFc‘Kãx0 íÖGN¦áfý!ÿt\Ú½Ê8qÆ$ÇC‹,[þ¸:—ªô3Ú¦ÔÓ¶ò'”=×À„ u34ÌÉ«°X UhG9Æ)V;&´4÷ ­Ð¤Oøì$p­ˆL@ç<ºö*Dx ÷sÛò”>VÝ^Àñäm®Bc¬ÌEµ—$˜8hóN)ƒí¦ôÀ‰Ð9Ød罦ÇalÅ’÷k¥íùŠƒT„8äV Ujåð lô2¬Þ§{ÍšƬx:»©BWl‡d™\Mì]®KÆ-1”sô‹ÿðçzH“©ÃèaÈ\ína¿†Z@ÌOs Hà!"­òÚ•ù‹11ƒÙx!áAr\¤úéÂàl,s´æ¢-sÖoçïà@iaê¨]õ[V@e8?LhV;Tø•†.ÁÙóns4Ì.Zˆ†r-óhv ¥F[ç!—ìêµ-Vå{‹÷ÉÈá?”c1¼õhçâúÓû§xàjÏžŸQºQÆ«•üôA™BAg33ZíÓ.½p¹‡iÑŃ» ^N‘®R¬)yù“óú½³«ÐN—.¦cϱ=œsóÏ—g½úÜa–cäàu|® õ3²=+›Îq÷Öí×ö_Ó°w’µí=“ÈÐ"VÂ*q™y©“£ù–VQ—³ÞÂVöš¹#àôi¿ÔÜ-¢äåœä5§Y[#4†HòŠö´n¢.=u÷G&lr¬±¬žPWÀ Ì~Î(V!B¤ÖÊ8ˆáóz *¾ F¤:r®óˆÞêa‹Òæv$H0¿î±¦!Ñ'ä[V¯-qÔÓ0Nág%mu`—ð”H!ëèÙ.}!0Ú,¥Ç¢UoÏû”ž¢©ÜƒeíqQx€¹ ­)# ªAÚ¡¡³ŸÂꀉرõ®èkKc`;Ó˜ŸšÃ¶W•)YUµP#¥ñ„ù ÿÒUÐd1M–à'Š®.NY¦fÆR¶*Ú°>¼•ɲ‹&r½¸NC©—soÝ3’¬hü}óêÅ?þ_v=yðÈ­$ê…Â’’Qä°—’†œç.š€Î¬ZH€B­u¨‹S©™`U—ß”B HêºxoC’>™«ýCjÛTaÙÕâ9Än>ŒAa³Éý“V «%åAx¸“ ÿšÃYêz¬IXkTÆ›ë*aV±l€t@¡æ¸}òä[ÌãV•äâ5¼%f澉Â4*jAØj1òp«Œ=ôäý/é˜æ|C¤†Žåõ=ðã &]6À˜5¯·«Ü1OÍå:Ó»ó—}õÙ:5‰sãŸõ3;åJ;zC²¸Dñ“šxñiO`o"@á}ñSÅj²#‹Ó#>!_Y`ÆÌ‘·¼Ý|±Þ¾3rL(e‡Áç2~<#„½H"·×q&+B†+EW)‰Ëk7 m’o®ÑºÎ,‚„^è¢R¥Ý``214J¤¤P.Ç0¯VVé|Ég–riLÛbà\GÜ0ÄF†Åüs¬/`l WrÛv Â Î^@Â0ÏÁŠ0cLa‰Oì‹ -5ÊÉr9=ƆŸ y7Úfø†'$ÜÆ¸ÀÃýœn=®>iϽeø©K™Ìœìé6¹{X0uC8™L3/ßñHǤÝ%a”#Nw°+cÚØ«jpí*§É=f§–ÄäÌÊ?çE<½[ B<ÓxRn1 ´èê^B~”5†$³Ñeâ+|Ë TpýéŸü ½ûåÏL•{}ËÝ–}uË™‘ЂÔr՗ߌ™ ð:¨,Gœ aLe*„»å½‰ÎÖ„p×&5ÝY<óî]ÂðªÉÇóE˜Á뇤'Fç@…°~.]ÓC‘;rÝWn—Y tAƒ$b!mçO|ЋKüiuÍ-´]­mÛ‘”åÇ(úé¹PÛò 6ža†¾v÷îWbRñ6A‘¢Lyñ†è¢UqÔx @b¬•â0$Zf (3·†20g0nGqG>„´Ÿ#5­b‡ækiRsxª@HBàð0‡L $ç/íÞÍI‘øæ›oþèþèûïžBý£ÇŸ tDz£—mz‰F»Â¯[2âdOŸ|Ì=rV[>Öƒ)sô¹IsÃ$–t´äm´AczëpØ"‡‘@ÙäRâIp¥• l¬ù Ãç°‘ºá£†p‰V“”KÙdEýޝøAh›S‚z`Øæ'–èd¸naLY¥Ø…›†ä‰b#fBg¤• NjŒÃ¶úT¯9>× ƒÊ»ïêä²Àñ–î Sû°]hÀNt%„œ=< NÌŸ³$ f+m–·äH;Ì©iÖìÇ”4áWBýà…ÁÐ?§Å6 †jùO«Bz_ݳ¥y™e]` u«"em5Ī d;Ç(ÑŠ.AH„Oœs€rKÔ5wÆ•œ1 ¨d™ ¯£môŸ¡hz·&ú¬z­Â©èìÅÙ{ÏÆ{BþÝ›Wï>ܹÿðæÜžc@ë Rè¢á2¶èÁš´êA9q6VäÒЙ˜R_Ì {S]zFžtr¤ÿæÆ Ç¥ë¿"¡7}¬¤ŽI‚°ƒž9ŠfMâúÃg,ÑF1…ïÆþìОžÂU£%.ñV5ºŒoE¬nuJq\,•2àV|¦&¶ZÚwÅ.–›©Ú þ^ÃóÝdé’Û‡ƒk?ÜLJ?&éh ?D¤3v ÿñ¹‚EAcb¶ð6ÒEýJº’Nik_)œîWÂ@.Alû¾‡¦Á´+¹w J’ʵµ…?kzýÇ­Z…=äñì‚Ì‘**Ó #z ½/“×Í—RµÛ¶™€™5}­Ý3¾_9;ËXl ›r°Ä+‰Ëßð/¹¬fÖ>èâ8ÓƒJajkàRï804Fã*¾@n™à ™F ¡”'8\l_Öè“(J°Ã³!w©¨!…­5s3ÄèS ‚ÖK«ÀÔè Z+ø)ßôP!жoݶÊ𜶠DZTGQXf þëƒÞx<£ª­T&Àš­uÖX`ˆ$O•ÞœœbÃÑkŒç¸Þ—c zºmX‡‘ÌûØð°raU!ÍŒ§mÂÆÊ(¹ªSú‰"Üù o¹Ú–ëðæÃtBnþÆš¤Î+.Xqn,š-{y”"U³Ó\%5R}Æ‘ë%j×´,<Î$2É;|‘‚Ó%ä¡€¦Þê¶Bß÷›dŸ&˜ñ8¿´Š‹qü àÔ{KQ5`g¬nNì×Õ³—gö÷pÊR7Ÿ ¸úAP®w›ÃÊÝÇë6/ßh9d² DÆÞBW€BEy€l—öüÄÚÐzëIA*br!^¦a–Ž=Zò¥-+XÚK$½|ùìéÓ'¯^¿|üø‘¾,ÊÆq­·V-Á-pS#”òVo‰ÀÊ9ýã[â§÷%JúÁÙ¹©ö W³Ó‹Åõ:O+L*-˜r\y€¸ÐˆÂEoܼm4zùòþóïL‹½ìäMJ¿úñäô “h>z|þê•·5>zðÔ:'§Ç]õö,ZÛŠX´µ*cÛfÙ—Ó zØ•¤”Ï“Ò;CHÄËzK±•*[“3}z¨Wö‹ƒõ¢–s-ÏR;½ÃÂCõãÖx{}¼.¡?yÇ› CÅ^wæØúçˆf¹âªôiÇÌÚƒäñš[¶/[bιëánˆÅÞ·^î•Qó)C’Žó(­”Ð1ö™Í’×oœy=ÄLÉóÃ#‰ÆÕ£w$º;3¸úU‡%—;w-k“Œ#Œá¼&ñ¦ú5ÓúY<­cx%µñBé  ׯy¥ÓkuFÅ™ò"¡—_8ý4±®Ã"ù‘ôŃÌ-¹—é ¼ÚUrÏÍ#ÏÃcm%mòÇF6D£báÒº˜nM?"Ýà) &Rƒäÿ˜<@€®]Ô¥C:‘)ÑùËWâ‘~„ëèÝcêÕY/Ïô¡LÙ2R‰©9•!*A6:Éò|8¨ûb:ÚÍo¾ùVo4¤Ÿ·Î¯ð·–¥>^3¯Õ_¼|a üìÅ«ŸþäçMLŸ>ê îVÏ+s|óÆõ§¿ÿ^F!÷îÜÅ’Vçç/ pƒ}¢*fÆ8ÏyÑ¿…yé`†"yëbÝ¥Í]ÛZ!é̾te–ÎóG¨¦"„¢Uqw†À¦˜æå@~Bî'×IiÕÙaÄ{VPŽέp´ácãâ,@ÐoéžÓ¦é³ÔÕ#uËYÇÇÞ¿8{Ê¥I{î) ›øãUŒå§D­Ø:ÑUÿRƒ Ël°sâúæt1ýnaXŠ„ƒ¡ÉHpk^ît½‡¾»€e‘äË6v-˜³/ëØúOÆTÑ*_è½zÂ$e|÷Íïôšù,›@;ë‹Loäñ6¡ðtF_H3ó÷ÁPw‹|kËI]ÒPÆcÝW}§!¥a’cŠQdÁ:ƒâVPÝîCÍNô£P”*†(1é†ËP‰eVì °0 „Ï{$ÎÝíxþì»—/­÷ÿºÙ5o‡ ?´­9/RÈÝíñн‹·&Ønb >VU£: :Þì8³zsN³hŸ¤{ÞîV íNk`Ñ÷òÂØ€{D›©»—×4ŒÒ€K–%zúl½@ÏÅyî›uóÚ¤¬‡[æ' íÌiÖ‹²Gm‰.Ñ<ͧÇèG\Z믞½9ãównµ°Ó°î¬á·ö¼hiFÚkwnY›ÇiÝfEÔ™rÔJ†`ìa&õÌEH— ªXõg3)Dlhí.Ÿï¶2·)ç3«YnvsÓû±h Ó³»H;ÃMS¦ttçÁ §ôæ¾/î[Ñø½ØbGÏÐ8d,ŽvÄ,‡Vùþ¬V¬J•­ÕdâÂ(¨nU‰WÆ+¯M P)|?{ÍùË—7nƒÊ¡¬:S³éœ ÆŸýÙ¿Ñø+O]¶001eÕQwÙ½zjÓëÈCMÑ \]Çu&”K dQX´[^¨Êd›XÓÚÌö*‡J¢žµÊ=©U¥N8”‹¨Hy“KšÔROŒÈšÃõšÎ’šXãywqÿô>™Þ ”)¯Á ¯åO:ä0ß;YKKp£ˆX× (ˆÃh½·.J"¬õm¾¡ÏÆŒë×eåú qÄL€Ä1ù”ØåÎÏ­éûÖØs4}ŸX' #9: ¹ùY~ Ãô±ÒA—°!¢XI;¾«KÅ"—G'éÙ‡nôaŸ8¥`š;£K(WWçäRI‘Ž ÊÃmÀÞŠRPOÕ.í!}TÀ)‡Üc#ó­8î.¹‚†:¥ Æ$bʸwSd€xfzìÛœ[¸4—À“ñ@>•èbš1|rŽÐ“">ß{Ab‚ùT4¼xÓ¡æèêïæuoâýÕGŸáF9¥ì!q•ᕬ®»ÞOx¸ïŸ2N}'°æÄvVå“ 5zÄ:ÑÆ(z‡•å[:Jû?æû¾½6y|€˜iÕ™¶±G@c'»¸º8UÂã'œ[#ä4šÎô1D/&0<À¿À¢ • g‡z͹g´‘<´úÚ°& ¼Tp‚rB¡I­”ß§•˜DxVxPf)-ùbߨyÑò‰¹ÆÆ¹„W.¨ÁlØ@ ‡Mf'z"NlE\GZ©„ q‰Òë43CŽN I R]ÿ1†÷’%ÁãLø ‚¹uf²ÀÎW–^å7Þ83Âì+ä‰ûyy‰×‘‰ŸÊÀ˜ÆYº•ijػNë*1b#FŠ8À¶L³j²àl¸ñ3›–Ù£†:²ÙVé9|ÂÄ_ÉS÷’ÈE÷š{ôÞÿÉà}¦F‘ÓÚ]áÙÂvsV¤ry}?ï2QƒÊxäÅû'OžHÎ1€ÚpXÿRv6u^»h˧xìL¸›øwT òøCF4n‘bjê&0° >¹ÌŽ1k¹:²Ozcxîå)dÖ)(´@Yº-™À(Œ\\<ýþ©O˹tçö·'YRGÂÚÇyXpHgMǸPêb=—g}]И•\šŒþ&¯hvÄ9_ž=¿{§ ¯Þ\ܹw°â¢9¨Ÿ‡xø¤‡ 6¯Ñ÷M*æ[@²¦‰I†uW#$Ÿ S£»DCî­^[£†Îëmvb7•kQúæÍÙ9TøVLaáRóµn¸¤í±EK#®Œ&[2Ô k[XrÊ€q¨ !­ÂãÒÈ ‹ÃE £A+~ Ÿm¦è¦|ŠÝèJ:_·¿‰ 'bæRXe5,–œ‰µâPû;ŸÐZfÙ;uaª™`š®àð`(æ &lÝåìf€e‚l)=ºr €G”á;=9‘¤&qÅQÝF<·NOø -&5¹§Ÿ ë‹}¨À”`çuõ>QHŸ¤+ÇØÚ¿©N?I´*„hTJ ?iL ¨L|c+EqB¦„2´Hô¹-¡Ÿ(¢HhõA<¯Þ•ŸC hú~B®=¤ùbH‚дdô³ç:,G5¹ÈBèjÈÛ1ã‘!ä8ÖU¡˜ÔæMW\Å›¬ pO—Í0J¬*£8}µV8Á³³ò°×šIÑr^$B¼~|ö¢m¯è6|LJÀ#,?~xêî'Òrhll|pÏ ˆÚ36³¹îŸ4¶Y”» ¶P­íu@¾…-[´-êõº€ m’Sºæû2<ãoõu¢aóznhÅ6C¸J±‹ÖÙUr¹”’›ˆö„5ÙQ¬"‚~¢M`€W!À°¢0Ž‘@ÁÁÿˆŽê§KÆ_øÜÓ¹L9õþ9úÏÿé?Ò»c½*s€RéLÑ 8ÓØ•Üao?¯Ãsè\]æ†ÑOQ›ãÓ¥ÐȬIÄèø= -s®BåCHÍÕû©“:òZ•jö,¯S€q™‚ÐÉD8¢®K{©¤´@®\f<×à´íÆÚ>08,£ˆËÚN íeWºqÀ“>"ÝjrÇ"ýâ©‚¼/¥¼¤zÆ…&Üô‹i¶ã9VE$R° ÆØRw¨á2ŤøÕ'AÈí*×AzÁvœ)Ë4u‰Bsæ …ÙÕ®"ˆz*øœu(1£ò{{ßNN}¾­ ^é{|b«„œ†#º¦à Ž:ZmÈQÀåÒô‰ùá?Hôã—w¿g—ª¹WúÃ;¯/µôF>^…%¦a)JÏiûÆÕk/{ Ýz‹hÛçhÊä6Ò8O’bf¨t‹„7ÄÆ]½‘].¼lS&Ñ;ò«éšƒtÀïœ$cª ‹&¶¦ª<ë¡í÷™´–®ŸœÔ&1ìNU,Z^ÁÜíîšx‡¸¶ô€7õœœM”‘ÚÂÖ§¨0‚O »ˆ[eýIînrÉ(c/½z‚ÆÈ»wŽ5œL‰ÅíW[…kË Œu ‚ŸÑOoRä’ƒ½×±§¢Ê”˜i"Tc7òÝ{wûñ”N IDAT<6!ûô!‘]¦§†V‚­·9D‰F®ÊW¤×=Ž@“87@\€S“hsŸ´)Èa?\Ùæ\ʃg¬’`IžuK~_üÁºã”w r‹!@œ,äÞM9·éü@½ŽO?æ¯ÔZĘ;J,Ÿ/5ônïk ö³W_µ$0ȹ‰™º¤˜ÑèöE#Ÿ®¤N KW£°ê 9aV[ZdW¯ìrõŽxÊY‹r ûp ÿk0Ç·«ðÌ[Ÿœ+Ä;¸Ä;²×àIÑsÀ´zÚ‰]¶XÒIa/A0Cd[¸fe€Yä‡iϸ±û¿œ€pGp“7*×Ü¥'Ç_ÿî+YÓÝù WoåÞÛSxåÓíÂ5u±ŸáU ÅH@‰ Î‡Ž¯T¹Tžð©^¿PpdpÌ;ÞðÃ9 åX%àZj§[HVW«RÀu€3¡xË êDÎúØöËøa <` Ò–´…Ó¡—Åå 4þ‘›Íxôê"Àr'2º4~X­SN0Ç»ÁàpMƒ¢&ðldPÿÉOXË%ìQEôç°â’z˜T:ï¡ Ðr‡Âz¦6móÏm†óýܧßù4…5ë’Q'È[ºï±ù®<5ß'/½8å$>(§?¹D¯Jg‰“.Ô2×KÑ™60iÿwºMènÉ ¯b“&ðr``ëÉÕõ­woloe7Ó¥‚€LîàOA@@!óβÅè§ -D¯ÉæR ð‡ö6T -0ð 3b3Êl&IõSý$XÍšÖÓ6¾qŽ£ÿôÿrl‘ž¡X Ÿë‘°ÄãA¤Vù(Œ‹Nî&D*ƒY‡&˜ƒâ4Yü ‹_[—0„JT‡®œ}h5Â--WÕ84쟙ŽÀ°l8¬=ggŒ&nVZE ,8g„§jû$Š‘;Þ¿óŸÙ'´B×Ç0?Ç&"ôî¼nßÖï@Zþt^‰p‚C·¡ž¡ü +´Ü³†ZÇ «qÇHÙÕj>éµè0HM0©cÐ+|$6:É•ádxÇ”ë!á'ÁwiT¦aRÀ P¸+Àˆ£‰3‡`œÑy´üt˜è®6°óTw‘M^)àü|µÑ]Hj!‘Ç"…òÐì[Ø«X¬~Gj¼­éí¨æi'ÅwÁŸ;àeƒ^"o*™+^x=¼ýá·FZk‹›Zð¬Pú ¿ßÈUƒ[Æy#gÓqÀð@›¥L™îZtôaõç’ÑÛwîI°Î^<—ÚË—åèhéêÝ»±Ü~áegíæš&—à'&y”Ò ´ 1£ŽèHT¸[% Ÿk\|ÖñµÅŒ«šPŽ&ÃxÛ`Å¡IÖC؀ƀ3ûIãÔÎÀÔë KÂÙAçš{&EœCŽMøïVÊôqN8mûp‡¦1>&ÂÁf…ÑYW„Ç¿ˆJ|ioÂ{Ln"¥Ûp‚Š\~"ê0Èà\óõŠÄHÌ+|bO+Àš«¥AÖ¡æŸV‚ÂÁÃ`@ßpÿ¾ÁE+Û"BP\»jÝF‡(cl?%µÈÄû>šÚ"M«R‰ÜH­ÙŸ¸‚“7bÀR‡+Ì­r#5qÈž€3ʤ¡Á~MÌ…–[é/ Á8VF`öRO“øÆ®jŽÃåÇO‡Ÿ~Ì%hUbLŸð@¨µ> @?ì"Êéí€]…v„ýè/ÿòÿñCm1¬”!GÙ3¤òËÕe.|/=çE‹&€·^!æŽz•°­$ ¿ØÆ<]¢ìô2Q°2í•QGQ+5Ü^ï–„«`\@£›P¤jÝè0qÙ{Ø+Ë„ÑYñÓ›?ÌÍõ£¾h[[²:#™š"dŒEÅ™äPÖ®Íc@8›WP'ðÃö"Dþº¯1“gáÄ*ŠlàП?9ç¥4!ø[”YvDì=B”tù—Âi`*³ôFÀéäã‚g`ÚQQªÀâ¨zÊ_·@z?x¶ú¶w‹÷¦¾D_øöÛo<¾áË—¶‚Ùd €n- é€D+È­xÙCZ,úI‹ßqêX+OŸk¯¤Üõ˜¤c'%æ:¸…m&+öK2Á …Ì–a“a#߸víôødÓíe³zÅÉI å…Rïƒî{6~@B!Ë­s4ŒYÍ=¿ӎ]R£ –!=P9¤ƒJéÐ,rÎ* Û–0P C3¶>Å äfc—%ShE.·ÞŒˆíô¼¬.¿^¶Tò5:5ÀX±T‹½L8ÞVÊ . )dâ­EœvìuëÙa‰”fÖ ¨wmköŒ?ÆÂÞ¦>·nöÒ?WaØA /ô#ÚÒU7³‰¬Æ‡¨gõöÝ­¹ÀýÝDîÙÏîŸÊ qÎÜB*¡Ì Ó`#ubÛ¡§1yHÝóÚ éõJG+òκƒ ‚·˜¯]3~æ·QíSܾOî B/3¸øøèñŒº&#øœ­î³ •2_q )ôIó¦@³ø6b7h¥¼ËØôP‚¦m =¿Eeض§RØ3Âyãâ„­^™Æ ô-Œáp^çNY/HÛMZ*SQ¿½•?*`igVFeäò¯Bþ†º2§‚!…Æ"®b'Kb£W*êCR}]˜ch;üã<…ì†kF WS>ÜÑs•õ°@ÃÛ¾rXúæÐÖÕ~0¨A½XGp¼‘Ñ™¥Øo;‘ÓJÓ¶/þà'X¡=obîÜ»«ò‰˜ÓS“Ò„¦Åàßúª¦ÔìÎá*Þè“·ã4ƒCãD¥Ÿüƒ~dblªÓ–ö8œ8qÕIJÆLý$—úÕëàÁOŒ?n>Ó{¶¶)x0p®PÊ‹¨ð8Ô;Ðã€çÖ‡YJ6_I28ÝÎn¢Kipªa8}d¾"Oô¼K8W#Aü«¿ú«ŸÿüçÓA, ¸C}fç¥`‚yÃê 4 9­,~mq¸n  £ 3Å´99í©T^=(cÞÙa—™PÀœY'Ôð÷¿ÿ=÷Ã] –6¥XæîÞÖÏ~j³K¾ÎôCµ}${MÃ#_½fö¨†ìËŠÆp«­² Æê½;M¤©–BhcWŠÕÒàžî–‡kè¼ýq¬ÜœÄ€ý„°’š° '~btœýiîÎÕ ËíÊ[XÜ%?ˤýƒyx¼÷‹èàÁl _`O Ö¯1¹ˆ ÆÓ°ØüI3¿1 ­9üdZò#@M‘ÐÃîëa?»DUš;V0<¹´Lpì [%=C@+˜· Ì ~:¡‚‚ÊOx`á\²&,²‹æáŒ± v3ÆÍkfC>.nߺk,”ubÒpõ×ý×Vñ»¯¾´¯†I$Ìþã./E³¸ìî”j˜—a]âÉ{Ô Ê±ftøuMæh€0¥Œ)™°Ò·çö -é#Gǰƒ‰ƒ¯õ`!Ó84¤äçÏž÷ÕúI%‘³ñHµIŸ9ZyÓ÷Ƨ!A”6 Xr±zÈü?«#j`¨kËpªwöS¥ÃU‡Š³C ¡‡JJ­¯Jµõ¨|R¥‰ð7aݼX$Ïž½6¥X´ÞÀÇöŽ&#ðñ¦·ó³^ÈÄ´ÌŒm,Jèä}ÑäïHFÕNÿ‘¼z€cÈ’)rè o\”Vp]ÛR]ð9ðܨ5 ÖYYª¸üá*·× š“‘c'À¬®Ã§•3'!E{ß1Ö˜Þú––&Kk–É"'Ç÷‰ÿòü‡à-ðXV™¤ß«%Úá¾;ükŒ‹êÁÔeÅÖè’?Ì}:£¶ÊèŸz]šéGƒ_*Ÿ¥Ÿ÷oŸ?ªwŸÞøÅO¦Z¯¶Ë„2Ý)¥º^(ÕMÇÜoòÙD¨|È` -Ôî`mòÊnC8·—z ƒ ¨ÐÄyÔ›óh’ÆhoQ¹ºÎƒ ‴è¶ÈL=´ÎV·V¨âàâ‰×µÜºmYÝO>a6ÒÛ;ÇJ»2ÔãLã«·¼1¼›2íé¯k¹/˜¯“ÎÛ½1€”2Ë.WÄA”)É¢ƒ£‚mèvûêf5uËŒÕ= dSsæÈ‚˜„˜c1[×”€úCÑîuhYØ|ü„eçv#üðü…§ëîIÆí¿õ™›¢» Ìè[Ç/+ž´Xsè"÷ö“–о]vtH¤Pþ1Ï"ðàÚ±Ü)¸Š ‡‚Æ3À)6©tFeDhRâ`Üqã²FQ±ÔaÞy¶˜R'F?ëHÁÔ£¹us½žQè¼åó𚂚”ÿ®åy½¢_ðçµÆz&‡iÒÉñ)¾\Òg !áP°Ê9%÷Ú`“ÔIíì#üq}Ÿ¡«~Þ%/øt¿9n¬Yœ•·p©ÿš`È\Yb`24?ÝlvÙÐ0Ç.®¹evafã/”j%3ß?õþìeÍÃÛ$ÇþH‹ÿ|’ãê¥ìâgï‘ÿÌ7OÏŒ[6Õl0Ʋ&`ØÓx=¨·¨B'­$,%;üTrmÝvêËîz„˜Œgƒ–À84ÁǶr«rh7su|³»RT4n)e+â‡ÈÑ_üů€g‚å{ú×iG›õ$ååÞ5`«87ÔQͨ ]ƒ¡§90ŽÿŸ©;íÕ,Iû^Õµô­ºK­½Ðœe‰‚8 ÃßJž…6üí$@o ¦%‘Ðpfº»ºk¿µoþý#ž[ÔéÛ§òÉ“{F.'Ïâ'ÆÈèß³F¿… úN'4v `¬œ‹ö¨¤ÀªË dï´¸ÛÎMjaš£8·]š–$‚~qŸèã0@àK‰_Dfÿíoûgö¬HA†ÏAŽG£d Ús|CÓØ©-ºw(ÑP²ioZÈÞÛˆí}êÌ¥+³GÛ]º®uo^Ú²KøjöËn¢Q÷Ó„¿"ØÐÍ4°køÔ¢˜Fä,{Wú3?¹'æ*aTáe4|öSL3Û{‹Í#{ð¹<ß ¸svæD/>yü䧇?ɳ°Íåáÿ‘iÈ ¸´‚C°ûp[ìbÏû/djv´ã£çë =•uÍ 8çfÔeÍ'S Y"Äî|õê¯þê¯:޵Ÿú&8zMõ•ŽÅˆòѹÓDÁŽêʤ{õ¢"¬Ú³¥7mz¨Šýù¹jŸ¤gD”KE#FHYÇp ÏOåSÚËSOYY2²à{µ·µ ëäD¼ŽE¾ä}¤ãäpÁÔO(Ì·b• ñÐÓ)b>>;³e+Ű‚Ÿ/&é«”âwnÝ:År\ç ÄBl°nÚ(ÎWEJ'Ÿ°øßiâò£¦W…_Û–¦’㩦 ˆÖáìé§2Ë=º@ʸŤ½Múß|ó5SÂÃ:εh®$Nž8:o%“Sgp™&ÏüÜ+78,^xý¿O&cˆ5¼•@ öKx @÷,^¦ÞßüÉŸ~yã vœZÒdÙnAAW?¡žF¹Ër~š×:Ì5'S/¥LÄΛž%,ïê ulz×£G•Áž­…Õ*.Ç$>WLjãÇeJ(€±bŽ*ûQò¥±jÔÆó¤¦äÖÕ1Í®áÕ4Å[hö´ßçs¤ã¦™¶Ù{DÕŽè*@Œœ€rÄÿ‘u–‡F¶! Ë÷“¤L7$lye.pn.S$S V/ÇX=“&Ä´øýî}û81Š¿œEx/ÒkožŸžªâ¢rÇó¥`©†ž‘qðÏ žá¥ Ûyš¬œ×ÿÆ\‡—d)§Ù#”šó8Î#Mç=ËLMzÍœ Õ¤tˆ~Ñ€··ê€à§iD > ?ÜÈ÷³qü‘Ày÷•ˆòË%èI`ŽNn>é«‘in¬^ñ O»Ê¦9 ƒø€@`×;QlÃxà*L@6 „‚/G$7goYü¿Øgçš­(¡¤»ºuë,HoÓgˆ“,0W]+2§­ƒXYËI|øŒ°?UôVî lB+8n.¸ÖõÌGvü‡2´QPüþc_AåÜæª Eæ®*°<›sª­ëœß2Ôäºx¬‡&àáÙÌ Å™Êo»׬V2mróèXúÃ?žžÝ¢ ãû…ài©Zk!ä $.uT&„–£.&¬vŠjÆ.›½zbæàÙs Â%¬Þ t‚LR3W´Ò!QAF1è«ÏžŸß»û «x~þôÒ‡wà7gÕnG”Ú"f!›Ö}¼vùê£ê`îïå),šx­"-š¥‡à#€d‘ƒÞEŒÙ&®Ð¡Û­O™ÄøñÇï99ñ±Ù;]‹þÆ€]ü¡c³={úØ; Û1üôàÀâëÿéçiëÙŸ>•ÁˆÑº~¸›·à] §8¨™7åÈ_Ÿ¿bÚ§'†Ik¶Œ*º¡èÞz` ½—e¦ÍlY31}I‚æÐb s9ìC—ÏÏçšg˜§Aµ/ m çHÒLhkhÞÿ(úQ†ýç&R1çx'ýKÕîÖº|ééã?<úéþÞ#v âÈL‘:àÍHCOÔX +ƦNìJˆÉ)‰;‹/E¾?æBßœÞPî¨6Ìá‚x‚£¢P8(2sFm@¦Ù3³Ñê7¥€ zŠ+a"0rèŽUˆX!!F& ‡ª‹û{»«!½;ÕÒ-Jëçé<¸Ïž<Ó:aAdæ,> ޽÷`Ñ\¶8»-.ŒÌXu¶ð¦ 0±½ýÓÓ§5ÊMH¡‚’5gР:‹™]7…³Ñ”aÙ}qP±éìOçŸè.ð“ʲ÷5t™û„hÓ\sÑU¬È³Ôƒ O¦ó*0€ÓxQ>ÁFd‡®9§‡Ê(,þñíð¥è‚*€3Zî…J$t| ¯³©ñ9Í©AŒm3p4”m ÷®Q­0: |åW¿ú¥Ò ªæ…£v„‡¢c‘—Fê>LÑ$âÜøšñ¹z·ÈPUÑ1#^w!ºD€’ H7>*¦KI` èÒV‡ªZBÖf~@´ÄÒií~@^g ¨’ê°‹ Å\uÒ$¡sRZ‹”J)”ÿf¿!šR™#UñÔmCln!£ËÙ5ý%æ(™Ä{¡Þ\/;M‘ßœ ÉܱK3­XA¦Ý‹¯q~4ÿ™"HÎ QG›Ç… ¥+X¨Øà ;/ÅAæå1'Í ŸGЉiä[â²Ù‰*|ÁÌE_·ltëÖ-OMe©">om|ó'ß"ö«o¾Fï¾ûîÞ½{YÄõÿ„1´iöò5FØÌi.jDjÚU‡Ý¹¶‚’Ù8âä }«C.Î…¼|eN?a¨ü¼Þåô6ðê³Ç¦Á½›fÍŸ þš#ì„!ÀD ž õÞý¯Dz0_yÁM¥»bp㯖 CÁ/d7$´[n<‘mþ¤Ê‘€¿šÓž›éáPDOÔ²Ú¥ lÁyýê…ù$¸³™dj,kQ, k½iÝ\ÏìU:91áã)×/í)TÅà»Àt­R¥Šy..`þÀ(˜vµ;©ô©Ê ÑÒð±Sð’ÙÛ–œ(kÍ—1˜U¥hQ+/óÖ^º—ËÆ( /_ýÉRNœrà.FH-›òôßë—Ož<>;³•¾Þöô´W‘)èÜ üþcþÙÉ)>°>´‹ý`dÿdí8* iÊr-õš¤ét¥“Œpfàý$ˆXû…m‚¯n j_ŸsÙwî|uz Âñd&Íûôà†¶&ÈÎWºdÒ@Àûêu@Ž‹å( "E2N§~ö ›`n`ˆ6!oÐO7움cQE¡­†4­- Fꎶr­ŒÛj€0;óuÞƒN¦4퇪IYlñdJ`=‰p€CÕ]¡á˜>C¿c¢¢´LšÀ°oÃËMH«Þà¶.!ˆ ¨Å‚¤«žÖ7 Á%€¼1‘Ÿ)aÉÝZ´ðgËTcI3Žèæ«Ú« ¶«Œ›*ÔkúpšE•>C@4¬e#q›¦©(Òð‰NÀÍ9Û©£grjš³oÚ·;ŠÂã$ú0°¾§ÛZ'€Žj¨ÌÐÓKD˜r{¿n\7BÏgnQ!ˆ…Œ&ð̽pæKâË(Ÿá@ŠŸÁÑЄ•}Œ7NIÏ{·¢$‡© æSƇ5d”‘£Nbþt!\t7*Êã9÷H»PéòNÒî.O¥—ç±§!ëöç“¶(€ËñÓeüi6žÑÝÈ©®´ZÊà˜Ä˜U½0Ñ ‚þS9¢„çô3 À…™Û È[·Â<„áOJ~ÿþ}׫™Ho«•PÐAªø±,‘CÌ*º`½Ûæ6ÎwÁSw‘“Ÿ0÷S1i ¸© ´ûå®ÚŠ‹öVƵù£¹¦Ë@PË"eÈH{2=š¦Ã^ÂφêC@µo>Ñ0ö•›^çÒ¼EøK¤¢Pqå¦eb{8‹²‹§ÂŽð¶W££ê#@[žbˆ*ȳAÁŒòUq¯ÖÔÕ²§2] LZ„€‘qþed&Èoa!¿Œ‰i!8ùPA¨~´ãøò§cŒ—ÌgBž` 4œÌ‹©¨ñÓS'46\@¿æh6MB¾Iéçóž‚=/›i¦šåQðµ¢]‡AW‘kãF|L1¿A”(æÔ‘Ð`máa–Ìð— ›¼I¯•’ðAòê’`Ê$éªÌëx¢¤;¬êbæE‡ÝØÚ›‰fp‰WŽXßÐ\|‹ÿ¹[ܘ"šË"0±Ý¾ý³ŸýLë>Î÷òEŸqLÍáàýˆ™ÂÑI1DjWé{÷îr»p[AZÅPµI¥·Ì ÀëÙÚr6dîrÞÓ)©¨«# :òÝïÿÇïþ`6ÍܹëDœš#?î IDATŽÞ1Á®-SÔ¦+¨[2ÓÌñGsúf™¶¦BL 0–Q°wbHÄXüºÐdƒ3» ñ•DLPysQÆB>ƒ y’öIð˜–0nÞñ3^<¯°òÂg¤î'³ghk…›„§G‰àfßäF¦;& ^õ|PrI@f+"ÁUïÏDQ¦ZTMüé'|Âø¤=¹s’²É^šÐF nÂÜRKæ°ú£jÏ@H@™ˆÀÏ#öÒv¶,&_ø @«0m^öÞƒ‘FÏGóŽê<›“·ˆ›ø<%ßÅ6Íœ@‘,KUD„­î'’UäøÄÖ2-ÄNô“‚Ÿ˜Ãƒ’² ¼èîÃÛ›Ç×½Ãíû+(‚U²»ôÁÄŠ0MÎ>Mù~ª¢æ?û°k³’¿ùÍ/œ’qÏ|æ´§ÅP^@@+ËQmÉ]ÎÅON'ñè¢W •ae{÷w^h![¤a·ðÝAyd>9kë]DeO†Á9^cXb0øjQ<÷ÅÌÕQ(‘ÔP„"›è_VBE]îuä«nÏaA¬÷ä[fPX£0Ñ„n@;:51 `¶¥ÀØÈ.„šf?ãÊð« E18¸å“cÜhO°8Ÿ´‹]ÇìRX•MÐx’èrÞVÀ.HªIÕa‹LUø«ö†FVm„Š3`B€®+ ]«`|œÉ áT £ŸT9qДÎîÙÓFúKÃ[„ ˜×üTÄðÊ7¤Þ¾yðÃ÷Ö¹„vIÊî Ÿ¸1O:.yNHjiÀÕ.`·(õę́%bÝ–‰÷/™I~‚oþóÑM!Ü— a®9ŸŸ÷Ž'ä…#r’`2lD¥¼ùJplÜñÇ%ã´v!†ƒø†'§Ð&2<‡†LéS™½ýäæ±LÛ¤33’Sþô汦ÜŒN„Dx òŠÙ„KÔMXC„úÃÑ¢KNЉòbʰ|ÕÓÉ–8-–ù(ÐãÕ(iN:bÆ™B»gÀ€ `R$A[‘:móy§^AªÙÜ–*p’rXÔp×ùÄ›e”™2̹Ã>¤`ˆ›,´±ÄŠJŽ^¥ÏÞ!Õ#*Ü|Ø':C¥M ´È^½y¢;/"±þ€‹HA$ƒ‰Sº¤:a84ͺ—4Ô¡UIÀ‡-hY>°=´æØ™·­‡¢q†°ë|àÜ2+H(52²ºøÃƒ?²³o¾ù9‚,u9¬ñïôȵ…d¸õˆ ìºé(V—«¨SäâÐjÑÛ76#*l‘ ŸÌJ:¤TI@ ?UÔªçÆ1™K£4u<Æ3ÃYf«JíÔ÷Yí•ôoT “;lC\TÆ¢1Û óìw^à•é§L¥¥] ËÁ‰@Ôã4ÄÂBwîYô[mq£ð8DÒ „Cðýlù€ƒÞƒ·UA¾Zî OÄß–{XH QÒå®ÏȬäŒ+gxØL¡F­Œ°Vxª]ü£öáÿå±rí êUv³kÜì¬H/ªNEóhÞS¾ÒNAhR†»ô&ÒþÐô¨˜+®{Omlš1sÆGa”v=Çüük ¹I(lW!ð¨É6+³DšÜ¦¤»Jm¨Ã받ѫzwÈPZùeŽAµ­G»aéϲ2$Jð,X4Ñø•ì(ÚܰrëÀqW^žø‰E Ä𤉔ª¸<’¿‰ÍΪ 2¦$3±'2^Ψ%Ÿ“Cˆôhm,€æ´ÈToè2«Êú•qy¤:àš$3%©yŠdéyÄÔ„VEc^‹]|Üq_|\b ôSÓrX°~jB]Ú”Ôð }GÔ¢A4„ôðÄÔRX4öàb ØDóÁ±Æ­ U»vÐ \”T $‘©i£…©R&¢\DÑÈšˆ·–&0|®j§*â ¾G£®å“æ+ãQnvBU0ùD‚\W–i ˆZþÀ‡¨UDÚ@ˆÃÊH»´î§ÄòPb+“EÀÜhMÎ(³ùË7V ]àÖ:Ý¥xÎë*ŽºÀJÀÁ5‰Ò2AØüM#A>Oµ”E£½†+ÈÃÜ]Žé oyžzÊÏ®Ê$È–”YþX"Šx0÷}Õ½ÓúÒÖ]Æ"ªèjv[BYãÄ¡¼2L |ËtëW~ùx‹0þñ$ $*ûì2é,A>Ô]ž®®HâKY£ÊîÒäÒ;G…e˜•0¬'Ç'÷ïùøqkXFê+,ÆlëêÙòÊo–„2’é­¼Ñæ/.L9L7IAû¹9…1´êìVÏŽŠÅXWXuý£ßiŒ>mP_a?ñhöšô) ÂùP¥xÒF4¯ã2g4x—EyµÄ§=9# ¤(óZÍic]¢Pp&˜”^~j5Jà#æ›ZÒ"ÄàP‹p°nkqsfÈÌ#"\? [GÆù™øÙH™ªÝ¨°¸G+ÓUèK˜ŸbZZ¢ ¨fJºâÆ›w ƒ^ 5àLS©à·ß~ A|óÍ7eµ„/4ØÄ’å¯ðî)9¦îxg®¦ JD-©û‡‰ð…MBLowëÖm=ÇS›‡+wÝ’%©]Åu;ÊI‹Ü…PÒ.ÁAR+"n>@7}ÓÞo]¼LiëÈÕâ îsÈCiwúýÎîgÿr@°íš¦ÆdںĘESÆvº4 OÄîjSÇqD ŒÈÁÁ""Ð5fi\£°‡6h8*_u¬útxÕÄÜÅåµ&åO¾E£ºIÙV!:o‹”„fÄ6>31 ¥­Ÿ>Z±{(á‰Þ†&ÐU%0ÍOÛý±v}Á® ?‹Ðè›>dN'õ•+ôÑ ôv.$Hƒà—üeµ´|ºA1tôã‰]j3é,÷íT$TäNª~ùª‘ÿØîÁ'\ùõ¯~5êT«Û@½óádó$ù¹UÔ MHäßÅ6*n]FW~\0äÓ²Ùí„5ðØ’ÒÔQ±\üÌ€Ö£YáÆKÛ¡È[æ¹®+ÍpÀÁ[ÛPu#-zäR“1ÜlšnËg}Loð)¬™™º¾k¬¦× Ôò§õiªA*±é²±wv\6ßc—iÊÜÕ«%£ôž´’=GI©h¯º‘ŠA|'ÁÚ^ÐóÚÉbƒ@n¹ä…ô±­2ž4ž–ö¢™»Py0o7Üð”! ¶ƒ‰Þ1ÿ‚þ€Ò]Áú–G“;––Fæ?© ’«@jñâº:´kfñ³ŸŠÒ dSštø†öϬ.’_¾ò÷¿ûû³Ó³;·ïðƒÅé£÷Ûh‹zÓÂaÝ’wÈEI1âø—7/ž=³¡yíÎ<§Øáª>—¶àˆùøüó¾Õ}Ä 4 Í½æy©ã(—ÞAµY@q˜ÈL®Š·nŸY^eÆdBæŸÞ|þô™¥[º û›‰¾òÝßY)ÄR¬¶ 몃FGuÚ¢‡ç¯:cZsÓV±¸¢M@ýºiÝTIJüÇ «“bÁÌêâh7{ÉÕE2Yý ÄEW7|çÚoû_Äÿü_üëí´¦û¡à¤.ØÍlA®:VƒÃã“§Sø>qŸáŒù[kY*£erqsbçô—ke‡’* «‘CvÒHF36Ï”HðzåD9:|±ôô|ÚÚ´œÝ¹.Í‘øbg˜H».«€:s“t¡9`CM˜§÷pŒÜQ¤¼ä¸ÍÜ… .m‚#Ânv² bÈ ÇÈ&à«·ø™;åb¾EÿÛ'fV!%¡©Ö"90‘Ìõ´É×VüqŸ^Á¦¤ÑYHóÎÈ ×Õ˜±Óz§EÅ])¬Wñ{êù´+ Õ!ï!`K`>-_ýŽmfJ¨-ØKèð@’p óhpíÌåâüÔ%‘d·¤}&0þuøœÉfs‡õ>Øí©¨`ði3ƒ” ]Ë.0¥µ¦¼^* …™~üг¨5½|6 ±e‹Äâ¦ÖÐ(#“óî* ì§L%ýütËÈQrÈÑ•ž%?D*·4öpng.ÀaQvÄ¥,â5ÜŠv ˆŽVES?e´È:\¹SGv©ˆf‹9sá¦zã2ì¢Ákõ2 ï™!’‡ÛñOÝ4ï­,zÍ´ùRü·«ã¶ìðôp9 ðð3U! ¸Û 8ïíî4.u÷sˆ­?•˜{+fZ‡¹;8~»8€,oûhZ‘wÈ ß´+d¢lŽ(Â'Oåw’{¿&O}àÂOp=RM¢mÖ}b}ÒÇ$âÂÔ…ä @,8ì« ÚvBž/€¨Éx1¶åQ32n€;£›é‰-zkÔŒ'Ò”~ÒD¥iƒürF^-×ê´»>N7,ab o\,°í.l7:8ââ sÅ`%1(ŸFÌÓ7 /dç‹­žŠ´ø³|Ðú˜©GrŠ•Í¥ô*kÓWZG)Ë¢ù~®c)VÀŸTºÛÔ)Èv䘃ŸÊ½’¸†ˆ ð¼DÎ'Û4â"QàÄ*7s þqIàÆ¦Ud.€h…¼€¢*Š@cK®ælÚÓ¬£%Úe¬|†2ÖÌgdÒ+‰i¨ªºvÿÏ':#A’%òßÊ·ç´ž ¤cãé «i™ 4»(9H „,7Ÿžœè¾ÿèPž^™Ñ|AV#‡%º´¶aìj`'_Ì)†)±Å-ŸxµÅV¨º£·½wi4…:TØ1e;h*A¹Gœ°1ƒPLù%sÂÀ!§ÛjºiçxZ:€`f‰Te\Ü”E°e‚‰^¶+d§ü"K 濺ùÞ{}è+ìãöyoê= êJ5M=pೈµHý0Ö0 T± U&—¹`H#ù‰ês>Y¤ÜãÈ¢—:ž˜€ÀWëôr\~Ê„ rüôˆ‡ÉWÏxÒ<渀²=Ê#NämT¾a0™óOͧw:ãÚW.e7%ë~µÊ)±Mü‹‰ ¶Ä “õæì¡1Å.??7”2«Ç j„­¾¢”¾àCf¥úë.=tQ].ÅäèaÌÆóÍtQ~J.ù8Àú‰!ŒtAÉY-æÊŒ¶³§Ü¬ne ¸CRIÁ_|Ppæ"”W=°3› ¶X’žËYfªråÿþË_³%84Ðô`Ç(‘]Kô„Š+Æñ \ÚíP mÒ"8/XÔÉý‰Œ[ÏNu J9-ÁÊLUø}äaåóbЂ¤À”}9Á·[¨vÈ‘öuªƒ7ã{]x'ÕÒ“«Ÿ—œg#JOŽp”85Úñ—ö…Ì¡h¯qbf·‰^U`Ä_ ·]EN`P‘Ù§ÙúÔuçA£F4S-A±å9ü€ V¤ú/žÓÆ¡Oµ›GæZé+ŽÉá„+_3a¤É}Ã6ÎÂSOÛr÷²M„ú #'G\¾dFÓÔùés¯é‰Åók ~×ÇH®u P÷ò”éóÕêÛŒiðÞ$ÃXïˆ,îl¿¤Ï¥Zp„C+f™†§éqÑÛsœ &;0Óa@ÌŽJàè €‡\jéu£Ê«õ Fg*•DÙbÙã9_¼z;G‚Åw”®8ŽÚ¨Þ¼WªåÔ@Û¼Âò² Þø€ikTaÌ$îº@6!¬Ö8_?§»)kDäé5žŒ!tð XåY7 1epfxLcøNO5)kÝçÚUë[§·n €nR(·rk”žÀJÂG`r'~Ùú2Óœ ·+?ˆ¶¨Ÿ¹R^‰’ûpȼˆ O“=ÍãdÈùÏüàõÁ!à:z“š¦5éÂ…·gᘠždõ;ÌPMð½'Û¸Õû |;ã…-i ‹jL)¡°WvåOœA]ç ?ofäxu¹u fFXËjÅ.Â:Â`z`ž6QÔ¨F•t­°¾ðE܃"¯xÛ/îL½—/εÛö 8I…æÚrw){#Ђ‡.)O>vpÈhGœ‰â¥].ü°¢9Ò†ïôö(O¯Ô÷¾ÐKU"ÄKM7`KûÖ©KC;ÜéÜ×vB¯ CUÐA‹ÔÉZÇr÷^Èåxz©9sæ_Q)Ι­Ai&ÌÃP!¨äØõM¿þå¿ÅÙ«±cÒ +4‰†]c2;%-(pQL&º ç(Q§*”£ -¨|¯U7D¢ÖOÜsBºñ pò”)ŽF0 ÌÏ2¤]T»¦4”qìƒÚxúöo/¨¯R€šˆäÓƒ¡¢Z]¯JÜÞf¶"dFšú2â$<Ù>• eÃ?…˜ 4±~ÆCmýžØr1hâ9¸¼v;­†°kô&¢(¨òŠÑâ5X#쉙š G8‚uè’æ´pÿüX<Šwt=q¶—Åû±ë±Â#A¤?ƒªÃî]@çÂepäãYÜûp8‹ÅkÞ7$yæ§i¬.ø·õH/¾Å2Zh/¹VÒ¦Ù¤ b28ݽù~Â_  Á×qJPw ™=l6Ë5ßgø IDAT§óoË×!,Â.‚ék/^Þ¹s;pcdÑØÎH[o*ÌåÀr+ñ(À#›Ñ Áž¦Ê÷@ƒ4ù<£ßÒd¤ˆiÂ.ÄY'Êõ»<Ê»èþD¥8°å5*ªêjÔOP°U¤åˆÄ”¡O\ w™EÃ)´¨‹ûÊ,rxjD r'š}Á˜÷œ©2ÈšZž”Drr¦Eºfñ‚PÛ-ÉÅœ.¯g ‚dMhQ+"Vñýƒ”¨ ÍÓ×·vø¤üµ/o9ÃáÈùj\(~¯~qùöÛÚ {ÑÎ_XÛÕ(gvh&}Üã‹#˜Z´Ïú—ô/Ï6Úo!xt§ßÙÅ•«?Ô‹kQ3“S›öå—¯÷ßÿ‹_ü«§Ïž`—v—i8æòsÜ—÷RŸ"Ê#„0.ðëDfˆèN¾Ø®0–bÑ)„O1ÐC{«‹ê•÷þ`(gf[±ÏÎÃÅ50ýOc:ÑU.n´E1MS8?9zÎ, å›sJ£0ˆn f•M¦´|w<Ýé˜þ`Æ5× ¤g0½‹Ò‚^ù.hWn"N´"3²œzñ”¿åLú³ñêz!›ë½(#å>à1æ¬OÈÃçÂm]™Šš®â„;=BYãÌv7–ðT&¾á­ºÔÕO'W“W‹¸^œªû<ìãé-H ¨K!‹ÄþCÃpøuQ²¹vAÃàcóC?m \f~ÆÖÏp›Š@-2à/u+bååXx‘ÃY, F±N×F euÐÙSžÛ‹Î: Žir,}eéÝ"lŒÕVŽ}^°©SÈ(Ï;É×¶òÁÓEvîʬûš®³!7Y+‰«T4J ¦I¹ãg³äY¾Ñ¥™x=LÝà+©ƒŒ÷ðòrܵZø˜z·Ù'031Â;æA‘åªMÝIV݈Ŷ“æ„Õ çÍRþº›‚øÜu‹©¦ ›ñ´þ™(¼…ÀÐHªÓ˜Ÿ*zî'$]%“Àz£´âÃ1ÕMÙ°”Q²aÎÚ'l€ aÑw¡FáänHW–ª"aŒ®¥‰mÀÜLwZ¡³ £áíÝLe”¢ð+…ü&G÷ðÿ?óëÀi° †¡¥1ó, ‘Ð_£0ÙÏ‹¦Ó"ë­až·ÄÀŠƒhðH&® ›Ò³ñ­A\9rÅ;˜„Ä`,½ã' 9šæðcèŒÁ¦ßþ¸«EY=ÇHÓàP<‹s[‘Ωy@´¥ØÀWÇ7¾4Iz(ç·i^Þ PëƒQåR}4>ýDׂ] eéSCžâ¡*Ò˜H-y±„ª#Ú?]¶¦&X‘dßÿðýÑM3膹 LÐ=îïS´@ÛÝ«K×.þpqR\SXÀ9˜o”Њ¡ þ€Œ™”›±ú‰·rVîÝ»§³‡7ê`%œñ²›=Zd'€ÃÿüùS4GÅVÁ¼ï¾9”•)ºt0+wwk= z–®æÞa¤iMàÉ®MË”† 1 S /@XîAr¸ÚMz*6$…¡ùÝzrÚØñð.E'ý,ëev̧"ÕtîÌåkÀ†k¶c}fCƒ9U¸!ù.åU\ü£EûYedaã¸17‘ê~ø7pŽ~«Ò€ÀüÁ¢o:õò©bònß¹K{ ¶.%A+0o4‘•LLÐ: `öÔÆd´‹ìšÔt6˜óŽîßs´˜RÍ©@X,Em„¿F'RtbE‹ïl‚˜›Ë¡8ß8/ëΈ𠼔òÍuÍ@Ÿé¿pÊ60ÿµ^ì‹}.u®=Z:MãK»‰Ÿÿþü‹¿øOŸ?‚z{TuÍ¥üùåÄ*gwÓkK6›†69*°J!¦®ZÃö±åy³Ç, ˜×¼útÅ%AS˜á³)Õ¥Ýruýœœü›†DMƒHý~ùá )Vz$(åjF.õ…U^»Ò.ðûg"‰¥k› à|&u -ž¯ÈL¥ú-jmÃt}†pi8˜cI·[ N\^¥´\õ0ÊdzgÒjG¨‰¾C”áw%;G=h&‚º tèKfÊÆÁBž`k ɽ«»’RakbKû.¶méçÀÀ.å!Ïcã8\*½GÔ7íuÑV‡y²%µë.TE;DíûþܺÒZa&ƒLä|Öm•m¤U¤6Å$ž(“ºÕóN¬QàssðW½#¶©C^ $qxf•6F“i˜¶ -D¢p²UêˆÒ©>+oVÿÁöMÉtÕÌSh€€óʼ1Ø‚qC5„«Ö[î_¬<Ëßî.%—í8Ù˜@ÝôAãÚH½`Gu µk½o6ÔúäÛˆþw|[ÓÙ?\Wy²dê -,½ÔÕ3åÝÁ½ø¤æ¯žšv¢G1¡£¹ŠÈS*Leæõ²ø¶\ìÜ43dZ¤ry€*Õx—•)´¨bî'«<ŒT‰F…ÄÓAÔwGnM*åm ¦–êàµZµøýåoT†²öòÁ=š d^‡Ñ’rúÓ9eö¨@J+ òÝ)š©ã‘ÇÆ^Ú'mÃU.RS}†•Úá‰<-Ç#y ‘ h(ß¹w£@ àÂAÊ£[ÃŽ borù»eRLît‚FŸZšÀ÷W} àˆb]>º¤ºLj¯i¨"jÉ”cÖJ"f,‚¾ZîxutÛM}Ø„ðØ¿º-åNT 2ºCU>”˜’n)½…ÓØLôÎT¶Ö¡¡¤bjIHŒŠ ÓÐ0?«UÑ…i¨Ó«_qœÿÑ«<8îŽëÿ/ÿù?ÿìOÿÄ@]Ì¡3Ó¾NŽm€@âPcÌúFlôSŽ]wîÜÖ0¡Dãd¯œ¿h;Åâ/®\âœÚa@´ „ Æ lpÆœÁcª)¶3}Ý97׮؎CXjéü¸žÁ6‹³ÝøöÇÀ_½}cºŒÝj…ÝrU¨Ö®ª%á‚[ :ÌF5¥±óÕå±"2ÇZpQI?eO 9 ãŒú«¤œ) `Ó~Ú·£.*( °ÌWkA¥œëøÉVG¼€5ͦ¼eVø¨ŒŠÒ2a¾™˜iù <’¯Œñ © ?h[¶æâ#H|"¨3VL uëì6„Õ=îÛ97±4ZómGTÄ#†ßWÒÉ¢l«ºTwÊàò8”¿"yœšA¹bÅk/_˜F3EJÆúÙÓöBõ©Dßú±ÔÆ´Ç,]Á™ÊQ›çO÷I™&uœnÕJ¬CèÆÖM°]$vU”¡\5S9Ó¨—oúuÅîÜ»nË`óÉ㟞=yŒÀ“Óã^0™ík+ :0A“ƒÏÔƒ “Ëf’’¦ÛÛaTSðMK %?6 Îíg°lܽbã ‰k›Ó–|÷ω©( >ä\ÔŠØ­²@äû š¹' Î~òÆZà¢ðpÛªæhé‚—GÁ™¨p§'ŠRƒ¸\“š+§^_[Y·G$ 7ÉC1TM·ä8ÃÆ9€Üø²iyW¸¤öySUº«­ ©+˜u¹ñ­·ANîsVÓê6Ë¥N€(23呺.¸‡ûz9ÕS žjúÑõH3yÎiDí Öq§2ó«¥(¦%  9ÚGv«›£,Ú>RÎf*¹ì…Œ„Ì…@´¾e>Ã_—wÀÕÚÌÀºaJa”Þ0¢Ï|#Dª·ÌV_°˜ƒoAoHK¹?Õ ½t­›æd‚â¼?TŠ'ü ÖyOÇÃ]„×sZi,‡5DÝu<Ñ?²‹~À€,àIãÇ.ÌYˆ´ zkÒÐGuMÈœÎ.êj ™´ êi|p!FѦ¬¦-0[³n·CðåŒÉ¿òJÐÿ0Q]rs‡€;ä1d¬KªxêÑÿ DLHÃå#  DCk‰ØX»r”OoÓˆ;8ê³{ò9æ“V VSêý2™˜+=›’óÒ ™®¦_ØkØ•8]°ºò—¿þ• lOÑèÜY+d8‰Úæ {¥%H:–·ÖöX%n"œ!APÙ†GÚÖý`©?fœ6@ãÀÍöñA‚ìÇFé´8LóÖÀa¼dKM½¾76°´qt›Nl×UQåÑ&4ÄEï…à•¡à—¿˜DÇ~Òxšƒ«s¤6(Åeê¥:Òð—ðä»À—£E­H¿0ŠŽ¯bøé§Àh*µ Q\Ú0ÊJ9/66§BÚ“1¼Ía³¾ 8e2ÇG âu3Çfj‹ÛÒ4˜p‹áclæºA‘¯EßaêYTBòÌcÕm£ÂS­@Þz¥ŽMI“~ŠÉ”÷”tÐ׫W*RJD–-8Âb…=ÏS-8q Іƒ>[[Ò÷ïßg„6 ©x|êd”ÚúãÿHD·În½zõ˜·É`’ÍäÄ\±(1DÇ"^I‹{N&b¡8Μ°==iÁ\[êÏD¥&Æs¬T!0Фs9ˆú‡§ó©L”I´…ÁðËH…è (F;Sa¹g¿½­K›P…eL8ÒÆ‡AÀvø03g„œ­ˆ 8 2@´Õh¬&>vÍ»ÆYJ@ÐC|“@ŒËßA\õÈs"*?ëM͙̀[Ú¾‡kŽuØæ¼¡-Å4¤=K0 !½3@¼Æø·ø“Ù¦·:¡íxzÐÙz(¡:M×v7³õ©Ï1 Õ¦Æ(Åaf’ÓBútuí™eÉG‰¨òþÃkjsó¦}ñïýôý½»wþú¯ÿßû_uóä ˜æÒ® pÔI,!x…í -‡=5ß©V#Ð¥9u!æÑèanCyÖ7yçLUD[’Uó}*Ñ`,Æ®ip಄»V @%–3ûˆRáŰœ G¡°±y¾fœ;2UԵ𵊡‚©S¸y£2^ÜÖ›ˆOåRüÉÆ¡ÝhØ„\¬ˆ !.#7 êšÂwö©sb>è¤u¤‰Ûòÿ kôFuPU’–!~G2!¯âÐEÓ“¯4Üå+ î KN<ÇdΙP@1µR•w™¸J­åä*•´æŠ=)sˬMÉÔº­XÊYhüÒ°´áàŠ1F9°b­~.áÒ©QmŽ2+_ ù´BAHÒ¤6Í>`66\ÙFÕrjº?~Ûh§—9np-#ò ¦«Ç” pÁŸ& ’–"EuðQ€°p‡ì@NâURø±hß*å±qœ¥W¦ C‰içðPêòú‚·§*BOCô£À÷sñW%•·,'–Œ3TËåéÜTvÙ^=Þ™F)€4+¡ˆÂ-i·^€Þzäžb¦9ºÏRžÎÝ6j”<û7-ÊFZˆ 1UhÈ"Ù4MwÑèaˆòÌëT„Ó"®×#™–…r óDå÷6¼‰*°ñ'Xê©p–néA5t|®ïçW'í=¸ÂI"U¹Mªšüf’©òó– æÀ »!Þ¡mzµÈPŽ«6ó/œý( ÈFeTŸ´à _˜9.:†-êÈPëîÈTE‹‹?ó`ÆZòsNDª0ÄÈÀº—A'8¨œ TˆËú†PµÀ‰=Ãn­{ÄÀXÈe?•Ð ÿ]Ѓ$JL8OÖN°âƒE,ªI¦Žsl‘y[½Ÿ1°Iµ0P,sô‚ 3ÈÃ3ÇÔ¼z;Fu´Jê&U„i:¬Á]UU4‡]ª,2Ì urÒaF6#,fâdo‡cà«Z`*™ƒ›A‡ºjIžž’µD¦Gó>ÙAR$Í«rROzæýœ@A"n£oW¬¨¥Ep ¯]h3DtÁ †¾s,á)| á»óÏt`I‡áX;¾ÁBqÌÒ-·[ˆ4‹$~>pFETÛ¢´>ýÁ?Z‰ÃUû`<J9;‡Ò½9Ü ÈÄ ž?{"\sF]h;=ßy­óÆëÍùv)7U‹äôQ-ÛØ- yh#z]ðÆÉFxáiN׋!:ȦH¯ßœÕæHfÌXN7ñ®ÓM]ÐÄ8Ÿ~¼}óâìö-Ê&€;™Oçþõúÿþôç?³ŸTñ¤ÛþvnŒQ ‰3PÁL ‡¸›{ëEñy“{©æ'MŠZ\Oß^ø¶Dn(N¥º É´Sa™€df.^BÐò i—‹‡]‰+ˆµ=©í™½Õò©¡´¡§¢»:tO©™0ý$Y°ö§F'AÜ´´—ï”ÑÜVñtËÃL?Ý›[Ø§Ë ‡ê^+Ä,FË,Ï·Ûç+jP P­@rÁÊ$æŒ[«ç5é¶|å2Èi¼gªäÀ+òEÊx™T1ÊÑ<Çt®ãÏT´Æý¶óÒ’¾žuVBpŽJ£Ýeü>_viEŽwè63ñ ‹(3ïÔÏaZÖH@#ÖܑٛoF8Ü5»³PØÈªQ1ë€öÁGBK€ ¡]p””߀ë>dÆzÓUϲ9ë[öZtLÚÕ–8@»”dÌ TeÈԱnÛ  †ãÀp˜|1?ýqMCqßF:eBOÛÛ®»2…öœj©¬%˜±Ö:Áæ–Æá€ –ê¡]%FÚ8œø@Ž%î6‘æõü¶vE"­}„}j1s…ì‘®6„˜mó…Ó;{Þª ç5xâíü\6Ž.B4äŒbÊL±ÌŒÉScÎMGˬùÍí˜è€|wˆUÂÓ‘uiúfâ­lV¸® º§õˆNÙ4BìfàƒHæO^ŸƒÌP)3ô\Ë@Ú%32—%Â_•ÑŠ’r à1<Ì¥ Ô"Ô D[ÄМI±P®Þª±Ùƒ%ô€¥Æv¤&÷ÂäˇªºfísÉìÍ:‹.yî2ÅÙJ¢Î—¦s#íaÒùéê!h¿]³e /@‰`ŠÅ'GÜÂyŠšõ² 2ZwÁ'áTôœmÎk•~‹yÄÂi¦7([Éãïf®…Ý9³Ê¾`DÀ¡0s‹:%¦ŸVLpcÞéìVÇ^p!¹¶¬µåŽ:ˆÃ?WÕåШG>}òж-ÛÞtN©Ý»zÅ!q¢=aœ)R‡wP{ý±u¢|ž×ºê'£ºëGן<} ú›ïìaóÅKŸ9ò_õyñèÑOôÊ”‚{DÛ( ±&2¡&2A U´+fð<甚+ á¿ûÝßÿÅ/þ%}À®åÿ2]Qô~¾¿ÄŸÎq>¼(…Sh)žÐ1ð·n ?½£à»°Èv@- ÁÈÐlV×X”’ÊY‰kTbp³ñ6•YÕ|2ùÀ]EÏ(•ò”ÐD$Eå¬LÎöA'…=‚€îO˜ó¡ uŠ/És« Á¬!¼ê¥ÔLFšÖ¯“ l (OìÂ>ì¤ùpø›¿ùÆK'ŠUÞ£å·o-u#j°a )Ãh¸8×í´þÑ™F–Mî9d ;&BÚºIm™Ø.G§£ ´|„¸¨¢»¡]k[^É-æ.ÙNœg–… •oÖ·.ÚAÛT±ÂŠ š„ZÐ j´|¯B›±7[±…!/aLùðÌë µÃjÆîâ¶‹ÆA[IpX´»*ZôHb…"@QXŒ™^FÂRŽ{‹|4vVÏÈA-µ[­}RÞ“±œ%{âµæk‚j:¯i‹Æ,†ÀÂA³7¼œn£ÎÅd˜§±eŽ2Æ»D¬4L)àGј(­¥Bø™LÇþœ)à+Š4§aÇ”ºcÜbØx,€ i(C<”9;"—ÃÆÀÙ÷†Ž§!óñ#zí\»sûêx7Ór¢Hò†CÚr’6¿¥!ª›¼2;ÏŽZ¾Ñš|âBL÷£¨`ïZl7§§qÌ{!Öæ¹‚㣣^Šok”¹Á @5ÛL›OºD žYYöàÝ;g¦'íÅQݤš™pÛr¸s»¯zÅÕËhvhµ¸Ùkꦋͻ#TWJÐÌÀ¦GgÐkèäæ±e®)–#Ÿ?ê}(žŒÌÝ8=>Å)Åþê?þ?ÿëÿö¿+„oTX³S¥.™vዌ'óæ<_oeÜNmÅð'ý¿X…^ÍÚ]IÐFùëqW1 !X—y;OiÂýaª{ËÎuàUrVù± b nÇ ¸éy;Ie*!VÌ õÅ »1 p@غbäNŒ] ,ÓÈ‹½ebTÄåT-Ö›ti+M}=ìæ#°G£]A~˜jòÔ,2˜Á×ðaÊ4ÙJFZ»é-.ÃpÖ)‡ËÅŸP˜a³rZ–™}o}Ш(ôè}Ð¨ŽŒh€•¶ËÄÊT­»Äœi"aƒ°š€oØŽ?ôž©èŤ©Ÿ€@‹=~ôÊaQŒ‡†¹oLwX}ýü¹ñ¥F_¬YšûIQgnŸÜÈÔ˶¸ÍíZ çtDègª-D&JgþŒwúéáS¯ªÐy³ÊØ\‹:;+„'4Ù8J#óÉã'ˆKëöôG<Nê b¢NС’\â¢1/9ôNNCzµ÷½2%*âE™ SÛl•5Í{Ú…¶þÅÃW/Ï™áãÇOöMj:æ"‚å"Kv 9šeÈ’š"̇tÞMFÏ ÖœŸk°î4YK¿[ôÏ”®<~ü([3`ž…KGí0Ï,½¬à8*³¡¦¨›GÏ¥Šöf†Ri ‹¾5:õº-Ô]?òÑ9ªþé9"ð©œò4jyõèûß^zóc3Xü 6BÛ04µ@¤œ¸›Ö”pG ²ª4}ÌÂG™©È¿£†b˜£äül6OZ‡}€ó6­’V„mW¸C™j¼K=W)O—A´B‚ø$œ<’¡ô7ýTgeM‡á,ràg™ÈÝ–:9ý¢YŸmNb›¦ñGì¬ÀçØÄü ýPkhÐHbÚÚ)Xn(/døzAlø9ø¤™j%Æ­èº-©ÚÔN*¦òÔL”σv-Ÿ+.ŸåMfbR­+RZŠ–ROS^O&zVc0[à3”OV¸ž±ôԪ󀡻nuþœ›ÐVð/ÊÂÙ°5`.jA×ñ‡)Ie‰ÛŽH˜"ÑKÙWÄ}ðtð¹åÝ„c‡Ýñ­WÝÙ¼ò–;c¶¥W¦EÇ7O?yHË…0h·owÂ;ƒ íÇ®A£Ñd^>éªÃsÍÐPfù-O7—©!{ç 1ÒæmÃJ“1pS[ض. Îj©¢QÈÌX¢YÇOq(|¢§^ò¨Ýülã ýène`ª@ IÓ Tª.º™6v¯ÿFþê¶’‡ÖiÜìK[i´…·’ƒE"ñ¯§·C¸ °5‡Üƫَ:ceõÆĆ)†)(é튟1²{ï ~Õu(+Ò=°¾0jznš£!¡¹ðByëË€3á‘à^Œ=nù{®ÜS*uÑ¥$º6î׃ 9ÙÂŒD) ·§øíýí½û_ßÿæ[Ü6º ^Ãâh€ÞD¬º¤/øÀ›MgA.Æ„4ÅÜÁѨò ( ˆL~.£ãù$S†öIƒ „êÒÐWÒy?-X®rMèh‹•@bŒ{T%3½þh«&b_¹a.dƒàŠL»ƒsÙ¤«‚&’³Mþy?YrTØBÕ]ÝPƒíŒéýÔúri;e´d¨&n È\µÒâBˆ™ÊpF+Ýà³ÁÙ’dÁ@¸’½uhgNXšLÃjú…aW­»„H›©R6P]ã:šÕ¹Ü€0X—ß´,bhÌ™C2íåÀÌE¥åHBfµ×Ó(-0êhò-¦Ý𘹠å]`z7,wÐ9‹RÈ©–œÑÛC¯§V8Ì žê ”Q÷Ùs_E;¼o¡"œÁTÞj»ŸUF&r•ÄXñë&Œ E-œ'œñŸ~N_(¦ =dbZAZ‡Ç^™@£S’÷Þ´…ã |ðáàãØÈ÷ ŸÐde ìí[·6PG¨.2 1Vˆ}þÌÒ›ú ….œž Õ£´·n:7DéÑ|äh"ܽ:J¸¹ÃbŒT™±ÓæàáJß«N`*\8k¦ôvß8~êïÔŸ?¢*à'ÁÌMZIÍgä™Ò’ ä¦„{ÁN-¤AR*ß…! ONÓá‚Erä/äÀ¶RÞË#ð»_T±§’­¿{Ó¼~æÓA?gF­f°~iÌ¡4,AÒ†4Bpðé._â¢Ì0vq訂P jQ¿ÎF¾ªŽõ/êî5® ãT¦ð_Äs¤!5ÔT=šÖA$+JzLº ³;ßnñ¾4{YÃ8’Sĺáâ¼Ý¯N.5§E$Áà`ÊÖ×;ö ’ųN¤9CÞG§ù_‘…Ù“ch5¸yÚ‰µÊ¬ÇPÌ¥Gñò©Õ[Ð1™ó3`ÇÐ~°Vµ™{Áä3Váøð™«MBà+);6ws =‚,tEs-ºØâÍϨïÛûÍE  x½_p]2ôÍÍ—ì†Eò‡BÒ„LIP3:ù¤ }ØÞWû`¶Åè gñÄ‘i˜ ñ~».b\  0 pƒ©Z.âThûÓË‹ì”qUkF_Ià)€ÐÌ‹½ä/@…cBëÔ-ž*ˆvé†b«ðÂVضæ>¼¯Œ²Ò.™,LY§´z_Ö±Ž‡Ð‘ïoj]î­ˆÂb ˜Üyw£h³ø'ǽÙ'g#rá‘6MpSÔ nx %3sìѸ•žÀÜ…å %Fµ Q1|Ι¬ó“f(Ãbâÿ‘¨\&´âFlo_g5jÀvúò,~ÃßQ@$À>‹ªYCøÏ4RÞ»èÉJÐOä,Ûõ¸ +uJš")v_*»ÕI©&$Tq’‹„P]1|s\8,Ÿ¹ËÇmwËlÓÓPø¥˜nä"q¶3ð}¤X-ÞøòÆÛ—}¶!¤©,3Ý_øâ…Mîúpè4JÉÏ¥òç†UF)9Ÿ­Nb"þ‚ÁÖ¡fŒ™ÄÒ¦ðÐ@…¥fjŒ~ ¯9Ùô#þL ð]c9åÁœ¯!Ô°2¨"NZq Lͬt*f’ŠŠ‘+¨4[&|ˆo )¯ŽÇl!…ðcðŒä¹Âdåý¡h~æÔ4¤…»FtBšƒZžo£Ã–³v*84 ¬ÛÀhj¡>yÈÃs3U¡‚ðÆOk&Óô!ÀÂP­«¢9¯·Ã“!§-¥£ýv¥°çüª mà«møHhK9øò3Oô•¨pضF'œŸLí¥9 P¦(!¡%€„% Ú½qóÈ‹úøÓAV×®‰~¬D+FÐL´*õòÜú×Ý{÷1cðä zÑSs9lÒºbçu®RÇ+›£„ví{ég°b9¢€žG¿Nfa€ÔQÎ&ê @w<‡^`<"D =”ÄcA…dä˜ՇxþâCRÐüÄmj'¡a뉙6MÓÌ„;¾Ч³„åôNåÈ!  …ÉjëÇï fì( ž Qm4$ ð þxv¨Ž|!ßkö®òÇÅÆQ' ù+FA²ÖRýŒ®qUšX‘8pþâ?ÎP¦°VDx4ï<` ¾9t1 ¾‘#ÔÅ@è™õ'¢|ðà; Œ—T÷È@CüTÝb ªaŽÉ³ú]ój¯œPBƒÍèïkïEû],¡¾zÍb‘‰êï-ñ<µêùò•ЙRå[üÓn‘XA°.¶ô±:r˜íÀ“Åa’懕G|+Ή£KJ[éñõë)Œ»Ë?‘°@Üaî÷ ‚°(œ¡9€ÀÜØ Lå`zH"Zß*Г8wÚc«\„ tÑSÀwmX—{„ @þA%JÌ'‰ç`þiB عÂÓÿXs°Ê#ÅÉñHû sŽ)ÞLÜæ^ÆEPo8ˆŸ ©…"’éÿø1h£ÜÜœo¨¶Èäcé6„5.3T' @U±q«íœ0Þ*às¼UÞ\ãzHù‡×PîNÇ\á¸Ú¨‘BCA@÷çô€­º.ÇÔUnŠÇ@p ç’£€ÄðdºØL‡ý>RfTɯ̟¡z-"nO· ”Z¸'A™ççÁº•ßæÕ<#_šž.>¡ïJͰJ^¨ÚPZCZQž»â´¼…­¼Éco—Ü<éuÈ’ÅFO×p@Û¦U§? ,¶–ûüSC¼.8X¦B—6ýæò(¥-X²tß ²Â !’rQT-ît¯%M𱊻PKÓjvf…ñpuléÓ5­ÙêÐ~ž_þ-Õe;¬Ë·UÚîàkÚk-ø ÈŠ~WO]®IëîÈÑï)  ŽUðçÎØÃ*åÚŽÕÍAbIKðŒÞ Âà/×¥i9i Q”ñ“RÒ_£JÂÊ¥1¢èƒã5ï†+þœï×:¦aµS9íú?^\¼'@݃u4ƒyh*\Äh$ÿXÃPÑI3'ã+TTk®‹ÄAý™KRgZ\SA­\s|ਨ‘i¨˜ƒt{ý÷CK§¼  ¯Ü)nšœÑU‚5Ø7ŸAð… ÖH¤‚ŒËÞp/…vºæÞBž¿±®‚=éPWùAµ9$†ØV”ð¶îÈ´g¥iæÕäÈG£ÂÙη4`iˉ7åPŒÞ á)ýœ åâkƆ3¼™rú®EX‹.¡~‰±7PÊØ>*cJ‰2a½4Ó›×9q™4y…¾íú)-1‚«’¾(|èG5!_&ú$@Uz<(y‚¿žJkSûÔ®Zçç/½!(”±&Â8a¨K&¢§9¸î«,mÖõR7ºLç†ÃVdêÛˆ”íì´C"x7½cz?¢QKG$r·¥Ý¸CŒ¦cnÚÌ™ÁEšM*F6f}øhÕoÃÊôÄ»Bí«†MÐü#1Ê “C¯]Ÿ÷eZ‹”Hró‘"`AP2ËL¸ù0Ž£~bEŸä›yA;ŸnŸÝ’&bLfGКü’pm'4ÒîX)AW„Û¶ ÉÔÊÞa‹|Hjz+nº_ŽŸÅx.ÉKµbF…ñRýeÛtÒ`¥¢€p¨^}ú€{¹ð,/Ú4vÅ cM6ÇAo´§…`^X~r1¨¥‡Ø>—žœl¤wÉf£Y“ÍVg''öûzÿ–ðž=f{Âý¯¿ìB KuW25ZŠ'BX¨ 40¹2™™R‰"'„Ô^Ä:¡£ï¯c]˜sÐÙ̳a ¾R.!=´W}&½r$­†ô® ‰ó«é¹Ø`Öd_Ý)ä’T—¡Õ¸ 'Ð&:§Ÿ‹p5&zƇpˆœ´9î–»%à?ð³;iÀ·.8®òQ 4?‘`ø"-_ +Ý®îÇžVom­-ÃEKhahÇTl£X¤BF‘Âð³Ö™æÀ fdg!cuI»LZϨ<$tíÆy„n,‚ì×–çÞÉtiqWÉÝ¥ÌØûfºû HÔöº@Wé¡"Ù^ÁàH+¯¹ÃÆ×´;HëLÚ«â-BoõÆj¨Îïªk6Ž«C‚‡\353ëÏšµ ¾7‰ÌB!·ÉS{ªŽ¦Íë`+Š4DzHìqèƒÄΞõeâÙÜfó˜|VAî´šÔtÁoßè¶^<|üÈ!X·n{'±ÙJwð%Vó5ª"´‘É@ø&ORÆ”Ë äx4*Ì ”G ”Ü1-˜µl\ƒlltm] ¤]`ºJͶt ù‹zŦ¯ò?ôÖyX"L•û‰Ï£_9IÕÓŽGI{´ð1b¶Ç|ªÈ‰çz‘A@Iåa¢¼Ä Ø¿rñlØÖ$èa#Á`:CÁ9°JŒËx† ‡¥æ˜$¯_,iÛgïX_Ó§k¨ÙC÷¹#î))KŸa₆´¥ÿdÑέ0UrwømC°JEÒÜ=à­´7Iwà<8±¥ïpǼ‘¡Þ‡†ç*ÌÝÆ«²êna”@mwp·qúÿÏÔ÷è•\‡æÎ&Ù$‡äÈ’2v90œ8 í3ÅY–âİøÃùlËð–Fšîd7›;óüÎy›ÖžËzëV:{Zn]S&£6ËXx"EɽÜf¦)yÿ<…Þd@h;Bº³i'ÉÎRÆÅ÷ðû©ktøâ¬½Þ\ƒ†\l‹U/ÆcÁçã{¿ˆê>m#8/Åa‚mx÷a¢«ÖìlÍ¿îÃöì¿Þ0øÝwXíÕ¾üÔA!ÍáíSGÙ‡l9)³¥˜Ù ŸžS“E@Q ÍAdp8ÇÒg¯¹qv$°Šª;~Õ‹Š)°&̃‰ùÊ£EàÅ'²Â6DŽ2_ýËù£ÅFà[9îʹÞ4ÍÙz™O U‡óÏç/ì¼Ë*gÁ ±ÄŸÈSS€pW&óUþ)“C€Œ&¸H9ê–žîG-¬Ž Ú¨°üvýÚn—q”kè‹lU¦bZŠœ‘Èa ?q#PzÚÑU…]°WÌuøôå})ù€û ^ï³Ítߟ—g»ÕeBU? ë;Ú j…ì.4FÒ2F7ôL]è)BRèiˆœˆ‡ ÑC ò*‹e”§°RÕ5H¢ h¤jEáxa—sgõûFûœ¹bè$ 0oÞ¶^ÖþúFž½·Ø ™·z“÷ô“¾tL_¨ET€á§ºz3 eâ *(C:”WECÊlW ™ÐÍàa Mx¤Y–cš¦TÒF¿B+m¹Ô ¥äÐ=#±7Ú(S˜hîøÍ›“£ëó]O³¯àm´(?zcl 2kúLŒ º-:_½ôðá·?üáÆo³0¦ôáù+Û ãÿÄs׎k†Æc:l Vr~ô£©(:!üÑYñ6ù‰H6Ñ©©HF4Uuò‚O‹ŠycÀÝß³Ê"뀌 l”†ÞgOËa}cïñÖ8ø†dü”ƒdwå1XëÃ'û(n*‰X,uW`ák}³—ÛæÜ3%dn±"ÂóžHsž6§Õû¤WMr{K]CD š CàRdú ºÊ娂U@]MØ1ö†î™€L\(XZ wÐTôNîéë÷G×0æU[–¢}˜îº·ÿÔÔ=:¡ Ò”6 2à–þmÞhq POúÁŸ6º˜íêÓX\b Eø)Œ6œTÑ£ai˜Ñ9€WžbÍ[„àë(<ð¨§;­Á 5â‹>l`&ŒÙÃÑÒdƒ0]T[;×ëitDI†æ¾KIÊÇ5Íð†žÔÖx|7e°å3CN¦LÅ@p)0dž?µñ´úà VŬ}iBw¤I ž!IC Bh@ª·ñõÎbF£ÿÆ|~Õ™‰LxwZ÷öqß=i ôT·†uzÒAí†<¤‹£” "r†®™…öžêŒø=úî»oX;È.‚X ú-@ð£wB5{]àL´kl*”<ºfCÏ6š§ÆÔp¸hàÑ¿¦ÅµxÂQA@0!¶=šÐÊàãGOM<9æÊd˜JêÞ‰¦”ÝÜ»XêtÎHçÝá GÌFY9:6œQ†¢A{W=<‚<+”Ð4}\(G IDATH€†½ðD~ɦҪè8è¼\Ðl\èäP§br«çq鸵“æ$’xKÉžbµò@éI CâòÈZC 4½ñn(ƒ3zbÓq^DoŽSó"ïp@É úôå ¯@Ø)‰÷(ë¾ÚYYÌV³Ï¬)XÓûË ¡™C>ÆRa˜™MZ™KŽ0‘†°BNf·¦Ãwó»ô²Ïë³BÉõC‡ncaÏT¶lJ»bÅAcá˜i÷íNðáƒQÐH«˜4¥6ðuŽy‹†­‹}óÍ·ëã4¤fnfí@ÃpLY™ÈH«›Ôdïõ :¤úÕ×ø¯ÿítëC2¤âå‘^¾è›’&GÒC×Dl‰\ùð"´ Џ¤ÊHó°$ Ÿ'SBad¦?ÇŒ9hÈÔÖug¾Y0A‹|í2ƒzÂó>ƒûa2”IE™[¦bÌ-ûM[\ZÕ(Fmë¢C "X…oYöCã­ò‹6Y‹'´Ž· o0¥=×sýä8ØU: Í‹€óZô#"a;ý„„JÚeñ e¦ÃM¸Š·.°ÍWµd"¼k·œ¥uJPké‚8Té9ñ½Ïá2¯Š8x”Üòä%R0yaZÐðWþPÂòÇ}ác…Fá'¦“fA0AÂXž ' ޱÊ]-°U´²Ý×ukÚ#—º2£z”Ž×‹8_d¸È‹ 2[ öõ×_ÿøÇ?f4µþ&VHü¹;-ú¹]&&!ÑôhMbýæ7¿ÆRÇ ÐÀq›2âL„‚Än·uý”Ç1T=„0$ãMs#P‚äà«‘ëm Üp^† Ï•G2îy  ‚Ä¡"°ä-ŽÄqî!A¦ÈXB`­âòøè¡54ÁÆ­Â|œ+‡L‹Òy°zµ™ª7ÅeÉØ%Î :ÞúbôLyâ$<¡Kð_ÙÉñÍ_å‘Ié””ã’Ã4ý½dŒÔTSëù£€XämBžOëùg?yl a‚|D ­+£€‰ˆ@>”/ÄW˜”,Æ–gë¶§WÃd\úαš&€¯t( ëà$ÿâ/ÿrP€kžq*˜q¾ãÇ™€/þˆ 0ï<׫·é¤˜[a/ñ³TÝG¢=ÎD%îUÏA~*Ó9àÒß©ÈJuxýì™ßÏ€‘'c+jýÂ¥ë¾ùá+à³è1m³„DLyŽ[Çe' ÐoÑI§¹ØA¬/…UK⑯1Öù4€É ™Ú\à-|˜Ä~õúÔq/½9á–«>ç|ƒ×0†6EȾɓ–à,Á`1Ý‚!ŽáÆrTÀ–ÁÐHh(©kQXè$PF¿ÞËÎÁö:3–c ´ Lûé„…{o®AÒ©»Ì W (·â:SMkBîn¹Ìö˜ÞÄž•`¾y…(ÇAqeðQ¦NÑÌ­hÈF™´¨Odg *{øøÑ[7 /Pc×i’)Ó $ÀÖœ3eÀ™ŽQ0¶ê \4¥“âçŽ*é€;~Ž[òöw/M~ôj±Ã r‘€ôèRgÒèGu´/Ÿ??=yn èôù 6‚чß=䎿úê+[pO‹ü•¯²Ë·[„d±K~~:¯ÊNûÖ½¶¬ÙÉq~–˜o;5ÏŒ8² s›–Ý Öoߘ»–`æÒ¯^¿Éòƒtº§ÓÉåÎ5m]æÈx®û §&¦ç#^éõu¢ú°´”’ãU~ÛzÊQç Õßê³³Ó³»wï³smøOi‡WVdÀ6€Q±3yöúÍí»wyJGžÝN>´ysª«Öû © ˆæÆ#`ga^Àß“'Oá\¡'³²“éâl€0šr/õï4ËxŒQoß¿q„:!jãjâºdÌ^À„F}½N(¦= ”1§1ƒWãÓ¡Rd´vÎz¼¦ ùšè”±¾Å×tË"& 0Æ!`:ëz‡OŸ„€)_s*ï>]êÄɧ!›ïG'6¢`’G·îØÂBF'/_üø÷ÿÂh~úäÑkWìïƒ*ų” °·¿±‘±NFþx"Ë gh>½‚8©—ÅØ-ƒ×-0WÊÆŽÄÏHh^©txü¬ †8•ôS¾ eÚ¥áTÔR2«´~”xìŸã²‡X˜ D=Ð Æã@ÊöšXH#ÉŽ* pHbqÞCV(Fc¹+ÓcÖ^ä¤vÒØxj²5öÙ§¡«Jëüi&n° iô%¬†le¢H™äj[»Lã¹OlPfÌÂÒ5­W`ØA÷Õ×Ù¸æh) ™8oãß–† âa˜ÍÇ4ÆÉÇ:sldd®c;;}fPÝÝ0—¡ÁáŒLøú$ÄìókÉ_¸#Ðc +Xi1¡Åö]ª@alÓWÔÍq¬F))6Xg¨­KŸtE`…Á*aÝXäUQšø€ISlCø‰Ÿ~kΠΩYÓ ’>üNµ:¸W'ÊçÔR¬·ïŸ½xrÿþbÀÆáÒ…ûD›<Ç«Ùó¦ ºþå—¿cEá†UZ›º:ŽÑÂÆ[·ï ,5ÍY$¶ùî§§Ä1.î:¶Pçt¦¾Õ¸Ý‘p£äa¿Ê ïGL†:Å£TâöñMÁ\Šá<\à¶RõØ34—l§gdÖ¬ó3¶I³zì1¿8æ€Ç…¨…ïì‹¥”æ‘è°þvÏù£ †” g æÂ±1„xè{i=®Ð¤Áô§ UÉü¡]ÐeŒc6ϙڶ 2÷©«AŠr]ÄêÒhâºâ؈Ӭ.ß›ˆ?~â s„>;%%AIðε ¯ªwrH{äõõó%ïŽ‚Ë à!nçTlq_éLídVÏ^w².,½üWõ©ÔšS È0éª3Ø|-᚟€Zµ‘PN ¥Q‚'T‡fÃô8•iŲo¦ªf›•,šçé!…€F5¯Qåõ%‹ƒïf,S%†¹T´Ó…ºh”ã#29ÕÕyã)éÂgHR¡F6>WÒLOñŸ˜`[å-hsˆZ¦…Wìž³1Ù< að?yçñªqp@“çœqâçvÊ@ CE~\‚Š?R[g–W#KOëé’s *µ€]³.AЖZKþþT}ÝaåÈëôÞeè­Zw¢š—«/îá.õšÑ{~H.h4Óá(Ïž=÷‰pC¾bUŽêæ“¥ŠŸ\j£tšëm̱  <}~¨ÂRV²¹ÍÞ1!‚²åsjs2­º,™BB}ïË/i²†pÛ ÝÔˆ€Oúæ­›¤`˜¢2„% Á]fÔ÷òeȃ/,c?Pj Ñ0æ‘z@Õ=zò˜1_ål,Wqš¼6êó|0= Aa„I§ÁÖ…^Ý H­Ü1•íÙJgAÉsœŸ·´@œ¦š¶yyÇXÒj¡X`a¤˜Çꀟ ‹†erm2aânêzv˜ŒiÂpn¦N=r©’ÕÕIÇÓM.S”ß §“ ™âÅãGtšÃjtùP/“í3þÂË ö1Ù²¦ð½ù€¶òž†F&ëbñU»ZŒÌ™–ÆB]+‡3šr”¢–;WÌÝÞ©œK89aö0$UPÿe‚I‚î&Aß¿½×·À-Ó¼{ñìùüá¿Õtˆ@xùÆEû 7L†*r¤÷' 9Ü-8‚ˆÀ Gk±ð¾1mŽÐd4£h‰´Ëù´­+Í{ôŸÀg4.U’E‰lÎý°²|öë(†ŸÖ”ÉCéÎ}ô´ØŸ^@ ÇK?€êt_ ³ë8<‚Ã-ŨÿA UÊà'Âuk_ ówAm§Kcç8‡ô|º¹au Eަå@•L1YÓÐ`U+Ó©K5=HÆ"H,H'(‡þ/ž°’?Þ½kj¹`W pb#ôt^0Ф9c?C3döH)©Š¨TPp­£h&UÅÖKxÊ‹y$GóDg¸5•\º @wíèl^F£ÖýÄiu=Ó:·|…ÑaÍq˜a{1¹KÔG­èë_^)C| ¹ƒ#d˜*þú×_ÿã?þ£*8 ®]­€¯€Í vÍÔ »²_×"ì¾\Ú»Z.ŽW,® ¢ÝËCÕØ ‚JgzŠ#Å„$¥”ɉóDä;ƒO‚ÕòtïŸ#V(âÚ†Ðt…A!MÝŸKzî …‚„\1n_þ³?û™êËwP”=Ï9ÇL392ÖGæOœ¥>Q ˆšŸN¨öÔU«íõ³áÀVõ±Ü%ýD-„‘ ¹ðre íj(ô+íÜ«¢âx®zS¼å¨¢Œ4”@(T»´èÄ¿ùM˜-M@’»÷³Å¶á€’VŠàóåÚèa‘JÕ§-TKk’m“ï|Z.jéu”gû°ÕÓÀDú·±ªƒ€ ”lw!+0¸ôú•³õÚnïÕSÈsšŒ”fÄ °<¥Nªèé!ãBÚ"°ØÊY¥Ä ÜĦëEé$–ŠÂ-º7'<ªÏu‰òZ¤âb¯«ˆB?yÄ™µ—¼Aµoݶïƒt“½xnY2®v… l¼Å[Yî÷t%Ý9ù¾´b$^d¦InÝ 3Áq_¢€’8Qs à2¢Ðޱ9´O!Ö„œr|=•3#;î°Ðn®æŠ7EãjàófœÚ' ¹}ç6ÒÌW‹Ò<–»Ç7 %A›{7˜¼Y'YÌEð2$:&Ögû‚@H¨À8¥\?TUšI2´ýTbfšÊf‹Z¸¹öGo–«åbRn{…Zô?£ùZd}ôÛŒWSO3ÿ*¶"»˜žrÙ*ø n#ÐÑÅ!b[Çöy_Ä8ºåýÇN 2ùDÍxØõÎiNË@}—ÿ¡çf7G…ñ5Ï‹ö^±¼äsL×8ˆ¿ÿ»¿;yñò?üÇÿúèÑÃç/Ÿ}"1£œÐk9ƒúÒ.$ƒïÂg"Ãgž( ,^%åëàÇÆ™ÈWLDÉQ×Oצ·Œ»‹È(ºb£6‡ÂCÂl!š½ßÓÖ¢*žà‡[‘ý‡*Žp.Í)þ>¦2M¹•BŸ@)Ì­¹à€‡ã…=ŠÛÝP€ˆÓ¥¼zÙ>šªˆc¿­ö Ã6ä»>9Č𒚃Ÿ;mÔ©Q¯ƒL»"A™a{¼`©à02W¼4*ãRF ìE/Z(؈>žœ3„-‘¾*ðPžzü©fH“ˆ^¹ ™=õüµJh« "“9Æaµ_š[ÄÀW]>„W™åBW—"`éˆL`U‘ÐÁSfòòh¢…¶Èbq,G[ 0_‡Þ&Ÿ2î)XÀU´æ ‹(Å×Õtñ¹Œ4cZüßî5•H þ…釰†À4´óGÇ)÷pË,Vu«Î·‹¶¬*ª«ir·DËÎS fòÕ4ö¼|Ѳþ´ÖrdÌ+j ”ÀC«·äÅ“ÀœìÒÖéq–ŠïÿwìQXsº™˜% Bésó„'à2WXPõtï yäîg|PHLÎ"O…¦ÙóÕÒ®lpûÇ¢™‰ey‰i¥380Â.³Þ²Ä+iŽ|²ûR­¹Ax·HâZ 0[†;Ø™¦ —ö³ŸR.XMà\ÚSGMnB>\#¨Àë ëˆ“žÌæ½fV b°0áâÇÖY!Ú^ì6ùxÔ¥å“ßþÖvàÂDŽàæMÓ-ÐÛ1FoÔ¢º ›ÇChƒoýÛaÅ–B4ô˜:ÙÁÙJ–#©L¢èÃÍYrgBqoþÖPЖnáDèe+¯R_¹tòêD¦­™ÕÅ·|¥Ög}nùøÎ§NZ ¸}|ÇËèõñ”ó0ÓOÍÉ9Z,Aºž·t2Q‰V¦]äª<˜øÏ/ip¨4] quž— ؘo4 y-*iןéJÜç ²õ×>Öô§¨ÈT[£J•Õ1AÏx^ì…?˜švQ5–S4/Žh½™§9066:Ì¢s/íZ¶þ`¹çÖíå˜ H…Å:Q3+¡zñz€2Ó^gÁËs„Á0CØŽ"ûÅßý=ÅøÝßÿ Í›:Η½ <7vª0Ô–¦×îäò’€±pX‰H+Æ'ŒÚëó4ª¦ð–w×ÐÚ˜„ºD§&æ|ÑÀÊTE€b z¾%%÷¡½î¿9rÃTÞ˜x–3àAˆÊŒF˜ŒW°Òô^–| szŠÙb3£Î;AÒì1"9€ÈQq¯Ïé*šdš‰+&)‘aÎКP“´Sá~äfÚ×>R~õ[°dã…5æâ]|Ju• Éâ°z)ÕQ*GÓŠz¸)p° ¡)Nɵ@þÚ»|®ƒþ+ à±b<€ôp÷ÐéÂ_×–Q ÚµV| •Êç'±áF+£¼æ\ËòLùË+UTÜo + OµvÖgÊ‚6È©2ÑI8x¥ó §¢"8À¦äçëË;NÛÍX§w¼ ð˜P ”JÐgO=€XGÛ)$ÜB;•!1Cʺ6,ßq’° ·é¤T\4üôÍÄÕeÈøÌ¬Ààšôü0œY«4°¾äzg@Ø ]øCXVØNÓF1dÞx¸lߘ&¨šÞ­d[”¶}3¯,ß…W£T«JpsÇ…XíjKbÊD‚|™áÏNм¬ð¨:8]ÐÈÎ^g† -HE·rXN»WdÛ\7b‘ïKåx˜œù(08ÚòHE¨b)~Ow¶ú¯¡¶)]ÇgL†9»LqñòŸÿùÿV® 3°,‡3˜±ñ4C"[ŠÀ(„‰3–Ý‹A[v¸zñ=gw©|Ø´’ЖoÜ@˜ÇËgo¦„ieù+Ñ€Ìg,àž&Á©æ9´÷Î[˜øïÙè^¦‚‹ê€i—Ÿ³ª Ó±‰©b4¾ØF§+AܵNÒò% ) ‚k0ÌkÐÂý‰KM¤Î‘šÂ›sªç¶A'–,Óà—GŠ{ ù~ç‘ó5.uÍpàWâ§Dµôñ£pX¾m­UìS$´òYÆ”x”µ˜¬•sIõVÝP@¦(8ˆóW‰8Ñ€¡ÿaÏ\`‹OpPÞš†2Ú…¡¶4á®.È›³ÔÉÄíƒf~õ³ÅD¦‹ÓÜ%Ü&h¥£Ÿ%¿ÿ°Ç„ʱ G³…Yv/‘¯xÈûsä5jÒXܾ¯ !­STk4 Ì´ íƒïê謯ˆð™ñÉM,¾4ñûò¥ UÖ:­Á÷âô0j¦Íë´"S[×ÏÓhGíéœXƒñÎÓø—…fXÄS5-“¿ûæÛ—/žÚˆ=󸔣&}gÓ=°d…áéòÓ¥¢¶üÄX)&ºò“+*^œ [ùô;ò› œ5jW,ŽÍ¥àXçZä»X‡%-ÊwgJ+;½‰iÍö9!aæØ•¯¤pÓë€C6\>hµ¾«9:ç… f Œ Ôõz ¸ãªeØ5=Xy¤¬ZÀðQ*ú)ꢓêú U V(…:OݼŽÙÓÙ¨@wô²&±HÃSA ¥þþW¿÷âä¥9-Û­ ,Z¤Œv‡ˆ‘`¦ûòƒ^Ö„ÍÒZ‘¹OÛY¹òÉĽ +³—’UŸã£äÍtØEÝ&—7*Çó ÜES¿é†º.@pÃEöÏh&~Î^)à9*I…”)ÇOªˆRaú0‚Ëò8·Ë?˜0ÓMó1 ¢ ˜²3˜¨¾%âùpF"°HŽÃÁŽ4‚îÃm׸Bå]pPLBe¯N@­*Ž—[•€ØÚ(¶§çµtQÍx ° IP`|ðiB{=ë¿ÛØù )©¢;V°ýX1¡-lÓ#„³„üõ$ܸÕ]äõŠÄ~ÔùúA @vç[¶¼F—"?W{ÝOw™ Cª<‰­â¦Ö€ÒÊgJ%`·u}JúéÜ|”6‡¯ ±šñìÝ \ÓàfÝŸRqS¶+˜þñˆo-F>tމÚ…“´GR ?à¦h9.«ù9§Ë¾f;AÞE3Ù¢‡ bYŒ‘Q–µ'¢þ—ÂâÄÆñÞI è)¼|Ðâ pŒS›h²( 쇿ŸÒË@ۼ߭ŒTÞn׉F”t 9Ýà³J« °òT†0™¶Šh§RMȤ"õ2#åmBðç²Æ*s"‘&}læ€Éà`7"’\¢À¤Úôè‘’Ü ÿ¸LH.Úê1H)RQlî(­Ì¿!,­z”ŒYÂ|ähòŸý¯Ÿ-SÕê6F5'Ó«¹°ä« ´Veª"*å5¹?ç_fžf+£MžàsZñ÷-dö SE@Z(BXCµ>o»NCR Æ6Ì$a¸?xN^$uöB„©‹d™á6ƒxJƒ^xÊ”°iÃ]¨Ç$¾¸Çß^´6ËŠ‰E35 ^ÉJ¨(¾è p*Ÿä7ÕZšNB€µ.Õ‹N,IOCˆCã"&|Á:…á.éá[îc¹>ȺeT‘Vp–©uµ¶˜*[lÆ%(Á0°àX15aÉL •:ÎËÒÛ2†t€hˆÒ+¯«¯t­ v6äR#‘%ÖŽ~´4:à¾hh{FW:Ü« ‡ڜ놎S»Ê»˜6…ÆêçOž qlÃg®°%"Ìpÿþ·ß~sõÈ–¦K?ü_=zøØçc¿¼Ÿ2qÄM®ˆ\@ú•Þ‹ÛPǤgÆûìØ"m£kÓÃE`g»7¶›yt.o&z‰ÏTÛÅÛ·ŽiázF]#¾U¾¬5Ê-¥f}¦€ÅCb³¦I1ˆíª8JôÞƒ{wîÜÓ®íêfeìIÅ ô‚‰{»²&G °ƒ€  Y+Òµ½ýËû†í}ƒVÜÙ§à ‡û usF ¯ûÚ(>HsœLÁ+ÏŠçÄ[x¢¼0¨ ½ÃFÓuÁÊpõΜYªÀh£‡Ö,»‹¯fbx”óÜÓ-!ð‡¡4=ËIC4<ÐT ë—vÁ1:•Ÿ-ô Ûë~h‹ y4O¼¾wþÜÌaÛd&BaGÄédã~a‚Ë.£øá£G÷ðÃz{J;3Þü70p:†©LH:šP|uóøÀGøi:!Örˆ¸á)xˆwu„”4Û­WÖ­ÇFwÿ»8;ê ‚4ú¡ß£ÆiÚ…T~LA6K.ÊÀ„t #ÍúÒ®B+£ÛføütA?qu‹åßü?N|•y½}´6Ô0—ߨ•Ü0ò0'˜"A}úªäÒg•뉥—'Ò‘pˆÏ>wWLÐ0ñH‹äå§«óHƒ~®‹×´.Laa «¦§ÒîÒÓ0šnæ Lù{ßbJbv h“}xª2©·iê}Ý®*Ìó_¨ 2À(­TÀ–L?WB[¯ˆs”C­^H±ñ4»ÀdµëY4ºÐ„@~ºðÄX1l´àI ˆú¼p“êðö…ZÓ¡`WœŒi„˜\:Nór³Ѝ!­C(á% 9\Ó®ìø×[A9™ÅJyÞØÏÖ,Ç£BctÛìF»Ðr³ÒÍÆ=R¶Ûú6²L€ H+xJ+¶Î„¿šº)˜ZÒÐ#,…sᣠƒX¢KOÅLL_I§`È«£Zп¨ãÝ0kšÍôT„3ø-+킚§ñk6Ð{‘)œ]¬.ÿüg?Um©BérIqœKû²["ñ7‰èW ÚeZ‚‡ÁC•Íì‘÷×?CÌB…pÃ5‹fe¤\\ƒ©ãÂÚa/ à;æ±×ÐÀsQ©pëw޽ŸKÍeoìh$´hÿqN9ºbP=8Åš¹ÛâSý”üŽ#E  bõÕÒƒ–+‰Óš›·sóyÀ{…º€À¹‹É0°ÉÛU4¡4 ~k™¬—tdR>>d«kZbéaóì=R’1[DÐSÕäXÊct„KuÑÐ"ÞÅq-æöE‡\ncCamƒô@h¡*ߤ ö+=Õôâ#±h+-!s‘Btq(Ð >uêøygÊÁ§¶8–ŠsOÎ>0_õàþ—"<»—oÜj<–lªIfjÇæJåðwê¢%ꥵƒÚÖ|ñ±|\Ð!â¯|óñíØð-(Ÿ }O@‰/ IDATV¥ÿ°ut6ìc•h‰á¹"™C!éÄXûP¡Û4GeÖꮉ(\Êë–î'§/ÆO9—?×@n„ÚþéÒ“ç/oß¾é#­hôN€0ˆ2¬ v5Y+rNO_èa)ŸòMê`Zxå2óîèy¡Õì¦G2j”  9ú©ËÑk 'Äg®‚ˆ1gºÆd…ˤ੷ ùèçÏŸš »Ûžñ–ô1³×PÑfß•Ñóî;io>M»ä¤™aÿe;¿Í”†¶I;+&_ø½õŽ·£í{/É EñNëÄâH¯á€”í(Œ´´÷°ÐØ2PÃvÒêÒ¡ÎJÔeñë?üÃ/Žoÿð÷~´—«æI„'Æ*U‘¼À±å$1Ô̆ÆHõ“óÕ£ Û­^Õõf¤¨E‘GfJçA f~ÖvÈIc¹¬I³Ú‘Žº‚³ŒBu•ä½ ¶IæÕé ü¡;-h!BO£=æ=¤|ÈcøŒeË\n§ëÖòq2Øe„k᪗¨OJÍ$Ôui(ü뀇jO§×Šp4ŒW(Á„VlÅO,aXºiÅpt'´$@TX&€¼ZJøº"Ôe}´ù „öÓF®Àëiº‹¦VM«¸üd ž ÎhL!f"ôâùV§Ûbhòµ6¨]¥DÔªt)æ¢2%´y(ÁM+ŸYGŽø/§Q„sw{ùŽGém! =@°*Q;¼DŸZG ›ÌT4¾ƒ0ܪ!ú?MÃ>[H‘,Ìß¾ 8CC±z›^½,ÆS¬´Š ”ª¥˜{6âcž´©— {JH˜ ¸÷ —Ÿ@q/ªë6'P•^upX ë;à TÂi¢Z›p6€„˜ažþÂkƒíŠ@UÉp˜½kæ·ý'Aô¶`ºjX¢´ZôuñÁ"¨ny x*8+ (W¸îf¤DK¬ÂªÈ!(9?¨.=R~fLR}4©Œ©tN-8@Òšê~‚ƒR…ÇP6´BèšÌZÍAß@VKÉìm"„IcÔaâöò_üÅŸC1ä BšÙÊš,Ι µÇàÜvl˜+Z¹}ÉhøCêÊoI.?k÷<! Š7‚Ƙ{$$,¢dLÃØãÕZ¦a°Ê©mHjCÕÕgO{OÅ&>4‚Ô±A [h˜„òÑ3ÃÜU}XiTºb»÷Ùãq^óoªI&« ׯùÞ»8û  XåÄG øGúâw|ÇÉ3®û¹y£˜Ìš½ããpéÍ«3ëVÈüå?ý’\D'øúë_’æ2A׎?â’œäõ@DY6_e‰P@q÷ Eß@¥Û½Ó{=&rÚ%ÇÒ8ùfés)Ÿ®°W–ÏŒ›CrüØÍ†ÚÆ<"6¯QùȤæ0-{³÷J‹dënz|áøîË$T~ú*%:Ä:‘%˜f_8AoysøÕ«>A¯{Xg¡ ®©»~«ñgû-2Ò Æ‚ƒÅ=Â:»nW¼ð-ü¾§Æ'NÅxòôþ÷¾Ôèþ~up «|‡ÃÇKˆV©}„–rF¦~) g;tÌË-@äµ£·¥‹ã†˜*pg@øÛñãûk¯Ù¯ª+¿ÝŒWƒ…íB5-1+È:m>ŒW}Þ¶fߺyã¯ÿß_ÿ§ÿòŸ¯ßh#)¾©‚öà[Ç<8–lßS÷,#)Îy9³m>˜Ï÷ ëyN¦œTq'ñR-íûÀß°¨XS¾‹uàF™YjÈv½®L´´CÔYãİrÚÍmz›áá·¿©Ï´ŸT×8N-=hO%ÔØŸò=Õ(ï® •­æ£ïЋÀ…uQª’]æÚƒµ*œåhK$ðÜ¡Ÿ7w-jÎjI°/wMƒ#SÉ}$®Ñ‘>½™àCõZSú l È æ–NÂxF¡˜&í®!0é­îìÉÓ§µx5G!D&äH3Ñìe—ÿ@‚ (S2x©ÑdT\‰hTzH¬°’ÒJÖÝ}r<ÊÍ¿ýÛ¿u®ŠÍP‘”ϼ•*hø1Ã¥ø«ÇyºKãÕÇåkb8@:¥á‰q[~vãÕ%A[Ž)ywÜã7@à‘助d0€e›šFTŒ!Kow†ØxÝhôÓ…“U÷Á¥™3½Ç„Bãòy[T‘Ýqu"pUðu1'9¶YðôôÌU»Ë%åy$ðo\»ÒÊ}±Â«L ^Pag ôŒ•¬Pl´‰](r×;ReÁ&çYú@…&üài·:×ÊvŽ6fö ˆÊ—ö |! YI[•2Žy¥‘c½÷àœ‰t{§Ãù›ìndíNytt}T«µÅVGõ§˜ 74 lÑê€ï\d†²…ÖñMMqµÁ9"$ü§ÔÏõâÄÇ%Í¥'&ʳ~£-[Zt¢Ïlÿòð[8E³[6…þŽûô÷ó7ÿþþèÒÕ[b ŸÕì‚©¥×fJªSHƒ4® 5Óâu%ެÝï³ñ¶Éid2xÎ <ÎvϾSßMkÃMk%YÐê?œQoÖˆó+¨Ð#î±Y¦ ŸO&õöíóg^<{tãèx¾›L"vLÏ[Ý -‡m¹“aú?¬~Ä–5ãô®Œ7ѳ:¨QhõãêUn«Íãq° мªï ¬ÒRp<e#uL;ÐÕýÌ­R‰5ˆC»Ú¤± å4øg;8ùÐ>”Tïk˜„½f°ËÝ|ç0²ðe”ªyÎ L…QÜÛ%g¯óøb2V|æeï‚@Ë5‹ÚqVÖÙ±3qÆ š®Ú„·zÔÀ,€ºaM *jŠHˆ2~•ÁAŒÿ´· ‹˜^ºh©ÓtëìÅ7\Ñ2{ ™z¦£anÞòù?¯ZpÙØe^¾»œSãÍóYJ*€4“™Tèë_ýJ:8*¤ýëôD8>8gB9R3Û•tŠf©óBuÒP呸2‡À'¬Z½xöôz~ ¦™ƒ'¯:J£¸¶ù¹P¥Õlê›ßügTEïY;WO®a8³ÊH7}é–=F'/̸ !Þ¼;>¨EÆ2Æ=#Õ¬&q“/*ô0ß|ûk~âøVoF#Ö‰w¬»ã·Ï&³ Êá¶]ƒJ´g„^Åf}ɸÔÄÛ§sìû8éújÇsˆx¬²ÙºM’X7E*HåL®7Í_Ž3üä‘1F]‰ƒŸ%/c)†Ó 7×JbK®r>Vf^Àà¡7ð>x¯™€p†Sä8˜ò’qªqñ­­½Gºl£\EÉXDÃׄ°‚½ÊѲDˆÎ)Ü´Cçï²=XÊá²æDÈR[˜|h‹ð—7P µy™¹bCõðü‚ð"´û; 73Xï?Xƒ þJJŒS/¼v¢]×â¬:¢„ Û:žh¢n’³ö íòÔå)øPœao($%HMë’­0ZÑEÕ×_ÿJgöÔ,LÓ_#²‡Ùí×A!ƒœ|æèYºÔ2Ųॴùë_ÿc¿úê+¨h‹½a"¾9£ (ýЄ#IćaëU¼Vé];KCØþƒ ÕŸaút<¢"éÐV¹SÝ}2£§€(…´Ñ̨ߨ177#%Œì%7&h¡,z lTžTÚv{e‚?<£±Ëœ]¿øÕ:¨wKÐ`@:lJ¯–mLŸ<ÁýT4 ´ä¸êª<­P@ë‚¢¥‰^ûí# k¢$ã ÂÕGÄ9K`¤’ÖôZH–ºMð´Óù7¹+­¾¿ák£n$詊Ö]øÙaŠWòx:5þÍœœ‰{~¶Nnti‰’æ*¥]ÒÈ–Ò‰1\ÌÂëå6Õ]ÆíúwcK‚#qôÒ øhþø)MÒãN;ísfå mv[zXê§å¢e,†Kìåi¸ Ý}‘ ò Õf• <Hôª£M»8C¡Çµdÿ!m‘b,Д•»KaT\šåà…L’ç1A>ï /xº¥gCf‘$#{À.žmùâgøÓÖ;S”à+ míjH]š\;͈…'FQ}VDÕõ€¼)„ÏyzÊMkݶ0]:~0åpîîˆ#û¦•„É>uWÉCº†EÈ×äÔá7&í甬“P+J×øtû‰Û¬ÇÜ] -zÐék• å(éŠl†j¸i.®>¥|“SÖîÈDñõwà‰Fµã®-SïZ%´ñ>u_ÒVú‚€cª˜Š¦l1±XÊËÇcL£½§Ož4ˆ˜µKÎQ1œÁ‡×Ìfì‡Çšz ‰Áy"ð)Ä4'­u0a®Jh~ÉMÞ¾sË y¶üâ¿ð…/åÅsh*Žÿd‰3˜Hü’) XvÑ1â"cSMUËòMܘ/F\V@׆5ëšÅ±OÂùòã¥ÙXC‚žÈ\Èá/Vâ!j9†"òÁe4—cMa t/^J7N ]¦;ŒFEÆ«ŠÁÓàªòt›ÁV’ I‘RÚisgÈ}”§×äÌ”Q´ä»s©Žºú7<‡ãû) PBis ½ØpsH0™aq¿]k0yðý¯p„%>MËÛLºê«¶-¢ÑEË%È S£®)cT,5ug`ÙPS+ À X ™¨”ôê}ûÎ]— Bn‰¸× €I0/ž>±ÉãiÅW$ßa?»Ã<¦)ÚÿÁ ¨ŽV­ S8+ô´#ÙlßeRid:°Hƒ P iòA“À@iâèaQ@¦¹º®•—JK²*ÊH»WnpÞŸº± Œ~&zêM><{òØ‹®tµ Åì :W6¢VË´+j¹sVÖÀ4À“MÖ–Š€»/0‡€D"˜ ÅûZ|ðA>”d&ÜZó®Iæ™rºÑúá&àå†ÀìÂe>R»;IF”¹ƒ±Yø¨Ì0ÓL™’µl¼Ñx¤]æÚÝꀊ¤#ßݶÓ*„©þðí«~UÉócm1(iF@\ˆËÓtw+öÔ‡ ² œ0pNc“lK“¨Ñ4™Ž¸!–Í*Öä¢óS®ó'9„íôüNÆQ@1âSlýª¼¬!†M+€}ðŠüC¬êé6 çz5¾¡í­¼”Ù:?áÃlAðWµ>A-$1#*¦oÄ+X}”1S …c8Au¬O¬›.vŸž24 DƒBY¸‘oüçÁ[±êàºìЉk3Þtôôɺ Öõ’ýŸ¿´B¦xFÉiÚ¬X™Òt²s°TUaä]P©Ö`…Bª¤Kûž™ÕW/¡KõµYW4uÓ ³ý–ž´ÐO›RÙÖì‰à«%X­Ú-¨ÊTäãnb™’’É­ í)LÖ‰\yëm¡ŠÅ*J@@:ANZ+¾8hk~\Þ!¥ûÈ}¬ePL}²²RÈy¾h.Œqmb/àû†8Âü·ÜAã$2tLŠ€Ô®Ÿ ôú˜Å6’3š6÷ÑI2÷”® k©K篨¨:Pp¨2C&ô©Ï‹R\ÊÐJ Iø ¦òœZÔ…¡kÅí¾¡:~ŒŠ©"_„d´ÃP‘0lIûÍ´ƒe6ÊsˆÍF|†Us€7ð×yÖ²W&È®ø}%Kð§ô OˆSà&AŽ54FõºOÖô†¿ùªb*@ÔnI[us«Q_A…õm8¤FèW;q áòѤú®•߸B/¿³ÍÙf¯Ö«ªJ›×mE2Eï{Òã7áobÒ}™iµc^ä®{ Ã5Jc’K$Ä%Έ0iÛ/ÒÁDÚL†K»1sâ™Þ?‚L’°Åg¦ôt™b@ŽÙ„›OY ϱg#x‡'E,€Žuщö–kê°]¿“«J(#b jc’™?ui¶«[=L‹S T+a›OÉ]ŒM¬ÙFì’\ut¦oŠt±òÉÈnû×®2HÝ’K£ÌÍ_h¸xí0i¡¡=d/ÙïÝßgèJÒyO?C@ ~1ßVƒ‰™à!·°ùÊàϯÕáC®yÌ7WUzè£+k¬µ)•R`†[%Æ‹F}|Ó;ª{|Úìs*£!ôÖja÷â­±l©Xö­¸LwäGÊ.;eݺo~Uq9)æ‹c©Ævü;Ì7~ƒOÁJÆÒÆŸ;.éQ]h3Õ Õ²9§vÍ«œC{(O£nôJK lmÂPIÖ Ûâ@†l0Ü™eç£bØà!³úiÏ¢…]”†è»÷=´§›º²õ¶-št­ip"V )9™·m´KˆÞ¥@µ˜ˆÇ¤ç{ŒÍ£í-íaf¥™›À.e·€ §QÌdK‡/}õ/µ„Ÿ½Ùãxb5q0O5§õ&ÁÄ }æt'Ÿ°ñ@cÓÆ] «²4Iû©¼»vI ¶M†\Ù€ö¹¤>»»øéµ»‚og™×ìÝ@Dþóç¶@4ˆÒwLÄãä6×^œšè‹¥0Xö.ÚyegÆ ½Cl—Ïd“OÓmyÕñ ³½ÌC–S=}Ðm‘¾ÂÒ¬cYJ ˜éòÖæ fÆx䨃62)1Ò.” T½‚^ÄZú°|? ¤ì“ë†p}º@­#'ÒY<’H•fÿÓ0,wÁ“Ù€«$CƑڔàå³ç´Àò"ÿÉ\äÈ­¯¢ú hœ§| bP½X¹xÔ‚îARIíº$¸–FÜš%r:F·ñ ¿¡MÛ/ÿô§?*ÃÖtbå„ßñpº7­Ù °Óø'µâ£O½…†zÄÙ}E9¦¯ˆÄ&JCðhHLãòbÖ‘¢H¼Qxª?—*c½Å³"\IGÜxC-n¾êò] lG?&Wbþí¶iM#µTZ{àëB¨2(ñœjC{{K}¹*Ì`iÇ&…Ç¥]èI@ÉÁ„¥Kk$Tc…Žo;²r6úé§ka‚¢î€ ½€Ž˜å Ë&8³­ûI¨àÓf™ û)MzSWI4aoj§i lBû6ªÌäfþÑ¢®G.>w[™&ÄEßàó±ƒ`kÅšAyOX‹SÖ Ï”û0,£.º$DUÜ­™ñÝhÖ¯1 G ­G€@d¦= ÍLÊá{œ£Öì¦2Zòˆ%ju×ËÞ<L_s%|àkäHÀF3ꘛij⊥¬h&ùƪ€ Èâ*XéÔ2&ò‰JW½ÓåË÷ÜC¦¨×Þ)C¡¶7Í—9[$ÔùŠøœÚššÍ†˜ÜG£ ‹ˆMŽ"–ßÌ â¼òZwÁÊOú¦k$Æ¢–´G*N‘ú&™Ë=CF ÷çç&a‹èâ±Àä áÔ’JéÑC:” ¼[¾j´ŽŒ àE¯]j-Xâ§¶@c8BR鼪YtÛ2ꡊdb®ZBùO&í:Ðú^’ÄmlB™s2ØFÀyБ»e K¨Æo&ƒ÷÷¾ê$í äÙŒyÕëfÄå?Ñœ¶°EÓh=€†h爥00”ãÑrXBŽZóè§Œ]â~ 0Æ# ðÞ]yæ“÷l0°1eóâŠÉÿä+ýx$á¾0T¦s.Ìáøã|UñWÏ O½&Ó+Ôóü< ŽMfoÎ5‘”¦cîåŽÞhÒ  ¼qSº¿S ôN.568DB_¯QFÔr¥~ÂP»jøKz¤Ž…Æ•]¡&K$¶¨{¹£¨‡{[8:-“z "þ\»rç‹{l.XfÈÙgMjñ²×Ãg7Øô²„N™ù4(  d:˜k„ǨæŽK>$V:Àª«áàçèP})«Iñ¨§G‘úÒœŸ"@À{ô¾Az)8*õb¦ö±™Þ£#Ç7ª‚"-ºÔ‚!šóSË»N9šUL 6Óx&¼›/@”Xe">&JL -ȤT 8Mu@p•P?1J§ .#B%Çí¿~ãÌÊØ†[€ K‚–ɪK³ —±öTÌ¥ 剟t–( â³ö°5i.åÖ‡¯pðÈWJ«]ˆRH̶)¹aHTô^¸Ð¸÷ƒóOŒeMZÉZRr~ß䈈Ä(ÀO“÷&¼}gÌ‚­œž`ÆX ô@-­kE­%Á0~ŠÂG& ;`•tcS 7ñðÑ¢;˜Êdwÿë窜Ê~Épù å¹Ðƒ£´»‡êoì]ýääš3½j«Î³œ¼ÜÁ4 U !¤v,êSGÆ~ú…’ê5êB„$hž„2ÒðÅ–N݉„N¬$F0Êc Ô¯C[E˜+´ ¥pôKææƒ)&ÁnÒãË´µðäF0რ&qù wugÉTD|ꬪs ð1Š¢ š`nÙ‹¾™.¶,4@´ëÞøm’¯€mnÑã˜ÂA˜Q ²9ÏL]-9ú>pôdø¨„Ö©âʉ[‰xÛ‰ÀJ¶…CT^Œ8"8øÏ ¶,¢Â‹dXÍJ?žHÛ0Ê/kwdµž¤)_±Î2nêâüþœž;‡…qòMNª»’Zô€Ý„§ÑÎ SƒÑ¾C²BÑ.6‚9È7t3Û³W¯ïÝï#Êà«ådü™Î¾mL ´#(ဃÃh커Á„Úhj{ IDAT‚¬$‘i}‘1È¥ê \gf6æc&ìÁ„‹¨àÆ+™òO+†³+v"ƒ´küp¢ÈéKâ³w'¬F òi27¶+‘hÛ‘)$­ÛVXZëþqí¤[òuHÇ—{Ëòt&±)º”YÝÛêæÒm9g·ÂRgvacª˜ä9‚ä‰HùÃzÿ&ˆ>‹vS1<1äè>Îa%宯® ê>+Vi©* N|¶ô̤i+8$àSÍ®ÚÊžúÇôèäI™Qz¸L\é{¸‘¦¥ééã§¿úáWÏ^˜;½Ð—{8·¦ Ö!Z’³¡3΢I±R£çž(Ùo§F¤?Ô‘Ú¶îNIP'Óš½ 3µ¶+”pQ˜qA LŽÄ TCü7´æàFQ#ƒûñÎ-»ýÎìóõÄ”°,#=ÁV$éá^Ãjqj£ó¢ i‹ŒQÚÕÛðÏÆ[Ò²>æÃ!šJUÆMhT&V.¤<  (¨f›ƒ|~o©XJA[†hÅ£A>ôçO7Ð0=Ú§w-ª@€D‘ƒS¾Üð軇÷|‰ï˜oÑ2jˆþE|c;7¥wÌT½&#nÐcù¼£~8X¯Ï“Ç8á0“—ðàâà¾!G0ñô9#=ÈaÎ'«u‚À:Ç ËÍ”‰]Sªžq)Õœã¥áBU´kòÁð«_ÈÍÇ?Ï>,P1—æógOà3Í% ê;]þ¼Y• å5á û¥z^<Á6uY=%äÇΑÑA·Ü9ˆ½ À{ë¢Ã‡[DCà fki³ÝÒ7O8%p"ܲàHÛdÄ<Ã|ói¤Ó¹Ç|¨Ì}QEi¸ÒSÐÕ ú53lÇe²»Â.¨BCBì© n&2×Ð$üäe4‘6/·ªUæ|Èñ‹ÀIS>*Ôi*Ý q,êØŠ“âQö n¼ógÕ…b5ÕßœYm´õ¾‘VŠž±z蹿ѺvB5ŒHº–.íâv{°­x*KI¥Û2•7áfµ{E…yáfÓÙÎŽÒP‘]]¯M 3¼õ@ éU¼s1Üåðæ5¾g‡Q,…ƽn­ÉŒµ«ìpùð4†ÅûT- ¡’›#ÍÂÌctZ^Q” L™•/ÞÛ* "”1?È^y£ù¸2Ê£vÛ ½éB;]‚¡ Žûc?ªCÇ#À Za݃¥‰m×O–tw¦7ÜåØ¿± 0 [Úî;M¥¼‰“y”´)ðJÓ«^Aöøœv`¡C ËÆÅð!¼Ñ†¨VÀ½ÅƒˆclÉœSA54§ŠÐmâ3¿ AÔR]¢6]ß ó³ð˜¾PžÑjb9?cÎyõ´É¥ }ªü…IÕ<ÀJMõ)´¹@ÆÔ˜oª¥Å™>1ÍbOººÔPuúŠ|ô¥YÓfÒ鈬‚×ܯæÍF¯Ø˜9p¾4RpC”Ǽy< µ©ŽQ°à2T¨NmLgwü^§F¥]šËO·¨žÒÈÔ·hXfúàôås®Ž3ô²¥5{½—zÓÞqc`Ze6‡31‘iPwÑÖV]kþ¨PEBsˆõǤ+4†9ÿ®÷ H]þÙŸþ‰\°Î9˜WŦÞùžè,éÃï›”ë=£“ôÛÇ)û2ÉÑ­Çä¯5!¢%pUh¡&AÀ—^Á ùŒ‰Vì’Î)C´×³'1¦>¨x­–˜ÍW÷ú\ zÖÎñçÂrÙÊ ds ½›ýªÉ#ù3+¨VÜÔ¥Oj'E$¸x MïÈjœ ïŠÖ95‡QÙÚR¨ä"¤éÃÚÈÂþ }™SǾ¦ð†œu< ñWTË´1±LèAåÐ{û{sŽz>ŠŒ6´p¾Œþ½PfG×™·T.XA#°¿0s-šÃdó¦9A¶¥¨¢ªùT9jÏH¡Ø^0Dó¡?Þ¹qL0çÕž·eÄ&Œ&¥³‘‰¥ê æØïT*[Õ5$RRLÚÔà”÷v_(Â;#Œ†ç Òv‹Î½6”< a!Ác 0¡Gh"¸ DEá»æ„šêHk¹ÿñ1XeBb’é3. þ83FÝ–SÜß©å„ëÀj`!àƒÉ3æ>ÌY÷¹ü>´)@p&®ÕŠ2x¥!p Ô–äzˆ\ð¶U˼‰§° „ä+LÑEe掺å"µªÿI' /д”SOFÀs²@sÍuâe‚¼L6úüé3•¨­©æ‹—  ÈP$ ®]øè&Ó¿u5õ@YF÷é‰pEÔ8.n£–pðsú†DŒÌê˜ HnĤ{KÛMçhTE$»ÐÞÜp;´xÅÂhhðMlÇ"ü•Q´©´1Á÷4±­,þW‚=·E80V¯,ß&™Hkî3;ÕóaœŸ$ SìSH·1üڅ΀e˜v†Å¥”$µoF0‡©—> sщpX¢<õsi„6K‘# +?XÌÌöôžÿÆHŒä0–Õ¨b.g-¼k¬’h´@±šÆóBh’ÎÌÌEG}ÚªÕä,ÔPs™»b±âê¥;^‘žI—º­+N®¹Y_Ûh¶ÞDÓ«ŠtAÚ°=¨Ð5/T8©«üÖ…óŒ>KZNÀ¤ßë7¦ði2å\݃¿‘¤½rÌýã-?Ì€vNdð8ܦ‡µˆ¡ 9„ÎèàHÍQïë½K¨|£q/1õ\‡ñê\'[ÛÕú*¬L\Øÿ&Õ¶ŸP4$C¤s !rƒHƒ3¡¬ž¥uØzó'ðX¯òòäy7AôÏN^ÐZÑ‚†Àq"´7Nœ2 iqSBõcG$‡ºë¤žæ¼ /¶¿1SÌ-éáД\ÓQG…%ŸkræÐÞ:°‡eóg"¡ÞWˆ^ÜðñÜâùO‚ÙWŽz´¼ªo¹rtS£ÛjR€€b•:Çì:«Ñãáå°Ï‡î³Tň3‡—·"†5`>ƒTxˆ­FhLÁf©öο3„0kС <éû³Ws:³7æ  ­ ÎÄÌ8)J'_M¸ ðœ-ëµH»žy:_«íƒ—žL÷pqwbBë›l¾½¦Ž r EÇm œî´xû†œÀj%g20AU£F‚>¿õ½°”À £1•ò09ñ ú§ƒó¢µàoÝL¿ñ±îP¿ÞÒ²òx"só•i@ íÖÇ·¨OxŸ°Ù'tWpFŽ–Õ€‘UžB‚º‚²gúìeuòÈ}Ž;þÈ#¤ÊÛð•pºÝœÎB4ˆ­‚K•>½ÕÀ°wM $á_µ£Þ¹ð§3 Ì ò&3ÒÕ2)ª¼¶W>õñŠídmãȧk…š•£é4ƒ!Záj‘ÖåÎx1­ïpBŽÙXÐ@™ ˜gÅAÕæ‹f¸§£Ñ–¹­ÑÐü/‘õÛ÷m‘¼väàÓ:!f±‰wŽ•g8q˜Øs‚WÇíW¹.¡ Pˆô\c»,)m»D…ïxnY“¹èjß[k 8Ï€eï«?¦Kf‡‡J\@¯ã ®¤sØ[&±|`e~ ÊñBg§¯¸C1)G#zhql挧FÖ aDê'Ì‹Éè½YÃ$‚èmÕ gí€Åœ÷vb9ÌÆ§Á ž a¾Ÿ²fÍf첑޴‚#a™ -LàªG8ÎÆI¡Iƒê„ÐàØ4­¤:Ê|ø%¸%…±V$ËZ ÎXÖ¿ÂÅßûÞ“§.àˆ pɨ-T@—,9y„zЪ‚©„ÓDñ†¿|h:P§‘kcÒ| 1kí5®ÉŽL"V:‰:d \/tzö‚àÒiiBŸz<ß`ªƒU+†9.höÀÚJÄ(ÚöþîÃógÏ£¯°p£‰1õnÙSE+iz–Œ+§Á‹0)õpØÐ.^t0kP<î’yN…a;^Ì¢;¦‡À‹âøC{À]•œ0ÝàN Ï4©# óºäঌZ®“žÝëñ8ß®òís½‘=ûZoî“L©PÓ(úL{ÿuEÑdM9•>4bõûO}YU Ï6 ºtúêY‚=´Tc¯ÞïcÈ„ì{5'¶ÛŽÇCøÈ&À}寸wÝ'^¡+t ‹ç?ºîäI!y'¯%éÛଦÌ#‰é ":“ÝÓ×§§;õ…'?¾}ÇÖµ“ÓW ÊmÀòÒOÝ5»Ãó¾=ë¥B˜ä2SÀÌS½89¶šØÔQB^a&d(¨~ =–wÚ·4±¯>×QÀ8ÃRL4¾í4졆£{9@ò›®¯‰O±äûòÅKÓùoœ­÷êÕõkG¼?Ï–ÿûôéÑw¿ñBÅÊ`smudœ¥y•ðÕÿ¦¹/_Ôxüè±w4ýìñcá–‰XOum&qÚbVÀê:ØYëðÔ9y©QÂø|…'¢údÞ O0œGå$µƒ;:A]!IÒƒ±³6u!Ù=ežCÂÅvì‹ùøkó 3±4`ê#V¦¡4†Œv82MrëÄÊ8…{*ž_¾äØEïð^½~ ~<ŒX˜,…aøÄF%8:Ëòa«ÁqÅ6Û ª3ÙIò$ÈÙ2Ä–IŠ8Uì“ ø²ìèòÿñÂÆþ~Q¬™HÄ=2ï¤ ¼6xÆb1Ñ‘DÂ&åõ]XɉÀ è‘p5ˆ‡ù@U>GðI×Õ&2¸¢JÕWï“3×EŽÂ´4lV̪î|hï I¡_ S]`%dd2á&­ñ¨‘_—ÑS(yyãÁ=UÝO¬×Ðøˆ–7*x§¨”_˜U<%DÊ9ù8Ë®›éÓ–•GyM ŸÒ]|Ȧ†&.V`I^<ÅÎñ\Å…I/™Åp\UÆ…ÙS&O§.îó™õHª°Ú&—¹Å$\¢Â5ëãOCÛÄJz)©Á  •BÜÁÖ+ÈÜ9Ñb9âÚì³ ’‚"hÈDzCÏpJ$%G ý¤C(z¤V™ý߈gðI"QQˆPœ@ Æ3.HM|c ׸`àduÒªÀ-¸±Èçg÷:µÔ°®©ž†ò°pUw-Õ ¹9ï¤tSYŸn㤟‰hRÛb¨Æ™%*…‡†’#»Lz6DgdK™îæI‰C™sÑXäXˆ˜¬¥.æ R“,ˆ_[)^ìžMôÍÀõÚ\â¥2Çâ v‘QKþމÝO¨ëÎ!Rn…ñJؤ]¦Æ(ìØP¥v§3@”·ËÏ…¦Ê>ÅUT¸êmÎ/áã>(í¼WIÏåSèóYÜCŽüìÌ2(à’Îâ:áÀÒõ !·wÞÇ®4mlv‚›&c®dz6a„V&~¡¡‡rdÆÏGí“0—Fµˆ¾[÷–~R3% Š.-N%ƒÐ$µ£óÔÆOW­O¬À'eÏ;hlÚÕ1›&¶M9CgV=µYnM©å»Gzd•?Fíc³13<ß} C6f1sx^Ås­XU™ÓDr^&ºH“ÒšP&Ë"émKN*tÉMeBï¢ØàRŘ1ÊuÕ(` úJNƒ(MVÉqP%.M³_þnÒª07iÕyÑRÐþtÍ7ê¼)‰CÌ'ríû0–À¾úÚ©˜¢jBÚ¥9øS‹†fhÀïkYé!…€Þ Üë“Ò4\‰"~ÁpK1.Î ‚’jƒÏEvÕ°±¸'õ>5:6Ó¹£C©ü¢¿™ýå €Â=Å&®J[Ê5HƒNìþâ+…4¦šM¨IetO¾&°…d¡~˜ë½>E Rçj(0ZACÄ„Wc_½ì ikxÓ©¢F»e pàì´Wjƒan@¼8ïÖÀ`uc°mƒ„ÒkÝ€I5+/íNºKƒ&±D2]¨¹@’È &_b0ïE¸¿‹pµ'¡§Û|cW…‰L¸a{Ê2…7Û\”‚Ÿê.·ÎÒÓ±éYfJ…Ò(z£Ö^*‚ ‚ŸÃ1"ÌaÔ‚Mvólö–ƒ¾B4Ð r–ÃÛ®GK°žnʧå鮡 o¨ÌѼ´"a2HC |ÆÄ¡ŠÊ’”ü ¥ñ=,B™¬ãA3"ùe©|ã! !f{:JÇ%\§Ká©®òËŠbØZ´p“øhøR9í›osÔ•Ç7¾¼hde"Ju¢j. ]’¨¨âî”XKZ¡ Ì %Μj73"~€ÁËðžÊ YBu—aÃsØ×yô²f·™§èÀ m%²£Q£EÒ8Oi‰Z”ƒV§®î~ŽÃ¿jîºfhüv´qxÝ_ož/ò;å†L¶˜ÜÏÛíé,÷ó¢“sÒИ5ø¸S ±šh'±19%Ñ•cæÃÔW“N­ºF AÃTQWa±È”£u\Mu¦ç£þ†œzú8Î{ ÃÉÜÄ+Âàf2ÀK¨>“<•VñÎíãÓW-Ð@€:db9É4pÚÂ÷RRWŒ ;ì¡¥R³”f”Üfül¼Z£{¦i¯_mgà¨vÍ ]séÙ9±*jAœ… rÖB•!Y$ähÈ‹ëôDtçµ2­phÌcÂ{.&ìs¹C«‡Œ×¢lü\œi/F*9ù‡±D^f>Û›zGHãLâ!Žç™Ï(&9§1?`¸ÔAXù½/Ó.ê=]ÒͱJ2šþOòS¸¹(—Wš°„WÛQ/Óô­œA>ækš¸%ø Å´¸b—kÒÇ,Z>$ÌQKX g³K—Õ6Zn|˜m»ÚGièËEŽ“6©PqÃØBš3ÂZKLÓ†žÜ >'DàÓT´(Ì”D¾K\,‡ÍñÔ­y¡áÅàMLÔÍk¥оÕA¶bžw{g8oi¸6Õ¦ñ„î¹*~*±1óAfpƒx-º÷s.ì&@(ACóîjnðÆ‘YÚë|luXØt^>Q”ߨÿª÷ÚÌ™ñL#‚úJü‡¼¦Ï'Ï9 Až×Ôà6{ohévĦëì”Aa,“À"¬¨þ¬ç2íIãžL(ƒƒ‡£&YGv;Šm×v0RÖ´œYÁ©›\Æx5ʵ*,sÙ¢<‚×2ýd¾|Wt‡}ÓeA2ýX%plˆñ®‰8R´*ugªàÕR”]­¦$7?Æ™™åräø~þó‰Oì–½Ét¨š’Äe²À—»Þ¿9ÑÝpIü»7¢—*1Õ@ +j¢ pîÂ3¡>®¯ÎB‹½´P÷sxå¨vWLREs›Z+FxF9TTj¡‡ã•_ÞîQ@Z_{ ^“±ŠÀ· y øÜŸú þ¢ 2äÕ’PD©îBÊr¨ÅV*ìxUXñu¹Ñ|„û'rÎó³òEäÈ6˜^EvÕ¹gwUpoö¿Ò•_hîÛ^IÀÕÀ*çg¨GÃægØšm‘]P«iÓ'ã=ùH]=ª»‡Öhö&p "¦U­{1wëeL½9© =›ð¸ì%y_EØáf²¦ˆH7&ä‰ÂËÏæSù¡"ç•ÜSßám×5z˜¥Sxµ ÌK/š¾åm[¥†üé뜳uáÃé+_Ýê€>8/ÚÚ&0jÙ"·È®Pa…” )›êäª3nvBTxª·]ú‚/UÓLšrëØP¸°£HI3Na/Kåä—ƒ£äTWf}xÃ=á½â–F…D¬ŸOÚ¸!ŒRK9~šŠÇ(™Šj-Õ.ÈúJŇœ”Xª¼º˜Pá âÝå(L“+3û“‚7"S^&îXÒ;-¬GïØdÏtà ֹitp>DðÄXÍI¸èsÌâ.ØKBˆmÂ:Ww±òÛbMHÛ¨ ¹×ŠXûí·ÜœÅ‚=¯õ‘˲…õqÁ¥±`æ–lÍ]‹ãðêóš ì¡±oóouqdäœ@ú8Öˆi‹mw ŸÐë%¾æ(Ï8e®cmP ÓÛ¬G]‰åx*=3|%h ‰(ƒ Ñ®n,ÈÃÐ_‹ Mg-ÙcW©A\ÎØ4¬°ù¦ÎØ>Þ*Ù@½vu"ù% BòàFX %”rŸD8M‡Xj9nMɵ¡W‡q)¿wZ±„«B ëqt´WÉ‘T!‹¬¡ÇjtxµTîT‹.åRÒ’ °àª®$dè2€É–Ô¢’¬Y_àègv¡Š|?I_Õ3ÙóQ¢œmÂ]™ZÍosû  (#pS\Ò³$ÝPy*fzšÓ–pWWYÐ1¬PFPbÆ1ßä4ÄèÔâØüš@j¶OÉGÝÜçSUÿ<®C>´³AúÞ†>2»¬DçjÝèlR¡†yztÚ0…§·üÕH0޹,MÙ\#?&gWg ‚äÓ>ìëŠ:+ƒ}±—ÔyúòTH+_0ÇI}Š|¨ðcZ2V…’ ‚ŸWÍÕo[ËI¬CÂ+‚ž >JÊÄR~ÒÞ5ÙX±V°ÒQÆSù[—™ËŸ2­§Er›ÕÚ-3P[ZfHØ×%BfƒK™±q:DÀcìH|1œ…¯¼†å(¢:4¢g^ÓO"H{Æ”ü¼ü'ÿó¿Ã@iÔ«Ú:D,e¾zñôá7¿|õòñÙ‹gmáXmàh.Dül É­hï<æå¦V‡€˜+‰ «èvt.\5"–›xïçæ0"åqö3w,]‡ ›b-á{«+½éÍövÂÆ 6§]OŒ`M+¬z? T%Kï¤eâŠÒe,·¥ÌS-:rÃS—GZ—¹&Ç!šíçÑ&!ªÛ½b9 %µ¾äk"ýšK&ø hNI1q“Ø $`]á}îqHø&ca¬¯ìX **œ]½,'?&½…cÏâãþ&Ʋy?¡§iÈl1 ß æJ`fs/×Ù+‰"bE4l-2sÔjÝš¢c¹˜c§P~CÃ-¯w%ŽÏUbu!ܽQôÈBRE ¹ØÊN%ŠsÙÈÊ";Êç>v‹âúl¬þdj÷̈KE䃉 ÷áUr_þo¦ä«Å"•—ðX·´2ºgÔ×rpÇ£7y=õn [Ô):‹Aî ¨ž»„G¤‡'ˆ"RÔîØe¢>gò>¾ÖV¡Æ/Wm8mªLEØ‚7Tï’¯áÑ`;#¢–Þä ùs—Ä/h7?®è\Ì{Iàè0–pÊlã|'oáRþ âªÀ‚eAÀJæû¾=|0‘)½4jÇWÅ » szü—†íRçç xà›ôPÌfNª:Ë=÷¾øËÕ¢“ IDAT‚xøžÓ7ᄌw¿°BøCë°ª½•39Š$ ‹ckYÐÄÍ OXrÇù€/hƒŠÝ99ãïž?æý‹G`aµÂ{„òÖb©Í"/O<]b#ø.¹2÷çJMy(©©ïww¾0e5HuMfŒV˜/×FRGÚ4‘ÇÈ"9Š´ÿ³º*¯Öˆ.ma~•)»kŠáZŽS©=iÆ>´tMQLM@ü‘lÕ·émq@)¸…§|ŽŽÊ†°xÂD­½À‘SÝ‘¾"1jÒ±Weˆbä]+J›X/™h,:Ÿ/­à-ž·§­Õ´+^Â. îãê6ª ü(Ãþ´Ó(>0Û"ÂÒ;– Ê£äÐ(w–ói/TýÆ ÆÉÆ)Jã¡NÁö‹/uÆÿŸª;íÑ,Éû^û–YU]Ý== i¤E²`@öÃoüBþ 2aqÈј3úFü(† W"akL g†#ÏÖ]û–™µú÷?çÉìÖíì§âÆ=qö8q"nÜ{Ñ20á„÷j?8E•#–ÉŸ5h$Î`²>‚ 6NÆ(i«ÚêÍ”LRdñ›Žçf½=¦:¯tN.8æ„hû6û“ãu”Ú¢f·TZ&/"­ž19ÆUkÍÕ"•Ö¦,'ß°Ü/²î$ Zeïyk,e-èر}DóH¯x`Óʧ™È¢k°¨û\!sçRÝ]؈`àÄ9ÞTSXl(‚Q~QEóm¥x˜­¶Å0O¸SõHêjm$¢Û¹17) ro«„Ç£Uƒ‚¥ei+,Æ8MàÄÿRœB°CôÐeTRcL:D޽̠k“û_ÙhÆ€ª¶—ÑHâ½ÒkÎ^=}ùäÑÉ«—6ÜQL^¯ßè ‡š 9ÝaTÏÄÛ Ù(«6°AŽÌ‰w-ªÈEØ,Þâ˜%”LétkØÅHì*”îL‚φø6@N˜&g=[Rº аʮ1²K¦ë72ú.éx*ÀIw.A55˜¡Í¹Í5ï÷ÚS ' æ««q¿ŒII М×O;¶ß&´„TÈŽ¢‚‰D•5´7T]Üø›ë~h[tcïyÇ¡í6ÃL|躃ҕÖñ´Jzs&<ÕÁ°ÐjÎdàu–ÃUˆJ¤, :Å_7X>È3úp$»¡;$ +H¸Äµê¹W‰”`£H4Ú.˜A^Í]¡e0ذiÔÉtÎ 12ft€ö̈9C%g! Ù[ò™!¡î>6ú¦0“9È5‡ ¤*‚ƒï«¹Ú 1ú£¡µ~мQoCa gÓÖ¯y$ÈiúÑ—Vq¡^ži*‰„ìÔ‡kZâ„f]åRÞµÇ 8ð7Ä\´VŸÂÕ0VÙk}ã‚èð9wú]HüÎæ03sÒ÷ ­Õ$Žàé)r³u?(Õ¬Å˾0mÐÒä(D ¢ pOÉ–Ã?_ñÂ6'‡ BeP¨Œ\iÏ©æ Ðn49ðˆÖ^ÎqÂÃy=ލðh¥l½¦‰ölxŸI´Á˜ñmæòøÑW¶mß:¶éöîçú/»uxr>m6Áï­ÊH°£&ì²0¬/ÖP/ÚÚO- ¨9I [ >ÄSðqÛÃÍžZ ÂöÚkek®:u(ª5ºSfÃlùÉmr¼ña:$RlÏÄ`  ®+9°’7ÃÖ3 M]u‡Ò”P=T*Á;RÇÇ,R‹a¥^›œ!%§JÍ™D-‰–[˜]EkÑjDºôøÀa1uP’`w’\_U¤ðÅyZªvêXæY0œCŽaóÉ)Çe=zÜiÕ+ÎïjŒ¢ÌâÔô‹GÃNhzŸîÆ™=ˆ•!Y‚ù7Ògoú†)L”¨Ÿz‚¤ |K¿m?Û¢€f}©LqÖ5²£‰®©,þ&n¨Ø¨hÕ€ÚyWS‰Cž¬•òQ?I¥\$âPd?ë@)Ë¡•³q±’Ò=Íg”Èš€Ü3äÝ¡r(ƶ^£LÒt:®žq'¿N¸¸Ìù‡ø4N&×o{*r²ía³žÞî4r®¼ôØ«!…ÊxKc –.Æ<¨ã W‡8¬wøo䨯]ýwó”PÕ`öxb¤ïß½~òø‘wF<øäÞñÑ=r\½~ûÁƒOûz|‡oa–°—G϶kþßs_`x’‰÷úH†éE®Û¯y†Î#o–²ZlÀ xǨ•¨|¦;ôœS_â‘õºÒçà ºw5‡&’oŸ‡ ðX„SÉÒýX´ñ4Y€QAÜÀrñPÓ”<DdõÖÄœ*¸é{ˆ¤z”/²Þf "˜¶ ?HFÅÆ"]Ãå.)ù WÀƒc™©yqé0بt,Ø<¦T0ëú]*¤+*Ë6.!MjÃ*‰æi©Øh´@ 0äMÁgňC@åPïBÈ©«ò‚4íˆ,õÿo5Ìi`Ÿ-fJ=V­ÑÐuMî¯rܾûÖˆe£yR«¦W¢CyßÈÅ©Š\šGæZêV!•9’Økà¡H!€j|C©¨ÜÔq¥j¶4C‹°=ÔܺaêÖWZ!äu‚ìÖrÁ" ŒÕnµôêvîá£ôó™dH$‚'6Ê8¥ËWس‚åÇüÁîëA¨äí3ÑYÒÔKltM[•Ea4𯼶ЄU—ɲŒÙ; •ÑÃŒí‰Tb $¢âœÔð(ܾyKï ³yöXœ":-~æ9´æ×¸šêÆ÷POç@|ŠÄ†Ù’Âb„N¥Äú/ÛwÀ”~˜”ÃÚ·›€in³­É+`VœÂ"W°©c†*¨ø6£pSùvq]À¯¢b‰Þge‘´œ$',žsÝ–«á%-ÇÛk~ùO?ÿoþäÏcr&¾ÀDvmEóybWPiYN=Ñ¿þ^²¥qS互3®DE«‡Ø ƒOZáVÜ\ýxPtZÌwÆt\ã³aø5ÁðÊBQú‹J8µ…gGHø§«ˆ!Ñ»5IMÏ:,J(±R§1d¦¾Îèâj $K¼c0øì`l/íÕé=àÃú åwj¦Îæ†NÕÊZ“ÐÐ_õ)°~xH‘y zt9ÿ(¼ø£fÂЀ_Üúͬs  °‡)0 ÌváW{XÉY´Szs)ZÍ,ÚX&k€ÖkYLÆäós÷¼T ˜V:² ÍiÕ’ ¯uFºHG”c—9ÒÑ—äP:Ú†;ÃVêãydÑ/Hä@Bó\¨û²Q÷ g=Ì$ “+W¼mI…m¦t Žf$¸Vxro¼Ì£»HŽŠJw!C€B¨MS–Æ[½kZ\ɇ•Œ¢ Jž±ê„a= Ë5=4’µÔ”ÚÇ¢(¢… KVš‹ZN¹„‹T¨K‰Úz›#ü€e!8IŒY4EÝZ,6`FÈ©"ÓÌŠ™¸–FÞ™ ¦•:„F¿€–VXe‡òöt…Š]ú™ÑelÔOë‚ñ^¢ìT“”Éþó¢czÃÉÔ7ÝuÚåm’ÂC%@®ÇªQn«Y®R"èPÉL`×:8sÊUeÿC¨©ÌLDŠ™WðWÿÆÍ—º>[™ü/ìØ½f; †îÞ¹í]C.Z­¸yûÞ5÷w[ ½Ášø0¢$,*Y¨–L!L$5¥V%̹˛3–Sv‰ñJ<£ž/)8wꀟââÒ0?*P6Çöå8WY.{L8~õúÕgŸ}Ö{&›qÎ< 2Üð0öhÙ¥æO|ˆZC§q¤ßªf½GªK‰Hx_˜øë‚gl™ì„õ»5º8 |è98åj‰¼ê]-ù Á §Ç"Ÿ€k¡ï5i3F¤áìÃè‚f¦ã¸„j&MØ‚ˆúñ }šqć/.áa˜ª/Á41%”þPᬄâ>Ë Hý¼¡ÝëæQ:f[fÐDw5~ñr§á'`†Z8¡ÄHXv,G9lñÎÑèüî“£jæQS2¢Z­1 ÝžyyFö&¹ÚÜÑÆšÅ\Ã9œVzQÏ|cR`$Mò‹Ü´NÄ?}š£mæ¨ )Ò¬Æ19Ÿ¼¡Aíúµç/ž»U‡uÀëÕšl'b>\`Mˆ%'‹Ê|Ô…ƒ%MZ‡z)àÁ®Ê[s”iT+R{¯Ì¬S”:ãÄïx¯F¼±aÆÑÉä x“;ðŒ*g8qiff,·ïþ`ü ¨‰ "?c ¼£Y~7ûðf»0§äYW‚€G´\ÍXóì'l㺭V±u¾Zl#ˆ$Ös# ¬Rín¼Â I4æ!¬ß %Âtðá:n­àê5ìEtòéƒâÙßýÝüçÿÿ|úôÉ’çûÅPªJ×#! ³CˆK+p&FH9ö<¿˜T=¡µ7†ð+âX·)˜âjÅôÜ>œx÷ •†ä£§hFä&q?•ªÙŽæÔx.}Ü;¶Œ{Ô͵xóöT§2öS£þ“k"v`U[Ñn¸–xîè×<>c9&Ög ;ÿ‰nÓòpjèoUŸÝ‚M¹BþÀЈÐAð‘}îÄ©]­M‚ÅŽd ]뺳ubbm’ÚwúÛÙ©­Õ7Þ½ñv{gga¨90@ÆÀ$‘›Ñ@Ñ鎣ör\ä°€y‡‘€ãáW¿¹w÷ÞƒOú’Kš eÞžÞºÙ ßq{ûÆ›Sc*­QÈcg晓|.æQ»T„ ×äB° *i2nß{Õ­/í^±³NŽU–ßÓQþö]ómØÈ臕-ð«¯~'ÐõlËy/={þ\ךèŽTY—د.@Ò(uûÄ\HjõüÙó¨O¤ ÑíC%¥¥Ç6ˆZ”óÕW_Ú?S÷‘høÑ›3¯Ó$ȂƵ–L ¶/[c WqåС6*ŽÐݦ¤ºâ?n2«>b«ѰÓS6Mª;R6t3îÀ³3Ÿ†’96Üѳ›˜p"·úÑ ZµõÓ^õçŽêº†*!÷‹"Äšïåj³` @e–mãWaÍÙ°êzFÆz¢©ÁL퇺&œ¹„ ­@¦ ï šSpªÞÕU¬|MΟDfDV¸ú—ýC/·ð&‘;ãúø×«Ko¼aØ EÝ'ð‘÷¾†tõÖµË×mÊùlú¦·‰¼wÌ*¬#ð>‹òàŽ9ÌäŒaVqxG"YrÐ ÜõËç ½ )0Îê%ÕI€±NZ*Æ"œr\;ëZ múxëÌGX· ï%[± ¾¬d—ê!¬KW{À¼ŸºÔÊ>KtíS±ÃÍM›`L ¿œ^wíÔ¢š!Ù’ƒ¯±ö¢Žr£2Çcø¥h5Øsßy܉øÍÞbÝ¡w6‡FtÀHqð'ñË«—§YnÝ‘Z¶±ýÖ‹Ï9Š)k$¦ûúuƒk6›f³yzΚÈûüµÝ-‹ žˆæŒü×ìÇŠ°iº9I~oìï…®³ú ”@¢ÏnK@'µ2Œ5S=ü M°ô‹ÙI­cÎÛ’8;lÁxrþÝÙ³çO §ú”h0ùµÐRÐÞœÔ,S 4·X€3‘ö’ÓNƒ 0L™dÓÞ¤’~1ì îÜéÅLƒIc‡çË[Ñ´œÙC³=Ɉ°œJPë½@—®y½-…X ·NæuBC¨­Í¶OŶn9AKtI·ž«1ªêV¶E™¶ŠÈD±É‚ ¨ïÝ¡öBo]™gQ?¼­$ý÷ïz3–…ý·×nïyƤh%¾z¯ýÕÔèmaN\3Žêõ½¹~ÖAR‘¸<ïX´ºnéÞërZ|õDb¡Õú‡3ÞpþFÁ1z*¢(QÆ/Ÿ{õò•Î +åºôé=¥ôÉĉÙ~ÿKÍM¨z}”Ä´ éylï8à“ÊMøq(Õ`zëdfH`ixP¡j!Tö !ÍPãܘxgÍÌÎh5x'%mùQ¶´©3$€œÃõ¢—›™Àõ^-ºY&m8˜{€¥SÞ¶Åpøi)TT0,ÓmSz]Æk…Âwoþñ'?ùãögÂ4ú qÈ_m÷NîÍäb/ 0Y©6õΣ»7cŽüT¸ÑœÞ%£/–¹#žœºÜøêL6û° y¸–ýþ ºŸüÀÂùì«R[lËÖ¼zÂÂ.ó´¦Zšlïˆö\Ìg|Æ{Q»,—J¿ãö6Óþ†*ëÄr=ŠKî²f‚'g¥Ƙäµü½ŒÉb¥I¨ E: ˆíy]qEú'¯²?d6ú's¼WŸ~^×N· 銢Xb"^)ŽJZ2KO[ÌŠ«ÜK<Â,=ì=Ç'ÙqnèÏÛò±"joP,ÎäÿüqKª¢ÜP)ƒ#7˜I•¸·ƒ6€Ú[© òüùz¯o¼âÍ)W¯Ý¢W¦‘ˆˆicŸ¼Â©ÝéO?¶÷’—,ò Ìêþ:pwÖfR íÛŽói¬#ڞΈq¯ö"½å ÝQv£*4c¤T|~¸Œô,¾®–XÐÑ3ݬK™°ÀÏ ØÓ• ¯b¡aÙv ñõØ«ÝìdõAˆ‚"ƒ¾£Sïr·eÛPÆš1´°WÉ€wÛ·s{¶@âU¯ž?÷å{cyñĪEdš´_ÖÛÅô² 4lšÄ^k57”îßÿdì¶Yl}ZWr•PB}€rz‰—Þœíõ¼öO/aN’Be¢È•ºÃ¨ãM@½¬©-ã™–·°pÙJÝÌãbOtYy`îeiÇ}ªV9“(hæÏ“›¼NŽg\PCZq‰ÆÐ¶@ÌKïºÙ¨'ãÍ».étä-Œß™µ@`Þ[|™÷‡Á°ÚàƒÀÖòïÔ%}“E_oÄÚùOã/ìEn3g»DÕm’)ËŸîà—¢®þøÇÓòŸ}îÜÆ†µ»w9˜;#"‘A«»6ÂY⎂åòFo'±8«,ªO¢.6ÔÏ­„Õ¨&úÔ Ì%øHJp"ì Ø«q`‹yñ›u~n’Šã¾úw^øÆ¹(N’K™aš~É3aOHA‹=§“¿ú¬B!QJ8 %¹Ô^]$ʘÙ_0 ›áÒöœ Þ4Î"¤h6h†´£ØÀ+Pš«pj9ªI+CN·:œF+W5\à—(Î>´"7…bb‰Óœ‚t\\ʯG'ü˜ãÍA?X[îÖ1²]Mf©’lÕò¼æÄó9XW—OÈaØK½CŠHÊVœø˜|»úêô¥‚ˆƒ1n ¶:µæ9´¤÷ 1Hh:8ëãD $¸ÕJìU¦VS´¥¨^o¹nqq2ÅÈÅ’~Ñ-Áæ9þe¨óGÏöõßtNæaUŸð„‡°õðˇ¦E_|ñíYøÉʺè$Ç:Z+txÔ£^:6K•‡„Xž “gh.ÀžË94w°Ê_V9€]¥I¿°éjÂŽ¤aÀvf \eaÖÔ—Áw»JšÑ$0JÕØ–O…te*éÙÆ@!Ê4¯ë : ™‘@H!<}Çpœ¤©ü`êŽs C¶¹ó5ìïÕß$­ÞQ^[ÛÒwxÆI<”tÓM]_Ê$ºYœþÕ/ù»_ýîŸý‹ÿ0Ìx^7ÓÄ©©z¸+ͳË\ˆ6Ï^aÐEƒÑhIY[Œ;µðLÆI€wn?TRšü ¢Ë`’ŽÇ—ò‡YÏ[êÚXsnµä;I‘­r ÇÜ»)ç;–.¨$5ï-#ŒÏ<eÞHè¯ù¶ï0~AlBvÂF¨Iú„mµ­í&ÚŒŠÖ—ö˜*Æ&¥È.0¨œ1¾µm‡S•‹*øæù€VŽÁ¿ ?ÔŒ+µìO‡¶ŽÙ{3: &r~ÓM\qîcj›?M¼u 躪 ÒÚªT¦"b2„åœÙ~wfA¤®gõ*jµææFË´5,=öo]îÒlÃ…ÅfsI%´xÞ_¼éæeÔ³Í$m\g´dƒœ_Ÿ‘úÔk÷s<º3š͘”vèTÈaûzï6kee#à Õ6nž—ôÈ!f_²Œ€MèâáW™üù³§ö]qBt©­™öDÂnúþïm[|>ÜâÂ;«#wçíðO¨“HÈ¡‹…–7öÑVÔŒêð[„›²˜ïC:—”½P¹zþk½“qÀ¨ ø¼ L;c“É@^ä'ßj™ÿpRƒ™þANó€NhÌ+æjÃý„ôp°S¼‘‘iü˜>U"¢ ’Š­žé”KÞ¥ööÌ;ãnsD¡UH{ þ8âˆ3N]ÂŒc™7üåÀÁ§K¥1Ód'«,ôr~åÎÈI±G"öF²lóþ–wξ;½þñí_v¾ 5—¿töêí­#S ¾½+Ïæ /¶ÅÃ*†•CÄ̈…$óP1t¾,¯É…¯ÔÙÈóA8z÷þõÌþI‹‡Ñ7mÂC‘µ8ëªØÀ”ÒÑ«F¶ŒG®º­âuÚ·ovzræ“^’jÞÞëL)NBú…$¹ÓX7þ\¢ßQe}ÆUÃ,*‚2°h TéRæP°Ìl™Ö\àÏ.ÒË ¾ ‰ŒœÃÜ9̓rº™ÈˆÛ!M=gRxÙH££ »ÓÆí°Æ}MrKHÁéeL@—õ{ c`;”A +2 `TŽ µ-)€Xà[ØK38ýP¸Á'$Nqr®ä…è3÷Ó»4F‹è0·Ë%ßĢÙ|+íY•!½íÍ38AèÑ â¿>5?k*ãAz÷é7Af-°îÚÊ×|XÐÖ,™ÃŒøT1ßäúÐû¶šÑx¾îh&šœ»ÿ¤æøæù"aÐÌ>œ5S¿w÷¸ž={‚g¯Ô;:º«»Z“K=zäôäôõúÅjNv™“Õ›Ý`<<„ àt„O‡™ˆdCa–ºòä}Bc¢Gx4¨r\æ}XdG”d›m…®b’bT€OäqW w! ‘zŒ©/“œGW˜w57“›Ýý"¸V:â+·à‡ÇÞ ¨Rß`»ÜöÐô\‚.? Î_|ñå—_úŽV´•¸{Õ¸ÞR…&³;ªÄ}‰º›¸1yk ¼f?K÷ƒðÜLZÖ€;qy¼Éê6)±%Ù‚ðe­]ÚÁEñŸ F.lÏðõîñãÇ*]‚ʺ£)É6·VÄ*7¢"Š9ìþÁüÇ8„Aõ§óÕE«?B4>¹9“’Eòƒ &skèî‘oï”^Ï0tÅ GOhªÆÔ.ý˸¾õ¤s‰øÇZ“ð€Á$¶Ü¨q‰6ôzsê*þ•·ù¬ðÍ2•+½/·®è×aK–¶ WX±‡ ¬ïAâØz˜õˆƒ9ý“È-X=ãPX"ÅxfU¿’ްñFŒXo5úW%Œ€=„¤ƒe´R)†¸õÙCCµ¾œ}þ(˜·m†˜!OC¬²l´‚‡SøeƉïH3í ©}&Í(¤4V–MFã|ÖÿžgØæÎ¯_>ó {ßD|söò“{ß>{óáèîí—¯Oá§OŸyÝÚ̲ îG£ÕØ‚? ÃãRÜQdCÅz\ípÖÄœ÷¯Š <ÜgT¬ÄVw¶êÕ´AfGØÏ‡ â¹\•ã)[d΄µ+×ç+•}XîÔí†t?NÖºš1¦¸Œ"uClÙ´À¨.ƒ!ÿdH‚Qæ_ƈ°|‚¯2©f¬Âìø¤ºŽe•*¤Ì€Õ@¾R(¨ÑˆÎÕ«TCQj” åQe•K6–…F;Æ´p¨f.%4q¨tä4¹¦NÊ®(ø?c¶«Œ`~·0íÜ(ì ÝB5†›{²s¯ 5zó[¤Â¡݇ÀZ肼VK÷‚g— ×JŸôƒ` piL9F ^âÂ=豚V4ÊH0Ùbd®B*®_µ¯.¥Yïi5Ø? iój7 Ï'ëØ|€ï>Hi³Œ!HÝE‡2éNTt¬*ÈÕ‡dÜdžQº ЦxÝØ™]qèIœù\<³Ó†Ñüy÷¦½»áöï¾2£•ùQ åÀ1Œæ-k,† !mgh Ì4àÛ5rYŽç\ÚRm!¢çÀŸB}cœjCÆ…Ÿ´.½þL(¤\ÝØ¸€ÓÁE|ðØs:*˜qZc/ÁÏìåTçÂ[ ¶¬¥`Y»ýêÜ MK–¯<…—³m~ œaF{ÜcÙSƵ+°IìZÕq¨ó£CY*è®k‘Ya,¢ºãôm4¶cºwVÒÃzîkþçÿ÷þäÏÿ 0þaÐ(¹Ø-Ç™4¨ìm”¨RÀ³Û× IDATqCÿÆØ„cù1©…«Í­-ÂÌýÊ6Åß¾c²6šì!ùׯNÜr* ïw6™åÿ¹Tñê5ŒÄôJ½Íb>ÓÙ7á8øCf¥Ü:V?!©)ÿiíÍá´ ”¶$U¶æšÏaT¸•:Gb.Kb ÿW3ÊÆƒKƒz8Tbe—ð»4Ô‰\Ê|½ž­qË¥áóÀóÄ„ /m´éª&õ¾^o›”·I—rÃ5|¿Ó¿ëç$€Êµ¢Óó¤)Ñ€æ+”ß•h}Þ/ä~pêa_§Äÿ4Œ˜^íÿÜ[ºsx(¹–+’:…!ÓŒhøW@ȯ¦ò‚¯§L7© rãÙûURr¾òqpW*ŸK€í„ ýLƒêvÞ&yæ`ˆ%j5ô[ßúÖRÑ„BÄvkèT!cûü“O3¢ÄNûxIN)Ã{ñ§ ä@L¾êC&fÞƒ5›Íaà&]ùc!¤“¨{¦½ ¤ÙÞÔ¨CÎátþ½Boø#¥. º¢<å´ `5òN§œ7j«Œ"¡LÞ±ÎÃÍL.>•é\Ê`N'–†VÍ ®<Άtßs òm²ƒ¿TIa—·ðO¯÷»|Rï²ALe|2ð¹¶ÕÜTTpKEŒ»x´•–£å-5Œùó"ÔÖÕÌ< ÖNPã§Ñ6÷›ÖõHÂ,Þ djQsõ¯¿ÿ¯{Èœ5„ÂKN^?w_ðí{_Øx|ïSqà—¿ú§Ï¿ø6‰Ì"-ĺ )3šm*[aƇ|êЯœrp a˜Å°â°%…H$‘˜/gßPh ~^¾x’Ž0· ƒâõ\ÁUÂC"%3¼µ§‘$S±ƒëdv𬩸»÷”LŸ¯adq#Ÿ…Áâ x<`†©öô‚15®^0L6ü€ÑÁâ¡agwßcÄÛø…Ç/xû;ÆËeÇ䫺Aíx•m*PéÐÎþ Ö’ci^¶ ;´:¦a*]Þð ?ŽF' RãæÚyÉ,ꀦ ÎKÃMÔ;Uïj‡ÛÄá8t•ŃçÐV Ë6Ķ–ÔSÍ»JÛÝ 3Zði¼Õ|.\kŸÖº$UMAܲgsÚB$Èžh›ç«eÝÛ æžÎí¤,ê°²-¸¢(<»Š§~ #~蟂ÑP9ô´`ª?t’d´gĺkÚpư”½Ï;s±àÑë¢K¯3÷òô9æ£Øí¸B—N $ÎjØu\ùU#G+yœœFߥÜò®fõç©ÿ¨( (r+2Ά‚tû€¼<Ô3› ©i ]ñ·å1â>96ÔpÒ¬Â, ,ã øôðát–;V#0i3~ú·;̈ã®Á >âs­_ZKµŸÑ.@Ìà)󅄘ú…Ä4ÄjJ \p~ð,…ùeC]QI £ˆ»9Þ5*[²³JRÿ§ÿçÿþÓ?ûs0 ±RÄß¶¡ò?s­é}P9u•g¦³D.ˆ#Ç«×10or\Ýí¸jÁàDÆ0 qË.V@]G”9é‘n]¹8ÑZº(÷©SÈEç&n5“·§ÀJ‰–mì±LÃ[O…æWÅÏ9ð<ü~@f¼BKÐ5€.+v±‚="P'_´Öœás'Ùs6‹nŇzçÜñŸÉ°}ÊçÛæ tEŸÆK ÈÏWç)s‡%ŠŸ•ÈæÆ5ÄzÞŒ,P¢h¢|“y[ŽÞyÅkW¿‡ ñäɤ顆ßXœûòöžnS²MH½íÓ+4…÷£”|îx€ÇÓópúqÉàí@Å%V£kÏ+ÈÒæ*ÌeVá>ãá!bÚ¹J™ n³¶y­c v—pP±ƒP|@‚§xîdÌtÉäßmA"¸7»Q>hÝŠŸ@ëÉdhhÄ+Ù†ÄeÉHeÛøàW ˆH:ÍKL,Ü¿gTJ¬MY¥_™¦ÇSø•…Ô1¯JWÑp˜aÊîPkyLC]^Ìhe̲yÀõ÷Éá‹–¨ûuU P )7Kê§8IL[tWÃkbÀõ¸Q²V08´ò L+ìUL*¬9–"<Ž¡x°,f˜o›€W C ¶§cŽç©Ý%$–¢_Øàç#ÓG( <órÚ !`£:!@€£ ôy¾ÒÁYå²;˜R½‚_)ïÕ¿ü?þ5Û˜K¤Í¦ÞÚÎvÙkrμbñȇ’äÀ_þöK™MôQðä˜éªf~˜ÖÎ÷%Œv¤ÅÿXËáNôpéÀ×tõCO£‹ò‚!˜÷¹«ðÀ¯œ.æ}ñãÍtÄ'ƒ3€á\ÍðÆo x”ç†EBqxc'$ º·>?!îêÌ’%1ARêÀ5ÄêZ¡>Æù2F}H;Ô`|Š©Õé6Ñ| £ ]0˃޸ònM›û6c¸ "ã4îú{Iru Œi¾ÝeÍÕ#T³‰P¨”"3Ê C¢˜—Íp¢­ÕCòNÍW½ jåV‡­ñ‡„ n©^«sDrB?q\Õjœú‡³.“{/Ž•Á¤‹ZAD l XÇl%™Tˆ\‘,ñFaÝÍZ;C-õVIa)XN[!l^ åsQw¨Å0ŽW|<=±ñ¼é)YÖU­Ô£®ãž‚¹  ´·Nc@ÄQbJ»˜ùØäX6@˜Ú$‘ƒ]»fµß%Ë]ÊFíö-‘lkð@E%ôÓ¹CŽ/•¼|î|ͰM¬R ÅðJx3*Z4pçvrq"¸*‘‘æ ä˜Þx·MÔU±M^eüÐH¿dWC‡9FÈ2*]UZWqId†¹áÞy—6Íð3[ì1&¦|IÊý…Í Ì£mõåÒ”(öDH ¯†k«lõ‚ªç·§@|¾]ç%Ù,¿ zÁ{:áïÿãßýñŸü‰Dî£RÎPªÿ-ªŒˆÖ»³Ö™ÔRS ÊJœÒ­fb·ž;ì_¡œ·®a´Û 6ðy«m,æ­VÎMÜAeÌR ƒ²æ×¿£ðé¼6yafö4tQ Ji"3Dû_Š+1¯†D½_ À:æv¤‰L‡‹j›¯“«¡^}pÓô”:oêrUÂê’ÍI†ERÐÇÞp²Ác¯Ãyˆ%úN×£Ð]¶`K}› LÇ3°âòSƒƒn}R>1¶Ýu|^ÿÁ¾Û^×É.èú®àG×JOOu˜¼²©NÝóžÓ=ùR¡•mØ€*±'±@Ù®) à*b¥ôYü=·AWÁ¸5«OúQõË—,]ó ^±iœÑ¤,±WÊu‡!1ùÊv[CóýÓ/~þ›ßüæ»ßý®Äå˯¾2Ю½0àག¡tu’h}üè–ß/~ös•¢–4œHñÝ52ܘ5KŠ’_1©æàKsŽÇÅ7ÍlõÃÌóçϘÕ#>zÍãGש³Æ8(Í™Häí3‚Ÿ¾‚—ñ²nªºZ¼,iÐñYBo¢ÛlŸ Y (ø‚'ìsK]“î<Ì-6èiØ‹Íäiãó¬°L¼zR¨ÑÏ5œ±»à쪆©idÜÄKK08ˆ¿ýâvýv©@[WÍθm Œ_MõÐxaœ\…0ZtÀÒ1„ŠcêÑÉJ±¡ÈKëËðD «ó¦4òr€•„ãê~ðW2*Y€²·£»v͂Е믟=þ§_üäÝ›W·®ÞòÝ8Vöº†“SÏ Þ@Dß®Ö ÀR¶™Ü\<%Þ?>3R‚öp“¨}FÛ7IÅIè@´\{¬ã£Þ_°òPö»B*p2ð rt·BtþR ø˜²× óaÍ€É ·$×t²QŸúCz_ÔŠMó‚ॲœ,ç(:acôKÛ uõy¼!—semA8=É^ÂA<âjå⶘;R0yj¤&J4Ôbÿ4áú~É.ø2gyìäÈiÃ"Ùù‹žç`Ë Z[UhÒ(Ô+ˆ’Ôp5˜æ‹jÑ|ª›’hµáv]Ý೺é¿:íÔö‹‚õq‹yläÆÎǻπ ½ZXÔ[ž>yt÷ÞÝQaÞÍI2bB:Ñ&¿lÒ­œ”ë eu Îcëêë†ùVĦ>ÏB#£øwnYú¸œ·n߽߳1W¯ßéÓ íV¡fâ;4Ü!–¤ór8kÎøMxà, ÄgÆÂžÊdÉ,Öšé§7D¥F0ÔKøÁ)›­¿|ñ‡:BI·{ ¬‡ËGóôõ™Ø­«™âk»0ð.œp?5 €V®Æï0ÍY3þJ-ÂÞå6 9ØXFH>­¶×‘§SƆNH6 5{éFaX¢‹ñ®Ö¦$IUb&ÞDIæêYNn'Ä3?l·nÜþ‡ÿôøßþ1 ¿Âëê¡Hüx2¿vÕÄÅ!¦mVà9 Ò8ÐÍ#ÊcÁ‰Î¤grçÅÞ;c+ Üþ¦W êAw†d{ Ö…kážñ¥µR`SõŽ]“¦@íéViÀvOÿÔgÇ+Ÿ·ºUA¥†mMÔÌéâl@¨œVPÉšÀö “‘ÂU=&J팵ÒЬ߫!ý:4YÙÇõ\§«e˜ Ì¥F±àóôó[ßï$Ó~ñ,þƒQ óÂíDžtË8ž^šîÀU]…Z¬e2ðÔ(‚hçüY[l8†«Þ>àªJÆ£GÉ…§ž)Sƒ_ìa‰y¾Qà£7­w÷sÅ„G9¸Ç¼U{¼·X­×·¶CX`¨ÃΤ°—Ï{ Âô°{#ô©ÌBfGW$´ÒI€Ÿh”]·§1<Ž49£Òö; Jëˆ~­N‘NrkhÖDKXéŒuîÞ¿÷úµ¨ºª‡ ÝÁx펳)Ÿ FöZaÜÞ¿Û6¬¿ÿû¿ûâ‹ÏoÝ9¶¬˜ÉÝ1iýÞ§[+Ô3bG†3‰c¸F{À„V>ÈÞ³€ºÚùŠpd'"̓±…SÔôÊѱ$d ¢É.«/ÀÔ¢ù¸ ;ê³ù`zXÏTOñÀ;”Á(€ñ›®Þ¼‘ãâ6$\Ý…Fòõñð±Ç ¡õ^ŽgOŸÒ0îÌuhÄyLoÏØ’2ˆïRœÌªóêÇïvɺbë{´ªÔY¼])D)eÕ|€Qö’Ó«?üë¿äþzž×g¿b’ÛG÷/Y“úøúÕ‹‡‹ëg(Ÿž>÷ ¶›·îõ‰T7”o[bÑi½>lrj`FÉ¢¤xEŒ‚ÈLÝ ì‡*ÎüÒNZ› Œ$”Å"£Ds‚àÉïÔálÉl«‡­¼ ¥§1ßy·Š¹§X-AHŒzZ_º]3à„àú*㑨 –ËÆÃ1‰,šà0J–LÇÃF= ¿jÒäB×µcû=/×vEpÿs¯¢®rÅ$8H:³¨ÀŒô‚@ÆŽUÐTð«œÓ4ky£Ìú÷À€KT6»![܉€vë-w\àL~¸Ú°­Y®œRg[$í‹óª=9®0ÓórTüΈòÁþnoIÐJóѤnPnžYÍAÔh!Ä LÙ-õfÌF£"rR”s½ó ŸdKZ`ðkÞëqå'OiRþ6oÁñìž®b‡²¸à[Ë3…€xv Íw'Zt°³!ÏÛ׋0Cö¨Ú«qÌe¤S¸%·°Eÿb7ž95ŠxKŸ2€ë×l;ìƒðïÝz>”Ý “iÝ9º«§Ðç>E½+gFK"ø‡„;ŒÜLŒ8x qW£ƒÍúŽíF% 1‡‰t·Ñ ÔúEåÙ<„B¿ûͯ…¿vìº5~²0:’"”°Òëÿ&Dnl 3ZT•#•Ç/õNUN–¸1EE5iÏ‚Šîvè­¼:AXWoÅ>œ†a'N5B`^s¤üÎÑbF›4&*ÇdÐÑ"Ñ€3”~ ¡èLϲaÃÏè%@]úèÉ£¯þÁý!«a“„]¡`;™ÐtWßC(êõ¼+x™|Avn—ænìL`Œ—y£g•cÞ++ùÉ(Ká°ü*ç*ž¹Ñƒ®…V¿d…-`:%Výz’ÂÃ03NhÞ€ œá •W/+2üÐâî)Ç30åq‰ÆleDUŠŸ ¼n+ý:ºDÍ-¼å¥Øñ«Ã¦«›%åj´¥–ùÝ!-¯à*`üJ=‚D¸˜<ž˜3Š5'`þ6ì¹:´b@O/•l4)Y“6à .šƒrõÙ /½ìýLÖ3ß Ä8?Ìb† Xž0q¡BWƞؠiê‡#þ± eç|ÉŒÍPÊLªÇAž1oË ;˜X¹¶“(X4ª#>_huÜ­ötXªÒ†÷l1A ¯\_&#¹dö¾ƒˆm*ì.8tÛ7{TðㇻvÏbɆ\|¢+ãÇÀÓ'…7«ãüèþÝ{8Á*¦­ëfû0×M1JoöA'¦¼ÿÉþC@âðáð»ßývŽÚ$tnìLvh“€îçáY'¢ÕA1w~V ñÆ®°‹È*Þ£æ»gÀHÏÿù­ÜeGR:cM"ã‡^4Ôþé‚X(K†œC¢žgŒÛ8]ŸdGÖÓxÈöü`°gP,&ïw»•!®Õ×U›Üz¼/ç’÷\LšêIŠ6VÑJO¥Ý6ÒW$7hßâ…×ËWÅ“>Ù,/©V é”v¨B4ãž¿xlzÁZê­ñn,ë›Fâ¥K­s#1+»ÙÀ€q8%œt[þÔ^ž÷kƒ7 ¬‡q³ #‚Ð9>SØÂÀÌ0<*"[³uWÁ[i}Ñ ÉèݯðêZðB”P.îf(ïÕz7L¯œa¤òJo’Úã§¡iòb‚3¥œš“{ðÍ$Á Î-ÍtùfÏŠÏSs¨i†+£Èl~­ÐlÂJj™ÕcÖ®Ÿ¸é„â%ODb¦Çñ˜ÆµY:. Ž3Š›¼ääÅ·…{aÜ FA„&ÌYãñ«^ÁÂ^ÄÇ?Ûí:°%L^ìkítWF\¦´Ô…’x¡ô §Îéz/÷nÿl3¡\É+Ø”ý!ÀƒÜ"z×®,‹t­E÷F¾ž3±°Ð®;÷w|À§ø¸E¢]ƒ¢Ãë7'ˆÁ=L%ô‚òæ^óÖëõZ”btoq»yûô„þÅÕ¦ ØãÆjý cïI’b™ÏëõÒ©3¬ê}ãä#±úó[*³¼jí]AÆÐ(Ôׇ€‚£²L*åNPµfÆ–dæN‡§¬™ORÈO,àY<ǘ½ æµL¨D²xNe½Å sÖðSÈŠaÇPÀ8¼q:?Ç× g²¨+¿7c¥…a¯ÜlÑ£NdŒìÃV¹$cé¿Y}üub0ýøä»êæs³&Ù¼ÝÓ¾Bídêž -g!` 0šS ˜}çgpQ¯‡zkË·=šRzL¤D³zµpi/Âvßãç?ûÏßþ½ïÝ?¾§sáJRU°Óc-ƒ™ÉØ×V OŠÚzi;~lxƒl—̼ïRj¶¦ÃL‚@«?=±hKqÙŽZ,[õ^ŸòA±ý3§'aoÜ;í¤ºQèä"·®”-ØWö6Ï÷¤]U7Ì%ÚTÌ3²[ŸÀ PåHðà œ…ËòÿÛ0‹ð2$ÒHÐPGµXÀ÷”bïæiª£›cRÞH­[q›1wk™Šã„î÷ý`-ÏÌg!ôˆRU¦êÞGK¦gËJÆæì>›{?¸àb¢UÉ–™!w0QÎÅ~(h\Ô”ƒw±8r4A-{è>õø!é‘V?öœ²NkQ 3ü§Û%FztB\¿ù굕oop½æ ‹,ÓX`ƒÁ›&c< «i¨›Š×é2 –Åöq3QnÇLšg€©Òp@‰Xœ¯°É0Æy’/n_Y%’¹ñ#œø~ŸOº^®H.C¸‘”cHïŽDËׯ»Œ ¥á ÞÞGâÊ/­<ñiJ÷64/ŸÔ&ꕼÁ,¯¸ºã…D~÷[ßS9öR+±ð¦0xÍ«‰pëZ+ÿ©½ ðñÓÏ¿•Ú{‡p_8¥œ§Ÿü;=¡Xüs#3fxLÎÁC]DäY 0О)Çf“Q×'Q÷p/zFšP£{¸SMr6˜—.ß¶>)&»5‹5 ¹½l– Ûq4ïœ#;røãã£Ï{‡¤°u;ù†x€Cikr÷³ ›ßú”gßœð}ý”Âùe^þþÝ‘†ÙÞ»vöé§ß‚Añ¡k2 ‘³•¾Pbg\'³×ÖBšlë%ؽ‰š*{¶üûN1q’ìÙµåÅ·“ÌLÖgCE)íÿùo¿oTukĤŒäóÏ>½yÛÃäFá×.‹s7n_¹~ëòõ›Vuï=ø¼@àhs•| 1ê]ÔtžšY¹5¯"Õý˜: ½tèKÀ™.c1•·þÔ ÒªRCìjZ”Nšà¸9æzÕ¬|L¼»(Ó‘2l‘PÊ¡6‚uÛ½ ³‚‡îUl¢® ; J×ã"¨/˜«.iÞ½‰srªÄoæ­$ÃB@ŒÛÏÁ_ˆÐZ64ÃSïPfà%ít9¹(ˆ_n†%ÌŒ©N¤ÐÂOȇQÂùLÓ'úíšA7Ñô™"û¥¹£œb¢íªZC0+kð7+åƒêy¹jÈõVRu„J›A yzp ¡Â…2›uÍÁ!ü«Q(çf‡ LY Ò”¬ _‰õü èÿV¡À8 Ç•²Èe .¨Ñ œžßþ‰™L¡%y½é=Øå›óbm¸.Gͼ»µêÃc­rR‘ʈ¶ç¦B¯°wPA™Qê8Ä 0𬖔…=|*‚ ¢HlÔcuD`HN´Â0‰ÓÌp“õÑÄeWAQ”ß!´:kV {¥º!%¤HÆs[³Ôh”úNlÇ›NÀÆKÑŒ”"a‡ I ì ßÐæ0s "þc”óB£³¢‚E5Wnóõâyšº¤Ì®MçÐä vµ.:ëÆ¢à!$ðÚ° å­t 3 kÑÞœ9·óQwÉ”KlæWd²NB¦f‚j„Uú]üƒ­þC3Z+¾¸ºNᙘKî ¹lVp pCr;ß«~”QªIzæø0LP€ô§œÀ° `D¯3)«ÔÖI’N¥ÝbX=JÍ´¹f%ÜÚr0˜ºhð£¢ùvœ•;8kò”|qJ£+¼WO(xUò§­‡p¸ å;.C^•Êø„Ý)³‚Û[¸¬[Öz¢ƒ7³a ¼ ‡uëä[í- ”&^».ÐèEM.ÚÔyÍm5A§¤bÒ5!OÖ4.j 5BG¶›O!¡¸‚˜£øCbÂc7˜ØÑ'›àp¯¶Jßò’RQEœæî$"õl$×|‡Ñ›†­ÌÀ–#gO›PH·³¬ÈRX‚гá0 ±ÈÜEXËʘ`Ðy §ú;S^x=|üøÉÃçÏŸ«¹~åº9¹¬Ò]/[±ýß=Üóô¶ç¨„Ç-Ist ‰FÌ^¿ñæ´·x8VdÙ2 4´çryãòœ•1•`ü\ýúÈ«?ú›‚žMzîw[Šœ;J¶þe^ÀöÇwîÜ?¾sCÕÙë›GÞ–îÃR·ˆÝÜÑœÓ켦EÒ )ìzNÎ^Eôðà”˲²ò˜ªÛs´éwÁT` ²oMô5yƒ& ÀÈ3à*b’J>—üîL>Žé€3ó!Ä,òq…”£;MghL–±†f]…\ÿ®jè€Ê/HWu ÿð\²«~]:?U¯•ÓÉ'¬õLŒ£y``<Ë@¹£¹Áž0´†Dt—ºß%w‚ð ÞCçYýúGd=³.¼¶E­”Kð§yðæ ùãúM\ÊE«ža…ˆHƒÅ¢ºå!pÏkŽ'à„Š7^˜‘@µr`hahÒñ~õš„ÍÈÞvû R—º5qsù/&` ñeÒDÏ„lúR™N-~78LZèjd¨m’ŠîMi9T–Ë‘¡œV_º¼6οµF=K÷Þ~fã DÖo[cof‰†ä°fNJ7ÛêÓøNŠîû$z²«Ýé,AÓ©‰Žäi@„ö×Ò mèÒfõìêân}È¢{¯üŸÇ 1ÞNä¬4À¢7­œªí.IÂã@Ë$ñ;íÕ"IËu]þF—Ìý¯ò§o|‹0fMšõjCÞa9ºÅ§óc™¬ù×½à0ÐB=•4¸ªÝp›òhØ%§çh4'šf7ôº]Õí¡î_¼î Ó·Ÿ<}lSŒÒB¦_‡å³šOn^Ûhæ®ÜDÿqì:çÑJ!^ms$ýù4i4—‰Bðzê ©–"n·|B‹€—4—³\À±ˆ\Ïô©/°áj£1ñüÖJÿa|r:vÉ?5Al{Êò©B¿å1çCäƒdx–Ì& ’ÒæÄ˜4§„ŒÎÃ5~ê_:¢5Ìä×r…+ª¯óRŽ2@%ÈýƘîTCÌ ¦H;›5-'ÇmEÔï€ñ[S²Å¶ÊõÍ$0@ÁkíH1jr?:“fü“'àEo 3|”-À ¸( Ëy¢ƒ 6Z[,KrˆØiubQ·Ì'•„ðå«3]Ú0ãÎŒ»uÿ Ж§R¦CtÌ=˜½ ×=ê×0¨“ãá9Ývßt…%ð.qQ`´á×)r8tr¨þöoÿÖS€ë<†v–ØÛ#ðšýh#tK'Û\¾ÿéƒô¯Ü¸®/¼•@øZœBÇË-‘™‡±áðê>¬CH©ÔÖÉ72^š@â£!:OýÁ«Q?r}=ü X À jH?ç%‰ÆE/Ô˜-ƶ5Ñ$ sK7RŒ–œ¸† ¨r$ø†J™‰Íµ¿þõ¯ÿ÷Ë6ÕÐØ€Bl¹o—EëˆwÜ—ÖEZ"˜9ÿ„çnÎ?ÓÔ¤±sÜ©ùyoÓÄμgy¢Pz¡(ª¿u†”6Pè¥òo¼ÕÆ|ñ]OßióƭωdMëôí¥/¿z(qÖ¯ˆ÷ÕÃ/ïß»óÙ/âu·Ñ¶*æ”Eú€'³!ØA:Qr êN(tt:–Û«~]Zþ̰ÉÂ|NUœ– ‹Z)®ÈÉ¡†®Ùûª ¯*Ú†Oã ¤ ÕÒRP¹eœ¯ièéªJ¿ºÓÒU¯€ÖÅDJ7• á'g*ûž&Õ/…Y9³ŠB˜cX–––_•[D˜R„ 2ðs2 ãzZ­6 Œ%¬×}Ÿ1%Lf€p±q& *WŠaµ6H—³N¸W©faÔƒ…ixŽCqBuÉ@HŠí¡:\µÂYüíØiõ¨¡¥¥È-2Ýæ@zØV¹tlÃí÷tøÉÐ:‘Ø e#ìj«áz•©z»&æAK±@D¸bJj@m3AõÖ7v9»˜t–E4—––EÙEwûëÅKtSN-%Vë›3ÞåWâ‹ ¯_¿À!V×9V($ÐÂ3`5 Õ´ÈÚnnR¬üÈÒÊéª*`j¶Rý"1N©Ü© ¢ï€t¨„-1;˜…,ÄªÌ ~o€¦ ­C˜&‚d,$>_r r¹Àw¾óž6¸|ùù˲÷¬½Ü¼q|Õ›4 §A2™RZ‚j9ñK **Ž­¯Bp5â4p—pÜék®ó_ ›ßÌqõÇóCÛ«çÏL˜\w®½~þôä²·oܼÿÙwï*0̾BEæÙ.МžñïŒ_?-ԼͼÝÕ$Ù¸3܃ĄÜtg™„Q³R)ó;¬ËyFÞô¨9箘?ê3$lA%àèÎýl uj˜‘F‘¿¸Ò„=Xà -~0ëô¢RãsøƒÃO«Zh[mvƈÂ@{ ÌŒ˜•Gnð ,SÌ ˜f˜qG•æÓFzqã?4íp×.Ÿ3¤ ìåV ÕèÞ’å6î'ú ®%dýÓá÷0«sB"Tôe¨ð†"IØ»AœÚ¹¦JËsàâ5úd}(Ç›ÙDó5¨špÎréêS™Me$iaV;ù¯Ç¤u.cw§- +” ²Ÿ{L‚É®ªɃ°'0Ž™ñðr^…´c¤K¨D'±æ“á,Ê­(EH5Z  ÏV&ð©Ç°K #¢¨§zÖ¤Þ¹Ó²"B\ŒKR>«+:%8©auè™-C3–‹kF§9?¦Ö$?$éZ`»ä+­ðÈïtjYÜJL™Ü$‘Óo%¡812ì2„°a]ú`£è&5„XÊðÓ`Æ–š…_ÑUÑõÆã2$5Í ¹âöùfE‹Ë9ôuBQ°]K1>¹÷ÿñ§ÇÇÂémÛh#Hð™N0g~& Cb$Ö#b`ñSE½[“ñ‰“ ¶ ²"À´ÅöJ`2¹,ò"»e@ wŒQÇ`¨ÛÂØ(„ø¬cˆ-¥|5c\Ï:nv9ŒCê»4‘$ {IZì §¹_õ*Œ¿ ÉîÎøWKþ¤q{œ €Ñ‘¢bŒ)aXä{É)l5` å¢[e½xf›`­Ç‡¼Â¡?¶#M Ÿ[‹9TF‘%¦*8TÎ7?|´.AÌðhì€a… ÷žO¸J?8Y ð'þàœ¶üY‰ÍÐn5‚‘®Cdhej5NU”0 ãàÕ“ZÏEÏþëqÀd#îÐùÐû6T¿Î3‡Û54ÆåC¥t£NØøo`ñ®P+Oõ%—¸ƒâÞí bŽaÆrû­õ¿ý«ûŸÜ×iñ£òù‹Ë6Ã'rr&„Jx8o—Q‰ã˜|ÂÏ>û ºçà,e¡@; £ 0Žy¥¬Z,pÐÌò³¿N!_<~µB×%úÖê¢!½tŒàas 0Í,Œ_W¡r(Û]U@ѹſ 0T°D‹jx‘K°¾õù[)¤Ù控~©”t°¥´ñ¤B¿·C[ƒ¤Oû®~ý«_¹ezÿøøÊ5ߣëÛ¬ÃaÛp…]¸ôt¢é¡£¢æ3 Çã³Ã~üã 3Ãj+X)«¡ÁI`…_šef®ûƒïßós¾ïÚ‹—¯Èé-"ׯ\r[ðÝék4_9¾wÿú­#àÆÕv’šr["ê³”¼Í®©‚õh¶MåOz¤^ÇvÝf¡5•°½U[ ÂÜðG€lÖW§4»C>)k6ö^ÙüZô3·ÛætW?)Žì6NjQ¹¾ös(#í¥h~úI‘k¸jgû¹l›,·~ÁD±t íÂ=¼z‡\-_ßš¹z˜Î7i©ÅÉÔ/*M¸œ_0‹Ù/Ò~$ñ0ÏpÒú00ï‚™>Pø£ñ2»aÕg³ôòçFôC'!(  1](Û~$†ôßf›3°· ¨•ƒÂF7g…t¿è îˆÀ(¡rZ,º)¤ *¨•¨αZîÅWB6 ¥Bë3šò_!f„.>Ö97üÑžTФ“gÆ¡òtÛ“žÀfI$.»ÝyÃ77Õc#0/Èø8om(4NõÞ†µ¯·YãJ±:o„£ªDŸLéQ@F§–ñeN—>©™Ü»¯/ ‚Ãm<˜Ù¦Š¼bzÄöIýY „¤Ø;}´€O²Í‘°Ns§y²Ì¯²£Ý=Ay˜!ÞˆK{1eÆDÄ/´ƒ!‡oØäÒ0›ýçÍE ­È²—ÈRã{—bµ%ê2¬L“Ziâ ÀkØUåm¾•в:xn3g•:’M50¶i¬VåùÚ¶,’!'†x‰Ù«—/$?ýéO>ÿì{·îÌ ¯Ñ•ÄöÀdH.ÌR“˜(r'æXWÄ*ê)¡™ÆÁ9ÁŒC¢d…'þ¬ƒ‚×sòNvñÎk·'æ›»žVãö"dO~Ï …œ~FVL5NYD†)ý`’àƒÏY*r ªl htÏ2¬Þß.Xõ³À¬ lìâÁvðÅmþÓ‹ëL*Ä©A!«ÊÃH™3¸ð˜Cómëw/í)÷glÂ]wôèÔçr›“62G<“härºü£µš,`Íd2°—#1oµ¸%ü°¹¿M·"¯¼êæýS lÙt“æAĤ?&˜Þ:ù–F+cõ³‰ãõ«çP˜A ï}§./‚á+8Õéq2^™,4Pyú/I ºˆ_lëJ$Ezu®’D"—T‰mÇj ƒÜìÅËçz‡Çô,[圀,ßv@âE ¯N|ëÚ“tI,2üãOú½ï}ÏÖŒáv1“Kwõgz³*‚ÛY·«w¬Ç^å‚+„ð‰€jÿ³¢£¼áÅUøüÎU‡šu§U ®"m—Æå¶fr­ƒE\"Z$zîµÍšìÚ†}VÈ&b:dW2E{gTä¡ÍÁ+à¡iÏ%õžyüPÀò´rKž'¯ Œ×DE/.ðÔ£Gdò1^¦þ–i¼.tþÎ:gú›³€fðãÀ¶2é´1Ø2eÃÐ\~Æù†_ÍÀG´”`ëìô•eÒ£ã}7µ={ý²·_ýî/þîñoÿËËg_>{öɃOìÙXËOæýÔe³§q s ²Cf÷Sowâm<•eúgûŸ°h.K‰&ˆL^Ø’³"•ÊýÝKÒq5}ÚÛ,ŽÚõÅÆ¸Êl¤ž~äeßítIm“E˜ò€¡}r²Š1 9W qÐZ†Ÿ 3†÷ˆ™»œ ^Uˆ\-k W‹f¨»ªÒ¯cÕj­ƒ¸Ð°±¾%“n“žìX¢Kˆ;‘¶AR.HR˜UpW—O¿“šÏw¸:ØÜ9öL{íè¹{¾¦ï µÉ€í8”tqÐ6Æði%KŽº’œ/ÅÎRb†èÌ!¦P(ÕŠ€š“Üß1Yz˜…ÿƒN4ÜÄkÅY·Ì<+k±B¨„òÞD5ac–²øÒw+¶Z´ ¶ó{àç°N™1K‡IFߪ!‰¥t¿“¶µ]Åk€x™åh¾$‹rÐçϬ¬ù®L\ä:‚ßš pI9Çpª²&¹A÷ÅèDýĆm‡xdW„^`0QD’~üðìù3Ž_6ÓÌ©MÜ Ê%Ù\å9fØcôœA[饎=~’ËÀƒèFÿÈaÌS³ ›æ’b—©f3TMv=Ì]V™™V»§Qä\-ß(§iÌK†J¸É¨›ÎÄ vUNÙA^¡i•L-^ðÆ‹F ê8 !³~ò9ž†ì¸@å­ ’÷›÷x´¢ú½WMzùÙõOŸ>øü;žQooN‹Iž™Øç3Ü:¤FZZ °Å3Çm3_ÈjjÐ1œáV_•Œ¬à_þu¥nĨÓá}"·oÏ3k}¡k‰ ì° @o‹Ç¦hH+PjÐO¶sÈ!`ìP x"MDÂÃjOC–¦b,.rÄz±-üV­nÄÀ”Y¿GRf“„ˆ¸ˆ G:Ð:Ï´PQTa~VäÎY?ƒ ºŒÄôŽºÃ›¢©A'qï#õ»t4±T <ä«ä.[Æ›dÈ"ÇÖ½¸‚¢öH:é³UjZѰmQ$ˆc;ˆ{ÝتYßðwtäAXˆVP!×ôš†—ÐBˆÔPу[kí9¶ч"NϤ;7oXívñð2¹Å¶¨Ô[ò6 ßlO‘fËÔÃôÒ€µ²P¯@´.§¸´š';=Ý>ò:SÀ«FÃΕå H8\Rƒ[ óËÊ=ÖêEb6féJ´‡(&AÙ[ïcr²L~ÛHt¥ÏÍÉn$w` þãzЛÎQT½ ŽB–(„<û6(æÊ,ëão`0ÑYÃ1z^¡0©¹¶nÒÉ’(6tC@39ô*Jݪˆ±ÞŒA†k½‰¢˜9ɓߴä‰íC–ÖæZ¶s R¼»8%¯J}Mžà>/{Ò‚>%%õ}­““—>ßw¾oÙÙ)ìJ³’Z·~,—@KÝürÌ$aÍÐ*?›Þ°ûÜ¿>8ë•W½vqC§wvXýd¬ÀL"ÿÕ÷£ïó"i´å$ØÐêkÜ:}ýÆ;=?ú‡—Ý.¼vãÞÇ+7}>üνO=a£[Pì9†Oåx1]£»’{°Ÿò ·ùÄu7wºLW»ooYå줥¼³ÓG•&š¼ÁÃ6@Ïo0'ö…)~?ýÓÛ%ä=%CÈ6ušk<ë0¦AO¥’üìÌ›?nòI‹C£”&7§S¾+4X3l†Q­rV¹Ò~BšÁ+³¢«\!m(m Zë—žž-ç÷ðg³ ‰kÇ ÊÛû»ùà±ë´9—-'â‡~ã¯p¤YN8@Iêl™Ïâ„C´(U÷ìNP!²lßjxÛªOèá0å¾òDáGK<O8e²^Ö!L§Ø3Õ–ÔRæªwW¬²6ÊÎXBu-³ò4¦¬è°@ÍÙá´ò2C[žkþBr8ÊôÐ7€¤»xóâZ¢‹ºxü´ EE–š„Âö6ëá‡ä}ý꥖˜'”q"·€¹Ô#"7-A›b›‡X7êY$2y9S£˜ÄûèÕ3ã”{õR aq— iŠØšO˜<Ƕ%b¾tÙ­RÏNèU•cMt!‡=Sö‹.WGJM¼1¥WgaŒ>i{œÇÂ=·¾$c‡ðbÔûNæFŒq¤\{!On5GjœWþ`ÃuñÀn˳£@YžÝJK 9õÎPámL Q¸šn#Ž«†n[8æТ ˜ŒâTÜ*œ–¯ø§å@þÏ@÷n-–1Ìlø3Qw³ÞÇÑø!“êP.G¾¡´Ã|£µÅ·žh¹JÆ:—m îáÒƒLQÂÓ®i4xcïÚíö´oI|õ›ÿr÷‹ß¿ûÉ}c‰·!˜€n©Ç©Lg…JÙKÃ…zÛ]ÇA½9]Àm­‡jSïÂC¿>u¼¯ª¡Œq‰éq—l3Õ˜5Aæ!sLJè®iT:œ°‡ðÉÓ¾¬7Á!šz ¡<âvo¢×¨ÚU©ÃzÆûæuü J—°<(ò§R8Rb~æ<öó¦@qÛrE¢6I-‹KBÿ$äÊŃ™c °@Îpð£Ã7Ø5¿:ÑJÇ}àdg 3sQžV©¢††¨Ë¥®ŠnÆJiÊ¡2"ŒVÝ*Oؤ¡w%Âd“ý%ÍûÒm¿óÂ(Ù1kÁ¢¿V0Àžg¯æþÚGC»‘L¯1S‚–TÅCJ¸´qŽòž6Œ^ºut—ñmiR!ÀxiA£fI8:©Kq2®!€ÈH¬mx‘Ïòf)»Î Ý—1´ª§LR¥sës13ï nšöÌ“’ŒSpñ긞êcR€xg»¦[4Ï÷ó=NÈR>ÜÐ+}XÐ-·ž°‚ƒMÙoNÎîøœnYæeë+§¯OŽ}lÑ‹ûö¢{åï­ÛXž€Š!h†usnzzÓ©hùV´¤]ÔšäõNïP´‹ÿ:CxÓq âÆ–ZcÑ9YÏz†NÔ’åëå^oß¶ç¯ÙuTúå¢2¾Áÿ ÜÆøøÞP®!ÑèaRÃGS7QEo‘DÌ”y|»íVãiâ2ÝBn )B~y*źá IóäÞY˜Ã0ÙôBé—ÑðãËgOîßAÒ”–77s½åã‡?ü£?zðàó»àšDÂ8èö«Î%¸M¢„˜©¾w¾ÉI(߯P¦ó¹d¡‹ù×å D˜~GŸÝÉûÕO? ug WôËuö–^¶©°7¡]=¾{ïþ'ß’ß>ºq÷“ÏîÜýâöñö}1þññ}ˆˆ ¬¼qÂt5Ô–³êm²›)m*c}I‡NöæÝ™…MW¡1’íž2Ý€IŽ%`ú%(/*òÅïÀ4ÑšzwÉPêö"‚|Ȥ±+ådžSAÇ ¤ù(*Ô4CöŠ/š3¶†is^Œ”r'½åÄÛÄ] #Hž1]*†Ôbœ8B5Åî£a–1YfI÷E¼øúÁC˜Jzܲ•}@ôCZvixs?»eY¥& €19KtgŠ/Ã:Ź2 QÂVºBÊ 'ß*!,x¾­0ø+ƒTï*`¡MÁ¬‰qD:)C9ô<ñ$àDd,[ÆÇ  0Ü çÆM „"„¬à»¤êžcȪdðD(}³a=ü2$XUNäé-£É†ó$žŒJñ¶LÍÒÕÐ%šÊZÑöœjº|v¹¡z³œd*;1´ÔY…ãÀ #XË!µ¼AsTàãrM¸š_—to¿.…¿w+÷Nêº#ÛÌÚƒ3hý9V' z™VúuÉ:íŠÇ-`•v5<À–ï)–p¢•S­|[%Ë‚$äOgá0Ûjñà<3œÇ”‘=mhÖRÜÛèž’ÁP±Oõë„Ü~Y¸­øƒ+h3‡Êw ÅÙœüÞÝ£·§¯þÿÿ¿þôŸÿ®][…øÍÍf‹^´awIêÀá°7ŽqoD‹p4Yq¶®ŽÝÕ(ÓLòNÈýT³¾ÍY­9Jh!m;—§t$¦k×Y£Š" û ¡2Þ àô¦’tÉ2qCs£â*–°¡š„¥|#ž—?Ÿ¯XTS×а°©90ØÔ(ìC ¨q`îÕ‰«jœÀ0¸m‚8!^27î¼Àˆ7kÒ¹Á©ÊÈU ÑáŽBYÆ(ÿDHVÈ5›ŽUnÃéÝdèŽ$˜9Ô ™…qw̹ôê¿å[*ÉðLÜŠ¦¡:i4ç݄Ċ˜Iá«ùÖÌÜt®ù•+¾P9}ŸËØ)VòGÉ3Þšäç8)v­ O[šãÒÆ5³ÁÚ“Ië°éoz D[œX2"˜¸Ô•UZÂ(ÈyÝö— 7‘Ì…ô^½2–aŒ‚…Ì IDAT,2Üû÷Þt ˜:÷[Ñ3¾´"¸†(ÞáG%êM´:¸%®àß²Ûˆ 4ÏÇ9IœN:ŒeÀV^……äðài!Øð@ç³ Þ=+ÁŸ áÉãAÛ$š!>ƒ%x\ᤃJå…í€_CxT*ó%¤Ò©ïÈM9—«-å¹¥x«Š3¦XPË´†J⣨ F'QçÀHèèT¤_Ï3”ƒ1]TAÏpužÓf®:ÈJ¿5Pù½úÃþ@îY¼ñ¶¾"ÞI½ÚãèÒUùÅûGŸ|ûÒõÛ…+b‰L‘t'²! ÂÀ®ŒcvAƒ±ËauõYçÇ[€ŒC:% nÑmmÃÑ7æŽ97‘ ’ØÚf§Œé y3ÊŽQSŒËòfšU«c0äMŒ²ß5"ág2´J«º0§«&qðH50#”¾œLÿŒÍ‰ì ®ò <5€M«®^7›‰=e‡V~ÜÖŠSÄweÕÅÆ!L-`L:²¨&À°’ÊÏTš›ú—rkbÑÇÚÕø+ËÁUQyÐÍœZÄp v^b_]ð6…8ŒÊDC¡?Ôî”´ÖSè›5‡¥Ã;]Ô² Õ¹ÔàiÙ¶=ËMòè>Vc`Æ£ ˜ñ”;©SïDgWðlé.ElH'cbWÁ_”lZƒ]‡UB¢ÀË©†¼W O9w™ƒTžÈâ6Q•µ+ÛüWwŠƒÓs"¬RàåœDž‰]i°9> ù9’dAîX?4ÉoL~ÛN'¤Ð*:$ S8M=©Zà„ÒJ”åÅRU÷¡¤wÆC ic óÚ€CFFZaµöÍŽ0žN„¬ñ–ë°ÝÒMÃÚÂÞ¯C W·’Ñ©‡£ƒ•þEÎ} £Iq$,êw÷¦v`ë! Þ¥…å *$°êÂ`k4Âð*¡¨Ú£„,á¢ÿ¶ªANzvÿÈR#‰ªßýοúåÏÿ¿_þâ_þÏÿ+ ¤ð»WK~ˆ°*¢„óVpü“;ê-Ødç£Ò2K nxá‡Ã4ì`¨³Ä¯ÒUtµU(jai&¾sß'àýêuꔜKƒA‹z‡«CˆWãÒšÀ  #F³ÔÃÑ9ä‡Á>ÂscÀŠsšeáºZÏgÀԣ责±íª‡ÔPM½d™Ÿ{”„e… ‰†Ðtw zIx^m¦§+µ¼™;0à’CÙozªwàA}Ìw¦Å‡È÷@¼†Náïc˜¦ú,PTÒJ †àÁê®0÷/ù×2¼U[ÀZÁì. áxùâÙtíì+?ñÖ+7t:j„AìuÕÚ¦æÞ›0¼DŸã?ü¡ý‹NêéTØÏ‚ƒJtèÂÛÕéG… Ë’ƒ¦HRB›¯ÓdƒWÑU‹x¾tÉHù¿u7R‡ü¦wÇùƉ72ò)h÷gx·æ¢=É®°¡ìÍŽ»éA‘Œÿ¤Ð4ð_W3删Ô~ rÑrüÙS1Q´ˆ R  R¯C “Ф¨ðCœá¼Íax@¢SqxúÍgMìÍ®©à‹öëŒzœ«ZV/T¤€Ô®þ›¿ø‹f:†/õHg“iƒñ•ë&÷®\»ëiqÉîéÙ«.]=:µð>)O€ Fhís¬‡ê:™µM »¸:ð1ïÁÒdúÌl(_K³ç]²u¿‰ÏÕ=çÞͺÝ\ŠwzGÏÅ1LQhõâ§óH[n,©9ÇÄÜ’$ä\ .·³ÇZ×μÊ%ÉÜ ï ³š€WÁÒéxávy^÷'vP¬é.ùÝÞ‡þfñÌI«„`€LÓ‹é]°¹:ëI†"‹À­óéE¢^cG^÷}ß‹‡eD3:’×¾,2›9(Ü"Iø'HEb¢ƒÂ2¿XÅ5?“õöí ;:mO4s:ãè0¨FSZ§ƒ¡îÒÛMç¦O í^¡ÎJR'¼Æù¤”C.z¦™ˆLfœãN¿U ŒÜ(3­>]§"j$¯czZ=goÃŽ$mó=i.V‡©æuˆ–ðåÛó(ª”¨.4m qu½ŽÝ â˜=œÃ ýùëQª[¤5.…9üPïLîr‡Ât8œ×ójöï0;ƒBC‚O-fkù»™% ‰Ñ¼‘E<¦áQrHÉ‚Ð6÷K°V³™ÌiÔåg§gsŸ+®Àken‡ Àx£Æá”Q¨™~6lûUiÁ .&@ûU†Móéweá{uó]eî Â¥ú«+Z£ö4¤hÇsd¨RÀ«¬AŸ‚g艖*V϶ó ˆVÖÿ_¿xúÓøÉ¿øŸþôY`Ž ÑÚNGŠŸ„räÊ¡ÁãÁ%sxÅt W ´RãR6ÅÕ(6˜¡¶\È¿hN®¯±PMó­ÖVWÛÑ/ð†@¿°i¸B¥+«P {V]¹*¥¤á1 ¥¤¢YÆÎ?ñâŽâ ¸IgÕ8œÀmøÅŒÂENDFäJD2}Û†Fîü•)GkNCHAôŒ“u¨rÔ·…éˆ3Їô›ØÔ†g4*ñ.Å ÿ“M}YZâKßäŽÈ¹ÊgÚíÞ'¿ rPÐw³ë=W}2«Ï¡دz1žá–þûÎ1lv ÀÐ=&޹–3ûDižõ®×4x Ãf€¬ ——¬­90a"&ãÐͲîé?ér¼:6|jáÑûˆéز« ;§âj:Úz‘zW×( c˜ó:}½;ltìαoZô¡CÚæ§j¨B<¨ظ™Ä‹¾('˜ã6ÛÇMÁX™wPãPÆÃ¸JÆrSé ¿°ù¯hˆDb[áaF ÿ2À+M q–MC²ã? ‡ ¶é=jâ£4³#þ¸È÷´àk©Í>Ê p&éa“ Ôhb†¸~ i“n%%°«Ä‹ÐÌ$sµ¾c €+!„®ÂIÈüb†éä˜i‹¶‚Blÿÿ\ÝYïnÙvßõªÚU§vµ§ó±ŽqC ‘¸à.¹à’—Aìtnâ$‚Æ @€„ ‰8Š ŽÇŽíãsN5»ú†Ï÷7žÿöUÿZ{®¹Æýs̹æZÏ#.*$M1'êé´´©%1a%FŸ²>Õƒ'馗ÀýÄøî.IÔ7<ÈèTC8æmç `3aùÇ ž+ou1ÿƒà#g½#>[ÆD´¡Ë]®+‚/ê6Í µSN&»rx£/Në–7¡§½Æ`s%0RS™V^¼%"/Í«p¸|¬{ë“M¿*½Ø;…õÛsª³„€Ûk¢kxæ«êÀ¬ˆó/Ç-lð`“€¨¸{bNóe*‰À.Ú:äcQ´9ý÷Ó'y°¸3*ÃÛÖ&qnDó…JÒÝZ \ÚÑ«¦n«9hØ~ÞÝÝÉšC«Ç6Š¡ sj˜ÕÌÏ·@¯»Îƒ™È«òm’ÃÀÃ×5çòtÅJnâ'+<– [}q@Õa`YgÃE5rpTC±}ß©¡¹Z?ýéÏŽ"`û==û³?Ä’ÖØs †hŽ'æf¯nY ÙCœ}(q.FÀá”ß*8𩾽; ù1MƻˇŽZÐ E m—`t ÒåCW°O™š¸©<ñË`t@gRP ´iÏ#¹ºæcž„Ž¢Â^:ìg^¸‰µöѽ÷Îóÿãÿ_õ?ù[Þ ÒpÕaFŽ\’+,‰'Z;ËöX‡Døéôìži/àßCu;…a˜ZRN­P¡´õD"«ÔPýœ-H¡T²—¶ ü­­’†Ì= Ué*"¦x.ª ©w#TÀ_̲_-!6Râ‚…6Ä”ÀêO¹Ïº0‡&Ž«ÉgfW$ü±–[ˆŠÅÞ˜£1 ¤;8W˜Œp$©BâÆzêQÿ[T´áXžz÷0ε¨chumàT3cù÷‰M‰ÃŽÕLˆ‚Dˆç°µÕ¨„\›[Ñ×½E¼´ÝÃÁÜ—ò}^Ì^Ak:͆¤†$„ú_FKZf RTE QÚÊT÷[7ó(5ddê na··pèÖ‡Z¥é‚Oxö³åÔ/Йz!êAí¼ »ÿØäüß&9\ÛuðãÙ›°‘ÂÖ+ÿѰx€¢fYÇúÙÏ>Ä9µˆ~ˆÚ펜†7‡:ËboT£Æ1§Ë"ˆ:  Úu Øv\C’ ðîªË±ÝuÖÐåÄlnw)ï~L Þx‘½<…FeÑ#í)¸Ô ðï,múñ ‰![=œjPDè/þâ/ÐÔ#þàÿúçßÓýmîý°o¼_ 0 .›ÀoÏç„l¡£Ñ“‹6øÖ^Ø@ª×·Øpit„„;ñ<àÕ«!ØÂO9ŸÊãê¥ÔL GN55§±g¿õ[¿©ån¤2÷™ÊíçoJ‡yžÁÀorÙ6 æÕO^ü¤e,šm>dPiòéÝ%w9½ãX÷CSƪŒ^^[43ßõ‡¢"I¢´QAW}Ù$*©fÜ# Ô =¾ÌÄÙŒ·«4SÏ=79ƉVî¸{e¢"Ý`Ž€…º~ ¼ìRS«¬Hñ·¯ä7|ºï$dæ‡ âÇݸz8eêÆÚé‘rÜŒ'MË! rù(Wx£ßË,{/ixàYÍ‚B)W¢5¨»$Ô[°ÑÄ­†„ÖÒ¨!i›W.ÊØk—‡Y8À æÄÖOÈ‚Sƒ÷fƒ›6J¬)Ê&ëú𶎺!Ç­ Ld¼¿’}Ì$RKœM/1Fúnõ²Y;Àêfj$û¥q5ÉÉÈs`PJ Ô¶[ßÜZBoùÕÝ›7L\6`¤†håÀ¹†ƒq—á!Uóͧß)›MS#S®óíÙTøMmDlCæ5D@—îNR,/¸ì#„øF€ƒ٢Ť¾ù[tü²¤†ýV¸bÿz ´”ßdâ;}†—ÿCâЇOŽ‹/÷ˆH gt¯zp \B‚þ§vZú˜™”AÇ.оËôe³v 9Î7«¹œ¯§S\eHŠãÜÿsÆÔ ¿Ke˜¸ë1pÒÓtèóÖz ȉuCâäi3%=_*M”Áξ 3.ÁÂÀ›jìHát[ð\¨éP‰­ÅŸg,´=ãõ?ú×ÿ·¬_þ¿éC‚"ï‘Ìa¨Zr¡î¨yƒýuçÑõ;÷À‘…³omy†Áuo°.Ó—ÌOc5dhgH0¬_Ȭl]oò7¹ JBË!h ·¡m÷|ŽšÃ–—M¬ƒ¸@‚«Ç¿ÈúqCA[ù%Å(À™²6¤¡þ2þ‹Ìê!9qfµÃ9ÄSìÝBîFcÛÁ›Û­I‘ S¾ìȈƒ±#ºX‹Böm¢+3ÆM¿±äZµP]†i¨©£zú8œ .U™µŠ`‡Pµ«hÁ³2/‰4©[“UPÔ–z}pª÷Nn§ìórô¹Üü+FZøî…WC¼Ia1LºãsSæþ,Ù²–‡ÞS¯Ð|¢I_Û{m%O0ü¼,yKÝÚl±ŠæWaÙ¼F=u¹0¥ÉI‡sÄÈB Êê$†Þ4¢ñ½>iZÞ£+è ýäÅ'=^xšÛœ–RHqìkI•¬BñÄk[jˆüÁýÀ9Å[ÄðÐSA÷Ýž×’¢Ð2ÌûqâVÁ!w¨qog/—HÜ- TÐðÎna°³26<°Ã÷ç_~ñÑGŸ°ˆ‡kº ì_|V G}´è’ËŸ0|J€ÇóiLÎ@(ýe#ŒêoÔx³áûï¹>üÙ«ØþÎÛ=ýéOú‡ø‡õi†6«,¢ ‘Ü»ˆ´µüLy"mDEì6Éö¹½bmÖ4¾rìExŒ'æì¹Ô™˜ÎR“ŸÊÇùéDYC|»åüì÷~÷w3£4Ýlpr)ȘYëReØYÈ»i_YÒ.W²oöfZ-zõa=á€Ó°¡×GMï…ç˜Àžte•%:}ªS¶¹Þ/©•:ô{¨­WßxÌï-T%¡HG_þY—RöÇW¤/A)‹Ÿ_%‹æºÄ³©ŽŒ°Áìî”R÷Å¡_{-ÁP“¨‡áôHøéér’ânk¹}ÔDæÐÖñ²Œirñ*ä |í%|Å—ßùü Y|ÆTˆ|˜–È#!ŒAe ARûÓÿx¡*žÑžÆZ/i:[,¦ÊO4•ø§%ÍHSü Ãq¾uQ`w`¬ eR§íõÄâ»Mù"¿€Ð-×|ãM; &íúIç}°ê;"´ÅK} -+ ÇšP£o®Ñ:¶qØò<º…¹ ­¬ð†¬íRޱ‘KUøšÑzÄØAâ:Éœ$"Ÿ±Oº3³Ùúõ·ðß[®€/®iè@K »Gl¸?OSéHÛÓ£Ê]ÑLgBS·±Fì^× ¶¾Ê–  ¾ýgG"Zu*Ï>x¾ß‘,—1¶dÈO ô¥(`û|Æ Ù† üó·ðé.©oYEÙ‘æ ¨ØWbR£ àê÷š.]Q#±xÂ*ÌÚéf áf´çŸüH뉩¢ÏÕø“°e¶¼7ymÖˆ=¬¬<®²©GÞw>;ª·¹éfz­ú²KãJ]6ŸÓ–¢‡wß~ëßþÑ¿²ýõ×þÓ¿õ ¿ð t‚ÕÔ¸®ϤH‡å垦ÑZ𠈵Ÿzíó·ûtuÔ¹Ðá’r®^™yOujê0.V¸µ»'×Ãc‰JÅz«)¨(¨Pé®úiþÁþÕhr*Òè'¦j GÆ¿ô ÀÊ©‰‚•W¿õœŽEÑeÀýÝ;—ÇÆá„è‘ÃÒRä˜ÜRÇËú£8±z¢Á߈!ÆT{aÈ1qêå‚ )ÀŒ™<ç ðó eÇiìA«îR¿JT*Ô—Ý¥ãô æéJ],Ü\Zì,ø3s’¼©s(¹Z_Eú”Ïj]Ï{¬‘<û€$Ó[ é)é.Òy\¯c7ƒ­—X+ÚŒóÜ€Päŀ±«+;kå¬Kǹ,A%GUë…£‚gFÜ\çMwû)UÑHP÷¦` 6M(Þà0}™Sè2èKàmÿÝï~Ï­²äu ÓS¿x ’ô~åÚ/Ò¡uÊ_ú¥_úøÃ²LvKJ¼ß;j÷U©•²àÈgÊô¼ä’$j<¤!FèÖ¨Œšs©si‹ggÔ ižÓ‰Â!w¦Šzö»ÿàïñµÌÔ 5{¦¯¾þù I¡ ">ãðùWõîw %èIÛœ¡/Óß:Gƒk}l¸…×MÊ© ‡Zgê¾¾ñZù¾ƒžñY a²Ä°H$5„×ð,Ñ4o ©[*å8Œ„8í[6þ…‡º7Y<ÄÛôÒ‚$?@”¼0À}U%›Ûã†ùð©Õ%ºb0Ye–ÜO½žcÂ=4we<´ˆ°ÑQÛ€œ}Á„â¿ðÁô­n …+®áY-g –Ó€~œ¡«u×¥ùãËëOW—ÒI!Àms¦æ:¨ º(æuqhÔ”ªïí^>p—õ¥pš>Ó/+ˆ«KtT`@®L!dœªÛ ¯ÞÚ¶êèG¿åШ{s¹?ÁsM)ضl†ÃàÁòt¢L<ÈrƒÞ ñ,¬Á‰ záGÀÀŒnsÀÂß5wIjaKô3>ë ¶ Æ¢¸æì.)k¤ Œ›‰´¤ÊÙáÒAÕï¼ý¶V'¬z¸é¯mRaÛØ†á©Mýƒ÷r_Å^}‚º ´4ÏQÍÌÚ¯ŒÁŒ´G¢0†¥.¿ìK0ùã¿„Á¥©>Ågzv6a‰ÏóC`nËãµâÏÆ ßG­Þóß¶ã]ggYe÷)J«©¨‡eT¨œV·Ü{ìQÂÑ ÓS³æYP{×ËôŠDÂѺ}.Z²»[jà‘'h›–ZÈàiô Ñ7;ëÙP$¬N½öê÷¾ûοüðŸýÿÕûï¿Ï:Ú€býÊvÔ~òˆ;õH­Íz<Ç£’UùRñ[ºÆëoîœ0£ó­Cˆ:´')aÝréÜ„jõA?Užø´¡†Œ˜QpI@+ÆGå³×‚ w-çÓnuaœ¼—šÉž3sƒ|í1#ûõdœÄ0g´xZ`xZWžÈ$ÈÐð£‹Äq~>Oà gC¡À 0r&('QA¸ÑÔt©µS²Ë ꑯéÂb£¹εÊî&­í屨'ÂP¶RȹTîì[eíµJ†/•­¸"ÇÁæçîeÎЧŒÐ\«•ÅÃe ¸år¡éUÝdü4o´†aY KôŒôñi0u³£1áÍïXøyïý÷ù™äunc]ç /”aŒ™(YsºÒÖ¡øÐM¤:¨œ& ®| øW+þ ;ǧ8lN8hOxqÌÜ_á”ï.~0yhµ…Ø Ee~,Œ8E@x¯6—ð5{)¯r@¥ »K4«Pš¨¹3´ŽÛOl3>Aò*Æúîûï9kò«¿òË6öÿáþ+=è?ø¾ž cÊO Z™p>ûô;:Ð¥7þà¿—üŸ¥P'*ç»úÍ-œÆ(ÏÇž| «§“Ó§æî:kŽa¥eçÓ» ŸýÞïü6êîÏÚÇ#M„Ï¿ùêÓû¡²çßyKZíû[ŒdpÈm"Ð4t‚–ð"YBMÍ¢Þu5õ¯=óý^'…\ÃÜ®áwE,.+>:WlUÝÆ[Žø‡.jã&¬®¯ >:çÃé¹0þdPJðÌ·¿%R;½ÃÜÔ.Çåß”5»âSçanÍ`¡2… 2‡¸‡kx¸u¯}µ·c€=#ëa–ŒHž© k¾Ê£bY¢Ÿ—Šõ-–8Ó#*µf*úç?<ý•„iݬ<Ò#¥fÛÙ¬ÿvå çd' r„·ßy÷G¿øK^õ4×Ñ O>ûÄ¢µ_ž"í—èɂ“W3쯲#°0ãª_Ç0Ã'ˆ-"²¾oëƒ[Pà 4OáìÅšèÒáújƒ™V,¸å@nÐÔœ8ëihò¢’3`Æå}°»§U{G†€XÀ˜ÔÁM^Ëà´0×ØÚ†°bÀ$hšÁøXÿìej)§1Ý”Ÿù¤qôKZ)ob?ÒŽK>àul>ƒJß:ªc0Ò…~YE¯#`ÿ-3·›uʽ¸4&5ñ‡Ïj¤z}Y޹ÅIã\o*…»„ÆOL¡Dñ­·ß-â•üqßQl”ù‰ù¢\!çÇž2®¼É¯-u>[ðë“HÞ‰ñ ¯ï4ÞÌJ”¹Ü>ì‰Ïmih«‡~ÞµñÖ¦"˜³"oÈ•LŠ­`ií郉¯Þeð¥xK¬á 2 ß8$÷ĬØûê¸)Íb™¼ïØ™ÏqJê;[±úê+†1/^‘%O˜oHgt\á¥ÀšïÖGüÃ8ÌÀ !íÆxK¤—Qm¸¥Ùü7}º°”HÂùª#¼%(÷Y›¯_ýô½þÊWŸ?û§ÿËÿü_ÿwÿ½$Ĥl«ë˶»‚Y®“1à—¢NDÝÖcÁüÓ’ç&~ˆÍâq¿VÙ³€"@ œ×tòJehù<Á‰t^Á±©Õ ÉÖ. ÇM'äna!¨ CJNIJÞ4çË4ÁiØ™êK KÒ,A_Ë`Œq`Ž·À mˆ_~þ‘G&¦ãŸ~üBŽÔ<„7ôk9~ ¶Ù`¡¸÷X™ÒŒT¢ kèæ í ¢¥"Û˜lõY¥9Õ[ûm¾äÀz:‘•Êœ¼­ÜI–£}SЛŽìO@^D‹öyògöëé´À3to—ð#5ðÊŸDö¼×Ø‘¢„ýܵ®DÏ›¸ VkûÔÍf /ç*" :Noê …Iâ¯Æå㡇­Ê¶3z#*’"¾h3t˜éY2>ù´žÒÄ4[îkÌv•õ¶,—0©Wš~«_g#sc =’Îq%‹b£¡§Qƒ?îÅ•04ù°ÇýmCÖãDEƒ #çZØYŒó~4ÇÒZ_2k¾GPr!q/4»,&KÂÐ:ƒ²&×ÒÄ“Âço½ûÁGÒ­¡AwüøƒDû|ÿ»î•¨ “úo-=Ñr@‘§^ +0¨I8vù•ÚÁ'YPAwVHøx “ŸªÇIAºÅТõa†æ²Ÿ¼Õ¾xá¦Wµø3t¢´æï¿ÿ]­rË7ŒYDãJ…P5V¬d:$ žØêkõA˜¥\Å´ÍI|¬qÕ;­ÛâÖ •…² aÌçEb׿û“?ÖÒ} ôÅ'ïùålC»ÌrqÛϘU‡ IDATý=Ù¥U™ÏL|ö…pÚ×öm /7ëYçS‹‰d²ðGix#ˆ!^‚µ1Tw¶2B¾~öwë79ì´V¾²D¸÷7 ,>÷ñ‹ú*ñ·¯Ð ì¼d™–Μ^HÕ*k¢ùýj?~ça†6±1€­—î5,…—ð…jù²øÊ<`´ìÐÖ%ç8¥iîÀT*¸É/ÝBË%ËâÓ—úÞxÞ+{˜7¼á‰e¹¬ÑÁ]M´U9*éóh^îùz÷7Eæ9%Ù°³¯Hs*_ÐÊujÙ«>¸rhî®oc {L¤¶€Ì F~©­ï'Ðê³T&r‰ji˜;Ižšñ7‘Ñ(‹DªÞ‡ŒÁ®µî3Ôyª¨<…OÒä…0<Ö\ulð£¬eÌ«V0±°Þ‡®œkÑQÃþ·r`YÉÃQѧjµ£µ{#ቇBC†Ø’X3Âí Ö?‘Õ\¦AN­‹‡Ö‰ýx‘èÖ¢u1”ÑE gõ+Æsöð· ¢K à4À]QWÆ[üì"œŒ`?}ƒ <œ^’î³½Tf åíw¾û³¿ø‹?ø?ÿ·ÿò¿ùoµå Ór­2ŸªåÙ'¯æ0Ç 0q«¡%RŒ/¦UÃÒÔ¨ù‰ÀkµÂ+ÂoD{ôô(¶üÂî¦Ézí†È¯Wâr€<$µLÐÖQ´½¾CÇËrQk•0D¢°ó5刢eŽèËàñ.Ú÷¾÷}5¹ìÓçÚ•D¤†·- ò¶sÔH°¸ÜŽf!K!åˆnM´0™{Çðìrñó‘ïBÏïŒgÞvΖÍÏÜiÃڳĽlÉ÷uoÛÈ^éZ¢òëá_‡R@ô¨ÏMzÝ:ÇÇq8c‹n5QØÑJ üƒ6ÿûúk]o`.£Ý¨¾É¾ÒÃèRs•Ül©vŸìryfb=lИ›¨œ™ÜÂ?˜µŒ®[c’zrCø<‚ ¡ ú¡Ÿ-£‚T£þĹæÔèPy—ØÓÑ|œÝÔNê¦ —@ÊRcŽƒ°šÆöìæ‘RXѹ»BÄ;ï¾-–±g ÙS.iÆÏ†à§b•·ð¶¨ø¶ÞœG ÙãŸÕ²§¥muZ(£7럵H9ƒDs:A€€ç2õ®ÜíGr¼FfjP¹«‰¦¸Y¿Ñeöâ‡ÿìŸýS9–½\˜$Ìüó?[ÒØG},Ôäûvƒ,…Bò“ŸhõÃ_øáGûAù%Êh$Û2]9º€®§“Sß!óB«ÿëv Áo´åºMGtçtÍ{êÚbZžl’’ÛKÓbà³ßü­¿Ýga¥ÍŒú„¦@¶TÜŽ¨l“­¹òw¿÷}™V:7v úã€Ö•ék¶¼S1E%uŠÈÀŒ5•蜳@ïÐÍ~gvÄ¥V"?f´Ò˜C… .iiãÜ"?8û±(`Í)º¨×0Q}`ˆõV×Pd3•Œôò¤ƒ¯ŽtTF¶ ­3´ ¢ùÜÖKóÊ n˜ Œgº“¤Z(³„î­IRwˆqEσ×ä0¸ÄÃð=,>y˜óŽúóiU…q´îk%I»&â‚Yø×ÿù«æ³E݆Œú©…J žF`gñŽØÎ—¶Ì•]Ч&'æ±A'H»«RYÁÀÆ‚D±nÿ™ÏÆS¹¯K£80ØTÍdIa—«)í˜t%\&Š\j¶ f§Š¥Ýzdž&ùÚS¶4Õ_ë à î.Bar‡e¤ÖüE´¥+ݣá´5N¾mY—ðX_qm«€&"fTõIÜ&Ö§Þ­ƒ9^á¤1Z¢wÁP£K,°1"˜e&´€¯âø›ˆPH¾õm¿ b®½ÿ*ÏÜ °Î(²Ã8äBEhG«*#½$ãÞµÅêyZEóEFzì–áª5=þSã@èšh‹PlèõmYO\¨ª1 ¨§”RHôŽ·¨Â™¢uB t> Îæ¶%Û×=h‡ VÿäÿèÏÿô~õoþç·TÃü-a–Ðìå|q®96Ží8p`Hª!D,2à¶,\ZÝ“hÜ5=pä7K4%¬ŠXíÿIw(˜ù0û¢”ëÔ¥˜ºÏÁ“`ðù[%¤nÔ×\$€¼àc§@”6®Œ.?EÂñ.2Ì€‚Â{L¬eK³5õäËlV|®s>d7ªéÔb´‰T´lì„kü|÷­~PÂÄ|âá÷¾÷]é”𠕤Ÿwß{ï‡?ø>¶9-ɽŒ00n?OòÆ’–"‹gŽî‘®`fÃe`‡nò}‚HõëÊæv/-–ª¡¥KFé]wq;ž‹ÏjŠ6:QK<._}ö»¿ûÛš¹qç+ÀÕê]ãeŸÝ3úùêü»ï}·ïÆôA¼Ä8MŒT³,Ûã”ûVÛ…Íðh¹ÃçÁhTXW‡ž}íÂܵ=[º¥7r¢ñÝuÏ ñ¶YŠ«™øu—G…›’MÏ!¶ƒýN´‘NGëZÅMêêgõôòHJJÐr?ŠÀyÔ÷\€ž™LG*èliŠþÒó"¬~†­†„{‹]É«ìXŽÚO8H«á÷§G‘Eߣí…~Œ¹Ô–ÒÈ¢ìÐܦ]€SƒGŽ¢9ÒöŒB05Ç•š¿j¾é¶¤îcuó‰©%{…ß?áÉ]ðŒ‹GUO½®ÝrH2ºœêzbèR¦ Ö`s9çã*XJÃyNAü¡xZM•Ýîñ®.dÄÄ3Zy”¬áÀÄ­: ÛÐäñQ/Lt9+Pp9Rá•2C¥3£ËP ·Äîñ›­6À“h– $ÅÙOJ¼p°uàö÷­p¨ücHaŽrð;Ô-峬³Ý­x£ ÚÖçûÀæ>.Œâ7ßÚÆ¥ôm´½•æ7öÓŸÁ$²8ˆ -§p¦n8Áœ¥æ­ ²†‡_4# KJøŒ(ƒSÅšƒ±ë’X<Èk<¸Hs¯´+Ž˜ 9§_À…Y90Ò|ÄŸÃ^†¨úo3šÄ#¬0Ñ<õà¬L¥&ÖçÉxCHY_ÉQ N)ÇäÊËžžaùzųæ~„㕯|¯î£·ß7#ýŒ!é9~qàz4ûÂéˆÀ&~Ê|Ð]”I9ô‹ž:Â4ó}º%­gd!13þýë2mâä™Y+:ô@ÙîS»:0LLŠâéõšIƒîP‰êqæ*ý뜰¬Ñ}j¡.­š¨±çj”jöÀñi½?&®ŽCË:Ø3¢P±Jhë_å%sã†y•.zÄuÿÃpMê¥ë›ã$äñ©4ѧÌ}zÑjãH †ÀÖ-÷íhöÇC=eG=”@ |s½Q L´>|ÀÍO Îfâ,ÂLƒKyÑ‘˜oœ>1‰Ò„‚ÓÌøVƼ3}ë„:aæœ!4äê¤òL<Ÿ£˜¼›E7äBðUò÷åÌ*!Çäødšî¨t¼$TWê²pG[íßxíñöè±'˜3Á¹¢KBM¢Ë횢ˆl_fOßüä§öçNî6—GàÕº¥ŒŠŸÉ;³ªa^œßò æ5‘°ü÷Énäh¤7ÜP º`@j« áR%01FE/5sŒxÊŽ08ÜåQ(4WZÁ/1T)èÜôœ0ëD¶TŒ¢‹dï4ƒ: oäbz>ÿÏÿÅ¿ð¡2ùλï¿ûáÇy$jçƒ_ÖòM{w%U:²å;…×ÛݳrBûñA¹+k‹¨2Ÿ|Ã^pžÌŸÊ"töi©ì¥ÝÉ4‘bqrrÛÙ{ù7o¤œ;0‰CÜ:2™þZž ,â16?{öÿáïjàí€úŽR~ûF{ºé£óoACÔl«¯¬“pIwiŒÄƒ©¿nûšÍ\õF—Zá³Zãë*ë߸>ØU‚-!Õ4@èׄÁÎù„ õáxÃ!àÑ$‚&”£ÿЦÕ6Î.€Ú˜²3ÈaH|³a>„PâÄZ‡g0 („hK88‡ö±C𨇠ƒ÷ÑN^gM°äF=5ÌÒ!õwhw.f³ª¼39ÃcsLv¯ï$ĸqR¦^¸Ðî–«L๪)b9\þ_šò“qÍ $þrúGKõc”»³`.ACPfý«Ê2 .ë͙՟2‹ $W‰™!}ðù›žráÚ¦¿ kLOš£ÈÖ´riÁÖIŒéåWô“QÒŠDJ<€9ǰ84æs0B§ÏÅöQb×ÇçnÍ‘|:B4{¡U—­7§ :ÒÒ¾á‚#ÔGʯj‚«)¡V‡A_‡Ö.")2¡ÝõG¨f©·éÁó@îW^ÊÙûóQ\ ¡5ò%U*s‰Õ+k΂oZŸ]ŠpÓ­ÔdáN¨ìGÀ €'¥P/ÒÚ%¶ÏçxÐ]':¹ ­bÛ]‹Çðá+m±ç/ul:7*z ïãç[npäô²ØòžKgÛ®ZI‰æ®ó>+_^Ž1ˆa#Æ”!äKóÃô­ò8$>·,¤^Í!z8Ò^žxT>ž6^4ˆ œš(À§½¶ØS‰ ŠwËV'ðƒñ]ÀýèGÔõá‡Ð ¯ÿÙÏ>þõ~þ«?ü¡ç€/ø¶¬áIF²†‹Ï0ZR(ój³A Ò<ñŠP<ÑâSÁåãßçêOúáŘÕ3–9*3=û­ßü`A@íKçÑ6C€î=Â̽šÑà„-‡ö°·e¤%ÏÝúMïAÖaô ø‚ér5Å8™Ž02|DuŒ;ÔsìÅËz΃ï¢n›,H|ÒN).E7 Ï…ß~"ŸôDz5a1Ø¢wÿLAT‰ bò×ÚZ Û/c`@'F{® GO:Ò(Ðê—&ýöJþÕ/"óÆL)Ï ¢×+Èp²ƒ‡ÍÛ7\ˆë<¢ÿö´T÷3£&·B:ÉWú@¡ÀÜ¢ˆJm»µd÷Ú:Ã/+Ho ZBõLîÁÏqhØ¡ƒëJn«.ºjŽ1çóvÏË#ÇùŸQtzÄ™‹0Â?Þ8˜¶&,­8lÔq©íñÆv``3º80ö.?»'tÑyM‰RøÓŒâ$=—s¹°ÿ€4Œirä´+Üá[%fÚ±Á‰øyÜ1:<8|(„ù´RpNRŠº63ñ²BÂüɧö>6©p@h6ÇçÓÏæ¼*©EÑζê¾ßn† i¶;`8wÆz7’E,¡¯ÁVqª•%GݸVÓy°ÅÎÃrz†jMb ˜ÝܶùµŸ’ ‰Y%ù×P~Ž‹ÑFÄqØh[ò‹Šì¼õÄ~˜8Gñ0°ó(æá ™„»R?ÇÒÙZóeã ˆu/™a`œÀ£'óüEËÔ[Ï.tÆpËçÚEgœÛ\ïu"òÁè ƒ·D=1¿ÿýHònXQ€Žrüä¬' I¥›#ÍãâK,| @ Gjxn ëéÍŸµr@4µ£˜±e6j $wG >ÀÀÿÄ^Aµgï7ÿ¶ü¿¥&è Ì]%5 ÷…§›üÆCP—d‹nƒó6ï¨êÑl¿1Ž/­>] ·>•ëÌ Ñãjà™Þsw·’=ׄ*3p(É ÷‚£üIʼn‡Ée-KMizyÌÈ!O9¥í=±pä2ùAœ0É) jà§‹1£Ãï³^Žî6Êó€Ar¾âl°\ÿ/+ªÁz z^õÆ ¨l4D¼‘û)RgŒ'Ò×Sá‡j+8²ØÆà(2Æ¢[*X8†.Ýͳ‰óDy‚Ôu›>'wñ:ù'£vÛ w KÀu1zØòtf ªÍ4Ǫ»Wp~ÙE÷ª`ú‰Jz¨£hPXæ\%G0©4­âá¾Ù| éE€t´£1ïµgü‚À`:Æ!›s¼xö83éEWyÉÓ4=ö­9nè,…\±rºžL|–?BL.qåö¦I-Ò$Ã9»+£(O(2Å+ —o;x§»× à õF”»‹w“h/Q85äpÄZù"1=y4j<–Êu"½·Ùù§vÀd ÐWqTCK_l«þd†{Þ´Ì» Úò;w)þö*iOô°¸ù˜…_T{KšA ǧŽF aà hw‹–èà"ÔæQ”;ë £]М¾ü¼ß‹OÊ·†*÷ˉÕ÷ßy?rvOÐô·Ÿÿô§ÿþ½þµ?û³?ûµ_ÿ­wÓ_n]Z–¦˜DƒÇ™æ¸2p…n`gq¯ôú@üŸßd(·ÆÔÉž8–ßX$ažû ¦y8êŶi»ü•.yE=øEÛ.à4åÓ æ°¤RÃó•Žÿ“Û$ŽƒWgCØ'Ÿ¼ð¨H:+8ß›¡Fˆ¬Œ£Í©Ž1E0Ùƒo>Í^¥P¡¢',t²H–ÃãusúŽqzÓ䉷,ùÿ'„OO æKnq©0h$ÅYœc:Ô[ù£¢}˜oAˆ€ç?Õèé¬AÇÃu´Ü,ê-Å5ªÝ­cÌ¥{<760+;ÈK—¥eÛðä’pëhLÓÂØj4m¼4Ñb'È/1¢0D¸´[ÀðCáØÌÕ–™9»ËýýQ0ö¤ €½ì„‹àŠË©GÀÜiÛ¼'¸}50@RÌܨӳó)ÁYÇFD Ý&þ“ï6  «!x—€­¢½øøx² ®@âCp:ʲðI´ïò€Gä¦r³;'EIçɦºXê-Ô+@‹wësu=„ifØZ•†S‰JÒ‘^Xz|ÇKÏðÔ{¶Ò¡•gÿ«^ÄÕ‘€WlÁ{ÿôÿÝ/ÿ‡¿ÌnÙ£f¯"g{çÝ÷¸, ÑJ]ª÷¥>e*"ãçVÎБ™*0ÖD÷ëÌ·NQü:AÀœn€9s®—Ù!I1)ÀX°ØH‚¤’7öÿžö—ðj%á ƒ~&zxX€c1Æç8þTÐK!¡V|„´$á0ToÂcyòö`AkÔ<;A‹(©¦¸=€û&Ÿ&•¸weš¶g·ô­ìx)¶ö1–¾D5‚­&V;Õc ¬Ç.þAŽÏ¹{žqLs`.“ú¦ÂÓ»J·|ùñ›/¿½ôލúËQ½­ÓC1é“~DéÓ§wŸœIq’:SÎO½aÞÊ?er°ÖKÙ7÷¤–å®ÖSn‘&•ÂXï`¯EÛòà%ÁЦ«:¼/v0¼ 92:SÙ!Q6<¤C90¯˜¶7üU7õƒÊ,þÄgã±áë'×é퉥FS§ºÀÖä!I Û< ÏœÇÑçÚû” dÄóovQmä#×b™-vÅøbÍÛpê`Ó &3AÁ¶ÞÂåõ.ù}øêºO¢ƒ£jµ‹ø€‡ñ.ù‚×߉¢g ÐsIµP¹TÏ‘GÁ¨ÆüÏ/J}¦ÛÓ1¿‚XüÝEú3)¤ÏÏÕëC°Ý%€:Ëz ü Îçf ‡EŒQ´·,VYø6l(¨Æ›·Š¬·iÎ×Ïñé¥t~HÉ>ŸƒÊÁËŒ}„Rã X+—BNÉûÜ6¡^Y²?ZÇY’J ”ÿ¼7º¿’Û`×6 `0Ó']3îmâ''lô¦çºœþ2q •htÚ`¼6ÔP?Ÿ¼øøt~ÞÎ=ðÊ_cþS¯”>3R}ùé?ùÓ?|ç½çŸý¦/güÚ¯ýFk}yBSsÍÉÏè 3SäÃzΡ|8ƒ—ݼ•-ÈøØÇcSAZb£tâ±ãÞ{M  «$ñˆ$åP”À… qšgoèå-Ó*“RRQçúQ‹prÀŸ¤Ç'lǧ3a[ñÚZïÝUæ:²…Ÿ D c¾0€ 8èIìöÕ'`Œ ‚ ‡K<îNö è´‘»nË`‚_ʈèÑ"`·4 Õ5ÜÝj’”7¡’e®ï¸ûÒ µuÙ`µãð€:ujîP¦=äÒƒ°µÙ²+DéÌX À-õBâ Mn nQã‡:Î)3´‹råü}8#W¡8|°À}ü¯À‘„€Kú½d,!nÀ‚6 ñˆÊéÓÝ|mö0á·Ù`ú±]b0Þˆš8Þï±€’²L¨Ìyf‚S=€“·ÎòUñ {c±¨e…Kš€ì >Vóô+sðx‰c_Íx­eðÒ£~1˜&\—6¤ê5lÀ›WCë.Ècõz+äÔ‚œJÀ`DÊËJ7p]g' E|#µ?¢¨/ã÷öŠà‰SBñü-Z–Âþ‹?€'68‹6u,¤\×]M $)Ðñûg±÷Þ{¹Æ\1„äì•:—RR®ªé_Ð:|4KÖÑlLj®X%üc»˜f`íˆÆ€îê—trA «ˆêärÀ9¢ gšgÿà·ÿ>ÒN€F+=C±¯´\5´}æ ·ˆ<Ý÷ðÿMÉÃ~>¹èé§™£‹¶t|*à ›™¢Z ÔAhdÒÏÍ#×Yó±,Ä; †c‰€°"ÖÃHn³“Bˆ[ÍpA 6ÚùÃoavtÓÚíîêþÇŠ7NÎZΰ9PäG&¯"µHáAâ[ÏuH»Œƒ¹¯ƒZ©L|õö8X}'°ßL˜B™–Bˆy÷êY uÎjÖ1Ü=Ou‰Ë‚1C.RˉÃf‚."aŒÑÜb˜5 !?*ÈšÏi"ÐN!ø7X‹MoxÿE¶$NµÛhG½’T:6hGùqÀe'áG{ÖiZƒSÓbZ_ªQŒ×¥+1Â諭ÙÄ.ó,^kŽyúï)Ç™DDF7] ûU©1Ïí®öaˆGJäEœX:•b‚´ùÅþž ©'øp«,°¬_ÿì'}ró\Ÿq[Ïdz´Å,¹Fíº5.æZ™ã+á­ ³|¹eá>«£€#Òoâ4ÅyÕNÌ00o§¯!ïÐCtPì1«yE;dßzî».—í¬'šƒ¶˜fýˆ ØO‡Ûç¥:-ÆJ”ZRš"(ž¹‰i¿R?Ý÷ñÃøö”БßzûÍï¼M!ÙÕ9O‰âWë›{;ãö‰5 IDAT°efßNæÍ²yC=¯ùÅó2£¿t”=67t0¤ž½, ˆ™NRö¥[ÈizS¿÷dÿâE¯¦âÌþ•¶)°~ةӖg6B»Ï” Žõx[Ù\PJyÎ ¨H ,û@®•$ý·§/XÒ¿¦›ôßüök?9g#³u»%úm.K Ÿ?û굯_{ÓgݾþìõçßùäÓ>üØÏq¼ø~ý×mýœ–¾ôŠvkE‰VžàoدÐv^ýÕ7☠³½ ª¤w2b÷¿6áèû­Y**h­Ñæ±,Á{š±ÀÆÇD³â5æ÷ôSAóE£’Ô©(»7ìÕ“Χ#?­ç²U¡_êÙ"=õU?|{Ž6å¢YÝqnäÑÉËhH â'/úî;ŸôOƒ”O™œÕ^¼h¼gr†ûbM`EÈ]}Ÿ-üô cøe£†ä×üt„”ÝásV½µ*bðx@êðo¶ƒ9DÍÛÍ#ürm-øL+UæîüsVmÎYâë] ñFÖ7å²™ƒg#ã˳/¿±%#]9¨ÑŸðq ‘æë‰Å(ëµ- 6¶¸ :øòÈ)ïçbútßkØe FéŶ¤s庴ˆIÒÓ¨%Ù ¨ÉFmfè.nÿ@ŸôìÑ9 rš¶ÄÙ‡RÝ¥=‹í!ð*n1¡ï€„gÑefDËæ}Xõ(A¼íYnÅ·žÞ»ðŸ‚Š´¦r ø¤Ls¹i&ÇÕZǼÀÅ´ˆ§®¾ŒÕ µ kæT*Gºà#áâ0¬# ÛÉFþCvé—gœ€8|*² ÑýÂ/x‘P|“RZ]‰Ôº8Ii©(Ô÷Þ„Üf¡¬Çf܆lNe¦nؘUºlDU9»œÅÇ'A|2Q>º(±‡›šd»-Å+àYCj9¹Ð%#øg÷ïüæÂ„[Å>i/a\‰Õó':¢ ê!ÕaÄä ¼ìjfÄŠšú •áüax$1jУ-0Nz¹8A¬Ã¢¼%ÜyX‚Ôêx½Ë ÈÝ©“‘LE„pœ ÎçÜ qq9ñw){k 2}~C![ëëU !ð0sž›‹¼"ÿõ‹b_mhIÒG·ÚS‚ˆ °±»b2ÙŸ·N9*èÙ]lƒä=&ÇÊ8ß«é䂵p ØÄÞj¤æ˜ÞÈ\ð-õÑUz@É^Puw^RžRxÈ­B:Q·. Àå¸.^ºäüjD VB¾ÑôÂìØèUÆy^Ã%ÒΙlk× €)$ï,8zwƒ¼r Šm>d6Iåxå?vø1'¢’u=v1?X ¿;ð;pâ.¦p‚L¨±@3ÓÎC´tvŒåÞFÊ¢¦‡N~Ú® Z:}î»ÎoÕœrØNâEŠvi—!œx@“ø€ f.ÎÇräuNɶ¿Þçp!yã§?ý‰"@ €ªó¢–@ž Ž÷AÌHt^pÆÊŠV7xgãç‚,þpíºØ(›jÆËkÓ˜s†ðÖ™\"Á‰–¦v°8EwQ÷‚8dÄêÊðS54­-ü.¤ jÒöÈ#y,ä`Kàêƒz)§Å9.¡½x¥YÓ§FÍó.£­oB¾âY˜d¢Ùá»oKdßÿó?ÿÓßøõß6 íÁ‹¤vo4Xæ{Ç$ifG¦éÖr¯ÄªCù³Ã ó® 2)bLPÄ)ñ4˜ÅYÌ1¦×mY$ Ý+ª</0*«kĽh“8¬3¹B{gDƒÜp­`V)ÎÔ~„§l0HHÐSv0 -Ïÿëkl­ÂÅ/ÊÍ‹” Î6?Ä;åøìŽWÜMüü²E¯ßk…4®®Ÿ¢yKã[lh—î^½t-8má°A?l60–D‘‹±€ËIP„ÇŽt†©3ÁÒ™žp„")*€_žµ:íÑöéÿΨ3/bJÔo!ü6«\€…a;ië€G+Zº[T§! +9>ûTäÉ4:^®ŒVj®ï wRCÆ-W©&цóDPF´»E\ÎM¦мR3fR8`‡ñ ó*õ8|òÑY^MvwPl,V£yÙþxPN®í2ÁЪ¡j pø§s®/?yD¾59nÎ @þ7¡5ʰ ¤'>k@’Cm‡>ßÓÊ-ªeú‰ÞÎË‚õÖ›Ožª·Ã³bÞèHüœ¼CÁ¥<þ4|Ò9s6gxÚ8…3<b[ñnþk ž'0œwœõ;äÝþÚu~Å9rõkãR£ó1ö|›\JuKXÆ ré‡''Åñ©ðRL5aëÖç=Ç9é®m¬áé8Þ„ *càÑáó!qØ£Ú[þeoø111émYÞMØ“K»Ü4 >%SE'$P¡|gq hÊ~\ós…„‘-PÞ¼+C#êx"Šßz ¶‡PÏ¡õ–ÃË®`–)áÙ ˜-x†X ²C±0„±ñsZ -l*!eŽ?Ðò/ñ¦OPמ?Ò1Ø£_õ`Ñ-²†‡™Z*öS•øou­oe Lº¹ßØö-œOÄÇ÷Þ}ÿí·ü¥_·è7MyÚ;{+B€&ÓУ{¢‹)/儌èŸåëÀ¨O› K ‘ ÷îâÐAÉÊî:ÿfZháÚ]žI/-ˆõ~RéRC`Ö)Ãt˜U±š¼…ÔÎH-«)J \A6i.ÅIábHËÖ¹°ItÝ'ì¹}?½òÕ«_¿ùºY¯6ž ~l Ú& —í¯ýJØpUŠBòÎQ;§îPõ(Ç­Ö×—c) àÏ­.³íeN¸¾È_('¬¶ÎÊð¸ëH¢M ÐRÖ¶š|ÀÍ” Þqùs‚¤(ÿž\‡Jùê»·…®¨8\Æä£U>ŒìÇ|(¾y –Ĩ«~\Ž€u d8ü`Œ½,R´DÓ‘qñ“;Y2ù¼(‡ êÎ Ý✞ã6·ZT^°¢S`ü$!æK¢.¯`êÁªr‚lºWÿšs¡y$bÓ=C  ½θÚÿ‡?eg,á[a~• âgÌðÚY°ÐkÜã²Ú5¼sˆv€©¼(­z•ýÕK ÔgÛ*#Gý]Ûcìà é g,`)Ä™|mÝZÒ©æNEj—B±¾ÆbIàXK@¿Þ ã2 GáØCE‡Á7Üt‹›(S)O¦$\¹ËâÈáÙÀ‘ëúj]³Óé}€n\Èýà¬fÁ-Yö«kðP0‹¤þ¥S—îÐÄ(0 —í11µ¢¨ 6ÌŸ~Hæ”fôhJcs·ð¹,Ÿ«ãXÛÊDÓð6æ:«TàV[X7…ÄÂT梯=ûð£%ÜÆÜ`¶vƒ»g ­ÀS”§ Ê8¥ãÃÆ!b·í’aúJºÒ1]‚w¬Þýöœ€†í«ç–'Ñâ_«6$•Ñb/ÎÙ¨ñº‰‘ç n—ÕRé.¿DèK2m7iYóœ@¢•š‚•­dûÖ>\‡$aï_mšÊ“'^çCàóŽÿï¡ÒñƳ7-ºC yg8¼0ÿÜ:¹»Ðº¶1¬oŒ e~œƒ¤UñÛ¾«AÑx #.Á,íl¢£†Dîâ< ¤ÍöñÌp›GZ]º¥ÈÅ·!,·ÐàŒORã­Oîåÿ.Ä—Ç*rÖy̱!pkm¨ægˆ}óyìÿã§?G«~Y®Ï&á!ŠßôÃ8)Û3³>½ž†è^¸á& ò ‘ ÛÚv< hy5ùÕɯŸyF“C§"詪ŠàUÞqåT=æC4Ó¨¡ µ1²> ­Kͧ1Ñ:6\z fR¾o.|ûšš‹;B‰"²\ ÎR‡–2ñ m ë",á €Þr~›,@ó¾d,þð8ãʃ 8ï]_iULÈÇ-…M¢è»çÏzÙ©Q«çOJ?ï`>˜GäFD㤆lôzÅ‹ -Üs!ߦ„þè?úèx`~:K˜ˆP*ö¤G@[W󬼅þ‰CÙvB¶MÖ#¯ÃÃ!¹²TsºDFH=º"‘1õÔØ-øÝrÎQ·àʽ囎Ïõh…ÏhKL s^¦l­~?¸ÆâœBWÒµH'\²®Õœ¡±êè¦ÿ¬-bãêÌÑЙ>_N¶=<ö0y˜åäÕãÖO•z¨‚[Z9»Œÿ×K±æÃUt0=ǃ™ã9Ü;äHQ³UÓ›2™á—`~2êà>N%3К&áõ(ùs;Eì@ô&Ç·¯¾ý×_|øg~Õíƒ?ùëãoxUª`¿·1p›®øŒî6-uæÊhSVóS$¥1¶9H"³²ZPâ4N`£jïôf‡½®Šjó§e™äKyŽ6exé¡ÉñS=Ùñ£²¶2Xâ8N-X!vªkÄÓƒ3÷Š'ÝÔ,ˆ*ð™ÞÇúôlRWÊ—ÜÕúB‹ ¶¶Hxn±Ø*,$5Á#ÊÖ²mÍgøêÎešë×¶rwqÝ­Ñš4d5Ê éÿö0d…‡Š ÑÐÌÁ 8ÔÍ©|nEŠþÎÉŸK‚ãüñp¬ÖÍÛ1¬çÛ™‰ÔФÆO‡æêÕªÃ0œª›]ëNZ0ŵâMô£5xöü´';K« hµZn¤É-'*óg>Gž±¾þ7ÿú_½øèc»*q]c¹Qáç9&+@db~çÑÊJ?ïýáGí1éšèjVC8/t0,9“?d…S001D%~\*â Ç— ­þÔË!Œ7o=ïC»*°h‰©\±Ë=†b¬‡h. #Š%Ì@èÒ•}§Cá´¤­m˜É¢²­–û (–1ÿÓÿZc -N¼3¨‰¼c8)Z=íF£^ÊeQ\ÄöKÏÈÛõ±PõJ ßt¶CHv¨¡3(œñeÞ­j¹2ÌÖ¯=ÆémÐ…õ ZÁÃÕo¶¬ ðoC[eqBs``ÜÕÊÝþOÿã?^è¤iAŸŸ­# B­ÕŒ6~mQ=ímx]bÊ–ºç6𷩯åÐ3g½Z&;ë`óø(u¬O=]͵B!‡›£0á‰cem±á–Jçbþ¢"ÄçNôÅ'F­²7¬là¼,Î^1h=†¶”©CÕ£ÛµP’ضœ¡Õœq”KÍÀïy6¶(¬·¯ˆ¼šh Sa‹¸dTœ«¤Õ‰ÆøÞ˳ÎqIK$$ ë&¦] 7ÒoåS$Õ²©—ö劥Œ:ó’±y‡¶ èŠžÈÈ pëçúk©G ×K«Vq•†ý‘®X÷/5 Rõõ ª˜ Õ^«°,²¬‡WãR,J”¸ï{3íñ‚¸&AfŠ:¤õÁÓUÚ™kPß­û¶òÔè®zº=ü8£­ó“ím†,ââX¢L˜<Þ–"3Ö˜Lp·\NK9­/yêÌÃiƒHž*»õÞ;ž „é3ÛïDH®…y#X{Ï•hfKÙ`Œ˜¥ï –ìùªýƒ9ØFkÚ~7š¸ß±‰F’åA¡&Ðd_SO>ãuï=Í9•êÀTBWPÁ™–ŸðFZn Æ‘Rà3YE àÉRî:â멳ÌÙ8lZ£;š!>l«U†JÁû² ºš[É1ÒêÆÑÔ=»€[dÓ\,‚õC¨7 R+æ[gÔS™8γòŠsîomþN;Nøõ·¯½ùÃï¾ûÁÿ­õÍ«ßùáF¹vŠÕø­­䢟På̈³¦s<ü“õ‹“-|RN8âg¯³UØØvmAæÜÓ$0ET&rY5ݨ„V+•<™†˜r`åëê@â€P½‚ši µ(«T.¸»¢™|㱸 GÑÿ­RÀÀ=§^¦¤ŸIb²óX2±9ÞPÇ'üÝ[Pɯ_h›06’ßæG*?enê[¼­w›)ä“F°aé\´4œ!`ðc*‘¿½fSy¯™‹ºDscŽ(ám6»K"Oü*·èJAC¬:Tº$¬n‘”©¶ã´}Ø"¿,ꩃÇàqæÙ—SösIÞÌ} ·$÷h~¨Âxþय़ýVÈ϶ÆuÆUSP}"ŠaÔñ÷WùÚÏûh†áô­·ßÉÅ1 Qkꇫ¾ôÍÈO¸q ^ÐÚ`ê%2/Ò²ßãiÌqN?¶£.ýÿÕƒ*w[Íz:°rÀY?Ñfg—îR‚e8S¹çê?)0{`F%wñíÒÝ<~?ª¬ÚÀHÜÿ×j±òÚa£“%vçá€?þè#¨.õ†7…ÑËÞ¨ƒVYŒÅ^B}ód‹BÀ`Þ¨zùÒôÆdlî"×öÜý™’xZ`xõY€Kó%0"ŽóÉÎnx†é„IÃR[ßñTääR‰ex RVéP3gˆ–¦0d‰[ ÒÍOïÿïý®Ææ:žÔôK$ñX9¦Ùž‚Õûó!CTŽˆ€»vú(B…¸‡ã[‡ËóÈFÚÂ!pÎ"îó*0 H`òd‹Ódkà‡ÙUlÒùøõ$^ ý„”lº>ð¤GÔ@åµÂ°¹l,á!O‰ÀÜ¥&xÔcÈ™v`à*ùͤÂÔ”Ž¤Ê´ŸQËòc–ŒG6šoÜ£rø‘æî ”ÒÆÕgMPp¢.B[z¶=µxú¡¡Õ¢0¶+E6ºX‚dò±M{žwø1OR¨0€u ˜Chr÷ðcø¥J=ÑŠ_ãâ˜Ô%ו™ÂÏd=a# lpž4tI-¨+8çý…r¹,K•¢Õ$5•(—æÔëh/ùQp9øõÚ`—ê©! œð»…¨H¥²µ ºÈPi&äÊi©ÉU_&ئE0ë ñ¶s­=G¥_hâçgŸ¾`F_à4…®”šñ^FEÀ“‰¹ˆÌìUs/]?f^}ÅÛLÚŸGTÔY‰Ïg{ 걯ÎÀ·U³×eÚýØ×?üõ‚Ï9Ë$± ]5là œŠ™öÜ|˜F¥‹®Ç*›«ãPC˜)EšFL¯¢l*ÛË€†ZæAc^7Ú¼t6¨rà?£‚«$Ž.*½–›)£ÛÈå¬oÓ©òÿ½‰R«/^yÝ/Y빘± ëµWÿâOþ¥à{¿ø+ t8 òçÖº¾ô 7öFBºcÉù$:6Ž•g5ÑŽ"Šîs*§X©÷niJåµ| ,î.æ¨_Mþƒe2@óy”¹¡R9U?ÎêÓùDà§a±­2WÜΕáHQ¦{9^_Ó_(ª´2NêwŽ—ã“^~æE:úÀ‹Ê3tjQ”“‘NA½¶;¦±ÇÓÇö©‡‡zëlK ëhú„¶ÐŽ ¢¶Ò’ÒôºÝ]\  (:!źå8`ÆŒó•ï. êU:»ŒP«t­8Åço5}Ź¥9˜±ÑäRYÛÕðߥx´:õ)#4„Þr-yòžÓuÛý „§+òñ,}yósR7÷&›»P½äòk‚–€øÕ÷Þïíç^Ï÷ZåZ}e+‚ç¨~u¾…ƒu½¯÷`¼¼üáþèôÃïÿÀ öâÎŒ[Žuªx „îLÝÀP¿‘VµP]ó>ãQ;VOQ!Ö¦F™é4L8ùØÕpái²P©ÆJž¾¦r4¯±V `´ÅÈx gÃÓC'Lù°ºjÏ+¿iO!aE êá¼L`¤[˜‘N)£è|ƒÚÏ~öSa3>©rk{·µ ‰c5NÆaéÁ4§­oÖ,ç?Þ@Ža*l¹„ê\jë|<(cìVOŽCx„MG0žÈ¬MØÚ>T®)„jñìŸü“µÔçðr#†N~qÝr¨²J’ÜÃA½VÄÎ& jbk7ŒqÆÅœ7û µM8fOjs\5:Žj|ÀìÿzãÚù÷42iÓ-8ë£'¡òšÔ÷XYGR>Ã\'Ô¶–ÀÉ™¶>‰ý8æïSF ïϯqC²Ôcò3r4’¹+€kr²§ËF#kTŸú èfÒ}㱕ò5{VöÛœD 0À(çøÂ3n!T&šu:§[²`cÞftƒQQ1Ñ©5GÖsü.[Åùòsy¢ZÉB™ÁèAàZl(Q'86@"A1øìio©žº>´Í¹ØW7ÃxþV¿H€ù‚ꎀ¹Z1uÕ* góàexÅS®m=¾JLdM:8ò×ßüåÿÒçL¦ÝœÕöÜס­š›¦Ãì–C oT0ÈiB¥32¸z¡6*ÜÔƶùÓX9·7Xqc¬%ÎÏ<Ôê`Á*7yúËŸü¥á€!|²…Æp¡ƒ2–$P†5¹2<–á9ØcŽÕ6©)á<¼5Š]7±sˆ@ cr!ÏžF—Œí=dbê“xp«Õ²"]s^5tb©“Rúº©ä¸1~#…?’R³ 1 Z9ët´x~è’–0ËŽÊ8¡O ó`‡KäÂ3L.»ÞfÀ16Û³{lÏusé“nÍ)¤ÀD˜SÚ¾(Gs¡†MB ê… ‡{Hê ‘ûæÍ×Ûíf1úeÂ/?ýèÇÿþÿyã·ß|ï>~ñÂïˆP!{„á&H[8q1–ÂJ´s'À.ïÖÉëË„ÀØ÷ÞÌÅŒw¨ý¢êTärêz˜¬E†–`OILs~µD«[ТBÛe«ÀhÆŽ‡ê%W«Œùã±$p«¼ÞZxw|ãc¯øåÖÔo–×gm‡3US)³¢^—g©eP¡¾£þ';ò^}íf^‡A 8P“AbÈ€YGb0ÈOçº 0Hh,Ñ-sg:)>„!÷LvÈñžKmâ6$ɰpC Ê txÎsú§Iç½3YÏ@ñÃdF2g˜‘ÓP!z\Š< J ]žoß-$°­1·¸jD *ªžx½†ðCâ@w S‚.‰£Ò¡ì|R FY—ö]‘?û³?öP‡ ¼ñ·›åéòŸº±®î98*`±$n|ôÑÇ~·˜nƒ«fÙQz”tÖ5ÔkèŒC5[‘Xjµ„Cä–°>¡ IDAT®• 6EB9É%½Œœ½Œ¥VÙ2ˆè?¯ëu‡€éüµRpF£ŸÔ±©>´h€?Ëòt ×Áëqd¡…RÊÐ*MØä ¡æ^$‚ùn%ÇfC”—:e&¦ã\^M…H5uÿ¾°c‹ª/¡ôe,;Y›u,R$ƒ´­ž] ÅH“¢ó>j•*çÒ„Â>ÏIZóØ'㪌;×ÅÛ•a‰Ý=IÕk‚OS€GùÙïÿþïØ !¯oçø¸¿±Ù—@Œ@5"åg>Df>d¯ßW±w|üˆ½áD|Ô1¶ñ ´Lu=¡ÈÏh¹1áñM‰Àö<÷5ºø l¡È¸ùÐ~Ú,í5ˆõ»¾Ô\z´ÏZˆn¼€5ÜφsMÜÆ‚T`ÈIá8Ëõ@¯œ¬/ ÏŠNŠLãJgr¯¸7G6~µVAtû{xu®üÙW_zôi" #iBuçI„${ü‚GV÷“hßø€–ÝN-¥lfãÞˆåkxà†}… 5ü>ßÊÐï¾ûŽ[ À±<±´Ÿý±l¢õko¼e¹/,fZà«'¶4¼.Kß&¦½­î=VV6H7ðîÀdOšü8ÀüL{ûz$ ©¨þy_d _r†óElP¼o¡Âª½ØEû’§Þ ©“€Ñ>úèCظµ§'ï§42R—3„wWÀDæ¼`×É3“»Åd³kŸ"±Åù-_Ñ,ÚÇÒ~°ïuú·žóN*àØI‡’.ܼÚè.\" +s-4¹Ò´Šhªók6äí3 }Ó·nIUmªàŒ:g,_7ÎiþÖ›Ï}dÖz½ÀäY9r ¦0û®Äg|•KñC+\¼—~ŠËb…BxkdÂ…=jfp,n‡·„Ûfµ Ÿú‚×Ñ„µ‹fº> ÿùÇ ·õÙh|ÚdI‘ì"¶¯;<{Uêgló§W±Ê—¶³nÅÕ!ÏÄîöü^ÞGð>ÿàƒý@=Ñ|{̧S¥‘š9ÈNE(‘b]³g ²]‰-$'G‹Ö»W ø¢ýdœ! ÎÜ-Ê [M츫À§9f©ˆBˆ'a´áèÒ˜»·ßÈèRw~æ—‹xñ_ùò³ÒÐ+¯¿'ûyó=šÿÁȾÀ¼€É—ðE‡ûX(Ð-6ˆ…ÞRÜl›‘øæ7Ÿ½¶²Èç_¼ Tv+Y3_ã\¢.™hu´oQ ¤&ì)¿n7¨Æ•S~‹?õdÙƒ§M¹KæB¸Î¾NáÅU_ ±ÐÖ³ÂN?L)6–k•cô„/Mï7kñ7Ï÷ŠÀ'pòg|ÞQ×Ó-×19§Â£K=6T½å Vocr,.!˜l<3àéÝ6ˆÐ­ìÃDäë/|@¨M3H`F!f¾)nÓ/r´‰[ð^p8%RõІ.10°Ô)ÚãÄ`Ür$üιœ“z %š¼(áÞ>ÿÌOÜôÅmÇÀ½£’÷#ÓáÄݧɳ8[àêüÄ×Ô{£Bg±]¡_-é)ñ¿üâ3,öš‹Ýl ô¥’ó±ÍHÛ°ÏêÙkzˤÇçÎç“FWºýÎÕ[ßõÁH‰­‰=XÍ|ãÙw e<“æÙÖøP†-¿öö»ï꣥RË,Êžº¦’øÆ%—^I<ÅfñìðÈl^{ý¹Ö y65(þËðx|2SÐ×=jŠûfarÆó™e³vþh·ë¶ð¶YžlËxŒ­¯PCzÓËÑï÷}|œ¢tÓKžù»”Ë-Æ—Šù‘«xó™Ü  i;—0LK8|ª†¼Z‰œ¢`Pøä…íÙnŠm\-fã†-&^”Ý‚¥¢¾¹qÂòCPs±W@ÂíÌgõý¢¾!¢}îØ³T©^þB_‚´˜Á+Є{hëÛ›œ5t@RPßN|õwYáxxöû¿û;¨B„c ªŠ ûÕ ÒyÇÎko \WGE 3håuÂPÝ¡_¸²ÎÏ_Ò}Ö:Ö~'¦/7š³dŒí…Dúê®sóªuu0ðà½Ñ%/áF¦ jˆpmE¶•û¥cs~ŒT›æJ®[H®Þ=6¬¹5ܵ1¬â²Ê#ÙÏ›´ªcug¡§È×[À¨¦†zrãúdFlzÝèΛµBÑ™["wÞóà¬d&Ï@7 `'–v\V[Ô¹b] è&¬ÞQ=ÚdʱÜâ4ð¤Çà“ºÌ€)/åª'g§¡y &Žx!«ísâDkd¬:jÿ/Ð37I¹›Š}t…wÔRubÖŽ®‡†.ìÿéª ÀFˆPmÜVgS‘zÑ ¼'Í@5 ó²7ò–!¥íS»R1ê ‡Þ&lדM"uÅ–ÃZŸCÂTZÀÔg–z5!…ú–K÷ì¹ãÇ¥n-5Ęy§EÓöÉJôñŒ ô–Ã3>Q«×¾ø„þ3¢ûŠÚëmóóçâÝÇ&²o?ÿØH_¦ÒÏYW—ø2•¨‹Ü!¯«)Ç<]9;0঳¹Dç–òpô rJð/=¨ v<7™|ðׄ˜®[¥¨’ø9]³æÐbH7WNÃÓ§3ø±ÙHÒ'#7´R¨\c"¿©N@^“©N -ŠŒ¥_ܯe×$€/>²ûõë·¾÷°ÆEâ´írô“Ëߺµà'…0ºãò]œh^tiX•µ"þ#¡¡„9|niDÁø fÂÕ4!›¨À-~„ žéIäFÌ‘ª¯] I1@E:ÎØÎÁ†úÊóœ´7l}J÷"Ñ($7Ôý÷Ô(pžS²z­ƒ&¢‡ËÓÒ+º:vÜ ?`H2À\Eªâ9¶ƒT·;J÷u+3³-Kh~¬ÂYó:bN¢R9ïÝ…V7Îâ>A—«X' ÃH]!ñ§æÝB`Ǫ Î:I¤òkUf&óò¯€ä—µÄ.^<.,<gÂBEÊGâtr&Ó¹)shËY‘pVSœÙ ›Ú:8x!qHNp{õ ¨T·w!yRrâ¡(¦ª¡çíDmÁµ§X[êP£áÕ¼Á3ÖWÔ š­Ö_ä+:/ÿ¹´µáµ)R£@²ŒÓôö’U­`c¯ó"õÉ|²zMÈ« ¬†3ÄtÿWsÝÁP¢7Cõâd§|Òã€nјsÍŸ>£Xt_°‚ ã wÿñ˜2¬Ü¸ïI½£‹7Äeº5®ùé¬{%‚쉖[Yg¢#êÊ-<À[ÊÆÃÉxç…®E¡u"B·~‘0 jœ£µNá* ÍÊOD³à þì÷~ç· 0Z,ò>ê6'K‡Ð•iï;Oãµ0xMRš³Ÿ|,É ±dôØàÛì®ÄñxÎÕ¥/{§šWˆ2f©`§ R1Æ>o¦¥É©²8ô\çqÕ¥»µlŠo§Áú³Ï¬ö‰¸÷@0ï7e†9º Åì²|KÆ’ùWqU/àäpq®&eû®[4vL-¸˜p6ot>»c˜Â)LJé Ó¨>®?ö¹ìávÊ1 _ˆÎן,êSÎÐN´©wyww6³m$sœK\ùXbh0ƒf¹Õ=Ñå¾!-¡m+Ô_üä/ÿÜúÒ{?úõ'Å…Ýí?ô‰œzg^„Ù°óQç uÖ‘þ $®Õ&pš_9Â6+XÐÉ)“Uó#ôRöu2³“Wýa@¢òÓÞ ;=«Ç"Ý"¥^[õ˜G¡<1ÒÂdQvëÑJ«°¤쮳š¨ôrô´C O.y6Ö®÷¡xŒQÿ†;C¢uYk»Î%£Î1 I¬Ž=> ®¨\8Âô¶oÒsA;Tò,ñ¡•zsß§.7 sL±þ…ø¬Sè¸3k(dô­ëÒ_ê\ASœÀàƒ¢§.0Z1ýK°ééÕûƯ­Õ¨ïVß;`„êh›3ΜÌ:˜}ð«2&FKA¥£eÙ¥Ôœ€3éa†zm˜×ã_í¶nŠs„¨P"ç¡bBm¡r–@ÓEáÄ*èÒ鈞ÿÇjÃp¶>ÝžŒ‡s ¦ðŽiL"*»Õö2¨QÁ†­ÜP1v¢­$Ø2M¤¶”C–íc l ß .HTêY¯Øç3ˆCG_öŽHTtb¬¤ycú`ZUhi¼Q•ŠÝ¢.÷ùW®Ô@|£xÈ:¤ž‡”<ð0«©{:¬å¡E¨šy+“]%é T"HÊWƹJHÀhu·\*3¸J‡Ë˜ZütùWÒÎTT¹à‰4.K·ç@n½ý¶ç÷(} Ýø¬xýþ{ßó¡áÞ‚°Ì‹®90ò![ àqxÈH0\=þÀsAÿ}ÓŠ ”«ß ´IEÂTV²ã$ñ!“èî °q ½•#ågÅýt±'>·ÔÓHp~õ}"«sK<¥¿Í$ø”âPžàÛË–±áWªo4chœ°v$ðœAYWW©•¶¾Ÿ¤F+·ö<ñbý¶§ÀÓS¶oÍ,Ìñ.øZf¾A¥îw:|ÝÃ0O/ŠœfŠÞZ§IƒÛHLÖDx\‚öØ8 08®LœUSaÑN¹ÂØó9òxþä“|R«QæiàáÖ…ªšÿœ¼‡#Â…òÈ*4ñyé‹XHû’E\Â’ÁÁcz¢(ǼÃbŒÊ/¶¾@&Ôõ¿F¿ž¨ztœf¾ú¼O==‘«ñ¬ŠþÒfAÛéîÝžƒ IžØÀç‘•2ÄkX7º¥’|ŒÉ"“®‘O%̆9ø7|ÜÙó_¿ÂizQã5ï~úù—ï¼ýÞ6XÔA¤><ð½7¿Ûï®÷¹¯ÄƒDC|)@~gtW€Ãã`çž<Ž%2ãÊá7 4†¬9Ò‚ÍÏ7§ƒ˜¤‡(˜ 誑üå1$?k€Çˆ®ÑF¾ÜàÑ|:Þ>9£Ì²e%S§(•¨AÕÝé\=B¾póºžkû…)…—¾>øìÅ Ö-á,‚¥aü„j±K¥ í bh@˲Îg2RWäÖ9ÑGëÁ,Þâ%H¸‡Ccšh«‘z}JõI€9Ûá m¬°¹Ðºx4 ïL‹ÜVÛT¼¤„!©l÷‘NKšÀŒ%å·ß{WÁfeŠÅ œÞù_Ûã纤æ 1³.¹Vát[ṡÛ§|¨0{¨€é÷ìBjĺ ’É|yƒÜU6ÅËyÀ‡ýP!ae‡ÍìÍá £wÏiCòRÁ£õÔÊP_ô„$*óøŸWˆ·®áÄ$Ž'× %g–›òF¿ªD|Ëp/2±5ǶïøÿQq f…ï,†=²jâ.Ež®´½æ//çD¹‡îj¥Ï›;ª9SØpïñYåÒ±„ŸÄ›[4üâãZHô)}OfÄdz# aþÙ.£,à$¬ >þãòz2œšd4, ù5°·ê SÎ#k¹æWsegx®æÿåêΞI¸Ç= §^ø®~||B H 6ÉžÖ"ãÖu؇žºÞR —xœÿ5@›ÿÒ!ÍóLøÑ]ÞŒO–'ó̩СÅÒ¯¾ø 2æ<κ‚Ï«¶­?#,¥±WxÏeß´kçˆJnÛ±JBžý ØTô@ûiÔÔsµØúyç,…k¡v5ˆ´ŒZiÕäKn`f¦1p¬•gat¼6æÑC²¬Ì®€c{‚”kùq·>Øæ ‘àJ˜ôÊLST…p’é„1Yxª=_‘p •c[$»·šHb™&®5iæ?J$µ¨ç&¥$…D¶|6šƒ¥ªè©mà=¥u¹ø–åcl%­îhNÉ0™?x,BSÞ‰F”èošA*Š?PÞ€Åý¤a&vª:.ÿîÈÁ°HS£ŽxQ6/iàám;ؼë¶Ew~`tË d‘'éz³*JÛ€àêÖ¾¤V€JÎY£Ëh¾Žªø%Ç4®:Oã|÷›~ ¤±DÆg<¨0†U°£¯¸3UÖÙÚÅa>ú”¡¨á®=•úáqøþ½fGo´‘náÁ ÈaLäÃÛ¤ ËÔ¥„*ÌÞàGˆT˜è8ð!z:fEéÚšÅÙE3*ry¬œûÃ$ º®paËÛn’¦eãö# ¾Jj]ã™ÏL´Â*€µ‚eóm¿&žé<EA2’æn¥½ÅÛf`&/B%ø­}5aîµé<„mÒ))wŒOÁ)ŸÁ c:Š*,Ñ,FgŠëCºI½3˘'Ž¢¿{sýøâÑÕËçíW>ú”–ž={VÛ‰8™Þ Ýœ¨Ý4²g,…„Â0ÂQ¬³AÚÑ“e]òLφ˜\Ø 95 yU‡PÍ” F!0·)q;¶k¢æ6Æ•›´K«%úAN%Ó€Õhƒ‡† Q¾ü,˜†€éŠð̵fåà‰jaؤX•†j• S¹æÇFÛ/š|@"ÑÆÈ!­ YÓ×€IªØ 9R£”rÐQ ŒmID‹øÑUîS­íÑ«¥Å£ øi»‘?½)œ~ø•ÁÆí&|¢Ë¤ÃB±[óéPk˜gKºr…Z™áy€ˆ¹i¸Kèt£ÊÕëíæ¼söÉëfÇtJ@~€8Ù73‘b8Ï·ÝnŠDÏf8?Ršë´³D:¯þ¾¡"‹J?º•?f.s…Kux&ņSC@ô¦åkúXqY¡—áü:µ"‡„"ÕP9$RÆ¡Úm¿çÀkÍÄEKK› ES–aV0MÎŽ39˜ë1x$õø· ‘‡ÃÈáŠeGÙ.‰¹[f»èƗц£Ü›½~ùòñŹCh`ø•f8’—¸ª˜Šá}Föèü2õÎëŸíÿçö0°]ËczWgQ¢JJÀX-…¶ "ªàt6£5œîìÇæqReYá§Ý=qeXJ·ÑpoU 9Eà×^·ƒ,FÏ4ÅÒ¤~ Œp¼S؉™qfWÊ<<ãË­rÉöÃBZÞxkÓ›ž„}úì™ÛR1ʸ5ç ê=ñÛ} ¤¿vì±üêýÐcº¿ý9%A$›?˜¼QV,ÂVXj_uéÝÖ–®|CsÃ!в…¯ùîçÑ*N€!j;Î’~ƒ§Öi¶!Åls$Äq"KÛÙq"lʲ,ü¦—níy@Ušyï´´nx˜~µt{ÕƒO {2ΓݲŽüàgscl·ÒøšjÍQ>o¤Kd4T€:xï&´SÜ9Ú¥‘Ej‚&¿§!xÝBC\ ¶&·`ÊÇ”IàaÛH²À •¯°Ó->#wŠEJ„ ¡ràv¬0Ÿ¶@LO <3Ò·$aõÎlm( YC®²ÿtœ-]–8Œ—}¬â—¨B0 ® uR®˜îÒXá~™T»…˸ºê½¹õ@æÃýYÕ›°zwÓœÍ" “àç:„¶¬ò“›£C8×”›ÉHK7©E’` 5?ÅÝ } ¹œ+!©B&žkîÔo‚Nó[W·ƒ*4Ù«&2€‹¹³£¥mE:`ãÛ`Ž!€Yƒ÷¹œÌòž|neØDÑšææV6V˜µr×ÑIdæ|ÈòrYeP%´=ƒ{þ1¬ÏC¸SvœŽ ·æÃs] 嵺Õ„·È™‰ n¥-_5YžÝâÁ-<‹êì_þÝÿh ÚÓqP:…²s@#™µFrÙµIÀS=vAR§¯ØÔ«^ΊâØ<v­$Õœ¯sˆÃ TIâ‘…‚L<ÍÞŒüÒ’Á!xvÔóñ¢©[LÓ¤8Ü1¦^‘<8Ï0 í¡Móé:Ãÿ†Z˜•¯éq/æ4Q¹éSŸö R\Tìvö1ÉdœO‚ÕAªÅ”q_ÎK¶?nMaÆð‚bJœø2¢]Ú‡ÁN!¤zÒM}<EðpÎTøJRŒK§«é ­‡„æ‰ –}€Iêê ¸C»–PI‘&ðh{ð˜ø}I±Fá ²*Q~j0M\éV’Iºùµ`5n)&ÖŸ¹‰¨H$‰ÔÊ ÿÑT²U¬O´‰x«+ªr ÐIn% «Öôs"TMlL(jDóè‚­®eqå‘€wZu×FM¡êÑE¯†ö=Ý2•«AˆjVÔ)’Ê'²";öu“~œxÆ•^>¶-Wj™ÛQ‘§ ×ÉóÞ:‹JÖˆ5TF«WÍ5DŽ’4‘Ü®üʘiHàŸ1ò½O`€{P½ªʧ­^ÅÛßÜôÆ>ð‘Å^3öÍá×pÆP¸óc`4`=g«›`)!&Tk f†*ÀÀe$¨´¢*%C †"k6E v0’/b ]Þ59cᬸCF˜¬ácxHôBâh#kÎH³Šr]}Ž9²)|ŒÝ|jr8ùÍÐ*`£•NCoíÉ+wÕÜBßUyMçŠ4Ábu܉¼ªF-¦ 1lÀÈóÜ.X¾â3cãªð`ªA­äœ©ŸÈ¥Ñ=“¦«›«çÏ¿Õé…3G‚zRG±—ƒ{'?¦ ¡n„]\\š¼Ñ˜pÆ:HkëÜ«i £/K Ñîõv÷ÈKÊ ® Þ¬—µK›SHQûväl¡u¸³ˆüÓþÃeß–ëw /Ÿ<,àÔ !Ж€¢°¬‹™ IDATÈV¶8g}!ìúDˆæ‡fZ-ã•›i¾iISêRÊã“Ó³n^_µIÓÚ¦NkMôÄVEÆàÆc)匷hî–‘Æ‘Š5ÝNï`JߨXCðÅØöÐ3 ‰¤ƒµèLéòš ÇþÛ%åãì4¶Á fû‚­'Ü SÁÜ1AÉùØ¢­âw7N^¿ºúøð ï… WÀ4Gˆ€Ó#†Iç=‰éJH{f‘ž íw¤CÓÚÈ`µ=¿xd)… ü¦!À¬YQã¼÷`"n˜‰}åÀ¼€ ×ƒ/3?ý„bª6ÈéÝ»×8zXœÊ«š9$Ø»öHà„A‰š½rK“G£–â˜<ü,ŸÀ~ÈKGàÊîî³ 1Ìd·ÃFÈÿä¢ê®šÐƒœã¼ü€-B¤%šxœÉºÞê ZJdЕ¾#ôÄý˾~_q…ÓÑ]î0JÈÖ$‚ï2ª5×ZUS·ÃI;:i戇ø-ÖMÏ5*™´una”$úí’µ1ïA%A.A21Ÿª‹ÊÁèhÕ³Úá+dIh±ö[r<Ù,.¸ëö‹±K¶²Îoâ5D›­¡ÝÒÐýϸò”Ðs/壃¢+¬æ¢Zñ?·Ú*Hš÷ÂÃK 8¤y—5*aÛ7ÆLU˜Õ¨Ù:3#vuj‚ äJ:Ѳ \¡Úm‚¨LÆ'„a-â H5eP û¸€¹<½€;ך|ìÃ4÷…ôÕ‰¯6Ð!VÝŽhIš}Ç‘´€¼vÍèêq` Õ÷rÒžä³=N€ˆ”˜³˜–X€§Ü<ëT+©Z­é¶ dð{3 rKU®Ëàµû´žåÄ>y'ÆÃ(ÐÄ5Ì¿üùÿÌG1‹š%¶}å<Êù£—¯^‰Ä‘˜Ý¶[t‹E8á †Ëö®r‹ö'SǼFZÔhÙ/Y2¤S½Ö-vYˆU8z¢C Ù¾“A“ólÞ¯i¾òë  ÊéÅ.½sÇâ Ö#‰BóãH#?­úÓa0‰Ô×ÐÓ(â¤#›™Z4O¯#loŽ ¡!˜<Èö9+Cßû¦FQqÄáŽ0;ªuçÑå9¡ÿ….ݼXDJ®Ö×G¶gªôèÓ㺰ç^éÍ™Jß9˜êÅ]t{„Ôib´î8.C(¤·çœ_ø­ f½ãà§×À•Þòh.52Š…E°Ž¹çGiúÊßw®o®}‡wz—`Jä:*qF¥™Q‰m›bj6ÞšÑßwü™†÷q3p£#ÉûöÆ~ŒÝ “=öãåã'=Y™‡Â6h}âe$Ð&ÐÔ7òOjguìÍÖË]ó-Ã3…ø$#RKšñ ÈÙoI|÷ôò±/xB͵|DÇv‚ž<¾´ÙEÉþô€Ç~Ë^“EªM©‹Ë7×MIë>4ÙájƒÜƒÏ~üSÝÁG‰Ìå=ýqzÀ‹è…ëw$ÙSÅK]׃ÏËs‚LµÉF«þõªíB¹7JÎÖàôJÀ™u>e"lQw³È­š_½Çƒ¥Þ·œC6v¶¢-h‰bÎô4—çRÓ &R˜:³¸ÈU+Ħ—Q¦§´E ÐfR7o;FÆ=vǺŒ}25žÏL÷)˜Ö|"”,‘š‰Ë&¬ðÝ‚çñù#G ŸóõOòÓÿûßcüŸýÍß`•kÃyôóó»ÆìKi=³hwAp,¬Í€ÂÌ_Í‘lŠ÷µ0Fg#›\MôÐŒªëËåQ)·XS|k¦É¤¬KP¦çíÔ î¶ê c¾ CÎdN=ß!ßæºæ ué>þ÷Гà XíDR#çWf#^dâÆp­ÄHÆZ5é³³&Áa~:3Uzˆ @‹gozôÜS§ Äz9/ëà1¯´…9³n‚G±Ñˆ„Þðô™±ôš‡Þi¥1ÞÞÇ ;±oÆ?Ígš Œ& áÆˆkÈat«—“†¼lÊCÈe®Ãÿ©Âq(ƒCÎ3 B©þ>Q½@­Už0Ã6‘9mÎ8.$Ž8äQÿ‘^-=ÄRßõ3²ÖWÞ[Á¡2(‚‘ÐÉMÌÐÛX|÷ìÙSm?=Í@°ÅöC#w‚͇ÍzÉ­/3‡ØÅ¥Y“ ÊN$³…Ÿª$}ìe(«ñ†Ü0uÀüI—·çà­s õøâae‘·´¨ ¦jÀÖ®PÙ禫5.C{¡„°°¥¿‚+uô'ެ>ó•TK.8uŒ:òLÜ’‚ŽY„ƒE!‚&ƒ‘Ǫ €±Ø5ȱ`±…aÓxòÁ¹0< ›î·Ô|õúùô8'‰q6îqvf"A‡Ëyvà<¥1—§4~>¤¤Û[ÕíèžèÎd‘¸Ú8†[‰€ì2îtÇ'CM [æWŽ/‹HŽyù|fÏmš)ºké‚ûÚ’šÿÐŽ¼+yÖëä§+ù—-ÒíX­™¹ª%--Øú^Êì§o ô¤À*´€ù-ê¯_½Ò¤QøW¿ü…Z2Ö}yج·¶Ú\l¦±®ž£âÖŸþ=£aqhÔ8!ÚA½JØÅ„CµüR@b~‡¾f¢“T´RB”¿HÚiå¶]–ÙèC¯ )w÷Q4lJ7i:@ÅßÂos26“\rBb­„úæQQŒ(6‡!±Í„ >5Ï®³²G7ÍuzžÅD}ÿGlèòW*‚O€otC´°ÒK,èNßN0ì¹U«¤._4i_jf{ë€B*pøÆ/±·´¤°;jÎ#§Ö0…Å•ºŒ°þuËs\WRÔØ |hÇ"µ™Vø_Ë óŒ¸e‹¢ y6_) „DZ) XñfZÀ'ÙüaB™7ŰåÉ%¢Ç •}8 L¼jUA¥ò¨ãixÑ€s¥“ÏBlô®I¤ Zô£¯âM€•µ`k£×È÷Ч•ˆ¼sÐM¥;›HÏ–Ð2`D¡ID2Y‰0i2ŠMì<[|tsÓ/Ë"ªEóBQIÂùmÀѤA¶Øo„»6“ƒ$ðs%oÑúÓwŸçû´-¡ ’“O¼È@†eñ¬°m›ã€Ë.òRK쬠mão~_˜@‹uiªC”1SÜø¼Ö« / ÷(Çti[1XŒn÷?„$†sx]^$:| k2xÛGë„ à•ç‡8Z›V4a„¤¤O:˜/_²ø‚AKÉÚ5Yé‹ÏǦW‘+¿w}Eñ/Lg~ôÙ§¼àúýÝ¿úÉO|ñÈo]Öa»tÓî ~KIÔ„¨e·«íâ&`³‡ÁpH1f¬ã©ù²øÄŒ*¼1´Bœ¸â6@Bš8›´Á8®X9o±@èæ9ík~=çÛ6ÎhõÛN&OO S ˆæ‡ëul‘–0‘ñvW¸ vìÁ¶F&Áã*”*dz<`MtÖÀ' ’ñœ‰?ÑÑåD·áD/…dp6Qo¤lBP‚\!äFzWV 8xŽûZž0Ûs±ucÈa^x®˜ 'mÁ6ÓO:÷Ö}³‘¡ ŸÀVŸÃjÏ%µÅ!Áñ³ø±*¿ò[xË LÞ¿§4&îmj‹½³_þêzŒ¹ƒ«"^mˆG{R'F‹äªL”pÊFG,j \ðÒ®í¸"0[–&)Úd z"¹'{@?·Ù·Ã¬–5‘wEHí:+e´"¤y]ÞÙD>šJ$¨°Áv¿`k9æ@V³ôh–÷›[ôƒÄ(Nì£ò*DãG}­Jú!Û(¶=ÛF‚ˆŽ¶õŒùFVÀi¶=•Áß6C:j㇛¥Õ‡Œfô6O •Ã9Ò•áÓ³ù”ï4% …lj½unýj5„¸v«Ù- ¦‘8^‰ÒÎ$*ò¯š…„G ·–q nI›A˜»è¶ú±.jÜú€ŒÉ½‘k<ìÂAHªÊ¼)h_’à#‹™·5÷§¦ÚQ˜q……Dé?ûc®rî•Ð.—C.ü´Þ„_ˆ‹+»bLÉ, ÍRò¼•Æ)ƨ1s6ðÄYˆãNÃÛ˜s^yƒÚfÉ$R×»ùn³ õºÎ¬í€ÐLšÂMÖš!]5Â|mËIÔíä·\+)A¬mƒ:”î–7Zäu+WÞ«9_Ÿk2†˜I[Oˆ"9K‘’áÜ_ª|z¥s f½zAF×Ç{9!ñFÓÑ›ŸQ$ý¤Á11#P „ç–õÃ< oZ¹"1Ö§ñJÆ1qŒŽ Ãn§|[Û3|2®ä"’°Ð…zâ1‰DœDU3¿³;ïÞÜ|óåŸ^|ûÕG_·¿øL¡ E(ë¢:ÝñAÏ h‰ø×ŸÉ6Xz'z,ŒXÎ…2˜J…VË_RÄNëxªl6äZC‡3üSÀÛÈ †ìzDóÎúúìI€À†r¬tèÊ›uÝö\·è På»=™ê陲e{‘¸%ŽM …™vV˪ G ¹Öp"¦øc¸MGä̸st?Ó°|À3#‡Ì’ÛBv:ÜÇßüæ7†±ÿøÇcµYqE´¯Ü­t$¥:\A¸ÈÕò‰%ŠUZIÃsVˆÖ¶‚þs•V(ð4‘6g“‡\|ë€[²Th(¯p`Ž¡Ü-C,ÃK ɂлJÛcjÁÈ`@!K-àI«Ùwñr¨+\$2JP××£x?ÑÑÉ$÷E“£‹AÃ1?[$58%x†æM¥ü;Ê@A.À`Ô®¤€ä"“¨”˜£›´ ÿ–˸…m9\3*q+Á&©5߯°ø#ž€EK- ¨˜â¸J³É¡ BQT»tÇHc1üz Bþñ!"(FÉÓ¶îƒ[UºŒ˜å×ßÜ.i0¼ËµÈ~{ƒøyàŠµ¼a[É^é!)\E¼Þrw,«‹V4Ëx`£«:  $j¹ª’€ yÀQ2g†ƒi¥-xßéŸWq*ðÌ·ø¶½[ŒÂµ²­ÒÝjI~dövÅ·ÛgÜn„§ …Õ2U‹?ñ´%Ì¢«Ií žÉ`QI+î-´¬¢˜.0f_al-0s³Å …loÜóò=æ"773 ÍÏ…ž—Ï‘R¡X­÷8,‚œ×ñDKÈ+œI^ìðf‰¡¶Åê¸WC§‡¯€óMºÖßâ¹éÒ9qÃÛaéFÊ‘k=&VfÆ–õ·“R‘3‘~º$#6æÑ‰+lëëy®LwªÂ§'µ&ýÒc4çU<ǹ.éxôÑ£XŒ=si—žœÕk"q}½ŸhR´À¤¼m ÏÄý3{aæ|öÿ¨bŠSÈ/&m µ (T%þ =0–rvømP½÷ýA²ð>U ï FêöÔd±Á "ΓõÀµIì¾ãÃ÷{¤€×Ù¯Ú‰†œ¤glYÖ6[j§1U´»·ÊhèJ´‹Ë¦•O˜³ò46’ñ×̇¦¢ŽÃ€ùöƒ;G+µ}{КÃC†w¾†€»üÙñ‘«×Ë’[0&pžØ*…Íþ¿*K;¹áᤖ2œsðëø6D7Ý뙵ÇU¼Õžt'ð0†Ï€ ¾t–-døçݽºéc ™îÙ™ñíNdú—®°´z–§F·k—Äa¦YL//ž+DNR~¹eœ"ÃÊ«ë×£´Ü[IHö@î|±~J¸zÝò”{¼¹¶Fêïï¯ýlèÍÇ^4ó0Ë”^‡EáüòoÇh…k„[klT™ý OUÌšø¬îbÀæ?œ¸Ôgl-"(3‡…«¥¡¼žË¸I§œV“«ØØÌ@Z‰` ç'Ÿ|jö¾£‹‰2À=›È!'õ|îX+ CÅ'g1í LF¢PËU`p‹–©j:— <ÃKúÔØÄæPÅÙð¶–ºk¨¦yNÔÊïg-S.hEâgý×ñ<‘™ù¨‡Û6)Ã’ÿžg7cVªÀåÕŠ3Vå «0Pao«¿&HWlÕ¥óÊ«IZ ‹ø¹“:FÏ3zpEN *ª8’¼ ëp0™i—r¶<þ'~B"P²šI`ÕéÜênãÛa8†ˆ¨póúˆà6Oò,¯2ÊIŽ|Ášª‡B¶“¯h8ÇŠSuèM~¼³2k0Ϥec`ÊÀɰg<¤S²Ì“š¹5‡–绂_„ò2®téŠ ÈÌ7kÂÊW|Lʤ£³³çÏŸ+‡Í,j¸mžÙÐí#dÂãX%®_Gþøñ믿F7–¿HØu¼i]P¡mlaØØ?Æð,Tˆ(êfoKqú—W4uïB E½ûÅ..iÒŠ¸&T´±ºìØ-T†ȹþõ\ðë®ÊW9®ÊaX6´ÚtË¿—@.˜ ˆHµÐ+Uäç` à5¤ y?ß³9t~ÑDZVTÙé#Ÿ b0×%›j¹ôëÅL¢•zµÑ$-/$î‰ †*±;)oYæ„lì) 3&§;ôÄóCNe—pž¼Jô”æ*󉳦٠kí‚pPºk«,¦Ôë0éTÓ´d¸çèÍ4Fuˆ*×¶~î›q°¦V¨hŽ[|êŒ óp:3ØwˆZ̓ãO {mÔOä°i[8T\%»†Žåd®õ‡M14,¹)ïŠMÂ1P!ÇMÇ!ewG$8œ œŠ•é-€èH~¨OXÍ(÷ULT¦ª+Z`˜BádŽŽM$U¹Ü˜ ÜnÓ ]ånÓ¾f“À-6èmØè4"…™J0&Mñ›Z8¨{~á–±Ì&ˆaÓ„ÝB˜Æ¼µé!ÂFEyœ*oh-ß,¥“4¨o3ïâüB°À ÁWç¶çЕhe´šMe$N;^móüÚ ×Æm”V|<§I­ ¾ßúŒ¼*ž±v^p†“œ F zNöòÅsòëyQ$úr‹'°I‰5&`Üa'å‹Ù¶T]¬³×¹bú™L£KĶÐç— ìšq­4¶LÀ½?Ã{ºT:Ûˆ(®òÉ0t‹¡N _‘‡J_ÊuKʱ O8D7nyÐìïvGê(¬Z\zã!…Õêó×ïþê§?ceу*ìüäÉÎ×?èm{âX£Œ9v2<PçYü.K(áØ¬cxðÚ€`^föÔ¿ïVx€DCÝ{ØÜ P ‚VªæÇ-8Wææ/.U™¿öuг{/y“Sƒõ7êe »-“ 6M5`Yë{ÓqB‡ ]ùùÈËHGÕ,€p±MÂ6‰ÁìŽÌò¯Ð¤˜ƒøy­j™za;‹ŒÅ€¡Ÿ ª`Þ ´tËRnAªb,è—ºB¼¹]]¥}þË…cf™ lÝ£òy…⇠º•À瘟5XÓ€ ­Š¬#¿øO~#:ÍØ®*dPW^r+¹%”[_ý —C~ò¢Hiq‚YH·‹J• Ê'Å%ÆŸxÞ×­0Ñðq,~ŠtµxdÀC3þiçr>laÒ"ç囉Æô‰–E¹¯î?äây9Y­…~ºíTñ:mD TT¡°¤#q… 0~Žp±BÁ#)ãº$öê–{@ŦfEê™XQòÉ'ŸXWÓ­Lœ*c@%è3‡#®£ž$¸±*H€§TÌØ}úô™[µBñ_þòG‰ dâ(C…¥Üö['£AÛ[Îq¥ <Ï Æ( hå.³þϾbž  £•C,õiÅ€ÜIEÇÀ„´RïF­ájýn]Q9Tl¥ãRTÌLX²Òx8ûå_èª Ä&™W¢9‡R3!¥¸.‰ÊÙ û¾7ªÆ9péL]ºOÞw¾¤èÙÔE?o>„›™½›Ò’šÞ ¶˜€dŸ@GotîF!n•«í.ÿi£A?õ©0®JšDN{Úžýë_ýr!öJ*3Ju(hH[¯òèx »J·Ã·§¤æ¶hZަ·³b泎ôž34Î8öû¨¹Ê‹›Ÿ§°Ü[HKú.…W<¸ÕÀ•ê`[ÖŒ`t4>WG’FæC‰ÐÍË/£«†X~Mæõuö“ál ð§¶žÒ!˜é;ä>›Ù/¥§Šé¥dãæ‡}Îp<ÁWeLž~3¼ÓÛ£ÃéŒÅ¬©ƒæBÔëÝ7¿‡º½ˆ“e9œ4©¢ÕBaS@¿ÙÔ§ ë>£J¨QˆKÌÐÂæö$¨bø9¬¾=q€ÆÒpÜñåtb/•«Y7ÀFËŒZ`L 9¥ ?†]À×àü‘¹ (?vãgYá™'J°Á]w]e†hÎc¶$j†ZL¤aru?ºóÔ’ãe9¹öþÕúvK(¥îy»3‹&ÓÅ–Ã;w^|û ÿ'OŸépf©N˾Aé9UcŽ“é¡óDÌë®éÄæ\“cÌ:Tïxbl–Ð «"#9PH–û=ƒ.ÀÖ>úìѶâ0Ï'ád\Ô„bG›ä"BôSuQ°m"£Öë œ2Ú|R%+áNÞôÁƒ(û™(¤"¡œ:4ö†—ù‹Èô¿þõ½‡ç?ýÙ* «ÃíÌt‡ ¤“À[B¢r.„}kO…CS ÆU2¦ æÉç6Ò²au¥Ü­¶J4‘q‹“Ûy•r%ÚÒP”ß’Ñð1ÄlC­R—}/%oLŽã ÿ špJ‹S†¤ÆÉG˪ö#¦VrøáPü¶éÚP§ü"«®°‘žUšVC„ÒdDç'êYÓÏZ¨l•rb.¼˜ ˜—ÎÚ’*dÿ  0 IDATÜBºÓð Rs¨” jÊñøÛo¿5‡9HŠ™ áT :ë!z4|æ“OŸ³`ƒ.´^äÖiÛ«kþÇÿ!Yý H!„€Ê,ÎU'Ú $KNf™q:l®n‘¡ÑR¹1<àm0wkg¼ýÓ¿Û}ŽéǺǺ‚‡\‡ðŒiÊ£¥g¨’o qêT(°宛‰1lü›¿ÿ{£—Ú¡X]ƒ> &jà~iè`õ¼qX&v÷ª³Cw¼Ç49 NHa(Ô7Æ•pˆ¢Èë^ÛÓ¸¤®x WGn °ÃÕl³u¨=”ãÓqTöp;s›Ãöð¼~}¥#- p»õ5Šãc¶4eêlàK@`H2Ô³Ÿn‡cLÛ¼^ <–ãï>Xôθ]S Ž5[‡ Éx_Tî#–wf³©òÌJ”œ ÿÂlƒ4¡(HmZ3Ã<`±¡Ö­}~¡rÕ…=­˜f´ÑŸu 1ˆ,M=òZ-Ýà/¦@¨¡+­°1p~™Š RŽ ùx­»×™ñ/»åCÖT­4ÏBD·Ó ÀÓ†íõÛ#.æ!²­é«J£9­¶2nìZa7±¦µ(œ±˜Ã´X+ Ñ«»é3û¥®ìH40¦äiÅÄ>Ø6ÇŒ®®ý –hhÙ@’ŠåÞM°¦“cÇ&™+êüð¼¹¹àD žhy½c¿x£Šì¶ÐqâyžÛÔŠ³s‚%VTQ¯BI¦¹Ë£¾g1Hz;•r5™óKÏóX˜=xÔë¸ùž5C‹xmÇÐ=Ñ›Î%Lçòª¨z=GFá¸Ê(`öQR欰I^ÅúÞ¤¾m;aËU°¦p0àÍœ¨ÑÞ¡­(üW ¥Ÿ‹¸ö£Ï?ûòË?õÍ‹ñ·ë%ÏW­¡Ó`²ð6yL²ÿ=»mº“º¼ÔkQr”…<å#PßëáÞLÜ2ØxÚÔ%èpš×q"Ê!zq¬Á†tk÷y;µo²?H×%ºÚPEQ:È>ž`Ü¥H@2ÎAJHÖZÕØ¥[T–:ü 9¸[øµ"‹<×(˜õÈ¦Ž r{ö+T U¡5ͽHïÕ×p®Æ¹.}îÀ)£•&r¾€«º|OWÈáò[ö0ïKZ­’aÆ?Ñ]l`d\7°U2n•»ê• QJüƒOàLŠ»&¸}£wÖHx˜Ô’Þ0S³™(,šh¸„\·‹- 0˜Q)Oy⃗w3¶d ×=µ:ÂS.S¼vb UÃà^+$4Ä-T9‹h˜¸A ò‚• "ƒÚX9?AŸøäƒš+ÇÛÞ’T+ÿs?ßP¾˜¸Ý—óæTñZjeÁ†Õùx ‚ ¼x0,NÆEå7‘3cÏÂD‹OÝZÈDœÁÆ]sø'Ož1H‰–ÏØôvyÏ hO“bï×_Åi_½xI{~ÅÒf•ÙfˆIQ®K´'ã–!¿Uä¥5nÚ¤¢Ž¿wŽ+Šå#cy˜t „:Ȩ‡Äíca¥ÐœUä×X ¡•“uÃB¨+ü®|¿ÅMlÃò‰B·À9¶Ýž}ñ«/ Lŵfšêˆ T3-X`xè ¿³¬æ—X¥¸¢Ã¼G3òº%0q2(ýú‚QçÆjU–¥&nÏWH‚!W²Dý FÛHŠ:¨Ü4vœß"i¦Å¡ŽÁ„D³Õ#ä´u] WY_î—+ UÞâ1ÿ£«NhN²‰³r½'ùŽ—=ÿyšÞL´¹¾öýÌÀÌÙ›ý´_`¦È½î= 7 °`½…ˆk-=×óv2áx¦Ý”†“Õø„'BdÔ¦g>æ'T­rÍLÒ¼³0ŽMX])J;{W(#Æê¢ž±^‹¢jl­–Zf»yX @-†AÃLP7–“ŽÇ#Iås–ÙºÇ{my;†Cb(géù)(} ?®˜™½´1T¾ÛöòzȽÞ0aC(нá•q;kf,'/ÿN/EŒlnâŠFy Ñè!ûÆŒ„Méøšm¤Ùò/Û¹K([÷Ž4di2°çsîFR#GÙ1âhçÇ~}ÅÓx_ð‰óõÔã7›Ì­x6“)øo™Á´@¨ÕœShÚNzï5Ò>ïä\u/GàËÖÛ‡Þ¾cnùî½Ó¥Wž=ŠWyá‡ÌMÈí|ø’VûU«&šæK:X¶³ã>àîô:öÄ”ç÷Ý\ÝÀO]É—·|2Ô¾—Æ-Åí±íAd‡@÷«oÃ}GÈa7èèMíꙜëq¦[x#'«E3mòQ¢EyjΠeØËLÆèGC¢êì¨+p"­—®Ïg­¶ÊV¯¸žß?òà®snã9Ídt‡æã¨ˆ-DÈ,}¾Âw´®_ûþŸ\|úŸÿ—ÿõÍ›>)Ä75ѽFV#CnB¤àzÓÛ{š^nhîcùQ­ H¿þí -]ÍEàz:Ò龨‚_g‹ìºÖG؆¢Ž6ºþˆñœ*}j$4¡%BÎlÇŒªh‚ú裑 ݲïàṃ¼‰¯®Z?nN c߯ÈJ¥žxz)[}?0ʱ51«³¾=«¤ÍÈ”ñkwÍߨ³d¦Ä²˜ÐžtQ7–²¡ N4ˆÜLG‹!f3¡ŸueO0¦©'ŠttÄL—‰ÙÈߨZTmŽê\£Aþö¸Šï¤r—[ñ1¼£Ò˜KE\Ýõð$“ôDá‰Kô2[W}ÓX¡}xuõбh»)&ë¼»ñ–ØL‰< 9÷Q“]þæ›oféèƒÀ¾,j>zýÙgŸø˜ÛG}À¹®°ý—¿üÙø‘-ÍÙòÍÛFA¿4ev{Ç“„^aŸKœ>˜h”ÀŠtN^Hdp¤u© Y³”*¢5¬Ï¼åˆfèÚqëËzý=¿RcñS§xÏßÞ9üšEèÓø"Þƒ~ØgU k d†ª'ãàb…þÑ=A¥TOÜ^—ÎùÅ/èlƒ÷tø#b8š–ãê-,¦76R:Æ^ÿŸÉ 8öç=®~‚Q'vå3òiÙÁYq?ÝA\á9ñt™šNŽ4š œÈÇú ]À#ÅŠî HmÃ?a[°0xÐeo0é+œmÚqùq»&˺Æm¶óWRxZÎìÐT¬‹WíâΦB=Y²‚ÔÀ¤át¡´Êw&©r+»<'(ÂuªqŸdU7$çG˜˜Ãm.ò’kb-0H`æãÇm<ëˬñXE™Ñêü¤h› ávK1ÃqIE'‚.멲 ¤Es£R±|ãOY!^Ú$ê»äU¦œ›,Ú¢ðœ p–?  Ì„4ù›%k¢J¹Äp‚©BVP¿­øtLŠ;<i’ šk蕞=­fni½áX³™äc3:̃Tˆ½œ¸¶ é›ð1Óìo’rAN0†S±ÛeƒÙ¶ùP«J¹S¼8› ÅqïŒÖ×ÿN=?Ä!…†4´[œ£ äy© ºJÔr×Ó:8¯ßöý¯¼'2h3ª¥³~ÈÿŒÙ­°ØÇÉÖ"F#Ï»w—çV¥<ºøÐ~Š\ónЬ¿‘)¡r!—µÁXÁ]í[B4pâÓÕ\“ǪÓ´Ø`HÆÙ þÆKEÅSÄ 0:¦¹Ñƒ>ã2Íg£Ôœ»àN¾‡Ê¡Jy{smø{ñü›G—Ÿ|þãŸÐç|ú¤EÓd½@3II1zœÓ,i[¿ÊiþÉù ø§dš@F§ÇdñÙ*¹}¦>ò¢{êG0"µ’, óÇŽÝDæ"€Ñ]ÊY÷¿­F½5GQs`Ð.˜[Õ•Z­š¿†‹–Ð _3ÇûêâÖÍ]$À«y׉$yÈßê6³¶ÌÃÍ„¨EE»e bÔ—mM¢{fÃ",äÙ?ÐE÷ÉÀ0úKFI‰ GÛ åÀ WÙÛÕÍ@*A]²inÚ]«d;o]&•â–ŠÖ‚¤FåD“ßrœàa¨uØw§g…®yýäoõŸŽ›ÄXåa„éãFŠûO:c´_HO'ýán¦È–‘N|É!ÎÆH¾IÀQì/<¼xbUÅ·>z¢Ã›^\|êít‡V²¯]}´9iúNª …[Z㺊É«k3DŠÐµý,}]ŸÛPgʇç5™mëVž) <ÄŸ> Ū]0üP¦+]éyñÅ8‘DªÔn:Õ(,jå'µ8×j=ÖüNDöl;Š~õÕWæ%ªººÅ ,Xç4ÙØÎ F[€4#ÌÈ›&(¼¿qK"s «ÇOž}’N¦`r´:5íŽñ®ñQ ‰nÇæMÙt•°úq%©ë9yE‘Á5Bñú6æ“ù”btÖ·Ø£˜ l)ÔÔÇÆü(±U…Ó'nu¾™–uzf‘*„ Ë®‹bIŽŸ·ž©Dí–ƒY`¤”»ÝveŽ.MžÑoôNY?Ä,¯ª’%Íw©šZï?šSDÂIË,8G6}7§UbsÛî`kçytÕÇT¨H°é“Àü`Š”Œw€J$½|3Üsi™&*™ ùºßp›N^~ûܧGÉn°Ï"äyiv?¥åÓ±-IS<°Áüð¬ ×UB§°îëj©‚ìþ ÿÍu-¶fN¼D¨xƒÊP)+ƒ 1A‚¡ôyX¼Lâóx(ȯ¿™@ÌzCŒ`)ZW.‚Á·bA¬×ÿúêFO†'ãf›•î¾ýÐ)™M뺨KOž<õ ôÚEC Ÿ–ËÞ– ÛŤ&€g™”Z]jˆ´¡JnÞ\ã¶öì49àgÑ5RP`¿®ÀWÜúWõS|òÉÓ>£¯gU/_>7ñrN‹úìÛç\Úxº˜a0|B4mýPïL–(ÝZÃ:«è¿n‰È=Lú)*bÀ2À‘ùèT.Üd̬ð£Y¹×Ñ2C)'•ŽêtèR -Á0 8^Ù’™ºàZkwð”‚W2-ó®Ê±·ñ ‘ð¸%…¶[NÝnå%M$U¨»å2h‰o[5\%ˈ°0Xmù~[¹Jp‚YꪖÜÂÈoŠ éTdšQô–†ÉÍLTH-JOð´Q+ L»µÔŠ É„‚œJ‰$ÃX{°dùƆú^8 r\ѵÌA~È¥‡ÓPMöu€{=èàEÛ2‡jr6iU‡Vï{¨Â¥R‹þõù§Ÿ^¿x¥¿;ƒj³Ão4›øûè½¾^ìš= cjµLù»E<ÂÞ&µYp–¯ ó&ú:N<ð9©̦Ôc›ºÜ;gUË71Z¿´@JBÛ:‡ø›w½U#ü¸Z1‘nÚÛ¸û˜ÛÔ±ß<ðèÌÒsuø{úÑ Ì«ýv²íªÍyÊŽøÜfæLÚZ⼆ºp ?ö……éˆïŸ>ýfÌÛ Àí»÷™²Éø&=ÑŽ[x$ðÃ´ç ‡8}œ²e ¢“ÌɧŠ:~‹ÏÁ¶ºKV‰²hVnô ç€QÁêB²¯Z–rUîJ"{£Jçu«¡¡k·ÿëÿòoT;ô£ZKm¤5ù¢Æ tœJ'ÐFÞõ`a@6¥faÀ>lngÉX°Ã4+6æ¿Û 0ó`hq6w¯Z~ùçè~òBÐ6N²á #‘X0qLÐXUÛÄç¾M}YP¡„®éÔNÝÆqJM„Ͱ±2Vq\‡Ý¢kÿk †0I2S˜_ÂïVR3üñ}×É+6ÔÃéÏc_ÔwÞ ¡ÒÖÕ­4,u»8‡ÛÊWŸ2€UYfø— o B®jŘä•RDª`k `°JÉô”¼VcgJìaD¦yA‰áA£(æF™žfž٘¥/<íÜ!Ê\ƒ‰‰è!‘zG"8åù‰ÄÝ‚ä*«m]qo) °|\9ßÐÒz'Í Rˆ¸*ãolšÒ.#»Ú ·æã!#¸Õnï0öZ_›9@3ž™×ÆÏLÞ—P8'Á¯ª4Çeü ̇¶ñ¨AŸ gÅ©XC? 3Ü®sZ °ÌÂ}ÓÂržz ˆOЇÖT’#)ZPO[ÆÆ^ÉžûvM'ú ÿàÅö NBfÞ"‚>ü9`‰½O}V+†¡Pâ¯Õ¶J›ÕOzÇè¼~È^$U¾†[éØT‰+ÌÄVHLŒ¥;ÃEÇÅZt±»qjùP ½å;ÕcwÏ#Û÷"À³O~üìÓO=qØ¥Ù&£Íêh=OÖ°çJ³¼GAš(r°8txèô90ü…£'ÅØ´¤µ¾7dζŸÃUØÁ¯¶æ¤¶J@KR·2£Ÿ«ÒT¶ yøyqàÀZmC M’¥iAÏ+É’øðD²ÞÑР’YâsÞá:Ó/EW€Ô€I+Uj?v¾ZDÁ'.ˆ-Eòúu=¬ÖùÏ„…Üx[ *àÆSUVí¦aÌm_*‡-ŸX‡+~UȃÔJ~"Mð4dê 3t!(¦>âO^¤%/ÅÓÕò*në žÙF̆C`‰1/{ß*9l£©ÂYÀœ a/û*·´«Ìä5 ‘ßÇãc!nƧß_;m}çìá% |÷îÚv~>—½6ÐeÍ„·ÑZ~ ³$b†7Îë„»[ìvlJ›…Að€)ARN ©œDSž)%U…ÍÞjÉy”¨•A\àSèV[%Aõõ„eCIÆýhSRîbƒÃ÷Šm8d‡Ý=3 §]+üæ7¿þÑ>Ç¡Çn8õ²„“WL&v±B¸æëÿ0èûš˜^‘mØŒÙ\9×Ï-n9WO$ˆ9¼`»Á, wR±‚(Yn•+ñäƒ d”k‚bDu«Ñ  ð›T­° 5Xý¸ª¥cÔÉ:X·xX[Ì"Ý#BEÛáUÄÀ`THDå*Òµ©Xð63Ày–EyC5ûmìÅÌ0Ô"¯Ê-£ƒÊFà^4ÛÑt¹q• ˜4B‰ÒjëC"ñíÃÕµ[„$ÀÔ±zYÂØâ>ê#B.ŽOÝfð÷HxlãƒX…ýH8\Õ@Þ²©ÑÚgûï÷ÜÊSð&ŽŽ ö…Â`Dñç ‚Õñ•âšr··Ò~O+ŽNGAáY6hX)Làãù´sëVC0h-ŸD6md©õæ)ìK ŸiQoÀæ²!`hÜÆÀ”°"6jçªq9C”HXÚ}ΨOÇ@…“wÊ`35ï³õÉ"„§qEÌ©&`Ĥa·Hï÷ dÀ‡¼Ü-]ʯ™B5|ÊxÄ£_!„.AðŽ[,É©I‹1ìŠô= wØ9Gñj(×UÅaľ1‹O<w&:ƒA6WI«%4ñHä×uÑL™Va¶IcE;ØÇ¾à0~ Ù¶ ë¤æöÊ™LóU Ì2d0y#ÕwPï—%³œ€,'X6ð@BuÜEc¶æÚ ,Ç>Þ9È—+×%Šœæn‰é †’‚ʬ¾êbUÕ¹+\YpƒkHÖ!a^%,6yÔ{¤7úÔp:M“†ø@w§­ÊOäkæ¦/¦™*M]¿ö ááÕõû'Ï>¥PÔMülއ2ã£ÿ‚ &%y<@e¤ÓJ<%…¤CT5}òæ\Ws20ŒÒoíoÏqSÏÔ[«´mŸ¸€¼rJXB´äq!Y*Q;RçN»5`›, „T"Þ²—¥‰‡ºsSÿFÁؤ EaÊœð’XZêÌ 9tA©¹vM7Ê4S,0…ZM=£QPy @>“!n ¼¦®ìsª fùÁLü„°¾§Ø0Éa5¤(ü(¬¼0Û@T¡Ziâ\ÞHøè&ŰTùªÀǨ™\ã9V#À¶¹Ó0’éØO?í”ò*]G=ßÞܼqεÑ{>Ì´ä ÄtÄÀƒ)‚,; ÛÇ~ë¶“m/_^ÝôÔ#ŽÇíSÞ}m]é…˜y¬òà‚[å„R ˆ«ä9ë§Ùê$1!ËXcGV¶fbjº´ÒË8ç4/A’þsŠÎÏ@®ÄÕm”z¬‘Šöv3ôJp`ƒ$Ó¯¹Å&clœ\9J Rl9$¦Îoãxt裒Mn0³VX-ñUÇ!wC¿]s×pé  !„Ö!iFI;,/_½4÷UežÀ:xÆ0þ’}tŒf°Š +”BµxÈ÷FÆí)ò„óGÓª šÉ~ýô’”QWí Ñ‚|µxÎC·0q?û&bþÎç²Z4Oþ¼ü¬Iq¨vÓ*ðì_ýË¿#¤"j‚W^K”\—ÆO{<>#®ŒÚÌ<¥¬Tšãoÿ€'ªÀ¨´œ^Uñ†¥Uél»å[ƒpIÈ#ARqÖ:JÛÎ xÍRÌ&hŽÁªu;-N2æg ŒÊr²yèkŽ2/¶¬Mÿý—¶r´…@Œ¥yðÄåà„ßUTužÃ¿¼6ÀH`[7S—³ð§QȱŒQ³xWÌà?ÅkÌg!ˆÈ·ep:>¤2ÍÓ%{F9¬¢»Z’Ak:†$FéjÍêx ƒ½ínn×ð{˽æ'ГbTO9< I‘ßÀ­Û5þë3jÉÒ6k'3´êÓ—ˆrUÿ1ébØ†äÆ Y–’ð@^È€o–CjÒµ°jå˜F×ÝeÚ(sÓ2BšpµÞ=Y¨Vä)ëÛ"ÔàœN@qðÓ¾0Õ xûð\ 졺L3ñE«M)b43ÿF ÏÊÊÒwý¡û{jöÀž\`ãm¥æJæv‹A‰t‹g‘»]åà ]Ù+,MOÅÑ0¸"0å‹M•ÝGá¡UírÛ‘ªÛH,ñj=L0«"µPIôOä O%•RÜi»^è¨$-ÊòŠïÇã¼Eƒ}ƒÔÇCiQ–.[g£OJ·s©3²R‚¼ûà;XïÞ^?{öøã=g³î]>}6óÞÔ7œþôê_{TÃó|¯ŽÈ¨²6/[ bY*ðahÅô™¯ºg„nñÌ#iy™-QËÄØWkžƒò'OýØyÎ$ÑëÞ2rn]• "#ië¢*fŸ‚>Á5VhM»ª°Î3$xª¢“¨ ûXÿ˹Ð':)T ¿DQQë@ZüÀ£ŠAk9Ýh9à ò[ X‚h>ì™í(pâd¢½ªE› §4ÈÍîÐnBZÂ$˜iX€ÝBW%ª]x(›n!I÷Ÿ¶áÇ›¸Gð¦„-t5ò x1D‚Çp誑fƒóˆ“Zyž1“Ë€M 9-1‹QkV=­0(d¦4 ÿ²^F§* +žq|÷ö嫯þpÞ‡Õ|æÑG®ÿ($|¸sa}þÄ—}|䞧ɵÅð,[ŠH‡¦æ5Þ¢Bˆèœä;Æé±){œ0hˆ[Ú,O.דԹ ÌX™Yù}ûú‡VÕâLã{ƒbúµòn eð}D!¼®“ ±˜y…I—`OóK2Т¨-ÃIÿôûß[³¿ŸS¸‚‡†~ÙÉQ«çß~cÚ5-迅ܯí\^:â©‘m=· ƒ$ÂmÈп«¶X^™C‡¹Ð2™m2$r<Þ›Ó§`ü|Z5®Á\a5BG¬ÀƒÛF®‰ßnEÆqLƒYsÆ¥üèþê—_øGÝ-%½êä“Fï,/ ËÄ -j¢f3ài€¥¯!ìM‰’÷¤`”®„{U;{nó€$`£*y´vThKôcïϤ4T5<¸;ü¾E‰Oì÷ëÜéN¾^íïÔŸÁsUp"ḛd=´ ®„#$680µ<91bgŒ ÕÔåùÎu/”{a‡ÁÆÏî½}wCaÆL #]¬†§4Š8ù÷­t2ÛQõ8s¼cÔ›ÈË(š».¹õštÿ»±tB¸ÚCK€2Sä)ãv)‡|àµÚ†8Ù¶„R^ʶ±˜ƒ!´­¸—ÓJ­Mï•…MÐRFS [熢U¯*|ÓgdxäjÅt·ÏjMFÌqi,JÈè rBœÞχ• I>.¡dÔÒÞÕ Cî 65›37‰ÐGêEùªEÔãyŸ’ìîc¶Dè=mï•ì.‘•_¶Ct1ŽzÖ÷È`–ÐqEÀq!=K‚œÛáM‰Ž²ƒåL¹òÀ4³$b{h)ÙBsҌ鳚äZ 9%¶)ËžB — S:Þ' IDATW…à.¡è}øðégŸ*×w`cÑÁÖÜ0œ¢ ·l cÀ¦íâ zX°Ã3^q 0f?š(\ŠpN6–h[[i±¡%lþ#µWw× f ¤$€`€—ï}øÎ«RËáÍõÍ«Ï_>r¾ÿ×?µ5ß~¼ûÈ–òÅåõM§b½ç±AÒK,9æï± õPó¹és3³oÔÃ`Q{ÈÑü2 +7€Ù“P‚ÈjË3½}ÌèLϺø$c#t¢p°#@¹sÔaá˜pÐ'=(‹‹Ö•àH«Ý>¨3k/;ØprCÔW.­&5‘Ñ !žx{»:œý˜ÕtaœËH0ŒxFó` ( 1·ðµ‚ÔýáJRf Ë,9WÍ%%Ò † }UR¸ºES­æƒJaš˜Ö!qëzBÂ}ºÕd5ï> qc²¬Ý"á l¬Ç93¢©”Q îEåV[öž39Ãv±Á×-ÚRÁçMÕ|°­~¡9µ’\ÉÙƒ _Nyóêå_þñÕ_þñùW¿xÖw€Iû»÷ò¢g?ýgz¬7,|8Ÿ¬é\§ÀQ$Ì=FÆc½-ÏüÉЧ5š<0tiq#çl>Ñ’bþi6™ïùz”‘>=tä+$<݈g=ilÄ)äRÈŠƒÒÊ ìÍõc?¿Q‚C©·‰m2]9ŽFi|fÖÃü$5ŸÝ\½¬á˜x×*gšèºÆV6·¨Îé«?ÿùϦP~£Ý›,QÑV¹âß ;$ö;4-õL¿¢òþÝ«W/Mb© Ðb˜PK ÛÓê{i!þ=bÛ üh²^goë#ýp§Â#‘š^à—F]yþ8@±á)¦+5V!â '¥A¾ëlW8ê» GoÀ˜;¤ô&$V>7jxñ›\Mò’-uÎPÏœ@Î%lH¸ÄÚ° \øGH \ŸÂÉ™“On@jÈ"(Ê?ö3s  ?‰Ö&üí·Ï\’âàvæÓ< Ñ¥nùÕÀ7ks5K­y³½aQYCz6»Ô¡pIf|ûæóÏžýñŸþðÛßýñŸÿ‹¿}Km]7Ÿ3‹³{„9’`¦…V‹1u&|&u?”ñŽ!ó‡lÝÓFé®]ôÏî¬Z"¯š1JÂúÖZ!¨íIÆp‡ÉÞ€ßëu¥ùâ‹pQL$¦¾Ó;ö½-‰îKf~Ó¡õyýZ¹«_`ôÚys®ôêãßÝ?Ï—ÀpŒý£i·4)à!J«˜Ôw £¾Æ•‰¡A¦•Mõß¿¯sBk¿lÂÄ3ëŒì•}S‘Na’AŦJ°(²™7#¶’|,™¢áщf0@u[EÉK®‰„ în]FÒ"Ç(ÿKÍ‚D4­¶;¸]Ì"ÃzNb&ÏlšHýÌ!£ÉÆPKRTd r%™± ›ÛV±v+û˜í”/-ËlNãëtópWïՅмÓÑô<þ»›ÿ×ÿñ¿}òðÝž:ÓýöË/ÿBÿßÝüáé³O<û™'ß>,Iß;î‡ÌŽ”È¨cõ Ë€©J9a©¢“€€nqï£2ý8iΖoåÌxÙ‡€0Ð%¬þ··27rÒÒÏ3¥†\áêS¡ÚN_èE¿Yd¬~(óÜÑÖôù\d³lc´·L^~óõW|Ã*GÛí­§Õu©W{С‡‹±°k¬÷«ês£÷V×çÉŒät­üÒR¹Ùè;OjíÑ„¯-ÄM#¦k{ž ‡ßï©?.IÂë3Õhf½2ÆbÚoдx²a€éü*ß½‹Go®‹ fHðì÷õUÍQÁ¶¦SÞÙ/8o˜SBõ°ST,†ÌÄBlöÕl!ÛU¨èêižÎeÖýäÒZÅ‘û;ζä³ôÃ_ëÉÉ !¤¨Dm@e*å^G¯dÁØ3HÛïÁ¿®5â }ÐdÆf^“ïNššBƒ‘µ¡•èÓôÍ¢Svìw{ã|šÇ»Ü-Ü•lN¥Eßø9ƒBæïúpˆO¯_p2 Äü 1cvE;òëª$®Y.Ò²oø`GýL`Ê–u…‡â²Žíâ’9% "ú‘`jC¢ƒqšTÊn¤â ðÞú‡Š[Óë´Ô–[ìVVûPmh71s§ýì§Qö‰×ÖQ›øeêj&^—ÞmÁP šù9HSÁñïNz©¤] J5’:!„yñšv|ÅÅÐê{)øÎ]Ñ´±ÔYìû"…ÛyA°¼‘—ó™ûð¡ aK'Äõ®P®4)$8NE«V~^\¦vs+£ßݼ½1}¸¾¹"-VRg.¨sÛœËóÞîøáG•¶Ø×1ô”öŒW‹dÄ+NžóqãOÞè74}*[—iXG*Ž1:ä˜&]`ŒRôÈ`çÚ|*Ônõ#^,b}`»Â–6g¦ïͽ}ûj~N«åTÈž“t ëÆZú’Gê#Ý=J™ûŠÞÇû¿ÿ÷ÿî?ù/þÝÃÃ?R|ùøÉ#êrjÛ—®®üäòÒÕ¶ôbÆò’¦ ÆàG~&Ë>a‘åŠ.ÓšqNpìWY¹Ûq\n`ŠÌï}µN>®›Ç”Œîš÷¤OÔ¡+lC¾ñjgDüT k„ËCæ 9$œÞ¾ñùC_¸…©Iñð"D|çñ•G¯öëD½KÛ;eõší,}HµnŽeëDƒ¶Á•ÃcKñf ¸0æîIPˤ¾&(¿ z`ã*ÄϨ _3rª©¯À¶m]Œ ˜Œ¢1æF93X˜×Öß7'àm4ºÙ_ů_ïš]^TÓgpß—ÍT¡Öú/U@¥›3lúà0œý˜ŒËåÞÞÔ›áÖ1“…ͼë(P½6;wvñÝwýÐéÍ›ßüÃÿþíþáí׿ûÓÿ÷ÿ|xï7ú)–›·¯ûˆÏËoÞÞ{ñ㿹sö¹­s.xïÁ¹µ¯ø%‚‘ä"ßÿ1Ó1ÔÆð,B‚èô0Ë·w V0]^ˡۙ`i‡ÏœMô*}Ÿˆ}×ñA“3o†¬¼†|`K‹Kˆò·ªÀVª;ßùÙ%[[,6çè7˜U¼B¶£cŸ<~ùÂS/>òîâ¼WÍ×°Þèþ}±LÁ“vÞÞèn–,ÔyñôéåÓ§~—D_œ~ôWe¸2åyúäü«¯¾|}}å·;,¼n•¡ìYhjkPï7¶NHœ\Þ÷ó£s@hw¥ºªÝnÖ¤n=Äãá‹z¥i#­î´›ˆy>J'IÀ¼øù'•7²ÌA }Ê$‚†áIBË?ö‹FÏö8a__½:ûÕ?¿ô9C®!Ç –¾þìØoßêäèI¬ràšŽ„¡½EÆy4k'Íu×5ŒÍZC\ë¶g<‰¦q^î–4‘©»æXl:¢x¸ [(ù|$|qÝ€ål1j’†š&Úuíº4ÝfXÇ Æ¡—Êð^E£Â8ñJa UÒGÒf'ÌUÕ ŽšZ­ÐqŠ…þ”k(sÛ[dÜbaʦF3¤†Ç7ÙJ“ÓÏQˆ‹1~Â…–ÂÑÙeM†²åê™ý˜f¨·O n3¡ç¾ýQxæP,ÿŒá—~Š>ø ˜ÓvUwh‹`¶f$FZÁGÏ‘‹‘Ÿ´"$Ë<·j–b9À>aJ•K 3–Å&]Ýî¨U>²Þ>Þ,¯~‡,Ãwyˆã)s[ßÂäÐÙÐ3{‘2BGhTš»+âèË­rR(!ˆCª™A–·´KØ<#vUÀó&ŸÅSf&(<¶u6)Fçc÷y¹!ò™ I€51*Ë ­Ñ[R 7 IÂéœP)‰áSBš§7slæÑÊ•o©tKvƒ¶=;%°â„·«†l½UÂñ!À¶¦E˜[ó`!sÃ$Y?EÕ4ŠK,jŠiÚu}õÙÓ‹/ÿüW/ÿéå«o®o>yúì'?úÜšèÅó—ÏŸß\^|Â?Üûîò™ß#ÿüòÉ¥Q±×ãtâbgcÁˆ磴Ô~00]LªÝßÓb½õæØÏ”›7ŒuhŒ¶é§S¼w­D%&ÈÑa›7il:;œò(*¤sW0¼Ã¼D9Þ$˜q«ƒQÐ8|3%¿þõÿëp¤å¿ŽgG ð1xa>ûoÿáÿÖöé“'Ì ?6..ž\Ú£i½ypºåÛ¾)sõB¬² nE"2®–èDCUž6Z¥âY9Ù׬ôˆDÊœo¬Ð+x¶ãÇÁgaÑ:©Àq‹aa¶Ÿ,ðèÖ+tد³1œòäÍŽõØÕ?<–xÂ’ýzÞJj0€mªò°_ 3BÔæÆDTø½ó4ê¶áÙapz¶ú9ü‡³„é7 ‰À-´xƒ"G˜-}åÑ<«ÔmÞ5.„¨ªa‰Ë˜˶k&2’Z½Œ—/{€—gŒ¡uË-öqáj"bÉÆ˜²ó&²†£y4‰ÛY걎áÔ•8ª«Ã›y%Hi¨´>– ÿØJô©îò|M¹óåŸþôÇÿð»ÿê¿ýïëíõ+?åmqüÁ–Ã]0&I­…?û;)€5÷Oô÷ðÓ Ó;¿€ ØíÒM7©7 ‡q6(nKð)Q¯À¾N® „ÒfVüÛæ2Òð+µ´o@ë{ª;…VÓñùì'x(2v€PÑEåØD‰pÍmÑî¸÷·ã0È]—îޭ—Éq†éÊáâò0JT¨N[% ¯d©èmu øáCúÒ] Öq8½t4·ß[ø=÷™ÍÔaK-3·Ñ¡(yGYt‰¬£YÏC°½OCjP¥È&×wï>ÿúÿª¢Ÿ}†‹hµZ-–¨O!*¿ýíoÙ¨xê†E4É“Wj:EW_öC|järXûÍ—ü·Î;?zâç`DV6‚ùé³Ï./ž>~üÌ£ˆ—W7î=ýñ_ÿÇZ;c”Ör8DÔu9Ù«[Uf_%›fèäË?GÍÿGEöàÕS4ñ8ýâs^'£F^M4§2ú²—O–/$*k/‚˃‡$¬§èðN€.[lÇŒ&€Á ìÖàî‘’Çó@ðù·ßÚ!•oѵ8Ÿˆ¶?þášÿìg?ƒÊ ƒ/ý€ã|PôÙ'Ÿr6?~eïÚ¢Q¡pâÙ鼞¡ùîTÌ.lfa, øíå«5Lè:‰ Ø”&zÄ-x\M´)Æé ¶L Îf±­ÞfØ·˜CV{MiFåé‰JWW’FebšÌ”ä;»k:k l`ˆç[¿?ý‹Ÿÿ\ë|Ðì ÷€&BåšKXåaéqãñ”W‰[Þ gäßL>:Ëh\rë~#eöuà”ðÅ#÷óµ´¿óSy}'èB.Á©‰Û͘)Ð !µ®ˆ ÈØX_Ä!H ø\þÕæM™k(ƒ_`\Çq+Ôvjб:É¿ñ=ia&Kd\Ýü-BjC¤å'‚VË6fȈ+…X2aÕ*œ³d<ñ@¨mö/I X¹}Y×™ØeJR.\LHmèiÄå‡4€ú*ïÙ« ýLÝ`Ð2“$SBC’éâ·M,pÑšqNF+x4±õGTÀà6ªçq=ÌnÑYá+4³$ .þâÚ2€mDGä}rq&snÑðk«‰ &S(ïTY“H*ŸUȸM'QÝŠú oWƒ%^í‡Ì,}0?VYÀîä5—¶E²ÅŒOòÈyª„‰þäë½qhV±ð‚ÑJÍÿÁ+Üç0Sƒ‰?Ø¡rü†àÚ‚T&‹³{ͬëÅ9Æ4ä$2¸m;êìÞÆz”ýôÆ<¹ð¸ Û”©%„°xQ‹–h=‡3©¯ÕÉ.Ë-…YˆÅ†bºoÂ7·Vƒéœóäuªd“ÿ¬ygnQgãô æ,Z¬Ä¹DðS#éä]b`EN ¡[?+¯ «Í!4ÛÉh™”®-M™!«Ês°Ú#¿†@çŸþä?+rõ¢ÖÙã'ƹ+'.9òˆ.EÁgbQÁ )׆Rä|ª7&j>°œc@]ɬG¡ZI+â·»8l+9Å«B†’Vž½àÙ¤DF­Œr™½ÅžíìáG=#€ƒÓ-àQO^gL¦vYUÐÂ0k™ÅL.åC÷‹ò/v@6`2Óº.¹I Š“oh±q+xV?ËÏR\þžàA­,¸8I¹%è(‡o›Ažv4œE¡4ÚÕóå¦FÖD¶OÙ§¤mNc곡 Þ4œñ5*šëçƒðÑýÿŸª;á­59ÎÌË}'ï2‹,Ùr¤ HŒ ?Ì0IJµÙ?16bÁ±Ķ–‘4šånÜÉË%ÏûÖ9œIç»ýuWWWUWWW/_Ÿ-ã}¡¯¼¹ÊV_*æµ½m‡ ÀêÊ/º”˜ù¡nˤ@ÙŠ,. eEF_ŸË¯½íoŸ¼þâ³›«ÏàÝÚçG •™Òº¼6vÓjÕâòíÍÃæÉ«?ÝÚ>ê’‚ßscW­9¥k@KbèA<™Œx+ÿ¸Y²F†ÄKÎâ“UÑe 4ªé®uœÈœ^чXK™Öí´uT¨WQÜQ´)¡Ä_yWa°##–É3¢Ë/ÍçW€z K£NG@X‡Zót³×ï—|¬8>Ða(ONœo±n¨Å¡¾Ö!Mñ_|ñýïÿý»÷ÏŸŸ:ÏNÅ·鹺ԌÿðÿÓù­>þÄ>£Ÿc™`@!èVœH,΂‹ˆèYÖtOßY#Mßmngس\Zb1LÏ?R*C–*sfU¶±9Z›÷ß܈Hî Š4åØO4M±o-Á?)1X=8ˆe¥£“Ò1ïä¿ñ“ŸüX’bØ Þ%zªxÐIâ”XÚ†gO¡bÊ« Ë@HÍÅu„Lѳã™ñO1¥«H®WÄz’ 8j9… À°é)À[6érÒAj³NS7­Ôç¬îF°Fh„?Pu”Uû]ú9Vô½à¯í‹UCDðð+â?„a³Ú=Ôö´»*ÒÕET4ŠKг)n¸¹¹]Xú&¿™Dbv…6 3á‰}J¦ßz›ú,P>Ša¬Í؉$þ~œ™åN¢®#Ž`2Q ŠZqé^ý«ç“°Wh+ϨµíPƒqÌiPwÜYþ±/“f [#â-†¤Àà‰B~Ĥ¡tŒëÒŠæ¨bž b6íÕæÙÈI*%HGà©Â`‡kŒ=ë¯#‡N´Šî0ŠxèSÎ< ˼nJ'’ jçÈ,gl©œ›ju]Ò¯‰ÊÙKºÈz¢–¡uT‰lâ*B:æ›?ÅÍRhâ´x$¼ˆ1;øi”ø\ˉ–楯?­6ÅÕÅ">åæ5‘NBåTœ²itÂñ%Q%Sjüˆrƒ¹ø„©wŠ‹£DY¯â£9,]00Ë¥fr§˜èŸë0¼F£óQ!‚6FaŠÛó£Ý™M1V&îÑ-åû¬¨zô<úB’ruXèY|˜EXj/ΧQGÕ#OE¤ˆ+Ú8Æ<éÊJŸ\ÏQà /LV`VÒ@*(KÐ^è'^†B1_ü›Qžz´Š°OåÂŒTðä3‚’‹¶|©ÔþH“f@9Ø?À¬D²UʦՌnN•€Ñ (yùò%!hYŒôR²"ðNYC˜!\¸¼z¿»ãÁûqýq÷öæ|síÖOÙ?[ß=99ñ -îZÈÚÕõù_þþíûwògÿå£OpåôÏ–Ÿ•³Þ<ßITµÆe¯‹‰ê‘¾Ð9BCO„° ÓFm5RÔ|ßÝètUÛ±T”0:@ÜLn•„chi¹îẃ„»û9P¥ «Õ±t|*õŒ+yF^.UÚq!~‚¾óƒ³0Fù©¿þÙ[溥\óü*Â#üõ×_óÛÀ8÷âô¹†–k"êGZß½÷ï|JþŽ2¿xõêúÊùŠÕ˜^ 3­¦^dP ´A­¯k #5èÈŽþË­`ea¥F HîdVJŠtË'"YxL§ÓÒ âªƒ-g.ÝßebÒE ì{®ý+ ~Ò!_N¿CÖI•TW$üd¦]K1•©X€Ëk±wZ™ã´‡æ…D‚›ŠAê>Ä:EL‘¢ ' 9•¾š˜§R´K¥†OÊN»†Õò ¸xQÚãºOVæ `²¼˜¬©}ŠÏÅ¡H%âÌ¥æ©Ç(¨°È0)­TbZ 9)[ â)K?‰ªE¹‚‚ˆôÉ’+ˆ<$*ŠÜ¶v¬ÅHg `%Šx ’qdÅä•ÃŒÔ`îU²É´·Qº ó¹P“¸ÑGH¤Aáxµp’Æ+åÒ'½ÂY5SBXƒÁmjˆ<^eŽÀ% ^'òÉòjlÓ|ùÀ+Ý8¦!k~WA³?<Ë÷ÈÍ9w]%ë@ÝhëJ†*€…G:Fz–ËçàQ •gnjf@"ÒÌ B›ýkeP!%²†O6ãi®¬8J‡ÊSPV=Ὰ4 Š\¥ødvydé/L­v[ä±vd¬¬Wíâ…3fzQ}…?í¬—ªbÒ2%ÏñŠ ¼í8Á¤[<ÆùÐØé 4Øß!Û  F}  Š ârµ°†¢Ãmí(|+Íð=À^….|^᜸²"ÚK"†BFP3˜b‹ò·ÙƒPc)RqÊìªí‡ˆÑþ¨sÖmF¼Æ!¯OuÁœ_eEIû~†=Ÿž|xùâ%“}¹X|î‡g[*9rû‡§i´ ™BUU9­Ô[ýrÆ—‚H0QWàãIQË4!e@¿ŽG'ÇVJÞ†øFÕÍ7ï IDAT"ÉÕßP®¢Ž\Ú‚–fC%þg!×±KJga­sWeçý² Òî‘j/yF-Òu|¯‘س¬7““˜b·’‘»ÚT¯t)„Iè—ƒ‘W´YcŸvåÒ£Az¦YS$:?e=%Â1Oµ‹#U¯²<ÛÜ)"D ¶èŵ>úÁh#XA:Ýp»øÚÌÛZ$–ö„ï-‰ü'Çcv:&xëÊh±#/®=Xq5"…ÂMnÏb§t!€´¹1ÿWâì?! y°ì±E= ]Ê^|©ì$:Š ¹17Æ„íåV­±9Ê=»¸;ß?8¾¸ÞßXÛâøôâêÜÏ­Ó4?ÛÂywOñÞîþæÖ‰+Kýäq2aÆôŽWQw8ƒ¨†‘êUûˆn^Ñ/wÚN®ˆ ±Ìºœs)²I߯˜ïùZ RCÀÒ!ô4À2P€½³¼0\K”%­ÉKU$d ®Y‚ ]^ïûŵ¥Áϯ‚îl½|~êŒ $T]-C ÅvœöèôùöbŠYrMÿöÝ;TÛÄ¿¾¾`-I ZM£™ÂòFÜe·’ÒEÀ‡&®Gxk]ïujDãŠÓs3ðGéb Šî29©elxÓˆÇF±~Šˆ7莜¥( ùRY%ôbé*õ ¡|¼×¥ ,œ²r¿€êþú¯äs?”mmÖ¹–³‹3Û úÎÓø­šAÔœ}¨qˆ‚¢`Õ_Åâü¾sÉ‚‡^––-ÿ¢2–¡Û(¾np`˜%{dÁ $øü -(¦J4€o!$³Ç.Q_)ˆÁ*<ƒJ¢×@¦½Ĩ úú옧‚4Oêb{ªßO‘ Våá´€ E…ªT=/¥Z†Nõ)å)eFv¥† )ÈHrKb<ŸePN% äŽx;ij·Nò¥™u%Fþ^EøR­ÐݽàËÆQpVÓå¦á‹Ói>gÆÅξÑöh|MLЏMF]wˆ‡1°y…‘M‰—¤?ˆ‡±ÝÀ+H8§¤à‡zÒEŽ*ƒÄ—bʨ*2<êýF(#KðóWâFŒ"%%Ó‚rÍh’Åç´J ¸›² ÕRÈð%0èéÝw~þ==yhRQU4ÊVôyH¯R§W‰0>p"“Šxeâ÷ÁrVl€Ÿ¤ñbm¥Ÿ6ÔÍTqMžÓ³VdLS}Ïhùº\Å»§„Íe»00Ã¥!UÝÞ0£i$6®’-E*ñB4l5oóª,äOD£xC:ˆÈ4½-Ë4)G¸hÖ:¹q ŠÀ™f툂/Ô®™: ÎYÌŒCÅ·”­RŠi6 jj÷wo7{Û/¿÷Ãó󳫳wÏ6w@ßß^“I)îc¨€Ç†Ž†Ëþ5Öãm¤7ùFp´}GVÓUFôS U^k™NÃ0bð‹ûtÌR5ò×F0Y»I­‡td(ˆ+.‚Dº‰Dƒy¤Ôáòâ’ú*îvãìwgIÁ•á²ß)h †mãK¯"RTê­DA/dÀvë»y®?Êêð«eRà¯A릌òejžÄ+oxî<‰£ÿ²¯ðG,Ô‰6šOtaÊ x,åK.Ü<±àåœvªÞÓ›äyÚûûîÝ;UÏ29@š`„žµžžbàÒ×+½ÎBgº­íwïÞÛËWœYÜÈhý¥õ|û É8ëFâýý#NHËçØW>°?{ûöáîÂïâøÔzÁÁÑñÎî± @‹E}òéÉó—·×üŠÎæãÎöáå¥oè´¾Ó#Љ÷ <¢Æ…æš(F®ÈäΫl&vFÈr¥ôFuÉ :!‹ËCåÜGì”ÙÇ×w9áO$Ù ¢ xRw‘©}¨ÒV{VDztÇU0›í²úÒž;Ÿîà/ÿå¿|õQÍ;³™ãY·‹+8®«ãµéBÒ÷ggº'_Ùù-_úø]zW¼ogúÃÕ¶E“B‡G{lÇèF]L”»H…IÈG<¨Æà "Œ€í¼D;õJ¯ÍíúZì¡×,W1ƒíòí‹\_ßYStD.. h Céû< |^—ý§öaXëÉ4PéÑdB哨 ¡8Fc£ðº‰ ›†?þñëßäÌ¿`‘1gÁx.§PXžPyj¹ic¶@L¢tmï‰ùR_\í–¤cP¡ô–Ü Ò` g5ryÛJ€u,ÒI‡Yý éºw‰Çƒ ò±ž£0ÈžQÄ>)W!spÞBzp¡1<«NËf;X —»¸6À ¯  bGrk^€¥3Ëò¬ƒy ™ ì¥„af‘‰*²"µ6õ‚Ó‘R–” KJòÓ,Ä|‹V>‡4íy…t¨FàÀ¤#òŒˆz:}ˆ§7ƒ‚9yÜVKFål¾X®ë"°y¼µ¦|'m¾cDÓèôXº¢jÁlŠ;ÛÛ}ŒôeÍ #Ð5Íj×[‡/j šÙP)ˆPÊ©ôj©UDPrÔí@.èY\%Ư۵dÂXˆÃ$ÎÃÔâ°Á¬« ’Åõ%’´R ´äŸ 0Y©eyU°)”vfXiïÈ$LY/Xð„Ô«ª…ȼ*8v#D y˜ð4gÕ°m:µ ¸T´9 ÂÇD0½Í÷T2sYyY°h7¶•d¥(µ‡¡Ìý1é_A¸¬aÑe_˜û~ /¥Qþ!FŠ0q<Ê(aâ¤2Ã> ƒlEÓ©Ód^£ny,§†ÃQÀ#])ƒÙ3ðKjG˜™ÈÂ#+=‘ÜÏ•q2Ì]7êG5^}ïؼ½:wO7…\%»!$Czt&4ÄDg¾NI\²` ÍíA±$9W0*Š n¨’¾Ûûó 1'ïÉ3ã#tñ)¯NDèZ Á໬GͤƒväéµBˆÅÉ¢!9-Úëµîî9X™ÓwðÓ²ÒyŒøx’˜²°)®C )#7Ü æTÓ†@’¨ªSi…/K)eW¹1¹Ó Ô®ÓÜÐ>Q\ºúG$O "C3ª±Ø¾;ð Æ99Œ×HÆÅÏÆ#$ØãxPவ‘&›#…¸T5UO{™™ÇEëI8õÂÉÔÀ£~cÓŠøX~›¦v¼¸ƒ@EÌàÉÉ©ÛÀ#Up’/Ñ 1’±×éïnßky›;-›~X,¾rŠÓè.\›ŠÆqÓ4ÏxÃÛû»Gߵ쳽ïXZ±~{í.ƒ]+.«îIbS/’P+^ɧ}Uí©jÂùç‚’•{¤é± )ð¥ÓaMíì€ñ…æ([€é×éŒjQ°ÜŒ Õdµ#I\£Ç³±Ð݉õ–‘„bÍdÉ!›¿þõ¯èçÇŸ|bH"´œd??3c槪…ǧ µ6-báõë×(ØÙß~ÿþ|gkÓ¹kqñþáw¿ÿÝáÑ>ß@¥ xØ.sGIxDŒfÕ"K²ÙÃ^h~§‰ftUÙš´pM‚ýå ­¨#|ðc-#áºÃ½×')M[–H&šC&Vì­F –¥èb9‹9=Zíž ¡ ©w~Pȕǿÿ»Ÿð=]vrk/cÝ~§Y”;™€2vk§$¹ž'¿øA«4a:-Å×Í“]ª,­ç.f «$¥E ò]Ú•‹Th;zE d”ïlæÌú›äŒrì‡`˜ c Ö÷îC=ÁaŒ¢ò'x L0j ÆUDÃ8¤!r‡5•8O‘r¸ˆ±í=‰O(*‡ üšV\Êû4LfUµƒPÕž%#j𶬥›ÈŠÂ`6‰ŠgRÑW"U"ý‹:+m¶Löº.ñŒ—dèÐùUž—çC'’ èXcYYze-n®MÚGÓZF)†i¾òS™?C˙ՕŒ@í{ÄhØË׿iëŠ47ÕŽ@L0"nS¢ 6¶Ï44bƒõ*ô²ß¬U¿µE6y<èG\Üš¨Éz. šgìð´a¤=éõR/Šá½\CâÙ€ŠwHæ ¢†Üx^üjØM}oìÒû.y:i4rùßu¾é‹ óÌ3YЛË›Å!sÏž.‚ìê:?¬k=¡*ôÛG•b&HϺEÖ7Œª9àõ¬›VTyíqgoŸMãQZô½ùpÕ)‚îZ1MÚðETôF¯ "ø¡ã¢Ö»¹@Eµ 8Óël¼²G$«ÑŠæQ}û¨¹ÔÍ^·ùt@—!O:F(ZÆQŸMB' ;#j-RŽ\y>gÑ%H’kŸ•»¬om¸F.6:#rÏ·QNš®cbC• EÒ ÃkÎ2gÞðÑJWÎb"i2áûè[qã…1WrrbTÁ´¥Ôfô¯W‘0]Ðl™ÁžÖïdÏÇ~:þ¡3¸vvýHßíû‹ëO?þ˜Ó™¯f--ä,à–ÏÍŒyOþˆŠ(‡ŒÈŸ²±’¬ž®ÝOd*âèJŠj¯¤·aMÔzaŽîÄÂfî¡Á0Ì Y¬æ Ú$r‰|sâ[ègl&YÑmÇ/¢-^òáÛKMz¨%$ÈÍN´õÈVϳ٤÷iôÜ~àa®™<ì«È9çcÒÌE;‰_×goÍÇãvçºA«¶ÅëÝ]dv+Ì0£çÕL„îýòD‚õ‰˜k‰BæÓ‰”±Ü?¬ñ·,Û’’À¸KcÕÕ)‚eÜI“Ýùñ.Æ N$õ¡Z P˜¬ÿÑ~ŸåL×ίÿfþZci…ó‹KnŠq"ƒ‰{ÝzAš™\Fhk&¶ÝM:ØÁÌ"ØRDÞ/..T¯KèmÔ—ˆµEÔŠQ€n¤b_ˆÆ>³Í§»q•¼b |…èj¢±¢¥›ùxŽuÌg׆¤æêx;·k¹ Œpwy¼Ù¸:÷í'nûüìë4G?±¢ˆ¹ÁàÎHgÏkïâúrçèùöΉÃF;ù˜„/éÛmß>"4b4³c~/‰3X¨·Re¨‚q í£¤Î¢¿²P¹Å¤ëÅÅY7Cõ✻pŽ Ž´µ=ÞêÎŒÎÒ²ãSÄ‹j[§É.¯®éŒHÆ> ü[;£ºÖœ+§ ª¦H¼ÃÅÂOñÆhÁYgÆóS’\<@™G¥=¡õåoÀ¹CåðÈ'ðDD™×_Í2ï9F– ,رL‚>ýä;oËŸkœ:N2é$¦Xk %Æñà÷˃h ËÀüZÜÊ!úÀª…"Q¸G‡“˜x?7Á57D)øÍeW•ö°ïE¤àë}F_‰Üxª`FRÆ$ýÝ­÷WÛtfkÛ¨¼ñóŸýD ¥Âûœ^¤”liÛ8ÒÊ@P§ŒLóJCÔÚyH¥7 ®§ #å5–(êM-à™ŽÇüÄZ†Ú¯Øb4 úC[ŽÅgîÇ%‡›-›Î—Š Ù®ÓΣçÀ¹ «Z˜MI¨Ìo$bDRˆëÌM0· ýÈø6˜\¨$ʼn$â²ÄEæuâžJ)2`²&°Z<µx]#ú¤È ¬CWÁtJë£Æ#¦¬Rà½Æ ¦ËÅšWh‰X´ƒÚEÊ_lú¬ªð¶¤X¤‘Îñ bi—Úбò4[á°>ÊwCÀ ®¡š™"ϳ¨á0h eU›xmlWdæÄ™(ÐOLWüj¡aF{eùæÚe…JY7 Òkl J‡´K’eQ×Û˜ÅÆë×N€GàŽ+!ÏÈÚ”hšn ÿ¶Ÿ°@ž1jÕ²"Bô¼k¨*Õ8n®r^qã1–fåjÀƒU£ä $õ¦¬xb$–!.@ú€|`Üa.Ömˆ¬Ø©~?, ¬_ÌËáìC~Ê7RC,ð‡F¦®Z¢—Ät^É‘§ŠÑƒ*)C5Š3£Ç•\k½L^Š¡5•¬ÆƒW‘PE˜«ÑÎ+ǹº|†<§Ñ˪êÓÄs¹ `EFJðXKè8½•x›«(àÝíâïàap‰Ì 6¯·oÞ¼üèc;¯Z?cË֦ˠóAiS=Ëàà¬%Á¯I–ZÒ:‘Ʋ™2º—/Y åŠÈT-Ý+H=àc¤W†¼3FÒÁ ˆZ%à즪XeùmîX¹Ìñ)Z±é»Á}sÓ<Ö‰²£S·º´©öVj´ÈÜ’>kMf:,QÌ[^Ë•‚yˆœÖ (AðŠ»Ìœ҃äÒkü— †aJx¤·3gˆàoGHL┑%žÑݧo Z=‰‚!×2!äOÙ4´:°D· Ãcî‚÷¨[·Õ¸5ìkhNµSE0B•†«>É QËJ•ËÞ5˜¬¬—dK.·ÿ5M$Fæp&"¯p’°"$ ÃåÙM“©Q\q>Eê]]ú F}Z!YÃx% ])=Y{hTÑ”lv@¥3X­RÄ­Ü­.ëk‹ÅeÉæÂÒ˜§Ø !UGbêÉÏPðÊq¿{¿R°wík‡(ijà èëNFµ“,ɱhYßeN;òá–ý?ßwõÍ¡sv”²- ƒ^u~f]Í«!dFÁ~£[AÉŠœ™,Ö™CkîÖåRƒƒk‹…ìÀÎÎÌBèohë†[oèŸ"réÀ¤LÀ_-Á椑_¸è¤ õGT¢Ã+°4Pâé/zŽ6Y9Tå.<ö5Ä(%®"¨ ”Ív™ hæ’‘˜Ébï~®§’"†…j Ê¢Üë´øg?„–­ê< C÷ÒÁ¶ÖwùšÀëÛL¶ïÍ­C|/Ö³üØ0â’¢¸SþÐW?x ŸHRk‘¬Z‰HŸ¦‡ m^=½"rhé>Hë%‚“¨²("æy¶vî@y+›p{‚ÚÇs û’BçÊ ((ÅSCp; ‡pŒ¤/“òæÍlj‚+¬ÅY Ù‰¸xûúõéiwÄÚ»ŸXS°EÒâªMŸ_‰BñdY¿[5 ÌŸŠ €'lÂd‘ˆÀ2T‰Œa!ˆFæ°rµ 䜉ÅÝÜ&ê-ÕÕž¤ƒ}T$¨ FT=ÄiªwoÞX8:9%„¶E¢F÷¹òûý=”™›&)D‡O‚Í=òÞ¾;7¸©Wgá5ÙÄoˆ;TYñ‰ÓU4¹6?ŠlLïß½ùýÕù—=›°±¿wÌ7\ä[ÍË‹E,ˆ‹¬µlädKIÏÎß¿ø„Pb!¬îÄe¡k`f—FmÔ¨vìËD³U´1h`(¹'íà çŒV)97mß³sŸè§Du?l{ëЗB+‹")xs“Í5MæIòas50eš¤º„Ú„Ðá`¨âÈYN–h`¤†æŽ§[;ûYŸ»»Ô4°Ã“cKÚgÆYá?|ÿϲ֎§/_e[!GÒdjAv¿^\íäó@¨à/UþÊñB,‡«W\(#¡± ÙMG“U¤Qp1tÂo°šD½ZqZ¡Ñ5/þK) ¤6†©IQpZax÷”Ul¾g"u~zì¦ørLÔq2gΩ^íAF°è$|OÂÒåCMK‰Ùµ¦×>ÃTòÂ6Å\Ò»eUAzDð>“Ž­ÒÅ; S¬ƒÉH$hù ù-&ÀJo¾>E±¦‡–næµÛvȷĤFˆ´ßŒj¨s˜©°^Š’Ôb-­n/:ŠÝ6Î !ªvÕF ´UÎöBtùRP˜RRÔûô*20óTJD¢TâOaŠH”Eò! æ@0ƒ§gé?ðÄ—x²ÔgÍ`$¡)RúSå\½UÅExÁ*KvÊ–_âQ£gq$Þ\¹VÕÍZâ'”ÓVH…Ô–1Þ”JŸ(r_^+óÝ]•?µ›Å†?¶€¡ðT…1±8ÒÄ#¯räÃÚ­8M扰Sdæv8ÊfžC¿R á'G«Éíã9#L€D-S s€EÓ ùgÕ²ZÎEE$·¥nóܺºtm T91£0œjP)7»±iaº6TD–f¬«~-\ùL,»™Î,õ sZ¯µ/Þë„©EHVgo"ЂŸZ ¼N$|ÕF’\ ä)®à Œ8*ÅåN€@cYöÆÈ*-ã¥Ä<³™³0xª  £?N¢?# ;í³ð|ˆQG' š¸…Uþ©Ãݨ.G{७»ªÒÆ&¤ë7Fë æÇî\ß=Üóæ½zµ×ÔiγK;/°gA“¹ðà áÄÃx}¤$€ºD8ÑêÆ^ºÚ£j€T «5ÀËbLÁ±âÂ,û) †Y8¯öŠ"ò®ZõaCuV”$ŠàäHišæ‰ß§ˆRâx°”TЧ—a6]¾hgÓbJMŠ'Jö)'-¥ ,öÐ(û`~ëW»Ùì‘éqÍ4Ãï&rÕñH`Ð?zt!§?mÊKŸ]XÁõ·G BâPN—èæ ²³"·#%Í—›0;ÞÓéNbXº:¿x÷•ÓžéÜšíÙ»×_l¯ofÑãÑóíìQ¹sß[<ËÍOWïÜ'ò!§Ž¸a¾y¤’Y¥ó‰¡­­iS‰"¨gœy(¼;¾@&¥¶—‡JœqÓ“˜™ C¨[ߺ}J¼5xXô¤Ô9ǜ릹ÁcÁ$Ö0ˆzZ@gTg}Ku ªr0á­º ¥Bp¿ÊD’Àüq 鯸\ôƒ#Ì+7>Žà¥Ÿ<¦“Ã]‰7N¸.=u_I*'C3ÃP ¤"àÅ¥ NÄ«r”M’¢RÄcG:_6Q  \*H£h£5ªÜ—Ô*SWÅzÚ1+wêfåî ×™Ñý蘑SVö M¸eÔ 2ã D︀³‘h+¦T¢ÀBiJÁNµ]È¢´ñÚ*h•ùíHLú´²#è£OŠÈår"fª¸â lDCßy-çÄÁ†L4€e’;Õ`ûs.ƒp[j\=`nÿ,–B ~qUˆÀ€H4k6‰À¤L˜"“xj|‚™¸çà£H(oh~ iÎjòžk¦ìr-"K)ô@HbF2]‹Ü4*ޤ£4[`åz0£WD© µejêE†H sÂ&œNŠ¡yŽ}!ȧ¸žFĨIºFÑ@Ëhð£SÂ2®NÛ7áv¬A¥"ÈDÊ4KËë §* ©Ûw<®Yn5„ÃÌÐ8óá¼3C©üšØV½ÅüŽbÙ-:·Ãˆ €óÉb¶ 2r‡£²LÑ:#Fíà ÑhwÕ¥Ùó–¸÷²Žðl{‘Ûü–:3r@;-° ®ìpÕ#I”0ò­)O)Jã7-nó5A9ý‘ûX]4SHµâÌ è˜Ô—å•YTÑ4¢H«Ë¤ zkM¢âEUݨ#IP!¤¾F]è©8ÚÒÎä/CÚlO |Œn ¶ÉpÃ×ÊùÓåøT¤>ãZEÙÂH žª=I&Fj©ûéìˆN¢»kÑt±Díæé¿üç_üÅ_üWÚ K!ëòüÚŒÝJƒßkäÙ%f³øåá£!Å,K… PXæýáï뽬ût£-¸!DĈÀ&æ'ü¡³ý@ EÕL"€é_ø =!>ª¡S¤°Î"Çî 5­WÎüÞ[¿±;f2fy0#r×?2ãˆtŠè‰w´AE&°Ñ]Ô|T§.BÉ}HDZǂS"´×r^6­_fŸž°Á ¡§0"FaöÊ£’…ÞùC"øÈ0‡A4­z¿ícRz+üvðÖ´þéŸþ׫/^}ô±ö@mz¬2rWŒchšô¡gxä€ZÚÎçÏŸÓCß©™ÏS-?ù£°Ø¢‡ŒÞ[ IDATJÅ`ðá!?bÕ³1º߆y¶×>\þá7ÿ÷þöÍÞÖæÍå ­Ñ~Çi·ƒý-¿…ýË_þÒÏ4Zã,™£\ç(s&P»û§‡Ï?ÍW‡½cEÂþœQ{ò;щ¡J#ß+ä ÈC-ñbÇ«¾ŒT7BÌœ0Kã|8,Àà“ˆR²B1ŒcEx™òÌxà'~i~€oÛ²ÞÚeV>hŠT=Ðüß2DRÈ_bé ÍôŠË Þ- :†WM ­Úß¾~strŒ ¥°ƒÀ³÷ï#è}‡ô9ŠñÌ<êw®&(©ZPä˸î\Ö ¥=>ðœÄ /mG‹,ùr #^õŽð¨ÒtÖ劔LÅcre¨nšb 2J¨ñtU,G]þ#QÌsÄ2P#³´ÍÍJV HNa¦# àŸÿáýÛwõWÙŸóÜvN}Å,¦ù½táýȶ¥7œcóš ”„-­·¾Ú¸nQ Æð#àW+ø¥gËÃÙ©“tHéÁ^)£¹Ó¨Á± r–Sšñ‘õ±a†4œw’^È"õÖ‰)¾\Õ5ÒGFÚ¢¢Ä˜(±ÀüQkHÃ<‰€„"0ÈÑ?þÁÐŒU¯†˜«eÅ}Ü”t•TBRrzÉ!>bú£NÙªóžZ7¿ƒ‹<«ƒŒâPƒž‚J ­ Òž2çOA8­ŽKŒÊ'Š#;ƒSe[CǺ#/c—¼O¥éýÊA†zk„P){ê ø:×,œŽ„švc¤æ7AÑ9•†à #D5…°Ø6®ýôD«ʳÇÒZÈJ™kz—CÁ0H䑤³1H«b§1ºn§®+g¡6 5Ø*ÈHOö£§;9‘³‹ùÕ[£¬Cý~ÿN\.T‡Óˆx¬l#shð‡Âñ:œj=Ä‹§ƒ¨V[ª¾rA¶’ýkÑA#ê!¶H4”€[çwJ©×«,Ïböˆë,Èe_dñêFgKfLLj²d—ì€M©‰ÈJk®°ðÊbNÈ-¾ Úé¥ Rˆ¶9z“†è ¥‚´Ñ#ÚˆžÈùeáV:IU0‰S Ð!¿¤M=äBÁWØ?Øã³þÌ I°j÷—Ï_üË?ÿ¬͇d³ÆŽað䯊ΓX Ÿ=eE¯VBC7†<õ4fÁ ‰P‡HÉR*:™æ˜ØFP1j@—S‘8yá}µlfäÅ=íë$Nõ .YóL1ã¤KÝ(…OsR¤P½ú8çÒ<©LQžtRç"FÐÙã¢0«¢Á?Uà«-¦„ð‹¾.‚€'ARò ²”ž8<‚HØíêð5D£öš‚“ëIöE’¡+(~%¢GÍVŒ&®ÍIÑÏ_<‡Ûè›u7?ˆ›™Î’³²‚Ÿ†SEgl*úx¥H"Ï0ïÞñ²Ä³Ÿx“ßL5»6딊yOÇoÿôb"ú£g”GKYÛâ òP™ ^Ôåû/¾úÝ¿_œE.ïß]˜ßõ7¿{»ñ!¡ˆ—§'æ'W—¨rZ,ÓŒµ‡½ƒC_ÎìœúæPmšÆé(]ß¿é9Óqûæõ×l#žÜaíBöûŒ†”¯KPEŒ e›Ÿ0ê€ÊY»¯!cä_aF,q1» •ÎHJù‡Ee¬2“j•'SÙ˜„Z‚ÁfÂnЯ&|3+ƒ6ÝgÕM ûOm§ëMí„ÇfBËʯpGƒÚx«8²zöáÑQ–ÿªü1¸£™NEëï,1´£‰«N†ÚµxšE èQ‰,ÕÜzóq/ò]@:¸DýhUuO²DРl#AñdÆú¦WèÕ£[Á)p*¬‘ACìXgÑ’WYŠº´=Ší3­iƒOoß¿ýõ¯~µ¿·¿ñ·ó×ó¡ [¦–€fEµz­L¿8léÔˆB§UÚfYÁ’(†°Ç ÆT× •Px%G0ÃVÄ›×%'e5¬“F‘=«y½E3ƒŸ¹:–‘°CƒgéHL\0ÊÿÒø‡Ò BW¶²`BñÞÝ}þ‡ßÓ¥O?ùxãç?ÿi½û;S†ñ`*î;¾r_h:* nÿŒeÊ´2ôA¤:²Òñš{ä<,A’Eb(KÊ àÉw5¥Pª{ðËëˆôÇŒgªH"¦¸¸ÈivKeÑ)€¡»¦9¤O4ù:˦–…²[$´ïåÄ(ˆ1輊cMAÏ'Åš¶Œi¨»0Àž#ú*Vº¨âÁHŸ6ˆš8håNdPS;˜A5À°i’h‡Ð¦EÔøúƒÅñ*ƒ8cÒsmŒïk²áã)5ìl<x´C ¢†0X™g¤W;00BU-\ÎZy†=N´pÒÄÑ0D¢N¼^Ýr›Ò+8EôKµheE¼2:ÎR 8`‡!’J‡vŒ ;ƒ 0"tªÌá‘".E%â˜4o‰ÿÄÇêø’aÑÍÌ1G8²XM1·&[º#w3´Ç¾ƒãi(I Ô¨8ÈaYÃQm*g†çà,ø“#£R5Â`âMƒà ªôøF&1²¨š:¦ƒ!vm)IeòmCx#ê –ÒÏ–c™ )Èб”mƒê~Ùpa¤îY¹aù ¶Rª@ ^Ônp÷ Gùð0íN[¼ T8ªWáƒÁƧ]˜T^u@•øN ØÐ ‚$ω€±lŒMD# ½Y0X0cI'©–s昨y´K<ã}A+ ×AbÓ#¡ØA¼µ1ên ½8;ûÝoûòãO>úôOêd¯å‹Eˆ2*¤÷ ´“ÅUu3}hõ7£#–OÕ BȈéZøØP¥F¢è,6J5’™ˆ,t†øjK«£×±À åÔàÁmÔDªòx3àùÇ"/ã„€Ù‰{’¿]?9VB¢ îàpˉ¹c¿‘LçêÌdTdç,x6žñ¨06ëÐU¹­÷çç`ŠÎ©WESé´>ñw©Á·uCvµ:ú£ QøaŠž‰+"Œq‰ÂDØ+8§º‚ÅÈ•ÊmúŽÈþè<ž…læÝ…™ü…´š•u·çÇ¿ßxvîòUÒà¿RbmNúöÇÏ?G-” oïœaˆ.éGª“n™˜k8£P¹6É­ç$ •q¸ó£–Š ³ —VvK‡3~çhÓ{{þzýî|kÿÄ64gæ7¿ýׯNPã§›…/oâ9ñÒÕÅØ¨éäù NwvN?Ú98y°ßÚ¾@„¬Ëâê"šV:¼åvr¯1‡ÇA’Îíèv^Ì¥a·‡ÑÙÒöbl2þ4;‹ôY5T I¼œµõË tf¢Îúèc0¬î-Éh%Ÿî~8Æ”;Ãô 8‘ÄC>;;ûöDF|›Qñ¶uJ#[Ah!dOÀM±v˜ï’¾–Cu'+×ñäøà7£ign¬UT£çh Éâ'í…jär¥{E%§3â"$Í NñÛ6u@(fÐÂð¬ÜÇ­¢í=3:ÒPd–}±rÅDÂgš,+ÓZ2$é‰â,©®ß‹iÕɰBEírx…ö‹?~ñO?ñ‰åÆÏ~úc›v¦ã?dˆíë›4»zí4Žh7wà2²jc¹ÑÛ¢¸ÆÖ ðír òGGu”påµ­« n‰ÿ°'Èe£ã£c«ˆ$1*Hÿ´æÅQ¨=eº"#ÅåZfè¨J‡Ü–A?ÚüÆ _{]INNÓVXÊ…ýݳÃa쵸"°ÉŠ«kÚýѱÿ?e)I¶DJ©ˆ‚#¯°E•Rjw( ÒÏ¡¡n+P”<žNüþ‡¾ßèâÇùÅ;ÛŸLÎñ,=–!n3Þx‰ì¬ï´±P•s‘•Ê\é*b`Û}ýúþIóÓ¤±Ì=€C2]ó N6ßÛb‘‰}¥[ø%4ô‹oGÄ  òlT,Q+_ÖXo¼¥²É%4ú0ìhVDQª®-.µ ý„Ç®*Vòfqi&ç ýõµã½QÍÝÂdçžÒ"©ði‚m~;éWLI€Mä*©—Ì©3%ž_wç§ÎxçF;ýV:QT Öu¬3sôV'%SKÎ&ó.|BŸõ+ æ˜ãVÏ2Kpà¶ÌWÊ—°–62WãKe†ŠV4˜ŸÐ ~ ^‹·ÎnÉ¥_™«ä~‹Éºu6  ãAÙªI¢¥ºêéö(Xüo¿¢ƒƒí-¾pÝ@sèiZË¥¼îN‹½ˆ6ZÞ»šÖÁ]•Ä0–vÔ™Ã(Â󑳯R]>égà®ÉœF Û‡G®_Z¿¼¼@¼/Ár8}ÓÆÊ;Û´u6H2Ï­âEåéŒÕw¤™;Eµb«`š”$ÑF¤žðÓQ3@½ë«¯¾üþŸÿ€m¶gÄÀ°3&ó;T1Wr“xXã…ÜóG÷Ö·×-ê„ôzác+ЩC¨^ºBš’(4ݔǜ¹eºFhÊ:%Ën8=9Æ)ùÛˆ¦”m4œeªÏâr€Ê‘F±2Ó †¬=d¿FïâR‡~©ð˜×2 ´:EÓXl|ó~»—žžŸEг`84ëÝaÊoöñ‹×û»{Îã@šõëÏn¯4Öó2£ÌU{„LJÖ[Qbé èlL8(Ï\iñ’×(¦ßiYJ¥¸”t|Œ»1( ΫÞÄbX¶YøÁ ®£œÐŠÉj*¢•[[ûHRr~#Ö˜X™:$“ì†9û–vXªû;®sŒV§Ž¤½Û‚Œ³ÒæZX»Œ|Y¿3Ç˶šW­kôózÁF1Œªµêƒµ‡‡8Ù™áëLûtw¥«ŠUÔåk†‡Û­Ç›w¯ÿhûà}Ø.?óü“ýýìhñÍÍL²;ÁÞÙÿÚgƒ˜©ûÃÍýÛÏÝ^žYŒ[¾w׿ë?ÒÐ?þÛ!·"0ädÀc+‚*[„T1“±¸,9Z N‚€ÀÚãŸÁχÅZ²]}”O;y…°µ$‚bT…%åçU:lx‡MŠƒÅ5 9çm›ˆ,OJ†Y¡yµJéUP—Q%ðDŒRÀ° ”ºšïMÐ<ŠAJ¬`í)Å ;j IŠL)¯È†»ò‰n yÚc '·ää14‡Ž”Í«§×œÞîX‚-â.h@*LœÎ|QA²Ñ—‡uÍÁpH‘‰6^/zS b´É¤ˆyʪ½¨Ì«Ò:Œ…@΂,ª$WP°ii,Å!¤ á¹³y­íökY'­"ŽèàQ5ƒJ‘Buè2´Áç2FÊãsåÀ„ÊUð:j®J&£0Y1+û.Pn3áNÕ•fF? ND‰WzOªÉŒÜù•Ö‡¸&%RíŽ:Á2‚kIoÓ§„ÉžvŸ¤Ì«ÂE,;o&ç(3É ÓY)éÌäø‹~è-52CÏ’Ùu“×å-» $õ.I•îòNðº½È<¢N­vFìðyEK¤0ý/eÈ6„1U'lIäðîí[HD`V›Y,¸ 4žzºX˜YJ7(“a‡‡KC§s²ÑñÀðïm,®Õõ»ßüæøôtßYoÂOÓg‡î;‹D>‘ŒFìù*k±Ê2ì  $ÛawÒ#trÍ;ÝyIïÂ\ âÓßV½¦m%‘1x€ÉmªßQíꊩ2ÉeÍ`X04€i‰T¡8Ö($-¥NT¨­µ5–þgÉFۑȸãóîæêñίƒ[ÊÉÌò67Þ¿»8·ÇÇ™êû)Â''Çú¯×uçèÕÞÑs½¸AcZHUÎŽÞºãY¬ ws §Ó¶ËŒýä©‚³ûœ1Êÿü\ób‡;Ä È6°zÆúô³8JbÁÉ”Øwðüw¿ûÌÕ„`*…÷ôþLJ)˜©Ê¶ƒ, Aecò¯¿þòøäxwÇ—é a Y'‡yD-ô¼U!‰Z´™<'H`ÅX$ßß&ÆBµ(&ýˆG„€=' ïy]u“¡N!†‚ĈKMýS|ji)ŒŸËN(Hž ƒ“RŠåÔ9êš“$:«êÔå‰Â YnOgˆ rÅ£Ã5ø.£1?YVÈÈ¢$i#²éÞD-¡¬v§ HˆQs\±±DήV²Ð$$ÃG4Œùèˆzö5ê‘Üé¤[y#E&eZ*Ÿà•€Ò½¦‰€1ßêÒ F?ªFÖ€û,ب`« ŠuÊÅu¸¾¿]ð¢¾üê+úÂ$ðÞ¾þZÓÞ\ÓwôêZ–~µëü†4=‡äaóhs÷À'1™ˆq¸É'e-¤e¡?” åt\ó)T‘ñ(@FÕO±Ô"›g‹ÌIbë°ýëB$L’,†ÏôÎΈü—_~IëI \¸ûöu:òÆæû³÷–OON¥ç0Ïr;þÙùÅ{D1Tgéóðð˜ð£Â1Pll’ÈŠè”z²áHM3up—ÛFO/”Ϫ“âÙ¶#Â,C*ýQ\MOF üŒ‡vLṼd°‰Ëž^E„€Í`'–¹™Õÿˆ½"͇#4 ¾(h`3û-]Ñ iƒaµ‡ÞÒw†rB¿ÕÅœ|ɆµLY’É6ôÔ·Ï÷’ÎÙU´÷óŸB§U 1¤N·á +Æbz*¦N-EìÀÐ(_Å%wÑ*J–P@ ^i2üøC¬bºÈÿÊw)t4U.Öã·¿ýí(n•cúTŽ`ú”®vðxU|: jÉܨ½áÊ,&@Ad$KµU: çà!:G:Ÿôà-ª0ºê&1­±W8—íXø©H:„Éh!hi+CF~ÊÆ´)Ø ôD†ÅÈÓ Ç'Ç¡¤É*µgE‘Ñ$)›êæ í*1&^® WN®", ›JeI/Ú¸Új÷ à ¯F)#´&>ŠNnêÀl題/kn:•—ˆkˆ¬Yj5Ë×Ö6Rw5*UT†"©eéÞ±S¬“|UiˆX%ŒaûLƦ8Ñ©˜>_£@UÁ©rx!%­Fûç{ø8 u8mžH‡6Þ@WXM+!Tûp}Õùãi–ÈŠ±³L0zPt»²ãtIJ)®¦$ÐÑþ1%t€}mðKÞ"p¯5 –9D>È +rÂ#ã–‰Hl)frohSPbKÈLF‘B°È€‡EVªB3~ÁfNµp†B›tv7Â…é-ÆÀÏ/Þgˆl¥±æY´WšHÐmÉìKЇå:FS»®§½4@ÁB‰v€•6R±q±CN/ SHëÓŒtñ ƒÈgsýïÿj¬ùîw¿§bÄÔè&é K97Œ;ù›Zh&â—Ûš‘`µ w°ÊšW4¨½hi¼âµ¡­ú3ȱ6¯òS–—ß ®¤·PqÙa·Ã§¹°âObD¶ê:Ô5*¤¢QP¾ÖS9h5m§g£¡Y5U¤Ê33Ø`I¨²£‡^·UibHÎ=#«F ×k¤@2D`›OÈ=+„°Ð×Öp àà—®CÁ)d`N¥€µ2­‰@29ÑÊãd3’_ÊVA}Á:'V?“¡n¢ ºZ…É¡[^;ÞÕ„N:A:FܙޕÅã=°l*—ñcŒ n¬}ñâÅ"÷_äw”´Úþc¶•¹>¸{ðrö€ɲ©•3gí×aüí:üÁY-î[FÄ #úÃÆÞG›;ŽÏ úd>äzdHÙb/T”5¤-{Üöv]ígÌæßÐDâ‘(´XèéªAšµ¿p¬òÎ4âǰ›ýÇT¬J,Ë0Ö®äjŽï|ç;TBºZP IDATǧ^>ÏÔr¹=Õ7L&åF4ËÉÑôDAi?f%E]GG3çAÊÀM …õ|Q(î£6íÐàU–ç¼’Ú µ«Ž!EQƒrÅ%z¥^^E<© feÁ¯ñYfDXBªNÀú&¨,·†¨²eK2ûªX-ަ`J‡ÈÈL›æXX;8:Õî¹ âK+ >Ðà >ëa¸Æ EÂK«Ál&Ï•CKÜÆO~ò·X¢y2ÒÂgÖÁΛaEŸR•*ÔÖ±PcÅ›T K+ C†(ªÐ¬ˆÅàô;V#ž}ÎV¶OE!³/¬«0&$I·•EÆgŸ}æÀl¶ãÞ¾}»ð!^wW4ÐT$¿¯°‰ß¨ÒyØòB¹Š\—¿"γœ8JK«üÎàôkíÊ cÿàÈFdä¿î'Àý᤻ê_ìÍ&¦,çŸüÐO”ÖELek÷ a\Fî|½“àê•Nb5Gµ½ýx_ëÜÜæø9¿Ž RDh»d.Jàõ,`ÌïÀ",/—±8¢g"–ƒf¬Tü6Çê§ÝŸ?}²V¾ã¼„O´]¹nãx˄݆yúeµ4Â.‘äiöëh×2l䯮y,z<§‰ÅA¶cÁž€Á7=ó´Ñ¯:Sœ6ô÷š€ ¤D¼£ÆX›/š#®¢Œx­Øð%Òb j‹£¥qðýN¬DSÂKìv{|ƒm*SŠB là§ µš)(‡æpXJ˜]¹º/yÁÉrÊUÐ6Ó¼ñãÿ 8òDîбÆRFkÁ©˜&!JI‰«ªTú—¬\ê‹™mó”U"HŸS–6xâ<0¹Óü^'E*⤗·L)€¹;˜†SW ­§\AóGâÌ\A³‘~“É¢NFj°™j«Áè¯oIà™ÚE*É °­íMŒÍq˜°Âü”ÒFZ6va—¦-„–å&†}aPyŠCdîYðèÿJâÁ`Íz2Úä GKbô±üvº´2iÃ>àÚA¥ˆ0¨8::!#?@0Ë…a`¤ÈJ¸cJÒ3¨Uw­xIV‰µ“ãÔG¥Žû9”ƒkÚ@˜YW»¢85%ÛÔÞæ`>Tƒ,¼¡Vc};¤²¶¦¬)kŸÎÀ '0…²"É\tR„ï‚r½Ž X\ŠqË7ݘHò+E{ÈùÓ:Ñá6$§,Ã÷hNÓ³‹Ÿ¹‰h6Á q(M-9ú ål»÷(§ƒKDÚŠ|±3ƒ0+3Â(`I§š¯ŒOòR2°yñ$éòZºØ™oýAOÇÏ×Èí¥°h@Œè¨šêxNC7 _–£6=tˆ)c0G8âè¤8G¶\Ã>Ëm¯97 ín°$ÉÁùpïîfíítŽÉ1“=£8áÀ&€5S¥Wí߸òâ|D’8Kœv=<øÚæÅóç¿þÕ¿}ÿ?¤,Z tí4< ­¬ q ›…É㨷ð$d•Çd®¶M°$&ý&Š$%–t¦eýJ¢$M“M¥4 o¼Í¸?é¤å(Oå2•¨J«]Öð+]ŸQ aRPëI’“ËnkG– ¿=âÇì܈í§lbN/ͤêØZ9ÁœSÂÁæ©ÔSõÄžªØi‚ÒCZTa^<ç¸Oe ¿Uõ`»8Á䢟Ǡqõ)Za¤1\Çz·}aVÐsE2X¦Òk &Õ‰FYguÌ,z2Ù[•ÃoÁFÇ·€”åŸHãÑ¡(nXµ1ƒCŸ3ê2|¹Û}.%‚ ,?zÓ/Æ`ðç ’rè1S²»Û|Öè›ëúnB'OŸ¿PÌE> ¶Ëš#ê×Ìœó'úHŽ“çˆcº¾Ÿ=Xß::y±süò¥ðˆQÑ’ëgä™S‰^Q®ÆYï,…Ê/7 XßD°æ×@’ù@ —þÕÞg«ôÊû0ë—ÎÏP1Ì´Û„„®˜ÙN›¢‡„!$[N™ÇÂ)_õ0Ÿé K5G&d P¡.ÿLAÀÈVJ®xÊ/1„_)‚¾&°ÀT*éƒ4 ü3éž²AvR æ–ã«èòh r±þD¸£­èwšUÏÑ|ºuÿ¨zªn½aal¤(†¯Zò4˜)"_Ÿ×úvr”?’!4ÙÂñÂlùGã)µA†K"é„2 Xçé`X`"¦*0rÕJ¦”BLÆU("7M[S"Õˆ~§mÀ ]‘©½„ÅnN:0*Õ)E¢‘ÞjÕ=¯ªZ$”Bx0?…C‡ªKvXV×ЩGƒj:ê `-.ËXSRIRYƒç$ÎÓ«\S×Sn±I³vU£Îa+=SwM+ U#4ÀS] kQÕÈÊ 6Ø“q¥0Œ@Œ ‰¨½7Ó/ØT©6]±GD¥+(.(e4W›‚¾édúteðdF¤Èƒ“Ã1RRPD ­‚6YäÒ´GER;ª•õFV(äª%aªòIûVVR…§±À¤€ŸN!; ýÉg”Ã^n'Ì{ø¦tAº.§W¼Bå!Y‘æf¶¡‘Ïa!¶Éb1Â2sÊêÞ‘]G>˜ì À‰û‘éϵóñZª¹¿§GÝw-fñJýòý‡éÏ騥$V¦NŒÁ@…q9ä0»)»ù+mgÏí˜øÖЙþ{çmïoÛ8>>Íe…‹Ü¶Ü@v1ö-¨lφßÙ›ê4ÑE1P3²ìP‰cÇ Tš/ÈcŽ\T¦¯Üûe¡ü )€³DbWpz ff‰+Æa‹«åÝäTà(OHÊGZy )Y ‹§›¦eÆŒÄÎdvuýox/ûÚ§µ¥¬ñL3Ê õkú§šÁ&ox™tíŽ ZYåÀ‹„;I–Wõ‡ZóðHç_¾záT`ö 0'JdTÉÂÀÖöž#gô`{Ç|áâé”G/>Ñ-×>\=ÛÙ»;Ë æü‘mß«î¾üà7§Üò¾–=òäöÚøô­2ýqỾå¦*?§ÃIcnÙÅnûÚû‚9š—ÍCxºOÄWJ†Ð°}~uÉ—ˆl¼‹¸µA\‹¾|ùR‹à ³Zµö@/}0Þ N-XØ=Tdo7?–¬ûf&µÚòèĤDk‘z§ª5( oVæ?\†HÈ%BòÔU†\%Š‹(nãTdZÄó©¥ &ÛÔ®vðŠeÈÎl˘òC ž+Œ§šâe„AúT1U‹ %Uµ©:îTçBÂó*Ðu¾wº‘R‰LG£¤G7”“5d—vùß4°Ìu{p-†e%)ímKÒvÕ{M†¼Ÿÿì'P›-…¾Ú;ýÙ†Î=,zìlsPÐì5èIÉþŽsw@PS‹ŽŒ¤³$Kn§­a/«U+Õ)Ž>¨0ÕÊè¥w”ŒºI$pÄ=]$꧈’@4¤FLp¦&uD¨üÜ/EtB)À<W»DÕ)EÏПÉI>¯ƒ¤.lmˆ<òB¼ xdõ¾ÖY®ÂžÊpx®YúV^Â×ÜåCrkòfH9’·b¡‘Š'=+ª_¥6kžZaRd†Q»“c-]Ú(¡ÂG§È0Yµl¼Ź©èLqt.]¨4‡×ÐRöç£ ßŸµ6é‚BX •zC˜?ÔjF«=µ,ëk 5/tѾ5®:˜A;˜ç©v//=gdñÞ¾~OX‡¥5!8+)™oá»Cm” 1o_b êRè¼D˦D¼îß}E0ª ãqYiP¯Jåóö,hö„_6|O·f’ì¨ÇÎîæ˜Ù.Cºá$ËFëùýãì¢.˜v>¾£N~UæÖ]W ÓU]3_Bæ»°Ìr<­Ð¨K<”ãpÛÝÉcþúòÝ»¯~ÿþÍçv!x`¡9Æ"‹OÈPÖv²‚ä ƒÐIC§4+3Lz“,wuÙŒÐLñ50=ŠôÒRE›@ÞÝŸ,.Ê­œýÖPWMúµ æƒ9Üßg¥¹¢3á†w7/××Íñ}‡ÏGg›)\BHôÞQÜsZ¹›ÀúXL­Ë Ü™°~¦”Nø.÷ðÿá÷8ðs²§/è0¯5‚D°_eC4ŽÞãþÖ»4A£é§Ùatž/îNkÎÈO>^Æ~¹œRVlV‰pȶ¨Äï\^€¡™!«,òÄ3K9I†N¯è×ăœ†©Ë‹*8p-•£š¼sª~Û]À˜+¨cêÖLÍ UpjA£¡*@AOé­‹êÆ0F•;:¶´©¬Î‚øÌT¹¶Ú¿ÿéÏ$3cb¤Vƒ`¬Ç3·å¾»¶q¦ˆQ‚¶_%È!ËÆÜQšœ?¶°™îDŽP“‚ùÈÝ"Ó2œ”Í<öö³*DôíĤ_ÊdÙ ¥Ojæ¸;——çz£¬`ôpÏÃÍ[g¤ùò˜îÌs²ahØf­È1ØxEè.v¬X*¨øŽ¥[Ì„ºó§§y¨0 ©Ñ 6#Wˆ_"‰&aІH] eùk”5U³-MÔ«sÕ–®…:b“S.¾«µÑØá™H±GKéÐf§¾Õ_ßê9ÝxÊv…꾜Íu%?BÍ>Žz­$”¾->0"xÁ‚ï~ɾí‚þevˆHÅ“d4D°Ôm¯³E¥$)Y£V¦"øíßæ.‡ÄùšñEÌ•­¾orh¬«§G¾&»¾1ìqÖx.àNÌimëD#Ó,X "OÍ7³ÏüÄ„›Tm5^¿mÄ-‚ÝeN&^: »Ï:š^'õX)ÔÑÓ@E1-ìÛÔªº\t²>%•„MÁŠ(^ ¨9“Þrtx|q~aƒ”›žž¾05ÖÍtÙðX¢ÍÅÍC›f& • åè÷1^ïîá>×Õåþ!ŽtD¤¿¯™åæç•ý¢4Eê‚}¶­µíÇ›ŽvßÞ\>,Þ^ýû7¿ùåÝâ‹õµóë×_ï¿xØ==[¸¥Â–Œ‘^goc’0Ll r5²>`Cƒ`‡n#Õâ?b1¥§ØGÈ—›¾h ¯¬A¼º¤¹}>ŸÄ—Ö0Õs#ŒŒ(åˉበÀ™l®[òY¥O}]®íKϵÅy®Ë§*ERDÄÚO¿ð)Výé׿åI<øõýÝ~ ñiËRëwîF·*èÏŽÑ#7bg}·¾¤ÚÛÙùí¯>ûøÕ'Ì€>’©(‹áò3¢¸»ß–H—oÙ¢M犩\#*Üæ8?‚6Ö6/Ï/‡Ûë^­'­-.¯¢ý…û˜Jè#ÐXí¬Þ¸45»«”“‰£YöÑÜi‚ÓÊ ©B·Šg3Mùp4LRÀ8ôÐÀoCo;qfž´‘A ÅÓ“s{V4íñFÌ•7rðÙ¾áG«5’Ͳ:Ê4V'áÅ^-Ìøsý ™bµÀ‰€ÁN/¦ÈÑ4ÈJç—?)w!.> CÖ±‘Òt>¥ Ñ˼j!–™­°ƒ‰H$±‹„¦“B«ápþØN‘\ý8K¿ù>!uR0z‚ì`QýÐv]!¦= ‹æ»Z8SHyëØ°Ú 1¹Ýw›V(ÂXãå£`ˆµ1´›a+×#ùŽ8?¸§2«»ˆÑ³£gUcE´*#"¼Þð*r¦ÊZ“¸áN#{k6œùF±Ù˜ûø~ÜÝ^GÐˉ2Œ|ðçg&H´‹ÍÄ—ÇRÑúæîÞÑéÕíÃáé«ÃËËþbDÛ0+}öâyu ›Š|\&Êohj¤:ˆ¬\f>(4A9ëo*Br*_œâ¥©9u:ý¥3Éúº¾i•%$pr|¬ÛË%R|Bè?›€ZX½Z‚ecßü^8ÉŸâ Þ-÷¨¾ÿŠdO|]ȰKáƒGC–¼ î ”ÈT1M”wu‰P³uD’’a·0ÚÚŽVÎê²TzZVÂ)_'Ëÿí Y#aöÎ<8 cÖµ8µ>Ìp¡Rã¬J©gš4#Rœ3µŒc@›‘H†0û,5<üUºüà Wfˆè¬g¦†/ØÑwJ¡Þ8RB"É #Ý€š¹^XëÚŠÝæïrÚ–ÁIgjÌȲñóŸþœÍå9+ü¢,Ùeç /˜Í,‡Lƒ‰:ˆL¥ÃfnÀä² `x ÝnÿèbÇÝ "k˜ÂSƒRr›•wm6…'¹\×øÖ9~’ùyÚhôFm—Ýì½Ï=ÄûÔEõÎܨbÊÕ8jQ¯Ò‚,(”T¤^¹åefEF¦`“8Uj6(ˆÒDéÕ4fš*²ŒkU2f p\aŠ+ÆõNvdë“õ"Ͼƴ$5‹4 âŠ×&²ÄáD3qŠ È—$˄ëN¢%5‰â”#˜!TqU¼•†¤AE8âXPº³G>À†Ïbbi*²M¢çäŽî»ÛýMvìÉ‚¶R¬$‚*§ŠêıS×ÐÉp ë+UQ¥T°š$jOHˆyQþÊ 1$íO#«®än™%¥Óø´¬T¥ ¨P6«¶cÈ›>ψ{gW!ñŠ.kŸâ ¶Ëeö¹ÚS…¦†°BÕ~°,ötÈÎ’Ò]>“zÆkX\.nî¯uüvªþø«³/þÏÎæ%Mr ÄÅ4_~ñÅéþÑéáé­_ݼq³Ëú›ºôR[¦¼Ü8Ó:N$¬ òÄ_U¢{…œ"C¶Žá™Ø„̵ãQdÅbë˜2ÎMÒ®]¨†b"b®“«õ¦;ê‘*‰{Ê?vÌq͵m‘*! íåÜ›¦Ÿ&ö¬.hÏ3zÑ@g Õ(ô†ÔID†¦¡;RcUl79>’¯ü´¾Îë$V˜í¤Ë«þ뉃§ l˜Qã`¦M¤ØÁ‹÷©nE^àÅ)vúêk˜_QHŠ¡¥+UXн ×L¬®jãcHr£Æ‘YCP…ê%ƒZA<›ÂÜ*™Ø°êÀìô#µÃ³jŒ2"»®< ”èIÖ¬µê(ÑÚÚûwgi+ƒY>¤ÈöÅ… /wcîìØù2òû9‘þÖl8jÈi'«×hè:Û6ù1TÆ›COOYrN›Æ~ښϒ’Úù¬”…qãîÙ¬#¢t&~·YDÄP6|œRŸƒ¿ªÎj´Ê|2_¹âh²ð+ÀŒHrðL¤$`Dè âd•†é™*òt¹pP=.fŽçú‘ÇÈÖgñA¬âúøÕt“ò³?¦ —‹…Ÿ¶4z}ôñ'†ý+×eåN`¸#UÔâ»IU"³B)‚^ô²<ÕX%)"[bçÞÑÔ†`2ªv‰eè’E ud³ìqé¼P€„‡ ô©ˆb?^#6%òC‚!ªb’jQs— kµéàâiˆê°y²²0êøpÇ5ÊùÎ8ýª4` @D¦ö‚gDFk˜5M’ˆ'ªôf!œ!Cž=H¤ ò³2úßÿê/mtXüÌöYoÚ¤EŠÚbF#Y|éKo—‚§]¡Ãª§€Õã!ÌgUs.MÈ]^x@b¨›#„!²†p¨i(ò¥;‰{E”EŒ“IØ“8‚PHuicææ†U_Yul}c²? ÉT:Á¦lŠ÷©y¤À9éŠSDŠ|qõO\"˜¡G|^<\ CwRDJ†–ǃÂx%“Á[´JI”B¡­¦RµäM %`|P÷’—B)°Ùor’&“ý²†"¹²{Ônƒ¥ Sž˜‘õ€ê(¥äˆ 6~ϧ‚ƒGb)/õuFùÀãKúCÛ*M8|QÖÌQV&CâÔEÇЋ˜¥ˆ(#QuÎ+xj,8Kr- ×:â-SËÀôÄÁKg"Àx¼JÉí2™A®`†/À Å»ç/jDâ”d”‚VKÉýv-R¼*ÈÉ@dc´ª®ÖQ¢ %]½JëáN¼¢×²Š—Ì÷²Ô¿vãQ¿Kvæ:šÓÝgŸÿÛ/>œ~uöÖÝ…Jœm&nËðæÂÏ¡ìÙ’¸¿¹w·«Õ m;¼é øPñ#mVò¬¨1>±ƒO^ÎßpïÒ:Jd ðfvT¿°dk*öX#–ŽÇ,ÅŸuÌ“mÊNqD› ì={vyaõ4Ž~ÕL`é}¦¯‰Çé ^ÄèWÕîü~¹ºÚ/Ú¦à)* ”ífÙÄ:ßù»·æÃŸÿás—r¼xñ‘ZõôÖ7äÛœ êLßã5ö⌌Í8ƒ—ëë» •Ýì«?+´¢…Ò5âüáýv·0›…û5'k=D\¹ƒÙÉüÿ¨º—&Û’ìNèñ>'Î9ñºq_ù¨T¥„°  >c&´amÍ » µI´0cÒ„!SFL0¬˜ ¡URI%QY•ª¬Ì¼Ïxž÷3"øý—ǽ-vÝ:¹Ã·o÷åëíË—ûŽ ö]Çp¤å)&Wz©° T…´ ð£ÊŠ´‡à¶T»vf®ö ú™ñšNX5ƒª-’4Øô¨80îjüŒ´—òªrœ R°,}BÆUpïFSD[›ÕlÎÌ4L÷Ñ¥aqÞ˜YÐèe€A«MÈT Ét„øˆ«3Í„î5¥…´fVœ¥üàÜ¥$ ×Ÿê”¦ œB•.„zZQí@ʲ‘°±çqìÒI ¦³ì­>‡BFD?øíõ,XGƒéË#}ÆÆQ—‚œrà•<*×­'D! n»ŸOFB¾‰únfÒU Sdr_­Ùo¡„+ÊãD¼OSû¿xqsû"NõÉ&j¨ºaŽr¾ IDAT` ¨ê»wÛîƒ=ä(¥ /+Z"‡ ÅQ Á¥*àÈ̹*uäÔå=É IB¨EOÅæ"X"¬$П0Ü«ùÖµ|ö„ߘ­…ŽÅRÁ«:‹Ž1ê˜ È×#8]^oÚ8nIÔy®‚(SD,§ÐÕJ‰d­Ž{óëOö´æ^¡ËM«IäÓ]MÛªc¤c. J€d þ,ã¾jü¶Öðž–hhª‰ºãPñŒÝàœ„ŒŒÆõŸ8y$MiµÜÀÈã^C@ŠÅ(d{‘¶Þ³ã]Ô4uôK˜ €1å(Üxä2íÛýÿÎÀ¨!aûÁñ ÷²xYXÆÛÍu0ñ’ÐóNúˆ¥¦!L0Òå•Mõ È\æ6§B£~C·ðø¨¼}Q芖ÑbAí´§Mzû³5Hoa†»nî°šÿE –¡°B¶Aµwrÿ Dð¨àÞÓº $zñÛ€qŸvŠät&ê›0òV­°®ÊÓsDï¶fý*ôk°Zvƒl ºˆbûÕšKËšR!¾{­ÅgQº½n½L3Ãx±^Ê[ÚÁ‹³[GÚQÁTO%ê€ ðoòß*x¥ÕoÀ»WîCöÈú.M¹ÂS:…Rt/ù3(lcô4ˆ*4ª¡¦ñêÑ͇^´óˆáÖ¬_h¦/h`î Rè!`XW’zl¼ö–§÷Œ½Y”д.•½<a ¶ÜUOƒ2E`kͯ¦üÖ«D|3'«lžeÿÚ‡apÚí ÆjòMʾz¤#O59ìÏ€%jÃú‡›Hu~r4°´·¾Üüb÷a~z|Úí>IúÖrv°Õ%o _Zˆ›\Ö’ëéÃÖ >>a™Æð¶"°9ž€…S3“"¿X9ª+û ÊÁ2_ÿ~¬ræ;}1èÇqöhB™O«ºZÀî(ëZ66j8–Šl¡§C’º~7ÀÀÅ%”p«)®v'',CœjE™t€³Š”•Á'€ÇJ`ü^Áœ:õñqƒÕbÆ¡„Æñdúå¯ýºïZÒn¬ Ð*ŒŠ„P˜R2Òò!,ö‚|8ÞRkœÍƒ©t"æôèI”…ˆ/-L•A3F*æWe.T2CÛ0{Iœs+Äòpvþíq<“`#I”V•N‚Þ¢{ã5ýå>býÈh?ìi²„A¡ñ?«,¥Qï…ý™×™«rãZùã/xìgCî:•Ôé¥t÷™èê,ä ›btÃ@+2`!o×A!›4|©ˆBR—ñfPtÌÔ)G|DÃ3÷íJo®ôY‚Ot!ÆQz&ÆùLbùVÌÄÁ¼Ñ᫨PúÊÛ0íÞë÷ý)œ­kMA {è?å`ëÊ‘Ô}ã*7>÷W"¬ ͽþ…6 ,ÒŠ‡¹ÈŠèrîÓ'ë7[wóéðÒB"à¶–£Û÷ûj­^ßßMÇC˜Sß*ar“ã]o‘E‹$.?Ý“$ ³|T’ŽÃqŒqš!ÏGSDNÈ­–Y¨BðQnÜy¡ÍìRƒ0æOïzq4ZÍóºÕ óTÔÂr–«ç/ž»d, ©ZFQ•ÈRÎÆ” Ùƒ¿€4(ÚF*Mì>Äü|7™^ºÐ h‹à‘Ò 0NC¼Õmã £Wƒßå‘«°OÈÓV­=õ§ x®FOÛ£¼¿D«ê(tÅU £ÌXÜ«Õpâõö§^ònÓ)¥ÕÓJ]ÕRxÒSõT®Heë$CØPø±¦÷Ü«ïÆ3C>j>¶POå G#8ä2QS°<Hœ|<ÕÐ"­Æ{IS®Ýßýí¿‡A«O`âòêâÕ«ï}LJ§P)J—ufHTT€*>®#²±ú`äì‰û(͸& Ÿ€Ÿ|$@Cœ_¤ŒJ­‘Œw’[/ê¨ð££ ¯+ V„C‰šú ìõÔ¯u˜phª*'£Ð”F [\⾪Uœ+Tô§ßüQãOõÝ‚á„kºé×½ªW‘[ÀhSe•üÙÆ¢©ÖH{êÏVGµT¨:ñÀ”ƒÂ#¬ê§U󬂠&2iu9ïB¢\™8µÙ¾µ 0}…:Ešj9Ck6@êÔŸF&< mwÝ¡ŒvKÕj¡Uƒ§­ššhR­\_ªµÑµ–º”ùS¹Wb¡‹gÜû/5ŠÓ¢¢¼*˜«L#ÈÖ£¾ünâ”d.E‰'h‹ì §hJ@ØÀóÛn´ã&p!üÖ4ª)süÈ`æ³íiBk*¯å*Þ(æ„s”ŒÒ¾«Uò _ðÀÆP4ÔSmf„„ì¢uùU ª’ÃÐÌÊ‚twIð‡,ÌîÝøúÝí÷?ß,®FÃËX°Þ¹í´¤O˜ïo¶çËûîÉ%sùö;¹¿>({·Ûs<‹!]]ªñðg2f²VÒѸ,SÝ7¥öÇ““@ï\±¬Â—E;|Xð"ñYy„N1ž¬Äa¿®8T‰X'ѺÖŒë‘@pÂ5…»Œ”? ßà-l~P¹aOy^¯]ÉM ü©<<™°šÒÕ£¶ +ÐÑë7¯¬£þÆoü«8ØT[ ù%Kå¬5–&²ù¨Ýê4ù¦*40†£ÆŠÈüaß C`æÍ š!¥w9+M7d 6·Ã(0OT1¨ –€­ÛÜÀ‰ TjþÇ ÇA#Eq5(ÃÌC ÊHÿæxãÜè©®6X‚ÆrP /THW>¡(0Cï%<£¼µ¹ Š<*|6L>vп³Á¨MiD?~Pë‘%ôØè^ƒËÈùÓ!€Õ®ýÀ˶¶$qj>ÿ_Vàkº¤¦HCFžF€@½íaÅÕ讔ŒI|=…p+Ôù,z)–ŒÜÕ„%Zä˜BßÞ\aÂd0Õê ³R̉”ú¢Üh3`$Õ²ÎÑÆ„ Õ‘óÍŠÆöλ÷o,b¨éø¶ƒaf7›éÍÖjróö[Ÿ¡»|ÿj6¼¸_ÏÖ«áz>Þ¥uV3¿ÓÑõ‰»õb2º]ͧ–±}'RÙq¦CâjRåÛÝ1–*Vä†^zŠnq4ŒœÔI¥P‘‘•¹1ºFJÈQT¹…Ï Jeg}yT&œÑK仵ãéh8äðSƒÈÇߺ¹º2_ò­ê¬rFÃk¦P¡/çJ¦fM¤1ªãñP4¢wØK¢cÉœòµiç¹KCLâ©.,žbÝ7T¨0¸¦¬axÀS~¤Gå¸'^¥‚ѹ¼âj7 ݫܞ¢WݧÄà=Râ×›°Õ£÷/W{¢}¿[_ðcN‚ +Ã$7¼yKÌ-Ûj?M˜i”Õ«ÉŽ™SlGë´Ø8äsã•Ô¯¸rëKŒÑ'Ëfs[a ¥äÝœJ±÷+éËd$0€ô*»vÿîßþ÷ÎÎNMn®oo¯®G··OΟ8eˆ4d;û+@ ÚXŸnØX¡&` ¿^mæ‘Ì`+«¾Uh#q“A>Še†l$*ÀšvÒrÃo »*ã¿x©érc íùÉõJ)Ðíð÷è«Úáìu•[³mí]cñºNaRIëE“þ•ØÃ²1xÒ Tm¼ºÖT4²ÂbO›Ö\í)Ȉ\ÉϾTã¹QK×î ¼”ÔM9+xQ¡ŽPËåÞ0á5 ËzŧCãÝÀ¼[#…–Ä-Ü4hq¼wU E*ИÊÁs$T¨ãò¨^gÊÒ²úJôÞêV±áÖ+ÙŒ£()r35u™ÕÒ›F S êyªJûoÌQ]ÞR?ÈÄìñËWçQ¯~Tíƒjª£íÔ""* z¹‰_ïz ž‹ ‘šùÏ£ôF( ÷¦ (~Ë/H—KaûU$÷*€×1¥ÝÃ"l{W³*¤Ûr€Ý:ªªƒ˜Ü4áÞñÈ8]•¦†Ñè¿(ãÊ1ʇ;÷·ß]¾þú`ûÖž®£}ãû>ß!°afw£{ß4hì<ô»û¹½g}Yö€%‡¦¬Æž9O–C&¡fêØüq0´†YÈD2YÉÜÚ`“Ø=K|2êúHŽaj'Þ§¶*×òù­ù`!`KÐ.¡ô—zú¢ J«ùœÑ"9º‹ZÏQI¹À,Õ¯úîØ"|âQc°¥$uYÇÉMJ) ×>“"]˜V±qëÙË—£áؼ;®díœÐ”F˜·Šá%\H`D €7„bÄ"»µY s±ö a¸3 èðÒäÌPLì²ëâM<÷"<¬îx·9|Uâ»—¹• ®²æäKkYà^”hÚ¿ÌF ž{Ûd£s§ñæ…@²&ÂTž÷е"¹nüš:‡yôòÁV)Tb~¤x8Ý[í)õU4Ò¼èrcÈP—…SžNÙH… {©‘Èh ðª jªÌ˜­E@<°]UøX¹Ð¾®ñ[´„§ '†äyP ØŽ‹\^òJGbé­å2‰¢y=Ú÷\Se}‘d¤utt,É]“qêq5Úú~èµµå4M 3g¼†éð¦OÞæÃÑÅ«‡Õøöâmò­—3* ˆ“Ñuÿ°3Ý2" ½ƒíË‹·üèÛá|¦ãAaâò›R!ÉRÊÖÅl…íùΦ‚òøÈØnøïN©+­«»†8q3…ÉÇOXW;zÞÜžË@Ïöd4ÀE˜›H2S½L3˜<ÒJê‹a…a‹ƒIJëõæùLܽÏãŒGã““S^)šB·±Ìm²ú–Ý«³Y•í^dž[oF´èÛà×{´Y¸­cÂ\mõ(„ö®Âõ•XknZ¹šíÒ,G'Ìóh£St\Ý¥e7Þu£~c¶¦+@Ø ?þÂ:0‰Kâ%5ÃPAÕ’¦ý?œ¯?ÈT_MWxnàQ±wC Ç&ÛX©ëˆ¹í¡gÎ|ž;‡[k†h7‰ÜÍðwþ6zàW²­êèÉù)ç—FíYž€¦r åú´E«Ä™²ÿ¦.p«®SƒgðÀª'èR„äM´Tð¢ß ïdVš±¹´ú Ç¥¼Ñè!"M‚µÃlõχdq$ŠiÁ…u¨÷°yõ¥åj,ÊÅ¥gÐzÔ`öT#­}èm… ØS^ò™^Û}{=Ö¢\ÔáGP«–Ñ·á¡V¡„%mø¿€áF×Ú¬?Û/û+JÈ#ýFØJ·WÜkñÐ-^aefhJ<Ýo á‘À­ëÖE F‘oûÓ¯ûŒS`xt"Í!0¤) ý~š.°¦_¼ÕZð´Jb6¼AŽ?U 1ÀìòH ÊUVÎìÐê躚mқ؈’ð}±–G¸Î¯¨Ëä¾D•תbœàÌB§©½4biÕÓÖ¯WÜ·§î[#d¤®æ>†ÍTP¿p–sï×@PÌ#@‚NR«ªÐ¸¥aIÿÊ=ÖH]îà+k‹>ÚÄÀÄ*(—‘Bë&̲ÌF×ã«ïNz÷óÕ\Z½é‚ÑYØbEÔ^ú¨³höö޾eaû䜨÷»{;Ý“±}=ɲ~Ž( þµ÷ˆxÛég·Ÿ•¯¬àÙ_ãC¿I1Mr¾LDBd²o§Xo‚Š{µäqrÖÒçy©AnŒñÜD±WDá Ì©À rlÁ§w4"UȽǮ §¤z1¤Ö4Z7A úã@5U@n¢ ÖŒ.óÅ´Õ&‡MÏV«þÑIAºVqkìRj?BäÜÎ8ÀÈ·z ›£k j˜;íf2…îÛ3s` °ŸZ0«1€K\¾¸-{‰'s+iV‰OÅ ß•çÖ6Ú•+cMÏšÒ@ëªÝCeÌT!Y„۠臭`^§yË6Œ¼…¡¡´@\® Ûƒ%x+ûÀêÒÜ6&lO#wá·¯L–’iH†L8T-|Q—øYäÂsæiþ,Ï&AÌSÔ šŒóxO‰‰r2‡â3š*•¾mÍê§éÏ@UòhŒÆ/.¢­ÕšD§‹œ¤“–€§E€¼ øžž=Ñ¿thª„ ‡·öP×Ã(7üd'§'­¸5Áã7ÉJîð$°ôf¹pöOŸ'±œ¼ýæg÷‹áôöòg_ýôôüliËs"‘6æs8|%äïöEF׳ћ7oC§Ðœžœ9«‰ï1>Ž{ÿøX¾ü~×Ñ`C–X7Œ þÐ(Q·¸dzáĽ1¢Kƒ°êOuZ6Œ©n³Å%oµK¿´Ìd6¡Ð¨©œƒ–è W£³ô^ÌÞq×§Ÿ~ªeÈqbDéQ;¨¶ó§OHà·2ùE:½«hýºxZ`“KØ^ô ˜ffâŠ>x¼èt£ OP¶^©ÆK–ŠW½Ø#¯¥~±™_0à7 Ðü{3>7:ˆx¦‡°U1Ò#E´íkMjh¼¬\¶.„U_Ù@ci¸=BYnÍQ©Y5Wˆ ®Ý¿ÿwÿ}Þ®•WNÄžœ0áíŽx]§gOà·ùETòâ×D* 7 F”Ã^SÕL÷+,AQB  S³h“a|p°”h÷hMy#‰_å€ó¨°ôQ~º ¶EÎè)¨À¨UÁb¼¿ð^Òˆô4ÑÑyÖ¿¢`VÞ¿X;ŠuØZnš†`UÂÊ‘ Å~=jó3 Û#lÚê'—aQ×9·F5b‰.ÀsëÅ[¢âCzÝHýºÀÙz1t£óg•ùoäÐXLôèòŠN¢<‚œ†«pÛÃC·ˆbÒ‹šzÔ»?Õ¯Bg2eSLœJ§3ÈÇ̼ (({™Ù§j•úæéè較RmøÐ¦{ï«Ù ~5ZèÊp³Ù$ÂZœ.¿Ç“øg.-c8¹J´ ߆¬ÚÁS0“yxC¥ô°ó®{Z‰¾À íPäEæ'Ô§è°¢î - `@‰pNø«x)c.ážN›šLá;D&ÝC³XN¿ C‚N¾‹5©l¶*ÐZËÚ3¹k¸ªfÂPõ4¤ŒÕ®„!&¼ œÖs…‹Œ ‡†¡ TvNÍGwóëÝ»ÉzÏ&ÁÑáþzx}±oÑa[ÊÃõðsÜžœÉñ±ë{ǽ£áûËûî1 µf–*zN ”–ädr;6P¸Õþ¦’BL²› –ú@U Jp ח†Á•„ 2´ì<,-®Exk8Ó˜hoš ÐÝ5Ôù3J&ùzœÇ"`¤áä%wGïQ…W­)zk‰mïtm°0ëËw? GJåÈ­Ñ}Ò âÙ^ï9áåýÅÕà(Aw;Ë®á@|àH4ÜÈA¯p… ¢¬fÄSÿB†Øf<|b,ÆI¡h‰I) b3Û±ò€€ºc„X>¹/”LƉ+!¦ZP»1–ɻּë_ÐUH£š±PcxÄcP‡á›Á.|úiROT¹ð”†ã·ý‰ÁE1 *46hÍâœcYÑåb0áŸÌ«}¥pNZåö«M8°?†…µ &DåfªÃ¢ÁM¢â°qYÕ¼kDÆWÊ]ª5t£Y52”Õz–æÃ{mâí þ‚!ìafÑàaVܰ°MW°pzQ™†!t2¸¯¯/?ÿü³›ë!§JyˆÝZ SÕ…îÜ_u“HðÁÎVÿ›¯~ºžÞöö·ONúf‡Ç';Ýþ““ó³'OãÊ;…n¿ƒÁ¨É«Ùm¯?°ttz†TãÉŒXþPT14® €ìò]mðÏæ$«=+Í¥ºΗsÚÏ’¢@ŒNXr_70€%0FÂÓ§çÖO›þ7ÏôÈlÁX_>áuj$†æ8{ú øSa¡=<ÞXÞÙæÆH87k;˜òÐÚúag:››çÙ4ãËg}Z ŸnÌÄ<®¦¢)ÿÊ‘OÛntQ‚Â5*»©û¨S—ÂÀÜìò£Y²ŠŒ&‡]¨‚Ù¥ñ©Ö¸J½…Ħm¼M¦têÆ¯BÖ++FFô"§~ý+Y —ªü”am÷ 50ˆ°}K#’+0¨NQ¿†€[‰=¶vLbýÙ†¦šæý>Ž«–ò´Ö¶Y€ ưqÅCÿÉôxQUòę˳)PÄ)ÊdíÅã $ùÞE¢â¨Sr"u&Xg‘* Œ;©¨cCy¸ÅìÐ c ²à4ê*Ùy¸!M< KµcÜ =ó ÉŒÚ¨€žöÝ*Œ¼uuÃûÎêzÛÉß=¤!°Q^Цð¡ò섚Ûõ½í¸¯ý,sdú˜Ù"°Õ)jPI*ÜOŸÍÖ_GïÚ!â€Ó¦ E€!I9ó6wØ“ò_í¿òâz_$¾ã³,¬Ÿ¼ÞÐøêí×ç']ߣ±èv8„äÞc¼¸Û¹Ûíîn†£ñ­pÒlµ¨ã W6·95úêëƒõÍäâ§×ßÿéõ«ïîÌOÏ_ÎÖ»íU÷°OUÄ¡Ú~˜Lø.¬ïjl•­·¿Ø¬»ƒ>‚b<é¸ÿÇ?ý£ïþßÿõÓÏúGvô=ÄMʇo{Çó;ºÞ y´SXvù¨ŒÛ‡} à^¶Â|ó6òQÈõ½˜¼Âœÿ#”Ü9Üw‚Ä67uï–›¸¶½HLxÝÂU‚6áñ¨e‘C;)‰tÎ73û€ãdlY‡[uzæ1ÒëåÂ<{»h1[¡1‰åbË‘±' žqVr’PÂQNoÙŽÃ!\xˆu¸wFN89ñ!ÀúPíÌ·âã ÒÇÕ—6—I †Kä³1ùÇ%ÎÚ˜âtYe‰)pÕ5ÚÚÄõƒ ^ U}…ú̾ÿtÂ@X  ²¨ l^¯Ó‡ 8FÍTS(bl¬  É€U$‡QÛ‡C¥°ET7k- .k¯¼X’Oî¡)#‰x<ê$Œq†gÉmŽ’ÿ°ªˆ¬¥1ÌÒ‘Óô \Q :Ÿ,‡‘­SIèÛƒÁó‡^GŠñjæ481Àí‡Íê‹ÑwüòÙp)Ô¹àm òT ÉðjñüìW/¾ú}-óäÙ±>n½o'[Nü©çó8«°ô¹ZˆÿPÚ•é ƆììNÆ3¢þ¡Ùt>½=´”Ø=˜Lgvœž½”©HÙÚYÿüSØÁä,ÃGéEhþ"å£)ãj„Žª)F)!9™8Ç<¹23avÆeèM ¬™øÕ7p¶e7êéd„lÓÉ-ºÚ(€ÛµéÔR)'@vŽEe›,Ù3\ !SZ抛Åk(W#&|Èíi‹ªðŒ°¸Qþ-±2Š0r,» ž9L(©®ÿǪº´àY{׃ê1sMáCҀÔ¤µ¼EŽß‹#&Â`“´®ÓA¿ -ÚúK 9½1ÓiK8]F­&בQÏÄLûºVƒ‘rO«f»NþV-U׸ÚH Wiƒ""iª’ ¦ü¶|i£Pô¡ ç¶XvY?`8™ Là§”ÅüÝßþûÖqi5 @àu]ñ»®ò §p{Ó}àN—½<ƒD8%¨ÏšÙÀ…jÆ–GåÓ¹o(Vn$ˆƒŠX„‹@J=z´Íñ{’>5Þ Jø“„jÇŸÚG§b¿H+"Å·KXR“˜9gjÙSxWº¢nò W/ôà…•7Ä9`ÅI™j8=k Eü5a-‹áE<ÎN¸È˜‚,“ dÊS¥¯W ùŸŽøÕ/Òª™5M¶A5žP¢šKl̸„j!0 ‚®Ãd-d⫊x—¼µöd£BBü×UlWþâ(—~»"œ’©³ÝFÐ2ŒŸ™RkX‰9wº íh¤™4åZ$m`“'\?ÀC)ƒ%ĹԦF%M¡‘xžÝ@ðfB³ÈC§ƒj²¥—Âáïñž# ð—¨ÀÒvâ`žß©¹‚Ú “Ôb"lÝI—³E_ÐïÊCÂX„Äÿh.©ÎiÏ ·â×”faL+ äà$}…ÓºFa,Ô~‘‡Å¨F©ËMxƒùñ .¯¸ôòèòW@KÝ””bKN-ÆÊ”Õ‡;³%sŘs—ÊpnÂb6¾¦>W»Ç'GR¼mÿ Ž_¿¿4C8;¶YL5úôù Ç#™-€X¢Î§§'3ÛŒÖλWÞYÞmížíH±ª ‚'F“lÒñó¯ÿòèäÔIw›áõëŸþhøÝO^õǯ¾þão~öG·?û?ù×?:¥spêKs°®/*N±ùøøÈQ4¼†ÝÉbÝé 2ùzX IDATSŽØ‡\ nŒŠI ! 3tØ®ˆÒÂ?´$»ò¢WtÉ­©4Œ{,¤à3ØbqWø!•6ï/¯?û•/ –gÅ?óí‡nŽäæH›Ï:0 7QåTÅ ”qÈwÙÚXUtŸo=,ûƒÃélt;º…rîàl1±1¢Ôj#Gd3“Ô°þ]ˆk°m¼ß`=RèÆ¥Ü=E ÒÔ UY¢eþ`†4 hZÍÇz8's¡í­Wßi]]­œbïÊr§…âSï`%¶y|àýë·x0ÚÛ-R fMÙý©‘®üÆÏòJžO£èQŒûæ^dò>#ª‘BCZ`Gc¨S’’öJðßòQx/ 3ÉWÓt^Úˆà¸ÀL0˜¾‹ÍŽ|Ä'Д2zéono_¼øl>ŸˆPói­'Ú÷º5Ú9—Çì´$ž :®6óýc´¾»½ß]Ì6·Óõêxðòörüò|ëÿþãÿþúýÅñé™…sÀ'&¬ü rÃ-DãDxM~ Óª#לɒ~kš¸•o"z Nøˆ>}rr–C®;4wÂmš;Ω— ݃ÜNU²êFá27¸¸¼4@Xj¸BÖFýR°ÁžP‘ñ2™‡‡™¡`\0[øêöv(ùŒ³e~(ªiô˜¾€jPŽûÒFn»FÃF…ÞµPãDÍR¢~3T¸#‹nóH¹›vq`ÃJÒ+ï7m©æE£ñ«;—Òj!Ð*ôûñCÍ@0Ó&U)&!i;ŒN ›E'ããÕ²’6YUÅÌ\/ÊWÝF<]QŒQM©^‰Q.@‰ûÄãtÅŸúõÔå^çÀ¤—¸²1g­} ¸UŽ'ÕRTYŒ LC©¹ë#†a ‹ Æ!g÷~ïwtœw˜ Ð+žY2H7CÓ7³\àa78†"S<@¹Î‚zµM /“†¬ò(OuQÜ“èwC:Eª\c(X£b€Ñò馣áQ?ó˜gÀ=æ-ÏÙ“ÐD7AŸÆcÚYYaˆh—޽Q2Šç_ é uyÝE({¼¯÷ï¿äTÞâ»'Rƒªie#$=Ÿ¨°¡;¹QÙ`µ­5ï6 Ã…å(d=8Ø+þó £­rx»Æ|ÚNˆË¦Œ¬² kJ„:ý£cjM4Μ²]zÑ,”ØD9ñÝ-›Òqâ1Q­êŒ¦#%ðÆÄÁ’úµâ´8­_KM£’=ª‡9Xïài¦çµxX‘±°0¨dƒÒ&J%(\u˜ì¡7›Þ—@¹×XX–ku}3T_ Ï‹t«š/jTHàM\ÐÎ+Ç|8Ø£b öÐxPÁÃct 6Ô>ŠxI™'xùJëÜ‘0^‡^ç€P s:Á[§îy^1û± 9Ê¥)Wx¼yÁX$%ªºêùc„¹=ò;16Ù¨*tŒÄÞÚrfMiw  /‡–?4]ÌGƒ£šôúêŠ'äèP±ý|…cs?ŸMÜôúÇÃñxß¡5e ™oØnx«IÞÚÞíöXQ9Jšö‰VS ¸˜Ýž öî®§ò¿ÿO¿üË?š¼ÿóûù÷Ñæó—?üôWÿµÏ?ûáýøâæëþóþ¿ôîO_,úAH>öãøSìaö’S¶Äг@ôäj:ŠÜ#4ä+ô*áŽÇ•´"PS8|K㣠&ÏáäÒ¨P3/.QBDI•O4 ÞvÜS%‚š‡½W¯ }_|ùk Cèã.2ŽY âˆÆœÓˆ¼·°tÖNÍ:´T‘HìÀ¬pJÙ'è=ìgååèø¸zˆUJ‘0|n 5ú76ð["qVþqøÊÛÕ¨?ѽ6é$ŒO"±?‚SSá !ªátrw\aÊ{½îgǃ²è õ¢iµ)Å?é%@GâJé¥ZbSËøµ®xˆõ4 0­Bý¦-p@ëÒx„1Û$ˆˆ5Ù¼"> N^ÙÞOÆÐ[`ã…ÒöAKˆŽÎ>cEók2]eȬ¨æ\á#Lj]D‡ŒÃðøŸØFT½ ¿žz#wŒÌññS졽#_¹“~~H͈%c*¾òÝÖGCûçÏvwz»;ýÅzè€qò¼E³ö·§ßûËéûÃîÙp8‘“Ýýƒ –S¯A›aœƒ`%‰Þ¢yúü`ž‘)ðàd¦ Ö@~+ÌÞïvûÇ¢Y›ÙJãðD៳¡q­º… ø4F: ’á$1jmÔh­fŒÝYFŠ •@£GˆJµ™È%M3&¦r¿uuå vçA$‡l.¹}: ú9+'fÅLk0#×Úg˜BðrÙ19`} 5hÕ¥¹á`©ã†žqãjÕJTÑV)Ã"hb–üÃÛaªŠk/çi1óCY&²a•R†  ¶Þ/‘§B‘Æ0d„_•ID¹ø ¶¼XHj͵S*•⸰“§©ìÆõ¡\oÑNÚ aZ!/ÖcTó¿ŸA­4_Š–a)¤Kƒ*f’C´æ5’ÄuÕéîïüöß“Fgóêñщ8d¨[_KJ›\pë’º•õ'?œþôZ˽:.ÐÓ8•ïáÑek=Jì‘Â-¯‚cn6“l@Än0iD%ìš%}JòàÛ™MF/D7S‚‡aKÊ)Üá­ Nµƒ5©Íå¡5‰æd”Öcö\ûàgr Xza}uáO\Õ®pm”¸)”®ÂâþÂåØ`Ùë›Å£De¬˜ 4¢Y4N9\ñF(§q}jBq’ËßJL¥¨žÐ/%"x•Ñ&ÀTzÔ»ÕRZÞhÃj›¤&€O²R žËE5Ñßùò÷Âæ½O&#ý2*î;Ýþåå¥ît­žömÁ?ˆô¤©È¤pO> ·YÙÉ:£FC H¿ÉþÒ[ÆT”ûÅÅ…˜aÆÔ€,š\el؇z‘ªS¯è×HÁ£}#Õ¸¯ù8³(a/¡µ­û^Ÿ–̱jB1†©+•½¢‚‰Ô5­Då“£’éËžï›è9|™CW,c0X ˜ÜÖÈ­Å…ÍêGú#žÄ¯üʯ(±òǪ ¢á),œÏdØ~ôH "7Ñtñýãg'Q—ÑÇ2Ûvç>´cÝK+ÑPüçÛÛkèÕy§2|°â~cãÏ5uH›wbsƒ5·Ž<:Ý zݘ);ˆÅ«¾•2Þ€1ºaåÞ¿ysuuIQŒ½“ ö´ Äjgó—?ÿ‹õô¢³?Ù¬nOŽ»Ož¾ØÚë}þ°t¿Ýé±W¦…›Åf5YŒ/ã÷¯~þ§½Áé³/æò³¶¤ÒïH±]½÷ýé¯è9ÐGÁ†a áU%¡KUPÈ fݪÚÈ.×§Q,7êvxkç³f(~§ âhõŠM‚)>xŒ½¥KGøô¿ûÅÏ¡õ“Ï>§nÔä<…OjÅ1´8°¤( “×Ü»õx2d‘†r+QJ¶“ÞNžû‚ït&wvý%ÍÄ![†€”ól ³Í {a{Ç<.P»ÚÐüfµªN111F‡¦î£±sÜX„‚RŽ¢ŠXq\â)z‚ö ÍÎ+!¸ H˜¨Ø[šÇ~›ËïîJ”®ÂÆÆ¥ÙÆlÚ‚æ‹‚!h‰uiÿb·´êÌ£h¡€Â† ¤èHÝÕ¹P|ŒÔTîÂÀ6LÆ_´Î^)´уÍhЯ!¸Ó)ñ~`ëôÂçÔ~†YaKcUESþ)ƒ Ô0GÔ&–.Ý¢–övçëYåÉø®”hV×Fu¼a1Qðê~Û÷šùû]ó´Õnw°»uø´w¾ºy÷ö—r·rʃÈìgÃë÷ÃáèÙ³gf$¯_¿ÂcÐ WWE©ð3ËÛ.ÜìñíMâlø´Œ!¶'ãÛ$³ìͧh2cµØ(s‹›/Ê#ÞóÍAÁOœD;ÐÔ,iÈY¶€Bèöp)$„Üwå•ë‰oÓs¼¤M-`†_*§¹;1.¨‰» c±ÙÄ¢`¦—™þ€Z:_! â#õƒ­²„¹nÓžÄ!™²µŠe"Ä‚:Ï=Td%õZñ‰#•Q_v³ BÑNÑÒd"÷eã§jÞjïºwq¯T@îhVN¤=¥IÿÅ$Ùêz×tÌþ©Ü4-Yhë-^¥j0°tª¡VÏ4uZj?‹*¥…´ÐlnÆ®ŽÊ^ioùuiÐUБJ• óÊ!Oj¤=2(-xkx.¬€­Ó’ð¢Ç<‡´Hñþþ?î«W¯ÇÇâiqÿÀä¾2t£/”h±ÁH 2±c93º5Äúu¯2ñ©ãÌ@¯ ¸idÃ2îµÃ˜W×n¼(qìNŽP¨ <¢ï°`fiŠÚ`öj„Yãþu㊾¨I"…ò%É Bü§k'ÿf÷чùW2»ŒjŽÔ, eë cF£IÝvÀ÷Níè0Iõ™ÏVWù  N ®J“jT S—¡¢NÈ~5U0<ån´Fñóc€Ämï09ïœf”ŒñÞ’ùÂîÁDœZ*&ì†#W™åù Ÿü˜.×>;,“»úîÍûú&—êJòmMQB;šÌ0[_÷4¨§OŸÂ¹(–ל?9¿xÿž; “ô Qx89¢™Àg¨f µKSä [)J(Î%#ž:¸Vp[?ô©gí ÚL 1Õè'AïêúÆ7ᣠ‹[àÊ€‰;é Œ•.@Ò2ªZÐÇñND^ ’ÍÈ’^„í›_~‹3}NžMFPêk}Ö8(þbbç) ÃqÁ/u„µ“JT‰Yl_8œVÈXâ%³ÅZ`ìÂI›C¾½Iá1ü‚sp2¯mùˆ-j!Ž™“ gF鄿ìÀßlÞ½{{q!½øã‘eˆÍ=Рò}ÖâÀaB„ŒÞ||r{ (Á雫·wû'½Þq`å¸,g“–åÍâæÛùÃnÿäl¯²Þ:4ÒïjÝõãûëWo¾¢×é³ÓóƒÎáÞjvõ×_½ú럼x~~px¼}xl¿HdßËP=T.×јøćþŠsÍêŒã:´MiB2!IwƒvÐK©‰¸n §QÐSoѾñcüé$äÕMMº¾ùê'?ûú›/økÎéNLZ†„ VíúÁê8Åx8·7·ÚŸY.D™º'Qôœq^¯on|`QŽ0Ò~òé'| sÑRÁjg½‰=*AŽg€ß f7þ„ÿ6c [–ïâÞ0­B^"È»ò§GþDè²yÑÚ ½LUk$BIÖPMƒ\ÕqÔ¸ï)i„ðr36…Fσ@N­vJÔ¬²™%¡œ¼àõ,U#ë‰L¯¶XdcôÁµÏÌš<f ]²ú îœX2Ç×â³Öè2õ…d@zË~³¼Vk÷Ȉ<Õøß„¶À@âï^ƒ*Ta@nx«µì¦ ÄŸ­„¡ËŸdÇŸm€Œ±{­©ïúH;3v…Ú¯ÂlM€(Ÿ*ò«¤½²ûû¿ó‹OæÓ§Ï© Xa‚ˆK¸"1•ÖbÑ8º¢=bMã7›…±˜Š…î!£Ò@âŸ^@Fü·©c¤Šdú–g™(¨ì1»ËE¨àŸÚPÛÖ ‰Éš/•›ÂC\®¦Ž±…wužèÑS* ‹»o(F,¨§bÔ¨žûdüÅ’Ët„`åîÊÇ$àÁâüFí`-Gè)8añ©™ …&é¢&Z)t%š¢…SWsFUCŒ8éµ *ªRMŒïþúú VýiáÆ $Öh-§¼Ìó ‹CÈIOú´H4#ø>Ä p¢ÒvðÉz¡®u€ôwï0Æ8gOžœ¡øµ¯úŽ·AÆÄ± ƒrJòz͆Á?NÁTÌ©r¨£ƒDïÜ`5hpvºpçP^ Íà]RPŽ5”xÑ”—‹@c‘Mån”ãIThÞR~“ÇœÕqpþðF·CáéÀS&SŸp÷]Ò¬¾kYƒ7p°Ä3Ô 7?ÀºP‡­Ñ¾¯à$ƼÚ„¬M°¾8œ€â§/^ZqÓ~oÐçw§Ç|Í£ÖyË=-›¨ ŽB&ˆgÎq–ŽÊìEU¡,GÓÈUpy½Ñ]k®É(;7)kï†íÄ"©”("šNötÎ Å\:˜OÇBX{‹ëËë·ïÞ½øä¥]=(b“¬wEñ3ñm·Ö¼»EwtÞ\o¯,ž8°,Ÿ¼<êt#ÃÝ}5w9º¸[\=;ùœè'Αƒ4ïd~ÑâpHŸÙ¶Ñ;ع[Σ¼ö»_ü­e{5~ÿöõlrÛ½Ÿ=Ìo„玟òÐ;¿_L!Áe¼0àרuG¸Hnª*\z³µê÷ …a瀨XídÄG,ïªOíÀx› †dÚÅuHÆýáÁÓ³³ý³?þîÕ«ã·þí,|ˆbVì„dúF5*«»»òdµbr\jFŽ1ܰ=T¾&æH¿¹³EúØ9ø7Ã+T‡A2{ù¨ -gXÄßÒ&Rft5£mä\L}…mÕp ÙÐÌx_¢OF'Zé-Ö‡Û!ÍÍ?¦÷(@!OÏŸŠZ‰‹mí‰ÿ>;:~ÂSMnf³ E‰9M¶hiãx£¥4(\C~SÅwÊãRÀ»³4Á‘ˆx0S~paÐðë!Á÷.Z Dx¯MWû>ôýP‹ s>¢;‹t83«HïuÃD d¢Á<µæµæ¯¸ÁjÔ¥¿&Ú oó¢ê·¯2"Pƒ‘Œ/¥(Y(†NþxUyJLœð€Ó0^Á}FJ“'HÀSAÛ•Íó«û+“Øvr:#®_Äò zÝx‡kެX²²4é_Ñ"2RF Äo :ïê"º÷ý=GeM¯*(Ë:[fÛYJŠÔgJMbšõ{$+H …ìþWÿå?GZAMSC,†¬À¹A£a¬|p*÷ A—‘šqÝ€Gž1U%~¥·UÖ² n Ë/$¶×è.íÀw1œ_ø‰ck­¨ÖVÔ¯¨ˆÞ“¡¥“Z÷@Ö¸ÌÞÕ¬µL—‰V4«f…©XË'ÎДd#´Ì`ËÅ»}¸ò-ñ`¢2–VA›^tð “fƒy¶¹…dÎhPcS©…%¬îuPµ ¥½Þ†©¢Ö 3™ßƒÂSSÜë2Š6çÖ£îü _P©©š«qWjV(‚rÆ0þe"B»%Øs`‰ÖÁ–JŒàÊ' X áýòöìéùñÙè³/¾ 4Y¿õ…ZYA³éóçÏ ºÍAMÍ|zf·à­Nº8™1ÇÓãã_}uêb¸ Ãí½ý«wßînù ˆ#oÙ´/®Þ_ÇØî½5ÛYl_}÷ý÷ýÊœ82h³³±”&ê8³qòþ'ÿ쟮Ç×vƒ2+>Ò×8߀·_k!¡Ï(½½Äè¤îÕB¼¬H <ßpˆ ð@”R´r¯ÜS,W,VÏ`>S1¥¤I† àÿìKIS¦+¨éþ‰‰ö`g5zõßþìÿéu¶œA¾ýp\Þàö||ñ°¾¹zÿÕíûŸíÝÍ%¨!Ç)¼xþùŸÿùWËé_|n 7“°œ¾yõmlÖyöòÓ“ãS2Âg¢íaH$QÊUÏÛæe`”³]QP”¢í9¾ã¹hZ÷ü“¾øâ×Ož¼éÑÔ,ýƒ»šER!9Ñ“,Ðf‘*EÍ9óÃXº0y½â)ªëYk…ùàß½NÓ²ü,ŠH¶º!½„£agªfàFLü(6(»ë¤v4¢ðbÎÁmÁ—¸ÅšDÝÖ¯ªá䬓æûß*G^ÊB31ðW”­ËNÝcw ”öÕc] -)°›¬N¨3.âØZÐWü‰m¬ªÀˆ€²zéü Ô‹F´¯×kHî]»ÿùïÿ.{óäÙSêÏJ™þ€ØÀ…&À»/Deêx Üá^÷y«4Ä]È×ÿF;ÆÙ¨…“]l¡±Œ [ÑLô>If^ Æ™ô¯¦¼å‘Hƒ–£“"'¢;YYˆ:)O™›®iÊäX{zñ¢ÊžêÿûMG»õÉáà ¹T«à{5´š,Kà›%q !‘þ¢qB$­\ õ.‡'*6V?ú‘àW0ÀL_¥,@BsÃóze¹ñJã`zÄpP–¬Xa ˜âÃ÷®ƒU¬ ˜p“pO!ßI’obïm´‚g5]š f¨KK¯ 'y6NØàª)a®ÈN}`A0ßp¡•O–£‘’Õ5ÔW ÏH“ÆÕ´ì¹ØX2}qÅÒàGƒ Û4.Ëv IÄq­jŠM|NÙ¶·‹Û$»ÙœžŠŠù蘨ŒìËùbÂ_„N|"73ÄŠ˜çP;,A¯iH¢ &Zx{#³þþìô8A,9[Îsªtgœ¸ 1€ê¡ L8 ~rŠ©«BSÜ L1º¹…Z2kmGùö–fÍÑk‡áÃ98 *¯–l7ŽŠ_’úVyˆqˆÉÔ”ß`·Iž¹Ûž-Äîd"Ói5ì“뛫~vz;Ž;ç8V ²µ¾aŽ,líí GS÷L²óÉ €™/¢GZéíÛ·¡;FÈ’ý?ƒ‰tØ 1§Yn¯†¼´ÁÙ»³ô°ݾ]ík™Föi¿áf6t„üd8ö…c_»½ß¹³!8šÏa+{YOdìv÷OŸzw0˜mvú݃۷_ó§ÿÛüÕOžüê¿!xÀ ¶@ŠžÂD3xÑÀ Ž{_|Ûᦥ •@ë+±Š.Q™—¯t”Ó]Ïï¤ÑWjVAûœÏ¿ÿö;¡ë4Ÿ|þÅXd7âµKƒB‹Ò„>2KÀ0*ØÚ& 8E@hA^L¿6œ=;<<²Ùûôìü?ø¡$øî^÷ìøÏ«g !rŒ¤<-¿¸´ˆP¼u¤}£Fh>®…1–¥n¤ŸÉ&´"YÇ@g,bZvï.r¾C,G\ ¤‹ÁbN’¯oRqô-©ÊèÕ,¬1•b󫋸S⸠ù‡ó¼Æõ¯PºŽ¢ˆ4©¿Ñþ‘50+Ä…(ŒëwIÊ@yT`NÍ{X\…}A¾Ä´H¿Êp5B9ÈÂM7¸ IDATÇ¥*T‡¾î8dÔr*ÇIÊŽ`þ7›m£{ŽdìÆ'ˆ…0°%ÀcÆwÓ‹Wvìk,÷ÆœÑs6³gyûÀjÂÛ¯~|óÝŸö…àøÛôTÜßÝž½{ó×ëÉptuñå§ŸZ§TVSéXG]R~¼KEƒJk‹™ozÚÖÀJüÄ^¨AOÐ6^“¥« É×Aæ“ÌÊ:=¾µCy€Ä]I Ü‘&óÕÓO¸ß²Ùé:¡å1H<.TÊr616zØ(ù’PàEcá!“ƒcjçï‡ìÛG®L3ÕÂIÈc™Ü;ø*[àF¥O ‡hŸ$GZ†Ë2Y@Hg4d­Ë« :.4 $…[`(Ñ&Ì#«:.\Û`U@<ô… ¢ „¸§ù-òÄ'Mn;N ãq4…¯Qu¿þlm‚p=Ÿñ—TE…8,t—…ŸýHfêaSà‡"˜ ñ¿z 4ˆ¸ û¥ßŠ„-Þ•ËMÃ'Ýê¯êT‰GÚ`GÜê€Ä`Lô§a!‘óg]ñ5‚9«ƒJ#C jfåiðMâúWïšõ®ò8‘΄Ðîþgð;æ·Þ‘ìQÀlí;ã[înÑ/dk³XÏùp쳚ƒSS6¡—>LVà~w¿oBôþâæ“O?cÑXZµÀ*:ÖI(Ó òÑóã´$ÑÂl2¦q­ÆÉ]Ö>1ºšhbFÁA1蒹⌥\`N—ú«õŒˆ³(@ùTáÆ‰/!B8ØÐâ¾ç¯! ‰:µ+]'].{þ!—:DÔ¨ª-!â¬Ðç뜅s«4½ÃN¦NtdKo¤gù£Ž‰ƒyF«ŒòÅ|b< ¥õN_ÓCa¯]çøº‰ 'ž%¨‰åL£œ3‰a™L’i†„5ë)&@9üµ(}ÁŠ}§Ã5tò ¤U&1€Á:5Š-‹})!ˆµç…¤Å+uNÇÖúøôïN&æúXY°DZh°òש.Àˆ'Ê©Bà¬Ôeb6 Ç3…¬T ðŒ:]ŽUŽÌfÞl dk“Se(hš˜e‡9@³[擽^_Ì€VÊœÎlˆË|‡¿¸XIŠ·iî .ÆÑ–­Eæ ,¿D×Ö`u*½fÿÐí½ý¬›H%¤…–ÁÓþ ±ZVóéÐSòɧ„è°F-'¿poÿ—ß}·çœ¨ããË÷Ü­ lÞ¿}Ǻfa„ˆuæmŒ÷–콸³Å¬8G_„œl>2l‘ÕZB2üG1 äðUDÌ–ýòï!j˜¼<Ì}Ñãf8ìàûé|§ÀÙ;£ïø²ö9r:1»Ù„¥]¹_Ʋ’Š´ã”š~®ÙÙq¤ÔšIËÔ[³EB3»ÀbûéúÂáÔþr‚{-6Þt¶|àÖ kœ¼øôËÝNoÏQט`Ûg×væ7«ãÞSO¯n®6›‰C w÷3_3MiúôÅ‹§Ÿþ`púôüù'ƒç_ZÀq ñƒm‹GÂÞ–‘ DzK dŒ¯“2„z]§ƒ’®Z§¶üf ‡}ŒµEœÎm,…ãjÃ!xVŽ‹MñæqÍDƒ’YÌ}±fýæÕOíׯ^ÿ›ÿúoQx¤ ÿr±.ÆœgsK 4€ãåÌzñv& Ø58"YÁº ù‘S¼ ¿˜“PÑPöéÚ·Pä£ôº¶»ñk…J+s9t';¬ÓB­GÞ9Cä'9û&9‰ìB-Ùf ?'MJÂk' ©Gúü•Ì5¢ªu3¢¬Ái›4›òÆÑx$WÂÈC…¢òœ¨) FIVÖ0" ÿpÊI=ùŠËç\ilª^˜2ž–$‰~Éýv.ØrjÇ¥éÍ5_d±ŒÇIà‰ B锂 PÆ•mS+ÑÁƒ¨ÌÝRÛÔ®±„÷ñBÒchT,]®6m‰Û¡J¯APî³´& 0qÖeŽõ2lÉ£XÚF}‹÷Öñ¹ ¬†F(Ðða&í}ͺRP*IöË2Ò{¼fxëªìò'N–ý*!.¿&?òçògùŽn¸GœCÌÖÜ/õ‘N þ$qX4ÞÅÌ)(üÇi‰_NuGïƒ%ó ¢Úl®­·QzšÆá{j,‡¬ý7ÿÅÍYÍ1 è¨Î®ïËn:u³MwN=Úgpw;³ì.ßb-²d×a粇³0ÝÈ|ùÉ3Ó³Á‘Èü‡rSÍv’\Œl¿cOñ•ßΡÃ{Ø]œà›}P„J@š8”CwÆ»u„—=± I×w“8nޤc»7>뚊@ §Í\‡s õ·2üû—! ¸&uªà9­Ð¦\Š‚ éÕy?¦Op™4,1*¾°÷MV-7%ôÀaóê¾NºÌê±$€{»ÓB BiÉcž× •œ|CÉ"0ªÊÄáoó4S0̳˜S¤¬ÚDßåìMâUñè"gYðþÐG=ÙZ‹ÞG›D8d¾øC8k8y?d1ßò £&A™r|ÃÇ0Έ—·ä“Ÿ£¡ $KØïY5ß² Üá/…_{’“’æ-tµî†gj¶ºÅ}g?H¼Q Q#ÿë¹`>ÿaì‘L`_!öMGÜV* $X¶Ètä»ô{àQOl° x‰Qó̼ª9Ä™^å˜ÖÈñÃýiÖOõ’P¥ÃÜÅyÙæÕ¹’³iÎÉ3öNÙœ ›Ò²@µ8öšŠßÉÞÀξõ©2 o´¡”H6FüdFS²É7ºÇlHhhÂU !SmÆO zj\º¹õKxÀKþ§»››[¸y`S‡ùÜoM¦.T\@æm1ž\}ïØ`­ÙŒŠ   ™k2%àìéÅÔNs'Œy 2r;è8Šgã_žc/Õ“²‹ëÉ{B¿ØÚ?9ÿÁó—kº”îã<²Ôew% G˜ ¿z÷3ñ„î>e1[Ío|wk½8=ìŽgëìì“·’ÔóÈe—(Eiàt(ÇÔd€r$Gf2ÚLd(æ$WrP„HÈ/‡Ÿ¯ƒKÐÁ Õ»‹«O?û‚m8 Ë²N·æ¾D”‹–£_ÓM˜ÉG¬Ws/–×z/çÌ|Ÿ«…äÑ\_]èéôøÈ|š 0µ„FbCp¨Ñ6W1£s Ê*§!96’H GÀ2ÉUÉCCø1å0U­*dÛ9LS,8B-*;y0'ékÞH 7}Èó“‘Æ¨[%´HýÆç4×=mÄ_~LÇ”˜/'8'W!Ú©f€ 0ÄüÔxý€Øˆ2àÜÄÈ1çê2{.ôyÐ=šO†ÿäøï¾ýó2¹}½ßãíÍÆW&¶\@¯óÑž<aÆO@³D„fïàäôœÒ•Bm}ØÚÜlqa'Þ¡Û÷ºŽÛyÀTüf†“š—“j‹§IÈ]RÄ»=gžä૜\ísdÝòm„: ¾ßéìžúk‡ÇÏv;v~dG’„gjhhbãE§+8Wr¨ožY³ $–¨w:‘D³ IF$³0J“P>ÈŠ™ ˆEriœ°¤QTS‚-]nH–|ˆmÿâ"jDAâلС¥»ÂÛ\ŸB£â&˜G‚øfº«·MÉÞÖ^w·{盪|D ‡¦ôvŸôçsãzÈŽ“Œ"¿ÜÓŒ»Uop¨³Él´Ü,`[0At&ã¶1|,:êA¾u0ÑñŽ Š=ÿ[w{¶7«étÄ+âŽPŒq梬œ!®i Ìñ°Ÿë†äøaíĵ´Ù†ÍqCÆŒaØ¥²O_Œj™;űÛÇÏ9ˆÁQßåjãa“F>I²)…묿ìHful +yå²ÞgÓq%µŸ6oãZ7=eNÈ6OŠJÌÎb(a©%„‘g"j5Ù¢j–>}DÏ­Y¿ÏyÁNF—KD¹ ¯/M£³š^Ï/¿µ­»N¡Øƒ®ñø–+8Ý&2‰Šyí´Ìƒ!ã»Xìpî@>ìêØ°ÃÃÑdbžù¥¶§#iì‹Í|(˜ж«õn_÷9·Œ#²Ù L„¦«›ÁéàèÙ>ÿò7w:Ï÷ûÏ_~þC¢9Ÿ1±Â'ȺvSN 9Dúzâ#Õ¿ø«éõëùøÝløÊ¹©\rã2cÙ f«#3Vȉw.J|gR¹f˜1§3GËÚé8e¥¸òæn3E6Od7KY Õ/ÊrÕõíXÚó±LÃow-Ê }\Ê&-¬(mŸd;õ¹›»¬‚™­]ù[“ÑÍõ‰DsçÆë—Ȉ4¨ÊŠy7fþ†·òá þÃ’ÌÈæOŽ÷p6ž†j‰<Å\Ñù™èÃÉ&ßî?ݶhÓâö"ȉ‰å´&(… ÙF`§7 k£FÊãde/¨k&Ž0®Ò¸$ØfAÔ7IM)¨¦ð¤¥vJ• ‹×¡{¨‰ÞþÆ3.¬^ ? ]r€è×ÒÑV>˜“ù£0A¨#Bè-®ž:8Ïa-(,O7ò¤Áòm@HE%K?0“ñžv® $¬îBÁ€©ÁäaƒÖ—Uœ(#DqM2 §õÈÃ!b䙀áb‹ÀÀ¥)(ʳ‰¬\÷ÓE\¡¬|)ñg»7v6äøÕN›y· JåDï*4ë]Ͷ×Ý„eëj­!€¿Â µ¤¨銱ˆ˜gzDÁ9|ÇuËQ|-Q$^àÉàˆaåYîþ£ßÿ½ÐºÎŸˆSZùCBÜF‚¦‹3uʼvx’ƒ¾/˜·¶³’$át°´Ò‰¯—³m‡úlß/,ûØ5Cr>œM²æXø–íl„õ¨®Ý}LùvGÇŸÜ¥¡],Rßãe‰ÔÇ,|µ~-¨jõÎg„¶÷w92j.Åd·ïç›åÏOdœÿ–øøö‚õ¾_ûzź ßâ?2¢JË mgÐ?µø;›åÓm§ •ø¯š —¢œ2Ê÷ñ0”K&Èl9®-»G¼»ìjɬƒÌ;Ô£¬ƒ Ì|$ZŒç3óg/ Ñ»‰Aë=0Gm!`g>az•„Ý2¥‰É7 Ìö¨èµìãÃs²†“ÚEy"á{ÛßjwO\îè2ú0ÙÐ*îvRþhŒH¦äîÞò–ðaÔ›Š™žÐ.G—óÚuþoR³¸&z7—l!Êez. Z ›«ˆÇh <-´fBÅ ‰Öâ]S ¯Ì Jz (¢ÄÙgí¢"!ùÌÏŽýnØÌç& ’¼‘|'{u2c§Å-³fuX;ÞÏ*LeÚ—X ,4:؇IˆM,ŸUã0:Ÿ|WV)ENøžÿa’v{sSZŠ¢é VtDýÔ<Ë»€N™qæP~Â#ó¦!“ ˆ2¨ï©©ãbÔIÑ‘áò'im" ÃT ê¤{+Ê™‰1vI£Opúda$ÈJžGvE-¯á„žÒƒUßãˆ×/µBŒ” –•Ìþp¤þôÙØÊÔݽóÜáä™g¹ÿHøêøô¡²›R:“¯!àë‡>I[œ"Ší‘0kâçÒÑC—NïÙé³y§óÔêìdí<@Àñ'87˜Ó&Ü2šŒû{}ˆ4Y⸘x7Τ¿ ¯dË 4žœ›6‹>òoÀ58Ꙝ?îƒL>þ|*DЇYsÿøšêãžå>ÿÄä~í¼¡œ4»YÎù‹¿*O¨48' ·gûzýâAšo‡kœSbÍC®Ñ0Áp©ø¸§*8¸õòâ½Ã2À@„ø^¬‚9öÕÕE¹qeøb ‹cUÙuDžýÍÞ°'ì%Æ3U•GŸ0PD ,C4Œ¬ÇY¹¹L¯ñY}»OH³NhÅ¥/œà> Txü³²™Å,Ê‚TÈ'S*€:W­\ÄÒ _ÓÌX´ {I ‚Ò›Átb$¬Tm'2„¼`ÒóÍa$îi@ùÓŠ-&ä/$î^5Â,y%çK›Iúƒ6Ì Êp³ÂÈ<×6OÊÖáмRM鞦Υ®ÛLÔ€^âX'Õ„cÖô[¢b«|²Ül“Ý­Y÷ ·ºëîžZXyÿþ öì«×o „9¹­{J!b±òl:Ï·³hÎß?|º³å«V‰^¯—æ©[fÖ25õו­·ä]ÓºR3x#±t¢z;¢AB/ô$ ã8Óx¨ÂM÷êôOºƒ³Ã#_Jp’{vSF© øe Fø ÙÑÀ ?—gO%W;–Ê‘7eøF¾‰2͈ʕEï!YoQEqVæÛÑ+åpГ”Mc(!7~C·D‡Â9Ü=ëÑ?ê%¯Û—çÄ¥“ìq„óa*ñ¸Cº é°91ÄaäÌÞÍÎË/´|á¾JÂ08‘Ý¢Ðô˜¾²§;ÍáfN匵”«*Á–$‚3>;õú´2ùÁ/ZÐ µzžˆe›ZŒÙ#ÆUXŽBviêC¼Ú#í{%(´»q¥Óà"ÿ¼&ˆë7LîccƒÔI…j_%%­宼V¿Õ{ŒBš›•+¦žšÖNk!d*;QÔ¼še¦í°ÙýÃßûO© Z<ôN°+$}áˆDÐÀCV)`Ѓ÷áa2Óa,®BˆÃRfè>å¨$Kt‡U‰·EÝüˆUðÛNNRž°ÖÖ:„K8iÙ †pöc•“”ÏôèÅÈ?Ö€öÀƒ]ýÃÑ b¿²jÂ,÷@ÍS¬îvsÜxͺȀ™E&DZ‹™Q­Àœ0Ôýfêì8‹µVŽèVŠ;ë›kÛ«Å]Ì|<Ç&êàor&øšîî„gh~ÀLx'Ò&oÖm9‚)?þ³S…§6ßåÀ­l£eÉ%r ’y9ù’§lô¢l#œbqkAA \Å_¬uwŽ.‡M Ä+´#H@› y>æUjˆ‹JÄ•&y¨É¸º§/¢ÚHšßJU¡8d‹s}ñ~Ì-ß]ß*I¢ÍýÃpxóîÛ¯ºÓIÆ›øh—ë¥Û­-ÇÆJ‚ÉÊfÑâÂÜ’a³pŸ&äó _q@ÅHÐ~L—­ËZõ€UëcY|ugB_¾$Å«(Ó‰s5v|êghûøäewðBœôpÐT2ÈÙttÒß÷ jç –b §9-d±žÙwhlr ±Ãaw`ºòì¬;šLOÏŸ'Û/º ‰D+oÍ⹤[vBfèÂ\¤:aĈrã ‰úྷ:Ö£Xœ€…¿k‚´¹¼øîéËOÂxÉýÖõ%+*Ò4ÚúBŽÐ„ºæ"àËÆÛÄSkЈËùdþÅsPÄ‘Îó/_¼xÁeT(ÖȘÖNΫp Üöƒ¤{N|fË]Ó¡v݇ï°A”ŠLAv%æ‡úÛßC5TBk'nLÆ#q.<@ÁRT "òàË;É·4ôѪ´uÌo~±UŒ™z±R8)ÊB1>Âtæ ”Ÿò(6LV‘zþ4öÒ`쥥lúƒŸ¨<Ë‚¶&O‚T²‹G'ÑôE¢øX:1—ý¥oÍXÊ VÍTŽ{ܬzŠ×™‰X‰èŽJ´ˆ•H,œ©J ÔœÖà-¬æ ï°Â'™n%åÅ/zÇÏÐ`…lg«½#énãë7ßÿ³I¿óØC}Æ,}o÷äø„ZË4{Gƒ'>¼ùÞWaâËòÞZöŸ GèÙñà|x}ý‹Ÿýh5¿Ý1UÙÃW6qO¨b;L¬0O€%_ çmVÎj¦â0k"Ìj4’ ɾ58ó/a+>Ä*ß]IÌvKBDÛ""|™dãC(F3f¹Öü<»Ç B­2£¹$q¼uÏ¿_˜«‹×—¯?yvvØ?Ñ”F]ÕçŸ) ˆÕ¶Àr. ŠC¬Æ%¢vŒ6+C½ÜøˆD¼f|¬ÐlÔÅuts}í-@’_Wä#¬¨Rb¬­:õ‚d‘͈¤ïb$Ñ÷X”¨b'¸)>É´3°¢–¿Ëâ·•'$¢@ùÇ"äQ˜Å Ž¦Ê• j*÷®·\íÞ¯{ÕЊVÁt†w)p3ãÒ‡Kƒð£PÁYkA¡~1g|.|òÿñKÇâzbg»@4ß\ ßál.³eb¤“,JˆêÌeïí Å0ˆqJ %cîV`ü&4šh YÃÁ–'ðž¹Z†ä¿5‰… ,7Á‚Ÿ‡´ùõ'eÆoªZº—¾Æs‰3G˜!"Û÷‚Ïä£SýÓqÆÜ †Ù¥Ja˜×€Òonv—ø UµÆiµB± ~iãæà!Ùu8U'”a”’~è%µ,íYÉWÑÓ’GÞÍÀ;ޝaë@æ > MZÍDæÀcĺyHrclJ+ƒ4¡2ó°‡máx!3~Ši“Ó´Í¢ÄÕ±okOZÁÁl¥5XüNþ%——ÏÊ‹÷I‰îTʼ꘢۶ŒJK¨Ä4Œe&“iؾ!¿6,+ó£Qþhƒl—ïß³¢!F„ÄÐ] ^îÕHÀ?ÇÚ}\Þ@.ì·åÃ)÷býz›¸€7%à:4­°„ÐÎrrh„)ß(u–ã–Øm.Ik=½Þ[á ?éäôGñh@RÞƒCª ÿ0’Z¹üpR§{Œäw ÔIC»mk.cÚB³ ÊÈÜEÚ;ñ·ò‘ÅõÙyWÎ.XQ›§“†k“<{IDATJ,lóD'%Ú=&)ì^.óôÆqŽo^ý‚3m¨¡9ðSƒmç6Ë—ïÚ 8ò«Çéåõlywtþ‰cµa—Á…ÚDWRË-ù5#‘˜(ÒC¯-¥¢•èÐP6 o•S„¢uòÞ °îl^|ò^ûùù³³Ó'¾1àÔ³n7qJ -íÓUèT !7´ƒ4h‡„¨Âmß Xx=}rÆÔ°LÛ?¹>r‚q4?Q>eˆ’tðŒÇ‚m@Ž!T}ý)fi¤R~È!XqÆûääˆÉc,ð¹Õ)‰'+¢nY)£7|5œo,?kÜ‘›b;êŽ ÊÀñ8‡)¶-È”ÃF»RGšX® J ³eO؇Z¾L¸óSßuP Í1DzâæÎ"°Õ¬'Q-ÑFRgezUУ:qãhÏ„@AÕÊ9ðø¹„âQjtD´ùWÑ S|H‘³hJJ±éXIo³êTNØØÛ1ýþ/ßüôÿÚÛš9»,çåda³˜sËÓø‘T“–zwÊaúCÿ/¯gãË£dåù•D8\ÜÞ^˜P0OÏÏWR&zÇYˆÈ˜3Ê•I7§ºw, *€É” •ù2É:aH«¥,‡KÑ#M™HÏ盕YŒålèÖ`¡Ð4XßË%9Â=˜4¯–Ø/âÆœD-\‡ý$ ÂHB$ñ³×¬/ß¾¶†m'þ´#AT.!ƕł¦åòªƒ[Ó tq«#¾¼é[øÞ(ÕŽ?º´ÐTJºHÜ¥ìTm§Õ~«æ¦Uöb{EåvÁ6J© YÊD!^Õ v\^o-4°£¶’&{"» xäZ»¼ºÙýwÿß|ûÝ/G7Wë Û…|üt>r‚Îd6:z9/•8ºu K§šŽŽ´XŒ¬&ðù²=šµ ;ûðdÛüknû†97ÝŠ-¤L2Lf„ÊÆNÞÊ·Õ²‰†W˜Us< óh´HzÍ+TžüsÍ¥ÏRfÁ++šaåÈ¿‘!Œˆ IÏ•1Ï@ZÞÌþõíŒkqxàÑZX+¯cT(LÚ‡çE§r4dmø1·{Å¢O¿/†qÀ‰S2gCP3ƒš`q†xE<>ÂFåO1ÁÔ…jÆ$ BSÊ‹¤t¶mo¶u¸w¤ÄŸÆÚÕr\5ðA”8n‚&Q„:Èð°š¹rüþ²öõë79Ø<¼Êk^/Øs?™Ž²"“ØV>ã¤Âßè` õl›_DÁ¿ä»‰}%Ǫlc5ãåð±r¦¢X…Yv–#ؤGš¼Î0¦å¹z¦3.ßäNªŒs´J¤Ð*ÌÁ¾©¹·¸!¼NCNÍ# SÜ÷ ︒j‰OE mîÆ¸ÐÖ} ‚f4'DÌ2¬$÷,mÖ»É1<37û—  zŸñ<|ÇJZœ.áHÉŽ˜¢áÙÅ à™lLIYȵ„Ú©¬]¦›| èâ÷â ÊÅ08“I)½žÀ^<¯ÔõU–˜[£³L)‹ÐFAPôeWX©Ü“«½àHµœ‰¤ÏÇËG-rò¸±‹|Ø"3°Œ¹¹‰ºYN®nß}súô©£DGã‰S©ð‘ögzIÀ3_›É# f 9Qa *aÂcå%ŒÄ¯ÌˆÀÃ[Iêpðé”zˆuµÙ3 —úËÅ(1Ž­Ñðr³^¾û…¸®ÙîõÅ7÷«I¾Bm OrPíýÜ?9þt2v@¿xÌV¶‡ÎGΓšÍ¯ûOÎ^~qxö\æs¦w’uvô¾›0¥S-êÈsêhŽØ7Dª ¼ÕðfX ³8¦‡³ˆ3„©HH·ë‹|‚Ó†F·cÖ‘Á€Äk˜×‰îbBôo B¾ùæ:ìåËO~òã?;rpœ!, 6A¢°„¨Òjåó Vl!0ßû+…‰ãÌ r¸Ì¸›æK,Aë1ƒaxÚûÿkéÞvÛ¨¢0×I|ˆ=3¶Ó´rZè ¸ÄCñ2¼À•¸$Z©B%MëÚõ1‰“ðý{b3ïó^çµöÚ!f¡¿à—I%’ ²E&Æ­ž½'µmó1Y94ÔV*°¶ÚÃ%YÈhŽ's@¡WàìÞ&~Ã, m0s¢" eŠn"k¸°¯øà§1ù{,1^'ôØ«°Ê(RÐË1í£cç>±ÿ‘ðdÇLf fΙ Áæ_„H¢ƒÎâ×R©oO`'Ü(HjcpޏFKɆf+• q‚±’@õH !Ó¦?x´3#¤^òœAâ;—ï^û|”üæ[—øŒnÍÔBV†wr¼Ñh-KT‹ªÙ°Î/owKÔO@•£2ÌÝsŒDH(ÓçÛtÒ¡š¼êU³îäl}}tZ ¢:Ÿîy0¾hž½:t,>uâÈa×Þ°î:­CNp¤7œðÖ¸Å9ùƹ LdÕÆ«¢ˆG‘&Ý‘÷@ A‰ã1 rA«ŒÔ;è®±†R¿­•y#C–ýƒœ)ÙVšVI™öâÅ˧өÄ=Ô!Gk-`,èV_;À=ºkÙ‹"'$– ¦zwÅc  a¶®@¬ÎP°? 8~ËÒ !œëCÌ’fÑ}‹¼äóÛû$(÷HË Ñ·ûèFÆ:ÊÊW’°ÛL`sØ ZÆÖ€eãa6ÒˆzH 1ÅÈÍżÀ¼ŠfA,Ëbø­ÈOx `±Hæc5 Û UY„Þ‘byÔ„Í;í*1È{Ÿ4XJ* ±Œ4µ¢ÄI¢¤?}<(ìAù¶®Âà¬o’ˆ¥“¥‡´ltªøgŠýRÆÙl 2¹‘"©7€H’“u~ùù3ª§´ÛÅàDœ ®sR®Ï‘N¿š¡Më[ôÖb9_Ì?5c™‘M‡õ‹ °Ý-¨Ô(-`Æ|Xò’hDÁ¥(šƒòAk<®—W~%ä¶ËgzŠ•†¢±Â¢yÄŽN,&?—, ÞX(…1¦D²îYM"V›»XiìÓÝ[°ÃÊ5BS‘¸±cXެ׋‹Ù )^®ÖnžáŒ<ºÏeG†—ùØ…ÑÏVo`?»ëgg碲,…aØ N}Ctã´‰ÀN_ r„¡¨òbGÂ3 Úèz{ÇmtìØi®4¹uTMH‡ð턪àY:Ô81¶Šà4%t森÷TdܰÉ9x¯ Ý·Û5¾à’D#V¹Z ƆÇô7͸^­–ŸæW³ÙLø¤ÂÁÇõȃÃÞÚÇÆÌ…ü£÷;½Oši¦~Ÿè¾÷ £5þ“°JáüU(øñT“‹ ¬ M»<®[²Z)nØ|8+â2J¦抮YAŠu¿»“àáĉšÍÇ7ŸÞþÞ4_½dÓxÿþòûz÷î_­cN hšÉ|.‰WÌ$‚ÍaÀcвU„z?›ž 4á=qbd¹r‰äÈÁ>3’~½*g3qD]E(¨5¡BŸ?¾™67[¦èÝiVÞl–»Iý\ŠqýÔ$ˆ`µE×Õùу4i_M½yROî÷ŸÝÁ|÷€IÅ×=µ·H.Oärñß³ó³Û½‹7®Ÿð¸ôÜ“þõ`4þãõo$üÙó—2`‘}’«ÛÜî®=Þƒ‡D «±cT›8%öÉQ¶_á¨ô.šÛppBí<<œÈC‰§€èx ꎚØV¬,ĉé9ÕA¹G ÀO ¤¬L´w›Ü[o­4î>Úã¶Ë!tg¬ªeqã*&+ó&Ô^ï¶ô“p1?IbÖ ‹¯A« Œa/&L }âØæšHpþ~“dËZª©ÿÛh'ÚN‹ ‘kÁg…©NR…Æڜ}Ïfi\žg}y ¢´¹¨¨Ëü4àŠq±4¯Š4¦îi¿¢÷²“” ¾{^´‹Í.’ª<&1ðz™³|“õñ&ë£ @Ø6`“9¶ˆ`,* èÅK Z±% ÃߥÙpeZŒÐˆŸBìiÑGÊŠY4-˜i»’ö«Å ßšòê&³ABÍs ’½§T4ÇHÊh¡À°‰Ðb#ÏaÒf¡„°Øÿ JLg`=;IEND®B`‚numptyphysics-0.3.10/external/000077500000000000000000000000001425065123200163545ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/000077500000000000000000000000001425065123200172725ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Clean.bat000066400000000000000000000006421425065123200210060ustar00rootroot00000000000000rem VC8 del Build\VC8\Box2D.ncb del /a:H Build\VC8\Box2D.suo del /s Build\VC8\*.user rmdir /s /q Build\VC8\Box2D rmdir /s /q Build\VC8\TestBed rmdir /s /q Build\VC8\glui rmdir /s /q Build\VC8\freeglut rmdir /s /q Build\VC8\HelloWorld rem Code::Blocks del Library\libEngine.a del Build\CodeBlocks\*.depend del Build\CodeBlocks\*.layout rmdir /s /q Build\CodeBlocks\obj rmdir /s /q Build\CodeBlocks\bin numptyphysics-0.3.10/external/Box2D/Include/000077500000000000000000000000001425065123200206555ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Include/Box2D.h000066400000000000000000000036251425065123200217520ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef BOX2D_H #define BOX2D_H /** \mainpage Box2D API Documentation \section intro_sec Getting Started For tutorials please see http://www.box2d.org/manual.html For discussion please visit http://www.box2d.org/forum */ // These include files constitute the main Box2D API #include "../Source/Common/b2Settings.h" #include "../Source/Collision/Shapes/b2CircleShape.h" #include "../Source/Collision/Shapes/b2PolygonShape.h" #include "../Source/Collision/b2BroadPhase.h" #include "../Source/Dynamics/b2WorldCallbacks.h" #include "../Source/Dynamics/b2World.h" #include "../Source/Dynamics/b2Body.h" #include "../Source/Dynamics/Contacts/b2Contact.h" #include "../Source/Dynamics/Joints/b2DistanceJoint.h" #include "../Source/Dynamics/Joints/b2MouseJoint.h" #include "../Source/Dynamics/Joints/b2PrismaticJoint.h" #include "../Source/Dynamics/Joints/b2RevoluteJoint.h" #include "../Source/Dynamics/Joints/b2PulleyJoint.h" #include "../Source/Dynamics/Joints/b2GearJoint.h" #endif numptyphysics-0.3.10/external/Box2D/License.txt000066400000000000000000000015661425065123200214250ustar00rootroot00000000000000Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. numptyphysics-0.3.10/external/Box2D/Makefile000066400000000000000000000021171425065123200207330ustar00rootroot00000000000000PATCH= box2d_fixed.patch all: (cd Contrib/freeglut; make) (cd Contrib/glui; make) (cd Source; make) (cd Examples/TestBed; make) clean: (cd Contrib/freeglut; make clean) (cd Contrib/glui; make clean) (cd Source; make clean) (cd Examples/TestBed; make clean) patch: svn diff > $(PATCH) # - diff --unified /dev/null Makefile >> $(PATCH) # - diff --unified /dev/null Documentation/latex/Makefile >> $(PATCH) # - diff --unified /dev/null Contrib/freeglut/Makefile >> $(PATCH) # - diff --unified /dev/null Contrib/glui/Makefile >> $(PATCH) # - diff --unified /dev/null Source/Makefile >> $(PATCH) # - diff --unified /dev/null Examples/TestBed/Makefile >> $(PATCH) # - diff --unified /dev/null Source/Common/Fixed.h >> $(PATCH) # - diff --unified /dev/null Source/Common/jtypes.h >> $(PATCH) # - diff --unified /dev/null Source/Contrib/b2Polygon.cpp >> $(PATCH) # - diff --unified /dev/null Source/Contrib/b2Polygon.h >> $(PATCH) # - diff --unified /dev/null Source/Contrib/b2Triangle.cpp >> $(PATCH) # - diff --unified /dev/null Source/Contrib/b2Triangle.h >> $(PATCH) numptyphysics-0.3.10/external/Box2D/Readme.txt000066400000000000000000000012271425065123200212320ustar00rootroot00000000000000Box2D Version 2.0.1 Welcome to Box2D! Box2D is a 2D physics engine for games. For help with Box2D, please visit http://www.box2d.org. There is a forum there where you may post your questions. The project files with this distribution work with Microsoft Visual C++ 2005 and above. You can download MSVC 2008 for free and it includes the necessary Platform SDK. To run the demos, set "Testbed" as your startup project and press F5. Some test bed commands are: - 'r' to reset the current test - SPACE to launch a bomb - arrow keys to pan - 'x' and 'z' to zoom in/out - use the mouse to click and drag objects Erin Catto http://www.box2d.org numptyphysics-0.3.10/external/Box2D/Source/000077500000000000000000000000001425065123200205325ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Source/Collision/000077500000000000000000000000001425065123200224655ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Source/Collision/Shapes/000077500000000000000000000000001425065123200237105ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Source/Collision/Shapes/b2CircleShape.cpp000066400000000000000000000075351425065123200270340ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2CircleShape.h" b2CircleShape::b2CircleShape(const b2ShapeDef* def) : b2Shape(def) { b2Assert(def->type == e_circleShape); const b2CircleDef* circleDef = (const b2CircleDef*)def; m_type = e_circleShape; m_localPosition = circleDef->localPosition; m_radius = circleDef->radius; } void b2CircleShape::UpdateSweepRadius(const b2Vec2& center) { // Update the sweep radius (maximum radius) as measured from // a local center point. b2Vec2 d = m_localPosition - center; m_sweepRadius = d.Length() + m_radius - b2_toiSlop; } bool b2CircleShape::TestPoint(const b2XForm& transform, const b2Vec2& p) const { b2Vec2 center = transform.position + b2Mul(transform.R, m_localPosition); b2Vec2 d = p - center; return b2Dot(d, d) <= m_radius * m_radius; } // Collision Detection in Interactive 3D Environments by Gino van den Bergen // From Section 3.1.2 // x = s + a * r // norm(x) = radius bool b2CircleShape::TestSegment(const b2XForm& transform, float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const { b2Vec2 position = transform.position + b2Mul(transform.R, m_localPosition); b2Vec2 s = segment.p1 - position; float32 b = b2Dot(s, s) - m_radius * m_radius; // Does the segment start inside the circle? if (b < 0.0f) { return false; } // Solve quadratic equation. b2Vec2 r = segment.p2 - segment.p1; float32 c = b2Dot(s, r); float32 rr = b2Dot(r, r); float32 sigma = c * c - rr * b; // Check for negative discriminant and short segment. if (sigma < 0.0f || rr < B2_FLT_EPSILON) { return false; } // Find the point of intersection of the line with the circle. float32 a = -(c + b2Sqrt(sigma)); // Is the intersection point on the segment? if (0.0f <= a && a <= maxLambda * rr) { a /= rr; *lambda = a; *normal = s + a * r; normal->Normalize(); return true; } return false; } void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2XForm& transform) const { b2Vec2 p = transform.position + b2Mul(transform.R, m_localPosition); aabb->lowerBound.Set(p.x - m_radius, p.y - m_radius); aabb->upperBound.Set(p.x + m_radius, p.y + m_radius); } void b2CircleShape::ComputeSweptAABB(b2AABB* aabb, const b2XForm& transform1, const b2XForm& transform2) const { b2Vec2 p1 = transform1.position + b2Mul(transform1.R, m_localPosition); b2Vec2 p2 = transform2.position + b2Mul(transform2.R, m_localPosition); b2Vec2 lower = b2Min(p1, p2); b2Vec2 upper = b2Max(p1, p2); aabb->lowerBound.Set(lower.x - m_radius, lower.y - m_radius); aabb->upperBound.Set(upper.x + m_radius, upper.y + m_radius); } void b2CircleShape::ComputeMass(b2MassData* massData) const { massData->mass = m_density * b2_pi * m_radius * m_radius; massData->center = m_localPosition; // inertia about the local origin massData->I = massData->mass * (0.5f * m_radius * m_radius + b2Dot(m_localPosition, m_localPosition)); } numptyphysics-0.3.10/external/Box2D/Source/Collision/Shapes/b2CircleShape.h000066400000000000000000000047201425065123200264720ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_CIRCLE_SHAPE_H #define B2_CIRCLE_SHAPE_H #include "b2Shape.h" /// This structure is used to build circle shapes. struct b2CircleDef : public b2ShapeDef { b2CircleDef() { type = e_circleShape; localPosition.SetZero(); radius = 1.0f; } b2Vec2 localPosition; float32 radius; }; /// A circle shape. class b2CircleShape : public b2Shape { public: /// @see b2Shape::TestPoint bool TestPoint(const b2XForm& transform, const b2Vec2& p) const; /// @see b2Shape::TestSegment bool TestSegment( const b2XForm& transform, float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const; /// @see b2Shape::ComputeAABB void ComputeAABB(b2AABB* aabb, const b2XForm& transform) const; /// @see b2Shape::ComputeSweptAABB void ComputeSweptAABB( b2AABB* aabb, const b2XForm& transform1, const b2XForm& transform2) const; /// @see b2Shape::ComputeMass void ComputeMass(b2MassData* massData) const; /// Get the local position of this circle in its parent body. const b2Vec2& GetLocalPosition() const; /// Get the radius of this circle. float32 GetRadius() const; private: friend class b2Shape; b2CircleShape(const b2ShapeDef* def); void UpdateSweepRadius(const b2Vec2& center); // Local position in parent body b2Vec2 m_localPosition; float32 m_radius; }; inline const b2Vec2& b2CircleShape::GetLocalPosition() const { return m_localPosition; } inline float32 b2CircleShape::GetRadius() const { return m_radius; } #endif numptyphysics-0.3.10/external/Box2D/Source/Collision/Shapes/b2PolygonShape.cpp000066400000000000000000000275301425065123200272570ustar00rootroot00000000000000 /* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2PolygonShape.h" void b2PolygonDef::SetAsBox(float32 hx, float32 hy) { vertexCount = 4; vertices[0].Set(-hx, -hy); vertices[1].Set( hx, -hy); vertices[2].Set( hx, hy); vertices[3].Set(-hx, hy); } void b2PolygonDef::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle) { SetAsBox(hx, hy); b2XForm xf; xf.position = center; xf.R.Set(angle); for (int32 i = 0; i < vertexCount; ++i) { vertices[i] = b2Mul(xf, vertices[i]); } } static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) { b2Assert(count >= 3); b2Vec2 c; c.Set(0.0f, 0.0f); float32 area = 0.0f; // pRef is the reference point for forming triangles. // It's location doesn't change the result (except for rounding error). b2Vec2 pRef(0.0f, 0.0f); #if 0 // This code would put the reference point inside the polygon. for (int32 i = 0; i < count; ++i) { pRef += vs[i]; } pRef *= 1.0f / count; #endif const float32 inv3 = 1.0f / 3.0f; for (int32 i = 0; i < count; ++i) { // Triangle vertices. b2Vec2 p1 = pRef; b2Vec2 p2 = vs[i]; b2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0]; b2Vec2 e1 = p2 - p1; b2Vec2 e2 = p3 - p1; float32 D = b2Cross(e1, e2); float32 triangleArea = 0.5f * D; area += triangleArea; // Area weighted centroid c += triangleArea * inv3 * (p1 + p2 + p3); } // Centroid b2Assert(area > B2_FLT_EPSILON); c *= 1.0f / area; return c; } // http://www.geometrictools.com/Documentation/MinimumAreaRectangle.pdf static void ComputeOBB(b2OBB* obb, const b2Vec2* vs, int32 count) { b2Assert(count <= b2_maxPolygonVertices); b2Vec2 p[b2_maxPolygonVertices + 1]; for (int32 i = 0; i < count; ++i) { p[i] = vs[i]; } p[count] = p[0]; float32 minArea = B2_FLT_MAX; for (int32 i = 1; i <= count; ++i) { b2Vec2 root = p[i-1]; b2Vec2 ux = p[i] - root; float32 length = ux.Normalize(); b2Assert(length > B2_FLT_EPSILON); b2Vec2 uy(-ux.y, ux.x); b2Vec2 lower(B2_FLT_MAX, B2_FLT_MAX); b2Vec2 upper(-B2_FLT_MAX, -B2_FLT_MAX); for (int32 j = 0; j < count; ++j) { b2Vec2 d = p[j] - root; b2Vec2 r; r.x = b2Dot(ux, d); r.y = b2Dot(uy, d); lower = b2Min(lower, r); upper = b2Max(upper, r); } float32 area = (upper.x - lower.x) * (upper.y - lower.y); if (area < 0.95f * minArea) { minArea = area; obb->R.col1 = ux; obb->R.col2 = uy; b2Vec2 center = 0.5f * (lower + upper); obb->center = root + b2Mul(obb->R, center); obb->extents = 0.5f * (upper - lower); } } b2Assert(minArea < B2_FLT_MAX); } b2PolygonShape::b2PolygonShape(const b2ShapeDef* def) : b2Shape(def) { b2Assert(def->type == e_polygonShape); m_type = e_polygonShape; const b2PolygonDef* poly = (const b2PolygonDef*)def; // Get the vertices transformed into the body frame. m_vertexCount = poly->vertexCount; b2Assert(3 <= m_vertexCount && m_vertexCount <= b2_maxPolygonVertices); // Copy vertices. for (int32 i = 0; i < m_vertexCount; ++i) { m_vertices[i] = poly->vertices[i]; } // Compute normals. Ensure the edges have non-zero length. for (int32 i = 0; i < m_vertexCount; ++i) { int32 i1 = i; int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; b2Assert(edge.LengthSquared() > B2_FLT_EPSILON * B2_FLT_EPSILON); m_normals[i] = b2Cross(edge, 1.0f); m_normals[i].Normalize(); } #ifdef _DEBUG // Ensure the polygon is convex. for (int32 i = 0; i < m_vertexCount; ++i) { for (int32 j = 0; j < m_vertexCount; ++j) { // Don't check vertices on the current edge. if (j == i || j == (i + 1) % m_vertexCount) { continue; } // Your polygon is non-convex (it has an indentation). // Or your polygon is too skinny. float32 s = b2Dot(m_normals[i], m_vertices[j] - m_vertices[i]); b2Assert(s < -b2_linearSlop); } } // Ensure the polygon is counter-clockwise. for (int32 i = 1; i < m_vertexCount; ++i) { float32 cross = b2Cross(m_normals[i-1], m_normals[i]); // Keep asinf happy. cross = b2Clamp(cross, -1.0f, 1.0f); // You have consecutive edges that are almost parallel on your polygon. float32 angle = asinf(cross); b2Assert(angle > b2_angularSlop); } #endif // Compute the polygon centroid. m_centroid = ComputeCentroid(poly->vertices, poly->vertexCount); // Compute the oriented bounding box. ComputeOBB(&m_obb, m_vertices, m_vertexCount); // Create core polygon shape by shifting edges inward. // Also compute the min/max radius for CCD. for (int32 i = 0; i < m_vertexCount; ++i) { int32 i1 = i - 1 >= 0 ? i - 1 : m_vertexCount - 1; int32 i2 = i; b2Vec2 n1 = m_normals[i1]; b2Vec2 n2 = m_normals[i2]; b2Vec2 v = m_vertices[i] - m_centroid;; b2Vec2 d; d.x = b2Dot(n1, v) - b2_toiSlop; d.y = b2Dot(n2, v) - b2_toiSlop; // Shifting the edge inward by b2_toiSlop should // not cause the plane to pass the centroid. // Your shape has a radius/extent less than b2_toiSlop. //TME printf("dx=%f dy=%f\n",(float)d.x,(float)d.y); b2Assert(d.x >= 0.0f); b2Assert(d.y >= 0.0f); b2Mat22 A; A.col1.x = n1.x; A.col2.x = n1.y; A.col1.y = n2.x; A.col2.y = n2.y; m_coreVertices[i] = A.Solve(d) + m_centroid; } } void b2PolygonShape::UpdateSweepRadius(const b2Vec2& center) { // Update the sweep radius (maximum radius) as measured from // a local center point. m_sweepRadius = 0.0f; for (int32 i = 0; i < m_vertexCount; ++i) { b2Vec2 d = m_coreVertices[i] - center; m_sweepRadius = b2Max(m_sweepRadius, d.Length()); } } bool b2PolygonShape::TestPoint(const b2XForm& xf, const b2Vec2& p) const { b2Vec2 pLocal = b2MulT(xf.R, p - xf.position); for (int32 i = 0; i < m_vertexCount; ++i) { float32 dot = b2Dot(m_normals[i], pLocal - m_vertices[i]); if (dot > 0.0f) { return false; } } return true; } bool b2PolygonShape::TestSegment( const b2XForm& xf, float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const { float32 lower = 0.0f, upper = maxLambda; b2Vec2 p1 = b2MulT(xf.R, segment.p1 - xf.position); b2Vec2 p2 = b2MulT(xf.R, segment.p2 - xf.position); b2Vec2 d = p2 - p1; int32 index = -1; for (int32 i = 0; i < m_vertexCount; ++i) { // p = p1 + a * d // dot(normal, p - v) = 0 // dot(normal, p1 - v) + a * dot(normal, d) = 0 float32 numerator = b2Dot(m_normals[i], m_vertices[i] - p1); float32 denominator = b2Dot(m_normals[i], d); // Note: we want this predicate without division: // lower < numerator / denominator, where denominator < 0 // Since denominator < 0, we have to flip the inequality: // lower < numerator / denominator <==> denominator * lower > numerator. if (denominator < 0.0f && numerator < lower * denominator) { // Increase lower. // The segment enters this half-space. lower = numerator / denominator; index = i; } else if (denominator > 0.0f && numerator < upper * denominator) { // Decrease upper. // The segment exits this half-space. upper = numerator / denominator; } if (upper < lower) { return false; } } b2Assert(0.0f <= lower && lower <= maxLambda); if (index >= 0) { *lambda = lower; *normal = b2Mul(xf.R, m_normals[index]); return true; } return false; } void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2XForm& xf) const { b2Mat22 R = b2Mul(xf.R, m_obb.R); b2Mat22 absR = b2Abs(R); b2Vec2 h = b2Mul(absR, m_obb.extents); b2Vec2 position = xf.position + b2Mul(xf.R, m_obb.center); aabb->lowerBound = position - h; aabb->upperBound = position + h; } void b2PolygonShape::ComputeSweptAABB(b2AABB* aabb, const b2XForm& transform1, const b2XForm& transform2) const { b2AABB aabb1, aabb2; ComputeAABB(&aabb1, transform1); ComputeAABB(&aabb2, transform2); aabb->lowerBound = b2Min(aabb1.lowerBound, aabb2.lowerBound); aabb->upperBound = b2Max(aabb1.upperBound, aabb2.upperBound); } void b2PolygonShape::ComputeMass(b2MassData* massData) const { // Polygon mass, centroid, and inertia. // Let rho be the polygon density in mass per unit area. // Then: // mass = rho * int(dA) // centroid.x = (1/mass) * rho * int(x * dA) // centroid.y = (1/mass) * rho * int(y * dA) // I = rho * int((x*x + y*y) * dA) // // We can compute these integrals by summing all the integrals // for each triangle of the polygon. To evaluate the integral // for a single triangle, we make a change of variables to // the (u,v) coordinates of the triangle: // x = x0 + e1x * u + e2x * v // y = y0 + e1y * u + e2y * v // where 0 <= u && 0 <= v && u + v <= 1. // // We integrate u from [0,1-v] and then v from [0,1]. // We also need to use the Jacobian of the transformation: // D = cross(e1, e2) // // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3) // // The rest of the derivation is handled by computer algebra. b2Assert(m_vertexCount >= 3); b2Vec2 center; center.Set(0.0f, 0.0f); float32 area = 0.0f; float32 I = 0.0f; // pRef is the reference point for forming triangles. // It's location doesn't change the result (except for rounding error). b2Vec2 pRef(0.0f, 0.0f); #if 0 // This code would put the reference point inside the polygon. for (int32 i = 0; i < m_vertexCount; ++i) { pRef += m_vertices[i]; } pRef *= 1.0f / count; #endif const float32 k_inv3 = 1.0f / 3.0f; for (int32 i = 0; i < m_vertexCount; ++i) { // Triangle vertices. b2Vec2 p1 = pRef; b2Vec2 p2 = m_vertices[i]; b2Vec2 p3 = i + 1 < m_vertexCount ? m_vertices[i+1] : m_vertices[0]; b2Vec2 e1 = p2 - p1; b2Vec2 e2 = p3 - p1; float32 D = b2Cross(e1, e2); float32 triangleArea = 0.5f * D; area += triangleArea; // Area weighted centroid center += triangleArea * k_inv3 * (p1 + p2 + p3); float32 px = p1.x, py = p1.y; float32 ex1 = e1.x, ey1 = e1.y; float32 ex2 = e2.x, ey2 = e2.y; float32 intx2 = k_inv3 * (0.25f * (ex1*ex1 + ex2*ex1 + ex2*ex2) + (px*ex1 + px*ex2)) + 0.5f*px*px; float32 inty2 = k_inv3 * (0.25f * (ey1*ey1 + ey2*ey1 + ey2*ey2) + (py*ey1 + py*ey2)) + 0.5f*py*py; I += D * (intx2 + inty2); } // Total mass massData->mass = m_density * area; // Center of mass b2Assert(area > B2_FLT_EPSILON); center *= 1.0f / area; massData->center = center; // Inertia tensor relative to the local origin. massData->I = m_density * I; } b2Vec2 b2PolygonShape::Centroid(const b2XForm& xf) const { return b2Mul(xf, m_centroid); } b2Vec2 b2PolygonShape::Support(const b2XForm& xf, const b2Vec2& d) const { b2Vec2 dLocal = b2MulT(xf.R, d); int32 bestIndex = 0; float32 bestValue = b2Dot(m_coreVertices[0], dLocal); for (int32 i = 1; i < m_vertexCount; ++i) { float32 value = b2Dot(m_coreVertices[i], dLocal); if (value > bestValue) { bestIndex = i; bestValue = value; } } return b2Mul(xf, m_coreVertices[bestIndex]); } numptyphysics-0.3.10/external/Box2D/Source/Collision/Shapes/b2PolygonShape.h000066400000000000000000000107771425065123200267310ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_POLYGON_SHAPE_H #define B2_POLYGON_SHAPE_H #include "b2Shape.h" /// Convex polygon. The vertices must be in CCW order for a right-handed /// coordinate system with the z-axis coming out of the screen. struct b2PolygonDef : public b2ShapeDef { b2PolygonDef() { type = e_polygonShape; vertexCount = 0; } /// Build vertices to represent an axis-aligned box. /// @param hx the half-width. /// @param hy the half-height. void SetAsBox(float32 hx, float32 hy); /// Build vertices to represent an oriented box. /// @param hx the half-width. /// @param hy the half-height. /// @param center the center of the box in local coordinates. /// @param angle the rotation of the box in local coordinates. void SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle); /// The polygon vertices in local coordinates. b2Vec2 vertices[b2_maxPolygonVertices]; /// The number of polygon vertices. int32 vertexCount; }; /// A convex polygon. class b2PolygonShape : public b2Shape { public: /// @see b2Shape::TestPoint bool TestPoint(const b2XForm& transform, const b2Vec2& p) const; /// @see b2Shape::TestSegment bool TestSegment( const b2XForm& transform, float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const; /// @see b2Shape::ComputeAABB void ComputeAABB(b2AABB* aabb, const b2XForm& transform) const; /// @see b2Shape::ComputeSweptAABB void ComputeSweptAABB( b2AABB* aabb, const b2XForm& transform1, const b2XForm& transform2) const; /// @see b2Shape::ComputeMass void ComputeMass(b2MassData* massData) const; /// Get the oriented bounding box relative to the parent body. const b2OBB& GetOBB() const; /// Get local centroid relative to the parent body. const b2Vec2& GetCentroid() const; /// Get the vertex count. int32 GetVertexCount() const; /// Get the vertices in local coordinates. const b2Vec2* GetVertices() const; /// Get the core vertices in local coordinates. These vertices /// represent a smaller polygon that is used for time of impact /// computations. const b2Vec2* GetCoreVertices() const; /// Get the edge normal vectors. There is one for each vertex. const b2Vec2* GetNormals() const; /// Get the first vertex and apply the supplied transform. b2Vec2 GetFirstVertex(const b2XForm& xf) const; /// Get the centroid and apply the supplied transform. b2Vec2 Centroid(const b2XForm& xf) const; /// Get the support point in the given world direction. /// Use the supplied transform. b2Vec2 Support(const b2XForm& xf, const b2Vec2& d) const; private: friend class b2Shape; b2PolygonShape(const b2ShapeDef* def); void UpdateSweepRadius(const b2Vec2& center); // Local position of the polygon centroid. b2Vec2 m_centroid; b2OBB m_obb; b2Vec2 m_vertices[b2_maxPolygonVertices]; b2Vec2 m_normals[b2_maxPolygonVertices]; b2Vec2 m_coreVertices[b2_maxPolygonVertices]; int32 m_vertexCount; }; inline b2Vec2 b2PolygonShape::GetFirstVertex(const b2XForm& xf) const { return b2Mul(xf, m_coreVertices[0]); } inline const b2OBB& b2PolygonShape::GetOBB() const { return m_obb; } inline const b2Vec2& b2PolygonShape::GetCentroid() const { return m_centroid; } inline int32 b2PolygonShape::GetVertexCount() const { return m_vertexCount; } inline const b2Vec2* b2PolygonShape::GetVertices() const { return m_vertices; } inline const b2Vec2* b2PolygonShape::GetCoreVertices() const { return m_coreVertices; } inline const b2Vec2* b2PolygonShape::GetNormals() const { return m_normals; } #endif numptyphysics-0.3.10/external/Box2D/Source/Collision/Shapes/b2Shape.cpp000066400000000000000000000072171425065123200257070ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Shape.h" #include "b2CircleShape.h" #include "b2PolygonShape.h" #include "../b2Collision.h" #include "../b2BroadPhase.h" #include "../../Common/b2BlockAllocator.h" #include b2Shape* b2Shape::Create(const b2ShapeDef* def, b2BlockAllocator* allocator) { switch (def->type) { case e_circleShape: { void* mem = allocator->Allocate(sizeof(b2CircleShape)); return new (mem) b2CircleShape(def); } case e_polygonShape: { void* mem = allocator->Allocate(sizeof(b2PolygonShape)); return new (mem) b2PolygonShape(def); } default: b2Assert(false); return NULL; } } void b2Shape::Destroy(b2Shape* s, b2BlockAllocator* allocator) { switch (s->GetType()) { case e_circleShape: s->~b2Shape(); allocator->Free(s, sizeof(b2CircleShape)); break; case e_polygonShape: s->~b2Shape(); allocator->Free(s, sizeof(b2PolygonShape)); break; default: b2Assert(false); } } b2Shape::b2Shape(const b2ShapeDef* def) { m_userData = def->userData; m_friction = def->friction; m_restitution = def->restitution; m_density = def->density; m_body = NULL; m_sweepRadius = 0.0f; m_next = NULL; m_proxyId = b2_nullProxy; m_filter = def->filter; m_isSensor = def->isSensor; } b2Shape::~b2Shape() { b2Assert(m_proxyId == b2_nullProxy); } void b2Shape::CreateProxy(b2BroadPhase* broadPhase, const b2XForm& transform) { b2Assert(m_proxyId == b2_nullProxy); b2AABB aabb; ComputeAABB(&aabb, transform); bool inRange = broadPhase->InRange(aabb); // You are creating a shape outside the world box. b2Assert(inRange); if (inRange) { m_proxyId = broadPhase->CreateProxy(aabb, this); } else { m_proxyId = b2_nullProxy; } } void b2Shape::DestroyProxy(b2BroadPhase* broadPhase) { if (m_proxyId != b2_nullProxy) { broadPhase->DestroyProxy(m_proxyId); m_proxyId = b2_nullProxy; } } bool b2Shape::Synchronize(b2BroadPhase* broadPhase, const b2XForm& transform1, const b2XForm& transform2) { if (m_proxyId == b2_nullProxy) { return false; } // Compute an AABB that covers the swept shape (may miss some rotation effect). b2AABB aabb; ComputeSweptAABB(&aabb, transform1, transform2); if (broadPhase->InRange(aabb)) { broadPhase->MoveProxy(m_proxyId, aabb); return true; } else { return false; } } void b2Shape::RefilterProxy(b2BroadPhase* broadPhase, const b2XForm& transform) { if (m_proxyId == b2_nullProxy) { return; } broadPhase->DestroyProxy(m_proxyId); b2AABB aabb; ComputeAABB(&aabb, transform); bool inRange = broadPhase->InRange(aabb); if (inRange) { m_proxyId = broadPhase->CreateProxy(aabb, this); } else { m_proxyId = b2_nullProxy; } } numptyphysics-0.3.10/external/Box2D/Source/Collision/Shapes/b2Shape.h000066400000000000000000000201371425065123200253500ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_SHAPE_H #define B2_SHAPE_H #include "../../Common/b2Math.h" #include "../b2Collision.h" class b2BlockAllocator; class b2Body; class b2BroadPhase; /// This holds the mass data computed for a shape. struct b2MassData { /// The mass of the shape, usually in kilograms. float32 mass; /// The position of the shape's centroid relative to the shape's origin. b2Vec2 center; /// The rotational inertia of the shape. float32 I; }; /// This holds contact filtering data. struct b2FilterData { /// The collision category bits. Normally you would just set one bit. uint16 categoryBits; /// The collision mask bits. This states the categories that this /// shape would accept for collision. uint16 maskBits; /// Collision groups allow a certain group of objects to never collide (negative) /// or always collide (positive). Zero means no collision group. Non-zero group /// filtering always wins against the mask bits. int16 groupIndex; }; /// The various collision shape types supported by Box2D. enum b2ShapeType { e_unknownShape = -1, e_circleShape, e_polygonShape, e_shapeTypeCount, }; /// A shape definition is used to construct a shape. This class defines an /// abstract shape definition. You can reuse shape definitions safely. struct b2ShapeDef { /// The constructor sets the default shape definition values. b2ShapeDef() { type = e_unknownShape; userData = NULL; friction = 0.2f; restitution = 0.0f; density = 0.0f; filter.categoryBits = 0x0001; filter.maskBits = 0xFFFF; filter.groupIndex = 0; isSensor = false; } virtual ~b2ShapeDef() {} /// Holds the shape type for down-casting. b2ShapeType type; /// Use this to store application specify shape data. void* userData; /// The shape's friction coefficient, usually in the range [0,1]. float32 friction; /// The shape's restitution (elasticity) usually in the range [0,1]. float32 restitution; /// The shape's density, usually in kg/m^2. float32 density; /// A sensor shape collects contact information but never generates a collision /// response. bool isSensor; /// Contact filtering data. b2FilterData filter; }; /// A shape is used for collision detection. Shapes are created in b2World. /// You can use shape for collision detection before they are attached to the world. /// @warning you cannot reuse shapes. class b2Shape { public: /// Get the type of this shape. You can use this to down cast to the concrete shape. /// @return the shape type. b2ShapeType GetType() const; /// Is this shape a sensor (non-solid)? /// @return the true if the shape is a sensor. bool IsSensor() const; /// Set the contact filtering data. You must call b2World::Refilter to correct /// existing contacts/non-contacts. void SetFilterData(const b2FilterData& filter); /// Get the contact filtering data. const b2FilterData& GetFilterData() const; /// Get the parent body of this shape. This is NULL if the shape is not attached. /// @return the parent body. b2Body* GetBody(); /// Get the next shape in the parent body's shape list. /// @return the next shape. b2Shape* GetNext(); /// Get the user data that was assigned in the shape definition. Use this to /// store your application specific data. void* GetUserData(); /// Set the user data. Use this to store your application specific data. void SetUserData(void* data); /// Test a point for containment in this shape. This only works for convex shapes. /// @param xf the shape world transform. /// @param p a point in world coordinates. virtual bool TestPoint(const b2XForm& xf, const b2Vec2& p) const = 0; /// Perform a ray cast against this shape. /// @param xf the shape world transform. /// @param lambda returns the hit fraction. You can use this to compute the contact point /// p = (1 - lambda) * segment.p1 + lambda * segment.p2. /// @param normal returns the normal at the contact point. If there is no intersection, the normal /// is not set. /// @param segment defines the begin and end point of the ray cast. /// @param maxLambda a number typically in the range [0,1]. /// @return true if there was an intersection. virtual bool TestSegment( const b2XForm& xf, float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const = 0; /// Given a transform, compute the associated axis aligned bounding box for this shape. /// @param aabb returns the axis aligned box. /// @param xf the world transform of the shape. virtual void ComputeAABB(b2AABB* aabb, const b2XForm& xf) const = 0; /// Given two transforms, compute the associated swept axis aligned bounding box for this shape. /// @param aabb returns the axis aligned box. /// @param xf1 the starting shape world transform. /// @param xf2 the ending shape world transform. virtual void ComputeSweptAABB( b2AABB* aabb, const b2XForm& xf1, const b2XForm& xf2) const = 0; /// Compute the mass properties of this shape using its dimensions and density. /// The inertia tensor is computed about the local origin, not the centroid. /// @param massData returns the mass data for this shape. virtual void ComputeMass(b2MassData* massData) const = 0; /// Get the maximum radius about the parent body's center of mass. float32 GetSweepRadius() const; /// Get the coefficient of friction. float32 GetFriction() const; /// Get the coefficient of restitution. float32 GetRestitution() const; protected: friend class b2Body; friend class b2World; static b2Shape* Create(const b2ShapeDef* def, b2BlockAllocator* allocator); static void Destroy(b2Shape* shape, b2BlockAllocator* allocator); b2Shape(const b2ShapeDef* def); virtual ~b2Shape(); void CreateProxy(b2BroadPhase* broadPhase, const b2XForm& xf); void DestroyProxy(b2BroadPhase* broadPhase); bool Synchronize(b2BroadPhase* broadPhase, const b2XForm& xf1, const b2XForm& xf2); void RefilterProxy(b2BroadPhase* broadPhase, const b2XForm& xf); virtual void UpdateSweepRadius(const b2Vec2& center) = 0; b2ShapeType m_type; b2Shape* m_next; b2Body* m_body; // Sweep radius relative to the parent body's center of mass. float32 m_sweepRadius; float32 m_density; float32 m_friction; float32 m_restitution; uint16 m_proxyId; b2FilterData m_filter; bool m_isSensor; void* m_userData; }; inline b2ShapeType b2Shape::GetType() const { return m_type; } inline bool b2Shape::IsSensor() const { return m_isSensor; } inline void b2Shape::SetFilterData(const b2FilterData& filter) { m_filter = filter; } inline const b2FilterData& b2Shape::GetFilterData() const { return m_filter; } inline void* b2Shape::GetUserData() { return m_userData; } inline void b2Shape::SetUserData(void* data) { m_userData = data; } inline b2Body* b2Shape::GetBody() { return m_body; } inline b2Shape* b2Shape::GetNext() { return m_next; } inline float32 b2Shape::GetSweepRadius() const { return m_sweepRadius; } inline float32 b2Shape::GetFriction() const { return m_friction; } inline float32 b2Shape::GetRestitution() const { return m_restitution; } #endif numptyphysics-0.3.10/external/Box2D/Source/Collision/b2BroadPhase.cpp000066400000000000000000000424621425065123200254350ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include #include "b2BroadPhase.h" #include // Notes: // - we use bound arrays instead of linked lists for cache coherence. // - we use quantized integral values for fast compares. // - we use short indices rather than pointers to save memory. // - we use a stabbing count for fast overlap queries (less than order N). // - we also use a time stamp on each proxy to speed up the registration of // overlap query results. // - where possible, we compare bound indices instead of values to reduce // cache misses (TODO_ERIN). // - no broadphase is perfect and neither is this one: it is not great for huge // worlds (use a multi-SAP instead), it is not great for large objects. bool b2BroadPhase::s_validate = false; struct b2BoundValues { uint16 lowerValues[2]; uint16 upperValues[2]; }; static int32 BinarySearch(b2Bound* bounds, int32 count, uint16 value) { int32 low = 0; int32 high = count - 1; while (low <= high) { int32 mid = (low + high) >> 1; if (bounds[mid].value > value) { high = mid - 1; } else if (bounds[mid].value < value) { low = mid + 1; } else { return (uint16)mid; } } return low; } b2BroadPhase::b2BroadPhase(const b2AABB& worldAABB, b2PairCallback* callback) { m_pairManager.Initialize(this, callback); b2Assert(worldAABB.IsValid()); m_worldAABB = worldAABB; m_proxyCount = 0; b2Vec2 d = worldAABB.upperBound - worldAABB.lowerBound; m_quantizationFactor.x = float32(B2BROADPHASE_MAX) / d.x; m_quantizationFactor.y = float32(B2BROADPHASE_MAX) / d.y; for (uint16 i = 0; i < b2_maxProxies - 1; ++i) { m_proxyPool[i].SetNext(i + 1); m_proxyPool[i].timeStamp = 0; m_proxyPool[i].overlapCount = b2_invalid; m_proxyPool[i].userData = NULL; } m_proxyPool[b2_maxProxies-1].SetNext(b2_nullProxy); m_proxyPool[b2_maxProxies-1].timeStamp = 0; m_proxyPool[b2_maxProxies-1].overlapCount = b2_invalid; m_proxyPool[b2_maxProxies-1].userData = NULL; m_freeProxy = 0; m_timeStamp = 1; m_queryResultCount = 0; } b2BroadPhase::~b2BroadPhase() { } // This one is only used for validation. bool b2BroadPhase::TestOverlap(b2Proxy* p1, b2Proxy* p2) { for (int32 axis = 0; axis < 2; ++axis) { b2Bound* bounds = m_bounds[axis]; b2Assert(p1->lowerBounds[axis] < 2 * m_proxyCount); b2Assert(p1->upperBounds[axis] < 2 * m_proxyCount); b2Assert(p2->lowerBounds[axis] < 2 * m_proxyCount); b2Assert(p2->upperBounds[axis] < 2 * m_proxyCount); if (bounds[p1->lowerBounds[axis]].value > bounds[p2->upperBounds[axis]].value) return false; if (bounds[p1->upperBounds[axis]].value < bounds[p2->lowerBounds[axis]].value) return false; } return true; } bool b2BroadPhase::TestOverlap(const b2BoundValues& b, b2Proxy* p) { for (int32 axis = 0; axis < 2; ++axis) { b2Bound* bounds = m_bounds[axis]; b2Assert(p->lowerBounds[axis] < 2 * m_proxyCount); b2Assert(p->upperBounds[axis] < 2 * m_proxyCount); if (b.lowerValues[axis] > bounds[p->upperBounds[axis]].value) return false; if (b.upperValues[axis] < bounds[p->lowerBounds[axis]].value) return false; } return true; } void b2BroadPhase::ComputeBounds(uint16* lowerValues, uint16* upperValues, const b2AABB& aabb) { b2Assert(aabb.upperBound.x > aabb.lowerBound.x); b2Assert(aabb.upperBound.y > aabb.lowerBound.y); b2Vec2 minVertex = b2Clamp(aabb.lowerBound, m_worldAABB.lowerBound, m_worldAABB.upperBound); b2Vec2 maxVertex = b2Clamp(aabb.upperBound, m_worldAABB.lowerBound, m_worldAABB.upperBound); // Bump lower bounds downs and upper bounds up. This ensures correct sorting of // lower/upper bounds that would have equal values. // TODO_ERIN implement fast float to uint16 conversion. lowerValues[0] = (uint16)(m_quantizationFactor.x * (minVertex.x - m_worldAABB.lowerBound.x)) & (B2BROADPHASE_MAX - 1); upperValues[0] = (uint16)(m_quantizationFactor.x * (maxVertex.x - m_worldAABB.lowerBound.x)) | 1; lowerValues[1] = (uint16)(m_quantizationFactor.y * (minVertex.y - m_worldAABB.lowerBound.y)) & (B2BROADPHASE_MAX - 1); upperValues[1] = (uint16)(m_quantizationFactor.y * (maxVertex.y - m_worldAABB.lowerBound.y)) | 1; } void b2BroadPhase::IncrementTimeStamp() { if (m_timeStamp == B2BROADPHASE_MAX) { for (uint16 i = 0; i < b2_maxProxies; ++i) { m_proxyPool[i].timeStamp = 0; } m_timeStamp = 1; } else { ++m_timeStamp; } } void b2BroadPhase::IncrementOverlapCount(int32 proxyId) { b2Proxy* proxy = m_proxyPool + proxyId; if (proxy->timeStamp < m_timeStamp) { proxy->timeStamp = m_timeStamp; proxy->overlapCount = 1; } else { proxy->overlapCount = 2; b2Assert(m_queryResultCount < b2_maxProxies); m_queryResults[m_queryResultCount] = (uint16)proxyId; ++m_queryResultCount; } } void b2BroadPhase::Query(int32* lowerQueryOut, int32* upperQueryOut, uint16 lowerValue, uint16 upperValue, b2Bound* bounds, int32 boundCount, int32 axis) { int32 lowerQuery = BinarySearch(bounds, boundCount, lowerValue); int32 upperQuery = BinarySearch(bounds, boundCount, upperValue); // Easy case: lowerQuery <= lowerIndex(i) < upperQuery // Solution: search query range for min bounds. for (int32 i = lowerQuery; i < upperQuery; ++i) { if (bounds[i].IsLower()) { IncrementOverlapCount(bounds[i].proxyId); } } // Hard case: lowerIndex(i) < lowerQuery < upperIndex(i) // Solution: use the stabbing count to search down the bound array. if (lowerQuery > 0) { int32 i = lowerQuery - 1; int32 s = bounds[i].stabbingCount; // Find the s overlaps. while (s) { b2Assert(i >= 0); if (bounds[i].IsLower()) { b2Proxy* proxy = m_proxyPool + bounds[i].proxyId; if (lowerQuery <= proxy->upperBounds[axis]) { IncrementOverlapCount(bounds[i].proxyId); --s; } } --i; } } *lowerQueryOut = lowerQuery; *upperQueryOut = upperQuery; } uint16 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData) { b2Assert(m_proxyCount < b2_maxProxies); b2Assert(m_freeProxy != b2_nullProxy); uint16 proxyId = m_freeProxy; b2Proxy* proxy = m_proxyPool + proxyId; m_freeProxy = proxy->GetNext(); proxy->overlapCount = 0; proxy->userData = userData; int32 boundCount = 2 * m_proxyCount; uint16 lowerValues[2], upperValues[2]; ComputeBounds(lowerValues, upperValues, aabb); for (int32 axis = 0; axis < 2; ++axis) { b2Bound* bounds = m_bounds[axis]; int32 lowerIndex, upperIndex; Query(&lowerIndex, &upperIndex, lowerValues[axis], upperValues[axis], bounds, boundCount, axis); memmove(bounds + upperIndex + 2, bounds + upperIndex, (boundCount - upperIndex) * sizeof(b2Bound)); memmove(bounds + lowerIndex + 1, bounds + lowerIndex, (upperIndex - lowerIndex) * sizeof(b2Bound)); // The upper index has increased because of the lower bound insertion. ++upperIndex; // Copy in the new bounds. bounds[lowerIndex].value = lowerValues[axis]; bounds[lowerIndex].proxyId = proxyId; bounds[upperIndex].value = upperValues[axis]; bounds[upperIndex].proxyId = proxyId; bounds[lowerIndex].stabbingCount = lowerIndex == 0 ? 0 : bounds[lowerIndex-1].stabbingCount; bounds[upperIndex].stabbingCount = bounds[upperIndex-1].stabbingCount; // Adjust the stabbing count between the new bounds. for (int32 index = lowerIndex; index < upperIndex; ++index) { ++bounds[index].stabbingCount; } // Adjust the all the affected bound indices. for (int32 index = lowerIndex; index < boundCount + 2; ++index) { b2Proxy* proxy = m_proxyPool + bounds[index].proxyId; if (bounds[index].IsLower()) { proxy->lowerBounds[axis] = (uint16)index; } else { proxy->upperBounds[axis] = (uint16)index; } } } ++m_proxyCount; b2Assert(m_queryResultCount < b2_maxProxies); // Create pairs if the AABB is in range. for (int32 i = 0; i < m_queryResultCount; ++i) { b2Assert(m_queryResults[i] < b2_maxProxies); b2Assert(m_proxyPool[m_queryResults[i]].IsValid()); m_pairManager.AddBufferedPair(proxyId, m_queryResults[i]); } m_pairManager.Commit(); if (s_validate) { Validate(); } // Prepare for next query. m_queryResultCount = 0; IncrementTimeStamp(); return proxyId; } void b2BroadPhase::DestroyProxy(int32 proxyId) { b2Assert(0 < m_proxyCount && m_proxyCount <= b2_maxProxies); b2Proxy* proxy = m_proxyPool + proxyId; b2Assert(proxy->IsValid()); int32 boundCount = 2 * m_proxyCount; for (int32 axis = 0; axis < 2; ++axis) { b2Bound* bounds = m_bounds[axis]; int32 lowerIndex = proxy->lowerBounds[axis]; int32 upperIndex = proxy->upperBounds[axis]; uint16 lowerValue = bounds[lowerIndex].value; uint16 upperValue = bounds[upperIndex].value; memmove(bounds + lowerIndex, bounds + lowerIndex + 1, (upperIndex - lowerIndex - 1) * sizeof(b2Bound)); memmove(bounds + upperIndex-1, bounds + upperIndex + 1, (boundCount - upperIndex - 1) * sizeof(b2Bound)); // Fix bound indices. for (int32 index = lowerIndex; index < boundCount - 2; ++index) { b2Proxy* proxy = m_proxyPool + bounds[index].proxyId; if (bounds[index].IsLower()) { proxy->lowerBounds[axis] = (uint16)index; } else { proxy->upperBounds[axis] = (uint16)index; } } // Fix stabbing count. for (int32 index = lowerIndex; index < upperIndex - 1; ++index) { --bounds[index].stabbingCount; } // Query for pairs to be removed. lowerIndex and upperIndex are not needed. Query(&lowerIndex, &upperIndex, lowerValue, upperValue, bounds, boundCount - 2, axis); } b2Assert(m_queryResultCount < b2_maxProxies); for (int32 i = 0; i < m_queryResultCount; ++i) { b2Assert(m_proxyPool[m_queryResults[i]].IsValid()); m_pairManager.RemoveBufferedPair(proxyId, m_queryResults[i]); } m_pairManager.Commit(); // Prepare for next query. m_queryResultCount = 0; IncrementTimeStamp(); // Return the proxy to the pool. proxy->userData = NULL; proxy->overlapCount = b2_invalid; proxy->lowerBounds[0] = b2_invalid; proxy->lowerBounds[1] = b2_invalid; proxy->upperBounds[0] = b2_invalid; proxy->upperBounds[1] = b2_invalid; proxy->SetNext(m_freeProxy); m_freeProxy = (uint16)proxyId; --m_proxyCount; if (s_validate) { Validate(); } } void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb) { if (proxyId == b2_nullProxy || b2_maxProxies <= proxyId) { b2Assert(false); return; } if (aabb.IsValid() == false) { b2Assert(false); return; } int32 boundCount = 2 * m_proxyCount; b2Proxy* proxy = m_proxyPool + proxyId; // Get new bound values b2BoundValues newValues; ComputeBounds(newValues.lowerValues, newValues.upperValues, aabb); // Get old bound values b2BoundValues oldValues; for (int32 axis = 0; axis < 2; ++axis) { oldValues.lowerValues[axis] = m_bounds[axis][proxy->lowerBounds[axis]].value; oldValues.upperValues[axis] = m_bounds[axis][proxy->upperBounds[axis]].value; } for (int32 axis = 0; axis < 2; ++axis) { b2Bound* bounds = m_bounds[axis]; int32 lowerIndex = proxy->lowerBounds[axis]; int32 upperIndex = proxy->upperBounds[axis]; uint16 lowerValue = newValues.lowerValues[axis]; uint16 upperValue = newValues.upperValues[axis]; int32 deltaLower = lowerValue - bounds[lowerIndex].value; int32 deltaUpper = upperValue - bounds[upperIndex].value; bounds[lowerIndex].value = lowerValue; bounds[upperIndex].value = upperValue; // // Expanding adds overlaps // // Should we move the lower bound down? if (deltaLower < 0) { int32 index = lowerIndex; while (index > 0 && lowerValue < bounds[index-1].value) { b2Bound* bound = bounds + index; b2Bound* prevBound = bound - 1; int32 prevProxyId = prevBound->proxyId; b2Proxy* prevProxy = m_proxyPool + prevBound->proxyId; ++prevBound->stabbingCount; if (prevBound->IsUpper() == true) { if (TestOverlap(newValues, prevProxy)) { m_pairManager.AddBufferedPair(proxyId, prevProxyId); } ++prevProxy->upperBounds[axis]; ++bound->stabbingCount; } else { ++prevProxy->lowerBounds[axis]; --bound->stabbingCount; } --proxy->lowerBounds[axis]; b2Swap(*bound, *prevBound); --index; } } // Should we move the upper bound up? if (deltaUpper > 0) { int32 index = upperIndex; while (index < boundCount-1 && bounds[index+1].value <= upperValue) { b2Bound* bound = bounds + index; b2Bound* nextBound = bound + 1; int32 nextProxyId = nextBound->proxyId; b2Proxy* nextProxy = m_proxyPool + nextProxyId; ++nextBound->stabbingCount; if (nextBound->IsLower() == true) { if (TestOverlap(newValues, nextProxy)) { m_pairManager.AddBufferedPair(proxyId, nextProxyId); } --nextProxy->lowerBounds[axis]; ++bound->stabbingCount; } else { --nextProxy->upperBounds[axis]; --bound->stabbingCount; } ++proxy->upperBounds[axis]; b2Swap(*bound, *nextBound); ++index; } } // // Shrinking removes overlaps // // Should we move the lower bound up? if (deltaLower > 0) { int32 index = lowerIndex; while (index < boundCount-1 && bounds[index+1].value <= lowerValue) { b2Bound* bound = bounds + index; b2Bound* nextBound = bound + 1; int32 nextProxyId = nextBound->proxyId; b2Proxy* nextProxy = m_proxyPool + nextProxyId; --nextBound->stabbingCount; if (nextBound->IsUpper()) { if (TestOverlap(oldValues, nextProxy)) { m_pairManager.RemoveBufferedPair(proxyId, nextProxyId); } --nextProxy->upperBounds[axis]; --bound->stabbingCount; } else { --nextProxy->lowerBounds[axis]; ++bound->stabbingCount; } ++proxy->lowerBounds[axis]; b2Swap(*bound, *nextBound); ++index; } } // Should we move the upper bound down? if (deltaUpper < 0) { int32 index = upperIndex; while (index > 0 && upperValue < bounds[index-1].value) { b2Bound* bound = bounds + index; b2Bound* prevBound = bound - 1; int32 prevProxyId = prevBound->proxyId; b2Proxy* prevProxy = m_proxyPool + prevProxyId; --prevBound->stabbingCount; if (prevBound->IsLower() == true) { if (TestOverlap(oldValues, prevProxy)) { m_pairManager.RemoveBufferedPair(proxyId, prevProxyId); } ++prevProxy->lowerBounds[axis]; --bound->stabbingCount; } else { ++prevProxy->upperBounds[axis]; ++bound->stabbingCount; } --proxy->upperBounds[axis]; b2Swap(*bound, *prevBound); --index; } } } if (s_validate) { Validate(); } } void b2BroadPhase::Commit() { m_pairManager.Commit(); } int32 b2BroadPhase::Query(const b2AABB& aabb, void** userData, int32 maxCount) { uint16 lowerValues[2]; uint16 upperValues[2]; ComputeBounds(lowerValues, upperValues, aabb); int32 lowerIndex, upperIndex; Query(&lowerIndex, &upperIndex, lowerValues[0], upperValues[0], m_bounds[0], 2*m_proxyCount, 0); Query(&lowerIndex, &upperIndex, lowerValues[1], upperValues[1], m_bounds[1], 2*m_proxyCount, 1); b2Assert(m_queryResultCount < b2_maxProxies); int32 count = 0; for (int32 i = 0; i < m_queryResultCount && count < maxCount; ++i, ++count) { b2Assert(m_queryResults[i] < b2_maxProxies); b2Proxy* proxy = m_proxyPool + m_queryResults[i]; b2Assert(proxy->IsValid()); userData[i] = proxy->userData; } // Prepare for next query. m_queryResultCount = 0; IncrementTimeStamp(); return count; } void b2BroadPhase::Validate() { for (int32 axis = 0; axis < 2; ++axis) { b2Bound* bounds = m_bounds[axis]; int32 boundCount = 2 * m_proxyCount; uint16 stabbingCount = 0; for (int32 i = 0; i < boundCount; ++i) { b2Bound* bound = bounds + i; b2Assert(i == 0 || bounds[i-1].value <= bound->value); b2Assert(bound->proxyId != b2_nullProxy); b2Assert(m_proxyPool[bound->proxyId].IsValid()); if (bound->IsLower() == true) { b2Assert(m_proxyPool[bound->proxyId].lowerBounds[axis] == i); ++stabbingCount; } else { b2Assert(m_proxyPool[bound->proxyId].upperBounds[axis] == i); --stabbingCount; } b2Assert(bound->stabbingCount == stabbingCount); } } } numptyphysics-0.3.10/external/Box2D/Source/Collision/b2BroadPhase.h000066400000000000000000000103771425065123200251020ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_BROAD_PHASE_H #define B2_BROAD_PHASE_H /* This broad phase uses the Sweep and Prune algorithm as described in: Collision Detection in Interactive 3D Environments by Gino van den Bergen Also, some ideas, such as using integral values for fast compares comes from Bullet (http:/www.bulletphysics.com). */ #include "../Common/b2Settings.h" #include "b2Collision.h" #include "b2PairManager.h" #include #ifdef TARGET_FLOAT32_IS_FIXED #define B2BROADPHASE_MAX (USHRT_MAX/2) #else #define B2BROADPHASE_MAX USHRT_MAX #endif const uint16 b2_invalid = B2BROADPHASE_MAX; const uint16 b2_nullEdge = B2BROADPHASE_MAX; struct b2BoundValues; struct b2Bound { bool IsLower() const { return (value & 1) == 0; } bool IsUpper() const { return (value & 1) == 1; } uint16 value; uint16 proxyId; uint16 stabbingCount; }; struct b2Proxy { uint16 GetNext() const { return lowerBounds[0]; } void SetNext(uint16 next) { lowerBounds[0] = next; } bool IsValid() const { return overlapCount != b2_invalid; } uint16 lowerBounds[2], upperBounds[2]; uint16 overlapCount; uint16 timeStamp; void* userData; }; class b2BroadPhase { public: b2BroadPhase(const b2AABB& worldAABB, b2PairCallback* callback); ~b2BroadPhase(); // Use this to see if your proxy is in range. If it is not in range, // it should be destroyed. Otherwise you may get O(m^2) pairs, where m // is the number of proxies that are out of range. bool InRange(const b2AABB& aabb) const; // Create and destroy proxies. These call Flush first. uint16 CreateProxy(const b2AABB& aabb, void* userData); void DestroyProxy(int32 proxyId); // Call MoveProxy as many times as you like, then when you are done // call Commit to finalized the proxy pairs (for your time step). void MoveProxy(int32 proxyId, const b2AABB& aabb); void Commit(); // Get a single proxy. Returns NULL if the id is invalid. b2Proxy* GetProxy(int32 proxyId); // Query an AABB for overlapping proxies, returns the user data and // the count, up to the supplied maximum count. int32 Query(const b2AABB& aabb, void** userData, int32 maxCount); void Validate(); void ValidatePairs(); private: void ComputeBounds(uint16* lowerValues, uint16* upperValues, const b2AABB& aabb); bool TestOverlap(b2Proxy* p1, b2Proxy* p2); bool TestOverlap(const b2BoundValues& b, b2Proxy* p); void Query(int32* lowerIndex, int32* upperIndex, uint16 lowerValue, uint16 upperValue, b2Bound* bounds, int32 boundCount, int32 axis); void IncrementOverlapCount(int32 proxyId); void IncrementTimeStamp(); public: friend class b2PairManager; b2PairManager m_pairManager; b2Proxy m_proxyPool[b2_maxProxies]; uint16 m_freeProxy; b2Bound m_bounds[2][2*b2_maxProxies]; uint16 m_queryResults[b2_maxProxies]; int32 m_queryResultCount; b2AABB m_worldAABB; b2Vec2 m_quantizationFactor; int32 m_proxyCount; uint16 m_timeStamp; static bool s_validate; }; inline bool b2BroadPhase::InRange(const b2AABB& aabb) const { b2Vec2 d = b2Max(aabb.lowerBound - m_worldAABB.upperBound, m_worldAABB.lowerBound - aabb.upperBound); return b2Max(d.x, d.y) < 0.0f; } inline b2Proxy* b2BroadPhase::GetProxy(int32 proxyId) { if (proxyId == b2_nullProxy || m_proxyPool[proxyId].IsValid() == false) { return NULL; } return m_proxyPool + proxyId; } #endif numptyphysics-0.3.10/external/Box2D/Source/Collision/b2CollideCircle.cpp000066400000000000000000000120141425065123200261100ustar00rootroot00000000000000/* * Copyright (c) 2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Collision.h" #include "Shapes/b2CircleShape.h" #include "Shapes/b2PolygonShape.h" void b2CollideCircles( b2Manifold* manifold, const b2CircleShape* circle1, const b2XForm& xf1, const b2CircleShape* circle2, const b2XForm& xf2) { manifold->pointCount = 0; b2Vec2 p1 = b2Mul(xf1, circle1->GetLocalPosition()); b2Vec2 p2 = b2Mul(xf2, circle2->GetLocalPosition()); b2Vec2 d = p2 - p1; float32 distSqr = b2Dot(d, d); float32 r1 = circle1->GetRadius(); float32 r2 = circle2->GetRadius(); float32 radiusSum = r1 + r2; if (distSqr > radiusSum * radiusSum) { return; } float32 separation; if (distSqr < B2_FLT_EPSILON) { separation = -radiusSum; manifold->normal.Set(0.0f, 1.0f); } else { float32 dist = b2Sqrt(distSqr); separation = dist - radiusSum; float32 a = 1.0f / dist; manifold->normal.x = a * d.x; manifold->normal.y = a * d.y; } manifold->pointCount = 1; manifold->points[0].id.key = 0; manifold->points[0].separation = separation; p1 += r1 * manifold->normal; p2 -= r2 * manifold->normal; b2Vec2 p = 0.5f * (p1 + p2); manifold->points[0].localPoint1 = b2MulT(xf1, p); manifold->points[0].localPoint2 = b2MulT(xf2, p); } void b2CollidePolygonAndCircle( b2Manifold* manifold, const b2PolygonShape* polygon, const b2XForm& xf1, const b2CircleShape* circle, const b2XForm& xf2) { manifold->pointCount = 0; // Compute circle position in the frame of the polygon. b2Vec2 c = b2Mul(xf2, circle->GetLocalPosition()); b2Vec2 cLocal = b2MulT(xf1, c); // Find the min separating edge. int32 normalIndex = 0; float32 separation = -B2_FLT_MAX; float32 radius = circle->GetRadius(); int32 vertexCount = polygon->GetVertexCount(); const b2Vec2* vertices = polygon->GetVertices(); const b2Vec2* normals = polygon->GetNormals(); for (int32 i = 0; i < vertexCount; ++i) { float32 s = b2Dot(normals[i], cLocal - vertices[i]); if (s > radius) { // Early out. return; } if (s > separation) { separation = s; normalIndex = i; } } // If the center is inside the polygon ... if (separation < B2_FLT_EPSILON) { manifold->pointCount = 1; manifold->normal = b2Mul(xf1.R, normals[normalIndex]); manifold->points[0].id.features.incidentEdge = (uint8)normalIndex; manifold->points[0].id.features.incidentVertex = b2_nullFeature; manifold->points[0].id.features.referenceEdge = 0; manifold->points[0].id.features.flip = 0; b2Vec2 position = c - radius * manifold->normal; manifold->points[0].localPoint1 = b2MulT(xf1, position); manifold->points[0].localPoint2 = b2MulT(xf2, position); manifold->points[0].separation = separation - radius; return; } // Project the circle center onto the edge segment. int32 vertIndex1 = normalIndex; int32 vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; b2Vec2 e = vertices[vertIndex2] - vertices[vertIndex1]; float32 length = e.Normalize(); b2Assert(length > B2_FLT_EPSILON); // Project the center onto the edge. float32 u = b2Dot(cLocal - vertices[vertIndex1], e); b2Vec2 p; if (u <= 0.0f) { p = vertices[vertIndex1]; manifold->points[0].id.features.incidentEdge = b2_nullFeature; manifold->points[0].id.features.incidentVertex = (uint8)vertIndex1; } else if (u >= length) { p = vertices[vertIndex2]; manifold->points[0].id.features.incidentEdge = b2_nullFeature; manifold->points[0].id.features.incidentVertex = (uint8)vertIndex2; } else { p = vertices[vertIndex1] + u * e; manifold->points[0].id.features.incidentEdge = (uint8)normalIndex; manifold->points[0].id.features.incidentVertex = 0; } b2Vec2 d = cLocal - p; float32 dist = d.Normalize(); if (dist > radius) { return; } manifold->pointCount = 1; manifold->normal = b2Mul(xf1.R, d); b2Vec2 position = c - radius * manifold->normal; manifold->points[0].localPoint1 = b2MulT(xf1, position); manifold->points[0].localPoint2 = b2MulT(xf2, position); manifold->points[0].separation = dist - radius; manifold->points[0].id.features.referenceEdge = 0; manifold->points[0].id.features.flip = 0; } numptyphysics-0.3.10/external/Box2D/Source/Collision/b2CollidePoly.cpp000066400000000000000000000226221425065123200256400ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Collision.h" #include "Shapes/b2PolygonShape.h" struct ClipVertex { b2Vec2 v; b2ContactID id; }; static int32 ClipSegmentToLine(ClipVertex vOut[2], ClipVertex vIn[2], const b2Vec2& normal, float32 offset) { // Start with no output points int32 numOut = 0; // Calculate the distance of end points to the line float32 distance0 = b2Dot(normal, vIn[0].v) - offset; float32 distance1 = b2Dot(normal, vIn[1].v) - offset; // If the points are behind the plane if (distance0 <= 0.0f) vOut[numOut++] = vIn[0]; if (distance1 <= 0.0f) vOut[numOut++] = vIn[1]; // If the points are on different sides of the plane if (distance0 * distance1 < 0.0f) { // Find intersection point of edge and plane float32 interp = distance0 / (distance0 - distance1); vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v); if (distance0 > 0.0f) { vOut[numOut].id = vIn[0].id; } else { vOut[numOut].id = vIn[1].id; } ++numOut; } return numOut; } // Find the separation between poly1 and poly2 for a give edge normal on poly1. static float32 EdgeSeparation(const b2PolygonShape* poly1, const b2XForm& xf1, int32 edge1, const b2PolygonShape* poly2, const b2XForm& xf2) { int32 count1 = poly1->GetVertexCount(); const b2Vec2* vertices1 = poly1->GetVertices(); const b2Vec2* normals1 = poly1->GetNormals(); int32 count2 = poly2->GetVertexCount(); const b2Vec2* vertices2 = poly2->GetVertices(); b2Assert(0 <= edge1 && edge1 < count1); // Convert normal from poly1's frame into poly2's frame. b2Vec2 normal1World = b2Mul(xf1.R, normals1[edge1]); b2Vec2 normal1 = b2MulT(xf2.R, normal1World); // Find support vertex on poly2 for -normal. int32 index = 0; float32 minDot = B2_FLT_MAX; for (int32 i = 0; i < count2; ++i) { float32 dot = b2Dot(vertices2[i], normal1); if (dot < minDot) { minDot = dot; index = i; } } b2Vec2 v1 = b2Mul(xf1, vertices1[edge1]); b2Vec2 v2 = b2Mul(xf2, vertices2[index]); float32 separation = b2Dot(v2 - v1, normal1World); return separation; } // Find the max separation between poly1 and poly2 using edge normals from poly1. static float32 FindMaxSeparation(int32* edgeIndex, const b2PolygonShape* poly1, const b2XForm& xf1, const b2PolygonShape* poly2, const b2XForm& xf2) { int32 count1 = poly1->GetVertexCount(); const b2Vec2* normals1 = poly1->GetNormals(); // Vector pointing from the centroid of poly1 to the centroid of poly2. b2Vec2 d = b2Mul(xf2, poly2->GetCentroid()) - b2Mul(xf1, poly1->GetCentroid()); b2Vec2 dLocal1 = b2MulT(xf1.R, d); // Find edge normal on poly1 that has the largest projection onto d. int32 edge = 0; float32 maxDot = -B2_FLT_MAX; for (int32 i = 0; i < count1; ++i) { float32 dot = b2Dot(normals1[i], dLocal1); if (dot > maxDot) { maxDot = dot; edge = i; } } // Get the separation for the edge normal. float32 s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); if (s > 0.0f) { return s; } // Check the separation for the previous edge normal. int32 prevEdge = edge - 1 >= 0 ? edge - 1 : count1 - 1; float32 sPrev = EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2); if (sPrev > 0.0f) { return sPrev; } // Check the separation for the next edge normal. int32 nextEdge = edge + 1 < count1 ? edge + 1 : 0; float32 sNext = EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2); if (sNext > 0.0f) { return sNext; } // Find the best edge and the search direction. int32 bestEdge; float32 bestSeparation; int32 increment; if (sPrev > s && sPrev > sNext) { increment = -1; bestEdge = prevEdge; bestSeparation = sPrev; } else if (sNext > s) { increment = 1; bestEdge = nextEdge; bestSeparation = sNext; } else { *edgeIndex = edge; return s; } // Perform a local search for the best edge normal. for ( ; ; ) { if (increment == -1) edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1; else edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0; s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); if (s > 0.0f) { return s; } if (s > bestSeparation) { bestEdge = edge; bestSeparation = s; } else { break; } } *edgeIndex = bestEdge; return bestSeparation; } static void FindIncidentEdge(ClipVertex c[2], const b2PolygonShape* poly1, const b2XForm& xf1, int32 edge1, const b2PolygonShape* poly2, const b2XForm& xf2) { int32 count1 = poly1->GetVertexCount(); const b2Vec2* normals1 = poly1->GetNormals(); int32 count2 = poly2->GetVertexCount(); const b2Vec2* vertices2 = poly2->GetVertices(); const b2Vec2* normals2 = poly2->GetNormals(); b2Assert(0 <= edge1 && edge1 < count1); // Get the normal of the reference edge in poly2's frame. b2Vec2 normal1 = b2MulT(xf2.R, b2Mul(xf1.R, normals1[edge1])); // Find the incident edge on poly2. int32 index = 0; float32 minDot = B2_FLT_MAX; for (int32 i = 0; i < count2; ++i) { float32 dot = b2Dot(normal1, normals2[i]); if (dot < minDot) { minDot = dot; index = i; } } // Build the clip vertices for the incident edge. int32 i1 = index; int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0; c[0].v = b2Mul(xf2, vertices2[i1]); c[0].id.features.referenceEdge = (uint8)edge1; c[0].id.features.incidentEdge = (uint8)i1; c[0].id.features.incidentVertex = 0; c[1].v = b2Mul(xf2, vertices2[i2]); c[1].id.features.referenceEdge = (uint8)edge1; c[1].id.features.incidentEdge = (uint8)i2; c[1].id.features.incidentVertex = 1; } // Find edge normal of max separation on A - return if separating axis is found // Find edge normal of max separation on B - return if separation axis is found // Choose reference edge as min(minA, minB) // Find incident edge // Clip // The normal points from 1 to 2 void b2CollidePolygons(b2Manifold* manifold, const b2PolygonShape* polyA, const b2XForm& xfA, const b2PolygonShape* polyB, const b2XForm& xfB) { manifold->pointCount = 0; int32 edgeA = 0; float32 separationA = FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB); if (separationA > 0.0f) return; int32 edgeB = 0; float32 separationB = FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA); if (separationB > 0.0f) return; const b2PolygonShape* poly1; // reference poly const b2PolygonShape* poly2; // incident poly b2XForm xf1, xf2; int32 edge1; // reference edge uint8 flip; const float32 k_relativeTol = 0.98f; const float32 k_absoluteTol = 0.001f; // TODO_ERIN use "radius" of poly for absolute tolerance. if (separationB > k_relativeTol * separationA + k_absoluteTol) { poly1 = polyB; poly2 = polyA; xf1 = xfB; xf2 = xfA; edge1 = edgeB; flip = 1; } else { poly1 = polyA; poly2 = polyB; xf1 = xfA; xf2 = xfB; edge1 = edgeA; flip = 0; } ClipVertex incidentEdge[2]; FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); int32 count1 = poly1->GetVertexCount(); const b2Vec2* vertices1 = poly1->GetVertices(); b2Vec2 v11 = vertices1[edge1]; b2Vec2 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0]; b2Vec2 dv = v12 - v11; b2Vec2 sideNormal = b2Mul(xf1.R, v12 - v11); sideNormal.Normalize(); b2Vec2 frontNormal = b2Cross(sideNormal, 1.0f); v11 = b2Mul(xf1, v11); v12 = b2Mul(xf1, v12); float32 frontOffset = b2Dot(frontNormal, v11); float32 sideOffset1 = -b2Dot(sideNormal, v11); float32 sideOffset2 = b2Dot(sideNormal, v12); // Clip incident edge against extruded edge1 side edges. ClipVertex clipPoints1[2]; ClipVertex clipPoints2[2]; int np; // Clip to box side 1 np = ClipSegmentToLine(clipPoints1, incidentEdge, -sideNormal, sideOffset1); if (np < 2) return; // Clip to negative box side 1 np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2); if (np < 2) return; // Now clipPoints2 contains the clipped points. manifold->normal = flip ? -frontNormal : frontNormal; int32 pointCount = 0; for (int32 i = 0; i < b2_maxManifoldPoints; ++i) { float32 separation = b2Dot(frontNormal, clipPoints2[i].v) - frontOffset; if (separation <= 0.0f) { b2ManifoldPoint* cp = manifold->points + pointCount; cp->separation = separation; cp->localPoint1 = b2MulT(xfA, clipPoints2[i].v); cp->localPoint2 = b2MulT(xfB, clipPoints2[i].v); cp->id = clipPoints2[i].id; cp->id.features.flip = flip; ++pointCount; } } manifold->pointCount = pointCount; } numptyphysics-0.3.10/external/Box2D/Source/Collision/b2Collision.cpp000066400000000000000000000044211425065123200253510ustar00rootroot00000000000000/* * Copyright (c) 2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Collision.h" // Collision Detection in Interactive 3D Environments by Gino van den Bergen // From Section 3.4.1 // x = mu1 * p1 + mu2 * p2 // mu1 + mu2 = 1 && mu1 >= 0 && mu2 >= 0 // mu1 = 1 - mu2; // x = (1 - mu2) * p1 + mu2 * p2 // = p1 + mu2 * (p2 - p1) // x = s + a * r (s := start, r := end - start) // s + a * r = p1 + mu2 * d (d := p2 - p1) // -a * r + mu2 * d = b (b := s - p1) // [-r d] * [a; mu2] = b // Cramer's rule: // denom = det[-r d] // a = det[b d] / denom // mu2 = det[-r b] / denom bool b2Segment::TestSegment(float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const { b2Vec2 s = segment.p1; b2Vec2 r = segment.p2 - s; b2Vec2 d = p2 - p1; b2Vec2 n = b2Cross(d, 1.0f); const float32 k_slop = 100.0f * B2_FLT_EPSILON; float32 denom = -b2Dot(r, n); // Cull back facing collision and ignore parallel segments. if (denom > k_slop) { // Does the segment intersect the infinite line associated with this segment? b2Vec2 b = s - p1; float32 a = b2Dot(b, n); if (0.0f <= a && a <= maxLambda * denom) { float32 mu2 = -r.x * b.y + r.y * b.x; // Does the segment intersect this segment? if (-k_slop * denom <= mu2 && mu2 <= denom * (1.0f + k_slop)) { a /= denom; n.Normalize(); *lambda = a; *normal = n; return true; } } } return false; } numptyphysics-0.3.10/external/Box2D/Source/Collision/b2Collision.h000066400000000000000000000125721425065123200250240ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_COLLISION_H #define B2_COLLISION_H #include "../Common/b2Math.h" #include /// @file /// Structures and functions used for computing contact points, distance /// queries, and TOI queries. class b2Shape; class b2CircleShape; class b2PolygonShape; const uint8 b2_nullFeature = UCHAR_MAX; /// Contact ids to facilitate warm starting. union b2ContactID { /// The features that intersect to form the contact point struct Features { uint8 referenceEdge; ///< The edge that defines the outward contact normal. uint8 incidentEdge; ///< The edge most anti-parallel to the reference edge. uint8 incidentVertex; ///< The vertex (0 or 1) on the incident edge that was clipped. uint8 flip; ///< A value of 1 indicates that the reference edge is on shape2. } features; uint32 key; ///< Used to quickly compare contact ids. }; /// A manifold point is a contact point belonging to a contact /// manifold. It holds details related to the geometry and dynamics /// of the contact points. /// The point is stored in local coordinates because CCD /// requires sub-stepping in which the separation is stale. struct b2ManifoldPoint { b2Vec2 localPoint1; ///< local position of the contact point in body1 b2Vec2 localPoint2; ///< local position of the contact point in body2 float32 separation; ///< the separation of the shapes along the normal vector float32 normalImpulse; ///< the non-penetration impulse float32 tangentImpulse; ///< the friction impulse b2ContactID id; ///< uniquely identifies a contact point between two shapes }; /// A manifold for two touching convex shapes. struct b2Manifold { b2ManifoldPoint points[b2_maxManifoldPoints]; ///< the points of contact b2Vec2 normal; ///< the shared unit normal vector int32 pointCount; ///< the number of manifold points }; /// A line segment. struct b2Segment { /// Ray cast against this segment with another segment. bool TestSegment(float32* lambda, b2Vec2* normal, const b2Segment& segment, float32 maxLambda) const; b2Vec2 p1; ///< the starting point b2Vec2 p2; ///< the ending point }; /// An axis aligned bounding box. struct b2AABB { /// Verify that the bounds are sorted. bool IsValid() const; b2Vec2 lowerBound; ///< the lower vertex b2Vec2 upperBound; ///< the upper vertex }; /// An oriented bounding box. struct b2OBB { b2Mat22 R; ///< the rotation matrix b2Vec2 center; ///< the local centroid b2Vec2 extents; ///< the half-widths }; /// Compute the collision manifold between two circles. void b2CollideCircles(b2Manifold* manifold, const b2CircleShape* circle1, const b2XForm& xf1, const b2CircleShape* circle2, const b2XForm& xf2); /// Compute the collision manifold between a polygon and a circle. void b2CollidePolygonAndCircle(b2Manifold* manifold, const b2PolygonShape* polygon, const b2XForm& xf1, const b2CircleShape* circle, const b2XForm& xf2); /// Compute the collision manifold between two circles. void b2CollidePolygons(b2Manifold* manifold, const b2PolygonShape* polygon1, const b2XForm& xf1, const b2PolygonShape* polygon2, const b2XForm& xf2); /// Compute the distance between two shapes and the closest points. /// @return the distance between the shapes or zero if they are overlapped/touching. float32 b2Distance(b2Vec2* x1, b2Vec2* x2, const b2Shape* shape1, const b2XForm& xf1, const b2Shape* shape2, const b2XForm& xf2); /// Compute the time when two shapes begin to touch or touch at a closer distance. /// @warning the sweeps must have the same time interval. /// @return the fraction between [0,1] in which the shapes first touch. /// fraction=0 means the shapes begin touching/overlapped, and fraction=1 means the shapes don't touch. float32 b2TimeOfImpact(const b2Shape* shape1, const b2Sweep& sweep1, const b2Shape* shape2, const b2Sweep& sweep2); // ---------------- Inline Functions ------------------------------------------ inline bool b2AABB::IsValid() const { b2Vec2 d = upperBound - lowerBound; bool valid = d.x >= 0.0f && d.y >= 0.0f; valid = valid && lowerBound.IsValid() && upperBound.IsValid(); return valid; } inline bool b2TestOverlap(const b2AABB& a, const b2AABB& b) { b2Vec2 d1, d2; d1 = b.lowerBound - a.upperBound; d2 = a.lowerBound - b.upperBound; if (d1.x > 0.0f || d1.y > 0.0f) return false; if (d2.x > 0.0f || d2.y > 0.0f) return false; return true; } #endif numptyphysics-0.3.10/external/Box2D/Source/Collision/b2Distance.cpp000066400000000000000000000217221425065123200251530ustar00rootroot00000000000000/* * Copyright (c) 2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Collision.h" #include "Shapes/b2CircleShape.h" #include "Shapes/b2PolygonShape.h" int32 g_GJK_Iterations = 0; // GJK using Voronoi regions (Christer Ericson) and region selection // optimizations (Casey Muratori). // The origin is either in the region of points[1] or in the edge region. The origin is // not in region of points[0] because that is the old point. static int32 ProcessTwo(b2Vec2* x1, b2Vec2* x2, b2Vec2* p1s, b2Vec2* p2s, b2Vec2* points) { // If in point[1] region b2Vec2 r = -points[1]; b2Vec2 d = points[0] - points[1]; float32 length = d.Normalize(); float32 lambda = b2Dot(r, d); if (lambda <= 0.0f || length < B2_FLT_EPSILON) { // The simplex is reduced to a point. *x1 = p1s[1]; *x2 = p2s[1]; p1s[0] = p1s[1]; p2s[0] = p2s[1]; points[0] = points[1]; return 1; } // Else in edge region lambda /= length; *x1 = p1s[1] + lambda * (p1s[0] - p1s[1]); *x2 = p2s[1] + lambda * (p2s[0] - p2s[1]); return 2; } // Possible regions: // - points[2] // - edge points[0]-points[2] // - edge points[1]-points[2] // - inside the triangle static int32 ProcessThree(b2Vec2* x1, b2Vec2* x2, b2Vec2* p1s, b2Vec2* p2s, b2Vec2* points) { b2Vec2 a = points[0]; b2Vec2 b = points[1]; b2Vec2 c = points[2]; b2Vec2 ab = b - a; b2Vec2 ac = c - a; b2Vec2 bc = c - b; float32 sn = -b2Dot(a, ab), sd = b2Dot(b, ab); float32 tn = -b2Dot(a, ac), td = b2Dot(c, ac); float32 un = -b2Dot(b, bc), ud = b2Dot(c, bc); // In vertex c region? if (td <= 0.0f && ud <= 0.0f) { // Single point *x1 = p1s[2]; *x2 = p2s[2]; p1s[0] = p1s[2]; p2s[0] = p2s[2]; points[0] = points[2]; return 1; } // Should not be in vertex a or b region. B2_NOT_USED(sd); B2_NOT_USED(sn); b2Assert(sn > 0.0f || tn > 0.0f); b2Assert(sd > 0.0f || un > 0.0f); float32 n = b2Cross(ab, ac); #ifdef TARGET_FLOAT32_IS_FIXED n = (n < 0.0)? -1.0 : ((n > 0.0)? 1.0 : 0.0); #endif // Should not be in edge ab region. float32 vc = n * b2Cross(a, b); b2Assert(vc > 0.0f || sn > 0.0f || sd > 0.0f); // In edge bc region? float32 va = n * b2Cross(b, c); if (va <= 0.0f && un >= 0.0f && ud >= 0.0f && (un+ud) > 0.0f) { b2Assert(un + ud > 0.0f); float32 lambda = un / (un + ud); *x1 = p1s[1] + lambda * (p1s[2] - p1s[1]); *x2 = p2s[1] + lambda * (p2s[2] - p2s[1]); p1s[0] = p1s[2]; p2s[0] = p2s[2]; points[0] = points[2]; return 2; } // In edge ac region? float32 vb = n * b2Cross(c, a); if (vb <= 0.0f && tn >= 0.0f && td >= 0.0f && (tn+td) > 0.0f) { b2Assert(tn + td > 0.0f); float32 lambda = tn / (tn + td); *x1 = p1s[0] + lambda * (p1s[2] - p1s[0]); *x2 = p2s[0] + lambda * (p2s[2] - p2s[0]); p1s[1] = p1s[2]; p2s[1] = p2s[2]; points[1] = points[2]; return 2; } // Inside the triangle, compute barycentric coordinates float32 denom = va + vb + vc; b2Assert(denom > 0.0f); denom = 1.0f / denom; #ifdef TARGET_FLOAT32_IS_FIXED *x1 = denom * (va * p1s[0] + vb * p1s[1] + vc * p1s[2]); *x2 = denom * (va * p2s[0] + vb * p2s[1] + vc * p2s[2]); #else float32 u = va * denom; float32 v = vb * denom; float32 w = 1.0f - u - v; *x1 = u * p1s[0] + v * p1s[1] + w * p1s[2]; *x2 = u * p2s[0] + v * p2s[1] + w * p2s[2]; #endif return 3; } static bool InPoints(const b2Vec2& w, const b2Vec2* points, int32 pointCount) { const float32 k_tolerance = 100.0f * B2_FLT_EPSILON; for (int32 i = 0; i < pointCount; ++i) { b2Vec2 d = b2Abs(w - points[i]); b2Vec2 m = b2Max(b2Abs(w), b2Abs(points[i])); if (d.x < k_tolerance * (m.x + 1.0f) && d.y < k_tolerance * (m.y + 1.0f)) { return true; } } return false; } template float32 DistanceGeneric(b2Vec2* x1, b2Vec2* x2, const T1* shape1, const b2XForm& xf1, const T2* shape2, const b2XForm& xf2) { b2Vec2 p1s[3], p2s[3]; b2Vec2 points[3]; int32 pointCount = 0; *x1 = shape1->GetFirstVertex(xf1); *x2 = shape2->GetFirstVertex(xf2); float32 vSqr = 0.0f; const int32 maxIterations = 20; for (int32 iter = 0; iter < maxIterations; ++iter) { b2Vec2 v = *x2 - *x1; b2Vec2 w1 = shape1->Support(xf1, v); b2Vec2 w2 = shape2->Support(xf2, -v); vSqr = b2Dot(v, v); b2Vec2 w = w2 - w1; float32 vw = b2Dot(v, w); if (vSqr - vw <= 0.01f * vSqr || InPoints(w, points, pointCount)) // or w in points { if (pointCount == 0) { *x1 = w1; *x2 = w2; } g_GJK_Iterations = iter; return b2Sqrt(vSqr); } switch (pointCount) { case 0: p1s[0] = w1; p2s[0] = w2; points[0] = w; *x1 = p1s[0]; *x2 = p2s[0]; ++pointCount; break; case 1: p1s[1] = w1; p2s[1] = w2; points[1] = w; pointCount = ProcessTwo(x1, x2, p1s, p2s, points); break; case 2: p1s[2] = w1; p2s[2] = w2; points[2] = w; pointCount = ProcessThree(x1, x2, p1s, p2s, points); break; } // If we have three points, then the origin is in the corresponding triangle. if (pointCount == 3) { g_GJK_Iterations = iter; return 0.0f; } float32 maxSqr = -B2_FLT_MAX; for (int32 i = 0; i < pointCount; ++i) { maxSqr = b2Max(maxSqr, b2Dot(points[i], points[i])); } #ifdef TARGET_FLOAT32_IS_FIXED if (pointCount == 3 || vSqr <= 5.0*B2_FLT_EPSILON * maxSqr) #else if (pointCount == 3 || vSqr <= 100.0f * B2_FLT_EPSILON * maxSqr) #endif { g_GJK_Iterations = iter; v = *x2 - *x1; vSqr = b2Dot(v, v); return b2Sqrt(vSqr); } } g_GJK_Iterations = maxIterations; return b2Sqrt(vSqr); } static float32 DistanceCC( b2Vec2* x1, b2Vec2* x2, const b2CircleShape* circle1, const b2XForm& xf1, const b2CircleShape* circle2, const b2XForm& xf2) { b2Vec2 p1 = b2Mul(xf1, circle1->GetLocalPosition()); b2Vec2 p2 = b2Mul(xf2, circle2->GetLocalPosition()); b2Vec2 d = p2 - p1; float32 dSqr = b2Dot(d, d); float32 r1 = circle1->GetRadius() - b2_toiSlop; float32 r2 = circle2->GetRadius() - b2_toiSlop; float32 r = r1 + r2; if (dSqr > r * r) { float32 dLen = d.Normalize(); float32 distance = dLen - r; *x1 = p1 + r1 * d; *x2 = p2 - r2 * d; return distance; } else if (dSqr > B2_FLT_EPSILON * B2_FLT_EPSILON) { d.Normalize(); *x1 = p1 + r1 * d; *x2 = *x1; return 0.0f; } *x1 = p1; *x2 = *x1; return 0.0f; } // This is used for polygon-vs-circle distance. struct Point { b2Vec2 Support(const b2XForm&, const b2Vec2&) const { return p; } b2Vec2 GetFirstVertex(const b2XForm&) const { return p; } b2Vec2 p; }; // GJK is more robust with polygon-vs-point than polygon-vs-circle. // So we convert polygon-vs-circle to polygon-vs-point. static float32 DistancePC( b2Vec2* x1, b2Vec2* x2, const b2PolygonShape* polygon, const b2XForm& xf1, const b2CircleShape* circle, const b2XForm& xf2) { Point point; point.p = b2Mul(xf2, circle->GetLocalPosition()); float32 distance = DistanceGeneric(x1, x2, polygon, xf1, &point, b2XForm_identity); float32 r = circle->GetRadius() - b2_toiSlop; if (distance > r) { distance -= r; b2Vec2 d = *x2 - *x1; d.Normalize(); *x2 -= r * d; } else { distance = 0.0f; *x2 = *x1; } return distance; } float32 b2Distance(b2Vec2* x1, b2Vec2* x2, const b2Shape* shape1, const b2XForm& xf1, const b2Shape* shape2, const b2XForm& xf2) { b2ShapeType type1 = shape1->GetType(); b2ShapeType type2 = shape2->GetType(); if (type1 == e_circleShape && type2 == e_circleShape) { return DistanceCC(x1, x2, (b2CircleShape*)shape1, xf1, (b2CircleShape*)shape2, xf2); } if (type1 == e_polygonShape && type2 == e_circleShape) { return DistancePC(x1, x2, (b2PolygonShape*)shape1, xf1, (b2CircleShape*)shape2, xf2); } if (type1 == e_circleShape && type2 == e_polygonShape) { return DistancePC(x2, x1, (b2PolygonShape*)shape2, xf2, (b2CircleShape*)shape1, xf1); } if (type1 == e_polygonShape && type2 == e_polygonShape) { return DistanceGeneric(x1, x2, (b2PolygonShape*)shape1, xf1, (b2PolygonShape*)shape2, xf2); } return 0.0f; } numptyphysics-0.3.10/external/Box2D/Source/Collision/b2PairManager.cpp000066400000000000000000000246121425065123200256100ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2PairManager.h" #include "b2BroadPhase.h" #include // Thomas Wang's hash, see: http://www.concentric.net/~Ttwang/tech/inthash.htm // This assumes proxyId1 and proxyId2 are 16-bit. inline uint32 Hash(uint32 proxyId1, uint32 proxyId2) { uint32 key = (proxyId2 << 16) | proxyId1; key = ~key + (key << 15); key = key ^ (key >> 12); key = key + (key << 2); key = key ^ (key >> 4); key = key * 2057; key = key ^ (key >> 16); return key; } inline bool Equals(const b2Pair& pair, int32 proxyId1, int32 proxyId2) { return pair.proxyId1 == proxyId1 && pair.proxyId2 == proxyId2; } inline bool Equals(const b2BufferedPair& pair1, const b2BufferedPair& pair2) { return pair1.proxyId1 == pair2.proxyId1 && pair1.proxyId2 == pair2.proxyId2; } // For sorting. inline bool operator < (const b2BufferedPair& pair1, const b2BufferedPair& pair2) { if (pair1.proxyId1 < pair2.proxyId1) { return true; } if (pair1.proxyId1 == pair2.proxyId1) { return pair1.proxyId2 < pair2.proxyId2; } return false; } b2PairManager::b2PairManager() { b2Assert(b2IsPowerOfTwo(b2_tableCapacity) == true); b2Assert(b2_tableCapacity >= b2_maxPairs); for (int32 i = 0; i < b2_tableCapacity; ++i) { m_hashTable[i] = b2_nullPair; } m_freePair = 0; for (int32 i = 0; i < b2_maxPairs; ++i) { m_pairs[i].proxyId1 = b2_nullProxy; m_pairs[i].proxyId2 = b2_nullProxy; m_pairs[i].userData = NULL; m_pairs[i].status = 0; m_pairs[i].next = uint16(i + 1); } m_pairs[b2_maxPairs-1].next = b2_nullPair; m_pairCount = 0; m_pairBufferCount = 0; } void b2PairManager::Initialize(b2BroadPhase* broadPhase, b2PairCallback* callback) { m_broadPhase = broadPhase; m_callback = callback; } b2Pair* b2PairManager::Find(int32 proxyId1, int32 proxyId2, uint32 hash) { int32 index = m_hashTable[hash]; while (index != b2_nullPair && Equals(m_pairs[index], proxyId1, proxyId2) == false) { index = m_pairs[index].next; } if (index == b2_nullPair) { return NULL; } b2Assert(index < b2_maxPairs); return m_pairs + index; } b2Pair* b2PairManager::Find(int32 proxyId1, int32 proxyId2) { if (proxyId1 > proxyId2) b2Swap(proxyId1, proxyId2); int32 hash = Hash(proxyId1, proxyId2) & b2_tableMask; return Find(proxyId1, proxyId2, hash); } // Returns existing pair or creates a new one. b2Pair* b2PairManager::AddPair(int32 proxyId1, int32 proxyId2) { if (proxyId1 > proxyId2) b2Swap(proxyId1, proxyId2); int32 hash = Hash(proxyId1, proxyId2) & b2_tableMask; b2Pair* pair = Find(proxyId1, proxyId2, hash); if (pair != NULL) { return pair; } b2Assert(m_pairCount < b2_maxPairs); b2Assert(m_freePair != b2_nullPair); uint16 pairIndex = m_freePair; pair = m_pairs + pairIndex; m_freePair = pair->next; pair->proxyId1 = (uint16)proxyId1; pair->proxyId2 = (uint16)proxyId2; pair->status = 0; pair->userData = NULL; pair->next = m_hashTable[hash]; m_hashTable[hash] = pairIndex; ++m_pairCount; return pair; } // Removes a pair. The pair must exist. void* b2PairManager::RemovePair(int32 proxyId1, int32 proxyId2) { b2Assert(m_pairCount > 0); if (proxyId1 > proxyId2) b2Swap(proxyId1, proxyId2); int32 hash = Hash(proxyId1, proxyId2) & b2_tableMask; uint16* node = &m_hashTable[hash]; while (*node != b2_nullPair) { if (Equals(m_pairs[*node], proxyId1, proxyId2)) { uint16 index = *node; *node = m_pairs[*node].next; b2Pair* pair = m_pairs + index; void* userData = pair->userData; // Scrub pair->next = m_freePair; pair->proxyId1 = b2_nullProxy; pair->proxyId2 = b2_nullProxy; pair->userData = NULL; pair->status = 0; m_freePair = index; --m_pairCount; return userData; } else { node = &m_pairs[*node].next; } } b2Assert(false); return NULL; } /* As proxies are created and moved, many pairs are created and destroyed. Even worse, the same pair may be added and removed multiple times in a single time step of the physics engine. To reduce traffic in the pair manager, we try to avoid destroying pairs in the pair manager until the end of the physics step. This is done by buffering all the RemovePair requests. AddPair requests are processed immediately because we need the hash table entry for quick lookup. All user user callbacks are delayed until the buffered pairs are confirmed in Commit. This is very important because the user callbacks may be very expensive and client logic may be harmed if pairs are added and removed within the same time step. Buffer a pair for addition. We may add a pair that is not in the pair manager or pair buffer. We may add a pair that is already in the pair manager and pair buffer. If the added pair is not a new pair, then it must be in the pair buffer (because RemovePair was called). */ void b2PairManager::AddBufferedPair(int32 id1, int32 id2) { b2Assert(id1 != b2_nullProxy && id2 != b2_nullProxy); b2Assert(m_pairBufferCount < b2_maxPairs); b2Pair* pair = AddPair(id1, id2); // If this pair is not in the pair buffer ... if (pair->IsBuffered() == false) { // This must be a newly added pair. b2Assert(pair->IsFinal() == false); // Add it to the pair buffer. pair->SetBuffered(); m_pairBuffer[m_pairBufferCount].proxyId1 = pair->proxyId1; m_pairBuffer[m_pairBufferCount].proxyId2 = pair->proxyId2; ++m_pairBufferCount; b2Assert(m_pairBufferCount <= m_pairCount); } // Confirm this pair for the subsequent call to Commit. pair->ClearRemoved(); if (b2BroadPhase::s_validate) { ValidateBuffer(); } } // Buffer a pair for removal. void b2PairManager::RemoveBufferedPair(int32 id1, int32 id2) { b2Assert(id1 != b2_nullProxy && id2 != b2_nullProxy); b2Assert(m_pairBufferCount < b2_maxPairs); b2Pair* pair = Find(id1, id2); if (pair == NULL) { // The pair never existed. This is legal (due to collision filtering). return; } // If this pair is not in the pair buffer ... if (pair->IsBuffered() == false) { // This must be an old pair. b2Assert(pair->IsFinal() == true); pair->SetBuffered(); m_pairBuffer[m_pairBufferCount].proxyId1 = pair->proxyId1; m_pairBuffer[m_pairBufferCount].proxyId2 = pair->proxyId2; ++m_pairBufferCount; b2Assert(m_pairBufferCount <= m_pairCount); } pair->SetRemoved(); if (b2BroadPhase::s_validate) { ValidateBuffer(); } } void b2PairManager::Commit() { int32 removeCount = 0; b2Proxy* proxies = m_broadPhase->m_proxyPool; for (int32 i = 0; i < m_pairBufferCount; ++i) { b2Pair* pair = Find(m_pairBuffer[i].proxyId1, m_pairBuffer[i].proxyId2); b2Assert(pair->IsBuffered()); pair->ClearBuffered(); b2Assert(pair->proxyId1 < b2_maxProxies && pair->proxyId2 < b2_maxProxies); b2Proxy* proxy1 = proxies + pair->proxyId1; b2Proxy* proxy2 = proxies + pair->proxyId2; b2Assert(proxy1->IsValid()); b2Assert(proxy2->IsValid()); if (pair->IsRemoved()) { // It is possible a pair was added then removed before a commit. Therefore, // we should be careful not to tell the user the pair was removed when the // the user didn't receive a matching add. if (pair->IsFinal() == true) { m_callback->PairRemoved(proxy1->userData, proxy2->userData, pair->userData); } // Store the ids so we can actually remove the pair below. m_pairBuffer[removeCount].proxyId1 = pair->proxyId1; m_pairBuffer[removeCount].proxyId2 = pair->proxyId2; ++removeCount; } else { b2Assert(m_broadPhase->TestOverlap(proxy1, proxy2) == true); if (pair->IsFinal() == false) { pair->userData = m_callback->PairAdded(proxy1->userData, proxy2->userData); pair->SetFinal(); } } } for (int32 i = 0; i < removeCount; ++i) { RemovePair(m_pairBuffer[i].proxyId1, m_pairBuffer[i].proxyId2); } m_pairBufferCount = 0; if (b2BroadPhase::s_validate) { ValidateTable(); } } void b2PairManager::ValidateBuffer() { #ifdef _DEBUG b2Assert(m_pairBufferCount <= m_pairCount); std::sort(m_pairBuffer, m_pairBuffer + m_pairBufferCount); for (int32 i = 0; i < m_pairBufferCount; ++i) { if (i > 0) { b2Assert(Equals(m_pairBuffer[i], m_pairBuffer[i-1]) == false); } b2Pair* pair = Find(m_pairBuffer[i].proxyId1, m_pairBuffer[i].proxyId2); b2Assert(pair->IsBuffered()); b2Assert(pair->proxyId1 != pair->proxyId2); b2Assert(pair->proxyId1 < b2_maxProxies); b2Assert(pair->proxyId2 < b2_maxProxies); b2Proxy* proxy1 = m_broadPhase->m_proxyPool + pair->proxyId1; b2Proxy* proxy2 = m_broadPhase->m_proxyPool + pair->proxyId2; b2Assert(proxy1->IsValid() == true); b2Assert(proxy2->IsValid() == true); } #endif } void b2PairManager::ValidateTable() { #ifdef _DEBUG for (int32 i = 0; i < b2_tableCapacity; ++i) { uint16 index = m_hashTable[i]; while (index != b2_nullPair) { b2Pair* pair = m_pairs + index; b2Assert(pair->IsBuffered() == false); b2Assert(pair->IsFinal() == true); b2Assert(pair->IsRemoved() == false); b2Assert(pair->proxyId1 != pair->proxyId2); b2Assert(pair->proxyId1 < b2_maxProxies); b2Assert(pair->proxyId2 < b2_maxProxies); b2Proxy* proxy1 = m_broadPhase->m_proxyPool + pair->proxyId1; b2Proxy* proxy2 = m_broadPhase->m_proxyPool + pair->proxyId2; b2Assert(proxy1->IsValid() == true); b2Assert(proxy2->IsValid() == true); b2Assert(m_broadPhase->TestOverlap(proxy1, proxy2) == true); index = pair->next; } } #endif } numptyphysics-0.3.10/external/Box2D/Source/Collision/b2PairManager.h000066400000000000000000000070211425065123200252500ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ // The pair manager is used by the broad-phase to quickly add/remove/find pairs // of overlapping proxies. It is based closely on code provided by Pierre Terdiman. // http://www.codercorner.com/IncrementalSAP.txt #ifndef B2_PAIR_MANAGER_H #define B2_PAIR_MANAGER_H #include "../Common/b2Settings.h" #include "../Common/b2Math.h" #include class b2BroadPhase; struct b2Proxy; const uint16 b2_nullPair = USHRT_MAX; const uint16 b2_nullProxy = USHRT_MAX; const int32 b2_tableCapacity = b2_maxPairs; // must be a power of two const int32 b2_tableMask = b2_tableCapacity - 1; struct b2Pair { enum { e_pairBuffered = 0x0001, e_pairRemoved = 0x0002, e_pairFinal = 0x0004, }; void SetBuffered() { status |= e_pairBuffered; } void ClearBuffered() { status &= ~e_pairBuffered; } bool IsBuffered() { return (status & e_pairBuffered) == e_pairBuffered; } void SetRemoved() { status |= e_pairRemoved; } void ClearRemoved() { status &= ~e_pairRemoved; } bool IsRemoved() { return (status & e_pairRemoved) == e_pairRemoved; } void SetFinal() { status |= e_pairFinal; } bool IsFinal() { return (status & e_pairFinal) == e_pairFinal; } void* userData; uint16 proxyId1; uint16 proxyId2; uint16 next; uint16 status; }; struct b2BufferedPair { uint16 proxyId1; uint16 proxyId2; }; class b2PairCallback { public: virtual ~b2PairCallback() {} // This should return the new pair user data. It is ok if the // user data is null. virtual void* PairAdded(void* proxyUserData1, void* proxyUserData2) = 0; // This should free the pair's user data. In extreme circumstances, it is possible // this will be called with null pairUserData because the pair never existed. virtual void PairRemoved(void* proxyUserData1, void* proxyUserData2, void* pairUserData) = 0; }; class b2PairManager { public: b2PairManager(); void Initialize(b2BroadPhase* broadPhase, b2PairCallback* callback); void AddBufferedPair(int32 proxyId1, int32 proxyId2); void RemoveBufferedPair(int32 proxyId1, int32 proxyId2); void Commit(); private: b2Pair* Find(int32 proxyId1, int32 proxyId2); b2Pair* Find(int32 proxyId1, int32 proxyId2, uint32 hashValue); b2Pair* AddPair(int32 proxyId1, int32 proxyId2); void* RemovePair(int32 proxyId1, int32 proxyId2); void ValidateBuffer(); void ValidateTable(); public: b2BroadPhase *m_broadPhase; b2PairCallback *m_callback; b2Pair m_pairs[b2_maxPairs]; uint16 m_freePair; int32 m_pairCount; b2BufferedPair m_pairBuffer[b2_maxPairs]; int32 m_pairBufferCount; uint16 m_hashTable[b2_tableCapacity]; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Collision/b2Shape.cpp000066400000000000000000000376251425065123200244720ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Shape.h" #include "../Dynamics/b2Body.h" #include "../Dynamics/b2World.h" #include "../Common/b2BlockAllocator.h" #include // Polygon mass, centroid, and inertia. // Let rho be the polygon density in mass per unit area. // Then: // mass = rho * int(dA) // centroid.x = (1/mass) * rho * int(x * dA) // centroid.y = (1/mass) * rho * int(y * dA) // I = rho * int((x*x + y*y) * dA) // // We can compute these integrals by summing all the integrals // for each triangle of the polygon. To evaluate the integral // for a single triangle, we make a change of variables to // the (u,v) coordinates of the triangle: // x = x0 + e1x * u + e2x * v // y = y0 + e1y * u + e2y * v // where 0 <= u && 0 <= v && u + v <= 1. // // We integrate u from [0,1-v] and then v from [0,1]. // We also need to use the Jacobian of the transformation: // D = cross(e1, e2) // // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3) // // The rest of the derivation is handled by computer algebra. static void PolyMass(b2MassData* massData, const b2Vec2* vs, int32 count, float32 rho) { b2Assert(count >= 3); b2Vec2 center; center.Set(0.0f, 0.0f); float32 area = 0.0f; float32 I = 0.0f; // pRef is the reference point for forming triangles. // It's location doesn't change the result (except for rounding error). b2Vec2 pRef(0.0f, 0.0f); #if 0 // This code would put the reference point inside the polygon. for (int32 i = 0; i < count; ++i) { pRef += vs[i]; } pRef *= 1.0f / count; #endif const float32 inv3 = 1.0f / 3.0f; for (int32 i = 0; i < count; ++i) { // Triangle vertices. b2Vec2 p1 = pRef; b2Vec2 p2 = vs[i]; b2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0]; b2Vec2 e1 = p2 - p1; b2Vec2 e2 = p3 - p1; float32 D = b2Cross(e1, e2); float32 triangleArea = 0.5f * D; area += triangleArea; // Area weighted centroid center += triangleArea * inv3 * (p1 + p2 + p3); float32 px = p1.x, py = p1.y; float32 ex1 = e1.x, ey1 = e1.y; float32 ex2 = e2.x, ey2 = e2.y; float32 intx2 = inv3 * (0.25f * (ex1*ex1 + ex2*ex1 + ex2*ex2) + (px*ex1 + px*ex2)) + 0.5f*px*px; float32 inty2 = inv3 * (0.25f * (ey1*ey1 + ey2*ey1 + ey2*ey2) + (py*ey1 + py*ey2)) + 0.5f*py*py; I += D * (intx2 + inty2); } // Total mass massData->mass = rho * area; // Center of mass b2Assert(area > FLT_EPSILON); center *= 1.0f / area; massData->center = center; // Inertia tensor relative to the center. I = rho * (I - area * b2Dot(center, center)); massData->I = I; } static b2Vec2 PolyCentroid(const b2Vec2* vs, int32 count) { b2Assert(count >= 3); b2Vec2 c; c.Set(0.0f, 0.0f); float32 area = 0.0f; // pRef is the reference point for forming triangles. // It's location doesn't change the result (except for rounding error). b2Vec2 pRef(0.0f, 0.0f); #if 0 // This code would put the reference point inside the polygon. for (int32 i = 0; i < count; ++i) { pRef += vs[i]; } pRef *= 1.0f / count; #endif const float32 inv3 = 1.0f / 3.0f; for (int32 i = 0; i < count; ++i) { // Triangle vertices. b2Vec2 p1 = pRef; b2Vec2 p2 = vs[i]; b2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0]; b2Vec2 e1 = p2 - p1; b2Vec2 e2 = p3 - p1; float32 D = b2Cross(e1, e2); float32 triangleArea = 0.5f * D; area += triangleArea; // Area weighted centroid c += triangleArea * inv3 * (p1 + p2 + p3); } // Centroid b2Assert(area > FLT_EPSILON); c *= 1.0f / area; return c; } void b2ShapeDef::ComputeMass(b2MassData* massData) const { if (density == 0.0f) { massData->mass = 0.0f; massData->center.Set(0.0f, 0.0f); massData->I = 0.0f; } switch (type) { case e_circleShape: { b2CircleDef* circle = (b2CircleDef*)this; massData->mass = density * b2_pi * circle->radius * circle->radius; massData->center.Set(0.0f, 0.0f); massData->I = 0.5f * (massData->mass) * circle->radius * circle->radius; } break; case e_boxShape: { b2BoxDef* box = (b2BoxDef*)this; massData->mass = 4.0f * density * box->extents.x * box->extents.y; massData->center.Set(0.0f, 0.0f); massData->I = massData->mass / 3.0f * b2Dot(box->extents, box->extents); } break; case e_polyShape: { b2PolyDef* poly = (b2PolyDef*)this; PolyMass(massData, poly->vertices, poly->vertexCount, density); } break; default: massData->mass = 0.0f; massData->center.Set(0.0f, 0.0f); massData->I = 0.0f; break; } } b2Shape* b2Shape::Create(const b2ShapeDef* def, b2Body* body, const b2Vec2& center) { switch (def->type) { case e_circleShape: { void* mem = body->m_world->m_blockAllocator.Allocate(sizeof(b2CircleShape)); return new (mem) b2CircleShape(def, body, center); } case e_boxShape: case e_polyShape: { void* mem = body->m_world->m_blockAllocator.Allocate(sizeof(b2PolyShape)); return new (mem) b2PolyShape(def, body, center); } } b2Assert(false); return NULL; } void b2Shape::Destroy(b2Shape*& shape) { b2BlockAllocator& allocator = shape->m_body->m_world->m_blockAllocator; shape->~b2Shape(); switch (shape->m_type) { case e_circleShape: allocator.Free(shape, sizeof(b2CircleShape)); break; case e_polyShape: allocator.Free(shape, sizeof(b2PolyShape)); break; default: b2Assert(false); } shape = NULL; } b2Shape::b2Shape(const b2ShapeDef* def, b2Body* body) { m_userData = def->userData; m_friction = def->friction; m_restitution = def->restitution; m_body = body; m_proxyId = b2_nullProxy; m_maxRadius = 0.0f; m_categoryBits = def->categoryBits; m_maskBits = def->maskBits; m_groupIndex = def->groupIndex; } b2Shape::~b2Shape() { if (m_proxyId != b2_nullProxy) { m_body->m_world->m_broadPhase->DestroyProxy(m_proxyId); } } void b2Shape::DestroyProxy() { if (m_proxyId != b2_nullProxy) { m_body->m_world->m_broadPhase->DestroyProxy(m_proxyId); m_proxyId = b2_nullProxy; } } b2CircleShape::b2CircleShape(const b2ShapeDef* def, b2Body* body, const b2Vec2& localCenter) : b2Shape(def, body) { b2Assert(def->type == e_circleShape); const b2CircleDef* circle = (const b2CircleDef*)def; m_localPosition = def->localPosition - localCenter; m_type = e_circleShape; m_radius = circle->radius; m_R = m_body->m_R; b2Vec2 r = b2Mul(m_body->m_R, m_localPosition); m_position = m_body->m_position + r; m_maxRadius = r.Length() + m_radius; m_minRadius = m_radius; b2AABB aabb; aabb.minVertex.Set(m_position.x - m_radius, m_position.y - m_radius); aabb.maxVertex.Set(m_position.x + m_radius, m_position.y + m_radius); b2BroadPhase* broadPhase = m_body->m_world->m_broadPhase; if (broadPhase->InRange(aabb)) { m_proxyId = broadPhase->CreateProxy(aabb, this); } else { m_proxyId = b2_nullProxy; } if (m_proxyId == b2_nullProxy) { m_body->Freeze(); } } void b2CircleShape::Synchronize(const b2Vec2& position1, const b2Mat22& R1, const b2Vec2& position2, const b2Mat22& R2) { m_R = R2; m_position = position2 + b2Mul(m_R, m_localPosition); if (m_proxyId == b2_nullProxy) { return; } // Compute an AABB that covers the swept shape (may miss some rotation effect). b2Vec2 p1 = position1 + b2Mul(R1, m_localPosition); b2Vec2 lower = b2Min(p1, m_position); b2Vec2 upper = b2Max(p1, m_position); b2AABB aabb; aabb.minVertex.Set(lower.x - m_radius, lower.y - m_radius); aabb.maxVertex.Set(upper.x + m_radius, upper.y + m_radius); b2BroadPhase* broadPhase = m_body->m_world->m_broadPhase; if (broadPhase->InRange(aabb)) { broadPhase->MoveProxy(m_proxyId, aabb); } else { m_body->Freeze(); } } void b2CircleShape::QuickSync(const b2Vec2& position, const b2Mat22& R) { m_R = R; m_position = position + b2Mul(R, m_localPosition); } b2Vec2 b2CircleShape::Support(const b2Vec2& d) const { b2Vec2 u = d; u.Normalize(); float32 r = b2Max(0.0f, m_radius - b2_toiSlop); return m_position + r * u; } bool b2CircleShape::TestPoint(const b2Vec2& p) { b2Vec2 d = p - m_position; return b2Dot(d, d) <= m_radius * m_radius; } void b2CircleShape::ResetProxy(b2BroadPhase* broadPhase) { if (m_proxyId == b2_nullProxy) { return; } b2Proxy* proxy = broadPhase->GetProxy(m_proxyId); broadPhase->DestroyProxy(m_proxyId); proxy = NULL; b2AABB aabb; aabb.minVertex.Set(m_position.x - m_radius, m_position.y - m_radius); aabb.maxVertex.Set(m_position.x + m_radius, m_position.y + m_radius); if (broadPhase->InRange(aabb)) { m_proxyId = broadPhase->CreateProxy(aabb, this); } else { m_proxyId = b2_nullProxy; } if (m_proxyId == b2_nullProxy) { m_body->Freeze(); } } b2PolyShape::b2PolyShape(const b2ShapeDef* def, b2Body* body, const b2Vec2& newOrigin) : b2Shape(def, body) { b2Assert(def->type == e_boxShape || def->type == e_polyShape); m_type = e_polyShape; b2Mat22 localR(def->localRotation); // Get the vertices transformed into the body frame. if (def->type == e_boxShape) { m_localCentroid = def->localPosition - newOrigin; const b2BoxDef* box = (const b2BoxDef*)def; m_vertexCount = 4; b2Vec2 h = box->extents; m_vertices[0] = b2Mul(localR, b2Vec2(h.x, h.y)); m_vertices[1] = b2Mul(localR, b2Vec2(-h.x, h.y)); m_vertices[2] = b2Mul(localR, b2Vec2(-h.x, -h.y)); m_vertices[3] = b2Mul(localR, b2Vec2(h.x, -h.y)); } else { const b2PolyDef* poly = (const b2PolyDef*)def; m_vertexCount = poly->vertexCount; b2Assert(3 <= m_vertexCount && m_vertexCount <= b2_maxPolyVertices); b2Vec2 centroid = PolyCentroid(poly->vertices, poly->vertexCount); m_localCentroid = def->localPosition + b2Mul(localR, centroid) - newOrigin; for (int32 i = 0; i < m_vertexCount; ++i) { m_vertices[i] = b2Mul(localR, poly->vertices[i] - centroid); } } // Compute bounding box. TODO_ERIN optimize OBB b2Vec2 minVertex(FLT_MAX, FLT_MAX); b2Vec2 maxVertex(-FLT_MAX, -FLT_MAX); for (int32 i = 0; i < m_vertexCount; ++i) { b2Vec2 v = m_vertices[i]; minVertex = b2Min(minVertex, v); maxVertex = b2Max(maxVertex, v); } m_localOBB.R.SetIdentity(); m_localOBB.center = 0.5f * (minVertex + maxVertex); m_localOBB.extents = 0.5f * (maxVertex - minVertex); // Compute the edge normals and next index map. for (int32 i = 0; i < m_vertexCount; ++i) { int32 i1 = i; int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; m_normals[i] = b2Cross(edge, 1.0f); m_normals[i].Normalize(); } // Create core polygon shape by shifting edges inward. m_minRadius = FLT_MAX; m_maxRadius = -FLT_MAX; for (int32 i = 0; i < m_vertexCount; ++i) { int32 i1 = i - 1 >= 0 ? i - 1 : m_vertexCount - 1; int32 i2 = i; b2Vec2 n1 = m_normals[i1]; b2Vec2 n2 = m_normals[i2]; b2Vec2 v = m_vertices[i]; // dot(n1, vc) = d.x // dot(n2, vc) = d.y b2Vec2 d; d.x = b2Dot(n1, v) - b2_toiSlop; d.y = b2Dot(n2, v) - b2_toiSlop; // Shifting the edge inward by b2_toiSlop should // not cause the plane to pass the centroid. b2Assert(d.x >= 0.0f); b2Assert(d.y >= 0.0f); b2Mat22 A; A.col1.x = n1.x; A.col2.x = n1.y; A.col1.y = n2.x; A.col2.y = n2.y; m_coreVertices[i] = A.Solve(d); m_minRadius = b2Min(m_minRadius, b2Min(d.x, d.y)); b2Vec2 p = m_coreVertices[i] + m_localCentroid; m_maxRadius = b2Max(m_maxRadius, p.Length()); } // Ensure the polygon in convex. TODO_ERIN compute convex hull. // TODO_ERIN check each vertex against each edge. for (int32 i = 0; i < m_vertexCount; ++i) { int32 i1 = i; int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; NOT_USED(i1); NOT_USED(i2); b2Assert(b2Cross(m_normals[i1], m_normals[i2]) > FLT_EPSILON); } m_R = m_body->m_R; m_position = m_body->m_position + b2Mul(m_body->m_R, m_localCentroid); b2Mat22 R = b2Mul(m_R, m_localOBB.R); b2Mat22 absR = b2Abs(R); b2Vec2 h = b2Mul(absR, m_localOBB.extents); b2Vec2 position = m_position + b2Mul(m_R, m_localOBB.center); b2AABB aabb; aabb.minVertex = position - h; aabb.maxVertex = position + h; b2BroadPhase* broadPhase = m_body->m_world->m_broadPhase; if (broadPhase->InRange(aabb)) { m_proxyId = broadPhase->CreateProxy(aabb, this); } else { m_proxyId = b2_nullProxy; } if (m_proxyId == b2_nullProxy) { m_body->Freeze(); } } void b2PolyShape::Synchronize( const b2Vec2& position1, const b2Mat22& R1, const b2Vec2& position2, const b2Mat22& R2) { // The body transform is copied for convenience. m_R = R2; m_position = position2 + b2Mul(R2, m_localCentroid); if (m_proxyId == b2_nullProxy) { return; } b2AABB aabb1, aabb2; { b2Mat22 obbR = b2Mul(R1, m_localOBB.R); b2Mat22 absR = b2Abs(obbR); b2Vec2 h = b2Mul(absR, m_localOBB.extents); b2Vec2 center = position1 + b2Mul(R1, m_localCentroid + m_localOBB.center); aabb1.minVertex = center - h; aabb1.maxVertex = center + h; } { b2Mat22 obbR = b2Mul(R2, m_localOBB.R); b2Mat22 absR = b2Abs(obbR); b2Vec2 h = b2Mul(absR, m_localOBB.extents); b2Vec2 center = position2 + b2Mul(R2, m_localCentroid + m_localOBB.center); aabb2.minVertex = center - h; aabb2.maxVertex = center + h; } b2AABB aabb; aabb.minVertex = b2Min(aabb1.minVertex, aabb2.minVertex); aabb.maxVertex = b2Max(aabb1.maxVertex, aabb2.maxVertex); b2BroadPhase* broadPhase = m_body->m_world->m_broadPhase; if (broadPhase->InRange(aabb)) { broadPhase->MoveProxy(m_proxyId, aabb); } else { m_body->Freeze(); } } void b2PolyShape::QuickSync(const b2Vec2& position, const b2Mat22& R) { m_R = R; m_position = position + b2Mul(R, m_localCentroid); } b2Vec2 b2PolyShape::Support(const b2Vec2& d) const { b2Vec2 dLocal = b2MulT(m_R, d); int32 bestIndex = 0; float32 bestValue = b2Dot(m_coreVertices[0], dLocal); for (int32 i = 1; i < m_vertexCount; ++i) { float32 value = b2Dot(m_coreVertices[i], dLocal); if (value > bestValue) { bestIndex = i; bestValue = value; } } return m_position + b2Mul(m_R, m_coreVertices[bestIndex]); } bool b2PolyShape::TestPoint(const b2Vec2& p) { b2Vec2 pLocal = b2MulT(m_R, p - m_position); for (int32 i = 0; i < m_vertexCount; ++i) { float32 dot = b2Dot(m_normals[i], pLocal - m_vertices[i]); if (dot > 0.0f) { return false; } } return true; } void b2PolyShape::ResetProxy(b2BroadPhase* broadPhase) { if (m_proxyId == b2_nullProxy) { return; } b2Proxy* proxy = broadPhase->GetProxy(m_proxyId); broadPhase->DestroyProxy(m_proxyId); proxy = NULL; b2Mat22 R = b2Mul(m_R, m_localOBB.R); b2Mat22 absR = b2Abs(R); b2Vec2 h = b2Mul(absR, m_localOBB.extents); b2Vec2 position = m_position + b2Mul(m_R, m_localOBB.center); b2AABB aabb; aabb.minVertex = position - h; aabb.maxVertex = position + h; if (broadPhase->InRange(aabb)) { m_proxyId = broadPhase->CreateProxy(aabb, this); } else { m_proxyId = b2_nullProxy; } if (m_proxyId == b2_nullProxy) { m_body->Freeze(); } } numptyphysics-0.3.10/external/Box2D/Source/Collision/b2Shape.h000066400000000000000000000151701425065123200241260ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_SHAPE_H #define B2_SHAPE_H #include "../Common/b2Math.h" #include "b2Collision.h" class b2Body; class b2BroadPhase; struct b2MassData { float32 mass; b2Vec2 center; float32 I; }; enum b2ShapeType { e_unknownShape = -1, e_circleShape, e_boxShape, e_polyShape, e_meshShape, e_shapeTypeCount, }; struct b2ShapeDef { b2ShapeDef() { type = e_unknownShape; userData = NULL; localPosition.Set(0.0f, 0.0f); localRotation = 0.0f; friction = 0.2f; restitution = 0.0f; density = 0.0f; categoryBits = 0x0001; maskBits = 0xFFFF; groupIndex = 0; } virtual ~b2ShapeDef() {} void ComputeMass(b2MassData* massData) const; b2ShapeType type; void* userData; b2Vec2 localPosition; float32 localRotation; float32 friction; float32 restitution; float32 density; // The collision category bits. Normally you would just set one bit. uint16 categoryBits; // The collision mask bits. This states the categories that this // shape would accept for collision. uint16 maskBits; // Collision groups allow a certain group of objects to never collide (negative) // or always collide (positive). Zero means no collision group. Non-zero group // filtering always wins against the mask bits. int16 groupIndex; }; struct b2CircleDef : public b2ShapeDef { b2CircleDef() { type = e_circleShape; radius = 1.0f; } float32 radius; }; struct b2BoxDef : public b2ShapeDef { b2BoxDef() { type = e_boxShape; extents.Set(1.0f, 1.0f); } b2Vec2 extents; }; // Convex polygon, vertices must be in CCW order. struct b2PolyDef : public b2ShapeDef { b2PolyDef() { type = e_polyShape; vertexCount = 0; } b2Vec2 vertices[b2_maxPolyVertices]; int32 vertexCount; }; // Shapes are created automatically when a body is created. // Client code does not normally interact with shapes. class b2Shape { public: virtual bool TestPoint(const b2Vec2& p) = 0; void* GetUserData(); b2ShapeType GetType() const; // Get the parent body of this shape. b2Body* GetBody(); // Get the world position. const b2Vec2& GetPosition() const; // Get the world rotation. const b2Mat22& GetRotationMatrix() const; // Remove and then add proxy from the broad-phase. // This is used to refresh the collision filters. virtual void ResetProxy(b2BroadPhase* broadPhase) = 0; // Get the next shape in the parent body's shape list. b2Shape* GetNext(); //--------------- Internals Below ------------------- static b2Shape* Create( const b2ShapeDef* def, b2Body* body, const b2Vec2& newOrigin); static void Destroy(b2Shape*& shape); b2Shape(const b2ShapeDef* def, b2Body* body); virtual ~b2Shape(); virtual void Synchronize( const b2Vec2& position1, const b2Mat22& R1, const b2Vec2& position2, const b2Mat22& R2) = 0; virtual void QuickSync(const b2Vec2& position, const b2Mat22& R) = 0; virtual b2Vec2 Support(const b2Vec2& d) const = 0; float32 GetMaxRadius() const; void DestroyProxy(); b2Shape* m_next; b2Mat22 m_R; b2Vec2 m_position; b2ShapeType m_type; void* m_userData; b2Body* m_body; float32 m_friction; float32 m_restitution; float32 m_minRadius; float32 m_maxRadius; uint16 m_proxyId; uint16 m_categoryBits; uint16 m_maskBits; int16 m_groupIndex; }; class b2CircleShape : public b2Shape { public: bool TestPoint(const b2Vec2& p); void ResetProxy(b2BroadPhase* broadPhase); //--------------- Internals Below ------------------- b2CircleShape(const b2ShapeDef* def, b2Body* body, const b2Vec2& newOrigin); void Synchronize( const b2Vec2& position1, const b2Mat22& R1, const b2Vec2& position2, const b2Mat22& R2); void QuickSync(const b2Vec2& position, const b2Mat22& R); b2Vec2 Support(const b2Vec2& d) const; // Local position in parent body b2Vec2 m_localPosition; float32 m_radius; }; // A convex polygon. The position of the polygon (m_position) is the // position of the centroid. The vertices of the incoming polygon are pre-rotated // according to the local rotation. The vertices are also shifted to be centered // on the centroid. Since the local rotation is absorbed into the vertex // coordinates, the polygon rotation is equal to the body rotation. However, // the polygon position is centered on the polygon centroid. This simplifies // some collision algorithms. class b2PolyShape : public b2Shape { public: bool TestPoint(const b2Vec2& p); void ResetProxy(b2BroadPhase* broadPhase); //--------------- Internals Below ------------------- b2PolyShape(const b2ShapeDef* def, b2Body* body, const b2Vec2& newOrigin); void Synchronize( const b2Vec2& position1, const b2Mat22& R1, const b2Vec2& position2, const b2Mat22& R2); void QuickSync(const b2Vec2& position, const b2Mat22& R); b2Vec2 Support(const b2Vec2& d) const; // Local position of the shape centroid in parent body frame. b2Vec2 m_localCentroid; // Local position oriented bounding box. The OBB center is relative to // shape centroid. b2OBB m_localOBB; b2Vec2 m_vertices[b2_maxPolyVertices]; b2Vec2 m_coreVertices[b2_maxPolyVertices]; int32 m_vertexCount; b2Vec2 m_normals[b2_maxPolyVertices]; }; inline b2ShapeType b2Shape::GetType() const { return m_type; } inline void* b2Shape::GetUserData() { return m_userData; } inline b2Body* b2Shape::GetBody() { return m_body; } inline b2Shape* b2Shape::GetNext() { return m_next; } inline const b2Vec2& b2Shape::GetPosition() const { return m_position; } inline const b2Mat22& b2Shape::GetRotationMatrix() const { return m_R; } inline float32 b2Shape::GetMaxRadius() const { return m_maxRadius; } #endif numptyphysics-0.3.10/external/Box2D/Source/Collision/b2TimeOfImpact.cpp000066400000000000000000000064251425065123200257450ustar00rootroot00000000000000/* * Copyright (c) 2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Collision.h" #include "Shapes/b2Shape.h" // This algorithm uses conservative advancement to compute the time of // impact (TOI) of two shapes. // Refs: Bullet, Young Kim float32 b2TimeOfImpact(const b2Shape* shape1, const b2Sweep& sweep1, const b2Shape* shape2, const b2Sweep& sweep2) { float32 r1 = shape1->GetSweepRadius(); float32 r2 = shape2->GetSweepRadius(); b2Assert(sweep1.t0 == sweep2.t0); b2Assert(1.0f - sweep1.t0 > B2_FLT_EPSILON); float32 t0 = sweep1.t0; b2Vec2 v1 = sweep1.c - sweep1.c0; b2Vec2 v2 = sweep2.c - sweep2.c0; float32 omega1 = sweep1.a - sweep1.a0; float32 omega2 = sweep2.a - sweep2.a0; float32 alpha = 0.0f; b2Vec2 p1, p2; const int32 k_maxIterations = 20; // TODO_ERIN b2Settings int32 iter = 0; b2Vec2 normal = b2Vec2_zero; float32 distance = 0.0f; float32 targetDistance = 0.0f; for(;;) { float32 t = (1.0f - alpha) * t0 + alpha; b2XForm xf1, xf2; sweep1.GetXForm(&xf1, t); sweep2.GetXForm(&xf2, t); // Get the distance between shapes. distance = b2Distance(&p1, &p2, shape1, xf1, shape2, xf2); if (iter == 0) { // Compute a reasonable target distance to give some breathing room // for conservative advancement. if (distance > 2.0f * b2_toiSlop) { targetDistance = 1.5f * b2_toiSlop; } else { targetDistance = b2Max(0.05f * b2_toiSlop, distance - 0.5f * b2_toiSlop); } } if (distance - targetDistance < 0.05f * b2_toiSlop || iter == k_maxIterations) { break; } normal = p2 - p1; normal.Normalize(); // Compute upper bound on remaining movement. float32 approachVelocityBound = b2Dot(normal, v1 - v2) + b2Abs(omega1) * r1 + b2Abs(omega2) * r2; if (b2Abs(approachVelocityBound) < B2_FLT_EPSILON) { alpha = 1.0f; break; } // Get the conservative time increment. Don't advance all the way. float32 dAlpha = (distance - targetDistance) / approachVelocityBound; //float32 dt = (distance - 0.5f * b2_linearSlop) / approachVelocityBound; float32 newAlpha = alpha + dAlpha; // The shapes may be moving apart or a safe distance apart. if (newAlpha < 0.0f || 1.0f < newAlpha) { alpha = 1.0f; break; } // Ensure significant advancement. if (newAlpha < (1.0f + 100.0f * B2_FLT_EPSILON) * alpha) { break; } alpha = newAlpha; ++iter; } return alpha; } numptyphysics-0.3.10/external/Box2D/Source/Common/000077500000000000000000000000001425065123200217625ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Source/Common/Fixed.h000066400000000000000000000442111425065123200231740ustar00rootroot00000000000000/* Copyright (c) 2006 Henry Strickland & Ryan Seto 2007-2008 Tobias Weyand (modifications and extensions) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. (* http://www.opensource.org/licenses/mit-license.php *) */ #ifndef _FIXED_H_ #define _FIXED_H_ #include #ifdef TARGET_IS_NDS #include "nds.h" #endif #define FIXED_BP 16 #define FIXED_MAX ((1<<(32-FIXED_BP-1))-1) #define FIXED_MIN (-(1<<(32-FIXED_BP-1))) #define FIXED_EPSILON (Fixed(0.00007f)) #define G_1_DIV_PI 20861 class Fixed { private: int g; // the guts const static int BP= FIXED_BP; // how many low bits are right of Binary Point const static int BP2= BP*2; // how many low bits are right of Binary Point const static int BPhalf= BP/2; // how many low bits are right of Binary Point double STEP(); // smallest step we can represent // for private construction via guts enum FixedRaw { RAW }; Fixed(FixedRaw, int guts); public: Fixed(); Fixed(const Fixed &a); Fixed(float a); Fixed(double a); Fixed(int a); Fixed(long a); Fixed& operator =(const Fixed a); Fixed& operator =(float a); Fixed& operator =(double a); Fixed& operator =(int a); Fixed& operator =(long a); operator float(); operator double(); operator int(); operator long(); operator unsigned short(); operator float() const; Fixed operator +() const; Fixed operator -() const; Fixed operator +(const Fixed a) const; Fixed operator -(const Fixed a) const; #if 1 // more acurate, using long long Fixed operator *(const Fixed a) const; #else // faster, but with only half as many bits right of binary point Fixed operator *(const Fixed a) const; #endif Fixed operator /(const Fixed a) const; Fixed operator *(unsigned short a) const; Fixed operator *(int a) const; Fixed operator +(float a) const; Fixed operator -(float a) const; Fixed operator *(float a) const; Fixed operator /(float a) const; Fixed operator +(double a) const; Fixed operator -(double a) const; Fixed operator *(double a) const; Fixed operator /(double a) const; Fixed operator >>(int a) const; Fixed operator <<(int a) const; Fixed& operator +=(Fixed a); Fixed& operator -=(Fixed a); Fixed& operator *=(Fixed a); Fixed& operator /=(Fixed a); Fixed& operator +=(int a); Fixed& operator -=(int a); Fixed& operator *=(int a); Fixed& operator /=(int a); Fixed& operator +=(long a); Fixed& operator -=(long a); Fixed& operator *=(long a); Fixed& operator /=(long a); Fixed& operator +=(float a); Fixed& operator -=(float a); Fixed& operator *=(float a); Fixed& operator /=(float a); Fixed& operator +=(double a); Fixed& operator -=(double a); Fixed& operator *=(double a); Fixed& operator /=(double a); bool operator ==(const Fixed a) const; bool operator !=(const Fixed a) const; bool operator <=(const Fixed a) const; bool operator >=(const Fixed a) const; bool operator <(const Fixed a) const; bool operator >(const Fixed a) const; bool operator ==(float a) const; bool operator !=(float a) const; bool operator <=(float a) const; bool operator >=(float a) const; bool operator <(float a) const; bool operator >(float a) const; bool operator ==(double a) const; bool operator !=(double a) const; bool operator <=(double a) const; bool operator >=(double a) const; bool operator <(double a) const; bool operator >(double a) const; bool operator >(int a) const; bool operator <(int a) const; bool operator >=(int a) const; bool operator <=(int a) const; Fixed abs(); Fixed sqrt(); #ifdef TARGET_IS_NDS Fixed cosf(); Fixed sinf(); Fixed tanf(); #endif }; // // Implementation // inline double Fixed::STEP() { return 1.0 / (1<>BP; } inline Fixed::operator long() { return g>>BP; } //#pragma warning(disable: 4244) //HARDWIRE added pragma to prevent VS2005 compilation error inline Fixed::operator unsigned short() { return g>>BP; } inline Fixed::operator float() const { return g / (float)(1<> BP)); } #elif 0 // check for overflow and figure out where. Must specify -rdynamic in linker #include #include #include inline Fixed Fixed::operator *(const Fixed a) const { long long x = ((long long)g * (long long)a.g ); if(x > 0x7fffffffffffLL || x < -0x7fffffffffffLL) { printf("overflow"); void *array[2]; int nSize = backtrace(array, 2); char **symbols = backtrace_symbols(array, nSize); for(int i=0; i>BP)); } #else // faster, but with only half as many bits right of binary point inline Fixed Fixed::operator *(const Fixed a) const { return Fixed(RAW, (g>>BPhalf) * (a.g>>BPhalf) ); } #endif #ifdef TARGET_IS_NDS // Division using the DS's maths coprocessor inline Fixed Fixed::operator /(const Fixed a) const { //printf("%d %d\n", (long long)g << BP, a.g); return Fixed(RAW, int( div64((long long)g << BP, a.g) ) ); } #else inline Fixed Fixed::operator /(const Fixed a) const { return Fixed(RAW, int( (((long long)g << BP2) / (long long)(a.g)) >> BP) ); //return Fixed(RAW, int( (((long long)g << BP) / (long long)(a.g)) ) ); } #endif inline Fixed Fixed::operator *(unsigned short a) const { return operator*(Fixed(a)); } inline Fixed Fixed::operator *(int a) const { return operator*(Fixed(a)); } inline Fixed Fixed::operator +(float a) const { return Fixed(RAW, g + Fixed(a).g); } inline Fixed Fixed::operator -(float a) const { return Fixed(RAW, g - Fixed(a).g); } inline Fixed Fixed::operator *(float a) const { return Fixed(RAW, (g>>BPhalf) * (Fixed(a).g>>BPhalf) ); } //inline Fixed Fixed::operator /(float a) const { return Fixed(RAW, int( (((long long)g << BP2) / (long long)(Fixed(a).g)) >> BP) ); } inline Fixed Fixed::operator /(float a) const { return operator/(Fixed(a)); } inline Fixed Fixed::operator +(double a) const { return Fixed(RAW, g + Fixed(a).g); } inline Fixed Fixed::operator -(double a) const { return Fixed(RAW, g - Fixed(a).g); } inline Fixed Fixed::operator *(double a) const { return Fixed(RAW, (g>>BPhalf) * (Fixed(a).g>>BPhalf) ); } //inline Fixed Fixed::operator /(double a) const { return Fixed(RAW, int( (((long long)g << BP2) / (long long)(Fixed(a).g)) >> BP) ); } inline Fixed Fixed::operator /(double a) const { return operator/(Fixed(a)); } inline Fixed Fixed::operator >>(int a) const { return Fixed(RAW, g >> a); } inline Fixed Fixed::operator <<(int a) const { return Fixed(RAW, g << a); } inline Fixed& Fixed::operator +=(Fixed a) { return *this = *this + a; } inline Fixed& Fixed::operator -=(Fixed a) { return *this = *this - a; } inline Fixed& Fixed::operator *=(Fixed a) { return *this = *this * a; } //inline Fixed& Fixed::operator /=(Fixed a) { return *this = *this / a; } inline Fixed& Fixed::operator /=(Fixed a) { return *this = operator/(a); } inline Fixed& Fixed::operator +=(int a) { return *this = *this + (Fixed)a; } inline Fixed& Fixed::operator -=(int a) { return *this = *this - (Fixed)a; } inline Fixed& Fixed::operator *=(int a) { return *this = *this * (Fixed)a; } //inline Fixed& Fixed::operator /=(int a) { return *this = *this / (Fixed)a; } inline Fixed& Fixed::operator /=(int a) { return *this = operator/((Fixed)a); } inline Fixed& Fixed::operator +=(long a) { return *this = *this + (Fixed)a; } inline Fixed& Fixed::operator -=(long a) { return *this = *this - (Fixed)a; } inline Fixed& Fixed::operator *=(long a) { return *this = *this * (Fixed)a; } //inline Fixed& Fixed::operator /=(long a) { return *this = *this / (Fixed)a; } inline Fixed& Fixed::operator /=(long a) { return *this = operator/((Fixed)a); } inline Fixed& Fixed::operator +=(float a) { return *this = *this + a; } inline Fixed& Fixed::operator -=(float a) { return *this = *this - a; } inline Fixed& Fixed::operator *=(float a) { return *this = *this * a; } //inline Fixed& Fixed::operator /=(float a) { return *this = *this / a; } inline Fixed& Fixed::operator /=(float a) { return *this = operator/(a); } inline Fixed& Fixed::operator +=(double a) { return *this = *this + a; } inline Fixed& Fixed::operator -=(double a) { return *this = *this - a; } inline Fixed& Fixed::operator *=(double a) { return *this = *this * a; } //inline Fixed& Fixed::operator /=(double a) { return *this = *this / a; } inline Fixed& Fixed::operator /=(double a) { return *this = operator/(a); } inline Fixed operator +(int a, const Fixed b) { return Fixed(a)+b; } inline Fixed operator -(int a, const Fixed b) { return Fixed(a)-b; } inline Fixed operator *(int a, const Fixed b) { return Fixed(a)*b; } inline Fixed operator /(int a, const Fixed b) { return Fixed(a)/b; }; inline Fixed operator +(float a, const Fixed b) { return Fixed(a)+b; } inline Fixed operator -(float a, const Fixed b) { return Fixed(a)-b; } inline Fixed operator *(float a, const Fixed b) { return Fixed(a)*b; } inline Fixed operator /(float a, const Fixed b) { return Fixed(a)/b; } inline bool Fixed::operator ==(const Fixed a) const { return g == a.g; } inline bool Fixed::operator !=(const Fixed a) const { return g != a.g; } inline bool Fixed::operator <=(const Fixed a) const { return g <= a.g; } inline bool Fixed::operator >=(const Fixed a) const { return g >= a.g; } inline bool Fixed::operator <(const Fixed a) const { return g < a.g; } inline bool Fixed::operator >(const Fixed a) const { return g > a.g; } inline bool Fixed::operator ==(float a) const { return g == Fixed(a).g; } inline bool Fixed::operator !=(float a) const { return g != Fixed(a).g; } inline bool Fixed::operator <=(float a) const { return g <= Fixed(a).g; } inline bool Fixed::operator >=(float a) const { return g >= Fixed(a).g; } inline bool Fixed::operator <(float a) const { return g < Fixed(a).g; } inline bool Fixed::operator >(float a) const { return g > Fixed(a).g; } inline bool Fixed::operator ==(double a) const { return g == Fixed(a).g; } inline bool Fixed::operator !=(double a) const { return g != Fixed(a).g; } inline bool Fixed::operator <=(double a) const { return g <= Fixed(a).g; } inline bool Fixed::operator >=(double a) const { return g >= Fixed(a).g; } inline bool Fixed::operator <(double a) const { return g < Fixed(a).g; } inline bool Fixed::operator >(double a) const { return g > Fixed(a).g; } inline bool Fixed::operator >(int a) const { return g > Fixed(a).g; } inline bool Fixed::operator <(int a) const { return g < Fixed(a).g; } inline bool Fixed::operator >=(int a) const{ return g >= Fixed(a).g; }; inline bool Fixed::operator <=(int a) const{ return g <= Fixed(a).g; }; inline bool operator ==(float a, const Fixed b) { return Fixed(a) == b; } inline bool operator !=(float a, const Fixed b) { return Fixed(a) != b; } inline bool operator <=(float a, const Fixed b) { return Fixed(a) <= b; } inline bool operator >=(float a, const Fixed b) { return Fixed(a) >= b; } inline bool operator <(float a, const Fixed b) { return Fixed(a) < b; } inline bool operator >(float a, const Fixed b) { return Fixed(a) > b; } inline Fixed operator +(double a, const Fixed b) { return Fixed(a)+b; } inline Fixed operator -(double a, const Fixed b) { return Fixed(a)-b; } inline Fixed operator *(double a, const Fixed b) { return Fixed(a)*b; } inline Fixed operator /(double a, const Fixed b) { return Fixed(a)/b; } inline bool operator ==(double a, const Fixed b) { return Fixed(a) == b; } inline bool operator !=(double a, const Fixed b) { return Fixed(a) != b; } inline bool operator <=(double a, const Fixed b) { return Fixed(a) <= b; } inline bool operator >=(double a, const Fixed b) { return Fixed(a) >= b; } inline bool operator <(double a, const Fixed b) { return Fixed(a) < b; } inline bool operator >(double a, const Fixed b) { return Fixed(a) > b; } inline bool operator ==(int a, const Fixed b) { return Fixed(a) == b; } inline bool operator !=(int a, const Fixed b) { return Fixed(a) != b; } inline bool operator <=(int a, const Fixed b) { return Fixed(a) <= b; } inline bool operator >=(int a, const Fixed b) { return Fixed(a) >= b; } inline bool operator <(int a, const Fixed b) { return Fixed(a) < b; } inline bool operator >(int a, const Fixed b) { return Fixed(a) > b; } inline int& operator +=(int& a, const Fixed b) { a = (Fixed)a + b; return a; } inline int& operator -=(int& a, const Fixed b) { a = (Fixed)a - b; return a; } inline int& operator *=(int& a, const Fixed b) { a = (Fixed)a * b; return a; } inline int& operator /=(int& a, const Fixed b) { a = (Fixed)a / b; return a; } inline long& operator +=(long& a, const Fixed b) { a = (Fixed)a + b; return a; } inline long& operator -=(long& a, const Fixed b) { a = (Fixed)a - b; return a; } inline long& operator *=(long& a, const Fixed b) { a = (Fixed)a * b; return a; } inline long& operator /=(long& a, const Fixed b) { a = (Fixed)a / b; return a; } inline float& operator +=(float& a, const Fixed b) { a = a + b; return a; } inline float& operator -=(float& a, const Fixed b) { a = a - b; return a; } inline float& operator *=(float& a, const Fixed b) { a = a * b; return a; } inline float& operator /=(float& a, const Fixed b) { a = a / b; return a; } inline double& operator +=(double& a, const Fixed b) { a = a + b; return a; } inline double& operator -=(double& a, const Fixed b) { a = a - b; return a; } inline double& operator *=(double& a, const Fixed b) { a = a * b; return a; } inline double& operator /=(double& a, const Fixed b) { a = a / b; return a; } inline Fixed Fixed::abs() { return (g>0) ? Fixed(RAW, g) : Fixed(RAW, -g); } inline Fixed abs(Fixed f) { return f.abs(); } //inline Fixed atan2(Fixed a, Fixed b) { return atan2f((float) a, (float) b); } inline Fixed atan2(Fixed y, Fixed x) { Fixed abs_y = y.abs() + FIXED_EPSILON; // avoid 0/0 Fixed r, angle; if(x >= 0.0f) { r = (x - abs_y) / (x + abs_y); angle = 3.1415926/4.0; } else { r = (x + abs_y) / (abs_y - x); angle = 3.0*3.1415926/4.0; } angle += Fixed(0.1963) * (r * r * r) - Fixed(0.9817) * r; return (y < 0) ? -angle : angle; } #if TARGET_IS_NDS static inline long nds_sqrt64(long long a) { SQRT_CR = SQRT_64; while(SQRT_CR & SQRT_BUSY); SQRT_PARAM64 = a; while(SQRT_CR & SQRT_BUSY); return SQRT_RESULT32; } static inline int32 div6464(int64 num, int64 den) { DIV_CR = DIV_64_64; while(DIV_CR & DIV_BUSY); DIV_NUMERATOR64 = num; DIV_DENOMINATOR64 = den; while(DIV_CR & DIV_BUSY); return (DIV_RESULT32); } inline Fixed Fixed::sqrt() { return Fixed(RAW, nds_sqrt64(((long long)(g))<>= 2 ) { if ( ( left & -m ) > root ) left -= ( root += m ), root += m; root >>= 1; } return Fixed(RAW, root); } #endif inline Fixed sqrt(Fixed a) { return a.sqrt(); } inline Fixed sqrtf(Fixed a) { return a.sqrt(); } #endif #ifdef TARGET_IS_NDS // Use the libnds lookup tables for trigonometry functions inline Fixed Fixed::cosf() { int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; if(idx < 0) idx += 512; return Fixed(RAW, COS_bin[idx] << 4); } inline Fixed cosf(Fixed x) { return x.cosf(); } inline Fixed Fixed::sinf() { int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; if(idx < 0) idx += 512; return Fixed(RAW, SIN_bin[idx] << 4); } inline Fixed sinf(Fixed x) { return x.sinf(); } inline Fixed Fixed::tanf() { int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; if(idx < 0) idx += 512; return Fixed(RAW, TAN_bin[idx] << 4); } inline Fixed tanf(Fixed x) { return x.tanf(); } #endif numptyphysics-0.3.10/external/Box2D/Source/Common/b2BlockAllocator.cpp000066400000000000000000000117271425065123200256150ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include #include "b2BlockAllocator.h" #include #include #include int32 b2BlockAllocator::s_blockSizes[b2_blockSizes] = { 16, // 0 32, // 1 64, // 2 96, // 3 128, // 4 160, // 5 192, // 6 224, // 7 256, // 8 320, // 9 384, // 10 448, // 11 512, // 12 640, // 13 }; uint8 b2BlockAllocator::s_blockSizeLookup[b2_maxBlockSize + 1]; bool b2BlockAllocator::s_blockSizeLookupInitialized; struct b2Chunk { int32 blockSize; b2Block* blocks; }; struct b2Block { b2Block* next; }; b2BlockAllocator::b2BlockAllocator() { b2Assert(b2_blockSizes < UCHAR_MAX); m_chunkSpace = b2_chunkArrayIncrement; m_chunkCount = 0; m_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk)); memset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk)); memset(m_freeLists, 0, sizeof(m_freeLists)); if (s_blockSizeLookupInitialized == false) { int32 j = 0; for (int32 i = 1; i <= b2_maxBlockSize; ++i) { b2Assert(j < b2_blockSizes); if (i <= s_blockSizes[j]) { s_blockSizeLookup[i] = (uint8)j; } else { ++j; s_blockSizeLookup[i] = (uint8)j; } } s_blockSizeLookupInitialized = true; } } b2BlockAllocator::~b2BlockAllocator() { for (int32 i = 0; i < m_chunkCount; ++i) { b2Free(m_chunks[i].blocks); } b2Free(m_chunks); } void* b2BlockAllocator::Allocate(int32 size) { if (size == 0) return NULL; b2Assert(0 < size && size <= b2_maxBlockSize); int32 index = s_blockSizeLookup[size]; b2Assert(0 <= index && index < b2_blockSizes); if (m_freeLists[index]) { b2Block* block = m_freeLists[index]; m_freeLists[index] = block->next; return block; } else { if (m_chunkCount == m_chunkSpace) { b2Chunk* oldChunks = m_chunks; m_chunkSpace += b2_chunkArrayIncrement; m_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk)); memcpy(m_chunks, oldChunks, m_chunkCount * sizeof(b2Chunk)); memset(m_chunks + m_chunkCount, 0, b2_chunkArrayIncrement * sizeof(b2Chunk)); b2Free(oldChunks); } b2Chunk* chunk = m_chunks + m_chunkCount; chunk->blocks = (b2Block*)b2Alloc(b2_chunkSize); #if defined(_DEBUG) memset(chunk->blocks, 0xcd, b2_chunkSize); #endif int32 blockSize = s_blockSizes[index]; chunk->blockSize = blockSize; int32 blockCount = b2_chunkSize / blockSize; b2Assert(blockCount * blockSize <= b2_chunkSize); for (int32 i = 0; i < blockCount - 1; ++i) { b2Block* block = (b2Block*)((int8*)chunk->blocks + blockSize * i); b2Block* next = (b2Block*)((int8*)chunk->blocks + blockSize * (i + 1)); block->next = next; } b2Block* last = (b2Block*)((int8*)chunk->blocks + blockSize * (blockCount - 1)); last->next = NULL; m_freeLists[index] = chunk->blocks->next; ++m_chunkCount; return chunk->blocks; } } void b2BlockAllocator::Free(void* p, int32 size) { if (size == 0) { return; } b2Assert(0 < size && size <= b2_maxBlockSize); int32 index = s_blockSizeLookup[size]; b2Assert(0 <= index && index < b2_blockSizes); #ifdef _DEBUG // Verify the memory address and size is valid. int32 blockSize = s_blockSizes[index]; bool found = false; int32 gap = (int32)((int8*)&m_chunks->blocks - (int8*)m_chunks); for (int32 i = 0; i < m_chunkCount; ++i) { b2Chunk* chunk = m_chunks + i; if (chunk->blockSize != blockSize) { b2Assert( (int8*)p + blockSize <= (int8*)chunk->blocks || (int8*)chunk->blocks + b2_chunkSize + gap <= (int8*)p); } else { if ((int8*)chunk->blocks <= (int8*)p && (int8*)p + blockSize <= (int8*)chunk->blocks + b2_chunkSize) { found = true; } } } b2Assert(found); memset(p, 0xfd, blockSize); #endif b2Block* block = (b2Block*)p; block->next = m_freeLists[index]; m_freeLists[index] = block; } void b2BlockAllocator::Clear() { for (int32 i = 0; i < m_chunkCount; ++i) { b2Free(m_chunks[i].blocks); } m_chunkCount = 0; memset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk)); memset(m_freeLists, 0, sizeof(m_freeLists)); } numptyphysics-0.3.10/external/Box2D/Source/Common/b2BlockAllocator.h000066400000000000000000000034411425065123200252540ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_BLOCK_ALLOCATOR_H #define B2_BLOCK_ALLOCATOR_H #include "b2Settings.h" const int32 b2_chunkSize = 4096; const int32 b2_maxBlockSize = 640; const int32 b2_blockSizes = 14; const int32 b2_chunkArrayIncrement = 128; struct b2Block; struct b2Chunk; // This is a small object allocator used for allocating small // objects that persist for more than one time step. // See: http://www.codeproject.com/useritems/Small_Block_Allocator.asp class b2BlockAllocator { public: b2BlockAllocator(); ~b2BlockAllocator(); void* Allocate(int32 size); void Free(void* p, int32 size); void Clear(); private: b2Chunk* m_chunks; int32 m_chunkCount; int32 m_chunkSpace; b2Block* m_freeLists[b2_blockSizes]; static int32 s_blockSizes[b2_blockSizes]; static uint8 s_blockSizeLookup[b2_maxBlockSize + 1]; static bool s_blockSizeLookupInitialized; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Common/b2Math.cpp000066400000000000000000000033311425065123200236030ustar00rootroot00000000000000/* * Copyright (c) 2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Math.h" const b2Vec2 b2Vec2_zero(0.0f, 0.0f); const b2Mat22 b2Mat22_identity(1.0f, 0.0f, 0.0f, 1.0f); const b2XForm b2XForm_identity(b2Vec2_zero, b2Mat22_identity); void b2Sweep::GetXForm(b2XForm* xf, float32 t) const { // center = p + R * localCenter if (1.0f - t0 > B2_FLT_EPSILON) { float32 alpha = (t - t0) / (1.0f - t0); xf->position = (1.0f - alpha) * c0 + alpha * c; float32 angle = (1.0f - alpha) * a0 + alpha * a; xf->R.Set(angle); } else { xf->position = c; xf->R.Set(a); } // Shift to origin xf->position -= b2Mul(xf->R, localCenter); } void b2Sweep::Advance(float32 t) { if (t0 < t && 1.0f - t0 > B2_FLT_EPSILON) { float32 alpha = (t - t0) / (1.0f - t0); c0 = (1.0f - alpha) * c0 + alpha * c; a0 = (1.0f - alpha) * a0 + alpha * a; t0 = t; } } numptyphysics-0.3.10/external/Box2D/Source/Common/b2Math.h000066400000000000000000000345451425065123200232630ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_MATH_H #define B2_MATH_H #include "b2Settings.h" #include #include #include #include #ifdef TARGET_FLOAT32_IS_FIXED inline Fixed b2Min(const Fixed& a, const Fixed& b) { return a < b ? a : b; } inline Fixed b2Max(const Fixed& a, const Fixed& b) { return a > b ? a : b; } inline Fixed b2Clamp(Fixed a, Fixed low, Fixed high) { return b2Max(low, b2Min(a, high)); } inline bool b2IsValid(Fixed x) { return true; } #define b2Sqrt(x) sqrt(x) #define b2Atan2(y, x) atan2(y, x) #else /// This function is used to ensure that a floating point number is /// not a NaN or infinity. inline bool b2IsValid(float32 x) { #ifdef _MSC_VER return _finite(x) != 0; #else return std::isfinite(x) != 0; #endif } /// This is a approximate yet fast inverse square-root. inline float32 b2InvSqrt(float32 x) { union { float32 x; int32 i; } convert; convert.x = x; float32 xhalf = 0.5f * x; convert.i = 0x5f3759df - (convert.i >> 1); x = convert.x; x = x * (1.5f - xhalf * x * x); return x; } #define b2Sqrt(x) sqrtf(x) #define b2Atan2(y, x) atan2f(y, x) #endif inline float32 b2Abs(float32 a) { return a > 0.0f ? a : -a; } /// A 2D column vector. struct b2Vec2 { /// Default constructor does nothing (for performance). b2Vec2() {} /// Construct using coordinates. b2Vec2(float32 x, float32 y) : x(x), y(y) {} /// Set this vector to all zeros. void SetZero() { x = 0.0f; y = 0.0f; } /// Set this vector to some specified coordinates. void Set(float32 x_, float32 y_) { x = x_; y = y_; } /// Negate this vector. b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; } /// Add a vector to this vector. void operator += (const b2Vec2& v) { x += v.x; y += v.y; } /// Subtract a vector from this vector. void operator -= (const b2Vec2& v) { x -= v.x; y -= v.y; } /// Multiply this vector by a scalar. void operator *= (float32 a) { x *= a; y *= a; } /// Get the length of this vector (the norm). float32 Length() const { #ifdef TARGET_FLOAT32_IS_FIXED float est = b2Abs(x) + b2Abs(y); if(est == 0.0f) { return 0.0; } else if(est < 0.1) { return (1.0/256.0) * b2Vec2(x<<8, y<<8).Length(); } else if(est < 180.0f) { return b2Sqrt(x * x + y * y); } else { return 256.0 * (b2Vec2(x>>8, y>>8).Length()); } #else return b2Sqrt(x * x + y * y); #endif } /// Get the length squared. For performance, use this instead of /// b2Vec2::Length (if possible). float32 LengthSquared() const { return x * x + y * y; } /// Convert this vector into a unit vector. Returns the length. #ifdef TARGET_FLOAT32_IS_FIXED float32 Normalize() { float32 length = Length(); if (length < B2_FLT_EPSILON) { return 0.0f; } #ifdef NORMALIZE_BY_INVERT_MULTIPLY if (length < (1.0/16.0)) { x = x << 4; y = y << 4; return (1.0/16.0)*Normalize(); } else if(length > 16.0) { x = x >> 4; y = y >> 4; return 16.0*Normalize(); } float32 invLength = 1.0f / length; x *= invLength; y *= invLength; #else x /= length; y /= length; #endif return length; } #else float32 Normalize() { float32 length = Length(); if (length < B2_FLT_EPSILON) { return 0.0f; } float32 invLength = 1.0f / length; x *= invLength; y *= invLength; return length; } #endif /// Does this vector contain finite coordinates? bool IsValid() const { return b2IsValid(x) && b2IsValid(y); } float32 x, y; }; /// A 2-by-2 matrix. Stored in column-major order. struct b2Mat22 { /// The default constructor does nothing (for performance). b2Mat22() {} /// Construct this matrix using columns. b2Mat22(const b2Vec2& c1, const b2Vec2& c2) { col1 = c1; col2 = c2; } /// Construct this matrix using scalars. b2Mat22(float32 a11, float32 a12, float32 a21, float32 a22) { col1.x = a11; col1.y = a21; col2.x = a12; col2.y = a22; } /// Construct this matrix using an angle. This matrix becomes /// an orthonormal rotation matrix. explicit b2Mat22(float32 angle) { float32 c = cosf(angle), s = sinf(angle); col1.x = c; col2.x = -s; col1.y = s; col2.y = c; } /// Initialize this matrix using columns. void Set(const b2Vec2& c1, const b2Vec2& c2) { col1 = c1; col2 = c2; } /// Initialize this matrix using an angle. This matrix becomes /// an orthonormal rotation matrix. void Set(float32 angle) { float32 c = cosf(angle), s = sinf(angle); col1.x = c; col2.x = -s; col1.y = s; col2.y = c; } /// Set this to the identity matrix. void SetIdentity() { col1.x = 1.0f; col2.x = 0.0f; col1.y = 0.0f; col2.y = 1.0f; } /// Set this matrix to all zeros. void SetZero() { col1.x = 0.0f; col2.x = 0.0f; col1.y = 0.0f; col2.y = 0.0f; } /// Extract the angle from this matrix (assumed to be /// a rotation matrix). float32 GetAngle() const { return b2Atan2(col1.y, col1.x); } #ifdef TARGET_FLOAT32_IS_FIXED /// Compute the inverse of this matrix, such that inv(A) * A = identity. b2Mat22 Invert() const { float32 a = col1.x, b = col2.x, c = col1.y, d = col2.y; float32 det = a * d - b * c; b2Mat22 B; int n = 0; if(b2Abs(det) <= (B2_FLT_EPSILON<<8)) { n = 3; a = a<= 16.0)? 4 : 0; b2Assert(det != 0.0f); det = float32(1<> n; B.col2.x = (-det * b) >> n; B.col1.y = (-det * c) >> n; B.col2.y = ( det * a) >> n; } return B; } // Solve A * x = b b2Vec2 Solve(const b2Vec2& b) const { float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; float32 det = a11 * a22 - a12 * a21; int n = 0; b2Vec2 x; if(b2Abs(det) <= (B2_FLT_EPSILON<<8)) { n = 3; a11 = col1.x<= 16.0) ? 4 : 0; b2Assert(det != 0.0f); det = float32(1<> n; x.y = (det * (a11 * b.y - a21 * b.x)) >> n; } return x; } #else b2Mat22 Invert() const { float32 a = col1.x, b = col2.x, c = col1.y, d = col2.y; b2Mat22 B; float32 det = a * d - b * c; b2Assert(det != 0.0f); det = float32(1.0f) / det; B.col1.x = det * d; B.col2.x = -det * b; B.col1.y = -det * c; B.col2.y = det * a; return B; } /// Solve A * x = b, where b is a column vector. This is more efficient /// than computing the inverse in one-shot cases. b2Vec2 Solve(const b2Vec2& b) const { float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; float32 det = a11 * a22 - a12 * a21; b2Assert(det != 0.0f); det = 1.0f / det; b2Vec2 x; x.x = det * (a22 * b.x - a12 * b.y); x.y = det * (a11 * b.y - a21 * b.x); return x; } #endif b2Vec2 col1, col2; }; /// A transform contains translation and rotation. It is used to represent /// the position and orientation of rigid frames. struct b2XForm { /// The default constructor does nothing (for performance). b2XForm() {} /// Initialize using a position vector and a rotation matrix. b2XForm(const b2Vec2& position, const b2Mat22& R) : position(position), R(R) {} /// Set this to the identity transform. void SetIdentity() { position.SetZero(); R.SetIdentity(); } b2Vec2 position; b2Mat22 R; }; /// This describes the motion of a body/shape for TOI computation. /// Shapes are defined with respect to the body origin, which may /// no coincide with the center of mass. However, to support dynamics /// we must interpolate the center of mass position. struct b2Sweep { /// Get the interpolated transform at a specific time. /// @param t the normalized time in [0,1]. void GetXForm(b2XForm* xf, float32 t) const; /// Advance the sweep forward, yielding a new initial state. /// @param t the new initial time. void Advance(float32 t); b2Vec2 localCenter; ///< local center of mass position b2Vec2 c0, c; ///< center world positions float32 a0, a; ///< world angles float32 t0; ///< time interval = [t0,1], where t0 is in [0,1] }; extern const b2Vec2 b2Vec2_zero; extern const b2Mat22 b2Mat22_identity; extern const b2XForm b2XForm_identity; /// Peform the dot product on two vectors. inline float32 b2Dot(const b2Vec2& a, const b2Vec2& b) { return a.x * b.x + a.y * b.y; } /// Perform the cross product on two vectors. In 2D this produces a scalar. inline float32 b2Cross(const b2Vec2& a, const b2Vec2& b) { return a.x * b.y - a.y * b.x; } /// Perform the cross product on a vector and a scalar. In 2D this produces /// a vector. inline b2Vec2 b2Cross(const b2Vec2& a, float32 s) { b2Vec2 v; v.Set(s * a.y, -s * a.x); return v; } /// Perform the cross product on a scalar and a vector. In 2D this produces /// a vector. inline b2Vec2 b2Cross(float32 s, const b2Vec2& a) { b2Vec2 v; v.Set(-s * a.y, s * a.x); return v; } /// Multiply a matrix times a vector. If a rotation matrix is provided, /// then this transforms the vector from one frame to another. inline b2Vec2 b2Mul(const b2Mat22& A, const b2Vec2& v) { b2Vec2 u; u.Set(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.y * v.y); return u; } /// Multiply a matrix transpose times a vector. If a rotation matrix is provided, /// then this transforms the vector from one frame to another (inverse transform). inline b2Vec2 b2MulT(const b2Mat22& A, const b2Vec2& v) { b2Vec2 u; u.Set(b2Dot(v, A.col1), b2Dot(v, A.col2)); return u; } /// Add two vectors component-wise. inline b2Vec2 operator + (const b2Vec2& a, const b2Vec2& b) { b2Vec2 v; v.Set(a.x + b.x, a.y + b.y); return v; } /// Subtract two vectors component-wise. inline b2Vec2 operator - (const b2Vec2& a, const b2Vec2& b) { b2Vec2 v; v.Set(a.x - b.x, a.y - b.y); return v; } inline b2Vec2 operator * (float32 s, const b2Vec2& a) { b2Vec2 v; v.Set(s * a.x, s * a.y); return v; } inline bool operator == (const b2Vec2& a, const b2Vec2& b) { return a.x == b.x && a.y == b.y; } inline float32 b2Distance(const b2Vec2& a, const b2Vec2& b) { b2Vec2 c = a - b; return c.Length(); } inline float32 b2DistanceSquared(const b2Vec2& a, const b2Vec2& b) { b2Vec2 c = a - b; return b2Dot(c, c); } inline b2Mat22 operator + (const b2Mat22& A, const b2Mat22& B) { b2Mat22 C; C.Set(A.col1 + B.col1, A.col2 + B.col2); return C; } // A * B inline b2Mat22 b2Mul(const b2Mat22& A, const b2Mat22& B) { b2Mat22 C; C.Set(b2Mul(A, B.col1), b2Mul(A, B.col2)); return C; } // A^T * B inline b2Mat22 b2MulT(const b2Mat22& A, const b2Mat22& B) { b2Vec2 c1; c1.Set(b2Dot(A.col1, B.col1), b2Dot(A.col2, B.col1)); b2Vec2 c2; c2.Set(b2Dot(A.col1, B.col2), b2Dot(A.col2, B.col2)); b2Mat22 C; C.Set(c1, c2); return C; } inline b2Vec2 b2Mul(const b2XForm& T, const b2Vec2& v) { return T.position + b2Mul(T.R, v); } inline b2Vec2 b2MulT(const b2XForm& T, const b2Vec2& v) { return b2MulT(T.R, v - T.position); } inline b2Vec2 b2Abs(const b2Vec2& a) { b2Vec2 b; b.Set(b2Abs(a.x), b2Abs(a.y)); return b; } inline b2Mat22 b2Abs(const b2Mat22& A) { b2Mat22 B; B.Set(b2Abs(A.col1), b2Abs(A.col2)); return B; } template inline T b2Min(T a, T b) { return a < b ? a : b; } inline b2Vec2 b2Min(const b2Vec2& a, const b2Vec2& b) { b2Vec2 c; c.x = b2Min(a.x, b.x); c.y = b2Min(a.y, b.y); return c; } template inline T b2Max(T a, T b) { return a > b ? a : b; } inline b2Vec2 b2Max(const b2Vec2& a, const b2Vec2& b) { b2Vec2 c; c.x = b2Max(a.x, b.x); c.y = b2Max(a.y, b.y); return c; } template inline T b2Clamp(T a, T low, T high) { return b2Max(low, b2Min(a, high)); } inline b2Vec2 b2Clamp(const b2Vec2& a, const b2Vec2& low, const b2Vec2& high) { return b2Max(low, b2Min(a, high)); } template inline void b2Swap(T& a, T& b) { T tmp = a; a = b; b = tmp; } #define RAND_LIMIT 32767 // Random number in range [-1,1] inline float32 b2Random() { float32 r = (float32)(rand() & (RAND_LIMIT)); r /= RAND_LIMIT; r = 2.0f * r - 1.0f; return r; } /// Random floating point number in range [lo, hi] inline float32 b2Random(float32 lo, float32 hi) { float32 r = (float32)(rand() & (RAND_LIMIT)); r /= RAND_LIMIT; r = (hi - lo) * r + lo; return r; } /// "Next Largest Power of 2 /// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm /// that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with /// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next /// largest power of 2. For a 32-bit value:" inline uint32 b2NextPowerOfTwo(uint32 x) { x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); return x + 1; } inline bool b2IsPowerOfTwo(uint32 x) { bool result = x > 0 && (x & (x - 1)) == 0; return result; } #endif numptyphysics-0.3.10/external/Box2D/Source/Common/b2Settings.cpp000066400000000000000000000026731425065123200245220ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Settings.h" #include b2Version b2_version = {2, 0, 1}; int32 b2_byteCount = 0; // Memory allocators. Modify these to use your own allocator. void* b2Alloc(int32 size) { size += 4; b2_byteCount += size; char* bytes = (char*)malloc(size); *(int32*)bytes = size; return bytes + 4; } void b2Free(void* mem) { if (mem == NULL) { return; } char* bytes = (char*)mem; bytes -= 4; int32 size = *(int32*)bytes; b2Assert(b2_byteCount >= size); b2_byteCount -= size; free(bytes); } numptyphysics-0.3.10/external/Box2D/Source/Common/b2Settings.h000066400000000000000000000135251425065123200241650ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_SETTINGS_H #define B2_SETTINGS_H #include #include #define B2_NOT_USED(x) #define b2Assert(A) assert(A) // need to include NDS jtypes.h instead of // usual typedefs because NDS jtypes defines // them slightly differently, oh well. #ifdef TARGET_IS_NDS #include "jtypes.h" #else typedef signed char int8; typedef signed short int16; typedef signed int int32; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; #endif #ifdef TARGET_FLOAT32_IS_FIXED #include "Fixed.h" typedef Fixed float32; #define B2_FLT_MAX FIXED_MAX #define B2_FLT_EPSILON FIXED_EPSILON #define B2FORCE_SCALE(x) ((x)<<7) #define B2FORCE_INV_SCALE(x) ((x)>>7) #else typedef float float32; #define B2_FLT_MAX FLT_MAX #define B2_FLT_EPSILON FLT_EPSILON #define B2FORCE_SCALE(x) (x) #define B2FORCE_INV_SCALE(x) (x) #endif const float32 b2_pi = 3.14159265359f; /// @file /// Global tuning constants based on meters-kilograms-seconds (MKS) units. /// // Collision const int32 b2_maxManifoldPoints = 2; const int32 b2_maxPolygonVertices = 8; const int32 b2_maxProxies = 512*4; // this must be a power of two const int32 b2_maxPairs = 8 * b2_maxProxies; // this must be a power of two // Dynamics /// A small length used as a collision and constraint tolerance. Usually it is /// chosen to be numerically significant, but visually insignificant. const float32 b2_linearSlop = 0.005f; // 0.5 cm /// A small angle used as a collision and constraint tolerance. Usually it is /// chosen to be numerically significant, but visually insignificant. const float32 b2_angularSlop = 2.0f / 180.0f * b2_pi; // 2 degrees /// Continuous collision detection (CCD) works with core, shrunken shapes. This is the /// amount by which shapes are automatically shrunk to work with CCD. This must be /// larger than b2_linearSlop. const float32 b2_toiSlop = 8.0f * b2_linearSlop; /// Maximum number of contacts to be handled to solve a TOI island. const int32 b2_maxTOIContactsPerIsland = 32; /// A velocity threshold for elastic collisions. Any collision with a relative linear /// velocity below this threshold will be treated as inelastic. const float32 b2_velocityThreshold = 1.0f; // 1 m/s /// The maximum linear position correction used when solving constraints. This helps to /// prevent overshoot. const float32 b2_maxLinearCorrection = 0.2f; // 20 cm /// The maximum angular position correction used when solving constraints. This helps to /// prevent overshoot. const float32 b2_maxAngularCorrection = 8.0f / 180.0f * b2_pi; // 8 degrees /// The maximum linear velocity of a body. This limit is very large and is used /// to prevent numerical problems. You shouldn't need to adjust this. #ifdef TARGET_FLOAT32_IS_FIXED const float32 b2_maxLinearVelocity = 100.0f; #else const float32 b2_maxLinearVelocity = 200.0f; const float32 b2_maxLinearVelocitySquared = b2_maxLinearVelocity * b2_maxLinearVelocity; #endif /// The maximum angular velocity of a body. This limit is very large and is used /// to prevent numerical problems. You shouldn't need to adjust this. const float32 b2_maxAngularVelocity = 250.0f; #ifndef TARGET_FLOAT32_IS_FIXED const float32 b2_maxAngularVelocitySquared = b2_maxAngularVelocity * b2_maxAngularVelocity; #endif /// This scale factor controls how fast overlap is resolved. Ideally this would be 1 so /// that overlap is removed in one time step. However using values close to 1 often lead /// to overshoot. const float32 b2_contactBaumgarte = 0.2f; // Sleep /// The time that a body must be still before it will go to sleep. const float32 b2_timeToSleep = 0.5f; // half a second /// A body cannot sleep if its linear velocity is above this tolerance. const float32 b2_linearSleepTolerance = 0.01f; // 1 cm/s /// A body cannot sleep if its angular velocity is above this tolerance. const float32 b2_angularSleepTolerance = 2.0f / 180.0f; // 2 degrees/s // Memory Allocation /// The current number of bytes allocated through b2Alloc. extern int32 b2_byteCount; /// Implement this function to use your own memory allocator. void* b2Alloc(int32 size); /// If you implement b2Alloc, you should also implement this function. void b2Free(void* mem); /// Version numbering scheme. /// See http://en.wikipedia.org/wiki/Software_versioning struct b2Version { int32 major; ///< significant changes int32 minor; ///< incremental changes int32 revision; ///< bug fixes }; /// Current version. extern b2Version b2_version; /// Friction mixing law. Feel free to customize this. inline float32 b2MixFriction(float32 friction1, float32 friction2) { return sqrtf(friction1 * friction2); } /// Restitution mixing law. Feel free to customize this. inline float32 b2MixRestitution(float32 restitution1, float32 restitution2) { return restitution1 > restitution2 ? restitution1 : restitution2; } #endif numptyphysics-0.3.10/external/Box2D/Source/Common/b2StackAllocator.cpp000066400000000000000000000040751425065123200256260ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2StackAllocator.h" #include "b2Math.h" b2StackAllocator::b2StackAllocator() { m_index = 0; m_allocation = 0; m_maxAllocation = 0; m_entryCount = 0; } b2StackAllocator::~b2StackAllocator() { b2Assert(m_index == 0); b2Assert(m_entryCount == 0); } void* b2StackAllocator::Allocate(int32 size) { b2Assert(m_entryCount < b2_maxStackEntries); b2StackEntry* entry = m_entries + m_entryCount; entry->size = size; if (m_index + size > b2_stackSize) { entry->data = (char*)b2Alloc(size); entry->usedMalloc = true; } else { entry->data = m_data + m_index; entry->usedMalloc = false; m_index += size; } m_allocation += size; m_maxAllocation = b2Max(m_maxAllocation, m_allocation); ++m_entryCount; return entry->data; } void b2StackAllocator::Free(void* p) { b2Assert(m_entryCount > 0); b2StackEntry* entry = m_entries + m_entryCount - 1; b2Assert(p == entry->data); if (entry->usedMalloc) { b2Free(p); } else { m_index -= entry->size; } m_allocation -= entry->size; --m_entryCount; p = NULL; } int32 b2StackAllocator::GetMaxAllocation() const { return m_maxAllocation; } numptyphysics-0.3.10/external/Box2D/Source/Common/b2StackAllocator.h000066400000000000000000000032721425065123200252710ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_STACK_ALLOCATOR_H #define B2_STACK_ALLOCATOR_H #include "b2Settings.h" const int32 b2_stackSize = 100 * 1024; // 100k const int32 b2_maxStackEntries = 32; struct b2StackEntry { char* data; int32 size; bool usedMalloc; }; // This is a stack allocator used for fast per step allocations. // You must nest allocate/free pairs. The code will assert // if you try to interleave multiple allocate/free pairs. class b2StackAllocator { public: b2StackAllocator(); ~b2StackAllocator(); void* Allocate(int32 size); void Free(void* p); int32 GetMaxAllocation() const; private: char m_data[b2_stackSize]; int32 m_index; int32 m_allocation; int32 m_maxAllocation; b2StackEntry m_entries[b2_maxStackEntries]; int32 m_entryCount; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Common/jtypes.h000066400000000000000000000101171425065123200234510ustar00rootroot00000000000000/*--------------------------------------------------------------------------------- $Id: jtypes.h,v 1.17 2007/07/18 05:20:45 wntrmute Exp $ jtypes.h -- Common types (and a few useful macros) Copyright (C) 2005 Michael Noland (joat) Jason Rogers (dovoto) Dave Murphy (WinterMute) Chris Double (doublec) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. ---------------------------------------------------------------------------------*/ #ifndef NDS_JTYPES_INCLUDE #define NDS_JTYPES_INCLUDE //--------------------------------------------------------------------------------- #define PACKED __attribute__ ((packed)) #define packed_struct struct PACKED //--------------------------------------------------------------------------------- // libgba compatible section macros //--------------------------------------------------------------------------------- #define ITCM_CODE __attribute__((section(".itcm"), long_call)) #define DTCM_DATA __attribute__((section(".dtcm"))) #define DTCM_BSS __attribute__((section(".sbss"))) #define ALIGN(m) __attribute__((aligned (m))) #define PACKED __attribute__ ((packed)) #define packed_struct struct PACKED //--------------------------------------------------------------------------------- // These are linked to the bin2o macro in the Makefile //--------------------------------------------------------------------------------- #define GETRAW(name) (name) #define GETRAWSIZE(name) ((int)name##_size) #define GETRAWEND(name) ((int)name##_end) #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #define BIT(n) (1 << (n)) // define libnds types in terms of stdint #include typedef uint8_t uint8; typedef uint16_t uint16; typedef uint32_t uint32; typedef uint64_t uint64; typedef int8_t int8; typedef int16_t int16; typedef int32_t int32; typedef int64_t int64; //typedef float float32; typedef double float64; typedef volatile uint8_t vuint8; typedef volatile uint16_t vuint16; typedef volatile uint32_t vuint32; typedef volatile uint64_t vuint64; typedef volatile int8_t vint8; typedef volatile int16_t vint16; typedef volatile int32_t vint32; typedef volatile int64_t vint64; typedef volatile float vfloat32; typedef volatile float64 vfloat64; typedef uint8_t byte; typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; typedef int8_t s8; typedef int16_t s16; typedef int32_t s32; typedef int64_t s64; typedef volatile u8 vu8; typedef volatile u16 vu16; typedef volatile u32 vu32; typedef volatile u64 vu64; typedef volatile s8 vs8; typedef volatile s16 vs16; typedef volatile s32 vs32; typedef volatile s64 vs64; typedef struct touchPosition { int16 x; int16 y; int16 px; int16 py; int16 z1; int16 z2; } touchPosition; #ifndef __cplusplus /** C++ compatible bool for C */ typedef enum { false, true } bool; #endif // Handy function pointer typedefs typedef void ( * IntFn)(void); typedef void (* VoidFunctionPointer)(void); typedef void (* fp)(void); //--------------------------------------------------------------------------------- #endif //--------------------------------------------------------------------------------- numptyphysics-0.3.10/external/Box2D/Source/Dynamics/000077500000000000000000000000001425065123200223015ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/000077500000000000000000000000001425065123200240575ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2CircleContact.cpp000066400000000000000000000074171425065123200275350ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include #include "b2CircleContact.h" #include "../b2Body.h" #include "../b2WorldCallbacks.h" #include "../../Common/b2BlockAllocator.h" #include b2Contact* b2CircleContact::Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator) { void* mem = allocator->Allocate(sizeof(b2CircleContact)); return new (mem) b2CircleContact(shape1, shape2); } void b2CircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) { ((b2CircleContact*)contact)->~b2CircleContact(); allocator->Free(contact, sizeof(b2CircleContact)); } b2CircleContact::b2CircleContact(b2Shape* s1, b2Shape* s2) : b2Contact(s1, s2) { b2Assert(m_shape1->GetType() == e_circleShape); b2Assert(m_shape2->GetType() == e_circleShape); m_manifold.pointCount = 0; m_manifold.points[0].normalImpulse = 0.0f; m_manifold.points[0].tangentImpulse = 0.0f; } void b2CircleContact::Evaluate(b2ContactListener* listener) { b2Body* b1 = m_shape1->GetBody(); b2Body* b2 = m_shape2->GetBody(); b2Manifold m0; memcpy(&m0, &m_manifold, sizeof(b2Manifold)); b2CollideCircles(&m_manifold, (b2CircleShape*)m_shape1, b1->GetXForm(), (b2CircleShape*)m_shape2, b2->GetXForm()); b2ContactPoint cp; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.friction = m_friction; cp.restitution = m_restitution; if (m_manifold.pointCount > 0) { m_manifoldCount = 1; b2ManifoldPoint* mp = m_manifold.points + 0; if (m0.pointCount == 0) { mp->normalImpulse = 0.0f; mp->tangentImpulse = 0.0f; if (listener) { cp.position = b1->GetWorldPoint(mp->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); cp.velocity = v2 - v1; cp.normal = m_manifold.normal; cp.separation = mp->separation; cp.id = mp->id; listener->Add(&cp); } } else { b2ManifoldPoint* mp0 = m0.points + 0; mp->normalImpulse = mp0->normalImpulse; mp->tangentImpulse = mp0->tangentImpulse; if (listener) { cp.position = b1->GetWorldPoint(mp->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); cp.velocity = v2 - v1; cp.normal = m_manifold.normal; cp.separation = mp->separation; cp.id = mp->id; listener->Persist(&cp); } } } else { m_manifoldCount = 0; if (m0.pointCount > 0 && listener) { b2ManifoldPoint* mp0 = m0.points + 0; cp.position = b1->GetWorldPoint(mp0->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp0->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp0->localPoint2); cp.velocity = v2 - v1; cp.normal = m0.normal; cp.separation = mp0->separation; cp.id = mp0->id; listener->Remove(&cp); } } } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2CircleContact.h000066400000000000000000000030131425065123200271660ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef CIRCLE_CONTACT_H #define CIRCLE_CONTACT_H #include "../../Common/b2Math.h" #include "../../Collision/b2Collision.h" #include "b2Contact.h" class b2BlockAllocator; class b2CircleContact : public b2Contact { public: static b2Contact* Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); b2CircleContact(b2Shape* shape1, b2Shape* shape2); ~b2CircleContact() {} void Evaluate(b2ContactListener* listener); b2Manifold* GetManifolds() { return &m_manifold; } b2Manifold m_manifold; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2Contact.cpp000066400000000000000000000115561425065123200264120ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Contact.h" #include "b2CircleContact.h" #include "b2PolyAndCircleContact.h" #include "b2PolyContact.h" #include "b2ContactSolver.h" #include "../../Collision/b2Collision.h" #include "../../Collision/Shapes/b2Shape.h" #include "../../Common/b2BlockAllocator.h" #include "../../Dynamics/b2World.h" #include "../../Dynamics/b2Body.h" b2ContactRegister b2Contact::s_registers[e_shapeTypeCount][e_shapeTypeCount]; bool b2Contact::s_initialized = false; void b2Contact::InitializeRegisters() { AddType(b2CircleContact::Create, b2CircleContact::Destroy, e_circleShape, e_circleShape); AddType(b2PolyAndCircleContact::Create, b2PolyAndCircleContact::Destroy, e_polygonShape, e_circleShape); AddType(b2PolygonContact::Create, b2PolygonContact::Destroy, e_polygonShape, e_polygonShape); } void b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn, b2ShapeType type1, b2ShapeType type2) { b2Assert(e_unknownShape < type1 && type1 < e_shapeTypeCount); b2Assert(e_unknownShape < type2 && type2 < e_shapeTypeCount); s_registers[type1][type2].createFcn = createFcn; s_registers[type1][type2].destroyFcn = destoryFcn; s_registers[type1][type2].primary = true; if (type1 != type2) { s_registers[type2][type1].createFcn = createFcn; s_registers[type2][type1].destroyFcn = destoryFcn; s_registers[type2][type1].primary = false; } } b2Contact* b2Contact::Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator) { if (s_initialized == false) { InitializeRegisters(); s_initialized = true; } b2ShapeType type1 = shape1->GetType(); b2ShapeType type2 = shape2->GetType(); b2Assert(e_unknownShape < type1 && type1 < e_shapeTypeCount); b2Assert(e_unknownShape < type2 && type2 < e_shapeTypeCount); b2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn; if (createFcn) { if (s_registers[type1][type2].primary) { return createFcn(shape1, shape2, allocator); } else { b2Contact* c = createFcn(shape2, shape1, allocator); for (int32 i = 0; i < c->GetManifoldCount(); ++i) { b2Manifold* m = c->GetManifolds() + i; m->normal = -m->normal; } return c; } } else { return NULL; } } void b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) { b2Assert(s_initialized == true); if (contact->GetManifoldCount() > 0) { contact->GetShape1()->GetBody()->WakeUp(); contact->GetShape2()->GetBody()->WakeUp(); } b2ShapeType type1 = contact->GetShape1()->GetType(); b2ShapeType type2 = contact->GetShape2()->GetType(); b2Assert(e_unknownShape < type1 && type1 < e_shapeTypeCount); b2Assert(e_unknownShape < type2 && type2 < e_shapeTypeCount); b2ContactDestroyFcn* destroyFcn = s_registers[type1][type2].destroyFcn; destroyFcn(contact, allocator); } b2Contact::b2Contact(b2Shape* s1, b2Shape* s2) { m_flags = 0; if (s1->IsSensor() || s2->IsSensor()) { m_flags |= e_nonSolidFlag; } m_shape1 = s1; m_shape2 = s2; m_manifoldCount = 0; m_friction = b2MixFriction(m_shape1->GetFriction(), m_shape2->GetFriction()); m_restitution = b2MixRestitution(m_shape1->GetRestitution(), m_shape2->GetRestitution()); m_prev = NULL; m_next = NULL; m_node1.contact = NULL; m_node1.prev = NULL; m_node1.next = NULL; m_node1.other = NULL; m_node2.contact = NULL; m_node2.prev = NULL; m_node2.next = NULL; m_node2.other = NULL; } void b2Contact::Update(b2ContactListener* listener) { int32 oldCount = GetManifoldCount(); Evaluate(listener); int32 newCount = GetManifoldCount(); b2Body* body1 = m_shape1->GetBody(); b2Body* body2 = m_shape2->GetBody(); if (newCount == 0 && oldCount > 0) { body1->WakeUp(); body2->WakeUp(); } // Slow contacts don't generate TOI events. if (body1->IsStatic() || body1->IsBullet() || body2->IsStatic() || body2->IsBullet()) { m_flags &= ~e_slowFlag; } else { m_flags |= e_slowFlag; } } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2Contact.h000066400000000000000000000132201425065123200260450ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef CONTACT_H #define CONTACT_H #include "../../Common/b2Math.h" #include "../../Collision/b2Collision.h" #include "../../Collision/Shapes/b2Shape.h" class b2Body; class b2Contact; class b2World; class b2BlockAllocator; class b2StackAllocator; class b2ContactListener; typedef b2Contact* b2ContactCreateFcn(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); typedef void b2ContactDestroyFcn(b2Contact* contact, b2BlockAllocator* allocator); struct b2ContactRegister { b2ContactCreateFcn* createFcn; b2ContactDestroyFcn* destroyFcn; bool primary; }; /// A contact edge is used to connect bodies and contacts together /// in a contact graph where each body is a node and each contact /// is an edge. A contact edge belongs to a doubly linked list /// maintained in each attached body. Each contact has two contact /// nodes, one for each attached body. struct b2ContactEdge { b2Body* other; ///< provides quick access to the other body attached. b2Contact* contact; ///< the contact b2ContactEdge* prev; ///< the previous contact edge in the body's contact list b2ContactEdge* next; ///< the next contact edge in the body's contact list }; /// This structure is used to report contact points. struct b2ContactPoint { b2Shape* shape1; ///< the first shape b2Shape* shape2; ///< the second shape b2Vec2 position; ///< position in world coordinates b2Vec2 velocity; ///< velocity of point on body2 relative to point on body1 (pre-solver) b2Vec2 normal; ///< points from shape1 to shape2 float32 separation; ///< the separation is negative when shapes are touching float32 friction; ///< the combined friction coefficient float32 restitution; ///< the combined restitution coefficient b2ContactID id; ///< the contact id identifies the features in contact }; /// This structure is used to report contact point results. struct b2ContactResult { b2Shape* shape1; ///< the first shape b2Shape* shape2; ///< the second shape b2Vec2 position; ///< position in world coordinates b2Vec2 normal; ///< points from shape1 to shape2 float32 normalImpulse; ///< the normal impulse applied to body2 float32 tangentImpulse; ///< the tangent impulse applied to body2 b2ContactID id; ///< the contact id identifies the features in contact }; /// The class manages contact between two shapes. A contact exists for each overlapping /// AABB in the broad-phase (except if filtered). Therefore a contact object may exist /// that has no contact points. class b2Contact { public: /// Get the manifold array. virtual b2Manifold* GetManifolds() = 0; /// Get the number of manifolds. This is 0 or 1 between convex shapes. /// This may be greater than 1 for convex-vs-concave shapes. Each /// manifold holds up to two contact points with a shared contact normal. int32 GetManifoldCount() const; /// Is this contact solid? /// @return true if this contact should generate a response. bool IsSolid() const; /// Get the next contact in the world's contact list. b2Contact* GetNext(); /// Get the first shape in this contact. b2Shape* GetShape1(); /// Get the second shape in this contact. b2Shape* GetShape2(); //--------------- Internals Below ------------------- public: // m_flags enum { e_nonSolidFlag = 0x0001, e_slowFlag = 0x0002, e_islandFlag = 0x0004, e_toiFlag = 0x0008, }; static void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn, b2ShapeType type1, b2ShapeType type2); static void InitializeRegisters(); static b2Contact* Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); b2Contact() : m_shape1(NULL), m_shape2(NULL) {} b2Contact(b2Shape* shape1, b2Shape* shape2); virtual ~b2Contact() {} void Update(b2ContactListener* listener); virtual void Evaluate(b2ContactListener* listener) = 0; static b2ContactRegister s_registers[e_shapeTypeCount][e_shapeTypeCount]; static bool s_initialized; uint32 m_flags; int32 m_manifoldCount; // World pool and list pointers. b2Contact* m_prev; b2Contact* m_next; // Nodes for connecting bodies. b2ContactEdge m_node1; b2ContactEdge m_node2; b2Shape* m_shape1; b2Shape* m_shape2; // Combined friction float32 m_friction; float32 m_restitution; float32 m_toi; }; inline int32 b2Contact::GetManifoldCount() const { return m_manifoldCount; } inline bool b2Contact::IsSolid() const { return (m_flags & e_nonSolidFlag) == 0; } inline b2Contact* b2Contact::GetNext() { return m_next; } inline b2Shape* b2Contact::GetShape1() { return m_shape1; } inline b2Shape* b2Contact::GetShape2() { return m_shape2; } #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2ContactSolver.cpp000066400000000000000000000260321425065123200276000ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2ContactSolver.h" #include "b2Contact.h" #include "../b2Body.h" #include "../b2World.h" #include "../../Common/b2StackAllocator.h" b2ContactSolver::b2ContactSolver(const b2TimeStep& step, b2Contact** contacts, int32 contactCount, b2StackAllocator* allocator) { m_step = step; m_allocator = allocator; m_constraintCount = 0; for (int32 i = 0; i < contactCount; ++i) { b2Assert(contacts[i]->IsSolid()); m_constraintCount += contacts[i]->GetManifoldCount(); } m_constraints = (b2ContactConstraint*)m_allocator->Allocate(m_constraintCount * sizeof(b2ContactConstraint)); int32 count = 0; for (int32 i = 0; i < contactCount; ++i) { b2Contact* contact = contacts[i]; b2Body* b1 = contact->m_shape1->GetBody(); b2Body* b2 = contact->m_shape2->GetBody(); int32 manifoldCount = contact->GetManifoldCount(); b2Manifold* manifolds = contact->GetManifolds(); float32 friction = contact->m_friction; float32 restitution = contact->m_restitution; b2Vec2 v1 = b1->m_linearVelocity; b2Vec2 v2 = b2->m_linearVelocity; float32 w1 = b1->m_angularVelocity; float32 w2 = b2->m_angularVelocity; for (int32 j = 0; j < manifoldCount; ++j) { b2Manifold* manifold = manifolds + j; b2Assert(manifold->pointCount > 0); const b2Vec2 normal = manifold->normal; b2Assert(count < m_constraintCount); b2ContactConstraint* c = m_constraints + count; c->body1 = b1; c->body2 = b2; c->manifold = manifold; c->normal = normal; c->pointCount = manifold->pointCount; c->friction = friction; c->restitution = restitution; for (int32 k = 0; k < c->pointCount; ++k) { b2ManifoldPoint* cp = manifold->points + k; b2ContactConstraintPoint* ccp = c->points + k; ccp->normalImpulse = cp->normalImpulse; ccp->tangentImpulse = cp->tangentImpulse; ccp->separation = cp->separation; ccp->positionImpulse = 0.0f; ccp->localAnchor1 = cp->localPoint1; ccp->localAnchor2 = cp->localPoint2; ccp->r1 = b2Mul(b1->GetXForm().R, cp->localPoint1 - b1->GetLocalCenter()); ccp->r2 = b2Mul(b2->GetXForm().R, cp->localPoint2 - b2->GetLocalCenter()); float32 r1Sqr = b2Dot(ccp->r1, ccp->r1); float32 r2Sqr = b2Dot(ccp->r2, ccp->r2); float32 rn1 = b2Dot(ccp->r1, normal); float32 rn2 = b2Dot(ccp->r2, normal); float32 kNormal = b1->m_invMass + b2->m_invMass; kNormal += b1->m_invI * (r1Sqr - rn1 * rn1) + b2->m_invI * (r2Sqr - rn2 * rn2); b2Assert(kNormal > B2_FLT_EPSILON); ccp->normalMass = 1.0f / kNormal; float32 kEqualized = b1->m_mass * b1->m_invMass + b2->m_mass * b2->m_invMass; kEqualized += b1->m_mass * b1->m_invI * (r1Sqr - rn1 * rn1) + b2->m_mass * b2->m_invI * (r2Sqr - rn2 * rn2); b2Assert(kEqualized > B2_FLT_EPSILON); ccp->equalizedMass = 1.0f / kEqualized; b2Vec2 tangent = b2Cross(normal, 1.0f); float32 rt1 = b2Dot(ccp->r1, tangent); float32 rt2 = b2Dot(ccp->r2, tangent); float32 kTangent = b1->m_invMass + b2->m_invMass; kTangent += b1->m_invI * (r1Sqr - rt1 * rt1) + b2->m_invI * (r2Sqr - rt2 * rt2); b2Assert(kTangent > B2_FLT_EPSILON); ccp->tangentMass = 1.0f / kTangent; // Setup a velocity bias for restitution. ccp->velocityBias = 0.0f; if (ccp->separation > 0.0f) { ccp->velocityBias = -60.0f * ccp->separation; // TODO_ERIN b2TimeStep } float32 vRel = b2Dot(c->normal, v2 + b2Cross(w2, ccp->r2) - v1 - b2Cross(w1, ccp->r1)); if (vRel < -b2_velocityThreshold) { ccp->velocityBias += -c->restitution * vRel; } } ++count; } } b2Assert(count == m_constraintCount); } b2ContactSolver::~b2ContactSolver() { m_allocator->Free(m_constraints); } void b2ContactSolver::InitVelocityConstraints(const b2TimeStep& step) { // Warm start. for (int32 i = 0; i < m_constraintCount; ++i) { b2ContactConstraint* c = m_constraints + i; b2Body* b1 = c->body1; b2Body* b2 = c->body2; float32 invMass1 = b1->m_invMass; float32 invI1 = b1->m_invI; float32 invMass2 = b2->m_invMass; float32 invI2 = b2->m_invI; b2Vec2 normal = c->normal; b2Vec2 tangent = b2Cross(normal, 1.0f); if (step.warmStarting) { for (int32 j = 0; j < c->pointCount; ++j) { b2ContactConstraintPoint* ccp = c->points + j; ccp->normalImpulse *= step.dtRatio; ccp->tangentImpulse *= step.dtRatio; b2Vec2 P = ccp->normalImpulse * normal + ccp->tangentImpulse * tangent; b1->m_angularVelocity -= invI1 * b2Cross(ccp->r1, P); b1->m_linearVelocity -= invMass1 * P; b2->m_angularVelocity += invI2 * b2Cross(ccp->r2, P); b2->m_linearVelocity += invMass2 * P; } } else { for (int32 j = 0; j < c->pointCount; ++j) { b2ContactConstraintPoint* ccp = c->points + j; ccp->normalImpulse = 0.0f; ccp->tangentImpulse = 0.0f; } } } } void b2ContactSolver::SolveVelocityConstraints() { for (int32 i = 0; i < m_constraintCount; ++i) { b2ContactConstraint* c = m_constraints + i; b2Body* b1 = c->body1; b2Body* b2 = c->body2; float32 w1 = b1->m_angularVelocity; float32 w2 = b2->m_angularVelocity; b2Vec2 v1 = b1->m_linearVelocity; b2Vec2 v2 = b2->m_linearVelocity; float32 invMass1 = b1->m_invMass; float32 invI1 = b1->m_invI; float32 invMass2 = b2->m_invMass; float32 invI2 = b2->m_invI; b2Vec2 normal = c->normal; b2Vec2 tangent = b2Cross(normal, 1.0f); float32 friction = c->friction; //#define DEFERRED_UPDATE #ifdef DEFERRED_UPDATE b2Vec2 b1_linearVelocity = b1->m_linearVelocity; float32 b1_angularVelocity = b1->m_angularVelocity; b2Vec2 b2_linearVelocity = b2->m_linearVelocity; float32 b2_angularVelocity = b2->m_angularVelocity; #endif // Solve normal constraints for (int32 j = 0; j < c->pointCount; ++j) { b2ContactConstraintPoint* ccp = c->points + j; // Relative velocity at contact b2Vec2 dv = v2 + b2Cross(w2, ccp->r2) - v1 - b2Cross(w1, ccp->r1); // Compute normal impulse float32 vn = b2Dot(dv, normal); float32 lambda = -ccp->normalMass * (vn - ccp->velocityBias); // b2Clamp the accumulated impulse float32 newImpulse = b2Max(ccp->normalImpulse + lambda, 0.0f); lambda = newImpulse - ccp->normalImpulse; // Apply contact impulse b2Vec2 P = lambda * normal; #ifdef DEFERRED_UPDATE b1_linearVelocity -= invMass1 * P; b1_angularVelocity -= invI1 * b2Cross(r1, P); b2_linearVelocity += invMass2 * P; b2_angularVelocity += invI2 * b2Cross(r2, P); #else v1 -= invMass1 * P; w1 -= invI1 * b2Cross(ccp->r1, P); v2 += invMass2 * P; w2 += invI2 * b2Cross(ccp->r2, P); #endif ccp->normalImpulse = newImpulse; } #ifdef DEFERRED_UPDATE b1->m_linearVelocity = b1_linearVelocity; b1->m_angularVelocity = b1_angularVelocity; b2->m_linearVelocity = b2_linearVelocity; b2->m_angularVelocity = b2_angularVelocity; #endif // Solve tangent constraints for (int32 j = 0; j < c->pointCount; ++j) { b2ContactConstraintPoint* ccp = c->points + j; // Relative velocity at contact b2Vec2 dv = v2 + b2Cross(w2, ccp->r2) - v1 - b2Cross(w1, ccp->r1); // Compute tangent force float32 vt = b2Dot(dv, tangent); float32 lambda = ccp->tangentMass * (-vt); // b2Clamp the accumulated force float32 maxFriction = friction * ccp->normalImpulse; float32 newImpulse = b2Clamp(ccp->tangentImpulse + lambda, -maxFriction, maxFriction); lambda = newImpulse - ccp->tangentImpulse; // Apply contact impulse b2Vec2 P = lambda * tangent; v1 -= invMass1 * P; w1 -= invI1 * b2Cross(ccp->r1, P); v2 += invMass2 * P; w2 += invI2 * b2Cross(ccp->r2, P); ccp->tangentImpulse = newImpulse; } b1->m_linearVelocity = v1; b1->m_angularVelocity = w1; b2->m_linearVelocity = v2; b2->m_angularVelocity = w2; } } void b2ContactSolver::FinalizeVelocityConstraints() { for (int32 i = 0; i < m_constraintCount; ++i) { b2ContactConstraint* c = m_constraints + i; b2Manifold* m = c->manifold; for (int32 j = 0; j < c->pointCount; ++j) { m->points[j].normalImpulse = c->points[j].normalImpulse; m->points[j].tangentImpulse = c->points[j].tangentImpulse; } } } bool b2ContactSolver::SolvePositionConstraints(float32 baumgarte) { float32 minSeparation = 0.0f; for (int32 i = 0; i < m_constraintCount; ++i) { b2ContactConstraint* c = m_constraints + i; b2Body* b1 = c->body1; b2Body* b2 = c->body2; float32 invMass1 = b1->m_mass * b1->m_invMass; float32 invI1 = b1->m_mass * b1->m_invI; float32 invMass2 = b2->m_mass * b2->m_invMass; float32 invI2 = b2->m_mass * b2->m_invI; b2Vec2 normal = c->normal; // Solver normal constraints for (int32 j = 0; j < c->pointCount; ++j) { b2ContactConstraintPoint* ccp = c->points + j; b2Vec2 r1 = b2Mul(b1->GetXForm().R, ccp->localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, ccp->localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; b2Vec2 dp = p2 - p1; // Approximate the current separation. float32 separation = b2Dot(dp, normal) + ccp->separation; // Track max constraint error. minSeparation = b2Min(minSeparation, separation); // Prevent large corrections and allow slop. float32 C = baumgarte * b2Clamp(separation + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); // Compute normal impulse float32 dImpulse = -ccp->equalizedMass * C; // b2Clamp the accumulated impulse float32 impulse0 = ccp->positionImpulse; ccp->positionImpulse = b2Max(impulse0 + dImpulse, 0.0f); dImpulse = ccp->positionImpulse - impulse0; b2Vec2 impulse = dImpulse * normal; b1->m_sweep.c -= invMass1 * impulse; b1->m_sweep.a -= invI1 * b2Cross(r1, impulse); b1->SynchronizeTransform(); b2->m_sweep.c += invMass2 * impulse; b2->m_sweep.a += invI2 * b2Cross(r2, impulse); b2->SynchronizeTransform(); } } // We can't expect minSpeparation >= -b2_linearSlop because we don't // push the separation above -b2_linearSlop. return minSeparation >= -1.5f * b2_linearSlop; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2ContactSolver.h000066400000000000000000000042061425065123200272440ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef CONTACT_SOLVER_H #define CONTACT_SOLVER_H #include "../../Common/b2Math.h" #include "../../Collision/b2Collision.h" #include "../b2World.h" class b2Contact; class b2Body; class b2Island; class b2StackAllocator; struct b2ContactConstraintPoint { b2Vec2 localAnchor1; b2Vec2 localAnchor2; b2Vec2 r1; b2Vec2 r2; float32 normalImpulse; float32 tangentImpulse; float32 positionImpulse; float32 normalMass; float32 tangentMass; float32 equalizedMass; float32 separation; float32 velocityBias; }; struct b2ContactConstraint { b2ContactConstraintPoint points[b2_maxManifoldPoints]; b2Vec2 normal; b2Manifold* manifold; b2Body* body1; b2Body* body2; float32 friction; float32 restitution; int32 pointCount; }; class b2ContactSolver { public: b2ContactSolver(const b2TimeStep& step, b2Contact** contacts, int32 contactCount, b2StackAllocator* allocator); ~b2ContactSolver(); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(); void FinalizeVelocityConstraints(); bool SolvePositionConstraints(float32 baumgarte); b2TimeStep m_step; b2StackAllocator* m_allocator; b2ContactConstraint* m_constraints; int m_constraintCount; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2NullContact.h000066400000000000000000000022671425065123200267110ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_NULL_CONTACT_H #define B2_NULL_CONTACT_H #include "../../Common/b2Math.h" #include "b2Contact.h" class b2NullContact : public b2Contact { public: b2NullContact() {} void Evaluate(b2ContactListener*) {} b2Manifold* GetManifolds() { return NULL; } }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2PolyAndCircleContact.cpp000066400000000000000000000111551425065123200310160ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include #include "b2PolyAndCircleContact.h" #include "../b2Body.h" #include "../b2WorldCallbacks.h" #include "../../Common/b2BlockAllocator.h" #include b2Contact* b2PolyAndCircleContact::Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator) { void* mem = allocator->Allocate(sizeof(b2PolyAndCircleContact)); return new (mem) b2PolyAndCircleContact(shape1, shape2); } void b2PolyAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) { ((b2PolyAndCircleContact*)contact)->~b2PolyAndCircleContact(); allocator->Free(contact, sizeof(b2PolyAndCircleContact)); } b2PolyAndCircleContact::b2PolyAndCircleContact(b2Shape* s1, b2Shape* s2) : b2Contact(s1, s2) { b2Assert(m_shape1->GetType() == e_polygonShape); b2Assert(m_shape2->GetType() == e_circleShape); m_manifold.pointCount = 0; m_manifold.points[0].normalImpulse = 0.0f; m_manifold.points[0].tangentImpulse = 0.0f; } void b2PolyAndCircleContact::Evaluate(b2ContactListener* listener) { b2Body* b1 = m_shape1->GetBody(); b2Body* b2 = m_shape2->GetBody(); b2Manifold m0; memcpy(&m0, &m_manifold, sizeof(b2Manifold)); b2CollidePolygonAndCircle(&m_manifold, (b2PolygonShape*)m_shape1, b1->GetXForm(), (b2CircleShape*)m_shape2, b2->GetXForm()); bool persisted[b2_maxManifoldPoints] = {false, false}; b2ContactPoint cp; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.friction = m_friction; cp.restitution = m_restitution; // Match contact ids to facilitate warm starting. if (m_manifold.pointCount > 0) { // Match old contact ids to new contact ids and copy the // stored impulses to warm start the solver. for (int32 i = 0; i < m_manifold.pointCount; ++i) { b2ManifoldPoint* mp = m_manifold.points + i; mp->normalImpulse = 0.0f; mp->tangentImpulse = 0.0f; bool found = false; b2ContactID id = mp->id; for (int32 j = 0; j < m0.pointCount; ++j) { if (persisted[j] == true) { continue; } b2ManifoldPoint* mp0 = m0.points + j; if (mp0->id.key == id.key) { persisted[j] = true; mp->normalImpulse = mp0->normalImpulse; mp->tangentImpulse = mp0->tangentImpulse; // A persistent point. found = true; // Report persistent point. if (listener != NULL) { cp.position = b1->GetWorldPoint(mp->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); cp.velocity = v2 - v1; cp.normal = m_manifold.normal; cp.separation = mp->separation; cp.id = id; listener->Persist(&cp); } break; } } // Report added point. if (found == false && listener != NULL) { cp.position = b1->GetWorldPoint(mp->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); cp.velocity = v2 - v1; cp.normal = m_manifold.normal; cp.separation = mp->separation; cp.id = id; listener->Add(&cp); } } m_manifoldCount = 1; } else { m_manifoldCount = 0; } if (listener == NULL) { return; } // Report removed points. for (int32 i = 0; i < m0.pointCount; ++i) { if (persisted[i]) { continue; } b2ManifoldPoint* mp0 = m0.points + i; cp.position = b1->GetWorldPoint(mp0->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp0->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp0->localPoint2); cp.velocity = v2 - v1; cp.normal = m0.normal; cp.separation = mp0->separation; cp.id = mp0->id; listener->Remove(&cp); } } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2PolyAndCircleContact.h000066400000000000000000000027461425065123200304710ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef POLY_AND_CIRCLE_CONTACT_H #define POLY_AND_CIRCLE_CONTACT_H #include "b2Contact.h" class b2BlockAllocator; class b2PolyAndCircleContact : public b2Contact { public: static b2Contact* Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); b2PolyAndCircleContact(b2Shape* shape1, b2Shape* shape2); ~b2PolyAndCircleContact() {} void Evaluate(b2ContactListener* listener); b2Manifold* GetManifolds() { return &m_manifold; } b2Manifold m_manifold; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2PolyContact.cpp000066400000000000000000000107331425065123200272520ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include #include "b2PolyContact.h" #include "../b2Body.h" #include "../b2WorldCallbacks.h" #include "../../Common/b2BlockAllocator.h" #include #include b2Contact* b2PolygonContact::Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator) { void* mem = allocator->Allocate(sizeof(b2PolygonContact)); return new (mem) b2PolygonContact(shape1, shape2); } void b2PolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) { ((b2PolygonContact*)contact)->~b2PolygonContact(); allocator->Free(contact, sizeof(b2PolygonContact)); } b2PolygonContact::b2PolygonContact(b2Shape* s1, b2Shape* s2) : b2Contact(s1, s2) { b2Assert(m_shape1->GetType() == e_polygonShape); b2Assert(m_shape2->GetType() == e_polygonShape); m_manifold.pointCount = 0; } void b2PolygonContact::Evaluate(b2ContactListener* listener) { b2Body* b1 = m_shape1->GetBody(); b2Body* b2 = m_shape2->GetBody(); b2Manifold m0; memcpy(&m0, &m_manifold, sizeof(b2Manifold)); b2CollidePolygons(&m_manifold, (b2PolygonShape*)m_shape1, b1->GetXForm(), (b2PolygonShape*)m_shape2, b2->GetXForm()); bool persisted[b2_maxManifoldPoints] = {false, false}; b2ContactPoint cp; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.friction = m_friction; cp.restitution = m_restitution; // Match contact ids to facilitate warm starting. if (m_manifold.pointCount > 0) { // Match old contact ids to new contact ids and copy the // stored impulses to warm start the solver. for (int32 i = 0; i < m_manifold.pointCount; ++i) { b2ManifoldPoint* mp = m_manifold.points + i; mp->normalImpulse = 0.0f; mp->tangentImpulse = 0.0f; bool found = false; b2ContactID id = mp->id; for (int32 j = 0; j < m0.pointCount; ++j) { if (persisted[j] == true) { continue; } b2ManifoldPoint* mp0 = m0.points + j; if (mp0->id.key == id.key) { persisted[j] = true; mp->normalImpulse = mp0->normalImpulse; mp->tangentImpulse = mp0->tangentImpulse; // A persistent point. found = true; // Report persistent point. if (listener != NULL) { cp.position = b1->GetWorldPoint(mp->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); cp.velocity = v2 - v1; cp.normal = m_manifold.normal; cp.separation = mp->separation; cp.id = id; listener->Persist(&cp); } break; } } // Report added point. if (found == false && listener != NULL) { cp.position = b1->GetWorldPoint(mp->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); cp.velocity = v2 - v1; cp.normal = m_manifold.normal; cp.separation = mp->separation; cp.id = id; listener->Add(&cp); } } m_manifoldCount = 1; } else { m_manifoldCount = 0; } if (listener == NULL) { return; } // Report removed points. for (int32 i = 0; i < m0.pointCount; ++i) { if (persisted[i]) { continue; } b2ManifoldPoint* mp0 = m0.points + i; cp.position = b1->GetWorldPoint(mp0->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp0->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp0->localPoint2); cp.velocity = v2 - v1; cp.normal = m0.normal; cp.separation = mp0->separation; cp.id = mp0->id; listener->Remove(&cp); } } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Contacts/b2PolyContact.h000066400000000000000000000026741425065123200267240ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef POLYCONTACT_H #define POLYCONTACT_H #include "b2Contact.h" class b2BlockAllocator; class b2PolygonContact : public b2Contact { public: static b2Contact* Create(b2Shape* shape1, b2Shape* shape2, b2BlockAllocator* allocator); static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); b2PolygonContact(b2Shape* shape1, b2Shape* shape2); ~b2PolygonContact() {} void Evaluate(b2ContactListener* listener); b2Manifold* GetManifolds() { return &m_manifold; } b2Manifold m_manifold; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/000077500000000000000000000000001425065123200235475ustar00rootroot00000000000000numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2DistanceJoint.cpp000066400000000000000000000133011425065123200272330ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2DistanceJoint.h" #include "../b2Body.h" #include "../b2World.h" // 1-D constrained system // m (v2 - v1) = lambda // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. // x2 = x1 + h * v2 // 1-D mass-damper-spring system // m (v2 - v1) + h * d * v2 + h * k * // C = norm(p2 - p1) - L // u = (p2 - p1) / norm(p2 - p1) // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) // J = [-u -cross(r1, u) u cross(r2, u)] // K = J * invM * JT // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 void b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor1, const b2Vec2& anchor2) { body1 = b1; body2 = b2; localAnchor1 = body1->GetLocalPoint(anchor1); localAnchor2 = body2->GetLocalPoint(anchor2); b2Vec2 d = anchor2 - anchor1; length = d.Length(); } b2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def) : b2Joint(def) { m_localAnchor1 = def->localAnchor1; m_localAnchor2 = def->localAnchor2; m_length = def->length; m_frequencyHz = def->frequencyHz; m_dampingRatio = def->dampingRatio; m_impulse = 0.0f; m_gamma = 0.0f; m_bias = 0.0f; m_inv_dt = 0.0f; } void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) { m_inv_dt = step.inv_dt; b2Body* b1 = m_body1; b2Body* b2 = m_body2; // Compute the effective mass matrix. b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); m_u = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; // Handle singularity. float32 length = m_u.Length(); if (length > b2_linearSlop) { m_u *= 1.0f / length; } else { m_u.Set(0.0f, 0.0f); } float32 cr1u = b2Cross(r1, m_u); float32 cr2u = b2Cross(r2, m_u); float32 invMass = b1->m_invMass + b1->m_invI * cr1u * cr1u + b2->m_invMass + b2->m_invI * cr2u * cr2u; b2Assert(invMass > B2_FLT_EPSILON); m_mass = 1.0f / invMass; if (m_frequencyHz > 0.0f) { float32 C = length - m_length; // Frequency float32 omega = 2.0f * b2_pi * m_frequencyHz; // Damping coefficient float32 d = 2.0f * m_mass * m_dampingRatio * omega; // Spring stiffness float32 k = m_mass * omega * omega; // magic formulas m_gamma = 1.0f / (step.dt * (d + step.dt * k)); m_bias = C * step.dt * k * m_gamma; m_mass = 1.0f / (invMass + m_gamma); } if (step.warmStarting) { m_impulse *= step.dtRatio; b2Vec2 P = m_impulse * m_u; b1->m_linearVelocity -= b1->m_invMass * P; b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); b2->m_linearVelocity += b2->m_invMass * P; b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); } else { m_impulse = 0.0f; } } void b2DistanceJoint::SolveVelocityConstraints(const b2TimeStep& step) { B2_NOT_USED(step); b2Body* b1 = m_body1; b2Body* b2 = m_body2; b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); // Cdot = dot(u, v + cross(w, r)) b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); float32 Cdot = b2Dot(m_u, v2 - v1); float32 impulse = -m_mass * (Cdot + m_bias + m_gamma * m_impulse); m_impulse += impulse; b2Vec2 P = impulse * m_u; b1->m_linearVelocity -= b1->m_invMass * P; b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); b2->m_linearVelocity += b2->m_invMass * P; b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); } bool b2DistanceJoint::SolvePositionConstraints() { if (m_frequencyHz > 0.0f) { return true; } b2Body* b1 = m_body1; b2Body* b2 = m_body2; b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; float32 length = d.Normalize(); float32 C = length - m_length; C = b2Clamp(C, -b2_maxLinearCorrection, b2_maxLinearCorrection); float32 impulse = -m_mass * C; m_u = d; b2Vec2 P = impulse * m_u; b1->m_sweep.c -= b1->m_invMass * P; b1->m_sweep.a -= b1->m_invI * b2Cross(r1, P); b2->m_sweep.c += b2->m_invMass * P; b2->m_sweep.a += b2->m_invI * b2Cross(r2, P); b1->SynchronizeTransform(); b2->SynchronizeTransform(); return b2Abs(C) < b2_linearSlop; } b2Vec2 b2DistanceJoint::GetAnchor1() const { return m_body1->GetWorldPoint(m_localAnchor1); } b2Vec2 b2DistanceJoint::GetAnchor2() const { return m_body2->GetWorldPoint(m_localAnchor2); } b2Vec2 b2DistanceJoint::GetReactionForce() const { b2Vec2 F = (m_inv_dt * m_impulse) * m_u; return F; } float32 b2DistanceJoint::GetReactionTorque() const { return 0.0f; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2DistanceJoint.h000066400000000000000000000057371425065123200267160ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_DISTANCE_JOINT_H #define B2_DISTANCE_JOINT_H #include "b2Joint.h" /// Distance joint definition. This requires defining an /// anchor point on both bodies and the non-zero length of the /// distance joint. The definition uses local anchor points /// so that the initial configuration can violate the constraint /// slightly. This helps when saving and loading a game. /// @warning Do not use a zero or short length. struct b2DistanceJointDef : public b2JointDef { b2DistanceJointDef() { type = e_distanceJoint; localAnchor1.Set(0.0f, 0.0f); localAnchor2.Set(0.0f, 0.0f); length = 1.0f; frequencyHz = 0.0f; dampingRatio = 0.0f; } /// Initialize the bodies, anchors, and length using the world /// anchors. void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& anchor1, const b2Vec2& anchor2); /// The local anchor point relative to body1's origin. b2Vec2 localAnchor1; /// The local anchor point relative to body2's origin. b2Vec2 localAnchor2; /// The equilibrium length between the anchor points. float32 length; /// The response speed. float32 frequencyHz; /// The damping ratio. 0 = no damping, 1 = critical damping. float32 dampingRatio; }; /// A distance joint constrains two points on two bodies /// to remain at a fixed distance from each other. You can view /// this as a massless, rigid rod. class b2DistanceJoint : public b2Joint { public: b2Vec2 GetAnchor1() const; b2Vec2 GetAnchor2() const; b2Vec2 GetReactionForce() const; float32 GetReactionTorque() const; //--------------- Internals Below ------------------- b2DistanceJoint(const b2DistanceJointDef* data); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); bool SolvePositionConstraints(); b2Vec2 m_localAnchor1; b2Vec2 m_localAnchor2; b2Vec2 m_u; float32 m_frequencyHz; float32 m_dampingRatio; float32 m_gamma; float32 m_bias; float32 m_impulse; float32 m_mass; // effective mass for the constraint. float32 m_length; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2GearJoint.cpp000066400000000000000000000155011425065123200263630ustar00rootroot00000000000000/* * Copyright (c) 2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2GearJoint.h" #include "b2RevoluteJoint.h" #include "b2PrismaticJoint.h" #include "../b2Body.h" #include "../b2World.h" // Gear Joint: // C0 = (coordinate1 + ratio * coordinate2)_initial // C = C0 - (cordinate1 + ratio * coordinate2) = 0 // Cdot = -(Cdot1 + ratio * Cdot2) // J = -[J1 ratio * J2] // K = J * invM * JT // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T // // Revolute: // coordinate = rotation // Cdot = angularVelocity // J = [0 0 1] // K = J * invM * JT = invI // // Prismatic: // coordinate = dot(p - pg, ug) // Cdot = dot(v + cross(w, r), ug) // J = [ug cross(r, ug)] // K = J * invM * JT = invMass + invI * cross(r, ug)^2 b2GearJoint::b2GearJoint(const b2GearJointDef* def) : b2Joint(def) { b2JointType type1 = def->joint1->GetType(); b2JointType type2 = def->joint2->GetType(); b2Assert(type1 == e_revoluteJoint || type1 == e_prismaticJoint); b2Assert(type2 == e_revoluteJoint || type2 == e_prismaticJoint); b2Assert(def->joint1->GetBody1()->IsStatic()); b2Assert(def->joint2->GetBody1()->IsStatic()); m_revolute1 = NULL; m_prismatic1 = NULL; m_revolute2 = NULL; m_prismatic2 = NULL; float32 coordinate1, coordinate2; m_ground1 = def->joint1->GetBody1(); m_body1 = def->joint1->GetBody2(); if (type1 == e_revoluteJoint) { m_revolute1 = (b2RevoluteJoint*)def->joint1; m_groundAnchor1 = m_revolute1->m_localAnchor1; m_localAnchor1 = m_revolute1->m_localAnchor2; coordinate1 = m_revolute1->GetJointAngle(); } else { m_prismatic1 = (b2PrismaticJoint*)def->joint1; m_groundAnchor1 = m_prismatic1->m_localAnchor1; m_localAnchor1 = m_prismatic1->m_localAnchor2; coordinate1 = m_prismatic1->GetJointTranslation(); } m_ground2 = def->joint2->GetBody1(); m_body2 = def->joint2->GetBody2(); if (type2 == e_revoluteJoint) { m_revolute2 = (b2RevoluteJoint*)def->joint2; m_groundAnchor2 = m_revolute2->m_localAnchor1; m_localAnchor2 = m_revolute2->m_localAnchor2; coordinate2 = m_revolute2->GetJointAngle(); } else { m_prismatic2 = (b2PrismaticJoint*)def->joint2; m_groundAnchor2 = m_prismatic2->m_localAnchor1; m_localAnchor2 = m_prismatic2->m_localAnchor2; coordinate2 = m_prismatic2->GetJointTranslation(); } m_ratio = def->ratio; m_constant = coordinate1 + m_ratio * coordinate2; m_force = 0.0f; } void b2GearJoint::InitVelocityConstraints(const b2TimeStep& step) { b2Body* g1 = m_ground1; b2Body* g2 = m_ground2; b2Body* b1 = m_body1; b2Body* b2 = m_body2; float32 K = 0.0f; m_J.SetZero(); if (m_revolute1) { m_J.angular1 = -1.0f; K += b1->m_invI; } else { b2Vec2 ug = b2Mul(g1->GetXForm().R, m_prismatic1->m_localXAxis1); b2Vec2 r = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); float32 crug = b2Cross(r, ug); m_J.linear1 = -ug; m_J.angular1 = -crug; K += b1->m_invMass + b1->m_invI * crug * crug; } if (m_revolute2) { m_J.angular2 = -m_ratio; K += m_ratio * m_ratio * b2->m_invI; } else { b2Vec2 ug = b2Mul(g2->GetXForm().R, m_prismatic2->m_localXAxis1); b2Vec2 r = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); float32 crug = b2Cross(r, ug); m_J.linear2 = -m_ratio * ug; m_J.angular2 = -m_ratio * crug; K += m_ratio * m_ratio * (b2->m_invMass + b2->m_invI * crug * crug); } // Compute effective mass. b2Assert(K > 0.0f); m_mass = 1.0f / K; if (step.warmStarting) { // Warm starting. float32 P = B2FORCE_SCALE(step.dt) * m_force; b1->m_linearVelocity += b1->m_invMass * P * m_J.linear1; b1->m_angularVelocity += b1->m_invI * P * m_J.angular1; b2->m_linearVelocity += b2->m_invMass * P * m_J.linear2; b2->m_angularVelocity += b2->m_invI * P * m_J.angular2; } else { m_force = 0.0f; } } void b2GearJoint::SolveVelocityConstraints(const b2TimeStep& step) { b2Body* b1 = m_body1; b2Body* b2 = m_body2; float32 Cdot = m_J.Compute( b1->m_linearVelocity, b1->m_angularVelocity, b2->m_linearVelocity, b2->m_angularVelocity); float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_mass * Cdot; m_force += force; float32 P = B2FORCE_SCALE(step.dt) * force; b1->m_linearVelocity += b1->m_invMass * P * m_J.linear1; b1->m_angularVelocity += b1->m_invI * P * m_J.angular1; b2->m_linearVelocity += b2->m_invMass * P * m_J.linear2; b2->m_angularVelocity += b2->m_invI * P * m_J.angular2; } bool b2GearJoint::SolvePositionConstraints() { float32 linearError = 0.0f; b2Body* b1 = m_body1; b2Body* b2 = m_body2; float32 coordinate1, coordinate2; if (m_revolute1) { coordinate1 = m_revolute1->GetJointAngle(); } else { coordinate1 = m_prismatic1->GetJointTranslation(); } if (m_revolute2) { coordinate2 = m_revolute2->GetJointAngle(); } else { coordinate2 = m_prismatic2->GetJointTranslation(); } float32 C = m_constant - (coordinate1 + m_ratio * coordinate2); float32 impulse = -m_mass * C; b1->m_sweep.c += b1->m_invMass * impulse * m_J.linear1; b1->m_sweep.a += b1->m_invI * impulse * m_J.angular1; b2->m_sweep.c += b2->m_invMass * impulse * m_J.linear2; b2->m_sweep.a += b2->m_invI * impulse * m_J.angular2; b1->SynchronizeTransform(); b2->SynchronizeTransform(); return linearError < b2_linearSlop; } b2Vec2 b2GearJoint::GetAnchor1() const { return m_body1->GetWorldPoint(m_localAnchor1); } b2Vec2 b2GearJoint::GetAnchor2() const { return m_body2->GetWorldPoint(m_localAnchor2); } b2Vec2 b2GearJoint::GetReactionForce() const { // TODO_ERIN not tested b2Vec2 F = B2FORCE_SCALE(m_force) * m_J.linear2; return F; } float32 b2GearJoint::GetReactionTorque() const { // TODO_ERIN not tested b2Vec2 r = b2Mul(m_body2->GetXForm().R, m_localAnchor2 - m_body2->GetLocalCenter()); b2Vec2 F = m_force * m_J.linear2; float32 T = B2FORCE_SCALE(m_force * m_J.angular2 - b2Cross(r, F)); return T; } float32 b2GearJoint::GetRatio() const { return m_ratio; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2GearJoint.h000066400000000000000000000062171425065123200260340ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_GEAR_JOINT_H #define B2_GEAR_JOINT_H #include "b2Joint.h" class b2RevoluteJoint; class b2PrismaticJoint; /// Gear joint definition. This definition requires two existing /// revolute or prismatic joints (any combination will work). /// The provided joints must attach a dynamic body to a static body. struct b2GearJointDef : public b2JointDef { b2GearJointDef() { type = e_gearJoint; joint1 = NULL; joint2 = NULL; ratio = 1.0f; } /// The first revolute/prismatic joint attached to the gear joint. b2Joint* joint1; /// The second revolute/prismatic joint attached to the gear joint. b2Joint* joint2; /// The gear ratio. /// @see b2GearJoint for explanation. float32 ratio; }; /// A gear joint is used to connect two joints together. Either joint /// can be a revolute or prismatic joint. You specify a gear ratio /// to bind the motions together: /// coordinate1 + ratio * coordinate2 = constant /// The ratio can be negative or positive. If one joint is a revolute joint /// and the other joint is a prismatic joint, then the ratio will have units /// of length or units of 1/length. /// @warning The revolute and prismatic joints must be attached to /// fixed bodies (which must be body1 on those joints). class b2GearJoint : public b2Joint { public: b2Vec2 GetAnchor1() const; b2Vec2 GetAnchor2() const; b2Vec2 GetReactionForce() const; float32 GetReactionTorque() const; /// Get the gear ratio. float32 GetRatio() const; //--------------- Internals Below ------------------- b2GearJoint(const b2GearJointDef* data); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); bool SolvePositionConstraints(); b2Body* m_ground1; b2Body* m_ground2; // One of these is NULL. b2RevoluteJoint* m_revolute1; b2PrismaticJoint* m_prismatic1; // One of these is NULL. b2RevoluteJoint* m_revolute2; b2PrismaticJoint* m_prismatic2; b2Vec2 m_groundAnchor1; b2Vec2 m_groundAnchor2; b2Vec2 m_localAnchor1; b2Vec2 m_localAnchor2; b2Jacobian m_J; float32 m_constant; float32 m_ratio; // Effective mass float32 m_mass; // Impulse for accumulation/warm starting. float32 m_force; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2Joint.cpp000066400000000000000000000065221425065123200255670ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Joint.h" #include "b2DistanceJoint.h" #include "b2MouseJoint.h" #include "b2RevoluteJoint.h" #include "b2PrismaticJoint.h" #include "b2PulleyJoint.h" #include "b2GearJoint.h" #include "../b2Body.h" #include "../b2World.h" #include "../../Common/b2BlockAllocator.h" #include "../../Collision/b2BroadPhase.h" #include b2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator) { b2Joint* joint = NULL; switch (def->type) { case e_distanceJoint: { void* mem = allocator->Allocate(sizeof(b2DistanceJoint)); joint = new (mem) b2DistanceJoint((b2DistanceJointDef*)def); } break; case e_mouseJoint: { void* mem = allocator->Allocate(sizeof(b2MouseJoint)); joint = new (mem) b2MouseJoint((b2MouseJointDef*)def); } break; case e_prismaticJoint: { void* mem = allocator->Allocate(sizeof(b2PrismaticJoint)); joint = new (mem) b2PrismaticJoint((b2PrismaticJointDef*)def); } break; case e_revoluteJoint: { void* mem = allocator->Allocate(sizeof(b2RevoluteJoint)); joint = new (mem) b2RevoluteJoint((b2RevoluteJointDef*)def); } break; case e_pulleyJoint: { void* mem = allocator->Allocate(sizeof(b2PulleyJoint)); joint = new (mem) b2PulleyJoint((b2PulleyJointDef*)def); } break; case e_gearJoint: { void* mem = allocator->Allocate(sizeof(b2GearJoint)); joint = new (mem) b2GearJoint((b2GearJointDef*)def); } break; default: b2Assert(false); break; } return joint; } void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) { joint->~b2Joint(); switch (joint->m_type) { case e_distanceJoint: allocator->Free(joint, sizeof(b2DistanceJoint)); break; case e_mouseJoint: allocator->Free(joint, sizeof(b2MouseJoint)); break; case e_prismaticJoint: allocator->Free(joint, sizeof(b2PrismaticJoint)); break; case e_revoluteJoint: allocator->Free(joint, sizeof(b2RevoluteJoint)); break; case e_pulleyJoint: allocator->Free(joint, sizeof(b2PulleyJoint)); break; case e_gearJoint: allocator->Free(joint, sizeof(b2GearJoint)); break; default: b2Assert(false); break; } } b2Joint::b2Joint(const b2JointDef* def) { m_type = def->type; m_prev = NULL; m_next = NULL; m_body1 = def->body1; m_body2 = def->body2; m_collideConnected = def->collideConnected; m_islandFlag = false; m_userData = def->userData; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2Joint.h000066400000000000000000000126121425065123200252310ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef JOINT_H #define JOINT_H #include "../../Common/b2Math.h" class b2Body; class b2Joint; struct b2TimeStep; class b2BlockAllocator; enum b2JointType { e_unknownJoint, e_revoluteJoint, e_prismaticJoint, e_distanceJoint, e_pulleyJoint, e_mouseJoint, e_gearJoint }; enum b2LimitState { e_inactiveLimit, e_atLowerLimit, e_atUpperLimit, e_equalLimits }; struct b2Jacobian { b2Vec2 linear1; float32 angular1; b2Vec2 linear2; float32 angular2; void SetZero(); void Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); float32 Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); }; /// A joint edge is used to connect bodies and joints together /// in a joint graph where each body is a node and each joint /// is an edge. A joint edge belongs to a doubly linked list /// maintained in each attached body. Each joint has two joint /// nodes, one for each attached body. struct b2JointEdge { b2Body* other; ///< provides quick access to the other body attached. b2Joint* joint; ///< the joint b2JointEdge* prev; ///< the previous joint edge in the body's joint list b2JointEdge* next; ///< the next joint edge in the body's joint list }; /// Joint definitions are used to construct joints. struct b2JointDef { b2JointDef() { type = e_unknownJoint; userData = NULL; body1 = NULL; body2 = NULL; collideConnected = false; } /// The joint type is set automatically for concrete joint types. b2JointType type; /// Use this to attach application specific data to your joints. void* userData; /// The first attached body. b2Body* body1; /// The second attached body. b2Body* body2; /// Set this flag to true if the attached bodies should collide. bool collideConnected; }; /// The base joint class. Joints are used to constraint two bodies together in /// various fashions. Some joints also feature limits and motors. class b2Joint { public: /// Get the type of the concrete joint. b2JointType GetType() const; /// Get the first body attached to this joint. b2Body* GetBody1(); /// Get the second body attached to this joint. b2Body* GetBody2(); /// Get the anchor point on body1 in world coordinates. virtual b2Vec2 GetAnchor1() const = 0; /// Get the anchor point on body2 in world coordinates. virtual b2Vec2 GetAnchor2() const = 0; /// Get the reaction force on body2 at the joint anchor. virtual b2Vec2 GetReactionForce() const = 0; /// Get the reaction torque on body2. virtual float32 GetReactionTorque() const = 0; /// Get the next joint the world joint list. b2Joint* GetNext(); /// Get the user data pointer. void* GetUserData(); /// Set the user data pointer. void SetUserData(void* data); //--------------- Internals Below ------------------- protected: friend class b2World; friend class b2Body; friend class b2Island; static b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator); static void Destroy(b2Joint* joint, b2BlockAllocator* allocator); b2Joint(const b2JointDef* def); virtual ~b2Joint() {} virtual void InitVelocityConstraints(const b2TimeStep& step) = 0; virtual void SolveVelocityConstraints(const b2TimeStep& step) = 0; // This returns true if the position errors are within tolerance. virtual void InitPositionConstraints() {} virtual bool SolvePositionConstraints() = 0; b2JointType m_type; b2Joint* m_prev; b2Joint* m_next; b2JointEdge m_node1; b2JointEdge m_node2; b2Body* m_body1; b2Body* m_body2; float32 m_inv_dt; bool m_islandFlag; bool m_collideConnected; void* m_userData; }; inline void b2Jacobian::SetZero() { linear1.SetZero(); angular1 = 0.0f; linear2.SetZero(); angular2 = 0.0f; } inline void b2Jacobian::Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) { linear1 = x1; angular1 = a1; linear2 = x2; angular2 = a2; } inline float32 b2Jacobian::Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) { return b2Dot(linear1, x1) + angular1 * a1 + b2Dot(linear2, x2) + angular2 * a2; } inline b2JointType b2Joint::GetType() const { return m_type; } inline b2Body* b2Joint::GetBody1() { return m_body1; } inline b2Body* b2Joint::GetBody2() { return m_body2; } inline b2Joint* b2Joint::GetNext() { return m_next; } inline void* b2Joint::GetUserData() { return m_userData; } inline void b2Joint::SetUserData(void* data) { m_userData = data; } #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2MouseJoint.cpp000066400000000000000000000102151425065123200265720ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2MouseJoint.h" #include "../b2Body.h" #include "../b2World.h" // p = attached point, m = mouse point // C = p - m // Cdot = v // = v + cross(w, r) // J = [I r_skew] // Identity used: // w k % (rx i + ry j) = w * (-ry i + rx j) b2MouseJoint::b2MouseJoint(const b2MouseJointDef* def) : b2Joint(def) { m_target = def->target; m_localAnchor = b2MulT(m_body2->GetXForm(), m_target); m_maxForce = B2FORCE_INV_SCALE(def->maxForce); m_impulse.SetZero(); float32 mass = m_body2->m_mass; // Frequency float32 omega = 2.0f * b2_pi * def->frequencyHz; // Damping coefficient float32 d = 2.0f * mass * def->dampingRatio * omega; // Spring stiffness float32 k = (def->timeStep * mass) * (omega * omega); // magic formulas b2Assert(d + k > B2_FLT_EPSILON); m_gamma = 1.0f / (d + k); m_beta = k / (d + k); } void b2MouseJoint::SetTarget(const b2Vec2& target) { if (m_body2->IsSleeping()) { m_body2->WakeUp(); } m_target = target; } void b2MouseJoint::InitVelocityConstraints(const b2TimeStep& step) { b2Body* b = m_body2; // Compute the effective mass matrix. b2Vec2 r = b2Mul(b->GetXForm().R, m_localAnchor - b->GetLocalCenter()); // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * invI2 * skew(r2)] // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y -r1.x*r1.y] // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] float32 invMass = b->m_invMass; float32 invI = b->m_invI; b2Mat22 K1; K1.col1.x = invMass; K1.col2.x = 0.0f; K1.col1.y = 0.0f; K1.col2.y = invMass; b2Mat22 K2; K2.col1.x = invI * r.y * r.y; K2.col2.x = -invI * r.x * r.y; K2.col1.y = -invI * r.x * r.y; K2.col2.y = invI * r.x * r.x; b2Mat22 K = K1 + K2; K.col1.x += m_gamma; K.col2.y += m_gamma; m_mass = K.Invert(); m_C = b->m_sweep.c + r - m_target; // Cheat with some damping b->m_angularVelocity *= 0.98f; // Warm starting. b2Vec2 P = B2FORCE_SCALE(step.dt) * m_impulse; b->m_linearVelocity += invMass * P; b->m_angularVelocity += invI * b2Cross(r, P); } void b2MouseJoint::SolveVelocityConstraints(const b2TimeStep& step) { b2Body* b = m_body2; b2Vec2 r = b2Mul(b->GetXForm().R, m_localAnchor - b->GetLocalCenter()); // Cdot = v + cross(w, r) b2Vec2 Cdot = b->m_linearVelocity + b2Cross(b->m_angularVelocity, r); b2Vec2 force = -B2FORCE_INV_SCALE(step.inv_dt) * b2Mul(m_mass, Cdot + (m_beta * step.inv_dt) * m_C + B2FORCE_SCALE(step.dt) * (m_gamma * m_impulse)); b2Vec2 oldForce = m_impulse; m_impulse += force; float32 forceMagnitude = m_impulse.Length(); if (forceMagnitude > m_maxForce) { m_impulse *= m_maxForce / forceMagnitude; } force = m_impulse - oldForce; b2Vec2 P = B2FORCE_SCALE(step.dt) * force; b->m_linearVelocity += b->m_invMass * P; b->m_angularVelocity += b->m_invI * b2Cross(r, P); } b2Vec2 b2MouseJoint::GetAnchor1() const { return m_target; } b2Vec2 b2MouseJoint::GetAnchor2() const { return m_body2->GetWorldPoint(m_localAnchor); } b2Vec2 b2MouseJoint::GetReactionForce() const { return B2FORCE_SCALE(float32(1.0))*m_impulse; } float32 b2MouseJoint::GetReactionTorque() const { return 0.0f; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2MouseJoint.h000066400000000000000000000056771425065123200262570ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_MOUSE_JOINT_H #define B2_MOUSE_JOINT_H #include "b2Joint.h" /// Mouse joint definition. This requires a world target point, /// tuning parameters, and the time step. struct b2MouseJointDef : public b2JointDef { b2MouseJointDef() { type = e_mouseJoint; target.Set(0.0f, 0.0f); maxForce = 0.0f; frequencyHz = 5.0f; dampingRatio = 0.7f; timeStep = 1.0f / 60.0f; } /// The initial world target point. This is assumed /// to coincide with the body anchor initially. b2Vec2 target; /// The maximum constraint force that can be exerted /// to move the candidate body. Usually you will express /// as some multiple of the weight (multiplier * mass * gravity). float32 maxForce; /// The response speed. float32 frequencyHz; /// The damping ratio. 0 = no damping, 1 = critical damping. float32 dampingRatio; /// The time step used in the simulation. float32 timeStep; }; /// A mouse joint is used to make a point on a body track a /// specified world point. This a soft constraint with a maximum /// force. This allows the constraint to stretch and without /// applying huge forces. class b2MouseJoint : public b2Joint { public: /// Implements b2Joint. b2Vec2 GetAnchor1() const; /// Implements b2Joint. b2Vec2 GetAnchor2() const; /// Implements b2Joint. b2Vec2 GetReactionForce() const; /// Implements b2Joint. float32 GetReactionTorque() const; /// Use this to update the target point. void SetTarget(const b2Vec2& target); //--------------- Internals Below ------------------- b2MouseJoint(const b2MouseJointDef* def); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); bool SolvePositionConstraints() { return true; } b2Vec2 m_localAnchor; b2Vec2 m_target; b2Vec2 m_impulse; b2Mat22 m_mass; // effective mass for point-to-point constraint. b2Vec2 m_C; // position error float32 m_maxForce; float32 m_beta; // bias factor float32 m_gamma; // softness }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2PrismaticJoint.cpp000066400000000000000000000367061425065123200274520ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2PrismaticJoint.h" #include "../b2Body.h" #include "../b2World.h" // Linear constraint (point-to-line) // d = p2 - p1 = x2 + r2 - x1 - r1 // C = dot(ay1, d) // Cdot = dot(d, cross(w1, ay1)) + dot(ay1, v2 + cross(w2, r2) - v1 - cross(w1, r1)) // = -dot(ay1, v1) - dot(cross(d + r1, ay1), w1) + dot(ay1, v2) + dot(cross(r2, ay1), v2) // J = [-ay1 -cross(d+r1,ay1) ay1 cross(r2,ay1)] // // Angular constraint // C = a2 - a1 + a_initial // Cdot = w2 - w1 // J = [0 0 -1 0 0 1] // Motor/Limit linear constraint // C = dot(ax1, d) // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + dot(cross(r2, ax1), v2) // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] void b2PrismaticJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) { body1 = b1; body2 = b2; localAnchor1 = body1->GetLocalPoint(anchor); localAnchor2 = body2->GetLocalPoint(anchor); localAxis1 = body1->GetLocalVector(axis); referenceAngle = body2->GetAngle() - body1->GetAngle(); } b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) : b2Joint(def) { m_localAnchor1 = def->localAnchor1; m_localAnchor2 = def->localAnchor2; m_localXAxis1 = def->localAxis1; m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); m_refAngle = def->referenceAngle; m_linearJacobian.SetZero(); m_linearMass = 0.0f; m_force = 0.0f; m_angularMass = 0.0f; m_torque = 0.0f; m_motorJacobian.SetZero(); m_motorMass = 0.0; m_motorForce = 0.0f; m_limitForce = 0.0f; m_limitPositionImpulse = 0.0f; m_lowerTranslation = def->lowerTranslation; m_upperTranslation = def->upperTranslation; m_maxMotorForce = B2FORCE_INV_SCALE(def->maxMotorForce); m_motorSpeed = def->motorSpeed; m_enableLimit = def->enableLimit; m_enableMotor = def->enableMotor; } void b2PrismaticJoint::InitVelocityConstraints(const b2TimeStep& step) { b2Body* b1 = m_body1; b2Body* b2 = m_body2; // Compute the effective masses. b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; float32 invI1 = b1->m_invI, invI2 = b2->m_invI; // Compute point to line constraint effective mass. // J = [-ay1 -cross(d+r1,ay1) ay1 cross(r2,ay1)] b2Vec2 ay1 = b2Mul(b1->GetXForm().R, m_localYAxis1); b2Vec2 e = b2->m_sweep.c + r2 - b1->m_sweep.c; // e = d + r1 m_linearJacobian.Set(-ay1, -b2Cross(e, ay1), ay1, b2Cross(r2, ay1)); m_linearMass = invMass1 + invI1 * m_linearJacobian.angular1 * m_linearJacobian.angular1 + invMass2 + invI2 * m_linearJacobian.angular2 * m_linearJacobian.angular2; b2Assert(m_linearMass > B2_FLT_EPSILON); m_linearMass = 1.0f / m_linearMass; // Compute angular constraint effective mass. m_angularMass = invI1 + invI2; if (m_angularMass > B2_FLT_EPSILON) { m_angularMass = 1.0f / m_angularMass; } // Compute motor and limit terms. if (m_enableLimit || m_enableMotor) { // The motor and limit share a Jacobian and effective mass. b2Vec2 ax1 = b2Mul(b1->GetXForm().R, m_localXAxis1); m_motorJacobian.Set(-ax1, -b2Cross(e, ax1), ax1, b2Cross(r2, ax1)); m_motorMass = invMass1 + invI1 * m_motorJacobian.angular1 * m_motorJacobian.angular1 + invMass2 + invI2 * m_motorJacobian.angular2 * m_motorJacobian.angular2; b2Assert(m_motorMass > B2_FLT_EPSILON); m_motorMass = 1.0f / m_motorMass; if (m_enableLimit) { b2Vec2 d = e - r1; // p2 - p1 float32 jointTranslation = b2Dot(ax1, d); if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) { m_limitState = e_equalLimits; } else if (jointTranslation <= m_lowerTranslation) { if (m_limitState != e_atLowerLimit) { m_limitForce = 0.0f; } m_limitState = e_atLowerLimit; } else if (jointTranslation >= m_upperTranslation) { if (m_limitState != e_atUpperLimit) { m_limitForce = 0.0f; } m_limitState = e_atUpperLimit; } else { m_limitState = e_inactiveLimit; m_limitForce = 0.0f; } } } if (m_enableMotor == false) { m_motorForce = 0.0f; } if (m_enableLimit == false) { m_limitForce = 0.0f; } if (step.warmStarting) { b2Vec2 P1 = B2FORCE_SCALE(step.dt) * (m_force * m_linearJacobian.linear1 + (m_motorForce + m_limitForce) * m_motorJacobian.linear1); b2Vec2 P2 = B2FORCE_SCALE(step.dt) * (m_force * m_linearJacobian.linear2 + (m_motorForce + m_limitForce) * m_motorJacobian.linear2); float32 L1 = B2FORCE_SCALE(step.dt) * (m_force * m_linearJacobian.angular1 - m_torque + (m_motorForce + m_limitForce) * m_motorJacobian.angular1); float32 L2 = B2FORCE_SCALE(step.dt) * (m_force * m_linearJacobian.angular2 + m_torque + (m_motorForce + m_limitForce) * m_motorJacobian.angular2); b1->m_linearVelocity += invMass1 * P1; b1->m_angularVelocity += invI1 * L1; b2->m_linearVelocity += invMass2 * P2; b2->m_angularVelocity += invI2 * L2; } else { m_force = 0.0f; m_torque = 0.0f; m_limitForce = 0.0f; m_motorForce = 0.0f; } m_limitPositionImpulse = 0.0f; } void b2PrismaticJoint::SolveVelocityConstraints(const b2TimeStep& step) { b2Body* b1 = m_body1; b2Body* b2 = m_body2; float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; float32 invI1 = b1->m_invI, invI2 = b2->m_invI; // Solve linear constraint. float32 linearCdot = m_linearJacobian.Compute(b1->m_linearVelocity, b1->m_angularVelocity, b2->m_linearVelocity, b2->m_angularVelocity); float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_linearMass * linearCdot; m_force += force; float32 P = B2FORCE_SCALE(step.dt) * force; b1->m_linearVelocity += (invMass1 * P) * m_linearJacobian.linear1; b1->m_angularVelocity += invI1 * P * m_linearJacobian.angular1; b2->m_linearVelocity += (invMass2 * P) * m_linearJacobian.linear2; b2->m_angularVelocity += invI2 * P * m_linearJacobian.angular2; // Solve angular constraint. float32 angularCdot = b2->m_angularVelocity - b1->m_angularVelocity; float32 torque = -B2FORCE_INV_SCALE(step.inv_dt) * m_angularMass * angularCdot; m_torque += torque; float32 L = B2FORCE_SCALE(step.dt) * torque; b1->m_angularVelocity -= invI1 * L; b2->m_angularVelocity += invI2 * L; // Solve linear motor constraint. if (m_enableMotor && m_limitState != e_equalLimits) { float32 motorCdot = m_motorJacobian.Compute(b1->m_linearVelocity, b1->m_angularVelocity, b2->m_linearVelocity, b2->m_angularVelocity) - m_motorSpeed; float32 motorForce = -B2FORCE_INV_SCALE(step.inv_dt) * m_motorMass * motorCdot; float32 oldMotorForce = m_motorForce; m_motorForce = b2Clamp(m_motorForce + motorForce, -m_maxMotorForce, m_maxMotorForce); motorForce = m_motorForce - oldMotorForce; float32 P = B2FORCE_SCALE(step.dt) * motorForce; b1->m_linearVelocity += (invMass1 * P) * m_motorJacobian.linear1; b1->m_angularVelocity += invI1 * P * m_motorJacobian.angular1; b2->m_linearVelocity += (invMass2 * P) * m_motorJacobian.linear2; b2->m_angularVelocity += invI2 * P * m_motorJacobian.angular2; } // Solve linear limit constraint. if (m_enableLimit && m_limitState != e_inactiveLimit) { float32 limitCdot = m_motorJacobian.Compute(b1->m_linearVelocity, b1->m_angularVelocity, b2->m_linearVelocity, b2->m_angularVelocity); float32 limitForce = -B2FORCE_INV_SCALE(step.inv_dt) * m_motorMass * limitCdot; if (m_limitState == e_equalLimits) { m_limitForce += limitForce; } else if (m_limitState == e_atLowerLimit) { float32 oldLimitForce = m_limitForce; m_limitForce = b2Max(m_limitForce + limitForce, 0.0f); limitForce = m_limitForce - oldLimitForce; } else if (m_limitState == e_atUpperLimit) { float32 oldLimitForce = m_limitForce; m_limitForce = b2Min(m_limitForce + limitForce, 0.0f); limitForce = m_limitForce - oldLimitForce; } float32 P = B2FORCE_SCALE(step.dt) * limitForce; b1->m_linearVelocity += (invMass1 * P) * m_motorJacobian.linear1; b1->m_angularVelocity += invI1 * P * m_motorJacobian.angular1; b2->m_linearVelocity += (invMass2 * P) * m_motorJacobian.linear2; b2->m_angularVelocity += invI2 * P * m_motorJacobian.angular2; } } bool b2PrismaticJoint::SolvePositionConstraints() { b2Body* b1 = m_body1; b2Body* b2 = m_body2; float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; float32 invI1 = b1->m_invI, invI2 = b2->m_invI; b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; b2Vec2 d = p2 - p1; b2Vec2 ay1 = b2Mul(b1->GetXForm().R, m_localYAxis1); // Solve linear (point-to-line) constraint. float32 linearC = b2Dot(ay1, d); // Prevent overly large corrections. linearC = b2Clamp(linearC, -b2_maxLinearCorrection, b2_maxLinearCorrection); float32 linearImpulse = -m_linearMass * linearC; b1->m_sweep.c += (invMass1 * linearImpulse) * m_linearJacobian.linear1; b1->m_sweep.a += invI1 * linearImpulse * m_linearJacobian.angular1; //b1->SynchronizeTransform(); // updated by angular constraint b2->m_sweep.c += (invMass2 * linearImpulse) * m_linearJacobian.linear2; b2->m_sweep.a += invI2 * linearImpulse * m_linearJacobian.angular2; //b2->SynchronizeTransform(); // updated by angular constraint float32 positionError = b2Abs(linearC); // Solve angular constraint. float32 angularC = b2->m_sweep.a - b1->m_sweep.a - m_refAngle; // Prevent overly large corrections. angularC = b2Clamp(angularC, -b2_maxAngularCorrection, b2_maxAngularCorrection); float32 angularImpulse = -m_angularMass * angularC; b1->m_sweep.a -= b1->m_invI * angularImpulse; b2->m_sweep.a += b2->m_invI * angularImpulse; b1->SynchronizeTransform(); b2->SynchronizeTransform(); float32 angularError = b2Abs(angularC); // Solve linear limit constraint. if (m_enableLimit && m_limitState != e_inactiveLimit) { b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; b2Vec2 d = p2 - p1; b2Vec2 ax1 = b2Mul(b1->GetXForm().R, m_localXAxis1); float32 translation = b2Dot(ax1, d); float32 limitImpulse = 0.0f; if (m_limitState == e_equalLimits) { // Prevent large angular corrections float32 limitC = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); limitImpulse = -m_motorMass * limitC; positionError = b2Max(positionError, b2Abs(angularC)); } else if (m_limitState == e_atLowerLimit) { float32 limitC = translation - m_lowerTranslation; positionError = b2Max(positionError, -limitC); // Prevent large linear corrections and allow some slop. limitC = b2Clamp(limitC + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); limitImpulse = -m_motorMass * limitC; float32 oldLimitImpulse = m_limitPositionImpulse; m_limitPositionImpulse = b2Max(m_limitPositionImpulse + limitImpulse, 0.0f); limitImpulse = m_limitPositionImpulse - oldLimitImpulse; } else if (m_limitState == e_atUpperLimit) { float32 limitC = translation - m_upperTranslation; positionError = b2Max(positionError, limitC); // Prevent large linear corrections and allow some slop. limitC = b2Clamp(limitC - b2_linearSlop, 0.0f, b2_maxLinearCorrection); limitImpulse = -m_motorMass * limitC; float32 oldLimitImpulse = m_limitPositionImpulse; m_limitPositionImpulse = b2Min(m_limitPositionImpulse + limitImpulse, 0.0f); limitImpulse = m_limitPositionImpulse - oldLimitImpulse; } b1->m_sweep.c += (invMass1 * limitImpulse) * m_motorJacobian.linear1; b1->m_sweep.a += invI1 * limitImpulse * m_motorJacobian.angular1; b2->m_sweep.c += (invMass2 * limitImpulse) * m_motorJacobian.linear2; b2->m_sweep.a += invI2 * limitImpulse * m_motorJacobian.angular2; b1->SynchronizeTransform(); b2->SynchronizeTransform(); } return positionError <= b2_linearSlop && angularError <= b2_angularSlop; } b2Vec2 b2PrismaticJoint::GetAnchor1() const { return m_body1->GetWorldPoint(m_localAnchor1); } b2Vec2 b2PrismaticJoint::GetAnchor2() const { return m_body2->GetWorldPoint(m_localAnchor2); } b2Vec2 b2PrismaticJoint::GetReactionForce() const { b2Vec2 ax1 = b2Mul(m_body1->GetXForm().R, m_localXAxis1); b2Vec2 ay1 = b2Mul(m_body1->GetXForm().R, m_localYAxis1); return B2FORCE_SCALE(float32(1.0))*(m_limitForce * ax1 + m_force * ay1); } float32 b2PrismaticJoint::GetReactionTorque() const { return B2FORCE_SCALE(m_torque); } float32 b2PrismaticJoint::GetJointTranslation() const { b2Body* b1 = m_body1; b2Body* b2 = m_body2; b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); b2Vec2 d = p2 - p1; b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); float32 translation = b2Dot(d, axis); return translation; } float32 b2PrismaticJoint::GetJointSpeed() const { b2Body* b1 = m_body1; b2Body* b2 = m_body2; b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; b2Vec2 d = p2 - p1; b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); b2Vec2 v1 = b1->m_linearVelocity; b2Vec2 v2 = b2->m_linearVelocity; float32 w1 = b1->m_angularVelocity; float32 w2 = b2->m_angularVelocity; float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); return speed; } bool b2PrismaticJoint::IsLimitEnabled() const { return m_enableLimit; } void b2PrismaticJoint::EnableLimit(bool flag) { m_enableLimit = flag; } float32 b2PrismaticJoint::GetLowerLimit() const { return m_lowerTranslation; } float32 b2PrismaticJoint::GetUpperLimit() const { return m_upperTranslation; } void b2PrismaticJoint::SetLimits(float32 lower, float32 upper) { b2Assert(lower <= upper); m_lowerTranslation = lower; m_upperTranslation = upper; } bool b2PrismaticJoint::IsMotorEnabled() const { return m_enableMotor; } void b2PrismaticJoint::EnableMotor(bool flag) { m_enableMotor = flag; } void b2PrismaticJoint::SetMotorSpeed(float32 speed) { m_motorSpeed = speed; } void b2PrismaticJoint::SetMaxMotorForce(float32 force) { m_maxMotorForce = B2FORCE_SCALE(float32(1.0))*force; } float32 b2PrismaticJoint::GetMotorForce() const { return m_motorForce; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2PrismaticJoint.h000066400000000000000000000125231425065123200271060ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_PRISMATIC_JOINT_H #define B2_PRISMATIC_JOINT_H #include "b2Joint.h" /// Prismatic joint definition. This requires defining a line of /// motion using an axis and an anchor point. The definition uses local /// anchor points and a local axis so that the initial configuration /// can violate the constraint slightly. The joint translation is zero /// when the local anchor points coincide in world space. Using local /// anchors and a local axis helps when saving and loading a game. struct b2PrismaticJointDef : public b2JointDef { b2PrismaticJointDef() { type = e_prismaticJoint; localAnchor1.SetZero(); localAnchor2.SetZero(); localAxis1.Set(1.0f, 0.0f); referenceAngle = 0.0f; enableLimit = false; lowerTranslation = 0.0f; upperTranslation = 0.0f; enableMotor = false; maxMotorForce = 0.0f; motorSpeed = 0.0f; } /// Initialize the bodies, anchors, axis, and reference angle using the world /// anchor and world axis. void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& anchor, const b2Vec2& axis); /// The local anchor point relative to body1's origin. b2Vec2 localAnchor1; /// The local anchor point relative to body2's origin. b2Vec2 localAnchor2; /// The local translation axis in body1. b2Vec2 localAxis1; /// The constrained angle between the bodies: body2_angle - body1_angle. float32 referenceAngle; /// Enable/disable the joint limit. bool enableLimit; /// The lower translation limit, usually in meters. float32 lowerTranslation; /// The upper translation limit, usually in meters. float32 upperTranslation; /// Enable/disable the joint motor. bool enableMotor; /// The maximum motor torque, usually in N-m. float32 maxMotorForce; /// The desired motor speed in radians per second. float32 motorSpeed; }; /// A prismatic joint. This joint provides one degree of freedom: translation /// along an axis fixed in body1. Relative rotation is prevented. You can /// use a joint limit to restrict the range of motion and a joint motor to /// drive the motion or to model joint friction. class b2PrismaticJoint : public b2Joint { public: b2Vec2 GetAnchor1() const; b2Vec2 GetAnchor2() const; b2Vec2 GetReactionForce() const; float32 GetReactionTorque() const; /// Get the current joint translation, usually in meters. float32 GetJointTranslation() const; /// Get the current joint translation speed, usually in meters per second. float32 GetJointSpeed() const; /// Is the joint limit enabled? bool IsLimitEnabled() const; /// Enable/disable the joint limit. void EnableLimit(bool flag); /// Get the lower joint limit, usually in meters. float32 GetLowerLimit() const; /// Get the upper joint limit, usually in meters. float32 GetUpperLimit() const; /// Set the joint limits, usually in meters. void SetLimits(float32 lower, float32 upper); /// Is the joint motor enabled? bool IsMotorEnabled() const; /// Enable/disable the joint motor. void EnableMotor(bool flag); /// Set the motor speed, usually in meters per second. void SetMotorSpeed(float32 speed); /// Get the motor speed, usually in meters per second. float32 GetMotorSpeed() const; /// Set the maximum motor force, usually in N. void SetMaxMotorForce(float32 force); /// Get the current motor force, usually in N. float32 GetMotorForce() const; //--------------- Internals Below ------------------- b2PrismaticJoint(const b2PrismaticJointDef* def); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); bool SolvePositionConstraints(); b2Vec2 m_localAnchor1; b2Vec2 m_localAnchor2; b2Vec2 m_localXAxis1; b2Vec2 m_localYAxis1; float32 m_refAngle; b2Jacobian m_linearJacobian; float32 m_linearMass; // effective mass for point-to-line constraint. float32 m_force; float32 m_angularMass; // effective mass for angular constraint. float32 m_torque; b2Jacobian m_motorJacobian; float32 m_motorMass; // effective mass for motor/limit translational constraint. float32 m_motorForce; float32 m_limitForce; float32 m_limitPositionImpulse; float32 m_lowerTranslation; float32 m_upperTranslation; float32 m_maxMotorForce; float32 m_motorSpeed; bool m_enableLimit; bool m_enableMotor; b2LimitState m_limitState; }; inline float32 b2PrismaticJoint::GetMotorSpeed() const { return m_motorSpeed; } #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2PulleyJoint.cpp000066400000000000000000000273471425065123200267720ustar00rootroot00000000000000/* * Copyright (c) 2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2PulleyJoint.h" #include "../b2Body.h" #include "../b2World.h" // Pulley: // length1 = norm(p1 - s1) // length2 = norm(p2 - s2) // C0 = (length1 + ratio * length2)_initial // C = C0 - (length1 + ratio * length2) >= 0 // u1 = (p1 - s1) / norm(p1 - s1) // u2 = (p2 - s2) / norm(p2 - s2) // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] // K = J * invM * JT // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * cross(r2, u2)^2) // // Limit: // C = maxLength - length // u = (p - s) / norm(p - s) // Cdot = -dot(u, v + cross(w, r)) // K = invMass + invI * cross(r, u)^2 // 0 <= impulse void b2PulleyJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& ga1, const b2Vec2& ga2, const b2Vec2& anchor1, const b2Vec2& anchor2, float32 r) { body1 = b1; body2 = b2; groundAnchor1 = ga1; groundAnchor2 = ga2; localAnchor1 = body1->GetLocalPoint(anchor1); localAnchor2 = body2->GetLocalPoint(anchor2); b2Vec2 d1 = anchor1 - ga1; length1 = d1.Length(); b2Vec2 d2 = anchor2 - ga2; length2 = d2.Length(); ratio = r; b2Assert(ratio > B2_FLT_EPSILON); float32 C = length1 + ratio * length2; maxLength1 = C - ratio * b2_minPulleyLength; maxLength2 = (C - b2_minPulleyLength) / ratio; } b2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def) : b2Joint(def) { m_ground = m_body1->GetWorld()->GetGroundBody(); m_groundAnchor1 = def->groundAnchor1 - m_ground->GetXForm().position; m_groundAnchor2 = def->groundAnchor2 - m_ground->GetXForm().position; m_localAnchor1 = def->localAnchor1; m_localAnchor2 = def->localAnchor2; b2Assert(def->ratio != 0.0f); m_ratio = def->ratio; m_constant = def->length1 + m_ratio * def->length2; m_maxLength1 = b2Min(def->maxLength1, m_constant - m_ratio * b2_minPulleyLength); m_maxLength2 = b2Min(def->maxLength2, (m_constant - b2_minPulleyLength) / m_ratio); m_force = 0.0f; m_limitForce1 = 0.0f; m_limitForce2 = 0.0f; } void b2PulleyJoint::InitVelocityConstraints(const b2TimeStep& step) { b2Body* b1 = m_body1; b2Body* b2 = m_body2; b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; b2Vec2 s1 = m_ground->GetXForm().position + m_groundAnchor1; b2Vec2 s2 = m_ground->GetXForm().position + m_groundAnchor2; // Get the pulley axes. m_u1 = p1 - s1; m_u2 = p2 - s2; float32 length1 = m_u1.Length(); float32 length2 = m_u2.Length(); if (length1 > b2_linearSlop) { m_u1 *= 1.0f / length1; } else { m_u1.SetZero(); } if (length2 > b2_linearSlop) { m_u2 *= 1.0f / length2; } else { m_u2.SetZero(); } float32 C = m_constant - length1 - m_ratio * length2; if (C > 0.0f) { m_state = e_inactiveLimit; m_force = 0.0f; } else { m_state = e_atUpperLimit; m_positionImpulse = 0.0f; } if (length1 < m_maxLength1) { m_limitState1 = e_inactiveLimit; m_limitForce1 = 0.0f; } else { m_limitState1 = e_atUpperLimit; m_limitPositionImpulse1 = 0.0f; } if (length2 < m_maxLength2) { m_limitState2 = e_inactiveLimit; m_limitForce2 = 0.0f; } else { m_limitState2 = e_atUpperLimit; m_limitPositionImpulse2 = 0.0f; } // Compute effective mass. float32 cr1u1 = b2Cross(r1, m_u1); float32 cr2u2 = b2Cross(r2, m_u2); m_limitMass1 = b1->m_invMass + b1->m_invI * cr1u1 * cr1u1; m_limitMass2 = b2->m_invMass + b2->m_invI * cr2u2 * cr2u2; m_pulleyMass = m_limitMass1 + m_ratio * m_ratio * m_limitMass2; b2Assert(m_limitMass1 > B2_FLT_EPSILON); b2Assert(m_limitMass2 > B2_FLT_EPSILON); b2Assert(m_pulleyMass > B2_FLT_EPSILON); m_limitMass1 = 1.0f / m_limitMass1; m_limitMass2 = 1.0f / m_limitMass2; m_pulleyMass = 1.0f / m_pulleyMass; if (step.warmStarting) { // Warm starting. b2Vec2 P1 = B2FORCE_SCALE(step.dt) * (-m_force - m_limitForce1) * m_u1; b2Vec2 P2 = B2FORCE_SCALE(step.dt) * (-m_ratio * m_force - m_limitForce2) * m_u2; b1->m_linearVelocity += b1->m_invMass * P1; b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); b2->m_linearVelocity += b2->m_invMass * P2; b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); } else { m_force = 0.0f; m_limitForce1 = 0.0f; m_limitForce2 = 0.0f; } } void b2PulleyJoint::SolveVelocityConstraints(const b2TimeStep& step) { b2Body* b1 = m_body1; b2Body* b2 = m_body2; b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); if (m_state == e_atUpperLimit) { b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); float32 Cdot = -b2Dot(m_u1, v1) - m_ratio * b2Dot(m_u2, v2); float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_pulleyMass * Cdot; float32 oldForce = m_force; m_force = b2Max(0.0f, m_force + force); force = m_force - oldForce; b2Vec2 P1 = -B2FORCE_SCALE(step.dt) * force * m_u1; b2Vec2 P2 = -B2FORCE_SCALE(step.dt) * m_ratio * force * m_u2; b1->m_linearVelocity += b1->m_invMass * P1; b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); b2->m_linearVelocity += b2->m_invMass * P2; b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); } if (m_limitState1 == e_atUpperLimit) { b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); float32 Cdot = -b2Dot(m_u1, v1); float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_limitMass1 * Cdot; float32 oldForce = m_limitForce1; m_limitForce1 = b2Max(0.0f, m_limitForce1 + force); force = m_limitForce1 - oldForce; b2Vec2 P1 = -B2FORCE_SCALE(step.dt) * force * m_u1; b1->m_linearVelocity += b1->m_invMass * P1; b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); } if (m_limitState2 == e_atUpperLimit) { b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); float32 Cdot = -b2Dot(m_u2, v2); float32 force = -B2FORCE_INV_SCALE(step.inv_dt) * m_limitMass2 * Cdot; float32 oldForce = m_limitForce2; m_limitForce2 = b2Max(0.0f, m_limitForce2 + force); force = m_limitForce2 - oldForce; b2Vec2 P2 = -B2FORCE_SCALE(step.dt) * force * m_u2; b2->m_linearVelocity += b2->m_invMass * P2; b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); } } bool b2PulleyJoint::SolvePositionConstraints() { b2Body* b1 = m_body1; b2Body* b2 = m_body2; b2Vec2 s1 = m_ground->GetXForm().position + m_groundAnchor1; b2Vec2 s2 = m_ground->GetXForm().position + m_groundAnchor2; float32 linearError = 0.0f; if (m_state == e_atUpperLimit) { b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; // Get the pulley axes. m_u1 = p1 - s1; m_u2 = p2 - s2; float32 length1 = m_u1.Length(); float32 length2 = m_u2.Length(); if (length1 > b2_linearSlop) { m_u1 *= 1.0f / length1; } else { m_u1.SetZero(); } if (length2 > b2_linearSlop) { m_u2 *= 1.0f / length2; } else { m_u2.SetZero(); } float32 C = m_constant - length1 - m_ratio * length2; linearError = b2Max(linearError, -C); C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); float32 impulse = -m_pulleyMass * C; float32 oldImpulse = m_positionImpulse; m_positionImpulse = b2Max(0.0f, m_positionImpulse + impulse); impulse = m_positionImpulse - oldImpulse; b2Vec2 P1 = -impulse * m_u1; b2Vec2 P2 = -m_ratio * impulse * m_u2; b1->m_sweep.c += b1->m_invMass * P1; b1->m_sweep.a += b1->m_invI * b2Cross(r1, P1); b2->m_sweep.c += b2->m_invMass * P2; b2->m_sweep.a += b2->m_invI * b2Cross(r2, P2); b1->SynchronizeTransform(); b2->SynchronizeTransform(); } if (m_limitState1 == e_atUpperLimit) { b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; m_u1 = p1 - s1; float32 length1 = m_u1.Length(); if (length1 > b2_linearSlop) { m_u1 *= 1.0f / length1; } else { m_u1.SetZero(); } float32 C = m_maxLength1 - length1; linearError = b2Max(linearError, -C); C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); float32 impulse = -m_limitMass1 * C; float32 oldLimitPositionImpulse = m_limitPositionImpulse1; m_limitPositionImpulse1 = b2Max(0.0f, m_limitPositionImpulse1 + impulse); impulse = m_limitPositionImpulse1 - oldLimitPositionImpulse; b2Vec2 P1 = -impulse * m_u1; b1->m_sweep.c += b1->m_invMass * P1; b1->m_sweep.a += b1->m_invI * b2Cross(r1, P1); b1->SynchronizeTransform(); } if (m_limitState2 == e_atUpperLimit) { b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p2 = b2->m_sweep.c + r2; m_u2 = p2 - s2; float32 length2 = m_u2.Length(); if (length2 > b2_linearSlop) { m_u2 *= 1.0f / length2; } else { m_u2.SetZero(); } float32 C = m_maxLength2 - length2; linearError = b2Max(linearError, -C); C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); float32 impulse = -m_limitMass2 * C; float32 oldLimitPositionImpulse = m_limitPositionImpulse2; m_limitPositionImpulse2 = b2Max(0.0f, m_limitPositionImpulse2 + impulse); impulse = m_limitPositionImpulse2 - oldLimitPositionImpulse; b2Vec2 P2 = -impulse * m_u2; b2->m_sweep.c += b2->m_invMass * P2; b2->m_sweep.a += b2->m_invI * b2Cross(r2, P2); b2->SynchronizeTransform(); } return linearError < b2_linearSlop; } b2Vec2 b2PulleyJoint::GetAnchor1() const { return m_body1->GetWorldPoint(m_localAnchor1); } b2Vec2 b2PulleyJoint::GetAnchor2() const { return m_body2->GetWorldPoint(m_localAnchor2); } b2Vec2 b2PulleyJoint::GetReactionForce() const { b2Vec2 F = B2FORCE_SCALE(m_force) * m_u2; return F; } float32 b2PulleyJoint::GetReactionTorque() const { return 0.0f; } b2Vec2 b2PulleyJoint::GetGroundAnchor1() const { return m_ground->GetXForm().position + m_groundAnchor1; } b2Vec2 b2PulleyJoint::GetGroundAnchor2() const { return m_ground->GetXForm().position + m_groundAnchor2; } float32 b2PulleyJoint::GetLength1() const { b2Vec2 p = m_body1->GetWorldPoint(m_localAnchor1); b2Vec2 s = m_ground->GetXForm().position + m_groundAnchor1; b2Vec2 d = p - s; return d.Length(); } float32 b2PulleyJoint::GetLength2() const { b2Vec2 p = m_body2->GetWorldPoint(m_localAnchor2); b2Vec2 s = m_ground->GetXForm().position + m_groundAnchor2; b2Vec2 d = p - s; return d.Length(); } float32 b2PulleyJoint::GetRatio() const { return m_ratio; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2PulleyJoint.h000066400000000000000000000106651425065123200264320ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_PULLEY_JOINT_H #define B2_PULLEY_JOINT_H #include "b2Joint.h" const float32 b2_minPulleyLength = 2.0f; /// Pulley joint definition. This requires two ground anchors, /// two dynamic body anchor points, max lengths for each side, /// and a pulley ratio. struct b2PulleyJointDef : public b2JointDef { b2PulleyJointDef() { type = e_pulleyJoint; groundAnchor1.Set(-1.0f, 1.0f); groundAnchor2.Set(1.0f, 1.0f); localAnchor1.Set(-1.0f, 0.0f); localAnchor2.Set(1.0f, 0.0f); length1 = 0.0f; maxLength1 = 0.0f; length2 = 0.0f; maxLength2 = 0.0f; ratio = 1.0f; collideConnected = true; } /// Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors. void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& groundAnchor1, const b2Vec2& groundAnchor2, const b2Vec2& anchor1, const b2Vec2& anchor2, float32 ratio); /// The first ground anchor in world coordinates. This point never moves. b2Vec2 groundAnchor1; /// The second ground anchor in world coordinates. This point never moves. b2Vec2 groundAnchor2; /// The local anchor point relative to body1's origin. b2Vec2 localAnchor1; /// The local anchor point relative to body2's origin. b2Vec2 localAnchor2; /// The a reference length for the segment attached to body1. float32 length1; /// The maximum length of the segment attached to body1. float32 maxLength1; /// The a reference length for the segment attached to body2. float32 length2; /// The maximum length of the segment attached to body2. float32 maxLength2; /// The pulley ratio, used to simulate a block-and-tackle. float32 ratio; }; /// The pulley joint is connected to two bodies and two fixed ground points. /// The pulley supports a ratio such that: /// length1 + ratio * length2 <= constant /// Yes, the force transmitted is scaled by the ratio. /// The pulley also enforces a maximum length limit on both sides. This is /// useful to prevent one side of the pulley hitting the top. class b2PulleyJoint : public b2Joint { public: b2Vec2 GetAnchor1() const; b2Vec2 GetAnchor2() const; b2Vec2 GetReactionForce() const; float32 GetReactionTorque() const; /// Get the first ground anchor. b2Vec2 GetGroundAnchor1() const; /// Get the second ground anchor. b2Vec2 GetGroundAnchor2() const; /// Get the current length of the segment attached to body1. float32 GetLength1() const; /// Get the current length of the segment attached to body2. float32 GetLength2() const; /// Get the pulley ratio. float32 GetRatio() const; //--------------- Internals Below ------------------- b2PulleyJoint(const b2PulleyJointDef* data); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); bool SolvePositionConstraints(); b2Body* m_ground; b2Vec2 m_groundAnchor1; b2Vec2 m_groundAnchor2; b2Vec2 m_localAnchor1; b2Vec2 m_localAnchor2; b2Vec2 m_u1; b2Vec2 m_u2; float32 m_constant; float32 m_ratio; float32 m_maxLength1; float32 m_maxLength2; // Effective masses float32 m_pulleyMass; float32 m_limitMass1; float32 m_limitMass2; // Impulses for accumulation/warm starting. float32 m_force; float32 m_limitForce1; float32 m_limitForce2; // Position impulses for accumulation. float32 m_positionImpulse; float32 m_limitPositionImpulse1; float32 m_limitPositionImpulse2; b2LimitState m_state; b2LimitState m_limitState1; b2LimitState m_limitState2; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2RevoluteJoint.cpp000066400000000000000000000270001425065123200273070ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2RevoluteJoint.h" #include "../b2Body.h" #include "../b2World.h" #include "../b2Island.h" // Point-to-point constraint // C = p2 - p1 // Cdot = v2 - v1 // = v2 + cross(w2, r2) - v1 - cross(w1, r1) // J = [-I -r1_skew I r2_skew ] // Identity used: // w k % (rx i + ry j) = w * (-ry i + rx j) // Motor constraint // Cdot = w2 - w1 // J = [0 0 -1 0 0 1] // K = invI1 + invI2 void b2RevoluteJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor) { body1 = b1; body2 = b2; localAnchor1 = body1->GetLocalPoint(anchor); localAnchor2 = body2->GetLocalPoint(anchor); referenceAngle = body2->GetAngle() - body1->GetAngle(); } b2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def) : b2Joint(def) { m_localAnchor1 = def->localAnchor1; m_localAnchor2 = def->localAnchor2; m_referenceAngle = def->referenceAngle; m_pivotForce.Set(0.0f, 0.0f); m_motorForce = 0.0f; m_limitForce = 0.0f; m_limitPositionImpulse = 0.0f; m_lowerAngle = def->lowerAngle; m_upperAngle = def->upperAngle; m_maxMotorTorque = def->maxMotorTorque; m_motorSpeed = def->motorSpeed; m_enableLimit = def->enableLimit; m_enableMotor = def->enableMotor; m_limitState = e_inactiveLimit; } void b2RevoluteJoint::InitVelocityConstraints(const b2TimeStep& step) { b2Body* b1 = m_body1; b2Body* b2 = m_body2; // Compute the effective mass matrix. b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * invI2 * skew(r2)] // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y -r1.x*r1.y] // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; float32 invI1 = b1->m_invI, invI2 = b2->m_invI; b2Mat22 K1; K1.col1.x = invMass1 + invMass2; K1.col2.x = 0.0f; K1.col1.y = 0.0f; K1.col2.y = invMass1 + invMass2; b2Mat22 K2; K2.col1.x = invI1 * r1.y * r1.y; K2.col2.x = -invI1 * r1.x * r1.y; K2.col1.y = -invI1 * r1.x * r1.y; K2.col2.y = invI1 * r1.x * r1.x; b2Mat22 K3; K3.col1.x = invI2 * r2.y * r2.y; K3.col2.x = -invI2 * r2.x * r2.y; K3.col1.y = -invI2 * r2.x * r2.y; K3.col2.y = invI2 * r2.x * r2.x; b2Mat22 K = K1 + K2 + K3; m_pivotMass = K.Invert(); m_motorMass = 1.0f / (invI1 + invI2); if (m_enableMotor == false) { m_motorForce = 0.0f; } if (m_enableLimit) { float32 jointAngle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; if (b2Abs(m_upperAngle - m_lowerAngle) < 2.0f * b2_angularSlop) { m_limitState = e_equalLimits; } else if (jointAngle <= m_lowerAngle) { if (m_limitState != e_atLowerLimit) { m_limitForce = 0.0f; } m_limitState = e_atLowerLimit; } else if (jointAngle >= m_upperAngle) { if (m_limitState != e_atUpperLimit) { m_limitForce = 0.0f; } m_limitState = e_atUpperLimit; } else { m_limitState = e_inactiveLimit; m_limitForce = 0.0f; } } else { m_limitForce = 0.0f; } if (step.warmStarting) { b1->m_linearVelocity -= B2FORCE_SCALE(step.dt) * invMass1 * m_pivotForce; b1->m_angularVelocity -= B2FORCE_SCALE(step.dt) * invI1 * (b2Cross(r1, m_pivotForce) + B2FORCE_INV_SCALE(m_motorForce + m_limitForce)); b2->m_linearVelocity += B2FORCE_SCALE(step.dt) * invMass2 * m_pivotForce; b2->m_angularVelocity += B2FORCE_SCALE(step.dt) * invI2 * (b2Cross(r2, m_pivotForce) + B2FORCE_INV_SCALE(m_motorForce + m_limitForce)); } else { m_pivotForce.SetZero(); m_motorForce = 0.0f; m_limitForce = 0.0f; } m_limitPositionImpulse = 0.0f; } void b2RevoluteJoint::SolveVelocityConstraints(const b2TimeStep& step) { b2Body* b1 = m_body1; b2Body* b2 = m_body2; b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); // Solve point-to-point constraint b2Vec2 pivotCdot = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2) - b1->m_linearVelocity - b2Cross(b1->m_angularVelocity, r1); b2Vec2 pivotForce = -B2FORCE_INV_SCALE(step.inv_dt) * b2Mul(m_pivotMass, pivotCdot); m_pivotForce += pivotForce; b2Vec2 P = B2FORCE_SCALE(step.dt) * pivotForce; b1->m_linearVelocity -= b1->m_invMass * P; b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); b2->m_linearVelocity += b2->m_invMass * P; b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); if (m_enableMotor && m_limitState != e_equalLimits) { float32 motorCdot = b2->m_angularVelocity - b1->m_angularVelocity - m_motorSpeed; float32 motorForce = -step.inv_dt * m_motorMass * motorCdot; float32 oldMotorForce = m_motorForce; m_motorForce = b2Clamp(m_motorForce + motorForce, -m_maxMotorTorque, m_maxMotorTorque); motorForce = m_motorForce - oldMotorForce; float32 P = step.dt * motorForce; b1->m_angularVelocity -= b1->m_invI * P; b2->m_angularVelocity += b2->m_invI * P; } if (m_enableLimit && m_limitState != e_inactiveLimit) { float32 limitCdot = b2->m_angularVelocity - b1->m_angularVelocity; float32 limitForce = -step.inv_dt * m_motorMass * limitCdot; if (m_limitState == e_equalLimits) { m_limitForce += limitForce; } else if (m_limitState == e_atLowerLimit) { float32 oldLimitForce = m_limitForce; m_limitForce = b2Max(m_limitForce + limitForce, 0.0f); limitForce = m_limitForce - oldLimitForce; } else if (m_limitState == e_atUpperLimit) { float32 oldLimitForce = m_limitForce; m_limitForce = b2Min(m_limitForce + limitForce, 0.0f); limitForce = m_limitForce - oldLimitForce; } float32 P = step.dt * limitForce; b1->m_angularVelocity -= b1->m_invI * P; b2->m_angularVelocity += b2->m_invI * P; } } bool b2RevoluteJoint::SolvePositionConstraints() { b2Body* b1 = m_body1; b2Body* b2 = m_body2; float32 positionError = 0.0f; // Solve point-to-point position error. b2Vec2 r1 = b2Mul(b1->GetXForm().R, m_localAnchor1 - b1->GetLocalCenter()); b2Vec2 r2 = b2Mul(b2->GetXForm().R, m_localAnchor2 - b2->GetLocalCenter()); b2Vec2 p1 = b1->m_sweep.c + r1; b2Vec2 p2 = b2->m_sweep.c + r2; b2Vec2 ptpC = p2 - p1; positionError = ptpC.Length(); // Prevent overly large corrections. //b2Vec2 dpMax(b2_maxLinearCorrection, b2_maxLinearCorrection); //ptpC = b2Clamp(ptpC, -dpMax, dpMax); float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; float32 invI1 = b1->m_invI, invI2 = b2->m_invI; b2Mat22 K1; K1.col1.x = invMass1 + invMass2; K1.col2.x = 0.0f; K1.col1.y = 0.0f; K1.col2.y = invMass1 + invMass2; b2Mat22 K2; K2.col1.x = invI1 * r1.y * r1.y; K2.col2.x = -invI1 * r1.x * r1.y; K2.col1.y = -invI1 * r1.x * r1.y; K2.col2.y = invI1 * r1.x * r1.x; b2Mat22 K3; K3.col1.x = invI2 * r2.y * r2.y; K3.col2.x = -invI2 * r2.x * r2.y; K3.col1.y = -invI2 * r2.x * r2.y; K3.col2.y = invI2 * r2.x * r2.x; b2Mat22 K = K1 + K2 + K3; b2Vec2 impulse = K.Solve(-ptpC); b1->m_sweep.c -= b1->m_invMass * impulse; b1->m_sweep.a -= b1->m_invI * b2Cross(r1, impulse); b2->m_sweep.c += b2->m_invMass * impulse; b2->m_sweep.a += b2->m_invI * b2Cross(r2, impulse); b1->SynchronizeTransform(); b2->SynchronizeTransform(); // Handle limits. float32 angularError = 0.0f; if (m_enableLimit && m_limitState != e_inactiveLimit) { float32 angle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; float32 limitImpulse = 0.0f; if (m_limitState == e_equalLimits) { // Prevent large angular corrections float32 limitC = b2Clamp(angle, -b2_maxAngularCorrection, b2_maxAngularCorrection); limitImpulse = -m_motorMass * limitC; angularError = b2Abs(limitC); } else if (m_limitState == e_atLowerLimit) { float32 limitC = angle - m_lowerAngle; angularError = b2Max(0.0f, -limitC); // Prevent large angular corrections and allow some slop. limitC = b2Clamp(limitC + b2_angularSlop, -b2_maxAngularCorrection, 0.0f); limitImpulse = -m_motorMass * limitC; float32 oldLimitImpulse = m_limitPositionImpulse; m_limitPositionImpulse = b2Max(m_limitPositionImpulse + limitImpulse, 0.0f); limitImpulse = m_limitPositionImpulse - oldLimitImpulse; } else if (m_limitState == e_atUpperLimit) { float32 limitC = angle - m_upperAngle; angularError = b2Max(0.0f, limitC); // Prevent large angular corrections and allow some slop. limitC = b2Clamp(limitC - b2_angularSlop, 0.0f, b2_maxAngularCorrection); limitImpulse = -m_motorMass * limitC; float32 oldLimitImpulse = m_limitPositionImpulse; m_limitPositionImpulse = b2Min(m_limitPositionImpulse + limitImpulse, 0.0f); limitImpulse = m_limitPositionImpulse - oldLimitImpulse; } b1->m_sweep.a -= b1->m_invI * limitImpulse; b2->m_sweep.a += b2->m_invI * limitImpulse; b1->SynchronizeTransform(); b2->SynchronizeTransform(); } return positionError <= b2_linearSlop && angularError <= b2_angularSlop; } b2Vec2 b2RevoluteJoint::GetAnchor1() const { return m_body1->GetWorldPoint(m_localAnchor1); } b2Vec2 b2RevoluteJoint::GetAnchor2() const { return m_body2->GetWorldPoint(m_localAnchor2); } b2Vec2 b2RevoluteJoint::GetReactionForce() const { return B2FORCE_SCALE(float32(1.0))*m_pivotForce; } float32 b2RevoluteJoint::GetReactionTorque() const { return m_limitForce; } float32 b2RevoluteJoint::GetJointAngle() const { b2Body* b1 = m_body1; b2Body* b2 = m_body2; return b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; } float32 b2RevoluteJoint::GetJointSpeed() const { b2Body* b1 = m_body1; b2Body* b2 = m_body2; return b2->m_angularVelocity - b1->m_angularVelocity; } bool b2RevoluteJoint::IsMotorEnabled() const { return m_enableMotor; } void b2RevoluteJoint::EnableMotor(bool flag) { m_enableMotor = flag; } float32 b2RevoluteJoint::GetMotorTorque() const { return m_motorForce; } void b2RevoluteJoint::SetMotorSpeed(float32 speed) { m_motorSpeed = speed; } void b2RevoluteJoint::SetMaxMotorTorque(float32 torque) { m_maxMotorTorque = torque; } bool b2RevoluteJoint::IsLimitEnabled() const { return m_enableLimit; } void b2RevoluteJoint::EnableLimit(bool flag) { m_enableLimit = flag; } float32 b2RevoluteJoint::GetLowerLimit() const { return m_lowerAngle; } float32 b2RevoluteJoint::GetUpperLimit() const { return m_upperAngle; } void b2RevoluteJoint::SetLimits(float32 lower, float32 upper) { b2Assert(lower <= upper); m_lowerAngle = lower; m_upperAngle = upper; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/Joints/b2RevoluteJoint.h000066400000000000000000000125301425065123200267560ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_REVOLUTE_JOINT_H #define B2_REVOLUTE_JOINT_H #include "b2Joint.h" /// Revolute joint definition. This requires defining an /// anchor point where the bodies are joined. The definition /// uses local anchor points so that the initial configuration /// can violate the constraint slightly. You also need to /// specify the initial relative angle for joint limits. This /// helps when saving and loading a game. /// The local anchor points are measured from the body's origin /// rather than the center of mass because: /// 1. you might not know where the center of mass will be. /// 2. if you add/remove shapes from a body and recompute the mass, /// the joints will be broken. struct b2RevoluteJointDef : public b2JointDef { b2RevoluteJointDef() { type = e_revoluteJoint; localAnchor1.Set(0.0f, 0.0f); localAnchor2.Set(0.0f, 0.0f); referenceAngle = 0.0f; lowerAngle = 0.0f; upperAngle = 0.0f; maxMotorTorque = 0.0f; motorSpeed = 0.0f; enableLimit = false; enableMotor = false; } /// Initialize the bodies, anchors, and reference angle using the world /// anchor. void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& anchor); /// The local anchor point relative to body1's origin. b2Vec2 localAnchor1; /// The local anchor point relative to body2's origin. b2Vec2 localAnchor2; /// The body2 angle minus body1 angle in the reference state (radians). float32 referenceAngle; /// A flag to enable joint limits. bool enableLimit; /// The lower angle for the joint limit (radians). float32 lowerAngle; /// The upper angle for the joint limit (radians). float32 upperAngle; /// A flag to enable the joint motor. bool enableMotor; /// The desired motor speed. Usually in radians per second. float32 motorSpeed; /// The maximum motor torque used to achieve the desired motor speed. /// Usually in N-m. float32 maxMotorTorque; }; /// A revolute joint constrains to bodies to share a common point while they /// are free to rotate about the point. The relative rotation about the shared /// point is the joint angle. You can limit the relative rotation with /// a joint limit that specifies a lower and upper angle. You can use a motor /// to drive the relative rotation about the shared point. A maximum motor torque /// is provided so that infinite forces are not generated. class b2RevoluteJoint : public b2Joint { public: b2Vec2 GetAnchor1() const; b2Vec2 GetAnchor2() const; b2Vec2 GetReactionForce() const; float32 GetReactionTorque() const; /// Get the current joint angle in radians. float32 GetJointAngle() const; /// Get the current joint angle speed in radians per second. float32 GetJointSpeed() const; /// Is the joint limit enabled? bool IsLimitEnabled() const; /// Enable/disable the joint limit. void EnableLimit(bool flag); /// Get the lower joint limit in radians. float32 GetLowerLimit() const; /// Get the upper joint limit in radians. float32 GetUpperLimit() const; /// Set the joint limits in radians. void SetLimits(float32 lower, float32 upper); /// Is the joint motor enabled? bool IsMotorEnabled() const; /// Enable/disable the joint motor. void EnableMotor(bool flag); /// Set the motor speed in radians per second. void SetMotorSpeed(float32 speed); /// Get the motor speed in radians per second. float32 GetMotorSpeed() const; /// Set the maximum motor torque, usually in N-m. void SetMaxMotorTorque(float32 torque); /// Get the current motor torque, usually in N-m. float32 GetMotorTorque() const; //--------------- Internals Below ------------------- b2RevoluteJoint(const b2RevoluteJointDef* def); void InitVelocityConstraints(const b2TimeStep& step); void SolveVelocityConstraints(const b2TimeStep& step); bool SolvePositionConstraints(); b2Vec2 m_localAnchor1; // relative b2Vec2 m_localAnchor2; b2Vec2 m_pivotForce; float32 m_motorForce; float32 m_limitForce; float32 m_limitPositionImpulse; b2Mat22 m_pivotMass; // effective mass for point-to-point constraint. float32 m_motorMass; // effective mass for motor/limit angular constraint. bool m_enableMotor; float32 m_maxMotorTorque; float32 m_motorSpeed; bool m_enableLimit; float32 m_referenceAngle; float32 m_lowerAngle; float32 m_upperAngle; b2LimitState m_limitState; }; inline float32 b2RevoluteJoint::GetMotorSpeed() const { return m_motorSpeed; } #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2Body.cpp000066400000000000000000000175341425065123200241400ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Body.h" #include "b2World.h" #include "Joints/b2Joint.h" #include "../Collision/Shapes/b2Shape.h" b2Body::b2Body(const b2BodyDef* bd, b2World* world) { b2Assert(world->m_lock == false); m_flags = 0; if (bd->isBullet) { m_flags |= e_bulletFlag; } if (bd->fixedRotation) { m_flags |= e_fixedRotationFlag; } if (bd->allowSleep) { m_flags |= e_allowSleepFlag; } if (bd->isSleeping) { m_flags |= e_sleepFlag; } m_world = world; m_xf.position = bd->position; m_xf.R.Set(bd->angle); m_sweep.localCenter = bd->massData.center; m_sweep.t0 = 1.0f; m_sweep.a0 = m_sweep.a = bd->angle; m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); m_jointList = NULL; m_contactList = NULL; m_prev = NULL; m_next = NULL; m_linearDamping = bd->linearDamping; m_angularDamping = bd->angularDamping; m_force.Set(0.0f, 0.0f); m_torque = 0.0f; m_linearVelocity.SetZero(); m_angularVelocity = 0.0f; m_sleepTime = 0.0f; m_invMass = 0.0f; m_I = 0.0f; m_invI = 0.0f; m_mass = bd->massData.mass; if (m_mass > 0.0f) { m_invMass = 1.0f / m_mass; } if ((m_flags & b2Body::e_fixedRotationFlag) == 0) { m_I = bd->massData.I; } if (m_I > 0.0f) { m_invI = 1.0f / m_I; } if (m_invMass == 0.0f && m_invI == 0.0f) { m_type = e_staticType; } else { m_type = e_dynamicType; } m_userData = bd->userData; m_shapeList = NULL; m_shapeCount = 0; } b2Body::~b2Body() { b2Assert(m_world->m_lock == false); // shapes and joints are destroyed in b2World::Destroy } b2Shape* b2Body::CreateShape(b2ShapeDef* def) { b2Assert(m_world->m_lock == false); if (m_world->m_lock == true) { return NULL; } b2Shape* s = b2Shape::Create(def, &m_world->m_blockAllocator); s->m_next = m_shapeList; m_shapeList = s; ++m_shapeCount; s->m_body = this; // Add the shape to the world's broad-phase. s->CreateProxy(m_world->m_broadPhase, m_xf); // Compute the sweep radius for CCD. s->UpdateSweepRadius(m_sweep.localCenter); return s; } void b2Body::DestroyShape(b2Shape* s) { b2Assert(m_world->m_lock == false); if (m_world->m_lock == true) { return; } b2Assert(s->GetBody() == this); s->DestroyProxy(m_world->m_broadPhase); b2Assert(m_shapeCount > 0); b2Shape** node = &m_shapeList; bool found = false; while (*node != NULL) { if (*node == s) { *node = s->m_next; found = true; break; } node = &(*node)->m_next; } // You tried to remove a shape that is not attached to this body. b2Assert(found); s->m_body = NULL; s->m_next = NULL; --m_shapeCount; b2Shape::Destroy(s, &m_world->m_blockAllocator); } // TODO_ERIN adjust linear velocity and torque to account for movement of center. void b2Body::SetMass(const b2MassData* massData) { b2Assert(m_world->m_lock == false); if (m_world->m_lock == true) { return; } m_invMass = 0.0f; m_I = 0.0f; m_invI = 0.0f; m_mass = massData->mass; if (m_mass > 0.0f) { m_invMass = 1.0f / m_mass; } if ((m_flags & b2Body::e_fixedRotationFlag) == 0) { m_I = massData->I; } if (m_I > 0.0f) { m_invI = 1.0f / m_I; } // Move center of mass. m_sweep.localCenter = massData->center; m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); // Update the sweep radii of all child shapes. for (b2Shape* s = m_shapeList; s; s = s->m_next) { s->UpdateSweepRadius(m_sweep.localCenter); } int16 oldType = m_type; if (m_invMass == 0.0f && m_invI == 0.0f) { m_type = e_staticType; } else { m_type = e_dynamicType; } // If the body type changed, we need to refilter the broad-phase proxies. if (oldType != m_type) { for (b2Shape* s = m_shapeList; s; s = s->m_next) { s->RefilterProxy(m_world->m_broadPhase, m_xf); } } } // TODO_ERIN adjust linear velocity and torque to account for movement of center. void b2Body::SetMassFromShapes() { b2Assert(m_world->m_lock == false); if (m_world->m_lock == true) { return; } // Compute mass data from shapes. Each shape has its own density. m_mass = 0.0f; m_invMass = 0.0f; m_I = 0.0f; m_invI = 0.0f; b2Vec2 center = b2Vec2_zero; for (b2Shape* s = m_shapeList; s; s = s->m_next) { b2MassData massData; s->ComputeMass(&massData); m_mass += massData.mass; center += massData.mass * massData.center; m_I += massData.I; } // Compute center of mass, and shift the origin to the COM. if (m_mass > 0.0f) { m_invMass = 1.0f / m_mass; center *= m_invMass; } if (m_I > 0.0f && (m_flags & e_fixedRotationFlag) == 0) { // Center the inertia about the center of mass. m_I -= m_mass * b2Dot(center, center); b2Assert(m_I > 0.0f); m_invI = 1.0f / m_I; } else { m_I = 0.0f; m_invI = 0.0f; } // Move center of mass. m_sweep.localCenter = center; m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); // Update the sweep radii of all child shapes. for (b2Shape* s = m_shapeList; s; s = s->m_next) { s->UpdateSweepRadius(m_sweep.localCenter); } int16 oldType = m_type; if (m_invMass == 0.0f && m_invI == 0.0f) { m_type = e_staticType; } else { m_type = e_dynamicType; } // If the body type changed, we need to refilter the broad-phase proxies. if (oldType != m_type) { for (b2Shape* s = m_shapeList; s; s = s->m_next) { s->RefilterProxy(m_world->m_broadPhase, m_xf); } } } bool b2Body::SetXForm(const b2Vec2& position, float32 angle) { b2Assert(m_world->m_lock == false); if (m_world->m_lock == true) { return true; } if (IsFrozen()) { return false; } m_xf.R.Set(angle); m_xf.position = position; m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); m_sweep.a0 = m_sweep.a = angle; bool freeze = false; for (b2Shape* s = m_shapeList; s; s = s->m_next) { bool inRange = s->Synchronize(m_world->m_broadPhase, m_xf, m_xf); if (inRange == false) { freeze = true; break; } } if (freeze == true) { m_flags |= e_frozenFlag; m_linearVelocity.SetZero(); m_angularVelocity = 0.0f; for (b2Shape* s = m_shapeList; s; s = s->m_next) { s->DestroyProxy(m_world->m_broadPhase); } // Failure return false; } // Success m_world->m_broadPhase->Commit(); return true; } bool b2Body::SynchronizeShapes() { b2XForm xf1; xf1.R.Set(m_sweep.a0); xf1.position = m_sweep.c0 - b2Mul(xf1.R, m_sweep.localCenter); bool inRange = true; for (b2Shape* s = m_shapeList; s; s = s->m_next) { inRange = s->Synchronize(m_world->m_broadPhase, xf1, m_xf); if (inRange == false) { break; } } if (inRange == false) { m_flags |= e_frozenFlag; m_linearVelocity.SetZero(); m_angularVelocity = 0.0f; for (b2Shape* s = m_shapeList; s; s = s->m_next) { s->DestroyProxy(m_world->m_broadPhase); } // Failure return false; } // Success return true; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2Body.h000066400000000000000000000367621425065123200236110ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_BODY_H #define B2_BODY_H #include "../Common/b2Math.h" #include "../Collision/Shapes/b2Shape.h" #include "Joints/b2Joint.h" #include class b2Joint; class b2Contact; class b2World; struct b2JointEdge; struct b2ContactEdge; /// A body definition holds all the data needed to construct a rigid body. /// You can safely re-use body definitions. struct b2BodyDef { /// This constructor sets the body definition default values. b2BodyDef() { massData.center.SetZero(); massData.mass = 0.0f; massData.I = 0.0f; userData = NULL; position.Set(0.0f, 0.0f); angle = 0.0f; linearDamping = 0.0f; angularDamping = 0.0f; allowSleep = true; isSleeping = false; fixedRotation = false; isBullet = false; } /// You can use this to initialized the mass properties of the body. /// If you prefer, you can set the mass properties after the shapes /// have been added using b2Body::SetMassFromShapes. b2MassData massData; /// Use this to store application specific body data. void* userData; /// The world position of the body. Avoid creating bodies at the origin /// since this can lead to many overlapping shapes. b2Vec2 position; /// The world angle of the body in radians. float32 angle; /// Linear damping is use to reduce the linear velocity. The damping parameter /// can be larger than 1.0f but the damping effect becomes sensitive to the /// time step when the damping parameter is large. float32 linearDamping; /// Angular damping is use to reduce the angular velocity. The damping parameter /// can be larger than 1.0f but the damping effect becomes sensitive to the /// time step when the damping parameter is large. float32 angularDamping; /// Set this flag to false if this body should never fall asleep. Note that /// this increases CPU usage. bool allowSleep; /// Is this body initially sleeping? bool isSleeping; /// Should this body be prevented from rotating? Useful for characters. bool fixedRotation; /// Is this a fast moving body that should be prevented from tunneling through /// other moving bodies? Note that all bodies are prevented from tunneling through /// static bodies. /// @warning You should use this flag sparingly since it increases processing time. bool isBullet; }; /// A rigid body. class b2Body { public: /// Creates a shape and attach it to this body. /// @param shapeDef the shape definition. /// @warning This function is locked during callbacks. b2Shape* CreateShape(b2ShapeDef* shapeDef); /// Destroy a shape. This removes the shape from the broad-phase and /// therefore destroys any contacts associated with this shape. All shapes /// attached to a body are implicitly destroyed when the body is destroyed. /// @param shape the shape to be removed. /// @warning This function is locked during callbacks. void DestroyShape(b2Shape* shape); /// Set the mass properties. Note that this changes the center of mass position. /// If you are not sure how to compute mass properties, use SetMassFromShapes. /// The inertia tensor is assumed to be relative to the center of mass. /// @param massData the mass properties. void SetMass(const b2MassData* massData); /// Compute the mass properties from the attached shapes. You typically call this /// after adding all the shapes. If you add or remove shapes later, you may want /// to call this again. Note that this changes the center of mass position. void SetMassFromShapes(); /// Set the position of the body's origin and rotation (radians). /// This breaks any contacts and wakes the other bodies. /// @param position the new world position of the body's origin (not necessarily /// the center of mass). /// @param angle the new world rotation angle of the body in radians. /// @return false if the movement put a shape outside the world. In this case the /// body is automatically frozen. bool SetXForm(const b2Vec2& position, float32 angle); /// Get the body transform for the body's origin. /// @return the world transform of the body's origin. const b2XForm& GetXForm() const; /// Get the world body origin position. /// @return the world position of the body's origin. const b2Vec2& GetPosition() const; /// Get the angle in radians. /// @return the current world rotation angle in radians. float32 GetAngle() const; /// Get the world position of the center of mass. const b2Vec2& GetWorldCenter() const; /// Get the local position of the center of mass. const b2Vec2& GetLocalCenter() const; /// Set the linear velocity of the center of mass. /// @param v the new linear velocity of the center of mass. void SetLinearVelocity(const b2Vec2& v); /// Get the linear velocity of the center of mass. /// @return the linear velocity of the center of mass. b2Vec2 GetLinearVelocity() const; /// Set the angular velocity. /// @param omega the new angular velocity in radians/second. void SetAngularVelocity(float32 omega); /// Get the angular velocity. /// @return the angular velocity in radians/second. float32 GetAngularVelocity() const; /// Apply a force at a world point. If the force is not /// applied at the center of mass, it will generate a torque and /// affect the angular velocity. This wakes up the body. /// @param force the world force vector, usually in Newtons (N). /// @param point the world position of the point of application. void ApplyForce(const b2Vec2& force, const b2Vec2& point); /// Apply a torque. This affects the angular velocity /// without affecting the linear velocity of the center of mass. /// This wakes up the body. /// @param torque about the z-axis (out of the screen), usually in N-m. void ApplyTorque(float32 torque); /// Apply an impulse at a point. This immediately modifies the velocity. /// It also modifies the angular velocity if the point of application /// is not at the center of mass. This wakes up the body. /// @param impulse the world impulse vector, usually in N-seconds or kg-m/s. /// @param point the world position of the point of application. void ApplyImpulse(const b2Vec2& impulse, const b2Vec2& point); /// Get the total mass of the body. /// @return the mass, usually in kilograms (kg). float32 GetMass() const; /// Get the central rotational inertia of the body. /// @return the rotational inertia, usually in kg-m^2. float32 GetInertia() const; /// Get the world coordinates of a point given the local coordinates. /// @param localPoint a point on the body measured relative the the body's origin. /// @return the same point expressed in world coordinates. b2Vec2 GetWorldPoint(const b2Vec2& localPoint) const; /// Get the world coordinates of a vector given the local coordinates. /// @param localVector a vector fixed in the body. /// @return the same vector expressed in world coordinates. b2Vec2 GetWorldVector(const b2Vec2& localVector) const; /// Gets a local point relative to the body's origin given a world point. /// @param a point in world coordinates. /// @return the corresponding local point relative to the body's origin. b2Vec2 GetLocalPoint(const b2Vec2& worldPoint) const; /// Gets a local vector given a world vector. /// @param a vector in world coordinates. /// @return the corresponding local vector. b2Vec2 GetLocalVector(const b2Vec2& worldVector) const; /// Get the world linear velocity of a world point attached to this body. /// @param a point in world coordinates. /// @return the world velocity of a point. b2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const; /// Get the world velocity of a local point. /// @param a point in local coordinates. /// @return the world velocity of a point. b2Vec2 GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const; /// Is this body treated like a bullet for continuous collision detection? bool IsBullet() const; /// Should this body be treated like a bullet for continuous collision detection? void SetBullet(bool flag); /// Is this body static (immovable)? bool IsStatic() const; /// Is this body dynamic (movable)? bool IsDynamic() const; /// Is this body frozen? bool IsFrozen() const; /// Is this body sleeping (not simulating). bool IsSleeping() const; /// You can disable sleeping on this body. void AllowSleeping(bool flag); /// Wake up this body so it will begin simulating. void WakeUp(); /// Put this body to sleep so it will stop simulating. /// This also sets the velocity to zero. void PutToSleep(); /// Get the list of all shapes attached to this body. b2Shape* GetShapeList(); /// Get the list of all joints attached to this body. b2JointEdge* GetJointList(); /// Get the next body in the world's body list. b2Body* GetNext(); /// Get the user data pointer that was provided in the body definition. void* GetUserData(); /// Set the user data. Use this to store your application specific data. void SetUserData(void* data); /// Get the parent world of this body. b2World* GetWorld(); private: friend class b2World; friend class b2Island; friend class b2ContactManager; friend class b2ContactSolver; friend class b2DistanceJoint; friend class b2GearJoint; friend class b2MouseJoint; friend class b2PrismaticJoint; friend class b2PulleyJoint; friend class b2RevoluteJoint; // m_flags enum { e_frozenFlag = 0x0002, e_islandFlag = 0x0004, e_sleepFlag = 0x0008, e_allowSleepFlag = 0x0010, e_bulletFlag = 0x0020, e_fixedRotationFlag = 0x0040, }; // m_type enum { e_staticType, e_dynamicType, e_maxTypes, }; b2Body(const b2BodyDef* bd, b2World* world); ~b2Body(); bool SynchronizeShapes(); void SynchronizeTransform(); // This is used to prevent connected bodies from colliding. // It may lie, depending on the collideConnected flag. bool IsConnected(const b2Body* other) const; void Advance(float32 t); uint16 m_flags; int16 m_type; b2XForm m_xf; // the body origin transform b2Sweep m_sweep; // the swept motion for CCD b2Vec2 m_linearVelocity; float32 m_angularVelocity; b2Vec2 m_force; float32 m_torque; b2World* m_world; b2Body* m_prev; b2Body* m_next; b2Shape* m_shapeList; int32 m_shapeCount; b2JointEdge* m_jointList; b2ContactEdge* m_contactList; float32 m_mass, m_invMass; float32 m_I, m_invI; float32 m_linearDamping; float32 m_angularDamping; float32 m_sleepTime; void* m_userData; }; inline const b2XForm& b2Body::GetXForm() const { return m_xf; } inline const b2Vec2& b2Body::GetPosition() const { return m_xf.position; } inline float32 b2Body::GetAngle() const { return m_sweep.a; } inline const b2Vec2& b2Body::GetWorldCenter() const { return m_sweep.c; } inline const b2Vec2& b2Body::GetLocalCenter() const { return m_sweep.localCenter; } inline void b2Body::SetLinearVelocity(const b2Vec2& v) { m_linearVelocity = v; } inline b2Vec2 b2Body::GetLinearVelocity() const { return m_linearVelocity; } inline void b2Body::SetAngularVelocity(float32 w) { m_angularVelocity = w; } inline float32 b2Body::GetAngularVelocity() const { return m_angularVelocity; } inline float32 b2Body::GetMass() const { return m_mass; } inline float32 b2Body::GetInertia() const { return m_I; } inline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const { return b2Mul(m_xf, localPoint); } inline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const { return b2Mul(m_xf.R, localVector); } inline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const { return b2MulT(m_xf, worldPoint); } inline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const { return b2MulT(m_xf.R, worldVector); } inline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const { return m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c); } inline b2Vec2 b2Body::GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const { return GetLinearVelocityFromWorldPoint(GetWorldPoint(localPoint)); } inline bool b2Body::IsBullet() const { return (m_flags & e_bulletFlag) == e_bulletFlag; } inline void b2Body::SetBullet(bool flag) { if (flag) { m_flags |= e_bulletFlag; } else { m_flags &= ~e_bulletFlag; } } inline bool b2Body::IsStatic() const { return m_type == e_staticType; } inline bool b2Body::IsDynamic() const { return m_type == e_dynamicType; } inline bool b2Body::IsFrozen() const { return (m_flags & e_frozenFlag) == e_frozenFlag; } inline bool b2Body::IsSleeping() const { return (m_flags & e_sleepFlag) == e_sleepFlag; } inline void b2Body::AllowSleeping(bool flag) { if (flag) { m_flags |= e_allowSleepFlag; } else { m_flags &= ~e_allowSleepFlag; WakeUp(); } } inline void b2Body::WakeUp() { m_flags &= ~e_sleepFlag; m_sleepTime = 0.0f; } inline void b2Body::PutToSleep() { m_flags |= e_sleepFlag; m_sleepTime = 0.0f; m_linearVelocity.SetZero(); m_angularVelocity = 0.0f; m_force.SetZero(); m_torque = 0.0f; } inline b2Shape* b2Body::GetShapeList() { return m_shapeList; } inline b2JointEdge* b2Body::GetJointList() { return m_jointList; } inline b2Body* b2Body::GetNext() { return m_next; } inline void* b2Body::GetUserData() { return m_userData; } inline void b2Body::SetUserData(void* data) { m_userData = data; } inline bool b2Body::IsConnected(const b2Body* other) const { for (b2JointEdge* jn = m_jointList; jn; jn = jn->next) { if (jn->other == other) return jn->joint->m_collideConnected == false; } return false; } inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point) { if (IsSleeping()) { WakeUp(); } m_force += force; m_torque += b2Cross(point - m_sweep.c, force); } inline void b2Body::ApplyTorque(float32 torque) { if (IsSleeping()) { WakeUp(); } m_torque += torque; } inline void b2Body::ApplyImpulse(const b2Vec2& impulse, const b2Vec2& point) { if (IsSleeping()) { WakeUp(); } m_linearVelocity += m_invMass * impulse; m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse); } inline void b2Body::SynchronizeTransform() { m_xf.R.Set(m_sweep.a); m_xf.position = m_sweep.c - b2Mul(m_xf.R, m_sweep.localCenter); } inline void b2Body::Advance(float32 t) { // Advance to the new safe time. m_sweep.Advance(t); m_sweep.c = m_sweep.c0; m_sweep.a = m_sweep.a0; SynchronizeTransform(); } inline b2World* b2Body::GetWorld() { return m_world; } #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2ContactManager.cpp000066400000000000000000000136631425065123200261300ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2ContactManager.h" #include "b2World.h" #include "b2Body.h" // This is a callback from the broadphase when two AABB proxies begin // to overlap. We create a b2Contact to manage the narrow phase. void* b2ContactManager::PairAdded(void* proxyUserData1, void* proxyUserData2) { b2Shape* shape1 = (b2Shape*)proxyUserData1; b2Shape* shape2 = (b2Shape*)proxyUserData2; b2Body* body1 = shape1->GetBody(); b2Body* body2 = shape2->GetBody(); if (body1->IsStatic() && body2->IsStatic()) { return &m_nullContact; } if (shape1->GetBody() == shape2->GetBody()) { return &m_nullContact; } if (body2->IsConnected(body1)) { return &m_nullContact; } if (m_world->m_contactFilter != NULL && m_world->m_contactFilter->ShouldCollide(shape1, shape2) == false) { return &m_nullContact; } // Call the factory. b2Contact* c = b2Contact::Create(shape1, shape2, &m_world->m_blockAllocator); if (c == NULL) { return &m_nullContact; } // Contact creation may swap shapes. shape1 = c->GetShape1(); shape2 = c->GetShape2(); body1 = shape1->GetBody(); body2 = shape2->GetBody(); // Insert into the world. c->m_prev = NULL; c->m_next = m_world->m_contactList; if (m_world->m_contactList != NULL) { m_world->m_contactList->m_prev = c; } m_world->m_contactList = c; // Connect to island graph. // Connect to body 1 c->m_node1.contact = c; c->m_node1.other = body2; c->m_node1.prev = NULL; c->m_node1.next = body1->m_contactList; if (body1->m_contactList != NULL) { body1->m_contactList->prev = &c->m_node1; } body1->m_contactList = &c->m_node1; // Connect to body 2 c->m_node2.contact = c; c->m_node2.other = body1; c->m_node2.prev = NULL; c->m_node2.next = body2->m_contactList; if (body2->m_contactList != NULL) { body2->m_contactList->prev = &c->m_node2; } body2->m_contactList = &c->m_node2; ++m_world->m_contactCount; return c; } // This is a callback from the broadphase when two AABB proxies cease // to overlap. We retire the b2Contact. void b2ContactManager::PairRemoved(void* proxyUserData1, void* proxyUserData2, void* pairUserData) { B2_NOT_USED(proxyUserData1); B2_NOT_USED(proxyUserData2); if (pairUserData == NULL) { return; } b2Contact* c = (b2Contact*)pairUserData; if (c == &m_nullContact) { return; } // An attached body is being destroyed, we must destroy this contact // immediately to avoid orphaned shape pointers. Destroy(c); } void b2ContactManager::Destroy(b2Contact* c) { b2Shape* shape1 = c->GetShape1(); b2Shape* shape2 = c->GetShape2(); // Inform the user that this contact is ending. int32 manifoldCount = c->GetManifoldCount(); if (manifoldCount > 0 && m_world->m_contactListener) { b2Body* b1 = shape1->GetBody(); b2Body* b2 = shape2->GetBody(); b2Manifold* manifolds = c->GetManifolds(); b2ContactPoint cp; cp.shape1 = c->GetShape1(); cp.shape2 = c->GetShape2(); cp.friction = c->m_friction; cp.restitution = c->m_restitution; for (int32 i = 0; i < manifoldCount; ++i) { b2Manifold* manifold = manifolds + i; cp.normal = manifold->normal; for (int32 j = 0; j < manifold->pointCount; ++j) { b2ManifoldPoint* mp = manifold->points + j; cp.position = b1->GetWorldPoint(mp->localPoint1); b2Vec2 v1 = b1->GetLinearVelocityFromLocalPoint(mp->localPoint1); b2Vec2 v2 = b2->GetLinearVelocityFromLocalPoint(mp->localPoint2); cp.velocity = v2 - v1; cp.separation = mp->separation; cp.id = mp->id; m_world->m_contactListener->Remove(&cp); } } } // Remove from the world. if (c->m_prev) { c->m_prev->m_next = c->m_next; } if (c->m_next) { c->m_next->m_prev = c->m_prev; } if (c == m_world->m_contactList) { m_world->m_contactList = c->m_next; } b2Body* body1 = shape1->GetBody(); b2Body* body2 = shape2->GetBody(); // Remove from body 1 if (c->m_node1.prev) { c->m_node1.prev->next = c->m_node1.next; } if (c->m_node1.next) { c->m_node1.next->prev = c->m_node1.prev; } if (&c->m_node1 == body1->m_contactList) { body1->m_contactList = c->m_node1.next; } // Remove from body 2 if (c->m_node2.prev) { c->m_node2.prev->next = c->m_node2.next; } if (c->m_node2.next) { c->m_node2.next->prev = c->m_node2.prev; } if (&c->m_node2 == body2->m_contactList) { body2->m_contactList = c->m_node2.next; } // Call the factory. b2Contact::Destroy(c, &m_world->m_blockAllocator); --m_world->m_contactCount; } // This is the top level collision call for the time step. Here // all the narrow phase collision is processed for the world // contact list. void b2ContactManager::Collide() { // Update awake contacts. for (b2Contact* c = m_world->m_contactList; c; c = c->GetNext()) { b2Body* body1 = c->GetShape1()->GetBody(); b2Body* body2 = c->GetShape2()->GetBody(); if (body1->IsSleeping() && body2->IsSleeping()) { continue; } c->Update(m_world->m_contactListener); } } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2ContactManager.h000066400000000000000000000033111425065123200255620ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_CONTACT_MANAGER_H #define B2_CONTACT_MANAGER_H #include "../Collision/b2BroadPhase.h" #include "../Dynamics/Contacts/b2NullContact.h" class b2World; class b2Contact; struct b2TimeStep; // Delegate of b2World. class b2ContactManager : public b2PairCallback { public: b2ContactManager() : m_world(NULL), m_destroyImmediate(false) {} // Implements PairCallback void* PairAdded(void* proxyUserData1, void* proxyUserData2); // Implements PairCallback void PairRemoved(void* proxyUserData1, void* proxyUserData2, void* pairUserData); void Destroy(b2Contact* c); void Collide(); b2World* m_world; // This lets us provide broadphase proxy pair user data for // contacts that shouldn't exist. b2NullContact m_nullContact; bool m_destroyImmediate; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2Island.cpp000066400000000000000000000326561425065123200244570ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2Island.h" #include "b2Body.h" #include "b2World.h" #include "Contacts/b2Contact.h" #include "Contacts/b2ContactSolver.h" #include "Joints/b2Joint.h" #include "../Common/b2StackAllocator.h" /* Position Correction Notes ========================= I tried the several algorithms for position correction of the 2D revolute joint. I looked at these systems: - simple pendulum (1m diameter sphere on massless 5m stick) with initial angular velocity of 100 rad/s. - suspension bridge with 30 1m long planks of length 1m. - multi-link chain with 30 1m long links. Here are the algorithms: Baumgarte - A fraction of the position error is added to the velocity error. There is no separate position solver. Pseudo Velocities - After the velocity solver and position integration, the position error, Jacobian, and effective mass are recomputed. Then the velocity constraints are solved with pseudo velocities and a fraction of the position error is added to the pseudo velocity error. The pseudo velocities are initialized to zero and there is no warm-starting. After the position solver, the pseudo velocities are added to the positions. This is also called the First Order World method or the Position LCP method. Modified Nonlinear Gauss-Seidel (NGS) - Like Pseudo Velocities except the position error is re-computed for each constraint and the positions are updated after the constraint is solved. The radius vectors (aka Jacobians) are re-computed too (otherwise the algorithm has horrible instability). The pseudo velocity states are not needed because they are effectively zero at the beginning of each iteration. Since we have the current position error, we allow the iterations to terminate early if the error becomes smaller than b2_linearSlop. Full NGS or just NGS - Like Modified NGS except the effective mass are re-computed each time a constraint is solved. Here are the results: Baumgarte - this is the cheapest algorithm but it has some stability problems, especially with the bridge. The chain links separate easily close to the root and they jitter as they struggle to pull together. This is one of the most common methods in the field. The big drawback is that the position correction artificially affects the momentum, thus leading to instabilities and false bounce. I used a bias factor of 0.2. A larger bias factor makes the bridge less stable, a smaller factor makes joints and contacts more spongy. Pseudo Velocities - the is more stable than the Baumgarte method. The bridge is stable. However, joints still separate with large angular velocities. Drag the simple pendulum in a circle quickly and the joint will separate. The chain separates easily and does not recover. I used a bias factor of 0.2. A larger value lead to the bridge collapsing when a heavy cube drops on it. Modified NGS - this algorithm is better in some ways than Baumgarte and Pseudo Velocities, but in other ways it is worse. The bridge and chain are much more stable, but the simple pendulum goes unstable at high angular velocities. Full NGS - stable in all tests. The joints display good stiffness. The bridge still sags, but this is better than infinite forces. Recommendations Pseudo Velocities are not really worthwhile because the bridge and chain cannot recover from joint separation. In other cases the benefit over Baumgarte is small. Modified NGS is not a robust method for the revolute joint due to the violent instability seen in the simple pendulum. Perhaps it is viable with other constraint types, especially scalar constraints where the effective mass is a scalar. This leaves Baumgarte and Full NGS. Baumgarte has small, but manageable instabilities and is very fast. I don't think we can escape Baumgarte, especially in highly demanding cases where high constraint fidelity is not needed. Full NGS is robust and easy on the eyes. I recommend this as an option for higher fidelity simulation and certainly for suspension bridges and long chains. Full NGS might be a good choice for ragdolls, especially motorized ragdolls where joint separation can be problematic. The number of NGS iterations can be reduced for better performance without harming robustness much. Each joint in a can be handled differently in the position solver. So I recommend a system where the user can select the algorithm on a per joint basis. I would probably default to the slower Full NGS and let the user select the faster Baumgarte method in performance critical scenarios. */ b2Island::b2Island( int32 bodyCapacity, int32 contactCapacity, int32 jointCapacity, b2StackAllocator* allocator, b2ContactListener* listener) { m_bodyCapacity = bodyCapacity; m_contactCapacity = contactCapacity; m_jointCapacity = jointCapacity; m_bodyCount = 0; m_contactCount = 0; m_jointCount = 0; m_allocator = allocator; m_listener = listener; m_bodies = (b2Body**)m_allocator->Allocate(bodyCapacity * sizeof(b2Body*)); m_contacts = (b2Contact**)m_allocator->Allocate(contactCapacity * sizeof(b2Contact*)); m_joints = (b2Joint**)m_allocator->Allocate(jointCapacity * sizeof(b2Joint*)); m_positionIterationCount = 0; } b2Island::~b2Island() { // Warning: the order should reverse the constructor order. m_allocator->Free(m_joints); m_allocator->Free(m_contacts); m_allocator->Free(m_bodies); } void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool correctPositions, bool allowSleep) { // Integrate velocities and apply damping. for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; if (b->IsStatic()) continue; // Integrate velocities. b->m_linearVelocity += step.dt * (gravity + b->m_invMass * b->m_force); b->m_angularVelocity += step.dt * b->m_invI * b->m_torque; // Reset forces. b->m_force.Set(0.0f, 0.0f); b->m_torque = 0.0f; // Apply damping. // ODE: dv/dt + c * v = 0 // Solution: v(t) = v0 * exp(-c * t) // Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt) // v2 = exp(-c * dt) * v1 // Taylor expansion: // v2 = (1.0f - c * dt) * v1 b->m_linearVelocity *= b2Clamp(1.0f - step.dt * b->m_linearDamping, 0.0f, 1.0f); b->m_angularVelocity *= b2Clamp(1.0f - step.dt * b->m_angularDamping, 0.0f, 1.0f); // Check for large velocities. #ifdef TARGET_FLOAT32_IS_FIXED // Fixed point code written this way to prevent // overflows, float code is optimized for speed float32 vMagnitude = b->m_linearVelocity.Length(); if(vMagnitude > b2_maxLinearVelocity) { b->m_linearVelocity *= b2_maxLinearVelocity/vMagnitude; } b->m_angularVelocity = b2Clamp(b->m_angularVelocity, -b2_maxAngularVelocity, b2_maxAngularVelocity); #else if (b2Dot(b->m_linearVelocity, b->m_linearVelocity) > b2_maxLinearVelocitySquared) { b->m_linearVelocity.Normalize(); b->m_linearVelocity *= b2_maxLinearVelocity; } if (b->m_angularVelocity * b->m_angularVelocity > b2_maxAngularVelocitySquared) { if (b->m_angularVelocity < 0.0f) { b->m_angularVelocity = -b2_maxAngularVelocity; } else { b->m_angularVelocity = b2_maxAngularVelocity; } } #endif } b2ContactSolver contactSolver(step, m_contacts, m_contactCount, m_allocator); // Initialize velocity constraints. contactSolver.InitVelocityConstraints(step); for (int32 i = 0; i < m_jointCount; ++i) { m_joints[i]->InitVelocityConstraints(step); } // Solve velocity constraints. for (int32 i = 0; i < step.maxIterations; ++i) { contactSolver.SolveVelocityConstraints(); for (int32 j = 0; j < m_jointCount; ++j) { m_joints[j]->SolveVelocityConstraints(step); } } // Post-solve (store impulses for warm starting). contactSolver.FinalizeVelocityConstraints(); // Integrate positions. for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; if (b->IsStatic()) continue; // Store positions for continuous collision. b->m_sweep.c0 = b->m_sweep.c; b->m_sweep.a0 = b->m_sweep.a; // Integrate b->m_sweep.c += step.dt * b->m_linearVelocity; b->m_sweep.a += step.dt * b->m_angularVelocity; // Compute new transform b->SynchronizeTransform(); // Note: shapes are synchronized later. } if (correctPositions) { // Initialize position constraints. // Contacts don't need initialization. for (int32 i = 0; i < m_jointCount; ++i) { m_joints[i]->InitPositionConstraints(); } // Iterate over constraints. for (m_positionIterationCount = 0; m_positionIterationCount < step.maxIterations; ++m_positionIterationCount) { bool contactsOkay = contactSolver.SolvePositionConstraints(b2_contactBaumgarte); bool jointsOkay = true; for (int i = 0; i < m_jointCount; ++i) { bool jointOkay = m_joints[i]->SolvePositionConstraints(); jointsOkay = jointsOkay && jointOkay; } if (contactsOkay && jointsOkay) { break; } } } Report(contactSolver.m_constraints); if (allowSleep) { float32 minSleepTime = B2_FLT_MAX; #ifndef TARGET_FLOAT32_IS_FIXED const float32 linTolSqr = b2_linearSleepTolerance * b2_linearSleepTolerance; const float32 angTolSqr = b2_angularSleepTolerance * b2_angularSleepTolerance; #endif for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; if (b->m_invMass == 0.0f) { continue; } if ((b->m_flags & b2Body::e_allowSleepFlag) == 0) { b->m_sleepTime = 0.0f; minSleepTime = 0.0f; } if ((b->m_flags & b2Body::e_allowSleepFlag) == 0 || #ifdef TARGET_FLOAT32_IS_FIXED b2Abs(b->m_angularVelocity) > b2_angularSleepTolerance || b2Abs(b->m_linearVelocity.x) > b2_linearSleepTolerance || b2Abs(b->m_linearVelocity.y) > b2_linearSleepTolerance) #else b->m_angularVelocity * b->m_angularVelocity > angTolSqr || b2Dot(b->m_linearVelocity, b->m_linearVelocity) > linTolSqr) #endif { b->m_sleepTime = 0.0f; minSleepTime = 0.0f; } else { b->m_sleepTime += step.dt; minSleepTime = b2Min(minSleepTime, b->m_sleepTime); } } if (minSleepTime >= b2_timeToSleep) { for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; b->m_flags |= b2Body::e_sleepFlag; b->m_linearVelocity = b2Vec2_zero; b->m_angularVelocity = 0.0f; } } } } void b2Island::SolveTOI(const b2TimeStep& subStep) { b2ContactSolver contactSolver(subStep, m_contacts, m_contactCount, m_allocator); // No warm starting needed for TOI events. // Solve velocity constraints. for (int32 i = 0; i < subStep.maxIterations; ++i) { contactSolver.SolveVelocityConstraints(); } // Don't store the TOI contact forces for warm starting // because they can be quite large. // Integrate positions. for (int32 i = 0; i < m_bodyCount; ++i) { b2Body* b = m_bodies[i]; if (b->IsStatic()) continue; // Store positions for continuous collision. b->m_sweep.c0 = b->m_sweep.c; b->m_sweep.a0 = b->m_sweep.a; // Integrate b->m_sweep.c += subStep.dt * b->m_linearVelocity; b->m_sweep.a += subStep.dt * b->m_angularVelocity; // Compute new transform b->SynchronizeTransform(); // Note: shapes are synchronized later. } // Solve position constraints. const float32 k_toiBaumgarte = 0.75f; for (int32 i = 0; i < subStep.maxIterations; ++i) { bool contactsOkay = contactSolver.SolvePositionConstraints(k_toiBaumgarte); if (contactsOkay) { break; } } Report(contactSolver.m_constraints); } void b2Island::Report(b2ContactConstraint* constraints) { if (m_listener == NULL) { return; } for (int32 i = 0; i < m_contactCount; ++i) { b2Contact* c = m_contacts[i]; b2ContactConstraint* cc = constraints + i; b2ContactResult cr; cr.shape1 = c->GetShape1(); cr.shape2 = c->GetShape2(); b2Body* b1 = cr.shape1->GetBody(); int32 manifoldCount = c->GetManifoldCount(); b2Manifold* manifolds = c->GetManifolds(); for (int32 j = 0; j < manifoldCount; ++j) { b2Manifold* manifold = manifolds + j; cr.normal = manifold->normal; for (int32 k = 0; k < manifold->pointCount; ++k) { b2ManifoldPoint* point = manifold->points + k; b2ContactConstraintPoint* ccp = cc->points + k; cr.position = b1->GetWorldPoint(point->localPoint1); // TOI constraint results are not stored, so get // the result from the constraint. cr.normalImpulse = ccp->normalImpulse; cr.tangentImpulse = ccp->tangentImpulse; cr.id = point->id; m_listener->Result(&cr); } } } } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2Island.h000066400000000000000000000044161425065123200241150ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_ISLAND_H #define B2_ISLAND_H #include "../Common/b2Math.h" class b2Contact; class b2Body; class b2Joint; class b2StackAllocator; class b2ContactListener; struct b2ContactConstraint; struct b2TimeStep; class b2Island { public: b2Island(int32 bodyCapacity, int32 contactCapacity, int32 jointCapacity, b2StackAllocator* allocator, b2ContactListener* listener); ~b2Island(); void Clear() { m_bodyCount = 0; m_contactCount = 0; m_jointCount = 0; } void Solve(const b2TimeStep& step, const b2Vec2& gravity, bool correctPositions, bool allowSleep); void SolveTOI(const b2TimeStep& subStep); void Add(b2Body* body) { b2Assert(m_bodyCount < m_bodyCapacity); m_bodies[m_bodyCount++] = body; } void Add(b2Contact* contact) { b2Assert(m_contactCount < m_contactCapacity); m_contacts[m_contactCount++] = contact; } void Add(b2Joint* joint) { b2Assert(m_jointCount < m_jointCapacity); m_joints[m_jointCount++] = joint; } void Report(b2ContactConstraint* constraints); b2StackAllocator* m_allocator; b2ContactListener* m_listener; b2Body** m_bodies; b2Contact** m_contacts; b2Joint** m_joints; int32 m_bodyCount; int32 m_jointCount; int32 m_contactCount; int32 m_bodyCapacity; int32 m_contactCapacity; int32 m_jointCapacity; int32 m_positionIterationCount; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2World.cpp000066400000000000000000000634661425065123200243370ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2World.h" #include "b2Body.h" #include "b2Island.h" #include "Joints/b2PulleyJoint.h" #include "Contacts/b2Contact.h" #include "Contacts/b2ContactSolver.h" #include "../Collision/b2Collision.h" #include "../Collision/Shapes/b2CircleShape.h" #include "../Collision/Shapes/b2PolygonShape.h" #include b2World::b2World(const b2AABB& worldAABB, const b2Vec2& gravity, bool doSleep) { m_destructionListener = NULL; m_boundaryListener = NULL; m_contactFilter = &b2_defaultFilter; m_contactListener = NULL; m_debugDraw = NULL; m_bodyList = NULL; m_contactList = NULL; m_jointList = NULL; m_bodyCount = 0; m_contactCount = 0; m_jointCount = 0; m_positionCorrection = true; m_warmStarting = true; m_continuousPhysics = true; m_allowSleep = doSleep; m_gravity = gravity; m_lock = false; m_inv_dt0 = 0.0f; m_contactManager.m_world = this; void* mem = b2Alloc(sizeof(b2BroadPhase)); m_broadPhase = new (mem) b2BroadPhase(worldAABB, &m_contactManager); b2BodyDef bd; m_groundBody = CreateBody(&bd); } b2World::~b2World() { DestroyBody(m_groundBody); m_broadPhase->~b2BroadPhase(); b2Free(m_broadPhase); } void b2World::SetDestructionListener(b2DestructionListener* listener) { m_destructionListener = listener; } void b2World::SetBoundaryListener(b2BoundaryListener* listener) { m_boundaryListener = listener; } void b2World::SetContactFilter(b2ContactFilter* filter) { m_contactFilter = filter; } void b2World::SetContactListener(b2ContactListener* listener) { m_contactListener = listener; } void b2World::SetDebugDraw(b2DebugDraw* debugDraw) { m_debugDraw = debugDraw; } b2Body* b2World::CreateBody(const b2BodyDef* def) { b2Assert(m_lock == false); if (m_lock == true) { return NULL; } void* mem = m_blockAllocator.Allocate(sizeof(b2Body)); b2Body* b = new (mem) b2Body(def, this); // Add to world doubly linked list. b->m_prev = NULL; b->m_next = m_bodyList; if (m_bodyList) { m_bodyList->m_prev = b; } m_bodyList = b; ++m_bodyCount; return b; } void b2World::DestroyBody(b2Body* b) { b2Assert(m_bodyCount > 0); b2Assert(m_lock == false); if (m_lock == true) { return; } // Delete the attached joints. b2JointEdge* jn = b->m_jointList; while (jn) { b2JointEdge* jn0 = jn; jn = jn->next; if (m_destructionListener) { m_destructionListener->SayGoodbye(jn0->joint); } DestroyJoint(jn0->joint); } // Delete the attached shapes. This destroys broad-phase // proxies and pairs, leading to the destruction of contacts. b2Shape* s = b->m_shapeList; while (s) { b2Shape* s0 = s; s = s->m_next; if (m_destructionListener) { m_destructionListener->SayGoodbye(s0); } s0->DestroyProxy(m_broadPhase); b2Shape::Destroy(s0, &m_blockAllocator); } // Remove world body list. if (b->m_prev) { b->m_prev->m_next = b->m_next; } if (b->m_next) { b->m_next->m_prev = b->m_prev; } if (b == m_bodyList) { m_bodyList = b->m_next; } --m_bodyCount; b->~b2Body(); m_blockAllocator.Free(b, sizeof(b2Body)); } b2Joint* b2World::CreateJoint(const b2JointDef* def) { b2Assert(m_lock == false); b2Joint* j = b2Joint::Create(def, &m_blockAllocator); // Connect to the world list. j->m_prev = NULL; j->m_next = m_jointList; if (m_jointList) { m_jointList->m_prev = j; } m_jointList = j; ++m_jointCount; // Connect to the bodies' doubly linked lists. j->m_node1.joint = j; j->m_node1.other = j->m_body2; j->m_node1.prev = NULL; j->m_node1.next = j->m_body1->m_jointList; if (j->m_body1->m_jointList) j->m_body1->m_jointList->prev = &j->m_node1; j->m_body1->m_jointList = &j->m_node1; j->m_node2.joint = j; j->m_node2.other = j->m_body1; j->m_node2.prev = NULL; j->m_node2.next = j->m_body2->m_jointList; if (j->m_body2->m_jointList) j->m_body2->m_jointList->prev = &j->m_node2; j->m_body2->m_jointList = &j->m_node2; // If the joint prevents collisions, then reset collision filtering. if (def->collideConnected == false) { // Reset the proxies on the body with the minimum number of shapes. b2Body* b = def->body1->m_shapeCount < def->body2->m_shapeCount ? def->body1 : def->body2; for (b2Shape* s = b->m_shapeList; s; s = s->m_next) { s->RefilterProxy(m_broadPhase, b->GetXForm()); } } return j; } void b2World::DestroyJoint(b2Joint* j) { b2Assert(m_lock == false); bool collideConnected = j->m_collideConnected; // Remove from the doubly linked list. if (j->m_prev) { j->m_prev->m_next = j->m_next; } if (j->m_next) { j->m_next->m_prev = j->m_prev; } if (j == m_jointList) { m_jointList = j->m_next; } // Disconnect from island graph. b2Body* body1 = j->m_body1; b2Body* body2 = j->m_body2; // Wake up connected bodies. body1->WakeUp(); body2->WakeUp(); // Remove from body 1. if (j->m_node1.prev) { j->m_node1.prev->next = j->m_node1.next; } if (j->m_node1.next) { j->m_node1.next->prev = j->m_node1.prev; } if (&j->m_node1 == body1->m_jointList) { body1->m_jointList = j->m_node1.next; } j->m_node1.prev = NULL; j->m_node1.next = NULL; // Remove from body 2 if (j->m_node2.prev) { j->m_node2.prev->next = j->m_node2.next; } if (j->m_node2.next) { j->m_node2.next->prev = j->m_node2.prev; } if (&j->m_node2 == body2->m_jointList) { body2->m_jointList = j->m_node2.next; } j->m_node2.prev = NULL; j->m_node2.next = NULL; b2Joint::Destroy(j, &m_blockAllocator); b2Assert(m_jointCount > 0); --m_jointCount; // If the joint prevents collisions, then reset collision filtering. if (collideConnected == false) { // Reset the proxies on the body with the minimum number of shapes. b2Body* b = body1->m_shapeCount < body2->m_shapeCount ? body1 : body2; for (b2Shape* s = b->m_shapeList; s; s = s->m_next) { s->RefilterProxy(m_broadPhase, b->GetXForm()); } } } void b2World::Refilter(b2Shape* shape) { shape->RefilterProxy(m_broadPhase, shape->GetBody()->GetXForm()); } // Find islands, integrate and solve constraints, solve position constraints void b2World::Solve(const b2TimeStep& step) { m_positionIterationCount = 0; // Size the island for the worst case. b2Island island(m_bodyCount, m_contactCount, m_jointCount, &m_stackAllocator, m_contactListener); // Clear all the island flags. for (b2Body* b = m_bodyList; b; b = b->m_next) { b->m_flags &= ~b2Body::e_islandFlag; } for (b2Contact* c = m_contactList; c; c = c->m_next) { c->m_flags &= ~b2Contact::e_islandFlag; } for (b2Joint* j = m_jointList; j; j = j->m_next) { j->m_islandFlag = false; } // Build and simulate all awake islands. int32 stackSize = m_bodyCount; b2Body** stack = (b2Body**)m_stackAllocator.Allocate(stackSize * sizeof(b2Body*)); for (b2Body* seed = m_bodyList; seed; seed = seed->m_next) { if (seed->m_flags & (b2Body::e_islandFlag | b2Body::e_sleepFlag | b2Body::e_frozenFlag)) { continue; } if (seed->IsStatic()) { continue; } // Reset island and stack. island.Clear(); int32 stackCount = 0; stack[stackCount++] = seed; seed->m_flags |= b2Body::e_islandFlag; // Perform a depth first search (DFS) on the constraint graph. while (stackCount > 0) { // Grab the next body off the stack and add it to the island. b2Body* b = stack[--stackCount]; island.Add(b); // Make sure the body is awake. b->m_flags &= ~b2Body::e_sleepFlag; // To keep islands as small as possible, we don't // propagate islands across static bodies. if (b->IsStatic()) { continue; } // Search all contacts connected to this body. for (b2ContactEdge* cn = b->m_contactList; cn; cn = cn->next) { // Has this contact already been added to an island? if (cn->contact->m_flags & (b2Contact::e_islandFlag | b2Contact::e_nonSolidFlag)) { continue; } // Is this contact touching? if (cn->contact->GetManifoldCount() == 0) { continue; } island.Add(cn->contact); cn->contact->m_flags |= b2Contact::e_islandFlag; b2Body* other = cn->other; // Was the other body already added to this island? if (other->m_flags & b2Body::e_islandFlag) { continue; } b2Assert(stackCount < stackSize); stack[stackCount++] = other; other->m_flags |= b2Body::e_islandFlag; } // Search all joints connect to this body. for (b2JointEdge* jn = b->m_jointList; jn; jn = jn->next) { if (jn->joint->m_islandFlag == true) { continue; } island.Add(jn->joint); jn->joint->m_islandFlag = true; b2Body* other = jn->other; if (other->m_flags & b2Body::e_islandFlag) { continue; } b2Assert(stackCount < stackSize); stack[stackCount++] = other; other->m_flags |= b2Body::e_islandFlag; } } island.Solve(step, m_gravity, m_positionCorrection, m_allowSleep); m_positionIterationCount = b2Max(m_positionIterationCount, island.m_positionIterationCount); // Post solve cleanup. for (int32 i = 0; i < island.m_bodyCount; ++i) { // Allow static bodies to participate in other islands. b2Body* b = island.m_bodies[i]; if (b->IsStatic()) { b->m_flags &= ~b2Body::e_islandFlag; } } } m_stackAllocator.Free(stack); // Synchronize shapes, check for out of range bodies. for (b2Body* b = m_bodyList; b; b = b->GetNext()) { if (b->m_flags & (b2Body::e_sleepFlag | b2Body::e_frozenFlag)) { continue; } if (b->IsStatic()) { continue; } // Update shapes (for broad-phase). If the shapes go out of // the world AABB then shapes and contacts may be destroyed, // including contacts that are bool inRange = b->SynchronizeShapes(); // Did the body's shapes leave the world? if (inRange == false && m_boundaryListener != NULL) { m_boundaryListener->Violation(b); } } // Commit shape proxy movements to the broad-phase so that new contacts are created. // Also, some contacts can be destroyed. m_broadPhase->Commit(); } // Find TOI contacts and solve them. void b2World::SolveTOI(const b2TimeStep& step) { // Reserve an island and a stack for TOI island solution. b2Island island(m_bodyCount, b2_maxTOIContactsPerIsland, 0, &m_stackAllocator, m_contactListener); int32 stackSize = m_bodyCount; b2Body** stack = (b2Body**)m_stackAllocator.Allocate(stackSize * sizeof(b2Body*)); for (b2Body* b = m_bodyList; b; b = b->m_next) { b->m_flags &= ~b2Body::e_islandFlag; b->m_sweep.t0 = 0.0f; } for (b2Contact* c = m_contactList; c; c = c->m_next) { // Invalidate TOI c->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag); } // Find TOI events and solve them. for (;;) { // Find the first TOI. b2Contact* minContact = NULL; float32 minTOI = 1.0f; for (b2Contact* c = m_contactList; c; c = c->m_next) { if (c->m_flags & (b2Contact::e_slowFlag | b2Contact::e_nonSolidFlag)) { continue; } // TODO_ERIN keep a counter on the contact, only respond to M TOIs per contact. float32 toi = 1.0f; if (c->m_flags & b2Contact::e_toiFlag) { // This contact has a valid cached TOI. toi = c->m_toi; } else { // Compute the TOI for this contact. b2Shape* s1 = c->GetShape1(); b2Shape* s2 = c->GetShape2(); b2Body* b1 = s1->GetBody(); b2Body* b2 = s2->GetBody(); if ((b1->IsStatic() || b1->IsSleeping()) && (b2->IsStatic() || b2->IsSleeping())) { continue; } // Put the sweeps onto the same time interval. float32 t0 = b1->m_sweep.t0; if (b1->m_sweep.t0 < b2->m_sweep.t0) { t0 = b2->m_sweep.t0; b1->m_sweep.Advance(t0); } else if (b2->m_sweep.t0 < b1->m_sweep.t0) { t0 = b1->m_sweep.t0; b2->m_sweep.Advance(t0); } b2Assert(t0 < 1.0f); // Compute the time of impact. toi = b2TimeOfImpact(c->m_shape1, b1->m_sweep, c->m_shape2, b2->m_sweep); b2Assert(0.0f <= toi && toi <= 1.0f); if (toi > 0.0f && toi < 1.0f) { toi = b2Min((1.0f - toi) * t0 + toi, 1.0f); } c->m_toi = toi; c->m_flags |= b2Contact::e_toiFlag; } if (B2_FLT_EPSILON < toi && toi < minTOI) { // This is the minimum TOI found so far. minContact = c; minTOI = toi; } } if (minContact == NULL || 1.0f - 100.0f * B2_FLT_EPSILON < minTOI) { // No more TOI events. Done! break; } // Advance the bodies to the TOI. b2Shape* s1 = minContact->GetShape1(); b2Shape* s2 = minContact->GetShape2(); b2Body* b1 = s1->GetBody(); b2Body* b2 = s2->GetBody(); b1->Advance(minTOI); b2->Advance(minTOI); // The TOI contact likely has some new contact points. minContact->Update(m_contactListener); minContact->m_flags &= ~b2Contact::e_toiFlag; if (minContact->GetManifoldCount() == 0) { // This shouldn't happen. Numerical error? //b2Assert(false); continue; } // Build the TOI island. We need a dynamic seed. b2Body* seed = b1; if (seed->IsStatic()) { seed = b2; } // Reset island and stack. island.Clear(); int32 stackCount = 0; stack[stackCount++] = seed; seed->m_flags |= b2Body::e_islandFlag; // Perform a depth first search (DFS) on the contact graph. while (stackCount > 0) { // Grab the next body off the stack and add it to the island. b2Body* b = stack[--stackCount]; island.Add(b); // Make sure the body is awake. b->m_flags &= ~b2Body::e_sleepFlag; // To keep islands as small as possible, we don't // propagate islands across static bodies. if (b->IsStatic()) { continue; } // Search all contacts connected to this body. for (b2ContactEdge* cn = b->m_contactList; cn; cn = cn->next) { // Does the TOI island still have space for contacts? if (island.m_contactCount == island.m_contactCapacity) { continue; } // Has this contact already been added to an island? Skip slow or non-solid contacts. if (cn->contact->m_flags & (b2Contact::e_islandFlag | b2Contact::e_slowFlag | b2Contact::e_nonSolidFlag)) { continue; } // Is this contact touching? For performance we are not updating this contact. if (cn->contact->GetManifoldCount() == 0) { continue; } island.Add(cn->contact); cn->contact->m_flags |= b2Contact::e_islandFlag; // Update other body. b2Body* other = cn->other; // Was the other body already added to this island? if (other->m_flags & b2Body::e_islandFlag) { continue; } // March forward, this can do no harm since this is the min TOI. if (other->IsStatic() == false) { other->Advance(minTOI); other->WakeUp(); } b2Assert(stackCount < stackSize); stack[stackCount++] = other; other->m_flags |= b2Body::e_islandFlag; } } b2TimeStep subStep; subStep.dt = (1.0f - minTOI) * step.dt; b2Assert(subStep.dt > B2_FLT_EPSILON); subStep.inv_dt = 1.0f / subStep.dt; subStep.maxIterations = step.maxIterations; island.SolveTOI(subStep); // Post solve cleanup. for (int32 i = 0; i < island.m_bodyCount; ++i) { // Allow bodies to participate in future TOI islands. b2Body* b = island.m_bodies[i]; b->m_flags &= ~b2Body::e_islandFlag; if (b->m_flags & (b2Body::e_sleepFlag | b2Body::e_frozenFlag)) { continue; } if (b->IsStatic()) { continue; } // Update shapes (for broad-phase). If the shapes go out of // the world AABB then shapes and contacts may be destroyed, // including contacts that are bool inRange = b->SynchronizeShapes(); // Did the body's shapes leave the world? if (inRange == false && m_boundaryListener != NULL) { m_boundaryListener->Violation(b); } // Invalidate all contact TOIs associated with this body. Some of these // may not be in the island because they were not touching. for (b2ContactEdge* cn = b->m_contactList; cn; cn = cn->next) { cn->contact->m_flags &= ~b2Contact::e_toiFlag; } } for (int32 i = 0; i < island.m_contactCount; ++i) { // Allow contacts to participate in future TOI islands. b2Contact* c = island.m_contacts[i]; c->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag); } // Commit shape proxy movements to the broad-phase so that new contacts are created. // Also, some contacts can be destroyed. m_broadPhase->Commit(); } m_stackAllocator.Free(stack); } void b2World::Step(float32 dt, int32 iterations) { m_lock = true; b2TimeStep step; step.dt = dt; step.maxIterations = iterations; if (dt > 0.0f) { step.inv_dt = 1.0f / dt; } else { step.inv_dt = 0.0f; } step.dtRatio = m_inv_dt0 * dt; step.positionCorrection = m_positionCorrection; step.warmStarting = m_warmStarting; // Update contacts. m_contactManager.Collide(); // Integrate velocities, solve velocity constraints, and integrate positions. if (step.dt > 0.0f) { Solve(step); } // Handle TOI events. if (m_continuousPhysics && step.dt > 0.0f) { SolveTOI(step); } // Draw debug information. DrawDebugData(); m_inv_dt0 = step.inv_dt; m_lock = false; } int32 b2World::Query(const b2AABB& aabb, b2Shape** shapes, int32 maxCount) { void** results = (void**)m_stackAllocator.Allocate(maxCount * sizeof(void*)); int32 count = m_broadPhase->Query(aabb, results, maxCount); for (int32 i = 0; i < count; ++i) { shapes[i] = (b2Shape*)results[i]; } m_stackAllocator.Free(results); return count; } void b2World::DrawShape(b2Shape* shape, const b2XForm& xf, const b2Color& color, bool core) { b2Color coreColor(0.9f, 0.6f, 0.6f); switch (shape->GetType()) { case e_circleShape: { b2CircleShape* circle = (b2CircleShape*)shape; b2Vec2 center = b2Mul(xf, circle->GetLocalPosition()); float32 radius = circle->GetRadius(); b2Vec2 axis = xf.R.col1; m_debugDraw->DrawSolidCircle(center, radius, axis, color); if (core) { m_debugDraw->DrawCircle(center, radius - b2_toiSlop, coreColor); } } break; case e_polygonShape: { b2PolygonShape* poly = (b2PolygonShape*)shape; int32 vertexCount = poly->GetVertexCount(); const b2Vec2* localVertices = poly->GetVertices(); b2Assert(vertexCount <= b2_maxPolygonVertices); b2Vec2 vertices[b2_maxPolygonVertices]; for (int32 i = 0; i < vertexCount; ++i) { vertices[i] = b2Mul(xf, localVertices[i]); } m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color); if (core) { const b2Vec2* localCoreVertices = poly->GetCoreVertices(); for (int32 i = 0; i < vertexCount; ++i) { vertices[i] = b2Mul(xf, localCoreVertices[i]); } m_debugDraw->DrawPolygon(vertices, vertexCount, coreColor); } } break; } } void b2World::DrawJoint(b2Joint* joint) { b2Body* b1 = joint->GetBody1(); b2Body* b2 = joint->GetBody2(); const b2XForm& xf1 = b1->GetXForm(); const b2XForm& xf2 = b2->GetXForm(); b2Vec2 x1 = xf1.position; b2Vec2 x2 = xf2.position; b2Vec2 p1 = joint->GetAnchor1(); b2Vec2 p2 = joint->GetAnchor2(); b2Color color(0.5f, 0.8f, 0.8f); switch (joint->GetType()) { case e_distanceJoint: m_debugDraw->DrawSegment(p1, p2, color); break; case e_pulleyJoint: { b2PulleyJoint* pulley = (b2PulleyJoint*)joint; b2Vec2 s1 = pulley->GetGroundAnchor1(); b2Vec2 s2 = pulley->GetGroundAnchor2(); m_debugDraw->DrawSegment(s1, p1, color); m_debugDraw->DrawSegment(s2, p2, color); m_debugDraw->DrawSegment(s1, s2, color); } break; case e_mouseJoint: // don't draw this break; default: m_debugDraw->DrawSegment(x1, p1, color); m_debugDraw->DrawSegment(p1, p2, color); m_debugDraw->DrawSegment(x2, p2, color); } } void b2World::DrawDebugData() { if (m_debugDraw == NULL) { return; } uint32 flags = m_debugDraw->GetFlags(); if (flags & b2DebugDraw::e_shapeBit) { bool core = (flags & b2DebugDraw::e_coreShapeBit) == b2DebugDraw::e_coreShapeBit; for (b2Body* b = m_bodyList; b; b = b->GetNext()) { const b2XForm& xf = b->GetXForm(); for (b2Shape* s = b->GetShapeList(); s; s = s->GetNext()) { if (b->IsStatic()) { DrawShape(s, xf, b2Color(0.5f, 0.9f, 0.5f), core); } else if (b->IsSleeping()) { DrawShape(s, xf, b2Color(0.5f, 0.5f, 0.9f), core); } else { DrawShape(s, xf, b2Color(0.9f, 0.9f, 0.9f), core); } } } } if (flags & b2DebugDraw::e_jointBit) { for (b2Joint* j = m_jointList; j; j = j->GetNext()) { if (j->GetType() != e_mouseJoint) { DrawJoint(j); } } } if (flags & b2DebugDraw::e_pairBit) { b2BroadPhase* bp = m_broadPhase; b2Vec2 invQ; invQ.Set(1.0f / bp->m_quantizationFactor.x, 1.0f / bp->m_quantizationFactor.y); b2Color color(0.9f, 0.9f, 0.3f); for (int32 i = 0; i < b2_tableCapacity; ++i) { uint16 index = bp->m_pairManager.m_hashTable[i]; while (index != b2_nullPair) { b2Pair* pair = bp->m_pairManager.m_pairs + index; b2Proxy* p1 = bp->m_proxyPool + pair->proxyId1; b2Proxy* p2 = bp->m_proxyPool + pair->proxyId2; b2AABB b1, b2; b1.lowerBound.x = bp->m_worldAABB.lowerBound.x + invQ.x * bp->m_bounds[0][p1->lowerBounds[0]].value; b1.lowerBound.y = bp->m_worldAABB.lowerBound.y + invQ.y * bp->m_bounds[1][p1->lowerBounds[1]].value; b1.upperBound.x = bp->m_worldAABB.lowerBound.x + invQ.x * bp->m_bounds[0][p1->upperBounds[0]].value; b1.upperBound.y = bp->m_worldAABB.lowerBound.y + invQ.y * bp->m_bounds[1][p1->upperBounds[1]].value; b2.lowerBound.x = bp->m_worldAABB.lowerBound.x + invQ.x * bp->m_bounds[0][p2->lowerBounds[0]].value; b2.lowerBound.y = bp->m_worldAABB.lowerBound.y + invQ.y * bp->m_bounds[1][p2->lowerBounds[1]].value; b2.upperBound.x = bp->m_worldAABB.lowerBound.x + invQ.x * bp->m_bounds[0][p2->upperBounds[0]].value; b2.upperBound.y = bp->m_worldAABB.lowerBound.y + invQ.y * bp->m_bounds[1][p2->upperBounds[1]].value; b2Vec2 x1 = 0.5f * (b1.lowerBound + b1.upperBound); b2Vec2 x2 = 0.5f * (b2.lowerBound + b2.upperBound); m_debugDraw->DrawSegment(x1, x2, color); index = pair->next; } } } if (flags & b2DebugDraw::e_aabbBit) { b2BroadPhase* bp = m_broadPhase; b2Vec2 worldLower = bp->m_worldAABB.lowerBound; b2Vec2 worldUpper = bp->m_worldAABB.upperBound; b2Vec2 invQ; invQ.Set(1.0f / bp->m_quantizationFactor.x, 1.0f / bp->m_quantizationFactor.y); b2Color color(0.9f, 0.3f, 0.9f); for (int32 i = 0; i < b2_maxProxies; ++i) { b2Proxy* p = bp->m_proxyPool + i; if (p->IsValid() == false) { continue; } b2AABB b; b.lowerBound.x = worldLower.x + invQ.x * bp->m_bounds[0][p->lowerBounds[0]].value; b.lowerBound.y = worldLower.y + invQ.y * bp->m_bounds[1][p->lowerBounds[1]].value; b.upperBound.x = worldLower.x + invQ.x * bp->m_bounds[0][p->upperBounds[0]].value; b.upperBound.y = worldLower.y + invQ.y * bp->m_bounds[1][p->upperBounds[1]].value; b2Vec2 vs[4]; vs[0].Set(b.lowerBound.x, b.lowerBound.y); vs[1].Set(b.upperBound.x, b.lowerBound.y); vs[2].Set(b.upperBound.x, b.upperBound.y); vs[3].Set(b.lowerBound.x, b.upperBound.y); m_debugDraw->DrawPolygon(vs, 4, color); } b2Vec2 vs[4]; vs[0].Set(worldLower.x, worldLower.y); vs[1].Set(worldUpper.x, worldLower.y); vs[2].Set(worldUpper.x, worldUpper.y); vs[3].Set(worldLower.x, worldUpper.y); m_debugDraw->DrawPolygon(vs, 4, b2Color(0.3f, 0.9f, 0.9f)); } if (flags & b2DebugDraw::e_obbBit) { b2Color color(0.5f, 0.3f, 0.5f); for (b2Body* b = m_bodyList; b; b = b->GetNext()) { const b2XForm& xf = b->GetXForm(); for (b2Shape* s = b->GetShapeList(); s; s = s->GetNext()) { if (s->GetType() != e_polygonShape) { continue; } b2PolygonShape* poly = (b2PolygonShape*)s; const b2OBB& obb = poly->GetOBB(); b2Vec2 h = obb.extents; b2Vec2 vs[4]; vs[0].Set(-h.x, -h.y); vs[1].Set( h.x, -h.y); vs[2].Set( h.x, h.y); vs[3].Set(-h.x, h.y); for (int32 i = 0; i < 4; ++i) { vs[i] = obb.center + b2Mul(obb.R, vs[i]); vs[i] = b2Mul(xf, vs[i]); } m_debugDraw->DrawPolygon(vs, 4, color); } } } if (flags & b2DebugDraw::e_centerOfMassBit) { for (b2Body* b = m_bodyList; b; b = b->GetNext()) { b2XForm xf = b->GetXForm(); xf.position = b->GetWorldCenter(); m_debugDraw->DrawXForm(xf); } } } void b2World::Validate() { m_broadPhase->Validate(); } int32 b2World::GetProxyCount() const { return m_broadPhase->m_proxyCount; } int32 b2World::GetPairCount() const { return m_broadPhase->m_pairManager.m_pairCount; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2World.h000066400000000000000000000175311425065123200237740ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_WORLD_H #define B2_WORLD_H #include "../Common/b2Math.h" #include "../Common/b2BlockAllocator.h" #include "../Common/b2StackAllocator.h" #include "b2ContactManager.h" #include "b2WorldCallbacks.h" struct b2AABB; struct b2ShapeDef; struct b2BodyDef; struct b2JointDef; class b2Body; class b2Joint; class b2Shape; class b2Contact; class b2BroadPhase; struct b2TimeStep { float32 dt; // time step float32 inv_dt; // inverse time step (0 if dt == 0). float32 dtRatio; // dt * inv_dt0 int32 maxIterations; bool warmStarting; bool positionCorrection; }; /// The world class manages all physics entities, dynamic simulation, /// and asynchronous queries. The world also contains efficient memory /// management facilities. class b2World { public: /// Construct a world object. /// @param worldAABB a bounding box that completely encompasses all your shapes. /// @param gravity the world gravity vector. /// @param doSleep improve performance by not simulating inactive bodies. b2World(const b2AABB& worldAABB, const b2Vec2& gravity, bool doSleep); /// Destruct the world. All physics entities are destroyed and all heap memory is released. ~b2World(); /// Register a destruction listener. void SetDestructionListener(b2DestructionListener* listener); /// Register a broad-phase boundary listener. void SetBoundaryListener(b2BoundaryListener* listener); /// Register a contact filter to provide specific control over collision. /// Otherwise the default filter is used (b2_defaultFilter). void SetContactFilter(b2ContactFilter* filter); /// Register a contact event listener void SetContactListener(b2ContactListener* listener); /// Register a routine for debug drawing. The debug draw functions are called /// inside the b2World::Step method, so make sure your renderer is ready to /// consume draw commands when you call Step(). void SetDebugDraw(b2DebugDraw* debugDraw); /// Create a rigid body given a definition. No reference to the definition /// is retained. /// @warning This function is locked during callbacks. b2Body* CreateBody(const b2BodyDef* def); /// Destroy a rigid body given a definition. No reference to the definition /// is retained. This function is locked during callbacks. /// @warning This automatically deletes all associated shapes and joints. /// @warning This function is locked during callbacks. void DestroyBody(b2Body* body); /// Create a joint to constrain bodies together. No reference to the definition /// is retained. This may cause the connected bodies to cease colliding. /// @warning This function is locked during callbacks. b2Joint* CreateJoint(const b2JointDef* def); /// Destroy a joint. This may cause the connected bodies to begin colliding. /// @warning This function is locked during callbacks. void DestroyJoint(b2Joint* joint); /// The world provides a single static ground body with no collision shapes. /// You can use this to simplify the creation of joints and static shapes. b2Body* GetGroundBody(); /// Take a time step. This performs collision detection, integration, /// and constraint solution. /// @param timeStep the amount of time to simulate, this should not vary. /// @param iterations the number of iterations to be used by the constraint solver. void Step(float32 timeStep, int32 iterations); /// Query the world for all shapes that potentially overlap the /// provided AABB. You provide a shape pointer buffer of specified /// size. The number of shapes found is returned. /// @param aabb the query box. /// @param shapes a user allocated shape pointer array of size maxCount (or greater). /// @param maxCount the capacity of the shapes array. /// @return the number of shapes found in aabb. int32 Query(const b2AABB& aabb, b2Shape** shapes, int32 maxCount); /// Get the world body list. With the returned body, use b2Body::GetNext to get /// the next body in the world list. A NULL body indicates the end of the list. /// @return the head of the world body list. b2Body* GetBodyList(); /// Get the world joint list. With the returned joint, use b2Joint::GetNext to get /// the next joint in the world list. A NULL joint indicates the end of the list. /// @return the head of the world joint list. b2Joint* GetJointList(); /// Re-filter a shape. This re-runs contact filtering on a shape. void Refilter(b2Shape* shape); /// Enable/disable warm starting. For testing. void SetWarmStarting(bool flag) { m_warmStarting = flag; } /// Enable/disable position correction. For testing. void SetPositionCorrection(bool flag) { m_positionCorrection = flag; } /// Enable/disable continuous physics. For testing. void SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; } /// Perform validation of internal data structures. void Validate(); /// Get the number of broad-phase proxies. int32 GetProxyCount() const; /// Get the number of broad-phase pairs. int32 GetPairCount() const; /// Get the number of bodies. int32 GetBodyCount() const; /// Get the number joints. int32 GetJointCount() const; /// Get the number of contacts (each may have 0 or more contact points). int32 GetContactCount() const; /// Change the global gravity vector. void SetGravity(const b2Vec2& gravity); private: friend class b2Body; friend class b2ContactManager; void Solve(const b2TimeStep& step); void SolveTOI(const b2TimeStep& step); void DrawJoint(b2Joint* joint); void DrawShape(b2Shape* shape, const b2XForm& xf, const b2Color& color, bool core); void DrawDebugData(); b2BlockAllocator m_blockAllocator; b2StackAllocator m_stackAllocator; bool m_lock; b2BroadPhase* m_broadPhase; b2ContactManager m_contactManager; b2Body* m_bodyList; b2Joint* m_jointList; // Do not access b2Contact* m_contactList; int32 m_bodyCount; int32 m_contactCount; int32 m_jointCount; b2Vec2 m_gravity; bool m_allowSleep; b2Body* m_groundBody; b2DestructionListener* m_destructionListener; b2BoundaryListener* m_boundaryListener; b2ContactFilter* m_contactFilter; b2ContactListener* m_contactListener; b2DebugDraw* m_debugDraw; float32 m_inv_dt0; int32 m_positionIterationCount; // This is for debugging the solver. bool m_positionCorrection; // This is for debugging the solver. bool m_warmStarting; // This is for debugging the solver. bool m_continuousPhysics; }; inline b2Body* b2World::GetGroundBody() { return m_groundBody; } inline b2Body* b2World::GetBodyList() { return m_bodyList; } inline b2Joint* b2World::GetJointList() { return m_jointList; } inline int32 b2World::GetBodyCount() const { return m_bodyCount; } inline int32 b2World::GetJointCount() const { return m_jointCount; } inline int32 b2World::GetContactCount() const { return m_contactCount; } inline void b2World::SetGravity(const b2Vec2& gravity) { m_gravity = gravity; } #endif numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2WorldCallbacks.cpp000066400000000000000000000037271425065123200261310ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #include "b2WorldCallbacks.h" #include "../Collision/Shapes/b2Shape.h" b2ContactFilter b2_defaultFilter; // Return true if contact calculations should be performed between these two shapes. // If you implement your own collision filter you may want to build from this implementation. bool b2ContactFilter::ShouldCollide(b2Shape* shape1, b2Shape* shape2) { const b2FilterData& filter1 = shape1->GetFilterData(); const b2FilterData& filter2 = shape2->GetFilterData(); if (filter1.groupIndex == filter2.groupIndex && filter1.groupIndex != 0) { return filter1.groupIndex > 0; } bool collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0; return collide; } b2DebugDraw::b2DebugDraw() { m_drawFlags = 0; } void b2DebugDraw::SetFlags(uint32 flags) { m_drawFlags = flags; } uint32 b2DebugDraw::GetFlags() const { return m_drawFlags; } void b2DebugDraw::AppendFlags(uint32 flags) { m_drawFlags |= flags; } void b2DebugDraw::ClearFlags(uint32 flags) { m_drawFlags &= ~flags; } numptyphysics-0.3.10/external/Box2D/Source/Dynamics/b2WorldCallbacks.h000066400000000000000000000135131425065123200255700ustar00rootroot00000000000000/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef B2_WORLD_CALLBACKS_H #define B2_WORLD_CALLBACKS_H #include "../Common/b2Settings.h" struct b2Vec2; struct b2XForm; class b2Shape; class b2Body; class b2Joint; class b2Contact; struct b2ContactPoint; struct b2ContactResult; /// Joints and shapes are destroyed when their associated /// body is destroyed. Implement this listener so that you /// may nullify references to these joints and shapes. class b2DestructionListener { public: virtual ~b2DestructionListener() {} /// Called when any joint is about to be destroyed due /// to the destruction of one of its attached bodies. virtual void SayGoodbye(b2Joint* joint) = 0; /// Called when any shape is about to be destroyed due /// to the destruction of its parent body. virtual void SayGoodbye(b2Shape* shape) = 0; }; /// This is called when a body's shape passes outside of the world boundary. class b2BoundaryListener { public: virtual ~b2BoundaryListener() {} /// This is called for each body that leaves the world boundary. /// @warning you can't modify the world inside this callback. virtual void Violation(b2Body* body) = 0; }; /// Implement this class to provide collision filtering. In other words, you can implement /// this class if you want finer control over contact creation. class b2ContactFilter { public: virtual ~b2ContactFilter() {} /// Return true if contact calculations should be performed between these two shapes. /// @warning for performance reasons this is only called when the AABBs begin to overlap. virtual bool ShouldCollide(b2Shape* shape1, b2Shape* shape2); }; /// The default contact filter. extern b2ContactFilter b2_defaultFilter; /// Implement this class to get collision results. You can use these results for /// things like sounds and game logic. You can also get contact results by /// traversing the contact lists after the time step. However, you might miss /// some contacts because continuous physics leads to sub-stepping. /// Additionally you may receive multiple callbacks for the same contact in a /// single time step. /// You should strive to make your callbacks efficient because there may be /// many callbacks per time step. /// @warning The contact separation is the last computed value. /// @warning You cannot create/destroy Box2D entities inside these callbacks. class b2ContactListener { public: virtual ~b2ContactListener() {} /// Called when a contact point is added. This includes the geometry /// and the forces. virtual void Add(const b2ContactPoint* point) { B2_NOT_USED(point); } /// Called when a contact point persists. This includes the geometry /// and the forces. virtual void Persist(const b2ContactPoint* point) { B2_NOT_USED(point); } /// Called when a contact point is removed. This includes the last /// computed geometry and forces. virtual void Remove(const b2ContactPoint* point) { B2_NOT_USED(point); } /// Called after a contact point is solved. virtual void Result(const b2ContactResult* point) { B2_NOT_USED(point); } }; /// Color for debug drawing. Each value has the range [0,1]. struct b2Color { b2Color() {} b2Color(float32 r, float32 g, float32 b) : r(r), g(g), b(b) {} float32 r, g, b; }; /// Implement and register this class with a b2World to provide debug drawing of physics /// entities in your game. class b2DebugDraw { public: b2DebugDraw(); virtual ~b2DebugDraw() {} enum { e_shapeBit = 0x0001, ///< draw shapes e_jointBit = 0x0002, ///< draw joint connections e_coreShapeBit = 0x0004, ///< draw core (TOI) shapes e_aabbBit = 0x0008, ///< draw axis aligned bounding boxes e_obbBit = 0x0010, ///< draw oriented bounding boxes e_pairBit = 0x0020, ///< draw broad-phase pairs e_centerOfMassBit = 0x0040, ///< draw center of mass frame }; /// Set the drawing flags. void SetFlags(uint32 flags); /// Get the drawing flags. uint32 GetFlags() const; /// Append flags to the current flags. void AppendFlags(uint32 flags); /// Clear flags from the current flags. void ClearFlags(uint32 flags); /// Draw a closed polygon provided in CCW order. virtual void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0; /// Draw a solid closed polygon provided in CCW order. virtual void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0; /// Draw a circle. virtual void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) = 0; /// Draw a solid circle. virtual void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) = 0; /// Draw a line segment. virtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) = 0; /// Draw a transform. Choose your own length scale. /// @param xf a transform. virtual void DrawXForm(const b2XForm& xf) = 0; protected: uint32 m_drawFlags; }; #endif numptyphysics-0.3.10/external/Box2D/Source/Makefile000066400000000000000000000065371425065123200222050ustar00rootroot00000000000000TARGETS= Gen/float/libbox2d.a Gen/fixed/libbox2d.a RANLIB ?= ranlib ifdef DEVKITPRO TARGETS += Gen/nds-float/lib/libbox2d.a Gen/nds-fixed/lib/libbox2d.a endif CXXFLAGS= -g -O2 SOURCES = \ ./Dynamics/b2Body.cpp \ ./Dynamics/b2Island.cpp \ ./Dynamics/b2World.cpp \ ./Dynamics/b2ContactManager.cpp \ ./Dynamics/Contacts/b2Contact.cpp \ ./Dynamics/Contacts/b2PolyContact.cpp \ ./Dynamics/Contacts/b2CircleContact.cpp \ ./Dynamics/Contacts/b2PolyAndCircleContact.cpp \ ./Dynamics/Contacts/b2ContactSolver.cpp \ ./Dynamics/b2WorldCallbacks.cpp \ ./Dynamics/Joints/b2MouseJoint.cpp \ ./Dynamics/Joints/b2PulleyJoint.cpp \ ./Dynamics/Joints/b2Joint.cpp \ ./Dynamics/Joints/b2RevoluteJoint.cpp \ ./Dynamics/Joints/b2PrismaticJoint.cpp \ ./Dynamics/Joints/b2DistanceJoint.cpp \ ./Dynamics/Joints/b2GearJoint.cpp \ ./Common/b2StackAllocator.cpp \ ./Common/b2Math.cpp \ ./Common/b2BlockAllocator.cpp \ ./Common/b2Settings.cpp \ ./Collision/b2Collision.cpp \ ./Collision/b2Distance.cpp \ ./Collision/Shapes/b2Shape.cpp \ ./Collision/Shapes/b2CircleShape.cpp \ ./Collision/Shapes/b2PolygonShape.cpp \ ./Collision/b2TimeOfImpact.cpp \ ./Collision/b2PairManager.cpp \ ./Collision/b2CollidePoly.cpp \ ./Collision/b2CollideCircle.cpp \ ./Collision/b2BroadPhase.cpp # ./Contrib/b2Polygon.cpp \ # ./Contrib/b2Triangle.cpp ifneq ($(INCLUDE_DEPENDENCIES),yes) all: @make --no-print-directory INCLUDE_DEPENDENCIES=yes $(TARGETS) .PHONY: clean clean: rm -rf Gen else -include $(addprefix Gen/float/,$(SOURCES:.cpp=.d)) -include $(addprefix Gen/fixed/,$(SOURCES:.cpp=.d)) ifdef DEVKITPRO -include $(addprefix Gen/nds-fixed/,$(SOURCES:.cpp=.d)) -include $(addprefix Gen/nds-float/,$(SOURCES:.cpp=.d)) endif endif Gen/float/%.o: %.cpp @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) -c -o $@ $< Gen/float/libbox2d.a: $(addprefix Gen/float/,$(SOURCES:.cpp=.o)) $(AR) cr $@ $^ $(RANLIB) $@ Gen/float/%.d: %.cpp @mkdir -p $(dir $@) $(CXX) -MM -MT $(@:.d=.o) $(CXXFLAGS) -o $@ $< Gen/fixed/%.o: %.cpp @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) -DTARGET_FLOAT32_IS_FIXED -c -o $@ $< Gen/fixed/libbox2d.a: $(addprefix Gen/fixed/,$(SOURCES:.cpp=.o)) $(AR) cr $@ $^ $(RANLIB) $@ Gen/fixed/%.d: %.cpp @mkdir -p $(dir $@) $(CXX) -MM -MT $(@:.d=.o) $(CXXFLAGS) -DTARGET_FLOAT32_IS_FIXED -o $@ $< NDS_COMPILE_FLAGS= -g -O2 -fomit-frame-pointer -ffast-math \ -march=armv5te -mtune=arm946e-s -mthumb-interwork \ -DARM9 -fno-rtti -fno-exceptions -c \ -DTARGET_IS_NDS \ -I$(DEVKITPRO)/libnds/include Gen/nds-fixed/%.o: %.cpp @mkdir -p $(dir $@) arm-eabi-g++ $(NDS_COMPILE_FLAGS) -DTARGET_FLOAT32_IS_FIXED -o $@ $< Gen/nds-fixed/lib/libbox2d.a: $(addprefix Gen/nds-fixed/,$(SOURCES:.cpp=.o)) @mkdir -p $(dir $@) arm-eabi-ar cr $@ $^ arm-eabi-ranlib $@ Gen/nds-fixed/%.d: %.cpp @mkdir -p $(dir $@) arm-eabi-g++ -MM -MT $(@:.d=.o) $(NDS_COMPILE_FLAGS) \ -DTARGET_FLOAT32_IS_FIXED -o $@ $< Gen/nds-float/%.o: %.cpp @mkdir -p $(dir $@) arm-eabi-g++ $(NDS_COMPILE_FLAGS) -o $@ $< Gen/nds-float/lib/libbox2d.a: $(addprefix Gen/nds-float/,$(SOURCES:.cpp=.o)) @mkdir -p $(dir $@) arm-eabi-ar cr $@ $^ arm-eabi-ranlib $@ Gen/nds-float/%.d: %.cpp @mkdir -p $(dir $@) arm-eabi-g++ -MM -MT $(@:.d=.o) $(NDS_COMPILE_FLAGS) -o $@ $< numptyphysics-0.3.10/external/Box2D/TODO.txt000066400000000000000000000100541425065123200206000ustar00rootroot00000000000000Version 1.0.0 - Clamp large rotations. DONE - Restitution. DONE - Prismatic joint. DONE - Limits and motors. DONE - Handle equal limits. DONE - Fast broadphase. DONE - Collide connected. DONE - Island sleeping. DONE - Custom allocators. DONE - Convex polygons. DONE - Compound shapes. DONE - Constraint graph. DONE - Contact solver. DONE - Joint solver. DONE - Improved stability. DONE - Improve contact matching. DONE - Contact solver. DONE - Joint solver. DONE - Mouse picking. DONE - SAP AABB query. DONE - Distance joint. DONE Version 1.0.1 - Joint limit bug fix. DONE Version 1.1.0 - Handle dangling joint pointers. DONE - Collision filters. DONE - User data. DONE - Improved API. DONE - Orphaned mouse joint. DONE Version 1.2.0 - Rename engine.lib to box2d.lib. DONE - Code layout. DONE - Circles. DONE Version 1.2.1 - Handle proxies hitting the world boundary. DONE - Freeze out of bounds bodies, notify user. DONE - Handle running out of pairs. DONE Version 1.3.0 - Documentation phase 1. DONE - Add "no rotation" option to body def. DONE - b2Settings configuration for pixel coordinates. DONE - Slider-crank test. DONE - Notify client when a body is frozen. DONE - Fix collide-connected. DONE - Fix compound polygons. DONE - Check degenerate containment resolution. DONE (no problem found) - Access to contacts and joints. DONE Version 1.4.0 - Gear joint. DONE - Pulley joint. DONE - Personalize the phpbb header. DONE - Document contacts and new joint types. DONE Version 1.4.1 - Fix contact list. DONE - Damping. DONE - Poly-circle ids. DONE - Improve mouse joint. DONE Version 1.4.2 - Improve joint stability. DONE. Version 1.4.3 - Fix thin polygon collision. DONE - Simplify broad-phase internally. DONE - OSX patch. DONE - Fix compound body freezing. DONE - Collision filter callback. DONE Version 2.0.0 - Collision doesn't include any files from Dynamics. DONE - User created shapes. DONE - Shape ray casts. DONE - Verify polygon convex and CCW. DONE - Deferred body destruction is gone. DONE - Deferred contact destruction is gone. DONE - JointDefs in local coordinates so that save/load works with limits. DONE - Wake up bonies on apply force/torque/impulse. DONE - Improve polygon collision performance. DONE - Optimal OBBs for polygons. DONE - Debug display interface. DONE - Access version number. DONE - Improved TestBed camera. DONE - Continuous physics with TOI islands. DONE - Max velocities. DONE - Body add/remove shape. DONE - Damping now works better with a variable time step. DONE - Time of Impact (TOI) callbacks. DONE - Contact solver tweak callbacks. DONE - Contact callbacks with impulses. DONE - Safe contact callback example. DONE - Draw world AABB in TestBed. DONE - Use forces instead of impulses to handle variable time step. DONE - Ragdoll contribution. DONE - Car example. DONE - Constraint graph and shapes support changes in center of mass. DONE - Sensors with overlap report. DONE - Doxygen. DONE - Update manual. DONE Version 2.1.0 - Meshes (segment soup). - Ray casts. - Wiki. DONE - Pairs and proxies use small block allocator? - Bounds use growable array? - Don't sleep until position error is low? - Allow non-solid polygon edges. - User refilter. - CMake. - Kequalized crash. - Soft distance constraint. DONE - Version 2.2.0 - Handle orphaned gear joint. - Friction/motor joint for top down games. - Rolling resistance for circles. - Add comments to examples and testbed. Version 2.3.0 - Convex hull tool. - Angle joint. - Weld joint. - Speculative contacts. Version 2.4.0 - Spline joints. - Contact block solver. Version 2.5.0 - Convex decomposition. - Kinematic bodies. Version 2.6.0 - Ropes and particles. - Growable vertex arrays. Version 3+ - Performance. - Try position correction clamping and larger Baumgarte. - Characters. - Vehicles. - Tree constraints. - Buoyancy. - Heightfields. - Static point-grids. - Revolute 3x3 effective mass. - Use velocity lambda to control NGS clamping. - No globals or statics.numptyphysics-0.3.10/external/glaserl/000077500000000000000000000000001425065123200200055ustar00rootroot00000000000000numptyphysics-0.3.10/external/glaserl/glaserl.h000066400000000000000000000014071425065123200216110ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "glaserl_program.h" #include "glaserl_buffer.h" #include "glaserl_texture.h" #include "glaserl_util.h" #include "glaserl_framebuffer.h" numptyphysics-0.3.10/external/glaserl/glaserl_buffer.c000066400000000000000000000047511425065123200231420ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "glaserl_buffer.h" #include #include #include glaserl_buffer_t * glaserl_buffer_new() { glaserl_buffer_t *buffer = (glaserl_buffer_t *)calloc(sizeof(glaserl_buffer_t), 1); buffer->buffer = 0; buffer->size = 0; buffer->offset = 0; buffer->frozen = 0; glaserl_buffer_resize(buffer, 1024); glGenBuffers(1, &(buffer->id)); return buffer; } void glaserl_buffer_resize(glaserl_buffer_t *buffer, size_t size) { if (buffer->frozen) { assert(0); return; } buffer->size = size; buffer->buffer = (char *)realloc(buffer->buffer, size); } void glaserl_buffer_append(glaserl_buffer_t *buffer, void *data, size_t size) { if (buffer->frozen) { assert(0); return; } if (buffer->offset + size > buffer->size) { size_t new_size = buffer->size; while (buffer->offset + size > new_size) { new_size *= 2; } glaserl_buffer_resize(buffer, new_size); } memcpy(buffer->buffer + buffer->offset, data, size); buffer->offset += size; } void glaserl_buffer_freeze(glaserl_buffer_t *buffer) { glBindBuffer(GL_ARRAY_BUFFER, buffer->id); glBufferData(GL_ARRAY_BUFFER, buffer->offset, buffer->buffer, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); buffer->frozen = 1; } size_t glaserl_buffer_enable(glaserl_buffer_t *buffer) { glBindBuffer(GL_ARRAY_BUFFER, buffer->id); size_t size = buffer->offset; if (!buffer->frozen) { glBufferData(GL_ARRAY_BUFFER, buffer->offset, buffer->buffer, GL_STREAM_DRAW); buffer->offset = 0; } return size; } void glaserl_buffer_disable(glaserl_buffer_t *buffer) { glBindBuffer(GL_ARRAY_BUFFER, 0); } void glaserl_buffer_destroy(glaserl_buffer_t *buffer) { glDeleteBuffers(1, &(buffer->id)); free(buffer->buffer); free(buffer); } numptyphysics-0.3.10/external/glaserl/glaserl_buffer.h000066400000000000000000000026371425065123200231500ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef GLASERL_BUFFER_H #define GLASERL_BUFFER_H #include "glaserl_gl.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ struct glaserl_buffer_t { char *buffer; size_t size; size_t offset; GLuint id; int frozen; }; typedef struct glaserl_buffer_t glaserl_buffer_t; glaserl_buffer_t * glaserl_buffer_new(); void glaserl_buffer_resize(glaserl_buffer_t *buffer, size_t size); void glaserl_buffer_append(glaserl_buffer_t *buffer, void *data, size_t size); void glaserl_buffer_freeze(glaserl_buffer_t *buffer); size_t glaserl_buffer_enable(glaserl_buffer_t *buffer); void glaserl_buffer_disable(glaserl_buffer_t *buffer); void glaserl_buffer_destroy(glaserl_buffer_t *buffer); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* GLASERL_BUFFER_H */ numptyphysics-0.3.10/external/glaserl/glaserl_framebuffer.c000066400000000000000000000044301425065123200241470ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "glaserl_framebuffer.h" #include #include glaserl_framebuffer_t * glaserl_framebuffer_new(int width, int height) { glaserl_framebuffer_t *framebuffer = (glaserl_framebuffer_t *)calloc(sizeof(glaserl_framebuffer_t), 1); framebuffer->width = width; framebuffer->height = height; glGenFramebuffers(1, &framebuffer->id); return framebuffer; } void glaserl_framebuffer_attach(glaserl_framebuffer_t *framebuffer, glaserl_texture_t *texture) { glaserl_framebuffer_enable(framebuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture->id, 0); glaserl_framebuffer_disable(framebuffer); } void glaserl_framebuffer_enable(glaserl_framebuffer_t *framebuffer) { GLint current = 0; glGetIntegerv(GL_FRAMEBUFFER_BINDING, ¤t); if (current != framebuffer->id) { framebuffer->old_framebuffer = current; glGetIntegerv(GL_VIEWPORT, framebuffer->old_viewport); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->id); glViewport(0, 0, framebuffer->width, framebuffer->height); } } void glaserl_framebuffer_disable(glaserl_framebuffer_t *framebuffer) { GLint current = 0; glGetIntegerv(GL_FRAMEBUFFER_BINDING, ¤t); if (current == framebuffer->id) { glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->old_framebuffer); glViewport(framebuffer->old_viewport[0], framebuffer->old_viewport[1], framebuffer->old_viewport[2], framebuffer->old_viewport[3]); } } void glaserl_framebuffer_destroy(glaserl_framebuffer_t *framebuffer) { glDeleteFramebuffers(1, &framebuffer->id); free(framebuffer); } numptyphysics-0.3.10/external/glaserl/glaserl_framebuffer.h000066400000000000000000000027231425065123200241570ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef GLASERL_FRAMEBUFFER_H #define GLASERL_FRAMEBUFFER_H #include "glaserl_gl.h" #include "glaserl_texture.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ struct glaserl_framebuffer_t { int width; int height; GLuint id; GLint old_framebuffer; GLint old_viewport[4]; }; typedef struct glaserl_framebuffer_t glaserl_framebuffer_t; glaserl_framebuffer_t * glaserl_framebuffer_new(int width, int height); void glaserl_framebuffer_attach(glaserl_framebuffer_t *framebuffer, glaserl_texture_t *texture); void glaserl_framebuffer_enable(glaserl_framebuffer_t *framebuffer); void glaserl_framebuffer_disable(glaserl_framebuffer_t *framebuffer); void glaserl_framebuffer_destroy(glaserl_framebuffer_t *framebuffer); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* GLASERL_FRAMEBUFFER_H */ numptyphysics-0.3.10/external/glaserl/glaserl_gl.h000066400000000000000000000022201425065123200222650ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef GLASERL_GL_H #define GLASERL_GL_H #include #if defined(USE_OPENGL_ES) # include # define GLASERL_GLSL_PRECISION_INFO "precision mediump float;\n" #elif defined(__APPLE__) # include #elif defined(__WIN32__) # include "gl.h" #else # define GL_GLEXT_PROTOTYPES # include # include #endif #if !defined(GLASERL_GLSL_PRECISION_INFO) #define GLASERL_GLSL_PRECISION_INFO "" #endif /* !defined(GLASERL_GLSL_PRECISION_INFO) */ #endif /* GLASERL_GL_H */ numptyphysics-0.3.10/external/glaserl/glaserl_program.c000066400000000000000000000105271425065123200233360ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "glaserl_program.h" #include #include #include static GLuint make_shader(GLenum type, const char *source) { GLuint shader = glCreateShader(type); const char *shader_src[] = { GLASERL_GLSL_PRECISION_INFO, source }; glShaderSource(shader, 2, shader_src, 0); glCompileShader(shader); GLint result = GL_FALSE; glGetShaderiv(shader, GL_COMPILE_STATUS, &result); if (!result) { GLint size = 0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &size); char *tmp = (char *)malloc(size); glGetShaderInfoLog(shader, size, NULL, tmp); printf("Failed to link shader: %s\n", tmp); free(tmp); exit(0); } return shader; } static GLuint make_program(const char *vertex_shader, const char *fragment_shader) { GLuint program = glCreateProgram(); glAttachShader(program, make_shader(GL_VERTEX_SHADER, vertex_shader)); glAttachShader(program, make_shader(GL_FRAGMENT_SHADER, fragment_shader)); glLinkProgram(program); GLint result = GL_FALSE; glGetProgramiv(program, GL_LINK_STATUS, &result); if (!result) { printf("Failed to link program!\n"); exit(0); } return program; } glaserl_program_t * glaserl_program_new(const char *vertex_shader_src, const char *fragment_shader_src, ...) { va_list args; va_start(args, fragment_shader_src); return glaserl_program_newv(vertex_shader_src, fragment_shader_src, args); } glaserl_program_t * glaserl_program_newv(const char *vertex_shader_src, const char *fragment_shader_src, va_list args) { glaserl_program_t *program; int i; program = (glaserl_program_t *)calloc(sizeof(glaserl_program_t), 1); program->program = make_program(vertex_shader_src, fragment_shader_src); program->stride = 0; // Attributes i = 0; for (;;) { const char *name = va_arg(args, const char *); if (name == NULL) { break; } int size = va_arg(args, int); program->attributes[i].name = strdup(name); program->attributes[i].size = size; program->attributes[i].location = glGetAttribLocation(program->program, name); program->stride += size * sizeof(float); i++; } // Uniforms i = 0; for (;;) { const char *name = va_arg(args, const char *); if (name == NULL) { break; } program->uniforms[i].name = strdup(name); program->uniforms[i].location = glGetUniformLocation(program->program, name); i++; } va_end(args); return program; } void glaserl_program_enable(glaserl_program_t *program) { glUseProgram(program->program); glaserl_program_attrib_t *attr = program->attributes; size_t offset = 0; float *fbuffer = 0; while (attr && attr->name) { glEnableVertexAttribArray(attr->location); glVertexAttribPointer(attr->location, attr->size, GL_FLOAT, GL_FALSE, program->stride, fbuffer + offset); offset += attr->size; attr++; } } void glaserl_program_disable(glaserl_program_t *program) { glaserl_program_attrib_t *attr = program->attributes; while (attr && attr->name) { glDisableVertexAttribArray(attr->location); attr++; } glUseProgram(0); } GLint glaserl_program_uniform_location(glaserl_program_t *program, const char *uniform) { glaserl_program_uniform_t *unif = program->uniforms; while (unif && unif->name) { if (strcmp(unif->name, uniform) == 0) { return unif->location; } unif++; } return -1; } void glaserl_program_destroy(glaserl_program_t *program) { // TODO } numptyphysics-0.3.10/external/glaserl/glaserl_program.h000066400000000000000000000041261425065123200233410ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef GLASERL_PROGRAM_H #define GLASERL_PROGRAM_H #include "glaserl_gl.h" #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ // Maximum numbers of attributes and uniforms #define GLASERL_PROGRAM_MAX_ATTRIBUTES 10 #define GLASERL_PROGRAM_MAX_UNIFORMS 10 struct glaserl_program_attrib_t { const char *name; int size; // in number of floats GLint location; }; typedef struct glaserl_program_attrib_t glaserl_program_attrib_t; struct glaserl_program_uniform_t { const char *name; GLint location; }; typedef struct glaserl_program_uniform_t glaserl_program_uniform_t; struct glaserl_program_t { glaserl_program_attrib_t attributes[GLASERL_PROGRAM_MAX_ATTRIBUTES]; glaserl_program_uniform_t uniforms[GLASERL_PROGRAM_MAX_UNIFORMS]; GLuint program; size_t stride; }; typedef struct glaserl_program_t glaserl_program_t; glaserl_program_t * glaserl_program_new(const char *vertex_shader_src, const char *fragment_shader_src, ...); glaserl_program_t * glaserl_program_newv(const char *vertex_shader_src, const char *fragment_shader_src, va_list args); void glaserl_program_enable(glaserl_program_t *program); void glaserl_program_disable(glaserl_program_t *program); GLint glaserl_program_uniform_location(glaserl_program_t *program, const char *uniform); void glaserl_program_destroy(glaserl_program_t *program); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* GLASERL_PROGRAM_H */ numptyphysics-0.3.10/external/glaserl/glaserl_texture.c000066400000000000000000000062141425065123200233650ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "glaserl_texture.h" static glaserl_texture_t * _glaserl_texture_new(int width, int height, int *w, int *h) { glaserl_texture_t *texture = (glaserl_texture_t *)calloc(sizeof(glaserl_texture_t), 1); glGenTextures(1, &texture->id); glaserl_texture_enable(texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); while (*w < width) *w *= 2; while (*h < height) *h *= 2; texture->width = width; texture->height = height; texture->subwidth = (float)width / (float)*w; texture->subheight = (float)height / (float)*h; return texture; } glaserl_texture_t * glaserl_texture_new(unsigned char *rgba, int width, int height) { int w = 1; int h = 1; glaserl_texture_t *texture = _glaserl_texture_new(width, height, &w, &h); texture->format = GLASERL_TEXTURE_RGBA; unsigned char *blackness = calloc(sizeof(unsigned char), w * h * 4); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, blackness); free(blackness); if (rgba) { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, rgba); } glaserl_texture_disable(texture); return texture; } glaserl_texture_t * glaserl_texture_new_rgb(unsigned char *rgb, int width, int height) { int w = 1; int h = 1; glaserl_texture_t *texture = _glaserl_texture_new(width, height, &w, &h); texture->format = GLASERL_TEXTURE_RGB; unsigned char *blackness = calloc(sizeof(unsigned char), w * h * 3); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, blackness); free(blackness); if (rgb) { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, rgb); } glaserl_texture_disable(texture); return texture; } void glaserl_texture_enable(glaserl_texture_t *texture) { glBindTexture(GL_TEXTURE_2D, texture->id); } void glaserl_texture_disable(glaserl_texture_t *texture) { glBindTexture(GL_TEXTURE_2D, 0); } void glaserl_texture_map_uv(glaserl_texture_t *texture, float *u, float *v) { *u *= texture->subwidth; *v *= texture->subheight; } void glaserl_texture_destroy(glaserl_texture_t *texture) { glDeleteTextures(1, &texture->id); free(texture); } numptyphysics-0.3.10/external/glaserl/glaserl_texture.h000066400000000000000000000030711425065123200233700ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef GLASERL_TEXTURE_H #define GLASERL_TEXTURE_H #include "glaserl_gl.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ enum glaserl_texture_format_t { GLASERL_TEXTURE_RGBA, GLASERL_TEXTURE_RGB, }; struct glaserl_texture_t { GLuint id; int width; int height; float subwidth; float subheight; enum glaserl_texture_format_t format; }; typedef struct glaserl_texture_t glaserl_texture_t; glaserl_texture_t * glaserl_texture_new(unsigned char *rgba, int width, int height); glaserl_texture_t * glaserl_texture_new_rgb(unsigned char *rgb, int width, int height); void glaserl_texture_enable(glaserl_texture_t *texture); void glaserl_texture_disable(glaserl_texture_t *texture); void glaserl_texture_map_uv(glaserl_texture_t *texture, float *u, float *v); void glaserl_texture_destroy(glaserl_texture_t *texture); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* GLASERL_TEXTURE_H */ numptyphysics-0.3.10/external/glaserl/glaserl_util.c000066400000000000000000000025041425065123200226400ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "glaserl_util.h" void glaserl_util_render_triangle_strip(glaserl_program_t *program, glaserl_buffer_t *buffer) { size_t size = glaserl_buffer_enable(buffer); glaserl_program_enable(program); glaserl_buffer_disable(buffer); glDrawArrays(GL_TRIANGLE_STRIP, 0, size / program->stride); glaserl_program_disable(program); } void glaserl_util_default_blend() { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } void glaserl_util_enable_scissor(bool enable) { if (enable) { glEnable(GL_SCISSOR_TEST); } else { glDisable(GL_SCISSOR_TEST); } } void glaserl_util_set_scissor(int x, int y, int w, int h) { glScissor(x, y, w, h); } numptyphysics-0.3.10/external/glaserl/glaserl_util.h000066400000000000000000000021731425065123200226470ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef GLASERL_UTIL_H #define GLASERL_UTIL_H #include "glaserl_program.h" #include "glaserl_buffer.h" #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void glaserl_util_render_triangle_strip(glaserl_program_t *program, glaserl_buffer_t *buffer); void glaserl_util_default_blend(); void glaserl_util_enable_scissor(bool enable); void glaserl_util_set_scissor(int x, int y, int w, int h); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* GLASERL_UTIL_H */ numptyphysics-0.3.10/external/glaserl/glaserlxx.h000066400000000000000000000110261425065123200221670ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef GLASERLXX_H #define GLASERLXX_H #include "glaserl.h" #include #include namespace Glaserl { class PProgram { public: PProgram(const char *vertex_shader_src, const char *fragment_shader_src, va_list args) : d(NULL) { d = glaserl_program_newv(vertex_shader_src, fragment_shader_src, args); } ~PProgram() { glaserl_program_destroy(d); } void enable() { glaserl_program_enable(d); } void disable() { glaserl_program_disable(d); } GLint uniform_location(const char *uniform) { return glaserl_program_uniform_location(d, uniform); } size_t stride() { return d->stride; } glaserl_program_t *d; }; typedef std::shared_ptr Program; static inline Program program(const char *vertex_shader_src, const char *fragment_shader_src, ...) { va_list args; va_start(args, fragment_shader_src); return Program(new PProgram(vertex_shader_src, fragment_shader_src, args)); } class PBuffer { public: PBuffer() : d(glaserl_buffer_new()) { } ~PBuffer() { glaserl_buffer_destroy(d); } void resize(size_t size) { glaserl_buffer_resize(d, size); } void append(void *data, size_t size) { glaserl_buffer_append(d, data, size); } void freeze() { glaserl_buffer_freeze(d); } size_t enable() { return glaserl_buffer_enable(d); } void disable() { glaserl_buffer_disable(d); } glaserl_buffer_t *d; }; typedef std::shared_ptr Buffer; static inline Buffer buffer() { return Buffer(new PBuffer()); } class PTexture { private: PTexture(glaserl_texture_t *texture) : d(texture) { } public: static PTexture *rgba(unsigned char *rgba, int width, int height) { return new PTexture(glaserl_texture_new(rgba, width, height)); } static PTexture *rgb(unsigned char *rgb, int width, int height) { return new PTexture(glaserl_texture_new_rgb(rgb, width, height)); } ~PTexture() { glaserl_texture_destroy(d); } void enable() { glaserl_texture_enable(d); } void disable() { glaserl_texture_disable(d); } int width() { return d->width; } int height() { return d->height; } void map_uv(float &u, float &v) { glaserl_texture_map_uv(d, &u, &v); } glaserl_texture_t *d; }; typedef std::shared_ptr Texture; static inline Texture texture(unsigned char *rgba, int width, int height) { return Texture(PTexture::rgba(rgba, width, height)); } static inline Texture texture_rgb(unsigned char *rgb, int width, int height) { return Texture(PTexture::rgb(rgb, width, height)); } class PFramebuffer { public: PFramebuffer(int width, int height, bool rgba=false) : d(glaserl_framebuffer_new(width, height)) , texture(rgba ? Glaserl::texture(nullptr, width, height) : Glaserl::texture_rgb(nullptr, width, height)) { glaserl_framebuffer_attach(d, texture->d); } ~PFramebuffer() { glaserl_framebuffer_destroy(d); } void enable() { glaserl_framebuffer_enable(d); } void disable() { glaserl_framebuffer_disable(d); } int width() { return d->width; } int height() { return d->height; } glaserl_framebuffer_t *d; Texture texture; }; typedef std::shared_ptr Framebuffer; static inline Framebuffer framebuffer(int width, int height) { return Framebuffer(new PFramebuffer(width, height)); } namespace Util { static inline void render_triangle_strip(Program &program, Buffer &buffer) { glaserl_util_render_triangle_strip(program->d, buffer->d); } static inline void default_blend() { glaserl_util_default_blend(); } static inline void enable_scissor(bool enable=true) { glaserl_util_enable_scissor(enable); } static inline void set_scissor(int x, int y, int w, int h) { glaserl_util_set_scissor(x, y, w, h); } }; // Util }; /* Glaserl */ #endif /* GLASERLXX_H */ numptyphysics-0.3.10/external/glaserl/makefile000066400000000000000000000004011425065123200215000ustar00rootroot00000000000000TARGET := libglaserl.a CFLAGS += -g -O2 SOURCES := $(wildcard *.c) OBJECTS := $(SOURCES:.c=.o) all: $(TARGET) $(TARGET): $(OBJECTS) $(AR) rcs $@ $^ clean: rm -f $(OBJECTS) distclean: clean rm -f $(TARGET) .PHONY: all clean distclean .DEFAULT: all numptyphysics-0.3.10/external/petals_log/000077500000000000000000000000001425065123200205055ustar00rootroot00000000000000numptyphysics-0.3.10/external/petals_log/petals_log.cpp000066400000000000000000000056461425065123200233550ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "petals_log.h" #include #include #include #include #ifdef ANDROID #include #endif #if __APPLE__ # include "TargetConditionals.h" # if TARGET_IPHONE_SIMULATOR # define PETALS_LOG_COLOR false # elif TARGET_OS_IPHONE # define PETALS_LOG_COLOR false # else # define PETALS_LOG_COLOR true # endif #else # define PETALS_LOG_COLOR true #endif static long (*g_ticks)() = nullptr; static std::string (*g_format)(const char *fmt, ...) = nullptr; namespace PetalsLog { void init(long (*ticks)(), std::string (*format)(const char *fmt, ...)) { g_ticks = ticks; g_format = format; } void log(enum Level level, const char *filename, const char *function, int lineno, const char *fmt, ...) { const char *levelname = ""; int color = 0; switch (level) { case LEVEL_DEBUG: break; case LEVEL_INFO: levelname = " INFO"; color = 36; // cyan break; case LEVEL_WARNING: levelname = " WARNING"; color = 33; // yellow break; case LEVEL_ERROR: levelname = " ERROR"; color = 31; // red break; case LEVEL_FATAL: levelname = " FATAL"; color = 31; // red break; } const char *fn = strrchr(filename, '/'); if (fn == nullptr) { fn = filename; } else { fn++; } std::string sfmt; if (g_format == nullptr || g_ticks == nullptr) { sfmt = "\n"; } else if (PETALS_LOG_COLOR) { sfmt = ::g_format("[%5dms] [%s:%d%s] \x1b[%dm%s\x1b[0m%c", ::g_ticks(), fn, lineno, levelname, color, fmt, ((fmt[strlen(fmt)-1] == '\n') ? '\0' : '\n')); } else { sfmt = ::g_format("[%5dms] [%s:%d%s] %s%c", ::g_ticks(), fn, lineno, levelname, fmt, ((fmt[strlen(fmt)-1] == '\n') ? '\0' : '\n')); } va_list args; va_start(args, fmt); #ifdef ANDROID __android_log_vprint(ANDROID_LOG_DEBUG, "LOG_TAG", sfmt.c_str(), args); #else vfprintf(stderr, sfmt.c_str(), args); #endif if (level == LEVEL_FATAL) { exit(1); } } }; /* namespace PetalsLog */ numptyphysics-0.3.10/external/petals_log/petals_log.h000066400000000000000000000032601425065123200230100ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef PETALSLOG_H #define PETALSLOG_H #include namespace PetalsLog { enum Level { LEVEL_DEBUG = 0, LEVEL_INFO, LEVEL_WARNING, LEVEL_ERROR, LEVEL_FATAL, }; void init(long (*ticks)(), std::string (*format)(const char *fmt, ...)); void log(enum Level level, const char *filename, const char *function, int lineno, const char *fmt, ...); }; /* namespace PetalsLog */ #if defined(RELEASE_BUILD) # define PETALS_LOG(level, ...) # define LOG_FATAL(...) exit(1) #else # define PETALS_LOG(level, ...) PetalsLog::log(level, __FILE__, __func__, __LINE__, __VA_ARGS__) # define LOG_FATAL(...) PETALS_LOG(PetalsLog::LEVEL_FATAL, __VA_ARGS__) #endif /* defined(RELEASE_BUILD) */ #define LOG_DEBUG(...) PETALS_LOG(PetalsLog::LEVEL_DEBUG, __VA_ARGS__) #define LOG_INFO(...) PETALS_LOG(PetalsLog::LEVEL_INFO, __VA_ARGS__) #define LOG_WARNING(...) PETALS_LOG(PetalsLog::LEVEL_WARNING, __VA_ARGS__) #define LOG_ERROR(...) PETALS_LOG(PetalsLog::LEVEL_ERROR, __VA_ARGS__) #define LOG_NOTREACHED LOG_FATAL("Unreachable code") #endif /* PETALSLOG_H */ numptyphysics-0.3.10/external/stb_loader/000077500000000000000000000000001425065123200204725ustar00rootroot00000000000000numptyphysics-0.3.10/external/stb_loader/stb_image.c000066400000000000000000004373141425065123200226040ustar00rootroot00000000000000/* stbi-1.33 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c when you control the images you're loading no warranty implied; use at your own risk QUICK NOTES: Primarily of interest to game developers and other people who can avoid problematic images and only need the trivial interface JPEG baseline (no JPEG progressive) PNG 8-bit-per-channel only TGA (not sure what subset, if a subset) BMP non-1bpp, non-RLE PSD (composited view only, no extra channels) GIF (*comp always reports as 4-channel) HDR (radiance rgbE format) PIC (Softimage PIC) - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - decode from arbitrary I/O callbacks - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) Latest revisions: 1.33 (2011-07-14) minor fixes suggested by Dave Moore 1.32 (2011-07-13) info support for all filetypes (SpartanJ) 1.31 (2011-06-19) a few more leak fixes, bug in PNG handling (SpartanJ) 1.30 (2011-06-11) added ability to load files via io callbacks (Ben Wenger) 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville 1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ) 1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila) allow trailing 0s at end of image data (Laurent Gomila) 1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ See end of file for full revision history. TODO: stbi_info support for BMP,PSD,HDR,PIC ============================ Contributors ========================= Image formats Optimizations & bugfixes Sean Barrett (jpeg, png, bmp) Fabian "ryg" Giesen Nicolas Schulz (hdr, psd) Jonathan Dummer (tga) Bug fixes & warning fixes Jean-Marc Lienher (gif) Marc LeBlanc Tom Seddon (pic) Christpher Lloyd Thatcher Ulrich (psd) Dave Moore Won Chun the Horde3D community Extensions, features Janez Zemva Jetro Lauha (stbi_info) Jonathan Blow James "moose2000" Brown (iPhone PNG) Laurent Gomila Ben "Disch" Wenger (io callbacks) Aruelien Pocheville Martin "SpartanJ" Golini Ryamond Barbiero David Woo If your name should be here but isn't, let Sean know. */ #ifndef STBI_INCLUDE_STB_IMAGE_H #define STBI_INCLUDE_STB_IMAGE_H // To get a header file for this, either cut and paste the header, // or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and // then include stb_image.c from it. //// begin header file //////////////////////////////////////////////////// // // Limitations: // - no jpeg progressive support // - non-HDR formats support 8-bit samples only (jpeg, png) // - no delayed line count (jpeg) -- IJG doesn't support either // - no 1-bit BMP // - GIF always returns *comp=4 // // Basic usage (see HDR discussion below): // int x,y,n; // unsigned char *data = stbi_load(filename, &x, &y, &n, 0); // // ... process data if not NULL ... // // ... x = width, y = height, n = # 8-bit components per pixel ... // // ... replace '0' with '1'..'4' to force that many components per pixel // // ... but 'n' will always be the number that it would have been if you said 0 // stbi_image_free(data) // // Standard parameters: // int *x -- outputs image width in pixels // int *y -- outputs image height in pixels // int *comp -- outputs # of image components in image file // int req_comp -- if non-zero, # of image components requested in result // // The return value from an image loader is an 'unsigned char *' which points // to the pixel data. The pixel data consists of *y scanlines of *x pixels, // with each pixel consisting of N interleaved 8-bit components; the first // pixel pointed to is top-left-most in the image. There is no padding between // image scanlines or between pixels, regardless of format. The number of // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. // If req_comp is non-zero, *comp has the number of components that _would_ // have been output otherwise. E.g. if you set req_comp to 4, you will always // get RGBA output, but you can check *comp to easily see if it's opaque. // // An output image with N components has the following components interleaved // in this order in each pixel: // // N=#comp components // 1 grey // 2 grey, alpha // 3 red, green, blue // 4 red, green, blue, alpha // // If image loading fails for any reason, the return value will be NULL, // and *x, *y, *comp will be unchanged. The function stbi_failure_reason() // can be queried for an extremely brief, end-user unfriendly explanation // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly // more user-friendly ones. // // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. // // =========================================================================== // // iPhone PNG support: // // By default we convert iphone-formatted PNGs back to RGB; nominally they // would silently load as BGR, except the existing code should have just // failed on such iPhone PNGs. But you can disable this conversion by // by calling stbi_convert_iphone_png_to_rgb(0), in which case // you will always just get the native iphone "format" through. // // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per // pixel to remove any premultiplied alpha *only* if the image file explicitly // says there's premultiplied data (currently only happens in iPhone images, // and only if iPhone convert-to-rgb processing is on). // // =========================================================================== // // HDR image support (disable by defining STBI_NO_HDR) // // stb_image now supports loading HDR images in general, and currently // the Radiance .HDR file format, although the support is provided // generically. You can still load any file through the existing interface; // if you attempt to load an HDR file, it will be automatically remapped to // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; // both of these constants can be reconfigured through this interface: // // stbi_hdr_to_ldr_gamma(2.2f); // stbi_hdr_to_ldr_scale(1.0f); // // (note, do not use _inverse_ constants; stbi_image will invert them // appropriately). // // Additionally, there is a new, parallel interface for loading files as // (linear) floats to preserve the full dynamic range: // // float *data = stbi_loadf(filename, &x, &y, &n, 0); // // If you load LDR images through this interface, those images will // be promoted to floating point values, run through the inverse of // constants corresponding to the above: // // stbi_ldr_to_hdr_scale(1.0f); // stbi_ldr_to_hdr_gamma(2.2f); // // Finally, given a filename (or an open file or memory block--see header // file for details) containing image data, you can query for the "most // appropriate" interface to use (that is, whether the image is HDR or // not), using: // // stbi_is_hdr(char *filename); // // =========================================================================== // // I/O callbacks // // I/O callbacks allow you to read from arbitrary sources, like packaged // files or some other source. Data read from callbacks are processed // through a small internal buffer (currently 128 bytes) to try to reduce // overhead. // // The three functions you must define are "read" (reads some bytes of data), // "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). #ifndef STBI_NO_STDIO #if defined(_MSC_VER) && _MSC_VER >= 0x1400 #define _CRT_SECURE_NO_WARNINGS // suppress bogus warnings about fopen() #endif #include #endif #define STBI_VERSION 1 enum { STBI_default = 0, // only used for req_comp STBI_grey = 1, STBI_grey_alpha = 2, STBI_rgb = 3, STBI_rgb_alpha = 4 }; typedef unsigned char stbi_uc; #ifdef __cplusplus extern "C" { #endif ////////////////////////////////////////////////////////////////////////////// // // PRIMARY API - works on images of any type // // // load image by filename, open file, or memory buffer // extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); // for stbi_load_from_file, file pointer is left pointing immediately after image #endif typedef struct { int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read void (*skip) (void *user,unsigned n); // skip the next 'n' bytes int (*eof) (void *user); // returns nonzero if we are at end of file/data } stbi_io_callbacks; extern stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_HDR extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); #endif extern float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); extern void stbi_hdr_to_ldr_gamma(float gamma); extern void stbi_hdr_to_ldr_scale(float scale); extern void stbi_ldr_to_hdr_gamma(float gamma); extern void stbi_ldr_to_hdr_scale(float scale); #endif // STBI_NO_HDR // stbi_is_hdr is always defined extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); #ifndef STBI_NO_STDIO extern int stbi_is_hdr (char const *filename); extern int stbi_is_hdr_from_file(FILE *f); #endif // STBI_NO_STDIO // get a VERY brief reason for failure // NOT THREADSAFE extern const char *stbi_failure_reason (void); // free the loaded image -- this is just free() extern void stbi_image_free (void *retval_from_stbi_load); // get image dimensions & components without fully decoding extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); extern int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); #ifndef STBI_NO_STDIO extern int stbi_info (char const *filename, int *x, int *y, int *comp); extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); #endif // for image formats that explicitly notate that they have premultiplied alpha, // we just return the colors as stored in the file. set this flag to force // unpremultiplication. results are undefined if the unpremultiply overflow. extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); // indicate whether we should process iphone images back to canonical format, // or just pass them through "as-is" extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); // ZLIB client - used by PNG, available for other purposes extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); // define faster low-level operations (typically SIMD support) #ifdef STBI_SIMD typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize); // compute an integer IDCT on "input" // input[x] = data[x] * dequantize[x] // write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' // CLAMP results to 0..255 typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step); // compute a conversion from YCbCr to RGB // 'count' pixels // write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B // y: Y input channel // cb: Cb input channel; scale/biased to be 0..255 // cr: Cr input channel; scale/biased to be 0..255 extern void stbi_install_idct(stbi_idct_8x8 func); extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); #endif // STBI_SIMD #ifdef __cplusplus } #endif // // //// end header file ///////////////////////////////////////////////////// #endif // STBI_INCLUDE_STB_IMAGE_H #ifndef STBI_HEADER_FILE_ONLY #ifndef STBI_NO_HDR #include // ldexp #include // strcmp, strtok #endif #ifndef STBI_NO_STDIO #include #endif #include #include #include #include #ifndef _MSC_VER #ifdef __cplusplus #define stbi_inline inline #else #define stbi_inline #endif #else #define stbi_inline __forceinline #endif // implementation: typedef unsigned char uint8; typedef unsigned short uint16; typedef signed short int16; typedef unsigned int uint32; typedef signed int int32; typedef unsigned int uint; // should produce compiler error if size is wrong typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1]; #if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE) #define STBI_NO_WRITE #endif #define STBI_NOTUSED(v) (void)sizeof(v) #ifdef _MSC_VER #define STBI_HAS_LROTL #endif #ifdef STBI_HAS_LROTL #define stbi_lrot(x,y) _lrotl(x,y) #else #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) #endif /////////////////////////////////////////////// // // stbi struct and start_xxx functions // stbi structure is our basic context used by all images, so it // contains all the IO context, plus some basic image information typedef struct { uint32 img_x, img_y; int img_n, img_out_n; stbi_io_callbacks io; void *io_user_data; int read_from_callbacks; int buflen; uint8 buffer_start[128]; uint8 *img_buffer, *img_buffer_end; uint8 *img_buffer_original; } stbi; static void refill_buffer(stbi *s); // initialize a memory-decode context static void start_mem(stbi *s, uint8 const *buffer, int len) { s->io.read = NULL; s->read_from_callbacks = 0; s->img_buffer = s->img_buffer_original = (uint8 *) buffer; s->img_buffer_end = (uint8 *) buffer+len; } // initialize a callback-based context static void start_callbacks(stbi *s, stbi_io_callbacks *c, void *user) { s->io = *c; s->io_user_data = user; s->buflen = sizeof(s->buffer_start); s->read_from_callbacks = 1; s->img_buffer_original = s->buffer_start; refill_buffer(s); } #ifndef STBI_NO_STDIO static int stdio_read(void *user, char *data, int size) { return (int) fread(data,1,size,(FILE*) user); } static void stdio_skip(void *user, unsigned n) { fseek((FILE*) user, n, SEEK_CUR); } static int stdio_eof(void *user) { return feof((FILE*) user); } static stbi_io_callbacks stbi_stdio_callbacks = { stdio_read, stdio_skip, stdio_eof, }; static void start_file(stbi *s, FILE *f) { start_callbacks(s, &stbi_stdio_callbacks, (void *) f); } //static void stop_file(stbi *s) { } #endif // !STBI_NO_STDIO static void stbi_rewind(stbi *s) { // conceptually rewind SHOULD rewind to the beginning of the stream, // but we just rewind to the beginning of the initial buffer, because // we only use it after doing 'test', which only ever looks at at most 92 bytes s->img_buffer = s->img_buffer_original; } static int stbi_jpeg_test(stbi *s); static stbi_uc *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp); static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp); static int stbi_png_test(stbi *s); static stbi_uc *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp); static int stbi_png_info(stbi *s, int *x, int *y, int *comp); static int stbi_bmp_test(stbi *s); static stbi_uc *stbi_bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp); static int stbi_tga_test(stbi *s); static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp); static int stbi_tga_info(stbi *s, int *x, int *y, int *comp); static int stbi_psd_test(stbi *s); static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp); static int stbi_hdr_test(stbi *s); static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp); static int stbi_pic_test(stbi *s); static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp); static int stbi_gif_test(stbi *s); static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp); static int stbi_gif_info(stbi *s, int *x, int *y, int *comp); // this is not threadsafe static const char *failure_reason; const char *stbi_failure_reason(void) { return failure_reason; } static int e(const char *str) { failure_reason = str; return 0; } // e - error // epf - error returning pointer to float // epuc - error returning pointer to unsigned char #ifdef STBI_NO_FAILURE_STRINGS #define e(x,y) 0 #elif defined(STBI_FAILURE_USERMSG) #define e(x,y) e(y) #else #define e(x,y) e(x) #endif #define epf(x,y) ((float *) (e(x,y)?NULL:NULL)) #define epuc(x,y) ((unsigned char *) (e(x,y)?NULL:NULL)) void stbi_image_free(void *retval_from_stbi_load) { free(retval_from_stbi_load); } #ifndef STBI_NO_HDR static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp); static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp); #endif static unsigned char *stbi_load_main(stbi *s, int *x, int *y, int *comp, int req_comp) { if (stbi_jpeg_test(s)) return stbi_jpeg_load(s,x,y,comp,req_comp); if (stbi_png_test(s)) return stbi_png_load(s,x,y,comp,req_comp); if (stbi_bmp_test(s)) return stbi_bmp_load(s,x,y,comp,req_comp); if (stbi_gif_test(s)) return stbi_gif_load(s,x,y,comp,req_comp); if (stbi_psd_test(s)) return stbi_psd_load(s,x,y,comp,req_comp); if (stbi_pic_test(s)) return stbi_pic_load(s,x,y,comp,req_comp); #ifndef STBI_NO_HDR if (stbi_hdr_test(s)) { float *hdr = stbi_hdr_load(s, x,y,comp,req_comp); return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); } #endif // test tga last because it's a crappy test! if (stbi_tga_test(s)) return stbi_tga_load(s,x,y,comp,req_comp); return epuc("unknown image type", "Image not of any known type, or corrupt"); } #ifndef STBI_NO_STDIO unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) { FILE *f = fopen(filename, "rb"); unsigned char *result; if (!f) return epuc("can't fopen", "Unable to open file"); result = stbi_load_from_file(f,x,y,comp,req_comp); fclose(f); return result; } unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { stbi s; start_file(&s,f); return stbi_load_main(&s,x,y,comp,req_comp); } #endif //!STBI_NO_STDIO unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi s; start_mem(&s,buffer,len); return stbi_load_main(&s,x,y,comp,req_comp); } unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi s; start_callbacks(&s, (stbi_io_callbacks *) clbk, user); return stbi_load_main(&s,x,y,comp,req_comp); } #ifndef STBI_NO_HDR float *stbi_loadf_main(stbi *s, int *x, int *y, int *comp, int req_comp) { unsigned char *data; #ifndef STBI_NO_HDR if (stbi_hdr_test(s)) return stbi_hdr_load(s,x,y,comp,req_comp); #endif data = stbi_load_main(s, x, y, comp, req_comp); if (data) return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); return epf("unknown image type", "Image not of any known type, or corrupt"); } float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi s; start_mem(&s,buffer,len); return stbi_loadf_main(&s,x,y,comp,req_comp); } float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi s; start_callbacks(&s, (stbi_io_callbacks *) clbk, user); return stbi_loadf_main(&s,x,y,comp,req_comp); } #ifndef STBI_NO_STDIO float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) { FILE *f = fopen(filename, "rb"); float *result; if (!f) return epf("can't fopen", "Unable to open file"); result = stbi_loadf_from_file(f,x,y,comp,req_comp); fclose(f); return result; } float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { stbi s; start_file(&s,f); return stbi_loadf_main(&s,x,y,comp,req_comp); } #endif // !STBI_NO_STDIO #endif // !STBI_NO_HDR // these is-hdr-or-not is defined independent of whether STBI_NO_HDR is // defined, for API simplicity; if STBI_NO_HDR is defined, it always // reports false! int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) { #ifndef STBI_NO_HDR stbi s; start_mem(&s,buffer,len); return stbi_hdr_test(&s); #else STBI_NOTUSED(buffer); STBI_NOTUSED(len); return 0; #endif } #ifndef STBI_NO_STDIO extern int stbi_is_hdr (char const *filename) { FILE *f = fopen(filename, "rb"); int result=0; if (f) { result = stbi_is_hdr_from_file(f); fclose(f); } return result; } extern int stbi_is_hdr_from_file(FILE *f) { #ifndef STBI_NO_HDR stbi s; start_file(&s,f); return stbi_hdr_test(&s); #else return 0; #endif } #endif // !STBI_NO_STDIO extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) { #ifndef STBI_NO_HDR stbi s; start_callbacks(&s, (stbi_io_callbacks *) clbk, user); return stbi_hdr_test(&s); #else return 0; #endif } #ifndef STBI_NO_HDR static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f; static float l2h_gamma=2.2f, l2h_scale=1.0f; void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; } void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; } void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; } void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; } #endif ////////////////////////////////////////////////////////////////////////////// // // Common code used by all image loaders // enum { SCAN_load=0, SCAN_type, SCAN_header }; static void refill_buffer(stbi *s) { int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); if (n == 0) { // at end of file, treat same as if from memory s->read_from_callbacks = 0; s->img_buffer = s->img_buffer_end-1; *s->img_buffer = 0; } else { s->img_buffer = s->buffer_start; s->img_buffer_end = s->buffer_start + n; } } stbi_inline static int get8(stbi *s) { if (s->img_buffer < s->img_buffer_end) return *s->img_buffer++; if (s->read_from_callbacks) { refill_buffer(s); return *s->img_buffer++; } return 0; } stbi_inline static int at_eof(stbi *s) { if (s->io.read) { if (!(s->io.eof)(s->io_user_data)) return 0; // if feof() is true, check if buffer = end // special case: we've only got the special 0 character at the end if (s->read_from_callbacks == 0) return 1; } return s->img_buffer >= s->img_buffer_end; } stbi_inline static uint8 get8u(stbi *s) { return (uint8) get8(s); } static void skip(stbi *s, int n) { if (s->io.read) { int blen = s->img_buffer_end - s->img_buffer; if (blen < n) { s->img_buffer = s->img_buffer_end; (s->io.skip)(s->io_user_data, n - blen); return; } } s->img_buffer += n; } static int getn(stbi *s, stbi_uc *buffer, int n) { if (s->io.read) { int blen = s->img_buffer_end - s->img_buffer; if (blen < n) { int res, count; memcpy(buffer, s->img_buffer, blen); count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); res = (count == (n-blen)); s->img_buffer = s->img_buffer_end; return res; } } if (s->img_buffer+n <= s->img_buffer_end) { memcpy(buffer, s->img_buffer, n); s->img_buffer += n; return 1; } else return 0; } static int get16(stbi *s) { int z = get8(s); return (z << 8) + get8(s); } static uint32 get32(stbi *s) { uint32 z = get16(s); return (z << 16) + get16(s); } static int get16le(stbi *s) { int z = get8(s); return z + (get8(s) << 8); } static uint32 get32le(stbi *s) { uint32 z = get16le(s); return z + (get16le(s) << 16); } ////////////////////////////////////////////////////////////////////////////// // // generic converter from built-in img_n to req_comp // individual types do this automatically as much as possible (e.g. jpeg // does all cases internally since it needs to colorspace convert anyway, // and it never has alpha, so very few cases ). png can automatically // interleave an alpha=255 channel, but falls back to this for other cases // // assume data buffer is malloced, so malloc a new one and free that one // only failure mode is malloc failing static uint8 compute_y(int r, int g, int b) { return (uint8) (((r*77) + (g*150) + (29*b)) >> 8); } static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y) { int i,j; unsigned char *good; if (req_comp == img_n) return data; assert(req_comp >= 1 && req_comp <= 4); good = (unsigned char *) malloc(req_comp * x * y); if (good == NULL) { free(data); return epuc("outofmem", "Out of memory"); } for (j=0; j < (int) y; ++j) { unsigned char *src = data + j * x * img_n ; unsigned char *dest = good + j * x * req_comp; #define COMBO(a,b) ((a)*8+(b)) #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) // convert source image with img_n components to one with req_comp components; // avoid switch per pixel, so use switch per scanline and massive macros switch (COMBO(img_n, req_comp)) { CASE(1,2) dest[0]=src[0], dest[1]=255; break; CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; CASE(2,1) dest[0]=src[0]; break; CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break; CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break; CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break; CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; default: assert(0); } #undef CASE } free(data); return good; } #ifndef STBI_NO_HDR static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp) { int i,k,n; float *output = (float *) malloc(x * y * comp * sizeof(float)); if (output == NULL) { free(data); return epf("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; for (i=0; i < x*y; ++i) { for (k=0; k < n; ++k) { output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale; } if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; } free(data); return output; } #define float2int(x) ((int) (x)) static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp) { int i,k,n; stbi_uc *output = (stbi_uc *) malloc(x * y * comp); if (output == NULL) { free(data); return epuc("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; for (i=0; i < x*y; ++i) { for (k=0; k < n; ++k) { float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f; if (z < 0) z = 0; if (z > 255) z = 255; output[i*comp + k] = (uint8) float2int(z); } if (k < comp) { float z = data[i*comp+k] * 255 + 0.5f; if (z < 0) z = 0; if (z > 255) z = 255; output[i*comp + k] = (uint8) float2int(z); } } free(data); return output; } #endif ////////////////////////////////////////////////////////////////////////////// // // "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) // // simple implementation // - channel subsampling of at most 2 in each dimension // - doesn't support delayed output of y-dimension // - simple interface (only one output format: 8-bit interleaved RGB) // - doesn't try to recover corrupt jpegs // - doesn't allow partial loading, loading multiple at once // - still fast on x86 (copying globals into locals doesn't help x86) // - allocates lots of intermediate memory (full size of all components) // - non-interleaved case requires this anyway // - allows good upsampling (see next) // high-quality // - upsampled channels are bilinearly interpolated, even across blocks // - quality integer IDCT derived from IJG's 'slow' // performance // - fast huffman; reasonable integer IDCT // - uses a lot of intermediate memory, could cache poorly // - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 // stb_jpeg: 1.34 seconds (MSVC6, default release build) // stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) // IJL11.dll: 1.08 seconds (compiled by intel) // IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) // IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) // huffman decoding acceleration #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache typedef struct { uint8 fast[1 << FAST_BITS]; // weirdly, repacking this into AoS is a 10% speed loss, instead of a win uint16 code[256]; uint8 values[256]; uint8 size[257]; unsigned int maxcode[18]; int delta[17]; // old 'firstsymbol' - old 'firstcode' } huffman; typedef struct { #ifdef STBI_SIMD unsigned short dequant2[4][64]; #endif stbi *s; huffman huff_dc[4]; huffman huff_ac[4]; uint8 dequant[4][64]; // sizes for components, interleaved MCUs int img_h_max, img_v_max; int img_mcu_x, img_mcu_y; int img_mcu_w, img_mcu_h; // definition of jpeg image component struct { int id; int h,v; int tq; int hd,ha; int dc_pred; int x,y,w2,h2; uint8 *data; void *raw_data; uint8 *linebuf; } img_comp[4]; uint32 code_buffer; // jpeg entropy-coded buffer int code_bits; // number of valid bits unsigned char marker; // marker seen while filling entropy buffer int nomore; // flag if we saw a marker so must stop int scan_n, order[4]; int restart_interval, todo; } jpeg; static int build_huffman(huffman *h, int *count) { int i,j,k=0,code; // build size list for each symbol (from JPEG spec) for (i=0; i < 16; ++i) for (j=0; j < count[i]; ++j) h->size[k++] = (uint8) (i+1); h->size[k] = 0; // compute actual symbols (from jpeg spec) code = 0; k = 0; for(j=1; j <= 16; ++j) { // compute delta to add to code to compute symbol id h->delta[j] = k - code; if (h->size[k] == j) { while (h->size[k] == j) h->code[k++] = (uint16) (code++); if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG"); } // compute largest code + 1 for this size, preshifted as needed later h->maxcode[j] = code << (16-j); code <<= 1; } h->maxcode[j] = 0xffffffff; // build non-spec acceleration table; 255 is flag for not-accelerated memset(h->fast, 255, 1 << FAST_BITS); for (i=0; i < k; ++i) { int s = h->size[i]; if (s <= FAST_BITS) { int c = h->code[i] << (FAST_BITS-s); int m = 1 << (FAST_BITS-s); for (j=0; j < m; ++j) { h->fast[c+j] = (uint8) i; } } } return 1; } static void grow_buffer_unsafe(jpeg *j) { do { int b = j->nomore ? 0 : get8(j->s); if (b == 0xff) { int c = get8(j->s); if (c != 0) { j->marker = (unsigned char) c; j->nomore = 1; return; } } j->code_buffer |= b << (24 - j->code_bits); j->code_bits += 8; } while (j->code_bits <= 24); } // (1 << n) - 1 static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; // decode a jpeg huffman value from the bitstream stbi_inline static int decode(jpeg *j, huffman *h) { unsigned int temp; int c,k; if (j->code_bits < 16) grow_buffer_unsafe(j); // look at the top FAST_BITS and determine what symbol ID it is, // if the code is <= FAST_BITS c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); k = h->fast[c]; if (k < 255) { int s = h->size[k]; if (s > j->code_bits) return -1; j->code_buffer <<= s; j->code_bits -= s; return h->values[k]; } // naive test is to shift the code_buffer down so k bits are // valid, then test against maxcode. To speed this up, we've // preshifted maxcode left so that it has (16-k) 0s at the // end; in other words, regardless of the number of bits, it // wants to be compared against something shifted to have 16; // that way we don't need to shift inside the loop. temp = j->code_buffer >> 16; for (k=FAST_BITS+1 ; ; ++k) if (temp < h->maxcode[k]) break; if (k == 17) { // error! code not found j->code_bits -= 16; return -1; } if (k > j->code_bits) return -1; // convert the huffman code to the symbol id c = ((j->code_buffer >> (32 - k)) & bmask[k]) + h->delta[k]; assert((((j->code_buffer) >> (32 - h->size[c])) & bmask[h->size[c]]) == h->code[c]); // convert the id to a symbol j->code_bits -= k; j->code_buffer <<= k; return h->values[c]; } // combined JPEG 'receive' and JPEG 'extend', since baseline // always extends everything it receives. stbi_inline static int extend_receive(jpeg *j, int n) { unsigned int m = 1 << (n-1); unsigned int k; if (j->code_bits < n) grow_buffer_unsafe(j); #if 1 k = stbi_lrot(j->code_buffer, n); j->code_buffer = k & ~bmask[n]; k &= bmask[n]; j->code_bits -= n; #else k = (j->code_buffer >> (32 - n)) & bmask[n]; j->code_bits -= n; j->code_buffer <<= n; #endif // the following test is probably a random branch that won't // predict well. I tried to table accelerate it but failed. // maybe it's compiling as a conditional move? if (k < m) return (-1 << n) + k + 1; else return k; } // given a value that's at position X in the zigzag stream, // where does it appear in the 8x8 matrix coded as row-major? static uint8 dezigzag[64+15] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, // let corrupt input sample past end 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }; // decode one 64-entry block-- static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b) { int diff,dc,k; int t = decode(j, hdc); if (t < 0) return e("bad huffman code","Corrupt JPEG"); // 0 all the ac values now so we can do it 32-bits at a time memset(data,0,64*sizeof(data[0])); diff = t ? extend_receive(j, t) : 0; dc = j->img_comp[b].dc_pred + diff; j->img_comp[b].dc_pred = dc; data[0] = (short) dc; // decode AC components, see JPEG spec k = 1; do { int r,s; int rs = decode(j, hac); if (rs < 0) return e("bad huffman code","Corrupt JPEG"); s = rs & 15; r = rs >> 4; if (s == 0) { if (rs != 0xf0) break; // end block k += 16; } else { k += r; // decode into unzigzag'd location data[dezigzag[k++]] = (short) extend_receive(j,s); } } while (k < 64); return 1; } // take a -128..127 value and clamp it and convert to 0..255 stbi_inline static uint8 clamp(int x) { // trick to use a single test to catch both cases if ((unsigned int) x > 255) { if (x < 0) return 0; if (x > 255) return 255; } return (uint8) x; } #define f2f(x) (int) (((x) * 4096 + 0.5)) #define fsh(x) ((x) << 12) // derived from jidctint -- DCT_ISLOW #define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ p2 = s2; \ p3 = s6; \ p1 = (p2+p3) * f2f(0.5411961f); \ t2 = p1 + p3*f2f(-1.847759065f); \ t3 = p1 + p2*f2f( 0.765366865f); \ p2 = s0; \ p3 = s4; \ t0 = fsh(p2+p3); \ t1 = fsh(p2-p3); \ x0 = t0+t3; \ x3 = t0-t3; \ x1 = t1+t2; \ x2 = t1-t2; \ t0 = s7; \ t1 = s5; \ t2 = s3; \ t3 = s1; \ p3 = t0+t2; \ p4 = t1+t3; \ p1 = t0+t3; \ p2 = t1+t2; \ p5 = (p3+p4)*f2f( 1.175875602f); \ t0 = t0*f2f( 0.298631336f); \ t1 = t1*f2f( 2.053119869f); \ t2 = t2*f2f( 3.072711026f); \ t3 = t3*f2f( 1.501321110f); \ p1 = p5 + p1*f2f(-0.899976223f); \ p2 = p5 + p2*f2f(-2.562915447f); \ p3 = p3*f2f(-1.961570560f); \ p4 = p4*f2f(-0.390180644f); \ t3 += p1+p4; \ t2 += p2+p3; \ t1 += p2+p4; \ t0 += p1+p3; #ifdef STBI_SIMD typedef unsigned short stbi_dequantize_t; #else typedef uint8 stbi_dequantize_t; #endif // .344 seconds on 3*anemones.jpg static void idct_block(uint8 *out, int out_stride, short data[64], stbi_dequantize_t *dequantize) { int i,val[64],*v=val; stbi_dequantize_t *dq = dequantize; uint8 *o; short *d = data; // columns for (i=0; i < 8; ++i,++d,++dq, ++v) { // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 && d[40]==0 && d[48]==0 && d[56]==0) { // no shortcut 0 seconds // (1|2|3|4|5|6|7)==0 0 seconds // all separate -0.047 seconds // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds int dcterm = d[0] * dq[0] << 2; v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; } else { IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) // constants scaled things up by 1<<12; let's bring them back // down, but keep 2 extra bits of precision x0 += 512; x1 += 512; x2 += 512; x3 += 512; v[ 0] = (x0+t3) >> 10; v[56] = (x0-t3) >> 10; v[ 8] = (x1+t2) >> 10; v[48] = (x1-t2) >> 10; v[16] = (x2+t1) >> 10; v[40] = (x2-t1) >> 10; v[24] = (x3+t0) >> 10; v[32] = (x3-t0) >> 10; } } for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { // no fast case since the first 1D IDCT spread components out IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) // constants scaled things up by 1<<12, plus we had 1<<2 from first // loop, plus horizontal and vertical each scale by sqrt(8) so together // we've got an extra 1<<3, so 1<<17 total we need to remove. // so we want to round that, which means adding 0.5 * 1<<17, // aka 65536. Also, we'll end up with -128 to 127 that we want // to encode as 0..255 by adding 128, so we'll add that before the shift x0 += 65536 + (128<<17); x1 += 65536 + (128<<17); x2 += 65536 + (128<<17); x3 += 65536 + (128<<17); // tried computing the shifts into temps, or'ing the temps to see // if any were out of range, but that was slower o[0] = clamp((x0+t3) >> 17); o[7] = clamp((x0-t3) >> 17); o[1] = clamp((x1+t2) >> 17); o[6] = clamp((x1-t2) >> 17); o[2] = clamp((x2+t1) >> 17); o[5] = clamp((x2-t1) >> 17); o[3] = clamp((x3+t0) >> 17); o[4] = clamp((x3-t0) >> 17); } } #ifdef STBI_SIMD static stbi_idct_8x8 stbi_idct_installed = idct_block; void stbi_install_idct(stbi_idct_8x8 func) { stbi_idct_installed = func; } #endif #define MARKER_none 0xff // if there's a pending marker from the entropy stream, return that // otherwise, fetch from the stream and get a marker. if there's no // marker, return 0xff, which is never a valid marker value static uint8 get_marker(jpeg *j) { uint8 x; if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; } x = get8u(j->s); if (x != 0xff) return MARKER_none; while (x == 0xff) x = get8u(j->s); return x; } // in each scan, we'll have scan_n components, and the order // of the components is specified by order[] #define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) // after a restart interval, reset the entropy decoder and // the dc prediction static void reset(jpeg *j) { j->code_bits = 0; j->code_buffer = 0; j->nomore = 0; j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; j->marker = MARKER_none; j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, // since we don't even allow 1<<30 pixels } static int parse_entropy_coded_data(jpeg *z) { reset(z); if (z->scan_n == 1) { int i,j; #ifdef STBI_SIMD __declspec(align(16)) #endif short data[64]; int n = z->order[0]; // non-interleaved data, we just need to process one block at a time, // in trivial scanline order // number of blocks to do just depends on how many actual "pixels" this // component has, independent of interleaved MCU blocking and such int w = (z->img_comp[n].x+7) >> 3; int h = (z->img_comp[n].y+7) >> 3; for (j=0; j < h; ++j) { for (i=0; i < w; ++i) { if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; #ifdef STBI_SIMD stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); #else idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); #endif // every data block is an MCU, so countdown the restart interval if (--z->todo <= 0) { if (z->code_bits < 24) grow_buffer_unsafe(z); // if it's NOT a restart, then just bail, so we get corrupt data // rather than no data if (!RESTART(z->marker)) return 1; reset(z); } } } } else { // interleaved! int i,j,k,x,y; short data[64]; for (j=0; j < z->img_mcu_y; ++j) { for (i=0; i < z->img_mcu_x; ++i) { // scan an interleaved mcu... process scan_n components in order for (k=0; k < z->scan_n; ++k) { int n = z->order[k]; // scan out an mcu's worth of this component; that's just determined // by the basic H and V specified for the component for (y=0; y < z->img_comp[n].v; ++y) { for (x=0; x < z->img_comp[n].h; ++x) { int x2 = (i*z->img_comp[n].h + x)*8; int y2 = (j*z->img_comp[n].v + y)*8; if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; #ifdef STBI_SIMD stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); #else idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); #endif } } } // after all interleaved components, that's an interleaved MCU, // so now count down the restart interval if (--z->todo <= 0) { if (z->code_bits < 24) grow_buffer_unsafe(z); // if it's NOT a restart, then just bail, so we get corrupt data // rather than no data if (!RESTART(z->marker)) return 1; reset(z); } } } } return 1; } static int process_marker(jpeg *z, int m) { int L; switch (m) { case MARKER_none: // no marker found return e("expected marker","Corrupt JPEG"); case 0xC2: // SOF - progressive return e("progressive jpeg","JPEG format not supported (progressive)"); case 0xDD: // DRI - specify restart interval if (get16(z->s) != 4) return e("bad DRI len","Corrupt JPEG"); z->restart_interval = get16(z->s); return 1; case 0xDB: // DQT - define quantization table L = get16(z->s)-2; while (L > 0) { int q = get8(z->s); int p = q >> 4; int t = q & 15,i; if (p != 0) return e("bad DQT type","Corrupt JPEG"); if (t > 3) return e("bad DQT table","Corrupt JPEG"); for (i=0; i < 64; ++i) z->dequant[t][dezigzag[i]] = get8u(z->s); #ifdef STBI_SIMD for (i=0; i < 64; ++i) z->dequant2[t][i] = z->dequant[t][i]; #endif L -= 65; } return L==0; case 0xC4: // DHT - define huffman table L = get16(z->s)-2; while (L > 0) { uint8 *v; int sizes[16],i,m=0; int q = get8(z->s); int tc = q >> 4; int th = q & 15; if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG"); for (i=0; i < 16; ++i) { sizes[i] = get8(z->s); m += sizes[i]; } L -= 17; if (tc == 0) { if (!build_huffman(z->huff_dc+th, sizes)) return 0; v = z->huff_dc[th].values; } else { if (!build_huffman(z->huff_ac+th, sizes)) return 0; v = z->huff_ac[th].values; } for (i=0; i < m; ++i) v[i] = get8u(z->s); L -= m; } return L==0; } // check for comment block or APP blocks if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { skip(z->s, get16(z->s)-2); return 1; } return 0; } // after we see SOS static int process_scan_header(jpeg *z) { int i; int Ls = get16(z->s); z->scan_n = get8(z->s); if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return e("bad SOS component count","Corrupt JPEG"); if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG"); for (i=0; i < z->scan_n; ++i) { int id = get8(z->s), which; int q = get8(z->s); for (which = 0; which < z->s->img_n; ++which) if (z->img_comp[which].id == id) break; if (which == z->s->img_n) return 0; z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG"); z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG"); z->order[i] = which; } if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG"); get8(z->s); // should be 63, but might be 0 if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG"); return 1; } static int process_frame_header(jpeg *z, int scan) { stbi *s = z->s; int Lf,p,i,q, h_max=1,v_max=1,c; Lf = get16(s); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG p = get8(s); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline s->img_y = get16(s); if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG s->img_x = get16(s); if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires c = get8(s); if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires s->img_n = c; for (i=0; i < c; ++i) { z->img_comp[i].data = NULL; z->img_comp[i].linebuf = NULL; } if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG"); for (i=0; i < s->img_n; ++i) { z->img_comp[i].id = get8(s); if (z->img_comp[i].id != i+1) // JFIF requires if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! return e("bad component ID","Corrupt JPEG"); q = get8(s); z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG"); z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG"); z->img_comp[i].tq = get8(s); if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG"); } if (scan != SCAN_load) return 1; if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); for (i=0; i < s->img_n; ++i) { if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; } // compute interleaved mcu info z->img_h_max = h_max; z->img_v_max = v_max; z->img_mcu_w = h_max * 8; z->img_mcu_h = v_max * 8; z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; for (i=0; i < s->img_n; ++i) { // number of effective pixels (e.g. for non-interleaved MCU) z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; // to simplify generation, we'll allocate enough memory to decode // the bogus oversized data from using interleaved MCUs and their // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't // discard the extra data until colorspace conversion z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); if (z->img_comp[i].raw_data == NULL) { for(--i; i >= 0; --i) { free(z->img_comp[i].raw_data); z->img_comp[i].data = NULL; } return e("outofmem", "Out of memory"); } // align blocks for installable-idct using mmx/sse z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); z->img_comp[i].linebuf = NULL; } return 1; } // use comparisons since in some cases we handle more than one case (e.g. SOF) #define DNL(x) ((x) == 0xdc) #define SOI(x) ((x) == 0xd8) #define EOI(x) ((x) == 0xd9) #define SOF(x) ((x) == 0xc0 || (x) == 0xc1) #define SOS(x) ((x) == 0xda) static int decode_jpeg_header(jpeg *z, int scan) { int m; z->marker = MARKER_none; // initialize cached marker to empty m = get_marker(z); if (!SOI(m)) return e("no SOI","Corrupt JPEG"); if (scan == SCAN_type) return 1; m = get_marker(z); while (!SOF(m)) { if (!process_marker(z,m)) return 0; m = get_marker(z); while (m == MARKER_none) { // some files have extra padding after their blocks, so ok, we'll scan if (at_eof(z->s)) return e("no SOF", "Corrupt JPEG"); m = get_marker(z); } } if (!process_frame_header(z, scan)) return 0; return 1; } static int decode_jpeg_image(jpeg *j) { int m; j->restart_interval = 0; if (!decode_jpeg_header(j, SCAN_load)) return 0; m = get_marker(j); while (!EOI(m)) { if (SOS(m)) { if (!process_scan_header(j)) return 0; if (!parse_entropy_coded_data(j)) return 0; if (j->marker == MARKER_none ) { // handle 0s at the end of image data from IP Kamera 9060 while (!at_eof(j->s)) { int x = get8(j->s); if (x == 255) { j->marker = get8u(j->s); break; } else if (x != 0) { return 0; } } // if we reach eof without hitting a marker, get_marker() below will fail and we'll eventually return 0 } } else { if (!process_marker(j, m)) return 0; } m = get_marker(j); } return 1; } // static jfif-centered resampling (across block boundaries) typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1, int w, int hs); #define div4(x) ((uint8) ((x) >> 2)) static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { STBI_NOTUSED(out); STBI_NOTUSED(in_far); STBI_NOTUSED(w); STBI_NOTUSED(hs); return in_near; } static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { // need to generate two samples vertically for every one in input int i; STBI_NOTUSED(hs); for (i=0; i < w; ++i) out[i] = div4(3*in_near[i] + in_far[i] + 2); return out; } static uint8* resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { // need to generate two samples horizontally for every one in input int i; uint8 *input = in_near; if (w == 1) { // if only one sample, can't do any interpolation out[0] = out[1] = input[0]; return out; } out[0] = input[0]; out[1] = div4(input[0]*3 + input[1] + 2); for (i=1; i < w-1; ++i) { int n = 3*input[i]+2; out[i*2+0] = div4(n+input[i-1]); out[i*2+1] = div4(n+input[i+1]); } out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2); out[i*2+1] = input[w-1]; STBI_NOTUSED(in_far); STBI_NOTUSED(hs); return out; } #define div16(x) ((uint8) ((x) >> 4)) static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { // need to generate 2x2 samples for every one in input int i,t0,t1; if (w == 1) { out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2); return out; } t1 = 3*in_near[0] + in_far[0]; out[0] = div4(t1+2); for (i=1; i < w; ++i) { t0 = t1; t1 = 3*in_near[i]+in_far[i]; out[i*2-1] = div16(3*t0 + t1 + 8); out[i*2 ] = div16(3*t1 + t0 + 8); } out[w*2-1] = div4(t1+2); STBI_NOTUSED(hs); return out; } static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { // resample with nearest-neighbor int i,j; in_far = in_far; for (i=0; i < w; ++i) for (j=0; j < hs; ++j) out[i*hs+j] = in_near[i]; return out; } #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) // 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) // VC6 without processor=Pro is generating multiple LEAs per multiply! static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step) { int i; for (i=0; i < count; ++i) { int y_fixed = (y[i] << 16) + 32768; // rounding int r,g,b; int cr = pcr[i] - 128; int cb = pcb[i] - 128; r = y_fixed + cr*float2fixed(1.40200f); g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); b = y_fixed + cb*float2fixed(1.77200f); r >>= 16; g >>= 16; b >>= 16; if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } out[0] = (uint8)r; out[1] = (uint8)g; out[2] = (uint8)b; out[3] = 255; out += step; } } #ifdef STBI_SIMD static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row; void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) { stbi_YCbCr_installed = func; } #endif // clean up the temporary component buffers static void cleanup_jpeg(jpeg *j) { int i; for (i=0; i < j->s->img_n; ++i) { if (j->img_comp[i].data) { free(j->img_comp[i].raw_data); j->img_comp[i].data = NULL; } if (j->img_comp[i].linebuf) { free(j->img_comp[i].linebuf); j->img_comp[i].linebuf = NULL; } } } typedef struct { resample_row_func resample; uint8 *line0,*line1; int hs,vs; // expansion factor in each axis int w_lores; // horizontal pixels pre-expansion int ystep; // how far through vertical expansion we are int ypos; // which pre-expansion row we're on } stbi_resample; static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) { int n, decode_n; // validate req_comp if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); z->s->img_n = 0; // load a jpeg image from whichever source if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; } // determine actual number of components to generate n = req_comp ? req_comp : z->s->img_n; if (z->s->img_n == 3 && n < 3) decode_n = 1; else decode_n = z->s->img_n; // resample and color-convert { int k; uint i,j; uint8 *output; uint8 *coutput[4]; stbi_resample res_comp[4]; for (k=0; k < decode_n; ++k) { stbi_resample *r = &res_comp[k]; // allocate line buffer big enough for upsampling off the edges // with upsample factor of 4 z->img_comp[k].linebuf = (uint8 *) malloc(z->s->img_x + 3); if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } r->hs = z->img_h_max / z->img_comp[k].h; r->vs = z->img_v_max / z->img_comp[k].v; r->ystep = r->vs >> 1; r->w_lores = (z->s->img_x + r->hs-1) / r->hs; r->ypos = 0; r->line0 = r->line1 = z->img_comp[k].data; if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2; else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2; else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2; else r->resample = resample_row_generic; } // can't error after this so, this is safe output = (uint8 *) malloc(n * z->s->img_x * z->s->img_y + 1); if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } // now go ahead and resample for (j=0; j < z->s->img_y; ++j) { uint8 *out = output + n * z->s->img_x * j; for (k=0; k < decode_n; ++k) { stbi_resample *r = &res_comp[k]; int y_bot = r->ystep >= (r->vs >> 1); coutput[k] = r->resample(z->img_comp[k].linebuf, y_bot ? r->line1 : r->line0, y_bot ? r->line0 : r->line1, r->w_lores, r->hs); if (++r->ystep >= r->vs) { r->ystep = 0; r->line0 = r->line1; if (++r->ypos < z->img_comp[k].y) r->line1 += z->img_comp[k].w2; } } if (n >= 3) { uint8 *y = coutput[0]; if (z->s->img_n == 3) { #ifdef STBI_SIMD stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n); #else YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n); #endif } else for (i=0; i < z->s->img_x; ++i) { out[0] = out[1] = out[2] = y[i]; out[3] = 255; // not used if n==3 out += n; } } else { uint8 *y = coutput[0]; if (n == 1) for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; else for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; } } cleanup_jpeg(z); *out_x = z->s->img_x; *out_y = z->s->img_y; if (comp) *comp = z->s->img_n; // report original components, not output return output; } } static unsigned char *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp) { jpeg j; j.s = s; return load_jpeg_image(&j, x,y,comp,req_comp); } static int stbi_jpeg_test(stbi *s) { int r; jpeg j; j.s = s; r = decode_jpeg_header(&j, SCAN_type); stbi_rewind(s); return r; } static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp) { if (!decode_jpeg_header(j, SCAN_header)) { stbi_rewind( j->s ); return 0; } if (x) *x = j->s->img_x; if (y) *y = j->s->img_y; if (comp) *comp = j->s->img_n; return 1; } static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp) { jpeg j; j.s = s; return stbi_jpeg_info_raw(&j, x, y, comp); } // public domain zlib decode v0.2 Sean Barrett 2006-11-18 // simple implementation // - all input must be provided in an upfront buffer // - all output is written to a single output buffer (can malloc/realloc) // performance // - fast huffman // fast-way is faster to check than jpeg huffman, but slow way is slower #define ZFAST_BITS 9 // accelerate all cases in default tables #define ZFAST_MASK ((1 << ZFAST_BITS) - 1) // zlib-style huffman encoding // (jpegs packs from left, zlib from right, so can't share code) typedef struct { uint16 fast[1 << ZFAST_BITS]; uint16 firstcode[16]; int maxcode[17]; uint16 firstsymbol[16]; uint8 size[288]; uint16 value[288]; } zhuffman; stbi_inline static int bitreverse16(int n) { n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); return n; } stbi_inline static int bit_reverse(int v, int bits) { assert(bits <= 16); // to bit reverse n bits, reverse 16 and shift // e.g. 11 bits, bit reverse and shift away 5 return bitreverse16(v) >> (16-bits); } static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num) { int i,k=0; int code, next_code[16], sizes[17]; // DEFLATE spec for generating codes memset(sizes, 0, sizeof(sizes)); memset(z->fast, 255, sizeof(z->fast)); for (i=0; i < num; ++i) ++sizes[sizelist[i]]; sizes[0] = 0; for (i=1; i < 16; ++i) assert(sizes[i] <= (1 << i)); code = 0; for (i=1; i < 16; ++i) { next_code[i] = code; z->firstcode[i] = (uint16) code; z->firstsymbol[i] = (uint16) k; code = (code + sizes[i]); if (sizes[i]) if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG"); z->maxcode[i] = code << (16-i); // preshift for inner loop code <<= 1; k += sizes[i]; } z->maxcode[16] = 0x10000; // sentinel for (i=0; i < num; ++i) { int s = sizelist[i]; if (s) { int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; z->size[c] = (uint8)s; z->value[c] = (uint16)i; if (s <= ZFAST_BITS) { int k = bit_reverse(next_code[s],s); while (k < (1 << ZFAST_BITS)) { z->fast[k] = (uint16) c; k += (1 << s); } } ++next_code[s]; } } return 1; } // zlib-from-memory implementation for PNG reading // because PNG allows splitting the zlib stream arbitrarily, // and it's annoying structurally to have PNG call ZLIB call PNG, // we require PNG read all the IDATs and combine them into a single // memory buffer typedef struct { uint8 *zbuffer, *zbuffer_end; int num_bits; uint32 code_buffer; char *zout; char *zout_start; char *zout_end; int z_expandable; zhuffman z_length, z_distance; } zbuf; stbi_inline static int zget8(zbuf *z) { if (z->zbuffer >= z->zbuffer_end) return 0; return *z->zbuffer++; } static void fill_bits(zbuf *z) { do { assert(z->code_buffer < (1U << z->num_bits)); z->code_buffer |= zget8(z) << z->num_bits; z->num_bits += 8; } while (z->num_bits <= 24); } stbi_inline static unsigned int zreceive(zbuf *z, int n) { unsigned int k; if (z->num_bits < n) fill_bits(z); k = z->code_buffer & ((1 << n) - 1); z->code_buffer >>= n; z->num_bits -= n; return k; } stbi_inline static int zhuffman_decode(zbuf *a, zhuffman *z) { int b,s,k; if (a->num_bits < 16) fill_bits(a); b = z->fast[a->code_buffer & ZFAST_MASK]; if (b < 0xffff) { s = z->size[b]; a->code_buffer >>= s; a->num_bits -= s; return z->value[b]; } // not resolved by fast table, so compute it the slow way // use jpeg approach, which requires MSbits at top k = bit_reverse(a->code_buffer, 16); for (s=ZFAST_BITS+1; ; ++s) if (k < z->maxcode[s]) break; if (s == 16) return -1; // invalid code! // code size is s, so: b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; assert(z->size[b] == s); a->code_buffer >>= s; a->num_bits -= s; return z->value[b]; } static int expand(zbuf *z, int n) // need to make room for n bytes { char *q; int cur, limit; if (!z->z_expandable) return e("output buffer limit","Corrupt PNG"); cur = (int) (z->zout - z->zout_start); limit = (int) (z->zout_end - z->zout_start); while (cur + n > limit) limit *= 2; q = (char *) realloc(z->zout_start, limit); if (q == NULL) return e("outofmem", "Out of memory"); z->zout_start = q; z->zout = q + cur; z->zout_end = q + limit; return 1; } static int length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; static int length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; static int dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; static int parse_huffman_block(zbuf *a) { for(;;) { int z = zhuffman_decode(a, &a->z_length); if (z < 256) { if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0; *a->zout++ = (char) z; } else { uint8 *p; int len,dist; if (z == 256) return 1; z -= 257; len = length_base[z]; if (length_extra[z]) len += zreceive(a, length_extra[z]); z = zhuffman_decode(a, &a->z_distance); if (z < 0) return e("bad huffman code","Corrupt PNG"); dist = dist_base[z]; if (dist_extra[z]) dist += zreceive(a, dist_extra[z]); if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG"); if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0; p = (uint8 *) (a->zout - dist); while (len--) *a->zout++ = *p++; } } } static int compute_huffman_codes(zbuf *a) { static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; zhuffman z_codelength; uint8 lencodes[286+32+137];//padding for maximum single op uint8 codelength_sizes[19]; int i,n; int hlit = zreceive(a,5) + 257; int hdist = zreceive(a,5) + 1; int hclen = zreceive(a,4) + 4; memset(codelength_sizes, 0, sizeof(codelength_sizes)); for (i=0; i < hclen; ++i) { int s = zreceive(a,3); codelength_sizes[length_dezigzag[i]] = (uint8) s; } if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; n = 0; while (n < hlit + hdist) { int c = zhuffman_decode(a, &z_codelength); assert(c >= 0 && c < 19); if (c < 16) lencodes[n++] = (uint8) c; else if (c == 16) { c = zreceive(a,2)+3; memset(lencodes+n, lencodes[n-1], c); n += c; } else if (c == 17) { c = zreceive(a,3)+3; memset(lencodes+n, 0, c); n += c; } else { assert(c == 18); c = zreceive(a,7)+11; memset(lencodes+n, 0, c); n += c; } } if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG"); if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; return 1; } static int parse_uncompressed_block(zbuf *a) { uint8 header[4]; int len,nlen,k; if (a->num_bits & 7) zreceive(a, a->num_bits & 7); // discard // drain the bit-packed data into header k = 0; while (a->num_bits > 0) { header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns? a->code_buffer >>= 8; a->num_bits -= 8; } assert(a->num_bits == 0); // now fill header the normal way while (k < 4) header[k++] = (uint8) zget8(a); len = header[1] * 256 + header[0]; nlen = header[3] * 256 + header[2]; if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG"); if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG"); if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0; memcpy(a->zout, a->zbuffer, len); a->zbuffer += len; a->zout += len; return 1; } static int parse_zlib_header(zbuf *a) { int cmf = zget8(a); int cm = cmf & 15; /* int cinfo = cmf >> 4; */ int flg = zget8(a); if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png // window = 1 << (8 + cinfo)... but who cares, we fully buffer output return 1; } // @TODO: should statically initialize these for optimal thread safety static uint8 default_length[288], default_distance[32]; static void init_defaults(void) { int i; // use <= to match clearly with spec for (i=0; i <= 143; ++i) default_length[i] = 8; for ( ; i <= 255; ++i) default_length[i] = 9; for ( ; i <= 279; ++i) default_length[i] = 7; for ( ; i <= 287; ++i) default_length[i] = 8; for (i=0; i <= 31; ++i) default_distance[i] = 5; } int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead static int parse_zlib(zbuf *a, int parse_header) { int final, type; if (parse_header) if (!parse_zlib_header(a)) return 0; a->num_bits = 0; a->code_buffer = 0; do { final = zreceive(a,1); type = zreceive(a,2); if (type == 0) { if (!parse_uncompressed_block(a)) return 0; } else if (type == 3) { return 0; } else { if (type == 1) { // use fixed code lengths if (!default_distance[31]) init_defaults(); if (!zbuild_huffman(&a->z_length , default_length , 288)) return 0; if (!zbuild_huffman(&a->z_distance, default_distance, 32)) return 0; } else { if (!compute_huffman_codes(a)) return 0; } if (!parse_huffman_block(a)) return 0; } if (stbi_png_partial && a->zout - a->zout_start > 65536) break; } while (!final); return 1; } static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header) { a->zout_start = obuf; a->zout = obuf; a->zout_end = obuf + olen; a->z_expandable = exp; return parse_zlib(a, parse_header); } char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) { zbuf a; char *p = (char *) malloc(initial_size); if (p == NULL) return NULL; a.zbuffer = (uint8 *) buffer; a.zbuffer_end = (uint8 *) buffer + len; if (do_zlib(&a, p, initial_size, 1, 1)) { if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { free(a.zout_start); return NULL; } } char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) { return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); } char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) { zbuf a; char *p = (char *) malloc(initial_size); if (p == NULL) return NULL; a.zbuffer = (uint8 *) buffer; a.zbuffer_end = (uint8 *) buffer + len; if (do_zlib(&a, p, initial_size, 1, parse_header)) { if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { free(a.zout_start); return NULL; } } int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) { zbuf a; a.zbuffer = (uint8 *) ibuffer; a.zbuffer_end = (uint8 *) ibuffer + ilen; if (do_zlib(&a, obuffer, olen, 0, 1)) return (int) (a.zout - a.zout_start); else return -1; } char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) { zbuf a; char *p = (char *) malloc(16384); if (p == NULL) return NULL; a.zbuffer = (uint8 *) buffer; a.zbuffer_end = (uint8 *) buffer+len; if (do_zlib(&a, p, 16384, 1, 0)) { if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { free(a.zout_start); return NULL; } } int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) { zbuf a; a.zbuffer = (uint8 *) ibuffer; a.zbuffer_end = (uint8 *) ibuffer + ilen; if (do_zlib(&a, obuffer, olen, 0, 0)) return (int) (a.zout - a.zout_start); else return -1; } // public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 // simple implementation // - only 8-bit samples // - no CRC checking // - allocates lots of intermediate memory // - avoids problem of streaming data between subsystems // - avoids explicit window management // performance // - uses stb_zlib, a PD zlib implementation with fast huffman decoding typedef struct { uint32 length; uint32 type; } chunk; #define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) static chunk get_chunk_header(stbi *s) { chunk c; c.length = get32(s); c.type = get32(s); return c; } static int check_png_header(stbi *s) { static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 }; int i; for (i=0; i < 8; ++i) if (get8u(s) != png_sig[i]) return e("bad png sig","Not a PNG"); return 1; } typedef struct { stbi *s; uint8 *idata, *expanded, *out; } png; enum { F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4, F_avg_first, F_paeth_first }; static uint8 first_row_filter[5] = { F_none, F_sub, F_none, F_avg_first, F_paeth_first }; static int paeth(int a, int b, int c) { int p = a + b - c; int pa = abs(p-a); int pb = abs(p-b); int pc = abs(p-c); if (pa <= pb && pa <= pc) return a; if (pb <= pc) return b; return c; } // create the png data from post-deflated data static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y) { stbi *s = a->s; uint32 i,j,stride = x*out_n; int k; int img_n = s->img_n; // copy it into a local for later assert(out_n == s->img_n || out_n == s->img_n+1); if (stbi_png_partial) y = 1; a->out = (uint8 *) malloc(x * y * out_n); if (!a->out) return e("outofmem", "Out of memory"); if (!stbi_png_partial) { if (s->img_x == x && s->img_y == y) { if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); } else { // interlaced: if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); } } for (j=0; j < y; ++j) { uint8 *cur = a->out + stride*j; uint8 *prior = cur - stride; int filter = *raw++; if (filter > 4) return e("invalid filter","Corrupt PNG"); // if first row, use special filter that doesn't sample previous row if (j == 0) filter = first_row_filter[filter]; // handle first pixel explicitly for (k=0; k < img_n; ++k) { switch (filter) { case F_none : cur[k] = raw[k]; break; case F_sub : cur[k] = raw[k]; break; case F_up : cur[k] = raw[k] + prior[k]; break; case F_avg : cur[k] = raw[k] + (prior[k]>>1); break; case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break; case F_avg_first : cur[k] = raw[k]; break; case F_paeth_first: cur[k] = raw[k]; break; } } if (img_n != out_n) cur[img_n] = 255; raw += img_n; cur += out_n; prior += out_n; // this is a little gross, so that we don't switch per-pixel or per-component if (img_n == out_n) { #define CASE(f) \ case f: \ for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ for (k=0; k < img_n; ++k) switch (filter) { CASE(F_none) cur[k] = raw[k]; break; CASE(F_sub) cur[k] = raw[k] + cur[k-img_n]; break; CASE(F_up) cur[k] = raw[k] + prior[k]; break; CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break; CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1); break; CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break; } #undef CASE } else { assert(img_n+1 == out_n); #define CASE(f) \ case f: \ for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ for (k=0; k < img_n; ++k) switch (filter) { CASE(F_none) cur[k] = raw[k]; break; CASE(F_sub) cur[k] = raw[k] + cur[k-out_n]; break; CASE(F_up) cur[k] = raw[k] + prior[k]; break; CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break; CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1); break; CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break; } #undef CASE } } return 1; } static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced) { uint8 *final; int p; int save; if (!interlaced) return create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y); save = stbi_png_partial; stbi_png_partial = 0; // de-interlacing final = (uint8 *) malloc(a->s->img_x * a->s->img_y * out_n); for (p=0; p < 7; ++p) { int xorig[] = { 0,4,0,2,0,1,0 }; int yorig[] = { 0,0,4,0,2,0,1 }; int xspc[] = { 8,8,4,4,2,2,1 }; int yspc[] = { 8,8,8,4,4,2,2 }; int i,j,x,y; // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; if (x && y) { if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) { free(final); return 0; } for (j=0; j < y; ++j) for (i=0; i < x; ++i) memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, a->out + (j*x+i)*out_n, out_n); free(a->out); raw += (x*out_n+1)*y; raw_len -= (x*out_n+1)*y; } } a->out = final; stbi_png_partial = save; return 1; } static int compute_transparency(png *z, uint8 tc[3], int out_n) { stbi *s = z->s; uint32 i, pixel_count = s->img_x * s->img_y; uint8 *p = z->out; // compute color-based transparency, assuming we've // already got 255 as the alpha value in the output assert(out_n == 2 || out_n == 4); if (out_n == 2) { for (i=0; i < pixel_count; ++i) { p[1] = (p[0] == tc[0] ? 0 : 255); p += 2; } } else { for (i=0; i < pixel_count; ++i) { if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) p[3] = 0; p += 4; } } return 1; } static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n) { uint32 i, pixel_count = a->s->img_x * a->s->img_y; uint8 *p, *temp_out, *orig = a->out; p = (uint8 *) malloc(pixel_count * pal_img_n); if (p == NULL) return e("outofmem", "Out of memory"); // between here and free(out) below, exitting would leak temp_out = p; if (pal_img_n == 3) { for (i=0; i < pixel_count; ++i) { int n = orig[i]*4; p[0] = palette[n ]; p[1] = palette[n+1]; p[2] = palette[n+2]; p += 3; } } else { for (i=0; i < pixel_count; ++i) { int n = orig[i]*4; p[0] = palette[n ]; p[1] = palette[n+1]; p[2] = palette[n+2]; p[3] = palette[n+3]; p += 4; } } free(a->out); a->out = temp_out; STBI_NOTUSED(len); return 1; } static int stbi_unpremultiply_on_load = 0; static int stbi_de_iphone_flag = 0; void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) { stbi_unpremultiply_on_load = flag_true_if_should_unpremultiply; } void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) { stbi_de_iphone_flag = flag_true_if_should_convert; } static void stbi_de_iphone(png *z) { stbi *s = z->s; uint32 i, pixel_count = s->img_x * s->img_y; uint8 *p = z->out; if (s->img_out_n == 3) { // convert bgr to rgb for (i=0; i < pixel_count; ++i) { uint8 t = p[0]; p[0] = p[2]; p[2] = t; p += 3; } } else { assert(s->img_out_n == 4); if (stbi_unpremultiply_on_load) { // convert bgr to rgb and unpremultiply for (i=0; i < pixel_count; ++i) { uint8 a = p[3]; uint8 t = p[0]; if (a) { p[0] = p[2] * 255 / a; p[1] = p[1] * 255 / a; p[2] = t * 255 / a; } else { p[0] = p[2]; p[2] = t; } p += 4; } } else { // convert bgr to rgb for (i=0; i < pixel_count; ++i) { uint8 t = p[0]; p[0] = p[2]; p[2] = t; p += 4; } } } } static int parse_png_file(png *z, int scan, int req_comp) { uint8 palette[1024], pal_img_n=0; uint8 has_trans=0, tc[3]; uint32 ioff=0, idata_limit=0, i, pal_len=0; int first=1,k,interlace=0, iphone=0; stbi *s = z->s; z->expanded = NULL; z->idata = NULL; z->out = NULL; if (!check_png_header(s)) return 0; if (scan == SCAN_type) return 1; for (;;) { chunk c = get_chunk_header(s); switch (c.type) { case PNG_TYPE('C','g','B','I'): iphone = stbi_de_iphone_flag; skip(s, c.length); break; case PNG_TYPE('I','H','D','R'): { int depth,color,comp,filter; if (!first) return e("multiple IHDR","Corrupt PNG"); first = 0; if (c.length != 13) return e("bad IHDR len","Corrupt PNG"); s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)"); s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)"); depth = get8(s); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only"); color = get8(s); if (color > 6) return e("bad ctype","Corrupt PNG"); if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG"); comp = get8(s); if (comp) return e("bad comp method","Corrupt PNG"); filter= get8(s); if (filter) return e("bad filter method","Corrupt PNG"); interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG"); if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG"); if (!pal_img_n) { s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); if (scan == SCAN_header) return 1; } else { // if paletted, then pal_n is our final components, and // img_n is # components to decompress/filter. s->img_n = 1; if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG"); // if SCAN_header, have to scan to see if we have a tRNS } break; } case PNG_TYPE('P','L','T','E'): { if (first) return e("first not IHDR", "Corrupt PNG"); if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG"); pal_len = c.length / 3; if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG"); for (i=0; i < pal_len; ++i) { palette[i*4+0] = get8u(s); palette[i*4+1] = get8u(s); palette[i*4+2] = get8u(s); palette[i*4+3] = 255; } break; } case PNG_TYPE('t','R','N','S'): { if (first) return e("first not IHDR", "Corrupt PNG"); if (z->idata) return e("tRNS after IDAT","Corrupt PNG"); if (pal_img_n) { if (scan == SCAN_header) { s->img_n = 4; return 1; } if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG"); if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG"); pal_img_n = 4; for (i=0; i < c.length; ++i) palette[i*4+3] = get8u(s); } else { if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG"); if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG"); has_trans = 1; for (k=0; k < s->img_n; ++k) tc[k] = (uint8) get16(s); // non 8-bit images will be larger } break; } case PNG_TYPE('I','D','A','T'): { if (first) return e("first not IHDR", "Corrupt PNG"); if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG"); if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } if (ioff + c.length > idata_limit) { uint8 *p; if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; while (ioff + c.length > idata_limit) idata_limit *= 2; p = (uint8 *) realloc(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory"); z->idata = p; } if (!getn(s, z->idata+ioff,c.length)) return e("outofdata","Corrupt PNG"); ioff += c.length; break; } case PNG_TYPE('I','E','N','D'): { uint32 raw_len; if (first) return e("first not IHDR", "Corrupt PNG"); if (scan != SCAN_load) return 1; if (z->idata == NULL) return e("no IDAT","Corrupt PNG"); z->expanded = (uint8 *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !iphone); if (z->expanded == NULL) return 0; // zlib should set error free(z->idata); z->idata = NULL; if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) s->img_out_n = s->img_n+1; else s->img_out_n = s->img_n; if (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0; if (has_trans) if (!compute_transparency(z, tc, s->img_out_n)) return 0; if (iphone && s->img_out_n > 2) stbi_de_iphone(z); if (pal_img_n) { // pal_img_n == 3 or 4 s->img_n = pal_img_n; // record the actual colors we had s->img_out_n = pal_img_n; if (req_comp >= 3) s->img_out_n = req_comp; if (!expand_palette(z, palette, pal_len, s->img_out_n)) return 0; } free(z->expanded); z->expanded = NULL; return 1; } default: // if critical, fail if (first) return e("first not IHDR", "Corrupt PNG"); if ((c.type & (1 << 29)) == 0) { #ifndef STBI_NO_FAILURE_STRINGS // not threadsafe static char invalid_chunk[] = "XXXX chunk not known"; invalid_chunk[0] = (uint8) (c.type >> 24); invalid_chunk[1] = (uint8) (c.type >> 16); invalid_chunk[2] = (uint8) (c.type >> 8); invalid_chunk[3] = (uint8) (c.type >> 0); #endif return e(invalid_chunk, "PNG not supported: unknown chunk type"); } skip(s, c.length); break; } // end of chunk, read and skip CRC get32(s); } } static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp) { unsigned char *result=NULL; if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); if (parse_png_file(p, SCAN_load, req_comp)) { result = p->out; p->out = NULL; if (req_comp && req_comp != p->s->img_out_n) { result = convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); p->s->img_out_n = req_comp; if (result == NULL) return result; } *x = p->s->img_x; *y = p->s->img_y; if (n) *n = p->s->img_n; } free(p->out); p->out = NULL; free(p->expanded); p->expanded = NULL; free(p->idata); p->idata = NULL; return result; } static unsigned char *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp) { png p; p.s = s; return do_png(&p, x,y,comp,req_comp); } static int stbi_png_test(stbi *s) { int r; r = check_png_header(s); stbi_rewind(s); return r; } static int stbi_png_info_raw(png *p, int *x, int *y, int *comp) { if (!parse_png_file(p, SCAN_header, 0)) { stbi_rewind( p->s ); return 0; } if (x) *x = p->s->img_x; if (y) *y = p->s->img_y; if (comp) *comp = p->s->img_n; return 1; } static int stbi_png_info(stbi *s, int *x, int *y, int *comp) { png p; p.s = s; return stbi_png_info_raw(&p, x, y, comp); } // Microsoft/Windows BMP image static int bmp_test(stbi *s) { int sz; if (get8(s) != 'B') return 0; if (get8(s) != 'M') return 0; get32le(s); // discard filesize get16le(s); // discard reserved get16le(s); // discard reserved get32le(s); // discard data offset sz = get32le(s); if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1; return 0; } static int stbi_bmp_test(stbi *s) { int r = bmp_test(s); stbi_rewind(s); return r; } // returns 0..31 for the highest set bit static int high_bit(unsigned int z) { int n=0; if (z == 0) return -1; if (z >= 0x10000) n += 16, z >>= 16; if (z >= 0x00100) n += 8, z >>= 8; if (z >= 0x00010) n += 4, z >>= 4; if (z >= 0x00004) n += 2, z >>= 2; if (z >= 0x00002) n += 1, z >>= 1; return n; } static int bitcount(unsigned int a) { a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits a = (a + (a >> 8)); // max 16 per 8 bits a = (a + (a >> 16)); // max 32 per 8 bits return a & 0xff; } static int shiftsigned(int v, int shift, int bits) { int result; int z=0; if (shift < 0) v <<= -shift; else v >>= shift; result = v; z = bits; while (z < 8) { result += v >> z; z += bits; } return result; } static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp) { uint8 *out; unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; stbi_uc pal[256][4]; int psize=0,i,j,compress=0,width; int bpp, flip_vertically, pad, target, offset, hsz; if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP"); get32le(s); // discard filesize get16le(s); // discard reserved get16le(s); // discard reserved offset = get32le(s); hsz = get32le(s); if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown"); if (hsz == 12) { s->img_x = get16le(s); s->img_y = get16le(s); } else { s->img_x = get32le(s); s->img_y = get32le(s); } if (get16le(s) != 1) return epuc("bad BMP", "bad BMP"); bpp = get16le(s); if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit"); flip_vertically = ((int) s->img_y) > 0; s->img_y = abs((int) s->img_y); if (hsz == 12) { if (bpp < 24) psize = (offset - 14 - 24) / 3; } else { compress = get32le(s); if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE"); get32le(s); // discard sizeof get32le(s); // discard hres get32le(s); // discard vres get32le(s); // discard colorsused get32le(s); // discard max important if (hsz == 40 || hsz == 56) { if (hsz == 56) { get32le(s); get32le(s); get32le(s); get32le(s); } if (bpp == 16 || bpp == 32) { mr = mg = mb = 0; if (compress == 0) { if (bpp == 32) { mr = 0xffu << 16; mg = 0xffu << 8; mb = 0xffu << 0; ma = 0xffu << 24; fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 } else { mr = 31u << 10; mg = 31u << 5; mb = 31u << 0; } } else if (compress == 3) { mr = get32le(s); mg = get32le(s); mb = get32le(s); // not documented, but generated by photoshop and handled by mspaint if (mr == mg && mg == mb) { // ?!?!? return epuc("bad BMP", "bad BMP"); } } else return epuc("bad BMP", "bad BMP"); } } else { assert(hsz == 108); mr = get32le(s); mg = get32le(s); mb = get32le(s); ma = get32le(s); get32le(s); // discard color space for (i=0; i < 12; ++i) get32le(s); // discard color space parameters } if (bpp < 16) psize = (offset - 14 - hsz) >> 2; } s->img_n = ma ? 4 : 3; if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 target = req_comp; else target = s->img_n; // if they want monochrome, we'll post-convert out = (stbi_uc *) malloc(target * s->img_x * s->img_y); if (!out) return epuc("outofmem", "Out of memory"); if (bpp < 16) { int z=0; if (psize == 0 || psize > 256) { free(out); return epuc("invalid", "Corrupt BMP"); } for (i=0; i < psize; ++i) { pal[i][2] = get8u(s); pal[i][1] = get8u(s); pal[i][0] = get8u(s); if (hsz != 12) get8(s); pal[i][3] = 255; } skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); if (bpp == 4) width = (s->img_x + 1) >> 1; else if (bpp == 8) width = s->img_x; else { free(out); return epuc("bad bpp", "Corrupt BMP"); } pad = (-width)&3; for (j=0; j < (int) s->img_y; ++j) { for (i=0; i < (int) s->img_x; i += 2) { int v=get8(s),v2=0; if (bpp == 4) { v2 = v & 15; v >>= 4; } out[z++] = pal[v][0]; out[z++] = pal[v][1]; out[z++] = pal[v][2]; if (target == 4) out[z++] = 255; if (i+1 == (int) s->img_x) break; v = (bpp == 8) ? get8(s) : v2; out[z++] = pal[v][0]; out[z++] = pal[v][1]; out[z++] = pal[v][2]; if (target == 4) out[z++] = 255; } skip(s, pad); } } else { int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; int z = 0; int easy=0; skip(s, offset - 14 - hsz); if (bpp == 24) width = 3 * s->img_x; else if (bpp == 16) width = 2*s->img_x; else /* bpp = 32 and pad = 0 */ width=0; pad = (-width) & 3; if (bpp == 24) { easy = 1; } else if (bpp == 32) { if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) easy = 2; } if (!easy) { if (!mr || !mg || !mb) { free(out); return epuc("bad masks", "Corrupt BMP"); } // right shift amt to put high bit in position #7 rshift = high_bit(mr)-7; rcount = bitcount(mr); gshift = high_bit(mg)-7; gcount = bitcount(mr); bshift = high_bit(mb)-7; bcount = bitcount(mr); ashift = high_bit(ma)-7; acount = bitcount(mr); } for (j=0; j < (int) s->img_y; ++j) { if (easy) { for (i=0; i < (int) s->img_x; ++i) { int a; out[z+2] = get8u(s); out[z+1] = get8u(s); out[z+0] = get8u(s); z += 3; a = (easy == 2 ? get8(s) : 255); if (target == 4) out[z++] = (uint8) a; } } else { for (i=0; i < (int) s->img_x; ++i) { uint32 v = (bpp == 16 ? get16le(s) : get32le(s)); int a; out[z++] = (uint8) shiftsigned(v & mr, rshift, rcount); out[z++] = (uint8) shiftsigned(v & mg, gshift, gcount); out[z++] = (uint8) shiftsigned(v & mb, bshift, bcount); a = (ma ? shiftsigned(v & ma, ashift, acount) : 255); if (target == 4) out[z++] = (uint8) a; } } skip(s, pad); } } if (flip_vertically) { stbi_uc t; for (j=0; j < (int) s->img_y>>1; ++j) { stbi_uc *p1 = out + j *s->img_x*target; stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; for (i=0; i < (int) s->img_x*target; ++i) { t = p1[i], p1[i] = p2[i], p2[i] = t; } } } if (req_comp && req_comp != target) { out = convert_format(out, target, req_comp, s->img_x, s->img_y); if (out == NULL) return out; // convert_format frees input on failure } *x = s->img_x; *y = s->img_y; if (comp) *comp = s->img_n; return out; } static stbi_uc *stbi_bmp_load(stbi *s,int *x, int *y, int *comp, int req_comp) { return bmp_load(s, x,y,comp,req_comp); } // Targa Truevision - TGA // by Jonathan Dummer static int tga_info(stbi *s, int *x, int *y, int *comp) { int tga_w, tga_h, tga_comp; int sz; get8u(s); // discard Offset sz = get8u(s); // color type if( sz > 1 ) { stbi_rewind(s); return 0; // only RGB or indexed allowed } sz = get8u(s); // image type // only RGB or grey allowed, +/- RLE if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; skip(s,9); tga_w = get16le(s); if( tga_w < 1 ) { stbi_rewind(s); return 0; // test width } tga_h = get16le(s); if( tga_h < 1 ) { stbi_rewind(s); return 0; // test height } sz = get8(s); // bits per pixel // only RGB or RGBA or grey allowed if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) { stbi_rewind(s); return 0; } tga_comp = sz; if (x) *x = tga_w; if (y) *y = tga_h; if (comp) *comp = tga_comp / 8; return 1; // seems to have passed everything } int stbi_tga_info(stbi *s, int *x, int *y, int *comp) { return tga_info(s, x, y, comp); } static int tga_test(stbi *s) { int sz; get8u(s); // discard Offset sz = get8u(s); // color type if ( sz > 1 ) return 0; // only RGB or indexed allowed sz = get8u(s); // image type if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE get16(s); // discard palette start get16(s); // discard palette length get8(s); // discard bits per palette color entry get16(s); // discard x origin get16(s); // discard y origin if ( get16(s) < 1 ) return 0; // test width if ( get16(s) < 1 ) return 0; // test height sz = get8(s); // bits per pixel if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed return 1; // seems to have passed everything } static int stbi_tga_test(stbi *s) { int res = tga_test(s); stbi_rewind(s); return res; } static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) { // read in the TGA header stuff int tga_offset = get8u(s); int tga_indexed = get8u(s); int tga_image_type = get8u(s); int tga_is_RLE = 0; int tga_palette_start = get16le(s); int tga_palette_len = get16le(s); int tga_palette_bits = get8u(s); int tga_x_origin = get16le(s); int tga_y_origin = get16le(s); int tga_width = get16le(s); int tga_height = get16le(s); int tga_bits_per_pixel = get8u(s); int tga_inverted = get8u(s); // image data unsigned char *tga_data; unsigned char *tga_palette = NULL; int i, j; unsigned char raw_data[4]; unsigned char trans_data[4]; int RLE_count = 0; int RLE_repeating = 0; int read_next_pixel = 1; // do a tiny bit of precessing if ( tga_image_type >= 8 ) { tga_image_type -= 8; tga_is_RLE = 1; } /* int tga_alpha_bits = tga_inverted & 15; */ tga_inverted = 1 - ((tga_inverted >> 5) & 1); // error check if ( //(tga_indexed) || (tga_width < 1) || (tga_height < 1) || (tga_image_type < 1) || (tga_image_type > 3) || ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) ) { return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA } // If I'm paletted, then I'll use the number of bits from the palette if ( tga_indexed ) { tga_bits_per_pixel = tga_palette_bits; } // tga info *x = tga_width; *y = tga_height; if ( (req_comp < 1) || (req_comp > 4) ) { // just use whatever the file was req_comp = tga_bits_per_pixel / 8; *comp = req_comp; } else { // force a new number of components *comp = tga_bits_per_pixel/8; } tga_data = (unsigned char*)malloc( tga_width * tga_height * req_comp ); if (!tga_data) return epuc("outofmem", "Out of memory"); // skip to the data's starting position (offset usually = 0) skip(s, tga_offset ); // do I need to load a palette? if ( tga_indexed ) { // any data to skip? (offset usually = 0) skip(s, tga_palette_start ); // load the palette tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); if (!tga_palette) return epuc("outofmem", "Out of memory"); if (!getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { free(tga_data); free(tga_palette); return epuc("bad palette", "Corrupt TGA"); } } // load the data trans_data[0] = trans_data[1] = trans_data[2] = trans_data[3] = 0; for (i=0; i < tga_width * tga_height; ++i) { // if I'm in RLE mode, do I need to get a RLE chunk? if ( tga_is_RLE ) { if ( RLE_count == 0 ) { // yep, get the next byte as a RLE command int RLE_cmd = get8u(s); RLE_count = 1 + (RLE_cmd & 127); RLE_repeating = RLE_cmd >> 7; read_next_pixel = 1; } else if ( !RLE_repeating ) { read_next_pixel = 1; } } else { read_next_pixel = 1; } // OK, if I need to read a pixel, do it now if ( read_next_pixel ) { // load however much data we did have if ( tga_indexed ) { // read in 1 byte, then perform the lookup int pal_idx = get8u(s); if ( pal_idx >= tga_palette_len ) { // invalid index pal_idx = 0; } pal_idx *= tga_bits_per_pixel / 8; for (j = 0; j*8 < tga_bits_per_pixel; ++j) { raw_data[j] = tga_palette[pal_idx+j]; } } else { // read in the data raw for (j = 0; j*8 < tga_bits_per_pixel; ++j) { raw_data[j] = get8u(s); } } // convert raw to the intermediate format switch (tga_bits_per_pixel) { case 8: // Luminous => RGBA trans_data[0] = raw_data[0]; trans_data[1] = raw_data[0]; trans_data[2] = raw_data[0]; trans_data[3] = 255; break; case 16: // Luminous,Alpha => RGBA trans_data[0] = raw_data[0]; trans_data[1] = raw_data[0]; trans_data[2] = raw_data[0]; trans_data[3] = raw_data[1]; break; case 24: // BGR => RGBA trans_data[0] = raw_data[2]; trans_data[1] = raw_data[1]; trans_data[2] = raw_data[0]; trans_data[3] = 255; break; case 32: // BGRA => RGBA trans_data[0] = raw_data[2]; trans_data[1] = raw_data[1]; trans_data[2] = raw_data[0]; trans_data[3] = raw_data[3]; break; } // clear the reading flag for the next pixel read_next_pixel = 0; } // end of reading a pixel // convert to final format switch (req_comp) { case 1: // RGBA => Luminance tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); break; case 2: // RGBA => Luminance,Alpha tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); tga_data[i*req_comp+1] = trans_data[3]; break; case 3: // RGBA => RGB tga_data[i*req_comp+0] = trans_data[0]; tga_data[i*req_comp+1] = trans_data[1]; tga_data[i*req_comp+2] = trans_data[2]; break; case 4: // RGBA => RGBA tga_data[i*req_comp+0] = trans_data[0]; tga_data[i*req_comp+1] = trans_data[1]; tga_data[i*req_comp+2] = trans_data[2]; tga_data[i*req_comp+3] = trans_data[3]; break; } // in case we're in RLE mode, keep counting down --RLE_count; } // do I need to invert the image? if ( tga_inverted ) { for (j = 0; j*2 < tga_height; ++j) { int index1 = j * tga_width * req_comp; int index2 = (tga_height - 1 - j) * tga_width * req_comp; for (i = tga_width * req_comp; i > 0; --i) { unsigned char temp = tga_data[index1]; tga_data[index1] = tga_data[index2]; tga_data[index2] = temp; ++index1; ++index2; } } } // clear my palette, if I had one if ( tga_palette != NULL ) { free( tga_palette ); } // the things I do to get rid of an error message, and yet keep // Microsoft's C compilers happy... [8^( tga_palette_start = tga_palette_len = tga_palette_bits = tga_x_origin = tga_y_origin = 0; // OK, done return tga_data; } static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) { return tga_load(s,x,y,comp,req_comp); } // ************************************************************************************************* // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB static int psd_test(stbi *s) { if (get32(s) != 0x38425053) return 0; // "8BPS" else return 1; } static int stbi_psd_test(stbi *s) { int r = psd_test(s); stbi_rewind(s); return r; } static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) { int pixelCount; int channelCount, compression; int channel, i, count, len; int w,h; uint8 *out; // Check identifier if (get32(s) != 0x38425053) // "8BPS" return epuc("not PSD", "Corrupt PSD image"); // Check file type version. if (get16(s) != 1) return epuc("wrong version", "Unsupported version of PSD image"); // Skip 6 reserved bytes. skip(s, 6 ); // Read the number of channels (R, G, B, A, etc). channelCount = get16(s); if (channelCount < 0 || channelCount > 16) return epuc("wrong channel count", "Unsupported number of channels in PSD image"); // Read the rows and columns of the image. h = get32(s); w = get32(s); // Make sure the depth is 8 bits. if (get16(s) != 8) return epuc("unsupported bit depth", "PSD bit depth is not 8 bit"); // Make sure the color mode is RGB. // Valid options are: // 0: Bitmap // 1: Grayscale // 2: Indexed color // 3: RGB color // 4: CMYK color // 7: Multichannel // 8: Duotone // 9: Lab color if (get16(s) != 3) return epuc("wrong color format", "PSD is not in RGB color format"); // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) skip(s,get32(s) ); // Skip the image resources. (resolution, pen tool paths, etc) skip(s, get32(s) ); // Skip the reserved data. skip(s, get32(s) ); // Find out if the data is compressed. // Known values: // 0: no compression // 1: RLE compressed compression = get16(s); if (compression > 1) return epuc("bad compression", "PSD has an unknown compression format"); // Create the destination image. out = (stbi_uc *) malloc(4 * w*h); if (!out) return epuc("outofmem", "Out of memory"); pixelCount = w*h; // Initialize the data to zero. //memset( out, 0, pixelCount * 4 ); // Finally, the image data. if (compression) { // RLE as used by .PSD and .TIFF // Loop until you get the number of unpacked bytes you are expecting: // Read the next source byte into n. // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. // Else if n is 128, noop. // Endloop // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, // which we're going to just skip. skip(s, h * channelCount * 2 ); // Read the RLE data by channel. for (channel = 0; channel < 4; channel++) { uint8 *p; p = out+channel; if (channel >= channelCount) { // Fill this channel with default data. for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; } else { // Read the RLE data. count = 0; while (count < pixelCount) { len = get8(s); if (len == 128) { // No-op. } else if (len < 128) { // Copy next len+1 bytes literally. len++; count += len; while (len) { *p = get8u(s); p += 4; len--; } } else if (len > 128) { uint8 val; // Next -len+1 bytes in the dest are replicated from next source byte. // (Interpret len as a negative 8-bit int.) len ^= 0x0FF; len += 2; val = get8u(s); count += len; while (len) { *p = val; p += 4; len--; } } } } } } else { // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) // where each channel consists of an 8-bit value for each pixel in the image. // Read the data by channel. for (channel = 0; channel < 4; channel++) { uint8 *p; p = out + channel; if (channel > channelCount) { // Fill this channel with default data. for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; } else { // Read the data. for (i = 0; i < pixelCount; i++) *p = get8u(s), p += 4; } } } if (req_comp && req_comp != 4) { out = convert_format(out, 4, req_comp, w, h); if (out == NULL) return out; // convert_format frees input on failure } if (comp) *comp = channelCount; *y = h; *x = w; return out; } static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) { return psd_load(s,x,y,comp,req_comp); } // ************************************************************************************************* // Softimage PIC loader // by Tom Seddon // // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ static int pic_is4(stbi *s,const char *str) { int i; for (i=0; i<4; ++i) if (get8(s) != (stbi_uc)str[i]) return 0; return 1; } static int pic_test(stbi *s) { int i; if (!pic_is4(s,"\x53\x80\xF6\x34")) return 0; for(i=0;i<84;++i) get8(s); if (!pic_is4(s,"PICT")) return 0; return 1; } typedef struct { stbi_uc size,type,channel; } pic_packet_t; static stbi_uc *pic_readval(stbi *s, int channel, stbi_uc *dest) { int mask=0x80, i; for (i=0; i<4; ++i, mask>>=1) { if (channel & mask) { if (at_eof(s)) return epuc("bad file","PIC file too short"); dest[i]=get8u(s); } } return dest; } static void pic_copyval(int channel,stbi_uc *dest,const stbi_uc *src) { int mask=0x80,i; for (i=0;i<4; ++i, mask>>=1) if (channel&mask) dest[i]=src[i]; } static stbi_uc *pic_load2(stbi *s,int width,int height,int *comp, stbi_uc *result) { int act_comp=0,num_packets=0,y,chained; pic_packet_t packets[10]; // this will (should...) cater for even some bizarre stuff like having data // for the same channel in multiple packets. do { pic_packet_t *packet; if (num_packets==sizeof(packets)/sizeof(packets[0])) return epuc("bad format","too many packets"); packet = &packets[num_packets++]; chained = get8(s); packet->size = get8u(s); packet->type = get8u(s); packet->channel = get8u(s); act_comp |= packet->channel; if (at_eof(s)) return epuc("bad file","file too short (reading packets)"); if (packet->size != 8) return epuc("bad format","packet isn't 8bpp"); } while (chained); *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? for(y=0; ytype) { default: return epuc("bad format","packet has bad compression type"); case 0: {//uncompressed int x; for(x=0;xchannel,dest)) return 0; break; } case 1://Pure RLE { int left=width, i; while (left>0) { stbi_uc count,value[4]; count=get8u(s); if (at_eof(s)) return epuc("bad file","file too short (pure read count)"); if (count > left) count = (uint8) left; if (!pic_readval(s,packet->channel,value)) return 0; for(i=0; ichannel,dest,value); left -= count; } } break; case 2: {//Mixed RLE int left=width; while (left>0) { int count = get8(s), i; if (at_eof(s)) return epuc("bad file","file too short (mixed read count)"); if (count >= 128) { // Repeated stbi_uc value[4]; int i; if (count==128) count = get16(s); else count -= 127; if (count > left) return epuc("bad file","scanline overrun"); if (!pic_readval(s,packet->channel,value)) return 0; for(i=0;ichannel,dest,value); } else { // Raw ++count; if (count>left) return epuc("bad file","scanline overrun"); for(i=0;ichannel,dest)) return 0; } left-=count; } break; } } } } return result; } static stbi_uc *pic_load(stbi *s,int *px,int *py,int *comp,int req_comp) { stbi_uc *result; int i, x,y; for (i=0; i<92; ++i) get8(s); x = get16(s); y = get16(s); if (at_eof(s)) return epuc("bad file","file too short (pic header)"); if ((1 << 28) / x < y) return epuc("too large", "Image too large to decode"); get32(s); //skip `ratio' get16(s); //skip `fields' get16(s); //skip `pad' // intermediate buffer is RGBA result = (stbi_uc *) malloc(x*y*4); memset(result, 0xff, x*y*4); if (!pic_load2(s,x,y,comp, result)) { free(result); result=0; } *px = x; *py = y; if (req_comp == 0) req_comp = *comp; result=convert_format(result,4,req_comp,x,y); return result; } static int stbi_pic_test(stbi *s) { int r = pic_test(s); stbi_rewind(s); return r; } static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp) { return pic_load(s,x,y,comp,req_comp); } // ************************************************************************************************* // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb typedef struct stbi_gif_lzw_struct { int16 prefix; uint8 first; uint8 suffix; } stbi_gif_lzw; typedef struct stbi_gif_struct { int w,h; stbi_uc *out; // output buffer (always 4 components) int flags, bgindex, ratio, transparent, eflags; uint8 pal[256][4]; uint8 lpal[256][4]; stbi_gif_lzw codes[4096]; uint8 *color_table; int parse, step; int lflags; int start_x, start_y; int max_x, max_y; int cur_x, cur_y; int line_size; } stbi_gif; static int gif_test(stbi *s) { int sz; if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return 0; sz = get8(s); if (sz != '9' && sz != '7') return 0; if (get8(s) != 'a') return 0; return 1; } static int stbi_gif_test(stbi *s) { int r = gif_test(s); stbi_rewind(s); return r; } static void stbi_gif_parse_colortable(stbi *s, uint8 pal[256][4], int num_entries, int transp) { int i; for (i=0; i < num_entries; ++i) { pal[i][2] = get8u(s); pal[i][1] = get8u(s); pal[i][0] = get8u(s); pal[i][3] = transp ? 0 : 255; } } static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info) { uint8 version; if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return e("not GIF", "Corrupt GIF"); version = get8u(s); if (version != '7' && version != '9') return e("not GIF", "Corrupt GIF"); if (get8(s) != 'a') return e("not GIF", "Corrupt GIF"); failure_reason = ""; g->w = get16le(s); g->h = get16le(s); g->flags = get8(s); g->bgindex = get8(s); g->ratio = get8(s); g->transparent = -1; if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments if (is_info) return 1; if (g->flags & 0x80) stbi_gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); return 1; } static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp) { stbi_gif g; if (!stbi_gif_header(s, &g, comp, 1)) { stbi_rewind( s ); return 0; } if (x) *x = g.w; if (y) *y = g.h; return 1; } static void stbi_out_gif_code(stbi_gif *g, uint16 code) { uint8 *p, *c; // recurse to decode the prefixes, since the linked-list is backwards, // and working backwards through an interleaved image would be nasty if (g->codes[code].prefix >= 0) stbi_out_gif_code(g, g->codes[code].prefix); if (g->cur_y >= g->max_y) return; p = &g->out[g->cur_x + g->cur_y]; c = &g->color_table[g->codes[code].suffix * 4]; if (c[3] >= 128) { p[0] = c[2]; p[1] = c[1]; p[2] = c[0]; p[3] = c[3]; } g->cur_x += 4; if (g->cur_x >= g->max_x) { g->cur_x = g->start_x; g->cur_y += g->step; while (g->cur_y >= g->max_y && g->parse > 0) { g->step = (1 << g->parse) * g->line_size; g->cur_y = g->start_y + (g->step >> 1); --g->parse; } } } static uint8 *stbi_process_gif_raster(stbi *s, stbi_gif *g) { uint8 lzw_cs; int32 len, code; uint32 first; int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; stbi_gif_lzw *p; lzw_cs = get8u(s); clear = 1 << lzw_cs; first = 1; codesize = lzw_cs + 1; codemask = (1 << codesize) - 1; bits = 0; valid_bits = 0; for (code = 0; code < clear; code++) { g->codes[code].prefix = -1; g->codes[code].first = (uint8) code; g->codes[code].suffix = (uint8) code; } // support no starting clear code avail = clear+2; oldcode = -1; len = 0; for(;;) { if (valid_bits < codesize) { if (len == 0) { len = get8(s); // start new block if (len == 0) return g->out; } --len; bits |= (int32) get8(s) << valid_bits; valid_bits += 8; } else { int32 code = bits & codemask; bits >>= codesize; valid_bits -= codesize; // @OPTIMIZE: is there some way we can accelerate the non-clear path? if (code == clear) { // clear code codesize = lzw_cs + 1; codemask = (1 << codesize) - 1; avail = clear + 2; oldcode = -1; first = 0; } else if (code == clear + 1) { // end of stream code skip(s, len); while ((len = get8(s)) > 0) skip(s,len); return g->out; } else if (code <= avail) { if (first) return epuc("no clear code", "Corrupt GIF"); if (oldcode >= 0) { p = &g->codes[avail++]; if (avail > 4096) return epuc("too many codes", "Corrupt GIF"); p->prefix = (int16) oldcode; p->first = g->codes[oldcode].first; p->suffix = (code == avail) ? p->first : g->codes[code].first; } else if (code == avail) return epuc("illegal code in raster", "Corrupt GIF"); stbi_out_gif_code(g, (uint16) code); if ((avail & codemask) == 0 && avail <= 0x0FFF) { codesize++; codemask = (1 << codesize) - 1; } oldcode = code; } else { return epuc("illegal code in raster", "Corrupt GIF"); } } } } static void stbi_fill_gif_background(stbi_gif *g) { int i; uint8 *c = g->pal[g->bgindex]; // @OPTIMIZE: write a dword at a time for (i = 0; i < g->w * g->h * 4; i += 4) { uint8 *p = &g->out[i]; p[0] = c[2]; p[1] = c[1]; p[2] = c[0]; p[3] = c[3]; } } // this function is designed to support animated gifs, although stb_image doesn't support it static uint8 *stbi_gif_load_next(stbi *s, stbi_gif *g, int *comp, int req_comp) { int i; uint8 *old_out = 0; if (g->out == 0) { if (!stbi_gif_header(s, g, comp,0)) return 0; // failure_reason set by stbi_gif_header g->out = (uint8 *) malloc(4 * g->w * g->h); if (g->out == 0) return epuc("outofmem", "Out of memory"); stbi_fill_gif_background(g); } else { // animated-gif-only path if (((g->eflags & 0x1C) >> 2) == 3) { old_out = g->out; g->out = (uint8 *) malloc(4 * g->w * g->h); if (g->out == 0) return epuc("outofmem", "Out of memory"); memcpy(g->out, old_out, g->w*g->h*4); } } for (;;) { switch (get8(s)) { case 0x2C: /* Image Descriptor */ { int32 x, y, w, h; uint8 *o; x = get16le(s); y = get16le(s); w = get16le(s); h = get16le(s); if (((x + w) > (g->w)) || ((y + h) > (g->h))) return epuc("bad Image Descriptor", "Corrupt GIF"); g->line_size = g->w * 4; g->start_x = x * 4; g->start_y = y * g->line_size; g->max_x = g->start_x + w * 4; g->max_y = g->start_y + h * g->line_size; g->cur_x = g->start_x; g->cur_y = g->start_y; g->lflags = get8(s); if (g->lflags & 0x40) { g->step = 8 * g->line_size; // first interlaced spacing g->parse = 3; } else { g->step = g->line_size; g->parse = 0; } if (g->lflags & 0x80) { stbi_gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); g->color_table = (uint8 *) g->lpal; } else if (g->flags & 0x80) { for (i=0; i < 256; ++i) // @OPTIMIZE: reset only the previous transparent g->pal[i][3] = 255; if (g->transparent >= 0 && (g->eflags & 0x01)) g->pal[g->transparent][3] = 0; g->color_table = (uint8 *) g->pal; } else return epuc("missing color table", "Corrupt GIF"); o = stbi_process_gif_raster(s, g); if (o == NULL) return NULL; if (req_comp && req_comp != 4) o = convert_format(o, 4, req_comp, g->w, g->h); return o; } case 0x21: // Comment Extension. { int len; if (get8(s) == 0xF9) { // Graphic Control Extension. len = get8(s); if (len == 4) { g->eflags = get8(s); get16le(s); // delay g->transparent = get8(s); } else { skip(s, len); break; } } while ((len = get8(s)) != 0) skip(s, len); break; } case 0x3B: // gif stream termination code return (uint8 *) 1; default: return epuc("unknown code", "Corrupt GIF"); } } } static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp) { uint8 *u = 0; stbi_gif g={0}; u = stbi_gif_load_next(s, &g, comp, req_comp); if (u == (void *) 1) u = 0; // end of animated gif marker if (u) { *x = g.w; *y = g.h; } return u; } static int stbi_gif_info(stbi *s, int *x, int *y, int *comp) { return stbi_gif_info_raw(s,x,y,comp); } // ************************************************************************************************* // Radiance RGBE HDR loader // originally by Nicolas Schulz #ifndef STBI_NO_HDR static int hdr_test(stbi *s) { const char *signature = "#?RADIANCE\n"; int i; for (i=0; signature[i]; ++i) if (get8(s) != signature[i]) return 0; return 1; } static int stbi_hdr_test(stbi* s) { int r = hdr_test(s); stbi_rewind(s); return r; } #define HDR_BUFLEN 1024 static char *hdr_gettoken(stbi *z, char *buffer) { int len=0; char c = '\0'; c = (char) get8(z); while (!at_eof(z) && c != '\n') { buffer[len++] = c; if (len == HDR_BUFLEN-1) { // flush to end of line while (!at_eof(z) && get8(z) != '\n') ; break; } c = (char) get8(z); } buffer[len] = 0; return buffer; } static void hdr_convert(float *output, stbi_uc *input, int req_comp) { if ( input[3] != 0 ) { float f1; // Exponent f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); if (req_comp <= 2) output[0] = (input[0] + input[1] + input[2]) * f1 / 3; else { output[0] = input[0] * f1; output[1] = input[1] * f1; output[2] = input[2] * f1; } if (req_comp == 2) output[1] = 1; if (req_comp == 4) output[3] = 1; } else { switch (req_comp) { case 4: output[3] = 1; /* fallthrough */ case 3: output[0] = output[1] = output[2] = 0; break; case 2: output[1] = 1; /* fallthrough */ case 1: output[0] = 0; break; } } } static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) { char buffer[HDR_BUFLEN]; char *token; int valid = 0; int width, height; stbi_uc *scanline; float *hdr_data; int len; unsigned char count, value; int i, j, k, c1,c2, z; // Check identifier if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) return epf("not HDR", "Corrupt HDR image"); // Parse header for(;;) { token = hdr_gettoken(s,buffer); if (token[0] == 0) break; if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; } if (!valid) return epf("unsupported format", "Unsupported HDR format"); // Parse width and height // can't use sscanf() if we're not using stdio! token = hdr_gettoken(s,buffer); if (strncmp(token, "-Y ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); token += 3; height = strtol(token, &token, 10); while (*token == ' ') ++token; if (strncmp(token, "+X ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); token += 3; width = strtol(token, NULL, 10); *x = width; *y = height; *comp = 3; if (req_comp == 0) req_comp = 3; // Read data hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); // Load image data // image data is stored as some number of sca if ( width < 8 || width >= 32768) { // Read flat data for (j=0; j < height; ++j) { for (i=0; i < width; ++i) { stbi_uc rgbe[4]; main_decode_loop: getn(s, rgbe, 4); hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); } } } else { // Read RLE-encoded data scanline = NULL; for (j = 0; j < height; ++j) { c1 = get8(s); c2 = get8(s); len = get8(s); if (c1 != 2 || c2 != 2 || (len & 0x80)) { // not run-length encoded, so we have to actually use THIS data as a decoded // pixel (note this can't be a valid pixel--one of RGB must be >= 128) uint8 rgbe[4]; rgbe[0] = (uint8) c1; rgbe[1] = (uint8) c2; rgbe[2] = (uint8) len; rgbe[3] = (uint8) get8u(s); hdr_convert(hdr_data, rgbe, req_comp); i = 1; j = 0; free(scanline); goto main_decode_loop; // yes, this makes no sense } len <<= 8; len |= get8(s); if (len != width) { free(hdr_data); free(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); } if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); for (k = 0; k < 4; ++k) { i = 0; while (i < width) { count = get8u(s); if (count > 128) { // Run value = get8u(s); count -= 128; for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = value; } else { // Dump for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = get8u(s); } } } for (i=0; i < width; ++i) hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); } free(scanline); } return hdr_data; } static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) { return hdr_load(s,x,y,comp,req_comp); } static int stbi_hdr_info(stbi *s, int *x, int *y, int *comp) { char buffer[HDR_BUFLEN]; char *token; int valid = 0; if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) { stbi_rewind( s ); return 0; } for(;;) { token = hdr_gettoken(s,buffer); if (token[0] == 0) break; if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; } if (!valid) { stbi_rewind( s ); return 0; } token = hdr_gettoken(s,buffer); if (strncmp(token, "-Y ", 3)) { stbi_rewind( s ); return 0; } token += 3; *y = strtol(token, &token, 10); while (*token == ' ') ++token; if (strncmp(token, "+X ", 3)) { stbi_rewind( s ); return 0; } token += 3; *x = strtol(token, NULL, 10); *comp = 3; return 1; } #endif // STBI_NO_HDR static int stbi_bmp_info(stbi *s, int *x, int *y, int *comp) { int hsz; if (get8(s) != 'B' || get8(s) != 'M') { stbi_rewind( s ); return 0; } skip(s,12); hsz = get32le(s); if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) { stbi_rewind( s ); return 0; } if (hsz == 12) { *x = get16le(s); *y = get16le(s); } else { *x = get32le(s); *y = get32le(s); } if (get16le(s) != 1) { stbi_rewind( s ); return 0; } *comp = get16le(s) / 8; return 1; } static int stbi_psd_info(stbi *s, int *x, int *y, int *comp) { int channelCount; if (get32(s) != 0x38425053) { stbi_rewind( s ); return 0; } if (get16(s) != 1) { stbi_rewind( s ); return 0; } skip(s, 6); channelCount = get16(s); if (channelCount < 0 || channelCount > 16) { stbi_rewind( s ); return 0; } *y = get32(s); *x = get32(s); if (get16(s) != 8) { stbi_rewind( s ); return 0; } if (get16(s) != 3) { stbi_rewind( s ); return 0; } *comp = 4; return 1; } static int stbi_pic_info(stbi *s, int *x, int *y, int *comp) { int act_comp=0,num_packets=0,chained; pic_packet_t packets[10]; skip(s, 92); *x = get16(s); *y = get16(s); if (at_eof(s)) return 0; if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { stbi_rewind( s ); return 0; } skip(s, 8); do { pic_packet_t *packet; if (num_packets==sizeof(packets)/sizeof(packets[0])) return 0; packet = &packets[num_packets++]; chained = get8(s); packet->size = get8u(s); packet->type = get8u(s); packet->channel = get8u(s); act_comp |= packet->channel; if (at_eof(s)) { stbi_rewind( s ); return 0; } if (packet->size != 8) { stbi_rewind( s ); return 0; } } while (chained); *comp = (act_comp & 0x10 ? 4 : 3); return 1; } static int stbi_info_main(stbi *s, int *x, int *y, int *comp) { if (stbi_jpeg_info(s, x, y, comp)) return 1; if (stbi_png_info(s, x, y, comp)) return 1; if (stbi_gif_info(s, x, y, comp)) return 1; if (stbi_bmp_info(s, x, y, comp)) return 1; if (stbi_psd_info(s, x, y, comp)) return 1; if (stbi_pic_info(s, x, y, comp)) return 1; #ifndef STBI_NO_HDR if (stbi_hdr_info(s, x, y, comp)) return 1; #endif // test tga last because it's a crappy test! if (stbi_tga_info(s, x, y, comp)) return 1; return e("unknown image type", "Image not of any known type, or corrupt"); } #ifndef STBI_NO_STDIO int stbi_info(char const *filename, int *x, int *y, int *comp) { FILE *f = fopen(filename, "rb"); int result; if (!f) return e("can't fopen", "Unable to open file"); result = stbi_info_from_file(f, x, y, comp); fclose(f); return result; } int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) { int r; stbi s; long pos = ftell(f); start_file(&s, f); r = stbi_info_main(&s,x,y,comp); fseek(f,pos,SEEK_SET); return r; } #endif // !STBI_NO_STDIO int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) { stbi s; start_mem(&s,buffer,len); return stbi_info_main(&s,x,y,comp); } int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) { stbi s; start_callbacks(&s, (stbi_io_callbacks *) c, user); return stbi_info_main(&s,x,y,comp); } #endif // STBI_HEADER_FILE_ONLY /* revision history: 1.33 (2011-07-14) make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements 1.32 (2011-07-13) support for "info" function for all supported filetypes (SpartanJ) 1.31 (2011-06-20) a few more leak fixes, bug in PNG handling (SpartanJ) 1.30 (2011-06-11) added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) removed deprecated format-specific test/load functions removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) fix inefficiency in decoding 32-bit BMP (David Woo) 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville 1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ) 1.27 (2010-08-01) cast-to-uint8 to fix warnings 1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ 1.25 (2010-07-17) refix trans_data warning (Won Chun) 1.24 (2010-07-12) perf improvements reading from files on platforms with lock-heavy fgetc() minor perf improvements for jpeg deprecated type-specific functions so we'll get feedback if they're needed attempt to fix trans_data warning (Won Chun) 1.23 fixed bug in iPhone support 1.22 (2010-07-10) removed image *writing* support stbi_info support from Jetro Lauha GIF support from Jean-Marc Lienher iPhone PNG-extensions from James Brown warning-fixes from Nicolas Schulz and Janez Zemva (i.e. Janez (U+017D)emva) 1.21 fix use of 'uint8' in header (reported by jon blow) 1.20 added support for Softimage PIC, by Tom Seddon 1.19 bug in interlaced PNG corruption check (found by ryg) 1.18 2008-08-02 fix a threading bug (local mutable static) 1.17 support interlaced PNG 1.16 major bugfix - convert_format converted one too many pixels 1.15 initialize some fields for thread safety 1.14 fix threadsafe conversion bug header-file-only version (#define STBI_HEADER_FILE_ONLY before including) 1.13 threadsafe 1.12 const qualifiers in the API 1.11 Support installable IDCT, colorspace conversion routines 1.10 Fixes for 64-bit (don't use "unsigned long") optimized upsampling by Fabian "ryg" Giesen 1.09 Fix format-conversion for PSD code (bad global variables!) 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz 1.07 attempt to fix C++ warning/errors again 1.06 attempt to fix C++ warning/errors again 1.05 fix TGA loading to return correct *comp and use good luminance calc 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR 1.02 support for (subset of) HDR files, float interface for preferred access to them 1.01 fix bug: possible bug in handling right-side up bmps... not sure fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all 1.00 interface to zlib that skips zlib header 0.99 correct handling of alpha in palette 0.98 TGA loader by lonesock; dynamically add loaders (untested) 0.97 jpeg errors on too large a file; also catch another malloc failure 0.96 fix detection of invalid v value - particleman@mollyrocket forum 0.95 during header scan, seek to markers in case of padding 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same 0.93 handle jpegtran output; verbose errors 0.92 read 4,8,16,24,32-bit BMP files of several formats 0.91 output 24-bit Windows 3.0 BMP files 0.90 fix a few more warnings; bump version number to approach 1.0 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd 0.60 fix compiling as c++ 0.59 fix warnings: merge Dave Moore's -Wall fixes 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available 0.56 fix bug: zlib uncompressed mode len vs. nlen 0.55 fix bug: restart_interval not initialized to 0 0.54 allow NULL for 'int *comp' 0.53 fix bug in png 3->4; speedup png decoding 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments 0.51 obey req_comp requests, 1-component jpegs return as 1-component, on 'test' only check type, not whether we support this variant 0.50 first released version */ numptyphysics-0.3.10/external/stb_loader/stb_loader.cpp000066400000000000000000000066621425065123200233260ustar00rootroot00000000000000 #include "stb_loader.h" #include "stb_image.c" #define STB_TRUETYPE_IMPLEMENTATION #include "stb_truetype.h" #include "utf8decoder.h" #include static void do_free(char *ptr) { free((void *)ptr); } static void do_free_stbi(char *ptr) { stbi_image_free((stbi_uc *)ptr); } StbLoader_RGBA * StbLoader::decode_image(void *buffer, size_t len) { int w, h; stbi_uc *pixels = stbi_load_from_memory((stbi_uc *)buffer, len, &w, &h, NULL, 4); return new StbLoader_RGBA((char *)pixels, w, h, do_free_stbi); } StbLoader_RGBA * StbLoader::render_font(void *buffer, size_t len, StbLoader_Color color, int size, const char *text) { stbtt_fontinfo font; stbtt_fontinfo *f = &font; stbtt_InitFont(f, (const unsigned char *)buffer, stbtt_GetFontOffsetForIndex((const unsigned char *)buffer, 0)); // Need to scale this a bit, so it looks roughly the same // size as the font rendered in other renderers float addscale = 1.25; int w = 0; int h = size * addscale; float scale = stbtt_ScaleForPixelHeight(f, size * addscale); int ascent, descent, lineGap; stbtt_GetFontVMetrics(f, &ascent, &descent, &lineGap); ascent *= scale; descent *= scale; lineGap *= scale; uint32_t codepoint = 0; uint32_t state = 0; const unsigned char *p = (const unsigned char *)text; // First pass: Get size of bitmap to render for (; *p; ++p) { if (utf8_decode(&state, &codepoint, *p) != UTF8_ACCEPT) { continue; } int cw, ch; int xo, yo; stbtt_FreeBitmap(stbtt_GetCodepointBitmap(f, scale, scale, codepoint, &cw, &ch, &xo, &yo), nullptr); int advance, bearing; stbtt_GetCodepointHMetrics(f, codepoint, &advance, &bearing); advance *= scale; bearing *= scale; w += std::max(cw + xo, advance); } unsigned char *pixels = (unsigned char *)malloc(w * h * 4); memset(pixels, 0x00 /* set to 0x77 for debugging */, w * h * 4); int x = 0; codepoint = 0; state = 0; p = (const unsigned char *)text; // Second pass: Render RGBA bitmap for (; *p; ++p) { if (utf8_decode(&state, &codepoint, *p) != UTF8_ACCEPT) { continue; } int cw, ch; int xo, yo; unsigned char *cb = stbtt_GetCodepointBitmap(f, scale, scale, codepoint, &cw, &ch, &xo, &yo); int advance, bearing; stbtt_GetCodepointHMetrics(f, codepoint, &advance, &bearing); advance *= scale; bearing *= scale; x += xo; int y = h + yo + descent; for (int dx=0; dx= w) { continue; } else if (y + dy < 0 || y + dy >= h) { continue; } // RGB pixels[4 * ((x + dx) + w * (y + dy)) + 0] = 255*color.r; pixels[4 * ((x + dx) + w * (y + dy)) + 1] = 255*color.g; pixels[4 * ((x + dx) + w * (y + dy)) + 2] = 255*color.b; // Alpha unsigned char &a = pixels[4 * ((x + dx) + w * (y + dy)) + 3]; a = std::min(0xFF, a + cb[dx+dy*cw]); } } x += advance - bearing; stbtt_FreeBitmap(cb, nullptr); } return new StbLoader_RGBA((char *)pixels, w, h, do_free); } numptyphysics-0.3.10/external/stb_loader/stb_loader.h000066400000000000000000000014671425065123200227710ustar00rootroot00000000000000#ifndef GABERLN_STB_LOADER_H #define GABERLN_STB_LOADER_H #include #include #include struct StbLoader_RGBA { StbLoader_RGBA(char *data, int w, int h, void (*freefunc)(char *)=0) : data(data), w(w), h(h), freefunc(freefunc) {} ~StbLoader_RGBA() { if (freefunc) freefunc(data); } char *data; int w; int h; void (*freefunc)(char *); }; struct StbLoader_Color { StbLoader_Color(float r, float g, float b, float a) : r(r), g(g), b(b), a(a) {} float r; float g; float b; float a; }; class StbLoader { public: static StbLoader_RGBA * decode_image(void *buffer, size_t len); static StbLoader_RGBA * render_font(void *buffer, size_t len, StbLoader_Color color, int size, const char *text); }; #endif /* GABERLN_STB_LOADER_H */ numptyphysics-0.3.10/external/stb_loader/stb_truetype.h000066400000000000000000002430251425065123200234020ustar00rootroot00000000000000// stb_truetype.h - v0.7 - public domain // authored from 2009-2013 by Sean Barrett / RAD Game Tools // // This library processes TrueType files: // parse files // extract glyph metrics // extract glyph shapes // render glyphs to one-channel bitmaps with antialiasing (box filter) // // Todo: // non-MS cmaps // crashproof on bad data // hinting? (no longer patented) // cleartype-style AA? // optimize: use simple memory allocator for intermediates // optimize: build edge-list directly from curves // optimize: rasterize directly from curves? // // ADDITIONAL CONTRIBUTORS // // Mikko Mononen: compound shape support, more cmap formats // Tor Andersson: kerning, subpixel rendering // // Bug/warning reports: // "Zer" on mollyrocket (with fix) // Cass Everitt // stoiko (Haemimont Games) // Brian Hook // Walter van Niftrik // // VERSION HISTORY // // 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back // 0.6c (2012-07-24) improve documentation // 0.6b (2012-07-20) fix a few more warnings // 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, // stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty // 0.5 (2011-12-09) bugfixes: // subpixel glyph renderer computed wrong bounding box // first vertex of shape can be off-curve (FreeSans) // 0.4b (2011-12-03) fixed an error in the font baking example // 0.4 (2011-12-01) kerning, subpixel rendering (tor) // bugfixes for: // codepoint-to-glyph conversion using table fmt=12 // codepoint-to-glyph conversion using table fmt=4 // stbtt_GetBakedQuad with non-square texture (Zer) // updated Hello World! sample to use kerning and subpixel // fixed some warnings // 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) // userdata, malloc-from-userdata, non-zero fill (STB) // 0.2 (2009-03-11) Fix unsigned/signed char warnings // 0.1 (2009-03-09) First public release // // LICENSE // // This software is in the public domain. Where that dedication is not // recognized, you are granted a perpetual, irrevokable license to copy // and modify this file as you see fit. // // USAGE // // Include this file in whatever places neeed to refer to it. In ONE C/C++ // file, write: // #define STB_TRUETYPE_IMPLEMENTATION // before the #include of this file. This expands out the actual // implementation into that C/C++ file. // // Simple 3D API (don't ship this, but it's fine for tools and quick start, // and you can cut and paste from it to move to more advanced) // stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture // stbtt_GetBakedQuad() -- compute quad to draw for a given char // // "Load" a font file from a memory buffer (you have to keep the buffer loaded) // stbtt_InitFont() // stbtt_GetFontOffsetForIndex() -- use for TTC font collections // // Render a unicode codepoint to a bitmap // stbtt_GetCodepointBitmap() -- allocates and returns a bitmap // stbtt_MakeCodepointBitmap() -- renders into bitmap you provide // stbtt_GetCodepointBitmapBox() -- how big the bitmap must be // // Character advance/positioning // stbtt_GetCodepointHMetrics() // stbtt_GetFontVMetrics() // stbtt_GetCodepointKernAdvance() // // ADDITIONAL DOCUMENTATION // // Immediately after this block comment are a series of sample programs. // // After the sample programs is the "header file" section. This section // includes documentation for each API function. // // Some important concepts to understand to use this library: // // Codepoint // Characters are defined by unicode codepoints, e.g. 65 is // uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is // the hiragana for "ma". // // Glyph // A visual character shape (every codepoint is rendered as // some glyph) // // Glyph index // A font-specific integer ID representing a glyph // // Baseline // Glyph shapes are defined relative to a baseline, which is the // bottom of uppercase characters. Characters extend both above // and below the baseline. // // Current Point // As you draw text to the screen, you keep track of a "current point" // which is the origin of each character. The current point's vertical // position is the baseline. Even "baked fonts" use this model. // // Vertical Font Metrics // The vertical qualities of the font, used to vertically position // and space the characters. See docs for stbtt_GetFontVMetrics. // // Font Size in Pixels or Points // The preferred interface for specifying font sizes in stb_truetype // is to specify how tall the font's vertical extent should be in pixels. // If that sounds good enough, skip the next paragraph. // // Most font APIs instead use "points", which are a common typographic // measurement for describing font size, defined as 72 points per inch. // stb_truetype provides a point API for compatibility. However, true // "per inch" conventions don't make much sense on computer displays // since they different monitors have different number of pixels per // inch. For example, Windows traditionally uses a convention that // there are 96 pixels per inch, thus making 'inch' measurements have // nothing to do with inches, and thus effectively defining a point to // be 1.333 pixels. Additionally, the TrueType font data provides // an explicit scale factor to scale a given font's glyphs to points, // but the author has observed that this scale factor is often wrong // for non-commercial fonts, thus making fonts scaled in points // according to the TrueType spec incoherently sized in practice. // // ADVANCED USAGE // // Quality: // // - Use the functions with Subpixel at the end to allow your characters // to have subpixel positioning. Since the font is anti-aliased, not // hinted, this is very import for quality. (This is not possible with // baked fonts.) // // - Kerning is now supported, and if you're supporting subpixel rendering // then kerning is worth using to give your text a polished look. // // Performance: // // - Convert Unicode codepoints to glyph indexes and operate on the glyphs; // if you don't do this, stb_truetype is forced to do the conversion on // every call. // // - There are a lot of memory allocations. We should modify it to take // a temp buffer and allocate from the temp buffer (without freeing), // should help performance a lot. // // NOTES // // The system uses the raw data found in the .ttf file without changing it // and without building auxiliary data structures. This is a bit inefficient // on little-endian systems (the data is big-endian), but assuming you're // caching the bitmaps or glyph shapes this shouldn't be a big deal. // // It appears to be very hard to programmatically determine what font a // given file is in a general way. I provide an API for this, but I don't // recommend it. // // // SOURCE STATISTICS (based on v0.6c, 2050 LOC) // // Documentation & header file 520 LOC \___ 660 LOC documentation // Sample code 140 LOC / // Truetype parsing 620 LOC ---- 620 LOC TrueType // Software rasterization 240 LOC \ . // Curve tesselation 120 LOC \__ 550 LOC Bitmap creation // Bitmap management 100 LOC / // Baked bitmap interface 70 LOC / // Font name matching & access 150 LOC ---- 150 // C runtime library abstraction 60 LOC ---- 60 ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //// //// SAMPLE PROGRAMS //// // // Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless // #if 0 #define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation #include "stb_truetype.h" char ttf_buffer[1<<20]; unsigned char temp_bitmap[512*512]; stbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs GLstbtt_uint ftex; void my_stbtt_initfont(void) { fread(ttf_buffer, 1, 1<<20, fopen("c:/windows/fonts/times.ttf", "rb")); stbtt_BakeFontBitmap(data,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits! // can free ttf_buffer at this point glGenTextures(1, &ftex); glBindTexture(GL_TEXTURE_2D, ftex); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap); // can free temp_bitmap at this point glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } void my_stbtt_print(float x, float y, char *text) { // assume orthographic projection with units = screen pixels, origin at top left glBindTexture(GL_TEXTURE_2D, ftex); glBegin(GL_QUADS); while (*text) { if (*text >= 32 && *text < 128) { stbtt_aligned_quad q; stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl,0=old d3d glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0); glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0); glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1); glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1); } ++text; } glEnd(); } #endif // // ////////////////////////////////////////////////////////////////////////////// // // Complete program (this compiles): get a single bitmap, print as ASCII art // #if 0 #include #define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation #include "stb_truetype.h" char ttf_buffer[1<<25]; int main(int argc, char **argv) { stbtt_fontinfo font; unsigned char *bitmap; int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); for (j=0; j < h; ++j) { for (i=0; i < w; ++i) putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); putchar('\n'); } return 0; } #endif // // Output: // // .ii. // @@@@@@. // V@Mio@@o // :i. V@V // :oM@@M // :@@@MM@M // @@o o@M // :@@. M@M // @@@o@@@@ // :M@@V:@@. // ////////////////////////////////////////////////////////////////////////////// // // Complete program: print "Hello World!" banner, with bugs // #if 0 char buffer[24<<20]; unsigned char screen[20][79]; int main(int arg, char **argv) { stbtt_fontinfo font; int i,j,ascent,baseline,ch=0; float scale, xpos=0; char *text = "Heljo World!"; fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); stbtt_InitFont(&font, buffer, 0); scale = stbtt_ScaleForPixelHeight(&font, 15); stbtt_GetFontVMetrics(&font, &ascent,0,0); baseline = (int) (ascent*scale); while (text[ch]) { int advance,lsb,x0,y0,x1,y1; float x_shift = xpos - (float) floor(xpos); stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong // because this API is really for baking character bitmaps into textures. if you want to render // a sequence of characters, you really need to render each bitmap to a temp buffer, then // "alpha blend" that into the working buffer xpos += (advance * scale); if (text[ch+1]) xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); ++ch; } for (j=0; j < 20; ++j) { for (i=0; i < 78; ++i) putchar(" .:ioVM@"[screen[j][i]>>5]); putchar('\n'); } return 0; } #endif ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //// //// INTEGRATION WITH YOUR CODEBASE //// //// The following sections allow you to supply alternate definitions //// of C library functions used by stb_truetype. #ifdef STB_TRUETYPE_IMPLEMENTATION // #define your own (u)stbtt_int8/16/32 before including to override this #ifndef stbtt_uint8 typedef unsigned char stbtt_uint8; typedef signed char stbtt_int8; typedef unsigned short stbtt_uint16; typedef signed short stbtt_int16; typedef unsigned int stbtt_uint32; typedef signed int stbtt_int32; #endif typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; // #define your own STBTT_sort() to override this to avoid qsort #ifndef STBTT_sort #include #define STBTT_sort(data,num_items,item_size,compare_func) qsort(data,num_items,item_size,compare_func) #endif // #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h #ifndef STBTT_ifloor #include #define STBTT_ifloor(x) ((int) floor(x)) #define STBTT_iceil(x) ((int) ceil(x)) #endif // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h #ifndef STBTT_malloc #include #define STBTT_malloc(x,u) malloc(x) #define STBTT_free(x,u) free(x) #endif #ifndef STBTT_assert #include #define STBTT_assert(x) assert(x) #endif #ifndef STBTT_strlen #include #define STBTT_strlen(x) strlen(x) #endif #ifndef STBTT_memcpy #include #define STBTT_memcpy memcpy #define STBTT_memset memset #endif #endif /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// //// //// INTERFACE //// //// #ifndef __STB_INCLUDE_STB_TRUETYPE_H__ #define __STB_INCLUDE_STB_TRUETYPE_H__ #ifdef __cplusplus extern "C" { #endif ////////////////////////////////////////////////////////////////////////////// // // TEXTURE BAKING API // // If you use this API, you only have to call two functions ever. // typedef struct { unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap float xoff,yoff,xadvance; } stbtt_bakedchar; extern int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) float pixel_height, // height of font in pixels unsigned char *pixels, int pw, int ph, // bitmap to be filled in int first_char, int num_chars, // characters to bake stbtt_bakedchar *chardata); // you allocate this, it's num_chars long // if return is positive, the first unused row of the bitmap // if return is negative, returns the negative of the number of characters that fit // if return is 0, no characters fit and no rows were used // This uses a very crappy packing. typedef struct { float x0,y0,s0,t0; // top-left float x1,y1,s1,t1; // bottom-right } stbtt_aligned_quad; extern void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, // same data as above int char_index, // character to display float *xpos, float *ypos, // pointers to current position in screen pixel space stbtt_aligned_quad *q, // output: quad to draw int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier // Call GetBakedQuad with char_index = 'character - first_char', and it // creates the quad you need to draw and advances the current position. // // The coordinate system used assumes y increases downwards. // // Characters will extend both above and below the current position; // see discussion of "BASELINE" above. // // It's inefficient; you might want to c&p it and optimize it. ////////////////////////////////////////////////////////////////////////////// // // FONT LOADING // // extern int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); // Each .ttf/.ttc file may have more than one font. Each font has a sequential // index number starting from 0. Call this function to get the font offset for // a given index; it returns -1 if the index is out of range. A regular .ttf // file will only define one font and it always be at offset 0, so it will // return '0' for index 0, and -1 for all other indices. You can just skip // this step if you know it's that kind of font. // The following structure is defined publically so you can declare one on // the stack or as a global or etc, but you should treat it as opaque. typedef struct stbtt_fontinfo { void * userdata; unsigned char * data; // pointer to .ttf file int fontstart; // offset of start of font int numGlyphs; // number of glyphs, needed for range checking int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf int index_map; // a cmap mapping for our chosen character encoding int indexToLocFormat; // format needed to map from glyph index to glyph } stbtt_fontinfo; extern int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); // Given an offset into the file that defines a font, this function builds // the necessary cached info for the rest of the system. You must allocate // the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't // need to do anything special to free it, because the contents are pure // value data with no additional data structures. Returns 0 on failure. ////////////////////////////////////////////////////////////////////////////// // // CHARACTER TO GLYPH-INDEX CONVERSIOn int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); // If you're going to perform multiple operations on the same character // and you want a speed-up, call this function with the character you're // going to process, then use glyph-based functions instead of the // codepoint-based functions. ////////////////////////////////////////////////////////////////////////////// // // CHARACTER PROPERTIES // extern float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); // computes a scale factor to produce a font whose "height" is 'pixels' tall. // Height is measured as the distance from the highest ascender to the lowest // descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics // and computing: // scale = pixels / (ascent - descent) // so if you prefer to measure height by the ascent only, use a similar calculation. extern float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); // computes a scale factor to produce a font whose EM size is mapped to // 'pixels' tall. This is probably what traditional APIs compute, but // I'm not positive. extern void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); // ascent is the coordinate above the baseline the font extends; descent // is the coordinate below the baseline the font extends (i.e. it is typically negative) // lineGap is the spacing between one row's descent and the next row's ascent... // so you should advance the vertical position by "*ascent - *descent + *lineGap" // these are expressed in unscaled coordinates, so you must multiply by // the scale factor for a given size extern void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); // the bounding box around all possible characters extern void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); // leftSideBearing is the offset from the current horizontal position to the left edge of the character // advanceWidth is the offset from the current horizontal position to the next horizontal position // these are expressed in unscaled coordinates extern int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); // an additional amount to add to the 'advance' value between ch1 and ch2 // @TODO; for now always returns 0! extern int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); // Gets the bounding box of the visible part of the glyph, in unscaled coordinates extern void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); extern int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); extern int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); // as above, but takes one or more glyph indices for greater efficiency ////////////////////////////////////////////////////////////////////////////// // // GLYPH SHAPES (you probably don't need these, but they have to go before // the bitmaps for C declaration-order reasons) // #ifndef STBTT_vmove // you can predefine these to use different values (but why?) enum { STBTT_vmove=1, STBTT_vline, STBTT_vcurve }; #endif #ifndef stbtt_vertex // you can predefine this to use different values // (we share this with other code at RAD) #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file typedef struct { stbtt_vertex_type x,y,cx,cy; unsigned char type,padding; } stbtt_vertex; #endif extern int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); // returns non-zero if nothing is drawn for this glyph extern int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); extern int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); // returns # of vertices and fills *vertices with the pointer to them // these are expressed in "unscaled" coordinates extern void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); // frees the data allocated above ////////////////////////////////////////////////////////////////////////////// // // BITMAP RENDERING // extern void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); // frees the bitmap allocated below extern unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); // allocates a large-enough single-channel 8bpp bitmap and renders the // specified character/glyph at the specified scale into it, with // antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). // *width & *height are filled out with the width & height of the bitmap, // which is stored left-to-right, top-to-bottom. // // xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap extern unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); // the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel // shift for the character extern void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); // the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap // in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap // is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the // width and height and positioning info for it first. extern void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); // same as stbtt_MakeCodepointBitmap, but you can specify a subpixel // shift for the character extern void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); // get the bbox of the bitmap centered around the glyph origin; so the // bitmap width is ix1-ix0, height is iy1-iy0, and location to place // the bitmap top left is (leftSideBearing*scale,iy0). // (Note that the bitmap uses y-increases-down, but the shape uses // y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) extern void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); // same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel // shift for the character // the following functions are equivalent to the above functions, but operate // on glyph indices instead of Unicode codepoints (for efficiency) extern unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); extern unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); extern void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); extern void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); extern void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); extern void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); // @TODO: don't expose this structure typedef struct { int w,h,stride; unsigned char *pixels; } stbtt__bitmap; extern void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata); ////////////////////////////////////////////////////////////////////////////// // // Finding the right font... // // You should really just solve this offline, keep your own tables // of what font is what, and don't try to get it out of the .ttf file. // That's because getting it out of the .ttf file is really hard, because // the names in the file can appear in many possible encodings, in many // possible languages, and e.g. if you need a case-insensitive comparison, // the details of that depend on the encoding & language in a complex way // (actually underspecified in truetype, but also gigantic). // // But you can use the provided functions in two possible ways: // stbtt_FindMatchingFont() will use *case-sensitive* comparisons on // unicode-encoded names to try to find the font you want; // you can run this before calling stbtt_InitFont() // // stbtt_GetFontNameString() lets you get any of the various strings // from the file yourself and do your own comparisons on them. // You have to have called stbtt_InitFont() first. extern int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); // returns the offset (not index) of the font that matches, or -1 if none // if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". // if you use any other flag, use a font name like "Arial"; this checks // the 'macStyle' header field; i don't know if fonts set this consistently #define STBTT_MACSTYLE_DONTCARE 0 #define STBTT_MACSTYLE_BOLD 1 #define STBTT_MACSTYLE_ITALIC 2 #define STBTT_MACSTYLE_UNDERSCORE 4 #define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 extern int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); // returns 1/0 whether the first string interpreted as utf8 is identical to // the second string interpreted as big-endian utf16... useful for strings from next func extern const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); // returns the string (which may be big-endian double byte, e.g. for unicode) // and puts the length in bytes in *length. // // some of the values for the IDs are below; for more see the truetype spec: // http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html // http://www.microsoft.com/typography/otspec/name.htm enum { // platformID STBTT_PLATFORM_ID_UNICODE =0, STBTT_PLATFORM_ID_MAC =1, STBTT_PLATFORM_ID_ISO =2, STBTT_PLATFORM_ID_MICROSOFT =3 }; enum { // encodingID for STBTT_PLATFORM_ID_UNICODE STBTT_UNICODE_EID_UNICODE_1_0 =0, STBTT_UNICODE_EID_UNICODE_1_1 =1, STBTT_UNICODE_EID_ISO_10646 =2, STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 }; enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT STBTT_MS_EID_SYMBOL =0, STBTT_MS_EID_UNICODE_BMP =1, STBTT_MS_EID_SHIFTJIS =2, STBTT_MS_EID_UNICODE_FULL =10 }; enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 }; enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D }; enum { // languageID for STBTT_PLATFORM_ID_MAC STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 }; #ifdef __cplusplus } #endif #endif // __STB_INCLUDE_STB_TRUETYPE_H__ /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// //// //// IMPLEMENTATION //// //// #ifdef STB_TRUETYPE_IMPLEMENTATION ////////////////////////////////////////////////////////////////////////// // // accessors to parse data from file // // on platforms that don't allow misaligned reads, if we want to allow // truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE #define ttBYTE(p) (* (stbtt_uint8 *) (p)) #define ttCHAR(p) (* (stbtt_int8 *) (p)) #define ttFixed(p) ttLONG(p) #if defined(STB_TRUETYPE_BIGENDIAN) && !defined(ALLOW_UNALIGNED_TRUETYPE) #define ttUSHORT(p) (* (stbtt_uint16 *) (p)) #define ttSHORT(p) (* (stbtt_int16 *) (p)) #define ttULONG(p) (* (stbtt_uint32 *) (p)) #define ttLONG(p) (* (stbtt_int32 *) (p)) #else stbtt_uint16 ttUSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; } stbtt_int16 ttSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; } stbtt_uint32 ttULONG(const stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } stbtt_int32 ttLONG(const stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } #endif #define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) #define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) static int stbtt__isfont(const stbtt_uint8 *font) { // check the version number if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 return 0; } // @OPTIMIZE: binary search static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) { stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); stbtt_uint32 tabledir = fontstart + 12; stbtt_int32 i; for (i=0; i < num_tables; ++i) { stbtt_uint32 loc = tabledir + 16*i; if (stbtt_tag(data+loc+0, tag)) return ttULONG(data+loc+8); } return 0; } int stbtt_GetFontOffsetForIndex(const unsigned char *font_collection, int index) { // if it's just a font, there's only one valid index if (stbtt__isfont(font_collection)) return index == 0 ? 0 : -1; // check if it's a TTC if (stbtt_tag(font_collection, "ttcf")) { // version 1? if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { stbtt_int32 n = ttLONG(font_collection+8); if (index >= n) return -1; return ttULONG(font_collection+12+index*14); } } return -1; } int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data2, int fontstart) { stbtt_uint8 *data = (stbtt_uint8 *) data2; stbtt_uint32 cmap, t; stbtt_int32 i,numTables; info->data = data; info->fontstart = fontstart; cmap = stbtt__find_table(data, fontstart, "cmap"); // required info->loca = stbtt__find_table(data, fontstart, "loca"); // required info->head = stbtt__find_table(data, fontstart, "head"); // required info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required info->kern = stbtt__find_table(data, fontstart, "kern"); // not required if (!cmap || !info->loca || !info->head || !info->glyf || !info->hhea || !info->hmtx) return 0; t = stbtt__find_table(data, fontstart, "maxp"); if (t) info->numGlyphs = ttUSHORT(data+t+4); else info->numGlyphs = 0xffff; // find a cmap encoding table we understand *now* to avoid searching // later. (todo: could make this installable) // the same regardless of glyph. numTables = ttUSHORT(data + cmap + 2); info->index_map = 0; for (i=0; i < numTables; ++i) { stbtt_uint32 encoding_record = cmap + 4 + 8 * i; // find an encoding we understand: switch(ttUSHORT(data+encoding_record)) { case STBTT_PLATFORM_ID_MICROSOFT: switch (ttUSHORT(data+encoding_record+2)) { case STBTT_MS_EID_UNICODE_BMP: case STBTT_MS_EID_UNICODE_FULL: // MS/Unicode info->index_map = cmap + ttULONG(data+encoding_record+4); break; } break; } } if (info->index_map == 0) return 0; info->indexToLocFormat = ttUSHORT(data+info->head + 50); return 1; } int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) { stbtt_uint8 *data = info->data; stbtt_uint32 index_map = info->index_map; stbtt_uint16 format = ttUSHORT(data + index_map + 0); if (format == 0) { // apple byte encoding stbtt_int32 bytes = ttUSHORT(data + index_map + 2); if (unicode_codepoint < bytes-6) return ttBYTE(data + index_map + 6 + unicode_codepoint); return 0; } else if (format == 6) { stbtt_uint32 first = ttUSHORT(data + index_map + 6); stbtt_uint32 count = ttUSHORT(data + index_map + 8); if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); return 0; } else if (format == 2) { STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean return 0; } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; stbtt_uint16 item, offset, start, end; // do a binary search of the segments stbtt_uint32 endCount = index_map + 14; stbtt_uint32 search = endCount; if (unicode_codepoint > 0xffff) return 0; // they lie from endCount .. endCount + segCount // but searchRange is the nearest power of two, so... if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) search += rangeShift*2; // now decrement to bias correctly to find smallest search -= 2; while (entrySelector) { stbtt_uint16 start, end; searchRange >>= 1; start = ttUSHORT(data + search + 2 + segcount*2 + 2); end = ttUSHORT(data + search + 2); start = ttUSHORT(data + search + searchRange*2 + segcount*2 + 2); end = ttUSHORT(data + search + searchRange*2); if (unicode_codepoint > end) search += searchRange*2; --entrySelector; } search += 2; item = (stbtt_uint16) ((search - endCount) >> 1); STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item)); start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); end = ttUSHORT(data + index_map + 14 + 2 + 2*item); if (unicode_codepoint < start) return 0; offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); if (offset == 0) return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); } else if (format == 12 || format == 13) { stbtt_uint32 ngroups = ttULONG(data+index_map+12); stbtt_int32 low,high; low = 0; high = (stbtt_int32)ngroups; // Binary search the right group. while (low < high) { stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); if ((stbtt_uint32) unicode_codepoint < start_char) high = mid; else if ((stbtt_uint32) unicode_codepoint > end_char) low = mid+1; else { stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); if (format == 12) return start_glyph + unicode_codepoint-start_char; else // format == 13 return start_glyph; } } return 0; // not found } // @TODO STBTT_assert(0); return 0; } int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) { return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); } static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) { v->type = type; v->x = (stbtt_int16) x; v->y = (stbtt_int16) y; v->cx = (stbtt_int16) cx; v->cy = (stbtt_int16) cy; } static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) { int g1,g2; if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format if (info->indexToLocFormat == 0) { g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; } else { g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); } return g1==g2 ? -1 : g1; // if length is 0, return -1 } int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) { int g = stbtt__GetGlyfOffset(info, glyph_index); if (g < 0) return 0; if (x0) *x0 = ttSHORT(info->data + g + 2); if (y0) *y0 = ttSHORT(info->data + g + 4); if (x1) *x1 = ttSHORT(info->data + g + 6); if (y1) *y1 = ttSHORT(info->data + g + 8); return 1; } int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) { return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); } int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) { stbtt_int16 numberOfContours; int g = stbtt__GetGlyfOffset(info, glyph_index); if (g < 0) return 1; numberOfContours = ttSHORT(info->data + g); return numberOfContours == 0; } static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) { if (start_off) { if (was_off) stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); } else { if (was_off) stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); else stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); } return num_vertices; } int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) { stbtt_int16 numberOfContours; stbtt_uint8 *endPtsOfContours; stbtt_uint8 *data = info->data; stbtt_vertex *vertices=0; int num_vertices=0; int g = stbtt__GetGlyfOffset(info, glyph_index); *pvertices = NULL; if (g < 0) return 0; numberOfContours = ttSHORT(data + g); if (numberOfContours > 0) { stbtt_uint8 flags=0,flagcount; stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; stbtt_uint8 *points; endPtsOfContours = (data + g + 10); ins = ttUSHORT(data + g + 10 + numberOfContours * 2); points = data + g + 10 + numberOfContours * 2 + 2 + ins; n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); m = n + 2*numberOfContours; // a loose bound on how many vertices we might need vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); if (vertices == 0) return 0; next_move = 0; flagcount=0; // in first pass, we load uninterpreted data into the allocated array // above, shifted to the end of the array so we won't overwrite it when // we create our final data starting from the front off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated // first load flags for (i=0; i < n; ++i) { if (flagcount == 0) { flags = *points++; if (flags & 8) flagcount = *points++; } else --flagcount; vertices[off+i].type = flags; } // now load x coordinates x=0; for (i=0; i < n; ++i) { flags = vertices[off+i].type; if (flags & 2) { stbtt_int16 dx = *points++; x += (flags & 16) ? dx : -dx; // ??? } else { if (!(flags & 16)) { x = x + (stbtt_int16) (points[0]*256 + points[1]); points += 2; } } vertices[off+i].x = (stbtt_int16) x; } // now load y coordinates y=0; for (i=0; i < n; ++i) { flags = vertices[off+i].type; if (flags & 4) { stbtt_int16 dy = *points++; y += (flags & 32) ? dy : -dy; // ??? } else { if (!(flags & 32)) { y = y + (stbtt_int16) (points[0]*256 + points[1]); points += 2; } } vertices[off+i].y = (stbtt_int16) y; } // now convert them to our format num_vertices=0; sx = sy = cx = cy = scx = scy = 0; for (i=0; i < n; ++i) { flags = vertices[off+i].type; x = (stbtt_int16) vertices[off+i].x; y = (stbtt_int16) vertices[off+i].y; if (next_move == i) { if (i != 0) num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); // now start the new one start_off = !(flags & 1); if (start_off) { // if we start off with an off-curve point, then when we need to find a point on the curve // where we can start, and we need to save some state for when we wraparound. scx = x; scy = y; if (!(vertices[off+i+1].type & 1)) { // next point is also a curve point, so interpolate an on-point curve sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; } else { // otherwise just use the next point as our start point sx = (stbtt_int32) vertices[off+i+1].x; sy = (stbtt_int32) vertices[off+i+1].y; ++i; // we're using point i+1 as the starting point, so skip it } } else { sx = x; sy = y; } stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); was_off = 0; next_move = 1 + ttUSHORT(endPtsOfContours+j*2); ++j; } else { if (!(flags & 1)) { // if it's a curve if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); cx = x; cy = y; was_off = 1; } else { if (was_off) stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); else stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); was_off = 0; } } } num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); } else if (numberOfContours == -1) { // Compound shapes. int more = 1; stbtt_uint8 *comp = data + g + 10; num_vertices = 0; vertices = 0; while (more) { stbtt_uint16 flags, gidx; int comp_num_verts = 0, i; stbtt_vertex *comp_verts = 0, *tmp = 0; float mtx[6] = {1,0,0,1,0,0}, m, n; flags = ttSHORT(comp); comp+=2; gidx = ttSHORT(comp); comp+=2; if (flags & 2) { // XY values if (flags & 1) { // shorts mtx[4] = ttSHORT(comp); comp+=2; mtx[5] = ttSHORT(comp); comp+=2; } else { mtx[4] = ttCHAR(comp); comp+=1; mtx[5] = ttCHAR(comp); comp+=1; } } else { // @TODO handle matching point STBTT_assert(0); } if (flags & (1<<3)) { // WE_HAVE_A_SCALE mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; mtx[1] = mtx[2] = 0; } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; mtx[1] = mtx[2] = 0; mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; } // Find transformation scales. m = (float) sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); n = (float) sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); // Get indexed glyph. comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); if (comp_num_verts > 0) { // Transform vertices. for (i = 0; i < comp_num_verts; ++i) { stbtt_vertex* v = &comp_verts[i]; stbtt_vertex_type x,y; x=v->x; y=v->y; v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); x=v->cx; y=v->cy; v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); } // Append vertices. tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); if (!tmp) { if (vertices) STBTT_free(vertices, info->userdata); if (comp_verts) STBTT_free(comp_verts, info->userdata); return 0; } if (num_vertices > 0) memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); if (vertices) STBTT_free(vertices, info->userdata); vertices = tmp; STBTT_free(comp_verts, info->userdata); num_vertices += comp_num_verts; } // More components ? more = flags & (1<<5); } } else if (numberOfContours < 0) { // @TODO other compound variations? STBTT_assert(0); } else { // numberOfCounters == 0, do nothing } *pvertices = vertices; return num_vertices; } void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) { stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); if (glyph_index < numOfLongHorMetrics) { if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); } else { if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); } } int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) { stbtt_uint8 *data = info->data + info->kern; stbtt_uint32 needle, straw; int l, r, m; // we only look at the first table. it must be 'horizontal' and format 0. if (!info->kern) return 0; if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 return 0; if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format return 0; l = 0; r = ttUSHORT(data+10) - 1; needle = glyph1 << 16 | glyph2; while (l <= r) { m = (l + r) >> 1; straw = ttULONG(data+18+(m*6)); // note: unaligned read if (needle < straw) r = m - 1; else if (needle > straw) l = m + 1; else return ttSHORT(data+22+(m*6)); } return 0; } int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) { if (!info->kern) // if no kerning table, don't waste time looking up both codepoint->glyphs return 0; return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); } void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) { stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); } void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) { if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); if (descent) *descent = ttSHORT(info->data+info->hhea + 6); if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); } void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) { *x0 = ttSHORT(info->data + info->head + 36); *y0 = ttSHORT(info->data + info->head + 38); *x1 = ttSHORT(info->data + info->head + 40); *y1 = ttSHORT(info->data + info->head + 42); } float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) { int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); return (float) height / fheight; } float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) { int unitsPerEm = ttUSHORT(info->data + info->head + 18); return pixels / unitsPerEm; } void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) { STBTT_free(v, info->userdata); } ////////////////////////////////////////////////////////////////////////////// // // antialiasing software rasterizer // void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) { int x0,y0,x1,y1; if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) x0=y0=x1=y1=0; // e.g. space character // now move to integral bboxes (treating pixels as little squares, what pixels get touched)? if (ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); if (iy0) *iy0 = -STBTT_iceil (y1 * scale_y + shift_y); if (ix1) *ix1 = STBTT_iceil (x1 * scale_x + shift_x); if (iy1) *iy1 = -STBTT_ifloor(y0 * scale_y + shift_y); } void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) { stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); } void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) { stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); } void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) { stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); } typedef struct stbtt__edge { float x0,y0, x1,y1; int invert; } stbtt__edge; typedef struct stbtt__active_edge { int x,dx; float ey; struct stbtt__active_edge *next; int valid; } stbtt__active_edge; #define FIXSHIFT 10 #define FIX (1 << FIXSHIFT) #define FIXMASK (FIX-1) static stbtt__active_edge *new_active(stbtt__edge *e, int off_x, float start_point, void *userdata) { stbtt__active_edge *z = (stbtt__active_edge *) STBTT_malloc(sizeof(*z), userdata); // @TODO: make a pool of these!!! float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); STBTT_assert(e->y0 <= start_point); if (!z) return z; // round dx down to avoid going too far if (dxdy < 0) z->dx = -STBTT_ifloor(FIX * -dxdy); else z->dx = STBTT_ifloor(FIX * dxdy); z->x = STBTT_ifloor(FIX * (e->x0 + dxdy * (start_point - e->y0))); z->x -= off_x * FIX; z->ey = e->y1; z->next = 0; z->valid = e->invert ? 1 : -1; return z; } // note: this routine clips fills that extend off the edges... ideally this // wouldn't happen, but it could happen if the truetype glyph bounding boxes // are wrong, or if the user supplies a too-small bitmap static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) { // non-zero winding fill int x0=0, w=0; while (e) { if (w == 0) { // if we're currently at zero, we need to record the edge start point x0 = e->x; w += e->valid; } else { int x1 = e->x; w += e->valid; // if we went to zero, we need to draw if (w == 0) { int i = x0 >> FIXSHIFT; int j = x1 >> FIXSHIFT; if (i < len && j >= 0) { if (i == j) { // x0,x1 are the same pixel, so compute combined coverage scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> FIXSHIFT); } else { if (i >= 0) // add antialiasing for x0 scanline[i] = scanline[i] + (stbtt_uint8) (((FIX - (x0 & FIXMASK)) * max_weight) >> FIXSHIFT); else i = -1; // clip if (j < len) // add antialiasing for x1 scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & FIXMASK) * max_weight) >> FIXSHIFT); else j = len; // clip for (++i; i < j; ++i) // fill pixels between x0 and x1 scanline[i] = scanline[i] + (stbtt_uint8) max_weight; } } } } e = e->next; } } static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) { stbtt__active_edge *active = NULL; int y,j=0; int max_weight = (255 / vsubsample); // weight per vertical scanline int s; // vertical subsample index unsigned char scanline_data[512], *scanline; if (result->w > 512) scanline = (unsigned char *) STBTT_malloc(result->w, userdata); else scanline = scanline_data; y = off_y * vsubsample; e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; while (j < result->h) { STBTT_memset(scanline, 0, result->w); for (s=0; s < vsubsample; ++s) { // find center of pixel for this scanline float scan_y = y + 0.5f; stbtt__active_edge **step = &active; // update all active edges; // remove all active edges that terminate before the center of this scanline while (*step) { stbtt__active_edge * z = *step; if (z->ey <= scan_y) { *step = z->next; // delete from list STBTT_assert(z->valid); z->valid = 0; STBTT_free(z, userdata); } else { z->x += z->dx; // advance to position for current scanline step = &((*step)->next); // advance through list } } // resort the list if needed for(;;) { int changed=0; step = &active; while (*step && (*step)->next) { if ((*step)->x > (*step)->next->x) { stbtt__active_edge *t = *step; stbtt__active_edge *q = t->next; t->next = q->next; q->next = t; *step = q; changed = 1; } step = &(*step)->next; } if (!changed) break; } // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline while (e->y0 <= scan_y) { if (e->y1 > scan_y) { stbtt__active_edge *z = new_active(e, off_x, scan_y, userdata); // find insertion point if (active == NULL) active = z; else if (z->x < active->x) { // insert at front z->next = active; active = z; } else { // find thing to insert AFTER stbtt__active_edge *p = active; while (p->next && p->next->x < z->x) p = p->next; // at this point, p->next->x is NOT < z->x z->next = p->next; p->next = z; } } ++e; } // now process all active edges in XOR fashion if (active) stbtt__fill_active_edges(scanline, result->w, active, max_weight); ++y; } STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); ++j; } while (active) { stbtt__active_edge *z = active; active = active->next; STBTT_free(z, userdata); } if (scanline != scanline_data) STBTT_free(scanline, userdata); } static int stbtt__edge_compare(const void *p, const void *q) { stbtt__edge *a = (stbtt__edge *) p; stbtt__edge *b = (stbtt__edge *) q; if (a->y0 < b->y0) return -1; if (a->y0 > b->y0) return 1; return 0; } typedef struct { float x,y; } stbtt__point; static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) { float y_scale_inv = invert ? -scale_y : scale_y; stbtt__edge *e; int n,i,j,k,m; int vsubsample = result->h < 8 ? 15 : 5; // vsubsample should divide 255 evenly; otherwise we won't reach full opacity // now we have to blow out the windings into explicit edge lists n = 0; for (i=0; i < windings; ++i) n += wcount[i]; e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel if (e == 0) return; n = 0; m=0; for (i=0; i < windings; ++i) { stbtt__point *p = pts + m; m += wcount[i]; j = wcount[i]-1; for (k=0; k < wcount[i]; j=k++) { int a=k,b=j; // skip the edge if horizontal if (p[j].y == p[k].y) continue; // add edge from j to k to the list e[n].invert = 0; if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { e[n].invert = 1; a=j,b=k; } e[n].x0 = p[a].x * scale_x + shift_x; e[n].y0 = p[a].y * y_scale_inv * vsubsample + shift_y; e[n].x1 = p[b].x * scale_x + shift_x; e[n].y1 = p[b].y * y_scale_inv * vsubsample + shift_y; ++n; } } // now sort the edges by their highest point (should snap to integer, and then by x) STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); STBTT_free(e, userdata); } static void stbtt__add_point(stbtt__point *points, int n, float x, float y) { if (!points) return; // during first pass, it's unallocated points[n].x = x; points[n].y = y; } // tesselate until threshhold p is happy... @TODO warped to compensate for non-linear stretching static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) { // midpoint float mx = (x0 + 2*x1 + x2)/4; float my = (y0 + 2*y1 + y2)/4; // versus directly drawn line float dx = (x0+x2)/2 - mx; float dy = (y0+y2)/2 - my; if (n > 16) // 65536 segments on one curve better be enough! return 1; if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); } else { stbtt__add_point(points, *num_points,x2,y2); *num_points = *num_points+1; } return 1; } // returns number of contours stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) { stbtt__point *points=0; int num_points=0; float objspace_flatness_squared = objspace_flatness * objspace_flatness; int i,n=0,start=0, pass; // count how many "moves" there are to get the contour count for (i=0; i < num_verts; ++i) if (vertices[i].type == STBTT_vmove) ++n; *num_contours = n; if (n == 0) return 0; *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); if (*contour_lengths == 0) { *num_contours = 0; return 0; } // make two passes through the points so we don't need to realloc for (pass=0; pass < 2; ++pass) { float x=0,y=0; if (pass == 1) { points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); if (points == NULL) goto error; } num_points = 0; n= -1; for (i=0; i < num_verts; ++i) { switch (vertices[i].type) { case STBTT_vmove: // start the next contour if (n >= 0) (*contour_lengths)[n] = num_points - start; ++n; start = num_points; x = vertices[i].x, y = vertices[i].y; stbtt__add_point(points, num_points++, x,y); break; case STBTT_vline: x = vertices[i].x, y = vertices[i].y; stbtt__add_point(points, num_points++, x, y); break; case STBTT_vcurve: stbtt__tesselate_curve(points, &num_points, x,y, vertices[i].cx, vertices[i].cy, vertices[i].x, vertices[i].y, objspace_flatness_squared, 0); x = vertices[i].x, y = vertices[i].y; break; } } (*contour_lengths)[n] = num_points - start; } return points; error: STBTT_free(points, userdata); STBTT_free(*contour_lengths, userdata); *contour_lengths = 0; *num_contours = 0; return NULL; } void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) { float scale = scale_x > scale_y ? scale_y : scale_x; int winding_count, *winding_lengths; stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); if (windings) { stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); STBTT_free(winding_lengths, userdata); STBTT_free(windings, userdata); } } void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) { STBTT_free(bitmap, userdata); } unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) { int ix0,iy0,ix1,iy1; stbtt__bitmap gbm; stbtt_vertex *vertices; int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); if (scale_x == 0) scale_x = scale_y; if (scale_y == 0) { if (scale_x == 0) return NULL; scale_y = scale_x; } stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); // now we get the size gbm.w = (ix1 - ix0); gbm.h = (iy1 - iy0); gbm.pixels = NULL; // in case we error if (width ) *width = gbm.w; if (height) *height = gbm.h; if (xoff ) *xoff = ix0; if (yoff ) *yoff = iy0; if (gbm.w && gbm.h) { gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); if (gbm.pixels) { gbm.stride = gbm.w; stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); } } STBTT_free(vertices, info->userdata); return gbm.pixels; } unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) { return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); } void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) { int ix0,iy0; stbtt_vertex *vertices; int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); stbtt__bitmap gbm; stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); gbm.pixels = output; gbm.w = out_w; gbm.h = out_h; gbm.stride = out_stride; if (gbm.w && gbm.h) stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); STBTT_free(vertices, info->userdata); } void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) { stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); } unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) { return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); } void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) { stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); } unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) { return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); } void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) { stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); } ////////////////////////////////////////////////////////////////////////////// // // bitmap baking // // This is SUPER-CRAPPY packing to keep source code small extern int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) float pixel_height, // height of font in pixels unsigned char *pixels, int pw, int ph, // bitmap to be filled in int first_char, int num_chars, // characters to bake stbtt_bakedchar *chardata) { float scale; int x,y,bottom_y, i; stbtt_fontinfo f; stbtt_InitFont(&f, data, offset); STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels x=y=1; bottom_y = 1; scale = stbtt_ScaleForPixelHeight(&f, pixel_height); for (i=0; i < num_chars; ++i) { int advance, lsb, x0,y0,x1,y1,gw,gh; int g = stbtt_FindGlyphIndex(&f, first_char + i); stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); gw = x1-x0; gh = y1-y0; if (x + gw + 1 >= pw) y = bottom_y, x = 1; // advance to next row if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row return -i; STBTT_assert(x+gw < pw); STBTT_assert(y+gh < ph); stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); chardata[i].x0 = (stbtt_int16) x; chardata[i].y0 = (stbtt_int16) y; chardata[i].x1 = (stbtt_int16) (x + gw); chardata[i].y1 = (stbtt_int16) (y + gh); chardata[i].xadvance = scale * advance; chardata[i].xoff = (float) x0; chardata[i].yoff = (float) y0; x = x + gw + 2; if (y+gh+2 > bottom_y) bottom_y = y+gh+2; } return bottom_y; } void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) { float d3d_bias = opengl_fillrule ? 0 : -0.5f; float ipw = 1.0f / pw, iph = 1.0f / ph; stbtt_bakedchar *b = chardata + char_index; int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5); int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5); q->x0 = round_x + d3d_bias; q->y0 = round_y + d3d_bias; q->x1 = round_x + b->x1 - b->x0 + d3d_bias; q->y1 = round_y + b->y1 - b->y0 + d3d_bias; q->s0 = b->x0 * ipw; q->t0 = b->y0 * iph; q->s1 = b->x1 * ipw; q->t1 = b->y1 * iph; *xpos += b->xadvance; } ////////////////////////////////////////////////////////////////////////////// // // font name matching -- recommended not to use this // // check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(const stbtt_uint8 *s1, stbtt_int32 len1, const stbtt_uint8 *s2, stbtt_int32 len2) { stbtt_int32 i=0; // convert utf16 to utf8 and compare the results while converting while (len2) { stbtt_uint16 ch = s2[0]*256 + s2[1]; if (ch < 0x80) { if (i >= len1) return -1; if (s1[i++] != ch) return -1; } else if (ch < 0x800) { if (i+1 >= len1) return -1; if (s1[i++] != 0xc0 + (ch >> 6)) return -1; if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; } else if (ch >= 0xd800 && ch < 0xdc00) { stbtt_uint32 c; stbtt_uint16 ch2 = s2[2]*256 + s2[3]; if (i+3 >= len1) return -1; c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; if (s1[i++] != 0xf0 + (c >> 18)) return -1; if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; s2 += 2; // plus another 2 below len2 -= 2; } else if (ch >= 0xdc00 && ch < 0xe000) { return -1; } else { if (i+2 >= len1) return -1; if (s1[i++] != 0xe0 + (ch >> 12)) return -1; if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; } s2 += 2; len2 -= 2; } return i; } int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) { return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((const stbtt_uint8*) s1, len1, (const stbtt_uint8*) s2, len2); } // returns results in whatever encoding you request... but note that 2-byte encodings // will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) { stbtt_int32 i,count,stringOffset; stbtt_uint8 *fc = font->data; stbtt_uint32 offset = font->fontstart; stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); if (!nm) return NULL; count = ttUSHORT(fc+nm+2); stringOffset = nm + ttUSHORT(fc+nm+4); for (i=0; i < count; ++i) { stbtt_uint32 loc = nm + 6 + 12 * i; if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { *length = ttUSHORT(fc+loc+8); return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); } } return NULL; } static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) { stbtt_int32 i; stbtt_int32 count = ttUSHORT(fc+nm+2); stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); for (i=0; i < count; ++i) { stbtt_uint32 loc = nm + 6 + 12 * i; stbtt_int32 id = ttUSHORT(fc+loc+6); if (id == target_id) { // find the encoding stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); // is this a Unicode encoding? if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { stbtt_int32 slen = ttUSHORT(fc+loc+8), off = ttUSHORT(fc+loc+10); // check if there's a prefix match stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); if (matchlen >= 0) { // check for target_id+1 immediately following, with same encoding & language if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { stbtt_int32 slen = ttUSHORT(fc+loc+12+8), off = ttUSHORT(fc+loc+12+10); if (slen == 0) { if (matchlen == nlen) return 1; } else if (matchlen < nlen && name[matchlen] == ' ') { ++matchlen; if (stbtt_CompareUTF8toUTF16_bigendian((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) return 1; } } else { // if nothing immediately following if (matchlen == nlen) return 1; } } } // @TODO handle other encodings } } return 0; } static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) { stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); stbtt_uint32 nm,hd; if (!stbtt__isfont(fc+offset)) return 0; // check italics/bold/underline flags in macStyle... if (flags) { hd = stbtt__find_table(fc, offset, "head"); if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; } nm = stbtt__find_table(fc, offset, "name"); if (!nm) return 0; if (flags) { // if we checked the macStyle flags, then just check the family and ignore the subfamily if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; } else { if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; } return 0; } int stbtt_FindMatchingFont(const unsigned char *font_collection, const char *name_utf8, stbtt_int32 flags) { stbtt_int32 i; for (i=0;;++i) { stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); if (off < 0) return off; if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) return off; } } #endif // STB_TRUETYPE_IMPLEMENTATION numptyphysics-0.3.10/external/stb_loader/utf8decoder.h000066400000000000000000000030411425065123200230550ustar00rootroot00000000000000// Copyright (c) 2008-2009 Bjoern Hoehrmann // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. #define UTF8_ACCEPT 0 #define UTF8_REJECT 1 static const uint8_t utf8d[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 00..1f 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 20..3f 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 40..5f 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 60..7f 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, // 80..9f 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, // a0..bf 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // c0..df 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, // e0..ef 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, // f0..ff 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, // s0..s0 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,0,1,1,1,1,1,1, // s1..s2 1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, // s3..s4 1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, // s5..s6 1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // s7..s8 }; uint32_t inline utf8_decode(uint32_t* state, uint32_t* codep, uint32_t byte) { uint32_t type = utf8d[byte]; *codep = (*state != UTF8_ACCEPT) ? (byte & 0x3fu) | (*codep << 6) : (0xff >> type) & (byte); *state = utf8d[256 + *state*16 + type]; return *state; } numptyphysics-0.3.10/external/thp/000077500000000000000000000000001425065123200171475ustar00rootroot00000000000000numptyphysics-0.3.10/external/thp/thp_format.cpp000066400000000000000000000025731425065123200220250ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include "thp_format.h" #include #include #include std::string thp::format(const char *fmt, ...) { va_list ap; va_start(ap, fmt); char *tmp; vasprintf(&tmp, fmt, ap); std::string result = tmp; free(tmp); return result; } std::string thp::format(const std::string &fmt, ...) { va_list ap; va_start(ap, fmt); char *tmp; vasprintf(&tmp, fmt.c_str(), ap); std::string result = tmp; free(tmp); return result; } std::string thp::format(const thp::stringable &fmt, ...) { va_list ap; va_start(ap, fmt); char *tmp; vasprintf(&tmp, fmt.c_str(), ap); std::string result = tmp; free(tmp); return result; } numptyphysics-0.3.10/external/thp/thp_format.h000066400000000000000000000017741425065123200214740ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef THP_FORMAT_H #define THP_FORMAT_H #include #include namespace thp { class stringable { public: virtual const char *c_str() const = 0; }; /* allocating sprintf */ std::string format(const char *fmt, ...); std::string format(const std::string &fmt, ...); std::string format(const stringable &fmt, ...); }; /* namespace thp */ #endif /* THP_FORMAT_H */ numptyphysics-0.3.10/external/thp/thp_iterutils.cpp000066400000000000000000000046431425065123200225610ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #if 0 exec clang++ -std=c++11 -DTHP_ITERUTILS_TEST -o thp_iterutils_test -x c++ $0 #endif #include "thp_iterutils.h" namespace thp { std::string _trim(const std::string &stdstr) { const char *str = stdstr.c_str(); const char *end = str + strlen(str) - 1; while (*str && isspace(*str)) { str++; } while (end > str && isspace(*end)) { end--; } return std::string(str, end + 1); } std::vector split(const std::string &text, const std::string &sep) { std::vector result; char *tmp = strdup(text.c_str()); char *saveptr = NULL; char *c = strtok_r(tmp, sep.c_str(), &saveptr); while (c != NULL) { result.push_back(c); c = strtok_r(NULL, sep.c_str(), &saveptr); } free(tmp); return result; } }; // namespace thp #if defined(THP_ITERUTILS_TEST) int main(int argc, char *argv[]) { int a, b; thp::unpack({&a, &b}) = {3, 4}; std::cerr << "Got: a = " << a << ", b = " << b << std::endl; std::string c, d; thp::unpack({&c, &d}) = thp::split("stroke:#ff00ff", ":"); std::cerr << "Got: c = " << c << ", d = " << d << std::endl; try { std::string e, f; thp::unpack({&e, &f}) = {"A", "B", "C"}; } catch (thp::UnpackException e) { std::cerr << "Cannot unpack, expected " << e.targets << ", got " << e.values << std::endl; } std::string g, h; std::vector rest; thp::unpack({&g, &h}, &rest) = thp::split("a;b;c;d;e;f", ";"); std::cerr << "g = " << g << ", h = " << h << ", rest size = " << rest.size() << std::endl; std::string k, v; thp::unpack({&k, &v}) = thp::map(thp::trim, thp::split(" stroke: #ff00ff ", ":")); std::cerr << "Got: '" << k << "', '" << v << "'" << std::endl; } #endif /* defined(THP_ITERUTILS_TEST) */ numptyphysics-0.3.10/external/thp/thp_iterutils.h000066400000000000000000000045741425065123200222310ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef THP_ITERUTILS_H #define THP_ITERUTILS_H #include #include #include #include #include namespace thp { class UnpackException { public: UnpackException(const std::string &message, int values, int targets) : message(message) , values(values) , targets(targets) { } std::string message; int values; int targets; }; template class Unpacker { public: Unpacker(std::initializer_list l, std::vector *rest=nullptr) : m_targets(l), m_rest(rest) {} Unpacker &operator=(std::vector values) { if ((m_rest == nullptr && values.size() != m_targets.size()) || values.size() < m_targets.size()) { throw UnpackException("Unpack fails", values.size(), m_targets.size()); } for (int i=0; ipush_back(values[i]); } } return *this; } private: std::vector m_targets; std::vector *m_rest; }; template Unpacker unpack(std::initializer_list l, std::vector *rest=nullptr) { return Unpacker(l, rest); } std::string _trim(const std::string &stdstr); std::vector split(const std::string &text, const std::string &sep); static std::function trim = _trim; template C map(std::function function, const C &sequence) { C result; for (const T &v: sequence) { result.push_back(function(v)); } return result; } }; // namespace thp #endif /* THP_ITERUTILS_H */ numptyphysics-0.3.10/external/thp/thp_timestep.cpp000066400000000000000000000024001425065123200223540ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "thp_timestep.h" thp::Timestep::Timestep(float fps) : fps(fps) , tick_last(0) , tick_accumulator(0) , paused_start(-1) , running_time(0) { } void thp::Timestep::update(long now, std::function callback) { tick_accumulator += (now - tick_last); tick_last = now; long ticks = 1000 / fps; while (tick_accumulator > ticks) { callback(); tick_accumulator -= ticks; running_time += ticks; } } void thp::Timestep::paused() { } void thp::Timestep::resumed(long now) { // Empty the accumulator, so we don't fast-forward tick_accumulator = 0; tick_last = now; } numptyphysics-0.3.10/external/thp/thp_timestep.h000066400000000000000000000030021425065123200220200ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef THP_TIMESTEP_H #define THP_TIMESTEP_H #include namespace thp { class Timestep { public: Timestep(float fps); void update(long now, std::function callback); // Number of milliseconds in a tick int ms_per_tick() { return int(1000.f / fps); } // 0..1: Partial step between current and next step right now float partial() { return (float)tick_accumulator * fps / 1000.f; } // Pause and resume support void paused(); void resumed(long now); bool is_paused() { return paused_start != -1; } // Running time without pauses long runtime() { return running_time + tick_accumulator; } private: float fps; long tick_last; long tick_accumulator; long paused_start; long running_time; }; }; /* namespace thp */ #endif /* THP_TIMESTEP_H */ numptyphysics-0.3.10/external/tinyxml2/000077500000000000000000000000001425065123200201425ustar00rootroot00000000000000numptyphysics-0.3.10/external/tinyxml2/tinyxml2.cpp000066400000000000000000001511211425065123200224350ustar00rootroot00000000000000/* Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "tinyxml2.h" #include // yes, this one new style header, is in the Android SDK. # ifdef ANDROID_NDK # include #else # include #endif static const char LINE_FEED = (char)0x0a; // all line endings are normalized to LF static const char LF = LINE_FEED; static const char CARRIAGE_RETURN = (char)0x0d; // CR gets filtered out static const char CR = CARRIAGE_RETURN; static const char SINGLE_QUOTE = '\''; static const char DOUBLE_QUOTE = '\"'; // Bunch of unicode info at: // http://www.unicode.org/faq/utf_bom.html // ef bb bf (Microsoft "lead bytes") - designates UTF-8 static const unsigned char TIXML_UTF_LEAD_0 = 0xefU; static const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; static const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; namespace tinyxml2 { struct Entity { const char* pattern; int length; char value; }; static const int NUM_ENTITIES = 5; static const Entity entities[NUM_ENTITIES] = { { "quot", 4, DOUBLE_QUOTE }, { "amp", 3, '&' }, { "apos", 4, SINGLE_QUOTE }, { "lt", 2, '<' }, { "gt", 2, '>' } }; StrPair::~StrPair() { Reset(); } void StrPair::Reset() { if ( _flags & NEEDS_DELETE ) { delete [] _start; } _flags = 0; _start = 0; _end = 0; } void StrPair::SetStr( const char* str, int flags ) { Reset(); size_t len = strlen( str ); _start = new char[ len+1 ]; memcpy( _start, str, len+1 ); _end = _start + len; _flags = flags | NEEDS_DELETE; } char* StrPair::ParseText( char* p, const char* endTag, int strFlags ) { TIXMLASSERT( endTag && *endTag ); char* start = p; char endChar = *endTag; size_t length = strlen( endTag ); // Inner loop of text parsing. while ( *p ) { if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) { Set( start, p, strFlags ); return p + length; } ++p; } return 0; } char* StrPair::ParseName( char* p ) { char* start = p; if ( !start || !(*start) ) { return 0; } while( *p && ( p == start ? XMLUtil::IsNameStartChar( *p ) : XMLUtil::IsNameChar( *p ) )) { ++p; } if ( p > start ) { Set( start, p, 0 ); return p; } return 0; } void StrPair::CollapseWhitespace() { // Adjusting _start would cause undefined behavior on delete[] TIXMLASSERT( ( _flags & NEEDS_DELETE ) == 0 ); // Trim leading space. _start = XMLUtil::SkipWhiteSpace( _start ); if ( _start && *_start ) { char* p = _start; // the read pointer char* q = _start; // the write pointer while( *p ) { if ( XMLUtil::IsWhiteSpace( *p )) { p = XMLUtil::SkipWhiteSpace( p ); if ( *p == 0 ) { break; // don't write to q; this trims the trailing space. } *q = ' '; ++q; } *q = *p; ++q; ++p; } *q = 0; } } const char* StrPair::GetStr() { if ( _flags & NEEDS_FLUSH ) { *_end = 0; _flags ^= NEEDS_FLUSH; if ( _flags ) { char* p = _start; // the read pointer char* q = _start; // the write pointer while( p < _end ) { if ( (_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) { // CR-LF pair becomes LF // CR alone becomes LF // LF-CR becomes LF if ( *(p+1) == LF ) { p += 2; } else { ++p; } *q++ = LF; } else if ( (_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) { if ( *(p+1) == CR ) { p += 2; } else { ++p; } *q++ = LF; } else if ( (_flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) { // Entities handled by tinyXML2: // - special entities in the entity table [in/out] // - numeric character reference [in] // 中 or 中 if ( *(p+1) == '#' ) { const int buflen = 10; char buf[buflen] = { 0 }; int len = 0; p = const_cast( XMLUtil::GetCharacterRef( p, buf, &len ) ); TIXMLASSERT( 0 <= len && len <= buflen ); TIXMLASSERT( q + len <= p ); memcpy( q, buf, len ); q += len; } else { int i=0; for(; i(p); // Check for BOM: if ( *(pu+0) == TIXML_UTF_LEAD_0 && *(pu+1) == TIXML_UTF_LEAD_1 && *(pu+2) == TIXML_UTF_LEAD_2 ) { *bom = true; p += 3; } return p; } void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) { const unsigned long BYTE_MASK = 0xBF; const unsigned long BYTE_MARK = 0x80; const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; if (input < 0x80) { *length = 1; } else if ( input < 0x800 ) { *length = 2; } else if ( input < 0x10000 ) { *length = 3; } else if ( input < 0x200000 ) { *length = 4; } else { *length = 0; // This code won't covert this correctly anyway. return; } output += *length; // Scary scary fall throughs. switch (*length) { case 4: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 3: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 2: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 1: --output; *output = (char)(input | FIRST_BYTE_MARK[*length]); default: break; } } const char* XMLUtil::GetCharacterRef( const char* p, char* value, int* length ) { // Presume an entity, and pull it out. *length = 0; if ( *(p+1) == '#' && *(p+2) ) { unsigned long ucs = 0; ptrdiff_t delta = 0; unsigned mult = 1; if ( *(p+2) == 'x' ) { // Hexadecimal. if ( !*(p+3) ) { return 0; } const char* q = p+3; q = strchr( q, ';' ); if ( !q || !*q ) { return 0; } delta = q-p; --q; while ( *q != 'x' ) { if ( *q >= '0' && *q <= '9' ) { ucs += mult * (*q - '0'); } else if ( *q >= 'a' && *q <= 'f' ) { ucs += mult * (*q - 'a' + 10); } else if ( *q >= 'A' && *q <= 'F' ) { ucs += mult * (*q - 'A' + 10 ); } else { return 0; } mult *= 16; --q; } } else { // Decimal. if ( !*(p+2) ) { return 0; } const char* q = p+2; q = strchr( q, ';' ); if ( !q || !*q ) { return 0; } delta = q-p; --q; while ( *q != '#' ) { if ( *q >= '0' && *q <= '9' ) { ucs += mult * (*q - '0'); } else { return 0; } mult *= 10; --q; } } // convert the UCS to UTF-8 ConvertUTF32ToUTF8( ucs, value, length ); return p + delta + 1; } return p+1; } void XMLUtil::ToStr( int v, char* buffer, int bufferSize ) { TIXML_SNPRINTF( buffer, bufferSize, "%d", v ); } void XMLUtil::ToStr( unsigned v, char* buffer, int bufferSize ) { TIXML_SNPRINTF( buffer, bufferSize, "%u", v ); } void XMLUtil::ToStr( bool v, char* buffer, int bufferSize ) { TIXML_SNPRINTF( buffer, bufferSize, "%d", v ? 1 : 0 ); } /* ToStr() of a number is a very tricky topic. https://github.com/leethomason/tinyxml2/issues/106 */ void XMLUtil::ToStr( float v, char* buffer, int bufferSize ) { TIXML_SNPRINTF( buffer, bufferSize, "%.8g", v ); } void XMLUtil::ToStr( double v, char* buffer, int bufferSize ) { TIXML_SNPRINTF( buffer, bufferSize, "%.17g", v ); } bool XMLUtil::ToInt( const char* str, int* value ) { if ( TIXML_SSCANF( str, "%d", value ) == 1 ) { return true; } return false; } bool XMLUtil::ToUnsigned( const char* str, unsigned *value ) { if ( TIXML_SSCANF( str, "%u", value ) == 1 ) { return true; } return false; } bool XMLUtil::ToBool( const char* str, bool* value ) { int ival = 0; if ( ToInt( str, &ival )) { *value = (ival==0) ? false : true; return true; } if ( StringEqual( str, "true" ) ) { *value = true; return true; } else if ( StringEqual( str, "false" ) ) { *value = false; return true; } return false; } bool XMLUtil::ToFloat( const char* str, float* value ) { if ( TIXML_SSCANF( str, "%f", value ) == 1 ) { return true; } return false; } bool XMLUtil::ToDouble( const char* str, double* value ) { if ( TIXML_SSCANF( str, "%lf", value ) == 1 ) { return true; } return false; } char* XMLDocument::Identify( char* p, XMLNode** node ) { XMLNode* returnNode = 0; char* start = p; p = XMLUtil::SkipWhiteSpace( p ); if( !p || !*p ) { return p; } // What is this thing? // These strings define the matching patters: static const char* xmlHeader = { "_memPool = &_commentPool; p += xmlHeaderLen; } else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) { returnNode = new (_commentPool.Alloc()) XMLComment( this ); returnNode->_memPool = &_commentPool; p += commentHeaderLen; } else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) { XMLText* text = new (_textPool.Alloc()) XMLText( this ); returnNode = text; returnNode->_memPool = &_textPool; p += cdataHeaderLen; text->SetCData( true ); } else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) { returnNode = new (_commentPool.Alloc()) XMLUnknown( this ); returnNode->_memPool = &_commentPool; p += dtdHeaderLen; } else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) { returnNode = new (_elementPool.Alloc()) XMLElement( this ); returnNode->_memPool = &_elementPool; p += elementHeaderLen; } else { returnNode = new (_textPool.Alloc()) XMLText( this ); returnNode->_memPool = &_textPool; p = start; // Back it up, all the text counts. } *node = returnNode; return p; } bool XMLDocument::Accept( XMLVisitor* visitor ) const { if ( visitor->VisitEnter( *this ) ) { for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) { if ( !node->Accept( visitor ) ) { break; } } } return visitor->VisitExit( *this ); } // --------- XMLNode ----------- // XMLNode::XMLNode( XMLDocument* doc ) : _document( doc ), _parent( 0 ), _firstChild( 0 ), _lastChild( 0 ), _prev( 0 ), _next( 0 ), _memPool( 0 ) { } XMLNode::~XMLNode() { DeleteChildren(); if ( _parent ) { _parent->Unlink( this ); } } const char* XMLNode::Value() const { return _value.GetStr(); } void XMLNode::SetValue( const char* str, bool staticMem ) { if ( staticMem ) { _value.SetInternedStr( str ); } else { _value.SetStr( str ); } } void XMLNode::DeleteChildren() { while( _firstChild ) { XMLNode* node = _firstChild; Unlink( node ); DeleteNode( node ); } _firstChild = _lastChild = 0; } void XMLNode::Unlink( XMLNode* child ) { if ( child == _firstChild ) { _firstChild = _firstChild->_next; } if ( child == _lastChild ) { _lastChild = _lastChild->_prev; } if ( child->_prev ) { child->_prev->_next = child->_next; } if ( child->_next ) { child->_next->_prev = child->_prev; } child->_parent = 0; } void XMLNode::DeleteChild( XMLNode* node ) { TIXMLASSERT( node->_parent == this ); DeleteNode( node ); } XMLNode* XMLNode::InsertEndChild( XMLNode* addThis ) { if (addThis->_document != _document) return 0; if (addThis->_parent) addThis->_parent->Unlink( addThis ); else addThis->_memPool->SetTracked(); if ( _lastChild ) { TIXMLASSERT( _firstChild ); TIXMLASSERT( _lastChild->_next == 0 ); _lastChild->_next = addThis; addThis->_prev = _lastChild; _lastChild = addThis; addThis->_next = 0; } else { TIXMLASSERT( _firstChild == 0 ); _firstChild = _lastChild = addThis; addThis->_prev = 0; addThis->_next = 0; } addThis->_parent = this; return addThis; } XMLNode* XMLNode::InsertFirstChild( XMLNode* addThis ) { if (addThis->_document != _document) return 0; if (addThis->_parent) addThis->_parent->Unlink( addThis ); else addThis->_memPool->SetTracked(); if ( _firstChild ) { TIXMLASSERT( _lastChild ); TIXMLASSERT( _firstChild->_prev == 0 ); _firstChild->_prev = addThis; addThis->_next = _firstChild; _firstChild = addThis; addThis->_prev = 0; } else { TIXMLASSERT( _lastChild == 0 ); _firstChild = _lastChild = addThis; addThis->_prev = 0; addThis->_next = 0; } addThis->_parent = this; return addThis; } XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ) { if (addThis->_document != _document) return 0; TIXMLASSERT( afterThis->_parent == this ); if ( afterThis->_parent != this ) { return 0; } if ( afterThis->_next == 0 ) { // The last node or the only node. return InsertEndChild( addThis ); } if (addThis->_parent) addThis->_parent->Unlink( addThis ); else addThis->_memPool->SetTracked(); addThis->_prev = afterThis; addThis->_next = afterThis->_next; afterThis->_next->_prev = addThis; afterThis->_next = addThis; addThis->_parent = this; return addThis; } const XMLElement* XMLNode::FirstChildElement( const char* value ) const { for( XMLNode* node=_firstChild; node; node=node->_next ) { XMLElement* element = node->ToElement(); if ( element ) { if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) { return element; } } } return 0; } const XMLElement* XMLNode::LastChildElement( const char* value ) const { for( XMLNode* node=_lastChild; node; node=node->_prev ) { XMLElement* element = node->ToElement(); if ( element ) { if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) { return element; } } } return 0; } const XMLElement* XMLNode::NextSiblingElement( const char* value ) const { for( XMLNode* node=this->_next; node; node = node->_next ) { const XMLElement* element = node->ToElement(); if ( element && (!value || XMLUtil::StringEqual( value, node->Value() ))) { return element; } } return 0; } const XMLElement* XMLNode::PreviousSiblingElement( const char* value ) const { for( XMLNode* node=_prev; node; node = node->_prev ) { const XMLElement* element = node->ToElement(); if ( element && (!value || XMLUtil::StringEqual( value, node->Value() ))) { return element; } } return 0; } char* XMLNode::ParseDeep( char* p, StrPair* parentEnd ) { // This is a recursive method, but thinking about it "at the current level" // it is a pretty simple flat list: // // // // With a special case: // // // // // Where the closing element (/foo) *must* be the next thing after the opening // element, and the names must match. BUT the tricky bit is that the closing // element will be read by the child. // // 'endTag' is the end tag for this node, it is returned by a call to a child. // 'parentEnd' is the end tag for the parent, which is filled in and returned. while( p && *p ) { XMLNode* node = 0; p = _document->Identify( p, &node ); if ( p == 0 || node == 0 ) { break; } StrPair endTag; p = node->ParseDeep( p, &endTag ); if ( !p ) { DeleteNode( node ); node = 0; if ( !_document->Error() ) { _document->SetError( XML_ERROR_PARSING, 0, 0 ); } break; } XMLElement* ele = node->ToElement(); // We read the end tag. Return it to the parent. if ( ele && ele->ClosingType() == XMLElement::CLOSING ) { if ( parentEnd ) { *parentEnd = static_cast(node)->_value; } node->_memPool->SetTracked(); // created and then immediately deleted. DeleteNode( node ); return p; } // Handle an end tag returned to this level. // And handle a bunch of annoying errors. if ( ele ) { if ( endTag.Empty() && ele->ClosingType() == XMLElement::OPEN ) { _document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 ); p = 0; } else if ( !endTag.Empty() && ele->ClosingType() != XMLElement::OPEN ) { _document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 ); p = 0; } else if ( !endTag.Empty() ) { if ( !XMLUtil::StringEqual( endTag.GetStr(), node->Value() )) { _document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 ); p = 0; } } } if ( p == 0 ) { DeleteNode( node ); node = 0; } if ( node ) { this->InsertEndChild( node ); } } return 0; } void XMLNode::DeleteNode( XMLNode* node ) { if ( node == 0 ) { return; } MemPool* pool = node->_memPool; node->~XMLNode(); pool->Free( node ); } // --------- XMLText ---------- // char* XMLText::ParseDeep( char* p, StrPair* ) { const char* start = p; if ( this->CData() ) { p = _value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION ); if ( !p ) { _document->SetError( XML_ERROR_PARSING_CDATA, start, 0 ); } return p; } else { int flags = _document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES; if ( _document->WhitespaceMode() == COLLAPSE_WHITESPACE ) { flags |= StrPair::COLLAPSE_WHITESPACE; } p = _value.ParseText( p, "<", flags ); if ( !p ) { _document->SetError( XML_ERROR_PARSING_TEXT, start, 0 ); } if ( p && *p ) { return p-1; } } return 0; } XMLNode* XMLText::ShallowClone( XMLDocument* doc ) const { if ( !doc ) { doc = _document; } XMLText* text = doc->NewText( Value() ); // fixme: this will always allocate memory. Intern? text->SetCData( this->CData() ); return text; } bool XMLText::ShallowEqual( const XMLNode* compare ) const { return ( compare->ToText() && XMLUtil::StringEqual( compare->ToText()->Value(), Value() )); } bool XMLText::Accept( XMLVisitor* visitor ) const { return visitor->Visit( *this ); } // --------- XMLComment ---------- // XMLComment::XMLComment( XMLDocument* doc ) : XMLNode( doc ) { } XMLComment::~XMLComment() { } char* XMLComment::ParseDeep( char* p, StrPair* ) { // Comment parses as text. const char* start = p; p = _value.ParseText( p, "-->", StrPair::COMMENT ); if ( p == 0 ) { _document->SetError( XML_ERROR_PARSING_COMMENT, start, 0 ); } return p; } XMLNode* XMLComment::ShallowClone( XMLDocument* doc ) const { if ( !doc ) { doc = _document; } XMLComment* comment = doc->NewComment( Value() ); // fixme: this will always allocate memory. Intern? return comment; } bool XMLComment::ShallowEqual( const XMLNode* compare ) const { const XMLComment* comment = compare->ToComment(); return ( comment && XMLUtil::StringEqual( comment->Value(), Value() )); } bool XMLComment::Accept( XMLVisitor* visitor ) const { return visitor->Visit( *this ); } // --------- XMLDeclaration ---------- // XMLDeclaration::XMLDeclaration( XMLDocument* doc ) : XMLNode( doc ) { } XMLDeclaration::~XMLDeclaration() { //printf( "~XMLDeclaration\n" ); } char* XMLDeclaration::ParseDeep( char* p, StrPair* ) { // Declaration parses as text. const char* start = p; p = _value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION ); if ( p == 0 ) { _document->SetError( XML_ERROR_PARSING_DECLARATION, start, 0 ); } return p; } XMLNode* XMLDeclaration::ShallowClone( XMLDocument* doc ) const { if ( !doc ) { doc = _document; } XMLDeclaration* dec = doc->NewDeclaration( Value() ); // fixme: this will always allocate memory. Intern? return dec; } bool XMLDeclaration::ShallowEqual( const XMLNode* compare ) const { const XMLDeclaration* declaration = compare->ToDeclaration(); return ( declaration && XMLUtil::StringEqual( declaration->Value(), Value() )); } bool XMLDeclaration::Accept( XMLVisitor* visitor ) const { return visitor->Visit( *this ); } // --------- XMLUnknown ---------- // XMLUnknown::XMLUnknown( XMLDocument* doc ) : XMLNode( doc ) { } XMLUnknown::~XMLUnknown() { } char* XMLUnknown::ParseDeep( char* p, StrPair* ) { // Unknown parses as text. const char* start = p; p = _value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION ); if ( !p ) { _document->SetError( XML_ERROR_PARSING_UNKNOWN, start, 0 ); } return p; } XMLNode* XMLUnknown::ShallowClone( XMLDocument* doc ) const { if ( !doc ) { doc = _document; } XMLUnknown* text = doc->NewUnknown( Value() ); // fixme: this will always allocate memory. Intern? return text; } bool XMLUnknown::ShallowEqual( const XMLNode* compare ) const { const XMLUnknown* unknown = compare->ToUnknown(); return ( unknown && XMLUtil::StringEqual( unknown->Value(), Value() )); } bool XMLUnknown::Accept( XMLVisitor* visitor ) const { return visitor->Visit( *this ); } // --------- XMLAttribute ---------- // const char* XMLAttribute::Name() const { return _name.GetStr(); } const char* XMLAttribute::Value() const { return _value.GetStr(); } char* XMLAttribute::ParseDeep( char* p, bool processEntities ) { // Parse using the name rules: bug fix, was using ParseText before p = _name.ParseName( p ); if ( !p || !*p ) { return 0; } // Skip white space before = p = XMLUtil::SkipWhiteSpace( p ); if ( !p || *p != '=' ) { return 0; } ++p; // move up to opening quote p = XMLUtil::SkipWhiteSpace( p ); if ( *p != '\"' && *p != '\'' ) { return 0; } char endTag[2] = { *p, 0 }; ++p; // move past opening quote p = _value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES ); return p; } void XMLAttribute::SetName( const char* n ) { _name.SetStr( n ); } XMLError XMLAttribute::QueryIntValue( int* value ) const { if ( XMLUtil::ToInt( Value(), value )) { return XML_NO_ERROR; } return XML_WRONG_ATTRIBUTE_TYPE; } XMLError XMLAttribute::QueryUnsignedValue( unsigned int* value ) const { if ( XMLUtil::ToUnsigned( Value(), value )) { return XML_NO_ERROR; } return XML_WRONG_ATTRIBUTE_TYPE; } XMLError XMLAttribute::QueryBoolValue( bool* value ) const { if ( XMLUtil::ToBool( Value(), value )) { return XML_NO_ERROR; } return XML_WRONG_ATTRIBUTE_TYPE; } XMLError XMLAttribute::QueryFloatValue( float* value ) const { if ( XMLUtil::ToFloat( Value(), value )) { return XML_NO_ERROR; } return XML_WRONG_ATTRIBUTE_TYPE; } XMLError XMLAttribute::QueryDoubleValue( double* value ) const { if ( XMLUtil::ToDouble( Value(), value )) { return XML_NO_ERROR; } return XML_WRONG_ATTRIBUTE_TYPE; } void XMLAttribute::SetAttribute( const char* v ) { _value.SetStr( v ); } void XMLAttribute::SetAttribute( int v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); _value.SetStr( buf ); } void XMLAttribute::SetAttribute( unsigned v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); _value.SetStr( buf ); } void XMLAttribute::SetAttribute( bool v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); _value.SetStr( buf ); } void XMLAttribute::SetAttribute( double v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); _value.SetStr( buf ); } void XMLAttribute::SetAttribute( float v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); _value.SetStr( buf ); } // --------- XMLElement ---------- // XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ), _closingType( 0 ), _rootAttribute( 0 ) { } XMLElement::~XMLElement() { while( _rootAttribute ) { XMLAttribute* next = _rootAttribute->_next; DeleteAttribute( _rootAttribute ); _rootAttribute = next; } } XMLAttribute* XMLElement::FindAttribute( const char* name ) { for( XMLAttribute* a = _rootAttribute; a; a = a->_next ) { if ( XMLUtil::StringEqual( a->Name(), name ) ) { return a; } } return 0; } const XMLAttribute* XMLElement::FindAttribute( const char* name ) const { for( XMLAttribute* a = _rootAttribute; a; a = a->_next ) { if ( XMLUtil::StringEqual( a->Name(), name ) ) { return a; } } return 0; } const char* XMLElement::Attribute( const char* name, const char* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) { return 0; } if ( !value || XMLUtil::StringEqual( a->Value(), value )) { return a->Value(); } return 0; } const char* XMLElement::GetText() const { if ( FirstChild() && FirstChild()->ToText() ) { return FirstChild()->ToText()->Value(); } return 0; } void XMLElement::SetText( const char* inText ) { if ( FirstChild() && FirstChild()->ToText() ) FirstChild()->SetValue( inText ); else { XMLText* theText = GetDocument()->NewText( inText ); InsertFirstChild( theText ); } } void XMLElement::SetText( int v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); SetText( buf ); } void XMLElement::SetText( unsigned v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); SetText( buf ); } void XMLElement::SetText( bool v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); SetText( buf ); } void XMLElement::SetText( float v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); SetText( buf ); } void XMLElement::SetText( double v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); SetText( buf ); } XMLError XMLElement::QueryIntText( int* ival ) const { if ( FirstChild() && FirstChild()->ToText() ) { const char* t = FirstChild()->ToText()->Value(); if ( XMLUtil::ToInt( t, ival ) ) { return XML_SUCCESS; } return XML_CAN_NOT_CONVERT_TEXT; } return XML_NO_TEXT_NODE; } XMLError XMLElement::QueryUnsignedText( unsigned* uval ) const { if ( FirstChild() && FirstChild()->ToText() ) { const char* t = FirstChild()->ToText()->Value(); if ( XMLUtil::ToUnsigned( t, uval ) ) { return XML_SUCCESS; } return XML_CAN_NOT_CONVERT_TEXT; } return XML_NO_TEXT_NODE; } XMLError XMLElement::QueryBoolText( bool* bval ) const { if ( FirstChild() && FirstChild()->ToText() ) { const char* t = FirstChild()->ToText()->Value(); if ( XMLUtil::ToBool( t, bval ) ) { return XML_SUCCESS; } return XML_CAN_NOT_CONVERT_TEXT; } return XML_NO_TEXT_NODE; } XMLError XMLElement::QueryDoubleText( double* dval ) const { if ( FirstChild() && FirstChild()->ToText() ) { const char* t = FirstChild()->ToText()->Value(); if ( XMLUtil::ToDouble( t, dval ) ) { return XML_SUCCESS; } return XML_CAN_NOT_CONVERT_TEXT; } return XML_NO_TEXT_NODE; } XMLError XMLElement::QueryFloatText( float* fval ) const { if ( FirstChild() && FirstChild()->ToText() ) { const char* t = FirstChild()->ToText()->Value(); if ( XMLUtil::ToFloat( t, fval ) ) { return XML_SUCCESS; } return XML_CAN_NOT_CONVERT_TEXT; } return XML_NO_TEXT_NODE; } XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name ) { XMLAttribute* last = 0; XMLAttribute* attrib = 0; for( attrib = _rootAttribute; attrib; last = attrib, attrib = attrib->_next ) { if ( XMLUtil::StringEqual( attrib->Name(), name ) ) { break; } } if ( !attrib ) { attrib = new (_document->_attributePool.Alloc() ) XMLAttribute(); attrib->_memPool = &_document->_attributePool; if ( last ) { last->_next = attrib; } else { _rootAttribute = attrib; } attrib->SetName( name ); attrib->_memPool->SetTracked(); // always created and linked. } return attrib; } void XMLElement::DeleteAttribute( const char* name ) { XMLAttribute* prev = 0; for( XMLAttribute* a=_rootAttribute; a; a=a->_next ) { if ( XMLUtil::StringEqual( name, a->Name() ) ) { if ( prev ) { prev->_next = a->_next; } else { _rootAttribute = a->_next; } DeleteAttribute( a ); break; } prev = a; } } char* XMLElement::ParseAttributes( char* p ) { const char* start = p; XMLAttribute* prevAttribute = 0; // Read the attributes. while( p ) { p = XMLUtil::SkipWhiteSpace( p ); if ( !p || !(*p) ) { _document->SetError( XML_ERROR_PARSING_ELEMENT, start, Name() ); return 0; } // attribute. if (XMLUtil::IsNameStartChar( *p ) ) { XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute(); attrib->_memPool = &_document->_attributePool; attrib->_memPool->SetTracked(); p = attrib->ParseDeep( p, _document->ProcessEntities() ); if ( !p || Attribute( attrib->Name() ) ) { DeleteAttribute( attrib ); _document->SetError( XML_ERROR_PARSING_ATTRIBUTE, start, p ); return 0; } // There is a minor bug here: if the attribute in the source xml // document is duplicated, it will not be detected and the // attribute will be doubly added. However, tracking the 'prevAttribute' // avoids re-scanning the attribute list. Preferring performance for // now, may reconsider in the future. if ( prevAttribute ) { prevAttribute->_next = attrib; } else { _rootAttribute = attrib; } prevAttribute = attrib; } // end of the tag else if ( *p == '/' && *(p+1) == '>' ) { _closingType = CLOSED; return p+2; // done; sealed element. } // end of the tag else if ( *p == '>' ) { ++p; break; } else { _document->SetError( XML_ERROR_PARSING_ELEMENT, start, p ); return 0; } } return p; } void XMLElement::DeleteAttribute( XMLAttribute* attribute ) { if ( attribute == 0 ) { return; } MemPool* pool = attribute->_memPool; attribute->~XMLAttribute(); pool->Free( attribute ); } // // // foobar // char* XMLElement::ParseDeep( char* p, StrPair* strPair ) { // Read the element name. p = XMLUtil::SkipWhiteSpace( p ); if ( !p ) { return 0; } // The closing element is the form. It is // parsed just like a regular element then deleted from // the DOM. if ( *p == '/' ) { _closingType = CLOSING; ++p; } p = _value.ParseName( p ); if ( _value.Empty() ) { return 0; } p = ParseAttributes( p ); if ( !p || !*p || _closingType ) { return p; } p = XMLNode::ParseDeep( p, strPair ); return p; } XMLNode* XMLElement::ShallowClone( XMLDocument* doc ) const { if ( !doc ) { doc = _document; } XMLElement* element = doc->NewElement( Value() ); // fixme: this will always allocate memory. Intern? for( const XMLAttribute* a=FirstAttribute(); a; a=a->Next() ) { element->SetAttribute( a->Name(), a->Value() ); // fixme: this will always allocate memory. Intern? } return element; } bool XMLElement::ShallowEqual( const XMLNode* compare ) const { const XMLElement* other = compare->ToElement(); if ( other && XMLUtil::StringEqual( other->Value(), Value() )) { const XMLAttribute* a=FirstAttribute(); const XMLAttribute* b=other->FirstAttribute(); while ( a && b ) { if ( !XMLUtil::StringEqual( a->Value(), b->Value() ) ) { return false; } a = a->Next(); b = b->Next(); } if ( a || b ) { // different count return false; } return true; } return false; } bool XMLElement::Accept( XMLVisitor* visitor ) const { if ( visitor->VisitEnter( *this, _rootAttribute ) ) { for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) { if ( !node->Accept( visitor ) ) { break; } } } return visitor->VisitExit( *this ); } // --------- XMLDocument ----------- // // Warning: List must match 'enum XMLError' const char* XMLDocument::_errorNames[XML_ERROR_COUNT] = { "XML_SUCCESS", "XML_NO_ATTRIBUTE", "XML_WRONG_ATTRIBUTE_TYPE", "XML_ERROR_FILE_NOT_FOUND", "XML_ERROR_FILE_COULD_NOT_BE_OPENED", "XML_ERROR_FILE_READ_ERROR", "XML_ERROR_ELEMENT_MISMATCH", "XML_ERROR_PARSING_ELEMENT", "XML_ERROR_PARSING_ATTRIBUTE", "XML_ERROR_IDENTIFYING_TAG", "XML_ERROR_PARSING_TEXT", "XML_ERROR_PARSING_CDATA", "XML_ERROR_PARSING_COMMENT", "XML_ERROR_PARSING_DECLARATION", "XML_ERROR_PARSING_UNKNOWN", "XML_ERROR_EMPTY_DOCUMENT", "XML_ERROR_MISMATCHED_ELEMENT", "XML_ERROR_PARSING", "XML_CAN_NOT_CONVERT_TEXT", "XML_NO_TEXT_NODE" }; XMLDocument::XMLDocument( bool processEntities, Whitespace whitespace ) : XMLNode( 0 ), _writeBOM( false ), _processEntities( processEntities ), _errorID( XML_NO_ERROR ), _whitespace( whitespace ), _errorStr1( 0 ), _errorStr2( 0 ), _charBuffer( 0 ) { _document = this; // avoid warning about 'this' in initializer list } XMLDocument::~XMLDocument() { DeleteChildren(); delete [] _charBuffer; #if 0 _textPool.Trace( "text" ); _elementPool.Trace( "element" ); _commentPool.Trace( "comment" ); _attributePool.Trace( "attribute" ); #endif #ifdef DEBUG if ( Error() == false ) { TIXMLASSERT( _elementPool.CurrentAllocs() == _elementPool.Untracked() ); TIXMLASSERT( _attributePool.CurrentAllocs() == _attributePool.Untracked() ); TIXMLASSERT( _textPool.CurrentAllocs() == _textPool.Untracked() ); TIXMLASSERT( _commentPool.CurrentAllocs() == _commentPool.Untracked() ); } #endif } void XMLDocument::Clear() { DeleteChildren(); _errorID = XML_NO_ERROR; _errorStr1 = 0; _errorStr2 = 0; delete [] _charBuffer; _charBuffer = 0; } XMLElement* XMLDocument::NewElement( const char* name ) { XMLElement* ele = new (_elementPool.Alloc()) XMLElement( this ); ele->_memPool = &_elementPool; ele->SetName( name ); return ele; } XMLComment* XMLDocument::NewComment( const char* str ) { XMLComment* comment = new (_commentPool.Alloc()) XMLComment( this ); comment->_memPool = &_commentPool; comment->SetValue( str ); return comment; } XMLText* XMLDocument::NewText( const char* str ) { XMLText* text = new (_textPool.Alloc()) XMLText( this ); text->_memPool = &_textPool; text->SetValue( str ); return text; } XMLDeclaration* XMLDocument::NewDeclaration( const char* str ) { XMLDeclaration* dec = new (_commentPool.Alloc()) XMLDeclaration( this ); dec->_memPool = &_commentPool; dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" ); return dec; } XMLUnknown* XMLDocument::NewUnknown( const char* str ) { XMLUnknown* unk = new (_commentPool.Alloc()) XMLUnknown( this ); unk->_memPool = &_commentPool; unk->SetValue( str ); return unk; } static FILE* callfopen( const char* filepath, const char* mode ) { #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) FILE* fp = 0; errno_t err = fopen_s( &fp, filepath, mode ); if ( err ) { return 0; } #else FILE* fp = fopen( filepath, mode ); #endif return fp; } XMLError XMLDocument::LoadFile( const char* filename ) { Clear(); FILE* fp = callfopen( filename, "rb" ); if ( !fp ) { SetError( XML_ERROR_FILE_NOT_FOUND, filename, 0 ); return _errorID; } LoadFile( fp ); fclose( fp ); return _errorID; } XMLError XMLDocument::LoadFile( FILE* fp ) { Clear(); fseek( fp, 0, SEEK_SET ); if ( fgetc( fp ) == EOF && ferror( fp ) != 0 ) { SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); return _errorID; } fseek( fp, 0, SEEK_END ); const long filelength = ftell( fp ); fseek( fp, 0, SEEK_SET ); if ( filelength == -1L ) { SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); return _errorID; } const size_t size = filelength; if ( size == 0 ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } _charBuffer = new char[size+1]; size_t read = fread( _charBuffer, 1, size, fp ); if ( read != size ) { SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); return _errorID; } _charBuffer[size] = 0; const char* p = _charBuffer; p = XMLUtil::SkipWhiteSpace( p ); p = XMLUtil::ReadBOM( p, &_writeBOM ); if ( !p || !*p ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } ParseDeep( _charBuffer + (p-_charBuffer), 0 ); return _errorID; } XMLError XMLDocument::SaveFile( const char* filename, bool compact ) { FILE* fp = callfopen( filename, "w" ); if ( !fp ) { SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, filename, 0 ); return _errorID; } SaveFile(fp, compact); fclose( fp ); return _errorID; } XMLError XMLDocument::SaveFile( FILE* fp, bool compact ) { XMLPrinter stream( fp, compact ); Print( &stream ); return _errorID; } XMLError XMLDocument::Parse( const char* p, size_t len ) { const char* start = p; Clear(); if ( len == 0 || !p || !*p ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } if ( len == (size_t)(-1) ) { len = strlen( p ); } _charBuffer = new char[ len+1 ]; memcpy( _charBuffer, p, len ); _charBuffer[len] = 0; p = XMLUtil::SkipWhiteSpace( p ); p = XMLUtil::ReadBOM( p, &_writeBOM ); if ( !p || !*p ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } ptrdiff_t delta = p - start; // skip initial whitespace, BOM, etc. ParseDeep( _charBuffer+delta, 0 ); return _errorID; } void XMLDocument::Print( XMLPrinter* streamer ) const { XMLPrinter stdStreamer( stdout ); if ( !streamer ) { streamer = &stdStreamer; } Accept( streamer ); } void XMLDocument::SetError( XMLError error, const char* str1, const char* str2 ) { _errorID = error; _errorStr1 = str1; _errorStr2 = str2; } const char* XMLDocument::ErrorName() const { TIXMLASSERT(_errorID >= 0 && _errorID < XML_ERROR_COUNT ); return _errorNames[_errorID]; } void XMLDocument::PrintError() const { if ( _errorID ) { static const int LEN = 20; char buf1[LEN] = { 0 }; char buf2[LEN] = { 0 }; if ( _errorStr1 ) { TIXML_SNPRINTF( buf1, LEN, "%s", _errorStr1 ); } if ( _errorStr2 ) { TIXML_SNPRINTF( buf2, LEN, "%s", _errorStr2 ); } printf( "XMLDocument error id=%d '%s' str1=%s str2=%s\n", _errorID, ErrorName(), buf1, buf2 ); } } XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth ) : _elementJustOpened( false ), _firstElement( true ), _fp( file ), _depth( depth ), _textDepth( -1 ), _processEntities( true ), _compactMode( compact ) { for( int i=0; i'] = true; // not required, but consistency is nice _buffer.Push( 0 ); } void XMLPrinter::Print( const char* format, ... ) { va_list va; va_start( va, format ); if ( _fp ) { vfprintf( _fp, format, va ); } else { #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) #if defined(WINCE) int len = 512; do { len = len*2; char* str = new char[len](); len = _vsnprintf(str, len, format, va); delete[] str; }while (len < 0); #else int len = _vscprintf( format, va ); #endif #else int len = vsnprintf( 0, 0, format, va ); #endif // Close out and re-start the va-args va_end( va ); va_start( va, format ); char* p = _buffer.PushArr( len ) - 1; // back up over the null terminator. #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) #if defined(WINCE) _vsnprintf( p, len+1, format, va ); #else vsnprintf_s( p, len+1, _TRUNCATE, format, va ); #endif #else vsnprintf( p, len+1, format, va ); #endif } va_end( va ); } void XMLPrinter::PrintSpace( int depth ) { for( int i=0; i 0 && *q < ENTITY_RANGE ) { // Check for entities. If one is found, flush // the stream up until the entity, write the // entity, and keep looking. if ( flag[(unsigned)(*q)] ) { while ( p < q ) { Print( "%c", *p ); ++p; } for( int i=0; i 0) ) { Print( "%s", p ); } } void XMLPrinter::PushHeader( bool writeBOM, bool writeDec ) { if ( writeBOM ) { static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 }; Print( "%s", bom ); } if ( writeDec ) { PushDeclaration( "xml version=\"1.0\"" ); } } void XMLPrinter::OpenElement( const char* name, bool compactMode ) { if ( _elementJustOpened ) { SealElement(); } _stack.Push( name ); if ( _textDepth < 0 && !_firstElement && !compactMode ) { Print( "\n" ); } if ( !compactMode ) { PrintSpace( _depth ); } Print( "<%s", name ); _elementJustOpened = true; _firstElement = false; ++_depth; } void XMLPrinter::PushAttribute( const char* name, const char* value ) { TIXMLASSERT( _elementJustOpened ); Print( " %s=\"", name ); PrintString( value, false ); Print( "\"" ); } void XMLPrinter::PushAttribute( const char* name, int v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); PushAttribute( name, buf ); } void XMLPrinter::PushAttribute( const char* name, unsigned v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); PushAttribute( name, buf ); } void XMLPrinter::PushAttribute( const char* name, bool v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); PushAttribute( name, buf ); } void XMLPrinter::PushAttribute( const char* name, double v ) { char buf[BUF_SIZE]; XMLUtil::ToStr( v, buf, BUF_SIZE ); PushAttribute( name, buf ); } void XMLPrinter::CloseElement( bool compactMode ) { --_depth; const char* name = _stack.Pop(); if ( _elementJustOpened ) { Print( "/>" ); } else { if ( _textDepth < 0 && !compactMode) { Print( "\n" ); PrintSpace( _depth ); } Print( "", name ); } if ( _textDepth == _depth ) { _textDepth = -1; } if ( _depth == 0 && !compactMode) { Print( "\n" ); } _elementJustOpened = false; } void XMLPrinter::SealElement() { _elementJustOpened = false; Print( ">" ); } void XMLPrinter::PushText( const char* text, bool cdata ) { _textDepth = _depth-1; if ( _elementJustOpened ) { SealElement(); } if ( cdata ) { Print( "" ); } else { PrintString( text, true ); } } void XMLPrinter::PushText( int value ) { char buf[BUF_SIZE]; XMLUtil::ToStr( value, buf, BUF_SIZE ); PushText( buf, false ); } void XMLPrinter::PushText( unsigned value ) { char buf[BUF_SIZE]; XMLUtil::ToStr( value, buf, BUF_SIZE ); PushText( buf, false ); } void XMLPrinter::PushText( bool value ) { char buf[BUF_SIZE]; XMLUtil::ToStr( value, buf, BUF_SIZE ); PushText( buf, false ); } void XMLPrinter::PushText( float value ) { char buf[BUF_SIZE]; XMLUtil::ToStr( value, buf, BUF_SIZE ); PushText( buf, false ); } void XMLPrinter::PushText( double value ) { char buf[BUF_SIZE]; XMLUtil::ToStr( value, buf, BUF_SIZE ); PushText( buf, false ); } void XMLPrinter::PushComment( const char* comment ) { if ( _elementJustOpened ) { SealElement(); } if ( _textDepth < 0 && !_firstElement && !_compactMode) { Print( "\n" ); PrintSpace( _depth ); } _firstElement = false; Print( "", comment ); } void XMLPrinter::PushDeclaration( const char* value ) { if ( _elementJustOpened ) { SealElement(); } if ( _textDepth < 0 && !_firstElement && !_compactMode) { Print( "\n" ); PrintSpace( _depth ); } _firstElement = false; Print( "", value ); } void XMLPrinter::PushUnknown( const char* value ) { if ( _elementJustOpened ) { SealElement(); } if ( _textDepth < 0 && !_firstElement && !_compactMode) { Print( "\n" ); PrintSpace( _depth ); } _firstElement = false; Print( "", value ); } bool XMLPrinter::VisitEnter( const XMLDocument& doc ) { _processEntities = doc.ProcessEntities(); if ( doc.HasBOM() ) { PushHeader( true, false ); } return true; } bool XMLPrinter::VisitEnter( const XMLElement& element, const XMLAttribute* attribute ) { const XMLElement* parentElem = element.Parent()->ToElement(); bool compactMode = parentElem ? CompactMode(*parentElem) : _compactMode; OpenElement( element.Name(), compactMode ); while ( attribute ) { PushAttribute( attribute->Name(), attribute->Value() ); attribute = attribute->Next(); } return true; } bool XMLPrinter::VisitExit( const XMLElement& element ) { CloseElement( CompactMode(element) ); return true; } bool XMLPrinter::Visit( const XMLText& text ) { PushText( text.Value(), text.CData() ); return true; } bool XMLPrinter::Visit( const XMLComment& comment ) { PushComment( comment.Value() ); return true; } bool XMLPrinter::Visit( const XMLDeclaration& declaration ) { PushDeclaration( declaration.Value() ); return true; } bool XMLPrinter::Visit( const XMLUnknown& unknown ) { PushUnknown( unknown.Value() ); return true; } } // namespace tinyxml2 numptyphysics-0.3.10/external/tinyxml2/tinyxml2.h000066400000000000000000001663761425065123200221240ustar00rootroot00000000000000/* Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef TINYXML2_INCLUDED #define TINYXML2_INCLUDED #if defined(ANDROID_NDK) || defined(__BORLANDC__) # include # include # include # include # include # include #else # include # include # include # include # include # include #endif /* TODO: intern strings instead of allocation. */ /* gcc: g++ -Wall -DDEBUG tinyxml2.cpp xmltest.cpp -o gccxmltest.exe Formatting, Artistic Style: AStyle.exe --style=1tbs --indent-switches --break-closing-brackets --indent-preprocessor tinyxml2.cpp tinyxml2.h */ #if defined( _DEBUG ) || defined( DEBUG ) || defined (__DEBUG__) # ifndef DEBUG # define DEBUG # endif #endif #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable: 4251) #endif #ifdef _WIN32 # ifdef TINYXML2_EXPORT # define TINYXML2_LIB __declspec(dllexport) # elif defined(TINYXML2_IMPORT) # define TINYXML2_LIB __declspec(dllimport) # else # define TINYXML2_LIB # endif #else # define TINYXML2_LIB #endif #if defined(DEBUG) # if defined(_MSC_VER) # define TIXMLASSERT( x ) if ( !(x)) { __debugbreak(); } //if ( !(x)) WinDebugBreak() # elif defined (ANDROID_NDK) # include # define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); } # else # include # define TIXMLASSERT assert # endif # else # define TIXMLASSERT( x ) {} #endif #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) // Microsoft visual studio, version 2005 and higher. /*int _snprintf_s( char *buffer, size_t sizeOfBuffer, size_t count, const char *format [, argument] ... );*/ inline int TIXML_SNPRINTF( char* buffer, size_t size, const char* format, ... ) { va_list va; va_start( va, format ); int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); va_end( va ); return result; } #define TIXML_SSCANF sscanf_s #elif defined WINCE #define TIXML_SNPRINTF _snprintf #define TIXML_SSCANF sscanf #else // GCC version 3 and higher //#warning( "Using sn* functions." ) #define TIXML_SNPRINTF snprintf #define TIXML_SSCANF sscanf #endif /* Versioning, past 1.0.14: http://semver.org/ */ static const int TIXML2_MAJOR_VERSION = 2; static const int TIXML2_MINOR_VERSION = 2; static const int TIXML2_PATCH_VERSION = 0; namespace tinyxml2 { class XMLDocument; class XMLElement; class XMLAttribute; class XMLComment; class XMLText; class XMLDeclaration; class XMLUnknown; class XMLPrinter; /* A class that wraps strings. Normally stores the start and end pointers into the XML file itself, and will apply normalization and entity translation if actually read. Can also store (and memory manage) a traditional char[] */ class StrPair { public: enum { NEEDS_ENTITY_PROCESSING = 0x01, NEEDS_NEWLINE_NORMALIZATION = 0x02, COLLAPSE_WHITESPACE = 0x04, TEXT_ELEMENT = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, TEXT_ELEMENT_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, ATTRIBUTE_NAME = 0, ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, COMMENT = NEEDS_NEWLINE_NORMALIZATION }; StrPair() : _flags( 0 ), _start( 0 ), _end( 0 ) {} ~StrPair(); void Set( char* start, char* end, int flags ) { Reset(); _start = start; _end = end; _flags = flags | NEEDS_FLUSH; } const char* GetStr(); bool Empty() const { return _start == _end; } void SetInternedStr( const char* str ) { Reset(); _start = const_cast(str); } void SetStr( const char* str, int flags=0 ); char* ParseText( char* in, const char* endTag, int strFlags ); char* ParseName( char* in ); private: void Reset(); void CollapseWhitespace(); enum { NEEDS_FLUSH = 0x100, NEEDS_DELETE = 0x200 }; // After parsing, if *_end != 0, it can be set to zero. int _flags; char* _start; char* _end; }; /* A dynamic array of Plain Old Data. Doesn't support constructors, etc. Has a small initial memory pool, so that low or no usage will not cause a call to new/delete */ template class DynArray { public: DynArray< T, INIT >() { _mem = _pool; _allocated = INIT; _size = 0; } ~DynArray() { if ( _mem != _pool ) { delete [] _mem; } } void Clear() { _size = 0; } void Push( T t ) { EnsureCapacity( _size+1 ); _mem[_size++] = t; } T* PushArr( int count ) { EnsureCapacity( _size+count ); T* ret = &_mem[_size]; _size += count; return ret; } T Pop() { return _mem[--_size]; } void PopArr( int count ) { TIXMLASSERT( _size >= count ); _size -= count; } bool Empty() const { return _size == 0; } T& operator[](int i) { TIXMLASSERT( i>= 0 && i < _size ); return _mem[i]; } const T& operator[](int i) const { TIXMLASSERT( i>= 0 && i < _size ); return _mem[i]; } const T& PeekTop() const { TIXMLASSERT( _size > 0 ); return _mem[ _size - 1]; } int Size() const { return _size; } int Capacity() const { return _allocated; } const T* Mem() const { return _mem; } T* Mem() { return _mem; } private: void EnsureCapacity( int cap ) { if ( cap > _allocated ) { int newAllocated = cap * 2; T* newMem = new T[newAllocated]; memcpy( newMem, _mem, sizeof(T)*_size ); // warning: not using constructors, only works for PODs if ( _mem != _pool ) { delete [] _mem; } _mem = newMem; _allocated = newAllocated; } } T* _mem; T _pool[INIT]; int _allocated; // objects allocated int _size; // number objects in use }; /* Parent virtual class of a pool for fast allocation and deallocation of objects. */ class MemPool { public: MemPool() {} virtual ~MemPool() {} virtual int ItemSize() const = 0; virtual void* Alloc() = 0; virtual void Free( void* ) = 0; virtual void SetTracked() = 0; }; /* Template child class to create pools of the correct type. */ template< int SIZE > class MemPoolT : public MemPool { public: MemPoolT() : _root(0), _currentAllocs(0), _nAllocs(0), _maxAllocs(0), _nUntracked(0) {} ~MemPoolT() { // Delete the blocks. for( int i=0; i<_blockPtrs.Size(); ++i ) { delete _blockPtrs[i]; } } virtual int ItemSize() const { return SIZE; } int CurrentAllocs() const { return _currentAllocs; } virtual void* Alloc() { if ( !_root ) { // Need a new block. Block* block = new Block(); _blockPtrs.Push( block ); for( int i=0; ichunk[i].next = &block->chunk[i+1]; } block->chunk[COUNT-1].next = 0; _root = block->chunk; } void* result = _root; _root = _root->next; ++_currentAllocs; if ( _currentAllocs > _maxAllocs ) { _maxAllocs = _currentAllocs; } _nAllocs++; _nUntracked++; return result; } virtual void Free( void* mem ) { if ( !mem ) { return; } --_currentAllocs; Chunk* chunk = static_cast( mem ); #ifdef DEBUG memset( chunk, 0xfe, sizeof(Chunk) ); #endif chunk->next = _root; _root = chunk; } void Trace( const char* name ) { printf( "Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n", name, _maxAllocs, _maxAllocs*SIZE/1024, _currentAllocs, SIZE, _nAllocs, _blockPtrs.Size() ); } void SetTracked() { _nUntracked--; } int Untracked() const { return _nUntracked; } // This number is perf sensitive. 4k seems like a good tradeoff on my machine. // The test file is large, 170k. // Release: VS2010 gcc(no opt) // 1k: 4000 // 2k: 4000 // 4k: 3900 21000 // 16k: 5200 // 32k: 4300 // 64k: 4000 21000 enum { COUNT = (4*1024)/SIZE }; // Some compilers do not accept to use COUNT in private part if COUNT is private private: union Chunk { Chunk* next; char mem[SIZE]; }; struct Block { Chunk chunk[COUNT]; }; DynArray< Block*, 10 > _blockPtrs; Chunk* _root; int _currentAllocs; int _nAllocs; int _maxAllocs; int _nUntracked; }; /** Implements the interface to the "Visitor pattern" (see the Accept() method.) If you call the Accept() method, it requires being passed a XMLVisitor class to handle callbacks. For nodes that contain other nodes (Document, Element) you will get called with a VisitEnter/VisitExit pair. Nodes that are always leafs are simply called with Visit(). If you return 'true' from a Visit method, recursive parsing will continue. If you return false, no children of this node or its siblings will be visited. All flavors of Visit methods have a default implementation that returns 'true' (continue visiting). You need to only override methods that are interesting to you. Generally Accept() is called on the XMLDocument, although all nodes support visiting. You should never change the document from a callback. @sa XMLNode::Accept() */ class TINYXML2_LIB XMLVisitor { public: virtual ~XMLVisitor() {} /// Visit a document. virtual bool VisitEnter( const XMLDocument& /*doc*/ ) { return true; } /// Visit a document. virtual bool VisitExit( const XMLDocument& /*doc*/ ) { return true; } /// Visit an element. virtual bool VisitEnter( const XMLElement& /*element*/, const XMLAttribute* /*firstAttribute*/ ) { return true; } /// Visit an element. virtual bool VisitExit( const XMLElement& /*element*/ ) { return true; } /// Visit a declaration. virtual bool Visit( const XMLDeclaration& /*declaration*/ ) { return true; } /// Visit a text node. virtual bool Visit( const XMLText& /*text*/ ) { return true; } /// Visit a comment node. virtual bool Visit( const XMLComment& /*comment*/ ) { return true; } /// Visit an unknown node. virtual bool Visit( const XMLUnknown& /*unknown*/ ) { return true; } }; // WARNING: must match XMLErrorNames[] enum XMLError { XML_SUCCESS = 0, XML_NO_ERROR = 0, XML_NO_ATTRIBUTE, XML_WRONG_ATTRIBUTE_TYPE, XML_ERROR_FILE_NOT_FOUND, XML_ERROR_FILE_COULD_NOT_BE_OPENED, XML_ERROR_FILE_READ_ERROR, XML_ERROR_ELEMENT_MISMATCH, XML_ERROR_PARSING_ELEMENT, XML_ERROR_PARSING_ATTRIBUTE, XML_ERROR_IDENTIFYING_TAG, XML_ERROR_PARSING_TEXT, XML_ERROR_PARSING_CDATA, XML_ERROR_PARSING_COMMENT, XML_ERROR_PARSING_DECLARATION, XML_ERROR_PARSING_UNKNOWN, XML_ERROR_EMPTY_DOCUMENT, XML_ERROR_MISMATCHED_ELEMENT, XML_ERROR_PARSING, XML_CAN_NOT_CONVERT_TEXT, XML_NO_TEXT_NODE, XML_ERROR_COUNT }; /* Utility functionality. */ class XMLUtil { public: // Anything in the high order range of UTF-8 is assumed to not be whitespace. This isn't // correct, but simple, and usually works. static const char* SkipWhiteSpace( const char* p ) { while( !IsUTF8Continuation(*p) && isspace( *reinterpret_cast(p) ) ) { ++p; } return p; } static char* SkipWhiteSpace( char* p ) { while( !IsUTF8Continuation(*p) && isspace( *reinterpret_cast(p) ) ) { ++p; } return p; } static bool IsWhiteSpace( char p ) { return !IsUTF8Continuation(p) && isspace( static_cast(p) ); } inline static bool IsNameStartChar( unsigned char ch ) { return ( ( ch < 128 ) ? isalpha( ch ) : 1 ) || ch == ':' || ch == '_'; } inline static bool IsNameChar( unsigned char ch ) { return IsNameStartChar( ch ) || isdigit( ch ) || ch == '.' || ch == '-'; } inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) { int n = 0; if ( p == q ) { return true; } while( *p && *q && *p == *q && n(const_cast(this)->FirstChildElement( value )); } /// Get the last child node, or null if none exists. const XMLNode* LastChild() const { return _lastChild; } XMLNode* LastChild() { return const_cast(const_cast(this)->LastChild() ); } /** Get the last child element or optionally the last child element with the specified name. */ const XMLElement* LastChildElement( const char* value=0 ) const; XMLElement* LastChildElement( const char* value=0 ) { return const_cast(const_cast(this)->LastChildElement(value) ); } /// Get the previous (left) sibling node of this node. const XMLNode* PreviousSibling() const { return _prev; } XMLNode* PreviousSibling() { return _prev; } /// Get the previous (left) sibling element of this node, with an optionally supplied name. const XMLElement* PreviousSiblingElement( const char* value=0 ) const ; XMLElement* PreviousSiblingElement( const char* value=0 ) { return const_cast(const_cast(this)->PreviousSiblingElement( value ) ); } /// Get the next (right) sibling node of this node. const XMLNode* NextSibling() const { return _next; } XMLNode* NextSibling() { return _next; } /// Get the next (right) sibling element of this node, with an optionally supplied name. const XMLElement* NextSiblingElement( const char* value=0 ) const; XMLElement* NextSiblingElement( const char* value=0 ) { return const_cast(const_cast(this)->NextSiblingElement( value ) ); } /** Add a child node as the last (right) child. If the child node is already part of the document, it is moved from its old location to the new location. Returns the addThis argument or 0 if the node does not belong to the same document. */ XMLNode* InsertEndChild( XMLNode* addThis ); XMLNode* LinkEndChild( XMLNode* addThis ) { return InsertEndChild( addThis ); } /** Add a child node as the first (left) child. If the child node is already part of the document, it is moved from its old location to the new location. Returns the addThis argument or 0 if the node does not belong to the same document. */ XMLNode* InsertFirstChild( XMLNode* addThis ); /** Add a node after the specified child node. If the child node is already part of the document, it is moved from its old location to the new location. Returns the addThis argument or 0 if the afterThis node is not a child of this node, or if the node does not belong to the same document. */ XMLNode* InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ); /** Delete all the children of this node. */ void DeleteChildren(); /** Delete a child of this node. */ void DeleteChild( XMLNode* node ); /** Make a copy of this node, but not its children. You may pass in a Document pointer that will be the owner of the new Node. If the 'document' is null, then the node returned will be allocated from the current Document. (this->GetDocument()) Note: if called on a XMLDocument, this will return null. */ virtual XMLNode* ShallowClone( XMLDocument* document ) const = 0; /** Test if 2 nodes are the same, but don't test children. The 2 nodes do not need to be in the same Document. Note: if called on a XMLDocument, this will return false. */ virtual bool ShallowEqual( const XMLNode* compare ) const = 0; /** Accept a hierarchical visit of the nodes in the TinyXML-2 DOM. Every node in the XML tree will be conditionally visited and the host will be called back via the XMLVisitor interface. This is essentially a SAX interface for TinyXML-2. (Note however it doesn't re-parse the XML for the callbacks, so the performance of TinyXML-2 is unchanged by using this interface versus any other.) The interface has been based on ideas from: - http://www.saxproject.org/ - http://c2.com/cgi/wiki?HierarchicalVisitorPattern Which are both good references for "visiting". An example of using Accept(): @verbatim XMLPrinter printer; tinyxmlDoc.Accept( &printer ); const char* xmlcstr = printer.CStr(); @endverbatim */ virtual bool Accept( XMLVisitor* visitor ) const = 0; // internal virtual char* ParseDeep( char*, StrPair* ); protected: XMLNode( XMLDocument* ); virtual ~XMLNode(); XMLNode( const XMLNode& ); // not supported XMLNode& operator=( const XMLNode& ); // not supported XMLDocument* _document; XMLNode* _parent; mutable StrPair _value; XMLNode* _firstChild; XMLNode* _lastChild; XMLNode* _prev; XMLNode* _next; private: MemPool* _memPool; void Unlink( XMLNode* child ); static void DeleteNode( XMLNode* node ); }; /** XML text. Note that a text node can have child element nodes, for example: @verbatim This is bold @endverbatim A text node can have 2 ways to output the next. "normal" output and CDATA. It will default to the mode it was parsed from the XML file and you generally want to leave it alone, but you can change the output mode with SetCData() and query it with CData(). */ class TINYXML2_LIB XMLText : public XMLNode { friend class XMLBase; friend class XMLDocument; public: virtual bool Accept( XMLVisitor* visitor ) const; virtual XMLText* ToText() { return this; } virtual const XMLText* ToText() const { return this; } /// Declare whether this should be CDATA or standard text. void SetCData( bool isCData ) { _isCData = isCData; } /// Returns true if this is a CDATA text element. bool CData() const { return _isCData; } char* ParseDeep( char*, StrPair* endTag ); virtual XMLNode* ShallowClone( XMLDocument* document ) const; virtual bool ShallowEqual( const XMLNode* compare ) const; protected: XMLText( XMLDocument* doc ) : XMLNode( doc ), _isCData( false ) {} virtual ~XMLText() {} XMLText( const XMLText& ); // not supported XMLText& operator=( const XMLText& ); // not supported private: bool _isCData; }; /** An XML Comment. */ class TINYXML2_LIB XMLComment : public XMLNode { friend class XMLDocument; public: virtual XMLComment* ToComment() { return this; } virtual const XMLComment* ToComment() const { return this; } virtual bool Accept( XMLVisitor* visitor ) const; char* ParseDeep( char*, StrPair* endTag ); virtual XMLNode* ShallowClone( XMLDocument* document ) const; virtual bool ShallowEqual( const XMLNode* compare ) const; protected: XMLComment( XMLDocument* doc ); virtual ~XMLComment(); XMLComment( const XMLComment& ); // not supported XMLComment& operator=( const XMLComment& ); // not supported private: }; /** In correct XML the declaration is the first entry in the file. @verbatim @endverbatim TinyXML-2 will happily read or write files without a declaration, however. The text of the declaration isn't interpreted. It is parsed and written as a string. */ class TINYXML2_LIB XMLDeclaration : public XMLNode { friend class XMLDocument; public: virtual XMLDeclaration* ToDeclaration() { return this; } virtual const XMLDeclaration* ToDeclaration() const { return this; } virtual bool Accept( XMLVisitor* visitor ) const; char* ParseDeep( char*, StrPair* endTag ); virtual XMLNode* ShallowClone( XMLDocument* document ) const; virtual bool ShallowEqual( const XMLNode* compare ) const; protected: XMLDeclaration( XMLDocument* doc ); virtual ~XMLDeclaration(); XMLDeclaration( const XMLDeclaration& ); // not supported XMLDeclaration& operator=( const XMLDeclaration& ); // not supported }; /** Any tag that TinyXML-2 doesn't recognize is saved as an unknown. It is a tag of text, but should not be modified. It will be written back to the XML, unchanged, when the file is saved. DTD tags get thrown into XMLUnknowns. */ class TINYXML2_LIB XMLUnknown : public XMLNode { friend class XMLDocument; public: virtual XMLUnknown* ToUnknown() { return this; } virtual const XMLUnknown* ToUnknown() const { return this; } virtual bool Accept( XMLVisitor* visitor ) const; char* ParseDeep( char*, StrPair* endTag ); virtual XMLNode* ShallowClone( XMLDocument* document ) const; virtual bool ShallowEqual( const XMLNode* compare ) const; protected: XMLUnknown( XMLDocument* doc ); virtual ~XMLUnknown(); XMLUnknown( const XMLUnknown& ); // not supported XMLUnknown& operator=( const XMLUnknown& ); // not supported }; /** An attribute is a name-value pair. Elements have an arbitrary number of attributes, each with a unique name. @note The attributes are not XMLNodes. You may only query the Next() attribute in a list. */ class TINYXML2_LIB XMLAttribute { friend class XMLElement; public: /// The name of the attribute. const char* Name() const; /// The value of the attribute. const char* Value() const; /// The next attribute in the list. const XMLAttribute* Next() const { return _next; } /** IntValue interprets the attribute as an integer, and returns the value. If the value isn't an integer, 0 will be returned. There is no error checking; use QueryIntValue() if you need error checking. */ int IntValue() const { int i=0; QueryIntValue( &i ); return i; } /// Query as an unsigned integer. See IntValue() unsigned UnsignedValue() const { unsigned i=0; QueryUnsignedValue( &i ); return i; } /// Query as a boolean. See IntValue() bool BoolValue() const { bool b=false; QueryBoolValue( &b ); return b; } /// Query as a double. See IntValue() double DoubleValue() const { double d=0; QueryDoubleValue( &d ); return d; } /// Query as a float. See IntValue() float FloatValue() const { float f=0; QueryFloatValue( &f ); return f; } /** QueryIntValue interprets the attribute as an integer, and returns the value in the provided parameter. The function will return XML_NO_ERROR on success, and XML_WRONG_ATTRIBUTE_TYPE if the conversion is not successful. */ XMLError QueryIntValue( int* value ) const; /// See QueryIntValue XMLError QueryUnsignedValue( unsigned int* value ) const; /// See QueryIntValue XMLError QueryBoolValue( bool* value ) const; /// See QueryIntValue XMLError QueryDoubleValue( double* value ) const; /// See QueryIntValue XMLError QueryFloatValue( float* value ) const; /// Set the attribute to a string value. void SetAttribute( const char* value ); /// Set the attribute to value. void SetAttribute( int value ); /// Set the attribute to value. void SetAttribute( unsigned value ); /// Set the attribute to value. void SetAttribute( bool value ); /// Set the attribute to value. void SetAttribute( double value ); /// Set the attribute to value. void SetAttribute( float value ); private: enum { BUF_SIZE = 200 }; XMLAttribute() : _next( 0 ), _memPool( 0 ) {} virtual ~XMLAttribute() {} XMLAttribute( const XMLAttribute& ); // not supported void operator=( const XMLAttribute& ); // not supported void SetName( const char* name ); char* ParseDeep( char* p, bool processEntities ); mutable StrPair _name; mutable StrPair _value; XMLAttribute* _next; MemPool* _memPool; }; /** The element is a container class. It has a value, the element name, and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes. */ class TINYXML2_LIB XMLElement : public XMLNode { friend class XMLBase; friend class XMLDocument; public: /// Get the name of an element (which is the Value() of the node.) const char* Name() const { return Value(); } /// Set the name of the element. void SetName( const char* str, bool staticMem=false ) { SetValue( str, staticMem ); } virtual XMLElement* ToElement() { return this; } virtual const XMLElement* ToElement() const { return this; } virtual bool Accept( XMLVisitor* visitor ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. For example: @verbatim const char* value = ele->Attribute( "foo" ); @endverbatim The 'value' parameter is normally null. However, if specified, the attribute will only be returned if the 'name' and 'value' match. This allow you to write code: @verbatim if ( ele->Attribute( "foo", "bar" ) ) callFooIsBar(); @endverbatim rather than: @verbatim if ( ele->Attribute( "foo" ) ) { if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) callFooIsBar(); } @endverbatim */ const char* Attribute( const char* name, const char* value=0 ) const; /** Given an attribute name, IntAttribute() returns the value of the attribute interpreted as an integer. 0 will be returned if there is an error. For a method with error checking, see QueryIntAttribute() */ int IntAttribute( const char* name ) const { int i=0; QueryIntAttribute( name, &i ); return i; } /// See IntAttribute() unsigned UnsignedAttribute( const char* name ) const { unsigned i=0; QueryUnsignedAttribute( name, &i ); return i; } /// See IntAttribute() bool BoolAttribute( const char* name ) const { bool b=false; QueryBoolAttribute( name, &b ); return b; } /// See IntAttribute() double DoubleAttribute( const char* name ) const { double d=0; QueryDoubleAttribute( name, &d ); return d; } /// See IntAttribute() float FloatAttribute( const char* name ) const { float f=0; QueryFloatAttribute( name, &f ); return f; } /** Given an attribute name, QueryIntAttribute() returns XML_NO_ERROR, XML_WRONG_ATTRIBUTE_TYPE if the conversion can't be performed, or XML_NO_ATTRIBUTE if the attribute doesn't exist. If successful, the result of the conversion will be written to 'value'. If not successful, nothing will be written to 'value'. This allows you to provide default value: @verbatim int value = 10; QueryIntAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 @endverbatim */ XMLError QueryIntAttribute( const char* name, int* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) { return XML_NO_ATTRIBUTE; } return a->QueryIntValue( value ); } /// See QueryIntAttribute() XMLError QueryUnsignedAttribute( const char* name, unsigned int* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) { return XML_NO_ATTRIBUTE; } return a->QueryUnsignedValue( value ); } /// See QueryIntAttribute() XMLError QueryBoolAttribute( const char* name, bool* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) { return XML_NO_ATTRIBUTE; } return a->QueryBoolValue( value ); } /// See QueryIntAttribute() XMLError QueryDoubleAttribute( const char* name, double* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) { return XML_NO_ATTRIBUTE; } return a->QueryDoubleValue( value ); } /// See QueryIntAttribute() XMLError QueryFloatAttribute( const char* name, float* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) { return XML_NO_ATTRIBUTE; } return a->QueryFloatValue( value ); } /** Given an attribute name, QueryAttribute() returns XML_NO_ERROR, XML_WRONG_ATTRIBUTE_TYPE if the conversion can't be performed, or XML_NO_ATTRIBUTE if the attribute doesn't exist. It is overloaded for the primitive types, and is a generally more convenient replacement of QueryIntAttribute() and related functions. If successful, the result of the conversion will be written to 'value'. If not successful, nothing will be written to 'value'. This allows you to provide default value: @verbatim int value = 10; QueryAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 @endverbatim */ int QueryAttribute( const char* name, int* value ) const { return QueryIntAttribute( name, value ); } int QueryAttribute( const char* name, unsigned int* value ) const { return QueryUnsignedAttribute( name, value ); } int QueryAttribute( const char* name, bool* value ) const { return QueryBoolAttribute( name, value ); } int QueryAttribute( const char* name, double* value ) const { return QueryDoubleAttribute( name, value ); } int QueryAttribute( const char* name, float* value ) const { return QueryFloatAttribute( name, value ); } /// Sets the named attribute to value. void SetAttribute( const char* name, const char* value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); } /// Sets the named attribute to value. void SetAttribute( const char* name, int value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); } /// Sets the named attribute to value. void SetAttribute( const char* name, unsigned value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); } /// Sets the named attribute to value. void SetAttribute( const char* name, bool value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); } /// Sets the named attribute to value. void SetAttribute( const char* name, double value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); } /// Sets the named attribute to value. void SetAttribute( const char* name, float value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); } /** Delete an attribute. */ void DeleteAttribute( const char* name ); /// Return the first attribute in the list. const XMLAttribute* FirstAttribute() const { return _rootAttribute; } /// Query a specific attribute in the list. const XMLAttribute* FindAttribute( const char* name ) const; /** Convenience function for easy access to the text inside an element. Although easy and concise, GetText() is limited compared to getting the XMLText child and accessing it directly. If the first child of 'this' is a XMLText, the GetText() returns the character string of the Text node, else null is returned. This is a convenient method for getting the text of simple contained text: @verbatim This is text const char* str = fooElement->GetText(); @endverbatim 'str' will be a pointer to "This is text". Note that this function can be misleading. If the element foo was created from this XML: @verbatim This is text @endverbatim then the value of str would be null. The first child node isn't a text node, it is another element. From this XML: @verbatim This is text @endverbatim GetText() will return "This is ". */ const char* GetText() const; /** Convenience function for easy access to the text inside an element. Although easy and concise, SetText() is limited compared to creating an XMLText child and mutating it directly. If the first child of 'this' is a XMLText, SetText() sets its value to the given string, otherwise it will create a first child that is an XMLText. This is a convenient method for setting the text of simple contained text: @verbatim This is text fooElement->SetText( "Hullaballoo!" ); Hullaballoo! @endverbatim Note that this function can be misleading. If the element foo was created from this XML: @verbatim This is text @endverbatim then it will not change "This is text", but rather prefix it with a text element: @verbatim Hullaballoo!This is text @endverbatim For this XML: @verbatim @endverbatim SetText() will generate @verbatim Hullaballoo! @endverbatim */ void SetText( const char* inText ); /// Convenience method for setting text inside and element. See SetText() for important limitations. void SetText( int value ); /// Convenience method for setting text inside and element. See SetText() for important limitations. void SetText( unsigned value ); /// Convenience method for setting text inside and element. See SetText() for important limitations. void SetText( bool value ); /// Convenience method for setting text inside and element. See SetText() for important limitations. void SetText( double value ); /// Convenience method for setting text inside and element. See SetText() for important limitations. void SetText( float value ); /** Convenience method to query the value of a child text node. This is probably best shown by example. Given you have a document is this form: @verbatim 1 1.4 @endverbatim The QueryIntText() and similar functions provide a safe and easier way to get to the "value" of x and y. @verbatim int x = 0; float y = 0; // types of x and y are contrived for example const XMLElement* xElement = pointElement->FirstChildElement( "x" ); const XMLElement* yElement = pointElement->FirstChildElement( "y" ); xElement->QueryIntText( &x ); yElement->QueryFloatText( &y ); @endverbatim @returns XML_SUCCESS (0) on success, XML_CAN_NOT_CONVERT_TEXT if the text cannot be converted to the requested type, and XML_NO_TEXT_NODE if there is no child text to query. */ XMLError QueryIntText( int* ival ) const; /// See QueryIntText() XMLError QueryUnsignedText( unsigned* uval ) const; /// See QueryIntText() XMLError QueryBoolText( bool* bval ) const; /// See QueryIntText() XMLError QueryDoubleText( double* dval ) const; /// See QueryIntText() XMLError QueryFloatText( float* fval ) const; // internal: enum { OPEN, // CLOSED, // CLOSING // }; int ClosingType() const { return _closingType; } char* ParseDeep( char* p, StrPair* endTag ); virtual XMLNode* ShallowClone( XMLDocument* document ) const; virtual bool ShallowEqual( const XMLNode* compare ) const; private: XMLElement( XMLDocument* doc ); virtual ~XMLElement(); XMLElement( const XMLElement& ); // not supported void operator=( const XMLElement& ); // not supported XMLAttribute* FindAttribute( const char* name ); XMLAttribute* FindOrCreateAttribute( const char* name ); //void LinkAttribute( XMLAttribute* attrib ); char* ParseAttributes( char* p ); static void DeleteAttribute( XMLAttribute* attribute ); enum { BUF_SIZE = 200 }; int _closingType; // The attribute list is ordered; there is no 'lastAttribute' // because the list needs to be scanned for dupes before adding // a new attribute. XMLAttribute* _rootAttribute; }; enum Whitespace { PRESERVE_WHITESPACE, COLLAPSE_WHITESPACE }; /** A Document binds together all the functionality. It can be saved, loaded, and printed to the screen. All Nodes are connected and allocated to a Document. If the Document is deleted, all its Nodes are also deleted. */ class TINYXML2_LIB XMLDocument : public XMLNode { friend class XMLElement; public: /// constructor XMLDocument( bool processEntities = true, Whitespace = PRESERVE_WHITESPACE ); ~XMLDocument(); virtual XMLDocument* ToDocument() { return this; } virtual const XMLDocument* ToDocument() const { return this; } /** Parse an XML file from a character string. Returns XML_NO_ERROR (0) on success, or an errorID. You may optionally pass in the 'nBytes', which is the number of bytes which will be parsed. If not specified, TinyXML-2 will assume 'xml' points to a null terminated string. */ XMLError Parse( const char* xml, size_t nBytes=(size_t)(-1) ); /** Load an XML file from disk. Returns XML_NO_ERROR (0) on success, or an errorID. */ XMLError LoadFile( const char* filename ); /** Load an XML file from disk. You are responsible for providing and closing the FILE*. Returns XML_NO_ERROR (0) on success, or an errorID. */ XMLError LoadFile( FILE* ); /** Save the XML file to disk. Returns XML_NO_ERROR (0) on success, or an errorID. */ XMLError SaveFile( const char* filename, bool compact = false ); /** Save the XML file to disk. You are responsible for providing and closing the FILE*. Returns XML_NO_ERROR (0) on success, or an errorID. */ XMLError SaveFile( FILE* fp, bool compact = false ); bool ProcessEntities() const { return _processEntities; } Whitespace WhitespaceMode() const { return _whitespace; } /** Returns true if this document has a leading Byte Order Mark of UTF8. */ bool HasBOM() const { return _writeBOM; } /** Sets whether to write the BOM when writing the file. */ void SetBOM( bool useBOM ) { _writeBOM = useBOM; } /** Return the root element of DOM. Equivalent to FirstChildElement(). To get the first node, use FirstChild(). */ XMLElement* RootElement() { return FirstChildElement(); } const XMLElement* RootElement() const { return FirstChildElement(); } /** Print the Document. If the Printer is not provided, it will print to stdout. If you provide Printer, this can print to a file: @verbatim XMLPrinter printer( fp ); doc.Print( &printer ); @endverbatim Or you can use a printer to print to memory: @verbatim XMLPrinter printer; doc.Print( &printer ); // printer.CStr() has a const char* to the XML @endverbatim */ void Print( XMLPrinter* streamer=0 ) const; virtual bool Accept( XMLVisitor* visitor ) const; /** Create a new Element associated with this Document. The memory for the Element is managed by the Document. */ XMLElement* NewElement( const char* name ); /** Create a new Comment associated with this Document. The memory for the Comment is managed by the Document. */ XMLComment* NewComment( const char* comment ); /** Create a new Text associated with this Document. The memory for the Text is managed by the Document. */ XMLText* NewText( const char* text ); /** Create a new Declaration associated with this Document. The memory for the object is managed by the Document. If the 'text' param is null, the standard declaration is used.: @verbatim @endverbatim */ XMLDeclaration* NewDeclaration( const char* text=0 ); /** Create a new Unknown associated with this Document. The memory for the object is managed by the Document. */ XMLUnknown* NewUnknown( const char* text ); /** Delete a node associated with this document. It will be unlinked from the DOM. */ void DeleteNode( XMLNode* node ) { node->_parent->DeleteChild( node ); } void SetError( XMLError error, const char* str1, const char* str2 ); /// Return true if there was an error parsing the document. bool Error() const { return _errorID != XML_NO_ERROR; } /// Return the errorID. XMLError ErrorID() const { return _errorID; } const char* ErrorName() const; /// Return a possibly helpful diagnostic location or string. const char* GetErrorStr1() const { return _errorStr1; } /// Return a possibly helpful secondary diagnostic location or string. const char* GetErrorStr2() const { return _errorStr2; } /// If there is an error, print it to stdout. void PrintError() const; /// Clear the document, resetting it to the initial state. void Clear(); // internal char* Identify( char* p, XMLNode** node ); virtual XMLNode* ShallowClone( XMLDocument* /*document*/ ) const { return 0; } virtual bool ShallowEqual( const XMLNode* /*compare*/ ) const { return false; } private: XMLDocument( const XMLDocument& ); // not supported void operator=( const XMLDocument& ); // not supported bool _writeBOM; bool _processEntities; XMLError _errorID; Whitespace _whitespace; const char* _errorStr1; const char* _errorStr2; char* _charBuffer; MemPoolT< sizeof(XMLElement) > _elementPool; MemPoolT< sizeof(XMLAttribute) > _attributePool; MemPoolT< sizeof(XMLText) > _textPool; MemPoolT< sizeof(XMLComment) > _commentPool; static const char* _errorNames[XML_ERROR_COUNT]; }; /** A XMLHandle is a class that wraps a node pointer with null checks; this is an incredibly useful thing. Note that XMLHandle is not part of the TinyXML-2 DOM structure. It is a separate utility class. Take an example: @verbatim @endverbatim Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very easy to write a *lot* of code that looks like: @verbatim XMLElement* root = document.FirstChildElement( "Document" ); if ( root ) { XMLElement* element = root->FirstChildElement( "Element" ); if ( element ) { XMLElement* child = element->FirstChildElement( "Child" ); if ( child ) { XMLElement* child2 = child->NextSiblingElement( "Child" ); if ( child2 ) { // Finally do something useful. @endverbatim And that doesn't even cover "else" cases. XMLHandle addresses the verbosity of such code. A XMLHandle checks for null pointers so it is perfectly safe and correct to use: @verbatim XMLHandle docHandle( &document ); XMLElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild().NextSibling().ToElement(); if ( child2 ) { // do something useful @endverbatim Which is MUCH more concise and useful. It is also safe to copy handles - internally they are nothing more than node pointers. @verbatim XMLHandle handleCopy = handle; @endverbatim See also XMLConstHandle, which is the same as XMLHandle, but operates on const objects. */ class TINYXML2_LIB XMLHandle { public: /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. XMLHandle( XMLNode* node ) { _node = node; } /// Create a handle from a node. XMLHandle( XMLNode& node ) { _node = &node; } /// Copy constructor XMLHandle( const XMLHandle& ref ) { _node = ref._node; } /// Assignment XMLHandle& operator=( const XMLHandle& ref ) { _node = ref._node; return *this; } /// Get the first child of this handle. XMLHandle FirstChild() { return XMLHandle( _node ? _node->FirstChild() : 0 ); } /// Get the first child element of this handle. XMLHandle FirstChildElement( const char* value=0 ) { return XMLHandle( _node ? _node->FirstChildElement( value ) : 0 ); } /// Get the last child of this handle. XMLHandle LastChild() { return XMLHandle( _node ? _node->LastChild() : 0 ); } /// Get the last child element of this handle. XMLHandle LastChildElement( const char* _value=0 ) { return XMLHandle( _node ? _node->LastChildElement( _value ) : 0 ); } /// Get the previous sibling of this handle. XMLHandle PreviousSibling() { return XMLHandle( _node ? _node->PreviousSibling() : 0 ); } /// Get the previous sibling element of this handle. XMLHandle PreviousSiblingElement( const char* _value=0 ) { return XMLHandle( _node ? _node->PreviousSiblingElement( _value ) : 0 ); } /// Get the next sibling of this handle. XMLHandle NextSibling() { return XMLHandle( _node ? _node->NextSibling() : 0 ); } /// Get the next sibling element of this handle. XMLHandle NextSiblingElement( const char* _value=0 ) { return XMLHandle( _node ? _node->NextSiblingElement( _value ) : 0 ); } /// Safe cast to XMLNode. This can return null. XMLNode* ToNode() { return _node; } /// Safe cast to XMLElement. This can return null. XMLElement* ToElement() { return ( ( _node == 0 ) ? 0 : _node->ToElement() ); } /// Safe cast to XMLText. This can return null. XMLText* ToText() { return ( ( _node == 0 ) ? 0 : _node->ToText() ); } /// Safe cast to XMLUnknown. This can return null. XMLUnknown* ToUnknown() { return ( ( _node == 0 ) ? 0 : _node->ToUnknown() ); } /// Safe cast to XMLDeclaration. This can return null. XMLDeclaration* ToDeclaration() { return ( ( _node == 0 ) ? 0 : _node->ToDeclaration() ); } private: XMLNode* _node; }; /** A variant of the XMLHandle class for working with const XMLNodes and Documents. It is the same in all regards, except for the 'const' qualifiers. See XMLHandle for API. */ class TINYXML2_LIB XMLConstHandle { public: XMLConstHandle( const XMLNode* node ) { _node = node; } XMLConstHandle( const XMLNode& node ) { _node = &node; } XMLConstHandle( const XMLConstHandle& ref ) { _node = ref._node; } XMLConstHandle& operator=( const XMLConstHandle& ref ) { _node = ref._node; return *this; } const XMLConstHandle FirstChild() const { return XMLConstHandle( _node ? _node->FirstChild() : 0 ); } const XMLConstHandle FirstChildElement( const char* value=0 ) const { return XMLConstHandle( _node ? _node->FirstChildElement( value ) : 0 ); } const XMLConstHandle LastChild() const { return XMLConstHandle( _node ? _node->LastChild() : 0 ); } const XMLConstHandle LastChildElement( const char* _value=0 ) const { return XMLConstHandle( _node ? _node->LastChildElement( _value ) : 0 ); } const XMLConstHandle PreviousSibling() const { return XMLConstHandle( _node ? _node->PreviousSibling() : 0 ); } const XMLConstHandle PreviousSiblingElement( const char* _value=0 ) const { return XMLConstHandle( _node ? _node->PreviousSiblingElement( _value ) : 0 ); } const XMLConstHandle NextSibling() const { return XMLConstHandle( _node ? _node->NextSibling() : 0 ); } const XMLConstHandle NextSiblingElement( const char* _value=0 ) const { return XMLConstHandle( _node ? _node->NextSiblingElement( _value ) : 0 ); } const XMLNode* ToNode() const { return _node; } const XMLElement* ToElement() const { return ( ( _node == 0 ) ? 0 : _node->ToElement() ); } const XMLText* ToText() const { return ( ( _node == 0 ) ? 0 : _node->ToText() ); } const XMLUnknown* ToUnknown() const { return ( ( _node == 0 ) ? 0 : _node->ToUnknown() ); } const XMLDeclaration* ToDeclaration() const { return ( ( _node == 0 ) ? 0 : _node->ToDeclaration() ); } private: const XMLNode* _node; }; /** Printing functionality. The XMLPrinter gives you more options than the XMLDocument::Print() method. It can: -# Print to memory. -# Print to a file you provide. -# Print XML without a XMLDocument. Print to Memory @verbatim XMLPrinter printer; doc.Print( &printer ); SomeFunction( printer.CStr() ); @endverbatim Print to a File You provide the file pointer. @verbatim XMLPrinter printer( fp ); doc.Print( &printer ); @endverbatim Print without a XMLDocument When loading, an XML parser is very useful. However, sometimes when saving, it just gets in the way. The code is often set up for streaming, and constructing the DOM is just overhead. The Printer supports the streaming case. The following code prints out a trivially simple XML file without ever creating an XML document. @verbatim XMLPrinter printer( fp ); printer.OpenElement( "foo" ); printer.PushAttribute( "foo", "bar" ); printer.CloseElement(); @endverbatim */ class TINYXML2_LIB XMLPrinter : public XMLVisitor { public: /** Construct the printer. If the FILE* is specified, this will print to the FILE. Else it will print to memory, and the result is available in CStr(). If 'compact' is set to true, then output is created with only required whitespace and newlines. */ XMLPrinter( FILE* file=0, bool compact = false, int depth = 0 ); virtual ~XMLPrinter() {} /** If streaming, write the BOM and declaration. */ void PushHeader( bool writeBOM, bool writeDeclaration ); /** If streaming, start writing an element. The element must be closed with CloseElement() */ void OpenElement( const char* name, bool compactMode=false ); /// If streaming, add an attribute to an open element. void PushAttribute( const char* name, const char* value ); void PushAttribute( const char* name, int value ); void PushAttribute( const char* name, unsigned value ); void PushAttribute( const char* name, bool value ); void PushAttribute( const char* name, double value ); /// If streaming, close the Element. virtual void CloseElement( bool compactMode=false ); /// Add a text node. void PushText( const char* text, bool cdata=false ); /// Add a text node from an integer. void PushText( int value ); /// Add a text node from an unsigned. void PushText( unsigned value ); /// Add a text node from a bool. void PushText( bool value ); /// Add a text node from a float. void PushText( float value ); /// Add a text node from a double. void PushText( double value ); /// Add a comment void PushComment( const char* comment ); void PushDeclaration( const char* value ); void PushUnknown( const char* value ); virtual bool VisitEnter( const XMLDocument& /*doc*/ ); virtual bool VisitExit( const XMLDocument& /*doc*/ ) { return true; } virtual bool VisitEnter( const XMLElement& element, const XMLAttribute* attribute ); virtual bool VisitExit( const XMLElement& element ); virtual bool Visit( const XMLText& text ); virtual bool Visit( const XMLComment& comment ); virtual bool Visit( const XMLDeclaration& declaration ); virtual bool Visit( const XMLUnknown& unknown ); /** If in print to memory mode, return a pointer to the XML file in memory. */ const char* CStr() const { return _buffer.Mem(); } /** If in print to memory mode, return the size of the XML file in memory. (Note the size returned includes the terminating null.) */ int CStrSize() const { return _buffer.Size(); } /** If in print to memory mode, reset the buffer to the beginning. */ void ClearBuffer() { _buffer.Clear(); _buffer.Push(0); } protected: virtual bool CompactMode( const XMLElement& ) { return _compactMode; } /** Prints out the space before an element. You may override to change the space and tabs used. A PrintSpace() override should call Print(). */ virtual void PrintSpace( int depth ); void Print( const char* format, ... ); void SealElement(); bool _elementJustOpened; DynArray< const char*, 10 > _stack; private: void PrintString( const char*, bool restrictedEntitySet ); // prints out, after detecting entities. bool _firstElement; FILE* _fp; int _depth; int _textDepth; bool _processEntities; bool _compactMode; enum { ENTITY_RANGE = 64, BUF_SIZE = 200 }; bool _entityFlag[ENTITY_RANGE]; bool _restrictedEntityFlag[ENTITY_RANGE]; DynArray< char, 20 > _buffer; }; } // tinyxml2 #if defined(_MSC_VER) # pragma warning(pop) #endif #endif // TINYXML2_INCLUDED numptyphysics-0.3.10/external/vmath/000077500000000000000000000000001425065123200174735ustar00rootroot00000000000000numptyphysics-0.3.10/external/vmath/vector_math.h000066400000000000000000000740531425065123200221700ustar00rootroot00000000000000/* Copyright (c) 2007, Markus Trenkwalder All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the library's copyright owner nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef VECTOR_MATH_H #define VECTOR_MATH_H #include // "minor" can be defined from GCC and can cause problems #undef minor #ifndef M_PI #define M_PI 3.14159265358979323846 #endif namespace vmath { using std::sin; using std::cos; using std::acos; using std::sqrt; template inline T rsqrt(T x) { return T(1) / sqrt(x); } template inline T inv(T x) { return T(1) / x; } namespace detail { // This function is used heavily in this library. Here is a generic // implementation for it. If you can provide a faster one for your specific // types this can speed up things considerably. template inline T multiply_accumulate(int count, const T *a, const T *b) { T result = T(0); for (int i = 0; i < count; ++i) result += a[i] * b[i]; return result; } } #define MOP_M_CLASS_TEMPLATE(CLASS, OP, COUNT) \ CLASS & operator OP (const CLASS& rhs) \ { \ for (int i = 0; i < (COUNT); ++i ) \ (*this)[i] OP rhs[i]; \ return *this; \ } #define MOP_M_TYPE_TEMPLATE(CLASS, OP, COUNT) \ CLASS & operator OP (const T & rhs) \ { \ for (int i = 0; i < (COUNT); ++i ) \ (*this)[i] OP rhs; \ return *this; \ } #define MOP_COMP_TEMPLATE(CLASS, COUNT) \ bool operator == (const CLASS & rhs) \ { \ bool result = true; \ for (int i = 0; i < (COUNT); ++i) \ result = result && (*this)[i] == rhs[i]; \ return result; \ } \ bool operator != (const CLASS & rhs) \ { return !((*this) == rhs); } #define MOP_G_UMINUS_TEMPLATE(CLASS, COUNT) \ CLASS operator - () const \ { \ CLASS result; \ for (int i = 0; i < (COUNT); ++i) \ result[i] = -(*this)[i]; \ return result; \ } #define COMMON_OPERATORS(CLASS, COUNT) \ MOP_M_CLASS_TEMPLATE(CLASS, +=, COUNT) \ MOP_M_CLASS_TEMPLATE(CLASS, -=, COUNT) \ /*no *= as this is not the same for vectors and matrices */ \ MOP_M_CLASS_TEMPLATE(CLASS, /=, COUNT) \ MOP_M_TYPE_TEMPLATE(CLASS, +=, COUNT) \ MOP_M_TYPE_TEMPLATE(CLASS, -=, COUNT) \ MOP_M_TYPE_TEMPLATE(CLASS, *=, COUNT) \ MOP_M_TYPE_TEMPLATE(CLASS, /=, COUNT) \ MOP_G_UMINUS_TEMPLATE(CLASS, COUNT) \ MOP_COMP_TEMPLATE(CLASS, COUNT) #define VECTOR_COMMON(CLASS, COUNT) \ COMMON_OPERATORS(CLASS, COUNT) \ MOP_M_CLASS_TEMPLATE(CLASS, *=, COUNT) \ operator const T* () const { return &x; } \ operator T* () { return &x; } #define FOP_G_SOURCE_TEMPLATE(OP, CLASS) \ { CLASS r = lhs; r OP##= rhs; return r; } #define FOP_G_CLASS_TEMPLATE(OP, CLASS) \ template \ inline CLASS operator OP (const CLASS &lhs, const CLASS &rhs) \ FOP_G_SOURCE_TEMPLATE(OP, CLASS) #define FOP_G_TYPE_TEMPLATE(OP, CLASS) \ template \ inline CLASS operator OP (const CLASS &lhs, const T &rhs) \ FOP_G_SOURCE_TEMPLATE(OP, CLASS) // forward declarations template struct vec2; template struct vec3; template struct vec4; template struct mat2; template struct mat3; template struct mat4; template struct quat; #define FREE_MODIFYING_OPERATORS(CLASS) \ FOP_G_CLASS_TEMPLATE(+, CLASS) \ FOP_G_CLASS_TEMPLATE(-, CLASS) \ FOP_G_CLASS_TEMPLATE(*, CLASS) \ FOP_G_CLASS_TEMPLATE(/, CLASS) \ FOP_G_TYPE_TEMPLATE(+, CLASS) \ FOP_G_TYPE_TEMPLATE(-, CLASS) \ FOP_G_TYPE_TEMPLATE(*, CLASS) \ FOP_G_TYPE_TEMPLATE(/, CLASS) FREE_MODIFYING_OPERATORS(vec2) FREE_MODIFYING_OPERATORS(vec3) FREE_MODIFYING_OPERATORS(vec4) FREE_MODIFYING_OPERATORS(mat2) FREE_MODIFYING_OPERATORS(mat3) FREE_MODIFYING_OPERATORS(mat4) FREE_MODIFYING_OPERATORS(quat) #define FREE_OPERATORS(CLASS) \ template \ inline CLASS operator + (const T& a, const CLASS& b) \ { CLASS r = b; r += a; return r; } \ \ template \ inline CLASS operator * (const T& a, const CLASS& b) \ { CLASS r = b; r *= a; return r; } \ \ template \ inline CLASS operator - (const T& a, const CLASS& b) \ { return -b + a; } \ \ template \ inline CLASS operator / (const T& a, const CLASS& b) \ { CLASS r(a); r /= b; return r; } FREE_OPERATORS(vec2) FREE_OPERATORS(vec3) FREE_OPERATORS(vec4) FREE_OPERATORS(mat2) FREE_OPERATORS(mat3) FREE_OPERATORS(mat4) FREE_OPERATORS(quat) template struct vec2 { T x, y; vec2() {}; explicit vec2(const T i) : x(i), y(i) {} explicit vec2(const T ix, const T iy) : x(ix), y(iy) {} explicit vec2(const vec3& v); explicit vec2(const vec4& v); VECTOR_COMMON(vec2, 2) }; template struct vec3 { T x, y, z; vec3() {}; explicit vec3(const T i) : x(i), y(i), z(i) {} explicit vec3(const T ix, const T iy, const T iz) : x(ix), y(iy), z(iz) {} explicit vec3(const vec2& xy, const T iz) : x(xy.x), y(xy.y), z(iz) {} explicit vec3(const T ix, const vec2& yz) : x(ix), y(yz.y), z(yz.z) {} explicit vec3(const vec4& v); VECTOR_COMMON(vec3, 3) }; template struct vec4 { T x, y, z, w; vec4() {}; explicit vec4(const T i) : x(i), y(i), z(i), w(i) {} explicit vec4(const T ix, const T iy, const T iz, const T iw) : x(ix), y(iy), z(iz), w(iw) {} explicit vec4(const vec3& xyz,const T iw) : x(xyz.x), y(xyz.y), z(xyz.z), w(iw) {} explicit vec4(const T ix, const vec3& yzw) : x(ix), y(yzw.x), z(yzw.y), w(yzw.z) {} explicit vec4(const vec2& xy, const vec2& zw) : x(xy.x), y(xy.y), z(zw.x), w(zw.y) {} VECTOR_COMMON(vec4, 4) }; // additional constructors that omit the last element template inline vec2::vec2(const vec3& v) : x(v.x), y(v.y) {} template inline vec2::vec2(const vec4& v) : x(v.x), y(v.y) {} template inline vec3::vec3(const vec4& v) : x(v.x), y(v.y), z(v.z) {} #define VEC_QUAT_FUNC_TEMPLATE(CLASS, COUNT) \ template \ inline T dot(const CLASS & u, const CLASS & v) \ { \ const T *a = u; \ const T *b = v; \ using namespace detail; \ return multiply_accumulate(COUNT, a, b); \ } \ template \ inline T length(const CLASS & v) \ { \ return sqrt(dot(v, v)); \ } \ template inline CLASS normalize(const CLASS & v) \ { \ return v * rsqrt(dot(v, v)); \ } \ template inline CLASS lerp(const CLASS & u, const CLASS & v, const T x) \ { \ return u * (T(1) - x) + v * x; \ } VEC_QUAT_FUNC_TEMPLATE(vec2, 2) VEC_QUAT_FUNC_TEMPLATE(vec3, 3) VEC_QUAT_FUNC_TEMPLATE(vec4, 4) VEC_QUAT_FUNC_TEMPLATE(quat, 4) #define VEC_FUNC_TEMPLATE(CLASS) \ template inline CLASS reflect(const CLASS & I, const CLASS & N) \ { \ return I - T(2) * dot(N, I) * N; \ } \ template inline CLASS refract(const CLASS & I, const CLASS & N, T eta) \ { \ const T d = dot(N, I); \ const T k = T(1) - eta * eta * (T(1) - d * d); \ if ( k < T(0) ) \ return CLASS(T(0)); \ else \ return eta * I - (eta * d + static_cast(sqrt(k))) * N; \ } VEC_FUNC_TEMPLATE(vec2) VEC_FUNC_TEMPLATE(vec3) VEC_FUNC_TEMPLATE(vec4) template inline T lerp(const T & u, const T & v, const T x) { return dot(vec2(u, v), vec2((T(1) - x), x)); } template inline vec3 cross(const vec3& u, const vec3& v) { return vec3( dot(vec2(u.y, -v.y), vec2(v.z, u.z)), dot(vec2(u.z, -v.z), vec2(v.x, u.x)), dot(vec2(u.x, -v.x), vec2(v.y, u.y))); } #define MATRIX_COL4(SRC, C) \ vec4(SRC.elem[0][C], SRC.elem[1][C], SRC.elem[2][C], SRC.elem[3][C]) #define MATRIX_ROW4(SRC, R) \ vec4(SRC.elem[R][0], SRC.elem[R][1], SRC.elem[R][2], SRC.elem[R][3]) #define MATRIX_COL3(SRC, C) \ vec3(SRC.elem[0][C], SRC.elem[1][C], SRC.elem[2][C]) #define MATRIX_ROW3(SRC, R) \ vec3(SRC.elem[R][0], SRC.elem[R][1], SRC.elem[R][2]) #define MATRIX_COL2(SRC, C) \ vec2(SRC.elem[0][C], SRC.elem[1][C]) #define MATRIX_ROW2(SRC, R) \ vec2(SRC.elem[R][0], SRC.elem[R][1]) #define MOP_M_MATRIX_MULTIPLY(CLASS, SIZE) \ CLASS & operator *= (const CLASS & rhs) \ { \ CLASS result; \ for (int r = 0; r < SIZE; ++r) \ for (int c = 0; c < SIZE; ++c) \ result.elem[r][c] = dot( \ MATRIX_ROW ## SIZE((*this), r), \ MATRIX_COL ## SIZE(rhs, c)); \ return (*this) = result; \ } #define MATRIX_CONSTRUCTOR_FROM_T(CLASS, SIZE) \ explicit CLASS(const T v) \ { \ for (int r = 0; r < SIZE; ++r) \ for (int c = 0; c < SIZE; ++c) \ if (r == c) elem[r][c] = v; \ else elem[r][c] = T(0); \ } #define MATRIX_CONSTRUCTOR_FROM_LOWER(CLASS1, CLASS2, SIZE1, SIZE2) \ explicit CLASS1(const CLASS2& m) \ { \ for (int r = 0; r < SIZE1; ++r) \ for (int c = 0; c < SIZE1; ++c) \ if (r < SIZE2 && c < SIZE2) elem[r][c] = m.elem[r][c]; \ else elem[r][c] = r == c ? T(1) : T(0); \ } #define MATRIX_COMMON(CLASS, SIZE) \ COMMON_OPERATORS(CLASS, SIZE*SIZE) \ MOP_M_MATRIX_MULTIPLY(CLASS, SIZE) \ MATRIX_CONSTRUCTOR_FROM_T(CLASS, SIZE) \ operator const T* () const { return (const T*) elem; } \ operator T* () { return (T*) elem; } template struct mat2; template struct mat3; template struct mat4; template struct mat2 { T elem[2][2]; mat2() {} explicit mat2( const T m00, const T m01, const T m10, const T m11) { elem[0][0] = m00; elem[0][1] = m01; elem[1][0] = m10; elem[1][1] = m11; } explicit mat2(const vec2& v0, const vec2& v1) { elem[0][0] = v0[0]; elem[1][0] = v0[1]; elem[0][1] = v1[0]; elem[1][1] = v1[1]; } explicit mat2(const mat3& m); MATRIX_COMMON(mat2, 2) }; template struct mat3 { T elem[3][3]; mat3() {} explicit mat3( const T m00, const T m01, const T m02, const T m10, const T m11, const T m12, const T m20, const T m21, const T m22) { elem[0][0] = m00; elem[0][1] = m01; elem[0][2] = m02; elem[1][0] = m10; elem[1][1] = m11; elem[1][2] = m12; elem[2][0] = m20; elem[2][1] = m21; elem[2][2] = m22; } explicit mat3(const vec3& v0, const vec3& v1, const vec3& v2) { elem[0][0] = v0[0]; elem[1][0] = v0[1]; elem[2][0] = v0[2]; elem[0][1] = v1[0]; elem[1][1] = v1[1]; elem[2][1] = v1[2]; elem[0][2] = v2[0]; elem[1][2] = v2[1]; elem[2][2] = v2[2]; } explicit mat3(const mat4& m); MATRIX_CONSTRUCTOR_FROM_LOWER(mat3, mat2, 3, 2) MATRIX_COMMON(mat3, 3) }; template struct mat4 { T elem[4][4]; mat4() {} explicit mat4( const T m00, const T m01, const T m02, const T m03, const T m10, const T m11, const T m12, const T m13, const T m20, const T m21, const T m22, const T m23, const T m30, const T m31, const T m32, const T m33) { elem[0][0] = m00; elem[0][1] = m01; elem[0][2] = m02; elem[0][3] = m03; elem[1][0] = m10; elem[1][1] = m11; elem[1][2] = m12; elem[1][3] = m13; elem[2][0] = m20; elem[2][1] = m21; elem[2][2] = m22; elem[2][3] = m23; elem[3][0] = m30; elem[3][1] = m31; elem[3][2] = m32; elem[3][3] = m33; } explicit mat4(const vec4& v0, const vec4& v1, const vec4& v2, const vec4& v3) { elem[0][0] = v0[0]; elem[1][0] = v0[1]; elem[2][0] = v0[2]; elem[3][0] = v0[3]; elem[0][1] = v1[0]; elem[1][1] = v1[1]; elem[2][1] = v1[2]; elem[3][1] = v1[3]; elem[0][2] = v2[0]; elem[1][2] = v2[1]; elem[2][2] = v2[2]; elem[3][2] = v2[3]; elem[0][3] = v3[0]; elem[1][3] = v3[1]; elem[2][3] = v3[2]; elem[3][3] = v3[3]; } MATRIX_CONSTRUCTOR_FROM_LOWER(mat4, mat3, 4, 3) MATRIX_COMMON(mat4, 4) }; #define MATRIX_CONSTRUCTOR_FROM_HIGHER(CLASS1, CLASS2, SIZE) \ template \ inline CLASS1::CLASS1(const CLASS2& m) \ { \ for (int r = 0; r < SIZE; ++r) \ for (int c = 0; c < SIZE; ++c) \ elem[r][c] = m.elem[r][c]; \ } MATRIX_CONSTRUCTOR_FROM_HIGHER(mat2, mat3, 2) MATRIX_CONSTRUCTOR_FROM_HIGHER(mat3, mat4, 3) #define MAT_FUNC_TEMPLATE(CLASS, SIZE) \ template \ inline CLASS transpose(const CLASS & m) \ { \ CLASS result; \ for (int r = 0; r < SIZE; ++r) \ for (int c = 0; c < SIZE; ++c) \ result.elem[r][c] = m.elem[c][r]; \ return result; \ } \ template \ inline CLASS identity ## SIZE() \ { \ CLASS result; \ for (int r = 0; r < SIZE; ++r) \ for (int c = 0; c < SIZE; ++c) \ result.elem[r][c] = r == c ? T(1) : T(0); \ return result; \ } \ template \ inline T trace(const CLASS & m) \ { \ T result = T(0); \ for (int i = 0; i < SIZE; ++i) \ result += m.elem[i][i]; \ return result; \ } MAT_FUNC_TEMPLATE(mat2, 2) MAT_FUNC_TEMPLATE(mat3, 3) MAT_FUNC_TEMPLATE(mat4, 4) #define MAT_FUNC_MINOR_TEMPLATE(CLASS1, CLASS2, SIZE) \ template \ inline CLASS2 minor(const CLASS1 & m, int _r = SIZE, int _c = SIZE) { \ CLASS2 result; \ for (int r = 0; r < SIZE - 1; ++r) \ for (int c = 0; c < SIZE - 1; ++c) { \ int rs = r >= _r ? 1 : 0; \ int cs = c >= _c ? 1 : 0; \ result.elem[r][c] = m.elem[r + rs][c + cs]; \ } \ return result; \ } MAT_FUNC_MINOR_TEMPLATE(mat3, mat2, 3) MAT_FUNC_MINOR_TEMPLATE(mat4, mat3, 4) template inline T det(const mat2& m) { return dot( vec2(m.elem[0][0], -m.elem[0][1]), vec2(m.elem[1][1], m.elem[1][0])); } template inline T det(const mat3& m) { return dot(cross(MATRIX_COL3(m, 0), MATRIX_COL3(m, 1)), MATRIX_COL3(m, 2)); } template inline T det(const mat4& m) { vec4 b; for (int i = 0; i < 4; ++i) b[i] = (i & 1 ? -1 : 1) * det(minor(m, 0, i)); return dot(MATRIX_ROW4(m, 0), b); } #define MAT_ADJOINT_TEMPLATE(CLASS, SIZE) \ template \ inline CLASS adjoint(const CLASS & m) \ { \ CLASS result; \ for (int r = 0; r < SIZE; ++r) \ for (int c = 0; c < SIZE; ++c) \ result.elem[r][c] = ((r + c) & 1 ? -1 : 1) * det(minor(m, c, r)); \ return result; \ } MAT_ADJOINT_TEMPLATE(mat3, 3) MAT_ADJOINT_TEMPLATE(mat4, 4) template inline mat2 adjoint(const mat2 & m) { return mat2( m.elem[1][1], -m.elem[0][1], -m.elem[1][0], m.elem[0][0] ); } #define MAT_INVERSE_TEMPLATE(CLASS) \ template \ inline CLASS inverse(const CLASS & m) \ { \ return adjoint(m) * inv(det(m)); \ } MAT_INVERSE_TEMPLATE(mat2) MAT_INVERSE_TEMPLATE(mat3) MAT_INVERSE_TEMPLATE(mat4) #define MAT_VEC_FUNCS_TEMPLATE(MATCLASS, VECCLASS, SIZE) \ template \ inline VECCLASS operator * (const MATCLASS & m, const VECCLASS & v) \ { \ VECCLASS result; \ for (int i = 0; i < SIZE; ++i) {\ result[i] = dot(MATRIX_ROW ## SIZE(m, i), v); \ } \ return result; \ } \ template \ inline VECCLASS operator * (const VECCLASS & v, const MATCLASS & m) \ { \ VECCLASS result; \ for (int i = 0; i < SIZE; ++i) \ result[i] = dot(v, MATRIX_COL ## SIZE(m, i)); \ return result; \ } MAT_VEC_FUNCS_TEMPLATE(mat2, vec2, 2) MAT_VEC_FUNCS_TEMPLATE(mat3, vec3, 3) MAT_VEC_FUNCS_TEMPLATE(mat4, vec4, 4) // Returns the inverse of a 4x4 matrix. It is assumed that the matrix passed // as argument describes a rigid-body transformation. template inline mat4 fast_inverse(const mat4& m) { const vec3 t = MATRIX_COL3(m, 3); const T tx = -dot(MATRIX_COL3(m, 0), t); const T ty = -dot(MATRIX_COL3(m, 1), t); const T tz = -dot(MATRIX_COL3(m, 2), t); return mat4( m.elem[0][0], m.elem[1][0], m.elem[2][0], tx, m.elem[0][1], m.elem[1][1], m.elem[2][1], ty, m.elem[0][2], m.elem[1][2], m.elem[2][2], tz, T(0), T(0), T(0), T(1) ); } // Transformations for points and vectors. Potentially faster than a full // matrix * vector multiplication #define MAT_TRANFORMS_TEMPLATE(MATCLASS, VECCLASS, VECSIZE) \ /* computes vec3(m * vec4(v, 0.0)) */ \ template \ inline VECCLASS transform_vector(const MATCLASS & m, const VECCLASS & v) \ { \ VECCLASS result; \ for (int i = 0; i < VECSIZE; ++i) \ result[i] = dot(MATRIX_ROW ## VECSIZE(m, i), v); \ return result;\ } \ /* computes vec3(m * vec4(v, 1.0)) */ \ template \ inline VECCLASS transform_point(const MATCLASS & m, const VECCLASS & v) \ { \ /*return transform_vector(m, v) + MATRIX_ROW ## VECSIZE(m, VECSIZE); */\ VECCLASS result; \ for (int i = 0; i < VECSIZE; ++i) \ result[i] = dot(MATRIX_ROW ## VECSIZE(m, i), v) + m.elem[i][VECSIZE]; \ return result; \ } \ /* computes VECCLASS(transpose(m) * vec4(v, 0.0)) */ \ template \ inline VECCLASS transform_vector_transpose(const MATCLASS & m, const VECCLASS& v) \ { \ VECCLASS result; \ for (int i = 0; i < VECSIZE; ++i) \ result[i] = dot(MATRIX_COL ## VECSIZE(m, i), v); \ return result; \ } \ /* computes VECCLASS(transpose(m) * vec4(v, 1.0)) */ \ template \ inline VECCLASS transform_point_transpose(const MATCLASS & m, const VECCLASS& v) \ { \ /*return transform_vector_transpose(m, v) + MATRIX_COL ## VECSIZE(m, VECSIZE); */\ VECCLASS result; \ for (int i = 0; i < VECSIZE; ++i) \ result[i] = dot(MATRIX_COL ## VECSIZE(m, i), v) + m.elem[VECSIZE][i]; \ return result; \ } MAT_TRANFORMS_TEMPLATE(mat4, vec3, 3) MAT_TRANFORMS_TEMPLATE(mat3, vec2, 2) #define MAT_OUTERPRODUCT_TEMPLATE(MATCLASS, VECCLASS, MATSIZE) \ template \ inline MATCLASS outer_product(const VECCLASS & v1, const VECCLASS & v2) \ { \ MATCLASS r; \ for ( int j = 0; j < MATSIZE; ++j ) \ for ( int k = 0; k < MATSIZE; ++k ) \ r.elem[j][k] = v1[j] * v2[k]; \ return r; \ } MAT_OUTERPRODUCT_TEMPLATE(mat4, vec4, 4) MAT_OUTERPRODUCT_TEMPLATE(mat3, vec3, 3) MAT_OUTERPRODUCT_TEMPLATE(mat2, vec2, 2) template inline mat4 translation_matrix(const T x, const T y, const T z) { mat4 r(T(1)); r.elem[0][3] = x; r.elem[1][3] = y; r.elem[2][3] = z; return r; } template inline mat4 translation_matrix(const vec3& v) { return translation_matrix(v.x, v.y, v.z); } template inline mat4 scaling_matrix(const T x, const T y, const T z) { mat4 r(T(0)); r.elem[0][0] = x; r.elem[1][1] = y; r.elem[2][2] = z; r.elem[3][3] = T(1); return r; } template inline mat4 scaling_matrix(const vec3& v) { return scaling_matrix(v.x, v.y, v.z); } template inline mat4 rotation_matrix(const T angle, const vec3& v) { const T a = angle * T(M_PI/180) ; const vec3 u = normalize(v); const mat3 S( T(0), -u[2], u[1], u[2], T(0), -u[0], -u[1], u[0], T(0) ); const mat3 uut = outer_product(u, u); const mat3 R = uut + T(cos(a)) * (identity3() - uut) + T(sin(a)) * S; return mat4(R); } template inline mat4 rotation_matrix(const T angle, const T x, const T y, const T z) { return rotation_matrix(angle, vec3(x, y, z)); } // Constructs a shear-matrix that shears component i by factor with // Respect to component j. template inline mat4 shear_matrix(const int i, const int j, const T factor) { mat4 m = identity4(); m.elem[i][j] = factor; return m; } template inline mat4 euler(const T head, const T pitch, const T roll) { return rotation_matrix(roll, T(0), T(0), T(1)) * rotation_matrix(pitch, T(1), T(0), T(0)) * rotation_matrix(head, T(0), T(1), T(0)); } template inline mat4 frustum_matrix(const T l, const T r, const T b, const T t, const T n, const T f) { return mat4( (2 * n)/(r - l), T(0), (r + l)/(r - l), T(0), T(0), (2 * n)/(t - b), (t + b)/(t - b), T(0), T(0), T(0), -(f + n)/(f - n), -(2 * f * n)/(f - n), T(0), T(0), -T(1), T(0) ); } template inline mat4 perspective_matrix(const T fovy, const T aspect, const T zNear, const T zFar) { const T dz = zFar - zNear; const T rad = fovy / T(2) * T(M_PI/180); const T s = sin(rad); if ( ( dz == T(0) ) || ( s == T(0) ) || ( aspect == T(0) ) ) { return identity4(); } const T cot = cos(rad) / s; mat4 m = identity4(); m[0] = cot / aspect; m[5] = cot; m[10] = -(zFar + zNear) / dz; m[14] = T(-1); m[11] = -2 * zNear * zFar / dz; m[15] = T(0); return m; } template inline mat4 ortho_matrix(const T l, const T r, const T b, const T t, const T n, const T f) { return mat4( T(2)/(r - l), T(0), T(0), -(r + l)/(r - l), T(0), T(2)/(t - b), T(0), -(t + b)/(t - b), T(0), T(0), -T(2)/(f - n), -(f + n)/(f - n), T(0), T(0), T(0), T(1) ); } template inline mat4 lookat_matrix(const vec3& eye, const vec3& center, const vec3& up) { const vec3 forward = normalize(center - eye); const vec3 side = normalize(cross(forward, up)); const vec3 up2 = cross(side, forward); mat4 m = identity4(); m.elem[0][0] = side[0]; m.elem[0][1] = side[1]; m.elem[0][2] = side[2]; m.elem[1][0] = up2[0]; m.elem[1][1] = up2[1]; m.elem[1][2] = up2[2]; m.elem[2][0] = -forward[0]; m.elem[2][1] = -forward[1]; m.elem[2][2] = -forward[2]; return m * translation_matrix(-eye); } template inline mat4 picking_matrix(const T x, const T y, const T dx, const T dy, int viewport[4]) { if (dx <= 0 || dy <= 0) { return identity4(); } mat4 r = translation_matrix((viewport[2] - 2 * (x - viewport[0])) / dx, (viewport[3] - 2 * (y - viewport[1])) / dy, 0); r *= scaling_matrix(viewport[2] / dx, viewport[2] / dy, 1); return r; } // Constructs a shadow matrix. q is the light source and p is the plane. template inline mat4 shadow_matrix(const vec4& q, const vec4& p) { mat4 m; m.elem[0][0] = p.y * q[1] + p.z * q[2] + p.w * q[3]; m.elem[0][1] = -p.y * q[0]; m.elem[0][2] = -p.z * q[0]; m.elem[0][3] = -p.w * q[0]; m.elem[1][0] = -p.x * q[1]; m.elem[1][1] = p.x * q[0] + p.z * q[2] + p.w * q[3]; m.elem[1][2] = -p.z * q[1]; m.elem[1][3] = -p.w * q[1]; m.elem[2][0] = -p.x * q[2]; m.elem[2][1] = -p.y * q[2]; m.elem[2][2] = p.x * q[0] + p.y * q[1] + p.w * q[3]; m.elem[2][3] = -p.w * q[2]; m.elem[3][1] = -p.x * q[3]; m.elem[3][2] = -p.y * q[3]; m.elem[3][3] = -p.z * q[3]; m.elem[3][0] = p.x * q[0] + p.y * q[1] + p.z * q[2]; return m; } // Quaternion class template struct quat { vec3 v; T w; quat() {} quat(const vec3& iv, const T iw) : v(iv), w(iw) {} quat(const T vx, const T vy, const T vz, const T iw) : v(vx, vy, vz), w(iw) {} quat(const vec4& i) : v(i.x, i.y, i.z), w(i.w) {} operator const T* () const { return &(v[0]); } operator T* () { return &(v[0]); } quat& operator += (const quat& q) { v += q.v; w += q.w; return *this; } quat& operator -= (const quat& q) { v -= q.v; w -= q.w; return *this; } quat& operator *= (const T& s) { v *= s; w *= s; return *this; } quat& operator /= (const T& s) { v /= s; w /= s; return *this; } quat& operator *= (const quat& r) { //q1 x q2 = [s1,v1] x [s2,v2] = [(s1*s2 - v1*v2),(s1*v2 + s2*v1 + v1xv2)]. quat q; q.v = cross(v, r.v) + r.w * v + w * r.v; q.w = w * r.w - dot(v, r.v); return *this = q; } quat& operator /= (const quat& q) { return (*this) *= inverse(q); } }; // Quaternion functions template inline quat identityq() { return quat(T(0), T(0), T(0), T(1)); } template inline quat conjugate(const quat& q) { return quat(-q.v, q.w); } template inline quat inverse(const quat& q) { const T l = dot(q, q); if ( l > T(0) ) return conjugate(q) * inv(l); else return identityq(); } // quaternion utility functions // the input quaternion is assumed to be normalized template inline mat3 quat_to_mat3(const quat& q) { // const quat q = normalize(qq); const T xx = q[0] * q[0]; const T xy = q[0] * q[1]; const T xz = q[0] * q[2]; const T xw = q[0] * q[3]; const T yy = q[1] * q[1]; const T yz = q[1] * q[2]; const T yw = q[1] * q[3]; const T zz = q[2] * q[2]; const T zw = q[2] * q[3]; return mat3( 1 - 2*(yy + zz), 2*(xy - zw), 2*(xz + yw), 2*(xy + zw), 1 - 2*(xx + zz), 2*(yz - xw), 2*(xz - yw), 2*(yz + xw), 1 - 2*(xx + yy) ); } // the input quaternion is assumed to be normalized template inline mat4 quat_to_mat4(const quat& q) { // const quat q = normalize(qq); return mat4(quat_to_mat3(q)); } template inline quat mat_to_quat(const mat4& m) { const T t = m.elem[0][0] + m.elem[1][1] + m.elem[2][2] + T(1); quat q; if ( t > 0 ) { const T s = T(0.5) / sqrt(t); q[3] = T(0.25) * inv(s); q[0] = (m.elem[2][1] - m.elem[1][2]) * s; q[1] = (m.elem[0][2] - m.elem[2][0]) * s; q[2] = (m.elem[1][0] - m.elem[0][1]) * s; } else { if ( m.elem[0][0] > m.elem[1][1] && m.elem[0][0] > m.elem[2][2] ) { const T s = T(2) * sqrt( T(1) + m.elem[0][0] - m.elem[1][1] - m.elem[2][2]); const T invs = inv(s); q[0] = T(0.25) * s; q[1] = (m.elem[0][1] + m.elem[1][0] ) * invs; q[2] = (m.elem[0][2] + m.elem[2][0] ) * invs; q[3] = (m.elem[1][2] - m.elem[2][1] ) * invs; } else if (m.elem[1][1] > m.elem[2][2]) { const T s = T(2) * sqrt( T(1) + m.elem[1][1] - m.elem[0][0] - m.elem[2][2]); const T invs = inv(s); q[0] = (m.elem[0][1] + m.elem[1][0] ) * invs; q[1] = T(0.25) * s; q[2] = (m.elem[1][2] + m.elem[2][1] ) * invs; q[3] = (m.elem[0][2] - m.elem[2][0] ) * invs; } else { const T s = T(2) * sqrt( T(1) + m.elem[2][2] - m.elem[0][0] - m.elem[1][1] ); const T invs = inv(s); q[0] = (m.elem[0][2] + m.elem[2][0] ) * invs; q[1] = (m.elem[1][2] + m.elem[2][1] ) * invs; q[2] = T(0.25) * s; q[3] = (m.elem[0][1] - m.elem[1][0] ) * invs; } } return q; } template inline quat mat_to_quat(const mat3& m) { return mat_to_quat(mat4(m)); } // the angle is in radians template inline quat quat_from_axis_angle(const vec3& axis, const T a) { quat r; const T inv2 = inv(T(2)); r.v = sin(a * inv2) * normalize(axis); r.w = cos(a * inv2); return r; } // the angle is in radians template inline quat quat_from_axis_angle(const T x, const T y, const T z, const T angle) { return quat_from_axis_angle(vec3(x, y, z), angle); } // the angle is stored in radians template inline void quat_to_axis_angle(const quat& qq, vec3* axis, T *angle) { quat q = normalize(qq); *angle = 2 * acos(q.w); const T s = sin((*angle) * inv(T(2))); if ( s != T(0) ) *axis = q.v * inv(s); else * axis = vec3(T(0), T(0), T(0)); } // Spherical linear interpolation template inline quat slerp(const quat& qq1, const quat& qq2, const T t) { // slerp(q1,q2) = sin((1-t)*a)/sin(a) * q1 + sin(t*a)/sin(a) * q2 const quat q1 = normalize(qq1); const quat q2 = normalize(qq2); const T a = acos(dot(q1, q2)); const T s = sin(a); #define EPS T(1e-5) if ( !(-EPS <= s && s <= EPS) ) { return sin((T(1)-t)*a)/s * q1 + sin(t*a)/s * q2; } else { // if the angle is to small use a linear interpolation return lerp(q1, q2, t); } #undef EPS } // Sperical quadtratic interpolation using a smooth cubic spline // The parameters a and b are the control points. template inline quat squad( const quat& q0, const quat& a, const quat& b, const quat& q1, const T t) { return slerp(slerp(q0, q1, t),slerp(a, b, t), 2 * t * (1 - t)); } #undef MOP_M_CLASS_TEMPLATE #undef MOP_M_TYPE_TEMPLATE #undef MOP_COMP_TEMPLATE #undef MOP_G_UMINUS_TEMPLATE #undef COMMON_OPERATORS #undef VECTOR_COMMON #undef FOP_G_SOURCE_TEMPLATE #undef FOP_G_CLASS_TEMPLATE #undef FOP_G_TYPE_TEMPLATE #undef VEC_QUAT_FUNC_TEMPLATE #undef VEC_FUNC_TEMPLATE #undef MATRIX_COL4 #undef MATRIX_ROW4 #undef MATRIX_COL3 #undef MATRIX_ROW3 #undef MATRIX_COL2 #undef MATRIX_ROW2 #undef MOP_M_MATRIX_MULTIPLY #undef MATRIX_CONSTRUCTOR_FROM_T #undef MATRIX_CONSTRUCTOR_FROM_LOWER #undef MATRIX_COMMON #undef MATRIX_CONSTRUCTOR_FROM_HIGHER #undef MAT_FUNC_TEMPLATE #undef MAT_FUNC_MINOR_TEMPLATE #undef MAT_ADJOINT_TEMPLATE #undef MAT_INVERSE_TEMPLATE #undef MAT_VEC_FUNCS_TEMPLATE #undef MAT_TRANFORMS_TEMPLATE #undef MAT_OUTERPRODUCT_TEMPLATE #undef FREE_MODIFYING_OPERATORS #undef FREE_OPERATORS } // end namespace vmath #endif numptyphysics-0.3.10/makefile000066400000000000000000000017071425065123200162370ustar00rootroot00000000000000APP := numptyphysics ifneq ($(shell echo),) CMD_EXE = 1 endif ifdef CMD_EXE NULLDEV = nul: else NULLDEV = /dev/null endif ifndef VERSION VERSION := $(shell git describe --tags HEAD 2> $(NULLDEV) ) ifneq ($(words $(VERSION)),1) VERSION := "N/A" endif endif $(info VERSION: $(VERSION)) SOURCES := $(wildcard src/*.cpp) CXXFLAGS += -std=c++11 -Isrc -Wall -Wno-sign-compare -DAPP=\"$(APP)\" -DVERSION=\"$(VERSION)\" ifdef DEBUG CXXFLAGS += -g endif all: app include mk/top.mk TARGET ?= $(APP) app: $(TARGET) $(OBJECTS): $(GENERATED_HEADERS) $(TARGET): $(OBJECTS) $(LOCAL_LIBS) $(SILENTMSG) "\tLD\t$@\n" $(SILENTCMD) $(CXX) -o $@ $^ $(LIBS) clean: $(ADDITIONAL_CLEAN_TARGETS) $(SILENTMSG) "\tCLEAN\n" $(SILENTCMD) $(RM) $(CLEAN_FILES) distclean: clean $(ADDITIONAL_DISTCLEAN_TARGETS) $(SILENTMSG) "\tDISTCLEAN\n" $(SILENTCMD) $(RM) $(APP) $(GENERATED_MAKEFILES) $(SILENTCMD) $(RM) $(DISTCLEAN_FILES) .PHONY: all clean distclean .DEFAULT: all numptyphysics-0.3.10/mk/000077500000000000000000000000001425065123200151415ustar00rootroot00000000000000numptyphysics-0.3.10/mk/box2d.mk000066400000000000000000000006111425065123200165060ustar00rootroot00000000000000# Box2D Library CXXFLAGS += -Iexternal/Box2D/Include BOX2D_SOURCE := external/Box2D/Source BOX2D_LIBRARY := Gen/float/libbox2d.a LOCAL_LIBS += $(BOX2D_SOURCE)/$(BOX2D_LIBRARY) $(BOX2D_SOURCE)/$(BOX2D_LIBRARY): $(MAKE) -C $(BOX2D_SOURCE) $(BOX2D_LIBRARY) ADDITIONAL_DISTCLEAN_TARGETS += box2d_distclean box2d_distclean: $(SILENTCMD) $(MAKE) -C $(BOX2D_SOURCE) clean .PHONY: box2d_distclean numptyphysics-0.3.10/mk/deps.mk000066400000000000000000000002011425065123200164160ustar00rootroot00000000000000# Dependency tracking DEPENDENCIES := $(SOURCES:.cpp=.d) CXXFLAGS += -MD -include $(DEPENDENCIES) CLEAN_FILES += $(DEPENDENCIES) numptyphysics-0.3.10/mk/funcs.mk000066400000000000000000000004651425065123200166150ustar00rootroot00000000000000define add_pkgconfig PKGS += $(1) endef define add_platform CXXFLAGS += -Iplatform/$(1) SOURCES += $(wildcard platform/$(1)/*.cpp) endef define add_external CXXFLAGS += -Iexternal/$(1) SOURCES += $(wildcard external/$(1)/*.cpp) endef define include_makefile GENERATED_MAKEFILES += $(1) -include $(1) endef numptyphysics-0.3.10/mk/glaserl.mk000066400000000000000000000006471425065123200171320ustar00rootroot00000000000000# Glaserl Library CXXFLAGS += -Iexternal/glaserl GLASERL_SOURCE := external/glaserl GLASERL_LIBRARY := libglaserl.a LOCAL_LIBS += $(GLASERL_SOURCE)/$(GLASERL_LIBRARY) $(GLASERL_SOURCE)/$(GLASERL_LIBRARY): CFLAGS='$(CFLAGS)' $(MAKE) -C $(GLASERL_SOURCE) $(GLASERL_LIBRARY) ADDITIONAL_DISTCLEAN_TARGETS += glaserl_distclean glaserl_distclean: $(SILENTCMD) $(MAKE) -C $(GLASERL_SOURCE) distclean .PHONY: glaserl_distclean numptyphysics-0.3.10/mk/install.mk000066400000000000000000000003611425065123200171400ustar00rootroot00000000000000DESTDIR ?= PREFIX ?= /usr install: $(APP) $(ADDITIONAL_INSTALL_TARGETS) install -D -m 755 $(APP) $(DESTDIR)/$(PREFIX)/bin/$(APP) mkdir -p $(DESTDIR)/$(PREFIX)/share/$(APP) cp -rpv data $(DESTDIR)/$(PREFIX)/share/$(APP)/ .PHONY: install numptyphysics-0.3.10/mk/main.in000066400000000000000000000003401425065123200164120ustar00rootroot00000000000000PLATFORM ?= sdl2 add_platform($(PLATFORM)) include_makefile(platform/$(PLATFORM)/platform.mk) add_external(thp) add_external(tinyxml2) add_external(petals_log) add_external(vmath) include mk/box2d.mk include mk/glaserl.mk numptyphysics-0.3.10/mk/objs.mk000066400000000000000000000000701425065123200164240ustar00rootroot00000000000000OBJECTS := $(SOURCES:.cpp=.o) CLEAN_FILES += $(OBJECTS) numptyphysics-0.3.10/mk/pkgs.mk000066400000000000000000000002231425065123200164330ustar00rootroot00000000000000ifneq ($(PKGS),) CXXFLAGS += $(shell $(CROSS_COMPILE)pkg-config --cflags $(PKGS)) LIBS += $(shell $(CROSS_COMPILE)pkg-config --libs $(PKGS)) endif numptyphysics-0.3.10/mk/rules.mk000066400000000000000000000003301425065123200166200ustar00rootroot00000000000000%.mk: %.in $(SILENTMSG) "\tSED\t$@\n" $(SILENTCMD) sed -e 's/^\([^( ]*\)(\(.*\))$$/$$(eval $$(call \1,\2))/g' $< >$@ || rm -f $@ %.o: %.cpp $(SILENTMSG) "\tCXX\t$@\n" $(SILENTCMD) $(CXX) $(CXXFLAGS) -c -o $@ $< numptyphysics-0.3.10/mk/silent.mk000066400000000000000000000001551425065123200167710ustar00rootroot00000000000000ifeq ($(V),1) SILENTMSG := @true SILENTCMD := else SILENTMSG := @printf SILENTCMD := @ endif numptyphysics-0.3.10/mk/top.mk000066400000000000000000000003151425065123200162730ustar00rootroot00000000000000include mk/vars.mk include mk/funcs.mk include mk/silent.mk include mk/rules.mk $(eval $(call include_makefile,mk/main.mk)) include mk/pkgs.mk include mk/deps.mk include mk/objs.mk include mk/install.mk numptyphysics-0.3.10/mk/vars.mk000066400000000000000000000002601425065123200164430ustar00rootroot00000000000000PKGS := GENERATED_MAKEFILES := GENERATED_HEADERS := ADDITIONAL_CLEAN_TARGETS := ADDITIONAL_DISTCLEAN_TARGETS := ADDITIONAL_INSTALL_TARGETS := CLEAN_FILES := DISTCLEAN_FILES := numptyphysics-0.3.10/platform/000077500000000000000000000000001425065123200163565ustar00rootroot00000000000000numptyphysics-0.3.10/platform/eglo/000077500000000000000000000000001425065123200173045ustar00rootroot00000000000000numptyphysics-0.3.10/platform/eglo/EGLOSTBRenderer.cpp000066400000000000000000000063451425065123200226060ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015, 2016 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "EGLOSTBRenderer.h" #include "Os.h" #include "Config.h" #include #include "stb_loader.h" class EGLOFontData : public NP::FontData { public: EGLOFontData(const char *filename, int size); ~EGLOFontData(); std::string filename; }; EGLOFontData::EGLOFontData(const char *filename, int size) : NP::FontData(size) , filename(filename) { } EGLOFontData::~EGLOFontData() { } EGLOSTBRenderer::EGLOSTBRenderer(Vec2 world_size, Vec2 framebuffer_size) : GLRenderer(world_size) , m_texture_cache() { GLRenderer::init(framebuffer_size); } EGLOSTBRenderer::~EGLOSTBRenderer() { } NP::Texture EGLOSTBRenderer::load(const char *filename, bool cache) { std::string fn(filename); if (cache) { // Cache lookup for (auto &item: m_texture_cache) { if (item.first == fn) { return item.second; } } } Blob *blob = Config::readBlob(filename); StbLoader_RGBA *rgba = StbLoader::decode_image(blob->data, blob->len); delete blob; NP::Texture result = GLRenderer::load((unsigned char *)rgba->data, rgba->w, rgba->h); delete rgba; if (cache) { // Store loaded image in cache m_texture_cache[fn] = result; } return result; } NP::Font EGLOSTBRenderer::load(const char *filename, int size) { return NP::Font(new EGLOFontData(filename, size)); } void EGLOSTBRenderer::metrics(const NP::Font &font, const char *text, int *width, int *height) { EGLOFontData *data = static_cast(font.get()); Blob *blob = Config::readBlob(data->filename); StbLoader_RGBA *rgba = StbLoader::render_font(blob->data, blob->len, StbLoader_Color(0.f, 0.f, 0.f, 1.f), data->size, text); *width = rgba->w; *height = rgba->h; delete rgba; delete blob; } NP::Texture EGLOSTBRenderer::text(const NP::Font &font, const char *text, int rgb) { if (strlen(text) == 0) { return NP::Texture(new GLTextureData(nullptr, 10, 10)); } EGLOFontData *data = static_cast(font.get()); float r = 1.f * (uint8_t)((rgb >> 16) & 0xff) / 255.f; float g = 1.f * (uint8_t)((rgb >> 8) & 0xff) / 255.f; float b = 1.f * (uint8_t)((rgb) & 0xff) / 255.f; Blob *blob = Config::readBlob(data->filename); StbLoader_RGBA *rgba = StbLoader::render_font(blob->data, blob->len, StbLoader_Color(r, g, b, 1.f), data->size, text); NP::Texture result = GLRenderer::load((unsigned char *)rgba->data, rgba->w, rgba->h); delete rgba; delete blob; return result; } void EGLOSTBRenderer::swap() { eglo_swap_buffers(); } numptyphysics-0.3.10/platform/eglo/EGLOSTBRenderer.h000066400000000000000000000025571425065123200222540ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2016 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_EGLOSTBRENDERER_H #define NUMPTYPHYSICS_EGLOSTBRENDERER_H #include #include #include "Renderer.h" #include "GLRenderer.h" #include "eglo.h" class EGLOSTBRenderer : public GLRenderer { public: EGLOSTBRenderer(Vec2 world_size, Vec2 framebuffer_size); ~EGLOSTBRenderer(); virtual NP::Texture load(const char *filename, bool cache); virtual NP::Font load(const char *filename, int size); virtual void metrics(const NP::Font &font, const char *text, int *width, int *height); virtual NP::Texture text(const NP::Font &font, const char *text, int rgb); virtual void swap(); private: std::map m_texture_cache; }; #endif /* NUMPTYPHYSICS_EGLOSTBRENDERER_H */ numptyphysics-0.3.10/platform/eglo/OsEGLO.cpp000066400000000000000000000067351425065123200210530ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015, 2016 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "App.h" #include "Os.h" #include "EGLOSTBRenderer.h" #include #include #include #include #include "eglo.h" static void mapEGLOEventToToolkitEvent(EgloEvent &e, ToolkitEvent &ev) { switch (e.type) { case EGLO_MOUSE_DOWN: ev.type = ToolkitEvent::PRESS; ev.x = e.mouse.x; ev.y = e.mouse.y; ev.finger = 0; ev.key = 1; break; case EGLO_MOUSE_UP: ev.type = ToolkitEvent::RELEASE; ev.x = e.mouse.x; ev.y = e.mouse.y; ev.finger = 0; ev.key = 1; break; case EGLO_MOUSE_MOTION: ev.type = ToolkitEvent::MOVE; ev.x = e.mouse.x; ev.y = e.mouse.y; ev.finger = 0; ev.key = 1; break; //case EGL_KEY_DOWN: //ev.type = ToolkitEvent::KEYDOWN; //ev.x = ev.y = ev.finger = 0; //ev.key = mapEGLOKeyToNumptyKey(e.key.key); //break; case EGLO_QUIT: ev.type = ToolkitEvent::QUIT; break; default: ev.type = ToolkitEvent::NONE; break; } } class OsEGLOSTB : public Os { public: OsEGLOSTB() : Os() , m_renderer(nullptr) , m_width(0) , m_height(0) { } virtual void init() { eglo_init(&m_width, &m_height, 2); } virtual void window(Vec2 world_size) { if (!m_renderer) { m_renderer = new EGLOSTBRenderer(world_size, Vec2(m_width, m_height)); } } virtual NP::Renderer *renderer() { return m_renderer; } virtual bool nextEvent(ToolkitEvent &ev) { EgloEvent e; while (eglo_next_event(&e)) { mapEGLOEventToToolkitEvent(e, ev); m_renderer->mapXY(ev.x, ev.y); return true; } return false; } virtual long ticks() { static bool time_inited = false; static struct timespec ts0; if (!time_inited) { time_inited = true; clock_gettime(CLOCK_MONOTONIC, &ts0); } struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (ts.tv_sec - ts0.tv_sec) * 1000 + (ts.tv_nsec - ts0.tv_nsec) / (1000 * 1000); } virtual void delay(int ms) { ::usleep(1000 * ms); } virtual bool openBrowser(const char *url) { return false; } virtual std::string userDataDir() { return ".numptyphysics-data-eglo"; } private: EGLOSTBRenderer *m_renderer; int m_width; int m_height; }; int main(int argc, char** argv) { std::shared_ptr os(new OsEGLOSTB()); std::shared_ptr mainloop(npmain(argc, argv)); while (mainloop->step()); return 0; } numptyphysics-0.3.10/platform/eglo/README.eglo000066400000000000000000000003541425065123200211130ustar00rootroot00000000000000Eglo Platform plugin for Pocket C.H.I.P ======================================= To build, you need to checkout the Eglo library: git clone https://github.com/thp/eglo ../eglo make -C ../eglo make PLATFORM=eglo ./numptyphysics numptyphysics-0.3.10/platform/eglo/platform.in000066400000000000000000000003401425065123200214550ustar00rootroot00000000000000# Platform build definition for EGLO # Will be processed by makefile PLATFORM_GL_GLES := 1 add_platform(gl) add_external(stb_loader) LIBS += -L../eglo -leglo -lGLESv2 -Wl,-rpath,. -Wl,-rpath,../eglo CXXFLAGS += -I../eglo numptyphysics-0.3.10/platform/emscripten/000077500000000000000000000000001425065123200205275ustar00rootroot00000000000000numptyphysics-0.3.10/platform/emscripten/OsEmscripten.cpp000066400000000000000000000024041425065123200236460ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "App.h" #include "Os.h" #include "OsSDLSTB.h" #include "emscripten.h" class OsEmscripten : public OsSDLSTB { public: OsEmscripten() : OsSDLSTB() { } virtual bool openBrowser(const char *url) { return false; } virtual std::string userDataDir() { return "/no/user/data/dir/on/emscripten/"; } }; static Os *g_os = nullptr; static MainLoop *g_mainloop = nullptr; static void step() { g_mainloop->step(); } int main(int argc, char** argv) { g_os = new OsEmscripten(); g_mainloop = npmain(argc, argv); emscripten_set_main_loop(step, 60, 1); return 0; } numptyphysics-0.3.10/platform/emscripten/platform.in000066400000000000000000000003771425065123200227120ustar00rootroot00000000000000# Platform build definition for Emscripten # Will be processed by makefile PLATFORM_GL_GLES := 1 add_platform(gl) add_platform(sdlstb) add_external(stb_loader) CFLAGS += -O2 CXXFLAGS += -O2 LIBS += -O2 LIBS += --embed-file data TARGET := $(APP).html numptyphysics-0.3.10/platform/freedesktop/000077500000000000000000000000001425065123200206715ustar00rootroot00000000000000numptyphysics-0.3.10/platform/freedesktop/OsFreeDesktop.h000066400000000000000000000030071425065123200235570ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009 Tim Edmonds * Coyright (c) 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Os.h" #ifndef _WIN32 #include class GLibString { public: GLibString(gchar *value) : value(value) {} ~GLibString() { g_free(value); } operator std::string() { return value; } private: gchar *value; }; #endif class OsFreeDesktop : public Os { public: OsFreeDesktop() : Os() { } #ifndef _WIN32 virtual bool openBrowser(const char *url) { return g_app_info_launch_default_for_uri (url, NULL, NULL) == TRUE; } virtual std::string userDataDir() { return GLibString(g_build_filename(g_get_user_data_dir(), appName().c_str(), NULL)); } #else virtual bool openBrowser(const char *url) { // TODO return false; } virtual std::string userDataDir() { // TODO return "."; } #endif }; numptyphysics-0.3.10/platform/freedesktop/install.mk000066400000000000000000000006431425065123200226730ustar00rootroot00000000000000install_freedesktop: install -D -m 644 platform/freedesktop/$(APP).desktop $(DESTDIR)/$(PREFIX)/share/applications/$(APP).desktop install -D -m 644 platform/freedesktop/$(APP).png $(DESTDIR)/$(PREFIX)/share/icons/hicolor/256x256/apps/$(APP).png install -D -m 644 platform/freedesktop/$(APP).6 $(DESTDIR)/$(PREFIX)/share/man/man6/$(APP).6 ADDITIONAL_INSTALL_TARGETS += install_freedesktop .PHONY: install_freedesktop numptyphysics-0.3.10/platform/freedesktop/numptyphysics.6000066400000000000000000000060201425065123200237150ustar00rootroot00000000000000.TH numptyphysics 6 "December 30, 2009" "" "Numpty Physics" .SH NAME numptyphysics \- Crayon-based physics puzzle game .SH SYNOPSIS .B numptyphysics\fR .SH DESCRIPTION \fBNumpty Physics\fR is a Crayon-drawing puzzle game in the spirit of Crayon Physics using the same excellent Box2D engine. It melds cute schoolbook-style graphics with a kind of realistic physics engine. It includes a built-in editor so that you may build (and submit) your own levels. A summary of the keys supported is included below. .SH PLAY KEYS .PP .B stylus\fR draw a new stroke .PP .B space or enter\fR pause/unpause physics .PP .B esc or backspace\fR undo last stroke .PP .B q\fR quit .PP .B r or up\fR reset level to initial state .PP .B n or right\fR skip to next level .PP .B p or left\fR go to previous level .PP .B e or fullscreen\fR edit mode Hints: Each stroke is like a rigid piece of wire with a mass proportional to its length. A closed stroke is just a wire bent into a shape, it has no substance apart from its perimeter. The ends of a strokes can (and will) join onto other strokes when drawn near enough to another stroke. These joints are pivots so you can use this to build levers, pendulums and other mechanical wonders. Jointed strokes don't collide with each other. Join both ends to make a rigid structure Play bugs: goal item does not respawn if lost. .SH EDITOR KEYS Keys: (as per play mode plus the following) .PP .B e or fullscreen\fR leave edit mode .PP .B s or menu\fR save to ~/.numptyphysics/L99_saved.nph .PP .B zoom-minus + stylus\fR delete stroke at point .PP .B zoom-plus + stylus\fR drag stroke at point Hints: It's handy to pause the physics when making a new level though this is by no means necessary. Sometimes it is handy to let the physics run for a little bit just to let the items settle down. From the editor palette you can choose the crayon colour and then additional properties such as: * ground (earth arrow) - stroke is fixed in place. * sleeping (Zzz) - stroke is not subject to physics until bumped by something else. * decorator (dashed D) - stroke is not part of the physical world. eg: tutorial text. You should make sure that your level has at least one red item (player token) and at least one yellow item (goal item). Token strokes will only join to other token strokes. Goal strokes will only join to goal strokes. Other strokes will happily join to any non-token non-goal strokes. If this is your first time, you may need to restart the game for your saved L99 to show up. If you wish to be clever, edit the level file directly - it's just a simple text format. Editor bugs: There is not yet any provision to name your level but you can just rename the file to anything. .SH AUTHOR .PP This manual page was written by Gabriele Giacone <1o5g4r8o@gmail.com> for the \fBDebian\fP system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 any later version published by the Free Software Foundation. numptyphysics-0.3.10/platform/freedesktop/numptyphysics.desktop000066400000000000000000000006311425065123200252230ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Type=Application Name=NumptyPhysics Categories=Game;LogicGame; Exec=numptyphysics Icon=numptyphysics GenericName=Physics puzzle game GenericName[ru]=ФизичеÑÐºÐ°Ñ Ð¸Ð³Ñ€Ð°-головоломка Comment=A crayon-drawing based physics puzzle game Comment[ru]=ФизичеÑÐºÐ°Ñ Ð¸Ð³Ñ€Ð°-головоломка, оÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° риÑунке карандашом numptyphysics-0.3.10/platform/freedesktop/numptyphysics.png000066400000000000000000003066561425065123200243560ustar00rootroot00000000000000‰PNG  IHDR\r¨f OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛbKGDÿÿÿ ½§“ pHYs  šœtIMEÜ${T› IDATxÚt½k¯%Û’4"æ#s­µkW{Ïuß>mܲhÂF€ÝX|j!Kÿ¤éû/úw_0¢±l%°dÝܾnßG½ö^+s>ù3gî:”Tªª]{¯µ2sΘ#ÆAñÿ¬;v¨­"§„e¹¢ÖbF ­5¤œáœÇõzÁãþŠÞ;jm "ôF¨-£÷ŽˆÞ9”RÀìÀŽÎ9ìûç¼÷ "8ç@ÔQJß“ò†R*Òž±®+z'´V¼G­ ‚G­!ôÞáœCk ¥´NðžQr’Ï×;œóˆËÛ¶©ŸafÔZÑZ9þ*È;¤´£õ†V+ˆDrMž ŽV+˜ èÐk > ç‚%F´ÖQjAgB-OOOx}}µbF'€ˆPkG­uÜfçD„R*::€Èj͈!èHi;‡¸DôF! ÕŒœ jmh­!„€’È1r–{ºï0ó¸?vjËX‚†ÇëzuàñxÀ3Ð{¹O98Ç@mh­£¶*¯åƒÜǨµ!Æ0>GïÔ:²~/ù˜ÀV|}ý™P[o­êÏ4€Ôô³ë¿åDÛãï=r«ºÎœswÞyÄdÍ´ç÷í÷KÀc{è3'䜱ßx<^ÑZ“ÏÙ;¶mƒwÛ¶!. bŒ¨µìðôô„œ3j­¸^ŸPk3c½\°çmÜó}Ë€è=¼÷`ç}NyOò슬ù¸.(¹¢äçÖuE˲oö²£µ†ûýŽËл|öN„Þ Þ{€D„Öš|V^Á±CsD@ŒQgEÕ‹f¦q³ˆÎÉ×Ò^ ô>*xïecöŽRêøZ+ ì L ´ŽN N#Q××']”M7Mn¿˜y, ûåœÙÂAö¡6 ”"‡%lÛ†ªÛ9çd#¤”å½ôõ‚÷¨z­­Ø9´ 8x' ­£I Ð‰×^gKºÀ½ü›ˆÖD`ÄDŸEîE|D*Ì|ºö¸,h5#Æ'Y¤µÀ{ ŠƲ¬cÑm[1k@fxvÈzÑ%ø°c4ù<¥‚à4,—«|ö^±§g 퀊Úì™t½Ëýä­dÓø´ùkm`¦ì0è½p²N´ÖÑÑÁäÑå-@Ä訵£5½‡Ä1BXÀ1 kÐk½ãñØÐj…·ëû/¯¯èÕÁ1ããÇO¸ß_ä`(Û¶¡”‚#n·Èɽü"猧wï—§›¬Ù&×µ^å™9Ñ[ƒó%g¬×g Ä`ÚÆ†t1":„Ž@¥4„¸¢Öjm¨E6-±±CÎ!äœá\¸á'ßÿ e{ èZa:ÆÚJ«ð. Ö:‚K„#;¥µöq2ÈéØà|'ƈœ ¼w!`ßwô0{ôÚå !A¤¶&‹‰µT„àQš,LçÛ«,è4”R±„)%xç὜6©fl{–÷N µôáZ½œó nÈ{ÒÛA°}öå‚T:ÎÓˆ„Ä9uÒÊ!€¹¢uAß³5 3:7 u0;Ô.ï!×°Dtö(%Á{Çcƒ÷¥È‚ô~A­²)ç€B_ïå5½÷ÈY²¬ÛMZ=`«tƒõÞáÉ]¬ÆÕ#(;7>@Ìp®¬£;FÎ Ô1N@fÖÏ$§Q­r¢†à‘sA)¹èIöRÐÑQ³d€)eÄF@²§µ66µdy @ë1É~:à½.bÍþÚ<:³ Ѓl]¼¼¼½#ÉÆRÚ±.‹#ø‹d¿ùÕßàåëW„u÷)%„åò!ÈýËyG¯1Føä=[Ãe]q<ŽìvÛPzƒ# ƒ]@k½I&†Rd/‘CÙ7Ø¢ãà€\$·ŠNûÃ9ç½r?4ålÄ 9xää/èô¦Äh¸ß_á½Gˆ (L`8ÙˆÔtƒÊbí½¢ö&ÿ?mD`p¼"8”Ó{ß–eïcD)ë*ÙÀ$È<±ä™Êó•çßs™ˆ¤À;j/pÌpÑ¡÷#mo­éIL§Å‰”Z¥Ôi ½ûñµT´ÞF°ê­¡±¤î­7 âbß/› œžX¶Æç'†‹Z>9n)%ÔZq‰½%ïŽñáùм'üò/ÿ ///¸\.x~~FðüüÕ6W)²¦ÈÃÅ¿.RaÈi‡\€¯_ïx~ÿ1.(`ä”°§ŒËõ ¡´ G@©5U<½{‡^ëÈøBŒèUNfnè­ä={ɾƒó^öžwèåøÙZ BŒ(9ƒˆðõëW)ÃÁº' &‡£n lVvúZ+ZíúP5mk½78çá=L:rÎ –TýñxÀF«¬éi¹À#啺µŽ(WIÁ©ËÉBDØ÷]Ó²€²íšYlðÞ¡÷ ÐQǰ€@Ì`ù<¥¢¶Ž^¦ÃÀy‚sR[ךÁ „ ‹ª”6jCKK™ 7jR»Yl¢&ïK êëV{9„Ej¸= Ë‰n§îËË ~ïçÏc03zÓ¦3–uÁž7P'„Þåõ픀”Zmºûø?Û°æ (×+ÏF°‡#Z’ç+kYkúRÐj“Ö¢ºa‹ž\vHY±Mõ;ƒÁšÁèÆF—祟/¥<ÊšZ ,hHæÅ$Ï´õ‚V`I‘—eŸA®¿µdïÓ{G`/˜€–XŸ_~‡wïŸQöŒRj+øÙw?Á¯~õWø7ÿ×_âÿðñGðÃÀ2RN{ÞÁ^ec‚#Ökï½#ç„Òbx¤µ„à±¥ -g¤´ãÝí=¼sHy×·`YVÜï_ÑZu†c‚óëñú*Y09F-eXÇòo§ë¾ôb1Ð[EÓÒ‘‹dë²"FZ0Nyúì0²òÊþ¯Ö /§´f$ÔEÄÇé3@¶ŠÖ€Ûí†R ^__p»=É©S:r®`'µ|ÎÎ;ÔR°ï¬ëe” ’®5<8çtsK½Ê­¡í _¿~Á÷߸ß7° X–9í²ÀÜq: ȓǩ°,ì Ý‘¦âŒN )m#åî]ÀÇ9%2œBB‡d7óÉVkµ»£.¯µ9£wBï!Èg+©|½Þäók´Ž1Jù„ŽÖñZIe™0p‘y°€R˺Œë(zR-Ë‚Þ µ°'©ßõý¢žÞ{0¥&ìû®€jЀÙf¿è5Ëâé¨cƒ2I@n­Ã{­Ùõž†@(%ë3ñ&!¥m0Ï]3Ef‚ÃF¶.ר[ƒ_.—‹žæ‚Y pΡ+p×ZX“-êŸþô;üîwŸà X—_¾¼â_üó¿@) ÿÙ?ø‡xÿá^¾~ž'´ÞPѱDÉ”jJ²éjC§Ž\¤ôBo¨¥,>â×?áýó³”KR»àÃó{Ô*ÙOð1D¤²#h¹,xˆ–½Â‘T‚H[‚wNÒcÔNÈ{wՆܯëí†íñÐÐ{E\W¤}ƒ÷~¬q;€-ãjw Fh½ÃýâÏþôÏkÍÁË&ßw0I}‚GÊ£öŽÆjièt}Y¢.^Ò…ª5J­¨µÀ‡ H-5EºYÞµ®Þ `qßvø° ƒÑÀÎÚDR†ˆRˆ^ë<"Z—˜K1¡£‹|”à°§¶1rNU8Gðš•`BKe'=e=Bk,:t¡×ë GŒ”e“s¨µc½\sBtàä¥w8/Ýb‚sŒëõª,É‚¡†V3‚`â¼¼÷RçéõF¿ 'Áh¬^/UN¸ŽŽœÒÈ–eÑ:7+Þâà<©ï;—ë €€l­I ‚H— ¼f)ÛöÀöx‘€Ñ±Îiƒ³S¾W”´#=î>àþúÇÔ ûþÀ»§›d=Ž¥ãô¸£i†ÔZ…'¡á#ä»^W ä}wYsûö‚Å5äÇ+>}ú >yÁåöÿÉþàÑpÿú‚’j-£ÃDè¨%»€’µ$0I‡€¾Ëðï~ýï°§ßÿì{´ÞRBÔò+×<|p¨Ýž‹Gëë冿Èy°óÈE¼Ëí†û¾!®«€´%½C¼\F-ÛŽÀN» " ä¢7Ö¡Cö…ó@kr]]3&Ø;Yša´\°Æ^ÖúTWûˆÚ¨U0G8ï`ã4µ“—ˆ±m»€bZO·rÔ´ ¹ÖJsä¦)Emðz2Xôvžàý‡ï€.Hò¶m¸­ë¸wGÉqÜ{û{Õ:Q¤‡wò z눗ÇëÈX¶mCrZî{FªÛȬsâf p$ƒqçîÉ–€Väºj.ã´i¥â±mˆ!¢·>p€^+ª¦•D„§§ãY ¼“÷ƒú†ŠÜwŸ?}²,¸?^»X<¶ ÷û!ĸ*."k%m YñÇ_¾|AI².öÖ‘ÊGŒš#½þùÏ>^ðúúŠôx•T[3, àRkƒ=z«ÌõA[jÞÁ;Ú*j|áýû÷ðÞáõ¾k¶Ø@p]Öã¾!\¯²ƒ–° ˆqÁý~GtÞ;¤ÇŽ‹—½¢Õ¡u`¿ß2š%g8///z~òýOÇ3dfì{°¹&l òÁyôÎÚîÔÖx ðK„—‹…. Bé$§ Tµu4ÔœµÎ—›BDJ/` Gí7mÓL}l[ôÒÔŽA9ÐúÖ:â´$(ô±[+á2«m–$›Yz(ÿÇ'Æ%\‘SÆâ#\ô()I ³ùËÿ ?üðƒðoJFÔÏýôî=~ó›ß ’¬Ó}ßñüüA¹-’ÅÝn7xu_5¸pÁº®ã0}ºÝ«°à½pÆFíí„H#@¶Ù$e)Ej2ég%i0JÉ Žì&äš½Kýj †mL‰ÂMJ(ùÂ9yÐ̬íhÊ*§½²(r®å4|Û¶±™[ƒ’*ʆïûŽeYHÝ‚ÃËË«v¤Vÿüù3º®È9¾ö‘ Ñ(Q¬›áœCÚv ZëeE-i\wÎY2#Þ{))rÊR{/À\3°’à}DÚöq_¬†ݨ ÚȹŽöîðäqú¼§1®’máåë¬?û^‚9ôÖ@SæPkCé µU8AdQ[S¢”n~"†ÇR¥| >¢¶ ï<º’Tj“ õávþgé8åŒ@BÚÒŽ…t“Rãv»Éµö:ñõzÁ"Ø–pÁ–6ágx­U8åôÞÑ ðžOHË’aœ2„"o]¯(¥ár¹"ç‚m{ ÆëuAk 9í£í™sAˆû^ñõë‹dr%#—„ÛÓ_^^ÐkFÙøåÿóWøøë_ëŠ?ÿáocHÙ·¬+Òžp»^Q÷W<==!FÉ&?þŒ>`Y”Rp¿¿àz½Â/Q‰qK¼ ÖŠ——ÜÞ]G‹±” ÷gößü9+M)´ZR`‡yôk‰iœä†¤ƒ„c§NÜtCåæÚiÍc!Î'½W69©÷Z¯ƒld5ö²F”|œàn*l!Û¦°“ɹ02„9X*Ü{*ÆxJ´÷.u~?gï#'PDzD0»ãû£,ÁÞ¥L°ˆ?1ïF#¥÷Ïm!»FfAðïQA¾®ýn¹Nxâƒ$Ô*4Ø{‡ÚЦìÝ,YˆÞ{´V5ÖòÂû#½žÓxz$]õÒ“ï„Z\d’®“;GjÅŒ h€evr†äÄ01,Ë:mšœbŒšEì`&\.ÒÁ°¬Â{/´`e;Öªhm-£ü,OTgIÿmÃp* WƒEkp8%9É©.ÚÑÖ!Ø›_ ¢7ÉVBðhµËýÓÚÝ{¯Ø‰=ê•Ǧ)¥HFÒd³=ö PŒZsv’ ŒºC'æ#’{(H¶œâG©ÂÔÑÏT´­ZJFg£Yg}†aàCç~¿,ø„iK´ÉÚÊ{ª²¶u÷}‡÷=#—ŠÏŸ?ÃiÚokýh¯=¼<É=ê@“nà.ÔÆqÈıÄE: ­ë œ…μDì) 8¨$¯OŸ>j§¦ƒƒÇ‡÷Ï`ï‘÷„þà÷ñ÷ÿ㿇˻+¾ÿéÏ3X—ñl/ë‚OÇŒÇC:Y‚Axø°®+ÖuÅãñÀívÁÇ¿“6ºc¤}CÚð!bYVÁ ü‹=íð¶Ç Þ’’ZömWí%²CA–^&e‡ô´kUÒ<¶Z[aþPtYW°?RД*ˆúèU·ÖÇÆ²w³zë®›è 4ËÚµ°z|nãIÖqЇ·í®'£?=Ø}nõÓÓm•¬Þ¬µÃ{BŒëK)Ò.s›gÔ\‘µýɬRJÂvÓ~,Hºì¤%S«"Ò }/§mž>Òz hrnÒ…‘^²=-¨žÚ¥hhÍ?2 ÍÌjƒòïµö¦®œö+|XP¹‚z‡ƒC-–éÙ ¾Ádºò+äM(Ô]4›/X–ËéY/˪¯{´i­ká\C.Ÿ?–`ýtEªKðƒæ Çx솓ı‰åùÅØ9 ^5‰vÂ1[O9Í6´P5Stðp>Œûüüü¬xNÃe½¢VùYðSYøüü,ýú§g0÷-ãÝåï®ÏzˆUüìé½ï™m…î½?ðÂx~^OÙi®eP‚ß¿œî¸® z ND¸¿|úwiHûµ7xÛXnxH $ʬ!›X‡y¤~¹ìºXYi¡Iû¼’>‹)ø€\+P ¨7äÜÆ‘“¿é"aPÕ“nFÞ-;!"ÜïÜï¯#r/Ë¢" «`Dœ£Oþ¨)p—‰Fh»eœ‚Öcß¶m€jÛ¶!Æu´à$ø1œ§Q^ÈáßÑŠv BÐv¥=Ú X÷ÞZ]Ö $0HÓkÛÀ+RÚô:ýÑæáŽ×»²ëêPë>ÀDP“6êDi’±c,H¦”Tx%ì¿\2âe…s,e~fÏî`mêg”@É£Cd]Rª¶¤­Ò5ùüù+–eÁ!hÙÂNVÊ«¶‰¯×u¬7 î÷û—«ŒOŸ> ÅwYÀ 8¤-c]亞Gë«–"ôÌ. ß5z¤p¹\±í;:1Ví›So¢æ”[ÆPjG+ ŽÛPpyçˆdh¹Ñqý*§ZÞáƒ^­™ŠœÒG{s„ëÓ;À{eÔÆGj+J-fçô„öt†ór’µ®xL•“¾”Œ¤¤ǂϲ Àº\P«ÔÊ!,ºaª^i»–Ð!è7È®Œ”DRŠ´.J<‡Ý"Rí`º. ¤ —l¨>µP³n8á’íæg”Rq}÷„ÞHZªÔ”õ§›.‚gìÓnÈÉ[[µ­Wœä~ȳì¥\Þ=iy)Ýfáåï)aÕL£wé¥72‡û&Ï©T€»R¢[‰ÚÂ}¼>ðôîZÍH)Ã9Va#—zóp¨øòùþÖÏ~ŠšwpÉËE@Ì…QjÑ« •ï"¨Ù3ö~¿ …½I R(uGô‹—‹tè|8éJépaEc)ë:O ïÜêÖ«dmÛ!D¡ËIäà}Wä˜5ekCÉ'Ñ‹ÀÁ2 h”*ݤÑÂ+#¥·^ng•¬ä\…_Ý*BÎDí¨ÏJ¨iª“‚Ðn³Ö®Î@OXd­3>Ñ{Ž€• —ËEÙŠBAþòõE€.H¤v Ü%}¸…ŠY&Ú%³ÜhC{'¤TÆ5Î=kƒšþ¢w‘Ô²Œ‡JÎÏÈ…ý@÷gLbÛöÁý·úóa;ý¬}(7IÛòÚ]Z²½éF”ÎŽP†j=Ôw­µQ¦I‰"_Ë¥`Ñ ÉNÐCnëÆß ³i­I«"}¡QËÐw”v ²žäµMvûx¤å¤HzkB«Á™¤é!ð m:¨têo°Ok§O²ªôìã:­Ü4®Bkò|¶mÛ±Vp\[Påa¯v ‰fĈt]¥ç1J­þîé†××ÄñÃ?à·¿ý5žŸ? \ßÁ³€Í`‡ \].âÃá4(‡½dxvøîrÅßüò—øôå3.7•iC;bÁäà ¹·‰ðÖBœ#èÙÿyvN(ºJIe=1†¦_#=+!ƒO ’éµ Bí$P¦>³~;nühU©(eÞì1JºùÁåTµÇÚ•äÓ¥½kP:ZÙœn¼Ÿà 4>×¶m#X×UO¶œû7ÒÕª‹–ƒÝ3g÷G™n4_˲ üÀ(Ç]KëXF0 7º¦ë¨##“?é´ñ¬Ý™RÒ’è2´ŒDðç4giÍa<[#®´ 4<‚ƒ¼)»;Ú¢‡©ˆ”]‡iGkvOŽçÑUhv<#óØÑ»RªNYà‚+«í~¿+?D QnOO¸ßïÂ%QFIŒgÖ¥µ°[ƒbQ‘‡sr_ªNx(9W àG̨9­AÁ‰ÔVA­ãérÅ?ù'ÿ5~ùÿþ%~ø½ß;àóçÏxl¾ûî;”,xÀª‚·€€õzÃc»#ÆŸ?~Ä»çg“AwËüñÿÉ÷ß!® žžž`B>€'´t) Ï™éà|h·«ÖfQzIÓPDÒ¾>-š@ª¦u+ŸÀ¹Z«š5Lß3¸ð'>@ÉuH =mªsúµùg†ö»Ë¾ßïã½eƒè©c§ÄÔf”çNj¶ÞÛ ’üö·¿Åívl:kš¸ÉyeÒ‘?x÷­cn›Î›¥jûÈÚ§¥6­ãÚØ8ÇCá.šÜ88‡¸,Cmgü~¿ld¾–Ù·Á21/-Ûa–×?¢~?¾æ{%Ýìí{QRÚ„±ƒ¸^_[EQ ³¼Ï#r)#H±#i%ª®ÃÞ«ƒ‡a…•dؤÕE¨É– HywζP•N] #+j•ŒC€gä´ÖE»ÂZÚæÞÐKE%€9“½Õvx-ô&™Î—/"bûþûŸâŸþwÿ-RÚñ'ò'X.7ÔÚ£ÃëçOøøñ#~òá¿ù›¿(^N IDATëè¯ÿú¯ñ·~þ®×+œ2å0¹¢©ÌùýûŸàöô,49¤šQÑáMNŽãt7ð~ðJ4˳ ¨L@ÖIºYÊØ¸vjY¶)æäì¥C`é8ýqÂç#ã‰Nf£þÊù  /SæÉÍN¹ÄÙ÷LÈ1Û$à ,(Ðä 0²¾|þŒ:Jwršyñ!ÈÆw«›+ç~*‰æ dµñ¼Ñç6ëÀ3~äבҷÑë7Gá]°ž¶ôÌÚdÕFj²¶¥½oŒǦ›ÐM‹GßTPùõLAöN¯³uµÜ¢éNÏP¬ý°T “öBNfKÿ¡åÌDÐ* Œ6#yZn*#/µ4°€ã3ôQ&åZàÉKzÎ,Ý—ÞÇ­½¢W±$+#&ÉáÁH9 Ê´`,n"Vthb×´m”èû¾!8Æõÿ±š»T|øîŠOŸ>¡&É6òþ>~ü-þçÿéŸáÓ§O¸\üí¿ówÀìðúz[LU¨–Æ¿¾¼ó’eY„G1<ÒžFö7œ¦´œ+%‹ÜÙ)~CˆIEŒádfqÔ²< d© ¿kÞ³ÇkÛð Ù°ºœHÞ?Yˆ3ÉYš>Q}‚IM€Fó”¤f›{8x?Þ3„¨)þ>ð¶¥qB MT”1F\¯×¡ 0ä¬0´ÙÓœfc©ö©›bÙŽ îäã&@1’ù—á‡Ã”WéªeNVRð584´ÑÎÖ`jOˬ7gfóg5²3¡¨p«Ö¤Öo|PyóPÚ³Ü e×à½Ç—/_”,&~FRJiWªôd½Q:öp>¢’¬‡%DüÃÿâ¿Dk%g|}y€|Ö²Ù}ÒV³÷ÒÖA”„vý3É͈yµêáÜXµ]MbÁa|/3ÃýéŸþ韣Kºíƒœ)÷Ç j+¸ÞžÆÃ÷š6⼚º @m€Ç¾oHN’În :PJRÌ€]´vÉ'H|ðj! Ž•?ÀÁ†FUÛu@ð‡xÃÐe©UÍx³ Ö‚———ŠÛƳÞšð¼¡J9sÌ‘þ¸™OðØì//"¼˜ùýè„Þ$–RáÇÏöàøt-³¤ ã%eíÄ4\/½v€Ôl³4¥àj ÛzG° Øö¬\ÿ2X)e¬«¨ÄD±(Ê4i¥ &Øj¡’‰‚£l3ëVB ÆýÉ9¡ÖŒËeQG`VÃ&áˆÎ¦¢€sª¶kE~&x„‰£ôà‚¬ RoÀ*ßoF®R&ɽ!˜ç€ÖÂý\ú‚„G†eÏÁa­ÈÃ“ìµ ÄeX˜µÖдõœsÆ»wïp½^ÁìÕVLø÷޽F*ÎK&‘Ë>²ßÚŠlR5P19á‹0Kù|ä<–E6ÿ#Š ¢ ” µm Î)ÙKSLÍL^|e†Ÿ•e½wlMÛ^‹Ê1KÚ.¶CPDØØu’úclª¼ÝX ûvGRtÚ:.êÆf?Zl¦Û1Ž@Úç ÁM|ô–eÑ>y‡nhøg@ð­„v®Ñç´ù­.ßNžXOi5MÖYGÿ¶]úökf‘=3ËæöèìùGDÂÍéBÚ)S–% :0‡UU>RpVàœ"KØi0<ë)†—¢°¤%„¹c£œÅ[v/ä=xh2F7NËqÉ­ãu–å"m[¸á3·÷Ðô£qkj;iÃEf;ù¹åÊ#“š³³ù>3+I±†Z§Ž†wà&ìLëŠ13Öu%Ÿú¥ä£ éxØÄHYrA•‡í¤)˜ÊÙBäÚ ]yGÆ(,C[«A•‡1F8öHªe±×™³µ2H!RPÕ[*¨°Ë{>-¾ÁìKIõçy\¼Øq P}À£$nH5ígⲈàEOÞ×ûCR~MGÍʘY<ý@vt%'¹ÑÃ7.AmEg аJžÓ@û^+ æÖÉLtjû½mÏýX©3sÓÇ)£©·Y2͈±ªó"<ì¾Û‰ìceÏøõqOæôÖþn,Mû,âf̧úÞžcîT³š+“etS™|æò )ÉÈf:„‡  h „ÄÕ»øõ›|k"½u~à½Ï¬ÅMnktûè õ}>Ò–uÃÚ}p/T Xuó¼rÍàÀúøæÂ6ß²,ÃÊnÞÀ–€%úP˜î\+ˆ<±8QWo!ôtUØvû³Ú&°R÷«ZqNé‰$C(öd?cþšVÐÔZ(¥MÑ”†Ù[${ßw 7ô&›/í»TȺ›šjBmõðêk¥ .·±bô¨UÒ±”ŠÚ^_ÐZ΃Ž;\ð(ÉHÇ)ç}<™~ÐÛ¾OØ~q°¡fÿq›>ÃãþÄ$œJsWÂ܃,™Ñ'w‡»’£‰ëÐG :$ÍË$Òêúði´ZíyÙfh<L6¨l¾2®§µsËlž`­Nk:Çꕟ„pU+£;ù:êÇë@¥«£cãD".XÓ¡˜ÁѽZm€ØžÄÃsÐhÃs¦ãœCmyÊXœ–]Uï}Ó<²_£ckùSè$/8‰w^çì„<0 7©u:Íšz]8çŽá%oZ°p n^ÙŠzð¨Fä–a£k«» M¿ñØh)‰-ºÚÁw5½•ÀÚ”•ÛÀ®ißßöO% ד½-±nIœõçcúˆùé©§€wÞ)Q†üIÊkD3ÿ°“@êKäK¥˜<Â"©OmbÐxâ"L›óíé` P~Jýè×·–ãoÓ}{s[Ò"ÿ¡„<˜Þªçô6¸‰åP@öIöÜUB|¦K=¯ ˜yòf8gi•Ök3ÃPk)Ñ‘¡˜TxYâ°*gò¨-Ÿ2)S§¢‹'Æ`ÞÓXSr_êÃtâ—7¥™pS,.Hö`1©H[³ –z NòZg磷ÄÜŘÛÇ3™hVXÊçÈ߬?ë Œµ0µ­SJ:‡AmVª:t꨽Ã5œZÓÂös£«ÑYìÆE-Ùp½^Å.Ʊ«é ô^†Q(5°;|'¼= ƒOýÅÒ†}ßà8è–±+'ƈe HYœ]BhEtðÛ¶ár¹ÀyTd17|ùò×ëuP/mgÝN¶¹×ßú±QDÀLà vþÞycÏ—š-žxì}´Fò‰}ç=M:„cì™÷~ô|Y…8Ýì¤ôwíD÷MŠ)ºû2|ømó´vx"Óu0¬¤©Ý‚\ÓÈ\æÀ1ˆY­hzÙ§`{ªm²¹†$Ó{ÏTæó÷AÛ“M„Oè"Vê­jÛ¯c¸ætjÃ}Ó5šÌQÛ·_·t\4 îÔ"y¥¥A¯@O§ûo ˜ÁäÒ¾ÍM‘y¬'F­»>k'î:—u¸8A{ìÖ•jõ8äM(7[sÛ(=3«¥;t§Ùj/£¬z<:Kc*!åŠ5²fwtü9JIÖÉN¬AuÎn-38•öv*uE»ú¸^_eDÒÓm7Èëim”œÅþ)it AFK®Ì;vbÊñáÇ—–Ü.Ë‚šË¨-­¦Þ£/ç4ˆ¹fq(îÌáÔ²›m¼¹¦ŸA°9h˜ï¾æEjŸÝ¬ÊÞÖó‹Šq ûôûXbŒr´Êä4>\“z?N%;©-(xϨý¨3­ßß§ºs΂æ c&–Ũ׬öÏ9‹?ÁôÍÌl®Ü„Ô ±(‡‘úkh¥*‡CNà%Ê0«õß‚`B»=ìæÌ+²÷6aüÍ3;ù@ö£ågs™Y9'Âî$é090š+ô1[2Ž2©Ís ZCSuoò’=›?ë3<¼µSc%Rý…[qêÔið*Žë´¡9×á "?wŒ~)vän|¦¹Ä8Zo¤€'÷ƒŠ}Œ›Y^sG;T7B:¬n·nÜSû¼£ËÐúÔ³kð<àeZ]ù™Ýà2èGï‘v»qN2 {¾†œÃÒ­7°óˆq9’Zd™Í»¬6x}"3‘·Ø{Š>°žÎc¾&È KûÚbR;¶=ãËׯofYÈg²À"‡–p»¶ ë'–iVZµ9TI0#0±–Úöýû¾ a ³˜ù¿ÿo=§$uƒ#òc‘_.—±X¬Õà ¤{NífîøP{ÁýuÃåvCÊ%—Û®Ëab1sÍÓ¶ 5]:Ýè­häŒãäòŽó ð›HŠÑQI¢æ2ä›//¯@Z×ëiA[9RkqÑÚ¨ÆÌò·ý5®x<¶QSz/¢"R·›Nw&g5⺊ãÐÓÓ¶í–¼¾¾¢‹ Ý0÷e „ǰ âñx }Àú¼¾~ëñxL:†ƒÿn Éù>@K~‰“0+ª¥ãåå½7„°€:Ôä•4“Ë£ÌHYØâ#çǶaÕ“p"kYk•˜ÐjÙ›d}³[³×ìPÚY2v¬¨?€Ú¾÷ §B¡ì …x™üGWBOkëˢ6§®‘¥Ûf¨i™†tÔn¬É4]‰™êvŽi”•Î{e6Î)ÇÁ`³$; ¯àuH¯VRB/#s¬¥ÀqÀ¦Vé#Ã)ë%мZ}2Öõ¢–`&nÈ’²Y½;ƒ åôÜ›žë5ç\XÐzE-‡yÈ#·“!çl02×›qG_«e‹€Hå»hH©àéé÷ûC¾”² ¡3"€â2Òmï=œ– ¦HdñÎz€·Tè¯_¿Â9“[ýOrÜùT›®ÝØXoös¶ù  Šoxóx§Ù5éÈb¶o,¹ŽS‡±ïI‡€Ð ü²!$Œœ„ãá‚°3-ë„ÓÁÌ ÎBšÒTù¾+ˆ61^Qk1fÆâ|}¤ýÔþ³…kŽ8LQ­Êi‡ ¶õ×*dœ„"NhÉÚ Âò HäOß\.Y¤5VvÒ pƒ½zЮƒNÊìÒû¶¿w›£€ä²ݬZzzù®%iyÐxd'ÎKi).>’1&•£³w¨êX4sYæR*Æ9§¡ 5OÈu ƒÈG¨êÇ éŒT“˜R¼Q®à$}vM‘ttV×M#0Qõâ¬>{,é ‹¼GoY½çÎé¯YL ½­êd¢¢‚mË —I;¬ßuÔw‹\D6j\È0ÌRªŽÓ¯ôaT)^ùN‡ žUhÇIt´Á˜ÃýÅ:¦y}G®é›Á¥'Is>ƯÛX±}Ïúðä·ø ñ#ÚM£Ôë@§-xÒ{€J!Æ•ZË \ë8´ÉŠÜObtÍ0fyó,·_9§ãú1÷ÏHsskZ^¿Oó1@p$ÔÅœ3Z'äÒ°§‚=‰1em@ë4llKÍ]ÔQ¢œÌa…Ἄì²hÝÞnF1‰‚æ‹Ù÷„œ’ÖcEi§uøÓYKË{‰ž…”dS„s °™@²scVzí ¹ì9¡4Y sd§È˜/P+®— gÆ ÷^Gž•uóµk2ŒÀxÒ}Ê­7-Ê9™±‡Y`eÚL|šÁŸ¿8ƒ…}bË ðˆÅáiÏiHx½÷èµ!¸Ï ¥Æ–á¾++ŽÜ L5fßió¿Ñ4µ"ÿBž~@M³¦V1¾ÞIOÜÙ÷€†ÒpænühXÔï¿)ÐèÔŠ.ç4©y¸×RÔ5éüZ½)¸©KoLQâž­àç–¤mxÖqõ&—ƒ·žÔÚ›iìs÷,+ˆ]kž0Cµ)VmíxïQÂÁûCÏ>¡æu²Qô¦T\"õ˜(²:YyèÄ^ùÈb.*ŽÃFmm4§ó ‹jüÈlGÐ ápAÒÚ_†vöñŒŒ¤n±†Ü©K3w™9çðPáÛãñzØ´ÛD瑵Ž"€O RSõVÐ[Q!JS3̪)ºü–/ÉöÄaŒ"b\Gg਽èT‡‘ô† ž ¬¸9yºŒœ“yï½7xp¿ßÇð¢>ÜkK*ósï*8š‘Ü·‹ë¨ÅªðÜ2b”ó„Ãä§/Þv–†Ï(û[Úêår™°ªÙBiÛ|š¿U·Y`zKþ1ÌâíœÁƒùç5=>¸cD|#ñgèÑ»aÙÞZAíäpz^voÍ|ÂÒÛ®M,0lIº-i3k/\‚¤§ŸhÀí²N)éPˆ:™Ò<¹N÷nî°ÌÏ|.ËÆ³­ÚÖà™°G@¯5í¨iGÙ·o2±1"%íÿWÿÇÿ9JÞ'›9ŽÄ,§6¢óíŽÁ24Zvx"VM€¦éfP]²ÑϹ³Ý óÂ[ð’ÐJE£Œ¸.§6“™€OéªMxa–:•˜á| µVñ‘o-ƒ¼7[m)°NgÚ Ç%Ùx­³Kz)2Õ7=xmËÑ cG:Õ”JW GJ¹L-¯y¢q?q¸Ï2ߪÀŒÎ®¦Ûð 0ºòL=¶±ggãÈ£Åh 5çè—`ÀLš§Í܃ӽÖQWo»4gN¸-Æ£S!ßBhŠž{çDÊü7œk¿2¸ô.&®Á íÖôçÖÌ:Ŷõã3÷qŸ‰8‚Qô‰Pƒ¡<ìâlÁØ‚’IVôf3 Ú›V,X¢|š\E#³™]~æ 23-ð±º'‰ïƒ<³ÿè?ø#É|é°·{\kE¡‚0ٲ٠VR%aû†Ã¸‰bƒ‡1ÆENsÇäÄ­ÚkÍ’ %^ÄUNp[ô–òYËé˜)wpÙ ”YðrªõâŸÍ.Ââ±ï²ÓÜ$ް‰·ö°rœ­Ú÷mx &5â4O¿Ûí ýRw” &_ѧ“;Ú!!Š·€9çÚø0’И¶;÷›·mGJveóõhÄÚc q´‰ ІKŠŽÿÐ`H™âGm{LP®“° Klbò‘m´‘F¶`f¬™DµòâŒu´–ö?àý @CJâq¹®B)æpÊH9ç9q@GZxæ‰è_L%‘ZÎ91—ÉgǧyRrk]»B¼F-Í™EŠ>È.³lLì}S6»P °²w*µf¼ªå‚û€‚r´€œ­aY®(6ë‚„'#™hÃ/È{Ñ®…S†&©Ué¨9?YµËA´^.âkáZÉ£þŸ5c„9•!S·öçVÔš•B<™©|ýü"5.3ÀÛã+ЋÎ"ZÍX™ëÈÀ ?¬¥lJX5-h’"×^°ç >ºñÇ{mÈ©‚à°Dý‚V:Ò.Ž.>,ภ±à ¥·aAmºÿe‘E}Z‡g¯mÃ#E.)Ã5¹¹ÃÓ‚´e™] x2b ÐéTcpè±H%m~}‘a(­·aØ)m*‘8ÇqY# 18°’—¨3ÖxÑI²f?FEÙ`T *}špd‰ÃxÄV_¾ÃÖ\‚€ÈÀ$н0¬Ãµ':ú†ƒšUtÉk¡#wQa¦\U~}A +Jn~9º •A¨õ8Íœòú=9p<Ñ1>¼‡ slB1!xj–‚¦2›[WÈ”4¸ÙÄ5´R¼à+Á3tÚ›fÒW÷A&&ÕÞÎd0±Æz륧$æ1p öRÑÙ‰Ro‰¨ÛîÒ+\d„5 •ŒÚ"ríØs’ MmW\HDHµ‰áÄöôÓ¤œ'¤²ƒH{A-}xoÆ(ú ±¼ï.àȃÁZÛÓ™·õ>V"z…w„ÚvÕ_´©Dmð^dz©ö†š¤¥bÔ^»8úniǺF5ø'Z;M×u±Ç¾íºÒ^tØÃ:Ø}Ýá`2Ee{Ø$¶Q^˜ë ©‹‹¤pÒö¡Ä“UW©»”ÞƒZ—NEëXu‚ªq -·ìf®‘ìä°TÛZ`µ$nŒ_Üüœe¢mm·Â&Ð6ÈŸ1Èô™YÖlÀŸ¤ò}Šð8HÆ6óAúáöžr Û~—ÍvAˆ&ÎIO¾7Ô.xÍHƒ‰àƒô™³P‚9‚½+™ÜÚØ‰ö'( „P“uÄcoÒp(¡'hÐû1H+9sÎØöLŒõ²Ž,Ô2¶Ã 2£w¯3$%ï©àv»¡£"g9{=‚eÎû)»×9¨à7eœZÉ Ë„ÉIy›Ö ua™›Ù‰Û)=ÛÐÍÿþWÿò_ ¥„ÿôü#‡:³õã0*ZæIõÔ@õÐØ: òÑÌ·È9”©^˜ly̯ëô‚yƒØ/{8s/’¦ZFìšÊi.½±ò,µvh ¯Úq–a¢cCzÒºb)M6|R½Ðªiº"è|ê›—¿IN…ŒE(9#§ïØ3Øát2š&a^ôó\½™Tb5·Þ°ÑjD'’éÜíuöýƒ.Æ<'SCÊô*Ë# 5ô~ðϳœÞ1Z=À‹¶ ³[€4¦ M­iƒù!áSýù¶†>2 º9¨Š‘mði¹de8ÙíºèÄÁ8›Ç–¡• /ÙDo„¦×ãaçÞ{÷2p£ærzÆûž°(Ó±µ…ÇU±b2u¶M‰hÒg E¤˜¥¤ÉÞ>kCÑqòNYˆV&Ïóþÿ÷÷qYÄïßù€×××ÓDm±v󤌫êïܨûè6ÝC| j­ðÄ ¯T[øøñãXø½w<==)!¥›/`ÖE:¤œßdJ^T Ã5ùè¨ý¦ù„&jqR?4á½#—bhê-æˆ6x²VqfêÃÔÔ@F§7û˜~Œáfc'» ¦iL†€æñ–Ô3£ì‡Œ·Ošÿ¦©¨Ò³¬ØŒ­NûòåËÔ²¢Sýy 0•¯;V1ñ{"OøA÷JTg2rkÆrYµw^¹¶Ñþ›A/£K·.TÓã~æ©EWaP ûnœÐ}ëØdj9t±³a±æhƒ[‰âÔ)¨'0Ï>\¬AÈÕ¥“ÐËNë7„ Ëhæö¡|?@^&VÏÓ¦0û:jw£”4ÌGŽÓCÁ*Ý‚0ÑœUÞåß)'%5I—Í|Eg%v“vŽv Øâ¡u=푬çõ#¬ÃúF(æï÷mDê#.—›P×ESTñsŽÔŒð ï=>þŠ}§Óެ%ÀuÌq·j‚…Ëõª)r?‹LŽ »cÊl=y»‹Y‹Dæ¢rX!,‰x&)]ZÉðlSnº‚uš!8¦mî‡ ÔŒÀ÷^€îŽ“•Ú1xDç(Ø(±ÙÒjnIð:·¢fÞ¬è³@ùÖŠìD±VŽÕöÌ%kݪZ…}ßÁ.LÚ«¹ëäþÓO_)í*ä 'ÜáÇ<¤jqÜÑö´…eÃAy4;½é” ÌàÜË–ŒQ·6¦ ‰×ŸŽ0Óç23Ùn;©îöÇ6è@HAݽ‹pœÇÂ0UñÁ등¨”u´û¬×UÉh3æMb Þ O¶^ÌRVX‰d €ˆUHL È2Ÿ³€’›ffëpgº¨°¡Œk–Õ‡üó¯ŠXåø<Ç Br,ÜÿÉòý-%úí|ƒ¹~>æìõ“ë“ñãë$ýÿ³jÿF¼t`’â—šÔ¸NÔlË+¼‹£´2 ‡¶/ê/Éo&Iù+ qN†zLÖA16-@k ®‡³oBS‡êÄšï1NOJ¢ÚÚäsp˜¼Ìñ}2Uy<îÇø=‡£› þ~ta8Y›[²ù.ÎZ á\Ô'(Ë”Ýqî÷;BSÏð±´7„€”Äb['V²Œ·Ú÷,m<'rFè¸"± §SªÄÌxU盄b.QÛèYßï/`wd(ìzò‡ÔÅn˜xAÛ 6S‡ñHÎ{J¸ªÜ٤ɭµ£>è÷qzÍÌ´\ʨ—­›zÔºÇ)Ê'ÏAóèóU±t–a—GK-§:àù¤~ÝvDË(zG©El¢ó†-%,Îë©ÔÄž¼5áVÀÉÐTÓ<ú—% ¡£ä‚õ²ª-yþþôƃP¼üu X3Á’€ˆµ1„Ž–O¦so}ά3Ôeø@ѧ 2ä*ãÃZ;Ó}—%ä°=Ò¤Žàºk _–“ÓßJPãW˜fvŠ1е™s22ü µ¥vvõú›ƒaÉqYƤl‘ô®ƒ nŸã|?¼R‹%0ä´ÃIå‡ÃÐIDeš¡N ë(µÔÒ¾”÷‹_üâÏ-‡p¹Dººœ¼ë­î¢Îpì±íâC¾¬+Ð1ŽªpœZvµ6tâÞ;oÓn…&’¾5ÈŒ‘ÔÈCx"2VÖ0Mt…¦øEH˦öc›FzL³Öª¢®Úªd†;¬öNüþR˨ÕD/­fEišÔšbnÆFÌ]„(!¸a™>Ï%˜ÝrlÃY 7‚«ÃÝØ Õ8ú±Éì4¼\.ðŽQs;qçg "ç,5p+¨Ea%piËj8âeZÑ4ãà8IÜï/!¨ä!™]ðHyÁ3ý\*”,Ví&ËuŠèK`©S;ЩýüÿGÙ›Û–žåaÏ7­µö>ÃíÛ-u·h  4 @–A€„H‘¹Ê°ClWQelâ!ÎüpR¦œª¤I 娮rlŒL  ’b$‚¨…„¤n €šZRwßéì½×ZߔﰾµÏ¹Ý×·ªëÞ¾Ã9{íý ïû¼ÏPÔ¤B*šívÐ`Ô”–‰Q›ÐÁ.Qí»Ý)%œžž®²¶Û-e 6†¨ôÚö$Ã+—ü 4Õ—@-ë8{ºŽdå,¹®|•ÕJ‰D-K–^¯Ñiž,cvêM©ï×¶)‰Æ%ëWrEá*"Ï…\‹ùàL™.†pÚ¡¦ŒýtÐü‚j ¼ô|‚ÄKº¬üZÊå–פ·69èxý0¼5GýÜZôÓ–St^N\•1—\]H„} ý¿sµ±?‚‚1Î[t}”2æy¼ÅÉfKkƒl§)Ö.&‹ ¡Â\Š)Ú™ÄL‰ªLtãµÚUF ”Ï­@¨m%Za ÌÕŸæ¥_-ôÞÖZÉÉÎ.â™A/-´ 9±Ž^[² wº‘[Ö#U,ËœXHND\r|ùˆ]—Lpf~œúÕI›²Œ/êt»±dSË6“1ñB¥qsXE‹-„³"åH‹! kŽ ûý×ÎÎ5G>;i-“ré-8E^Éi]#‹n[=Ië¾E©…z-ÿ׆²•Í·¦*›Í†§[Ð ÎVº½¦‰ˆX) få†Ð ¤æ,|iÇ1M´~bLH™ gì°ì[¾xÙæÖɃŠ=V×-B“í†n´qÚcè·ˆ|B¶=Þ’¹Wa½G5„Üç2éø¥¤Äæ‚HG9V¤”%“N2ÿ¬u IH§…¹ìÆSÓŠØBÏÑóT6I¢¥’Éé˜â½À}¾aÐ(®AË Œ‰PÏjW›T m…´p —ž¡Ë(5+c°”´²¨‡ôÛKtVY¼¨Î}åøs?Œ#,I¦9ëá –`¥h–c©X¥$µl¾œ³šn¶6h2£?NñBL‹ ´Ê·–³ß:QÅT´õõèÀVIm•EjNŽÏ‹ºs޵þu%>¾ é 1êÁ'zÁ(Z)¹áœ€Ö³OZiÂŒ²Þü-øÚ*IS*pA›*ŒIwµ´o ^%gžÒÍó ttQÓ·ˆ¹­,V¥º6>yÇñPW‡ò-–bš.Ïu¼öi*Ô ¥¨N&WÅf··E«•^nòºš¥Ã86M3ŒNNNÐwÓ´Ð C†AÓ}d‘·Ï,Ïý‰}´¹½ «iNL ²ˆ”#g#^%;­—Ò‡–°´SM¨CßÓÁd©„Ó4£GñŒkCJ§iBÉΠÆ6'‰óL ]½Ll*9ª1†”¨"Û]€0 ‘\hjµœ7°ŽZµ6¹¦ý ýQPè1 H>R3ýÅ™jšfÝ8Çk°ÝÜÒÒ´iFjPÊ-ÍRÍÕÕˆ·M^€eš#-ˆü,`ï¢ eº8³) ûƒ9žrÕ’QrY^í)Ï%NÒÂÞÔj±Mð"là Ïê8ÔZ9]?ƒ8Oˆóˆœ'•xlØŠØÒІ;´!­¶|ÙÈ^_„”‡âa6OÓ•§Rëþº)TFV7Z5æ ¦u^±@õÚO’¨AnEÃ<…¾N¡|=ïºn ‡ö6ÛÍʦYno™U»ýʯ¿úe¯\1Æd>ö{ [Æuúã?¦§%ñ´ñd”çžcBIq¢D`C> ¦êèHÚ(ñ<•9ΡƒÇTPrhšY;_Õð4¥¤Ž1”Æ4S{Ä^xb¤ê)Ž3ëDœT* Èæò ‰µgàØÓhðikÛz.,›«[Onë.ô0pˆsÑjO¾Þá06†™kWy?Z›ö«~8¿”ý­“3­…¬›ûø’ƒ@Êÿc/Kik¥º›&ò¬°M*ŒíD Òª2Õ}H÷ËR•×\Xƒ’yo®D ¿&†.ÐsÉåÛT8OãÓR‰?â­ÃÐõlò«¹K¿+üt)gD°`­EèiÌC[K~aðýp‰sÊ)oRN•S ÆZÏ\zéÁò:@NÇiê¾"~é<_Þn·ØïöÊèÒ²¼IšÙ>Id”lÚÚ‰+¬¼¹pÌrN¾§© ›>ðÛïÅk¾é[¯üÚ¯¿Du]JÔåöŠL^éà5ø„´™…7ôIÜ#zÿ¥½(§.›Á f²ƒRJkN¼Û I m¦™hÏÕ0÷…­9ÏØøž­ÞÓ”)¾ºï;µ«"þƒÑêKhäð^{p‘èÓ€ãœ85Øl¦0—E/á-¬3WÊxך4A¤\mgŽíØõ¬Î3¯+94X RË4ЇˆÉJK„6©øý•&a¨mŸ”%:g!òòåa?¢ªÙ¯X¥mA> ã~ÒöªcoÁŠj.¬WáƒF¹ ÍÓ‘3ÎqJO›•ÆxIù­ÛÍf³ÑO~–C¥%¶´ÕL{ò[5w(•_Ke‹u^ !ÃÐk9&(¾eªï:„àqØO8&½•w»?gV 5…pVÎN£[à ìCjò©Ç?‚Ýí§ð¥ÏþnÝø2BøÃÇ~ù0ãµßü­ú,µVܼyóÒ"XJQK @>Pv»µM˜òŒÐÙf—x\¹à#´0\ÓRU|múÁyt>À[‹4Èq©P³’bŒJVÑ›˜«•yŽMö!ËF›òX0ã‰JßwŠ ¸%åÿ‚u8Í9$†¸owl|j@’ñ“𨨮œ“ÚÐÐÖIr+¦iRî ù`es¯­T°Í˜ò² QÛ_Ïâ“™E«bT$cÒ})Uãœgr\Ê©®‚fÄMMfEZžXuf:´Sš1M¤4sþÈy1Ž{L‡¨çg÷aè·H±¼Þu(©qòf]yü£ÕT2bNŠÈ¸FÝ´LŒ­0X"‡öû=%¾pZsä?Ó"‚zëa•98O2`§§§xÛ[ÿ5¾í»ÞŒ4ÏHó„y:àôôŒƒ& „¬QêBÖÈ‹¶{Üí ØšÉ/P¦‰5þ…û\éù%'½ÖŠ/=öa¸/~ù>Íí›ÈOß@o ûªOÓ8‹Ó“SÌã„qž°Ùn1YÿàCØ=p?êƒâEoþ^M(²ÖâÖ­[«ÍE³¶sÞbäØ5îÊ1’w`×÷&¹Å¨Öªä&•cs´[k®*"c Œ§ø6Ébl'}–YùцX²!q^nË(}.d×Ö÷½¶‡  =\!7Ÿ…¼Öäå)µ}Ë9cš軎uKæö®CL“ŽãœsØïFt]‡Ð-.Ó­ÍØ8ŽL§üÉMh3þ¤º˜Ç ýÐc¿ÛS0mJšâ»(=‡ËŸà{þ>³ºñÐ{ +ŠE§­©í’mÕ*NZÃ4«(ièƒêkTÿÁ }΋±l_¦jHLßÓkÇ‘Úðßûà‡jdCï{¶U2+@D½Ú,½ˆÅÕ>…7æ8í¡EeÅ Oäßa¿ßc¿ß+¢*Æ“sN(‰€iš°:”Jå®ï: ä_f¶>öÞãÆ“OÁ1³oʰÝn”R<U-Î9<ùÑ¢ÿíGqúî÷`ó‰OÂ^츰ƒþŒUÁwõc ¦û®!=òÊóŸ)tǘÙàaC‡ºÝ¢Üõ/þä7iX‡\8¾!³ x¸ßgCRÑó·bk-v»•ÚyZ¢ŸYSI˜«sAé¨íÔ"ÅI{R M!Ì^N’Ûkž,®rk1æXƒ•nmêQÜq Z·2­jS?M£ú.ä’¼G×mp8´5–78hc5»‡Yy.Ä8io-‚PbÛ´é»Çq\Â>m1Å?Rv›ª¯ ?™a½Þýnä êkn«‚$1æmã”\NªoÓTjw7ÏäáÉêѵ•˜šâŸH_§ÀG!HØl{LcÔžLÆ@„'ÕŸ·Ùu»ÝîÈ–Šyô3ÍùûaÐJ*±÷ðMG|Æ¢¸aCo’Ntƒ£ôÙ’3åÌ3!»¥ÀóØÅ÷=Ïç­NÚQ]k õùü.®}øÃxÎ[߆áñO({¾6›½UW×£_KĤ„ˆ×ZnÜDwã&ÌG>ŠÓ#evûëÒuH/þJLßú­¿åõ¨¯z%%ÁäÒ¤"ƒGUt;””`\XÝÌB,Z/ñZldȾ£~´ 5†±¹ÑÚÄ©Ä*M«#ñîÞ“ \ü ­Y+ÿàb‹~Ü»Êß÷ÞÃvhÊbúâ9cDaßGáÏ[Ká$bТ&ªux">ƒäwP5 w'äUt#ZŽœ²âÆVš¨ò }€Ñžš.A¯™"Æ1(¨ÙpU@ºSÛ¾?7Ó ¥=±OÉÎQ»¬¶–ÃߊÈÚ±x-tKNT™Sº;PYþS[`m&1ÌÚ §½ÕWÜdSàlX9• ‚\ŠmòåÓ%lÕ•÷LH©–SPË&‰“ÛÊûÔôX| ¦œÚJ)Á;ø.`zÆQçø—`-@ùû¿ó›¸ÿcˆçÿòÛ°ýèGáŽnûµÇzó×+‚F!ŽÒü¹=:LV& óŒîãŸ@÷ñOàäç‡×ü ì¿åõ¨ß÷(Ч~€Žôä!y¤ô¨™í§È‹Pl¿:ˆ‰gnؤ²ªâ±4³f%h•Ë¡b€)Üç‰v;O^„Q7‡õû‹]µ–u ‰‡¤Ê²yäFÓŠ$%Ž÷L b¯ü ôÜVÈ×O‰“¢†©¸dâ’s&M„H‹ùóðΡ²`̰B+p6N®ªâÿcIñÚǨú²VÁsèR²œ$´¡¬ «P×òjk=rŠœô[ùV—ƒ¡0ÉK˜”Y]´”+ªÕX™´Uªa³Pªf|©Fóö­µÓµßïhDe †MG'™­(±4ιA]ZEh"®9âB"·ðj¾œ‰ž)”Ï–t$š ³ ‘"zŽòÒ ‚w ͸ÃG?ô(^üÕ¯X™KÊ/ÿÜÿ…þÂ[qþ»‚-Gœ†+ÊúzÅíošM/Xpn"ÂqE%ÑþúøïاŸÆÉ;Þ‰“w¼ùïþ}ļ‡>åüüé Ê =ò·œ±H‰ÒfLswbÚåt_n£Öb$*ñpJ›u¨5,Q11'¿¨Ã’ü;ðg7sÚ±¶ˆÌ`+…*”ãùüR’›K‘f­5Õ±ÔX—€vc¶U-Ø­ð®Wƒ*Õyó­âᬩºÆö}1gI:¯/…â¹%õ§rب‡Ea¥§¬yž=KŽ '\…•£¶Œ‰ç°åJË]b‹J|ìÔŽÑ%Iºý7jÊ#®EâKÉp@"YžêãHªÉišVztï<âœU^J§;»•pÉm­…„pÊ‹&âPÇΣk߀®ïÙ†+®¼ÿji±6QUžœ²­?> €@*+^,Ó’Á§ý‡ým¼äe¯RKh¬_úè‡qþÎwâ‘ÿûçánݾr“ßðwëýMÓ\Чæƒá*¬À\ñ=Ž[ wçìc¡ì±uËÒK_ŠÃw½ùÍo†{ÞÃÌ]_xð9gÀð¿—¿üøÜçŸÀƒÏ}î‘\™V˜åVrŽòþŠ/Ú¦]E¸‰<ù¡ƒÙoXBè´ä´7Mk7ÏoÎ9ì÷£.þ®£sWzäX0Í$'zìD¹\1hé[ S:s¥pE%oÉØrQ< »´aÊ ÁµÜ¦T¡Ìrfôd»Uv×qÈ…‚;Sɨ0ôw*kP á%`° `œˆ:/)CΗѺhƒd­ºm‰7a;Uj tVNUÎQv"*¬€¬[á±|^ÌF<,É¥Ôé»q>¬xÔ4 çZ™bÖ[_<çb,z;Ì|òù`a]·òè¹WŸÆ‘O¥^·õc~-Äà¨Õ Ø&t$8úp¿ú•_O_ßuÊÜýáÇqýgÞ‚û~ùízë×+Êò«6*Ž*)ëÛ)pà¼à@,W|/ó UÇU¯ËƈîñÇý»ß§~è°yÓ›õ;ÅÈQ`C§|„Ûwn⡇¦1!Ç@©lDʹ£WX™E)%¶XVÉû\rÆx8Àò­)ï-Q^=ºÎ£ón¥+hS– LLd jؤdµz·†"Éâ<î䀉o) ·´^ùBf¢gòÈ’ª §¢ºŸÈ¦Ñ d5ž•Q·uAM] Œã,ÂÂ|ŒJÁ!Çþ…kSÇ&„¡uÝ26—1·Œ;—\£6ë…–S. [[U¡2W=-‹° Õnñü’€„ªí\îDu—E‘2‰ :*™É pI麎vÀ8؅c¨'$\J ““t]@.™ ;½%Hq—©ÏbŠã0 ªí_åÈ•ï–Yi)=ȸ©ÖŠýn§tÐÇ>òA¼ôk¾·>ó)\{Ë¿Æõ_|Û•eýU›ñªÛ»>((‡@¸KUpÕ×y¦¶ã™~Ãï}~ö³¸ùÔÓp?ðƒê ,–í2Î}ùË^©FdTÒQ¾cÍÚ_Ëí2¥‰úSFú ;݈_~Ê¥VÄiaÚQB2K9g”dÔºªe@j€ Û’SûvzzmÑGäÅ{°r’­¼ÎiN—h³¥”ÿÛü É~ìæÕ(çÿ>ÍûQUqN*²ŒöìÝ‚Ùò¬tu4p]`JÆa1¸@tßF¿ïGÊ Îuˆ3Ϫ|×Ã8ª ªº~ƒ’'¶Ë+?J¾dzPW9‰ÃrrªWf ¶¦>]çá‚Õ|FcH…XJ¬ƒe#Ñyžqrrï`¬CrϘ­HyÖ’Ë:ƒ7ž¢ùªïamÇ6G‹`Ae°ñ€aت4ó0Ré:ר¹ FGA$R™(=qš84Äj|·Ø—›†VcFû}q±Ç“_ü ^ôâ—"Í4ãß¾ë×qí­¿t×›õª¿^qûÛ+6lK6õG_çªJà^¿ÿ½üOßÀýÿð'ñÄÍ›ØüÅÕ¹þ7pvv¾Le@N9¹Tt¡C)–5äP?9g xµ¨È)Έì@Áé0`ô –ý˜‰8Ò:—‚“í†Ævyb¿Ò#ø¸8M‰ ȧO| Œ…¶…]ßÁØŠGVƒT`‡yò¿G?ÿ ºæîÓcÀÅ/?1|pößÀôdM_ `œ¥¸¯Z±Ûíà9" Ût²~v1Í&¶ÂÔˆM°:ã0ph= —ÿ]`D.õ½ š©˜s„wÓ´cru®eFN$ƒÎH¬L ì~ì¬'¹/€i*<µXB?ÔæÝ-NIÖ²#Q)L×&ÚvI3¶Û-îܹƒ‹‹ ¸¿ü—ÿÊǽšT"+$‰6κë*˜»,¾|9!ŵdtçH(ú}bGUôC‡¡0ÍÓR†ùÂŽú*c™íÖaˆ‚èKéE”Õerß}÷ácþŒñ˜}ÿÿÝnigîÈ™£ÍmŽÊý¶ °Íáp¼ñˆ¹‡ÃÀÜåÏ®ü½qú‘"Ö |ã7ª½}^‹´Z¨Ó;Ý_„­¡¬ÌWwž\L2…Å┋6Õ–uë–{]±WƒZëx½ÕÉG)±‹Uš)¨6ø@³ëJŸœ,hÛÛÿ-o¢¶î:€ÆÅ0¾ü¾ŒÙ3¹êÍM]t&bó%¬PzªÏÀ`Em'Œ7¾Úˆ{¾Å-Ûi/øµ-²±ŽÁqÊäˆè‡AÏÜ“÷;t4êæÈd(¬ÄqR P{`.Q¤[÷­šSSÙUøà9sLg»Kïì,õ~»Ýn™«’Ô ¦R_Bc²8 T²76Æ‘8úÃ4¡ÆÞRe‹þ.eØ:ít¿¸ÕèEï?ÿY<ðàÃ0Æàñß{?úàqzrŠéóOá¹?÷óžzúžÊêc”?ƒÝÃa|ñWÂ>ç9Hµ9!&âŒÃ”ý›[7>÷y 7oÂ¥|W Áþ;ÜöõZ‡KÊ<ãìŸüSÜ9Œ¨éGѱ¡I;Î#÷· L­5ªæ\9ñÒrY>Þê"¶J´+šì¢ZcƒF:¼aWŸ“ÈÛek@{•7 €]Ö.™ÞVô_þküÍg˜²çÃ䎃ª9à0Ä·áÖüã4µ*Îp l ûMQèíR¡½ø<Ê4Œ*$ò:pfI~¦)@û\E 8µ&ª”ùð“©*+gc\¦:5èÔ©¹%ÙI¥%œÉIl mjÏc£»Ò´õ9g®\9í7Í›j朱ÝnY…uhúŒÄþæv5ãwŽˆ!bçE‡@„‰Æ-j5ƒ° 3yd×Ù+g©"".ŠYiÈK)xðyÏCbâFÊׯŸ¡N3Îßùk¸þþGõ†®WlÈã’Ÿ/M\|Ý×á ßñÜyÅËaί¡X`³Ý(¸qã&ÆiÄöä9UøAô7oÁÿ;”öõ*„z<‘ˆ çÿâ§qcžPÿú߀Ðô-‡„P ´GµP¥dÝòð3‡SR#_òMº %S»Åܵ1¶(0,t!¦_¹Ä”¬hlÎ[2Ó⿘V¢ÖZn¼×ÓÿGߣ–”œåD‚©Õ¸Õî=Eu{ë8›BŠÄyª¢‚xó"å•Íí­#d¿’w¢ä4zošJÀp+“y®6múââBË÷R †Íù¦B IDAT ïJ”ò~}ñµÕ–TDÖúU(¬¼Ÿµ d='õu yñƒðË*‹ÎXçaAã¢M?`Ú2=öò§1P¬Ƙ‹ý7Ää ÍØ›Kj¬vdD‹E='á æ!¤Ò¨úOô‹;;Üÿþ÷ãy¿ò««¾½Þ‰o×ÎW¾_øS߆øÚ×`¿ÙbØ-ÕÉ0À‡‹‹ÛèúÓ<¡ßtðnƒT ʵSäW½éå_/ì÷8Ýžû;8üÞŸÀCÿøŸÂݾýŒ¨?îa\xU;±úuθþ³?‹[]‡ôc?¦!!kÐŒ­^<ôÇNѸË#«Óoa¾AE,”ô¼6ú°4 äDçZ’~­!f)²—ªÏªo"ÈD NOO};O•R`Ÿþqþzâ:kÆåS”B0}×!ׄŽ«ÅLr!J-«Ã£`=úÔž –Zgûn @ª|­©¹ÈÀêA2á<Œ;ÔBvxí%Ö–üÓ´žp€ëÉ&—¼2Æ‘÷Xy8È« Õ!L_S<]NÖTTf–‘˜À1ûNœl[,GYaý™ŒsÎØpXŒY{¼Ífçr¦çY½õänM(…øA½¡i,ºBÇRlõ-ÖJ¿ÿ‰Çà½ÇɧÿÿÌÏÂŽÓ¥²wA÷óù¾øŸ}?ž~ík¯]Ãéùî<ù4¦iÂùù9‰3SFp'›-î¿~?ž|úË趬sØívˆ)âììg§§8¸uë&ðu¯„ùK?‚‡~ñm{œõô÷^ ÜË$auPäŠóŸþ…pû6Ì<ÃV:tMN°ã {؇=* ʰA1Àð¹/`øøÇŸ\Q—SÂÿü_àfŒpóo®ÊA’#»+ -$a‡€+˜2¬ÄK5©Á{TkŽb³‰wfÏI8¦Dº+nÀ¦Z&Ï‘7¿ÇÉÉ RJøüçŠÈšÂjCU¦F˜Zžá¬ú¦Tdö¤D>0â‘fj!ì£Ô¼2ê¬K¸g-H+¶p¥Q¶‘oûÃÈ¡¨FgÿÐõ]·¥<Ã&_2¥Œq<4|¡!.±u_’¡ LqǸg±DÉk˰ãÏ™Â|é³8ä H À[%Î&­W:•ÛyåiÖIŠ –d”Òó,‡JEgÌ©`ž'X;¨YEû½Z¼0¿Ù’§ZìÇ!è4Í(ÜÏ|úý¿ƒýòÛqý±]Û™+xú†®#|ñ?ý±Í«qzz c îܾƒ®ï1Íwc°?áfã‘“³3ܺu‡ñ@rgïqzºEì,vû ì÷{ö#›7l®]CLéÚu¸W¿w"±)+ßBb>Bd”¼ÌíkB˜&t¿ðV<ø¯~þ0^Ù¶\I$Ê÷ýôÏàöaD÷{%¸9ŒL[E…)•C52S[³ƒj¹dì8¯Á!å¤#ËAâ´o¾†T¡¥4”Vð¢cî i“H6Mv»®ßwŸÒu ;>…Î!=ñ·ySVÌ÷ÐFѧœ#ybFÆqÏ s·¢Ñ®mç –átKõ; Y»[UV­­[rN«a眆ˆß+•˜ˆAaQ6ª4´O,|è•(—äB^ò …Lԃǜñ¤ 1ÔÛ5xß¡ Ó8b#À™æNË6¢ên7ÝÁ{t!PûPÈK tÔìw{äXPØ(!àZzØZ¡—ÞT‹yNðý€T0lÙw=ÆL=èHrØ4'¤y†·Ž=ïîô¸ï]ïÒñî¢Ük»£Û¯{>÷º×!`w8à0N¸Øí¸®è7î»v ›íFËÆÄ7ÉÐuœZ\rÁ­[·àl‡}p€ xø‘Gବ#=­Øl·ð€Qp<,ñÌ«µp]~»ñ¸vîüGÿ!žø‘A<;½’ÄTŸMxþsÿÓßú[«ªä ÞU ÝrÓtÝÀ¿>ôH¹¢Â£¶8;£Jn¿¿àìDÒt¾gö'\)Fe“ 9ˆø•Œe²EŠ–tÙH™| s¦Öê°ÛãÖ­[Ô.2ؘ2Éhµ8)¿¦ý}-é°ªJµØ&øóï€.ýš ŠlïûÆyÚ©ÉVÂc©<Ž$"[œgQS†AÁáb²ƒ·Þöu$;÷Ìú )mð+ ²eû³œ;,Q%TaÈÔƒAx9¼³”‹Q"rŒè‚‡AAð]p×'ïhVJIÚ]ÜAN ¾²+¯¸˜:z€]"ŒÇqÄGÚç’¶ TSºøÅ9ÀŠèn„"ÖZÌ))Ôj—Å8D„ŒW´xš&8îÁ(T„Ê«;ü ¾â—N}Ø/s÷ìynüÀŸÆ}_õU¤ ×³ûˆ™Öo™*Ø a³pûÆM ;ÝœàP'Ž<7ðœ´B‡óósl®Ý‡k×®ãæ­Û€qº¸6Û ÆÃNUq Í(꾚힞àð]oÄS§'xÎOý#ø§Ÿ^=Ó³‘‹ÎÿÍ/àÆóÿ/þÜ ‘¦¶À¨µ™´~Bþš¦ˆ1F:`µ–y›µ´ .ç$¦%SÉ?ŽÓz¬—256Ýx8àP÷È©j <Ï‘²ñÂ21tºŸ$1fy,ÇvbÔö@“„äF–MH¿6:.-L§±ÝÒ.7ê´Lœâ¸$æÈïתÆqÂiy‡g%ýpÍ3”>µýÀé}¯¨¹ñ§!òr¥æ,òûv±Ð†UµêB¢Ã%7ÎÙ¢`x‰§$e}À²³/)[³‘„P'‡¿÷]Ò„R*âáƒeßÄÅe»®*š¥×??¿¦Öl»ÝŽr9-…•–J¶d§§§ËÐÎm›Üj‘ ˆ<sB*YE™ßpˆ;@ Aõ kl‡Íf£tP™ãGN&d´SPP,’6Û­Ž ¡šë÷½á O<+•Vgýßõ¸õ½ß }ƒ”-é$+ Ç ­‡j.Þ‰tƒoÐo¶8¿ï®]»†ÓÓS Ã?ô89ÙXYúÞ£ïæy$Co›×¸¼GãxX cIÜþ8|í+póÏü ê}÷© Óð+°g°Ö[˜&n)„A£¶j6l {d•žï÷aJÁ+©ÝnÇ<¯þmÞyÌyZ1¾Ä·ï;½a¤t–8¥3 (oøv܈ ×ò'áž|ò^Ša'oy n¾äÅ0ßý&>d×ñß–]rL膀ÓÓ-ú~€³†ÓŠ—Xp™;“<ܰ§$UtÄ8Ê!‰nð0•øN›´Â4ezÎÊœ\#J¦îsÜ[\Œ Ùðk£fÔËU¢3”§‚#‰°”ý¥PUAQG+²Y>S둘›O §É•ÉM0•@_,ëc· yÑÎ:ä’á×2ŸüÅŸPdóÓL2|(IZ|!éà5ÅØEå‹x?Ž4™±g×®‘~2ï nß¹kwð-Mpéy€\"»½R “9ÕfÙÔÇ!‘¦ñƒ1kv¶‹Ž)‘ ÅÁwj@‡@-‰#¾)ß½ˆ©â,ýfQŸtH¿øÿ ÿä'¯Tó]2ê8ÙâÖ_øóH/xáÊ2j ¬àRØ¥ft]Ï>vÑÀ3iãìì±,PŒµËª“ž‘zÏNÁ £,¥`+_<Ãúu'ß‹8òÞSÚ¯˜s†€ñ;¾Om7¸þ÷þ>¿xOä"{qþþ1n=ò¨¯~~ý ³ÆbÊØÌá1Șç‚à<\q ¯¬:Ï@µ,Ô*J5®ÕÂY‡i¹u,0Rt)ž›ß+}VTä"ºySSó;T—ùÒük^4ÂŽ]g”J˜Gî–ËiÉ|,•Ög©Ð¤'k¿@†]x„™å•³HÆñZÁ%×£™[ª®ã~Þ®5.KàëZ(צb¥’õ©q—V|{ˆh%aØýZZÖ?X)/-«3ÅÉÏ­S D¤–ÕEVL™Kž²2.ˆ1!Æ^XKlJI=ÿrI±$Ñ[áˆO›w¼&—»"âíÿ_¼ñ˜_õ*&/Y5±"/®U:CšGä4ðQg…Áª±ˆ|È¥”ÈÐBjOK¾xÖ7@ƒah˜_­¬0è8+MÚ±s,g¸ÆÅö¯{žúë ù¾ûîYkàÿø38ùß ãç?¯@T1Ç‘­·lÃ5§‰Ù\{½qdq¶¡ëJmÉ «s«•C©|I(—$rXLÑ5¸Ùý]~] @ºró_õ{ô²8Ü¥~LŸOìÈEì¶ }E]¥>Õ&@Ã>yÓWUPb5c¯mè,scZŒŒ[-“×0ó(YöN)DÚ‘Wl½Hw­QËñu8¬Óvƒ2 =v» Ì‘ŒSn<õ$~ÿ÷ŸÒ¼P`Kª4Ÿœ¼¥­T*‚ß Îq¦bØÛØžžðá,h£ˆ^Ÿ©¢bX]ŠÖ%@Èפ™y•Þ"§µüž¼¦Ów¿n·¿'.ýô¯AzÅË0’ 5 ÎsZjæV'#Ñ ƒ|ƒZä¨c­#{%g˜¤BerÊ iŽH‰¨¦äxÌæª!›/³ìÈ )­¤±Æ{=P4Nœ+(:ÕË:‹®s°CÀÅ߀Ûßþ§žuã· éɯþ*ÂOýÃ&°ÃSnùö**"5!WiWØ¿/‡¸U]¼m3UŽÖ‚˜â*&L& 4\þîþ©÷ëæ7ˆ ½¿ÙøkÉsóÜlúQYç"(üП  ƒVR¥Ì9qnuÚQJTqÙ2òKº7Œ¥JRÛ*XŒp­‡²Ü#€s±Y­íůAžiIJ¦*RÓ•š\12ÑÑ=¿ÿ‚S,YN/>ç®]»¦‡³ÕTTk0§¸*YÚF9åÛ±†Æ-7ã¥V#-‡C‹3È¿ÕÍÁ%¨¼¹-ªZ ™'Jv€,´ñcÁÉo½ïžL3ª³ßüf`s²Ü:)«±£qÁú¥ç*…Ëð…àâ¥ý°V¥Íµdîu rÉ(iñG@¯V²:«¬Å'û­ÓB׬K/yóæM% xO¶Ø2Ê^øò°Á˜ ÄÓSÜüÁïÇôâ¯|Fd%&*§ÿêg1ýÂϯ*ÏßÇY‡ÀZ™g[æø—ZŽp§ñ×ÃÐkõ´ÄwÑŒÜ;ÎwpÆq…GKŽ 9&Ìã„Äåë5óVÕü3mt©êÕe=zøÊ¾ƒÎ9Ä9“ÎÑU*yíI;¶\t 9+¥¨!"…†ó4ašFíÿe3æœ)¼†ù°Žü6Ž™­&ÒFfa™æÐ-ÏäVÉÚPYó²?š¯…eò\{YÈ>—êñ©§ž’Xº%ÀsžgxgÐù  ˜àØÓ¼yJ¤tË.;΃·¦ 0+ŒA”RíÂXǼªYíò™ŽGÚþîGÐ]|]Õįù”WÂàCGc—º¤ [0åÛ ¶'°>À*ã ”¬±(©"¸ÎzxKa‹5—ÕûUJbVÖÌ¿ûày¤DtTÒmSè„,°‡~}?°wP1Ï €F! äúã'ä½ p!/{nüùF9ÙÞÕšüØøÄ]\à¾öÏ?üAXæ)x¢ûÖºFž'Ä8ë¢P‰T`E(õür“/æh’œÚ°–¤77UR,:ã q‚÷1Äš˜Ò<Ë]xíTÀðÓšý;±ßï/ÉÈÛu3)[ÂKükÈæ¼XÐú÷ÆRL£ëòk‰÷BqwïbëZ;»hè2Èzà´y¢É¥¨H®h.â’Xœ9,Ç)&m5„Ð*o½'BÒõç<KZkq]qzj—’´Ä ?¶¢¾i-µÒ{”³RxCð«Ø.ïé 0+{¥µo¼Œ‚XtüçKð¢ü,Ëö7ßûŒåmK™ÞôÝÀ÷sEA§ýf³!Žv#‡¥…´,‡":'~£Ž&-•ë¥Þ¼rÈC×yâ.¨5WE.‰è´÷'þ{R‚ ºBÅm­Û%^FÍßùõ¯ÇÍïÿÓ¨WèÁëþ„@÷ˆí[ߪtQø-©M‹}ìÔ‚À-»n‰.·ü³Q7"Ù‰Öº×Hlwëâï3Ó©ÄšvÎé¿®l *·ä·£ ƒ¾Ÿó8‘á 4âaq8ì‘æ¸ ä ã¯Eâem¨ ;€Ž£¶K-ÚbWĸ6«A”… Ó°¬ÞCiå½—xvr²GUÏ’ð¤ûÒŠmÉÅðTgׯ_§‘[ªYk5·Þû¾1ý.5}lQvŸY±ÊÖ\kƒÖ¶N½¹IƒÁªï_Jz¥?ýô;ïCÿÑ>£›ŽüÈÏ{Ó·|3² š¤?5TÞ™uv})E#©dÁët„û9c¨loAÄãô#1s_)Œ%¨ÛqÕTßÄ=±UZòŠ˜IÒ<š¸õ’_/Šf,Ô n¾ùM¸ýÆï¸'n€’„Þö«ˆïybâ¹|èàCäè8mYòîÅhÑ\¶Ÿ"bÝ’€‹«t~>qÚVë1v8ZÌJ NÎB´ã½`–ѧ™J‹` TÍ$Àœê2ïnK-…²¶‰ã^¤Æ1FQÌó*œ± :h7•1þ°Gá³ý¿õÛP_ð"Š3s^}Ñeœ³>¨Ä¹f±ó¿ƒ®ëøÖåp†WãŸã]©6rNȉL+˜É<“þ;F”vÕmÍmpLq]Ú©ŠÚ”2–-÷ß§ð°{õ7<+;M+pòŽwp°81Q|t†¬¼Ê”ß‚ TøÆ|ÀÕEŠZŠV9RÆ>õ…Oa³é1 =ÜÓÿCC™M¸JùT+PLÇ•áúÏLCF—2g·Ûáââ‚Ù¬”+ã@ l2UÙZ¯¥·m¸øbŸž'¬'ƈ‹‹; Ž73†”´V…B ³öó9×!â˜è &sìyÔ^”Ön B:©Ö§iä :“;{#È(TZoë,Ù&…æd¬È«'¥„˜&ÕÕuÓm7é”ê8mU–ß’TëtÁÈa# Àãò©=6ïûí+]~Ž5òe3`~ãwÂóÈÏ$t]×”æ, m’d+*ßtXÅe%ÞÐR5]šóëmù–Ÿ·} ^‘›³ÚL;gù„·êº$­‹Ü¬UÊM Ú¸«ú¢â©?÷Ø^ðÈ=» õïù Ø=ªh³,hJÿ%ÿßuÈ)1pYVS á}Æ‘ÃBË ž§PNÐ&·® ÑðxÎW|%½‡OýœÙwó+šõ…²Éðrûc¼ ``ô²_ˆ¼€¸§§§ðžPpïI„&Õž¹$ÌqZ¢Ä®­Éº þ¼nÇqÔiØ 4uö9lÜyM©:9›Æûý~5Ù¢J0©z/5ÚyäµÉKR,'FjçMã/±ìcÉg†B}a+ª¡L5ëIùg¬gãAèéßõ=œ7èzêûa€÷´8à<Æ)¢TãÈ­ ðFÿ¾ä„8¥†Ý¸rØ`N‡iF=¬ p> TŽ]2äã6¾ë>ù‰+ƒ<Žo»üò—!¿ô¥º ¤uJ<¡[ZJ¯e‚Ae¨ƒ»k:½3ÝkRNÛÛ1»æàI1³ÉrДæ°3œŽ“J!;u,_O*ú€ã"æ[Aþ¥L|Ù×à‹öÏ ý]ŠWì±7áÞþ+Èlã=Kvµï§©¹ ÂÙ5ó¬ûýˆ3b̧¡(ñÉX)LSZò ñCj5Ø&œáßr™_`Ûòë l¿X~˜eô×bµ]!i< wÀ´»Â‘a©dÀY$fmz|Ç\µæÖ,µrÁ:Œ;¤i†7‹ °òDÈ ãÀÎ’#б(Æb»=ÕLÀív»š€É¥9M6›ž¡#..nÃ:LÅÃ[**"bœˆ-í9ëpçbý!bž#b*˜&ƒ\|×ã0Θæï·Ädl×ð1-VÆq‹E‘×hgJ"û¢u‚®QL çÜ$˜@G@Îù#öàbõ$ã®À%•¸â´Æ‹ÆÛ_ûUØq¾'cÍÃë¿q{ªZ‚6©ÆV©Ð˜ŠÆÊÌßXÏ7•»Äö[ŒK§™¹g£ÉöæoǨb Yr%ÀîHÓpl¬JÞnTfN%KÔ4M|ã°:ÈFÚ49õ}n»‡?ùM¸ýï½ùžY‚§ï~¦ß}?º@aÉ™2†nI5_Õ´¡…Å&è´¤îZ¦…§˜(àEÛ˜Ì`YV±WËd£Þ=ñäå ´ß0Ö®ò Ìš ì=gb]•æ˜ÐùN©Þbƒ.ŒÍöÆlÛ:i}°œƒïi<+ÖÚš+3ÏØ«VÖ`ÛîÊ:*@Ø}’–ŒZ†ðN=ó«ŠCÁú8«9O(qFðÁež0Ž{÷3°1FÄ9#Å‚‹–å’Κxíqµ”¡þ>®zv²i<@B IDAT1𹼉 ñ›ZI"lšþQJ8§Þge•k ”\Þ÷^œþÆ{﩯-Û-.^õ*ÄaÕL¹ºC°:d¬öc…çñ•YbôwmÓºÈí'È­M³‘†+aÇå´µÈK•Ðr-Ž4@‘"ÀüÞ̇Q—S†7Ôkv¡C°žŸ§»vn}ß÷a~ø¡+AÀcexòiœýöï4úކóÎÕŠˆ•bŠˆãˆq<°}âg±<´êã(Œ5Ë8Ë’•¶{6ýyã`0_BõµÇ7YraåÀ¬‚–ÃIäû´>Á:ôü~·¶^•IAd°!ÿ•jPaãã+6xUC¶¨µ@ÕÉÆé¯+ß~™€u]Ës~dŽlgÇóþR€zl·',ÿ…²‚\…»äDÊÄœ`+2+_Ð¥fì'Ê]´Ó˜XöIzxI’ܲq9'`JQh3«üZ³Bk¼Þhh,¤%»NnOk-¬[ztª/p¸b‡í;Þ{±»ÒÕ÷øÇôÊW"¿è0µ¨¤sŽ)dææqƶߠs%R9jj…7i©Tw%SI¼ƒõG¨¿ù Ek›²”"јùð²ÎV"£ÔšóLüxXG2Ù\2RYÒ \£‚sJœ!Íÿ]•~ÆÆYÚe˜öl¨¤ð«¹fJ;©2ß„ôlËZ‡&ùŒÚ„*© [äò©¡s§ã ë-ã'+2¾¡CÜB.žŒ¥d5gCFÑR5˜ö5Øæß[¥÷}ëzd8ãaCã)€d.‘÷·Œ<·ÛíbRxjÝ€ÄH€;jN«²ßµ’Z#úý&¬£H)U¸O@{¡TW‡hæ¡rïûm¸/}éž|ôÓ _€ùµ¯Ç›VJ)L•ùþÖ„Î#t>Xô=yÿ › Ʊ”9¡N°Ý d2¶à ]JY˜ºx ´oó! j=¼ï<¹Î,‡Dex¡÷Ö,<Q«S&žuâOG}ïqK‘ù \¼ñ;¯ô¸´ÑbB÷øãÈ91Ù)^:è—ò–íáCç:x¥rëS PÍ‚Ð×eeÁKœÇÙô÷8C ˆwÿŒMTƒ}£Ø:/6¯í°‚Ýv']@DQŽ)‹qèyìËîH,3`é=킃wÎEiá)%j'QQ3ÄžÛDmeš5Í (+ûýö"µ–C'2rTÛ9Cb¤˜æ˜ttž!÷û½ú1XßÖ“…^­p0…™Íu “Ь'E˜…ÝêÐÉÛ|TC¾±ÒCîÒ-Rb’È:ï຅-·ô¿ö@Cß«HÇy‡Ðu0úÐeÙ×]JØ;ozâC*è'mI« E…Õ5M³–MQÛg(Ìã7JGâƒÇ©Ì~¦2TcH±'NÀì œAtÒŒŠj/à–dAÛq&@*à ʺÅ:ÚZ˜1Fdï±ÿŽ7 œŸÝS0IøÈczø··Ÿ€a¦ROºŽ‹„û#M‘¼‡  sŽˆpOYáØW®ûiô>`=õÄ)ÃsZ$M-L]n§ò^[k‘SÒÉÅB¹î´tõÎcØý=½±ïføIî>Ä;˜×£ßÜßàæîm!§KåxÁÕ÷ñeá)8ï©r‘i‚3÷\™T“(š¬Ò&OÌËp:ìQR\±ôViR²­DÅce0ªY÷‡8Fç˜Ø³¤êþ“ËJ.ƒÞ˜ZhÃ{ïÈ2¿¦ ÞVœn8 uÎAŽØnžM9Ô‹£!½ÆÒV´‘;°Óh0šO q¡ÑRÙHùs)NúÀ2Í 1N0<3SDº½iîzó=¿‰î³Ÿ¹Äõ¿ <¼îµ¨Ï¼3*i•¯ "­µ"øžGn•yâÎä\É;­Ò¼]>p1©Œ1 çÃ*ê qªÆt)ŽiU²XŠOï9oøö’¼$òé…ÎÕYˆE1NÈyÖžu}…àœCé;ì¿áë×sõ»îɧà¿ô2*bÍ0Þ¡ßRZQ®…0Ìš³ °ç,É“QÕ¢Ö‚ÍfKÕÕ8¢Sð˜þŽñC|;s ’^ýÇ£?2 áÛßÿ'˜æˆ ûf:XÍ3«ÁŒ1ØâQ¤4aš.` ÐOS”HXPÌI)À¤N².š ³Q•ÅÄ·²Œëæy†·©‘ÑWnƒJLj˜RJf‚e-VX”jQá`,•èãák*‚·0ÈÞÒFÙ‡£Äñ†4àØXuŽ»8¡ë†å€õÃvƒ°Ù Áb® ÍÞZ‹8°dz¹0ÓBèš¹"!Ðâ ã¯%yt¡ˆJÛ@i¯^Ýoj-l²Ø“|‰’®uÛþ,'t÷™ÏÀܹxÖ[ ¦W½JoÿEß`ô†j«ŽÄ† Ó,XGVynJ1EEéÉó”K{Sx:r@œ&âM¤ˆ™o[qeõ#$0¢œòÌ=tYEtË®®ìÖh3™†Ž vÂ%J©èðKiE'DEž_ú”ܼ›`.Àç¾ ¶_´`$õ&+•Uou>¸rÉúÙ;W)Æd Y‘ÇÙzÆdئ÷WFßR“Lѵ›¯£ÏÒ¼”Çö@!^CÓÛHù7 > ±Üš°®qÕâ”R”íè݃Tz9Rµ%\úR ÎÏÏsF*eų_µŠ®IáˈŽFâôÕxwrhîûx)k3Iì);Æ ót ’^p(…Ì?ƒ7Œ;&eaœW[:­ðÐXÈ‹·¸1F“ZeÄÑÎ[)ÿ,¯‰Ö¨‘‘Xè )u¹ý’Ò«¾ Õcè›RkE÷©O]bþÕ+ª€rr‚ñù_ižxÝj·“e”×ÍÒä`¦yF`µ–ln  ïäL‘ÐE¼Ùùý’ÃJz{Ã=c¤ÕûÕU¶d¸Ë殫 ‰£rÖ±lø@ÒaËÜu20æyEÅ¢ýŸUI)鳤öäªæùÏGzèAØÏ|öYUwóÖ üóžž‘2;ÚØEñ™r*¨lÓf$½µsÊŒkPFúâO(ï¿Ö´Vû‰`ï¾g±¿¶çM<Æ]´ZPÈžÖyHäw-ÔF•Z0§ÈJ½…ºTi’ÙÆ¹ªë<wA'9EÀ:T³´?‡Ã‚`6Øà•¿¦dz0«c¶Œ Ń@ÖKNE§Æ‡%—ŠÃa¯ÖkFTŠÖhĸ­–ýè•UªÏÔÎ#e£Óæ9Adƒz.A §¶:e¶yèä$Üë)î=‘xæyFŠ2Úª>ÑÊŠEW½ŒiчO|òJÿãØìô =ô0œ%—Õ”g[u ç–Á±4‘¾]d«9%ÌqPp8\°æÞbŽä¸Z-0Î#—Ø€CÌ€ ÙLádx|ßÁuž¬™È3„2»J ¾ˆ 0b2D411gXoÑozªbåC¶*ß΢ VÀø·w{¦¹’oÀîpÀÅaŒª}âg_kE:?C|þ#+Us·þù0”ªs}S rVµ¢N%*›²E»Uâj-å=¬F©QGÊgõ]DÅ®óê4W ”żÂsÆ“Ç4Ϙæ©ôzø¡ ËXdE§™Ç¸#Ü„å)šÚ ‰GM?ÓJ—Òj@ä×ó<£ =NOÎÒßâ]§´wµw¿Rç"f+Îtýv™ ‹ 2û,Š“¹-GX“ùÆÏHqFa”.WUpŒ6§„¾ëh–h¨¬È™h‚!8êÑMÅ0ƒ¯&î–5PhœÕ/õrcpi™újŒc{íºÄc¡"Å‚’[7”ŠÝ£¢ÿ£O]®êZ€ø’—å-Z~9ýㄌ,ögꃗVÞ|æ ³9io$†™€˜^ƒäy[yçqÏ¿V{VÔÌ¡,)MsDIE㜓:ÅȘσq5e†¢Íêö~¿[9öè÷wéÁïI"lJ&ìÃyШ¹®äáÚjÔ¬²ß’+Â‘Š´}rb¤òw¼ù;<Á¸Zõ§Î?¦cP¹r\9K¸ÃiÃÿ7kæ Ž늾ŒB:×uH5#Õ‚`(3…/«6´µÁë¡—ÉÑ8Μ´›u¼© œ±=9ÁùµkzAvaN²#%!I¨!„Î!tvÅAh'f¹3Ïã ïÎÏÏiŸìv€)ðÖ!±yKN”Ãà\›l.%{‰p’ß”(¯•š­Aw¥œ¨Ef¨žX¸,Ç‘ÔVÜóЃ8M] Þ®úǘ)Pt¹ù­ê üLJ{êégÿUÓ‹_ ×w ¡ÅHŠjmÀj \×Á[ƒ9κjÈ(ê\[d¡¹dFÕ{g¸*ŸÌôsáCê¿.%gDrëX “”‰ ªööJ%…èzÖ7†2*ûq‘LQ“Ó‹‹ )ûöNZ à*>@mÇ`Ö)+.RiglÇÉN™+ ÖHËV*_Ý*^䜃çÔ£ÂÛ€h`j\¶ªí7døQ¥ü÷ßK*K6½™ÈCbëÕCÐz/j'æÍ ¤zÆÁfš0¦,S ¡z³?ŸÞü¼*³ú†Í o®¨ÎBr‹Ç)ø•±“, –Zkåï[æÊhÐ Eñ9ÐE²»8(;W¦Ytù)GšTpr–ºsͤ4ôÝ–ù+‹ ]*…µ+¼Wy/t]€ï:IpeÝwžy±fí%‚y)Y¥BÁ Ñu뜚ókCz  dÌ;v<¥1[A…³A1¹µå@êý€rꟉË^BÀü•/Ô<6ú@Xòk˜Q—Ò’XUÉÈNŒs“G•J#vN•}%%t]Œv:Gˆ»ð­ÛñgÛ©j bʪGXÜcµ¬4kY‘â¨>ó1rŒvV±Õ8Ïè;·æ,åJ┹ °Z¹­°–Œatœç¼Gkóé"¡"§™«,·hí k‚ScÌ.½¼k\»ü®ˆ?˜Nÿ* çã±QËWsåC˜Zˆl :ûj¹Ž˜3öû='ÈV.¥Bù”‹Ùç¢é/Ë~³Åœ2ƒåÛ|0†í°’ñŠ_†(ÿÄÔ°/B­0Æø•¶D„:$È«GF;Óa““SÌ‘¦T!tØlN°K‡Ãˆ­ë»„†ÎŒï9GÓŽÀÕxbÀ–%íˆkÈá°W0di¬1l†fñš•ýÑ©\V˜¶¤Q0ì…tSEP½÷>þñ{Ò³ç‡B}ÞÃÊËnýÝU‘e¤HjRAŠVC{È™0ár 3‘¾nj‹y¥ƒöˆyeÊx•Då´—nj4VZ¶1üðZ ¤”‘8;ÞT¨z³ëˆAfoì¥jpWLÔ»`µTܹsG±A·}èÂR5¶nÁŠ˜WhecxÆ_õ–œq6ÿ¾]§¦á?²ü2µ³p ßÝ ãÔŠå‹XT˜KÁ‹[¿§ã{ô9„Ô&½ñÂÔ‹«Š‹Êòn¥L%Ãâí @~rrŠ8”8£ïƒö´¹ 9—:ÕØö¨,7ì8ŽHdõ‚šñ]¿÷ÄŸÙÙVØU¯zòý÷¯´ø’³.f–­™‡µ @rÊŠÐzÃ(ßºÕæL)¬*ë<åÅÏã¨c–’}À¹¡ÏÖ²º‰Û¶JÅ*MŸŽÆîN|ô(ÂË*. F¡Ôbl·[lºAcÙÏÎN¯x¿ê•>úwõ´÷?ðB °’i5ÞmŽ3™„dâæ pasŠj,ÆÃ¨öÚ²süámÖxµ¿m~ÞÅOâ¿jÅv»!i¶8àøïå’ÚAܰͱ30Ûù—cÊ„>P¾Ïí7±Ûí0îGÄ9¡41àÔ ƒ‚*B?Àw<,6¡GpžPÃ<Í€!†ç~žaB@2cL¨|qÌ)¢ˆÅÀº€ÐõèBR) C]|I§s±< èÂòÞ£ÀÀ†-¼Û°ÜLJKïa»g÷=ë ¬bŒ0…ª‘4GtÁÂq|¸b{eÄ”‘Ó¨4AÚ˜—g¬%eä9¹41­6¢ï¼Fz·ŒÂÆ“ Ä¡|BEGÌ+[@U…'»ãœ3ÜSOÁLÓ³/V^ýj”®CÏý˜µäàºä¾%ªº¹¶bšUhƒŒäæ:-}nLÄ»÷‰ûEØ¥#1 ± Kª¨n)Ouvσ+5e›´p<¦g“.n<ÁøÿŸ´7²d;ëgÍÌ{«ë­<- ´ ‡’ŒX²  = xÄ„"L¶ÁHlij΄‘Žpf4 c A˜EBFhÄ"Œ@Ö’@;z’^wWÕ½73Ï6|ßwòä­êîç˜~Ññº»ªnÕÍÌsÎ÷ý¾ßbèzåK5¤ ÐZc.©ašåêopÛl­#úÕ!Í$ø1‡Ãžò•f•¼QdÃ1áb:?VÐÖ æÈ‘nÄÝžÿ¯ö¨t©©¾øÊB…¢ %´ªÓ$(…ƒùTtáW٬䨪©îÀ¹zdˆ]£~è+x+×*ä¸öÂ"n– ˆ xÜ^Iu1t=J.ðù=Ž#ŒQè|‡”†kÖu<¦…y [ÐK+kX…H`µf=J©a ’¼pϽ÷#0gŽ }ï&kZ*d~¾¬øÿ'Æh˜†¦ÐÉdÉ "—„)’ÑCVÖfËÑÜ_øË‚œÏ!Ðl¹IΙoQG«&¾:À\¿qKÖߪü¿ûŒOzR}}2:°5ŠK²×äÓ™e¶÷4[O|Ê#ʪՃBBºBh6  ©†ç9:=—Š{´ÆuôƒŒ2'Dîi¥©Š’M%e@£¶yŠÕcO7IË4Ž£^Og+íY›ê] õÒÛªGa§"UÀéAòÖQ`ªRHq†íz袑ê&Dd¡4–¶(3n{®ÿNÊkùçuc¼4ŽT„%A;óP#VK•?ÙÞËûc,å*rpæß’CáW€·sašyRµN>>&,‰W_¬qéze„º6{‰PÚ2@‹ÊÊ4ư¹ çðýª&¡Šx Šs4-¬3uvŸ™­8Z/­lérúÍ LˆÐ–ÆØÓt€ë<´5@Qì‚Äd&ñ³×ðf±µP"+M›ƒ4U9Ã{Ç|v ÄiI-ᾩ½(Õ°’1‰Û®qTÓLâ–×Î1Ð:n»økùÿ·üØ¢SÌÐÆ!åe9† ™£¾™ý”zÓµ—~R¦¾=ÌãÂlS”þcŒC qްÎÚ æ‚nÓÁ…‰Ñç:WÁŸ¢4I{Kg/¦­qvqŽˆ ;ô€5˜KFTÚ[ØÁ#…˜QIV/n™Ä’`”F˜°V!Ä)ÏœÁ—¹”-Õךl¡ü0P/¨ôG€äa¨ª‡ŒÆ”¨Ý9] žœçã8ÖPÏ’æ)®žœ3/~Åè|¨*AuDÿ-ªcQa:ù:~àK}ht-¸§ñ 3·ÞÎ [²›?]˜ y±þÎ °®‘ëµÕyµ/¥Jœë Jý³H¤‰J¾$ És±ßï+°ß_,@î<ÃºŽ®¼˜ê²KëR$SMÍJ©ò<  ´v0ÆÃK?<½Rf1ž©b%Ž·Æ{ʈ3ù†KŠÉJÙ'óg (S_ˆSÕðþ ”ŠëS¾AõKkÔÆ3µ ¬¨"‰‡ñö(u‡h,ú®«§ I6Óúäõ"7­Q˜ãÌþv4£’ý~‡~0Ïæ)°ßºŒvËG‰G"~‘„dëéÒ2!pÓTcÇ–a&.IDØ Ëé\H:›K® ¦Pm¥¡PÎÁYSé¹›“ æi‚—ˆª²xfåÄ)±W€Ž7"¼ïàœ­þ‰rJe·‹ÄRÆ4Ö‡¬ÕÖSê“4ü¿þŠŒ¿jù¥jïl´†ÑÊ”9-f ö±ô>Êմа+®I kŸDS µ('…§"ü«)‰ToŠF¼s¤ŒAñb,)-- ¿VAAß÷œ ª~ŸÜ´R.‡-O ø¹¡ ÖxäLº‡6͹ƗׂA™FÃÒíHk®”FDZ*! Û‡°pœB»ë´³ç˜Ù§ÀAŸ™gª3ËsMx•œ@šg.›]˜²Bû¥â ‰1‡Eätå¿ddq÷5(·ø ®2xôX @8ÝG³£ Òòó[m‚µ‘õk§×X<äSÀÉÉ5 }Í!Ÿ¾ëà}«]­lJ)u$ä;r£íû¡šzYJüv!T³Ò†®,ÿç­™½©,v»ö»ó±õR¼*^ÉÜac-"„aî»ÓaN˜Fj•Z²UÊÄ%P@IÔ£Š#NÎ8 ¯\Jò€†¿Iœ‰rÁL<Í%¸"ÓÎfu÷ó¯°¬·j¾ôÍh“&⑲dú1«ÏÀîâ&Œ1†"så‚Í0`Žqè{0O÷¥P`P`¡0ßBÌ®Wá×qn¿šÁ>Íöß¡^?šÿ–µí€[EsŒ"þ•—²ØjŽ,è)¾‹?1.†·-…EYÖñ[vçåò¿Ht±ìª¿ñõ½ëÿð¤§<È㸇s¦qOUUçPr®F¨£ºùÕ,¾p”‰{€'ó÷"臠Í}ê©È‰ý˜(¥hc¡”€±`sÖ¸®XØàT©…‚žE.]–Ö™¢€ÍöÂÿ96ñ×)î08•ë=¶n¦¥2E1-?S`vŸƒ³á_£(J¯Ç¼ëIŒfÌêîYíPÙ"ŽZq­ì^…ødžYSwŽÄ»¾RW#ÆBn0šG=ЀrV‰`ye¼EVžs Ó4×¼išeÐy¾ï°ßíRÐãÖ-€:⸧”¡M)ÅÀ¯SÀÆm*Ц4•{Te¤0£ƒÃ~~0 ‡Ãž˜aÎc³ÝÖÍowq~³as„QNR×a‚Rˆ2b4̓SNÈ £bjeä˜á}¿¦û66STµB¢…g!íÁÌIÎÖÐHsžC唢Ci¬Æ–ªËp|×ñÂ?®Œ±H¬S˶ÕyTöÂ¥˜Yñצ—…Qü3÷/ñ¬O™µÆßm)è"/VÛ!tÞcž'*©y†(å¡J¬ëjõ—•/P”C­À!7=èæ_A'U }%ñkå²”25‹xVàJE±T¥?“F#™R›)–­—beáÃëq­<â¿Ù„Q¾‰‘_(ßJ¯ABRÃ&: k»Mí“¥Ó›K÷Lã±Öëo5T`§ ËÖÕÖ~0cãP¸ôüÀÖ `çjÚA ¯E=óä`:\\\ WjEX¹¥›-«Îd^^²BFÂv»%ƒEÍ" ´Nn=Ùn+Û*0jÞ9šã:c‘ õvÛ“ÌÓDɲÆBoOXkÀ½Re†FNÄõ&êÌ–T¦ÉzÏU‘Ör!Ú±X´kVÙéJ2œØc*æ‘R®#2ˆØ“b®fÁò2˜ó³;ŽV‰‹Cbð88±ã°xÏð¯ òXÞR¹ì÷×èþEó?û‡¨ÄWÊxŒ|N¶§P*`GXN·¡´ªÀ¥wÁÁ=›ô: x O(2»¿ä› J³ö#€¶H_%[¢l*Mk\r^õ¢mxÊò†×³HÅ _©õÇ$7YBuޝ‘ÂDcQÕ£ ¿…ÓTpÖC 0‘uÚF³Ç2Ã{m)‚Nü*2 ÙóÃðˆ;‹' â(ÝôÉ-Ó(rk@'oXvÄöò(%Ô‡xGx¿Ø„¥V’Â}– ÆX =às§§'«¾²Üf ö–ìz)G»bÊ‘):ç`µ‚Õsœ ÂµÓSÄà'ë0î»ÉPŒÆñ@‹Ð˜J<‘‹›‹†jÞ_‘œË¢*_]Wua^±"Û…¿„òµjñ-¨’bµ÷$>\®ó¦i^N±Ÿg¸}ä®rU›•#cLmÙf œþÜ>Áê;Hy4» 5ƒ5íç#æk°qP¤8ÜÄqØ_O¥#9ng=vÓ9¼£Ï#ÒÝß‚ñú|øxèr¸Ã÷o-„Re(¯ ËBrs­ÊåÈ2!1]y4)¶W½æêŸm ”öü6Îð +À¯ ­|ˆ£bêA#‡Ž€É‚?Õµ^_Œq¶†„¬ýüÕÊŽJPN:ùÖRŒéˆ¡%‹ K.¯¼DŒäj.€ªöË·²ÿ:f®·Yõ5Åx?VQŒh¥e!ãj™6OÔ`Œ©N×1É…ç¯}ߣä\­Á¥¿Ú詚ІÜse쮚ß2†$©´”Št³ 'ÌM™qÇ×KlÎb˜0ŽÓúh\fÀåÄ-¹ó×sÇ  ÈÃ@3ÀDJ:¢Ð*Dý±ˆ¼“aC)ÇþþGŸªˆ7¹ÏªL¸¾s8Ù ˜çÞ ½ÇÅëHÓžp’±ÙœÀp¾d×u˜æ9~)3»j$z¥çZO!V.BKÅ¿þ|ÐA}Zz«êçv"«‚[WPWmÄ fè ÿ !„•æ‰ [ÂpÄ·B¬ð…Ãc¨íwJ :§òÏ!Àu¤º^D1Øxë0¤ÈÇŸ]}ÅïM5I¶9ghe«I(9”ÎubRÂfpð³TDA€eÓÑâ-m«VÖªîj kÑ÷=Qµ žã¿Áe æ±ß„cBë-éÝÅ?G—¢l›ÙÞÜŹ}ÆXÀP¿l­©w—6N{Iqì—w*é:_C'…a)Y|ÚtžØfÓ4 Ñ[ˆ9«¸2Ë‚‡? sóæÕ%ÿÑf›ï¾‡õ9])@+ƒìžÁ‹÷ŠÞ¢èžùûæÒB¸ô0·eùô/Øm_m2P–tfŠ$§<¾íéÅ.a-Ð Ê2¯pÞâþÇ=³é6ÔÀf¢WÐǯXÈǧµºÕ¿ů¾^]v6ºpZn{šÝbCÑõ „€¡ëá­ã±"XÍzÀÎ1òFIë0¢”Àx@ (úÐ'(úŠøßþá.õ ( È(´à#ŸZBŠ:˜c€³=:ß­¦VD5¸õpò2ŒêYÄ Ð[ªÔÉO—v³KSæoj«?oªêÖ‹ºÜ Gm R!ãTmO+[PN}ï}õl”¬ˆRÊå0eÙæ¯«^†6ÆPOiç,1æRfJ°‚L æpg Ãã¸oN+~@œá7Ì?6•¢+ùzàx´‚#SáJÒà—Rà½%Ð^<ÍJ+ãÜ*GOL‡žÆ»a1q´µ³Ô:==Åõë×yd¸­A‚¶{ï‘b¬e¶sš9ø1%6QЙb¸²:ïYެ+W»( ‡´Ò-HWÙ– Ö) o …*òùãnW½ehÞXÐ(ÎØéæ‘ë—°”«Âxíê©O­iÀš³¼õ¶2Ý÷ã˜Îÿª\`(¿‡~ú¥‰‘¨,ŠêPr€Æ\Ù k•j.ÓCÿ@^„`D¾)ÍÏμ&& ñ&ÇÈœ|GöꌧíOÝç…7˜ מ †Ñ–ùJ­IŽ—Nó¶…¸ô¼U Ÿ#XãÊõЍ+¥@›)HYzpÇ£¤˜* Ymš1Š®lÒõ´‰…HJ‘¿B+Déºnág`žIH ”È9˜µ™Àêý— ›>®%¾"ª‘²•¹WtSÞš•3KÊù–¥ªnïCc¼#‰´¶@I°Æ ÆŒýaÂ0MV8ŒÈ%@§ Þ÷xä‘G(Eihè¢c¬yxb6º„,Ð÷Š1ûC7 Lâ0œÑ÷EÓ R€±lº©m* ì’ãkL8‰4PéÑ9(²GË ¼i2jE ϯÇBE¨¨¿^’KN•»^[€›7W›§º 0>ðQÐù¨ª¦TìY'”ÚÍ'ý§a<ù\<æuØ™Ïk^LC)Ï-‚œÄt|t€ÙÖ;yþ¤: §؇A3h,,OâÌ! Ä€×Þ(%/€èÁ>Ô¬r¢7ܲlPô¥=›Žèh©pxº蕵õØíÿb±F“~ù^+„«ZdÕª£Å:<„‹þ«É‹p{R+F9DCj“µZšù’e ëE‹Bq‰;–RUë¥D†EXS™Ý÷>º‘¿fêÙÄ,”Æ ¨åk’.+ù£ël¡›G^oº’J+ù¼M餚 ¥4ù|Cï—~¶ÅªËªA 3æyâ”KrÎ §±F™m6î÷éºÌ)2¾@¡ØsÓH¤ Âtu“í·ï‰-Øuާ@×¹zrI00+UXNô;¥‚~0ˆI£ó†íÙdƒªåŠhá1àAyåñ¯ÕZa÷˜TèÁ±ÊÕiNµ) 9åî—á#ó×P‚ÐþG1Ä_•ž‚˜%3xÈ®¸(à ‘BDÌE6 ù„Ä'²®Ïc×u”ŒkT]ó<£0îQÇ©÷+øV¨G~ýüZ®ÄÀm g[á-P–TòÚ¢¨ä‘ ÖFËÂW’R7Ö***¶@Û?*G&è-‘¨ 0ùÏF<ýF¨Ã¼Êzh­ÈjvdËÙ© ]u4Š]„PVb¥$EFì eáÒ71ðÞÐŒûN(že ïzL¤“n‰Ó|³ËB²¨Hz’¾%sú 22Œ˜ÛPUÛÿ·Vß­Sñr㸌T¤—O¾ƒ.„3Äb¡sª™wµ/2^S ViûEÃÝu]]àëñkp¹4OšiÓy™5—Xg³­ˆ|¼¥"´¬ÓµªÑP\f«Š¤Î£°‰ˆqŽ} JSÖàä Ã&+wâñ¤ÓÓŠ]LÓXÇ–Þ±ŸAÉË컂jë0ÔýðÔK±~Ýô˵{ÒÙý=ì·ßF£f.kÁ Ÿ—–Wef,BÁ÷”ŠÜ>câÝXšŠ³]ñô›0ço öäîØÈ¦Ä?OCÄ[²Pøÿ­Ð© ª(Vì½uJqiÃÊV€`‚ÊóÕ}ìÑ–1@Á³0ês1^{{o•w º©<­QšáÍL-ù 0É©¶ý"žq¶«I³ºÑªkm«£NPrä~Û`pØOdR2Œ%GÁ¶‡•ò„%:q)È)s¶€œüb¹È¦Íiu•@.|žH²›Ù­·Ú=‡Ì½9š(h’Cª \p®š¸˦T ¥ÇÄTH&Š‚i¦“u6”ÐCŸß†~~õº"bCW¥—@VÕ€ªñm¸PŸ‡ Ÿ›ÞÓòº*DBÙW‡b¥V¤Àfõ[5@)‹¨ó»’ìÊÙͺï¶èºž¹,š†"N~Á‘ª¦G^¹Jƒ…jnµ20ÚrÜÑ¥¨M¹`ž ô“; 8k1Ï#é“çÖÀà0”8ãžk=b$BèóÑÜ”u†ºæþWS2O*KÑÕ¸ÈeÀÅå¡1vPy…Êž« –¤ZâQK’pªb†b3*ív»=YÜu“ÖͨÍ7˜¦©ê𥪢ßê’ydu[jv¤ÚO-ë5• Ûí5Nn&C£5ËY`ŒHE±Œ6ÃÜ<¯A«åhw‰´=i6Ʋ8Õ6×—p ÈCuù˜1k3ÍVà”Ô=ÕçAåˆT bã“@³nƒ\BX®ubMÆÏq÷é]«Wå/« R ¬é™* zN 0 ã¹{ŒÒ„ù؈Ù<aû5KÅ£PU²Ö¥q8ŒG)Q´VÄ]ÈŸ¿×ð:þ¹TÙS»q;6eQô(Q<Æû_‰2ÏPXœ‚…#CY›qe»æº)EfKb±k¬ýè@=û6#‘AbRÐVaš&¶^2&ׇ1„€œ ¦D¥&²â\€=v»œ:ç‘¡þÃÐ±ŠªÀv9;.ÏK€5Š&T7Å £5õÖ…‚4K×Ýz~Üü›}øat9''«Ù:@”• ‰ÌT—‘zYI¤„)Ì5¢yéít¤Z»s›ZÀóp˜ªÕSS5+ÑÇV?t ^ÈE¹ÀC:¥a¸:¨}$®ŒÆ†døÈ‘ÙjIÓ )ñ‹pÈýùŸÃ}øÃWÏÅÉg÷Þ ç{jñ¸Ú |m”6ÈìŽSËQM6ž¶$|R¯…RÐ=2§Ù"'tÝaVÄ9É…Ý•cDL{ôÝÓ”å~@Ñd½^JÕÈcY(G­Ù~?U籿»·üÏï"ŸükÿÃX¨-~hLæ™ØŸþLѦŠC)¥f©ÌhãŸ92³[’Ñd‹2Êç¹â ½ìË`0Žcª‚#JaY2§ûä$rUqžPrAß‘Æ}3ǤÓG.Tæ§|)ôTFw‹i˜“tíÄl9¡X½Q`çB•+¶\4æÂ¦±zèRD .ÍÚ[f)PØÕ²û’¢!CѨO#ØOÅnû=lÅ_øý,†<)‰3pBÊrH»•7£÷†ÀÔ”f£‰üÓÚΑ*Ô­1¨³]ý†6¨Tc1{“×ÓÅ9x¦eÊ rÎUÏ´¶$¬¥‡ÕpÆÖþ¹Mœ€\m˜nOâÐþ0ìÛß¾B7Û"«”Bœ«È‰ÒVHãn¸gßl6Õ©GèÃ) FbW&-ŸZæú}ß7£T[ß»1Kæœa†ŸÂ0°Å•î™3#‹®È4¬F¨ç°§ [>W0ïûÆðÒÀ¡ÿÝß½r¤zÉ øÿÎ'Â9 EOb/íê÷–¤1¶öæBnƒIèy¢däÜ´ÖtΓ3ó<2I…hÒ}×óë‘èÌX u‘狾mÚ@×ïÛyX§¡4ÐôCÇ6\ãx¨úÅô–+ mjX豺¸cË$¤u¾{ú7èË@© UöFåŠQaiNþÂ&¨§ßÏÏŒfW-C‹·Qöõý@S3~dñS؈ãÍQlÉép¥¶Ö6‡µÞ VÞ„ôæ)çUê¨>² —Ò¸%…‡J\Í ×¹Zï Jx1ŸÐ9;PÊxA|ìc‘‡êp¸ƒ¦£ ÿ/ÿçÏyÒ÷“Œ5' xVø‘è»LAcª}wÑ-…ä°Ÿ8ÐÄ9® œsHÉw+k5ËŸ—SrjäàyŒª”ª`õךƒ.l­˜ºn¨×%Æ‚0'j3ÿ, ”åJ)’DŒfú"¶nH þMo‚ï{-|Â' 8‡íÐcr&-„ô›â\$JNñxƒmPcÔ—–ÉR x)˜ÃŒ“Í5Â~åDHÚ­Ve%sÞ¡Œä¯°ß{r×ã.N&6…q,ñOËÕGFrÛí9ÒH±dóÞÁÈJNu»xÔYzY™Ý´-ÝöüÛáò[iñçOaÊñ1+P)Ç'?-þy>´!œ°zl03UÄKdl+#ëÆçT ‹w Û-ìí±Æ¯ê’Šƒ Ž©„ð#Uí.é’/@˜æ Ðh¨•§Œ²¤'j]OMM¶Ñ«Ï·Ö¢ó¶žúÓ> ñq»£ ¬pïzìÏÿ<6¥Tc‘#öûC]ü²0¥?¶Ö0WžòöD/SÀr²/vc±±t^B1ZŸÌ«åÚzR­Gíb•£-Ñæy®:At‡=’·—ÓÊ M^GôÀÒŸaû ¿Ìó-¹ÿí¯ù™ÏX!ïò=l È\ƒ­’`¬ÖYÛÐÏd‰L¥5†a¨ŠÑÞð†ßÀüÁÛ‘˜ÿP+‘™6jç ”¦bšFò¢sª€©¨&­ñõÚ„0cžYØIèÌó3?ýÐAÁÂ:iZp¥ÃီóÇ]ב!§§”¢Ã³¬ý'¥Ô%£Ìy•ýXmØ xœf1Ïz¥å0V_2j1Õp–EæO¶øýùwcPo#/ȲwËÊ p(j…É<ãÝßÏ÷ª KUÕ¹\CiùH;bš fYcÚ 7Â-~Ž S«5–ê"ÆÒ2§'¶Y¹Ä*“+¥p)Mþ/§ŸDDµó`9)'žÙ·}4"Rœ)ä2.½Üþ¹ÏEñþQ™Ïè‹ ô?ñÀ;߉0ÏP\ÑȦ֒t„@¢””NŽ)Ï‹|÷°ßCú†G{ççóg]d¢#3Ó‘,Ó•25ÜQ•‹]ˆFÝ.ֶǬ›ƒŒwÈP8Û]àæÅ9¦KÆÈ)FUÒÙ<$r߬µ(ggè^ó¨#‹õ[Y‚ÍO:ô³?ZYRýeyPfö8,˜¦™+œÂ§Ïò} ŒÄ¥ˆ6YˆòèJeñžž"g`·?àp˜X½–ù`˜±Û] Âdú~  ö(4–”«BbËY\“äÚêê@M#RÅéÊs³a,c¶ŠÝxK4@£¯Ï9csñƒè㛀’É€½3.ýfÍL.Y æ9ˆ÷ÿo xINÜò|R•¸(B¥êrÎs|™^ÈG%ñÔKÁÖ°™vDš˜4ÇùƒœÕ µ†nsésÎ5õ5Ìq•D’Ò6ˆzm‰WUÜÒî.mø‡69eñ IDAT|n×u'̰“ÍBzMÁ†ç?ã3ŸyÉ èØ'@~»|Û{%òûþašëb!ðC«k`©õÆz8ïá8$4¦RgÇÎvèüÀs2ú-œíªÖ_NBAñ%òp8ÔRnÌ™KЖo-¥yqcZ¸=Ÿ‚r²Zëê×Ö Æ &¨¿üKtïzוӔK×TkL/|a= ­µ5 b»ÝÖ…t)‘¦qÁm3%¥E¢(3UF> Î/.p8b$£UmV¾2úºvz k)Ä3å´º§ÂsЬì߇yÿþn¢³ªÈR™”e~ßø=ȉZ¨65¡ üùÇ7 (. ž..0[J vÓéË/UGm›ØzCHÛ!€jJ 1LÈ%Iè 3¥PCL–{Cöø1ͬû¡µ¨cat5¥ŠV PDSî1‡‚”QgmáY?{ÊEšç¹,%KŒ¹(Ë`õ´vXrbÄÄÊ;ÙŒ1¸ùÂ"ñèìvîÀò÷þ­oÃ=?öJ˜|`E‚h7*!íê"/-õŒýf€qÆQ: 4II«o Ta´\~pœ©#Òº(KF ¹±Ž–“Jq ‚%èóaÄ´ß#…§:«)ö+f¨¼”‹Ò†H«"Ó™œ3ܻ޽ÛÝ6bM>vxÖ³ž÷y¯˜çç:ôý¦nþ‰É0ò9‹î@×èŒAIó8C‹’€ép@Ž)Ìã„""Ûµ+ ÝŽC9(y:Å€yšSÀ4îi|§€LQ0Eáp¾#Ño¢ÄbršÐw'Û¬ê4-nR˜’ñKH•œE1gÀ:(8”l…·PÚP´<(sFÄ×ðÿ²ß…yö©+H>0Ì:»ÏÅxí;༫‡b˜Bˆ\yH¥ËZ°"ƒQåc]G L˜¢€Ö=æ)Á™ó1Õ鬑“ÐÖiÍjÛŒ·RHøÀ»ßŽ|ýáºhÈ\S|õsuô@>!ChÖâ­e¶(ö e,´•QͰçÆÃ¿”‚Í1.>ïó.««®cI±6üÞïáÚ¿îÏþŒ?®ë¦²6)Uõcr" ýT¯´#mÒíâ¼¢ª»±œôRå´–_rò·c£V¥›¨«Ú{j RÑ\5ùe$ftÂ-m–´WZk`áŽF·,ÿ­ÅÅܵ-ßó!Äšú+œ‰ã{.€ªlšrê{O Д%†K$ãdáå}‡)†ÆÌ²4Ì¢TóÞãää¤^/bZG÷j»Ý6Á5±éã-µ4,’ç1¦¸d.`Í ¬m-Òâ Ö ü¹$æákÜuñÆÃÇÊ®»äz¤† öú¹ÈõU¼C5·3F¯ä½t_g'‰ìêu>R˶ãwc †~€3†30LÅ”Úê›'^®–"Æh<ùŸL&ŠFy5gÏ*òNç‹%廜ØÒßOÚ²&±5uk!F„#¬tðâ #_3¿èEØüñýç=·eêæÏýoÿ6’÷Ø}í×#þ­ÇWªfÎdÃ5qR8šiQXQ©»Ý^«ï³ëˆi,m¥J©h\ÎMÓ´BþåfI»$! ­Ä¸¢ÚÓ¼"»jAäe–-÷¢ï‰µ'%ºsñï„c~Ä­*&ù÷éiòÜϤ?³õ¹Ä>Œ„{ª£Ì±{‘LZBê§´²»L6:ç ­AC}à§éðaš笫¡lJ{„0Ã{S匈Pqyg$–!€OkU7×åý*xï#Mèkè¹ 3§U­¬ðH†­´ý¬››ß›ÿ”¬ÑÙw)—µü n?`Ó¸û»`Ž(ÌíúʰÅÖZ ýX–Ü¿òóÊ!`½ã6n®kka6Á'¢í®3Bž;/?@’¦7G.T´`ź]üíB¨Ø€Z8e¥i–7,•…û„OÀÙ—9ïbwrX’¿¯=6?óÓÈ×iJÄ4¯Ûç:hmùgÖuS“ÞRzΦ Æm=}÷ã1'²S³Ó4Á{ÏÀ*ˆXTr;µ„œgä<Ã9¥B˜*`3ö()’‡@!;6Ù Ð/U‡\Ñ:hkçÃo¿öÆ[ZµÏëøœÏÀpÿýÕ­#•Œ{æ—ã£Î¿÷^üSÜ=~;½.–Ó^ˆ8Öš‹±zC–kU™ ¿aNãx œÁ-9!Ìq"ç˜X䔫Ã]Ë@Ô®R0OB˜0Ž{V* ø¾«lM9Üæ0ÍË8˜~æµ-›à.­'Z¹°6?ŸÞJ›q94±Ük+0˜5 @Y(ú!h«ÉõŠyý­7†à%:®íâÖªK \à‘Ë2¾Åòñ–»cŒ!‘4¥Üªê.Ú^Ú=–²~áÑçê/eñ¢·_k–Û~µƒ]•? åe›ŒŠç=/zŠ1wÔR·”áÍÏÿ<Ük_‹ÂÈoMÞ m–?çªóoŽVi(7î°iOðaøçÑõÄÔÆÕ?Ë©ßz¶›fËŸhÃOó«öAª®vôT>øAlÞð†Ûn”u³tñÏ Ì‚Ma®?3¿J(•àâÛqßõ‡pÏô«÷²ÛLn&F‰ÛˆP'DIÕ8?¿`Óúü~³!…d Càìì&..ÈjNAêéYtG„2Åb®²ºBB’6­ `·Û‘tZ;6ϤÈó:!Òä¿—K¡Tâçó‡Ÿ_Þ“½¸ZX}µÿ—k­6(¼ø÷îÀ}/ƒVvUÙƒwW»]fTJ¶¥üû²a©ºñ W§¤˜o×e}mY¸äö³Ì!IÈ£Xï1 ò½¼µ\ãöµ›2ËæPdƒpT.V-ý +¿ä%Ø?ôÐ-æ«ú\®ýäO¼ùÍH\a,-I©\‡åº¬I-²£ îQ9 ãXûí¶Jh«†‹ýnµXK)˜càÖÁqZ¥µÊu¦ôÙÅK°%µÓ¹±aE(·{ÛÛaÿìOo«¡¨mÌž€øÔ§,©±1¡›_CíT>ƒÊ;h5ªÀ‡7â1»„{n<„áü¡òuÄHe«Jס)ç¯r?2ûPðL\éÓsΘC"±©˜ c0»ÝGŸ4Y!L¡ó†a[•‰%+ì/vG’ëäÃÐ÷$‹*˜BÑ”Ð\O[³çÄFšûW ›_G‚ß;!þ²øA•Ïξ¸ï›W-R{8gᜭIÖâHTrFŠiI†æPñÙðŒ3'qÅ8óA‘S€a`(5®®Û\ bJˆ)בCfC9â"SøcI)³^.î2º |ÑKM:ÞáÚ±‘Õnžµé84OuA ¥U_ñû¿çׯãÚïüÎe!Ë-Æ]æ‘Gpúïÿ=nÞ{/Ò'}c¡n.mÆ;Uùðׂ.+×Ùœ $Æ!?é<Å–¥0£ç.  „Q— ’ä,2]gàÚµ“j$".81GÎx׫M¶åƒ«‡ÆÉ/þ"‰ŸŽÿU2ôñs>îÐuö‡ÜïcÍúKIÐyO®ÍÊq‚›>üú:8£¹ió8l¾!FÌÓ¡rÔç9`³ay5‰¦¹´×¬=±ØnÉ>L+G;h­±ÙlªaŒœ¦…C9åšLÓ¼ŒöØWÆPØzȽ@n©ü„bÐM¯fòÏ •Ç%S¤µ «'ߥz$܇Ý}ÿád|,¯‹%WZ»”´±/"ÒÈTf}æ¹úŠDƇ—³¶Òе(:›Ñ|eä.sda;ðxª¬§vN-#¼ã…›sÆf3¬J™Õ®è¯ÚRVYVTòÍ )61´«qaµÞn@8ûНÀøÏ¹Ä Ä-Â.€î=ïÁµW¼ù}ïC ¡‚]íÌ]")·Ûѡ؃µ-ÁŠï®]1åYãkÛ3tòóæCnÚ#·rý…Êp®«ãÓ¶2VÁy³*uëœýâþç~þípÛMQ~çûîÃüÜç’C0¿ ]ø (è²[WWe†Ê;¨¼ò(3JŽ$yU „’â…ÂîýÅÃqÕ(ÂFºúÞû~S™ŽRcPrÆ<“9Íb-OÕDŠä %מˆg`ú€œ"»–M2Ktý¸_@5UÓv•R.~€>^T9¬ÑþrLñõ€êQ”ÇŽ?³ÐšcZñ[Úùþ4͘9E˜ÌN—çë“pã_}%Æg?ûQ¹ÜÊ¿o{6?üÃ(ï}/ÐàгÙZ}‚TòpÈF¶_b3¾Ó+ Kk‹•.Ȩmœýœœ©È…(ŒÒ°ÚTÀoMÉ^ÀVü„ìcR‚{ãqòŸÿó¥Å~+¬d|Îs`Ÿõ ¸Îb ºýÏrO;]m{M.¬4ûÎPù (gPé È7kËPJ@A_‹aÿ0žaѱZr¼b¬Õè;£3tuºDãÇX©¯%&¨\æÆ@QÐkN]ç«NÃV~¼ã ºT¤?¥‚ÝÍÔ?ó3¯ÌI¼¤:5ÆÀ‡×ˬ¤z–+F)$îÙP8ß~w]x UÚÔHn‘HK `­ m†EeUHpgˆÌ”D]ESÌøS$8ÓªÀhj!R˜«9¯èz¤ÊqÆBͼ‡„˜"ÌK_ú’—¯\|S‚VÒŽs8쉒™#±ãšùh[ê“«ë2£l%Ê,¹x9§Õ8‹ª W=s‰È‰…PIAši˜­Eº¥„ÖÖ¬TuJÓƒÄEee–Ñ¬ÕØ~Ú§áC/~1Ò}÷]YæÞj!tï}/îþ®ï‚ùÙŸEþÐÃLʈ+C "X’,z†ÖË¿iÆS"ò‹”þûÝŽµçKy+£ãI€´Mså(”K_lɹmQ úü›W½ þÿøÎn³R–~â'Â<ÿyüêÂkÿ: æAªãQÂXa·µ¼N®“…êÕÇÏ)g&†%hC {ÓõpÚàt{‚aø5膛“íÝX7ߟM:9Ú^ˆ6mÓõ}Eù[ÚµdhµÔöFk ñרäs¾zó“v@õDø)Óµo­£Ñ–csL¡Ú>BµoçC•Dq)7ÂØÅìo{mfÃ"JˆS˜ÛÈP‰2?KMóÖ4¦ÉaEWwçvÑ.jÁÈ‚=o©°mὯ„"¿˜UnŒ‘dŽÌ,eqèQê2»I)…‰Ñw!ñœ¾à¸ñ¥ÿÅûKóíÛõÀöú#¸ûG›ûqÄ÷½s˜0ÎJ[ä¢0Ž3³u-ë q¶˜Ä0 ÌÎSè;ƒ¡wè¼qEek±Ù Ønhã0N‡q†í”Š"qЊB¥·Ù˜¼u”\"éësÂx~÷šWcø¯ÿõQ¨@é:\|áUEm Fûx~íÙÇß^*uÛPÝÁ[œÚ*jUºŽØ}¿aÓ”Ûí›Í†fü]‡Î{l®àäÚ5ÜsÏ=Ð 0çL)KÖxtݦòPÚi ”‚Ñ’õ؇þV ªÒeãÐM;ÞXÚ|„ºGAJ Ö1`Xr©ïï(’¾ûü ¶ÅiZ­GAçóQð+9!g¦Ê×üÕŸý Îo|ù«?­ÕƒO:¬]ƒê­$¸ÝiÌ:±Œ˜puÉ©²2›ÒxløæyÆ~?âü|W{Î%xð꙾”ýâj¢:rFä× ó¢i—Ì»åÔkŸ&Ãä£Ë$‰R Ü—¿g_üÅ·\ì·ü6¿ôK¸çû¾îõo@8`>Pr䛨Ž"Q³½_W8r(ìºÈŠÚ®nz$ì!"P˜æªyG.«ß–yRMµÊ?Ù¨bIðïþ#ÜõýôJñw§ðÏés?øÇ_¸Œ:•†±R÷YÐÊ@©Ž=Ô¦&÷¿hÁ Xjedw~~^Ç_J™:‚Z ?v»]M²ÖbwØ“î0Pe©[…ÙÆe WšƒH¶BÏJΖX&ä¥c®‹ü­:ý Zeµã­B=”t@ao>áô›Vd¸«x"ÕR» :ÊT‚O[ÿîœ'³×ñ¡þÿ„'#§m<®äÜÙ!ƒL|¼÷0‡vJY¦;v·^·®µšþÿ⟿Ü[’ ‡òØŒ50ŽL;C$PÇwŒ^,‹Ž缘pÊ8¢dµêcÉý—b´Zè²ðž‹<ì»'•…ÆFd3æ¸D5K÷ßÿûHïù#øÿñ[z Þê—yøCØüæoÁü÷wçgÈÆB"hÃZzFÅ%¦­%›”m­É‰ÈNev+nÄÞ¥³¬Zšu–ÁÚØ¡UÜÉ&뜃ú‹¿Àö¯@÷'rË^ÿRì×Sž‚ó¯û:ØÇ<°ºhE}æö`Þ|)0½¶|p ïTfñº—ÅPÖAYU †)°dµöþt¾'Á /Z×ù•t8rO[ ŒªNCÃ0еŽ2 ØmJ­Æy„%é¬SŠÞÝ€vaÇgUÁkÏTtÕðR°üB O󟡯£ÓóúýÖH1[7€ðÀ¬‰IâºÛœT~KFµûj×…áÅJä·f_¨=Øl¯!¥¿ÙbØ\ð=ïhq‹"Òzï|M;«­1\˯lÜÖ:XTr€&Ÿ¶6r¨º°j·:× $XŠÆš#æû½kç¹´sæˆQ—‘]Ý Jf"l•«ÿ›ìdÖ;tÎÂòf³ÿÖo>ŒØü·ÿve \îP ôoy ü[Þ‚r×݈>ˆñÁ1?éIÈý1ÀG4Q‘y¬Ôæx co‘n&t~‹Ä¨6Bà6ÉT‚6Åf¥Œí…$ú4½j[iùý›W½ Û·¾öW>9ÁÍ¿ý3žÎ.3¹â,DùV) ÝõƒØç‚ÍÅ·ÂÇ·Ò&¬:š€‰0ê Z1·mæBaø"œ¨SŠ¤Òª{ä2M"UPG\Ú’:Ïu–Æ}±ª¸8ÝÚeõûC7ýòRpøëÀh?ñîoeŒI5G <Á(—Ò»‹´°ü®À:Øn€ÿPjÛsL1n7ùÔŒô¤º^8&2âË<4Õƒ€Z?ƒ÷þá;ðħ<ÃêKjŸˆ¶ˆ!Cyƒ 2²•ï°­ñ¥1ÂzÏ£ ~èæ›¾Ä­Ò,íBC‡m㉪Z¬d Îrl·˜XRo«²ós r9ÅH*(E³ŒVÃ9Žjʼw ­  4R&R’ŠÑ,ˆææ‰‹³¯ú*š¿ñÊWdÔÍðoú]ø7ý.4wÝ…ùÉOÆø¬¿ƒðŒg">á Ð÷Ý3 + PNhqªóZâ´·4â´L£\büµ,Áú@ÁþÌÏ`û‹¿xK†_¹b*rö%_‚þ‹þ=‘ öâ‰m¯8õGcí‡pưûlÊ›xÑçŠúc–³¡ç@Úþc\/_ÆnÂZ™Š ÅTئÝRĵñˆaæV+U5`J‰°€D ªŒõZ­Æf÷ïÐͯY°‡’é™a8}xÂ9ïþ¤9PÀhc¥¦ªÔ`·;B4뺈ôQþOÁ2ñÈH«`×¶ßogÿ+†c£ÀƒNyv¶Û-nܸUˆÓPæóaðà'> ã<5kNø Ofy\ ÖŒ@“?€¨ÿ¼‡ïzâèÄóu/}éËC$†Yâ‡ñââÃÐS6Ï(C åŸÂâþÓêZ^²•–³~ŒÕuW¶¶i$eò¾O…£½ BÌ0JÈ8À=QŠ Þuä³Ï]™qw˜1È´…* þñÅÙ“ŸóÈ#+;±;Fbß"w@Ðãû×þmoÅæ o@ÿ–߇{ÿû¡ÏÎPØË q⪜ÖóªH¹Å3¨Ô³—¬ÀŽÃ4ŽŒê¬úCÂö§›W½ êŠÕ[µ>ûç<áÛ¿ Ó4³OŸÆfä8+™¾§{ŸKư½›‹ï!0, ××±­t¥@à=ûGÐφ†B ’}sA×[®$¨í[¢Ý ç*matS>{2›VL>’ ?º¶×ÿ†OæÈ{((„ªÇ7é@ã&¢ÿôºø‰Ûbà}ǘԌÍà‘S@Éôá—¡UBlÒ€p4þ&rÛ>?º{ Œ¦Ö&„X?ŸH]¤K1W;*—ÍÅ9£ Ý‹:¤ªÀ;ËïQ5`aO4õˆ°Ær;˜Ú…S»h]GA¯YÚQ Àüó¿øå©°F_QIl¶k˜§ ¤ùÅÕêäoÍ!bcUÜÚ% «±@ɯäWǯ•Imh´¦ˆ%.Ý ôb“F­4rJÐe’wvÕÇSNÃÞwæø®_‡{ßûVÙÿÌ&pÕf b„ùð‡áþðáã7нîu°¿÷{0ï?ÌÙ±Ðrœ…ö¶F‰Iþ!¡¤•4³åÛƒµŒ0<ü06ÿá?`ó³?[¿º ê/Ky .þõ7Â<ñ‰PJáädC ºãZ‘RN ¸˜P‡ñ7¾“ä¯%¬˜pm¬µR€ÒŠoζߋÓ{ÄùÍ›b2óÏK÷´8í(Ö‘¶è–SÚ,Á,Zs¥˜á­¯jA¥4îÙ}4öPˆ@ÙQÐKõá+P%òsÐá0 _Ê8¼•žoš†¶Ð6Ðöt‡ÿ“úéÌ#M…+ªÂIR°ý»‹»nõ0¹qOΗwr=‰íGêEï=E˜æåÀUZ¯‚YE$1½îÂì5+áœZùÖÃ:Æ 0”@b-Q.mo8å'Õ™aI!Í«±œì‚ÄÐ+úlµ´j$¤ÆÚ:ÏÝx) © tÌ BL6å\R±õ‘–ðœ’^•[b˜)%Wø–oÆ#O|îú©Ÿ‚ûàÃZAx'а¶ ¥@ݼ‰îæM¨w¾å?ý' wÝ…ø1ƒð±O>ö‰È<<ð¤ûîG¾v 8½ÙÌaZ\‰£¸È.ý¡á ¯ö´<‚ÍOý†_ø…uÆý-ÞCýwcqþ¥ÿ þ3>GŠ3æ™*:µ>C8ÍÅÅõà–0Š.üãóåïU/„AQ=JQÝgãlzòî&îº÷>\\\àts‚‚‚ý~ ƒz‹Õœx ²8…ƒ=ŒR´áÉsLHõãqí'~Ý[ÞreÏühü鯥@߸ãºw¼cÁN¼GºûÄûîC~ÌP÷ÞGÎAÛ-bŠp,¾J)QPŠÖ5Ö¼”#Ì{ß ÿû¿4w»uЧü̇¾ó—ü˜y†2ÛífeB ¸ŒÃaÂÙÙ‡à½Åö„|üÙñ‹EZdªq¼i1EwˆVû7ék±Ý8;#ß…®§J²šÇdµI…0­ YHš^ ¸¢ôZ£p°Z÷”WÂÞ| ·áö·Dz«YG9P•“Ï`?ø"îýˆ1`šFær žž,º7a•Àç´¼žjS~TDAŠ#¦žrf5d‰ÐF"ïMc—/-îöï"þ*\n„Ñ÷›{Ø&¸G³³¶ª•Æb 7ÅJ’"6)q#ÄäW½ùM¿SŠ"&åTÑl);¤´ÛkçºU‰Úuôƒ a¿ßWTœæþi¡¾Öž¦ ó•uuŒv5ï=¥‚‰µüŠC=E!(áŒÞw À†´Š o6÷ò—có+¯†žçKÖbÇ ™z"£ÿ¿¿ÔmÀÉGSÚß!ió³?ßû}(Ü_Á£y<àôô”5‹ý´ÜcçÈФd…Ó6ƒTžœZ»ÞÀlLþ8ó_‡‘cÅö‡Nï:!%iJØlz„)9G•ÊVSj)_ç9°w‚AN©Z´9GÏãpþ½ðá7ø@˜I›ß^F›ß:õ”ŠjÇPÉ<g'ÿ®¦É‚2<Î6Fãæ#ïÀãÊ׈ÈáŒÎLJ®ßW÷PzÀèŸ÷ØïjBvñÿcY=Û- ¦Ê¹`³!`™ŒeåôÖl>Uö#µºúWHHé¢e±+Ê/@NU9%ÊhàÒ;¥-›=®“|[ë'ImQïêÊ‹_FXÇcÂv„UË™æó<§®ÚÊPZ„5£o~u IDAT"TÒpÞÂ;g5:oÑwneV²œjjõ³ˆWüîïÆo~æ§= E©•…ØU'è­ªud²Qnc·Un³oeÖùh*’;M7ÒÇ}ö_õ”îÇ0 Õ×?ŠÙ޹` )gŒÓ„º¾¯ãª%k>“#”:¿ÈK§?„»¾ )l·¦é€Ífƒi ”þÛyHÔË.!Œµ0¶ƒ6ŽLe¡*¨þ¡\gßÇ- p€Êû•ŸºÍª˜æKI½ 6ý î={!†ýRÅËŠÁÈ1Ã]»¦:kÛƒ „ÕôC)@3Sp˜_Û òªª^yoáÜ]=0…«8ú=ç\“µÅ¬‡t¥f-¶NATþ£b¥f`®ÍfZ'+y çÌW}åW¾<—BÈ«µ8FLÓÌÒIËe‘ƒ¬u«±†xŽ ›¯íiªñ@f:±"¿ 6ãÌ1°^9Â@!UË£EŒd8Ö:G‘Íü}œs(™ÈBòËóœ³&ó4d ­5ü3ž‰ü¿¾g‡ÎúÆUhæ­4ê6‹üª äÊ~ü6Ÿ‡ÿ‰Ê¢ÜaÃÈ},.¾ñ>õSV¾ó¤í f¿I¡ÇþyJ)Ìad VC—=ºÃÿMQW˜«ný&ÄöJc¾Ñ}:ŒW’¾cœóœ" >ýUQÉoy'Ê8ë™c‘sA¿ÿlο&ÿ%ýy„j‹í†¤VDcÔ^>'R:tü#ÌãÃÀð\.kHŸ"¼Ä¿‚+à ;×ï£W®´™*!hìÏÿöÿ£ìÍcm»Îû°ßšöÞg¸Ã›ù8S¤(É”DY²(K‘d™Ö`Iáhǃ'Hc×nà NÚI]×FŠ"FÑ:DH‚¢M›Ž`ËŠ©Á”hR¢$R´Dñq¦ÞÈ÷Þ½÷ {XSÿø¾µöÞ÷^J2ð ÷ÞsöYÃ÷ý¾ß°ù#Ù¶« Ž/Åáˆphïå}ȃ!‹0F‘MAÓ^# )îsê?¤!©,gó›¦i3•u¿ëO¢¹v]7òÅëµÎn±Ÿª;eâFˆ#§ê b· ]w‡ì¸H&rÒ~M|†Èhñ ¤÷ê~«ÿùÁµ?ø,áï ¹óN¶ñ:l*ÿšeÿ_cßÃØä»Nû¿·¿î:,~ë·ßýî,¸Z¯×hê†ð¦(=zÙv«š#wÞå€ôÇdŸ‘‡?šÌT¤¥Š‚>û21H¥€õš®FÓµp0"byJ@°OVdàZý(Û?FŠz%þvŸîà•éÉÃßçÿÚNVÚÊvîR(xѵR(¬'ÿÛŬÔé| “PlÄOçu–tÃÄì$zKiÙÙ‹éõCþmVºnGVùÃ)BêõÓZ§~¼oÆÇÑ~–B|Ä£>ÓNÌ¿´pHAi¹\Ò V1+Ve™çݳYEé0L웆ääg8@2ùžó8ˆFRì{Ïɨu]Ljª$÷¡€8xx½Übæ‚+ið‚ï+&y6— _ ú\>ðY”Ï?‡â©§P<ùÌ‹/'ÝÖ—‹ïLŒ²ÿ{áéûº›oÆâŸ€{óòí@ Ñ: c(ŸAI€nË‘·ëº& ƒ˜V´Mƒ£»÷ñüÉ@à!m’˜BH 5½<ýOЦ'é(­™¼CÕcd j½n8BUUŶ_Å } ˜_þX×ýë8¤$Ë]Nh¢›Œäƒ|ÔI§)bX‰Ûþ-6U…AQE]yþ]|6€¯œÖ _ˆr€ÀΑOçƒtL "ÿ c4{táÔM‹²¤õܶ– ¦®ëü{­5ÛÏ& ±›!x”•ÉîÅT!8çYíÙ¢öog#¦Ó)Ôßý…Ÿ¿?x-5¼s·Ò>„R\p(2[«þ›O&š†ne È«ÉH¯ 侚T0¦D½®9„Ä{©Ø˜dcäY<cDÄd:yáÓ\•¾†Ò‰üÀ&Ëç^)hMM¥£I¡&<— ÁÃÜ|3Ê·¼î]ïFóÓ?õë^{Ó͈BB­W@Ó|WÑï‡g€¿æ¿‹‡8ùv…ë®ÃúŸÞþ¶¼Ø(ËÑáYU(ËmÛ¢išì0ÓµDX)X¢œx«Õ [áßS)-Ræ]ÏSH@ '­€Ð0âEtæoŒ‚JÓh–¢Ø{G6ª•bŸ£Çlç£áéñ㊧D‡?ÀÌΓ3Vèi®VÜwyΞ&PB¡ÀsX‹·A¨#Ä$­JhÍ䮿hÿ,«õÛüÐ÷›¥(Ä(á» ówh?“Õž”¤€U9‹ /ÍÛ¶%q'?Êýä;ïÆ±}ô¼‹Ì5‰1dòUûiæÍx ¦€øÒÿ" P&À{vSQ#Í{&ŒîéÅ}“*”Àˆœ“g’ÐÃFù'Fßûäû8:€úï7†Ñ.#Ĉ4f”R’£LçIÀ¤ûÐŽÅÞ*—Yëõ àhè®k¸\° JÜN¼üŇ`ΞEõ­¿Bùä“ÐÏ?±X@~Ÿí€ø>[„¸ßµ÷ûÀ‘#Xÿæo?ý“hšî€@çlOز!sÌ©7—èÚ6[СI ñLû!þ D\ÚSÓíJn81 ìlÿIöóKxLïaàáƒÏžiA÷ØÙÍ_}ù,nR¿ «L@"^ìsàßæa²€Œª²/V£¶!AbŠ(7qeöo¡M‰ŠC]B}äW~ùþ¤ÆjšUU1‚ÉôVí ¦€6œg¾ZeÝ"¥ Ì´L¥ ªgš;" @xH©¸ q( 9yÏÁˆ2õ0CFÁùÖ$É^Ñï3e¢„ìÙuÚ( ŠìÇ– ûÈeK·aŒ·>uGßv/ü»Þ ñ·þ \¼ý6Ø7¾á$©êP׃`‰¿Î8ï•zûï6rƒž¿ùµ_Cýþ÷óO}j/вì6Kì¾mÛKkë¦ÉÉN1’(¨, (q Ê>‰(ƒ€áæ˜ áËw¨Wp=£±f£ÌHúÜ€`¯â”ý/¡°K7®û\ 1Fà{F¢FĔ֎XŠ÷Àâ L|BõÌvMßHß<ùå!`Úý{Dû+ÕªE9=†gŸ9‹ãúÿcÝ€ÊQ`£*€±…! ÎSežèæ4: Ù=‰Y¦As®¥N)6™´â9’N¼@³û=ZëQÀŒÂ‡|õ®kÈ)8îØ3qBe¤a­»1*ë¦&¼¢`[rÁ›Ü*“ML±ä4CJú`¨l$™<ÒŠ¢€¶éÈ«gSξTK›¡÷¥7 ÆaòC÷b6›QÈe³F|üq¨—^‚|î9ÈçŸGqáäÅ‹P»»mûŠ¥;¾ÇøðÐÍ/%ÂÖÚ{ߊö§~ ë׿:;'©ìlÆÞ|Ä-͈iØu{ìy¼øâ%\¾¼‡¶µP‰IÚ”…FYj=¶…ÍÍ où¡×`{{¡g–1à§´ÈÔôžœ 9gÞ{›«­5–Ëe.ÓËQkÕj¡úyRV9%•bÉ}ÖÚáÛgQîìÐ!°³¿»å¤ðÁ4éü)¤„”‚Ø'kJAƒ°±wüpË­ˆ¯y5ÖŒiLØ8#- ô˲DËFätÓs2r¼˜R£dÜ>’èÆË÷ñ†oÉxñ&íÐ(æÒ`oó„ž¼)[½ ÇOeiP×ýàœÃl6ƒ¾úßÀ´R¿€=øˆ•:¾ñ ù¦²_è "!‰»NþOhZ‡¢0™¸6Ýû¯QÅoˆ(,!±ôN˜F®&ÓˆPYÅ)¸ ¦÷ÜBÆõ¸žèjN8"–'>›ù)´:¶ Ùå9kÇúý¢£žS3>¸é'DÚWˆv@l"´Ÿx0IH_³»ØÃz½†.«ŠÃjTÓ »9Pp, ⌧’H©„&&RÈ )²„J×1ãŒDA’•T’—–_ùòøþ߯àñÇ_@ÛºQ¯Ù›?ÆÁC osóÏpúô6®»î(66*h-™)E*«é´Äñã[x绉ÜQM ¶&·#Ÿ¡wè¹ß¶-M¤Êï§”ÎÆ(ÔuÇÏò®;!´AY•ØÙÙ÷žFoÞãê•+Ø>rdÔFÀ¢I¹îµá &uìf›ô•RO#PÇ ³!Oë9ó„$ݸ!/CB mkª\„ÖTº¦^7æý¨ìŸ0€0ä,b40õ×o<0îýðú ÌYó/Qí}*+'ió7£ÛuèC/>‚šhåPoþÜÞA’€-Åîø¿DwåïÃÄor!ÖlD{°  ÃA±3²â÷ËäF|¤(cKÀèþ0Pд€Z‰rù/ÐÌ~£÷ÔÐ%eF‰dY¦zbŽR¤M¶ðTˆ#3½7µÎrž#ˆô3|ætû«Œ?Xk!|ðÁ(¥DÝ6ØÜÜÄrÒl(Ô‘NìÔ¯u]‡é¤ÂÑ£G°··—?Xrq¥wßvó ¦aòbbÓÍäÝæ}€)*’©Ö- cPU¾üåÇðGô¼øâÕÁéÜšûOí!4ü÷C€hx˜*%±¹9Á=÷ÜŠ÷¾÷ xó[îBËà¦ãÒ)åХ͓n޽=lmmÁ:ʨ·Öb6™£( Ô5ÝVs¬â¶k™¨Ì¤¢\.¬…¯P%.\<‡#G¡( ‡r,9œRñÁ¦òf`Ñu‡*iPNª Эo-aEQÂ:Ÿ{o¥š¦%và$õüÈSžzµÎ7Ski<ÕÔÛ×ÞË÷å`¨ ÈA”s«“ŸÍϯ·1£*]$fïQ¶ÿ‰?cO¡û>Ã[?—Û’@;8y7–³жYCKrJÀíjµÙ±Í/½›^k´ˆ~9n+UÅ7äÌ/0€,xâ!CKUʾi@fyŠ)yXžx ãγRPs§'Å\¥*.màtÐH0òÁ@~UUB…¦%q“.è‰2Ÿ C’Mšµ-:G Mõñô~0Q¡­ÉäRK´mÍÍ-žÝ®y¬£ðè£_Á}®m P|LQÌ“©G°6Ë:£ˆ°–6;QH4M)4:KôOþ›Ïák_¡OeÙ×€Ÿ8”6Ž+„ñˆ&Mcñì³—ðå/?óç¯`{{†S§6 tDJ,îØõGÂZâÀ—•g3Ô ¥ `mg‰£-µBW¯ …„gPQ0¾ €!ÉuYMÐuóù€ˆ¦nᤂu”J!0™Tpž"-Ñ65eÖGm žØ°ÛŒ|€ ÔMRj’ò/Âa2döM^<¤’2ò(V i»^Â#d¼åŸæQXw(šNznq½½ WÜ›e´Þ{(#¡¸ÿB`º÷ù{×@FëÑk úïÍŸ¢š¢¢ Ñâ>4ÛÿeQ@HÉTÙ²,±^¯sõ ®½Ïr/ ¢Išsük D´’#'÷?ƒüûÈÁ vþK½·c åc²Œ·sV¸ŠN¡)£0fÕ*Õç¦Ï¼ë(ƒQHŒ&¾Ò Ž’Þ#x¡¨ò«ª Ëu“¦ËÅ FÔõ:Ÿ4º¨³y:â©§žÂ?ûg¿‹×½æ5xýëïFÛ¶˜ÎghÚëºÁd2…µ"K8[Ûñ\Ÿ”^äJJ£*g4êz§Ï¾ˆÿû?<‚õºÛg¾ ¥?ƇÃaäo!¾/iMÓtxê©óøÒ—žÄSOƒs·Þr’ÇR°µJ£ó ,Ì„i#÷·@QTPŠPÞÅÞŠ¢ |×ÿ\tНØéÖ@ g¬uðÎòÜ™,ia%_üz½F×¶˜L¦ˆ ÉÄÑHÞxtˆðÙ9›½ Ó„Ñ£, R–@1O¹‚š½ôÖ’ž³sµx fÝ¿#tTjÒÿF(@hhÿÖÅßfw'c­º–ÊÛùâ7 ÃE¾ùkRî»F÷킘@Ê •¼“Gwä·sÔzÊ™ðÞãßýÛObZhœ<}}ïQQý0üæ¯À,ÿ7~ü>ÄÁŸ%åøb¼¼üèõŽZ‰¼4‰,„B잀-~”Û ˜ý,)!2¾¥2õ=mü!8\Ë1úQ`¨ç6ÕÇÅS±˜…=F¤!ö™ÎvÐÚ èD€Ñ³ÙFöXk™êÑu ¬5¸áú3øä'?‰YUbµ\`ss3ŸX[[¨×5÷Ôóͧ3¬Ûmk¡AUR ”m;Êqó´Ù–««U7¸é; ÅDÑ<ðx(žžmÚ^‘w·ïßLjxà |á ßÂ'?ùy¼ñ·âMoºï~÷ëGN±@€ÑÉ^¾ÒƒÕP¦@Á¨ºÔw“˜‰çà*ÅTq¯&¦Ó)µ‘R„Cðˆè•”Z±‘èÀã€féaЮèlÆâ‚ÇÆŒnþ¦m¡ªHc\)yv-XNš2ðz Éa=€$òí“õ¹¼Õ}~À¾:KÂ#Š~ä×§'O?ÿn¿ùÌ÷~:<‹™ŒÀõ*áçÞàü¦Ô²*o‹÷ÁÎÿD”> sUUä÷qÓM7¡išLO=¯÷ ܇MùŸc¡"‚o1ˆÈ Â1î4®H°Ou(anEª”„FaAí´–#+òaÀëÐf/•ÿ©÷Ž…H|ÞGKg}¥JaÈd•ÇëɈ% ÚºÁÞÞUeÿÈGî÷¶ƒVÓj­ ØÎbsc‹M;LšÏ(÷o±ØCÓ4(‹»‹]¬Ö+B AÓ4˜Nç1¦ûÞTRì‘ÒõºÁ­·žÊé5©O$&€TdaAåó|>Ïhq’£R ear£™U•ÉäÒYÇ"ØgÀ A<Bs%…¹:?J¦µ`„]¢áÒß9G Jc •È 2Bôá$‰íùè \‚H0©?9x’Ý8dpUGîe„ê‡{«½€“Ýo À‹ˆÁB æÛôãͤ½—SÛ´Å}ˆÇþIžu 暤[ÔÚgÎÜ€í£Ç3?%=û#Bõv¸ö9ñêúÑæ>ý¾ˆc½Ü‡;BBF•@È,I鞀˜ÿxpÅÀ>n¿9ÈðÏǬ×þÀ —¤À¦0@0e‰Œ½NP) ·=“ ³Ú†(ÅêW~ñïﺛ( ƒÝ½%P81º®Î|í$­mm‹sç/`k{×vv˜jZb½Xò8ªOÐQJQò¬Ö¨×KH&Û¤X#¥$Μ>ާŸ¹„çž»tõâp¶|ÿïÄ!¿â+ªï‡jŸÔ:¤¹FìíÕxê©óxè/ŸÂŸ~úkxü±pþÂ5Ô §ÎÖJ¢,©Uº|é&ó hCÊJ)è¬Êšõí!x"?II9 ÀeÛ@ATQçl&3Q9Hf"»Ûœ9—ÍCc€íªÓ,õ‹ib’’si“k>$º,êòÞåÏ’Æx–5çUýɼê%º<£ŸÇQÐAUħ·>B›tç¿Ã)ñGPbÅHû€à³¿‹ËEì>Iïg­îC8úÛè:›ûa€’p“üÛ{r\NÕGʦL(ûSOÅ©[ÿìê ˜ø¶Hk?ˆ¬Á‚U±1ÂÚ†ÁdOmÍ~k+6pØÙÙÁz½Æ|¾)¶·Â{‡årÅb…¢(°½}·Ýö*Eår‰Åb#GŽ`kk‹ÅªªBÛ5}í€ÍÍ9GA9L§s4-;´ˆˆ²Ð€xÏ{^ƒ§ÏžÃ‹/^yE‰ÍHxÈþÊ?zÊGUûùzBØÎáü¹k¸pþ¾øÅ'aŒÂ‘£3Üpæ8n¾åÎ\×_¯¿û4ßämÛbZMòˆ0ÝDÄÍ·$ÂP ‚bmÆŒTc#ø/(þ‰/%d¸G̦5T%·¡¢˜`Z$ÿF²a·Ö¿AÄ T¥ f.©”BS~eûÇÌ6T=)(î/•qñùÙNW¿>CÊ?ßq§xt&·š³4œ¸õñÃK3h/|ÆÚ–MBIú9ˆJ”EnC"n»íVÔu süоüë¨â×H?oñáÿGæÄŃ€C§S©u‰&ØÖŸE|/B„2=È'ÙJ8 H˜Lo¡æëVŽÌy¬w(µâѼB7ÒØ× lì5I®ÿÞßûÕû‹²b•üÄáN!žT¾&ØØØ@Sw,Â8zôŠ¢„äKäI ¼,‚GÛÑØ!xRCµ]Ë£-B³½s8sýQÜ|Ë), ._Þã>î»éÇ㾡zøà_¹ZxeiÈÁ¿'»21€÷>`µjqþÜ5|ë[ßÁ#œÅƒ~ |öI\z¹w·Ü|bççÐ65‚w¬v#[«Î:j±B`ÐÔ¶m–¨$—£ˆ×.ù—ȬKêÍ%Ÿði†L?+Däã‘­ª*seA^ñÉ¨ÂæôÚ$mØ!H÷ä”ÉÛÑX‰Ò•Ðýd¸yà±)ž¡KûŠöÏy—t€oò,_ŠW8²¥aQFЯFwâψ¾÷Æhò5`cOqΟsŽœšþ’©…ÓJ³M¹FWÜÙ< ¯@!ì0pxJ¥Üša; 0ðA‘D,h"°ñK#/€DƒNc»d}6ù ÉA´—‡~€1òAIkcJ“½²·a¾<‡¦9âóŸÿl,Ë’Ã**HsV]×YÌÀÄr¹„Ñeï8d;¯ÁdÛ5V«ÚºÁ©Ó§qñÒE?qˉp$åë1×`wwÓé”4ãJ£ë(Bü±Ç_‹/^ÆÎÎmksò.\:ìí5¸xq/_ÙC½îø|eÂÐÁa¨—>x¢oq ¨8ÀþB²€–8~| ¯~õõ¸ûîð¾÷¾>÷ê4Ó•X.iæ?Ÿor$–Ãl2圄€ÖYL&Ó×=é ‚£›¬/U¬Ö:ëP¯v1™Î‰ àø€€@ÇŒÆzu U5ë-·9È’fÍ”·d¨‰2¤ìÖW>£ö¿%ÆYXιà|Á¤WG6ñh2…7%kØý²@H4ò×ÿ«¼Ú¶Åru³éµ( }=Éωg  “ÛýQr˜)öÖ“™~[;ob øÕÁqà€#лí lÁ¾—‰”ˆrŽv¶þ„>ŠÈ™‡Ζè:J>®J“ fÃÍ?œç'ª|bøYPµÁCøÕt’?³º®¡{=H )Cíñ凾£ä,s)QN¦™C¯•€’YpZ”Øk(MDßû¼Y›zW®\Âl6ƒQ ³Ùœ„:Ö!fb µ‰{¾Z­Ð4-Μ9ƒ:K§TYš êÆ÷»Ö¡ÐÈàVY–xâ¯^ÂåË{ØÛ«±X4°Öåßu×®­ñôÓqéÒ¸¢À+Îo{`p?=:Aaýß%–Z̧s:`67'¸ë®ñ¶·ÝŸü‰· °©gÿ±åwBâ-iÊIª,YtU nf*u‹r‚ÝÝ=kc°^¯™BôåÀ‘6ÎâœÇBY8Òß:ks‚Qô!·.eY¢®Wö[Ø^ýz>’‰ìhÑ È9™| §?4# /Ö#̓(I À¶|7ºíß!aMA=þz½Äææv¦t§±_Ú‰ ™ð‹4;Oˆº÷”B윃)æó9¼uˆ—ÿ9ÊöS|ª·€¯ófßOBêotÍ7¯;"æ±eè+¢(ç¶rêó#í ²IˆÖ¦¨ò–Z»D#‡­ž¨%™§H¡aé?$¤ÐKHß;';VI²×¢øÂ¥Ñ(«‚™z¤(Š BDHá±^¯éÁwM—ÌAšºf3 šw’dXb2™¢ªJì^½†²¬àP¯^˜’OàÞBkc ,KhU°|Uå[pµZ˜Ífp¶}¸BêÞ2I(˜"ù¸Ñ8ë_ÿë?Ã<‹w³BjÔ:ì« ¿K`aŒ}‚zjiØ×N$“ÄÖÖ·ß~n»ín¹å$n¸á(n»íÚ¦¿mµ¦•ôÕ®È)Xk¶ë0©*¬W ®î\Ãææ&æó9–ËåÈõ@Þ«ÅÝu IDATG²¥E7 ®L=¾”’{jEfS*¥P×5f3š•ßy;·‹,åí$¢Übëô5±æSDÆÁÿË BVÄ"ÔïÇ5ñ«9šÞ{›õ‰%—¦N1¤m§²zxpg‰©°9ß Ã›gÿ6%û Æfd‚:Ô$Œ. Il¿:ˆØê=3+€Ñ#–ŠC•_öÞ”b4zsæq/¯ýIYA(ºmðPÊ 4"û¦ç“.#,JSÁg›½í\)Š@¦ÎZˆ4ëæÓŒ×u ï"ªI…šý+«ŠBC)ƒ1&•Ò†‘É„~‡v°ÊòD!€¦iB cJL&ìí.±µ½©œíP”%¶··Q×5–Ë%fÓ !Fh^èI*œ° Áâžô¡§[ð#ù1üà›oÇC=‰G~/½t…#»ö—ûñÀˆP`¿»‘e’qdÂ&bŒÆ•Î\½ºÄ•+OáᇿÍú„ §NoáÌõÇqúôNžÜĉ[ø×†T®¥ÊÀÙÐEô(švª4œ&ë˜<Ù£§SMg#¿ø, TäcЍî-ßS{nÒ2û‚È”àQ #ñb‡8` 1ÙdÄI꾊‰£ÀZ߇vöÀz…8Þ÷`g²SJ‘VAôÉ»ˆ+R"W¥–n[\#Àœ®kÑvíö'°^ILýìscw¨÷@¯ü«Ùʬ`Ir@  r¨j¢„t¹6åóa{X¸ŽµvpÑˆÑØ/ôxÊlPZô¶ø,"KžÉ…¸·ôçQbìíÍsüЗ¾ÓbPJÁwe5ÅÕk×pìø(Öù;(YòÃ>àÂ…ó¨ªÛÛÇÐu-&Ó)ºÎc6›£ë8ס, X.i¬µ"b±XP?Y׸|ùrö§s–²é¦Ói~ ÆÐâ½Ë‹‘í²?ù# †·B„ìäœGQ˜\O&“\Òþé§Å×¾ö<žøÆK¸xq‡oý0®rÓº§ û'ûÕýýf‰£Ã„@!ãÇ7ñš×Þˆ»à Þó#w±hªBQPƒÃÞÞ”R˜ÍÈÃß:Ê•K!“éY¥›%‘JÒf²Ë†®±KæuÔuM;”ljÆmx]·8¹ú ½_¿Ìô݃ã¼þD8Œ{‘Êÿ€tóËøv„¿×º 0ˆ¡ý{Ó4yþ"M2ÒúM«,¦IÖvÃZrJAÛuˆ! díK¼ø Ìñ<‚]@ ŒÀÀöÿ$¢˜“‡¢$f^ò /!òRcîC<þ;(ʱ4wXêù ½“po÷M ?1 ;DAQãäÅQhÐ>¸q÷€£@Q>4bŒPýè¯Ü?”mº@†“I•… EQ"fÍÖÖ.]z'Nœ hû)ãÏZXÛÑ-Ï¥¾R Mg¡•Â|¾Á¡ -67·qäÈlmmao±;²AjÛv”<ÔêÁf"@eè,446 *™,±„¸ù¦ãxç;ïÆOýÔ[qâÄæó êºC½îø¶9H͇KCÓ%pq‹ï:i*cª³s{{5žyú<~äi|ö³ßÂÓO_ÁÕk;¨›7ÜpeQ`¹· g;L¦3ÌfúܬÙ?'ðqh=´vO‡B^`¼áJ,J˜4 "æã”û67ˆÞ:ø–b<ø|z‘Kc@ Ñï‚;ò»û,¢9'_Ça¦“É”£Äu¾9Ó×TU…ÎupÞAi¢$ÇŽd …)rQðå”4òëõ jë> y&ž¤æ,Ä~Ât1:D¡yê"z…(ÆÜV?yêw÷ ‡¥•áŒHµc·}rð~ãW ÍœH‘éJ3„ø#”!(GUD¶é1ãI9šì/~0J¬×k\{ù N]ÁÓ©T”’鍯”Pœê ~`K´­ÅÖÖÖu‹ ÔuËÂ!E4àz mÊÜ›yï°^¯òc±X`2™`2™Ak‹Îacc#W릦° v·M78üCå²0ÙZÚæ²w' Ùôb8gM2à¤\Œ1âSŸz>ú,ž|ò<^~y®s£<¶qpþÛƒ ãaÀaTeq@œBÀööwÜq=^óÚpóM'qÝéšõ%œ8qÇNžE‡Ü/§?ŽCÖà0ÌuXnjÖÒ“9ˆÌ-ÕÞÞªª€PŠöÓ˜.ÿ{ ¶ì³øíÃáÞydß%U‰ÿNLnø,—KDYãC€2äa{S¨\ÐÙ.¿þ²(HÇ?%g$™ ”¤jh6›Á¹€–Ñ÷¡W„êâ?@¢‡ÄjðfÆZ…TD”ð±$½ƒy/êêocväµnô¤ F„-ܲԞûüäË‘*¢à#›»HÆ?€e~QÔš “§ó”G8z@ýò/ýòý«å ’Ý`;Ω,˜N§ð>%¸¬±ßÙÙAUQI•Ø}dðY`{{«õ’sâS ÚæóML§S¬× 677 ´‚È‘åDŸ¤ÞU+Ýç "Ê;Ÿ?pZè#¤$D5!£]G¤œD}íº·Ürïz×àoþÍwàôu[¸ñ†£ØØ˜pÖ•ï6ˆ#MØZ*F#¦W2;,‰¶m-Ο¿†Ç{_üâ“xðÁoãÛgwpábƒе>qbk†2Ô’yèC¥ÙÐ Añ!álÈâ ÈBº¬hêxE÷ç„ {èˆô0ãLú(f²€—gPŸü|ñD8o¡M‘MZ­kÙþ¢ä”ÖP<Œ×JÁY gÉÈÔó¦Ñ¦€áêqh­•]¥)vMi⢠mž*¤„çFÿ(Dû ®1[Ð*SîtÎw:<ÄôÖˆ{FÉ'kû!&3¼íSe2¬bLA7:”Œ1ˆLåÖJŽ2ü 7Æ€Ö:ø8ò<ò—q¹Xæ“)VÖB zA«åN<Æé©…¬UPØcÛZÌçsX—Æ´Qëõ𩦂Ì:e: i¬˜njrïÑùDç­ROB`Ôß eš…Þw€èg»“É„­’mäȹ¸$=úÀ‚ ‘GdFf0Æ…–Ë%¡Þe e4>ÿ¹ÇqþüU\8¿ƒ^xçÎ]Õ+Ëž‘&°ÏÍå°Iƒ8D‹€} ZÈÑ¢ÓÏK•ÅlVáÆᦛNbsSãè±®;}wÞyæóÉ6jØû']@ˆUUaoozLþÌ RnÝüêaÌv~ 1Úñí8x àïCÈ9œz-šcÿŠG“:6E¹ÁfǺyrˆvÖe¦cšL¤÷‘²ô’1]J]ÛfEæii3‰S)ƒ½½½¾r`[óùµ¿ éžC<¤ÚY‚¥OOL‰ËºòCðG?‘«é¶m¡¤é+²e[š(KçÏcëèÑìÌå½ÏïO‹> D%­D¯KƒˆdŽ;¬òçÎ1•˜eÞâË_~8¶L<¨[Òý—e‰¦i°½}Íš<ã‹¢@ÝY( ̦._¾ˆ­­í£tõr…Èi0ä¶kÙt“ú²4Æ#1ŠFðdyU4)˜ÍfX,4{N&•‚ˆË²„) ØÎCIg}vJíº³9ªb¹j.ÏÇ˲ÂdB¡˜`˜~™NàkWP–¦Ì]B iš\®%<"}pëõß9·‹gŸ¹„'þê;xâ/àâÅÝl©6–#Äïì§•ÆÑA‘ø ûÍ4÷“pÆu†–¥Æ™3Çpï½wâ­÷¾wýÀõÐB¢cz"JL§SXk³}Øz¹@ÿœž™€³ç1ßùùAyì9ÐöÑdeïÁoÍ[±œý>c*‘ûtŸ‰P¦Ô¬z Þb±X , Œ)³sôM×ušÖâÒÅïà®»^ šºáMor¬¼žR‘”Fp‘¦VJÀ Þ[¸ÎÀ9çŽ\û1~þ-I—±x†@L! ¢ÜÍŒ¼ýÓš¦gõ@«ÁSO~ »;{xý=oÊãöT , L§ó<¡QJ ^SÛ F¢ôŒ’©Èºm(fCpÄW¾üH´¶ãÀ@zĬ0›Íˆ'Îfœ‘\éotsTÕ!’SpUU\–$ô=¹þJE-E¢!jm`tÁ}QU›¶Í´Mò© (KM¨4(ÆX­ÖØØØÈ§ö|>ÏL©ï'=€ÉdÆ'»Ù='ÂÌr±G ÒȼÉZöÞ‘Xd]ÿÖÖÖ ­øÜçÅ7¾ñ"¾ùÍsxö¹ËhêÛw³ý<ŒWž€ƒ Gñ]Ù‹qp+SŸ/qæ†#øð‡ß‚ŸùÙ·öD¤@¥o×1FøJitîW»Î1y¦Ê£ÕêÜÛ¨ˆ+ ºï~ ‰“l×}mû?s.à^ Ö½Gº ï.ï²*2Æë¾CŒ”0d4ý ËÉÖiá¦ò)AŠNÛ‘fÞyjY!&“ ‚óH#;áŸ`âÿœº–œ‹ö[‹ŒÒ“É«P£–oƒ8ý/FY•éu ó~è³Ï$°‘/?ÂRnö%ÿȼîÓ÷N£à¡ßc„úØÇ>vší{~ô!—„ä³ñ¯K„Q¯WhÛ:Me9aäX¢ëÚï5ìk2µk˜òY8MN8àœ”n)éÇsïCú’|¶mƒY5B@[¯±·XÀ¤ÛLHö—°¶ëO:þ3;ÀTŽ@Šf•³‰a–ìÎ=L x”œ›˜ÌN$n¾ù:¼éÍ·ãgæ‡qý [˜Ï+XÐ6–[šï‚ï ö±O€>Ä#!¥ï³ØkðØ×ŸÇ Ï¿Œo8£É©– –Îxë²ùjЄ’Ù;@½ø_Ù.Þ!î ²¢ÍÏÕ‹­>ŒZ½™,3¼Ë™yR2jž8ðJ†,câr8.ËrdÜj­eWiͦ‚I R ¬€Àjµ$¿F© tJ—ŠX¯kZkŒ ƒ8Âäpë§ Ã l Ž‘+ð(•(ù ˆH8Z| ¾}®|›q˜QtÞ°ó,óNi¾ÉªžˆCŠéÙ>{ãTR‡†p ‚|¿ºP}ìc½?ùà‘/¹ÉVU9ÙÕBQÛv«W¯pÄt‘㼋$ F'1ú ¿4Ó ‰ýÄ„ ÐFcRqz½sÁUDˆž‘K-‚sPš~"°{í6·7Q–bûúQZ0!°(IvÉ¡´Uv³3ßD²7ÍäÞxh’a ŒiV­µÆd2ÉÂzí7œ9†{î¹xÿpÛí§pç§°µ5ƒ1Š-»ã€œsPõ8lö‡¬ +ˆá„a8‚‘‘D¯â÷>à¹ç.áᇿ k=&“ ››e›]ðÿ»>õŽýìmG±bÆh{Êå2ޤʦˆ.Aì¾N¿ ÝÉÿ—Ö¯áVlÀÏ×&¯=ç;XÛaZMòM\V%êõz_Þ_ÌD¥œ/É@›)Ь«ï³øk}JçQ<Ôœ²ÃŸID>Ü»ÎBiç<ý„öi¼HÃ>aä 4‹4Lxuõwh-é‚Ým$b²ð”QªFŒæ×F7wâ:hÝö™$Ì2 ¼è¶C#RW` ¼È“é—øú׿‰?Ð4Ïû5,ƒjô Z\½ú2¤”8qò$vwv°µ½ ïB¶¾ŠI¢é=¡ª@V­e$Ó{¶Ù&:ÍŠ’’SÀ½mQù5„@‰2Á{Hâ;MóÈuí°µuÖùŒøCD>8tÏbcz¬’_§Å’×u¢¨0NGrØÔ %¶÷½[rŒ‘{³)666°Xì2óþ›†\7·ñøãÏàܹ«¸zu‰—_^⥗®à¥—®âêÕÇEÇÓ€ƒàâXs°;ð dâ@ˆÈA-ÊBJ‰ù¼Âm·ÆÝw߀;î8…·¾õ5|ðõÁ«uÝ”$­mÛbãò»™ÜRn^_ …(J6ÅèÌ;Nþšz ÇPe1ɺtZäCY2ï?¹%…@¥ùjµ`V¤…ÒEn1û1°†t‹VUÉýõ°ÜM”lÂv Ö¤$&iðè:VJlnn¢®kØ®Ãt6ƒ¸ð_¡ð_BŒŽS‡üÈaø@ÇQe]qüñû…ÉS\†«eŽªËÄ<¦óÃvóz!ƒÙ   ÊŽ¼þ@S’¨üc÷'Û˜mÛäžZ |ó/_¸ˆ¢,1›ÍÍŒtbŸdÃ!q¢ëÚL|é “¼Qó,’"Éœ÷l¾I™l½0ÆñMÙÛJç±¹¹‰½Å.–Ë%ªÉÎ:”Óêõ:o𤼳ÖÂèC¶#ýå¨Å¹ÉÙý¶MÃBÄ|NØHÛÖŒžkÌfs\¼x‘²ø¼Ëú U”°¼½} î¼óFÜxãÞò–Ûñ¡ý>øÁ7áôémÌfÚÖ¡®-¿çƒ©ƒqȲð †Æ&b¨†—FÜ-^¼x =ö<zè,¾ò•³!àæ›áÒ¥K”5%M†4J$¢J å_„rÏМž«H ˆ BÒ{ïŠ÷§~W¯\Æ… ßÁöÖ‘ÜB¥PÊa vÈ"Ÿ4¿N­]Ê¢$€¹È5iŒf­ƒÒ4ŽnKº h¦ò82iF)Í’çQ E·ÔÖõ#ï)TSkµ|Lx*\ 2Q(Q›ã>³ª¼ Txaóc”÷È`\&UyˆქðPסël¾@zTàáã¾CGAhÊÔ†]ª¾*=µ&"!PýèGî—BBiÊhïÚ“ŠŒ= °0EhŠÒ`woEQÁŠ¢ˆJ<¼·PZ1èçGf¼yh¾{·•5÷y¾ÏïjRUÌJ >£Kª‚Çùóçé&6ZT“»éx‘¢ÆÓ¡ãs^]Á¤ ²ÀV,¶1ù´Æ÷ 7³ÝLu½Ât:…)Žo¦Å(Q–ªjJ€?Ï¢D€Ì_››[˜N'¼È®¿~ãwá}ï{=^uÇõØÞšÀ¹€ºîFºnŒüöå!}èØØ^dÇZüsï.^ÜÅW¾ò ¾ùÍs8vl››ÓÙŒ7‚1Œ›μ2^„´O“BͯÇî±ÿ jó½ì€Û!z‡#GOA n«|Dˆ½0Çy Á¶æv”°›ÖLY˜lž9ä0hƇ€Ä™³Ͼ‡á·Þ[ø@£`?„èÇê»ô:’Ш¬&pÕC¬?wp…wÀIå($ÂÖÇù0Ó{³aI œk-Ö«5´QPœê“*Ðä 5Œ~#°ÒpU+(fûïô™¥ ‚¬®<÷̹ÔN}ºÌy’u½"ù»ð,g‡œ¾ÛGÊUU…õzÍò÷ (Evñ“—:\äÉÀ €wck°Íæ& ñÖ¯b½^fÎJzýC²Ž)T_“ÀIæõGïy2ø™$9öjÓ§ì¤ÓR°ëQ>¨|`{2³IÓq6üðl®’/ÿÆ|[”¾ê=¶ƒÑ»;{hÚEI¨²’eUð|7`½^¢nÖØÜ<’8‘£Ë“:rµZAƒS'7qóMÇpÇmGqÏ›nÂ=÷Ü‚»ï¾¯}í8sæ(f³ ‹E kÓvI¤h|e‚RzuÝâ©§ÎãÁ¿‰Ç{ mÛâ®»ndÃR30ª$?BÍ;Q¦ CV " O€.ø¹ÇÀ9<vy‚“Òmˆ¾ísbU:Ü”f+³(h›ƒIL”ð–}öf3&Ôc·]ëÚÎÒ2ÒT‹¬Ë‡Âx™úríóPþÄ(…‚”$<Rb‚Èb'wúÿ„OFf½à™ŠÜ¶-ÜÆ­ªÉuÛ 8?²mO`­ó¥)4wy pª$ëO¸”â Ÿÿl¬ë¶æ”­ ¤B]SÉ3Ÿo m›ü!t]‡ •xEQ@€@¡¢(  .ô.-ž-‹"}ú4®ñr°xʲHr}^§^IÚ£ƒÑ{tm‹(/<êõ´ê+€¡à%ç´CÁÜ+*i $ùTEë݈=ht]oia7Í³Ü ìííBkíÍ#ˆ°žJPë=D ÇôQC@“mI¦Kƒà-vww°±yd”h3¼%¬uÐ1ä¤dDn=¤. 4%u]‡G=‹ÿø¿Œo|ãEž,`¤|%3˃#H¹W 1ë«^uïÿ›pß}?ËôélËzBé\ÖE‘<]ÓfÜe(wMè;|L&ǧd—Õ‡ašQ_ëÙ±8ƒd–<Ó&MVatS2—[@¢al)iDl ê³³¥6dŠ#%¤.]8‡ëÏÜ’7j=šçâ‹rÿ´šÀºËåeU1Æå<ñ®kó¢´M‹j2!ž?/Bºõ÷‚·tSvÀ“ÕjÉI%f(Mñ(³ÄÒì22zÙGCiE7C ¿ƒ€ýLÆ” Ö˜"—‘.•K\NII’Mr”•PZB¥³@'¿Râ*xõjEï'p¥ ©mœ·'L'S`¹ZÁÔÇ­±¹IÞó ¶üîšeY²'P%Š¢„Rä}4íé”ÏÑfm¥$´’|RöŸâY/mo<‰|àͰ¶Ã¹sWQ×Ý»kñŠ–¼x…x¶~zpùò}ôi<üðY¬×5îzÍÍTÕeŸ~Õ£×ÑséÛŽˆÃàÊÄ3IRßôgb@Ù¦£/{)øÔŽ"܇Ц›uø3„ qÉiÕIk­ƒ4†fñ Èi¥0ŸÍˆ—â,„Ž=¿O ¦”‚9ò´Ó_„ 3@N1G4wÂM?„½Ùï#N$ƒÜ]ס0åÀ²Æ’ô4 ©RMû¦( úx›‚]øeKß' "¸Àë,/÷yÍK)È.LöÁ³êáçï?þ< €íím8F‰¤ µ¬*B«'³)|g)âIo\ÛPâª2:Ë2•RØÝÝ%µßlF‚†ÎfPPð Ú¶-,³äÒk´|„c÷V!©×¯ÊIѤrª`O`+®$Z!<ÇÁgÒMd]ÁZ€Ä%—YY•n "$õVM]×q¨Àt2ÅÞîn%Sù™4Ú>FÔu¶iI—>~:ïáºÅ4&d×1XCvU2oþá˜Ë{‡¶i1Îà‚Çbo ¥ ”Ô(xÒÙËå2·V÷Üs;n¹å8û5.жvö´âÃHH‡‡d¤ë}À•+K|ýëÏã3öU\¸pó©ÂñGrÕÔ4 ‹=&}¹œÐ3¤Û¦™>¡Ý6NSåÖ›xF<ùä·ñØ×¿‚[_uG‰³Ù%¯øt°¥ÛxXñ‡2)Òìœ!¤@³&\Èh„­¡¤Äjµ‚T¦0ÜN36}6+6»L&@ù:ÔêmðÓŸ@˜¾¨ÞÈd8ºÄBôlƒGF  XL˜ˆ” RÂX‘k‹4oм×-}D IDATžP· b @^r4ê?Gb|*^ïÔÒxï¡~æ'?|Û¶¸á¦s(ZúA´éE’ E«ÑZ )$ªÉ„ #‚ ÔYï´"p0ið1( ¶òR”T˜‚S_Tf!JIDßµ¦©r™ç:¶®f0,\H©àO ¢@äÊÁ¶¹³€gÃQÀúàÒ3TÌåO{iA¦øä$œH7”T³ù Õ¤"ÃNó•’=Vk˜¢ÀÑ#Ga»ËÅ…)8($ä¼…Ü#“ÉKé4WJ³É§`ÌçG)ŹiÎ*ÔÚ ¢Ï–K›ðÔ©m¼ùÍ·áÎ;OâØ±9÷‚¬õö 8°Ù_i:°?”%ƈå²Á“OžÇÃ?ž¿%#®»þÝü]C•Næ•ø-u„±ÍVm1ÿ[RŒJ”eßýÝßÁ¯zn{ÕÆYg šy“¤œbÔ”æX3A¹ tÜùžΦ2Þ(ŽÏVJÃwuÓ`2©² ¹Ö ÎS•’˜®ãJªÊa(™ÑP,8mÖ~¬<$¦S07 Òøq`×FÓ­Už¤¥¯Ë9Îò˜åñL‡¸ÂšX´ ,ªŸüðï/ŠÛGÁ9—çíê”Ìw'þ}ŒÓÙœ3VÒˆA ç‰RÙÙm×a>›R²ó¬øœíòé–ü„ÊE ¦^C›ÔguŠø×”š+©Lç“‘œRÉ D(™7| tËRÿ£Y")eº;žK¡òÏMíNzè{{{ù„OÀh:m‡vM9èCRVÝÕ«W±¹± ïz}÷K/½„íímh] ijXëPU“lY–nºÍÍMvAjò͘°—¤»hÛŽ/|°žÎwùðL`D'NÁë^{~ò'îÅí¯:o<kvw×9´8|Dxð`ˆƒÍÛ³ëºÅÙ³ñàƒOâ‰o<Â(Üùê+#lê¥^@ˆ·Ë¡±C¶}]ÄC_úþäO>…·¿í^lmÍkA©t€Éܾ¤J..©]5E¦mxm„Zk9ÁšX”Z÷({gÛ7Á¡©èPI‡„³~äëŸy©Dæ?¤¿K<‡äkÙJ‰Y!8-Q1¨Fº) X.L:™ƒ¼wDGȉRRJ¨|ãî¿ãÎ;1ϰ»ØƒÑ&ŸJRÒ’¤±$¬áÀ”_Ã=ŠÖE9Ád:˜Í¥ŒA9å(HÁ‚ˆ§Ye¤Ó5¼Çîî.U"œˆkt1*™Ò¡‘ E‘ð*u—“$f‘‚>8ë[xÙÀ”ž¶¥€H¥R˜‚Ïzâ¤j&ÝFI¯^OÛ¶ä»ß¬` }ŸB+¬êœ³8}ú4Ù=çʲ`0ÆfAÑ6{þz"T¥ÍO·ŠÙþÊ¡©[L§SVN:DD,{(Ë*;ß,—ËÌš+JƒÎZœ9so|ã«ð¾÷݃£G'¸reõÊñaÙwû\‡S…TQ8çðï\Á—¾ô$¾úè3@Œ¸ñÆc(XPA|ª¨8û@QœUŠCKÏ¡ª*.å ^ÿ†{pòäqÜóæ·æÄÛ0“˜r©K dª„b$@ÓÔ´ H>+$º¶Aa D!PM&X,–äÝŸkFÒ“3Oâç' Î9¶ÌëF‘dÌ•Èí´Ö«å– >Ô¯F 0 e ù0tÎRÛÃѰ=HÖôDw9’Þs$M½Ò³eáѯýú?¼_M¾ÿ²DU(ìíî¢**(SB:5£ ^)x —$“ ´[³Ëª”Ôƒ;Þ$ÁRNˆ]»‚w œhšº0šJþ¶©!cĤ(puwÕdÊ¥œB9™Â³G* @*2™A&‰%%BŒÆžË®Š©Å«õ‚Ì%Bã" ¸š¡ò¨, \0X­Èèc6›Á{šRxO`e×vðü “OÑ‚%šu›G©Î[´¶…Rš½ì<Úv‰ÂPEe´е-Ö+òQ ±T™KÌ®k3"®µ†dÖ¢÷žÚ)c8®J°©gƒ²œÀG²( tªèst –•eÅdê‰_÷º[ñ¼ ]×âÂ…Ôu÷ †§©Çá¬9Ñô4òˆ‹wððÃOá/ÿò,Ο{»; h°}d+Û^!Vìâ“«q̲”3(«^uÇ]²E ‘&K>P‚³w–EEØRg¡¤B¡ ,÷ãd¿²|j ]eÓÔþ)%Ñq¦^ÚpIE¨‰Ò’8-z‡rRA Å•g@šF°éæMS Ë8µ0>:j_¼£6çþIb2*%ŒVp®ƒ·–Þ#ǽW¬æURçêŒ2> l(”θ»V êç~îgïŸNç™K]×Ëìºëc„Ìe&Ve¾‡%\²Ù* %ÓÂŒðÌÌkš­sØÞ<ŠÙl!%:ÛÑÏq¶%O‚ b%XÂRjŠRš1‡Àkš„Ø{úi­‰Ä·Là“Ñ:‹¦mP•SšSDZËN"Û¤¼š—‚Ñl“ËЄH¨e³=¡¶M‹¢* ™=é]ä1W2Ú´¸pái-˜›>ŸÍP–%Ë®ûÑèp–Êm£ fÐu*©g=†¦Œx- "˜R x¥%o;2‰HÏ·m[ÜsÏí¸ë®Ó˜ÍJ,Í@px+0l*Çúï#^~yo|ã%<üðÓøÊWžÅÙ§Îc½ªqóͧ³)jçZ8ïQU3N(ZB¢¨ ÚèP#G£DrJk22‰¨ç˜ÄœZ˜ÓŸžiš‰ÏØ6}2™ ÄÀ4[bê‘¶A×ÑF+‹ ¯F}Q/YÜF#CÚ®‰âMÞ‘.‰l»>”ë†ÈÍ¢H‡8°ôù×j½†bú¼dÑW²ìóÌ+ˆædb²Ct®˜äá/F! ñ ØÛ¹Œà©¯uüP"÷–Zõi3)••ò˜-œË²‚a&›‹ÔŸûHˆ»ð­íXºÛ[ ): UTÙƒÎÃÜ‚Tk%`yö­T‘ ÐA_€µTއèF.>mÛb>ѸÉCgYr_AvüI(2ft|Ò{'‚”Ïž‰oNNjcŽ9ïcžï®×kL¦SÂY´mƒ¢(!“{’RmšZ¤D¥a‰\–%“`‚Îcgg1z\wÝud€a- $zJâ$?Å„l+¥píÚŸûÜ7ð…/<‰¿ú«Ñ4öPןW²0;®»qØ'+œ<¹×½î&Ü}÷-xÓÞ†S§·ƒÈíVUUÌb“pI½©ô=Xx͆@£T‰oâ_hÞ{N]"¢UÊ LÏ>D‘y)ÞÛ‘j/ÜD6S£6Q+•OƲB€¥)ÐÚJšÑ!–Z<ëÚì‰\ÓXת\:ئ¥µê=ªŠ]†ÌvÖR¾O\†®VQ 1Æ&´s{{;8vìÖ«ë)ÜÖm“©†Éÿ¼0UæÆ·] Dê¯ÊÒ@3àP×+2&”Ô3IP|ѺnÉÌ€ñ¶m°Z­F‹®šL ¥ÂbQgÆWºaW«q˜ë†?üÆÐÆï¬cD;fô>%¡$À)U* Ù‡èG"´¨=¼§’µ—NŽ…1Fø€<£—‚Üj‡éºZ4ëÕ¤%ôz°»»Ï^÷µØ*JÔõš^oæfÙæÒsHG®ª ©ÄxSh­±X,ò <•2Lª1(‹÷ÔL‰VÞYq)ET]–k§ž5=3c>øÁÂûÞ÷&<ðÀ×ðÀßÄO¼ÄíÁP‚,Ý쯔±8{%ýܹk8wn<ðf³7Þx7Ýt7Ýt 7Ýto½÷uè:Çs~¿²Gšÿ¡l6U °5¨ˆ§t½ÓÜ\”æ¯SL[qKܺˆŽh˜Ø#L3RâA ¶H9¢³ åÌÁæ÷çá¡DÜT½ýomÌïþïÿÛׇ# 4Rޤxò#—E4iÖÍ^*í·¦ ^JŠ$ŠÑÎaušÎtRCª4eOaiŠ}HEŒ[&º•ÊVB¢³ gèG£À¤D$T¦¦,mrch F¥Oë-Cv»W‰ÈÊfŸ''ÃÀmmvúôµ!ª‡‘E/[ò¥ÒÞY.ë3bX0ެëŠ'Ož^€¤šÒü¡°ò&2œÔ±„:倔I!8‚FÆv É¯qš@ž¹RÒEÏY8CÞZɺ©Y¤%BëÓŸy_ûÚWñÆ×È9ãåËó…ºð£V‡{—áGëð¡0ª¤"Þ{ïßÿþ»øó?ÿüÉŸ|ÿúÿ?|ÿû?Áº¬xë­§˜¶ „ÁûngPjæ‰w…5¨$öñÎ7½Èº¦ õM9J-Ö¥¥M‘@mÓìËë·ÅȳA©=¶Í¬Û­99%ËŠð¦Vˆ!ÀhMó(­RÏðûÎ×Ô œÊM•…d$œü´;\¥Ê‘ƒ§ë:(C‰¦ÖZhÃÎ×ûGXÇëö@Þß½Äñxl%ն㤇JR}è6ZÓŠš2¼ï¹t|I6YG¬@e,sÒ,a¥jÄù|¦‡Wp®›èèUWfc»PÓ Cmš®,I{93^ÖvµV8¿íâ+H9(¸ðÔJA›êÎó|qÇQê—X—‰±æGô½gaµB⥺)œÏ ›føç“ÐM±ì:k 3nO˜Àä`­Æº’E›Þ£ÔJºãñˆó<¡0VJ¶tr{†ÑqÜ÷>BLf'Ô—Ö–¼,4Pœ×¥½ ÿáOÿßüæð§ú}<~ÚY¾?œ›øjœÖ‡sëÏĤíóéshðôéŸþô3üüg^ÃÇ?þo¼ñ_ùÕÏî’•è}¸ó_Hzß‘~zW=h{ù +ž'Ôf&“•¬Ëú"´cŸ½g­…‡2\u” @SDP7*uå6cY¦v 4od­/ò–5CY ÍúqïXz-ëRþüHÕPJÁõõ5ŠÒ.lÈÖ³ûÈ{çÏŸãx<Â:‡°®„hJ¹i œv¸ýà¬#ù¯zÄÀ`}EAcRD.ŠrëŠÂÊ'V ”†Ò÷=”2¸}¸‡c•˜Ü¾²úÙ—JRÞ$Æ8ûmCÄ5ºMI'»`éƒ@hÛZ‚=“œ}¥©·d‡N_f!„öû[’Üå¢Ä•š*˜Šœ ¼ãxh«}j¯¼†û)9Œ÷»mµcôiMίœ :w™?×y"é04³m0A l]g䌦’¬•d¤€%#ËW~õsøßú<~ôÃ÷ñoþÍ_àßø/xç[YºÛ¼ Ý<?+¶]òÕîÏ*>€Þ}÷ï¾{‡o~ó,²xóÍGøÒ/ ¿þë¿€ôß~©‰säV6»ðM­më÷¡@AZñÃ^ ªYRåVOÁ:šAä˜Yg .­Ÿ¶5 `7àc·¯³bš/2eÀ-íÐ!)Hxùyœ3H•rÂà:‡óyFß{âq͇‰\šR1dT6Ú¥Vyšõ¯~ÿëó¼4 ÓýÝ=ÌN¥–sj¬½œ ?z„”"ÆÃ@emm$¥+ S"B Á–³¤ [*ÿ+¯|¨ï¢5™aA…°ÿdí%K9i·S±¶ø¨=°Ãi‹œˆÿo5í•­f#N. ½Mbqq€hvç¿9[XfÓ]—Êp Å/0­GÇc{ a• 4Ðu4/±¼ 8xùòÅÅ0/匾£r¼x…•bSv‘hh?*s·å౺qeAô〒™ÏÈýûþöϑEã49«!¡úmZ4¬SëŠãaÀoþæñµúe\_;œÏ+noÏr:]__³‘'£{Ä5âùóçè{âçÝÝÝ!ç„ãØcº}aÐŽäãw”¡’ÅšŽˆbÌaê.A&y¢Îh½[WÈ´6爪4œ±aiKk ´©ŒF 4 ÷Îð‹I/È:Íô5Ú‹_M†ðšÓÚŽéH@7Œíô”µ‰€&ä ×JœaâÛ—Õš†B×»6u†Ú$ÎË|ÆãÇq:Úßã»···xòô1æyb4I~•Òxùâ=\_ßÀº¡•öJU¬ËD:½õ§*!ï£Ö`·™ å{ßü=ÖuÆùt‹®óÌÄ[áüÀNM5œ ·"†á 9Ó‡lY&üŸÿÇ¿Ç7¾ñ=üÕ_½sQßmDú°=ùrØXÿÞL…KB²B×ÿøS¼þúc\]õ VkÁ8xÓDGÎ9ÜÞÞÂp@Ž$F7ᚤñ„].*zͺÉ^þ´ÅÔBÌ ¤ˆ˜Sk­Œ1()â4Ííß•*N|9ÆÌKBÊq—ߘ¨µÕ ׇ5.°Ž³×ÂCd¢ ¼v°]JýàƒR¢|¿iÂãÇÛi?ŽcS¹Yk Ô¸,HÊøa8"F’Çä¸âîî®ëIÇÌ'OJµ(¤¡§_[E|³”(Bi²ùî1Iûûòæ ò”u)Í­Ž‘ÂKj%ÁG×ñ‹2œ·m°õ‚ šX9q$™†ª»\yþž÷Ê{“ÉÂÁ*"Ø‘þÇÉÍ»à=•á÷÷÷tÀxúï1ÆFY.%ãx8 ðë< ´3ü©§¯á}GÌ%Š0C™w)5m¼Ü@¢+hƒ¡²7ÿè&²‘Ÿq „ô÷¤”‰M—ïi{Ñõ,'öP¥hÚ×ÿþLjßþŸþ!þíý¾ñïá»ßý1N§¥ù÷ÿ¾‡÷ïG¦«Ÿùgö ™LSÂ4­xþü ¥ÞÞµ…‰,üñOŸ^áõׯðÚk7xôèŠÓ­€_ø…ŸÃ³gGüâ/~ªíò%Ž^CM6÷JÿÝûž 3,žÛ²¶hX#\§ZKðp†ï¸]C»@öPš}š±†rAZiâJðš3å‚T·Ëj]Wh囄¬ù¤…€ø1þÝÿQ½¿¿Ç£GÈoúa@ç}Ûaw}ÏRÓŒyY •¢ÒÞYœN÷ìpê1îð“þž={ë{È|!æÚ¥\S{‘îVu‚Ç’¥DDÓ‹YPaái}µ<„÷T™ÒjX¾\k†ïÊ‘ã¯Uj…1®•HtS8k`eïÊ·¼Ü`RªË¿¿·³î%™ò½Ê¿CBœH °¨(mÈ:ö^ ÃÀ)FÞ}÷]ÜÞÞâúúˆ§OŸ6æMÉg<~ü„ÔjË™·†Z뻋U¨à¥J.è‡žÚ ÍðÏ"ÞW»økáJRŽïÅìd¿qhˆ†F»œÕlŒÅÒD`WW=Þzë1>ùÉgxòxÀñØáSŸz ¿ö¾x™•‡lâÑhRz3>9CëÛZn=Âù|æÙ * ­¹8°÷k<­5Ö™4ýâ0çèyXiç:‹”#ІVÅddÔ´m 2lÎ?÷sŸäciʱÓÎîZÛ0Ðú±04(+Ü«j¼öÆÇé!(9K’Ð6Œ«—rJj-ðÁ’Ç>çÚ¦˜ûütcøYvC»mÐexÎx'¹Æls…ÌâèBUŠÑÐÕ…¾7yQçy¡žÎwDå‡ûþþ¾¥ãÈDXn\:pj‹y’×hY&m HiÅ8H)âîî777͇@1Xtò?yòOž<ÚE`Ñ×_–}¿Àw~þuè}û»÷Ñ n>ïêdø)ÿÌ{ÍmW޹mQB AëáHpÒ(݉dκB{f¸…Ç4Ñ¡Kz{ƒ/åóøÒ/ÖZü§¿ø+üÝß=Ç_üÅñÝïþx—¾üÑl‚=Î{ÿÏ÷Á¯‚<ßwÄõÅÜ$|õá¶ãR³¿e5vcÂË—güçÿü£öµ¼wøêWÿ¿ó;¿_ýêsqCÓç­\|>•„p´v’VæÓ4qàg¶1.0»¼Ç½åW~%Cìk *sR” 0!ÆB›U/à¶Öj^íæ&Ñ. 0ÿò_þ/_§ ¿}?àp8òm«.ˆ*Ô'*ÔJ=sÊ!¬m B}·‡ïzrùiRDÑB#¶Pîþ™ã›ªbÅ£-qž ¹@/ PA†£òFõ}ߌA)'=,mˆãMp´=¿±†d¥üáÓ|ú“‹4ÚÒRXã21×sNmŠ|` ¯$CNìJÜÜ‚RvÊ~x‹«¸ººÂº®M ”R†6 ¯½öë¸S>¥”quu¤y»Á3®¯¯É»a "1jò¢Öf&‰!^hèa®ÀC«æ‚sÞ#åÒÀ£J«ÆUÔ»°ýKIÈ%B©Š˜rÉÇÚÐûb­Á£ÇG|îsŸÆ?þ'_ÆïüÎ?›ops3òÏY¸¼þéËø¨¡¡úÈm‚z•Î+¯Œ`W?c Y?•V›^áÇ?¾Å÷¿ÿ>ý©§xý'uW›]^*wJœïÚsUkÝ‚q7wÛ…ýáBJC¡‡]îóBkC_ÃÐVÉ Ôäš…nøõZó/þù?ÿºåôë|3Ýȇ‡TJºé‹­%3ÒÔÛD¶÷¶˜ÒÈ’éVê–â©?Ö–0Hà‡l±=ÁEšj ÕVQ¶¼ eöÈ¢ßv†üÚ—Þz׬±ò38ïÇN&&'%°%£Eæ¬o ÁÎ/Í~õÜJ3ùï‚w*U&ú3EbßúÔªˆ‰—sÆápl%xÎÆ:Êa4ÆhÜÝÝ^¬Ç¬õíæØË„cˆ$\Q$†"3Šk©0 ´:U•¸‰ò0§DC%m?ñêE>aL VSpŒBÆ2¯°Öaz®(LóÓt†5¾ó,é¶íÿãÛ{óÙÏ~¿ñ›_À×¾ö|ñ‹Ç/ýÒ›øùŸm‹T[s›luÑϵh¿>lŸ“N^iÿð×µ¾­8é?··RÊøÇÿä Pšt,ïšë®=ÀuOýõ0V#¬Æ»F£FÍ\¡æ ß«@ÉÒèVU4ž {EJ¥KDkeíòÎ…¼MÝJF>×>ÈË<£ ·[Mi åo<”æø,hvA@ˆ­¼¡ƒÁ16¥ŒC¤IÝwdÞK%e#ÿ½ë¶`ì€)kPšœj.¡A‘˜r•!•èø•J-`¤PJ T(m>ÂBe™Â<ŸÑ÷#œ± F)NzpsÃXKÆÀ^ƒ@ëËÜ>TZiDlrVJ+ÚŒäá<5OEÏÙ’.KÆm§Ýh°Ë Uiê«X0#¯Ý>"ËZ o)xf£‘1Ž«(ò#«aE ¥µ=1„2‡ÑyÝôJQõ÷Î;?Æét×ß ïA…ÂtZy  †|(Öô›í@¬U_ø•Ï᳟ÿ$íº¥ÿ»?þOøö·ˆ¿üË·ñþû÷,zÚßôº‘4h[ù¬>”›xã]/Û‰3ê++Ë-|e“3W|ûÛ2“V¥a¬jí3ÅÚN;(p‚¯f¼™*È1"•Œa ,ýét‚ãËB~íˆûÖZ8o.Z™é뺠*Ê[>ÁÞð&žZg:ÒÀ‡ náŒ2”—Vhâ i 4,4R.ü€Z´7\1dX%˜kÙjxëcF ë1ï»}óˆ7_nzgr¥ È…)Y†‡%¥´›ø¶½¬ëàRæP †P轉(‘%Úwˆ)`Ô†—¶®CH±1éö…vº;GÔÖWä¡$¦¡7bÓìÓ:Ž#Ö•ª€išpssÃ+¥ÃxDˆ Æ#!ÕRÉ0Æáêê1ÅvhŠ_"çL(²”¡Ô.M)g@)ÌçÛ½&ó”8n»*hþžå`S,Eö=…q–(‰Oµ©%ˆòìµ§¸¾z„¾)j~žpsóˆ4&½¹ègé`;Ó$øy^p<ÈKƒÿîk_Æ×þû_…µßøãoá§?½Ã;ïÜáí·?Àø>^¾<_T™û°ŒW;/¥Êõò`¨»ð¼BIúè6aš¾ýíÿН|å3ı( 9G’¿óáâ]ßæEÆ(LËÒVî9ÄuEïi³";û}¨Ë¾ 躥¦æ¾•á#TAI4«³^sˆ‚µUœ)¡¨ÍÕµ°­qºMõÒHECÕÚÂS ¾¡ó»øN§{ôÞ#…Î÷0†Zˆb-¼wÔT°ÀÇ#†Œ%“mצíf/¨¤‡h§Ò 芪 |ß1¾(AY‡(Ó=ÅÈQÉÊÐ ±è M ÷FÊ êépéŽ-~¹Àu¼"©2Ä P8/gx‹)¬8§ŠL»ö2C&bIPUSö[Ž( 2‘uó sæ­…ª¢JÛ¦øì(Ü–xOûxgÉ.í¬‡ñTÅäR1Ïäl‘@„à&—®‘ˆ³œ¥øvý¡Mì×À¿é`³Š(8q mˆ9ÏDÑÕŠæ3ýÈF^}£±ªR”L IDAT¬‘ðçÎa:Í0¬ 0V#$:ÈÃ1Ž#¬ÓX—È aº¼q˜N'\8C~­5ùß«FÍÀoýÖ—4f]ü×üÿñ?þßúÖOð×ý>æFÚÏdsp¹ex•i°…§’Yþ’{@‡EÝͶƒ£ï>ó¹O h‡T lUPp0Ús ¤šCF7v$6²ªlR­,r-èÇj!*v33Õ-5ع®ÅÑITzXV¶¼Ó¤í†)sŽªÏBi%9&Xç).$œ×«•ENtË­`L¸”c°‚¨Ä1&„unöHeh%á!dÌmâ¾Egï/Ød•M*ÜÒS¯‹˜OýÝEF_Öô;¦[;kiÆÙËŸ×ZA)G§=ÔÅfAKYŸHLù…¼•h¹í™¿’“=´$®Ri3€”â2ï<ð ¶’dßÈlåñãÇÍp´ñrk/6š­j›†Ì§þñx$÷1—öòu£´bïí6 |“†‘©6¡Ù¨©EÈpfÊßMïÚÀ)ð¡!ÖS"FmYÎxŽv'«¬¤äõ‘ Ãéô€RˆÖDÿ šDŸ±9ç¶­Šµ' ý¿ô…Ïá_üÏÀ·¿õ=|ç;‡ï|çGøÑ>ÀÝÝŒòŽS°…wÊü裆{û²;(>œÂ¼¯¾ô¥O óFUô½Ç2‡‹÷k߆Éz˜t›GeøYJ%p¸ ™ë¿ÿ{§s®]FóºÂ(\ õ%×P<$}·í²€Æ4Í"Ž8ç¡qFi>Q·¾§pDŒ’úKk½Á»ÆÂ—ÿÈ€BJIz°.…*âÜëžUÕ0y‘œíø½Åv[k‘ÂÚØ‚âËî>`’¦ø™qÒ´KUš"‰ë6ÊP¿†QPÞ ¦Ó?ö n)WUÉØÌbNÒŠf!”‹1•þ[rò~ëAeqåÕv@Ї¸÷t«GÆ¡[ ¢ ÷Ô.䔡—‘ðŽ+)®»C²òüÄ5cJU€õ)Ð-mµABnþò7е4]Cj“嘩=süž¶ý7¿ëºÂ²L+4µ|^(ãN*#±iÇÆÜsü +Lý׿ˆ_ûµÏCkoû¯ðÞ{w8=ÌxñòŒ3Ö5µÊ`žW¼÷Þ~úÞ=>x~bJò«iêï,mmŧ?ý1üöoÿÚYž/ $× é‡Û\K†’ÛÚ0Ó€¶u׆a'íUJÃ÷LOÚmäCÒ»ÍÆŽ(ÌJÞ3i»ÐP°žÑÙe ,rÃë?X8„µ0_Ts¬¦ÀgQªºP25‡Þ¦õ¾Ÿ0ÓRÄ$¹9¡wšueÛ)(Øï‹_&ÅìoãývBÞY«MóDN·Zï<Þmå¥ s C\ ƒá¡åÒx‚:F ;ÎuÈ FhY¤Á9ÓàÑIÑ KXquuEß—ÙNnï=Ùœw®³–Í7¼ºc»qإȠÀ;GŽ>OQØÂ¶óÜ7 ýh/i®»µQ¼®ÝÄÖj¤ÌN²LÒnºÈÃÂܘw1ÒAUxâŒÁ ègY—…‡™Öu‚1¾ '#žH§K)ȵ´Y‡–r‘È<êW¿ú%xïHxµûŒMÓÄùŠç)À·þì¯ð“Ÿ¼À×/RÆýý‚ï}ï'ìr¬bP[éð+¿ò)ü³öðå/Î:ÔR×붼‰¿zgF’‡¹–K@ª ê(xÝÌFÚì’—µÆµÂjӆ̆]”°¤ ˜F"¦­¸µlçØ^áÉ»£à‰ ªRhGo­ºÀSÑ@6ìÕc1F¤œ2Ú„º_kÚNF})mÌ92ÊI6©=äVYxëM ?R!Ú&èØWZi¤\é.,—tÇ&0’@‘’3’*ÄÔÛ¹¼Öu…i&–6Œ¤ŸŸrêIiEaNúâ5|H*,å=¡¡U“bj¥¡Ù—S¢’™÷ô¨€ñJ!•¢Dªi8o[f RŸî,9ÈbŠmO%'Ñcp锕4<ƒ-è°$⬧”ªPšvúfGÑI‰3ö¸:k«qü{]Lm’ÖÔ^‡&S}°}ï›ýu 0V]ܰµÚ«\8ÝäB(%c]·O|$ÖZœN'tåž@ãË_þüÊ—?C}K*½%&üàûßÇOzÆ»ïÞâövjOï-nnz|úÓoà7ó‹µýà÷·û¹_­2¤J(eÎyK•wëêÞ‰™.A(ÂS”6¸nœí‹5¸d-Ò°¿Ã²Æ6ä°ÚÞÓ‹â™)·—^Ò¾»´ w*a·S‘Œ !¬íMÚ—~òƒJiôŽbZi+P²„`b§éÎì*ÓE‘¿B]²Œ"k§á5”6r›³ªMKÙNÁ!2¹kÙâÉ·¾Ð:3e6.)ÀRéZe…¤Sá¬áUbä‡F5+±˜qD? ‰0ã8"ÇJVzuMì2£¹ï=Å^ÕŠÎ÷;‹g8(Õ±ŸÔ{ô=² 8¨9@E äŒZr¥ò³ÀH•dPøf’×.p©žR¢Ÿ³æE]¨”¾à9Zk±¬Ä7èœos k-ÂJÀXc¯B)uz`§›¼N%ç úŽ‚iZ9ìå ™ç]?îäݵµr»ÖRa½eQNáùN@ëiç>ÿK¿„ÏýbÆ0 ˜—3Æ~Øz÷`²]T ¿ƒp´„^¥PRn_µiýèìÉýa!U„¨:7oUäj'b2ŠÖÀ)–‹Ž|OmÈo¥¦u…¡`YS¬à+•2ÛþQñp42ö(lÒÊÍ­.ÐÙrë— NaU¼6 U >µsN¨9#3í7ç½ Ž¦ÍÎÓÚPz¥¦i9§uìÀªf :èü,Sz}ÃÉB1Ò©+‘eqYr$q…|-õfÖÞKš0ÚʳäÌ¡¨†y†T–IÂí0 X*I×unP Àòœ¢ÖŠc#!×–=·†Ð\fK}UFÃ8ú3}ß!FÝPÖÓ4à Rû&¨*˜æ¼0ѨŠÊ†°–Ruu©pN!†…ô|;å z-{®ÊpÐX…²²Ó ôá—›½ëÍMZJ· È,í¥ix-4LtÖ\(ää´Ö²€l“ßÊÌ$±ë-F2ÎxßA•ÌG…¢’ 7kq‚B [žãÄ1mÍEzÔ–e·¶Víp\»Ûºùý¥ízeÏ/~œrK›–Ðö~W¤ZZUQs¹Àä­Qze¶°µÍÞ{âî¾GKÎRÓQJ¯Â-ä¡l-üp§Ì îom!ýÀnR2PjÁ8°,çvB…°¢°¦9.„¿v=¡‹Z¸¤ëa #1ó«Ø1y(0‹RÉ÷rl{nJ@¥C«Ý²C1â0öM¢ùvJ\È "‘N”ÔašàLOA(°Ö·n]fÔJ9o"prδ!Ì:¼ï‡àááa‹±rÓ|‚µÓùDz{ë1Môºißai½3µa¹õˆ9W¬ëLƒÌ5àx$Åá<Ï8MwPÚ éè°†¥õÐˉ"Ú•jÌ­„2Š+-1s LZê"OÚsÙ„Q;O‚ôàÃÐaš– Щ„xì{áô(õ#+fÝôî…ÔõCÄjQàÍóŒëÃÈÁ0¤€„Fk¯r)XÖÏqõ‰íäâü«üœÈųO$j~•ÑŠf8—?Oe£ÚæS²Ç—‡\DeûꙈܶãæœa”¾˜‰Peæ.[¨WbÅä9.Šà½æ÷ïw¿>Ž=S_*õùFqà‚##Œb>œÑä¡1”¡f¹¿$Θ·GX£7ó6Á ÒJËKXq|ôô÷äŒG2e€Z`´Æ<Ÿa4Ár ¨™¦$æ)0áà\Ç»ÎØzЪ š`…æÛZä¯Ë2Á[ëΧ{¶ÿf¤ÈsSs­)¥Ñõ=³æÈÔsžÎÔŸÊ0Ô¨(9qèhÁ8öDheË­˜™Je¦"'­ëº›€[ D¨Zp>=àêp„7§éÖ‰?œÄ”ÿtÞA[i>cz Ò×,™Ú i5(¿Á؇ãu“}{ÔÔŠ†H€–¹‹3ôˆœ“ÂJ<…J³%¹ ü¡r½kP: Æá€u ôÚÕŠp^p<^c]ŠÒÈ5·9‡B†6Û`l™U‡߈\uCm VæécÉë¡(¢*Pè«5PÆbaˆó4wQÚ|h½¦TEçzÕ” c ,· 9'„54áR–:òP(ÍvcŽàÊ%Á:‹\(Ø,³¾‡±ÊäZaEÌ+  ±+¡Ì±P‚¦çà£('€>û2`7ÍçÂB›C²uÝìérÀ”šá ô´&æÜ8ŽÄƒs¦1ÆËžªË½dç]ìÈ.˜nâµ j)\Vé& j®ìǧ‡%á0t¼~Ó\N9„°`h°Õ÷–…4WW׈R…öbúÁÄHF‰ãq€ •!šlË,!œéÆÈ 9œVâÇe榒›§›0è’*CCPï:ܽü×77¨ìTJÁ€r ©Ô !bž'G8G6ë”3B$£ÌñxÄÝÝ=¨\ÓßÏ ÅkŽÇ– e2q<^qé_0±ñGrZ Ç: ²¬¡l½l)ÑF =t8ÅætÎ!…€Èôæªts°  ç¯JÊÍþl¬‚U%S•u>Oˆ)àþt‰åÕÄnàÖŒp­,i+øf•áž”ûò3)¥à­ƒrþbP“Øö02|3`­èAâYA)t™•¼ýJÆ­É„-”)Y7kM•Ä>ƒBvðR‘0'CŽq·]?`]9àÅ{xcYÈCf…«5eqðP»i?8ï ”‚°ÎðÞc·›Ÿô5¼r÷æÞÓ$Èò‡5µª%¥K|;q ÙöAT,d©•d½õaEXæ&$h!α%#îõÉ<-TP€2\fÒj…(9䛦…&Ÿ-ΩÇáP؈dá½j]¥-TÞ&Æ…7 4,QM`âŠóé„Îyxëpwû‚{áµ¥ÖJYt8X„Tàº~mÍa¥9"¥€–&NZ8œãx$wÞ²Ìì2¤ÛŠÚ¢Ä7Y"…¡fÈHÊôðt]çÛ\C+ð‡O°[•‡~EU¦ÔÒ0kY×&ø ×át:¡ƒœ#¬1PʶtZЀÂ4 Á®4gñQ;e4}cNmþâµEU[^ AGRJ‡9ÑF!®#æ²LmUÙG„…uUCsDv-¯0†¢ÚS®Ðœf³÷ˆlXõü¡²¸Ö ]Ñ‚”jI9&~RÐu”'‘©¾E.¹Yti'O@«52¶ÁµÖš¦äÍp–¡íöýäœQÄVÍï«ÌDàµÅ’Õ–t-¼ÙPÉAC±f”x ƒ67A}ÖB#5#G^‹¢ XKK6ö]­,´BLÈœæ%ëäú©Ü)Måj†Q[r½°´ÒòÖ#äÈë1Ф2 °‰Ìë(Ë3U ÷ެ°«…b±KD.D顈/ %ž\T¥Y—`1 ÜÇi²â.Ó¼Ã2m‚\t¥??G¬KDßuxôèò:áùûïâ{ßýK<}üˆäÇ㈫ÃèíÍqΡöBhÈPKã|O|5Àë«# i}z:Ýãp80« |jQ‰5ü)‚;Ѫ$k3ûÄHÓo­á¬Ù"Z÷d˜¿˜PRF­§/ÑAÙm LûÌNÊvŽf’«q<ñèÑ#¤BlJ­:ߨM-s¦¼1^¡h¥Ht’qÁ:Ëì.“þ¿T^‹±Xh¿š ¾u3\ñf+ÌóÔÞܪ3|GÁ•‰©ªÒt]A5³a‚n¡œ"R PŠÊ? ò«eñþóŸâoÿöoñå¯|ZU†S¤“ût:Ak…Ã0´¡aŒžoçœkÓÀSy‚á¡ß<Ó¼`Î O?C.w·· ‰”5dhMoöØwÌï›±ÄÅ$–e¢ý}¨ZYôýçéE2Ë4M˜¦ ×Ç+æåˆ‘*o)5ɳ\JÀ5¬xã7ðÖ[o‘=w]1GXãàÝEè‰ hÚf ¢±úKÉü"Çܺþ¤J„U+g8TÎFh)¹šâ¨´*4LU ¾ë”ö ÆYç›=Vn8áÞkÕqäZ@`Ë·­+4œ3-ý(&ŠQ»FZU)˜È¤ye´iXw© 7¼–jÕ¦¤úúž42O)¥ ¦…!nç`VQX‚»/P•ÆÕñÚùv‡o.S\ä%†…‡±½Cåašæø9p…&«¶uq˜—½ßdO?Ù\±9ð°¦`º6 4Œì®Š8‡[ÀΖBmùý͉fYÇãa%]D “÷pÿÐǾ§aó¾]Z–æ÷~ï÷¿~<1ñ€ ª°b¯°èú%ñG¼Õ²ÃNlzRPÚBßJKÍôÜû[ÚÓ–JÑ]Êb ¨l  ×0ôðG‰°Ô̬•tîÐ]?ÐOÊê®Â‚‘ñpÄÐ_cštŽ>Üët…„éôºfhC7J?`»JY Ç+ÜîÐ#Žã€Z²Â[‡3B$¹°q=Ž××X㊔)ôc¼º"€ò°½A?tiżθ¾¹feBÕ×ã¥9ˆRÆ„0c<ŒˆiÆ0ÜPh£õ˜×¾ïšiX§A‰ÉZÒËRœMÓ©=’¶,YF[ò‚[u} ²³8ŸOP”¡P1 =´¶˜§J HË9¬°Z£Ä‚2½î¨è¼EΧ‡—úcGÄýÃ=é4„uAï-¼U8ÝßQ&Á|‡¼ÌÈ)"²âަÜ%Äð@A©•\ªf¬ó £+¼QÈ)`™NX×98]aÂŒežñpy™Ñuda"L´18¯à‡ÚºÆðsŽ$Þ„osö(IÝô$ÆY„˜à;ªž*(x«¢+†alº¥ º®oRù k;hí`l‡\b*ЦcsU?C?Ð!\i¨›s¦ÜMKëEß‘F ŕބd³¶#©x+PEŒE®Ñ°’n‹Z\4my^á}‡Z¶ðOéi(±©«šý‘tÒnúxbã~!Y _ŒR¨Ö¾¢¦ÛX+rÇ¡%èÈM(™ëË2Á:Ëüsc.Ë‚ë×®‘+p¼¾AIïþô}¦ìx¤Ráu‡~$€Iב‘ µâúú ¬VPG‡Ìo*4“¬Ï^£•ñJU\ù+ÌóÜ(ʹVøÎAiKöÓÒáé“kʸŸVtÝ º®Ã¼F¤X°Ì&‘ðû#Œ¶è¼FXÏ:Üwž6ĺbYf&®°èÛºmè(ôNa¹Ån·Æ‹<ÃÈ%NPºÐˆoVoް(¨qÅš#ª™xóÑ!"Ó--x¸¿ÇÍÍc,ë„W”ŽZ«hÞQ;:çðð@7O×÷˜¦çó‰úÿRp:MX8"[‹¾€=$i´e…(aÓÅ­úø†D§‡Xßm«Bç#U?]×ãñãǨJ7¦1#çèAU(ØLþ j1¶”ßÙyÕFòž`0××W­,—aåèTÕ:ÐJX 4Æ&ÌóÚÔ…ÆYøÎ"ÆÈ4„•ÍÁ«d æy¾CŽ@a7J ŸÂfÉß…ë(¸½&¥–ãrãLcní5Óvˬ‚úÅRè&õœ6ŽÃ8E'bi¶Re0„¶Ów¬ŽÓÊ´ü?½KVœ†¢™ˆB""ÕbÌÎÓOŸ>¡œ»œðôÙëG¢÷ÎóÌ#ƒgT!¤¦ͰÃs@çyÂñxÄË—/q8¨gË wxã7èuZ¨^!qÉk»+Ëw% 0Æ¥åدYˆô’S$½&¾‚Uq9cÍÎ{”°b嵦Ïún®®qûüÃ0àüpOk0£A/¿™j˜ï6MË> ‡šH™é¢-½óÁ»8À0àþîDÍdpšVtÖÀRijeà*‚Rï<µ,r>Ã8^aYÎxíÍ7q÷hï{À¨JU |×ÑÍØÊqµ“Ð.ýæú1"Sn S•:¡"“õÓ¬übQ±Î3ºqhéDºÓ g#Ò%5MµbÖb™£Ñyyš0óNš²Så@¦+…èBu-±‡Ú&/3XëPJ‚©T/1  ‰·Bû‡Wœn<@sr3q,h8/òvcýÅìbI)ÁyÖ¦’ ´‚8€AÒIÃÒL¥/¢£,g«סp† O2 Z"Wµi ©Ÿ­P ý0qgX°;Ô´månJ™}݄Ғ=u­Ôöë0Žì&¤Òéo~ð=|õ«_!êÎ’qsEíb^<å&XM6ÌjÂ`j&1Ó2£p|²÷¶$ ÍÈkÅ;ï½ͦ'U ^~ð‡ñ×õXÏP¶Ài…ϸº¾ÆôðЈÀ+¿qeVpHÀ‡‡ºeL‡÷Þ{WWW­[ìp8àþ~B\i~Ög:¥ÔåkÎèœG×¹V±èžÀ.5ø¾¶Àghm%Púó}ç`´ÃÀºç<úØS8Û¡gŽÐp¼y £å+hë»6¬SìzKœ~Çãó<ÊÀ÷´qPÚÐaZ Š.¨9¶¿ÐðkchH…yšñþ‹ðäÉÔʘuK©IkMXÏ qO1î¾ï)Ô¤PÎE,ž7¹y<.]yºm-. ²9:£Î+J™Ú;K%uaAÍÛ¡*nÐL§sÏ”š±.@X ±O[ˆÒ^RŠ˜#ç"U1­pÆÂZÍ*^ºíÏÓr13Ù«I»@çxþ$åÀßE)£†õÏØa‰”ªP f5ŠsŠDÐÆ^X%È.…¿ñõR¤~3ö[~R¶ôUYw‘éèœA.™Ôn쥷ÎCnÄ IDATU!Î'¬|Ã¥8³9£äÔvÙ–§ÇÈ5¤°¢Ä™C"Vܾ|Žapš°X‹ãñˆïý×W×0Æàßû†¡Çñx„†B=±Æ„Š€Ÿþøm¬3v®¯)z}ZfœïïÐCãÀE㊇»[h­q8>¾ØqËp©Hj ë{<ê:,ëĽ!;öR@çôýÔŒ¢ R5Ð|« x§Ñu[R Ê”Z`pýøcH1âÚw˜¦3†Îà­O~ ó°®Ú PZ£(ËveÚgÏË W o¦é ç-ºa@˜~òî»Ç–5†Z¥"šOóšÂÑ%n-ÉYV6¾h¯Žˆ17Šô4Mèûq,=Dïy¸J«å'‡#’”ÇULD$’‡=åŒÃ‘¸‘Ë0 $u^Ö•…¤eÐΣTÊl¤uöL¹‚–dÊ1gÔXD£Ðu=·ÆÞm~iÆñH¿5ìtût ã¡ÔÓõ0ì”4܈۳Ÿ¨-8—ˆ\È «•EŽlôãÁ¹-…`‘)³þZo(')…(©×5oý<Ït;¬+JŽð¾Ãy™aCœ¦†ƒÒŠtÖ9”ª;•/¢´ÄÓMq`¡©§DiåœÃt>7›q£ ñOzšÎˆËJÓÐð™Ï|ø¯ÿ/üò—¾€g¯½»‡{ô݈óéëæéZkÜÞÞÂ{ËÆŸH£ËŒûÛüûw¸¹y„®®È‘Txó¼âñãÇp]‡ápDL1$ ‡#ž<»Æ‹^b477p†÷=>ñÉG¸¿»ƒ®ã8¢”Ïí‹Õªh®øØëo‹e™cÆõ@÷1²{ÍخDZ?àtz€zäRàû# ñtÅÕã¾­ùbŒš’[~ƒR ãÕxßµ|‡|7"–‚X¼ò¸?ÍX!ÁÖ° ÷#JUX ½¬wH¥Ò{_s38 –ü%ÍÛ_2|Gá'¹T aÑ$ÖI‰ôó]G·¶ôÈòÀYK¹××H X”ʉàœ#ìè@‘—©€eì™6†£€–d¨ªØ…ɶÙAê"~ÌX®jì.Žì Z[Xtœ˜ÕT{FCG-¡v(qZVH‘°µáÙÙ1ƒT67£V€ªô=yc0‡H!hmí[PklšØìé¥mÉ23$íi?WPßüÿï  Ù+÷ª#AbGzh5a¯dø%/HV^™ÐIM7—qO?izœ¢ðݶ¨1ëÀˆ¤™Í9WWW üy>‘]všN8^=¦^Ù9Ô’š5–* ÎtûßÝÝáñÓ'ÆóB˜e pZ!£´4äñÐCWÀ;BpùŽ(¼P óé„ÃñˆWÜßß’º?6>^×øàƒçxã7ÐõîîïCÂ:S:+­…ho?GÌë‚e>Á:O\Å’Êta†e\=:À°Ç]iŠK—~ÐZK(ÎU¨¼wðBdc se5‡t~@.‰\u1Ò“C_¥o$™nÁó÷ÞÃ0 ¸ºº"~"—Œ+“Ÿ¬¶;©qæƒÜc=?`Çö!ìÇÓDùw‡Ã]7 ¸IÊ]’©mpŰВi­>XD´EñÞ#nÎ;åå>ÆœFŽÒ‘òEÐLˆ[6ƒB窰ìD7ògeÖÖlÀü)º×YÞïk”L‡uÙÑ®öpZƒ+Xç6¤ÊN1X·˜yŸhƒ´¬Ô(ÍìHÅ"4‹y].pâò³hÍÀ/@=V><"UÝO‡ah“~ÙçÊ4“ä³GMŠÀ~pzxÀØ6kZÈ,ãûÒH<ò¢‘3*Ð šä¬©^JdSŒw¥=B…˜\*–5âp8Âû÷÷÷8F Ÿ „€ñú—MÇ«„”qô#CI ^{ýÓÒu]ÑwŠ.¬%­xòæ3 +z·súÁ¢ó?þÑ;èºÝñMvíÔFOÀÏj´çÏzÂyžñèæŠNpm` è7¶·PËJåšr°Þð{p@ˆ·M¼¡Q18ŸÏœŸ0cmuÕ÷µRܹ±$2FÑ/«ƒ‚³¼£}²qv'¦1°®"…‚««#TÍËÎy8á¦ÆÀ)ƒÞ;ÌK€f@Eo-RÆŽe©ó<·_‡ÃÆhœ§ WÇ#JU˜—ÀœW$+”!‹o§ ´õP†+ˆ¢à|…³™­"†Csþ5ƒMª¨:oÙ UDQ†cá·/³ihOÒÜW£=ÇHmRèû¾™É6˜‹¤YÕ&Ë]—…'ín§k¨<ÛqX™Þ³ù“µ…£Ð2Ó†Õ[K!ú¯³°Ö3+ƒZž·gû!jòÖJÁ<µ"%Ö[üÁïþ¯_?ÝÝQ(aN¸¿¿Eç-÷פ5O,É9b,Â<#® –é a]&ÌÓ=b˜‘+‰}”Vl…µÔ—LûTV½YOŃ@Û1ÖËõ|r;ø®g}í¾+4± MÆÇ#Ñp¬Å£ÇOÐ2 Ÿâ#[j妳ÎÂÅe°âd^òHM}Õº,@͆FS¸…ã=jM¶ë(ÜÝ?àp<¢ë=㊜†ác=Et-Ç«+*mÇ:øPrEN}׳@ÇÐï;Çܰ™¶0ôÚí¨èYÐDðÊ•#Ÿ8=ÈTþ¹T¬!rÂoåøsE5Š­ §=‘‡Ÿ¶6= ª²0®G.Ô7jß•ÌEë²`èh¯ošò¦#1‰c`d¸Ba®z?P|T7àÉõã6U쳤 gœñØ»”ŠîàxŽ`±r¯¹‡1ldT­lëW¼÷4_gήp>Ÿñèú†§ü+ÆqÜnG¥¥ (viÙΠzÁ*)Ä8£ãÒsåÜÜs;ñ­uÇZ)LÓÜ<ÿäØŽ”íGC§—/_¢ÖŠ›››6U¾¹¹Á8Ò\ÊΞE=RÂîI82)NìÍωO4ü¢¡'PZL•T/}ß_DH+eøà(iO›1u1ý•›!„½.ËOð-Êa´r}èsEà¥üàÕ˜oZw­H)%¹wJÌóÊèp…¾¨yæx`ûçæEï}˜!ôØú£$A¶‡ÃU;<Œ¶‡#**Âà:2ýÜÜÜàööµæ–´, ¶OÓ|·A÷™-“d¹Ù¶‡a#)U¤’[nv¢”=ÖI&ã9gÔFR¾L»)µ°º2µ×Ùt]sâm©ººmö6WZ‘UŒý@)¶Þ@'ÍÞŸøÄ'IüÒÄdá¢Ü–*ÇÚ®i:´ÖmÓDëdß*ÏÊŸÝ.*÷ÿ^dxgLf·Ó—jPÌLd¸!ÐHNÙ¤F·Î™ ž¹®@¥¢Ø†sN„5/õC\©*2RØÂܰàZ_ähFÕªšß°  ª38ÂÌh ÔˆR7MˆîlÛfˆŠW„\$<Ú\”%Pd¬nÈ€•¨š+¥ÀüÁüÁ×é z8ç‘rä¬=ÛNßyF銒ˆ˜“#aüsìÉ\Êdv¦Ò(—ËÀÿ’ .)ªûÞLN*o*OB©§ò¾kÀƒ½Pf¯)Ð…Ú–<»ùr»ää”ò}Ÿ&t8Zõ¡´â‡åµ ­Ì4=º°E…ÏóÜ”yJ)¼|yÛ"¶‡–%°[qL69ûØA!$ÆÚvÀ ì¬E×Ö1[ž!”àŸU)j[^KºÌÐUÆhWh£ˆþ‹Ò¬Õäô¬¯ü"O¾â¡ ÅRIÄÈ+´V†Ã.)n–M5[b!L8 „D6ÑËÙ¼'¾ˆŽ ”Œ„BRJÑ® ‚Ú1 ¬ÝpåVW” æÉ«vïí¥‚­Þ÷˜[ߦ.æJ)T­Úä7¬Ïž=Ã{ï½­5ž={ ­5~øÃ÷ÉŒtCš‰»»;xßµƒÂƒóy‚Ö¦Ù5]Un¶×¾ïIdÃÖèÂÔX­ø€Øù\¿ñÆxï½÷ðöÛoãææ=ÂÕñ ã¡ç’Ÿrÿˆœ[°,ëÅÍ&»[ùß)E„˜·¤íèƒ ~õRw!¡›vRƒsÖÈë¹Ý6oy@))%xçÊ+ÌØI7# íÙµ!³üÞ"¢œZØç8ŽÍ%·ªäJì)µòú«Sh;öÍ £±§TíÅ6¥†°Úöç¼§÷fe×à4ÛïõâÃcó­]ËÜv‘•×6_¿5ôpžÏ'®'F¯ -³QªØ};+‡½\¢± _áâ ÛR„Ò…žøPS°JÁi…®÷è{ú9÷qlûüÍÀá*Û95‹½`Å…àܪ[¥ S")c)@IÃxlÓl2¨(’?† mxG9xT®e–!jÌë„~ìvI¦[.Óôš i˜-a›Uð‘KSÈ%b¼ºFȹJ±¤¯1Æ| P,‰î©(ë€ÿ¿­ëH’cI®/dŠ*T‚àäxSþßf´¨T¡¸p‘‘°Y´0 Q]Y!ÜŸ?Q+‚3˜‚‡)ûs! …gäaˆØÓA)«LÉ4ÎbºÍÔúÀ\¬¨EhAqè§RK>€ûýŽ×_¿€Öðõo£nn·ϺèCpx<îðÑ¡™ ã€Ò2*(6Š~¦ó¦”°nO¦¦X0ÍwXX˜fQMhœ zHÓHáè| x<ºˆ­ Äoq¸aœoˆ#iâCœ‘‹Á²4Û°¥…-“v 6Œq"wc.#±ð.2ExǺQ0(éGhò"‡©$$mÙj8u§‰1ÂLjå84:+¥‚a˜4µxš&Œóë)eèû÷ï˜ï†‘ª¬û§ŒY°;ë Tn†¨ºn zsn8Rƒ±žœÐ(Ѻ4LóÅüx}Ã<ϰ¦!:‡švN¬‚W—è’ÒÀ8£YŠ>X5%t\éÆaà϶ܟ­óøôø¬¢¨žænGŒŽl; ƻчKh+LÅ~¬€wØy2@JÏ•+HÙû¾’ûv¡š ì¶-zÒ {–_ÄÛ?#çO⪕Œ½ø“ ªÙÏI%>ðˆ©U£k< œþygMùþyžÕ¯Ïb±më¡'˜h§3ÛPSJ/p䤶ãàYQÒ~Ñ}÷ dïË&QUjóį3Ž#>–'`©¬úùó'Bðÿ;>žOå\¿½½áDz!—ÖC° %-2Ò‚¹ð ä€y}}…ãÞžû¶±aEÓÙzâø°œÏ¶…„PY\¥D$r Ô§¿‰J¦›{[WV÷<æ”™iÑPX5?å|FEå¥|Ê8ÝÀžÃ*¨,—u@gÒSaѹ)SÅSÚ)kÙ­p"£ ÅQkÅoråqhådœ Ý„û@·0hÞnw­‚N0¼ŒqÇ!Œ3«ØGc\¡jÖzÑ¥”±ï?Ó.åÚШT\zI¯µ†§V;3sbßVÔo°72•ö©ŸPÉZß¶ –NgÒ¢¿¿¿^ÂçyÒ,cµª%¢aWRêá„xÑ'¤öã9zºoþŸ™ó§U·Üž‚Ô÷„Ç…û&e*÷Ó†ZgÃÉû>È…x$>äa¡IЃ£T°»C&¢0[Ïc±ˆûí!Œøòå+†‰,¾¾|ùŠÖÈkY–KlÕóùÔƒ¬wë‘)c;÷c-CjÇM@O`_Gc9â”Ç%x'-u?vv &Ÿ…ÄÙŒ’¢Û·a4ÞdêhmC¼]? …2a!ûåÀ'@“Æv2Zë§0”2EIS–7¨”ÊDt1ˆa¸¤NÇ™èEßKxWNùÜ'µý¢¶ê\w7æ)ˆÇ£l í$ –_{f<†‘¥ï¿ÙvWz†0”W(©Iý'O §ÛBK¦‹ÎóÈšs ¬xœ£;T:(=¯ƒœ3yF¶†VZç@—¦äbZki¬Û꽨Iœºe=ÉAa…ÒÏ÷t(I½œôÎi6rÃË­ý{òï®&Ò^Â-»ò>t¡ÿ»8¼°袱^$ÃÐ8‹yx>›ËA㟒.dœ~,I~þóÅDArî¶}Gk¯oox. ÒQðÿÄÛÛ¾|ù‚Çãy¾Ã¹ç‚ö›ËröñÎòzÊ÷.çÍùòò¢U“ô°Á~¨ç‚D¸•R¸2ÚOøxn&šyGâØÓ ø$ÜÐdg"<ÏÖeW!ÖøóÐäïݶ Û¶iï›kALóL¢&¹{îºÓºêeÎâ—¯!2ê!!♫FDa·Ûǰ•ÉEYƒ…FqLì²öÊ­?ŸåCŸœ¦ xÒà#1Fsàˆe yÔªˆ½\D‚[Èÿk£ØmVÒtÇ1Ûò¤#÷ý»à´¶OÌÆ0€.—Y½g©h{-¹–dÖjƒƒw†s8D$h•Fö}d=OH EO—¬…~Ïæ‘žˆ¿½ô‘0ŽÎb;vä#‘Qá„TôËXêãa:÷áZ/l*ù’²Y€ù‰öyRBÅï|è?¡+Y{p‰6Oƶnä§gO¶˜”I}Õ!‡K4)³ö'» }xžæËk¾¼¼àÛ·oÜsíÊ ÷%ïßwÒt¤ ©d3ÑŒû¼µÄSÀ¹VOÃΜ–eÕ[ Ä Î_~W† 3–쬙jŒJ7V ‘Fº¥óͺêb”UâÖû›_(©}€†uÌôëiO¸ˆ¦÷tÀà91¢Ñ[NtÐXO¦0)%Æ^ Öu§çÆTqùl¥·dÃ9—âT<Ž#–mE¢Þ¶ÂÏ%HB¥f¿Ò8’Óšˆ•îØóBÖfOÈ’™^‡i*wq$lÁXb3^of9|×u»¸r &ÆrJ„URZ% õ¬Z¹8z—ã“|T‰XLÆ –ÙiLôÔÕÚ`=P °oé"1”7cDd¬à`f`ÿ"¿çŸ÷åß2ôe 1õüYòKy%)!W¶r[¢°0¼Ö†õ¹`Ógßz& QƒÕKÈ\R„å}<ŸÏ %ùåå…ȳŸ:Žß¾}ÓMsMñµÊÍ!c¯`l2)ý¡¸§”ÓN)J•ÆQ1F-q8rBð†8°WÝãìû ñ×[kø·ÿ¦ïK ]%1[í¤ ÇAºT-iœIY}VÁé9g5Ô#§éK¶¸ Ñh$ÅŸ1ͺh(`“M7\À01i¨4´–ÐŒÚI°†Aƒ8ä†ïuüb&ÓLÑ*¢Ôª¬IRvñh0pV|ôÀ¸Jf²STO€~ª!Ÿq­…ñ •ê¦gUláÜ9¢ëݶkG–‹N#îCØG#Ê“Qi> ƒ´†ÿNžo[Ui¹¼¶•ušn*É93W “¦m),Y¤›Pøö^™ƒý†–ùb”ð/py-9Mû“µ“´ ´¡(ïœ"¨JΘ‡‘B*kÒ%„ëŒs B¸‹±iŽè•]éd ÅT}¼¿â×Ï=¥ÒÆLû?þøoLjiãÿøñƒC2ˆ¬²,—¾;F*µeáîÇ®-‚$ý¿?á=TÆ>8áx¥ acéuß‹*³ðÂXCWyYÕoÈ‚¯µ"ú€yœ‡Ð {¨±²ÎŸàÿ,Çq`œ¦‹^ÊGó6äj8×TŠN›œõH‰t$²¦è ¬z %·¢´±9õè#°ôOÓÄÀk»ä öºp’ÚÍѦ䑜÷úkå˜5Ê"¬l3W¸=«9j|*ƒ4©¡jÑg(›¢â‰f%z¬Uì[ÛðþÜÐ$ó>­Ëjn—Í-¼Éüì[jÍ>T'.—÷B7ñái4²ojMðÀçs¿ ê½ÅÁˆõ½ùÁï)‰*Ä1”î[™.©â V¹Éà8Š*{M8QÐÝT2±ÉqR&ˆ¦‘Øxûq Ö†0Ž¨åŒ…*È%!„³ì·þõ CðõõÇŸ>}R·Ö”¦i"*óú­9oI¹)O|…jÃ5/nžg,Ë¢dÀe¸8MãMµÿÔûgÖTò?˜fìÛ†8ÐhU“nlCæú8dS¹ÄO\–[E½Op–8æÆ[BŸ?³7>#ì†íÙ„¯FëBÏ#“_Du}j.e?‰¼xrd{ ÌRdn×õOn8™‘B•×çÏŸñññq1Ñ4†ÃKö[!‹çdzK jª„ôÞ²!¨Ã8ØVÇœµz´jTä¼Am,f5Íñ å+¸1!}p œ'XCϾ¼ýN+w u]‘KÁ0,v¢¬††–IMèÅÇˆÍ ÙO²æ,:¹èâ™}8 °)'¤\±¬Þ–5/ØöEO˜Šq0N·qÄcžpG[ðñ|ƒÄlk°p>"gz°Öz¼½½ÁHǦ7ª K€æ±¯™o/†!ó|CŒQGYêbÒHŒT2¯™í¯lï´7ÿ믿ôÄÍ<µ lÅtö]ÞE䣡fƒ)>°¬;*Äæ*aOŸ?aœTkî÷ZÆ‘Ðýÿûãñã*Ö±n‡¾Æ¶Ñ©î¬ÕªF@Í=b]ŸÔWæµ"_ö¼£ Z §îBÆ’JM]„x â-¹;ÃÈžö†z3ŠÖqPIDATUμO©¡ï#ßðäçðäÑ#y6æPF_>ˆ0qåsøXÞI¤6Lðq€ªñ§•–µDMNûºÁYЏ)^(ã86øUî)h'â´Ì€³ôü<ЖuǺí€q üF[‡Ã#ÙyÁ¡ä¤Ó†¢2PiZÄsýV±í “ñj¦J3—GÞ‘òUQ¦…AÚŽmãàÖ‚ýXñ\Þù¢¥ƒ ¦¡6âÌ ¤cS%¤ûÏÿþ¯ÿñŽb§½s˜†Ã.=÷ÛóÄ~zÎS,“Ü~óHümïqì‰ZÕVSJ KÓtjÖ´(í¦òœ•å’Î`ßö.è°êh)q?NX;µK¹#n´`ÂÙoy‘ ƒä牣‹—qX*TsX…ðÉ[mJ•º±¥|üúõ+¦qÄ}žhìc-^_áÓ'2–|ÇĦ!9œXºY*9•‚m]©êš&Ä8`ÛD|Ǻ.úž (ÈI2¬ŽnÃ0j%•Ý8Nl¹k%AÈ28ü4pË`yþL b)ó4‘#mi$⽇óVÒkÓMOûß%½RamÇÂ騉=>z4Tî§eŒÖ´7vΣðZñžúéïßÿÄãþ d©µ¯»ÊnÏV±O²ÏÌà=ñFJurçDA®&{]wô³S¤xm= 3Ëý›¶­bcá5«êÄÖçfBñ‚S|v’Çq^ÔÇ]; Î:xçÕµ[Ú¹‰—c-'zrhæô< ODë”"íÇÿýQv"$ ¥ÍIEND®B`‚numptyphysics-0.3.10/platform/gl/000077500000000000000000000000001425065123200167605ustar00rootroot00000000000000numptyphysics-0.3.10/platform/gl/GLRenderer.cpp000066400000000000000000000531351425065123200214640ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "GLRenderer.h" #include "Config.h" #include "vector_math.h" #include "petals_log.h" #include #include #include struct fRect { fRect(float x1, float y1, float x2, float y2) : x1(x1), y1(y1), x2(x2), y2(y2) {} fRect(const Rect &r) : x1(r.tl.x), y1(r.tl.y), x2(r.br.x), y2(r.br.y) {} float x1, y1, x2, y2; }; struct FloatArray { FloatArray(const std::initializer_list &values) : data(static_cast(calloc(values.size(), sizeof(float)))) , size(values.size() * sizeof(float)) { int i = 0; for (auto &v: values) { data[i++] = v; } } FloatArray(float *data, size_t size) : data(static_cast(malloc(size))) , size(size) { memcpy(this->data, data, size); } FloatArray(const FloatArray &other) : data(static_cast(malloc(other.size))) , size(other.size) { memcpy(this->data, other.data, size); } FloatArray &operator=(const FloatArray &other) { free(data); this->data = static_cast(malloc(other.size)); memcpy(this->data, other.data, other.size); this->size = other.size; return *this; } ~FloatArray() { free(data); } float *data; size_t size; }; template struct Use { Use(const T &v) : v(v) { v->enable(); } ~Use() { v->disable(); } const T &v; }; template void with(const T &v, C callback) { Use use(v); callback(v); } class GLRendererPriv { public: GLRendererPriv(Vec2 world_size); ~GLRendererPriv(); void submitTextured(Glaserl::Texture &texture, const FloatArray &data); void submitRewind(Glaserl::Texture &texture, const FloatArray &data); void submitSaturation(Glaserl::Texture &texture, const FloatArray &data); void submitBlur(Glaserl::Texture &texture, const FloatArray &data); void submitPath(float *data, size_t size); void flush(); void setupProjection(Rect world_rect, Vec2 framebuffer_size, bool offscreen); private: void drawTextured(); void drawPath(); vmath::mat4 projection; Glaserl::Program textured_program; Glaserl::Buffer textured_buffer; Glaserl::Program blur_program; Glaserl::Buffer blur_buffer; Glaserl::Program path_program; Glaserl::Buffer path_buffer; Glaserl::Program rewind_program; Glaserl::Buffer rewind_buffer; Glaserl::Program saturation_program; Glaserl::Buffer saturation_buffer; enum ProgramType { NONE, TEXTURED, BLUR, PATH, REWIND, }; enum ProgramType active_program; Vec2 world_size; Vec2 framebuffer_size; Vec2 framebuffer_target_size; bool rotate90; Rect last_clip; friend class GLRenderer; }; const char *textured_vertex_shader_src = "attribute vec4 vtxcoord;\n" "attribute vec2 texcoord;\n" "uniform mat4 projection;\n" "varying vec2 tex;\n" "\n" "void main() {\n" " gl_Position = projection * vtxcoord;\n" " tex = texcoord;\n" "}\n" ; const char *textured_fragment_shader_src = "varying vec2 tex;\n" "uniform sampler2D texture;\n" "\n" "void main() {\n" " gl_FragColor = texture2D(texture, tex);\n" "}\n" ; const char *saturation_fragment_shader_src = "varying vec2 tex;\n" "uniform sampler2D texture;\n" "uniform float alpha;\n" "\n" "void main() {\n" " vec4 col = texture2D(texture, tex);\n" " float g = (col.r + col.g + col.b) / 3.0;\n" " gl_FragColor = alpha * col + (1.0 -alpha) * vec4(g, g, g, col.a);\n" "}\n" ; const char *blur_vertex_shader_src = "attribute vec4 vtxcoord;\n" "attribute vec2 texcoord;\n" "uniform mat4 projection;\n" "varying vec2 sample[7];\n" "uniform vec2 pixelgrid;\n" "\n" "void main() {\n" " gl_Position = projection * vtxcoord;\n" " sample[0] = texcoord;\n" " sample[1] = texcoord - 3.0 * pixelgrid;\n" " sample[2] = texcoord - 2.0 * pixelgrid;\n" " sample[3] = texcoord - 1.0 * pixelgrid;\n" " sample[4] = texcoord + 1.0 * pixelgrid;\n" " sample[5] = texcoord + 2.0 * pixelgrid;\n" " sample[6] = texcoord + 3.0 * pixelgrid;\n" "}\n" ; const char *blur_fragment_shader_src = "varying vec2 sample[7];\n" "uniform sampler2D texture;\n" "\n" "void main() {\n" " gl_FragColor.rgb = texture2D(texture, sample[1]).rgb * 0.006 +\n" " texture2D(texture, sample[2]).rgb * 0.061 +\n" " texture2D(texture, sample[3]).rgb * 0.242 +\n" " texture2D(texture, sample[0]).rgb * 0.383 +\n" " texture2D(texture, sample[4]).rgb * 0.242 +\n" " texture2D(texture, sample[5]).rgb * 0.061 +\n" " texture2D(texture, sample[6]).rgb * 0.006;\n" " gl_FragColor.a = 1.0;\n" "}\n" ; const char *rewind_vertex_shader_src = "attribute vec4 vtxcoord;\n" "attribute vec2 texcoord;\n" "uniform mat4 projection;\n" "varying vec2 tex;\n" "varying vec2 vtx;\n" "\n" "void main() {\n" " gl_Position = projection * vtxcoord;\n" " tex = texcoord;\n" " vtx = vtxcoord.xy;\n" "}\n" ; const char *rewind_fragment_shader_src = "varying vec2 tex;\n" "varying vec2 vtx;\n" "uniform sampler2D texture;\n" "uniform float time;\n" "uniform float alpha;\n" "uniform vec2 texsize;\n" "\n" "void main() {\n" " vec2 offset = tex;\n" // Wobbly " offset.x += alpha * 0.09 * pow(sin(vtx.y * 0.04 + time * 0.004), 30.0);\n" // Noise " offset.x += alpha * 0.003 * sin((vtx.y * 10000.0 + time * 100.0));\n" // Don't go offscreen left and right " offset.x = max(0.0, min(texsize.x - 0.01, offset.x));\n" " gl_FragColor = texture2D(texture, offset);\n" "}\n" ; const char *path_vertex_shader_src = "attribute vec4 vtxcoord;\n" "attribute vec4 color;\n" "uniform mat4 projection;\n" "varying vec4 col;\n" "\n" "void main() {\n" " gl_Position = projection * vtxcoord;\n" " col = color;\n" "}\n" ; const char *path_fragment_shader_src = "varying vec4 col;\n" "\n" "void main() {\n" " gl_FragColor = col;\n" "}\n" ; GLRendererPriv::GLRendererPriv(Vec2 world_size) : projection() , textured_program(Glaserl::program( textured_vertex_shader_src, textured_fragment_shader_src, // Attributes "vtxcoord", 2, "texcoord", 2, NULL, // Uniforms "projection", "texture", NULL)) , textured_buffer(Glaserl::buffer()) , blur_program(Glaserl::program( blur_vertex_shader_src, blur_fragment_shader_src, // Attributes "vtxcoord", 2, "texcoord", 2, NULL, // Uniforms "projection", "texture", "pixelgrid", NULL)) , blur_buffer(Glaserl::buffer()) , path_program(Glaserl::program( path_vertex_shader_src, path_fragment_shader_src, // Attributes "vtxcoord", 2, "color", 4, NULL, // Uniforms "projection", NULL)) , path_buffer(Glaserl::buffer()) , rewind_program(Glaserl::program( rewind_vertex_shader_src, rewind_fragment_shader_src, // Attributes "vtxcoord", 2, "texcoord", 2, NULL, // Uniforms "projection", "texture", "time", "alpha", "texsize", NULL)) , rewind_buffer(Glaserl::buffer()) , saturation_program(Glaserl::program( textured_vertex_shader_src, saturation_fragment_shader_src, // Attributes "vtxcoord", 2, "texcoord", 2, NULL, // Uniforms "projection", "texture", "alpha", NULL)) , saturation_buffer(Glaserl::buffer()) , active_program(NONE) , world_size(world_size) , framebuffer_size(world_size) , framebuffer_target_size(framebuffer_size) , rotate90(framebuffer_size.x < framebuffer_size.y) , last_clip(Rect(Vec2(0, 0), world_size)) { setupProjection(Rect(Vec2(0, 0), world_size), framebuffer_size, false); } GLRendererPriv::~GLRendererPriv() { } void GLRendererPriv::setupProjection(Rect world_rect, Vec2 framebuffer_size, bool offscreen) { framebuffer_target_size = framebuffer_size; projection = vmath::identity4(); // Only rotate by 90 degrees if we render directly to the screen if (framebuffer_target_size.x < framebuffer_target_size.y && !offscreen) { projection *= vmath::rotation_matrix(90.f, vmath::vec3(0.f, 0.f, -1.f)); std::swap(framebuffer_size.x, framebuffer_size.y); } // TODO: Zoom and center WORLD_WIDTH, WORLD_HEIGHT into available space if (offscreen) { projection *= vmath::ortho_matrix(0, framebuffer_size.x, 0, framebuffer_size.y, 0, 1); } else { projection *= vmath::ortho_matrix(0, framebuffer_size.x, framebuffer_size.y, 0, 0, 1); } if (!offscreen) { float w = framebuffer_size.x, W = world_rect.w(), wscale = w / W; float h = framebuffer_size.y, H = world_rect.h(), hscale = h / H; float scale = std::min(wscale, hscale); float xoffset = (w - W * scale) / 2.f; float yoffset = (h - H * scale) / 2.f; projection *= vmath::translation_matrix(xoffset, yoffset, 0.f); projection *= vmath::scaling_matrix(scale, scale, 1.f); } auto m = vmath::transpose(projection); for (auto p: {textured_program, blur_program, path_program, rewind_program, saturation_program}) { with (p, [&m] (const Glaserl::Program &program) { glUniformMatrix4fv(program->uniform_location("projection"), 1, GL_FALSE, m); }); } } void GLRendererPriv::submitTextured(Glaserl::Texture &texture, const FloatArray &data) { if (active_program != NONE) { flush(); } textured_buffer->append(data.data, data.size); with(texture, [this] (const Glaserl::Texture &texture) { Glaserl::Util::render_triangle_strip(textured_program, textured_buffer); }); } void GLRendererPriv::submitBlur(Glaserl::Texture &texture, const FloatArray &data) { if (active_program != NONE) { flush(); } blur_buffer->append(data.data, data.size); with(texture, [this] (const Glaserl::Texture &texture) { Glaserl::Util::render_triangle_strip(blur_program, blur_buffer); }); } void GLRendererPriv::submitRewind(Glaserl::Texture &texture, const FloatArray &data) { if (active_program != NONE) { flush(); } rewind_buffer->append(data.data, data.size); with(texture, [this] (const Glaserl::Texture &texture) { Glaserl::Util::render_triangle_strip(rewind_program, rewind_buffer); }); } void GLRendererPriv::submitSaturation(Glaserl::Texture &texture, const FloatArray &data) { if (active_program != NONE) { flush(); } saturation_buffer->append(data.data, data.size); with(texture, [this] (const Glaserl::Texture &texture) { Glaserl::Util::render_triangle_strip(saturation_program, saturation_buffer); }); } void GLRendererPriv::submitPath(float *data, size_t size) { if (active_program != PATH) { flush(); } path_buffer->append(data, size); active_program = PATH; } void GLRendererPriv::drawPath() { Glaserl::Util::render_triangle_strip(path_program, path_buffer); active_program = NONE; } void GLRendererPriv::flush() { if (active_program == PATH) { drawPath(); } } GLTextureData::GLTextureData(unsigned char *pixels, int width, int height) : NP::TextureData(width, height) , texture(Glaserl::texture(pixels, width, height)) { } GLTextureData::GLTextureData(Glaserl::Texture texture) : NP::TextureData(texture->width(), texture->height()) , texture(texture) { } GLTextureData::~GLTextureData() { } GLFramebufferData::GLFramebufferData(int w, int h) : NP::FramebufferData(w, h) , framebuffer(Glaserl::framebuffer(w, h)) { } GLFramebufferData::~GLFramebufferData() { } GLRenderer::GLRenderer(Vec2 world_size) : _world_size(world_size) , priv(nullptr) { } GLRenderer::~GLRenderer() { delete priv; } void GLRenderer::init(Vec2 framebuffer_size) { priv = new GLRendererPriv(_world_size); glClearColor(0.f, 0.f, 0.f, 1.f); Glaserl::Util::default_blend(); Glaserl::Util::enable_scissor(true); priv->framebuffer_size = framebuffer_size; priv->rotate90 = (priv->framebuffer_size.x < priv->framebuffer_size.y); } Vec2 GLRenderer::framebuffer_size() { if (priv->rotate90) { return Vec2(priv->framebuffer_size.y, priv->framebuffer_size.x); } return priv->framebuffer_size; } Vec2 GLRenderer::world_size() { return priv->world_size; } void GLRenderer::mapXY(int &x, int &y) { auto fbsize = vmath::vec2(priv->framebuffer_size.x, priv->framebuffer_size.y); auto pos = (vmath::vec2(x, y) / fbsize) * 2.f - vmath::vec2(1.0f, 1.0f); pos.y *= -1.f; vmath::vec3 pos3(pos, 0.f); pos3 = vmath::transform_point(vmath::inverse(priv->projection), pos3); x = pos3.x; y = pos3.y; } void GLRenderer::projectXY(int &x, int &y) { auto fbsize = vmath::vec2(priv->framebuffer_target_size.x, priv->framebuffer_target_size.y); auto pos3 = vmath::transform_point(priv->projection, vmath::vec3(x, y, 0.f)); auto pos = (vmath::vec2(pos3.x, pos3.y) / 2.f + vmath::vec2(0.5f, 0.5f)) * fbsize; x = pos.x; y = pos.y; } NP::Texture GLRenderer::load(unsigned char *pixels, int w, int h) { return NP::Texture(new GLTextureData(pixels, w, h)); } NP::Framebuffer GLRenderer::framebuffer(Vec2 size) { return NP::Framebuffer(new GLFramebufferData(size.x, size.y)); } void GLRenderer::begin(NP::Framebuffer &rendertarget, Rect world_rect) { GLFramebufferData *data = static_cast(rendertarget.get()); data->framebuffer->enable(); priv->setupProjection(world_rect, Vec2(data->w, data->h), true); } void GLRenderer::end(NP::Framebuffer &rendertarget) { GLFramebufferData *data = static_cast(rendertarget.get()); data->framebuffer->disable(); priv->setupProjection(Rect(Vec2(0, 0), priv->world_size), priv->framebuffer_size, false); } NP::Texture GLRenderer::retrieve(NP::Framebuffer &rendertarget) { GLFramebufferData *data = static_cast(rendertarget.get()); return NP::Texture(new GLTextureData(data->framebuffer->texture)); } Rect GLRenderer::clip(Rect rect) { int x1 = rect.tl.x; int y1 = rect.tl.y; int x2 = rect.br.x; int y2 = rect.br.y; projectXY(x1, y1); projectXY(x2, y2); if (x1 > x2) { std::swap(x1, x2); } if (y1 > y2) { std::swap(y1, y2); } int w = x2 - x1; int h = y2 - y1; Glaserl::Util::set_scissor(x1, y1, w, h); std::swap(rect, priv->last_clip); return rect; } void GLRenderer::image(const NP::Texture &texture, int x, int y, int w, int h) { GLTextureData *data = static_cast(texture.get()); Rect src(0, 0, data->texture->width(), data->texture->height()); Rect dst(x, y, x+w, y+h); subimage(texture, src, dst); } static fRect mapTexture(const NP::Texture &texture, const Rect &src) { GLTextureData *data = static_cast(texture.get()); float w = data->texture->width(); float h = data->texture->height(); float tx1 = float(src.tl.x) / w; float ty1 = float(src.tl.y) / h; data->texture->map_uv(tx1, ty1); float tx2 = float(src.br.x) / w; float ty2 = float(src.br.y) / h; data->texture->map_uv(tx2, ty2); return fRect(tx1, ty1, tx2, ty2); } static FloatArray vtxtex(const fRect &vtx, const fRect &tex) { return FloatArray({ vtx.x1, vtx.y1, tex.x1, tex.y1, vtx.x1, vtx.y2, tex.x1, tex.y2, vtx.x2, vtx.y1, tex.x2, tex.y1, vtx.x2, vtx.y2, tex.x2, tex.y2, }); } void GLRenderer::subimage(const NP::Texture &texture, const Rect &src, const Rect &dst) { GLTextureData *data = static_cast(texture.get()); priv->submitTextured(data->texture, vtxtex(dst, mapTexture(texture, src))); } void GLRenderer::blur(const NP::Texture &texture, const Rect &src, const Rect &dst, float rx, float ry) { GLTextureData *data = static_cast(texture.get()); rx /= data->texture->width(); ry /= data->texture->height(); data->texture->map_uv(rx, ry); with(priv->blur_program, [rx, ry] (const Glaserl::Program &program) { glUniform2f(program->uniform_location("pixelgrid"), rx, ry); }); priv->submitBlur(data->texture, vtxtex(dst, mapTexture(texture, src))); } void GLRenderer::rewind(const NP::Texture &texture, const Rect &src, const Rect &dst, float t, float a) { GLTextureData *data = static_cast(texture.get()); float tx = 1.f; float ty = 1.f; data->texture->map_uv(tx, ty); with(priv->rewind_program, [t, a, tx, ty] (const Glaserl::Program &program) { glUniform1f(program->uniform_location("time"), t); glUniform1f(program->uniform_location("alpha"), a); glUniform2f(program->uniform_location("texsize"), tx, ty); }); priv->submitRewind(data->texture, vtxtex(dst, mapTexture(texture, src))); } void GLRenderer::saturation(const NP::Texture &texture, const Rect &src, const Rect &dst, float a) { GLTextureData *data = static_cast(texture.get()); with(priv->saturation_program, [a] (const Glaserl::Program &program) { glUniform1f(program->uniform_location("alpha"), a); }); priv->submitSaturation(data->texture, vtxtex(dst, mapTexture(texture, src))); } static void rgba_split(int rgba, float &r, float &g, float &b, float &a) { a = ((rgba & 0xff000000) >> 24) / 255.; r = ((rgba & 0x00ff0000) >> 16) / 255.; g = ((rgba & 0x0000ff00) >> 8) / 255.; b = ((rgba & 0x000000ff)) / 255.; } void GLRenderer::rectangle(const Rect &rect, int rgba, bool fill) { if (!fill) { Vec2 corners[] = { rect.tl, rect.tr(), rect.br, rect.bl(), rect.tl }; Path p(5, corners); path(p, rgba); return; } float r, g, b, a; rgba_split(rgba, r, g, b, a); float vtxcoords[] = { (float)rect.tl.x, (float)rect.tl.y, r, g, b, a, (float)rect.tl.x, (float)rect.tl.y, r, g, b, a, (float)rect.tl.x, (float)rect.br.y, r, g, b, a, (float)rect.br.x, (float)rect.tl.y, r, g, b, a, (float)rect.br.x, (float)rect.br.y, r, g, b, a, (float)rect.br.x, (float)rect.br.y, r, g, b, a, }; priv->submitPath(vtxcoords, sizeof(vtxcoords)); } static float * make_segment(b2Vec2 aa, b2Vec2 a, b2Vec2 b, b2Vec2 bb) { static b2Vec2 data[10]; b2Vec2 a_to_b = 0.5 * (b - a) + 0.5 * (a - aa); a_to_b.Normalize(); b2Vec2 a_to_b_90(-a_to_b.y, a_to_b.x); b2Vec2 b_to_a = 0.5 * (bb - b) + 0.5 * (b - a); b_to_a.Normalize(); b2Vec2 b_to_a_90(-b_to_a.y, b_to_a.x); float w = 0.9; float e = 1.0; int offset = 0; data[offset++] = a + a_to_b_90 * (w + e); data[offset++] = a + a_to_b_90 * (w + e); data[offset++] = b + b_to_a_90 * (w + e); data[offset++] = a + a_to_b_90 * w; data[offset++] = b + b_to_a_90 * w; data[offset++] = a - a_to_b_90 * w; data[offset++] = b - b_to_a_90 * w; data[offset++] = a - a_to_b_90 * (w + e); data[offset++] = b - b_to_a_90 * (w + e); data[offset++] = b - b_to_a_90 * (w + e); return &(data[0].x); } void GLRenderer::path(const Path &path, int rgba) { float r, g, b, a; rgba_split(rgba, r, g, b, a); if (path.numPoints() < 2) { return; } int segments = path.numPoints() - 1; int points_len = (2 + 4) * 10 * segments; float *points = new float[points_len]; int offset = 0; for (int i=0; i P2 float *segment = make_segment( (i > 0) ? path[i-1] : path[i], path[i], path[i+1], (i < segments - 1) ? path[i+2] : path[i+1] ); int soffset = 0; for (int j=0; j<10; j++) { // Vertices points[offset++] = segment[soffset++]; points[offset++] = segment[soffset++]; // Color points[offset++] = r; points[offset++] = g; points[offset++] = b; if ((j < 3 || j > 6)) { // Transparent points[offset++] = 0.f; } else { // Filled points[offset++] = a; } } } priv->submitPath(points, points_len * sizeof(float)); delete points; } void GLRenderer::clear() { Glaserl::Util::enable_scissor(false); glClear(GL_COLOR_BUFFER_BIT); Glaserl::Util::enable_scissor(true); } void GLRenderer::flush() { priv->flush(); } numptyphysics-0.3.10/platform/gl/GLRenderer.h000066400000000000000000000047541425065123200211340ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_GLRENDERER_H #define NUMPTYPHYSICS_GLRENDERER_H #include "Renderer.h" #include "glaserlxx.h" class GLTextureData : public NP::TextureData { public: GLTextureData(unsigned char *pixels, int width, int height); GLTextureData(Glaserl::Texture texture); ~GLTextureData(); Glaserl::Texture texture; }; class GLFramebufferData : public NP::FramebufferData { public: GLFramebufferData(int width, int height); ~GLFramebufferData(); Glaserl::Framebuffer framebuffer; }; class GLRendererPriv; class GLRenderer : public NP::Renderer { public: GLRenderer(Vec2 world_size); ~GLRenderer(); void init(Vec2 framebuffer_size); void mapXY(int &x, int &y); void projectXY(int &x, int &y); virtual Vec2 framebuffer_size(); virtual Vec2 world_size(); virtual NP::Texture load(unsigned char *pixels, int w, int h); virtual NP::Framebuffer framebuffer(Vec2 size); virtual void begin(NP::Framebuffer &rendertarget, Rect world_rect); virtual void end(NP::Framebuffer &rendertarget); virtual NP::Texture retrieve(NP::Framebuffer &rendertarget); virtual Rect clip(Rect rect); virtual void image(const NP::Texture &texture, int x, int y, int w, int h); virtual void subimage(const NP::Texture &texture, const Rect &src, const Rect &dst); virtual void blur(const NP::Texture &texture, const Rect &src, const Rect &dst, float rx, float ry); virtual void rewind(const NP::Texture &texture, const Rect &src, const Rect &dst, float t, float a); virtual void saturation(const NP::Texture &texture, const Rect &src, const Rect &dst, float a); virtual void rectangle(const Rect &r, int rgba, bool fill); virtual void path(const Path &p, int rgba); virtual void clear(); virtual void flush(); private: Vec2 _world_size; GLRendererPriv *priv; }; #endif /* NUMPTYPHYSICS_GLRENDERER_H */ numptyphysics-0.3.10/platform/gl/gl.mk000066400000000000000000000004511425065123200177130ustar00rootroot00000000000000# OpenGL library ifeq ($(shell uname),Darwin) LIBS += -framework OpenGL else ifneq ($(PLATFORM),mingw) ifeq ($(PLATFORM_GL_GLES),1) $(eval $(call add_pkgconfig,glesv2)) CFLAGS += -DUSE_OPENGL_ES CXXFLAGS += -DUSE_OPENGL_ES else $(eval $(call add_pkgconfig,gl)) endif else LIBS += -lopengl32 endif numptyphysics-0.3.10/platform/mingw/000077500000000000000000000000001425065123200174775ustar00rootroot00000000000000numptyphysics-0.3.10/platform/mingw/platform.in000066400000000000000000000014541425065123200216570ustar00rootroot00000000000000# Platform build definition for mingw # Will be processed by makefile CC := i686-w64-mingw32-gcc CXX := i686-w64-mingw32-g++ export CC CXX APP := $(APP).exe GENERATED_HEADERS += external/glaserl/gl.h DISTCLEAN_FILES += external/glaserl/gl.[ch] add_platform(freedesktop) add_platform(gl) CXXFLAGS += -ISDL2_ttf-2.0.15/i686-w64-mingw32/include/SDL2 LIBS += -LSDL2_ttf-2.0.15/i686-w64-mingw32/lib -lSDL2_ttf.dll CXXFLAGS += -ISDL2_image-2.0.5/i686-w64-mingw32/include/SDL2 LIBS += -LSDL2_image-2.0.5/i686-w64-mingw32/lib -lSDL2_image.dll CXXFLAGS += -ISDL2-2.0.14/i686-w64-mingw32/include/SDL2 LIBS += -LSDL2-2.0.14/i686-w64-mingw32/lib -lmingw32 -lSDL2main -lSDL2.dll SOURCES += $(wildcard platform/sdl2/*.cpp) CXXFLAGS += -Iplatform/sdl2 include platform/gl/gl.mk include platform/freedesktop/install.mk numptyphysics-0.3.10/platform/sdl1/000077500000000000000000000000001425065123200172215ustar00rootroot00000000000000numptyphysics-0.3.10/platform/sdl1/OsSDL1.cpp000066400000000000000000000021711425065123200207330ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "App.h" #include "Os.h" #include "OsSDLSTB.h" class OsSDL1 : public OsSDLSTB { public: OsSDL1() : OsSDLSTB() { } virtual bool openBrowser(const char *url) { return false; } virtual std::string userDataDir() { return ".numptyphysics-data-sdl1"; } }; int main(int argc, char** argv) { std::shared_ptr os(new OsSDL1()); std::shared_ptr mainloop(npmain(argc, argv)); while (mainloop->step()); return 0; } numptyphysics-0.3.10/platform/sdl1/platform.in000066400000000000000000000002651425065123200214000ustar00rootroot00000000000000# Platform build definition for SDL1 # Will be processed by makefile add_platform(gl) add_platform(sdlstb) add_external(stb_loader) add_pkgconfig(sdl) include platform/gl/gl.mk numptyphysics-0.3.10/platform/sdl2/000077500000000000000000000000001425065123200172225ustar00rootroot00000000000000numptyphysics-0.3.10/platform/sdl2/OsSDL2.cpp000066400000000000000000000112711425065123200207360ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "OsFreeDesktop.h" #include "App.h" #include "thp_format.h" #include "SDL2Renderer.h" #include "SDL.h" static int mapSDLKeyToNumptyKey(int key) { switch (key) { case SDLK_SPACE: return NUMPTYKEY_SPACE; case SDLK_RETURN: return NUMPTYKEY_RETURN; case SDLK_ESCAPE: return NUMPTYKEY_ESCAPE; case SDLK_BACKSPACE: return NUMPTYKEY_BACKSPACE; case SDLK_DOWN: return NUMPTYKEY_DOWN; case SDLK_UP: return NUMPTYKEY_UP; case SDLK_LEFT: return NUMPTYKEY_LEFT; case SDLK_RIGHT: return NUMPTYKEY_RIGHT; case SDLK_u: return NUMPTYKEY_u; case SDLK_s: return NUMPTYKEY_s; case SDLK_m: return NUMPTYKEY_m; case SDLK_e: return NUMPTYKEY_e; case SDLK_r: return NUMPTYKEY_r; case SDLK_n: return NUMPTYKEY_n; case SDLK_p: return NUMPTYKEY_p; case SDLK_v: return NUMPTYKEY_v; case SDLK_q: return NUMPTYKEY_q; case SDLK_F4: return NUMPTYKEY_F4; case SDLK_F6: return NUMPTYKEY_F6; case SDLK_F7: return NUMPTYKEY_F7; default: return NUMPTYKEY_NONE; } return NUMPTYKEY_NONE; } static void mapSDLEventToToolkitEvent(SDL_Event &e, ToolkitEvent &ev) { switch (e.type) { case SDL_MOUSEBUTTONDOWN: ev.type = ToolkitEvent::PRESS; ev.x = e.button.x; ev.y = e.button.y; ev.finger = e.button.which; ev.key = e.button.button; break; case SDL_MOUSEBUTTONUP: ev.type = ToolkitEvent::RELEASE; ev.x = e.button.x; ev.y = e.button.y; ev.finger = e.button.which; ev.key = e.button.button; break; case SDL_MOUSEMOTION: ev.type = ToolkitEvent::MOVE; ev.x = e.motion.x; ev.y = e.motion.y; ev.finger = e.motion.which; ev.key = e.motion.state; break; case SDL_FINGERDOWN: ev.type = ToolkitEvent::PRESS; ev.x = e.tfinger.x; ev.y = e.tfinger.y; ev.finger = 0;//e.tfinger.fingerId; ev.key = 1; break; case SDL_FINGERUP: ev.type = ToolkitEvent::RELEASE; ev.x = e.tfinger.x; ev.y = e.tfinger.y; ev.finger = 0;//e.tfinger.fingerId; ev.key = 1; break; case SDL_FINGERMOTION: ev.type = ToolkitEvent::MOVE; ev.x = e.tfinger.x; ev.y = e.tfinger.y; ev.finger = 0;//e.tfinger.fingerId; ev.key = 1; break; case SDL_KEYDOWN: ev.type = ToolkitEvent::KEYDOWN; ev.x = ev.y = ev.finger = 0; ev.key = mapSDLKeyToNumptyKey(e.key.keysym.sym); break; case SDL_QUIT: ev.type = ToolkitEvent::QUIT; break; default: ev.type = ToolkitEvent::NONE; break; } } class OsSDL2 : public OsFreeDesktop { public: OsSDL2() : OsFreeDesktop() , m_renderer(nullptr) { } virtual void init() { if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Couldn't initialize SDL2: %s\n", SDL_GetError()); exit(1); } } virtual void window(Vec2 world_size) { if (!m_renderer) { m_renderer = new SDL2Renderer(world_size); } } virtual NP::Renderer *renderer() { return m_renderer; } virtual bool nextEvent(ToolkitEvent &ev) { SDL_Event e; if (SDL_PollEvent(&e)) { mapSDLEventToToolkitEvent(e, ev); m_renderer->mapXY(ev.x, ev.y); return true; } return false; } virtual long ticks() { return SDL_GetTicks(); } virtual void delay(int ms) { SDL_Delay(ms); } private: SDL2Renderer *m_renderer; }; int main(int argc, char** argv) { std::shared_ptr os(new OsSDL2()); std::shared_ptr mainloop(npmain(argc, argv)); while (mainloop->step()); return 0; } numptyphysics-0.3.10/platform/sdl2/SDL2Renderer.cpp000066400000000000000000000104761425065123200221310ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "SDL2Renderer.h" #include "Os.h" #include "Config.h" #include "petals_log.h" #include #include class SDLFontData : public NP::FontData { public: SDLFontData(const char *filename, int size); ~SDLFontData(); TTF_Font *m_font; }; SDLFontData::SDLFontData(const char *filename, int size) : NP::FontData(size) , m_font(TTF_OpenFont(filename, size)) { } SDLFontData::~SDLFontData() { TTF_CloseFont(m_font); } SDL2Renderer::SDL2Renderer(Vec2 world_size) : GLRenderer(world_size) , m_window(nullptr) , m_pixelformat(nullptr) , m_gl_context() , m_texture_cache() { //Vec2 framebuffer_size(900, 480); //Vec2 framebuffer_size(480, 800); Vec2 framebuffer_size(800, 480); m_window = SDL_CreateWindow("NumptyPhysics", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, framebuffer_size.x, framebuffer_size.y, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); m_pixelformat = SDL_AllocFormat(SDL_GetWindowPixelFormat(m_window)); m_gl_context = SDL_GL_CreateContext(m_window); // Query real window size (for fullscreen windows) SDL_GetWindowSize(m_window, &framebuffer_size.x, &framebuffer_size.y); GLRenderer::init(framebuffer_size); TTF_Init(); } SDL2Renderer::~SDL2Renderer() { SDL_GL_DeleteContext(m_gl_context); SDL_FreeFormat(m_pixelformat); SDL_DestroyWindow(m_window); } NP::Texture SDL2Renderer::load(const char *filename, bool cache) { std::string fn(filename); if (cache) { // Cache lookup for (auto &item: m_texture_cache) { if (item.first == fn) { return item.second; } } } std::string f = Config::findFile(filename); SDL_Surface *img = IMG_Load(f.c_str()); if (!img) { LOG_FATAL("Could not load image file '%s'", f.c_str()); } SDL_Surface *tmp = SDL_ConvertSurfaceFormat(img, SDL_PIXELFORMAT_ABGR8888, 0); SDL_FreeSurface(img); NP::Texture result = GLRenderer::load((unsigned char *)tmp->pixels, img->w, img->h); SDL_FreeSurface(tmp); if (cache) { // Store loaded image in cache m_texture_cache[fn] = result; } return result; } NP::Font SDL2Renderer::load(const char *filename, int size) { return NP::Font(new SDLFontData(filename, size)); } void SDL2Renderer::metrics(const NP::Font &font, const char *text, int *width, int *height) { SDLFontData *data = static_cast(font.get()); TTF_SizeUTF8(data->m_font, text, width, height); } NP::Texture SDL2Renderer::text(const NP::Font &font, const char *text, int rgb) { if (strlen(text) == 0) { return NP::Texture(new GLTextureData(nullptr, 10, 10)); } SDLFontData *data = static_cast(font.get()); int r = (Uint8)((rgb >> 16) & 0xff); int g = (Uint8)((rgb >> 8) & 0xff); int b = (Uint8)((rgb) & 0xff); union { Uint32 value; SDL_Color color; } fg; fg.value = SDL_MapRGB(m_pixelformat, r, g, b); SDL_Surface *surface = TTF_RenderUTF8_Blended(data->m_font, text, fg.color); // Recent versions of SDL2_ttf have no more tightly-packed pixels std::vector pixels(surface->w * surface->h); for (int y=0; yh; ++y) { memcpy(pixels.data() + y * surface->w, (const uint8_t *)surface->pixels + y * surface->pitch, sizeof(uint32_t) * surface->w); } NP::Texture result = GLRenderer::load((unsigned char *)pixels.data(), surface->w, surface->h); SDL_FreeSurface(surface); return result; } void SDL2Renderer::swap() { SDL_GL_SwapWindow(m_window); } numptyphysics-0.3.10/platform/sdl2/SDL2Renderer.h000066400000000000000000000026351425065123200215740ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_SDL2RENDERER_H #define NUMPTYPHYSICS_SDL2RENDERER_H #include #include #include "Renderer.h" #include "GLRenderer.h" #include class SDL2Renderer : public GLRenderer { public: SDL2Renderer(Vec2 world_size); ~SDL2Renderer(); virtual NP::Texture load(const char *filename, bool cache); virtual NP::Font load(const char *filename, int size); virtual void metrics(const NP::Font &font, const char *text, int *width, int *height); virtual NP::Texture text(const NP::Font &font, const char *text, int rgb); virtual void swap(); private: SDL_Window *m_window; SDL_PixelFormat *m_pixelformat; SDL_GLContext m_gl_context; std::map m_texture_cache; }; #endif /* NUMPTYPHYSICS_SDL2RENDERER_H */ numptyphysics-0.3.10/platform/sdl2/platform.in000066400000000000000000000004221425065123200213740ustar00rootroot00000000000000# Platform build definition for SDL2 # Will be processed by makefile add_platform(freedesktop) add_platform(gl) add_pkgconfig(sdl2) add_pkgconfig(SDL2_image) add_pkgconfig(SDL2_ttf) add_pkgconfig(gio-2.0) include platform/gl/gl.mk include platform/freedesktop/install.mk numptyphysics-0.3.10/platform/sdlstb/000077500000000000000000000000001425065123200176515ustar00rootroot00000000000000numptyphysics-0.3.10/platform/sdlstb/OsSDLSTB.h000066400000000000000000000107101425065123200213160ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "App.h" #include "Os.h" #include "SDLSTBRenderer.h" #include "SDL.h" static int mapSDLKeyToNumptyKey(int key) { switch (key) { case SDLK_SPACE: return NUMPTYKEY_SPACE; case SDLK_RETURN: return NUMPTYKEY_RETURN; case SDLK_ESCAPE: return NUMPTYKEY_ESCAPE; case SDLK_BACKSPACE: return NUMPTYKEY_BACKSPACE; case SDLK_DOWN: return NUMPTYKEY_DOWN; case SDLK_UP: return NUMPTYKEY_UP; case SDLK_LEFT: return NUMPTYKEY_LEFT; case SDLK_RIGHT: return NUMPTYKEY_RIGHT; case SDLK_u: return NUMPTYKEY_u; case SDLK_s: return NUMPTYKEY_s; case SDLK_m: return NUMPTYKEY_m; case SDLK_e: return NUMPTYKEY_e; case SDLK_r: return NUMPTYKEY_r; case SDLK_n: return NUMPTYKEY_n; case SDLK_p: return NUMPTYKEY_p; case SDLK_v: return NUMPTYKEY_v; case SDLK_q: return NUMPTYKEY_q; case SDLK_F4: return NUMPTYKEY_F4; case SDLK_F6: return NUMPTYKEY_F6; case SDLK_F7: return NUMPTYKEY_F7; default: return NUMPTYKEY_NONE; } return NUMPTYKEY_NONE; } static void mapSDLEventToToolkitEvent(SDL_Event &e, ToolkitEvent &ev) { switch (e.type) { case SDL_MOUSEBUTTONDOWN: ev.type = ToolkitEvent::PRESS; ev.x = e.button.x; ev.y = e.button.y; #if defined(EMSCRIPTEN) ev.finger = 0; #else ev.finger = e.button.which; #endif /* defined(EMSCRIPTEN) */ ev.key = e.button.button; break; case SDL_MOUSEBUTTONUP: ev.type = ToolkitEvent::RELEASE; ev.x = e.button.x; ev.y = e.button.y; #if defined(EMSCRIPTEN) ev.finger = 0; #else ev.finger = e.button.which; #endif /* defined(EMSCRIPTEN) */ ev.key = e.button.button; break; case SDL_MOUSEMOTION: ev.type = ToolkitEvent::MOVE; ev.x = e.motion.x; ev.y = e.motion.y; #if defined(EMSCRIPTEN) ev.finger = 0; #else ev.finger = e.motion.which; #endif /* defined(EMSCRIPTEN) */ ev.key = e.motion.state; break; case SDL_KEYDOWN: ev.type = ToolkitEvent::KEYDOWN; ev.x = ev.y = ev.finger = 0; ev.key = mapSDLKeyToNumptyKey(e.key.keysym.sym); break; case SDL_VIDEORESIZE: ev.type = ToolkitEvent::RESIZE; ev.x = e.resize.w; ev.y = e.resize.h; break; case SDL_QUIT: ev.type = ToolkitEvent::QUIT; break; default: ev.type = ToolkitEvent::NONE; break; } } class OsSDLSTB : public Os { public: OsSDLSTB() : Os() , m_renderer(nullptr) { } virtual void init() { if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); exit(1); } } virtual void window(Vec2 world_size) { if (!m_renderer) { m_renderer = new SDLSTBRenderer(world_size, world_size); } } virtual NP::Renderer *renderer() { return m_renderer; } virtual bool nextEvent(ToolkitEvent &ev) { SDL_Event e; if (SDL_PollEvent(&e)) { mapSDLEventToToolkitEvent(e, ev); m_renderer->mapXY(ev.x, ev.y); if (ev.type == ToolkitEvent::RESIZE) { Vec2 world_size = m_renderer->world_size(); delete m_renderer; m_renderer = new SDLSTBRenderer(world_size, Vec2(ev.x, ev.y)); } return true; } return false; } virtual long ticks() { return SDL_GetTicks(); } virtual void delay(int ms) { SDL_Delay(ms); } private: SDLSTBRenderer *m_renderer; }; numptyphysics-0.3.10/platform/sdlstb/SDLSTBRenderer.cpp000066400000000000000000000070141425065123200230410ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "SDLSTBRenderer.h" #include "Os.h" #include "Config.h" #include "stb_loader.h" class EmscriptenFontData : public NP::FontData { public: EmscriptenFontData(const char *filename, int size); ~EmscriptenFontData(); std::string filename; }; EmscriptenFontData::EmscriptenFontData(const char *filename, int size) : NP::FontData(size) , filename(filename) { } EmscriptenFontData::~EmscriptenFontData() { } SDLSTBRenderer::SDLSTBRenderer(Vec2 world_size, Vec2 framebuffer_size) : GLRenderer(world_size) , m_surface(nullptr) , m_texture_cache() { m_surface = SDL_SetVideoMode(framebuffer_size.x, framebuffer_size.y, 0, SDL_OPENGL | SDL_RESIZABLE); // Query real window size (for fullscreen windows) framebuffer_size.x = m_surface->w; framebuffer_size.y = m_surface->h; GLRenderer::init(framebuffer_size); } SDLSTBRenderer::~SDLSTBRenderer() { } NP::Texture SDLSTBRenderer::load(const char *filename, bool cache) { std::string fn(filename); if (cache) { // Cache lookup for (auto &item: m_texture_cache) { if (item.first == fn) { return item.second; } } } Blob *blob = Config::readBlob(filename); StbLoader_RGBA *rgba = StbLoader::decode_image(blob->data, blob->len); delete blob; NP::Texture result = GLRenderer::load((unsigned char *)rgba->data, rgba->w, rgba->h); delete rgba; if (cache) { // Store loaded image in cache m_texture_cache[fn] = result; } return result; } NP::Font SDLSTBRenderer::load(const char *filename, int size) { return NP::Font(new EmscriptenFontData(filename, size)); } void SDLSTBRenderer::metrics(const NP::Font &font, const char *text, int *width, int *height) { EmscriptenFontData *data = static_cast(font.get()); Blob *blob = Config::readBlob(data->filename); StbLoader_RGBA *rgba = StbLoader::render_font(blob->data, blob->len, StbLoader_Color(0.f, 0.f, 0.f, 1.f), data->size, text); *width = rgba->w; *height = rgba->h; delete rgba; delete blob; } NP::Texture SDLSTBRenderer::text(const NP::Font &font, const char *text, int rgb) { if (strlen(text) == 0) { return NP::Texture(new GLTextureData(nullptr, 10, 10)); } EmscriptenFontData *data = static_cast(font.get()); float r = 1.f * (Uint8)((rgb >> 16) & 0xff) / 255.f; float g = 1.f * (Uint8)((rgb >> 8) & 0xff) / 255.f; float b = 1.f * (Uint8)((rgb) & 0xff) / 255.f; Blob *blob = Config::readBlob(data->filename); StbLoader_RGBA *rgba = StbLoader::render_font(blob->data, blob->len, StbLoader_Color(r, g, b, 1.f), data->size, text); NP::Texture result = GLRenderer::load((unsigned char *)rgba->data, rgba->w, rgba->h); delete rgba; delete blob; return result; } void SDLSTBRenderer::swap() { SDL_GL_SwapBuffers(); } numptyphysics-0.3.10/platform/sdlstb/SDLSTBRenderer.h000066400000000000000000000025761425065123200225160ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_SDLSTBRENDERER_H #define NUMPTYPHYSICS_SDLSTBRENDERER_H #include #include #include "Renderer.h" #include "GLRenderer.h" #include class SDLSTBRenderer : public GLRenderer { public: SDLSTBRenderer(Vec2 world_size, Vec2 framebuffer_size); ~SDLSTBRenderer(); virtual NP::Texture load(const char *filename, bool cache); virtual NP::Font load(const char *filename, int size); virtual void metrics(const NP::Font &font, const char *text, int *width, int *height); virtual NP::Texture text(const NP::Font &font, const char *text, int rgb); virtual void swap(); private: SDL_Surface *m_surface; std::map m_texture_cache; }; #endif /* NUMPTYPHYSICS_SDLSTBRENDERER_H */ numptyphysics-0.3.10/platform/sdlstb/platform.in000066400000000000000000000001571425065123200220300ustar00rootroot00000000000000# Platform build definition for SDL1 with STB_Loader # Will be processed by makefile add_external(stb_loader) numptyphysics-0.3.10/src/000077500000000000000000000000001425065123200153215ustar00rootroot00000000000000numptyphysics-0.3.10/src/Accelerometer.h000066400000000000000000000016141425065123200202460ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009 Tim Edmonds * Coyright (c) 2012, 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef ACCELEROMETER_H #define ACCELEROMETER_H #include "Common.h" class Accelerometer { public: // in Gs virtual bool poll( float32& gx, float32& gy, float32& gz )=0; }; #endif //ACCELEROMETER_H numptyphysics-0.3.10/src/App.cpp000066400000000000000000000074051425065123200165530ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Common.h" #include "Config.h" #include "Game.h" #include "Scene.h" #include "Levels.h" #include "Canvas.h" #include "Ui.h" #include "Font.h" #include "Dialogs.h" #include "Event.h" #include "thp_timestep.h" #include "thp_format.h" #include "petals_log.h" #include #include #include #include class App : private Container, public MainLoop { int m_width; int m_height; bool m_quit; Window *m_window; thp::Timestep m_timestep; public: App(int argc, char** argv) : m_width(WORLD_WIDTH) , m_height(WORLD_HEIGHT) , m_quit(false) , m_window(NULL) , m_timestep(ITERATION_RATE) { OS->ensurePath(OS->userDataDir()); OS->init(); setEventMap(APP_MAP); for (int i=0; iuserDataDir()}); levels->dump(); add( createGameLayer( levels, m_width, m_height ), 0, 0 ); } ~App() { delete m_window; } const char* name() {return "App";} private: void render() { auto world = OS->renderer()->world_rect(); m_window->clip(world); m_window->clear(); draw(*m_window, world); m_window->update(); } bool processEvent(ToolkitEvent &ev) { switch (ev.type) { case ToolkitEvent::QUIT: m_quit = true; return true; case ToolkitEvent::KEYDOWN: switch (ev.key) { case 'q': m_quit = true; return true; case '3': LOG_DEBUG("UI: %s", toString().c_str()); return true; default: break; } case ToolkitEvent::RESIZE: delete m_window; m_window = new Window(m_width, m_height, "Numpty Physics"); break; default: /* do nothing */ break; } return Container::processEvent(ev); } virtual bool onEvent( Event& ev ) { switch (ev.code) { case Event::QUIT: m_quit = true; return true; default: break; } return false; } virtual bool step() { m_timestep.update(OS->ticks(), [this] () { onTick(OS->ticks()); ToolkitEvent ev; while (OS->nextEvent(ev)) { // TODO processEvent(ev); } }); render(); return !m_quit; } }; MainLoop * npmain(int argc, char **argv) { if (argc == 2) { const std::string arg0 = argv[1]; if (arg0 == "-v" || arg0 == "--version") { printf("%s %s\n", APP, VERSION); exit(0); } } OS->init(argc, argv); return new App(argc, argv); } numptyphysics-0.3.10/src/App.h000066400000000000000000000014221425065123200162110ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_APP_H #define NUMPTYPHYSICS_APP_H class MainLoop; extern MainLoop *npmain(int argc, char** argv); #endif /* NUMPTYPHYSICS_APP_H */ numptyphysics-0.3.10/src/Canvas.cpp000066400000000000000000000111051425065123200172360ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2008, 2009, 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include #include "Common.h" #include "Config.h" #include "Canvas.h" #include "Path.h" #include "Renderer.h" static NP::Renderer *RENDERER() { return OS->renderer(); } Canvas::Canvas( int w, int h ) : m_width(w) , m_height(h) { } Canvas::~Canvas() { } int Canvas::width() const { return m_width; } int Canvas::height() const { return m_height; } int Canvas::makeColour( int r, int g, int b ) const { return (r & 0xff) << 16 | (g & 0xff) << 8 | (b & 0xff); } int Canvas::makeColour( int c ) const { return c; } void Canvas::clear() { EVAL_LOCAL(RENDERER); RENDERER->clear(); } void Canvas::drawImage(Image &image, int x, int y) { EVAL_LOCAL(RENDERER); RENDERER->image(image.texture(), x, y, image.width(), image.height()); } void Canvas::drawAtlas(Image &image, const Rect &src, const Rect &dst) { EVAL_LOCAL(RENDERER); RENDERER->subimage(image.texture(), src, dst); } void Canvas::drawBlur(Image &image, const Rect &src, const Rect &dst, float rx, float ry) { EVAL_LOCAL(RENDERER); RENDERER->blur(image.texture(), src, dst, rx, ry); } void Canvas::drawRewind(Image &image, const Rect &src, const Rect &dst, float time, float alpha) { EVAL_LOCAL(RENDERER); RENDERER->rewind(image.texture(), src, dst, time, alpha); } void Canvas::drawSaturation(Image &image, const Rect &src, const Rect &dst, float alpha) { EVAL_LOCAL(RENDERER); RENDERER->saturation(image.texture(), src, dst, alpha); } void Canvas::drawPath( const Path& path, int color, int a ) { EVAL_LOCAL(RENDERER); RENDERER->path(path, color | ((a & 0xff) << 24)); } void Canvas::drawRect( int x, int y, int w, int h, int c, bool fill, int a ) { drawRect(Rect(x, y, x+w, y+h), c, fill, a); } void Canvas::drawRect( const Rect& r, int c, bool fill, int a ) { EVAL_LOCAL(RENDERER); RENDERER->rectangle(r, c | (a << 24), fill); } Rect Canvas::clip(const Rect &r) { EVAL_LOCAL(RENDERER); return RENDERER->clip(r); } Window::Window(int w, int h, const char *title) : Canvas(w, h) , m_offscreen_target(nullptr) , m_offscreen_image(nullptr) , m_title(title) { OS->window(Vec2(w, h)); EVAL_LOCAL(RENDERER); m_offscreen_target = new RenderTarget(RENDERER->world_size(), RENDERER->world_rect()); m_offscreen_image = new Image(m_offscreen_target->contents()); } Window::~Window() { delete m_offscreen_image; delete m_offscreen_target; } void Window::update() { EVAL_LOCAL(RENDERER); RENDERER->flush(); RENDERER->swap(); } void Window::beginOffscreen() { m_offscreen_target->begin(); } void Window::endOffscreen() { m_offscreen_target->end(); } Image * Window::offscreen() { return m_offscreen_image; } RenderTarget::RenderTarget(Vec2 fb_size, Rect world_rect) : Canvas(world_rect.w(), world_rect.h()) , m_framebuffer(RENDERER()->framebuffer(fb_size)) , m_world_rect(world_rect) , m_save_clip(world_rect) { } RenderTarget::~RenderTarget() { } void RenderTarget::begin() { EVAL_LOCAL(RENDERER); RENDERER->begin(m_framebuffer, m_world_rect); m_save_clip = RENDERER->clip(m_world_rect); clear(); } void RenderTarget::end() { EVAL_LOCAL(RENDERER); RENDERER->flush(); RENDERER->end(m_framebuffer); RENDERER->clip(m_save_clip); } NP::Texture RenderTarget::contents() { EVAL_LOCAL(RENDERER); return RENDERER->retrieve(m_framebuffer); } Image::Image(NP::Texture texture) : m_texture(texture) , m_width(m_texture->w) , m_height(m_texture->h) { } Image::Image(std::string filename, bool cache) : m_texture(RENDERER()->load(filename.c_str(), cache)) , m_width(m_texture->w) , m_height(m_texture->h) { } Image::Image(NP::Font font, const char *text, int rgb) : m_texture(RENDERER()->text(font, text, rgb)) , m_width(m_texture->w) , m_height(m_texture->h) { } Image::~Image() { } numptyphysics-0.3.10/src/Canvas.h000066400000000000000000000053171425065123200167130ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009 Tim Edmonds * Coyright (c) 2009, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef CANVAS_H #define CANVAS_H #include "Common.h" #include "Renderer.h" #include class Path; class Image; class Canvas { public: Canvas( int w, int h ); virtual ~Canvas(); int width() const; int height() const; int makeColour( int c ) const; int makeColour( int r, int g, int b ) const; void clear(); void drawImage(Image &image, int x=0, int y=0); void drawAtlas(Image &image, const Rect &src, const Rect &dst); void drawBlur(Image &image, const Rect &src, const Rect &dst, float rx, float ry); void drawRewind(Image &image, const Rect &src, const Rect &dst, float time, float alpha); void drawSaturation(Image &image, const Rect &src, const Rect &dst, float alpha); void drawPath( const Path& path, int color, int a=255 ); void drawRect( int x, int y, int w, int h, int c, bool fill=true, int a=255 ); void drawRect( const Rect& r, int c, bool fill=true, int a=255 ); Rect clip(const Rect &r); protected: int m_width; int m_height; }; class RenderTarget : public Canvas { public: RenderTarget(Vec2 fb_size, Rect world_rect); ~RenderTarget(); void begin(); void end(); NP::Texture contents(); private: NP::Framebuffer m_framebuffer; Rect m_world_rect; Rect m_save_clip; }; class Window : public Canvas { public: Window(int w, int h, const char *title); ~Window(); void update(); void beginOffscreen(); void endOffscreen(); Image *offscreen(); private: RenderTarget *m_offscreen_target; Image *m_offscreen_image; protected: std::string m_title; }; class Image { public: Image(NP::Texture texture); Image(std::string filename, bool cache=false); Image(NP::Font font, const char *text, int rgb); ~Image(); int width() const { return m_width; } int height() const { return m_height; } void scale(float scale) { m_width *= scale; m_height *= scale; } NP::Texture texture() const { return m_texture; } private: NP::Texture m_texture; int m_width; int m_height; }; #endif //CANVAS_H numptyphysics-0.3.10/src/Colour.cpp000066400000000000000000000017731425065123200173000ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Colour.h" namespace NP { namespace Colour { const int values[] = { RED, YELLOW, DEFAULT, 0x108710, //green 0x101010, //black 0x8b4513, //brown 0x87cefa, //lightblue 0xee6aa7, //pink 0xb23aee, //purple 0x00fa9a, //lightgreen 0xff7f00, //orange 0x6c7b8b, //grey }; const int count = (sizeof(values)/sizeof(values[0])); }; /* Colour */ }; /* NP */ numptyphysics-0.3.10/src/Colour.h000066400000000000000000000025061425065123200167400ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_COLOUR_H #define NUMPTYPHYSICS_COLOUR_H namespace NP { namespace Colour { extern const int values[]; extern const int count; inline int toIndex(int colour) { for (int i=0; i * Coyright (c) 2008, 2009 Tim Edmonds * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef COMMON_H #define COMMON_H #include "Box2D.h" #include #define ARRAY_SIZE(aRR) (sizeof(aRR)/sizeof((aRR)[0])) // Define a local variable that is the result of calling // a global function of the same name (only once) #define EVAL_LOCAL(x) auto x = ::x() struct Vec2 { Vec2() : x(0), y(0) {} Vec2( const Vec2& o ) : x(o.x), y(o.y) {} explicit Vec2( const b2Vec2& o ) : x((int)o.x), y((int)o.y) {} Vec2( int xx, int yy ) : x(xx), y(yy) {} void operator+=( const Vec2& o ) { x+=o.x; y+=o.y; } void operator-=( const Vec2& o ) { x-=o.x; y-=o.y; } Vec2 operator-() { return Vec2(-x,-y); } void operator*=( int o ) { x*=o; y*=o; } bool operator==( const Vec2& o ) const { return x==o.x && y==o.y; } bool operator!=( const Vec2& o ) const { return !(*this==o); } operator b2Vec2() const { return b2Vec2((float32)x,(float32)y); } Vec2 operator+( const Vec2& b ) const { return Vec2(x+b.x,y+b.y); } Vec2 operator-( const Vec2& b ) const { return Vec2(x-b.x,y-b.y); } Vec2 operator/( int r ) const { return Vec2(x/r,y/r); } Vec2 operator*( int r ) const { return Vec2(x*r,y*r); } float Length() const { return sqrtf(x*x + y*y); } int x,y; }; template inline T Min( T a, T b ) { return a < b ? a : b; } inline Vec2 Min( const Vec2& a, const Vec2& b ) { Vec2 r; r.x = Min(a.x,b.x); r.y = Min(a.y,b.y); return r; } template inline T Max( T a, T b ) { return a >= b ? a : b; } inline Vec2 Max( const Vec2& a, const Vec2& b ) { Vec2 r; r.x = Max(a.x,b.x); r.y = Max(a.y,b.y); return r; } template inline int indexOf(const std::vector &collection, T &o) { int i = 0; for (auto &v: collection) { if (v == o) { return i; } i++; } return -1; } template inline void clearWithDelete(std::vector &collection) { for (auto &item: collection) { delete item; } collection.clear(); } struct Rect { Rect() {} Rect(bool) { clear(); } Rect( const Vec2& atl, const Vec2& abr ) : tl(atl), br(abr) {} Rect( int x1, int y1, int x2, int y2 ) : tl(x1,y1), br(x2,y2) {} static Rect order(const Vec2 &a, const Vec2 &b) { return Rect(Min(a.x, b.x), Min(a.y, b.y), Max(a.x, b.x), Max(a.y, b.y)); } int w() const { return width() - 1; } int h() const { return height() - 1; } int width() const { return br.x-tl.x+1; } int height() const { return br.y-tl.y+1; } Vec2 size() const { return br-tl; } void clear() { tl.x=tl.y=br.x=br.y=0; } bool isEmpty() const { return tl.x==0 && br.x==0; } void grow(int by) { if (!isEmpty()) { tl.x -= by; tl.y -= by; br.x += by; br.y += by; } } Rect shrunk(int by) { Rect o = *this; o.grow(-by); return o; } void expand( const Vec2& v ) { tl=Min(tl,v); br=Max(br,v); } void expand( const Rect& r ) { if (isEmpty()) { *this = r; } else if (!r.isEmpty()) { expand(r.tl); expand(r.br); } } void clipTo( const Rect& r ) { tl=Max(tl,r.tl); br=Min(br,r.br); } bool contains( const Vec2& p ) const { return p.x >= tl.x && p.x <= br.x && p.y >= tl.y && p.y <= br.y; } bool contains( const b2Vec2 &p) const { return p.x >= tl.x && p.x <= br.x && p.y >= tl.y && p.y <= br.y; } bool contains( const Rect& p ) const { return contains(p.tl) && contains(p.br); } bool intersects( const Rect& r ) const { return r.tl.x <= br.x && r.tl.y <= br.y && r.br.x >= tl.x && r.br.y >= tl.y; } Vec2 centroid() const { return (tl+br)/2; } Rect operator+( const Vec2& b ) const { Rect r=*this; r.tl += b; r.br += b; return r; } Vec2 tl, br; Vec2 tr() const { return Vec2(br.x, tl.y); } Vec2 bl() const { return Vec2(tl.x, br.y); } }; inline b2Vec2 operator*(const b2Vec2 &v, float m) { b2Vec2 x = v; x *= m; return x; } inline bool operator!=(const b2Vec2 &a, const b2Vec2 &b) { return !(a == b); } #endif //COMMON_H numptyphysics-0.3.10/src/Config.cpp000066400000000000000000000052721425065123200172400ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009 Tim Edmonds * Coyright (c) 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Config.h" #include "petals_log.h" #include #include const Rect BOUNDS_RECT( -WORLD_WIDTH/4, -WORLD_HEIGHT, WORLD_WIDTH*5/4, WORLD_HEIGHT ); std::string Config::findFile(const std::string &name) { std::string global_name(OS->globalDataDir() + Os::pathSep + name); if (OS->exists(global_name)) { return global_name; } return name; } Blob * Config::readBlob(const std::string &name) { std::string filename = findFile(name); std::ifstream is(filename.c_str(), std::ios::in); if (!is.is_open()) { LOG_FATAL("Could not open file '%s'", name.c_str()); exit(1); } is.seekg(0, is.end); size_t length = is.tellg(); is.seekg(0, is.beg); char *buffer = new char [length]; is.read (buffer, length); is.close(); return new Blob(buffer, length); } std::pair Config::readFile(const std::string &name) { std::string filename = findFile(name); std::ifstream is(filename.c_str(), std::ios::in); if (!is.is_open()) { return std::make_pair(false, ""); } is.seekg(0, is.end); size_t length = is.tellg(); is.seekg(0, is.beg); char *buffer = new char [length+1]; buffer[length] = '\0'; is.read (buffer,length); is.close(); std::string result = buffer; delete[] buffer; return std::make_pair(true, result); } std::string Config::defaultLevelPath() { return OS->globalDataDir(); } std::string Config::userLevelFileName(const std::string &name) { return OS->userDataDir() + Os::pathSep + name; } std::string Config::userRecordingCollectionDir(const std::string &name) { return OS->userDataDir() + Os::pathSep + "Recordings" + Os::pathSep + name; } std::string Config::joinPath(const std::string &dir, const std::string &name) { return dir + Os::pathSep + name; } std::string Config::baseName(const std::string &name) { size_t sep = name.rfind(Os::pathSep); return (sep == std::string::npos) ? name : name.substr(sep); } numptyphysics-0.3.10/src/Config.h000066400000000000000000000061211425065123200166770ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef CONFIG_H #define CONFIG_H #include "Common.h" #include "Os.h" constexpr const char *PROJECT_HOMEPAGE = "http://thp.io/2015/numptyphysics/"; constexpr const char *NPSVG_NAMESPACE = "http://numptyphysics.garage.maemo.org/"; constexpr const int WORLD_WIDTH = 800; constexpr const int WORLD_HEIGHT = 480; constexpr const float PIXELS_PER_METREf = 10.f; constexpr const float GRAVITY_ACCELf = 9.8f /* m/(s^2) */; constexpr const float GRAVITY_FUDGEf = 5.0f; constexpr const float CLOSED_SHAPE_THREHOLDf = 0.4f; constexpr const float SIMPLIFY_THRESHOLDf = 1.0f /* pixels */; constexpr const int MULTI_VERTEX_LIMIT = 64; constexpr const int ITERATION_RATE = 60 /* fps */; constexpr const int SOLVER_ITERATIONS = 8; constexpr const int MIN_RENDER_RATE = 10 /* fps */; constexpr const int MAX_RENDER_RATE = ITERATION_RATE /* fps */; constexpr const int AVG_RENDER_RATE = (MIN_RENDER_RATE + MAX_RENDER_RATE) / 2; constexpr const int HIDE_STEPS = AVG_RENDER_RATE * 4; constexpr const float JOINT_TOLERANCE = 4.0f /* pixels */; constexpr const float SELECT_TOLERANCE = 5.0f /* pixels */; constexpr const float CLICK_TOLERANCE = 4.0f /* pixels */; constexpr const float ITERATION_TIMESTEPf = 1.0f / float(ITERATION_RATE); constexpr const float ICON_SCALE_FACTOR = 6.0f; constexpr const int BUTTON_WIDTH = 140; constexpr const int BUTTON_HEIGHT = 60; constexpr const int BUTTON_SPACING = 8; constexpr const int TAB_WIDTH = 160; constexpr const int TAB_HEIGHT = 40; constexpr const int DIALOG_TITLE_HEIGHT = 48; constexpr const int MENU_COLUMNS = 1; constexpr const int REWIND_ANIMATION_TICKS = 40; constexpr const int REWIND_JUMP_LENGTH = 100; constexpr const float ROPE_SEGMENT_LENGTHf = 15.f; extern const Rect BOUNDS_RECT; class Blob { public: Blob(char *data, size_t len) : data(data), len(len) {} ~Blob() { free(data); } char *data; size_t len; }; class Config { public: static std::string defaultLevelPath(); static std::string userLevelFileName(const std::string &name); static std::string userRecordingCollectionDir(const std::string &name); static std::string joinPath(const std::string &dir, const std::string &name); static std::string baseName(const std::string &name); static std::string findFile(const std::string &name); static std::pair readFile(const std::string &name); static Blob *readBlob(const std::string &name); }; #endif //CONFIG_H numptyphysics-0.3.10/src/Dialogs.cpp000066400000000000000000000512371425065123200174170ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Dialogs.h" #include "Ui.h" #include "Canvas.h" #include "Font.h" #include "Config.h" #include "Game.h" #include "Scene.h" #include "Colour.h" #include "I18n.h" #include "petals_log.h" #include "thp_format.h" #include #include //////////////////////////////////////////////////////////////// struct MenuPage : public Panel { MenuPage(bool closeable=false) { alpha(100); Box *vbox = new VBox(); m_content = new Panel(); vbox->add( m_content, 100, 1 ); add(vbox); fitToParent(true); } const char* name() {return "MenuPage";} Panel *m_content; }; class LevelLauncher : public Dialog { public: LevelLauncher(int l, Image *image) : Dialog(Tr(nullptr)) { Box *vbox1 = new VBox(); vbox1->add( new Spacer(), 100, 1 ); Box *hbox = new HBox(); hbox->add( new Spacer(), 10, 2 ); IconButton *icon = new IconButton(Tr("level"), "", Event::NOP); if (image) { icon->image(image, false); } hbox->add( icon, 300, 0 ); hbox->add( new Spacer(), 10, 1 ); Box *vbox = new VBox(); vbox->add( new Spacer(), 10, 1 ); vbox->add( new IconButton(Tr("Review"),"", Event(Event::REPLAY,l)), BUTTON_HEIGHT, 1 ); vbox->add( new Spacer(), 10, 0 ); vbox->add( new IconButton(Tr("Play"),"", Event(Event::PLAY,l)), BUTTON_HEIGHT, 1 ); vbox->add( new Spacer(), 10, 1 ); hbox->add( vbox, BUTTON_WIDTH, 0 ); hbox->add( new Spacer(), 10, 2 ); vbox1->add(hbox, 200, 0); vbox1->add( new Spacer(), 100, 1 ); content()->add(vbox1); sizeTo(Vec2(WORLD_WIDTH,WORLD_HEIGHT)); moveTo(Vec2(0,0)); animateTo(Vec2(0,0)); } }; class LevelSelector : public MenuPage { static const int THUMB_COUNT = 32; Levels* m_levels; int m_collection; int m_dispbase; int m_dispcount; IconButton* m_thumbs[THUMB_COUNT]; ScrollArea* m_scroll; public: LevelSelector(GameControl* game, int initialLevel) : m_levels(game->m_levels), m_collection(0), m_dispbase(0), m_dispcount(0) { m_scroll = new ScrollArea(); m_scroll->fitToParent(true); m_scroll->virtualSize(Vec2(WORLD_WIDTH,WORLD_HEIGHT)); m_content->add(m_scroll,0,0); fitToParent(true); m_collection = m_levels->collectionFromLevel(initialLevel); setCollection(m_collection); } void setCollection(int c) { if (c < 0 || c >=m_levels->numCollections()) { return; } m_collection = c; m_dispbase = 0; m_dispcount = m_levels->collectionSize(c); m_scroll->virtualSize(Vec2(WORLD_WIDTH,150+(WORLD_HEIGHT/ICON_SCALE_FACTOR+40)*((m_dispcount+2)/3))); m_scroll->empty(); Box *vbox = new VBox(); vbox->add( new Spacer(), 10, 0 ); Box *hbox = new HBox(); Widget *w = new Button(Tr::copy("<<"),Event::PREVIOUS); w->border(false); hbox->add( w, BUTTON_WIDTH, 0 ); hbox->add( new Spacer(), 10, 0 ); Label *title = new Label(Tr::copy(m_levels->collectionName(c))); title->font(Font::headingFont()); title->alpha(100); hbox->add( title, BUTTON_WIDTH, 4 ); w= new Button(Tr::copy(">>"),Event::NEXT); w->border(false); hbox->add( new Spacer(), 10, 0 ); hbox->add( w, BUTTON_WIDTH, 0 ); vbox->add( hbox, 64, 0 ); vbox->add( new Spacer(), 10, 0 ); hbox = new HBox(); hbox->add( new Spacer(), 0, 1 ); int accumw = 0; for (int i=0; i= WORLD_WIDTH) { vbox->add(hbox, WORLD_HEIGHT/ICON_SCALE_FACTOR+30, 4); vbox->add( new Spacer(), 10, 0 ); hbox = new HBox(); hbox->add( new Spacer(), 0, 1 ); accumw = WORLD_WIDTH / ICON_SCALE_FACTOR; } m_thumbs[i] = new IconButton(Tr::copy("--"),"",Event(Event::PLAY, //SELECT, m_levels->collectionLevel(c,i))); m_thumbs[i]->font(Font::blurbFont()); m_thumbs[i]->setBg(NP::Colour::SELECTED_BG); m_thumbs[i]->border(false); hbox->add( m_thumbs[i], WORLD_WIDTH / ICON_SCALE_FACTOR, 0 ); hbox->add( new Spacer(), 0, 1 ); } vbox->add(hbox, WORLD_HEIGHT/ICON_SCALE_FACTOR+30, 4); vbox->add( new Spacer(), 110, 10 ); m_scroll->add(vbox,0,0); for (int i=0; icollectionLevel(c,i); if (scene.load(m_levels->load(level))) { auto size = Vec2(WORLD_WIDTH, WORLD_HEIGHT); RenderTarget temp(size, Rect(Vec2(0, 0), size)); temp.begin(); scene.draw(temp, true); temp.end(); m_thumbs[i]->text( Tr::copy(m_levels->levelName(level)) ); Image *image = new Image(temp.contents()); image->scale(1. / ICON_SCALE_FACTOR); m_thumbs[i]->image(image); } } } bool onEvent(Event& ev) { switch (ev.code) { case Event::PREVIOUS: setCollection(m_collection-1); return true; case Event::NEXT: setCollection(m_collection+1); return true; // case Event::SELECT: // for (int i=0; itransparent(true); // } // m_thumbs[m_dispbase+ev.x]->transparent(false); // m_game->gotoLevel(m_levels->collectionLevel(m_collection,m_dispbase+ev.x)); // add( new LevelLauncher(m_levels->collectionLevel(m_collection,m_dispbase+ev.x), m_thumbs[m_dispbase+ev.x]->image()) ); // //Event closeEvent(Event::CLOSE); // //m_parent->dispatchEvent(closeEvent); // return true; default: /* do nothing */ break; } return MenuPage::onEvent(ev); } }; class HelpPage : public MenuPage { public: HelpPage() { Box *vbox = new VBox(); ScrollArea* scroll = new ScrollArea(); scroll->fitToParent(true); // TODO: Make help_text.html translatable RichText *text = new RichText(Tr::copy(Config::readFile("help_text.html").second)); scroll->virtualSize(Vec2(WORLD_WIDTH,text->layout(WORLD_WIDTH))); text->fitToParent(true); text->alpha(100); scroll->add(text,0,0); vbox->add( scroll, 0, 1 ); vbox->add( new Button(Tr::copy(PROJECT_HOMEPAGE),Event::SELECT), 36, 0 ); m_content->add(vbox,0,0); } bool onEvent(Event& ev) { if (ev.code == Event::SELECT) { OS->openBrowser(PROJECT_HOMEPAGE); return true; } return Panel::onEvent(ev); } }; struct FrontPage : public MenuPage { FrontPage() : MenuPage(true) { m_content->add( new StockIconButton(Tr("CHOOSE"), StockIcon::CHOOSE, Event(Event::MENU,1)), Rect(125,100,275,300) ); m_content->add( new StockIconButton(Tr("PLAY"), StockIcon::PLAY, Event(Event::MENU,2)), Rect(325,100,475,300) ); m_content->add( new StockIconButton(Tr("HELP"), StockIcon::HELP, Event(Event::MENU,3)), Rect(525,100,675,300) ); fitToParent(true); } }; class MainMenu : public Dialog { GameControl* m_game; int m_chosenLevel; public: MainMenu(GameControl* game) : Dialog(Tr("NUMPTY PHYSICS"),Event::NOP,Event::QUIT), m_game(game), m_chosenLevel(game->m_level) { //Swipe::lock(false); content()->add(new FrontPage()); sizeTo(Vec2(WORLD_WIDTH,WORLD_HEIGHT)); } ~MainMenu() { //Swipe::lock(true); } bool onEvent( Event& ev ) { switch (ev.code) { case Event::MENU: switch(ev.x) { case 1: content()->empty(); content()->add(new LevelSelector(m_game, m_chosenLevel)); if (rightControl()) { rightControl()->text(Tr::copy("")); rightControl()->event(Event::CANCEL); } break; case 2: close(); break; case 3: content()->empty(); content()->add(new HelpPage()); if (rightControl()) { rightControl()->text(Tr::copy("")); rightControl()->event(Event::CANCEL); } break; } return true; case Event::SELECT: LOG_INFO("Select level %d", ev.x); m_chosenLevel = ev.x; content()->empty(); content()->add(new LevelLauncher(m_chosenLevel, NULL)); if (rightControl()) { rightControl()->text(Tr::copy("")); rightControl()->event(Event(Event::MENU,1)); } return true; case Event::CANCEL: content()->empty(); content()->add(new FrontPage()); if (rightControl()) { rightControl()->event(Event::QUIT); } return true; case Event::PLAY: case Event::REPLAY: close(); break; default: break; } return Dialog::onEvent(ev); } }; Widget* createMainMenu(GameControl* game) { return new MainMenu(game); } //////////////////////////////////////////////////////////////// static const MenuItem playNormalOpts[] = { MenuItem(Tr("pen"), StockIcon::PEN, Event(Event::SELECT,1,-1)), MenuItem(Tr("tools"), StockIcon::CHOOSE, Event(Event::SELECT,2,-1)), MenuItem(Tr("pause"), StockIcon::PAUSE, Event::PAUSE), MenuItem(Tr("undo"), StockIcon::UNDO, Event::UNDO), MenuItem(Tr::copy(""), StockIcon::NONE, Event::NOP) }; static const MenuItem playPausedOpts[] = { MenuItem(Tr("pen"), StockIcon::PEN, Event(Event::SELECT,1,-1)), MenuItem(Tr("tools"), StockIcon::CHOOSE, Event(Event::SELECT,2,-1)), MenuItem(Tr("resume"), StockIcon::PLAY, Event::PAUSE), MenuItem(Tr("undo"), StockIcon::UNDO, Event::UNDO), MenuItem(Tr::copy(""), StockIcon::NONE, Event::NOP) }; class OptsPopup : public MenuDialog { protected: Vec2 m_closeTarget; public: OptsPopup() : MenuDialog(this, Tr::copy(""), NULL) { m_buttonDim = Vec2(90,90); m_closeTarget = Vec2(-10, 0); } virtual Widget* makeButton( MenuItem* item, const Event& ev ) { return new StockIconButton(item->tr, item->icon, ev); } virtual bool onEvent( Event& ev ) { if (ev.code == Event::CLOSE) { if (m_closeTarget != m_pos.tl) { animateTo(m_closeTarget, [this] () { Event closeForReal(Event::CLOSE); onEvent(closeForReal); }); return true; } Event closingEvent(Event::POPUP_CLOSING); if (dispatchEvent(closingEvent)) { return true; } } return MenuDialog::onEvent(ev); } }; class PlayOpts : public OptsPopup { public: PlayOpts(GameControl* game ) { addItems(game->m_paused ? playPausedOpts : playNormalOpts); sizeTo(Vec2(140,480)); moveTo(Vec2(WORLD_WIDTH,0)); animateTo(Vec2(WORLD_WIDTH-140,0)); m_closeTarget = Vec2(WORLD_WIDTH, 0); } }; Widget* createPlayOpts(GameControl* game ) { return new PlayOpts(game); } //////////////////////////////////////////////////////////////// static const MenuItem editNormalOpts[] = { MenuItem(Tr("menu"), StockIcon::CLOSE, Event::MENU), MenuItem(Tr("rewind"), StockIcon::RESET, Event::RESET), MenuItem(Tr("skip"), StockIcon::FORWARD, Event::NEXT), MenuItem(Tr("edit"), StockIcon::SHARE, Event::EDIT), MenuItem(Tr::copy(""), StockIcon::NONE, Event::NOP) }; static const MenuItem editDoneOpts[] = { MenuItem(Tr("menu"), StockIcon::CLOSE, Event::MENU), MenuItem(Tr("rewind"), StockIcon::RESET, Event::RESET), MenuItem(Tr("done"), StockIcon::SHARE, Event::DONE), MenuItem(Tr::copy(""), StockIcon::NONE, Event::NOP) }; class EditOpts : public OptsPopup { public: EditOpts(GameControl* game ) { addItems(game->m_edit ? editDoneOpts : editNormalOpts); sizeTo(Vec2(140,480)); moveTo(Vec2(-140,0)); animateTo(Vec2(0,0)); m_closeTarget = Vec2(-width(), 0); } }; Widget* createEditOpts(GameControl* game ) { return new EditOpts(game); } //////////////////////////////////////////////////////////////// class ColourButton : public Button { public: ColourButton(const Tr& s, int c, const Event& ev) : Button(s,ev) { m_bg = c; transparent(false); } }; class ColourDialog : public MenuDialog { public: ColourDialog( int num, const int* cols ) : MenuDialog(this, Tr("pen")), m_colours(cols) { m_columns = 4; m_buttonDim = Vec2(BUTTON_HEIGHT, BUTTON_HEIGHT); for (int i=0; itr,m_colours[item->event.y],ev); w->font(Font::titleFont()); return w; } const int* m_colours; }; Widget* createColourDialog(GameControl* game, int n, const int* cols) { return new ColourDialog(n,cols); } //////////////////////////////////////////////////////////////// struct ToggleMenuItem { ToggleMenuItem(const Tr &tr, std::function toggled, std::function clicked) : menuitem(MenuItem(tr, StockIcon::TICK, Event(Event::SELECT))) , toggled(toggled) , clicked(clicked) { } MenuItem menuitem; // Status query - returns "true" if the check in the menu should be on std::function toggled; // Click handler - returns "true" if the click event was handled std::function clicked; }; static const ToggleMenuItem toolOpts[] = { ToggleMenuItem(Tr("ground"), [] (GameControl *game) { return game->m_strokeFixed; }, [] (GameControl *game) { game->m_strokeFixed = !game->m_strokeFixed; game->m_strokeSleep = false; game->m_strokeDecor = false; return true; }), ToggleMenuItem(Tr("sleepy"), [] (GameControl *game) { return game->m_strokeSleep; }, [] (GameControl *game) { game->m_strokeFixed = false; game->m_strokeSleep = !game->m_strokeSleep; game->m_strokeDecor = false; return true; }), ToggleMenuItem(Tr("decor"), [] (GameControl *game) { return game->m_strokeDecor; }, [] (GameControl *game) { game->m_strokeFixed = false; game->m_strokeSleep = false; game->m_strokeDecor = !game->m_strokeDecor; return true; }), ToggleMenuItem(Tr("move"), [] (GameControl *game) { return game->m_clickMode == CLICK_MODE_MOVE; }, [] (GameControl *game) { game->toggleClickMode(CLICK_MODE_MOVE); return true; }), ToggleMenuItem(Tr("erase"), [] (GameControl *game) { return game->m_clickMode == CLICK_MODE_ERASE; }, [] (GameControl *game) { game->toggleClickMode(CLICK_MODE_ERASE); return true; }), ToggleMenuItem(Tr("jetstream"), [] (GameControl *game) { return game->m_clickMode == CLICK_MODE_DRAW_JETSTREAM; }, [] (GameControl *game) { game->toggleClickMode(CLICK_MODE_DRAW_JETSTREAM); return true; }), ToggleMenuItem(Tr("rope"), [] (GameControl *game) { return game->m_strokeRope; }, [] (GameControl *game) { game->m_strokeRope = !game->m_strokeRope; return true; }), ToggleMenuItem(Tr("interactive"), [] (GameControl *game) { return game->m_interactiveDraw; }, [] (GameControl *game) { game->m_interactiveDraw = !game->m_interactiveDraw; return true; }), }; class ToolDialog : public MenuDialog { public: ToolDialog(GameControl* game) : MenuDialog(this, Tr("tools"),NULL), m_game(game) { m_buttonDim = Vec2(200, 40); std::vector items; for (auto &o: toolOpts) { items.push_back(o.menuitem); } addItems(items); updateTicks(); } Widget* makeButton( MenuItem* item, const Event& ev ) { StockIconButton *w = new StockIconButton(item->tr, item->icon, ev); w->align(1); m_opts.push_back(w); return w; } void empty() { m_opts.clear(); } void remove( Widget* w ) { if (!w) { return; } auto it = std::find(m_opts.begin(), m_opts.end(), static_cast(w)); if (it != m_opts.end()) { m_opts.erase(it); } } void updateTicks() { for (int i=0; itr().c_str()); } m_opts[i]->set(tick ? StockIcon::TICK : StockIcon::BLANK); } } bool onEvent( Event& ev ) { if (ev.code == Event::SELECT) { if (ev.x < ARRAY_SIZE(toolOpts)) { if (toolOpts[ev.x].clicked(m_game)) { updateTicks(); return true; } } else { LOG_WARNING("Ignoring select event for invalid index %d", ev.x); } } return MenuDialog::onEvent(ev); } private: GameControl *m_game; std::vector m_opts; }; Widget* createToolDialog(GameControl* game) { return new ToolDialog(game); } //////////////////////////////////////////////////////////////// class NextLevelDialog : public Dialog { GameControl* m_game; public: NextLevelDialog(GameControl* game) : Dialog(Tr("BRAVO!!!"),Event::NOP,Event::MENU), m_game(game) { rightControl()->text(Tr::copy("")); const GameStats& stats = m_game->stats(); int time = (stats.endTime - stats.startTime)/1000; int h = time/60/60; int m = time/60 - h*60; int s = time - m*60; Box *vbox = new VBox(); vbox->add(new Spacer(),10,1); auto tr_time = Tr::defer([=] () { if (h > 0) { return thp::format(Tr("time: %dh %dm %ds"), m, h, s); } else if (m > 0) { int m = time/60/1000; return thp::format(Tr("time: %dm %ds"), m, s); } else { return thp::format(Tr("time: %ds"), s); } }); vbox->add(new Label(tr_time, nullptr, 0x000000),20,0); vbox->add(new Label(TR_DEFERRED(thp::format(Tr("%d stroke(s)"), stats.strokeCount)), nullptr, 0x000000),20,0); if (stats.pausedStrokes) { auto tr = Tr::defer([=] () { std::string msg = thp::format(Tr("%d while paused"), stats.pausedStrokes); return thp::format(" (%s)", msg.c_str()); }); vbox->add(new Label(tr, nullptr, 0x000000),20,0); } vbox->add(new Label(TR_DEFERRED(thp::format(Tr("%d undo(s)"), stats.undoCount)), nullptr, 0x000000),20,0); vbox->add(new Spacer(),10,1); Box *hbox2 = new HBox(); hbox2->add(new Spacer(),20,0); hbox2->add(new Button(Tr("review"),Event(Event::REPLAY,game->m_level)),BUTTON_WIDTH,0); hbox2->add(new Spacer(),1,1); hbox2->add(new Button(Tr("again"),Event::RESET),BUTTON_WIDTH,0); hbox2->add(new Spacer(),1,1); hbox2->add(new Button(Tr("next"),Event::NEXT),BUTTON_WIDTH,0); hbox2->add(new Spacer(),20,0); vbox->add(hbox2,BUTTON_HEIGHT,0); vbox->add(new Spacer(),10,0); content()->add(vbox,0,0); moveTo(Vec2(150, WORLD_HEIGHT)); animateTo(Vec2(150, 120)); sizeTo(Vec2(500,240)); } }; Widget *createNextLevelDialog( GameControl* game ) { return new NextLevelDialog(game); } //////////////////////////////////////////////////////////////// class EditDoneDialog : public Dialog { public: EditDoneDialog(GameControl* game) : Dialog(Tr("Exit Editor"),Event::NOP,Event::CLOSE) { Box *vbox = new VBox(); vbox->add(new Spacer(),10,1); vbox->add(new Label(Tr("Save level?")),20,0); vbox->add(new Spacer(),10,1); Box *hbox2 = new HBox(); hbox2->add(new Spacer(),20,0); hbox2->add(new Button(Tr("cancel"),Event::CLOSE),BUTTON_WIDTH,0); hbox2->add(new Spacer(),1,1); hbox2->add(new Button(Tr("exit"),Event::EDIT),BUTTON_WIDTH,0); hbox2->add(new Spacer(),1,1); hbox2->add(new Button(Tr("save"),Event::SAVE),BUTTON_WIDTH,0); hbox2->add(new Spacer(),20,0); vbox->add(hbox2,BUTTON_HEIGHT,0); vbox->add(new Spacer(),10,0); content()->add(vbox,0,0); animateTo(Vec2(150, 70)); sizeTo(Vec2(500,240)); } bool onEvent( Event& ev ) { close(); return false; } }; Widget *createEditDoneDialog( GameControl* game ) { return new EditDoneDialog(game); } numptyphysics-0.3.10/src/Dialogs.h000066400000000000000000000022251425065123200170550ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef DIALOG_H #define DIALOG_H #include class Widget; class MenuItem; class GameControl; Widget* createMainMenu(GameControl* game); Widget* createPlayOpts(GameControl* game); Widget* createEditOpts(GameControl* game); Widget* createColourDialog(GameControl* game, int n, const int* cols); Widget* createToolDialog(GameControl* game); Widget *createNextLevelDialog( GameControl* game ); Widget *createEditDoneDialog( GameControl* game ); #endif //DIALOG_H numptyphysics-0.3.10/src/Event.cpp000066400000000000000000000042061425065123200171100ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Event.h" #include "Os.h" BasicEventMap::BasicEventMap( const KeyPair* keys, const ButtonPair* buttons ) : m_keys(keys), m_buttons(buttons) {} Event BasicEventMap::process(const ToolkitEvent& ev) { const ButtonPair *inf = 0; const KeyPair *key = 0; switch (ev.type) { case ToolkitEvent::PRESS: inf = lookupButton(ev.key); if (inf) { return Event(inf->down, ev.x, ev.y); } break; case ToolkitEvent::RELEASE: inf = lookupButton(ev.key); if (inf) { return Event(inf->up, ev.x, ev.y); } break; case ToolkitEvent::MOVE: inf = lookupButton(ev.key); if (inf) { return Event(inf->move, ev.x, ev.y); } break; case ToolkitEvent::KEYDOWN: key = lookupKey(ev.key); if (key) { return Event(key->ev, (char)ev.key); } break; default: break; } return Event(); } const BasicEventMap::KeyPair* BasicEventMap::lookupKey(int key) { const KeyPair* p = m_keys; while (p && p->sym) { if (p->sym == key) { return p; } p++; } return NULL; } const BasicEventMap::ButtonPair* BasicEventMap::lookupButton(unsigned char button) { const ButtonPair* p = m_buttons; while (p && p->button) { if (p->button == button) { return p; } p++; } return NULL; } numptyphysics-0.3.10/src/Event.h000066400000000000000000000062521425065123200165600ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef EVENT_H #define EVENT_H #include "Common.h" #pragma push_macro("DELETE") #undef DELETE struct ToolkitEvent { public: enum Type { NONE = 0, /* touch / mouse */ PRESS, RELEASE, MOVE, /* keyboard */ KEYDOWN, KEYUP, /* window */ RESIZE, /* meta */ QUIT, }; ToolkitEvent(enum Type type=NONE, int x=0, int y=0, int finger=0, int key=0) : type(type) , x(x) , y(y) , finger(finger) , key(key) { } Vec2 pos() { return Vec2(x, y); } enum Type type; int x; int y; int finger; int key; }; struct Event { enum Code { NOP, DRAWBEGIN, DRAWMORE, DRAWEND, MOVEBEGIN, MOVEMORE, MOVEEND, JETSTREAMBEGIN, JETSTREAMMORE, JETSTREAMEND, SELECT, FOCUS, CANCEL, OPTION, CLOSE, DONE, QUIT, EDIT, MENU, DELETE, NEXT, PREVIOUS, UP, DOWN, LEFT, RIGHT, RESET, UNDO, PAUSE, PLAY, REPLAY, SAVE, SEND, TEXT, POPUP_CLOSING, }; Code code; int x,y; char c; Event(Code op=NOP, char cc=0) : code(op), c(cc) {} Event(Code op, int xx, int yy=0, char cc=0) : code(op), x(xx), y(yy), c(cc) {} Event(char cc) : code(TEXT), c(cc) {} }; struct EventMap { virtual Event process(const ToolkitEvent &ev) = 0; }; class BasicEventMap : public EventMap { public: struct KeyPair { int sym; Event::Code ev; }; struct ButtonPair { unsigned char button; Event::Code down; Event::Code move; Event::Code up; }; BasicEventMap( const KeyPair* keys, const ButtonPair* buttons ); Event process(const ToolkitEvent &ev); protected: const KeyPair* lookupKey(int sym); const ButtonPair* lookupButton(unsigned char button); private: const KeyPair* m_keys; const ButtonPair* m_buttons; }; enum EventMapType { GAME_MAP, GAME_MOVE_MAP, GAME_ERASE_MAP, GAME_JETSTREAM_MAP, APP_MAP, EDIT_MAP, UI_BUTTON_MAP, UI_DRAGGABLE_MAP, UI_DIALOG_MAP, }; enum NumptyKeySym { NUMPTYKEY_NONE = 0, NUMPTYKEY_SPACE, NUMPTYKEY_RETURN, NUMPTYKEY_ESCAPE, NUMPTYKEY_BACKSPACE, NUMPTYKEY_DOWN, NUMPTYKEY_UP, NUMPTYKEY_LEFT, NUMPTYKEY_RIGHT, NUMPTYKEY_u, NUMPTYKEY_s, NUMPTYKEY_m, NUMPTYKEY_e, NUMPTYKEY_r, NUMPTYKEY_n, NUMPTYKEY_p, NUMPTYKEY_v, NUMPTYKEY_q, NUMPTYKEY_F4, NUMPTYKEY_F7, NUMPTYKEY_F6, }; #pragma pop_macro("DELETE") #endif //EVENT_H numptyphysics-0.3.10/src/Font.cpp000066400000000000000000000050131425065123200167320ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Font.h" #include "Canvas.h" #include "Config.h" #define FONT_FILE "SourceSansPro-Light.ttf" Font::Font( const std::string& file, int ptsize ) { std::string fname = Config::findFile(file); m_font = OS->renderer()->load(fname.c_str(), ptsize); m_height = metrics("M").y; } Vec2 Font::metrics( const std::string& text ) const { Vec2 m; OS->renderer()->metrics(m_font, text.c_str(), &m.x, &m.y); return m; } void Font::drawLeft( Canvas* canvas, Vec2 pt, const std::string& text, int colour ) const { Image temp(m_font, text.c_str(), colour); canvas->drawImage(temp, pt.x, pt.y); } void Font::drawRight( Canvas* canvas, Vec2 pt, const std::string& text, int colour ) const { drawLeft( canvas, pt - Vec2(metrics(text).x,0), text, colour ); } void Font::drawCenter( Canvas* canvas, Vec2 pt, const std::string& text, int colour ) const { drawLeft( canvas, pt - metrics(text)/2, text, colour ); } void Font::drawWrap( Canvas* canvas, Rect area, const std::string& text, int colour ) const { Vec2 pos = area.tl; size_t i = 0, e=0; while ( i < text.length() ) { e = text.find_first_of(" \n\r\t",i); if ( i == e ) { i++; } else { std::string word = text.substr(i,i+e); Vec2 wm = metrics( word ); if ( pos.x + wm.x > area.br.x ) { pos.x = area.tl.x; pos.y += wm.y; } drawLeft( canvas, pos, word, colour ); i = e + 1; } } drawLeft( canvas, pos, text.substr(i), colour ); } const Font* Font::titleFont() { static Font* f = 0; if (!f) { f = new Font(FONT_FILE,32); } return f; } const Font* Font::headingFont() { static Font* f = 0; if (!f) { f = new Font(FONT_FILE,23); } return f; } const Font* Font::blurbFont() { static Font* f = 0; if (!f) { f = new Font(FONT_FILE,16); } return f; } numptyphysics-0.3.10/src/Font.h000066400000000000000000000027701425065123200164060ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef FONT_H #define FONT_H #include "Common.h" #include "Path.h" #include "Renderer.h" #include class Canvas; class Font { public: Font( const std::string& file, int ptsize=10 ); int height() const { return m_height; } Vec2 metrics( const std::string& text ) const; void drawLeft( Canvas* canvas, Vec2 pt, const std::string& text, int colour ) const; void drawRight( Canvas* canvas, Vec2 pt, const std::string& text, int colour ) const; void drawCenter( Canvas* canvas, Vec2 pt, const std::string& text, int colour ) const; void drawWrap( Canvas* canvas, Rect area, const std::string& text, int colour ) const; static const Font* titleFont(); static const Font* headingFont(); static const Font* blurbFont(); private: NP::Font m_font; int m_height; }; #endif //FONT_H numptyphysics-0.3.10/src/Game.cpp000066400000000000000000000413611425065123200167030ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2008, 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Common.h" #include "Config.h" #include "Game.h" #include "Path.h" #include "Canvas.h" #include "Font.h" #include "Levels.h" #include "Os.h" #include "Scene.h" #include "Stroke.h" #include "Script.h" #include "Dialogs.h" #include "Ui.h" #include "Colour.h" #include "I18n.h" #include "petals_log.h" #include #include #include #include #include #include using namespace std; static const char * clickModeName(enum ClickMode cm) { switch (cm) { case CLICK_MODE_DRAW_STROKE: return "draw stroke"; case CLICK_MODE_MOVE: return "move"; case CLICK_MODE_ERASE: return "erase"; case CLICK_MODE_DRAW_JETSTREAM: return "draw jetstream"; } LOG_NOTREACHED; return nullptr; } static float BUTTON_BORDER() { return WORLD_WIDTH * 0.02f; } static float BUTTON_SIZE() { return WORLD_WIDTH * 0.1f; } class Game : public GameControl, public Container { Scene m_scene; Widget *m_pauseLabel; Widget *m_editLabel; Widget *m_completedDialog; Widget *m_options; Label *m_clickModeLabel; Os *m_os; bool m_isCompleted; Widget *m_left_button; Widget *m_right_button; int m_reset_countdown; public: Game( Levels* levels, int width, int height ) : m_pauseLabel( NULL ), m_editLabel( NULL ), m_completedDialog( NULL ), m_options( NULL ), m_clickModeLabel(new Label(Tr::copy(""), nullptr, 0x000000)), m_os( Os::get() ), m_isCompleted(false) , m_left_button(new Button(Tr("MENU"), Event(Event::OPTION, 1))) , m_right_button(new Button(Tr("TOOL"), Event(Event::OPTION, 2))) , m_reset_countdown(0) { EVAL_LOCAL(BUTTON_BORDER); EVAL_LOCAL(BUTTON_SIZE); add(m_left_button, Rect(BUTTON_BORDER, BUTTON_BORDER, BUTTON_BORDER + BUTTON_SIZE, BUTTON_BORDER + BUTTON_SIZE)); add(m_right_button, Rect(WORLD_WIDTH - BUTTON_BORDER - BUTTON_SIZE, BUTTON_BORDER, WORLD_WIDTH - BUTTON_BORDER, BUTTON_BORDER + BUTTON_SIZE)); m_clickModeLabel->setAlignment(Label::ALIGN_RIGHT | Label::ALIGN_BOTTOM); add(m_clickModeLabel, Rect(0, 0, WORLD_WIDTH, WORLD_HEIGHT).shrunk(BUTTON_BORDER)); setEventMap(Os::get()->getEventMap(GAME_MAP)); sizeTo(Vec2(width,height)); transparent(true); //don't clear m_greedyMouse = true; //get mouse clicks outside the window! m_levels = levels; gotoLevel(0); //add( new Button("O",Event::OPTION), Rect(800-32,0,32,32) ); } const char* name() {return "Game";} void replayLevel() { // reset scene, delete user strokes, but retain log m_replaying = m_scene.replay(); } void gotoLevel(int level) { if (level < 0 || level >= m_levels->numLevels()) { LOG_WARNING("Level does not exist: %d", level); return; } if (m_scene.load(m_levels->load(level))) { m_replaying = m_scene.start(); if (m_edit) { // Unprotect all strokes m_scene.protect(0); } m_level = level; m_stats.reset(OS->ticks()); } } bool save( const char *file=NULL ) { string p; if ( file ) { p = file; } else { file = "L99_saved.npsvg"; p = Config::userLevelFileName(file); } if ( m_scene.save( p ) ) { m_levels->addPath( p.c_str() ); int l = m_levels->findLevel( p.c_str() ); if ( l >= 0 ) { LOG_DEBUG("Setting level to saved index to %d", l); m_level = l; } showMessage(std::string("

    saved to
    ")+file); return true; } return false; } void saveDemo() { std::string path = m_levels->demoPath(m_level); if (path != "") { OS->ensurePath(path); path = m_levels->demoName(m_level); LOG_INFO("Saving demo of level %d to %s", m_level, path.c_str()); m_scene.save(path, true); } else { LOG_INFO("Not saving demo of demo"); } } void toggleClickMode(enum ClickMode cm) { if (cm == m_clickMode) { clickMode(CLICK_MODE_DRAW_STROKE); } else { clickMode(cm); } } void clickMode(enum ClickMode cm) { if (cm != m_clickMode) { LOG_DEBUG("clickMode = %s", clickModeName(cm)); m_clickMode = cm; switch (cm) { case CLICK_MODE_DRAW_STROKE: setEventMap(Os::get()->getEventMap(GAME_MAP)); m_clickModeLabel->text(Tr::copy("")); break; case CLICK_MODE_MOVE: setEventMap(Os::get()->getEventMap(GAME_MOVE_MAP)); m_clickModeLabel->text(Tr("Move mode")); break; case CLICK_MODE_ERASE: setEventMap(Os::get()->getEventMap(GAME_ERASE_MAP)); m_clickModeLabel->text(Tr("Erase mode")); break; case CLICK_MODE_DRAW_JETSTREAM: setEventMap(Os::get()->getEventMap(GAME_JETSTREAM_MAP)); m_clickModeLabel->text(Tr("Create jet stream")); break; default: LOG_NOTREACHED; break; } } } void setTool( int t ) { m_colour = t; } void editMode( bool set ) { m_edit = set; } void showMessage( const std::string& msg ) { LOG_INFO("showMessage \"%s\"", msg.c_str()); add( new MessageBox(Tr::copy(msg)) ); } void togglePause() { if ( !m_paused ) { if ( !m_pauseLabel ) { m_pauseLabel = new Button(Tr("Gameplay paused"), Event::PAUSE); } add( m_pauseLabel, Rect(WORLD_WIDTH/2-128, 16, WORLD_WIDTH/2+128, 64)); m_paused = true; m_scene.onSceneEvent(SceneEvent(SceneEvent::PAUSE)); } else { remove( m_pauseLabel ); m_pauseLabel = NULL; m_paused = false; m_scene.onSceneEvent(SceneEvent(SceneEvent::UNPAUSE)); } } bool isPaused() { return m_paused; } void edit( bool doEdit ) { if ( m_edit != doEdit ) { m_edit = doEdit; if ( m_edit ) { if ( !m_editLabel ) { m_editLabel = new Button(Tr("Edit mode"), Event::DONE); } add(m_editLabel, Rect(WORLD_WIDTH/2-128, WORLD_HEIGHT-64, WORLD_WIDTH/2+128, WORLD_HEIGHT-16)); m_scene.protect(0); } else { remove(m_editLabel); m_editLabel = NULL; m_strokeFixed = false; m_strokeSleep = false; m_strokeDecor = false; if ( m_colour < 2 ) m_colour = 2; m_scene.protect(); } } } Vec2 mousePoint( Event& ev ) { return Vec2(ev.x, ev.y); } //////////////////////////////////////////////////////////////// // layer interface //////////////////////////////////////////////////////////////// void remove( Widget* w ) { if (w==m_completedDialog) { m_completedDialog = NULL; } Container::remove(w); } virtual void onTick( int tick ) { m_scene.step(); if (m_reset_countdown > 0) { m_reset_countdown--; if (m_reset_countdown == REWIND_ANIMATION_TICKS / 2) { if (m_scene.isCompleted()) { // From the finish screen, we always start the level fresh gotoLevel(m_level); } else if (!m_replaying) { // Store all events up to now, so that we can playback those // events after reloading the level up to a given point in // the past (REWIND_JUMP_LENGTH ticks before now) ScriptLog events = *(m_scene.getLog()); int ticks = m_scene.getTicks(); int target = std::max(0, ticks - REWIND_JUMP_LENGTH); LOG_DEBUG("Rewinding: %d -> %d", ticks, target); // Reload level and replay history until the target point gotoLevel(m_level); m_scene.playbackUntil(events, target); } else { // FIXME: Implement step-wise rewind for playback as well? gotoLevel(m_level); } } } if ( m_isCompleted && m_completedDialog && m_edit ) { remove( m_completedDialog ); m_completedDialog = NULL; m_isCompleted = false; } if ( m_scene.isCompleted() != m_isCompleted && !m_edit ) { m_isCompleted = m_scene.isCompleted(); if ( m_isCompleted ) { if (m_stats.endTime==0) { //don't overwrite time after replay m_stats.endTime = OS->ticks(); } LOG_DEBUG("STATS:"); LOG_DEBUG("time=%dms", m_stats.endTime-m_stats.startTime); LOG_DEBUG("strokes=%d (%d paused, %d undone)", m_stats.strokeCount, m_stats.pausedStrokes, m_stats.undoCount); m_completedDialog = createNextLevelDialog(this); add( m_completedDialog ); saveDemo(); } else if (m_completedDialog) { remove( m_completedDialog ); m_completedDialog = NULL; } } Container::onTick(tick); } virtual void draw( Canvas& screen, const Rect& area ) { Window *window = dynamic_cast(&screen); auto fb_rect = OS->renderer()->framebuffer_rect(); auto world_size = OS->renderer()->world_size(); auto world_rect = OS->renderer()->world_rect(); if (window) { // If we draw an effect std::function effect; if (m_reset_countdown > 0) { effect = [this, window] (Image *img, const Rect &src, const Rect &dst) { float alpha = powf(1.f - fabsf(2.f * (float(m_reset_countdown) / float(REWIND_ANIMATION_TICKS) - 0.5f)), 0.4f); window->drawRewind(*img, src, dst, OS->ticks(), alpha); }; } else if (isPaused()) { effect = [window] (Image *img, const Rect &src, const Rect &dst) { window->drawSaturation(*img, src, dst, 0.7f); }; } std::unique_ptr img = nullptr; if (effect) { // If we want to draw an effect, render to a texture as input for the effect RenderTarget target(world_size, world_rect); target.begin(); m_scene.draw(target); target.end(); img.reset(new Image(target.contents())); } else { // Default "effect" is drawing the scene directly to the window's offscreen effect = [this, window] (Image *img, const Rect &src, const Rect &dst) { m_scene.draw(*window); }; } // Now we can draw the sceen into the offscreen buffer window->beginOffscreen(); effect(img.get(), fb_rect, fb_rect); window->endOffscreen(); } // Draw the whole backbuffer to the screen screen.drawImage(*window->offscreen()); Container::draw(screen, area); } virtual bool onEvent( Event& ev ) { bool used = true; EVAL_LOCAL(BUTTON_BORDER); EVAL_LOCAL(BUTTON_SIZE); switch (ev.code) { case Event::MENU: remove( m_completedDialog ); add( createMainMenu(this) ); break; case Event::PAUSE: LOG_DEBUG("Game pause"); togglePause(); break; case Event::UNDO: if ( !m_replaying ) { if (m_clickMode == CLICK_MODE_DRAW_JETSTREAM) { if (m_scene.onSceneEvent(SceneEvent(SceneEvent::DELETE_LAST_JETSTREAM))) { m_stats.undoCount++; } } else { if (m_scene.onSceneEvent(SceneEvent(SceneEvent::DELETE_LAST_STROKE))) { m_stats.undoCount++; } } } break; case Event::SAVE: save(); break; case Event::CANCEL: if ( m_edit ) { edit(false); } break; case Event::OPTION: remove( m_options ); if (ev.x == 1) { //edit menu m_options = createEditOpts(this); m_left_button->animateTo(Vec2(BUTTON_BORDER, -BUTTON_BORDER-BUTTON_SIZE)); } else if (ev.x == 2) { //play menu m_options = createPlayOpts(this); m_right_button->animateTo(Vec2(WORLD_WIDTH-BUTTON_BORDER-BUTTON_SIZE, -BUTTON_BORDER-BUTTON_SIZE)); } if (m_options) { add( m_options ); } break; case Event::POPUP_CLOSING: m_left_button->animateTo(Vec2(BUTTON_BORDER, BUTTON_BORDER)); m_right_button->animateTo(Vec2(WORLD_WIDTH-BUTTON_BORDER-BUTTON_SIZE, BUTTON_BORDER)); used = false; break; case Event::SELECT: switch (ev.x) { case 1: switch (ev.y) { case -1: add(createColourDialog(this, NP::Colour::count, NP::Colour::values)); break; default: LOG_DEBUG("SetTool %d", ev.y); setTool(ev.y); break; } break; case 2: switch (ev.y) { case -1: add( createToolDialog(this) ); break; } break; } break; case Event::EDIT: edit( !m_edit ); if (m_edit && !isPaused()) { togglePause(); } break; case Event::DONE: if (m_edit) { add( createEditDoneDialog(this) ); } break; case Event::RESET: m_reset_countdown = REWIND_ANIMATION_TICKS; break; case Event::NEXT: if (m_level==0 && m_isCompleted) { // from title try to find the first uncompleted level while (m_level < m_levels->numLevels() && m_os->exists(m_levels->demoName(m_level))) { m_level++; } gotoLevel(m_level); } else { gotoLevel(m_level+1); } break; case Event::PREVIOUS: gotoLevel(m_level-1); break; case Event::REPLAY: replayLevel(); break; case Event::PLAY: gotoLevel(ev.x); break; case Event::DRAWBEGIN: if (!m_replaying) { if (m_scene.canInteractAt(mousePoint(ev))) { m_scene.onSceneEvent(SceneEvent(SceneEvent::INTERACT_AT, mousePoint(ev))); } else { int attrib = 0; if ( m_strokeFixed ) attrib |= ATTRIB_GROUND; if ( m_strokeSleep ) attrib |= ATTRIB_SLEEPING; if ( m_strokeDecor ) attrib |= ATTRIB_DECOR; if ( m_interactiveDraw ) attrib |= ATTRIB_INTERACTIVE; m_scene.onSceneEvent(SceneEvent(SceneEvent::BEGIN_CREATE_STROKE_AT, mousePoint(ev), m_colour, attrib)); } } break; case Event::DRAWMORE: if (!m_replaying) { m_scene.onSceneEvent(SceneEvent(SceneEvent::EXTEND_CREATE_STROKE_AT, mousePoint(ev))); } break; case Event::DRAWEND: if (!m_replaying) { if (m_strokeRope) { if (m_scene.onSceneEvent(SceneEvent(SceneEvent::ROPEIFY_CREATE_STROKE))) { m_stats.ropeCount++; if (isPaused()) { m_stats.pausedRopes++; } } } else { if (m_scene.onSceneEvent(SceneEvent(SceneEvent::ACTIVATE_CREATE_STROKE))) { m_stats.strokeCount++; if (isPaused()) { m_stats.pausedStrokes++; } } } } break; case Event::MOVEBEGIN: if (!m_replaying) { m_scene.onSceneEvent(SceneEvent(SceneEvent::BEGIN_MOVE_STROKE_AT, mousePoint(ev))); } break; case Event::MOVEMORE: if (!m_replaying) { m_scene.onSceneEvent(SceneEvent(SceneEvent::CONTINUE_MOVE_STROKE_AT, mousePoint(ev))); } break; case Event::MOVEEND: if (!m_replaying) { m_scene.onSceneEvent(SceneEvent(SceneEvent::FINISH_MOVE_STROKE)); } break; case Event::JETSTREAMBEGIN: if (!m_replaying) { m_scene.onSceneEvent(SceneEvent(SceneEvent::BEGIN_CREATE_JETSTREAM_AT, mousePoint(ev))); } break; case Event::JETSTREAMMORE: if (!m_replaying) { m_scene.onSceneEvent(SceneEvent(SceneEvent::RESIZE_CREATE_JETSTREAM_AT, mousePoint(ev))); } break; case Event::JETSTREAMEND: if (!m_replaying) { m_scene.onSceneEvent(SceneEvent(SceneEvent::ACTIVATE_CREATE_JETSTREAM)); } break; case Event::DELETE: if (!m_replaying) { m_scene.onSceneEvent(SceneEvent(SceneEvent::DELETE_STROKE_AT, mousePoint(ev))); } break; default: used = Container::onEvent(ev); } return used; } }; Widget* createGameLayer( Levels* levels, int width, int height ) { return new Game(levels,width,height); } numptyphysics-0.3.10/src/Game.h000066400000000000000000000046601425065123200163510ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef GAME_H #define GAME_H #include "Levels.h" class Widget; class Canvas; struct GameStats { GameStats() {reset(0);} int startTime; int endTime; int strokeCount; int pausedStrokes; int undoCount; int ropeCount; int pausedRopes; void reset(int t) { startTime = t; endTime = 0; strokeCount = 0; pausedStrokes = 0; undoCount = 0; ropeCount = 0; pausedRopes = 0; } }; enum ClickMode { CLICK_MODE_DRAW_STROKE, CLICK_MODE_MOVE, CLICK_MODE_ERASE, CLICK_MODE_DRAW_JETSTREAM, }; class GameControl { public: GameControl() : m_quit(false), m_edit( false ), m_colour( 2 ), m_clickMode(CLICK_MODE_DRAW_STROKE), m_strokeFixed( false ), m_strokeSleep( false ), m_strokeDecor( false ), m_strokeRope( false ), m_interactiveDraw( false ), m_replaying( false ), m_paused( false ), m_levels(NULL), m_level(0) {} virtual ~GameControl() {} virtual bool save( const char *file=NULL ) =0; virtual bool load( const char* file ) { return false; }; virtual void gotoLevel(int l) = 0; virtual void clickMode(enum ClickMode cm) =0; virtual void toggleClickMode(enum ClickMode cm) = 0; Levels& levels() { return *m_levels; } const GameStats& stats() { return m_stats; } bool m_quit; bool m_edit; int m_colour; enum ClickMode m_clickMode; bool m_strokeFixed; bool m_strokeSleep; bool m_strokeDecor; bool m_strokeRope; bool m_interactiveDraw; bool m_replaying; bool m_paused; Levels*m_levels; int m_level; protected: GameStats m_stats; }; Widget * createGameLayer( Levels* levels, int width, int height ); #endif //GAME_H numptyphysics-0.3.10/src/I18n.cpp000066400000000000000000000033411425065123200165450ustar00rootroot00000000000000#include "I18n.h" #include "Config.h" #include "petals_log.h" #include "thp_iterutils.h" static bool g_loaded = false; static std::map g_map; static std::string g_tmp; const char * Tr::c_str() const { if (!key) { if (fmt) { g_tmp = fmt(); return g_tmp.c_str(); } return buf.c_str(); } if (g_loaded) { auto it = g_map.find(std::string(key)); if (it != g_map.end()) { return it->second.c_str(); } else { // Uncomment if you're developing translation files //LOG_WARNING("Untranslated: '%s'", key); } } return key; } Tr::operator bool() const { return (key != nullptr) || buf.size(); } Tr Tr::copy(const std::string &s) { Tr result(nullptr); result.buf = s; return result; } Tr Tr::defer(std::function fmt) { Tr result(nullptr); result.fmt = fmt; return result; } void Tr::load(const std::string &filename) { auto data = Config::readFile(filename); if (!data.first) { LOG_INFO("No translation file found (%s), send a pull request", filename.c_str()); return; } g_map.clear(); int lineno = 1, loaded = 0; for (auto &line: thp::split(thp::trim(data.second), "\n")) { std::string k, v; try { thp::unpack({&k, &v}) = thp::split(line, "="); g_map[k] = v; loaded++; } catch (const thp::UnpackException &e) { LOG_WARNING("Could not parse %s, line %d: '%s' - ignoring", filename.c_str(), lineno, line.c_str()); } lineno++; } LOG_INFO("Loaded %d translations from %s", loaded, filename.c_str()); g_loaded = true; } numptyphysics-0.3.10/src/I18n.h000066400000000000000000000023041425065123200162100ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef I18N_H #define I18N_H #include "Common.h" #include "thp_format.h" #include #include class Tr : public thp::stringable { public: explicit Tr(const char *key) : key(key) {} operator bool() const; virtual const char *c_str() const; static Tr copy(const std::string &s); static Tr defer(std::function fmt); static void load(const std::string &filename); private: const char *key; std::string buf; std::function fmt; }; #define TR_DEFERRED(x) Tr::defer([=] () { return (x); }) #endif /* I18N_H */ numptyphysics-0.3.10/src/Interactions.cpp000066400000000000000000000042531425065123200204730ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Interactions.h" #include "thp_format.h" #include "petals_log.h" #include #include namespace NP { Interactions::Interactions() : m_interactions() { } Interactions::~Interactions() { } bool Interactions::handle(int color) { auto it = m_interactions.find(color); if (it != m_interactions.end()) { LOG_INFO("Interaction event: '%s'", it->second.c_str()); return true; } return false; } void Interactions::clear() { } bool Interactions::parse(const std::string &line) { // Interaction: 123 = main_menu // ^^^^^^^^^^^^^^^^ const char *tmp = line.c_str(); while (*tmp && ::isspace(*tmp)) { tmp++; } if (*tmp < '0' || *tmp > '9') { return false; } int color = atoi(tmp); while (*tmp && *tmp != '=') { tmp++; } if (*tmp != '=') { return false; } tmp++; while (*tmp && ::isspace(*tmp)) { tmp++; } if (!*tmp) { return false; } std::string action(tmp); m_interactions[color] = action; return true; } bool Interactions::add(const std::string &color, const std::string &action) { m_interactions[atoi(color.c_str())] = action; return true; } std::string Interactions::serialize() { std::stringstream s; for (auto &interaction: m_interactions) { s << thp::format("", interaction.first, interaction.second.c_str()) << std::endl; } return s.str(); } }; /* namespace NP */ numptyphysics-0.3.10/src/Interactions.h000066400000000000000000000021571425065123200201410ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_INTERACTIONS_H #define NUMPTYPHYSICS_INTERACTIONS_H #include #include namespace NP { class Interactions { public: Interactions(); ~Interactions(); bool handle(int color); void clear(); bool parse(const std::string &line); bool add(const std::string &color, const std::string &action); std::string serialize(); private: std::map m_interactions; }; }; /* namespace NP */ #endif /* NUMPTYPHYSICS_INTERACTIONS_H */ numptyphysics-0.3.10/src/JetStream.cpp000066400000000000000000000045111425065123200177240ustar00rootroot00000000000000#include "JetStream.h" #include "thp_format.h" #include "petals_log.h" JetStream::JetStream(const Rect &rect, const b2Vec2 &force) : active(false) , origin(rect.tl) , rect(rect) , force(force) , particles() { for (int i=0; i rect.br.x) { particle.x -= rect.width(); } while (particle.y < rect.tl.y) { particle.y += rect.height(); } while (particle.y > rect.br.y) { particle.y -= rect.height(); } } } } void JetStream::update(std::vector &strokes) { if (!active) { return; } for (auto &stroke: strokes) { if (rect.intersects(stroke->screenBbox())) { auto body = stroke->body(); if (body) { body->ApplyImpulse(force, body->GetWorldCenter()); } } } } std::string JetStream::asString() { return thp::format("", rect.tl.x, rect.tl.y, rect.w(), rect.h(), force.x, force.y); } void JetStream::activate() { active = true; } void JetStream::resize(const Vec2 &mouse) { rect = Rect::order(origin, mouse); particles.clear(); for (int i=0; i class JetStream { public: JetStream(const Rect &rect, const b2Vec2 &force); void draw(Canvas &canvas); void tick(); void update(std::vector &strokes); std::string asString(); void activate(); void resize(const Vec2 &mouse); private: bool active; Vec2 origin; Rect rect; b2Vec2 force; std::vector particles; }; #endif /* NUMPTYPHYSICS_JETSTREAM_H */ numptyphysics-0.3.10/src/Levels.cpp000066400000000000000000000241331425065123200172620ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include #include #include #include #include "Levels.h" #include "Config.h" #include "Os.h" #include "petals_log.h" #include #include #include static const char MISC_COLLECTION[] = "C99_My Levels"; static const char DEMO_COLLECTION[] = "D00_My Solutions"; static std::string nameFromPath(const std::string& path) { // TODO extract name from collection manifest std::string name; size_t i = path.rfind(Os::pathSep); if ( i != std::string::npos ) { i++; } else { i = 0; } if (path[i] == 'C') i++; if (path[i] == 'L') i++; if (path[i] == 'D') i++; if (path[i] == 'M') i++; while (path[i] >= '0' && path[i] <= '9') i++; if (path[i] == '_') i++; size_t e = path.rfind('.'); if (e != 0) { name = path.substr(i,e-i); } else { name = path.substr(1); } for (i=0; i dirs) : m_numLevels(0) { for (auto &dir: dirs) { addPath(dir); } } static std::string fileExtension(const std::string &path) { size_t pos = path.find_last_of('.'); if (pos != std::string::npos) { return path.substr(pos); } return ""; } bool Levels::addPath(const std::string &path) { bool result = false; std::string ext = fileExtension(path); if (ext == ".nph" || ext == ".npd" || ext == ".npsvg" || ext == ".npdsvg") { addLevel(path); result = true; } else { result = scanCollection(path); } sort(); return result; } bool Levels::addLevel(const std::string& file) { auto ext = fileExtension(file); if (ext == ".npd" || ext == ".npdsvg") { return addLevel(getCollection(DEMO_COLLECTION), file); } else { return addLevel(getCollection(MISC_COLLECTION), file); } } bool Levels::addLevel(Collection &collection, const std::string &file) { collection.levels.push_back(LevelDesc(file)); m_numLevels++; return true; } Collection &Levels::getCollection(const std::string &file) { for (auto &collection: m_collections) { if (collection.file == file) { return collection; } } m_collections.push_back(Collection(file, file)); return m_collections.back(); } bool Levels::scanCollection(const std::string &file) { std::string collectionName = file.substr(file.find_last_of(Os::pathSep)+1); DIR *dir = opendir(file.c_str()); if (dir) { bool result = false; while (struct dirent *entry = readdir(dir)) { if (entry->d_name[0] == '.') { continue; } std::string filename = file + Os::pathSep + entry->d_name; std::string ext = fileExtension(filename); if (ext == ".nph" || ext == ".npsvg") { if (addLevel(getCollection(collectionName), filename)) { result = true; } } else if (ext == ".npd" || ext == ".npdsvg") { if (addLevel(getCollection(DEMO_COLLECTION), filename)) { result = true; } } else if (addPath(filename)) { result = true; } } closedir(dir); return result; } return false; } int Levels::numLevels() { return m_numLevels; } std::string Levels::load(int i) { LevelDesc *lev = findLevel(i); if (lev) { return Config::readFile(lev->file).second; } return ""; } std::string Levels::levelName( int i, bool pretty ) { std::string s = "end"; LevelDesc *lev = findLevel(i); if (lev) { s = lev->file; } else { s = "err"; } return pretty ? nameFromPath(s) : s; } void Levels::sort() { std::sort(m_collections.begin(), m_collections.end()); for (auto &collection: m_collections) { std::sort(collection.levels.begin(), collection.levels.end()); } } void Levels::dump() { for (int i=0; i= m_collections[c].levels.size() ) { i -= m_collections[c].levels.size(); } else { if (indexInCol) *indexInCol = i; return c; } } } return 0; } std::string Levels::collectionName( int i, bool pretty ) { if (i>=0 && i=0 && c=0 && c=0 && iexists(demoName(l)); } LevelDesc* Levels::findLevel( int i ) { if (i < m_numLevels) { for ( int c=0; c= m_collections[c].levels.size() ) { i -= m_collections[c].levels.size(); } else { return &(m_collections[c].levels[i]); } } } return NULL; } int Levels::findLevel( const char *file ) { int index = 0; for ( int c=0; c * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef LEVELS_H #define LEVELS_H #include #include #include struct LevelDesc { LevelDesc() : file() { } LevelDesc(const std::string &file) : file(file) { } void swap(LevelDesc &a, LevelDesc &b); std::string file; }; struct Collection { Collection() : file() , name() , levels() { } Collection(const std::string &file, const std::string &name) : file(file) , name(name) , levels() { } void swap(Collection &a, Collection &b); std::string file; std::string name; std::vector levels; }; class Levels { public: Levels(std::vector dirs); bool addPath(const std::string &path); int numLevels(); std::string load(int i); std::string levelName( int i, bool pretty=true ); int findLevel( const char *file ); void dump(); int numCollections(); int collectionFromLevel( int l, int *indexInCol=NULL ); std::string collectionName( int i, bool pretty=true ); int collectionSize(int c); int collectionLevel(int c, int i); std::string demoPath(int l); std::string demoName(int l); bool hasDemo(int l); void sort(); private: bool addLevel(const std::string &file); bool addLevel(Collection &collection, const std::string &file); LevelDesc *findLevel(int i); Collection &getCollection(const std::string &file); bool scanCollection(const std::string& file); int m_numLevels; std::vector m_collections; }; #endif //LEVELS_H numptyphysics-0.3.10/src/Os.cpp000066400000000000000000000157761425065123200164260ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Os.h" #include "I18n.h" #include "Config.h" #include #include #include #include #include #include #include #ifdef __WIN32__ #include #undef DELETE #endif #include "thp_format.h" #include "petals_log.h" OsObj OS; static const BasicEventMap::KeyPair game_keymap[] = { { NUMPTYKEY_SPACE, Event::PAUSE }, { NUMPTYKEY_RETURN, Event::PAUSE }, { NUMPTYKEY_ESCAPE, Event::UNDO }, { NUMPTYKEY_BACKSPACE,Event::UNDO }, { NUMPTYKEY_u, Event::UNDO }, { NUMPTYKEY_DOWN, Event::UNDO }, { NUMPTYKEY_F7, Event::UNDO }, { NUMPTYKEY_s, Event::SAVE }, { NUMPTYKEY_F4, Event::OPTION}, { NUMPTYKEY_m, Event::MENU}, { NUMPTYKEY_e, Event::EDIT }, { NUMPTYKEY_F6, Event::EDIT }, { NUMPTYKEY_r, Event::RESET }, { NUMPTYKEY_UP, Event::RESET }, { NUMPTYKEY_n, Event::NEXT }, { NUMPTYKEY_RIGHT, Event::NEXT }, { NUMPTYKEY_p, Event::PREVIOUS }, { NUMPTYKEY_LEFT, Event::PREVIOUS }, { NUMPTYKEY_v, Event::REPLAY}, {} }; static const BasicEventMap::ButtonPair game_mousemap[] = { { 1, Event::DRAWBEGIN, Event::DRAWMORE, Event::DRAWEND }, {} }; static const BasicEventMap::ButtonPair game_move_mousemap[] = { { 1, Event::MOVEBEGIN, Event::MOVEMORE, Event::MOVEEND }, {} }; static const BasicEventMap::ButtonPair game_erase_mousemap[] = { { 1, Event::NOP, Event::NOP, Event::DELETE }, {} }; static const BasicEventMap::ButtonPair game_jetstream_mousemap[] = { { 1, Event::JETSTREAMBEGIN, Event::JETSTREAMMORE, Event::JETSTREAMEND }, {} }; static const BasicEventMap::KeyPair app_keymap[] = { { NUMPTYKEY_q, Event::QUIT }, {} }; static const BasicEventMap::ButtonPair edit_mousemap[] = { { 1, Event::DRAWBEGIN, Event::DRAWMORE, Event::DRAWEND }, { 2, Event::MOVEBEGIN, Event::MOVEMORE, Event::MOVEEND }, { 3, Event::DELETE }, {} }; static const BasicEventMap::ButtonPair ui_button_mousemap[] = { { 1, Event::FOCUS, Event::FOCUS, Event::SELECT }, {} }; static const BasicEventMap::ButtonPair ui_draggable_mousemap[] = { { 1, Event::MOVEBEGIN, Event::MOVEMORE, Event::MOVEEND }, {} }; static const BasicEventMap::KeyPair ui_draggable_keymap[] = { { NUMPTYKEY_UP, Event::UP }, { NUMPTYKEY_DOWN, Event::DOWN }, { NUMPTYKEY_RIGHT, Event::RIGHT }, { NUMPTYKEY_LEFT, Event::LEFT }, {} }; static const BasicEventMap::KeyPair ui_dialog_keymap[] = { { NUMPTYKEY_ESCAPE, Event::CLOSE }, {} }; class AppMap : public BasicEventMap { public: AppMap() : BasicEventMap( app_keymap, NULL ) {} Event process(const ToolkitEvent& ev) { if (ev.type == ToolkitEvent::QUIT) { return Event(Event::QUIT); } else { return BasicEventMap::process(ev); } } }; EventMap* Os::getEventMap( EventMapType type ) { static BasicEventMap gameMap(game_keymap,game_mousemap); static BasicEventMap gameMoveMap(game_keymap,game_move_mousemap); static BasicEventMap gameEraseMap(game_keymap,game_erase_mousemap); static BasicEventMap gameJetstreamMap(game_keymap,game_jetstream_mousemap); static BasicEventMap editMap(NULL,edit_mousemap); static BasicEventMap uiButtonMap(NULL,ui_button_mousemap); static BasicEventMap uiDraggableMap(ui_draggable_keymap,ui_draggable_mousemap); static BasicEventMap uiDialogMap(ui_dialog_keymap,NULL); static AppMap appMap; switch (type) { case GAME_MAP: return &gameMap; case GAME_MOVE_MAP: return &gameMoveMap; case GAME_ERASE_MAP: return &gameEraseMap; case GAME_JETSTREAM_MAP: return &gameJetstreamMap; case APP_MAP: return &appMap; case EDIT_MAP: return &editMap; case UI_BUTTON_MAP: return &uiButtonMap; case UI_DRAGGABLE_MAP: return &uiDraggableMap; case UI_DIALOG_MAP: return &uiDialogMap; } return NULL; } bool Os::ensurePath(const std::string& path) { if (!exists(path)) { size_t sep = path.rfind(Os::pathSep); if ( sep != std::string::npos && sep > 0 ) { ensurePath(path.substr(0,sep)); } #ifdef __WIN32__ if (mkdir(path.c_str()) != 0 ) { #else if (mkdir(path.c_str(), 0755) != 0) { #endif LOG_WARNING("Failed to create dir: %s", path.c_str()); return false; } else { LOG_DEBUG("Created dir %s", path.c_str()); return true; } } return true; } bool Os::exists(const std::string& file) { struct stat st; return stat(file.c_str(),&st) == 0; } static Os * g_os = nullptr; const char #ifdef __WIN32__ Os::pathSep = '\\'; #else Os::pathSep = '/'; #endif Os::Os() { if (g_os != nullptr) { LOG_FATAL("OS instance already exists!"); } g_os = this; } Os * Os::get() { return g_os; } static std::string g_appDir; static std::string g_appName; static long log_get_ticks() { return OS->ticks(); } void Os::init(int argc, char **argv) { PetalsLog::init(log_get_ticks, thp::format); char buf[PATH_MAX]; const char *progname = argv[0]; const char *slash = strrchr(progname, Os::pathSep); if (!slash) { #ifdef __WIN32__ if (GetModuleFileName(NULL, buf, sizeof(buf)) != -1) { #else if (readlink("/proc/self/exe", buf, sizeof(buf)) != -1) { #endif progname = buf; slash = strrchr(progname, Os::pathSep); } } if (!slash) { throw "Could not determine application path"; } g_appName = slash + 1; g_appDir = std::string(progname, slash-progname); #ifdef __WIN32__ // FIXME const char *locale = "en"; #else const char *locale = setlocale(LC_MESSAGES, ""); #endif char lang[3]; if (locale != 0 && locale[0] != '\0') { lang[0] = ::tolower(locale[0]); lang[1] = ::tolower(locale[1]); lang[2] = '\0'; LOG_INFO("Got locale: \"%s\", using \"%s\"\n", locale, lang); auto fn = thp::format("i18n/%s", lang); Tr::load(fn); } } std::string Os::appName() { return g_appName; } std::string Os::globalDataDir() { std::string sourceData = thp::format("%s/data", g_appDir.c_str()); // Prefer './data' in the source checkout if available if (exists(sourceData)) { return sourceData; } // System-wide installation return thp::format("%s/../share/%s/data", g_appDir.c_str(), appName().c_str()); } numptyphysics-0.3.10/src/Os.h000066400000000000000000000034321425065123200160550ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009, 2010 Tim Edmonds * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef OS_H #define OS_H #include "Event.h" #include "Renderer.h" #include #include class Accelerometer; class WidgetParent; class MainLoop { public: MainLoop() {} virtual ~MainLoop() {} virtual bool step() = 0; }; class Os { public: Os(); virtual ~Os() {} virtual bool nextEvent(ToolkitEvent &ev) = 0; virtual long ticks() = 0; virtual void delay(int ms) = 0; virtual void init() = 0; virtual void window(Vec2 world_size) = 0; virtual NP::Renderer *renderer() = 0; void init(int argc, char **argv); std::string appName(); std::string globalDataDir(); virtual bool openBrowser(const char *url) = 0; virtual std::string userDataDir() = 0; virtual Accelerometer* getAccelerometer() { return NULL; } virtual EventMap* getEventMap( EventMapType type ); virtual void decorateGame( WidgetParent* game ) {} bool ensurePath(const std::string& path); bool exists(const std::string& file); static Os* get(); static const char pathSep; }; class OsObj { public: Os* operator->() { return Os::get(); } }; extern OsObj OS; #endif //OS_H numptyphysics-0.3.10/src/Path.cpp000066400000000000000000000174041425065123200167270ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009 Tim Edmonds * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include #include #include "Path.h" #include "petals_log.h" static float32 calcDistanceToLine( const Vec2& pt, const Vec2& l1, const Vec2& l2, bool* withinLine=NULL ) { b2Vec2 l = l2 - l1; b2Vec2 w = pt - l1; float32 mag = l.Normalize(); float32 dist = b2Cross( w, l ); if ( withinLine ) { float32 dot = b2Dot( l, w ); *withinLine = ( dot >= 0.0f && dot <= mag ); } return b2Abs( dist ); } static float32 calcDistance( const Vec2& l1, const Vec2& l2 ) { return b2Vec2(l1-l2).Length(); } float32 Segment::distanceTo( const Vec2& p ) { bool withinLine; float32 d = calcDistanceToLine( p, m_p1, m_p2, &withinLine ); if ( !(m_p1 == m_p2) && withinLine ) { return d; } else { return b2Min( calcDistance( p, m_p2 ), calcDistance( p, m_p1 ) ); } } Path::Path() : std::vector() { } Path::Path(const Vec2 &p) : std::vector() { push_back(p); } Path::Path(int n, Vec2* p) : std::vector() { for (int i=0; i= '0' && c <= '9') || c == '.' || c == '-'); } static bool _isspace(char c) { return (c == ' ' || c == ','); } static bool _isctrl(char c) { return (c == 'm' || c == 'M' || c == 'L' || c == 'l'); } bool SVGPathTokenizer::next(std::string &output) { if (m_ipos < m_path.length()) { // Scan forward to first non-space character while (m_ipos < m_path.length() && _isspace(m_path.at(m_ipos))) { m_ipos++; } int start = m_ipos; char c = m_path.at(start); if (_isctrl(c)) { output = m_path.substr(start, 1); m_ipos++; return true; } if (_isnumber(c)) { while (m_ipos < m_path.length() && _isnumber(m_path.at(m_ipos))) { m_ipos++; }; int end = m_ipos; output = m_path.substr(start, end-start); m_ipos++; return true; } } return false; } class SVGPathParser { public: SVGPathParser(const std::string &path); bool next(Vec2 &output); private: SVGPathTokenizer m_tokenizer; Vec2 m_current; bool m_current_valid; enum Positioning { M_ABSOLUTE, M_RELATIVE, }; enum Positioning m_positioning; }; SVGPathParser::SVGPathParser(const std::string &path) : m_tokenizer(path) , m_current() , m_positioning(M_ABSOLUTE) { } bool SVGPathParser::next(Vec2 &output) { std::string a, b; if (!m_tokenizer.next(a)) { return false; } if (a == "m" || a == "l" || a == "M" || a == "L") { if (a == "m" || a == "l") { m_positioning = M_RELATIVE; } else if (a == "M" || a == "L") { m_positioning = M_ABSOLUTE; } if (!m_tokenizer.next(a)) { LOG_WARNING("Incomplete coordinate after %s", a.c_str()); return false; } } if (!m_tokenizer.next(b)) { LOG_WARNING("Incomplete coordinate after %s", a.c_str()); return false; } Vec2 pos(atof(a.c_str()), atof(b.c_str())); if (m_current_valid && m_positioning == M_RELATIVE) { m_current += pos; } else { m_current = pos; } output = m_current; m_current_valid = true; return true; } Path Path::fromSVG(const std::string &svgpath) { Path path; SVGPathParser parser(svgpath); Vec2 pos; while (parser.next(pos)) { path.push_back(pos); } return path; } void Path::makeRelative() { for (int i=size()-1; i>=0; i--) at(i)-=at(0); } Path& Path::translate(const Vec2& xlate) { for (int i=0;i result; Vec2 old = at(0); result.push_back(old); for (int i=1; i fn) { for (int i=0; i result; float lastPoint = 0.f; float totalLength = 0.f; result.push_back(at(0)); withSegments([&result, &lastPoint, &totalLength, length] (const Vec2 &a, const Vec2 &b) { float start = totalLength; float end = start + (b - a).Length(); float nextPoint = lastPoint + length; while (nextPoint >= start && nextPoint <= end) { float alpha = (nextPoint - start) / (end - start); float x = (1.f - alpha) * a.x + alpha * b.x; float y = (1.f - alpha) * a.y + alpha * b.y; result.push_back(Vec2(x, y)); lastPoint = nextPoint; nextPoint += length; } totalLength = end; }); if (lastPoint < totalLength - 1.f) { result.push_back(at(size()-1)); } std::swap(*this, result); } void Path::simplifySub( int first, int last, float32 threshold, bool* keepflags ) { float32 furthestDist = threshold; int furthestIndex = 0; if ( last - first > 1 ) { Segment s( at(first), at(last) ); for ( int i=first+1; i furthestDist ) { furthestDist = d; furthestIndex = i; } } if ( furthestIndex != 0 ) { keepflags[furthestIndex] = true; simplifySub( first, furthestIndex, threshold, keepflags ); simplifySub( furthestIndex, last, threshold, keepflags ); } } } Rect Path::bbox() const { if (size() == 0) { return Rect(Vec2(), Vec2()); } Rect r(at(0), at(0)); for (auto &p: *this) { r.expand(p); } return r; } numptyphysics-0.3.10/src/Path.h000066400000000000000000000051151425065123200163700ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2008, 2009 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef PATH_H #define PATH_H #include "Common.h" #include #include class Segment { public: Segment( const Vec2& p1, const Vec2& p2 ) : m_p1(p1), m_p2(p2) {} float32 distanceTo( const Vec2& p ); private: Vec2 m_p1, m_p2; }; class Path : public std::vector { public: Path(); Path(const Vec2 &p); Path( int n, Vec2* p ); Path( const char *ptlist ); static Path fromSVG(const std::string &svgpath); void makeRelative(); Path& translate(const Vec2& xlate); Path& rotate(const b2Mat22& rot); Path& scale(float32 factor); inline Vec2& origin() { return at(0); } inline Path& operator&(const Vec2& other) { push_back(other); return *this; } inline Path& operator&(const b2Vec2& other) { push_back(Vec2(other)); return *this; } inline Path operator+(const Vec2& p) const { Path r( *this ); return r.translate( p ); } inline Path operator-(const Vec2& p) const { Path r( *this ); Vec2 n( -p.x, -p.y ); return r.translate( n ); } inline Path operator*(const b2Mat22& m) const { Path r( *this ); return r.rotate( m ); } inline Path& operator+=(const Vec2& p) { return translate( p ); } inline Path& operator-=(const Vec2& p) { Vec2 n( -p.x, -p.y ); return translate( n ); } inline int numPoints() const { return size(); } inline const Vec2& point(int i) const { return at(i); } inline Vec2& point(int i) { return at(i); } inline Vec2& first() { return at(0); } inline Vec2& last() { return at(size()-1); } inline Vec2& endpt(unsigned char end) { return end?last():first(); } void simplify( float32 threshold ); void segmentize(float length); Rect bbox() const; void withSegments(std::function fn); private: void simplifySub( int first, int last, float32 threshold, bool* keepflags ); }; #endif //PATH_H numptyphysics-0.3.10/src/Renderer.h000066400000000000000000000055021425065123200172420ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_RENDERER_H #define NUMPTYPHYSICS_RENDERER_H #include #include "Common.h" #include "Path.h" namespace NP { class TextureData { public: TextureData(int w, int h) : w(w), h(h) {} virtual ~TextureData() {} int w; int h; }; typedef std::shared_ptr Texture; class FontData { public: FontData(int size) : size(size) {} virtual ~FontData() {} int size; }; typedef std::shared_ptr Font; class FramebufferData { public: FramebufferData(int w, int h) : w(w), h(h) {} virtual ~FramebufferData() {} int w; int h; }; typedef std::shared_ptr Framebuffer; class Renderer { public: virtual ~Renderer() {} virtual Vec2 framebuffer_size() = 0; virtual Vec2 world_size() = 0; Rect framebuffer_rect() { return Rect(Vec2(0, 0), framebuffer_size()); } Rect world_rect() { return Rect(Vec2(0, 0), world_size()); } virtual Texture load(const char *filename, bool cache) = 0; virtual Framebuffer framebuffer(Vec2 size) = 0; virtual void begin(Framebuffer &rendertarget, Rect world_rect) = 0; virtual void end(Framebuffer &rendertarget) = 0; virtual Texture retrieve(Framebuffer &rendertarget) = 0; virtual Rect clip(Rect rect) = 0; virtual void image(const Texture &texture, int x, int y, int w, int h) = 0; virtual void subimage(const Texture &texture, const Rect &src, const Rect &dst) = 0; virtual void blur(const Texture &texture, const Rect &src, const Rect &dst, float rx, float ry) = 0; virtual void rewind(const Texture &texture, const Rect &src, const Rect &dst, float t, float a) = 0; virtual void saturation(const Texture &texture, const Rect &src, const Rect &dst, float a) = 0; virtual void rectangle(const Rect &rect, int rgba, bool fill) = 0; virtual void path(const Path &path, int rgba) = 0; virtual Font load(const char *filename, int size) = 0; virtual void metrics(const Font &font, const char *text, int *width, int *height) = 0; virtual Texture text(const Font &font, const char *text, int rgb) = 0; virtual void clear() = 0; virtual void flush() = 0; virtual void swap() = 0; }; }; #endif /* NUMPTYPHYSICS_RENDERER_H */ numptyphysics-0.3.10/src/Scene.cpp000066400000000000000000000603161425065123200170700ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2009, 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Common.h" #include "Config.h" #include "Scene.h" #include "Accelerometer.h" #include "Colour.h" #include "Stroke.h" #include "tinyxml2.h" #include "thp_format.h" #include "thp_iterutils.h" #include "petals_log.h" #include #include #include #include static constexpr const char *JOINT_IND_PATH = "282,39 280,38 282,38 285,39 300,39 301,60 303,66 302,64 " "301,63 300,48 297,41 296,42 294,43 293,45 291,46 289,48 " "287,49 286,52 284,53 283,58 281,62 280,66 282,78 284,82 " "287,84 290,85 294,88 297,88 299,89 302,90 308,90 311,89 " "314,89 320,85 321,83 323,83 324,81 327,78 328,75 327,63 " "326,58 325,55 323,54 321,51 320,49 319,48 316,46 314,44 " "312,43 314,43"; struct JointInd { JointInd() : path(JOINT_IND_PATH) { path.scale(12.0f / (float32)path.bbox().width()); //path.simplify( 2.0f ); path.makeRelative(); } Path path; }; static JointInd jointInd; Scene::Scene( bool noWorld ) : m_world( NULL ), m_protect( 0 ), m_gravity(0.0f, 0.0f), m_dynamicGravity(false), m_accelerometer(Os::get()->getAccelerometer()), m_step(0) , m_ticks(0) , m_color_rects() , m_interactions() , m_createStroke(nullptr) , m_createJetStream(nullptr) , m_moveStroke(nullptr) , m_moveOffset() , m_paused(false) { if ( !noWorld ) { resetWorld(); } } Scene::~Scene() { clear(); m_interactions.clear(); if ( m_world ) { delete m_world; } } bool Scene::onSceneEvent(const SceneEvent &ev) { m_recorder.onSceneEvent(ev); //LOG_INFO("Got scene event: %s", ev.repr().c_str()); switch (ev.op) { case SceneEvent::PAUSE: m_paused = true; return true; case SceneEvent::UNPAUSE: m_paused = false; return true; case SceneEvent::INTERACT_AT: return interact(ev.pos); case SceneEvent::BEGIN_CREATE_STROKE_AT: if (!m_createStroke) { int colour = ev.userdata1; int attrib = ev.userdata2; m_createStroke = newStroke(Path() & ev.pos, colour, attrib); return true; } break; case SceneEvent::EXTEND_CREATE_STROKE_AT: if (m_createStroke) { extendStroke(m_createStroke, ev.pos); return true; } break; case SceneEvent::ACTIVATE_CREATE_STROKE: if (m_createStroke) { if (activateStroke(m_createStroke)) { m_createStroke = nullptr; return true; } else { deleteStroke(m_createStroke); m_createStroke = nullptr; return false; } } break; case SceneEvent::ROPEIFY_CREATE_STROKE: if (m_createStroke) { for (auto &stroke: m_createStroke->ropeify(*this)) { activateStroke(stroke); } deleteStroke(m_createStroke); m_createStroke = nullptr; return true; } break; case SceneEvent::BEGIN_MOVE_STROKE_AT: if (!m_moveStroke) { m_moveStroke = strokeAtPoint(ev.pos, SELECT_TOLERANCE); if (m_moveStroke) { m_moveOffset = ev.pos - m_moveStroke->origin(); } return true; } break; case SceneEvent::CONTINUE_MOVE_STROKE_AT: if (m_moveStroke) { moveStroke(m_moveStroke, ev.pos - m_moveOffset); return true; } break; case SceneEvent::FINISH_MOVE_STROKE: if (m_moveStroke) { m_moveStroke = nullptr; return true; } break; case SceneEvent::DELETE_STROKE_AT: return deleteStroke(strokeAtPoint(ev.pos, SELECT_TOLERANCE)); break; case SceneEvent::DELETE_LAST_STROKE: // FIXME: Make sure undo also works correctly for ropes (delete whole rope at once) if (m_createStroke) { deleteStroke(m_createStroke); m_createStroke = nullptr; return false; } else if (!m_strokes.size()) { return false; } return deleteStroke(m_strokes.back()); case SceneEvent::BEGIN_CREATE_JETSTREAM_AT: if (!m_createJetStream) { m_createJetStream = newJetStream(ev.pos); return true; } break; case SceneEvent::RESIZE_CREATE_JETSTREAM_AT: if (m_createJetStream) { m_createJetStream->resize(ev.pos); return true; } break; case SceneEvent::ACTIVATE_CREATE_JETSTREAM: if (m_createJetStream) { m_createJetStream->activate(); m_createJetStream = nullptr; return true; } break; case SceneEvent::DELETE_LAST_JETSTREAM: if (m_createJetStream) { m_createJetStream = nullptr; } if (m_jetStreams.size()) { auto js = m_jetStreams.back(); m_jetStreams.pop_back(); delete js; return true; } break; default: LOG_NOTREACHED; return false; } return false; } void Scene::resetWorld() { const b2Vec2 gravity(0.0f, GRAVITY_ACCELf*PIXELS_PER_METREf/GRAVITY_FUDGEf); delete m_world; b2AABB worldAABB; worldAABB.lowerBound.Set(-1000.0f, -1000.0f); worldAABB.upperBound.Set(1000.0f, 1000.0f); bool doSleep = true; m_world = new b2World(worldAABB, gravity, doSleep); m_world->SetContactListener( this ); } Stroke* Scene::newStroke( const Path& p, int colour, int attribs ) { Stroke *s = new Stroke(p); s->setAttribute( (Attribute)attribs ); switch ( colour ) { case 0: s->setAttribute( ATTRIB_TOKEN ); break; case 1: s->setAttribute( ATTRIB_GOAL ); break; default: s->setColour( NP::Colour::values[colour] ); break; } m_strokes.push_back( s ); return s; } bool Scene::deleteStroke( Stroke *s ) { if ( s ) { int i = indexOf(m_strokes, s); if ( i >= m_protect ) { s->reset(m_world); m_strokes.erase(std::find(m_strokes.begin(), m_strokes.end(), s)); m_deletedStrokes.push_back(s); return true; } } return false; } void Scene::extendStroke( Stroke* s, const Vec2& pt ) { if ( s ) { int i = indexOf(m_strokes, s); if ( i >= m_protect ) { s->addPoint( pt ); } } } void Scene::moveStroke( Stroke* s, const Vec2& origin ) { if ( s ) { int i = indexOf(m_strokes, s); if ( i >= m_protect ) { s->origin( origin ); } } } bool Scene::activateStroke( Stroke *s ) { return activate(s); } std::list Scene::getJointCandidates(Stroke *s) { std::vector joints; for (auto &stroke: m_strokes) { if (s == stroke) { continue; } s->determineJoints(stroke, joints); stroke->determineJoints(s, joints); } std::list result; for (auto &joint: joints) { result.push_front(joint.joiner->endpt(joint.end)); } return result; } bool Scene::activate( Stroke *s ) { if ( s->numPoints() > 1 ) { s->createBodies( *m_world ); createJoints( s ); return true; } return false; } void Scene::activateAll() { for ( int i=0; i < m_strokes.size(); i++ ) { m_strokes[i]->createBodies( *m_world ); } for ( int i=0; i < m_strokes.size(); i++ ) { createJoints( m_strokes[i] ); } } void Scene::createJoints( Stroke *s ) { if ( s->body()==NULL ) { return; } std::vector joints; for ( int j=m_strokes.size()-1; j>=0; j-- ) { if ( s != m_strokes[j] && m_strokes[j]->body() ) { s->determineJoints( m_strokes[j], joints ); m_strokes[j]->determineJoints( s, joints ); for ( int i=0; ijoin( m_world, joints[i].joinee, joints[i].end ); } joints.clear(); } } } bool Scene::introCompleted() { return m_step >= m_strokes.size(); } void Scene::step() { m_step++; if (!introCompleted()) { return; } m_ticks++; m_recorder.tick(this); m_player.tick(this); if (introCompleted() && !m_paused) { for (auto &stream: m_jetStreams) { stream->tick(); stream->update(m_strokes); } if (m_accelerometer && m_dynamicGravity) { float32 gx, gy, gz; if (m_accelerometer->poll(gx, gy, gz)) { if (m_dynamicGravity || gx*gx+gy*gy > 1.2*1.2) { const float32 factor = GRAVITY_ACCELf*PIXELS_PER_METREf/GRAVITY_FUDGEf; setGravity(b2Vec2(m_gravity.x + gx*factor, m_gravity.y + gy*factor)); } else if (m_currentGravity != m_gravity) { setGravity((m_currentGravity + m_gravity) * 0.5); } // TODO: record gravity } } m_world->Step(ITERATION_TIMESTEPf, SOLVER_ITERATIONS); // clean up delete strokes for (auto &stroke: m_strokes) { if (stroke->hasAttribute(ATTRIB_DELETED)) { stroke->clearAttribute(ATTRIB_DELETED); stroke->hide(); } } // check for token respawn for (auto &stroke: m_strokes) { // TODO: also respawn goal if it's not shrinking yet if (stroke->hasAttribute(ATTRIB_TOKEN) && !BOUNDS_RECT.intersects(stroke->worldBbox())) { stroke->reset(m_world); activate(stroke); } } } // Update bounding boxes for interactive elements m_color_rects = calcColorRects(); } // b2ContactListener callback when a new contact is detected void Scene::Add(const b2ContactPoint* point) { // check for completion //if (c->GetManifoldCount() > 0) { Stroke* s1 = (Stroke*)point->shape1->GetBody()->GetUserData(); Stroke* s2 = (Stroke*)point->shape2->GetBody()->GetUserData(); if ( s1 && s2 ) { if ( s2->hasAttribute(ATTRIB_TOKEN) ) { b2Swap( s1, s2 ); } if ( s1->hasAttribute(ATTRIB_TOKEN) && s2->hasAttribute(ATTRIB_GOAL) ) { s2->setAttribute(ATTRIB_DELETED); } } } bool Scene::isCompleted() { for ( int i=0; i < m_strokes.size(); i++ ) { if ( m_strokes[i]->hasAttribute( ATTRIB_GOAL ) && !m_strokes[i]->hidden() ) { return false; } } return true; } void Scene::draw(Canvas &canvas, bool everything) { Image paper("paper.png", true); canvas.drawImage(paper); int i = 0; const int fade_duration = 50; for (auto &stroke: m_strokes) { int a = 0; if (everything || m_step > i + fade_duration) { a = 255; } else if (m_step > i) { a = 255 * float(m_step - i) / fade_duration; } stroke->draw(canvas, a); i++; //canvas.drawRect(stroke->screenBbox(), 0xff0000, true, 100); } clearWithDelete(m_deletedStrokes); for (auto &kv: m_color_rects) { canvas.drawRect(kv.second, kv.first, true, 128); } if (m_createStroke) { b2Mat22 rot(0.01 * OS->ticks()); for (auto &candidate: getJointCandidates(m_createStroke)) { Path joint = jointInd.path; joint.translate(-joint.bbox().centroid()); joint.rotate(rot); joint.translate(candidate + joint.bbox().centroid()); canvas.drawPath(joint, 0x606060); } } for (auto &stream: m_jetStreams) { stream->draw(canvas); } } bool Scene::canInteractAt(const Vec2 &pos) { for (auto &kv: m_color_rects) { if (kv.second.contains(pos)) { return true; } } return false; } bool Scene::interact(const Vec2 &pos) { for (auto &kv: m_color_rects) { if (kv.second.contains(pos)) { if (m_interactions.handle(kv.first)) { return true; } } } return false; } std::map Scene::calcColorRects() { std::map result; std::map> strokesMap; for (auto &stroke: m_strokes) { if (!stroke->hasAttribute(ATTRIB_INTERACTIVE)) { continue; } strokesMap[NP::Colour::toIndex(stroke->colour())].push_back(stroke); } for (auto &kv: strokesMap) { int color = kv.first; auto &strokes = kv.second; Rect r = strokes.front()->worldBbox(); for (auto &s: strokes) { r.expand(s->worldBbox()); } result[color] = r; } return result; } Stroke* Scene::strokeAtPoint( const Vec2 pt, float32 max ) { Stroke* best = NULL; for ( int i=0; idistanceTo( pt ); if ( d < max ) { max = d; best = m_strokes[i]; } } return best; } void Scene::clear() { for (auto &s: m_strokes) { s->reset(m_world); } clearWithDelete(m_strokes); clearWithDelete(m_deletedStrokes); if ( m_world ) { //step is required to actually destroy bodies and joints m_world->Step( ITERATION_TIMESTEPf, SOLVER_ITERATIONS ); } m_log.clear(); clearWithDelete(m_jetStreams); } bool Scene::replay() { // Remove all unprotected strokes while (m_strokes.size() > m_protect) { auto s = m_strokes.back(); s->reset(m_world); delete s; m_strokes.pop_back(); } // TODO: Remove all unprotected jet streams for (auto &s: m_strokes) { s->reset(m_world); } return start(); } void Scene::setGravity( const b2Vec2& g ) { m_gravity = m_currentGravity = g; if (m_world) { m_world->SetGravity( m_gravity ); } } void Scene::setGravity( const std::string& s ) { for (int i=0; i splitLines(const std::string &str) { std::list result; size_t pos = 0; do { size_t start = pos; pos = str.find('\n', pos + 1); size_t end = (pos == std::string::npos ? pos : pos - start); result.push_back(str.substr(start, end)); pos++; } while (pos != std::string::npos + 1); return result; } class SceneSVGVisitor : public tinyxml2::XMLVisitor { public: SceneSVGVisitor(Scene *scene) : tinyxml2::XMLVisitor() , scene(scene) { } virtual bool VisitEnter(const tinyxml2::XMLElement &element, const tinyxml2::XMLAttribute *firstAttribute) { if (strcmp(element.Name(), "np:meta") == 0) { const tinyxml2::XMLAttribute *attr; attr = element.FindAttribute("title"); if (attr) { scene->m_title = attr->Value(); } attr = element.FindAttribute("background"); if (attr) { scene->m_bg = attr->Value(); } attr = element.FindAttribute("author"); if (attr) { scene->m_author = attr->Value(); } attr = element.FindAttribute("gravity"); if (attr) { scene->setGravity(attr->Value()); } } else if (strcmp(element.Name(), "np:interaction") == 0) { const tinyxml2::XMLAttribute *color = element.FindAttribute("np:color"); const tinyxml2::XMLAttribute *action = element.FindAttribute("np:action"); if (color && action) { scene->m_interactions.add(color->Value(), action->Value()); } else { LOG_WARNING("Invalid np:interaction"); } } else if (strcmp(element.Name(), "rect") == 0) { const tinyxml2::XMLAttribute *flags = element.FindAttribute("class"); if (flags && strcmp(flags->Value(), "jetstream") == 0) { const tinyxml2::XMLAttribute *x = element.FindAttribute("x"); const tinyxml2::XMLAttribute *y = element.FindAttribute("y"); const tinyxml2::XMLAttribute *width = element.FindAttribute("width"); const tinyxml2::XMLAttribute *height = element.FindAttribute("height"); const tinyxml2::XMLAttribute *force = element.FindAttribute("np:force"); if (!x || !y || !width || !height || !force || !scene->addJetStream(x->Value(), y->Value(), width->Value(), height->Value(), force->Value())) { LOG_WARNING("Invalid jetstream"); } } } else if (strcmp(element.Name(), "path") == 0) { const tinyxml2::XMLAttribute *flags = element.FindAttribute("class"); const tinyxml2::XMLAttribute *stroke = element.FindAttribute("stroke"); const tinyxml2::XMLAttribute *data = element.FindAttribute("d"); std::string rgb; if (stroke) { rgb = stroke->Value(); } else { stroke = element.FindAttribute("style"); if (stroke) { std::map m; try { for (auto &entry: thp::map(thp::trim, thp::split(stroke->Value(), ";"))) { std::string k, v; thp::unpack({&k, &v}) = thp::map(thp::trim, thp::split(entry, ":")); m[k] = v; } } catch (thp::UnpackException e) { LOG_WARNING("Cannot unpack: %s", stroke->Value()); } rgb = m["stroke"]; } } if (flags && rgb.size() > 0 && data) { scene->m_strokes.push_back(new Stroke(flags->Value(), rgb, data->Value())); } else { LOG_WARNING("Invalid path"); } } else if (strcmp(element.Name(), "np:event") == 0) { const tinyxml2::XMLAttribute *attr = element.FindAttribute("value"); if (attr) { scene->m_log.push_back(ScriptLogEntry::deserialize(attr->Value())); } else { LOG_WARNING("Invalid np:event"); } } return true; } private: Scene *scene; }; bool Scene::load(const std::string &level) { clear(); resetWorld(); m_dynamicGravity = false; m_step = 0; m_ticks = 0; if (level.find(" 0) { m_recorder.stop(); m_player.start(&m_log); return true; } m_player.stop(); m_recorder.start(&m_log); return false; } void Scene::protect( int n ) { m_protect = (n==-1 ? m_strokes.size() : n ); } bool Scene::save( const std::string& file, bool saveLog ) { LOG_INFO("Saving level to %s", file.c_str()); std::ofstream o( file.c_str(), std::ios::out ); if ( o.is_open() ) { o << thp::format("", WORLD_WIDTH, WORLD_HEIGHT, NPSVG_NAMESPACE) << std::endl; o << thp::format("", WORLD_WIDTH, WORLD_HEIGHT) << std::endl; o << thp::format("", m_author.c_str(), m_bg.c_str(), m_title.c_str()) << std::endl; for (auto &stream: m_jetStreams) { o << stream->asString() << std::endl; } o << m_interactions.serialize(); for ( int i=0; iasString() << std::endl; } if (saveLog) { for (auto &entry: m_log) { o << thp::format("", ScriptLogEntry::serialize(entry).c_str()) << std::endl; } } o << "" << std::endl; o.close(); return true; } else { return false; } } bool Scene::addJetStream(const char *x, const char *y, const char *width, const char *height, const char *force) { int ix = atoi(x); int iy = atoi(y); int iw = atoi(width); int ih = atoi(height); auto v = thp::split(force, ","); if (v.size() != 2) { return false; } b2Vec2 vforce(strtof(v[0].c_str(), nullptr), strtof(v[1].c_str(), nullptr)); auto js = new JetStream(Rect(ix, iy, ix+iw, iy+ih), vforce); m_jetStreams.push_back(js); js->activate(); return true; } JetStream * Scene::newJetStream(const Vec2 &pos) { auto force = b2Vec2(0.f, -10.f); auto js = new JetStream(Rect(pos, pos + Vec2(10, 10)), force); m_jetStreams.push_back(js); return js; } void Scene::playbackUntil(ScriptLog &log, int ticks) { ScriptPlayer player; player.start(&log); while (m_ticks < ticks) { step(); if (introCompleted()) { player.tick(this); } } LOG_INFO("Played back %d events in %d frames", player.index(), m_step); // Here, we have to do some cleanup, as the replay might have // cut the events somewhere in the middle (later on, we might // have sync barriers for scene events and avoid it this way) if (m_createStroke) { // Incomplete stroke due to replay - remove it onSceneEvent(SceneEvent(SceneEvent::DELETE_LAST_STROKE)); } if (m_moveStroke) { // In-progress move due to replay - finish it onSceneEvent(SceneEvent(SceneEvent::FINISH_MOVE_STROKE)); } if (m_createJetStream) { // Incomplete jet stream due to replay - remove it onSceneEvent(SceneEvent(SceneEvent::DELETE_LAST_JETSTREAM)); } // TODO: Sync paused state with game (either take current pause value // and set that in the game, or take game's pause state and apply to // current state (this way, one can pause the physics and rewind) } numptyphysics-0.3.10/src/Scene.h000066400000000000000000000066301425065123200165340ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_SCENE_H #define NUMPTYPHYSICS_SCENE_H #include "Common.h" #include "Path.h" #include "Canvas.h" #include "Script.h" #include "Interactions.h" #include "JetStream.h" #include "SceneEvent.h" #include #include #include #include #include class Stroke; class b2World; class Accelerometer; class Scene : private b2ContactListener { public: Scene( bool noWorld=false ); ~Scene(); bool onSceneEvent(const SceneEvent &ev); Stroke* newStroke( const Path& p, int colour, int attributes ); bool deleteStroke( Stroke *s ); void extendStroke( Stroke* s, const Vec2& pt ); void moveStroke( Stroke* s, const Vec2& origin ); bool activateStroke( Stroke *s ); std::list getJointCandidates(Stroke *s); JetStream *newJetStream(const Vec2 &pos); int numStrokes() { return m_strokes.size(); } std::vector& strokes() { return m_strokes; } bool canInteractAt(const Vec2 &pos); bool interact(const Vec2 &pos); void step(); bool introCompleted(); bool isCompleted(); void draw(Canvas &canvas, bool everything=false); Stroke* strokeAtPoint( const Vec2 pt, float32 max ); void clear(); bool replay(); void setGravity( const b2Vec2& g ); void setGravity( const std::string& s ); bool load(const std::string &level); bool start(); void protect( int n=-1 ); bool save( const std::string& file, bool saveLog=false ); ScriptLog* getLog() { return &m_log; } int getTicks() { return m_ticks; } void playbackUntil(ScriptLog &log, int ticks); private: bool addJetStream(const char *x, const char *y, const char *width, const char *height, const char *force); void resetWorld(); bool activate( Stroke *s ); void activateAll(); void createJoints( Stroke *s ); std::map calcColorRects(); // b2ContactListener callback when a new contact is detected virtual void Add(const b2ContactPoint* point) ; b2World *m_world; std::vector m_strokes; std::vector m_deletedStrokes; std::string m_title, m_author, m_bg; ScriptLog m_log; ScriptRecorder m_recorder; ScriptPlayer m_player; int m_protect; b2Vec2 m_gravity; b2Vec2 m_currentGravity; bool m_dynamicGravity; Accelerometer *m_accelerometer; int m_step; int m_ticks; std::map m_color_rects; NP::Interactions m_interactions; std::vector m_jetStreams; // Create and move stuff Stroke *m_createStroke; JetStream *m_createJetStream; Stroke *m_moveStroke; Vec2 m_moveOffset; bool m_paused; friend class SceneSVGVisitor; }; #endif /* NUMPTYPHYSICS_SCENE_H */ numptyphysics-0.3.10/src/SceneEvent.cpp000066400000000000000000000024501425065123200200650ustar00rootroot00000000000000#include "SceneEvent.h" #include "petals_log.h" #include "thp_format.h" static const OperatorMetadata META[] = { #define SCENE_EVENT_DEFINE_OPERATION(name, has_pos, data_fields) OperatorMetadata(#name, has_pos, data_fields), #include "SceneEventDef.h" #undef SCENE_EVENT_DEFINE_OPERATION }; static enum SceneEvent::Op findOp(const std::string &op) { for (int i=0; ihas_pos ? thp::format(" (pos=%d,%d)", pos.x, pos.y) : ""); std::string arginfo; for (int i=0; idata_fields; i++) { if (arginfo.length()) { arginfo += ", "; } arginfo += thp::format("%d", arg(i)); } if (arginfo.length()) { arginfo = " (args=" + arginfo + ")"; } return std::string(m->name) + posinfo + arginfo; } const OperatorMetadata * SceneEvent::meta(enum Op op) { return &META[op]; } numptyphysics-0.3.10/src/SceneEvent.h000066400000000000000000000026051425065123200175340ustar00rootroot00000000000000#ifndef NUMPTYPHYSICS_SCENEEVENT_H #define NUMPTYPHYSICS_SCENEEVENT_H #include "Common.h" #include struct OperatorMetadata { const char *name; bool has_pos; int data_fields; OperatorMetadata(const char *name, bool has_pos, int data_fields) : name(name) , has_pos(has_pos) , data_fields(data_fields) { } }; struct SceneEvent { enum Op { #define SCENE_EVENT_DEFINE_OPERATION(name, has_pos, data_fields) name, #include "SceneEventDef.h" #undef SCENE_EVENT_DEFINE_OPERATION }; SceneEvent(const std::string &op, const Vec2 &pos, int userdata1, int userdata2); SceneEvent(enum Op op, int x=0, int y=0, int userdata1=0, int userdata2=0) : op(op), pos(x, y), userdata1(userdata1), userdata2(userdata2) {} SceneEvent(enum Op op, const Vec2 &pos, int userdata1=0, int userdata2=0) : op(op), pos(pos), userdata1(userdata1), userdata2(userdata2) {} const OperatorMetadata *meta() const { return meta(op); } std::string repr() const; int arg(int i) const { switch (i) { case 0: return userdata1; case 1: return userdata2; default: return 0; } } static const OperatorMetadata *meta(enum Op op); enum Op op; Vec2 pos; int userdata1; int userdata2; }; #endif /* NUMPTYPHYSICS_SCENEEVENT_H */ numptyphysics-0.3.10/src/SceneEventDef.h000066400000000000000000000032061425065123200201510ustar00rootroot00000000000000 /** * Definition of possible values for scene event. * * Macro syntax: * SCENE_EVENT_DEFINE_OPERATION(name, has_pos, data_fields) * - name: Symbolic name of operation * - has_pos: If the event has/needs position information * - data_fields: Number of additional userdata fields * * Used in: * - SceneEvent.h for defining the symbolic enum constants * - SceneEvent.cpp for defining the metadata fields **/ #if !defined(SCENE_EVENT_DEFINE_OPERATION) #error "Define SCENE_EVENT_DEFINE_OPERATION before including this file" #endif // Pause / unpause physics SCENE_EVENT_DEFINE_OPERATION(PAUSE, false, 0) SCENE_EVENT_DEFINE_OPERATION(UNPAUSE, false, 0) // Interaction SCENE_EVENT_DEFINE_OPERATION(INTERACT_AT, true, 0) // Create stroke SCENE_EVENT_DEFINE_OPERATION(BEGIN_CREATE_STROKE_AT, true, 2) SCENE_EVENT_DEFINE_OPERATION(EXTEND_CREATE_STROKE_AT, true, 0) SCENE_EVENT_DEFINE_OPERATION(ACTIVATE_CREATE_STROKE, false, 0) // Create stroke - advanced SCENE_EVENT_DEFINE_OPERATION(ROPEIFY_CREATE_STROKE, false, 0) // Move stroke SCENE_EVENT_DEFINE_OPERATION(BEGIN_MOVE_STROKE_AT, true, 0) SCENE_EVENT_DEFINE_OPERATION(CONTINUE_MOVE_STROKE_AT, true, 0) SCENE_EVENT_DEFINE_OPERATION(FINISH_MOVE_STROKE, false, 0) // Delete stroke SCENE_EVENT_DEFINE_OPERATION(DELETE_LAST_STROKE, false, 0) SCENE_EVENT_DEFINE_OPERATION(DELETE_STROKE_AT, true, 0) // Create jet stream SCENE_EVENT_DEFINE_OPERATION(BEGIN_CREATE_JETSTREAM_AT, true, 0) SCENE_EVENT_DEFINE_OPERATION(RESIZE_CREATE_JETSTREAM_AT, true, 0) SCENE_EVENT_DEFINE_OPERATION(ACTIVATE_CREATE_JETSTREAM, false, 0) // Delete jet stream SCENE_EVENT_DEFINE_OPERATION(DELETE_LAST_JETSTREAM, false, 0) numptyphysics-0.3.10/src/Script.cpp000066400000000000000000000061771425065123200173040ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Script.h" #include "Scene.h" #include #include "petals_log.h" #include "thp_format.h" std::string ScriptLogEntry::serialize(const ScriptLogEntry &e) { return thp::format("@%d:%s:%d,%d:%d:%d", e.tick, e.ev.meta()->name, e.ev.pos.x, e.ev.pos.y, e.ev.userdata1, e.ev.userdata2); } static int number(const std::string &s) { // TODO: Error checking return atoi(s.c_str()); } static std::vector split_by(const char *splits, const std::string &s) { std::vector result; int len = strlen(splits); size_t pos = 0; for (int i=0; ipush_back(ScriptLogEntry(m_ticks, ev)); m_index++; } else { LOG_WARNING("No log in ScriptRecorder onSceneEvent"); } } } void ScriptPlayer::tick(Scene *scene) { ScriptHandler::tick(scene); while (m_running && m_index < m_log->size() && m_log->at(m_index).tick <= m_ticks) { scene->onSceneEvent(m_log->at(m_index).ev); m_index++; } } numptyphysics-0.3.10/src/Script.h000066400000000000000000000033651425065123200167450ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef SCRIPT_H #define SCRIPT_H #include "SceneEvent.h" #include #include #include class Scene; struct ScriptLogEntry { ScriptLogEntry(int tick, const SceneEvent &ev) : tick(tick), ev(ev) {} static std::string serialize(const ScriptLogEntry &e); static ScriptLogEntry deserialize(const std::string &s); int tick; SceneEvent ev; }; class ScriptLog : public std::vector { }; class ScriptHandler { public: ScriptHandler() : m_log(nullptr) , m_running(false) , m_ticks(0) , m_index(0) {} virtual void start(ScriptLog *log); virtual void stop(); virtual void tick(Scene *scene); bool running() { return m_running; } int index() { return m_index; } protected: ScriptLog *m_log; bool m_running; int m_ticks; int m_index; }; class ScriptRecorder : public ScriptHandler { public: void onSceneEvent(const SceneEvent &ev); }; class ScriptPlayer : public ScriptHandler { public: virtual void tick(Scene *scene); }; #endif //SCRIPT_H numptyphysics-0.3.10/src/Stroke.cpp000066400000000000000000000275611425065123200173070ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Stroke.h" #include "Scene.h" #include "thp_format.h" #include #include static constexpr const int SVG_STROKE_WIDTH = 3; static struct { const char *name; Attribute attribute; } ATTRIBUTE_NAMES[] = { { "token", ATTRIB_TOKEN, }, { "goal", ATTRIB_GOAL, }, { "fixed", ATTRIB_GROUND, }, { "sleeping", ATTRIB_SLEEPING, }, { "decor", ATTRIB_DECOR, }, { "rope", ATTRIB_ROPE, }, { "interactive", ATTRIB_INTERACTIVE, }, }; Stroke::Stroke(const Path &path) : m_rawPath(path) , m_body(nullptr) { m_colour = NP::Colour::DEFAULT; m_attributes = 0; m_origin = m_rawPath.point(0); m_rawPath.translate( -m_origin ); reset(); } Stroke::Stroke(const std::string &str) : m_body(nullptr) { int col = 0; m_colour = NP::Colour::DEFAULT; m_attributes = 0; m_origin = Vec2(400,240); reset(); const char *s = str.c_str(); while ( *s && *s!=':' && *s!='\n' ) { switch ( *s ) { case 't': setAttribute( ATTRIB_TOKEN ); break; case 'g': setAttribute( ATTRIB_GOAL ); break; case 'f': setAttribute( ATTRIB_GROUND ); break; case 's': setAttribute( ATTRIB_SLEEPING ); break; case 'd': setAttribute( ATTRIB_DECOR ); break; case 'r': setAttribute( ATTRIB_ROPE ); break; case 'i': setAttribute( ATTRIB_INTERACTIVE ); break; default: if ( *s >= '0' && *s <= '9' ) { col = col*10 + *s -'0'; } break; } s++; } if ( col >= 0 && col < NP::Colour::count ) { m_colour = NP::Colour::values[col]; } if ( *s++ == ':' ) { m_rawPath = Path(s); } if ( m_rawPath.size() < 2 ) { throw "invalid stroke def"; } m_origin = m_rawPath.point(0); m_rawPath.translate( -m_origin ); setAttribute( ATTRIB_DUMMY ); } Stroke::Stroke(const std::string &flags, const std::string &rgb, const std::string &svgpath) : m_body(nullptr) { m_colour = NP::Colour::DEFAULT; m_attributes = 0; m_origin = Vec2(400,240); reset(); int r = 0, g = 0, b = 0; if (sscanf(rgb.c_str(), "#%02x%02x%02x", &r, &g, &b) == 3) { m_colour = (r & 0xff) << 16 | (g & 0xff) << 8 | (b & 0xff); } std::map m; for (auto &e: ATTRIBUTE_NAMES) { m[e.name] = e.attribute; } std::istringstream iss(flags); std::string flag; while (getline(iss, flag, ' ')) { setAttribute(m[flag]); } m_rawPath = Path::fromSVG(svgpath); m_origin = m_rawPath.point(0); m_rawPath.translate(-m_origin); setAttribute(ATTRIB_DUMMY); } void Stroke::reset(b2World *world) { if (m_body && world) { world->DestroyBody(m_body); } m_body = NULL; m_xformAngle = 7.0f; m_jointed[0] = m_jointed[1] = false; m_shapePath = m_rawPath; m_hide = 0; } std::string Stroke::asString() { std::stringstream classes; for (auto &e: ATTRIBUTE_NAMES) { if (hasAttribute(e.attribute)) { classes << thp::format("%s ", e.name); } } std::stringstream points; Path opath = m_rawPath; opath.translate(m_origin); for (int i=0; i", classes.str().c_str(), m_colour, SVG_STROKE_WIDTH, points.str().c_str()); } void Stroke::setAttribute(Attribute a) { m_attributes |= a; if ( m_attributes & ATTRIB_TOKEN ) m_colour = NP::Colour::RED; else if ( m_attributes & ATTRIB_GOAL ) m_colour = NP::Colour::YELLOW; } void Stroke::clearAttribute(Attribute a) { m_attributes &= ~a; } bool Stroke::hasAttribute(Attribute a) { return (m_attributes&a) != 0; } void Stroke::setColour(int c) { m_colour = c; } void Stroke::createBodies(b2World &world) { process(); if ( hasAttribute( ATTRIB_DECOR ) ){ return; //decorators have no physical embodiment } int n = m_shapePath.numPoints(); if ( n > 1 ) { b2BodyDef bodyDef; bodyDef.position = m_origin; bodyDef.position *= 1.0f/PIXELS_PER_METREf; bodyDef.userData = this; if ( m_attributes & ATTRIB_SLEEPING ) { bodyDef.isSleeping = true; } m_body = world.CreateBody( &bodyDef ); for ( int i=1; iCreateShape( &boxDef ); } m_body->SetMassFromShapes(); } transform(); } void Stroke::determineJoints(Stroke *other, std::vector &joints) { if ( (m_attributes&ATTRIB_CLASSBITS) != (other->m_attributes&ATTRIB_CLASSBITS) || hasAttribute(ATTRIB_GROUND) || hasAttribute(ATTRIB_UNJOINABLE) || other->hasAttribute(ATTRIB_UNJOINABLE)) { // cannot joint goals or tokens to other things // and no point jointing ground endpts return; } transform(); for ( unsigned char end=0; end<2; end++ ) { if ( !m_jointed[end] ) { const Vec2& p = m_xformedPath.endpt(end); if ( other->distanceTo( p ) <= JOINT_TOLERANCE ) { joints.push_back( Joint(this,other,end) ); } } } } void Stroke::join(b2World *world, Stroke *other, unsigned char end) { if ( !m_jointed[end] ) { b2Vec2 p = m_xformedPath.endpt( end ); p *= 1.0f/PIXELS_PER_METREf; JointDef j( m_body, other->m_body, p ); world->CreateJoint( &j ); m_jointed[end] = true; } } bool Stroke::maybeCreateJoint(b2World &world, Stroke *other) { if ( (m_attributes&ATTRIB_CLASSBITS) != (other->m_attributes&ATTRIB_CLASSBITS) ) { return false; // can only joint matching classes } else if ( hasAttribute(ATTRIB_GROUND) ) { return true; // no point jointing grounds } else if ( m_body && other->body() ) { transform(); int n = m_xformedPath.numPoints(); for ( int end=0; end<2; end++ ) { if ( !m_jointed[end] ) { const Vec2& p = m_xformedPath.point( end ? n-1 : 0 ); if ( other->distanceTo( p ) <= JOINT_TOLERANCE ) { b2Vec2 pw = p; pw *= 1.0f/PIXELS_PER_METREf; JointDef j( m_body, other->m_body, pw ); world.CreateJoint( &j ); m_jointed[end] = true; } } } } if ( m_body ) { return m_jointed[0] && m_jointed[1]; } return true; ///nothing to do } void Stroke::draw(Canvas &canvas, int a) { if (m_hide >= HIDE_STEPS) { return; } transform(); canvas.drawPath(m_screenPath, m_colour, a); if ( false /* drawJoints */ ) { int jointcolour = canvas.makeColour(0xff0000); for ( int e=0; e<2; e++ ) { if (m_jointed[e]) { const Vec2& pt = m_screenPath.endpt(e); //canvas.drawPixel( pt.x, pt.y, jointcolour ); //canvas.drawRect( pt.x-1, pt.y-1, 3, 3, jointcolour ); canvas.drawRect( pt.x-1, pt.y, 3, 1, jointcolour ); canvas.drawRect( pt.x, pt.y-1, 1, 3, jointcolour ); } } } } std::list Stroke::ropeify(Scene &scene) { Path path = m_rawPath; path.simplify(SIMPLIFY_THRESHOLDf); path.segmentize(ROPE_SEGMENT_LENGTHf); int color = NP::Colour::toIndex(m_colour); int attr = m_attributes | ATTRIB_ROPE; std::list result; for (int i=0; iSetXForm( pw, m_body->GetAngle() ); } m_origin = p; } b2Body * Stroke::body() { return m_body; } float32 Stroke::distanceTo(const Vec2 &pt) { float32 best = 100000.0; transform(); for ( int i=1; iSetXForm( b2Vec2(0.0f,WORLD_HEIGHT*2.0f), 0.0f ); m_body->SetLinearVelocity( b2Vec2(0.0f,0.0f) ); m_body->SetAngularVelocity( 0.0f ); } } } bool Stroke::hidden() { return m_hide >= HIDE_STEPS; } int Stroke::numPoints() { return m_rawPath.numPoints(); } const Vec2 & Stroke::endpt(unsigned char end) { return m_xformedPath.endpt(end); } void Stroke::process() { float32 thresh = SIMPLIFY_THRESHOLDf; m_rawPath.simplify( thresh ); m_shapePath = m_rawPath; while ( m_shapePath.numPoints() > MULTI_VERTEX_LIMIT ) { thresh += SIMPLIFY_THRESHOLDf; m_shapePath.simplify( thresh ); } } bool Stroke::transform() { // distinguish between xformed raw and shape path as needed if ( m_hide ) { if ( m_hide < HIDE_STEPS ) { Vec2 o = m_screenBbox.centroid(); m_screenPath -= o; m_screenPath.scale( 0.99 ); m_screenPath += o; m_screenBbox = m_screenPath.bbox(); m_hide++; return true; } } else if ( m_body ) { if ( hasAttribute( ATTRIB_DECOR ) ) { return false; // decor never moves } else if ( hasAttribute( ATTRIB_GROUND ) && m_xformAngle == m_body->GetAngle() ) { return false; // ground strokes never move. } else if ( m_xformAngle != m_body->GetAngle() || ! (m_xformPos == m_body->GetPosition()) ) { b2Mat22 rot( m_body->GetAngle() ); b2Vec2 orig = PIXELS_PER_METREf * m_body->GetPosition(); m_xformedPath = m_rawPath; m_xformedPath.rotate( rot ); m_xformedPath.translate( Vec2(orig) ); m_xformAngle = m_body->GetAngle(); m_xformPos = m_body->GetPosition(); m_screenPath = m_xformedPath; m_screenBbox = m_screenPath.bbox(); } else { return false; } } else { m_xformedPath = m_rawPath; m_xformedPath.translate( m_origin ); m_screenPath = m_xformedPath; m_screenBbox = m_screenPath.bbox(); return !hasAttribute(ATTRIB_DECOR); } return true; } numptyphysics-0.3.10/src/Stroke.h000066400000000000000000000077301425065123200167500ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef NUMPTYPHYSICS_STROKE_H #define NUMPTYPHYSICS_STROKE_H #include "Common.h" #include "Config.h" #include "Canvas.h" #include "Colour.h" #include #include class Stroke; class Scene; enum Attribute { ATTRIB_DUMMY = 0, ATTRIB_GROUND = 1, ATTRIB_TOKEN = 2, ATTRIB_GOAL = 4, ATTRIB_DECOR = 8, ATTRIB_SLEEPING = 16, ATTRIB_HIDDEN = 32, ATTRIB_DELETED = 64, ATTRIB_ROPE = 128, ATTRIB_INTERACTIVE = 256, ATTRIB_CLASSBITS = ATTRIB_TOKEN | ATTRIB_GOAL, ATTRIB_UNJOINABLE = ATTRIB_DECOR | ATTRIB_HIDDEN | ATTRIB_DELETED, }; struct Joint { Joint(Stroke *joiner, Stroke *joinee, unsigned char end) : joiner(joiner) , joinee(joinee) , end(end) { } Stroke *joiner; Stroke *joinee; unsigned char end; // of joiner }; struct JointDef : public b2RevoluteJointDef { JointDef(b2Body *b1, b2Body *b2, const b2Vec2 &pt) { Initialize(b1, b2, pt); maxMotorTorque = 10.0f; motorSpeed = 0.0f; enableMotor = true; } }; struct BoxDef : public b2PolygonDef { float32 vec2Angle(b2Vec2 v) { return b2Atan2(v.y, v.x); } void init(const Vec2 &p1, const Vec2 &p2, int attr) { b2Vec2 barOrigin = p1; b2Vec2 bar = p2 - p1; bar *= 1.0f/PIXELS_PER_METREf; barOrigin *= 1.0f/PIXELS_PER_METREf;; SetAsBox( bar.Length()/2.0f, 0.1f, 0.5f*bar + barOrigin, vec2Angle( bar )); // SetAsBox( bar.Length()/2.0f+b2_toiSlop, b2_toiSlop*2.0f, // 0.5f*bar + barOrigin, vec2Angle( bar )); friction = 0.3f; if (attr & ATTRIB_GROUND) { density = 0.0f; } else if (attr & ATTRIB_GOAL) { density = 100.0f; } else if (attr & ATTRIB_TOKEN) { density = 3.0f; friction = 0.1f; } else { density = 5.0f; } restitution = 0.2f; } }; class Stroke { public: Stroke(const Path &path); Stroke(const std::string &str); Stroke(const std::string &flags, const std::string &rgb, const std::string &svgpath); void reset(b2World *world=nullptr); std::string asString(); void setAttribute(Attribute a); void clearAttribute(Attribute a); bool hasAttribute(Attribute a); void setColour(int c); int colour() { return m_colour; } void createBodies(b2World &world); void determineJoints(Stroke *other, std::vector &joints); void join(b2World *world, Stroke *other, unsigned char end); bool maybeCreateJoint(b2World &world, Stroke *other); void draw(Canvas &canvas, int a); std::list ropeify(Scene &scene); void addPoint(const Vec2 &pp); void origin(const Vec2 &p); b2Body *body(); float32 distanceTo(const Vec2 &pt); Rect screenBbox(); Rect worldBbox(); void hide(); bool hidden(); int numPoints(); const Vec2 &endpt(unsigned char end); Vec2 origin() { return m_origin; } private: void process(); bool transform(); private: Path m_rawPath; int m_colour; int m_attributes; Vec2 m_origin; Path m_shapePath; Path m_xformedPath; Path m_screenPath; float32 m_xformAngle; b2Vec2 m_xformPos; Rect m_screenBbox; b2Body* m_body; bool m_jointed[2]; int m_hide; }; #endif /* NUMPTYPHYSICS_STROKE_H */ numptyphysics-0.3.10/src/Ui.cpp000066400000000000000000000727551425065123200164220ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2012, 2014, 2015 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #include "Ui.h" #include "Font.h" #include "Canvas.h" #include "Os.h" #include "Config.h" #include "Colour.h" #include "petals_log.h" #include "thp_iterutils.h" #include #include static int indent = 0; //////////////////////////////////////////////////////////////// struct TemporaryClip { TemporaryClip(Canvas &screen, const Rect &r) : screen(screen) , r(screen.clip(r)) { } ~TemporaryClip() { screen.clip(r); } Canvas &screen; Rect r; }; Widget::Widget(WidgetParent *p) : m_parent(p), m_eventMap(NULL), m_pos(0,0,2,2), m_focussed(false), m_alpha(0), m_fitToParent(false), m_greedyMouse(false), m_bg(NP::Colour::DEFAULT_BG), m_fg(NP::Colour::DEFAULT_FG), m_border(0), m_targetPos(0, 0), m_animating(false), m_animation_done([](){}), m_visible(true) {} std::string Widget::toString() { char buf[32]; char ind[] = " " " "; sprintf(buf,"[%d,%d-%d,%d]\n",m_pos.tl.x,m_pos.tl.y,m_pos.br.x,m_pos.br.y); ind[indent] = '\0'; std::string s(ind); s += name(); s += buf; return s; } void Widget::move( const Vec2& by ) { m_pos.tl+=by; m_pos.br+=by; } void Widget::sizeTo( const Vec2& size ) { m_pos.br=m_pos.tl+size; onResize(); } bool Widget::processEvent(ToolkitEvent &ev) { if (m_eventMap) { Event e = m_eventMap->process(ev); if (e.code != Event::NOP) { return dispatchEvent(e); } } return false; } bool Widget::dispatchEvent( Event& ev ) { if (m_visible && onEvent(ev)) { return true; } else if (m_parent) { return m_parent->dispatchEvent(ev); } return false; } void Widget::setEventMap(EventMapType map) { setEventMap( OS->getEventMap(map) ); } void Widget::draw( Canvas& screen, const Rect& area ) { if (!m_visible) { return; } if ( m_alpha > 0 ) { Rect r = m_pos; if (!r.isEmpty()) { if ( m_focussed ) { screen.drawRect(m_pos,screen.makeColour(NP::Colour::SELECTED_BG)); } else { screen.drawRect(m_pos,screen.makeColour(m_bg), true, m_alpha); } } } if (m_border) { screen.drawRect(m_pos,screen.makeColour(NP::Colour::TL_BORDER),false); } } void Widget::onTick(int tick) { if (m_animating && m_pos.tl != m_targetPos) { const int RATE = 3; Vec2 diff = m_targetPos - m_pos.tl; if (std::abs(diff.x) <= RATE && std::abs(diff.y) <= RATE) { moveTo(m_targetPos); m_animating = false; m_animation_done(); } else { moveTo((m_pos.tl*RATE+m_targetPos)/(RATE+1)); } } } WidgetParent* Widget::topLevel() { WidgetParent* p = parent(); while (p && p->parent()) { p = p->parent(); } return p; } //////////////////////////////////////////////////////////////// Label::Label() : Widget() , m_tr(nullptr) , m_font(nullptr) , m_alignment(Label::ALIGN_CENTER) { } Label::Label(const Tr& s, const Font* f, int color) : m_tr(s) , m_font(f?f:Font::blurbFont()) , m_alignment(Label::ALIGN_CENTER) { setFg(color); } void Label::text( const Tr& s ) { m_tr = s; } void Label::draw( Canvas& screen, const Rect& area ) { if (!m_visible) { return; } Widget::draw(screen,area); std::string text = m_tr.c_str(); bool align_h_center = ((m_alignment & (ALIGN_LEFT | ALIGN_RIGHT)) == 0); bool align_v_center = ((m_alignment & (ALIGN_TOP | ALIGN_BOTTOM)) == 0); if (align_h_center && align_v_center) { m_font->drawCenter( &screen, m_pos.centroid(), text, m_fg); return; } auto func = &Font::drawCenter; Vec2 pos = m_pos.centroid(); Vec2 metrics = m_font->metrics(text); if ((m_alignment & ALIGN_TOP) != 0) { pos.y = m_pos.tl.y; if (align_h_center) { // Will use drawCenter for drawing, need to adjust vertical pos.y += metrics.y / 2; } } if ((m_alignment & ALIGN_BOTTOM) != 0) { pos.y = m_pos.br.y - metrics.y; if (align_h_center) { // Will use drawCenter for drawing, need to adjust vertical pos.y += metrics.y / 2; } } if ((m_alignment & ALIGN_LEFT) != 0) { pos.x = m_pos.tl.x; func = &Font::drawLeft; if (align_v_center) { // TODO: Adjustments needed? } } if ((m_alignment & ALIGN_RIGHT) != 0) { pos.x = m_pos.br.x; func = &Font::drawRight; if (align_v_center) { // TODO: Adjustments needed? } } (m_font->*func)(&screen, pos, text, m_fg); } //////////////////////////////////////////////////////////////// Button::Button(const Tr& s, Event selEvent) : Label(s), m_selEvent(selEvent) { border(false); alpha(100); font(Font::headingFont()); setEventMap(UI_BUTTON_MAP); } void Button::draw( Canvas& screen, const Rect& area ) { if (!m_visible) { return; } Label::draw(screen, m_pos); if (m_focussed) { //screen.drawRect(m_pos,screen.makeColour(NP::Colour::TL_BORDER),false); } } bool Button::onEvent( Event& ev ) { switch (ev.code) { case Event::SELECT: if (m_focussed) { m_focussed = false; onSelect(); if (m_parent && m_selEvent.code != Event::NOP) { m_parent->dispatchEvent(m_selEvent); } } return true; break; case Event::FOCUS: if (m_pos.contains(Vec2(ev.x,ev.y))) { if (!m_focussed) { m_focussed = true; return true; } } else if (m_focussed) { m_focussed = false; } default: break; } return false; } //////////////////////////////////////////////////////////////// Icon::Icon(Image *image) : m_image(image) { if (image) { sizeTo(Vec2(image->width(), image->height())); } } Icon::~Icon() { delete m_image; } void Icon::image(Image *image) { delete m_image; m_image = image; } void Icon::draw(Canvas &screen, const Rect &area) { Widget::draw(screen, area); if (m_image) { screen.drawImage(*m_image, m_pos.tl.x, m_pos.tl.y); } } //////////////////////////////////////////////////////////////// StockIconButton::StockIconButton(const Tr &label, enum StockIcon::Kind icon, const Event &ev) : Button(label, ev) , m_icon(icon) , m_vertical(true) { } StockIconButton::~StockIconButton() { } void StockIconButton::draw(Canvas &screen, const Rect &area) { Widget::draw(screen, area); std::string text = m_tr.c_str(); int spacing = 10; Vec2 textsize = m_font->metrics(text); Vec2 offset; if (text.empty()) { StockIcon::draw(screen, area, m_icon, m_pos.centroid()); return; } if (m_vertical) { if (textsize.y + spacing + StockIcon::size() > m_pos.height()) { offset = Vec2(0, -textsize.y / 4); StockIcon::draw(screen, area, m_icon, m_pos.centroid() + offset); offset = Vec2(0, (StockIcon::size()) / 4); m_font->drawCenter(&screen, m_pos.centroid() + offset, text, m_fg); } else { offset = Vec2(0, -(textsize.y + spacing) / 2); StockIcon::draw(screen, area, m_icon, m_pos.centroid() + offset); offset = Vec2(0, (StockIcon::size() + spacing) / 2); m_font->drawCenter(&screen, m_pos.centroid() + offset, text, m_fg); } } else { Vec2 contentSize(StockIcon::size() + textsize.x, std::max(StockIcon::size(), textsize.y)); offset = Vec2(m_pos.height() / 2 - m_pos.width() / 2, 0); StockIcon::draw(screen, area, m_icon, m_pos.centroid() + offset); offset = Vec2(m_pos.height() - m_pos.width() / 2 + spacing, -textsize.y / 2); m_font->drawLeft(&screen, m_pos.centroid() + offset, text, m_fg); } } //////////////////////////////////////////////////////////////// IconButton::IconButton(const Tr& s, const std::string& icon, const Event& ev) : Button(s,ev) , m_vertical(true) , m_icon(icon.size() ? new Image(icon) : nullptr) { } IconButton::~IconButton() { delete m_icon; } void IconButton::image(Image *image, bool takeOwnership) { delete m_icon; if (takeOwnership) { m_icon = image; } else { m_icon = new Image(*image); } } Image* IconButton::image() { return m_icon; } void IconButton::icon(const std::string& icon) { delete m_icon; m_icon = new Image(icon); } void IconButton::draw( Canvas& screen, const Rect& area ) { if (m_icon) { Widget::draw(screen,area); if (m_focussed) { screen.drawRect(m_pos,screen.makeColour(NP::Colour::SELECTED_BG),true); } std::string text = m_tr.c_str(); Vec2 textsize = m_font->metrics(text); if (m_vertical) { int x = m_pos.centroid().x - m_icon->width()/2; int y = m_pos.centroid().y - m_icon->height()/2 - textsize.y/2; if (yheight() + m_pos.height()/10; m_font->drawCenter( &screen, Vec2(x,y), text, m_fg); } else { int x = m_pos.tl.x + 10; int y = m_pos.centroid().y - m_icon->height()/2; screen.drawImage(*m_icon,x,y); x += m_icon->width() + 10; y = m_pos.centroid().y - textsize.y/2; m_font->drawLeft( &screen, Vec2(x,y), text, m_fg); } } else { Button::draw(screen,area); } } //////////////////////////////////////////////////////////////// RichText::RichText(const Tr& s, const Font* f) : Label(s,f), m_layoutRequired(true) {} void RichText::text( const Tr& s ) { Label::text(s); m_layoutRequired = true; } void RichText::draw( Canvas& screen, const Rect& area ) { Widget::draw(screen,area); if (m_layoutRequired) { layout(m_pos.width()-20); m_layoutRequired = false; } std::string text = m_tr.c_str(); for (int l=0; l 0) { Vec2 pos = m_pos.tl + m_snippets[l].pos; Vec2 posnext = l==m_snippets.size()-1 ? pos:m_pos.tl+m_snippets[l+1].pos; if (pos.y < area.br.y && posnext.y >= area.tl.y ) { std::string sniptext = thp::trim(text.substr(m_snippets[l].textoff, m_snippets[l].textlen)); switch (m_snippets[l].align) { case 1: pos.x += (m_pos.width()-20-m_snippets[l].font->metrics(sniptext).x)/2; break; case 2: pos.x += m_pos.width()-20-m_snippets[l].font->metrics(sniptext).x; break; } m_snippets[l].font->drawLeft( &screen, pos, sniptext, m_fg); } } } } int RichText::layout(int w) { struct Tag { Tag(const std::string& str, size_t begin, size_t end) : m_str(str), m_closed(false), m_begin(begin), m_end(end) { if (str[m_begin]=='<') {m_begin++;} if (str[m_begin]=='/') {m_closed=true; m_begin++;} if (str[m_end]=='/') {m_closed=true; m_end--;} m_tag = m_str.substr(m_begin,m_str.find_first_of(" \t/>",m_begin)-m_begin); } const std::string& tag() { return m_tag; } std::string prop(const std::string& name) { std::string mark(" "); std::string value; mark += name + '='; if (m_str.find(mark) != std::string::npos) { char term = ' '; const char *p = m_str.c_str() + m_str.find(mark) + mark.length(); if (term==' ' && (*p=='\'' || *p=='"')) { term = *p++; } while (term!=' ' ? (*p != term) : (*p!='/' && *p!='>')) { value += *p++; } } return value; } bool closed() { return m_closed; } const std::string& m_str; bool m_closed; size_t m_begin, m_end; std::string m_tag; }; const int margin = 10; w -= margin*2; int x = margin, y = 0, l = 0, h = 0; size_t p=0; int spacewidth = m_font->metrics(" ").x; Snippet snippet = {Vec2(x,y),0,0,0,m_font}; Vec2 wordmetrics; m_snippets.clear(); m_snippets.push_back(snippet); std::string text = m_tr.c_str(); while (p != std::string::npos) { bool newline = false; size_t e = text.find_first_of(" \t\n\r<>", p); if (e==std::string::npos) { wordmetrics = snippet.font->metrics(text.substr(p,e)); } else { wordmetrics = snippet.font->metrics(text.substr(p,e-p)); } if (x!=margin) { // space wordmetrics.x += spacewidth; } if (x==margin || x+wordmetrics.x < w) { // add to snippet p = e; x += wordmetrics.x; } else { e = p; newline = true; } if (e!=std::string::npos && text[e]=='<') { size_t f = text.find('>',e); Tag tag(text,e,f); if (tag.tag() == "H1") { newline = true; if (tag.closed()) { snippet.font = m_font; y += snippet.font->height()/2; } else { snippet.font = Font::titleFont(); h += snippet.font->height(); } } else if (tag.tag() == "H2") { newline = true; if (tag.closed()) { snippet.font = m_font; y += snippet.font->height()/2; } else { snippet.font = Font::headingFont(); h += snippet.font->height(); } } else if (tag.tag() == "BR") { newline = true; } else if (tag.tag() == "P") { newline = true; std::string align = tag.prop("align"); if (align=="center") snippet.align=1; else if (align=="right") snippet.align=2; else snippet.align=0; } else if (tag.tag() == "LI") { newline = true; x += margin; } else if (tag.tag() == "IMG") { } e = f + 1; } if (newline) { //line break; int len = p - m_snippets[l].textoff; if (len > 0) { m_snippets[l].textlen = len > 0 ? len : 0; m_snippets[l].pos.y = y; snippet.textoff = e; m_snippets.push_back(snippet); y += m_snippets[l].font->height(); l++; x = margin + indent; h = 0; } else { m_snippets[l] = snippet; m_snippets[l].textoff = e; m_snippets[l].pos.x = x; } } p=e; if (p==std::string::npos) { m_snippets[l].textlen = text.length() - m_snippets[l].textoff; m_snippets[l].pos = Vec2(0,y); y += m_snippets[l].font->height(); } else { while (text[p] == ' ' || text[p] == '\n' || text[p] == '\r' || text[p] == '\t') { //eat whitespace if (p==m_snippets[l].textoff) { m_snippets[l].textoff++; } p++; } } } return y; } //////////////////////////////////////////////////////////////// Draggable::Draggable() : m_dragMaybe(false), m_dragging(false), m_step(2,2), m_delta(0,0), m_internalEvent(false) { setEventMap(UI_DRAGGABLE_MAP); } bool Draggable::processEvent(ToolkitEvent &ev) { // get in before our children if (!m_internalEvent && m_eventMap) { Event e = m_eventMap->process(ev); if (e.code != Event::NOP) { if (onPreEvent(e)) { return true; } } } // normal processing return Container::processEvent(ev); } bool Draggable::onPreEvent( Event& ev ) { switch (ev.code) { case Event::MOVEBEGIN: m_dragMaybe = true; m_dragOrg = Vec2(ev.x,ev.y); return true; case Event::MOVEMORE: if (m_dragMaybe && !m_dragging && ( std::abs(ev.x-m_dragOrg.x) >= CLICK_TOLERANCE || std::abs(ev.y-m_dragOrg.y) >= CLICK_TOLERANCE ) ) { m_dragging = true; } if (m_dragging) { m_delta = Vec2(ev.x,ev.y)-m_dragOrg; m_delta.x = m_step.x ? m_delta.x : 0; m_delta.y = m_step.y ? m_delta.y : 0; move( m_delta ); m_dragOrg = Vec2(ev.x,ev.y); return true; } break; case Event::MOVEEND: if (m_dragging) { m_dragMaybe = false; m_dragging = false; return true; } else { //translate into a raw click int finger = 0; // primary finger int button = 1; // left button ToolkitEvent e(ToolkitEvent::PRESS, ev.x, ev.y, finger, button); m_internalEvent = true; processEvent(e); e.type = ToolkitEvent::RELEASE; bool result = processEvent(e); m_internalEvent = false; return result; } break; default: /* do nothing */ break; } return false; } bool Draggable::onEvent( Event& ev ) { switch (ev.code) { case Event::UP: m_dragging = m_dragMaybe = false; move(Vec2(0,m_step.y)); return true; case Event::DOWN: m_dragging = m_dragMaybe = false; move(Vec2(0,-m_step.y)); return true; case Event::LEFT: m_dragging = m_dragMaybe = false; move(Vec2(-m_step.y,0)); return true; case Event::RIGHT: m_dragging = m_dragMaybe = false; move(Vec2(m_step.x,0)); return true; default: break; } return Panel::onEvent(ev); } void Draggable::onTick( int tick ) { if (!m_dragging && (m_delta.x != 0 || m_delta.y != 0)) { move(m_delta); m_delta = m_delta * 50 / 51; } } //////////////////////////////////////////////////////////////// class ScrollContents : public Draggable { public: ScrollContents() { } }; ScrollArea::ScrollArea() : m_canvas(NULL) { m_contents = new ScrollContents(); m_contents->step(Vec2(0,5)); Container::add(m_contents,0,0); } bool ScrollArea::onEvent( Event& ev ) { return Panel::onEvent(ev); } void ScrollArea::onResize() { delete m_canvas; m_canvas = new Canvas(m_pos.size().x, m_pos.size().y); } void ScrollArea::virtualSize( const Vec2& size ) { m_contents->sizeTo(size); } void ScrollArea::draw( Canvas& screen, const Rect& area ) { TemporaryClip clip(screen, m_pos); Rect cpos = m_contents->position(); if (cpos.tl.y > m_pos.tl.y) { m_contents->moveTo(Vec2(cpos.tl.x,m_pos.tl.y)); } if (cpos.br.y < m_pos.br.y && cpos.height() > m_pos.height()) { m_contents->moveTo(Vec2(cpos.tl.x,m_pos.br.y - cpos.size().y)); } Container::draw(screen,area); } void ScrollArea::add( Widget* w, int x, int y ) { m_contents->add(w,x,y); } void ScrollArea::remove( Widget* w ) { m_contents->remove(w); } void ScrollArea::empty() { m_contents->empty(); } //////////////////////////////////////////////////////////////// Container::Container() {} Container::~Container() { for (int i=0; itoString(); } indent--; return s; } void Container::move( const Vec2& by ) { WidgetParent::move(by); for (int i=0; imove(by); } } void Container::onTick( int tick ) { for (int i=0; ionTick(tick); } WidgetParent::onTick(tick); } void Container::draw( Canvas& screen, const Rect& area ) { WidgetParent::draw(screen,area); for (int i=0; iposition().intersects(area)) { Rect relArea = area; relArea.clipTo(m_children[i]->position()); m_children[i]->draw(screen, relArea); } } } bool Container::processEvent(ToolkitEvent &ev) { if (ev.type == ToolkitEvent::PRESS || ev.type == ToolkitEvent::RELEASE || ev.type == ToolkitEvent::MOVE) { if (ev.finger != 0) { /** * Ignore button events for multi-touch fingers if it * isn't the first finger (which == 0). This prevents * "cool" drawing effects on Harmattan. * * TODO: Make it cool by allowing multiple lines to be * drawn simultaneously (like NuMTyPYsics ;) **/ return true; } } switch (ev.type) { case ToolkitEvent::PRESS: case ToolkitEvent::RELEASE: for (int i=m_children.size()-1; i>=0; --i) { Widget *c = m_children[i]; if (c->greedyMouse() || c->position().contains(ev.pos())) { if (c->processEvent(ev)) { return true; } } } break; default: for (int i=m_children.size()-1; i>=0; --i) { if (m_children[i]->processEvent(ev)) { return true; } } break; } return Widget::processEvent(ev); } void Container::onResize() { for (int i=0; ifitToParent()) { m_children[i]->moveTo(m_pos.tl); m_children[i]->sizeTo(m_pos.size()); } } } void Container::add( Widget* w, int x, int y ) { if (x!=-9999 && y!=-9999) { Vec2 pos = m_pos.tl+Vec2(x,y); w->moveTo(pos); } w->setParent(this); m_children.push_back(w); onResize(); } void Container::remove( Widget* w ) { if (!w) { return; } auto it = std::find(m_children.begin(), m_children.end(), w); if (it != m_children.end()) { w->setParent(nullptr); m_children.erase(it); delete w; } } void Container::empty() { for (int i=m_children.size()-1; i>=0; i--) { remove(m_children[i]); } } //////////////////////////////////////////////////////////////// Box::Box(int spacing, bool vertical) : m_spacing(spacing), m_vertical(vertical) { fitToParent(true); } void Box::onResize() { int totalw=-m_spacing, totalg=0; for (int i=0; i 0 ? extra : 0; Vec2 org(m_pos.tl); for (int i=0; imoveTo(org); int incr = totalg>0 ? m_growths[i] * extra / totalg : 0; if (m_vertical) { m_children[i]->sizeTo(Vec2(m_pos.width(),m_sizes[i]+incr)); org.y += m_sizes[i] + incr + m_spacing; } else { m_children[i]->sizeTo(Vec2(m_sizes[i]+incr,m_pos.height())); org.x += m_sizes[i] + incr + m_spacing; } } } void Box::add( Widget* w, int dim, int grow ) { Panel::add(w,0,0); m_sizes.push_back(dim); m_growths.push_back(grow); onResize(); } void Box::remove( Widget* w ) { int index = indexOf(m_children, w); m_sizes.erase(m_sizes.begin() + index); m_growths.erase(m_growths.begin() + index); Panel::remove(w); onResize(); } //////////////////////////////////////////////////////////////// void Menu::addItems(const MenuItem* item) { while (item && item->event.code != Event::NOP) { m_items.push_back(new MenuItem(*item)); item++; } layout(); } void Menu::addItems(const std::vector &items) { for (auto &item: items) { m_items.push_back(new MenuItem(item)); } layout(); } void Menu::addItem(const MenuItem& item) { m_items.push_back(new MenuItem(item)); layout(); } void Menu::addItem(const Tr& s, Event event) { addItem(MenuItem(s, StockIcon::NONE, event)); } //////////////////////////////////////////////////////////////// TabBook::TabBook() : m_count(0), m_selected(-1), m_contents(NULL) {} TabBook::~TabBook() { selectTab(-1); for (int i=0; imoveTo(Vec2((2*i-m_count)*TAB_WIDTH/2+m_pos.centroid().x,m_pos.tl.y)); } } bool TabBook::onEvent( Event& ev ) { if (ev.code == Event::SELECT && ev.y==-1) { selectTab(ev.x); return true; } return Panel::onEvent(ev); } void TabBook::draw( Canvas& screen, const Rect& area ) { Panel::draw(screen,area); Rect border = m_pos; border.tl.y += TAB_HEIGHT; screen.drawRect(border,screen.makeColour(NP::Colour::TL_BORDER),false); } void TabBook::addTab( const Tr &s, Widget* w ) { Widget* tab = new Button(s,Event(Event::SELECT,m_count,-1)); add( tab, Rect(m_count*TAB_WIDTH,0, (m_count+1)*TAB_WIDTH,TAB_HEIGHT) ); m_tabs.push_back(tab); m_panels.push_back(w); m_count++; if ( m_selected < 0 ) { selectTab(m_count-1); } } void TabBook::selectTab( int t ) { if (m_contents) { m_tabs[m_selected]->setBg(NP::Colour::DEFAULT_BG); m_children.erase(std::find(m_children.begin(), m_children.end(), m_contents)); m_contents = NULL; } if ( t>=0 && tsetBg(NP::Colour::SELECTED_BG); m_contents = m_panels[t]; Rect area(Vec2(1,TAB_HEIGHT+1),m_pos.size()-Vec2(1,1)); add(m_contents,area); } } //////////////////////////////////////////////////////////////// Dialog::Dialog( const Tr &title, Event left, Event right ) { setEventMap(UI_DIALOG_MAP); setFg(0x000000); alpha(100); m_greedyMouse = true; m_title = new Label(title,Font::titleFont()); m_title->alpha(0); m_content = new Panel(); m_left = m_right = NULL; m_closeRequested = false; VBox *all = new VBox(); if (title) { HBox *bar = new HBox(); if (left.code!=Event::NOP) { m_left = new Button(Tr::copy("<>"),left); bar->add(m_left, 100, 0); } bar->add(m_title, 64, 1); if (right.code!=Event::NOP) { m_right = new StockIconButton(Tr::copy(""), StockIcon::CLOSE, right); bar->add(m_right, 100, 0); } all->add(bar, DIALOG_TITLE_HEIGHT, 0); } all->add(m_content, 40, 1); add(all,0,0); } void Dialog::onTick( int tick ) { if (m_closeRequested) { m_parent->remove(this); return; } Panel::onTick(tick); } bool Dialog::processEvent(ToolkitEvent &ev) { if (ev.type == ToolkitEvent::RELEASE && !m_pos.contains(ev.pos())) { // click outside the dialog to close Event closeEvent(Event::CLOSE); return onEvent(closeEvent); } // dialogs eat all raw events... Panel::processEvent(ev); return true; } bool Dialog::onEvent( Event& ev ) { if ( ev.code == Event::CLOSE ) { close(); return true; } return Panel::onEvent(ev); } void Dialog::draw(Canvas &screen, const Rect &area) { Window *window = dynamic_cast(&screen); if (window) { auto fb_size = m_pos.size() / 2; auto world_rect = Rect(Vec2(0, 0), fb_size); RenderTarget tmp(fb_size, world_rect); tmp.begin(); Image *offscreen = window->offscreen(); tmp.drawBlur(*offscreen, m_pos, world_rect, 0.0, 0.7); tmp.end(); Image image(tmp.contents()); screen.drawBlur(image, world_rect, m_pos, 0.7, 0.0); } else { screen.drawRect(area, 0xff0000); } screen.drawRect(m_pos, 0xffffff, true, 100); Panel::draw(screen, area); } bool Dialog::close() { if (m_parent) { m_closeRequested = true; } return false; // ?? } //////////////////////////////////////////////////////////////// MenuDialog::MenuDialog( Widget* evtarget, const Tr &title, const MenuItem* items ) : Dialog(title), m_target(evtarget), m_columns(MENU_COLUMNS), m_buttonDim(BUTTON_WIDTH,BUTTON_HEIGHT) { m_box = new VBox(BUTTON_SPACING); m_box->fitToParent(true); content()->add( m_box, 0, 0 ); moveTo(Vec2(WORLD_WIDTH-24, 0)); sizeTo(Vec2(m_buttonDim.x*MENU_COLUMNS+24,200)); animateTo(Vec2(WORLD_WIDTH-m_buttonDim.x*MENU_COLUMNS-24, 0)); if (items) { addItems(items); } } bool MenuDialog::onEvent( Event& ev ) { if (ev.code == Event::SELECT && ev.x >= 0 && ev.x < m_items.size() && ev.y == -777 && m_target && m_target->dispatchEvent(m_items[ev.x]->event)) { Event closeEvent(Event::CLOSE); onEvent(closeEvent); return true; } return Dialog::onEvent(ev); } Widget* MenuDialog::makeButton( MenuItem* item, const Event& ev ) { return new Button(item->tr,ev); } void MenuDialog::layout() { m_box->empty(); m_box->add( new Spacer(), 1, 4 ); Box *row = NULL; for (int i=0; iadd( new Spacer(), 1, 1 ); row = new HBox(BUTTON_SPACING); row->add( new Spacer(), 1, 1 ); m_box->add(row,m_buttonDim.y,0); } row->add( makeButton(m_items[i], Event(Event::SELECT,i,-777)), m_buttonDim.x,0); } if (row) { if (m_items.size()%m_columns > 0) { for (int i=0; iadd( new Spacer(), m_buttonDim.x, 0 ); } } row->add( new Spacer(), 1, 1 ); } m_box->add( new Spacer(), 1, 1 ); int h = (m_items.size()+m_columns-1)/m_columns * (m_buttonDim.y+BUTTON_SPACING) + DIALOG_TITLE_HEIGHT + 20; sizeTo( Vec2(m_pos.width(), h) ); } //////////////////////////////////////////////////////////////// MessageBox::MessageBox( const Tr& text ) : Dialog(Tr::copy("")) { Box * vbox = new VBox(); RichText *rt = new RichText(text); vbox->add( rt, 100, 100 ); content()->add( vbox, 0, 0 ); sizeTo(Vec2(300,150)); animateTo(Vec2(250,100)); } //////////////////////////////////////////////////////////////// void StockIcon::draw(Canvas &screen, const Rect &area, enum Kind kind, const Vec2 &pos) { if (kind < 0 || kind >= ICON_COUNT) { LOG_WARNING("Invalid icon kind: %d", kind); return; } constexpr int COLUMNS = 4; constexpr int ROWS = 3; constexpr int BORDER = 10; constexpr int SIZE = 90; int column = kind % COLUMNS; int row = kind / COLUMNS; assert(row < ROWS); int x = BORDER + column * (SIZE + BORDER); int y = BORDER + row * (SIZE + BORDER); Rect src(x, y, x+SIZE, y+SIZE); Rect dst(pos.x - size() / 2, pos.y - size() / 2, pos.x + size() / 2, pos.y + size() / 2); Image icons("icons.png", true); screen.drawAtlas(icons, src, dst); } int StockIcon::size() { return 80; } numptyphysics-0.3.10/src/Ui.h000066400000000000000000000242361425065123200160560ustar00rootroot00000000000000/* * This file is part of NumptyPhysics * Coyright (c) 2009, 2010 Tim Edmonds * Coyright (c) 2012, 2014 Thomas Perl * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef UI_H #define UI_H #include "Common.h" #include "Event.h" #include "I18n.h" #include #include #include class Canvas; class Image; class Widget; class Font; class WidgetParent; class StockIcon { public: enum Kind { NONE = -1, SHARE = 0, UNDO, PEN, RESET, FORWARD, HELP, PLAY, CLOSE, CHOOSE, PAUSE, BLANK, TICK, ICON_COUNT, }; static void draw(Canvas &screen, const Rect &area, enum Kind kind, const Vec2 &pos); static int size(); }; class Widget { public: virtual ~Widget() {} virtual const char* name() {return "Widget";} virtual std::string toString(); virtual void move( const Vec2& by ); virtual void moveTo( const Vec2& to ) {move(to-m_pos.tl);} virtual void sizeTo( const Vec2& size ); virtual void animateTo(const Vec2 &to, std::function done=[](){}) { m_targetPos = to; m_animating = true; m_animation_done = done; } virtual const Rect& position() const { return m_pos; } virtual void onTick(int tick); virtual void draw( Canvas& screen, const Rect& area ); virtual bool processEvent(ToolkitEvent &ev); bool dispatchEvent( Event& ev ); virtual void onResize() {} virtual bool onEvent( Event& ev ) {return false;} void setParent(WidgetParent* p) {m_parent = p;} WidgetParent* parent() { return m_parent; } WidgetParent* topLevel(); void setEventMap(EventMap* em) {m_eventMap = em;} void setEventMap(EventMapType map); Rect& position() { return m_pos; } void setBg(int bg) {m_bg=bg;} void setFg(int fg) {m_fg=fg;} void fitToParent(bool fit) { m_fitToParent=fit;} bool fitToParent() {return m_fitToParent;} bool greedyMouse() {return m_greedyMouse;} void transparent(bool t) {m_alpha=t?0:255;} void alpha(int a) {m_alpha=a;} void border(bool drawBorder) {m_border = drawBorder?1:0;} void show() { m_visible = true; } void hide() { m_visible = false; } int width() { return m_pos.width(); } int height() { return m_pos.height(); } protected: Widget(WidgetParent *p=NULL); WidgetParent* m_parent; EventMap* m_eventMap; Rect m_pos; bool m_focussed; int m_alpha; bool m_fitToParent; bool m_greedyMouse; int m_bg; int m_fg; int m_border; Vec2 m_targetPos; bool m_animating; std::function m_animation_done; bool m_visible; }; class Spacer : public Widget { const char* name() {return "Spacer";} }; class Label : public Widget { public: Label(); Label(const Tr& s, const Font* f=NULL, int color=0xffffff); const char* name() {return "Label";} virtual void text( const Tr& s ); //const std::string& text() const { return m_text; } virtual void draw( Canvas& screen, const Rect& area ); void font( const Font* f ) { m_font = f; } enum Alignment { ALIGN_CENTER = 0, ALIGN_LEFT = 1 << 0, ALIGN_RIGHT = 1 << 1, ALIGN_TOP = 1 << 2, ALIGN_BOTTOM = 1 << 3, }; int alignment() { return m_alignment; } void setAlignment(int alignment) { m_alignment = alignment; } const Tr &tr() const { return m_tr; } protected: Tr m_tr; const Font *m_font; int m_alignment; }; class Button : public Label { public: Button(const Tr& s, Event event=Event::NOP); const char* name() {return "Button";} void event(Event ev) {m_selEvent = ev;} void draw( Canvas& screen, const Rect& area ); virtual bool onEvent( Event& ev ); virtual void onSelect() {}; protected: Event m_selEvent; }; class Icon : public Label { public: Icon(Image *image=nullptr); ~Icon(); const char *name() { return "Icon"; } void image(Image *image); void draw(Canvas &screen, const Rect &area); protected: Image *m_image; }; class IconButton : public Button { public: IconButton(const Tr& s, const std::string& icon, const Event& ev); ~IconButton(); const char* name() {return "IconButton";} void image(Image *image, bool takeOwnership=true); Image* image(); void icon(const std::string& icon); void draw( Canvas& screen, const Rect& area ); void align(int dir) { m_vertical=(dir==0); } protected: bool m_vertical; Image *m_icon; }; class StockIconButton : public Button { public: StockIconButton(const Tr &label, enum StockIcon::Kind icon, const Event &ev); ~StockIconButton(); void align(int dir) { m_vertical = (dir == 0); } void set(enum StockIcon::Kind icon) { m_icon = icon; } const char *name() { return "StockIconButton"; } void draw(Canvas &screen, const Rect &area); protected: enum StockIcon::Kind m_icon; bool m_vertical; }; class RichText : public Label { public: RichText(const Tr& s, const Font* f=NULL); virtual void text( const Tr& s ); virtual void draw( Canvas& screen, const Rect& area ); int layout(int w); protected: struct Snippet { Vec2 pos; int textoff; int textlen; int align; const Font* font; }; std::vector m_snippets; bool m_layoutRequired; }; class WidgetParent : public Widget { public: const char* name() {return "WidgetParent";} virtual void add( Widget* w, int x=-9999, int y=-9999 )=0; void add( Widget* w, const Vec2& pos ) {add(w,pos.x,pos.y);} void add( Widget* w, const Rect& pos ) {w->sizeTo(pos.size());add(w,pos.tl.x,pos.tl.y);} virtual void remove( Widget* w )=0; }; class Container : public WidgetParent { public: Container(); ~Container(); const char* name() {return "Container";} virtual std::string toString(); virtual void move( const Vec2& by ); virtual void onTick( int tick ); virtual void draw( Canvas& screen, const Rect& area ); virtual bool processEvent(ToolkitEvent &ev); virtual void onResize(); virtual void add( Widget* w, int x=-9999, int y=-9999 ); using WidgetParent::add; virtual void remove( Widget* w ); virtual void empty(); protected: std::vector m_children; }; class Panel : public Container { const char* name() {return "Panel";} }; class Box : public Panel { public: Box(int spacing=0, bool vertical=false); const char* name() {return "Box";} virtual void onResize(); virtual void add( Widget* w, int wh, int grow ); virtual void remove( Widget* w ); protected: std::vector m_sizes; std::vector m_growths; int m_spacing; bool m_vertical; }; class VBox : public Box { public: VBox(int spacing=0) : Box(spacing,true) {} const char* name() {return "VBox";} }; class HBox : public Box { public: HBox(int spacing=0) : Box(spacing,false) {} const char* name() {return "HBox";} }; class Draggable : public Panel { public: Draggable(); const char* name() {return "Draggable";} bool processEvent(ToolkitEvent &ev); bool onPreEvent( Event& ev ); bool onEvent( Event& ev ); void onTick( int tick ); void step( const Vec2& s ) { m_step = s; } protected: bool m_dragMaybe; bool m_dragging; Vec2 m_dragOrg; Vec2 m_step; Vec2 m_delta; bool m_internalEvent; }; class ScrollArea : public Panel { public: ScrollArea(); const char* name() {return "ScrollArea";} bool onEvent( Event& ev ); virtual void onResize(); virtual void draw( Canvas& screen, const Rect& area ); virtual void add( Widget* w, int x=-9999, int y=-9999 ); using WidgetParent::add; virtual void remove( Widget* w ); virtual void empty(); virtual void virtualSize( const Vec2& size ); protected: Canvas* m_canvas; Draggable* m_contents; }; class MenuItem { public: MenuItem(const Tr& s, enum StockIcon::Kind icon=StockIcon::NONE, Event ev=Event::NOP) : tr(s), icon(icon), event(ev) {} MenuItem(const MenuItem &o) : tr(o.tr), icon(o.icon), event(o.event) {} Tr tr; enum StockIcon::Kind icon; Event event; }; class Menu { public: void addItems(const MenuItem* item); void addItems(const std::vector &items); void addItem(const MenuItem& item); void addItem(const Tr& s, Event event=Event::NOP); protected: virtual void layout() =0; std::vector m_items; }; class TabBook : public Panel { public: TabBook(); ~TabBook(); const char* name() {return "TabBook";} virtual void onResize(); virtual bool onEvent( Event& ev ); virtual void draw( Canvas& screen, const Rect& area ); virtual void addTab( const Tr &s, Widget* w ); void selectTab( int t ); private: int m_count, m_selected; std::vector m_tabs; std::vector m_panels; Widget* m_contents; }; class Dialog : public Panel { public: Dialog( const Tr &title, Event left=Event::NOP, Event right=Event::NOP ); const char* name() {return "Dialog";} void onTick( int tick ); bool processEvent(ToolkitEvent &ev); bool onEvent( Event& ev ); virtual void draw(Canvas &screen, const Rect &area); bool close(); virtual Container* content() { return m_content; } Button* leftControl() { return m_left; } Button* rightControl() { return m_right; } protected: Label *m_title; Button *m_left, *m_right; Container *m_content; bool m_closeRequested; }; class MenuDialog : public Dialog, public virtual Menu { public: MenuDialog( Widget* evtarget, const Tr &title, const MenuItem* items=NULL ); const char* name() {return "MenuDialog";} virtual bool onEvent( Event& ev ); protected: virtual Widget* makeButton( MenuItem* item, const Event& ev ); virtual void layout(); Widget *m_target; Box *m_box; int m_columns; Vec2 m_buttonDim; }; class MessageBox : public Dialog { public: MessageBox( const Tr& text ); }; class Layer : public Dialog { public: const char* name() {return "Layer";} virtual void onShow() {} virtual void onHide() {} }; #endif //UI_H numptyphysics-0.3.10/tools/000077500000000000000000000000001425065123200156725ustar00rootroot00000000000000numptyphysics-0.3.10/tools/icons.svg000066400000000000000000002673271425065123200175470ustar00rootroot00000000000000 image/svg+xml numptyphysics-0.3.10/tools/nph2npsvg.py000066400000000000000000000065211425065123200201750ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # nph2npsvg.py: Convert NumptyPhysics levels to SVG # Thomas Perl ; 2014-12-26 # import re import os import sys WIDTH = 800 HEIGHT = 480 URL = 'http://numptyphysics.garage.maemo.org/' FLAGS = [ 'token', 'goal', 'fixed', 'sleeping', 'decor', 'rope', 'interactive', ] # Taken from src/Colour.{h,cpp} COLORS = [ 0xb80000, 0xeec900, 0x000077, 0x108710, 0x101010, 0x8b4513, 0x87cefa, 0xee6aa7, 0xb23aee, 0x00fa9a, 0xff7f00, 0x6c7b8b, ] class NumptyPhysicsLevel(object): def __init__(self): self.metadata = {} self.interactions = [] self.strokes = [] self.events = [] def parse_nph(self, fp): for line in fp: if not line.strip(): # Skip empty lines continue key, value = (x.strip() for x in line.split(':', 1)) if key[0] in ('T', 'A', 'B', 'G'): self.metadata[key] = value elif key[0] == 'E': self.events.append(value) elif key[0] == 'I': self.interactions.append(value.split(' = ')) elif key[0] == 'S': stroke_type = key[1:] stroke_flags, stroke_color = re.match(r'([a-z]*)([0-9]*)', stroke_type).groups() stroke_color = int(stroke_color or 0) if 't' in stroke_flags: stroke_color = 0 elif 'g' in stroke_flags: stroke_color = 1 flags = [next(flag for flag in FLAGS if flag.startswith(c)) for c in stroke_flags] stroke_points = [tuple(map(int, part.split(','))) for part in value.split()] self.strokes.append((flags, stroke_color, stroke_points)) else: raise NotImplementedError('Cannot parse line: {}: {}'.format(key, value)) def write_svg(self, fp): stroke_width = 2 print >>fp, ''.format(WIDTH, HEIGHT, URL) print >>fp, ''.format(WIDTH, HEIGHT) print >>fp, ''.format(' '.join('{}="{}"'.format(key.lower(), value) for key, value in sorted(self.metadata.items()))) for color, action in self.interactions: print >>fp, ''.format(color, action) for stroke_flags, stroke_color, stroke_points in self.strokes: node = '' print >>fp, node.format(' '.join(stroke_flags), '#%06x' % COLORS[stroke_color], stroke_width, 'L'.join('%d %d' % (x, y) for x, y in stroke_points)) for event in self.events: print >>fp, ''.format(event) print >>fp, '' if __name__ == '__main__': for filename in sys.argv[1:]: level = NumptyPhysicsLevel() base, ext = os.path.splitext(filename) outfile = base + '.npsvg' print filename, '->', outfile with open(filename) as fp: level.parse_nph(fp) with open(outfile, 'w') as fp: level.write_svg(fp) numptyphysics-0.3.10/tools/update_license_header.py000066400000000000000000000041311425065123200225370ustar00rootroot00000000000000import subprocess import sys import re import collections LICENSE_BLOCK_RE = r'/[*].*?This program is free software.*?\*/' HEADER_TEMPLATE = """/* * This file is part of NumptyPhysics * <> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */""" def update(filename): d = subprocess.check_output(['git', 'log', '--format=%an <%ae>|%ad', '--follow', filename]) dd = collections.defaultdict(list) for author, date in map(lambda x: x.split('|'), d.decode('utf-8').splitlines()): dd[author].append(date) def combine(s, date): # "Sat Feb 18 12:58:00 2012 -0800" s.add(date.split()[4]) return s for author in dd: dd[author] = sorted(reduce(combine, dd[author], set())) def year_sort(item): _, years = item return tuple(map(int, years)) def inject(): for line in HEADER_TEMPLATE.splitlines(): line = line.rstrip('\n') if '<>' in line: for author, years in sorted(dd.items(), key=year_sort): copyright = 'Coyright (c) {years} {author}'.format(years=', '.join(years), author=author) yield line.replace('<>', copyright) continue yield line license = '\n'.join(inject()) d = open(filename).read() if re.search(LICENSE_BLOCK_RE, d, re.DOTALL) is None: open(filename, 'w').write(license + '\n\n' + d) else: d = re.sub(LICENSE_BLOCK_RE, license, d, 0, re.DOTALL) open(filename, 'w').write(d) for filename in sys.argv[1:]: print 'Updating:', filename update(filename)