pax_global_header00006660000000000000000000000064145521467200014520gustar00rootroot0000000000000052 comment=85318a73f076443e234e5e41a8354b4441150c61 XaoS-release-4.3.2/000077500000000000000000000000001455214672000140165ustar00rootroot00000000000000XaoS-release-4.3.2/.github/000077500000000000000000000000001455214672000153565ustar00rootroot00000000000000XaoS-release-4.3.2/.github/CODE_OF_CONDUCT.md000066400000000000000000000126551455214672000201660ustar00rootroot00000000000000# Code of Conduct ## Purpose People can be discouraged from participating in XaoS development because of certain patterns of communication that strike them as unfriendly, unwelcoming, rejecting, or harsh. This discouragement particularly affects members of disprivileged demographics, but it is not limited to them. Therefore, we ask all contributors to make a conscious effort, in XaoS Project discussions, to communicate in ways that avoid that outcome—to avoid practices that will predictably and unnecessarily risk putting some contributors off. These guidelines suggest specific ways to accomplish that goal. ## Guidelines 1. Please assume other participants are posting in good faith, even if you disagree with what they say. When people present code or text as their own work, please accept it as their work. Please do not criticize people for wrongs that you only speculate they may have done; stick to what they actually say and actually do. Please think about how to treat other participants with respect, especially when you disagree with them. For instance, call them by the names they use, and honor their preferences about their gender identity. 2. Please do not take a harsh tone towards other participants, and especially don't make personal attacks against them. Go out of your way to show that you are criticizing a statement, not a person. Please recognize that criticism of your statements is not a personal attack on you. If you feel that someone has attacked you, or offended your personal dignity, please don't “hit back” with another personal attack. That tends to start a vicious circle of escalating verbal aggression. A private response, politely stating your feelings as feelings, and asking for peace, may calm things down. Write it, set it aside for hours or a day, revise it to remove the anger, and only then send it. 3. Please avoid statements about the presumed typical desires, capabilities or actions of some demographic group. They can offend people in that group, and they are always off-topic in XaoS Project discussions. 4. Please be especially kind to other contributors when saying they made a mistake. Programming means making lots of mistakes, and we all do so—this is why regression tests are useful. Conscientious programmers make mistakes, and then fix them. It is helpful to show contributors that being imperfect is normal, so we don't hold it against them, and that we appreciate their imperfect contributions though we hope they follow through by fixing any problems in them. 5. Likewise, be kind when pointing out to other contributors that they should stop using certain nonfree software. For their own sake, they ought to free themselves, but we welcome their contributions to our software packages even if they don't do that. So these reminders should be gentle and not too frequent—don't nag. By contrast, to suggest that others run a nonfree program opposes the basic principles of XaoS, so it is not allowed in XaoS Project discussions. 6. Please respond to what people actually said, not to exaggerations of their views. Your criticism will not be constructive if it is aimed at a target other than their real views. 7. If in a discussion someone brings up a tangent to the topic at hand, please keep the discussion on track by focusing on the current topic rather than the tangent. This is not to say that the tangent is bad, or not interesting to discuss—only that it shouldn't interfere with discussion of the issue at hand. In most cases, it is also off-topic, so those interested ought to discuss it somewhere else. 8. If you think the tangent is an important and pertinent issue, please bring it up as a separate discussion, with a Subject field to fit, and consider waiting for the end of the current discussion. 9. Rather than trying to have the last word, look for the times when there is no need to reply, perhaps because you already made the relevant point clear enough. If you know something about the game of Go, this analogy might clarify that: when the other player's move is not strong enough to require a direct response, it is advantageous to give it none and instead move elsewhere. 10. Please don't argue unceasingly for your preferred course of action when a decision for some other course has already been made. That tends to block the activity's progress. 11. If others have irritated you, perhaps by disregarding these guidelines, please don't excoriate them, and especially please don't hold a grudge against them. The constructive approach is to encourage and help other people to do better. When they are trying to learn to do better, please give them plenty of chances. If other participants complain about the way you express your ideas, please make an effort to cater to them. You can find ways to express the same points while making others more comfortable. You are more likely to persuade others if you don't arouse ire about secondary things. 12. Please don't raise unrelated political issues in XaoS Project discussions, because they are off-topic. The only political positions that the XaoS Project endorses are that users should have control of their own computing (for instance, through free software) and supporting basic human rights in computing. We don't require you as a contributor to agree with these two points, but you do need to accept that our decisions will be based on them. ###### These guidelines are adapted from [GNU Kind Communications Guidelines](https://www.gnu.org/philosophy/kind-communication.en.html) XaoS-release-4.3.2/.github/ISSUE_TEMPLATE/000077500000000000000000000000001455214672000175415ustar00rootroot00000000000000XaoS-release-4.3.2/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000015021455214672000222310ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. iOS] - Browser [e.g. chrome, safari] - Version [e.g. 22] **Smartphone (please complete the following information):** - Device: [e.g. iPhone6] - OS: [e.g. iOS8.1] - Browser [e.g. stock browser, safari] - Version [e.g. 22] **Additional context** Add any other context about the problem here. XaoS-release-4.3.2/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011231455214672000232630ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. XaoS-release-4.3.2/.github/workflows/000077500000000000000000000000001455214672000174135ustar00rootroot00000000000000XaoS-release-4.3.2/.github/workflows/build.yml000066400000000000000000000020341455214672000212340ustar00rootroot00000000000000name: build on: [push] jobs: linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: prerequisites run: sudo apt update && sudo apt install build-essential qttools5-dev-tools qt6-base-dev libgl1-mesa-dev - name: qmake run: qmake6 - name: make run: make mac: runs-on: macos-latest steps: - uses: actions/checkout@v1 - name: install-qt uses: jurplel/install-qt-action@v3 with: version: '6.2.4' - name: qmake run: qmake - name: make run: make # This requires too much disk space (more than 40 GB), so it is disabled for now: # wasm: # # runs-on: ubuntu-latest # # steps: # - uses: actions/checkout@v1 # - name: prerequisites # run: sudo apt update && sudo apt install build-essential libclang-13-dev cmake ninja-build libgl-dev libegl-dev libfontconfig-dev # - name: compile-qt-web # run: cd tools && ./compile-qt-web # - name: compile-xaos-web # run: cd tools && ./compile-xaos-web XaoS-release-4.3.2/.gitignore000066400000000000000000000010071455214672000160040ustar00rootroot00000000000000# Prerequisites *.d # Object files *.o *.ko *.obj *.elf # Linker output *.ilk *.map *.exp # Precompiled Headers *.gch *.pch # Libraries *.lib *.a *.la *.lo # Shared objects (inc. Windows DLLs) *.dll *.so *.so.* *.dylib # Executables *.exe *.out *.app *.i*86 *.x86_64 *.hex bin/* # Debug files *.dSYM/ *.su *.idb *.pdb # Visual Studio Code .vscode # Qt Stuff XaoS.pro.user .qmake.stash debug release installer/packages/net.sourceforge.xaos/data Makefile* object_script.* moc_* qrc_* *.qm # Mac stuff .DS_Store XaoS-release-4.3.2/COPYING000066400000000000000000000432541455214672000150610ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. XaoS-release-4.3.2/CREDITS.md000066400000000000000000000130451455214672000154400ustar00rootroot00000000000000## Contributors (alphabetically) - [Anurag Aggarwal](mailto:kanurag94@gmail.com): Palette editor, palette saver, palette visualiser, Cartesian grid, batch rendering, user formulas history, powerful PNGs, bug fixes, Hindi translation, [contributions for GSoC 2020](https://github.com/xaos-project/XaoS/wiki/GSoC-2020) - [Emine Nur Ünveren Bilgiç](mailto:eminenurbilgic@duzce.edu.tr): Turkish translation - [Natalija Budinski](mailto:nbudinski@yahoo.com): Serbian translation - [IoeCmcomc](https://github.com/IoeCmcomc): Vietnamese translation - [Eric Courteau](mailto:ecourteau@cplus.fr): francais.cat (translation of tutorials) - [Jean-Pierre Demailly](mailto:Jean-Pierre.Demailly@ujf-grenoble.fr): Updates for French translation - [Radek Doulik](mailto:rodo@atrey.karlin.mff.cuni.cz): TK interface, windowid patches - [Martin Dózsa](mailto:madsoft@centrum.cz): cs.po (Czech translation of menus) - Árpád Fekete: some new fractals, and the 'More formulae' menu - [Selen Galiç](mailto:selengalic@gmail.com): Turkish translation - [Tim Goodwin](mailto:tgoodwin@cygnus.co.uk): english.cat corrections - [Asher Gordon](mailto:AsDaGo@posteo.net): Bugfix for rendering files in a subdirectory - [Jonas Hall](mailto:jonas.hall@norrtalje.se): Swedish translation - Ben Hines: autoconf suggestions, Mac OS X port - [Jan Hubička](mailto:jh@ucw.cz): Zooming routines, ugly interface, palettes, drivers, autopilot, filters, documentation, tutorials etc. - [Jens Kilian](mailto:jjk@acm.org): BeOS driver, deutsch.cat - [Thomas A. K. Kjaer](mailto:takjaer@imv.aau.dk): OS/2 ports (320x200 graphics and AA-lib) - [Zbyněk Konečný](mailto:zbynek@geogebra.org): Czech translation - [Zoltán Kovács](mailto:zoltan@geogebra.org): Internationalization, Hungarian translations, finalizing version 3.1, bug fixes, web design, WebAssembly version, current maintainer - [Zsigmond Kovács](mailto:kovzsi@gmail.com): Fractal examples - [Bjarnheiður Kristinsdóttir](mailto:bjarnhek@hi.is): Icelandic translation - [J.B. Langston III](mailto:jb-langston@austin.rr.com): Native Mac OS X port (from version 3.2.2); web redesign; co-maintainer - Alexey Loginov: Russian translation - [Andreas Madritsch](mailto:amadritsch@datacomm.ch): New fractal types, bailout, many fixes - [Adam Majewski](mailto:adammaj1@o2.pl): Fractal examples - [Mateusz Malczak](mailto:xaos@malczak.info): User formula evaluation library - [Giorgio Marazzi](mailto:gmarazzi@vtr.net): Improvements and fixes for espanhol.cat - [Thomas Marsh](mailto:thomas.marsh2@gmail.com): First zoomer, formulae, planes, X11 driver, inversions, many ideas - [Dominic Mazzoni](mailto:dmazzoni@cs.cmu.edu): Macintosh port (version 2.0) - David Meleedy: Grammatical and spelling fixed version of xaos.6 - [Armin Müller](https://github.com/arm-in): Codespell fixes, translation fixes - [Paul Nasca](mailto:zynaddsubfx@yahoo.com): Ministatus improvement - [Nix](mailto:nix@esperi.demon.co.uk): Grammatical and spelling fixed version of xaos.hlp and other files - [Terje Pedersen](mailto:terjepe@login.eunet.no): Amiga port - [César Pérez](mailto:oroz@users.sourceforge.net): Spanish translations - [Fabrice Premel](mailto:premelfa@etu.utc.fr): Periodicity checking - [Jan Olderdissen](mailto:jan@olderdissen.com): Win32 port - [Ilinca Sitaru](mailto:ilinca.sitaru@gmail.com): Romanian translation - Daniel Skarda: Fractal examples - Andrew Stone ([Stone Design](www.stone.com)): Videator Support, Cocoa improvements, performance mode, bug fixes - [Abhishek Tiwari](mailto:tabhishek432@gmail.com): WebAssembly version, [contributions for GSoC 2023](https://github.com/tabhishek432/GSoC-2023-xaos) - [Márton Török](mailto:marton.torok@gmail.com): Small fixes for pipes - [Pavel Tzekov](mailto:paveltz@csoft.bg): Win32 support - [Zuhal Ünan](mailto:zuhalu@omu.edu.tr): Turkish translation - Charles Vidal: Tcl/Tk interface - [Tapio K. Vocaldo](mailto:taps@rmx.com): Macintosh port - Tormod Volden: Fixes for X11 driver to improve compatibility with Xorg, XScreenSaver, Beryl and Compiz - [Clément Vermot](https://github.com/cvermot): Updates for French translation - [Philippe Wautelet](mailto:p.wautelet@fractalzone.be): Bug fixes for version 3.1.1, French translation, gcc 4.0 fixes - [Veysel Yıldız](mailto:veyselyildiz11@gmail.com): Turkish translation - Sergio Zanchetta: Italian translation ## Included Software XaoS uses the following libraries. These libraries may be included with some binary distributions of XaoS. ### [Qt](https://www.qt.io/) Copyright © 2023 The Qt Company License GPLv2+: [GNU GPL version 2 or later](https://gnu.org/licenses/gpl.html) ### [GNU Scientific Library](https://www.gnu.org/software/gsl/) Copyright © 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 The GSL Team License GPLv3+: [GNU GPL version 3 or later](https://gnu.org/licenses/gpl.html) This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. ### [libpng](http://www.libpng.org/pub/png/libpng.html) Copyright © 1998-2008 Glenn Randers-Pehrson Copyright © 1996-1997 Andreas Dilger Copyright © 1995-1996 Guy Eric Schalnat, Group 42, Inc. ## Thanks * Unknown Samurai from Brazil (for $20 --- your email doesn't work) * Stanislav "XaoS" Mikes (for the name of our program) * Borislav Deianov (for sharing ideas) * Isaac Newton (for discovering his method) * Benoit B. Mandelbrot (for ordering the Julia sets) * Richard M. Stallman (for GNU) * Linus Torvalds (for the best kernel) * Tim Wegner & Bert Tyler (for Fractint) * Darryl House (for making code of Fractint readable) ## No thanks to * Bill Gates XaoS-release-4.3.2/Doxyfile000066400000000000000000001564151455214672000155400ustar00rootroot00000000000000# Doxyfile 1.5.5 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, # and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = aconfig.h # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = USE_PNG USE_PTHREAD GTK_DRIVER X11_DRIVER WIN32_DRIVER DDRAW_DRIVER SFFE_USING SFFE_CMPLX_GSL SFFE_CMPLX_ASM # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is enabled by default, which results in a transparent # background. Warning: Depending on the platform used, enabling this option # may lead to badly anti-aliased labels on the edges of a graph (i.e. they # become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO XaoS-release-4.3.2/NEWS000066400000000000000000000517121455214672000145230ustar00rootroot00000000000000RELEASE NOTES FOR XAOS VERSION 4.3.2 ------------------------------------ New Features ============ o Turkish translation, contributed by Selen Galiç, Zuhal Ünan, Veysel Yıldız and Emine Nur Ünveren Bilgiç. o Ctrl-C copies the current position to the clipboard as an URL at xaos.app. o Some new keyboard shortcuts: Shift-F1 for Info on current fractal and Ctrl-+ for Autopilot. o "Mathematical" coordinates of the mouse are shown in the status. o Contributor's list is linked in Help -> About. RELEASE NOTES FOR XAOS VERSION 4.3.1 ------------------------------------ New Features ============ o Two new examples by Adam Majewski. Bug Fixes ========= o Example files are loaded properly now. RELEASE NOTES FOR XAOS VERSION 4.3 ---------------------------------- New Features ============ o Migration to Qt 6. o WebAssembly port, that is, a full-featured web version is available. Tested with Qt >= 6.5.2. o Progress bar for time consuming operations (only on native platforms). Bug Fixes ========= o Example files are loaded properly even if XaoS is not installed (that is, the examples are not flattened). o User formulas are not duplicated in the history. RELEASE NOTES FOR XAOS VERSION 4.2.1 ------------------------------------ New Features ============ o Vietnamese translation. Bug Fixes ========= o Example files fixed that use the 'Octo' fractal. o Fix crash for playing tutorials. RELEASE NOTES FOR XAOS VERSION 4.2 ---------------------------------- New Features ============ o Palette editor, save/load palettes, storing user palettes in the .xpf file. o The option 'User formulas' maintains a history of recently used formulas. o Fractal info in the Help menu. o Batch rendering. o Enabled panning in rotate mode. o Unified Open and Open Image option. Save Image option moved to `Save as`. RELEASE NOTES FOR XAOS VERSION 4.1 ---------------------------------- New Features ============ o Added option to show Cartesian coordinate grid. o Custom palette helps visualizing palette before applying changes through slider selectable values now. o PNGs exported using 'Save Image' option can be imported back and users can continue zooming on it. Bug Fixes ========= o Fixed crash on recording XaoS animations. o Fixed crash on rendering using command line. o Only error messages are shown on incorrect commands. o Fix handling non-ASCII paths on Windows. o Some other small bug fixes. RELEASE NOTES FOR XAOS VERSION 4.0 ---------------------------------- o The user interface is based on Qt, so XaoS has a modern look and feel. o Works on macOS Catalina, which broke older versions. o Animation rendering has been fixed. o Menu entries are now standardized. o TrueType text rendering so fonts look nicer and non-Latin alphabets are supported. o Hindi, Icelandic, Russian, Serbian, Swedish translations. o Several minor updates for the other languages. o The language can be set in the View menu now. o Lots of bug fixes. o Zooming is possible also with the mouse wheel. o Mouse cursor has been changed to cross. o Iteration number N can be used in user formulas. o Lots of source code cleanup and refactoring. It may not be obvious to end users but this will allow us to make better features and more frequent releases in the future. RELEASE NOTES FOR XAOS VERSION 3.6 ---------------------------------- Cross-platform changes ====================== o Supporting libpng >= 1.5 and 1.6 (J.B. Langston, Petr Gajdos) o Various bug fixes o New fractal types (Arpad Fekete) Mac-specific changes ==================== o Fixing zooming on Mac OS X 10.8 (J.B. Langston) RELEASE NOTES FOR XAOS VERSION 3.5 ---------------------------------- Cross-platform changes ====================== o New Portuguese translation courtesy of Lucio Henrique de Arujo and Zelia Maria Horta Garcia o Fixed crash bug when using -render command line option with user formulas (Mateusz Malczak) o Removed support for unmaintained platforms (DOS, BeOS, Plan 9, etc.) o Updated documentation to reflect infrastructure changes (Discussion and issue tracking have moved to Google Groups and Google Code) o Additional fractal examples by J.B. Langston Windows-specific changes ======================== o Improved GUI appearance with modern fonts and controls on XP and Vista o Help format changed from WinHelp to HtmlHelp. WinHelp was no longer supported starting with Windows Vista and Windows 7. o Fixed bug where output was invisible when using XaoS from the command line o Simplified and improved build instructions for Windows developers GTK+ User Interface (Beta) ========================== The GTK+ user interface is approaching beta quality. We welcome beta testers to try out this version and let us know what issues you encounter. Please share your feedback with us on the developer's discussion group at: http://groups.google.com/group/xaos-devel. We ask that beta testers be advanced users who are comfortable compiling software from source and submitting useful bug reports including backtraces. If you are not comfortable with this, then please wait for the final version to be released. We would also really appreciate it if any experienced GTK+ developers can review our code and make suggestions for improvement. Since the GTK+ UI is still not ready for everyday use, it will not be compiled by default. You must explicitly enable it using the following configure switch: --with-gtk-driver=yes In addition, we recommend you disable all other drivers when using the GTK driver using the following configure switches: --with-x11-driver=no New Documentation Format (Beta) =============================== We are in the process of migrating the XaoS help system to Sphinx and reStructuredText. Our user manual was previously in a crippled subset of HTML that we dubbed XSHL, which was missing many features necessary for maintaining modern, attractive documentation. Sphinx was developed by the Python project for their documentation, and it is very similar to a Wiki in the way you mark up the text. It can output the results as HTML, PDF, and Windows Help. It supports all the important things that are missing from the current help format, such as tables, images, and internet hyperlinks. It can even convert LaTeX math markup into image files that get included in the HTML output. The documentation still needs a lot of work before it is ready, and we have to make some modifications to Sphinx itself in order to integrate the documentation it produces with XaoS's help system. However, it is far enough along that we would welcome volunteers who are familiar with reStructuredText to submit improvements to the documentation. The new documentation is located in the help/rest directory, and it can be converted into HTML or PDF using the included Makefile. In order to generate the output, you will need to install Sphinx. Visit the Sphinx homepage at http://sphinx.pocoo.org/ for installation instructions and more information on the new documentation format. If you would like to help with the documentation, please contact us on the discussion group at: http://groups.google.com/group/xaos-devel. We will be happy to help you get started. RELEASE NOTES FOR XAOS VERSION 3.4 ---------------------------------- Cross-platform changes ====================== o New Italian translation courtesy of Sergio Zanchetta o Updated catalog and i18n for German by Andreas Madritsch o Bug fix to prevent garbled characters when using non-English languages on modern systems using UTF-8 o Bug fix to prevent XaoS from crashing after using the Render Animation functionality o Bug fix to prevent incorrect colors on smooth coloring modes with certain video modes Mac-specific changes ==================== This is a huge release for Mac users. The Mac user interface has been completely rewritten in Cocoa and improved in a number of ways: o Standard Aqua dialog boxes instead of the strange-looking Unixy things in previous versions. Fields in dialog boxes now support cut and paste as you would expect. o Pop-up menus are now displayed using standard Aqua menus o Menu bar in full-screen mode is now the standard Mac OS X menu bar. It automatically slides into view when you move your mouse to the top of the screen and slides out when you move away from it. o XaoS now has a standard Aqua about dialog box, which displays links to license and credits in help file. o Help is now displayed via Mac OS X's standard help viewer. Tutorials can still be launched via links in the help viewer. o Support for opening xpf (Saved Position) and xaf (Saved Animation) files directly from Finder via drag and drop and by double-clicking. XaoS now includes its own document icon for these files as well. o Support for basic AppleScriptability via the standard script dictionary. Includes things like opening files and manipulating the window, but no XaoS-specific functionality. o Support for panning the fractal with the mouse scroll wheel or trackpad two-finger gestures. In addition to the user interface improvements, XaoS for Mac has the following improvements: o Now uses greater precision (long double) for calculations to enable much deeper zooms. o In addition to English, XaoS for Mac OS X now supports the following languages: Czech, French, German, Hungarian, Italian, Romanian, and Spanish. o Integration with Stone Design's Videator (http://stone.com/Videator/). XaoS can now send live a live video stream to Videator, which can then do post-processing using Mac OS X's core video technology. This is great for VJing (live video performance art). See http://stone.com/Videator/VJ.html for more details. o Edge Detection and Pseudo 3D filters now work correctly. Fixed a bug that previously caused them to render the image completely black. Experimental GTK+ Port ====================== An experimental GTK+ user interface has been added in the src/ui/ui-drv/gtk directory. Eventually we hope to replace the old X11 interface with this one so that XaoS will blend in seamlessly with the GNOME environment. Right now, this port is incomplete and it should be considered an alpha- quality preview. As such, the GTK+ port will not be compiled by default. You must explicitly enable it using the following configure switch: --with-gtk-driver=yes In addition, we recommend you disable all other drivers when using the GTK driver using the following configure switches: --with-x11-driver=no --with-dga-driver=no --with-ggi-driver=no --with-aa-driver=no Please do not report bugs against the GTK+ driver. We know that it is very buggy and we are working to rapidly improve it. If you want to help with the GTK+ driver's development, please contact the xaos-devel mailing list first, since it is likely that your patches could conflict with the rapid development that is taking place on this driver. RELEASE NOTES FOR XAOS VERSION 3.3 ---------------------------------- This release is mostly done by Mateusz Malczak who implemented user formula support for XaoS. This feature has been a huge demand for several years and we proudly (humbly?) announce it to the public audience now. Mateusz has been working on the underlying SFFE (SegFault Formula Evaluator) library for several months. XaoS-3.3 can be compiled using both NASM (Netwide Assembler) or GSL (GNU Scientific Library) for the underlying complex arithmetic used by SFFE. For more information about the available user functions please read the enclosed documentation (see online help, "Other things to read", last entry), or visit Mateusz's info page on http://www.segfaultlabs.com/sfXaoS. User formula support has been tested on Linux, Windows, and Mac OS X systems. Recent Ubuntu versions should work without any problems. You may also notice that internationalization can be broken on modern Linux systems. This is due to the use of Unicode (UTF8) by default on these operating systems (including Ubuntu 7.x). To solve these problems please read Section 6 in src/i18n/README. If you are a packager of a Linux distribution, you may consider to add extra codepages for standard locales to the dependency list of XaoS (or create a package which installs an extra locale if needed). In addition, this version includes several fixes to the X11 driver contributed by Tormod Volden. These improve compatibility with recent versions of Xorg (-fullscreen and -root options), XScreenSaver (-window-id), and Beryl and Compiz (extreme transparency). Other improvements include a bug fix for color cycling and a performance mode, which inhibits text output when using XaoS for public exhibition (VJing). These changes were contributed by Andrew Stone. Finally, this version includes several build improvements for Mac OS X and a bug fix for incorrect colors on Intel Macs when switching from fullscreen to windowed mode. RELEASE NOTES FOR XAOS VERSION 3.2.3 ------------------------------------ Romanian translation added. Contributed by Ilinca Sitaru. RELEASE NOTES FOR XAOS VERSION 3.2.2 ------------------------------------ This release contains a rewritten Mac OS X port by J. B. Langston III, and some small fixes for pipes by Marton Torok. For more details please read the ChangeLog file. RELEASE NOTES FOR XAOS VERSION 3.2.1 ------------------------------------ A new fractal type, the Spidron hornflake has appeared. We changed the web site to a dokuwiki database, so the help system contains now a converter for dokuwiki (not completely working yet). STICKY/DESTDIR is now supported (by Claudio Fontana). The French translation is updated (by Philippe Wautelet). Bigger fonts are available for Latin-2 based usage if the user changes the screen resolution more than 800x600 or 1000x720. Some small fixes have been done in the catalog files. RELEASE NOTES FOR XAOS VERSION 3.2 ---------------------------------- Main points are the classic Sierpinski and Koch fractals, but still other formulas are introduced. Some 'oldie but goldie' fractals are included from the Fractint formula database. The keystroke order has been changed a little bit. Now gcc-4.0.x is also supported (-mcpu is deprecated now and the source had to be modified for this). The new formulas are demonstrated with 3 new tutorial movies. These are also available in Hungarian language. Volunteers are requested to translate the new movies into other languages. RELEASE NOTES FOR XAOS VERSION 3.1.3 ------------------------------------ Using this release gcc version 4.0 should also compile the code, not only the 3.x versions. Two new fractal types were also added. In addition, the DirectX header files have been fixed. The French translations are updated. RELEASE NOTES FOR XAOS VERSION 3.1.2 ------------------------------------ This release is a fast bugfix for some gcc versions (or more precisely, there is a workaround for the B-B bug, see the ChangeLog for details). The example files were not able to load in version 3.1.1 and msgmerge was not recognized (this is fixed, however not tested yet). There are other small but irrelevant fixes (see ChangeLog), too. RELEASE NOTES FOR XAOS VERSION 3.1.1 ------------------------------------ This release is a CVS snapshot freeze for those who are using newer systems. The most important update is a fix for gcc-3.4. There are also - improvements in French and Spanish translations, - some more example files (contributed by Zsigmond Kovács), - some fixes which patch annoying problems. For other issues please read the ChangeLog file. RELEASE NOTES FOR XAOS VERSION 3.1 ---------------------------------- We would like to release a quality product in all manner. Unfortunately, such a complex software like XaoS requires many details and it does not seem to be so easy to put a quality software together. Well, we did all our best... Here come the latest release binaries for Linux, Windows and DOS. They should work with the following restrictions: 1. The Linux version seems to be the most stable one. Almost no bugs were encountered testing it the last few weeks. SuSE 7.3 and SuSE 8.0 should be good enough to compile it. The latest source has been also tested on the Compile Farm of SourceForge.net with the next results: * [x86] Linux 2.4 (Debian 2.2) Compiles OK. Seems to be build properly. * [x86] Linux 2.4 (Red Hat 7.3) Compiles OK, runs properly. It is suggested to configure it with --with-mitshm=no to avoid immediate exit after startup. Runs correctly in an X11 window on cf.sf.net. * [x86] FreeBSD (4.7-STABLE) ./configure exits properly, make stops with an error. * [Alpha] Linux 2.2 (Debian 3.0) ./configure exits properly, make stops with an error during compiling ui.c. * [PPC - G4] MacOS X 10.1 SERVER Edition Compiles OK, the executable gave MIT/SHM problem with "./configure". It should work with --with-mithsm=no, but currently I have no access to any Mac OS X systems to test this. * [Sparc - Ultra60] Linux 2.4 (Debian 3.0) Compiles OK, seems to be build properly. * [Sparc - R220] Sun Solaris (8) ./configure stops with an error. * [CerfCube SA 1110] Linux 2.4 (Debian 3.0) Compiles OK, seems to be build properly. * [J2EE] IBM WebSphere Compiles OK, runs properly. I tried to run the executables, mostly I got "Cannot initialize driver", except where I wrote "runs properly" above. I'm almost sure that those platforms I wrote "seems to be build properly" for, XaoS will work without any problems, because there should be only "Can't open display"-related configuration errors on cf.sf.net and/or at my place. You can also realize that internationalization (i18n) will only work if you install XaoS as the system administrator with "make install". Future releases may solve this problem. Tcl/Tk interface now works, but it is not updated since a rather long time. You can run it entering "wish ./xaosmenu.tcl &" in a Unix shell in the bin/ directory. This interface is experimental. Under SVGAlib latin2 fonts will not work for some internationalized messages. For compilation with Aalib, you need version 1.4 which can be downloaded from http://aa-project.sf.net. 2. Microsoft DOS users will enjoy i18n if their system supports it. Unfortunately some systems have to have plain DOS to make i18n available. Many Windows systems also support running batch files from native Windows, however not all (my Windows NT 4 does not). DOS users should run xaos-??.bat in the bin\ directory. Note that some messages in latin2 fonts will not be displayed correctly. Aalib may not work 100% correctly. It may depend on your DPMI settings. You should download the latest csdpmi*.zip package. If you want to compile XaoS from scratch, you should download the following software: aalib-1.4rc5.tar.gz, all402.zip, bnu213b.zip, djdev203.zip, fil41b.zip, gcc2952b.zip, gtxt040b.zip, licv17b.zip, mak3791.zip, png1012b.zip, txi42b.zip, zlib114b.zip. Aalib must be patched to compile it (I sent a patch to the SourceForge Tracker) and libvga and libtext (needed for Aalib) must be also installed. Note that libtext will not compile under the newest DJGPP, if someone know why DJGPP fails to compile the appropriate assembly code, please write to us. 3. XaoS has i18n support under Microsoft Windows now. You are not suggested changing the drivers many times because XaoS will crash. 4. Here is a list about recent bugs and problems: * Fixing Macintosh version (load/save works incorrectly). * Checking why Bailout item is duplicated in Windows help. * Displaying latin2 fonts correctly. * Fixing catalog files (mainly French and Spanish). * Filling up i18n for menu files for some languages. * Fixing Macintosh version (crash when loading random examples). * Fixing Windows version (crash when several times saving files and configurations). * Fixing generated xaos.dlg for certain languages (e.g. Hungarian). * Fixing crashing configure/make for all problematic platforms. * Rewriting i18n to be easier to add new menus and others. * All other todos announced in TODO file. That's all. However the problem list is quite long, we hope you will enjoy XaoS 3.1. Regards, Zoltan Kovacs Andreas Madritsch Jan Hubicka J.B. Langston Credits: Jan Hubicka is the main author of XaoS. He wrote the biggest parts of this program, in fact, all the most important things. Andreas Madritsch helped a lot putting together version 3.1. He also compiled the DOS and Windows executable and made German translations of menu items available. He added bailout and 3 fractal types into version 3.1. He also fixed i18n to work under Windows correctly. Zoltan Kovacs wrote this documentation about the recent installation problems and he was finalizing release 3.1. He added i18n support into XaoS and cleaned up the code as it was possible. J.B. Langston contributed the Mac OS X native driver, the new XaoS web design, and has helped maintain the software from 3.2.2 onward. Many others helped as well. The full list of them can be seen in file AUTHORS. XaoS-release-4.3.2/README.md000066400000000000000000000062471455214672000153060ustar00rootroot00000000000000XaoS ==== XaoS (pronounced *chaos*) is a realtime interactive fractal zoomer. This means that it lets you zoom smoothly into any place in the fractal you choose without the long calculation required by other fractal generators. It has many other features too, like different fractal types, autopilot, special coloring modes, random palette generation, color cycling, etc. XaoS (since version 4.3, September 2023) is available as a full-featured web application as well. You can try it at its [current webpage](https://matek.hu/zoltan/xaos). Also, you can try a simplified version of the XaoS zooming algorithm online using [XaoS.js](https://xaos-project.github.io/XaoSjs/). XaoS is based on [Qt](http://www.qt.io), and has been tested on Windows, Mac and Linux. It should also work on any other platform supporting Qt Widgets, like the BSDs. - Original authors: [Jan Hubička](https://www.ucw.cz/~hubicka/) and [Thomas Marsh](https://www.linkedin.com/in/thomasmarsh). - Current maintainers: [J.B. Langston](https://www.linkedin.com/in/jblangston/) and [Zoltán Kovács](https://matek.hu/zoltan). - See [CREDITS](CREDITS.md) for a complete list of contributors. Project Resources ----------------- - [GitHub Repo](https://github.com/xaos-project/XaoS) - [Binary Releases](https://github.com/xaos-project/XaoS/releases) - [Documentation](https://github.com/xaos-project/XaoS/wiki) - [Issue Tracker](https://github.com/xaos-project/XaoS/issues) - [XaoS website](http://xaos-project.github.io/) - [Users' Google Group](http://groups.google.com/group/xaos-users) - [Developer's Guide](https://github.com/xaos-project/XaoS/wiki/Developer's-Guide) Bugs and Support ---------------- XaoS is a community-supported free software project. The Google Group provides a place for XaoS users to help each other get the most out of XaoS. XaoS developers also monitor this discussion and answer questions from time to time. You can browse the archives freely but to prevent spam, you must join the group in order to post. Google Groups provides options for participation from a traditional mailing list to a completely web-based forum, so you don’t have to get emails if you don’t want to. If you think you have found a bug in XaoS or have an idea for a new feature, please let us know about it. XaoS is developed on a volunteer basis and the developers work on it in their spare time. Therefore, we can’t guarantee that issues will be addressed in a certain timeframe. If you are able to fix a bug or implement a new feature yourself, pull requests are very welcome. License ------- Copyright © 1996-2023 XaoS Contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . XaoS-release-4.3.2/XaoS.pro000066400000000000000000000051671455214672000154230ustar00rootroot00000000000000# ------------------------------------------------- # Project created by QtCreator 2009-10-29T19:21:55 # ------------------------------------------------- lessThan(QT_MAJOR_VERSION, 6): error("requires Qt >= 6") wasm { lessThan(QT_MINOR_VERSION, 5): error("requires Qt >= 6.5.2") } TEMPLATE = app QT += widgets macx { TARGET = XaoS } else { TARGET = xaos } contains(DEFINES, USE_OPENGL) { QT += opengl win32:LIBS += -lopengl32 } contains(DEFINES, USE_FLOAT128) { LIBS += -lquadmath } else { DEFINES += USE_LONG_DOUBLE } CONFIG(debug, debug|release) { DEFINES += DEBUG win32:CONFIG += console } CONFIG(release, debug|release) { QMAKE_POST_LINK=$(STRIP) $(TARGET) linux: { # This may help in debugging some odd issues under Debian: # QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS) # QMAKE_CXXFLAGS *= $(shell dpkg-buildflags --get CXXFLAGS) # QMAKE_LFLAGS *= $(shell dpkg-buildflags --get LDFLAGS) } } isEmpty(QMAKE_LRELEASE) { win32 { QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe } else { QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease } unix { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 } !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } } else { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } } } CONFIG += optimize_full CONFIG += c++11 QMAKE_CXXFLAGS += -ffast-math QMAKE_CFLAGS += -ffast-math QMAKE_CXXFLAGS += -fpermissive RESOURCES += XaoS.qrc DESTDIR = $$PWD/bin include($$PWD/i18n/i18n.pri) include($$PWD/src/include/include.pri) include($$PWD/src/ui/ui.pri) include($$PWD/src/engine/engine.pri) include($$PWD/src/ui-hlp/ui-hlp.pri) include($$PWD/src/util/util.pri) include($$PWD/src/sffe/sffe.pri) # Support "make install" isEmpty(PREFIX) { PREFIX = /usr/local } DEFINES += DATAPATH=\\\"$$PREFIX/share/XaoS\\\" wasm{ QMAKE_LFLAGS += --preload-file $$PWD/examples@$$DATAPATH/examples QMAKE_LFLAGS += --preload-file $$PWD/catalogs@$$DATAPATH/catalogs QMAKE_LFLAGS += --preload-file $$PWD/tutorial@$$DATAPATH/tutorial QMAKE_LFLAGS += -sASYNCIFY -Os # This can help avoiding to get the web application hang when the user presses "s". } executable.files = bin/xaos executable.path = $$PREFIX/bin examples.path = $$PREFIX/share/XaoS/examples examples.extra = find examples -name \'*.xpf\' -exec cp {} $(INSTALL_ROOT)$$PREFIX/share/XaoS/examples \; catalogs.files = catalogs/*.cat catalogs.path = $$PREFIX/share/XaoS/catalogs tutorial.files = tutorial/*.x?f tutorial.path = $$PREFIX/share/XaoS/tutorial INSTALLS += executable examples catalogs tutorial XaoS-release-4.3.2/XaoS.qrc000066400000000000000000000012561455214672000154030ustar00rootroot00000000000000 i18n/XaoS_cs.qm i18n/XaoS_de.qm i18n/XaoS_es.qm i18n/XaoS_fr.qm i18n/XaoS_he.qm i18n/XaoS_hi.qm i18n/XaoS_hu.qm i18n/XaoS_is.qm i18n/XaoS_it.qm i18n/XaoS_pt.qm i18n/XaoS_ro.qm i18n/XaoS_ru.qm i18n/XaoS_rs.qm i18n/XaoS_sk.qm i18n/XaoS_sv.qm i18n/XaoS_tr.qm i18n/XaoS_vi.qm XaoS-release-4.3.2/catalogs/000077500000000000000000000000001455214672000156135ustar00rootroot00000000000000XaoS-release-4.3.2/catalogs/README000066400000000000000000000002311455214672000164670ustar00rootroot00000000000000Changes since 3.0: Julia is now a separate chapter, so you need to renumber all chapters and add this one. Catalogs that need an update: francais.cat XaoS-release-4.3.2/catalogs/README.i18n000066400000000000000000000005731455214672000172560ustar00rootroot00000000000000NOTES FOR INTERNATIONALIZATION (I18N) SUPPORT --------------------------------------------- 2 September 2002 All of the available languages must be registered in ../ui/ui.c. The other entries in ../ui-hlp/menu.c are no longer used. Please edit ../i18n/*.po and read the README file to add and/or improve i18n support for your language. Zoltan Kovacs XaoS-release-4.3.2/catalogs/cs.cat000066400000000000000000000615171455214672000167230ustar00rootroot00000000000000# Message catalog file required to replay XaoS tutorials in # czech language this is latin2 version in case I will once add # support for latin2 fonts # # Copyright (C) 1997 by Jan Hubicka # # See english.cat for more info ######################################################### #For file dimension.xaf encoding "2" fmath "Fraktály a matematika" fmath1 "Fraktály jsou poměrně novou částí matematiky a proto je zde ještě mnoho nevyřešených otázek" fmath2 "Dokonce neexistuje ani uspokojivá definice" fmath3 "Většinou považujeme za fraktály všechno, kde lze najít jistou soběpodobnost." def1 "Jednou z možných definic je..." def2 "Co to znamená?" def3 "Napřed je nutné rozumět rozdílu mezi Hausdorff Besicovichovou dimmenzí a topologickou dimenzí." topo1 "Topologická dimenze odpovídá \"normální\" představě o dimenzi" topo2 "bod má dimenzi 0" topo3 "křivka 1" topo4 "a rovina 2" hb1 "Definice Hausdorff Besicovichovy dimenze vychází z jednoduchého pozorování" hb2 "Velikost dvojnásobně zvětšené úsečky se zvětší dvakrát" hb3 "Velikost zvětšeného čtverce ale čtyřikrát" hb4 "Podobně se chovají i vyšší dimenze" hb5 "K výpočtu dimenze z této hodnoty lze použít následující vzorec:" hb6 "dimenze = log s / log z kde z je změna zvětšení a s je změna velikosti objektu" hb7 "Pro úsečku a zvětšení 2 je změna velikosti také 2. log 2 / log 2 = 1" hb8 "Pro čtverec a zvětšení 2 je změna velikosti 4. log 4 / log 2 = 2" hb9 "Hausdorff Besicovichova dimenze je tedy u mnoha objektů stejná jako topologická dimenze" hb10 "Zajímavější jsou výsledky u fraktálů" hb11 "Vezměme například sněhovou vločku," hb12 "která vznikne opakovaným nahrazováním jedné úsečky za čtyři." hb13 "Nové úsečky jsou vždy třetinové oproti původním" hb14 "Po trojnásobném zvětšení tedy budou stejně dlouhé," hb15 "Díky soběpodobnosti, která vznikla opakovaným nahrazováním," hb15b "každá tato část je kopie celého fraktálu v původní velikosti," hb16 "Protože jsou zde čtyři takové kopie, fraktál se zvětšil čtyřikrát" hb17 "Po dosazení: log 4 / log 3 = 1.261" hb18 "Získali jsme tedy hodnotu větší než 1 (topologická dimenze křivky)" hb19 "Hausdorff Besicovichova dimenze (1.261) je vyšší, než topologická dimenze (1)" hb20 "Podle definice tedy je sněhová vločka fraktál" defe1 "Tato definice neni perfektní, protože vylučuje některé tvary, které lze považovat za fraktály." defe2 "Ukazuje ale jednu ze zajímavých vlastností fraktálů" defe3 "a je poměrně často používana." defe4 "Hausdorff Besicovichova dimenze se také často nazývá \"fraktálovou dimenzí\"" ######################################################### #For file escape.xaf escape "Fraktály a matematika kapitola druhá escape time fractals" escape1 "Některé fraktály (jako sněhová vločka) se generují jednoduchým postupem" escape2 "XaoS je ale program pro výpočet jiného typu fraktálů - známych jako escape time fractals" escape3 "Metoda jejich generování je trohu odlišná, ale také založena na iterování" escape4 "Obrazovka je považována za rovinu komplexních čísel" escape5 "Reálná osa je horizontálně" escape6 "a imaginární vertikálně" escape7 "Každý bod má svůj orbit" escape8 "Jehož trajektorie se vypočte pomocí iterační funkce f(z,c), kde z je hodnota z předchozí iterace a c je parametr (bod na obrazovce)" escape9 "Například u Mandelbrotovy množiny iterační funkce je z = z^2 + c" orbit1 "například pokud se budeme zajímat o bod 0 - 0.6i" orbit2 "použijeme ho jako hodnotu pro parametr c" orbit3 "Orbit vždy začíná na pozici z = 0 + 0i" orbit3b "potom budeme opakovaně počítat iterační funkci a pokaždé získáme novou hodnotu z pro další iteraci" orbit4 "Pokud orbit zůstane v konečných hodnotách, bod patří do množiny." orbit5 "V tomto případě posloupnost konverguje" orbit6 "Proto tento bod patří do množiny" orbit7 "V jiných případech ale nemusí" orbit8 "(například pro bod 10 + 0i první iterace je 110, druhá 12110 atd.)" orbit9 "Takové body jsou mimo množinu" bail1 "Pořád ale mluvíme o nekonečném počtu iterací a nekonečných číslech" bail2 "Protože jsou ale počítače konečné, není možné provédst výpočet přesně" bail3 "Lze ale dokázat, že pokud vzdálenost orbitu od nuly větší, než 2, orbit pokaždé uteče do nekonečna" bail4 "Proto můžeme přerušit výpočet, pokud bod opusti okolí nuly (bailout test)" bail5 "V příadě, že počítáme bod mimo množinu, potřebujeme tedy pouze konečný počet iterací" bail6 "Také se pomocí tohoto testu vytváří barevné pruhy okolo množiny" bail7 "Obarvují se podle počtu iterací, které orbit potřeboval k porušení bailout testu" iter1 "Uvnitř množiny ale stále potřebujeme nekonečně iterací" iter2 "Je tedy nutné výpočet přerušit po daném maximálním počtu iterací" iter3 "Maximální počet iterací určuje přesnost výpočtu" iter4 "Pokud neprovedeme žádné iterace, bailout test vytvoří kruh o poloměru 2" iter5 "Zvyšováním maximálního počtu iterací dostaneme přesnější a přesnější aproximaci" limit1 "XaoS standardně počítá 170 iterací" limit2 "V některých místech je možné zoomomovat poměrně dlouho bez dosažení limitu přesnosti" limit3 "V jiných místech ale lze dosáhnout limitu docela brzo" limit4 "výsledek je potom poněkud jednotvárný" limit5 "Po zvýšení počtu iterací ale vznikne mnoho nových detailů" ofracts1 "Ostatní fraktály v XaoSovi jsou počítáný pomocí jiných formulí a bailout testů, ale základní postup je stejný" ofracts2 "Tento postup je náročný na výkon počítače. XaoS má mnoho optimalizací o kerých se můžete dočíst v dokumentaci" ######################################################### #For file anim.xaf anim "Ukládání a přehrávání animací" ######################################################### #For file anim.xhf anim2 "Možná jste si už všimli, že XaoS umí přehrávat animace." anim3 "Ty je možné vytvářet přímo v XaoSovi" languag1 "Protože jsou ale animace a pozice uloženy pomocí jednoduchého jazyka," languag2 "(pozice jsou ve steném formátu jako animace)" languag3 "je možné potom animace ručně upravovat." languag4 "Většina animací dodávaných s XaoSem je psaná kompletně ručně pouze s pomocí uložených pozic" modif1 "Jenom jednoduchou úpravou tohoto souboru" modif2 "Je možné vygenerovat jednoduchou \"zmenšovací\" animaci." modif3 "Pomocí této změny \"zvětšovací\" animaci." newanim "Také je možné napsat úplně nové animace a efekty" examples "Inspiraci můžete hledat také v příkladech, které lze nahrávat v náhodném pořadí ze save/load menu" examples2 "Pomocí uložených pozic je také možné převádět souřadnice do jiných programů." examples3 "Fantazii se meze nekladou snad kromě jazyka použitého v souborech popsaného v dokumentaci" ######################################################### #For file barnsley.xaf intro4 "Úvod do fraktálů Část pátá - Formulka pana Barnsleyho" barnsley1 "Jinou formulku si vymyslel pan Michael Barnsley" barnsley2 "Výsledkem je tento podivný fraktál" barnsley3 "Nepatří zrovna k nejzajímavějším" barnsley4 "Jeho Juliovy množiny vypadají mnohem lépe." barnsley5 "Jejich struktura připomíná krystaly," barnsley6 "narozdíl od většiny ostatních fraktálů v XaoSovi, které vypadají spíše organicky" ######################################################### #For file filter.xaf filter "filtry" ######################################################### #For file filter.xhf filter1 "Filtr je efekt aplikovaný na data potom, co se fraktál vypočte" filter2 "XaoS má následující filtry" motblur "Motion blur" edge "Dva různé filtry na detekci hran" edge2 "První dělá hrany tlustší a proto je pěkný hlavně ve vysokých rozlišeních" edge3 "Druhý dělá hrany tenčí" star "Starfield" interlace "Interlace filter zrychluje výpočet a ve výšším rozlíšení dělá podobný efekt jako Motion Blur" stereo "Stereogram filter" stereo2 "Pokud v následují části nic neuvidíte, možná to není tím, že neumíte šilhat, ale proto, že XaoS předpokládá menší monitor. To můžete změnit parametry z příkazové řádky. Přečtěte si xaos -help." emboss1 "Emboss filter" palettef1 "Palette emulator umožňuje rotaci palety i v true-coloru" truecolorf "Poslední filtr emuluje true-color." ######################################################### #For file fractal.xaf end "Konec" fcopyright "Úvod do fraktálů vytvořil Jan Hubička v červenci roku 1997" suggestions " Pošlete mi všechny nápady a komentáře na moji adresu: xaos-discuss@lists.sourceforge.net Děkuji" ######################################################### #For file incolor.xaf incolor1 "Většinou se body uvnitř množiny kreslí jednou barvou" incolor2 "To pěkně zvýrazní hranice ale oblasti ivnitř vypadají poněkud nudně." incolor3 "Pokud je chcete mít trochu zábavnější, můžete použit hodnotu posledního orbitu k určení barvy" incolor4 "XaoS má deset různých takových výpočtů, které nazývá \"incoloring modes\"" zmag "zmag Barva se počítá podle vzdálenosti posledního orbitu od počátku" ######################################################### #For file innew.xaf innew1 "Decomposition like Funguje stejne jako \"color decomposition\" v \"outcoloring modes\" tedy podle úhlu posledního orbitu" innew2 "real/imag Jak název napovídá, barva se vypočte podle reálné části posledního orbitu vydělené imaginární" innew3 "Následujících 6 režimů nemá nějaké hlubší opodstatnění snad mimo toho, že vypadají zajímavě. Část je opsána z programu flarium." ######################################################### #For file intro.xaf fractal "...Fraktály..." fractal1 "Co to je?" fractal2 "Definice pana Mandelbrota: Fraktál je množina, pro kterou Hausdorff Besicovichova dimenze přesahuje topologickou dimenzi." fractal3 "Něco snad není jasné?" fractal4 "Nevadí. Většina matematiků stejně není touto definicí uspokojena" fractal5 "Jednoduše:" fractal6 "fraktál je složený z částí" fractal7 "kde každá je přibližná zmenšená kopie celku" fractal8 "Neustálým kopírováním" fractal9 "vznikne celý fraktál." facts "Co je na fraktálech tak zajímavého?" fact1 "Jsou nezavislé na měřítku" fact2 "Jsou soběpodobné" fact3 "A často se vyskytují v přirodě." #fact4 "Například mraky, hory #nebo pobřeží." fact5 "Ale i hodně matematických konstrukcí jsou fraktály" fact6 "Jednu právě sledujete na obrazovce" fmath4 "Mnoho fraktálů lze konstruovat iteračním postupem" fmath5 "Například fraktál známý jako křivka von Kochové" fmath6 "vznikne zaměňováním úsečky" fmath7 "za čtyři" fmath8 "Toto je první iterace" fmath9 "Nyní ale postup můžeme opakovat" fmath10 "a získat druhou," fmath11 "třetí," fmath12 "a čtvrtou iteraci." fmath13 "Po nekonečném počtu iterací vznikne fraktál," fmath14 "který připomíná jednu třetinu sněhové vločky" tree1 "Mnoho jiných tvrarů lze zkonstruovat podobným postupem" tree2 "Například jinou záměnou úsečky" tree3 "vznikne strom" nstr "Iterace také mohou být založené na náhodných číslech" nstr2 "Záměnou úsečky" nstr3 "za dvě s malou chybou" nstr4 "vznikne fraktál připomínající pobřeží" nstr5 "Podobným postupem lze vytvořit mraky, pohoří a mnoho dalších tvarů z přírody" ############################################################################ # mset.xaf fact7 "Nejznámější je..." mset "Mandelbrotova množina" mset1 "Je generována jednoduchým výrazem" mset2 "Ale je to jeden z nejkrásnějších fraktálů" mset3 "Protože je soběpodobná," mset4 "hranice množiny obsahují" mset5 "miniaturní kopie celku" mset6 "Toto je největší kopie. Pouze přibližně 50krát zmenšená" mset7 "Mandelbrotova množina není čistě soběpodobná" mset8 "Každá miniaturní kopie se liší" mset9 "Tato je 76000krát menší" mset10 "Kopie z jiných částí jsou odlišnější." nat "Hranice množiny neobsahují pouze miniaturní kopie celku" nat1 "Ale i nekonečné množství jiných tvarů" nat2 "Některé jsou neuvěřitelně podobné těm z přírody" nat3 "Vypadají jako stromy," nat4 "řeky a jezera," nat5 "galaxie" nat6 "nebo vodopády" nat7 "Obsahuje ale i naprosto nové tvary" juliach "Úvod do fraktálů Část druhá - Juliova množina" julia "Mandelbrotova množina není jediným fraktálem generovaným výrazem z=z^2+c," julia1 "dalším je" julia2 "Juliova množina" julia3 "Zajímavé je, že není pouze jediná taková množina," julia4 "ale je jich hned nekonečně mnoho" julia5 "Každá se liší pouze jednou hodnotou" julia6 "Bodem zvoleným v Mandelbrotově množine" julia7 "Mandelbrotova množina je vpodstatě mapa Juliových množin." julia8 "Body uvnitř množiny mají Juliovy množiny velké a spojité" julia9 "Body vně mají Juliovy množiny nespojité" julia10 "Nejzajímavější jsou body na hranicích" theme "Téma juliovy množiny záleží na bodu zvolém v Mandelbrotově množině" theme1 "Ve zmenšení jsou detaily kolem zvoleného bodu" theme2 "velmi podobné s Mandlebrotovou množinou." theme3 "Po zmenšení ale zjistíte" theme4 "že se jedná o úplně jiný fraktál" theme5 "Juliovy množiny na první pohled vypadají nudně, protože se téma nemění" theme6 "Zůstává to zvolené v Mandelbrotové množině" theme7 "Pečlivým výběrem bodu lze ale získat" theme8 "zajímavé obrázky" ######################################################### #For file keys.xhf keys "Klávesy: S - Konec přehrávání Space - urychlení (může chvíli trvat) vlevo/vpravo - změna rychlosti titulků" ######################################################### #For file magnet.xaf intro7 "Úvod do fraktálů Část osmá - Magnet" magnet "Toto není Mandelbrotova množina" magnet1 "Tento fraktál se nazývá magnet, protože pochází z teoretické fyziky" magnet2 "Vychází ze studie magnetických renormalizačních transformací" similiar "Podobnost s Mandelbrotovou množinou je zajímavá, protože to už není pouze matematická hřička." magjulia "Má neobvyklé juliovy množiny" ######################################################### #For file new.xaf new "Co je nového ve verzi 3.0?" speed "1. Je rychlejší1" speed1 "Hlavní výpočetní smyčka nyní hledá periody a dělá několik iterací najednou" speed2 "Nové fraktály se počitají pomocí metody \"boundary detection\"" speed3 "Výpočet nových fraktálů je proto mnohem rychlejší." speed4 "Například Mandelbrotova množina při 1 000 000 iterací" speed5 "počítám..." speed6 "Hotovo" speed7 "XaoS má heruistiku a nehledá periody tam, kde je neočekává. (žádné takové kolem nejsou)" speed8 "Take hlavní rutinky byly optimalizovány a jsou dvakrát rychlejší" speed9 "Takže nyní dosahuje 130FPS na 130Mhz pentiu" new2 "2. filtry" new3 "3. devět outcoloring modů" new4 "4. nové incoloring mody" new5 "5. Truecolor coloring mody" new6 "6. Přehrávání a ukládání animací" newend "A další změny jako rotace, lepší nahodné palety apod. Kompletní seznam změn je v souboru ChangeLog" ######################################################### #For file newton.xaf intro3 "Úvod do fraktálů Část čtvrtá-Newtonova metoda" newton "Tento fraktál je generovaný uplně jiným výpočtem" newton1 "Newtonovou aproximační metodou pro hledání kořenů polynomu x^3=1" newton2 "Sleduje se počet iterací nutný k dosažení přibližného výsledku" newton3 "Tři kořeny můžete vidět jako modré kolečka" newton4 "Nejzajímavější jsou ale části, kde si výpočet nebyl jistý, ke kterému kořenu se vydá" newton5 "Fraktál je velmi soběpodobný a tak tu už nic moc nového nenajdete" newton6 "Ale je možné vygenerovat \"skoro-Juliovy\" množiny" newton7 "Kde se zvolený bod přičte jako chyba při aproximaci" newton8 "To vnese do výpočtu nepořadek a učiní fraktál zajímavějším" ######################################################### #For file octo.xaf intro6 "Úvod do fraktálů Část sedmá-Octo" octo "Octo je jeden z méně známych fraktálů" octo1 "Vybrali jsme jej, protože má neobvyklý tvar" octo2 "Podobně jako u Newtonova fraktálu XaoS umí generovat \"skoro-Juliovy\" množiny" ######################################################### #For file outcolor.xaf outcolor "Out coloring modes" outcolor1 "Mandelbrotova množina je to ošklivé černé uprostřed obrazovky" outcolor2 "Barevna věc okolo jsou pouze hranice" outcolor3 "Normálně se barva určuje podle počtu iterací nutných k dosažení limitu" outcolor4 "Ale jsou i jiné cesty" outcolor5 "XaoS je nazývá \"outcoloring modes\"" iterreal "iter+real K obarvení přičte reálnou část posledního orbitu k počtu iterací" iterreal1 "Některé nudnější obrázky tím lze vylepšit" iterimag "Další coloring mode-iter+imag má podobné výsledky" iterimag2 "Není se čemu divit - jediný rozdíl je, že přičíta imaginární část orbitu" iprdi "iter+real/imag Zde se přičte realná část posledního orbitu vydělená imaginarní k počtu iterací" sum "iter+real+imag+real/imag A toto je součet všech předchozích" decomp "binarry decomposition Pokud je imaginární část menší než nula, odečte se počet iterací od maximálního počtu iterací, jinak se používa počet iterací" bio "Biomorphs Tento režim se tak jmenuje proto, že některé fraktály potom vypadají jako jednobuněční živočichové" ######################################################### #For file outnew.xhf potential "Potential Tento režim vypdá nejlépe v true-color režimu" cdecom "color decomposition" cdecom2 "Barva se vypočte podle úhlu posledního orbitu" cdecom3 "Je podobná binární dekompozici ale barva přechází plynule" cdecom4 "V Newtonově fraktálu obarvuje bod podle kořenu, ke kterému se přibližuje a ne podle počtu iterací" smooth "smooth Tento režim se pokouší vytvořit plynulé přechody a zarovnat skoky způsobené změnou počtu iterací" smooth1 "Nefunguje na fraktálech Newton a Magnet" smooth2 "Funguje také pouze v true-coloru proto si zapněte truecolor filtr pokud jej nemáte" ######################################################### #For file outnew.xhf intro5 "Úvod do fraktálů Část šestá - Phoenix" phoenix "Toto je Mandelbrotova množina pro formuli známou jako Phoenix" phoenix1 "Vypadá trochu jinak než ostatní fraktály v XaoSovi ale je možne najít jistou podobnost s Mandelbrotovou množinou" phoenix2 "Také obsahuje \"anténu\" vepředu" phoenix3 "Pořád téma Jiliovy množiny odpovídá tématu kolem zvoleného bodu," phoenix4 "ale Juliovy množiny vypadají docela jinak" ######################################################### #For file plane.xaf plane1 "Normálně realná souřadnice bodu odpovídá x-ové souradnici na obrazovce a imaginární y-ové" plane2 "XaoS má ale i 6 dalších metod" plane3 "1/mu Kruhová inverse - části z nekonečna jdou no nuly a nula do nekonečna" plane4 "Toto je normální Mandelbrotova množina" plane5 "A toto po inversi" plane6 "Množina byla ve středu, proto je nyní všude kolem a nekonečná modrá oblast kolem je teď malé kolečko uprostřed" plane7 "Další obrázky budou pokaždé ukázávny normálně a po inversi" plane8 "1/mu+0.25 Zobrazení je podobné inversi, pouze střed je posunut" plane9 "Protože střed je na hranici množiny, zobrazila se jako nekonečná parabola" plane10 "Zajímavě skresluje i jiné fraktály, protože robíjí jejich symetrii" lambda "Zobrazení lambda" ilambda "1/lambda Kombinace inverze a lambdy" imlambda "1/(lambda-1) Kombinace inverze, posunutí a lambdy" imlambda2 "Způsobuje zajímavou deformaci Mandelbrotovy množiny" mick "1/(mu-1.40115) A opět inverze s posunitím, nyní posunuta do speciálního bodu Mandelbrotovy množiny. V okolí tohoto bodu je množina soběpodobná. Toto skreslení zvětšuje tuto část" ######################################################### #For file power.xaf intro2 "Úvod do fraktálů Část třetí-Mandelbrotovy množiny vyšších řádů" power "z^2+c není jediný vzorec generující fraktál" power2 "Jenom trochu upravený - x^3+c generuje fraktál také" power3 "Ten samozřejmě také obsahuje kopie hlavni nožiny" power4 "Další takové fraktály vzniknou upravenými vzorci" pjulia "A každá taková množina má odpovidající Juliovy množiny" ######################################################### #For file truecolor.xaf truecolor "Truecolor coloring modes" truecolor1 "Normálně se fraktály obarvují pomocí palety. V truecoloru se paleta emuluje" truecolor2 "Jediný rozdíl je, že paleta je větší a barvy se plynule interpolují" truecolor3 "Truecolor coloring mode má úplně jiný přístup. Používá různé hodnoty z vypočtu," truecolor4 "k výpočtu přímo barvy, nejenom pozice v paletě" truecolor5 "To umožňuje zobrazit až čtyři hodnoty v jednom bodě" truecolor6 "Truecolor coloring mode vyžaduje truecolor. Pokud ho nemáte, zapněte si laskavě truecolor filtr" ######################################################### #For file pert.xaf pert0 "Perturbation" pert1 "Podobně jako u Juliovy množiny můžete měnit parametr pro generování" pert2 "Je možné v Mandelbrotově množině měnit parametr jménem \"perturbation\"" pert3 "Ovlivní se tím startovní pozice orbitu, která je obvykle [0,0]" pert4 "Nedělá tak zajímavé změny jako parametr Juliovy Množiny, ale je tím možné fraktál udělat náhodnější." ######################################################### #For file palette.xaf pal "Náhodné palety" pal0 "XaoS nemá žádné ručně definované palety jako většina ostatních programů generujicí fraktály, místo toho je generuje náhodně" pal1 "Jednoduše mačkejte 'P' tak dlouho, dokud si nějakou z nabízených palet nevyberete" pal2 "Jsou použity tři algoritmy" pal3 "První dělá přechody z černé do náhodne barvy" pal4 "Druhý přechod z černé do barvy a potom do bílé" pal5 "Třetí je inspirován kubistickými obrazy" ######################################################### #For file other.xaf auto1 "Autopilot" auto2 "Ti línější můžou jednoduše zapnout autopilota a nechat XaoS zkoumat fraktál automaticky" fastjulia1 "Režim pro výběr Juliovy množiny" fastjulia2 "V tomto režimu můžete měnit parametr Juliovy množiny plynule" fastjulia3 "Díky podobnosti s okolím bodu v Mandelbrotově množině je také jej možné použít jako preview bodu před tím, než tam začnete zoomovat" rotation "Rotace obrazu" cycling "Rotace palety" ############################################## #for file trice.xaf trice1 "Triceratops and Catseye fractals" trice2 "If you change the bailout value" trice3 "of an escape-time fractal" trice4 "to a smaller value," trice5 "you will get an other fractal." trice6 "With this method we can get" trice7 "very interesting patterns" trice8 "with separate areas of one color." trice9 "The Triceratops fractal" trice10 "is also made with this method." trice11 "Many similar pictures can be" trice12 "made of Triceratops." trice13 "The Catseye fractal" trice14 "is like an eye of a cat." trice15 "But if we raise the bailout value..." trice16 "...we get a more interesting fractal..." trice17 "...with bubbles..." trice18 "...and beautiful Julias." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar and Spider" fourfr2 "This is the Mandelbar set." fourfr3 "It's formula is: z = (conj(z))^2 + c" fourfr4 "Some of its Julias are interesting." fourfr5 "But let's see other fractals now." fourfr6 "The Lambda fractal has a structure" fourfr7 "similar to Mandelbrot's." fourfr8 "It's like the Mandelbrot set on the lambda plane." fourfr9 "But Lambda is a Julia set, here is MandelLambda." fourfr10 "...fast Julia mode..." fourfr11 "This is the fractal Manowar." fourfr12 "It was found by a user of Fractint." fourfr13 "It has Julias similar to the whole set." fourfr14 "This fractal is called Spider." fourfr15 "It was found by a user of Fractint, too." fourfr16 "And it has Julias similar to the whole set, too." ############################################## #for file classic.xaf classic1 "Sierpinski Gasket, S.Carpet, Koch Snowflake" classic2 "This is the famous Sierpinski Gasket fractal." classic3 "And this is the escape-time variant of it." classic4 "You can change its shape by selecting" classic5 "another 'Julia seed'" classic6 "This fractal is the Sierpinski Carpet." classic7 "And here is it's escape-time variant." classic8 "This is famous, too." classic9 "And finally, this is the escape-time variant" classic10 " of the Koch Snowflake." ############################################## #for file otherfr.xaf otherfr1 "Other fractal types in XaoS" XaoS-release-4.3.2/catalogs/de.cat000066400000000000000000000766241455214672000167130ustar00rootroot00000000000000# Katalogdatei für die Wiedergabe der XaoS-Tutorials auf deutsch. # # Copyright (C) 1997 by Jan Hubicka # Übersetzung von Jens Kilian # # Falls Sie Xaos diese Datei modifizieren wollen, sollten Sie folgendes beachten: # # Das Format des Kataloges ist # identifikator[leerzeichen]"wert"[leerzeichen] # # Der Identifikator ist ein kurzer Text, der in den Tutorials benutzt wird # und nicht übersetzt werden darf. Nur der Wert sollte geändert werden. # Verwenden Sie \" anstelle von " und \\ anstelle von \. Zeilenumbrüche # direkt eingeben (nicht mit \n). # # Sie können die Texte verkürzen oder verlängern; XaoS passt die # Darstellungszeit automatisch an. # # Wenn Sie Fehler in dieser Datei finden, lassen Sie es mich bitte wissen. ######################################################### #Datei: dimension.xaf fmath "Die Mathematik hinter Fraktalen" fmath1 "Fraktale Geometrie ist ein sehr junges Gebiet der Mathematik, weshalb hier noch viele Fragen ungelöst sind." fmath2 "Sogar die Definitionen sind unklar." fmath3 "Normalerweise nennen wir etwas fraktal, wenn eine gewisse Selbstähnlichkeit gefunden werden kann." def1 "Eine der möglichen Definitionen ist:" #Definition from the intro.xaf is displayed here. #If it is a problem in your language catalog, let me #know and I will create a special key def2 "Was heißt das?" def3 "Um dies zu erklären, müssen wir zuerst verstehen, was die topologische- und die Hausdorff-Besicovich-Dimension sind." topo1 "Die topologische Dimension ist die \"normale\" Dimension." topo2 "Ein Punkt hat 0 Dimensionen" topo3 "Eine Linie hat 1 Dimension" topo4 "Eine Fläche hat 2, usw." hb1 "Die Definition der Hausdorff-Besicovich-Dimension kommt von der einfachen Tatsache, dass" hb2 "eine Linie die so gezoomt wird, dass sich ihre Länge verdoppelt, danach zwei Mal so lang ist, wie sie vorher war." hb3 "Andererseits wächst die Ausdehnung eines Quadrates, das in gleicher Weise gezoomt wird, um den Faktor vier." hb4 "Ähnliche Regeln funktionieren auch für Objekte, die sich in mehrere Dimensionen ausdehnen." hb5 "Um Dimensionen mit Hilfe dieser Tatsache zu berechnen, kann folgende Gleichung benutzt werden:" hb6 "Dimension = log s / log z, wobei z dem Zoomfaktor und s der Ausdehnung entspricht" hb7 "Wird eine Linie um den Faktor 2 gezoomt, ändert auch die Ausdehnung um den Faktor 2. log 2 / log 2 = 1" hb8 "Wird ein Quadrat um den Faktor 2 gezoomt, ändert die Ausdehnung um den Faktor 4. log 4 / log 2 = 2" hb9 "Diese Definition führt zu den erwarteten Resultaten für normale Formen." hb10 "Interessanter wird es bei Fraktalen." hb11 "Sehen Sie sich die so genannte Koch'sche Schneeflockenkurve an," hb12 "welche entsteht, wenn man eine Linie in drei gleiche Abschnitte teilt und den Mittleren durch zwei ebenso lange Abschnitte ersetzt und diesen Vorgang beliebig oft wiederholt." hb13 "Die neuen Linien haben 1/3 der Größe der ursprünglichen Linie." hb14 "Nach dem Zoomen um den Faktor 3, sind diese Linien exakt gleich lang wie die ursprüngliche Linie." hb15 "Wegen der Selbstähnlichkeit, die durch unendlich wiederholtes Teilen entsteht," hb15b "wird jedes dieser Teile eine exakte Kopie des ursprünglichen Fraktals." hb16 "Weil beim Teilen vier solche Kopien entstehen, wächst die Ausdehnung des Fraktals um den Faktor 4." hb17 "Nun setzen wir diesen Wert in unsere Gleichung ein: log 4 / log 3 = 1.261" hb18 "Wir erhalten einen Wert der größer als 1 (die topologische Dimension der Kurve) ist." hb19 "Die Hausdorff-Besicovich-Dimension (1.261) ist größer als die topologische Dimension." hb20 "Gemäß dieser Definition ist die Schneeflockenkurve ein Fraktal." defe1 "Diese Definition ist jedoch nicht perfekt, da sie eine Menge Formen ausschließt, die auch Fraktale sind." defe2 "Aber sie zeigt eine der interessanten Eigenschaften von Fraktalen" defe3 "und sie ist sehr populär." defe4 "Die-Hausdorff-Besicovich Dimension wird auch \"fraktale Dimension\" genannt." ######################################################### #Datei: escape.xaf escape "Die Mathematik hinter Fraktalen Kapitel 2 - Fliehzeit-Fraktale" escape1 "Gewisse Fraktale (wie die Schneeflockenkurve) werden durch sich wiederholende Aufteilung erzeugt." escape2 "XaoS kann Fraktale erzeugen, die einer anderen Kategorie angehören und Fliehzeit-Fraktale genannt werden." escape3 "Die Methode diese zu erzeugen, unterscheidet sich von der im vorhergehenden Kapitel erläuterten, basiert aber auch auf der Iteration (Wiederholung)." escape4 "Betrachten wir den ganzen Bildschirm als eine komplexe Ebene." escape5 "Die reelle Achse ist horizontal orientiert." escape6 "Die imaginäre Achse ist vertikal orientiert." escape7 "Jeder Punkt hat sein eigenes Orbital," escape8 "dessen Laufbahn durch die iterative Formel f(z,c) beschrieben wird, wobei z der Position im Orbital entspricht, die der zu berechnenden voran geht, und c der Punkt ist, dem das Orbital angehört." escape9 "Die iterative Funktion für die Mandelbrotmenge lautet z=z^2+c." orbit1 "Um das Orbital, das dem Punkt 0 - 0.6i angehört, zu untersuchen," orbit2 "müssen wir diese komplexe Zahl c zuweisen." orbit3 "Das Orbital beginnt bei z = 0 + 0.6i" orbit3b "Wir werten die iterative Funktion wiederholt aus, und erhalten bei jeder Auswertung einen neuen Punkt im Orbital, den wir sogleich für die nächste Auswertung verwenden." orbit4 "Der Punkt gehört der Mandelbrotmenge an, falls das Orbital in der Endlichkeit bleibt." orbit5 "In unserem Beispiel ist dies der Fall..." orbit6 "Somit gehört dieser Punkt der Mandelbrotmenge an." orbit7 "In anderen Fällen verschwinden die Orbitale in der Unendlichkeit." orbit8 "Untersuchen wir zum Beispiel den Punkt 10 + 0i, erhalten wir nach der ersten Iteration 10, nach der zweiten 110, nach der dritten 12110, usw." orbit9 "Solche Punkte gehören nicht der Mandelbrotmenge an." bail1 "Bis jetzt sprechen wir immer noch von unendlich großen Zahlen." bail2 "Da Computer nur endliche Zahlen darstellen können, sind sie nicht in der Lage Fraktale exakt zu berechnen." bail3 "Es kann jedoch bewiesen werden, dass Orbitale, die einen Abstand von 2 vom Nullpunkt überschreiten, stets in der Unendlichkeit verschwinden." bail4 "Somit können die Berechnungen abgebrochen werden, sobald das Orbital einen Abstand von 2 vom Nullpunkt überschritten hat und damit den so genannten Bailout-Test nicht bestanden hat." bail5 "Für Punkte die nicht der Mandelbrotmenge angehören, benötigen wir jetzt nur noch eine endliche Anzahl Iterationen." bail6 "Auf diese Weise entstehen die farbigen Streifen um die Mandelbrotmenge." bail7 "Sie werden je nach Anzahl Iterationen eingefärbt, die notwendig sind, um einen Abstand von 2 vom Nullpunkt zu überschreitet." iter1 "Auch für Punkte die der Mandelbrotmenge angehören, sind unendlich viele Iterationen möglich." iter2 "Um die Berechnungen zu einem Ende zu bringen, wird nach einer vorgegebener Anzahl Iterationen abgebrochen und angenommen, dass der Punkt der Mandelbrotmenge angehört." iter3 "Die maximale Anzahl der Iterationen bestimmt die Genauigkeit der Annäherung." iter4 "Ohne Iterationen würde lediglich ein Kreis mit Radius 2 entstehen." iter5 "Je höher die maximale Anzahl Iterationen, um so exakter die Annäherung und um so mehr Zeit wird für die Berechnung benötigt." limit1 "XaoS verwendet standardmäßig 170 Iterationen." limit2 "In gewisse Bereiche können Sie weit hineinzoomen, ohne inexakte Resultate zu erhalten." limit3 "In anderen Bereichen erhalten Sie relativ schnell inexakte Resultate." limit4 "Die Bilder werden ziemlich langweilig, wenn dies geschieht." limit5 "Nach erhöhen der maximalen Anzahl Iterationen erhalten Sie neue, interessante Details." ofracts1 "Andere Fraktale in XaoS werden mit anderen Formeln und Bailout-Tests berechnet, die Methode bleibt aber grundsätzlich die selbe." ofracts2 "Es sind so viele Berechnungen notwendig, dass XaoS viele Optimierungen vornehmen muss. Mehr Informationen darüber finden Sie in der Dokumentation" ######################################################### # Datei: anim.xaf anim "Überblick: Features von XaoS Animations- und Positions-Dateien" ######################################################### # Datei: anim.xhf anim2 "Wie Sie wahrscheinlich gemerkt haben, kann XaoS aufgezeichnete Animationen und Tutorials wiedergeben." anim3 "Die Aufzeichnung erfolgt direkt in XaoS." languag1 "Animations- und Positionsdateien werden in einer einfachen Kommando- sprache gespeichert." languag2 "Positionsdateien enthalten eine Animation mit nur einem Teilbild." languag3 "Die Dateien sollten nachträglich von Hand bearbeitet werden, um das Ergebnis zu verbessern." languag4 "Die meisten Animationen in den Tutorials wurden komplett von Hand erstellt (ausgehend von einer Positionsdatei)." modif1 "Eine simple Änderung dieser vereinfachten Positionsdatei" modif2 "ergibt eine Kamerafahrt rückwärts." modif3 "Und diese Änderung eine Vorwärtsfahrt." newanim "Sie können auch komplett neue Animationen und Effekte erzeugen." examples "Viele Beispiele sind beigefügt, aus denen Sie mit dem Save/Load-Menü eine zufällige Auswahl treffen können." examples2 "Über die Positionsdateien können Sie auch Koordinaten mit anderen Programmen austauschen." examples3 "Die einzigen Beschränkungen sind Ihre Phantasie und die Kommandosprache, im Dokumentation beschrieben wird." ######################################################### # Datei: barnsley.xaf intro4 "Fraktale - Eine Einführung Kapitel 5 - Die Barnsley-Formel" barnsley1 "Eine weitere Formel, die von Michael Barnsley eingeführt wurde." barnsley2 "Sie erzeugt dieses seltsame Fraktal." barnsley3 "Es hat keine besonders interessanten Stellen -" barnsley4 "Aber ihre Juliamengen sind hübsch." barnsley5 "Es hat interessanterweise eine \"kristalline\" Struktur," barnsley6 "im Gegensatz zu den \"organischen\" Strukturen vieler anderer Fraktale." barnsley7 "Michael Barnsley hat auch andere Formeln eingeführt." barnsley8 "Eine davon erzeugt dieses Fraktal." ######################################################### # Datei: filter.xaf filter "Überblick: Features von XaoS Filter" ######################################################### # Datei: filter.xhf filter1 "Ein Filter ist ein Effekt, der auf jedes Teilbild angewendet wird, nachdem das Fraktal berechnet wurde." filter2 "XaoS besitzt folgende Filter:" # Fällt jemandem was Besseres ein? motblur "Motion Blur" edge "Zwei Kantenerkennungsfilter" edge2 "Der erste erzeugt breite Linien und eignet sich besonders für hohe Auflösungen." edge3 "Der zweite macht die Linien schmaler." star "Ein einfacher Sternenfilter" interlace "Der Halbbildfilter beschleunigt die Berechnung und erzeugt bei hoher Auflösung einen Bewegungseffekt." stereo "Stereogramm-Filter" stereo2 "Falls Sie in den nächsten Beispielen nichts sehen können, obwohl Sie Stereogramme schon kennen, ist wahr- scheinlich Ihre Bildschirmgröße falsch konfiguriert. \"XaoS-Hilfe\" gibt Ihnen weitere Informationen." emboss1 "Ein Prägeeffekt-Filter" palettef1 "Ein Palettenemulator macht es möglich, auch auf Truecolor-Bildschirmen eine Palettenrotation darzustellen." truecolorf "Ein Truecolor-Filter erlaubt es Ihnen, auch auf 8-Bit-Bildschirmen Echtfarb- Darstellungen zu erzeugen." ######################################################### # Datei: fractal.xaf end "Ende" fcopyright "Die Einführung in die Fraktale wurde im Juli 1997 von Jan Hubicka erstellt. Übersetzung von Jens Kilian." suggestions " Bitte schicken Sie alle Ideen, Vorschläge, Danksagungen, Flames und Bug-Reports an xaos-discuss@lists.sourceforge.net Danke." ######################################################### # Datei: incolor.xaf incolor1 "Normalerweise werden die Bildpunkte im Innern der berechneten Menge als einheitliche Farbe dargestellt." incolor2 "Dies macht die Ränder der Menge deutlich sichtbar, aber der Innenraum kann durch die Farbfläche recht langweilig werden." incolor3 "Um ihn etwas interessanter zu machen, kann der letzte Orbitwert benutzt werden, um die Farbe zu bestimmen." incolor4 "XaoS besitzt zehn verschiedene Methoden dafür, genannt \"Innere Färbungs Modi\"." zmag "zmag Die Farbe wird aus dem Betrag des letzten Orbits berechnet." ######################################################### # Datei: innew.xaf innew1 "decomposition like Arbeitet in derselben Weise wie die Farbzerlegung bei der Einfärbung der äußeren Bildpunkte." innew2 "real/imag Die Farbe errechnet sich aus dem Realteil des letzten Orbits, geteilt durch den Imaginärteil." innew3 "Die anderen 6 Modi sind meist zufällig gewählte oder aus dem Programm \"Flarium\" stammende Formeln." ######################################################### # Datei: intro.xaf fractal "...Fraktale..." fractal1 "Was ist ein Fraktal?" fractal2 "Die Definition von Benoit Mandelbrot: Ein Fraktal ist eine Menge, deren Hausdorff-Besicovich-Dimension ihre topologische Dimension übersteigt." fractal3 "Noch Fragen?" fractal4 "Egal. Diese Definition ist anfechtbar." fractal5 "In einfacheren Worten: Ein Fraktal ist eine Form," fractal6 "zusammengesetzt aus Einzelstücken," fractal7 "von denen jedes angenähert eine verkleinerte Kopie des Ganzen ist." fractal8 "Dieser Prozess, immer wieder angewendet," fractal9 "erzeugt das gesamte Fraktal." facts "Fraktale haben viele überraschende Eigenschaften." fact1 "Fraktale sind maßstabsunabhängig," fact2 "sie sind selbstähnlich," fact3 "und sie beschreiben Objekte, wie sie in der Natur vorkommen." fact4 "Zum Beispiel Wolken, Berge oder Küsten." fact5 "Es gibt auch viele mathematische Strukturen, die Fraktale sind." fact6 "Wie jene, die Sie auf dem Bildschirm sehen." fact7 "Die vielleicht bekannteste ist..." fmath4 "Die meisten Fraktale entstehen durch einen iterativen Prozess." fmath5 "So wird zum Beispiel das Fraktal, das unter dem Name Koch'sche Schneeflocken Kurve bekannt ist," fmath6 "durch iteratives Ändern einer Linie" fmath7 "in vier Linien erzeugt." fmath8 "Dies ist die erste Iteration des Prozesses." fmath9 "Nun wiederholen wir den Vorgang." fmath10 "Nach 2 Iterationen..." fmath11 "Nach 3 Iterationen..." fmath12 "Nach 4 Iterationen..." fmath13 "Und nach unendlicher Anzahl Iterationen erhalten wir ein Fraktal." fmath14 "Seine Form sieht aus wie ein Teil einer Schneeflocke." tree1 "Mit ähnlichen Methoden kann eine Vielzahl anderer Formen erzeugt werden." tree2 "Indem man eine Linie in anderer Weise ändert," tree3 "erhält man zum Beispiel einen Baum." nstr "Iterationen können auch zufällige Störungen in das Fraktal einbringen." nstr2 "Indem man eine Linie in zwei Linien ändert" nstr3 "und einen kleinen Fehler hinzufügt," nstr4 "kann man Fraktale erzeugen, die wie Küstenlinien aussehen." nstr5 "Ein ähnlicher Prozess könnte Wolken, Berge und viele andere natürliche Formen erzeugen." mset "Die Mandelbrotmenge." mset1 "Sie wird durch eine sehr einfache Formel erzeugt," mset2 "aber sie ist eines der schönsten Fraktale." mset3 "Weil die Mandelbrotmenge ein Fraktal ist," mset4 "enthalten ihre Randbereiche" mset5 "verkleinerte Kopien der Gesamtmenge." mset6 "Dies ist die größte davon, nur ungefähr 50 mal kleiner." mset7 "Weil die Mandelbrotmenge nicht strikt selbstähnlich ist," mset8 "sind alle diese Mini-Kopien verschieden." mset9 "Diese ist 76000 mal kleiner." mset10 "Kopien in anderen Bereichen der Menge weisen größere Unterschiede auf." nat "Aber die Randbereiche enthalten nicht nur Kopien der Gesamtmenge." nat1 "Sie enthalten auch unendliche Variationen verschiedener Ornamente." nat2 "Einige davon ähneln in überraschender Weise Formen, wie man sie in der Natur vorfindet." nat3 "Sie können dort Bäume," nat4 "Flüsse und Seen," nat5 "Galaxien" nat6 "und Wasserfälle finden." nat7 "Das Fraktal enthält auch Formen ohne jede Entsprechung." juliach "Fraktale - Eine Einführung Kapitel 2 - Julia" julia "Die Mandelbrotmenge ist nicht das einzige Fraktal, das durch die Formel z=z^2+c erzeugt wird." julia1 "Ebenfalls berühmt sind die" julia2 "Juliamengen." julia3 "Interessant an ihnen ist, dass es nicht nur eine einzige Juliamenge gibt," julia4 "sondern unendlich viele Variationen." julia5 "Sie alle unterscheiden sich nur im Startwert der Formel," julia6 "einem Punkt aus der Mandelbrotmenge." julia7 "Man kann die Mandelbrotmenge als Karte der Juliamengen betrachten." julia8 "Punkte im Innern der Menge entsprechen Juliamengen mit großen geschlossenen schwarzen Flächen." julia9 "Punkte außerhalb der Menge entsprechen nicht zusammenhängenden Juliamengen." julia10 "Die interessantesten Juliamengen gehören aber zu den Randpunkten." theme "Das Aussehen der Juliamenge hängt stark von dem ausgewählten Startpunkt ab." theme1 "Bei starker Vergrößerung erhält man ein sehr ähnlich aussehendes Fraktal," theme2 "nachdem man auf die Julia- Darstellung umschaltet." theme3 "Aber beim Herausfahren werden Sie sehen," theme4 "dass Sie sich in einem völlig anderen Fraktal befinden." theme5 "Juliamengen scheinen recht langweilig zu sein, weil sich ihr Aussehen nicht ändert," theme6 "sondern immer der ausgewählten Stelle aus der Mandelbrotmenge ähnlich sieht." theme7 "Aber durch sorgfältige Wahl des Anfangspunktes ergeben sich" theme8 "schöne Bilder." ######################################################### # Datei: keys.xhf keys "Tasten: S - Wiedergabe abbrechen Space - Bild überspringen (kann etwas dauern) Left/Right - Geschwindigkeit anpassen" ######################################################### # Datei: magnet.xaf intro7 "Fraktale - Eine Einführung Kapitel 8 - Magnet" magnet "Dies ist NICHT die Mandelbotmenge." magnet1 "Dieses Fraktal heißt \"Magnet\", weil seine Berechnungsformel aus der theoretischen Physik kommt." magnet2 "Es stammt aus der Erforschung theoretischer Gitterstrukturen auf dem Gebiet magnetischer Renormalisierungstransformationen." # Ey boah, ey! similiar "Seine Ähnlichkeit mit der Mandelbrotmenge ist interessant, weil dies eine Formel aus der realen Welt ist." magjulia "Seine Juliamenge sind recht ungewöhnlich." magnet3 "Es gibt auch noch ein zweites Magnet Fraktal." ######################################################### # Datei: new.xaf new "Was gibt's Neues in Version 3.0?" speed "1. Speedups" speed1 "Die Haupt-Berechnungsschleifen wurden entrollt und führen eine Periodizitätsprüfung durch." speed2 "Vollbilder werden durch Boundary-Tracing berechnet." speed3 "Dadurch ist die Vollbildberechnung jetzt erheblich schneller." speed4 "Zum Beispiel die Berechnung der Mandelbrotmenge mit 1.000.000 Iterationen..." speed5 "Berechnung läuft." speed6 "Fertig." speed7 "XaoS benutzt eine Heuristik und schaltet die Periodizitätsprüfung ab, wenn der berechnete Punkt vermutlich nicht ins Innere der Mandelbrotmenge fällt." speed8 "Auch die Zoom-Funktionen wurden beschleunigt, so dass sie jetzt ca. doppelt so schnell sind." speed9 "Auf einem 130MHz-Pentium erreicht XaoS jetzt 130FPS." new2 "2. Filter" new3 "3. Neun \"Äußere Färbungs Modi\"" new4 "4. Neue \"Innere Färbungs Modi\"" new5 "5. Truecolor-Modi" new6 "6. Speichern/Wiedergabe von Animationen" newend "Und viele andere Verbesserungen, z.B. Bildrotation und Palettenerzeugung. Die volle Liste steht im \"ChangeLog\"." ######################################################### # Datei: newton.xaf intro3 "Fraktale - Eine Einführung Kapitel 4 - Die Newton-Methode" newton "Dieses Fraktal wird auf eine völlig andere Weise berechnet -" newton1 "Newtonsche Approximation zum Auffinden der Wurzeln des Polynoms x^3=1." newton2 "Gezählt wird die Anzahl der Iterationen beim Auffinden der genäherten Wurzel." newton3 "Sie können die drei Wurzeln sehen (als blaue Kreise)." newton4 "Die interessantesten Stellen sind jene, an denen das Newton-Verfahren unsicher ist, welche der Wurzeln richtig ist." newton5 "Das Fraktal ist sehr selbstähnlich und nicht besonders interessant." newton6 "Aber XaoS kann \"Pseudo-Juliamengen\" dafür erzeugen." newton7 "Es benutzt dazu den Startwert als Fehler bei der Approximation." newton8 "Das macht das Fraktal interessanter." newton9 "XaoS kann auch noch ein anderes Newton Fraktal erzeugen." newton10 "Newtonsche Approximation zum Auffinden der Wurzeln des Polynoms x^4=1." newton11 "Auch hier können Sie die vier Wurzeln sehen (als blaue Kreise)." ######################################################### # Datei: octo.xaf intro6 "Fraktale - Eine Einführung Kapitel 7 - Octo" octo "Octo ist ein Fraktal, das durch eine weniger oft benutzte Formel erzeugt wird." octo1 "Wir haben es für XaoS wegen seiner ungewöhnlichen Form ausgewählt." octo2 "XaoS kann \"Pseudo-Juliamengen\" dafür erzeugen, ähnlich wie bei \"Newton\"." ######################################################### # Datei: outcolor.xaf outcolor "Äußere Färbungs Modi" outcolor1 "Die Mandelbrotmenge ist der langweilige schwarze Teich in der Bildschirmmitte." outcolor2 "Die farbigen Streifen rundherum sind die Randbereiche der Menge." outcolor3 "Normalerweise werden zum Einfärben die Iterationen gezählt, bis der Wert der Formel z^2+c einen Grenzwert erreicht." outcolor4 "Aber es gibt auch andere Methoden, die Menge zu visualisieren." outcolor5 "In XaoS heißen sie \"Äußere Färbungs Modi\"." iterreal "iter+real Berechnet die Farbe aus dem Realteil des letzten Orbits plus der Anzahl der Iterationen." iterreal1 "Sie können diesen Modus benutzen, um langweilige Bilder hübscher zu machen." iterimag "Der zweite Modus - iter+imag - ergibt ähnliche Resultate." iterimag2 "Der einzige Unterschied dabei ist, dass der Imaginärteil des Orbits verwendet wird." iprdi "iter+real/imag Berechnet die Farbe aus dem Quotienten von Real- und Imaginärteil des letzten Orbits plus der Anzahl der Iterationen." sum "iter+real+imag+real/imag Die Summe aller vorigen Modi." decomp "Binäre Zerlegung Wenn der Imaginärteil positiv ist, wird die Zahl der Iterationen benutzt, ansonsten die Differenz zwischen der maximalen und gemessenen Anzahl." bio "Biomorphs Dieser Modus heißt so, weil er einigen Fraktalen das Aussehen einzelliger Lebewesen verleiht." ######################################################### # Datei: outnew.xhf potential "Potential Dieser Modus sieht besonders gut in Truecolor-Darstellung bei wenig vergrößerten Bildern aus." cdecom "Farbzerlegung" cdecom2 "Die Farbe wird aus dem Winkel des letzten Orbits berechnet." cdecom3 "Die Farbzerlegung ähnelt der binären Zerlegung, aber interpoliert die Farben gleichmäßig." cdecom4 "Im Newton-Fraktal kann sie benutzt werden, um eine Einfärbung aufgrund der angenäherten Wurzel zu erzielen." smooth "Farbverlauf Der Farbverlaufsmodus versucht die durch die Iterationen verursachten Streifen aufzulösen und glatte Farbübergänge zu schaffen." smooth1 "Er funktioniert nicht bei den Fraktalen \"Newton\" und \"Magnet\", weil diese endliche Attraktoren besitzen." smooth2 "Er benötigt außerdem einen Truecolor-, Hi-Color- oder Real-Color-Modus. Bei 8bpp-Darstellung muss dazu der Truecolor-Filter eingeschaltet werden." ######################################################### # Datei: outnew.xhf intro5 "Fraktale - Eine Einführung Kapitel 6 - Phoenix" phoenix "Dies ist die Mandelbrotmenge der Formel namens \"Phoenix\"." phoenix1 "Sie sieht anders aus als die anderen Fraktale in XaoS, aber man kann einige Ähnlichkeiten zur Mandelbrotmenge darin finden." phoenix2 "Sie enthält ebenfalls eine \"Antenne\" mit Miniaturkopien der Gesamtmenge." phoenix3 "Es gibt auch thematische Zusammenhänge zwischen den Juliamengen und der Mandelbrot-Version." phoenix4 "Aber die Juliamengen sind sehr verschieden." ######################################################### # Datei: plane.xaf plane1 "Normalerweise wird der Realteil eines Bildpunktes auf die X-Achse des Bild- schirms abgebildet, der Imaginärteil auf die Y-Achse." plane2 "XaoS bietet 6 alternative Abbildungsebenen an." plane3 "1/mu Dies ist eine Inversion. Der unendlich ferne Punkt wird auf 0 abgebildet und umgekehrt. Auf diese Art können Sie feststellen, was mit dem Fraktal bei unendlichem Herauszoomen passiert." plane4 "Dies ist eine normal Mandelbrotmenge." plane5 "Diese ist invertiert." plane6 "Wie Sie sehen, war die Menge vorher in der Bildmitte, jetzt liegt sie am Rand. Das unendlich große blaue Gebiet rund um die Menge wurde auf einen kleinen Kreis um den Nullpunkt abgebildet." plane7 "Die nächsten Bilder werden alle jeweils normal und invertiert dargestellt, damit Sie sehen können, was passiert." plane8 "1/mu+0.25 Dieser Modus ähnelt der Inversion, aber mit einem verschobenen Zentrum." plane9 "Weil der Mittelpunkt jetzt auf dem Rand der Mandelbrotmenge liegt, können Sie unendlich große parabolische Strukturen sehen." plane10 "Bei anderen Fraktalen treten ebenfalls interessante Effekte auf, weil dieser Modus normalerweise die Symmetrien aufbricht." lambda "Eine völlig andere Darstellung ergibt die lambda-Ebene." ilambda "1/lambda Dies ist eine Kombination der Inversion mit der lambda-Ebene." imlambda "1/(lambda-1) Dies ist eine Kombination der Inversion mit einer Verschiebung in der lambda-Ebene." imlambda2 "Sie bewirkt eine sehr interessante Verformung der Mandelbrotmenge." mick "1/(mu-1.40115) Dies ist wiederum eine Inversion mit verschobenem Zentrum. Der Mittelpunkt ist nun der Feigenbaum-Punkt, an dem die Menge selbstähnlich ist. Details rund um diesen Punkt werden stark vergrößert." ######################################################### # Datei: power.xaf intro2 "Fraktale - Eine Einführung Kapitel 3 Mandelbrotmengen höherer Ordnung" power "z^2+c ist nicht die einzige Formel, die ein Fraktal erzeugt." power2 "Eine leicht veränderte Version - z^3+c - ergibt ein ähnliches Fraktal." power3 "Es enthält natürlich auch Kopien der Gesamtmenge." power4 "Ähnliche Fraktale können mit weiteren leicht veränderten Formeln erzeugt werden." pjulia "Jedes davon hat auch entsprechende Juliamengen." ######################################################### # Datei: truecolor.xaf truecolor "Truecolor-Modi" truecolor1 "Normalerweise werden die Fraktale mit Hilfe einer Palette eingefärbt. Bei Truecolor-Darstellung wird die Palette emuliert." truecolor2 "Der einzige Unterschied ist, dass die Palette größer ist und die Farbverläufe glatter sind." truecolor3 "Der Truecolor-Farbmodus arbeitet auf völlig andere Weise. Er benutzt verschiedene Parameter, die bei der Berechnung des Fraktals auftreten." truecolor4 "Er berechnet die Farben selbst, anstelle eine Palette zu benutzen." truecolor5 "Dies erlaubt, bis zu vier verschiedene Werte in einem Pixel darzustellen." truecolor6 "Der Truecolor-Farbmodus funktioniert natürlich nur in Truecolor-Darstellung. Auf einem 8-bit-Display müssen Sie also den Truecolor-Filter aktivieren." ######################################################### #for file pert.xaf #NEW (up to end of file) pert0 "Perturbation" pert1 "Der Anfangswert bei Darstellung einer Juliamenge erlaubt es, mit derselben Berechnungsformel verschiedene Juliamengen zu erzeugen." pert2 "Sie können für die Mandelbrotmenge durch Angabe eines Perturbationswertes einen ähnlichen Effekt erreichen." pert3 "Dieser Wert verändert den Ausgangspunkt für die Iteration (normal [0,0])." pert4 "Er verändert das Fraktal nicht so stark wie es der Startwert einer Juliamenge tut, aber er ist nützlich, wenn Sie das Fraktal etwas zufälliger machen wollen." ########################################################## #for file palette.xaf pal "Zufallspaletten" pal0 "XaoS hat keine große Bibliothek von vordefinierten Paletten (wie viele anderer Programme), sonder erzeugt zufällige Paletten." pal1 "Sie können solange die Taste 'P' drücken, bis XaoS eine Palette erzeugt, die Ihnen gefällt." pal2 "Drei verschiedene Algorithmen werden dafür benutzt." pal3 "Der erste erzeugt Übergänge von farbigen zu schwarzen Streifen." pal4 "Der zweite erzeugt Übergänge von schwarzen über farbige zu weißen Streifen." pal5 "Der letzte wurde von kubistischer Malerei inspiriert." ########################################################### #for file other.xaf auto1 "Autopilot" auto2 "Wenn Sie faul sind, können Sie den Autopiloten einschalten und XaoS das Fraktal automatisch erforschen lassen." fastjulia1 "Schneller Julia-Suchmodus" fastjulia2 "In diesem Modus können Sie den Anfangswert einer Juliamenge durch eine Animation finden." fastjulia3 "Er ist auch nützlich als eine Vorschau der Juliamenge, bevor Sie hineinzoomen. Wegen des thematischen Zusammenhangs zwischen Juliamenge und der Umgebung des gewählten Punktes können Sie das ungefähre Aussehen im Voraus bestimmen." rotation "Bildrotation" cycling "Palettenrotation" bailout "Fluchtradius" bailout1 "Das ist die Mandelbrotmenge unter Verwendung der äußeren Färbung Smooth." bailout2 "Vergrößert man den Fluchtradius auf 64, erhält man ausgeglichenere Farbübergänge." bailout3 "Bei den meisten Fraktaltypen ergeben sich bei verschiedenen Werten für den Fluchtradius ähnliche Fraktale." bailout4 "Dies gilt nicht für Barnsley Fraktale." ############################################## #for file trice.xaf trice1 "Triceratops und Katzenaugen Fraktale" trice2 "Wenn Sie den Fluchtradius" trice3 "eines Fliehzeit-Fraktals" trice4 "auf einen kleineren Wert ändern," trice5 "erhalten Sie ein anderes Fraktal." trice6 "Mit dieser Methode erhalten wir" trice7 "sehr interessante Muster" trice8 "mit separaten Gebieten einer Farbe." trice9 "Das Triceratops Fraktal" trice10 "wird auch mit dieser Methode erzeugt." trice11 "Viele ähnliche Bilder" trice12 "können mit Triceratops erzeugt werden." trice13 "Das Katzenaugen Fraktal" trice14 "sieht wie ein Katzenauge aus." trice15 "Wenn wie den Fluchtradius vergrößern..." trice16 "...erhalten wir ein interessanteres Fraktal..." trice17 "...mit Blasen..." trice18 "...und schönen Juliamengen." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar and Spider" fourfr2 "Das ist die Mandelbarmenge." fourfr3 "Ihre Formel ist: z = (conj(z))^2 + c" fourfr4 "Manche ihrer Juliamengen sind interessant." fourfr5 "Doch lasst uns jetzt andere Fraktale sehen." fourfr6 "Das Lambda Fraktal hat eine Struktur" fourfr7 "ähnlich dem Mandelbrot Fraktal." fourfr8 "Es ähnelt der Mandelbrotmenge in der Lambda Ebene." fourfr9 "Lambda ist eine Juliamenge, hier die Mandelbrotmenge." fourfr10 "...schneller Julia Modus..." fourfr11 "Das ist das Manowar Fraktal." fourfr12 "Es wurde von einem Fractint Benutzer gefunden." fourfr13 "Es hat Juliamengen, die ihm ähneln." fourfr14 "Dieses Fraktal heißt Spider." fourfr15 "Es wurde auch von einem Fractint Benutzer gefunden." fourfr16 "Es hat auch Juliamengen, die ihm ähneln." ############################################## #for file classic.xaf classic1 "Sierpinski Dichtung, S.Teppich, Koch'sche Schneeflocke" classic2 "Das ist das berühmte Sierpinski Dichtungs Fraktal." classic3 "Und das ist die Fliehzeit Variante davon." classic4 "Sie können seine Form ändern indem Sie" classic5 "einen anderen Julia Wert wählen" classic6 "Dieses Fraktal ist der Sierpinski Teppich." classic7 "Und das ist die Fliehzeit Variante davon." classic8 "Das ist ebenfalls berühmt." classic9 "Und das ist schließlich die Fliehzeit Variante" classic10 "der Koch'schen Schneeflocken." ############################################## #for file otherfr.xaf otherfr1 "Andere Fraktale in XaoS" ############################################## #for file new4.xaf new_4 "Was gibt's Neues in Version 4.0?" new_4_1 "Die Version 4.0 hat weniger neue Features als die vorherige Versionen. Im Fokus sind Fehlerbehebungen und der neue grafische Qt-Treiber, der für alle Betriebssysteme eine moderne Oberfläche anbietet." new_4_2 "Allerdings, einige neue Fraktaltypen können mithilfe der Iteration n angegeben werden." new_4_3 "Ein Beispiel ist die Formel z=z±1/z. Dies kann mit dem Input z+(1/z)*(-1)^n eingetippt werden." XaoS-release-4.3.2/catalogs/en.cat000066400000000000000000000716421455214672000167200ustar00rootroot00000000000000# Message catalog file required to replay XaoS tutorials in # English language # # Copyright (C) 1997 by Jan Hubicka # # Corrected by Tim Goowin # Further corrections by David Meleedy # And some more by Nix # # There are a few things you should know if you want to change or # translate this file. # # The format of this catalog is identifier[blanks]"value"[blanks] # # Identifier is a key used by the program. Do not translate it! Only # translate the value. If you want a quote character `"' in the text, # use `\"'. For `\' use `\\'. Don't use `\n' for enter; use a literal # newline. # # If you wish to translate this file into any new language, please let # me know. You should translate this text freely: you don't need to use # exactly the same sentences as here, if you have idea how to make text # more funny, interesting, or add some information, do it. # # You can use longer or shorter sentences, since XaoS will automatically # calculate time for each subtitle. # # Also, please let me have any suggestions for improving this text and # the tutorials. # ######################################################### #For file dimension.xaf fmath "The math behind fractals" fmath1 "Fractals are a very new field of math, so there are still lots of unsolved questions." fmath2 "Even the definitions are not clean" fmath3 "We usually call something a fractal if some self-similarity can be found" def1 "One of the possible definitions is..." #Definition from the intro.xaf is displayed here. #If it is a problem in your language catalog, let me #know and I will create a special key def2 "What does this mean?" def3 "To explain it we first need to understand what the topological and Hausdorff Besicovich dimensions are." topo1 "The topological dimension is the \"normal\" dimension." topo2 "A point has 0 dimensions" topo3 "A line has 1" topo4 "A surface has 2, etc..." hb1 "The definition of the Hausdorff Besicovich dimension comes from the simple fact that:" hb2 "A line that is zoomed so that it doubles in length is twice as long as it was." hb3 "On the other hand, the size of a square that is similarly zoomed grows by four times." hb4 "Similar rules work in higher dimensions too." hb5 "To calculate dimensions from this fact, you can use the following equation:" hb6 "dimension = log s / log z where z is the zoom change and s is the size change" hb7 "for a line with zoom 2, the size change is also 2. log 2 / log 2 = 1" hb8 "for a square with zoom 2, the size change is 4. log 4 / log 2 = 2" hb9 "So this definition gives the same results for normal shapes" hb10 "Things will become more interesting with fractals..." hb11 "Consider a snowflake curve" hb12 "which is created by repeatedly splitting a line into four lines." hb13 "The new lines are 1/3 the size of the original line" hb14 "After zooming 3 times, these lines will become exactly as big as the original lines." hb15 "Because of the self similarity created by the infinite repeating of this metamorphosis," hb15b "each of these parts will become an exact copy of the original fractal." hb16 "Because there are four such copies, the fractal size grows by 4X" hb17 "After putting these values in equations: log 4 / log 3 = 1.261" hb18 "We get a value greater than 1 (The topological dimension of the curve)" hb19 "The Hausdorff Besicovich dimension (1.261) is greater than the topological dimension." hb20 "According to this definition, the snowflake is a fractal." defe1 "This definition, however, is not perfect since it excludes lots of shapes which are fractals." defe2 "But it shows one of the interesting properties of fractals," defe3 "and it is quite popular." defe4 "The Hausdorff Besicovich dimension is also often called a \"fractal dimension\"" ######################################################### #For file escape.xaf escape "The math behind fractals chapter 2 - Escape time fractals" escape1 "Some fractals (like snowflake) are created by simple subdivision and repetition." escape2 "XaoS can generate a different category of fractals - called escape time fractals." escape3 "The method to generate them is somewhat different, but is also based on using iteration." escape4 "They treat the whole screen as a complex plane" escape5 "The real axis is placed horizontally" escape6 "and the imaginary is placed vertically" escape7 "Each point has its own orbit" escape8 "The trajectory of which is calculated using the iterative function, f(z,c) where z is the previous position and c is the new position on the screen." escape9 "For example in the Mandelbrot set, the iterative function is z=z^2+c" orbit1 "In case we want to examine point 0 - 0.6i" orbit2 "We assign this parameter to c" orbit3 "Iteration of the orbit starts at z=0+0i" orbit3b "Then we repeatedly calculate the iterative function, and we repeatedly get a new z value for the next iteration." orbit4 "We define the point that belongs to the set, in case the orbit stays finite." orbit5 "In this case it does..." orbit6 "So this point is inside the set." orbit7 "In other cases it would go quickly to infinity." orbit8 "(for example, the value 10+0i The first iteration is 110, the second 12110 etc..)" orbit9 "So such points are outside the set." bail1 "We are still speaking about infinite numbers and iterations of infinite numbers..." bail2 "But computers are finite, so they can't calculate fractals exactly." bail3 "It can be proved that in the case where the orbit's distance from zero is more than 2, the orbit always goes to inifinity." bail4 "So we can interrupt calculations after the orbit fails this test. (This is called the bailout test)" bail5 "In cases where we calculate points outside the set, we now need just a finite number of iterations." bail6 "This also creates the colorful stripes around the set." bail7 "They are colored according to the number of iterations of orbits needed to fall in the bailout set." iter1 "Inside the set we still need infinite numbers of calculations" iter2 "The only way to do it is to interrupt the calculations after a given number of iterations and use the approximate results" iter3 "The maximal number of iterations therefore specifies how exact the approximation will be." iter4 "Without any iterations you would create just a circle with a radius of 2 (because of the bailout condition)" iter5 "Greater numbers of iterations makes more exact approximations, but it takes much longer to calculate." limit1 "XaoS, by default, calculates 170 iterations." limit2 "In some areas you could zoom for a long time without reaching this limit." limit3 "In other areas you get inexact results quite soon." limit4 "Images get quite boring when this happens." limit5 "But after increasing the number of iterations, you will get lots of new and exciting details." ofracts1 "Other fractals in XaoS are calculated using different formulae and bailout tests, but the method is basically the same." ofracts2 "So many calculations are required that XaoS performs lots of optimizations. You might want to read about these in the documentation." ######################################################### #For file anim.xaf anim "XaoS features overview Animations and position files" ######################################################### #For file anim.xhf anim2 "As you have probably noticed, XaoS is able to replay animations and tutorials." anim3 "They can be recorded directly from XaoS," languag1 "since animations and position files are stored in a simple command language" languag2 "(position files are just one frame animations)." languag3 "Animations can be manually edited later to achieve more professional results." languag4 "Most animations in these tutorials were written completely manually, starting from just a position file." modif1 "A simple modification" modif2 "generates an \"unzoom\" movie," modif3 "and this modification, a \"zoom\" movie." newanim "You can also write completely new animations and effects." examples "XaoS also comes with many example files, that can be loaded randomly from the save / load menu." examples2 "You can also use position files to exchange coordinates with other programs." examples3 "The only limits are your imagination, and the command language described in the docs." ######################################################### #For file barnsley.xaf intro4 "An introduction to fractals Chapter 5-Barnsley's formula" barnsley1 "Another formula introduced by Michael Barnsley" barnsley2 "generates this strange fractal." barnsley3 "It is not very interesting to explore," barnsley4 "but it has beautiful Julias!" barnsley5 "It is interesting because it has a \"crystalline\" structure," barnsley6 "rather than the \"organic\" structure found in many other fractals." barnsley7 "Michael Barnsley has also introduced other formulas." barnsley8 "One of them generates this fractal." ######################################################### #For file filter.xaf filter "XaoS features overview filters" ######################################################### #For file filter.xhf filter1 "A filter is an effect applied to each frame after the fractal is calculated." filter2 "XaoS implements the following filters:" motblur "motion blur," edge "two edge detection filters," edge2 "(the first makes wide lines and is useful at high resolutions," edge3 "the second makes narrower lines)," star "a simple star-field filter," interlace "an interlace filter, (this speeds up calculations and gives the effect of motion blur at higher resolutions)," stereo "a random dot stereogram filter," stereo2 "(if you are unable to see anything in the next images and you can normally see random dot stereograms, you probably have the screen size incorrectly configured---use `xaos -help' for more information)," emboss1 "an emboss filter," #NEW palettef1 "a palette emulator filter, (enables color cycling on truecolor displays)" #NEW truecolorf "a true color filter, (creates true-color images on 8bpp displays)." ######################################################### #For file fractal.xaf end "The end." fcopyright "The introduction to fractals was done by Jan Hubicka in July 1997 and later modified and updated for new versions of XaoS Corrections by: Tim Goodwin and David Meleedy and Nix " # Add your copyright here if you are translating/correcting this file suggestions " Please visit xaos.sourceforge.net to download XaoS for yourself. Thank You" ######################################################### #For file incolor.xaf incolor1 "Usually, points inside the set are displayed using a single solid color." incolor2 "This makes the set boundaries very visible, but the areas inside the set are quite boring." incolor3 "To make it a bit more interesting, you can use the value of the last orbit to assign color to points inside the set." incolor4 "XaoS has ten different ways to do that. They are called \"in coloring modes\"." zmag "zmag Color is calculated from the magnitude of the last orbit." ######################################################### #For file innew.xaf innew1 "Decomposition like This works in same way as color decomposition in outside coloring modes " innew2 "Real / Imag Color is calculated from the real part of the last orbit divided by the imaginary part." innew3 "The next 6 coloring modes are formulas mostly chosen at random, or copied from other programs." ######################################################### #For file intro.xaf fractal "...Fractals..." fractal1 "What is a fractal?" fractal2 "Benoit Mandelbrot's definition: a fractal is a set for which the Hausdorff Besicovich dimension strictly exceeds the topological dimension." fractal3 "Still in the dark?" fractal4 "Don't worry. This definition is only important if you're a mathematician." fractal5 "In English, a fractal is a shape" fractal6 "that is built from pieces" fractal7 "each of which is approximately a reduced size copy of the whole fractal." fractal8 "This process repeats itself" fractal9 "to build the complete fractal." facts "There are many surprising facts about fractals:" fact1 "Fractals are independent of scale," fact2 "they are self similar," fact3 "and they often resemble objects found in the nature" #fact4 "such as clouds, mountains, #or coastlines." fact5 "There are also many mathematical structures that define fractals," fact6 "like the one you see on the screen." fmath4 "Most fractals are created by an iterative process" fmath5 "for example the fractal known as the von Koch curve" fmath6 "is created by changing one line" fmath7 "into four lines" fmath8 "This is the first iteration of the process" fmath9 "Then we repeat this change" fmath10 "after 2 iterations..." fmath11 "after 3 iterations..." fmath12 "after 4 iterations.." fmath13 "and after an infinite number of iterations we get a fractal." fmath14 "Its shape looks like one third of a snowflake." tree1 "Lots of other shapes could be constructed by similar methods." tree2 "For example by changing a line in a different way" tree3 "We can get a tree." nstr "Iterations can possibly introduce random noise into a fractal" nstr2 "By changing a line into two" nstr3 "lines and adding some small error" nstr4 "you can get fractals looking like a coastline." nstr5 "A similar process could create clouds, mountains, and lots of other shapes from nature" ####################################################### ## mset.xaf fact7 "Undoubtedly the most famous fractal is.." mset "The Mandelbrot Set" mset1 "It is generated from a very simple formula," mset2 "but it is one of the most beautiful fractals." mset3 "Since the Mandelbrot set is a fractal," mset4 "its boundaries contain" mset5 "miniature copies of the whole set." mset6 "This is the largest one, about 50 times smaller than the entire set." mset7 "The Mandelbrot set is not completely self similar," mset8 "so each miniature copy is different." mset9 "This one is about 76,000 times smaller than the whole." mset10 "Copies in different parts of the set differ more." nat "The boundaries don't just contain copies of the whole set," nat1 "but a truly infinite variety of different shapes." nat2 "Some of them are surprisingly similar to those found in nature:" nat3 "you can see trees," nat4 "rivers with lakes," nat5 "galaxies," nat6 "and waterfalls." nat7 "The Mandelbrot set also contains many completely novel shapes." ############################################################################### ############ juliach "An introduction to fractals Chapter 2-Julia" julia "The Mandelbrot set is not the only fractal generated by the formula: z=z^2+c" julia1 "The other is..." julia2 "the Julia set" julia3 "There is not just one Julia set," julia4 "but an infinite variety of them." julia5 "Each is constructed from a \"seed\"," julia6 "which is a point selected from the Mandelbrot set." julia7 "The Mandelbrot set can be seen as a map of various Julia sets." julia8 "Points inside the Mandelbrot set correspond to Julias with large connected black areas," julia9 "whereas points outside the Mandelbrot set correspond to disconnected Julias." julia10 "The most interesting Julias have their seed just at the boundaries of the Mandelbrot set." theme "The theme of a Julia set also depends heavily on the seed point you choose." theme1 "When you zoom in to the Mandelbrot set, you will get a very thematically similar fractal" theme2 "when switching to the corresponding Julia." theme3 "But zoom out again, and you discover" theme4 "that you are in a completely different fractal." theme5 "Julia sets may seem to be quite boring since they don't change themes" theme6 "and remain faithful to the seed chosen from the Mandelbrot set." theme7 "But by carefully choosing the seed point you can generate" theme8 "beautiful images." ######################################################### #For file keys.xhf keys "Keys: S - stop replay Space - skip frame (can take a while) Left/Right - adjust speed of subtitles" ######################################################### #For file magnet.xaf intro7 "An introduction to fractals Chapter 8-Magnet" magnet "This is NOT the Mandelbrot set." magnet1 "This fractal is called \"magnet\" since its formula comes from theoretical physics." magnet2 "It is derived from the study of theoretical lattices in the context of magnetic renormalization transformations." similiar "Its similarity to the Mandelbrot set is interesting since this is a real world formula." magjulia "Its julia sets are quite unusual." magnet3 "There is also a second magnet fractal." ######################################################### #For file new.xaf new "What's new in version 3.0?" speed "1. Speedups" speed1 "The main calculation loops are now unrolled and do periodicity checking." speed2 "New images are calculated using boundary detection," speed3 "so calculating new images is now much faster." speed4 "For example, calculation of the Mandelbrot set at 1,000,000 iterations..." speed5 "calculating..." speed6 "finished." speed7 "XaoS has a heuristic that automatically disables periodicity checking when it doesn't expect the calculated point to be inside the set (when all surrounding points aren't)." speed8 "Also the main zooming routines have been optimized so zooming is approximately twice as fast." speed9 "XaoS now reaches 130FPS on my 130Mhz Pentium." new2 "2. Filters." new3 "3. Nine out-coloring modes." new4 "4. New in-coloring modes." new5 "5. True-color coloring modes." new6 "6. Animation save/replay." newend "And many other enhancements, such as image rotation, better palette generation... See the ChangeLog for a complete list of changes." #NEW ######################################################### #For file newton.xaf intro3 "An introduction to fractals Chapter 4-Newton's method" newton "This fractal is generated by a completely different formula:" newton1 "Newton's numerical method for finding the roots of a polynomial x^3=1." newton2 "It counts the number of iterations required to get the approximate root." newton3 "You can see the three roots as blue circles." newton4 "The most interesting parts are in places where the starting point is almost equidistant from two or three roots." newton5 "This fractal is very self similar and not very interesting to explore." newton6 "But XaoS is able to generate \"Julia-like\" sets," newton7 "where it uses the error in the approximation as the seed." newton8 "This makes the Newton fractal more interesting." newton9 "XaoS can also generate an other Newton fractal." newton10 "Newton's numerical method for finding the roots of a polynomial x^4=1." newton11 "You can see the four roots as blue circles." ######################################################### #For file octo.xaf intro6 "An introduction to fractals Chapter 7-Octo" octo "Octo is a less well known fractal." octo1 "We've chosen it for XaoS because of its unusual shape." octo2 "XaoS is also able to generate \"Julia-like\" sets, similar to those in the Newton set." ######################################################### #For file outcolor.xaf outcolor "Out coloring modes" outcolor1 "The Mandelbrot set is just the boring black lake in the middle of screen" outcolor2 "The colorful stripes around it are the boundaries of the set." outcolor3 "Normally the coloring is based on the number of iterations required to reach the bail-out value." outcolor4 "But there are other ways to do the coloring." outcolor5 "XaoS calls them out-coloring modes." iterreal "iter+real This mode colors the boundaries by adding the real part of the last orbit to the number of iterations." iterreal1 "You can use it to make quite boring images more interesting." iterimag "iter+imag is similar to iter+real." iterimag2 "The only difference is that it uses the imaginary part of the last orbit." iprdi "iter+real/imag This mode colors the boundaries by adding the number of iterations to the real part of the last orbit divided by the imaginary part." sum "iter+real+imag+real/imag is the sum of all the previous coloring modes." decomp "binary decomposition When the imaginary part is greater than zero, this mode uses the number of iterations; otherwise it uses the maximal number of iterations minus the number of iterations of binary decomposition." bio "biomorphs This coloring mode is so called since it makes some fractals look like one celled animals." ######################################################### #For file outnew.xhf potential "potential This coloring mode looks very good in true-color for unzoomed images." cdecom "color decomposition" cdecom2 "In this mode, the color is calculated from the angle of the last orbit." cdecom3 "It is similar to binary decomposition but interpolates colors smoothly." cdecom4 "For the Newton type, it can be used to color the set based on which root is found, rather than the number of iterations." smooth "smooth Smooth coloring mode tries to remove stripes caused by iterations and make smooth gradations." smooth1 "It does not work for the Newton set and magnet formulae since they have finite attractors." smooth2 "And it only works for true color and high color display modes. So if you have 8bpp, you will need to enable the true color filter." ######################################################### #For file outnew.xhf intro5 "An introduction to fractals Chapter 6-Phoenix" phoenix "This is the Mandelbrot set for a formula known as Phoenix." phoenix1 "It looks different than the other fractals in XaoS, but some similarity to the Mandelbrot set can be found:" phoenix2 "the Phoenix set also contains a \"tail\" with miniature copies of the whole set," phoenix3 "there is still a correspondence of \"theme\" between the Mandelbrot version and the Julias," phoenix4 "but the Julias are very different." ######################################################### #For file plane.xaf plane1 "Usually, the real part of a point in the complex plane is mapped to the x coordinate on the screen; the imaginary part is mapped to the y coordinate." plane2 "XaoS provides 6 alternative mapping modes" plane3 "1/mu This is an inversion - areas from infinity come to 0 and 0 is mapped to infinity. This lets you see what happens to a fractal when it is infinitely unzoomed." plane4 "This is a normal Mandelbrot..." plane5 "and this is an inverted one." plane6 "As you can see, the set was in the center and now it is all around. The infinitely large blue area around the set is mapped into the small circle around 0." plane7 "The next few images will be shown in normal, and then inverted mode to let you see what happens" plane8 "1/mu+0.25 This is another inverted mode, but with a different center of inversion. " plane9 "Since the center of inversion lies at the boundary of Mandelbrot set, you can now see infinite parabolic boundaries." plane10 "It has an interesting effect on other fractals too, since it usually breaks their symmetry." lambda "The lambda plane provides a completely different view." ilambda "1/lambda This is a combination of inversion and the lambda plane." imlambda "1/(lambda-1) This is combination of lambda, move, and inversion." imlambda2 "It gives a very interesting deformation of the Mandelbrot set." mick "1/(mu-1.40115) This again, is inversion with a moved center. The center is now placed into Feigenbaum points - points where the Mandelbrot set is self similar. This highly magnifies the details around this point." ######################################################### #For file power.xaf intro2 "An introduction to fractals Chapter 3-Higher power Mandelbrot sets" power "z^2+c is not the only formula that generates fractals." power2 "Just a slightly modified one: x^3+c generates a similar fractal." power3 "And it is, of course, also full of copies of the main set." power4 "Similar fractals can be generated by slightly modified formulae" pjulia "and each has a corresponding series of Julia sets too." ######################################################### #For file truecolor.xaf truecolor "True-color coloring modes" truecolor1 "Usually fractals are colored using a palette. In true-color mode, the palette is emulated." truecolor2 "The only difference is that the palette is bigger and colors are smoothly interpolated in coloring modes." truecolor3 "True-color coloring mode uses a completely different technique. It uses various parameters from the calculation" truecolor4 "to generate an exact color - not just an index into the palette." truecolor5 "This makes it possible to display up to four values in each pixel." truecolor6 "True color coloring mode of course requires true color. So on 8bpp displays, you need to enable the true-color filter." ######################################################### #for file pert.xaf #NEW (up to end of file) pert0 "Perturbation" pert1 "Just as the Julia formula uses different seeds to generate various Julias from one formula," pert2 "you can change the perturbation value for the Mandelbrot sets." pert3 "It changes the starting position of the orbit from the default value of 0." pert4 "Its value doesn't affect the resulting fractal as much as the seed does for the Julias, but it is useful when you want to make a fractal more random." ########################################################## #for file palette.xaf pal "Random palettes" pal0 "XaoS doesn't come with large library of predefined palettes like many other programs, but generates random palettes." pal1 "So you can simply keep pressing 'P' until XaoS generates a palette that you like for your fractal." pal2 "Three different algorithms are used:" pal3 "The first makes stripes going from some color to black." pal4 "The second makes stripes from black to some color to white." pal5 "The third is inspired by cubist paintings." ########################################################### #for file other.xaf auto1 "Autopilot" auto2 "If you are lazy, you can enable autopilot to let XaoS explore a fractal automatically." fastjulia1 "Fast Julia browsing mode" fastjulia2 "This mode lets you morph the Julia set according to the current seed." fastjulia3 "It is also useful as a preview of an area before you zoom in - because of the thematic correspondence between the Julia and the point you choose, you can see the approximate theme around a point before you zoom in." rotation "Image rotation" cycling "Color cycling" bailout "Bailout" bailout1 "That's the Mandelbrot set with an outcoloring mode 'smooth.'" bailout2 "By increasing bailout to 64, you get more balanced color transitions." bailout3 "For most fractal types different bailout values result in similar fractals." bailout4 "That's not true for Barnsley fractals." ############################################## #for file trice.xaf trice1 "Triceratops and Catseye fractals" trice2 "If you change the bailout value" trice3 "of an escape-time fractal" trice4 "to a smaller value," trice5 "you will get an other fractal." trice6 "With this method we can get" trice7 "very interesting patterns" trice8 "with separate areas of one color." trice9 "The Triceratops fractal" trice10 "is also made with this method." trice11 "Many similar pictures can be" trice12 "made of Triceratops." trice13 "The Catseye fractal" trice14 "is like an eye of a cat." trice15 "But if we raise the bailout value..." trice16 "...we get a more interesting fractal..." trice17 "...with bubbles..." trice18 "...and beautiful Julias." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar and Spider" fourfr2 "This is the Mandelbar set." fourfr3 "It's formula is: z = (conj(z))^2 + c" fourfr4 "Some of its Julias are interesting." fourfr5 "But let's see other fractals now." fourfr6 "The Lambda fractal has a structure" fourfr7 "similar to Mandelbrot's." fourfr8 "It's like the Mandelbrot set on the lambda plane." fourfr9 "But Lambda is a Julia set, here is MandelLambda." fourfr10 "...fast Julia mode..." fourfr11 "This is the fractal Manowar." fourfr12 "It was found by a user of Fractint." fourfr13 "It has Julias similar to the whole set." fourfr14 "This fractal is called Spider." fourfr15 "It was found by a user of Fractint, too." fourfr16 "And it has Julias similar to the whole set, too." ############################################## #for file classic.xaf classic1 "Sierpinski Gasket, S.Carpet, Koch Snowflake" classic2 "This is the famous Sierpinski Gasket fractal." classic3 "And this is the escape-time variant of it." classic4 "You can change its shape by selecting" classic5 "another 'Julia seed'" classic6 "This fractal is the Sierpinski Carpet." classic7 "And here is its escape-time variant." classic8 "This is famous, too." classic9 "And finally, this is the escape-time variant" classic10 "of the Koch Snowflake." ############################################## #for file otherfr.xaf otherfr1 "Other fractal types in XaoS" ############################################## #For file new4.xaf new_4 "What's new in version 4.0?" new_4_1 "XaoS version 4.0 does not have so many new features like the previous releases. It focuses mainly on bug fixing and introduction of the Qt driver that provides a modern look on all platforms." new_4_2 "Nevertheless, some new types of formulas can be created by inserting the current iteration number n in the user formula." new_4_3 "One example is the formula z=z±1/z. It can be entered by typing z+(1/z)*(-1)^n." XaoS-release-4.3.2/catalogs/es.cat000066400000000000000000000731061455214672000167220ustar00rootroot00000000000000# Archivo de mensajes requeridos para reproducir los tutoriales # de XaoS en Castellano. # # Copyright (C) 1997 by Jan Hubicka # # Hay algunas pocas cosas que deberías saber si quieres cambiar # o traducir este fichero. # # El formato de este catálogo es identificador[espacios en blanco] # "valor"[espacios en blanco] # # Identifiador es una clave usada por el programa. No la traduzcas. # Traduce sólo el campo valor. Si quires entrecomillar un caracter # '"'en el texto, usa '\". Para '\' pon '\\'. No uses '\n'para enter; # usa el literal nueva_linea. # # Si quieres traducir este archivo a otro idioma, por favor, hazmelo # saber. Debes traducirlo libremente: no es necesario usar exactamente # las mismas frases que aquí, si tienes alguna idea para hacerlo # más divertido, interesante o añadir alguna información, hazlo. # # Puedes usar frases más cortas o más largas, ya que, XaoS calculará # automáticamente el tiempo para cada subtitulo. # # Hazme saber, tambie'n, cualquier sugerencia para mejorar el texto y los # tutoriales. # ######################################################### #For file dimension.xaf fmath "La matemática detrás de los fractales" fmath1 "Los Fractales son un campo muy nuevo de las matemáticas, así que aún existen muchas preguntas sin resolver." fmath2 "Incluso las definiciones no están claras." fmath3 "Usualmente llamamos a algo fractal, si muestra alguna auto-similitud" def1 "Una de las posibles definiciones es..." #Definition from the intro.xaf is displayed here. #If it is a problem in your language catalog, let me #know and I will create a special key def2 "Qué significa esto?" def3 "Para explicarlo, primero necesitamos entender qué son las dimensiones topológicas y de Hausdorff Besicovich." topo1 "La dimensión topológica es la dimensión \"normal\"." topo2 "Un punto tiene 0 dimensiones" topo3 "Una línea tiene una dimensión" topo4 "Una superfície tiene dos, etc..." hb1 "La definición de la dimensión Hausdorff Besicovich proviene de este simple hecho:" hb2 "El lado de una línea ampliada dos veces (zoom) crece también a lo más dos veces." hb3 "Por otro lado, el tamaño de un cuadrado crece cuatro veces como mucho" hb4 "Reglas similares funcionan para mayores dimensiones también." hb5 "Para calcular las dimensiones para este hecho, debes usar la siguiente ecuación:" hb6 "dimensión = log s / log z donde 'z' es el cambio de zoom y 's' es el cambio del tamaño" hb7 "para una línea con zoom 2, el tamaño del cambio también es 2. log 2 / log 2 = 1" hb8 "para un cuadrado con zoom 2, el tamaño del cambio es 4. log 4 / log 2 = 2" hb9 "Así, esta definición da los mismos resultados para formas normales" hb10 "Las cosas se tornan más interesantes con los fractales..." hb11 "Considera una curva de un copo de nieve" hb12 "Que se crea cambiando repetidamente una línea por cuatro líneas." hb13 "Las nuevas líneas son 1/3 del tamaño de la línea original" hb14 "Después de acercar (zoom) 3 veces, estas líneas serán exactamente del mismo tamaño que las líneas originales." hb15 "Esto ocurre por la auto-similitud creada por la repetición infinita de esta metamorfosis," hb15b "cada una de estas partes se convierte en una copia exacta del fractal original." hb16 "El tamaño del fractal crece 4 veces porque hay cuatro copias del mismo." hb17 "Después de colocar estos valores en las ecuaciones: log 4 / log 3 = 1.261" hb18 "Obtenemos un valor mayor que uno! (La dimensión topológica de la curva)" hb19 "La dimensión Hausdorff Besicovich (1.261) es mayor que la dimensión topológica." hb20 "De acuerdo con esta definición, se concluye que nuestro copo de nieve es un fractal." defe1 "Esta definición, sin embargo, no es perfecta ya que excluye muchas figuras que son fractales." defe2 "Pero demuestra una de las propiedades interesantes de los fractales," defe3 "y que es muy popular." defe4 "La dimensión Hausdorff Besicovich también se conoce como la \"dimensión fractal\"." ######################################################### #For file escape.xaf escape "La matemática detrás de los fractales Capítulo 2 - Escape time fractals" escape1 "Algunos fractales (como el copo de nieve) son creados de una manera simple." escape2 "XaoS puede generar una categoría distinta de fractales, llamada \"Fractales fuera de tiempo\" (Escape Time Fractals)." escape3 "El método para generarlos es un poco diferente, pero también está basado en el uso de la iteración." escape4 "Se toma la pantalla completa como el plano complejo" escape5 "El eje real es colocado horizontalmente" escape6 "y el eje imaginario es colocado verticalmente." escape7 "Cada punto tiene su propia órbita." escape8 "La trayectoria sobre la que se calcula utilizando la función iterativa, f(z,c) donde z es la posición previa y c es la nueva posición en la pantalla." escape9 "Por ejemplo, en el conjunto Mandelbrot, la función iterativa es z=z^2+c" orbit1 "En caso de que queramos examinar el punto 0 - 0.6i," orbit2 "asignamos este parámetro a c" orbit3 "la iteración de la órbita comienza en z= 0 + 0i" orbit3b "Luego, repetidamente calculamos la función iterativa, y repetidamente obtenemos un nuevo valor para z para la siguiente iteración." orbit4 "Revisamos si el punto que pertenece al conjunto, es decir, si la órbita permanece finita." orbit5 "En este caso, sí lo está..." orbit6 "Así que el punto está dentro del conjunto." orbit7 "En otros casos, irá rápidamente hacia el infinito." orbit8 "(por ejemplo, el valor 10+0i cuya primera iteración es 110, la segunda es 12110, etc...)" orbit9 "Así que estos puntos están fuera del conjunto." bail1 "Aún estamos hablando de números infinitos y de iteraciones de números infinitos..." bail2 "... pero los computadores son finitos, así que no pueden calcular fractales de forma exacta." bail3 "Se puede probar que, en caso de que la distancia de la órbita desde cero es mayor que 2, siempre se irá al infinito." bail4 "Entonces podemos interrumpir los cálculos para órbitas que fallan este test. (Esto se conoce como el test de borde)" bail5 "En los casos de estar calculando puntos que están fuera del conjunto, necesitamos sólo un cantidad finita de iteraciones." bail6 "Esto es lo que crea las líneas coloridas alrededor del conjunto." bail7 "Son coloreadas de acuerdo con el número de iteraciones que necesita la órbita para fallar el test de borde." iter1 "Dentro del conjunto aún necesitamos una cantidad infinita de cálculos" iter2 "La única forma de hacerlo, es interrumpiendo los cálculos después de una cantidad determinada de iteraciones y utilizar los resultados aproximados." iter3 "El máximo de iteraciones, por lo tanto determina qué tan exacto la aproximación será." iter4 "Sin iteraciones, crearías sólo un círculo con radio 2 (por la condición de borde)" iter5 "Mayor cantidad de iteraciones logran aproximaciones más exactas, pero toma más tiempo calcularlas." limit1 "XaoS, por defecto, calcula 170 iteraciones." limit2 "En algunas áreas puedes hacer zoom durante bastante tiempo sin encontrar este límite." limit3 "En otras áreas obtienes resultados inexactos muy rápidamente." limit4 "Las imágenes se vuelven muy aburridas cuando esto sucede." limit5 "Pero después de aumentar el número de iteraciones, obtienes muchos detallles nuevos e interesantes." ofracts1 "Otros fractales en XaoS son calculados usando diferentes formulas y pruebas de borde, pero el método es básicamente el mismo." ofracts2 "Se requiere mucho cálculo para que XaoS realice muchas optimizaciones. Puedes leer más sobre esto, en la documentación." ######################################################### #Para el fichero anim.xaf anim "Características de XaoS Ficheros de posición y animaciones" ######################################################### #Para el fichero anim.xhf anim2 "Como probablemente has notado, XaoS es capaz de repetir animaciones y tutoriales." anim3 "Deben ser grabados directamente desde Xaos," languag1 "ya que, los ficheros de posición y animación son guardados en un simple lenguaje de comandos" languag2 "(los ficheros de posición son animaciones de un sólo frame)." languag3 "Las animaciones pueden ser editadas a mano posteriormente para conseguir unos resultados más profesionales." languag4 "Casi todas las animaciones de estos tutoriales han sido escritas completamente a mano a partir de un archivo de posición." modif1 "Una simple modificación" modif2 "genera una película que retrocede," modif3 "y este modificación una que se acerca." newanim "También puedes escribir nuevas animaciones y efectos" examples "XaoS también tiene muchos ficheros de ejemplo, que pueden ser cargados aleatoriamente desde el menú salvar / guardar." examples2 "También puedes usar los ficheros de posición para cambiar coordenadas con otros programas." examples3 "Los únicos límites son tu imaginación y el lenguage de comandos descrito en la documentación." ######################################################### #Para el fichero barnsley.xaf intro4 "Una introducción a los fractales Capítulo 5 - Fórmula de Barnsley" barnsley1 "Otra fórmula de Michael Barnsley" barnsley2 "genera un estraño fractal." barnsley3 "No es muy interesante para explorar," barnsley4 "pero tiene maravillosos julias" barnsley5 "Es interesante por su estructura cristalina," barnsley6 "Mejor que la estructura orgánica encontrada en otros muchos fractales." ######################################################### #Para el fichero filter.xaf filter "Características de XaoS filtros" ######################################################### #Para el fichero filter.xhf filter1 "Filtro es un efecto que se aplica a cada frame tras el cálculo del fractal." filter2 "XaoS implementa los siguientes filtros:" motblur "motion blur," edge "2 filtros detectores de bordes" edge2 "(el primero hace líneas gruesas y es útil a resoluciones altas, ..." edge3 " ... el segundo hace líneas más delgadas);" star "filtro star-field," interlace "filtro de entrelazado (aumenta la velocidad y brinda un efecto similar al motion blur en resoluciones altas);" stereo "filtro RDS (genera estereogramas)" stereo2 "(si no puedes ver nada en las siguientes imagenes y sueles ser capaz de ver estereogramas, probablemente tengas un tamaño de pantalla mal configurado--pon 'xaos -help'para más información), -help' for more information)," emboss1 "filtro emboss (de repujado)" #NEW palettef1 "filtro que emula la paleta (permite rotación del color en dispositivos truecolor)" #NEW truecolorf "filtro true color (permite generar imagenes true color en dispositivos de 8bpp)." ######################################################### #Para el fichero fractal.xaf end "Fin" fcopyright "La introducción a los fractales fue hecha por Jan Hubicka en Julio 1997 # Add your copyright here if you are translating/correcting this file Y traducido al castellano por: César Pérez cpt2@geocities.com suggestions Por favor envía tus ideas, sugerencias, agradecimientos, reproches e informes de errores a xaos-discuss@lists.sourceforge.net Gracias." ######################################################### #Para el fichero incolor.xaf incolor1 "Normalmente, los puntos dentro del conjunto se ponen usando un único color solido." incolor2 "Esto hace los límites del conjunto muy visibles, pero las áreas dentro del conjunto son muy aburridas." incolor3 "Para hacerlas un poco más interesantes, puedes usar el valor de la última orbita para asignar el color de los puntos dentro del conjunto." incolor4 "XaoS tiene diez formas diferentes de hacerlo. Se denominan \"in coloring modes\"." zmag "zmag El color se calcula a traves de la magnitud de la última órbita." ######################################################### #Para el fichero innew.xaf innew1 "Parecido a decomposition Este modo funciona como la descomposición del color en los modos outside coloring" innew2 "Real / Imag El color es calculado a partir de la parte real de la última órbita dividido por la parte imaginaria." innew3 "Los 6 siguientes modos son fórmulas elegidas aleatoriamente, o copiadas de otros programas." ######################################################### #Para el fichero intro.xaf fractal "...Fractales..." fractal1 "¿Qué es un fractal?" fractal2 "Definición de Benoit Mandelbrot: un fractal es un conjunto en el que su dimensión Hausdorff Besicovich excede extrictamente la dimensión topológica." fractal3 "¿Todavía en tinieblas?" fractal4 "No te preocupes. Esta definición sólo es importante si eres un matemático." fractal5 "Un fractal es, simplemente, una figura" fractal6 "que es construida a partir de piezas" fractal7 "cada una de las cuales es aproximadamente una copia reducida del fractal completo." fractal8 "Este proceso se repite" fractal9 "hasta completar el fractal." facts "Hay muchos hechos sorprendentes sobre los fractales:" fact1 "son independientes de la escala," fact2 "son autosimilares," fact3 "y recuerdan objetos encontrados en la naturaleza" fact4 "como nubes, montañas, o costas." fact5 "Hay muchas estructuras matemáticas que son fractales," fact6 "como el que ves en la pantalla." fmath4 "Muchos fractales son creados por un proceso iterativo" fmath5 "por ejemplo: el fractal conocido como la \"curva de von Koch\"." fmath6 "es creada dividiendo una línea" fmath7 "hasta obtener 4 líneas." fmath8 "Esta es la primera iteración del proceso." fmath9 "Luego repetimos este cambio" fmath10 "luego de 2 iteraciones..." fmath11 "... de 3 iteraciones..." fmath12 "luego de 4 iteraciones..." fmath13 "y luego de una cantidad infinita de iteraciones, obtenemos un fractal." fmath14 "Su forma se parece a la tercera parte de un copo de nieve." tree1 "Muchas otras figuras pueden ser construídas por métodos similares." tree2 "Por ejemplo, cambiando una línea de manera distinta" tree3 "Obtenemos un árbol." nstr "Las iteraciones pueden ser introducir posiblemente algo de ruido aletario en un fractal" nstr2 "dividiendo una línea en dos líneas" nstr3 "y agregando un poco de error" nstr4 "puedes obtener fractales que se parezcan a una costa de playa." nstr5 "Un proceso similar podría crear nubes, montañas, y muchas otras formas de la naturaleza." ####################################################### ## mset.xaf fact7 "Sin lugar a dudas el fractal más famoso es..." mset "El conjunto Mandelbrot" mset1 "Es generado por una fórmula muy simple," mset2 "pero es uno de los fractales más hermosos." mset3 "Puesto que el conjunto Mandelbrot es un fractal," mset4 "sus límites contienen" mset5 "pequeñas copias del conjunto completo." mset6 "Esta es la más grande, aprox. 50 veces más pequeña que el conjunto original." mset7 "El conjunto Mandelbrot no es completamente autosimilar," mset8 "luego cada copia pequeña es diferente." mset9 "Este es 76000 veces más pequeño que el completo." mset10 "Otras copias en las distintas partes del conjunto difieren más." nat "Los límites no sólo contienen copias del conjunto," nat1 "sino una verdadera variedad de figuras diferentes." nat2 "Algunas de ellas son sorprendentemente similares a aquellas encontradas en la naturaleza:" nat3 "puedes ver árboles," nat4 "rios con lagos," nat5 "galaxias," nat6 "y cascadas." nat7 "El conjunto Mandelbrot también contiene figuras completamente nuevas." ############################################################################### ############ juliach "Una introducción a los fractales Capítulo 2 - Conjuntos Julia" julia "El conjunto Mandelbrot no es el único fractal generado por la fórmula z=z^2+c." julia1 "El otro es..." julia2 "el conjunto Julia" julia3 "No hay un único conjunto Julia," julia4 "sino una variedad infinita de ellos." julia5 "Cada uno es construido a partir de una \"semilla\"," julia6 "que es un punto elegido del conjunto Mandelbrot." julia7 "El conjunto Mandelbrot puede considerarse como un mapa de varios conjuntos Julia." julia8 "Puntos dentro del conjunto Mandelbrot corresponden a Julias con grandes áreas negras conexas," julia9 "mientras que los puntos fuera del conjunto Mandelbrot corresponden a Julias inconexos." julia10 "Los Julias más interesantes tienen su semilla en los límites del conjunto Mandelbrot." theme "El tema de un conjunto Julia también depende fuertemente de la semilla que escojas." theme1 "Cuando te aproximas al conjunto Mandelbrot, obtendras un fractal temáticamente muy similar" theme2 "cuando cambias a su correspondiente Julia." theme3 "aléjate denuevo, y descubres" theme4 "que estas en un fractal completamete diferente." theme5 "Los conjuntos Julia pueden parecer aburridos puesto que no cambian de tema" theme6 "y permanecen fieles a la semilla elegida del conjunto Mandelbrot." theme7 "Pero si eliges cuidadosamente la semilla puedes generar" theme8 "preciosas imagenes." ######################################################### #Para el fichero keys.xhf keys "Teclas: S - detiene la animación Espacio - saltar frame (puede demorar un poco) Izq/Der - ajuste de la velocidad de los subtítulos." ######################################################### #Para el fichero magnet.xaf intro7 "Una introducción a los fractales Capítulo 8 - Magnet" magnet "Este no es el conjunto Mandelbrot." magnet1 "Este fractal se llama \"magnet\" ya que su fórmula viene de la física teórica." magnet2 "Es derivado del estudio de rejillas teóricas en el contexto de transformaciones magnéticas." similiar "Su similitud con el conjunto Mandelbrot es interesante debido a que es una fórmula del mundo real." magjulia "Sus conjuntos Julia son bastantes inusuales." ######################################################### #Para el fichero new.xaf new "¿Qué hay de nuevo en la versión 3.0?" speed "1. Mayor velocidad" speed1 "Los bucles de los cálculos principales estan \"desenrrollados\" y realizan chequeos periódicos." speed2 "Las nuevas imágenes son calculadas usando detección de límites." speed3 "luego el cálculo de nuevas imágenes es mucho más rápido." speed4 "Por ejemplo, cálculo del conjunto Mandelbrot en 1 000 000 iteraciones..." speed5 "calculando..." speed6 "Terminado." speed7 "XaoS tiene una heurística que inhabilita automáticamente las chequeos periódicos cuando no espera que el punto esté dentro del conjunto (cuando todos alrededor no lo están)." speed8 "También las principales rutinas de zoom han sido optimizadas, luego el acercamiento es el doble de rápido." speed9 "XaoS alcanza 130FPS en mi Pentium 130Mhz." new2 "2. Filtros." new3 "3. Nueve modos out-coloring." new4 "4. Nuevos modos in-coloring." new5 "5. Modos de coloreamiento True-color." new6 "6. Guardar y repetir animaciones." newend "Y muchas otras mejoras, tal como rotación de la imagen, mejor generación de la paleta... mira ChangeLog para encontrar una completa lista de cambios." #NEW ######################################################### #Para le fichero newton.xaf intro3 "Una introducción a los fractales Capítulo 4 - El método Newton" newton "Este fractal es generado por una fórmula completamente diferente:" newton1 "El método numérico de Newton para encontrar las raices de un polinomio x^3=1." newton2 "Cuenta el número de iteraciones requeridas para conseguir la raíz aproximada." newton3 "Se pueden ver las tres raices como círculos azules." newton4 "Las partes más interesantes estan donde el punto de inicio es equidistante de dos o tres raices." newton5 "Este fractal es muy autosimilar y no muy interesante para explorar." newton6 "Pero XaoS puede generar conjuntos similares a los Julias," newton7 "donde el error en la aproximación es la semilla." newton8 "Esto hace al fractal Newton más interesante." ######################################################### #Para el fichero octo.xaf intro6 "Una introducción a los fractales Capítulo 7 - Octo" octo "Octo es un fractal menos conocido." octo1 "Lo hemos escogido para XaoS por su figura inusual." octo2 "XaoS Tambien puede generar conjuntos similares a los Julias, de una manera similar al Newton." ######################################################### #Para el fichero outcolor.xaf outcolor "Modos out coloring" outcolor1 "El conjunto Mandelbrot es un aburrido lago negro en mitad de la pantalla." outcolor2 "Las líneas de color a su alrededor son los límites del conjunto." outcolor3 "Normalmente el color estsá basado en el número de iteraciones requeridas para alcanzar el valor de liberación \"bail-out\"." outcolor4 "Pero hay otras formas de hacerlo." outcolor5 "XaoS las llama modos out-coloring." iterreal "iter+real Este modo pinta los límites añadiendo la parte real de la última órbita al número de iteraciones." iterreal1 "Puedes usarlo para hacer imágenes bastante aburridas más interesantes." iterimag "iter+imag es similar a iter+real." iterimag2 "La única diferencia es que usa la parte imaginaria de la última órbita." iprdi "iter+real/imag Este modo pinta los límites añadiendo el número de iteraciones a la parte real de la última órbita y dividiendolo por la parte imaginaria." sum "iter+real+imag+real/imag es la suma de todos los modos previos." decomp "descomposición binaria Cuando la parte imaginaria es mayor que cero, este modo utiliza el número de iteraciones; en otro caso usa el máximo número de iteraciones menos la descomposición binaria del número de iteraciones." bio "biomorphs Este modo se llama así ya que hace parecer a los fractales animales celulares." ######################################################### #Para el fichero outnew.xhf potential "potencial Este modo da buenos resultados en true-color para imagenes sin ampliar." cdecom "descomposición del color" cdecom2 "En este modo, el color es calculado a partir del ángulo de la última órbita." cdecom3 "Es similar a la descomposición binaria pero interpola los colores más suavemente." cdecom4 "Para el tipo Newton, puede ser usado para pintar el conjunto basandose en que raíz es encontrada, en vez de en el número de iteraciones." smooth "smooth El modo Smooth pretende quitar las líneas causadas por iteraciones y hacer grados más suaves." smooth1 "No funciona en el Newton y Magnet ya que tienen atractores finitos." smooth2 "Y sólo funciona para true-color y displays de muchos colores. Luego, si tienes 8bpp, necesitarás habilitar el filtro true color." ######################################################### #Para el fichero outnew.xhf intro5 "Una introducción a los fractales Capítulo 6 - Phoenix" phoenix "Este es el conjunto Mandelbrot para una fórmula conocida como Phoenix." phoenix1 "Parece muy diferente a otros fractales en XaoS, pero se puede encontrar alguna similitud con el conjunto Mandelbrot." phoenix2 "el conjunto Phoenix también tiene una \"cola\" con pequeñas copias del conjunto," phoenix3 "hay todavía una correspondencia de \"tema\" entre la versión Mandelbrot y los Julias," phoenix4 "pero los Julias son muy diferentes." ######################################################### #Para el fichero plane.xaf plane1 "Normalmente, la parte real de un punto en el plano complejo es mapeada a la coordenada x de la pantalla; y la parte imaginaria es mapeada a la coordenada y:" plane2 "XaoS proporciona 6 modos de mapeo alternativos" plane3 "1/mu Esta es una inversión - áreas desde el infinito pasan a 0 y de 0 al infinito. Esto te permite ver que le pasa al fractal cuando nos alejamos de él infinitamente." plane4 "Este el el Mandelbrot normal..." plane5 "y este el invertido." plane6 "Como puedes ver, el conjunto estaba en el medio y ahora esta alrededor. La infinita área azul alrededor del conjunto es mapeada en un pequeño círculo alrededor de 0." plane7 "Las próximas imágenes serán presentadas en modo normal e inverso para demostrarte qué pasa." plane8 "1/mu+0.25 Este es otro método invertido, pero con un centro de inversión diferente." plane9 "Ya que el centro de inversión está en el límite del conjunto Mandelbrot, puedes ver infinitos límites parabólicos." plane10 "Tiene un interesante efecto en otros fractales, ya que suele romper su simetría." lambda "El plano lambda procura una vista completamente diferente." ilambda "1/lambda Esta es una combinación de Inversión y el plano lambda." imlambda "1/(lambda-1) Esta es una combinación de lambda, movimiento e inversión." imlambda2 "Proporciona una muy interesante deformación del conjunto Mandelbrot." mick "1/(mu-1.40115) Este es, otra vez, una inversión con el centro desplazado. El centro se encuentra ubicado en puntos Feigenbaum - puntos donde el comjunto Mandelbrot es autosimilar. Esto amplia altamente los detalles alrededor del punto." ######################################################### #Para el fichero power.xaf intro2 "Una introducción a los fractales Capítulo 3 - Conjuntos Mandelbrot de potencias superiores" power "z^2+c no es la única fórmula que genera fractales." power2 "Sólo una pequeña modificación: x^3+c genera un fractal similar." power3 "Y hay copias completas del conjunto principal." power4 "Fractales similares pueden ser generados cambiando ligeramente las fórmulas" pjulia "y cada uno tiene sus correspondientes conjuntos Julia." ######################################################### #Para el fichero truecolor.xaf truecolor "Modos de coloreamiento True-color" truecolor1 "Normalmente los fractales son coloreados usando una paleta. En el modo true-color, la paleta es emulada." truecolor2 "La única diferencia es que la paleta es mayor y los colores son interpolados suavemente en los modos de coloreamiento." truecolor3 "El modo True-color utiliza una técnica completamente diferente. Usa varios parámetros para el cálculo" truecolor4 "para generar el color exacto - no solo un índice en la paleta." truecolor5 "Esto posibilita tener 4 valores para cada pixel." truecolor6 "El modo True color requiere, evidentemente, true color. Luego en dispositivos 8bpp, necesitarás habilitar el filtro true-color." ######################################################### #Para el fichero pert.xaf #NEW (up to end of file) pert0 "Perturbación" pert1 "Como las fórmulas de los Julia utilizan diferentes semillas para generar varios Julias a partir de una fórmula," pert2 "puedes cambiar el valor de perturbación para los conjuntos Mandelbrot." pert3 "Esto cambia la posición de inicio de la órbita desde el valor por defecto, 0." pert4 "Su valor no afecta al resultado del fractal tanto como la semilla lo hace en los Julias, pero es útil cuando quieres hacer el fractal más aleatorio." ########################################################## #Para el fichero palette.xaf pal "Paletas aleatorias" pal0 "XaoS no tiene una gran biblioteca de paletas predefinidas como otros programas, pero genera paletas aleatorias." pal1 "Luego puedes mantener pulsada 'P'hasta que XaoS genere una paleta que te guste para tu fractal." pal2 "Se utiliza tres algoritmos diferentes:" pal3 "el primero hace líneas que van de algún color a negro," pal4 "el segundo hace líneas que van de algún color a blanco," pal5 "el tercero esta inspirado en pinturas cubistas." ########################################################### #Para el fichero other.xaf auto1 "Piloto automático" auto2 "Si eres un vago, puedes utilizar el piloto automático para permitir que XaoS explore un fractal automáticamente." fastjulia1 "Modo de visionamiento de Julias más veloz" fastjulia2 "Este modo te permite varias la semilla del Julia." fastjulia3 "También es útil como una visión previa antes de ampliarlo - debido a la correspondencia temática entre el Julia y el punto que elijas, puedes ver el tema aproximado alrededor del punto antes de ampliarlo." rotation "Rotación de la imagen" cycling "Color cíclico" ############################################## #for file trice.xaf trice1 "Triceratops and Catseye fractals" trice2 "If you change the bailout value" trice3 "of an escape-time fractal" trice4 "to a smaller value," trice5 "you will get an other fractal." trice6 "With this method we can get" trice7 "very interesting patterns" trice8 "with separate areas of one color." trice9 "The Triceratops fractal" trice10 "is also made with this method." trice11 "Many similar pictures can be" trice12 "made of Triceratops." trice13 "The Catseye fractal" trice14 "is like an eye of a cat." trice15 "But if we raise the bailout value..." trice16 "...we get a more interesting fractal..." trice17 "...with bubbles..." trice18 "...and beautiful Julias." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar and Spider" fourfr2 "This is the Mandelbar set." fourfr3 "It's formula is: z = (conj(z))^2 + c" fourfr4 "Some of its Julias are interesting." fourfr5 "But let's see other fractals now." fourfr6 "The Lambda fractal has a structure" fourfr7 "similar to Mandelbrot's." fourfr8 "It's like the Mandelbrot set on the lambda plane." fourfr9 "But Lambda is a Julia set, here is MandelLambda." fourfr10 "...fast Julia mode..." fourfr11 "This is the fractal Manowar." fourfr12 "It was found by a user of Fractint." fourfr13 "It has Julias similar to the whole set." fourfr14 "This fractal is called Spider." fourfr15 "It was found by a user of Fractint, too." fourfr16 "And it has Julias similar to the whole set, too." ############################################## #for file classic.xaf classic1 "Sierpinski Gasket, S.Carpet, Koch Snowflake" classic2 "This is the famous Sierpinski Gasket fractal." classic3 "And this is the escape-time variant of it." classic4 "You can change its shape by selecting" classic5 "another 'Julia seed'" classic6 "This fractal is the Sierpinski Carpet." classic7 "And here is it's escape-time variant." classic8 "This is famous, too." classic9 "And finally, this is the escape-time variant" classic10 " of the Koch Snowflake." ############################################## #for file otherfr.xaf otherfr1 "Other fractal types in XaoS" XaoS-release-4.3.2/catalogs/fr.cat000066400000000000000000000745611455214672000167300ustar00rootroot00000000000000# Catalogue des fichiers textes requis pour relire la présentation # de Xaos en version française traduite de l'anglais. v 0.4 11/9/97 # # Copyright (C) 1997 by Jan Hubicka # # Quelques remarques à savoir si vous désirez changer ou # traduire ce fichier. # # Le format de ce catalogue est : # identificateur[espace]"valeur"[espace] # # L'identificateur est un petit texte utilisé dans la présentation # ne le traduisez pas, traduisez juste la valeur. # Pour saisir le signe " utilisez \" et pour \ utilisez \\ # les signes \n ne doivent pas être utilisé pour remplacer entrée # # Si vous désirez traduire ce fichier dans un autre langage, faites-le # moi savoir. Vous pouvez (et c'est même recommandé) traduire ce texte # librement ainsi vous n'aurez pas à respecter exactement les phrases. # N'hesitez pas à rendre le texte plus drôle ou intéressant et à rajouter # de nouvelles informations. # # Vous pouvez utiliser des phrases de longueur différente, car XaoS # calculera automatiquement le temps d'affichage. # # Faite-moi parvenir vos suggestions pour améliorer ce texte # et la présentation. Si quelqu'un veut participer à la correction # de l'orthographe il est le bienvenu ! # ######################################################### #For file dimension.xaf fmath "Les Math à la base des fractales" fmath1 "Les fractales sont un domaine assez nouveau des math, ce qui fait qu'il y a encore des tas de questions non résolues." fmath2 "Même les définitions ne sont pas claires" fmath3 "On appelle souvent un objet fractale s'il possède un certain degré d'auto-similarité." def1 "Une des définitions est la suivante..." #Definition from the intro.xaf is displayed here. #If it is a problem in your language catalog, let me #know and I will create a special key def2 "Qu'est-ce que ça veut bien dire?" def3 "Pour expliquer ça, il faut d'abord comprendre ce que sont la dimension topologique et la dimension de Hausdorff Besicovich." topo1 "La dimension topologique est la dimension \"normale\"." topo2 "Un point a 0 dimensions" topo3 "Une ligne en a 1" topo4 "Une surface en a 2, etc..." hb1 "La définition de la dimension de Hausdorff Besicovich repose sur les observations suivantes:" hb2 "La taille (longueur) d'un segment zoomé dans le rapport 2 croît aussi dans le rapport 2." hb3 "Par ailleurs, la taille (surface) d'un carré zoomé dans le rapport 2 croît d'un facteur 4." hb4 "Une règle identique s'applique en toute dimension." hb5 "Pour calculer le nombre de dimensions à partir de ce fait, on peut utiliser l'équation suivante:" hb6 "dimension = log s / log z où z est le rapport d'homothétie du zoom et s le rapport des tailles." hb7 "Pour un segment zoomé dans le, rapport 2, le changement de taille est aussi dans le rapport 2. log 2 / log 2 = 1" hb8 "Pour un carré zoomé dans le rapport 2, le rapport des tailles est 4. log 4 / log 2 = 2" hb9 "Ainsi, cette définition donne les mêmes résultats que la dimension topologique pour des formes \"normales\"." hb10 "Les choses deviennent beaucoup plus intéressantes avec les fractales..." hb11 "Considérons le \"flocon de neige\" appelée aussi courbe de von Koch," hb12 "créée en remplaçant de façon infiniment répétée un segment par quatre segments de droite formant une ligne brisée." hb13 "Chaque nouveau segment a 1/3 de la taille du segment initial." hb14 "En zoomant 3 fois, chacun de ces segments aura exactement la même taille que le segment initial." hb15 "A cause de l'auto-similarité engendrée par le processus de répétition infinie de la construction," hb15b "chacune des 4 parties deviendra une réplique exacte de la fractale prise dans sa totalité." hb16 "Comme il y a quatre telles parties, la taille de la fractale croît 4 fois" hb17 "En remplaçant ces valeurs dans la formule de la dimension, on trouve: log 4 / log 3 = 1.261" hb18 "On obtient une valeur plus grande que 1, qui est la dimension topologique de la courbe." hb19 "La dimension de Hausdorff Besicovich (1.261) est donc ici plus grande que la dimension topologique." hb20 "D'après la définition que nous avons donnée, le flocon de neige est une fractale." defe1 "Cette définition, cependant, est imparfaite car elle exclut quantité de formes qui peuvent cependant être considérés comme des fractales." defe2 "Mais elle montre en tout cas une des propriétés intéressantes des fractales," defe3 "et elle est assez courante." defe4 "La dimension de Hausdorff Besicovich est aussi souvent appelée \"dimension fractale\"." ######################################################### #For file escape.xaf escape "Les Math à la base des fractales Chapitre 2 - Fractales à temps de fuite" escape1 "Certaines fractales (comme le flocon de neige) sont créées de manière simple." escape2 "XaoS peut générer une catégorie différente de fractales - appelées ici fractales à temps de fuite." escape3 "La méthode utilisée pour les engendrer est quelque peu différente, mais elle repose aussi sur un mécanisme d'itérations." escape4 "On considère l'écran tout entier comme un plan complexe." escape5 "L'axe réel est placé horizontalement" escape6 "et l'axe imaginaire verticalement." escape7 "Chaque point a sa propre orbite" escape8 "La trajectoire d'un point est calculée en itérant une certaine fonction f(z,c) où z représente la position précédente, z'=f(z,c) la nouvelle position, et où c est un paramètre (valeur donnée)." escape9 "Par exemple, dans l'ensemble de Mandelbrot, la fonction itérative est f(z,c)=z^2+c." orbit1 "Supposons par exemple qu'on examine le point complexe 0 - 0.6i" orbit2 "On assigne alors cette valeur au paramètre c" orbit3 "Le calcul itératif de l'orbite démarre par convention à z=0+0i" orbit3b "On calcule ensuite de façon répétitive la fonction f(z,c), en remplaçant z par z=f(z,c) à chaque nouvelle itération." orbit4 "Par définition, un point c est dans l'esnemble de Mandelbrot si l'orbite du point z reste à distance finie." orbit5 "Ici, c'est bien ce qui se passe..." orbit6 "Ce point est donc dans l'ensemble." orbit7 "Dans d'autre cas, le point z peut \"fuir\" rapidement vers l'infini." orbit8 "(par exemple, pour la valeur c=10+0i, la première itération donne 110, la deuxième 12110 etc..)" orbit9 "De tels points sont donc en dehors de l'ensemble de Mandelbrot." bail1 "Nous en sommes à parler de quantités infinies, et de nombre infini d'itérations..." bail2 "Mais les ordinateurs sont des machines finies, et ne peuvent donc calculer exactement les fractales." bail3 "On peut cependant montrer, que dans le cas où la distance de l'orbite à zéro est grande que 2, l'orbite s'échappe toujours vers l'infini." bail4 "Ainsi, on peut interrompre les calculs dès que l'orbite sort du cercle de rayon 2. (Ce test est appelé test de sortie)." bail5 "Dans les cas où des points calculés sont situés en dehors du cercle de rayon 2, on n'a plus besoin que d'un nombre fini d'itérations." bail6 "Ceci permet aussi de créer les zones colorées entourant l'ensemble." bail7 "Celles-ci sont colorées en fonction du nombre d'itérations de l'orbite nécessaires pour tomber dans la \"zone d'abandon\" (extérieur du cercle de rayon 2)." iter1 "À l'intérieur du cercle, on peut événtuellement avoir besoin de faire un nombre infini d'itérations." iter2 "La seule façon de s'en sortir est d'interrompre les calculs après un certain nombre d'itérations et de se contenter du résultat approximatif." iter3 "Le nombre maximal d'itérations va donc déterminer la précision de l'approximation." iter4 "Si on n'effectuait pas d'itérations, on observerait juste un cercle de rayon 2 (d'après la condition de sortie)." iter5 "Un plus grand nombre d'itérations rend le calcul plus précis, mais réclame aussi un temps de calcul plus long." limit1 "XaoS, par défaut, calcule 170 itérations." limit2 "Dans certaines zones, on peut zoomer très longtemps sans jamais atteindre cette limite." limit3 "Dans d'autres zones, on peut au contraire aboutir assez vite à des résultats imprécis ou inexacts." limit4 "Dans ce cas, les images perdent de leur netteté et deviennent ennuyeuses." limit5 "Mais si on augmente de nouveau le nombre d'itérations, on retrouve de nouveau des tas de détails excitants." ofracts1 "Les autres fractales de XaoS sont calculées à partir de formules et de tests de sortie différents, mais la méthode est toujours à peu près la même." ofracts2 "Il y a une telle quantité de calculs à accomplir que XaoS doit effectuer des tas d'optimisations pour gagner du temps... Si vous le souhaitez, vous pouvez lire plus de détails dans la documentation." ######################################################### #pour anim.xaf anim "Présentation des fonctions de XaoS Fichier d'animations et de positions" ######################################################### #For file anim.xhf anim2 "Comme vous l'avez remarqué, XaoS est capable de rejouer des animations et des formations" anim3 "Elles peuvent être enregistrées directement depuis XaoS" languag1 "Comme les fichiers d'animations et de positions sont stockés avec un langage de commande simple" languag2 "(Les positions sont des animations d'une seule image)" languag3 "Les animations peuvent être éditées manuellement pour obtenir un résultat plus professionnel" languag4 "La plupart des animations de cette présentation ont été écrites complètement à la main en utilisant des fichiers de position" modif1 "Une petite modification dans ce fichier de position simple" modif2 "Doit générer un zoom arrière" modif3 "Et celle-ci un zoom avant" newanim "Vous pouvez aussi écrire des animations ou effets complètement nouveaux" examples "XaoS est fourni avec de nombreux fichiers exemples, à charger avec le menu Fichier -> Enregistrer/Ouvrir" examples2 "Utilisez les fichiers de position pour échanger des coordonnées avec d'autres programmes" examples3 "La seule limitation est votre imagination et le language de commande décrit dans la documentation" ######################################################### #For file barnsley.xaf intro4 "Une introduction aux fractales Chapitre 5 - la formule de Barnsley" barnsley1 "Une autre formule, découverte par Michael Barnsley" barnsley2 "Crée de très étranges fractales" barnsley3 "Peu intéressantes à explorer" barnsley4 "Mais qui pointe sur de superbes \"Julias\"!" barnsley5 "C'est intéressant car les structures sont \"cristallines\" " barnsley6 "au lieu des formes \"organiques\" des autres fractales" ######################################################### #For file filter.xaf filter "Présentation des fonctions de XaoS Les filtres" ######################################################### #For file filter.xhf filter1 "Les filtres sont des effets appliqués à chaque image fractale, après calcul" filter2 "Les filtres suivants sont présents dans XaoS" motblur "Flou de déplacement" edge "détection de bord" edge2 "Le premier fait des lignes larges et est utilisable de préférence en haute résolution" edge3 "Le second écrase les lignes" star "filtre \"champ d'étoiles\" " interlace "L'entrelacement accélère les calculs et donne un effet de flou de vitesse en haute résolution" stereo "Et le filtre stéréogramme" stereo2 "Si vous voyez d'habitude les stéréogrammes et si les images suivantes n'apparaissent pas en 3D, les paramètres de taille écran doivent être reconfigurés. La commande xaos -help indique de plus amples informations" emboss1 "Filtre de relief" #NEW palettef1 "Filtre de rotation de palette (active la rotation des couleurs en couleurs réelles, 16 bits et plus)" #NEW truecolorf "Un filtre 24 bit (génère des images en couleurs réelles avec un affichage en 256 couleurs)" ######################################################### #For file fractal.xaf end "-=- Fin -=-" fcopyright "Cette introduction aux fractales a été écrite par Jan Hubicka in Juillet 1997 et traduite en Français par Eric Courteau [ecourteau@cplus.fr] et JP Demailly [demailly@ujf-grenoble.fr]" # Add your copyright here if you are translating/correcting this file suggestions " Envoyez vos idées, suggestions, remerciements, reproches et rapports d'erreurs à : xaos-discuss@lists.sourceforge.net Merci" ######################################################### #For file incolor.xaf incolor1 "Normalement les points à l'intérieur de l'ensemble sont d'une seule couleur." incolor2 "Cela rend les frontières bien visibles mais peut cacher certains détails" incolor3 "Il est possible de coloriser les points à l'intérieur de l'ensemble pour rendre intéressantes à regarder certaines zones" incolor4 "Xaos utilise dix méthodes différentes pour le faire. Elles sont appelées les colorations internes." zmag "zmag La couleur est calculée d'après la valeur de la dernière orbite" ######################################################### #For file innew.xaf innew1 "Décomposition Même méthode que pour l'ensemble externe." innew2 "real/imag La couleur dépend de la partie réelle de la dernière orbite divisée par la partie imaginaire" innew3 "les 6 méthodes de coloration suivantes sont choisis au hasard ou repris du logiciel Flarium." ######################################################### #For file intro.xaf fractal "...Fractales..." fractal1 "Qu'est ce que c'est ?" fractal2 "Définition de Benoît Mandelbrot: les fractales sont des ensembles dont la dimension de Hausdorff Besicovitch est supérieure à la dimension topologique." fractal3 "Vous ne comprenez toujours pas?" fractal4 "Ne vous inquiétez pas : Cette définition est discutable." fractal5 "Plus simplement : Une fractale est une forme" fractal6 "composée d'éléments" fractal7 "qui sont chacun une copie en réduction de la forme générale" fractal8 "ce processus répété à l'infini" fractal9 "construit la fractale en entier." facts "Les fractales possèdent des propriétés surprenantes." fact1 "Elles sont indépendantes de l'échelle choisie pour les visualiser." fact2 "l' Auto-similarité." fact3 "Elles ressemblent à des objets naturels." fact4 "Comme les nuages, les montagnes ou les côtes." fact5 "De nombreux objets mathématiques sont des fractales" fact6 "Comme celle-ci" fmath4 "La plupart des fractales sont crées à l'aide d'un procédé itératif" fmath5 "par exemple la fractale connue sous le nom de courbe de von Koch" fmath6 "est crée en transformant un segment de droite" fmath7 "en quatre segments" fmath8 "Voici la première itération du processus" fmath9 "On répète ensuite cette transformation" fmath10 "après 2 itérations..." fmath11 "après 3 itérations..." fmath12 "après 4 itérations.." fmath13 "et après une infinité d'itérations on obtient la fractale achevée." fmath14 "Sa forme est celle d'un flocon de neige qui serait coupé en trois." tree1 "Quantités d'autres formes peuvent être construites par des méthodes voisines." tree2 "Par exemple, en transformant un segment de manière différente" tree3 "on aboutit à un arbre." nstr "Les itérations peuvent éventuellement introduire des décalages aléatoires." nstr2 "En remplaçant 1 segment par 2 segments" nstr3 "et en introduisant une petite erreur," nstr4 "on peut obtenir une fractale ressemblant à une côte découpée." nstr5 "Des procédés semblables peuvent servir à créer des nuages, des montagnes, et quantités d'autres formes présentes dans la nature." ####################################################### ## mset.xaf fact7 "Sans aucun doute, la plus fameuse est..." mset "l'ensemble de Mandelbrot" mset1 "créée par une formule très simple." mset2 "Mais l'une des plus belles des fractales" mset3 "Comme l'ensemble de Mandelbrot est une fractale" mset4 "ses frontières recèlent des" mset5 "copies en miniature de l'ensemble complet" mset6 "celui-ci est le plus grand, à peu près 50 fois plus petit." mset7 "Comme l'ensemble de Mandelbrot n'est pas strictement auto-similaire" mset8 "chaque copie est subtilement différente de l'originale" mset9 "Celle-ci est 76000 fois plus petite." mset10 "Des copies situées ailleurs peuvent différer encore plus" nat "Les frontières ne contiennent pas que des copies de l'ensemble, mais aussi" nat1 "des variations infinies de diverses structures" nat2 "Certaines sont étonnamment proches de formes naturelles" nat3 "cela ressemble à des arbres" nat4 "des rivières et des lacs" nat5 "des galaxies" nat6 "et des chutes d'eau" nat7 "l'ensemble contient de nombreuses formes complètement originales" ############################################################################### ############ juliach "An introduction to fractals" julia "l'ensemble de Mandelbrot n'est pas la seule fractale générée par la formule z=z^2+c" julia1 "une autre souvent utilisée" julia2 "est l'ensemble de Julia" julia3 "il existe non pas un seul ensemble de Julia," julia4 "mais une infinité de variations" julia5 "et chacune diffère juste du nombre complexe qui leur sert de valeur initiale:" julia6 "un point choisi dans l'ensemble de Mandelbrot." julia7 "la fractale de Mandelbrot peut être vue comme une carte des Julias" julia8 "les points à l'intérieur forment des Julias avec de grandes zones sombres" julia9 "à l'extérieur, cela fait un nuage de points" julia10 "Les plus intéressantes sont situées juste à la frontière" theme "la forme générale de l'ensemble de Julia dépend beaucoup du point choisi" theme1 "en zoomant, vous verrez que le thème de l'ensemble d'origine est reproduit" theme2 "en affichant le Julia correspondant " theme3 "Mais en voyant l'image dans sa totalité" theme4 "l'image est très différente" theme5 "Les Julias peuvent sembler moins riches" theme6 "car elle imitent une seule forme" theme7 "mais en choisissant avec soin votre point de départ " theme8 "dans l'ensemble de Mandelbrot, de belles surprises peuvent arriver." ######################################################### #For file keys.xhf keys "Touches: S - Stopper l'animation Espace - passer à l'image suivante (peut prendre du temps) gauche/droite - règle la vitesse du texte" ######################################################### #For file magnet.xaf intro7 "Une introduction aux fractales Chapitre 8 - Magnet" magnet "Ceci n'est PAS l'ensemble de Mandelbrot" magnet1 "Cette fractale est appellée Magnet car elle provient d'une formule de physique théorique" magnet2 "dérivé de l'étude des champs magnétiques" similiar "Sa similarité avec l'ensemble de Mandelbrot est intéressante car elle vient du monde réel." magjulia "Les Julias qui en dépendent sont étonnants " ######################################################### #For file new.xaf new "Les nouveautés de la version 3.0" speed "1. accélération" speed1 "La boucle de calcul est améliorée et fait des test de périodicité" speed2 "les nouvelles images sont calculées avec la méthode de detection des frontières" speed3 "ce qui accélère grandement l'affichage de nouvelles images" speed4 "par exemple, le calcul de l'ensemble de Mandelbrot avec une précision de 1 000 000 boucles" speed5 "calcul en cours" speed6 "Calculé !" speed7 "XaoS utilise l'heuristique et désactive automatiquement le test de périodicité si le point n'est pas à l'intérieur de l'ensemble." speed8 "La routine de zoom principale est optimisée pour être deux fois plus rapide qu'avant." speed9 "Ainsi, XaoS atteint les 130 images/secondes sur mon Pentium 130Mhz" new2 "2. les filtres" new3 "3. neuf méthodes de coloration de l'extérieur" new4 "4. De nouvelles méthodes pour coloriser l'intérieur" new5 "5. Le mode 24 bits pour la vidéo" new6 "6. sauvegarde et chargement d'animations" newend "et beaucoup d'autres améliorations, comme le défilement d'image, une meilleure gestion des palettes de couleurs... Voir le fichier ChangeLog pour une liste complète des changements." #NEW ######################################################### #For file newton.xaf intro3 "Une introduction aux fractales Chapitre 4 - La méthode de Newton" newton "La formule de celle-ci est très différente." newton1 "L'approximation de Newton pour trouver les racines de polynomes cubique du type x^3=1" newton2 "Elle compte le nombre de cycles requis pour atteindre une racine assez juste" newton3 "Les trois racines sont représentées par des cercles bleus" newton4 "Les parties intéressantes sont aux endroits où il est difficile de déterminer quelle est la racine la plus proche" newton5 "Cette fractale est trop répétitive pour être intéressante à explorer" newton6 "Mais XaoS est capable de générer des \"Julias\" dérivés." newton7 "l'origine utilisée est l'erreur de l'approximation" newton8 "Cela rend cette fractale plus intéressante" ######################################################### #For file octo.xaf intro6 "Une introduction aux fractales Chapitre 7 - Octo" octo "Octo est une fractale générée par une formule moins couramment utilisée" octo1 "Elle a été choisie à cause de sa forme inhabituelle" octo2 "Xaos est capable de créer des Julias à partir de ce type de fractale." ######################################################### #For file outcolor.xaf outcolor "Modes de coloration externe" outcolor1 "L'ensemble de Mandelbrot est juste la partie noire et ennuyeuse située au centre de la courbe" outcolor2 "Les bandes de couleurs qui l'entourent forment la frontière" outcolor3 "La méthode classique pour afficher leur couleur est le nombre de boucles nécessaires pour determiner qu'elles sont à l'extérieur" outcolor4 "mais d'autres méthodes existent." outcolor5 "Xaos les appelle les modes de colorisation externes" iterreal "iter+real On rajoute la partie réelle du dernier orbite au nombre d'itérations" iterreal1 "Cela rend plus belles des images a priori un peu ennuyeuses" iterimag "La seconde méthode de colorisation iter+imag donne des résultats très proches" iterimag2 "c'est juste la partie imaginaire qui est utilisée au lieu de la partie réelle" iprdi "iter+real/imag la partie réelle du dernier orbite est divisée par la partie imaginaire." sum "iter+real+imag+real/imag on ajoute tout ensemble." decomp "Décomposition binaire Si la partie imaginaire est plus grande que zéro, c'est le nombre d'itérations sinon on soustrait le nombre d'itérations de la décomposition binaire." bio "Biomorphs Cette méthode porte son nom en raison du fait qu'elle produit des structures ressemblant aux animaux unicellulaires." ######################################################### #For file outnew.xhf potential "Potentiel Cette technique de colorisation fonctionne particulièrement bien sur les images non zoomées." cdecom "Decomposition des couleurs" cdecom2 "la couleur est calculée à partir de l'angle du dernier orbite" cdecom3 "C'est proche de la decomposition binaire mais les couleurs sont plus adoucies" cdecom4 "A utiliser plus particulièrement avec la fractale de Newton" smooth "Adoucir Ce mode enlève les bandes de couleur et les remplace par des transitions en douceur." smooth1 "Cela ne fonctionne pas avec Newton et Magnet à cause de leurs attracteurs finis" smooth2 "vous devrez l'utiliser avec les modes écran supérieurs à 256 couleurs ou activer le filtre de simulation 24 bit" ######################################################### #For file outnew.xhf intro5 "Une introduction aux fractales Chapitre 6 - Phoenix" phoenix "Ceci est l'ensemble de Mandelbrot pour la formule nommée Phoenix" phoenix1 "Elles est très différente des autres formules disponibles dans XaoS, mais elle ressemble par certains côtés à l'ensemble de Mandelbrot" phoenix2 "Elle aussi contient des copies réduite de la totalité" phoenix3 "Il y a toujours des correspondances de thème entre les Julias et leur point de départ." phoenix4 "Mais les Julias sont très différents" ######################################################### #For file plane.xaf plane1 "Normalement, la partie réelle d'un point est placée sur l'axe des x et la partie imaginaire sur l'axe Y" plane2 "XaoS fournit 6 autres façons de placer les points dans le plan" plane3 "1/mu C'est une inversion - la zone à l'infini se retrouve au 0 et inversement." plane4 "Mandelbrot classique" plane5 "Mandelbrot inversé" plane6 "L'ensemble est maintenant à la périphérie alors qu'il était au centre de l'écran précédemment." plane7 "les images suivantes vont être affichées successivement en mode normal puis inversé" plane8 "1/mu+0.25 Le centre d'inversion est déplacé" plane9 "Comme le centre est situé à la frontière de l'ensemble, vous voyez une infinité de frontières paraboliques." plane10 "L'effet est intéressant sur les autres fractales, mais en général elles perdent leur symétrie." lambda "les plans lambda forment une vue complètement differente" ilambda "1/lambda la combinaison des plans lambda et de l'inversion" imlambda "1/(lambda-1) la combinaison de lambda, déplacement et inversion" imlambda2 "l'effet sur Mandelbrot est très intéressant" mick "1/(mu-1.40115) Une inversion avec le centre déplacé sur un point de Feigenbaum - point où Mandelbrot est auto-similaire. Cela augmente énormément les détails autour de ce point" ######################################################### #For file power.xaf intro2 "Une introduction aux fractales Chapitre 3 - Ensemble de Mandelbrot des fonctions puissances plus élevées" power "z^2+c n'est pas la seule formule qui génère des fractales" power2 "En la modifiant très peu - x^3+c par exemple, une autre fractale apparaît." power3 "Elle contient encore beaucoup de copies en miniature de l'ensemble dans son entier" power4 "Des fractales similaires peuvent être engendrées par des formules voisines" pjulia "et à chacune correspond une famille d'ensemble de Julia correspondants." ######################################################### #For file truecolor.xaf truecolor "couleurs réelles (24 bit)" truecolor1 "Habituellement, les fractales sont colorées à l'aide d'une palette. En mode 24 bit la palette est émulée." truecolor2 "la seule différence est que la palette est plus grande et que les couleurs successives sont plus nombreuses" truecolor3 "Le mode 24 bit peut utiliser la couleur pour afficher divers résultats de calculs" truecolor4 "pour calculer une couleur exacte et non plus un index sur une palette" truecolor5 "Cela permet d'afficher jusqu'à quatre valeurs par pixel" truecolor6 "Le mode 24 bit nécessite un écran équivalent ou alors il faut valider le filtre 24 bit pour afficher les images produites en 256 couleurs." ######################################################### #for file pert.xaf #NEW (up to end of file) pert0 "Perturbation" pert1 "Comme pour la formule générant l'ensemble de Julia, qui utilise différentes valeurs initiales pour produire différents ensembles à partir d'une même formule," pert2 "vous pouvez changer la valeur de perturbation pour les ensembles de Mandelbrot." pert3 "Cela change la position initiale de l'orbite, en une valeur autre que 0 par défaut." pert4 "Sa valeur n'affecte pas la fractale qui en résulte autant que le choix de la valeur initiale pour les Julias, mais elle est utile pour obtenir des fractales plus aléatoires." ########################################################## #for file palette.xaf pal "Palettes aléatoires" pal0 "XaoS ne possède pas une vaste librairie de palettes prédéfinies comme beaucoup d'autres programmes, mais génère des palettes aléatoires." pal1 "Ainsi vous pouvez simplement presser 'P' jusqu'à ce que XaoS génère une palette agréable à l'œil pour votre fractale." pal2 "Trois différents algorithmes sont utilisés:" pal3 "le premier produit des bandes depuis une certaine couleur jusqu'au noir," pal4 "le second produit des bandes depuis le noir jusqu'à une certaine couleur puis jusqu'au blanc," pal5 "le troisième est inspiré de certains tableaux cubistes." ########################################################### #for file other.xaf auto1 "Autopilote" auto2 "Si vous êtes paresseux, vous pouvez activer le pilote automatique pour que XaoS explore les fractales automatiquement." fastjulia1 "Mode d'exploration rapide Julia" fastjulia2 "Ce mode permet de faire varier la valeur initiale du Julia." fastjulia3 "Il est aussi utile pour prévisualiser une zone avant de zoomer - parce que dans la correspondance thématique entre le Julia et le point que vous choisissez, vous pouvez voir le thème approximatif près d'un point avant de zoomer." rotation "Défilement d'images" cycling "Défilement de couleurs" ############################################## #for file trice.xaf trice1 "Triceratops and Catseye fractals" trice2 "If you change the bailout value" trice3 "of an escape-time fractal" trice4 "to a smaller value," trice5 "you will get an other fractal." trice6 "With this method we can get" trice7 "very interesting patterns" trice8 "with separate areas of one color." trice9 "The Triceratops fractal" trice10 "is also made with this method." trice11 "Many similar pictures can be" trice12 "made of Triceratops." trice13 "The Catseye fractal" trice14 "is like an eye of a cat." trice15 "But if we raise the bailout value..." trice16 "...we get a more interesting fractal..." trice17 "...with bubbles..." trice18 "...and beautiful Julias." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar and Spider" fourfr2 "This is the Mandelbar set." fourfr3 "It's formula is: z = (conj(z))^2 + c" fourfr4 "Some of its Julias are interesting." fourfr5 "But let's see other fractals now." fourfr6 "The Lambda fractal has a structure" fourfr7 "similar to Mandelbrot's." fourfr8 "It's like the Mandelbrot set on the lambda plane." fourfr9 "But Lambda is a Julia set, here is MandelLambda." fourfr10 "...fast Julia mode..." fourfr11 "This is the fractal Manowar." fourfr12 "It was found by a user of Fractint." fourfr13 "It has Julias similar to the whole set." fourfr14 "This fractal is called Spider." fourfr15 "It was found by a user of Fractint, too." fourfr16 "And it has Julias similar to the whole set, too." ############################################## #for file classic.xaf classic1 "Sierpinski Gasket, S.Carpet, Koch Snowflake" classic2 "This is the famous Sierpinski Gasket fractal." classic3 "And this is the escape-time variant of it." classic4 "You can change its shape by selecting" classic5 "another 'Julia seed'" classic6 "This fractal is the Sierpinski Carpet." classic7 "And here is it's escape-time variant." classic8 "This is famous, too." classic9 "And finally, this is the escape-time variant" classic10 " of the Koch Snowflake." ############################################## #for file otherfr.xaf otherfr1 "Other fractal types in XaoS" XaoS-release-4.3.2/catalogs/hu.cat000066400000000000000000001050311455214672000167200ustar00rootroot00000000000000# Message catalog file required to replay XaoS tutorials in # Hungarian language # # Copyright (C) 1997 by Jan Hubicka # , , # Hungarian translation by Kovacs Zoltan (kovzol@math.u-szeged.hu) # $Revision: 1.6 $ # # This is a Latin2 encoded file # , , , , ,, # Ez a fajl Latin2-kodolasu (Windowsban vagy Unixban/Linuxban szerkesztheto). # Ha módosítod, néhány dolgot nem árt tudnod. # # A katalógus formátuma: azonosító[szóközök]"érték"[szóközök] # # Az azonosító tulajdonképpen a program által használt kulcs. # Ezt ne fordítsd le, csak az értékét! Az idézőjel karakterek helyett # -- amennyiben szükséges -- `\"'-t használj! A backslash jel helyett `\\' # írandó. A `\n' nem használható, helyette a szokásos módon új sorba # kell írni a következő sorba szánt szöveget. # # Az új nyelvre fordítást kérem, hogy jelezd nekem. Nem muszáj szó # szerint fordítanod; ha kedved tartja, nyugodtan változtass a szövegen, # ha ezzel érdekesebbé vagy mókásabbá teszed azt. # # Hosszabb és rövidebb mondatok is beírhatók. A XaoS program automatikusan # számítja a megjelenítéshez szükséges időt. # # Bármiféle megjegyzést örömmel fogadok. # # A kész fordítást próbáld ki ,,élesben'' is! ######################################################### encoding "2" #dimension.xaf fmath "A fraktálok matematikája" fmath1 "A fraktálokkal foglalkozó tudomány nem régóta része a matematikának, s számos megválaszolatlan kérdést rejteget." fmath2 "Még a definíciók sem teljesen tisztázottak." fmath3 "Rendszerint akkor nevezünk fraktálnak valamit, ha önhasonló." def1 "Egy lehetséges definíció..." #Itt az intro.xaf-ban leírt definíció fog megjelenni. #Ha az általad fordított nyelven ez problémát okoz, #írj egy levelet nekem, s generálok egy plusz kulcsot. def2 "Mit is jelent ez?" def3 "Ennek megértéséhez először is különbséget kell tennünk topologikus dimenzió és az ún. Hausdorff-Besicovich dimenzió fogalma között." topo1 "A topologikus dimenzió a \"normális\" dimenziószám." topo2 "A pont 0 dimenziós," topo3 "az egyenes szakasz 1 dimenziós alakzat." topo4 "A felületek 2 dimenziósak, és így tovább..." hb1 "A Hausdorff-Besicovich dimenzió fogalma a következőképpen adható meg:" hb2 "Minden kétszeresére nagyított szakasz kétszer hosszabb az eredetinél." hb3 "Viszont egy kétszeresére nagyított négyzet területe négyszerese az eredeti méretnek." hb4 "Több dimenzióban is hasonló szabályok érvényesek." hb5 "A dimenziószám kiszámítására általában a következő képlet alkalmazható:" hb6 "dimenzió = log m / log n, ahol n a nagyítás mértéke és m a méret változása." hb7 "Példa: a vonal esetében a nagyítás 2-szeres, a méretváltozás is 2-szeres: log 2 / log 2 = 1." hb8 "Négyzet esetében a nagyítás 2-szeres, a méret változása 4-szeres: log 4 / log 2 = 2." hb9 "Látható, hogy tényleg a \"normális\" dimenziószámot kapjuk eredményül, ha a szokásos alakzatokat vizsgáljuk." hb10 "A dolog igazán érdekessé a fraktálok vizsgálata során válik..." hb11 "Vegyük szemügyre a hópehely-görbét!" hb12 "Ez úgy készül, hogy minden vonalat négy másikkal helyettesítünk." hb13 "Minden új vonal az eredeti vonal hosszának harmada." hb14 "Háromszoros nagyításnál ezek a vonalak pontosan ugyanakkorák, mint az eredetiek." hb15 "Ha végtelen sokszor hajtjuk végre ezt az átalakítást, a kapott alakzat önhasonló lesz:" hb15b "minden egyes rész a teljes fraktál pontos mása." hb16 "Mivel pontosan négy másolat készült, a fraktál mérete 4-szeresére változott." hb17 "Ezt az előbbi egyenlőségbe beírva: log 4 / log 3 = 1,261..." hb18 "Most 1-nél nagyobb számot kaptunk! (A görbe topologikus dimenziója 1.)" hb19 "A Hausdorff-Besicovich dimenzió (1,261...) jelen esetben nagyobb, mint a topologikus dimenzió." hb20 "Definíciónk szerint tehát a hópehely-görbe fraktál." defe1 "Sajnos, definíciónk nem tökéletes, mert nem illik számos más alakzatra, amelyeket különben fraktálnak szokás nevezni." defe2 "Viszont rámutat a fraktálok egy érdekes tulajdonságára," defe3 "mely a matematikusok táborán kívül is nagyon népszerű." defe4 "A Hausdorff-Besicovich dimenziót \"fraktáldimenzió\"-nak is hívják." ######################################################### #escape.xaf escape "A fraktálok matematikája 2. fejezet \"Szökési sebesség\" típusú fraktálok" escape1 "Bizonyos fraktálok (pl. a hópehely-görbe) egyszerű módon készülnek." escape2 "A XaoS programmal más típusú fraktálok gyárthatók: az ún. szökési sebességen alapuló fraktálok." escape3 "Kicsit másképpen hozhatók létre, de az eljárás lényege itt is az iteráció." #escape4 "They treat the whole screen as #a complex plane" escape4 "Képzeljük el a számítógép képernyőjét úgy, mintha az a komplex számsík lenne!" escape5 "A valós tengely (a szokásos számegyenes) vízszintesen," escape6 "a képzetes tengely függőlegesen helyezkedik el." escape7 "Minden egyes ponthoz egy-egy pálya tartozik." escape8 "Ezt a pályát az f(z,c) függvénnyel számítjuk ki iteratív módon, ahol z a pálya előző pozícióját, c pedig a következő pozíciót jelenti komplex számban kifejezve a képernyő koordináta-rendszerében." escape9 "Például a Mandelbrot-halmaz esetében az iteratív függvény a z=z^2+c." orbit1 "Képzeljük el, hogy a 0-0.6i komplex számhoz tartozó pályát akarjuk bejárni!" orbit2 "Ezt a számot először c-be tesszük." orbit3 "A függvény első iteráltja a z=0+0i komplex szám: a pálya az origóból indul." orbit3b "Ezután ismételten kiszámítjuk az iterációt, minden egyes lépésben újabb z számokat kapva." orbit4 "Ha a pálya véges területen belül marad, a c számot bevesszük a halmazba, ellenkező esetben nem. Ez a Mandelbrot-halmaz definíciója." orbit5 "Esetünkben ez történt." orbit6 "Világosan látszik, hogy definíciónk alapján a c számot reprezentáló pont a halmaz belsejében van." orbit7 "Más esetekben gyakran a végtelenbe tart az iteráció, sok esetben igen gyorsan" orbit8 "(például a 10+0i szám első iteráltja 110, a második 12110 és így tovább...)" orbit9 "A végtelenbe tartó pályák c pontjai kívül esnek a halmazon." bail1 "Bár eddig végtelen sok számról, s ezen végtelen sok szám iterációjáról volt szó," bail2 "mégis, mivel a számítógépek csak véges mennyiségekben tudnak \"gondolkozni\", a fraktálokat nem tudjuk pontosan előállítani, csak közelítőleg." bail3 "Bebizonyítható, hogy ha a pálya az origótól 2 egységnél távolabbra távozik el, akkor az a pálya egészen biztosan a végtelenbe tart." bail4 "Ezért minden esetben abbahagyjuk a számolást, amint a pálya az előző, ún. kilépési teszten elbukik." bail5 "Ha tehát egy pont a halmazon kívül esik, egészen biztos, hogy csak véges sok lépésnyi számítást kell elvégeznünk." bail6 "Így készül a halmaz körüli csodálatos színkavalkád." bail7 "A külső pontokat olyan sorszámú színnel festjük be, ahány lépés után a pálya kilép a 2 sugarú origó körüli körből." iter1 "A halmaz belsejében viszont továbbra is végtelen sok számítást kéne elvégeznünk." iter2 "Hogy ezt elkerüljük, egy bizonyos lépésszám után mindenképpen leállítjuk a számolást, s a közelítő eredményt rajzoljuk ki a képernyőre." iter3 "Ezáltal az iteráció lépésszámának maximuma meghatározza, hogy a közelítő rajz mennyire lesz pontos." iter4 "Ha a maximális lépésszám 0, azaz egyáltalán nincs iteráció, egyetlen, 2 sugarú kört kapnánk az origó körül." iter5 "Ha a maximális pályahosszot egyre nagyobb lépésszámokkal határozzuk meg, a megjelenő kép egyre pontosabban adja vissza a halmazt, de a számítások időtartama is jóval hosszabb lesz." limit1 "A XaoS program alaphelyzetben 170 lépésnyi iterációval dolgozik." limit2 "Vannak olyan területek, ahová sokáig belenagyíthatunk anélkül, hogy elérnénk ezt a maximumot." limit3 "Más helyeken elég hamar pontatlan, durva részleteket kapunk." limit4 "Ilyenkor a kép kevésbé látványos." limit5 "Ellenben ha az iterációk lehetséges maximumát megnöveljük, nagyon sok új, érdekes részletet láthatunk meg." ofracts1 "A XaoS program többi fraktáljához más formulák és kilépési tesztek tartoznak, de a számolási eljárás lényegében ugyanez mindenütt." ofracts2 "Olyan sok számításra van szükség, hogy a XaoS programba számos optimalizációs eljárást is be kellett építeni. Ezekről az eljárásokról részletesen a dokumentációban olvashat az érdeklődő felhasználó." ######################################################### #anim.xhf anim "Mit tud a XaoS...? Animációk és pozíciófájlok" anim2 "Talán észrevetted már, hogy a XaoS program képes animációk és bemutatók, leírások visszajátszására." anim3 "Ezeket közvetlenül a XaoS segítségével rögzítettük." languag1 "Az animációk és a pozíció-fájlok egy egyszerű parancsnyelv segítségével adhatók meg" languag2 "(a pozíció-fájlok lényegében egy képkockát tartalmazó animációk)." languag3 "Az animációkat a későbbiekben \"kézzel\" át is lehet alakítani, ha még professzionálisabb hatást kívánunk elérni." languag4 "A XaoS program legtöbb animációja teljes egészében manuálisan készült, egyetlen pozíció-fájlból kiindulva." modif1 "A következő módosítással" modif2 "távolodó hatást érünk el," modif3 "ezzel pedig felnagyítjuk a halmazt." newanim "Teljesen új animációk és effektusok is készíthetők." examples "A XaoS programban számos beépített animáció van, melyek a save/load menüből véletlenszerűen betölthetők." examples2 "Pozíciófájlok módosításával egyéb segédprogramok segítségével további bemutatók állíthatók össze." examples3 "Korlátokat csak a fantáziád szabhat - és a beépített parancsnyelv, melyet a dokumentációban ír le részletesen." ######################################################### #barnsley.xaf intro4 "Bevezetés a fraktálok világába 5. fejezet Barnsley formulája" barnsley1 "A Michael Barnsley által bevezetett formula" barnsley2 "generálja ezt a furcsa fraktált." barnsley3 "Belenagyítani nem annyira izgalmas," barnsley4 "de szép Julia-halmazai vannak!" barnsley5 "Érdekessége az ún. kristályvonal-struktúra," barnsley6 "ami eltér a szokásos \"organikus\" struktúrától." barnsley7 "Michael Barnsley nevéhez további fraktálok is fűződnek." barnsley8 "A most látható is ezek egyike." ######################################################### #filter.xaf filter "Mit tud a XaoS...? Szűrők" ######################################################### #filter.xhf filter1 "Szűrőnek nevezzük azokat az effektusokat, melyeket az egyes fraktálok kiszámítása után hajthatunk végre, kissé módosítva ezzel a megjelenő képet." filter2 "A XaoS programba beépített szűrők a következők:" motblur "motion blur (elkent mozgás);" edge "kétféle edge detection (szél-felismerés):" edge2 "az elsővel vastagabb vonalak készíthetők, melyet nagy felbontásnál érdemes használni," edge3 "a másikkal vékonyabb vonalak jelennek meg;" star "csillagmező-szűrő (star-field);" interlace "ún. interlace-szűrő: használatával a számítások felgyorsíthatók, s nagyobb felbontásnál a motion blur-höz hasonló effektust kapunk;" stereo "véletlen pontokból összeállított (random dot) sztereogram-szűrő" stereo2 "(ha a következő képeken semmit sem látsz, de máskor a sztereogramok működni szoktak, akkor talán a képernyő mérete nincs jól beállítva - futtasd a XaoS-t \"-help\" paraméterrel és olvasd el az ott leírt információkat);" emboss1 "dombormű (emboss);" #ÚJ palettef1 "paletta-emulátor (true-color képernyőkön színforgatásra ad módot);" #ÚJ truecolorf "true-color szűrő (true-color képeket generál 8 bites színmélységnél is)." ######################################################### #fractal.xaf end "Vége." fcopyright "Bevezetés a fraktálok világába Írta: Jan Hubička 1997 júliusában, illetve később további módosításokat eszközölt Magyar fordítás: Kovács Zoltán " suggestions " Bármiféle megjegyzést, ötletet, javaslatot, köszönetnyilvánítást, és hibajelentést a xaos-discuss@lists.sourceforge.net címre várunk. Köszönjük!" ######################################################### #incolor.xaf incolor1 "Általában a halmaz belsejében lévő pontokat ugyanazzal a színnel ábrázoljuk." incolor2 "A halmaz határai ily módon jól láthatóak, de a halmaz belseje unalmas látvány." incolor3 "Érdekesebbé tehető a kép, ha a pálya utoljára számított pontjának koordinátái alapján rendelünk színt a belső pontokhoz." incolor4 "A XaoS program 10-féle lehetőséget kínál ennek megvalósítására. Ezek az ún. belső színezési módok (\"in coloring modes\")." zmag "zmag (z-nagyság) A pálya utolsó pontjának abszolút értéke alapján színezzük a belső pontot." ######################################################### #innew.xaf innew1 "Decomposition like (dekompozíciószerű) Lásd a külső színezéseket, ez teljesen ugyanaz, mint az ott leírt. " innew2 "real/imag (valós/képzetes) A pálya utolsó pontjának valós részét elosztjuk a képzetes résszel, s ez alapján színezünk." innew3 "A következő hatféle színezési mód formulái vagy véletlenszerűek, vagy más programokból lettek átvéve." ######################################################### #intro.xaf fractal "Fraktálok..." fractal1 "Mit is nevezünk fraktálnak?" fractal2 "Benoit Mandelbrot definíciója: fraktálnak olyan halmazt nevezünk, melynek Hausdorff-Besicovich dimenziója határozottan nagyobb, mint topologikus dimenziója." fractal3 "Még mindig nem világos?" fractal4 "Semmi baj! Ez a definíció csupán matematikusok számára fontos." fractal5 "Hétköznapi fogalmazással a fraktál olyan alakzat" fractal6 "mely bizonyos részekből áll," fractal7 "minden egyes rész az egész fraktálhoz nagyon hasonló kicsinyített kópia." fractal8 "Ez az eljárás önmagát ismétli:" fractal9 "így épül fel a teljes fraktál." facts "A fraktálok számos meglepő tulajdonsággal rendelkeznek:" fact1 "nemigen változnak, ha kicsinyítjük vagy nagyítjuk őket," fact2 "önhasonlók," fact3 "és olyan, a természetben is előforduló alakzatokhoz hasonlítanak, mint például a felhők, hegyek vagy a partvonalak." # Az előbbi két sor majd fact4-ként kell, hogy álljon! # Last two lines will be cited as fact4. KZ fact5 "Nagyon sok matematikai struktúra fraktált határoz meg," fact6 "olyasmit, ami a képernyőn is látható." fmath4 "A legtöbb fraktál iteratív eljárással készül: egy egyszerű lépés sokszori alkalmazásával." fmath5 "Ilyen például a Koch-görbe néven ismert fraktál," fmath6 "melyet egyetlen vonal átalakításával kapunk oly módon," fmath7 "hogy négy másikkal helyettesítjük." fmath8 "Ez az iteráció első lépése." fmath9 "Ezt az átalakítást azután megismételjük." fmath10 "Az alakzat két iteráció után..." fmath11 "3 iteráció után..." fmath12 "4 iteráció után..." fmath13 "A végtelen sok iteráció után keletkezett alakzatot tekintjük fraktálnak." fmath14 "A kapott alakzat hasonlít egy hópehely-forma harmadrészéhez." tree1 "Sok más alakzat készíthető hasonló eljárásokkal." tree2 "Például ha egy vonalat egy kicsit más módon alakítunk át," tree3 "egy fát kapunk." nstr "Az egyes iterációk során a fraktálokban véletlen zajokat, hibákat is létrehozhatunk." nstr2 "Egy vonalat két vonallá" nstr3 "alakítva, s kis zajt hozzáadva" nstr4 "partvonalhoz hasonló fraktálok jöhetnek létre." nstr5 "Talán hasonló módon születnek a felhők, hegyek és a természet sok más alakzata." ####################################################### ## mset.xaf fact7 "A legismertebb fraktál kétségtelenül a..." mset "...Mandelbrot-halmaz," mset1 "melyet egy nagyon egyszerű képlet:" mset2 "generál - mégis ez az egyik legszebb fraktál." mset3 "Mivel a Mandelbrot-halmaz fraktál," mset4 "a határán" mset5 "a teljes halmaz miniatűr másai láthatók." mset6 "Ez közülük a legnagyobb. Kb. 50-szer kisebb a teljes halmaz méreténél." mset7 "A Mandelbrot-halmaz nem teljesen önhasonló:" mset8 "minden miniatűr kópia egy kicsit más." mset9 "Ez itt kb. 76000-szer kisebb a teljes halmaznál." mset10 "A halmaz más és más részén az eltérések is különfélék lehetnek." nat "A halmaz határán nem csak a teljes halmaz másait figyelhetjük meg," nat1 "hanem ténylegesen végtelen sok lényegesen különböző formát!" nat2 "Néhány közülük meglepően hasonlít természeti képződményekre:" nat3 "láthatunk fákat," nat4 "folyókat tavakkal," nat5 "galaxisokat" nat6 "és vízeséseket." nat7 "A Mandelbrot-halmaz egyes részletei sci-fi novellák hőseire is emlékeztethetnek..." ############################################################################### ############ juliach "Bevezetés a fraktálok világába 2. fejezet Julia-halmazok" julia "Nem csak a Mandelbrot-halmaz képlete a z=z^2+c formula, hanem" julia1 "egy másiké is..." julia2 "...a Julia-halmazé." julia3 "Nem csupán egy Julia-halmaz létezik," julia4 "hanem végtelen sok." julia5 "Mindegyiket más és más \"mag\" segítségével hozzuk létre," julia6 "a magot pedig a Mandelbrot-halmazból választjuk." julia7 "A Mandelbrot-halmaz úgy is tekinthető, mint különböző Julia-halmazok térképe." julia8 "A Mandelbrot-halmaz belső mag-pontjaihoz olyan Julia-halmazok tartoznak, melyeknek nagy, összefüggő fekete területeik vannak." julia9 "A Mandelbrot-halmaz külső pontjaihoz ún. \"nem összefüggő\" Julia-halmazok tartoznak." julia10 "A legérdekesebb Julia-halmazoknál a mag-pontot a Mandelbrot-halmaz határáról választjuk." theme "A Julia-halmazok részletei, \"témája\" általában azon múlik, hogy hol választjuk a mag-pontot." theme1 "A Mandelbrot-halmazba belenagyítva a látott \"témához\" nagyon hasonló fraktált kapunk, ha" theme2 "átkapcsolunk a megfelelő Julia-halmazra." theme3 "De a nagyítást visszaállítva" theme4 "azt tapasztaljuk, hogy egy teljesen más fraktált vizsgálunk." theme5 "Lehet, hogy úgy tűnik: a Julia-halmazok elég unalmasak, hiszen tematikájuk nemigen változik." theme6 "A mag-pont választásával már szinte minden meghatározott." theme7 "Azonban ügyesen megválasztott mag-pont segítségével" theme8 "szép képek hozhatók létre." ######################################################### #keys.xhf keys "Irányítás (billentyűzetről): S - az animáció leállítása Szóköz - egy képkocka kihagyása (lehet, hogy várni kell) Bal/Jobb - a feliratok megjelenési időtartamának beállítása" ######################################################### #magnet.xaf intro7 "Bevezetés a fraktálok világába 8. fejezet Magnet (mágnes)" magnet "Ez NEM a Mandelbrot-halmaz." magnet1 "Az itt látható fraktált \"mágnesnek\" hívják, mivel a képletét a kísérleti fizikából vették át." magnet2 "Mágneses renormalizációs transzformációkkal kapcsolatos elméleti rácsok tanulmányozásakor fedezték fel." #Eredeti angol szöveg: #"It is derived from the study #of theoretical lattices in the #context of magnetic renormalization #transformations." #Kérném, hogy egy fizikus ellenőrizze! KZ #The translation should be verified by a physician! KZ similiar "Azért is érdekes a Mandelbrot-halmazhoz való hasonlósága, mert a fraktált előállító formula a valóságban is előfordul." magjulia "A hozzá tartozó Julia-halmazok nagyon szokatlanok." magnet3 "Van egy másik mágnes-fraktál is." ######################################################### #new.xaf new "Mi új a 3.0-s verzióban?" speed "1. Gyorsabb működés" speed1 "A fő számítási ciklusokat \"kibontottuk\", s beépítettük a a periodicitás ellenőrzését." speed2 "Az új képeket szél-felismerési eljárással számítjuk ki." speed3 "Így az újonnan számított képek megjelnítése sokkal gyorsabb lett." speed4 "Például ha a Mandelbrot-halmazt egymillió iterációval számítjuk ki..." speed5 "számítás kezdete..." speed6 "kész!" speed7 "A XaoS program tartalmaz egy olyan heurisztikát is, mellyel a periodicitás-ellenőrzés automatikusan kikapcsol, ha a számított pont valószínűleg a halmazon kívülre esik (amennyiben a szomszédos pontok közül mind a halmazon kívül van)." speed8 "A fő nagyító rutinokat is optimalizáltuk, ezzel kb. kétszeresére növelve a korábbi gyorsaságot." speed9 "A XaoS program most már 130 FPS (kép/másodperc) lejátszási sebességre képes egy 130 Mhz-es Pentiumon." new2 "2. Szűrők (filters)" new3 "3. Kilenc külső színezési mód (out-coloring modes)" new4 "4. Új belső színezési módok (in-coloring modes)" new5 "5. True-color színezési módok" new6 "6. Animáció mentése és visszajátszása" newend "Továbbá számos egyéb fejlesztés, pl. a kép forgatása, jobb paletta-generálás... A ChangeLog fájlban követhetők az új változtatások." #ÚJ ######################################################### #newton.xaf intro3 "Bevezetés a fraktálok világába 4. fejezet A Newton-algoritmus" newton "Ezt a fraktált egy teljesen más képlet hozza létre:" newton1 "a Newton-féle numerikus gyökvonó eljárás, mellyel az x^3=1 egyenlet megoldásait keressük." newton2 "Azt vizsgáljuk, hogy hány iteráció szükséges ahhoz, hogy egy kiinduló számból eljussunk valamelyik gyök egy megfelelő közelítéséhez." newton3 "A három egységgyököt kék körök jelzik." newton4 "A legérdekesebbek azok a részek, ahol a kiinduló szám kb. egyforma távolságra van legalább két egységgyöktől." newton5 "Ez a fraktál túlságosan is önhasonló, ezért talán nem is annyira érdekes." newton6 "De a XaoS programmal \"Julia-szerű\" halmazok is készíthetők," newton7 "melyben a mag-pont a közelítés hibája lesz." newton8 "Ezáltal a Newton-féle fraktál talán kicsit érdekesebb." newton9 "A XaoS program egy másik Newton-fraktált is ismer." newton10 "Ez a kép a Newton-féle 4. gyök-vonó algoritmust mutatja be." newton11 "A négy gyököt kék körök szemléltetik." ######################################################### #octo.xaf intro6 "Bevezetés a fraktálok világába 7. fejezet Octo" octo "Az Octo nem igazán ismert fraktál." octo1 "A XaoS programba szokatlan formája miatt került be." octo2 "A XaoS programmal a Newton-féle fraktálhoz hasonlóan itt is készíthetünk \"Julia-szerű\" halmazokat." ######################################################### #outcolor.xaf outcolor "Külső színezési módok (out coloring modes)" outcolor1 "A Mandelbrot-halmaz unalmas fekete tó a képernyő közepén..." outcolor2 "Az őt körülvevő színes csíkok mutatják a halmaz határait." outcolor3 "Általában a színezést a kilépési teszt elbukásának gyorsasága adja meg." outcolor4 "Vannak azonban másféle színezési lehetőségek is." outcolor5 "A XaoS programban ezeket külső színezési módoknak hívjuk." iterreal "iter+real (iteráció+valós) A határon lévő színeket úgy határozzuk meg, hogy a pálya utolsó pontjának valós részét hozzáadjuk az iterációk számához." iterreal1 "A kicsit unalmas képek ezzel a módszerrel érdekesebbé tehetők." iterimag "Az iter+imag (iteráció+képzetes) eljárás hasonló az iter+real módszerhez." iterimag2 "Az egyetlen különbség, hogy most a képzetes részt vesszük figyelembe a valós rész helyett." iprdi "iter+real/imag (iteráció+valós/képzetes) Ezzel a módszerrel a határhoz közel lévő pontok színezésénél az iterációk számához hozzáadjuk az utolsó pont valós és képzetes részének hányadosát." sum "iter+real+imag+real/imag (iteráció+valós+képzetes+ +valós/képzetes) Az előzőekhez analóg módon készül." decomp "binary decomposition (bináris dekompozíció) Ha a képzetes rész pozitív, ez az eljárás az iterációszámmal színez. Ellenkező esetben az iterációk maximális számából levonja a bináris dekompozíció iterációszámát." bio "biomorphs (élő alakok) Az ezzel készített fraktálok hasonlítanak az egysejtű élőlényekre: ezért a fenti név." ######################################################### #outnew.xhf potential "potential (potenciál) Ez a színezési mód nagyon jól néz ki true-color üzemmódban, ha nem nagyítjuk ki a fraktált." cdecom "color decomposition (szín-dekompozíció)" cdecom2 "Ebben az eljárásban a pálya utolsó pontjának argumentumából számítjuk ki az aktuális színt." cdecom3 "A módszer hasonlít a bináris dekompozícióhoz, csak itt folytonos a színátmenet." cdecom4 "A Newton-féle fraktál esetében ezzel a színezéssel megállapítható, hogy a sorozat melyik gyökhöz konvergál." smooth "smooth (sima) Ez az eljárás megpróbálja eltávolítani az iterációk által okozott sávos színezést folytonos színátmenetek alkalmazásával." smooth1 "A Newton-halmazra nem működik, és a Mágnes fraktálra sem, mivel ezeknek ún. véges attraktoruk van." smooth2 "Emellett csak true-color üzemmódban használható nagyobb színmélységeknél. Tehát 8 bites színmélység használatánál be kell kapcsolni a true-color szűrőt." ######################################################### #phoenix.xhf intro5 "Bevezetés a fraktálok világába 6. fejezet Phoenix" phoenix "Az ábrán a Phoenix nevű formulához tartozó Mandelbrot-halmaz látható." phoenix1 "Nem hasonlít a XaoS programban látható többi fraktálhoz, de van némi hasonlóság a Mandelbrot-halmaz és eközött:" phoenix2 "a Phoenix-halmaznak is van egy \"farka\", mely a teljes halmaz miniatűr kópiáit tartalmazza," phoenix3 "s láthatóan a Mandelbrot- és Julia-témákban is van hasonlatosság," phoenix4 "ellenben a Julia-halmazok egészen másak, mint Mandelbrot-szerű megfelelőik." ######################################################### #plane.xaf plane1 "A komplex síkon vizsgálódva egy pont valós részét rendszerint a képernyő x-koordinátájához, míg képzetes részét az y-koordinátához rendeljük." plane2 "A XaoS program 6 további hozzárendelést biztosít." plane3 "1/mü Inverzió. A végtelenhez \"közeli\" pontokat az origó közelébe, az origó környékén lévő pontokat a végtelen távoli pontok \"környékére\" transzformáljuk. A hozzárendelés érdekessége, hogy végtelenül le lehet kicsinyíteni a fraktált: soha nem \"tűnik el\" a képernyőről." plane4 "Az eredeti Mandelbrot-halmaz..." plane5 "illetve az invertált mása." plane6 "A halmaz eredetileg középen volt; most az egészet \"kifordítottuk\". A végtelenül nagy külső fekete terület az origó környékén lévő eredeti halmaz." plane7 "A következő néhány képen először normális hozzárendeléssel, majd inverzión keresztül láthatjuk a számítások eredményét." plane8 "1/mü+0.25 Szintén inverzió, csak a pólust változtattuk meg." plane9 "Mivel az inverzió középpontja (pólusa) most a halmaz határán fekszik, végtelen parabolaszerű határokat láthatunk." plane10 "Alkalmazásával más fraktálokon is érdekes hatásokat érhetünk el, mivel az eljárás megtöri a szimmetriát." lambda "A lambda-sík egy egészen más nézetből mutatja a számított fraktált." ilambda "1/lambda A lambda-sík és az inverzió kombinációja." imlambda "1/(lambda-1) A lambda-sík, egy eltolás és az inverzió kombinációja." imlambda2 "Ez az eljárás nagyon érdekesen változtatja meg a Mandelbrot-halmazt." mick "1/(mü-1.40115) Szintén inverzió, de a pólust most egy Feigenbaum-pontba toltuk el. (A Mandelbrot-halmaz a Feigenbaum-pontokban kvázi-önhasonló.) Az önhasonlóság így jobban vizsgálható." ######################################################### #power.xaf intro2 "Bevezetés a fraktálok világába 3. fejezet Magasabbfokú Mandelbrot-halmazok" power "Nem csupán a z^2+c képlettel készíthetünk fraktálokat." power2 "Csak egy kissé módosítva képletünket: az x^3+c formula a Mandelbrot-halmazhoz hasonló fraktált hoz létre." power3 "Ez a fraktál is sok-sok példányban tartalmazza a teljes halmaz kicsinyített mását." power4 "Hasonló fraktálok gyárthatók, ha a képleteket kicsit megváltozatjuk." pjulia "Ezeknek a halmazoknak is létezik a megfelelő Julia-halmazuk." ######################################################### #truecolor.xaf truecolor "True-color színezési módok" truecolor1 "A fraktálokat rendszerint egy rögzített színpaletta használatával festjük ki. A true-color üzemmódban paletta-emuláció történik." truecolor2 "Az egyetlen különbség az, hogy több színt tartalmazó palettát használunk, folytonos színátmenetekkel." truecolor3 "A true-color üzemmód egy egészen speciális technikát használ. A fraktál számításakor kapott paraméterek közül többet is felhasználunk," truecolor4 "hogy egy konkrét színt legeneráljunk, s ne csak egyetlen színsorszámot hozzunk létre." truecolor5 "Ezzel a módszerrel egyetlen pixelhez négy számítási érték is hozzátartozhat." truecolor6 "A true-color üzemmódban természetesen \"valódi színekre\" van szükség. Így a 8 bites színmélységű megjelenítésnél a true-color szűrőt is be kell kapcsolni." ######################################################### #pert.xaf #ÚJ (egészen a fájl végéig) pert0 "Perturbáció" pert1 "A Julia-halmazoknál más és más mag-pontokkal más és más fraktálok hozhatók létre ugyanazon képlettel." pert2 "Ehhez hasonlóan a Mandelbrot-halmaz is parametrizálható perturbáció hozzáadásával." pert3 "A kiinduló z számot ily módon megváltoztathatjuk: az alapérték 0." pert4 "A perturbáció-változtatás a megjelenített képre nincs akkora hatással, mint a Julia-halmazok magpont-választása, de a fraktál ezáltal véletlenszerűbbé tehető." ########################################################## #palette.xaf pal "Véletlenszerű paletták" pal0 "A XaoS programba nem építettünk be előre elkészített színpalettákat (ez más programoknál gyakori). A XaoS véletlenszerűen színez." pal1 "Egyszerűen nyomogasd a 'P' gombot, amíg a XaoS program olyan palettát generál, ami megfelel az általad vizsgált fraktál számára!" pal2 "Három különböző módszer használatos:" pal3 "Az egyikkel egy bizonyos színtől a feketéig készítünk árnyalatokat." pal4 "A másodikkal a fekete színtől egy bizonyos színen keresztül a fehérhez jutunk el." pal5 "A harmadik módszert kubista festmények inspirálták." ########################################################### #other.xaf auto1 "Autopilot (Robotpilóta)" auto2 "A lusta felhasználók a robotpilóta segítségével hátradőlve nézhetik a XaoS program automatikus fraktál-bejárását." fastjulia1 "Gyors Julia-böngésző mód" fastjulia2 "Ebben az üzemmódban a Julia-halmaz közvetlenül vizsgálható a mag-pont interaktív választásával." fastjulia3 "A Julia-halmaz konkrét kirajzolása előtt érdemes használni, mivel közelítőleg máris látható, hogy a kép milyen témájú lesz belenagyítás után." rotation "Képforgatás" cycling "Színforgatás" bailout "Kilépési teszt" bailout1 "A képen a Mandelbrot-halmaz látható 'smooth' külső színezéssel." bailout2 "Ha a kilépési értéket 64-re állítjuk, a színátmenetek finomabbak." bailout3 "A legtöbb fraktál csak kevéssé ölt más formát, ha a kilépési értéket megváltoztatjuk." bailout4 "A Barnsley-fraktálokra ez azonban nem igaz." ############################################## #for file trice.xaf trice1 "A Triceratops és a Catseye (macskaszem) fraktálok" trice2 "A kilépési érték csökkentésekor" trice3 "a szökési idejű fraktálok" trice4 "rendszerint más formát adnak," trice5 "mint az eredeti paraméternél." trice6 "Ezzel a módszerrel igen érdekes" trice7 "minták állíthatók elő ugyanazon szín" trice8 "különböző területen való megjelenésekor." trice9 "A Triceratops fraktál is" trice10 "ezen a módon készült." trice11 "Sok hasonló kép készíthető" trice12 "a Triceratops fraktálon belül." trice13 "Mint neve is mutatja, a Macskaszem fraktál" trice14 "egy macska szeméhez hasonlít." trice15 "Ha növeljük a kilépési értéket..." trice16 "...sokkal érdekesebb képhez jutunk..." trice17 "...buborékokkal..." trice18 "...és szép Julia halmazokkal." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar és Spider" fourfr2 "Ez a Mandelbar halmaz." fourfr3 "Képlete: z = (conj(z))^2 + c" fourfr4 "Néhány Julia halmaza érdekes." fourfr5 "De nézzünk más fraktálokat is." fourfr6 "A Lambda fraktál struktúrája" fourfr7 "nagyon hasonlít a Mandelbrotéhoz." fourfr8 "Olyan, mintha a Mandelbrot halmazt a lambda síkra vetítenénk." fourfr9 "De a Lambda fraktál maga egy Julia halmaz íme, itt az igazi MandelLambda halmaz." fourfr10 "...gyors Julia-mód..." fourfr11 "Ez pedig a Manowar fraktál." fourfr12 "Egy Fractint felhasználó találta." fourfr13 "Az egész halmazhoz hasonló Julia halmazai vannak." fourfr14 "Ez pedig a Spider." fourfr15 "Ezt is egy Fractint felhasználó találta." fourfr16 "Ennek is hasonlók a Julia halmazai az eredeti halmazhoz." ############################################## #for file classic.xaf classic1 "Sierpinski-háromszög, Sierpinski szőnyeg, Koch-féle hópehely" classic2 "Ez a híres Sierpinski-háromszög." classic3 "Ez itt a szökési időn alapuló változata." classic4 "Az alakját más és más 'Julia maggal'" classic5 "lehet megváltoztatni." classic6 "Ez a fraktál a Sierpinski-szőnyeg." classic7 "Íme a szökési időn alapuló változata." classic8 "Híres fraktál ez is." classic9 "Végül pedig íme a Koch-féle hópehely" classic10 "szökési idejű változata." ############################################## #for file otherfr.xaf otherfr1 "További fraktáltípusok a XaoS programban" ############################################## #for file new4.xaf new_4 "Mi új a 4.0-s verzióban?" new_4_1 "A XaoS 4.0-s verziójában nincs annyi újdonság, mint a korábbi változatokban. Ez a verzió főként hibajavításokra és az új Qt grafikus meghajtóra koncentrál, mely minden rendszeren korszerű megjelenést biztosít." new_4_2 "Ezen kívül néhány új fajta fraktál jeleníthető meg, mivel a felhasználói képleteknél az iterációk száma (n) is megadható." new_4_3 "Például a z=z±1/z formulát a a z+(1/z)*(-1)^n képlet beírásával lehet előállítani." XaoS-release-4.3.2/catalogs/it.cat000066400000000000000000000772601455214672000167340ustar00rootroot00000000000000# Message catalog file required to replay XaoS tutorials in # English language # # Copyright (C) 1997 by Jan Hubicka # # Corrected by Tim Goowin # Further corrections by David Meleedy # And some more by Nix # # There are a few things you should know if you want to change or # translate this file. # # The format of this catalog is identifier[blanks]"value"[blanks] # # Identifier is a key used by the program. Do not translate it! Only # translate the value. If you want a quote character `"' in the text, # use `\"'. For `\' use `\\'. Don't use `\n' for enter; use a literal # newline. # # If you wish to translate this file into any new language, please let # me know. You should translate this text freely: you don't need to use # exactly the same sentences as here, if you have idea how to make text # more funny, interesting, or add some information, do it. # # You can use longer or shorter sentences, since XaoS will automatically # calculate time for each subtitle. # # Also, please let me have any suggestions for improving this text and # the tutorials. # ######################################################### #For file dimension.xaf fmath "La matematica che sta dietro ai frattali" fmath1 "I frattali sono un campo piuttosto nuovo della matematica, per cui ci sono ancora molte questioni irrisolte." fmath2 "Perfino le definizioni non sono precise." fmath3 "Solitamente viene chiamato frattale un oggetto contenente una qualche autosomiglianza." def1 "Una delle possibili definizioni è..." #Definition from the intro.xaf is displayed here. #If it is a problem in your language catalog, let me #know and I will create a special key def2 "Cosa significa tutto ciò?" def3 "Per spiegarlo dobbiamo prima capire cosa sono le dimensioni topologiche e le dimensioni di Hausdorff Besicovich." topo1 "La dimensione topologica è la \"normale\" dimensione." topo2 "Un punto ha 0 dimensioni." topo3 "Una linea ha 1 dimensione." topo4 "Una superficie ha 2 dimensioni, ecc..." hb1 "La definizione di dimensione di Hausdorff Besicovich deriva dal semplice fatto che:" hb2 "Un segmento ingrandito due volte risulta lungo il doppio della misura iniziale." hb3 "Per contro, la dimensione di un quadrato ingrandito allo stesso modo aumenta di quattro volte." hb4 "Regole simili funzionano anche per dimensioni maggiori." hb5 "Per calcolare le dimensioni che si ottengono da tutto ciò, si può utilizzare la seguente equazione:" hb6 "dimensione = log s / log z dove z è l'ingrandimento e s è la variazione di misura" hb7 "per un segmento con ingrandimento 2, la variazione di misura è anch'essa 2. log 2 / log 2 = 1" hb8 "per un quadrato con ingrandimento 2, la variazione di misura risulta 4. log 4 / log 2 = 2" hb9 "Questa definizione dà poi gli stessi risultati per le forme tradizionali." hb10 "Le cose diventeranno più interessanti con i frattali..." hb11 "Consideriamo una curva a fiocco di neve," hb12 "creata frazionando ripetutamente un segmento in quattro segmenti." hb13 "I nuovi segmenti misurano 1/3 del segmento originale." hb14 "Dopo averli ingranditi 3 volte, risulteranno lunghi esattamente come le linee originali." hb15 "A causa della autosomiglianza creata dalla ripetizione infinita di questa metamorfosi," hb15b "ognuna di queste parti diventerà una copia esatta del frattale originale." hb16 "Dato che esistono 4 di queste copie, la misura del frattale cresce di 4 volte." hb17 "Mettendo questi valori nell'equazione: log 4 / log 3 = 1.261" hb18 "otteniamo un valore maggiore di 1 (La dimensione topologica della curva)." hb19 "La dimensione di Hausdorff Besicovich (1.261) è maggiore della dimensione topologica." hb20 "In accordo con questa definizione, il fiocco di neve è un frattale." defe1 "Questa definizione comunque non è perfetta, dato che esclude un gran numero di forme che sono frattali." defe2 "Però mette in mostra una delle proprietà interessanti dei frattali," defe3 "che risulta piuttosto nota." defe4 "La dimensione di Hausdorff Besicovich viene spesso chiamata anche \"dimensione frattale\"" ######################################################### #For file escape.xaf escape "La matematica che sta dietro ai frattali capitolo 2 - Frattali con tempo di fuga" escape1 "Alcuni frattali (come il fiocco di neve) sono creati attraverso semplici suddivisioni e ripetizioni." escape2 "XaoS può generare una diversa categoria di frattali, chiamati frattali con tempo di fuga." escape3 "Il metodo per ottenerli è in qualche modo diverso, ma è basato anche sull'utilizzo di iterazioni." escape4 "Questi frattali considerano l'intero schermo come un piano complesso." escape5 "L'asse reale è posto orizzontalmente" escape6 "e quello immaginario verticalmente." escape7 "Ogni punto possiede la sua orbita," escape8 "la traiettoria della quale è calcolata usando la funzione iterativa f(z,c), dove z è la posizione precedente e c è la nuova posizione sullo schermo." escape9 "Nell'insieme di Mandelbrot, ad esempio, la funzione iterativa è z=z^2+c" orbit1 "Nel caso volessimo esaminare il punto 0 - 0.6i," orbit2 "assegniamo il valore stesso a c." orbit3 "L'iterazione dell'orbita inizia a z=0+0i," orbit3b "quindi calcoliamo ripetutamente la funzione iterativa, ottenendo ad ogni passaggio un nuovo valore z da utilizzare nell'iterazione successiva." orbit4 "Delimitiamo il punto appartenente all'insieme, nel caso in cui l'orbita risulti finita." orbit5 "In questo caso lo è..." orbit6 "Questo punto, quindi, risulta interno all'insieme." orbit7 "In altri casi sarebbe andato velocemente all'infinito." orbit8 "(ad esempio con il valore 10+0i La prima iterazione risulta 110, la seconda 12110, ecc..)" orbit9 "Tali punti sono esterni all'insieme." bail1 "Stiamo ancora parlando di numeri infiniti e iterazioni di numeri infiniti..." bail2 "Ma i computer sono finiti, quindi non possono calcolare i frattali in maniera esatta." bail3 "Si può dimostrare che nel caso in cui la distanza dell'orbita dal punto zero risulti maggiore di 2, l'orbita stessa andrà sempre all'infinito." bail4 "Possiamo quindi interrompere i calcoli quando l'orbita fallisce questo test. (Questo è chiamato il test di bailout)" bail5 "Se dobbiamo calcolare punti esterni all'insieme, è ora necessario solo un numero finito di iterazioni." bail6 "Tutto questo genera anche le strisce colorate intorno all'insieme." bail7 "La colorazione viene effettuata in base al numero di iterazioni delle orbite che servono a rientrare nell'insieme di bailout." iter1 "All'interno dell'insieme sono ancora necessari un numero infinito di calcoli." iter2 "L'unica via praticabile risulta l'interruzione dei calcoli dopo un dato numero di iterazioni, utilizzando poi i risultati approssimati." iter3 "Il numero massimo di iterazioni specifica dunque quanto sarà esatta l'approssimazione." iter4 "Senza alcuna iterazione viene creato solo un cerchio di raggio 2. (a causa della condizione di bailout)" iter5 "Un maggior numero di iterazioni dà approssimazioni migliori, ma necessita di tempi di calcolo più lunghi." limit1 "XaoS, in maniera predefinita, calcola 170 iterazioni." limit2 "In alcune aree è possibile effettuare molti ingrandimenti senza mai raggiungere questo limite." limit3 "In altre zone risultati inesatti sono raggiunti abbastanza presto." limit4 "Le immagini, in questo caso, non sono molto interessanti." limit5 "Ma incrementando il numero di iterazioni, otteniamo tanti nuovi ed eccitanti dettagli." ofracts1 "Gli altri frattali in XaoS sono calcolati usando differenti formule e test di bailout, ma il metodo utilizzato è principalmente lo stesso." ofracts2 "Sono richiesti così tanti calcoli che XaoS deve eseguire molte ottimizzazioni. Per maggiori dettagli a riguardo consultare la documentazione" ######################################################### #For file anim.xaf anim "Panoramica delle caratteristiche di XaoS Animazioni e file di posizione" ######################################################### #For file anim.xhf anim2 "Come probabilmente avrete notato, XaoS è in grado di riprodurre guide e animazioni." anim3 "Possono essere registrati direttamente da XaoS," languag1 "dal momento che le animazioni e i file di posizione sono memorizzati in un semplice linguaggio a comandi." languag2 "(i file di posizione sono solamente singoli fotogrammi di una animazione)." languag3 "Le animazioni possono essere modificate a posteriori, in maniera manuale, per ottenere risultati più professionali." languag4 "Quasi tutte le animazioni di queste guide sono state create manualmente partendo solo da un file di posizione." modif1 "Un semplice modifica" modif2 "genera un filmato di \"rimpicciolimento\"," modif3 "mentre quest'altra un filmato di \"ingrandimento\"." newanim "È anche possibile creare animazioni ed effetti completamente nuovi." examples "XaoS contiene inoltre molti file di esempio, che possono essere caricati in maniera casuale dal menù salva / carica." examples2 "È anche possibile usare i file di posizione per scambiare informazioni con altri programmi." examples3 "L'unico limite è la propria immaginazione e il linguaggio a comandi descritto in la documentazione." ######################################################### #For file barnsley.xaf intro4 "Una introduzione ai frattali Capitolo 5-La formula di Barnsley" barnsley1 "Un'altra formula, introdotta da Michael Barnsley," barnsley2 "genera questo strano frattale." barnsley3 "Non è molto interessante da esplorare," barnsley4 "ma contiene bellissimi Julia!" barnsley5 "È interessante perché ha una struttura \"cristallina\"," barnsley6 "a differenza della struttura \"organica\" che che si trova in molti altri frattali." barnsley7 "Michael Barnsley ha anche introdotto altre formule." barnsley8 "Una di queste genera questo frattale." ######################################################### #For file filter.xaf filter "Panoramica delle caratteristiche di XaoS filtri" ######################################################### #For file filter.xhf filter1 "Un filtro è un effetto applicato ad ogni fotogramma dopo che il frattale viene calcolato." filter2 "XaoS implementa i seguenti filtri:" motblur "motion blur," edge "filtri di rilevamento due bordi," edge2 "(il primo crea linee ampie ed è utile ad alte risoluzioni," edge3 "il secondo crea linee più strette)," star "un filtro campo stellato semplice," interlace "Un filtro incrociato, (Velocizza i calcoli e produce un effetto \"motion blur\" a risoluzioni più alte)," stereo "Un filtro stereogramma a punti casuali," stereo2 "(se le prossime immagini non sono visualizzate bene, ma solitamente gli stereogrammi a punti casuali sono visibili, è probabile che la dimensione dello schermo non sia configurata correttamente - usa `xaos -help' per maggiori informazioni)," emboss1 "un filtro rilievo," #NEWe palettef1 "un filtro di emulazione tavolozza, (abilita il ciclo dei colori su schermi truecolor)" #NEW truecolorf "un filtro truecolor, (crea immagini truecolor su schermi con 8bpp)." ######################################################### #For file fractal.xaf end "Fine." fcopyright "L'introduzione ai frattali è stata creata da Jan Hubicka nel Luglio 1997 e successivamente modificata e aggiornata per le nuove versioni di XaoS. Correzioni a cura di: Tim Goodwin e David Meleedy e Nix " # Add your copyright here if you are translating/correcting this file suggestions " Tradotto in italiano da: Sergio Zanchetta Inviare qualunque idea, consiglio, ringraziamento, lamentela e segnalazione bug a: jh@ucw.cz Grazie" ######################################################### #For file incolor.xaf incolor1 "Di solito i punti interni dell'insieme sono visualizzati utilizzando un singolo colore a tinta unita." incolor2 "Ciò rende molto visibili i contorni dell'insieme, ma le aree interne all'insieme stesso risultano piuttosto soporifere." incolor3 "Per rendere il tutto un po' più interessante, è possibile utilizzare il valore dell'ultima orbita per assegnare un colore ai punti interni all'insieme." incolor4 "XaoS ha dieci modi differenti per farlo. Sono chiamati \"modi di colorazione interna\"." zmag "zmag Il colore viene calcolato a partire dall'ampiezza dell'ultima orbita." ######################################################### #For file innew.xaf innew1 "Genere scomposizione Funziona allo stesso modo della scomposizione colore per i modi di colorazione esterna. " innew2 "Real / Imag Il colore viene calcolato a partire dalla divisione tra la parte reale dell'ultima orbita e la sua parte immaginaria." innew3 "I prossimi 6 modi di colorazione sono per la maggior parte formule scelte a caso o copiate da altri programmi." ######################################################### #For file intro.xaf fractal "...Frattali..." fractal1 "Cos'è un frattale?" fractal2 "Definizione di Benoit Mandelbrot: un frattale è un insieme per il quale la dimensione di Hausdorff Besicovich è strettamente maggiore della dimensione topologica." fractal3 "Brancolate nel buio?" fractal4 "Non preoccupatevi. Questa definizione è importante solo se siete dei matematici." fractal5 "In termini pratici, un frattale è una forma" fractal6 "costituita da parti" fractal7 "ognuna delle quali è approssimativamente una copia in misura ridotta dell'intero frattale." fractal8 "Questo processo si ripete all'infinito" fractal9 "per creare l'intero frattale." facts "I frattali sono caratterizzati da proprietà sorprendenti:" fact1 "I frattali non dipendono dalla scala," fact2 "sono autosomiglianti," fact3 "e spesso riproducono oggetti che si trovano in natura." #fact4 "come nuvole, montagne, #o linee costiere." fact5 "Esistono anche molte strutture matematiche che definiscono i frattali," fact6 "come quello visualizzato sullo schermo." fmath4 "La maggior parte dei frattali sono creati con processi iterativi," fmath5 "come ad esempio quello noto come la curva di von Koch" fmath6 "che viene creata trasformando un segmento" fmath7 "in quattro segmenti." fmath8 "Questa rappresenta la prima iterazione del processo." fmath9 "Quindi il processo stesso viene ripetuto" fmath10 "...dopo 2 iterazioni..." fmath11 "...dopo 3 iterazioni..." fmath12 "...dopo 4 iterazioni..." fmath13 "...e dopo un infinito numero di iterazioni otteniamo un frattale." fmath14 "La sua forma è simile a quella di un terzo di un fiocco di neve." tree1 "Utilizzando metodi simili è possibile costruire molte altre forme." tree2 "Ad esempio modificando un segmento in un altro modo" tree3 "possiamo ottenere un albero." nstr "Può darsi che le iterazioni introducano disturbi casuali all'interno del frattale." nstr2 "Passando da un segmento a due segmenti" nstr3 "e aggiungendo qualche piccolo errore," nstr4 "è possibile ottenere frattali che ricordano una linea costiera." nstr5 "Un processo simile potrebbe creare nuvole, montagne e molte altre forme presenti in natura." ####################################################### ## mset.xaf fact7 "Indubbiamente il frattale più famoso è..." mset "...l'insieme di Mandelbrot." mset1 "È generato da una formula molto semplice" mset2 "ma risulta uno dei frattali più belli." mset3 "Dato che l'insieme di Mandelbrot è un frattale," mset4 "i suoi contorni contengono" mset5 "copie in miniatura dell'intero insieme." mset6 "Questa è la copia più grande, circa 50 volte più piccola dell'intero insieme." mset7 "L'insieme di Mandelbrot non è completamente autosomigliante," mset8 "quindi ogni copia in miniatura risulta diversa." mset9 "Questa è circa 76.000 volte più piccola di tutto l'intero." mset10 "Altre copie, che si trovano in zone diverse dell'insieme, sono ancora più differenti." nat "I contorni non contengono solamente copie dell'intero insieme," nat1 "ma una vera e propria varietà infinita di forme differenti." nat2 "Alcune di queste sono sorprendentemente simili a quelle presenti in natura:" nat3 "si vedono alberi," nat4 "fiumi con laghi," nat5 "galassie" nat6 "e cascate." nat7 "L'insieme di Mandelbrot contiene anche molte forme fiabesche." ############################################################################### ############ juliach "Una introduzione ai frattali Capitolo 2-Julia" julia "L'insieme di Mandelbrot non è l'unico frattale generato dalla formula: z=z^2+c" julia1 "L'altro è..." julia2 "l'insieme di Julia" julia3 "Non esiste un unico insieme di Julia," julia4 "ma ce ne sono un'infinita varietà." julia5 "Ognuno è creato partendo da un \"seme\"," julia6 "che non è altro che un punto selezionato da un insieme di Mandelbrot." julia7 "L'insieme di Mandelbrot può essere visto come una mappa di vari insiemi di Julia." julia8 "Punti interni all'insieme di Mandelbrot corrispondono a insiemi di Julia con grandi aree nere connesse," julia9 "mentre punti esterni all'insieme stesso corrispondono a Julia non connessi." julia10 "Gli insiemi di Julia più interessanti hanno i loro semi proprio sui confini dell'insieme di Mandelbrot." theme "Il tema di un insieme di Julia dipende moltissimo dal punto in cui viene scelto il seme." theme1 "Quando un insieme di Mandelbrot viene ingrandito, passando all'insieme di Julia corrispondente" theme2 "otteniamo un frattale con una tema molto simile." theme3 "Ma rimpicciolendo nuovamente," theme4 "scopriamo di essere in un frattale completamente differente." theme5 "Gli insiemi di Julia possono sembrare piuttosto noiosi dato che non cambiano tematica" theme6 "e restano fedeli al seme scelto dall'insieme di Mandelbrot." theme7 "Ma scegliendo con cura il punto di seme," theme8 "si possono generare bellissime immagini." ######################################################### #For file keys.xhf keys "Tasti: S - ferma riproduzione Spazio - salta fotogramma (può richiedere tempo) Sin./Dest. - varia velocità sottotitoli" ######################################################### #For file magnet.xaf intro7 "Una introduzione ai frattali Capitolo 8-Magnet" magnet "Questo NON è l'insieme di Mandelbrot." magnet1 "Questo frattale è chiamato \"magnet\" perchè la sua formula viene dalla fisica teorica." magnet2 "Deriva dallo studio di reticoli teorici nel contesto delle trasformazioni di rinormalizzazione magnetica." similiar "La sua somiglianza con l'insieme di Mandelbrot è interessante, visto che è una formula del mondo reale." magjulia "I suoi insiemi di Julia sono insoliti." magnet3 "Esiste anche un secondo frattale magnet." ######################################################### #For file new.xaf new "Novità della versione 3.0" speed "1. Maggiore velocità" speed1 "I cicli principali di calcolo vengono ora \"svolti\" ed effettuano controlli di periodicità." speed2 "Le nuove immagini sono calcolate usando il rilevamento dei contorni," speed3 "quindi il calcolo delle nuove immagini risulta ora molto più veloce." speed4 "Ad esempio: calcolo dell'insieme di Mandelbrot a 1,000,000 iterazioni..." speed5 "calcolo in corso..." speed6 "finito." speed7 "XaoS ha una euristica che disabilita automaticamente il controllo di periodicità quando non ci si attende che il punto calcolato sia interno all'insieme (quando non lo sono neanche tutti i punti circostanti)." speed8 "Sono state ottimizzate anche le routine principali di ingrandimento, raddoppiando circa la velocità di ingrandimento stessa." speed9 "Adesso XaoS raggiunge 130FPS su un Pentium 130Mhz." new2 "2. Filtri." new3 "3. Nove modi di colorazione esterna." new4 "4. Nuovi modi di colorazione interna." new5 "5. Modi di colorazione truecolor." new6 "6. Salvataggio/riproduzione animazioni." newend "E molto altro ancora come rotazione dell'immagine, generazione delle tavolozze migliorata... Consultare il ChangeLog per l'elenco completo." #NEW ######################################################### #For file newton.xaf intro3 "Una introduzione ai frattali Capitolo 4-Metodo di Newton" newton "Questo frattale è generato da una formula completamente differente:" newton1 "metodo numerico di Newton per trovare le radici di un polinomio x^3=1." newton2 "Vengono contate le iterazioni richieste per ottenere la radice approssimata." newton3 "I cerchi blu corrispondono alle tre radici." newton4 "Le parti più interessanti sono nelle zone in cui il punto di partenza è quasi equidistante a due o a tre radici." newton5 "Questo frattale è molto autosomigliante e non è molto interessante da esplorare." newton6 "Ma XaoS è capace di generare insiemi \"tipo Julia\"" newton7 "dove viene utilizzato l'errore di approssimazione come seme." newton8 "Questo rende il frattale di Newton molto più interessante." newton9 "XaoS può anche generare un altro frattale di Newton." newton10 "Metodo numerico di Newton per trovare le radici di un polinomio x^4=1." newton11 "I cerchi blu corrispondono alle quattro radici." ######################################################### #For file octo.xaf intro6 "Una introduzione ai frattali Capitolo 7-Octo" octo "Octo è un frattale molto meno noto." octo1 "È stato scelto per XaoS a causa della sua insolita forma." octo2 "XaoS è anche in grado di generare insiemi \"tipo Julia\" simili a quelli dell'insieme di Newton." ######################################################### #For file outcolor.xaf outcolor "Modi di colorazione esterna" outcolor1 "L'insieme di Mandelbrot è solo il noioso lago nero che si trova al centro dello schermo" outcolor2 "Le parti colorate che si trovano intorno sono i confini dell'insieme stesso." outcolor3 "Normalmente, la colorazione è basata sul numero di iterazioni richieste per raggiungere il valore di bailout." outcolor4 "Ma esistono anche altri metodi per eseguire la colorazione." outcolor5 "In XaoS vengono chiamati modi di colorazione esterna." iterreal "iter+real Questo modo colora i contorni aggiungendo la parte reale dell'ultima orbita al numero di iterazioni." iterreal1 "Può essere utilizzato per rendere più interessanti immagini piuttosto noiose." iterimag "iter+imag è simile a iter+real." iterimag2 "L'unica differenza è che viene utilizzata la parte immaginaria dell'ultima orbita." iprdi "iter+real/imag Questo modo colora i contorni aggiungendo al numero di iterazioni la divisione tra la parte reale e la parte immaginaria dell'ultima orbita." sum "iter+real+imag+real/imag è la somma di tutti precedenti modi di colorazione." decomp "scomposizione binaria Quando la parte immaginaria è maggiore di zero questo modo utilizza il numero di iterazioni, altrimenti utilizza il numero massimo di iterazioni meno il numero di iterazioni della scomposizione binaria." bio "biomorphs Questo modo di colorazione è chiamato così perché rende alcuni frattali simili a organismi unicellulari." ######################################################### #For file outnew.xhf potential "potenziale Questo modo di colorazione rende molto bene per immagini rimpicciolite utilizzando colori truecolor." cdecom "decomposizione del colore" cdecom2 "In questo modalità, il colore è calcolato a partire dall'angolo dell'ultima orbita." cdecom3 "È simile alla scomposizione binaria, ma in questo caso i colori sono interpolati in maniera equilibrata." cdecom4 "Nei frattali di tipo Newton può essere usato per colorare l'insieme relativo alla radice trovata, piuttosto che al numero di iterazioni." smooth "uniforme Il modo di colorazione uniforme cerca di eliminare le righe prodotte dalle iterazioni creando sfumature uniformi." smooth1 "Non può essere applicato all'insieme di Newton e alle formule magnet, dato che possiedono attrattori finiti." smooth2 "Funziona solo con modi di visualizzazione truecolor e highcolor. In presenza di 8bpp, quindi, bisogna abilitare il filtro truecolor." ######################################################### #For file outnew.xhf intro5 "Una introduzione ai frattali Capitolo 6-Phoenix" phoenix "Questo è l'insieme di Mandelbrot di una formula conosciuta come Phoenix." phoenix1 "Sembra diverso dagli altri frattali di XaoS, ma è possibile trovare alcune somiglianze con l'insieme di Mandelbrot:" phoenix2 "L'insieme di Phoenix contiene anche una \"coda\" con copie in miniatura dell'intero insieme," phoenix3 "esiste ancora una corrispondenza di \"tema\" tra la versione Mandelbrot e gli Julia," phoenix4 "ma gli Julia risultano molto diversi." ######################################################### #For file plane.xaf plane1 "Di solito nel piano complesso la parte reale di un punto è mappata sulla coordinata x dello schermo mentre la parte immaginaria è mappata sulla coordinata y." plane2 "XaoS fornisce 6 modi alternativi di mappatura" plane3 "1/mu Questa è un'inversione: le aree all'infinito vanno a 0 e 0 è mappato all'infinito. In questo modo si vede ciò che accade a un frattale quando viene rimpicciolito infinitamente." plane4 "Questo è un Mandelbrot normale..." plane5 "...e questo è un Mandelbrot invertito." plane6 "Come si può vedere, prima l'insieme era al centro e ora si trova tutto intorno. L'area blu infinitamente grande intorno all'insieme è mappata all'interno del piccolo cerchio intorno a 0." plane7 "Le prossime immagini verranno prima mostrate in modalità normale e poi in modalità invertita per mostrare ciò che accade." plane8 "1/mu+0.25 Questo è un altro modo invertito, ma con un centro di inversione differente. " plane9 "Dato che il centro di inversione cade sul confine dell'insieme di Mandelbrot, sono ora visibili confini parabolici infiniti." plane10 "Produce un effetto interessante anche su altri frattali, dato che solitamente rompe la loro simmetria." lambda "Il piano lambda fornisce una visione completamente diversa." ilambda "1/lambda Questa è una combinazione tra il piano invertito e il piano lambda." imlambda "1/(lambda-1) Questa è una combinazione tra piano lambda, spostamento e inversione." imlambda2 "Fornisce una deformazione molto interessante dell'insieme di Mandelbrot." mick "1/(mu-1.40115) Questa è ancora una inversione con un centro spostato. Il centro è ora piazzato dentro i punti di Feigenbaum, punti nei quali l'insieme di Mandelbrot è autosomigliante. Ciò esalta enormemente i dettagli intorno a questo punto." ######################################################### #For file power.xaf intro2 "Una introduzione ai frattali Capitolo 3-Mandelbrot a potenze superiori" power "z^2+c non è l'unica formula che genera frattali." power2 "Con una leggermente modificata, x^3+c, otteniamo un frattale simile," power3 "che naturalmente è pieno di copie dell'insieme principale." power4 "Frattali simili possono essere generati usando formule leggermente modificate" pjulia "e ognuno di essi possiede una serie di insiemi di Julia corrispondenti." ######################################################### #For file truecolor.xaf truecolor "Modi di colorazione truecolor" truecolor1 "Di solito i frattali sono colorati usando una tavolozza. Nel modo truecolor la tavolozza stessa è emulata." truecolor2 "L'unica differenza è che la tavolozza è più grande e i colori vengono interpolati in maniera uniforme in modi di colorazione." truecolor3 "Il modo di colorazione truecolor usa una tecnica completamente differente. Vengono utilizzati vari parametri estratti dai calcoli" truecolor4 "per generare un colore esatto e non solamente un indice all'interno della tavolozza." truecolor5 "Questo permette di visualizzare fino a quattro valori dentro ogni pixel." truecolor6 "Il modo di colorazione truecolor richiede ovviamente colori truecolor. Con schermi da 8bpp, quindi, bisogna abilitare il filtro truecolor." ######################################################### #for file pert.xaf #NEW (up to end of file) pert0 "Perturbazioni" pert1 "Nello stesso modo in cui semi differenti producono vari insiemi di Julia partendo da un unica formula," pert2 "l'insieme di Mandelbrot può essere modificato attraverso il valore di perturbazione." pert3 "Quest'ultimo cambia la posizione di partenza dell'orbita, predefinita a 0." pert4 "Il valore di perturbazione non influenza il frattale tanto quanto il seme nei confronti degli insiemi di Julia, ma è utile per ottenere un frattale più casuale." ########################################################## #for file palette.xaf pal "Tavolozze casuali" pal0 "XaoS non contiene una grande libreria di tavolozze predefinite come avviene in molti altri programmi, ma è in grado di generare tavolozze casuali." pal1 "Ad ogni pressione del tasto \"P\" XaoS genera una nuova tavolozza da usare a piacere nel proprio frattale." pal2 "Sono utilizzati tre differenti algoritmi:" pal3 "Il primo crea strisce che vanno da alcuni colori al nero." pal4 "Il secondo produce strisce che vanno dal nero, a diversi colori e al bianco." pal5 "Il terzo è ispirato a dipinti cubisti." ########################################################### #for file other.xaf auto1 "Pilota automatico" auto2 "Per le persone pigre è possibile abilitare il pilota automatico, per lasciare che XaoS esplori un frattale in maniera automatica." fastjulia1 "Modo di esplorazione Julia veloce" fastjulia2 "Questo modo permette la trasformazione dell'insieme di Julia in accordo con il seme attuale." fastjulia3 "È anche utile come anteprima di un'area prima dell'ingrandimento: a causa della corrispondenza tematica tra l'insieme di Julia e il punto scelto, è possibile vedere il tema approssimato intorno ad un punto prima di ingrandire." rotation "Rotazione dell'immagine" cycling "Ciclo dei colori" bailout "Bailout" bailout1 "Questo è l'insieme di Mandelbrot con un modo di colorazione esterna \"uniforme\"." bailout2 "Incrementando a 64 il valore di bailout, otteniamo una variazione graduale del colore." bailout3 "Per quasi tutti i frattali, diversi valori di bailout danno frattali simili." bailout4 "Questo non vale per i frattali di Barnsley." ############################################## #for file trice.xaf trice1 "Frattali Triceratopo e Occhi di gatto" trice2 "Portando il valore di bailout" trice3 "di un frattale con tempo di fuga" trice4 "ad un valore più piccolo," trice5 "si otterrà un altro frattale." trice6 "Con questo metodo possiamo creare" trice7 "trame molto interessanti" trice8 "con aree a tinta unita separate." trice9 "Anche il frattale Triceratopo" trice10 "è creato con questo metodo." trice11 "Molte immagini simili" trice12 "si possono creare con il Triceratopo." trice13 "Il frattale Occhi di gatto" trice14 "è come l'occhio di un gatto." trice15 "Ma se innalziamo il valore di bailout" trice16 "otteniamo un frattale più interessante.." trice17 "..con bolle.." trice18 "..e bellissimi Julia." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar e Spider" fourfr2 "Questo è l'insieme di Mandelbar." fourfr3 "La sua formula è: z = (conj(z))^2 + c" fourfr4 "Alcuni suoi Julia sono interessanti." fourfr5 "Ma ora vediamo altri frattali." fourfr6 "Il frattale Lambda ha una struttura" fourfr7 "simile al frattale di Mandelbrot." fourfr8 "È come un insieme di Mandelbrot in un piano lambda." fourfr9 "Ma Lambda è un insieme di Julia... ...e questo è MandelLambda." fourfr10 "...modo di Julia veloce..." fourfr11 "Questo è il frattale Manowar." fourfr12 "È stato scoperto da un utente del programma Fractint." fourfr13 "Contiene Julia simili a tutto l'insieme." fourfr14 "Questo frattale è chiamato Spider." fourfr15 "Anche questo è stato scoperto da un utente del programma Fractint." fourfr16 "Ed anche questo contiene Julia simili all'intero insieme." ############################################## #for file classic.xaf classic1 "Triangolo e Tappeto di Sierpinski, Fiocco di neve di Koch" classic2 "Questo è il famoso frattale chiamato Triangolo di Sierpinski." classic3 "E questa è la sua variante con tempo di fuga." classic4 "La sua forma può essere modificata" classic5 "selezionando un altro \"seme di Julia\"." classic6 "Questo è il Tappeto di Sierpinski." classic7 "E questa è la sua variante con tempo di fuga." classic8 "Anche questo è famoso." classic9 "E infine, questa è la variante con tempo di fuga" classic10 "del Fiocco di neve di Koch." ############################################## #for file otherfr.xaf otherfr1 "Altri tipi di frattali in XaoS" XaoS-release-4.3.2/catalogs/pt.cat000066400000000000000000000747741455214672000167520ustar00rootroot00000000000000# Mensagem do arquivo de catálogo necessária para reproduzir os tutoriais do XaoS na # língua Portuguesa # # Direitos autorais (C) 1997 por Jan Hubicka # # Corrigido por Tim Goowin # Correções adicionais por David Meleedy # E mais algumas por Nix # # Traduzido para o Português por Zélia Maria Horta Garcia # Contribuição de Lúcio Henrique de Araújo # Coordenação Multimeios/Pesquisa # Diretoria de Tecnologia Educacional # Secretaria de Estado da Educação do Paraná/Brasil # junho/2009 # # Translated into Portuguese by Zélia Maria Horta Garcia # Contribution by Lúcio Henrique de Araújo # Coordenação Multimeios/Research # Educational Tecnological Department # Educational Department of Parana State/Brazil # june/2009 # # Há algumas coisas que você deveria saber se quiser alterar ou # traduzir este arquivo. # # O formato deste catálogo é identificar[lacunas]"valor"[lacunas] # # Identificador é uma chave usada pelo programa. Não o tranduza! Apenas # traduza o valor. Se você quer um caracter de citação `"' no texto, # use `\"'. Para `\' use `\\'. Não use `\n' para enter; use a # nova linha. # # Se você quiser traduzir este arquivo para uma nova língua, por favor, # me avise. Você deve traduzir este texto livremente: não precisa usar # exatamente as mesmas frases como essas, se você sabe como escrever textos # mais engraçados, interessantes, ou adicionar mais informações, faça isso. # # Você pode usar frases mais longas ou mais curtas, que o XaoS calculará automaticamente # o tempo de cada legenda. # # Por favor,envie para mim quaisquer sugestões para melhorar este texto e # os tutoriais. # ######################################################### #For file dimension.xaf fmath "A matemática por trás dos fractais" fmath1 "Os fractais fazem parte de um campo novo da matemática, então ainda há muitas questões a serem resolvidas." fmath2 "Ainda que as definições não sejam claras" fmath3 "Nós geralmente chamamos algo de fractal se possui alguma auto-semelhança" def1 "Uma possível definição é..." #Definition from the intro.xaf is displayed here. #If it is a problem in your language catalog, let me #know and I will create a special key def2 "O que isso significa?" def3 "Para explicar, primeiramente precisamos entender o que é dimensão topológica e dimensão de Hausdorff Besicovich." topo1 "A dimensão topológica é a \"dimensão\" normal." topo2 "Um ponto tem dimensão 0" topo3 "Uma linha tem 1" topo4 "Uma superfície tem 2, etc..." hb1 "A definição de dimensão de Hausdorff Besicovich vem do simples fato de que:" hb2 "Uma linha quando ampliada dobra seu comprimento original em duas vezes." hb3 "Por outro lado, o tamanho de um quadrado quando ampliado aumenta em quatro vezes." hb4 "Regras similares funcionam em dimensões maiores também." hb5 "Para calcular dimensões desse fato, você pode utilizar a seguinte equação:" hb6 "dimensão = log s / log z onde z é a troca de zoom e s é a troca de tamanho" hb7 "para uma linha com zoom 2, a troca de tamanho também é 2. log 2 / log 2 = 1" hb8 "para um quadrado com zoom 2, a troca de tamanho é 4. log 4 / log 2 = 2" hb9 "Então, essa definição apresenta resultados iguais para tamanhos normais" hb10 "As coisas ficarão mais interessantes com os fractais..." hb11 "Considere uma curva de floco de neve" hb12 "que é criada pela divisão repetida de uma linha em quatro." hb13 "As novas linhas possuem 1/3 do tamanho da linha original" hb14 "Após serem ampliadas por 3 vezes, elas passarão a ter o tamanho das linhas originais." hb15 "Por causa da auto-semelhança criada pela repetição infinita dessa metamorfose," hb15b "cada uma dessas partes se tornará um cópia exata do fractal original." hb16 "Como há quatro cópias, o tamanho do fractal aumenta por 4X" hb17 "Após transformar valores em equações: log 4 / log 3 = 1.261" hb18 "Nós obtemos um valor maior que 1 (A dimensão topológica da curva)" hb19 "A dimensão de Hausdorff Besicovich (1.261) é maior do que a dimensão topológica." hb20 "De acordo com essa definição, o floco de neve é um fractal." defe1 "Essa definição, contudo, não é perfeita pois ela exclui muitas formas que são fractais." defe2 "Mas ela mostra uma das propriedades interesantes dos fractais," defe3 "e que é bastante conhecida." defe4 "A dimensão de Hausdorff Besicovich também é frequentemente chamada de uma \"dimensão fractal \"" ######################################################### #For file escape.xaf escape "A matemática por trás dos fractais chapter 2 - Fractais escape time" escape1 "Alguns fractais (como o floco de neve) são criados pela simples subdivisão e repetição." escape2 "O XaoS pode gerar uma categoria diferente de fractais - chamados fractais escape time." escape3 "O método que os gera é um tanto diferente, mas também é baseado no uso de iterações." escape4 "Eles tratam a tela toda como um plano complexo" escape5 "O eixo real se encontra horizontalmente" escape6 "e o imaginário verticalmente" escape7 "Cada ponto tem sua p´ropria órbita" escape8 "A trajetória que é calculada utizando a função iterativa, f(z,c) onde z é a posição anterior e c é a nova posição na tela." escape9 "Por exemplo no conjunto Mandelbrot, a função iterativa é z=z^2+c" orbit1 "No caso de querermos examinar o ponto 0 - 0.6i" orbit2 "Nós atribuímos o parâmetro para c" orbit3 "Iteração da órbita começa em z=0+0i" orbit3b "Então repetidamente nós calculamos a função iterativa e repetidamente obtemos um novo valor z para a próxima iteração." orbit4 "Nós definimos o ponto que pertence ao conjunto, se a órbita permanecer finita." orbit5 "Nesse caso, ela permanece..." orbit6 "Então esse ponto está dentro do conjunto." orbit7 "Em outros casos ele poderia escapar rapidamente para o infinito." orbit8 "(por exemple, o valor 10+0i A primeira iteração é 110, a segunda 12110 etc..)" orbit9 "Tais pontos estão fora do conjunto." bail1 "Nós ainda estamos falando sobre números infinitos e iterações de números infinitos..." bail2 "Mas computadores são finitos, então eles não podem calcular os fractais de forma exata." bail3 "Isso prova que no caso onde a distância da órbita do zero é maior que 2, a órbita sempre escapa para o infinito." bail4 "Então podemos interromper os cálculos após a órbita falhar nesse teste. (Isso é chamado de teste bailout)" bail5 "Nos casos onde calculamos pontos fora do conjunto, precisamos de um número finito de iterações." bail6 "Isso também cria listras coloridas ao redor do conjunto." bail7 "Elas são coloridas de acordo com o nº de iterações da órbita necessário para cair no conjunto bailout." iter1 "Dentro do conjunto nós ainda precisamos de infinitos nº de cálculos" iter2 "O único modo é interrompendo os cálculos após um certo número de iterações e utilizar os resultados aproximados" iter3 "O número máximo de iterações portanto especifica quão exata será a aproximação." iter4 "Sem iterações você criaria apenas um círculo com uma raio 2 (por causa da condição do bailout)" iter5 "Números maiores de iterações faz aproximações mais exatas, mas demora mais para serem calculadas." limit1 "O XaoS, por padrão, calcula 170 iteratições." limit2 "Em algumas áreas você amplia por um longo tempo sem alcançar esse limite." limit3 "Em outras áreas você chega a resultados inexatos mais rapidamente." limit4 "As imagens tornam-se feias quando isso acontece" limit5 "Mas após acrescentar o número de iterações, você obterá muitos detalhes novos e interessantes." ofracts1 "Outros fractais no XaoS são calculados por fórmulas diferentes e testes bailout, mas o método é basicamente o mesmo." ofracts2 "Então muitos cálculos são necessários para que o Xaos execute muitas otimizações. Você pode ler sobre isso na documentação" ######################################################### #For file anim.xaf anim "Resumo das características do XaoS Animações e arquivos de posição" ######################################################### #For file anim.xhf anim2 "Como você deve ter notado, o XaoS é capaz de repetir as animações e tutoriais." anim3 "Eles podem ser gravados diretamente do XaoS," languag1 "desde que as animações e arquivos de posição estejam armazenados em um comando de linguagem simples" languag2 "(arquivos de posição são animações de apenas um frame)." languag3 "As animações podem ser editadas manualmente em outro momento para que alcancem um resultado mais profissional." languag4 "A maioria das animações desses tutoriais foram escritos de forma manual, iniciando por um arquivo de posição." modif1 "Uma modificação simples" modif2 "gera um \"filme\"reduzido," modif3 "e essa modificação, um \"filme\" ampliado." newanim "Você também pode escrever novas animações e efeitos." examples "O Xaos também vem com muitos arquivos de exemplos, que podem ser carregados aleatoriamente pelo menu salvar / carregar." examples2 "Você também pode utilizar arquivos de posição para modificar coordenadas com outros programas." examples3 "O único limite é a sua imaginação, e a linguagem de comando descrita na documentação." ######################################################### #For file barnsley.xaf intro4 "Uma introdução aos fractais Chapter 5-Fórmula de Barnsley" barnsley1 "Uma outra fórmula introduzida por Michael Barnsley" barnsley2 "gera este fractal estranho." barnsley3 "Ele não é muito interesante para ser explorado," barnsley4 "mas ele tem lindos conjuntos Julia!" barnsley5 "Ele é interessante porque tem uma \"estrutura\" cristalina," barnsley6 "em vez da \"estrutura\" orgânica encontrada em muitos outros fractais." barnsley7 "Michael Barnsley também introduziu outras fórmulas." barnsley8 "Uma delas gera este fractal." ######################################################### #For file filter.xaf filter "Resumo das características do Xaos filters" ######################################################### #For file filter.xhf filter1 "Um filtro é um efeito aplicado em cada frame após o fractal ser calculado." filter2 "O XaoS executa os seguintes filtros:" motblur "desfoque de movimento," edge "corretores de linha de contorno (2)," edge2 "(o primeiro faz linhas largas e é utilizado para altas resoluções," edge3 "o segundo faz linhas mais finas)," star "um filtro de campo estelar simples," interlace "um filtro interlaçador, (ele acelera os cálculos e dá o efeito de desfoque de movimento em altas resoluções)," stereo "um filtro de estereograma de pontos aleatórios," stereo2 "(se você não conseguir ver nada nas próximas imagens e começar a ver estereogramas de pontos aleatórios, provavelmente o tamanho da tela está desconfigurado---utilize o `xaos -help' para mais informações)," emboss1 "um filtro relevo," #NEW palettef1 "um filtro de simulação de paleta, (habilita a troca de cor no modo de exibição truecolor )" #NEW truecolorf "um filtro true color, (cria imagens true-color em exibições 8bpp)." ######################################################### #For file fractal.xaf end "Fim." fcopyright "Uma introdução aos fractais foi feita por Jan Hubicka em 07/1997 e mais tarde, modificada e atualizada para novas versões do XaoS Correções de: Tim Goodwin e David Meleedy e Nix " # Add your copyright here if you are translating/correcting this file sugestões " Por favor envie todo tipo de ideias, sugestões, agradecimentos e relatórios de problemas para: xaos-discuss@lists.sourceforge.net Obrigado" ######################################################### #For file incolor.xaf incolor1 "Em geral,pontos internos do conjunto são exibidos utilizando uma única cor sólida." incolor2 "Isso torna os perímetros do conjunto visíveis, mas as áreas internas do conjunto, desinteressantes." incolor3 "Para torná-las um pouco mais interesantes, você pode utilizar o valor da última órbita para especificar a cor dos pontos internos do conjunto." incolor4 "O XaoS tem dez maneiras para isso. Elas são chamadas \"modos de cor interna\"." zmag "zmag A cor é calculada pela magnitude da última órbita." ######################################################### #For file innew.xaf innew1 "Modo de decomposição Funciona da mesma maneira que a decomposição de cores do modo de cor externa " innew2 "Real / Imag A cor é calculada pela parte real da última órbita dividida pela parte imaginária." innew3 "Os próximos 6 modos de cor são fórmulas escolhidas ao acaso ou copiadas de outros programas." ######################################################### #For file intro.xaf fractal "...Fractais..." fractal1 "O que é um fractal?" fractal2 "A definição de Benoit Mandelbrot: um fractal é um conjunto cuja dimensão Hausdorff Besicovich excede rigorosamente a sua dimensão topológica." fractal3 "Ainda não entendeu?" fractal4 "Não se preocupe. Essa definição só será importante se você for um matemático." fractal5 "Em inglês, um fractal é uma forma" fractal6 "que é construída de fragmentos" fractal7 "sendo que cada fragmento é uma cópia reduzida de todo o fractal." fractal8 "Esse processo se repete" fractal9 "até construir um fractal completo." facts "Há muitos fatos surpreendentes sobre os fractais:" fact1 "Os fractais são independentes de escala," fact2 "eles são auto-similares," fact3 "e eles geralmente assemelham-se a objetos encontrados na natureza" #fact4 "como nuvens, montanhas, #ou linhas costeiras." fact5 "Há também muitas estruturas matemáticas que definem fractais," fact6 "como a que você vê na sua tela." fmath4 "A maioria dos fractais são criados por um processo repetitivo" fmath5 "por exemplo o fractal conhecido como a curva de Koch" fmath6 "que é criada pela alteração de uma linha" fmath7 "em duas" fmath8 "Esta é a primeira iteratição do processo" fmath9 "Então repetimos essa alteração" fmath10 "após 2 iterações..." fmath11 "após 3 iterações..." fmath12 "após 4 iterações.." fmath13 "e após um número infinito de iterações obtemos um fractal." fmath14 "Sua forma é semelhante a um terço de um floco de neve." tree1 "Várias outras formas poderiam ser construídas por métodos similares." tree2 "Por exemplo ao modificar uma linha de uma maneira diferente" tree3 "Nós obtemos uma árvore." nstr "Iterações podem possivelmente introduzir ruídos ao acaso num fractal" nstr2 "Ao transformar uma linha em duas" nstr3 "e adicionar um pequeno erro" nstr4 "você pode obter fractais parecidos com uma linha costeira." nstr5 "Um processo similar poderia criar nuvens, montanhas, e muitas outras formas da natureza" ####################################################### ## mset.xaf fact7 "Sem dúvida o fractal mais famoso é.." mset "O Conjunto Mandelbrot" mset1 "Ele é gerado por uma fórmula muito simples," mset2 "mas ele é um dos fractais mais lindos." mset3 "Visto que ele é um fractal," mset4 "seus perímetros contém" mset5 "minicópias de todo o conjunto." mset6 "Este é o maior, cerca de 50 vezes menor que o conjunto todo." mset7 "O conjunto Mandelbrot não é completamente autossemelhante," mset8 "então cada minicópia é diferente." mset9 "Esta é aproximadamente 76,000 vezes menor que o conjunto." mset10 "Cópias em partes diferentes do conjunto diferem ainda mais." nat "Os perímetros não contém apenas cópias de todo o conjunto," nat1 "como também uma variedade infinita de formas diferentes." nat2 "Algumas delas são surpreendentemente similares às formas da natureza:" nat3 "você pode ver árvores," nat4 "rios com lagos," nat5 "galáxias," nat6 "e quedas d'água." nat7 "O onjunto Mandelbrot também contem formas completamente fora do comum." ############################################################################### ############ juliach "Uma introdução aos fractais Chapter 2-Julia" julia "O conjunto Mandelbrot não é o único fractal gerado pela fórmula: z=z^2+c" julia1 "O outro é..." julia2 "o conjunto Julia" julia3 "Não há apenas um conjunto Julia," julia4 "mas uma variedade infinita deles." julia5 "Cada um é construído por uma \"semente\"," julia6 "que é um ponto selecionado do conjunto Mandelbrot." julia7 "O conjunto Mandelbrot pode ser visto como um mapa de vários conjuntos Julia." julia8 "Os pontos internos do conjunto Mandelbrot correspondem aos Julia com grandes áreas negras conectadas," julia9 "enquanto que os externos ao conjunto Mandelbrot correspondem aos Julia desconectados." julia10 "Os Julia mais interessantes têm sua semente nos perímetros do conjunto Mandelbrot." theme "O tema do conjunto Julia também depende diretamente do ponto da semente escolhido." theme1 "Se você ampliar o conjunto Mandelbrot, você obterá um fractal tematicamente muito similar" theme2 "a sua alteração para o correspondente em Julia." theme3 "Mas ao desfazer o zoom, você descobrirá" theme4 "que está num fractal completamente diferente." theme5 "Conjuntos Julia podem ser muito feios porque não alteram os temas" theme6 "e permanecem fiéis à semente escolhida (Mandelbrot)." theme7 "Mas ao escolher cuidadosamente o ponto da semente você poderá gerar" theme8 "lindas imagens." ######################################################### #For file keys.xhf keys "chaves: S - pausa Space - pula (demora um pouco) Left/Right - ajusta a velocidade" ######################################################### #For file magnet.xaf intro7 "Uma introdução aos fractais Chapter 8-Magnet" magnet "Este não é o conjunto Mandelbrot." magnet1 "Este fractal é chamado \"magnet\" porque sua fórmula vem da física teórica." magnet2 "Ele é derivado do estudo da teoria das estruturas no contexto da renomartização magnética das transformações." similiar "Sua semelhança com o conjunto Mandelbrot é interessante porque é uma fórmula do mundo real." magjulia "Seus conjuntos Julia são bastante fora do comum." magnet3 "Há ainda um segundo fractal magnet." ######################################################### #For file new.xaf new "Quais as novidades da versão 3.0?" speed "1. Aceleradores" speed1 "As sequências do cálculo principal estão agora desenroladas e executam verificações periódicas." speed2 "Novas imagens são calculadas utilizando a correção de perímetro," speed3 "então calcular novas imagens está agora mais rápido." speed4 "Por exemplo, cálculo do conjunto Mandelbrot em 1,000,000 iterações..." speed5 "calculando..." speed6 "finalizado." speed7 "O XaoS tem uma heurística que desabilita automaticamente verificações periódicas quando ele não excede o ponto calculado dentro do conjunto (quando não há pontos ao redor dele)." speed8 "As rotinas principais de ampliação também foram melhoradas então ela ficou aproximadamente duas vezes mais rápida." speed9 "O XaoS agora alcança 130FPS em um Pentium 130Mhz." new2 "2. Filtros." new3 "3. Nove modos de cor externa." new4 "4. Novos modos de cor interna." new5 "5. Modos de cor true-color." new6 "6. Salvar/repetir animação." newend "E muitos outros acessórios, como rotação de imagem, geração de melhores paletas.Leia o ChangeLog e conheça a lista completa de alterações." #NEW ######################################################### #For file newton.xaf intro3 "Uma introdução aos fractais Chapter 4-Método de Newton" newton "Este fractal é gerado por uma fórumla completamente diferente:" newton1 "O método num.de Newton para achar as raízes de um polinômio x^3=1." newton2 "Ele conta o número de iterações necessárias para obter a raiz aproximada." newton3 "Você pode ver três raízes nos círculos azuis." newton4 "As partes mais bonitas estão onde o ponto inicial está quase equidistante de duas ou três raízes." newton5 "Este fractal é bastante autossemelhante e não muito interessante para explorar." newton6 "Mas o XaoS é capaz de gerar \"conjuntos\" parecidos com Julias," newton7 "onde ele utiliza o erro na aproximação como a semente." newton8 "Isso torna o fractal de Newton mais interessante." newton9 "O XaoS pode ainda gerar um outro fractal de Newton." newton10 "O método num.de Newton para achar as raízes do polinômio x^4=1." newton11 "Você pode ver as quatro raízes nos círculos azuis." ######################################################### #For file octo.xaf intro6 "Uma introdução aos fractais Chapter 7-Octo" octo "O octo é o fractal menos conhecido." octo1 "Nós o escolhemos para o XaoS por causa do seu formato incomum." octo2 "O XaoS também é capaz de gerar \"conjuntos\" Julia, similares aos do conjunto Newton." ######################################################### #For file outcolor.xaf outcolor "Modos de cor externa" outcolor1 "O conjunto Mandelbrot é apenas o lago negro no meio da tela" outcolor2 "As listras coloridas ao seu redor são os perímetros do conjunto." outcolor3 "Normalmente a colorização é baseada no número de iterações necessárias para chegar ao valor bail-out." outcolor4 "Mas há outras maneiras para fazer a colorização." outcolor5 "No XaoS elas são chamadas de modos de cor externa." iterreal "iter+real Este modo colore os perímetros pela adição da parte real da última órbita ao número de iterações." iterreal1 "Você pode usar este modo para tornar as imagens mais bonitas." iterimag "iter+imag é similar a iter+real." iterimag2 "A única diferença é que este modo utiliza a parte imaginária da última órbita." iprdi "iter+real/imag Este modo colore os perímetros adicionando o número de iterações à parte real da última órbita dividida pela parte imaginária." sum "iter+real+imag+real/imag é o resumo dos modos anteriores de cor." decomp "decomposição binária Quando a parte imaginária é maior que zero, este modo utiliza o número de iterações; fora isso ele utiliza o número máximo de iterações menos o número de iterações da decomposição binária." bio "biotransformação Este modo de cor é assim chamado porque ele deixa alguns fractais parecidos com micro-organismos." ######################################################### #For file outnew.xhf potential "potência Este modo de cor é muito bom em imagens true-color não ampliadas." cdecom "decomposição de cores" cdecom2 "Neste modo, a cor é calculada pelo ângulo da última órbita." cdecom3 "Ele é similar à decomposição binária mas interpola cores suavemente." cdecom4 "Para o fractal de Newton, pode ser usado para colorir o conjunto baseado na raiz encontrada, ao invés do número de iterações." smooth "suavização O modo de suavização de cores remove as listras causadas pelas iterações e faz gradações suaves." smooth1 "Ele não funciona no conjunto de Newton e na fórmula magnet porque eles têm atratores finitos." smooth2 "E ele só funciona nos modos true color e high color. Então se você tem 8bpp, precisará habilitar o filtro true color." ######################################################### #For file outnew.xhf intro5 "Uma introdução aos fractais Chapter 6-Phoenix" phoenix "Este é o conjunto Mandelbrot para a fórmula conhecida como Phoenix." phoenix1 "Ele é diferente dos outros fractais do XaoS, mas alguma semelhança com o Mandelbrot pode ser vista:" phoenix2 "o conjunto Phoenix também contem uma \"cauda\" com minicópias do conjunto inteiro," phoenix3 "há ainda uma correspondência do \"tema\" entre a versão Mandelbrot e a versão Julia," phoenix4 "mas os Julia são muito diferentes." ######################################################### #For file plane.xaf plane1 "Geralmente, a parte real de um ponto no plano complexo é tracejado na coordenada x da tela; a parte imaginária na coordenada y." plane2 "O XaoS dispõe de 6 modos alternativos para mapeamento" plane3 "1/mu Esta é uma inversão - áreas do infinito vêm para 0 e 0 é tracejado para o infinito. Isso permite ver o que acontece a um fractal quando ele é infinitamente reduzido." plane4 "Este é um Mandelbrot normal..." plane5 "e este é uma invensão." plane6 "Como você pode ver, o conjunto estava no centro e agora está ao seu redor. A área azul infinitamente grande ao redor do conjunto está dentro do pequeno círculo ao redor do 0." plane7 "As próximas imagens serão vistas no modo normal, depois no invertido para que você perceba o que acontece" plane8 "1/mu+0.25 Este é um outro modo invertido, mas com um centro diferente de inversão. " plane9 "Como o centro de inversão encontra-se nos perímetros do conjunto Mandelbrot, você consegue ver infinitos perímetros parabólicos." plane10 "Este modo causa um efeito interessante em outros fractais, pois ele quebra suas simetrias." lambda "O plano lambda oferece uma visão completamente diferente." ilambda "1/lambda Esta é uma combinação de inversão e o plano lambda." imlambda "1/(lambda-1) Esta é uma combinação de lambda, movimento, e inversão." imlambda2 "Ela causa uma deformação muito interessante no conjunto Mandelbrot." mick "1/(mu-1.40115) Novamente, uma inversão com um centro movido. Agora o centro encontra-se dentro dos pontos Feigenbaum - pontos onde conjunto Mandelbrot é autossemelhante. Os detalhes altamente magníficos estão ao redor desse ponto." ######################################################### #For file power.xaf intro2 "Uma introdução aos fractais Chapter 3-Os Mandelbrot de maior potência" power "z^2+c não é a única fórmula que gera fractals." power2 "Apenas uma mudança maior: x^3+c gera um fractal similar." power3 "E ele, é claro, também é cheio de cópias do conjunto todo." power4 "Fractais similares podem ser gerados por uma fórmula mais modificada" pjulia "e cada um tem uma série correspondente dos conjuntos Julia também." ######################################################### #For file truecolor.xaf truecolor "Modos de cor true-color" truecolor1 "Em geral,fractais são coloridos usando uma paleta. No modo true-color, a paleta está simulada." truecolor2 "A única diferença é que a paleta é maior e as cores são suavemente interpoladas nos modos de cor." truecolor3 "O modo de cor true-color utiliza uma técnica completamente diferente. Usa vários parâmetros de cálculo" truecolor4 "para gerar uma cor exata - não apenas um índice dentro da paleta." truecolor5 "Isto possibilita exibir acima de quatro valores para cada pixel." truecolor6 "O modo de cor true color requer true color. Em exibições 8bpp, você necessita habilitar o filtro true-color." ######################################################### #for file pert.xaf #NEW (up to end of file) pert0 "Distorção" pert1 "Assim como as fórmulas Julia utilizam diferentes sementes para gerar vários Julias a partir de uma fórmula," pert2 "você pode alterar o valor da distorção para os conjuntos Mandelbrot." pert3 "Isso troca a posição inicial da órbita a partir do valor padrão 0." pert4 "Seu valor não afeta o fractal resultante assim como a semente dos Julias, mas é útil quando você quer fazer um fractal mais casual." ########################################################## #for file palette.xaf pal "Paletas aleatórias" pal0 "O XaoS não vem com uma biblioteca vasta de paletas predefinidas como muitos outros programas, mas gera paletas aleatórias." pal1 "Então mantenha a tecla 'P' pressionada até que o XaoS gere uma paleta que satisfaça o seu fractal." pal2 "São utilizados três algoritmos diferentes:" pal3 "O primeiro faz listras indo de alguma cor ao preto." pal4 "O segundo faz listras do preto para alguma cor para o branco." pal5 "O terceiro é inspirado nas pinturas cubistas." ########################################################### #for file other.xaf auto1 "Piloto automático" auto2 "Se estiver cansado, você pode habilitar o piloto automático para deixar que o XaoS explore um fractal automaticamente." fastjulia1 "Modo rápido de navegação Julia" fastjulia2 "Este modo permite transformar o conjunto Julia de acordo com a semente atual." fastjulia3 "Ele também serve como uma previsão de uma área antes da ampliação - por causa da correspondência temática entre o Julia e o ponto escolhido, você visualiza o tema aproximado ao redor do ponto antes de ampliá-lo." rotation "Rotação de imagem" cycling "Alteração de cor" bailout "Bailout" bailout1 "Esse é o conjunto Mandelbrot com um modo de cor externa 'suave.'" bailout2 "Ampliando o valor para 64, obtemos transições de cores mais balanceadas." bailout3 "Para a maioria dos fractais, valores diferentes resultam em fractais similares." bailout4 "Isso não vale para os Barnsley." ############################################## #for file trice.xaf trice1 "Fractais Triceratops e Catseye" trice2 "Se alterar o valor bailout" trice3 "de um fractal escape-time" trice4 "para um valor menor," trice5 "você obterá um outro fractal." trice6 "Com esse método podemos obter" trice7 "padrões muito interesantes" trice8 "com áreas separadas de uma cor." trice9 "O fractal Triceratops" trice10 "também é feito com esse método." trice11 "Muitas figuras similares podem ser" trice12 "feitas do Triceratops." trice13 "O fractal Catseye" trice14 "é parecido com um olho de gato." trice15 "Mas se aumentarmos o valor bailout..." trice16 "...obtemos um fractal mais interesante..." trice17 "...com bolhas..." trice18 "...e lindos Julias." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar e Spider" fourfr2 "Este é o conjunto Mandelbar." fourfr3 "Sua fórmula é: z = (conj(z))^2 + c" fourfr4 "Alguns de seus Julia são interessantes." fourfr5 "Mas agora vamos ver outros fractais." fourfr6 "O fractal Lambda tem uma estrutura" fourfr7 "parecida com os Mandelbrot." fourfr8 "É como o conjunto Mandelbrott no plano lambda." fourfr9 "Mas o Lambda é um conjunto Julia, aqui temos o MandelLambda." fourfr10 "...modo rápido Julia..." fourfr11 "Este é o fractal Manowar," fourfr12 "descoberto por usuário do Fractint." fourfr13 "Ele tem Julias similares ao conjunto." fourfr14 "Este fractal é chamado Spider," fourfr15 "também descolberto por usuário do Fractint." fourfr16 "E ele tem Julias similares ao conjunto todo, também." ############################################## #for file classic.xaf classic1 "Sierpinski Gasket, S.Carpet, Koch Snowflake" classic2 "Este é o famoso fractal Sierpinski Gasket." classic3 "E este é o seu variante escape-time." classic4 "Você altera seu formato selecionando" classic5 "uma outra 'semente Julia'" classic6 "Este fractal é o Sierpinski Carpet." classic7 "E aqui está seu variante escape-time." classic8 "Este é famoso, também." classic9 "E finalmente, este é o variante escape-time" classic10 "do floco de neve Koch." ############################################## #for file otherfr.xaf otherfr1 "Outros tipos de fractais no XaoS" XaoS-release-4.3.2/catalogs/ro.cat000066400000000000000000000755001455214672000167330ustar00rootroot00000000000000# Message catalog file required to replay XaoS tutorials in # English language # # Copyright (C) 1997 by Jan Hubicka # # Corrected by Tim Goowin # Further corrections by David Meleedy # And some more by Nix # # There are a few things you should know if you want to change or # translate this file. # # The format of this catalog is identifier[blanks]"value"[blanks] # # Identifier is a key used by the program. Do not translate it! Only # translate the value. If you want a quote character `"' in the text, # use `\"'. For `\' use `\\'. Don't use `\n' for enter; use a literal # newline. # # If you wish to translate this file into any new language, please let # me know. You should translate this text freely: you don't need to use # exactly the same sentences as here, if you have idea how to make text # more funny, interesting, or add some information, do it. # # You can use longer or shorter sentences, since XaoS will automatically # calculate time for each subtitle. # # Also, please let me have any suggestions for improving this text and # the tutorials. # ######################################################### #For file dimension.xaf fmath "Matematica de la baza fractalilor" fmath1 "Fractalii sunt un nou domeniu al matematicii, asa că mai există încă multe intrebări la care nu s-a găsit răspuns." fmath2 "Chiar si definitiile sunt inexacte" fmath3 "De obicei numim ceva un fractal dacă prezintă o anumită auto-similaritate" def1 "Una din posibilele definitii este..." #Definition from the intro.xaf is displayed here. #If it is a problem in your language catalog, let me #know and I will create a special key def2 "Ce inseamna aceasta?" def3 "Pentru a explica trebuie mai intai sa intelegem ce inseamna dimensiunea topologica si dimensiunea Hausdorff Besicovich." topo1 "Dimensiunea topologica este dimensiunea \"normala\"." topo2 "Un punct are dimensiunea 0" topo3 "O linie are dimensiunea 1" topo4 "O suprafata are 2, etc..." hb1 "Definitia dimensiunii Hausdorff Besicovich provine de la simplul fapt ca:" hb2 "O linie pe care o marim astfel incat isi dubleaza lungimea, este de doua ori mai lunga decat era." hb3 "Pe de alta parte, daca marim un patrat in mod similar, dimensiunea acestuia creste de patru ori." hb4 "Reguli asemanatoare sunt valabile si in dimensiuni mai mari." hb5 "Plecand de la acest fapt, pentru a calcula dimensiuni se poate folosi urmatoarea ecuatie:" hb6 "dimensiune = log s / log z unde z este schimbarea de marire si s este schimbarea dimensiunii" hb7 "pentru o linie pe care o marim de 2 ori, schimbarea dimensiunii este tot 2 (dimensiunea se dubleaza). log 2 / log 2 = 1" hb8 "pentru un patrat pe care il marim de 2 ori, schimbarea dimensiunii este 4 (dimensiunea creste de 4 ori). log 4 / log 2 = 2" hb9 "Deci aceasta definitie da aceleasi rezultate pentru forme normale" hb10 "Lucrurile devin mai interesante la fractali..." hb11 "Sa luam in considerare o curba a unui fulg de zapada" hb12 "care se creeaza prin impartirea repetata a unei linii in 4 linii." hb13 "Noile linii au lungimea egala cu 1/3 din lungimea liniei originale" hb14 "Daca marim de 3 ori, aceste linii vor fi exact la fel de mari ca si liniile originale." hb15 "Din cauza auto-similaritatii create prin repetarea infinita a acestei metamorfoze," hb15b "fiecare din aceste parti va deveni o copie exacta a fractalului original." hb16 "Pentru ca exista 4 astfel de copii, dimensiunea fractalului creste de 4X" hb17 "Dupa ce punem aceste valori in ecuatii: log 4 / log 3 = 1.261" hb18 "Obtinem o valoare mai mare decat 1 (Dimensiunea topologica a curbei)" hb19 "Dimensiunea Hausdorff Besicovich (1.261) este mai mare decat dimensiunea topologica." hb20 "Considerand aceasta definitie, fulgul de zapada este un fractal." defe1 "Dar totusi, aceasta definitie nu este perfecta deoarece exclude multe forme care sunt de fapt fractali." defe2 "Dar arata una din interesantele proprietati ale fractalilor," defe3 "si este destul de populara." defe4 "Dimensiunea Hausdorff Besicovich este numita deseori si \"dimensiunea fractala\"" ######################################################### #For file escape.xaf escape "Matematica de la baza fractalilor Capitolul 2 - Fractalii Escape time " escape1 "Unii fractali (ca si fulgul de zapada) se pot crea prin simpla divizare si repetite." escape2 "XaoS poate genera o alta categorie de fractali - numiti fractali escape time." escape3 "Metoda pentru generarea acestora este un pic diferita, dar se bazeaza tot pe iteratie." escape4 "Ei considera tot ecranul ca un plan complex" escape5 "Axa reala este plasata orizontal" escape6 "si cea imaginara este plasata vertical" escape7 "Fiecare punct are propria orbita" escape8 "Traiectoria orbitei se calculeaza folosind functia iterativa, f(z,c) unde z este pozitia anterioara si c este noua pozitie de pe ecran." escape9 "De exemplu pentru multimea Mandelbrot, functia iterativa este z=z^2+c" orbit1 "In cazul in care dorim sa studiem punctul 0 - 0.6i" orbit2 "Atribuim acest parametru la c" orbit3 "Iteratia orbitei incepe la z=0+0i" orbit3b "Apoi calculam in mod repetat functia iterativa, si obtinem in mod repetat o noua valoare z pentru iteratia urmatoare." orbit4 "Definim punctul care apartine multimii, in cazul in care orbita ramane finita." orbit5 "In acest caz ramane..." orbit6 "Asa ca acest punct apartine multimii." orbit7 "In alte cazuri ar tinde repede la infinit." orbit8 "(de exemplu, valoarea 10+0i Prima iteratie este 110, a doua 12110 etc..)" orbit9 "Asa ca astfel de puncte se afla in afara multimii." bail1 "Vorbim tot despre numere infinite si iteratii ale numerelor infinite..." bail2 "Dar calculatoarele sunt finite, asa ca nu pot calcula exact fractalii." bail3 "Se poate demonstra ca, in cazul in care distanta dintre orbita si zero este mai mare decat 2, orbita va tinde intotdeauna la inifinit." bail4 "Asa ca putem intrerupe calculele dupa ce orbita pica acest test. (Acesta se numeste testul de salvare - bailout)" bail5 "In cazurile in care calculam puncte din afara multimii, avem nevoie acum doar de un numar finit de iteratii." bail6 "Acestui fapt se datoreaza aparitia dungilor colorate din jurul multimii." #bail7 "They are colored according to the #number of iterations of orbits needed #to fall in the bailout set." bail7 "Ele sunt colorate in concordanta cu numarul iteratiilor orbitelor necesar pentru a cadea in multimea de salvare (bailout)." iter1 "In interiorul multimii avem in continuare nevoie de un numar infinit de calcule" iter2 "Singura metoda de a face acest lucru este sa intrerupem calculele dupa un numar dat de iteratii si sa folosim rezultatele aproximative" iter3 "Astfel, numarul maxim de iteratii determina cat de exacta va fi aproximarea." iter4 "Fara nici o iteratie, s-ar crea doar un cerc cu raza 2 (din cauza conditiei de salvare (bailout))" iter5 "Cresterea numarului de iteratii va determina aproximari mai exacte, dar va lua si mai mult timp pentru calculare." limit1 "XaoS calculeaza implicit 170 de iteratii." limit2 "Unele zone se pot mari mult timp fara a se ajunge la aceasta limita." limit3 "In alte zone se obtin rezultate inexacte destul de repede." limit4 "Imaginile devin destul de plictisitoare cand se intampla acest lucru." limit5 "Dar dupa cresterea numarului de iteratii, se obtin multe detalii noi si interesante." ofracts1 "Alti fractali din XaoS se calculeaza folosind alte formule si alte teste de salvare (bailout), dar la baza este aceeasi metoda." ofracts2 "Deoarece este nevoie de atat de multe calcule, XaoS face foarte multe optimizari. Daca doriti, puteti citi despre acestea în documentație" ######################################################### #For file anim.xaf anim "Privire generala a caracteristicilor XaoS Fisiere de animatii si de pozitie " ######################################################### #For file anim.xhf anim2 "Dupa cum ati observat, XaoS poate reda animatii si tutoriale." anim3 "Ele se pot incarca direct din XaoS," languag1 "deoarece animatiile si fisierele de pozitie sunt stocate intr-un limbaj de comenzi simplu" languag2 "(fisierele de pozitie sunt animatii cu un singur cadru)." languag3 "Animatiile pot fi editate manual mai tarziu pentru a obtine rezultate si mai profesioniste." languag4 "Majoritatea animatiilor din aceste tutoriale au fost scrise complet manual, incepand de la un singur fisier de pozitie." modif1 "O simpla modificare" modif2 "genereaza un film de micsoare (\"unzoom\")," modif3 "si aceasta modificare, un film de marire (\"zoom\")." newanim "De asemenea, se pot scrie animatii si efecte complet noi." examples "XaoS vine si cu multe fisiere cu exemple, care pot fi incarcate aleator din meniul salveaza/incarca." examples2 "De asemenea, poti folosi fisierele de pozitie pentru a schimba date cu alte programe." examples3 "Singurele limite sunt propria imaginatie, si limbajul de comenzi descris in documentație." ######################################################### #For file barnsley.xaf intro4 "Fractali - O introducere Capitolul 5-Formula lui Barnsley" barnsley1 "Inca o formula a lui Michael Barnsley" barnsley2 "genereaza acest fractal ciudat." barnsley3 "Nu este foarte interesant de explorat," barnsley4 "dar are multimi Julia foarte frumoase!" barnsley5 "Este interesant pentru ca are o structura \"cristalina\"," barnsley6 "mai degraba decat o structura \"organica\" gasita in multi alti fractali." barnsley7 "Michael Barnsley a descoperit si alte formule." barnsley8 "Una dintre ele genereaza acest fractal." ######################################################### #For file filter.xaf filter "Privire generala a caracteristicilor XaoS filtre" ######################################################### #For file filter.xhf filter1 "Un filtru este un efect aplicat fiecarui cadru, dupa ce se calculeaza fractalul." filter2 "XaoS implementeaza urmatoarele filtre:" motblur "estomparea miscarii," edge "doua filtre pentru detectatrea marginilor," edge2 "(primul face linii groase si este util la rezolutii mari," edge3 "al doilea face linii mai inguste)," star "a filtru simplu \"star-field\"," interlace "un filtru de intretesere (\"interlace\"), (acesta mareste viteaza de calcul si da un efect de estompare a miscarii la rezolutii mai mari)," stereo "un filtru de stereograma (random dot stereogram)," stereo2 "(daca nu puteti vedea nimic in urmatoarele imagini si in mod normal puteti vedea stereograme (random dot), probabil ati configurat gresit dimensiunea ecranului---folositi `xaos -ajutor' pentru mai multe informatii)," emboss1 "un filtru de reliefare," #NEW palettef1 "un filtru de emulare a paletei, (activeaza ciclarea culorilor pe monitoare truecolor)" #NEW truecolorf "un filtru true color, (creaza imagini true-color pe monitoare 8bpp)." ######################################################### #For file fractal.xaf end "Sfarsit." fcopyright "Introducerea la fractali a fost facuta de Jan Hubicka in iulie 1997, modificata si actualizata ulterior pentru versiuni noi ale XaoS Corecturi de catre: Tim Goodwin si David Meleedy si Nix " # Add your copyright here if you are translating/correcting this file suggestions " Please send all ideas, suggestion, thanks, flames and bug-reports to: xaos-discuss@lists.sourceforge.net Thank You" ######################################################### #For file incolor.xaf incolor1 "De obicei, punctele care apartin multimii se afiseaza folosind o singura culoare." incolor2 "Acest lucru face granita multimii foarte vizibila, dar zonele din interiorul multimii sunt destul de plictisitoare." incolor3 "Pentru a le face mai interesante, puteti folosi valoarea ultimei orbite pentru a atribui o culoare punctelor din interiorul multimii." incolor4 "XaoS are zece feluri diferite de a face aceasta. Ele se numesc \"moduri de colorare interioara\"." zmag "zmag Culoarea se calculeaza folosind magnitudinea ultimei orbite." ######################################################### #For file innew.xaf innew1 "Descompunere Aceasta functioneaza la fel ca descompunerea culorilor din modurile de colorare exterioara " innew2 "Real / Imag Culoarea se calculeaza din partea reala a ultimei orbite, impartita la partea imaginara." innew3 "Urmatoarele 6 moduri de colorare sunt formule alese aleator sau copiate din alte programe." ######################################################### #For file intro.xaf fractal "...Fractalii..." fractal1 "Ce este un fractal?" fractal2 "Definitia lui Benoit Mandelbrot: un fractal este o multime a carei dimensiune Hausdorff Besicovich este strict mai mare decat dimensiunea topologica." fractal3 "Esti inca in bezna?" fractal4 "Nu te ingrijora. Aceasta definitie este importanta numai daca esti matematician." fractal5 "In romana, un fractal este o forma" fractal6 "care se construieste din bucati," fractal7 "si fiecare dintre aceste bucati este o copie aproximativa la scara redusa a intregului fractal." fractal8 "Acest proces se repeta" fractal9 "pentru a construi fractalul complet." facts "Exista multe lucruri surprinzatoare despre fractali:" fact1 "Fractalii nu depind de scala," fact2 "sunt auto-similari," fact3 "si de multe ori se aseamana unor obiecte din natura" #fact4 "such as clouds, mountains, #or coastlines." #fact4 "cum ar fi norii, muntii, #sau linia tarmului." fact5 "Exista si multe structuri matematice care definesc fractalii," fact6 "ca cele pe care le vezi pe ecran." fmath4 "Cei mai multi fractali sunt creati printr-un proces iterativ" fmath5 "de exemplu, fractalul conoscut drept curba lui von Koch" fmath6 "se creeaza prin schimbarea unei linii" fmath7 "in patru linii" fmath8 "Aceasta este prima iteratie a procesului" fmath9 "Apoi repetam aceasta schimbare" fmath10 "dupa 2 iteratii..." fmath11 "dupa 3 iteratii..." fmath12 "dupa 4 iteratii.." fmath13 "si dupa un numar infinit de iteratii obtinem un fractal." fmath14 "Forma lui arata ca o treime dintr-un fulg de zapada." tree1 "Prin metode asemanatoare se pot construi si multe alte forme." tree2 "De exemplu prin schimbarea liniei in alt fel" tree3 "Putem obtine un copac." nstr "Iteratiile pot introduce zgomot aleator intr-un fractal" nstr2 "Prin schimbarea unei linii in doua linii" nstr3 "si adaugand o mica eroare" nstr4 "poti obtine fractali care arata ca o linie de coasta." nstr5 "Un proces asemanator ar putea crea nori, munti, si multe atle forme din natura" ####################################################### ## mset.xaf fact7 "Fara nici un dubiu, cel mai faimos fractal este.." mset "Multimea Mandelbrot" mset1 "Este generat dintr-o formula foarte simpla," mset2 "dar este unul dintre cei mai frumosi fractali." mset3 "Deoarece multimea Mandelbrot este un fractal," mset4 "granitele sale contin" mset5 "copii in miniatura a intregii multimi." mset6 "Aceasta este cea mai mare, cam de 50 de ori mai mica decat intreaga multime." mset7 "Multimea Mandelbrot nu este complet auto-similara," mset8 "astfel incat fiecare copie in miniatura este diferita." mset9 "Aceasa este cam de 76,000 de ori mai mica decat intregul." mset10 "Copii din diferite zone ale multimii difera si mai mult." nat "Granitele nu contin doar copii ale intregii multimi," nat1 "ci o varietate cu adevarat infinita de forme diferite." nat2 "Unele dintre acestea seamana surprinzator cu cele gasite in natura:" nat3 "puteti vedea copaci," nat4 "rauri cu lacuri," nat5 "galaxii," nat6 "si cascade." nat7 "Multimea Mandelbrot contine si multe forme complet noi." ############################################################################### ############ juliach "Fractali - O introducere Capitolul 2-Julia" julia "Multimea Mandelbrot nu este singurul fractal generat de formula: z=z^2+c" julia1 "Celalalt este..." julia2 "multimea Julia" julia3 "Nu este doar o singura multime Julia," julia4 "ci o varietate infinita de multimi Julia." julia5 "Fiecare se construieste dintr-o \"samanta\" (valoare initiala)," julia6 "care este un punct selectat din multimea Mandelbrot." julia7 "Multimea Mandelbrot poate fi vazuta ca o harta formata din mai multe multimi Julia." julia8 "Puncte din interiorul multimii Mandelbrot corespund multimilor Julia cu zone negre mari conectate intre ele," julia9 "si punctele din exteriorul multimii Mandelbrot corespund unor multimi Julia neconectate." julia10 "Cele mai interesante multimi Julia isi au samanta (valoarea initiala) exact pe granita multimii Mandelbrot." theme "Tema unei multimi Julia depinde tare de punctul pe care il alegi drept samanta (valoare initiala)." theme1 "Cand maresti multimea Mandelbrot, obtii un fractal foarte similar tematic" theme2 "cand ne uitam la multimea Julia corespunzatoare." theme3 "Dar daca micsorezi inapoi, dupa marire, descoperi" theme4 "ca te afli intr-un fractal complet diferit." theme5 "Multimile Julia pot parea destul de plictisitoare, deoarece nu-si schimba tema" theme6 "si raman fidele samantei (valorii initiale) alese din multimea Mandelbrot." theme7 "Dar daca alegi cu atentie samanta, (valoarea initiala) poti genera" theme8 "imagini frumoase." ######################################################### #For file keys.xhf keys "Taste: S - stop redare Space - sari peste cadru (poate dura un timp) Stanga/Dreapta - ajusteaza viteza subtitrarii" ######################################################### #For file magnet.xaf intro7 "Fractali - O introducere Capitolul 8-Magnet" magnet "Aceasta NU ESTE multimea Mandelbrot." magnet1 "Acest fractal se numeste \"magnet\" pentru ca formula lui provine din fizica teoretica." magnet2 "Este derivat din studiul laticelor teoretice in contextul transformarilor renormalizatoare magnetice." similiar "Asemanarea sa cu multimea Mandelbrot este interesanta deoarece este o formula din lumea reala." magjulia "Multimile Julia ale sale sunt destul de deosebite." magnet3 "Exista si un al doilea fractal magnet." ######################################################### #For file new.xaf new "Ce aduce nou versiunea 3.0?" speed "1. Metode de marire a vitezei" speed1 "Buclele principale de calcul verifica acum periodicitatea." speed2 "Se calculeaza imagini noi prin detectarea marginilor," speed3 "astfel incat calcularea iamginilor noi este mult mai rapida." speed4 "De exemplu, calcularea multimii Mandelbrot la 1,000,000 iteratii..." speed5 "calculare..." speed6 "terminat." speed7 "XaoS are o euristica care deseteaza automat verificarea periodicitatii cand se asteapta ca punctul calculat sa fie in afara multimii (cand toate punctele din jurul lui sunt in afara multimii)." speed8 "Si rutinele principale de marire au fost optimizate astfel incat marirea se face de aproximativ doua ori mai repede." speed9 "XaoS atinge acum 130FPS pe 130Mhz Pentium." new2 "2. Filtre." new3 "3. Noua moduri de colorare exterioara." new4 "4. Moduri noi de colorare interioara." new5 "5. Moduri de colorare true-color." new6 "6. Salveaza animatia/reda animatia." newend "Si multe altele, cum ar fi rotirea imaginilor, o mai buna generare a paletei de culori... Vezi ChangeLog pentru o lista completa a schimbarilor." #NEW ######################################################### #For file newton.xaf intro3 "Fractali - O introducere Capitolul 4-Metoda lui Newton" newton "Acest fractal se genereaza printr-o formula complet diferita:" newton1 "Metoda numerica a lui Newton pentru gasirea radacinilor ecuatiei polnomiale x^3=1." newton2 "Numara iteratiile necesare pentru gasirea radacinii aproximante." newton3 "Poti vedea cele trei radacini ca cercuri albastre." newton4 "Cele mai interesante zone sunt locurile in care punctul de plecare este aproape echidistant fata de doua sau trei radacini." newton5 "Acest fractal este foarte auto- similar si nu prea interesant de cercetat." newton6 "Dar XaoS poate genera multimi asemanatoare cu multimile Julia," newton7 "unde foloseste eroarea de aproximare drept samanta (valoare initiala)." newton8 "Acest lucru face ca fractalul Newton sa devina mai interesant." newton9 "XaoS poate genera si un alt fractal Newton." newton10 "Metoda numerica a lui Newton pentru gasirea radacinilor ecuatiei polinomoale x^4=1." newton11 "Poti vedea cele patru radacini drept cercuri albastre." ######################################################### #For file octo.xaf intro6 "Fractali - O introducere Capitolul 7-Octo" octo "Octo este un fractal mai putin cunoscut." octo1 "L-am ales pentru XaoS din cauza formei sale neobisnuite." octo2 "XaoS poate genera multimi asemanatoare cu multimile Julia, similare cu cele din multimea Newton." ######################################################### #For file outcolor.xaf outcolor "Moduri de colorare exterioara" outcolor1 "Multimea Mandelbrot este doar lacul negru si plictisitor din mijlocul ecranului" outcolor2 "Dungile colorate dimprejurul lui sunt garnitele multimii." outcolor3 "In mod normal, colorarea se bazeaza pe numarul de iteratii necesare pentru a atinge valoarea de salvare (bail-out)." outcolor4 "Dar exista si ale modalitati de colorare." outcolor5 "XaoS le numeste moduri de colorare exterioara." iterreal "iter+real Acest mod coloreaza granitele prin adunarea partii reale a ultimei orbite la numarul de iteratii." iterreal1 "Il poti utiliza pentru a transforma imaginile plictisitoare in imagini mult mai interesante." iterimag "iter+imag este asemanator cu iter+real." iterimag2 "Singura diferenta este ca foloseste partea imaginara a ultimei orbite." iprdi "iter+real/imag Acest mod coloreaza granitele prin adunarea numarului de iteratii la partea reala a ultimei orbite, impartind apoi la partea imaginara." sum "iter+real+imag+real/imag este suma tuturor modurilor anterioare de colorare." decomp "descompunere binara cand partea imaginara este mai mare decat zero, acest mod foloseste numarul de iteratii; altfel foloseste numarul maxim de iteratii minus numarul de iteratii de descompunere binara." bio "biomorphs Acest mod de colorare se numeste astfel deoarece face unii fractali sa arate ca niste organisme unicelulare." ######################################################### #For file outnew.xhf potential "potential Acest mod de colorare arata forte bine in true-color pentru imagini nemarite." cdecom "descompunearea culorilor" cdecom2 "In acest mod, culorile se calculeaza pornind de la unghiul ultimei orbite." cdecom3 "Este asemanator cu descompunearea binara dar interpoleaza culorile mai neted." cdecom4 "Pentru tipul Newton, se poate folosi pentru colorarea multimii bazandu-se pe radacina conoscuta, mai degraba decat pe numarul de iteratii." smooth "neted Modul de colorare neteda incearca sa elimine dungile cauzate de iteratii si sa faca gradatii netede." smooth1 "Nu functioneaza pentru multimea Newton si nici pentru formule magnet din cauza ca acestea au atractori finiti." smooth2 "Functioneaza numai pentru true color si modurile high color ale monitorului. Asa ca daca ai 8bpp, va trebui sa setezi filtrul true color." ######################################################### #For file outnew.xhf intro5 "Fractali -O introducere Capitolul 6-Phoenix" phoenix "Aceasta este multimea Mandelbrot pentru o formula conoscuta ca Phoenix." phoenix1 "Arata altfel decat ceilalti fractali din XaoS, dar se poate gasi o anumita asemanare cu multimea Mandelbrot:" phoenix2 "multimea Phoenix contine si ea o \"coada\" cu copii in miniatura a intregii multimi," phoenix3 "exista totusi o corespondenta de \"tema\" intre versiunea Mandelbrot si multimile Julia," phoenix4 "dar multimie Julia sunt foarte diferite." ######################################################### #For file plane.xaf plane1 "De obicei, partea reala a unui punct din planul complex se reprezinta pe coordonata x de pe ecran; partea imaginara se reprezinta pe coordonata y." plane2 "XaoS ofera 6 moduri alternative de reprezentare" plane3 "1/mu Aceasta este o inversiune - zone de la infinit sunt aduse la 0 si 0 se reprezinta la infinit. Prin aceasta se poate vedea ce se intampla cu un fractal cand acesta este de-marit (unzoomed) de un numar infinit de ori." plane4 "Aceasta este o multime Mandelbrot normala..." plane5 "si aceasta este una inversata." plane6 "Dupa cum poti observa, multimea a fost in mijloc si acum este peste tot. Zona albastra infinit de mare din jurul multimii se mapeaza pe cercul mic din jurul punctului 0." plane7 "Urmatoarele cateva imagini vor fi aratate in modul normal, si dupa aceea in modul inversat pentru ca sa vezi ce se intampla" plane8 "1/mu+0.25 Acesta este alt mod de inversiune, dar are un alt centru de inversiune. " plane9 "Fiindca centrul inversiunii se afla pe granita multimii Mandelbrot, poti vedea acum granite parabolice infinite." plane10 "Are un efect interesant si asupra altor fractali, deoarece de obicei le strica simetria." lambda "Planul lambda ofera o vedere complet diferita." ilambda "1/lambda Aceasta este o combinatie a inversiunii cu planul lambda." imlambda "1/(lambda-1) Aceasta este o combinatie de lambda, miscare, si inversiune." imlambda2 "Ofera o deformare foarte interesanta a multimii Mandelbrot." mick "1/(mu-1.40115) Aceasta este din nou o inversiune cu un centru mutat. Centrul este acum plasat in puncte Feigenbaum - puncte unde multimea Mandelbrot este auto- similara. Acest lucru mareste foarte tare detaliile din jurul acestui punct." ######################################################### #For file power.xaf intro2 "Fractali - O introducere Capitolul 3-Multimi Mandelbrot de ordin superior" power "z^2+c nu este singura formula care genereaza fractali." power2 "Una doar putin modificata: x^3+c genereaza un fractal asemanator." power3 "Si contine, desigur, multe copii ale multimii principale." power4 "Fractali asemanatori pot fi generati de formule putin modificate" pjulia "si fiecare dintre ei are si un sir corespunzator de multimi Julia." ######################################################### #For file truecolor.xaf truecolor "Moduri de colorare true-color" truecolor1 "De obicei fractalii se coloreaza utilizand o paleta de culori. In modul true-color, paleta se emuleaza." truecolor2 "Singura diferenta este ca paleta este mai vasta si colurile sunt interpolate neted in modurile de colorare." truecolor3 "Modul de colorare true-color utilizeaza o tehnica complet diferita. Foloseste diversi parametri din calcule" truecolor4 "pentru a genera o culoare anume - nu doar un index la paleta." truecolor5 "Acest lucru face posibila prezentarea a pana la patru valori in fiecare pixel." truecolor6 "Modul de colorare true-color are desigur nevoie de true color. Asa ca pe ecrane 8bpp, trebuie sa setezi filtrul de true-color." ######################################################### #for file pert.xaf #NEW (up to end of file) pert0 "Perturbarea" pert1 "Asa cum formula Julia foloseste diferite seminte (valori initiale) pentru a genera diferite multimi Julia dintr-o singura formula," pert2 "la fel poti schimba valoarea de perturbare pentru multimile Mandelbrot." pert3 "Se schimba pozitia de inceput a orbitei de la valoarea implicita 0." pert4 "Valoarea ei nu afecteaza fractalul rezultat atat de tare precum afecteaza samanta (valoarea initiala) multimile Julia, dar este folositor cand doresti sa faci astfel incat un fractal sa fie mai aleator." ########################################################## #for file palette.xaf pal "Palete aleatoare" pal0 "XaoS nu vine cu biblioteci mari de palete predefinite ca multe alte programe, dar genereaza palete aleatoare." pal1 "Asa ca poti pur si simplu sa apesi tasta 'P' pana cand XaoS genereaza paleta pe care o doresti pentru fractalul tau." pal2 "Se utilizeaza trei algoritmi diferiti:" pal3 "Primul face dungi pornind de la o culoare oarecare la negru." pal4 "Al doilea face dungi pornind de la negru margand la o culoare oarecare si ajungand la alb." pal5 "Al treilea se inspira din picturi cubiste." ########################################################### #for file other.xaf auto1 "Pilot automat" auto2 "Daca esti lenes, poti seta pilotul automat pentru a lasa XaoS sa exploreze un fractal in mod automat." fastjulia1 "Modul de parcurgere rapida a unei multimi Julia" fastjulia2 "Acest mod iti da voie sa \"morph\" multimea Julia in concordanta cu samanta (valoarea initiala) curenta." fastjulia3 "Este folositor de asemenea si ca avanpremiera a unei zone inainte sa o maresti - din cauza corespondentei tematice intre Julia si punctul ales, poti vedea tema aproximtiva din jurul unui punct inainte sa maresti." rotation "Rotirea imaginilor" cycling "Ciclarea culorilor" bailout "Salvare (bailout)" bailout1 "Aceasta este multimea Mandelbrot cu modul de colorare exterioara 'neted.'" bailout2 "Prin marirea valorii de salvare (bailout) la 64, obtii tranzitii mai echilibrate de culoare." bailout3 "Pentru majoritatea tipurilor de fractali, valori diferite de salvare (bailout) dau ca rezultat fractali asemanatori." bailout4 "Acest lucru nu este adevarat pentru fractalii Barnsley." ############################################## #for file trice.xaf trice1 "Fractali Triceratops si Catseye (ochi de pisica)" trice2 "Daca schimbi valoarea de salvare (bailout)" trice3 "a unui fractal escape-time" trice4 "la o valoare mai mica," trice5 "vei obtine un alt fractal." trice6 "Cu aceasta metoda putem obtine" trice7 "sabloane foarte interesante" trice8 "cu zone separate colorate intr-o singura culoare." trice9 "Fractalul Triceratops" trice10 "este si el facut prin aceasta metoda." trice11 "Se pot face multe poze asemanatoare" trice12 "din Triceratops." trice13 "Fractalul Catseye (ochi de pisica)" trice14 "arata ca un ochi de pisica." trice15 "Dar daca marim valoarea de salvare (bailout)..." trice16 "...obtinem un fractal si mai interesant..." trice17 "...cu bule..." trice18 "...si multimi Julia foarte frumoase." ############################################## #for file fourfr.xaf fourfr1 "Mandelbar, Lambda, Manowar si Spider" fourfr2 "Aceasta este multimea Mandelbar." fourfr3 "Formula ei este: z = (conj(z))^2 + c" fourfr4 "Cateva din multimile ei Julia sunt interesante." fourfr5 "Dar sa vedem alti fractali acum." fourfr6 "Fractalul Lambda are o structura" fourfr7 "asemanatoare cu cea a lui Mandelbrot." fourfr8 "Este ca multimea Mandelbrot in planul lambda." fourfr9 "Dar Lambda este o multime Julia, aici este MandelLambda." fourfr10 "...modul rapid Julia..." fourfr11 "Acesta este fractalul Manowar." fourfr12 "A fost gasit de catre un utilizator al Fractint." fourfr13 "Are multimi Julia asemanatoare cu intreaga multime." fourfr14 "Acest fractal se numeste Spider (paianjen)." fourfr15 "A fost gasit tot de catre un utilizator al Fractint." fourfr16 "Si are si el multimi Julia asemanatoare cu intreaga multime." ############################################## #for file classic.xaf classic1 "Sierpinski Gasket, S.Carpet, Koch Snowflake(fulgul de zapada al lui Koch)" classic2 "Acesta este faimosul fractal Sierpinski Gasket." classic3 "Si aceasta este varianta escape-time a sa." classic4 "Ii poti schimba forma prin selectarea" classic5 "unei alte 'seminte (valori initiale) Julia'" classic6 "Acesta este fractalul Sierpinski Carpet." classic7 "Si aici este varianta escape-time a sa." classic8 "Si acesta este conoscut." classic9 "Si, in sfarsit, aceasta este varianta escape-time" classic10 "a fractalului Koch Snowflake (fulgul de zapada al lui Koch)." ############################################## #for file otherfr.xaf otherfr1 "Alte tipuri de fractali in XaoS" XaoS-release-4.3.2/catalogs/ru.cat000066400000000000000000001355761455214672000167530ustar00rootroot00000000000000# Message catalog file required to replay XaoS tutorials in # Russian language # # Copyright (C) 1997 by Jan Hubicka # # Corrected by Tim Goowin # Further corrections by David Meleedy # And some more by Nix # # There are a few things you should know if you want to change or # translate this file. # # The format of this catalog is identifier[blanks]"value"[blanks] # # Identifier is a key used by the program. Do not translate it! Only # translate the value. If you want a quote character `"' in the text, # use `\"'. For `\' use `\\'. Don't use `\n' for enter; use a literal # newline. # # If you wish to translate this file into any new language, please let # me know. You should translate this text freely: you don't need to use # exactly the same sentences as here, if you have idea how to make text # more funny, interesting, or add some information, do it. # # You can use longer or shorter sentences, since XaoS will automatically # calculate time for each subtitle. # # Also, please let me have any suggestions for improving this text and # the tutorials. # ######################################################### #For file dimension.xaf fmath "Математика позади фракталов" fmath1 "Фракталы - это очень новая область математики, поэтому остаётся много нерешённых вопросов." fmath2 "Даже определения не чистые" fmath3 "Мы обычно называем что-то фракталом, если можно найти некоторое самоподобие" def1 "Одно из возможных определений..." #Definition from the intro.xaf is displayed here. #If it is a problem in your language catalog, let me #know and I will create a special key def2 "Что это значит?" def3 "Чтобы объяснить это, мы сначала должны понять, каковы топологические и Хаусдорфа-Безиковича размерности." topo1 "Топологическая размерность - нормальная» размерность." topo2 "Точка имеет 0 измерений" topo3 "Линия имеет 1" topo4 "Поверхность имеет 2, и т.д..." hb1 "Определение размерности Хаусдорфа-Безиковича исходит из простого факта, что:" hb2 "Линия, увеличенная вдвое, имеет вдвое большую длину." hb3 "С другой стороны, размер квадрата с аналогичным увеличением увеличивается в четыре раза." hb4 "Подобные правила работают и в более высоких размерностях." hb5 "Чтобы рассчитать размерности по этому факту, вы можете использовать следующее уравнение:" hb6 "размерность = log s / log z где z - изменение масштаба, а s - изменение размера" hb7 "для линии с увеличением 2, изменение размера также 2. log 2 / log 2 = 1" hb8 "для квадрата с увеличением 2, изменение размера 4. log 4 / log 2 = 2" hb9 "Так что это определение дает те же результаты для нормальных форм" hb10 "Всё станет интереснее с фракталами..." hb11 "Рассмотрим кривую снежинки" hb12 "который создаётся путем многократного разбиения линии на четыре линии." hb13 "Новые линии составляют 1/3 размера оригинальной линии" hb14 "После 3-кратного увеличения эти линии станут такими же большими, как и исходные линии." hb15 "Из-за самоподобия, созданного бесконечным повторением этой метаморфозы," hb15b "каждая из этих частей станет точной копией оригинального фрактала." hb16 "Поскольку существует четыре таких копии, размер фрактала увеличивается в 4 раза" hb17 "После помещения этих значений в уравнения: log 4 / log 3 = 1,261" hb18 "Мы получаем значение больше 1 (Топологическая размерность кривой)" hb19 "Размерность Хаусдорфа-Безиковича (1.261) больше, чем топологическая." hb20 "Согласно этому определению, снежинка является фракталом." defe1 "Это определение, однако, не является идеальным, поскольку оно исключает множество форм, являющихся фракталами." defe2 "Но это показывает одно из интересных свойств фракталов," defe3 "и это довольно популярно." defe4 "Размерность Хаусдорфа-Безиковича также часто называют «фрактальной размерностью»" ######################################################### #For file escape.xaf escape "Математика позади фракталов Глава 2-Фракталы побега времени" escape1 "Некоторые фракталы (например, снежинка) создаются простым делением и повторением." escape2 "XaoS может генерировать другую категорию фракталов - так называемые фракталы побега времени." escape3 "Метод их генерации несколько отличается, но также основан на использовании итерации." escape4 "Они трактуют весь экран как комплексную плоскость" escape5 "Реальная ось расположена горизонтально" escape6 "а мнимая расположена вертикально" escape7 "Каждая точка имеет свою орбиту." escape8 "Траектория которого рассчитывается с использованием итерационной функции, f(z,c), где z - предыдущая позиция, а c - новая позиция на экране." escape9 "Например, в множестве Мандельброта итерационная функция имеет вид z=z^2+c" orbit1 "В случае если мы хотим проверить точку 0 - 0,6i" orbit2 "Мы назначаем этот параметр для с" orbit3 "Итерация орбиты начинается с z=0+0i" orbit3b "Затем мы многократно вычисляем итеративную функцию и повторно получаем новое значение z для следующей итерации." orbit4 "Мы определяем точку, которая принадлежит множеству, в случае, если орбита остаётся конечной." orbit5 "В этом случае это делает..." orbit6 "Так что эта точка находится внутри множества." orbit7 "В других случаях это быстро ушло бы в бесконечность." orbit8 "(например, значение 10+0i Первая итерация - 110, вторая - 12110 и т.д.)" orbit9 "Так что такие точки находятся за пределами множества." bail1 "Мы всё ещё говорим о бесконечных числах и итерациях бесконечных чисел..." bail2 "Но компьютеры конечны, поэтому они не могут точно рассчитать фракталы." bail3 "Можно доказать, что в случае, когда расстояние орбиты от нуля больше 2, орбита всегда стремится к бесконечности." bail4 "Таким образом, мы можем прервать вычисления после того, как орбита не прошла этот тест. (Это называется тестом на спасение)" bail5 "В тех случаях, когда мы вычисляем точки за пределами множества, нам нужно просто конечное число итераций." bail6 "Это также создаёт красочные полосы вокруг множества." bail7 "Они окрашены в соответствии с количеством итераций орбит, необходимых для попадания в множество спасения." iter1 "Внутри множества нам ещё нужно бесконечное количество вычислений" iter2 "Единственный способ сделать это - прервать вычисления после заданного числа итераций и использовать приблизительные результаты." iter3 "Максимальное количество итераций, следовательно, указывает, насколько точной будет аппроксимация." iter4 "Без каких-либо итераций вы бы создали просто круг с радиусом 2 (из-за условия спасения)" iter5 "Большее число итераций делает более точные приближения, но это занимает гораздо больше времени для расчёта." limit1 "По умолчанию XaoS рассчитывает 170 итераций." limit2 "В некоторых областях вы можете долго увеличивать масштаб, не достигая этого предела." limit3 "В других областях вы получите неточные результаты довольно скоро." limit4 "Изображения становятся довольно скучными, когда это происходит." limit5 "Но после увеличения количества итераций, вы получите много новых и интересных деталей." ofracts1 "Другие фракталы в XaoS рассчитываются с использованием различных формул и тестов по спасению, но метод в основном такой же." ofracts2 "Требуется так много вычислений, что XaoS выполняет много оптимизаций. Вы можете прочитать об этом в документации." ######################################################### #For file anim.xaf anim "Обзор возможностей XaoS Файлы анимаций и позиций" ######################################################### #For file anim.xhf anim2 "Как вы, наверное, заметили, XaoS может воспроизводить анимацию и учебные материалы." anim3 "Они могут быть записаны непосредственно из XaoS," languag1 "поскольку анимация и файлы позиций хранятся на простом командном языке" languag2 "(файлы позиций - это анимация всего одного кадра)." languag3 "Анимации могут быть отредактированы вручную, чтобы достичь более профессиональных результатов." languag4 "Большинство анимаций в этих уроках написаны полностью вручную, начиная с файла позиции." modif1 "Простая модификация" modif2 "создаёт ролик «без масштаба»," modif3 "и эта модификация, ролик «масштабирования»." newanim "Вы также можете написать совершенно новые анимации и эффекты." examples "XaoS также поставляется со многими примерами файлов, которые можно загружать случайным образом из меню сохранения/загрузки." examples2 "Вы также можете использовать файлы позиций для обмена координатами с другими программами." examples3 "Единственными ограничениями являются ваше воображение и язык команд, описанный в документации." ######################################################### #For file barnsley.xaf intro4 "Введение в фракталы Глава 5-Формула Барнсли" barnsley1 "Ещё одна формула, представленная Майклом Барнсли" barnsley2 "генерирует этот странный фрактал." barnsley3 "Его не очень интересно исследовать," barnsley4 "но у него прекрасные Жюлиа!" barnsley5 "Он интересен, потому что имеет «кристаллическую» структуру," barnsley6 "скорее, чем «органическая» структура, встречающаяся во многих других фракталах." barnsley7 "Майкл Барнсли также представил другие формулы." barnsley8 "Один из них порождает этот фрактал." ######################################################### #For file filter.xaf filter "Обзор возможностей XaoS фильтры" ######################################################### #For file filter.xhf filter1 "Фильтр - это эффект, применяемый к каждому кадру после вычисления фрактала." filter2 "XaoS реализует следующие фильтры:" motblur "размытие в движении," edge "два фильтра обнаружения краёв," edge2 "(первый делает широкие линии и полезен при высоких разрешениях," edge3 "второй делает более узкие линии)," star "простой фильтр звёздного поля," interlace "чересстрочный фильтр (это ускоряет вычисления и даёт эффект размытия в движении при более высоких разрешениях)" stereo "фильтр стереограмм случайных точек," stereo2 "(если вы не видите ничего на следующих изображениях и обычно видите стереограммы со случайными точками, возможно, вы неправильно настроили размер экрана - используйте `xaos -help` для получения дополнительной информации)," emboss1 "фильтр тиснения," #NEW palettef1 "фильтр эмулятора палитры (включает циклическое изменение цвета на дисплеях истинного цвета)" #NEW truecolorf "фильтр истинного цвета (создаёт изображения истинного цвета на дисплеях 8bpp)." ######################################################### #For file fractal.xaf end "Конец." fcopyright "Введение в фракталы было сделано Яном Хубицким в июле 1997 года и позже изменено и обновлено для новых версий XaoS Исправления сделали: Тим Гудвин и Дэвид Милиди , а также Nix " # Add your copyright here if you are translating/correcting this file suggestions " Пожалуйста, присылайте все идеи, предложение, благодарности, пламена и отчёты об ошибках на: xaos-discuss@lists.sourceforge.net Благодарю вас" ######################################################### #For file incolor.xaf incolor1 "Обычно точки внутри множества отображаются одним сплошным цветом." incolor2 "Это делает границы множества очень видимыми, но области внутри множества довольно скучные." incolor3 "Чтобы сделать его немного интереснее, вы можете использовать значение последней орбиты, чтобы назначить цвет точкам внутри множества." incolor4 "У XaoS есть десять разных способов сделать это. Они называются «режимами окрашивания снаружи»" zmag "zmag Цвет рассчитывается по величине последней орбиты." ######################################################### #For file innew.xaf innew1 "Разложение как Это работает так же, как разложение цвета в режимах окрашивания снаружи " innew2 "Действ / Мним Цвет вычисляется из действительной части последней орбиты, делённой на мнимую часть." innew3 "Следующие 6 режимов окрашивания - это формулы, которые выбираются в основном случайным образом или копируются из других программ." ######################################################### #For file intro.xaf fractal "...Фракталы..." fractal1 "Что такое фрактал?" fractal2 "Определение Бенуа Мандельброта: фрактал - это множество, для которого Хаусдорфа-Безиковича размерность строго превосходит топологическую размерность." fractal3 "Всё ещё в темноте?" fractal4 "Не беспокойся Это определение важно, только если вы математик." fractal5 "По-английски, фрактал - это форма" fractal6 "который построен из кусочков" fractal7 "каждый из которых представляет собой уменьшенную копию всего фрактала." fractal8 "Этот процесс повторяется сам" fractal9 "построить полный фрактал." facts "Есть много удивительных фактов о фракталах:" fact1 "Фракталы не зависят от масштаба," fact2 "они похожи друг на друга," fact3 "и они часто напоминают предметы, найденные в природе" #fact4 "such as clouds, mountains, #or coastlines." fact5 "Есть также много математических структур, которые определяют фракталы," fact6 "как тот, который вы видите на экране." fmath4 "Большинство фракталов созданы итеративным процессом" fmath5 "например, фрактал, известный как кривая Коха" fmath6 "создан путём изменения одной линии" fmath7 "в четыре линии" fmath8 "Это первая итерация процесса" fmath9 "Затем мы повторяем это изменение" fmath10 "после 2 итераций.." fmath11 "после 3 итераций.." fmath12 "после 4 итераций.." fmath13 "и после бесконечного числа итераций мы получаем фрактал." fmath14 "Его форма выглядит как одна треть снежинки." tree1 "Многие другие формы могут быть построены аналогичными методами." tree2 "Например, изменив линию другим способом" tree3 "Мы можем получить дерево." nstr "Итерации могут привести к случайному шуму во фрактале" nstr2 "Изменяя линию на две" nstr3 "линии и добавляя небольшую ошибку" nstr4 "Вы можете получить фракталы, похожие на береговую линию." nstr5 "Подобный процесс может создать облака, горы и множество других форм от природы" ####################################################### ## mset.xaf fact7 "Несомненно, самый известный фрактал это..." mset "Множество Мандельброта" mset1 "Он генерируется из очень простой формулы," mset2 "но это один из самых красивых фракталов." mset3 "Поскольку множество Мандельброта является фракталом," mset4 "его границы содержат" mset5 "миниатюрные копии всего множества." mset6 "Этот самый большой, примерно в 50 раз меньше, чем всё множество." mset7 "Множество Мандельброта не совсем самоподобно," mset8 "поэтому каждая миниатюрная копия отличается." mset9 "Этот примерно в 76000 раз меньше целого." mset10 "Копии в разных частях множества отличаются больше." nat "Границы не только содержат копии всего множества," nat1 "но действительно бесконечное разнообразие различных форм." nat2 "Некоторые из них удивительно похожи на те, что встречаются в природе:" nat3 "вы можете видеть деревья," nat4 "реки с озёрами," nat5 "галактики," nat6 "и водопады." nat7 "Множество Мандельброта также содержит много совершенно новых форм." ############################################################################### ############ juliach "Введение в фракталы Глава 2-Жюлиа" julia "Множество Мандельброта - не единственный фрактал, порождённый формулой z=z^2+c" julia1 "Другой..." julia2 "множество Жюлиа" julia3 "Существует не только одно множество Жюлиа," julia4 "но их бесконечное разнообразие." julia5 "Каждый построен из \"зерна\"," julia6 "которая является точкой, выбранной из множества Мандельброта." julia7 "Множество Мандельброта можно рассматривать как карту различных множеств Жюлиа." julia8 "Точки внутри множества Мандельброта соответствуют Жюлиа с большими связанными чёрными областями," julia9 "тогда как точки вне множества Мандельброта соответствуют несвязному Жюлиа." julia10 "Самое интересное, что Жюлиа имеют свои зёрна только на границах множества Мандельброта." theme "Тема множества Жюлиа также сильно зависит от выбранной вами точки зерна." theme1 "Когда вы приблизитесь к множеству Мандельброта, вы получите очень тематически похожий фрактал." theme2 "при переходе к соответствующему Жюлиа." theme3 "Но снова уменьшите масштаб, и вы обнаружите," theme4 "что вы находитесь в совершенно другом фрактале." theme5 "Множества Жюлиа могут показаться довольно скучными, поскольку они не меняют темы" theme6 "и оставаётся верным зерну, выбранному из множества Мандельброта." theme7 "Но, тщательно выбрав точку зерна, вы можете создать" theme8 "красивые образы." ######################################################### #For file keys.xhf keys "Ключи: S - остановить воспроизведение Пробел - пропустить кадр (может занять некоторое время) Влево/Вправо - настроить скорость субтитров" ######################################################### #For file magnet.xaf intro7 "Введение в фракталы Глава 8-Магнит" magnet "Это НЕ множество Мандельброта." magnet1 "Этот фрактал называется «магнитом», поскольку его формула исходит из теоретической физики." magnet2 "Он получен из исследования теоретических решеток в контексте магнитных преобразований перенормировки." similiar "Его сходство с множеством Мандельброта интересно, поскольку это формула реального мира." magjulia "Эти множества Жюлиа довольно необычны." magnet3 "Существует также второй магнитный фрактал." ######################################################### #For file new.xaf new "Что нового в версии 3.0?" speed "1. Ускорения" speed1 "Основные циклы расчёта теперь развёрнуты и выполняют проверку периодичности." speed2 "Новые изображения рассчитываются с использованием обнаружения границ," speed3 "поэтому вычисление новых изображений теперь происходит намного быстрее." speed4 "Например, вычисление множества Мандельброта в 1000000 итераций..." speed5 "калькуляция..." speed6 "завершён." speed7 "В XaoS есть эвристика, которая автоматически отключает проверку периодичности, когда не ожидается, что вычисленная точка находится внутри множества (когда нет всех окружающих точек)." speed8 "Также были оптимизированы основные процедуры масштабирования, поэтому увеличение примерно в два раза быстрее." speed9 "XaoS теперь достигает 130 кадров в секунду на Pentium 130 МГц." new2 "2. Фильтры." new3 "3. Девять режимов окрашивания снаружи." new4 "4. Новые режимы окрашивания внутри." new5 "5. Режимы окрашивания в истинный цвет." new6 "6. Сохранение/воспроизведение анимации" newend "И многие другие улучшения, такие как поворот изображения, улучшенная генерация палитры... Полный список изменений см. в ChangeLog." #NEW ######################################################### #For file newton.xaf intro3 "Введение в фракталы Глава 4-Метод Ньютона" newton "Этот фрактал сгенерирован совершенно другой формулой:" newton1 "Численный метод Ньютона для нахождения корней многочлена x^3=1." newton2 "Он подсчитывает количество итераций, необходимое для получения приблизительного корня." newton3 "Вы можете видеть три корня в виде синих кружков." newton4 "Самые интересные части находятся в местах, где отправная точка почти равноудалена от двух или трёх корней." newton5 "Этот фрактал очень похож на себя и не очень интересен для изучения." newton6 "Но XaoS способен генерировать «Жюлиа-подобные» множества," newton7 "где он использует ошибку в приближении в качестве зерна." newton8 "Это делает фрактал Ньютона более интересным." newton9 "XaoS также может генерировать другой фрактал Ньютона." newton10 "Численный метод Ньютона для нахождения корней многочлена x^4=1." newton11 "Вы можете увидеть четыре корня в виде синих кружков." ######################################################### #For file octo.xaf intro6 "Введение в фракталы Глава 7-Окто" octo "Окто - менее известный фрактал." octo1 "Мы выбрали его для XaoS из-за его необычной формы." octo2 "XaoS также может генерировать «Жюлиа-подобные» множества, похожие на множества Ньютона." ######################################################### #For file outcolor.xaf outcolor "Режим окрашивания снаружи" outcolor1 "Множество Мандельброта - просто скучное чёрное озеро в середине экрана" outcolor2 "Разноцветные полосы вокруг него - границы множества." outcolor3 "Обычно окрашивание основано на количестве итераций, необходимых для достижения значения спасения." outcolor4 "Но есть и другие способы сделать окрашивание." outcolor5 "XaoS называет их режимами окрашивания снаружи." iterreal "iter+real Этот режим окрашивает границы, добавляя действительную часть последней орбиты к числу итераций." iterreal1 "Вы можете использовать это, чтобы сделать довольно скучные изображения более интересными." iterimag "iter+imag похож на iter+real." iterimag2 "Разница лишь в том, что он использует мнимую часть последней орбиты." iprdi "iter+real/imag Этот режим окрашивает границы, добавляя количество итераций к действительной части последней орбиты, делённой на мнимую часть." sum "iter+real+imag+real/imag это сумма всех предыдущих режимов окрашивания." decomp "двоичное разложение Когда мнимая часть больше нуля, этот режим использует количество итераций; в противном случае он использует максимальное количество итераций минус количество итераций двоичного разложения." bio "биоморфы Этот режим окрашивания называется так, поскольку некоторые фракталы выглядят как одноклеточные животные" ######################################################### #For file outnew.xhf potential "потенциал Этот режим окрашивания очень хорошо выглядит в истинном цвете для изображений без увеличения." cdecom "декомпозиция цвета" cdecom2 "В этом режиме цвет рассчитывается по углу последней орбиты." cdecom3 "Это похоже на двоичное разложение, но интерполирует цвета плавно." cdecom4 "Для типа Ньютона это можно использовать для раскраски множества, основанного на том, какой корень найден, а не на количестве итераций." smooth "плавный Режим плавного окрашивания пытается удалить полосы, вызванные итерациями, и сделать плавные градации." smooth1 "Это не работает для формул Ньютона и магнитов, поскольку они имеют конечные аттракторы." smooth2 "И это работает только для режимов отображения истинного и высококачественного цвета. Так что, если у вас 8bpp, то вам нужно включить фильтр истинного цвета." ######################################################### #For file outnew.xhf intro5 "Введение в фракталы Глава 6-Феникс" phoenix "Это множество Мандельброта для формулы, известной как Феникс." phoenix1 "Он выглядит иначе, чем другие фракталы в XaoS, но можно найти некоторое сходство с множеством Мандельброта:" phoenix2 "множество «Феникс» также содержит «хвост» с миниатюрными копиями всего множества," phoenix3 "всё ещё есть соответствие «темы» между версиями Мандельброта и Жюлиа," phoenix4 "но Жюлиа очень разные." ######################################################### #For file plane.xaf plane1 "Обычно действительная часть точки в комплексной плоскости картографируется на координату x на экране; мнимая часть - на координату y." plane2 "XaoS предоставляет 6 альтернативных режимов картографирования" plane3 "1/mu Это инверсия - области из бесконечности стремятся к 0, а 0 картографируется в бесконечность. Это позволяет увидеть, что происходит с фракталом, когда он бесконечно не масштабируется." plane4 "Это нормальный Мандельброт..." plane5 "и это инвертированный." plane6 "Как видите, множество было в центре, а теперь оно всё вокруг. Бесконечно большая синяя область вокруг множества картографирована в маленький круг около 0." plane7 "Следующие несколько изображений будут показаны в обычном, а затем в инвертированном режиме, чтобы вы могли видеть, что происходит" plane8 "1/mu+0.25 Это еще один инвертированный режим, но с другим центром инверсии. " plane9 "Поскольку центр инверсии лежит на границе множества Мандельброта, теперь вы можете видеть бесконечные параболические границы." plane10 "Это имеет интересный эффект и для других фракталов, поскольку обычно нарушает их симметрию." lambda "Лямбда-плоскость обеспечивает совершенно другой вид." ilambda "1/лямбда Это комбинация инверсии и лямбда-плоскости." imlambda "1/(лямбда-1) Это комбинация лямбды, движения и инверсии." imlambda2 "Это даёт очень интересную деформацию множества Мандельброта." mick "1/(mu-1.40115) Это опять-таки инверсия с перемещённым центром. Центр теперь помещён в точки Фейгенбаума - точки, в которых множество Мандельброта является автомодельным (самоподобным). Это сильно увеличивает детали вокруг этой точки." ######################################################### #For file power.xaf intro2 "Введение в фракталы Глава 3-Множества Мандельброта высшей силы" power "z^2+c - не единственная формула, порождающая фракталы." power2 "Просто слегка модифицированный: x^3+c генерирует аналогичный фрактал." power3 "И, конечно же, он также полон копий основного множества." power4 "Подобные фракталы могут быть получены с помощью слегка модифицированных формул" pjulia "и у каждого есть соответствующая серия множества Жюлиа также." ######################################################### #For file truecolor.xaf truecolor "Режимы окрашивания в истинный цвет" truecolor1 "Обычно фракталы окрашиваются с помощью палитры. В режиме истинного цвета палитра эмулируется." truecolor2 "Разница лишь в том, что палитра больше, а цвета плавно интерполируются в режимах окрашивания." truecolor3 "Режим окрашивания в истинный цвет использует совершенно другую технику. Используются различные параметры из расчёта" truecolor4 "генерировать точный цвет - не просто индекс в палитре." truecolor5 "Это позволяет отображать до четырёх значений в каждом пикселе." truecolor6 "Режим окрашивания в истинный цвет, конечно, требует истинного цвета. Поэтому на дисплеях 8bpp вам необходимо включить фильтр истинного цвета." ######################################################### #for file pert.xaf #NEW (up to end of file) pert0 "Возмущение" pert1 "Так же, как формула Жюлиа использует разные зёрна для создания различных Жюлиа из одной формулы," pert2 "Вы можете изменить значение возмущения для множеств Мандельброта." pert3 "Это изменяет начальную позицию орбиты со значения по умолчанию 0." pert4 "Его значение не влияет на результирующий фрактал так сильно, как зерно для Жюлиа, но полезно, когда вы хотите сделать фрактал более случайным." ########################################################## #for file palette.xaf pal "Случайные палитры" pal0 "XaoS не поставляется с большой библиотекой предопределённых палитр, как многие другие программы, но генерирует случайные палитры." pal1 "Таким образом, вы можете просто сохранять нажатие «P», пока XaoS не сгенерирует палитру, которая вам понравится для вашего фрактала." pal2 "Использованы три разных алгоритма:" pal3 "Первое заставляет полосы переходить от некоторого цвета к чёрному." pal4 "Второй делает полосы от чёрного до какого-то цвета до белого." pal5 "Третий вдохновлён кубистическими картинами." ########################################################### #for file other.xaf auto1 "Автопилот" auto2 "Если вам лень, вы можете включить автопилот, чтобы XaoS автоматически исследовал фрактал." fastjulia1 "Быстрый режим просмотра Жюлиа" fastjulia2 "Этот режим позволяет вам изменять множество Жюлиа в соответствии с текущим зерном." fastjulia3 "Это также полезно в качестве предварительного просмотра области перед увеличением - из-за тематического соответствия между Жюлиа и выбранной точкой вы можете увидеть приблизительную тему вокруг точки, прежде чем увеличивать масштаб." rotation "Поворот изображения" cycling "Цвет зацикливания" bailout "Спасение" bailout1 "Это множество Мандельброта с режимом «плавного» окрашивания снаружи." bailout2 "Увеличив спасение до 64, вы получите более сбалансированные цветовые переходы." bailout3 "Для большинства типов фракталов разные значения спасения приводят к схожим фракталам." bailout4 "Это не относится к фракталам Барнсли." ############################################## #for file trice.xaf trice1 "Фракталы Трицератопс и Кэтси" trice2 "Если вы измените значение спасения" trice3 "фрактала побега времени" trice4 "до меньшего значения," trice5 "вы получите другой фрактал." trice6 "С помощью этого метода мы можем получить" trice7 "очень интересные узоры" trice8 "с отдельными областями одного цвета." trice9 "Фрактал Трицератопс" trice10 "также сделан этим методом." trice11 "Многие похожие картинки могут быть" trice12 "сделано из Трицератопса." trice13 "Фрактал Кэтси" trice14 "как кошачий глаз." trice15 "Но если мы повысим значение спасения..." trice16 "...мы получаем более интересный фрактал..." trice17 "...с пузырьками..." trice18 "...и прекрасные Жюлиа." ############################################## #for file fourfr.xaf fourfr1 "Мандельбар, Лямбда, Мановар и Спайдер" fourfr2 "Это множество Мандельбара." fourfr3 "Это формула: z = (conj(z))^2 + c" fourfr4 "Некоторые из этих Жюлиа интересны." fourfr5 "Но давайте теперь посмотрим на другие фракталы." fourfr6 "Лямбда-фрактал имеет структуру" fourfr7 "похож на Мандельброта." fourfr8 "Это как Мандельброт, установленный на лямбда- плоскости." fourfr9 "Но Лямбда - это множество Жюлиа, здесь это МандельЛямбда." fourfr10 "...быстрый режим Жюлиа..." fourfr11 "Это фрактал Мановар." fourfr12 "Он был найден пользователем Fractint." fourfr13 "Она имеет Жюлиа, подобное целому множеству." fourfr14 "Этот фрактал называется Спайдер." fourfr15 "Он был найден пользователем Fractint также." fourfr16 "И у него также есть Жюлиа, похожий на всё множество." ############################################## #for file classic.xaf classic1 "Уплотнение Серпинского, Ковёр Серпинского, Снежинка Коха" classic2 "Это известный фрактал - уплотнение Серпинского." classic3 "И это вариант побега времени" classic4 "Вы можете изменить его форму, выбрав" classic5 "другое 'Зерно Жюлиа'" classic6 "Этот фрактал - ковёр Серпинского." classic7 "А вот и вариант побега времени." classic8 "Это известно тоже." classic9 "И, наконец, это вариант побега времени" classic10 "Снежинка Коха" ############################################## #for file otherfr.xaf otherfr1 "Другие типы фракталов в XaoS" XaoS-release-4.3.2/doc/000077500000000000000000000000001455214672000145635ustar00rootroot00000000000000XaoS-release-4.3.2/doc/README000066400000000000000000000002621455214672000154430ustar00rootroot00000000000000Docs have been moved online to https://github.com/xaos-project/XaoS/wiki The Hacker's Guide (xaosdev.texinfo) is now at https://github.com/xaos-project/XaoS/wiki/Hacker's-Guide XaoS-release-4.3.2/doc/XaoS.lsm000066400000000000000000000024361455214672000161570ustar00rootroot00000000000000Begin3 Title: XaoS - a fast portable real-time interactive fractal zoomer/morpher Version: 4.2 Entered-date: August 17 2020 Description: XaoS is a fast portable real-time interactive fractal zoomer. It displays the Mandelbrot set (among other escape time fractals) and allows you to zoom smoothly into the fractal. Various coloring modes are provided for both the points inside and outside the selected set. In addition, switching between Julia and Mandelbrot fractal types is provided. The first version was a poorly written Mandelbrot viewer by Thomas later modified by Jan to support high frame-rate zooming. Other additions were later made including autopilot (for those of you without driver licenses), palette changing, PNG saving, and fractal inversion. Keywords: X11 fractal realtime zoom mandelbrot newton julia autopilot demo Author: jh@ucw.cz (Jan Hubicka) thomas@tivoli.com (Thomas Marsh) Maintained-by: zoltan@geogebra.org (Zoltan Kovacs) jblangston@jblangston.com (J.B. Langston) Primary-site: https://xaos-project.github.io Platform: GNU/Linux or any UNIX with X11 and ANSI C compiler, Microsoft Windows (95, 98, XP, and others), Mac OS X Copying-policy: GNU GENERAL PUBLIC LICENSE All rights reserved by the author End XaoS-release-4.3.2/doc/xaos.6000066400000000000000000000006041455214672000156240ustar00rootroot00000000000000.TH XaoS 6 "22 Feb 2006" "XaoS" "Demos" .SH NAME xaos - Fast interactive real-time fractal zoomer/morpher .SH DETAILS This manual page is obsolete and no longer maintained. Please read the full documentation running XaoS. You can start it typing 'xaos'. (Press 'h' to get into the help system.) .P In addition, .B xaos --help should give a detailed list about the command line options. XaoS-release-4.3.2/examples/000077500000000000000000000000001455214672000156345ustar00rootroot00000000000000XaoS-release-4.3.2/examples/0rfelyus/000077500000000000000000000000001455214672000174055ustar00rootroot00000000000000XaoS-release-4.3.2/examples/0rfelyus/0rfel1.xpf000066400000000000000000000005121455214672000212130ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'edge2 #t) (palette 1 1794309737 0) (formula 'mandel) (juliaseed -0.41615510946480224709 0.62713787798422807658) (julia #t) (view -0.267916 -0.050803 0.0406036 0.0406036) XaoS-release-4.3.2/examples/0rfelyus/0rfel2.xpf000066400000000000000000000005071455214672000212200ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1180946604 0) (formula 'mandel) (juliaseed -0.41615510946480224709 0.62713787798422807658) (outcoloring 1) (julia #t) (view -0.267916 -0.050803 0.0406036 0.0406036) XaoS-release-4.3.2/examples/Hubicka/000077500000000000000000000000001455214672000172025ustar00rootroot00000000000000XaoS-release-4.3.2/examples/Hubicka/2spirals.xpf000066400000000000000000000004341455214672000214610ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1082198693 0) (formula 'mandel) (maxiter 320) (view 0.26294324588 -0.0024215732998 6.6382464113E-07 6.6382464113E-07) XaoS-release-4.3.2/examples/Hubicka/3d1.xpf000066400000000000000000000005601455214672000203110ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'newton) (juliaseed 1.0010901162790697673 -0.012500000000000000043) (angle 450.4) (maxiter 238) (outcoloring 9) (julia #t) (plane 1) (view -1.967 0.451 7.936 7.936) XaoS-release-4.3.2/examples/Hubicka/3d2.xpf000066400000000000000000000005411455214672000203110ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -1.0735871408490181187 -0.08458622263859806199) (maxiter 330) (outcoloring 5) (plane 1) (view 1.9364 -0.062527 0.25864 0.25864) XaoS-release-4.3.2/examples/Hubicka/3d3.xpf000066400000000000000000000005301455214672000203100ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed 1.1751545647170536949 0.18734951556038896103) (maxiter 51) (outcoloring 1) (plane 3) (view 0.8974 0.02055 8.381 8.381) XaoS-release-4.3.2/examples/Hubicka/3d4.xpf000066400000000000000000000005271455214672000203170ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -1.0063238428297288131 0.021582276202805130609) (maxiter 320) (outcoloring 5) (plane 2) (view -2.55 -0.684 11.9 11.9) XaoS-release-4.3.2/examples/Hubicka/3d5.xpf000066400000000000000000000005141455214672000203140ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (juliaseed -0.08611918604651162823 -0.66249999999999999991) (maxiter 238) (julia #t) (view -0.7118 -0.5483 2.133 2.133) XaoS-release-4.3.2/examples/Hubicka/3d6.xpf000066400000000000000000000004321455214672000203140ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (outcoloring 8) (view -0.04960739 -0.6748339 0.001703127 0.001703127) XaoS-release-4.3.2/examples/Hubicka/3d7.xpf000066400000000000000000000004141455214672000203150ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'phoenix) (outcoloring 8) (view 0.31585 0.67379 0.19748 0.19748) XaoS-release-4.3.2/examples/Hubicka/3d8.xpf000066400000000000000000000004131455214672000203150ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'newton) (outcoloring 5) (view 0.23672 0.27244 0.99213 0.99213) XaoS-release-4.3.2/examples/Hubicka/3d9.xpf000066400000000000000000000004111455214672000203140ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'octo) (angle 262.68) (plane 6) (view 1.201 -0.03054 2.5 2.5) XaoS-release-4.3.2/examples/Hubicka/axe.xpf000066400000000000000000000005731455214672000205030ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1193067944 0) (formula 'mandel) (perturbation 0.30377906976744192824 -0.012500000000000000802) (angle -231.94) (plane 2) (view 899.75780161187167061 -489.31485105671990837 2850.5421224606753126 2850.5421224606753148) XaoS-release-4.3.2/examples/Hubicka/barnsl1.xpf000066400000000000000000000004721455214672000212660ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1779436629 0) (formula 'barnsley) (juliaseed 0.031613372093023257869 -1.0500000000000000676) (incoloring 1) (plane 1) (view 0.1308 0.04816 4.578 4.578) XaoS-release-4.3.2/examples/Hubicka/barnsl2.xpf000066400000000000000000000004671455214672000212730ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1356055581 0) (formula 'barnsley) (juliaseed 0.031613372093023257869 -1.0500000000000000676) (incoloring 1) (plane 3) (view 1.066 0.01309 4.98 4.98) XaoS-release-4.3.2/examples/Hubicka/barnsl3.xpf000066400000000000000000000005361455214672000212710ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1355057888 0) (formula 'barnsley) (juliaseed -1.0221656976744186704 -0.062500000000000004012) (angle -310.26) (maxiter 33) (incoloring 1) (plane 1) (view -0.78537 0.20149 0.43535 0.43535) XaoS-release-4.3.2/examples/Hubicka/barnsl4.xpf000066400000000000000000000005271455214672000212720ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 371548885 0) (formula 'barnsley) (juliaseed -1.0221656976744186704 -0.062500000000000004012) (angle -310.26) (maxiter 20) (incoloring 1) (plane 1) (view 0.1292 -0.2308 3.374 3.374) XaoS-release-4.3.2/examples/Hubicka/barnsl5.xpf000066400000000000000000000005251455214672000212710ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1808462409 0) (formula 'barnsley) (juliaseed 0.58205451272674395567 0.83592626580482287831) (angle -405.48) (maxiter 50) (incoloring 1) (plane 3) (view 1.009 0.04757 2.973 2.973) XaoS-release-4.3.2/examples/Hubicka/barnsl6.xpf000066400000000000000000000004721455214672000212730ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 558734359 0) (formula 'barnsley) (juliaseed 0.82617606890462195329 -0.59250450310750061547) (maxiter 54) (incoloring 1) (view -0.5141 0.2394 1.84 1.84) XaoS-release-4.3.2/examples/Hubicka/barnsl7.xpf000066400000000000000000000005161455214672000212730ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 2052922397 0) (formula 'barnsley) (juliaseed 0.0054390291189111917214 -1.0091451435058578867) (maxiter 38) (incoloring 2) (plane 1) (view 1.0166 -0.015562 0.55972 0.55972) XaoS-release-4.3.2/examples/Hubicka/barnsl8.xpf000066400000000000000000000005141455214672000212720ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1152232736 0) (formula 'barnsley) (juliaseed 1.0499881996553494467 0.083487582093292521238) (maxiter 81) (incoloring 1) (plane 1) (view 1.9371 -0.084016 0.28855 0.28855) XaoS-release-4.3.2/examples/Hubicka/barnsl9.xpf000066400000000000000000000004511455214672000212730ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 780290088 0) (formula 'barnsley) (angle -92.246) (maxiter 4) (incoloring 3) (julia #f) (plane 2) (view 0.9737 0.02057 0.88426 0.88426) XaoS-release-4.3.2/examples/Hubicka/beatle.xpf000066400000000000000000000004711455214672000211570ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1634629107 0) (formula 'newton) (juliaseed -1.1275436046511628632 0) (angle 92.571) (maxiter 246) (julia #t) (view -0.33483 0.0033715 0.22029 0.22029) XaoS-release-4.3.2/examples/Hubicka/beatle2.xpf000066400000000000000000000004711455214672000212410ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1233017465 0) (formula 'newton) (juliaseed -1.1275436046511628632 0) (angle 92.571) (maxiter 246) (julia #t) (view -0.33483 0.0033715 0.22029 0.22029) XaoS-release-4.3.2/examples/Hubicka/brown.xpf000066400000000000000000000004201455214672000210440ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 780175578 0) (formula 'mandel) (view 0.2989409252714 -0.01731148436377 1.153372743612E-09 1.153372744112E-09) XaoS-release-4.3.2/examples/Hubicka/checker.xpf000066400000000000000000000004451455214672000213300ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1787444754 0) (formula 'mandel3) (maxiter 70) (outcoloring 9) (incoloring 9) (plane 2) (view 2.14 -0.14 10.6 10.6) XaoS-release-4.3.2/examples/Hubicka/crone.xpf000066400000000000000000000004361455214672000210320ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 0) (formula 'newton) (juliaseed 1.0010901162790698318 0) (angle 88.884) (julia #t) (view -0.5467 -0.02844 1.927 1.927) XaoS-release-4.3.2/examples/Hubicka/dblspira.xpf000066400000000000000000000004431455214672000215220ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1741193285 0) (formula 'mandel) (maxiter 144) (outcoloring 1) (view 0.2944910925 -0.01633561217 1.083571743E-06 1.083571743E-06) XaoS-release-4.3.2/examples/Hubicka/dragons.xpf000066400000000000000000000004611455214672000213570ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 906148114 0) (formula 'phoenix) (juliaseed 0.43390385732938146351 -0.31608426045400182656) (angle -270.31) (view 0.04333 0.005463 1.846 1.846) XaoS-release-4.3.2/examples/Hubicka/dragons2.xpf000066400000000000000000000005171455214672000214430ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1787444754 0) (formula 'phoenix) (juliaseed 0.45312499999999996921 -0.32499999999999997814) (angle -269.73) (outcoloring 9) (view 0.0045 -0.0262 1.783 1.783) XaoS-release-4.3.2/examples/Hubicka/edge.xpf000066400000000000000000000003671455214672000206330ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'edge2 #t) (palette 1 863910123 0) (formula 'newton) (outcoloring 1) (view 0 0 2.5 2.5) XaoS-release-4.3.2/examples/Hubicka/edge2.xpf000066400000000000000000000004771455214672000207170ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'edge2 #t) (palette 1 25997414 0) (formula 'barnsley) (juliaseed -1.0472928330130634481 -0.087398343635324930658) (plane 1) (view -0.1851 -0.09928 7.507 7.507) XaoS-release-4.3.2/examples/Hubicka/edge3.xpf000066400000000000000000000004171455214672000207120ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'edge2 #t) (palette 1 1794703246 0) (formula 'phoenix) (outcoloring 2) (view -0.051043 0.83791 0.13455 0.13455) XaoS-release-4.3.2/examples/Hubicka/eifell.xpf000066400000000000000000000004271455214672000211640ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 2020627370 0) (formula 'octo) (angle 267.92) (maxiter 100) (incoloring 1) (plane 4) (view 1.363 0.01996 3.548 3.548) XaoS-release-4.3.2/examples/Hubicka/galaxy.xpf000066400000000000000000000004331455214672000212060ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'starfield #t) (defaultpalette 0) (formula 'mandel) (maxiter 139) (view 0.23616578 -0.56339523 0.00054982648 0.00054982648) XaoS-release-4.3.2/examples/Hubicka/goldrive.xpf000066400000000000000000000004771455214672000215440ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1843312520 0) (formula 'mandel) (juliaseed -0.72892441860465116146 -0.17500000000000001123) (outcoloring 1) (julia #t) (plane 1) (view 0.462 1.25 56.2 56.2) XaoS-release-4.3.2/examples/Hubicka/head.xpf000066400000000000000000000004721455214672000206250ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1357086155 0) (formula 'newton) (juliaseed -1.1275436046511628632 0) (angle 90.841) (maxiter 246) (julia #t) (plane 2) (view 0.5762 0.1221 8.249 8.249) XaoS-release-4.3.2/examples/Hubicka/head2.xpf000066400000000000000000000004711455214672000207060ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 2090959176 0) (formula 'octo) (juliaseed 0.010537790697674419326 0.86250000000000005547) (outcoloring 7) (julia #t) (view 0.02298 -0.9176 2.769 2.769) XaoS-release-4.3.2/examples/Hubicka/head3.xpf000066400000000000000000000005421455214672000207060ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1251438586 0) (formula 'octo) (juliaseed 0.0013961132576639388808 -0.42931197236250143498) (maxiter 251) (outcoloring 7) (incoloring 1) (julia #t) (plane 1) (view 0.05096 -0.2509 3.124 3.124) XaoS-release-4.3.2/examples/Hubicka/incolor1.xpf000066400000000000000000000005051455214672000214470ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1866031764 0) (formula 'barnsley) (juliaseed 1.1380813953488372826 0.012500000000000000802) (maxiter 5) (incoloring 4) (plane 1) (view 0.07659 -1.693 2.031 2.031) XaoS-release-4.3.2/examples/Hubicka/incolor2.xpf000066400000000000000000000004741455214672000214550ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 463989470 0) (formula 'barnsley) (juliaseed 0 1.2375000000000000798) (angle -90.843) (maxiter 3) (incoloring 7) (plane 6) (view 1.451 0.005415 2.73 2.73) XaoS-release-4.3.2/examples/Hubicka/incolor3.xpf000066400000000000000000000004171455214672000214530ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 2018811987 0) (formula 'barnsley) (maxiter 4) (incoloring 5) (plane 1) (view 0.65684 -0.42635 0.3809 0.3809) XaoS-release-4.3.2/examples/Hubicka/incolor4.xpf000066400000000000000000000006461455214672000214600ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (palette 1 1335687195 0) (formula 'newton) (juliaseed 1.0221656976744186705 -0.012500000000000000802) (angle -33.232) (maxiter 8) (outcoloring 10) (incoloring 10) (intcoloring 8) (outtcoloring 3) (julia #t) (view -0.14459 -0.49429 0.16755 0.16755) XaoS-release-4.3.2/examples/Hubicka/incolor5.xpf000066400000000000000000000005051455214672000214530ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 952328163 0) (formula 'barnsley) (juliaseed -0.010537790697674419217 1.1000000000000000708) (maxiter 8) (incoloring 4) (plane 3) (view 0.9876 0.08617 3.062 3.062) XaoS-release-4.3.2/examples/Hubicka/julia.xpf000066400000000000000000000004771455214672000210350ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1191063399 0) (formula 'mandel) (juliaseed 0.30305461922625852807 0.4504536191559173757) (maxiter 388) (julia #t) (plane 1) (view 0.2737 -2.017 1.573 1.573) XaoS-release-4.3.2/examples/Hubicka/julia2.xpf000066400000000000000000000004601455214672000211070ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 2087220895 0) (formula 'mandel5) (juliaseed 0.33669790083813088669 -0.70478147175782891021) (julia #t) (plane 1) (view 0.092 0.164 11.2 11.2) XaoS-release-4.3.2/examples/Hubicka/julia3.xpf000066400000000000000000000004661455214672000211160ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1586552168 0) (formula 'mandel3) (juliaseed 0.36882267441860467488 -0.66250000000000004263) (julia #t) (plane 1) (view -0.02118 0.5241 7.847 7.847) XaoS-release-4.3.2/examples/Hubicka/julia4.xpf000066400000000000000000000006221455214672000211110ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 238464747 0) (formula 'mandel) (juliaseed 0.25739678786865861942 -0.0010321602685012846797) (angle 51.516) (maxiter 640) (julia #t) (plane 1) (view -0.75055175079211811084 3.8688352662098150318 238.52819218580206609 238.52819218580216) XaoS-release-4.3.2/examples/Hubicka/julia5.xpf000066400000000000000000000005701455214672000211140ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1525685027 0) (formula 'mandel9) ;(formula 'user) ;(usrform "Z^9+C") (juliaseed -0.00064301262007510975534 -0.6815436624775897752) (maxiter 650) (incoloring 2) (julia #t) (view 0.38169 0.24215 0.35408 0.35408) XaoS-release-4.3.2/examples/Hubicka/juliaanim.xaf000066400000000000000000000013221455214672000216510ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1034201341 0) (formula 'mandel) (juliaseed 0.27541729708396692038 -0.0067143955333554104651) ;(angle 546.9) (angle -30.559) (maxiter 227) (julia #t) (plane 4) ;(fastrotate #t) (range 65536) ;(view -0.6751769451 0.5508651174 5.008322253E-06 5.008322253E-06) (view 3.3489798 1.1601067 0.00095219583 0.00095219583) ;(morphangle 533.9) ;(usleep 1000000) (smoothmorph 'view 3000000 3000000) (morphview 0.396 0.209 19.1 19.1) ;(morphangle -30.559) (usleep 25000000) ;(maxiter 227) ;(julia #t) ;(plane 4) ;(view 3.3489798 1.1601067 0.00095219583 0.00095219583) XaoS-release-4.3.2/examples/Hubicka/lemon.xpf000066400000000000000000000004701455214672000210340ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1307004302 0) (formula 'mandel3) (angle -23.274) (maxiter 411) (view -0.451065423507224 -0.022533000686388 6.95555389543592E-11 6.95555389577474E-11) XaoS-release-4.3.2/examples/Hubicka/light.xpf000066400000000000000000000005111455214672000210250ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1183407127 0) (formula 'barnsley) (juliaseed 1.0485101744186047187 -0.041666666666666669341) (maxiter 311) (outcoloring 1) (plane 1) (view -0.1884 -0.202 7.146 7.146) XaoS-release-4.3.2/examples/Hubicka/magnet.xpf000066400000000000000000000004071455214672000211750ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 258644272 0) (formula 'magnet) (angle -538.12) (view 1.2689826 -2.0404879 0.000258881 0.00037969213) XaoS-release-4.3.2/examples/Hubicka/magnet1.xpf000066400000000000000000000004211455214672000212520ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 2104064959 0) (formula 'magnet) (angle -361.34) (view 1.847209822 -1.339254931 7.031666521E-06 1.03131109E-05) XaoS-release-4.3.2/examples/Hubicka/magnet2.xpf000066400000000000000000000004331455214672000212560ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1979730731 0) (formula 'magnet) (angle 26.702) (outcoloring 6) (view -0.33728908 -0.37438809 0.00018856268 0.0002765586) XaoS-release-4.3.2/examples/Hubicka/magnet3.xpf000066400000000000000000000004311455214672000212550ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 135404364 0) (formula 'magnet) (angle 88.336) (outcoloring 6) (view -0.3371366 -0.37663387 0.00069439878 0.0010184515) XaoS-release-4.3.2/examples/Hubicka/magnet4.xpf000066400000000000000000000004041455214672000212560ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1228180748 0) (formula 'magnet) (angle -88.811) (outcoloring 8) (view 2.095 -0.01928 1.292 1.895) XaoS-release-4.3.2/examples/Hubicka/mand1.xpf000066400000000000000000000004711455214672000207230ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 713934512 0) (formula 'mandel) (angle 7.2443) (outcoloring 1) (view -1.94257718066544 -1.77233401902794E-05 7.92857130860539E-11 7.92857135074726E-11) XaoS-release-4.3.2/examples/Hubicka/mand2.xpf000066400000000000000000000005111455214672000207170ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1499405657 0) (formula 'mandel) (angle 7.2443) (outcoloring 1) (incoloring 1) (view -1.94257718066647 -1.77233397601984E-05 2.49864032459204E-11 2.49864033478705E-11) XaoS-release-4.3.2/examples/Hubicka/mand3.xpf000066400000000000000000000004501455214672000207220ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1361538754 0) (formula 'mandel) (periodicity #f) (maxiter 1090) (view -0.8104723634 0.2058660314 4.067601817E-06 4.067601817E-06) XaoS-release-4.3.2/examples/Hubicka/mand4.xpf000066400000000000000000000004141455214672000207230ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 420905417 0) (formula 'mandel) (maxiter 520) (view -0.76938957 -0.11612439 0.0003879837 0.0003879837) XaoS-release-4.3.2/examples/Hubicka/mand5.xpf000066400000000000000000000004501455214672000207240ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1361538754 0) (formula 'mandel) (periodicity #f) (maxiter 1090) (view -0.8104723634 0.2058660314 4.067601817E-06 4.067601817E-06) XaoS-release-4.3.2/examples/Hubicka/mand7.xpf000066400000000000000000000005121455214672000207250ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 550371047 0) (formula 'mandel3) (juliaseed 0.41537706780315403221 -0.0077789120708545871993) (incoloring 9) (julia #t) (plane 1) (view -0.02745 0.2291 9.685 9.685) XaoS-release-4.3.2/examples/Hubicka/mand8.xpf000066400000000000000000000005011455214672000207240ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1089717979 0) (formula 'mandel4) (juliaseed 0.54096954577238983938 -0.026495065869211446404) (incoloring 2) (julia #t) (view 0.01608 -0.03468 1.885 1.885) XaoS-release-4.3.2/examples/Hubicka/mandanim.xaf000066400000000000000000000006211455214672000214650ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1964145840 0) (formula 'mandel) (angle -298.35) (maxiter 440) (outcoloring 1) (view -1.7478365664 -0.0010530675304 1.4757008994E-07 1.4664645614E-07) (morphview -1.74783652 -0.00105298843 1.31944034E-05 1.31118202E-05) (usleep 5000000) XaoS-release-4.3.2/examples/Hubicka/minibrot.xpf000066400000000000000000000004151455214672000215440ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 860134713 0) (formula 'mandel) (outcoloring 1) (view -1.9854567 -1.351727E-05 0.00029196024 0.00029196024) XaoS-release-4.3.2/examples/Hubicka/newton.xaf000066400000000000000000000010421455214672000212110ustar00rootroot00000000000000 ;Animation file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -play to display it (initstate) (palette 2 448045853 0) (formula 'newton) (juliaseed -0.57957848837209298431 -1.084202172485504434E-19) (angle 90) (julia #t) (view -0.36734 0.00271247 0.074733 0.074733) (usleep 1000000) (morphview -0.6026171 9.362795E-05 0.008363483 0.008363483) (usleep 10000000) (wait) (morphview -0.45641 -0.0079525 0.48766 0.48766) (usleep 9000000) (morphview -0.4944 0.03114 1.61 1.61) (usleep 9000000) XaoS-release-4.3.2/examples/Hubicka/newton.xpf000066400000000000000000000005071455214672000212350ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1810645372 0) (formula 'newton) (juliaseed -1.1275436046511628632 0) (angle 92.571) (maxiter 246) (julia #t) (view -0.6110601 -2.484229E-05 0.006533619 0.006533619) XaoS-release-4.3.2/examples/Hubicka/newton2.xpf000066400000000000000000000005011455214672000213110ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1474001267 0) (formula 'newton) (perturbation 0.3630608199521173342 -0.0025024203536321137096) (angle -90.674) (plane 6) (view 0.7362 -0.1215 5.044 5.044) XaoS-release-4.3.2/examples/Hubicka/newton3.xpf000066400000000000000000000005151455214672000213170ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 928821037 0) (formula 'newton) (juliaseed -0.021075581878891157901 -1.084202172485504434E-19) (angle -447.54) (julia #t) (plane 1) (view -0.9045 -0.02173 4.838 4.838) XaoS-release-4.3.2/examples/Hubicka/octo.xpf000066400000000000000000000004431455214672000206660ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1626860739 0) (formula 'octo) (perturbation 0 0.02499999999999999987) (maxiter 400) (view 0.0086889 0.22339 0.71627 0.71627) XaoS-release-4.3.2/examples/Hubicka/palace.xpf000066400000000000000000000004751455214672000211540ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 871883963 0) (formula 'newton) (juliaseed -0.80087209302325586545 0) (angle -90.851) (maxiter 251) (julia #t) (plane 1) (view -2.254 0.006638 1.532 1.532) XaoS-release-4.3.2/examples/Hubicka/perb1.xpf000066400000000000000000000004741455214672000207370ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1298613279 0) (formula 'newton) (perturbation 0.29505813953488373993 -0.012500000000000000802) (angle 270.17) (plane 2) (view -1.877 0.04055 6.545 6.545) XaoS-release-4.3.2/examples/Hubicka/perb2.xpf000066400000000000000000000004151455214672000207330ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 661894305 0) (formula 'octo) (perturbation 0 -0.025000000000000001605) (plane 1) (view 0.452 -0.086 14 14) XaoS-release-4.3.2/examples/Hubicka/perb3.xpf000066400000000000000000000004671455214672000207430ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 783556080 0) (formula 'newton) (perturbation -0.36882267441860467488 -0.012500000000000000802) (incoloring 1) (view 2.5795 0.027209 0.99831 0.99831) XaoS-release-4.3.2/examples/Hubicka/perb4.xpf000066400000000000000000000005411455214672000207350ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (palette 2 2140656163 0) (formula 'barnsley) (perturbation 1.6755087209302326659 0) (angle -90.103) (outcoloring 10) (outtcoloring 9) (julia #f) (view 2.036 0.009591 1.128 1.128) XaoS-release-4.3.2/examples/Hubicka/perb5.xpf000066400000000000000000000005171455214672000207410ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1570942905 0) (formula 'newton) (perturbation -0.23183139534883722422 -0.012500000000000000802) (outcoloring 9) (incoloring 7) (plane 5) (view -0.0582 -0.01618 2.798 2.798) XaoS-release-4.3.2/examples/Hubicka/phoenix1.xpf000066400000000000000000000005101455214672000214500ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'edge2 #t) (palette 1 648727946 0) (formula 'phoenix) (juliaseed 0.45253955912025619886 -0.34249979558792155026) (angle -86.66) (view 0.29592 -0.011293 0.87138 0.87138) XaoS-release-4.3.2/examples/Hubicka/phoenix2.xpf000066400000000000000000000005371455214672000214620ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'edge2 #t) (palette 1 1818332444 0) (formula 'phoenix) (juliaseed -1.6254158351760713887 -0.0026744345827714052581) (outcoloring 2) (view -1.6242919 1.6685891E-05 0.00055702709 0.00055702709) XaoS-release-4.3.2/examples/Hubicka/redjulia.xpf000066400000000000000000000005321455214672000215200ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 155652149 0) (formula 'mandel) (juliaseed 0.29449576229535342093 -0.016332967445424519366) (maxiter 127) (outcoloring 1) (julia #t) (view 0.000765158 -0.000268691 0.0186372 0.0186372) XaoS-release-4.3.2/examples/Hubicka/redmand.xpf000066400000000000000000000004101455214672000213260ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 155652149 0) (formula 'mandel) (maxiter 127) (view 0.19232992 0.59284158 0.00015478901 0.00015478901) XaoS-release-4.3.2/examples/Hubicka/redmand2.xpf000066400000000000000000000004361455214672000214200ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 155652149 0) (formula 'mandel) (maxiter 127) (outcoloring 1) (view 0.294490997 -0.0163372737 1.38726242E-05 1.38726242E-05) XaoS-release-4.3.2/examples/Hubicka/rocks.xpf000066400000000000000000000005151455214672000210430ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 985867394 0) (formula 'newton) (juliaseed 0.0058931089247213081752 0.0044899066259199158438) (angle 98.028) (julia #t) (view 0.04955468 0.3812751 0.004336217 0.004336217) XaoS-release-4.3.2/examples/Hubicka/shell.xpf000066400000000000000000000004401455214672000210260ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1562608479 0) (formula 'octo) (perturbation 0 0.037499999999999999913) (maxiter 400) (plane 1) (view 93.5 18.5 11.6 11.6) XaoS-release-4.3.2/examples/Hubicka/something.xpf000066400000000000000000000005051455214672000217160ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1324546019 0) (formula 'newton) (juliaseed -10.313231153031323321 -0.0036702265483384757111) (outcoloring 8) (julia #t) (plane 5) (view 0.1202 0.0131 3.064 3.064) XaoS-release-4.3.2/examples/Hubicka/spiral.xpf000066400000000000000000000005651455214672000212210ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 34) (formula 'mandel3) (filter 'palette #t) (cycling #t) (cyclingspeed 45) (juliaseed 0.062415825408122496282 -0.77685069099231027928) (maxiter 590) (julia #t) (view 0.0070184 0.003958 0.13512 0.13512) XaoS-release-4.3.2/examples/Hubicka/spiral2.xpf000066400000000000000000000003741455214672000213010ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1082198693 0) (formula 'mandel) (view 0.26295837 -0.0024249198 0.0001027196 0.0001027196) XaoS-release-4.3.2/examples/Hubicka/spiral3.xpf000066400000000000000000000004121455214672000212730ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1910318292 0) (formula 'mandel) (outcoloring 8) (view 0.329878 -0.04210678 0.001420267 0.001420267) XaoS-release-4.3.2/examples/Hubicka/spiral4.xpf000066400000000000000000000005511455214672000213000ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (defaultpalette 0) (formula 'mandel) (juliaseed 0.25701005261873154242 -0.00095118413200572324323) (outcoloring 10) (outtcoloring 4) (julia #t) (plane 1) (view 0.627 0.869 43.7 43.7) XaoS-release-4.3.2/examples/Hubicka/sprial.xpf000066400000000000000000000005261455214672000212160ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1112927008 0) (formula 'mandel) (juliaseed -0.080850290697674375517 0.68229166666666671054) (outcoloring 1) (incoloring 1) (julia #t) (view 0.239593 -0.462394 0.0574963 0.0574963) XaoS-release-4.3.2/examples/Hubicka/sun.xpf000066400000000000000000000005211455214672000205240ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1283437285 0) (formula 'phoenix) (juliaseed 0.1901522684107088305 0.76657698818178892958) (angle -155.51) (maxiter 331) (outcoloring 1) (view 0.29204 0.63386 0.16135 0.16135) XaoS-release-4.3.2/examples/Hubicka/thebug.xpf000066400000000000000000000004211455214672000211740ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1387561158 0) (formula 'mandel3) (outcoloring 8) (incoloring 1) (plane 1) (view -0.007384 -0.1227 3.917 3.917) XaoS-release-4.3.2/examples/Hubicka/tower.xpf000066400000000000000000000004601455214672000210610ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 959136425 0) (formula 'newton) (juliaseed 1.0010901162790698318 0) (angle 88.884) (julia #t) (view -0.603817 0.000543598 0.0629232 0.0629232) XaoS-release-4.3.2/examples/Hubicka/tree.xpf000066400000000000000000000004621455214672000206620ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 959136425 0) (formula 'newton) (juliaseed 1.0010901162790698318 0) (angle 98.028) (julia #t) (view 0.252905 -0.5152498 0.004158874 0.004158874) XaoS-release-4.3.2/examples/Hubicka/triangle.xpf000066400000000000000000000004411455214672000215250ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 590960451 0) (formula 'mandel3) (maxiter 311) (outcoloring 1) (view 0.4441447404 0.0215520724 6.388399051E-06 6.388399051E-06) XaoS-release-4.3.2/examples/Hubicka/truecol1.xpf000066400000000000000000000006341455214672000214620ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (defaultpalette 0) (formula 'barnsley) (juliaseed 1.0167106653307867366 0.13217291168136122235) (angle 309.72) (maxiter 10) (outcoloring 10) (incoloring 10) (intcoloring 7) (outtcoloring 2) (plane 1) (view -0.009958 -0.03939 3.504 3.504) XaoS-release-4.3.2/examples/Hubicka/truecol2.xpf000066400000000000000000000004771455214672000214700ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (defaultpalette 0) (formula 'barnsley) (maxiter 1) (outcoloring 10) (incoloring 10) (intcoloring 3) (plane 3) (view 0.9983 -0.05054 2.833 2.833) XaoS-release-4.3.2/examples/Hubicka/truecol3.xpf000066400000000000000000000005751455214672000214700ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -1.1486191860465117017 -0.0052083333333333336947) (maxiter 6) (outcoloring 10) (incoloring 10) (intcoloring 7) (outtcoloring 3) (plane 1) (view 0 0 2.5 2.5) XaoS-release-4.3.2/examples/Hubicka/truecol4.xpf000066400000000000000000000005431455214672000214640ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -1.061950111406869338 0.04163929049388898334) (maxiter 14) (incoloring 10) (intcoloring 2) (plane 1) (view 2.61 -0.0867 71.8 71.8) XaoS-release-4.3.2/examples/Hubicka/truecol5.xpf000066400000000000000000000005531455214672000214660ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -0.95900233293846147919 0.51868772447175426398) (maxiter 14) (incoloring 10) (intcoloring 6) (plane 5) (view -0.0677 -0.02876 4.106 4.106) XaoS-release-4.3.2/examples/Hubicka/truecol6.xpf000066400000000000000000000005131455214672000214630ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 718095456 0) (filter 'truecolor #t) (formula 'magnet) (angle -90) (maxiter 3) (incoloring 10) (intcoloring 2) (julia #t) (plane 1) (view 0.09422 0.004921 1.11 1.11) XaoS-release-4.3.2/examples/Hubicka/truecol7.xpf000066400000000000000000000006011455214672000214620ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (palette 3 890748090 0) (formula 'barnsley) (juliaseed 0.61070761175562445042 -1.0807214554975420139) (angle -90.958) (maxiter 14) (incoloring 10) (intcoloring 8) (plane 6) (view 1.963 -0.02066 3.813 3.813) XaoS-release-4.3.2/examples/Hubicka/ufo.xpf000066400000000000000000000004201455214672000205060ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.0 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1272174002 0) (formula 'octo) (angle 91.79) (outcoloring 9) (incoloring 1) (plane 2) (view 0.615 0.734 31 31) XaoS-release-4.3.2/examples/Langston/000077500000000000000000000000001455214672000174215ustar00rootroot00000000000000XaoS-release-4.3.2/examples/Langston/animal.xpf000066400000000000000000000005331455214672000214020ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 1 427368893 0) (formula 'mandel) (angle -237.16) (maxiter 2980) (outcoloring 9) (view -1.039657910478846 0.3483215557764378 1.163060099618196E-12 1.157784670002479E-12) XaoS-release-4.3.2/examples/Langston/butterfly-langston.xpf000066400000000000000000000004141455214672000240020ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 3 917234429 0) (formula 'newton4) (outcoloring 5) (plane 2) (view 0.9323 1.405 1.48 1.48) XaoS-release-4.3.2/examples/Langston/eye.xpf000066400000000000000000000005201455214672000207170ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 3 9721874 0) (formula 'mandel) (angle -237.16) (maxiter 1000) (outcoloring 9) (view -1.0396579104749 0.34832155577314 2.6578793094374E-10 2.645819675818E-10) XaoS-release-4.3.2/examples/Langston/newcolor.xpf000066400000000000000000000005221455214672000217670ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 1 427368893 0) (formula 'mandel) (angle -237.16) (maxiter 2980) (outcoloring 9) (view -1.0396579104749 0.34832155577314 2.6578793094374E-10 2.645819675818E-10) XaoS-release-4.3.2/examples/Langston/newt.xpf000066400000000000000000000004131455214672000211130ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 3 772826840 0) (formula 'newton4) (outcoloring 5) (plane 2) (view 4.47 -0.551 42.9 42.9) XaoS-release-4.3.2/examples/Langston/newt2.xpf000066400000000000000000000004171455214672000212010ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 1 429494755 0) (formula 'newton4) (outcoloring 5) (plane 3) (view 1.078 -0.0161 3.104 3.104) XaoS-release-4.3.2/examples/Langston/paisleypillow.xpf000066400000000000000000000005531455214672000230400ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 1 427368893 0) (formula 'mandel) (angle -237.16) (maxiter 3530) (outcoloring 9) (view -1.0396579104786746313 0.34832155577651026376 1.1763593571467723109E-16 1.1899118843028411163E-16) XaoS-release-4.3.2/examples/Langston/paramecium.xpf000066400000000000000000000005071455214672000222650ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 3 1770716011 0) (formula 'mandel) (maxiter 1120) (view -1.78004340404337635 -0.00140603578700076483 1.46665448882976612E-14 1.46663734700049606E-14) XaoS-release-4.3.2/examples/Langston/pretty.xpf000066400000000000000000000005031455214672000214650ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 2 1364804877 0) (formula 'mandel) (maxiter 487) (outcoloring 9) (view 0.45238010154254 0.39608956622847 5.2698759603082E-10 5.2459672847047E-10) XaoS-release-4.3.2/examples/Langston/pretty2.xpf000066400000000000000000000004671455214672000215600ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 3 9721874 0) (formula 'mandel) (maxiter 1000) (outcoloring 9) (view -1.03965791284 0.348321559351 3.5236094014E-08 3.5076216803E-08) XaoS-release-4.3.2/examples/Langston/royal.xpf000066400000000000000000000005201455214672000212630ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 1 196425230 0) (formula 'mandel) (maxiter 2290) (outcoloring 9) (view -1.0760893740981335 -0.27889499350977533 1.0706333822968483E-13 1.0706396164593401E-13) XaoS-release-4.3.2/examples/Langston/rpg.xpf000066400000000000000000000005431455214672000207320ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 1 427368893 0) (formula 'mandel) (angle -237.16) (maxiter 2980) (outcoloring 9) (view -1.03965791047867516 0.348321555776510037 1.52938642652977741E-14 1.52239874352810833E-14) XaoS-release-4.3.2/examples/Langston/whisp.xpf000066400000000000000000000005521455214672000212740ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.4 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 2 209863285 0) (formula 'newton) (juliaseed -0.021075581878891157901 -1.084202172485504434E-19) (angle -447.54) (julia #t) (plane 1) (view -2.422864 0.6175621 0.003080893 0.003080893) XaoS-release-4.3.2/examples/Malczak/000077500000000000000000000000001455214672000172165ustar00rootroot00000000000000XaoS-release-4.3.2/examples/Malczak/alien.xpf000066400000000000000000000005161455214672000210270ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1792731671 0) (formula 'user) (usrform "C*Z*LOG(Z)") (usrformInit "") (angle -90.35) (maxiter 500) (bailout 20) (outcoloring 7) (plane 1) (view 0.537 0.1449 4.178 4.178) XaoS-release-4.3.2/examples/Malczak/burnship.xpf000066400000000000000000000004571455214672000215750ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 0) (formula 'user) (usrform "POWI(RABS(Z)+I*RABS(IM(Z));2)+C") (usrformInit "") (bailout 120) (view -1.758 -0.038464 0.11233 0.11233) XaoS-release-4.3.2/examples/Malczak/butterfly.xpf000066400000000000000000000004661455214672000217630ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 0) (formula 'user) (usrform "Z^2+C") (usrformInit "SIN(RE(C))-I*IM(C)") (maxiter 520) (view -1.747608 -4.104505E-05 0.009723883 0.009723883) XaoS-release-4.3.2/examples/Malczak/circle.xpf000066400000000000000000000005041455214672000211750ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (defaultpalette 0) (formula 'user) (usrform "LOGN(5;Z^2)+C") (usrformInit "") (maxiter 200) (outcoloring 1) (plane 1) (view -0.3714 0.01315 1.778 1.778) XaoS-release-4.3.2/examples/Malczak/dark.xpf000066400000000000000000000004721455214672000206610ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1196652293 0) (formula 'user) (usrform "COSH(Z^3+C)SINH(Z^1.2)+C") (usrformInit "") (maxiter 360) (outcoloring 5) (view 0.1534 -0.007112 2.195 2.195) XaoS-release-4.3.2/examples/Malczak/eyes.xpf000066400000000000000000000005741455214672000207100ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (defaultpalette 0) (formula 'user) (usrform "EXP(Z)+C") (usrformInit "") (juliaseed -0.94280443112989110202 -0.004527757333355704461) (angle 90.364) (maxiter 500) (julia #t) (view -0.2878 -0.1179 2.066 2.066) XaoS-release-4.3.2/examples/Malczak/heart.xpf000066400000000000000000000005751455214672000210470ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 1 1400652044 0) (shiftpalette 11) (formula 'user) (usrform "RTNI(Z;12;6)(1-Z)+C") (usrformInit "") (angle -90.921) (maxiter 100) (outcoloring 6) (incoloring 7) (view 0.88195 -0.012873 0.36361 0.36361) XaoS-release-4.3.2/examples/Malczak/helloween.xpf000066400000000000000000000005641455214672000217240ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 3 456535883 0) (formula 'user) (usrform "POWD(SINH(POWD(Z;1.2));2.8)+C") (usrformInit "") (angle 90.724) (maxiter 20) (outcoloring 6) (incoloring 7) (plane 1) (view 0.1559 0.1831 5.607 5.607) XaoS-release-4.3.2/examples/Malczak/pentafrac.xpf000066400000000000000000000004541455214672000217030ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 0) (formula 'user) (usrform "I*LOGN(10;Z^6)^3+C") (usrformInit "") (maxiter 710) (outcoloring 7) (view 0.1072 0.02068 3.225 3.225) XaoS-release-4.3.2/examples/Malczak/skullfrm.xpf000066400000000000000000000004501455214672000215730ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 0) (formula 'user) (usrform "COSH(Z^3+C)SINH(Z^1.2)+C") (usrformInit "") (maxiter 360) (view 0.11164 0.015088 0.99076 0.99076) XaoS-release-4.3.2/examples/Malczak/warriormask.xpf000066400000000000000000000005731455214672000223030ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'anti #t) (palette 3 456535883 0) (formula 'user) (usrform "POWD(SINH(POWD(Z;1.2));2.8)+C-0.2P^2") (usrformInit "") (angle 90.724) (maxiter 20) (outcoloring 6) (incoloring 7) (plane 1) (view 0.1559 0.1831 5.607 5.607) XaoS-release-4.3.2/examples/README000066400000000000000000000165611455214672000165250ustar00rootroot00000000000000Examples and their authors -------------------------- The examples have been grouped into different directories according to the authors. To contact Daniel Skarda, visit http://atrey.karlin.mff.cuni.cz/~0rfelyus, to write to Zsigmond Kovács, go to http://kovzsi.hu. All example fractals are copyrighted by their original authors, but may be reproduced in any form. You are also encouraged to contribute your own generated fractals. 0rfel1.xpf contains Daniel Skarda: 0rfelyus 1 (1997) 0rfel2.xpf contains Daniel Skarda: 0rfelyus 2 (1997) 2spirals.xpf contains Jan Hubicka: Two Spirals (1997) 3d1.xpf contains Jan Hubicka: 3D 1 (1997) 3d2.xpf contains Jan Hubicka: 3D 2 (1997) 3d3.xpf contains Jan Hubicka: 3D 3 (1997) 3d4.xpf contains Jan Hubicka: 3D 4 (1997) 3d5.xpf contains Jan Hubicka: 3D 5 (1997) 3d6.xpf contains Jan Hubicka: 3D 6 (1997) 3d7.xpf contains Jan Hubicka: 3D 7 (1997) 3d8.xpf contains Jan Hubicka: 3D 8 (1997) 3d9.xpf contains Jan Hubicka: 3D 9 (1997) axe.xpf contains Jan Hubicka: Axe (1997) barnsl1.xpf contains Jan Hubicka: Barnsley 1 (1997) barnsl2.xpf contains Jan Hubicka: Barnsley 2 (1997) barnsl3.xpf contains Jan Hubicka: Barnsley 3 (1997) barnsl4.xpf contains Jan Hubicka: Barnsley 4 (1997) barnsl5.xpf contains Jan Hubicka: Barnsley 5 (1997) barnsl6.xpf contains Jan Hubicka: Barnsley 6 (1997) barnsl7.xpf contains Jan Hubicka: Barnsley 7 (1997) barnsl8.xpf contains Jan Hubicka: Barnsley 8 (1997) barnsl9.xpf contains Jan Hubicka: Barnsley 9 (1997) beatle2.xpf contains Jan Hubicka: Beatle 2 (1997) beatle.xpf contains Jan Hubicka: Beatle (1997) bolygo.xpf contains Zsigmond Kovács: Bolygó (2004) brown.xpf contains Jan Hubicka: Brown (1997) checker.xpf contains Jan Hubicka: Checker (1997) crone.xpf contains Jan Hubicka: Crone (1997) csiga2.xpf contains Zsigmond Kovács: Csiga 2 (2004) csiga3.xpf contains Zsigmond Kovács: Csiga 3 (2004) csiga4.xpf contains Zsigmond Kovács: Csiga 4 (2004) csiga5.xpf contains Zsigmond Kovács: Csiga 5 (2004) dblspira.xpf contains Jan Hubicka: Double Spiral (1997) dragons2.xpf contains Jan Hubicka: Dragons 2 (1997) dragons.xpf contains Jan Hubicka: Dragons 1 (1997) edge2.xpf contains Jan Hubicka: Edge 2 (1997) edge3.xpf contains Jan Hubicka: Edge 3 (1997) edge.xpf contains Jan Hubicka: Edge (1997) eifell.xpf contains Jan Hubicka: Eifel l (1997) fract0.xpf contains Kovács Zoltán: The Machine (2004) fract1.xpf contains Kovács Zoltán: The Machine Needs Another Sacrifice (2004) galaxy.xpf contains Jan Hubicka: Galaxy (1997) gamma.xpf contains Zsigmond Kovács: Gamma (2004) golden.xpf contains Zsigmond Kovács: Golden (2004) goldrive.xpf contains Jan Hubicka: goldrive (1997) head2.xpf contains Jan Hubicka: Head 2 (1997) head3.xpf contains Jan Hubicka: Head 3 (1997) head.xpf contains Jan Hubicka: Head 1 (1997) impulzus.xpf contains Zsigmond Kovács: Impulzus (2004) incolor1.xpf contains Jan Hubicka: Incolor 1 (1997) incolor2.xpf contains Jan Hubicka: Incolor 2 (1997) incolor3.xpf contains Jan Hubicka: Incolor 3 (1997) incolor4.xpf contains Jan Hubicka: Incolor 4 (1997) incolor5.xpf contains Jan Hubicka: Incolor 5 (1997) julia2.xpf contains Jan Hubicka: Julia 2 (1997) julia3.xpf contains Jan Hubicka: Julia 3 (1997) julia4.xpf contains Jan Hubicka: Julia 4 (1997) julia5.xpf contains Jan Hubicka: Julia 5 (1997) julia.xpf contains Jan Hubicka: Julia 1 (1997) kovzsi10.2.xpf contains Zsigmond Kovács: Gyöngysor (2004) kovzsi12.xpf contains Zsigmond Kovács: Jame's Brown (2004) kovzsi14.xpf contains Zsigmond Kovács: Páfrány (2004) kovzsi15.xpf contains Zsigmond Kovács: Perzselt lombok (2004) kovzsi16.xpf contains Zsigmond Kovács: Kaktusz (2004) kovzsi17.xpf contains Zsigmond Kovács: Aréna (2004) kovzsi2.1.xpf contains Zsigmond Kovács: Sárkány (2004) kovzsi2.xpf contains Zsigmond Kovács: Barlang (2004) kovzsi3.1.xpf contains Zsigmond Kovács: Tengerfenék (2004) kovzsi3.2.xpf contains Zsigmond Kovács: Vakító (hol)nap (2004) kovzsi4.xpf contains Zsigmond Kovács: Kein Schar (2004) kovzsi6.1.xpf contains Zsigmond Kovács: Kávéút (2004) kovzsi6.2.xpf contains Zsigmond Kovács: Kávé jut (2004) kovzsi6.xpf contains Zsigmond Kovács: Tejút (2004) kovzsi7.1.xpf contains Zsigmond Kovács: Zöldág (2004) kovzsi7.2.xpf contains Zsigmond Kovács: Aranyág (2004) kovzsi7.3.xpf contains Zsigmond Kovács: Mimóza (2004) kovzsi7.4.xpf contains Zsigmond Kovács: Burjánzás (2004) kovzsi7.5.xpf contains Zsigmond Kovács: Intruder (2004) kovzsi8.xpf contains Zsigmond Kovács: Genezis (2004) kovzsi9.2.xpf contains Zsigmond Kovács: Pyramid I. (2004) kovzsi9.xpf contains Zsigmond Kovács: Pyramid 0. (2004) kovzsi.xpf contains Zsigmond Kovács: Hab (2004) kovzsipro.xpf contains Zsigmond Kovács: Sztrogoff Mihály (2004) lemon.xpf contains Jan Hubicka: Lemon (1997) lighting.xpf contains Zsigmond Kovács: Lighting (2004) light-kovzsi.xpf contains Jan Hubicka: Light (1997) magnet1.xpf contains Jan Hubicka: Magnet 1 (1997) magnet2.xpf contains Jan Hubicka: Magnet 2 (1997) magnet3.xpf contains Jan Hubicka: Magnet 3 (1997) magnet4.xpf contains Jan Hubicka: Magnet 4 (1997) magnet.xpf contains Jan Hubicka: Magnet (1997) mand1.xpf contains Jan Hubicka: Mand 1 (1997) mand2.xpf contains Jan Hubicka: Mand 2 (1997) mand4.xpf contains Jan Hubicka: Mand 4 (1997) mand5.xpf contains Jan Hubicka: Mand 5 (1997) mand7.xpf contains Jan Hubicka: Mand 7 (1997) mand8.xpf contains Jan Hubicka: Mand 8 (1997) mand9.xpf contains Kovács Zoltán: Villámlás (2003) minibrot.xpf contains Jan Hubicka: Minibrot (1997) nap.xpf contains Zsigmond Kovács: Nap (2004) newton2.xpf contains Jan Hubicka: Newton 2 (1997) newton3.xpf contains Jan Hubicka: Newton 3 (1997) newton.xpf contains Jan Hubicka: Newton 1 (1997) octo.xpf contains Jan Hubicka: Octo (1997) orveny.xpf contains Zsigmond Kovács: Örvény (2004) palace.xpf contains Jan Hubicka: Palace (1997) pavaszem2.xpf contains Zsigmond Kovács: Pávaszem 2 (2004) pavaszem.xpf contains Zsigmond Kovács: Pávaszem (2004) pepita.xpf contains Zsigmond Kovács: Pepita (2004) perb1.xpf contains Jan Hubicka: Perb 1 (1997) perb2.xpf contains Jan Hubicka: Perb 2 (1997) perb3.xpf contains Jan Hubicka: Perb 3 (1997) perb4.xpf contains Jan Hubicka: Perb 4 (1997) perb5.xpf contains Jan Hubicka: Perb 5 (1997) phoenix1.xpf contains Jan Hubicka: Phoenix1 (1997) phoenix2.xpf contains Jan Hubicka: Phoenix2 (1997) redjulia.xpf contains Jan Hubicka: Red Julia (1997) redmand2.xpf contains Jan Hubicka: Red Mand2 (1997) redmand.xpf contains Jan Hubicka: Red Mand (1997) rocks.xpf contains Jan Hubicka: Rocks (1997) shell.xpf contains Jan Hubicka: Shell (1997) something.xpf contains Jan Hubicka: Something (1997) spiral2.xpf contains Jan Hubicka: Spiral 2 (1997) spiral3.xpf contains Jan Hubicka: Spiral 3 (1997) spiral4.xpf contains Jan Hubicka: Spiral 4 (1997) spiral.xpf contains Jan Hubicka: Spiral (1997) sprial.xpf contains Jan Hubicka: Sprial (1997) sun.xpf contains Jan Hubicka: Sun (1997) thebug.xpf contains Jan Hubicka: The Bug (1997) tower.xpf contains Jan Hubicka: Tower (1997) tree.xpf contains Jan Hubicka: Tree (1997) triangle.xpf contains Jan Hubicka: Triangle (1997) truecol1.xpf contains Jan Hubicka: Truecol 1 (1997) truecol2.xpf contains Jan Hubicka: Truecol 2 (1997) truecol3.xpf contains Jan Hubicka: Truecol 3 (1997) truecol4.xpf contains Jan Hubicka: Truecol 4 (1997) truecol5.xpf contains Jan Hubicka: Truecol 5 (1997) truecol6.xpf contains Jan Hubicka: Truecol 6 (1997) truecol7.xpf contains Jan Hubicka: Truecol 7 (1997) ufo.xpf contains Jan Hubicka: Ufo (1997) XaoS-release-4.3.2/examples/ZKovacs/000077500000000000000000000000001455214672000172145ustar00rootroot00000000000000XaoS-release-4.3.2/examples/ZKovacs/fract0.xpf000066400000000000000000000004451455214672000211150ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'truecolor #t) (palette 3 1171241641 0) (formula 'newton) (angle -150.19) (view -0.0008614612 0.0005988902 0.002088403 0.002088403) XaoS-release-4.3.2/examples/ZKovacs/fract1.xpf000066400000000000000000000004131455214672000211110ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 738969834 0) (formula 'mandel) (maxiter 400) (outcoloring 1) (plane 1) (view 1.358 -0.02348 3.956 3.956) XaoS-release-4.3.2/examples/ZKovacs/hornflake1.xpf000066400000000000000000000004311455214672000217630ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1833823048 0) (formula 'hornflake) (angle -269.68) (outcoloring 8) (incoloring 2) (view -0.8888 -0.008993 2.626 2.626) XaoS-release-4.3.2/examples/ZKovacs/hornflake2.xpf000066400000000000000000000004021455214672000217620ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.2 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 0) (formula 'hornflake) (angle -269.68) (outcoloring 3) (view -0.7818 -0.003706 2.86 2.86) XaoS-release-4.3.2/examples/ZKovacs/mand9.xpf000066400000000000000000000005561455214672000207510ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1-6 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it ;Saved by Zoltan Kovacs (initstate) (palette 3 496022352 0) (formula 'mandel) (maxiter 860) (view -1.779346546214150062 0.001338480738707815055 2.229770187933688419E-15 2.227846893747829123E-15) XaoS-release-4.3.2/examples/ZsKovacs/000077500000000000000000000000001455214672000173775ustar00rootroot00000000000000XaoS-release-4.3.2/examples/ZsKovacs/bolygo.xpf000066400000000000000000000004211455214672000214060ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 378470941 0) (formula 'magnet) (angle -361.34) (view 1.847208668 -1.339256286 5.070127709E-06 7.436187309E-06) XaoS-release-4.3.2/examples/ZsKovacs/csiga2.xpf000066400000000000000000000004261455214672000212700ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1841018718 0) (formula 'magnet) (angle 88.336) (outcoloring 6) (view -0.3369098 -0.3762873 0.001193811 0.001750923) XaoS-release-4.3.2/examples/ZsKovacs/csiga3.xpf000066400000000000000000000004251455214672000212700ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 821561484 0) (formula 'magnet) (angle 88.336) (outcoloring 6) (view -0.3369098 -0.3762873 0.001193811 0.001750923) XaoS-release-4.3.2/examples/ZsKovacs/csiga4.xpf000066400000000000000000000004261455214672000212720ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1290469621 0) (formula 'magnet) (angle 88.336) (outcoloring 6) (view -0.3369098 -0.3762873 0.001193811 0.001750923) XaoS-release-4.3.2/examples/ZsKovacs/csiga5.xpf000066400000000000000000000004261455214672000212730ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1541168959 0) (formula 'magnet) (angle 88.336) (outcoloring 6) (view -0.3369098 -0.3762873 0.001193811 0.001750923) XaoS-release-4.3.2/examples/ZsKovacs/gamma.xpf000066400000000000000000000005031455214672000211760ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 11513334 0) (formula 'mandel4) (juliaseed 0.54096954577238983938 -0.026495065869211446404) (incoloring 2) (julia #t) (view -0.148592 0.103841 0.012825 0.012825) XaoS-release-4.3.2/examples/ZsKovacs/golden.xpf000066400000000000000000000004341455214672000213670ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1307004302 0) (formula 'mandel3) (angle -23.274) (maxiter 411) (view -0.55067212 -0.17451537 0.00078012605 0.00078012605) XaoS-release-4.3.2/examples/ZsKovacs/impulzus.xpf000066400000000000000000000005031455214672000220040ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 532743710 0) (formula 'barnsley) (juliaseed 1.0485101744186047187 -0.041666666666666669341) (maxiter 311) (outcoloring 1) (plane 1) (view -3.98 -2.81 20.4 20.4) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi10.2.xpf000066400000000000000000000005161455214672000217460ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1843768384 0) (formula 'barnsley) (juliaseed 1.0499881996553494467 0.083487582093292521238) (maxiter 81) (incoloring 1) (plane 1) (view -0.71363 0.0075101 0.27275 0.27275) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi12.xpf000066400000000000000000000004201455214672000216020ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 780175578 0) (formula 'mandel) (view 0.2989409256291 -0.01731148427383 1.335782348502E-09 1.335782348528E-09) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi14.xpf000066400000000000000000000004521455214672000216110ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1741193285 0) (formula 'mandel) (maxiter 144) (outcoloring 1) (view 0.294492327157 -0.016335566672 2.53190145657E-08 2.53190145654E-08) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi15.xpf000066400000000000000000000004441455214672000216130ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1957368558 0) (formula 'mandel3) (maxiter 70) (outcoloring 9) (incoloring 9) (plane 2) (view 0.96546 1.24782 0.0181954 0.0181954) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi16.xpf000066400000000000000000000004711455214672000216140ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 867832577 0) (formula 'mandel) (angle 7.2443) (outcoloring 1) (view -1.94257718068738 -1.77233235868353E-05 9.16863387512637E-11 9.16863397212306E-11) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi17.xpf000066400000000000000000000004161455214672000216140ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 420905417 0) (formula 'mandel) (maxiter 520) (view -0.769502838 -0.116273301 7.88488347E-05 7.88488347E-05) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi2.1.xpf000066400000000000000000000004361455214672000216670ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1932989413 0) (formula 'mandel) (maxiter 402) (outcoloring 1) (plane 1) (view -0.9502523 0.2584479 0.001985157 0.001985157) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi2.xpf000066400000000000000000000004261455214672000215270ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 392298113 0) (formula 'mandel) (maxiter 402) (outcoloring 1) (plane 1) (view -0.87618 0.299721 0.0564895 0.0564895) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi3.1.xpf000066400000000000000000000004361455214672000216700ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1896280930 0) (formula 'magnet) (maxiter 400) (outcoloring 1) (plane 1) (view 0.4514631 -0.4518334 0.003683064 0.005401828) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi3.2.xpf000066400000000000000000000004531455214672000216700ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 581785611 0) (formula 'newton) (maxiter 400) (outcoloring 1) (plane 1) (view -0.8301499718 0.1223937137 4.130219599E-06 4.130219599E-06) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi4.xpf000066400000000000000000000004351455214672000215310ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1990627390 0) (formula 'mandel) (maxiter 402) (outcoloring 1) (plane 1) (view -0.9509846 0.258386 0.001985157 0.001985157) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi6.1.xpf000066400000000000000000000003601455214672000216670ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1278910061 0) (formula 'phoenix) (view 0.115843 0.624705 0.0290119 0.0290119) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi6.2.xpf000066400000000000000000000003571455214672000216760ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 966102831 0) (formula 'phoenix) (view 0.105812 0.619032 0.0110159 0.0110159) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi6.xpf000066400000000000000000000003601455214672000215300ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1393010519 0) (formula 'phoenix) (view 0.206607 0.562805 0.0151664 0.0151664) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi7.1.xpf000066400000000000000000000003741455214672000216750ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1449951317 0) (formula 'mandel) (view -0.27856551 0.75057008 0.00062031881 0.00062031881) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi7.2.xpf000066400000000000000000000003731455214672000216750ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 948913282 0) (formula 'mandel) (view -0.27856551 0.75057008 0.00062031881 0.00062031881) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi7.3.xpf000066400000000000000000000003741455214672000216770ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 2052240142 0) (formula 'mandel) (view -0.27856551 0.75057008 0.00062031881 0.00062031881) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi7.4.xpf000066400000000000000000000004001455214672000216660ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1954684372 0) (formula 'mandel) (view -0.278870752 0.750683154 1.06458871E-05 1.06458871E-05) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi7.5.xpf000066400000000000000000000004041455214672000216730ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1394478746 0) (formula 'mandel) (view -0.2788770307 0.7506812087 1.789407946E-06 1.789407946E-06) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi8.xpf000066400000000000000000000005441455214672000215360ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1034201341 0) (formula 'mandel) (juliaseed 0.27541729708396692038 -0.0067143955333554104651) (angle -30.559) (maxiter 227) (outcoloring 2) (julia #t) (plane 4) (view -4.115 -0.5451 1.417 1.417) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi9.2.xpf000066400000000000000000000004741455214672000217010ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1399319848 0) (formula 'barnsley) (juliaseed 0.82617606890462195329 -0.59250450310750061547) (maxiter 54) (incoloring 1) (view -0.083 0.1842 1.753 1.753) XaoS-release-4.3.2/examples/ZsKovacs/kovzsi9.xpf000066400000000000000000000004751455214672000215420ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 558734359 0) (formula 'barnsley) (juliaseed 0.82617606890462195329 -0.59250450310750061547) (maxiter 54) (incoloring 1) (view 0.02737 -0.0569 1.914 1.914) XaoS-release-4.3.2/examples/ZsKovacs/light-kovzsi.xpf000066400000000000000000000005041455214672000225470ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1183407127 0) (formula 'barnsley) (juliaseed 1.0485101744186047187 -0.041666666666666669341) (maxiter 311) (outcoloring 1) (plane 1) (view -3.98 -2.81 20.4 20.4) XaoS-release-4.3.2/examples/ZsKovacs/lighting.xpf000066400000000000000000000004441455214672000217250ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 1844904662 0) (formula 'mandel3) (maxiter 70) (outcoloring 9) (incoloring 9) (plane 2) (view 0.96546 1.24782 0.0181954 0.0181954) XaoS-release-4.3.2/examples/ZsKovacs/nap.xpf000066400000000000000000000004701455214672000206750ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 2 456523380 0) (formula 'mandel) (angle 7.2443) (outcoloring 1) (view -1.94257718068927 -1.7723323966725E-05 8.87044377837973E-11 8.87044386274255E-11) XaoS-release-4.3.2/examples/ZsKovacs/orveny.xpf000066400000000000000000000004511455214672000214400ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 627993719 0) (formula 'mandel) (maxiter 144) (outcoloring 1) (view 0.294492327157 -0.016335566672 2.53190145657E-08 2.53190145654E-08) XaoS-release-4.3.2/examples/ZsKovacs/pavaszem.xpf000066400000000000000000000005161455214672000217460ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1876833598 0) (formula 'barnsley) (juliaseed 1.0499881996553494467 0.083487582093292521238) (maxiter 81) (incoloring 1) (plane 1) (view -0.71363 0.0075101 0.27275 0.27275) XaoS-release-4.3.2/examples/ZsKovacs/pavaszem2.xpf000066400000000000000000000005251455214672000220300ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1876833598 0) (formula 'barnsley) (juliaseed 1.0499881996553494467 0.083487582093292521238) (maxiter 81) (incoloring 1) (plane 1) (view -0.656875 -0.00466722 0.0664123 0.0664123) XaoS-release-4.3.2/examples/ZsKovacs/pepita.xpf000066400000000000000000000004531455214672000214020ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 3 1787444754 0) (formula 'mandel3) (maxiter 70) (outcoloring 9) (incoloring 9) (plane 2) (view 0.9492169 1.268138 0.008008558 0.008008558) XaoS-release-4.3.2/examples/ZsKovacs/zsigapro.xpf000066400000000000000000000005371455214672000217610ustar00rootroot00000000000000;Position file automatically generated by XaoS 3.1 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (palette 1 1034201341 0) (formula 'mandel) (juliaseed 0.27541729708396692038 -0.0067143955333554104651) (angle -30.559) (maxiter 227) (outcoloring 2) (julia #t) (plane 4) (view 0.396 0.209 19.1 19.1) XaoS-release-4.3.2/examples/adammaj1/000077500000000000000000000000001455214672000173075ustar00rootroot00000000000000XaoS-release-4.3.2/examples/adammaj1/parjulia1.xpf000066400000000000000000000004051455214672000217150ustar00rootroot00000000000000;Position file automatically generated by XaoS 4.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 0) (formula 'user) (usrform "(z^5)+((0.8+0.4i)*(z^4))+z") (view -0.05729 0.02013 4.104 4.104) XaoS-release-4.3.2/examples/adammaj1/parjulia2.xpf000066400000000000000000000004471455214672000217240ustar00rootroot00000000000000;Position file automatically generated by XaoS 4.3 ; - a realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (defaultpalette 0) (formula 'user) (usrform "(z^5)+((0.8+0.4i)*(z^4))+z") (periodicity #f) (incoloring 2) (view -0.03537 -0.005638 3.713 3.713) XaoS-release-4.3.2/i18n/000077500000000000000000000000001455214672000145755ustar00rootroot00000000000000XaoS-release-4.3.2/i18n/README.md000066400000000000000000000055261455214672000160640ustar00rootroot00000000000000# Instructions on internationalization XaoS has transitioned from gettext to Qt for i18n. The .ts files can be edited using Qt Linguist. See the [Qt Linguist manual](https://doc.qt.io/qt-5/qtlinguist-index.html) for more information. ## New or modified texts in XaoS In case there is a new or updated text in the set of translated texts, please run the following command from the XaoS top level directory to update the .ts files with changes from the source code: ``` lupdate -tr-function-alias QT_TRANSLATE_NOOP=TR XaoS.pro ``` The function alias is very important so Qt can find the TR macros used by XaoS. ## Adding a new language To add a new translation, do the following: 1. Edit i18n.pri and add a file named $$PWD/XaoS_LL.ts to the TRANSLATIONS list. Replace LL with the two letter ISO 639-1 code for the new language. Save the pri file and rerun the lupdate command above to create the .ts file. 2. The i18n.pri contains commands to automatically generate the binary .qm files from the .ts files each time XaoS is built, but the .qm files can also be manually updated by running the following command from the top level directory: ``` lrelease XaoS.pro ``` 3. Also, add an entry for the new language in the file XaoS.qrc in the top level directory. This makes sure that the .qm file will be used by the executable (actually, the .qm file is linked against the executable). 4. There are some further changes required in src/include/ui_helper.h by defining the new language with a line ``` #define UIH_LANG_LL XX ``` where LL is the two letter ISO 639-1 code for the new language and the numbers XX are consecutive in the list. You probably need to renumber the list or a part of it. 5. In src/ui/main.cpp increase the number of internationalized menu items at line ``` #define MAX_MENUITEMS_I18N 30 ``` If you compile XaoS in debug mode, you can find the required minimal number here by checking the message "Filled ... ui menu items out of ...". 6. Also, add the LL code in src/ui/main.cpp to the list languages1 and an appropriate [ICU](http://userguide.icu-project.org/locale) code to languages2. 7. Finally, extend the file src/ui/main.cpp with a menu entry like ``` MENUINTRB_I("setlang", NULL, "Swedish", "sv", UI, uih_setlanguage, UIH_LANG_SV, ui_languageselected); ``` Here the English name "Swedish" and the two letter code "sv" must be changed, and also UIH_LANG_SV to UIH_LANG_LL, accordingly (as defined in step 4). **Important: The languages must follow the same order in steps 4, 6 and 7.** ## Testing your changes After compilation you can try a translation out by starting XaoS in the bin folder and change the language in the View menu. Alternatively, if the option View > Set Language > System default is set, the following command can set the language directly (on Linux or Mac): ``` LANG=LL bin/xaos ``` Here LL is the two letter ISO 639-1 code. XaoS-release-4.3.2/i18n/XaoS_cs.ts000066400000000000000000001451471455214672000165200ustar00rootroot00000000000000 Dialog Perturbation: Perturbace: Julia-seed: Parametr Juliovy množiny: Morphing type: Typ proměny: Startuptime: Čas startu: Stoptime: Čas zastavení: File to render: Soubor ke zpracování: Files to render: Soubory k vykreslení: Basename: Jméno souboru (bez přípony): Width: Šířka: Height: Výška: Pixel width (cm): Šířka pixelu (cm): Pixel height (cm): Výška pixelu (cm): Framerate: Snímková frekvence: Image type: Typ obrázku: Antialiasing: Vyhlazování hran: Always recalculate: Vždy přepočítat: Center: Střed: Radius: Rádius: Angle: Úhel: Mode: Režim: Start: Start: End: Konec: Color: Barva: Rotations per second: Rychlost rotace za sekundu: Letters per second: Počet písmen za sekundu: Iterations: Iterace: Text: Text: Your command: Příkaz: Filename: Jméno souboru: Formula: Vzorec: X center: Střed X: Y center: Střed Y: X Radius: Rádius X: Y Radius: Rádius Y: Coordinates: Souřadnice: continuous rotation plynulá rotace Fast rotation Rychlý režim rotace filter filtr enable povolit Amount: Počet: Zooming speed: Rychlost zvětšování: Name: Jméno: Bailout: Bailout: Threads: Vlákna: Julia mode: Režim Julia: Horizontal position: Vodorovná pozice: Vertical position: Svislá pozice: Dynamic resolution: Dynamické rozlišení: Time: Čas: Number: Číslo: Algorithm number: Číslo algoritmu: Seed: Parameter: Shift: Posun: Load Palette Config Načíst konfiguraci palety Save Palette Config Uložit konfiguraci palety Frames per second: Snímků za sekundu: Formula Vzorec Initialization: Inicializace: Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Parametr šířky musí být celé číslo mezi 0..4096 renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Parametr výšky musí být celé číslo mezi 0..4096 renderanim: Invalid real width and height dimensions renderanim: Neplatná šířka nebo výška renderanim: invalid framerate renderanim: Neplatná frekvence renderanim: antialiasing not supported in 256 color mode renderanim: Vyhlazování hran nepodporováno v režimu 256 barev animateview: Invalid viewpoint animateview: Neplatný úhel pohledu Invalid viewpoint Neplatný úhel pohledu Unknown palette type Neznámý typ palety Initialization of color cycling failed. Inicializace cyklu barev selhala. Try to enable palette emulation filter Zkuste zapnout filter pro emulaci palety Algorithm:%i seed:%i size:%i Algoritmus:%i parametr:%i velikost:%i line available only in animation replay Jenom během animace Morphing non existing line! Morface neexistující čáry! linekey not available in this context! 'linekey' není v tomto kontextu dostupná! clear_line available only in animation replay 'clear_line' dostupná pouze během opakování animace clear_lines available only in animation replay 'clear_lines' dostupná pouze během opakování animace Catalog file not found Soubor katalogu nenalezen Replay is already active Přehrávání je již aktivní File open failed Chyba při otevření souboru Out of memory Paměť zaplněná Missing parameter Chybějící parametr Unexpected end of file Nečekaný konec souboru Token is too long Příliš dlouhý token Unknown formula type Neznámý typ vzorce morph available only in animation replay morph dostupný pouze během opakování animace morphview: Invalid viewpoint morphview: Neplatný pohled move available only in animation replay move dostupný pouze během opakování animace morphjulia available only in animation replay morphjulia dostupná pouze během opakování animace morphangle available only in animation replay morphangle dostupný pouze během opakování animace Unknown filter Neznámí filtr sleep available only in animation replay sleep (spánek) dostupný pouze během opakování animace Internal program error #12 %i Interní programová chyba #12 %i wait available only in animation replay wait dostupný pouze během opakování animace No catalog file loaded Žádný soubor katalogu nenačten Message not found in catalog file Zpráva nenalezena v souboru katalogu load available only in animation replay load dostupný pouze během opakování animace Include level overflow Přetečení počtu úrovní File not found Soubor nenalezen Too many parameters Příliš mnoho parametrů Error: %s Chyba: %s Cannot create palette Paletu barev nelze vytvořit Cannot create image Obraz nelze vytvořit Cannot create checking buffer! Obraz nelze vytvořit Cannot create context Nelze vytvořit kontext Cannot open animation file Nelze otevřít animační soubor Calculation interrupted Výpočet přerušen Calculation finished Výpočet dokončen Tutorial files not found. Reinstall XaoS Soubor dokumentace nenalezen. Nainstalujte XaoS znovu Could not open examples Nelze načíst příklady Could not open image Obrázek nelze otevřít Can not create palette Paletu barev nelze vytvořit XaoS is out of memory. Došla paměť. Can not create image Obraz nelze vytvořit Can not allocate tables Není místo pro tabulky Menu Root menu Hlavní menu Animation root menu Hlavní menu animací Replay only commands Znovu přehrát pouze příkazy Line drawing functions Funkce malování čar Line Čára Morph line Přetvořící se čára Morph last line Přeměňující se poslední čára Set line key Nastavení čárového klíče Clear line Vymazání čáry Clear all lines Vymazání všech čar Animation functions Animace View Zobrazení Morph view Morfovat zobrazení Morph julia Přetvořící se čára Move view Posunout zobrazení Morph angle Přetvořící se čára Zoom center Centrum zvětšení Zoom Zvětšení Un-zoom Zmenšení Stop zooming Zastavení zvětšení Smooth morphing parameters Parametry zahladění Timing functions Časování Usleep Čekání Wait for text Čekání na text Wait for complete image Čekání na zobrazení obrazu Include file Navlékání souboru Default palette Základní barvy Formula Vzorec Maximal zooming step Maximální krok zětšení Zooming speedup Rychlost zvětšení Filter Filtr Letters per second Písmen za sekund Interrupt Přerušení Status Vlastnosti Ministatus Hlavnější vlastnosti Cartesian Grid Kartézská mřížka File Soubor Edit Upravit Fractal Fraktál Calculation Výpočet Filters Filtry Action Akce Help Nápověda Tutorials Výuky Stop replay Zastavení opakování Command Příkaz Play string Spustění řetězce Clear screen Vičištění obrazovky Display fractal Zobrazení fraktálu Display text Zobrazení textu Text color Barva textu Horizontal text position Vodorovná pozice textu Vertical text position Svislá pozice textu Text position Pozice textu Message Zpráva New Nový Open Otevřít Save Uložit Save as Uložit jako PNG PNG Record Nahrávání Replay Přehrávání Save image Uložení obrazu Render Renderování Render Image Vykreslit obrázek Load random example Nahrání náhodného příkladu Save configuration Uložení konfigurace Undo Zpět Redo Udělat znovu Formulae Vzorce More formulae Další vzorce User formula Uživatelsý vzorec User initialization Inicializace uživatelem Incoloring mode Vnitřní vybarvení Outcoloring mode Vnější vybarvení Plane Plocha Palette Paleta barev Mandelbrot mode Režim mandelbrot Julia mode Režim Julia Fast julia mode Rychlý režim Julia Rotation Rotace Set angle Nastavení úhlu Set plane Nastavení plochy Inside coloring mode Vnitřní vybarvení Outside coloring mode Vnější vybarvení Inside truecolor coloring mode Vnitřní truecolor vybarvení Outside truecolor coloring mode Vnější truecolor vybarvení Julia seed Parametr Juliovy množiny Random palette Náhodné barvy Custom palette Uživatelské barvy Palette Colors Barvy z palety Palette Editor Upravit paletu Load Palette Config Načíst konfiguraci palety Save Palette Config Uložit konfiguraci palety Color cycling Cirkulace barev Reversed color cycling Zpětná cirkulace barev Color cycling speed Rychlost cirkulace barev Shift palette Posun barevné palety Shift one forward Posun dopředu o jeden krok Shift one backward Posun dozadu o jeden krok Solid guessing Solidní hádání Disable solid guessing Solidní hádání vypnuto Guess 2x2 rectangles 2x2 obdélník Guess 3x3 rectangles 3x3 obdélník Guess 4x4 rectangles 4x4 obdélník Guess 5x5 rectangles 5x5 obdélník Guess 6x6 rectangles 6x6 obdélník Guess 7x7 rectangles 7x7 obdélník Guess 8x8 rectangles 8x8 obdélník Guess unlimited rectangles Nomezený číslo obdélníků Dynamic resolution Dynamické rozložení Periodicity checking Kontrola pravidelnosti Threads Vlákna Iterations Iterace Bailout Bailout Perturbation Perturbace Zooming speed Rychlost zvětšení Fixed step Stálý krok Solid guessing range Interval hádání Disable rotation Rotace vypnuta Continuous rotation Plynulá rotace Rotate by mouse Rotace miší Rotation speed Rychlost rotace Automatic rotation Automatická rotace Fast rotation mode Rychlý režim rotace Recalculate Přepočítat Disable dynamic resolution Dynamický rozlišení vypnuto Use only during animation Pouze během animace Use also for new images Použij toto i u nových obrázků Dynamic resolution mode Režim dynamického rozlišení Autopilot Autopilot Hide Messages Skrýt zprávy An introduction to fractals Zavedení do světa fraktálů XaoS features overview Tipy a triky Math behind fractals Matematika fraktálů Other fractal types in XaoS Další typy fraktálů v XaoSu What's new? Novinky Whole story Všechny kapitoly Introduction Úvod Mandelbrot set Množina Mandelbrot Julia set Množina Julia Higher power Mandelbrots Mandelbroty vyšší mocniny Newton's method Newtonova metoda Barnsley's formula Barnsleyuv vzorec Phoenix Phoenix Octo Octo Magnet Magnet All features Všechny vlastnosti Outcoloring modes Vnější vybarvení Incoloring modes Vnitřní vybarvení True-color coloring modes True-color vybarvovací režimy Planes Plochy Animations and position files Animace a soubory pozic Random palettes Náhodné barevné palety Other noteworthy features Další maličkosti The definition and fractal dimension Definice a fraktaldimenze Escape time fractals Fraktály na základě únikováho času Triceratops and Catseye fractals Fraktály Triceratops a Catseye Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar a Spider Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinského trojúhelník, S. koberec, vločka Kochové What's new in 3.0? Novinky ve verzi 3.0 What's new in 4.0? Novinky ve verzi 4.0 Quit Zavřít Message Font... Písmo pro zprávy... Set Language Nastavit jazyk System default Výchozí Info on current fractal Informace o tomto fraktálu Send Feedback Zaslání zpětné vazby Get Updates Odběr novinek User Forum Uživatelská diskuze About O XaoS Fullscreen Celá obrazovka Copy position URL Message Boundary trace Trasování hranice Solid guessing 1 Solidní hádání 1 Solid guessing Solidní hádání Replay disabled at line %i Přehrání přerušeno na řádku %i Initializing Inicializace Loading catalogs Nahrávání katalogů Processing command line options Zpracování možností z příkazové řádky Enabling animation replay Povolení opakování animace Entering calculation loop! Vstup do výpočetní smyčky! Rendering frame %i... Vykreslování snímku %i... Linking frame %i to %i... Propojování snímků %i a %i... Calculation finished Počítání Preparing first image Příprava prvního obrázku File %s loaded. Soubor %s načten. Saving image... Ukládání obrazu... Save interrupted Ukládání přerušeno File %s saved. Soubor %s uložen. Can not open file Soubor nelze otevřít Recording to file %s enabled. Nahrávání do souboru %s povoleno. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f krát (%.1fE) %2.2f snímků/s %c %i %i %i %u unzoomed zmenšení zoomed zvětšení framerate:%f snímková frekvence:%f Fractal name:%s Jméno fraktálu:%s Fractal type:%s Typ fraktálu:%s Mandelbrot Množina Mandelbrot Julia Množina Julia Formula:%s Vzorec View:[%1.12f,%1.12f] Zobrazení:[%1.12f,%1.12f] size:[%1.12f,%1.12f] Velikost:[%1.12fx%1.12f] Rotation:%4.2f Screen size:%i:%i Rotace:%4.2f Velikost obrazovky:%i:%i Iterations:%-4u Palette size:%i Počet iterací:%-4i Velikost palety barev:%i {4u?} Bailout:%4.2f O XaoS Autopilot:%-4s Plane:%s Autopilot:%-4s Plocha:%s On Zapnout Off Vypnout incoloring:%s outcoloring:%s vnitřní vybarvení:%s vnější vybarvení:%s zoomspeed:%f rychlost zvětšení:%f Parameter:none Parametr:není Parameter:[%f,%f] Parametr:[%f,%f] Thank you for using XaoS Děkujeme za použití programu XaoS XaoS must restart to change the language. Restartujte XaoS pro změnu jazkyku Enabling: %s. %s zapnout. Disabling: %s. %s vypnout. Skipping, please wait... Přeskakování, prosím čekejte... Letters per second %i %i písmen za sekundu Rotation speed:%2.2f degrees per second Rychlost rotace:%2.2f stupňů za sekundu Iterations: %i Počet iterací: %i Cycling speed: %i Rychlost obracení barev: %i speed:%2.2f rychlost:%2.2f Please wait while calculating %s Prosím čekejte, %s fraktál se připravuje... Welcome to XaoS version %s Zdravíme vás v XaoS verze %s Out of memory Paměť je zaplněná Unbalanced parentheses Neplatné uzávorkování Unknown function: %s Neznámá funkce Invalid number: %s Neplatné číslo: %s Unknown variable: %s Neznámí parametr: %s Invalid operator: %s Nepatný operátor: %s Internal error occurred in formula: %s Vnitří chyba ve vzorci: %s Function has incorrect parameter count: %s Funkce má neplatný počet parametrů: %s Empty formula Prázdný vzorec XaoS must restart to change the thread count. Ke změně počtu vláken je nutno restartovat XaoS Do you want to quit now? Zavřít program? File %s opened. Soubor %s otevřen. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_de.ts000066400000000000000000001312441455214672000164740ustar00rootroot00000000000000 Dialog Perturbation: Perturbation: Julia-seed: Julia-Anfangswert: Morphing type: Morphtyp: Startuptime: Startzeit: Stoptime: Stopzeit: File to render: Datei zum berechnen: Files to render: Dateien zum berechnen: Basename: Basisname: Width: Breite: Height: Höhe: Pixel width (cm): Breite in Pixel (cm): Pixel height (cm): Höhe in Pixel (cm): Framerate: Bildfrequenz: Image type: Bildtyp: Antialiasing: Antialiasing: Always recalculate: Immer neu berechnen: Center: Zentrum: Radius: Radius: Angle: Winkel: Mode: Modus: Start: Start: End: Ende: Color: Farbe: Rotations per second: Rotationen pro Sekunde: Letters per second: Buchstaben pro Sekunde: Iterations: Iterationen: Text: Text: Your command: Ihr Befehl: Filename: Dateiname: Formula: Formel: X center: X-Zentrum: Y center: Y-Zentrum: X Radius: X-Radius: Y Radius: Y-Radius: Coordinates: Koordinaten: continuous rotation fortlaufende Rotation Fast rotation Schnelle Rotation filter Filter enable einschalten Amount: Schritte: Zooming speed: Zoomgeschwindigkeit: Name: Name: Bailout: Fluchtradius: Threads: Threads: Julia mode: Juliamodus: Horizontal position: Horizontale Position: Vertical position: Vertikale Position: Dynamic resolution: Dynamische Auflösung: Time: Zeit: Number: Anzahl: Algorithm number: Algorithmusnummer: Seed: Anfangswert: Shift: Verschiebung: Load Palette Config Palettekonfiguration öffnen Save Palette Config Palettekonfiguration speichern Frames per second: Bilder pro Sekunde: Formula Formel Initialization: Initialisierung: Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Breite muss einen positiven, ganzzahligen Wert zwischen 0 und 4096 haben renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Höhe muss einen positiven, ganzzahligen Wert zwischen 0 und 4096 haben renderanim: Invalid real width and height dimensions renderanim: Falsche tatsächliche Breite und Höhe renderanim: invalid framerate renderanim: Falsche Bildfrequenz renderanim: antialiasing not supported in 256 color mode renderanim: Antialiasing nicht unterstützt im 256-Farben-Modus animateview: Invalid viewpoint animateview: Falscher Ausschnitt Invalid viewpoint Falscher Ausschnitt Unknown palette type Unbekannter Palettentyp Initialization of color cycling failed. .Initialisierung der Farbzirkulation fehlgeschlagen. Try to enable palette emulation filter Versuche Palettenemulation einzuschalten Algorithm:%i seed:%i size:%i Algorithmus:%i Anfangswert:%i Größe:%i line available only in animation replay 'line' nur im Wiedergabemodus verfügbar Morphing non existing line! Morphe nicht existente Linie! linekey not available in this context! 'linekey' nicht verfügbar in diesem Kontext! clear_line available only in animation replay 'clear_line': nur im Wiedergabemodus verfügbar clear_lines available only in animation replay 'clear_lines' nur im Wiedergabemodus verfügbar Catalog file not found Katalogdatei nicht gefunden Replay is already active Bereits am Wiedergeben File open failed Datei konnte nicht geöffnet werden Out of memory Zu wenig Speicher Missing parameter Fehlender Parameter Unexpected end of file Unerwartetes Dateiende Token is too long Token ist zu lang Unknown formula type Unbekannter Formeltyp morph available only in animation replay 'morph' nur im Wiedergabemodus verfügbar morphview: Invalid viewpoint morphview: Falscher Ausschnitt move available only in animation replay 'move' nur im Wiedergabemodus verfügbar morphjulia available only in animation replay 'morphjulia' nur im Wiedergabemodus verfügbar morphangle available only in animation replay 'morphangel' nur im Wiedergabemodus verfügbar Unknown filter Unbekannter Filter sleep available only in animation replay 'sleep' nur im Wiedergabemodus verfügbar Internal program error #12 %i Interner Programmfehler Nr. 12 %i wait available only in animation replay 'wait' nur im Wiedergabemodus verfügbar No catalog file loaded Keine Katalogdatei geladen Message not found in catalog file Nachricht in der Katalogdatei nicht gefunden load available only in animation replay Öffnen nur im Wiedergabemodus verfügbar Include level overflow Zu viele Dateien ineinander einbezogen File not found Datei nicht gefunden Too many parameters Zu viele Parameter Error: %s Fehler: %s Cannot create palette Kann Palette nicht erstellen Cannot create image Kann Bild nicht erstellen Cannot create checking buffer! Kann Kontroll-Puffer nicht erstellen! Cannot create context Kann Kontext nicht erstellen Cannot open animation file Kann Animationsdatei nicht öffnen Calculation interrupted Berechnung unterbrochen Calculation finished Berechnung beendet Tutorial files not found. Reinstall XaoS Tutorial Dateien nicht gefunden. Installiere XaoS neu Could not open examples Konnte Beispiele nicht öffnen Could not open image Kann Bild nicht öffnen Can not create palette Kann Palette nicht erzeugen XaoS is out of memory. XaoS hat zu wenig Speicher. Can not create image Kann Bild nicht erzeugen Can not allocate tables Kann Tabellen nicht erzeugen Menu Root menu Hauptmenü Animation root menu Hauptmenü für Animationen Replay only commands Zeige nur Kommentare Line drawing functions Funktionen zum zeichnen von Linien Line Linie Morph line Morphe Linie Morph last line Morphe letzte Linie Set line key Setze Linienschlüssel Clear line Lösche Linie Clear all lines Lösche alle Linien Animation functions Animationsfunktionen View Ausschnitt Morph view Morphe Ausschnitt Morph julia Morphe Julia Move view Verschiebe Ausschnitt Morph angle Morphe Winkel Zoom center Zoomzentrum Zoom Zoom Un-zoom Unzoom Stop zooming Zoomen anhalten Smooth morphing parameters Smooth-Morphing-Parameter Timing functions Timing-Funktionen Usleep Usleep Wait for text Warte auf Text Wait for complete image Warte auf Bild Include file Datei einbeziehen Default palette Standardpalette Formula Formel Maximal zooming step Maximal Zoomschritt Zooming speedup Zoom-Speedup Filter Filter Letters per second Buchstaben pro Sekunde Interrupt Unterbrechen Status Status Ministatus Ministatus Cartesian Grid Kartesisches Gitter File Datei Edit Bearbeiten Fractal Fraktal Calculation Berechnung Filters Filter Action Aktion Help Hilfe Tutorials Tutorials Stop replay Anhalten Command Kommando Play string Zeige Satz Clear screen Lösche Bildschirm Display fractal Zeige Fraktal Display text Zeige Text Text color Textfarbe Horizontal text position Horizontale Textposition Vertical text position Vertikale Textposition Text position Textposition Message Nachricht New Neu Open Öffnen Save Speichern Save as Speichern unter PNG PNG Record Aufzeichnen Replay Wiedergeben Open image Bild öffnen Save image Bild speichern Render Rendern Render Image Bild berechnen Load random example Zufälliges Beispiel öffnen Save configuration Konfiguration speichern Undo Rückgängig Redo Wiederholen Formulae Formeln More formulae Mehr Formeln User formula Benutzerformel User initialization Benutzerinitialisierung Incoloring mode Innere Färbung Outcoloring mode Äußere Färbung Plane Ebene Palette Palette Mandelbrot mode Mandelbrotmodus Julia mode Juliamodus Fast julia mode Schneller Juliamodus Rotation Rotation Set angle Winkel setzen Set plane Ebene setzen Inside coloring mode Innerer Farbmodus Outside coloring mode Äußerer Farbmodus Inside truecolor coloring mode Innerer Echt-Farbmodus Outside truecolor coloring mode Äußerer Echt-Farbmodus Julia seed Julia-Anfangswert Random palette Zufallspalette Custom palette Benutzerpalette Palette Colors Palettefarben Palette Editor Palette Editor Load Palette Config Palettekonfiguration öffnen Save Palette Config Palettekonfiguration speichern Color cycling Farbzirkulation Reversed color cycling Rückwärts-Farbzirkulation Color cycling speed Farbzirkulationsgeschwindigkeit Shift palette Verschiebe Palette Shift one forward Verschiebe eins vorwärts Shift one backward Verschiebe eins rückwärts Solid guessing Solid-Guessing Disable solid guessing Solid-Guessing ausschalten Guess 2x2 rectangles Rate 2x2 Quadrate Guess 3x3 rectangles Rate 3x3 Quadrate Guess 4x4 rectangles Rate 4x4 Quadrate Guess 5x5 rectangles Rate 5x5 Quadrate Guess 6x6 rectangles Rate 6x6 Quadrate Guess 7x7 rectangles Rate 7x7 Quadrate Guess 8x8 rectangles Rate 8x8 Quadrate Guess unlimited rectangles Rate beliebig große Quadrate Dynamic resolution Dynamische Auflösung Periodicity checking Periodizitätstest Threads Threads Iterations Iterationen Bailout Fluchtradius Perturbation Perturbation Zooming speed Zoomgeschwindigkeit Fixed step Gleiche Schritte Solid guessing range Solid-Guessing Bereich Disable rotation Rotation ausschalten Continuous rotation Fortlaufende Rotation Rotate by mouse Rotation mit Maus Rotation speed Rotationsgeschwindigkeit Automatic rotation Automatische Rotation Fast rotation mode Schneller Rotationsmodus Recalculate Neu berechnen Disable dynamic resolution Dynamische Auflösung ausschalten Use only during animation Nur während Animation benutzen Use also for new images Auch für neue Bilder benutzen Dynamic resolution mode Modus der dynamischen Auflösung Autopilot Autopilot Hide Messages Nachrichten ausblenden An introduction to fractals Fraktale - Eine Einführung XaoS features overview XaoS - Eine Übersicht Math behind fractals Die Mathematik hinter Fraktalen Other fractal types in XaoS Andere Fraktale in XaoS What's new? Was ist neu? Whole story Die ganze Geschichte Introduction Einführung Mandelbrot set Mandelbrot-Menge Julia set Julia-Menge Higher power Mandelbrots Mandelbrot-Mengen höherer Ordnung Newton's method Newtonsches Tangentenverfahren Barnsley's formula Barnsleys Formel Phoenix Phoenix Octo Octo Magnet Magnet All features Alle Features Outcoloring modes Äußere Färbungen Incoloring modes Innere Färbungen True-color coloring modes Echt-Farben Färbungsmodi Planes Ebenen Animations and position files Animations- und Positionsdateien Random palettes Zufallspaletten Other noteworthy features Andere beachtenswerte Features The definition and fractal dimension Definition und fraktale Dimension Escape time fractals Fliehzeit-Fraktale Triceratops and Catseye fractals Triceratops und Catseye Fraktale Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar und Spider Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinski Dichtung, S. Teppich, Kochsche Schneeflocke What's new in 3.0? Was ist neu in 3.0? What's new in 4.0? Was ist neu in 4.0? Quit Beenden Message Font... Schriftart für Nachrichten... Set Language Sprache einstellen System default System Default Info on current fractal Info über aktuelles Fraktal Send Feedback Rückmeldung senden Get Updates Aktuellste Version User Forum Benutzerforum About Info Fullscreen Vollbildmodus Copy position URL Position-URL kopieren Message Boundary trace Boundary-Trace Solid guessing 1 Solid-Guessing 1 Solid guessing Solid-Guessing Replay disabled at line %i Wiedergabe auf Zeile %i ausgeschaltet Initializing Beim initialisieren Loading catalogs Öffne Kataloge Processing command line options Verarbeite Kommandozeilenoptionen Enabling animation replay Wiedergabe von Animation wird eingeschaltet Entering calculation loop! Trete in Berechnungsschlaufe ein! Rendering frame %i... Rendere Bild %i... Linking frame %i to %i... Verbinde Bild %i zu %i... Calculation finished Berechnung beendet Preparing first image Erstes Bild wird vorbereitet File %s loaded. Datei %s geöffnet. Saving image... Speichere Bild... Save interrupted Speicher Vorgang unterbrochen File %s saved. Datei %s gespeichert. Can not open file Kann Datei nicht öffnen Recording to file %s enabled. Aufzeichnung in Datei %s eingeschaltet. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f Fach (%.1fE) %2.2f Bilder/Sek %c %i %i %i %u unzoomed ungezoomt zoomed gezoomt framerate:%f Bildfrequenz:%f Fractal name:%s Fraktalname:%s Fractal type:%s Fraktaltyp:%s Mandelbrot Mandelbrot Julia Julia Formula:%s Formel:%s View:[%1.12f,%1.12f] Ausschnitt:[%1.12f,%1.12f] size:[%1.12f,%1.12f] Größe:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Rotation:%4.2f Bildschirm Grösse:%i:%i Iterations:%-4u Palette size:%i Iterationen:%-4i Grösse der Palette:%i Bailout:%4.2f Fluchtradius:%4.2f Autopilot:%-4s Plane:%s Autopilot:%-4s Ebene:%s On Ein Off Aus incoloring:%s outcoloring:%s Innere Färbung:%s Äußere Färbung:%s zoomspeed:%f Zoomgeschwindigkeit:%f Parameter:none Parameter:keine Parameter:[%f,%f] Parameter:[%f,%f] Thank you for using XaoS Danke, dass Sie XaoS benutzt haben XaoS must restart to change the language. XaoS muss neu gestartet werden, um die Sprache zu ändern. Enabling: %s. %s wird eingeschaltet. Disabling: %s. %s wird ausgeschaltet. Skipping, please wait... Beim Überspringen, bitte warten... Letters per second %i Buchstaben pro Sekunde: %i Rotation speed:%2.2f degrees per second Rotationsgeschwindigkeit:%2.2f Grad pro Sekunde Iterations: %i Iterationen: %i Cycling speed: %i Zirkulationsgeschwindigkeit: %i speed:%2.2f Geschwindigkeit:%2.2f Please wait while calculating %s Bitte warten, %s Fraktal wird berechnet Welcome to XaoS version %s Willkommen zu XaoS Version %s Out of memory Zu wenig Speicher Unbalanced parentheses Fehler bei der Klammerung Unknown function: %s Unbekannte Funktion: %s Invalid number: %s Falsche Zahl: %s Unknown variable: %s Unbekannte Variable: %s Invalid operator: %s Falsche Operation: %s Internal error occurred in formula: %s Interner Programmfehler in Formel: %s Function has incorrect parameter count: %s Funktion hat falsche Parameteranzahl: %s Empty formula Leere Formel XaoS must restart to change the thread count. XaoS muss neu gestartet werden, um die Thread-Anzahl zu ändern. Do you want to quit now? Möchten Sie das Programm jetzt beenden? File %s opened. Datei %s geöffnet. Clipboard set to %s. Inhalt der Zwischenablage: %s. Mouse:[%1.12f,%1.12f] Maus:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_es.ts000066400000000000000000001373711455214672000165220ustar00rootroot00000000000000 Dialog Perturbation: Perturbación Julia-seed: Semilla del Julia Startuptime: Estado Stoptime: Estado Basename: Fichero Framerate: velocidad:%f Antialiasing: Iteraciones Always recalculate: Recalcular Center: Centro del zoom Start: Estado Color: Color Rotations per second: Velocidad de rotación Letters per second: Letras por segundo Iterations: Iteraciones Your command: Instrucción Filename: Fichero Formula: Fórmula X center: Centro del zoom Y center: Centro del zoom continuous rotation Rotación continua Fast rotation Modo de rotación rápido filter Filtro Zooming speed: Velocidad del zoom Julia mode: Modo Julia Horizontal position: Posición horizontal del texto Vertical position: Posición vertical del texto Dynamic resolution: Resolución dinámica Frames per second: Letras por segundo Formula Fórmula Initialization: Iteraciones Morphing type: Files to render: Width: Height: Pixel width (cm): Pixel height (cm): Image type: Radius: Angle: Mode: End: Text: X Radius: Y Radius: Coordinates: enable Amount: Name: Bailout: Threads: Time: Number: Algorithm number: Seed: Shift: Load Palette Config Save Palette Config Error Unknown palette type Filtro line available only in animation replay Usar sólo durante la animación clear_line available only in animation replay Usar sólo durante la animación clear_lines available only in animation replay Usar sólo durante la animación File open failed No se asignar tablas Out of memory XaoS se quedó sin memoria Unknown formula type Filtro morph available only in animation replay Usar sólo durante la animación move available only in animation replay Usar sólo durante la animación morphjulia available only in animation replay Usar sólo durante la animación morphangle available only in animation replay Usar sólo durante la animación Unknown filter Filtro sleep available only in animation replay Usar sólo durante la animación wait available only in animation replay Usar sólo durante la animación load available only in animation replay Usar sólo durante la animación Cannot create palette No se puede crear la paleta Cannot create image No se puede crear la imagen Cannot create checking buffer! No se puede crear la imagen Cannot create context No se puede crear la paleta Cannot open animation file No se asignar tablas Calculation interrupted Interrumpir Calculation finished Cálculo Could not open examples Cargar ejemplo aleatorio Can not create palette No se puede crear la paleta XaoS is out of memory. XaoS se quedó sin memoria Can not create image No se puede crear la imagen Can not allocate tables No se asignar tablas renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Invalid real width and height dimensions renderanim: invalid framerate renderanim: antialiasing not supported in 256 color mode animateview: Invalid viewpoint Invalid viewpoint Initialization of color cycling failed. Try to enable palette emulation filter Algorithm:%i seed:%i size:%i Morphing non existing line! linekey not available in this context! Catalog file not found Replay is already active Missing parameter Unexpected end of file Token is too long morphview: Invalid viewpoint Internal program error #12 %i No catalog file loaded Message not found in catalog file Include level overflow File not found Too many parameters Error: %s Tutorial files not found. Reinstall XaoS Could not open image Menu Root menu Menú principal Animation root menu Animación menú principal Replay only commands Repetir sólo instrucciones Line drawing functions Funciones para dibujar líneas Line Línea Morph line Despejar línea Set line key Poner plano Clear line Despejar línea Clear all lines Despejar todas las líneas Animation functions Funciones de animación View Vista Move view Vista de movimiento Morph angle Poner ángulo Zoom center Centro del zoom Zoom Zoom Un-zoom Alejar Stop zooming Parar zoom Timing functions Funciones de tiempo Usleep Usleep Wait for text Esperar por el texto Wait for complete image Esperar para completar la imagen Include file Fichero incluido Default palette Paleta por defecto Formula Fórmula Filter Filtro Letters per second Letras por segundo Interrupt Interrumpir Status Estado Ministatus Miniestado Cartesian Grid Sistema de coordenadas cartesianas File Fichero Edit Editar Fractal Fractal Calculation Cálculo Filters Filtros Help Ayuda Tutorials Tutoriales Stop replay Parar repetición Command Instrucción Play string Mostrar cadena Clear screen Limpiar pantalla Display fractal Mostrar fractal Display text Mostrar texto Horizontal text position Posición horizontal del texto Vertical text position Posición vertical del texto Text position Posición del texto Message Mensaje Save Guardar Record Grabar Replay Repetir Save image Guardar imagen Load random example Cargar ejemplo aleatorio Save configuration Guardar configuración Undo Deshacer Redo Rehacer Formulae Formulae More formulae formulae User formula formulae User initialization Funciones para dibujar líneas Incoloring mode Modo de color interior Outcoloring mode Modo de color exterior Plane Plano Palette Paleta Mandelbrot mode Modo Mandelbrot Julia mode Modo Julia Fast julia mode Modo de Julia rápido Rotation Rotación Set angle Poner ángulo Set plane Poner plano Inside coloring mode Modo de coloración interior Outside coloring mode Modo de coloración exterior Inside truecolor coloring mode Modo de coloración interior color verdadero Outside truecolor coloring mode Modo de coloración exterior color verdadero Julia seed Semilla del Julia Random palette Paleta aleatoria Custom palette Paleta de usuario Color cycling Cambio del color: Reversed color cycling Cambio del color (inverso): Color cycling speed Velocidad del cambio de color Shift palette Cambiar paleta Shift one forward Uno hacia deltante Shift one backward Uno hacia atrás Guess 2x2 rectangles Adivinar rectángulos 2x2 Guess 3x3 rectangles Adivinar rectángulos 3x3 Guess 4x4 rectangles Adivinar rectángulos 4x4 Guess 5x5 rectangles Adivinar rectángulos 5x5 Guess 6x6 rectangles Adivinar rectángulos 6x6 Guess 7x7 rectangles Adivinar rectángulos 7x7 Guess 8x8 rectangles Adivinar rectángulos 8x8 Guess unlimited rectangles Adivinar rectángulos ilimitados Dynamic resolution Resolución dinámica Periodicity checking Chequeo de periodicidad Iterations Iteraciones Perturbation Perturbación Zooming speed Velocidad del zoom Fixed step Paso fijo Disable rotation Deshabilitar rotación Continuous rotation Rotación continua Rotate by mouse Rotación con el ratón Rotation speed Velocidad de rotación Automatic rotation Rotación automática Fast rotation mode Modo de rotación rápido Recalculate Recalcular Disable dynamic resolution Deshabilitar resolución dinámica Use only during animation Usar sólo durante la animación Use also for new images Usar también para imágenes nuevas Dynamic resolution mode Mode de resolución dinámica Autopilot Piloto automático An introduction to fractals Una introducción a los fractales XaoS features overview Perspectiva general de las características de XaoS Math behind fractals Matemáticas tras los fractales What's new? ¿Qué hay nuevo? Whole story La historia completa Introduction Introducción Mandelbrot set Conjunto Mandelbrot Julia set Conjunto Julia Higher power Mandelbrots Mandelbrots de potencias superiores Newton's method Método de Newton Barnsley's formula Fórmula de Barnsley Phoenix Fénix Octo Octo Magnet Magnet All features Todas las características Outcoloring modes Modo de color exterior Incoloring modes Modo de color interior True-color coloring modes Modo de coloración interior color verdadero Planes Planos Animations and position files Ficheros de animaciones y posición Random palettes Paletas aleatorias Other noteworthy features Otras características destacables The definition and fractal dimension La definición y dimensión fractal Escape time fractals Matemáticas tras los fractales What's new in 3.0? ¿Qué hay nuevo en 3.0? What's new in 4.0? ¿Qué hay nuevo en 4.0? Quit Salir Morph last line Morph view Morph julia Smooth morphing parameters Maximal zooming step Zooming speedup Action Text color New Open Save as PNG Render Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config Solid guessing Disable solid guessing Threads Bailout Solid guessing range Hide Messages Other fractal types in XaoS Triceratops and Catseye fractals Mandelbar, Lambda, Manowar and Spider Sierpinski Gasket, S.Carpet, Koch Snowflake About Message Font... Set Language System default Fullscreen Info on current fractal Send Feedback Get Updates User Forum Copy position URL Message Initializing Iteraciones Processing command line options Sólo pciones de la línea de instrucciones Enabling animation replay Usar sólo durante la animación Calculation finished Cálculo Saving image... Guardar imagen Save interrupted Interrumpir Can not open file No se asignar tablas unzoomed alejado zoomed acercado framerate:%f velocidad:%f Fractal name:%s Nombre del fractal: %s Fractal type:%s Tipo de fractal: %s Mandelbrot Mandelbrot Julia Julia Formula:%s Fórmula View:[%1.12f,%1.12f] Vista:[%1.12f,%1.12f] size:[%1.12f,%1.12f] Tamaño:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Rotación:%4.2f Tamaño de la pantalla:%i:%i Iterations:%-4u Palette size:%i Iteraciones:%-4i Tamaño de la paleta:%i {4u?} Autopilot:%-4s Plane:%s Piloto automático:%-4s Plano:%s On On Off Off incoloring:%s outcoloring:%s Color interior:%s Color exterior:%s zoomspeed:%f Velocidad zoom:%f Parameter:none Parámetro:ninguno Parameter:[%f,%f] Parámetro:[%f,%f] Thank you for using XaoS Gracias por usar XaoS Enabling: %s. Habilitando: %s. Disabling: %s. Deshabilitando: %s Skipping, please wait... Saltando, por favor espere... Letters per second %i Letras por segundo %i Rotation speed:%2.2f degrees per second Velocidad de rotación:%2.2f grados por segundo Iterations: %i Iteraciones: %i Cycling speed: %i Velocidad de cambio de color: %i speed:%2.2f velocidad: %2.2f Please wait while calculating %s Por favor espere mientras se calcula %s Welcome to XaoS version %s Bienvenido a XaoS versión %s Out of memory XaoS se quedó sin memoria Boundary trace Solid guessing 1 Solid guessing Unbalanced parentheses Unknown function: %s Invalid number: %s Unknown variable: %s Invalid operator: %s Internal error occurred in formula: %s Function has incorrect parameter count: %s Empty formula XaoS must restart to change the thread count. Do you want to quit now? File %s opened. File %s saved. Replay disabled at line %i Loading catalogs Entering calculation loop! Rendering frame %i... Linking frame %i to %i... Preparing first image File %s loaded. Recording to file %s enabled. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u Bailout:%4.2f XaoS must restart to change the language. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_fr.ts000066400000000000000000001334241455214672000165150ustar00rootroot00000000000000 Dialog Perturbation: Perturbation : Julia-seed: Initialisation de l'ensemble de Julia : Morphing type: Type de morphing : Startuptime: Instant de démarrage : Stoptime: Instant d'arrêt : File to render: Fichier à traiter : Basename: Nom de base : Width: Largeur : Height: Hauteur : Pixel width (cm): Largeur du pixel (cm) : Pixel height (cm): Hauteur du pixel (cm) : Framerate: Taux de rafraîchissement : Image type: Type d'image : Antialiasing: Anti-crénelage : Always recalculate: Toujours recalculer : Center: Centre : Radius: Rayon : Angle: Angle : Mode: Mode : Start: Début : End: Fin : Color: Couleur : Rotations per second: Rotations par seconde : Letters per second: Lettres par seconde : Iterations: Itérations : Text: Texte : Your command: Votre commande : Filename: Nom de fichier : Formula: Formule : X center: Position horizontale centre : Y center: Position verticale centre : X Radius: Rayon horizontal : Y Radius: Rayon vertical : Coordinates: Coordonnées : continuous rotation rotation continue Fast rotation Rotation rapide filter filtre enable activer Amount: Quantité : Zooming speed: Vitesse de zoom : Name: Nom : Bailout: Valeur d'échappement : Threads: Threads : Julia mode: Mode Julia : Horizontal position: Position horizontale : Vertical position: Position verticale : Dynamic resolution: Résolution dynamique : Time: Heure : Number: Nombre : Algorithm number: Numéro d'algorithme : Seed: Valeur initiale : Shift: Décalage : Frames per second: Images par seconde : Formula Formule Initialization: Initialisation : Files to render: Load Palette Config Save Palette Config Error renderanim: Width parameter must be positive integer in the range 0..4096 animation : le paramètre de largeur doit être un entier positif allant de 0 à 4096 renderanim: Height parameter must be positive integer in the range 0..4096 animation : le paramètre de hauteur doit être un entier positif allant de 0 à 4096 renderanim: Invalid real width and height dimensions animation : dimension de hauteur ou de largeur réelle incorrecte renderanim: invalid framerate animation : taux de rafraîchissement incorrect renderanim: antialiasing not supported in 256 color mode animation : anti-crénelage non supporté en mode 256 couleurs animateview: Invalid viewpoint animation : point de vue incorrect Invalid viewpoint Point de vue incorrect Unknown palette type Type de palette inconnu Initialization of color cycling failed. Echec de l'initialisation de la circulation des couleurs. Try to enable palette emulation filter Essayez d'activer le filtre d'émulation de palette Algorithm:%i seed:%i size:%i Algorithme : %i valeur initiale : %i taille : %i line available only in animation replay ligne disponible seulement lors de répétition d'animation Morphing non existing line! Ligne de morphing non existante! linekey not available in this context! ligne clé non disponible dans ce contexte! clear_line available only in animation replay effaçage de ligne disponible seulement lors de répétition d'animation clear_lines available only in animation replay effaçage de lignes disponible seulement lors de répétition d'animation Catalog file not found Fichier catalogue non trouvé Replay is already active Répétition déja active File open failed Echec d'ouverture du fichier Out of memory Pas assez de mémoire Missing parameter Paramètre manquant Unexpected end of file Fin inattendue de fichier Token is too long Le "token" est trop long Unknown formula type Type de formule inconnu morph available only in animation replay Morphing disponible seulement lors de répétition d'animation morphview: Invalid viewpoint Vue morphing : point de vue incorrect move available only in animation replay déplacement disponible seulement lors de répétition d'animation morphjulia available only in animation replay Morphjulia disponible seulement lors de répétition d'animation morphangle available only in animation replay Morphangle disponible seulement lors de répétition d'animation Unknown filter Filtre inconnu sleep available only in animation replay pause disponible seulement lors de répétition d'animation Internal program error #12 %i Erreur interne #12 %i wait available only in animation replay wait disponible seulement lors de répétition d'animation No catalog file loaded Pas de fichier catalogue chargé Message not found in catalog file Message non trouvé dans fichier catalogue load available only in animation replay Load disponible seulement lors de répétition d'animation Include level overflow Dépassement de niveau d'inclusion File not found Fichier non trouvé Too many parameters Trop de paramètres Error: %s Erreur : %s Cannot create palette Echec création palette Cannot create image Echec création image Cannot create checking buffer! Echec création tampon de vérification ! Cannot create context Echec création contexte Cannot open animation file Echec ouverture fichier d'animation Calculation interrupted Calcul interrompu Calculation finished Calcul terminé Tutorial files not found. Reinstall XaoS Fichiers didacticiels introuvables. Réinstallez XaoS Could not open examples Echec ouverture exemples Could not open image Echec ouverture l'image Can not create palette Ne peut pas créer la palette XaoS is out of memory. Pas assez de mémoire. Can not create image Ne peut pas créer l'image Can not allocate tables Ne peut pas allouer les tables Menu Root menu Menu principal Animation root menu Menu principal d'animation Replay only commands Commandes de répétition uniquement Line drawing functions Fonctions de traçage de lignes Line Ligne Morph line Ligne de morphing Morph last line Dernière ligne de morphing Set line key Choisir ligne clé Clear line Effacer ligne Clear all lines Effacer toutes les lignes Animation functions Fonctions d'animation View Vue Morph view Vue de morphing Morph julia Morphing de Julia Move view Déplacer vue Morph angle Angle de morphing Zoom center Centrer le zoom Zoom Zoomer Un-zoom Dézoomer Stop zooming Arrêter de zoomer Smooth morphing parameters Lisser les paramètres de morphing Timing functions Fonctions de temps Usleep Pause Wait for text Attendre le texte Wait for complete image Attendre l'image complète Include file Inclure fichier Default palette Palette par défaut Formula Formule Maximal zooming step Pas maximum pour le zoom Zooming speedup Accélération du zoom Filter Filtre Letters per second Lettres par seconde Interrupt Interrompre Status Affichage état Ministatus Affichage mini-état Cartesian Grid Système de coordonnées cartésiennes File Fichier Edit Edition Fractal Fractale Calculation Calcul Filters Filtres Action Action Help Aide Tutorials Didacticiels Stop replay Arrêter la répétition Command Commande Play string Joue texte Clear screen Effacer l'écran Display fractal Afficher fractale Display text Afficher le texte Text color Couleur du texte Horizontal text position Position horizontale du texte Vertical text position Position verticale du texte Text position Position du texte Message Message New Nouveau Open Ouvrir Save Enregistrer Record Enregistrer animation Replay Rejouer l'animation Open image Ouvrir l'image Save image Enregistrer l'image Render Rendre Load random example Ouvrir un exemple aléatoire Save configuration Enregistrer la configuration Undo Annuler Redo Rétablir Formulae Formule More formulae Autres formules User formula Formule utilisateur User initialization Initialisation utilisateur Incoloring mode Coloriage intérieur Outcoloring mode Coloriage extérieur Plane Plan Palette Couleurs Mandelbrot mode Mode Mandelbrot Julia mode Mode Julia Fast julia mode Mode Julia rapide Rotation Rotation Set angle Choisir l'angle Set plane Choisir le plan Inside coloring mode Coloriage intérieur Outside coloring mode Coloriage extérieur Inside truecolor coloring mode Coloriage intérieur en vraies couleurs Outside truecolor coloring mode Coloriage extérieur en vraies couleurs Julia seed Initialisation de Julia Random palette Palette aléatoire Custom palette Palette personnelle Color cycling Circulation des couleurs Reversed color cycling Circulation des couleurs inversée Color cycling speed Vitesse de circulation des couleurs Shift palette Décaler palette Shift one forward Avancer d'une unité Shift one backward Reculer d'une unité Solid guessing Estimation solide Disable solid guessing Désactiver l'estimation solide Guess 2x2 rectangles Estimation en rectangles 2x2 Guess 3x3 rectangles Estimation en rectangles 3x3 Guess 4x4 rectangles Estimation en rectangles 4x4 Guess 5x5 rectangles Estimation en rectangles 5x5 Guess 6x6 rectangles Estimation en rectangles 6x6 Guess 7x7 rectangles Estimation en rectangles 7x7 Guess 8x8 rectangles Estimation en rectangles 8x8 Guess unlimited rectangles Estimation en rectangles illimités Dynamic resolution Résolution dynamique Periodicity checking Vérification périodicité Threads Threads Iterations Itérations Bailout Valeur d'échappement Perturbation Perturbation Zooming speed Vitesse de zoom Fixed step Pas fixé Solid guessing range Portée de l'estimation solide Disable rotation Désactiver rotation Continuous rotation Rotation continue Rotate by mouse Rotation à la souris Rotation speed Vitesse de rotation Automatic rotation Rotation automatique Fast rotation mode Mode de rotation rapide Recalculate Recalculer Disable dynamic resolution Désactiver la résolution dynamique Use only during animation Utiliser seulement pendant l'animation Use also for new images Utiliser aussi pour les nouvelles images Dynamic resolution mode Mode de résolution dynamique Autopilot Pilote automatique Hide Messages Cacher les messages An introduction to fractals Une introduction aux fractales XaoS features overview Aperçu des caractéristiques de XaoS Math behind fractals Les maths derrière les fractales Other fractal types in XaoS Autres types de fractales dans XaoS What's new? Nouveautés Whole story Tous les détails Introduction Introduction Mandelbrot set Ensemble de Mandelbrot Julia set Ensemble de Julia Higher power Mandelbrots Puissances de Mandlebrot Newton's method Méthode de Newton Barnsley's formula Formule de Barnsley Phoenix Phoenix Octo Octo Magnet Magnet All features Toutes les caractéristiques Outcoloring modes Coloration extérieure Incoloring modes Coloration intérieure True-color coloring modes Coloration en vraies couleurs Planes Plans Animations and position files Fichiers d'animation et de position Random palettes Palettes aléatoires Other noteworthy features Autres caractéristiques utiles The definition and fractal dimension Définition et dimension fractale Escape time fractals Fractales à temps d'échappement Triceratops and Catseye fractals Fractales Triceratops et Oeil de chat Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar et Araignée Sierpinski Gasket, S.Carpet, Koch Snowflake Triangle de Sierpinski , Tapis de S., Flocon de Koch What's new in 3.0? Nouveautés dans la version 3.0 What's new in 4.0? Nouveautés dans la version 4.0 Quit Quitter Message Font... Police des messages Set Language Choisir la langue Send Feedback Reporter un problème Get Updates Récuperer les mises à jour User Forum Forum des utilisateurs About À propos Fullscreen Plein écran Save as PNG Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config System default Info on current fractal Copy position URL Message Boundary trace Détection de frontière Solid guessing 1 Estimation solide 1 Solid guessing Estimation solide Replay disabled at line %i Répétition désactivée à la ligne %i Initializing Initialisation Loading catalogs Chargement catalogues Processing command line options Traitement options ligne de commande Enabling animation replay Activation de la répétition d'animation Entering calculation loop! Entrée dans la boucle de calcul ! Rendering frame %i... Rendu de la frame %i... Linking frame %i to %i... Lie l'image %i à l'image %i... Calculation finished Calcul terminé Preparing first image Préparation première image File %s loaded. Fichier %s chargé. Saving image... Enregistrement image... Save interrupted Enregistrement interrompu File %s saved. Fichier %s enregistré Can not open file Echec ouverture fichier Recording to file %s enabled. Enregistrement vers le fichier %s activé. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f fois (%.1fE) %2.2f images/sec %c %i %i %i %u unzoomed Réduit zoomed Agrandi framerate:%f taux de rafraîchissement : %f Fractal name:%s Nom de la fractale : %s Fractal type:%s Type de fractale : %s Mandelbrot Mandelbrot Julia Julia Formula:%s Formule : %s View:[%1.12f,%1.12f] Vue : [%1.12f,%1.12f] size:[%1.12f,%1.12f] Taille : [%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Rotation : %4.2f Taille d'écran : %i:%i Iterations:%-4u Palette size:%i Itérations : %-4i Taille palette : %i {4u?} Bailout:%4.2f Valeur d'échappement : %4.2f Autopilot:%-4s Plane:%s Pilote automatique : %-4s Plan : %s On Allumé Off Éteint incoloring:%s outcoloring:%s Coloration intérieure : %s extérieure : %s zoomspeed:%f Vitesse de zoom : %f Parameter:none Paramètre : aucun Parameter:[%f,%f] Paramètre : [%f,%f] Thank you for using XaoS Merci d'avoir utilisé XaoS XaoS must restart to change the language. XaoS doit redémarrer pour changer la langue. Enabling: %s. Activation : %s. Disabling: %s. Désactivation : %s. Skipping, please wait... Saute image, patientez... Letters per second %i Lettres par seconde %i Rotation speed:%2.2f degrees per second Vitesse de rotation : %2.2f degrés par seconde Iterations: %i Itérations: %i Cycling speed: %i Vitesse de circulation : %i speed:%2.2f vitesse : %2.2f Please wait while calculating %s Patientez pendant le calcul de %s Welcome to XaoS version %s Bienvenue sur XaoS version %s Out of memory Pas assez de mémoire Unbalanced parentheses Parenthèses manquantes Unknown function: %s Fonction inconnue : %s Invalid number: %s Nombre invalide : %s Unknown variable: %s Variable inconnue : %s Invalid operator: %s Opérateur invalide : %s Internal error occurred in formula: %s Une erreur interne est survenue dans la formule : %s Function has incorrect parameter count: %s La fonction a un nombre incorrect de paramètres : %s Empty formula Formule vide XaoS must restart to change the thread count. XaoS doit redémarrer pour prendre en compte le changement de nombre de threads. Do you want to quit now? Voulez vous quitter maintenant ? File %s opened. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_he.ts000066400000000000000000002142511455214672000165000ustar00rootroot00000000000000 Dialog Perturbation: Julia-seed: Morphing type: Startuptime: Stoptime: Files to render: Basename: Width: Height: Pixel width (cm): Pixel height (cm): Framerate: Image type: Antialiasing: Always recalculate: Center: Radius: Angle: Mode: Start: End: Color: Rotations per second: Letters per second: Iterations: Text: Your command: Filename: Formula: X center: Y center: X Radius: Y Radius: Coordinates: continuous rotation Fast rotation filter enable Amount: Zooming speed: Name: Bailout: Threads: Julia mode: Horizontal position: Vertical position: Dynamic resolution: Time: Number: Algorithm number: Seed: Shift: Load Palette Config Save Palette Config Frames per second: Formula Initialization: Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Invalid real width and height dimensions renderanim: invalid framerate renderanim: antialiasing not supported in 256 color mode animateview: Invalid viewpoint Invalid viewpoint Unknown palette type Initialization of color cycling failed. Try to enable palette emulation filter Algorithm:%i seed:%i size:%i line available only in animation replay Morphing non existing line! linekey not available in this context! clear_line available only in animation replay clear_lines available only in animation replay Catalog file not found Replay is already active File open failed Out of memory Missing parameter Unexpected end of file Token is too long Unknown formula type morph available only in animation replay morphview: Invalid viewpoint move available only in animation replay morphjulia available only in animation replay morphangle available only in animation replay Unknown filter sleep available only in animation replay Internal program error #12 %i wait available only in animation replay No catalog file loaded Message not found in catalog file load available only in animation replay Include level overflow File not found Too many parameters Error: %s Cannot create palette Cannot create image Cannot create checking buffer! Cannot create context Cannot open animation file Calculation interrupted Calculation finished Tutorial files not found. Reinstall XaoS Could not open examples Could not open image Can not create palette XaoS is out of memory. Can not create image Can not allocate tables Menu Root menu Animation root menu Replay only commands Line drawing functions Line Morph line Morph last line Set line key Clear line Clear all lines Animation functions View הצג Morph view Morph julia Move view Morph angle Zoom center Zoom Un-zoom Stop zooming Smooth morphing parameters Timing functions Usleep Wait for text Wait for complete image Include file Default palette Formula Maximal zooming step Zooming speedup Filter Letters per second Interrupt Status Ministatus Cartesian Grid File קבצים Edit עריכה Fractal פרקטל Calculation תַחשִׁיב Filters מסננים Action פעולה Help עֶזרָה Tutorials Stop replay Command Play string Clear screen Display fractal Display text Text color Horizontal text position Vertical text position Text position Message New Open Save Save as PNG Record Replay Render Render Image Load random example Save configuration Undo Redo Copy position URL Formulae More formulae User formula User initialization Incoloring mode Outcoloring mode Plane Palette Mandelbrot mode Julia mode Fast julia mode Rotation Set angle Set plane Inside coloring mode Outside coloring mode Inside truecolor coloring mode Outside truecolor coloring mode Julia seed Random palette Custom palette Palette Colors Palette Editor Load Palette Config Save Palette Config Color cycling Reversed color cycling Color cycling speed Shift palette Shift one forward Shift one backward Solid guessing Disable solid guessing Guess 2x2 rectangles Guess 3x3 rectangles Guess 4x4 rectangles Guess 5x5 rectangles Guess 6x6 rectangles Guess 7x7 rectangles Guess 8x8 rectangles Guess unlimited rectangles Dynamic resolution Periodicity checking Threads Iterations Bailout Perturbation Zooming speed Fixed step Solid guessing range Disable rotation Continuous rotation Rotate by mouse Rotation speed Automatic rotation Fast rotation mode Recalculate Disable dynamic resolution Use only during animation Use also for new images Dynamic resolution mode Autopilot Hide Messages An introduction to fractals XaoS features overview Math behind fractals Other fractal types in XaoS What's new? Whole story Introduction Mandelbrot set Julia set Higher power Mandelbrots Newton's method Barnsley's formula Phoenix Octo Magnet All features Outcoloring modes Incoloring modes True-color coloring modes Planes Animations and position files Random palettes Other noteworthy features The definition and fractal dimension Escape time fractals Triceratops and Catseye fractals Mandelbar, Lambda, Manowar and Spider Sierpinski Gasket, S.Carpet, Koch Snowflake What's new in 3.0? What's new in 4.0? About Quit Message Font... Set Language System default Fullscreen Info on current fractal Send Feedback Get Updates User Forum Message Boundary trace Solid guessing 1 Solid guessing Out of memory Unbalanced parentheses Unknown function: %s Invalid number: %s Unknown variable: %s Invalid operator: %s Internal error occurred in formula: %s Function has incorrect parameter count: %s Empty formula XaoS must restart to change the thread count. Do you want to quit now? File %s opened. File %s saved. Replay disabled at line %i Initializing Loading catalogs Processing command line options Enabling animation replay Entering calculation loop! Rendering frame %i... Linking frame %i to %i... Calculation finished Preparing first image File %s loaded. Saving image... Save interrupted Can not open file Clipboard set to %s. Recording to file %s enabled. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u unzoomed zoomed framerate:%f Fractal name:%s Fractal type:%s Mandelbrot Julia Formula:%s View:[%1.12f,%1.12f] size:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Iterations:%-4u Palette size:%i Bailout:%4.2f Autopilot:%-4s Plane:%s On Off incoloring:%s outcoloring:%s zoomspeed:%f Parameter:none Parameter:[%f,%f] Mouse:[%1.12f,%1.12f] Thank you for using XaoS XaoS must restart to change the language. Enabling: %s. Disabling: %s. Skipping, please wait... Letters per second %i Rotation speed:%2.2f degrees per second Iterations: %i Cycling speed: %i speed:%2.2f Please wait while calculating %s Welcome to XaoS version %s XaoS-release-4.3.2/i18n/XaoS_hi.ts000066400000000000000000001507001455214672000165020ustar00rootroot00000000000000 Dialog Perturbation: गड़बड़ी: Julia-seed: जूलिया सीड: Morphing type: मॉर्फिंग प्रकार: Startuptime: प्रारंभ समय: Stoptime: समाप्त समय: File to render: फ़ाइल रेंडर के लिए: Files to render: फ़ाइल रेंडर के लिए: Basename: मूल नाम: Width: चौड़ाई: Height: लंबाई: Pixel width (cm): पिक्सेल चौड़ाई (सेंटीमीटर): Pixel height (cm): पिक्सेल लंबाई (सेंटीमीटर): Framerate: फ्रेम गति: Image type: छवि का प्रकार: Antialiasing: प्रति-एलियासिंग: Always recalculate: हमेशा पुनर्गणना: Center: केंद्र: Radius: त्रिज्या: Angle: कोण: Mode: साधन: Start: प्रारंभ: End: समाप्त: Color: रंग: Rotations per second: रोटेशन प्रति सेकंड: Letters per second: अक्षर प्रति सेकंड: Iterations: पुनरावृत्ति: Text: टेक्स्ट: Your command: आपकी आज्ञा: Filename: फ़ाइल का नाम: Formula: फार्मूला: X center: क्षैतिज(X) केंद्र: Y center: ऊर्ध्वाधर(Y) केंद्र: X Radius: क्षैतिज(X) त्रिज्या: Y Radius: ऊर्ध्वाधर(Y) त्रिज्या: Coordinates: निर्देशांक: continuous rotation निरंतर रोटेशन Fast rotation तेज़ रोटेशन filter फ़िल्टर enable सक्षम करें Amount: मात्रा: Zooming speed: ज़ूम करने की गति: Name: नाम: Bailout: बेलआउट: Threads: थ्रेड्स: Julia mode: जूलिया प्रकार: Horizontal position: क्षैतिज पोजिशन: Vertical position: ऊर्ध्वाधर पोजिशन: Dynamic resolution: बदलता रेसोलुशन: Time: समय : Number: संख्या: Algorithm number: एल्गोरिथम संख्या: Seed: सीड: Shift: शिफ्ट: Load Palette Config पैलेट कॉन्फ़िगरेशन.खोले Save Palette Config पैलेट कॉन्फ़िगरेशन सहेजें Frames per second: फ्रेम प्रति सेकंड: Formula फार्मूला Initialization: आरंभीकरण: Error renderanim: Width parameter must be positive integer in the range 0..4096 प्रस्तुतिकरण : चौड़ाई पैरामीटर 0..4096 की सीमा में धनात्मक पूर्णांक होना चाहिए renderanim: Height parameter must be positive integer in the range 0..4096 प्रस्तुतिकरण : ऊंचाई पैरामीटर 0..4096 की सीमा में धनात्मक पूर्णांक होना चाहिए renderanim: Invalid real width and height dimensions प्रस्तुतिकरण: अमान्य वास्तविक चौड़ाई और ऊँचाई आयाम renderanim: invalid framerate प्रस्तुतिकरण: अमान्य फ्रैमरेट renderanim: antialiasing not supported in 256 color mode प्रस्तुतिकरण : 256 कलर मोड में एंटीलियासिंग समर्थित नहीं है animateview: Invalid viewpoint प्रस्तुतिकरण : अमान्य दृष्टिकोण Invalid viewpoint अमान्य दृष्टिकोण Unknown palette type अज्ञात पैलेट प्रकार Initialization of color cycling failed. कलर साइकलिंग की शुरुआत विफल रही. Try to enable palette emulation filter पैलेट इम्यूलेशन फिल्टर को सक्षम करने का प्रयास करें Algorithm:%i seed:%i size:%i एल्गोरिथम:%i सीड:%i आकार:%i line available only in animation replay लाइन केवल एनीमेशन रीप्ले में उपलब्ध है Morphing non existing line! गैर मौजूदा लाइन की मॉर्फिंग! linekey not available in this context! linekey इस संदर्भ में उपलब्ध नहीं! clear_line available only in animation replay clear_line केवल एनीमेशन रीप्ले में उपलब्ध है clear_lines available only in animation replay clear_lines केवल एनीमेशन रीप्ले में उपलब्ध है Catalog file not found कैटलॉग फ़ाइल नहीं मिली Replay is already active रिप्ले पहले से सक्रिय है File open failed फ़ाइल खोलना विफल Out of memory मेमोरी से बाहर Missing parameter लापता पैरामीटर Unexpected end of file फ़ाइल का अनपेक्षित अंत Token is too long टोकन बहुत समय ले रहा है Unknown formula type अज्ञात फार्मूला का प्रकार morph available only in animation replay मॉर्फ़ सिर्फ एनीमेशन रीप्ले में मौजूद है morphview: Invalid viewpoint मॉर्फ़ दृश्य: अमान्य दृष्टिकोण move available only in animation replay हिलना केवल एनीमेशन रीप्ले में उपलब्ध morphjulia available only in animation replay मॉर्फ़ जूलिया केवल एनीमेशन रीप्ले में उपलब्ध morphangle available only in animation replay मॉर्फ़ कोण केवल एनीमेशन रीप्ले में उपलब्ध Unknown filter अज्ञात फिल्टर sleep available only in animation replay ठहराव केवल एनीमेशन रीप्ले में उपलब्ध Internal program error #12 %i आंतरिक प्रोग्राम त्रुटि #12 %i wait available only in animation replay इंतज़ार केवल एनीमेशन रीप्ले में उपलब्ध No catalog file loaded कोई कैटलॉग फ़ाइल लोड नहीं हुई Message not found in catalog file संदेश कैटलॉग फ़ाइल में नहीं मिला load available only in animation replay लोड केवल एनीमेशन रीप्ले में उपलब्ध Include level overflow स्तर अतिप्रवाह शामिल करें File not found फाइल नहीं मिली Too many parameters बहुत सारे पैरामीटर्स Error: %s त्रुटि : %s Cannot create palette पैलेट नहीं बना सकते Cannot create image छवि नहीं बना सकते Cannot create checking buffer! जाँच बफ़र नहीं बना सकते! Cannot create context संदर्भ नहीं बना सकते Cannot open animation file एनीमेशन फ़ाइल नहीं खोल सकते Calculation interrupted गणना बाधित Calculation finished गणना समाप्त Tutorial files not found. Reinstall XaoS शैक्षणिक फ़ाइलें नहीं मिलीं, फिर से xaos इंस्टॉल करें Could not open examples उदाहरण नहीं खोल सकते Could not open image छवि खोलने में सक्षम नहीं Can not create palette पैलेट नहीं बना सकते XaoS is out of memory. XaoS मेमोरी से बाहर . Can not create image छवि नहीं बना सकते Can not allocate tables टेबल आवंटित नहीं कर सकते Menu Root menu स्रोत मेनू Animation root menu एनीमेशन स्रोत मेनू Replay only commands सिर्फ आदेश रीप्ले करे Line drawing functions लाइन चित्र करने के फंक्शन्स Line लाइन Morph line लाइन मॉर्फ़ करे Morph last line आखरी लाइन मॉर्फ़ करे Set line key लाइन की कुंजी चुने Clear line लाइन साफ़ करे Clear all lines सारी लाइन साफ़ करे Animation functions एनीमेशन फंक्शन View दृश्य Morph view मॉर्फ़ दृश्य Morph julia मॉर्फ़ जूलिया Move view दृश्य हटाए Morph angle मॉर्फ़ कोण Zoom center बिच में ज़ूम करे Zoom ज़ूम Un-zoom ज़ूम वापस ले Stop zooming ज़ूम करना बंद करे Smooth morphing parameters स्मूथ मॉनफिंग पैरामीटर Timing functions टाइमिंग फंक्शन्स Usleep ठहराव Wait for text टेक्स्ट का इंतज़ार करे Wait for complete image पूर्व छवि के लिए इंतज़ार करे Include file फ़ाइल शामिल करें Default palette डिफ़ॉल्ट पैलेट Formula फार्मूला Maximal zooming step अधिकतम ज़ूमिंग कदम Zooming speedup ज़ूमिंग स्पीड बढ़ाये Filter फिल्टर Letters per second अक्षर प्रति सेकंड Interrupt अवरोध Status स्थिति Ministatus छोटी स्तिथि Cartesian Grid कारटेशियन ग्रिड File फ़ाइल Edit संपादन Fractal फ्रैक्टल Calculation गणना Filters फिल्टर Action एक्शन Help सहायता Tutorials अनुशिक्षण Stop replay रीप्ले रोके Command आदेश Play string तार बजाओ Clear screen साफ़ स्क्रीन Display fractal फ्रैक्टल दर्शाये Display text डिस्प्ले टेक्स्ट Text color टेक्स्ट का रंग Horizontal text position क्षैतिज टेक्स्ट पोजीशन Vertical text position ऊर्ध्वाधर टेक्स्ट पोजीशन Text position टेक्स्ट पोजीशन Message संदेश New नया Open खोले Save सहेजें Record रिकॉर्ड Replay रीप्ले Save image छवि सहेजें Render रेंडर Load random example यादृच्छिक उदाहरण लोड करें Save configuration कॉन्फ़िगरेशन सहेजें Undo पूर्ववत् करें Redo फिर से करें Formulae फार्मूला More formulae और फार्मूला User formula यूजर फार्मूला User initialization यूजर प्रारम्भ Plane सतह Palette पैलेट Julia mode जूलिया मोड Fast julia mode जूलिया रैपिड मोड Rotation रोटेशन Set angle कोण चुने Set plane सतह चुने Inside coloring mode अंदर कलरिंग मोड Outside coloring mode बाहर कलरिंग मोड Inside truecolor coloring mode ट्रू कलर कलरिंग मोड के अंदर Outside truecolor coloring mode ट्रू कलर कलरिंग मोड के बाहर Julia seed जूलिया सीड Random palette यादृच्छिक पैलेट Custom palette कस्टम पैलेट Color cycling कलर साइकिलिंग Reversed color cycling उलटी कलर साइकिलिंग Color cycling speed कलर साइकिलिंग गति Shift palette पैलेट शिफ्ट करे Shift one forward एक आगे जाये Shift one backward एक पीछे जाये Solid guessing सॉलिड अनुमान Disable solid guessing सॉलिड अनुमान बंद करे Guess 2x2 rectangles 2x2 आयते अनुमान करे Guess 3x3 rectangles 3x3 आयते अनुमान करे Guess 4x4 rectangles 4x4 आयते अनुमान करे Guess 5x5 rectangles 5x5 आयते अनुमान करे Guess 6x6 rectangles 6x6 आयते अनुमान करे Guess 7x7 rectangles 7x7 आयते अनुमान करे Guess 8x8 rectangles 8x8 आयते अनुमान करे Guess unlimited rectangles अनगिनत आयते अनुमान करे Dynamic resolution बदलता रेसोलुशन Threads थ्रेड्स Iterations पुर्नवृतियाँ Bailout सब छोड़े (Bailout) Perturbation गड़बड़ी Zooming speed ज़ूमिंग गति Fixed step निश्चित कदम Solid guessing range सॉलिड अनुमान सीमा Disable rotation रोटेशन बंद करे Continuous rotation लगातार रोटेशन Rotate by mouse माउस से रोटेशन Rotation speed रोटेशन की गति Automatic rotation ऑटोमेटिक रोटेशन Fast rotation mode तेज़ रोटेशन मोड Recalculate दोबारा गणना करे Disable dynamic resolution बदलता रेसोलुशन बंद करे Use only during animation सिर्फ एनीमेशन के दौरान इस्तेमाल करे Use also for new images नयी छवियों के लिए भी इस्तेमाल करे Dynamic resolution mode बदलता रेसोलुशन मोड Autopilot ऑटोपिलोट Hide Messages संदेश छुपाए An introduction to fractals फ्रैक्टल का उपक्षेप XaoS features overview XaoS की विशेषताओं का संक्षेप Math behind fractals फ्रैक्टल के पीछे की गणना Other fractal types in XaoS अन्य फ्रैक्टल के प्रकार XaoS में What's new? नया क्या है? Whole story पूरी कहानी Introduction उपक्षेप Julia set जूलिया सेट Newton's method न्यूटन मेथड Barnsley's formula बार्न्सले का फार्मूला Phoenix फ़ीनिक्स Octo ऑक्टो Magnet मैगनेट All features सभी विशेषताएं True-color coloring modes ट्रू कलर कलरिंग मोड्स Planes सतह Animations and position files एनीमेशन और पोजीशन फाइल Random palettes यादृच्छिक पैलेट Other noteworthy features अन्य उल्लेखनीय विशेषताएं What's new in 3.0? क्या नया है version 3.0 में? What's new in 4.0? क्या नया है version 4.0 में? Quit प्रस्थान Message Font... संदेश फ़ॉन्ट... Set Language Set Language (भाषा चुने) Send Feedback प्रतिक्रिया भेजें Get Updates अपडेट प्राप्त करे User Forum उपयोगकर्ता मंच About बारे में Fullscreen पूर्ण स्क्रीन Save as PNG Render Image Incoloring mode Outcoloring mode Mandelbrot mode Palette Colors Palette Editor Load Palette Config पैलेट कॉन्फ़िगरेशन.खोले Save Palette Config पैलेट कॉन्फ़िगरेशन सहेजें Periodicity checking Mandelbrot set Higher power Mandelbrots Outcoloring modes Incoloring modes The definition and fractal dimension Escape time fractals Triceratops and Catseye fractals Mandelbar, Lambda, Manowar and Spider Sierpinski Gasket, S.Carpet, Koch Snowflake System default Info on current fractal Copy position URL Message Boundary trace सीमा ट्रेस Solid guessing 1 सॉलिड अनुमान 1 Solid guessing सॉलिड अनुमान Replay disabled at line %i रीप्ले बंद है लाइन %i Initializing प्रारंभ Loading catalogs कैटलॉग लोड हो रहा है Processing command line options प्रोसेसिंग कमांड लाइन विकल्प Enabling animation replay एनीमेशन रीप्ले सक्र्य हो रहा है Entering calculation loop! गणना लूप में प्रवेश! Rendering frame %i... फ्रेम रेंडर होते हुए %i... Linking frame %i to %i... फ्रेम %i को %i. से संजो रहे है ... Calculation finished गणना समाप्त Preparing first image पहली छवि तैयार हो रही है File %s loaded. %s फ़ाइल %s लोड की गई. Saving image... छवि सहेजी जा रही है... Save interrupted टास्क के बिच में संग्रहित करे File %s saved. फ़ाइल %s संग्रहित. Can not open file फाइल खुलने में असफल Recording to file %s enabled. रिकॉर्डिंग सक्र्य है फाइल %s में. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f times (%.1fE) %2.2f फ्रेम/सेकंड %c %i %i %i %u unzoomed अंजूम zoomed ज़ूम framerate:%f फ्रेम रेट : %f Fractal name:%s फ्रैक्टल का नाम : %s Fractal type:%s फ्रैक्टल का प्रकार: %s Mandelbrot मंडेलब्रॉट Julia जूलिया Formula:%s फार्मूला: %s View:[%1.12f,%1.12f] दृश्य : [%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i रोटेशन %4.2f रोटेशन माप:%i:%i Bailout:%4.2f सब छोड़े (Bailout)%4.2f On चालू Off बंद zoomspeed:%f ज़ूम गति : %f Thank you for using XaoS XaoS का उपयोग करने के लिए धन्यवाद XaoS must restart to change the language. भाषा बदलने के लिए XaoS को पुनः आरंभ करना होगा. Enabling: %s. सक्रिय हो रहा है : %s. Disabling: %s. निष्क्रिय हो रहा है: %s. Skipping, please wait... छोड़ रहे है, कृपया कुछ इंतज़ार करे... Letters per second %i अक्षर प्रति सेकंड %i Rotation speed:%2.2f degrees per second रोटेशन गति: %2.2f डिग्री प्रति सेकंड Iterations: %i पुर्नवृतियाँ : %i Cycling speed: %i परिसंचरण गति : %i speed:%2.2f गति : %2.2f Please wait while calculating %s कृपया गणना करते समय रुके करें %s Welcome to XaoS version %s आपका स्वागत है XaoS version %s Out of memory मेमोरी से बहार Unbalanced parentheses असंतुलित कोष्ठक Unknown function: %s अज्ञात फंक्शन: %s Invalid number: %s अज्ञात संख्या: %s Unknown variable: %s अज्ञात वेरिएबल: %s Invalid operator: %s अमान्य ऑपरेटर: %s Internal error occurred in formula: %s फार्मूला में आंतरिक त्रुटि हुई: %s Function has incorrect parameter count: %s फ़ंक्शन में गलत पैरामीटर गणना है: %s Empty formula खाली फार्मूला XaoS must restart to change the thread count. XaoS को थ्रेड काउंट को बदलने के लिए पुनः आरंभ करना होगा. Do you want to quit now? क्या आप अब बंद करना चाहते हैं? File %s opened. size:[%1.12f,%1.12f] Iterations:%-4u Palette size:%i Autopilot:%-4s Plane:%s incoloring:%s outcoloring:%s Parameter:none Parameter:[%f,%f] Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_hu.ts000066400000000000000000001333031455214672000165160ustar00rootroot00000000000000 Dialog Perturbation: Perturbáció: Julia-seed: Julia-mag: Morphing type: Átalakítás típusa: Startuptime: Indítási idő: Stoptime: Leállítási idő: File to render: Feldolgozandó fájl: Files to render: Legyártandó fájlok: Basename: Fájlnév (kiterjesztés nélkül): Width: Szélesség: Height: Magasság: Pixel width (cm): Pixelszélesség (cm): Pixel height (cm): Pixelmagasság (cm): Framerate: Képfrissítés: Image type: Kép típusa: Antialiasing: Élsimítás: Always recalculate: Mindig újraszámolás: Center: Középpont: Radius: Sugár: Angle: Szög: Mode: Mód: Start: Kezdet: End: Vég: Color: Szín: Rotations per second: Forgatások száma másodpercenként: Letters per second: Másodpercenkénti betűszám: Iterations: Iterációk: Text: Szöveg: Your command: Parancs: Filename: Fájlnév: Formula: Képlet: X center: X középpont: Y center: Y középpont: X Radius: X sugár: Y Radius: Y sugár: Coordinates: Koordináták: continuous rotation folyamatos forgatás Fast rotation Gyors forgatás filter szűrő enable bekapcsolva Amount: Mennyiség: Zooming speed: Belenagyítás gyorsasága: Name: Név: Bailout: Szökés: Threads: Végrehajtási szálak: Julia mode: Julia-mód: Horizontal position: Vízszintes pozíció: Vertical position: Függőleges pozíció: Dynamic resolution: Dinamikus felbontás: Time: Idő: Number: Szám: Algorithm number: Algoritmus száma: Seed: Mag: Shift: Eltolás: Load Palette Config Palettakonfiguráció betöltése Save Palette Config Palettakonfiguráció mentése Frames per second: Másodpercenkénti képkockaszám: Formula Képlet Initialization: Alapérték: Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: A szélességnek 0..4096 közötti pozitív egésznek kell lennie renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: A magasságnak 0..4096 közötti pozitív egésznek kell lennie renderanim: Invalid real width and height dimensions renderanim: Érvénytelen szélesség vagy magasság renderanim: invalid framerate renderanim: hibás képkocka-ráta renderanim: antialiasing not supported in 256 color mode renderanim: az élsimítás 256 színű módban nem támogatott animateview: Invalid viewpoint animateview: Érvénytelen nézőpont Invalid viewpoint Érvénytelen nézőpont Unknown palette type Ismeretlen paletta típus Initialization of color cycling failed. A színforgatás nem inicializálható. Try to enable palette emulation filter Próbáld bekapcsolni a paletta emulációs szűrőt Algorithm:%i seed:%i size:%i Algoritmus:%i mag:%i méret:%i line available only in animation replay a "line" csak animáció visszajátszásakor használható Morphing non existing line! Nem létező vonal nem alakítható! linekey not available in this context! A "linekey" ebben a kontextusban nem érhető el! clear_line available only in animation replay a "clear_line" csak animáció visszajátszásakor használható clear_lines available only in animation replay a "clear_lines" csak animáció visszajátszásakor használható Catalog file not found A katalógus fájl nem található Replay is already active A visszajátszás már aktív File open failed Sikertelen fájl megnyitás Out of memory Elfogyott a memória Missing parameter Hiányzó paraméter Unexpected end of file A fájl nincs lezárva Token is too long Túl hosszú kulcsszó Unknown formula type Ismeretlen képlettípus morph available only in animation replay a "morph" csak animáció visszajátszásakor használható morphview: Invalid viewpoint morphview: Érvénytelen nézőpont move available only in animation replay a "move" csak animáció visszajátszásakor használható morphjulia available only in animation replay a "morphjulia" csak animáció visszajátszásakor használható morphangle available only in animation replay a "morphangle" csak animáció visszajátszásakor használható Unknown filter Ismeretlen szűrő sleep available only in animation replay a "sleep" csak animáció visszajátszásakor használható Internal program error #12 %i 12-es számú belső hiba %i wait available only in animation replay a "wait" csak animáció visszajátszásakor használható No catalog file loaded Nincs betöltött katalógus fájl Message not found in catalog file A katalógus fájlban hiányzik egy szöveg load available only in animation replay a "load" csak animáció visszajátszásakor használható Include level overflow A csatolt szintek száma túllépte a megengedettet File not found Hiányzó fájl Too many parameters Túl sok paraméter Error: %s Hiba: %s Cannot create palette A színpaletta nem hozható létre Cannot create image A kép nem hozható létre Cannot create checking buffer! Az ellenőrző puffer nem hozható létre! Cannot create context A kontextus nem hozható létre Cannot open animation file Az animációs fájl nem nyitható meg Calculation interrupted A számítás félbeszakadt Calculation finished A számítás véget ért Tutorial files not found. Reinstall XaoS A tankönyv fájlok nem találhatók. A XaoS programot újra kell telepíteni Could not open examples A példák nem nyithatók meg Could not open image A kép nem tölthető be Can not create palette A színpaletta nem hozható létre XaoS is out of memory. Elfogyott a memória. Can not create image A kép nem hozható létre Can not allocate tables Nincs hely a tábláknak Menu Root menu Főmenü Animation root menu Animáció főmenü Replay only commands Csak visszajátszó parancsok Line drawing functions Vonalrajzoló függvények Line Vonal Morph line Átalakuló vonal Morph last line Az utolsó vonal átalakítása Set line key Vonalkulcs beállítása Clear line Vonal törlése Clear all lines Minden vonal törlése Animation functions Animációs függvények View Nézet Morph view Átalakítás nézet Morph julia Átalakítás Julia Move view Mozgatás nézet Morph angle Átalakítás szög Zoom center Nagyítási centrum Zoom Nagyítás Un-zoom Kicsinyítés Stop zooming Belenagyítás leállítása Smooth morphing parameters Simítási paraméterek Timing functions Időzítő függvények Usleep Várakozás Wait for text Szövegre várakozás Wait for complete image A kép kirajzolása folyamatban Include file Fájl csatolása Default palette Alapértelmezett színek Formula Képlet Maximal zooming step Maximális nagyítási lépték Zooming speedup Belenagyítás gyorsasága Filter Szűrő Letters per second Másodpercenkénti betűszám Interrupt Megszakítás Status Jellemzők Ministatus Főbb jellemzők Cartesian Grid Descartes koordináta-rendszer File Fájl Edit Szerkesztés Fractal Fraktál Calculation Számítás Filters Szűrők Action Művelet Help Segítség Tutorials Útmutatók Stop replay Visszajátszás leállítása Command Parancs Play string Karakterlánc lejátszása Clear screen Képernyőtörlés Display fractal Fraktál megjelenítése Display text Szöveg megjelenítése Text color Szöveg színe Horizontal text position Szöveg vízszintes pozíciója Vertical text position Szöveg függőleges pozíciója Text position Szöveg pozíciója Message Felirat New Új Open Megnyitás Save Mentés Save as Mentés másként PNG PNG Record Felvétel Replay Visszajátszás Open image Kép megnyitása Save image Kép mentése Render Film legyártása Render Image Kép legyártása Load random example Egy mintapélda betöltése Save configuration Beállítások mentése Undo Visszavonás Redo Mégis Formulae Képletek More formulae További képletek User formula Egyedi képlet User initialization Egyedi képlet alapérték Incoloring mode Belső színezési mód Outcoloring mode Külső színezési mód Plane Sík Palette Színpaletta Mandelbrot mode Mandelbrot-mód Julia mode Julia-mód Fast julia mode Gyors Julia-mód Rotation Forgatás Set angle Szög beállítása Set plane Sík beállítása Inside coloring mode Belső színezési módok Outside coloring mode Külső színezési módok Inside truecolor coloring mode Belső truecolor színezési mód Outside truecolor coloring mode Külső truecolor színezési mód Julia seed Julia-sebesség Random palette Véletlen színek Custom palette Felhasználói színek Palette Colors A paletta színei Palette Editor Palettaszerkesztő Load Palette Config Palettakonfiguráció betöltése Save Palette Config Palettakonfiguráció mentése Color cycling Színforgatás Reversed color cycling Színforgatás visszafelé Color cycling speed Színforgatási sebesség Shift palette Színpaletta eltolása Shift one forward Eggyel előreléptetés Shift one backward Eggyel visszaléptetés Solid guessing Egyszerű találgatás Disable solid guessing Egyszerű találgatás kikapcsolva Guess 2x2 rectangles 2x2 téglalap Guess 3x3 rectangles 3x3 téglalap Guess 4x4 rectangles 4x4 téglalap Guess 5x5 rectangles 5x5 téglalap Guess 6x6 rectangles 6x6 téglalap Guess 7x7 rectangles 7x7 téglalap Guess 8x8 rectangles 8x8 téglalap Guess unlimited rectangles Korlátlan téglalapszám Dynamic resolution Dinamikus felbontás Periodicity checking Periodicitás vizsgálata Threads Végrehajtási szálak Iterations Iterációk Bailout Szökés Perturbation Perturbáció Zooming speed Belenagyítás gyorsasága Fixed step Rögzített lépték Solid guessing range Találgatási intervallum Disable rotation Forgatás kikapcsolva Continuous rotation Folyamatos forgatás Rotate by mouse Forgatás egérrel Rotation speed Forgatás gyorsasága Automatic rotation Automatikus forgatás Fast rotation mode Gyors forgatási mód Recalculate Újraszámolás Disable dynamic resolution Dinamikus felbontás kikapcsolva Use only during animation Csak az animáció alatt Use also for new images Új képeknél is így legyen Dynamic resolution mode Dinamikus felbontási mód Autopilot Robotpilóta Hide Messages Üzenetek némítása An introduction to fractals Bevezetés a fraktálok világába XaoS features overview Tippek és trükkök Math behind fractals A fraktálok matematikája Other fractal types in XaoS A XaoS további fraktáltípusai What's new? Újdonságok Whole story Minden fejezet Introduction Bevezetés Mandelbrot set Mandelbrot-halmaz Julia set Julia-halmaz Higher power Mandelbrots Magasabb rendű Mandelbrotok Newton's method Newton eljárása Barnsley's formula A Barnsley-formula Phoenix Phoenix Octo Octo Magnet Mágnes All features Az összes jellemző Outcoloring modes Külső színezési módok Incoloring modes Belső színezési módok True-color coloring modes Truecolor színezési módok Planes Síkok Animations and position files Animációk és pozíciófájlok Random palettes Véletlen színpaletták Other noteworthy features További apróságok The definition and fractal dimension Definíció és fraktáldimenzió Escape time fractals Szökési időn alapuló fraktálok Triceratops and Catseye fractals A Triceratops és a Catseye fraktálok Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar és Spider Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinski-háromszög, -szőnyeg, Koch-hópehely What's new in 3.0? Újdonságok a 3.0-s verzióban What's new in 4.0? Újdonságok a 4.0-s verzióban Quit Kilépés Message Font... Feliratok betűtípusa... Set Language Nyelv beállítása System default Rendszerbeállítások használata Info on current fractal Információ az aktuális fraktálról Send Feedback Visszajelzés küldése Get Updates Új verzió letöltése User Forum Felhasználói fórum About Névjegy Fullscreen Teljes képernyő Copy position URL Pozíció-URL másolása Message Boundary trace Határkövetés Solid guessing 1 Egyszerű találgatás 1 Solid guessing Egyszerű találgatás Replay disabled at line %i A lejátszás a(z) %i sorszámú sornál megszakadt Initializing Inicializálás Loading catalogs Filmfájlok szövegeinek betöltése Processing command line options Parancssori opciók feldolgozása Enabling animation replay Animáció-visszajátszás bekapcsolva Entering calculation loop! A számítási ciklus kezdete! Rendering frame %i... A(z) %i sorszámú képkocka létrehozása... Linking frame %i to %i... A(z) %i és %i sorszámú képkockák összekapcsolása... Calculation finished A számítás véget ért Preparing first image Az első kép előkészítése File %s loaded. A(z) %s fájl betöltődött. Saving image... Kép mentése... Save interrupted A mentés félbeszakadt File %s saved. A(z) %s fájl elmentve. Can not open file A fájl nem nyitható meg Recording to file %s enabled. A(z) %s fájlba történő felvétel elindítva. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f-szoros (%.1fE) %2.2f kép/mp %c %i %i %i %u unzoomed kicsinyítés zoomed nagyítás framerate:%f képfrissítés:%f Fractal name:%s Fraktál neve:%s Fractal type:%s Fraktál típusa:%s Mandelbrot Mandelbrot Julia Julia Formula:%s Képlet:%s View:[%1.12f,%1.12f] Nézet:[%1.12f,%1.12f] size:[%1.12f,%1.12f] Méret:[%1.12fx%1.12f] Rotation:%4.2f Screen size:%i:%i Forgatás:%4.2f Képernyőméret:%i:%i Iterations:%-4u Palette size:%i Iterációk száma:%-4u Színpaletta-méret:%i Bailout:%4.2f Szökés:%4.2f Autopilot:%-4s Plane:%s Robotpilóta:%-4s Sík:%s On Be Off Ki incoloring:%s outcoloring:%s belső színezés:%s külső színezés:%s zoomspeed:%f belenagyítási sebesség:%f Parameter:none Paraméter:nincs Parameter:[%f,%f] Paraméter:[%f,%f] Thank you for using XaoS Köszönjük, hogy a XaoS programot használta XaoS must restart to change the language. A XaoS programot újra kell indítani a nyelv beállításához. Enabling: %s. %s bekapcsolva. Disabling: %s. %s kikapcsolva. Skipping, please wait... Továbblépés, kérem várjon... Letters per second %i Másodpercenként %i betű Rotation speed:%2.2f degrees per second Forgatási sebesség:%2.2f fok másodpercenként Iterations: %i Iterációk száma: %i Cycling speed: %i Színforgatási sebesség: %i speed:%2.2f sebesség:%2.2f Please wait while calculating %s Kérem várjon, a %s fraktál előállítása folyamatban... Welcome to XaoS version %s Köszöntjük a XaoS %s verziójában! Out of memory Elfogyott a memória Unbalanced parentheses Hibás zárójelezés Unknown function: %s Ismeretlen függvény: %s Invalid number: %s Érvénytelen szám: %s Unknown variable: %s Ismeretlen változó: %s Invalid operator: %s Érvénytelen művelet: %s Internal error occurred in formula: %s Belső hiba a képletben: %s Function has incorrect parameter count: %s Nem megfelelő számú paraméter: %s Empty formula Üres képlet XaoS must restart to change the thread count. A programot újra kell indítani a tevékenységi szálak módosításához. Do you want to quit now? Kilép a programból? File %s opened. A(z) %s fájl megnyitva. Clipboard set to %s. A vágólap tartalma: %s. Mouse:[%1.12f,%1.12f] Egér:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_is.ts000066400000000000000000001306411455214672000165170ustar00rootroot00000000000000 Dialog Perturbation: Truflun: Julia-seed: Júlíu-fræ: Morphing type: Mótunargerð (morphing type): Startuptime: Byrjunartími: Stoptime: Endatími: File to render: Skjöl til frágangs: Basename: Grunnnafn: Width: Breidd: Height: Hæð: Pixel width (cm): Pixel-breidd (cm): Pixel height (cm): Pixel-hæð (cm): Framerate: Fjöldi ramma á mínútu: Image type: Gerð myndar: Antialiasing: Afstöllun: Always recalculate: Endurreikna ávallt: Center: Miðja: Radius: Geisli: Angle: Horn: Mode: Hamur: Start: Byrjun: End: Endir: Color: Litur: Rotations per second: Snúningar á sekúndu: Letters per second: Stafir á sekúndu: Iterations: Ítranir: Text: Texti: Your command: Skipunin þín: Filename: Skráarheiti: Formula: Formúla: X center: X miðja: Y center: Y miðja: X Radius: X Geisli: Y Radius: Y Geisli: Coordinates: Hnit: continuous rotation samfelldur snúningur Fast rotation Hraður snúningur filter sía enable leyfa Amount: Fjöldi: Zooming speed: Þysjunarhraði: Name: Nafn: Bailout: Stöðvunargildi (bailout): Threads: Þræðir: Julia mode: Júlíu-hamur: Horizontal position: Lárétt staða: Vertical position: Lóðrétt staða: Dynamic resolution: Kvik upplausn: Time: Tími: Number: Fjöldi: Algorithm number: Reiknirit númer: Seed: Fræ: Shift: Hliðrun: Frames per second: Rammar á sekúndu: Formula Formúla Initialization: Frumstilling: Files to render: Load Palette Config Save Palette Config Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Breiddar-gildi verður að vera jákvæð heiltala á bilinu 0..4096 renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Hæðar-gildi verður að vera jákvæð heiltala á bilinu 0..4096 renderanim: Invalid real width and height dimensions renderanim: Ógild raungildi breiddar og hæðar renderanim: invalid framerate renderanim: ógildur fjöldi ramma á tímaeiningu renderanim: antialiasing not supported in 256 color mode renderanim: afstöllun ekki studd í 256 lita ham animateview: Invalid viewpoint animateview: Ógildur sjónarhóll Invalid viewpoint Ógildur sjónarhóll Unknown palette type Óþekkt gerð litavals Initialization of color cycling failed. Frumstilling litahringjar mistókst. Try to enable palette emulation filter Reyni að leyfa hermunarsíu litavals Algorithm:%i seed:%i size:%i Algrím:%i fræ:%i stærð:%i line available only in animation replay lína eingöngu aðgengileg í endurspilun hreyfimyndar Morphing non existing line! Myndbræðing línu sem ekki er til staðar! linekey not available in this context! Línulykill ekki aðgengilegur í þessu samhengi! clear_line available only in animation replay Línuhreynsun eingöngu aðgengileg í endurspilun hreyfimyndar clear_lines available only in animation replay Línuhreynsun eingöngu aðgengileg í endurspilun hreyfimyndar Catalog file not found Skjalið fannst ekki Replay is already active Endurspilun er nú þegar virk File open failed Opnun skjals mistókst Out of memory Minnið er búið Missing parameter Vantar stika Unexpected end of file Skjal endar óvænt Token is too long Of langur tóki Unknown formula type Óþekkt gerð formúlu morph available only in animation replay Bræðingsmynd eingöngu aðgengileg í endurspilun hreyfimyndar morphview: Invalid viewpoint morphview: Ógilt sjónarhorn move available only in animation replay færsla eingöngu aðgengileg í endurspilun hreyfimyndar morphjulia available only in animation replay morphjulia er eingöngu aðgengilegt í endurspilun hreyfimyndar morphangle available only in animation replay morphangle eingöngu aðgengilegt í endurspilun hreyfimyndar Unknown filter Óþekkt sía sleep available only in animation replay hvíld eingöngu aðgengileg í endurspilun hreyfimyndar Internal program error #12 %i Innri villa forrits #12 %i wait available only in animation replay bið eingöngu aðgengileg í endurspilun hreyfimyndar No catalog file loaded Ekkert skjal hlóðst Message not found in catalog file Skilaboð fundust ekki í skjalinu load available only in animation replay hlaða (load) eingöngu aðgengilegt í endurspilun hreyfimyndar Include level overflow Innihalda yfirflæði borðs (level) File not found Skjal fannst ekki Too many parameters Of margir stikar Error: %s Villa: %s Cannot create palette Get ekki útbúið litaval Cannot create image Get ekki útbúið mynd Cannot create checking buffer! Get ekki útbúið prófunar-biðminni! Cannot create context Get ekki útbúið samhengi Cannot open animation file Get ekki opnað skjal hreyfimyndar Calculation interrupted Útreikningar truflaðir Calculation finished Útreikningum lokið Tutorial files not found. Reinstall XaoS Leiðbeiningarskjöl fundust ekki. Enduruppsetjið XaoS (reinstall) Could not open examples Gat ekki opnað dæmi Can not create palette Get ekki útbúið litaval XaoS is out of memory. XaoS búið með minnið. Can not create image Get ekki útbúið mynd Can not allocate tables Get ekki úthlutað töflum Could not open image Menu Root menu Rótarvalmynd Animation root menu Rótarvalmynd hreyfimyndar Replay only commands Endurspila skipanir eingöngu Line drawing functions Línuteikningarföll Line Lína Morph line Bræðingsmynd línu Morph last line Bræðingsmynd síðustu línu Set line key Skilgreina lykil línu Clear line Eyða línu Clear all lines Eyða öllum línum Animation functions Aðgerðir hreyfimyndar View Notandasýn Morph view Sýn bræðingsmyndar Morph julia Bræðingsmynd Júlíu Move view Sýn hreyfingar Morph angle Bræðingsmynd horns Zoom center Þysjunarmiðja Zoom Þysja inn Un-zoom Þysja út Stop zooming Stöðva þysjun Smooth morphing parameters Samfelldir stikar bræðingsmyndar Timing functions Tímasetningarföll Usleep Usleep Wait for text Bið eftir texta Wait for complete image Bið eftir tilbúinni mynd Include file Fella inn skrá Default palette Sjálfgefið litaval Formula Formúla Maximal zooming step Stærsta þysjunarskref Zooming speedup Þysjunarhraði Filter Sía Letters per second Stafir á sekúndu Interrupt Trufla Status Staða Ministatus Örstaða File Skrá Edit Breyta Fractal Broti Calculation Útreikningar Filters Síur Action Aðgerð Help Aðstoð Tutorials Leiðbeiningar Stop replay Stöðva endurspilun Command Skipun Play string Spila streng Clear screen Hreinsa skjá Display fractal Sýna brota Display text Sýna texta Text color Litur texta Horizontal text position Lárétt staða texta Vertical text position Lóðrétt staða texta Text position Staða texta Message Skilaboð New Nýtt Open Opna Save Vista Record Upptaka Replay Endurspila Save image Vista mynd Render Ganga frá Load random example Hlaða slembivöldu dæmi Save configuration Vista stöðu Undo Til baka Redo Endurgera Formulae Formúlur More formulae Fleiri formúlur User formula Notendaformúla User initialization Frumstilling notanda Incoloring mode Innlitahamur Outcoloring mode Útlitahamur Plane Slétta Palette Litaval Mandelbrot mode Mandelbrot hamur Julia mode Júlíu hamur Fast julia mode Hrað júlíu hamur Rotation Snúningur Set angle Stilla horn Set plane Stilla sléttu Inside coloring mode Innra litaspjald Outside coloring mode Ytra litaspjald Inside truecolor coloring mode Innra sannlita litaspjald Outside truecolor coloring mode Ytra sannlita litaspjald Julia seed Júlíu fræ Random palette Slembival lita Custom palette Sérval lita Color cycling Litarás Reversed color cycling Öfug litarás Color cycling speed Hraði litarásar Shift palette Hliðra litavali Shift one forward Hliðra einn áfram Shift one backward Hliðra einn afturábak Solid guessing Gisk fyrir rúmskika Disable solid guessing Afnema gisk fyrir rúmskika Guess 2x2 rectangles Giska 2x2 ferhyrningar Guess 3x3 rectangles Giska 3x3 ferhyrningar Guess 4x4 rectangles Giska 4x4 ferhyrningar Guess 5x5 rectangles Giska 5x5 ferhyrningar Guess 6x6 rectangles Giska 6x6 ferhyrningar Guess 7x7 rectangles Giska 7x7 ferhyrningar Guess 8x8 rectangles Giska 8x8 ferhyrningar Guess unlimited rectangles Giska ótakmarkaða ferhyrninga Dynamic resolution Kvik upplausn Periodicity checking Tímaspannsprufun Threads Þræðir Iterations Ítranir Bailout Stöðvunargildi Perturbation Truflun (perturbation) Zooming speed Þysjunarhraði Fixed step Föst skref Solid guessing range Mörk giskunar rúmskika Disable rotation Gera snúning óvirkan Continuous rotation Samfelldur snúningur Rotate by mouse Snúa með mús Rotation speed Snúningshraði Automatic rotation Sjálfvirkur snúningur Fast rotation mode Hraður snúningshamur Recalculate Endurreikna Disable dynamic resolution Gera kvika upplausn óvirka Use only during animation Nota eingöngu meðan á hreyfimynd stendur Use also for new images Nota einnig fyrir nýjar myndir Dynamic resolution mode Hamur kvikrar upplausnar Autopilot Sjálfvirk stilling (autopilot) Hide Messages Fela skilaboð An introduction to fractals Inngangur að brotum (fractals) XaoS features overview Yfirlit XaoS möguleika Math behind fractals Stærðfræði að baki brotum (fractals) Other fractal types in XaoS Aðrar gerðir brota (fractals) í XaoS What's new? Hvað er nýtt? Whole story Sagan öll Introduction Inngangur Mandelbrot set Mandelbrot mengið Julia set Júlíu mengið Higher power Mandelbrots Æðri velda Mandelbrot Newton's method Aðferð Newtons Barnsley's formula Formúla Barnsleys Phoenix Fönix (Phoenix) Octo Áttu (octo) Magnet Segull All features Öll sérkenni Outcoloring modes Útlitar-hamar Incoloring modes Innlitar-hamar True-color coloring modes Sannlitar litavals hamur Planes Sléttur Animations and position files Hreyfimyndir og stöðu-skjöl Random palettes Slembið litaval Other noteworthy features Önnur mikilvæg sérkenni The definition and fractal dimension Skilgreining og rúmvídd brota Escape time fractals Flóttatíma brotar (escape time fractals) Triceratops and Catseye fractals Triceratop og Kattarauga brotar Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar og Könguló Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinski þríhyrningur, S.Teppi, Koch snjókornið What's new in 3.0? Hvað er nýtt í 3.0? What's new in 4.0? Hvað er nýtt í 3.0? {4.0??} Quit Hætta Message Font... Leturgerð skilaboða... Fullscreen Alskjár Send Feedback Senda viðbrögð Get Updates Fá uppfærslu User Forum Notendasvæði (forum) About Um Cartesian Grid Save as PNG Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config Set Language System default Info on current fractal Copy position URL Message Boundary trace Jaðarspor Solid guessing 1 Gisk rúmskika 1 Solid guessing Gisk rúmskika Out of memory Minni búið Unbalanced parentheses Vantar sviga Unknown function: %s Óþekkt fall: %s Invalid number: %s Óþekkt stærð: %s Unknown variable: %s Óþekkt breyta: %s Invalid operator: %s Óþekktur virki: %s Internal error occurred in formula: %s Innri villa kom upp í formúlu: %s Function has incorrect parameter count: %s Fall inniheldur ranga fjöldatölu stika: %s Empty formula Tóm formúla XaoS must restart to change the thread count. Endurræsa þarf XaoS til að breyta talningu þráða. Do you want to quit now? Viltu hætta? Replay disabled at line %i Endurspilun stöðvuð í línu %i Initializing Frumstilli Loading catalogs Hleð efnisskrá Processing command line options Vinn úr möguleikum skipunarlínu Enabling animation replay Geri endurspilun hreyfimyndar mögulega Entering calculation loop! Hef útreikning lykkju! Rendering frame %i... Geng frá ramma %i... Linking frame %i to %i... Tengi ramma %i til %i... Calculation finished Útreikningum lokið Preparing first image Undirbý fyrstu mynd File %s loaded. Skjal %s fullhlaðið. Saving image... Vista mynd... Save interrupted Vistun truflaðist File %s saved. Skjal %s vistaðist. Can not open file Get ekki opnað skjal Recording to file %s enabled. Skráning í skjal %s óvirk. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f sinnum (%.1fE) %2.2f rammar/sek %c %i %i %i %u unzoomed óþysjað zoomed þysjað framerate:%f rammatíðni: %f Fractal name:%s Nafn brota: %s Fractal type:%s Gerð brota: %s Mandelbrot Mandelbrot Julia Júlía Formula:%s Formúla: %s View:[%1.12f,%1.12f] Sýn:[%1.12f,%1.12f] size:[%1.12f,%1.12f] stærð:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Snúningur:%4.2f Stærð skjás:%i:%i Iterations:%-4u Palette size:%i Ítranir:%-4u Stærð litavals:%i Bailout:%4.2f Stöðvunargildi Autopilot:%-4s Plane:%s Sjálfvirk stilling:%-4s Slétta:%s On Virkja Off Afvirkja incoloring:%s outcoloring:%s innlitun:%s útlitun:%s zoomspeed:%f þysjunarhraði:%f Parameter:none Stiki:enginn Parameter:[%f,%f] Stiki:[%f,%f] Thank you for using XaoS Takk fyrir að nota XaoS Enabling: %s. Virkja: %s. Disabling: %s. Afvirkja: %s. Skipping, please wait... Sleppi, vinsamlega bíðið... Letters per second %i Stafir á sekúndu %i Rotation speed:%2.2f degrees per second Snúningshraði: %2.2f gráður á sekúndu Iterations: %i Ítranir: %i Cycling speed: %i Snúningshraði: %i speed:%2.2f hraði:%2.2f Please wait while calculating %s Vinisamlega bíðið meðan útreikningar standa yfir %s Welcome to XaoS version %s Velkomin í XaoS útg. %s File %s opened. XaoS must restart to change the language. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_it.ts000066400000000000000000001444011455214672000165170ustar00rootroot00000000000000 Dialog Perturbation: Perturbazione: Julia-seed: Seme di Julia: Morphing type: Tipo di trasformazione: Startuptime: Tempo di avvio: Stoptime: Tempo di arresto: File to render: File di rendering: Basename: Nome base: Width: Larghezza: Height: Altezza: Framerate: Frequenza fotogrammi: Image type: Tipo di immagine: Antialiasing: Antialiasing: Always recalculate: Ricalcola sempre: Center: Centro: Radius: Raggio: Angle: Angolo: Mode: Modalità: Start: Inizio: End: Fine: Color: Colore: Rotations per second: Rotazioni al secondo: Letters per second: Lettere al secondo: Iterations: Iterazioni: Text: Testo: Your command: Comando: Filename: Nome file: Formula: Formula: X center: Centro X: Y center: Centro Y: X Radius: Raggio X: Y Radius: Raggio Y: Coordinates: Coordinate: continuous rotation rotazione continua Fast rotation Rotazione veloce filter filtra enable abilita Amount: Quantità: Zooming speed: Velocità di ingrandimento: Name: Nome: Bailout: Bailout: Julia mode: Modalità Julia: Horizontal position: Posizione orizzontale: Vertical position: Posizione verticale: Dynamic resolution: Risoluzione dinamica: Time: Tempo: Number: Numero: Algorithm number: Numero dell'algoritmo: Seed: Seme: Shift: Spostamento: Frames per second: Fotogrammi al secondo: Formula Formula Initialization: Inizializzazione: Files to render: Pixel width (cm): Pixel height (cm): Threads: Load Palette Config Save Palette Config Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: il parametro larghezza deve essere un intero positivo nell'intervallo 0..4096 renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: il parametro altezza deve essere un intero positivo nell'intervallo 0..4096 renderanim: Invalid real width and height dimensions renderanim: dimensioni di larghezza e altezza reali non valide renderanim: invalid framerate renderanim: frequenza di aggiornamento non valida renderanim: antialiasing not supported in 256 color mode renderanim: antialiasing non supportato nella modalità a 256 colori animateview: Invalid viewpoint animateview: punto di osservazione non valido Invalid viewpoint Punto di osservazione non valido Unknown palette type Tipo di tavolozza sconosciuto Initialization of color cycling failed. Inizializzazione del ciclo colori fallita. Try to enable palette emulation filter Provare ad abilitare il filtro di emulazione tavolozza Algorithm:%i seed:%i size:%i Algoritmo:%i seme: %i dimensione:%i line available only in animation replay linea disponibile solo nella riproduzione animazione Morphing non existing line! Trasformazione di una linea inesistente! linekey not available in this context! linekey non disponibile in questo contesto! clear_line available only in animation replay clear_line disponibile solo nella riproduzione animazione clear_lines available only in animation replay clear_lines disponibile solo nella riproduzione animazione Catalog file not found File del catalogo non trovato Replay is already active La riproduzione è già attiva File open failed Apertura del file fallita Out of memory Memoria esaurita Missing parameter Parametro mancante Unexpected end of file Fine file inattesa Token is too long Il token è troppo lungo Unknown formula type Tipo di formula sconosciuto morph available only in animation replay morph disponibile solo nella riproduzione di animazione morphview: Invalid viewpoint morphview: punto di osservazione non valido move available only in animation replay move disponibile solo in riproduzione animazione morphjulia available only in animation replay morphjulia disponibile solo in riproduzione animazione morphangle available only in animation replay morphangle disponibile solo in riproduzione animazione Unknown filter Filtro sconosciuto sleep available only in animation replay sleep disponibile solo in riproduzione animazione Internal program error #12 %i Errore interno del programma #12 %i wait available only in animation replay wait disponibile solo nella riproduzione di animazione No catalog file loaded Nessun file del catalogo caricato Message not found in catalog file Messaggio non trovato nel file del catalogo load available only in animation replay load disponibile solo nella riproduzione di animazione Include level overflow Includi overflow di livello File not found File non trovato Too many parameters Troppi parametri Error: %s Errore: %s Cannot create palette Impossibile creare la tavolozza Cannot create image Impossibile creare l'immagine Cannot create checking buffer! Impossibile creare il buffer di controllo! Cannot create context Impossibile creare il contesto Cannot open animation file Impossibile aprire il file di animazione Calculation interrupted Calcolo interrotto Calculation finished Calcolo concluso Tutorial files not found. Reinstall XaoS File della guida non trovati. Reinstallare XaoS Could not open examples Impossibile aprire gli esempi Can not create palette Non è possibile creare la tavolozza XaoS is out of memory. XaoS ha esaurito la memoria. Can not create image Non è possibile creare l'immagine Can not allocate tables Non è possibile allocare le tabelle Could not open image Menu Root menu Menù radice Animation root menu Menù radice dell'animazione Replay only commands Riproduci solo i comandi Line drawing functions Funzioni di disegno linea Line Linea Morph line Trasforma linea Morph last line Trasforma l'ultima linea Set line key Imposta la chiave di linea Clear line Cancella linea Clear all lines Cancella tutte le linee Animation functions Funzioni di animazione View Vista Morph view Trasforma vista Morph julia Trasforma Julia Move view Muovi vista Morph angle Trasforma angolo Zoom center Ingrandisci al centro Zoom Ingrandimento Un-zoom Rimpicciolimento Stop zooming Ferma l'ingrandimento Smooth morphing parameters Raffina i parametri di trasformazione Timing functions Funzioni di temporizzazione Usleep Usleep Wait for text Attendere il testo Wait for complete image Attendere l'immagine completa Include file Includere il file Default palette Tavolozza predefinita Formula Formula Maximal zooming step Passo di ingrandimento massimo Zooming speedup Accelerazione ingrandimento Filter Filtro Letters per second Lettere al secondo Interrupt Interrompi Status Stato Ministatus Stato ridotto File File Edit Modifica Fractal Frattale Calculation Calcolo Filters Filtri Help Aiuto Tutorials Guide Stop replay Interrompi la riproduzione Command Comando Play string Riproduci stringa Clear screen Pulisci schermo Display fractal Mostra frattale Display text Mostra testo Horizontal text position Posizione orizzontale testo Vertical text position Posizione verticale testo Text position Posizione testo Message Messaggio Save Salva Record Registra Replay Riproduci Save image Salva immagine Load random example Carica esempio casuale Save configuration Salva configurazione Undo Annulla Redo Ripeti Formulae Formule More formulae Altre formule User formula Formula utente User initialization Inizializzazione utente Incoloring mode Modo colorazione interna Outcoloring mode Modo colorazione esterna Plane Piano Palette Tavolozza Mandelbrot mode Modalità Mandelbrot Julia mode Modalità Julia Fast julia mode Modalità julia veloce Rotation Rotazione Set angle Imposta angolo Set plane Imposta piano Inside coloring mode Modalità di colorazione interna Outside coloring mode Modalità di colorazione esterna Inside truecolor coloring mode Modalità di colorazione interna truecolor Outside truecolor coloring mode Modalità di colorazione esterna truecolor Julia seed Seme di Julia Random palette Tavolozza casuale Custom palette Tavolozza personalizzata Color cycling Ciclo dei colori Reversed color cycling Ciclo dei colori inverso Color cycling speed Velocità di ciclo dei colori Shift palette Sposta tavolozza Shift one forward Sposta avanti di uno Shift one backward Sposta indietro di uno Solid guessing Stima di uniformità colore Disable solid guessing Disabilita la stima di uniformità Guess 2x2 rectangles Stima rettangoli 2x2 Guess 3x3 rectangles Stima rettangoli 3x3 Guess 4x4 rectangles Stima rettangoli 4x4 Guess 5x5 rectangles Stima rettangoli 5x5 Guess 6x6 rectangles Stima rettangoli 6x6 Guess 7x7 rectangles Stima rettangoli 7x7 Guess 8x8 rectangles Stima rettangoli 8x8 Guess unlimited rectangles Stima rettangoli illimitati Dynamic resolution Risoluzione dinamica Periodicity checking Controllo di periodicità Iterations Iterazioni Bailout Bailout Perturbation Perturbazione Zooming speed Velocità di ingrandimento Fixed step Passo fisso Solid guessing range Area di stima di uniformità Disable rotation Disabilita rotazione Continuous rotation Rotazione continua Rotate by mouse Ruota tramite mouse Rotation speed Velocità di rotazione Automatic rotation Rotazione automatica Fast rotation mode Modalità di rotazione rapida Recalculate Ricalcola Disable dynamic resolution Disabilita la risoluzione dinamica Use only during animation Usa solo durante l'animazione Use also for new images Usa anche per nuove immagini Dynamic resolution mode Modalità a risoluzione dinamica Autopilot Pilota automatico An introduction to fractals Una introduzione ai frattali XaoS features overview Panoramica delle caratteristiche di XaoS Math behind fractals La matematica che sta dietro ai frattali Other fractal types in XaoS Altri tipi di frattali in XaoS What's new? Novità Whole story Racconto completo Introduction Introduzione Mandelbrot set Insieme di Mandelbrot Julia set Insieme di Julia Higher power Mandelbrots Mandelbrot a potenze superiori Newton's method Metodo di Newton Barnsley's formula Formula di Barnsley Phoenix Phoenix Octo Octo Magnet Magnet All features Tutte le caratteristiche Outcoloring modes Modi di colorazione esterna Incoloring modes Modi di colorazione interna True-color coloring modes Modi di colorazione truecolor Planes Piani Animations and position files Animazioni e file di posizione Random palettes Tavolozze casuali Other noteworthy features Altre caratteristiche degne di nota The definition and fractal dimension La definizione di frattale e la sua dimensione Escape time fractals Frattali con tempo di fuga Triceratops and Catseye fractals Frattali Triceratopo e Occhi di gatto Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar e Spider Sierpinski Gasket, S.Carpet, Koch Snowflake Triangolo e tappeto-Sierpinski,fiocco di neve-Koch What's new in 3.0? Novità della versione 3.0 What's new in 4.0? Novità della versione 4.0 Quit Esci About Informazioni su... Cartesian Grid Action Text color New Open Save as PNG Render Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config Threads Hide Messages Message Font... Set Language System default Fullscreen Info on current fractal Send Feedback Get Updates User Forum Copy position URL Message Boundary trace Traccia dei contorni Solid guessing 1 Stima di uniformità colore 1 Solid guessing Stima di uniformità colore Replay disabled at line %i Riproduzione disabilitata alla linea %i Initializing Inizializzazione Loading catalogs Carimento dei cataloghi Processing command line options Elaborazione delle opzioni da linea di comando Enabling animation replay Abilitazione della riproduzione animazione Entering calculation loop! Ingresso in un loop di calcolo! Calculation finished Calcolo concluso Preparing first image Preparazione della prima immagine File %s loaded. File %s caricato. Saving image... Salvataggio dell'immagine... Save interrupted Salvataggio interrotto File %s saved. File %s salvato. Can not open file Impossibile aprire il file Recording to file %s enabled. Registrazione nel file %s abilitata. unzoomed rimpicciolito zoomed ingrandito framerate:%f frequenza fotogrammi:%f Fractal name:%s Nome del frattale:%s Fractal type:%s Tipo di frattale:%s Mandelbrot Mandelbrot Julia Julia Formula:%s Formula:%s View:[%1.12f,%1.12f] Vista:[%1.12f,%1.12f] size:[%1.12f,%1.12f] dimensione:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Rotazione:%4.2f Dimensione schermo:%i:%i Iterations:%-4u Palette size:%i Iterazioni:%-4i Dimensione tavolozza:%i {4u?} Autopilot:%-4s Plane:%s Pilota automatico:%-4s Piano:%s On Attivo Off Disattivo incoloring:%s outcoloring:%s colorazione interna:%s colorazione esterna:%s zoomspeed:%f velocità di ingrandimento:%f Parameter:none Parametro:nessuno Parameter:[%f,%f] Parametro:[%f,%f] Thank you for using XaoS Grazie di utilizzare XaoS Enabling: %s. Abilitazione: %s. Disabling: %s. Disabilitazione: %s Skipping, please wait... Passaggio al successivo, attendere... Letters per second %i Lettere al secondo %i Rotation speed:%2.2f degrees per second Velocità di rotazione:%2.2f gradi al secondo Iterations: %i Iterazioni: %i Cycling speed: %i Velocità di ciclo: %i speed:%2.2f velocità:%2.2f Please wait while calculating %s Attendere, calcolo di %s in corso... Welcome to XaoS version %s Benvenuto a XaoS versione %s Out of memory Memoria esaurita Unbalanced parentheses Unknown function: %s Invalid number: %s Unknown variable: %s Invalid operator: %s Internal error occurred in formula: %s Function has incorrect parameter count: %s Empty formula XaoS must restart to change the thread count. Do you want to quit now? File %s opened. Rendering frame %i... Linking frame %i to %i... %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u Bailout:%4.2f XaoS must restart to change the language. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_pt.ts000066400000000000000000001441721455214672000165330ustar00rootroot00000000000000 Dialog Perturbation: Distorção Julia-seed: Semente de Julia Morphing type: Tipo de alteração na imagem (metamorfose) Startuptime: Período de inicialização Stoptime: Tempo de parada File to render: Arquivo para processar (renderizar) Basename: Nome base Width: Comprimento Height: Altura Framerate: velocidade do quadro:%f Image type: Tipo de imagem Antialiasing: Suavização das bordas Always recalculate: Recalcular sempre Center: Centro Radius: Raio Angle: Ângulo Mode: Modo Start: Iniciar End: Finalizar Color: Cor Rotations per second: Rotações por segundo Letters per second: Letras por segundo Iterations: Iterações Text: Texto Your command: Seu comando Filename: Nome do arquivo Formula: Fórmula X center: Centro X Y center: Centro Y X Radius: Raio X Y Radius: Raio Y Coordinates: Coordenadas continuous rotation Rotação continua Fast rotation Rotação rápida filter Filtro enable Habilitar Amount: Quantia Zooming speed: Velocidade da ampliação Name: Nome Bailout: Bailout Julia mode: Modo Julia Horizontal position: Posição horizontal Vertical position: Posição vertical Dynamic resolution: Resolução dinâmica Time: Tempo Number: Número Algorithm number: Número algoritmo Seed: Semente Shift: Trocar Frames per second: Quadros por segundo Formula Fórmula Initialization: Inicialização Files to render: Pixel width (cm): Pixel height (cm): Threads: Load Palette Config Save Palette Config Error renderanim: Width parameter must be positive integer in the range 0..4096 Processar animação: o valor da extensão deve ser um número inteiro positivo no intervalo 0 .. 4096 renderanim: Height parameter must be positive integer in the range 0..4096 Processar animação: o valor da altura deve ser um número inteiro positivo no intervalo 0 .. 4096 renderanim: Invalid real width and height dimensions processar animação: Extensão e altura reais inválidas renderanim: invalid framerate processar animação: velocidade de quadro inválida renderanim: antialiasing not supported in 256 color mode processar animação: anti-serrilhamento não suportado no modo de 256 cores animateview: Invalid viewpoint visualizar animação: paradigma inválido Invalid viewpoint Paradigma inválido Unknown palette type Tipo de paleta desconhecida Initialization of color cycling failed. Falha na inicialização de troca de cor Try to enable palette emulation filter Tente habilitar a paleta de simulação Algorithm:%i seed:%i size:%i Algoritmo:%i semente:%i tamanho:%i line available only in animation replay Linha disponível somente na repetição da animação Morphing non existing line! Alterando linha não existente linekey not available in this context! Linha chave não disponível neste contexto clear_line available only in animation replay Limpar _ linha disponível apenas na repetição da animação clear_lines available only in animation replay Limpar _ linhas disponíveis apenas na repetição da animação Catalog file not found Arquivo de catálogo não encontrado Replay is already active Repetição já está ligada File open failed Falha ao abrir arquivo Out of memory Sem memória Missing parameter Perdendo parâmetro Unexpected end of file Finalização de arquivo inesperada Token is too long O sinal é muito longo Unknown formula type Tipo de fórmula desconhecida morph available only in animation replay transformação disponível apenas na repetição da animação morphview: Invalid viewpoint visualização da transformação: paradigma inválido move available only in animation replay Movimento disponível apenas na repetição da animação morphjulia available only in animation replay Transformação para Julia disponível somente na repetição da animação morphangle available only in animation replay Mudança de ângulo disponível somente na repetição da animação Unknown filter Filtro desconhecido sleep available only in animation replay Descanso disponível somente na repetição da animação Internal program error #12 %i Erro de programa interno #12 %i wait available only in animation replay Espera disponível somente na repetição da animação No catalog file loaded Nenhum arquivo do catálogo carregado load available only in animation replay Carregar disponível somente na repetição da animação Include level overflow Incluir superávit File not found Arquivo não encontrado Too many parameters Excesso de parâmetros Error: %s Erro: %s Cannot create palette Não pode criar a paleta Cannot create image Não pode criar a imagem Cannot create checking buffer! Não pode criar verifcação de buffer Cannot create context Não pode criar o contexto Cannot open animation file Não pode abrir o arquivo de animação Calculation interrupted Cálculo interrompido Calculation finished Cálculo finalizado Tutorial files not found. Reinstall XaoS Arquivos de tutoriais não encontrados. Reinstale o Xaos Could not open examples Não pode abrir os exemplos Can not create palette Não pode criar paleta XaoS is out of memory. Sem memória Can not create image Não pode criar imagem Can not allocate tables Não pode partilhar tabelas Message not found in catalog file Could not open image Menu Root menu Menu da raiz Animation root menu Menu da raiz da animação Replay only commands Repetir somente instruções Line drawing functions Funções para desenhar linhas Line Linha Morph line Trocar a linha Morph last line Trocar a última linha Set line key Estabelecer a linha chave Clear line Limpar a linha Clear all lines Limpar todas as linhas Animation functions Funções de animação View Visualizar Morph view Trocar a visualização Morph julia Trocar para o modo Julia Move view Mover a visualização Morph angle Trocar o ângulo Zoom center Centro de ampliação Zoom Ampliar Un-zoom Reduzir Stop zooming Pare a ampliação Smooth morphing parameters Trocar suavemente os parâmetros Timing functions Funções de tempo Usleep Atrasar Wait for text Espere pelo texto Wait for complete image Espere pela imagem completa Include file Incluir arquivo Default palette Paleta padrão Formula Fórmula Maximal zooming step Ampliação máxima Zooming speedup Ampliação acelerada Filter Filtro Letters per second Letras por segundo Interrupt Interromper Status Estado Ministatus Miniestado File Arquivo Edit Editar Fractal Fractal Calculation Cálculo Filters Filtros Action Ação Help Ajuda Tutorials Tutoriais Stop replay Parar a repetição Command Instrução Play string Mostrar a série Clear screen Limpar a tela Display fractal Exibir o fractal Display text Exibir o texto Horizontal text position Posição de texto horizontal Vertical text position Posição de texto vertical Text position Posição do texto Message Mensagem New Novo Open Abrir Save Salvar Record Gravar Replay Repetir Save image Salvar a imagem Load random example Carregar exemplo aleatório Save configuration Salvar configuração Undo Desfazer Redo Refazer Formulae Fórmulas More formulae Mais fórmulas User formula Fórmula usuário User initialization Inicialização usuário Incoloring mode Modo de cor interna Outcoloring mode Modo de cor externa Plane Plano Palette Paleta Mandelbrot mode Modo Mandelbrot Julia mode Modo Julia Fast julia mode Modo rápido de Julia Rotation Rotação Set angle Estabelecer o ângulo Set plane Estabelecer o plano Inside coloring mode Modo de cor interna Outside coloring mode Modo de cor externa Inside truecolor coloring mode Modo truecolor de cor interna Outside truecolor coloring mode Modo truecolor de cor externa Julia seed Semente de Julia Random palette Paleta aleatória Custom palette Paleta regular Color cycling Trocar a cor: Reversed color cycling Reverter a troca de cor Color cycling speed Velocidade da troca de cor Shift palette Trocar paleta Shift one forward Avançar um Shift one backward Voltar um Solid guessing Simulação tridimensional Disable solid guessing Desabilitar simulação tridimensional Guess 2x2 rectangles Simular retângulos 2x2 Guess 3x3 rectangles Simular retângulos 3x3 Guess 4x4 rectangles Simular retângulos 4x4 Guess 5x5 rectangles Simular retângulos 5x5 Guess 6x6 rectangles Simular retângulos 6x6 Guess 7x7 rectangles Simular retângulos 7x7 Guess 8x8 rectangles Simular retângulos 8x8 Guess unlimited rectangles Simular retângulos ilimitados Dynamic resolution Resolução dinâmica Periodicity checking Periodicidade de verificação Iterations Iterações Bailout Bailout Perturbation Distorção Zooming speed Velocidade da ampliação Fixed step Passo fixo Solid guessing range Cadeia de simulação tridimensional Disable rotation Desabilitar rotação Continuous rotation Rotação continua Rotate by mouse Gire com o mouse Rotation speed Velocidade de rotação Automatic rotation Rotação automática Fast rotation mode Modo rápido de rotação Recalculate Recalcular Disable dynamic resolution Desabilitar resolução dinâmica Use only during animation Utilizar somente durante a animação Use also for new images Utilizar também para novas imagens Dynamic resolution mode Modo de resolução dinâmica Autopilot Piloto automático Hide Messages Esconder Mensagens An introduction to fractals Uma introdução aos fractais XaoS features overview Resumo das características do XaoS Math behind fractals Matemática por trás dos fractais Other fractal types in XaoS Outros tipos de fractais do Xaos What's new? Novidades? Whole story A história completa Introduction Introdução Mandelbrot set Conjunto Mandelbrot Julia set Conjunto Julia Higher power Mandelbrots Mandelbrots de maiores potências Newton's method Método de Newton Barnsley's formula Fórmula de Barnsley Phoenix Phoenix Octo Octo Magnet Magnet All features Todas as características Outcoloring modes Modo de cor externa Incoloring modes Modo de cor interna True-color coloring modes Modo de cor interna true-color Planes Planos Animations and position files Arquivos de animações e posição Random palettes Paletas aleatórias Other noteworthy features Outras características relevantes The definition and fractal dimension A definição e dimensão do fractal Escape time fractals Fractais escape time Triceratops and Catseye fractals Fractal Triceratops e Catseye Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar e Spider Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinski Gasket, S. Carpet e Floco de Neve de Koch What's new in 3.0? Quais são as novidades da versão 3.0? What's new in 4.0? Quais são as novidades da versão 4.0? Quit Sair About Sobre Fullscreen Tela cheia Cartesian Grid Text color Save as PNG Render Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config Threads Message Font... Set Language System default Info on current fractal Send Feedback Get Updates User Forum Copy position URL Message Boundary trace Sinal do perímetro Solid guessing 1 Simulação tridimensional Solid guessing Simulação tridimensional Replay disabled at line %i Repetição desabilitada na linha %i Initializing Inicializando Loading catalogs Carregando catálogos Processing command line options Processando as opções de linha de instruções Enabling animation replay Habilitando a repetição da animação Entering calculation loop! Entrada de cálculo Calculation finished Cálculo finalizado Preparing first image Preparando a primeira imagem File %s loaded. Arquivo %s carregado Saving image... Salvando imagem Save interrupted Interrupção na ação de salvar File %s saved. Arquivo %s salvo Can not open file Não pode abrir o arquivo Recording to file %s enabled. Gravando para arquivar %s habilitada unzoomed reduzido zoomed ampliado framerate:%f velocidade do quadro:%f Fractal name:%s Nome do fractal: %s Fractal type:%s Tipo do fractal: %s Mandelbrot Mandelbrot Julia Julia Formula:%s Fórmula View:[%1.12f,%1.12f] Visualização:[%1.12f,%1.12f] size:[%1.12f,%1.12f] Tamanho:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Rotação:%4.2f Tamanho da tela:%i:%i Iterations:%-4u Palette size:%i Iteracões:%-4i Tamanho da paleta:%i {4u?} Autopilot:%-4s Plane:%s Piloto automático:%-4s Plano:%s On Ligado Off Desligado incoloring:%s outcoloring:%s Cor interna:%s Cor externa:%s zoomspeed:%f Velocidade da ampliação:%f Parameter:none Parâmetro:nenhum Parameter:[%f,%f] Parâmetro:[%f,%f] Thank you for using XaoS Obrigado(a) por usar o XaoS Enabling: %s. Habilitando: %s. Disabling: %s. Desabilitando: %s Skipping, please wait... Pulando, por favor espere... Letters per second %i Letras por segundo %i Rotation speed:%2.2f degrees per second Velocidade de rotação:%2.2f graus por segundo Iterations: %i Iterações: %i Cycling speed: %i Velocidade da troca de cor: %i speed:%2.2f velocidade: %2.2f Please wait while calculating %s Por favor, espere o cálculo %s Welcome to XaoS version %s Bem-vindo ao XaoS versão %s Out of memory Sem memória Unbalanced parentheses Unknown function: %s Invalid number: %s Unknown variable: %s Invalid operator: %s Internal error occurred in formula: %s Function has incorrect parameter count: %s Empty formula XaoS must restart to change the thread count. Do you want to quit now? File %s opened. Rendering frame %i... Linking frame %i to %i... %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u Bailout:%4.2f XaoS must restart to change the language. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_ro.ts000066400000000000000000001442271455214672000165310ustar00rootroot00000000000000 Dialog Perturbation: Perturbare: Julia-seed: Julia-samanta(valoare initiala): Morphing type: Tipul de morphing: Startuptime: Timp de pornire: Stoptime: Timp de oprire: File to render: Fisierul de procesat: Basename: Nume de baza: Width: Latime: Height: Inaltime: Framerate: Frecventa cadrelor: Image type: Tipul imaginii: Antialiasing: Antialiasing: Always recalculate: Intotdeauna recalculeaza: Center: Centru: Radius: Raza: Angle: Unghi: Mode: Mod: Start: Start: End: sfarsit: Color: Culoare: Rotations per second: Rotatii pe secunda: Letters per second: Litere pe secunda: Iterations: Iteratii: Text: Text: Your command: Comanda dumneavoastra: Filename: Numele fisierului: Formula: Formula: X center: X-centru: Y center: Y-centru: X Radius: X-Raza: Y Radius: Y-Raza: Coordinates: Coordonate: continuous rotation Rotatie continua Fast rotation Rotatie rapida filter Filtru enable activare Amount: Cantitate: Zooming speed: Viteza de marire (zoom): Name: Nume: Bailout: Bailout (valoare de salvare): Julia mode: Mod Julia: Horizontal position: Pozitia orizontala: Vertical position: Pozitia verticala: Dynamic resolution: Rezolutie dinamica : Time: Timp: Number: Numar: Algorithm number: Numarul algoritmului: Seed: Samanta (valoare initiala): Shift: Deplasare: Frames per second: Cadre pe secunda: Formula Formula Initialization: Initializare Files to render: Pixel width (cm): Pixel height (cm): Threads: Load Palette Config Save Palette Config Error renderanim: Width parameter must be positive integer in the range 0..4096 procesarea animatiei: Latimea trebuie sa fie o valoare pozitva, intreaga intre 0 si 4096 renderanim: Height parameter must be positive integer in the range 0..4096 procesarea animatiei: Inaltimea trebuie sa fie o valoare pozitva, intreaga intre 0 si 4096 renderanim: Invalid real width and height dimensions procesarea animatiei: latime si inaltime reala incorecte renderanim: invalid framerate procesarea animatiei: frecventa cadrelor incorecta renderanim: antialiasing not supported in 256 color mode procesarea animatiei: Antialiasing nicht unterstützt im 256-Farben-Modus animateview: Invalid viewpoint vederea animatiei: punct de vedere incorect Invalid viewpoint Punct de vedere incorect Unknown palette type Tip de paleta necunoscut Initialization of color cycling failed. Initializare ciclarii culorilor a esuat Try to enable palette emulation filter Incercare de activare a filtrului de emulare a paletei Algorithm:%i seed:%i size:%i Algoritm:%i Valoare initiala:%i dimensiune:%i line available only in animation replay Linie disponibila numai in animation replay Morphing non existing line! Morphing o linie inexistenta! linekey not available in this context! Cheia liniei nu este disponibila in acest context! clear_line available only in animation replay Stergerea_liniei (clear_line) disponibila numai in animation replay clear_lines available only in animation replay Stergerea_liniilor (clear_lines) disponibila numai in animation replay Catalog file not found Nu s-a gasit fisierul catalog Replay is already active Replay este deja activ File open failed Fiserul nu a putut fi deschis Out of memory Memorie insuficienta Missing parameter Parametru lipsa Unexpected end of file Sfarsit de fisier neasteptat Token is too long Token-ul este prea lung Unknown formula type Tip de formula necunoscut morph available only in animation replay Morph disponibil numai in animation replay morphview: Invalid viewpoint vederea Morph (morphview): Punct de vedere eronat move available only in animation replay Deplasare dispnibila numai in animation replay morphjulia available only in animation replay Morphjulia dispnibila numai in animation replay morphangle available only in animation replay Unghiul de Morph dispnibil numai in animation replay Unknown filter Filtru necunoscut sleep available only in animation replay Pause (sleep) disponibila numai in animation replay Internal program error #12 %i Eroare interna #12 %i wait available only in animation replay Asteptare(wait) disponibil numi in animation replay No catalog file loaded Nu s-a incarcat fisierul catalog Message not found in catalog file Mesajul nu a fost gasit in fisierul catalog load available only in animation replay Incarcare (load) disponibila numai in animation replay Include level overflow Zu viele Dateien ineinander einbezogen File not found Nu s-a gasit fisierul Too many parameters Prea multi parametri Error: %s Eroare: %s Cannot create palette Nu se poate crea paleta Cannot create image Nu se poate crea imaginea Cannot create checking buffer! Nu se poate crea bufferul de control! Cannot create context Nu se poate crea contextul Cannot open animation file Nu se poate deschide fisierul cu animatii Calculation interrupted Calculare intrerupta Calculation finished Calculare terminata Tutorial files not found. Reinstall XaoS Fisierele cu tutoriale nu au fost gasite. Reinstalati XaoS Could not open examples Exemplele nu s-au putut deschide Can not create palette Nu se poate crea paleta XaoS is out of memory. XaoS nu are suficienta memorie Can not create image Nu se poate crea imaginea Can not allocate tables Nu se pot aloca tabelele Could not open image Menu Root menu Meniu principal Animation root menu Meniu principal pentru animatii Replay only commands Comenzi numai pentru redare Line drawing functions Functii pentru desenarea liniilor Line Linie Morph line Linie Morph Morph last line Ultima linie Morph Set line key Seteaza cheia liniei Clear line Sterge linia Clear all lines sterge toate liniile Animation functions Functii pentru animatii View Vedere Morph view vedere Morph Morph julia Morph Julia Move view Deplaseaza vederea Morph angle Unghiul de Morph Zoom center Centrul maririi (zoom) Zoom Marire (Zoom) Un-zoom Un-zoom Stop zooming Opreste marirea(zoom) Smooth morphing parameters Parametrul de morphing neted Timing functions Functii de timp Usleep Usleep Wait for text Asteapta textul Wait for complete image Asteapta imaginea completa Include file Include fisierul Default palette Paleta implicita Formula Formula Maximal zooming step Pasul maxim de marire (zoom) Zooming speedup Cresterea vitezei de marire (zoom) Filter Filru Letters per second Litere pe secunda Interrupt Intrerupe Status Status Ministatus Ministatus File Fisier ºfirsãt Edit Editare Fractal Fractal Calculation Calculare Filters Filtre Help Ajutor Tutorials Tutoriale Stop replay Opreste redarea Command Comanda Play string Arata sirul Clear screen Sterge ecranul Display fractal Arata fractalul Display text Arata textul Horizontal text position Pozitia textului orizontal Vertical text position Pozitia textului vertical Text position Pozitiile textului Message Mesaj Save Salveaza Record Inregistreaza Replay Reda Save image Salveaza imaginea Load random example Incarca un exemplu aleator Save configuration Salveaza configuratia Undo Refa Redo Fa inapoi Formulae Formule More formulae Alte formule User formula Alte formule User initialization Initializare Incoloring mode Mod de colorare interioara Outcoloring mode Mod de colorare exterioara Plane Plan Palette Redare (paste) Mandelbrot mode Modul Mandelbrot Julia mode Modul Julia Fast julia mode Modul Julia rapid Rotation Rotatie Set angle Seteaza unghiul Set plane Seteaza planul Inside coloring mode Modul de colorare interioara Outside coloring mode Modul de colorare exterioara Inside truecolor coloring mode Modul de colorare interioara true-color Outside truecolor coloring mode Modul de colorare exterioara true-color Julia seed Samanta (valoare initiala) Julia Random palette Paleta aleatoare Custom palette Paleta obisnuita Color cycling Ciclarea culorilor Reversed color cycling Ciclare inversata a culorilor Color cycling speed Viteza de ciclare a culorilor Shift palette Deplaseaza paleta Shift one forward Deplaseaza cu un pas inainte Shift one backward Deplaseaza cu un pas inapoi Solid guessing Solid-Guessing Disable solid guessing Dezactiveaza solid-guessing Guess 2x2 rectangles Guess 2x2 dreptunghiuri Guess 3x3 rectangles Guess 3x3 dreptunghiuri Guess 4x4 rectangles Guess 4x4 dreptunghiuri Guess 5x5 rectangles Guess 5x5 dreptunghiuri Guess 6x6 rectangles Guess 6x6 dreptunghiuri Guess 7x7 rectangles Guess 7x7 dreptunghiuri Guess 8x8 rectangles Guess 8x8 dreptunghiuri Guess unlimited rectangles Guess un numar nelimitat de dreptunghiuri Dynamic resolution Rezolutie dinamica Periodicity checking Verificarea periodicitatii Iterations Iteratii Bailout Valoare de salvare (bailout) Perturbation Perturbare Zooming speed Viteza de marire (zoom) Fixed step Pas fixat Solid guessing range Intrevalul Solid-Guessing Disable rotation Dezactiveaza rotatia Continuous rotation Rotatie continua Rotate by mouse Roteste cu mouse-ul Rotation speed Viteza de rotatie Automatic rotation Rotatie automata Fast rotation mode Modul rapid de rotatie Recalculate Recalulare Disable dynamic resolution Dezactiveaza rezolutia dinamica Use only during animation A se folosi numai in timpul animatiilor Use also for new images A se folosi si pentru imagini noi Dynamic resolution mode Modul de rezolutie dinamica Autopilot Pilot automat An introduction to fractals Fractali - O introducere XaoS features overview XaoS - Eine Übersicht Math behind fractals Matematica de la baza fractalilor Other fractal types in XaoS Alte tipuri de fractali in XaoS What's new? Ce este nou? Whole story Toata povestea Introduction Introducere Mandelbrot set Multimea Mandelbrot Julia set Multimea Julia Higher power Mandelbrots Multimi Mandelbrot de ordin superior Newton's method Metoda lui Newton Barnsley's formula Formula lui Barnsley Phoenix Phoenix Octo Octo Magnet Magnet All features Toate Features Outcoloring modes Moduri de colorare exterioara Incoloring modes Moduri de colorare interioara True-color coloring modes Moduri de colorare true-color Planes Planuri Animations and position files Fisierele de animatii si pozitie Random palettes Palete aleatoare Other noteworthy features Alte detalii (features) remarcabile The definition and fractal dimension Definitia si dimensiunea fractalului Escape time fractals Fractali escape-time Triceratops and Catseye fractals Fractalii Triceratops si Catseye (ochi de pisica) Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar si Spider Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinski Gasket, S.Carpet, Koch Snowflake (fulgul de zapada al lui Koch) What's new in 3.0? Ce este nou in versiunea 3.0? What's new in 4.0? Ce este nou in versiunea 4.0? Quit Terminare About Despre Cartesian Grid Action Text color New Open Save as PNG Render Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config Threads Hide Messages Message Font... Set Language System default Fullscreen Info on current fractal Send Feedback Get Updates User Forum Copy position URL Message Boundary trace Boundary-Trace Solid guessing 1 Solid-Guessing 1 Solid guessing Solid-Guessing Replay disabled at line %i Replay dezactivat pe linia %i Initializing Initializare Loading catalogs Cataloagele se incarca Processing command line options Se prelucreaza optiunile de la linia de comanda Enabling animation replay Se activeaza animation replay Entering calculation loop! Intrare in bucla de calcul! Calculation finished Calculare terminata Preparing first image Se pregateste prima imagine File %s loaded. S-a incarcat fisierul %s. Saving image... Imginea se salveaza... Save interrupted Salvare intrerupta File %s saved. Fisierul %s salvat. Can not open file Nu se poate deschide fisierul Recording to file %s enabled. S-a activat inregistrearea in fisierul %s unzoomed nemarit (unzoomed): zoomed marit (zoomed): framerate:%f frecventa cadrelor: %f Fractal name:%s Numele fractalului:%s Fractal type:%s Tipul fractalului:%s Mandelbrot Mandelbrot Julia Julia Formula:%s Formula: View:[%1.12f,%1.12f] Vedere:[%1.12f,%1.12f] size:[%1.12f,%1.12f] Dimensiune:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Rotatie:%4.2f Dimensiunea ecranului:%i:%i Iterations:%-4u Palette size:%i Iteratii:%-4i Dimensiunea paletei:%i {4u?} Bailout:%4.2f Valoare de salvare (bailout) Autopilot:%-4s Plane:%s Pilot automat:%-4s Plan:%s On Pornit Off Oprit incoloring:%s outcoloring:%s Culoare interioara:%s Culoare exterioara:%s zoomspeed:%f viteza de marire (zoomspeed):%f Parameter:none Parametri:nici unul Parameter:[%f,%f] Parametri:[%f,%f] Thank you for using XaoS Va multumim ca ati folosit XaoS Enabling: %s. %s se activeaza. Disabling: %s. %s se dezactiveaza. Skipping, please wait... Se omite, va rugam asteptati... Letters per second %i Litere pe secunda: %i Rotation speed:%2.2f degrees per second Viteza de rotatie:%2.2f grade pe secunda Iterations: %i Iteratii: %i Cycling speed: %i Viteaza de ciclare: %i speed:%2.2f Viteza:%2.2f Please wait while calculating %s Asteptati va rog, fractalul %s se calculeaza Welcome to XaoS version %s Bine ati venit la XaoS Versiunea %s Out of memory Memorie insuficienta Unbalanced parentheses Unknown function: %s Invalid number: %s Unknown variable: %s Invalid operator: %s Internal error occurred in formula: %s Function has incorrect parameter count: %s Empty formula XaoS must restart to change the thread count. Do you want to quit now? File %s opened. Rendering frame %i... Linking frame %i to %i... %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u XaoS must restart to change the language. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_rs.ts000066400000000000000000001310151455214672000165240ustar00rootroot00000000000000 Dialog Perturbation: Smetnja: Julia-seed: Julijino seme: Morphing type: Vrsta morfiranja: Startuptime: Vreme pokretanja: Stoptime: Vreme zaustavljanja: File to render: Datoteka za obradu: Basename: Bazno ime: Width: Širina: Height: Dužina: Pixel width (cm): Širina piksela (cm): Pixel height (cm): Visina piksela (cm): Framerate: Stopa okvira: Image type: Tip slike: Antialiasing: Niskopropusni: Always recalculate: Uvek proračunaj: Center: Centar: Radius: Radijus: Angle: Ugao: Mode: Mod: Start: Početak: End: Kraj: Color: Boja: Rotations per second: Rotacije u sekundi: Letters per second: Slova u sekundi: Iterations: Iteracije: Text: Tekst: Your command: Tvoja komanda: Filename: Ime datoteke: Formula: Formula: X center: X koordinata centra: Y center: Y koordinata centra: X Radius: X koordinata radijusa: Y Radius: Y koordinata radijusa: Coordinates: Koordinate: continuous rotation neprekidna rotacija Fast rotation Brza rotacija filter filter enable omogući Amount: Iznos: Zooming speed: Brzina povećanja: Name: Ime: Bailout: Spašavanje: Threads: Niti: Julia mode: Julijin mod: Horizontal position: Horizontalna pozicija: Vertical position: Vertikalna pozicija: Dynamic resolution: Dinamička rezolucija: Time: Vreme: Number: Broj: Algorithm number: Broj algoritma: Seed: Seme: Shift: Pomeranje: Frames per second: Okvira u sekundi: Formula Formula Initialization: Inicijalizacija: Files to render: Load Palette Config Save Palette Config Error renderanim: Height parameter must be positive integer in the range 0..4096 pokretanje animacije: Visina parametra mora biti pozitivan ceo broj u intervalu od 0 do 4096 renderanim: Invalid real width and height dimensions pokretanje animacije: Nevažeće dimenzije realne širine i visine renderanim: invalid framerate pokretanje animacije: nevažeći opseg slike renderanim: antialiasing not supported in 256 color mode pokretanje animacije: antialijasing nije podržan u 256 modu boja animateview: Invalid viewpoint izgled animacije:Nevažeći prikaz Invalid viewpoint Nevažeće gledište Unknown palette type Nepoznat tip palete Initialization of color cycling failed. Inicijalizacija ciklične boje nije uspela. Try to enable palette emulation filter Pokušajte da pokrenete paletu probnih filtera Algorithm:%i seed:%i size:%i Algoritam:%i seme:%i veličina:%i line available only in animation replay linija je moguća samo u obliku animacije Morphing non existing line! Nepostojeća linija morfinga! linekey not available in this context! verovatno nije moguće u ovom kontektstu! clear_line available only in animation replay obriši_liniju je moguće samo u obliku animacije clear_lines available only in animation replay obriši_linije je moguće samo u obliku animacije Catalog file not found Katalog nije pronađen Replay is already active Ponavljanje je već aktivno File open failed Otvaranje datoteke nije uspelo Out of memory Bez memorije Missing parameter Nedostaje parametar Unexpected end of file Neočekivani kraj datoteke Token is too long Token je predugačak Unknown formula type Nepoznat oblik formule morph available only in animation replay Morf je dostupan jedino u animiranom obliku morphview: Invalid viewpoint prikaz morfa:Nevažeće gledište move available only in animation replay pomeranje dostupno jedino u obliku animacije morphjulia available only in animation replay morf julija je dostupan jedino u obliku animacije morphangle available only in animation replay Ugao morfa je dostupan jedino u obliku animacije Unknown filter Nepoznat filter sleep available only in animation replay spavanje je moguće jedino u obliku animacije Internal program error #12 %i Interna programska greška #12 %i wait available only in animation replay sačekajte dostupno samo u obliku animacije No catalog file loaded Katalog datoteka nije učitana Message not found in catalog file Poruka nije pronađena u datoteci kataloga load available only in animation replay učitavanje je moguće jedino u vidu animiranog odgovora Include level overflow Uključi nivo preteklog File not found Datoteka nije pronađena Too many parameters Previše parametara Error: %s Greška: %s Cannot create palette Kreiranje palete nije moguće Cannot create image Kreiranje slike nije moguće Cannot create checking buffer! Kreiranje provere bafera nije moguće! Cannot create context Kreiranje kontektsta nije moguće Cannot open animation file Otvaranje datoteke sa animacijom nije moguće Calculation interrupted Prekinut proračun Calculation finished Zavšren proračun Tutorial files not found. Reinstall XaoS Uputstvo nije pronađeno. Reinstalirajte XaoS Could not open examples Otvaranje primera nije moguće Can not create palette Kreiranje palete nije moguće XaoS is out of memory. Nema dovoljno memorije za XaoS. Can not create image Kreiranje slike nije moguće Can not allocate tables Izdvajanje tabela nije moguće renderanim: Width parameter must be positive integer in the range 0..4096 Could not open image Menu Root menu Meni za koren Animation root menu Meni za animaciju korena Replay only commands Ponovi samo komande Line drawing functions Funkcija crtanja linije Line Linija Morph line Morfiraj liniju Morph last line Morfiraj poslednju liniju Set line key Postavi ključ linije Clear line Obriši liniju Clear all lines Obriši sve linije Animation functions Animacija funkcije View Prikaz Morph view Morfiraj prikaz Morph julia Julija morf Move view Pomeri prikaz Morph angle Morfiraj ugao Zoom center Uvećaj centar Zoom Povećaj Un-zoom Ne povećevaja Stop zooming Zaustavi povećavanje Smooth morphing parameters Glatkost morfing parametara Timing functions Funkcija za podešavanje vremena Usleep Uspavati Wait for text Sačekaj tekst Wait for complete image Sačekaj završavanje slike Include file Uključi datoteku Default palette Uobičajena paleta Formula Formula Maximal zooming step Maksimalan korak zumiranja Zooming speedup Ubrzanje uvećanja Filter Filter Letters per second Slova u sekundi Interrupt Prekid Status Status Ministatus Mali status File Datoteka Edit Uredi Fractal Fraktal Calculation Proračun Filters Filteri Action Akcija Help Pomoć Tutorials Uputstva Stop replay Zaustavi ponavljanje Command Komanda Play string Pusti niz Clear screen Obriši ekran Display fractal Prikaži fraktal Display text Prikaži tekst Text color Boja teksta Horizontal text position Horizontalni položaj teksta Vertical text position Vertikalna položaj teksta Text position Položaj teksta Message Poruka New Novo Open Otvori Save Sačuvaj Record Snimi Replay Ponovi Save image Sačuvaj sliku Render Vrati Load random example Učitaj nasumični primer Save configuration Sačuvaj konfiguraciju Undo Poništi Redo Ponovi predhodno Formulae Formule More formulae Više formula User formula Formula korisnika User initialization Inicijalizacija korisnika Incoloring mode Mod boje u unutrašnjosti Outcoloring mode Mod boje u spoljšnjosti Plane Ravan Palette Paleta Mandelbrot mode Mandelbrot mod Julia mode Julija mod Fast julia mode Julija brzi mod Rotation Rotacija Set angle Podesi ugao Set plane Podesi ravan Inside coloring mode Mod bojenja unutrašnjosti Outside coloring mode Mod bojenja spoljašnjosti Inside truecolor coloring mode Mod prave boje unutrašnjosti Outside truecolor coloring mode Mod prave boje spoljašnjosti Julia seed Julijino seme Random palette Nasumična paleta Custom palette Podešavanje palete Color cycling Cikličnost boje Reversed color cycling Obrnuta cikličnost boje Color cycling speed Brzina cikličnosti boje Shift palette Pomeri paletu Shift one forward Pomeri jedan napred Shift one backward Pomeri jedan nazad Solid guessing Čvrsta pretpostavka Disable solid guessing Onemogući čvrstu pretpostavku Guess 2x2 rectangles Pretpostavka 2x2 pravougaonika Guess 3x3 rectangles Pretpostavka 3x3 pravougaonika Guess 4x4 rectangles Pretpostavka za 4x4 pravougaonik Guess 5x5 rectangles Pretpostavka za 5x5 pravougaonik Guess 6x6 rectangles Pretpostavka za 6x6 pravougaonik Guess 7x7 rectangles Pretpostavka za 7x7 pravougaonik Guess 8x8 rectangles Pretpostavka za 8x8 pravougaonik Guess unlimited rectangles Pretpostavka za neograničeni pravougaonik Dynamic resolution Dinamička rezolucija Periodicity checking Provera periodičnosti Threads Niti Iterations Iteracije Bailout Spašavanje Perturbation Smetnja Zooming speed Brzina uvećanja Fixed step Utvrđeni korak Solid guessing range Rang čvrste pretpostavke Disable rotation Onemogući rotaciju Continuous rotation Kontinuirana rotacija Rotate by mouse Rotiraj uz pomoć miša Rotation speed Brzina rotacije Automatic rotation Automatska rotacija Fast rotation mode Mod brze rotacije Recalculate Preračunaj Disable dynamic resolution Onemogući dinamičku rezoluciju Use only during animation Koristi samo tokom animacije Use also for new images Koristi takođe i za nove slike Dynamic resolution mode Mod dinamičke rezolucije Autopilot Autopilot Hide Messages Sakrij poruke An introduction to fractals Uvod u fraktale XaoS features overview Pregled XaoS karakteristika Math behind fractals Matematika iza fraktala Other fractal types in XaoS Drugi tipovi fraktala u XaoS-u What's new? Šta je novo? Whole story Cela priča Introduction Uvod Mandelbrot set Mandelbrotov skup Julia set Julijin skup Higher power Mandelbrots Viši stepen Mandelbrota Newton's method Njutnov metod Barnsley's formula Barnslejova formula Phoenix Feniks Octo Okto Magnet Magnet All features Sve karakteristike Outcoloring modes Modovi boje u spoljšnjosti Incoloring modes Modovi boje u unutrašnjosti True-color coloring modes Mod bojenja prave boje Planes Ravni Animations and position files Datoteke sa animacijama i pozicijama Random palettes Nasumčne palete Other noteworthy features Druge važne karakteristike The definition and fractal dimension Definicija i dimenzija fraktala Escape time fractals Vreme izbegavanja fraktala Triceratops and Catseye fractals Triceratops i Katsaj fraktali Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manovar i Spajder Sierpinski Gasket, S.Carpet, Koch Snowflake Šerpinski trougao, S. tepih, Kohova pahuljica What's new in 3.0? Šta je novo u 3.0? What's new in 4.0? Šta je novo u 4.0? Quit Odustani Message Font... Font poruke... Set Language Podesi jezik Fullscreen Ceo ekran Send Feedback Pošalji povratnu informaciju Get Updates Ažuriranje User Forum Forum korisnika About O Cartesian Grid Save as PNG Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config System default Info on current fractal Copy position URL Message Boundary trace Granični trag Solid guessing 1 Čvrsta pretpostavka 1 Solid guessing Čvrsta pretpostavka Out of memory Nedostatak memorije Unbalanced parentheses Neuparene zagrade Unknown function: %s Nepoznata funkcija: %s Invalid number: %s Nevažeći broj: %s Unknown variable: %s Nepoznata promenljiva: %s Invalid operator: %s Nevažeći operator: %s Internal error occurred in formula: %s Došlo je do interne greške u formuli: %s Function has incorrect parameter count: %s Funkcija ima netačan broj parametara: %s Empty formula Prazna formula XaoS must restart to change the thread count. XaoS mora biti restartovan radi promene broja niti. Do you want to quit now? Da li sada želite odustati? Replay disabled at line %i Ponavljanje je onemogućeno u liniji %i Initializing Inicijalizacija Loading catalogs Učitavanje kataloga Processing command line options Opcija iz komandne linije je u procesu Enabling animation replay Omogućeno je ponavljanje animacije Entering calculation loop! Ulazak u petlju računanja! Rendering frame %i... Prikazivanje okvira %i... Linking frame %i to %i... Povezivanje okvira %i sa %i... Calculation finished Završen proračun Preparing first image Priprema prve slike File %s loaded. Datoteka %s je učitana. Saving image... Čuvanje slike... Save interrupted Sačuvaj prekinuto File %s saved. Datoteka %s je snimljena. Can not open file Datoteka se ne može otvoriti Recording to file %s enabled. Omogućeno je snimanje u datoteku %s . %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f puta (%.1fE) %2.2f slika/sek %c %i %i %i %u unzoomed bez povećanja zoomed povećano framerate:%f brzina okvira:%f Fractal name:%s Ime fraktala:%s Fractal type:%s Tip fraktala: %s Mandelbrot Mandelbrot Julia Julija Formula:%s Formula:% View:[%1.12f,%1.12f] Prikaz:[%1.12f,%1.12f] size:[%1.12f,%1.12f] veličina:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Rotacija:%4.2f Veličina ekrana:%i:%i Iterations:%-4u Palette size:%i Iteracija:%-4u Veličina palete:%i Bailout:%4.2f Spašavanje Autopilot:%-4s Plane:%s Autopilot:%-4s Ravan:%s On Uključeno Off Isključeno incoloring:%s outcoloring:%s unutrašnja boja:%s spoljašnja boja:%s zoomspeed:%f brzina povećanja Parameter:none Parametar:nema Parameter:[%f,%f] Parametar:[%f,%f] Thank you for using XaoS Hvala što koristite XaoS XaoS must restart to change the language. XaoS se mora restartovati da bi se promenio jezik. Enabling: %s. Omogućavanje: %s. Disabling: %s. Onemogućavanje: %s. Skipping, please wait... Preskakanje, molimo sačekajte... Letters per second %i Slova u sekundi %i Rotation speed:%2.2f degrees per second Brzina rotacije:%2.2f stepeni u sekundi Iterations: %i Iteracije: %i Cycling speed: %i Brzina cikličnosti: %i speed:%2.2f brzina:%2.2f Please wait while calculating %s Molimo Vas da sačekate dok se izračunava %s Welcome to XaoS version %s Dobrodošli u XaoS verziju % File %s opened. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_ru.ts000066400000000000000000001561021455214672000165320ustar00rootroot00000000000000 Dialog Perturbation: Возмущение: Julia-seed: Зерно Жюлиа: Morphing type: Тип морфинга: Startuptime: Время запуска: Stoptime: Время остановки: File to render: Файл для рендеринга: Basename: Базовое имя: Width: Ширина: Height: Высота: Framerate: Частота кадров: Image type: Тип изображения: Antialiasing: Сглаживание: Always recalculate: Всегда пересчитывать: Center: Центр: Radius: Радиус: Angle: Угол: Mode: Режим: Start: Начало: End: Конец: Color: Цвет: Rotations per second: Оборотов в секунду: Letters per second: Букв в секунду: Iterations: Итерации: Text: Текст: Your command: Ваша команда: Filename: Имя файла: Formula: Формула: X center: Центр X: Y center: Центр Y: X Radius: Радиус X: Y Radius: Радиус Y: Coordinates: Координаты: continuous rotation непрерывное вращение Fast rotation Быстрое вращение filter фильтр enable включить Amount: Количество: Zooming speed: Скорость масштабирования: Name: Имя: Bailout: Спасение: Julia mode: Режим Жюлиа: Horizontal position: Позиция по горизонтали: Vertical position: Позиция по вертикали: Dynamic resolution: Динамическое разрешение: Time: Время: Number: Число: Algorithm number: Номер алгоритма: Seed: Зерно: Shift: Сдвиг: Frames per second: Кадров в секунду: Formula Формула Initialization: Инициализация: Files to render: Pixel width (cm): Pixel height (cm): Threads: Load Palette Config Save Palette Config Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Параметр ширины должен быть положительным целым числом в диапазоне 0..4096 renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Параметр высоты должен быть положительным целым числом в диапазоне 0..4096 renderanim: Invalid real width and height dimensions renderanim: неверные реальные размеры по ширине и высоте renderanim: invalid framerate renderanim: неверная частота кадров renderanim: antialiasing not supported in 256 color mode renderanim: сглаживание не поддерживается в режиме 256 цветов animateview: Invalid viewpoint animateview: Неверная точка зрения Invalid viewpoint Неверная точка зрения Unknown palette type Неизвестный тип палитры Initialization of color cycling failed. Ошибка инициализации цвета зацикливания. Try to enable palette emulation filter Попробуйте включить фильтр эмуляции палитры Algorithm:%i seed:%i size:%i Алгоритм:%i зерно:%i размер:%i line available only in animation replay линия доступна только в анимационном воспроизведении Morphing non existing line! Морфинг несуществующей линии! linekey not available in this context! Ключ линии недоступен в этом контексте! clear_line available only in animation replay очистить_линию доступно только в анимационном воспроизведении clear_lines available only in animation replay очистить_линии доступно только в анимационном воспроизведении Catalog file not found Файл каталога не найден Replay is already active Воспроизведение уже активно File open failed Ошибка открытия файла Out of memory Не хватает памяти Missing parameter Отсутствует параметр Unexpected end of file Неожиданный конец файла Token is too long Токен слишком длинный Unknown formula type Неизвестный тип формулы morph available only in animation replay морф доступен только в анимационном воспроизведении morphview: Invalid viewpoint morphview: Неверная точка зрения move available only in animation replay перемещение доступно только в анимационном воспроизведении morphjulia available only in animation replay морф-Жюлиа доступен только в анимационном воспроизведении morphangle available only in animation replay морф-угол доступен только в анимационном воспроизведении Unknown filter Неизвестный фильтр sleep available only in animation replay сон доступен только в анимационном воспроизведении Internal program error #12 %i Внутренняя ошибка программы #12 %i wait available only in animation replay ожидание доступно только в анимационном воспроизведении No catalog file loaded Файл каталога не загружен Message not found in catalog file Сообщение не найдено в файле каталога load available only in animation replay загрузка доступна только в анимационном воспроизведении Include level overflow Включить переполнение уровня File not found Файл не найден Too many parameters Слишком много параметров Error: %s Ошибка: %s Cannot create palette Невозможно создать палитру Cannot create image Невозможно создать изображение Cannot create checking buffer! Невозможно создать контрольный буфер! Cannot create context Невозможно создать контекст Cannot open animation file Невозможно открыть файл анимации Calculation interrupted Расчёт прерван Calculation finished Расчёт закончен Tutorial files not found. Reinstall XaoS Файлы учебников не найдены. Переустановите XaoS Could not open examples Не удалось открыть примеры Can not create palette Невозможно создать палитру XaoS is out of memory. XaoS не хватает памяти. Can not create image Невозможно создать изображение Can not allocate tables Невозможно выделить таблицы Could not open image Menu Root menu Корневое меню Animation root menu Корневое меню анимации Replay only commands Воспроизведение только команд Line drawing functions Функции рисования линий Line Линия Morph line Морф-линия Morph last line Последняя морф-линия Set line key Установить ключ линии Clear line Очистить линию Clear all lines Очистить все линии Animation functions Функции анимации View Вид Morph view Морф-вид Morph julia Морф-Жюлиа Move view Переместить вид Morph angle Морф-угол Zoom center Центр масштабирования Zoom Масштаб Un-zoom Снять масштабирование Stop zooming Остановить масштабирование Smooth morphing parameters Параметры плавного морфинга Timing functions Функции тайминга Usleep Разбудить Wait for text Ожидание текста Wait for complete image Ожидание полного изображения Include file Включить файл Default palette Палитра по умолчанию Formula Формула Maximal zooming step Максимальный шаг масштабирования Zooming speedup Ускорение масштабирования Filter Фильтр Letters per second Букв в секунду Interrupt Прервать Status Cостояние Ministatus Мини-статус File Файл Edit Изменить Fractal Фрактал Calculation Калькуляция Filters Фильтры Help Справка Tutorials Учебники Stop replay Остановить воспроизведение Command Команда Play string Воспроизвести строку Clear screen Очистить экран Display fractal Отобразить фрактал Display text Показать текст Horizontal text position Позиция горизонтального текста Vertical text position Позиция вертикального текста Text position Позиция текста Message Сообщение Save Сохранить Record Записать Replay Воспроизведение Save image Сохранить изображение Load random example Загрузить случайный пример Save configuration Сохранить конфигурацию Undo Вернуть Redo Повторить Formulae Формулы More formulae Больше формул User formula Пользовательская формула User initialization Пользовательская инициализация: Incoloring mode Режим окрашивания внутри Outcoloring mode Режим окрашивания снаружи Plane Плоскость Palette Палитра Mandelbrot mode Режим Мандельброта Julia mode Режим Жюлиа Fast julia mode Быстрый режим Жюлиа Rotation Поворот Set angle Установить угол Set plane Установить плоскость Inside coloring mode Режим окрашивания внутри Outside coloring mode Режим окрашивания снаружи Inside truecolor coloring mode Режим окрашивания внутри в истинный цвет Outside truecolor coloring mode Режим окрашивания снаружи в истинный цвет Julia seed Зерно Жюлиа Random palette Случайная палитра Custom palette Пользовательская палитра Color cycling Цвет зацикливания Reversed color cycling Резервный цвет зацикливания Color cycling speed Цвет скорости зацикливания Shift palette Сдвиг палитры Shift one forward Сдвиг вперёд Shift one backward Сдвиг назад Solid guessing Угадывание сплошного Disable solid guessing Отключить угадывание сплошного Guess 2x2 rectangles Угадать 2x2 прямоугольника Guess 3x3 rectangles Угадать 3x3 прямоугольника Guess 4x4 rectangles Угадать 4x4 прямоугольника Guess 5x5 rectangles Угадать 5x5 прямоугольников Guess 6x6 rectangles Угадать 6x6 прямоугольников Guess 7x7 rectangles Угадать 7x7 прямоугольников Guess 8x8 rectangles Угадать 8x8 прямоугольников Guess unlimited rectangles Угадать безлимитные прямоугольники Dynamic resolution Динамическое разрешение Periodicity checking Периодическая проверка Iterations Итерации Bailout Спасение Perturbation Возмущение Zooming speed Скорость масштабирования Fixed step Фиксированный шаг Solid guessing range Диапазон угадывания сплошного Disable rotation Отключить вращение Continuous rotation Непрерывное вращение Rotate by mouse Вращение мышью Rotation speed Скорость вращения Automatic rotation Автоматическое вращение Fast rotation mode Режим быстрого вращения Recalculate Пересчитать Disable dynamic resolution Отключить динамическое разрешение Use only during animation Использовать только при анимации Use also for new images Использовать также для новых изображений Dynamic resolution mode Режим динамического разрешения Autopilot Автопилот An introduction to fractals Введение в фракталы XaoS features overview Обзор возможностей XaoS Math behind fractals Математика позади фракталов Other fractal types in XaoS Другие типы фракталов в XaoS What's new? Что нового? Whole story Вся история Introduction Введение Mandelbrot set Множество Мандельброта Julia set Множество Жюлиа Higher power Mandelbrots Мандельброты высшей силы Newton's method Метод Ньютона Barnsley's formula Формула Барнсли Phoenix Феникс Octo Окто Magnet Магнит All features Все возможности Outcoloring modes Режимы окрашивания снаружи Incoloring modes Режимы окрашивания внутри True-color coloring modes Режимы окрашивания в истинный цвет Planes Плоскости Animations and position files Файлы анимаций и позиций Random palettes Случайные палитры Other noteworthy features Другие заслуживающие внимания возможности The definition and fractal dimension Размер определений и фракталов Escape time fractals Фракталы побега времени Triceratops and Catseye fractals Фракталы Трицератопс и Кэтси Mandelbar, Lambda, Manowar and Spider Мандельбар, Лямбда, Мановар и Спайдер Sierpinski Gasket, S.Carpet, Koch Snowflake Уплотнение Серпинского, Ковёр Серпинского, Снежинка Коха What's new in 3.0? Что нового в 3.0? What's new in 4.0? Что нового в 4.0? Quit Выход About О программе Cartesian Grid Action Text color New Open Save as PNG Render Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config Threads Hide Messages Message Font... Set Language System default Fullscreen Info on current fractal Send Feedback Get Updates User Forum Copy position URL Message Boundary trace След границы Solid guessing 1 Угадывание сплошного 1 Solid guessing Угадывание сплошного Replay disabled at line %i Воспроизведение отключено на линии %i Initializing Инициализация Loading catalogs Загрузка каталогов Processing command line options Обработка параметров командной строки Enabling animation replay Включение анимационного воспроизведения Entering calculation loop! Вход в цикл расчёта! Calculation finished Расчёт закончен Preparing first image Подготовка первого изображения File %s loaded. Файл %s загружен. Saving image... Сохранение изображения... Save interrupted Сохранение прервано File %s saved. Файл %s сохранён. Can not open file Невозможно открыть файл Recording to file %s enabled. Запись в файл %s включена. unzoomed не масштабировано zoomed масштабировано framerate:%f частота кадров: %f Fractal name:%s Имя фрактала:%s Fractal type:%s Тип фрактала:%s Mandelbrot Мандельброт Julia Жюлиа Formula:%s Формула:%s View:[%1.12f,%1.12f] Вид:[%1.12f,%1.12f] size:[%1.12f,%1.12f] размер:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Поворот:%4.2f Размер экрана:%i:%i Iterations:%-4u Palette size:%i Итерации:%-4i Размер палитры:%i {4u?} Bailout:%4.2f Спасение Autopilot:%-4s Plane:%s Автопилот:%-4s Плоскость:%s On Вкл Off Выкл incoloring:%s outcoloring:%s окрашивание внутри:%s окрашивание снаружи:%s zoomspeed:%f скорость масштабирования:%f Parameter:none Параметр:пусто Parameter:[%f,%f] Параметр:[%f,%f] Thank you for using XaoS Спасибо за использование XaoS Enabling: %s. Включение: %s. Disabling: %s. Отключение: %s. Skipping, please wait... Пропускание, пожалуйста, подождите... Letters per second %i Букв в секунду %i Rotation speed:%2.2f degrees per second Скорость вращения: %2.2f градусов в секунду Iterations: %i Итерации: %i Cycling speed: %i Скорость зацикливания: %i speed:%2.2f скорость:%2.2f Please wait while calculating %s Пожалуйста, подождите пока идёт расчёт %s Welcome to XaoS version %s Добро пожаловать в XaoS версии %s Out of memory Не хватает памяти Unbalanced parentheses Unknown function: %s Invalid number: %s Unknown variable: %s Invalid operator: %s Internal error occurred in formula: %s Function has incorrect parameter count: %s Empty formula XaoS must restart to change the thread count. Do you want to quit now? File %s opened. Rendering frame %i... Linking frame %i to %i... %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u XaoS must restart to change the language. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_sk.ts000066400000000000000000001266001455214672000165210ustar00rootroot00000000000000 Dialog Perturbation: Julia-seed: Morphing type: Startuptime: Stoptime: Files to render: Basename: Width: Height: Pixel width (cm): Pixel height (cm): Framerate: Image type: Antialiasing: Always recalculate: Center: Radius: Angle: Mode: Start: End: Color: Rotations per second: Letters per second: Iterations: Text: Your command: Filename: Formula: X center: Y center: X Radius: Y Radius: Coordinates: continuous rotation Fast rotation filter enable Amount: Zooming speed: Name: Bailout: Threads: Julia mode: Horizontal position: Vertical position: Dynamic resolution: Time: Number: Algorithm number: Seed: Shift: Load Palette Config Save Palette Config Frames per second: Formula Initialization: Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Invalid real width and height dimensions renderanim: invalid framerate renderanim: antialiasing not supported in 256 color mode animateview: Invalid viewpoint Invalid viewpoint Unknown palette type Initialization of color cycling failed. Try to enable palette emulation filter Algorithm:%i seed:%i size:%i line available only in animation replay Morphing non existing line! linekey not available in this context! clear_line available only in animation replay clear_lines available only in animation replay Catalog file not found Replay is already active File open failed Out of memory Missing parameter Unexpected end of file Token is too long Unknown formula type morph available only in animation replay morphview: Invalid viewpoint move available only in animation replay morphjulia available only in animation replay morphangle available only in animation replay Unknown filter sleep available only in animation replay Internal program error #12 %i wait available only in animation replay No catalog file loaded Message not found in catalog file load available only in animation replay Include level overflow File not found Too many parameters Error: %s Cannot create palette Cannot create image Cannot create checking buffer! Cannot create context Cannot open animation file Calculation interrupted Calculation finished Tutorial files not found. Reinstall XaoS Could not open examples Could not open image Can not create palette XaoS is out of memory. Can not create image Can not allocate tables Menu Root menu Animation root menu Replay only commands Line drawing functions Line Morph line Morph last line Set line key Clear line Clear all lines Animation functions View Morph view Morph julia Move view Morph angle Zoom center Zoom Un-zoom Stop zooming Smooth morphing parameters Timing functions Usleep Wait for text Wait for complete image Include file Default palette Formula Maximal zooming step Zooming speedup Filter Letters per second Interrupt Status Ministatus Cartesian Grid File Edit Fractal Calculation Filters Action Help Tutorials Stop replay Command Play string Clear screen Display fractal Display text Text color Horizontal text position Vertical text position Text position Message New Open Save Save as PNG Record Replay Render Render Image Load random example Save configuration Undo Redo Formulae More formulae User formula User initialization Incoloring mode Outcoloring mode Plane Palette Mandelbrot mode Julia mode Fast julia mode Rotation Set angle Set plane Inside coloring mode Outside coloring mode Inside truecolor coloring mode Outside truecolor coloring mode Julia seed Random palette Custom palette Palette Colors Palette Editor Load Palette Config Save Palette Config Color cycling Reversed color cycling Color cycling speed Shift palette Shift one forward Shift one backward Solid guessing Disable solid guessing Guess 2x2 rectangles Guess 3x3 rectangles Guess 4x4 rectangles Guess 5x5 rectangles Guess 6x6 rectangles Guess 7x7 rectangles Guess 8x8 rectangles Guess unlimited rectangles Dynamic resolution Periodicity checking Threads Iterations Bailout Perturbation Zooming speed Fixed step Solid guessing range Disable rotation Continuous rotation Rotate by mouse Rotation speed Automatic rotation Fast rotation mode Recalculate Disable dynamic resolution Use only during animation Use also for new images Dynamic resolution mode Autopilot Hide Messages An introduction to fractals XaoS features overview Math behind fractals Other fractal types in XaoS What's new? Whole story Introduction Mandelbrot set Julia set Higher power Mandelbrots Newton's method Barnsley's formula Phoenix Octo Magnet All features Outcoloring modes Incoloring modes True-color coloring modes Planes Animations and position files Random palettes Other noteworthy features The definition and fractal dimension Escape time fractals Triceratops and Catseye fractals Mandelbar, Lambda, Manowar and Spider Sierpinski Gasket, S.Carpet, Koch Snowflake What's new in 3.0? What's new in 4.0? About Quit Message Font... Set Language System default Fullscreen Info on current fractal Send Feedback Get Updates User Forum Copy position URL Message Boundary trace Solid guessing 1 Solid guessing Out of memory Unbalanced parentheses Unknown function: %s Invalid number: %s Unknown variable: %s Invalid operator: %s Internal error occurred in formula: %s Function has incorrect parameter count: %s Empty formula XaoS must restart to change the thread count. Do you want to quit now? File %s opened. File %s saved. Replay disabled at line %i Initializing Loading catalogs Processing command line options Enabling animation replay Entering calculation loop! Rendering frame %i... Linking frame %i to %i... Calculation finished Preparing first image File %s loaded. Saving image... Save interrupted Can not open file Recording to file %s enabled. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u unzoomed zoomed framerate:%f Fractal name:%s Fractal type:%s Mandelbrot Julia Formula:%s View:[%1.12f,%1.12f] size:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Iterations:%-4u Palette size:%i Bailout:%4.2f Autopilot:%-4s Plane:%s On Off incoloring:%s outcoloring:%s zoomspeed:%f Parameter:none Parameter:[%f,%f] Thank you for using XaoS XaoS must restart to change the language. Enabling: %s. Disabling: %s. Skipping, please wait... Letters per second %i Rotation speed:%2.2f degrees per second Iterations: %i Cycling speed: %i speed:%2.2f Please wait while calculating %s Welcome to XaoS version %s Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_sv.ts000066400000000000000000001303571455214672000165400ustar00rootroot00000000000000 Dialog Perturbation: Störning (pertuation): Julia-seed: Julia startpunkt: Morphing type: Morphningstyp: Startuptime: Starttid: Stoptime: Sluttid: Sluttid: File to render: Fil att rendera: Basename: Basnamn (namnmall): Width: Bredd: Height: Höjd: Pixel width (cm): Pixelbredd (cm): Pixel height (cm): Pixelhöjd (cm): Framerate: Framerate: Image type: Bildtyp: Antialiasing: Antialiasing: Always recalculate: Beräkna om alltid: Center: Centrum: Radius: Radie: Angle: Vinkel: Mode: Läge: Start: Start: End: Slut: Color: Färg: Rotations per second: Rotationer per sekund: Letters per second: Bokstäver per sekund: Iterations: Iterationer: Text: Text: Your command: Ditt kommando: Filename: Filnamn: Formula: Formel: X center: X-centrum: Y center: Y-centrum: X Radius: X-radie: Y Radius: Y-radie: Coordinates: Koordinater: continuous rotation kontinuerlig rotation Fast rotation Snabb rotation filter filter enable aktivera Amount: Antal (amount): Zooming speed: Zoomhastighet: Name: Namn: Bailout: Maxgräns (bailout): Threads: Trådar: Julia mode: Julialäge (mode): Horizontal position: Horisontell position: Vertical position: Vertikal position: Dynamic resolution: Dynamisk upplösning: Time: Tid: Number: Antal (number): Algorithm number: Algoritmnummer: Seed: Seed: Shift: Shift: Frames per second: Bildhastighet (frames per second): Formula Formel Initialization: Initialisering: Files to render: Load Palette Config Save Palette Config Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Breddparametern måste vara ett positivt heltal (0-4096) renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Höjdparametern måste vara ett positivt heltal (0-4096) renderanim: Invalid real width and height dimensions renderanim: Ogiltiga verkliga bredd- och höjddimensioner renderanim: invalid framerate renderanim: ogiltig bildhastighet (framerate) renderanim: antialiasing not supported in 256 color mode renderanim: antialiasing stöds ej i 256-färgsläge animateview: Invalid viewpoint animateview: Ogiltig vy (viewpoint) Invalid viewpoint Ogiltig vy (viewpoint) Unknown palette type Okänd typ av palett Initialization of color cycling failed. Initialisering av färgcykling misslyckades. Try to enable palette emulation filter Försök att aktivera palettemuleringsfilter Algorithm:%i seed:%i size:%i Algoritm: %i seed: %i storlek: %i line available only in animation replay raden bara tillgänglig under uppspelning Morphing non existing line! Morphar ej existerande rad! linekey not available in this context! linjenyckel är inte tillgänglig i detta sammanhang! clear_line available only in animation replay Rensa rad bara tillgänglig under uppspelning clear_lines available only in animation replay Rensa alla rader bara tillgänglig under uppspelning Catalog file not found Katalogfil ej hittad Replay is already active Repetition är redan aktiverat File open failed Filen kunde inte öppnas Out of memory Minnet är slut Missing parameter Parameter saknas Unexpected end of file Oväntat radslut Token is too long För långt värde (token) Unknown formula type Okänd formeltyp morph available only in animation replay morph tillgänglig endast under uppspelning morphview: Invalid viewpoint morphview: Ogiltig vy (viewpoint) move available only in animation replay Det går bara att flytta under uppspelning morphjulia available only in animation replay morphjulia tillgänglig bara under uppspelning morphangle available only in animation replay morphangle tillgänglig bara under uppspelning Unknown filter Okänt filter sleep available only in animation replay viloläge tillgänglig bara under uppspelning Internal program error #12 %i Internt programfel #12 %i wait available only in animation replay vänteläge tillgänglig bara under uppspelning No catalog file loaded Ingen katalogfil inläst Message not found in catalog file Meddelande inte hittat i katalogfilen load available only in animation replay ladda tillgänglig bara under uppspelning Include level overflow Inkludera nivåöverflöd File not found Filen ej hittad Too many parameters För många parametrar Error: %s Fel: %s Cannot create palette Kan inte skapa palett Cannot create image Kan inte skapa bild Cannot create checking buffer! Kan inte skapa kontrollbuffert! Cannot create context Kan inte skapa miljö (context) Cannot open animation file Kan inte öppna animeringsfil Calculation interrupted Beräkningen avbruten Calculation finished Beräkningen färdig Tutorial files not found. Reinstall XaoS Handledningsfiler ej funna, ominstallera Xaos Could not open examples Kunde inte öppna exempel Can not create palette Kan inte skapa palett XaoS is out of memory. Xaos har slut på minne. Can not create image Kan inte skapa bild Can not allocate tables Kan inte allokera tabeller Could not open image Menu Root menu Bestämd/obestämd? Rotmeny Animation root menu Animeringsmeny Replay only commands Kommandon giltiga för uppspelning Line drawing functions Linjeritarfunktioner Line Rad Morph line Morpha rad Morph last line Morpha förra linjen Set line key Bestäm radnyckel Clear line Radera rad Clear all lines Radera alla rader Animation functions Animeringar View Visa Morph view Morpha vy Morph julia Morpha Juliafraktal Move view Byt vy Morph angle Morpha vinkel Zoom center Zooma centrum Zoom Zooma Un-zoom Zooma ut Stop zooming Sluta zooma Smooth morphing parameters Jämna ut morphparametrar Timing functions Tidtagningsfunktioner Usleep Usleep Wait for text Vänta på text Wait for complete image Vänta på fullständig bild Include file Inkludera fil Default palette Standardpalett Formula Formel Maximal zooming step Maximalt zoomsteg Zooming speedup Zoomacceleration (zoom speedup) Filter Filter Letters per second Bokstäver per sekund Interrupt Avbrott (interrupt) Status Status Ministatus Ministatus File Arkiv Edit Redigera Fractal Fraktaler Calculation Beräkningar Filters Filter Action Text och kommandon Help Hjälp Tutorials Handledningar Stop replay Avsluta repetition Command Kommando Play string Spela textsträng Clear screen Rensa skärm Display fractal Visa fraktal Display text Visa text Text color Textfärg Horizontal text position Horisontell textposition Vertical text position Vertikal textposition Text position Textposition Message Meddelande New Nytt Open Öppna Save Spara Record Spela in Replay Uppspelning Save image Spara bild Render Rendera Load random example Läs in slumpmässigt exempel Save configuration Spara konfiguration Undo Ångra Redo Upprepa Formulae Formler More formulae Mer formler User formula Användarformler User initialization Användarinitialisering Incoloring mode Infärgningsläge Outcoloring mode Utfärgningsläge Plane Plan Palette Palett Mandelbrot mode Mandelbrotläge Julia mode Julialäge Fast julia mode Snabbt Julialäge Rotation Rotation Set angle Ange vinkel Set plane Ange plan Inside coloring mode Insides färgläge Outside coloring mode Utsides färgläge Inside truecolor coloring mode Insides "truecolor" färgläge Outside truecolor coloring mode Utsides "truecolor" färgläge Julia seed Julia seed Random palette Slumpvis palett Custom palette Egen palett Color cycling Färgcykling Reversed color cycling Omvänd färgcykling Color cycling speed Färgcyklingshastighet Shift palette Skifta palett Shift one forward Skifta en framåt Shift one backward Skifta en bakåt Solid guessing Gissa block Disable solid guessing Stäng av blockgissning Guess 2x2 rectangles Gissa 2x2 kvadrater Guess 3x3 rectangles Gissa 3x3 kvadrater Guess 4x4 rectangles Gissa 4x4 kvadrater Guess 5x5 rectangles Gissa 5x5 kvadrater Guess 6x6 rectangles Gissa 6x6 kvadrater Guess 7x7 rectangles Gissa 7x7 kvadrater Guess 8x8 rectangles Gissa 8x8 kvadrater Guess unlimited rectangles Gissa obegränsade områden Dynamic resolution Dynamisk upplösning Periodicity checking Periodicitetskontroll Threads Trådar Iterations Itereringar Bailout Maxgräns (bailout) Perturbation Störning (pertubation) Zooming speed Zoomhastighet Fixed step Fast steg Solid guessing range Blockgissningsområde Disable rotation Stäng av rotation Continuous rotation Kontinuerlig rotation Rotate by mouse Rotera med mus Rotation speed Rotationshastighet Automatic rotation Automatisk rotation Fast rotation mode Snabbt rotationsläge Recalculate Beräkna om Disable dynamic resolution Stäng av dynamisk upplösning Use only during animation Använd bara under animering Use also for new images Använd även för nya bilder Dynamic resolution mode Dynamiskt upplösningsläge Autopilot Autopilot Hide Messages Dölj meddelanden An introduction to fractals En introduktion till fraktaler XaoS features overview Översikt över funktioner i Xaos Math behind fractals Matematiken bakom fraktalerna Other fractal types in XaoS Andra fraktaltyper i Xaos What's new? Vad är nytt? Whole story Hela berättelsen Introduction Introduktion Mandelbrot set Mandelbrotmängden Julia set Juliamängden Higher power Mandelbrots Mandelbrot med högre grad Newton's method Newtons metod Barnsley's formula Barnsleys formel Phoenix Fenix (Phoenix) Octo Octo Magnet Magnet All features Alla funktioner Outcoloring modes Utfärgningslägen Incoloring modes Infärgningslägen True-color coloring modes "True-color"-färglägen Planes Plan Animations and position files Animeringar och postitionsfiler Random palettes Slumpmässiga paletter Other noteworthy features Andra funktioner värda att notera The definition and fractal dimension Definition av fraktal dimension Escape time fractals Fraktal med flykttid (escape time) Triceratops and Catseye fractals Triceratops- och Catseyefraktaler Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar och Spider Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinski Gasket, S.Carpet och Koch Snöflinga What's new in 3.0? Vad är nytt i version 3.0? What's new in 4.0? Vad är nytt i version 4.0? Quit Avsluta Message Font... Typsnitt för meddelanden... Fullscreen Helskärmsläge Send Feedback Skicka feedback Get Updates Leta efter uppdateringar User Forum Användarforum About Om Cartesian Grid Save as PNG Render Image Palette Colors Palette Editor Load Palette Config Save Palette Config Set Language System default Info on current fractal Copy position URL Message Boundary trace Följ gränslinjen Solid guessing 1 Gissa block 1 Solid guessing Gissa block Out of memory Slut på minne Unbalanced parentheses Slut på minne Obalanserade parametrar Unknown function: %s Okänd funktion: %s Invalid number: %s Ogiltigt värde: %s Unknown variable: %s Okänd variabel: %s Invalid operator: %s Ogiltig operator: %s Internal error occurred in formula: %s Ett internt fel inträffade i formel: %s Function has incorrect parameter count: %s Funktionen har ett felaktigt antal parametrar: %s Empty formula Tom formel XaoS must restart to change the thread count. Xaos behöver starta om för att ändra antalet trådar. Do you want to quit now? Vill du avsluta nu? Replay disabled at line %i Uppspelning avbruten vid rad %i Initializing Initialiserar Loading catalogs Laddar kataloger Processing command line options Behandlar kommandoradsparametrar Enabling animation replay Spelar upp Entering calculation loop! Går in i beräkningsloopen! Rendering frame %i... Renderar bildruta %i... Linking frame %i to %i... Länkar bildruta %i med %i... Calculation finished Beräkningen klar Preparing first image Förereder första bilden File %s loaded. Filen %s inläst. Saving image... Sparar bild... Save interrupted Det gick inte att spara filen File %s saved. Filen %s har sparats. Can not open file Kan inte öppna filen Recording to file %s enabled. Inspelning till fil %s aktiverad. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f gånger (%.1fE) %2.2f bildrutor/s %c %i %i %i %u unzoomed ej zoomad zoomed zoomad framerate:%f framerate: %f Fractal name:%s Namn på fraktal: %s Fractal type:%s Typ av fraktal: %s Mandelbrot Mandelbrot Mandelbrot Julia Julia Formula:%s Formel: %s View:[%1.12f,%1.12f] Vy: [%1.12f, %1.12f] size:[%1.12f,%1.12f] Storlek: [%1.12f, %1.12f] Rotation:%4.2f Screen size:%i:%i Rotation:%4.2f Skärmstorlek:%i:%i Iterations:%-4u Palette size:%i Itereringar:%-4u Palette storlekar:%i Bailout:%4.2f Maxgräns (bailout) Autopilot:%-4s Plane:%s Autopilot:%-4s Plan:%s On Off Av incoloring:%s outcoloring:%s infärgning: %s utfärgning: %s zoomspeed:%f zoomhastighet: %f Parameter:none Parameter: ingen Parameter:[%f,%f] Parameter: [%f, %f] Thank you for using XaoS Tack för att du använder Xaos Enabling: %s. Aktiverar: %s. Disabling: %s. Deaktiverar: %s. Skipping, please wait... Hoppar, var god vänta... Letters per second %i Bokstäver per sekund: %i Rotation speed:%2.2f degrees per second Rotationshastighet: %2.2f grader per sekund Iterations: %i Itereringar: %i Cycling speed: %i Färgcyklingshastighet: %i speed:%2.2f hastighet: %2.2f Please wait while calculating %s Vänligen vänta under beräkningen av %s Welcome to XaoS version %s Välkommen till Xaos version %s File %s opened. XaoS must restart to change the language. Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/XaoS_tr.ts000066400000000000000000002205311455214672000165270ustar00rootroot00000000000000 Dialog Perturbation: Pertürbasyon: Julia-seed: Julia başlangıç değeri: Morphing type: Biçimlendirme: Startuptime: Başlangıç Süresi: Stoptime: Bitiş Süresi: Files to render: Oluşturma dosyası: Basename: Komut: Width: Genişlik: Height: Yükseklik: Pixel width (cm): Piksel genişliği (cm): Pixel height (cm): Piksel yüksekliği (cm): Framerate: Karesayısı: Image type: Resim türü: Antialiasing: Anti-aliasing (farklı tonlardaki piksellere geçiş): Always recalculate: Her zaman yeniden hesapla: Center: Merkez: Radius: Yarıçap: Angle: Açı: Mode: Mod: Start: Başlangıç: End: Bitiş: Color: Renk: Rotations per second: Birimdeki dönme sayısı: Letters per second: Birimdeki harf sayısı: Iterations: İterasyon: Text: Metin: Your command: Komutunuz: Filename: Dosya adı: Formula: Formül: X center: X merkezi: Y center: Y merkezi: X Radius: X Yarıçapı: Y Radius: Y yapıçapı: Coordinates: Koordinatlar: continuous rotation Sürekli dön Fast rotation Hızlı dön filter Filtre enable Erişime aç Amount: Miktar: Zooming speed: Yakınlaştırma hızı: Name: İsim: Bailout: Döngüden çık: Threads: İş parçacığı: Julia mode: Julia tipi: Horizontal position: Yatay konum: Vertical position: Dikay konum: Dynamic resolution: Dinamik çözünürlük: Time: Zaman: Number: Sayı: Algorithm number: Algoritma Sayısı: Seed: Başlangıç değeri: Shift: Değiştirme: Load Palette Config Palet yapılandırmasını yükle Save Palette Config Palet yapılandırmasını kaydet Frames per second: Saniyedeki kare sayısı: Formula Formül Initialization: Başlangıç durumuna dönme: Error renderanim: Width parameter must be positive integer in the range 0..4096 Ekrandaki mevcut animasyon görüntüsü: Genişlik parametresi 0..4096 aralığında pozitif tamsayı olmalıdır renderanim: Height parameter must be positive integer in the range 0..4096 Ekrandaki mevcut animasyon görüntüsü: Yükseklik parametresi 0..4096 aralığında pozitif tamsayı olmalıdır renderanim: Invalid real width and height dimensions Ekrandaki mevcut animasyon görüntüsü: Genişlik ve yükseklik için geçersiz boyutlar renderanim: invalid framerate Ekrandaki mevcut animasyon görüntüsü: Geçersiz karehızı renderanim: antialiasing not supported in 256 color mode Ekrandaki mevcut animasyon görüntüsü: Kenar yumusatma 256 renk modunda desteklenmiyor animateview: Invalid viewpoint Animasyon görüş alanı: Geçersiz bakış açısı Invalid viewpoint Geçersiz bakış açısı Unknown palette type Geçersiz palet türü Initialization of color cycling failed. Renk döngüsünü başlatmak başarısız. Try to enable palette emulation filter Renk paleti emülsiyonfiltresini etkinleştirmeyi deneyiniz Algorithm:%i seed:%i size:%i Algoritma:%i Başlangıç değeri:%i boyut:%i line available only in animation replay Satır sadece animasyon tekrar başlatıldğında aktif Morphing non existing line! Var olmayan doğruyu biçimlendir! linekey not available in this context! Satır anahtarı içerikte bulunmuyor! clear_line available only in animation replay Satır_temizleme sadece animasyon tekrar başlatıldğında aktif clear_lines available only in animation replay Satır_temizlemeler sadece animasyon tekrar başlatıldğında aktif Catalog file not found Katalog dosyası bulunamadı Replay is already active Tekrar başlatma daha önce aktive edildi File open failed Dosya açma başarısız Out of memory Yetersiz bellek Missing parameter Eksik parametre Unexpected end of file Beklenmeyen dosya sonu Token is too long Simge çok uzun Unknown formula type Bilinmeyen formül türü morph available only in animation replay Biçimlendirme yalnızca animasyon tekrarlanırken kullanılabilir morphview: Invalid viewpoint Biçimlendirme görünümü geçersiz bakış açısı ya da duruma göre perspektif move available only in animation replay hareket yalnızca animasyon tekrarında kullanılabilir morphjulia available only in animation replay Julia biçimi sadece animasyon tekrarında kullanılabilir morphangle available only in animation replay Biçimlendirme açısı yalnızca animasyon tekrarında kullanılabilir Unknown filter Bilinmeyen filtre sleep available only in animation replay Uyku sadece animasyon ekranında mevcut Internal program error #12 %i Dahili programlama hatası %i 12 wait available only in animation replay Bekleme sadece animasyon tekrar başlatıldığında aktif No catalog file loaded Katalog dosyası yüklenmedi Message not found in catalog file Katalog listesinde mesaj bulunamadı load available only in animation replay Yükleme animasyon tekrar başlatıldğında aktif Include level overflow Taşma hatası içerir File not found Dosya bulunamadı Too many parameters Çok fazla parametre Error: %s Hata:%i Cannot create palette Palet oluşturulamıyor Cannot create image Görsel açılamıyor Cannot create checking buffer! Kontrol belleği oluşturulamıyor! Cannot create context İçerik açılamıyor Cannot open animation file Animasyon dosyası açılamıyor Calculation interrupted Hesaplama kesintiye uğradı Calculation finished Hesaplama tamamlandı Tutorial files not found. Reinstall XaoS Öğretim dosyaları bulunamadı. Xaos’u yeniden başlatın Could not open examples Örnekler açılamadı Could not open image Görsel açılamadı Can not create palette Palet oluşturulamıyor XaoS is out of memory. Yetersiz bellek. Can not create image Görsel oluşturulamıyor Can not allocate tables Tablolar oluşturulamıyor Menu Root menu Ana menü Animation root menu Animasyon ana menüsü Replay only commands Sadece komutları yeniden oynat Line drawing functions Doğru çizme fonksiyonu Line Doğru Morph line Biçimlendirilmiş doğru Morph last line Son doğruyu biçimlendir Set line key Doğru anahtarını belirle Clear line Doğruyu temizle Clear all lines Tüm doğruları temizle Animation functions Animasyon fonksiyonları View Görüntü Morph view Biçimlenmiş görünüm Morph julia Biçimlendirilmiş Julia kümesi Move view Görüntü taşıma Morph angle Biçimlendirilmiş açı Zoom center Yakınlaştırma merkezi Zoom Yakınlaştır Un-zoom Yakınlaştırmayı geri al Stop zooming Yakınlaştırmayı durdur Smooth morphing parameters Düzenli geçiş parametreleri Timing functions Zamanlama fonksiyonları Usleep Programı duraklat Wait for text Metin için bekle Wait for complete image Resmin tamamlanması için bekle Include file Dosya dahil et Default palette Varsayılan renk levhası Formula Formül Maximal zooming step Maksimum yakınlaştırma işlemi Zooming speedup Yakınlaştırmayı hızlandır Filter Filtre Letters per second Saniyedeki simge sayısı Interrupt Duraklama Status Durum Ministatus Mini durum bildirimi Cartesian Grid Koordinat düzlemi File Dosya Edit Düzenle Fractal Fraktal Calculation Hesaplama Filters Filtreler Action Eylem Help Yardım Tutorials Öğretim videoları Stop replay Tekrar oynatmayı durdur Command Komut Play string Fraktal dizeyi çalıştır Clear screen Ekranı temizle Display fractal Fraktalı gizle Display text Metni gizle Text color Metin rengi Horizontal text position Yatay metin konumu Vertical text position Dikey metin konumu Text position Metin konumu Message Mesaj New Yeni Open Save Kaydet Save as Farklı kaydet PNG PNG Record Kayıt al Replay Tekrar oynat Render Oluşturma Render Image Oluşturma resmi Load random example Rastgele örnek yükle Save configuration Yapılandırmayı kaydet Undo Geri Redo Yenile Copy position URL Formulae Formüller More formulae Daha fazla formül User formula Kullaıcı formülleri User initialization Kullanıcı başlatma Incoloring mode Renklendirme modu Outcoloring mode Dış renklendirme modu Plane Düzlem Palette Palet Mandelbrot mode Mandelbrot kümesi oluşturma modu Julia mode Julia kümesi oluşturma modu Fast julia mode Hızlı Julia kümesi oluşturma modu Rotation Dönme Set angle Açıyı ayarla Set plane Düzlemi ayarla Inside coloring mode 8 bit derinliğe sahip iç renklendirme modu Outside coloring mode 8 bit derinliğe sahip dış renklendirme modu Inside truecolor coloring mode 24 bit derinliğe sahip iç rengi seçme modu Outside truecolor coloring mode 24 bit derinliğe sahip dış rengi seçme modu Julia seed Julia başlangıç değeri Random palette Rastgele palet Custom palette Özel palet Palette Colors Palet renkleri Palette Editor Palet düzenleyici Load Palette Config Palet yapılandırmasını yükle Save Palette Config Palet yapılandırmasını kaydet Color cycling Renk döngüsü Reversed color cycling Ters renk döngüsü Color cycling speed Renk döngüsü hızı Shift palette Rengi değiştir Shift one forward Bir adım öne al Shift one backward Bir adım geriye al Solid guessing Fraktal oluşturma Disable solid guessing Tahmin etmeyi devre dışı bırak Guess 2x2 rectangles 2x2 birimkarelik dikdörtgeni tahmin et Guess 3x3 rectangles 3x3 birimkarelik dikdörtgeni tahmin et Guess 4x4 rectangles 4x4 birimkarelik dikdörtgeni tahmin et Guess 5x5 rectangles 5xx5 birimkarelik dikdörtgeni tahmin et Guess 6x6 rectangles 6x6 birimkarelik dikdörtgeni tahmin et Guess 7x7 rectangles 7x7 birimkarelik dikdörtgeni tahmin et Guess 8x8 rectangles 8x8 birimkarelik dikdörtgeni tahmin et Guess unlimited rectangles Sınırsız dikdörtgeni tahmin et Dynamic resolution Dinamik çözünürlük Periodicity checking Periyodik örüntü kontrolü Threads İş paketleri Iterations Yinelemeler Bailout Yinelemeden kaçış Perturbation Pertürbasyon Zooming speed Yakınlaştırma hızı Fixed step Sabit adım aralığı Solid guessing range Tahmin aralığı Disable rotation Döndürmeyi devre dışı bırak Continuous rotation Sürekli döndür Rotate by mouse Fare imleci ile döndür Rotation speed Döndürme hızı Automatic rotation Otomatik döndür Fast rotation mode Hızlı dönme modu Recalculate Tekrar hesapla Disable dynamic resolution Dinamik çözünürlüğü devre dışı bırak Use only during animation Sadece animasyon esnasında kullan Use also for new images Sadece yeni resimler için kullan Dynamic resolution mode Dinamik çözünürlük modu Autopilot Oto-pilot modu Hide Messages Mesajları gizle An introduction to fractals Fraktallara giriş XaoS features overview XaoS özelliklerine bakış Math behind fractals Fraktalların ardındaki matematik Other fractal types in XaoS XaoS için diğer fraktal türleri What's new? Güncellemeler neler? Whole story Tüm hikaye Introduction Giriş Mandelbrot set Mandelbrot kümesi Julia set Julia kümesi Higher power Mandelbrots Daha yüksek güçlü Mandebrotlar Newton's method Newton’un yöntemi Barnsley's formula Barnsley'in yöntemi Phoenix Phoenix Octo Octo Magnet Magnet All features Tüm özellikler Outcoloring modes Dış renklendirme modları Incoloring modes İç renklendirme modları True-color coloring modes Gerçek-renkli renklendirme modları Planes Düzlemler Animations and position files Animasyon ve pozisyon dosyaları Random palettes Rastgele paletler Other noteworthy features Diğer önemli özellikler The definition and fractal dimension Tanım ve fraktal boyutu Escape time fractals Kaçış zamanı fraktalları Triceratops and Catseye fractals Triceratops ve Catseye fraktalları Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar ve Spider Kümeleri Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinski Üçgeni, S. Halısı, Koch Kar Tanesi What's new in 3.0? 3.0’da neler var? What's new in 4.0? 4.0’da neler var? About Hakkında Quit Çıkış Message Font... Mesaj yazı tipi... Set Language Dili ayarla System default Varsayılan ayarlar Fullscreen Tam ekran Info on current fractal Ekrandaki fraktal hakkında bilgi Send Feedback Geri bildirim gönder Get Updates Güncellemeleri al User Forum Kullanıcı Forumu Message Boundary trace Sınır yüzeyi Solid guessing 1 Tahmin et 1 Solid guessing Tahmin et Out of memory Yetersiz bellek Unbalanced parentheses Parantez hatası Unknown function: %s Bilinmeyen fonksiyon: %s Invalid number: %s Geçersiz sayı: %s Unknown variable: %s Bilinmeyen değişken: %s Invalid operator: %s Geçersiz işlem: %s Internal error occurred in formula: %s Formül içinde hata oluştur: %s Function has incorrect parameter count: %s Fonksiyonda geçersiz parametre sayısı var: %s Empty formula Boş formül XaoS must restart to change the thread count. İşlemin değiştirilmesi için XaoS yeniden başlatılmalı. Do you want to quit now? Çıkmak istediğinizden emin misiniz? File %s opened. %ler dosyası yüklendi. File %s saved. %ler dosyası kaydedildi. Replay disabled at line %i Tekrar oynatma %i satırında devre dışı bırakıldı Initializing Başlatılıyor Loading catalogs Kataloglar yükleniyor Processing command line options Komut satırı seçenekleri işleniyor Enabling animation replay Animasyonu tekrar oynatmayı etkinleştiriliyor Entering calculation loop! Hesaplama döngüsü giriliyor! Rendering frame %i... Oluşturma kareleri %ileri... Linking frame %i to %i... %i çerçevesi %i’yle eşleştiriliyor... Calculation finished Hesaplama tamamlandı Preparing first image İlk görsel hazırlanıyor File %s loaded. %s dosyası yüklendi. Saving image... Resim kaydediliyor… Save interrupted Kaydetme duraklatıldı Can not open file Dosya açılamıyor Clipboard set to %s. Recording to file %s enabled. %s dosyasına kayıt etkinleştirildi. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f zamanda (%.1fE) %2.2f kare/saniye %c %i %i %i %u unzoomed Yakınlaştırma zoomed Yakınlaştır framerate:%f Karehızı:%f Fractal name:%s Fraktal ismi:%s Fractal type:%s Fraktal türü:%s Mandelbrot Mandelbrot Julia Julia Formula:%s Formül:%s View:[%1.12f,%1.12f] Görüntü:[%1.12f,%1.12f] size:[%1.12f,%1.12f] boyut:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Döndürme:%4.2f Ekran boyutu:%i:%i Iterations:%-4u Palette size:%i Yinelemeler:%-4u Palet boyutu:%i Bailout:%4.2f Döngüdençık%4.2f Autopilot:%-4s Plane:%s Oto-pilot:%-4s Düzlem:%s On Açık Off Kapalı incoloring:%s outcoloring:%s iç renklendirme:%s dış renklendirme:%s zoomspeed:%f yakınlaştırma hızı:%f Parameter:none Parametre: yok Parameter:[%f,%f] Parametre:[%f,%f] Mouse:[%1.12f,%1.12f] Thank you for using XaoS XaoS’u kullandığınız için teşekkürler XaoS must restart to change the language. İşlemin değiştirilmesi için XaoS yeniden başlatılmalı. Enabling: %s. Etkinleştiriliyor: %s. Disabling: %s. Devre dışı bırakılıyor: %s. Skipping, please wait... Atlanıyor, lütfen bekleyiniz... Letters per second %i Saniye başına simge %i Rotation speed:%2.2f degrees per second Dönüş hızı: Saniyede %2,2f derece Iterations: %i Yinelemeler: %i Cycling speed: %i Döngüsel tekrar hızı: %i speed:%2.2f Hız: %2.2f Please wait while calculating %s %s (yüzdeler) hesaplanırken lütfen bekleyiniz Welcome to XaoS version %s XaoS version %s’lere hoş geldiniz XaoS-release-4.3.2/i18n/XaoS_vi.ts000066400000000000000000001337341455214672000165300ustar00rootroot00000000000000 Dialog Perturbation: Độ nhiễu loạn: Julia-seed: Hạt giống Julia: Morphing type: Loại biến hình: Startuptime: Thời gian bắt đầu: Stoptime: Thời gian kết thúc: Files to render: Tệp để kết xuất: Basename: Tên cở sở: Width: Chiều dài: Height: Chiều cao: Pixel width (cm): Chiều dài điểm ảnh (cm): Pixel height (cm): Chiều cao điểm ảnh (cm): Framerate: Tốc độ khung hình: Image type: Loại ảnh: Antialiasing: Khử răng cưa: Always recalculate: Luôn tính toán lại: Center: Tâm: Radius: Bán kính: Angle: Góc: Mode: Chế độ: Start: Bắt đầu: End: Kết thúc: Color: Màu: Rotations per second: Độ xoay mỗi giây: Letters per second: Số chữ cái mỗi giây: Iterations: Số lần lặp: Text: Văn bản: Your command: Câu lệnh của bạn Filename: Tên tệp: Formula: Công thức: X center: X tâm: Y center: Y tâm: X Radius: X bán kính: Y Radius: Y bán kính: Coordinates: Toạ độ: continuous rotation Xoay liền tục Fast rotation Xoay nhanh filter Bộ lọc enable Bật Amount: Số lượng: Zooming speed: Tốc độ thu phóng: Name: Tên: Bailout: Cứu trợ: Threads: Số mạch: Julia mode: Chế độ Julia: Horizontal position: Vị trí ngang: Vertical position: Vị trí dọc: Dynamic resolution: Phân giải động: Time: Thời gian: Number: Số: Algorithm number: Số thuật toán: Seed: Hạt giống: Shift: Chuyển dịch: Load Palette Config Lưu cấu hình bảng phối màu Save Palette Config Lưu cấu hình bảng phối màu Frames per second: Số khung hình trên giây: Formula Công thức Initialization: Khởi tạo: Error renderanim: Width parameter must be positive integer in the range 0..4096 renderanim: Tham số chiều dài phải là một số nguyên dương trong khoảng từ 0..4096 renderanim: Height parameter must be positive integer in the range 0..4096 renderanim: Tham số chiều cao phải là một số nguyên dương trong khoảng từ 0..4096 renderanim: Invalid real width and height dimensions renderanim: Kích thước chiều dài và chiều cao không hợp lệ renderanim: invalid framerate renderanim: tốc độ khung hình không hợp lệ renderanim: antialiasing not supported in 256 color mode renderanim: khử răng cưa không được hỗ trợ trong chế độ 256 màu animateview: Invalid viewpoint animateview: Điểm nhìn không hợp lệ Invalid viewpoint Điểm nhìn không hợp lệ Unknown palette type Loại bảng phối màu không xác định Initialization of color cycling failed. Khởi tạo xoay vòng màu thất bại Try to enable palette emulation filter Hãy thử bật bộ lọc giả lập bảng phối màu Algorithm:%i seed:%i size:%i Thuật toán:%i hạt giống:%i kích cỡ:%i line available only in animation replay line chỉ khả dụng trong khi phát lại hoạt hình Morphing non existing line! Biến hình đường không tồn tại! linekey not available in this context! linekey không có sẵn trong ngữ cảnh này! clear_line available only in animation replay clear_line chỉ khả dụng trong khi phát lại hoạt hình clear_lines available only in animation replay clear_lines chỉ khả dụng trong khi phát lại hoạt hình Catalog file not found Không tìm thấy tệp danh mục Replay is already active Phát lại đã được bật rồi File open failed Mở tệp thất bại Out of memory Đầy bộ nhớ Missing parameter Thiếu tham số Unexpected end of file Cuối tệp không mong đợi Token is too long Dấu hiệu quá dài Unknown formula type Loại công thức không xác định morph available only in animation replay morph chỉ khả dụng trong khi phát lại hoạt hình morphview: Invalid viewpoint morphview: Điểm nhìn không hợp lệ move available only in animation replay move chỉ khả dụng trong khi phát lại hoạt hình morphjulia available only in animation replay morphjulia chỉ khả dụng trong khi phát lại hoạt hình morphangle available only in animation replay morphangle chỉ khả dụng trong khi phát lại hoạt hình Unknown filter Bộ lọc không xác định sleep available only in animation replay sleep chỉ khả dụng trong khi phát lại hoạt hình Internal program error #12 %i Lỗi bên trong chương trình #12 %i wait available only in animation replay wait chỉ khả dụng trong khi phát lại hoạt hình No catalog file loaded Chưa tải tệp danh mục nào cả Message not found in catalog file Không tìm thấy thông điệp trong tệp danh mục load available only in animation replay load chỉ khả dụng trong khi phát lại hoạt hình Include level overflow Bao gồm tràn cấp File not found Không tìm thấy tệp Too many parameters Quá nhiều tham số Error: %s Lỗi: %s Cannot create palette Không thể tạo bảng phối màu Cannot create image Không thể tạo ảnh Cannot create checking buffer! Không thể tạo vùng đệm kiểm tra! Cannot create context Không thể tạo ngữ cảnh Cannot open animation file Không thể mở tệp hoạt hình Calculation interrupted Đã ngắt tính toán Calculation finished Đã hoàn tất việc tính toán Tutorial files not found. Reinstall XaoS Không tìm thấy các tệp dướng dẫn. Hãy tải lại XaoS Could not open examples Không thể mở ví dụ Could not open image Không thể mở hình ảnh Can not create palette Không thể tạo bảng phối màu XaoS is out of memory. XaoS bị đầy bộ nhớ Can not create image Không thể tạo ảnh Can not allocate tables Không thể cấp phát các bảng Menu Root menu Trình đơn gốc Animation root menu Trình đơn gốc hoạt hình Replay only commands Chỉ phát lại bình luận Line drawing functions Các hàm vẽ đường Line Đường Morph line Biến hình đường Morph last line Biến hình đường cuối cùng Set line key Đặt khoá đường Clear line Xoá đường Clear all lines Xoá hết đường Animation functions Các hàm hoạt hình View Xem Morph view Biến hình khung nhìn Morph julia Biến hình julia Move view Di chuyển khung nhìn Morph angle Biến hình góc Zoom center Thu phóng tâm Zoom Thu phóng Un-zoom Bỏ thu phóng Stop zooming Dừng thu phóng Smooth morphing parameters Các tham số biến hình mượt Timing functions Hàm thời gian Usleep Tạm ngủ Wait for text Chờ văn bản Wait for complete image Chờ cho hình ảnh hoàn thiện Include file Bao gồm tệp Default palette Bảng phối màu mặc định Formula Công thức Maximal zooming step Số bước thu phóng tối đa Zooming speedup Thu phong nhanh hơn Filter Bộ lọc Letters per second Số chữ cái mỗi giây Interrupt Ngừng lại Status Trạng thái Ministatus Trạng thái nhỏ Cartesian Grid Lưới Đề-các File Tệp Edit Chỉnh sửa Fractal Phân dạng Calculation Tính toán Filters Bộ lọc Action Hành động Help Trợ giúp Tutorials Hướng dẫn Stop replay Dừng phát lại Command Câu lệnh Play string Phát xâu Clear screen Dọn màn hình Display fractal Hiển thị phân dạng Display text Hiển thị văn bản Text color Màu văn bản Horizontal text position Vị trí văn bản ngang Vertical text position Vị trí văn bản dọc Text position Vị trí văn bản Message Thông điệp New Mới Open Mở Save Lưu Save as Lưu như PNG PNG Record Bản ghi Replay Phát lại Render Kết xuất Render Image Kết xuất ảnh Load random example Tải ví dụ ngẫu nhiên Save configuration Lưu các cấu hình Undo Hoàn tác Redo Làm lại Formulae Công thức More formulae Thêm công thức User formula Công thức người dùng User initialization Khởi tạo của người dùng Incoloring mode Chế độ màu đầu vào Outcoloring mode Chế độ màu đầu ra Plane Mặt phẳng Palette Bảng phối màu Mandelbrot mode Chế dộ Mandelbrot Julia mode Chế độ Julia Fast julia mode Chế độ Julia nhanh Rotation Xoay Set angle Đặt góc Set plane Đặt mặt phẳng Inside coloring mode Chế độ màu bên trong Outside coloring mode Chế độ màu bên ngoài Inside truecolor coloring mode Chế độ tô màu chuẩn bên trong Outside truecolor coloring mode Chế độ tô màu chuẩn bên ngoài Julia seed Hạt giống Julia Random palette Bảng phối màu ngẫu nhiên Custom palette Bảng phối màu tuỳ chỉnh Palette Colors Các màu bảng phối màu Palette Editor Trình sửa bảng phối màu Load Palette Config Tải cấu hình bảng phối màu Save Palette Config Lưu cấu hình bảng phối màu Color cycling Xoay vòng màu Reversed color cycling Xoay vòng màu ngược lại Color cycling speed Tốc độ xoay vòng màu Shift palette Xê dịch bảng phối màu Shift one forward Xê dịch lên một Shift one backward Xê dịch xuống một Solid guessing Đoán cứng Disable solid guessing Tắt đoán cứng Guess 2x2 rectangles Đoán các hình chữ nhật 2x2 Guess 3x3 rectangles Đoán các hình chữ nhật 3x3 Guess 4x4 rectangles Đoán các hình chữ nhật 4x4 Guess 5x5 rectangles Đoán các hình chữ nhật 5x5 Guess 6x6 rectangles Đoán các hình chữ nhật 6x6 Guess 7x7 rectangles Đoán các hình chữ nhật 7x7 Guess 8x8 rectangles Đoán các hình chữ nhật 8x8 Guess unlimited rectangles Đoán vô số hình chữ nhật Dynamic resolution Phân giải động Periodicity checking Kiểm tra định kì Threads Số mạch Iterations Số lần lặp Bailout Cứu trợ Perturbation Độ nhiễu loạn Zooming speed Tốc độ thu phóng Fixed step Bước cố định Solid guessing range Khoảng đoán cứng Disable rotation Tắt xoay Continuous rotation Xoay liền tục Rotate by mouse Xoay bằng chuôt Rotation speed Tốc độ xoay Automatic rotation Tự động xoay Fast rotation mode Chế độ xoay nhanh Recalculate Tính toán lại Disable dynamic resolution Tắt phân giải động Use only during animation Chỉ dùng trong khi chạy hoạt hình Use also for new images Cũng dùng cho các ảnh mới Dynamic resolution mode Chế độ phân giải động Autopilot Tự lái Hide Messages Ẩn thông điệp An introduction to fractals Giới thiệu về phân dạng XaoS features overview Tổng quan về tính năng của XaoS Math behind fractals Toán học đằng sau các phân dạng Other fractal types in XaoS Các loại phân dạng khác trong XaoS What's new? Có gì mới? Whole story Đầu đuôi câu truyện Introduction Giới thiệu Mandelbrot set Tập hợp Mandelbrot Julia set Tập hợp Julia Higher power Mandelbrots Mandelbrot mũ cao hơn Newton's method Phương pháp của Newton Barnsley's formula Công thức của Barnsley Phoenix Phoenix Octo Octo Magnet Magnet All features Tất cả tính năng Outcoloring modes Các chế độ màu ra Incoloring modes Các chế độ màu vào True-color coloring modes Các chế độ tô màu chuẩn Planes Các mặt phẳng Animations and position files Các tệp vị trí và hoạt hình Random palettes Các bảng phối màu ngẫu nhiên Other noteworthy features Các tính năng đáng chú ý khác The definition and fractal dimension Định nghĩa và kích thước phân dạng Escape time fractals Những phân dạng thoát khỏi thời gian Triceratops and Catseye fractals Phân dạng Triceratops và Catseye Mandelbar, Lambda, Manowar and Spider Mandelbar, Lambda, Manowar và Spider Sierpinski Gasket, S.Carpet, Koch Snowflake Sierpinski Gasket, S.Carpet, bông tuyết Koch What's new in 3.0? Có gì mởi ở bản 3.0? What's new in 4.0? Có gì mởi ở bản 4.0? About Giới thiệu Quit Thoát Message Font... Phông thông điệp... Set Language Đặt ngôn ngữ System default Mặc định của hệ thống Fullscreen Toàn màn hình Info on current fractal Thông tin về phân dạng hiện tại Send Feedback Gửi phản hồi Get Updates Cập nhật User Forum Diễn đàn người dùng Copy position URL Message Boundary trace Truy vết ranh giới Solid guessing 1 Đoán cứng 1 Solid guessing Đoán cứng Out of memory Đầy bộ nhớ Unbalanced parentheses Dấu ngoặc không cân xứng Unknown function: %s Hàm không xác định: %s Invalid number: %s Số không hợp lệ: %s Unknown variable: %s Biến không xác định: %s Invalid operator: %s Toán tử không hợp lệ: %s Internal error occurred in formula: %s Lỗi nội bộ đã xảy ra trong công thức: %s Function has incorrect parameter count: %s Hàm có số tham số không chính xác: %s Empty formula Công thức rỗng XaoS must restart to change the thread count. XaoS phải khởi động lại đẻ thay đổi số lượng mạch. Do you want to quit now? Bạn có muốn thoát luôn không? File %s opened. Đã mở tệp %s. File %s saved. Đã lưu tệp %s. Replay disabled at line %i Phát lại đã bị vô hiệu hoá ở dòng %i Initializing Đang khởi tạo Loading catalogs Đang tải các danh mục Processing command line options Đang xử lý các tuỳ chọn dòng lệnh Enabling animation replay Đang bất hoạt hình phát lại Entering calculation loop! Đang bước vào vòng lặp tính toán! Rendering frame %i... Đang kết xuất khung %i... Linking frame %i to %i... Đang liên kết khung %i vào khung %i... Calculation finished Đã hoàn tất việc tính toán Preparing first image Đang chuẩn bị hình ảnh đầu tiên File %s loaded. Đã tải tệp %s. Saving image... Đang lưu ảnh... Save interrupted Đã ngừng việc lưu Can not open file Không thể mở tệp Recording to file %s enabled. Đã bật ghi vào tệp %s. %s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u %s %.2f lần (%.1fE) %2.2f khung/giây %c %i %i %i %u unzoomed chưa phóng to zoomed đã phóng to framerate:%f tốc độ khung hình: %f Fractal name:%s Tên phân dạng:%s Fractal type:%s Loại phân dạng:%s Mandelbrot Mandelbrot Julia Julia Formula:%s Công thức:%s View:[%1.12f,%1.12f] Xem:[%1.12f,%1.12f] size:[%1.12f,%1.12f] kích cỡ:[%1.12f,%1.12f] Rotation:%4.2f Screen size:%i:%i Độ xoay:%4.2f kích cỡ màn hình:%i:%i Iterations:%-4u Palette size:%i Số lần lặp:%-4u Kích cỡ bảng phối màu:%i Bailout:%4.2f Cứu trợ:%4.2f Autopilot:%-4s Plane:%s Tự lái:%-4s Mặt phẳng:%s On Bật Off Tắt incoloring:%s outcoloring:%s tô màu đầu vào:%s tô màu đầu ra:%s zoomspeed:%f tốc độ thu phóng:%f Parameter:none Tham số:không có Parameter:[%f,%f] Tham số:[%f,%f] Thank you for using XaoS Cảm ơn bạn đã sử dụng XaoS XaoS must restart to change the language. XaoS phải khởi động lại đẻ thay đổi ngôn ngữ. Enabling: %s. Đang hiệu lực hoá: %s. Disabling: %s. Đang vô hiệu hoá: %s. Skipping, please wait... Đang nhảy qua, xin chờ... Letters per second %i Số chữ cái mỗi giây: %i Rotation speed:%2.2f degrees per second Tốc độ xoay:%2.2f độ trên giây Iterations: %i Số lần lặp: %i Cycling speed: %i Tốc độ xoay vòng: %i speed:%2.2f tốc độ:%2.2f Please wait while calculating %s Xin chờ trong khi đang tính toán %s Welcome to XaoS version %s Chào mừng đến với XaoS phiên bản %s Clipboard set to %s. Mouse:[%1.12f,%1.12f] XaoS-release-4.3.2/i18n/i18n.pri000066400000000000000000000012311455214672000160650ustar00rootroot00000000000000TRANSLATIONS = \ $$PWD/XaoS_cs.ts \ $$PWD/XaoS_de.ts \ $$PWD/XaoS_es.ts \ $$PWD/XaoS_fr.ts \ $$PWD/XaoS_he.ts \ $$PWD/XaoS_hi.ts \ $$PWD/XaoS_hu.ts \ $$PWD/XaoS_is.ts \ $$PWD/XaoS_it.ts \ $$PWD/XaoS_pt.ts \ $$PWD/XaoS_ro.ts \ $$PWD/XaoS_rs.ts \ $$PWD/XaoS_ru.ts \ $$PWD/XaoS_sv.ts \ $$PWD/XaoS_sk.ts \ $$PWD/XaoS_tr.ts \ $$PWD/XaoS_vi.ts OTHER_FILES = TRANSLATIONS updateqm.input = TRANSLATIONS updateqm.output = $$PWD/${QMAKE_FILE_BASE}.qm updateqm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_NAME} -qm ${QMAKE_FILE_OUT} updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm XaoS-release-4.3.2/installer/000077500000000000000000000000001455214672000160135ustar00rootroot00000000000000XaoS-release-4.3.2/installer/config/000077500000000000000000000000001455214672000172605ustar00rootroot00000000000000XaoS-release-4.3.2/installer/config/banner.png000066400000000000000000000150451455214672000212400ustar00rootroot00000000000000PNG  IHDRnLKW'bKGD pHYs  tIME,>iTXtCommentCreated with GIMPd.eIDATx1l#}g4EEBpwa: bפq&4A4iR$Mvkܜ=\nqyuuRJJ|qጆ#"%J"n%QpF<76{H&9 3u>~5x,^B Ow7A9~ 0Xć^&4MͱOl}:Oc'0EalN@@OC甕\4@x]MyA~j|3z{&Y*E{]=Wzs}mE)9OE!`y5Cds=Lr1d`NB?k 3'ܜ `p!npj}ޜ?W3ԏ` /"''c /#GݱB}cu,+cY'>O=risyϷ cA~>aWbzsm ?s^K9n|%Dzt,Ƕu#o}|c> " gi:k_o-ݒg̱nj1@Uw_兼$)`p^~O|.e+c2-H\czspA@Z[v/9L@!:G7Y%M&}DTv{T?y~++g-u6t gw< ~tnqF-;Z(JK=WpLNZz3Fa溪nCzO G5̛ |n'և?OgIԶ:6zRR=f9؟&>KכAǖl/tŒ ;NPflKsGJKgfM12/nF]Mwwyr/u$ϴ:ﯔsssy.-kږNݒcrގ.3^O_л+XV~BNoJzJv_郷޶6 7mn}4p!WlׁgZqȠ3Q'(K'կUdp+7Goh@&;<гWڦkGu}{_ƶN~;KT^k LKOj[ Lă8U1Uq>+Ƕ>,Km_sj c8q]oIxK]RktMl\LwIvk=Z(|G!:z~xt*osjT&D` ' ^ 0ARZӕcQVe7_n%*QMcqQK^QŲu:D{ XI+~aغjfq2VgMtztv$I{ W݆VK۲a)JA 9hco &cjA:KuapqQf䋩e%pW_W~7ɚ7Ng[zWo GsQ)M:朌ʹGϿݥkd?kAߵ7y^Rⅳq; sJq c8j죶I InCJ˪Wq>J~=ԶEГn/Jb&ӄzR)7Ļ:۝ήbAǔw  de8n#ew,[7uUkhuOo d_^ə(D'E7߹gam jMW;]Z{'7:)'>>s M5e؂(7ȱN{vG)>F9/j!\huo&AhviSnks|6.͉>-_Wm6צCFޙqA 97#ǶymK NF\{h(I5]]^鼓aOH΂Rv(Ù;{t-|Qc%..u~.*UZRu6 gzW3޽fOz%osd@_[a0W Τ{؏#3cpvZ֪wf罯Zӿ'][tz#*IZ6Tduoz7z,{armH>?.G5z`3 \:v~ &T^W#ZϴrsxRgi[%UelKiu "Wiiek^ Ur|~P!z(Grs]ZQqT} tst3޻vS>}׿T9ak˻K+Fi =c@ά^isٻQ2p|uO_g4B.._ g1F?mxnTVO~!m.~VD-?n8gCDa~< 3O[w|98Shu\X >yMG;Q1Uqn4LN$M]/./ðǑffe _XLc= :g㣅 |y;D9M9%絭ιO;O~sRw>wIm+ޤ*VOJmxܜO_냷LO~}As7Or㩰ၞwC2'w$ B=x`4*.ItqnIjM/)\0;*guPnΉ}6Z-wT?+3\^um7].-Ru}18CD=X'cz6$I?ylo &sy(7uYZQVi%=}b'z!mhs]kiǿjMW6u#_н뒤;۪ zPgL.20c)1c?ם>_g)ˉfqHNֺך<ӊD^ȗ'[9jMWr~ooҊ$IGk]rrl[7-w]3g]LPB_DYN9&gMq'ZS~gv=lǏ'կu|][emugiX瞍*Bg/-fqW!\qQm z'B69]k%9a'~E,A{m//H12B<73*<0c?=cRqá$q?k_ۯb&GA9裙~t1Luwtܜ@!3g|`H|>ݟ~TQpF߶{tkLnu:<}UV{sƶzg:\]q5$1[5Zh^%+;NX9zrSso,-gUzMdugY=&*_FA*7r}Az4n@|A^@*2T?sHAy;r}qT^ȫϾ|v>'w7NT`p?RgpPmOqXSq9 e8 s=O)@ρ_I7AKtEȑk4XIENDB`XaoS-release-4.3.2/installer/config/config.xml000066400000000000000000000007411455214672000212510ustar00rootroot00000000000000 XaoS 4.3.2 XaoS XaoS Project XaoS @ApplicationsDirX86@/XaoS banner.png Modern https://github.com/xaos-project/XaoS ..\..\src\ui\xaos XaoS-release-4.3.2/installer/packages/000077500000000000000000000000001455214672000175715ustar00rootroot00000000000000XaoS-release-4.3.2/installer/packages/net.sourceforge.xaos/000077500000000000000000000000001455214672000236525ustar00rootroot00000000000000XaoS-release-4.3.2/installer/packages/net.sourceforge.xaos/meta/000077500000000000000000000000001455214672000246005ustar00rootroot00000000000000XaoS-release-4.3.2/installer/packages/net.sourceforge.xaos/meta/installscript.qs000066400000000000000000000032241455214672000300410ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the FOO module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ function Component() { // default constructor } Component.prototype.createOperations = function() { // call default implementation to actually install README.txt! component.createOperations(); if (systemInfo.productType === "windows") { component.addOperation("CreateShortcut", "@TargetDir@/bin/xaos.exe", "@StartMenuDir@/XaoS.lnk", "workingDirectory=@TargetDir@"); } } XaoS-release-4.3.2/installer/packages/net.sourceforge.xaos/meta/license.txt000066400000000000000000000432541455214672000267730ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. XaoS-release-4.3.2/installer/packages/net.sourceforge.xaos/meta/package.xml000066400000000000000000000007141455214672000267170ustar00rootroot00000000000000 XaoS Real-time interactive fractal zoomer 4.3.2 2024-01-17 true true XaoS-release-4.3.2/src/000077500000000000000000000000001455214672000146055ustar00rootroot00000000000000XaoS-release-4.3.2/src/engine/000077500000000000000000000000001455214672000160525ustar00rootroot00000000000000XaoS-release-4.3.2/src/engine/3d.cpp000066400000000000000000000155711455214672000170750ustar00rootroot00000000000000#include "config.h" #include #include /*for NULL */ #include #define SLARGEITER #include "xthread.h" #include "filter.h" struct threeddata { struct palette *pal; struct palette *savedpalette; unsigned int *pixels; unsigned int maxiter; unsigned int height; unsigned int colheight; unsigned int midcolor; unsigned int darkcolor; unsigned int stereogrammode; }; #define spixel_t pixel16_t #include "c256.h" #define do_3d do_3d8 #define convert_3d convert_3d8 #define convertup_3d convertup_3d8 #include "3dd.h" #include "truecolor.h" #define do_3d do_3d32 #define convert_3d convert_3d32 #define convertup_3d convertup_3d32 #include "3dd.h" #include "true24.h" #define do_3d do_3d24 #define convert_3d convert_3d24 #define convertup_3d convertup_3d24 #include "3dd.h" #include "hicolor.h" #define do_3d do_3d16 #define convert_3d convert_3d16 #define convertup_3d convertup_3d16 #include "3dd.h" static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~IMAGEDATA; r->supportedmask = MASK1BPP | MASK3BPP | MASK2BPP | MASK4BPP; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { struct threeddata *d = (struct threeddata *)f->data; struct filter *f1 = f; inhermisc(f, i); d->stereogrammode = 0; while (f1) { if (f1->action == &stereogram_filter) d->stereogrammode = 1; f1 = f1->next; } d->maxiter = -1; d->height = i->image->height / 3; if (d->pal != NULL) destroypalette(d->pal); d->pal = createpalette(0, 65536, LARGEITER, 0, 65536, NULL, NULL, NULL, NULL, NULL); /*in/out coloring modes looks better in iter modes. This also saves some memory in truecolor. */ if (i->image->palette->type == LARGEITER || i->image->palette->type == SMALLITER) { } else { if (d->savedpalette == NULL) d->savedpalette = clonepalette(i->image->palette); mkgraypalette(i->image->palette); } if (d->pixels != NULL) { free(d->pixels); d->pixels = NULL; } if (!inherimage(f, i, TOUCHIMAGE | NEWIMAGE, i->image->width + 6 + (i->image->height + d->height + 6) / 2, i->image->height + d->height + 6, d->pal, i->image->pixelwidth, i->image->pixelheight * 2)) return 0; setfractalpalette(f, d->savedpalette); fractalc_resize_to(f->fractalc, f->childimage->pixelwidth * f->childimage->width, f->childimage->pixelheight * f->childimage->height); f->fractalc->version++; return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct threeddata *d = (struct threeddata *)calloc(sizeof(*d), 1); f->data = d; f->name = "3d"; return (f); } static void destroyinstance(struct filter *f) { struct threeddata *d = (struct threeddata *)f->data; if (d->pal != NULL) destroypalette((struct palette *)d->pal); if (d->savedpalette != NULL) destroypalette(d->savedpalette); if (d->pixels) { d->pixels = 0; free(d->pixels); } free(d); destroyinheredimage(f); free(f); } static int doit(struct filter *f, int flags, int time) { int val; int size = f->childimage->palette->type == SMALLITER ? 240 : 65520; struct threeddata *d = (struct threeddata *)f->data; if (f->image->palette->size < size) size = f->image->palette->size; /* Update logarithmic scale palette. */ if (f->fractalc->maxiter != d->maxiter) { unsigned int i; int palsize = f->fractalc->maxiter; if (palsize >= 65536) palsize = 65535; d->colheight = d->height * (64 + 32) / 64; d->midcolor = d->height * 60 / 100; d->darkcolor = d->height * 30 / 100; d->pal->size = palsize; for (i = 0; i < (unsigned int)palsize; i++) { unsigned int y; y = (log10(1 + 10.0 * (i ? i : palsize) / palsize)) * d->colheight / 9.0 * 16.0 / 2.0; /*y = (i ? i : palsize) * d->colheight / 9.0 / 2.0 * 16.0 / palsize; */ if (y != d->pal->pixels[i]) f->fractalc->version++; d->pal->pixels[i] = y; } d->maxiter = f->fractalc->maxiter; if (d->pixels) free(d->pixels); i = 0; if (d->stereogrammode) { d->pixels = (unsigned int *)malloc((f->childimage->height) * sizeof(*d->pixels)); for (i = 0; i < (unsigned int)f->childimage->height; i++) { d->pixels[i] = (f->childimage->height - i) * 255 / f->childimage->height; } } else { d->pixels = (unsigned int *)malloc((d->colheight + 5) * sizeof(*d->pixels)); for (; i < d->colheight; i++) { int c = i * (f->image->palette->size) / d->colheight; if (c > f->image->palette->size - 1) c = f->image->palette->size - 1; d->pixels[i] = f->image->palette->pixels[c]; } d->pixels[i] = f->image->palette->pixels[0]; } } updateinheredimage(f); val = f->previous->action->doit(f->previous, flags, time); drivercall(*f->image, xth_function(do_3d8, f, f->image->width), xth_function(do_3d16, f, f->image->width), xth_function(do_3d24, f, f->image->width), xth_function(do_3d32, f, f->image->width)); xth_sync(); return val; } static void myremove(struct filter *f) { struct threeddata *d = (struct threeddata *)f->data; fractalc_resize_to(f->fractalc, f->image->width * f->image->pixelwidth, f->image->height * f->image->pixelheight); if (d->savedpalette != NULL) { restorepalette(f->image->palette, d->savedpalette); destroypalette(d->savedpalette); d->savedpalette = NULL; } } static void convertup(struct filter *f, int *x, int *y) { drivercall(*f->image, convertup_3d8(f, x, y), convertup_3d16(f, x, y), convertup_3d24(f, x, y), convertup_3d32(f, x, y)); f->next->action->convertup(f->next, x, y); } static void convertdown(struct filter *f, int *x, int *y) { drivercall(*f->image, convert_3d8(f, x, y), convert_3d16(f, x, y), convert_3d24(f, x, y), convert_3d32(f, x, y)); if (f->previous != NULL) f->previous->action->convertdown(f->previous, x, y); } const struct filteraction threed_filter = { "Pseudo 3d", "threed", 0, getinstance, destroyinstance, doit, requirement, initialize, convertup, convertdown, myremove}; XaoS-release-4.3.2/src/engine/3dd.h000066400000000000000000000140641455214672000167020ustar00rootroot00000000000000#ifndef UNSUPPORTED static void convert_3d(struct filter *f, int *x1, int *y1) { struct threeddata *data = (struct threeddata *)f->data; int y; int x = *x1; unsigned int inp; unsigned int height = data->height; const spixel_t *input; if (x >= f->childimage->width - 5 || x < 0 || *y1 > f->childimage->height) { *x1 += *y1 / 2; return; } if (x < 0) x = 0; for (y = f->childimage->height - 3; y >= 0; y--) { int d; input = ((spixel_t *)f->childimage->currlines[y] + y / 2); inp = (input[x] + input[x + 1] + input[x + 2] + input[x + 3] + input[x + 4] + input[x + 5]); input = ((spixel_t *)f->childimage->currlines[y + 1] + y / 2); inp += (input[x] + input[x + 1] + input[x + 2] + input[x + 3] + input[x + 4] + input[x + 5]); input = ((spixel_t *)f->childimage->currlines[y + 2] + y / 2); inp += (input[x] + input[x + 1] + input[x + 2] + input[x + 3] + input[x + 4] + input[x + 5]); d = y - (inp / 16 > height ? height : inp / 16); if (d <= *y1) { *y1 = y; *x1 = x + y / 2; return; } } *x1 += *y1 / 2; return; } static void convertup_3d(struct filter *f, int *x1, int *y1) { struct threeddata *data = (struct threeddata *)f->data; int y = *y1; int x = *x1; unsigned int inp; unsigned int height = data->height; const spixel_t *input; if (x >= f->childimage->width - 5) x = f->childimage->width - 6; if (y >= f->childimage->height - 3) y = f->childimage->height - 3; if (x < 0) x = 0; if (y < 0) y = 0; input = ((spixel_t *)f->childimage->currlines[y] + y / 2); inp = (input[x] + input[x + 1] + input[x + 2] + input[x + 3] + input[x + 4] + input[x + 5]); input = ((spixel_t *)f->childimage->currlines[y + 1] + y / 2); inp += (input[x] + input[x + 1] + input[x + 2] + input[x + 3] + input[x + 4] + input[x + 5]); input = ((spixel_t *)f->childimage->currlines[y + 2] + y / 2); inp += (input[x] + input[x + 1] + input[x + 2] + input[x + 3] + input[x + 4] + input[x + 5]); *x1 -= *y1 / 2; *y1 = y - (inp / 16 > height ? height : inp / 16); } static void do_3d(void *dataptr, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)dataptr; unsigned int y; int maxinp = 0; unsigned int x; unsigned int end; unsigned int sum; spixel_t const *input; unsigned int *lengths; unsigned int *sums; unsigned int *relsums; struct threeddata *data = (struct threeddata *)f->data; /* Copy to local variables to improve cse and memory references. */ unsigned int height = data->height; unsigned int stereogrammode = data->stereogrammode; unsigned int colheight = data->colheight; unsigned int midcolor = data->midcolor; unsigned int darkcolor = data->darkcolor; const unsigned int *pixels = data->pixels; cpixel_t **currlines = (cpixel_t **)f->image->currlines; struct inp { int max; unsigned int down; } * inpdata; lengths = (unsigned int *)malloc(sizeof(unsigned int) * f->image->width); inpdata = (struct inp *)malloc(sizeof(struct inp) * (f->image->width + 2)); sums = (unsigned int *)malloc(sizeof(unsigned int) * (f->image->width + 2) * 2); for (x = 0; x < (unsigned int)f->image->width; x++) lengths[x] = f->image->height - 1, sums[x * 2 + 0] = 0, sums[x * 2 + 1] = 0, inpdata[x].max = 0; sums[x * 2 + 0] = 0, sums[x * 2 + 1] = 0, inpdata[x].max = 0; inpdata[x + 1].max = 0; end = r2; for (y = f->childimage->height - 2; y > 0;) { y--; input = ((spixel_t *)f->childimage->currlines[y] + y / 2); x = r1; relsums = sums + (y & 1); /* Fix boundary cases. */ /*relsums[0] = relsums[1]; relsums[end*2-1] = relsums[end*2-2]; */ inpdata[end + 1] = inpdata[end] = inpdata[end - 1]; sum = input[x] + input[x + 1] + input[x + 2] + input[x + 3] + input[x + 4] + input[x + 5]; while (x < end) { unsigned int inp; unsigned int d; /* Average pixel values of 5*3 square to get nicer shapes. */ sum += input[x + 6] - input[x]; inp = sum + sums[x * 2 + 1] + sums[x * 2]; relsums[x * 2] = sum; inpdata[x].down = inp; /* Calculate shades. */ maxinp = inpdata[x + 2].max; if ((int)inp > maxinp) inpdata[x].max = inp - 32; else inpdata[x].max = maxinp - 32; /* calculate top of mountain. */ d = inp / 16; d = y - (d > height ? height : d); /* Underflow */ if (d > 65535U) d = 0; if (d < lengths[x]) { int y1; unsigned int color; if (stereogrammode) color = pixels[y]; else if (inp / 16 > height) /*Red thinks on the top. */ color = pixels[inp / 16 >= colheight ? colheight : inp / 16]; else { int c; /* Simple shading model. Depends only on the preceding voxel. */ c = ((int)inpdata[x + 2].down - (int)inp) / 8; /* Get shades. */ color = ((int)inp > maxinp ? midcolor : darkcolor) - c; color = pixels[color < 65535 ? (color < height ? color : height) : 0]; } for (y1 = lengths[x]; y1 >= (int)d; y1--) { p_setp(currlines[y1], x, color); } lengths[x] = d; } x++; } } free(lengths); free(inpdata); free(sums); } #endif #undef do_3d #undef convert_3d #undef convertup_3d XaoS-release-4.3.2/src/engine/anti.cpp000066400000000000000000000255421455214672000175210ustar00rootroot00000000000000#include "config.h" #ifndef __cplusplus #include #endif #include #include "config.h" #include #include #include "xerror.h" #include "filter.h" #include "fractal.h" #include "xthread.h" struct antidata { int shift; }; static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->supportedmask = TRUECOLOR24 | TRUECOLOR | TRUECOLOR16 | GRAYSCALE; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { struct antidata *s = (struct antidata *)f->data; if (i->image->width * i->image->height * i->image->bytesperpixel * 2 * 16 > 15 * 1024 * 1024) { s->shift = 1; } else { s->shift = 2; } inhermisc(f, i); if (!inherimage(f, i, TOUCHIMAGE | IMAGEDATA, (int)(((unsigned int)i->image->width) << s->shift), (int)(((unsigned int)i->image->height) << s->shift), NULL, 0, 0)) return 0; if (i->image == NULL) { return 0; } return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct antidata *i = (struct antidata *)calloc(1, sizeof(*i)); f->childimage = NULL; f->data = i; f->name = "Antialiasing"; return (f); } static void destroyinstance(struct filter *f) { destroyinheredimage(f); free(f->data); free(f); } static void antigray(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *srci = f->childimage, *desti = f->image; struct antidata *s = (struct antidata *)f->data; unsigned char *src; unsigned char *destend, *dest; unsigned int ystart, y; unsigned int xstart; unsigned int sum; unsigned int xstep = (1U << (s->shift)); int i; for (i = r1; i < r2; i++) { dest = (unsigned char *)desti->currlines[i]; destend = dest + desti->width; ystart = ((unsigned int)i) << s->shift; xstart = 0; for (; dest < destend; dest++) { if (xstep > 2) { sum = 0; for (y = 0; y < 4; y++) { src = (unsigned char *)srci->currlines[y + ystart] + xstart; sum += (unsigned int)src[0]; sum += (unsigned int)src[1]; sum += (unsigned int)src[2]; sum += (unsigned int)src[3]; } sum >>= 4; } else { src = (unsigned char *)srci->currlines[ystart] + xstart; sum = (unsigned int)src[0]; sum += (unsigned int)src[1]; src = (unsigned char *)srci->currlines[ystart + 1] + xstart; sum += (unsigned int)src[0]; sum += (unsigned int)src[1]; sum >>= 2; } *dest = (pixel8_t)sum; xstart += xstep; } } } #ifdef STRUECOLOR24 static void anti24(void *data, struct taskinfo *task, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *srci = f->childimage, *desti = f->image; struct antidata *s = (struct antidata *)f->data; unsigned char *src; unsigned char *destend, *dest; unsigned int ystart, y; unsigned int xstart; unsigned int sum; unsigned int xstep = ((1U << s->shift) - 1) * 3; int c = 0; int i; if (!srci->palette->info.truec.byteexact) { x_fatalerror( "Antialiasing filter:Unsupported colormask! Ask authors to add support for this :)"); } for (i = r1; i < r2; i++) { dest = (unsigned char *)desti->currlines[i]; destend = dest + desti->width * 3; ystart = ((unsigned int)i) << s->shift; xstart = 0; c = 1; for (; dest < destend; dest++) { if (s->shift > 1) { sum = 0; for (y = 0; y < 4; y++) { src = (unsigned char *)srci->currlines[y + ystart] + xstart; sum += (unsigned int)src[0]; sum += (unsigned int)src[3]; sum += (unsigned int)src[6]; sum += (unsigned int)src[9]; } sum >>= 4; } else { src = (unsigned char *)srci->currlines[ystart] + xstart; sum = (unsigned int)src[0]; sum += (unsigned int)src[3]; src = (unsigned char *)srci->currlines[ystart + 1] + xstart; sum += (unsigned int)src[0]; sum += (unsigned int)src[3]; sum >>= 2; } *dest = (unsigned char)sum; if (c == 3) c = 0, xstart += xstep; c++; xstart++; } } } #endif #ifdef SUPPORT16 #define MASKR1 ((unsigned int)((31 + 31744) + (31 * 65536 * 32))) #define MASKR2 ((unsigned int)((31 + 31744) * (65536 / 32) + 31)) #define MASKRH1 (31 + 31744) #define MASKRH2 (31 * 32) static void anti16(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *srci = f->childimage, *desti = f->image; struct antidata *s = (struct antidata *)f->data; unsigned int *src; unsigned short *destend, *dest; int ystart, y; int xstart; unsigned int sum1 = 0, sum2 = 0, sum; unsigned int xstep = 1U << (s->shift - 1); int i; unsigned int mask1 = (srci->palette->info.truec.mask2 | (srci->palette->info.truec.mask1 << 16)) >> 4; unsigned int mask2 = srci->palette->info.truec.mask1 | (srci->palette->info.truec.mask2 << 16); for (i = r1; i < r2; i++) { dest = (unsigned short *)desti->currlines[i]; destend = dest + desti->width; ystart = ((unsigned int)i) << s->shift; xstart = 0; for (; dest < destend; dest++) { if (xstep > 2) { sum1 = sum2 = 0; for (y = 0; y < 4; y++) { src = (unsigned int *)srci->currlines[y + ystart] + xstart; sum1 += ((unsigned int)src[0] >> 4) & mask1; sum2 += ((unsigned int)src[0] >> 4) & mask2; sum1 += (unsigned int)src[1] & mask1; sum2 += (unsigned int)src[1] & mask2; } sum = ((sum1 >> 4) + (sum2 >> 16)) >> 4; sum1 = (sum2 + (sum1 >> 12)) >> 4; } else { src = (unsigned int *)srci->currlines[ystart] + xstart; sum1 = ((unsigned int)src[0] >> 4) & mask1; sum2 = (unsigned int)src[0] & mask2; src = (unsigned int *)srci->currlines[ystart + 1] + xstart; sum1 += ((unsigned int)src[0] >> 4) & mask1; sum2 += (unsigned int)src[0] & mask2; sum = ((sum1 << 4) + (sum2 >> 16)) >> 2; sum1 = (sum2 + (sum1 >> 12)) >> 2; } *dest = (sum & srci->palette->info.truec.mask2) | (sum1 & srci->palette->info.truec.mask1); xstart += xstep; } } } #endif #define MASK1 0x00ff00ff static void anti32(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *srci = f->childimage, *desti = f->image; struct antidata *s = (struct antidata *)f->data; unsigned int *src; unsigned int *destend, *dest; unsigned int ystart, y; unsigned int xstart; unsigned int sum1 = 0, sum2 = 0; unsigned int xstep = 1U << s->shift; int i; if (!srci->palette->info.truec.byteexact) { x_fatalerror( "Antialiasing filter:Unsupported colormask2! ask authors to add support for this :)"); } for (i = r1; i < r2; i++) { dest = (unsigned int *)desti->currlines[i]; destend = dest + desti->width; ystart = ((unsigned int)i) << s->shift; xstart = 0; for (; dest < destend; dest++) { if (xstep > 2) { sum1 = sum2 = 0; for (y = 0; y < 4; y++) { src = (unsigned int *)srci->currlines[y + ystart] + xstart; sum1 += (unsigned int)src[0] & MASK1; sum2 += ((unsigned int)src[0] >> 8) & MASK1; sum1 += (unsigned int)src[1] & MASK1; sum2 += ((unsigned int)src[1] >> 8) & MASK1; sum1 += (unsigned int)src[2] & MASK1; sum2 += ((unsigned int)src[2] >> 8) & MASK1; sum1 += (unsigned int)src[3] & MASK1; sum2 += ((unsigned int)src[3] >> 8) & MASK1; } sum1 >>= 4; sum2 >>= 4; } else { src = (unsigned int *)srci->currlines[ystart] + xstart; sum1 = (unsigned int)src[0] & MASK1; sum2 = ((unsigned int)src[0] >> 8) & MASK1; sum1 += (unsigned int)src[1] & MASK1; sum2 += ((unsigned int)src[1] >> 8) & MASK1; src = (unsigned int *)srci->currlines[ystart + 1] + xstart; sum1 += (unsigned int)src[0] & MASK1; sum2 += ((unsigned int)src[0] >> 8) & MASK1; sum1 += (unsigned int)src[1] & MASK1; sum2 += ((unsigned int)src[1] >> 8) & MASK1; sum1 >>= 2; sum2 >>= 2; } *dest = (sum1 & MASK1) | ((sum2 & MASK1) << 8); xstart += xstep; } } } static int doit(struct filter *f, int flags, int time1) { int val; updateinheredimage(f); val = f->previous->action->doit(f->previous, flags, time1); switch (f->image->palette->type) { case GRAYSCALE: xth_function(antigray, f, f->image->height); break; #ifdef STRUECOLOR24 case TRUECOLOR24: xth_function(anti24, f, f->image->height); break; #endif #ifdef SUPPORT16 case TRUECOLOR16: xth_function(anti16, f, f->image->height); break; #endif case TRUECOLOR: xth_function(anti32, f, f->image->height); break; } xth_sync(); return val; } static void convertup(struct filter *f, int *x, int *y) { struct antidata *s = (struct antidata *)f->data; *x >>= s->shift; *y >>= s->shift; f->next->action->convertup(f->next, x, y); } static void convertdown(struct filter *f, int *x, int *y) { struct antidata *s = (struct antidata *)f->data; *x <<= s->shift; *y <<= s->shift; f->previous->action->convertdown(f->previous, x, y); } const struct filteraction antialias_filter = { "Antialiasing", "anti", 0, getinstance, destroyinstance, doit, requirement, initialize, convertup, convertdown, NULL, }; XaoS-release-4.3.2/src/engine/blur.cpp000066400000000000000000000272111455214672000175250ustar00rootroot00000000000000#include "config.h" #include #include #include #include #include "filter.h" #include "fractal.h" #include "xthread.h" #include "xerror.h" #define SIZE 64 #define SIZE2 8 #define AMOUNT 0.005 #define DIV 1000.0 #define MAXFRAMES 800 * 1000 /*after 800 frames should be OK */ struct blurdata { int bckuptime; int counter; struct palette *savedpalette, *palette; unsigned char (*table)[256]; /*Used by blur routines */ int n; }; static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags |= IMAGEDATA; r->supportedmask = C256 | TRUECOLOR24 | TRUECOLOR | TRUECOLOR16 | GRAYSCALE; return (f->next->action->requirement(f->next, r)); } static void blur8(struct filter *f) { struct image *desti = f->image; struct blurdata *s = (struct blurdata *)f->data; unsigned char(*table)[256] = s->table; unsigned int i, i1, im, im1, ipl, ii; if (f->image->palette->type == C256) for (i = im = 0; i < SIZE; i++, im += 256 - s->n) { for (i1 = im1 = 0; i1 < SIZE2; i1++, im1 += s->n * (SIZE / SIZE2)) { ipl = (im + im1 + 128) >> 8; ii = i1 * (SIZE / SIZE2); if (ipl == i && i != ii) { if (i < ii) ipl++; else ipl--; } ii = desti->palette->pixels[i]; table[i1][ii] = (unsigned char)desti->palette->pixels[ipl]; } } else for (i = im = desti->palette->start, im *= 256 - s->n; i < (unsigned int)desti->palette->end; i++, im += 256 - s->n) { for (i1 = im1 = desti->palette->start, im1 *= s->n; i1 < (unsigned int)desti->palette->end; i1++, im1 += s->n) { ipl = (im + im1 + 128) >> 8; if (ipl == i && i != i1) { if (i < i1) ipl++; else ipl--; } table[i1][i] = (unsigned char)ipl; } } } static void blurtruecolor(struct filter *f) { struct blurdata *s = (struct blurdata *)f->data; unsigned int i, i1, im, im1; unsigned char(*table)[256] = s->table; for (i = im = 0; i < 256; i++, im += 256 - s->n) { for (i1 = im1 = 0; i1 < 256; i1++, im1 += s->n) table[i1][i] = (unsigned char)((im + im1) >> 8); } } static void clear_image2(struct image *img) { int i; int color = img->palette->pixels[0]; int width = img->width * img->bytesperpixel; if (!width) width = (img->width + 7) / 8; for (i = 0; i < img->height; i++) memset(img->currlines[i], color, (size_t)width); } static int initialize(struct filter *f, struct initdata *i) { struct blurdata *s = (struct blurdata *)f->data; unsigned int x; inhermisc(f, i); s->counter = 0; s->palette->size = SIZE2; for (x = 0; x < SIZE2; x++) s->palette->pixels[x] = x; if (datalost(f, i) || i->image->version != f->imageversion) { s->bckuptime = MAXFRAMES; s->counter = MAXFRAMES; if (i->image->palette->type == C256) { if (s->savedpalette == NULL) s->savedpalette = clonepalette(i->image->palette); mkblurpalette(i->image->palette); } else { if (s->savedpalette != NULL) { restorepalette(i->image->palette, s->savedpalette); destroypalette(s->savedpalette); s->savedpalette = NULL; } } clear_image2(i->image); } if (!inherimage(f, i, TOUCHIMAGE | IMAGEDATA, 0, 0, i->image->palette->type == C256 ? s->palette : NULL, 0, 0)) return 0; if (f->image->palette->type == C256) { setfractalpalette(f, s->savedpalette); } if (i->image == NULL) { return 0; } return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct blurdata *i = (struct blurdata *)calloc(1, sizeof(*i)); i->savedpalette = NULL; i->palette = createpalette(0, 256, SMALLITER, 0, 256, NULL, NULL, NULL, NULL, NULL); i->palette->size = SIZE2; i->palette->end = SIZE2; i->table = NULL; f->childimage = NULL; f->data = i; f->name = "Motionblur"; return (f); } static void destroyinstance(struct filter *f) { struct blurdata *i = (struct blurdata *)f->data; if (i->table != NULL) free(i->table); if (i->savedpalette != NULL) destroypalette(i->savedpalette); destroypalette(i->palette); destroyinheredimage(f); free(f->data); free(f); } /* An part of blur function that should be done paraely */ static void blur82(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *srci = f->childimage, *desti = f->image; struct blurdata *s = (struct blurdata *)f->data; unsigned char(*table)[256]; int i, im; unsigned char *src, *dest, *srcend; im = srci->width; table = s->table; for (i = r1; i < r2; i++) { src = srci->currlines[i]; srcend = src + im; dest = desti->currlines[i]; for (; src < srcend; src++, dest++) { dest[0] = table[src[0]][dest[0]]; } } } #ifdef SUPPORT16 static void blur16(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *srci = f->childimage, *desti = f->image; struct blurdata *s = (struct blurdata *)f->data; struct truec *info = &srci->palette->info.truec; unsigned int rmask = info->rmask; unsigned int gmask = info->gmask; unsigned int bmask = info->bmask; unsigned int n = (unsigned int)s->n; int i; pixel16_t *src, *dest, *srcend; for (i = r1; i < r2; i++) { src = (pixel16_t *)srci->currlines[i]; srcend = src + srci->width; dest = (pixel16_t *)desti->currlines[i]; for (; src < srcend; src++, dest++) { *dest = interpol(*src, *dest, n, rmask, gmask, bmask); } } } #endif #ifdef STRUECOLOR24 static void blur24(void *data, struct taskinfo *task, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *srci = f->childimage, *desti = f->image; struct blurdata *s = (struct blurdata *)f->data; unsigned char(*table)[256] = s->table; unsigned char *src, *dest, *srcend; int i, im; im = srci->width * 3; if (!srci->palette->info.truec.byteexact) { x_fatalerror( "Blur filter:unsupported color configuration! Please contact authors."); } for (i = r1; i < r2; i++) { src = srci->currlines[i]; srcend = src + im; dest = desti->currlines[i]; for (; src < srcend; src += 3, dest += 3) { dest[0] = table[src[0]][dest[0]]; dest[1] = table[src[1]][dest[1]]; dest[2] = table[src[2]][dest[2]]; } } } #endif static void blur32(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *srci = f->childimage, *desti = f->image; struct blurdata *s = (struct blurdata *)f->data; unsigned char(*table)[256] = s->table; unsigned char *src, *dest, *srcend; int i, im; im = srci->width * 4; if (!srci->palette->info.truec.byteexact) { x_fatalerror( "Blur filter:unsupported color configuration! Please contact authors."); } for (i = r1; i < r2; i++) { src = srci->currlines[i]; srcend = src + im; dest = desti->currlines[i]; switch (f->image->palette->info.truec.missingbyte) { case 3: for (; src < srcend; src += 4, dest += 4) { dest[0] = table[src[0]][dest[0]]; dest[1] = table[src[1]][dest[1]]; dest[2] = table[src[2]][dest[2]]; dest[3] = 0xff; } break; case 2: for (; src < srcend; src += 4, dest += 4) { dest[0] = table[src[0]][dest[0]]; dest[1] = table[src[1]][dest[1]]; dest[3] = table[src[2]][dest[2]]; dest[2] = 0xff; } break; case 1: for (; src < srcend; src += 4, dest += 4) { dest[0] = table[src[0]][dest[0]]; dest[2] = table[src[1]][dest[1]]; dest[3] = table[src[2]][dest[2]]; dest[1] = 0xff; } break; case 0: for (; src < srcend; src += 4, dest += 4) { dest[1] = table[src[1]][dest[1]]; dest[2] = table[src[2]][dest[2]]; dest[3] = table[src[3]][dest[3]]; dest[0] = 0xff; } break; default: for (; src < srcend; src += 4, dest += 4) { dest[1] = table[src[1]][dest[1]]; dest[2] = table[src[2]][dest[2]]; dest[3] = table[src[3]][dest[3]]; dest[4] = table[src[4]][dest[4]]; } } } } static int doit(struct filter *f, int flags, int time1) { int val, n; int time = time1; struct blurdata *s = (struct blurdata *)f->data; updateinheredimage(f); val = f->previous->action->doit(f->previous, flags, time); s->counter += time; if (val & CHANGED) s->counter = 0; n = (int)((1 - pow(1.0 - AMOUNT, (time + s->bckuptime) / DIV)) * 256); if (s->counter >= 2 * MAXFRAMES) { return val; } if (n < 10) { s->bckuptime += time; return val | ANIMATION; } s->bckuptime = 0; if (s->counter >= MAXFRAMES) n = 256, s->counter = 2 * MAXFRAMES; if (s->n != n) { s->n = n; switch (f->image->bytesperpixel) { case 1: if (s->table == NULL) s->table = (unsigned char(*)[256])malloc(256 * 256); blur8(f); break; case 3: case 4: if (s->table == NULL) s->table = (unsigned char(*)[256])malloc(256 * 256); blurtruecolor(f); break; default: if (s->table != NULL) free(s->table), s->table = NULL; } } switch (f->image->palette->type) { case C256: case GRAYSCALE: xth_function(blur82, f, f->image->height); break; #ifdef SUPPORT16 case TRUECOLOR16: xth_function(blur16, f, f->image->height); break; #endif case TRUECOLOR: xth_function(blur32, f, f->image->height); break; #ifdef STRUECOLOR24 case TRUECOLOR24: xth_function(blur24, f, f->image->height); break; #endif } xth_sync(); if (s->counter == 2 * MAXFRAMES) { return val | CHANGED; } return val | CHANGED | ANIMATION; } static void myremovefilter(struct filter *f) { struct blurdata *s = (struct blurdata *)f->data; if (s->savedpalette != NULL) { restorepalette(f->image->palette, s->savedpalette); destroypalette(s->savedpalette); s->savedpalette = NULL; } } const struct filteraction blur_filter = { "Motionblur", "blur", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdowngeneric, myremovefilter}; XaoS-release-4.3.2/src/engine/btrace.cpp000066400000000000000000000547111455214672000200260ustar00rootroot00000000000000#include "config.h" #include #include #include #include #include #define SLARGEITER #include "filter.h" #include "fractal.h" #include "xthread.h" /* * This is an implementation of famous boundary trace algorithm. * See fractint documentation if you don't know what this means :) * * Here is two different implementation of this algorithm - one is faster * and second is threadable. * * An faster one is quite usual implementation - get first uncalculated pixel, * trace algorithm using labirinth "right hand rule" way (well, I currently * use left hand rule) then trace same boundary again and fill. It is * implemented in tracerectangle/tracecolor * * An threaded one follows description I sent to sci.fractals: Hi few weeks ago I asked for multithreaded algorithm for boundary trace I received following reply by Paul Derbyshire > One method is this. One b-trace algorithm pushes pixels onto a stack. > Initially the screen border pixels are all pushed. Then a loop starts. A > pixel is popped and calculated or recalled, with 4 orthogonal neighbors > calculated or recalled if already calculated; if the central pixel is at a > color boundary the neighbors are pushed. The image is done when the stack > hits empty, then empty areas of image are floodfilled by their boundary > color. (Fractint does it differently, not sure how). By this method, the > stack will usually have at least 4 pixels, and so four substacks can be > assigned to each of 4 processors, and each processor has a "processor to > its left" designated as if they were in a "logical" ring. Each processor > pushes new pixels on the processor to its left's substack, and pops from > its own. This way, busy parts of the image wind up spread among all > processors. By adding substacks, this can be expanded to accommodate more > processors. Some amount is optimal, after which a point of diminishing > returns is reached when most processors only do a few pixels and spend > most of their time waiting for new stuff from the processor to its right. > You'll need to figure out this optimum somehow; I can't guess what it > would be. Probably around 64 processors. (More than that, you would do > well just to assign separate processors small rectangular subsets of the > image anyways.) Also, the end is only reached when NO processors have > anything in their stacks. This method looks very interesting but has few serious problems. Most significant probably is that it always calculates pixels up to distance 3 from boundary. Simple modification should lower it to distance 2. But "right hand rule" based algorithm should actually calculate points just to distance 1. So I want to implement such alrogithm, since number of calculated points is still significant. So I think I have to extend stack for two information: 1) direction 2) color of boundary I am tracking(not color I am at) and main algorithm should look like: 1) detect color of current point 2) look right. Is there same color? yes:add point at the right to stack and exit is there boundary color? no:we are meeting boundary with different color - so we need to track this boundary too. add point at right to stack with opposite direction and boundary color set to current color 3) look forward: similar scheme as to look right 4) look left: again similar 5) exit This should trace boundaries to distance 1 (I hope) and do not miss anything. Problem is that this algorithm never ends, since boundaries will be rescaned again and again. So I need to add an calculated array which should looks like: for every point has mask for all directions that were scanned+calculated mask (set to 1 if pixel is already calculated)+inprocess mask(set to 1 if some other processor is currently calculating it) Scan masks should be set in thime when pixel is added to stack and pixel should not be added in case that mask is already set. I don't this that locks to this array is required since time spent by setting masks should be quite small and possible race conditions should not be drastical(except recalculating some point) I was also thinking about perCPU queues. I think that one queue is OK, it is simpler and should not take much more time(except it will be locked more often but time spend in locked queue in comparison to time spent in rest should be so small so this should not be drastical for less than 10 procesors) At the other hand - perCPU queues should have one advantage - each cpu should own part of image and points from its part will be added to this cpu. This should avoid procesor cache conflict and speed up process. At the other hand, when cpu's queue is empty, cpu will have to browse others queues too and steal some points from other CPU, which should introduce some slowdown and I am not sure if this way will bring any improvement. Other think that should vote for perCPU queue is fact, that in one CPU queue should be more often situations when queue is empty since one procesor is caluclating points and other has wait, since it had tendency to trace just one boundary at the time. At the other hand, most of boundaries should cross broders, so they should be added to queue at the initialization, so this should be OK. I am beginer to threads, SMP etc. So I looking for ideas, and suggestions to improve this alg. (or design different one). Also someone with SMP box, who should test me code is welcomed. BTW what's is the average/maximal number of CPU in today's SMP boxes? Please reply directly to my email:hubicka@paru.cas.cz Thanks Honza * This way is implemented in tracerectangle2/tracepoint. It is enabled * just when threads are compiled in. Also when bthreads=1, old faster * algorithm is used. * * Implementation notes: * 1) I decided to use one queue instead of stack, since I expect, it will * have tendency to trace all boundaries at the time, not just one. * This will make queue bigger and reduce probability of situation, where * queue is empty and other processors has to wait for one, that is * calculating and should add something there (maybe :) * 2) Stack (queue :) is used just when necessary - in situations where queue * is quite full (there is more items than 10) procesor just continues in * tracing path it started. This reduces number of slow stack operations, * locks/unlocks, cache conflicts and other bad thinks. * 3) Just each fourth pixel should be added into queue * 4) Foodfill algorithm should be avoided since colors at the boundaries * are always correct, we should simply go through each scanline and when * pixel is uncalcualted, copy value from its left neighbor * * Current implementation has about 6% lower results than "fast" algorithm * using one thread. When two threads enabled (at my one processor linux * box) lock/unlock overhead eats next 8%, three threads eats next 1% :) */ #include "filter.h" #include "btrace.h" #include "plane.h" #include "calculate.h" // Multithreaded boundary trace suffers from deadlocks so I am temporarily // disabling it until it can be debugged. To re-enable, remove the #define // below and search and replace bthreads to nthreads here and in btraced.h. #define bthreads 1 #define UP 0 #define RIGHT 1 #define DOWN 2 #define LEFT 3 #define turnleft(d) (((d) + 3) & 3) #define turnright(d) (((d) + 1) & 3) #define turnoposite(d) (((d) + 2) & 3) #define callwait() \ if (cfilter.wait_function != NULL) \ cfilter.wait_function(&cfilter); #ifndef bthreads static int size; static unsigned int inset; static int nwaiting; static int exitnow; #define PAGESHIFT 14 #define PAGESIZE (1 << PAGESHIFT) #define MAXPAGES \ 200 /*Well limit is about 6MB of stack..Hope it will never overflow */ #define MAXSIZE (MAXPAGES * PAGESIZE - 1) struct stack { int color; short x, y; char direction; }; static int npages[MAXTHREADS]; static struct stack *pages[MAXPAGES]; static struct stack **starts[MAXTHREADS]; static int sizes[MAXTHREADS]; static int maxsize, maxsize2; static const signed char dirrections[][2] = { {0, -1}, {1, 0}, {0, 1}, {-1, 0}, }; #define addstack(sx, sy, d, c, periodicity) \ { \ int page; \ int nstack = (((sy)-ystart) * bthreads) / (yend - ystart + 1); \ struct stack *ptr; \ calculated[sx + sy * CALCWIDTH] |= 1 << d; \ xth_lock(0); \ if (size < maxsize2) { \ while (sizes[nstack] >= maxsize) \ if (nstack >= bthreads - 1) \ nstack = 0; \ else \ nstack++; \ page = sizes[nstack] >> PAGESHIFT; \ if (page == npages[nstack]) \ starts[nstack][npages[nstack]] = \ (struct stack *)malloc(sizeof(struct stack) * PAGESIZE), \ npages[nstack]++; \ ptr = starts[nstack][page] + (sizes[nstack] & (PAGESIZE - 1)); \ ptr->x = sx; \ ptr->y = sy; \ if (periodicity) \ ptr->direction = d | 8; \ else \ ptr->direction = d; \ ptr->color = c; \ size++; \ sizes[nstack]++; \ if (nwaiting) \ xth_wakefirst(0); \ } \ xth_unlock(0); \ } /*Non locking one used by init code */ #define addstack1(sx, sy, d, c) \ { \ int page; \ struct stack *ptr; \ int nstack = (((sy)-y1) * bthreads) / (y2 - y1 + 1); \ calculated[sx + sy * CALCWIDTH] |= 1 << d; \ if (size < maxsize2) { \ while (sizes[nstack] >= maxsize) \ if (nstack == bthreads - 1) \ nstack = 0; \ else \ nstack++; \ page = sizes[nstack] >> PAGESHIFT; \ if (page == npages[nstack]) \ starts[nstack][npages[nstack]] = \ (struct stack *)malloc(sizeof(struct stack) * PAGESIZE), \ npages[nstack]++; \ ptr = starts[nstack][page] + (sizes[nstack] & (PAGESIZE - 1)); \ ptr->x = sx; \ ptr->y = sy; \ ptr->direction = d | 8; \ ptr->color = c; \ size++; \ sizes[nstack]++; \ } \ } static int xstart, ystart, xend, yend; #endif static unsigned char *calculated; #define CALCULATED 16 #define CALCULATING 32 #define CALCWIDTH cimage.width static number_t *xcoord, *ycoord; #ifndef inline static pixel32_t calculatepixel(int x, int y, int peri) { return (calculate(xcoord[x], ycoord[y], peri)); } #else #define calculatepixel(x, y, peri) (calculate(xcoord[x], ycoord[y], peri)) #endif #define putpixel(x, y, c) p_setp((cpixel_t *)cimage.currlines[y], x, c) #define getpixel(x, y) p_getp((cpixel_t *)cimage.currlines[y], x) #include "c256.h" #define tracecolor tracecolor8 #define tracepoint tracepoint8 #define dosymmetries dosymmetries8 #define queue queue8 #define bfill bfill8 #include "btraced.h" #include "hicolor.h" #define tracecolor tracecolor16 #define tracepoint tracepoint16 #define dosymmetries dosymmetries16 #define queue queue16 #define bfill bfill16 #include "btraced.h" #include "true24.h" #define tracecolor tracecolor24 #define tracepoint tracepoint24 #define dosymmetries dosymmetries24 #define queue queue24 #define bfill bfill24 #include "btraced.h" #include "truecolor.h" #define tracecolor tracecolor32 #define tracepoint tracepoint32 #define dosymmetries dosymmetries32 #define queue queue32 #define bfill bfill32 #include "btraced.h" #include "i18n.h" #ifndef bthreads static int tracerectangle2(int x1, int y1, int x2, int y2) { int x, y; cfilter.max = y2 - y1; cfilter.pass = TR("Message", "Boundary trace"); cfilter.pos = 0; maxsize = MAXPAGES / bthreads; for (y = 0; y < bthreads; y++) { npages[y] = 0; /*stack is empty */ sizes[y] = 0; starts[y] = pages + y * maxsize; } maxsize *= PAGESIZE; maxsize2 = maxsize * bthreads; size = 0; nwaiting = 0; exitnow = 0; inset = cpalette.pixels[0]; for (y = y1; y <= y2; y++) { memset(calculated + x1 + y * CALCWIDTH, 0, x2 - x1 + 1); } for (x = x1; x <= x2; x += 4) { addstack1(x, y1, LEFT, INT_MAX); addstack1(x, y2, RIGHT, INT_MAX); } for (y = y1; y <= y2; y += 4) { addstack1(x1, y, DOWN, INT_MAX); addstack1(x2, y, UP, INT_MAX); } xstart = x1; ystart = y1; xend = x2; yend = y2; switch (cimage.bytesperpixel) { case 1: xth_function(queue8, NULL, 1); xth_sync(); xth_function(bfill8, NULL, yend - ystart - 1); break; #ifdef SUPPORT16 case 2: xth_function(queue16, NULL, 1); xth_sync(); xth_function(bfill16, NULL, yend - ystart - 1); break; #endif #ifdef STRUECOLOR24 case 3: xth_function(queue24, NULL, 1); xth_sync(); xth_function(bfill24, NULL, yend - ystart - 1); break; #endif case 4: xth_function(queue32, NULL, 1); xth_sync(); xth_function(bfill32, NULL, yend - ystart - 1); break; } xth_sync(); for (y = 0; y < bthreads; y++) for (x = 0; x < npages[y]; x++) free(starts[y][x]); /*free memory allocated for stack */ return 1; } #endif static void skip(int x1, int y1, int x2, int y2) { int src = y1; int xstart = x1 * cimage.bytesperpixel; int xsize = (x2 - x1 + 1) * cimage.bytesperpixel; y1++; for (; y1 <= y2; y1++) { memcpy(cimage.currlines[y1] + xstart, cimage.currlines[src] + xstart, xsize); ycoord[y1] = ycoord[src]; } } static int tracerectangle(int x1, int y1, int x2, int y2) { int x, y; unsigned char *calc; cfilter.max = y2 - y1; cfilter.pass = TR("Message", "Boundary trace"); cfilter.pos = 0; for (y = y1; y <= y2; y++) { memset(calculated + x1 + y * CALCWIDTH, 0, (size_t)(x2 - x1 + 1)); } switch (cimage.bytesperpixel) { case 1: for (y = y1; y <= y2; y++) { calc = calculated + y * CALCWIDTH; for (x = x1; x <= x2; x++) if (!calc[x]) { tracecolor8(x1, y1, x2, y2, x, y); } cfilter.pos = y - y1; callwait(); if (cfilter.interrupt) { skip(x1, y, x2, y2); return 0; } } break; #ifdef SUPPORT16 case 2: for (y = y1; y <= y2; y++) { calc = calculated + y * CALCWIDTH; for (x = x1; x <= x2; x++) if (!calc[x]) { tracecolor16(x1, y1, x2, y2, x, y); } cfilter.pos = y - y1; callwait(); if (cfilter.interrupt) { skip(x1, y, x2, y2); return 0; } } break; #endif #ifdef STRUECOLOR24 case 3: for (y = y1; y <= y2; y++) { calc = calculated + y * CALCWIDTH; for (x = x1; x <= x2; x++) if (!calc[x]) { tracecolor24(x1, y1, x2, y2, x, y); } cfilter.pos = y - y1; callwait(); if (cfilter.interrupt) { skip(x1, y, x2, y2); return 0; } } #endif case 4: for (y = y1; y <= y2; y++) { calc = calculated + y * CALCWIDTH; for (x = x1; x <= x2; x++) if (!calc[x]) { tracecolor32(x1, y1, x2, y2, x, y); } cfilter.pos = y - y1; callwait(); if (cfilter.interrupt) { skip(x1, y, x2, y2); return 0; } } break; } return 1; } int boundarytrace(int x1, int y1, int x2, int y2, number_t *xpos, number_t *ypos) { int i; int i1; int xsym, ysym; int cy1, cy2; int cx1, cx2; int ydiv; calculated = (unsigned char *)malloc(cimage.width * (y2 + 1)); if (calculated == NULL) { return 0; } xcoord = xpos; ycoord = ypos; if (cursymmetry.xsym < cfractalc.rs.nc || cursymmetry.xsym > cfractalc.rs.mc) xsym = -10; else xsym = (int)(0.5 + ((cursymmetry.xsym - cfractalc.rs.nc) * cimage.width / (cfractalc.rs.mc - cfractalc.rs.nc))); if (cursymmetry.ysym < cfractalc.rs.ni || cursymmetry.ysym > cfractalc.rs.mi) ysym = -10; else ysym = (int)(0.5 + ((cursymmetry.ysym - cfractalc.rs.ni) * cimage.height / (cfractalc.rs.mi - cfractalc.rs.ni))); ydiv = (int)(0.5 + ((-cfractalc.rs.ni) * cimage.height / (cfractalc.rs.mi - cfractalc.rs.ni))); if (xsym > x1 && xsym < x2) { if (xsym - x1 > x2 - xsym) cx1 = x1, cx2 = xsym; else /*xsym--, */ cx1 = xsym, cx2 = x2; } else xsym = -1, cx1 = x1, cx2 = x2; if (ysym > y1 && ysym < y2) { if (ysym - y1 > y2 - ysym) cy1 = y1, cy2 = ysym; else cy1 = ysym, cy2 = y2; } else ysym = -1, cy1 = y1, cy2 = y2; for (i = cx1; i <= cx2; i++) { xcoord[i] = cfractalc.rs.nc + i * (cfractalc.rs.mc - cfractalc.rs.nc) / cimage.width; } for (i = cy1; i <= cy2; i++) { ycoord[i] = cfractalc.rs.ni + i * (cfractalc.rs.mi - cfractalc.rs.ni) / cimage.height; } i = 1; #ifndef bthreads if (bthreads != 1) { if (ydiv > cy1 && ydiv < cy2) { i |= tracerectangle2(cx1, cy1, cx2, ydiv), i |= tracerectangle2(cx1, ydiv, cx2, cy2); } else i |= tracerectangle2(cx1, cy1, cx2, cy2); } else #endif { if (ydiv > cy1 && ydiv < cy2) { i |= tracerectangle(cx1, cy1, cx2, ydiv), i |= tracerectangle(cx1, ydiv, cx2, cy2); } else i |= tracerectangle(cx1, cy1, cx2, cy2); } if (!i) { free(calculated); return 0; } free(calculated); drivercall(cimage, dosymmetries8(x1, x2, y1, y2, xsym, cx1, cx2), dosymmetries16(x1, x2, y1, y2, xsym, cx1, cx2), dosymmetries24(x1, x2, y1, y2, xsym, cx1, cx2), dosymmetries32(x1, x2, y1, y2, xsym, cx1, cx2)); for (i = cx1; i <= cx2; i++) { if (xsym != -1) { i1 = 2 * xsym - i; if (i1 >= x1 && i1 <= x2 && i != i1) xcoord[i1] = 2 * cursymmetry.xsym - xcoord[i]; } } for (i = cy1; i <= cy2; i++) { if (ysym != -1) { i1 = 2 * ysym - i; if (i1 >= y1 && i1 <= y2 && i != i1) ycoord[i1] = 2 * cursymmetry.ysym - ycoord[i]; } } if (cy1 != y1) { int yy1, yy2; int xstart = x1 * cimage.bytesperpixel; int xsize = (x2 - x1 + 1) * cimage.bytesperpixel; yy1 = y1; yy2 = 2 * ysym - y1; while (yy1 < yy2) { memcpy(cimage.currlines[yy1] + xstart, cimage.currlines[yy2] + xstart, (size_t)xsize); yy1++; yy2--; } } if (cy2 != y2) { int yy1, yy2; int xstart = x1 * cimage.bytesperpixel; int xsize = (x2 - x1 + 1) * cimage.bytesperpixel; yy1 = y2; yy2 = 2 * ysym - y2; while (yy1 > yy2) { memcpy(cimage.currlines[yy1] + xstart, cimage.currlines[yy2] + xstart, (size_t)xsize); yy1--; yy2++; } } return 1; } int boundarytraceall(number_t *xpos, number_t *ypos) { return ( boundarytrace(0, 0, cimage.width - 1, cimage.height - 1, xpos, ypos)); } XaoS-release-4.3.2/src/engine/btraced.h000066400000000000000000000360151455214672000176340ustar00rootroot00000000000000#ifndef UNSUPPORTED static void tracecolor(int xstart, int ystart, int xend, int yend, int x, int y) { int dir = RIGHT, fill = 0; unsigned char *calc; int peri = 0; cpixeldata_t c = (cpixeldata_t)calculatepixel(x, y, 0); cpixeldata_t w = (cpixeldata_t)0; cpixeldata_t inset = (cpixeldata_t)cpalette.pixels[0]; putpixel(x, y, c); calc = calculated + x + y * CALCWIDTH; *calc = (unsigned char)1; while (x > xstart && getpixel(x - 1, y) == c) x--, calc--; *calc = (unsigned char)2; if (c == inset) peri = 1; do { if (!fill && !*calc) { *calc = (unsigned char)1; putpixel(x, y, c); } switch (dir) { case RIGHT: if (y > ystart) { if (!*(calc - CALCWIDTH)) { w = (cpixeldata_t)calculatepixel(x, y - 1, peri); putpixel(x, y - 1, w); *(calc - CALCWIDTH) = (unsigned char)1; } else w = getpixel(x, y - 1); if (w == c) { dir = UP; calc -= CALCWIDTH; y--; break; } } if (x < xend) { if (!*(calc + 1)) { w = (cpixeldata_t)calculatepixel(x + 1, y, peri); putpixel(x + 1, y, w); *(calc + 1) = (unsigned char)1; } else w = getpixel(x + 1, y); if (w == c) { calc++; x++; break; } } if (y < yend) { if (!*(calc + CALCWIDTH)) { w = (cpixeldata_t)calculatepixel(x, y + 1, peri); putpixel(x, y + 1, w); *(calc + CALCWIDTH) = (unsigned char)1; } else w = getpixel(x, y + 1); if (w == c) { dir = DOWN; calc += CALCWIDTH; y++; break; } } if (*calc == (unsigned char)2) { *calc = (unsigned char)1; return; } dir = LEFT; x--; calc--; break; case LEFT: if (y < yend) { if (!*(calc + CALCWIDTH)) { w = (cpixeldata_t)calculatepixel(x, y + 1, peri); putpixel(x, y + 1, w); *(calc + CALCWIDTH) = (unsigned char)1; } else w = getpixel(x, y + 1); if (w == c) { dir = DOWN; calc += CALCWIDTH; y++; break; } } if (x > xstart) { if (!*(calc - 1)) { w = (cpixeldata_t)calculatepixel(x - 1, y, peri); putpixel(x - 1, y, w); *(calc - 1) = (unsigned char)1; } else w = getpixel(x - 1, y); if (w == c) { calc--; x--; break; } } if (y > ystart) { if (!*(calc - CALCWIDTH)) { w = (cpixeldata_t)calculatepixel(x, y - 1, peri); putpixel(x, y - 1, w); *(calc - CALCWIDTH) = (unsigned char)1; } else w = getpixel(x, y - 1); if (w == c) { dir = UP; calc -= CALCWIDTH; y--; break; } } dir = RIGHT; x++; calc++; break; case UP: if (fill) { unsigned char *calc1; cpixel_t *pixel1; calc1 = calc + 1; pixel1 = p_add((cpixel_t *)cimage.currlines[y], x + 1); while (pixel1 <= p_add((cpixel_t *)cimage.currlines[y], xend)) { if (!*calc1) *calc1 = (unsigned char)1, p_set(pixel1, c); else if (p_get(pixel1) != c) break; p_inc(pixel1, 1); calc1++; } } if (x > xstart) { if (!*(calc - 1)) { w = (cpixeldata_t)calculatepixel(x - 1, y, peri); putpixel(x - 1, y, w); *(calc - 1) = (unsigned char)1; } w = getpixel(x - 1, y); if (w == c) { dir = LEFT; calc--; x--; break; } } if (y > ystart) { if (!*(calc - CALCWIDTH)) { w = (cpixeldata_t)calculatepixel(x, y - 1, peri); putpixel(x, y - 1, w); *(calc - CALCWIDTH) = (unsigned char)1; } w = getpixel(x, y - 1); if (w == c) { calc -= CALCWIDTH; y--; break; } } if (x < xend) { if (!*(calc + 1)) { w = (cpixeldata_t)calculatepixel(x + 1, y, peri); putpixel(x + 1, y, w); *(calc + 1) = (unsigned char)1; } else w = getpixel(x + 1, y); if (w == c) { dir = RIGHT; calc++; x++; break; } } dir = DOWN; y++; calc += CALCWIDTH; break; case DOWN: if (x < xend) { if (!*(calc + 1)) { w = (cpixeldata_t)calculatepixel(x + 1, y, peri); putpixel(x + 1, y, w); *(calc + 1) = (unsigned char)1; } else w = getpixel(x + 1, y); if (w == c) { dir = RIGHT; calc++; x++; break; } } if (y < yend) { if (!*(calc + CALCWIDTH)) { w = (cpixeldata_t)calculatepixel(x, y + 1, peri); putpixel(x, y + 1, w); *(calc + CALCWIDTH) = (unsigned char)1; } else w = getpixel(x, y + 1); if (w == c) { dir = DOWN; calc += CALCWIDTH; y++; break; } } if (x > xstart) { if (!*(calc - 1)) { w = (cpixeldata_t)calculatepixel(x - 1, y, peri); putpixel(x - 1, y, w); *(calc - 1) = (unsigned char)1; } else w = getpixel(x - 1, y); if (w == c) { dir = LEFT; calc--; x--; break; } } dir = UP; calc -= CALCWIDTH; y--; break; } if (*calc == (unsigned char)2) { if (fill) { *calc = (unsigned char)1; return; } fill = 1; dir = RIGHT; } } while (1); } #ifndef bthreads #define ethreads 1 static inline void tracepoint(int xp, int yp, int dir, unsigned int color, int xstart, int xend, int ystart, int yend) { unsigned char *calc; cpixeldata_t mycolor; int i, lookdir; unsigned int c; int x, y; int periodicity = (dir & 8) != 0; dir &= ~8; calc = calculated + xp + yp * CALCWIDTH; if (!(*calc & (CALCULATED | CALCULATING))) { *calc |= CALCULATING; mycolor = (cpixeldata_t)calculatepixel(xp, yp, periodicity); putpixel(xp, yp, mycolor); *calc |= CALCULATED; *calc &= ~CALCULATING; } else { if (*calc & CALCULATING) { /*Bad luck..some other procesor is working with out pixel :) try *later.*/ addstack(xp, yp, dir, color, periodicity); return; } mycolor = getpixel(xp, yp); } while (1) { periodicity = (mycolor == inset || color == inset); lookdir = turnright(dir); for (i = 0; i < 3; i++) { x = xp + dirrections[lookdir][0]; y = yp + dirrections[lookdir][1]; if (x >= xstart && x <= xend && y >= ystart && y <= yend) { calc = calculated + x + y * CALCWIDTH; if (!(*calc & (CALCULATED | CALCULATING))) { *calc |= CALCULATING; c = calculatepixel(x, y, periodicity); putpixel(x, y, c); *calc |= CALCULATED; *calc &= ~CALCULATING; } else { if (*calc & CALCULATING) { /*Bad luck..some other procesor is working with out *pixel :) try later.*/ addstack(xp, yp, dir, color, periodicity); return; } c = getpixel(x, y); } if (c == mycolor) break; if (c != color) { int dir2 = turnright(lookdir); int mask = (1 << dir2) + (1 << turnright(dir2)); if (!(*calc & mask)) { addstack(x, y, dir2, mycolor, periodicity); } color = c; } } lookdir = turnleft(lookdir); } x = xp + dirrections[lookdir][0]; y = yp + dirrections[lookdir][1]; if (x >= xstart && x <= xend && y >= ystart && y <= yend) { calc = calculated + x + y * CALCWIDTH; if (!(*calc & (1 << lookdir))) { *calc |= (1 << lookdir); if (size < 10) { addstack(x, y, lookdir, color, periodicity); return; } else { xp = x; yp = y; dir = lookdir; calc = calculated + xp + yp * CALCWIDTH; } } else return; } else return; } } static void queue(void *data, struct taskinfo *task, int r1, int r2) { int x, y, d, c; int pos = 0; while (1) { int nstack; xth_lock(0); while (!size) { /*Well stack is empty. */ if (exitnow) { /*Possibly everything is done now.. */ xth_unlock(0); return; } if (nwaiting == bthreads - 1) { /*We are last working CPU */ exitnow = 1; /*So we should exit now */ xth_wakeup(0); /*Wake up all waiting tasks */ xth_unlock(0); return; /*and exit :) */ } nwaiting++; /*We are not latest task. */ xth_sleep(0, 0); /*Wait until other task will push some data */ nwaiting--; if (exitnow) { /*Everything is done now? */ xth_unlock(0); return; } } nstack = xth_nthread(task); while (!sizes[nstack]) if (nstack != bthreads - 1) nstack++; else nstack = 0; sizes[nstack]--; size--; pos++; if (pos >= sizes[nstack]) pos = 0; x = starts[nstack][pos >> PAGESHIFT][pos & (PAGESIZE - 1)].x; y = starts[nstack][pos >> PAGESHIFT][pos & (PAGESIZE - 1)].y; d = starts[nstack][pos >> PAGESHIFT][pos & (PAGESIZE - 1)].direction; c = starts[nstack][pos >> PAGESHIFT][pos & (PAGESIZE - 1)].color; /* Well stack currently is queue. Should have better results at * SMP, since has tendency trace all ways at time, so (I believe) * should avoid some cache conflict and situation where queue is * empty. At the other hand, makes queue bigger and needs following * copy: */ starts[nstack][pos >> PAGESHIFT][pos & (PAGESIZE - 1)] = starts[nstack][sizes[nstack] >> PAGESHIFT] [sizes[nstack] & (PAGESIZE - 1)]; xth_unlock(0); tracepoint(x, y, d, c, xstart, xend, ystart, yend); } } static void bfill(void *dat, struct taskinfo *task, int r1, int r2) { int y; cpixel_t *pos, *end; unsigned char *data; r1 += ystart + 1; r2 += ystart + 1; for (y = r1; y < r2; y++) { pos = p_add((cpixel_t *)cimage.currlines[y], xstart + 1); end = p_add((cpixel_t *)cimage.currlines[y], xend); data = calculated + xstart + y * CALCWIDTH + 1; for (; pos < end; p_inc(pos, 1), data++) { if (!*data) p_copy(pos, 0, pos, -1); } } } #undef ethreads #endif static void dosymmetries(int x1, int x2, int y1, int y2, int xsym, int cx1, int cx2) { if (cx1 != x1) { int y; cpixel_t *xx1, *xx2; for (y = y1; y <= y2; y++) { xx1 = p_add((cpixel_t *)cimage.currlines[y], x1); xx2 = p_add((cpixel_t *)cimage.currlines[y], 2 * xsym - x1); while (xx1 < xx2) { p_copy(xx1, 0, xx2, 0); p_inc(xx1, 1); p_inc(xx2, -1); } } } if (cx2 != x2) { int y; cpixel_t *xx1, *xx2; for (y = y1; y <= y2; y++) { xx1 = p_add((cpixel_t *)cimage.currlines[y], x2); xx2 = p_add((cpixel_t *)cimage.currlines[y], 2 * xsym - x2); while (xx1 > xx2) { p_copy(xx1, 0, xx2, 0); p_inc(xx1, -1); p_inc(xx2, 1); } } } } #endif #undef dosymmetries #undef tracepoint #undef tracecolor #undef queue #undef bfill XaoS-release-4.3.2/src/engine/calculate.h000066400000000000000000000015001455214672000201540ustar00rootroot00000000000000 static pixel32_t inline calculate(number_t x, number_t y, int periodicity); static pixel32_t inline calculate(number_t x, number_t y, int periodicity) { pixel32_t i; rotateback(cfractalc, x, y); if (cfractalc.plane) { recalculate(cfractalc.plane, &x, &y); } STAT(ncalculated2++); if (cfractalc.mandelbrot) { if (cformula.flags & STARTZERO) i = cfractalc.calculate[periodicity](cfractalc.bre, cfractalc.bim, x, y); else i = cfractalc.calculate[periodicity](x + cfractalc.bre, y + cfractalc.bim, x, y); } else i = cfractalc.calculate[periodicity](x, y, cfractalc.pre, cfractalc.pim); return (i); } XaoS-release-4.3.2/src/engine/docalc.h000066400000000000000000000515361455214672000174620ustar00rootroot00000000000000 /* Hello reader! * Are you sure you want read this? Its very cryptic and strange code. YOU * HAVE BEEN WARNED! Its purpose is to generate as fast as possible * calculation loops for various formulas/algorithms. It uses lots of * coprocesor magic. It is included from formulas.c */ #ifndef VARIABLES /*supply defaultd values */ #define VARIABLES #endif #ifndef PRETEST #define PRETEST 0 #endif #ifndef INIT #define INIT #endif #ifndef POSTCALC #define POSTCALC #endif #ifndef PRESMOOTH #define PRESMOOTH zre = rp + ip #endif #ifndef UFORMULA #define UFORMULA FORMULA #endif #ifndef UEND #define UEND #endif #ifndef SAVE #define SAVE #endif #ifndef SAVEVARIABLES #define SAVEVARIABLES #endif #ifndef RESTORE #define RESTORE #endif #ifndef RANGE #define RANGE 2 #endif /* Prepare main loop */ #ifndef NSFORMULALOOP #define NSFORMULALOOP(iter) \ do { /*try first 8 iterations */ \ FORMULA; \ iter--; \ } while (BTEST && iter) #endif #ifndef SFORMULALOOP #define SFORMULALOOP(iter) \ do { /*try first 8 iterations */ \ SAVEZMAG; \ FORMULA; \ iter--; \ } while (BTEST && iter) #endif #ifndef FORMULALOOP #ifdef SMOOTHMODE #define FORMULALOOP SFORMULALOOP #else #define FORMULALOOP NSFORMULALOOP #endif #endif #ifdef SMOOTHMODE #ifdef CUSTOMSAVEZMAG #define SAVEZMAG CUSTOMSAVEZMAG; #else #define SAVEZMAG szmag = rp + ip; #endif #else #define SAVEZMAG #endif #ifdef UNCOMPRESS /*uncompressed version of loop */ #ifdef SMOOTHMODE static unsigned int SCALC(number_t zre, number_t zim, number_t pre, number_t pim); static unsigned int SCALC(number_t zre, number_t zim, number_t pre, number_t pim) #else static unsigned int CALC(number_t zre, number_t zim, number_t pre, number_t pim); static unsigned CALC(number_t zre, number_t zim, number_t pre, number_t pim) #endif { unsigned int iter = cfractalc.maxiter; number_t szre = 0, szim = 0; #ifdef RPIP number_t rp = 0, ip; #endif #ifdef SMOOTHMODE number_t szmag = 0; #endif SAVEVARIABLES VARIABLES; INIT; if (PRETEST) iter = 0; else { #ifdef RPIP rp = zre * zre; ip = zim * zim; #endif if (iter < 16) { /*try first 8 iterations */ if (BTEST && iter) { FORMULALOOP(iter); } /* while (BTEST && iter) { SAVEZMAG; FORMULA; iter--; } */ } else { iter = 8 + (cfractalc.maxiter & 7); /*try first 8 iterations */ if (BTEST && iter) { FORMULALOOP(iter); } /* while (BTEST && iter) { SAVEZMAG; FORMULA; iter--; } */ if (BTEST) { iter = (cfractalc.maxiter - 8) & (~7); iter >>= 3; /*do next 8 iteration w/o out of bounds checking */ do { /*hmm..we are probably in some deep area. */ szre = zre; /*save current position */ szim = zim; SAVE; UFORMULA; UFORMULA; UFORMULA; UFORMULA; UFORMULA; UFORMULA; UFORMULA; UFORMULA; UEND; iter--; } while (BTEST && iter); if (!(BTEST)) { /*we got out of bounds */ iter <<= 3; iter += 8; /*restore saved position */ RESTORE; zre = szre; zim = szim; #ifdef RPIP rp = zre * zre; ip = zim * zim; #endif FORMULALOOP(iter); /* do { SAVEZMAG FORMULA; iter--; } while (BTEST && iter); */ } } else iter += cfractalc.maxiter - 8 - (cfractalc.maxiter & 7); } } #ifdef SMOOTHMODE if (iter) SMOOTHOUTPUT(); POSTCALC; iter = cfractalc.maxiter - iter; INOUTPUT(); #else POSTCALC; iter = cfractalc.maxiter - iter; OUTPUT(); #endif } #else #ifdef SMOOTHMODE static unsigned int SCALC(number_t zre, number_t zim, number_t pre, number_t pim); static unsigned int SCALC(number_t zre, number_t zim, number_t pre, number_t pim) #else static unsigned int CALC(number_t zre, number_t zim, number_t pre, number_t pim); static unsigned int CALC(number_t zre, number_t zim, number_t pre, number_t pim) #endif { unsigned int iter = cfractalc.maxiter /*& (~(int) 3) */; #ifdef RPIP number_t rp, ip; #endif #ifdef SMOOTHMODE number_t szmag = 0; #endif VARIABLES; INIT; if (PRETEST) iter = 0; else { #ifdef RPIP rp = zre * zre; ip = zim * zim; #endif if (BTEST && iter) { FORMULALOOP(iter); } /* while (BTEST && iter) { SAVEZMAG FORMULA; iter--; } */ } #ifdef SMOOTHMODE if (iter) SMOOTHOUTPUT(); POSTCALC; iter = cfractalc.maxiter - iter; INOUTPUT(); #else POSTCALC; iter = cfractalc.maxiter - iter; OUTPUT(); #endif } #endif /*F. : Periodicity checking routines. (16-02-97) All comments preceded by F. are mine (Fabrice Premel premelfa@etu.utc.fr). Tried to make code as efficient as possible. Next to do is convert lim in a variable that would be updated sometimes I'll try to make here a short explanation on periodicity checking : first, we'll define 2 variables : whentosave and whenincsave, which are, respectively, a measure of when we have to update saved values to be checked, and when to increase interval between 2 updates, as if they're too close, we'll miss large periods. We save Z at the beginning, and then we compare each new iteration with this Z, and if naerly equal, we declare the suite to be periodic. When ( iter mod whentosave ) == 0, we store a new value, and we repeat. UNCOMPRESSed form is just an extension, with careful that if we only check whentosave all 8 iterations, number of iterations must be well set at the beginning.This is done by adding a (iter&7) in the while statement preceding then uncompressed calculation. */ /*F. : This is from then lim factor that depends all periodicity check spped : the bigger it is, the faster we can detect periodicity, but the bigger it is, the more we can introduce errors. I suggest a value of (maxx-minx)/(double)getmaxx for a classic Mandelbrot Set, and maybe a lesser value for an extra power Mandelbrot. But this should be calculated outer from here (ie each frame, for example), to avoid new calculus */ #ifdef PERI #define PCHECK \ (abs_less_than(r1 - zre, cfractalc.periodicity_limit) && \ abs_less_than(s1 - zim, cfractalc.periodicity_limit)) #ifndef UNCOMPRESS #ifdef SMOOTHMODE static unsigned int SPERI(number_t zre, number_t zim, number_t pre, number_t pim); static unsigned int SPERI(number_t zre, number_t zim, number_t pre, number_t pim) #else static unsigned int PERI(number_t zre, number_t zim, number_t pre, number_t pim); static unsigned int PERI(number_t zre, number_t zim, number_t pre, number_t pim) #endif { unsigned int iter = cfractalc.maxiter /*& (~(int) 3) */, iter1 = 8; number_t r1, s1; int whensavenew, whenincsave; #ifdef RPIP number_t rp, ip; #endif #ifdef SMOOTHMODE number_t szmag = 0; #endif VARIABLES; INIT; if (PRETEST) iter = 0; else { #ifdef RPIP rp = zre * zre; ip = zim * zim; #endif if (iter < iter1) iter1 = iter, iter = 8; /*H. : do first few iterations w/o checking */ if (BTEST && iter1) { FORMULALOOP(iter1); } /* while (BTEST && iter1) { SAVEZMAG; FORMULA; iter1--; } */ if (iter1) { if (iter >= 8) iter -= 8 - iter1; goto end; } if (iter <= 8) { iter = iter1; } else { iter -= 8; r1 = zre; s1 = zim; whensavenew = 3; /*You should adapt these values */ /*F. : We should always define whensavenew as 2^N-1, so we could use * a AND instead of % */ whenincsave = 10; /*F. : problem is that after deep zooming, peiodicity is never detected early, cause is is quite slow before going in a periodic loop. So, we should start checking periodicity only after some times */ while (BTEST && iter) { SAVEZMAG; FORMULA; if ((iter & whensavenew) == 0) { /*F. : changed % to & */ r1 = zre; s1 = zim; whenincsave--; if (!whenincsave) { whensavenew = ((whensavenew + 1) << 1) - 1; /*F. : Changed to define a new AND mask */ whenincsave = 10; } } else { if (PCHECK) { PERIINOUTPUT(); } } iter--; } } } end: #ifdef SMOOTHMODE if (iter) SMOOTHOUTPUT(); POSTCALC; iter = cfractalc.maxiter - iter; INOUTPUT(); #else POSTCALC; iter = cfractalc.maxiter - iter; OUTPUT(); #endif } #else /*F. : UNCOMPRESSed version. Note that whensavenew+1 should be a multiple of 8, else periodicity won't be able to detect anything. */ /*F. : this macros definitions are really strange, but after a while, it's good */ #ifdef SMOOTHMODE static unsigned int SPERI(number_t zre, number_t zim, number_t pre, number_t pim); static unsigned int SPERI(number_t zre, number_t zim, number_t pre, number_t pim) #else static unsigned int PERI(number_t zre, number_t zim, number_t pre, number_t pim); static unsigned int PERI(number_t zre, number_t zim, number_t pre, number_t pim) #endif { unsigned int iter = cfractalc.maxiter /*& (~(int) 3) */; number_t r1 = zre, s1 = zim; number_t szre = 0, szim = 0; /*F. : Didn't declared register, cause they are few used */ unsigned int whensavenew, whenincsave; #ifdef RPIP number_t rp = 0, ip; #endif #ifdef SMOOTHMODE number_t szmag = 0; #endif SAVEVARIABLES VARIABLES; INIT; if (PRETEST) iter = 0; else { if (cfractalc.maxiter <= 16) { #ifdef RPIP rp = zre * zre; ip = zim * zim; #endif /*F. : Added iter&7 to be sure we'll be on a 8 multiple */ if (BTEST && iter) { FORMULALOOP(iter); } /* while (BTEST && iter) { SAVEZMAG FORMULA; iter--; } */ } else { whensavenew = 7; /*You should adapt these values */ /*F. : We should always define whensavenew as 2^N-1, so we could use * a AND instead of % */ whenincsave = 10; #ifdef RPIP rp = zre * zre; ip = zim * zim; #endif /*F. : problem is that after deep zooming, peiodicity is never detected early, cause is is quite slow before going in a periodic loop. So, we should start checking periodicity only after some times */ iter = 8 + (cfractalc.maxiter & 7); while (BTEST && iter) { /*F. : Added iter&7 to be sure we'll be on a 8 multiple */ SAVEZMAG FORMULA; iter--; } if (BTEST) { /*F. : BTEST is calculed two times here, isn't it ? */ /*H. : No gcc is clever and adds test to the end :) */ iter = (cfractalc.maxiter - 8) & (~7); do { szre = zre, szim = zim; SAVE; SAVEZMAG FORMULA; /*F. : Calculate one time */ if (PCHECK) goto periodicity; FORMULA; if (PCHECK) goto periodicity; FORMULA; if (PCHECK) goto periodicity; FORMULA; if (PCHECK) goto periodicity; FORMULA; if (PCHECK) goto periodicity; FORMULA; if (PCHECK) goto periodicity; FORMULA; if (PCHECK) goto periodicity; FORMULA; if (PCHECK) goto periodicity; iter -= 8; /*F. : We only test this now, as it can't be true before */ if ((iter & whensavenew) == 0) { /*F. : changed % to & */ r1 = zre, s1 = zim; /*F. : Save new values */ whenincsave--; if (!whenincsave) { whensavenew = ((whensavenew + 1) << 1) - 1; /*F. : Changed to define a new AND mask */ whenincsave = 10; /*F. : Start back */ } } } while (BTEST && iter); if (!BTEST) { /*we got out of bounds */ iter += 8; /*restore saved position */ RESTORE; zre = szre; zim = szim; #ifdef RPIP rp = zre * zre; ip = zim * zim; #endif FORMULALOOP(iter); /* do { SAVEZMAG FORMULA; iter--; } while (BTEST && iter); */ } } else iter += cfractalc.maxiter - 8 - (cfractalc.maxiter & 7); } } #ifdef SMOOTHMODE if (iter) SMOOTHOUTPUT(); POSTCALC; iter = cfractalc.maxiter - iter; INOUTPUT(); #else POSTCALC; iter = cfractalc.maxiter - iter; OUTPUT(); #endif periodicity: PERIINOUTPUT(); } /*else uncompress */ #endif /*endif PERI */ #undef PCHECK #endif #ifndef SMOOTHMODE #ifdef JULIA static void JULIA(struct image *image, number_t pre, number_t pim) { int i, i1, i2, j, x, y; unsigned char iter, itmp2, itmp; number_t rp = 0, ip = 0; number_t zre, zim, im, xdelta, ydelta, range, rangep; number_t xstep, ystep; unsigned char *queue[QMAX]; unsigned char **qptr; unsigned char *addr, **addr1 = image->currlines; #ifdef STATISTICS int guessed = 0, unguessed = 0, iters = 0; #endif VARIABLES; range = (number_t)RANGE; rangep = range * range; xdelta = image->width / (RMAX - RMIN); ydelta = image->height / (IMAX - IMIN); xstep = (RMAX - RMIN) / image->width; ystep = (IMAX - IMIN) / image->height; init_julia(image, rangep, range, xdelta, ystep); for (i2 = 0; i2 < 2; i2++) for (i1 = 0; i1 < image->height; i1++) { if (i1 % 2) i = image->height / 2 - i1 / 2; else i = image->height / 2 + i1 / 2 + 1; if (i >= image->height) continue; im = IMIN + (i + 0.5) * ystep; for (j = (i + i2) & 1; j < image->width; j += 2) { STAT(total2++); addr = addr1[i] + j; if (*addr != NOT_CALCULATED) continue; x = j; y = i; if (y > 0 && y < image->height - 1 && *(addr + 1) && x > 0 && x < image->width - 1) { if ((iter = *(addr + 1)) != NOT_CALCULATED && iter == *(addr - 1) && iter == addr1[y - 1][x] && iter == addr1[y + 1][x]) { *addr = *(addr + 1); continue; } } zim = im; zre = RMIN + (j + 0.5) * xstep; iter = (unsigned char)0; qptr = queue; ip = (zim * zim); rp = (zre * zre); INIT; while (1) { if (*addr != NOT_CALCULATED #ifdef SAG && (*addr == INPROCESS || (*addr != (unsigned char)1 && (itmp2 = *(addr + 1)) != NOT_CALCULATED && ((itmp2 != (itmp = *(addr - 1)) && itmp != NOT_CALCULATED) || (itmp2 != (itmp = *((addr1[y + 1]) + x)) && itmp != NOT_CALCULATED) || (itmp2 != (itmp = *((addr1[y - 1]) + x)) && itmp != NOT_CALCULATED)))) #endif ) { if (*addr == INPROCESS || *addr == INSET) { *qptr = addr; qptr++; STAT(guessed++); goto inset; } STAT(guessed++); iter = *addr; goto outset; } #ifdef STATISTICS if (*addr != NOT_CALCULATED) unguessed++; #endif if (*addr != INPROCESS) { *qptr = addr; qptr++; *addr = INPROCESS; if (qptr >= queue + QMAX) goto inset; } STAT(iters++); FORMULA; ip = (zim * zim); rp = (zre * zre); if (greater_than(rp + ip, RANGE) || !(BTEST)) goto outset; x = (int)((zre - RMIN) * xdelta); y = (int)((zim - IMIN) * ydelta); addr = addr1[y] + x; if ((itmp = *(addr + 1)) != NOT_CALCULATED && itmp == *(addr - 1) && itmp == addr1[y - 1][x] && itmp == addr1[y + 1][x]) { *addr = *(addr + 1); } } inset: while (qptr > queue) { qptr--; **qptr = INSET; } continue; outset: y = image->palette->size; while (qptr > queue) { qptr--; iter++; if ((int)iter >= y) iter = (unsigned char)1; **qptr = iter; } } } #ifdef STATISTICS printf("guessed %i, unguessed %i, iterations %i\n", guessed, unguessed, iters); guessed2 += guessed; unguessed2 += unguessed; iters2 += iters; #endif } #endif #endif #undef FORMULALOOP #undef PCHECK #undef SAVEZMAG #ifndef SMOOTHMODE #ifdef SMOOTH #define SMOOTHMODE #include "docalc.h" #endif #endif /*cleanup for next formula */ #undef NSFORMULALOOP #undef SFORMULALOOP #undef PRESMOOTH #undef SMOOTH #undef SMOOTHMODE #undef RANGE #undef JULIA #undef PERI #undef SPERI #undef INIT #undef VARIABLES #undef PRETEST #undef BTEST #undef FORMULA #undef CALC #undef SCALC #undef RPIP #undef POSTCALC #undef UNCOMPRESS #undef SAVE #undef SAVEVARIABLES #undef RESTORE #undef UFORMULA #undef UEND XaoS-release-4.3.2/src/engine/edge.cpp000066400000000000000000000061331455214672000174650ustar00rootroot00000000000000/* An edge detection filter. * This is very simple filter - it initializes smalliter image and then * does an simple edge detection algo on it. */ #include "config.h" #include #include /*for NULL */ #define SLARGEITER #include "xthread.h" #include "filter.h" #define spixel_t pixel8_t #include "c256.h" #define do_edge do_edge8 #include "edged.h" #undef spixel_t #define spixel_t pixel16_t #include "truecolor.h" #define do_edge do_edge32 #include "edged.h" #include "true24.h" #define do_edge do_edge24 #include "edged.h" #include "hicolor.h" #define do_edge do_edge16 #include "edged.h" static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~IMAGEDATA; r->supportedmask = MASK1BPP | MASK3BPP | MASK2BPP | MASK4BPP; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { inhermisc(f, i); /*in/out coloring modes looks better in iter modes. This also saves some memory in truecolor. */ if (f->data != NULL) destroypalette((struct palette *)f->data); f->data = createpalette( 0, 65536, i->image->bytesperpixel <= 1 ? SMALLITER : LARGEITER, 0, 65536, NULL, NULL, NULL, NULL, NULL); if (!inherimage(f, i, TOUCHIMAGE | NEWIMAGE, 0, 0, (struct palette *)f->data, 0, 0)) return 0; return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); f->name = "Edge detection"; return (f); } static void destroyinstance(struct filter *f) { if (f->data != NULL) destroypalette((struct palette *)f->data); destroyinheredimage(f); free(f); } static int doit(struct filter *f, int flags, int time) { int val; int size = f->childimage->palette->type == SMALLITER ? 240 : 65520; if (f->image->palette->size < size) size = f->image->palette->size; if (((struct palette *)f->data)->size != size) ((struct palette *)f->data)->size = size, ((struct palette *)f->data)->version++; updateinheredimage(f); val = f->previous->action->doit(f->previous, flags, time); drivercall(*f->image, xth_function(do_edge8, f, f->image->height), xth_function(do_edge16, f, f->image->height), xth_function(do_edge24, f, f->image->height), xth_function(do_edge32, f, f->image->height)); xth_sync(); return val; } const struct filteraction edge_filter = {"Edge detection", "edge", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdowngeneric, NULL}; XaoS-release-4.3.2/src/engine/edge2.cpp000066400000000000000000000061541455214672000175520ustar00rootroot00000000000000/* An edge detection filter. * This is very simple filter - it initializes smalliter image and then * does an simple edge detection algo on it. */ #include "config.h" #include #include /*for NULL */ #define SLARGEITER #include "xthread.h" #include "filter.h" #define spixel_t pixel8_t #include "c256.h" #define do_edge do_edge8 #include "edge2d.h" #undef spixel_t #define spixel_t pixel16_t #include "truecolor.h" #define do_edge do_edge32 #include "edge2d.h" #include "true24.h" #define do_edge do_edge24 #include "edge2d.h" #include "hicolor.h" #define do_edge do_edge16 #include "edge2d.h" static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~IMAGEDATA; r->supportedmask = MASK1BPP | MASK2BPP | MASK3BPP | MASK4BPP; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { inhermisc(f, i); /*in/out coloring modes looks better in iter modes. This also saves some memory in truecolor. */ if (f->data != NULL) destroypalette((struct palette *)f->data); f->data = createpalette( 0, 65536, i->image->bytesperpixel <= 1 ? SMALLITER : LARGEITER, 0, 65536, NULL, NULL, NULL, NULL, NULL); if (!inherimage(f, i, TOUCHIMAGE | NEWIMAGE, 0, 0, (struct palette *)f->data, 0, 0)) return 0; return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); f->name = "Edge detection"; return (f); } static void destroyinstance(struct filter *f) { if (f->data != NULL) destroypalette((struct palette *)f->data); destroyinheredimage(f); free(f); } static int doit(struct filter *f, int flags, int time) { int val; int size = f->childimage->palette->type == SMALLITER ? 253 : 65536; if (f->image->palette->size < size) size = f->image->palette->size; if (((struct palette *)f->data)->size != size) ((struct palette *)f->data)->size = size, ((struct palette *)f->data)->version++; updateinheredimage(f); val = f->previous->action->doit(f->previous, flags, time); drivercall(*f->image, xth_function(do_edge8, f, f->image->height), xth_function(do_edge16, f, f->image->height), xth_function(do_edge24, f, f->image->height), xth_function(do_edge32, f, f->image->height)); xth_sync(); return val; } const struct filteraction edge2_filter = {"Edge detection2", "edge2", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdowngeneric, NULL}; XaoS-release-4.3.2/src/engine/edge2d.h000066400000000000000000000031601455214672000173550ustar00rootroot00000000000000#ifndef UNSUPPORTED static void do_edge(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; int y; unsigned int *pixels = f->image->palette->pixels; unsigned int black = f->image->palette->pixels[0]; cpixel_t *output, *end; spixel_t *up, *down, *input; for (y = r1; y < r2; y++) { output = p_add(((cpixel_t *)f->image->currlines[y]), 1); input = ((spixel_t *)f->childimage->currlines[y]) + 1; if (y != 0) up = ((spixel_t *)f->childimage->currlines[y - 1]) + 1; else up = ((spixel_t *)f->childimage->currlines[y]) + 1; if (y != f->image->height - 1) down = ((spixel_t *)f->childimage->currlines[y + 1]) + 1; else down = ((spixel_t *)f->childimage->currlines[y]) + 1; end = p_add(((cpixel_t *)f->image->currlines[y]), f->image->width - 1); p_setp(output, -1, 0); p_setp(output, f->image->width - 2, 0); while (output < end) { if (input[0] > up[0] || input[0] > down[0]) { p_set(output, pixels[input[0]]); } else if (input[0] != input[1]) { if (input[0] < input[1]) { p_set(output, black); p_inc(output, 1); input++; up++; down++; } p_set(output, pixels[input[0]]); } else p_set(output, black); p_inc(output, 1); input++; up++; down++; } } } #endif #undef do_edge XaoS-release-4.3.2/src/engine/edged.h000066400000000000000000000047421455214672000173020ustar00rootroot00000000000000#ifndef UNSUPPORTED static void do_edge(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; int y; unsigned int *pixels = f->image->palette->pixels; unsigned int black = f->image->palette->pixels[0]; cpixel_t *output, *end; spixel_t *up, *down, *input; for (y = r1; y < r2; y++) { output = p_add(((cpixel_t *)f->image->currlines[y]), 1); input = ((spixel_t *)f->childimage->currlines[y]) + 1; if (y != 0) up = ((spixel_t *)f->childimage->currlines[y - 1]) + 2; else up = ((spixel_t *)f->childimage->currlines[y]) + 2; if (y != f->image->height - 1) down = ((spixel_t *)f->childimage->currlines[y + 1]) + 2; else down = ((spixel_t *)f->childimage->currlines[y]) + 2; end = p_add(((cpixel_t *)f->image->currlines[y]), f->image->width - 1); p_setp(output, -1, 0); p_setp(output, f->image->width - 2, 0); while (output < end) { if (input[1] != input[0] || input[0] != up[0] || input[0] != down[0]) { if (output < end - 2) { p_set(output, pixels[input[0]]); p_setp(output, 1, pixels[input[1]]); p_setp(output, 2, pixels[input[2]]); p_inc(output, 3); input += 3; up += 3; down += 3; while (output < end - 1 && (input[0] != up[-1] || input[0] != down[-1])) { p_set(output, pixels[input[0]]); p_setp(output, 1, pixels[input[1]]); p_inc(output, 2); input += 2; up += 2; down += 2; } if (output < end && (input[-1] != input[0] || up[-2] != input[0] || down[-2] != input[0])) { p_set(output, pixels[input[0]]); p_inc(output, 1); input++; up++; down++; } } else p_set(output, pixels[*input]), p_inc(output, 1), input++, up++, down++; } else p_set(output, black), p_inc(output, 1), input++, up++, down++; } } } #endif #undef do_edge XaoS-release-4.3.2/src/engine/emboss.cpp000066400000000000000000000174401455214672000200540ustar00rootroot00000000000000#include "config.h" #include #include #include "filter.h" #include "fractal.h" #include "xthread.h" struct embossdata { struct palette *savedpalette, *palette; int xdist, ydist; unsigned int table[512]; }; static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~(IMAGEDATA); r->supportedmask = GRAYSCALE | C256 | TRUECOLOR24 | TRUECOLOR | TRUECOLOR16; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { int x; struct embossdata *s = (struct embossdata *)f->data; inhermisc(f, i); s->palette->size = 256 / 32; for (x = 0; x < 256 / 32; x++) s->palette->pixels[x] = x * 32; #define SSTEP (32 * 8 / 64) #define SSTEP2 (32 * 8 / 256) if (datalost(f, i) || i->image->version != f->imageversion) { if (s->savedpalette == NULL) s->savedpalette = clonepalette(i->image->palette); mkgraypalette(i->image->palette); if (i->image->palette->type & (C256 | GRAYSCALE)) { for (x = 0; x < 256; x++) { int dist = (x + SSTEP - 1) / SSTEP; dist += 32; if (dist > 63) dist = 63; s->table[x] = i->image->palette->pixels[dist]; } for (x = 256; x < 512; x++) { int dist = -(512 - x + SSTEP - 1) / SSTEP; dist += 32; if (dist < 0) dist = 0; s->table[x] = i->image->palette->pixels[dist]; } } else { for (x = 0; x < 256; x++) { int dist = (x + SSTEP2 - 1) / SSTEP2; dist += 128; if (dist > 255) dist = 255; s->table[x] = ((dist >> i->image->palette->info.truec.rprec) << i->image->palette->info.truec.rshift) | ((dist >> i->image->palette->info.truec.gprec) << i->image->palette->info.truec.gshift) | ((dist >> i->image->palette->info.truec.bprec) << i->image->palette->info.truec.bshift); } for (x = 256; x < 512; x++) { int dist = -(512 - x + SSTEP2 - 1) / SSTEP2; dist += 128; if (dist < 0) dist = 0; s->table[x] = ((dist >> i->image->palette->info.truec.rprec) << i->image->palette->info.truec.rshift) | ((dist >> i->image->palette->info.truec.gprec) << i->image->palette->info.truec.gshift) | ((dist >> i->image->palette->info.truec.bprec) << i->image->palette->info.truec.bshift); } } } s->xdist = (int)(0.1 / i->image->pixelwidth); s->ydist = (int)(0.1 / i->image->pixelwidth); if (s->xdist < 1) s->xdist = 1; if (s->ydist < 1) s->ydist = 1; if (!inherimage(f, i, TOUCHIMAGE, i->image->width + s->xdist, i->image->height + s->ydist, s->palette, 0, 0)) return 0; clear_image(f->image); setfractalpalette(f, s->savedpalette); return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct embossdata *i = (struct embossdata *)calloc(1, sizeof(*i)); i->savedpalette = NULL; i->palette = createpalette(0, 256, GRAYSCALE, 0, 256, NULL, NULL, NULL, NULL, NULL); f->childimage = NULL; f->data = i; f->name = "Emboss"; return (f); } static void emboss8(void *data, struct taskinfo */*task*/, int r1, int r2) { pixel8_t *src, *srcend, *src2; pixel8_t *dest; struct filter *f = (struct filter *)data; struct embossdata *s = (struct embossdata *)f->data; int i; unsigned int *table = s->table; for (i = r1; i < r2; i++) { src = f->childimage->currlines[i]; src2 = f->childimage->currlines[i + s->ydist] + s->xdist; srcend = src + f->image->width; dest = f->image->currlines[i]; while (src < srcend) { *dest = table[((int)*src2 - (int)*src) & 511]; src++; src2++; dest++; } } } #ifdef SUPPORT16 static void emboss16(void *data, struct taskinfo */*task*/, int r1, int r2) { pixel8_t *src, *srcend, *src2; pixel16_t *dest; struct filter *f = (struct filter *)data; struct embossdata *s = (struct embossdata *)f->data; int i; unsigned int *table = s->table; for (i = r1; i < r2; i++) { src = f->childimage->currlines[i]; src2 = f->childimage->currlines[i + s->ydist] + s->xdist; srcend = src + f->image->width; dest = (pixel16_t *)f->image->currlines[i]; while (src < srcend) { *dest = table[((int)*src2 - (int)*src) & 511]; src++; src2++; dest++; } } } #endif #ifdef STRUECOLOR24 static void emboss24(void *data, struct taskinfo *task, int r1, int r2) { pixel8_t *src, *srcend, *src2; pixel8_t *dest; struct filter *f = (struct filter *)data; struct embossdata *s = (struct embossdata *)f->data; int i; unsigned int *table = s->table; for (i = r1; i < r2; i++) { src = f->childimage->currlines[i]; src2 = f->childimage->currlines[i + s->ydist] + s->xdist; srcend = src + f->image->width; dest = (pixel8_t *)f->image->currlines[i]; while (src < srcend) { *dest = *(dest + 1) = *(dest + 2) = table[((int)*src2 - (int)*src) & 511]; src++; src2++; dest += 3; } } } #endif static void emboss32(void *data, struct taskinfo */*task*/, int r1, int r2) { pixel8_t *src, *srcend, *src2; pixel32_t *dest; struct filter *f = (struct filter *)data; struct embossdata *s = (struct embossdata *)f->data; int i; unsigned int *table = s->table; for (i = r1; i < r2; i++) { src = f->childimage->currlines[i]; src2 = f->childimage->currlines[i + s->ydist] + s->xdist; srcend = src + f->image->width; dest = (pixel32_t *)f->image->currlines[i]; while (src < srcend) { *dest = table[((int)*src2 - (int)*src) & 511] | ~(f->image->palette->info.truec.allmask); src++; src2++; dest++; } } } static void destroyinstance(struct filter *f) { struct embossdata *i = (struct embossdata *)f->data; if (i->savedpalette != NULL) destroypalette(i->savedpalette); destroypalette(i->palette); destroyinheredimage(f); free(f->data); free(f); } static int doit(struct filter *f, int flags, int time1) { int val; int time = time1; updateinheredimage(f); val = f->previous->action->doit(f->previous, flags, time); drivercall(*f->image, xth_function(emboss8, f, f->image->height), xth_function(emboss16, f, f->image->height), xth_function(emboss24, f, f->image->height), xth_function(emboss32, f, f->image->height)); xth_sync(); return val; } static void myremovefilter(struct filter *f) { struct embossdata *s = (struct embossdata *)f->data; if (s->savedpalette != NULL) { restorepalette(f->image->palette, s->savedpalette); destroypalette(s->savedpalette); s->savedpalette = NULL; } } const struct filteraction emboss_filter = { "Emboss", "emboss", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdowngeneric, myremovefilter}; XaoS-release-4.3.2/src/engine/engine.pri000066400000000000000000000013411455214672000200320ustar00rootroot00000000000000SOURCES += \ $$PWD/filter.cpp \ $$PWD/formulas.cpp \ $$PWD/fractal.cpp \ $$PWD/btrace.cpp \ $$PWD/palettef.cpp \ $$PWD/emboss.cpp \ $$PWD/star.cpp \ $$PWD/anti.cpp \ $$PWD/edge.cpp \ $$PWD/edge2.cpp \ $$PWD/rotate.cpp \ $$PWD/zoom.cpp \ $$PWD/blur.cpp \ $$PWD/interlace.cpp \ $$PWD/itersmall.cpp \ $$PWD/stereogram.cpp \ $$PWD/3d.cpp \ $$PWD/subwindow.cpp \ $$PWD/plane.cpp \ $$PWD/julia.cpp HEADERS += \ $$PWD/3dd.h \ $$PWD/btraced.h \ $$PWD/calculate.h \ $$PWD/docalc.h \ $$PWD/edge2d.h \ $$PWD/edged.h \ $$PWD/julia.h \ $$PWD/paletted.h \ $$PWD/rotated.h \ $$PWD/stard.h \ $$PWD/stereod.h \ $$PWD/zoomd.h XaoS-release-4.3.2/src/engine/filter.cpp000066400000000000000000000223111455214672000200420ustar00rootroot00000000000000#include #include #include "config.h" #include "filter.h" /*#define DEBUG */ struct queue *create_queue(struct filter *f) { struct queue *q = (struct queue *)calloc(1, sizeof(struct queue)); q->first = q->last = f; f->queue = q; f->next = f->previous = NULL; return (q); } void insertfilter(struct filter *f1, struct filter *f2) { f1->next = f2; f1->queue = f2->queue; f1->queue->isinitialized = 0; f1->previous = f2->previous; if (f2->previous != NULL) f2->previous->next = f1; else f2->queue->first = f1; f2->previous = f1; } void addfilter(struct filter *f1, struct filter *f2) { f1->previous = f2; f1->queue = f2->queue; f1->queue->isinitialized = 0; f1->next = f2->next; if (f2->next != NULL) f2->next->previous = f1; else f2->queue->last = f1; f2->next = f1; } void removefilter(struct filter *f) { if (f->action->removefilter != NULL) f->action->removefilter(f); if (f->previous != NULL) f->previous->next = f->next; else f->queue->first = f->next; if (f->next != NULL) f->next->previous = f->previous; else f->queue->last = f->previous; f->queue->isinitialized = 0; } int initqueue(struct queue *q) { struct requirements noreq = {0, ALLMASK, 0}; struct initdata init = {NULL, NULL, NULL, 0}; #ifdef DEBUG printf("\n\nInitializing queue\n"); #endif q->palettechg = NULL; if (!q->first->action->requirement(q->first, &noreq)) return 0; if (!q->last->action->initialize(q->last, &init)) return 0; q->isinitialized = 1; #ifdef DEBUG printf("Correctly initialized\n"); #endif return 1; } int reqimage(struct filter *f, struct requirements *req, int supportedmask, int flags) { f->req = *req; req->supportedmask &= supportedmask; if (!req->supportedmask) return 0; if (flags & TOUCHIMAGE && req->flags & IMAGEDATA) { req->flags = flags; } else req->flags &= flags; return 1; } /* An function helping to filter create new image. * It should be called by filter in initialization. Filter passes * width, height, pixelwidth, pixelheight * and palette it wants to pass to its child and flags defining how it works * with the image (IMAGEDATA if it requires data from previous frames (like blur * filter, TOUCHIMAGE if it changes data in image (like blur or stereogram * filter but unlike interlace and NEWIMAGE if it strictly requires to create * new image) * * As palette it should pass NULL to keep parents palette. Same as * (pixel)width/height should be passed 0; * * Function then applies some heruistic in order to minimize memory * requirements. So it should share image, create image that shares image data * or create new image) * * fills f->image, f->childimage and returns 1 if success and 0 if fail(usually * out of memory or it is unable to fit child's requirements) * and prepares data for child call. */ int inherimage(struct filter *f, struct initdata *data, int flags, int width, int height, struct palette *palette, float pixelwidth, float pixelheight) { int newimage = 0; int subimage = 1; int sharedimage = 1; struct image *i; int ddatalost = 0; if (width == 0) width = data->image->width; if (height == 0) height = data->image->height; #ifdef DEBUG printf("Inherimage:%s %i %i imagedata:%i %i\n", f->name, width, height, flags & IMAGEDATA, flags & PROTECTBUFFERS); #endif if (pixelwidth == 0) pixelwidth = data->image->pixelwidth; if (pixelheight == 0) pixelheight = data->image->pixelheight; if (palette == NULL) palette = data->image->palette; if (!(palette->type & f->req.supportedmask)) { #ifdef DEBUG printf( "Initialization of filter %s failed due to unsupported type by child %s-%i,%i\n", f->name, f->previous->name, f->req.supportedmask, palette->type); #endif f->image = data->image; return 0; } if (flags & NEWIMAGE) newimage = 1, sharedimage = 0, subimage = 0; if ((flags & IMAGEDATA) /*|| (data->image->flags & PROTECTBUFFERS) */) subimage = 0, sharedimage = 0, newimage = 1; /*if filter touches data but child requires them, create separated image */ if ((flags & TOUCHIMAGE) && ((f->req.flags & IMAGEDATA) || (data->image->flags & PROTECTBUFFERS))) subimage = 0, newimage = 1, sharedimage = 0; /*if required image differs in size or so */ if (width != data->image->width || height != data->image->height || palette != data->image->palette) newimage = 1, sharedimage = 0; if (f->childimage != NULL && (f->flags & ALLOCEDIMAGE)) { /*is an old child image still usable for us purposes? if not burn it * it! */ /*We should share image? Why alloc new?? */ if (!newimage && (f->flags & ALLOCEDIMAGE)) destroyinheredimage(f), ddatalost = 1; /*We should share data? but child image don't do that! */ if (subimage && !(f->flags & SHAREDDATA)) destroyinheredimage(f), ddatalost = 1; /*We can't share data but child image does that? */ if (!subimage && (f->flags & SHAREDDATA)) destroyinheredimage(f), ddatalost = 1; /*When image changed, child image must be recreated too */ if (f->flags & SHAREDDATA && ((data->flags & DATALOST) || f->imageversion != data->image->version)) destroyinheredimage(f), ddatalost = 1; /*We should share image with filter? Why keep created new one? */ if (sharedimage) destroyinheredimage(f), ddatalost = 1; /*When child image don't fit out needs */ if (f->childimage != NULL && (f->childimage->width != width || f->childimage->height != height || f->childimage->palette != palette || f->childimage->bytesperpixel != bytesperpixel(palette->type) || f->childimage->nimages < f->req.nimages)) destroyinheredimage(f), ddatalost = 1; /*Well now child image seems to be heavily probed */ } i = f->childimage; if (newimage) { /*Create new image when required */ if (!(f->flags & ALLOCEDIMAGE)) { if (subimage) { i = create_subimage(data->image, width, height, f->req.nimages, palette, pixelwidth, pixelheight); f->flags |= ALLOCEDIMAGE | SHAREDDATA; ddatalost = 1; } else { i = create_image_mem(width, height, f->req.nimages, palette, pixelwidth, pixelheight); f->flags |= ALLOCEDIMAGE; ddatalost = 1; } // Fix crash when saving png because inherited images // didn't inherit the data field (which now contains a pointer to // the QImage used to save the png. i->data = data->image->data; } } #ifdef DEBUG printf("Filter:%s newimage:%i subimage:%i sharedimage:%i\n", f->name, newimage, subimage, sharedimage); #endif if (i == NULL) { f->image = data->image; return 0; } if (sharedimage) i = data->image, ddatalost = (data->flags & DATALOST) || (f->childimage != data->image); if (sharedimage && datalost(f, data)) ddatalost = 1; else if ((f->flags & SHAREDDATA) && datalost(f, data) && !(i->flags & FREEDATA)) ddatalost = 1; if (ddatalost) data->flags |= DATALOST; else data->flags &= ~DATALOST; f->image = data->image; f->childimage = i; f->imageversion = data->image->version; data->image = i; #ifdef DEBUG printf("OK %i datalost:%i\n", f->flags, ddatalost); #endif #ifdef DEBUG printf("Inherimage2:%s %i %i\n", f->name, width, height); #endif return 1; } void destroyinheredimage(struct filter *f) { if (f->flags & ALLOCEDIMAGE) destroy_image(f->childimage), f->flags &= ~(ALLOCEDIMAGE | SHAREDDATA), f->childimage = NULL; } void updateinheredimage(struct filter *f) { if ((f->flags & SHAREDDATA) && f->childimage) { if (f->childimage->nimages == 2 && f->image->currimage != f->childimage->currimage) f->childimage->flip(f->childimage); /*Hack for interlace filter */ } } void inhermisc(struct filter *f, const struct initdata *data) { f->wait_function = data->wait_function; f->fractalc = data->fractalc; } struct filter *createfilter(const struct filteraction *fa) { struct filter *f = (struct filter *)calloc(1, sizeof(struct filter)); if (f == NULL) return NULL; f->queue = NULL; f->next = NULL; f->childimage = NULL; f->flags = 0; f->previous = NULL; f->action = fa; f->image = NULL; f->req.nimages = 1; f->data = NULL; return (f); } void convertupgeneric(struct filter *f, int *x, int *y) { if (f->next != NULL) f->next->action->convertup(f->next, x, y); } void convertdowngeneric(struct filter *f, int *x, int *y) { if (f->previous != NULL) f->previous->action->convertdown(f->previous, x, y); } XaoS-release-4.3.2/src/engine/formulas.cpp000066400000000000000000002704601455214672000204170ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Hello reader! * code you are looking at is dangerous for both you and your hardware! PLEASE * CLOSE THIS FILE UNLESS YOU REALLY KNOW WHAT YOU ARE DOING. * * Main purpose of this file is to generate optimal caluclation loops for * various formulas/algorithms. It heavily includes docalc.c - set of * caluclation loops, that then uses macros instead of formulas. This lets me * to change calculation loops easily. At the other hand it looks very ugly. * You have been warned :) */ // Some help can be read below about line 700. :-) #include #include #include #include #include #include #include "config.h" #include "cmplx.h" #include "filter.h" #include "fractal.h" #include "julia.h" #include "ui_helper.h" #include "xthread.h" #ifndef M_PI #define M_PI 3.1415 #endif #ifdef USE_SFFE #include "sffe.h" #endif const char *const incolorname[] = {"0", "zmag", "Decomposition-like", "real/imag", "abs(abs(c)-abs(r))", "cos(mag)", "mag*cos(real^2)", "sin(real^2-imag^2)", "atan(real*imag*creal*cimag)", "squares", "True-color", NULL}; const char *const outcolorname[] = {"iter", "iter+real", "iter+imag", "iter+real/imag", "iter+real+imag+real/imag", "binary decomposition", "biomorphs", "potential", "color decomposition", "smooth", "True-color", NULL}; const char *const tcolorname[] = { "black", "re*im sin(re^2) angle", "sin(re) sin(im) sin(square)", "hsv", "hsv2", "cos(re^c) cos(im^2) cos(square)", "abs(re^2) abs(im^2) abs(square)", "re*im re*re im*im", "abs(im*cim) abs(re*cre) abs(re*cim)", "abs(re*im-csqr) abs(re^2-csqr) abs(im^2-csqr)", "angle angle2 angle", "Disable truecolor colouring", "simple red (for education purposes)", "simple blue (for education purposes)", NULL}; #define SHIFT 8 #define SMUL 256 #ifndef less_than_4 #define less_than_0(x) ((x) < 0) #define less_than_4(x) ((x) < cfractalc.bailout) #define greater_then_1Em6(n) ((n) > 1E-6) #define abs_less_than(x, y) (myabs(x) < y) #define greater_than(x, y) ((x) > (y)) #endif #define PERIINOUTPUT() \ STAT(nperi++; ninside2++); \ return (cpalette.pixels[0]) #define OUTOUTPUT() \ STAT(niter2 += iter); \ return (!cfractalc.coloringmode \ ? cpalette.pixels[(iter % (cpalette.size - 1)) + 1] \ : color_output(zre, zim, iter)) #define INOUTPUT() \ STAT(niter1 += iter; ninside2++); \ return (cfractalc.incoloringmode \ ? incolor_output(zre, zim, pre, pim, iter) \ : cpalette.pixels[0]) #define OUTPUT() \ if (iter >= (unsigned int)cfractalc.maxiter) { \ if (cfractalc.incoloringmode == 10) \ return ( \ truecolor_output(zre, zim, pre, pim, cfractalc.intcolor, 1)); \ INOUTPUT(); \ } else { \ if (cfractalc.coloringmode == 10) \ return ( \ truecolor_output(zre, zim, pre, pim, cfractalc.outtcolor, 0)); \ OUTOUTPUT(); \ } #define SMOOTHOUTPUT() \ { \ PRESMOOTH; \ zre += 0.000001; \ szmag += 0.000001; \ iter = (int)(((cfractalc.maxiter - iter) * 256 + \ log((double)(cfractalc.bailout / (szmag))) / \ log((double)((zre) / (szmag))) * 256)); \ iter %= ((unsigned int)(cpalette.size - 1)) << 8; \ \ if ((cpalette.type & (C256 | SMALLITER)) || !(iter & 255)) \ return (cpalette.pixels[1 + (iter >> 8)]); \ { \ unsigned int i1, i2; \ i1 = cpalette.pixels[1 + (iter >> 8)]; \ if ((iter >> 8) == (unsigned int)(cpalette.size - 2)) \ i2 = cpalette.pixels[1]; \ else \ i2 = cpalette.pixels[2 + (iter >> 8)]; \ iter &= 255; \ return (interpoltype(cpalette, i2, i1, iter)); \ } \ } /* 2009-07-30 JB Langston: * Fixing bug #3: HSV modes are completely black when compiled with GCC 4... * Removed qualifier from hsv_to_rgb declaration. macro is * defined to __attribute__((__const__)), on which I found some more details * here: http://unixwiz.net/techtips/gnu-c-attributes.html#const. Apparently * this should never be used with a function that takes a pointer or relies on * side-effects, and hsv_to_rgb does both. Therefore, it should never have * been declared this way in the first place. */ static inline void hsv_to_rgb(int h, int s, int v, int *red, int *green, int *blue) /**/; static inline void hsv_to_rgb(int h, int s, int v, int *red, int *green, int *blue) { int hue; int f, p, q, t; if (s == 0) { *red = v; *green = v; *blue = v; } else { h %= 256; if (h < 0) h += 256; hue = h * 6; f = hue & 255; p = v * (256 - s) / 256; q = v * (256 - (s * f) / 256) >> 8; t = v * (256 * 256 - (s * (256 - f))) >> 16; switch ((int)(hue / 256)) { case 0: *red = v; *green = t; *blue = p; break; case 1: *red = q; *green = v; *blue = p; break; case 2: *red = p; *green = v; *blue = t; break; case 3: *red = p; *green = q; *blue = v; break; case 4: *red = t; *green = p; *blue = v; break; case 5: *red = v; *green = p; *blue = q; break; } } } static unsigned int truecolor_output(number_t zre, number_t zim, number_t pre, number_t pim, int mode, int inset); static unsigned int truecolor_output(number_t zre, number_t zim, number_t pre, number_t pim, int mode, int inset) { /* WARNING: r and b fields are swapped for HISTORICAL REASONS (BUG :), * in other words: use r for blue and b for red. */ int r = 0, g = 0, b = 0, w = 0; switch (mode) { case 0: break; case 1: b = (int)((sin((double)atan2((double)zre, (double)zim) * 20) + 1) * 127); w = (int)((sin((double)zim / zre)) * 127); r = (int)((int)(zre * zim)); g = (int)((sin((double)(zre * zre) / 2) + 1) * 127); break; case 2: if (!inset) { r = (int)((sin((double)zre * 2) + 1) * 127); g = (int)((sin((double)zim * 2) + 1) * 127); b = (int)((sin((double)(zim * zim + zre * zre) / 2) + 1) * 127); } else { r = (int)((sin((double)zre * 50) + 1) * 127); g = (int)((sin((double)zim * 50) + 1) * 127); b = (int)((sin((double)(zim * zim + zre * zre) * 50) + 1) * 127); } w = (int)((sin((double)zim / zre)) * 127); break; case 3: if (inset) hsv_to_rgb((int)(atan2((double)zre, (double)zim) * 256 / M_PI), (int)((sin((double)(zre * 50)) + 1) * 128), (int)((sin((double)(zim * 50)) + 1) * 128), &r, &g, &b); else hsv_to_rgb((int)(atan2((double)zre, (double)zim) * 256 / M_PI), (int)((sin((double)zre) + 1) * 128), (int)((sin((double)zim) + 1) * 128), &r, &g, &b); break; case 4: if (inset) hsv_to_rgb( (int)(sin((double)(zre * zre + zim * zim) * 0.1) * 256), (int)(sin(atan2((double)zre, (double)zim) * 10) * 128 + 128), (int)((sin((double)(zre + zim) * 10)) * 65 + 128), &r, &g, &b); else hsv_to_rgb( (int)(sin((double)(zre * zre + zim * zim) * 0.01) * 256), (int)(sin(atan2((double)zre, (double)zim) * 10) * 128 + 128), (int)((sin((double)(zre + zim) * 0.3)) * 65 + 128), &r, &g, &b); break; case 5: { if (!inset) { r = (int)(cos((double)myabs(zre * zre)) * 128) + 128; g = (int)(cos((double)myabs(zre * zim)) * 128) + 128; b = (int)(cos((double)myabs(zim * zim + zre * zre)) * 128) + 128; } else { r = (int)(cos((double)myabs(zre * zre) * 10) * 128) + 128; g = (int)(cos((double)myabs(zre * zim) * 10) * 128) + 128; b = (int)(cos((double)myabs(zim * zim + zre * zre) * 10) * 128) + 128; } } break; case 6: { if (!inset) { r = (int)(zre * zim * 64); g = (int)(zre * zre * 64); b = (int)(zim * zim * 64); } else r = (int)(zre * zim * 256); g = (int)(zre * zre * 256); b = (int)(zim * zim * 256); } break; case 7: { if (!inset) { r = (int)((zre * zre + zim * zim - pre * pre - pim * pim) * 16); g = (int)((zre * zre * 2 - pre * pre - pim * pim) * 16); b = (int)((zim * zim * 2 - pre * pre - pim * pim) * 16); } else { r = (int)((zre * zre + zim * zim - pre * pre - pim * pim) * 256); g = (int)((zre * zre * 2 - pre * pre - pim * pim) * 256); b = (int)((zim * zim * 2 - pre * pre - pim * pim) * 256); } } break; case 8: { if (!inset) { r = (int)((myabs(zim * pim)) * 64); g = (int)((myabs(zre * pre)) * 64); b = (int)((myabs(zre * pim)) * 64); } else { r = (int)((myabs(zim * pim)) * 256); g = (int)((myabs(zre * pre)) * 256); b = (int)((myabs(zre * pim)) * 256); } } break; case 9: { if (!inset) { r = (int)((myabs(zre * zim - pre * pre - pim * pim)) * 64); g = (int)((myabs(zre * zre - pre * pre - pim * pim)) * 64); b = (int)((myabs(zim * zim - pre * pre - pim * pim)) * 64); } else { r = (int)((myabs(zre * zim - pre * pre - pim * pim)) * 256); g = (int)((myabs(zre * zre - pre * pre - pim * pim)) * 256); b = (int)((myabs(zim * zim - pre * pre - pim * pim)) * 256); } } break; case 10: { r = (int)(atan2((double)zre, (double)zim) * 128 / M_PI) + 128; g = (int)(atan2((double)zre, (double)zim) * 128 / M_PI) + 128; b = (int)(atan2((double)zim, (double)zre) * 128 / M_PI) + 128; } break; // case 11 is for disabling truecolor mode case 12: { b = 255; g = 0; r = 0; w = 50; } break; case 13: { r = 255; g = 0; b = 0; w = 0; } break; } r += w; g += w; b += w; if (r < 0) r = 0; else if (r > 255) r = 255; if (g < 0) g = 0; else if (g > 255) g = 255; if (b < 0) b = 0; else if (b > 255) b = 255; switch (cpalette.type) { case GRAYSCALE: return ((unsigned int)(r * 76 + g * 151 + b * 29) * (cpalette.end - cpalette.start) >> 16) + cpalette.start; case TRUECOLOR: case TRUECOLOR24: case TRUECOLOR16: r >>= cpalette.info.truec.bprec; g >>= cpalette.info.truec.gprec; b >>= cpalette.info.truec.rprec; return ((r << cpalette.info.truec.bshift) + (g << cpalette.info.truec.gshift) + (b << cpalette.info.truec.rshift) + cpalette.info.truec.alpha); } return cpalette.pixels[inset]; } static unsigned int color_output(number_t zre, number_t zim, unsigned int iter); static unsigned int color_output(number_t zre, number_t zim, unsigned int iter) { int i; iter <<= SHIFT; i = iter; switch (cfractalc.coloringmode) { case 9: break; case 1: /* real */ i = (int)(iter + zre * SMUL); break; case 2: /* imag */ i = (int)(iter + zim * SMUL); break; case 3: /* real / imag */ i = (int)(iter + (zre / zim) * SMUL); break; case 4: /* all of the above */ i = (int)(iter + (zre + zim + zre / zim) * SMUL); break; case 5: if (zim > 0) i = ((cfractalc.maxiter << SHIFT) - iter); break; case 6: if (myabs(zim) < 2.0 || myabs(zre) < 2.0) i = ((cfractalc.maxiter << SHIFT) - iter); break; case 7: zre = zre * zre + zim * zim; i = (int)(sqrt(log((double)zre) / i) * 256 * 256); break; default: case 8: i = (int)((atan2((double)zre, (double)zim) / (M_PI + M_PI) + 0.75) * 20000); break; } if (i < 0) { i = (((unsigned int)(cpalette.size - 1)) << 8) - ((-i) % (((unsigned int)(cpalette.size - 1) << 8))) - 1; if (i < 0) i = 0; } iter = ((unsigned int)i) % ((cpalette.size - 1) << 8); if ((cpalette.type & (C256 | SMALLITER)) || !(iter & 255)) return (cpalette.pixels[1 + (iter >> 8)]); { unsigned int i1, i2; i1 = cpalette.pixels[1 + (iter >> 8)]; if ((int)(iter >> 8) == cpalette.size - 2) i2 = cpalette.pixels[1]; else i2 = cpalette.pixels[2 + (iter >> 8)]; iter &= 255; return (interpoltype(cpalette, i2, i1, iter)); } } static unsigned int incolor_output(number_t zre, number_t zim, number_t pre, number_t pim, unsigned int iter); static unsigned int incolor_output(number_t zre, number_t zim, number_t pre, number_t pim, unsigned int iter) { int i = iter; switch (cfractalc.incoloringmode) { case 1: /* zmag */ i = (int)(((zre * zre + zim * zim) * (number_t)(cfractalc.maxiter >> 1) * SMUL + SMUL)); break; case 2: /* real */ i = (int)(( (atan2((double)zre, (double)zim) / (M_PI + M_PI) + 0.75) * 20000)); break; default: break; case 3: /* real / imag */ i = (int)(100 + (zre / zim) * SMUL * 10); break; case 4: zre = myabs(zre); zim = myabs(zim); pre = myabs(pre); pre = myabs(pim); i += (int)(myabs(pre - zre) * 256 * 64); i += (int)(myabs(pim - zim) * 256 * 64); break; case 5: if (((int)((zre * zre + zim * zim) * 10)) % 2) i = (int)(cos((double)(zre * zim * pre * pim)) * 256 * 256); else i = (int)(sin((double)(zre * zim * pre * pim)) * 256 * 256); break; case 6: i = (int)((zre * zre + zim * zim) * cos((double)(zre * zre)) * 256 * 256); break; case 7: i = (int)(sin((double)(zre * zre - zim * zim)) * 256 * 256); break; case 8: i = (int)(atan((double)(zre * zim * pre * pim)) * 256 * 64); break; case 9: if ((abs((int)(zre * 40)) % 2) ^ (abs((int)(zim * 40)) % 2)) i = (int)(( (atan2((double)zre, (double)zim) / (M_PI + M_PI) + 0.75) * 20000)); else i = (int)(( (atan2((double)zim, (double)zre) / (M_PI + M_PI) + 0.75) * 20000)); break; }; if (i < 0) { i = (((unsigned int)(cpalette.size - 1)) << 8) - ((-i) % (((unsigned int)(cpalette.size - 1) << 8))) - 1; if (i < 0) i = 0; } iter = ((unsigned int)i) % ((cpalette.size - 1) << 8); if ((cpalette.type & (C256 | SMALLITER)) || !(iter & 255)) return (cpalette.pixels[1 + ((unsigned int)iter >> 8)]); { unsigned int i1, i2; i1 = cpalette.pixels[1 + ((unsigned int)iter >> 8)]; if (((unsigned int)iter >> 8) == (unsigned int)(cpalette.size - 2)) i2 = cpalette.pixels[1]; else i2 = cpalette.pixels[2 + ((unsigned int)iter >> 8)]; iter &= 255; return (interpoltype(cpalette, i2, i1, iter)); } } #define VARIABLES #define INIT #define UNCOMPRESS #define PRETEST 0 #define FORMULA \ zim = (zim * zre) * 2 + pim; \ zre = rp - ip + pre; \ ip = zim * zim; \ rp = zre * zre; /* Some help for the brave ones. :-) * * Mandelbrot's original formula is z=z^2+c which means * z[next]=z[previous]^2+c. * Here c is the pixel coordinates from the screen and z[0] is usually 0 * (if not perturbation was added.) * In the following code z[previous] is described by (zre;zim) * and z[next] will also be zre and zim. * c is described by (pre;pim). * Finally rp and ip are helper variables, mostly for checking the bailout * (which usually means abs(z)>=4, see BTEST). * * Both basic operations and some other functions (c_mul, c_pow3, ...) can * be used. For a "detailed" description refer to ../include/complex.h. * * If you add/modify fractals, please note that struct formula_formulas * (at line cca. 1300) should be also edited for proper initialization * and for menu entries. However it is not self-explanatory, just copy-paste * existing tables and give it a try. * * Finally, please also edit the calculateswitch function and * the nmformulas constant (at the end of this file). * * -- Zoltan, 2009-07-30 */ #define BTEST less_than_4(rp + ip) #define SMOOTH #define SCALC smand_calc #define SPERI smand_peri #define CALC mand_calc #define PERI mand_peri #define JULIA mand_julia #define RANGE 2 #define RPIP #include "docalc.h" #define PRETEST 0 #define FORMULA \ rp = zre * (rp - 3 * ip); \ zim = zim * (3 * zre * zre - ip) + pim; \ zre = rp + pre; \ rp = zre * zre; \ ip = zim * zim; #define BTEST less_than_4(rp + ip) #define SMOOTH #define SCALC smand3_calc #define SPERI smand3_peri #define CALC mand3_calc #define PERI mand3_peri #define JULIA mand3_julia #define RANGE 2 #define RPIP #include "docalc.h" #define UNCOMPRESS #define VARIABLES number_t br, tmp; #define FORMULA \ br = zre + zre + pre - 2; \ tmp = zre * zim; \ zre = rp - ip + pre - 1; \ ip = zim + zim + pim; \ zim = tmp + tmp + pim; \ tmp = 1 / (br * br + ip * ip); \ rp = (zre * br + zim * ip) * tmp; \ ip = (zim * br - zre * ip) * tmp; \ zre = (rp + ip) * (rp - ip); \ zim = rp * ip; \ zim += zim; \ rp = zre - 1; \ ip = zim * zim; \ rp = zre * zre; #define BTEST \ (rp + ip < (number_t)100 * 100 && \ (rp - 2 * zre + ip) > 0.04 / cfractalc.bailout - 1) #define POSTCALC \ if (rp - 2 * zre + ip > 0.04 / cfractalc.bailout - 1) { \ zre *= 0.08 / cfractalc.bailout, zim *= 0.08 / cfractalc.bailout; \ if (iter) \ iter = cfractalc.maxiter - iter + 1; \ } #define CALC magnet_calc #define PERI magnet_peri #define SCALC smagnet_calc #define SPERI smagnet_peri #define SMOOTH #define PRESMOOTH \ szmag /= 100 * 100 / 4; \ zre = (rp + ip) / (100 * 100 * 4); #define JULIA magnet_julia #define RANGE 4 #define RPIP #include "docalc.h" #define UNCOMPRESS #define VARIABLES number_t inre, inim, tmp1, tmp2, dnre, nmre, dnim; #define INIT \ inre = pre * pre - pim * pim - pre - pre - pre; \ inim = pre * pim; \ inim = inim + inim - pim - pim - pim; #define FORMULA \ tmp1 = rp - ip; \ tmp2 = zre * pre - zim * pim - zre; \ dnre = \ tmp1 + tmp1 + tmp1 + tmp2 + tmp2 + tmp2 - zre - zre - zre + inre + 3; \ tmp1 = zre * ip; \ nmre = zre * rp - tmp1 - tmp1 - tmp1 + tmp2 + tmp2 + tmp2 + inre + 2; \ tmp1 = zre * zim; \ tmp2 = zre * pim + zim * pre - zim; \ dnim = tmp1 + tmp1 + tmp1 + tmp1 + tmp1 + tmp1 + tmp2 + tmp2 + tmp2 - \ zim - zim - zim + inim; \ tmp1 = zim * rp; \ zim = tmp1 + tmp1 + tmp1 - zim * ip + tmp2 + tmp2 + tmp2 + inim; \ zre = nmre; \ ip = dnim; \ tmp1 = 1 / (dnre * dnre + ip * ip); \ rp = (zre * dnre + zim * ip) * tmp1; \ ip = (zim * dnre - zre * ip) * tmp1; \ zre = (rp + ip) * (rp - ip); \ zim = rp * ip; \ zim += zim; \ ip = zim * zim; \ rp = zre * zre; #define BTEST \ (rp + ip < (number_t)100 * 100 && \ (rp - 2 * zre + ip) > 0.04 / cfractalc.bailout - 1) #define POSTCALC \ if (rp - 2 * zre + ip > 0.04 / cfractalc.bailout - 1) { \ zre *= 0.08 / cfractalc.bailout, zim *= 0.08 / cfractalc.bailout; \ if (iter) \ iter = cfractalc.maxiter - iter + 1; \ } #define CALC magnet2_calc #define PERI magnet2_peri #define SCALC smagnet2_calc #define SPERI smagnet2_peri #define SMOOTH #define PRESMOOTH \ szmag /= 100 * 100 / 4; \ zre = (rp + ip) / (100 * 100 * 4); #define JULIA magnet2_julia #define RANGE 2 #define RPIP #include "docalc.h" #define BTEST less_than_4(rp + ip) #define FORMULA \ rp = rp * rp - 6 * rp * ip + ip * ip + pre; \ zim = 4 * zre * zre * zre * zim - 4 * zre * ip * zim + pim; \ zre = rp; \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC smand4_calc #define SPERI smand4_peri #define CALC mand4_calc #define PERI mand4_peri #define JULIA mand4_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES number_t t; #define BTEST less_than_4(rp + ip) #define FORMULA \ c_pow4(zre, zim, rp, ip); \ c_mul(zre, zim, rp, ip, t, zim); \ zre = t + pre; \ zim += pim; \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC smand5_calc #define SPERI smand5_peri #define CALC mand5_calc #define PERI mand5_peri #define JULIA mand5_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES number_t t; #define BTEST less_than_4(rp + ip) #define FORMULA \ c_pow3(zre, zim, rp, ip); \ c_mul(rp, ip, rp, ip, t, zim); \ zre = t + pre; \ zim += pim; \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC smand6_calc #define SPERI smand6_peri #define CALC mand6_calc #define PERI mand6_peri #define JULIA mand6_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES number_t t; #define BTEST less_than_4(rp + ip) #define FORMULA \ c_pow3(zre, zim, rp, ip); \ c_pow3(rp, ip, t, zim); \ zre = t + pre; \ zim += pim; \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC smand9_calc #define SPERI smand9_peri #define CALC mand9_calc #define PERI mand9_peri #define JULIA mand9_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES #define BTEST less_than_4(rp + ip) #define FORMULA \ zim = zre * zim + zim / 2 + pim; \ zre = (rp - ip + zre) / 2 + pre; \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC strice_calc #define SPERI strice_peri #define CALC trice_calc #define PERI trice_peri #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES number_t zor, zoi; /* For some reason Cat's Eye renders as an empty circle unless the bailout * is slightly more than 4. It was first observed in 2009 on Mac OS X but * more recently started happening on other operating systems. I suspect * a compiler bug, but I haven't been able to figure out exactly what's * happening. I can work around it by subtracting a small amount from the * magnitude before performing the bailout test. */ #define BTEST less_than_4(rp + ip - 0.00000001) #define FORMULA \ c_div(pre, pim, zre, zim, rp, ip); \ c_div(zre, zim, pre, pim, zor, zoi); \ zre = zor + rp; \ zim = zoi + ip; \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC scatseye_calc #define SPERI scatseye_peri #define CALC catseye_calc #define PERI catseye_peri #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES #define BTEST less_than_4(rp + ip) #define FORMULA \ zim = (zim * zre) * (-2.0) + pim; \ zre = rp - ip + pre; \ ip = zim * zim; \ rp = zre * zre; #define SMOOTH #define SCALC smbar_calc #define SPERI smbar_peri #define CALC mbar_calc #define PERI mbar_peri #define JULIA mbar_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES #define INIT \ rp = zre; \ zre = pre; \ pre = rp; \ ip = zim; \ zim = pim; \ pim = ip; #define BTEST less_than_4(rp + ip) #define FORMULA \ rp = ip - rp + zre; \ ip = zim - 2 * zre * zim; \ c_mul(rp, ip, pre, pim, zre, zim); \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC smlambda_calc #define SPERI smlambda_peri #define CALC mlambda_calc #define PERI mlambda_peri #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES number_t zre1, zim1, zre2, zim2; #define INIT \ zre1 = zre; \ zim1 = zim; #define BTEST less_than_4(rp + ip) #define FORMULA \ zre2 = zre; \ zim2 = zim; \ zim = (zim * zre) * 2 + pim + zim1; \ zre = rp - ip + pre + zre1; \ zre1 = zre2; \ zim1 = zim2; \ ip = zim * zim; \ rp = zre * zre; #define SMOOTH #define SCALC smanowar_calc #define CALC manowar_calc #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES number_t zre1, zim1; #define INIT \ zre1 = pre; \ zim1 = pim; #define BTEST less_than_4(rp + ip) #define FORMULA \ zim = (zim * zre) * 2 + zim1; \ zre = rp - ip + zre1; \ zre1 = zre1 / 2 + zre; \ zim1 = zim1 / 2 + zim; \ ip = zim * zim; \ rp = zre * zre; #define SMOOTH #define SCALC sspider_calc #define CALC spider_calc #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES #define INIT \ if ((zre == pre) && (zim == pim)) { \ pre = 0.5; \ pim = 0.8660254; \ } \ if (pim < 0) \ pim = (-pim); \ if (((pim * zre - pre * zim) < 0) || (zim < 0)) { \ zre = 2 * pre + 2; \ zim = 2 * pim; \ } #define BTEST ((pim * zre + (1 - pre) * zim) < pim) #define FORMULA \ zre = 2 * zre; \ zim = 2 * zim; \ if ((pim * zre - pre * zim) > pim) \ zre = zre - 1; \ if (zim > pim) { \ zim = zim - pim; \ zre = zre - pre; \ } #define CALC sier_calc #define RANGE 2 #include "docalc.h" #define VARIABLES #define INIT \ if ((zre == pre) && (zim == pim)) { \ pre = 0.5; \ pim = 0.8660254; \ } \ if (pim < 0) \ pim = (-pim); \ if (((pim * zre - pre * zim) < 0) || (zim < 0)) { \ zre = 2 * pre + 2; \ zim = 2 * pim; \ } #define BTEST ((pim * zre + (1 - pre) * zim) < pim) #define FORMULA \ zre = 1.6180339 * zre; \ zim = 1.6180339 * zim; \ if ((pim * zre - pre * zim) > pim * 0.6180339) \ zre = zre - 0.6180339; \ if (zim > pim * 0.6180339) { \ zim = zim - pim * 0.6180339; \ zre = zre - pre * 0.6180339; \ } #define CALC goldsier_calc #define RANGE 2 #include "docalc.h" #define VARIABLES #define INIT #define BTEST (zre * zre + zim * zim < 1) #define FORMULA \ zre = 3 * zre; \ zim = 3 * zim; \ if ((zim - 2) * (zim - 2) + zre * zre < 1) \ zim = zim - 2; \ if ((zim + 2) * (zim + 2) + zre * zre < 1) \ zim = zim + 2; \ if ((zim - 1) * (zim - 1) + (zre - 1.7320508) * (zre - 1.7320508) < 1) { \ zim = zim - 1; \ zre = zre - 1.7320508; \ } \ if ((zim + 1) * (zim + 1) + (zre - 1.7320508) * (zre - 1.7320508) < 1) { \ zim = zim + 1; \ zre = zre - 1.7320508; \ } \ if ((zim - 1) * (zim - 1) + (zre + 1.7320508) * (zre + 1.7320508) < 1) { \ zim = zim - 1; \ zre = zre + 1.7320508; \ } \ if ((zim + 1) * (zim + 1) + (zre + 1.7320508) * (zre + 1.7320508) < 1) { \ zim = zim + 1; \ zre = zre + 1.7320508; \ } #define CALC circle7_calc #define RANGE 2 #include "docalc.h" #define VARIABLES #define INIT #define BTEST less_than_4((rp + ip) / 4.0) #define FORMULA \ if (less_than_0(zre)) { \ rp = zre + 1; \ } else { \ rp = zre - 1; \ } \ if (less_than_0(zim)) { \ ip = zim + 1; \ } else { \ ip = zim - 1; \ } \ c_mul(rp, ip, pre, pim, zre, zim); \ rp = zre * zre; \ ip = zim * zim; #define CALC symbarn_calc #define JULIA symbarn_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES #define INIT \ if ((zre == pre) && (zim == pim)) { \ pre = 1; \ pim = 1; \ } \ if (pre < 0) \ pre = (-pre); \ if (pim < 0) \ pim = (-pim); \ if ((zre < 0) || (zre > pre)) { \ zre = pre / 2; \ zim = pim / 2; \ } \ if ((zim < 0) || (zim > pim)) { \ zre = pre / 2; \ zim = pim / 2; \ } #define BTEST \ ((zre < pre / 3) || (zre > 2 * pre / 3) || (zim < pim / 3) || \ (zim > 2 * pim / 3)) #define FORMULA \ zre = 3 * zre; \ zim = 3 * zim; \ if (zre > 2 * pre) \ zre = zre - 2 * pre; \ else if (zre > pre) \ zre = zre - pre; \ if (zim > 2 * pim) \ zim = zim - 2 * pim; \ else if (zim > pim) \ zim = zim - pim; #define CALC carpet_calc #define RANGE 2 #include "docalc.h" #define VARIABLES #define BTEST \ ((((1.5 * zre + 0.8660254038 * zim) > 0.8660254038) || \ ((0.8660254038 * zim - 1.5 * zre) > 0.8660254038) || (zim < (-0.5))) && \ (((1.5 * zre + 0.8660254038 * zim) < -0.8660254038) || \ ((0.8660254038 * zim - 1.5 * zre) < -0.8660254038) || (zim > 0.5))) #define FORMULA \ zre = 3 * zre; \ zim = 3 * zim; \ if ((0.2886751346 * zim - 0.5 * zre) > 0.0) { \ if ((0.2886751346 * zim + 0.5 * zre) > 0.0) { \ zim = zim - 2.0; \ } else { \ if (zim > 0) { \ zre = zre + 1.732050808; \ zim = zim - 1.0; \ } else { \ zre = zre + 1.732050808; \ zim = zim + 1.0; \ } \ } \ } else { \ if ((0.2886751346 * zim + 0.5 * zre) < 0.0) { \ zim = zim + 2.0; \ } else { \ if (zim > 0) { \ zre = zre - 1.732050808; \ zim = zim - 1.0; \ } else { \ zre = zre - 1.732050808; \ zim = zim + 1.0; \ } \ } \ } #define CALC koch_calc #define RANGE 2 #include "docalc.h" #define VARIABLES number_t zre1, zim1; #define INIT \ pim = fabs(pim); \ zre = pre; \ zim = pim; #define BTEST \ (!((zre < 0) && (zim > 0) && \ (-1.0 * zre + 1.732050808 * zim < 1.732050808))) #define FORMULA \ zre1 = 1.5 * zre - 0.866 + 0.866 * zim; \ zim1 = -1.5 + 1.5 * zim - 0.866 * zre; \ zre = zre1; \ zim = zim1; #define CALC hornflake_calc #define RANGE 2 #include "docalc.h" #define VARIABLES #define BTEST less_than_4(rp + ip) #define FORMULA \ if (less_than_0(zre)) { \ rp = zre + 1; \ } else { \ rp = zre - 1; \ } \ c_mul(rp, zim, pre, pim, zre, zim); \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC sbarnsley1_calc #define CALC barnsley1_calc #define JULIA barnsley1_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES #define BTEST less_than_4(rp + ip) #define FORMULA \ if (less_than_0(zre * pim + zim * pre)) { \ rp = zre + 1; \ } else { \ rp = zre - 1; \ } \ c_mul(rp, zim, pre, pim, zre, zim); \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC sbarnsley2_calc #define CALC barnsley2_calc #define JULIA barnsley2_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES #define BTEST less_than_4(rp + ip) #define FORMULA \ if (!less_than_0(-zre)) { \ zim = 2 * zre * zim + pim * zre; \ zre = rp - ip - 1 + pre * zre; \ } else { \ zim = 2 * zre * zim; \ zre = rp - ip - 1; \ } \ rp = zre * zre; \ ip = zim * zim; #define SMOOTH #define SCALC sbarnsley3_calc #define CALC barnsley3_calc #define JULIA barnsley3_julia #define RANGE 2 #define RPIP #include "docalc.h" #define VARIABLES number_t n, sqrr, sqri, zre1, zim1; #define INIT \ sqri = zim * zim, n = zre, zre = pre, pre = n, n = zim, zim = pim, \ pim = n, n = (number_t)1; #define BTEST greater_then_1Em6(n) #define FORMULA \ zre1 = zre; \ zim1 = zim; \ n = zim * zim; \ sqri = zre * zre; \ sqrr = sqri - n; \ sqri = n + sqri; \ n = 0.3333333333 / ((sqri * sqri)); \ zim = (0.66666666) * zim - (zre + zre) * zim * n + pim; \ zre = (0.66666666) * zre + (sqrr)*n + pre; \ zre1 -= zre; \ zim1 -= zim; \ n = zre1 * zre1 + zim1 * zim1; #define CALC newton_calc #include "docalc.h" #define VARIABLES number_t n, sqrr, sqri, zre1, zim1; #define INIT \ sqri = zim * zim, n = zre, zre = pre, pre = n, n = zim, zim = pim, \ pim = n, n = (number_t)1; #define BTEST greater_then_1Em6(n) #define FORMULA \ zre1 = zre; \ zim1 = zim; \ sqrr = zre * zre; \ sqri = zim * zim; \ n = sqri + sqrr; \ n = 1 / ((n * n * n)); \ zim = (0.25) * zim * (3 + (sqri - 3 * sqrr) * n) + pim; \ zre = (0.25) * zre * (3 + (sqrr - 3 * sqri) * n) + pre; \ zre1 -= zre; \ zim1 -= zim; \ n = zre1 * zre1 + zim1 * zim1; #define CALC newton4_calc #include "docalc.h" #define VARIABLES number_t zpr, zip; #define SAVEVARIABLES number_t szpr, szip; #define SAVE szpr = zpr, szip = zip; #define RESTORE zpr = szpr, zip = szip; #define INIT zpr = zip = (number_t)0; #define BTEST less_than_4(rp + ip) #define FORMULA \ rp = rp - ip + pre + pim * zpr; \ ip = 2 * zre * zim + pim * zip; \ zpr = zre, zip = zim; \ zre = rp; \ zim = ip; \ rp = zre * zre, ip = zim * zim; #define SMOOTH #define SCALC sphoenix_calc #define SPERI sphoenix_peri #define CALC phoenix_calc #define PERI phoenix_peri #define RPIP #include "docalc.h" #define VARIABLES number_t tr, ti, zpr, zpm, rp1, ip1; #define INIT \ zpr = zpm = 0, tr = zre, zre = pre, pre = tr, tr = zim, zim = pim, \ pim = tr, tr = 1; #define BTEST less_than_4(zpr *zpr + zpm * zpm) #define FORMULA \ rp1 = zre; \ ip1 = zim; \ c_pow3(zre, zim, tr, ti); \ c_add(tr, ti, zpr, zpm, zre, zim); \ zpr = rp1 + pre; \ zpm = ip1 + pim; #define CALC octo_calc #define SCALC socto_calc #define SMOOTH #define CUSTOMSAVEZMAG szmag = zpr * zpr + zpm * zpm #define PRESMOOTH zre = zpr * zpr + zpm * zpm #include "docalc.h" #define VARIABLES number_t yre, yim, re1tmp, re2tmp, im1tmp; #define BTEST (rp + ip < 9 || (yre * yre + yim * yim) < 4 * (rp + ip)) #define INIT \ yre = pre; \ yim = pim; #define FORMULA \ re1tmp = zre; \ re2tmp = yre; \ im1tmp = zim; \ zre = re1tmp + yre; \ zim = im1tmp + yim; \ yre = (re1tmp * re2tmp - im1tmp * yim); \ yim = (re1tmp * yim + re2tmp * im1tmp); \ rp = zre * zre; \ ip = zim * zim; #define CALC beryl_calc #define PERI beryl_peri #define RANGE 2 #define RPIP #include "docalc.h" #ifdef USE_SFFE // Parser is not thread safe so each thread needs its own instance thread_local bool sffe_formula_valid = false; thread_local sffe *sffe_formula_local = NULL; thread_local bool sffe_initial_valid = false; thread_local sffe *sffe_initial_local = NULL; thread_local cmplx sffe_z, sffe_c, sffe_p, sffe_n; // Copy the formula from the main parser to this thread's local parser // Possibly initializing the parser if this is the first time void sffe_setmine(void *data, struct taskinfo * /*task*/, int /*r1*/, int /*r2*/) { fractal_context *c = (fractal_context *)data; if (!sffe_formula_local) { sffe_formula_local = sffe_alloc(); sffe_regvar(&sffe_formula_local, &sffe_p, "p"); sffe_regvar(&sffe_formula_local, &sffe_z, "z"); sffe_regvar(&sffe_formula_local, &sffe_c, "c"); sffe_regvar(&sffe_formula_local, &sffe_n, "n"); } if (c->userformula->expression) { if (sffe_parse(&sffe_formula_local, c->userformula->expression) == 0) sffe_formula_valid = true; else sffe_formula_valid = false; } if (!sffe_initial_local) { sffe_initial_local = sffe_alloc(); sffe_regvar(&sffe_initial_local, &sffe_p, "p"); sffe_regvar(&sffe_initial_local, &sffe_c, "c"); sffe_regvar(&sffe_initial_local, &sffe_n, "n"); } if (c->userinitial->expression) { if (sffe_parse(&sffe_initial_local, c->userinitial->expression) == 0) sffe_initial_valid = true; else sffe_initial_valid = false; } } // Tell all threads copy the formula into their local parser void sffe_setlocal(fractal_context *c) { xth_function(sffe_setmine, c, nthreads); xth_sync(); } #define INIT \ cmplxset(sffe_p, 0, 0); \ cmplxset(sffe_c, pre, pim); \ if (sffe_initial_valid) \ sffe_z = sffe_eval(sffe_initial_local); \ else { \ cmplxset(sffe_z, zre, zim); \ cmplxset(sffe_n, 1, 0); \ } //#define SAVE cmplxset(pZ,real(Z),imag(Z)); //#define PRETEST 0 #define FORMULA \ if (sffe_formula_valid) \ sffe_z = sffe_eval(sffe_formula_local); \ cmplxset(sffe_p, zre, zim); \ zre = real(sffe_z); \ zim = imag(sffe_z); \ cmplxset(sffe_n, (unsigned int)cfractalc.maxiter - iter + 1, 0); #define BTEST less_than_4(zre *zre + zim * zim) // less_than_4(rp+ip) #define CALC sffe_calc #define JULIA sffe_julia //#define SCALC ssffe_calc //#define SMOOTH #include "docalc.h" #endif static const symmetrytype sym6[] = {{0, 1.73205080758}, {0, -1.73205080758}}; static const symmetrytype sym8[] = {{0, 1}, {0, -1}}; static const symmetrytype sym16[] = {{0, 1}, {0, -1}, {0, 0.414214}, {0, -0.414214}, {0, 2.414214}, {0, -2.414214}}; const struct formula formulas[] = { { /* 0 */ FORMULAMAGIC, mand_calc, mand_peri, smand_calc, smand_peri, mand_julia, {"Mandelbrot", "Julia"}, "mandel", /*{0.5, -2.0, 1.25, -1.25}, */ {-0.75, 0.0, 2.5, 2.5}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* 1 */ FORMULAMAGIC, mand3_calc, mand3_peri, smand3_calc, smand3_peri, mand3_julia, {"Mandelbrot^3", "Julia^3"}, "mandel3", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 1, 1, 0.0, 0.0, { {0, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {0, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, INT_MAX, 0, NULL}, {0, 0, 0, NULL}, {0, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {0, 0, 0, NULL}, {0, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* 2 */ FORMULAMAGIC, mand4_calc, mand4_peri, smand4_calc, smand4_peri, mand4_julia, {"Mandelbrot^4", "Julia^4"}, "mandel4", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* 3 */ FORMULAMAGIC, mand5_calc, mand5_peri, smand5_calc, smand5_peri, mand5_julia, {"Mandelbrot^5", "Julia^5"}, "mandel5", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 1, 1, 0.0, 0.0, { {0, 0, 2, sym8}, {INT_MAX, 0, 0, NULL}, {0, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, INT_MAX, 0, NULL}, {0, 0, 2, sym8}, {0, 0, 2, sym8}, {INT_MAX, INT_MAX, 0, NULL}, {0, 0, 2, sym8}, {INT_MAX, INT_MAX, 0, NULL}, }, { {0, 0, 2, sym8}, {0, 0, 2, sym8}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* 4 */ FORMULAMAGIC, mand6_calc, mand6_peri, smand6_calc, smand6_peri, mand6_julia, {"Mandelbrot^6", "Julia^6"}, "mandel6", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* 5 */ FORMULAMAGIC, newton_calc, NULL, NULL, NULL, NULL, {"Newton", "Newton julia?"}, "newton", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 0, 1, 1.0199502202048319698, 0.0, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, STARTZERO, }, { /* formula added by Andreas Madritsch *//* 6 */ FORMULAMAGIC, newton4_calc, NULL, NULL, NULL, NULL, {"Newton^4", "Newton^4 julia?"}, "newton4", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 0, 1, 1.0199502202048319698, 0.0, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, STARTZERO, }, { /* 7 */ FORMULAMAGIC, barnsley1_calc, NULL, sbarnsley1_calc, NULL, barnsley1_julia, {"Barnsley1 Mandelbrot", "Barnsley1"}, "barnsley", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 0, 0, -0.6, 1.1, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, STARTZERO | MANDEL_BTRACE, }, { /* formula added by Andreas Madritsch *//* 8 */ FORMULAMAGIC, barnsley2_calc, NULL, sbarnsley2_calc, NULL, barnsley2_julia, {"Barnsley2 Mandelbrot", "Barnsley2"}, "barnsley2", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 5.5}, 0, 0, -0.6, 1.1, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, STARTZERO | MANDEL_BTRACE, }, { /* formula added by Arpad Fekete *//* 9 */ FORMULAMAGIC, barnsley3_calc, NULL, sbarnsley3_calc, NULL, barnsley3_julia, {"Barnsley3 Mandelbrot", "Barnsley3"}, "barnsley3", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 3.5}, 0, 0, 0.0, 0.4, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, STARTZERO | MANDEL_BTRACE, }, { /* 10 */ FORMULAMAGIC, octo_calc, /*octo_peri, */ NULL, socto_calc, /*socto_peri, */ NULL, NULL, {"Octo", "Octo"}, "octo", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 0, 1, 0.0, 0.0, { {0, 0, 6, sym16}, {INT_MAX, 0, 0, NULL}, {0, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, INT_MAX, 0, NULL}, {0, 0, 0, NULL}, {0, 0, 6, sym16}, {INT_MAX, INT_MAX, 0, NULL}, {0, 0, 6, sym16}, {INT_MAX, INT_MAX, 0, NULL}, }, { {0, 0, 6, sym16}, {0, 0, 6, sym16}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE | STARTZERO, }, { /* 11 */ FORMULAMAGIC, phoenix_calc, phoenix_peri, sphoenix_calc, sphoenix_peri, NULL, {"MandPhoenix", "Phoenix"}, "phoenix", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 1, 0, 0.56667000000000001, -0.5, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* 12 */ FORMULAMAGIC, magnet_calc, magnet_peri, smagnet_calc, smagnet_peri, magnet_julia, {"Magnet", "Magnet"}, "magnet", /*{3, 0, 2.2, -2.2}, */ {1.5, 0.0, 3.0, 4.4}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, STARTZERO, }, { /* formula added by Andreas Madritsch *//* 13 */ FORMULAMAGIC, magnet2_calc, magnet2_peri, smagnet2_calc, smagnet2_peri, magnet2_julia, {"Magnet2", "Magnet2"}, "magnet2", /*{3, 0, 2.2, -2.2}, */ {1.0, 0.0, 3.0, 3.2}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, STARTZERO, }, { /* formula added by Arpad Fekete *//* 14 */ FORMULAMAGIC, trice_calc, trice_peri, strice_calc, strice_peri, NULL, {"Triceratops", "Triceratops Julia"}, "trice", {0.0, 0.0, 2.5, 4.5}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete *//* 15 */ FORMULAMAGIC, catseye_calc, catseye_peri, scatseye_calc, scatseye_peri, NULL, {"Catseye", "Catseye Julia"}, "catseye", {0.0, 0.0, 2.5, 4.5}, 1, 1, 0.0, 0.0, { {0, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, 0, 0, NULL}, {0, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {0, 0, 0, NULL}, {0, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, 0, 0, NULL}, {0, 0, 0, NULL}, {0, 0, 0, NULL}, {0, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /*formula added by Arpad Fekete *//* 16 */ /*in Gnofract4d from mathworld.wolfram.com */ FORMULAMAGIC, mbar_calc, mbar_peri, smbar_calc, smbar_peri, mbar_julia, {"Mandelbar", "Mandelbar Julia"}, "mbar", {0.0, 0.0, 2.5, 3.5}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 2, sym6}, {INT_MAX, 0, 2, sym6}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete (from fractint) *//* 17 */ FORMULAMAGIC, mlambda_calc, mlambda_peri, smlambda_calc, smlambda_peri, NULL, {"Lambda Mandelbrot", "Lambda"}, "mlambda", {0.0, 0.0, 2.5, 5.5}, 0, 0, 0.5, 0.0, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete (from fractint) *//* 18 */ FORMULAMAGIC, manowar_calc, NULL, smanowar_calc, NULL, NULL, {"Manowar", "Manowar Julia"}, "manowar", {0.0, 0.0, 2.5, 2.5}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete (from fractint) *//* 19 */ FORMULAMAGIC, spider_calc, NULL, sspider_calc, NULL, NULL, {"Spider", "Spider Julia"}, "spider", {0.0, 0.0, 2.5, 4.5}, 1, 1, 0.0, 0.0, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, 0, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete, method from fractint *//* 20 */ FORMULAMAGIC, sier_calc, NULL, NULL, NULL, NULL, {"Sierpinski", "Sierpinski"}, "sier", {0.5, 0.43, 1.5, 1.0}, 0, 0, 0.5, 0.8660254, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete, method from fractint *//* 21 */ FORMULAMAGIC, carpet_calc, NULL, NULL, NULL, NULL, {"Sierpinski Carpet", "Sierpinski Carpet"}, "carpet", {0.5, 0.5, 1.5, 1.5}, 0, 0, 1, 1, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete, method from fractint *//* 22 */ FORMULAMAGIC, koch_calc, NULL, NULL, NULL, NULL, {"Koch Snowflake", "Koch Snowflake"}, "koch", {0.0, 0.0, 2.5, 2.5}, 0, 1, 0, 0, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Z. Kovacs *//* 23 */ FORMULAMAGIC, hornflake_calc, NULL, NULL, NULL, NULL, {"Spidron Hornflake", "Spidron Hornflake"}, "hornflake", {-0.75, 0, 3.8756, 3.8756}, 0, 1, 0, 0, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, 0, }, { /* formula added by Z. Kovacs, originally mand6 but it was mand9 by accident *//* 24 */ FORMULAMAGIC, mand9_calc, mand9_peri, smand9_calc, smand9_peri, mand9_julia, {"Mandelbrot^9", "Julia^9"}, "mandel9", /*{1.25, -1.25, 1.25, -1.25}, */ {0.0, 0.0, 2.5, 2.5}, 1, 1, 0.0, 0.0, { {0, 0, 6, sym16}, {INT_MAX, 0, 0, NULL}, {0, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {0, INT_MAX, 0, NULL}, {0, 0, 0, NULL}, {0, 0, 6, sym16}, {INT_MAX, INT_MAX, 0, NULL}, {0, 0, 6, sym16}, {INT_MAX, INT_MAX, 0, NULL}, }, { {0, 0, 6, sym16}, {0, 0, 6, sym16}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by S. Bizien *//* 25 */ FORMULAMAGIC, beryl_calc, beryl_peri, NULL, NULL, NULL, {"Beryl", "Beryl"}, "beryl", {-0.6, 0, 2, 2}, 0, 0, 1.0, 0.0, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete *//* 26 */ FORMULAMAGIC, goldsier_calc, NULL, NULL, NULL, NULL, {"Golden Sierpinski", "Golden Sierpinski"}, "goldsier", {0.5, 0.43, 1.5, 1.0}, 0, 0, 0.5, 0.8660254, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete *//* 27 */ FORMULAMAGIC, circle7_calc, NULL, NULL, NULL, NULL, {"Circle 7", "Circle 7"}, "circle7", {0.0, 0.0, 2.5, 2.5}, 0, 0, 0.0, 0.0, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, }, { /* formula added by Arpad Fekete *//* 28 */ FORMULAMAGIC, symbarn_calc, NULL, NULL, NULL, symbarn_julia, {"Symmetric Barnsley M.", "Symmetric Barnsley"}, "symbarn", {0.0, 0.0, 8.0, 1.0}, 0, 0, 1.3, 1.3, /* Arpad hasn't created the symmetry properties, */ /* because he doesn't considered it to be important */ { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE, } #ifdef USE_SFFE , { /* formula added by M. Malczak - SFFE *//* 29 */ FORMULAMAGIC, sffe_calc, NULL, NULL, NULL, #endif sffe_julia, {"User defined", "User defined"}, "user", /*{0.5, -2.0, 1.25, -1.25}, */ /*{-0.75, 0.0, 1, 1}, */ /* 2009-08-01 JB Langston * Changed default zoom level to match Mandelbrot */ //{-0.75, 0.0, 2.5, 2.5}, //0, 1, 0.0, 0.0, // Changed default view to match Burning Ship {0.0, 0.0, 5, 5}, 0, 1, 0.0, 0.0, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, { {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, {INT_MAX, INT_MAX, 0, NULL}, }, MANDEL_BTRACE | SFFE_FRACTAL, } }; const struct formula *currentformula; const int nformulas = sizeof(formulas) / sizeof(struct formula); const int nmformulas = 16; // Is this correct here? -- Zoltan, 2009-07-30 XaoS-release-4.3.2/src/engine/fractal.cpp000066400000000000000000000315501455214672000201760ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /*#define STATISTICS */ #include #include #include #include #include #include #include "config.h" #include "filter.h" #include "cmplx.h" #include "plane.h" #include "timers.h" #ifndef M_PI #define M_PI 3.1415 #endif #include "xerror.h" struct symmetryinfo2 cursymmetry; struct palette cpalette; struct image cimage; struct fractal_context cfractalc; struct formula cformula; static symmetry2 sym_lines[100]; static void precalculate_rotation(fractal_context *c) { c->sin = sin((c->angle) * M_PI / 180); c->cos = cos((c->angle) * M_PI / 180); } static void recalc_view(fractal_context *c) { number_t xs = c->s.rr, ys = c->s.ri * c->windowwidth / c->windowheight, xc = c->s.cr, yc = c->s.ci, size; precalculate_rotation(c); my_rotate(*c, xc, yc); /*assert(c->s.rr >= 0); assert(c->s.ri >= 0); */ xs = myabs(xs); /*do not crash in overflowing cases */ ys = myabs(ys); if (xs > ys) size = xs; else size = ys; c->rs.nc = xc - size / 2; c->rs.mc = xc + size / 2; c->rs.ni = yc - size * c->windowheight / c->windowwidth / 2; c->rs.mi = yc + size * c->windowheight / c->windowwidth / 2; if (c->rs.nc > c->rs.mc) xc = c->rs.nc, c->rs.nc = c->rs.mc, c->rs.mc = xc; if (c->rs.ni > c->rs.mi) xc = c->rs.ni, c->rs.ni = c->rs.mi, c->rs.mi = xc; } static void set_view(fractal_context *c, const vinfo *s) { c->s = *s; recalc_view(c); } /*FIXME most of this code is obsolete */ static void /*inline */ combine_methods(void) { int angle = (int)cfractalc.angle; const struct symmetryinfo *s1 = cfractalc.currentformula->out + cfractalc.coloringmode, *s2 = cfractalc.currentformula->in + cfractalc.incoloringmode; if (angle < 0) { angle = 360 - ((-angle) % 360); } else angle %= 360; if (cfractalc.mandelbrot != cfractalc.currentformula->mandelbrot || cfractalc.bre || cfractalc.bim) { cursymmetry.xsym = (number_t)INT_MAX; cursymmetry.ysym = (number_t)INT_MAX; cursymmetry.nsymmetries = 0; return; } if (s1->xsym == s2->xsym) cursymmetry.xsym = s1->xsym; else cursymmetry.xsym = (number_t)INT_MAX; if (s1->ysym == s2->ysym) cursymmetry.ysym = s1->ysym; else cursymmetry.ysym = (number_t)INT_MAX; switch (cfractalc.plane) { case P_PARABOL: cursymmetry.xsym = (number_t)INT_MAX; break; case P_LAMBDA: if (cursymmetry.xsym == 0 && cursymmetry.ysym == 0) cursymmetry.xsym = (number_t)1; else cursymmetry.xsym = (number_t)INT_MAX; break; case P_INVLAMBDA: cursymmetry.xsym = (number_t)INT_MAX; break; case P_TRANLAMBDA: if (cursymmetry.xsym != 0 || cursymmetry.ysym != 0) cursymmetry.xsym = (number_t)INT_MAX; break; case P_MEREBERG: cursymmetry.xsym = (number_t)INT_MAX; break; } cursymmetry.symmetry = sym_lines; cursymmetry.nsymmetries = 0; if ((number_t)angle == cfractalc.angle) { switch (angle) { case 0: break; case 180: cursymmetry.xsym = -cursymmetry.xsym; cursymmetry.ysym = -cursymmetry.ysym; break; case 90: { number_t tmp = cursymmetry.xsym; cursymmetry.xsym = -cursymmetry.ysym; cursymmetry.ysym = tmp; } break; case 210: { number_t tmp = cursymmetry.xsym; cursymmetry.xsym = cursymmetry.ysym; cursymmetry.ysym = -tmp; } break; default: cursymmetry.xsym = (number_t)INT_MAX; cursymmetry.ysym = (number_t)INT_MAX; } } else { cursymmetry.xsym = (number_t)INT_MAX; cursymmetry.ysym = (number_t)INT_MAX; } if (cursymmetry.xsym == -(number_t)INT_MAX) cursymmetry.xsym = (number_t)INT_MAX; if (cursymmetry.ysym == -(number_t)INT_MAX) cursymmetry.ysym = (number_t)INT_MAX; } void update_view(fractal_context *context) { set_view(context, &context->s); } void set_fractalc(fractal_context *context, struct image *img) { update_view(context); precalculate_rotation(context); cfractalc = *context; /*its better to copy often accessed data into fixed memory locations */ cpalette = *img->palette; cimage = *img; cformula = *context->currentformula; if (cfractalc.maxiter < 1) cfractalc.maxiter = 1; if (cfractalc.bailout < 0) cfractalc.bailout = 0; if (cfractalc.periodicity) { if (!cformula.hasperiodicity || cfractalc.incoloringmode || !cfractalc.mandelbrot) cfractalc.periodicity = 0; else if (!cfractalc.plane) cfractalc.periodicity_limit = (context->rs.mc - context->rs.nc) / (double)img->width; else { int x, y; number_t xstep = ((context->rs.mc - context->rs.nc) / (double)img->width); number_t ystep = ((context->rs.mc - context->rs.nc) / (double)img->height); number_t xstep2 = ((context->rs.mc - context->rs.nc) / 5); number_t ystep2 = ((context->rs.mc - context->rs.nc) / 5); for (x = 0; x < 5; x++) for (y = 0; y < 5; y++) { number_t x1 = context->rs.mc + xstep2 * x; number_t y1 = context->rs.mi + ystep2 * y; number_t x2 = context->rs.mc + xstep2 * x + xstep; number_t y2 = context->rs.mi + ystep2 * y + ystep; recalculate(cfractalc.plane, &x1, &y1); recalculate(cfractalc.plane, &x2, &y2); x1 = myabs(x2 - x1); y1 = myabs(y2 - y1); if (x == y && x == 0) cfractalc.periodicity_limit = x1; if (cfractalc.periodicity > x1) cfractalc.periodicity_limit = x1; if (cfractalc.periodicity > y1) cfractalc.periodicity_limit = y1; } } } combine_methods(); if (cursymmetry.xsym == (number_t)INT_MAX) cursymmetry.xsym = cfractalc.rs.mc + INT_MAX; if (cursymmetry.ysym == (number_t)INT_MAX) cursymmetry.ysym = cfractalc.rs.mi + INT_MAX; if (cfractalc.coloringmode == 9 && cformula.smooth_calculate != NULL && (cpalette.type & (TRUECOLOR | TRUECOLOR16 | TRUECOLOR24 | GRAYSCALE | LARGEITER))) { cfractalc.calculate[0] = cformula.smooth_calculate; if (cformula.smooth_calculate_periodicity && cfractalc.periodicity) cfractalc.calculate[1] = cformula.smooth_calculate_periodicity; else cfractalc.calculate[1] = cformula.smooth_calculate; } else { cfractalc.calculate[0] = cformula.calculate; if (cformula.calculate_periodicity && cfractalc.periodicity) cfractalc.calculate[1] = cformula.calculate_periodicity; else cfractalc.calculate[1] = cformula.calculate; } } void set_formula(fractal_context *c, int num) { assert(num < nformulas); assert(num >= 0); if (num >= nformulas) num = 0; if (c->currentformula != formulas + num) { c->currentformula = formulas + num; c->version++; } if (c->mandelbrot != c->currentformula->mandelbrot) { c->mandelbrot = c->currentformula->mandelbrot; c->version++; } if (c->currentformula->pre != c->pre) { c->pre = c->currentformula->pre; if (!c->mandelbrot) c->version++; } if (c->currentformula->pim != c->pim) { c->pim = c->currentformula->pim; if (!c->mandelbrot) c->version++; } if (c->angle) { c->angle = 0; c->version++; } if (c->s.cr != c->currentformula->v.cr || c->s.ci != c->currentformula->v.ci || c->s.rr != c->currentformula->v.rr || c->s.ri != c->currentformula->v.ri) { c->s = c->currentformula->v; c->version++; } if (c->bre && c->bim) { c->bre = c->bim = 0; if (c->mandelbrot) c->version++; } } void fractalc_resize_to(fractal_context *c, float wi, float he) { c->windowwidth = wi; c->windowheight = he; recalc_view(c); return; } fractal_context *make_fractalc(const int formula, float wi, float he) { fractal_context *new_ctxt; new_ctxt = (fractal_context *)calloc(1, sizeof(fractal_context)); if (new_ctxt == NULL) return 0; new_ctxt->windowwidth = wi; new_ctxt->periodicity = 1; new_ctxt->windowheight = he; new_ctxt->maxiter = DEFAULT_MAX_ITER; new_ctxt->bailout = DEFAULT_BAILOUT; new_ctxt->coloringmode = 0; new_ctxt->intcolor = 0; new_ctxt->outtcolor = 0; new_ctxt->slowmode = 0; new_ctxt->range = 3; new_ctxt->angle = 0; #ifdef USE_SFFE // These parsers don't actually calculate anything; they're just // here to validate the formula before it's sent to the thread // local parsers, so the variables are just set to a dummy location // to make them legal for the parser static cmplx sffe_dummy; new_ctxt->userformula = sffe_alloc(); sffe_regvar(&new_ctxt->userformula, &sffe_dummy, "p"); sffe_regvar(&new_ctxt->userformula, &sffe_dummy, "z"); sffe_regvar(&new_ctxt->userformula, &sffe_dummy, "c"); sffe_regvar(&new_ctxt->userformula, &sffe_dummy, "n"); new_ctxt->userinitial = sffe_alloc(); sffe_regvar(&new_ctxt->userinitial, &sffe_dummy, "p"); sffe_regvar(&new_ctxt->userinitial, &sffe_dummy, "z"); sffe_regvar(&new_ctxt->userinitial, &sffe_dummy, "c"); sffe_regvar(&new_ctxt->userinitial, &sffe_dummy, "n"); #endif set_formula(new_ctxt, formula); return (new_ctxt); } void free_fractalc(fractal_context *c) { #ifdef USE_SFFE sffe_free(&c->userformula); sffe_free(&c->userinitial); #endif free(c); } void speed_test(fractal_context *c, struct image *img) { // unsigned int sum; tl_timer *t; int time; unsigned int i; set_fractalc(c, img); t = tl_create_timer(); cfractalc.maxiter = 100; (void)cfractalc.currentformula->calculate(0.0, 0.0, 0.0, 0.0); if (cfractalc.currentformula->calculate_periodicity != NULL) (void)cfractalc.currentformula->calculate_periodicity(0.0, 0.0, 0.0, 0.0); if (cfractalc.currentformula->smooth_calculate != NULL) (void)cfractalc.currentformula->smooth_calculate(0.0, 0.0, 0.0, 0.0); if (cfractalc.currentformula->smooth_calculate_periodicity != NULL) (void)cfractalc.currentformula->smooth_calculate_periodicity(0.0, 0.0, 0.0, 0.0); cfractalc.maxiter = 20000000; tl_update_time(); tl_reset_timer(t); /*sum = rdtsc (); */ i = cfractalc.currentformula->calculate(0.0, 0.0, 0.0, 0.0); /*sum -= rdtsc (); printf ("%f\n", (double) (-sum) / cfractalc.maxiter); */ tl_update_time(); time = tl_lookup_timer(t); x_message("Result:%i Formulaname:%s Time:%i Mloops per sec:%.2f", (int)i, cfractalc.currentformula->name[0], time, cfractalc.maxiter / (double)time); if (cfractalc.currentformula->smooth_calculate != NULL) { tl_update_time(); tl_reset_timer(t); i = cfractalc.currentformula->smooth_calculate(0.0, 0.0, 0.0, 0.0); tl_update_time(); time = tl_lookup_timer(t); x_message("Result:%i Formulaname:%s Time:%i Mloops per sec:%.2f", (int)i, cfractalc.currentformula->name[0], time, cfractalc.maxiter / (double)time); } tl_free_timer(t); } XaoS-release-4.3.2/src/engine/interlace.cpp000066400000000000000000000062521455214672000205310ustar00rootroot00000000000000#include "config.h" #include #include /*for NULL */ #include /*for memcpy */ #include "filter.h" struct intdata { unsigned char *lastent; int changed; int first; }; static int requirement(struct filter *f, struct requirements *r) { r->nimages = 1; r->flags |= IMAGEDATA; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { int x; struct intdata *d = (struct intdata *)f->data; pixel_t **lines1 = (pixel_t **)malloc(sizeof(*lines1) * i->image->height / 2), **lines2 = (pixel_t **)malloc(sizeof(*lines2) * i->image->height / 2); if (lines1 == NULL) return 0; inhermisc(f, i); d->first = 1; if (lines2 == NULL) { free(lines1); return 0; } if (f->childimage != NULL) destroy_image(f->childimage); f->image = i->image; f->image->flags |= PROTECTBUFFERS; i->flags |= DATALOST; for (x = 0; x < (i->image->height) / 2; x++) { lines1[x] = i->image->currlines[x * 2]; lines2[x] = i->image->currlines[x * 2 + 1]; } f->childimage = i->image = create_image_lines( i->image->width, (i->image->height) / 2, 2, lines1, lines2, i->image->palette, NULL, FREELINES | PROTECTBUFFERS, f->image->pixelwidth, f->image->pixelheight * 2); if (i->image == NULL) { free(lines1); free(lines2); return 0; } return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct intdata *i = (struct intdata *)calloc(1, sizeof(*i)); f->data = i; f->name = "Interlace filter"; return (f); } static void destroyinstance(struct filter *f) { free(f->data); if (f->childimage != NULL) destroy_image(f->childimage); free(f); } static int doit(struct filter *f, int flags, int time) { struct intdata *i = (struct intdata *)f->data; int val; if (!(f->req.flags & IMAGEDATA) && f->childimage->currlines[0] == i->lastent) f->childimage->flip(f->childimage); i->lastent = f->childimage->currlines[0]; val = f->previous->action->doit(f->previous, flags, time); if (i->first) { int y; for (y = 0; y < f->childimage->height; y++) memcpy(f->childimage->oldlines[y], f->childimage->currlines[y], f->childimage->width * f->childimage->bytesperpixel); i->first = 0; } if (val & CHANGED) i->changed = 1, val |= ANIMATION; else { if (i->changed) val |= CHANGED; i->changed = 0; } return (val); } static void convertup(struct filter *f, int *x, int *y) { *y *= 2; f->next->action->convertup(f->next, x, y); } static void convertdown(struct filter *f, int *x, int *y) { *y /= 2; f->previous->action->convertdown(f->previous, x, y); } const struct filteraction interlace_filter = { "Interlace filter", "interlace", 0, getinstance, destroyinstance, doit, requirement, initialize, convertup, convertdown, NULL}; XaoS-release-4.3.2/src/engine/itersmall.cpp000066400000000000000000000116551455214672000205620ustar00rootroot00000000000000#include "config.h" #include "config.h" #include #define SLARGEITER #include "filter.h" #include "xthread.h" #define NCOLORS 256 #define IMAGETYPE SMALLITER #define spixel_t pixel8_t struct siterdata { struct palette *palette; }; static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~IMAGEDATA; r->supportedmask = MASK1BPP | MASK2BPP | MASK3BPP | MASK4BPP; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { struct siterdata *s = (struct siterdata *)f->data; inhermisc(f, i); if (!inherimage(f, i, TOUCHIMAGE, 0, 0, s->palette, 0, 0)) return 0; return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct siterdata *i = (struct siterdata *)calloc(1, sizeof(*i)); i->palette = createpalette(0, 65536, IMAGETYPE, 0, 65536, NULL, NULL, NULL, NULL, NULL); f->data = i; f->name = "Smalliter image converter"; return (f); } static void convert8(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *img1 = f->childimage, *img2 = f->image; unsigned char *src, *srcend; unsigned int *pixels = img2->palette->pixels; pixel8_t *dest; int i; for (i = r1; i < r2; i++) { src = img1->currlines[i]; dest = img2->currlines[i]; srcend = src + img1->width; for (; src < srcend; src++, dest++) *dest = pixels[*src]; } } static void convert16(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *img1 = f->childimage, *img2 = f->image; unsigned char *src, *srcend; unsigned int *pixels = img2->palette->pixels; pixel16_t *dest; int i; for (i = r1; i < r2; i++) { src = img1->currlines[i]; dest = (pixel16_t *)img2->currlines[i]; srcend = src + img1->width; for (; src < srcend; src++, dest++) { *dest = pixels[*src]; } } } #ifdef STRUECOLOR24 #include "true24.h" static void convert24(void *data, struct taskinfo *task, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *img1 = f->childimage, *img2 = f->image; unsigned char *src, *srcend; unsigned int *pixels = img2->palette->pixels; cpixel_t *dest; int i; for (i = r1; i < r2; i++) { src = img1->currlines[i]; dest = (cpixel_t *)img2->currlines[i]; srcend = src + img1->width; for (; src < srcend; src++, dest += 3) p_set(dest, pixels[*src]); } } #endif static void convert32(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct image *img1 = f->childimage, *img2 = f->image; unsigned char *src, *srcend; unsigned int *pixels = img2->palette->pixels; pixel32_t *dest; int i; for (i = r1; i < r2; i++) { src = img1->currlines[i]; dest = (pixel32_t *)img2->currlines[i]; srcend = src + img1->width; for (; src < srcend; src++, dest++) *dest = pixels[*src]; } } static void destroyinstance(struct filter *f) { struct siterdata *i = (struct siterdata *)f->data; destroypalette(i->palette); free(f->data); destroyinheredimage(f); free(f); } static int doit(struct filter *f, int flags, int time) { int val; int size; updateinheredimage(f); if (f->image->palette->size < 256) size = f->image->palette->size; else size = 256; if (size != f->childimage->palette->size) f->childimage->palette->size = size, f->childimage->palette->version++; val = f->previous->action->doit(f->previous, flags, time); if (f->image->palette->type != SMALLITER || f->image->currlines[0] != f->childimage->currlines[0]) { drivercall(*f->image, xth_function(convert8, f, f->image->height), xth_function(convert16, f, f->image->height), xth_function(convert24, f, f->image->height), xth_function(convert32, f, f->image->height)) } xth_sync(); return val; } const struct filteraction smalliter_filter = {"Smalliter image converter", "smalliter", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdowngeneric, NULL}; XaoS-release-4.3.2/src/engine/julia.cpp000066400000000000000000000046611455214672000176710ustar00rootroot00000000000000#include #include #include "config.h" #include #include #include "filter.h" #include "julia.h" #include "config.h" #include "filter.h" /*most of code was moved to docalc.c */ #ifdef STATISTICS int iters2, guessed2, unguessed2, total2; #endif void init_julia(struct image *img, number_t rangep, number_t range, number_t xdelta, number_t ystep) { int i, j, x, y; number_t im; unsigned char *addr, **addr1 = img->currlines; for (i = 0; i < img->height; i++) { im = IMIN + (i + 0.5) * ystep; x = (int)(sqrt(rangep - im * im) * xdelta + 0.5); if (!i || i == img->height - 1) x = 0; addr = addr1[i]; y = img->width / 2 - x; if (y < 1) y = 1; for (j = 0; j < y; j++) { addr[j] = 1; } y = img->width; j = img->width / 2 + x; if (j >= img->width) j = img->width - 1; for (j = img->width / 2 + x; j < y; j++) { addr[j] = 1; } } for (i = 0; i < img->height; i++) { addr = addr1[i]; memset((char *)addr, NOT_CALCULATED, img->width); } } static int requirement(struct filter *f, struct requirements *r) { r->nimages = 1; r->flags = 0; r->supportedmask = SMALLITER; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { inhermisc(f, i); f->image = i->image; return (1); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); f->name = "Julia generator"; return (f); } static void destroyinstance(struct filter *f) { free(f); } static int doit(struct filter *f, int /*flags*/, int /*time*/) { /*if(f->image->nimages==2) f->image->flip(f->image); */ if (f->fractalc->currentformula->calculate_julia != NULL) { f->fractalc->currentformula->calculate_julia(f->image, f->fractalc->pre, f->fractalc->pim); return (CHANGED); } #ifdef STATISTICS printf("Total guessed %i, unguessed %i, iterations %i\n", guessed2, unguessed2, iters2); #endif return 0; } const struct filteraction julia_filter = { "Julia generator", "julia", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdowngeneric, NULL, }; XaoS-release-4.3.2/src/engine/julia.h000066400000000000000000000007451455214672000173350ustar00rootroot00000000000000#ifndef JULIA_H #define JULIA_H void init_julia(struct image *img, number_t rangep, number_t range, number_t xdelta, number_t ystep); #define SAG /*solid anti-guessing */ #define NOT_CALCULATED (unsigned char)0 #define INSET (unsigned char)0 #define INPROCESS (unsigned char)255 #define RMIN -range #define RMAX range #define IMIN -range #define IMAX range #define QMAX 1000 #ifdef STATISTICS extern int iters2, guessed2, unguessed2, total2, frames2; #endif #endif XaoS-release-4.3.2/src/engine/paletted.h000066400000000000000000000011571455214672000200310ustar00rootroot00000000000000#ifndef UNSUPPORTED static void cpalette(void *data, struct taskinfo */*task*/, int r1, int r2) { pixel8_t *src, *srcend; cppixel_t dest; struct filter *f = (struct filter *)data; struct palettedata *s = (struct palettedata *)f->data; int i; unsigned int *table = s->table; for (i = r1; i < r2; i++) { src = f->childimage->currlines[i]; srcend = src + f->image->width; dest = (cppixel_t)f->image->currlines[i]; while (src < srcend) { p_set(dest, table[*src]); src++; p_inc(dest, 1); } } } #endif #undef cpalette XaoS-release-4.3.2/src/engine/palettef.cpp000066400000000000000000000101431455214672000203610ustar00rootroot00000000000000#include "config.h" #include #include #include "filter.h" #include "fractal.h" #include "xthread.h" struct palettedata { struct palette *palette; int active; unsigned int table[256]; }; #include "c256.h" #define cpalette palette8 #include "paletted.h" #include "truecolor.h" #define cpalette palette32 #include "paletted.h" #include "true24.h" #define cpalette palette24 #include "paletted.h" #include "hicolor.h" #define cpalette palette16 #include "paletted.h" static void mysetcolor(struct palette *p, int /*start*/, int /*end*/, rgb_t */*rgb*/) { p->data = &p; } static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~(IMAGEDATA); r->supportedmask = MASK1BPP | MASK2BPP | MASK3BPP | MASK4BPP; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { struct palettedata *s = (struct palettedata *)f->data; inhermisc(f, i); if (i->image->palette->type != C256 || i->image->palette->setpalette == NULL) { if (datalost(f, i) || i->image->version != f->imageversion || !s->active) { if (!s->active) { struct palette *palette; palette = clonepalette(i->image->palette); restorepalette(s->palette, palette); destroypalette(palette); } s->palette->data = s; if (i->image->palette->maxentries < 256) s->palette->maxentries = i->image->palette->maxentries; else s->palette->maxentries = 256; s->active = 1; } if (!inherimage(f, i, TOUCHIMAGE | IMAGEDATA, 0, 0, s->palette, 0, 0)) return 0; setfractalpalette(f, s->palette); f->queue->saveimage = f->childimage; f->queue->palettechg = f; } else { if (s->active) { f->image = i->image; restorepalette(f->image->palette, s->palette); } s->active = 0; } return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct palettedata *i = (struct palettedata *)calloc(1, sizeof(*i)); i->active = 0; i->palette = createpalette(0, 256, C256, 0, 256, NULL, mysetcolor, NULL, NULL, NULL); f->childimage = NULL; f->data = i; f->name = "Palette emulator"; return (f); } static void destroyinstance(struct filter *f) { struct palettedata *i = (struct palettedata *)f->data; destroypalette(i->palette); destroyinheredimage(f); free(f->data); free(f); } static int doit(struct filter *f, int flags, int time1) { int val; int time = time1; struct palettedata *s = (struct palettedata *)f->data; if (s->active) updateinheredimage(f); if (flags & PALETTEONLY) val = 0; else val = f->previous->action->doit(f->previous, flags, time); if (s->active) { int i; if (s->palette->data != NULL) { val |= CHANGED; restorepalette(f->image->palette, f->childimage->palette); for (i = 0; i < 256; i++) { s->table[i] = f->image->palette->pixels[i % f->image->palette->size]; } s->palette->data = NULL; } drivercall(*f->image, xth_function(palette8, f, f->image->height), xth_function(palette16, f, f->image->height), xth_function(palette24, f, f->image->height), xth_function(palette32, f, f->image->height)); xth_sync(); } return val; } static void myremovefilter(struct filter *f) { struct palettedata *s = (struct palettedata *)f->data; if (s->active) { restorepalette(f->image->palette, s->palette); } } const struct filteraction palette_filter = { "Palette emulator", "palette", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdowngeneric, myremovefilter}; XaoS-release-4.3.2/src/engine/plane.cpp000066400000000000000000000062411455214672000176600ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include "config.h" #include "plane.h" #include "cmplx.h" const char *const planename[] = { "mu", "1/mu", "1/(mu+0.25)", "lambda", "1/lambda", "1/(lambda-1)", "1/(mu-1.40115)", NULL}; void recalculate(int plane, number_t *x1, number_t *y1) { number_t x = *x1, y = *y1; switch (plane) { case 1: { /* 1/mu */ number_t t; if (myabs(x) + myabs(y) < 0.000001) t = INT_MAX, y = INT_MAX; else { c_div(1, 0, x, y, t, y); } x = t; } break; case 2: { /* 1/(mu + 0.25) */ number_t t; if (myabs(x) + myabs(y) < 0.000001) t = INT_MAX, y = INT_MAX; else { c_div(1, 0, x, y, t, y); } x = t; x += 0.25; } break; case 3: /* lambda */ { number_t tr, ti, mr, mi; mr = x, mi = y; c_pow2(x, y, tr, ti); c_div(tr, ti, 4, 0, x, y); c_div(mr, mi, 2, 0, tr, ti); c_sub(tr, ti, x, y, mr, mi); x = mr, y = mi; } break; case 4: /* 1/lambda */ { number_t tr, ti, mr, mi; c_div(1, 0, x, y, tr, y); x = tr; mr = x, mi = y; c_pow2(x, y, tr, ti); c_div(tr, ti, 4, 0, x, y); c_div(mr, mi, 2, 0, tr, ti); c_sub(tr, ti, x, y, mr, mi); x = mr, y = mi; } break; case 5: /* 1/(lambda-1) */ { number_t tr, ti, mr, mi; c_div(1, 0, x, y, tr, y); x = tr + 1; mr = x, mi = y; c_pow2(x, y, tr, ti); c_div(tr, ti, 4, 0, x, y); c_div(mr, mi, 2, 0, tr, ti); c_sub(tr, ti, x, y, mr, mi); x = mr, y = mi; } break; case 6: { /* 1/(mu + 0.25) */ number_t t; if (myabs(x) + myabs(y) < 0.000001) t = INT_MAX, y = INT_MAX; else { c_div(1, 0, x, y, t, y); } x = t; x -= 1.40115; } break; default: break; } *x1 = x; *y1 = y; } XaoS-release-4.3.2/src/engine/rotate.cpp000066400000000000000000000135121455214672000200560ustar00rootroot00000000000000/* An rotation filter. Uses bressemham algorithm combined with dda to rotate * image around center * This filter is used internally by XaoS and is unvisible to normal user in * 'E' menu. * It is used to implement fast rotation mode */ #include "config.h" #include #include #include #include #define SLARGEITER #include "xthread.h" #include "filter.h" struct rotatedata { number_t angle; number_t x1, y1, x2, y2, xx1, yy1, xx2, yy2; }; #include "c256.h" #define do_rotate do_rotate8 #include "rotated.h" #include "truecolor.h" #define do_rotate do_rotate32 #include "rotated.h" #include "true24.h" #define do_rotate do_rotate24 #include "rotated.h" #include "hicolor.h" #define do_rotate do_rotate16 #include "rotated.h" static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~IMAGEDATA; r->supportedmask = MASK1BPP | MASK2BPP | MASK3BPP | MASK4BPP; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { float size, pixelsize; struct rotatedata *s = (struct rotatedata *)f->data; inhermisc(f, i); s->angle = INT_MAX; /*in/out coloring modes looks better in iter modes. This also saves some memory in truecolor. */ if (i->image->pixelwidth < i->image->pixelheight) pixelsize = i->image->pixelwidth; else pixelsize = i->image->pixelheight; size = sqrt(i->image->width * i->image->width * i->image->pixelwidth * i->image->pixelwidth + i->image->height * i->image->height * i->image->pixelheight * i->image->pixelheight); if (!inherimage(f, i, TOUCHIMAGE | NEWIMAGE, (int)(size / pixelsize + 1), (int)(size / pixelsize + 1), NULL, pixelsize, pixelsize)) return 0; return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct rotatedata *i = (struct rotatedata *)calloc(1, sizeof(*i)); f->name = "Rotation filter"; f->data = i; return (f); } static void destroyinstance(struct filter *f) { free(f->data); destroyinheredimage(f); free(f); } static int doit(struct filter *f, int flags, int time) { int val; struct rotatedata *s = (struct rotatedata *)f->data; number_t angle = f->fractalc->angle; number_t wx = f->fractalc->windowwidth, wy = f->fractalc->windowheight; number_t rr = f->fractalc->s.rr, ir = f->fractalc->s.ri; f->fractalc->windowwidth = f->fractalc->windowheight = f->childimage->width * f->childimage->pixelwidth; f->fractalc->s.rr *= f->fractalc->windowwidth / wx; f->fractalc->s.ri *= f->fractalc->windowheight / wy; f->fractalc->windowwidth = f->fractalc->windowheight = 1; f->fractalc->angle = 0; update_view(f->fractalc); /*update rotation tables */ updateinheredimage(f); val = f->previous->action->doit(f->previous, flags, time); f->fractalc->angle = angle; update_view(f->fractalc); /*update rotation tables */ f->fractalc->s.rr = rr; f->fractalc->s.ri = ir; f->fractalc->windowwidth = wx; f->fractalc->windowheight = wy; if ((val & CHANGED) || s->angle != angle) { s->xx2 = f->image->width * f->image->pixelwidth / 2; s->yy2 = f->image->height * f->image->pixelheight / 2; s->x1 = -s->xx2; s->y1 = -s->yy2; s->x2 = -s->xx2; s->y2 = s->yy2; s->xx1 = s->xx2; s->yy1 = -s->yy2; rotateback(*f->fractalc, s->x1, s->y1); rotateback(*f->fractalc, s->x2, s->y2); rotateback(*f->fractalc, s->xx1, s->yy1); rotateback(*f->fractalc, s->xx2, s->yy2); s->x1 /= f->childimage->pixelwidth; s->x1 += f->childimage->width / 2; s->y1 /= f->childimage->pixelwidth; s->y1 += f->childimage->width / 2; s->xx1 /= f->childimage->pixelwidth; s->xx1 += f->childimage->width / 2; s->yy1 /= f->childimage->pixelwidth; s->yy1 += f->childimage->width / 2; s->x2 /= f->childimage->pixelwidth; s->x2 += f->childimage->width / 2; s->y2 /= f->childimage->pixelwidth; s->y2 += f->childimage->width / 2; s->xx2 /= f->childimage->pixelwidth; s->xx2 += f->childimage->width / 2; s->yy2 /= f->childimage->pixelwidth; s->yy2 += f->childimage->width / 2; drivercall(*f->image, xth_function(do_rotate8, f, f->image->height), xth_function(do_rotate16, f, f->image->height), xth_function(do_rotate24, f, f->image->height), xth_function(do_rotate32, f, f->image->height)); xth_sync(); val |= CHANGED; } return val; } static void convertup(struct filter *f, int *x, int *y) { number_t xd = (*x - f->childimage->width / 2) * f->childimage->pixelwidth; number_t yd = (*y - f->childimage->height / 2) * f->childimage->pixelheight; *x = (int)(f->image->width / 2 + xd / f->image->pixelwidth); *y = (int)(f->image->height / 2 + yd / f->image->pixelheight); if (f->next != NULL) f->next->action->convertup(f->next, x, y); } static void convertdown(struct filter *f, int *x, int *y) { number_t xd = (*x - f->image->width / 2) * f->image->pixelwidth; number_t yd = (*y - f->image->height / 2) * f->image->pixelheight; *x = (int)(f->childimage->width / 2 + xd / f->childimage->pixelwidth); *y = (int)(f->childimage->height / 2 + yd / f->childimage->pixelheight); if (f->previous != NULL) f->previous->action->convertdown(f->previous, x, y); } const struct filteraction rotate_filter = { "Image rotation", "rotate", 0, getinstance, destroyinstance, doit, requirement, initialize, convertup, convertdown, NULL}; XaoS-release-4.3.2/src/engine/rotated.h000066400000000000000000000031151455214672000176650ustar00rootroot00000000000000#ifndef UNSUPPORTED static void do_rotate(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; struct rotatedata *s = (struct rotatedata *)f->data; double xstep = (s->x2 - s->x1) * 65536 / f->image->height; double ystep = (s->y2 - s->y1) * 65536 / f->image->height; double x = (s->x1) * 65536, y = (s->y1) * 65536; int ixstep = (int)((s->xx1 - s->x1) * 65536); int iystep = (int)((s->yy1 - s->y1) * 65536); int i; if (x < 0) x = 0; /*avoid shifting problems */ if (y < 0) y = 0; ixstep /= f->image->width; iystep /= f->image->width; /* I do floating point dda here since I expect that registers used by dda * will not conflict with registers of integer one used by main loop so it * will be faster than dda from stack :) */ x += r1 * xstep; y += r1 * ystep; for (i = r1; i < r2; i++) { { int ix = (int)x; int iy = (int)y; cpixel_t **vbuff = (cpixel_t **)f->childimage->currlines; cpixel_t *end = p_add((cpixel_t *)f->image->currlines[i], f->image->width), *dest = (cpixel_t *)f->image->currlines[i]; int iixstep = ixstep, iiystep = iystep; while (dest < end) { p_copy(dest, 0, (cpixel_t *)(vbuff[iy >> 16]), (ix >> 16)); p_inc(dest, 1); ix += iixstep; iy += iiystep; } } x += xstep; y += ystep; } } #endif #undef do_rotate XaoS-release-4.3.2/src/engine/star.cpp000066400000000000000000000062071455214672000175340ustar00rootroot00000000000000#include "config.h" #include "config.h" #include #include #include "filter.h" #include "xthread.h" struct starfielddata { struct palette *palette; struct palette *savedpalette; }; static unsigned int state; static inline void mysrandom(unsigned int x) { state = x; } #define MYLONG_MAX 0xffffff /*this is enough for me. */ static inline unsigned int myrandom(void) { state = ((state * 1103515245) + 12345) & MYLONG_MAX; return state; } #define IMAGETYPE SMALLITER #include "c256.h" #define do_starfield do_starfield8 #include "stard.h" #include "hicolor.h" #define do_starfield do_starfield16 #include "stard.h" #include "true24.h" #define do_starfield do_starfield24 #include "stard.h" #include "truecolor.h" #define do_starfield do_starfield32 #include "stard.h" static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~IMAGEDATA; r->supportedmask = C256 | TRUECOLOR24 | TRUECOLOR | TRUECOLOR16 | GRAYSCALE; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { struct starfielddata *s = (struct starfielddata *)f->data; inhermisc(f, i); if (s->savedpalette == NULL) s->savedpalette = clonepalette(i->image->palette); mkstarfieldpalette(i->image->palette); if (!inherimage(f, i, TOUCHIMAGE, 0, 0, s->palette, 0, 0)) { return 0; } setfractalpalette(f, s->savedpalette); return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct starfielddata *i = (struct starfielddata *)calloc(1, sizeof(*i)); i->savedpalette = NULL; i->palette = createpalette(0, 65536, IMAGETYPE, 0, 65536, NULL, NULL, NULL, NULL, NULL); f->data = i; f->name = "Starfield"; return (f); } static void destroyinstance(struct filter *f) { struct starfielddata *i = (struct starfielddata *)f->data; if (i->savedpalette != NULL) destroypalette(i->savedpalette); destroypalette(i->palette); destroyinheredimage(f); free(f); free(i); } static int doit(struct filter *f, int flags, int time) { int val; val = f->previous->action->doit(f->previous, flags, time); drivercall(*f->image, xth_function(do_starfield8, f, f->image->height), xth_function(do_starfield16, f, f->image->height), xth_function(do_starfield24, f, f->image->height), xth_function(do_starfield32, f, f->image->height)); xth_sync(); return val | CHANGED; } static void myremovefilter(struct filter *f) { struct starfielddata *s = (struct starfielddata *)f->data; if (s->savedpalette != NULL) { restorepalette(f->image->palette, s->savedpalette); destroypalette(s->savedpalette); s->savedpalette = NULL; } } const struct filteraction starfield_filter = { "Starfield", "starfield", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdowngeneric, myremovefilter}; XaoS-release-4.3.2/src/engine/stard.h000066400000000000000000000020051455214672000173350ustar00rootroot00000000000000#ifndef UNSUPPORTED static void do_starfield(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; cpixel_t *dest; pixel8_t *src, *srcend; unsigned int color; int y; cpixeldata_t black = (cpixeldata_t)f->image->palette->pixels[0]; mysrandom((unsigned int)rand()); for (y = r1; y < r2; y++) { src = f->childimage->currlines[y]; srcend = f->childimage->currlines[y] + f->childimage->width; dest = (cpixel_t *)f->image->currlines[y]; while (src < srcend) { color = ((unsigned int)myrandom() >> 7) & 15; if (!*src || (unsigned int)*src * (unsigned int)*src * (unsigned int)*src > (unsigned int)((unsigned int)myrandom() & (0xffffff))) { p_set(dest, (cpixeldata_t)f->image->palette->pixels[color]); } else p_set(dest, black); p_inc(dest, 1); src++; } } } #endif #undef do_starfield XaoS-release-4.3.2/src/engine/stereod.h000066400000000000000000000031601455214672000176700ustar00rootroot00000000000000#ifndef UNSUPPORTED static void do_stereogram(void *data, struct taskinfo */*task*/, int r1, int r2) { struct filter *f = (struct filter *)data; int i, y, lc; struct stereogramdata *s = (struct stereogramdata *)f->data; cpixel_t *cs, *c, *src, *src1, *ce; spixel_t *c1; unsigned int *pixels = f->image->palette->pixels; s->minc = NCOLORS; for (i = r1; i < r2; i++) { int i1; for (i1 = 0; i1 < 2; i1++) { c1 = (spixel_t *)f->childimage->currlines[i]; c = cs = (cpixel_t *)f->image->currlines[2 * i + i1]; ce = p_add(cs, f->image->width); src = src1 = c; lc = 1024; while (c < ce) { y = *c1; if (y == lc) p_inc(src, 2); else { lc = y; if (y < s->minc && y != 0) s->minc = y; y = table[y]; src = p_add(c, -y); } if (src < src1) { p_set(c, pixels[(rand() & 15)]); p_setp(c, 1, pixels[(rand() & 15)]); } else { if (src <= cs) { p_set(c, pixels[(rand() & 15)]); p_setp(c, 1, pixels[(rand() & 15)]); } else { p_copy(c, 0, src, 0); p_copy(c, 1, src, 1); } src1 = src; } p_inc(c, 2); c1++; } } } } #endif #undef do_stereogram XaoS-release-4.3.2/src/engine/stereogram.cpp000066400000000000000000000120221455214672000207230ustar00rootroot00000000000000#include "config.h" #include #include "xthread.h" #include "filter.h" #define PIXELWIDTH (f->image->pixelwidth) /*all distances in cm */ #define PIXELHEIGHT (f->image->pixelheight) #define USER_DIST (60.0) #define INDEX_DIST (0.3) #define EYE_DIST (8.5) #define START1 (60.0) #define FNC(x) x #define NCOLORS 256 #define IMAGETYPE SMALLITER #define spixel_t pixel8_t static int *table; struct stereogramdata { int minc; struct palette *palette; struct palette *savedpalette; }; #include "c256.h" #define do_stereogram do_stereogram8 #include "stereod.h" #include "hicolor.h" #define do_stereogram do_stereogram16 #include "stereod.h" #include "true24.h" #define do_stereogram do_stereogram24 #include "stereod.h" #include "truecolor.h" #define do_stereogram do_stereogram32 #include "stereod.h" static int requirement(struct filter *f, struct requirements *r) { f->req = *r; r->nimages = 1; r->flags &= ~IMAGEDATA; r->supportedmask = C256 | TRUECOLOR | TRUECOLOR24 | TRUECOLOR16 | GRAYSCALE; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { struct stereogramdata *s = (struct stereogramdata *)f->data; inhermisc(f, i); if (s->savedpalette == NULL) s->savedpalette = clonepalette(i->image->palette); mkstereogrampalette(i->image->palette); if (!inherimage(f, i, TOUCHIMAGE, i->image->width / 2, (i->image->height) / 2, s->palette, i->image->pixelwidth * 2, i->image->pixelheight * 2)) return 0; setfractalpalette(f, s->savedpalette); return (f->previous->action->initialize(f->previous, i)); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct stereogramdata *i = (struct stereogramdata *)calloc(1, sizeof(*i)); i->minc = 0; i->savedpalette = NULL; i->palette = createpalette(0, 65536, IMAGETYPE, 0, 65536, NULL, NULL, NULL, NULL, NULL); f->data = i; f->name = "Random dot stereogram"; return (f); } static void destroyinstance(struct filter *f) { struct stereogramdata *i = (struct stereogramdata *)f->data; if (i->savedpalette != NULL) destroypalette(i->savedpalette); destroypalette(i->palette); destroyinheredimage(f); free(f); free(i); } static int doit(struct filter *f, int flags, int time) { int val; struct stereogramdata *s = (struct stereogramdata *)f->data; int i, y; double start, maxdist, dist; updateinheredimage(f); if (f->fractalc->maxiter < NCOLORS) s->palette->size = f->fractalc->maxiter; else s->palette->size = NCOLORS; val = f->previous->action->doit(f->previous, flags, time); table = (int *)malloc(sizeof(int) * NCOLORS); dist = (f->fractalc->s.rr) / 2; maxdist = INDEX_DIST * FNC(f->fractalc->maxiter) + START1; do { start = dist * maxdist - INDEX_DIST * FNC(s->minc); maxdist *= 5; } while (start + INDEX_DIST * (FNC(s->minc)) < 25.0); if (f->fractalc->maxiter < NCOLORS) y = f->fractalc->maxiter; else y = NCOLORS; if (y < 256) y = 256; for (i = 0; i < y; i++) { double dist; if (i != 0) dist = i; else dist = y - 1; dist = INDEX_DIST * (FNC(dist)) + start; table[i] = (int)(EYE_DIST * dist / (dist + USER_DIST) / PIXELWIDTH); } drivercall(*f->image, xth_function(do_stereogram8, f, f->childimage->height), xth_function(do_stereogram16, f, f->childimage->height), xth_function(do_stereogram24, f, f->childimage->height), xth_function(do_stereogram32, f, f->childimage->height)); xth_sync(); free(table); return val; } static void convertup(struct filter *f, int *x, int *y) { *y *= 2; *x *= 2; f->next->action->convertup(f->next, x, y); } static void convertdown(struct filter *f, int *x, int *y) { *y /= 2; *x /= 2; if (f->previous != NULL) f->previous->action->convertdown(f->previous, x, y); } static void myremovefilter(struct filter *f) { struct stereogramdata *s = (struct stereogramdata *)f->data; if (s->savedpalette != NULL) { restorepalette(f->image->palette, s->savedpalette); destroypalette(s->savedpalette); s->savedpalette = NULL; } } const struct filteraction stereogram_filter = {"Random dot stereogram", "stereogram", 0, getinstance, destroyinstance, doit, requirement, initialize, convertup, convertdown, myremovefilter}; XaoS-release-4.3.2/src/engine/subwindow.cpp000066400000000000000000000152471455214672000206100ustar00rootroot00000000000000#include "config.h" #include #include /*for NULL */ #include /*for memcpy */ #include "filter.h" #include "zoom.h" struct subdata { struct filter *second; struct image *image; pixel_t **currlines; int recal; int forpversion, forversion; number_t pre, pim; }; void subwindow_setsecond(struct filter *f, struct filter *f1) { struct subdata *s = (struct subdata *)f->data; s->second = f1; } static void myflip(struct image *image) { struct subdata *s = (struct subdata *)image->data; flipgeneric(image); s->image->flip(s->image); s->currlines = s->image->currlines; } static int requirement(struct filter *f, struct requirements *r) { r->nimages = 2; r->flags |= IMAGEDATA; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { struct subdata *s = (struct subdata *)f->data; int x; int val = 0; pixel_t **lines1, **lines2 = NULL; double size; int width, height; int threed = 0; struct filter *f1 = f; inhermisc(f, i); if (datalost(f, i)) s->recal = 1; while (f1) { if (f1->action == &threed_filter) threed = 1; f1 = f1->next; } f->imageversion = i->image->version; if (f->childimage != NULL) destroy_image(f->childimage); s->image = f->image = i->image; s->image->flags |= PROTECTBUFFERS; s->currlines = f->image->currlines; s->forpversion = f->image->palette->version; s->forversion = f->fractalc->version; if (f->image->width * f->image->pixelwidth < f->image->height * f->image->pixelheight) size = f->image->width * f->image->pixelwidth / 2; else size = f->image->height * f->image->pixelheight / 2; width = (int)(size / f->image->pixelwidth); height = (int)(size / f->image->pixelheight); /*fractalc_resize_to(f->fractalc,size,size); */ lines1 = (pixel_t **)malloc(sizeof(*lines1) * height); if (f->image->nimages == 2) lines2 = (pixel_t **)malloc(sizeof(*lines2) * height); if (lines1 == NULL) return 0; if (f->image->nimages == 2 && lines2 == NULL) { free(lines1); return 0; } for (x = 0; x < height; x++) { lines1[x] = i->image->currlines[x + (threed ? f->image->height / 3 : 0)]; if (f->image->nimages == 2) lines2[x] = i->image->oldlines[x + (threed ? f->image->height / 3 : 0)]; } if (f->image->nimages == 2) for (x = 0; x < f->image->height; x++) { memcpy(f->image->oldlines[x], f->image->currlines[x], f->image->width * f->image->bytesperpixel); } f->childimage = i->image = create_image_lines( width, height, f->image->nimages, lines1, lines2, i->image->palette, myflip, FREELINES, f->image->pixelwidth, f->image->pixelheight); if (i->image == NULL) { free(lines1); free(lines2); return 0; } f->childimage->data = s; x = f->previous->action->initialize(f->previous, i); if (!x) return 0; if (s->second != NULL) { i->image = f->image; val = s->second->action->initialize(s->second, i); if (!val) return 0; } return (x | val); } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); struct subdata *s = (struct subdata *)calloc(1, sizeof(*s)); f->name = "Subwindow"; f->data = s; s->second = NULL; return (f); } static void destroyinstance(struct filter *f) { free(f->data); if (f->childimage != NULL) destroy_image(f->childimage); free(f); } static int doit(struct filter *f, int flags, int time) { int val = 0, m, vold; vinfo vs; vrect rs; float wwidth, wheight; struct subdata *s = (struct subdata *)f->data; static int v; if (s->second != NULL && (s->recal || s->forpversion != f->image->palette->version || s->forversion != f->fractalc->version)) { int x; if (s->recal) f->fractalc->version++; s->forpversion = f->image->palette->version; s->forversion = f->fractalc->version; s->recal = 1; val = (s->second->action->doit(s->second, flags, time)); if (val & ANIMATION) return val; s->recal = 0; if (f->image->nimages == 2) for (x = 0; x < f->image->height; x++) { memcpy(f->image->oldlines[x], f->image->currlines[x], f->image->width * f->image->bytesperpixel); } } if (s->currlines != f->image->currlines && f->childimage->nimages == 2) flipgeneric(f->childimage), s->currlines = f->image->currlines; /*FIXME: ugly hack for new julia mode */ v++; wwidth = f->fractalc->windowwidth; wheight = f->fractalc->windowheight; f->fractalc->windowwidth = f->previous->image->width * f->previous->image->pixelwidth; f->fractalc->windowheight = f->previous->image->height * f->previous->image->pixelheight; vs = f->fractalc->s; rs = f->fractalc->rs; f->fractalc->s = f->fractalc->currentformula->v; if (f->fractalc->currentformula->calculate_julia) { f->fractalc->s.cr = f->fractalc->s.ci = 0; f->fractalc->s.rr = f->fractalc->s.ri = 4; /*FIXME should be set to real formula's bailout */ } update_view(f->fractalc); m = f->fractalc->mandelbrot; vold = f->fractalc->version; if (s->pre != f->fractalc->pre || s->pim != f->fractalc->pim) { f->fractalc->version = v; s->pre = f->fractalc->pre; s->pim = f->fractalc->pim; } f->fractalc->mandelbrot = 0; val = f->previous->action->doit(f->previous, flags, time) | val; f->fractalc->mandelbrot = m; f->fractalc->version = vold; f->fractalc->s = vs; f->fractalc->rs = rs; f->fractalc->windowwidth = wwidth; f->fractalc->windowheight = wheight; return val; } static void myremove(struct filter */*f*/) { /*fractalc_resize_to(f->fractalc,f->queue->last->image->width*f->queue->last->image->pixelwidth,f->queue->last->image->height*f->queue->last->image->pixelheight); */ } static void convertdown(struct filter *f, int *x, int *y) { struct subdata *s = (struct subdata *)f->data; if (s->second != NULL) s->second->action->convertdown(s->second, x, y); if (f->previous != NULL) f->previous->action->convertdown(f->previous, x, y); } const struct filteraction subwindow_filter = { "Subwindow", "Subwindow", 0, getinstance, destroyinstance, doit, requirement, initialize, convertupgeneric, convertdown, myremove}; XaoS-release-4.3.2/src/engine/zoom.cpp000066400000000000000000001436441455214672000175560ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include "config.h" #define SLARGEITER #include "filter.h" #include "zoom.h" #include "cmplx.h" /*for myabs */ #include "plane.h" #include "btrace.h" #include "xthread.h" #include "xerror.h" #include "calculate.h" /*an inlined calculate function */ #include "i18n.h" #define ASIZE 16 #define ALIGN(x) (((x) + ASIZE - 1) & (~(ASIZE - 1))) static int nsymmetrized; unsigned char *tmpdata, *tmpdata1; struct realloc_s { number_t position; number_t price; unsigned int plus; int recalculate; int symto; int symref; int dirty; } #ifdef __GNUC__ __attribute__((aligned(32))) #endif ; typedef struct realloc_s realloc_t; typedef struct zoom_context { number_t *xpos, *ypos; int newcalc; int forversion; int forpversion; realloc_t *reallocx, *reallocy; int incomplete; int changed; } zoom_context; struct filltable { int from; int to; int length; int end; }; #define getzcontext(f) ((zoom_context *)((f)->data)) #define getfcontext(f) ((f)->fractalc) #define callwait() \ if (cfilter.wait_function != NULL) \ cfilter.wait_function(&cfilter); #define tcallwait() \ if (!xth_nthread(task) && cfilter.wait_function != NULL) \ cfilter.wait_function(&cfilter); #define setincomplete(i) (getzcontext(&cfilter)->incomplete = i) #define incincomplete() (getzcontext(&cfilter)->incomplete++) #define setchanged(i) (getzcontext(&cfilter)->changed = i) zoom_context czoomc; struct filter cfilter; #ifdef STATISTICS static int tocalculate = 0, avoided = 0; static int nadded = 0, nsymmetry = 0, nskipped = 0; int nperi = 0; #endif static void moveoldpoints(void *data1, struct taskinfo *task, int r1, int r2); static void fillline_8(int line); static void fillline_16(int line); // static void fillline_24(int line); static void fillline_32(int line); /*first of all inline driver section */ /*If you think this way is ugly, I must agree. Please let me know *about better one that allows to generate custom code for 8,16,24,32 *bpp modes and use of static variables */ #include "c256.h" #define fillline fillline_8 #define dosymmetry2 dosymmetry2_8 #define calcline calcline_8 #define calccolumn calccolumn_8 #include "zoomd.h" #include "truecolor.h" #define fillline fillline_32 #define dosymmetry2 dosymmetry2_32 #define calcline calcline_32 #define calccolumn calccolumn_32 #include "zoomd.h" #include "true24.h" #define fillline fillline_24 #define dosymmetry2 dosymmetry2_24 #define calcline calcline_24 #define calccolumn calccolumn_24 #include "zoomd.h" #include "hicolor.h" #define fillline fillline_16 #define dosymmetry2 dosymmetry2_16 #define calcline calcline_16 #define calccolumn calccolumn_16 #include "zoomd.h" #define calcline(a) \ drivercall(cimage, calcline_8(a), calcline_16(a), calcline_24(a), \ calcline_32(a)); #define calccolumn(a) \ drivercall(cimage, calccolumn_8(a), calccolumn_16(a), calccolumn_24(a), \ calccolumn_32(a)); struct dyn_data { long price; struct dyn_data *previous; }; #define FPMUL 64 /*Let multable fit into pentium cache */ #define RANGES 2 /*shift equal to x*RANGE */ #define RANGE 4 #define DSIZEHMASK (0x7) /*mask equal to x%(DSIZE) */ #define DSIZE (2 * RANGE) #define DSIZES (RANGES + 1) /*shift equal to x*DSIZE */ #define adddata(n, i) (dyndata + (((n) << DSIZES) + (((i) & (DSIZEHMASK))))) #define getbest(i) (dyndata + ((size) << DSIZES) + (i)) #define nosetadd ((size * 2) << DSIZES) #ifndef DEBUG #define CHECKPOS(pos) #else #define CHECKPOS(pos) \ (assert((pos) >= dyndata), \ assert((pos) < dyndata + (size) + ((size) << DSIZES))) #endif #ifdef __POWERPC__ #undef USE_MULTABLE #else #define USE_MULTABLE 1 #endif #ifdef USE_MULTABLE #define PRICE(i, i1) mulmid[(i) - (i1)] #else #define PRICE(i, i1) (((i) - (i1)) * ((i) - (i1))) #endif #define NEWPRICE (FPMUL * FPMUL * (RANGE) * (RANGE)) #define NOSETMASK ((unsigned int)0x80000000) #define END NULL #define MAXPRICE LONG_MAX /*static int dynsize = (int)sizeof (struct dyn_data);*/ #ifndef INT_MIN #define INT_MIN (-INT_MAX - 1) #endif #define IRANGE FPMUL *RANGE #ifdef USE_MULTABLE static int multable[RANGE * FPMUL * 2]; static int *mulmid; #endif /*Functions looks through rows/columns marked for calculation and tries to use *some symmetrical one instead */ /*FIXME should be threaded...but thread overhead should take more work than *do it in one, since it is quite simple and executes just in case fractal *on the screen is symmetrical and it is quite rare case...who knows */ static void preparesymmetries(realloc_t *realloc, const int size, int symi, number_t sym, number_t step) { int i; int istart = 0; number_t fy, ftmp; realloc_t *r = realloc, *reallocs; sym *= 2; i = 2 * symi - size; if (i < 0) i = 0; realloc += i; for (; i <= symi; i++, realloc++) { /*makes symmetries */ int j, min = 0; number_t dist = NUMBER_BIG, tmp1; if (realloc->symto != -1) continue; fy = realloc->position; realloc->symto = 2 * symi - i; if (realloc->symto >= size - RANGE) realloc->symto = size - RANGE - 1; dist = RANGE * step; min = RANGE; #ifdef DEBUG if (realloc->symto < 0 || realloc->symto >= size) { x_fatalerror("Internal error #22-1 %i", realloc->symto); assert(0); } #endif reallocs = &r[realloc->symto]; j = (realloc->symto - istart > RANGE) ? -RANGE : (-realloc->symto + istart); if (realloc->recalculate) { for (; j < RANGE && realloc->symto + j < size - 1; j++) { ftmp = sym - (reallocs + j)->position; if ((tmp1 = myabs(ftmp - fy)) < dist) { if ((realloc == r || ftmp > (realloc - 1)->position) && (ftmp < (realloc + 1)->position)) { dist = tmp1; min = j; } } else if (ftmp < fy) break; } } else { for (; j < RANGE && realloc->symto + j < size - 1; j++) { if (!realloc->recalculate) continue; ftmp = sym - (reallocs + j)->position; if ((tmp1 = myabs(ftmp - fy)) < dist) { if ((realloc == r || ftmp > (realloc - 1)->position) && (ftmp < (realloc + 1)->position)) { dist = tmp1; min = j; } } else if (ftmp < fy) break; } } realloc->symto += min; if (min == RANGE || realloc->symto <= symi || (reallocs = reallocs + min)->symto != -1 || reallocs->symref != -1) { realloc->symto = -1; continue; } if (!realloc->recalculate) { realloc->symto = -1; if (reallocs->symto != -1 || !reallocs->recalculate) continue; reallocs->plus = realloc->plus; reallocs->symto = i; nsymmetrized++; istart = realloc->symto - 1; reallocs->dirty = 1; realloc->symref = (int)(reallocs - r); STAT(nadded -= reallocs->recalculate); reallocs->recalculate = 0; reallocs->position = sym - realloc->position; } else { if (reallocs->symto != -1) { realloc->symto = -1; continue; } istart = realloc->symto - 1; STAT(nadded -= realloc->recalculate); nsymmetrized++; realloc->dirty = 1; realloc->plus = reallocs->plus; realloc->recalculate = 0; reallocs->symref = i; realloc->position = sym - reallocs->position; } STAT(nsymmetry++); #ifdef DEBUG if (realloc->symto < -1 || realloc->symto >= size) { x_fatalerror("Internal error #22 %i", realloc->symto); assert(0); } if (reallocs->symto < -1 || reallocs->symto >= size) { x_fatalerror("Internal error #22-2 %i", reallocs->symto); assert(0); } #endif } } static void newpositions(realloc_t *realloc, unsigned int size, number_t begin1, number_t end1, const number_t *fpos, int yend) { realloc_t *rs, *re, *rend; number_t step = size / (end1 - begin1); number_t start; number_t end; rend = realloc + size; rs = realloc - 1; re = realloc; while (rs < rend - 1) { re = rs + 1; if (re->recalculate) { while (re < rend && re->recalculate) re++; if (re == rend) end = end1; else end = re->position; if (rs == realloc - 1) { start = begin1; if (start > end) start = end; } else start = rs->position; if (re == rend && start > end) end = start; if (re - rs == 2) end = (end - start) * 0.5; else end = ((number_t)(end - start)) / (re - rs); switch (yend) { case 1: for (rs++; rs < re; rs++) { start += end, rs->position = start; rs->price = 1 / (1 + myabs(fpos[rs - realloc] - start) * step); } break; case 2: for (rs++; rs < re; rs++) { start += end, rs->position = start; rs->price = (myabs(fpos[rs - realloc] - start) * step); if (rs == realloc || rs == rend - 1) rs->price *= 500; } break; default: for (rs++; rs < re; rs++) { start += end, rs->position = start; rs->price = (number_t)1; } break; } } rs = re; } } /* This is the main reallocation algorithm described in xaos.info * It is quite complex since many loops are unrooled and uses custom * fixedpoint * * Takes approx 30% of time so looking for way to do it threaded. * Let me know :) */ static void mkrealloc_table(const number_t *fpos, realloc_t *realloc, const unsigned int size, const number_t begin, const number_t end, number_t sym, unsigned char *tmpdata) { unsigned int i; int counter; unsigned int ps, ps1 = 0, pe; unsigned int p; long int bestprice = MAXPRICE; realloc_t *r = realloc; struct dyn_data *dyndata; int yend, y; struct dyn_data **best; struct dyn_data **best1, **tmp; int *pos; number_t step, tofix; int symi = -1; unsigned int lastplus = 0; struct dyn_data *data; struct dyn_data *previous = NULL, *bestdata = NULL; int myprice; #ifdef STATISTICS nadded = 0, nsymmetry = 0, nskipped = 0; #endif pos = (int *)tmpdata; best = (struct dyn_data **)(tmpdata + ALIGN((size + 2) * sizeof(int))); best1 = (struct dyn_data **)(tmpdata + ALIGN((size + 2) * sizeof(int)) + ALIGN(size * sizeof(struct dyn_data **))); dyndata = (struct dyn_data *)(tmpdata + ALIGN((size + 2) * sizeof(int)) + 2 * ALIGN(size * sizeof(struct dyn_data **))); tofix = size * FPMUL / (end - begin); pos[0] = INT_MIN; pos++; for (counter = (int)size - 1; counter >= 0; counter--) { pos[counter] = (int)((fpos[counter] - begin) * tofix); /*first convert everything into fixedpoint */ if (counter < (int)size - 1 && pos[counter] > pos[counter + 1]) /*Avoid processing of missordered rows. They should happen because of limited precisity of FP numbers */ pos[counter] = pos[counter + 1]; } pos[size] = INT_MAX; step = (end - begin) / (number_t)size; if (begin > sym || sym > end) /*calculate symmetry point */ symi = -2; else { symi = (int)((sym - begin) / step); } ps = 0; pe = 0; y = 0; /* This is first pass that fills table dyndata, that holds information * about all ways algorithm thinks about. Correct way is discovered at * end by looking backward and determining witch way algorithm used to * calculate minimal value*/ for (i = 0; i < size; i++, y += FPMUL) { bestprice = MAXPRICE; p = ps; /*just inicialize parameters */ tmp = best1; best1 = best; best = tmp; yend = y - IRANGE; if (yend < -FPMUL) /*do no allow lines outside screen */ yend = -FPMUL; while (pos[p] <= yend) /*skip lines out of range */ p++; ps1 = p; yend = y + IRANGE; /*First try case that current line will be newly calculated */ /*Look for best way how to connect previous lines */ if (ps != pe && p > ps) { /*previous point had lines */ assert(p >= ps); if (p < pe) { previous = best[p - 1]; CHECKPOS(previous); } else previous = best[pe - 1]; CHECKPOS(previous); myprice = previous->price; /*find best one */ } else { if (i > 0) { /*previous line had no lines */ previous = getbest(i - 1); myprice = previous->price; } else previous = END, myprice = 0; } data = getbest(i); /*find store position */ myprice += NEWPRICE; bestdata = data; data->previous = previous; bestprice = myprice; /*calculate best available price */ data->price = myprice; /*store data */ assert(bestprice >= 0); /*FIXME:tenhle assert muze FAILIT! */ data = adddata(p, i); /*calculate all lines good for this y */ /* Now try all acceptable connection and calculate best possibility * with this connection */ if (ps != pe) { /*in case that previous had also positions */ int price1 = INT_MAX; /*At first line of previous interval we have only one possibility *don't connect previous line at all. */ if (p == ps) { /*here we must skip previous point */ if (pos[p] != pos[p + 1]) { previous = getbest(i - 1); myprice = previous->price; myprice += PRICE(pos[p], y); /*store data */ if (myprice < bestprice) { /*calculate best */ bestprice = myprice, bestdata = data; data->price = myprice; data->previous = previous; } } assert(bestprice >= 0); assert(myprice >= 0); best1[p] = bestdata; data += DSIZE; p++; } previous = NULL; price1 = myprice; while (p < pe) { /*this is area where intervals of current point and previous one are crossed */ if (pos[p] != pos[p + 1]) { if (previous != best[p - 1]) { previous = best[p - 1]; CHECKPOS(previous); price1 = myprice = previous->price; /*In case we found revolutional point, we should think *about changing our gusesses in last point too - don't *connect it at all, but use this way instead*/ if (myprice + NEWPRICE < bestprice) { /*true in approx 2/3 of cases */ bestprice = myprice + NEWPRICE, bestdata = data - DSIZE; (bestdata)->price = bestprice; (bestdata)->previous = previous + nosetadd; best1[p - 1] = bestdata; } } else myprice = price1; myprice += PRICE(pos[p], y); /*calculate price of new connection */ if (myprice < bestprice) { /*2/3 of cases */ /*if it is better than previous, store it */ bestprice = myprice, bestdata = data; data->price = myprice; data->previous = previous; } else if (pos[p] > y) { best1[p] = bestdata; data += DSIZE; p++; break; } } assert(myprice >= 0); assert(bestprice >= 0); /*FIXME:tenhle assert FAILI! */ best1[p] = bestdata; data += DSIZE; p++; } while (p < pe) { /*this is area where intervals of current point and previous one are crossed */ #ifdef DEBUG if (pos[p] != pos[p + 1]) { if (previous != best[p - 1]) { x_fatalerror("Missoptimization found!"); } } #endif assert(myprice >= 0); assert(bestprice >= 0); /*FIXME:tenhle assert FAILI! */ best1[p] = bestdata; data += DSIZE; p++; } /* OK...we passed crossed area. All next areas have same previous * situation so our job is easier * So find the best solution once for all of them */ if (p > ps) { previous = best[p - 1]; /*find best one in previous */ CHECKPOS(previous); price1 = previous->price; } else { previous = getbest(i - 1); price1 = previous->price; } /* Since guesses for "revolutional point" was always one * step back, we need to do last one*/ if (price1 + NEWPRICE < bestprice && p > ps1) { myprice = price1 + NEWPRICE; bestprice = myprice, bestdata = data - DSIZE; (bestdata)->price = myprice; (bestdata)->previous = previous + nosetadd; best1[p - 1] = bestdata; myprice -= NEWPRICE; } while (pos[p] < yend) { if (pos[p] != pos[p + 1]) { myprice = price1; myprice += PRICE(pos[p], y); /*store data */ if (myprice < bestprice) { /*calculate best */ bestprice = myprice, bestdata = data; data->price = myprice; data->previous = previous; } else if (pos[p] > y) break; } assert(bestprice >= 0); assert(myprice >= 0); best1[p] = bestdata; data += DSIZE; p++; } while (pos[p] < yend) { best1[p] = bestdata; p++; } } else { /* This is second case - previous y was not mapped at all. * Situation is simpler now, since we know that behind us is * large hole and our decisions don't affect best solution for * previous problem. Se we have just one answer * Situation is similar to latest loop in previous case */ int myprice1; /*simplified loop for case that previous y had no lines */ if (pos[p] < yend) { if (i > 0) { previous = getbest(i - 1); myprice1 = previous->price; } else previous = END, myprice1 = 0; while (pos[p] < yend) { if (pos[p] != pos[p + 1]) { myprice = myprice1 + PRICE(pos[p], y); if (myprice < bestprice) { data->price = myprice; data->previous = previous; bestprice = myprice, bestdata = data; } else if (pos[p] > y) break; } assert(bestprice >= 0); assert(myprice >= 0); best1[p] = bestdata; p++; data += DSIZE; } while (pos[p] < yend) { best1[p] = bestdata; p++; } } } /*previous = ps; */ /*store positions for next loop */ ps = ps1; ps1 = pe; pe = p; } assert(bestprice >= 0); realloc = realloc + size; yend = (int)((begin > fpos[0]) && (end < fpos[size - 1])); if (pos[0] > 0 && pos[size - 1] < (int)size * FPMUL) yend = 2; /*This part should be made threaded quite easily...but does it worth *since it is quite simple loop 0...xmax */ for (i = size; i > 0;) { /*and finally traces the path */ struct dyn_data *bestdata1; realloc--; i--; realloc->symto = -1; realloc->symref = -1; bestdata1 = bestdata->previous; if (bestdata1 >= dyndata + nosetadd || bestdata >= dyndata + ((size) << DSIZES)) { if (bestdata1 >= dyndata + nosetadd) bestdata1 -= nosetadd; realloc->recalculate = 1; STAT(nadded++); realloc->dirty = 1; lastplus++; if (lastplus >= size) lastplus = 0; realloc->plus = lastplus; } else { p = ((unsigned int)(bestdata - dyndata)) >> DSIZES; assert(p < size); realloc->position = fpos[p]; realloc->plus = p; realloc->dirty = 0; realloc->recalculate = 0; lastplus = p; } bestdata = bestdata1; } newpositions(realloc, size, begin, end, fpos, yend); realloc = r; if (symi <= (int)size && symi >= 0) { preparesymmetries(r, (int)size, symi, sym, step); } STAT(printf("%i added %i skipped %i mirrored\n", nadded, nskipped, nsymmetry)); STAT(nadded2 += nadded; nskipped2 += nskipped; nsymmetry2 += nsymmetry); } struct movedata { unsigned int size; unsigned int start; unsigned int plus; }; int avgsize; /* * this function prepares fast moving table for moveoldpoints * see xaos.info for details. It is not threaded since it is quite * fast. */ static void preparemoveoldpoints(void) { struct movedata *data, *sizend; realloc_t *rx, *rx1, *rend1; int sum = 0, num = 0; int plus1 = 0; data = (struct movedata *)tmpdata; for (rx = czoomc.reallocx, rend1 = rx + cimage.width; rx < rend1; rx++) if ((rx->dirty) && plus1 < cimage.width + 1) plus1++; else break; data->start = czoomc.reallocx->plus; data->size = 0; data->plus = plus1; rend1--; while (rend1->dirty) { if (rend1 == czoomc.reallocx) return; rend1--; } rend1++; for (; rx < rend1; rx++) { if ((rx->dirty || rx->plus == data->start + data->size)) data->size++; else { if (data->size) { plus1 = 0; rx1 = rx - 1; while (rx1 > czoomc.reallocx && rx1->dirty) plus1++, data->size--, rx1--; if (!(data->start + data->size < (unsigned int)cimage.width) && !rx->dirty) { int i; if (rx == rend1) break; for (i = 0; rx->dirty && rx < rend1; rx++) i++; data++; data->plus = plus1; data->size = (unsigned int)i; data->start = rx->plus - i; } else { sum += data->size; num++; data++; data->plus = plus1; data->start = rx->plus; } } else data->start = rx->plus; assert(rx->plus < (unsigned int)cimage.width); data->size = 1; } } if (data->size) { sizend = data + 1; sum += data->size; rx1 = rx - 1; while (rx1 > czoomc.reallocx && rx1->dirty) data->size--, rx1--; num++; } else sizend = data; sizend->size = 0; if (cimage.bytesperpixel != 1) { sum *= cimage.bytesperpixel; for (data = (struct movedata *)tmpdata; data < sizend; data++) { data->plus *= cimage.bytesperpixel; data->size *= cimage.bytesperpixel; data->start *= cimage.bytesperpixel; } } if (num) avgsize = sum / num; } static void moveoldpoints(void * /*data1*/, struct taskinfo * /*task*/, int r1, int r2) { struct movedata *data; unsigned char *vline, *vbuff; realloc_t *ry, *rend; int i = r1; for (ry = czoomc.reallocy + r1, rend = czoomc.reallocy + r2; ry < rend; ry++, i++) { if (!ry->dirty) { assert(ry->plus < (unsigned int)cimage.height); vbuff = cimage.currlines[i]; vline = cimage.oldlines[ry->plus]; for (data = (struct movedata *)tmpdata; data->size; data++) { vbuff += data->plus; memcpy(vbuff, vline + data->start, (size_t)data->size), vbuff += data->size; } } } } /* This function prepares fast filling tables for fillline */ static int mkfilltable(void) { int vsrc; int pos; realloc_t *rx, *r1, *r2, *rend, *rend2; int n = 0; int num = 0; struct filltable *tbl = (struct filltable *)tmpdata; pos = 0; vsrc = 0; rx = czoomc.reallocx; while (rx > czoomc.reallocx && rx->dirty) rx--; for (rend = czoomc.reallocx + cimage.width, rend2 = czoomc.reallocx + cimage.width; rx < rend; rx++) { if (rx->dirty) { r1 = rx - 1; for (r2 = rx + 1; r2 < rend2 && r2->dirty; r2++) ; while (rx < rend2 && rx->dirty) { n = (int)(r2 - rx); assert(n > 0); if (r2 < rend2 && (r1 < czoomc.reallocx || rx->position - r1->position > r2->position - rx->position)) vsrc = (int)(r2 - czoomc.reallocx), r1 = r2; else { vsrc = (int)(r1 - czoomc.reallocx); if (vsrc < 0) goto end; } pos = (int)(rx - czoomc.reallocx); assert(pos >= 0 && pos < cimage.width); assert(vsrc >= 0 && vsrc < cimage.width); tbl[num].length = n; tbl[num].to = pos * cimage.bytesperpixel; tbl[num].from = vsrc * cimage.bytesperpixel; tbl[num].end = tbl[num].length * cimage.bytesperpixel + tbl[num].to; /*printf("%i %i %i %i\n",num,tbl[num].length, tbl[num].to, * tbl[num].from); */ while (n) { rx->position = czoomc.reallocx[vsrc].position; rx->dirty = 0; rx++; n--; } num++; } /*while rx->dirty */ } /*if rx->dirty */ } /*for czoomc */ end: tbl[num].length = 0; tbl[num].to = pos; tbl[num].from = vsrc; return num; } static void filly(void * /*data*/, struct taskinfo * /*task*/, int rr1, int rr2) { unsigned char **vbuff = cimage.currlines; realloc_t *ry, *r1, *r2, *rend, *rend2, *rs = NULL; int linesize = cimage.width * cimage.bytesperpixel; ry = czoomc.reallocy + rr1; ry = czoomc.reallocy + rr1; while (ry > czoomc.reallocy && ry->dirty > 0) ry--; for (rend = czoomc.reallocy + rr2, rend2 = czoomc.reallocy + cimage.height; ry < rend; ry++) { if (ry->dirty > 0) { incincomplete(); r1 = ry - 1; for (r2 = ry + 1; r2 < rend2 && r2->dirty > 0; r2++) ; if (r2 >= rend2 && (rr2 != cimage.height || ry == 0)) return; while (ry < rend2 && ry->dirty > 0) { if (r1 < czoomc.reallocy) { rs = r2; if (r2 >= rend2) return; } else if (r2 >= rend2) rs = r1; else if (ry->position - r1->position < r2->position - ry->position) rs = r1; else rs = r2; if (!rs->dirty) { drivercall(cimage, fillline_8(rs - czoomc.reallocy), fillline_16(rs - czoomc.reallocy), fillline_24(rs - czoomc.reallocy), fillline_32(rs - czoomc.reallocy)); ry->dirty = -1; } memcpy(vbuff[ry - czoomc.reallocy], vbuff[rs - czoomc.reallocy], (size_t)linesize); ry->position = rs->position; ry->dirty = -1; ry++; } } if (ry < rend && !ry->dirty) { drivercall(cimage, fillline_8(ry - czoomc.reallocy), fillline_16(ry - czoomc.reallocy), fillline_24(ry - czoomc.reallocy), fillline_32(ry - czoomc.reallocy)); ry->dirty = -1; } } } static void fill(void) { if (cfilter.interrupt) { cfilter.pass = "reducing resolution"; mkfilltable(); xth_function(filly, NULL, cimage.height); } xth_sync(); } static void calculatenew(void * /*data*/, struct taskinfo *task, int /*r1*/, int /*r2*/) { int s; int i, y; realloc_t *rx, *ry, *rend; int range = cfractalc.range * 2; int positions[16]; int calcpositions[16]; /*int s3; */ if (range < 1) range = 1; if (range > 16) range = 16; memset(positions, 0, sizeof(positions)); calcpositions[0] = 0; positions[0] = 1; for (s = 1; s < range;) { for (i = 0; i < range; i++) { if (!positions[i]) { for (y = i; y < range && !positions[y]; y++) ; positions[(y + i) / 2] = 1; calcpositions[s++] = (y + i) / 2; } } } if (!xth_nthread(task)) { STAT(tocalculate = 0); STAT(avoided = 0); cfilter.pass = TR("Message", "Solid guessing 1"); cfilter.max = 0; cfilter.pos = 0; } /* We don't need to wory about race conditions here, since only * problem that should happen is incorrectly counted number * of lines to do... * * I will fix that problem later, but I think that this information * should be quite useless at multithreaded systems so it should * be a bit inaccurate. Just need to take care in percentage * displayers that thinks like -100% or 150% should happen */ if (!xth_nthread(task)) { for (ry = czoomc.reallocy, rend = ry + cimage.height; ry < rend; ry++) { if (ry->recalculate) cfilter.max++; } for (rx = czoomc.reallocx, rend = rx + cimage.width; rx < rend; rx++) { if (rx->recalculate) { cfilter.max++; } } } tcallwait(); for (s = 0; s < range; s++) { for (ry = czoomc.reallocy + calcpositions[s], rend = czoomc.reallocy + cimage.height; ry < rend; ry += range) { xth_lock(0); if (ry->recalculate == 1) { ry->recalculate = 2; xth_unlock(0); setchanged(1); ry->dirty = 0; calcline(ry); cfilter.pos++; #ifndef DRAW tcallwait(); #endif if (cfilter.interrupt) { break; } } else { xth_unlock(0); } } /*for ry */ for (rx = czoomc.reallocx + calcpositions[s], rend = czoomc.reallocx + cimage.width; rx < rend; rx += range) { xth_lock(1); if (rx->recalculate == 1) { rx->recalculate = 2; xth_unlock(1); setchanged(1); rx->dirty = 0; calccolumn(rx); cfilter.pos++; #ifndef DRAW tcallwait(); #endif if (cfilter.interrupt) { return; } } else { xth_unlock(1); } } } STAT( printf("Avoided caluclating of %i points from %i and %2.2f%% %2.2f%%\n", avoided, tocalculate, 100.0 * (avoided) / tocalculate, 100.0 * (tocalculate - avoided) / cimage.width / cimage.height)); STAT(avoided2 += avoided; tocalculate2 += tocalculate; frames2 += 1); } static void addprices(realloc_t *r, realloc_t *r2); static void addprices(realloc_t *r, realloc_t *r2) { realloc_t *r3; while (r < r2) { r3 = r + (((unsigned int)(r2 - r)) >> 1); r3->price = (r2->position - r3->position) * (r3->price); if (r3->symref != -1) r3->price = r3->price / 2; addprices(r, r3); r = r3 + 1; } } /* We can't do both symmetryies (x and y) in one loop at multithreaded * systems,since we need to take care to points at the cross of symmetrized * point/column */ static void dosymmetry(void * /*data*/, struct taskinfo * /*task*/, int r1, int r2) { unsigned char **vbuff = cimage.currlines + r1; realloc_t *ry, *rend; int linesize = cimage.width * cimage.bytesperpixel; for (ry = czoomc.reallocy + r1, rend = czoomc.reallocy + r2; ry < rend; ry++) { assert(ry->symto >= 0 || ry->symto == -1); if (ry->symto >= 0) { assert(ry->symto < cimage.height); if (!czoomc.reallocy[ry->symto].dirty) { memcpy(*vbuff, cimage.currlines[ry->symto], (size_t)linesize); ry->dirty = 0; } } vbuff++; } } /*Well, classical simple quicksort. Should be faster than library one *because of reduced number of function calls :) */ static inline void myqsort(realloc_t **start, realloc_t **end) { number_t med; realloc_t **left = start, **right = end - 1; while (1) { /*Quite strange caluclation of median, but should be *as good as Sedgewick middle of three method and is faster*/ med = ((*start)->price + (*(end - 1))->price) * 0.5; /*Avoid one comparison */ if (med > (*start)->price) { realloc_t *tmp; tmp = *left; *left = *right; *right = tmp; } right--; left++; while (1) { realloc_t *tmp; while (left < right && (*left)->price > med) left++; while (left < right && med > (*right)->price) right--; if (left < right) { tmp = *left; *left = *right; *right = tmp; left++; right--; } else break; } if (left - start > 1) myqsort(start, left); if (end - right <= 2) return; left = start = right; right = end - 1; } } static int tocalcx, tocalcy; static void processqueue(void *data, struct taskinfo *task, int /*r1*/, int /*r2*/) { realloc_t **tptr = (realloc_t **)data, **tptr1 = (realloc_t **)tmpdata; realloc_t *r, *end; end = czoomc.reallocx + cimage.width; while (tptr1 < tptr && (!cfilter.interrupt || tocalcx == cimage.width || tocalcy == cimage.height)) { xth_lock(0); r = *tptr1; if (r != NULL) { *tptr1 = NULL; xth_unlock(0); cfilter.pos++; if (tocalcx < cimage.width - 2 && tocalcy < cimage.height - 2) cfilter.readyforinterrupt = 1; tcallwait(); if (r >= czoomc.reallocx && r < end) { r->dirty = 0; tocalcx--; calccolumn(r); } else { r->dirty = 0; tocalcy--; calcline(r); } } else { xth_unlock(0); } tptr1++; } } /* * Another long unthreaded code. It seems to be really long and * ugly, but believe or not it takes just about 4% of calculation time, * so why to worry about? :) * * This code looks for columns/lines to calculate, adds them into queue, * sorts it in order of significancy and then calls parrel processqueue, * that does the job. */ static void calculatenewinterruptible(void) { realloc_t *r, *r2, *end, *end1; realloc_t **table, **tptr; /*tptr = table = (realloc_t **) malloc (sizeof (*table) * (cimage.width + * cimage.height)); */ tptr = table = (realloc_t **)tmpdata; end = czoomc.reallocx + cimage.width; tocalcx = 0, tocalcy = 0; STAT(tocalculate = 0); STAT(avoided = 0); cfilter.pass = TR("Message", "Solid guessing"); for (r = czoomc.reallocx; r < end; r++) if (r->dirty) tocalcx++, setchanged(1); for (r = czoomc.reallocx; r < end; r++) { if (r->recalculate) { for (r2 = r; r2 < end && r2->recalculate; r2++) *(tptr++) = r2; if (r2 == end) /*(r2 - 1)->price = 0, */ r2--; addprices(r, r2); r = r2; } } end1 = czoomc.reallocy + cimage.height; for (r = czoomc.reallocy; r < end1; r++) if (r->dirty) tocalcy++, setchanged(1); for (r = czoomc.reallocy; r < end1; r++) { if (r->recalculate) { for (r2 = r; r2 < end1 && r2->recalculate; r2++) *(tptr++) = r2; if (r2 == end1) /*(r2 - 1)->price = 0, */ r2--; addprices(r, r2); r = r2; } } if (table != tptr) { if (tptr - table > 1) myqsort(table, tptr); cfilter.pos = 0; cfilter.max = (int)(tptr - table); cfilter.incalculation = 1; callwait(); xth_function(processqueue, tptr, 1); callwait(); } cfilter.pos = 0; cfilter.max = 0; cfilter.pass = "Processing symmetries"; cfilter.incalculation = 0; callwait(); xth_sync(); if (nsymmetrized) { xth_function(dosymmetry, NULL, cimage.height); xth_sync(); drivercall(cimage, xth_function(dosymmetry2_8, NULL, cimage.width), xth_function(dosymmetry2_16, NULL, cimage.width), xth_function(dosymmetry2_24, NULL, cimage.width), xth_function(dosymmetry2_32, NULL, cimage.width)); xth_sync(); } if (cfilter.interrupt) { cfilter.pass = "reducing resolution"; mkfilltable(); xth_function(filly, NULL, cimage.height); } xth_sync(); STAT( printf("Avoided caluclating of %i points from %i and %2.2f%% %2.2f%%\n", avoided, tocalculate, 100.0 * (avoided) / tocalculate, 100.0 * (tocalculate - avoided) / cimage.width / cimage.height)); STAT(avoided2 += avoided; tocalculate2 += tocalculate; frames2 += 1); } static void init_tables(struct filter *f) { int i; zoom_context *c = getzcontext(f); /*c->dirty = 2; */ for (i = 0; i < f->image->width + 1; i++) c->xpos[i] = (-f->fractalc->rs.nc + f->fractalc->rs.mc) + f->fractalc->rs.mc; for (i = 0; i < f->image->height + 1; i++) c->ypos[i] = (-f->fractalc->rs.ni + f->fractalc->rs.mi) + f->fractalc->rs.mi; } static int alloc_tables(struct filter *f) { zoom_context *c = getzcontext(f); c->xpos = (number_t *)malloc((f->image->width + 8) * sizeof(*c->xpos)); if (c->xpos == NULL) return 0; c->ypos = (number_t *)malloc((f->image->height + 8) * sizeof(*c->ypos)); if (c->ypos == NULL) { free((void *)c->xpos); return 0; } c->reallocx = (realloc_t *)malloc(sizeof(realloc_t) * (f->image->width + 8)); if (c->reallocx == NULL) { free((void *)c->xpos); free((void *)c->ypos); return 0; } c->reallocy = (realloc_t *)malloc(sizeof(realloc_t) * (f->image->height + 8)); if (c->reallocy == NULL) { free((void *)c->xpos); free((void *)c->ypos); free((void *)c->reallocx); return 0; } return 1; } static void free_tables(struct filter *f) { zoom_context *c = getzcontext(f); if (c->xpos != NULL) free((void *)c->xpos), c->xpos = NULL; if (c->ypos != NULL) free((void *)c->ypos), c->ypos = NULL; if (c->reallocx != NULL) free((void *)c->reallocx), c->reallocx = NULL; if (c->reallocy != NULL) free((void *)c->reallocy), c->reallocy = NULL; } static void free_context(struct filter *f) { zoom_context *c; c = getzcontext(f); free_tables(f); free((void *)c); f->data = NULL; } static zoom_context *make_context(void) { zoom_context *new_ctxt; new_ctxt = (zoom_context *)calloc(1, sizeof(zoom_context)); if (new_ctxt == NULL) return NULL; new_ctxt->forversion = -1; new_ctxt->newcalc = 1; new_ctxt->reallocx = NULL; new_ctxt->reallocy = NULL; new_ctxt->xpos = NULL; new_ctxt->ypos = NULL; new_ctxt->incomplete = 0; return (new_ctxt); } static void startbgmkrealloc(void * /*data*/, struct taskinfo * /*task*/, int /*r1*/, int /*r2*/) { mkrealloc_table(czoomc.ypos, czoomc.reallocy, (unsigned int)cimage.height, cfractalc.rs.ni, cfractalc.rs.mi, cursymmetry.ysym, tmpdata1); } static int do_fractal(struct filter *f, int flags, int /*time*/) { number_t *posptr; int maxres; int size; int rflags = 0; realloc_t *r, *rend; f->image->flip(f->image); cfilter = *f; set_fractalc(f->fractalc, f->image); if (getzcontext(f)->forversion != f->fractalc->version || getzcontext(f)->newcalc || getzcontext(f)->forpversion != f->image->palette->version) { clear_image(f->image); free_tables(f); if (!alloc_tables(f)) return 0; init_tables(f); getzcontext(f)->newcalc = 0; getzcontext(f)->forversion = getfcontext(f)->version; getzcontext(f)->forpversion = f->image->palette->version; czoomc = *getzcontext(f); if (BTRACEOK && !(flags & INTERRUPTIBLE)) { boundarytraceall(czoomc.xpos, czoomc.ypos); f->flags &= ~ZOOMMASK; return CHANGED | (cfilter.interrupt ? INCOMPLETE : 0); } } else rflags |= INEXACT; czoomc = *getzcontext(f); setincomplete(0); setchanged(0); maxres = cimage.width; if (maxres < cimage.height) maxres = cimage.height; size = ALIGN((maxres) * (DSIZE + 1) * (int)sizeof(struct dyn_data)) + 2 * ALIGN(maxres * (int)sizeof(struct dyn_data **)) + ALIGN((maxres + 2) * (int)sizeof(int)); tmpdata = (unsigned char *)malloc(size); if (tmpdata == NULL) { x_error( "XaoS fatal error:Could not allocate memory for temporary data of size %i. " "I am unable to handle this problem so please resize to smaller window.", size); return 0; } if (nthreads != 1) { tmpdata1 = (unsigned char *)malloc(size); if (tmpdata1 == NULL) { x_error( "XaoS fatal error:Could not allocate memory for temporary data of size %i. " "I am unable to handle this problem so please resize to smaller window", size); return 0; } } else tmpdata1 = tmpdata; cfilter.incalculation = 0; cfilter.readyforinterrupt = 0; cfilter.interrupt = 0; nsymmetrized = 0; cfilter.max = 0; cfilter.pos = 0; cfilter.pass = "Making y realloc table"; xth_bgjob(startbgmkrealloc, NULL); cfilter.pass = "Making x realloc table"; mkrealloc_table(czoomc.xpos, czoomc.reallocx, (unsigned int)cimage.width, cfractalc.rs.nc, cfractalc.rs.mc, cursymmetry.xsym, tmpdata); callwait(); cfilter.pass = "Moving old points"; callwait(); preparemoveoldpoints(); xth_sync(); xth_function(moveoldpoints, NULL, cimage.height); cfilter.pass = "Starting calculation"; callwait(); xth_sync(); if (flags & INTERRUPTIBLE) calculatenewinterruptible(); else { xth_function(calculatenew, NULL, 1); if (cfilter.interrupt) { getzcontext(f)->incomplete = 1; } cfilter.pos = 0; cfilter.max = 0; cfilter.pass = "Processing symmetries"; callwait(); xth_sync(); if (nsymmetrized) { xth_function(dosymmetry, NULL, cimage.height); xth_sync(); drivercall(cimage, xth_function(dosymmetry2_8, NULL, cimage.width), xth_function(dosymmetry2_16, NULL, cimage.width), xth_function(dosymmetry2_24, NULL, cimage.width), xth_function(dosymmetry2_32, NULL, cimage.width)); xth_sync(); } if (getzcontext(f)->incomplete) { fill(); } } for (r = czoomc.reallocx, posptr = czoomc.xpos, rend = czoomc.reallocx + cimage.width; r < rend; r++, posptr++) { *posptr = r->position; } for (r = czoomc.reallocy, posptr = czoomc.ypos, rend = czoomc.reallocy + cimage.height; r < rend; r++, posptr++) { *posptr = r->position; } #ifdef STATISTICS STAT(printf("Statistics: frames %i\n" "mkrealloctable: added %i, symmetry %i\n" "calculate loop: tocalculate %i avoided %i\n" "calculate:calculated %i inside %i\n" "iters inside:%i iters outside:%i periodicty:%i\n", frames2, nadded2, nsymmetry2, tocalculate2, avoided2, ncalculated2, ninside2, niter2, niter1, nperi)); #endif f->flags &= ~ZOOMMASK; if (getzcontext(f)->incomplete) rflags |= INCOMPLETE, f->flags |= INCOMPLETE; if (getzcontext(f)->incomplete > (cimage.width + cimage.height) / 2) f->flags |= LOWQUALITY; if (getzcontext(f)->changed) rflags |= CHANGED; free(tmpdata); if (nthreads != 1) free(tmpdata1); return rflags; } static struct filter *getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); f->data = make_context(); f->name = "Zooming engine"; return (f); } static void destroyinstance(struct filter *f) { free_context(f); free(f); } static int requirement(struct filter *f, struct requirements *r) { r->nimages = 2; r->supportedmask = C256 | TRUECOLOR | TRUECOLOR24 | TRUECOLOR16 | LARGEITER | SMALLITER | GRAYSCALE; r->flags = IMAGEDATA | TOUCHIMAGE; return (f->next->action->requirement(f->next, r)); } static int initialize(struct filter *f, struct initdata *i) { #ifdef USE_MULTABLE if (!multable[0]) { int i; mulmid = multable + RANGE * FPMUL; for (i = -RANGE * FPMUL; i < RANGE * FPMUL; i++) mulmid[i] = i * i; } #endif inhermisc(f, i); if (i->image != f->image || datalost(f, i)) getzcontext(f)->forversion = -1, f->image = i->image; f->imageversion = i->image->version; return (1); } const struct filteraction zoom_filter = { "XaoS's zooming engine", "zoom", 0, getinstance, destroyinstance, do_fractal, requirement, initialize, convertupgeneric, convertdowngeneric, NULL, }; XaoS-release-4.3.2/src/engine/zoomd.h000066400000000000000000000241421455214672000173560ustar00rootroot00000000000000#ifndef UNSUPPORTED /* this two routines implements solid guessing. They are almost same. One * calculates lines, second rows. * * The heruistic is as follows: * * ---1------6------5------- (vbuffu) * | | | * ===7======X======8======= (vbuff1) * | | | * ---2------3------4------- (vbuffd) * distdown rx distup * * -- and | means calculated lines. == is current line, names are pointers to * them. Note that naming is quite confusing, because it is same in lines and * rows. * * we do solid guessing as folows: * |distl-vbuff1| < range * |distr-vbuff1| < range * the distance of distup and distdown is not limited, because we already * have exact enough guesses 3 and 6 * * points 1 2 3 4 5 6 8 must be the same (point 8 is not yet calculated) * */ static void calcline(realloc_t *ry); static void calcline(realloc_t *ry) { number_t y; int range = cfractalc.range; realloc_t *rx, *rend, *rend1, *ryl, *ryr; int distl, distr, distup, distdown; cpixel_t *vbuff, *vbuffu, *vbuffd; cpixeldata_t inset = (cpixeldata_t)cpalette.pixels[0]; cpixeldata_t c; cppixel_t *vbuff1 = (cpixel_t **)cimage.currlines + (ry - czoomc.reallocy); assert(ry >= czoomc.reallocy); assert(ry < czoomc.reallocy + cimage.height); y = ry->position; rend = ry - range - 1; if (czoomc.reallocy > rend) rend = czoomc.reallocy; for (ryl = ry - 1; rend <= ryl && ryl->dirty; ryl--) ; distl = (int)(ryl - ry); rend = ry + range; if (czoomc.reallocy + cimage.height < rend) rend = czoomc.reallocy + cimage.height; for (ryr = ry + 1; rend > ryr && ryr->dirty; ryr++) ; distr = (int)(ryr - ry); rend = czoomc.reallocy + cimage.height; if (ryr == czoomc.reallocy + cimage.height || ryl < czoomc.reallocy || ryr->dirty || ryl->dirty) { for (rx = czoomc.reallocx, vbuff = *vbuff1, rend1 = czoomc.reallocx + cimage.width; rx < rend1; rx++) { if (!rx->dirty) { STAT(tocalculate++); p_set(vbuff, (cpixeldata_t)calculate(rx->position, y, cfractalc.periodicity)); } p_inc(vbuff, 1); } } else { distup = INT_MAX / 2; distdown = 0; for (rx = czoomc.reallocx, vbuff = vbuff1[0], vbuffu = vbuff1[distl], vbuffd = vbuff1[distr], rend1 = czoomc.reallocx + cimage.width; rx < rend1; rx++) { assert(rx < czoomc.reallocx + cimage.width); assert(rx >= czoomc.reallocx); if (!rx->dirty) { STAT(tocalculate++); if (distdown <= 0) { for (ryr = rx + 1; ryr < rend1 && ryr->dirty; ryr++) ; distdown = (int)(ryr - rx); if (ryr == rend1) distdown = INT_MAX / 2; } if (distdown < INT_MAX / 4 && distup < INT_MAX / 4 && (p_get(vbuffu) == (c = p_get(vbuffd)) && c == p_getp(vbuff, -distup) && c == p_getp(vbuffu, -distup) && c == p_getp(vbuffu, distdown) && c == p_getp(vbuffd, distdown) && c == p_getp(vbuffd, -distup))) { p_set(vbuff, c); STAT(avoided++); } else { if (cfractalc.periodicity && distdown < INT_MAX / 4 && distup < INT_MAX / 4 && (p_get(vbuffu) != inset && p_get(vbuffd) != inset && p_getp(vbuff, -distup) != inset && p_getp(vbuffu, -distup) != inset && p_getp(vbuffu, +distdown) != inset && p_getp(vbuffd, -distup) != inset && p_getp(vbuffd, +distdown) != inset)) p_set(vbuff, (cpixeldata_t)calculate(rx->position, y, 0)); else p_set(vbuff, (cpixeldata_t)calculate(rx->position, y, cfractalc.periodicity)); } distup = 0; } p_inc(vbuff, 1); p_inc(vbuffu, 1); p_inc(vbuffd, 1); distdown--; distup++; } } ry->recalculate = 0; ry->dirty = 0; } static void calccolumn(realloc_t *rx); static void calccolumn(realloc_t *rx) { number_t x; int range = cfractalc.range; realloc_t *ry, *rend, *rend1, *rxl, *rxr; int pos, distl, distr, distup, distdown; cpixeldata_t c; cpixeldata_t inset = (cpixeldata_t)cpalette.pixels[0]; cppixel_t *vbuff; pos = (int)(rx - czoomc.reallocx); assert(pos >= 0); assert(pos < cimage.width); rend = rx - range + 1; if (czoomc.reallocx > rend) rend = czoomc.reallocx; for (rxl = rx - 1; rend <= rxl && rxl->dirty; rxl--) ; distl = (int)(rx - rxl); rend = rx + range; if (czoomc.reallocx + cimage.width < rend) rend = czoomc.reallocx + cimage.width; for (rxr = rx + 1; rxr < rend && rxr->dirty; rxr++) ; distr = (int)(rxr - rx); x = rx->position; rend = czoomc.reallocx + cimage.width; if (rxr >= czoomc.reallocx + cimage.width || rxl < czoomc.reallocx || rxr->dirty || rxl->dirty) { for (ry = czoomc.reallocy, vbuff = (cppixel_t *)cimage.currlines, rend1 = czoomc.reallocy + cimage.height; ry < rend1; ry++, vbuff++) { if (!ry->dirty) { STAT(tocalculate++); p_setp((*vbuff), pos, (cpixeldata_t)calculate(x, ry->position, cfractalc.periodicity)); } } } else { distl = pos - distl; distr = pos + distr; assert(distl >= 0); assert(distr < cimage.width); distup = INT_MAX / 2; distdown = 0; for (ry = czoomc.reallocy, vbuff = (cppixel_t *)cimage.currlines, rend1 = czoomc.reallocy + cimage.height; ry < rend1; ry++) { /*if (ry->symto == -1) { */ assert(ry < czoomc.reallocy + cimage.height); if (!ry->dirty) { STAT(tocalculate++); if (distdown <= 0) { for (rxr = ry + 1; rxr < rend1 && rxr->dirty; rxr++) ; distdown = (int)(rxr - ry); if (rxr == rend1) distdown = INT_MAX / 2; } if (distdown < INT_MAX / 4 && distup < INT_MAX / 4 && (p_getp(vbuff[0], distl) == (c = p_getp(vbuff[0], distr)) && p_getp(vbuff[-distup], distl) == c && p_getp(vbuff[-distup], distr) == c && p_getp(vbuff[-distup], pos) == c && p_getp(vbuff[distdown], distr) == c && p_getp(vbuff[distdown], distl) == c)) { STAT(avoided++); p_setp(vbuff[0], pos, c); } else { if (cfractalc.periodicity && distdown < INT_MAX / 4 && distup < INT_MAX / 4 && (p_getp(vbuff[0], distl) != inset && p_getp(vbuff[0], distr) != inset && p_getp(vbuff[distdown], distr) != inset && p_getp(vbuff[distdown], distl) != inset && p_getp(vbuff[-distup], distl) != inset && p_getp(vbuff[-distup], pos) != inset && p_getp(vbuff[-distup], distr) != inset)) p_setp(vbuff[0], pos, (cpixeldata_t)calculate(x, ry->position, 0)); else p_setp(vbuff[0], pos, (cpixeldata_t)calculate(x, ry->position, cfractalc.periodicity)); #ifdef DRAW vga_setcolor(0xffffff); vga_drawpixel(rx - czoomc.reallocx, ry - czoomc.reallocy); #endif } distup = 0; } vbuff++; distdown--; distup++; } } rx->recalculate = 0; rx->dirty = 0; } static inline void dosymmetry2(void * /*data*/, struct taskinfo * /*task*/, int r1, int r2) { cpixel_t **vbuff = (cpixel_t **)cimage.currlines; realloc_t *rx, *rend; cpixel_t **vend = (cpixel_t **)cimage.currlines + cimage.height; for (rx = czoomc.reallocx + r1, rend = czoomc.reallocx + r2; rx < rend; rx++) { assert(rx->symto >= 0 || rx->symto == -1); if (rx->symto >= 0) { assert(rx->symto < cimage.width); if (!czoomc.reallocx[rx->symto].dirty) { int pos = (int)(rx - czoomc.reallocx); int pos1 = rx->symto; vbuff = (cpixel_t **)cimage.currlines; for (; vbuff < vend; vbuff++) p_copy(vbuff[0], pos, vbuff[0], pos1); rx->dirty = 0; } } } } /* * Fill - bitmap depended part. * * This function is called, when calculation was interrupted because of * timeout. It fills uncalculated rows by nearest one * * This function is very time critical in higher resolutions I am shooting * for. */ static inline void fillline(int line) { unsigned char *vbuff = cimage.currlines[line]; const struct filltable *table = (struct filltable *)tmpdata; while (table->length) { cpixeldata_t s = p_get((cpixel_t *)(vbuff + table->from)); cpixel_t *vcurr = (cpixel_t *)(vbuff + table->to); cpixel_t *vend = (cpixel_t *)(vbuff + table->end); while (vcurr < vend) { p_set(vcurr, s); p_inc(vcurr, 1); } table++; } } #endif #undef dosymmetry2 #undef calcline #undef calccolumn #undef fillline #undef rend XaoS-release-4.3.2/src/formeval/000077500000000000000000000000001455214672000164205ustar00rootroot00000000000000XaoS-release-4.3.2/src/formeval/formeval.cpp000066400000000000000000000477611455214672000207560ustar00rootroot00000000000000/* * XaoS Formula Evaluator * Copyright (c) 2020 J.B. Langston * * Lexing and parsing logic based on TINYEXPR * Copyright (c) 2015-2018 Lewis Van Winkle * http://CodePlea.com * * Bytecode idea (but no code) comes from SFFE * https://github.com/malczak/sffe * * 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 acknowledgement 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 "formeval.h" #include #include #include #include #include #include #ifndef NAN #define NAN (0.0 / 0.0) #endif #ifndef INFINITY #define INFINITY (1.0 / 0.0) #endif using namespace std; namespace FormEval { /** * @brief constants Table of symbolic constants accessible from within the * expression. See Parser::addConstant for details. */ map constants = {{"pi", 3.14159265358979323846}, {"e", 2.71828182845904523536}, {"i", {0, 1}}}; /** * @brief variables Table of variables accessible from within the expression. * See Parser::addVariable for details. */ map variables; /** * @brief functions Table of functions accessible from with the * expression. See Parser::addFunction for details. */ map> functions = { // Operators {"+", {2, [](Parameters p) { *p[0] = *p[1] + *p[2]; }}}, {"-", {2, [](Parameters p) { *p[0] = *p[1] - *p[2]; }}}, {"*", {2, [](Parameters p) { *p[0] = *p[1] * *p[2]; }}}, {"/", {2, [](Parameters p) { *p[0] = *p[1] / *p[2]; }}}, {"^", {2, [](Parameters p) { *p[0] = pow(*p[1], *p[2]); }}}, {"negate", {1, [](Parameters p) { *p[0] = *p[1] * Value(-1); }}}, // Complex-specific functions {"re", {1, [](Parameters p) { *p[0] = Value(real(*p[1]), 0); }}}, {"real", {1, [](Parameters p) { *p[0] = Value(real(*p[1]), 0); }}}, {"im", {1, [](Parameters p) { *p[0] = Value(0, imag(*p[1])); }}}, {"imag", {1, [](Parameters p) { *p[0] = Value(0, imag(*p[1])); }}}, {"abs", {1, [](Parameters p) { *p[0] = Value(abs(*p[1])); }}}, {"arg", {1, [](Parameters p) { *p[0] = Value(arg(*p[1])); }}}, {"norm", {1, [](Parameters p) { *p[0] = Value(norm(*p[1])); }}}, {"conj", {1, [](Parameters p) { *p[0] = conj(*p[1]); }}}, {"proj", {1, [](Parameters p) { *p[0] = proj(*p[1]); }}}, // Exponential functions {"exp", {1, [](Parameters p) { *p[0] = exp(*p[1]); }}}, {"log", {1, [](Parameters p) { *p[0] = log(*p[1]); }}}, {"log10", {1, [](Parameters p) { *p[0] = log10(*p[1]); }}}, // Power functions {"pow", {2, [](Parameters p) { *p[0] = pow(*p[1], *p[2]); }}}, {"sqrt", {1, [](Parameters p) { *p[0] = sqrt(*p[1]); }}}, // Trig Functions {"sin", {1, [](Parameters p) { *p[0] = sin(*p[1]); }}}, {"cos", {1, [](Parameters p) { *p[0] = cos(*p[1]); }}}, {"tan", {1, [](Parameters p) { *p[0] = tan(*p[1]); }}}, {"asin", {1, [](Parameters p) { *p[0] = asin(*p[1]); }}}, {"acos", {1, [](Parameters p) { *p[0] = acos(*p[1]); }}}, {"atan", {1, [](Parameters p) { *p[0] = atan(*p[1]); }}}, // Hyperbolic trig functions {"sinh", {1, [](Parameters p) { *p[0] = sinh(*p[1]); }}}, {"cosh", {1, [](Parameters p) { *p[0] = cosh(*p[1]); }}}, {"tanh", {1, [](Parameters p) { *p[0] = cosh(*p[1]); }}}, {"asinh", {1, [](Parameters p) { *p[0] = asinh(*p[1]); }}}, {"acosh", {1, [](Parameters p) { *p[0] = acosh(*p[1]); }}}, {"atanh", {1, [](Parameters p) { *p[0] = atanh(*p[1]); }}}}; /** * @brief Node::Node Constructs a node for a numeric constant. * @param val The value of the numeric constant the node is to contain. */ Node::Node(Value val) { type = NodeType::Constant; value = val; } /** * @brief Node::Node Constructs a node for a symbolic constant, variable, or * function. Initialized with the address or value from the appropriate symbol * table. * @param identifier The string identifier of the constant, variable or * function. */ Node::Node(string identifier) { name = identifier; auto c = constants.find(identifier); if (c != constants.end()) { type = NodeType::Constant; value = c->second; } else { auto v = variables.find(identifier); if (v != variables.end()) { type = NodeType::Variable; variable = v->second; } else { auto f = functions.find(identifier); if (f != functions.end()) { type = NodeType::Function; arity = f->second.first; function = f->second.second; } } } } Node::Node() { type = NodeType::Invalid; } /** * @brief Node::~Node Destructor frees any parameter pointers that have been * allocated. */ Node::~Node() { if (parameters) delete parameters; } /** * @brief Node::addChild Adds a child (parameter) Node to a function node). Only * function nodes have children. * @param child The parameter/operand to add to this function. */ void Node::addChild(Node child) { children.push_back(child); } /** * @brief Node::compile Converts the parsed AST into a stack of * operations to evaluate iteratively using depth first search. Stack notation * allows functions to be called iteratively removing the overhead of recursive * function calls. Called recursively from the root node. For each function * node, allocates and initializes an array pointers within directly to the * return value and any child parameters. Should be called on the root node * before evaluation. * @param stack The vector of Node pointers onto which the nodes should be * pushed. * @return The pointer to the return value of the root node. */ Variable Node::compile(vector &stack) { if (type == NodeType::Constant) { return &value; } else if (type == NodeType::Variable) { return variable; } else if (type == NodeType::Function) { if (parameters) delete parameters; parameters = new Variable[arity + 1]; parameters[0] = &value; for (int i = 0; i < arity; i++) { parameters[i + 1] = children[i].compile(stack); } stack.push_back(this); return &value; } return nullptr; } /** * @brief Parser::addConstant Registers a symbolic constant to be accessible * within an expression. * @param name The name of the constant. * @param value The value of the constant of type Value (usually complex) */ void Parser::addConstant(string name, Value value) { constants[name] = value; } /** * @brief Parser::addVariable registers a variable to be accessible within * an expression. * @param name The name of the variable accessible within the expression. * @param address The address of the variable taken using &. */ void Parser::addVariable(string name, Variable address) { variables[name] = address; } /** * @brief Parser::addFunction registers a function to be used within an * expression. The function returns void and takes a single Parameters * argument, which is array of pointers with the address of return * value and the addresses of any parameters. The function will most likely * be a generalized wrapper for another function, which passes parameters to * the main function and assigns the return value as follows: * *p[0] = op(*p[1], *p[2]); * @param name Name of the function to be used within an expression * @param address Pointer of type Function to a compatible wrapper function. * @param arity Number of parameters the function takes. */ void Parser::addFunction(string name, Function address, int arity) { functions[name] = pair(arity, address); } /** * @brief Parser::nextToken lexes the next available token (number, identifier, * or operator). Whitespace between tokens is skipped. */ void Parser::nextToken() { if (token == Token::Error) return; token = Token::Whitespace; start = next; while (token == Token::Whitespace) { if (!*next) { token = Token::End; } else if (isdigit(*next) || *next == '.') { // Numbers token = Token::Number; number = strtold(next, (char **)&next); name = string(start, next - start); } else if (isalpha(*next)) { // Identifiers while (isalnum(*next) || *next == '_') next++; token = Token::Identifier; name = string(start, next - start); } else { // Single character tokens and whitespace name = string(next, 1); switch (*next) { case '+': token = Token::Plus; break; case '-': token = Token::Minus; break; case '*': token = Token::Times; break; case '/': token = Token::Divide; break; case '^': token = Token::Power; break; case '(': token = Token::OpenParen; break; case ')': token = Token::CloseParen; break; case ',': token = Token::Comma; break; case ' ': case '\t': case '\n': case '\r': // Ignore whitespace break; default: setError(Error::InvalidCharacter); break; } next++; } } } /** * @brief Parser::function parses a function call. Functions with zero or one * parameters can optionally take parentheses. Functions with two or more * parameters require them. Each parameter to the function can be a complete * expression. * // = {"(" ")"} | | * "(" {"," } ")" * @param ret The Node containing the function call, to which child parameters * are added. * @return The function node with the child parameters added. */ Node Parser::function(Node ret) { switch (ret.getArity()) { case 0: nextToken(); if (token == Token::OpenParen) { nextToken(); if (token != Token::CloseParen) { setError(Error::MissingParen); } else { nextToken(); } } break; case 1: nextToken(); ret.addChild(power()); break; default: nextToken(); if (token != Token::OpenParen) { setError(Error::MissingParen); } else { int i; for (i = 0; i < ret.getArity(); i++) { nextToken(); ret.addChild(expr()); if (token != Token::Comma) { break; } } if (token != Token::CloseParen) { if (token != Token::Comma && token != Token::End) { setError(Error::MissingComma); } else if (i > ret.getArity() - 1) { setError(Error::TooManyParameters); } else { setError(Error::MissingParen); } } else if (i < ret.getArity() - 1) { setError(Error::TooFewParameters); } else { nextToken(); } } } return ret; } /** * @brief Parser::base parses a base token, which can be a real or complex * number, identifier, function, or expression surrounded by parentheses. * = | | | "(" ")" * @return The node consisting of the base token. */ Node Parser::base() { Node ret; switch (token) { case Token::Number: ret = Node(number); nextToken(); break; case Token::Identifier: { Node identifier = Node(name); if (!identifier.isValid()) { setError(Error::UnknownIdentifier); } else if (identifier.isFunction()) { ret = function(identifier); } else { // Variable or constant ret = identifier; nextToken(); } break; } case Token::OpenParen: nextToken(); ret = expr(); if (token != Token::CloseParen) { setError(Error::MissingParen); } else { nextToken(); } break; case Token::CloseParen: setError(Error::UnexpectedParen); break; case Token::Comma: setError(Error::UnexpectedComma); break; case Token::Plus: case Token::Minus: case Token::Times: case Token::Divide: case Token::Power: setError(Error::MissingOperand); break; case Token::End: setError(Error::UnexpectedEnd); break; default: setError(Error::UnexpectedToken); break; } return ret; } /** * @brief Parser::power parses a unary negation operator, the operand * to an exponentiation. * = {("-" | "+")} * @return If there is an odd number of negation operators, returns a negation * operation with a child node. If no negation or an even number of negations, * returns the child node by itself. */ Node Parser::power() { int sign = 1; while (token == Token::Plus || token == Token::Minus) { if (token == Token::Minus) sign = -sign; nextToken(); } Node ret; if (sign == 1) { ret = base(); } else { ret = Node("negate"); ret.addChild(base()); } return ret; } /** * @brief Parser::factor Parses a factor (the operand to multiplcation or * division), consisting of a exponentiation. * @return The exponentiation operator with its two surrounding operands. */ Node Parser::factor() { Node ret = power(); while (token == Token::Power) { Node op = Node(name); op.addChild(ret); nextToken(); op.addChild(power()); ret = op; } return ret; } /** * @brief Parser::term Parses a term (the operand to addition or subtraction, * consisting of a multiplication or division. * = {("*" | "/") } * @return Node containing the multiplication or division operator with its * two surrounding factors. */ Node Parser::term() { Node ret = factor(); while (token == Token::Times || token == Token::Divide) { Node op = Node(name); op.addChild(ret); nextToken(); op.addChild(factor()); ret = op; } return ret; } /** * @brief Parser::expr Parses an expression (the outermost production), * consisting of two terms to be added or subtracted. * = {("+" | "-") } * @return Node containing the addition or subtraction operator with its two * surrounding terms. */ Node Parser::expr() { Node ret = term(); while (token == Token::Plus || token == Token::Minus) { Node op = Node(name); op.addChild(ret); nextToken(); op.addChild(term()); ret = op; } return ret; } /** * @brief Parser::parse Parses the provided expression and compiles it to * bytecode for evaluation. * @param exp Mathematical expression to parse * @return Error code for the first error encountered during parsing. * Error::None (0) is returned on success. */ Error Parser::parse(string exp) { error = Error::None; expression = exp; first = start = next = expression.c_str(); nextToken(); root = expr(); if (token == Token::End) { stack.clear(); result = root.compile(stack); } return error; } /** * @brief Parser::setError Sets the error code and location only if no other * error has previously been encountered. * @param err The error to set. */ void Parser::setError(Error err) { if (token != Token::Error) { token = Token::Error; error = err; errorloc.first = start - first; errorloc.second = next - first; } } /** * @brief Parser::getExpression returns the last expression passed to * Parser::parse. * @return String containing expression. */ string Parser::getExpression() { return expression; } /** * @brief Parser::errorMessage Returns human-readable error message * corresponding to current error status. * @return String describing error corresponding to enum value. */ string Parser::errorMessage() { static map errors = { {Error::None, "No error"}, {Error::InvalidCharacter, "Invalid character"}, {Error::UnknownIdentifier, "Unknown identifier"}, {Error::MissingParen, "Missing parenthesis"}, {Error::MissingComma, "Missing comma"}, {Error::MissingOperand, "Missing operand"}, {Error::TooFewParameters, "Too few parameters"}, {Error::TooManyParameters, "Too many parameters"}, {Error::UnexpectedComma, "Unexpected comma"}, {Error::UnexpectedParen, "Unexpected parenthesis"}, {Error::UnexpectedEnd, "Unexpected end of formula"}, {Error::UnexpectedToken, "Unexpected token"}}; return errors[error]; } /** * @brief Parser::errorLocation Returns the position where the first error * occurred during the last call to Parser::parse. * @return Pair of ints with the position of the first character of the token * that failed to parse and the first character after the token that failed to * parse. */ pair Parser::errorLocation() { return errorloc; } } // namespace FormEval using namespace FormEval; int main(int argc, char *argv[]) { if (argc < 2) { cout << "Usage: formeval expression" << endl; return -1; } Parser p; Error error = p.parse(argv[1]); if (error != Error::None) { pair loc = p.errorLocation(); int len = loc.second - loc.first - 1; if (len < 0) len = 0; cout << p.errorMessage() << ':' << endl; cout << p.getExpression() << endl; cout << string(loc.first, ' '); cout << '^' << string(len, '~') << endl; } else { cout << p.eval() << endl; } return 0; } /* int main() { Parser p; Value c; Value z; Value t; Parser::addVariable("c", &c); Parser::addVariable("z", &c); p.parse("z^2+c"); const int ixsize = 160; const int iysize = 50; const number_t cxmin = -1.5; const number_t cxmax = 2; const number_t cymin = -1; const number_t cymax = 1; const number_t maxit = 100; for (unsigned int iy = 0; iy < iysize; ++iy) { for (unsigned int ix = 0; ix < ixsize; ++ix) { c = {cxmin + ix/(ixsize-1.0)*(cxmax-cxmin), cymin + iy/(iysize-1.0)*(cymax-cymin)}; z = {0,0}; unsigned int iter; for (iter = 0; iter < maxit && abs(z) < 2.0L; ++iter) { z = p.eval(); //z = z*z+c; cout << z << endl; } cout << endl; //if (iter == maxit) // cout << ' '; //else // cout << '*'; } //cout << endl; } } */ XaoS-release-4.3.2/src/formeval/formeval.h000066400000000000000000000121561455214672000204110ustar00rootroot00000000000000/* * XaoS Formula Evaluator * Copyright (c) 2020 J.B. Langston * * Lexing and parsing logic based on TINYEXPR * Copyright (c) 2015-2018 Lewis Van Winkle * http://CodePlea.com * * Bytecode idea (but no code) comes from SFFE * https://github.com/malczak/sffe * * 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 acknowledgement 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 __FORMEVAL_H__ #define __FORMEVAL_H__ #include #include #include namespace FormEval { using namespace std; /** * @brief number_t The base type for real numbers. */ typedef long double number_t; /** * @brief Value a complex number value, used for constants, variables, and all * function parameters and return values. */ typedef complex Value; /** * @brief Variable Pointer to a value, used for variables within the expression, * as well as function return values and parameters. */ typedef Value *Variable; /** * @brief Parameters Array of pointers used to store function return and * parameter locations. */ typedef Value **Parameters; /** * @brief Function pointer to wrapper functions accessible from within the * expression. Must return void and take a single Parameters argument. Does * not return a value; instead assigns the return value to the zeroth element of * the Parameters array. Arguments start at element 1. */ typedef void (*Function)(Parameters); /** * @brief The NodeType enum identifies the different types of AST node. */ enum class NodeType { Invalid, Constant, Variable, Function }; /** * @brief The Node class represents a node in the abstract syntax tree built by * the parser. Transforms into a stack of function calls to be executed during * expression evaluation. */ class Node { private: string name; NodeType type = NodeType::Invalid; Value value = 0; Variable variable = nullptr; Function function = nullptr; int arity = 0; vector children; Parameters parameters = nullptr; public: Node(Value value); Node(string identifier); Node(); ~Node(); void addChild(Node child); bool isValid() { return type != NodeType::Invalid; } bool isFunction() { return type == NodeType::Function; } int getArity() { return arity; } string getName() { return name; } Value getValue() { return value; } Variable compile(vector &stack); inline void eval() { function(parameters); asm(""); } }; /** * @brief The Error enum identifies different error states encountered by the * lexer or parser. */ enum class Error { None, InvalidCharacter, UnknownIdentifier, MissingParen, MissingComma, TooFewParameters, TooManyParameters, UnexpectedComma, UnexpectedParen, MissingOperand, UnexpectedEnd, UnexpectedToken }; /** * @brief The Token enum identifies the different token types that have been * lexed for the parser to consume. */ enum class Token { Whitespace, Error, End, Comma, OpenParen, CloseParen, Number, Identifier, Plus, Minus, Times, Divide, Power }; /** * @brief The Parser class contains state during a parsing operation and holds * the AST built from the expression, as well as the stack of function calls * that the AST is transformed into. Not re-entrant; the Parser and any * variables registered to it must be thread_local. */ class Parser { private: Token token = Token::Whitespace; Error error = Error::None; number_t number = 0; string name; string expression; const char *first = nullptr; const char *start = nullptr; const char *next = nullptr; pair errorloc; Node root; vector stack; Variable result = nullptr; void setError(Error err); void nextToken(); Node function(Node function); Node expr(); Node power(); Node base(); Node factor(); Node term(); public: static void addConstant(string name, Value value); static void addVariable(string name, Variable address); static void addFunction(string name, Function address, int arity); string getExpression(); string errorMessage(); pair errorLocation(); Error parse(string expression); inline Value eval() { for (Node *node : stack) node->eval(); return *result; } }; } // namespace FormEval #endif /*__FORMEVAL_H__*/ XaoS-release-4.3.2/src/formeval/formeval.pro000066400000000000000000000002051455214672000207520ustar00rootroot00000000000000TEMPLATE = app CONFIG += console c++11 CONFIG -= app_bundle CONFIG -= qt SOURCES += \ formeval.cpp HEADERS += \ formeval.h XaoS-release-4.3.2/src/include/000077500000000000000000000000001455214672000162305ustar00rootroot00000000000000XaoS-release-4.3.2/src/include/btrace.h000066400000000000000000000003071455214672000176410ustar00rootroot00000000000000#ifndef BTRACE_H #define BTRACE_H int boundarytrace(int x1, int y1, int x2, int y2, number_t *xpos, number_t *ypos); int boundarytraceall(number_t *xpos, number_t *ypos); #endif XaoS-release-4.3.2/src/include/c256.h000066400000000000000000000003361455214672000170620ustar00rootroot00000000000000#ifdef cpixel_t #undef cpixel_t #undef cpixeldata_t #undef cppixel_t #undef bpp #endif #define cpixel_t pixel8_t #define cppixel_t ppixel8_t #define cpixeldata_t pixel8_t #define bpp 1 #include "generic.h" #define bpp1 XaoS-release-4.3.2/src/include/catalog.h000066400000000000000000000011311455214672000200070ustar00rootroot00000000000000/* Small library to handle catalog files */ #ifndef CATALOG_H #define CATALOG_H #define CHASHMAX 31 /*Just small hash table. Should be OK */ #include "xio.h" struct varnames { struct varnames *left, *right; char *name; char *value; }; typedef struct catalog { struct varnames *root[CHASHMAX]; } catalog_t; /*Find text in catalog */ extern char *find_text(catalog_t *catalog, const char *name); /*Load catalog from file */ extern catalog_t *load_catalog(xio_file f, const char **error); /*Free memory used by catalog */ extern void free_catalog(catalog_t *); #endif /*VARIABLE_H */ XaoS-release-4.3.2/src/include/cmplx.h000066400000000000000000000055721455214672000175350ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Simplified version. See XaoS2.2 for full version of this library. * It caused problems (overflows) at certain preprocesors */ #ifndef COMPLEX_H #define COMPLEX_H #include "config.h" #define c_add(ar, ai, br, bi, _or, oi) ((_or) = (ar) + (br), (oi) = (ai) + (bi)) #define c_mul(ar, ai, br, bi, _or, oi) \ ((_or) = (ar) * (br) - (ai) * (bi), (oi) = ((ar) * (bi)) + ((ai) * (br))) #define c_sub(ar, ai, br, bi, _or, oi) ((_or) = (ar) - (br), (oi) = (ai) - (bi)) #define c_div_rp(ar, ai, br, bi) \ (((ar) * (br) + (ai) * (bi)) / ((bi) * (bi) + (br) * (br))) #define c_div_ip(ar, ai, br, bi) \ ((-(ar) * (bi) + (ai) * (br)) / ((br) * (br) + (bi) * (bi))) #define c_div(ar, ai, br, bi, _or, oi) \ ((_or) = c_div_rp(ar, ai, br, bi), (oi) = c_div_ip(ar, ai, br, bi)) #define c_pow2_rp(ar, ai) ((ar) * (ar) - (ai) * (ai)) #define c_pow2_ip(ar, ai) (2 * (ar) * (ai)) #define c_pow2(ar, ai, _or, oi) \ ((_or) = c_pow2_rp(ar, ai), (oi) = c_pow2_ip(ar, ai)) #define c_pow3_rp(ar, ai) ((ar) * (ar) * (ar)-3 * (ar) * (ai) * (ai)) #define c_pow3_ip(ar, ai) (3 * (ar) * (ar) * (ai) - (ai) * (ai) * (ai)) #define c_pow3(ar, ai, _or, oi) \ ((_or) = c_pow3_rp(ar, ai), (oi) = c_pow3_ip(ar, ai)) #define c_pow4_rp(ar, ai) \ ((ar) * (ar) * (ar) * (ar)-6 * (ar) * (ar) * (ai) * (ai) + \ (ai) * (ai) * (ai) * (ai)) #define c_pow4_ip(ar, ai) \ (4 * (ar) * (ar) * (ar) * (ai)-4 * (ar) * (ai) * (ai) * (ai)) #define c_pow4(ar, ai, _or, oi) \ ((_or) = c_pow4_rp(ar, ai), (oi) = c_pow4_ip(ar, ai)) #define myabs(x) ((x) > 0 ? (x) : -(x)) #endif /* COMPLEX_H */ XaoS-release-4.3.2/src/include/config.h000066400000000000000000000040301455214672000176430ustar00rootroot00000000000000#ifndef CONFIG_H #define CONFIG_H // XaoS release #define XaoS_VERSION "4.3.2" // URLs #define HELP_URL "https://github.com/xaos-project/XaoS/wiki" #define WEB_URL "http://xaos.sourceforge.net/" #define DOWNLOAD_URL "https://github.com/xaos-project/XaoS/releases" #define FEEDBACK_URL "https://github.com/xaos-project/XaoS/issues" #define FORUM_URL "https://groups.google.com/d/forum/xaos-users" #define FRACTALINFO_URL "https://github.com/xaos-project/XaoS/wiki/Fractal-Types#" // File locations #ifndef DATAPATH #define DATAPATH "/usr/share/XaoS" #endif #define TUTORIALPATH DATAPATH "/tutorial/" #define EXAMPLESPATH DATAPATH "/examples/" #define CATALOGSPATH DATAPATH "/catalogs/" #define HELPPATH DATAPATH "/help/xaos.hlp" // Config file name #ifdef _WIN32 #define CONFIGFILE "XaoS.cfg" #else #define CONFIGFILE ".XaoSrc" #endif // Optional features #define USE_PTHREAD // Numeric type #ifdef USE_FLOAT128 typedef __float128 number_t; #else #ifdef USE_LONG_DOUBLE typedef long double number_t; #else typedef double number_t; #endif #endif // Supported color depths #define STRUECOLOR #define STRUECOLOR16 // required for edge detection and pseudo 3d // Fractal defaults #define DEFAULT_MAX_ITER 1000 #define DEFAULT_BAILOUT 4 #define MAXSTEP (0.008 * 3) #define STEP (0.0006 * 3) #define ROTATIONSPEED 30 #define FRAMERATE 20 #define SPEEDUP 1.05 // Autopilot configuration #define LOOKSIZE 2 // size explored by autopilot #define RANGE1 30 #define NGUESSES (RANGE1 * RANGE1 / 2) #define MAXTIME 10 // maximum zooming time to one direction #define NGUESSES1 10 // maximum number of guesses using first method #define NGUESSES2 1000 // maximum number of guesses using second method // Default user formula // #define USER_FORMULA "z^log(c)*p" // #define USER_FORMULA "c^z+im(p)*{0;1}" #define USER_FORMULA "(abs(re(z))+i*abs(im(z)))^2+c" // Disable optional statistics collection and reporting //#define STATISTICS #undef STAT #ifdef STATISTICS #define STAT(x) x #else #define STAT(x) #endif #define NUMBER_BIG ((number_t)INT_MAX) #endif // CONFIG_H XaoS-release-4.3.2/src/include/filter.h000066400000000000000000000332361455214672000176750ustar00rootroot00000000000000#ifndef IMAGE_H #define IMAGE_H #include "config.h" typedef unsigned char pixel_t; typedef unsigned char rgb_t[4]; /*4 is better than 3 - makes multiplying easier */ struct truec { int rshift, gshift, bshift; /*the shift ammounts */ int rprec, gprec, bprec; /*precisity - 0=8bit, 1=7bit, -1=9bit etc... */ unsigned int rmask, gmask, bmask; /*masks */ unsigned int mask1, mask2, allmask; /*Mask1 and mask2 are distinc color masks allmask are mask for all colors */ int byteexact; /*When every colors is at one byte */ int missingbyte; /*for 32bit truecolor and exact byte places one byte is unused... */ int alpha; }; union paletteinfo { struct truec truec; }; struct palette { int start; int end; int maxentries; int version; int type; unsigned int *pixels; int npreallocated; rgb_t *rgb; int flags; int (*alloccolor)(struct palette *pal, int init, int r, int g, int b); void (*setpalette)(struct palette *pal, int start, int end, rgb_t *rgb); void (*allocfinished)(struct palette *pal); void (*cyclecolors)(struct palette *pal, int direction); int size; /*number of allocated color entries */ void *data; /*userdata */ /*Preallocated palette cells */ int ncells; unsigned int *index; const rgb_t *prergb; union paletteinfo info; }; struct image { float pixelwidth, pixelheight; pixel_t **oldlines; pixel_t **currlines; void (*flip)(struct image *img); int width, height, nimages; int bytesperpixel; int currimage; int flags; int scanline; int version; struct palette *palette; void *data; /*userdata */ void (*free)(struct image *img); }; #define interpol1(i1, i2, n, mask) \ ((((i1) & (mask)) * (n) + ((i2) & (mask)) * (256 - (n))) & ((mask) << 8)) #define interpol(i1, i2, n, mr, mg, mb) \ ((interpol1(i1, i2, n, mr) + interpol1(i1, i2, n, mg) + \ interpol1(i1, i2, n, mb)) >> \ 8) #define intergray(i1, i2, n) (((i1)*n + (i2) * (256 - (n))) >> 8) /* * J.B. Langston 3/13/2008 * * The Mac OS X driver requires a 32-bit rgb mask where the most significant * byte is on (e.g., 0xffffff00). This exposed a bug in the interpol macro * that resulted in distorted colors for the smooth coloring modes. * If the interpol macro is applied to such a mask, it causes an overflow * of the 32-bit int, and the left-most color byte is lost. * * I added shiftinterpol macro to handle such masks. It shifts everything 1 * byte to the right, performs the calculation, and then shifts everything * back 1 byte to the left when it is done. * * I also created the safeinterpol macro which detects if the most * significant byte in the mask is on, and uses the shiftinterpol macro if * so, or the original interpol macro if not. * * I then modified the interpoltype macro to use the safeinterpol macro * instead of the interpol macro directly. * * J.B. Langston 1/7/2020 * * And another bug on Mac. Now macOS won't display the image properly unless * the alpha channel is set to 0xFF, so we force it to 0xFF here using * ~(palette).info.truec.allmask, which gives the bit not used by RGB. */ #define shiftinterpol(i1, i2, n, mr, mg, mb) \ (interpol((i1) >> 8, (i2) >> 8, n, (mr) >> 8, (mg) >> 8, (mb) >> 8) << 8) #define safeinterpol(i1, i2, n, mr, mg, mb) \ ((((mr) | (mg) | (mb)) & 0xff000000) \ ? shiftinterpol(i1, i2, n, mr, mg, mb) \ : interpol(i1, i2, n, mr, mg, mb)) #define interpoltype(palette, i1, i2, n) \ ((palette).type == GRAYSCALE || (palette).type == LARGEITER \ ? intergray(i1, i2, n) \ : safeinterpol(i1, i2, n, (palette).info.truec.rmask, \ (palette).info.truec.gmask, \ (palette).info.truec.bmask) | \ ~(palette).info.truec.allmask) /*palette flags */ #define UNKNOWNENTRIES 1 #define DONOTCHANGE 2 #define FINISHLATER 4 #define UNFINISHED 8 /*image flags */ #define FREELINES 1 #define FREEDATA 2 #define AAIMAGE 4 #define PROTECTBUFFERS 8 /*palette types supported by most of engine*/ #define C256 1 #define GRAYSCALE 2 #define TRUECOLOR16 4 #define TRUECOLOR24 8 #define TRUECOLOR 16 /*special mage types used internally by XaoS */ #define LARGEITER 32 #define SMALLITER 64 /*palette types handled by the dithering filter*/ #define LBITMAP 256 #define MBITMAP 512 #define LIBITMAP 1024 #define MIBITMAP 2048 #define FIXEDCOLOR 4096 #define ALLMASK (C256 | TRUECOLOR16 | TRUECOLOR24 | LARGEITER | GRAYSCALE) #define BITMAPS (LBITMAP | MBITMAP | LIBITMAP | MIBITMAP) #define MASK1BPP (SMALLITER | C256 | GRAYSCALE) #define MASK2BPP (TRUECOLOR16 | LARGEITER) #define MASK3BPP (TRUECOLOR24) #define MASK4BPP (TRUECOLOR) /*flags for requirements */ #define IMAGEDATA 1 #define TOUCHIMAGE 2 #define NEWIMAGE 4 /*flags for initdata */ #define DATALOST 1 /*flags for doit */ #define INTERRUPTIBLE 1 #define PALETTEONLY 2 /*return flags */ #define INEXACT 1 #define CHANGED 2 #define ANIMATION 4 #define INCOMPLETE (1 << 29) /*flags for filters */ #define ALLOCEDIMAGE 1 /*used by inherimage mechanizm */ #define SHAREDDATA 2 #define PALGORITHMS 3 #include "pixel_t.h" #define imgetpixel(image, x, y) \ ((image)->bytesperpixel == 1 \ ? (image)->currlines[y][x] \ : ((image)->bytesperpixel == 4 \ ? ((pixel32_t *)(image)->currlines[y])[x] \ : (image)->bytesperpixel == 3 \ ? (((pixel16_t *)(image)->currlines[y])[x] + \ ((image)->currlines[y][3 * (x) + 2] << 16)) \ : (((pixel16_t *)(image)->currlines[y])[x]))) struct requirements { int nimages; int supportedmask; int flags; }; struct filter { struct filter *next, *previous; struct queue *queue; const struct filteraction *action; struct image *image, *childimage; struct requirements req; struct fractal_context *fractalc; void *data; const char *name; int flags; int imageversion; /*For detection whether image changed or not */ void (*wait_function)(struct filter *f); /*stuff for wait_function */ int pos, max, incalculation, readyforinterrupt, interrupt; const char *pass; }; struct initdata { void (*wait_function)(struct filter *f); struct image *image; struct fractal_context *fractalc; int flags; }; struct filteraction { const char *name; const char *shortname; int flags; struct filter *(*getinstance)(const struct filteraction *a); void (*destroyinstance)(struct filter *f); int (*doit)(struct filter *f, int flags, int time); int (*requirement)(struct filter *f, struct requirements *r); int (*initialize)(struct filter *f, struct initdata *i); void (*convertup)(struct filter *f, int *x, int *y); void (*convertdown)(struct filter *f, int *x, int *y); void (*removefilter)(struct filter *f); }; struct queue { struct filter *first, *last; int isinitialized; struct filter *palettechg; struct image *saveimage; }; #define datalost(f, i) \ (((i)->flags & DATALOST) || \ ((f)->imageversion && (f)->imageversion != (i)->image->version)) /*filter actions */ extern const struct filteraction interlace_filter, stereogram_filter, subwindow_filter, smalliter_filter, julia_filter, blur_filter, edge_filter, edge2_filter, rotate_filter, starfield_filter, truecolor_filter, fixedcolor_filter, bitmap_filter, emboss_filter, palette_filter, antialias_filter, threed_filter; extern unsigned int col_diff[3][512]; struct filter *createfilter(const struct filteraction *fa); struct queue *create_queue(struct filter *f); void insertfilter(struct filter *f1, struct filter *f2); void removefilter(struct filter *f); void addfilter(struct filter *f1, struct filter *f2); int initqueue(struct queue *q); /*Filter utility functions */ int reqimage(struct filter *f, struct requirements *req, int supportedmask, int flags); int inherimage(struct filter *f, struct initdata *data, int flags, int width, int height, struct palette *palette, float pixelwidth, float pixelheight); void destroyinheredimage(struct filter *f); void updateinheredimage(struct filter *f); void inhermisc(struct filter *f, const struct initdata *i); /*image actions */ void flipgeneric(struct image *img); struct image *create_image_qt(int width, int height, struct palette *palette, float pixelwidth, float pixelheight); struct image *create_image_lines(int width, int height, int nimages, pixel_t **lines1, pixel_t **lines2, struct palette *palette, void (*flip)(struct image *img), int flags, float pixelwidth, float pixelheight); struct image *create_image_cont(int width, int height, int scanlinesize, int nimages, pixel_t *buf1, pixel_t *buf2, struct palette *palette, void (*flip)(struct image *img), int flags, float pixelwidth, float pixelheight); struct image *create_image_mem(int width, int height, int nimages, struct palette *palette, float pixelwidth, float pixelheight); struct image *create_subimage(struct image *simg, int width, int height, int nimages, struct palette *palette, float pixelwidth, float pixelheight); void destroy_image(struct image *img); void clear_image(struct image *img); /*palette */ int bytesperpixel(int type); void bestfit_init(void); struct palette *createpalette( int start, int end, int type, int flags, int maxentries, int (*alloccolor)(struct palette *pal, int init, int r, int g, int b), void (*setcolor)(struct palette *pal, int start, int end, rgb_t *rgb), void (*allocfinished)(struct palette *pal), void (*cyclecolors)(struct palette *pal, int direction), union paletteinfo *info); void destroypalette(struct palette *palette); int mkdefaultpalette(struct palette *palette); int mkstereogrampalette(struct palette *palette); int mkstarfieldpalette(struct palette *palette); int mkblurpalette(struct palette *palette); int mkgraypalette(struct palette *palette); int mkrgb(struct palette *palette); int mkpalette(struct palette *palette, int seed, int algorithm); int shiftpalette(struct palette *palette, int n); void preallocpalette(struct palette *pal); struct palette *clonepalette(struct palette *palette); void restorepalette(struct palette *dest, struct palette *src); void convertupgeneric(struct filter *f, int *x, int *y); void convertdowngeneric(struct filter *f, int *x, int *y); int fixedalloccolor(struct palette *palette, int init, int r, int g, int b); void getPaletteColor(struct palette *palette, int seed, int algorithm, int shift, int newColors[101][3]); void getDEFSEGMENTColor(unsigned char newColors[][3]); int mkcustompalette(struct palette *c, unsigned char newColors[27][3]); void rgbtohex (int r, int g, int b, char color[6]); void hextorgb (char *hexcolor, rgb_t color); #define setfractalpalette(f, p) \ if ((f)->fractalc->palette == (f)->image->palette) \ (f)->fractalc->palette = (p) #ifdef STRUECOLOR24 #define TRUECOLOR24CASE(x) \ case 3: \ x; \ break; #else #define TRUECOLOR24CASE(x) #endif #ifdef STRUECOLOR16 #define SUPPORT16 #endif #ifdef SUPPORT16 #define TRUECOLOR16CASE(x) \ case 2: \ x; \ break; #else #define TRUECOLOR16CASE(x) #endif #define drivercall(i, x1, x2, x3, x4) \ switch ((i).bytesperpixel) { \ TRUECOLOR24CASE(x3); \ TRUECOLOR16CASE(x2); \ case 1: \ x1; \ break; \ case 4: \ x4; \ } #ifdef SMBITMAPS #define SBITMAPS #else #ifdef SLBITMAPS #define SBITMAPS #endif #endif #ifdef SBITMAPS #define SCONVERTORS #else #ifdef SFIXEDCOLOR #define SCONVERTORS #endif #endif #include "formulas.h" #endif XaoS-release-4.3.2/src/include/formulas.h000066400000000000000000000024111455214672000202270ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef FORMULAS_H #define FORMULAS_H #include "config.h" #include "fractal.h" #define MAX_LAMBDA 2 #define FORMULAMAGIC 1121 extern const char *const incolorname[]; extern const struct formula formulas[]; extern const char *const outcolorname[]; extern const char *const tcolorname[]; extern const int nformulas; extern const int nmformulas; #endif /* FORMULAS_H */ XaoS-release-4.3.2/src/include/fractal.h000066400000000000000000000123071455214672000200200ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef FRACTAL1_H #define FRACTAL1_H #include "config.h" #ifdef USE_SFFE #include "sffe.h" #endif #define INCOLORING 11 #define OUTCOLORING 11 #define TCOLOR 15 typedef struct { number_t y0, k; } symmetrytype; struct symmetryinfo { number_t xsym, ysym; int nsymmetries; const symmetrytype *symmetry; }; typedef struct { number_t mc, nc; number_t mi, ni; } vrect; typedef struct { number_t cr, ci; number_t rr, ri; } vinfo; typedef unsigned int (*iterationfunc)(number_t, number_t, number_t, number_t); struct formula { int magic; iterationfunc calculate, calculate_periodicity, smooth_calculate, smooth_calculate_periodicity; void (*calculate_julia)(struct image *img, number_t pre, number_t pim); const char *name[2]; const char *shortname; vinfo v; int hasperiodicity; int mandelbrot; number_t pre, pim; struct symmetryinfo out[OUTCOLORING + 1]; struct symmetryinfo in[INCOLORING + 1]; int flags; }; struct fractal_context { number_t pre, pim; number_t bre, bim; const struct formula *currentformula; #ifdef USE_SFFE sffe *userformula; sffe *userinitial; #endif number_t angle; int periodicity; unsigned int maxiter; number_t bailout; int coloringmode, incoloringmode; int intcolor, outtcolor; int mandelbrot; int plane; int version; int range; float windowwidth, windowheight; vinfo s; vrect rs; number_t sin, cos; int slowmode; /* 1 in case we want to be exact, not fast */ /*values temporary filled by set_fractal_context */ iterationfunc calculate[2]; number_t periodicity_limit; struct palette *palette; /*fractal's palette */ }; typedef struct fractal_context fractal_context; typedef struct { double y0, k, kk, y0k; } symmetry2; struct symmetryinfo2 { number_t xsym, ysym; int nsymmetries; symmetry2 *symmetry; number_t xmul, ymul, xdist, ydist; }; #define STARTZERO 1 #define JULIA_BTRACE 2 #define MANDEL_BTRACE 4 #ifdef USE_SFFE #define SFFE_FRACTAL 8 #endif #define BTRACEOK \ ((cformula.flags & (2 << cfractalc.mandelbrot)) && \ !cfractalc.incoloringmode && cfractalc.coloringmode != 7) #define my_rotate(f, x, y) \ { \ number_t tmp; \ tmp = (x) * (f).cos - (y) * (f).sin; \ y = (x) * (f).sin + (y) * (f).cos; \ x = tmp; \ } #define rotateback(f, x, y) \ { \ number_t tmp; \ tmp = (x) * (f).cos + (y) * (f).sin; \ y = -(x) * (f).sin + (y) * (f).cos; \ x = tmp; \ } #ifdef USE_SFFE void sffe_setlocal(fractal_context *c); #endif extern struct symmetryinfo2 cursymmetry; extern struct fractal_context cfractalc; extern struct formula cformula; extern struct palette cpalette; extern struct image cimage; #ifdef STATISTICS /*This is an statistics variables printed from various parts *of XaoS. */ extern int nadded2, nsymmetry2, nskipped2; extern int tocalculate2, avoided2, frames2; extern int ncalculated2, ninside2; extern int niter2, niter1; extern int nperi; extern int iters2, guessed2, unguessed2, total2; #endif void set_formula(fractal_context *, int); void set_fractalc(fractal_context *, struct image *img); void fractalc_resize_to(fractal_context *, float, float); void update_view(fractal_context *); void free_fractalc(fractal_context *); fractal_context *make_fractalc(const int, float, float); void speed_test(fractal_context *, struct image *img); unsigned int calculateswitch(number_t x1, number_t y1, number_t x2, number_t y2, int periodicity); /* needs struct formula */ #include "formulas.h" #endif /* FRACTAL_H */ XaoS-release-4.3.2/src/include/generic.h000066400000000000000000000006451455214672000200220ustar00rootroot00000000000000#undef p_set #undef p_get #undef p_setp #undef bpp1 #undef p_getp #undef p_add #undef p_inc #undef p_copy #define p_set(ptr, val) (*(ptr) = (val)) #define p_get(ptr) (*(ptr)) #define p_setp(ptr, pos, val) ((ptr)[(pos)] = (val)) #define p_getp(ptr, pos) ((ptr)[(pos)]) #define p_add(ptr, val) ((ptr) + (val)) #define p_inc(ptr, val) ((ptr) += (val)) #define p_copy(ptr1, val1, ptr2, val2) ((ptr1)[val1] = (ptr2)[val2]) XaoS-release-4.3.2/src/include/grlib.h000066400000000000000000000017121455214672000175010ustar00rootroot00000000000000#ifndef _TEXT_H #define _TEXT_H #define TEXT_PRESSED 1 #include "ui_helper.h" int xprint(struct image *image, void *font, int x, int y, const char *text, int fgcolor, int bgcolor, int mode); int xtextwidth(struct image *image, void *font, const char *text); int xtextheight(struct image *image, void *font); int xtextcharw(struct image *image, void *font, const char c); void xrectangle(struct image *image, int x, int y, int width, int height, int fgcolor); void xvline(struct image *image, int x, int y, int height, int fgcolor); void xhline(struct image *image, int x, int y, int width, int fgcolor); char *xsaveline(struct image *img, int x1, int y1, int x2, int y2); void xrestoreline(struct image *img, char *data, int x1, int y1, int x2, int y2); void xline(struct image *img, int x1, int y1, int x2, int y2, int color); void xprepareimage(struct image *img); void overlayGrid(uih_context *c, int fgcolor); #endif XaoS-release-4.3.2/src/include/gsl/000077500000000000000000000000001455214672000170155ustar00rootroot00000000000000XaoS-release-4.3.2/src/include/gsl/gsl_complex.h000066400000000000000000000101221455214672000214760ustar00rootroot00000000000000/* complex/gsl_complex.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #ifndef __GSL_COMPLEX_H__ #define __GSL_COMPLEX_H__ #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus #define __BEGIN_DECLS extern "C" { #define __END_DECLS } #else #define __BEGIN_DECLS /* empty */ #define __END_DECLS /* empty */ #endif __BEGIN_DECLS /* two consecutive built-in types as a complex number */ typedef double *gsl_complex_packed; typedef float *gsl_complex_packed_float; typedef long double *gsl_complex_packed_long_double; typedef const double *gsl_const_complex_packed; typedef const float *gsl_const_complex_packed_float; typedef const long double *gsl_const_complex_packed_long_double; /* 2N consecutive built-in types as N complex numbers */ typedef double *gsl_complex_packed_array; typedef float *gsl_complex_packed_array_float; typedef long double *gsl_complex_packed_array_long_double; typedef const double *gsl_const_complex_packed_array; typedef const float *gsl_const_complex_packed_array_float; typedef const long double *gsl_const_complex_packed_array_long_double; /* Yes... this seems weird. Trust us. The point is just that sometimes you want to make it obvious that something is an output value. The fact that it lacks a 'const' may not be enough of a clue for people in some contexts. */ typedef double *gsl_complex_packed_ptr; typedef float *gsl_complex_packed_float_ptr; typedef long double *gsl_complex_packed_long_double_ptr; typedef const double *gsl_const_complex_packed_ptr; typedef const float *gsl_const_complex_packed_float_ptr; typedef const long double *gsl_const_complex_packed_long_double_ptr; typedef struct { long double dat[2]; } gsl_complex_long_double; typedef struct { double dat[2]; } gsl_complex; typedef struct { float dat[2]; } gsl_complex_float; #define GSL_REAL(z) ((z).dat[0]) #define GSL_IMAG(z) ((z).dat[1]) #define GSL_COMPLEX_P(zp) ((zp)->dat) #define GSL_COMPLEX_P_REAL(zp) ((zp)->dat[0]) #define GSL_COMPLEX_P_IMAG(zp) ((zp)->dat[1]) #define GSL_COMPLEX_EQ(z1, z2) \ (((z1).dat[0] == (z2).dat[0]) && ((z1).dat[1] == (z2).dat[1])) #define GSL_SET_COMPLEX(zp, x, y) \ do { \ (zp)->dat[0] = (x); \ (zp)->dat[1] = (y); \ } while (0) #define GSL_SET_REAL(zp, x) \ do { \ (zp)->dat[0] = (x); \ } while (0) #define GSL_SET_IMAG(zp, y) \ do { \ (zp)->dat[1] = (y); \ } while (0) #define GSL_SET_COMPLEX_PACKED(zp, n, x, y) \ do { \ *((zp) + 2 * (n)) = (x); \ *((zp) + (2 * (n) + 1)) = (y); \ } while (0) __END_DECLS #endif /* __GSL_COMPLEX_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_complex_math.h000066400000000000000000000136401455214672000225170ustar00rootroot00000000000000/* complex/gsl_complex_math.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 Jorma Olavi Thtinen, Brian Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __GSL_COMPLEX_MATH_H__ #define __GSL_COMPLEX_MATH_H__ #include #include #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus #define __BEGIN_DECLS extern "C" { #define __END_DECLS } #else #define __BEGIN_DECLS /* empty */ #define __END_DECLS /* empty */ #endif __BEGIN_DECLS /* Complex numbers */ gsl_complex gsl_complex_polar (double r, double theta); /* r= r e^(i theta) */ INLINE_DECL gsl_complex gsl_complex_rect (double x, double y); /* r= real+i*imag */ #ifdef HAVE_INLINE INLINE_FUN gsl_complex gsl_complex_rect (double x, double y) { /* return z = x + i y */ gsl_complex z; GSL_SET_COMPLEX (&z, x, y); return z; } #endif #define GSL_COMPLEX_ONE (gsl_complex_rect(1.0,0.0)) #define GSL_COMPLEX_ZERO (gsl_complex_rect(0.0,0.0)) #define GSL_COMPLEX_NEGONE (gsl_complex_rect(-1.0,0.0)) /* Properties of complex numbers */ double gsl_complex_arg (gsl_complex z); /* return arg(z), -pi< arg(z) <=+pi */ double gsl_complex_abs (gsl_complex z); /* return |z| */ double gsl_complex_abs2 (gsl_complex z); /* return |z|^2 */ double gsl_complex_logabs (gsl_complex z); /* return log|z| */ /* Complex arithmetic operators */ gsl_complex gsl_complex_add (gsl_complex a, gsl_complex b); /* r=a+b */ gsl_complex gsl_complex_sub (gsl_complex a, gsl_complex b); /* r=a-b */ gsl_complex gsl_complex_mul (gsl_complex a, gsl_complex b); /* r=a*b */ gsl_complex gsl_complex_div (gsl_complex a, gsl_complex b); /* r=a/b */ gsl_complex gsl_complex_add_real (gsl_complex a, double x); /* r=a+x */ gsl_complex gsl_complex_sub_real (gsl_complex a, double x); /* r=a-x */ gsl_complex gsl_complex_mul_real (gsl_complex a, double x); /* r=a*x */ gsl_complex gsl_complex_div_real (gsl_complex a, double x); /* r=a/x */ gsl_complex gsl_complex_add_imag (gsl_complex a, double y); /* r=a+iy */ gsl_complex gsl_complex_sub_imag (gsl_complex a, double y); /* r=a-iy */ gsl_complex gsl_complex_mul_imag (gsl_complex a, double y); /* r=a*iy */ gsl_complex gsl_complex_div_imag (gsl_complex a, double y); /* r=a/iy */ gsl_complex gsl_complex_conjugate (gsl_complex z); /* r=conj(z) */ gsl_complex gsl_complex_inverse (gsl_complex a); /* r=1/a */ gsl_complex gsl_complex_negative (gsl_complex a); /* r=-a */ /* Elementary Complex Functions */ gsl_complex gsl_complex_sqrt (gsl_complex z); /* r=sqrt(z) */ gsl_complex gsl_complex_sqrt_real (double x); /* r=sqrt(x) (x<0 ok) */ gsl_complex gsl_complex_pow (gsl_complex a, gsl_complex b); /* r=a^b */ gsl_complex gsl_complex_pow_real (gsl_complex a, double b); /* r=a^b */ gsl_complex gsl_complex_exp (gsl_complex a); /* r=exp(a) */ gsl_complex gsl_complex_log (gsl_complex a); /* r=log(a) (base e) */ gsl_complex gsl_complex_log10 (gsl_complex a); /* r=log10(a) (base 10) */ gsl_complex gsl_complex_log_b (gsl_complex a, gsl_complex b); /* r=log_b(a) (base=b) */ /* Complex Trigonometric Functions */ gsl_complex gsl_complex_sin (gsl_complex a); /* r=sin(a) */ gsl_complex gsl_complex_cos (gsl_complex a); /* r=cos(a) */ gsl_complex gsl_complex_sec (gsl_complex a); /* r=sec(a) */ gsl_complex gsl_complex_csc (gsl_complex a); /* r=csc(a) */ gsl_complex gsl_complex_tan (gsl_complex a); /* r=tan(a) */ gsl_complex gsl_complex_cot (gsl_complex a); /* r=cot(a) */ /* Inverse Complex Trigonometric Functions */ gsl_complex gsl_complex_arcsin (gsl_complex a); /* r=arcsin(a) */ gsl_complex gsl_complex_arcsin_real (double a); /* r=arcsin(a) */ gsl_complex gsl_complex_arccos (gsl_complex a); /* r=arccos(a) */ gsl_complex gsl_complex_arccos_real (double a); /* r=arccos(a) */ gsl_complex gsl_complex_arcsec (gsl_complex a); /* r=arcsec(a) */ gsl_complex gsl_complex_arcsec_real (double a); /* r=arcsec(a) */ gsl_complex gsl_complex_arccsc (gsl_complex a); /* r=arccsc(a) */ gsl_complex gsl_complex_arccsc_real (double a); /* r=arccsc(a) */ gsl_complex gsl_complex_arctan (gsl_complex a); /* r=arctan(a) */ gsl_complex gsl_complex_arccot (gsl_complex a); /* r=arccot(a) */ /* Complex Hyperbolic Functions */ gsl_complex gsl_complex_sinh (gsl_complex a); /* r=sinh(a) */ gsl_complex gsl_complex_cosh (gsl_complex a); /* r=coshh(a) */ gsl_complex gsl_complex_sech (gsl_complex a); /* r=sech(a) */ gsl_complex gsl_complex_csch (gsl_complex a); /* r=csch(a) */ gsl_complex gsl_complex_tanh (gsl_complex a); /* r=tanh(a) */ gsl_complex gsl_complex_coth (gsl_complex a); /* r=coth(a) */ /* Inverse Complex Hyperbolic Functions */ gsl_complex gsl_complex_arcsinh (gsl_complex a); /* r=arcsinh(a) */ gsl_complex gsl_complex_arccosh (gsl_complex a); /* r=arccosh(a) */ gsl_complex gsl_complex_arccosh_real (double a); /* r=arccosh(a) */ gsl_complex gsl_complex_arcsech (gsl_complex a); /* r=arcsech(a) */ gsl_complex gsl_complex_arccsch (gsl_complex a); /* r=arccsch(a) */ gsl_complex gsl_complex_arctanh (gsl_complex a); /* r=arctanh(a) */ gsl_complex gsl_complex_arctanh_real (double a); /* r=arctanh(a) */ gsl_complex gsl_complex_arccoth (gsl_complex a); /* r=arccoth(a) */ __END_DECLS #endif /* __GSL_COMPLEX_MATH_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_inline.h000066400000000000000000000046361455214672000213220ustar00rootroot00000000000000/* gsl_inline.h * * Copyright (C) 2008, 2009 Brian Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #ifndef __GSL_INLINE_H__ #define __GSL_INLINE_H__ /* In recent versiions of GCC, the inline keyword has two different forms: GNU and C99. In GNU mode we can use 'extern inline' to make inline functions work like macros. The function is only inlined--it is never output as a definition in an object file. In the new C99 mode 'extern inline' has a different meaning--it causes the definition of the function to be output in each object file where it is used. This will result in multiple-definition errors on linking. The 'inline' keyword on its own (without extern) has the same behavior as the original GNU 'extern inline'. The C99 style is the default with -std=c99 in GCC 4.3. This header file allows either form of inline to be used by redefining the macros INLINE_DECL and INLINE_FUN. These are used in the public header files as INLINE_DECL double gsl_foo (double x); #ifdef HAVE_INLINE INLINE_FUN double gsl_foo (double x) { return x+1.0; } ; #endif */ #ifdef HAVE_INLINE #if defined(__GNUC_STDC_INLINE__) || defined(GSL_C99_INLINE) || \ defined(HAVE_C99_INLINE) #define INLINE_DECL inline /* use C99 inline */ #define INLINE_FUN inline #else #define INLINE_DECL /* use GNU extern inline */ #define INLINE_FUN extern inline #endif #else #define INLINE_DECL /* */ #endif /* Range checking conditions in headers do not require any run-time tests of the global variable gsl_check_range. They are enabled or disabled in user code at compile time with GSL_RANGE_CHECK macro. See also build.h. */ #define GSL_RANGE_COND(x) (x) #endif /* __GSL_INLINE_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_machine.h000066400000000000000000000071201455214672000214370ustar00rootroot00000000000000/* Author: B. Gough and G. Jungman */ #ifndef __GSL_MACHINE_H__ #define __GSL_MACHINE_H__ #include #include /* magic constants; mostly for the benefit of the implementation */ /* -*-MACHINE CONSTANTS-*- * * PLATFORM: Whiz-O-Matic 9000 * FP_PLATFORM: IEEE-Virtual * HOSTNAME: nnn.lanl.gov * DATE: Fri Nov 20 17:53:26 MST 1998 */ #define GSL_DBL_EPSILON 2.2204460492503131e-16 #define GSL_SQRT_DBL_EPSILON 1.4901161193847656e-08 #define GSL_ROOT3_DBL_EPSILON 6.0554544523933429e-06 #define GSL_ROOT4_DBL_EPSILON 1.2207031250000000e-04 #define GSL_ROOT5_DBL_EPSILON 7.4009597974140505e-04 #define GSL_ROOT6_DBL_EPSILON 2.4607833005759251e-03 #define GSL_LOG_DBL_EPSILON (-3.6043653389117154e+01) #define GSL_DBL_MIN 2.2250738585072014e-308 #define GSL_SQRT_DBL_MIN 1.4916681462400413e-154 #define GSL_ROOT3_DBL_MIN 2.8126442852362996e-103 #define GSL_ROOT4_DBL_MIN 1.2213386697554620e-77 #define GSL_ROOT5_DBL_MIN 2.9476022969691763e-62 #define GSL_ROOT6_DBL_MIN 5.3034368905798218e-52 #define GSL_LOG_DBL_MIN (-7.0839641853226408e+02) #define GSL_DBL_MAX 1.7976931348623157e+308 #define GSL_SQRT_DBL_MAX 1.3407807929942596e+154 #define GSL_ROOT3_DBL_MAX 5.6438030941222897e+102 #define GSL_ROOT4_DBL_MAX 1.1579208923731620e+77 #define GSL_ROOT5_DBL_MAX 4.4765466227572707e+61 #define GSL_ROOT6_DBL_MAX 2.3756689782295612e+51 #define GSL_LOG_DBL_MAX 7.0978271289338397e+02 #define GSL_FLT_EPSILON 1.1920928955078125e-07 #define GSL_SQRT_FLT_EPSILON 3.4526698300124393e-04 #define GSL_ROOT3_FLT_EPSILON 4.9215666011518501e-03 #define GSL_ROOT4_FLT_EPSILON 1.8581361171917516e-02 #define GSL_ROOT5_FLT_EPSILON 4.1234622211652937e-02 #define GSL_ROOT6_FLT_EPSILON 7.0153878019335827e-02 #define GSL_LOG_FLT_EPSILON (-1.5942385152878742e+01) #define GSL_FLT_MIN 1.1754943508222875e-38 #define GSL_SQRT_FLT_MIN 1.0842021724855044e-19 #define GSL_ROOT3_FLT_MIN 2.2737367544323241e-13 #define GSL_ROOT4_FLT_MIN 3.2927225399135965e-10 #define GSL_ROOT5_FLT_MIN 2.5944428542140822e-08 #define GSL_ROOT6_FLT_MIN 4.7683715820312542e-07 #define GSL_LOG_FLT_MIN (-8.7336544750553102e+01) #define GSL_FLT_MAX 3.4028234663852886e+38 #define GSL_SQRT_FLT_MAX 1.8446743523953730e+19 #define GSL_ROOT3_FLT_MAX 6.9814635196223242e+12 #define GSL_ROOT4_FLT_MAX 4.2949672319999986e+09 #define GSL_ROOT5_FLT_MAX 5.0859007855960041e+07 #define GSL_ROOT6_FLT_MAX 2.6422459233807749e+06 #define GSL_LOG_FLT_MAX 8.8722839052068352e+01 #define GSL_SFLT_EPSILON 4.8828125000000000e-04 #define GSL_SQRT_SFLT_EPSILON 2.2097086912079612e-02 #define GSL_ROOT3_SFLT_EPSILON 7.8745065618429588e-02 #define GSL_ROOT4_SFLT_EPSILON 1.4865088937534013e-01 #define GSL_ROOT5_SFLT_EPSILON 2.1763764082403100e-01 #define GSL_ROOT6_SFLT_EPSILON 2.8061551207734325e-01 #define GSL_LOG_SFLT_EPSILON (-7.6246189861593985e+00) /* !MACHINE CONSTANTS! */ /* a little internal backwards compatibility */ #define GSL_MACH_EPS GSL_DBL_EPSILON /* Here are the constants related to or derived from * machine constants. These are not to be confused with * the constants that define various precision levels * for the precision/error system. * * This information is determined at configure time * and is platform dependent. Edit at your own risk. * * PLATFORM: WHIZ-O-MATIC * CONFIG-DATE: Thu Nov 19 19:27:18 MST 1998 * CONFIG-HOST: nnn.lanl.gov */ /* machine precision constants */ /* #define GSL_MACH_EPS 1.0e-15 */ #define GSL_SQRT_MACH_EPS 3.2e-08 #define GSL_ROOT3_MACH_EPS 1.0e-05 #define GSL_ROOT4_MACH_EPS 0.000178 #define GSL_ROOT5_MACH_EPS 0.00100 #define GSL_ROOT6_MACH_EPS 0.00316 #define GSL_LOG_MACH_EPS (-34.54) #endif /* __GSL_MACHINE_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_math.h000066400000000000000000000102241455214672000207630ustar00rootroot00000000000000/* gsl_math.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 Gerard Jungman, Brian * Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #ifndef __GSL_MATH_H__ #define __GSL_MATH_H__ #include #include #include #include #include #include #include #include #ifndef M_E #define M_E 2.71828182845904523536028747135 /* e */ #endif #ifndef M_LOG2E #define M_LOG2E 1.44269504088896340735992468100 /* log_2 (e) */ #endif #ifndef M_LOG10E #define M_LOG10E 0.43429448190325182765112891892 /* log_10 (e) */ #endif #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880168872421 /* sqrt(2) */ #endif #ifndef M_SQRT1_2 #define M_SQRT1_2 0.70710678118654752440084436210 /* sqrt(1/2) */ #endif #ifndef M_SQRT3 #define M_SQRT3 1.73205080756887729352744634151 /* sqrt(3) */ #endif #ifndef M_PI #define M_PI 3.14159265358979323846264338328 /* pi */ #endif #ifndef M_PI_2 #define M_PI_2 1.57079632679489661923132169164 /* pi/2 */ #endif #ifndef M_PI_4 #define M_PI_4 0.78539816339744830961566084582 /* pi/4 */ #endif #ifndef M_SQRTPI #define M_SQRTPI 1.77245385090551602729816748334 /* sqrt(pi) */ #endif #ifndef M_2_SQRTPI #define M_2_SQRTPI 1.12837916709551257389615890312 /* 2/sqrt(pi) */ #endif #ifndef M_1_PI #define M_1_PI 0.31830988618379067153776752675 /* 1/pi */ #endif #ifndef M_2_PI #define M_2_PI 0.63661977236758134307553505349 /* 2/pi */ #endif #ifndef M_LN10 #define M_LN10 2.30258509299404568401799145468 /* ln(10) */ #endif #ifndef M_LN2 #define M_LN2 0.69314718055994530941723212146 /* ln(2) */ #endif #ifndef M_LNPI #define M_LNPI 1.14472988584940017414342735135 /* ln(pi) */ #endif #ifndef M_EULER #define M_EULER 0.57721566490153286060651209008 /* Euler constant */ #endif #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus #define __BEGIN_DECLS extern "C" { #define __END_DECLS } #else #define __BEGIN_DECLS /* empty */ #define __END_DECLS /* empty */ #endif __BEGIN_DECLS /* other needlessly compulsive abstractions */ #define GSL_IS_ODD(n) ((n)&1) #define GSL_IS_EVEN(n) (!(GSL_IS_ODD(n))) #define GSL_SIGN(x) ((x) >= 0.0 ? 1 : -1) /* Return nonzero if x is a real number, i.e. non NaN or infinite. */ #define GSL_IS_REAL(x) (gsl_finite(x)) /* Definition of an arbitrary function with parameters */ struct gsl_function_struct { double (*function)(double x, void *params); void *params; }; typedef struct gsl_function_struct gsl_function; #define GSL_FN_EVAL(F, x) (*((F)->function))(x, (F)->params) /* Definition of an arbitrary function returning two values, r1, r2 */ struct gsl_function_fdf_struct { double (*f)(double x, void *params); double (*df)(double x, void *params); void (*fdf)(double x, void *params, double *f, double *df); void *params; }; typedef struct gsl_function_fdf_struct gsl_function_fdf; #define GSL_FN_FDF_EVAL_F(FDF, x) (*((FDF)->f))(x, (FDF)->params) #define GSL_FN_FDF_EVAL_DF(FDF, x) (*((FDF)->df))(x, (FDF)->params) #define GSL_FN_FDF_EVAL_F_DF(FDF, x, y, dy) \ (*((FDF)->fdf))(x, (FDF)->params, (y), (dy)) /* Definition of an arbitrary vector-valued function with parameters */ struct gsl_function_vec_struct { int (*function)(double x, double y[], void *params); void *params; }; typedef struct gsl_function_vec_struct gsl_function_vec; #define GSL_FN_VEC_EVAL(F, x, y) (*((F)->function))(x, y, (F)->params) __END_DECLS #endif /* __GSL_MATH_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_minmax.h000066400000000000000000000050641455214672000213310ustar00rootroot00000000000000/* gsl_minmax.h * * Copyright (C) 2008 Gerard Jungman, Brian Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #ifndef __GSL_MINMAX_H__ #define __GSL_MINMAX_H__ #include #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus #define __BEGIN_DECLS extern "C" { #define __END_DECLS } #else #define __BEGIN_DECLS /* empty */ #define __END_DECLS /* empty */ #endif __BEGIN_DECLS /* Define MAX and MIN macros/functions if they don't exist. */ /* plain old macros for general use */ #define GSL_MAX(a, b) ((a) > (b) ? (a) : (b)) #define GSL_MIN(a, b) ((a) < (b) ? (a) : (b)) /* function versions of the above, in case they are needed */ double gsl_max(double a, double b); double gsl_min(double a, double b); /* inline-friendly strongly typed versions */ #ifdef HAVE_INLINE INLINE_FUN int GSL_MAX_INT(int a, int b); INLINE_FUN int GSL_MIN_INT(int a, int b); INLINE_FUN double GSL_MAX_DBL(double a, double b); INLINE_FUN double GSL_MIN_DBL(double a, double b); INLINE_FUN long double GSL_MAX_LDBL(long double a, long double b); INLINE_FUN long double GSL_MIN_LDBL(long double a, long double b); INLINE_FUN int GSL_MAX_INT(int a, int b) { return GSL_MAX(a, b); } INLINE_FUN int GSL_MIN_INT(int a, int b) { return GSL_MIN(a, b); } INLINE_FUN double GSL_MAX_DBL(double a, double b) { return GSL_MAX(a, b); } INLINE_FUN double GSL_MIN_DBL(double a, double b) { return GSL_MIN(a, b); } INLINE_FUN long double GSL_MAX_LDBL(long double a, long double b) { return GSL_MAX(a, b); } INLINE_FUN long double GSL_MIN_LDBL(long double a, long double b) { return GSL_MIN(a, b); } #else #define GSL_MAX_INT(a, b) GSL_MAX(a, b) #define GSL_MIN_INT(a, b) GSL_MIN(a, b) #define GSL_MAX_DBL(a, b) GSL_MAX(a, b) #define GSL_MIN_DBL(a, b) GSL_MIN(a, b) #define GSL_MAX_LDBL(a, b) GSL_MAX(a, b) #define GSL_MIN_LDBL(a, b) GSL_MIN(a, b) #endif /* HAVE_INLINE */ __END_DECLS #endif /* __GSL_POW_INT_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_nan.h000066400000000000000000000024621455214672000206130ustar00rootroot00000000000000/* gsl_nan.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #ifndef __GSL_NAN_H__ #define __GSL_NAN_H__ #ifdef INFINITY #define GSL_POSINF INFINITY #define GSL_NEGINF (-INFINITY) #elif defined(HUGE_VAL) #define GSL_POSINF HUGE_VAL #define GSL_NEGINF (-HUGE_VAL) #else #define GSL_POSINF (gsl_posinf()) #define GSL_NEGINF (gsl_neginf()) #endif #ifdef NAN #define GSL_NAN NAN #elif defined(INFINITY) #define GSL_NAN (INFINITY / INFINITY) #else #define GSL_NAN (gsl_nan()) #endif #define GSL_POSZERO (+0.0) #define GSL_NEGZERO (-0.0) #endif /* __GSL_NAN_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_pow_int.h000066400000000000000000000045211455214672000215140ustar00rootroot00000000000000/* gsl_pow_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 Gerard Jungman, Brian * Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #ifndef __GSL_POW_INT_H__ #define __GSL_POW_INT_H__ #include #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus #define __BEGIN_DECLS extern "C" { #define __END_DECLS } #else #define __BEGIN_DECLS /* empty */ #define __END_DECLS /* empty */ #endif __BEGIN_DECLS INLINE_DECL double gsl_pow_2(const double x); INLINE_DECL double gsl_pow_3(const double x); INLINE_DECL double gsl_pow_4(const double x); INLINE_DECL double gsl_pow_5(const double x); INLINE_DECL double gsl_pow_6(const double x); INLINE_DECL double gsl_pow_7(const double x); INLINE_DECL double gsl_pow_8(const double x); INLINE_DECL double gsl_pow_9(const double x); #ifdef HAVE_INLINE INLINE_FUN double gsl_pow_2(const double x) { return x * x; } INLINE_FUN double gsl_pow_3(const double x) { return x * x * x; } INLINE_FUN double gsl_pow_4(const double x) { double x2 = x * x; return x2 * x2; } INLINE_FUN double gsl_pow_5(const double x) { double x2 = x * x; return x2 * x2 * x; } INLINE_FUN double gsl_pow_6(const double x) { double x2 = x * x; return x2 * x2 * x2; } INLINE_FUN double gsl_pow_7(const double x) { double x3 = x * x * x; return x3 * x3 * x; } INLINE_FUN double gsl_pow_8(const double x) { double x2 = x * x; double x4 = x2 * x2; return x4 * x4; } INLINE_FUN double gsl_pow_9(const double x) { double x3 = x * x * x; return x3 * x3 * x3; } #endif double gsl_pow_int(double x, int n); double gsl_pow_uint(double x, unsigned int n); __END_DECLS #endif /* __GSL_POW_INT_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_precision.h000066400000000000000000000033561455214672000220350ustar00rootroot00000000000000/* gsl_precision.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ /* Author: B. Gough and G. Jungman */ #ifndef __GSL_PRECISION_H__ #define __GSL_PRECISION_H__ #include #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus #define __BEGIN_DECLS extern "C" { #define __END_DECLS } #else #define __BEGIN_DECLS /* empty */ #define __END_DECLS /* empty */ #endif __BEGIN_DECLS /* A type for the precision indicator. * This is mainly for pedagogy. */ typedef unsigned int gsl_prec_t; /* The number of precision types. * Remember that precision-mode * can index an array. */ #define _GSL_PREC_T_NUM 3 /* Arrays containing derived * precision constants for the * different precision levels. */ GSL_VAR const double gsl_prec_eps[]; GSL_VAR const double gsl_prec_sqrt_eps[]; GSL_VAR const double gsl_prec_root3_eps[]; GSL_VAR const double gsl_prec_root4_eps[]; GSL_VAR const double gsl_prec_root5_eps[]; GSL_VAR const double gsl_prec_root6_eps[]; __END_DECLS #endif /* __GSL_PRECISION_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_sys.h000066400000000000000000000036421455214672000206560ustar00rootroot00000000000000/* sys/gsl_sys.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __GSL_SYS_H__ #define __GSL_SYS_H__ #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus # define __BEGIN_DECLS extern "C" { # define __END_DECLS } #else # define __BEGIN_DECLS /* empty */ # define __END_DECLS /* empty */ #endif __BEGIN_DECLS double gsl_log1p (const double x); double gsl_expm1 (const double x); double gsl_hypot (const double x, const double y); double gsl_hypot3 (const double x, const double y, const double z); double gsl_acosh (const double x); double gsl_asinh (const double x); double gsl_atanh (const double x); int gsl_isnan (const double x); int gsl_isinf (const double x); int gsl_finite (const double x); double gsl_nan (void); double gsl_posinf (void); double gsl_neginf (void); double gsl_fdiv (const double x, const double y); double gsl_coerce_double (const double x); float gsl_coerce_float (const float x); long double gsl_coerce_long_double (const long double x); double gsl_ldexp(const double x, const int e); double gsl_frexp(const double x, int * e); int gsl_fcmp (const double x1, const double x2, const double epsilon); __END_DECLS #endif /* __GSL_SYS_H__ */ XaoS-release-4.3.2/src/include/gsl/gsl_types.h000066400000000000000000000021331455214672000211760ustar00rootroot00000000000000/* gsl_types.h * * Copyright (C) 2001, 2007 Brian Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #ifndef __GSL_TYPES_H__ #define __GSL_TYPES_H__ #ifndef GSL_VAR #ifdef WIN32 #ifdef GSL_DLL #ifdef DLL_EXPORT #define GSL_VAR extern __declspec(dllexport) #else #define GSL_VAR extern __declspec(dllimport) #endif #else #define GSL_VAR extern #endif #else #define GSL_VAR extern #endif #endif #endif /* __GSL_TYPES_H__ */ XaoS-release-4.3.2/src/include/hicolor.h000066400000000000000000000004351455214672000200420ustar00rootroot00000000000000#ifdef cpixel_t #undef cpixel_t #undef cpixeldata_t #undef cppixel_t #undef bpp #undef UNSUPPORTED #undef bpp1 #endif #ifndef SUPPORT16 #define UNSUPPORTED #endif #define cpixel_t pixel16_t #define cpixeldata_t pixel16_t #define cppixel_t ppixel16_t #define bpp 4 #include "generic.h" XaoS-release-4.3.2/src/include/i18n.h000066400000000000000000000004331455214672000171600ustar00rootroot00000000000000#ifndef I18N_H #define I18N_H const char *qt_gettext(const char *context, const char *text); void setLanguage(const char *lang); const char *getLanguage(); const char *lang1(int i); const char *lang2(int i); #define TR(context, text) qt_gettext(context, text) #endif XaoS-release-4.3.2/src/include/include.pri000066400000000000000000000016401455214672000203700ustar00rootroot00000000000000INCLUDEPATH += $$PWD HEADERS += \ $$PWD/cmplx.h \ $$PWD/config.h \ $$PWD/btrace.h \ $$PWD/c256.h \ $$PWD/catalog.h \ $$PWD/filter.h \ $$PWD/formulas.h \ $$PWD/fractal.h \ $$PWD/generic.h \ $$PWD/grlib.h \ $$PWD/hicolor.h \ $$PWD/i18n.h \ $$PWD/misc-f.h \ $$PWD/param.h \ $$PWD/pixel_t.h \ $$PWD/plane.h \ $$PWD/sffe.h \ $$PWD/sffe_cmplx_gsl.h \ $$PWD/timers.h \ $$PWD/true24.h \ $$PWD/truecolor.h \ $$PWD/ui_helper.h \ $$PWD/xerror.h \ $$PWD/xio.h \ $$PWD/xmenu.h \ $$PWD/xthread.h \ $$PWD/zoom.h \ $$PWD/gsl/gsl_math.h \ $$PWD/gsl/gsl_complex.h \ $$PWD/gsl/gsl_complex_math.h \ $$PWD/gsl/gsl_minmax.h \ $$PWD/gsl/gsl_pow_int.h \ $$PWD/gsl/gsl_nan.h \ $$PWD/gsl/gsl_precision.h \ $$PWD/gsl/gsl_machine.h \ $$PWD/gsl/gsl_types.h \ $$PWD/gsl/gsl_sys.h \ $$PWD/gsl/gsl_inline.h XaoS-release-4.3.2/src/include/misc-f.h000066400000000000000000000005631455214672000175630ustar00rootroot00000000000000#ifndef IUTIL_H #define IUTIL_H #include "xio.h" #include "config.h" struct image; const char *writepng(xio_constpath filename, const struct image *image, xio_file xpf_data); const char* readpng(xio_constpath filename); void XaoS_srandom(unsigned int x); long int XaoS_random(void); char *mystrdup(const char *); number_t xstrtonum(const char *s, char **sp); #endif XaoS-release-4.3.2/src/include/param.h000066400000000000000000000023151455214672000175020ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef PARAMS_H #define PARAMS_H struct params { const char *name; int type; void *value; const char *help; }; #define P_SWITCH 0 #define P_NUMBER 1 #define P_STRING 2 #define P_FLOAT 3 #define P_HELP 4 int params_parser(int, char **); void params_register(const struct params *par); #endif XaoS-release-4.3.2/src/include/pixel_t.h000066400000000000000000000004151455214672000200450ustar00rootroot00000000000000#ifndef PIXEL_T_H #define PIXEL_T_H #include typedef uint8_t pixel8_t; typedef uint8_t ppixel24_t[3]; typedef pixel8_t *ppixel8_t; typedef uint16_t pixel16_t; typedef pixel16_t *ppixel16_t; typedef uint32_t pixel32_t; typedef pixel32_t *ppixel32_t; #endif XaoS-release-4.3.2/src/include/plane.h000066400000000000000000000024101455214672000174750ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef PLANE_H #define PLANE_H #include "config.h" #include "zoom.h" /*#define PLANES 7*/ #define P_MU 0 #define P_INVERSE 1 #define P_PARABOL 2 #define P_LAMBDA 3 #define P_INVLAMBDA 4 #define P_TRANLAMBDA 5 #define P_MEREBERG 6 #define P_USER 7 extern void recalculate(int plane, number_t *, number_t *); extern const char *const planename[]; #endif /* PLANE_H */ XaoS-release-4.3.2/src/include/sffe.h000066400000000000000000000123501455214672000173250ustar00rootroot00000000000000/*///////////////////////////////////////////////////////////////////////////////////// // project : sFFe ( SegFault (or Segmentation Fault :) ) formula evalutaor ) // author : Mateusz Malczak ( mateusz@malczak.info ) // wpage : /////////////////////////////////////////////////////////////////////////////////////// // possible config definitions // general // SFFE_DOUBLE - real math parser // SFFE_COMPLEX - complex math parser // SFFE_DEVEL - print extra info to stdout // SFFE_DIRECT_FPTR - use direct function pointers (!!!) omits payload // SFFE_DLL - Windows DLL // // complex numbers (for SFFE_COMPLEX) // SFFE_CMPLX_GSL - uses GSL complex number routines // SFFE_CMPLX_ASM - uses my asm complex unit (compile it with NASM) /////////////////////////////////////////////////////////////////////////////////////*/ #ifndef SFFE_H #define SFFE_H #include #define SFFE_DIRECT_FPTR 1 #ifdef SFFE_REAL #define SFFE_DOUBLE 1 #endif /* --- */ /*TODO long double needed*/ #ifdef SFFE_CMPLX_ASM #define SFFE_COMPLEX 1 typedef struct cmpx__ { double r, i; } cmplx; #define sfNumber cmplx #elif SFFE_CMPLX_GSL #define SFFE_COMPLEX 1 #include typedef gsl_complex cmplx; #define sfNumber gsl_complex #elif SFFE_DOUBLE #define sfNumber double #endif enum sffe_error { MemoryError, UnbalancedBrackets, UnknownFunction, InvalidNumber, UnknownVariable, InvalidOperators, StackError, InvalidParameters, EmptyFormula, }; typedef enum { sfvar_type_ptr, sfvar_type_managed_ptr } sfvartype; /* basic sffe argument 'stack' */ typedef struct sfargument__ { struct sfargument__ *parg; sfvartype type; sfNumber *value; } sfarg; /* sffe function prototype, parameters order is right-to-left (cdecl) */ typedef sfarg *(*sffptr)(sfarg *const a); /* constats eval functions */ typedef void (*cfptr)(sfNumber *cnst); /* function type structure */ typedef struct { sffptr fptr; unsigned char parcnt; char name[20]; } sffunction; /* basic sffe 'stack' operation ( function + result slot ) */ typedef struct { sfarg *arg; #ifdef SFFE_DIRECT_FPTR sffptr fnc; #else sffunction *fnc; #endif } sfopr; typedef struct { char *name; sfvartype type; sfNumber *value; } sfvariable; typedef struct sfcontext__ { unsigned int funcsCount; /* number of default / user functions */ sffunction *functions; unsigned int constsCount; cfptr *constants; } sffe_context; /* SFFE main structure */ typedef struct { /*public*/ const char *expression; /* parsed expression (read-only) */ char *errormsg; /* parser errors (read-only) */ sfNumber *result; /* evaluation result (read-only) */ /* protected/private */ unsigned int argCount; /* number of arguments in use */ sfarg *args; unsigned int oprCount; /* number of operations in use */ sfopr *oprs; unsigned int varCount; /* number of used variables */ sfvariable *variables; unsigned int userfCount; /* number of user functions */ sffunction *userf; } sffe; #define SFFE sffe #define sffeparser sffe #define sfparser sffe #define SFFEPARSER sffe /* 'stack' slot value */ #define sfvalue(p) (*((p)->value)) /* function parameters */ #define sfaram1(p) ((p)->parg) #define sfaram2(p) ((p)->parg->parg) #define sfaram3(p) ((p)->parg->parg->parg) #define sfaram4(p) ((p)->parg->parg->parg->parg) #define sfaram5(p) ((p)->parg->parg->parg->parg->parg) #define sfparamN(p, N) \ struct sfargument__ *r = p->parg; \ while ((--N) > 0) \ r = r->parg; \ return r; /* and so on */ /* create formula evaluator structure */ sffe *sffe_alloc(void); /* free fe structure */ void sffe_free(sffe **parser); /* parse expression 'expression' and store result in 'parser' struct, error (if * any) returned */ int sffe_parse(sffe **parser, const char *expression); /* evaluate function and return evaluation result */ sfNumber sffe_eval(sffe *const parser); /* user function with name 'vname', with 'parcnt' parameters and * defined with function pointed by 'funptr'*/ void *sffe_regfunc(sffe **parser, const char *vname, unsigned int parcnt, sffptr funptr); /* get already registered variable pointer, NULL if variable was not registered */ sfvariable *sffe_var(sffe *const parser, const char *name); /* single variable 'vptrs' identified by name 'vchars' */ // void *sffe_regvar(sffe ** parser, sfNumber * vptrs, char vchars); sfvariable *sffe_regvar(sffe **parser, sfNumber *vptrs, const char *name); /* multiple variables */ void sffe_regvars(sffe **parser, unsigned int cN, sfNumber **vptrs, char *const *names); // sffunction *sffe_function_alloc(char *name, sffptr function_pointer, unsigned // char paramsCount, void *payload); // void sffe_function_free(sffunction* function); /* set 'vptrs' as 'vchars' variable */ sfNumber *sffe_setvar(sffe **parser, sfNumber vptrs, const char *name); #ifdef SFFE_CMPLX_ASM #include "sffe_cmplx_asm.h" #elif SFFE_CMPLX_GSL #include "sffe_cmplx_gsl.h" #elif SFFE_DOUBLE #include "sffe_real.h" #endif #endif XaoS-release-4.3.2/src/include/sffe_cmplx_gsl.h000066400000000000000000000053161455214672000214010ustar00rootroot00000000000000/*///////////////////////////////////////////////////////////////////////////////////// // project : sFFe ( SegFault (or Segmentation Fault :) ) formula evalutaor ) // author : Mateusz Malczak ( mateusz@malczak.info ) // wpage : /////////////////////////////////////////////////////////////////////////////////////*/ #ifndef SFFE_CMPLX_GSL_H #define SFFE_CMPLX_GSL_H #ifdef SFFE_CMPLX_GSL #include "sffe.h" #include #include #define sffnctscount 43 #define sfvarscount 6 #define cmplxset(c, r, i) GSL_SET_COMPLEX(&c, r, i) #define real(c) GSL_REAL((c)) #define imag(c) GSL_IMAG((c)) sfarg *sfadd(sfarg *const p); /* + */ sfarg *sfsub(sfarg *const p); /* - */ sfarg *sfmul(sfarg *const p); /* * */ sfarg *sfdiv(sfarg *const p); /* / */ sfarg *sfsin(sfarg *const p); /* sin */ sfarg *sfcos(sfarg *const p); /* cos */ sfarg *sftan(sfarg *const p); /* tan */ sfarg *sfcot(sfarg *const p); /* ctan */ sfarg *sfasin(sfarg *const p); /* asin */ sfarg *sfacos(sfarg *const p); /* acos */ sfarg *sfatan(sfarg *const p); /* atan */ sfarg *sfacot(sfarg *const p); /* actan */ sfarg *sfatan2(sfarg *const p); /* atan2 */ sfarg *sfsinh(sfarg *const p); /* sinh */ sfarg *sfcosh(sfarg *const p); /* cosh */ sfarg *sftanh(sfarg *const p); /* tanh */ sfarg *sfcoth(sfarg *const p); /* ctanh */ sfarg *sfexp(sfarg *const p); /* exp */ sfarg *sflog(sfarg *const p); /* log */ sfarg *sflog10(sfarg *const p); /* log10 */ sfarg *sflog2(sfarg *const p); /* log2 */ sfarg *sflogN(sfarg *const p); /* logN */ sfarg *sfpow(sfarg *const p); /* csflx pow */ sfarg *sfpowd(sfarg *const p); /* double pow */ sfarg *sfpowi(sfarg *const p); /* double pow */ sfarg *sfpowdc(sfarg *const p); /* double to csflx pow */ sfarg *sfsqr(sfarg *const p); /* sqr */ sfarg *sfsqrt(sfarg *const p); /* sqrt */ sfarg *sfrtni(sfarg *const p); /* rtni */ sfarg *sfinv(sfarg *const p); /* cinv */ sfarg *sfceil(sfarg *const p); /* ceil */ sfarg *sffloor(sfarg *const p); /* floor */ sfarg *sfabs(sfarg *const p); /* abs - |z| */ sfarg *sfre(sfarg *const p); /* RE */ sfarg *sfim(sfarg *const p); /* IM */ sfarg *sfrabs(sfarg *const p); /* abs - real numbers */ sfarg *sfrand(sfarg *const p); /* rand */ /*const eval*/ void sfcPI(sfNumber *cnst); void sfcPI2(sfNumber *cnst); void sfc2PI(sfNumber *cnst); void sfcE(sfNumber *cnst); void sfcI(sfNumber *cnst); void sfcRND(sfNumber *cnst); /* all available function (function pointer, number of parameters, name )*/ extern const sffunction sfcmplxfunc[sffnctscount]; /* all available buildin variables */ extern const char sfcnames[sfvarscount][6]; /* available variables function pointers */ extern const cfptr sfcvals[sfvarscount]; #endif #endif XaoS-release-4.3.2/src/include/timers.h000066400000000000000000000042161455214672000177070ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef TIMERS_H #define TIMERS_H #include "config.h" struct timer; struct timeemulator; typedef struct timer tl_timer; typedef struct timer tl_group; void tl_update_time(void); tl_timer *tl_create_timer(void); tl_group *tl_create_group(void); void tl_set_interval(tl_timer *timer, int interval); void tl_set_handler(tl_timer *timer, void (*handler)(void *), void *userdata); void tl_set_multihandler(tl_timer *timer, void (*handler)(void *, int), void *userdata); void tl_add_timer(tl_group *group, tl_timer *timer); void tl_remove_timer(tl_timer *timer); void tl_free_timer(tl_timer *timer); void tl_free_group(tl_group *timer); void tl_stop_timer(tl_timer *t); void tl_resume_timer(tl_timer *t); void tl_slowdown_timer(tl_timer *t, int time); int tl_process_group(tl_group *group, int *activated); extern tl_group *syncgroup; void tl_sleep(int); void tl_allegromode(int mode); /*Just for djgpp */ int tl_lookup_timer(tl_timer *t); void tl_reset_timer(tl_timer *t); struct timeemulator *tl_create_emulator(void); void tl_free_emulator(struct timeemulator *t); void tl_elpased(struct timeemulator *t, int elpased); void tl_emulate_timer(struct timer *t, struct timeemulator *e); void tl_unemulate_timer(struct timer *t); #endif /* TIMER_H */ XaoS-release-4.3.2/src/include/true24.h000066400000000000000000000022701455214672000175270ustar00rootroot00000000000000#ifdef cpixel_t #undef cpixel_t #undef cpixeldata_t #undef cppixel_t #undef cpixeldata_t #undef bpp #undef bpp1 #undef p_add #undef p_inc #undef p_set #undef p_get #undef p_setp #undef UNSUPPORTED #undef p_getp #undef p_copy #endif #ifndef STRUECOLOR24 #define UNSUPPORTED #endif #define cpixel_t pixel8_t #define cppixel_t ppixel8_t #define cpixeldata_t pixel32_t #define bpp 3 /*FIXME this should make problems at small edian machines? */ #define p_set(ptr, val) \ ((*(pixel16_t *)(ptr)) = (pixel16_t)(val), \ ((ptr)[2]) = (pixel8_t)((val) >> 16)) #define p_get(ptr) \ (((pixel32_t) * (pixel16_t *)(ptr) + (pixel32_t)(*((ptr) + 2) << 16))) #define p_copy(ptr1, pos1, ptr2, pos2) \ (*((pixel16_t *)((ptr1) + (pos1)*3)) = *(pixel16_t *)((ptr2) + (pos2)*3), \ (ptr1)[(pos1)*3 + 2] = (ptr2)[(pos2)*3 + 2]) #define p_setp(ptr, pos, val) p_set((ptr) + (pos)*3, val) #define p_getp(ptr, pos) p_get((ptr) + (pos)*3) #define p_add(ptr, pos) ((ptr) + (pos)*3) #define p_inc(ptr, pos) ((ptr) += (pos)*3) XaoS-release-4.3.2/src/include/truecolor.h000066400000000000000000000003601455214672000204160ustar00rootroot00000000000000#ifdef cpixel_t #undef UNSUPPORTED #undef cpixel_t #undef cpixeldata_t #undef cppixel_t #undef bpp #undef bpp1 #endif #define cpixel_t pixel32_t #define cpixeldata_t pixel32_t #define cppixel_t ppixel32_t #define bpp 4 #include "generic.h" XaoS-release-4.3.2/src/include/ui_helper.h000066400000000000000000000457371455214672000203750ustar00rootroot00000000000000#ifndef UI_HELPER_H #define UI_HELPER_H #include "timers.h" #include "xio.h" #include "fractal.h" #define MAXFILTERS 20 #define AVRGSIZE 50 #define NMESSAGES 5 #define BGCOLOR(uih) uih->palette->index[0] #define FGCOLOR(uih) uih->palette->index[1] #define SELCOLOR(uih) uih->palette->index[2] #define NONTRANSPARENTW 1 struct uih_message { char *message[NMESSAGES]; tl_timer *messagetimer[NMESSAGES]; int messagetype[NMESSAGES]; struct uih_window *w[NMESSAGES]; int pid[NMESSAGES]; int messagestart; }; struct uih_line { int key; int morph; int color; int posmode; number_t x1, y1, x2, y2; int mposmode; number_t mx1, my1, mx2, my2; struct uih_line *next, *prev; struct uih_window *w; }; struct uih_lines { struct uih_line *first; int morphing; int currkey; }; struct uih_savedcontext { xio_file file; int mode; number_t speedup, maxstep; number_t xcenter, ycenter; tl_timer *timer; tl_timer *synctimer; struct fractal_context *fcontext; int clearscreen; int fastmode, juliamode, fastrotate, autorotate; number_t rotationspeed; int firsttime; int filter[MAXFILTERS]; int pressed; int rotatepressed; int cycling; int shifted; int manualpaletteshift; int direction; int cyclingspeed; int zoomactive; int xtextpos, ytextpos; int writefailed; int nonfractalscreen; int color; }; #define MAXLEVEL 10 /*Maximal include level */ struct uih_playcontext { xio_file file; xio_file prevfiles[MAXLEVEL + 1]; int level; xio_path directory; tl_timer *timer; int waittime; int playframe; int timerin; int frametime, starttime; int morph; int morphtimes[2]; int morphjulia; int morphjuliatimes[2]; int morphangle; int morphangletimes[2]; vinfo destination; vinfo source; number_t srcangle, destangle; number_t sr, si, dr, di; int readfailed; int line; struct uih_lines lines; int morphlinetimes[2]; }; #define SQR(val) (((double)(val)) * (val)) #define MORPHVALUE(time, len, starttime, endtime) \ (time) < 0 \ ? 0.0 \ : (time) >= (len) \ ? 1.0 \ : (time) < (starttime) && (starttime) \ ? (SQR((time) / (double)(starttime)) / 2 * (starttime) / \ ((len) - (starttime) / 2 - (endtime) / 2)) \ : ((len) - (time) < (endtime)) && (endtime) \ ? 1 - (SQR(((len) - (time)) / (double)(endtime)) / \ 2 * (endtime) / \ ((len) - (starttime) / 2 - (endtime) / 2)) \ : ((time) - (starttime) / 2) / \ ((double)(len) - (starttime) / 2 - \ (endtime) / 2) #define DOMORPH(time, len, starttime, endtime, startval, endval) \ ((startval) + \ ((endval) - (startval)) * MORPHVALUE(time, len, starttime, endtime)) #define UNDOLEVEL 256 struct uih_undocontext { int last; char *undos[256]; }; struct uih_context { void (*updatemenus)(struct uih_context *, const char *); /*stuff that should be visible from outside */ number_t speedup, maxstep; /*zooming speed */ /* Information provided to the user interface: */ const char *menuroot; int display; /*1 when ui wants to display something */ int save; /*1 if save animation is enabled */ int play; /*1 if animation replay is active */ int cycling; /*1 if cycling is enabled */ int incalculation; /*1 if calulcation is currently in process */ int flags; int interrupt; /*set to interrupt current calculation */ /*server's callbacks */ int (*passfunc)(struct uih_context *, int, const char *, float); void (*longwait)(struct uih_context *); struct uih_undocontext undo; /*Filter system state */ struct image *image; struct palette *palette; struct fractal_context *fcontext; /*fractal information */ struct queue *queue; struct filter *uifilter; /*user interface layer */ struct filter *rotatef; /* Special filters handler by ui_helper: */ struct filter *zengine; struct filter *fixedcolor; /*Julia/filter mechanizm */ struct filter *subwindow, *julia, *smalliter; struct filter *filter[MAXFILTERS]; /*General status variables */ double mul; /*speed of last iteration */ int rotatemode; /*ROTATE_NONE, ROTATE_CONTINUOUS or ROTATE_NONE */ number_t rotationspeed; /*speed of continuous rotation */ int fastmode; /*when draw in fast mode */ int juliamode; int fastrotate; int incomplete; /*1 if image is not completely calculated or in animation */ int dirty; /*1 if image is inexact */ int inanimation; /*1 if uih_update wants to be called soon */ int fastanimation; /*1 if animation needs to be fast */ int palettetype, paletteseed; /*0 for default palette,1,2 for random */ int clearscreen; /*1 when ui want to clear screen */ int indofractal; /*1 when caluclation is in the process */ int xtextpos, ytextpos; /*positioning of text */ int color; /*Color of text */ int recalculatemode; /*information for user interface */ int stoppedtimers; /*1 when timers are stopped */ int nletters; /*Number of letters displayed at screen */ int letterspersec; /*Number of letters per second user should read */ char *text[3]; /*Currently displayed text information: */ struct uih_window *textwindow[3], *cscreenwindow; int textpos[3], textcolor[3]; const char *errstring; /*String of last unprocessed error */ void *font; /*Font used by UI */ struct uih_window *wtop; int wflipped; int wdisplayed; /*Save variables */ int todisplayletters; struct uih_savedcontext *savec; int viewchanged; /*When to generate setview commands */ int palettechanged; /*When to generate setpalette commands */ int displaytext; /*When text was displayed in this frame */ int palettepickerenabled; /*If palette picker is used */ int nonfractalscreen; /*waiting variables */ void (*complettehandler)( void *); /*Handler to be activated when calculation is complete */ void *handlerdata; /*replay variables */ struct uih_playcontext *playc; int playpos; const char *playstring; /*For constant framerate */ struct timeemulator *emulator; int emulatedframetime; int aliasnum; int fixedstep; /*zoom/unzoom */ number_t speed, step; number_t xcenter, ycenter; int xcenterm, ycenterm; int zoomactive; /*drag&drop move */ int pressed; number_t oldx, oldy; int moved; /*drag&drop rotate */ int rotatepressed; number_t oldangle; int ddatalost; int tbreak; int autopilot; /*for uih side of autopilot */ int autopilotx, autopiloty, autopilotbuttons; /*calculation time variables */ int interruptiblemode; int starttime, endtime; int maxtime; /*dynamical timeout measuring */ int times[2][AVRGSIZE]; /*for statistics */ int timespos, count[2]; double lastspeed, lasttime; /*number_t xsize, ysize; */ tl_timer *maintimer, *cyclingtimer, *autopilottimer, *calculatetimer, *doittimer; tl_group *autopilotgroup; /*color cycling values */ int direction; int cyclingdirection; int stopped; int cyclingspeed; /*autopilot internal values */ int x1, y1, c1; number_t minsize; number_t maxsize; int autopilotversion; int autime; int minlong; int interlevel; /*saved palettes */ struct palette *palette2; int paletteshift; int manualpaletteshift; struct uih_message messg; /*Used by uih_update to figure out when save undo */ int lastbuttons; int encoding; /* performers really don't want text echoed to the screen */ int inhibittextoutput; /* user data */ void *data; }; typedef void (*uih_getposfunc)(struct uih_context *c, int *x, int *y, int *width, int *height, void *data); typedef void (*uih_drawfunc)(struct uih_context *c, void *data); struct uih_window { int x, y, width, height; uih_getposfunc getpos; uih_drawfunc draw; struct uih_window *next; struct uih_window *previous; int savedline, savedpos; char *saveddata; void *data; int flags; }; typedef struct uih_context uih_context; #define UIH_SAVEALL 2 #define UIH_SAVEANIMATION 1 #define UIH_SAVEPOS 0 #define UIH_PALETTEDRAW -2 #define UIH_FILTERANIMATION -1 #define UIH_INTERRUPTIBLE 0 #define UIH_ANIMATION 1 #define UIH_NEW_IMAGE 2 #define UIH_UNINTERRUPTIBLE 3 #define FRAMETIME (1000000 / FRAMERATE) #define UIH_TEXTTOP 0 #define UIH_TEXTMIDDLE 1 #define UIH_TEXTBOTTOM 2 #define UIH_TEXTLEFT 0 #define UIH_TEXTCENTER 1 #define UIH_TEXTRIGHT 2 // use the same order here as for language1 and language2 #define UIH_LANG_SYS_DEFAULT 0 #define UIH_LANG_CS 1 #define UIH_LANG_EN 2 #define UIH_LANG_FR 3 #define UIH_LANG_DE 4 #define UIH_LANG_HE 5 #define UIH_LANG_HI 6 #define UIH_LANG_HU 7 #define UIH_LANG_IS 8 #define UIH_LANG_IT 9 #define UIH_LANG_PT 10 #define UIH_LANG_RO 11 #define UIH_LANG_RU 12 #define UIH_LANG_RS 13 #define UIH_LANG_ES 14 #define UIH_LANG_SV 15 #define UIH_LANG_TR 16 #define UIH_LANG_VI 17 #define RANDOM_PALETTE_SIZE 1 #define FULLSCREEN 2 #define UPDATE_AFTER_PALETTE 4 #define UPDATE_AFTER_RESIZE 8 #define PALETTE_ROTATION 16 #define ASYNC_PALETTE 32 #define ROTATE_INSIDE_CALCULATION 64 #define PALETTE_REDISPLAYS 128 #define SCREENSIZE 256 #define PIXELSIZE 512 #define RESOLUTION 1024 #define BUTTON1 256 #define BUTTON2 512 #define BUTTON3 1024 #define ROTATE_NONE 0 #define ROTATE_MOUSE 1 #define ROTATE_CONTINUOUS 2 #define uih_needrecalculate(context) ((context)->recalculatemode) #define uih_needdisplay(context) ((context)->display) #define GETMAX(a, b) ((a) > (b) ? (a) : (b)) #define uih_newimage(c) \ ((c)->display = 1, \ ((c)->recalculatemode = GETMAX((c)->recalculatemode, UIH_NEW_IMAGE))) #define uih_animate_image(c) \ ((c)->display = 1, \ (c)->recalculatemode = GETMAX((c)->recalculatemode, UIH_ANIMATION)) #define uih_updatemenus(uih, c) \ if (uih->updatemenus != NULL) \ uih->updatemenus(uih, c); extern const struct filteraction *const uih_filters[MAXFILTERS]; extern const int uih_nfilters; extern const char *const xtextposnames[]; extern const char *const ytextposnames[]; extern int defthreads; struct uih_context * uih_mkcontext(int flags, struct image *image, int (*passfunc)(struct uih_context *, int, const char *, float), void (*longwait)(struct uih_context *), void (*updatemenus)(struct uih_context *c, const char *)); int uih_updateimage(uih_context *c, struct image *img); void uih_freecontext(uih_context *c); void uih_callcomplette(uih_context *c); /*palette functions */ void uih_mkdefaultpalette(uih_context *c); void uih_mkpalette(uih_context *c); void uih_savepalette(uih_context *c); void uih_restorepalette(uih_context *c); void uih_loadpalette(uih_context *c, struct palette *palette); /*autopilot handling */ void uih_autopilot_on(uih_context *c); void uih_autopilot_off(uih_context *c); /*misc functions */ int uih_update(uih_context *c, int mousex, int mousey, int mousebuttons); const char *uih_save(struct uih_context *c, xio_constpath filename, xio_file xpf_data); void uih_tbreak(uih_context *c); double uih_displayed(uih_context *c); void uih_do_fractal(uih_context *c); void uih_prepare_image(uih_context *c); void uih_interrupt(uih_context *c); void uih_stopzooming(uih_context *c); void uih_setspeedup(uih_context *c, number_t speed); void uih_setmaxstep(uih_context *c, number_t speed); void uih_setcomplettehandler(uih_context *c, void(h)(void *), void *d); void uih_recalculate(struct uih_context *c); void uih_initstate(struct uih_context *uih); void uih_screentofractalcoord(uih_context *c, int mousex, int mousey, number_t *re, number_t *im); /*cycling functions */ void uih_cycling_off(struct uih_context *c); void uih_cycling_stop(struct uih_context *c); void uih_cycling_continue(struct uih_context *c); void uih_setcycling(struct uih_context *c, int speed); int uih_cycling_on(struct uih_context *c); int uih_cycling(struct uih_context *c, int mode); /*fractal context manipulation routines */ void uih_setformula(uih_context *c, int formula); void uih_setperbutation(uih_context *c, number_t re, number_t im); void uih_perbutation(uih_context *c, int mousex, int mousey); void uih_setmaxiter(uih_context *c, int maxiter); void uih_setbailout(uih_context *c, number_t bailout); void uih_setincoloringmode(uih_context *c, int mode); void uih_setoutcoloringmode(uih_context *c, int mode); void uih_setintcolor(uih_context *c, int mode); void uih_setouttcolor(uih_context *c, int mode); void uih_setplane(uih_context *c, int mode); void uih_setmandelbrot(uih_context *c, int mode, int mousex, int mousey); void uih_setfastmode(uih_context *c, int mode); void uih_setguessing(uih_context *c, int range); void uih_setperiodicity(uih_context *c, int periodicity); void uih_display(uih_context *c); void uih_disablejulia(uih_context *c); int uih_enablejulia(uih_context *c); int uih_setjuliamode(uih_context *c, int mode); void uih_setjuliaseed(uih_context *c, number_t zre, number_t zim); /*filter manipulation */ int uih_enablefilter(uih_context *c, int n); void uih_disablefilter(uih_context *c, int n); /*Animation save routines */ int uih_save_enable(struct uih_context *uih, xio_file f, int mode); void uih_save_disable(struct uih_context *uih); void uih_saveframe(struct uih_context *uih); void uih_save_position(struct uih_context *uih, xio_file f, int mode); void uih_load(struct uih_context *uih, xio_file f, xio_constpath name); void uih_loadstr(struct uih_context *uih, const char *data); void uih_playstr(struct uih_context *uih, const char *data); void uih_playupdate(struct uih_context *uih); void uih_replaydisable(struct uih_context *uih); void uih_skipframe(struct uih_context *uih); int uih_replayenable(struct uih_context *uih, xio_file f, xio_constpath filename, int animroot); void uih_command(struct uih_context *uih, const char *command); void uih_playtutorial(struct uih_context *c, const char *name); /* Easy to use functions for handling save/load*/ void uih_loadfile(struct uih_context *uih, xio_constpath d); void uih_playfile(struct uih_context *c, xio_constpath d); void uih_loadexample(struct uih_context *c); void uih_loadpngfile(struct uih_context *c, xio_constpath d); void uih_savepngfile(struct uih_context *c, xio_constpath d); void uih_saveposfile(struct uih_context *c, xio_constpath d); void uih_copyposurl(struct uih_context *c); char *uih_savepostostr(struct uih_context *c); void uih_savecfg(struct uih_context *c); void uih_saveanimfile(struct uih_context *c, xio_constpath d); void uih_update_lines(uih_context *c); /*timer functions */ void uih_stoptimers(uih_context *c); void uih_resumetimers(uih_context *c); void uih_slowdowntimers(uih_context *c, int time); /*text output functions */ void uih_clearscreen(uih_context *c); void uih_settextpos(uih_context *c, int x, int y); void uih_text(uih_context *c, const char *text); void uih_letterspersec(uih_context *c, int n); /*image rotation functions */ int uih_fastrotate(uih_context *c, int mode); int uih_fastrotateenable(uih_context *c); void uih_fastrotatedisable(uih_context *c); void uih_angle(uih_context *c, number_t angle); void uih_rotatemode(uih_context *c, int mode); void uih_rotate(uih_context *c, int mode); void uih_rotationspeed(uih_context *c, number_t speed); /*Catalog functions */ int uih_loadcatalog(uih_context *c, const char *name); void uih_freecatalog(uih_context *c); void uih_registermenus(void); void uih_registermenus_i18n(void); void uih_registermenudialogs_i18n(void); void uih_unregistermenus(void); /*Windows :)*/ struct uih_window *uih_registerw(struct uih_context *uih, uih_getposfunc getpos, uih_drawfunc draw, void *data, int flags); void uih_removew(struct uih_context *uih, struct uih_window *w); void uih_clearwindows(struct uih_context *uih); void uih_drawwindows(struct uih_context *uih); void uih_setline(struct uih_context *uih, struct uih_window *w, int color, int x1, int y1, int x2, int y2); struct uih_window *uih_registerline(struct uih_context *uih, int color, int x1, int y1, int x2, int y2); /*Messages*/ void uih_scrollup(uih_context *c); void uih_clearmessages(uih_context *c); int uih_message(uih_context *c, const char *message); int uih_error(uih_context *c, const char *error); void uih_rmmessage(uih_context *c, int pid); void uih_printmessages(uih_context *c); /*Constant framerate functions*/ void uih_emulatetimers(uih_context *c); void uih_constantframetime(uih_context *c, int time); void uih_noconstantframetime(uih_context *c); /*undo and redo*/ void uih_saveundo(uih_context *c); void uih_undo(uih_context *c); void uih_redo(uih_context *c); void uih_setfont(uih_context *c); /*animation rendering*/ int uih_renderanimation(struct uih_context *gc, const char *basename, const xio_constpath animation, int width, int height, float pixelwidth, float pixelheight, int frametime, int type, int antialiasing, int slowmode, int letterspersec, const char *catalog); int uih_renderimage(struct uih_context *gc1, xio_file af, xio_constpath path, struct image *img, int antialias, const char *catalog, int noise); void uih_initmessages(uih_context *c); void uih_destroymessages(uih_context *c); void uih_inittext(uih_context *c); void uih_destroytext(uih_context *c); void uih_inhibittextsw(uih_context *c); int uih_inhibittextselected(uih_context *c); void uih_updatestatus(uih_context *uih); void uih_status(uih_context *uih); int uih_statusenabled(uih_context *uih); int uih_ministatusenabled(uih_context *uih); void uih_ministatus(uih_context *uih); int uih_cartesiangridenabled(uih_context *uih); void uih_cartesiangrid(uih_context *uih); void uih_sffeset(uih_context *c, sffe *parser, const char *formula); #endif XaoS-release-4.3.2/src/include/xerror.h000066400000000000000000000002421455214672000177200ustar00rootroot00000000000000#ifndef XERROR_H #define XERROR_H void x_message(const char *text, ...); void x_error(const char *text, ...); void x_fatalerror(const char *text, ...); #endif XaoS-release-4.3.2/src/include/xio.h000066400000000000000000000064211455214672000172030ustar00rootroot00000000000000/* This is implementation of input/output routines similar to stdio. purpose of this library is to hide differences between OSes (Mac OS don't have stdio!) and allow general streams to strings etc. */ #ifndef XIO1_H #define XIO1_H 1 #include "config.h" #define XIO_FAILED NULL struct xio_filestruct { void *data; int (*fputc)(int c, struct xio_filestruct *f); int (*fputs)(const char *s, struct xio_filestruct *f); int (*fgetc)(struct xio_filestruct *f); int (*fungetc)(int c, struct xio_filestruct *f); int (*xeof)(struct xio_filestruct *f); int (*fclose)(struct xio_filestruct *f); int (*flush)(struct xio_filestruct *f); }; typedef struct xio_filestruct *xio_file; #define xio_puts(s, f) (f)->fputs((s), (f)) #define xio_putc(s, f) (f)->fputc((s), (f)) #define xio_getc(f) (f)->fgetc((f)) #define xio_ungetc(s, f) (f)->fungetc((s), (f)) #define xio_feof(f) (f)->xeof((f)) #define xio_close(f) (f)->fclose((f)) #define xio_flush(f) \ if ((f)->flush != NULL) \ (f)->flush((f)) /* Standard stdio maps. These defines says, that filenames are strings and path is separated by slash or backslash (windoze, dog) the main I/O routines are in the xstdio file */ #include typedef char *xio_path; typedef const char *xio_constpath; typedef char xio_pathdata[4096]; extern char *xio_appdir; /*Where application binary is */ extern char *xio_homedir; #ifdef _WIN32 #define XIO_PATHSEP '\\' #define XIO_PATHSEPSTR "\\" #define XIO_EMPTYPATH ".\\" /*Should be also call to currentdir function */ #else #define XIO_PATHSEP '/' #define XIO_PATHSEPSTR "/" #define XIO_EMPTYPATH "./" /*Should be also call to currentdir function */ #endif #define XIO_EOF EOF #define xio_addfname(destination, dirrectory, filename) \ { \ strcpy(destination, dirrectory); \ if (strlen(dirrectory) && \ destination[strlen(destination) - 1] != XIO_PATHSEP) \ strcat(destination, XIO_PATHSEPSTR); \ strcat(destination, filename); \ } #define xio_addextension(destination, extension) strcat(destination, extension) #define xio_errorstring() strerror(errno) char *xio_fixpath(const char *name); xio_file xio_ropen(xio_constpath name); xio_file xio_wopen(xio_constpath name); xio_file xio_strropen(const char *c); xio_file xio_strwopen(void); char *xio_getstring(xio_file f); xio_path xio_getdirectory(xio_constpath name); xio_path xio_getfilename(const char *base, const char *extension); xio_file xio_getrandomexample(xio_path name); xio_file xio_getcatalog(const char *name); xio_file xio_gethelp(void); xio_file xio_gettutorial(const char *name, xio_path result); /*look through directory with examples, choose one file, open it (and return *descriptor+put name into name parameter*/ int xio_exist(xio_constpath name); int xio_getfiles(xio_constpath path, char ***names, char ***dirs, int *nnames, int *ndirs); void xio_init(const char *c); void xio_uninit(void); #endif XaoS-release-4.3.2/src/include/xmenu.h000066400000000000000000000723761455214672000175540ustar00rootroot00000000000000#ifndef XMENU_H #define XMENU_H #include "xio.h" #include "config.h" struct uih_context; typedef union { char *dstring; int dint; number_t number; number_t dcoord[2]; xio_path dpath; void *dummy; } dialogparam; typedef struct dialog { const char *question; int type; int defint; const char *defstr; number_t deffloat; number_t deffloat2; } menudialog; typedef char *(*tokenfunc)(struct uih_context *c); #define DIALOG_INT 1 #define DIALOG_FLOAT 2 #define DIALOG_STRING 3 #define DIALOG_KEYSTRING 4 #define DIALOG_IFILE 5 #define DIALOG_OFILE 6 #define DIALOG_CHOICE 7 #define DIALOG_ONOFF 8 #define DIALOG_COORD 9 #define DIALOG_PALSLIDER 10 #define DIALOG_PALPICKER 11 #define DIALOG_IFILES 12 #define DIALOG_LIST 13 #define DIALOGIFILE(question, filename) \ { \ question, DIALOG_IFILE, 0, filename \ } #define DIALOGOFILE(question, filename) \ { \ question, DIALOG_OFILE, 0, filename \ } #define DIALOGSTR(question, default) \ { \ question, DIALOG_STRING, 0, default \ } #define DIALOGKEYSTR(question, default) \ { \ question, DIALOG_KEYSTRING, 0, default \ } #define DIALOGINT(question, default) \ { \ question, DIALOG_INT, default \ } #define DIALOGONOFF(question, default) \ { \ question, DIALOG_ONOFF, default \ } #define DIALOGFLOAT(question, default) \ { \ question, DIALOG_FLOAT, 0, NULL, default \ } #define DIALOGCHOICE(question, table, default) \ { \ question, DIALOG_CHOICE, default, (const char *)table \ } #define DIALOGCOORD(question, default1, default2) \ { \ question, DIALOG_COORD, 0, NULL, default1, default2 \ } #define DIALOGPALSLIDER(question, default) \ { \ question, DIALOG_SLIDER, default \ } #define DIALOGIFILES(question, filenames) \ { \ question, DIALOG_IFILES, 0, filenames \ } #define DIALOGLIST(question, default) \ { \ question, DIALOG_LIST, 0, default \ } #define DIALOGIFILE_I(_question, _filename) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_IFILE; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = _filename; \ menudialogs_i18n[no_menudialogs_i18n].deffloat = 0; \ menudialogs_i18n[no_menudialogs_i18n].deffloat2 = 0; \ ++no_menudialogs_i18n; #define DIALOGOFILE_I(_question, _filename) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_OFILE; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = _filename; \ ++no_menudialogs_i18n; #define DIALOGKEYSTR_I(_question, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_KEYSTRING; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = _default; \ ++no_menudialogs_i18n; #define DIALOGSTR_I(_question, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_STRING; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = _default; \ ++no_menudialogs_i18n; #define DIALOGINT_I(_question, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_INT; \ menudialogs_i18n[no_menudialogs_i18n].defint = _default; \ ++no_menudialogs_i18n; #define DIALOGONOFF_I(_question, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_ONOFF; \ menudialogs_i18n[no_menudialogs_i18n].defint = _default; \ ++no_menudialogs_i18n; #define DIALOGFLOAT_I(_question, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_FLOAT; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = NULL; \ menudialogs_i18n[no_menudialogs_i18n].deffloat = _default; \ ++no_menudialogs_i18n; #define DIALOGCHOICE_I(_question, _table, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_CHOICE; \ menudialogs_i18n[no_menudialogs_i18n].defint = _default; \ menudialogs_i18n[no_menudialogs_i18n].defstr = (const char *)_table; \ ++no_menudialogs_i18n; #define DIALOGCOORD_I(_question, _default1, _default2) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_COORD; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = NULL; \ menudialogs_i18n[no_menudialogs_i18n].deffloat = _default1; \ menudialogs_i18n[no_menudialogs_i18n].deffloat2 = _default2; \ ++no_menudialogs_i18n; #define DIALOGPALSLIDER_I(_question, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_PALSLIDER; \ menudialogs_i18n[no_menudialogs_i18n].defint = _default; \ ++no_menudialogs_i18n; #define DIALOGPALPICKER_I(_question, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_PALPICKER; \ menudialogs_i18n[no_menudialogs_i18n].defint = _default; \ ++no_menudialogs_i18n; #define DIALOGIFILES_I(_question, _filenames) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_IFILES; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = _filenames; \ ++no_menudialogs_i18n; #define DIALOGLIST_I(_question, _default) \ menudialogs_i18n[no_menudialogs_i18n].question = _question; \ menudialogs_i18n[no_menudialogs_i18n].type = DIALOG_LIST; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = _default; \ ++no_menudialogs_i18n; #define NULL_I() \ menudialogs_i18n[no_menudialogs_i18n].question = NULL; \ menudialogs_i18n[no_menudialogs_i18n].type = 0; \ menudialogs_i18n[no_menudialogs_i18n].defint = 0; \ menudialogs_i18n[no_menudialogs_i18n].defstr = NULL; \ menudialogs_i18n[no_menudialogs_i18n].deffloat = 0; \ menudialogs_i18n[no_menudialogs_i18n].deffloat2 = 0; \ ++no_menudialogs_i18n; typedef struct menuitem { const char *menuname; const char *key; const char *name; const char *shortname; int type; int flags; void (*function)(void); int iparam; const void *pparam; int (*control)(void); const menudialog *(*dialog)(struct uih_context *); } menuitem; #define MENU_NOPARAM 1 #define MENU_SUBMENU 2 #define MENU_INT 3 #define MENU_STRING 4 #define MENU_DIALOG 6 #define MENU_CUSTOMDIALOG 7 #define MENU_SEPARATOR 8 /* Definitions for static menuitems. These items cannot be internationalized. All of these definitions will become obsolete soon: */ #define MENUNOP(menuname, key, name, shortname, flags, function) \ { \ menuname, key, name, shortname, MENU_NOPARAM, flags, \ (void (*)(void))function \ } #define MENUNOPCB(menuname, key, name, shortname, flags, function, \ checkbutton) \ { \ menuname, key, name, shortname, MENU_NOPARAM, \ (flags) | MENUFLAG_CHECKBOX, (void (*)(void))function, 0, NULL, \ (int (*)(void))checkbutton \ } #define MENUCOORDCB(menuname, key, name, shortname, flags, function, \ checkbutton) \ { \ menuname, key, name, shortname, MENU_COORD, \ (flags) | MENUFLAG_CHECKBOX, (void (*)(void))function, 0, NULL, \ (int (*)(void))checkbutton \ } #define MENUCOORD(menuname, key, name, shortname, flags, function) \ { \ menuname, key, name, shortname, MENU_COORD, flags, \ (void (*)(void))function \ } #define MENUINT(menuname, key, name, shortname, flags, function, param) \ { \ menuname, key, name, shortname, MENU_INT, flags, \ (void (*)(void))function, param \ } #define MENUINTRB(menuname, key, name, shortname, flags, function, param, \ checkbutton) \ { \ menuname, key, name, shortname, MENU_INT, (flags) | MENUFLAG_RADIO, \ (void (*)(void))function, param, NULL, (int (*)(void))checkbutton \ } #define SUBMENU(menuname, key, name, param) \ { \ menuname, key, name, param, MENU_SUBMENU, 0, NULL, 0, NULL, NULL, NULL \ } #define MENUSEPARATOR(menuname) \ { \ menuname, 0, "", NULL, MENU_SEPARATOR, 0, NULL, 0, NULL \ } #define SUBMENUNOOPT(menuname, key, name, param) \ { \ menuname, key, name, param, MENU_SUBMENU, MENUFLAG_NOOPTION, NULL, 0, \ NULL \ } #define MENUDIALOG(menuname, key, name, shortname, flags, function, param) \ { \ menuname, key, name, shortname, MENU_DIALOG, flags, \ (void (*)(void))function, 0, param \ } #define MENUDIALOGCB(menuname, key, name, shortname, flags, function, param, \ check) \ { \ menuname, key, name, shortname, MENU_DIALOG, \ flags | MENUFLAG_CHECKBOX, (void (*)(void))function, 0, param, \ (int (*)(void))check \ } #define MENUCDIALOG(menuname, key, name, shortname, flags, function, param) \ { \ menuname, key, name, shortname, MENU_CUSTOMDIALOG, flags, \ (void (*)(void))function, 0, NULL, NULL, \ (const menudialog *(*)(struct uih_context *))param \ } #define MENUCDIALOGCB(menuname, key, name, shortname, flags, function, param, \ check) \ { \ menuname, key, name, shortname, MENU_CUSTOMDIALOG, \ flags | MENUFLAG_CHECKBOX, (void (*)(void))function, 0, NULL, \ (int (*)(void))check, \ (const menudialog *(*)(struct uih_context *))param \ } #define MENUSTRING(menuname, key, name, shortname, flags, function, param) \ { \ menuname, key, name, shortname, MENU_STRING, flags, \ (void (*)(void))function, 0, param \ } /* Definitions for internationalized menus. All of them must be defined dynamically because TR() cannot be used within a static variable. Usage (example): SUBMENU_I("file", "q", "Quit", "quitmenu") See ui/ui.c, ui_registermenus_i18n() for further details. */ #define MENUNOP_I(_menuname, _key, _name, _shortname, _flags, _function) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_NOPARAM; \ menuitems_i18n[no_menuitems_i18n].flags = _flags; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = NULL; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ ++no_menuitems_i18n; #define MENUNOPCB_I(_menuname, _key, _name, _shortname, _flags, _function, \ _checkbutton) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_NOPARAM; \ menuitems_i18n[no_menuitems_i18n].flags = (_flags) | MENUFLAG_CHECKBOX; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = NULL; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ menuitems_i18n[no_menuitems_i18n].control = (int (*)(void))_checkbutton; \ ++no_menuitems_i18n; #define MENUINT_I(_menuname, _key, _name, _shortname, _flags, _function, \ _param) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_INT; \ menuitems_i18n[no_menuitems_i18n].flags = _flags; \ menuitems_i18n[no_menuitems_i18n].iparam = _param; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ ++no_menuitems_i18n; #define MENUINTRB_I(_menuname, _key, _name, _shortname, _flags, _function, \ _param, _checkbutton) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_INT; \ menuitems_i18n[no_menuitems_i18n].flags = (_flags) | MENUFLAG_RADIO; \ menuitems_i18n[no_menuitems_i18n].iparam = _param; \ menuitems_i18n[no_menuitems_i18n].pparam = NULL; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ menuitems_i18n[no_menuitems_i18n].control = (int (*)(void))_checkbutton; \ ++no_menuitems_i18n; #define SUBMENU_I(_menuname, _key, _name, _param) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _param; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_SUBMENU; \ menuitems_i18n[no_menuitems_i18n].flags = 0; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = NULL; \ menuitems_i18n[no_menuitems_i18n].function = NULL; \ ++no_menuitems_i18n; #define MENUDIALOG_I(_menuname, _key, _name, _shortname, _flags, _function, \ _param) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_DIALOG; \ menuitems_i18n[no_menuitems_i18n].flags = _flags; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = (const void *)_param; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ ++no_menuitems_i18n; #define MENUDIALOGCB_I(_menuname, _key, _name, _shortname, _flags, _function, \ _param, _check) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_DIALOG; \ menuitems_i18n[no_menuitems_i18n].flags = (_flags) | MENUFLAG_CHECKBOX; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = (const void *)_param; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ menuitems_i18n[no_menuitems_i18n].control = (int (*)(void))_check; \ ++no_menuitems_i18n; #define MENUCDIALOG_I(_menuname, _key, _name, _shortname, _flags, _function, \ _param) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_CUSTOMDIALOG; \ menuitems_i18n[no_menuitems_i18n].flags = _flags; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = NULL; \ menuitems_i18n[no_menuitems_i18n].control = NULL; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ menuitems_i18n[no_menuitems_i18n].dialog = \ (const menudialog *(*)(struct uih_context *))_param; \ ++no_menuitems_i18n; #define MENUCDIALOGCB_I(_menuname, _key, _name, _shortname, _flags, _function, \ _param, _check) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_CUSTOMDIALOG; \ menuitems_i18n[no_menuitems_i18n].flags = (_flags) | MENUFLAG_CHECKBOX; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = (const void *)_param; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ menuitems_i18n[no_menuitems_i18n].control = (int (*)(void))_check; \ menuitems_i18n[no_menuitems_i18n].dialog = \ (const menudialog *(*)(struct uih_context *))_param; \ ++no_menuitems_i18n; #define MENUSEPARATOR_I(_menuname) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = NULL; \ menuitems_i18n[no_menuitems_i18n].key = 0; \ menuitems_i18n[no_menuitems_i18n].type = MENU_SEPARATOR; \ menuitems_i18n[no_menuitems_i18n].flags = 0; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = ""; \ menuitems_i18n[no_menuitems_i18n].pparam = NULL; \ menuitems_i18n[no_menuitems_i18n].function = NULL; \ ++no_menuitems_i18n; #define SUBMENUNOOPT_I(_menuname, _key, _name, _param) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _param; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_SUBMENU; \ menuitems_i18n[no_menuitems_i18n].flags = MENUFLAG_NOOPTION; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = NULL; \ menuitems_i18n[no_menuitems_i18n].function = NULL; \ ++no_menuitems_i18n; #define MENUSTRING_I(_menuname, _key, _name, _shortname, _flags, _function, \ _param) \ menuitems_i18n[no_menuitems_i18n].menuname = _menuname; \ menuitems_i18n[no_menuitems_i18n].shortname = _shortname; \ menuitems_i18n[no_menuitems_i18n].key = _key; \ menuitems_i18n[no_menuitems_i18n].type = MENU_STRING; \ menuitems_i18n[no_menuitems_i18n].flags = _flags; \ menuitems_i18n[no_menuitems_i18n].iparam = 0; \ menuitems_i18n[no_menuitems_i18n].name = _name; \ menuitems_i18n[no_menuitems_i18n].pparam = (const void *)_param; \ menuitems_i18n[no_menuitems_i18n].function = (void (*)(void))_function; \ ++no_menuitems_i18n; /* End of i18n definitions. */ #define MENUFLAG_CHECKBOX 1 #define MENUFLAG_RADIO 2 #define MENUFLAG_INTERRUPT 4 #define MENUFLAG_INCALC 8 #define MENUFLAG_NOMENU 16 #define MENUFLAG_NOOPTION 32 #define MENUFLAG_NOPLAY 64 #define MENUFLAG_ATSTARTUP 128 #define MENUFLAG_DIALOGATDISABLE 256 #define NITEMS(n) (sizeof(n) / sizeof(menuitem)) #define menu_getdialog(context, m) \ ((m)->type == MENU_DIALOG ? (const menudialog *)(m)->pparam \ : (m)->dialog(context)) void menu_add(const menuitem *item, int n); void menu_insert(const menuitem *item, const char *before, int n); const menuitem *menu_findkey(const char *key, const char *root); const menuitem *menu_findcommand(const char *name); const char *menu_fullname(const char *menu); const menuitem *menu_item(const char *menu, int n); void menu_delete(const menuitem *items, int n); int menu_enabled(const menuitem *item, struct uih_context *c); void menu_activate(const menuitem *item, struct uih_context *c, dialogparam *d); const menuitem * menu_genernumbered(int n, const char *menuname, const char *const *const names, const char *keys, int type, int flags, void (*fint)(struct uih_context *context, int), int (*cint)(struct uih_context *context, int), const char *prefix); void menu_delnumbered(int n, const char *name); void menu_addqueue(const menuitem *item, dialogparam *d); const menuitem *menu_delqueue(dialogparam **d); void menu_destroydialog(const menuitem *item, dialogparam *d, struct uih_context *uih); int menu_havedialog(const menuitem *item, struct uih_context *c); int menu_available(const menuitem *item, const char *root); const char *menu_processcommand(struct uih_context *uih, tokenfunc f, int scheme, int mask, const char *root); void menu_printhelp(void); number_t menu_getfloat(const char *s, const char **error); const char *menu_fillparam(struct uih_context *uih, tokenfunc f, const menudialog *d, dialogparam *p); int menu_processargs(int n, int argc, char **argv); void menu_forall(struct uih_context *c, void (*callback)(struct uih_context *c, const menuitem *item)); #endif XaoS-release-4.3.2/src/include/xthread.h000066400000000000000000000115151455214672000200430ustar00rootroot00000000000000/* * An XaoS thread API implementation * Many functions are implemented as macros that maps simple * XaoS thread API into architecture depended API. * I tried avoid functions because of speed issues * So this header will be quite messy soon :) * * Supported API for now: * pthread (POSIX) enabled using USE_PTHREAD * nothread (my own) enabled by default */ #ifndef THREAD_H #define THREAD_H 1 #include "config.h" #define MAXTHREADS 32 /*You might increase this constant if needed (xaos on connection machine? :) */ #define NSEMAPHORS 2 #define MAXSEMAPHORS 2 #define NSLEEPS 2 #define MAXCONDS 2 #ifdef USE_PTHREAD #include #endif struct taskinfo { int n; #ifdef USE_PTHREAD pthread_t id; #endif }; extern struct taskinfo definfo; extern int ethreads; /*Is threading enabled? */ extern int nthreads; /*Number of threads */ typedef void (*xfunction)(void *, struct taskinfo *, int, int); /*No-thread API implementation version */ #define nothread \ { \ } #define nothread_init(nthreads) nothread #define nothread_uninit() nothread #define nothread_function(f, data, range) f(data, &definfo, 0, range) #define nothread_bgjob(f, d) f(d, &definfo, 0, 0) #define nothread_lock(n) nothread #define nothread_unlock(n) nothread #define nothread_sync() nothread #define nothread_sleep(n, l) nothread #define nothread_wakeup(n) nothread #define nothread_wakefirst(n) nothread #define xth_wrap(f1, f2) \ if (nthreads != 1) \ f1(); \ else \ f2(); #ifdef USE_PTHREAD /* A posix thread API maps */ void pth_init(int nthreads); void pth_uninit(void); void pth_function(xfunction f, void *d, int r); void pth_synchronize(void); void pth_bgjob(xfunction f, void *d); extern pthread_mutex_t semaphors[MAXSEMAPHORS]; extern pthread_cond_t conds[MAXCONDS]; /*Map pthread API to XaoS thread API */ #define xth_init(nthreads) pth_init(nthreads) #define xth_uninit() pth_uninit() #define xth_lock(n) \ if (ethreads) \ pthread_mutex_lock(semaphors + (n)) #define xth_unlock(n) \ if (ethreads) \ pthread_mutex_unlock(semaphors + (n)) #define xth_function(f, d, r) \ if (ethreads) \ pth_function(f, d, r); \ else \ nothread_function(f, d, r) #define xth_nthread(ts) (ethreads ? ts->n : 0) #define xth_sync() \ if (ethreads) \ pth_synchronize(); #define xth_bgjob(f, d) \ if (ethreads) \ pth_bgjob(f, d); \ else \ f(d, &definfo, 0, 0); #define xth_sleep(n, l) \ if (ethreads) \ pthread_cond_wait(conds + (n), semaphors + (l)) #define xth_wakeup(n) \ if (ethreads) \ pthread_cond_broadcast(conds + (n)) #define xth_wakefirst(n) \ if (ethreads) \ pthread_cond_signal(conds + (n)) #define API_MAPPED #endif /*USE_PTHREAD */ #ifndef API_MAPPED /* * No thread support is compiled - do just wrappers * to nothread implementation */ #define nthreads 1 #define ethreads 0 #define xth_init(n) nothread_init(n) #define xth_uninit() nothread_uninit() #define xth_function(f, d, r) nothread_function(f, d, r) #define xth_lock(n) nothread_lock(n) #define xth_unlock(n) nothread_unlock(n) #define xth_sync() nothread_sync() #define xth_bgjob(f, d) nothread_bgjob(f, d) #define xth_nthread(ts) 0 #define xth_wakeup(n) nothreads_wakeup(n) #define xth_wakefirst(n) nothreads_wakefirst(n) #define xth_sleep(n, l) nothreads_sleep(n, l) #endif #endif XaoS-release-4.3.2/src/include/zoom.h000066400000000000000000000023161455214672000173670ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef ZOOM_H #define ZOOM_H #define LOWQUALITY (1 << 30) #define ZOOMMASK (LOWQUALITY | INCOMPLETE) extern const struct filteraction zoom_filter; extern struct filter cfilter; extern const struct filteraction subwindow_filter; void subwindow_setsecond(struct filter *f, struct filter *f1); #endif /* ZOOM_H */ XaoS-release-4.3.2/src/sffe/000077500000000000000000000000001455214672000155305ustar00rootroot00000000000000XaoS-release-4.3.2/src/sffe/About000066400000000000000000000002671455214672000165320ustar00rootroot00000000000000SFFE ( Segfautlabs Formula Evaluator ) sffe is very fast complex math formula evaluator written in C. you can read more about sffe lib at http://www.segfaultlabs.com/projects/sffe XaoS-release-4.3.2/src/sffe/gsl_complex_math.c000066400000000000000000000514211455214672000212240ustar00rootroot00000000000000/* complex/math.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Jorma Olavi T�htinen, Brian * Gough * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ /* Basic complex arithmetic functions * Original version by Jorma Olavi T�htinen * * Modified for GSL by Brian Gough, 3/2000 */ /* The following references describe the methods used in these * functions, * * T. E. Hull and Thomas F. Fairgrieve and Ping Tak Peter Tang, * "Implementing Complex Elementary Functions Using Exception * Handling", ACM Transactions on Mathematical Software, Volume 20 * (1994), pp 215-244, Corrigenda, p553 * * Hull et al, "Implementing the complex arcsin and arccosine * functions using exception handling", ACM Transactions on * Mathematical Software, Volume 23 (1997) pp 299-335 * * Abramowitz and Stegun, Handbook of Mathematical Functions, "Inverse * Circular Functions in Terms of Real and Imaginary Parts", Formulas * 4.4.37, 4.4.38, 4.4.39 */ #include "config.h" #include #include #include #include /********************************************************************** * Complex numbers **********************************************************************/ gsl_complex gsl_complex_polar(double r, double theta) { /* return z = r exp(i theta) */ gsl_complex z; GSL_SET_COMPLEX(&z, r * cos(theta), r * sin(theta)); return z; } /********************************************************************** * Properties of complex numbers **********************************************************************/ double gsl_complex_arg(gsl_complex z) { /* return arg(z), -pi < arg(z) <= +pi */ double x = GSL_REAL(z); double y = GSL_IMAG(z); if (x == 0.0 && y == 0.0) { return 0; } return atan2(y, x); } double gsl_complex_abs(gsl_complex z) { /* return |z| */ return hypot(GSL_REAL(z), GSL_IMAG(z)); } double gsl_complex_abs2(gsl_complex z) { /* return |z|^2 */ double x = GSL_REAL(z); double y = GSL_IMAG(z); return (x * x + y * y); } double gsl_complex_logabs(gsl_complex z) { /* return log|z| */ double xabs = fabs(GSL_REAL(z)); double yabs = fabs(GSL_IMAG(z)); double max, u; if (xabs >= yabs) { max = xabs; u = yabs / xabs; } else { max = yabs; u = xabs / yabs; } /* Handle underflow when u is close to 0 */ return log(max) + 0.5 * log1p(u * u); } /*********************************************************************** * Complex arithmetic operators ***********************************************************************/ gsl_complex gsl_complex_add(gsl_complex a, gsl_complex b) { /* z=a+b */ double ar = GSL_REAL(a), ai = GSL_IMAG(a); double br = GSL_REAL(b), bi = GSL_IMAG(b); gsl_complex z; GSL_SET_COMPLEX(&z, ar + br, ai + bi); return z; } gsl_complex gsl_complex_add_real(gsl_complex a, double x) { /* z=a+x */ gsl_complex z; GSL_SET_COMPLEX(&z, GSL_REAL(a) + x, GSL_IMAG(a)); return z; } gsl_complex gsl_complex_add_imag(gsl_complex a, double y) { /* z=a+iy */ gsl_complex z; GSL_SET_COMPLEX(&z, GSL_REAL(a), GSL_IMAG(a) + y); return z; } gsl_complex gsl_complex_sub(gsl_complex a, gsl_complex b) { /* z=a-b */ double ar = GSL_REAL(a), ai = GSL_IMAG(a); double br = GSL_REAL(b), bi = GSL_IMAG(b); gsl_complex z; GSL_SET_COMPLEX(&z, ar - br, ai - bi); return z; } gsl_complex gsl_complex_sub_real(gsl_complex a, double x) { /* z=a-x */ gsl_complex z; GSL_SET_COMPLEX(&z, GSL_REAL(a) - x, GSL_IMAG(a)); return z; } gsl_complex gsl_complex_sub_imag(gsl_complex a, double y) { /* z=a-iy */ gsl_complex z; GSL_SET_COMPLEX(&z, GSL_REAL(a), GSL_IMAG(a) - y); return z; } gsl_complex gsl_complex_mul(gsl_complex a, gsl_complex b) { /* z=a*b */ double ar = GSL_REAL(a), ai = GSL_IMAG(a); double br = GSL_REAL(b), bi = GSL_IMAG(b); gsl_complex z; GSL_SET_COMPLEX(&z, ar * br - ai * bi, ar * bi + ai * br); return z; } gsl_complex gsl_complex_mul_real(gsl_complex a, double x) { /* z=a*x */ gsl_complex z; GSL_SET_COMPLEX(&z, x * GSL_REAL(a), x * GSL_IMAG(a)); return z; } gsl_complex gsl_complex_mul_imag(gsl_complex a, double y) { /* z=a*iy */ gsl_complex z; GSL_SET_COMPLEX(&z, -y * GSL_IMAG(a), y * GSL_REAL(a)); return z; } gsl_complex gsl_complex_div(gsl_complex a, gsl_complex b) { /* z=a/b */ double ar = GSL_REAL(a), ai = GSL_IMAG(a); double br = GSL_REAL(b), bi = GSL_IMAG(b); double s = 1.0 / gsl_complex_abs(b); double sbr = s * br; double sbi = s * bi; double zr = (ar * sbr + ai * sbi) * s; double zi = (ai * sbr - ar * sbi) * s; gsl_complex z; GSL_SET_COMPLEX(&z, zr, zi); return z; } gsl_complex gsl_complex_div_real(gsl_complex a, double x) { /* z=a/x */ gsl_complex z; GSL_SET_COMPLEX(&z, GSL_REAL(a) / x, GSL_IMAG(a) / x); return z; } gsl_complex gsl_complex_div_imag(gsl_complex a, double y) { /* z=a/(iy) */ gsl_complex z; GSL_SET_COMPLEX(&z, GSL_IMAG(a) / y, -GSL_REAL(a) / y); return z; } gsl_complex gsl_complex_conjugate(gsl_complex a) { /* z=conj(a) */ gsl_complex z; GSL_SET_COMPLEX(&z, GSL_REAL(a), -GSL_IMAG(a)); return z; } gsl_complex gsl_complex_negative(gsl_complex a) { /* z=-a */ gsl_complex z; GSL_SET_COMPLEX(&z, -GSL_REAL(a), -GSL_IMAG(a)); return z; } gsl_complex gsl_complex_inverse(gsl_complex a) { /* z=1/a */ double s = 1.0 / gsl_complex_abs(a); gsl_complex z; GSL_SET_COMPLEX(&z, (GSL_REAL(a) * s) * s, -(GSL_IMAG(a) * s) * s); return z; } /********************************************************************** * Elementary complex functions **********************************************************************/ gsl_complex gsl_complex_sqrt(gsl_complex a) { /* z=sqrt(a) */ gsl_complex z; if (GSL_REAL(a) == 0.0 && GSL_IMAG(a) == 0.0) { GSL_SET_COMPLEX(&z, 0, 0); } else { double x = fabs(GSL_REAL(a)); double y = fabs(GSL_IMAG(a)); double w; if (x >= y) { double t = y / x; w = sqrt(x) * sqrt(0.5 * (1.0 + sqrt(1.0 + t * t))); } else { double t = x / y; w = sqrt(y) * sqrt(0.5 * (t + sqrt(1.0 + t * t))); } if (GSL_REAL(a) >= 0.0) { double ai = GSL_IMAG(a); GSL_SET_COMPLEX(&z, w, ai / (2.0 * w)); } else { double ai = GSL_IMAG(a); double vi = (ai >= 0) ? w : -w; GSL_SET_COMPLEX(&z, ai / (2.0 * vi), vi); } } return z; } gsl_complex gsl_complex_sqrt_real(double x) { /* z=sqrt(x) */ gsl_complex z; if (x >= 0) { GSL_SET_COMPLEX(&z, sqrt(x), 0.0); } else { GSL_SET_COMPLEX(&z, 0.0, sqrt(-x)); } return z; } gsl_complex gsl_complex_exp(gsl_complex a) { /* z=exp(a) */ double rho = exp(GSL_REAL(a)); double theta = GSL_IMAG(a); gsl_complex z; GSL_SET_COMPLEX(&z, rho * cos(theta), rho * sin(theta)); return z; } gsl_complex gsl_complex_pow(gsl_complex a, gsl_complex b) { /* z=a^b */ gsl_complex z; if (GSL_REAL(a) == 0 && GSL_IMAG(a) == 0.0) { if (GSL_REAL(b) == 0 && GSL_IMAG(b) == 0.0) { GSL_SET_COMPLEX(&z, 1.0, 0.0); } else { GSL_SET_COMPLEX(&z, 0.0, 0.0); } } else if (GSL_REAL(b) == 1.0 && GSL_IMAG(b) == 0.0) { return a; } else if (GSL_REAL(b) == -1.0 && GSL_IMAG(b) == 0.0) { return gsl_complex_inverse(a); } else { double logr = gsl_complex_logabs(a); double theta = gsl_complex_arg(a); double br = GSL_REAL(b), bi = GSL_IMAG(b); double rho = exp(logr * br - bi * theta); double beta = theta * br + bi * logr; GSL_SET_COMPLEX(&z, rho * cos(beta), rho * sin(beta)); } return z; } gsl_complex gsl_complex_pow_real(gsl_complex a, double b) { /* z=a^b */ gsl_complex z; if (GSL_REAL(a) == 0 && GSL_IMAG(a) == 0) { if (b == 0) { GSL_SET_COMPLEX(&z, 1, 0); } else { GSL_SET_COMPLEX(&z, 0, 0); } } else { double logr = gsl_complex_logabs(a); double theta = gsl_complex_arg(a); double rho = exp(logr * b); double beta = theta * b; GSL_SET_COMPLEX(&z, rho * cos(beta), rho * sin(beta)); } return z; } gsl_complex gsl_complex_log(gsl_complex a) { /* z=log(a) */ double logr = gsl_complex_logabs(a); double theta = gsl_complex_arg(a); gsl_complex z; GSL_SET_COMPLEX(&z, logr, theta); return z; } gsl_complex gsl_complex_log10(gsl_complex a) { /* z = log10(a) */ return gsl_complex_mul_real(gsl_complex_log(a), 1 / log(10.)); } gsl_complex gsl_complex_log_b(gsl_complex a, gsl_complex b) { return gsl_complex_div(gsl_complex_log(a), gsl_complex_log(b)); } /*********************************************************************** * Complex trigonometric functions ***********************************************************************/ gsl_complex gsl_complex_sin(gsl_complex a) { /* z = sin(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; if (I == 0.0) { /* avoid returning negative zero (-0.0) for the imaginary part */ GSL_SET_COMPLEX(&z, sin(R), 0.0); } else { GSL_SET_COMPLEX(&z, sin(R) * cosh(I), cos(R) * sinh(I)); } return z; } gsl_complex gsl_complex_cos(gsl_complex a) { /* z = cos(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; if (I == 0.0) { /* avoid returning negative zero (-0.0) for the imaginary part */ GSL_SET_COMPLEX(&z, cos(R), 0.0); } else { GSL_SET_COMPLEX(&z, cos(R) * cosh(I), sin(R) * sinh(-I)); } return z; } gsl_complex gsl_complex_tan(gsl_complex a) { /* z = tan(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; if (fabs(I) < 1) { double D = pow(cos(R), 2.0) + pow(sinh(I), 2.0); GSL_SET_COMPLEX(&z, 0.5 * sin(2 * R) / D, 0.5 * sinh(2 * I) / D); } else { double D = pow(cos(R), 2.0) + pow(sinh(I), 2.0); double F = 1 + pow(cos(R) / sinh(I), 2.0); GSL_SET_COMPLEX(&z, 0.5 * sin(2 * R) / D, 1 / (tanh(I) * F)); } return z; } gsl_complex gsl_complex_sec(gsl_complex a) { /* z = sec(a) */ gsl_complex z = gsl_complex_cos(a); return gsl_complex_inverse(z); } gsl_complex gsl_complex_csc(gsl_complex a) { /* z = csc(a) */ gsl_complex z = gsl_complex_sin(a); return gsl_complex_inverse(z); } gsl_complex gsl_complex_cot(gsl_complex a) { /* z = cot(a) */ gsl_complex z = gsl_complex_tan(a); return gsl_complex_inverse(z); } /********************************************************************** * Inverse Complex Trigonometric Functions **********************************************************************/ gsl_complex gsl_complex_arcsin(gsl_complex a) { /* z = arcsin(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; if (I == 0) { z = gsl_complex_arcsin_real(R); } else { double x = fabs(R), y = fabs(I); double r = hypot(x + 1, y), s = hypot(x - 1, y); double A = 0.5 * (r + s); double B = x / A; double y2 = y * y; double real, imag; const double A_crossover = 1.5, B_crossover = 0.6417; if (B <= B_crossover) { real = asin(B); } else { if (x <= 1) { double D = 0.5 * (A + x) * (y2 / (r + x + 1) + (s + (1 - x))); real = atan(x / sqrt(D)); } else { double Apx = A + x; double D = 0.5 * (Apx / (r + x + 1) + Apx / (s + (x - 1))); real = atan(x / (y * sqrt(D))); } } if (A <= A_crossover) { double Am1; if (x < 1) { Am1 = 0.5 * (y2 / (r + (x + 1)) + y2 / (s + (1 - x))); } else { Am1 = 0.5 * (y2 / (r + (x + 1)) + (s + (x - 1))); } imag = log1p(Am1 + sqrt(Am1 * (A + 1))); } else { imag = log(A + sqrt(A * A - 1)); } GSL_SET_COMPLEX(&z, (R >= 0) ? real : -real, (I >= 0) ? imag : -imag); } return z; } gsl_complex gsl_complex_arcsin_real(double a) { /* z = arcsin(a) */ gsl_complex z; if (fabs(a) <= 1.0) { GSL_SET_COMPLEX(&z, asin(a), 0.0); } else { if (a < 0.0) { GSL_SET_COMPLEX(&z, -M_PI_2, acosh(-a)); } else { GSL_SET_COMPLEX(&z, M_PI_2, -acosh(a)); } } return z; } gsl_complex gsl_complex_arccos(gsl_complex a) { /* z = arccos(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; if (I == 0) { z = gsl_complex_arccos_real(R); } else { double x = fabs(R), y = fabs(I); double r = hypot(x + 1, y), s = hypot(x - 1, y); double A = 0.5 * (r + s); double B = x / A; double y2 = y * y; double real, imag; const double A_crossover = 1.5, B_crossover = 0.6417; if (B <= B_crossover) { real = acos(B); } else { if (x <= 1) { double D = 0.5 * (A + x) * (y2 / (r + x + 1) + (s + (1 - x))); real = atan(sqrt(D) / x); } else { double Apx = A + x; double D = 0.5 * (Apx / (r + x + 1) + Apx / (s + (x - 1))); real = atan((y * sqrt(D)) / x); } } if (A <= A_crossover) { double Am1; if (x < 1) { Am1 = 0.5 * (y2 / (r + (x + 1)) + y2 / (s + (1 - x))); } else { Am1 = 0.5 * (y2 / (r + (x + 1)) + (s + (x - 1))); } imag = log1p(Am1 + sqrt(Am1 * (A + 1))); } else { imag = log(A + sqrt(A * A - 1)); } GSL_SET_COMPLEX(&z, (R >= 0) ? real : M_PI - real, (I >= 0) ? -imag : imag); } return z; } gsl_complex gsl_complex_arccos_real(double a) { /* z = arccos(a) */ gsl_complex z; if (fabs(a) <= 1.0) { GSL_SET_COMPLEX(&z, acos(a), 0); } else { if (a < 0.0) { GSL_SET_COMPLEX(&z, M_PI, -acosh(-a)); } else { GSL_SET_COMPLEX(&z, 0, acosh(a)); } } return z; } gsl_complex gsl_complex_arctan(gsl_complex a) { /* z = arctan(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; if (I == 0) { GSL_SET_COMPLEX(&z, atan(R), 0); } else { /* FIXME: This is a naive implementation which does not fully take into account cancellation errors, overflow, underflow etc. It would benefit from the Hull et al treatment. */ double r = hypot(R, I); double imag; double u = 2 * I / (1 + r * r); /* FIXME: the following cross-over should be optimized but 0.1 seems to work ok */ if (fabs(u) < 0.1) { imag = 0.25 * (log1p(u) - log1p(-u)); } else { double A = hypot(R, I + 1); double B = hypot(R, I - 1); imag = 0.5 * log(A / B); } if (R == 0) { if (I > 1) { GSL_SET_COMPLEX(&z, M_PI_2, imag); } else if (I < -1) { GSL_SET_COMPLEX(&z, -M_PI_2, imag); } else { GSL_SET_COMPLEX(&z, 0, imag); }; } else { GSL_SET_COMPLEX(&z, 0.5 * atan2(2 * R, ((1 + r) * (1 - r))), imag); } } return z; } gsl_complex gsl_complex_arcsec(gsl_complex a) { /* z = arcsec(a) */ gsl_complex z = gsl_complex_inverse(a); return gsl_complex_arccos(z); } gsl_complex gsl_complex_arcsec_real(double a) { /* z = arcsec(a) */ gsl_complex z; if (a <= -1.0 || a >= 1.0) { GSL_SET_COMPLEX(&z, acos(1 / a), 0.0); } else { if (a >= 0.0) { GSL_SET_COMPLEX(&z, 0, acosh(1 / a)); } else { GSL_SET_COMPLEX(&z, M_PI, -acosh(-1 / a)); } } return z; } gsl_complex gsl_complex_arccsc(gsl_complex a) { /* z = arccsc(a) */ gsl_complex z = gsl_complex_inverse(a); return gsl_complex_arcsin(z); } gsl_complex gsl_complex_arccsc_real(double a) { /* z = arccsc(a) */ gsl_complex z; if (a <= -1.0 || a >= 1.0) { GSL_SET_COMPLEX(&z, asin(1 / a), 0.0); } else { if (a >= 0.0) { GSL_SET_COMPLEX(&z, M_PI_2, -acosh(1 / a)); } else { GSL_SET_COMPLEX(&z, -M_PI_2, acosh(-1 / a)); } } return z; } gsl_complex gsl_complex_arccot(gsl_complex a) { /* z = arccot(a) */ gsl_complex z; if (GSL_REAL(a) == 0.0 && GSL_IMAG(a) == 0.0) { GSL_SET_COMPLEX(&z, M_PI_2, 0); } else { z = gsl_complex_inverse(a); z = gsl_complex_arctan(z); } return z; } /********************************************************************** * Complex Hyperbolic Functions **********************************************************************/ gsl_complex gsl_complex_sinh(gsl_complex a) { /* z = sinh(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; GSL_SET_COMPLEX(&z, sinh(R) * cos(I), cosh(R) * sin(I)); return z; } gsl_complex gsl_complex_cosh(gsl_complex a) { /* z = cosh(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; GSL_SET_COMPLEX(&z, cosh(R) * cos(I), sinh(R) * sin(I)); return z; } gsl_complex gsl_complex_tanh(gsl_complex a) { /* z = tanh(a) */ double R = GSL_REAL(a), I = GSL_IMAG(a); gsl_complex z; if (fabs(R) < 1.0) { double D = pow(cos(I), 2.0) + pow(sinh(R), 2.0); GSL_SET_COMPLEX(&z, sinh(R) * cosh(R) / D, 0.5 * sin(2 * I) / D); } else { double D = pow(cos(I), 2.0) + pow(sinh(R), 2.0); double F = 1 + pow(cos(I) / sinh(R), 2.0); GSL_SET_COMPLEX(&z, 1.0 / (tanh(R) * F), 0.5 * sin(2 * I) / D); } return z; } gsl_complex gsl_complex_sech(gsl_complex a) { /* z = sech(a) */ gsl_complex z = gsl_complex_cosh(a); return gsl_complex_inverse(z); } gsl_complex gsl_complex_csch(gsl_complex a) { /* z = csch(a) */ gsl_complex z = gsl_complex_sinh(a); return gsl_complex_inverse(z); } gsl_complex gsl_complex_coth(gsl_complex a) { /* z = coth(a) */ gsl_complex z = gsl_complex_tanh(a); return gsl_complex_inverse(z); } /********************************************************************** * Inverse Complex Hyperbolic Functions **********************************************************************/ gsl_complex gsl_complex_arcsinh(gsl_complex a) { /* z = arcsinh(a) */ gsl_complex z = gsl_complex_mul_imag(a, 1.0); z = gsl_complex_arcsin(z); z = gsl_complex_mul_imag(z, -1.0); return z; } gsl_complex gsl_complex_arccosh(gsl_complex a) { /* z = arccosh(a) */ gsl_complex z = gsl_complex_arccos(a); z = gsl_complex_mul_imag(z, GSL_IMAG(z) > 0 ? -1.0 : 1.0); return z; } gsl_complex gsl_complex_arccosh_real(double a) { /* z = arccosh(a) */ gsl_complex z; if (a >= 1) { GSL_SET_COMPLEX(&z, acosh(a), 0); } else { if (a >= -1.0) { GSL_SET_COMPLEX(&z, 0, acos(a)); } else { GSL_SET_COMPLEX(&z, acosh(-a), M_PI); } } return z; } gsl_complex gsl_complex_arctanh(gsl_complex a) { /* z = arctanh(a) */ if (GSL_IMAG(a) == 0.0) { return gsl_complex_arctanh_real(GSL_REAL(a)); } else { gsl_complex z = gsl_complex_mul_imag(a, 1.0); z = gsl_complex_arctan(z); z = gsl_complex_mul_imag(z, -1.0); return z; } } gsl_complex gsl_complex_arctanh_real(double a) { /* z = arctanh(a) */ gsl_complex z; if (a > -1.0 && a < 1.0) { GSL_SET_COMPLEX(&z, atanh(a), 0); } else { GSL_SET_COMPLEX(&z, atanh(1 / a), (a < 0) ? M_PI_2 : -M_PI_2); } return z; } gsl_complex gsl_complex_arcsech(gsl_complex a) { /* z = arcsech(a); */ gsl_complex t = gsl_complex_inverse(a); return gsl_complex_arccosh(t); } gsl_complex gsl_complex_arccsch(gsl_complex a) { /* z = arccsch(a) */ gsl_complex t = gsl_complex_inverse(a); return gsl_complex_arcsinh(t); } gsl_complex gsl_complex_arccoth(gsl_complex a) { /* z = arccoth(a) */ gsl_complex t = gsl_complex_inverse(a); return gsl_complex_arctanh(t); } XaoS-release-4.3.2/src/sffe/sffe.cpp000066400000000000000000001065451455214672000171720ustar00rootroot00000000000000/*///////////////////////////////////////////////////////////////////////////////////// // project : sFFe ( SegFault (or Segmentation Fault :) ) formula evalutor ) // author : Mateusz Malczak ( mateusz@malczak.info ) // wpage : malczak.info /////////////////////////////////////////////////////////////////////////////////////*/ #include #include #include #include #include #ifdef DEBUG #define SFFE_DEVEL #endif #ifdef SFFE_DEVEL #include #endif #include "sffe.h" #include "misc-f.h" #include "i18n.h" #ifdef SFFE_CMPLX_ASM #include "sffe_cmplx_asm.h" #elif SFFE_CMPLX_GSL #include "sffe_cmplx_gsl.h" #elif SFFE_DOUBLE #include "sffe_real.h" #endif #ifdef SFFE_COMPLEX #define sfset(arg, val) \ (arg)->value = (sfNumber *)malloc(sizeof(sfNumber)); \ if ((arg)->value) { \ (arg)->type = sfvar_type_managed_ptr; \ cmplxset(*((arg)->value), (val), 0); \ } #else #define sfset(arg, val) \ (arg)->value = (sfNumber *)malloc(sizeof(sfNumber)); \ if ((arg)->value) { \ (arg)->type = sfvar_type_managed_ptr; \ *((arg)->value) = (val); \ } #endif /** utils */ void sffe_error_message(int errorcode, char *context, char *errormessage) { switch (errorcode) { case MemoryError: sprintf(errormessage, "%s", TR("Message", "Out of memory")); break; case UnbalancedBrackets: sprintf(errormessage, TR("Message", "Unbalanced parentheses"), context); break; case UnknownFunction: sprintf(errormessage, TR("Message", "Unknown function: %s"), context); break; case InvalidNumber: sprintf(errormessage, TR("Message", "Invalid number: %s"), context); break; case UnknownVariable: sprintf(errormessage, TR("Message", "Unknown variable: %s"), context); break; case InvalidOperators: sprintf(errormessage, TR("Message", "Invalid operator: %s"), context); break; case StackError: sprintf(errormessage, TR("Message", "Internal error occurred in formula: %s"), context); break; case InvalidParameters: sprintf(errormessage, TR("Message", "Function has incorrect parameter count: %s"), context); break; case EmptyFormula: sprintf(errormessage, TR("Message", "Empty formula"), context); break; } } void sffe_setup_error(sffe *parser, enum sffe_error errorcode, char *context) { /* try to store error message */ if (parser->errormsg) { sffe_error_message(errorcode, context, parser->errormsg); } } void sf_strdup(char **out, const char *in) { size_t name_len = strlen(in); char *dup = (char *)malloc(name_len + 1); if (dup) { for (size_t i = 0; i < name_len; i += 1) { dup[i] = (char)tolower((int)in[i]); } dup[name_len] = '\0'; } *out = dup; } unsigned char sf_priority(char *chr) { switch (*chr) { case 'f': return 0x60; case '^': return 0x40; case '/': case '*': return 0x20; case '+': case '-': return 0x00; default: return 0x80; } } /** debug functions */ #ifdef SFFE_DEVEL /* in debug mode report errors on stdout */ void sffe_print_error(enum sffe_error errorcode, char *context) { char errormessage[256]; sffe_error_message(errorcode, context, errormessage); printf("Parser error : %s", errormessage); } #endif /************************* custom functions */ /* all variables used in this section are defined depanding on complex number * implementation */ sffunction *sffe_function(char *fn, size_t len) { /* sffnctscount - defined in sffe_cmplx_* file */ for (unsigned char idx = 5; idx < sffnctscount; idx += 1) { if (!strncmp(fn, sfcmplxfunc[idx].name, len) && strlen(sfcmplxfunc[idx].name) == len) { return (sffunction *)(sfcmplxfunc + idx); } } return NULL; } sffunction *sffe_operator(char op) { switch (op) { case '^': return (sffunction *)sfcmplxfunc; case '+': return (sffunction *)sfcmplxfunc + 1; case '-': return (sffunction *)sfcmplxfunc + 2; case '*': return (sffunction *)sfcmplxfunc + 3; case '/': return (sffunction *)sfcmplxfunc + 4; default: break; } return NULL; } void *sffe_const(char *fn, size_t len, void *ptr) { for (unsigned char idx = 0; idx < sfvarscount; idx += 1) { if (!strncmp(fn, sfcnames[idx], len) && strlen(sfcnames[idx]) == len) { sfcvals[idx]((sfNumber *)ptr); return ptr; } } return NULL; } /************************* custom function */ sffe *sffe_alloc(void) { sffe *rp = (sffe *)malloc(sizeof(sffe)); if (!rp) { return NULL; } memset(rp, 0, sizeof(sffe)); return rp; } void sffe_clear(sffe **parser) { sffe *p = *parser; unsigned int i = 0; for (; i < p->argCount; i++) { if (p->args[i].type == sfvar_type_managed_ptr) { free(p->args[i].value); } } if (p->args) { free(p->args); } if (p->expression) { free((char *)p->expression); } if (p->oprs) { free(p->oprs); } p->expression = NULL; p->args = NULL; p->oprs = NULL; } void sffe_free(sffe **parser) { sffe *p = *parser; sffe_clear(parser); if (p->userf) { free(p->userf); } if (p->varCount) { unsigned int i = 0; for (; i < p->varCount; i++) { if (p->variables[i].type == sfvar_type_managed_ptr) { free(p->variables[i].value); } } free(p->variables); } free(*parser); parser = NULL; } // avg time: 0.250767773750267 // avg time: 0.252280894999276 sfNumber sffe_eval(sffe *const parser) { sfopr *optr = parser->oprs; sfopr *optro = optr; sfopr *optrl = optr + parser->oprCount; for (; optr != optrl; optr += 1, optro += 1) { optro->arg->parg = optro->arg - 1; sfarg *arg = optr->arg; #ifdef SFFE_DIRECT_FPTR arg->parg = optr->fnc(arg)->parg; #else arg->parg = optr->fnc->fptr(arg)->parg; #endif } return *(parser->result); } sfvariable *sffe_var(sffe *const parser, const char *name) { if (parser->varCount) { sfvariable *var = parser->variables; sfvariable *lvar = parser->variables + parser->varCount; while (var < lvar) { if (!strcasecmp(var->name, name)) { return var; } var += 1; } } return NULL; } sfvariable *sffe_regvar(sffe **parser, sfNumber *vptrs, const char *name) { sffe *parser_ = *parser; sfvariable *var = sffe_var(parser_, name); if (var) { return var; } int vars_cnt = parser_->varCount + 1; parser_->variables = (sfvariable *)realloc(parser_->variables, vars_cnt * sizeof(sfvariable)); if (!parser_->variables) { return NULL; } var = parser_->variables + parser_->varCount; if (vptrs == NULL) { vptrs = (sfNumber *)malloc(sizeof(sfNumber)); memset(vptrs, 0, sizeof(sfNumber)); var->type = sfvar_type_managed_ptr; } else { var->type = sfvar_type_ptr; } var->value = vptrs; sf_strdup(&var->name, name); parser_->varCount += 1; return var; } void sffe_regvars(sffe **parser, unsigned int cN, sfNumber **vptrs, char *const *names) { while (cN > 0) { cN -= 1; sffe_regvar(parser, (vptrs ? vptrs[cN] : NULL), names[cN]); } } sfNumber *sffe_setvar(sffe **parser, sfNumber vptrs, const char *name) { sfNumber *value; sffe *parser_ = *parser; sfvariable *var = sffe_var(parser_, name); if (!var) { var = sffe_regvar(parser, NULL, name); } value = var->value; memcpy(value, &vptrs, sizeof(sfNumber)); return value; } void *sffe_regfunc(sffe **parser, const char *vname, unsigned int parcnt, sffptr funptr) { sffe *parser_ = *parser; sffunction *sff; unsigned short i; parser_->userf = (sffunction *)realloc( parser_->userf, (parser_->userfCount + 1) * sizeof(sffunction)); if (!parser_->userf) { return NULL; } sff = parser_->userf + parser_->userfCount; for (i = 0; i < strlen(vname); i++) sff->name[i] = tolower(vname[i]); sff->name[i] = 0; sff->parcnt = parcnt; sff->fptr = funptr; parser_->userfCount += 1; return (void *)sff; } sfNumber *sffe_variable(sffe *const p, char *fname, size_t len) { char fn[len + 1]; fn[len] = '\0'; memcpy(fn, fname, len); sfvariable *var = sffe_var(p, fn); if (var) { return var->value; } return NULL; } sffunction *userfunction(const sffe *const p, char *fname, size_t len) { unsigned char idx; for (idx = 0; idx < p->userfCount; idx += 1) { const char *name = p->userf[idx].name; if (strlen(name) == len && (!strncmp(fname, name, len))) { return (sffunction *)(p->userf + idx); } } return NULL; } #ifdef SFFE_COMPLEX /* parse complex number in format * { [-+]ddd[.dddd[e[+-]ddd]] ; [-+]ddd[.dddd[e[+-]ddd]] } */ char sffe_docmplx(char **str, sfarg **arg) { char *ch1; ch1 = *str; number_t re = xstrtonum(ch1, str); if (ch1 == *str) return 1; if (*(*str)++ != ',') return 2; ch1 = *str; number_t im = xstrtonum(ch1, str); if (ch1 == *str) return 1; if (*(*str)++ != '}') return 2; cmplxset(*(*arg)->value, re, im); return 0; } #endif char sffe_doname(char **str) { do { *str += 1; } while (isalnum(**str) || **str == '_'); if (**str == '(') { return 2; /* ( start of parameters */ } return 1; } int sffe_parse(sffe **parser, const char *expression) { /**************variables */ sffe *_parser; struct _operator { // @todo replace with stack/list #ifdef SFFE_DEVEL char c; /* used in debug build to store operator character */ #endif unsigned char type; /* store priority of the operator 'f' */ unsigned char args; /* number of parameters */ #ifdef SFFE_DIRECT_FPTR sffptr fnc; #else sffunction *fnc; #endif }; struct __expression { struct _operator *stck; /* operators on stack */ unsigned int size; /* number of items on stack */ struct __expression *prev; /* previous stack */ } * _tmp_exp, *_expression; sffunction **_functions; /* hold all functions used in expression in left - to - right order */ sffunction **_function; /* currently expected function from 'fnctbl' */ sfarg *_argument, *_arg_itr; char *tokens; /*tokenized form : (f(n)+f(n))*f(n)-n (f-func, n-num,const) */ char *ech; char *ch1, *ch2; unsigned int ui1; unsigned char token; enum sffe_error err; /**************used defines */ #define append_token(chr) \ tokens = (char *)realloc(tokens, ui1 + 2); \ tokens[ui1++] = chr; \ ch2 = tokens + ui1 - 1; \ token = chr; \ tokens[ui1] = '\0'; #define set_error(errno) \ { \ err = errno; \ break; \ } #define insert_fnc_slot() \ for (_arg_itr = _parser->args + _parser->argCount - 1; \ _arg_itr > _argument; _arg_itr -= 1) { \ *_arg_itr = *(_arg_itr - 1); \ } \ sfset(_arg_itr, -1.0); #define pop_expression() \ { \ _expression->size -= 1; \ insert_fnc_slot(); \ _parser->oprs[ui1].arg = (sfarg *)_argument; \ _parser->oprs[ui1].fnc = _expression->stck[_expression->size].fnc; \ ui1 += 1; \ _argument += 1; \ } #define max(a, b) ((a > b) ? a : b) #ifdef SFFE_DEVEL clock_t begin = clock(); printf("parse - BEGIN\n"); #endif /**************** code */ _functions = NULL; ech = (char *)expression; tokens = (char *)malloc(1); err = MemoryError; _parser = *parser; /* clear all internal structures */ if (_parser->expression) { sffe_clear(parser); } _parser->oprCount = 0; _parser->argCount = 0; ech = (char *)malloc(strlen(expression) + 1); sf_strdup(&ech, expression); _parser->expression = ech; #ifdef SFFE_DEVEL printf( "\n|-----------------------------------------\n+ > %s[%d] - parsing\n|-----------------------------------------\n", __FILE__, __LINE__); printf("| input (len.=%tu): |%s|\n", strlen(_parser->expression), _parser->expression); #endif /*! PHASE 1 !!!!!!!!! remove spaces, count brackets, change decimal * separators ',' to '.', remove multiple operators eg. ++--++1 -> 1, -+++2 * -> -2 */ ch1 = NULL; ui1 = 0; /*brackets */ ch2 = ech; /* skip leading spaces */ while (isspace(*ech)) { ech += 1; } /*handle brackets and change ';'->',', '['->'{', ']'->'}' */ while (*ech) { switch (*ech) { case '[': *ech = '{'; break; case '(': ui1 += 1; break; case ']': *ech = '}'; break; case ')': ui1 -= 1; break; case ';': *ech = ','; break; } *ch2 = (char)tolower((int)*ech); /*fix multiple arithm operators */ if (ch1 && strchr("+-/*^", (int)*ech) && strchr("+-/*^", (int)*ch1)) { if (*ch1 == '-' && *ech == '-') { *ch1 = '+'; } else if (*ch1 == '-' && *ech == '+') { *ch1 = '-'; } else if (*ch1 == '+' && *ech == '-') { *ch1 = '-'; } else if (*ch1 == *ech) { *ch1 = *ech; } else if (*ech == '-') { ch1 = ++ch2; } else if (*ch1 != *ech) { err = InvalidOperators; break; } } else { ch1 = ch2; ch2 += 1; } /*skip spaces */ do { ech += 1; } while (isspace(*ech)); } *ch2 = '\0'; _parser->expression = (char *)realloc((char *)_parser->expression, strlen(_parser->expression) + 1); if (ui1 && !err) { err = UnbalancedBrackets; } #ifdef SFFE_DEVEL printf("| check (len.=%tu): |%s|\n", strlen(_parser->expression), _parser->expression); #endif if (strlen(_parser->expression) == 0) err = EmptyFormula; /*! PHASE 2 !!!!!!!! tokenize expression, lexical analysis (need * optimizations) */ *tokens = '\0'; ch2 = NULL; ui1 = 0; ch1 = NULL; /*string starting position */ ech = (char *)_parser->expression; token = '('; /* in case of leading '-' */ while (*ech && !err) { ch1 = ech; if (isalpha(*ech)) { switch (sffe_doname(&ech)) { case 1: /* const or variable */ _parser->args = (sfarg *)realloc( _parser->args, (_parser->argCount + 1) * sizeof(sfarg)); if (!_parser->args) { set_error(MemoryError); } _argument = _parser->args + (_parser->argCount++); _argument->type = sfvar_type_ptr; _argument->value = (sfNumber *)sffe_variable( _parser, ch1, (size_t)(ech - ch1)); if (!_argument->value) { sfset(_argument, 10.0); //? temporary const value if (_argument->value) { if (!sffe_const(ch1, (size_t)(ech - ch1), _argument->value)) { *ech = 0; // terminate string after this symbol set_error(UnknownVariable); } } else { set_error(MemoryError); } } token = 'n'; break; case 2: /* function */ _functions = (sffunction **)realloc( _functions, (_parser->oprCount + 1) * sizeof(sffunction *)); if (!_functions) { set_error(MemoryError); } _function = _functions + (_parser->oprCount++); *_function = NULL; if (_parser->userfCount) { /*is it user defined function */ *_function = (sffunction *)(void *)userfunction( _parser, ch1, (size_t)(ech - ch1)); } if (!*_function) { /*if not, is it build in function */ *_function = (sffunction *)(void *)sffe_function( ch1, (size_t)(ech - ch1)); } /* if not -> ERROR */ if (!*_function) { *ech = 0; // terminate string after function name set_error(UnknownFunction); } token = 'f'; break; } /* is it a real number? */ } else if (isdigit(*ech) || (strchr("/*^(", (int)token) && strchr("+-", *ech))) { /* numbers (this part can be optimized) */ ch1 = ech; /* st = 1; */ number_t value = xstrtonum(ch1, &ech); if (ch1 == ech) { set_error(InvalidNumber); } /*epx */ _parser->args = (sfarg *)realloc( _parser->args, (++_parser->argCount) * sizeof(sfarg)); if (!_parser->args) { set_error(MemoryError); } _argument = _parser->args + _parser->argCount - 1; sfset(_argument, value); /*epx */ token = 'n'; } #ifdef SFFE_COMPLEX /* if not, it can be complex number */ else if (*ech == '{') { ech += 1; _parser->args = (sfarg *)realloc( _parser->args, (++_parser->argCount) * sizeof(sfarg)); if (!_parser->args) { set_error(MemoryError); } _argument = _parser->args + _parser->argCount - 1; sfset(_argument, 0); if (sffe_docmplx(&ech, &_argument)) { set_error(InvalidNumber); } token = 'n'; } #endif /* if not, we have operator */ else { if (*ech != '(' && *ech != ')' && *ech != ',') { sffunction *function = sffe_operator(*ech); if (function) { _functions = (sffunction **)realloc( _functions, (++_parser->oprCount) * sizeof(sffunction *)); if (!_functions) { set_error(MemoryError); } _functions[_parser->oprCount - 1] = function; } else { *(ech + 1) = 0; // terminate string after operator set_error(InvalidOperators); } } ch1 = ech; token = *ech; ech += 1; } /* no error and already has any opcodes - check for skipped * multiplication. Handle nf, n(, )(, )f, )n, fn */ if (!err && ui1 > 0) { if (token == 'f' || token == 'n' || token == '(') // last token { if (*ch2 == 'n' || *ch2 == ')') // last-1 token { sffunction *oprptr = sffe_operator('*'); _functions = (sffunction **)realloc( _functions, (++_parser->oprCount) * sizeof(sffunction *)); if (!_functions) { set_error(MemoryError); } /* if last token was function inject multiplication before * it */ if (token == 'f') { _functions[_parser->oprCount - 1] = _functions[_parser->oprCount - 2]; _functions[_parser->oprCount - 2] = (sffunction *)oprptr; } else { _functions[_parser->oprCount - 1] = (sffunction *)oprptr; } // inject multiplication unsigned char tmp = token; append_token('*'); token = tmp; } } } append_token(token); } ech = tokens; #ifdef SFFE_DEVEL printf( "| compiled expr.: |%s|\n| operations: %d\n| numbers,vars: %d\n| stack not.: ", tokens, _parser->oprCount, _parser->argCount); #endif /*! PRE PHASE 3 !!!!! no operations in expression = single numeric value */ if (!_parser->oprCount && _parser->argCount == 1) { _parser->oprs = (sfopr *)malloc(_parser->argCount * sizeof(sfopr)); _parser->oprs[0].arg = (sfarg *)_parser->args; _parser->oprs[0].fnc = NULL; _parser->result = (sfNumber *)_parser->args->value; } else /*! PHASE 3 !!!!! create sffe 'stack' notation ]:-> */ /* lots of memory operations are done here but no memory leaks should occur */ if (!err) { /* add value slots for uses operators/functions */ ui1 = _parser->argCount + _parser->oprCount; _parser->args = (sfarg *)realloc(_parser->args, ui1 * sizeof(sfarg)); memset(_parser->args + _parser->argCount, 0, _parser->oprCount * sizeof(sfarg)); _parser->argCount = ui1; _argument = _parser->args; _parser->oprs = (sfopr *)malloc(_parser->oprCount * sizeof(sfopr)); ch1 = NULL; /* number */ /* stacks ( stores operations and controls parameters count inside of * brackts blocks ) */ _expression = (struct __expression *)malloc(sizeof(struct __expression)); _expression->size = 0; /* 0-stack is empty, but ready to write (one slot allocated), >0-number of element on stack */ _expression->stck = (struct _operator *)malloc(sizeof(struct _operator)); _expression->prev = NULL; memset(_expression->stck, 0, sizeof(struct _operator)); ui1 = 0; /* used in defines */ _function = _functions; while (*ech && !err) { switch (*ech) { /* O */ case '+': case '-': case '*': case '/': case '^': { if (ch1) { #ifdef SFFE_DEVEL printf("%c", *ch1); #endif _argument += 1; } unsigned char type = sf_priority(ech); /* there is an operator on stack */ if (_expression->size) { /* remove all operators with higher, or equal priority */ while (type <= _expression->stck[_expression->size - 1].type) { pop_expression(); #ifdef SFFE_DEVEL printf("%c", _expression->stck[_expression->size].c); #endif if (_expression->size == 0) { break; } } _expression->stck = (struct _operator *)realloc( _expression->stck, (_expression->size + 1) * sizeof(struct _operator)); } sffunction *function = *_function; #ifdef SFFE_DEVEL struct _operator *opstck = &_expression->stck[_expression->size]; opstck->c = *ech; #endif /* store operator priority */ _expression->stck[_expression->size].type = type; /* get function pointer */ #ifdef SFFE_DIRECT_FPTR _expression->stck[_expression->size].fnc = function->fptr; #else _expression->stck[_expression->size].fnc = function; #endif _expression->size += 1; _function += 1; ch1 = NULL; } break; /* F */ case 'f': { _expression->stck = (struct _operator *)realloc( _expression->stck, (_expression->size + 1) * sizeof(struct _operator)); sffunction *function = *_function; struct _operator *opstck = &_expression->stck[_expression->size]; #ifdef SFFE_DEVEL opstck->c = 'f'; #endif unsigned char parcnt = function->parcnt & 0x1F; /* mark operator as a function, and store number of * available parameters (0 - unlimited) */ opstck->type = 0x60 | parcnt; opstck->args = parcnt; /* get function pointer */ #ifdef SFFE_DIRECT_FPTR _expression->stck[_expression->size].fnc = function->fptr; #else _expression->stck[_expression->size].fnc = function; #endif _expression->size += 1; _function += 1; ch1 = NULL; // consume () // if(!parcnt) // { // ech += 2; // } } break; // skip to ( ??? /* ( */ case '(': { /* store current stack */ _tmp_exp = (struct __expression *)malloc( sizeof(struct __expression)); _tmp_exp->prev = _expression; _expression = _tmp_exp; _expression->size = 0; _expression->stck = (struct _operator *)malloc(sizeof(struct _operator)); #ifdef SFFE_DEVEL _expression->stck[0].c = '_'; #endif token = 0; } break; /* ; */ case ',': { /* check if anything has been read !!! */ if (ch1) { #ifdef SFFE_DEVEL printf("%c", *ch1); #endif _argument += 1; ch1 = NULL; } /* if there is something on stack, flush if we need to read * next parameter */ while (_expression->size) { pop_expression(); #ifdef SFFE_DEVEL printf("%c", _expression->stck[_expression->size].c); #endif } struct __expression *pstack = _expression->prev; struct _operator *opstck = &pstack->stck[pstack->size - 1]; // here is last function before // opening new op stack /* wrong number of parameters */ if ((opstck->type & 0x1f) == 1) { set_error(InvalidParameters); } /* reduce a number of allowed parameters */ opstck->type = 0x60 | max(0, (opstck->type & 0x1f) - 1); } break; /* ) */ case ')': { if (ch1) { #ifdef SFFE_DEVEL printf("%c", *ch1); #endif _argument += 1; } ch1 = NULL; /* if there is something on stack, flush it we need to read * next parameter */ while (_expression->size) { pop_expression(); #ifdef SFFE_DEVEL printf("%c", _expression->stck[_expression->size].c); #endif } /* no stack available = stack overrelesed */ if (!_expression->prev) { set_error(StackError); } _tmp_exp = _expression; _expression = _tmp_exp->prev; /* destroy block stack */ free(_tmp_exp->stck); free(_tmp_exp); /* parser was reading function, at the top of current stack * is a function. identified by '*.t==3' */ if (_expression->size) { struct _operator *opstck = &_expression ->stck[_expression->size - 1]; // here is last function before // opening new op stack if ((opstck->type & 0xE0) == 0x60) { /* wrong number of parameters */ if ((opstck->type & 0x1f) > 1) { set_error(InvalidParameters); } if (!err) { pop_expression(); #ifdef SFFE_DEVEL printf("%c", _expression->stck[_expression->size].c); #endif if (_expression->size) { _expression->stck = (struct _operator *)realloc( _expression->stck, (_expression->size) * sizeof(struct _operator)); } } } } } break; /* n */ case 'n': ch1 = ech; break; } ech += 1; } if (!err) { if (ch1) { #ifdef SFFE_DEVEL printf("%c", *ch1); #endif _argument += 1; } /*clean up _expression */ while (_expression) { while (_expression->size) { pop_expression(); #ifdef SFFE_DEVEL printf("%c", _expression->stck[_expression->size].c); #endif } free(_expression->stck); _tmp_exp = _expression->prev; free(_expression); _expression = _tmp_exp; } /* set up formula call stack */ (_parser->args)->parg = NULL; for (ui1 = 1; ui1 < _parser->argCount; ui1 += 1) { (_parser->args + ui1)->parg = (_parser->args + ui1 - 1); } #ifdef SFFE_DEVEL printf("\n| numbers: "); for (ui1 = 0; ui1 < _parser->argCount; ui1 += 1) { if ((_parser->args + ui1)->value) { #ifdef SFFE_COMPLEX printf(" %g%+gI", real((*(_parser->args + ui1)->value)), imag((*(_parser->args + ui1)->value))); #else printf(" %g", (*(_parser->args + ui1)->value)); #endif } else { printf(" [_]"); } } printf("\n| functions fnctbl:"); for (ui1 = 0; ui1 < _parser->oprCount; ui1 += 1) { printf(" 0x%.6X [%s]", (int)(size_t)_functions[ui1]->fptr, _functions[ui1]->name); } printf("\n| functions used ptrs:"); for (ui1 = 0; ui1 < _parser->oprCount; ui1 += 1) { printf(" 0x%.6X", (int)(size_t)_parser->oprs[ui1].fnc); } double time_spent = (double)(clock() - begin) / CLOCKS_PER_SEC; printf("\n| compiled in %f s", time_spent); printf( "\n|-----------------------------------------\n+ < %s[%d] - parsing\n|-----------------------------------------\n", __FILE__, __LINE__); #endif } else { /* prevent memory leaks */ /* clean up stack */ while (_expression) { free(_expression->stck); _tmp_exp = _expression->prev; free(_expression); _expression = _tmp_exp; } } /* set up evaluation result pointer (result is stored in last operation * return) */ _parser->result = (sfNumber *)(_parser->oprs + _parser->oprCount - 1)->arg->value; if (!_parser->result) err = MemoryError; } if (err) { #ifdef SFFE_DEVEL sffe_print_error(err, ch1); #endif sffe_setup_error(_parser, err, ch1); sffe_clear(&_parser); } /*undefine defines */ #undef priority #undef sfpopstack #undef insertfnc #undef code #undef errset #undef max /* free lookup tables */ free(tokens); free(_functions); #ifdef SFFE_DEVEL printf("\nparse - END\n"); #endif return err; } #undef sfset #undef sfvar XaoS-release-4.3.2/src/sffe/sffe.pri000066400000000000000000000002011455214672000171600ustar00rootroot00000000000000DEFINES += USE_SFFE SFFE_CMPLX_GSL SOURCES += \ $$PWD/gsl_complex_math.c \ $$PWD/sffe.cpp \ $$PWD/sffe_cmplx_gsl.cpp XaoS-release-4.3.2/src/sffe/sffe_cmplx_gsl.cpp000066400000000000000000000171621455214672000212360ustar00rootroot00000000000000/*///////////////////////////////////////////////////////////////////////////////////// // project : sFFe ( SegFault (or Segmentation Fault :) ) formula evalutaor ) // author : Mateusz Malczak ( mateusz@malczak.info ) // wpage : www.segfaultlabs.com/projects/sffe /////////////////////////////////////////////////////////////////////////////////////// // special build for XaoS, for more info visit // http://www.segfaultlabs.com/projects/sfXaos /////////////////////////////////////////////////////////////////////////////////////*/ #ifdef SFFE_CMPLX_GSL #include "sffe.h" #include "sffe_cmplx_gsl.h" #include #include #include const sffunction sfcmplxfunc[sffnctscount] = { /* operators */ {sfpow, 2, "^\0"}, {sfadd, 2, "+\0"}, {sfsub, 2, "-\0"}, {sfmul, 2, "*\0"}, {sfdiv, 2, "/\0"}, /* functions */ {sfsin, 1, "sin\0"}, {sfcos, 1, "cos\0"}, {sftan, 1, "tan\0"}, {sfcot, 1, "cot\0"}, {sfasin, 1, "asin\0"}, {sfacos, 1, "acos\0"}, {sfatan, 1, "atan\0"}, {sfacot, 1, "acot\0"}, {sfatan2, 2, "atan2\0"}, {sfsinh, 1, "sinh\0"}, {sfcosh, 1, "cosh\0"}, {sftanh, 1, "tanh\0"}, {sfcoth, 1, "coth\0"}, {sfexp, 1, "exp\0"}, {sflog, 1, "log\0"}, {sflog10, 1, "log10\0"}, {sflog2, 1, "log2\0"}, {sflogN, 2, "logn\0"}, {sflogN, 2, "logcn\0"}, /*power functions */ {sfpow, 2, "pow\0"}, {sfpowd, 2, "powd\0"}, {sfpow, 2, "powi\0"}, {sfpow, 2, "powdc\0"}, {sfsqr, 1, "sqr\0"}, {sfsqrt, 1, "sqrt\0"}, {sfrtni, 3, "rtni"}, {sfinv, 1, "inv\n"}, {sfceil, 1, "ceil\0"}, {sffloor, 1, "floor\0"}, {sfabs, 1, "abs\0"}, {sfrabs, 1, "rabs\0"}, {sfre, 1, "re\0"}, {sfim, 1, "im\0"}, {NULL, 1, "rad\0"}, {NULL, 1, "deg\0"}, {NULL, 1, "sign\0"}, {NULL, 1, "trunc\0"}, {sfrand, 1, "rand\0"}}; const char sfcnames[sfvarscount][6] = {"pi\0", "pi_2\0", "pi2\0", "e\0", "i\0", "rnd\0"}; const cfptr sfcvals[sfvarscount] = {sfcPI, sfcPI2, sfc2PI, sfcE, sfcI, sfcRND}; sfarg *sfadd(sfarg *const p) { /* + */ sfvalue(p) = gsl_complex_add(sfvalue(sfaram2(p)), sfvalue(sfaram1(p))); return sfaram2(p); } sfarg *sfsub(sfarg *const p) { /* - */ sfvalue(p) = gsl_complex_sub(sfvalue(sfaram2(p)), sfvalue(sfaram1(p))); return sfaram2(p); } sfarg *sfmul(sfarg *const p) { /* * */ sfvalue(p) = gsl_complex_mul(sfvalue(sfaram2(p)), sfvalue(sfaram1(p))); return sfaram2(p); } sfarg *sfdiv(sfarg *const p) { /* / */ sfvalue(p) = gsl_complex_div(sfvalue(sfaram2(p)), sfvalue(sfaram1(p))); return sfaram2(p); } sfarg *sfsin(sfarg *const p) { /* sin */ sfvalue(p) = gsl_complex_sin(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfcos(sfarg *const p) { /* cos */ sfvalue(p) = gsl_complex_cos(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sftan(sfarg *const p) { /* tan */ sfvalue(p) = gsl_complex_tan(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfcot(sfarg *const p) { /* ctan */ sfvalue(p) = gsl_complex_cot(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfasin(sfarg *const p) { /* asin */ sfvalue(p) = gsl_complex_arcsin(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfacos(sfarg *const p) { /* acos */ sfvalue(p) = gsl_complex_arccos(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfatan(sfarg *const p) { /* atan */ sfvalue(p) = gsl_complex_arctan(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfacot(sfarg *const p) { /* actan */ sfvalue(p) = gsl_complex_arccot(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfatan2(sfarg *const p) { /* atan2 */ return sfaram2(p); } sfarg *sfsinh(sfarg *const p) { /* sinh */ sfvalue(p) = gsl_complex_sinh(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfcosh(sfarg *const p) { /* cosh */ sfvalue(p) = gsl_complex_cosh(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sftanh(sfarg *const p) { /* tanh */ sfvalue(p) = gsl_complex_tanh(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfcoth(sfarg *const p) { /* ctanh */ sfvalue(p) = gsl_complex_coth(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfexp(sfarg *const p) { /* exp */ sfvalue(p) = gsl_complex_exp(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sflog(sfarg *const p) { /* log */ sfvalue(p) = gsl_complex_log(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sflog10(sfarg *const p) { /* log10 */ sfvalue(p) = gsl_complex_log10(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sflog2(sfarg *const p) { /* log2 */ sfNumber base; real(base) = 2; imag(base) = 0; sfvalue(p) = gsl_complex_log_b(sfvalue(sfaram1(p)), base); return sfaram1(p); } sfarg *sflogN(sfarg *const p) { /* logN */ sfvalue(p) = gsl_complex_log_b(sfvalue(sfaram1(p)), sfvalue(sfaram2(p))); return sfaram2(p); } sfarg *sfpow(sfarg *const p) { /* cmplx pow */ sfvalue(p) = gsl_complex_pow(sfvalue(sfaram2(p)), sfvalue(sfaram1(p))); return sfaram2(p); } sfarg *sfpowd(sfarg *const p) { /* int pow */ sfvalue(p) = gsl_complex_pow_real(sfvalue(sfaram2(p)), GSL_REAL(sfvalue(sfaram1(p)))); return sfaram2(p); } sfarg *sfsqr(sfarg *const p) { /* sqr */ sfvalue(p) = gsl_complex_pow(sfvalue(sfaram1(p)), sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfsqrt(sfarg *const p) { /* sqrt */ sfvalue(p) = gsl_complex_sqrt(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfrtni(sfarg *const p) { /* rtni */ double nrz = pow(gsl_complex_abs(sfvalue(sfaram3(p))), 1.0 / (double)(int)real(sfvalue(sfaram2(p)))); double alfi = (gsl_complex_arg(sfvalue(sfaram3(p))) + 8 * atan(1.0) * (double)(int)real(sfvalue(sfaram1(p)))) / (double)(int)real(sfvalue(sfaram2(p))); cmplxset(sfvalue(sfaram3(p)), nrz * cos(alfi), nrz * sin(alfi)); return sfaram3(p); } sfarg *sfinv(sfarg *const p) { /* cinv */ sfvalue(p) = gsl_complex_inverse(sfvalue(sfaram1(p))); return sfaram1(p); } sfarg *sfceil(sfarg *const p) { /* ceil */ // sfvalue(p) = ceil( sfvalue( sfaram1(p) ) ); return sfaram1(p); } sfarg *sffloor(sfarg *const p) { /* floor */ // sfvalue(p) = floor( sfvalue( sfaram1(p) ) ); return sfaram1(p); } sfarg *sfabs(sfarg *const p) { /* abs - |z| */ GSL_REAL(sfvalue(p)) = gsl_complex_abs(sfvalue(sfaram1(p))); GSL_IMAG(sfvalue(p)) = 0.0; return sfaram1(p); } sfarg *sfrabs(sfarg *const p) { /* abs - real numbers */ GSL_REAL(sfvalue(p)) = GSL_REAL(sfvalue(sfaram1(p))); if (GSL_REAL(sfvalue(p)) < 0) GSL_REAL(sfvalue(p)) = -GSL_REAL(sfvalue(p)); GSL_IMAG(sfvalue(p)) = 0; return sfaram1(p); } sfarg *sfre(sfarg *const p) { /* RE */ GSL_REAL(sfvalue(p)) = GSL_REAL(sfvalue(sfaram1(p))); GSL_IMAG(sfvalue(p)) = 0.0; return sfaram1(p); } sfarg *sfim(sfarg *const p) { /* IM */ GSL_REAL(sfvalue(p)) = GSL_IMAG(sfvalue(sfaram1(p))); GSL_IMAG(sfvalue(p)) = 0.0; return sfaram1(p); } sfarg *sfrand(sfarg *const p) { /* rand */ GSL_REAL(sfvalue(p)) = GSL_REAL(sfvalue(sfaram1(p))) * (double)rand() / (double)RAND_MAX; GSL_IMAG(sfvalue(p)) = 0; return sfaram1(p); } // const eval void sfcPI(sfNumber *cnst) { GSL_SET_COMPLEX(cnst, 4 * atan(1), 0); } void sfcPI2(sfNumber *cnst) { GSL_SET_COMPLEX(cnst, 2 * atan(1), 0); } void sfc2PI(sfNumber *cnst) { GSL_SET_COMPLEX(cnst, 8 * atan(1), 0); } void sfcE(sfNumber *cnst) { GSL_SET_COMPLEX(cnst, exp(1), 0); } void sfcI(sfNumber *cnst) { GSL_SET_COMPLEX(cnst, 0, 1); } void sfcRND(sfNumber *cnst) { GSL_SET_COMPLEX(cnst, rand(), 0); } #endif XaoS-release-4.3.2/src/ui-hlp/000077500000000000000000000000001455214672000160035ustar00rootroot00000000000000XaoS-release-4.3.2/src/ui-hlp/autod.h000066400000000000000000000074641455214672000173030ustar00rootroot00000000000000#ifndef UNSUPPORTED static inline int look1(uih_context *context, int x, int y, int range, int max) { cpixel_t *vbuff; int i, j, c = 0; if (range < context->zengine->image->width / 2) if (x < 0 || x > context->zengine->image->width || y < 0 || y > context->zengine->image->height) return 0; do { max--; c = 0; if (range > context->zengine->image->width / 2) context->x1 = rand() % (context->zengine->image->width - 2 * LOOKSIZE - 1) + LOOKSIZE, context->y1 = rand() % (context->zengine->image->height - 2 * LOOKSIZE - 1) + LOOKSIZE; else { context->x1 = rand() % range - (range >> 1) + x; context->y1 = rand() % range - (range >> 1) + y; if (context->x1 < LOOKSIZE) context->x1 = LOOKSIZE; if (context->y1 < LOOKSIZE) context->y1 = LOOKSIZE; if (context->x1 > context->zengine->image->width - 2 - LOOKSIZE) context->x1 = context->zengine->image->width - 2 - LOOKSIZE; if (context->y1 > context->zengine->image->height - 2 - LOOKSIZE) context->y1 = context->zengine->image->height - 2 - LOOKSIZE; } for (j = context->y1 - LOOKSIZE; j <= context->y1 + LOOKSIZE; j++) { vbuff = (cpixel_t *)context->zengine->image->currlines[j]; for (i = context->x1 - LOOKSIZE; i <= context->x1 + LOOKSIZE; i++) if (InSet(p_getp(vbuff, i))) c++; } } while ((c == 0 || c > LOOKSIZE * LOOKSIZE) && max > 0); if (max > 0) { context->c1 = BUTTON1, context->interlevel = 1; return 1; } return (0); } static inline int look2(uih_context *context, int x, int y, int range, int max) { cpixel_t *vbuff, *vbuff2; int i, j, i1, j1, c = 0; if (range < context->zengine->image->width / 2) if (x < 0 || x > context->zengine->image->width || y < 0 || y > context->zengine->image->height) return 0; do { max--; c = 0; if (range > context->zengine->image->width / 2) context->x1 = rand() % (context->zengine->image->width - 2 * LOOKSIZE - 1) + LOOKSIZE, context->y1 = rand() % (context->zengine->image->height - 2 * LOOKSIZE - 1) + LOOKSIZE; else { context->x1 = rand() % range - (range >> 1) + x; context->y1 = rand() % range - (range >> 1) + y; if (context->x1 < LOOKSIZE) context->x1 = LOOKSIZE; if (context->y1 < LOOKSIZE) context->y1 = LOOKSIZE; if (context->x1 > context->zengine->image->width - 2 - LOOKSIZE) context->x1 = context->zengine->image->width - 2 - LOOKSIZE; if (context->y1 > context->zengine->image->height - 2 - LOOKSIZE) context->y1 = context->zengine->image->height - 2 - LOOKSIZE; } for (j = context->y1 - LOOKSIZE; j < context->y1 + LOOKSIZE; j++) { vbuff = (cpixel_t *)context->zengine->image->currlines[j]; for (i = context->x1 - LOOKSIZE; i <= context->x1 + LOOKSIZE; i++) for (j1 = j + 1; j1 < context->y1 + LOOKSIZE; j1++) { vbuff2 = (cpixel_t *)context->zengine->image->currlines[j1]; for (i1 = i + 1; i1 < context->x1 + LOOKSIZE; i1++) if (p_getp(vbuff, i) == p_getp(vbuff2, i1)) c++; } } } while ((c > LOOKSIZE * LOOKSIZE / 2) && max > 0); if (max > 0) { context->c1 = BUTTON1, context->interlevel = 2; return 1; } return 0; } #endif #undef look1 #undef look2 XaoS-release-4.3.2/src/ui-hlp/autopilot.cpp000066400000000000000000000161711455214672000205350ustar00rootroot00000000000000 /* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include "config.h" #define SLARGEITER #include "filter.h" #include "zoom.h" #include "autopilot.h" #include "ui_helper.h" #define MINCOUNT 5 #define InSet(i) (i == context->image->palette->pixels[0]) /*Include bitmap depended part first */ #include "c256.h" #define look1 look18 #define look2 look28 #include "autod.h" #include "hicolor.h" #define look1 look116 #define look2 look216 #include "autod.h" #include "true24.h" #define look1 look124 #define look2 look224 #include "autod.h" #include "truecolor.h" #define look1 look132 #define look2 look232 #include "autod.h" #ifdef USE_FLOAT128 #include #define isnan isnanq #else #define isnan std::isnan #endif void clean_autopilot(uih_context *context) { context->minsize = 1000; context->maxsize = 0; context->autime = 0; context->minlong = 0; context->x1 = INT_MAX; context->y1 = INT_MAX; context->autopilotversion = context->fcontext->version; } static void again(uih_context *context) { context->fcontext->s = context->fcontext->currentformula->v; context->fcontext->version++; clean_autopilot(context); } void do_autopilot(uih_context *context, int *x, int *y, int *controls, void (*changed)(void), int times) { int c = 0; volatile number_t step = (context->fcontext->rs.mc - context->fcontext->rs.nc) / context->zengine->image->width / 10; volatile number_t pos = context->fcontext->rs.mc; volatile number_t pos1 = context->fcontext->rs.mc; volatile number_t ystep = (context->fcontext->rs.mi - context->fcontext->rs.ni) / context->zengine->image->height / 10; volatile number_t ypos = context->fcontext->rs.mi; volatile number_t ypos1 = context->fcontext->rs.mi; pos += step; /*out of precisity check */ ypos += ystep; pos1 -= step; /*out of precisity check */ ypos1 -= ystep; *x = context->x1; *y = context->y1; uih_clearwindows(context); context->zengine->action->convertup(context->zengine, x, y); if ((context->minlong > MINCOUNT && context->c1 == BUTTON3) || !(pos > context->fcontext->rs.mc) || !(ypos > context->fcontext->rs.mi) || (pos1 >= context->fcontext->rs.mc) || (ypos1 >= context->fcontext->rs.mi) || context->fcontext->rs.mc - context->fcontext->rs.nc > 100.0 || isnan(pos) || isnan(ypos) || isnan(context->fcontext->s.cr) || isnan(context->fcontext->s.ci) || isnan(context->fcontext->s.rr - context->fcontext->s.ri) || context->fcontext->s.rr == 0 || context->fcontext->s.ri == 0 || isnan(context->fcontext->rs.mc - context->fcontext->rs.mi) || isnan(context->fcontext->rs.nc - context->fcontext->rs.ni)) { again(context); changed(); } /*Are we waiting for better qualitty? */ if (!context->c1 && context->zengine->flags & INCOMPLETE) { return; } assert(changed != NULL); if (context->fcontext->version != context->autopilotversion) clean_autopilot(context); if (context->fcontext->rs.mc - context->fcontext->rs.nc < context->minsize) { context->minsize = context->fcontext->rs.mc - context->fcontext->rs.nc; context->minlong = 0; } /*Oscillating prevention */ if (context->fcontext->rs.mc - context->fcontext->rs.nc > context->maxsize) { context->minsize = context->fcontext->rs.mc - context->fcontext->rs.nc; context->maxsize = context->fcontext->rs.mc - context->fcontext->rs.nc; context->minlong = 0; } if (context->autime <= 0) { context->minlong++; context->autime = rand() % MAXTIME; if (context->zengine->flags & LOWQUALITY) { context->c1 = 0; } else { switch (context->zengine->image->bytesperpixel) { case 1: c = look18(context, *x, *y, RANGE1, NGUESSES); if (!c) c = look28(context, *x, *y, RANGE1, NGUESSES); if (!(rand() % 30)) c = 0; if (!c) c = look18(context, *x, *y, 10000, NGUESSES1); if (!c) c = look18(context, *x, *y, 10000, NGUESSES2); break; #ifdef SUPPORT16 case 2: c = look116(context, *x, *y, RANGE1, NGUESSES); if (!c) c = look216(context, *x, *y, RANGE1, NGUESSES); if (!(rand() % 30)) c = 0; if (!c) c = look116(context, *x, *y, 10000, NGUESSES1); if (!c) c = look216(context, *x, *y, 10000, NGUESSES1); break; #endif #ifdef STRUECOLOR24 case 3: c = look124(context, *x, *y, RANGE1, NGUESSES); if (!c) c = look224(context, *x, *y, RANGE1, NGUESSES); if (!(rand() % 30)) c = 0; if (!c) c = look124(context, *x, *y, 10000, NGUESSES1); if (!c) c = look224(context, *x, *y, 10000, NGUESSES1); break; #endif case 4: c = look132(context, *x, *y, RANGE1, NGUESSES); if (!c) c = look232(context, *x, *y, RANGE1, NGUESSES); if (!(rand() % 30)) c = 0; if (!c) c = look132(context, *x, *y, 10000, NGUESSES1); if (!c) c = look232(context, *x, *y, 10000, NGUESSES1); } if (!c) { if ((context->zengine->flags & INCOMPLETE)) { context->c1 = 0; } else context->c1 = BUTTON3, context->autime >>= 1; } } } context->autime -= times; *x = context->x1; *y = context->y1; context->zengine->action->convertup(context->zengine, x, y); /* printf("%i %i\n",*x,*y); */ *controls = context->c1; } XaoS-release-4.3.2/src/ui-hlp/autopilot.h000066400000000000000000000021741455214672000202000ustar00rootroot00000000000000 /* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef AUTOPILOT_H #define AUTOPILOT_H #include "config.h" #include "ui_helper.h" void do_autopilot(uih_context *, int *, int *, int *, void (*)(void), int times); void clean_autopilot(uih_context *); #endif XaoS-release-4.3.2/src/ui-hlp/menu.cpp000066400000000000000000001710471455214672000174650ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include "filter.h" #include "config.h" #include "formulas.h" #include "ui_helper.h" #include "plane.h" #include "xmenu.h" #include "play.h" #include "i18n.h" #include "xthread.h" #include "customdialog.h" #define LANG(name, name2) \ MENUSTRING("lang", NULL, name, name2, 0, \ (void (*)(struct uih_context * c, char *)) uih_loadcatalog, \ name2) #define TUTOR(name1, name2, name3) \ MENUSTRING(name1, NULL, name2, name3, MENUFLAG_INTERRUPT | UI, \ uih_playtutorial, name3) #define LANG_I(name, name2) \ MENUSTRING_I("lang", NULL, name, name2, 0, \ (void (*)(struct uih_context * c, char *)) uih_loadcatalog, \ name2) #define TUTOR_I(name1, name2, name3) \ MENUSTRING_I(name1, NULL, name2, name3, MENUFLAG_INTERRUPT | UI, \ uih_playtutorial, name3) const static char *const morphstypes[] = {"view", "julia", "angle", "line"}; static const char *const imgtypes[] = {"Truecolor", "256 colors", NULL}; static const char *const yesno[] = {"No", "Yes", NULL}; const static char *const lineposs[] = {"screen", "scaled", "fractal", NULL}; const char *const uih_colornames[] = {"white", "black", "red", NULL}; /* Registering internationalized dialogs. * * The method we are internationalizing dialogs is similar to * menu i18n. The original version of XaoS (without i18n) * contained lots of static variables. Each row of a variable * (which is a structure) contains a widget of a dialog. * The last row contains NULL and 0 values to show * that the dialog does not contain any other widgets. * * Here we are using a huge static variable which contains * all widget from all dialogs. We copy each dialog after * each other into this huge array. The original static * variables will now be pointers pointing to the first * row of the widget data from the appropriate line * of the huge array. * * Note that in the first version there are only 2 * internationalized text, the rest will be "converted" * continuously (as I have enough time :-). * * Zoltan Kovacs , 2003-01-05 */ #define MAX_MENUDIALOGS_I18N 150 #define Register(variable) variable = &menudialogs_i18n[no_menudialogs_i18n] static menudialog menudialogs_i18n[MAX_MENUDIALOGS_I18N]; // static int no_menudialogs_i18n; static menudialog *uih_perturbationdialog, *uih_juliadialog, *uih_smoothmorphdialog, *uih_renderdialog, *uih_viewdialog, *uih_linedialog, *uih_colordialog, *uih_rotationdialog, *uih_lettersdialog, *uih_iterdialog, *dtextparam, *dcommand, *loaddialog, *playdialog, *saveimgdialog, *saveposdialog, *uih_formuladialog, *uih_plviewdialog, *uih_coorddialog, *uih_angledialog, *uih_autorotatedialog, *uih_fastrotatedialog, *uih_filterdialog, *uih_shiftdialog, *uih_speeddialog, *printdialog, *uih_bailoutdialog, *uih_threaddialog, *saveanimdialog, *uih_juliamodedialog, *uih_textposdialog, *uih_fastmodedialog, *uih_timedialog, *uih_numdialog, *uih_fpdialog, *palettedialog, *uih_cyclingdialog, *palettegradientdialog, *uih_renderimgdialog, *palettepickerdialog, *loadgpldialog, *savegpldialog, *uih_palettecolorsdialog #ifdef USE_SFFE , *uih_sffedialog, *uih_sffeinitdialog #endif ; void uih_registermenudialogs_i18n(void) { int no_menudialogs_i18n = 0; /* * The original code was: static menudialog uih_perturbationdialog[] = { DIALOGCOORD ("Perturbation:", 0, 0), {NULL} }; * Now first the static variable have to be registered (1), * the widget must be inserted into the huge array (2), * and the last row shows that no more widget comes (3). */ Register(uih_perturbationdialog); // (1) DIALOGCOORD_I(TR("Dialog", "Perturbation:"), 0, 0); // (2) NULL_I(); // (3) Register(uih_juliadialog); DIALOGCOORD_I(TR("Dialog", "Julia-seed:"), 0, 0); NULL_I(); Register(uih_smoothmorphdialog); DIALOGCHOICE_I(TR("Dialog", "Morphing type:"), morphstypes, 0); DIALOGINT_I(TR("Dialog", "Startuptime:"), 0); DIALOGINT_I(TR("Dialog", "Stoptime:"), 0); NULL_I(); Register(uih_renderdialog); DIALOGIFILES_I(TR("Dialog", "Files to render:"), 0); DIALOGOFILE_I(TR("Dialog", "Basename:"), "anim"); DIALOGINT_I(TR("Dialog", "Width:"), 640); DIALOGINT_I(TR("Dialog", "Height:"), 480); DIALOGFLOAT_I(TR("Dialog", "Pixel width (cm):"), 0.025); DIALOGFLOAT_I(TR("Dialog", "Pixel height (cm):"), 0.025); DIALOGFLOAT_I(TR("Dialog", "Framerate:"), 30); DIALOGCHOICE_I(TR("Dialog", "Image type:"), imgtypes, 0); DIALOGCHOICE_I(TR("Dialog", "Antialiasing:"), yesno, 0); DIALOGCHOICE_I(TR("Dialog", "Always recalculate:"), yesno, 0); NULL_I(); Register(uih_renderimgdialog); DIALOGOFILE_I(TR("Dialog", "Basename:"), "anim"); DIALOGINT_I(TR("Dialog", "Width:"), 640); DIALOGINT_I(TR("Dialog", "Height:"), 480); DIALOGFLOAT_I(TR("Dialog", "Pixel width (cm):"), 0.025); DIALOGFLOAT_I(TR("Dialog", "Pixel height (cm):"), 0.025); DIALOGCHOICE_I(TR("Dialog", "Image type:"), imgtypes, 0); DIALOGCHOICE_I(TR("Dialog", "Antialiasing:"), yesno, 0); NULL_I(); Register(uih_viewdialog); DIALOGCOORD_I(TR("Dialog", "Center:"), 0, 0); DIALOGFLOAT_I(TR("Dialog", "Radius:"), 1); DIALOGFLOAT_I(TR("Dialog", "Angle:"), 0); NULL_I(); Register(uih_linedialog); DIALOGCHOICE_I(TR("Dialog", "Mode:"), lineposs, 0); DIALOGCOORD_I(TR("Dialog", "Start:"), 0, 0); DIALOGCOORD_I(TR("Dialog", "End:"), 0, 0); NULL_I(); Register(uih_colordialog); DIALOGCHOICE_I(TR("Dialog", "Color:"), uih_colornames, 0); NULL_I(); Register(uih_rotationdialog); DIALOGFLOAT_I(TR("Dialog", "Rotations per second:"), 0); NULL_I(); Register(uih_lettersdialog); DIALOGINT_I(TR("Dialog", "Letters per second:"), 0); NULL_I(); Register(uih_iterdialog); DIALOGINT_I(TR("Dialog", "Iterations:"), 0); NULL_I(); Register(dtextparam); DIALOGSTR_I(TR("Dialog", "Text:"), ""); NULL_I(); Register(dcommand); DIALOGSTR_I(TR("Dialog", "Your command:"), ""); NULL_I(); Register(loaddialog); DIALOGIFILE_I(TR("Dialog", "Filename:"), "*.png *.xpf"); NULL_I(); Register(playdialog); DIALOGIFILE_I(TR("Dialog", "Filename:"), "anim*.xaf"); NULL_I(); Register(saveimgdialog); DIALOGOFILE_I(TR("Dialog", "Filename:"), "fract*.png"); NULL_I(); Register(saveposdialog); DIALOGOFILE_I(TR("Dialog", "Filename:"), "fract*.xpf"); NULL_I(); Register(uih_formuladialog); DIALOGKEYSTR_I(TR("Dialog", "Formula:"), "mandel"); NULL_I(); Register(uih_plviewdialog); DIALOGFLOAT_I(TR("Dialog", "X center:"), 0); DIALOGFLOAT_I(TR("Dialog", "Y center:"), 0); DIALOGFLOAT_I(TR("Dialog", "X Radius:"), 1); DIALOGFLOAT_I(TR("Dialog", "Y Radius:"), 1); NULL_I(); Register(uih_coorddialog); DIALOGCOORD_I(TR("Dialog", "Coordinates:"), 0, 0); NULL_I(); Register(uih_angledialog); DIALOGFLOAT_I(TR("Dialog", "Angle:"), 1); NULL_I(); Register(uih_autorotatedialog); DIALOGONOFF_I(TR("Dialog", "continuous rotation"), 0); NULL_I(); Register(uih_fastrotatedialog); DIALOGONOFF_I(TR("Dialog", "Fast rotation"), 0); NULL_I(); Register(uih_filterdialog); DIALOGKEYSTR_I(TR("Dialog", "filter"), ""); DIALOGONOFF_I(TR("Dialog", "enable"), 0); NULL_I(); Register(uih_shiftdialog); DIALOGINT_I(TR("Dialog", "Amount:"), 0); NULL_I(); Register(uih_speeddialog); DIALOGFLOAT_I(TR("Dialog", "Zooming speed:"), 0); NULL_I(); Register(printdialog); DIALOGSTR_I(TR("Dialog", "Name:"), ""); NULL_I(); Register(uih_bailoutdialog); DIALOGFLOAT_I(TR("Dialog", "Bailout:"), 0); NULL_I(); Register(uih_threaddialog); DIALOGINT_I(TR("Dialog", "Threads:"), 0); NULL_I(); Register(saveanimdialog); DIALOGOFILE_I(TR("Dialog", "Filename:"), "anim*.xaf"); NULL_I(); Register(uih_juliamodedialog); DIALOGONOFF_I(TR("Dialog", "Julia mode:"), 0); NULL_I(); Register(uih_textposdialog); DIALOGCHOICE_I(TR("Dialog", "Horizontal position:"), xtextposnames, 0); DIALOGCHOICE_I(TR("Dialog", "Vertical position:"), ytextposnames, 0); NULL_I(); Register(uih_fastmodedialog); DIALOGCHOICE_I(TR("Dialog", "Dynamic resolution:"), save_fastmode, 0); NULL_I(); Register(uih_timedialog); DIALOGINT_I(TR("Dialog", "Time:"), 0); NULL_I(); Register(uih_numdialog); DIALOGINT_I(TR("Dialog", "Number:"), 0); NULL_I(); Register(uih_fpdialog); DIALOGFLOAT_I(TR("Dialog", "Number:"), 0); NULL_I(); Register(palettedialog); DIALOGINT_I(TR("Dialog", "Algorithm number:"), 0); DIALOGINT_I(TR("Dialog", "Seed:"), 0); DIALOGINT_I(TR("Dialog", "Shift:"), 0); NULL_I(); Register(palettegradientdialog); DIALOGPALSLIDER_I("Visualiser:", 0); NULL_I(); Register(uih_palettecolorsdialog); for (int colidx = 0; colidx < 31; colidx++) { DIALOGSTR_I(TR("Dialog", "Color:"), "000000"); } NULL_I(); Register(palettepickerdialog); DIALOGPALPICKER_I("Palette:", 0); NULL_I(); Register(loadgpldialog); DIALOGIFILE_I(TR("Dialog", "Load Palette Config"), "file*.gpl"); NULL_I(); Register(savegpldialog); DIALOGOFILE_I(TR("Dialog", "Save Palette Config"), "file*.gpl"); NULL_I(); Register(uih_cyclingdialog); DIALOGINT_I(TR("Dialog", "Frames per second:"), 0); NULL_I(); #ifdef USE_SFFE Register(uih_sffedialog); DIALOGLIST_I(TR("Dialog", "Formula"), USER_FORMULA); NULL_I(); Register(uih_sffeinitdialog); DIALOGSTR_I(TR("Dialog", "Initialization:"), ""); NULL_I(); #endif if (no_menudialogs_i18n > MAX_MENUDIALOGS_I18N) { fprintf(stderr, "MAX_MENUDIALOGS_I18N is set to an insufficiently low number, please increase it to %d\n", no_menudialogs_i18n); fflush(stderr); exit(1); } #ifdef DEBUG printf("Filled %d widgets out of %d.\n", no_menudialogs_i18n, MAX_MENUDIALOGS_I18N); fflush(stdout); #endif } #undef Register /* * End of registering internationalized dialogs. */ #ifdef USE_SFFE void uih_sffein(uih_context *c, const char *text); void uih_sffeinitin(uih_context *c, const char *text); #endif static void uih_smoothmorph(struct uih_context *c, dialogparam *p) { if (!c->playc) return; switch (p[0].dint) { case 0: c->playc->morphtimes[0] = p[1].dint; c->playc->morphtimes[1] = p[2].dint; break; case 1: c->playc->morphjuliatimes[0] = p[1].dint; c->playc->morphjuliatimes[1] = p[2].dint; break; case 2: c->playc->morphangletimes[0] = p[1].dint; c->playc->morphangletimes[1] = p[2].dint; break; case 3: c->playc->morphlinetimes[0] = p[1].dint; c->playc->morphlinetimes[1] = p[2].dint; break; } } static void uih_render(struct uih_context *c, dialogparam *d) { if(fnames.size() == 0) { uih_error(c, "No file Selected"); return; } if (d[2].dint <= 0 || d[2].dint > 4096) { uih_error( c, TR("Error", "renderanim: Width parameter must be positive integer in the range 0..4096")); return; } if (d[3].dint <= 0 || d[3].dint > 4096) { uih_error( c, TR("Error", "renderanim: Height parameter must be positive integer in the range 0..4096")); return; } if (d[4].number <= 0 || d[5].number <= 0) { uih_error(c, TR("Error", "renderanim: Invalid real width and height dimensions")); return; } if (d[6].number <= 0 || d[6].number >= 1000000) { uih_error(c, TR("Error", "renderanim: invalid framerate")); return; } if (d[7].dint && d[8].dint) { uih_error( c, TR("Error", "renderanim: antialiasing not supported in 256 color mode")); return; } for(int i=0; i < (int)fnames.size(); i++) { QString hlpmsg = "Rendering (" + QString::number(i) + "/" + QString::number(fnames.size()) + ") " + fnames[i]; uih_message(c, hlpmsg.toStdString().c_str()); char* curr_file = strdup(fnames[i].toStdString().c_str()); QString file_number = "_" + fnames[i].split("/").back().split(".").front() + "_"; char* file_suffix = strdup(file_number.toStdString().c_str()); char* base_name = (char *)malloc(strlen(d[1].dstring) + strlen(file_suffix) + 2); strcpy(base_name, d[1].dstring); strcat(base_name, file_suffix); uih_renderanimation(c, base_name, (xio_path)curr_file, d[2].dint, d[3].dint, d[4].number, d[5].number, (int)(1000000 / d[6].number), #ifdef STRUECOLOR24 d[7].dint ? C256 : TRUECOLOR24, #else d[7].dint ? C256 : TRUECOLOR, #endif d[8].dint, d[9].dint, c->letterspersec, NULL); free(base_name); } } static void uih_renderimg(struct uih_context *c, dialogparam *d) { xio_file f = xio_wopen(".xaos_temp.xpf"); if(!f) { uih_error(c, "Could not Render Image"); return; } uih_save_position(c, f, 0); xio_constpath path = ".xaos_temp.xpf"; if (d[1].dint <= 0 || d[1].dint > 4096) { uih_error( c, TR("Error", "renderanim: Width parameter must be positive integer in the range 0..4096")); return; } if (d[2].dint <= 0 || d[2].dint > 4096) { uih_error( c, TR("Error", "renderanim: Height parameter must be positive integer in the range 0..4096")); return; } if (d[3].number <= 0 || d[4].number <= 0) { uih_error(c, TR("Error", "renderanim: Invalid real width and height dimensions")); return; } if (d[5].dint && d[6].dint) { uih_error( c, TR("Error", "renderanim: antialiasing not supported in 256 color mode")); return; } uih_renderanimation(c, d[0].dstring, (xio_path)path, d[1].dint, d[2].dint, d[3].number, d[4].number, (int)(1000000 / 30), #ifdef STRUECOLOR24 d[5].dint ? C256 : TRUECOLOR24, #else d[5].dint ? C256 : TRUECOLOR, #endif d[6].dint, 0, c->letterspersec, NULL); remove(".xaos_temp.xpf"); } static menudialog *uih_getcolordialog(struct uih_context *c) { if (c != NULL) { uih_colordialog[0].defint = c->color; } return (uih_colordialog); } static void uih_setcolor(struct uih_context *c, int color) { c->color = color; } static menudialog *uih_getperturbationdialog(struct uih_context *c) { if (c != NULL) { uih_perturbationdialog[0].deffloat = c->fcontext->bre; uih_perturbationdialog[0].deffloat2 = c->fcontext->bim; } return (uih_perturbationdialog); } static menudialog *uih_getjuliadialog(struct uih_context *c) { if (c != NULL) { uih_juliadialog[0].deffloat = c->fcontext->pre; uih_juliadialog[0].deffloat2 = c->fcontext->pim; } return (uih_juliadialog); } static void uih_plview(struct uih_context *c, dialogparam *d) { if (d[2].number <= 0 || d[3].number <= 0) { uih_error(c, TR("Error", "animateview: Invalid viewpoint")); return; } c->fcontext->s.cr = d[0].number; c->fcontext->s.ci = d[1].number; c->fcontext->s.rr = d[2].number; c->fcontext->s.ri = d[3].number; uih_newimage(c); } static void uih_plview2(struct uih_context *c, dialogparam *d) { if (d[2].number <= 0 || d[3].number <= 0) { uih_error(c, TR("Error", "animateview: Invalid viewpoint")); return; } c->fcontext->s.cr = d[0].number; c->fcontext->s.ci = d[1].number; c->fcontext->s.rr = d[2].number; c->fcontext->s.ri = d[3].number; uih_animate_image(c); } static void uih_dview(struct uih_context *c, dialogparam *d) { if (d[1].number <= 0) { uih_error(c, TR("Error", "Invalid viewpoint")); return; } c->fcontext->s.cr = d[0].dcoord[0]; c->fcontext->s.ci = d[0].dcoord[1]; c->fcontext->s.rr = d[1].number; c->fcontext->s.ri = d[1].number; uih_angle(c, d[2].number); uih_newimage(c); } static menudialog *uih_getviewdialog(struct uih_context *c) { number_t xs, ys; if (c != NULL) { xs = c->fcontext->s.rr; ys = c->fcontext->s.ri * c->fcontext->windowwidth / c->fcontext->windowheight; uih_viewdialog[0].deffloat = c->fcontext->s.cr; uih_viewdialog[0].deffloat2 = c->fcontext->s.ci; uih_viewdialog[2].deffloat = c->fcontext->angle; if (xs > ys) uih_viewdialog[1].deffloat = c->fcontext->s.rr; else uih_viewdialog[1].deffloat = c->fcontext->s.ri; } return (uih_viewdialog); } static menudialog *uih_getlettersdialog(struct uih_context *c) { if (c != NULL) uih_lettersdialog[0].defint = c->letterspersec; return (uih_lettersdialog); } static menudialog *uih_getiterdialog(struct uih_context *c) { if (c != NULL) uih_iterdialog[0].defint = c->fcontext->maxiter; return (uih_iterdialog); } static menudialog *uih_getbailoutdialog(struct uih_context *c) { if (c != NULL) uih_bailoutdialog[0].deffloat = c->fcontext->bailout; return (uih_bailoutdialog); } int defthreads = 0; static menudialog *uih_getthreaddialog(struct uih_context *c) { if (c != NULL) uih_threaddialog[0].defint = defthreads; return (uih_threaddialog); } void uih_setthreads(uih_context */*c*/, int threads) { if (threads < 1) threads = 1; if (threads > MAXTHREADS) threads = MAXTHREADS; if (threads != defthreads) { QSettings settings; settings.setValue("MainWindow/threadCount", threads); QMessageBox msgBox; msgBox.setText( TR("Message", "XaoS must restart to change the thread count.")); msgBox.setInformativeText(TR("Message", "Do you want to quit now?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { exit(0); } } } static int uih_saveanimenabled(struct uih_context *c) { if (c == NULL) return 0; return (c->save); } static menudialog *uih_getrotationdialog(struct uih_context *c) { if (c != NULL) uih_rotationdialog[0].deffloat = c->rotationspeed; return (uih_rotationdialog); } #ifdef USE_SFFE static menudialog *uih_getsffedialog(struct uih_context *c) { if (c != NULL) { if (c->fcontext->userformula->expression) uih_sffedialog[0].defstr = c->fcontext->userformula->expression; else uih_sffedialog[0].defstr = USER_FORMULA; } return (uih_sffedialog); } static menudialog *uih_getsffeinitdialog(struct uih_context *c) { if (c != NULL) { if (c->fcontext->userinitial->expression) uih_sffeinitdialog[0].defstr = c->fcontext->userinitial->expression; else uih_sffeinitdialog[0].defstr = ""; } return (uih_sffeinitdialog); } #endif static menudialog *uih_getpalettedialog(struct uih_context *uih) { if (uih != NULL) { palettedialog[0].defint = uih->palettetype; palettedialog[1].defint = uih->paletteseed; palettedialog[2].defint = uih->paletteshift + uih->manualpaletteshift; } return (palettedialog); } static menudialog *uih_palettepickerdialog(struct uih_context *uih) { return (palettepickerdialog); } static menudialog *uih_getpalettegradientdialog(struct uih_context *uih) { if (uih != NULL) { palettegradientdialog[0].defint = 0; } return (palettegradientdialog); } static menudialog *uih_getcyclingdialog(struct uih_context *uih) { if (uih != NULL) uih_cyclingdialog[0].defint = uih->cyclingspeed * uih->direction; return (uih_cyclingdialog); } static menudialog *uih_getspeeddialog(struct uih_context *uih) { if (uih != NULL) uih_speeddialog[0].deffloat = uih->speedup / STEP; return (uih_speeddialog); } static void uih_setspeed(uih_context *c, number_t p) { if (p >= 100) p = 1.0; if (p < 0) p = 0; c->speedup = STEP * p; c->maxstep = MAXSTEP * p; } static void uih_palette(struct uih_context *uih, dialogparam *p) { int n1 = p[0].dint; int n2 = p[1].dint; int shift = p[2].dint; if (!n1) { uih_playdefpalette(uih, shift); return; } if (n1 < 1 || n1 > PALGORITHMS) { uih_error(uih, TR("Error", "Unknown palette type")); } if (uih->zengine->fractalc->palette == NULL) return; if (mkpalette(uih->zengine->fractalc->palette, n2, n1 - 1) != 0) { uih_newimage(uih); } uih->manualpaletteshift = 0; uih->palettetype = n1; uih->palettechanged = 1; uih->paletteseed = n2; if (shiftpalette(uih->zengine->fractalc->palette, shift)) { uih_newimage(uih); } uih->paletteshift = shift; uih->palettepickerenabled = 0; } static void uih_palettegradient(struct uih_context *uih, dialogparam *p) { int n1 = uih->palettetype; int n2 = uih->paletteseed; int shift = uih->paletteshift; if (!n1) { uih_playdefpalette(uih, shift); return; } if (n1 < 1 || n1 > PALGORITHMS) { uih_error(uih, TR("Error", "Unknown palette type")); } if (uih->zengine->fractalc->palette == NULL) return; if (mkpalette(uih->zengine->fractalc->palette, n2, n1 - 1) != 0) { uih_newimage(uih); } uih->manualpaletteshift = 0; uih->palettetype = n1; uih->palettechanged = 1; uih->paletteseed = n2; if (shiftpalette(uih->zengine->fractalc->palette, shift)) { uih_newimage(uih); } uih->paletteshift = shift; uih->palettepickerenabled = 0; } static void uih_palettecolors(struct uih_context *uih, dialogparam *p){ unsigned char colors[31][3]; memset(colors, 0, sizeof (colors)); for(int i=0; i < 31; i++) { rgb_t color; hextorgb(p[i].dstring, color); colors[i][0] = color[0]; colors[i][1] = color[1]; colors[i][2] = color[2]; } mkcustompalette(uih->palette, colors); uih_newimage(uih); uih->palettepickerenabled = 1; } static void uih_palettepicker(struct uih_context *uih, dialogparam *p) { uih_newimage(uih); uih->palettepickerenabled = 1; } static void uih_loadgpl(struct uih_context *uih, xio_constpath d) { QFile *loadfile = new QFile(d); unsigned char colors[31][3]; memset(colors, 0, sizeof (colors)); if (loadfile->open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(loadfile); QStringList colorvals= in.readAll().split("\n"); if((int)colorvals.size() != 36) { uih_error(uih, "Corrupted palette File"); loadfile->close(); return; } for(int i = 4; i < 35; i++) { QStringList currcolors = colorvals[i].split(QRegularExpression("\\s+")); int r = currcolors[0].toInt(); int g = currcolors[1].toInt(); int b = currcolors[2].toInt(); if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) { uih_error(uih, "RGB out of range. Failed to load palette."); loadfile->close(); return; } colors[i-4][0] = r; colors[i-4][1] = g; colors[i-4][2] = b; } mkcustompalette(uih->palette, colors); loadfile->close(); char s[256]; sprintf(s, TR("Message", "File %s opened."), d); uih_message(uih, s); } else { uih_error(uih, "Failed to open palette configuration"); return; } uih_newimage(uih); uih->palettepickerenabled = 1; } static void uih_savegpl(struct uih_context *uih, xio_constpath d) { QFile *savefile = new QFile(d); unsigned char colors[31][3]; if(savefile->open(QIODevice::WriteOnly | QIODevice::Text)) { getDEFSEGMENTColor(colors); QTextStream stream(savefile); stream << "GIMP Palette" << "\n"; stream << "Name: XaoS_Palette" << "\n"; stream << "Columns: 16" << "\n" << "#" << "\n"; for(int i=0; i < 31; i++){ char s[256]; sprintf(s, "%3d %3d %3d", colors[i][0], colors[i][1], colors[i][2]); stream << s << "\t color_" << QString::number(i) << "\n"; } savefile->close(); char s[256]; sprintf(s, TR("Message", "File %s saved."), d); uih_message(uih, s); } else { uih_error(uih, "Failed to save palette Configuration"); } uih->palettepickerenabled = 1; } static int uih_rotateselected(struct uih_context *c, int n) { if (c == NULL) return 0; if (!c->fastrotate) return !n; return (c->rotatemode == n); } static int uih_guessingselected(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->fcontext->range == n); } static int uih_fastmode(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->fastmode == n); } static int uih_periodicityselected(struct uih_context *c) { if (c == NULL) return 0; return (c->fcontext->periodicity); } static void uih_periodicitysw(struct uih_context *c) { uih_setperiodicity(c, c->fcontext->periodicity ^ 1); } static int uih_cyclingselected(struct uih_context *c) { if (c == NULL) return 0; return (c->cycling && c->cyclingdirection == 1); } static int uih_rcyclingselected(struct uih_context *c) { if (c == NULL) return 0; return (c->cycling && c->cyclingdirection == -1); } static void uih_cyclingsw(struct uih_context *c) { // Andrew Stone: this fixes what I consider a bug - switching from Y to y // should keep cycling: if (c->cycling && c->cyclingdirection == -1) uih_cycling_off(c); c->cyclingdirection = 1; if (c->cycling) uih_cycling_off(c); else if (!uih_cycling_on(c)) uih_error(c, TR("Error", "Initialization of color cycling failed.")), uih_message(c, TR("Error", "Try to enable palette emulation filter")); } static void uih_rcyclingsw(struct uih_context *c) { // Andrew Stone: this fixes what I consider a bug - switching from y to Y // should keep cycling: if (c->cycling && c->cyclingdirection == 1) uih_cycling_off(c); c->cyclingdirection = -1; if (c->cycling) uih_cycling_off(c); else if (!uih_cycling_on(c)) uih_error(c, TR("Error", "Initialization of color cycling failed.")), uih_message(c, TR("Error", "Try to enable palette emulation filter")); } static void uih_juliasw(struct uih_context *c) { if (!c->juliamode) uih_enablejulia(c); else uih_disablejulia(c); } static int uih_juliaselected(struct uih_context *c) { if (c == NULL) return 0; return (c->juliamode); } static int uih_mandelbrotselected(struct uih_context *c) { if (c == NULL) return 0; return (c->fcontext->mandelbrot); } static void uih_mandelbrotsw(struct uih_context *c, number_t x, number_t y) { c->fcontext->mandelbrot ^= 1; if (c->fcontext->mandelbrot == 0 && !c->juliamode) { c->fcontext->pre = x; c->fcontext->pim = y; } else uih_disablejulia(c); c->fcontext->version++; uih_newimage(c); uih_updatemenus(c, "uimandelbrot"); } static int uih_autopilotselected(struct uih_context *c) { if (c == NULL) return 0; return (c->autopilot); } static int uih_fixedstepselected(struct uih_context *c) { if (c == NULL) return 0; return (c->fixedstep); } static void uih_persw(struct uih_context *c, number_t x, number_t y) { if (c->fcontext->bre || c->fcontext->bim) uih_setperbutation(c, 0.0, 0.0); else uih_setperbutation(c, x, y); // printf(""); // fixme: some newer versions of gcc crashes without this } static int uih_perselected(struct uih_context *c) { if (c == NULL) return 0; return (c->fcontext->bre || c->fcontext->bim); } static void uih_autopilotsw(struct uih_context *c) { if (c->autopilot) uih_autopilot_off(c); else uih_autopilot_on(c); } static void uih_fixedstepsw(struct uih_context *c) { c->fixedstep ^= 1; } static void uih_setxtextpos(uih_context *c, int p) { uih_settextpos(c, p, c->ytextpos); } static int uih_xtextselected(uih_context *c, int p) { if (c == NULL) return 0; return (c->xtextpos == p); } static void uih_setytextpos(uih_context *c, int p) { uih_settextpos(c, c->xtextpos, p); } static int uih_ytextselected(uih_context *c, int p) { if (c == NULL) return 0; return (c->ytextpos == p); } static void uih_menumkpalette(uih_context *c) { char s[256]; uih_mkpalette(c); sprintf(s, TR("Error", "Algorithm:%i seed:%i size:%i"), c->palettetype, c->paletteseed, c->zengine->fractalc->palette->size); uih_message(c, s); } static void uih_shiftpalette(uih_context *c, int shift) { if (shiftpalette(c->zengine->fractalc->palette, shift)) { uih_newimage(c); } c->manualpaletteshift += shift; } static void uih_fshift(uih_context *c) { uih_shiftpalette(c, 1); } static void uih_bshift(uih_context *c) { uih_shiftpalette(c, -1); } static const menuitem *menuitems; /*XaoS menu specifications */ /* This structure is now empty. All static definitions have been moved to uih_registermenus_i18n() which fills up its own static array. */ /* Registering internationalized menus. See also include/xmenu.h for details. Note that MAX_MENUITEMS_I18N should be increased if more items will be added in future. On 2006-07-12 J.B. Langston wrote: The menu.c.diff file changes the MAX_MENUITEMS_I18N macro from 200 to 250. As of 3.2.1, the number of allocated menu items had been exceeded (there are 201 menu items now). This was causing the memory within the application to be clobbered, resulting in subtle bugs on the PowerPC platform (both X11 and OSX drivers). For example, rendering animations generated a segmentation fault. It's quite possible it could have been causing other subtle bugs elsewhere in the program. */ #define MAX_MENUITEMS_I18N 250 static menuitem menuitems_i18n[MAX_MENUITEMS_I18N]; int uih_no_menuitems_i18n; void uih_registermenus_i18n(void) { // Special version (currently it's OK): int no_menuitems_i18n = 0; SUBMENU_I("", NULL, TR("Menu", "Root menu"), "root"); SUBMENU_I("", NULL, TR("Menu", "Animation root menu"), "animroot"); SUBMENU_I("", NULL, TR("Menu", "Replay only commands"), "plc"); #define MP (MENUFLAG_NOMENU | MENUFLAG_NOOPTION) /* Commands suitable only for animation replay */ SUBMENU_I("plc", NULL, TR("Menu", "Line drawing functions"), "linemenu"); MENUDIALOG_I("linemenu", NULL, TR("Menu", "Line"), "line", MP, uih_line, uih_linedialog); MENUDIALOG_I("linemenu", NULL, TR("Menu", "Morph line"), "morphline", MP, uih_morphline, uih_linedialog); MENUDIALOG_I("linemenu", NULL, TR("Menu", "Morph last line"), "morphlastline", MP, uih_morphlastline, uih_linedialog); MENUDIALOG_I("linemenu", NULL, TR("Menu", "Set line key"), "linekey", MP, uih_setkey, uih_numdialog); MENUNOP_I("linemenu", NULL, TR("Menu", "Clear line"), "clearline", MP, uih_clear_line); MENUNOP_I("linemenu", NULL, TR("Menu", "Clear all lines"), "clearlines", MP, uih_clear_lines); SUBMENU_I("plc", NULL, TR("Menu", "Animation functions"), "animf"); MENUDIALOG_I("animf", NULL, TR("Menu", "View"), "animateview", MP, uih_plview2, uih_plviewdialog); MENUDIALOG_I("animf", NULL, TR("Menu", "Morph view"), "morphview", MP, uih_playmorph, uih_plviewdialog); MENUDIALOG_I("animf", NULL, TR("Menu", "Morph julia"), "morphjulia", MP, uih_playmorphjulia, uih_coorddialog); MENUDIALOG_I("animf", NULL, TR("Menu", "Move view"), "moveview", MP, uih_playmove, uih_coorddialog); MENUDIALOG_I("animf", NULL, TR("Menu", "Morph angle"), "morphangle", MP, uih_playmorphangle, uih_angledialog); MENUDIALOG_I("animf", NULL, TR("Menu", "Zoom center"), "zoomcenter", MP, uih_zoomcenter, uih_coorddialog); MENUNOP_I("animf", NULL, TR("Menu", "Zoom"), "zoom", MP, uih_playzoom); MENUNOP_I("animf", NULL, TR("Menu", "Un-zoom"), "unzoom", MP, uih_playunzoom); MENUNOP_I("animf", NULL, TR("Menu", "Stop zooming"), "stop", MP, uih_playstop); MENUDIALOG_I("animf", NULL, TR("Menu", "Smooth morphing parameters"), "smoothmorph", MP, uih_smoothmorph, uih_smoothmorphdialog); SUBMENU_I("plc", NULL, TR("Menu", "Timing functions"), "time"); MENUDIALOG_I("time", NULL, TR("Menu", "Usleep"), "usleep", MP, uih_playusleep, uih_timedialog); MENUNOP_I("time", NULL, TR("Menu", "Wait for text"), "textsleep", MP, uih_playtextsleep); MENUNOP_I("time", NULL, TR("Menu", "Wait for complete image"), "wait", MP, uih_playwait); MENUDIALOG_I("plc", NULL, TR("Menu", "Include file"), "load", MP, uih_playload, loaddialog); MENUDIALOG_I("palette", NULL, TR("Menu", "Default palette"), "defaultpalette", MP, uih_playdefpalette, uih_numdialog); MENUDIALOG_I("fractal", NULL, TR("Menu", "Formula"), "formula", MP, uih_play_formula, uih_formuladialog); MENUDIALOG_I("ui", NULL, TR("Menu", "Maximal zooming step"), "maxstep", MP, uih_setmaxstep, uih_fpdialog); MENUDIALOG_I("ui", NULL, TR("Menu", "Zooming speedup"), "speedup", MP, uih_setspeedup, uih_fpdialog); MENUDIALOG_I("mfilter", NULL, TR("Menu", "Filter"), "filter", MP, uih_playfilter, uih_filterdialog); #undef MP #define UI (MENUFLAG_NOPLAY | MENUFLAG_NOOPTION) MENUCDIALOG_I("ui", NULL, TR("Menu", "Letters per second"), "letterspersec", MENUFLAG_NOMENU, uih_letterspersec, uih_getlettersdialog); MENUCDIALOG_I("uia", NULL, TR("Menu", "Letters per second"), "letters", UI, uih_letterspersec, uih_getlettersdialog); MENUNOP_I("uia", "z", TR("Menu", "Interrupt"), "animinterrupt", MENUFLAG_INTERRUPT | MENUFLAG_INCALC, uih_interrupt); MENUSEPARATOR_I("ui"); MENUNOPCB_I("ui", "/", TR("Menu", "Status"), "status", MENUFLAG_INCALC, uih_status, uih_statusenabled); /*FIXME: add also ? as key */ MENUNOPCB_I("ui", "l", TR("Menu", "Ministatus"), "ministatus", MENUFLAG_INCALC, uih_ministatus, uih_ministatusenabled); MENUNOPCB_I("ui", "g", TR("Menu", "Cartesian Grid"), "cartesiangrid", MENUFLAG_INCALC, uih_cartesiangrid, uih_cartesiangridenabled); MENUSEPARATOR_I("ui"); MENUSEPARATOR_I("uia"); MENUNOPCB_I("uia", "/", TR("Menu", "Status"), "animstatus", UI | MENUFLAG_INCALC, uih_status, uih_statusenabled); /*FIXME: add also ? as key */ MENUNOPCB_I("uia", "l", TR("Menu", "Ministatus"), "animministatus", UI | MENUFLAG_INCALC, uih_ministatus, uih_ministatusenabled); MENUNOPCB_I("uia", "g", TR("Menu", "Cartesian Grid"), "animcartesiangrid", MENUFLAG_INCALC, uih_cartesiangrid, uih_cartesiangridenabled); MENUSEPARATOR_I("uia"); SUBMENU_I("root", "s", TR("Menu", "File"), "file"); SUBMENU_I("root", NULL, TR("Menu", "Edit"), "edit"); SUBMENU_I("root", NULL, TR("Menu", "Fractal"), "fractal"); SUBMENU_I("root", NULL, TR("Menu", "Calculation"), "calc"); SUBMENU_I("root", "e", TR("Menu", "Filters"), "mfilter"); SUBMENU_I("root", NULL, TR("Menu", "Action"), "action"); SUBMENU_I("root", NULL, TR("Menu", "View"), "ui"); SUBMENU_I("root", NULL, TR("Menu", "Help"), "helpmenu"); SUBMENU_I("helpmenu", NULL, TR("Menu", "Tutorials"), "tutor"); SUBMENUNOOPT_I("animroot", "f", TR("Menu", "File"), "file"); // You cannot have menu items directly on the root menu in some OS // So we put the "Stop Replay" item in the UI menu instead MENUSEPARATOR_I("uia"); MENUNOP_I("uia", "s", TR("Menu", "Stop replay"), "stopreplay", UI | MENUFLAG_INTERRUPT, uih_replaydisable); SUBMENUNOOPT_I("animroot", NULL, TR("Menu", "View"), "uia"); SUBMENUNOOPT_I("animroot", NULL, TR("Menu", "Help"), "helpmenu"); MENUDIALOG_I("action", "!", TR("Menu", "Command"), "command", UI, uih_command, dcommand); MENUDIALOG_I("action", NULL, TR("Menu", "Play string"), "playstr", MENUFLAG_NOMENU, uih_playstr, dcommand); MENUSEPARATOR_I("action"); MENUNOP_I("action", NULL, TR("Menu", "Clear screen"), "clearscreen", MENUFLAG_NOOPTION, uih_clearscreen); MENUNOP_I("action", NULL, TR("Menu", "Display fractal"), "display", MENUFLAG_NOOPTION, uih_display); MENUSEPARATOR_I("action"); MENUDIALOG_I("action", NULL, TR("Menu", "Display text"), "text", 0, uih_text, dtextparam); /*FIXME: Should allow multiline */ MENUCDIALOG_I("action", NULL, TR("Menu", "Text color"), "color", 0, uih_setcolor, uih_getcolordialog); SUBMENU_I("action", NULL, TR("Menu", "Horizontal text position"), "xtextpos"); SUBMENU_I("action", NULL, TR("Menu", "Vertical text position"), "ytextpos"); MENUDIALOG_I("action", NULL, TR("Menu", "Text position"), "textposition", MENUFLAG_NOMENU | MENUFLAG_INCALC, uih_playtextpos, uih_textposdialog); MENUDIALOG_I("action", NULL, TR("Menu", "Message"), "message", MENUFLAG_NOMENU, uih_playmessage, dtextparam); /* The following 6 menu options should not be translated. The example files heavily use these constants and lots of examples will not work anymore... :-( Anyway, this should be fixed somehow. */ MENUINTRB_I("ytextpos", NULL, "Up", "ytextup", UI, uih_setytextpos, UIH_TEXTTOP, uih_ytextselected); MENUINTRB_I("ytextpos", NULL, "Middle", "ytextmiddle", UI, uih_setytextpos, UIH_TEXTMIDDLE, uih_ytextselected); MENUINTRB_I("ytextpos", NULL, "Bottom", "ytextbottom", UI, uih_setytextpos, UIH_TEXTBOTTOM, uih_ytextselected); MENUINTRB_I("xtextpos", NULL, "Left", "xtextleft", UI, uih_setxtextpos, UIH_TEXTLEFT, uih_xtextselected); MENUINTRB_I("xtextpos", NULL, "Center", "xtextcenter", UI, uih_setxtextpos, UIH_TEXTCENTER, uih_xtextselected); MENUINTRB_I("xtextpos", NULL, "Right", "xtexteight", UI, uih_setxtextpos, UIH_TEXTRIGHT, uih_xtextselected); MENUNOP_I("file", NULL, TR("Menu", "New"), "initstate", 0, uih_initstate); MENUDIALOG_I("file", NULL, TR("Menu", "Open"), "loadpos", MENUFLAG_INTERRUPT | MENUFLAG_NOPLAY, uih_loadfile, loaddialog); MENUDIALOG_I("file", NULL, TR("Menu", "Save"), "savepos", 0, uih_saveposfile, saveposdialog); SUBMENU_I("file", NULL, TR("Menu", "Save as"), "saveas"); MENUDIALOG_I("saveas", NULL, TR("Menu", "PNG"), "saveimg", 0, uih_savepngfile, saveimgdialog); MENUSEPARATOR_I("file") MENUDIALOGCB_I("file", NULL, TR("Menu", "Record"), "record", 0, uih_saveanimfile, saveanimdialog, uih_saveanimenabled); MENUDIALOG_I("file", NULL, TR("Menu", "Replay"), "play", MENUFLAG_INTERRUPT | MENUFLAG_NOPLAY, uih_playfile, playdialog); MENUSEPARATOR_I("file"); // Rendering activities in the WebAssembly version make little sense, and therefore not supported at the moment: #ifndef __wasm MENUDIALOG_I("file", NULL, TR("Menu", "Render"), "renderanim", UI, uih_render, uih_renderdialog); MENUDIALOG_I("file", NULL, TR("Menu", "Render Image"), "renderimg", UI, uih_renderimg, uih_renderimgdialog); #endif MENUSEPARATOR_I("file"); MENUNOP_I("file", NULL, TR("Menu", "Load random example"), "loadexample", MENUFLAG_INTERRUPT, uih_loadexample); MENUNOP_I("file", NULL, TR("Menu", "Save configuration"), "savecfg", 0, uih_savecfg); MENUSEPARATOR_I("file"); MENUNOP_I("edit", "u", TR("Menu", "Undo"), "undo", MENUFLAG_INTERRUPT | MENUFLAG_NOPLAY | MENUFLAG_NOOPTION, uih_undo); MENUNOP_I("edit", NULL, TR("Menu", "Redo"), "redo", MENUFLAG_INTERRUPT | MENUFLAG_NOPLAY | MENUFLAG_NOOPTION, uih_redo); MENUNOP_I("edit", NULL, TR("Menu", "Copy position URL"), "copyurl", MENUFLAG_INTERRUPT | MENUFLAG_NOPLAY | MENUFLAG_NOOPTION, uih_copyposurl); SUBMENU_I("fractal", NULL, TR("Menu", "Formulae"), "mformula"); SUBMENU_I("fractal", NULL, TR("Menu", "More formulae"), "oformula"); #ifdef USE_SFFE /*FIXME: Should allow multiline */ MENUSEPARATOR_I("fractal"); MENUCDIALOG_I("fractal", NULL, TR("Menu", "User formula"), "usrform", 0, uih_sffein, uih_getsffedialog); MENUCDIALOG_I("fractal", NULL, TR("Menu", "User initialization"), "usrformInit", 0, uih_sffeinitin, uih_getsffeinitdialog); #endif MENUSEPARATOR_I("fractal"); SUBMENU_I("fractal", "f", TR("Menu", "Incoloring mode"), "mincoloring"); SUBMENU_I("fractal", "c", TR("Menu", "Outcoloring mode"), "moutcoloring"); SUBMENU_I("fractal", "i", TR("Menu", "Plane"), "mplane"); SUBMENU_I("fractal", NULL, TR("Menu", "Palette"), "palettemenu"); MENUSEPARATOR_I("fractal"); MENUCDIALOGCB_I( "fractal", "m", TR("Menu", "Mandelbrot mode"), "uimandelbrot", MENUFLAG_DIALOGATDISABLE | MENUFLAG_INTERRUPT | UI, uih_mandelbrotsw, uih_getjuliadialog, uih_mandelbrotselected); MENUDIALOG_I("fractal", NULL, TR("Menu", "Julia mode"), "julia", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_playjulia, uih_juliamodedialog); MENUNOPCB_I("fractal", "j", TR("Menu", "Fast julia mode"), "fastjulia", 0, uih_juliasw, uih_juliaselected); MENUSEPARATOR_I("fractal"); MENUCDIALOG_I("fractal", NULL, TR("Menu", "View"), "uiview", MENUFLAG_INTERRUPT | UI, uih_dview, uih_getviewdialog); MENUDIALOG_I("fractal", NULL, TR("Menu", "View"), "view", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_plview, uih_plviewdialog); SUBMENU_I("fractal", "o", TR("Menu", "Rotation"), "rotate"); MENUDIALOG_I("fractal", NULL, TR("Menu", "Set angle"), "angle", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_angle, uih_angledialog); MENUDIALOG_I("fractal", NULL, TR("Menu", "Set plane"), "plane", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_setplane, uih_numdialog); MENUDIALOG_I("fractal", NULL, TR("Menu", "Inside coloring mode"), "incoloring", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_setincoloringmode, uih_numdialog); MENUDIALOG_I("fractal", NULL, TR("Menu", "Outside coloring mode"), "outcoloring", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_setoutcoloringmode, uih_numdialog); MENUDIALOG_I("fractal", NULL, TR("Menu", "Inside truecolor coloring mode"), "intcoloring", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_setintcolor, uih_numdialog); MENUDIALOG_I("fractal", NULL, TR("Menu", "Outside truecolor coloring mode"), "outtcoloring", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_setouttcolor, uih_numdialog); MENUDIALOG_I("fractal", NULL, TR("Menu", "Julia seed"), "juliaseed", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_setjuliaseed, uih_coorddialog); MENUNOP_I("palettemenu", "d", TR("Menu", "Default palette"), "defpalette", 0, uih_mkdefaultpalette); MENUNOP_I("palettemenu", "p", TR("Menu", "Random palette"), "randompalette", 0, uih_menumkpalette); MENUCDIALOG_I("", NULL, TR("Menu", "Custom palette"), "palette", 0, uih_palette, uih_getpalettedialog); //This is a placeholder menu MENUCDIALOG_I("palettemenu", NULL, TR("Menu", "Custom palette"), "palettegradient", 0, uih_palettegradient, uih_getpalettegradientdialog); MENUSEPARATOR_I("palettemenu"); MENUDIALOG_I("fractal", NULL, TR("Menu", "Palette Colors"), "palettecolors", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_palettecolors, uih_palettecolorsdialog); MENUCDIALOG_I("palettemenu", "x", TR("Menu", "Palette Editor"), "palettepicker", 0, uih_palettepicker, uih_palettepickerdialog); MENUDIALOG_I("palettemenu", NULL, TR("Menu", "Load Palette Config"), "loadgpl", 0, uih_loadgpl, loadgpldialog); MENUDIALOG_I("palettemenu", NULL, TR("Menu", "Save Palette Config"), "savegpl", 0, uih_savegpl, savegpldialog); MENUSEPARATOR_I("palettemenu"); MENUNOPCB_I("palettemenu", "y", TR("Menu", "Color cycling"), "cycling", 0, uih_cyclingsw, uih_cyclingselected); MENUNOPCB_I("palettemenu", "Y", TR("Menu", "Reversed color cycling"), "rcycling", MENUFLAG_NOOPTION | MENUFLAG_NOPLAY, uih_rcyclingsw, uih_rcyclingselected); MENUCDIALOG_I("palettemenu", NULL, TR("Menu", "Color cycling speed"), "cyclingspeed", 0, uih_setcycling, uih_getcyclingdialog); MENUSEPARATOR_I("palettemenu"); MENUDIALOG_I("palettemenu", NULL, TR("Menu", "Shift palette"), "shiftpalette", 0, uih_shiftpalette, uih_shiftdialog); MENUNOP_I("palettemenu", "+", TR("Menu", "Shift one forward"), "fshift", MENUFLAG_NOOPTION | MENUFLAG_NOPLAY, uih_fshift); MENUNOP_I("palettemenu", "-", TR("Menu", "Shift one backward"), "bshift", MENUFLAG_NOOPTION | MENUFLAG_NOPLAY, uih_bshift); SUBMENU_I("calc", NULL, TR("Menu", "Solid guessing"), "mguess"); MENUINTRB_I("mguess", NULL, TR("Menu", "Disable solid guessing"), "noguess", UI, uih_setguessing, 1, uih_guessingselected); MENUSEPARATOR_I("mguess"); MENUINTRB_I("mguess", NULL, TR("Menu", "Guess 2x2 rectangles"), "guess2", UI, uih_setguessing, 2, uih_guessingselected); MENUINTRB_I("mguess", NULL, TR("Menu", "Guess 3x3 rectangles"), "guess3", UI, uih_setguessing, 3, uih_guessingselected); MENUINTRB_I("mguess", NULL, TR("Menu", "Guess 4x4 rectangles"), "guess4", UI, uih_setguessing, 4, uih_guessingselected); MENUINTRB_I("mguess", NULL, TR("Menu", "Guess 5x5 rectangles"), "guess5", UI, uih_setguessing, 5, uih_guessingselected); MENUINTRB_I("mguess", NULL, TR("Menu", "Guess 6x6 rectangles"), "guess6", UI, uih_setguessing, 6, uih_guessingselected); MENUINTRB_I("mguess", NULL, TR("Menu", "Guess 7x7 rectangles"), "guess7", UI, uih_setguessing, 7, uih_guessingselected); MENUINTRB_I("mguess", NULL, TR("Menu", "Guess 8x8 rectangles"), "guess8", UI, uih_setguessing, 8, uih_guessingselected); MENUINTRB_I("mguess", NULL, TR("Menu", "Guess unlimited rectangles"), "guessall", UI, uih_setguessing, 2048, uih_guessingselected); SUBMENU_I("calc", NULL, TR("Menu", "Dynamic resolution"), "dynamic"); MENUNOPCB_I("calc", "k", TR("Menu", "Periodicity checking"), "periodicity", 0, uih_periodicitysw, uih_periodicityselected); MENUSEPARATOR_I("calc"); MENUCDIALOG_I("calc", NULL, TR("Menu", "Threads"), "threads", MENUFLAG_INTERRUPT, uih_setthreads, uih_getthreaddialog); MENUCDIALOG_I("calc", NULL, TR("Menu", "Iterations"), "maxiter", MENUFLAG_INTERRUPT, uih_setmaxiter, uih_getiterdialog); MENUCDIALOG_I("calc", NULL, TR("Menu", "Bailout"), "bailout", MENUFLAG_INTERRUPT, uih_setbailout, uih_getbailoutdialog); MENUCDIALOGCB_I("calc", "b", TR("Menu", "Perturbation"), "uiperturbation", MENUFLAG_INTERRUPT | UI, uih_persw, uih_getperturbationdialog, uih_perselected); MENUCDIALOG_I("calc", NULL, TR("Menu", "Perturbation"), "perturbation", MENUFLAG_NOMENU | MENUFLAG_INTERRUPT, uih_setperbutation, uih_getperturbationdialog); MENUSEPARATOR_I("calc"); MENUCDIALOG_I("calc", NULL, TR("Menu", "Zooming speed"), "speed", 0, uih_setspeed, uih_getspeeddialog); MENUNOPCB_I("calc", NULL, TR("Menu", "Fixed step"), "fixedstep", 0, uih_fixedstepsw, uih_fixedstepselected); MENUSEPARATOR_I("calc"); MENUDIALOG_I("calc", NULL, TR("Menu", "Solid guessing range"), "range", MENUFLAG_NOMENU, uih_setguessing, uih_numdialog); MENUINTRB_I("rotate", NULL, TR("Menu", "Disable rotation"), "norotate", UI, uih_rotate, 0, uih_rotateselected); MENUSEPARATOR_I("rotate"); MENUINTRB_I("rotate", NULL, TR("Menu", "Continuous rotation"), "controtate", UI, uih_rotate, ROTATE_CONTINUOUS, uih_rotateselected); MENUINTRB_I("rotate", NULL, TR("Menu", "Rotate by mouse"), "mouserotate", UI, uih_rotate, ROTATE_MOUSE, uih_rotateselected); MENUCDIALOG_I("rotate", NULL, TR("Menu", "Rotation speed"), "rotationspeed", 0, uih_rotationspeed, uih_getrotationdialog); MENUDIALOG_I("rotate", NULL, TR("Menu", "Automatic rotation"), "autorotate", MENUFLAG_NOMENU, uih_playautorotate, uih_autorotatedialog); MENUDIALOG_I("rotate", NULL, TR("Menu", "Fast rotation mode"), "fastrotate", MENUFLAG_NOMENU, (funcptr)uih_fastrotate, uih_fastrotatedialog); MENUSEPARATOR_I("calc"); MENUNOP_I("calc", "r", TR("Menu", "Recalculate"), "recalculate", 0, uih_recalculate); MENUNOP_I("calc", "z", TR("Menu", "Interrupt"), "interrupt", MENUFLAG_INTERRUPT | MENUFLAG_INCALC, uih_interrupt); MENUINTRB_I("dynamic", NULL, TR("Menu", "Disable dynamic resolution"), "nodynamic", UI, uih_setfastmode, 1, uih_fastmode); MENUSEPARATOR_I("dynamic"); MENUINTRB_I("dynamic", NULL, TR("Menu", "Use only during animation"), "dynamicanimation", UI, uih_setfastmode, 2, uih_fastmode); MENUINTRB_I("dynamic", NULL, TR("Menu", "Use also for new images"), "dynamicnew", UI, uih_setfastmode, 3, uih_fastmode); MENUDIALOG_I("dynamic", NULL, TR("Menu", "Dynamic resolution mode"), "fastmode", MENUFLAG_NOMENU, uih_setfastmode, uih_fastmodedialog); MENUNOPCB_I("ui", "a", TR("Menu", "Autopilot"), "autopilot", 0, uih_autopilotsw, uih_autopilotselected); MENUSEPARATOR_I("ui"); MENUNOPCB_I("ui", "v", TR("Menu", "Hide Messages"), "inhibittextoutput", 0, uih_inhibittextsw, uih_inhibittextselected); /* Language selection is not sensible anymore if i18n is used: */ SUBMENU_I("tutor", NULL, TR("Menu", "An introduction to fractals"), "intro"); SUBMENU_I("tutor", NULL, TR("Menu", "XaoS features overview"), "features"); SUBMENU_I("tutor", NULL, TR("Menu", "Math behind fractals"), "fmath"); SUBMENU_I("tutor", NULL, TR("Menu", "Other fractal types in XaoS"), "otherf"); SUBMENU_I("tutor", NULL, TR("Menu", "What's new?"), "new"); /* Language selection is not sensible anymore if i18n is used: */ TUTOR_I("intro", TR("Menu", "Whole story"), "fractal.xaf"); MENUSEPARATOR_I("intro"); TUTOR_I("intro", TR("Menu", "Introduction"), "intro.xaf"); TUTOR_I("intro", TR("Menu", "Mandelbrot set"), "mset.xaf"); TUTOR_I("intro", TR("Menu", "Julia set"), "julia.xaf"); TUTOR_I("intro", TR("Menu", "Higher power Mandelbrots"), "power.xaf"); TUTOR_I("intro", TR("Menu", "Newton's method"), "newton.xaf"); TUTOR_I("intro", TR("Menu", "Barnsley's formula"), "barnsley.xaf"); TUTOR_I("intro", TR("Menu", "Phoenix"), "phoenix.xaf"); TUTOR_I("intro", TR("Menu", "Octo"), "octo.xaf"); TUTOR_I("intro", TR("Menu", "Magnet"), "magnet.xaf"); TUTOR_I("features", TR("Menu", "All features"), "features.xaf"); MENUSEPARATOR_I("features"); TUTOR_I("features", TR("Menu", "Outcoloring modes"), "outcolor.xaf"); TUTOR_I("features", TR("Menu", "Incoloring modes"), "incolor.xaf"); TUTOR_I("features", TR("Menu", "True-color coloring modes"), "truecol.xaf"); TUTOR_I("features", TR("Menu", "Filters"), "filter.xaf"); TUTOR_I("features", TR("Menu", "Planes"), "plane.xaf"); TUTOR_I("features", TR("Menu", "Animations and position files"), "anim.xaf"); TUTOR_I("features", TR("Menu", "Perturbation"), "pert.xaf"); TUTOR_I("features", TR("Menu", "Random palettes"), "palette.xaf"); TUTOR_I("features", TR("Menu", "Other noteworthy features"), "other.xaf"); TUTOR_I("fmath", TR("Menu", "Whole story"), "fmath.xaf"); MENUSEPARATOR_I("fmath"); TUTOR_I("fmath", TR("Menu", "The definition and fractal dimension"), "dimension.xaf"); TUTOR_I("fmath", TR("Menu", "Escape time fractals"), "escape.xaf"); TUTOR_I("otherf", TR("Menu", "Other fractal types in XaoS"), "otherfr.xaf"); MENUSEPARATOR_I("otherf"); TUTOR_I("otherf", TR("Menu", "Triceratops and Catseye fractals"), "trice.xaf"); TUTOR_I("otherf", TR("Menu", "Mandelbar, Lambda, Manowar and Spider"), "fourfr.xaf"); TUTOR_I("otherf", TR("Menu", "Sierpinski Gasket, S.Carpet, Koch Snowflake"), "classic.xaf"); TUTOR_I("new", TR("Menu", "What's new in 3.0?"), "new30.xaf"); TUTOR_I("new", TR("Menu", "What's new in 4.0?"), "new40.xaf"); if (no_menuitems_i18n > MAX_MENUITEMS_I18N) { fprintf(stderr, "MAX_MENUITEMS_I18N is set to an insufficiently low number, please increase it to %d\n", no_menuitems_i18n); fflush(stderr); exit(1); } #ifdef DEBUG printf("Filled %d menu items out of %d.\n", no_menuitems_i18n, MAX_MENUITEMS_I18N); #endif menu_add(menuitems_i18n, no_menuitems_i18n); uih_no_menuitems_i18n = no_menuitems_i18n; } static const menuitem menuitems2[] = { SUBMENU("mincoloring", NULL, "True-color incoloring mode", "tincoloring"), SUBMENU("moutcoloring", NULL, "True-color outcoloring mode", "toutcoloring")}; static int uih_selectedformula(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->fcontext->currentformula == formulas + n); } static int uih_selectedincoloring(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->fcontext->incoloringmode == n); } static void uih_setintruecolor(struct uih_context *c, int n) { uih_setincoloringmode(c, 10); uih_setintcolor(c, n); } static int uih_selectedintcoloring(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->fcontext->intcolor == n); } static int uih_selectedoutcoloring(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->fcontext->coloringmode == n); } static int uih_selectedplane(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->fcontext->plane == n); } static void uih_setouttruecolor(struct uih_context *c, int n) { uih_setoutcoloringmode(c, 10); uih_setouttcolor(c, n); } static int uih_selectedouttcoloring(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->fcontext->outtcolor == n); } static int uih_filterenabled(struct uih_context *c, int n) { if (c == NULL) return 0; return (c->filter[n] != NULL); } static void uih_filtersw(struct uih_context *c, int n) { if (c->filter[n] != NULL) uih_disablefilter(c, n); else uih_enablefilter(c, n); } static menuitem *formulaitems; static menuitem *filteritems; void uih_registermenus(void) { char keys[2]; menuitem *item; int i; menu_add(menuitems, NITEMS(menuitems)); formulaitems = item = (menuitem *)malloc(sizeof(menuitem) * nformulas); /* This code automatically generates code for fractal, incoloring and other * menus*/ for (i = 0; i < nformulas; i++) { if (i < nmformulas) { item[i].menuname = "mformula"; } else { item[i].menuname = "oformula"; } if (i < 9) keys[0] = '1' + i; else if (i == 9) keys[0] = '0'; else keys[0] = '7' + i; keys[1] = 0; item[i].key = strdup(keys); item[i].type = MENU_INT; item[i].flags = MENUFLAG_RADIO | MENUFLAG_INTERRUPT | MENUFLAG_NOPLAY; item[i].iparam = i; item[i].name = formulas[i].name[!formulas[i].mandelbrot]; item[i].shortname = formulas[i].shortname; item[i].function = (void (*)(void))uih_setformula; item[i].control = (int (*)(void))uih_selectedformula; } menu_add(item, nformulas); menu_genernumbered(INCOLORING - 1, "mincoloring", incolorname, NULL, MENU_INT, UI | MENUFLAG_RADIO | MENUFLAG_INTERRUPT, uih_setincoloringmode, uih_selectedincoloring, "in"); menu_genernumbered(TCOLOR - 1, "tincoloring", tcolorname, NULL, MENU_INT, UI | MENUFLAG_RADIO | MENUFLAG_INTERRUPT, uih_setintruecolor, uih_selectedintcoloring, "int"); menu_genernumbered(OUTCOLORING - 1, "moutcoloring", outcolorname, NULL, MENU_INT, UI | MENUFLAG_RADIO | MENUFLAG_INTERRUPT, uih_setoutcoloringmode, uih_selectedoutcoloring, "out"); menu_genernumbered(TCOLOR - 1, "toutcoloring", tcolorname, NULL, MENU_INT, UI | MENUFLAG_RADIO | MENUFLAG_INTERRUPT, uih_setouttruecolor, uih_selectedouttcoloring, "outt"); { int i; for (i = 0; planename[i] != NULL; i++) ; menu_genernumbered(i, "mplane", planename, NULL, MENU_INT, UI | MENUFLAG_RADIO | MENUFLAG_INTERRUPT, uih_setplane, uih_selectedplane, "plane"); } filteritems = item = (menuitem *)malloc(sizeof(menuitem) * uih_nfilters); /* This code automatically generates code for fractal, incoloring and other * menus*/ for (i = 0; i < uih_nfilters; i++) { item[i].menuname = "mfilter"; item[i].key = NULL; item[i].type = MENU_INT; item[i].flags = MENUFLAG_CHECKBOX | MENUFLAG_INTERRUPT | MENUFLAG_NOPLAY; item[i].iparam = i; item[i].name = uih_filters[i]->name; item[i].shortname = uih_filters[i]->shortname; if (!strcmp(item[i].shortname, "palette")) item[i].shortname = "palettef"; /*this is one name collision because of ugly historical reasons */ item[i].function = (void (*)(void))uih_filtersw; item[i].control = (int (*)(void))uih_filterenabled; } menu_add(item, uih_nfilters); menu_add(menuitems2, NITEMS(menuitems2)); } void uih_unregistermenus(void) { menu_delete(menuitems, NITEMS(menuitems)); menu_delete(menuitems_i18n, uih_no_menuitems_i18n); menu_delete(formulaitems, nformulas); free(formulaitems); menu_delnumbered(INCOLORING - 1, "in"); menu_delnumbered(TCOLOR - 1, "int"); menu_delnumbered(OUTCOLORING - 1, "out"); menu_delnumbered(TCOLOR - 1, "outt"); { int i; for (i = 0; planename[i] != NULL; i++) ; menu_delnumbered(i, "plane"); } menu_delete(filteritems, uih_nfilters); free(filteritems); menu_delete(menuitems2, NITEMS(menuitems2)); } #ifdef USE_SFFE void uih_sffein(uih_context *c, const char *text) { // Keep only top 10 entries QSettings settings; QStringList values = settings.value("Formulas/UserFormulas").toStringList(); values.push_front(text); while (values.size() > 10) values.pop_back(); settings.setValue("Formulas/UserFormulas", values); uih_sffeset(c, c->fcontext->userformula, text); } void uih_sffeinitin(uih_context *c, const char *text) { uih_sffeset(c, c->fcontext->userinitial, text); } #endif XaoS-release-4.3.2/src/ui-hlp/messg.cpp000066400000000000000000000076601455214672000176360ustar00rootroot00000000000000#include #include #include "filter.h" #include "fractal.h" #include "timers.h" #include "ui_helper.h" #include "xerror.h" #include "misc-f.h" #include "grlib.h" #define EXPIRETIME 5000000 static void getpos(uih_context *c, int *x, int *y, int *w, int *h, void *data) { long n = (long)(size_t)data; if (c->messg.message[n] != NULL) { int he = xtextheight(c->image, c->font); *y = c->messg.messagestart + he * n; *h = he; *w = xtextwidth(c->image, c->font, c->messg.message[n]); *x = (c->image->width - *w) / 2; } else { *w = *h = *x = *y = 0; } } static void draw(uih_context *c, void *data) { int x, y, w; long n = (long)(size_t)data; if (c->messg.message[n] != NULL) { int h = xtextheight(c->image, c->font); y = c->messg.messagestart + h * n; w = xtextwidth(c->image, c->font, c->messg.message[n]); x = (c->image->width - w) / 2; if (c->messg.messagetype[n]) xprint(c->image, c->font, x, y, c->messg.message[n], (c->image->flags & AAIMAGE) ? BGCOLOR(c) : SELCOLOR(c), BGCOLOR(c), 0); else xprint(c->image, c->font, x, y, c->messg.message[n], (c->image->flags & AAIMAGE) ? BGCOLOR(c) : FGCOLOR(c), BGCOLOR(c), 0); } } void uih_rmmessage(uih_context *c, int pid) { int i; for (i = 0; i < NMESSAGES && c->messg.pid[i] != pid; i++) ; if (i == NMESSAGES) return; if (c->messg.message[i] == NULL) return; free(c->messg.message[i]); tl_remove_timer(c->messg.messagetimer[i]); tl_free_timer(c->messg.messagetimer[i]); c->messg.message[i] = NULL; for (; i < NMESSAGES - 1; i++) { c->messg.message[i] = c->messg.message[i + 1]; c->messg.messagetimer[i] = c->messg.messagetimer[i + 1]; c->messg.messagetype[i] = c->messg.messagetype[i + 1]; c->messg.pid[i] = c->messg.pid[i + 1]; } c->messg.message[NMESSAGES - 1] = NULL; c->display = 1; } void uih_scrollup(uih_context *c) { uih_rmmessage(c, c->messg.pid[0]); } void uih_clearmessages(uih_context *c) { while (c->messg.message[0] != NULL) uih_scrollup(c); } void uih_initmessages(uih_context *c) { long i; for (i = 0; i < NMESSAGES; i++) { c->messg.message[i] = NULL; c->messg.w[i] = uih_registerw(c, getpos, draw, (void *)(size_t)i, 0); } c->messg.messagestart = 0; } void uih_destroymessages(uih_context *c) { int i; uih_clearmessages(c); for (i = 0; i < NMESSAGES; i++) uih_removew(c, c->messg.w[i]); } static int uih_message1(uih_context *c, const char *message, int type) { static int pid; int i; for (i = 0; i < NMESSAGES && c->messg.message[i] != NULL; i++) ; if (i == NMESSAGES) uih_scrollup(c), i--; c->messg.message[i] = mystrdup(message); c->messg.messagetype[i] = type; c->messg.messagetimer[i] = tl_create_timer(); tl_reset_timer(c->messg.messagetimer[i]); tl_set_interval(c->messg.messagetimer[i], 1); ; tl_slowdown_timer(c->messg.messagetimer[i], EXPIRETIME); ; tl_set_handler(c->messg.messagetimer[i], (void (*)(void *))uih_scrollup, c); tl_add_timer(syncgroup, c->messg.messagetimer[i]); /*tl_remove_timer (c->messg.messagetimer[i]); */ c->messg.pid[i] = ++pid; c->display = 1; return (pid); } int uih_message(uih_context *c, const char *message) { if (c->inhibittextoutput) return 0; return (uih_message1(c, message, 0)); } int uih_error(uih_context *c, const char *error) { char str[256]; // sprintf (str, TR("Error", "Error: %s"), error); sprintf(str, "Error: %s", error); c->errstring = error; return (uih_message1(c, str, 1)); } void uih_printmessages(uih_context *c) { int i; for (i = 0; i < NMESSAGES && c->messg.message[i] != NULL; i++) x_message(c->messg.message[i], stderr); } XaoS-release-4.3.2/src/ui-hlp/play.cpp000066400000000000000000000636471455214672000174740ustar00rootroot00000000000000#include #include #include #include "config.h" #include "filter.h" #include "fractal.h" #include "ui_helper.h" #include "catalog.h" #include "xmenu.h" #include "grlib.h" #include "play.h" #include "i18n.h" #define nextchar() \ (uih->playstring == NULL ? xio_getc(FD) : uih->playstring[uih->playpos++]) #define ungetchar(c) \ (uih->playstring == NULL ? xio_ungetc(c, FD) : uih->playpos--) #define endoffile() \ (uih->playstring == NULL ? xio_feof(FD) \ : uih->playstring[uih->playpos] == 0) static int nonblockmode; static catalog_t *catalog; /*The message catalog should be "session wide" */ const static char *errstring; #define seterr(str) \ { \ if (errstring == NULL) \ errstring = str; \ } #define FD uih->playc->file static char token[1024]; static int first; static int last; static int parsenext; static const char *const animroot = "animroot"; static inline struct uih_line *uih_findkey(uih_context *c, int key) { struct uih_line *l = c->playc->lines.first; while (l != NULL) { if (l->key == key) return l; l = l->next; } return NULL; } static inline void uih_removeline(uih_context *c, struct uih_line *l) { if (l == NULL) return; uih_removew(c, l->w); if (l->prev) l->prev->next = l->next; else c->playc->lines.first = l->next; if (l->next) l->next->prev = l->prev; free(l); } void uih_line(uih_context *c, dialogparam *d) { struct uih_window *w; struct uih_line *l; if (c->playstring != NULL) { seterr(TR("Error", "line available only in animation replay")); return; } w = uih_registerline(c, 0, -1, -1, -1, -1); uih_removeline(c, uih_findkey(c, c->playc->lines.currkey)); l = (struct uih_line *)calloc(1, sizeof(*l)); l->posmode = d[0].dint; l->w = w; l->x1 = d[1].dcoord[0]; l->y1 = d[1].dcoord[1]; l->x2 = d[2].dcoord[0]; l->y2 = d[2].dcoord[1]; l->color = c->color; l->morph = 0; l->key = c->playc->lines.currkey++; l->prev = NULL; l->next = c->playc->lines.first; c->playc->lines.first = l; } void uih_morphline(uih_context *c, dialogparam *d) { struct uih_line *l; l = uih_findkey(c, c->playc->lines.currkey); if (l == NULL) { seterr(TR("Error", "Morphing non existing line!")); return; } c->playc->lines.currkey++; l->mposmode = d[0].dint; l->mx1 = d[1].dcoord[0]; l->my1 = d[1].dcoord[1]; l->mx2 = d[2].dcoord[0]; l->my2 = d[2].dcoord[1]; l->morph = 1; c->playc->lines.morphing = 1; } void uih_morphlastline(uih_context *c, dialogparam *d) { c->playc->lines.currkey--; uih_morphline(c, d); } void uih_setkey(uih_context *c, int line) { if (!c->play) { seterr(TR("Error", "linekey not available in this context!")); return; } c->playc->lines.currkey = line; } static void uih_stopmorphing(uih_context *c) { struct uih_line *l = c->playc->lines.first; while (l) { if (l->morph) { l->x1 = l->mx1; l->y1 = l->my1; l->x2 = l->mx2; l->y2 = l->my2; l->posmode = l->mposmode; l->morph = 0; c->playc->lines.morphing = 1; } l = l->next; } } void uih_update_lines(uih_context *c) { int m = 0; int co; struct uih_line *l = c->playc->lines.first; int x1, y1, x2, y2; number_t x, y; int timer = tl_lookup_timer(c->playc->timer) - c->playc->starttime; number_t mmul = /*(tl_lookup_timer (c->playc->timer) - c->playc->starttime) / (number_t) (c->playc->frametime - c->playc->starttime); */ MORPHVALUE(timer, c->playc->frametime - c->playc->starttime, c->playc->morphlinetimes[0], c->playc->morphlinetimes[1]); while (l) { switch (l->posmode) { case 0: x1 = (int)(c->image->width * l->x1); y1 = (int)(c->image->height * l->y1); x2 = (int)(c->image->width * l->x2); y2 = (int)(c->image->height * l->y2); break; case 1: x = c->image->width * c->image->pixelwidth; y = c->image->height * c->image->pixelheight; if (x > y) x = y; x1 = (int)(c->image->width / 2 + (l->x1 - 0.5) * x / c->image->pixelwidth); y1 = (int)(c->image->height / 2 + (l->y1 - 0.5) * x / c->image->pixelheight); x2 = (int)(c->image->width / 2 + (l->x2 - 0.5) * x / c->image->pixelwidth); y2 = (int)(c->image->height / 2 + (l->y2 - 0.5) * x / c->image->pixelheight); break; case 2: x = l->x1; y = l->y1; my_rotate(*(c->fcontext), x, y); x = (x - c->fcontext->rs.nc) / (c->fcontext->rs.mc - c->fcontext->rs.nc) * c->zengine->image->width; y = (y - c->fcontext->rs.ni) / (c->fcontext->rs.mi - c->fcontext->rs.ni) * c->zengine->image->height; x1 = (int)x; y1 = (int)y; c->zengine->action->convertup(c->zengine, &x1, &y1); x = l->x2; y = l->y2; my_rotate(*(c->fcontext), x, y); x = (x - c->fcontext->rs.nc) / (c->fcontext->rs.mc - c->fcontext->rs.nc) * c->zengine->image->width; y = (y - c->fcontext->rs.ni) / (c->fcontext->rs.mi - c->fcontext->rs.ni) * c->zengine->image->height; x2 = (int)x; y2 = (int)y; c->zengine->action->convertup(c->zengine, &x2, &y2); break; } if (l->morph) { int mx1, mx2, my1, my2; m = 1; switch (l->mposmode) { case 0: mx1 = (int)(c->image->width * l->mx1); my1 = (int)(c->image->height * l->my1); mx2 = (int)(c->image->width * l->mx2); my2 = (int)(c->image->height * l->my2); break; case 1: x = c->image->width * c->image->pixelwidth; y = c->image->height * c->image->pixelheight; if (x > y) x = y; mx1 = (int)(c->image->width / 2 + (l->mx1 - 0.5) * x / c->image->pixelwidth); my1 = (int)(c->image->height / 2 + (l->my1 - 0.5) * x / c->image->pixelheight); mx2 = (int)(c->image->width / 2 + (l->mx2 - 0.5) * x / c->image->pixelwidth); my2 = (int)(c->image->height / 2 + (l->my2 - 0.5) * x / c->image->pixelheight); break; default: x = l->mx1; y = l->my1; my_rotate(*(c->fcontext), x, y); x = (x - c->fcontext->rs.nc) / (c->fcontext->rs.mc - c->fcontext->rs.nc) * c->zengine->image->width; y = (y - c->fcontext->rs.ni) / (c->fcontext->rs.mi - c->fcontext->rs.ni) * c->zengine->image->height; mx1 = (int)x; my1 = (int)y; c->zengine->action->convertup(c->zengine, &mx1, &my1); x = l->mx2; y = l->my2; my_rotate(*(c->fcontext), x, y); x = (x - c->fcontext->rs.nc) / (c->fcontext->rs.mc - c->fcontext->rs.nc) * c->zengine->image->width; y = (y - c->fcontext->rs.ni) / (c->fcontext->rs.mi - c->fcontext->rs.ni) * c->zengine->image->height; mx2 = (int)x; my2 = (int)y; c->zengine->action->convertup(c->zengine, &mx2, &my2); break; } x1 = (int)(x1 + (mx1 - x1) * mmul); y1 = (int)(y1 + (my1 - y1) * mmul); x2 = (int)(x2 + (mx2 - x2) * mmul); y2 = (int)(y2 + (my2 - y2) * mmul); } switch (l->color) { case 1: co = BGCOLOR(c); break; case 0: co = FGCOLOR(c); break; default: co = SELCOLOR(c); break; } uih_setline(c, l->w, co, x1, y1, x2, y2); l = l->next; } c->playc->lines.morphing = m; if (m) c->display = 1; } void uih_clear_line(uih_context *c) { if (c->playstring != NULL) { seterr(TR("Error", "clear_line available only in animation replay")); return; } uih_removeline(c, uih_findkey(c, c->playc->lines.currkey++)); } void uih_clear_lines(uih_context *c) { if (c->playstring != NULL) { seterr(TR("Error", "clear_lines available only in animation replay")); return; } while (c->playc->lines.first != NULL) uih_removeline(c, c->playc->lines.first); c->playc->lines.currkey = 0; } void uih_freecatalog(uih_context */*c*/) { if (catalog != NULL) free_catalog(catalog), catalog = NULL; } void uih_setfont(struct uih_context */*uih*/) {} int uih_loadcatalog(uih_context *c, const char *name) { static int firsttime = 1; static const char *str; xio_file f = xio_getcatalog(name); if (f == XIO_FAILED) { if (firsttime) { firsttime = 0; return 0; } /*Let XaoS work as stand alone executable */ uih_error(c, TR("Error", "Catalog file not found")); return 0; } firsttime = 0; if (catalog != NULL) free_catalog(catalog); catalog = load_catalog(f, &str); if (str != NULL) uih_error(c, str); uih_setfont(c); return (catalog != NULL); } static void handler(void *userdata) { struct uih_context *uih = (struct uih_context *)userdata; uih->playc->playframe++; uih->inanimation = 2; if (uih->playc->timerin) tl_remove_timer(uih->playc->timer); uih->playc->timerin = 0; } static void handler1(void *userdata) { struct uih_context *uih = (struct uih_context *)userdata; uih->playc->playframe++; uih->inanimation = 2; tl_update_time(); tl_reset_timer(uih->playc->timer); uih_setcomplettehandler(uih, NULL, NULL); } void uih_skipframe(struct uih_context *uih) { if (uih->play && uih->playc->timerin) handler(uih), tl_reset_timer(uih->playc->timer); } int uih_replayenable(struct uih_context *uih, xio_file f, xio_constpath filename, int animr) { struct uih_playcontext *p; const char *s; if (uih->play) { uih_error(uih, TR("Error", "Replay is already active")); return 0; } if (f == XIO_FAILED) { uih_error(uih, TR("Error", "File open failed")); return 0; } p = (struct uih_playcontext *)calloc(1, sizeof(*p)); if (p == NULL) { uih_error(uih, TR("Error", "Out of memory")); return 0; } if (animr) { uih->menuroot = animroot; uih_updatemenus(uih, NULL); } p->file = f; p->playframe = 1; p->timer = tl_create_timer(); p->frametime = 0; p->morph = 0; p->morphjulia = 0; p->lines.first = NULL; p->lines.morphing = 0; p->lines.currkey = 0; tl_update_time(); tl_set_handler(p->timer, handler, uih); uih_stoptimers(uih); if (uih->stoppedtimers) tl_stop_timer(p->timer); uih->playc = p; uih->play = 1; uih_emulatetimers(uih); tl_reset_timer(p->timer); uih->playc->line = 1; if (filename != NULL) { uih->playc->directory = xio_getdirectory(filename); } else { uih->playc->directory = xio_getdirectory(XIO_EMPTYPATH); } uih->playc->level = 0; s = uih->playstring; uih->playstring = NULL; uih_playupdate(uih); uih->playstring = s; return 1; } void uih_replaydisable(struct uih_context *uih) { if (uih->play) { int i; uih->play = 0; tl_free_timer(uih->playc->timer); if (uih->menuroot == animroot) { uih->menuroot = "root"; uih_updatemenus(uih, NULL); } xio_close(uih->playc->file); for (i = 0; i < uih->playc->level; i++) xio_close(uih->playc->prevfiles[i]); uih->display = 1; uih->nonfractalscreen = 0; uih_setcomplettehandler(uih, NULL, NULL); uih_clear_lines(uih); free(uih->playc->directory); free(uih->playc); uih_display(uih); } } static void skipblank(struct uih_context *uih) { int c; if (uih->playstring != NULL) { while ((uih->playstring[uih->playpos] == ' ' || uih->playstring[uih->playpos] == '\t' || uih->playstring[uih->playpos] == '\r' || uih->playstring[uih->playpos] == '\n')) uih->playpos++; return; } do { c = xio_getc(FD); if (c == '\n') uih->playc->line++; if (c == ';') while (c != '\n' && !xio_feof(FD)) { c = xio_getc(FD); if (c == '\n') uih->playc->line++; } while (xio_feof(FD) && uih->playc->level) { c = XIO_EOF + 1; xio_close(FD); uih->playc->file = uih->playc->prevfiles[--uih->playc->level]; uih->playc->line = 1; } } while (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == XIO_EOF + 1); if (c != XIO_EOF) xio_ungetc(c, FD); } static int gettoken(struct uih_context *uih) { int c; int i = 0; skipblank(uih); if (first && ((c = nextchar()) != '(')) { if (c && !endoffile()) { seterr("'(' expected"); } last = 1; return -1; } if (first) skipblank(uih), first = 0; if (endoffile()) { if (uih->playstring) { seterr(TR("Error", "Missing parameter")); } else seterr(TR("Error", "Unexpected end of file")); return 0; } if ((c = nextchar()) == '"') { while (c == '\r') c = nextchar(); token[i] = '"'; i++; do { c = nextchar(); while (c == '\r') c = nextchar(); if (c == XIO_EOF || c == 0) { if (uih->playstring) { seterr(TR("Error", "Missing parameter")); } else seterr(TR("Error", "Unexpected end of file")); return 0; } if (c == '\n' && uih->playstring == NULL) uih->playc->line++; if (c == '\\') token[i] = nextchar(); else token[i] = c; i++; if (i >= 1024) { seterr(TR("Error", "Token is too long")); i = 0; } } while (c != '"'); } else ungetchar(c); do { c = nextchar(); if (c == XIO_EOF || c == 0) { if (uih->playstring) { seterr(TR("Error", "Missing parameter")); } else seterr(TR("Error", "Unexpected end of file")); return 0; } token[i] = c; i++; if (i >= 1024) { seterr(TR("Error", "Token is too long")); i = 0; } } while (c != ' ' && c != '\t' && c != ')' && c != '\n' && c != '\r'); i--; token[i] = 0; skipblank(uih); if (c == ')') { last = 1; return i; } c = nextchar(); if (uih->playstring == NULL) { while (xio_feof(FD) && uih->playc->level) uih->playc->file = uih->playc->prevfiles[--uih->playc->level], uih->playc->line = 1; } if (c == XIO_EOF || c == 0) { if (uih->playstring) { seterr(TR("Error", "Missing parameter")); } else seterr(TR("Error", "Unexpected end of file")); return 0; } if (c == ')') { last = 1; return i; } ungetchar(c); return i; } static char *gettokenwr(struct uih_context *c) { if (last) return NULL; if (gettoken(c) < 0) return NULL; if (errstring) return NULL; return (token); } void uih_play_formula(struct uih_context *uih, const char *fname) { int i; for (i = 0; i < nformulas; i++) { if (!strcmp(formulas[i].shortname, fname)) { set_formula(uih->fcontext, i); uih_newimage(uih); return; } } seterr(TR("Error", "Unknown formula type")); } void uih_playmorph(struct uih_context *uih, dialogparam *d) { if (uih->playstring != NULL) { seterr(TR("Error", "morph available only in animation replay")); return; } if (d[2].number <= 0 || d[3].number <= 0) { seterr(TR("Error", "morphview: Invalid viewpoint")); uih->playc->destination = uih->fcontext->currentformula->v; } uih->playc->source = uih->fcontext->s; uih->playc->destination.cr = d[0].number; uih->playc->destination.ci = d[1].number; uih->playc->destination.rr = d[2].number; uih->playc->destination.ri = d[3].number; uih->playc->morph = 1; } void uih_playmove(struct uih_context *uih, number_t x, number_t y) { if (uih->playstring != NULL) { seterr(TR("Error", "move available only in animation replay")); return; } uih->playc->source = uih->fcontext->s; uih->playc->destination.cr = x; uih->playc->destination.ci = y; uih->playc->destination.rr = uih->fcontext->s.rr; uih->playc->destination.ri = uih->fcontext->s.ri; uih->playc->morph = 1; } void uih_playmorphjulia(struct uih_context *uih, number_t x, number_t y) { if (uih->playstring != NULL) { seterr(TR("Error", "morphjulia available only in animation replay")); return; } uih->playc->sr = uih->fcontext->pre; uih->playc->si = uih->fcontext->pim; uih->playc->dr = x; uih->playc->di = y; uih->playc->morphjulia = 1; } void uih_playmorphangle(struct uih_context *uih, number_t angle) { if (uih->playstring != NULL) { seterr(TR("Error", "morphangle available only in animation replay")); return; } uih->playc->morphangle = 1; uih->playc->srcangle = uih->fcontext->angle; uih->playc->destangle = angle; } void uih_playautorotate(struct uih_context *uih, int mode) { if (mode) { uih_fastrotateenable(uih); uih_rotatemode(uih, ROTATE_CONTINUOUS); } else uih_rotatemode(uih, ROTATE_NONE); } void uih_playfilter(struct uih_context *uih, dialogparam *p) { const char *fname = p[0].dstring; int mode; int i; // ignore removed truecolor filter in old xpf/xaf files that used it. if (!strcmp("truecolor", fname)) return; for (i = 0; i < uih_nfilters; i++) { if (!strcmp(uih_filters[i]->shortname, fname)) { mode = p[1].dint; if (mode) uih_enablefilter(uih, i); else uih_disablefilter(uih, i); return; } } seterr(TR("Error", "Unknown filter")); } void uih_playdefpalette(struct uih_context *uih, int shift) { if (uih->zengine->fractalc->palette == NULL) return; if (mkdefaultpalette(uih->zengine->fractalc->palette) != 0) { uih_newimage(uih); } uih->palettetype = 0; uih->palettechanged = 1; if (shiftpalette(uih->zengine->fractalc->palette, shift)) { uih_newimage(uih); } uih->manualpaletteshift = 0; uih->paletteshift = shift; } void uih_zoomcenter(struct uih_context *uih, number_t x, number_t y) { uih->xcenter = x; uih->ycenter = y; uih->xcenterm = INT_MAX; uih->ycenterm = INT_MAX; } void uih_playtextpos(struct uih_context *uih, dialogparam *p) { int x, y; x = p[0].dint; y = p[1].dint; uih_settextpos(uih, x, y); } void uih_playusleep(struct uih_context *uih, int time) { parsenext = 0; if (uih->playstring != NULL) { seterr(TR("Error", "sleep available only in animation replay")); return; } uih->playc->frametime = time; if (time < tl_lookup_timer( uih->playc->timer) /*&&((!uih->step)||(!uih->zoomactive)) */ ) { tl_slowdown_timer(uih->playc->timer, time); uih->playc->playframe++; } else { tl_set_interval(uih->playc->timer, time); if (!uih->playc->timerin) { uih->playc->timerin = 1; tl_add_timer(syncgroup, uih->playc->timer); } else printf(TR("Error", "Internal program error #12 %i\n"), uih->playc->playframe); } uih->playc->starttime = tl_lookup_timer(uih->playc->timer); } void uih_playtextsleep(struct uih_context *uih) { uih_playusleep(uih, 500000 + 1000000 * (uih->nletters + uih->todisplayletters) / uih->letterspersec); uih->nletters = 0; uih->todisplayletters = 0; } void uih_playwait(struct uih_context *uih) { parsenext = 0; if (uih->playstring != NULL) { seterr(TR("Error", "wait available only in animation replay")); return; } if (!uih->incomplete && !uih->display && !uih->recalculatemode && !uih->displaytext && !uih->clearscreen) { uih->playc->playframe++; } else { uih_setcomplettehandler(uih, handler1, uih); } } void uih_playjulia(struct uih_context *uih, int julia) { julia = !julia; if (julia != uih->fcontext->mandelbrot) { uih->fcontext->mandelbrot = julia; uih->fcontext->version++; uih_updatemenus(uih, "uimandelbrot"); uih_newimage(uih); } } void uih_playcalculate(struct uih_context *uih) { uih_newimage(uih); } void uih_playzoom(struct uih_context *uih) { uih->zoomactive = 1; } void uih_playunzoom(struct uih_context *uih) { uih->zoomactive = -1; } void uih_playstop(struct uih_context *uih) { uih->zoomactive = 0; } void uih_playmessage(struct uih_context *uih, char *name) { char *message; if (catalog == NULL) { uih_text(uih, TR("Error", "No catalog file loaded")); return; } message = find_text(catalog, name); if (message == NULL) { uih_text(uih, TR("Error", "Message not found in catalog file")); return; } uih_text(uih, message); } void uih_playload(struct uih_context *uih, xio_path file) { xio_file f; xio_pathdata tmp; if (uih->playstring != NULL) { seterr(TR("Error", "load available only in animation replay")); return; } if (uih->playc->level == MAXLEVEL) { seterr(TR("Error", "Include level overflow")); return; } xio_addfname(tmp, uih->playc->directory, file); f = xio_ropen(tmp); if (f == XIO_FAILED) { seterr(TR("Error", "File not found")); return; } uih->playc->prevfiles[uih->playc->level] = uih->playc->file; uih->playc->level++; uih->playc->file = f; uih->playc->line = 1; } static void uih_processcommand(struct uih_context *uih, int flags) { const char *error; first = 1; last = 0; error = menu_processcommand(uih, gettokenwr, 1, flags, uih->menuroot); if (error != NULL) seterr(error); if (!last) { seterr(TR("Error", "Too many parameters")); } } void uih_playupdate(struct uih_context *uih) { static char errtext[1024]; errstring = NULL; while (uih->play && uih->playc->playframe && errstring == NULL) { parsenext = 1; uih->playc->playframe--; if (uih->playc->lines.morphing) { uih_stopmorphing(uih); uih->display = 1; } if (uih->playc->morph) { uih->fcontext->s = uih->playc->destination; uih_animate_image(uih); uih->playc->morph = 0; } if (uih->playc->morphangle) { uih_angle(uih, uih->playc->destangle); uih->playc->morphangle = 0; } if (uih->playc->morphjulia) { uih_setjuliaseed(uih, uih->playc->dr, uih->playc->di); uih->playc->morphjulia = 0; } while (!xio_feof(FD) && parsenext && errstring == NULL) { uih_processcommand(uih, MENUFLAG_NOPLAY); } /*while parsenext */ uih_update_lines(uih); if (errstring != NULL) { uih_error(uih, errstring); if (uih->play) { sprintf(errtext, TR("Message", "Replay disabled at line %i"), uih->playc->line); uih_message(uih, errtext); } /*errstring[255]=0; */ } if ((xio_feof(FD) && parsenext) || errstring) { uih_replaydisable(uih); } } /*while play&&playframe */ } void uih_load(struct uih_context *uih, xio_file f, xio_constpath filename) { nonblockmode = 1; uih_replayenable(uih, f, filename, 0); uih_replaydisable(uih); nonblockmode = 0; } void uih_command(struct uih_context *uih, const char *command) { errstring = NULL; uih->playpos = 0; uih->playstring = command; uih_processcommand(uih, (uih->play ? MENUFLAG_NOMENU : 0)); uih->playstring = NULL; if (errstring != NULL) { uih_error(uih, errstring); } } XaoS-release-4.3.2/src/ui-hlp/play.h000066400000000000000000000036501455214672000171250ustar00rootroot00000000000000#ifndef PLAY_H #define PLAY_H struct keyword { char *name; int type; void (*callback)(void); void *userdata; }; typedef void (*funcptr)(void); #define GENERIC 0 #define PARAM_INTEGER 1 #define PARAM_BOOL 2 #define PARAM_NSTRING 3 #define PARAM_FLOAT 4 #define PARAM_KEYSTRING 5 #define PARAM_COORD 6 #define PARAM_STRING 7 extern const char *const save_fastmode[]; extern const char *const uih_colornames[]; void uih_play_formula(struct uih_context *uih, const char *name); void uih_playfilter(struct uih_context *uih, dialogparam *p); void uih_zoomcenter(struct uih_context *uih, number_t x, number_t y); void uih_playpalette(struct uih_context *uih); void uih_playdefpalette(struct uih_context *uih, int shift); void uih_playusleep(struct uih_context *uih, int time); void uih_playtextsleep(struct uih_context *uih); void uih_playwait(struct uih_context *uih); void uih_playjulia(struct uih_context *uih, int julia); void uih_playzoom(struct uih_context *uih); void uih_playunzoom(struct uih_context *uih); void uih_playstop(struct uih_context *uih); void uih_playmorph(struct uih_context *uih, dialogparam *p); void uih_playmove(struct uih_context *uih, number_t x, number_t y); void uih_playtextpos(struct uih_context *uih, dialogparam *p); void uih_playcalculate(struct uih_context *uih); void uih_playmorphjulia(struct uih_context *uih, number_t x, number_t y); void uih_playmorphangle(struct uih_context *uih, number_t angle); void uih_playautorotate(struct uih_context *uih, int mode); void uih_playmessage(struct uih_context *uih, char *message); void uih_playload(struct uih_context *uih, char *message); void uih_playinit(struct uih_context *uih); void uih_line(uih_context *c, dialogparam *d); void uih_morphline(uih_context *c, dialogparam *d); void uih_morphlastline(uih_context *c, dialogparam *d); void uih_setkey(uih_context *c, int line); void uih_clear_line(uih_context *c); void uih_clear_lines(uih_context *c); #endif XaoS-release-4.3.2/src/ui-hlp/playtext.cpp000066400000000000000000000101341455214672000203600ustar00rootroot00000000000000#include #include "config.h" #include "filter.h" #include "fractal.h" #include "ui_helper.h" #include "xerror.h" #include "grlib.h" static inline void prepare(struct uih_context *c, char *string, int *xmax, int *nr) { int xm = 0; int n = 1; int pos = 0; int tmp; while (1) { tmp = 0; while (*string != '\n') { if (*string == 0) { tmp++; if (tmp > xm) xm = tmp; *xmax = xm; *nr = n; return; } else tmp += xtextcharw(c->image, c->font, *string); if (pos > 255) break; string++; pos++; } tmp++; if (tmp > xm) xm = tmp; n++; if (n > 30) { n = 30; *xmax = tmp; *nr = n; return; } pos = 0; string++; } } static void getpos(uih_context *c, int *x, int *y, int *w, int *h, void *data) { long num = (long)(size_t)data; int xmax, nr; if (c->text[num] == NULL) { *x = *y = *h = *w; return; } prepare(c, c->text[num], &xmax, &nr); nr *= xtextheight(c->image, c->font); switch (num) { case 0: *y = 0; break; case 1: *y = (c->image->height - nr) / 2; break; case 2: *y = c->image->height - nr; break; } *h = nr; switch (c->textpos[num]) { case 0: *x = 0; break; case 1: *x = (c->image->width - xmax) / 2; break; case 2: *x = c->image->width - xmax; break; } *w = xmax; } static void draw(uih_context *c, void *data) { long num = (long)(size_t)data; int flags = 0; int xmax, n, nr, i; int x = 0, y = 0; char *string; int fgcolor = 0, bgcolor = 0; if (c->text[num] == NULL) return; prepare(c, c->text[num], &xmax, &n); nr = n * xtextheight(c->image, c->font); switch (c->textcolor[num]) { case 0: fgcolor = FGCOLOR(c); bgcolor = BGCOLOR(c); break; case 1: fgcolor = BGCOLOR(c); bgcolor = BGCOLOR(c); flags = TEXT_PRESSED; break; case 2: fgcolor = SELCOLOR(c); bgcolor = BGCOLOR(c); break; default: x_fatalerror("playtext:unknown color\n"); } if (c->image->flags & AAIMAGE) fgcolor = BGCOLOR(c); switch (num) { case 0: y = 0; break; case 1: y = (c->image->height - nr) / 2; break; case 2: y = c->image->height - nr; break; } string = c->text[num]; for (i = 0; i < n; i++) { xmax = xtextwidth(c->image, c->font, string); switch (c->textpos[num]) { case 0: x = 0; break; case 1: x = (c->image->width - xmax) / 2; break; case 2: x = c->image->width - xmax; break; } string += xprint(c->image, c->font, x, y, string, fgcolor, bgcolor, flags) + 1; y += xtextheight(c->image, c->font); } } void uih_inittext(uih_context *c) { c->text[0] = c->text[1] = c->text[2] = NULL; c->textpos[0] = c->textpos[1] = c->textpos[2] = 0; c->textwindow[0] = uih_registerw(c, getpos, draw, (void *)0, 0); c->textwindow[1] = uih_registerw(c, getpos, draw, (void *)1, 0); c->textwindow[2] = uih_registerw(c, getpos, draw, (void *)2, 0); } void uih_destroytext(uih_context *c) { if (c->text[0] != NULL) free(c->text[0]), c->text[0] = NULL; if (c->text[1] != NULL) free(c->text[1]), c->text[1] = NULL; if (c->text[2] != NULL) free(c->text[2]), c->text[2] = NULL; uih_removew(c, c->textwindow[0]); uih_removew(c, c->textwindow[1]); uih_removew(c, c->textwindow[2]); } XaoS-release-4.3.2/src/ui-hlp/render.cpp000066400000000000000000000306731455214672000177770ustar00rootroot00000000000000 #include #include #include #include #include #ifndef _WIN32 #include #endif #include "config.h" #include "filter.h" #include "fractal.h" #include "ui_helper.h" #include "misc-f.h" #include "xmenu.h" #include "xerror.h" #include "i18n.h" #define SILENT 0 #define ERRORS 1 #define MESSAGES 2 #define ALL 3 static int noiselevel; /*static struct uih_context *uih, *gc;*/ static struct uih_context *gc; static struct uih_context *uih; static int newline = 1; static int interrupt = 0; static void error(const char *str) { if (noiselevel < ERRORS) return; if (!gc) x_error(TR("Error", "Error: %s"), str); uih_error(gc, str); } static void uiherror(struct uih_context *c) { if (noiselevel < ERRORS) return; if (!gc) { uih_printmessages(c); } else uih_error(gc, uih->errstring); } static void printmsg(const char *text, ...) { va_list ap; if (noiselevel < MESSAGES) return; va_start(ap, text); if (!gc) { vprintf(text, ap); printf("\n"); } else { char s[256]; vsnprintf(s, 256, text, ap); uih_message(gc, s); interrupt |= gc->interrupt |= gc->passfunc(gc, 1, s, 100); uih_clearwindows(gc); } } static int passfunc(struct uih_context */*c*/, int display, const char *text, float percent) { if (noiselevel < ALL) return 0; if (gc) { if (gc->passfunc != NULL) interrupt |= gc->interrupt |= gc->passfunc(gc, display, text, percent); uih_clearwindows(gc); return interrupt; } else if (display) { { if (newline) printf("\n"), newline = 0; printf("\r %s %3.2f%% ", text, (double)percent); fflush(stdout); } } return 0; } struct frame_info { vrect rect; number_t angle; char *name; int newimage; }; int uih_renderanimation(struct uih_context *gc1, const char *basename, xio_constpath animation, int width, int height, float pixelwidth, float pixelheight, int frametime, int type, int antialias, int slowmode, int letterspersec, const char *catalog) { struct palette *pal = createpalette(0, 0, TRUECOLOR, 0, 0, NULL, NULL, NULL, NULL, NULL); struct image *img; xio_file af; char s[200]; int lastframenum = -1; int aliasnum = 0; static char *saveddata; int newimage; int y; struct frame_info curframe; int framenum = 0; noiselevel = ALL; gc = gc1; if (gc) gc->incalculation = 1; printmsg(TR("Message", "Initializing")); if (!(type & (TRUECOLOR24 | TRUECOLOR | TRUECOLOR16 | GRAYSCALE))) antialias = 0; while (uih_filters[aliasnum] != &antialias_filter) aliasnum++; if (!pal) { error(TR("Error", "Cannot create palette")); if (gc) gc->incalculation = 0; return 0; } if (!pixelwidth) pixelwidth = 0.025; // pixel pitch of modern non-retina monitors is // roughly in this range if (!pixelheight) pixelheight = 0.025; // most importantly pixels should be square to // avoid distorted image img = create_image_qt(width, height, pal, pixelwidth, pixelheight); if (!img) { error(TR("Error", "Cannot create image\n")); if (gc) gc->incalculation = 0; destroypalette(pal); return 0; } saveddata = (char *)malloc(img->width * img->height * img->bytesperpixel); if (saveddata == NULL) { error(TR("Error", "Cannot create checking buffer!")); if (gc) gc->incalculation = 0; destroy_image(img); destroypalette(pal); return 0; } uih = uih_mkcontext(0, img, passfunc, NULL, NULL); if (!uih) { error(TR("Error", "Cannot create context\n")); if (gc) gc->incalculation = 0; destroy_image(img); destroypalette(pal); free(saveddata); return 0; } if(gc1) uih->font = gc1->font; uih->fcontext->slowmode = 1; uih_constantframetime(uih, frametime); af = xio_ropen(animation); if (af == NULL) { error(TR("Error", "Cannot open animation file\n")); if (gc) gc->incalculation = 0; uih_freecontext(uih); destroy_image(img); destroypalette(pal); free(saveddata); return 0; } if (!gc) { printmsg(TR("Message", "Loading catalogs")); if (!gc) { uih_loadcatalog(uih, "english"); if (uih->errstring) { uiherror(uih); if (gc) gc->incalculation = 0; uih_freecontext(uih); destroy_image(img); destroypalette(pal); free(saveddata); xio_close(af); return 0; } } if (catalog != NULL) uih_loadcatalog(uih, catalog); if (uih->errstring) { uiherror(uih); if (gc) gc->incalculation = 0; uih_freecontext(uih); destroy_image(img); destroypalette(pal); free(saveddata); if (!gc) uih_freecatalog(uih); xio_close(af); return 0; } printmsg(TR("Message", "Processing command line options")); { const menuitem *item; dialogparam *d; while ((item = menu_delqueue(&d)) != NULL) { menu_activate(item, uih, d); } } if (uih->errstring) { uiherror(uih); if (gc) gc->incalculation = 0; uih_freecontext(uih); destroy_image(img); destroypalette(pal); free(saveddata); if (!gc) uih_freecatalog(uih); xio_close(af); return 0; } } printmsg(TR("Message", "Enabling animation replay\n")); uih_replayenable(uih, af, animation, 1); uih_letterspersec(uih, letterspersec); if (!gc) x_message(TR("Message", "Entering calculation loop!")); else printmsg(TR("Message", "Entering calculation loop!")); while ((uih->play || uih->display) && !interrupt) { if (uih->errstring) { uiherror(uih); if (gc) gc->incalculation = 0; uih_freecontext(uih); destroy_image(img); destroypalette(pal); free(saveddata); if (!gc) uih_freecatalog(uih); return 0; } fflush(stdout); tl_process_group(syncgroup, NULL); uih_update(uih, 0, 0, 0); if (uih->display) { printmsg(TR("Message", "Rendering frame %i..."), framenum); newline = 1; newimage = 0; if (uih->recalculatemode > 0) { if (slowmode) uih_newimage(uih), uih->fcontext->version++; } if (antialias && !uih->filter[aliasnum]) { uih->aliasnum = aliasnum; uih_enablefilter(uih, aliasnum); } uih_prepare_image(uih); fflush(stdout); uih_drawwindows(uih); y = 0; if (lastframenum >= 0) { for (; y < img->height; y++) if (memcmp(saveddata + img->width * img->bytesperpixel * y, uih->image->currlines[y], img->width * img->bytesperpixel)) break; } if (y != img->height) { for (; y < img->height; y++) memcpy(saveddata + img->width * img->bytesperpixel * y, uih->image->currlines[y], img->width * img->bytesperpixel); fflush(stdout); sprintf(s, "%s%06i.png", basename, framenum); curframe.rect = uih->fcontext->rs; curframe.angle = uih->fcontext->angle; curframe.name = s; curframe.newimage = newimage; writepng(s, uih->image, NULL); uih_displayed(uih); lastframenum = framenum; } else { uih_displayed(uih); } } if (lastframenum < framenum) { // The image is a duplicate of the previous frame char t[256]; sprintf(t, "%s%06i.png", basename, framenum); #ifdef _WIN32 // No symlinks on windows, so just save another copy writepng(t, uih->image, NULL); #else // On Unix, save a symlink. const char *link_target; printmsg(TR("Message", "Linking frame %i to %i..."), framenum, lastframenum); // Symlink to the basename of s because the linked file is // relative to the directory the symlink is in. link_target = strrchr(s, '/'); if (link_target && *link_target) link_target++; if (!link_target || !*link_target) link_target = s; if (symlink(link_target, t) != 0) { if (gc) uih_error(gc, "Error creating symlink."); else printf("Error creating symlink."); } #endif } framenum++; } curframe.newimage = 1; if (uih->errstring) { uiherror(uih); if (gc) gc->incalculation = 0; uih_freecontext(uih); destroy_image(img); destroypalette(pal); free(saveddata); if (!gc) uih_freecatalog(uih); return 0; } free(saveddata); uih_freecontext(uih); destroy_image(img); destroypalette(pal); if (interrupt) error(TR("Error", "Calculation interrupted")); else { if (!gc) x_message(TR("Error", "Calculation finished")); else printmsg(TR("Error", "Calculation finished")); } if (gc) gc->incalculation = 0; if (!gc) uih_freecatalog(uih); return 1; } int uih_renderimage(struct uih_context *gc1, xio_file af, xio_constpath path, struct image *img, int antialias, const char *catalog, int noise) { int aliasnum = 0; noiselevel = noise; gc = gc1; if (gc) gc->incalculation = 1; while (uih_filters[aliasnum] != &antialias_filter) aliasnum++; uih = uih_mkcontext(0, img, passfunc, NULL, NULL); if (!uih) { error(TR("Error", "Cannot create context\n")); if (gc) gc->incalculation = 0; return 0; } uih->fcontext->slowmode = 1; uih_constantframetime(uih, 1000000 / 10); if (!gc) { printmsg(TR("Message", "Loading catalogs")); uih_loadcatalog(uih, "english"); if (uih->errstring) { fprintf(stderr, "%s", uih->errstring); uih_clearmessages(uih); uih->errstring = NULL; } if (catalog != NULL) uih_loadcatalog(uih, catalog); if (uih->errstring) { fprintf(stderr, "%s", uih->errstring); uih_clearmessages(uih); uih->errstring = NULL; } if (uih->errstring) { uih_freecatalog(uih); uih_freecontext(uih); uiherror(uih); if (gc) gc->incalculation = 0; return 0; } } uih_load(uih, af, path); if (uih->errstring) { uiherror(uih); uih_freecatalog(uih); uih_freecontext(uih); if (gc) gc->incalculation = 0; return 0; } printmsg(TR("Message", "Entering calculation loop!")); tl_process_group(syncgroup, NULL); uih_update(uih, 0, 0, 0); uih_newimage(uih), uih->fcontext->version++; if (antialias && !uih->filter[aliasnum]) { uih->aliasnum = aliasnum; uih_enablefilter(uih, aliasnum); } uih_prepare_image(uih); uih_drawwindows(uih); uih_freecontext(uih); uih_freecatalog(uih); if (interrupt) error(TR("Error", "Calculation interrupted")); else { printmsg(TR("Message", "Calculation finished")); } if (gc) gc->incalculation = 0; return 1; } XaoS-release-4.3.2/src/ui-hlp/save.cpp000066400000000000000000000541421455214672000174530ustar00rootroot00000000000000#define __USE_MINGW_ANSI_STDIO 1 // for long double support on Windows #include #include #include #include #include #include "filter.h" #include "fractal.h" #include "ui_helper.h" #include "config.h" #include "xmenu.h" #include "play.h" #ifdef USE_FLOAT128 #include #endif #define myputs(s) \ ((xio_puts(s, uih->savec->file) == XIO_EOF) ? outputerror(uih), 1 : 0) #define myputc(s) \ ((xio_putc(s, uih->savec->file) == XIO_EOF) ? outputerror(uih), 1 : 0) static int first; static int changed; static int last; const char *const save_fastmode[] = {"zero", "never", "animation", "new", "always", NULL}; const char *const xtextposnames[] = {"left", "center", "right", NULL}; const char *const ytextposnames[] = {"top", "middle", "bottom", NULL}; static void outputerror(struct uih_context *uih) { static char error[245]; if (uih->savec->writefailed) return; sprintf(error, "Write failed:%s", xio_errorstring()); uih_error(uih, error); uih->savec->writefailed = 1; } static void start_save(struct uih_context *uih, const char *name) { if (!changed && !uih->savec->firsttime) { char s[256]; sprintf(s, "\n(usleep %i)\n", tl_lookup_timer(uih->savec->timer)); myputs(s); tl_reset_timer(uih->savec->timer); } changed = 1; myputc('('); myputs(name); first = 0; } static void stop_save(struct uih_context *uih) { myputc(')'); myputc('\n'); } #ifdef SAVEKEYWORDUSED static void save_keyword(struct uih_context *uih, const char *name) { if (!first) myputc(' '); else first = 0; myputs(name); } #endif static void save_keystring(struct uih_context *uih, const char *name) { if (!first) myputc(' '); else first = 0; myputc('\''); myputs(name); } static void save_float(struct uih_context *uih, number_t number) { if (!first) myputc(' '); else first = 0; char s[256]; #ifdef USE_FLOAT128 quadmath_snprintf(s, 256, "%.34QG", (__float128)number); #else #ifdef USE_LONG_DOUBLE snprintf(s, 256, "%.20LG", (long double)number); #else snprintf(s, 256, "%.20G", (double)number); #endif #endif myputs(s); } static void save_float2(struct uih_context *uih, number_t number, int places) { char fs[10]; if (!first) myputc(' '); else first = 0; if (places < 0) places = 0; if (places > 20) places = 20; char s[256]; #ifdef USE_FLOAT128 snprintf(fs, 10, "%%.%iQG", places); quadmath_snprintf(s, 256, "%.34QG", (__float128)number); #else #ifdef USE_LONG_DOUBLE snprintf(fs, 10, "%%.%iLG", places); snprintf(s, 256, fs, (long double)number); #else sprintf(fs, 10, "%%.%iG", places); sprintf(s, 256, fs, (double)number); #endif #endif myputs(s); } static void save_int(struct uih_context *uih, int number) { char s[256]; if (!first) myputc(' '); else first = 0; sprintf(s, "%i", number); myputs(s); } static void save_onoff(struct uih_context *uih, int number) { if (!first) myputc(' '); else first = 0; myputs(number ? "#t" : "#f"); } static void save_string(struct uih_context *uih, const char *text) { int i = 0; if (!first) myputc(' '); else first = 0; myputc('"'); while (text[i] != 0) { if (text[i] == '"') myputc('\\'); myputc(text[i]); i++; } myputc('"'); } static void save_intc(struct uih_context *uih, const char *name, int number) { start_save(uih, name); save_int(uih, number); stop_save(uih); } static void save_onoffc(struct uih_context *uih, const char *name, int number) { start_save(uih, name); save_onoff(uih, number); stop_save(uih); } static void save_floatc(struct uih_context *uih, const char *name, number_t number) { start_save(uih, name); save_float(uih, number); stop_save(uih); } static void save_float2c(struct uih_context *uih, const char *name, number_t number, int places) { start_save(uih, name); save_float2(uih, number, places); stop_save(uih); } static void save_coordc(struct uih_context *uih, const char *name, number_t number, number_t number2) { start_save(uih, name); save_float(uih, number); save_float(uih, number2); stop_save(uih); } static void save_keystringc(struct uih_context *uih, const char *name, const char *param) { start_save(uih, name); save_keystring(uih, param); stop_save(uih); } static void save_stringc(struct uih_context *uih, const char *name, const char *param) { start_save(uih, name); save_string(uih, param); stop_save(uih); } static void save_noparam(struct uih_context *uih, const char *name) { start_save(uih, name); stop_save(uih); } static void save_nstring(struct uih_context *uih, int number, const char *const *const texts) { save_keystring(uih, texts[number]); } static void save_nstringc(struct uih_context *uih, const char *name, int number, const char *const *const texts) { save_keystringc(uih, name, texts[number]); } static int ndecimals(struct uih_context *uih) { number_t n = 10000; number_t m = uih->fcontext->s.rr; int i; if (uih->fcontext->s.ri < m) m = uih->fcontext->s.ri; if (uih->fcontext->s.ri > 100 || uih->fcontext->s.rr > 100) return (20); for (i = 0; i < 20 && m < n; i++, n /= 10) ; return (i); } static void savepos(struct uih_context *uih); static void savepos(struct uih_context *uih) { int n = ndecimals(uih); start_save(uih, "view"); save_float2(uih, uih->fcontext->s.cr, n); save_float2(uih, uih->fcontext->s.ci, n); save_float2(uih, uih->fcontext->s.rr, n); save_float2(uih, uih->fcontext->s.ri, n); stop_save(uih); uih->savec->fcontext->s = uih->fcontext->s; } static void savepos2(struct uih_context *uih); static void savepos2(struct uih_context *uih) { int n = ndecimals(uih); start_save(uih, "animateview"); save_float2(uih, uih->fcontext->s.cr, n); save_float2(uih, uih->fcontext->s.ci, n); save_float2(uih, uih->fcontext->s.rr, n); save_float2(uih, uih->fcontext->s.ri, n); stop_save(uih); uih->savec->fcontext->s = uih->fcontext->s; } static void savepos3(struct uih_context *uih); static void savepos3(struct uih_context *uih) { int n = ndecimals(uih); start_save(uih, "morphview"); save_float2(uih, uih->fcontext->s.cr, n); save_float2(uih, uih->fcontext->s.ci, n); save_float2(uih, uih->fcontext->s.rr, n); save_float2(uih, uih->fcontext->s.ri, n); stop_save(uih); uih->savec->fcontext->s = uih->fcontext->s; } void uih_saveframe(struct uih_context *uih) { struct uih_savedcontext *s = uih->savec; int i; int resetsync = 0; if (uih->save) { changed = 0; if (s->firsttime) save_noparam(uih, "initstate"); if (s->nonfractalscreen && !uih->nonfractalscreen) save_noparam(uih, "display"), s->nonfractalscreen = 0; for (i = uih_nfilters; i >= 0; i--) { if (uih->filter[i] != NULL) { if (s->filter[i] != 1) { start_save(uih, "filter"); save_keystring(uih, uih->filter[i]->action->shortname); save_onoff(uih, 1); s->filter[i] = 1; stop_save(uih); } } else if (s->filter[i] != 0) { s->filter[i] = 0; start_save(uih, "filter"); save_keystring(uih, uih_filters[i]->shortname); save_onoff(uih, 0); stop_save(uih); } } if (uih->palettechanged) { switch (uih->palettetype) { case 0: save_intc(uih, "defaultpalette", uih->paletteshift); break; default: start_save(uih, "palette"); save_int(uih, uih->palettetype); save_int(uih, uih->paletteseed); save_int(uih, uih->paletteshift); stop_save(uih); break; } uih->palettechanged = 0; s->manualpaletteshift = 0; } if (uih->palettepickerenabled) { start_save(uih, "palettecolors"); unsigned char colors[31][3]; getDEFSEGMENTColor(colors); for (int i=0; i<31; i++) { char currcolor[6]; rgbtohex(colors[i][0], colors[i][1], colors[i][2], currcolor); save_string(uih, currcolor); } stop_save(uih); } if (s->manualpaletteshift != uih->manualpaletteshift) save_intc(uih, "shiftpalette", uih->manualpaletteshift - s->manualpaletteshift), s->manualpaletteshift = uih->manualpaletteshift; if (s->fcontext->currentformula != uih->fcontext->currentformula) { save_keystringc(uih, "formula", uih->fcontext->currentformula->shortname), s->fcontext->currentformula = uih->fcontext->currentformula; #ifdef USE_SFFE /*SFFE : malczak */ if (uih->fcontext->currentformula->flags & SFFE_FRACTAL) { if (uih->fcontext->userformula->expression) save_stringc(uih, "usrform", uih->fcontext->userformula->expression); if (uih->fcontext->userinitial->expression) save_stringc(uih, "usrformInit", uih->fcontext->userinitial->expression); }; /*SFFE : malczak */ #endif set_formula(s->fcontext, (int)(uih->fcontext->currentformula - formulas)); } if (s->mode >= UIH_SAVEALL) save_intc(uih, "letterspersec", uih->letterspersec); if (s->mode > UIH_SAVEPOS) { if (s->speedup != uih->speedup) save_floatc(uih, "speedup", uih->speedup), s->speedup = uih->speedup; if (s->maxstep != uih->maxstep) save_floatc(uih, "maxstep", uih->maxstep), s->maxstep = uih->maxstep; if (s->fastmode != uih->fastmode) save_nstringc(uih, "fastmode", uih->fastmode, save_fastmode), s->fastmode = uih->fastmode; } if (s->juliamode != uih->juliamode) save_onoffc(uih, "fastjulia", uih->juliamode), s->juliamode = uih->juliamode; if (s->cycling != uih->cycling) save_onoffc(uih, "cycling", uih->cycling), s->cycling = uih->cycling; if (s->mode >= UIH_SAVEPOS && s->fcontext->periodicity != uih->fcontext->periodicity) save_onoffc(uih, "periodicity", uih->fcontext->periodicity), s->fcontext->periodicity = uih->fcontext->periodicity; if ((uih->cycling || s->mode >= UIH_SAVEALL) && (s->cyclingspeed != uih->cyclingspeed || s->direction != uih->direction * uih->cyclingdirection)) save_intc(uih, "cyclingspeed", uih->cyclingspeed * uih->direction * uih->cyclingdirection), s->cyclingspeed = uih->cyclingspeed, s->direction = uih->direction * uih->cyclingdirection; if ((s->mode > UIH_SAVEPOS && (uih->step || uih->zoomactive)) && (s->xcenter != uih->xcenter || s->ycenter != uih->ycenter)) save_coordc(uih, "zoomcenter", uih->xcenter, uih->ycenter), s->xcenter = uih->xcenter, s->ycenter = uih->ycenter; if ((!uih->fcontext->mandelbrot || uih->juliamode) && (s->fcontext->pre != uih->fcontext->pre || s->fcontext->pim != uih->fcontext->pim)) { if (uih->juliamode && uih->pressed) save_coordc(uih, "morphjulia", uih->fcontext->pre, uih->fcontext->pim), s->fcontext->pre = uih->fcontext->pre, s->fcontext->pim = uih->fcontext->pim; else save_coordc(uih, "juliaseed", uih->fcontext->pre, uih->fcontext->pim), s->fcontext->pre = uih->fcontext->pre, s->fcontext->pim = uih->fcontext->pim; } if (uih->fcontext->bre != s->fcontext->bre || uih->fcontext->bim != s->fcontext->bim) { save_coordc(uih, "perturbation", uih->fcontext->bre, uih->fcontext->bim), s->fcontext->bre = uih->fcontext->bre, s->fcontext->bim = uih->fcontext->bim; } if (uih->fastrotate != s->fastrotate && s->mode > UIH_SAVEPOS) { save_onoffc(uih, "fastrotate", uih->fastrotate); s->fastrotate = uih->fastrotate; } if (uih->fcontext->angle != s->fcontext->angle && s->autorotate != 1) { if (s->rotatepressed && s->mode == UIH_SAVEANIMATION) save_float2c(uih, "morphangle", uih->fcontext->angle, 5); else save_float2c(uih, "angle", uih->fcontext->angle, 5); s->rotatepressed = uih->rotatepressed; s->fcontext->angle = uih->fcontext->angle; } if (uih->rotationspeed != s->rotationspeed && ((s->mode > UIH_SAVEPOS && uih->rotatemode == ROTATE_CONTINUOUS) || s->mode >= UIH_SAVEALL)) { save_float2c(uih, "rotationspeed", uih->rotationspeed, 6); s->rotationspeed = uih->rotationspeed; } if (s->autorotate != (uih->rotatemode == ROTATE_CONTINUOUS)) { s->autorotate = (uih->rotatemode == ROTATE_CONTINUOUS); save_onoffc(uih, "autorotate", s->autorotate); } if (s->fcontext->maxiter != uih->fcontext->maxiter) save_intc(uih, "maxiter", uih->fcontext->maxiter), s->fcontext->maxiter = uih->fcontext->maxiter; if (s->fcontext->bailout != uih->fcontext->bailout) save_floatc(uih, "bailout", uih->fcontext->bailout), s->fcontext->bailout = uih->fcontext->bailout; if (s->fcontext->coloringmode != uih->fcontext->coloringmode) save_intc(uih, "outcoloring", uih->fcontext->coloringmode), s->fcontext->coloringmode = uih->fcontext->coloringmode; if (s->fcontext->incoloringmode != uih->fcontext->incoloringmode) save_intc(uih, "incoloring", uih->fcontext->incoloringmode), s->fcontext->incoloringmode = uih->fcontext->incoloringmode; if (s->fcontext->incoloringmode != uih->fcontext->incoloringmode) save_intc(uih, "incoloring", uih->fcontext->incoloringmode), s->fcontext->incoloringmode = uih->fcontext->incoloringmode; if ((s->fcontext->incoloringmode == 10 || s->mode >= UIH_SAVEALL) && s->fcontext->intcolor != uih->fcontext->intcolor) save_intc(uih, "intcoloring", uih->fcontext->intcolor), s->fcontext->intcolor = uih->fcontext->intcolor; if ((s->fcontext->coloringmode == 10 || s->mode >= UIH_SAVEALL) && s->fcontext->outtcolor != uih->fcontext->outtcolor) save_intc(uih, "outtcoloring", uih->fcontext->outtcolor), s->fcontext->outtcolor = uih->fcontext->outtcolor; if (s->fcontext->mandelbrot != uih->fcontext->mandelbrot) save_onoffc(uih, "julia", !uih->fcontext->mandelbrot), s->fcontext->mandelbrot = uih->fcontext->mandelbrot; if (s->mode > UIH_SAVEPOS && s->fcontext->range != uih->fcontext->range) save_intc(uih, "range", uih->fcontext->range), s->fcontext->range = uih->fcontext->range; if (s->fcontext->plane != uih->fcontext->plane) save_intc(uih, "plane", uih->fcontext->plane), s->fcontext->plane = uih->fcontext->plane; if (s->zoomactive != uih->zoomactive && s->mode > UIH_SAVEPOS) { switch (uih->zoomactive) { case -1: save_noparam(uih, "unzoom"); break; case 1: save_noparam(uih, "zoom"); break; default: save_noparam(uih, "stop"); break; } s->zoomactive = uih->zoomactive; } if ((s->mode >= UIH_SAVEPOS || uih->displaytext) && s->color != uih->color) { start_save(uih, "color"); save_nstring(uih, uih->color, uih_colornames); stop_save(uih); s->color = uih->color; } if (s->clearscreen) { save_noparam(uih, "clearscreen"); s->clearscreen = 0; s->nonfractalscreen = 1; } if (uih->displaytext) { for (i = 0; i < 3; i++) { if (uih->displaytext & (1 << i)) { if (s->ytextpos != i || s->xtextpos != uih->textpos[i]) { start_save(uih, "textposition"); save_nstring(uih, uih->xtextpos, xtextposnames); save_nstring(uih, uih->ytextpos, ytextposnames); stop_save(uih); s->xtextpos = uih->xtextpos; s->ytextpos = uih->ytextpos; } save_stringc(uih, "text", uih->text[i]); s->nonfractalscreen = 1; } } save_noparam(uih, "textsleep"); uih->displaytext = 0; } if (s->autorotate && changed && tl_lookup_timer(uih->savec->synctimer) > 500000) save_float2c(uih, "angle", uih->fcontext->angle, 5), resetsync = 1; if (s->mode == UIH_SAVEPOS) savepos(uih); else { if (uih->viewchanged) savepos(uih), uih->viewchanged = 0; else if (uih->moved) savepos3(uih), uih->moved = 0; else if (((changed && uih->step) || last) && tl_lookup_timer(uih->savec->synctimer) > 500000) resetsync = 1, savepos2(uih); } if (uih->savec->firsttime) uih->savec->firsttime = 0; if (s->writefailed) uih_save_disable(uih); if (resetsync) tl_reset_timer(uih->savec->synctimer); } /*if uih->save */ } int uih_save_enable(struct uih_context *uih, xio_file f, int mode) { struct uih_savedcontext *s; int i; last = 0; if (uih->save) { uih_error(uih, "Recording is already enabled"); return 0; } s = (struct uih_savedcontext *)calloc(1, sizeof(*s)); if (f == NULL || s == NULL) { uih_error(uih, "File could not be opended or out of memory"); return 0; } uih->savec = s; s->fcontext = make_fractalc(1, uih->image->pixelwidth * uih->image->width, uih->image->pixelheight * uih->image->height); if (s->fcontext == NULL) { uih_error(uih, "File could not be opended or out of memory"); return 0; } s->mode = mode; /*Invalidate context to force save everything first */ s->speedup = STEP; s->maxstep = MAXSTEP; s->xcenter = INT_MAX; s->fastmode = 2; s->juliamode = 0; s->cycling = 0; for (i = 0; i < uih_nfilters; i++) s->filter[i] = 0; s->pressed = 0; s->firsttime = 1; uih->palettechanged = 1; s->cyclingspeed = 30; s->fcontext->pre = s->fcontext->pim = 0; s->fcontext->bre = s->fcontext->bim = 0; s->fcontext->currentformula = NULL; s->fcontext->periodicity = 1; s->fcontext->maxiter = 170; s->fcontext->bailout = 4; s->fcontext->coloringmode = 0; s->fcontext->incoloringmode = 0; s->fcontext->outtcolor = 0; s->fcontext->intcolor = 0; s->fcontext->mandelbrot = 1; s->fcontext->plane = 0; s->fcontext->range = 3; s->fcontext->angle = 0; s->rotatepressed = 0; s->autorotate = 0; s->fastrotate = 0; s->rotationspeed = 10; s->clearscreen = 0; s->color = 0; s->xtextpos = 1; s->ytextpos = 1; s->file = f; s->timer = tl_create_timer(); s->synctimer = tl_create_timer(); uih->viewchanged = 1; uih->palettechanged = 1; uih->save = 1; uih_emulatetimers(uih); tl_reset_timer(s->timer); uih->moved = 0; if (mode == UIH_SAVEANIMATION) myputs(";Animation file automatically generated by XaoS " XaoS_VERSION "\n" "; - a realtime interactive fractal zoomer\n" ";Use xaos -play to replay it\n"); else if (mode == UIH_SAVEPOS) myputs(";Position file automatically generated by XaoS " XaoS_VERSION "\n" "; - a realtime interactive fractal zoomer\n" ";Use xaos -loadpos to display it\n"); uih_saveframe(uih); uih_updatemenus(uih, "save"); xio_putc('\n', f); return 1; } void uih_save_disable(struct uih_context *uih) { if (uih->save) { last = 1; if (uih->savec->mode >= UIH_SAVEANIMATION) uih_saveframe(uih); if (xio_close(uih->savec->file)) outputerror(uih); uih->save = 0; free(uih->savec->fcontext); tl_free_timer(uih->savec->timer); tl_free_timer(uih->savec->synctimer); free(uih->savec); uih_updatemenus(uih, "save"); } } void uih_save_position(struct uih_context *uih, xio_file f, int mode) { struct uih_savedcontext *c = uih->savec; int save = uih->save; int vc = uih->viewchanged; int pc = uih->palettechanged; uih->moved = 0; uih->save = 0; uih->savec = NULL; uih_save_enable(uih, f, mode); uih_save_disable(uih); uih->savec = c; uih->save = save; uih->viewchanged = vc; uih->palettechanged = pc; } XaoS-release-4.3.2/src/ui-hlp/ui-hlp.pri000066400000000000000000000004471455214672000177220ustar00rootroot00000000000000SOURCES += $$PWD/autopilot.cpp \ $$PWD/menu.cpp \ $$PWD/ui_helper.cpp \ $$PWD/play.cpp \ $$PWD/render.cpp \ $$PWD/playtext.cpp \ $$PWD/save.cpp \ $$PWD/messg.cpp \ $$PWD/wstack.cpp HEADERS += $$PWD/play.h \ $$PWD/autod.h \ $$PWD/autopilot.h XaoS-release-4.3.2/src/ui-hlp/ui_helper.cpp000066400000000000000000002263601455214672000204740ustar00rootroot00000000000000#include #include #include #include #include #include #ifdef DEBUG #ifdef __linux__ #define MEMCHECK #include #endif #endif #include #include #include #include #include "config.h" #include "filter.h" #include "ui_helper.h" #include "plane.h" #include "timers.h" #include "zoom.h" #include "xmenu.h" #include "xerror.h" #include "autopilot.h" #include "grlib.h" #include "play.h" #ifdef HAVE_LIBGEN_H #include #endif #include "i18n.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define WAITTIME 50000 #define WAITTIME1 200000 #define WAITTIME2 2000000 #define uih_palettechg(uih) \ if (!uih->recalculatemode && uih->queue->palettechg != NULL) \ uih->recalculatemode = UIH_PALETTEDRAW, uih->display = 1 #include "misc-f.h" static struct filter *uih_getinstance(const struct filteraction *a); static void uih_destroyinstance(struct filter *f); static int uih_require(struct filter *f, struct requirements *r); static int uih_initialize(struct filter *f, struct initdata *i); static const rgb_t uicolors[] = { {0, 0, 0}, {255, 255, 255}, {255, 65, 0}, {64, 64, 64}, {128, 128, 128}, {128 + 64, 128 + 64, 128 + 64}}; static const rgb_t uibwcolors[] = {{0, 0, 0}, {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, {255, 255, 255}}; static const struct filteraction uih_filter = {"XaoS's user interface layer", "ui", 0, uih_getinstance, uih_destroyinstance, NULL, uih_require, uih_initialize, convertupgeneric, convertdowngeneric, NULL}; static uih_context *uih; static int waitcount, waitcount1, waitcount2; const struct filteraction *const uih_filters[MAXFILTERS] = {&edge_filter, &edge2_filter, &threed_filter, &starfield_filter, &stereogram_filter, &interlace_filter, &blur_filter, &emboss_filter, &palette_filter, &antialias_filter, NULL}; const int uih_nfilters = 10; static void uih_invalidatepos(uih_context *uih) { uih->xcenterm = INT_MAX; uih->xcenterm = INT_MAX; } static void uih_finishpalette(struct uih_context *uih) { if (uih->image->palette->flags & UNFINISHED) { if (uih->image->palette->allocfinished != NULL) uih->image->palette->allocfinished(uih->image->palette); uih->image->palette->flags &= ~UNFINISHED; } } static void uih_getcoord(uih_context *uih, int x, int y, number_t *xr, number_t *yr) { uih->uifilter->action->convertdown(uih->uifilter, &x, &y); *xr = (((number_t)(uih->fcontext->rs.nc + (x) * ((uih->fcontext->rs.mc - uih->fcontext->rs.nc) / (number_t)uih->zengine->image->width)))); *yr = (((number_t)(uih->fcontext->rs.ni + (y) * ((uih->fcontext->rs.mi - uih->fcontext->rs.ni) / (number_t)uih->zengine->image->height)))); rotateback(*(uih->fcontext), *xr, *yr); } int uih_enablefilter(uih_context *c, int n) { if (c->filter[n] == NULL) { struct filter *f, *f1; int i, wascycling = 0; if (c->cycling) uih_cycling_off(c), wascycling = 1; f = uih_filters[n]->getinstance(uih_filters[n]); f1 = c->uifilter; if (c->fixedcolor != NULL) f1 = c->fixedcolor; for (i = MAXFILTERS - 1; i > n; i--) { if (c->filter[i]) f1 = c->filter[i]; } uih_newimage(c); insertfilter(f, f1); if (!initqueue(c->queue)) { c->ddatalost = 1; removefilter(f); f->action->destroyinstance(f); if (!initqueue(c->queue)) { x_fatalerror( "Fatal error. Can not continue - initialization of queue can not be performed eigher with or without filter"); } if (wascycling) uih_cycling_on(c); if (!strcmp("palette", uih_filters[n]->shortname)) { uih_updatemenus(c, "palettef"); } else { uih_updatemenus(c, uih_filters[n]->shortname); } return 0; } else c->filter[n] = f; if (wascycling) uih_cycling_on(c); if (!strcmp("palette", uih_filters[n]->shortname)) { uih_updatemenus(c, "palettef"); } else { uih_updatemenus(c, uih_filters[n]->shortname); } return 1; } return 0; } void uih_disablefilter(uih_context *c, int n) { if (n == c->aliasnum) return; if (c->filter[n] != NULL) { int wascycling = 0; struct filter *f = c->filter[n]; if (c->cycling) uih_cycling_off(c), wascycling = 1; uih_newimage(c); removefilter(f); if (!initqueue(c->queue)) { struct filter *f1; int i; c->ddatalost = 1; f1 = c->uifilter; if (c->fixedcolor != NULL) f1 = c->fixedcolor; for (i = MAXFILTERS - 1; i > n; i--) { if (c->filter[i]) f1 = c->filter[i]; } insertfilter(f, f1); if (!initqueue(c->queue)) { x_fatalerror("Fatal error. Can not continue"); } } else f->action->destroyinstance(f), c->filter[n] = NULL; if (wascycling) uih_cycling_on(c); if (!strcmp("palette", uih_filters[n]->shortname)) { uih_updatemenus(c, "palettef"); } else { uih_updatemenus(c, uih_filters[n]->shortname); } } } int uih_fastrotateenable(uih_context *c) { int wascycling = 0; if (c->juliamode) uih_disablejulia(c); if (!c->fastrotate && !c->juliamode) { if (c->cycling) uih_cycling_off(c), wascycling = 1; c->rotatef = rotate_filter.getinstance(&rotate_filter); if (c->rotatef == NULL) goto end; uih_newimage(c); addfilter(c->rotatef, c->zengine); if (!initqueue(c->queue)) goto end2; if (wascycling) uih_cycling_on(c); c->fastrotate = 1; return 1; } return 0; end2: removefilter(c->rotatef); initqueue(c->queue); c->rotatef->action->destroyinstance(c->rotatef); end: if (wascycling) uih_cycling_on(c); return 0; } void uih_fastrotatedisable(uih_context *c) { if (c->fastrotate) { int wascycling = 0; uih_rotatemode(c, ROTATE_NONE); if (c->cycling) uih_cycling_off(c), wascycling = 1; c->fastrotate = 0; removefilter(c->rotatef); initqueue(c->queue); c->rotatef->action->destroyinstance(c->rotatef); uih_newimage(c); if (wascycling) uih_cycling_on(c); } } void uih_rotate(struct uih_context *c, int n) { if (!n) uih_fastrotate(c, 0); else { uih_fastrotate(c, 1); uih_rotatemode(c, n); } } static void uih_fixedcolordisable(uih_context * /*c*/) { #ifdef SCONVERTORS if (c->fixedcolor != NULL) { int wascycling = 0; if (c->cycling) uih_cycling_off(c), wascycling = 1; initqueue(c->queue); removefilter(c->fixedcolor); initqueue(c->queue); c->fixedcolor->action->destroyinstance(c->fixedcolor); c->fixedcolor = NULL; uih_newimage(c); if (wascycling) uih_cycling_on(c); } #endif } static int uih_fixedcolorenable(uih_context * /*c*/) { #ifdef SCONVERTORS const struct filteraction *fa = NULL; int wascycling = 0; preallocpalette(c->palette); switch (c->image->palette->type) { #ifdef SFIXEDCOLOR case FIXEDCOLOR: fa = &fixedcolor_filter; break; #endif #ifdef SBITMAPS case LBITMAP: case MBITMAP: case LIBITMAP: case MIBITMAP: fa = &bitmap_filter; break; #endif default: x_fatalerror("Unsupported image type. Recompile XaoS"); } if (c->fixedcolor != NULL && c->fixedcolor->action != fa) uih_fixedcolordisable(c); if (c->fixedcolor == NULL) { if (c->cycling) uih_cycling_off(c), wascycling = 1; c->fixedcolor = fa->getinstance(fa); if (c->fixedcolor == NULL) goto end; uih_newimage(c); addfilter(c->fixedcolor, c->uifilter->previous); if (!initqueue(c->queue)) goto end2; if (wascycling) uih_cycling_on(c); return 1; } return 0; end2: removefilter(c->fixedcolor); c->fixedcolor->action->destroyinstance(c->fixedcolor); c->fixedcolor = NULL; initqueue(c->queue); end: if (wascycling) uih_cycling_on(c); return 0; #else x_fatalerror("Fixed color not supported, please recompile XaoS"); return 0; #endif } int uih_fastrotate(uih_context *c, int mode) { if (mode) return (uih_fastrotateenable(c)); uih_fastrotatedisable(c); return 1; } void uih_angle(uih_context *c, number_t angle) { if (angle != c->fcontext->angle) { if (!c->fastrotate) { c->fcontext->version++; uih_newimage(c); } c->fcontext->angle = angle; uih_animate_image(c); } } void uih_rotatemode(uih_context *c, int mode) { const char *names[] = {"norotate", "mouserotate", "controtate"}; if (c->fastrotate) { if (c->rotatemode != mode) { c->rotatemode = mode; if (mode == ROTATE_CONTINUOUS) tl_reset_timer(c->doittimer); uih_updatemenus(c, names[mode]); } } } int uih_enablejulia(uih_context *c) { int wascycling = 0; if (!c->juliamode && c->fcontext->mandelbrot /*&&c->fcontext->currentformula->calculate_julia != NULL */) { struct filter *addf = c->zengine; uih_newimage(c); if (c->fastrotate) uih_fastrotatedisable(c); if (c->cycling) uih_cycling_off(c), wascycling = 1; if (c->fcontext->currentformula->calculate_julia == NULL || c->fcontext->slowmode) c->julia = zoom_filter.getinstance(&zoom_filter); else c->julia = julia_filter.getinstance(&julia_filter); if (c->julia == NULL) goto end; c->subwindow = subwindow_filter.getinstance(&subwindow_filter); if (c->subwindow == NULL) goto end2; if (c->fcontext->currentformula->calculate_julia != NULL && !c->fcontext->slowmode) { c->smalliter = smalliter_filter.getinstance(&smalliter_filter); if (c->smalliter == NULL) goto end3; } else c->smalliter = NULL; addfilter(c->subwindow, addf); if (c->fcontext->currentformula->calculate_julia != NULL && !c->fcontext->slowmode) { addfilter(c->smalliter, addf); } addfilter(c->julia, addf); subwindow_setsecond(c->subwindow, addf); if (!initqueue(c->queue)) goto end4; if (c->fcontext->currentformula->calculate_julia == NULL || c->fcontext->slowmode) c->juliamode = 2; else c->juliamode = 1; uih_updatemenus(c, "fastjulia"); return 1; } uih_updatemenus(c, "fastjulia"); return 0; end4:; removefilter(c->subwindow); removefilter(c->julia); if (c->smalliter != NULL) removefilter(c->smalliter); initqueue(c->queue); end3:; c->smalliter->action->destroyinstance(c->smalliter); end2:; c->subwindow->action->destroyinstance(c->subwindow); end:; c->julia->action->destroyinstance(c->julia); if (wascycling) uih_cycling_on(c); uih_updatemenus(c, "fastjulia"); return 0; } void uih_disablejulia(uih_context *c) { int wascycling = 0; if (c->juliamode) { uih_newimage(c); c->fcontext->version++; if (c->cycling) uih_cycling_off(c), wascycling = 1; removefilter(c->subwindow); removefilter(c->julia); if (c->smalliter != NULL) removefilter(c->smalliter); initqueue(c->queue); if (c->smalliter != NULL) c->smalliter->action->destroyinstance(c->smalliter); c->subwindow->action->destroyinstance(c->subwindow); c->julia->action->destroyinstance(c->julia); if (wascycling) uih_cycling_on(c); c->juliamode = 0; uih_updatemenus(c, "fastjulia"); } } int uih_setjuliamode(uih_context *c, int mode) { if (mode) return uih_enablejulia(c); uih_disablejulia(c); return 1; } void uih_rotationspeed(uih_context *c, number_t speed) { c->rotationspeed = speed; } static void uih_cyclinghandler(void *userdata, int n) { struct uih_context *uih = (struct uih_context *)userdata; int direct; if (uih->zengine->fractalc->palette != NULL && uih->zengine->fractalc->palette->cyclecolors == NULL) return; direct = uih->direction * uih->cyclingdirection * n; if (direct > 0) direct %= uih->zengine->fractalc->palette->size - 1; else direct = -((-direct) % (uih->zengine->fractalc->palette->size - 1)); if (direct) { uih->paletteshift += direct; while (uih->paletteshift < 0) uih->paletteshift += uih->zengine->fractalc->palette->size - 1; uih->paletteshift = uih->paletteshift % (uih->zengine->fractalc->palette->size - 1); uih->zengine->fractalc->palette->cyclecolors( uih->zengine->fractalc->palette, direct); if (uih->flags & UPDATE_AFTER_PALETTE && (!uih->play || !uih->nonfractalscreen)) uih->display = 1; uih_palettechg(uih); } } void uih_cycling_off(struct uih_context *c) { if (c->cycling) { tl_free_timer(c->cyclingtimer); c->cycling = 0; uih_updatemenus(c, "cycling"); uih_updatemenus(c, "rcycling"); } } void uih_display(struct uih_context *c) { c->display = 1; c->nonfractalscreen = 0; if (c->clearscreen) c->clearscreen = 0; c->displaytext = 0; c->nletters = 0; c->display = 1; if (c->text[0] != NULL) free(c->text[0]), c->text[0] = NULL; if (c->text[1] != NULL) free(c->text[1]), c->text[1] = NULL; if (c->text[2] != NULL) free(c->text[2]), c->text[2] = NULL; if (c->play) uih_clear_lines(c); } void uih_cycling_stop(struct uih_context *c) { if (c->cycling && !c->stopped) { tl_remove_timer(c->cyclingtimer); c->stopped = 1; } } void uih_cycling_continue(struct uih_context *c) { if (c->cycling && c->stopped) { c->stopped = 0; tl_add_timer(syncgroup, c->cyclingtimer); } } void uih_loadfile(struct uih_context *c, xio_constpath d) { int los = strlen(d); char ext[4]; if(los < 3) return; memcpy(ext, &d[los-3], 3); if(strcmp(ext, "png") == 0) { uih_loadpngfile(c, d); return; } xio_file f; f = xio_ropen(d); if (f == NULL) { uih_error(c, strerror(errno)); return; } uih_load(c, f, d); return; } void uih_loadstr(struct uih_context *c, const char *data) { xio_file f; f = xio_strropen(data); uih_load(c, f, ""); return; } void uih_playstr(struct uih_context *c, const char *data) { xio_file f; f = xio_strropen(mystrdup(data)); uih_replayenable(c, f, "", 1); return; } void uih_recalculate(struct uih_context *c) { c->fcontext->version++; uih_newimage(c); } void uih_playfile(struct uih_context *c, xio_constpath d) { xio_file f; if (c->play) uih_replaydisable(c); f = xio_ropen(d); if (f == NULL) { uih_error(c, strerror(errno)); return; } uih_replayenable(c, f, d, 1); return; } void uih_playtutorial(struct uih_context *c, const char *name) { xio_pathdata tmp; xio_file f = XIO_FAILED; f = xio_gettutorial(name, tmp); if (f == NULL) { uih_error(c, TR("Error", "Tutorial files not found. Reinstall XaoS")); return; } uih_replayenable(c, f, tmp, 1); if (c->passfunc != NULL) { c->passfunc(c, 1, TR("Message", "Preparing first image"), 0); } } void uih_loadexample(struct uih_context *c) { xio_pathdata name; xio_file f = xio_getrandomexample(name); c->errstring = NULL; if (f == NULL) { uih_error(c, TR("Error", "Could not open examples")); return; } uih_load(c, f, name); if (c->errstring == NULL) { char s[256]; #ifdef HAVE_LIBGEN_H sprintf(s, TR("Message", "File %s loaded."), basename(name)); #else sprintf(s, TR("Message", "File %s loaded."), name); #endif uih_message(c, s); } } void uih_loadpngfile(struct uih_context *c, xio_constpath d) { xio_file f; f = xio_ropen(d); if (f == NULL) { uih_error(c, strerror(errno)); return; } const char* xpf_chunk = readpng(d); if(xpf_chunk == NULL) { uih_error(c, TR("Error", "Could not open image")); return; } xio_file xpf_data = xio_strropen(xpf_chunk); uih_load(c, xpf_data, d); if(c->errstring == NULL) { char s[256]; sprintf(s, TR("Message", "File %s loaded."), d); uih_message(c, s); } return; } void uih_savepngfile(struct uih_context *c, xio_constpath d) { const char *s; if (c->passfunc != NULL) { c->passfunc(c, 1, TR("Message", "Saving image..."), 0); } if (c->recalculatemode) { uih_newimage(c); uih_clearwindows(c); uih_do_fractal(c); } if (c->interrupt) { uih_message(c, TR("Message", "Save interrupted")); return; } c->errstring = NULL; xio_file xpf_data = xio_strwopen(); uih_save_position(c, xpf_data, UIH_SAVEPOS); s = uih_save(c, d, xpf_data); if (s != NULL) uih_error(c, s); if (c->errstring == NULL) { char s[256]; sprintf(s, TR("Message", "File %s saved."), d); uih_message(c, s); } } void uih_saveposfile(struct uih_context *c, xio_constpath d) { xio_file f; c->errstring = NULL; f = xio_wopen(d); if (f == XIO_FAILED) { uih_error(c, TR("Message", "Can not open file")); return; } uih_save_position(c, f, UIH_SAVEPOS); if (c->errstring == NULL) { char s[256]; sprintf(s, TR("Message", "File %s saved."), d); uih_message(c, s); } } /* Copy the position URL in the clipboard. */ /* For some reason, the messages are shown twice in the web version. FIXME. */ void uih_copyposurl(struct uih_context *c) { c->errstring = NULL; char *pos = uih_savepostostr(c); QString qPos = QString(pos); QStringList qPosCommands = qPos.split("\n"); QString url = "https://xaos.app?"; for (QString c: qPosCommands) { if (!c.startsWith(";") && c != "(initstate)" && c != "(formula 'mandel)" && c != "(defaultpalette 0)" && c != "(maxiter 1000)") { // Comments and defaults are removed. url += c; } } QClipboard* clipboard = QApplication::clipboard(); clipboard->setText(QString(url)); if (c->errstring == NULL) { char s[256]; if (url.length() > 200) { url = url.left(200) + "..."; } sprintf(s, TR("Message", "Clipboard set to %s."), url.toStdString().c_str()); uih_message(c, s); } } char *uih_savepostostr(struct uih_context *c) { xio_file f; c->errstring = NULL; f = xio_strwopen(); uih_save_position(c, f, UIH_SAVEPOS); return (xio_getstring(f)); } void uih_saveundo(struct uih_context *c) { xio_file f; if (c->play) return; c->errstring = NULL; if (c->undo.undos[c->undo.last]) free(c->undo.undos[c->undo.last]); f = xio_strwopen(); uih_save_position(c, f, UIH_SAVEPOS); c->undo.undos[c->undo.last] = xio_getstring(f); c->undo.last = (c->undo.last + 1) % UNDOLEVEL; } void uih_undo(struct uih_context *c) { xio_file f; int pos = c->undo.last - 2; if (pos < 0) pos = UNDOLEVEL + pos; if (c->undo.undos[pos]) { f = xio_strropen(c->undo.undos[pos]); c->undo.undos[pos] = NULL; c->undo.last = pos; uih_load(c, f, ""); } } void uih_redo(struct uih_context *c) { xio_file f; int pos = c->undo.last; if (c->undo.undos[pos]) { f = xio_strropen(c->undo.undos[pos]); c->undo.undos[pos] = NULL; c->undo.last = pos; uih_load(c, f, ""); } } extern xio_pathdata configfile; void uih_savecfg(struct uih_context *c) { xio_file f; c->errstring = NULL; f = xio_wopen(configfile); if (f == XIO_FAILED) { uih_message(c, (char *)xio_errorstring()); return; } uih_save_position(c, f, UIH_SAVEALL); if (c->errstring == NULL) { char s[256]; sprintf(s, TR("Message", "File %s saved."), configfile); uih_message(c, s); } } void uih_saveanimfile(struct uih_context *c, xio_constpath d) { xio_file f; c->errstring = NULL; if (c->save) { uih_save_disable(c); uih_updatemenus(c, "record"); return; } f = xio_wopen(d); if (f == XIO_FAILED) { uih_message(c, (char *)xio_errorstring()); return; } uih_save_enable(c, f, UIH_SAVEANIMATION); if (c->errstring == NULL) { char s[256]; sprintf(s, TR("Message", "Recording to file %s enabled."), d); uih_message(c, s); } uih_updatemenus(c, "record"); } const char *uih_save(struct uih_context *c, xio_constpath filename, xio_file xpf_data) { const char *r; uih_cycling_stop(c); uih_stoptimers(c); uih_clearwindows(c); r = writepng(filename, c->queue->saveimage, xpf_data); uih_cycling_continue(c); uih_resumetimers(c); return (r); } void uih_setcycling(struct uih_context *c, int speed) { c->cyclingspeed = speed; if (c->cyclingspeed < 0) c->direction = -1; else c->direction = 1; if (c->cycling) { if (c->cyclingspeed) tl_set_interval(c->cyclingtimer, 1000000 / c->cyclingspeed * c->direction); else tl_set_interval(c->cyclingtimer, 1000000 * 100); } } int uih_cycling_on(struct uih_context *c) { if (c->zengine->fractalc->palette != NULL && c->zengine->fractalc->palette->cyclecolors != NULL) { c->cycling = 1; tl_update_time(); c->cyclingtimer = tl_create_timer(); uih_emulatetimers(c); uih_setcycling(c, c->cyclingspeed); tl_set_multihandler(c->cyclingtimer, uih_cyclinghandler, c); tl_add_timer(syncgroup, c->cyclingtimer); } else { uih_updatemenus(c, "cycling"); uih_updatemenus(c, "rcycling"); return 0; } uih_updatemenus(c, "cycling"); uih_updatemenus(c, "rcycling"); return 1; } int uih_cycling(struct uih_context *uih, int mode) { if (mode) return (uih_cycling_on(uih)); uih_cycling_off(uih); return 1; } static void uih_waitfunc(struct filter *f) { int l; tl_process_group(syncgroup, NULL); l = tl_lookup_timer(uih->calculatetimer); if (uih->interrupt) f->interrupt = 1, uih->endtime = l; if (uih->interruptiblemode) { if (f->incalculation && !uih->starttime) uih->starttime = l; else if (uih->starttime && !f->incalculation && !uih->endtime) uih->endtime = l; if ((uih->maxtime && l > uih->maxtime && f->readyforinterrupt) || uih->interrupt) f->interrupt = 1, uih->endtime = l; } if ((l) > (waitcount + 1) * WAITTIME) { int display = 0; if (!uih->interruptiblemode && l > (waitcount1 + 1) * WAITTIME1) { display = 1; waitcount1 = l / WAITTIME1; } if (f->image == uih->image && !uih->interruptiblemode && l > (waitcount2 + 1) * WAITTIME2) { if (!uih->play) uih->display = 1, uih_finishpalette(uih), display = 1; waitcount2 = l / WAITTIME2; } if (uih->passfunc != NULL) { f->interrupt |= uih->passfunc( uih, display, f->pass, (float)(f->max ? f->pos * 100.0 / f->max : 100.0)); uih->display = 0; } waitcount = l / WAITTIME; } uih_clearwindows(uih); } void uih_do_fractal(uih_context *c) { int flags; int time; c->interrupt = 0; c->display = 0; uih = c; if (c->juliamode && !c->fcontext->mandelbrot) { uih_disablejulia(c); } if ((c->juliamode == 1 && (c->fcontext->currentformula->calculate_julia == NULL || c->fcontext->slowmode)) || (c->juliamode == 2 && c->fcontext->currentformula->calculate_julia != NULL && !c->fcontext->slowmode)) { uih_disablejulia(c); uih_enablejulia(c); c->fcontext->version++; } tl_update_time(); if (c->recalculatemode < c->fastmode && c->emulator == NULL && !c->fixedstep) c->interruptiblemode = 1; else c->interruptiblemode = 0; if (!c->interruptiblemode && c->recalculatemode > UIH_ANIMATION) { if (c->longwait != NULL) c->longwait(c); uih_stoptimers(c); } tl_update_time(); tl_reset_timer(c->calculatetimer); c->starttime = 0; c->endtime = 0; waitcount = tl_lookup_timer(c->calculatetimer) / WAITTIME + 2; waitcount1 = tl_lookup_timer(c->calculatetimer) / WAITTIME1 + 1; waitcount2 = tl_lookup_timer(c->calculatetimer) / WAITTIME2 + 1; c->incalculation = 1; if (!(c->flags & ROTATE_INSIDE_CALCULATION)) uih_cycling_stop(c); time = tl_lookup_timer(c->doittimer); if (c->rotatemode == ROTATE_CONTINUOUS) { c->fcontext->angle += c->rotationspeed * time / 1000000.0; } tl_reset_timer(c->doittimer); c->indofractal = 1; if (c->recalculatemode < UIH_PALETTEDRAW) { if (c->queue->palettechg != NULL) flags = c->queue->palettechg->action->doit(c->queue->palettechg, PALETTEONLY, 0); else flags = CHANGED; } else flags = c->uifilter->previous->action->doit( c->uifilter->previous, c->interruptiblemode ? INTERRUPTIBLE : 0, time); c->indofractal = 0; if (!(c->flags & ROTATE_INSIDE_CALCULATION)) uih_cycling_continue(c); c->dirty = 0; if (c->inanimation) c->inanimation--; c->ddatalost = 0; c->recalculatemode = 0; if (flags & ANIMATION) c->fastanimation = 1; else c->fastanimation = 0; if (c->emulator) c->inanimation = 1; if (flags & (ANIMATION | INCOMPLETE) || (c->rotatemode == ROTATE_CONTINUOUS)) { tl_resume_timer(c->doittimer); c->incomplete = 1; c->inanimation = 2; if (flags & INCOMPLETE) c->recalculatemode = UIH_ANIMATION; else c->recalculatemode = UIH_FILTERANIMATION; c->display = 1; } else { tl_stop_timer(c->doittimer); c->incomplete = 0; } if ((flags & CHANGED) && (!c->play || !c->nonfractalscreen)) { c->display = 1; if (flags & INEXACT) c->dirty = 1; } else c->incalculation = 0; uih_callcomplette(c); if (c->autopilot) c->inanimation = 1; } void uih_prepare_image(uih_context *c) { if (c->play) uih_update_lines(c); if (c->display) { uih_clearwindows(c); xprepareimage(c->image); if (uih_needrecalculate(c)) uih_do_fractal(c); } } void uih_callcomplette(uih_context *c) { if (!c->incomplete && !c->display && !c->recalculatemode && !c->inanimation && c->complettehandler != NULL) { c->complettehandler(c->handlerdata); } } void uih_setcomplettehandler(uih_context *c, void(h)(void *), void *d) { c->complettehandler = h; c->handlerdata = d; } void uih_letterspersec(uih_context *c, int n) { if (n < 1) n = 1; c->letterspersec = n; } double uih_displayed(uih_context *c) { int drawingtime; uih_finishpalette(c); if (c->indofractal) return 0; /*image is currently calculating */ if (c->recalculatemode) c->display = 1; else c->display = 0; tl_update_time(); uih_resumetimers(c); c->nonfractalscreen = 0; c->nletters = 0; if (c->incalculation) { c->incalculation = 0; drawingtime = tl_lookup_timer(c->calculatetimer); if (c->emulator) drawingtime = 0; if (c->lasttime == -1 || (drawingtime && c->lasttime && (drawingtime / c->lasttime < 0.2 || drawingtime / c->lasttime > 4))) c->lasttime = drawingtime; c->lasttime = (c->lasttime * 30 + drawingtime) / 31; c->lastspeed = c->lasttime ? 1000000.0 / c->lasttime : 100.0; if (c->interruptiblemode) { int i; int time1, time; time1 = drawingtime; time1 -= c->endtime; time = (drawingtime - c->endtime) + c->starttime; if (c->times[0][0] == -1) { for (i = 0; i < AVRGSIZE; i++) c->times[0][i] = time, c->times[1][i] = time1; c->count[0] = time * AVRGSIZE, c->count[1] = time1 * AVRGSIZE; } c->timespos = (c->timespos + 1) % AVRGSIZE; c->count[0] += time - c->times[0][c->timespos]; c->count[1] += time1 - c->times[1][c->timespos]; c->times[0][c->timespos] = time; c->times[1][c->timespos] = time1; c->maxtime = (c->count[0] * 5) / AVRGSIZE; if (c->step || c->pressed || (c->play && (c->playc->morph || c->playc->morphangle || c->playc->morphjulia || c->playc->lines.morphing)) || (c->rotatemode == ROTATE_CONTINUOUS) || c->fastanimation) { if (c->maxtime > 1000000 / 25) c->maxtime = c->count[0] * 3 / AVRGSIZE; if (c->maxtime > 1000000 / 15) c->maxtime = 1000000 / 15; } else { c->maxtime = 1000000 / 3; } if (c->maxtime < 1000000 / 30) c->maxtime = 1000000 / 30; c->maxtime -= c->count[1] / AVRGSIZE; if (c->maxtime < c->starttime + 10000) c->maxtime = c->starttime + 10000; } } uih_callcomplette(c); return (c->lastspeed); } void uih_text(uih_context *c, const char *text) { int i, l; c->display = 1; if (c->text[c->ytextpos]) free(c->text[c->ytextpos]); c->textpos[c->ytextpos] = c->xtextpos; c->textcolor[c->ytextpos] = c->color; c->displaytext |= 1 << c->ytextpos; c->text[c->ytextpos] = mystrdup(text); l = (int)strlen(text); c->todisplayletters = 0; for (i = 0; i < l; i++) { if (!isspace(text[i]) && !ispunct(text[i])) c->todisplayletters++; if (text[i] == '-') c->todisplayletters += 3; if (text[i] == '.') c->todisplayletters += 2; } c->step = 0; } void uih_clearscreen(uih_context *c) { c->clearscreen = 1; if (c->save) c->savec->clearscreen = 1; if (c->displaytext) c->displaytext = 0; if (c->text[0] != NULL) free(c->text[0]), c->text[0] = NULL; if (c->text[1] != NULL) free(c->text[1]), c->text[1] = NULL; if (c->text[2] != NULL) free(c->text[2]), c->text[2] = NULL; c->nletters = 0; c->display = 1; if (c->play) uih_clear_lines(c); } void uih_settextpos(uih_context *c, int x, int y) { const char *names1[] = { "ytextposup", "ytextposmiddle", "ytextposbottom", }; const char *names2[] = { "xtextposleft", "xtextposcenter", "xtextposright", }; c->xtextpos = x; c->ytextpos = y; uih_updatemenus(c, names1[y]); uih_updatemenus(c, names2[x]); } /*timing routines */ void uih_tbreak(uih_context *c) { c->tbreak = 1; } void uih_emulatetimers(uih_context *c) { if (c->emulator == NULL) return; tl_emulate_timer(c->maintimer, c->emulator); tl_emulate_timer(c->doittimer, c->emulator); if (c->autopilot) tl_emulate_timer(c->autopilottimer, c->emulator); if (c->cycling) { tl_emulate_timer(c->cyclingtimer, c->emulator); } if (c->play) { tl_emulate_timer(c->playc->timer, c->emulator); } if (c->save) { tl_emulate_timer(c->savec->timer, c->emulator); tl_emulate_timer(c->savec->synctimer, c->emulator); } } static void uih_unemulatetimers(uih_context *c) { tl_unemulate_timer(c->maintimer); tl_unemulate_timer(c->doittimer); if (c->autopilot) tl_unemulate_timer(c->autopilottimer); if (c->cycling) tl_unemulate_timer(c->cyclingtimer); if (c->play) { tl_unemulate_timer(c->playc->timer); } if (c->save) { tl_unemulate_timer(c->savec->timer); tl_unemulate_timer(c->savec->synctimer); } } void uih_constantframetime(uih_context *c, int time) { if (c->emulator == NULL) c->emulator = tl_create_emulator(); c->emulatedframetime = time; uih_emulatetimers(c); } void uih_noconstantframetime(uih_context *c) { if (c->emulator == NULL) return; uih_unemulatetimers(c); tl_free_emulator(c->emulator); c->emulator = NULL; } void uih_stoptimers(uih_context *c) { if (!c->stoppedtimers) { c->stoppedtimers = 1; c->display = 1; tl_stop_timer(c->maintimer); tl_stop_timer(c->doittimer); if (c->autopilot) tl_stop_timer(c->autopilottimer); if (c->play) { tl_stop_timer(c->playc->timer); if (c->cycling) tl_stop_timer(c->cyclingtimer); } if (c->save) { tl_stop_timer(c->savec->timer); tl_stop_timer(c->savec->synctimer); if (c->cycling) tl_stop_timer(c->cyclingtimer); } } } void uih_slowdowntimers(uih_context *c, int time) { tl_slowdown_timer(c->maintimer, time); if (c->autopilot) tl_slowdown_timer(c->autopilottimer, time); if (c->play) { tl_slowdown_timer(c->playc->timer, time); if (c->cycling) tl_slowdown_timer(c->cyclingtimer, time); } if (c->save) { tl_slowdown_timer(c->savec->timer, time); tl_slowdown_timer(c->savec->synctimer, time); if (c->cycling) tl_slowdown_timer(c->cyclingtimer, time); } } void uih_resumetimers(uih_context *c) { if (c->stoppedtimers) { c->stoppedtimers = 0; tl_resume_timer(c->maintimer); if (c->cycling) tl_resume_timer(c->cyclingtimer); if (c->autopilot) tl_resume_timer(c->autopilottimer); if (c->play) { tl_resume_timer(c->playc->timer); } if (c->save) { tl_resume_timer(c->savec->timer); tl_resume_timer(c->savec->synctimer); } } } /*autopilot implementation */ static void uih_changed(void) { uih_newimage(uih); } static void uih_autopilothandler(void *uih1, int n) { uih = (uih_context *)uih1; do_autopilot(uih, &uih->autopilotx, &uih->autopiloty, &uih->autopilotbuttons, uih_changed, n); } static inline void uih_zoom(uih_context *uih) { uih->step += uih->speedup * 2 * uih->mul; if (uih->step > uih->maxstep) uih->step = uih->maxstep; else if (uih->step < -uih->maxstep) uih->step = -uih->maxstep; } static inline void uih_unzoom(uih_context *uih) { uih->step -= uih->speedup * 2 * uih->mul; if (uih->step > uih->maxstep) uih->step = uih->maxstep; else if (uih->step < -uih->maxstep) uih->step = -uih->maxstep; } static inline void uih_slowdown(uih_context *uih) { if (uih->step > 0) { if (uih->step < uih->speedup * uih->mul) uih->step = 0; else uih->step -= uih->speedup * uih->mul; } else if (uih->step < 0) { if (uih->step > -uih->speedup * uih->mul) uih->step = 0; else uih->step += uih->speedup * uih->mul; } } static inline void uih_zoomupdate(uih_context *uih) { number_t x; number_t y; number_t mmul = pow((double)(1 - uih->step), (double)uih->mul); number_t mc = uih->fcontext->s.cr - uih->fcontext->s.rr / 2; number_t nc = uih->fcontext->s.cr + uih->fcontext->s.rr / 2; number_t mi = uih->fcontext->s.ci - uih->fcontext->s.ri / 2; number_t ni = uih->fcontext->s.ci + uih->fcontext->s.ri / 2; x = uih->xcenter, y = uih->ycenter; mc = x + (mc - x) * (mmul); nc = x + (nc - x) * (mmul); mi = y + (mi - y) * (mmul); ni = y + (ni - y) * (mmul); uih->fcontext->s.rr = nc - mc; uih->fcontext->s.ri = ni - mi; uih->fcontext->s.cr = (nc + mc) / 2; uih->fcontext->s.ci = (ni + mi) / 2; uih_animate_image(uih); } /*main uih loop */ int uih_update(uih_context *c, int mousex, int mousey, int mousebuttons) { int inmovement = 0; int slowdown = 1; int time; uih = c; if (!mousebuttons && uih->lastbuttons) uih_saveundo(c); uih->lastbuttons = mousebuttons; if (c->incalculation) return 0; if (c->emulator != NULL) tl_elpased(c->emulator, c->emulatedframetime); if (mousebuttons == (BUTTON1 | BUTTON3)) mousebuttons = BUTTON2; tl_process_group(syncgroup, NULL); /*First we need to update timing */ tl_update_time(); time = tl_lookup_timer(c->maintimer); if (c->autopilot) { /*now handle autopilot */ tl_process_group(c->autopilotgroup, NULL); } if (!c->inanimation) time = 0; if (time > 2000000) { uih_slowdowntimers(uih, time - 2000000); time = 2000000; } if (c->inanimation) c->inanimation--; tl_reset_timer(c->maintimer); c->mul = (double)time / FRAMETIME; if (c->fixedstep) c->mul = 0.3; if (c->tbreak) c->mul = 1, c->tbreak--; if (c->mul == 0) c->mul = 0.00000001; if (c->play) { uih_playupdate(c); if (!c->play) { c->inanimation = 2; return 1; } if (c->playc->lines.morphing) /*inmovement=1, c->display=1; */ uih_update_lines(c); if (c->step) uih_zoomupdate(c), inmovement = 1; switch (c->zoomactive) { case 1: uih_zoom(c), inmovement = 1; break; case -1: uih_unzoom(c), inmovement = 1; break; default: uih_slowdown(c); } if (c->playc->morph) { int timer = tl_lookup_timer(c->playc->timer) - c->playc->starttime; number_t mmul = /*(tl_lookup_timer (c->playc->timer) - c->playc->starttime) / (number_t) (c->playc->frametime - c->playc->starttime); */ MORPHVALUE(timer, c->playc->frametime - c->playc->starttime, c->playc->morphtimes[0], c->playc->morphtimes[1]); number_t srr, drr; number_t mmul1; if (c->playc->source.rr * c->fcontext->windowwidth > c->playc->source.ri * c->fcontext->windowheight) srr = c->playc->source.rr; else srr = c->playc->source.ri; if (c->playc->destination.rr * c->fcontext->windowwidth > c->playc->destination.ri * c->fcontext->windowheight) drr = c->playc->destination.rr; else drr = c->playc->destination.ri; if (srr == drr) mmul1 = mmul; else mmul1 = (exp(log(srr) + ((log(drr) - log(srr)) * mmul)) - srr) / (drr - srr); if (mmul1 > 1) mmul1 = 1; if (mmul1 < 0) mmul1 = 0; inmovement = 1; c->fcontext->s.rr = c->playc->source.rr + (c->playc->destination.rr - c->playc->source.rr) * mmul1; c->fcontext->s.ri = c->playc->source.ri + (c->playc->destination.ri - c->playc->source.ri) * mmul1; c->fcontext->s.cr = c->playc->source.cr + (c->playc->destination.cr - c->playc->source.cr) * mmul1; c->fcontext->s.ci = c->playc->source.ci + (c->playc->destination.ci - c->playc->source.ci) * mmul1; uih_animate_image(c); } if (c->playc->morphjulia) { int timer = tl_lookup_timer(c->playc->timer) - c->playc->starttime; number_t mmul = /*(tl_lookup_timer (c->playc->timer) - c->playc->starttime) / (number_t) (c->playc->frametime - c->playc->starttime); */ MORPHVALUE(timer, c->playc->frametime - c->playc->starttime, c->playc->morphjuliatimes[0], c->playc->morphjuliatimes[1]); uih_setjuliaseed( uih, c->playc->sr + (c->playc->dr - c->playc->sr) * mmul, c->fcontext->pim = c->playc->si + (c->playc->di - c->playc->si) * mmul); inmovement = 1; } if (c->playc->morphangle) { int timer = tl_lookup_timer(c->playc->timer) - c->playc->starttime; number_t mmul = /*(tl_lookup_timer (c->playc->timer) - c->playc->starttime) / (number_t) (c->playc->frametime - c->playc->starttime); */ MORPHVALUE(timer, c->playc->frametime - c->playc->starttime, c->playc->morphangletimes[0], c->playc->morphangletimes[1]); uih_angle(uih, c->playc->srcangle + (c->playc->destangle - c->playc->srcangle) * mmul); inmovement = 1; } } else { if (!c->juliamode) { if (c->autopilot) { /*now handle autopilot */ mousex = c->autopilotx; mousey = c->autopiloty; mousebuttons = c->autopilotbuttons; inmovement = 1; } if (c->step) { number_t x; number_t y; if (mousex != c->xcenterm || mousey != c->ycenterm) { c->xcenterm = mousex; c->ycenterm = mousey; uih_getcoord(uih, mousex, mousey, &x, &y); c->xcenter = x; c->ycenter = y; } uih_zoomupdate(c), inmovement = 1; } c->zoomactive = 0; if (c->rotatemode != ROTATE_MOUSE) switch (mousebuttons) { /*process buttons */ case BUTTON1: c->zoomactive = 1; inmovement = 1; break; case BUTTON3: c->zoomactive = -1; inmovement = 1; break; } uih_saveframe(c); if (c->rotatemode != ROTATE_MOUSE) { c->rotatepressed = 0; switch (mousebuttons) { /*process buttons */ case BUTTON1: uih_zoom(c), slowdown = 0; break; case BUTTON3: uih_unzoom(c), slowdown = 0; break; case BUTTON2: { /* handles panning */ number_t x, y; uih_getcoord(uih, mousex, mousey, &x, &y); if (c->pressed && (c->oldx != x || c->oldy != y)) { c->fcontext->s.cr -= x - c->oldx; c->fcontext->s.ci -= y - c->oldy; uih_animate_image(c); c->moved = 1; } c->speed = 0; /* issue 115 - disable rotation to update panning */ if(c->pressed == 0) { int old_mode = c->rotatemode; uih_rotate(c, 0); uih_getcoord(uih, mousex, mousey, &c->oldx, &c->oldy); uih_rotate(c, old_mode); } c->pressed = 1; } break; } } else { if (mousebuttons & BUTTON1) { number_t x, y; number_t angle; x = (mousex - c->image->width / 2) * c->image->pixelwidth; y = (mousey - c->image->height / 2) * c->image->pixelheight; angle = -atan2(x, y) * 180 / M_PI; if (c->rotatepressed) { uih_angle(uih, c->fcontext->angle + angle - c->oldangle); } c->rotatepressed = 1; c->oldangle = angle; } else if (mousebuttons & BUTTON2) { number_t x, y; uih_getcoord(uih, mousex, mousey, &x, &y); if (c->pressed && (c->oldx != x || c->oldy != y)) { c->fcontext->s.cr -= x - c->oldx; c->fcontext->s.ci -= y - c->oldy; uih_animate_image(c); c->moved = 1; } c->speed = 0; /* issue 115 - disable rotation to update panning */ if(c->pressed == 0) { int old_mode = c->rotatemode; uih_rotate(c, 0); uih_getcoord(uih, mousex, mousey, &c->oldx, &c->oldy); uih_rotate(c, old_mode); } c->pressed = 1; } else c->rotatepressed = 0; } if (!(mousebuttons & BUTTON2)) c->pressed = 0; if (slowdown) uih_slowdown(c); } else { if (mousebuttons & BUTTON1) { number_t x, x1 = c->fcontext->pre; number_t y, y1 = c->fcontext->pim; c->zoomactive = 0; uih_getcoord(uih, mousex, mousey, &x, &y); c->fcontext->pre = x; c->fcontext->pim = y; uih_saveframe(c); c->pressed = 1; recalculate(c->fcontext->plane, &c->fcontext->pre, &c->fcontext->pim); if (c->fcontext->pre != x1 || c->fcontext->pim != y1) { uih_animate_image(c); } } else c->pressed = 0; } } if (!inmovement) uih_tbreak(c); if (c->incomplete) inmovement = 1; if (!c->recalculatemode && !c->display) uih_finishpalette(c); if (!inmovement) uih_callcomplette(c); if (c->inanimation < inmovement * 2) c->inanimation = inmovement * 2; return (inmovement * 2); } /*actions that can be used be user interface */ void uih_autopilot_on(uih_context *c) { if (!c->autopilot) { clean_autopilot(c); uih_autopilothandler(c, 1); tl_update_time(); uih_resumetimers(c); c->autopilottimer = tl_create_timer(); c->autopilotgroup = tl_create_group(); tl_set_multihandler(c->autopilottimer, uih_autopilothandler, c); tl_set_interval(c->autopilottimer, 1000000 / 25); tl_reset_timer(c->autopilottimer); tl_add_timer(c->autopilotgroup, c->autopilottimer); tl_update_time(); c->autopilot = 1; uih_emulatetimers(c); uih_updatemenus(c, "autopilot"); } } void uih_autopilot_off(uih_context *c) { if (c->autopilot) { tl_remove_timer(c->autopilottimer); tl_free_timer(c->autopilottimer); tl_free_group(c->autopilotgroup); c->autopilot = 0; uih_updatemenus(c, "autopilot"); } } void uih_mkdefaultpalette(uih_context *c) { if (c->zengine->fractalc->palette == NULL) return; uih_cycling_stop(c); if (mkdefaultpalette(c->zengine->fractalc->palette) != 0) { uih_newimage(c); } uih_palettechg(c); c->paletteshift = 0; c->manualpaletteshift = 0; c->palettechanged = 1; c->palettetype = 0; uih_finishpalette(c); uih_cycling_continue(c); } void uih_mkpalette(uih_context *c) { int seed; int alg = rand() % PALGORITHMS; if (c->zengine->fractalc->palette == NULL) return; uih_cycling_stop(c); if (mkpalette(c->zengine->fractalc->palette, seed = rand(), alg) != 0) { uih_newimage(c); } uih_palettechg(c); c->paletteshift = 0; c->manualpaletteshift = 0; c->paletteseed = seed; uih_finishpalette(c); c->palettechanged = 1; c->palettetype = alg + 1; uih_cycling_continue(c); } /*Basic inicialization routines */ static void uih_alloctables(uih_context *c) { c->zengine = zoom_filter.getinstance(&zoom_filter); if (c->zengine == NULL) return; c->fcontext = make_fractalc(0, c->image->pixelwidth * c->image->width, c->image->pixelheight * c->image->height); uih_updatemenus(c, "periodicity") uih_updatemenus(c, "in0") uih_updatemenus(c, "int0") uih_updatemenus(c, "out0") uih_updatemenus(c, "outt0") uih_updatemenus(c, "plane0") uih_updatemenus(c, "guess3") uih = c; c->uifilter = uih_filter.getinstance(&uih_filter); c->queue = create_queue(c->uifilter); insertfilter(c->zengine, c->uifilter); } static int uih_initqueue(uih_context *c) { return (initqueue(c->queue)); } void uih_setmaxstep(uih_context *c, number_t p) { c->maxstep = p; } void uih_setspeedup(uih_context *c, number_t p) { c->speedup = p; } void uih_setmaxiter(uih_context *c, int maxiter) { if (maxiter < 1) maxiter = 1; if (maxiter > 2000000) maxiter = 2000000; if (c->fcontext->maxiter != (unsigned int)maxiter) { c->fcontext->maxiter = maxiter; c->fcontext->version++; uih_newimage(c); } } void uih_setbailout(uih_context *c, number_t bailout) { if (bailout < 0) bailout = 0; if (c->fcontext->bailout != (number_t)bailout) { c->fcontext->bailout = bailout; c->fcontext->version++; uih_newimage(c); } } void uih_setincoloringmode(uih_context *c, int mode) { if (mode < 0) mode = rand() % INCOLORING; if (mode > INCOLORING) mode = INCOLORING; if (c->fcontext->incoloringmode != mode) { char str[10]; c->fcontext->incoloringmode = mode; c->fcontext->version++; uih_newimage(c); sprintf(str, "in%i", mode); uih_updatemenus(c, str); } } void uih_setintcolor(uih_context *c, int mode) { if (mode < 0) mode = rand() % TCOLOR; if (mode > TCOLOR) mode = TCOLOR; if (c->fcontext->intcolor != mode) { char str[10]; c->fcontext->intcolor = mode; if (c->fcontext->incoloringmode == 10) { c->fcontext->version++; uih_newimage(c); } sprintf(str, "int%i", mode); uih_updatemenus(c, str); } } void uih_setouttcolor(uih_context *c, int mode) { if (mode < 0) mode = rand() % TCOLOR; if (mode > TCOLOR) mode = TCOLOR; if (c->fcontext->outtcolor != mode) { char str[10]; c->fcontext->outtcolor = mode; if (c->fcontext->coloringmode == 10) { c->fcontext->version++; uih_newimage(c); } sprintf(str, "outt%i", mode); uih_updatemenus(c, str); } } void uih_setperbutation(uih_context *c, number_t zre, number_t zim) { if (c->fcontext->bre != zre || c->fcontext->bim != zim) { c->fcontext->bre = zre; c->fcontext->bim = zim; if (c->fcontext->mandelbrot) { c->fcontext->version++; uih_newimage(c); } uih_updatemenus(c, "uiperturbation"); } } void uih_perbutation(uih_context *c, int mousex, int mousey) { number_t r, i; uih_getcoord(c, mousex, mousey, &r, &i); uih_setperbutation(c, r, i); } void uih_setjuliaseed(uih_context *c, number_t zre, number_t zim) { if (c->fcontext->pre != zre || c->fcontext->pim != zim) { c->fcontext->pre = zre; c->fcontext->pim = zim; if (c->juliamode) { uih_animate_image(c); } else { if (!c->fcontext->mandelbrot) { c->fcontext->version++; if (c->playc && c->playc->morphjulia) uih_animate_image(c); else uih_newimage(c); } } } } void uih_setfastmode(uih_context *c, int mode) { const char *names[] = {"nodynamic", "nodynamic", "dynamicanimation", "dynamicnew", "dynamicnew"}; if (mode < 0) mode = 0; c->fastmode = mode; uih_updatemenus(c, names[mode]); } void uih_setoutcoloringmode(uih_context *c, int mode) { if (mode < 0) mode = rand() % OUTCOLORING; if (mode > OUTCOLORING) mode = OUTCOLORING - 1; if (c->fcontext->coloringmode != mode) { char str[10]; c->fcontext->coloringmode = mode; c->fcontext->version++; uih_newimage(c); sprintf(str, "out%i", mode); uih_updatemenus(c, str); } } void uih_setplane(uih_context *c, int mode) { int i; if (mode < 0) mode = 0; for (i = 0; planename[i] != NULL; i++) ; if (mode >= i) mode = i - 1; if (mode < 0) mode = rand() % i; uih_invalidatepos(c); if (c->fcontext->plane != mode) { char str[20]; c->fcontext->plane = mode; // if ( c->fcontext->plane == P_USER ) // printf("USER NOT IMPLEMENTED"); // uih_sffein( c, "z^3-c" ) c->fcontext->version++; uih_newimage(c); sprintf(str, "plane%i", mode); uih_updatemenus(c, str); } } void uih_screentofractalcoord(uih_context *c, int mousex, int mousey, number_t *re, number_t *im) { uih_getcoord(c, mousex, mousey, re, im); recalculate(c->fcontext->plane, re, im); } void uih_setmandelbrot(uih_context *c, int mode, int mousex, int mousey) { if (mode < 0) mode = 0; if (mode > 1) mode = 1; if (c->fcontext->mandelbrot != mode) { c->fcontext->mandelbrot = mode; if (c->fcontext->mandelbrot == 0 && !c->juliamode) { uih_getcoord(c, mousex, mousey, &c->fcontext->pre, &c->fcontext->pim); recalculate(c->fcontext->plane, &c->fcontext->pre, &c->fcontext->pim); } else uih_disablejulia(c); c->fcontext->version++; uih_newimage(c); uih_updatemenus(c, "uimandelbrot"); } } void uih_setguessing(uih_context *c, int range) { char str[10]; c->fcontext->range = range; if (range <= 1) { uih_updatemenus(c, "noguess"); } else if (range > 8) { uih_updatemenus(c, "guessall"); } else { sprintf(str, "guess%i", range); uih_updatemenus(c, str); } } void uih_setperiodicity(uih_context *c, int periodicity) { c->fcontext->periodicity = periodicity; uih_updatemenus(c, "periodicity"); } void uih_interrupt(uih_context *c) { if (c->incalculation) c->interrupt = 1; } void uih_stopzooming(uih_context *c) { c->speed = 0; } int uih_updateimage(uih_context *c, struct image *image) { /*exit(); */ c->image = image; c->palette = image->palette; c->queue->isinitialized = 0; c->ddatalost = 1; fractalc_resize_to(c->fcontext, c->image->pixelwidth * c->image->width, c->image->pixelheight * c->image->height); c->display = 1; c->palette->ncells = sizeof(uicolors) / sizeof(rgb_t); c->palette->prergb = uicolors; if (c->palette->type & BITMAPS) c->palette->prergb = uibwcolors; c->inanimation = 2; uih_newimage(c); if (image->palette->type & (FIXEDCOLOR | BITMAPS)) uih_fixedcolorenable(c); else uih_fixedcolordisable(c); return (uih_initqueue(c)); } static void uih_getcscreensizes(struct uih_context *uih, int *x, int *y, int *w, int *h, void * /*data*/) { *x = 0; *y = 0; if (uih->clearscreen) *w = uih->image->width, *h = uih->image->height; else *w = *h = 0; } static void uih_drawcscreen(struct uih_context *uih, void * /*data*/) { if (uih->clearscreen) clear_image(uih->image); } struct uih_context * uih_mkcontext(int flags, struct image *image, int (*passfunc)(struct uih_context *, int, const char *, float), void (*longwait)(struct uih_context *), void (*upd)(struct uih_context *, const char *)) { uih_context *uih; uih = (uih_context *)calloc(sizeof(*uih), 1); /*setup parameters */ uih->updatemenus = upd; uih->autopilot = 0; uih->flags = flags; uih->image = image; uih->playstring = NULL; uih->palette = image->palette; uih->menuroot = "root"; uih->palette->ncells = sizeof(uicolors) / sizeof(rgb_t); uih->palette->prergb = uicolors; if (uih->palette->type & BITMAPS) { uih->palette->prergb = uibwcolors; } uih->speed = 0; uih->step = 0; uih->color = 0; uih->speedup = STEP; uih->maxstep = MAXSTEP; uih->lasttime = -1; uih->recalculatemode = UIH_NEW_IMAGE; uih->display = 1; uih->fastmode = 2; uih_updatemenus(uih, "dynamicanimation"); uih->aliasnum = -1; uih->direction = 1; uih->cyclingdirection = 1; uih->cyclingspeed = ROTATIONSPEED; uih->ddatalost = 1; uih->xtextpos = 1; uih_updatemenus(uih, "xtextleft"); uih->complettehandler = 0; uih->ytextpos = 1; uih_updatemenus(uih, "ytextup"); uih->display = 0; uih->errstring = NULL; uih->rotatemode = 0; uih_updatemenus(uih, "norotate"); uih->rotationspeed = 10; uih->longwait = longwait; uih->passfunc = passfunc; uih->nletters = 0; uih->letterspersec = 15; uih->maintimer = tl_create_timer(); uih->calculatetimer = tl_create_timer(); uih->doittimer = tl_create_timer(); tl_update_time(); tl_reset_timer(uih->maintimer); tl_reset_timer(uih->calculatetimer); tl_stop_timer(uih->doittimer); tl_reset_timer(uih->doittimer); uih_alloctables(uih); uih_initqueue(uih); /*FIXME return value should not be ignored */ if (image->palette->type & (FIXEDCOLOR | BITMAPS)) uih_fixedcolorenable(uih); uih_mkdefaultpalette(uih); uih_stoptimers(uih); clean_autopilot(uih); uih_newimage(uih); uih->cscreenwindow = uih_registerw(uih, uih_getcscreensizes, uih_drawcscreen, 0, NONTRANSPARENTW); uih_initmessages(uih); uih_inittext(uih); uih_emulatetimers(uih); #ifdef USE_SFFE sffe_parse(&uih->fcontext->userformula, USER_FORMULA); sffe_parse(&uih->fcontext->userinitial, ""); #endif uih_setformula(uih, 0); uih_saveundo(uih); return (uih); } void uih_savepalette(uih_context *c) { if (c->palette2 != NULL) destroypalette(c->palette2); if (c->zengine->fractalc->palette != NULL) c->palette2 = clonepalette(c->zengine->fractalc->palette); } void uih_restorepalette(uih_context *uih) { if (uih->palette2 != NULL) { if (uih->zengine->fractalc->palette != NULL) restorepalette(uih->zengine->fractalc->palette, uih->palette2); destroypalette(uih->palette2); } uih->palette2 = NULL; uih_finishpalette(uih); } void uih_loadpalette(uih_context *c, struct palette *palette) { if (c->palette2) destroypalette(c->palette2); c->palette2 = clonepalette(palette); uih_restorepalette(c); uih_palettechg(c); } struct palette *uih_clonepalette(uih_context *c) { if (c->zengine->fractalc->palette != NULL) return clonepalette(c->zengine->fractalc->palette); // I hope this is OK: return NULL; } void uih_setformula(uih_context *c, int num) { set_formula(c->fcontext, num); uih_newimage(c); uih_updatemenus(c, "uimandelbrot"); uih_updatemenus(c, "uiperturbation"); uih_updatemenus(c, c->fcontext->currentformula->shortname); } void uih_sffeset(uih_context *c, sffe *parser, const char *formula) { char error[200]; char previous[200]; if (c->fcontext->userformula->expression) strcpy(previous, c->fcontext->userformula->expression); else strcpy(previous, USER_FORMULA); parser->errormsg = error; int errorcode = sffe_parse(&parser, formula); if (errorcode > 0) { if (errorcode != EmptyFormula || parser != c->fcontext->userinitial) { tl_update_time(); // otherwise error doesn't display long enough uih_error(c, error); sffe_parse(&parser, previous); } } else { if (parser->expression) uih_message(c, parser->expression); sffe_setlocal(c->fcontext); if (!(c->fcontext->currentformula->flags & SFFE_FRACTAL)) { uih_play_formula(c, "user"); } else { uih_recalculate(c); } } parser->errormsg = NULL; } void uih_initstate(struct uih_context *uih) { int i; int ver = uih->fcontext->version; uih->step = 0; uih->speedup = STEP; uih->maxstep = MAXSTEP; uih_fastrotatedisable(uih); uih_disablejulia(uih); uih->color = 0; uih_cycling_off(uih); for (i = 0; i < uih_nfilters; i++) uih_disablefilter(uih, i); uih_setperbutation(uih, 0, 0); set_formula(uih->fcontext, 0); #ifdef USE_SFFE sffe_parse(&uih->fcontext->userformula, USER_FORMULA); sffe_parse(&uih->fcontext->userinitial, ""); #endif uih_setperiodicity(uih, 1); uih_setmaxiter(uih, 170); uih_setbailout(uih, 4); uih_setincoloringmode(uih, 0); uih_setoutcoloringmode(uih, 0); uih_setcycling(uih, 30); uih_display(uih); uih_setfastmode(uih, 2); uih_setintcolor(uih, 0); uih_setouttcolor(uih, 0); uih_setplane(uih, 0); uih_setguessing(uih, 3); uih_angle(uih, 0); uih_rotatemode(uih, 0); uih_rotationspeed(uih, 10); uih->xtextpos = 1; uih->ytextpos = 1; if (uih->playc) { uih->playc->morphtimes[0] = 0; uih->playc->morphtimes[1] = 0; uih->playc->morphjuliatimes[0] = 0; uih->playc->morphjuliatimes[1] = 0; uih->playc->morphangletimes[0] = 0; uih->playc->morphangletimes[1] = 0; uih->playc->morphlinetimes[0] = 0; uih->playc->morphlinetimes[1] = 0; } if (mkdefaultpalette(uih->zengine->fractalc->palette) != 0 || uih->recalculatemode || uih->fcontext->version != ver) { uih_newimage(uih); } } void uih_freecontext(uih_context *c) { struct filter *f; int i; if (c->emulator != NULL) uih_noconstantframetime(c); for (i = 0; i < UNDOLEVEL; i++) if (c->undo.undos[i]) free(c->undo.undos[i]), c->undo.undos[i] = 0; while (c->queue->first) { f = c->queue->first; removefilter(c->queue->first); f->action->destroyinstance(f); } uih_destroymessages(c); uih_destroytext(c); uih_removew(c, c->cscreenwindow); free(c->queue); free_fractalc(c->fcontext); free(c); } static struct filter *uih_getinstance(const struct filteraction *a) { struct filter *f = createfilter(a); f->data = uih; f->name = "XaoS's user interface layer"; return (f); } static void uih_destroyinstance(struct filter *f) { struct uih_context *c = (struct uih_context *)f->data; if (c->autopilot) uih_autopilot_off(c); if (c->cycling) uih_cycling_off(c); tl_free_timer(c->maintimer); tl_free_timer(c->calculatetimer); tl_free_timer(c->doittimer); if (c->save) uih_save_disable(c); if (c->play) uih_replaydisable(c); free(f); } static int wascycling; static int uih_require(struct filter *f, struct requirements *r) { struct uih_context *uih; uih = (struct uih_context *)f->data; f->req = *r; uih_clearwindows(uih); if (uih->cycling) uih_cycling_off(uih), wascycling = 1; if (!(r->supportedmask & uih->image->palette->type)) return 0; /*FIXME something should be done here :) */ return (1); } static int uih_initialize(struct filter *f, struct initdata *i) { struct uih_context *uih; int returnval; uih = (struct uih_context *)f->data; f->queue->saveimage = uih->image; i->fractalc = uih->fcontext; uih_setfont(uih); tl_update_time(); f->image = uih->image; f->wait_function = uih_waitfunc; uih->times[0][0] = -1; i->image = uih->image; f->fractalc = i->fractalc; f->image->palette->flags |= FINISHLATER; i->fractalc->palette = uih->image->palette; i->wait_function = uih_waitfunc; /*FIXME datalost should be handled in better way */ if (uih->ddatalost) i->flags |= DATALOST; uih->tbreak = 2; uih_invalidatepos(uih); clean_autopilot(uih); returnval = f->previous->action->initialize(f->previous, i); if (wascycling) uih_cycling_on(uih), wascycling = 0; return returnval; } void uih_inhibittextsw(uih_context *c) { c->inhibittextoutput ^= 1; uih_updatemenus(c, "inhibittextoutput"); } int uih_inhibittextselected(uih_context *c) { if (c == NULL) return 0; return c->inhibittextoutput; } static char statustext[256]; static int statusstart; static struct uih_window *statuswindow = NULL; static int ministatusstart; static struct uih_window *ministatuswindow = NULL; static struct uih_window *cartesiangridwindow = NULL; void uih_updatestatus(uih_context *uih) { double times = (uih->fcontext->currentformula->v.rr) / (uih->fcontext->s.rr); double timesnop = log(times) / log(10.0); double speed; uih_drawwindows(uih); uih_cycling_continue(uih); speed = uih_displayed(uih); sprintf( statustext, TR("Message", "%s %.2f times (%.1fE) %2.2f frames/sec %c %i %i %i %u "), times < 1 ? TR("Message", "unzoomed") : TR("Message", "zoomed"), times < 1 ? 1.0 / times : times, timesnop, speed, uih->autopilot ? 'A' : ' ', uih->fcontext->coloringmode + 1, uih->fcontext->incoloringmode + 1, uih->fcontext->plane + 1, uih->fcontext->maxiter); STAT(printf(TR("Message", "framerate:%f\n"), speed)); } #ifdef MEMCHECK #define STATUSLINES 14 #else #define STATUSLINES 12 #endif void uih_updatestarts(uih_context *uih) { int y = 0; ministatusstart = y; if (ministatuswindow != NULL) y += xtextheight(uih->image, uih->font); statusstart = y; if (statuswindow != NULL) y += xtextheight(uih->image, uih->font) * STATUSLINES; uih->messg.messagestart = y; } static void uih_statuspos(uih_context *uih, int *x, int *y, int *w, int *h, void * /*data*/) { *x = 0; *y = statusstart; *w = uih->image->width; *h = xtextheight(uih->image, uih->font) * STATUSLINES; } static void uih_drawstatus(uih_context *uih, void * /*data*/) { char str[6000]; int h = xtextheight(uih->image, uih->font); sprintf(str, TR("Message", "Fractal name:%s"), uih->fcontext->currentformula->name[!uih->fcontext->mandelbrot]); xprint(uih->image, uih->font, 0, statusstart, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "Fractal type:%s"), uih->fcontext->mandelbrot ? TR("Message", "Mandelbrot") : TR("Message", "Julia")); #ifdef USE_SFFE if (uih->fcontext->currentformula->flags & SFFE_FRACTAL && uih->fcontext->userformula->expression) { sprintf(str, TR("Message", "Formula:%s"), uih->fcontext->userformula->expression); }; #endif xprint(uih->image, uih->font, 0, statusstart + h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "View:[%1.12f,%1.12f]"), (double)uih->fcontext->s.cr, (double)uih->fcontext->s.ci); xprint(uih->image, uih->font, 0, statusstart + 2 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "size:[%1.12f,%1.12f]"), (double)uih->fcontext->s.rr, (double)uih->fcontext->s.ri); xprint(uih->image, uih->font, 0, statusstart + 3 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "Rotation:%4.2f Screen size:%i:%i"), (double)uih->fcontext->angle, uih->image->width, uih->image->height); xprint(uih->image, uih->font, 0, statusstart + 4 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "Iterations:%-4u Palette size:%i"), uih->fcontext->maxiter, uih->image->palette->size); xprint(uih->image, uih->font, 0, statusstart + 5 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "Bailout:%4.2f"), (double)uih->fcontext->bailout); xprint(uih->image, uih->font, 0, statusstart + 6 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "Autopilot:%-4s Plane:%s"), uih->autopilot ? TR("Message", "On") : TR("Message", "Off"), planename[uih->fcontext->plane]); xprint(uih->image, uih->font, 0, statusstart + 7 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "incoloring:%s outcoloring:%s"), incolorname[uih->fcontext->incoloringmode], outcolorname[uih->fcontext->coloringmode]); xprint(uih->image, uih->font, 0, statusstart + 8 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, TR("Message", "zoomspeed:%f"), (float)uih->maxstep * 1000); xprint(uih->image, uih->font, 0, statusstart + 9 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); if (uih->fcontext->mandelbrot) strcpy(str, TR("Message", "Parameter:none")); else sprintf(str, TR("Message", "Parameter:[%f,%f]"), (float)uih->fcontext->pre, (float)uih->fcontext->pim); xprint(uih->image, uih->font, 0, statusstart + 10 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); /* Compute exact mouse position. */ QPoint globalCursorPos = QCursor::pos(); QPoint windowCursorPos = qApp->widgetAt(globalCursorPos)->mapFromGlobal(QCursor::pos()); int cursorposx = windowCursorPos.x(); int cursorposy = windowCursorPos.y(); double realwidth = (double)uih->fcontext->rs.mc - (double)uih->fcontext->rs.nc; double realheight = (double)uih->fcontext->rs.mi - (double)uih->fcontext->rs.ni; double pixelwidth = realwidth/ uih->image->width; double pixelheight = realheight / uih->image->height; double realrelposx = pixelwidth * cursorposx; double realrelposy = pixelheight * cursorposy; double windowleftabspos = (double)uih->fcontext->rs.nc; double windowtopabspos = (double)uih->fcontext->rs.ni; double cursorabsposx = windowleftabspos + realrelposx; double cursorabsposy = windowtopabspos + realrelposy; sprintf(str, TR("Message", "Mouse:[%1.12f,%1.12f]"), (double)cursorabsposx, (double)cursorabsposy); xprint(uih->image, uih->font, 0, statusstart + 11 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); #ifdef MEMCHECK { struct mallinfo i = mallinfo(); sprintf(str, "Allocated arena:%i Wasted:%i %i", i.arena, i.ordblks, i.fordblks); xprint(uih->image, uih->font, 0, statusstart + 12 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); sprintf(str, "Mmaped blocks%i Mmaped area:%i keep:%i", i.hblks, i.hblkhd, i.keepcost); xprint(uih->image, uih->font, 0, statusstart + 13 * h, str, FGCOLOR(uih), BGCOLOR(uih), 0); } #endif } void uih_status(uih_context *uih) { if (statuswindow == NULL) { statuswindow = uih_registerw(uih, uih_statuspos, uih_drawstatus, NULL, 0); } else { uih_removew(uih, statuswindow); statuswindow = NULL; } uih_updatemenus(uih, "status"); uih_updatemenus(uih, "animministatus"); uih_updatestarts(uih); } int uih_statusenabled(uih_context * /*uih*/) { return (statuswindow != NULL); } static void uih_ministatuspos(uih_context *uih, int *x, int *y, int *w, int *h, void * /*data*/) { *x = 0; *y = ministatusstart; *w = uih->image->width; *h = xtextheight(uih->image, uih->font); } static void uih_drawministatus(uih_context *uih, void * /*data*/) { xprint(uih->image, uih->font, 0, ministatusstart, statustext, FGCOLOR(uih), BGCOLOR(uih), 0); } void uih_ministatus(uih_context *uih) { if (ministatuswindow == NULL) { ministatuswindow = uih_registerw(uih, uih_ministatuspos, uih_drawministatus, NULL, 0); } else { uih_removew(uih, ministatuswindow); ministatuswindow = NULL; } uih_updatestarts(uih); uih_updatemenus(uih, "ministatus"); uih_updatemenus(uih, "animministatus"); } int uih_ministatusenabled(uih_context * /*uih*/) { return (ministatuswindow != NULL); } static void uih_cartesiangridpos(uih_context *uih, int *x, int *y, int *w, int *h, void * /*data*/) { *x = 0; *y = 0; *w = uih->image->width; *h = uih->image->height-30; // Leave some padding, FIXME fflush(stdout); } static void uih_drawcartesiangrid(uih_context *uih, void * /*data*/) { overlayGrid(uih, FGCOLOR(uih)); } void uih_cartesiangrid(uih_context *uih) { double currzoom = (uih->fcontext->currentformula->v.rr) / (uih->fcontext->s.rr); if (cartesiangridwindow == NULL and currzoom < 100000) { cartesiangridwindow = uih_registerw(uih, uih_cartesiangridpos, uih_drawcartesiangrid, NULL, 0); } else { if(cartesiangridwindow) { uih_removew(uih, cartesiangridwindow); cartesiangridwindow = NULL; } else { uih_error(uih, "Cartesian Grid not supported on zoom > 100000x"); } } uih_updatestarts(uih); uih_updatemenus(uih, "cartesiangrid"); uih_updatemenus(uih, "animcartesiangrid"); } int uih_cartesiangridenabled(uih_context * /*uih*/) { return (cartesiangridwindow != NULL); } XaoS-release-4.3.2/src/ui-hlp/wstack.cpp000066400000000000000000000271241455214672000200110ustar00rootroot00000000000000#include #include #include #include "config.h" #include "filter.h" #include "ui_helper.h" #include "grlib.h" /* The "windows" implemented here are just regions of the image, not user * interface windows. They are used to save the pixels that are going to * be drawn over (e.g., with a text message) so they can be restored when the * overlay should disappear. Windows are redrawn every frame and removed before * calculation. */ struct uih_window *uih_registerw(struct uih_context *uih, uih_getposfunc getpos, uih_drawfunc draw, void *data, int flags) { struct uih_window *w = (struct uih_window *)calloc(1, sizeof(struct uih_window)); struct uih_window *w1; assert(uih != NULL && getpos != NULL && draw != NULL && flags >= 0); if (w == NULL) return NULL; uih_clearwindows(uih); w1 = uih->wtop; w->getpos = getpos; w->draw = draw; w->data = data; w->flags = flags; w->savedline = -1; w->saveddata = NULL; w->next = NULL; if (w1 == NULL) { uih->wtop = w; } else { while (w1->next != NULL) w1 = w1->next; w1->next = w; } w->previous = w1; w->x = -65536; return w; } void uih_setline(struct uih_context *uih, struct uih_window *w, int color, int x1, int y1, int x2, int y2) { if (w->savedline != color || w->x != x1 || w->y != y1 || w->width != x2 - x1 || w->height != y2 - y1) { uih_clearwindows(uih); uih->display = 1; w->savedline = color; w->x = x1; w->y = y1; w->width = x2 - x1; w->height = y2 - y1; } } struct uih_window *uih_registerline(struct uih_context *uih, int color, int x1, int y1, int x2, int y2) { struct uih_window *w = (struct uih_window *)calloc(1, sizeof(struct uih_window)); struct uih_window *w1; if (w == NULL) return NULL; uih_clearwindows(uih); w1 = uih->wtop; uih->display = 1; w->getpos = NULL; w->savedline = color; w->flags = 0; w->x = x1; w->y = y1; w->width = x2 - x1; w->height = y2 - y1; w->saveddata = NULL; w->next = NULL; if (w1 == NULL) { uih->wtop = w; } else { while (w1->next != NULL) w1 = w1->next; w1->next = w; } w->previous = w1; return w; } void uih_removew(struct uih_context *uih, struct uih_window *w) { uih_clearwindows(uih); assert(uih->wtop != NULL); assert(w != NULL); uih->display = 1; if (w->previous == NULL) { assert(uih->wtop == w); uih->wtop = w->next; } else { w->previous->next = w->next; } if (w->next != NULL) { w->next->previous = w->previous; } free(w); } /*Remove all drawn windows from screen */ void uih_clearwindows(struct uih_context *uih) { struct uih_window *w = uih->wtop; int savedline = 0; int savedpos = 0; int destwidth = uih->image->width * uih->image->bytesperpixel; if (!uih->wdisplayed) return; if (!uih->image->bytesperpixel) { destwidth = (w->x + uih->image->width + 7) / 8; } uih->wdisplayed = 0; if (uih->wflipped) uih->image->flip(uih->image), uih->wflipped = 0; while (w) { if (w->getpos == NULL) { if (w->saveddata != NULL) { xrestoreline(uih->image, w->saveddata, w->x, w->y, w->width + w->x, w->height + w->y); free(w->saveddata); w->saveddata = NULL; } } else { if (w->savedline != -1 || w->saveddata != NULL) { int i; int xskip = w->x * uih->image->bytesperpixel; int width = w->width * uih->image->bytesperpixel; if (!uih->image->bytesperpixel) { xskip = w->x / 8; width = (w->x + w->width + 7) / 8 - xskip; } assert(w->width); assert(w->height); assert(w->x >= 0); assert(w->y >= 0); assert(w->x + w->width <= uih->image->width); assert(w->y + w->height <= uih->image->height); if (w->savedline != -1) { savedline = w->savedline; savedpos = w->savedpos; for (i = w->y; i < w->y + w->height; i++) { unsigned char *data = uih->image->currlines[i] + xskip; assert(savedline < uih->image->height); assert(savedline >= 0); assert(savedpos >= 0 && savedpos <= destwidth); if (width + savedpos > destwidth) { int width1; memcpy(data, uih->image->oldlines[savedline] + savedpos, destwidth - savedpos); savedline++; width1 = width - destwidth + savedpos; memcpy(data + (destwidth - savedpos), uih->image->oldlines[savedline], width1); savedpos = width1; } else memcpy(data, uih->image->oldlines[savedline] + savedpos, width), savedpos += width; } w->savedline = -1; } else { assert(w->saveddata); for (i = w->y; i < w->y + w->height; i++) { unsigned char *data = uih->image->currlines[i] + xskip; memcpy(data, w->saveddata + (i - w->y) * width, width); } free(w->saveddata); w->saveddata = NULL; } } } w = w->next; } } void uih_drawwindows(struct uih_context *uih) { struct uih_window *w = uih->wtop; struct image *img = uih->image; int size = 0; int nocopy = 0; int savedline = 0; int savedpos = 0; int destwidth = uih->image->width * uih->image->bytesperpixel; if (!uih->image->bytesperpixel) { destwidth = (w->x + uih->image->width + 7) / 8; } if (uih->wdisplayed) return; uih->wdisplayed = 1; while (w) { if (w->getpos != NULL) { w->getpos(uih, &w->x, &w->y, &w->width, &w->height, w->data); if (w->x < 0) w->width -= w->x, w->x = 0; if (w->y < 0) w->height -= w->y, w->y = 0; if (w->x > img->width) w->width = 0, w->height = 0, w->x = 0; if (w->y > img->height) w->width = 0, w->height = 0, w->y = 0; if (w->x + w->width > img->width) w->width = img->width - w->x; if (w->y + w->height > img->height) w->height = img->height - w->y; if (w->width < 0) w->width = 0; if (w->height < 0) w->height = 0; size += w->width * w->height; if (w->x == 0 && w->y == 0 && w->width == img->width && w->height == img->height) nocopy = 1; assert(w->width >= 0); assert(w->height >= 0); assert(w->x >= 0); assert(w->y >= 0); assert(w->x + w->width <= uih->image->width); assert(w->y + w->height <= uih->image->height); } w = w->next; } if (size > img->width * img->height / 2) { int i; int width = img->width * img->bytesperpixel; if (!width) width = (img->width + 7) / 8; uih->wflipped = 1; if (!nocopy) for (i = 0; i < img->height; i++) memcpy(img->oldlines[i], img->currlines[i], width); uih->image->flip(uih->image); } else { int savedminx = -1; int savedmaxx = -1; int savedminy = -1; int savedmaxy = -1; uih->wflipped = 0; w = uih->wtop; while (w) { int i; assert(w->saveddata == NULL); if (w->getpos == NULL) { if ((w->x < savedminx || w->y < savedminy || w->x + w->width > savedmaxx || w->x + w->height > savedmaxy || w->x + w->width < savedminx || w->y + w->height < savedminy || w->x > savedmaxx || w->y > savedmaxy)) { w->saveddata = xsaveline(uih->image, w->x, w->y, w->width + w->x, w->height + w->y); } } else { assert(w->savedline == -1); if (w->width && w->height && (w->x < savedminx || w->y < savedminy || w->x + w->width > savedmaxx || w->y + w->height > savedmaxy)) { int xskip = w->x * uih->image->bytesperpixel; int width = w->width * uih->image->bytesperpixel; savedminx = w->x; savedminy = w->y; savedmaxx = w->x + w->width; savedmaxy = w->y + w->height; if (!uih->image->bytesperpixel) { xskip = w->x / 8; width = (w->x + w->width + 7) / 8 - xskip; } if (uih->image->flags & PROTECTBUFFERS) { w->saveddata = (char *)malloc(width * w->height + 1); if (w->saveddata != NULL) for (i = w->y; i < w->y + w->height; i++) { unsigned char *data = img->currlines[i] + xskip; memcpy(w->saveddata + (i - w->y) * width, data, width); } } else { w->savedline = savedline; w->savedpos = savedpos; for (i = w->y; i < w->y + w->height; i++) { unsigned char *data = img->currlines[i] + xskip; if (width + savedpos > destwidth) { int width1; memcpy(uih->image->oldlines[savedline] + savedpos, data, destwidth - savedpos); savedline++; width1 = width - destwidth + savedpos; memcpy(uih->image->oldlines[savedline], data + (destwidth - savedpos), width1); savedpos = width1; } else memcpy(uih->image->oldlines[savedline] + savedpos, data, width), savedpos += width; } } } } w = w->next; } } w = uih->wtop; while (w) { if (w->getpos == NULL) { #define lwi 0 #define lwj 0 xline(uih->image, w->x + lwi, w->y + lwj, w->width + w->x + lwi, w->height + w->y + lwj, w->savedline); } else if (w->width && w->height) { w->draw(uih, w->data); } w = w->next; } } XaoS-release-4.3.2/src/ui/000077500000000000000000000000001455214672000152225ustar00rootroot00000000000000XaoS-release-4.3.2/src/ui/XaoS.icns000066400000000000000000006640451455214672000167710ustar00rootroot00000000000000icnsh%is32q %')0D8 &'&,4FPO;)&'%%/:NU 0UA'!'-@IX? J0  -5MSBO 38& %ERO  =7'%ERO  =7' -5MSBO "38& !'-@IX? J0 '%%/:NU 0UA' &'&,4FPO;) %')0D8    !#%,=2 "#"(1A;=8&& #!"+6@D G8$ #(:CO* 9, )1G=.< %3" !>H:  33#!>H:  33# )1G=.<"%3" #(:CO* 9, #!"+6@D G8$ "#"(1A;=8& !#%,=2   :9 =PSYhuC %QSQ^rZ$&SPPe?UFT_R}iEar_ NvRN} qwS7N} qwS7ar_"NvRFT_R}iESPPe?U %QSQ^rZ$ =PSYhuC:9 s8mk/ab/EEuv[]LMLM[]uvEE/ab/il32* &%'&&'%& %& '(&&(('&&%.&' &&%(-1>I<1+'%@$&''& -34;OZWC30(&"&''&(0539DZYUW;50(&&%''&%)243;GXU%/[J>6-''$)&'&%+347EV_hK\aQM:('&&&(&-5:?I\PM9# &A^WO0%(%('&&%%(34*&'&:LOVY\N(1Z>4*&'&)53;HQ[[5)MB3)&(&&,449AJcR-'E5FG2'&'$$%*/29BWX^WaiZ IH/&#%'&(+1ETROS\d?1`A,%(&('&&%%(36-''$&''&(0539DZYUW;50(&&$&''& -34;OZWC30(&"&' &&%(-1>I<1+'%@%& '(&&(('&&%. &%'&&'%& " " ##""#$##""#"##" !$)-8B7-'""$#")/06HR=6P60,$#! ##"!%.0/6AQ6CE82)##$"#"!'/03>JV\0EWKF5$####")159CM'4!(K=?-!#"##""!"$.7;=BOQ I6$""!"#"$'-=KLHMTW!R;(!#"$"&+/4JV\0EWKF5$## ##"!%.0/6AQ6CE82)##$""#"$,104>R=6P60,$#!$#")/06HE[X\\NC=453.(%&'(&&$'&)0454 6ACJWfLa`NIDC>453,&''&&'&%(/45@CBMRgQNaURPMG=41(%&''&'$''&-354?DCCOQbQ>Ti^\a\M<453+%&(&&'&'&%)1543540&'&+&(&'1547?CDKQRQQSW_baiqgPW7Vd\rib[RRQLHFDCCA7344*&('''&%(25436=CCGSXYZ\]_bbcjoi_LGS SA[lrle\R SRPNLHA7441&'%#''&*347=BCCK[bhm]^onlmkec`XK5GIATailfgaWSRRTZ_XTC635+%&'#$&(&,4348>CDCDM\XNTSTMblkbKVPII8+9a #W&4@UVXFVhja^^agkEWPA542'&'&%(&'/4>35:@CDCCDOSbhOMhS2K[]MReW?aR?F]6F[=JFZC8Y`[ookikm[I_ZH=35,%&(&$'&%(154347=BDC6DORVcfNbkYTbEE5M-9T FF*TQ_fg\\]EL`gPB842&'%(&+345:@CDCDOSQZeaV:V)BDCNSRR^gmW>l+<`,%JD.VFBQOdQaXCC741&'&&'& *25436;@CDCNSRQVbnl\SX$ =K. @LPaTEC=34)&'&3(&%(/47=BDCBEOR ^lrgY=B9 HKFddRFCA44.&'%%'& %'-3448?CDCBFPSRRQ[kn_WM<7i!]af^RIBC643'&'&& %'-2447>CCBCBCJQRRQR[eaTT=1JA0BI]j^SNCC935+%&'(&(&%&).3447AJMNLJFDCBDHORRQRV^fhM^fWRR 345+%&'%''&%&)-1454#37?DDPUmQQqhbaabdkYhicbcbbablrp^J+R6 77NXPSZE@445/&'&U(&%(,1454#:CCBIRTcIJiokgeipdMVpngcbcforqeUYTJ IAP@X^G@43'&'%&(&(.3545>DCNRW\ECS\_VgkeTHH^ikkmoqpmgWPM 6nT\I?4)&('%'&%(/45436@DCDQR[p]CDS?EKZVC=YNQQSbhgfe^T:T DN`ZI?45,%&'&"&,35437ADCBGRT`llT?QldU<=08_T)RNM[cb]XJL]HFdhUI?40&,(&/438BCBKR\bjlbL0d;OINQl2Z^c>MLUSN9W%=NkfTH@42'& '%&(&'15438CDOXbaijbCMY[T,% -30xb6FHB7J?HM`TF@43(&(%''&05437BCBIUabbkdX<<` (7e2743??P^QD@45*%&'&&&.5437BCBFS`bcj]NB4Ln#0R(=&GW]MC@45,%&'%@(%+46ACBBCHUhmnniTDKR_#M"N=;:*;X/;7YiXNCC@43'& (%-56;=<;:89@KRQV`bbgleMJ`X`SkO ( IebSMCC@43'&('%;CCDIMOS\cc_[VTV]f ddX9;p58v' =bi[RLBC@43(&/CBCOSS[ebS`hmpe]ornjX?H8?lD +XmeXRIBC@4)&KYUZ``Xd[I0@VVQGCGEJICORWb. (NdncVRIBC@4)&KYUZ``Xd[I0@VVQGCGEJICORWb. (NdncVRIBC@4)&/CBCOSS[ebS`hmpe]ornjX?H8?lD +XmeXRIBC@4)&%;CCDIMOS\cc_[VTV]f ddX9;p58v' =bi[RLBC@43(& -56;=<;:89@KRQV`bbgleMJ`X`SkO ( IebSMCC@43'&('#2436BKPRSRRS\bbnhN>=;:*;X/;7YiXNCC@43'&(%!,5435@DHKOPQRW^jg?M[\PG=XD{=e_PDC@41&')'&246@CBCDEGKP\aShkgbR4T7Bne9OfUFC@450&((%+46ACBBCHUhmnniTDKR_#M"NMLUSN9W%=NkfTH@42'&'%"&,35437ADCBGRT`llT?QldU<=08_T)RNM[cb]XJL]HFdhUI?40&,%'&%(/45436@DCDQR[p]CDS?EKZVC=YNQQSbhgfe^T:T DN`ZI?45,%&'&&(&(.3545>DCNRW\ECS\_VgkeTHH^ikkmoqpmgWPM 6nT\I?4)&('(&%(,1454#:CCBIRTcIJiokgeipdMVpngcbcforqeUYTJ IAP@X^G@43'&'%''&%&)-1454#37?DDPUmQQqhbaabdkYhicbcbbablrp^J+R6 77NXPSZE@445/&'&U&'&%&(,1454 ;BHWaQY^VVTUWWVXWVXZ\_acbblrgR@L @U^ni]PC>345+%&'%+&%&(,14546=JWaYQRPMJHGILOR TX^bcojLbF /8FVmkbVIC=343(&''&(&%&).3447AJMNLJFDCBDHORRQRV^fhM^fWRR CCBCBCJQRRQR[eaTT=1JA0BI]j^SNCC935+%&'(%'& %'-3448?CDCBFPSRRQ[kn_WM<7i!]af^RIBC643'&'&(&%(/47=BDCBEOR ^lrgY=B9 HKFddRFCA44.&'%&'& *25436;@CDCNSRQVbnl\SX$ =K. @LPaTEC=34)&'&3%'&'/4348>BDCNSRR^gmW>l+<`,%JD.VFBQOdQaXCC741&'&%(&+345:@CDCDOSQZeaV:V)35:@CDCCDOSbhOMhS2K[]MReW?aR?F]6F[=JFZC8Y`[ookikm[I_ZH=35,%&(&$&(&,4348>CDCDM\XNTSTMblkbKVPII8+9a #W&4@UVXFVhja^^agkEWPA542'&'&#''&*347=BCCK[bhm]^onlmkec`XK5GIATailfgaWSRRTZ_XTC635+%&'#''&%(25436=CCGSXYZ\]_bbcjoi_LGS SA[lrle\R SRPNLHA7441&'%&(&'1547?CDKQRQQSW_baiqgPW7Vd\rib[RRQLHFDCCA7344*&('+&'&/49ACELQSRQR\cbonU]_ RC_nc^SQJDBBCCD>540&'&+'&'&-435=CCEKQSRR[bjpY:Q $WMWhaUNEBCDB;43(&'&''&+4:BCBDJPRR[igJHd[+1^LaOfYNDCD?7345,%&''&$''&%*34"37ADCBDJQRaY@OYTi^\a\M<453+%&(&&'&%(/45@CBMRgQNaURPMG=41(%&''&'$'&)0454 6ACJWfLa`NIDC>453,&''&&&'('&)/3545>E[X\\NC=453.(%&'(&&$&&''&(-14549ERQICC@944542-(%&'(&'+&&('&%&)-0347:75431.)'%&''&'$-%'&%&')+,.-,*(&%&'&$(''('&%&'(&'' #&('&'(&&('#'&&'(''&''('&#$'&''(''& ''('&&'&($"''&'(('&'(('&")('&'&'&%%'("$#"#"#"!""!!("!""!"#"#"!"#""$##""#"#"#$$#"#"#"#""!##!"#"#"#$$""##"!"#$""$ #"!"#%'(*)(&$"!"##""&"#"!"%),/035310/-*%#!"#$$"#"$)-0105?JJC==:40010.)$!"#""#"%+/1019?RKPPG=801/*$!"#$#"%,010 2;=CP]9TXGB>=801/("##""#"#"!$+01;==FK_<>WNKIFA80-$!"#""'##")/10:= GKZ;AaVTYQF701/'!"#"!""#"!%-107>==>IKZL0 VdZT;RB5/0)"##"$##")0/5=@JP]eP,C#CWH=4/01)"##"#"!$,103<==>FP`TRU2JgfXJ?=70&!"#"!!##"$-101:=:2/0/#"#! "!&/0/3;==<>DJKYA"&C^J?=<50,"#"!##"'05<=<>CIKKS`]:!#&$2^QH>=9201(!"#"!##")018==?EJLKKRYafO  ,(C^XNH?<=<60/$"#"!+"#"+04;=?EJLKTYYff># $SeYULJC><<=910,"#!##"#-1029=>EJKJJKOVYX`i]4""Ni`YSKKJEB?>==;20&"$"!#"!$.10/28==ALQQSUUWYYZaf_TB ' *'Pbic\TKIGEB<300-"###"&/028<==DQU`fIHfecdb]YTM> $1HW_b\^YOLKKMSUKM=201'!"##$"#"(0/039=>=>FUD$@7$%XbaX0,3=3' $  #05IM'6`aXUVX^a-FJ;10.#"#"##"#+0/15:=6>HLY^4$#;OR? 59#""  &,##"&BgfcabeHRSB8/1(!"#"$"!$-10/037<>=>HKO[[-%*%8% !%.V\SENS4SZG=40."#!"#"'/015:=>=>HLJS\U. !*#(" #":I-) &;M=:00'!"#"!#"#+0/039<>=GLKKV^dN$" (%)%TQ==30-"!#" &.10016;=>=GLKJOYebR%'!#1JN?=800%"#!3 "!$+038<>=>HK Uci\M+ &[\K@=;00*"#"!#" !#)/0049=>=<@ILKKJRbeNG@)# '&_VKC<=20/#"#"!" !#).0039==<=<=CJKKJKS\P>0! *OaVLG==5/1'!" "#"!"%*/002=<>BHKKJKOV]_*($% 5VdYPJ?=7/0,"#! !"!"$(-01028CMYRJKIFDBACEHK LPUYZfa3&+ !;ebZOC=800/$"!'$$"!"$(-010 6>INe96j_YXXY[cK^`ZY XYcigT: 2H@-R?:001+"#"U"!$(-010#5===>JKSgN"=LK1)F85X]][ZSH&  $KSC:01(!"#""##"(/102<=IPYX``W,1 " '"!7:4$* ,9RM?:0/$"$###",103<=:01&!"#"""*102<=?ADITUB^`]XF'  )[N@=:01,"#(101:>AEHIJKOVa^:POB9(&"CXI>=:0-"#".0/0//2*+ Fe\QKC<=:0%"DQKQWVKYP. 'FHB4$8190#" =ZeZOKC<=:0%"DQKQWVKYP. 'FHB4$8190#" =ZeZOKC<=:0%" +=<=HLLT\YAU_eg[OfieaK)>*+ Fe\QKC<=:0%"6= BGHLTX[VSOMOU] \YYJ*' +  MbSKE<=:0/$" (126876534;EKJOWYY^bZD#!$R[LF==:0/#"#".0/0//2AEHIJKOVa^:POB9(&"CXI>=:0-"#"!#.01;=<=>?ADITUB^`]XF'  )[N@=:01,"#!'01;=<=BM`dee_A +;`TC=:01+"!""*102<=:01&!" #"#$"#-104=>IPYX``W,1 " '"!7:4$* ,9RM?:0/$"$##"+0/4<==>JKSgN"=LK1)F85X]][ZSH&  $KSC:01(!"#""#"$*/1018=GKOR)!HQTF^a\29T_bbdfhgc\L+(#'QC:0%"#!"!$(-010#5==>INe96j_YXXY[cK^`ZY XYcigT: 2H@-R?:001+"#"U$$"!"$(-010 6=<>BHKKJKOV]_*($% 5VdYPJ?=7/0,"#!!" !#).0039==<=<=CJKKJKS\P>0! *OaVLG==5/1'!" !#" !#)/0049=>=<@ILKKJRbeNG@)# '&_VKC<=20/#"#" "!$+038<>=>HK Uci\M+ &[\K@=;00*"#"!#" &.10016;=>=GLKJOYebR%'!#1JN?=800%"#!3!#"#+0/039<>=GLKKV^dN$" (%)%TQ==30-""#"'/015:=>=>HLJS\U. !*#(" #":I-) &;M=:00'!"#"$"!$-10/037<>=>HKO[[-%*%8% !%.V\SENS4SZG=40."#!##"#+0/15:=6>HLY^4$#;OR? 59#""  &,##"&BgfcabeHRSB8/1(!"#"$"#"(0/039=>=>FUD$@7$%XbaX0,3=3' $  #05IM'6`aXUVX^a-FJ;10.#"#"#"&/028<==DQU`fIHfecdb]YTM> $1HW_b\^YOLKKMSUKM=201'!"##!#"!$.10/28==ALQQSUUWYYZaf_TB ' *'Pbic\TKIGEB<300-"####"#-1029=>EJKJJKOVYX`i]4""Ni`YSKKJEB?>==;20&"$"+"#"+04;=?EJLKTYYff># $SeYULJC><<=910,"#!##")018==?EJLKKRYafO  ,(C^XNH?<=<60/$"#"!!##"'05<=<>CIKKS`]:!#&$2^QH>=9201(!"#"! "!&/0/3;==<>DJKYA"&C^J?=<50,"#"!##"$-101:=:2/0/#"#!!"#"#+101:>=>FP`TRU2JgfXJ?=70&!"#"!""#")01:=GR[afU16[fZOG==<4/0(!"#"" ##"!&/101;=?JUYefR8H^_VLD<<3/0*!"#"$"#"!$,103<===>IKZL0 VdZT;RB5/0)"##"##")/10:= GKZ;AaVTYQF701/'!"#"!#"#"!$+01;==FK_<>WNKIFA80-$!"#""'$#"%,010 2;=CP]9TXGB>=801/("##""#"%+/1019?RKPPG=801/*$!"#$"#"$)-0105?JJC==:40010.)$!"#"""#"!"%),/035310/-*%#!"#$#"!"#%'(*)(&$"!"##""&$$""##"!"#$""$ #!"#"#"##"#"#"#""!#$##""#"#"#$$"!""!"#"#"!"#"""$#"#"#"!""!!(UKSQQPSQSQSQSRNQUUSQSTTSQSTTSRQRU UQRQRQTUTSRQ RSTUTQRQRSUUSRQRUTRQRTURQUOQRRTTRQRTTRMISRQTTRQPQQRSTR`KRRSTRQPPQSX\_ccba^ZUQPPQQRTSRSYKQRTSQPPRX`hmpqpqv{{|wqpojcYRPPQQSTRISRTRQPPV`jpqqpzyppqqlaUPPQQRURQUQRURQPPXfoqqporpqqnbUPQRTSQSRSSQPPXgpqpot؇̦pqn_QPQSSRRURSTQPUepqpr݋̵pqhVPQTSQNNRTRQPR_nqp҈μopqn[PQRURPPSTQPWjqpoұmCń{op`PQTRSIRSRQPQ_oqpo{+cJ7ʧyopqaPQRSRKURUQPUgqpovy%$X­vopqbPQURPORTQPZmqpos‹=ȰwopqaPQTSQPRSQPQ_pqpoqn; 1иzopq^PQSSPQSSQPSeqpor޿y ͬpopoYPQRSQPSRQPVjqp!osb;V'uopqmTPQRSPPRRQPYmqp$ovϓ+'J_٬}popqfQRSPPSSQP]oqp oo{،Ap۾uopq^PQSSOMSSQaqposN  Cʹ }poppnUPQSRNUQTQPReqpopz HƯsopqgPQTRUQUQPThqpoovt"voppZPQUPPSQPWlqpootģA^¯voqjRQTPQSRQP[nqpoouƶS ({ηƮuoq^PQRRPIQTQP_pqpopxŞAw9FeImlaC 'YwtRvirplSQSPMQTQPRdqp?oor|p[# !0(!  !"FN/šoq_PQTQPRRQPViqp"opwXGc  f׾~&ΥxplRQRRNQTQ P\nqppoos}O4#42 &Do'bOF~pq]PQTQRRQ PSdqppoqxS 6W--ĽwpiQSOQTQ PPZlqoos}< EkopYPQTQ3PSQ PUdppovضj U֭qqdPQSQRTQ PS`nppxa!CǯupnTQSQPRQ PPT`lppw׸!=W1  Vȯzoq]PQSQRUQPPQXcmqpvK ,Ϲ~oqhPQTPUQRQPPQV_ipqotξt 0|зopoUQRRUQUQ!PPQV_ioqqop~ɶ̀٫NW༪opq]PQUQQSQ.PQWajoqqppouyɁ> Fm`ppqfPQSPUQPPU_ipqqp#}`v?t'-&kʗpmSQRPRTQPPVdnqqp%oq]Iƣlٶ@ HpqYPQTQQTQPUdoqpot770O4wT{sí` G›pq`PQTQUQSQQP]mqpour UpW!I4- jജpqgQ RQNOQQPRdqpoxʚ? AOfڱpqmSQ SQPUPShqpoxh SN`poVQUQRTRhqpovӳk   >g`0"pq[PQTQURRdqpou㲁J.5 $[ɥpq`PQSQ@QP]qpos ޙ*" !ěpqdPQRQRNRlqposǛͧf OԵpqhPQRPG_qposg`0"pq[PQ TQPUPShqpoxh SN`poVQ UQOQQPRdqpoxʚ? AOfڱpqmSQ SQUQSQQP]mqpour UpW!I4- jജpqgQRQNQTQPUdoqpot770O4wT{sí` G›pq`PQTQRTQPPVdnqqp%oq]Iƣlٶ@ HpqYPQTQQPPU_ipqqp#}`v?t'-&kʗpmSQRPQSQ.PQWajoqqppouyɁ> Fm`ppqfPQSPUQUQ!PPQV_ioqqop~ɶ̀٫NW༪opq]PQUQUQRQPPQV_ipqotξt 0|зopoUQRRURUQPPQXcmqpvK ,Ϲ~oqhPQTPPRQ PPT`lppw׸!=W1  Vȯzoq]PQSQRTQ PS`nppxa!CǯupnTQSQPSQ PUdppovضj U֭qqdPQSQQTQ PPZlqoos}< EkopYPQTQ3RRQ PSdqppoqxS 6W--ĽwpiQSOQTQ P\nqppoos}O4#42 &Do'bOF~pq]PQTQPRRQPViqp"opwXGc  f׾~&ΥxplRQRRNQTQPRdqp?oor|p[# !0(!  !"FN/šoq_PQTQIQTQP_pqpopxŞAw9FeImlaC 'YwtRvirplSQSPMQSRQP[nqpoouƶS ({ηƮuoq^PQRRPPSQPWlqpootģA^¯voqjRQTPQUQPThqpoovt"voppZPQUPUQTQPReqpopz HƯsopqgPQTRUMSSQaqposN  Cʹ }poppnUPQSRNPSSQP]oqp oo{،Ap۾uopq^PQSSOPRRQPYmqp$ovϓ+'J_٬}popqfQRSPPSRQPVjqp!osb;V'uopqmTPQRSPQSSQPSeqpor޿y ͬpopoYPQRSQPRSQPQ_pqpoqn; 1иzopq^PQSSPORTQPZmqpos‹=ȰwopqaPQTSQURUQPUgqpovy%$X­vopqbPQURPIRSRQPQ_oqpo{+cJ7ʧyopqaPQRSRKPSTQPWjqpoұmCń{op`PQTRSNRTRQPR_nqp҈μopqn[PQRURPURSTQPUepqpr݋̵pqhVPQTSQNSRSSQPPXgpqpot؇̦pqn_QPQSSRRQRURQPPXfoqqporpqqnbUPQRTSQISRTRQPPV`jpqqpzyppqqlaUPPQQRURQUKQRTSQPPRX`hmpqpqv{{|wqpojcYRPPQQSTRKRRSTRQPPQSX\_ccba^ZUQPPQQRTSRSYISRQTTRQPQQRSTR`OQRRTTRQRTTRMUSRQRUTRQRTURQU UQRQRQTUTSRQ RSTUTQRQRSUUSQSTTSQSTTSRQRUUKSQQPSQSQSQSRNQUt8mk@%9HflljK>'.[ϰ^5B}㹅G$ik$km!GNmoqrwX_15 } 16io!#79CSUUVV@S6=!' cm,3 nx#'>D@R6?!kt&0ju:Es{'3^Knggwgwng^K'3s{:Eju&0kt!6?@R>D#'nx ,3cm !'6=@SVVUUCS79!#io16 } 15X_rwqmoGNkm!$ik$B}㹅G.[ϰ^5%9HflljK>'ic08Î jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 ¡{}zAq[ϤNB2*~*2<͝>ա;|]C ~|,)^^?ӄvbetXv(&l/}l5nKTELI.~5D}/(/엕gQH"{{kIňw2a3@#gXw9(;_ˢOfN.$Wm~_d٥`'~۝k=Uw`j8 ":N|̚(D8s(^}Jֆ{Md_xW|%PDr6e:y_)'Nan;$j]-*jQ߽kgBЖT\*ŖjdʜΩ)P#tJZm}>󆯙嚱Ee3IKa6- ~|yFfi@~tid4.הv$ 'θ9ϫI2B+&\掙a=6YBt~c=?˯7]>tZ.iʾ彏2 }( 3̴ 3 ~g 7s}#,}iv=ƉW*,ro~n,!CH5E4J|+Mc8dpٛFHεÚb?3BX#Q9%u5ǓV[ A&6Ӱqw ^WjVE+)7ق kB_^V:)-0Co9PfBGsA0e '~o/;7"CZ͎4`+QD=9|Mb_20-^BVi¢\]~f0bU Ce b}G4wI#՝*5s`pPaPcD1Qe#>$OV0~Q]wOO]tY1a7ߧv&۵@էzD+Li0AЎ,~k;6E/j<<0]j2]_roM{7|jo<+M7?j1]=. 2iH֛8vE1E̴ |SE;D!K6'+7 Ї̗LWa}B_݅.7e[o{4 P+^Ct?LٍU\V8L)K.ƈuQ;` tjYZMh.(u9qN0ip0y1w.z`MC[4<;1nhR*(MvذƻO#RDH7s?5BYh'ެFZ D'!6רnw!ug^2[+e NJ#PIf*u=^_r{&.Ƀlj[ŚfF#.PQ^p4 axg by~tw7R Qan}aRt]tM3n-wMyIՉ huaW*g/A(8ԲA&q{67Gtt\HSgSTf?z_ .%Q"DJ r(#q^e@:[eUz z݌s^~AXa1\!΂$o/uL48"^YDshpn sXo Y4emK#&"}`S9]*3'c"gx\"&&O'ۨ6{wN /~U>r $rPx5MK>@MvuuFa},j;Qfxr>x9O`*PC?Un*e2#%( 7RBX3nT#`ʀFjaÔGä;BaOK\]bBEvGئFq&`,%J{7Ki.Gȍ2gn? ?7׊A-՗t{~拀cz/D2;8#RUje8|vc6nra6grz-?2(z n b#3('B=TL$/E'%Y9aX>1ɼ;;v#G~'p^q19(}ﱽT 4a8*ep7IX{xILHMWcqc?Ze(0NlXX1<8̐2) j_<3{3}w{Pg3}˜e#'h;kyɨ-TBQV>R2D1 EZSzS"jFYU )yj Uz*@6m6"w**a/|vרN40h2;UP4|刍gu{ nzGzq?Wy)@sE&ctjr0K]N~K ^?}(= P{@{S;*qu .?2^BsJ`(bnP.2"ej (aeFOAy2a * r"1fGBdd5f[jJ=APgnU1+ E"ʆy[v`pTK+Qn0F3YsdpnxNZ6Y|qn1o5o-ʕ^|pNԘFٖY+<;n91rV6ˈqQۉe,.*HM2 /X!n[^\وl%g("kU} +b>gpr ;Mw nI2`SXH@TF5&y>eo޷x#3|RcZQO\xjo~Ôaat9]jQ1MevÌ>@G뱜G'}xꍮR_>y䥮PKMߺͪ&ụNcaLFR-,TP:2q88, 5, 5,&"?|W9:BH>dZf9o <HITԦ~6:4 P({,kWۨ3hx;GgxKf"A8KM@ D<,uPArMmv.`n,A<_+Wz'em\[!mpNk/CP*)ᡐUS$.=mKtH,x3/P4"t$~}Jpp#|F;H5tS<6A`wD$ }ӈ$Αi_h|@ "-֘ʘ©6"]p^F@M.Y;sa%Ά|ifĤbz7'1_;KMe2{UʱF$gKñPuIyq![41=1pwyHR-q=`<ƠX/k|6KvTȁ6aKw6ԈM@[_\b%bfci$k+@3+E@:>D%"؅#vsst~֛qGYnhաM\e}NqC*'zsR"O_que WD; mx뛭LkljTP) Ⱥ j!OY@7fť) +x6ny\i"ecȒ".]/KpMo!4mΝ&qtl)2ALieW&vwAP>\ƽ ź6=8 jo*[RUo;1u'N^Y6h]:Go+a!UK*%!+mBȿB> Lح0ϯaгOGʵdVHvY{h5HwG=#5e%,Ahu1`6$5? s;UI׌,NF9g_(D&\^*MDrݳP˽Tp']BW>S r6,C7\)*Xb2*|hLds8q͌հDK(AxHjVRd5#cPqO"MɜTBCJLʦAweb9;5XFgYZn$utAѼ8?fȧ 2a+E7ϨA^vo[JMCzC%˽_%e lD&9ǥ^ő@SE bJo3{wT3P$ϗۨO>uAŒX[ReLmBG>Չ+Ad B'ÿá>d ^8÷7sz c<, :1('o4ϘVOG1XL%d)ȰK"ל`"?]|QjxcB_'"Pٺy/IU}8)>SƛF̏5-ğGT6NkqkWa^D\}"+.Dy΀@ !F9<;.ON ^;2uC*1 frIpH1uWK"=Rf:iv9le xʅ}W7|0=E[5皷DP7IjuH+#jͷ]o)V8orlb:ƛzƘĐ EH3tFh$ HZ ,iDVw Q+aΈJc߯UFyBU>;frHva B q]3w2D! iO Ef[R+WyV`{#]X0 8ݚvh8qv輻؏s² 5ef`+Y7%gV{bY퐸E&v)Y#5`Bֵ?ԸըzC.Lz~f!>^A~15uekzېHӢ&.٬">aTܿёͮ}'icDɼLvFW7A#C~1{2:rj-Zdetʰ'/tv8:x`lwaJゴ>>v ӯX4gL`&$ w /=iȇormtt!T.Ŷq?# =51}'SS !i [ŘgCT~]N,?Rb/o3]iyfL VǾ*{{#׾>,.ɆVN+ɓ :Íz0Ɨ~cb%p2{Im bo R*^UXTvj{7;\s, ^k5_'X66ҽ`={fE_kl%i@++=7vu)N.L)Fd 赨]Uɘ2Sw%׵5`r轲or*2f } HM3U~,{M;W/w{5OܢHl&=NĥO~5g0TF ڝ"{`T"hjCX! 6K;0XBgwf\]+995G;[4#1}pnxI "Z=n)t!*T.aeb{Lz]XV|\b)[W GXe%cP* I[G(YB|fGT~! K f sViXjP5ZϘfoNZ]aTVvM,<ÏIm".S>R(.:v@g,@1+)x)M}S<`uLCgWY|YEz 3M=ScH"nKO}tI{N/jA.1S3*};M{{+>̑arkMO )+*`0G5%/Gv+ظ0EfZ*{͟ eܒp['Z] `O:u)B";[ n8v߼КxjLtQ6ЬA;@dDcul`s)>6S32*aE uKxƗjuGH!&neOj.g G:3K'p#']ؐV?SgDw鑏'0 ]ҡS lURb^ UD3m\[Ìq"Y;,]1FsZR P!rv(ږ  6La7U(P_ԫ`5 V]h<^aBk&iF0_L{šVTnY83\Wd-{Â;hۘ U=%jĊ g92؝ÛhFq*AL 2Tyx;:꒗+_*@b Ic zkO阠0|TzV J~njF\ NOS[B¦Y3[*KsLeVwꉪuT#%4{&l7y?`XDru\6hb2gۆv>@z8X4,8jƶ3ןPm':/WO8j]xzZ`f-nb<ߟR[Z'+"<}Y%rU/[8'ϵUPBMVd t+ߙكiFyI 'o>Pq̯:O{'V} ~R[ȫ*~%,#]ے%Aq#N|c,y E\ƴEyOXAEy/w/޾7浏'Ky2qq_PG[mx%xpDKxudmmDs)|Mަ8>:sWt)ܚT^ bfek*IpO6A9vpEV;?ջX NW`y.M+] `3ss4M)NSl?uOE6 (隵G!B#Wф0ʦ ~3X*N7l4KVSlJb@i ._[dFSF%0Nn08q3җM 0Xy0b%hwsIVI_V~,V_>(] hhd@6[@e% ]'0KG^ v)\pְ?XVl61ux-!8r q':^iVțX.Szj>>&U2W;AGiWuH#cF9AVdza'.dy<".giU;|'\YX^-Xa;k8xZJxp9V( Cpe G1ۢT|!v:/p"w*b웺e^"\ A7spU$4 ̕^E)Ӿ*-FԊ84l= =~ҎzyT‡R7_|yv^qj`*Jeؘ9x!+:= It).ǚ!b [gQ6~KrwM[Fǒp` /`nzN.~a`HNYY׳uR >Y}Hރ j,La((41$/:,yT ̵KPf|3X;%_a0tF} aK!?w-|uÖ#n/4BE ؊mXqombլr([}XCi_9&%*w:Y%QޘLVwx/ (*@& P#=wP4 $:Om ^]F#yDJ΋0]5{-S r|w{O’5*[G_̸J PdVۡZt-?w9zƾV@;QPz!3BQތ{0M%lV4 Y܃H?H $  ˷`-Qz͜mF,sCͫ\&fF6Oy|az-MQ' vj .ƢEÍ5$K3|sSr:Oq #x[R"I=̰ Kyi{PD|yߗKɻ>^1~LrtF?0.[^FGA&)WfX_TTJ@(Ȍ<xӛ :O634}cJ6jh'W G3eU+=>sU NJpnbCJ| rZGN-k?:CluS[Ajh6hv?B#p]Q#Z-_e%1En,kh)^WՋ^w,:(Y?Ds]A$b񛥘ՆCV%mOq҆42 Wq6.&ϟ^~>rT2!0u3d'TjdU c\&^ ު3sV mk yENJ;`(m<ڑX9w=vu9E]Dճѳ?wz6vBs(&o`Ɵ\Jᶚ~PQYZfwNp@<|gqGwnmXP b/1Cm=9&cT$Eb\ɫ%Ro6LmQ H^1@r U"ְkG\Z'YݶE$ =RGR UbL 0ѣL[ٻ㿔 j8W ELqy]QԘ[J~ 8nOӘF7n)FFF_hx ݝ&[(K4V獕ɵAGJॏ*@Cà,2dž)Iv|x`j+ DLoO cp (pd"Gi)E\s$$ lM aw6]n-[o5^tc%< & PGYvjt3 [z_("JxO[w3uYŅoLf+&G6}7Iұ{4TfhXNYiN[*P7DK2|",J}P ;/xK:yj?2ѦUx5ɡg(`f'el_⤒jQZ% G57Rl5e^xgu74)yR@\Tu6~>Md4qr,-C h3Un y9>pQ$ d[)B`arLD/ Y`C 30jgH}Z _AO+0풛lה0*T4SSWiɻ(nOnbNąo~2m:}l"d Wj`R@Y/4m!;&6m6 qJ}nkmh_ޭhac/J f\NOmmD txULQ+bu\ 6гg+ySkJؕGFH^1Q+*QI'ܞ?fBU=%o暠̆u_ELm)E_&~zpέH6Y`)hZ1V ;,S@\^G[ƤUJcÎJI_QxK9 /Qqkil Mpv=7sP䳹CvJݬ4U\SL_t")?rWE:%:twkpUum$!kz{ TS>KLogggY$.pFW|7X~GcD6y7H_= {h/Z9>Ink8l>j&J@Ҡd5@-r@`zrJFfeph\h(*k"Z/u9 #Vb3s`,x0 |mZE*4X%T.ӉOZjNt%8HxПl}o>R| ;0ǐꕨ p3G ̙͉Y!aNdx},h@Qr.!+c">Q|=PZwh`4.$9R;&/梜1gnXA?#I*J>,s=H|SD&p b#SCl\DOR6'0l|밓rB(=ͯ.M^&_ .s͵N@ a8>/L6yюϯ˭@$B)if'$RI3Ff{~z/Jny&p{ #6 v!@s1gI&w[&̛֔PgP؟s2(}޾xqѵ,(vq5wlA*|BB7үsZanKO5Hh%iӫ%wV]C~B?,1JdA9مNiV~0B}FD( BHi |ed%Ic#W0%L; OD/]-iIiԏN2Z0Jj-T1›Z db,P<)sc6buvԳʾd[bPKw  Q `lC>%1"(cs"Ч=\p"ܾ.Qk)2\O'(ke=q=(r4+~RʆN~ $5"$>86g5=_':6dΔu??~%6x_QirGʁvznU:2niΛVgռHK;Bi0̪F6b쿁2؁!CACԺAt |7?t U-]D |SKezb \r`^pPPR׳Im;00[w:I o˖~׏ 2/֠B0MzTkλ8aD^I$&u*A kڷ/÷pfE.8YI5| 3}[)3fF2tDž'w[45l-(\^ęӟ]HuxlP&ͪcU{6t[Qr;/({(ulW9ιRS*[U< q L¢C3yJ2ݲDAnbu9|v}3ȁpJK-fb+"ac]T1}y1lM~pIp]",#$@ͮX"u5N>P)y0/{[g>zk,@  KsP]d琊1}|Ϝ ) nǷ{ys X眍-(@ /44M>$;`II S abЋ2Df(҆a Fԗ22,9 I; I eO"D=B9L!rqD!!hm`Yڏ6LY3`{ kHCfCL yc7 (*8(c_B9:; "+r'2ݨtC]h#B]ru8c `Ҫɾ4w@5Ĝ$Z!ݦ'Dퟨ<]8bÔhO vlcQSCdUuaC Uzv)2w~%2<遀M'D'sP^s.R=6X ,h}}};d!=R5k}쎫1Kږ)Dd1u"JL@4{v^vu=+|%$SAf3-R#Ǽfc~EI X(5A Ȩ1oA^Զhp-XO$+WMƲbؕ R=i˟rE7'nNCؓq V ԙZAu&5q9 _ֵ./9_>SΰPƜl9mYOPOĮءx Z> Y<8e(˞S*J:67w\baU?ه(|VvZBbE.5aKdUXyab'e΄NY3*k&:@BċvZ%;A>悃ʛTٸG^PsfXE/n2 $|+v?CCޱY+__c:^vNKD&Z8,ho ZUP;`oHX! 3\ lds|'D|ZJc@i eG %1u9"W}\m581K ,T2Ctrczd:E9lhK#>ptm:)v;3w#(gogCHD msAZ"KڒfS c&{?9hER9{y hO hBoᜡ#}=(9*%DIS譳.f)fotQPG,'W,yY))6gÈ"̌F` ѡO1fn(*fTM0S7z YRe>u&~26ơ[Hȹ3σM^H .&p[ N @7Q-DE\ElŔgqm.HG{ue{ӛ4'}ݒќ1kx{0VU]X)?_c8(lDlq JHʨVIp]hEZ zu()j25r,A~M@i#\BRF>|.(f?B,̢g0)ƌtjyv &ll]TQ WQrd]Ȇ5BIbQCD j{#g8[u o`w{J Q$ŁTZd 7֘3qE*Sk%*I `< kۇ^{?&{wf1`p+>ىKGJDIsyX- kSMe ^[- 0lf$K,KBX0jӆo Ž"<9,W5wnK}kxR.#֪i$眆bBy"[jr`oԱM)ZI)缦k憇Ehۭdp "%zǴ4`F(:[K*۽ߛӤ%l,ɍ3dI"7zs'HicHLV٩^ xvh'=hL<ӃϠ䋉hi]@sFpg~Va&Y˪0^?.mT\tJjߋ;. "6)g% Q9%MF(MUq(鮓G?,F [kd>$hv\| ֏:׹.|딷he%*ҽ}Ss춈zq nH0h})CIGNB 񨪜:GmvL& L߀JftfRd! @sggN5vp6!C^ZgpG0]uwdR; GF,ͼb-z諁ȱpDɆej4,ň^e%G:Sdy)- 6 FʶUx 6M 5m:){ȸo:r[P?Z^ ׀pISF^0U 5 yfomq^X29,~o0('ϼ 8iJxKH(^z):VJC{pY5ݐoՌ4΍~7tQYN3rqZWe*Ydd/[>w\2@ĶR@>^l EGCwУ4+yiR1u<{A*|7 -1SXuF%Hs$dU# yrlLΚ:n#7I>Uŕ(qttDZ23S[6_Ē׀6H"J7]VLf#ZYwO>1vZ xnf!zLNb>OT[7+u]+BB?1*Uާ>J+mC#p P3"m/G.&O)`'V $Oz%;tZɧ@8>bR[^:II,+tց9TXuѱE, Z0]y$m&_LF<.N~ c`KEm2O2ú<餽 XpٖC?Ib,U{Hj*.ryF 1c/ =ňI ôZKMsf-VD˝#I:* 2O0n#a-@pxV=pZB[xZMNqVoqvkp%8}LIhU}9vrv6k4e(KD;fE0ͻ]!a`+|S@93d ŧo(IBx!:G숒H >ʪ  z)0*.C {u2Ƚ[3\V !VH= <"-v$r 3{9@+[U<9*Aw-?>UsX**,],*3D]ŏ5Ͻ%\%8r:zWkadT9{'7ŏ#`6XcdDADrgp_H0Ϊ,9nN&哳buī/MPo sY6K?' Sr@]> Bhvnޭw m1&V %R9H[uaF3uU"#{Wgz~hZڏxZ%:jqcj2ydd^"%nMNjZDGلmͷJ^N,EP b]DHH}kfJd;֎|[ݣ}ݠ I+ť/eqJϞd&{2Vˀ͝<|ɊTX>fҿ|{+ġ戫`>?( Jrh}Y lb޴HUـ6 h\Fw45X%ԪPI3D*,n/_ io*"K6%Q9;7XHb v>u8^e" H1B0p&[ uHc?.y0DT`q5V4jU]G*% hviöh?j3 %~T ,9 44BG1)w>W5Sa.y̋c_v=s^z5-BX@)F3aDս d\x}?58%>׽㐺h \TT𙷇 )9Egf\BZu{mdo0xI(&0q"W#ڳ VCLi jffeg^ nuҐm :d\yWPm{[R1`ҹmLMKp+5&oG.7*H:J=6Ȕ2-:2 ܋<* Ӊ~cv"^Nt9X 0}:?}ihQ u5fbcM]aߍ?NTqt6,ʠW;PoX\Hoj vX Pd?XMs13&.5&CIgeI\9"ͣ%ү59v6X=ZO"N:OJV mA5S ,ngۼoN6O $'CDjH\_E?&t1тbPZ`ºmJy-wcm,)qgI }T"Xݨ͵_]h~]#A|'xڛb Z$H%`n+qNFd?7=A"`x`(֊l>phb%&%%\"H6{Hf r9ԯ_REd#_龲h>SU79JE9C)ȤR:2ѪмZ|G~-Ub^)qȗe0Big 0LhxG91# r-ZyfP:y86իSE սa.֩KVr)3699ai;M}e}<؊뽆fjEn} +dpN0 ӃhK*fJ.p? ۹KMSPJӎVQ ":G4I =% Jez' q4u3$`>s>y`p: # LPܡ{M+E/7셳eق+y|nX̲{oT~VF"{yӘaC瞝ua囑&z` .}2Ut#Bhc{$QA8R"1o.(J|5V( Ix;$c}:Yn71 PT/J]=*STu^&dJ%32QX#UG7L $JI`15(z7;hgGOl21vb'C4MnJ 5#y"#[ BXܒ y3t7P-RGDւL@$)gX$< ?U'F15RJ+:Q4Bʏ/r(eԭ!an H(wO}>dڪ(q{=DLy;"ozhrs')VAS:Ui`\0NnOo%-I  :p}ZRMӓHUG ge[Tqg /C%%6+hz7sYpD{\AVN ID/L8%e+\&LZacÛ ~x=NU&C0?PY 63r΋l3R*Sc s-4l@j҃9ѠKBx:ŬuPDMK"ܴbҁQJegW.k]L*3C$,(y&@gMnV`;z띻n\cU]iD]!ӵdZ^!'.FUԡoqAɬmŸܤCw)۱\btOlCi (8A 4u1Osrl D_Y}@^(:zB\"^TDdqx'e7^,\BLma{,#"Wej뺊=h ry$HЁ&C詹緹hl#g| D+u]i(~!y1WSxIVB)u3V2V<Td&WmqLGgZ pO6(E'{U諱KR-vɀr|]kok>qBX n;ZaAGn 6lqAAήcwmw]3Q[[ˏP 4ZwNSwAya[+ Q<:̂1A U+ ޳0c;Xl^zZ޻tW)J:V5[[|Q˂BkjvǍ:ӇjMrC{^-A ><l+D,eˮs"#Cp\EM  Z4o\R~P}d ãr \x4Le?\0,:֒']qN/A:ǿ2c35 DT٤*E0w !% Grp(h$d8 a  =G[R8]"g:`FTHP$װdN9\,}q0pND eHS3JXA:P&:=<n5 7ӪCvS 㭜G^2|S (OI@tc?T=nd~7<^R6璌) l6>1oWCGđ0I,: ~=b$@Oc?w׹$yk{|^dD\֣"uĻeE?U{!aVqRS#mXa.p{ukNgq!j fP!K߫:Fus_B pFd!*)RU.2YTSQ̀mMEyʗuf!h wlr'USȺ.2?#6 2+AXe&3D勳ưG]y &ww<1tlc(J iԍ4N)]HT@( ,$P2B+WF!wA@DTTomulxgCwYOfv6ij i @]R51ȲA \5G$7T  |^\$}lv%eZ'Y(,Sxp i*ZEZb:uSieNli[:`mt\/% vvaNЄ)P 146- ?MɁSJ2݂tpUPe1[c3|+;zi}h˨':';^XgJ=wt3u{!gF߈%UqnicpYJ X1NP|eU U2zxBaurfqH2%"~ȘȪn3̓FԦg8+y٥G3= 3"j%XvζME-9AGk]cWaz{#I̱(ZIl~p=+桴Fer[$Pڊ0b"OkvP 5,|X]]p,}Fr~B<`9\Լ 3g 4G!"deM%Ҁ3^FEuBdt&- cgl"S?;22giލ#HɅ0K`eeK=Mk4+dѕYx1ZI"4ӊ0)5RB6%gȈ D%kmBǵWL+Qoc6]ph0բ/io P?'YqgPyf']YO>уHlQ{c1yYps88Ytwr> ra8Ec'x_{mV_4#$㠗ؤO;bŘ;,YȭH$,G=?nW,P7& Z*irnBC(J RLo- I mD6L/d!wPXVEzd0%[ZnXVʊ1% E'ZUyl^.JD5hE A~yB:)n"ʪl޳ƑuqyUpw@ßa6.zvsUFJ:NVU̖jLYQ(y]ת=tx2RzҮ]ƱBlh hu ҧ\hSg^P wӓ~x4Ƨt@ST/~GAcP7G2n BS0@$ XdaŞP!L1Ed/fiq-TYbl&t{u\IhZO4yazz [ %г{HAH,u)0-'qd{  <HԽHI^2f\;'El~ pSA4=;#|-B+/Ӫ/4jwV|_Dg~L+ -Ƙm f.o|͸ɺ!W)NuTO(reUΥy+Řn!]{S]};da,pBQH "y}h#^8d uG$NK3kOx O| Gtk`G IT\A ;+qiXi'xG'B᱊"6>1/@+aس.#Os+r0%2xςsT?u={@iaݥF=VU#俯\|\^eN]t%e]Qm! Ic)ezjuUlU֪O~ф[[ $pCڂ/Mx=)BP6 U*+_onoo .QпoiELmLlIZx#~̕y2%^}vf3>|^@??0F!3T %H\T.CΝ]Aٯ(n{[?21?`y`gNDm L5@13&p~4I<չAM*h,bnViv8>N_;<'[=dA6҂n%s_  'sYz*';!/E\<@˵-XƚR:ч%1Ndo)?\^4'{Uwr)CtJjtk9ϗMqʜQвgN jqX2& PpgT* "En1Śx>\(:L:vԔ-Lbp q̪E+զur: $&eI!W:B£$` \:Nhs%zą vljk̳b}QH,1,ƫѐzK3c#:4R#,Й)) ,R{>a%rV6(F|4-X] dfՕGKṂ>z9|aUH *h|=2צRT;<_ şf!l:Q[`&AjꚂV8i C- k\v,ޞLSCHZL`8!j]r{.=fPcxο=>+PCk~S ډ_N?_, M<˜+R z >N2`&Km<'of); ' o ܘ]u__0_cF0_WÚu(>$ң?ub:WK"clOR:B!wd-wњee)Rz/h st/ {\j/tWPK!w~ۭc2ZB>d{OTQ%U\)ѦWD֧2MdDZ([\ijߑdpޅR<< fb2|_A!yc2<ЎZ.SCSKp%i+4yًyNj@v1Ze8Z%9ov(hNGɻ[8pfR0DOn?-I LN̊3;;@F.\EߍmO4ŀc=T9cutp$n ʵf}JQP A<siou.81URs 8VZ0AHTE]xD4w/+r L"YI^&t:&˃5t9A 3Ӧ4m P;whkۋQ(Al[,6c4PZUn7*";/# }멧!-#~+>E^k陻f&E2ɐ3hM@786l gdy~lk#8g=EjN ȣI)E0YoΥ!u>(28+FueoarY"[r!\$4d+ܢӏocb 2GRԽ C@4PFa Y|^zXn.=o8iZ$t+,QeǬ"U DK&v?J٫uc|IN6_B7 TӁw4Q<]pq[!ޟ1e[(dzĪ@U!4;a-V{% $阎_oK=5X&?+_?Ps< C*sbL .i~]l_o؁}$hysӤOy7[|ٷzmZI5kRc&ijy`=zHAmC#9 >WkRT&X]CD[J^RTF_X߁<,ބk/nD| :9mk/u~) Lg8߰^P+#ǀ+JO nFS]_ͱ'ߤ|g)ĭ &|{Q}3_MphB#:l :=쏚Y9t`'KV FpȪ\}.M98cg HwBJ_zWX2rDP067`) l< ZTMb SSXxl8A3kU<k|-ݍDnqF0DU󓗾Zqhe/D _eZONnJ!S)X "TpN;V6&-ZxCʴg'0gDu 6 j|H.dﶌb+(Jب:j/MQ|y>$8ÎY1kSA_m60 >lAz{+=93%x教tgi]8Մ R  uuH:s)} \B&'[k4ѿ"*;/<6/|j{[!x%6v-Ūd]=AV]saRۇLvj@$?*6xaAA8%Nn(WXrxC^/ǭWl 5z`LR:`wNU6$HMV3>nA:gϏ%OxʆʪGg%4U=u/]g^8omy@eݛ?۱-ϊˢ"RHkTʰ[K 2rͫ dȰ=7.O?!Dmy5ӧ1T3 Olx'&WŖ;tſԲC +ֲ_ 3f!0(T~93 `Aqx\Ilf r/H B*w(`D-Tj\D G;"04GQU{4MĄd5:v\~u/JG>K?9 ?!O~7?VQ/E@O\JVwA"Sv'] |՜K ls<O&wY9V(4e3r;M<.y0`H 26چ ?9l-"6wCD8D b29CMZ\NygwK,8洢 Y|Q2\$k@GD-#,g7L cc, Dec9-řczЈ|f&SZBpRi۽3IАԈfyq(;ձ[C߬s"P:H+^PBz?9,#+`"T]R:o8[ғn?w b^iXrȀXk_7V+ k:W ڻȼ[IšA/ ,Q/YAv$KruI+ukO^9`nt\Hv*j" BIv :?Q "x_@)&=oP:UhiҒik RמhHҨ5Nu^Cp4 "Aī'j7!8M1:ɏ%C͟СV]k2Wɏ9R=9B;w]||h".dDIa_8~?QV/ Lk[ Ƥ0ptdr RKԸ"^jД$άG̼}_Vf~T_O x3v̍7deJߥ}Mau4M¯=pƋwKpPb>!ؔ94) >^I78ti4%?2,m.TE0j?1i>IԺ9v#_vӓTH-D1h^yC!`W '1 b/M ޕsN FW/b 9c4{Ҏ~bQ h}mۍM]zOAQ{y)4M^ F ! n)^ ވS]v(ƣtM]ܽTNjBi.!pvGlv$4O=4"> bW'ϑn('p};x֜Sg9/ Cc7ɾ 7)r&ża( ,ȭN(O@č< [ߠlnqY)$ n>#R`k@Kt=/0@Rf[⤭w(l$lI?s>cJ7BRZ:eX34xk֩Cxi0+c6N\TˠYde2FK; N?94*j0iΆ p_ i42ٲ ̕w?l[]<H4xxW@UcZJEL;G~Bڏ5x9FV_h_3*iv7vἇ9Jl'rr4.852~4tFxEEN<4e1:{67lɫjy2BR˃I=[mʎ|l- CØ]`H_S|2Q&$36jI6grb5#BI2FCqn !BĔIN-@/u$Igp9j@ rw:ۯ,VX_ߓlf}z㙭[]p~ׯl+ղ*0H{@SaB-p׹rd%Bܖ z3MRmTlThm]Ƌ+ZTX ѓ~a*w&34\*}\MR:a:o |a&~w_d>nuO"񳝢g, eWv*ba"5 vc%KE!d+H*L2B08> NZly*j/j@D2R~Le@, }4u %Cf7,}-zJJ b B3. ].˥`$puPv=,kAIx}]Ngmv4oھ!=-/q_e}-VCM JYIXb\F2cՐ4F}j]iEtEViyw<T/r>nuZ Sȧ$4 j MqPI_ fc+%!鼘O&S^0?4t$o/]T\GF:j>$o]>ńv3Ң#1J ";N\'12LR'rrJˀίY F'LV91N!(uti3nt{ӷd-`9 v5zȌmjGA2`CjCi"WGS %&*Ko1$WحZZ@.̎ ՄKMOx[oN gx# n=uK%L]5#7g* {Epz2yG6#JVk׼:2Y]={ӿjg}F"@Q(?c.8\0A"Nȫ,V+}[/ [KA%FR'ei\E^?Y)_'3/HPƯ'lֺ(?A:>jIbĕM߃\OBQeD @y#<{,vIi'RU߅M:ESu.1u |OsKE6ũ[GGT0u4wyA뫻 }&RѾ:Ys,b?W"ٰKj5~8:nZ(sѬeDX4 OUt%w3Mz𾮁7]tJnehr X v4O=-x)k8]7Kq+g()p6ytT#ґk(*w҅JfA+ QBj(aFor̦z6d;-ya`IV⿿pkW2̯Q#|yIfsjVetXV_*IY3(b{[G:&L:|jG$o^1Ԇ.lo; Nl즐$ p}ZSX`Mc`\}=ٽIP`J1824icX=ADϻ? eDh \G7e,>3TV4`P!&Lj,`b6@s609)]++,`f`zb$HLD wfa `;ܷd?i]i<@+Llnb#@d'`lK)OvJ%_pmNT}dxc$rve<ad[,xT g̱ZԍrGrh/i)"go^I MԆrQƥjאf#w~V\D7H1+̥:+.'#lQSLyB.Bf3`þK AgA WH9Z#Tyx?2ߺH|-S5KŽ0Rc;L;}80άđHb)V"qF }I>ŝ >' ꃻ "R8tp@4e W<+6_03l2[>SϡXRN} BJFO#?θ32LyɵAN wEΣc]"ԊJZE۩z2q2|g\Ch!w loi .)^56gERˊ>6)bEnYWw)&і:jx T5=UwWR2W68O-5 yZl_+M=3bYl2 *=$B9/ =En<`0nD<|t}uft6*yV 5\w̡zW:/&Q/I4а)[%xIC{SQ!!&`]Ob\rW+ MRyC ).KBB}$հB Ҹ VzkN%2i?-]&dʦ/4lk (ͧ]/CGr ]g3D V`̘L  28n;Mٕb)YaRCNv?yd|PO?RJ1G8co>Ȩ-<1Ae ] `#ÑE@K([  v&&1^8V22g *4#rXn&hX&-z?!ɑ"]]²߼z!F+ T^-li>ϳ$l>RX+0RJRFF0k&X)c/{reޡ ސkkꇰ vpZ6WR癔ABDv;˽2Ҋ-| m|<3t E^q^WgFa]vv̍lnot.M"C +_BPC) pis<t9me|Ș})Qvk)H,8ҹjbjwa|sIQ^v,b%d_s7 ۟#o}.jL1~.W u.:TN^.0'LH~Ɠ? aNl$] O[=2r#Z(i]}`88 6ik| rzßpe^ Uͣvh[D2DD0ȏk(Q;ȢHYAs{;gjD@.Ey$GB@re4xfD"op7E8t4ۤ=lk_~j4D%'\ݓR 2q71Y)ݡDx5J.V*Q5gHnW5 2^s:Xt{3a3=TéOcw `>M FM/$d07|md[>`,Y fLnqZQWuԓշc*'|'{`KfB75>˙ɨ^Fքla\՗2/ڽM"k#H73X-߽CKA8L{*m$W%)4x4﯍Ĉ8@fc *v C, Utx~&<}ǕzQ2ro˃ U ίD7[fНֶ\ȵ}[*9>f 7 Ax}Uˠ7nYf;@Wڎ ӵ 2*=Qdݰ96}/[MxK"~bP3{8<{P X3duЅ-L0ݚDSTܢ9 g S,(qD %uo 7ySm5 Y/_@E`D8GxH =86I;iH q=민1s&iCA K],*ޑ Ryk_+C;7Xe(/P Fs%m6;>YTuCSy"e4h),! V(B7p0C-G1|q r7Ž9ڡ򚦿ha|j VozV%9jq!yZ]Fz91zfE YgQ`.'+REj9~)Љq@߻Y&+y''нHeV? AJcuiZ4˧;SyK4PV 0Lf !tlA\x.u˦In#L^Ib[D4.8"_۵}clkiCy%-l*A{ QbDQRSapmxS6ǖi70`(h6%*9d;S.f' n94R$b} +(dUⳭjgtI"lTv&pwV{[ԗy]9?9YVG()\ <*f,+z|@D`8δC҉~#ʷ˶jD>~OV)+gض..pnʤY2'L{E=Y3b3).#l\(.)hg驇d3S8E1x[ǁ`= F0p o~+Iκ6lofq,!JW Kⓣ)lњ$F s~Ǩ+A4dhصS V'`(]p/d_"uϤj:^^S]I%NVm4jk|'"@*`eʖrW|lM{A䬓'r5l N\SR{$B8M2{g|@1tb8$ S&xo.cFrЫBc s͊8]#Z%%1+%$~̌歘x]A橝`gkeT|י!Of)ځDn<c՜ZzBӹq )ϫnY szSUy/"ʆ3sīSbm:n(n^Zha֔m>~IᙫQ*YЂ~.k>Ng4)>GƩ!ֺ^erfC:CNͨ~F~Ң)2՜MdݫldƱrk VNo4F~E?'+vokknj Y~2G2eȖr*wZ}).gd9MgByG}) VVBaS:,Te&EVf5g6UyԨM(Ҭd< 0S,Sb=ZTƱy`'CK}c_R&؞|T'T}ALpaGQBܽ&)%J Bӫkx7 PGS9Txz?7 W,]aՖ 1ɦqVzݻWըj<1D0ysB]K\WtD2%Vhw,bV gѶ/bH'7hshG#36U?w6;G؇/讨v}y{cv d-`o?Fx;.}7g+/޲w) q⯃j" Yۂ!Y@ /LSu_KTaY=7_b(bMJܻ,cy"վ9ZzG;Lj܆[m), TFl NG|f8 `>ZĿ $5bYGP8ɏI7 ۵V(i}j+16ڵḭ͌u ' H% =^$G?Laym4C?nmo}X* xqǙ @ BgplM{r?^=}pi^b u>gH@ vvhwa|hDe=h V*{.E] 㹇)mז˜`R"&ULYYC]Yf] s#@ h+*#*!~n;xH!e ``FWdT]b8B5j.Mi.+K$rP؍ hUVZ۰QQwYGnu; fc0],'Yi |"0,QMhhVl֚A;,Ulv0 T*EemUz59M"`/=v/x8N_QORJ_:uɒQՅ zG1ғSEFft 򮲫WYasn%pkZߓ?&J\1F6,UG|m'ǶΉP,1DΓ)#Yr_m|c=iRV{o11ÚԶ =ĶO:dkV+g OkcHEU迌ݼv%a7aTe9ñٍ! a1 ,P[ 0ZV~VF; f/х?%9G4 4?}ƲDdzUly`n 7aEg\۟WҩJQ*l5kIW("d.|+nX 9}\YQgI!8nt PDyjSyeHU0с AU"!quޤF9Q,fB^HXxF J$`.T^OKj7% {]ۍҁ >R-^9ZŭT(\ /O ('t8a7L 6`ӝ]RUgtZ6re^[VczIAZ\L`cƎWV?Cs;U|-b[6K #tIH34GTH}`͢~⎤8O|?r̘dzΘ`!G7}ZP&S0af/6m}b7Iޫ0yCP~Ϩ#;cX(+*u]~=o՘ ;>\fk&r% }558߾Jj`JqQs]Q~Ȑq˝RJQ/ڞPe4xpV"X_2WX.^=Sk]KJt ~y fԱ /*eqwT!ٰǦX@D9^JsZˎI"T!EI SRg{80N|!vTw%t[EäN_RHSJs2iZ_2 w?p8*ɢ'#ӡ%t"Zcu*[!LSWs#YxLK?hyJӯ0(9jARʥS"M8v"Дm}#-MH֎H<^*C@?ڻ2v~M(:ؿ7618WנoCd[Y ؒ<)kZ\f?n1;6\"-c4{=<D~퓤7ˌvr PvtSom͍H>+\0Ȇ}dy֑ؽ c XW:6W?qNJ㙓^ic09 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1  (Z ;iîElSYL"4Z rTf+UjubKrzGB฿QQY⒑'NMI3a uD3D`|?mXjtUlЪ۫bxVkWJEPP6YX^A`I-B9_5!B"M@qЖ,rapc$C>QrTͯ7I* uG^b}QCDN_Vt 5Pq NDe!Ns,/LQ H!gĠh0]2(]}OpԤ0;z)[# ![wk0B_^V:)-0C"`@h. M89xCJϻoUTG,%ѧ*PäqhE t%U]xr%qr;@x Q·!lw.5!DOFd.]9 R! zT  QuSd,z y;!!_H|9gzFt]tM3n-&٤"D띸_VO%Ҙ2XJ/ svf7|P:nP@m=Էj/U_=<}qˆu~]&)>5bI3R=^B6( )}{ˀ8lRO/L7c49"[G̗Ie-2\PEQduq a`K\ڧPco.ͰiTb821t1,Pd aM9VG)W!8VR[2&plWJ#</dp:03BYÌbd+w;mNA U~ {7/֙`>ltFcJ*c^ !rfVLq@k`IPBQ90Z0b`j:T}钨Y"gGlB*,|7ݸ:785gsƠJ}8-ӹ5L!VM񾊹co>.ykmheu}l6^)6 T}t! ;We&"َ|5eZ |ȓ2Rz631v$W'bYڋ]iCcQmƹg!8X3ɑ0]EK WP* |!3N6ReV}N^ӱ!ZDEM򝅮99{*Nn2c C w,m;ECd񅢌5`]kejrlʳs;f7 D a@ө8%.?myZIq9g==(moˏ֞+e#5eA?w^Ե+El0^^Ood`5-5$E9v1w@iWk&9̙5i8]|x_dIAɝC>[Х.QH$h ( *RXʚu{Ckw[An,C*c(y5fjcIm|J}ݦjU(3vF}H>Ax@x~TBH>(*ͷed+VT\Opʢ?'S&;LӇw^Stsclg`o]#/g-qR1rÕXX5Bٚ2YAcYjo&o*`f98]T< ?80'g( RnwY;AJo|tOBx<({@$R*]'v|?io>>RkneTBn cSjaKрc6RGp;of6sC|[q5 Y\TV%eHWP[n6d 7&ASQhT4IIC;[vAI@Ĵ'䄊SA5ډY*bIt uBs*1zu_a ewbG]fT'c"8.!ݪ›pygLt= Al:c3TA'm+}8Ɯy?x~%=sn:X+М<%L1] }X? =pav$z&H$R }Ս;?ћk˜ʺH!:y 7N55-B TS}j#15gĞYv},nk;O#0hAֿ2 u-&| OFS^/1H"pm{M[,)|~b"'Ay:YXHB $4H<:}U!1 z)G &x%6Oȁ"Du3 F\uW˂?`TߛZps NU~Yobjйԅ^cSͦ]"h*Rzq0r̸6⫠!Mؓi˂OY#:c+.ylD68m_sP>xY֝˖'`BT吤fz*Xj| ?2kJ)h}PZ5l򜧊j{՟uW*muDmLhi'2ۖƱƍW0RRPV(qDtmWmmb* 8+O e9U,pLțw>K4nR;%mѠ #D3-ΠY}ԋQ#(\QjOEG7Ȩe1p %&)+*y[rx;ӝ6-"ݽ"> ":h/e,6!S!YПǥ2pўI *KnDS 1.a5 XŷUN@.8O PHᾜ/ۑ. _U^0'5(GgQېXDD iۘ]ʄ3rL\Kg{٢D֞B#u׽AdS6<ڇjK}4iEx9rz_BcK8,89GQX 0f7''9N1ˤ=CG^,.u|0x5Dk+O)3b  @&8=k?h,FtF$r50@5AEѱ6IV_|b|ٻK֯}S醟gk阚i{Tn\ē&%FZɘt=t*EbF<:#75Ι(נZa̒k pcf2ܽq?`>tyGuϣfg&D9k(>E:B\Q"q!z븺% ]uclG!ϣ1 j.V%Yxa89Be1(3IRSmMɣTG~3,*`ThGJ{B*ZN.Cfׁl%hLq ffg5d /S9 h~3YvŖk:A &W2(N.dĥ>NĥJҲoMw3 m?hR'Gގn,0'*zVJ:*3e}Yo Jm`WĸMQ)ȍ@V JC bL΁A88o|f_= !9 :XIGىP7d^{aGWHneg0OyVWа7R:7`Na꽟X_\Y>…ٌEd&T}\qzB>R_~2ל̋~bBdY pw)UGVg޶Y?)l*5.s 47g×|5A:2ɍS)֪| r^ส̋Q7? 5):FVU=X0cs1׼ 8QhH&<3*Li'.ا-d(mv]nf'd?XgB$4Do8Ɣ$dwG#FnTǧ(5a )Q DPo(հb9:N*ڹ̡|!iq|k{E7}ދLgo%(L7ܤ܊SG6I39aH`KvӬ ,H[A<ل"x{WS-jUkԳ.*m|+v,N;8HM9ƵY((&KO9@Z2;vӅv=FʫwKPS%;fPpvtvTjAukc3W%F'hpS\!,"A:%\7/“vD +6@#eA%z)%.4g<3ӂxO:. ~{!GGnqP6w$WH $ *ciZԖĞF"q A"y%m,B -i,cqPXo'v\r=kG ž1 M1y}/J߄LO O.zr$_|> Zu苷 fS,'+g;AX֓T> |~M>wK]Կc]L2~q|r =վ v8m!}/&Wk\oAa|GZM]diװ#^PR>?e cC ش+ H?6E3~܋75i]9TEpŸac\#,-@fgRCXЏ/*#| k5="hDWMB"@(K1 lo9|!2s#FR/ !zYedҾM&#yV{V3P꛵B{i |%lqg06 25U#BH5x?^WYޟ 2¦MS34?.Qַ^C&b,BFV,?G)) xI,l:Sx^I 8m~nySV)\AOR@[MiCk˪Cz 4((-IcXu\b| lw?-sWУ57c/ 35OBn ead{󼉢Eag[A]boMʟ/ܔ{G1_j]~׭M,,3m)5ʭZY#˨,E4:^i)KRÜ̸Clݘ阳˷ <<FsYȏ˭Fu̙oGp)+lVgy -; xX|E=F^}TFw`A#C  fMXJycsBr̞hk\z0݄JްWK[xr5q"xy-`~AQ`M pT=O^zy<Z_ fG7tȭYd:v1 {{Gi:fl+JP{wVH\ SsYr'@f 7,.+>`?;ޫPHQՖfI%ȝ< ,B,7#f ͩǹrXySldHwx/-lcq' #Ox2CTv!la_JKy n -|=Unk@l<E-.LքV +%> LW]66 h(twxzQCmLRq'+J1P Λmdb69Y9f~ jn*mj{&eogn}%pYUkZDFG#>&چzS) 90d[&>|B h8)xB}}WTm1F܈Uvdܥ`~a`)k6.hu 4 ~8M{:bbSQqL2~e4$$*&Pr&I`C%S0:o{pmgQFuGHR@ g?4ɐrE`}iXGX(0ϙJs$ODĄY|Y%^ƼEl|sNY}Ѩ s"}K_Ɔm!|@Yө_bh(FfqK1_H =ߞL ]k'̦\QbF MV ?ߌv]♜^E#}ɇi릔Gx2Ps+NLlPd'X.JpTb=lTՎ'Ϥ5%~\Q VcERT3PZ6q] Cƞh2`yY6lbS U82G}LSB\ g+kX4a'Z"z(t0h(d&׾1?eOeCV4zz#-| $0df\Tp: FI1MhZo.gA'YWU/6E4C+qUR?15Q2A&kp`VP\1 B+'3OtVƥ_o;?d8&\k -p@-In+5IbXR> s`<`_5JDD092ě/ P[w5V"CPvg+Zا2 ܁/y  ^+Qn킣M; ͅp  7OҧE4Ou.R٧X-,P8VaqB-MUl\gMRsƜU;XmPIn̵~-(,vA('E"yg~@U}9ر|L_5`"B*۴!GMGpcW@sG]q qx䔤/ߦ%#3FbJ =xT 6B3$HW[KRE7e ~JxP$fA?ɢ9cu^ߣ10ofaF<.bfvc.r?q@r,^ȕ:3Cq(<5c4+b/?֬vj t tn!@6S*g}@b)j|K?]  t朩KbMM|kgC$?d:6lZ;j\R´"^sX}j$|=ȤII`Dqb!uRfh,( 7q^–BmJF:jNa9'`=a|KQ\PH~TZ Ջkf~Yc=ጞ%dfWWrCRոZ`Ü\n{#>܀r#jإFwVx:B!<,x+P7LMVy_%NشQ.*&MWmOw%wZD[-5slJDG1pO5De/0&o]TWKٸ*jFS=#Of7FW%Y)l`?6jr7и)|gɮ C. =ΧgIN $<]qB&cdz~,ؔg-QZk)̐IFjS 2_*Yv͐Nx$}!R1.Z$fֻt;Y6#"AMzx8ʶ#Ӻl;aR2+܍*TR[h,|lߩ>; WWH9& ۥik `C@J02"mx:``0yg3,#ͭq#JKk yM:x;q<`՚_{CR^ ҳMD,SwN|Z@oVTl ?^_R'sK„`+Ëkk^J3Ȳ`3c};WLڗ|ba=YkFa4%arKB9w)5ѹQͷ @*[Xݑ (D岁t_ۄp{s=1`R6V %XK_K pN e 'ȁpšə0 hPuo'@^uLWmCMMպra&TFzNDkˤdM3ʆ} ;]Zf?^0%'e bb0/53\”C8z]֕qC(~\y9~QzH;% "i?Ww^US\ޱPȦ|f\n43娼FNߎ +}L"!pPl-+dzö11öuFt$ <8B!B:G-Gp{fv;oKe#z nBqEQMv4(m<{an% Yz|C`UN$|^& -צ(l`@I/,~-f0dv)l,pM'ib37f `WL@$4IhwBNDGU nqkVSܫ%{b|wwkH`lʊ) rsrR_gXBPi]frq=.ֵ hS'Dl#73wnm0壢~0/3d5qŕ.rCX[Hۣ GK"͗[wnD%NhP9K.:%jp0aC>H%屶KQ 0ܽ=H~Q$:طD\%`黓Ո\NД1nhf3_~kEo#vbT"~ T %i6n=]JK-(t8̎K|L`ʮ-$wt7|5KCo(U;9˅XWƒC@KUΘ۠>~-ܳ@O^)CqB"% mh=[SRP$a"3+ze5鹀U|:A,-D=ͬ}[Xr('0yBV,$E_6U)wq*)ڀca*VC@MX̥ݬȍ8676jJg+uiYaZަuɺP KMUf"z:?ܠ-1!S[I,o K0KfblWr8Q$ =.A>ZPeN ј MF&I )c98:&~>_Z 0ORO򿂔O`~m䡭E؟wv@LLo5lڬVRK"MsكW9mݯ)ĊxszVMC , `5l܈L$}7"C$sG;mua#2{qՂU,([}BmʴwHoe;{ҋy}v7Zt=Kjх`̎z!Zʷ1@"7 C#ہUp[1X/T TI@N5<>*sCJQp!R-az0D>Ȗc5PISu*cUP5Qh=jۭ-mz1l0 x*3@HT'9<%b0 b 'Rb1ZMR)7UIqB~'Qfʦa#8%ϻQ <>AQאnۓ*PA4,FOreKX# bI0mO9^itZN& V&b^fPj~GF٤r7 t\^T0L}vCD{xQtF_&24&"N#KI>4.qzdBڇ~+A{u xQZᶩ@&|5>&pn}ѡ~~t~l :f#K噀b-HT gp14Kz %vy zwt޺!$>R_cSq5yIRI>i&ȆU&@m6Is\VڷTq#N .wnmg#z$vqQk3 U/U#˽4BwrЛ`Yc!QbJ`r2]Eq F4 X0Elޙ=TN'/ EOTmD}7?r.g𶗳c3^Z#DMv9QXÌHis v Kqva/Ǚ׶As"Ahq/W6/'ݍz(ZٖN3@3M/Zv.2*NTͣt:^γ,r4ln'ޅFՎw4#/#3TY_z"7|ARU̓LrMaΏc)3NGwknSt; l擽 gw~Ax!g=fJOѽV2WӏRl_t󑫴[#S0C'ĽpY2 X.tr,CН[Ф~ꠕJrDbA!f} U# Ai9M1c%SR~Ӻ>M*'c}dҢ|H!΂X c@4N^"ɟJDz.=1PcϵjCn*=4g@gn[w`H [D! 2lݔ?cmәgxLyLO' r]6AQ %usG SMt( 7 %ZKT.Fڿzvi*އ6q\V~|!+%Ø |?Dɉk#Zsq 3wBhb:/>]L9[[C7P q@1E RQ^8b k/~Ud3ٵ 8'T~(Uw r`-@*cQPP+.m%w|QauVҝ'rd{dIbu_'+KZ-?`2`ը`2 GldCt])cDyì`_?{*D#7m3aI槙X`Emi)15ӂcM*gQ8=ba[y.0l6<g 43t߂srggO_Nq p,` 0|9)0;Yz`WGnj lO~C{07=$K *[a >G}&XUJ<t>_4pk"{rm%<p.vt߇ &؇yLĪLĈ 84 0u|A3~dq !/>bgz)Qx^CD(ZٝX2y&ţKv*"Zh,@ZvAy [j9O'/땰͏u(C dqHzed 1w՗BHNۀ6]_ !YA=oKa:ݔͺjAو^}=p~>weF! u<)gsYdO:7oBy}Piݓ46ǃnf)G~}L=?60j}|(-:w'bƽ9/wdnm, )XO3@W2PAe{HtE0N\M[UZ= I!0ǒT/iI?-{^i/ݸ<(^?> () Gu+_ [Eūͅ AK,b_iKeX:.#7KU^&o;}e 鶝۱烱n6PgN 30 E9W+(e,hFGPGІI[@M+˳"vzmTG]A`Nty[ 2-h;Psv~ X`pA>L#Nݶ;PÆh֒mґd0:Ӄ:#=ҷ\C&P]!}m.P+];~B\Yf]t)fw€]Ft+kd6>"iLHT ~#Y_#o:VѺb: y:6Fm|o1'AWƲʕ|;EuP]|9jdA$/O5INg(lVpƮ/N,#}֤ >2od[쾇dc 0ʪS]1%_k*!^?rYn˄sp6WIaᔨu gD*߯ U --Ng$:ɑe õjXʦCkYv?}5l2s-NcX&%\_a҄0妤;PǍ/ ӭؚ7FU%_dѮh6+ؔ ,\Qp~͜{EX8z=ƅhB/u!sx{b/mĪi=X:Յ/@OMt*/im\^eZHGzvht B*TUůoqt3{ :ieNE36ϕV>Ioimy$ ;Fkdyu|U3> 7Z1!]X=,h{ˌlG$FDopR@WKS7M (s_z9 &^&(dcFr Kh65ϊҷ)Y8l޽i^9لEcWuzIZ(ʺЍB}, (]a b<@HB|̨F~T5@ׇrM OfGsՔkβpX@fZ/m;'_:ͫВd :^(O4Bt'j 6>=WрR @i/`:ٷh9l^{Sψ ' ?-&uN(|r}) \x./ L& jw"DFYNaÏP'56ܿ^;b]YK %_`yzp-GPܒKҏAOFd>k&$2m5Bph_( rǗB}]~om_o~ww{sf>u&5[.*WAf:'!K,-%B.n^(n&y-V菰m>%mI,lwl?ޚjiaTA-T]Z}5jظ)d>DJ4X\Q(,^UEC\)f]w࿺hR=7GtaQŤXSWV-c\ohElO II.֝%mD3&:Z#_YȩAa(<@sڍ 9i݈kFD2Nz&O6g~d^oٗ}R%NEM+s2){'wQ@ftJ~)EyͷW^*$C N=T ? pthݟ]㉝4$1nLPb'Pܗt$O]Zm\  <צs648d(,槲:^l ';.$ze[R4GvI 墷?h*ўS'2m)tR7}GsXÖ:~Og:.@R8uЎ8LI3CňD%M|RbkQ!6̌Hw/M(5Ȱmd(:( X/!:I$z|.AT΂J-fcCڪY|=`! YMnC i~Fo~}H.㘅PoūpHKHLLHi`j5!cG^!K ,uZ$DЫ.aգ*IX clR=^tx`8=u{*z:%lH]Úy"/hp…T= ѯ@X1Ǔ=]"m'B#Ս8La7iGwC[.bq-@)?+aݿ ]RfêD|?VӭO٪ O9|_n{3uڊkJ6afO6=]7im)KVB .i~`Q/L,*"iKCyI=VEk,>S)"Ձ"V&o_wT-Bm~/Kr4P /v>A ޓ,9}/g . [hsyGsC 6P/9~#uԣyjL!g(ƪ%l<&зe(uO C q̮Ky$Y b'no{K0TyًʰcM}uA] } ;^jDlW%OSM{$P)^M:=9*tݬ 6:ȖDVGozFg`&z4d}L2`D qiˮ̟${tT#.[(O:`wՀاbۂ_t) 0OEA+-7jᬯ`tE̺SeLUnx~:):Bmz>=8iH9.˄8Mz,|L݄ŢsຢzyEk@xTι#"tMlԻpLjj*G̀$Ǭmk^wl\X#i`uY܅ڿcw׌?8g?'`π-i;$xާ1 8ͻyq㏟6?Ua,3>ܥ\)'b0!C%|KY@ Z%BEGr) Hkԏ#>fmsρ:"&p-?hDa4 \$^V{5XB2)xL$ćp?NXTL7)oROGZB^5{m"E=q kll|~Yf3 ƹp$-otRRl d4nj^0xvWs*q3NQ`D{I q"F ^WZƪڃWB\U`&K.jt$Qy՝*N+?H+Sftj>TNn|6~cND;>*===Pd|ZqDh#IA] ցbfPCX0[4̦yn,2KbnT&ڎo|02C隆ۧ;Q(٭BYP-'* f~qaf,HT[1֫2KKıQ1@FV#bY]<-**񻮺V s0.T 3 D7XwnpajccQ;x]PɏyƆjۋ:!(sԴe-VԿ#ΫoYO=,,FjV>pRNw$&  v49:L5k=u⡼F{)t~[,$܎WW#3D7Z+c)wD,:q"#Qg3``%j)c"77I!̐!(ݓzQdpQ<Pyk6E dr7v9lYPP2;sSO3T2XU'd@βR> hPa,3}%/>{ ìlFlOӖEOR@RXSjHoV.z=jeZgx٘or2)=䫧Aj{R@\⯐R O ꌃ/a׺ffnevx!4!-cG W(KOYȌ=/urmjHP:n53}u{zFNv]x*/9z_OZ[Fdbse+mij ;x@['~K)xT`4lG XUb'kCup`թlЧlA=HPhlC6‚y_2yf:GkaV%dySh@!cX<%JFg IZkn]*χ nbj>5'E^|!Ձᡎj 3m"9~Kd6>IR k+R4"NfW!k5X5JH7LOvv aI\ᵉVHo(WDbR˧7UT3tmu_B䍯x[`Qc#T9׏av&= nc djI#~$2(A?3|d݉# 17[O C5LB*U$,D;vFv$ptpgj!Cz(8Xc LQr-IJ4/\`NJndʠ ͖tc~SJck:z)*$ɼ܄ɸ&}y[\ e!wD"0Zguww9X@Vixa5wfY_yE2U6ߠ3~lc,)Q]{@ձH (H F7۷_R l+ Y:9Z 8og?(xFѠx?M]m ҾILoĤD@zU' ܘ_@;/EyGW!΍ښ Zd)'tOKg,y]y̪A f/I$åo()_1B'^3\ֳF~9DGeS]J*(`\\Ad' *R4L`gC*ZSt*I+b JlB]E SqBWH :ھUۙlmApQfݷ,V&+~5QG$/[a I+9/0Ci.?Oۖڽk=>0IǺ`ɹ'Kug@]I4_Ѓ1F2j@RWo^k*rHGX)Ƅ:T/4>%O~q~ %iq3V+OuS?,? h6}F&=! ]TN$&y5dlg5K~mWkV_,r0i8Mۄ\qbpx+l.J F٠#diUʘW#Gvݴvן#nJ2A{T]MVA ~)[k<<~W CɑBk{Y xHG+,!!3^oD,/ J?L0[CN6/9n'L7N# ~ X'㩡| 讌mlo6C0T˰_u$9yßtV$i=H/VB{/ 23?ȇ-8ԼqY+3Fgs$}-;RCR9PԥT.\61pJ KpK>vIa[Y%z\zT| >hy.b/(G0+rE 0P"lo)Ca/w:^QVsx0_ @,9Qch`.cFZ%DAD0IJCcbLɀi$&^] Ž5tϵe_q).RnuU|79*c._ ѱǞm4.|T ej?ظ Nʦ:<[p3Y{Rؓ*a1P%m]`lZ W߶tj^uXKl0ǸEL8OC >%XBB6(0j+V@z‹끫7zQs^泇]!r?Z#scr'P3~xP=Ӏ;8Wfdlrg\U(}T`so ja*SLŬ@l?( o@CgeW=7nn>hVI!ws.ӗYh7Y\rk+NeAâ!Tk JwV;T T>AjI*@A'@ltFP7kk򫵤/nJI;_ IqM81 Ai9|eηߙv׷Y1NohgoŎ1xbv4V^hxrz rR7&!?("ԔPCcZ㫭MҠu?/kBkz>B:YW[4R*7'Yup`r UuGt6?UZ94f2/2MBsAUO\4ާeSZ]2@VOO5(>M5 &{̙%  wl W;Sy(ohG̗XbMBºI7H2.' U:(C 5&'$[(6: 3}]\6nXORj(i8IㆭLu"\VEXS v#g#93Y/GXDh4K=l] 1q@l>nb_ J+դ6 HG` h4 +V#~+t&E=*st=lwV]/ao0m !ѫ@d4Nxȿ!Ahye[> ?adn`ek:h?ʕѠHq'y(1 ;su{ G\1+[`+b#D喛3Hґ^;)O_<3#H`HB,c( ׉/t1vAK@'e<5VXIcTK[`-ԩ'`N^!gQNuƜ]oX˳93?,A+Q(QX_4,Ava\j -]?+K(2.&^SEF]̥HQ< ^G>%^]SZnI܏>+K&+N^@d;:%^M ώ1{wr=l4];m/$L/^Lt\Xl@ X^^׻;;lG?M x>`kC*>Euʒ/? m=pc)@$9 tن ƺ6`9F؀5MOe s:eEQH*LfWX8 -& l-x{Ceg(٧й͛],!!9>ħxS*'r$(}ydɲ H.$S`fY~zdU zGءح*T>/ܸ)Wɨ N+ 2IըM1\h/ O#u2{yQlC)blp/dE7Z|Lо%npA3+oT]pɢD|/b-}Q]DS56N O!s8y.ޑ}e&ۗPЙ𡿤P4V7A 1);tE!"d#WJ;`um_-ʒe6:Um־K.2jz5%I0n`* g0Tizm<-r}3)Kg8PǃmId!Hj~7BJ !Vy*=^6-~'iRއx >' ]|k f+,zh-"+,fSΝ>VW/QVAmзw*0ai+x? @ V@q;/S\[㈜yvUq3y 4( Tz7TSڮֺQ=idFO˳7ap!19IN\dῧrrϥ{-Hѧe' QF)ÛeTQ,f`,e B{a^lݕ3s\BREuOҮ+O2jl3BFnǨp-T&=07|hT艄xM/KtK@ieӱ=rNd!@-뇳Vhu1}(djP=?2Dm(;-0Jp|CmCO^j*"kݒP*z>PH{#&!1z!8W6* mh޴gC#g0ȌsVMt׃YLi.Rn_9)&ߚ-?M+@tJt;/PpJIo1]Nі2w(J{l|X4wst76)s 5ykYVajԒFor_kʎL9bO.y\S1KF/}-Uj50vCj bgblbXJ%2|%2E@@u/Gūea> cފ-'H9_ǽv0 "'VCŠtJX2̆g^2R>"dVg]BjJՏ4/`x;/ӣ>Q2<V`8e\Ś9\d2 h3eh{c"C۷48ZYKE>HC7zOBg&^ʨh:c־kc6x~$UbMeؕ?7U:W3y[զ*GɴKDџz.[Mf凂dpEvU㲩VZqP#Aeg8e!Ď[=H/-S? @dy[#9v,}&K-L_XdGeTHC{ڽ^L(toJ$ {[֕};_<'Y-eǡO Z;8#jKo."\"V'fw 8۶WUE]ِ8}'oDi"&sT8g(X~J!C,(ӘʹKPYPxbڌZv $ /.6GĢxQBR^pOzs~E:V{#$Wޙ(P@[ Y"x"h. Ȝ'e7Cx!_ۍ# * j&H٬ݫ%oY,Cm卑 ˘# >Rp *FPuZ&LeO|d\Wbݪy!{j LHstg|^6JdT5^MsX|pPwl`u_[<]:ۺShiʅi ŝcaq}}Z]r탩W7f}zzbG)aDs[X9E|ЀPD.l)vAHY&&T\h ga)n|oy^5/@"0(sn ll3t;-b\v_C7]{T~׿ox~?or_oܖ/{Px!V_30xQSQva >ELZE\uS;ȶnhD̓!۱2_1_tHޞ%}S:xW<.0:oU8L| Xg:[i[O!pYL.IwN ɡz"XedD{)y6{+9[lV3BnPbu)a5rQ`#Kj3MB:@7M'2IʃG? B $g3T Ys2ǯh)>@LY*iǁTs8V1 {qq.!zUTWB'hq Ib4(w6aHuur{":koYbY q෿~S s.Ɉ+R_S '·F3T6L?5-Z4XEGtP 4^j"{,ikFa,{~صt蒦 i'B]%u_ ƚJO}.Y߿}#nlw-A6ݧĕ(8} ߁49j}ln樠QjC<*}[`]GC0;Q.g2SOۍ[d@:~S=2OX"@PqX->4)dD0'fW"ȯ! [ /`N bfh]S<ӻ9Ftufk gv7{nXYe XF*_OJ^% 1rŨLW 81 IEu):;pzi#fR28bJ{`x6=GmA@}ƀOZ>*I:sjU\-)B֏k&Ϟg{$< q .@t-,5-r~{ xI^p)MuoG hmPÄ!j~v/}qcQw4ZڈvPT @ .R/;fl _&N›yD$WQ?lmY E)uɬ㫡Zh uIh:x mi(F~StB#2 >1W_ÒG{aITU-nF띩a*Tkr}b$$xZyH<],sh0eą* @`dʦnv̊ಓʿXBfVhh~j9٣G[Q#T@Lܻ=bp+}gI[5 "/\m*g7O^W"rQh}p;$*Egb^kp=0콋8!] 30Zeqө;xw`J|a2A1,Pg| `=ai,5 7Wu'S;k֪bHˬ%"`6juGb0T{k/hSG3Wr\BcbY:*%3G/w*)lCJ%!DP| 6#{a0je/kl5Nbh7pL!v>OR'd_eQSPLaSh @IӐit!MR|9Yvʊ vb &844Mɰ*K&\, 9/eOzܷ\86Er*FI )&*2y Uc<KϹK ;QE<%,)2kAMiӦ:-n6x3;L5.g@8"+ aP2u+Cxn/jlm,Nɀ0"N+IqkȆ%(U&*<'z$_"/G?{8Tm~bP^%\1$w501Q6ɝѢ(:3N;}H |&TxM(VE?SQH0{ytMgil"I%++з|~ʊ:Տt6ۑ8s)mpQ¹lP$~tOIeډ0fp,)h #r, (9#֙LL!]CCKfPwո|b%+i'զv%ɶk*SQPKsYʥb5C.=+;9 |g&~>dth3Cf;OX,X~1'Sr*؞Y3vvGE2y?ߑ^CtkD2שwkd)/˝iK5rn>DӒ,^=AJ zqki$t[RlKO h7TDe |FQ(̗7?e[7'9@s1xXwPKzTMBw͞5n NF*PB So:PP,?ʒ '3H 'F]C:Ȧ!h=w /l/Ui0*{Ue2{i3k coowrhL0t"8Ap%blMqBIk坘ū+0p+0 =Zw- <13h*Z 7o iZ|ty}PX[;Nw ]ԋ`a/lG}zytΫ{c&2݄CxmDiVQ1ӵG;ih :M-!Y1YvK:䴘 {Lf&`j}Ư=grI4 䭀W# KnwJ Nئ]8a;@ltۂ\61?i{+0WGO ()I(%&@LdW뉍qT?DHQO6{l)#K֟HRӉEC*!̬947b$Y]- "9wTVS>l;$2Q@Ub”Hw5{\rOt R{'tLSiLWe/ / ֕}^^?ӫߛ`/!"l ' +Hֳ `SZۙy뗩Ηt:waU|So|- 빀Ɠ7Z-֪,G~(23xs/RO _ʛIx_@NUQ3EK5W98ۇ&T Rؔ4*.K 7)c` ^h;^4d#vcGCbV&L!t}HS[\7USZc$`2+^xM .$Y&Y2ebl=֥VA+{\ҭ[.~zY;,6HgM@yTY@&dZkr%o (k)_c%K%޴tExe5;4c_Am`c0Lrf=~\k) i)obgP}H=MMAdfj.fLR 3;L? 4~4C-$޳֚YWq%g Ù;.f:p ͩd@N]xo_A_7Z~#!o\:P m(i-pIP0+e<ߟ}/4E_v FQi9+:7iXia2xvxG7}gU#MBIV.|.cF=|pw'=#,`}T3ܺJѡ_}[z͢2H=K{/z|RN>cʗ%lkFyI p^9Ԏ|pݏ` GXs *._t"(dÉC,YK] \1/ 6#tdڑm v $ӃuLg/':.@|rqmF(/3 $RN2mb{vB*{`<*A:;}6ƈ٧zD C1XMa% 5g8/-&b2GҬc/i=h Eong`$&^ך8qdvO1`;j (3CUT.uT8ܴ4)di_ aH<[[2[$`U=,#7 m7sw 30mFOF] qH{us<)_i-!JW qf7h@7<,mQ֝a~ W4ht4Vjq:ͿK#é<Lਣvζ2fsf4swp\LEd6zQ r"8Zway3)N.,:rq}& +'tk$1"P|6yĦE"_]_,^q5Zb#8^^*< r/펤$'GDO1 0YVSPNtlfla'q_ɝUԟVX]b)}ҽ 3LH@ZBFmK`j@~vxUE#_"e<FVrn l&q.饕30'/lx(5mJO}`": H bi%.dPd ۇəb_~Z}6KtO1 WfP|̧,+woi/1}VCn$PV+V!fjrI/p(\.S;qx.(Jf)MvcAnބg`\jBy5@AnmmOķ3ZT$Y^R7Kf{}~T@̓#QkJՀ4lY{L=KHs'!MI-(^[N }go~jLkBF!̼Qn[F7 {r3DR|#1:ZQlby!i_i6HKMkzdIR*.ɳ %&8 dqML [q*P1gNht7_<G0q2&x5 ঋ͠ϰZ fGƼ췻|aQ26%26pW nx=@ oKQIDͨΨ1T|+hmWn\½'vqY;C8;l wgy(O&|KG?m>JpQ($(oMd`0)r' SI!pΤP:bZ?5M=x߹a=gÑ"RWsgEkaAر6U٬ _c@p蒍M{fCiVykuZm/vKX̓tPzX"NaߐOͩG#lO/8wr#k:툑|{fĆ3tBތByR_ cjb.D5T9%~9-A%-VgFQ\j K! -ÿ7¡lcd^>T-lu:1opy`;l 'dP[Ox!jg>1f?9Qe ;WS-Wnp c @%ܔ!%NYn$zX1]?UÂ`Ԋc0kvf%Op6ElYۨˬؑa' #:&moY"K8=(D6O[KE/) JoZ=,E!km),oJiBJ }*Ј# XTE%i4ǧg3!N}vk]>TG9\?vL{xZ<JX`X!_UchmCP%)@+J`:okq#GϘ>)uHx-YF ֐X/=a<\DQɠ祧)J x#K|Y!Y2-ђ:ni&ȂrS+]D_pdO`.8m+)&_JcX<@H!pv)^8=^Ycz_d9jl>[Pm)>>.{q_Ng$f7a5/sjdLKo/B>ufAFRF| { yr=eVsaNEfam]Gy71xBO(V'E-ES|>F;1KFqZL0hͿUpb yYgy3 A **x5 6p^iU6 .^%zFv=~4Q Q)${gĹ?;%I/v¶liRV|GKWsO'uS t3Pm|ʃsg fBBSlD=CcMEx..qo/$CP띸n=KQkwle]8' fN[ɎKij.ejN}Ghu7&%V68[mL@Yib&+KURB|! vHB \<" \i}XFA `D3|Sk3W9a-%3c gѼi-'4+sqa5DQǦq`AQk۞;]u~1h|﷍-RsvNjFe~S'. (24'<3ovzZZ"{O 1;L%h *G@v:&:;Jp|VI~覚G=6 8xz$&}fw <w5o^\<߰eӣ#!)$3dmYBi]J>EfmVt N_ԈB41c+4lj-Ɓp\<.2L۟Y95x8S FB8DӯF*4KSdӭ'BD LJϏˌIȑNWaeak*"u[畝`q:?AX&?)i$/_!AV6ŵwb%, >7;71ax-o inrzS,(P3#C{ ! (gUTc2Wa 5m2zSLPXP(72A>BUHp9E0>A=x1ƚ*tHuVP*jPb<yjLΎPxuz6$ע бT$K9?z¾BcU \z~U ֧a.`x`'ūy!=D_5yJx}qq(ѽ-uf:Z::᭸^2އ"]y> _<ޞK_.~}A9-JnD?ٕs)4\\Tߍ12ӡ"`MulznV:P6}پI _>>Pᬇrz ~ބoI8~އ7_ te}.nE_@og;N\'hU !Ҕ"I%2vhNRQ23!}]SY9m.F "R43|~=y1`|=\A)Β%'3넖즋jUK{I;LQ9 MX0qUi64,?GvC@߁I-DdVvA)58tx?_ @(D*&5O&fBq`Z y %k4O=.Ю+ AiutRy<ptYݰa*HJ Q'H>}iAk)6 oQi 8N(UOIOe{*lcuE+x5xp/eC>㪎Mz$>Z˱qӐ%֎em z.,JFP0 =O!Ȏ}^=zWᚠZJfM\@zNX%TF%{($ȶ6 ͨr m峼u@flP/N_" a_HfP+'}5~lMQ^潙ڊSxml'7mZB@{U#dp]ūr g_qgXy}]dͫFiw<Q؉˪]Aڴ9ءP>$گ]olUA$B$"/j>FuuRaVC^{rI#t@.jˍOo+vFsTMƫ¾ 5x$|-kg}BS4`D cohhHy,k,sb#vy6oDLQ,޷H:&>V7k ~YQCJ^fHxp{%74H.| xf~*g/ 2kOo());Ur#b@QwX!׏qA ^Ǚb7ߨ(3@XuIUHJA/]i`ZD!"F.O7{xyےY71z)x'1M%>P ~*@&(w3(yғwݒvbtxY"1ޫT.%^ #qp8cwb@S8gϨw2loGU= i!fZ$laRί kI(^abؓ&{hl~M9Wsģ #7͍dB:lgGDAɴ;Ob 5{_ 0Q⎑ƤֶpĻ$*"!T@-J&HZan)Dbw!Bv~*N2WުUӑEZόI].}s<>Yƺ2WPkbҴ댺-R?V)+m-Ҳ,#,.؏0߼U4VN3J69$SӂҝBnz#|YNZ=D†t3 w{ S4Ǟİ.o-I &;6jJ~h<;Dck E35 CQ.Ǻjt1 *I&nsuW(ZًWQp٣˪4r9Z(dۇb|^dEC 4J R NDw +0B$nNSvyO&.v"ʋ ',)Ъ4+>@̑>.5 yWaVΆnF[Xw"*1>jm&Pͬ{џ8pg+ EЯ>}|kk|U e Z}vg{ +8|pA{DtA_!uU[aZvel^D/,4|<'Nէ*ӟ=$/gkKgqEޡ`j)4 AJI7K;(qͯA̎Ρ=e$魯N,A/5=҂E'Ȓg}mѵY#0O+o8J@ؽ4hb į& ȜҘB4JeE 4U%/Ay\WD`dm91njŪۥ#JGJDU|a 4wИ(^8ӡE@JQ[eڟO7Zp2,Z: EwXͱ76W>ײY3 a;V1 4PK pk*U1U]#3`WL@{Bi?8?*GNYd7zE +J=&7đVh6 ^㻀~ ͬuNf`#O^Ey[{d<iXzU*\DcreN Cdjp'zv;$ 05lt=[2*ZeװngxƢ`ӞBYM[e۶{Cľ`mީmAoaɿwg,\u峒ʮ);ثZ۶㐹3ܚʧ4) ^ѻl7-kRW3岬8gѠ.Eע_9 z5pVNӃI!\5%LpXM.8ACh 7jϔU9h|GZ3 dQA2u -)0 5ɼޝQF7U&"c!o C'āVuN洮=o3F7)@`8sTs뜍}qSM*acy(/e,?87Y"Z +Ej_8XL[ϐkX߱IH2sOuPW㴶xN9$x}Qj*@5nLh~ܞbDM".xPNLJ.)nN,w2MPʼ*~fXt={J{!Za)ۜ=+c6E%pTkg$jn s@e3GTD }*(؂XgC-dx-3膀[H( A((!BGIFvgkV".fe%9b&e?(9m'sIO0z+1ѡ pxbeQ"/IaRlpm>MPXmKsq*ZOu+dmKr{"3M dVs2` w$u`J:r ف[X|x Rl1m#Hoۂ 8`㯯֎>J8EQ|L}:q?i%tb !GBSgV8pǟ:1H*QJx[7FR}x+G|E?:NZ[I@\زP3WS-QU-#O?L&Ǵɂ?-+ 8);% =i#}-JN}2~?H-AJiOšKmQ c$Bja}c)A_A fM]7h9 ,hvzJO% bb`('dpcux+|V\~K+a@il UKBC]"h^Q]Dgkti$yM9DD2Svdsx;qɣǷ4])-zls}&!~ߏ6NvU{dk(=$g|iLx 988]7\$+hjݤ 6VV(S%+(֥& .*{f6*fAII:Z&O#^C }ˤ.rd2 ڀ@O;&,$B%#(B84=BCls1)xa4bKWT/$Jt}C/t 1v r$UB#0vn;Ğkf NsEuY \Kl{x+DbLp./; bw8/6tp'ySРBB]JcΪn&[?RwW  C{:.,Lj3ꤨvy4sqcT~=U]He <}A> y'w -Is(~(S(+yMN~Qy -]nߙ PjJiCWKå ٺ?s'X/K:ylF_vlȺ)xK Cn#e_)0Q_KX+(Ϯn/̩βMRI$+%B:c|UPO tMmݲƋa_ῦoOБ~&7i쬎zĐs/. T1vQ~Sc;i`WvlP<otMWvp@8PO;<4-V/&~KWRMrYC} NT}912JYY(g,H g",ڏՠ$;M>M~30_h QAp}omzů2'^dK` ܺbN<4 x\V JB HC&ɉ|C}ȍahg{?3\V$g6{Q %)UDKF)jHauQNzI&5'7+Et0OClx4C\Fks3'ȊPo"@d~rSC-̴{(_Qz1\|o`ƗFg[?7Y<26晁%8Y^K!dHsޘquxQdOZ9q~ N~yR LhxT_3Ke!<貹o ё3({]po† X9%:(eeVbZuπQMX4LXZUJ:+KD93cܽ}&]IQG*G1Y-sLK~cb<޽2~jRv=|b 8~DVpΐmj_A/=/B_?X5d[j "rIW~ v+G4,<Ó1v`Yz~WzIjLz1bO|W"=o"# L4j#ήkQURлoG*-;lᐒd,X<EdG]0;/gٓb0UpZ0ɮMХ^5v5Rz+\l[h(J'<ܐrsVT@@8f#8%,x]tX,t#Nñ#[BK !8hD-hr(؜yR\"qYE1Dia';"EkgGZI!*A%cK).e2|}G9sxsTDt>{@VRs2$g"[஻(IZh/+?d#Fgjkoh֦KIooHjmL vy$ Q%-n`Bi۵nh6VcJ7-bOٕL 5OSSnf'1Q:@ݱuPS# p_ жmK:,-eLS 4QQ!P7%j| /*𫥛Uj(^Fx[)^-r'x,F%[tnv"] ڑIkv|+s@|[\ѳv"NڀVݺ'DЕ٫ͯl$+yax;.V4IY.*Dtŷv 3{h8=D ?;¸<86A,'M\sJZ )}A<8y??/#tQηVAx`k6`_ILM=cO051j^,ͅt2cGfU\j3&𮩗kW77|tϯU| 'Q4jIL ч]DHN(̳D[.*ҽ513 y$ŒK;Si~JaL#dO%1n;L[^ <}_#UPKpjB?J˛\c @HOG2P3ߧx,9Q?|]I > Q,g#\%m_&>g.?)Bj{ea}J}(M'a%\kkG\Ooй#g- +$g2ˍ[^eȔmcp]I۪,WE:g&IFF7qRĦQҚ^wi=⍒gmO6j_5^'jgw|yt7ܑw%3nE|qq7CVZ qnH^׃nlr_rBY=0mvţ7/:L {kn5\ꘁW=qN-iQ*\bTmr#0v3DNEv0h>Rf;+szT 0#ՠv^Oe;-P~2@5Q?'44]jMLJ6}&=c} *9ʝ ZQVHhq] \mD[r"̧Et 2He"*V{x5^ٷpyiy&U6@\WM|ZZZjg%'[XW;HOW9HQ7o\*e# l;k ǹ]o) n lg.YyydT6{к4N {xnGɔJ3gQjStS=Ɉu::tF*M1;#θC//+RyU+r6XO}|ygZH(Qjo ; c}fŶa)UeJt ~\eCݵ铲& q0qε`ӜB@);3PbB`5 |j:!,GcF"X`>#鮯Nj{37~Ŵ Ȋz0}=y q?AX5bQ.&Nvq 'hN˄RJnoJHSghM&c!Z⸠A8t1}(xV`rn'_ Umǭdw89&K3H!>w1)1(!{yD"&>.8B`@:)w߲%ӛ>&4 pNq0d5iP*>*k_i,u)Ct0h+>F@%`TE>d1vO5~ p?D,QXnn4ଢ଼gZեGon!Q26v,w\ bsʸx=|+ϟR?oeo?o}[{=|'>}[?@?ٳr}:gT kw%(vv?ᾧi/}Uvs}%?o@؟}]J3{ &Pʪ SS+O׵36U W&ŧ'UhٱּY .nu{$ɞ .ř Bh篃D$Z#ȔݷZ, ˿A3X֖ьLgh)U=ψ UTi ttD>Hņ;X;W֯NGg_1FZ!F){bPD3I*/{Џ`?}jJ|zbCi>{#81g:˜B;cvY%b-*̓|w[&}m/i߯i Imf{q YǠҋeH1:_v1W3}vEuɰy'CGszJNj"jҹ!~y׸, v\Xe_l#W-y-WS~ܥ C rxqU΢mB3 3"$-9R´W=tIS)@pkmmP훤^d7& (^3+QXvD/~ʜP榕m!:u# :mp8FD'W#[?e'5w݄-cyB I ]`C6fxt ><6~MEeI4'XMـ*9 ̩a|_b,g3 ?s w Mkj^b/7r#P_t6! d6Td^2)rܢ~gֶLz;WwzoC>^/ ui-eI!i*eɛmuas)+yvgMr4iZN~i~ []6^v5hI]Ux^WձI|pH׷:乐-l?SE`u=[ Qq'UeьpEcX_ŏancNat< ;!m/?dn1\7%Ͻ _%JiI8~kl0@uKܯԓQA$^m26cNC FD)7 Gj~}T,]uUJڎdWDSv.=+"_}\$R,C"Ȝ*g"C)ޯnt/ qX8G[Fye)ӥטV" (g ę6P\+*EV>+C,[D'ڋ+2$3#"yV@xRcvxaڡ4{QY]"mW]q@{( %Q8Wϳ065^rBU$巒z̎Yb(IiY"wP7prՠ⻌RI.`Xoմ֋Hd%Mf-os"/W3]W7"Lkӆ`Syq4$j1[n3]bؔ3<1y8x06R8yW(u_#U>!VlH ᏤRbRl~dh>e*JibHWOS ~}j!a?4xaqk:R[ appS S,N>ۀy\W82:ybɫB|[@^a=$5b5gb}+1ZtQ~FǩDfQ5$aeCĐGxOr.Õs 5/e]MZ, +W!?'B>E,;hkǒ!-_oc,VSx718 -Wh?uȅ[^?Pk/ xѨ=}-Ikα!E{6Z_6j66|PT ɽBJM=<IEջZ78]]@|9 vGGctY3LbhFzQ:N}y㨟? QYbBgӾE/e]Yh5-Akޅ108Fc)QR^ /* vPֻ0'kZ<]inOflbAobNLyg@)AɼC$rݜ`S&2nTMX7?1=j\͈[p1f;XqFCjs̉_S 6H8veLKB_`GOB٦T>wp0W[7T suӈ;m}F7QDYA-x]󥙷Y`tM_'%XTK4H#yoL$ w9_Hd*%5̖EՖ b`ˆf_yaty e~eΛ_'F`[sֽ.J4j;0ZenןzibZoVҕf1Av 55v{@5 d'Wv|E} 4s ;IB)si^H?^<\KpV^ 1Tڰ8wJld^4W.|Q{Hۮh`ZI0z5K}A/ڕnMPCH.kHM!.~[ T&W}~j:v $Kk#@ߗ D4#(kn/g*\I l(g!j!npjKصyjJ?vR"cP!]읩gDFT-hG6/8-՚]#3S0NScPɶDTB XDؽZ+Bf 2s?'NHt5§| %s}g k3qmx%`9 Z>bqѰ##s+rKGa0R m|bLs0pFe1#kpR"0å&{(8po.]W./b>pG8Ǭ¥RmD4e:Jh)'w[{?,ؑoz&gB̮%TAC,>&uwﲦ0kQ;i?_HÎo$P%  ƹLԨcqa8^ )3:I'TAs*ק{ĺ^/|b#>p#]&O{M'U@Z cA+:a%}NB("fOw e_| ,y'nXd:ȇ3`%31Q/3" "ԆXH2zbX%llb౛@R )E%hPqN!9Sr.[8֪B@ L@ <: ,!':ש Xl_VYQzwA~W3=%E۶| aeiw۶y2- v s؃:^6yf)Yɡ;$Rf!.C[m)j3mg=k$nP[.i'8DyEmǨ5/Ц4,LFv;BeYJegŽA9lQ{Ihi!f?&Rda{R)׉C0_898 _ iWz8udú>Erѵ[]\Jihƚ1I :ZY ĵDv >mNֽQF_*M[ͫv^' RimkΤ>-YL!D(vKƞ!N?0 tӲfdk8x qȤ[܈:LjJW|AɈOc-<1Ю65a R6< țsW }] d+'1~β7قciw`?[%C+2II|09s+ a';`4)u:MUrN5=E sjy+y<㿠agVvIJT12<ʳ =1_isyΨ~UDr$Dmyr'WU>>xһ1}Ÿ)An]>yrz,aȖI]tQ(lfQz0mEg4fcOXȫV _4Qv.qqA^/og},lfO*!B6/t/+" `e׮.B@'E<aA .,hPUҮHh-妴~`dEkuŬA猹r9Ui҃_aVt"v,GV9NcAKw1ߦs^@a>5&>ŧ3|E1YUEVFeA1q*m%  4bh6'@LWM$^? bi5ܪFיs(́G3VWЌ lI_S?NM|zƷ%'Fft"ߤI6F21iF=6(|Vg A?GH>w`;%+u? M/;鬞I؉o(~m&F3ەlGSgmk_d]/ApS6#0K&u-K$<8".]|6WKS?7RS$wf9^ΨS9;\tS_ Q ɯ̚SBdcP{F|\^EVHde? _0 DAf&<7\id60LM#0c Tr Hf!M8>̏D!lׅlvƎpR(qotj _/ {R0XHP3ߘyQ)b*!>&E9W*?U&ۼ>t۷ sZ㌵~vgH/I/_WW*ŷ_eՅO9/&|nY$=51 nj՚o?wD+S gQ C=mAN^ŸI_^܎ԕC XHEb{0}zH򀉌N0R6PVq|!քt2@҆oPPME@-9fܢ$WAZбL#n*d]T2pqMT-cB6p*`S5XQo} ѥWr^@t~Ä1ktA* 8_nq>G S>xh:E|;$}ܩfBZ'p԰7+{:xBHjs'O]4`lJgіf\ D"\ ]t9T mNec/6|:0R&uD:Mٺ}=uɵDvcz؀n5p c3AJ =sFVlBSLL$hQ< sJe6/7.eSF?/q'4 TLS ۭ'lr۪b1Yi7zszt!CF[Kϙ&RRmAȵBnoLm B)Am>f&yAw0&_=*#@} l-ZU޳I-QrW25@pЇELzMDX䢗۾PJz`K;? 3W \Vefs /4A{T/8hp/ڋAҸז-21Wt!^k:A n Y 5ވdB ߽-ziT.SFI7Q岻΅MLٶڠ\鎷 7O9B94Rʼn0$I+/t"x-]>/H Ҩ4x³F\)W{dqJ_A3O|SM]y<4>6(¹#h FђM]IW)y%'00`pϮ]nJS{, 6&2vJ G0mB`qAť(y^1NnIPcgRL<ؤ r{2{)(enkZ6cnJ?jUg & HyZrb=>R[ln)5@YI=3f, SF-ID}R8J'\JXәL80E}hz7!a(.@-ۗzvڄaK+.#t;iE9駶ͣ`  PJ0q[?n"Ȳ}Ni''3,xjZ"J)) ]بH G7Y[(;ߺ+8n&&'2 t'!՚hl`ꓢ߻2iK!;|gۢ౷FҪGãGovgT,9vvo!1ڡ$dbYZrpA>tn5#gh8tIB>uY}at8PfI Q7b$$ 4 K"x$3|'r@$rԏmInEڌi>"^13 fB&y~Ȯ)M,w]{>dUX)h{ԉyR[, LqG_˥T){׀! o1 +y b(g٫yvg@7c <)lQ0̾Hl/2#Xc7aZ/qUy51^i`?zmllAѨlf})%w']n`@rE_7 eE_U?DNcr)9yLd)nrKh.LƩv|IA`#SۮH2Hk(-g<J! 9djޠ KoOu/V.yQMGuⲝ cY?]=ylO2߯ FAZU0sFf2Fܬw <5碬uW) ((t#&'AK$ O 'v96M{{ZuНHcn\11T#iw_a:Xہ'AB\೬pK`@xH%륞h!+ @` 1Ԫ#(I$zLZ,aҸg- y /9ILIV{6T[D//;.D<1":kG׬7"kԂyj$90SZd}#QwX1Tu6{\˜#]-;VIGh5r%\u^,xE~ ~n>;LFF%~y3|r.3j1Kr;53OЕ]<{x Wf2/uQyog o)?IZC?;kFs>ٶYdp [b #G(`3DT['xȱ0ţ jbA5p!/`A#ƻxÝ^j#dy4BH/e.uÒgfD}D_jh6.[iEw,/'IbX݈d_xX5L sZ֤xT F%bWY&4jU1Өi^CyLJ>_;1 qm9">wЎ΀4gݤз@ rߦ fB+\eT ̫8*!?lχHէ )uT\#|gk룲D `k(vyW3Eꂳ1:AR!{L*`6m 肣"1!R<cb'i +Ol۳m|FO )AuMrEBb0PÌڂbwk=_vB9uQ)_XOK*(ˤZ wAR< &\? 17-i5Fؔ{<16_3}+'XXArpG!2>X?Ӹ<^ ڷUݿAl^&t)7]##֤1,3;8oU%?Pf;&%[>/ݷ*tF:kKԈI">t(niI(<%<͓ q3*m y\w:!C{~tB~<ٕ ̃ &~Aet`-HeeEDH/J;s(@A"bQ++^X1z6@CG~`tVhy$gDiWR[7ЧZTze\ Ϫj>q!j-aє ykBF'IM7_YF[){j5[uQuX'_Kƣ8 ?ӔrKEMHUx..݆pˏa~}Jցjpm+6JR_FlH↏Y1Z0 eF#Ы Ϣ]9=g{ )M*Ʉ;]O9Z|xY`I8,D1b'|Ǿ懢x{KxYmކF7$CdA_fgA0CAr:*5`J/f6*a}XUz'OAq Zl?)1 I@,w- c?"_o# 8i6=ҖTAL\xOx>b_ige&WՉ\NYuv݀X-nKf0]цW0`MG~ MKEW&lbIP~?;YX)b۰5LTNKQ`3`5,b4o_7!>*bn" [舘:!Qz&Qt< > wj$f715v75Z-z.N:W ;KtU7M=Zq Jlv)qXzMp*/Giuš:=I$]|x SAt> (QC}q{)vKzͽ%fȌFLzߒI>gWiLjl"_bȔyW׷j ɁN (764$hS+8א$\hq،(x?i볿n\# EF$ l`qZJGrf;1U3KG|lq)W4ں7ǗZ_ļ܈}H nIulLh"M"lnx^hav];Fie#Ilt"m\)EF>X/塤PF`!#c NeQZm钲/^ rSK I0o#K)hMF5 b)>]x@  07|O3kD㈠IlNO/qQ\ aDתI~P&<~uC\߈G @*h5I -ꢇpw˿4RcḳJjpl3(WIMlʳB6,$ll!e&'4tokb#b]sr-N&l5gs R&O>"O$ܘrkDr v܌jܘX.h~'P3f4=-!S9ه^&)qzpdwZMF93@p_~A< @Eq'*pݵVfMf4AL 9MU7GhO~.;[or3g:A q/r QzƋﶒtycP=TTKn27]8aN1^/e@=thx4,_(q 'Aqbk "!4<fS&$l>q񃧯TȞ?UydPWN\m JۖKu5c`UI5#&nF ²<(cz_Z ¾9^dkz]nur9Np)\^G6.$2ſ}''ur(7ߚN6y!j ?M43JSI4=L=P5ZRZ|A5xAxH,hI8oa|E7_M W ,SzcB)e;=oiwݟ dܾkmfiG(mԞ6t2ij>4?齃rzSMojs}yU@7djPNgp:QDƹT`s`PpQϠgMGWw$ ePz1aO mkc#zG-EIrtIW1VȚ6t{铭 w%oM>"an{zR(PHZ7*0d6dXO )WڗPzPc5%榳|HU+{XdQD;TW@|]#q-3:=IÚ/;w)hv4OӣTU=eR5r|. &7#zl{ki:.h*߱Qe~ֺD.*CvY9aXSǟz))5+5f#rfW^_qQ 'fDh,fm[`ɫFcn3pQ?!?RYxZm;ïQ\ݤ.A$)CE@4ߓ",ZVpxg .!zpcdQI}T aʦc\d4%(ώ{L.&"'7iuuB?-s~pJYՋjZW5`2`@#`AVhpm#ɡ|^Q<#=FYWĄNmS%vlf)'T %^oáYh Tcp1uV@Q7/BqiDfr+D{(QlH`w6ziAQ6YHnUNhut.^t xMx}d\h+M4H/9Z۪9Y`u;0>㋚?:s&lκ*QzQCdق_ ;[eG 3`+,ZwD<:r ,2tm~R>t8 2Bpƒ^`PJs!IR%e,FιЖX).2ʙ_oHgw(Q@3z!czpU5 .">!xKkmpr?AO3Ś$]l*2WvgL(,VЀn壮-:})-LK)usGxUcu|ǩv{Hu v a}/~shLHyPf -s(ҀiK 4@I@?lDd@jw! ߪ'/Ru' eZ nK})Py>f]UYPOvt8p(B:?GU2H,l^ûf?fԖ%e#dw}~2qLm USO-fq0ɲNh.aQԥLnI[6{xwt=iV,Ǫk}- C '>師p{E;!6 8k:! d=IpA=H#-;RֺueMRհńu_!dA"}ƺev_g`l{K^sg~Dc\<*rƚCtos'XtʟӱqPݡ+vyc k+nOK Бi{e/gvB_WEPG~?Lhq: b{Oh;Jv>I+ob,-g#Qe h6W x_tZp5Kb[N"!iiC s&is`7J0}ԲZNJ{JQl-kU2ԫ3"+e-HEP3AMYm&2+.fsqV-^1?FEQPg}2Iɑa5:gl4 Q`NOo {θkG0&vUtʏ d _Ar5îg,c,ú!5Wˏ| b@]Q!Kf^^g?ejml[]x1h3'|qX[ocR5Lnt8OǿlA$w _oD p0Lo 7x=0衼\Aw"īɀ*mw}x?G4{OP 1h}zd*/jP@˂G ?ӑl"ݺd}n`+XoG0IE>n%cv#M9jTqEGk=]F~m`V9 @¯f>!CsYSU!^D<݀[3h  8L=4bq9dL[xJ$cErexPzHlرx; d}AG)A&Rx42#|ӻM{XGN%j^ܕtȦ\ELckqґ*aHЋew:οwmu&\[H&-Kn4Shh?cTYZTf]dBNuMٴRPl&D튀ROf^AI */-1>HefG P`)L-|7;IahczSl uCݽ5)_|[ߨ!xؤZ#_\v 6w.60E"y06 +1Oi6zp}`"J|>MA+2o8*DϨ?ua * 4:}CzX\]bxyw]Cfn2My_1])Rqq3:5gA2B kڐ̡Q{ØߙNC}|Œi θ 1w,-3ɴWCˤ#/;BB,̆or;>o!WU6ecp0lCB/LD7 ];X 3 sH4*B;`o1VDC5hq_W ;D;&uumr?.{LWMY⻄/,*7:hcڍPYOd9'Wݣ`dK^!%eXG(+On8J轟rRb@Z }M* pOjQ&Iy'$Ȕϩ/iJq[o"K(#umHB40nc!@$jVm3d*tyB蹳,<4>=E$YTCJS,'goӭ;#I|it,:]Y Gp{y^7ܒS\A_zp Ł CU [@1_cnl8u?qA!Q .mpX ,(WI}գtY[70D.mY U_J9AT姓,MNSQ=8?G 7+'d낟E^#[NřB`ŹOďmʹ(W%q7p^ݎV-IHc $\BY<:%Gn$7q|ϒ~Mz[͓Y=MZbi@Sy?ˆ XI7*m /tkQH{>۫ߟTL.Vkg*[GڭKqhj ?X̉b*$ {JrqENom1qd 7_d\iʻOë* XPNRc^/)BHs\vqՄ̀smq-Y<SL<E ŝ4t^)O}7tDg@io0Y]c}WvN;m GazHA\ªC/F LcLg+<WW3Y5dC;8gM* +ӨLk?9do]w"߆W|QV7n*Ep|;I$q;lL [5#䬒R˴&Ka\Y(\kcNoMֈ#G0m87P l01(LJj~]b4F#ax !C[&=);ʧaØF~0t)<Y~߀—\nFgT9a)Y2nj[YzhDpw^caQMY'c7.F*EMO;%08'ݸ~-C$X׶I~=Ii卡[YXxXg{-|֜TҎ0!y_v.:DYvVof"F-g~)?B6*z؏B(SPh0b?<1å/J;z/F7MUhK%>,4Fmogk:`w,)ָN.Ι%&/SUk~ hjɴJ!6hַ'3lj4p&^j cI%xTtMU1Y(sBk~_M}"/^Iɸnf5əZI&}Wddq]̽jZ*fq{ZwkλfrqR6}Uy?0+JP oMQ&IZ:(Mry+aE%ݑ' }w)] 6%k=m%L٩ߎ,97x[l֬kΎ/)@Q+[-ZvYNju魹QG4UԠO5wnlQݽ5vDpA['HO [ >eX Z)4^}sOjK.VY}&#e6[ mNeDç[JJ٬JlLR[.0'YMs{ id;ô%I\HvwFճ`3,K@!*"oa( ]=H5]'{ TY J*+q^b6IĖ-О \,ؗWi|]ۢ/s S|݁& ߑ;Wb=?JO<⠡ڪ:H~Vҽ<ShF(Hn47]`{JVcvogE9.@?:N=WBn|Pa׺f;%!LA=u$3n<%}#T96g.?OQE;rvP@^$ |pŅCkPb>Kl/@.tj- XX[dDnͥ ƯD̅#t!ץ"j&ID~ /xA*Y- U.Mridp6i?r;E n9z@EY䢯^/kY:X~g(*Sx͙줁K#)pAg_bj݁70   A&Rlv{+q7J mO`{uF B,i<@mp.HX*on~פcp1ysʂ1 8Mie#[[m)%8ܰ Pj)f'N8vGT/VZa5ZcY-wD*HQ"TX)C[5Xݟ`$il"<i&fڢȨ8òFD=6*Vj3l|ķ:ԛ̧>XĶ}0au1 UCuV0Ђ'SJbZݟyLzO!hQ{VMH-a{[ Wknt"=u;ǣ%ƽtf}9=\XaAҡQ0;Rԩw[9ާ;f2h6TB[1 g&]Ԁ7Q{v]X\t\*O+pr]5Qo*h3e"~IioѼĔ`gJx\f` RE7 oZ0M lCRu[K#ҀpXź[wqu :t.\"!Kb<iv&|9~IRՏ?W_hBW`kK*Aݍd̶tj1;*X~D>$E9s_BImހ B O`CP;4-saPٸhi[IX՜3D <{-eS(j>La54 I2xJ M_=¥B 'NW~/4s7b 5^BzZ>grkmx#&8BRDY]48Y~ ql{ol.}c/wY(8Oj? ږ'v}`S!Fix`!*X%qrxӟUJ@X~[ݾw F(}]sELzӽhAZQҮ8ӎgw5HE} i ේ6O_q0_986 X/4 ,e%³,ly}}|~D-+0-ҡlS ؆Ub-]EE0Km|-· l<`5J8 CXj+PAڬ3W -y <.^¶, `?Q-3dp ؗ盦tB> ZVܕ4EaIeJ 6"bR RpP;uUC();m:IgphHָ6p[>hCGhaeBaÿy@s!pjAdK0WF`$/88cTpdI&ҹUpSg)0x:Rݜʫ%Pw-OF(f/gB[V1t {&FT⍮n& w@gϔ'Ub-Jmd|6<0ֻoGrfxETtM~5.s^Ml9R[):.GEpJb0y*;5mcCG^dt'n;hkTYT䰇+-?Rc+F?, JCFn[v &)`G [\"+#"#RR/5JN Ϲ&Fu%B#a|6Qi)Dk5.r3΀{VmC?]SvIs˿ʓ0τu2]Ϸkk:yCUAQfp}AӪdS>0!ZoJDMVBqjcZAs Gڦ1(д.@Y@64ןvwz!qLË"h\D/G*BeA]dfȹ<E@&E"CWCS͉;B\a'_2g1ܖNͱӝ#Cp6IN}]_mW}]~Fog_Wfw7>}{Ǎ8_Um]{^KvWg߫~SUuU\_|SﶴGޟ?og>SYV8O89K~D0x3ʔ?%_=B/VӃEό[r`( ;ڶ n54xwd{KxLX'w6nlvuӕb, YL㈹ˮX59hrÝ^(66n.at%xG^ב1c4^?x8B1~8!n Xqde>X0l9uE=N]NLBսP2[xZ-L *˅Wj`?]gA:,I|W$w~e.2zej2]UiXR3]f# Yx ;Ħ Ѐg+rۤ#pMy @MCڶ?Snj탐 sFn]e{n-*Q` Z%&=m RE=e׆U(=v4]ߚKV8}weyTJv 3J~o&9Y@\ٵc_o)˜Z6}!kHBMYnPӠzj'tj*#.In_b I+ f Jg̹ G4}F/ܐ*JGCT~geGd^%$yn}R 4`%/Kibܯ->o7ՌN5KDӋav3k6L }\h Bdr]^7C~#n1<G>z J_|sFGփv^e[)ϲ"]~ znAjJ}F)ÚYe5)Qeb.VI[z  WFzNIGeY3† ả\6Ft!c}ܶ&iޒ=vTp!v|gR,,DS|kYŭl[[)hk5^ן[EsIR?Wr.ܢfa{78?YCc9G;~T+lKsa*'z`}P_џT)Ky9Tt)g&f,!_"a+MWtlsY`{X% ըև@ ;",nKz{?ay6DҚ;~hN'U ;n"kZ/_|FKυ֚8vBFh?U1f5w HuR86<\ULILU!3maoQ/5q_~qD.HfΓ:2.3/>{--rR3 X_UOsS,;{0KR| .xٳL/Gvl+rsu]V#em$vdްΜwh֛63CY0E&%eI*|Ml@Dj i[ fnBc(^E)!_48P} JIfsY ^z@ T7(233IdBX E+[,Ie;xώR촄ԵȎJ 2\Yq-\-%|zZ% K0ptn Kq \ޑKI5c6Qb`@gmJORG0zPdUZe';_ O/lL/>(4kqe UhPrH-aZ#焢CW'DCAzKLkzNJ7'pMMzybK>$)M&|lG?P&6i{FĪfu3[m4m|A=Syާl/]+Uk(ԚډKo%nVG0%[k Z {Kq K]  85fK[V`OĤDOca*FĪ.;5Ӝ,!G[>߆t#Bqɩ'd?BI;Xic[wٺ 5f9MG>I,ˮMkj 8lT|0Yqi$[I'%WҚ}JǴ]g0aw+'=!9Sl”@nvEi,Q;1,pQQ _M:J ׏m>Ɖ,*ia#|L?ѿr:]+9XO|Fٻh4={/XL}f&TX6bvD_8kem.!pڞH_B\0hsGӚ9Ej&׎=+wPZthN ex]&3Pِ0AΪVt(eEC=W2B+m'+N~1)4ŠDiѫ7.y a&q|FhT+ᧅM`ʄhCȞac =)*g.WW]ϼ}AChDS)u]1M#T׊|g𪲡",cT 3V"j~YUv ]fF\l.XKc륩YS l*Tvgvv[pFI(.nQ|?oP1.C`>%Kn>c67DID'[7h1izV㧻zB&3t!5BMRiAaȼ+ eRtFxθ vA Ȍ:T=IF+6*9}i8e/^Qn;c57swV\QP"iI/یvDq8שFv U6kΑ;Gӯ/t UeJW2*]CP穷רtZS;)Z۹ ϦW=vC 1QCAV +sZoA`8Tg\]Yn}?R.~d aaYMG`(YJo!?(%M7B7i'uyAE.YѱiM)R1`++S hcM KhtT&E*K3OC?[Z-(ޝ,Lj0eO.k^?PDTڳ(ЋnQ q˾夙|^̑AՍ+\=rBƜn٥ &~námkÁ[Iqz+r&ط`p8hXj|1 <&K{yM_.4mce 4unQ}텃v֨*lt2Փs :nɗX4{t`j< | 例$`@J!oBDՇ 'iC~j=)ah`+Lv|z+z5:C1?^="U(1}\7YhSUV  6l|kӎO+B*IMJVQ!!SjUR׆zuAO dlV˜*5rFoH8anjvJ {bj/,Bu4Zq}5ǿ"n`<)uoW`b6FބyM;[bƁg!S2"}wר7Vuܙ`#|a ^ERIE)?*`e ޢ[Ж %"x7Asemav+Ndo(\lo(ƶdeVviK"[LE}KxrLGT]~B:;SY2"tZMPVytkf.4v<_A ՚9FWNa>ޙa],+CƋ̜&їA*M;5,T,q+a쏲:LmM晌.Nդ"k`$Ԥ+6K})k˖'' V9<,w KAҩͥDeNo"[1PN{ǁI].-ZX`҉H?.2DNA|&H-g &i~b3o!e+2B&UHXH?ps9o ff/i䃂4뺙Ȫ3q#|v I\pid @8_bB &}<ҵ%b{\XUq^-Z#&_pgRAG+’t*PA<5ϝ̃>)8^ɒchaη^˂]$NMIʝfC׵ǼC:rZ5# uEe4AGAÏI}I<_:LUgM(|]PWq)A]7j ٻE5^zUD C9+ŽE Kl P\UiXqK?o3=̜;0AFm ҕ/}:גɺUp,jTz!nG̢t+ܨbր6mspXB#L ,JV9rw6zg]@X#L4˪vj)-p?к-gQm 7y6Fy-:WĊXNBI DXtmgo$;וԧN?Cpmܷ_?-69Vڙ[փ/~#w qI(PW mIX?CJt0n!;oSҏ?t@pܞO v0?YX7g̈*-|_6 `6W%϶. DX ĚdE|}qƣ۟9?_ÛBi0'V29Ba+jm:)LQ%bwM6y#d3Vb#xTlEV7>>@>Nڛ(͡ HM0rSR5'[>R_:|Yߛt3v{QΧ>lu+ 68| ZNm5ף51[-|OJJAp*+km)g:Bacsq1f, 8/)(& )r.HKF%񞷲`α)ꬭ&~HKJ0#7<$<ľk륌X8 ތ8::ʶ:_3O/ˈ'mԔge~8[#@u?/qӶ#7#oh@ё wL5V n6誄M"?ꎢL,6|Z­}%* $::~ɋ "&{<Ȩ*(qo2-Z9bQ5q\0~պ)*立ZZ7ؿe`-m^KX껸 ӹ4=A'a5%NaNd)3 :%f[epY_czu,tO6XKkY*jp&|3LZ/ jXJ'qQϥЃd䘥c0z[lܷ}i흡 %S%Ju]o)g퍂0uyդXnȎzCZ>^u 'Kۄ^uCĞ fP`b IfyU!b5;?EhoMU~d#&9a2HJDZ4wB#7i|[NM/Hד֥v[;hoB4즼*o'T?6//HnIԟj]Xn<.fPcq$Tǰ|:H=)sҔڅX['<}xVr!sn4CO3L*SoOR):2D8[C&ej&vnvcwܾ#TZlmRc2Wv$qfg26q~fREx*2jtK-n"1*dS-v Dcwu8c iPxJ/)EOP7d:5@\AFt[]dle?cUj+Yҕi >OXo<. L洆#JK wt[pځ"#3P Z/d%i׺%xG7bb_e|dlmu#vBmZ;MmW Y:J*!oG0u6O-YZ(ⶁ5k˿1;^͕KR|GJg `R* 6XlHOhf(B?z{9DqV ΂y2WVi|RAډ+òĵqX?tp)$0H<p(C(o~|L.o9cYgtڼNnE@ 8Nڭ`ړqBplbۜ+̀@Fi8[`J /z^$HPA DcPRcآ+ok .uVe ;W%e_/= 4$@P4ʠ<jS-%r§Ҕ4DHbϼ4kpܙn3< R6eZSV8pAK /K5l9vÆO\ܭǬ3wmSv&;ZŠ8YPYD?$Xh_ Gq} ޑ? %O칽qiK闠zb$)* 8ufA;SBN!/WX5S&'i5o0rVh{R׵Vb )S,`3ρ]53yGהAp ?9?3pPB.rCh3E%oz1 zH  '*C|-ndz+E0k _8i9YP1T1Fv} V')=aʾf1֊P9,' npaWd6_r-qr X Xb648 9-m2wsd<AJTUZKHA9[R3}OJlpkQ:!=ǓRMwf_ZkS}ABM1=>3i(?oXɀS K>0BBwSmU{Ѥe;HpX&@ 7+oá#L`p@mLp]UcǒK(QgFB$)dL gfb֐Q1*t! Hɺr4{mxL%YId^I` ?g0&% B79XG S]d~&2"sju)$xY>Gߊ\$s҆Кe,0!̚]`Q]B~X&p;tF˰LGuBA[բ1)?הX&?J`#4_O(!^JY KYѐVΈnNpVu0& >E+ED4HX䯰kr3>%i*KK;G) NSӘt$,PH'K˩)h0THܨ67嚎1t5E #wRT J$r r'6ANW7bAm"rFR?t}ò9~DNI'QeԕN}1$R?× p?}@sC,>3#f~!I[<\}#]$Dg )MhBud鶇;7B^fӧTEk־PjUMtbwVTh!BS@B!<^5\rY|{œ  u s߷Ʀ=e;PYKܤq8$8G52#Zc0T+gom{`\ dFKtkB87`$i[ #.HvU=gaQRbsĕ8\7.KJ\݈Ӄr T =KwmCiE58ndЩ\-蔹*#n4 $nf\z(){T^}qfAUAǵ`A\P',5-I4ј˻V`JkD@Ut/u"ÕM Ri$hM{ xZ l #a]iwV9([گ 4.?H:0R` %q_'X,ܯPbc.Nb1b}9LÙGuogc1ȓb/t.Ip w +zìx6ypeotmntnn Ja)ɤ]%gJ'!(Vlv.|д/yƽYӥ ꚵogD:hIŞ0#}]ʓ;Jap !0 VTtjG~3T9y*X)䐍aD8lKCkR҄OX{y`=4.4w\ڇE2o]hœdYP9r.g֥d8`hNbo,1!,/;Ը''p K*e.2C<[pXyMgƭ}!ߋ`}7J"JBfȉPRG؉VM+1˥娿:<]}Հ9տ zܤ{vŕ+f:|X-tI5AaS';u lʣsoW|C W 5I!U2˨lLeUj+N*=&CޙgS6} ߳NH)o^Yk}ck7Ul;ٻuźvo@uWMep`ɑ7;rt9 j%9$>ȴl iR$;;pAz$=~kjq< {\ |lȨK#ܠ362"U]ء'PeE"GAzW^p#x)I.EeC͋)ߝ%_ORG p%^}s<%FXmsӰLk6.2ŸB8g_G! yG.b!!gvuk1QG96 UIؽg.??x EZc?F Ioup3p63vE CzQL #}m6۹Dl@G 7>pj{o_ vuk\Uқ?fk(?U匬$> O 8Z|Z_Hݽ:.|y?5@p &|GͲ8k w'P;qIEd ^/<31JGq@uȻ-^vtQ=]7_kyKJ;ɔ9Sǩ)s3ʉͶo <&=,dִEF1ij GG蓈S#3L%۶OZc@:/63H/" {c}Z|l>uNR.׼_s\ŀlhۨW}ȟKP25Wa.o,^,k. f51f++͍a-x璚ݮ %Cu?"fzԗ'r_M[3˧GDz1s,&PҠ(]N|nX5SURB9 4I;oP҈4Zh5UT-=aYxnՀUuk:>nyt#J%G w(u2_i4Ο@GV^R&"5|MN|dqЕ":˾F@ Џ",@>B fufA}Q72[$+ȬOջD,C}_UDc?M.NZ"0NՀ:er*; 5LO)ILyˆ?i9ϟS^W(;J 0Sk0v O}JhwVqB 4H_纀3k͍K5lLQa6+ nV)Қ>;'bߒe3VU>Llң$DlzA(AC U(xP.)ӃAJJQnK<Z,s6Ӿy츙AuG(>؍)_pdSX&~-!2OBX΄n8Z *4T_d`p2J lƣlJV|V"W(ȂlZte촁e|O{L99ҟyEy ѩV9PBec|*8@]S 7?foXr=3Jͳ5|lkJ"[$/}i,M&@bϖ2AxW1Z^z͘Ip7ϟ7r]? ᣺CO N✎Ov;ڦ4Lߧ4n;d9jLк .,aʾ P Pi\OXVJ~eP4"vArЕdsN"4_u7pDAL6B96ܵk`J O+Xޫ"%mY5PQw+|i䲰0H7:}SE-1bJkإ,7DR}+/{wm h!gaMZb  #!ߤ'yoD6ߗ_w|teVD20dX1*RӞy'~TVNN*}ڕ|.șfqT<.0T=/32Vr2M2![UF%ۢӮ&^"Z 8Mʣ*Xkƺ#_6uLΨ#,"}98,lW?xoVK=Hww]*b~Y?]XKON> 2_ENpg8/pX,8_潧/CJ>S!;zh.>Y^/X ĖWGUR^RLK 2,[3@P3_y*`:b*p8U4Pތh3#|H n%'C'%$u+b7d}>EԮ+i.J3k=-N|Vql Ą~kpݐ7ʜ=lj<+!И7b XVdJV3+$C<\NǖoU8 8YD0Dѭ6GRﱨxCI٥JE lCS e-,n&lK1dY2yzѤYf^k(zZ^O"P:KQ, *Ԃng'o*&exgΞҽho&UFga */G>G}/A 8n*\H,qxZ<6DҊ L߇z:LHJnLT>#'?" '$=dNcbYWX5+ T3qWKuz\$G}Kf )z;̞\ a?x'XWml 3"s'4E{Q~얁gnF/Cƙ%-OT9`MxiY2J-:AJ>ۜzJ*K,?/kǯH֍ jn#&JA@Y̆Mo $Uö"2wE=Wzqqz_#IL^_Vc;Wzȃ8)imd8AdsL$g> <7bv?ol .0[E?\23Ǐ٠a:oXt: z~pMݭfγQ͌f-&"B']b n{dͺ͇F-v/ҋBɮ~mS-ʹExh(fMh)fn1:9u!a yϚfSp/ASG$`b*`aEvVsX bKXwl^r/9-p'嚰`!n',3aD:h0EafnP"- :di2`*Iʻۤ3*k?7m0ƣ #Tծ/Ə _#(cpx;2s<;؆/C09Ot湦Gy3/s$μieozTח!P8vpmh4rC Zt g-\&hNN8 GT$}6= #1e>"읕XF:q2 єrw*@d|#eVhMtf'@C#6k\c-*irD[DX -;h5('_M0H&FᗿvgbyNe%M?3:+dS^Lk(OVoy;iZ%li; 8%H99_D'S2_{ڀcQ? Eю׎ K"U޻ؒ\A!;Gڤ<& 9{p3ǒ!`V8'E -ɧz:މUݾkݦQc)B[%e.[uPMPhKUe3%LR2AH~~I'-4v1StRv}®܏tuSş z?QKBH{+TB;#_:#p$]a!|*υ? ı_ګe HIU 2smn7G@kCїƉqt*)DpbʞrKC.w2ǿM,?mhh;.=>+f7ѮR)yo2IMA&-QmAGG)Fup5<.,X";2{ɕ;8cݗDp_.Kew$,ӏ U3 3Y9֖ǣ\? Y4G^ YX4ܳ0;B%PeD @?}1yRAX_9qlkOeMnS^uŊ $M{`-H(v]i]DGA~/z 8XKdk:m[[ӏp~u~Fru0fh-D L2  Z8+Q$ ..f4>UvٔE_ERd^_sՁ0`;|0֧Jr K"'Eq5öF L{~f `ܵm27Ą#^B~}ޠdP_1xfTj &܎>io(U|_{&5lĶn\!>lj v%>1d^X䔫\^RRI4$_$mD#ʿf&u9/Bv"5@2x沙!XX?[!Ly- ~-Q} #2wPYP,;Xl$`soG}3hskE8?n K~Āfd/@hĴ]bvSDueDfЭk~bs|7(ByCic~VN}e t] [;13)jt\;k?jZS߸Юo4.'vPhmXJ,Z@k3QpEł}D_B,BJ?b#\CTނK @=s)%{0^ÔKvZ 7},ͮh^\Ts!k7kh;CPP d( $_/NgJ*:`c,'w TR"a?~'W%n UDvYz\EۃpJ̪ltCEQq=n=gGa1J0遳{Bt5'-':7]FШP :l+^ץ)O0.jlQՋkЯ_)c$ɓ[*mKVCoaӀ=ԝpnUtʏ=xYֻx4.i<50OpN~د>TZQ;5$*gR/2(ejn2tab/ZYXl[hb9q%mf; ]fɧOSUzEIXX(5 UNV},PHT봖o"O/ c=P˦ͭ/IuMS t8(}X"=_CFKN,K?ѐ R HXqPz`#an.VV?Um{Vb<5[G|_ JeÛ#r[=JA=vg7΁@k6DP({2L PXVݤH.H]J EtvCVy%m|3Igzg`H]߇g>>zwlKReO6 "~U pL1 }qA%ips [<9K{/b~~jaeg>9|s!SJdZ{֞%n6PBwIT]ˍ3LΆ7 k8n*jV,ɭݳ$E)=w_h\n6X?cԴ }Қ9Zg(~R n+,yؒ#^֥QLL*S1 3KHG+ ^nLKm:fCAOnrл,x튍y;^]^4Rv$VnH?kq⶝;,S%W<}5ϐC(Zm)c<;}H-]aknWޛYfv P={=3\сC)Etv!o+D;NC=1-($A0kE&V؈&eC(b@-eB>fM5ǰKBF+ ] X(n~٫&@W-Tc.vaotDM?D*J0~%K^ { G C3o~VEM54AJLeUm[nx34[b s[jeC0V\(`a@Rj=SUwH-Ҧݝ.9ȭdd~m0wjPmF5)5]&!+jRXk]44&d6%_pR+ ЅQb&DOxі5we=fiLCHXz ܸHIlpqZro~ 5rlxdGFs:1?SIFTl|6g$)&c#\y 3촲௹O2ƃUGvS?]ꮿR:WvAzZTBBi JY9"I5` `qE'qX YB$c֍i ih'.)_W<7:ϫF)DA^,xyr`Rc8̊QGD= ~e'>3¦ӠIȡզXwXUXr,z? nVnDr:h㣃@m~FDps^VX!yo9omGlX!wyĮd/XZ$ xac=zk槽[ئ'0w24O xBOn55\ Cv~zoV|OJ*D_[.笉lUL=wѿpM3_I`jh V aO2s~ΜF0~j0:ZȏpZF-ݽuL-6xB|A&׷5ΦWY^IL3&?ڔd19b˨!PzaC]tlpP|>&L#CV 2s' ?@Pes4o(RlmiLez Epu-зճ.~@.@[=oW彨懱oFIO_݆֎Ot(1z비zj (xFڿj4}C4$$;= |$϶:cO6QLٽ`|5#_MdwQ& YdTxjY׆f ?b+w#NV0KC$<ГRsMJD[AϤ}ޣRիgwtՐHuKΈb⶞oC{dxV]Ztc oPP-Ł"Tʗk6՛Ӗtd#yW뮟6wp;[/{\8]Nm4tk;ǜmm#RG')@r8qܨ%i ܡʐ d 1:,mpU/ Ӑ sԋ%٭ &wNyF3/OѺ4]7/2?ܖ&՞ ۖgS>Ch];2/3"OEݻJwYp>B-zrt:? vaYի1f|7ZAV6X3$J"vp00B'ݲo0oڵ'cWŔSk}(n禾B˲ϼ^"GU[vyGRcy.ĎtUQA 5~RCW8'N H?ABL| gw [f9.P3Th ꜯPdp5fP=z^N‚?7 _cK WxzB_kG*EQGs{ A,9EgV5:2^P}Ǻ$A489t01&t[lLљ\o#80.C92cV;|)"M!/%`[In?p")O!8~'O6RB\ꫝ8?Bt ߜl_S&N0Z')-,0iro֛6Z= Q (| TH: e$XXtp"\C 9ۤW'"6A!ȱfoE0쮣0I42"54ft|~`Ъ9[47[q]/M\X{Mv\WK1JqUa_JIYʔ *Û@KK{QlX%2N|b<9̦ erX,<<es$ vٌ h" -x$g{Ia!6DZ0q|CA'2݋kAiӱU T fz<\@2a.h xuR;9\Gga5C$$RAfH.?[ &@2b]0u6"ˍ;(\?XX1"EJg 5t...(!mOv>٨.I+,ƪGSKMT>޾a@p[!w>=Z4^7=m'+3ێ6//O=Y*RdP2RLNt%H+Ak\ٞ2בOz1QsJ%^^Rq:#rj~93/ cfK)BIZ?B4Rvu=%Wo.]9Z-2gǵr{|+zyn+34wkQM0aH羖tgiC/Я''zn8>HX=gPDwu}nTS U`Z*$ц xI@S[]44:reVԿCNԪ#WSTKk*Vl[w%\H!Oԣc~51.V]\l&iВ.gaKsBZdޢnjkm)wìHOdUT5}5$ A#=}nMCDު-QLـKvˁ'7kH"y'5!ԦR-a]c<%tF2\7Lլ̖DrgpL9_ٵ{$CPB(E@lmL<[f."j8(:D3 5uy.$ QCpwz!rI`-毩1C/K[MuMWF.:RQVx )smsǢkիgYѓqظ\ ڽ`5zeĵz(febmZFd6iѠ極#1|*AV!BCz 7n\|yhſPfSMhR$9L1S^E_An tL %H?)Un'7yh+0[ ÿ]eWQةWkR:ՀǾa>Tz =T` \!J`p߾vY%m9);ŘMg̎ٺx#,LF.B'% ¥v׍KŇCwCiC0< #mM u" !I{$|+G^ĆX};d5(|j ֊E/AP ]7 m[_*Β'/pQ$;~i'L];>ZHG5ă* h>!VSzG<]R!-`D\u.=E(Froj7G宓&ǡn~*AcA46K#= >}=DD!X/ t_ R.|61a!r6exRCwQ- z_:A`S"J];_):Ĝn EQy4N3b"dRB%EOז>'%w7<ӯ.BQgQgQڪo+|4uzcn&: D"inuNku}-}H'X+*Q]݅9T0"ڊYBFrtIgؑ0O"@dW'yގUM3nQ1νKFd8\1(ŗsz3seax~OYs!r[Zk~d寄kpnylJQ6]s'I_Xf}afozw" \ "7Y"snկmڜE, y1ﱌtzAR"48ȵw Rɘ^ +3m_@tь Vn6X{R%T' qę:˯~AA=&q5i%QV5vmХy聱G|ӵB ekW+Y( ^al<.g%58N~X>zy)yezF+hj ٫0\j v&S^A_$mDŮ^ mAU [W2 "J=dI٬FƐPܟh9 & SJWЪ}JAڜ' {*Eixm??-e% IS,{ssάH}THKFRѺ~"]`tWi!Kh<70Z\KuLaV EV Om Ҕӏ3 QAFI3V=Í9W|Uri9AR )%BW%/gwxP߭k_-5xPU]DMpVKytn1(ňU a.0}fpx#>+X)V~n؛hjC$ĨEI<Psv Hl`ʊކR}žJ-( j@X)'R>\m ` Xm$MDϑGSHDQS=g0׹~&R@=E9vDy.вqVqTD@IP?w9Uf,Mu<(}:-]9UNنktƬ[H)o`i(lmDb@jAڊ:2?s|_0b7Юt܁WӉK,{C+r<:qv88C.Lym~pRtP{ ZԎA믁y܇B6ZK6fdY̬4.C9VH٣ _NØ<[iNfߐ. h_3<[N&Q pZz۲<y;kJ,$]82t^8"XZl-:gƽg |%oHS\J]PEuUPs,ʝVYR)M%igh.%dS()#LVW&@m*i!e>+E/A0aXq̮I>!eޅrydofqGҐJph[s\cJK`MBCk8|뮵8)0ݴ@|сSk3veBV<U  [|:S|'au@}]BDXwmQ48-@dKns%Uݵ|$F]I;m-ktb zyohFs'l5>^_&cc" ,!+~W 1}Ui* '?^aKdW!$G$W. a|B{*co.ĭ-c!Lѩ:?л ՚ڻ[Gf V!vV)H>BZ9ר. F!#lpi$yGKՎF^ž^Rj8oϩV@PQp/wǤg6,~aCU,EɯGPh3rUduҒV쯙<0óśT;)(*h!_Z2 .ƻYVcN(@Y8X&5/Ĝ[.:33RU6zb?~]ͪe?0myT}PD `ڀW9rP,~OCw X".49mB59>:WIhIo IC> U"tm3;#T F8t]CI^l$LBaMB%+`|K<l4TAh֡Gvި|L Kۊ8\ rꞠh\ǂ]q>[Ѡ2fyAD ~t;ȨiXÇ~s7-\^(oI>p;|7?|:?GmsS{N7j7Ayw>GgBà[to۳o۶_wqz= w>J #?T|۵۶߷Wiz=&zæ< ))LLK}Z{/!'UGtҐXxܶs0Q#fo`ԳrX5ZOXcv&ceA*lQ=1زb+v#Ey-Y Bݦ42 (DM]~M QmKRՂw OK*&R]:>HN|/š ["I}fD4xa t6Bs=`1HdtAVH; P&UDZ tnQ;ʀx4p4uX>oUl$Y# m?vlj5CM"Y{:HI 9@8 9BMu9aHm];Sm]ӡ#Hؾh7!Ů]|L$>)#(B%8J䩎GUցȥˏАxFoH8D0l5-n87b{C/8^NWjCOw[YgmZ۪pSVɞupkˆBLZ:͆ɀ 96UPsb9gxWcQ݁ɁץVUؖ8wOE9[eSL)¹+ŪL+[A9 tݨyfr'Άa2[e \:/$ ;^Ϗ-^;'Q&*d>*L[o"،T2cX!ڛԤV#7iE Gm>nO}j˟0.־H1NugҢ`Qn[r;t9|8C9#?ў]ќT<0Uѝf[ :nu\YT'E2!3E!fCq@2g2<' /27VWʽҞ,H#Gq &m-j4ENLlswtNKKCn zY]8q6KM䗅wȃÐ}:"=jI G"mhw: 0 ̓'?~@i2\z߄`f{'ڻ{raOoO/OB8-?<;^#yU4Tv/<O)A:WT\៰< i:%4ȹS V̮WF3;zη7<ֱ! fѮ=2a1 [#rO31>gg3_E[<5DT>f$+xbƒ!ߵ1bغ+]E1wH%+` &Mڠ:gNƪdeSA$-jLS] ٱ-]\( a +j+py } 3W3; UZd?4=4DZ}Zy 46 F* `M"K O Hg6_D2HySU^eY:Ӌ|%͖uEH h6Z!sa|]<%1,HACFt+T'>v9bVCEk4'L 2Xf9ٶNSҫ0GѼ'Tk1c^َEzKb}͗ +yO.Ul1b#QB`oRBn]e?W~.4_S?" ׋Y[/"$yP\!3$[eVjãf;G7虹c j1Xs5G,=|[UH;XuMW+SzR~GNom=;L4YqГ\QR̰ `Kh\rǴL}M1wH+,lTm5ۿۧ3@*ڽP+2Pozr2'UΕ;~m]8Ys{!HjބvOY[LTAdI硉,~S6m`7ՐW׋AT6el211B/ 4 K8禢m-N ?5=3LH _\ ;Bz@zYcVWIetf(s< {Ty:s샌Syoj0OoE ?sVMu 6^FWPz􉘩U3|}tn"ZJb9Jׅ+|Bi\#$xS3!.>ʈv_$B=#-MJӳnO]A+uC,7v=g}tnϔOSGE A+ЕNLM7gYL-o rT)d fԏm$i̐,'mi)o @>oaZ^J0 V뽝u_`lv+00T;3O Pߖ*Lo $H&/hV`X=:;g9\(_9(XS}D8tUOx .L  /uLmˋ{I]>wأNV$ MDy сSowM):@k zG6mQ1Җr'ۅ,SGT_p╈5$OĦ)wkPGZc9魀N=4L!"Ne 6|;2ޏȿ>qtJ#$V0y[tB.\GܻNx6Kڰ^[=C14I%d<1m@KJ& bk(>hA8JZ '^N,XR\R#-Ÿc#DنVUܗ8h)6ȝ[0FL- Tzg^$aҽqPgHqˮEh Ec) 9^xw- 5Jio\7@CP&' S-jGg+*YHko(lN F= LuE=?v@JT /h`918Q abT<F~,뮈)-m4Tp ,H#9KU{gʳI]XEоѤK]K~Ort,^ to\B-` 7eR=~E&c N~_3!w =I`=?o3v rZsQ5H(~2$(+AF]ָNB,/[BZ `µ,0- kǡn ,>ih7zy@;yDgߍ ŗLb9RwKzb knˑ| Ԩ9k%ߟ,?SiJ:G4~W v-bK$8'6!%>yJ>_$n Y\l_d342}ɢS.ԼqvCKYds5L5>^e]@aV6/v.Y PɜklkVIJ *YkdW 7$xhm0i,@v}zƟUn!wLj+X0;1Ukl*`7#(&LcGUtb/ ֥ C{d0VкFE$Xur&УJ hBsp m';TʢҤt~$  ꜈f}ËWqT-^pNd{^cr:c`,@[ 6 /?%ky3@1H"070Ss-V7bZpÐ`1H"qm R{-궻 yx jA0fNy*q}A|@n(H D BeNs 1dzLӞEETUF\?"}9<OBbj +?W-s-|k/XR{VEΧ`Kpq]BߞY {g޵/bCcHt>0 x.?!=Qxw؊&{kpBn]v-gMoPu%vFw[`6k57`"o:Qsk I^Ō&,/AVܞU]9*ھv2t-y_$Q},&3WD8nb jAY ԄyeM{ .AMI.ι4ɯ݃- P:MIxZˌ|QcG:Mpd y] ?+fr2cVw#: C( $Eݼ~L1)&DMPʉ4nAu }wm;~EݝJ,GxNۛYbgc<5]=2cc3|Ó~VD8-հ)ȩ_wȠڃSQROB%%xE&J?V U;@iO@`V7 M[ < X/y,,J C$AˢZA_oJq/耟#^+\>V:ʈR\z}oQ6 ]hćͮrJnx|j!Y-Ho4e_\ ^a[&v*AKTx5Y~{|"h}`YDS:-Jvl OwϚ Mb~a 氫%-=i~qH~Tzd_n~&(s+&Q%?GNNBfyMES|D(f$z8I zjƊ2׊'Q@BȗRU=}֧ӌ|☒֍`~nT.3[wU9[O5b5 C)/#0ln뱇Mg<Z*K-9=nKuIZTC3cojeH%~hr\)ÍLNaV8aǨC55]cڞsB+}DQV&-)wêJA|O(8`1U-6ٽHe5=LUCX5](뗎(WHu%ܶKٱݕDy]O(޿)ÜyқgQVv, ` G`b<{nX(p߆q1|dM;AvyݓMܙv(4qib 宪LŖGt= qt[.+G(!hL70!L}:{> +!3φ*P-:]hxȊ2qإ@1ݍ8(u: M!V8f+F<ᅁdfBg@z\$V 18"E[<GAt{J^Vnj  QJܸErp ,0Aa w_@!A҇'˜ x1G_g[=3aM6کw["l-ǢZkK(:޽,D6sj={~wwv;z-꺷ծ㽅)=@]E]EGH>p[._G^nP[O9sg׈ئq'c0Nk *_ ;idp_1XzU?*cvwkVVBv+AD\gvC`Ct\?(c=F,Iz>E`H^Iz\ң:6,OƦt 7|>h:i[25z{3)EOlZP'֭?yV]WYXqqvuwO,q= ,d]T|@zO#\cka0|V61W'7zBzқ>{ֵX0LW7o@^ .QTxC,(p?VDVsWJx) JSL訍aJ#TCn~[kHJCgO`%.y#0?]˄+sث~ s(Cd|zK&tG/C`T,|| mK \T vW=.0@_zp8}>x[ILX'}do*e>ZNF4C`)!VS Nz'Ӣ>B($H9lՍ %|umަ=QI(2h)Xޠge2l%Ҫ֤k\d%1jo|YVn]P都Ig7cI5W[t1]O|+۪SxhOFۨp֞lQAnib%\A#e+ee֗L#$fQV9kH=QFQMak{$m"Je\t3Ut 8T>5ITFk7߾]xJQ~[:롏%ޱRY"Djt@I!]of賈.wE@7 |-&P=U}BLl]( J~R-8l0NEnV'rʱ0 L .E85_?C[j~W"o- UUDhf[]mF1 nl 0J!Q9m=z|0^0- p_pJuҘ`X_` i%$=o'm L^ޕ,{yGd(ae Q $|؏fLC15hK=xC~G5ĉk⢜oC(Lpgl\q)MtU*Wj||ЀK%5(x)eT޸f#][B!e*#kS _VcQ`VdiKrTii U쟟wFnhGtfu9F8E29 _L2u|XRJd2i +۹v!$vK&][芭{-ٟz`,̏L _:-"W$c0D'^2,yt Pl:i lP|!dI|K=w;CkN/QQq| ՉObr[`O ;dj}~ oApv!kR"2[ۂ*\$z)aUW*qmSEv3NKLl· c["EP]-?rJ7t|1ɵlyY &}{>-XILKUpE˥YXD8c>7[jM9̻@]7;Q<%DNO|U*GࣣmVPc>xP8(Av7Ŕ`Nmgg-5!>EܶHGQ  ?w+T܎HFGT9vS6%1~ GsAF7`y XdBL}n)e41,7 OL?QIp11e: Q$TjCBZbĔ{!c`y·ٷJ򶣚:Ng^fe'Xy02ҮId}zjsjQhgռ69];j ZjC+w>%!~>#!Z ª< BgFbzzxW$O7ddPY CC4ߦHOP%O16<3Hro.*sR䭕6%͡V`+I?rdoM%y^-4Z^뒛!O޼%#}8o*$[ E3Av %lcgDp*SRIv|96F1RVX2nXŘpܫzNL0|Xtuw;6h0r_]Gkgmb'e8×.`$`-N">5&FW:ƀ&:Ϯ> ( TL'?9CdRD*z'>Ɨ*Uރ̳ڹˆ'> $oB:ؗ-MM8t+#רZӱ,䌹ъŶk^(6c5*+m:9@[n~)m@[Xi<|q 1N>$ZXl>?#KU# n 3 i$:8*s`3[ϱˋY4/\@ b7;S:<*ШBǬL@9VH%u0*&|X=MM{p:)(Dyyf8 ,BNz9IFCɲ46!&I>GH&:.%2FK}GQ;72)-:Ad=kD8,jN`wڍ=3 )9e72FI |,25\{]R:Ro>fd o8"k VMw;ӕtzP`ذhuA-KFJ`P f^ .ã \Lgk1{p]E4!0p;BYp:4K[?] ֕M!T=e. !/*M) PjOG&qLXYujP {x[+v^>}5Á2$u#b$'is=$]NDst]]c/*qd`c;(Y%fmwwvwy@j7r~8]jpec3zuc_8jk_Ct}msrr*T#Vom6\@nl Uirq1x6VdIAߜAΩK'L^0"%iȞ jt2;lT%ڑcţ%t[2Swn91[8#i-g :g?1Ne{`㉕%]hB)$LԹy6G {$u^6^4$QCyp 5ßͯDGIs&zz_r͌Ϟ< R޿ c/m^jEy]xA! ykiIE "Xb JBސŌD<]XݠTHN,If5 ܊6FTrY#8YMڨw? pNj"+ĵ߷#:pѺmH?!iq .>ʞf }$<-ۃu+:926WƅAh/T\y9MwjY=UƬ-qϫ(&g4@vb᱄2?yl2pE[E\sǪ3P Iz\? 8^Κsrs_1}1x Y3(|-f&Uw +hͽrrz:遲 3R u2)l)V(KO/~фPfRXSb3t k({yEp9n'J.b ) "18䊷*t#T0ݨޓ(҂qk V|17&/;m=1F=N0\2rX𑯕s-\ʼġ(0fl)XiJIrRhIaz4-/qpcAtjjz面9B!LB٣z;VS'HRyaȯΌm "9z5-ܯ $G#s -,ָ}H _:>HV.1g9d_) nG*4p$ xm2`,8e fnY2eHyE.0m t',SDΐgY=Fr[W ÌRyuBrq@~$E+i"(F(\(Y=.2m'hۮy d?hPc^Rv.fZܭ+t {8̹T$؍u<#]SAcV=,*bS=A׵]+{,i^b3$( `IZ&P۰/rwEzD%sAe^wPFOv+OE{05aqZkJ:Y 82&i!EU[v2(K c ->OHkn ѫsS}CA1 }u$c]@x̽f -BRs Ublߢi(r?1-@㰙:FUUy8yP`p~3КrJ).=Rc m1rSQ*`Qf=>;8Uu=EE[|泴 66xPej͋b*21~ȣʑA0ncjxj:3@>tmymk[=jRŭtQu/D/!AaGyloyQ#X۾՛!Yj [ QWQy?T r P{km\Sp>TN_J^cg̙{B8@p;\]E\mG$Sϭ߱e( hlڵ&Ze+?x~P>>/A]Lﭝq+dz`kuW.>u'EM[h}9m՜Zjxs206:F<4&r (MˣBZnʄ=/b4S@U5[uLt>\EN/ M>Rgb-;#n-un d%@'11Fr<[r]r0?(;vqxU=L|Cx]Q/I #wB̑n;RLMDM1*r.QHD,GvZD'+M??[qkwٹ@X@y:OΕejcEuu].⨜:QǹySZa=$2P="_s cMt4Xk=w?te͆szLyYi#'D8L(enQ_eh_vN">AEG#BμMjnMkoE'#H43}=eͰTEiTo@+(͜u#"(5pq(y |#QGi-#uN9B&ɑQ0  0oydZeP{{S<."lF] /,[M9xsۥ8tU^ҘK|K!K>b DPͫ;#pSCI!kڻQrc#'7*S(lf }mr#?4xn{OEb.4VG>wM`H6x~ա=< H@n2UYMUm9MN |6!NZ=y,kXevf/\חD?Apnc2DTJ 7H?lqy]U#oDFV=PHjs,\ӧ%E/=Wy:|<'KfmEl6c ͳed4{kR$ا3Ͳe}QeG8ޏQ̴zC㢢Sz\2ل@d@ʡ|XZxKk~CA7V¸Yt2^\͞11?7O9z݉hnH(5q l@$4}֛%2;^&R~?)\m,|cgڧcOlo![rI`8YVY; 4 N*%6 &8eI3ޅPpH]@X0Isgx%JlX}w lkx6f䁻iky',5$ݴQJ8'@LP|#$OkTCȂuu5e:`s2 ]؉t_~ҕo=/U6XQuǕQ{P &yc">nVC]m [b&,ߎ F<'DUԷn`=Sx _ Dptu>m ZH Nzⁱl{e=ճd铎Rd`0$p)T"MZe#qJ'hv;eNmObKJs"@x[HPA['ybख़[(C\a3#єX^-snZ-6򈡧 GL t zu k@[ *|jIO9d"*bCpjc[ }% m L"S|#6NgotDneiop4?N; "1)n>+ٺ~8/Œ *`!K'o mn]C| |ud^M枛V*G׬~LwpH.!20+PB `""*±O}~p+.Qs=2̄W +|yV௕ BgKy]-F?ȝh +6~l+ξFvQM(s;c ָ` FysJ^M02##2]a _۷#Qj)tUű);qo.L+!_ަpbu[Ww[B*_+cćW ")|Ϡ<0~5{fdV{=~g8P^SAšPf$1Pp=G<'j~%nnQǴPDBشNaЂ+y/#BzXȁIpDM"jYڈʺ}RSJ&>b6V> (1d\hd99ǮfI !nWGH$gr L89P9<>?*npW|8Ce,mICVeNf̮?YB5U|\PYأ)qյ=0F EprԺ(Ln`[ٻ8Yn57ު, P) |# {5s-S_7ODr16 ͐ީp%{X`(~"g{%i-@ܵEhЇQꖕpY v-6vaOWֱS )z^tM{4JkH'\ƟGn^.V$0>Qx &8u`g<"Q}hrYm!_n%IRu;!#,cǪqN½lY:l0h)]{+-X .IXA}z*ľ=eÿ՝NWa0@A1ll$B]3i\Tv6 [mA߁DXQ\m8 ~a?iH_m+ҿ‘Bf}T>k]gNm/)Km)hF~Hhk?m $Q$@yoCt< ÈÎKm '@P XHBu:4ź0[ۜɺ%`S dnJkӥEnߦAٜ߳0xmS;HعxEGJoD{jӅɝs9WpbҒ㻹 Nj3s^_-%t◧oh\>y7՞S; h(.aGN7dHJ퀼D:dRhE8kX?@$yaU77`pK-|U 0Ѳ6]42W A!n%9hRQc 9"r`L064 tB^iF>ӹ]HY3 .?5߉DfrϾI*3`z{)nե { yM+7IحIYJuN~>Zvc5 NAs;:@/s7wd?G6&+̀k7Oǭ|yFJ{olͳ(׭ z=*y-. AhDx$s?=u+wOxO6P/P),)~DD?U&˰H< &3L;|1Lc3%GPd edQbB)*d/0@Y^ $!\ k; =*GITpr݆ tFܬwCNyhIs ,3HH'sGݹ.1RCҒ `kJBs]7:ɟ2_#XݻcڙcU*񢾃<ΕId"=7f̚up_]\T৫޼'sL~چߋ.%'( Y0I,uoܫҹwApqATq[ ]ȍe-ˏvK$CdfLDe-_HA'R@Ja|S2z5cܘڠ/KDhg⟪G\PxD []du.QPZdh9fm' ؿA1 R1^ aJ2I7?Z'XS?G{%_U(k6,^dJZ5PD9G} B3D0*S1~3ȵ7ְ6 .Cp;Ĩd_]g'1!jƩ9ς4N_deƟnִ ..1wC [C38iXgQʺ4ڷpAn*8y#m,Y)z[ute56"cWx]8MA2~[9!q{Ygϴ{* tM6יAi=豫 6Hd"k[85ճ 6F%;2%"#٧j-4_/#&QD^ܵzEh21bl͍m7@ K>Ҍ+YK9/Ũh@lMG g0>K3x-!J*%qCo #1H7"q5$_^4Q);"+SR:Ӳ0_-7Pm6./g\ͦ UͣfQCWDj"CBS!4ocO N4/A(dv`SMg1DӃ5Ibv.4* ÿl'l+-ǴN^9y]GXS%'E0v%7<τC4̶a͹1nhsHɃJ(DX,p{s|z,|1~n$÷ q@ƍ[oq10u$~&,j5SUN^ػ!{]C% ,Bu AV">{^O֙V=GzBeP/^(ݝtʭ\Ai$%:3U9 ~XpjJ:Xadxps3(e0J ~&4TK[ 8殜Ra8U#֍YMƧΓm2 ϤkI/vۡħvf4++:R$*gSP4zVF#/fF+ʗvǶ;peu)1%^WQ֓I7B!cW**ousgA6XrlB j1Æb;xNCyƪ\sb`ԛ˕M phE|}>KeW)3X-D/:?)E4\]1tI$.woV <&kWԢ`^N)nԫ:, aw10 ?3™whp9Wd/*lbr;~}kd;)[w=dtd\1~>:9:xyV!ec_*J-br=i1i!ՆR] *;jλ6;;&=5%^U,\1u8(LqT4;Fی3F݉f $ku&ߜCC^$~bhj"ns?/ʂLqD0 )^[-΅%ԧ23^nn. ._ԙ?0w5Pjb=ӌuj0vtؿ!-YZI'&9H>^ZjWYE>3 GZ/vJ!jki7{dju50pzJKݡbx1뽁O5~; gc(µEɺRiD ;U\ :{銫qܴJEтЙa E;WT2ޱ`䲀#f0ـ}>etp쪪a6S,̓ 6$Ji&>$9J+"ij,A0 =Z*Ks hZgMItQ]i1mZ12]v&"7)Jf<ގˠiQ Eh|9w P2w/(h&6Q283%|]d #O Q"5Z] Uj_ G9(Almſ @7U 2j`9=fzz^?Y3 _#j RPc?4ZBeibe$w;Q%6ZE-,s_'(X-9IzI>N0kR?oMlf~}OϫnDA[jJT.{KejkS}d^s/1aGF0t(@b>>/#@'G[^a7{‘s!󐼀a$JuuE{SۨkoE^(⊏ -;N1_7aJ-\^_yNŧ Lώs7-Ѣ %7[4/'?B?Ma;i׶0G2 OۇeU>@LKD)ތ-eFi~6i@5rmK "!μBC TCPϷ>wvakwՍ! h4MkK(3J_;7N9 *)Ɲ\Z &֞"zAl-8q;f[*h oˌ3/ 2VouMĘ40߫$SezπkxTEs b=y2X=%m|OO󽯋`Q6!ف%ӻGi+` X" W[[>)ò0^h)DjMp`SD243 ֐r೚o:6ɢ&`.,Hm* UVg 32x[z& ]xK#3MY# ^5 images/xaosbig.png XaoS-release-4.3.2/src/ui/customdialog.cpp000066400000000000000000000362641455214672000204330ustar00rootroot00000000000000#include #define __USE_MINGW_ANSI_STDIO 1 // for long double support on Windows #include #include "customdialog.h" #include "config.h" #include "ui.h" #include "misc-f.h" #include "filter.h" #include "ui_helper.h" #ifdef USE_FLOAT128 #include #endif QStringList fnames = {}; QString CustomDialog::format(number_t number) { char buf[256]; #ifdef USE_FLOAT128 quadmath_snprintf(buf, 256, "%.34Qg", (__float128)number); #else #ifdef USE_LONG_DOUBLE snprintf(buf, 256, "%.20Lg", (long double)number); #else snprintf(buf, 256, "%.20g", (double)number); #endif #endif return QString(buf); } CustomDialog::CustomDialog(struct uih_context *uih, const menuitem *item, const menudialog *dialog, QWidget *parent) : QDialog(parent) { m_menuitem = item; m_dialog = dialog; m_parameters = 0; setWindowTitle(item->name); QBoxLayout *dialogLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); QFormLayout *formLayout = new QFormLayout(); for (int i = 0; dialog[i].question; i++) { QString label(dialog[i].question); if (dialog[i].type == DIALOG_COORD) { QLineEdit *real = new QLineEdit(format(dialog[i].deffloat), this); QFontMetrics metric(real->font()); real->setMinimumWidth(metric.horizontalAdvance(real->text()) * 1.1); real->setObjectName(label + "real"); // real->setValidator(new QDoubleValidator(real)); QLineEdit *imag = new QLineEdit(format(dialog[i].deffloat2), this); imag->setObjectName(label + "imag"); imag->setMinimumWidth(metric.horizontalAdvance(imag->text()) * 1.1); // imag->setValidator(new QDoubleValidator(imag)); QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(real); layout->addWidget(new QLabel("+", this)); layout->addWidget(imag); layout->addWidget(new QLabel("i", this)); formLayout->addRow(label, layout); } else if (dialog[i].type == DIALOG_IFILE || dialog[i].type == DIALOG_OFILE) { QLineEdit *filename = new QLineEdit(dialog[i].defstr, this); QFontMetrics metric(filename->font()); filename->setMinimumWidth(metric.horizontalAdvance(filename->text()) * 1.1); filename->setObjectName(label); QToolButton *chooser = new QToolButton(this); chooser->setObjectName(label); chooser->setText("..."); if (dialog[i].type == DIALOG_IFILE) connect(chooser, SIGNAL(clicked()), this, SLOT(chooseInputFile())); else connect(chooser, SIGNAL(clicked()), this, SLOT(chooseOutputFile())); QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(filename); layout->addWidget(chooser); formLayout->addRow(label, layout); } else if (dialog[i].type == DIALOG_IFILES) { QTextEdit *filenames = new QTextEdit(this); filenames->setMaximumHeight(filenames->height() * 2); filenames->setObjectName(label); QToolButton *chooser = new QToolButton(this); chooser->setObjectName(label); chooser->setText("..."); connect(chooser, SIGNAL(clicked()), this, SLOT(chooseInputFiles())); QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(filenames); layout->addWidget(chooser); formLayout->addRow(label, layout); } else if (dialog[i].type == DIALOG_CHOICE) { QComboBox *combo = new QComboBox(this); combo->setObjectName(label); const char **str = (const char **)dialog[i].defstr; for (int j = 0; str[j] != NULL; j++) combo->addItem(str[j]); combo->setCurrentIndex(dialog[i].defint); formLayout->addRow(label, combo); } else if (dialog[i].type == DIALOG_PALSLIDER) { gradientpal = clonepalette(uih->image->palette); palcontext = uih; // 3 inputs decide color, Algorithm Number, Seed and shift // For Algorithm number algono = new QSpinBox(this); algono->setObjectName(label + "algono"); algono->setValue(palcontext->palettetype); algono->setRange(1, 3); // Algo Slider algoslider = new QSlider(Qt::Horizontal, this); algoslider->setObjectName(label); algoslider->setRange(1, PALGORITHMS); algoslider->setValue(algono->value()); // algoslider->setMinimumWidth(this->width()*2); // For Seed Number seedno = new QSpinBox(this); seedno->setObjectName(label + "seedno"); seedno->setRange(0, gradientpal->size); seedno->setValue(palcontext->paletteseed); // Seed Slider seedslider = new QSlider(Qt::Horizontal, this); seedslider->setObjectName(label); seedslider->setRange(0, gradientpal->size); seedslider->setValue(seedno->value()); // For Shift Number shiftno = new QSpinBox(this); shiftno->setObjectName(label + "shiftno"); shiftno->setRange(0, gradientpal->size); shiftno->setValue(palcontext->paletteshift + palcontext->manualpaletteshift); // Shift Slider shiftslider = new QSlider(Qt::Horizontal, this); shiftslider->setObjectName(label); shiftslider->setRange(0, gradientpal->size); shiftslider->setValue(shiftno->value()); // Add them to Layout formLayout->addRow("Algorithm", algono); formLayout->addWidget(algoslider); formLayout->addRow("Seed", seedno); formLayout->addWidget(seedslider); formLayout->addRow("Shift", shiftno); formLayout->addWidget(shiftslider); img = new QLabel(this); img->setScaledContents(true); formLayout->addRow(img); updateVisualiser(); connect(algono,SIGNAL(valueChanged(int)), algoslider, SLOT(setValue(int))); connect(algoslider, SIGNAL(valueChanged(int)), algono, SLOT(setValue(int))); connect(algono, SIGNAL(valueChanged(int)), this, SLOT(updateVisualiser())); connect(seedno,SIGNAL(valueChanged(int)), seedslider, SLOT(setValue(int))); connect(seedslider, SIGNAL(valueChanged(int)), seedno, SLOT(setValue(int))); connect(seedno, SIGNAL(valueChanged(int)), this, SLOT(updateVisualiser())); connect(shiftno,SIGNAL(valueChanged(int)), shiftslider, SLOT(setValue(int))); connect(shiftslider, SIGNAL(valueChanged(int)), shiftno, SLOT(setValue(int))); connect(shiftno, SIGNAL(valueChanged(int)), this, SLOT(updateVisualiser())); } else if (dialog[i].type == DIALOG_PALPICKER) { palcontext = uih; getDEFSEGMENTColor(newColors); QList< QPushButton* > buttons; QBoxLayout *layout1 = new QBoxLayout(QBoxLayout::LeftToRight); QBoxLayout *layout2 = new QBoxLayout(QBoxLayout::LeftToRight); QBoxLayout *layout3 = new QBoxLayout(QBoxLayout::LeftToRight); for(auto bidx = 0; bidx < 31; ++bidx ) { auto button = new QPushButton{ QString::number(bidx) }; button->setObjectName(QString::number(bidx)); QColor color(newColors[bidx][0], newColors[bidx][1], newColors[bidx][2]); QPalette pal = button->palette(); button->setAutoFillBackground(true); pal.setColor(QPalette::Button, color); button->setPalette(pal); button->update(); buttons << button; if(bidx <= 10) layout1->addWidget(button); else if(bidx>10 and bidx <= 20) layout2->addWidget(button); else layout3->addWidget(button); connect(button, SIGNAL(clicked()), this, SLOT(colorPicker())); } formLayout->addRow(layout1); formLayout->addRow(layout2); formLayout->addRow(layout3); } else if (dialog[i].type == DIALOG_LIST) { QComboBox *list = new QComboBox(this); list->setObjectName(label); list->setEditable(true); list->addItem(dialog[i].defstr); QSettings settings; QStringList formulas = settings.value("Formulas/UserFormulas").toStringList(); list->addItems(formulas); formLayout->addRow(label, list); } else { QLineEdit *field = new QLineEdit(this); field->setObjectName(label); if (dialog[i].type == DIALOG_INT) { field->setText(QString::number(dialog[i].defint)); field->setValidator(new QIntValidator(field)); } else if (dialog[i].type == DIALOG_FLOAT) { field->setText(format(dialog[i].deffloat)); // field->setValidator(new QDoubleValidator(field)); } else { field->setText(dialog[i].defstr); } QFontMetrics metric(field->font()); field->setMinimumWidth(metric.horizontalAdvance(field->text()) * 1.1); formLayout->addRow(label, field); } } dialogLayout->addLayout(formLayout); QDialogButtonBox *buttonBox = new QDialogButtonBox((QDialogButtonBox::Ok | QDialogButtonBox::Cancel), Qt::Horizontal, this); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); dialogLayout->addWidget(buttonBox); setLayout(dialogLayout); } void CustomDialog::accept() { int nitems; char *ps; for (nitems = 0; m_dialog[nitems].question; nitems++) ; m_parameters = (dialogparam *)malloc(sizeof(*m_parameters) * nitems); for (int i = 0; i < nitems; i++) { QString label(m_dialog[i].question); if (m_dialog[i].type == DIALOG_COORD) { QLineEdit *real = findChild(label + "real"); QLineEdit *imag = findChild(label + "imag"); m_parameters[i].dcoord[0] = xstrtonum(real->text().toUtf8(), &ps); m_parameters[i].dcoord[1] = xstrtonum(imag->text().toUtf8(), &ps); } else if (m_dialog[i].type == DIALOG_CHOICE) { QComboBox *field = findChild(label); m_parameters[i].dint = field->currentIndex(); } else if (m_dialog[i].type == DIALOG_IFILES){ QTextEdit *field = findChild(label); QString raw_fnames = field->toPlainText(); fnames = raw_fnames.split("\n"); } else { QLineEdit *field = findChild(label); if (m_dialog[i].type == DIALOG_INT) m_parameters[i].dint = field->text().toInt(); else if (m_dialog[i].type == DIALOG_FLOAT) m_parameters[i].number = xstrtonum(field->text().toUtf8(), &ps); else if (m_dialog[i].type == DIALOG_PALSLIDER) { // Copy data to original context palcontext->manualpaletteshift = 0; palcontext->palettetype = algono->value(); palcontext->paletteseed = seedno->value(); palcontext->paletteshift = shiftno->value(); m_parameters[i].dint = 1; destroypalette(gradientpal); } else if (m_dialog[i].type == DIALOG_PALPICKER) { mkcustompalette(palcontext->image->palette, newColors); } else if (m_dialog[i].type == DIALOG_LIST) { QComboBox *list = findChild(label); m_parameters[i].dstring = strdup(list->currentText().toUtf8()); } else m_parameters[i].dstring = strdup(field->text().toUtf8()); } } QDialog::accept(); } dialogparam *CustomDialog::parameters() { return m_parameters; } void CustomDialog::chooseInputFile() { QLineEdit *field = findChild(sender()->objectName()); QSettings settings; QString fileLocation = settings.value("MainWindow/lastFileLocation", QDir::homePath()).toString(); QString fileName = QFileDialog::getOpenFileName( this, sender()->objectName(), fileLocation, "*.xpf *.png *.xaf"); if (!fileName.isNull()) { field->setText(fileName); settings.setValue("MainWindow/lastFileLocation", QFileInfo(fileName).absolutePath()); } } void CustomDialog::chooseOutputFile() { QLineEdit *field = findChild(sender()->objectName()); QSettings settings; QString fileLocation = settings.value("MainWindow/lastFileLocation", QDir::homePath()).toString(); QString fileName = QFileDialog::getSaveFileName( this, sender()->objectName(), fileLocation); if (!fileName.isNull()) { field->setText(fileName); settings.setValue("MainWindow/lastFileLocation", QFileInfo(fileName).absolutePath()); } } void CustomDialog::chooseInputFiles() { QTextEdit *field = findChild(sender()->objectName()); QSettings settings; QString fileLocation = settings.value("MainWindow/lastFileLocation", QDir::homePath()).toString(); QStringList fileNames = QFileDialog::getOpenFileNames( this, sender()->objectName(), fileLocation, "*.xpf *.xaf"); if(!fileNames.isEmpty()) { for(auto file: fileNames) { field->append(file); } settings.setValue("MainWindow/lastFileLocation", QFileInfo(fileNames[0]).absolutePath()); } } void CustomDialog::updateVisualiser() { // Get updated Colors int colors[101][3]; getPaletteColor(gradientpal, seedno->value(), algono->value()-1 < 0? 0:algono->value()-1, shiftno->value(), colors); // Load Curve QImage palImage(100, 1, QImage::Format_RGB32); // Fill Curve for(int i=0;i<100;i++) { QRgb value = qRgb(colors[i][0], colors[i][1], colors[i][2]); palImage.setPixelColor(i, 0, value); } // Save Result QPixmap newImage = QPixmap::fromImage(palImage.scaled(this->algono->width(), this->algono->height())); img->setPixmap(newImage); } void CustomDialog::colorPicker() { QPushButton* button = qobject_cast(sender()); int idx = button->objectName().toInt(); QColor color = QColorDialog::getColor(QColor(newColors[idx][0], newColors[idx][1], newColors[idx][2]), this); QPalette pal = button->palette(); button->setAutoFillBackground(true); pal.setColor(QPalette::Button, color); button->setPalette(pal); button->update(); newColors[idx][0] = color.red(); newColors[idx][1] = color.green(); newColors[idx][2] = color.blue(); } XaoS-release-4.3.2/src/ui/customdialog.h000066400000000000000000000017361455214672000200740ustar00rootroot00000000000000#ifndef CUSTOMDIALOG_H #define CUSTOMDIALOG_H #include #include #include #include #include "ui.h" extern QStringList fnames; class CustomDialog : public QDialog { Q_OBJECT private: struct palette *gradientpal; uih_context *palcontext; const menuitem *m_menuitem; const menudialog *m_dialog; dialogparam *m_parameters; QSpinBox *algono, *seedno, *shiftno; QLabel *img; QSlider *seedslider, *algoslider, *shiftslider; unsigned char newColors[][3]; private slots: void chooseInputFile(); void chooseInputFiles(); void chooseOutputFile(); void updateVisualiser(); void colorPicker(); public: CustomDialog(struct uih_context *uih, const menuitem *item, const menudialog *dialog, QWidget *parent = 0); void accept(); dialogparam *parameters(); static QString format(number_t number); }; #endif // CUSTOMDIALOG_H XaoS-release-4.3.2/src/ui/fractalwidget.cpp000066400000000000000000000036461455214672000205570ustar00rootroot00000000000000#include "fractalwidget.h" #include #ifdef USE_OPENGL #include #endif #include "ui.h" #include "filter.h" FractalWidget::FractalWidget() { m_image = NULL; setMouseTracking(true); setAutoFillBackground(false); setAttribute(Qt::WA_OpaquePaintEvent, true); } QPointF FractalWidget::mousePosition() { return m_mousePosition; } void FractalWidget::setImage(struct image *image) { m_image = image; } QSize FractalWidget::sizeHint() const { return QSize(800, 600); } #ifdef USE_OPENGL void FractalWidget::paintGL() { if (m_image) { QImage *qimage = reinterpret_cast(m_image->data)[m_image->currimage]; QImage glimage = QGLWidget::convertToGLFormat(*qimage); glDrawPixels(glimage.width(), glimage.height(), GL_RGBA, GL_UNSIGNED_BYTE, glimage.bits()); } } void FractalWidget::resizeGL(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, 0, h, -1, 1); glMatrixMode(GL_MODELVIEW); } #else void FractalWidget::paintEvent(QPaintEvent */*event*/) { if (m_image) { QPainter painter(this); QImage *qimage = reinterpret_cast(m_image->data)[m_image->currimage]; painter.setCompositionMode(QPainter::CompositionMode_Source); painter.drawImage(0, 0, *qimage); } } #endif void FractalWidget::mousePressEvent(QMouseEvent *event) { m_mousePosition = event->pos(); event->ignore(); } void FractalWidget::mouseReleaseEvent(QMouseEvent *event) { m_mousePosition = event->pos(); event->ignore(); } void FractalWidget::mouseMoveEvent(QMouseEvent *event) { m_mousePosition = event->pos(); event->ignore(); } void FractalWidget::wheelEvent(QWheelEvent *event) { m_mousePosition = event->position(); event->ignore(); } XaoS-release-4.3.2/src/ui/fractalwidget.h000066400000000000000000000016331455214672000202160ustar00rootroot00000000000000#ifndef FRACTALWIDGET_H #define FRACTALWIDGET_H #include "config.h" #include #ifdef USE_OPENGL #include #endif class QImage; class QPoint; #ifdef USE_OPENGL class FractalWidget : public QGLWidget #else class FractalWidget : public QWidget #endif { Q_OBJECT private: struct image *m_image = NULL; QSize m_sizeHint; QPointF m_mousePosition = QPointF(0.0, 0.0); protected: void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event); #ifdef USE_OPENGL void paintGL(); void resizeGL(int w, int h); #else void paintEvent(QPaintEvent *event); #endif public: FractalWidget(); QSize sizeHint() const; QPointF mousePosition(); void setImage(struct image *image); }; #endif // FRACTALWIDGET_H XaoS-release-4.3.2/src/ui/image_qt.cpp000066400000000000000000000150051455214672000175150ustar00rootroot00000000000000#include #include "config.h" #include "filter.h" #include "grlib.h" #include "xio.h" #include "misc-f.h" void rgbtohex (int r, int g, int b, char color[6]) { QColor rgb(r, g, b); QString hex = rgb.name(); hex.remove(0, 1); strcpy(color, hex.toStdString().c_str()); } void hextorgb (char *hexcolor, rgb_t color) { QString hexa = hexcolor; hexa.push_front('#'); QColor hex(hexa); QColor rgb = hex.toRgb(); color[0] = rgb.red(); color[1] = rgb.green(); color[2] = rgb.blue(); } static QFont getFont(void *font) { if (font) return *reinterpret_cast(font); else return QFont(QApplication::font().family(), 12); } int xprint(struct image *image, void *font, int x, int y, const char *text, int fgcolor, int bgcolor, int mode) { char line[BUFSIZ]; int pos = strcspn(text, "\n"); strncpy(line, text, pos); line[pos] = '\0'; QImage *qimage = reinterpret_cast(image->data)[image->currimage]; QFontMetrics metrics(getFont(font), qimage); QPainter painter(qimage); painter.setFont(getFont(font)); if (mode == TEXT_PRESSED) { painter.setPen(fgcolor); painter.drawText(x + 1, y + 1 + metrics.ascent(), line); } else { painter.setPen(bgcolor); painter.drawText(x + 1, y + 1 + metrics.ascent(), line); painter.setPen(fgcolor); painter.drawText(x, y + metrics.ascent(), line); } return strlen(line); } int xtextwidth(struct image */*image*/, void *font, const char *text) { char line[BUFSIZ]; int pos = strcspn(text, "\n"); strncpy(line, text, pos); line[pos] = '\0'; QFontMetrics metrics(getFont(font)); return metrics.horizontalAdvance(line) + 1; } int xtextheight(struct image */*image*/, void *font) { QFontMetrics metrics(getFont(font)); return metrics.height() + 1; } int xtextcharw(struct image */*image*/, void *font, const char c) { QFontMetrics metrics(getFont(font)); return metrics.horizontalAdvance(c); } // Saves image as png with xpf chunk data const char *writepng(xio_constpath filename, const struct image *image, xio_file xpf_data) { QImage *qimage = reinterpret_cast(image->data)[image->currimage]; if(xpf_data != NULL){ QString xpf_chunk = xio_getstring(xpf_data); qimage->setText("Metadata", xpf_chunk); } if(!qimage->save(filename)) return "Invalid file extension"; return NULL; } // Reads png image and xpf associated data const char* readpng(xio_constpath filename) { QImageReader reader(filename); const QImage xaos_image = reader.read(); QString xpf_chunk = xaos_image.text("Metadata"); const char *xpf_data = NULL; if(xpf_chunk != QString() or !xpf_chunk.isEmpty()) xpf_data = mystrdup(xpf_chunk.toStdString().c_str()); return xpf_data; } static void freeImage(struct image *img) { free(img); } struct image *create_image_qt(int width, int height, struct palette *palette, float pixelwidth, float pixelheight) { QImage **data = new QImage *[2]; data[0] = new QImage(width, height, QImage::Format_RGB32); data[1] = new QImage(width, height, QImage::Format_RGB32); struct image *img = create_image_cont( width, height, data[0]->bytesPerLine(), 2, data[0]->bits(), data[1]->bits(), palette, NULL, 0, pixelwidth, pixelheight); if (!img) { delete data[0]; delete data[1]; delete[] data; return NULL; } img->data = data; img->free = freeImage; return img; } void overlayGrid(uih_context *c, int fgcolor) { struct image* image = c->image; QImage *qimage = reinterpret_cast(image->data)[image->currimage]; QPainter painter(qimage); QPen pen; pen.setColor(fgcolor); pen.setWidth(2); painter.setPen(pen); //Find fractal origin (0,0) long long int x1 = (0 - c->fcontext->rs.nc) / (c->fcontext->rs.mc - c->fcontext->rs.nc) * c->zengine->image->width; long long int y1 = (0 - c->fcontext->rs.ni) / (c->fcontext->rs.mi - c->fcontext->rs.ni) * c->zengine->image->height; /* FIXME Support greater zoom*/ double currzoom = (c->fcontext->currentformula->v.rr) / (c->fcontext->s.rr); if(currzoom > 100000){ uih_error(c, "Cartesian Grid not supported on zoom > 100000x"); uih_message(c, "Re-enable after zooming out"); uih_cartesiangrid(c); } // Find next coordinate (1,1) long long int x2 = (1 - c->fcontext->rs.nc) / (c->fcontext->rs.mc - c->fcontext->rs.nc) * c->zengine->image->width; long long int y2 = (1 - c->fcontext->rs.ni) / (c->fcontext->rs.mi - c->fcontext->rs.ni) * c->zengine->image->height; // Find current zoom level long double rr = c->fcontext->s.rr/10.0; long double counter=0; while(rr<1){ rr*=10; counter++; } // Set step size long double xinterval = x2-x1; long double yinterval = y2-y1; long double xstep = xinterval/pow(10.0, counter - 1); long double ystep = yinterval/pow(10.0, counter - 1); // Do Not draw smaller coordinates if step size is too low // Draw Boundary Boxes if(xstep > 1 and ystep > 1){ for(long double i=x1; i<=image->width; i+=xstep*10){ painter.drawLine(i, 0, i, image->height); } for(long double i=x1; i>=0; i-=xstep*10){ painter.drawLine(i, 0, i, image->height); } for(long double i=y1; i<=image->height; i+=ystep*10){ painter.drawLine(0, i, image->width, i); } for(long double i=y1; i>=0; i-=ystep*10){ painter.drawLine(0, i, image->width, i); } } pen.setWidth(1); pen.setStyle(Qt::DashLine); painter.setPen(pen); // Draw grid boxes if(xstep > 1 and ystep > 1){ for(long double i=x1; i<=image->width; i+=xstep){ painter.drawLine(i, 0, i, image->height); } for(long double i=x1; i>=0; i-=xstep){ painter.drawLine(i, 0, i, image->height); } for(long double i=y1; i<=image->height; i+=ystep){ painter.drawLine(0, i, image->width, i); } for(long double i=y1; i>=0; i-=ystep){ painter.drawLine(0, i, image->width, i); } } return; } XaoS-release-4.3.2/src/ui/images/000077500000000000000000000000001455214672000164675ustar00rootroot00000000000000XaoS-release-4.3.2/src/ui/images/xaosbig.png000066400000000000000000000657001455214672000206410ustar00rootroot00000000000000PNG  IHDRRl pHYs   IDATxyu~ݍ`Gcp I-H3g%q;8%TlRIb\REK,ɦH"E(j8`f t7u~o{3BsY&6Mlb&6Mlb&6Mlb&6Mlbx@O(X )_~3ṯcSց#G~JK6 9))h}(NA4=gp  iD,tz x5Ѳ~,  wM>{W#ΑO %,O|ru[қ? m; C?d)7^ra_v+v x~3_x… -@)]ت}DGF<(TGo!HuQ-|9HϜ9{~7 ? pp%:g4R)U;ov!BIKR/ͤ7|౱BH7sXԿ纑E$Z'!ZA/>sw^@P#0 "7y}A~98+C>;v?AΠTkg>;~{o{h!>*XH33@J,Tuyk1ZiDDiHƤi^!2Eh'B8~R<I6 pp:  @J A)!T+rي"·+i$!I4VBiƯ?3Z_~_2!0q<ןY2mDq hcOIhDg_⏤H}w=}w=%?)ki{Zk4"&6kQs(e85k]:MP" hwEf@AH/ MKvrEXi 3?r?aJ~Y [Bʏhs ¶+8YDJj5שcZE,?ߠw̾'E6Q@'WLk!@),9wPB#Z'j={{zΟ$᷄m1HVk,@+IWBm0Ne> 4f)T.4;p}K%L 4:^ţ'^W3 k/8㵽B*SuHirg;Xfj=`Y ea5/50Ix!\w%M,m(` 6HFY, h$dh?=V;Tv:{B>CDIHkhL&0uXf߉w!4]G 3[Ǩ?L * *Gr8}L mmCV9b+?aE﫾ǩ8cwh*ռO0JnX8vכP;6=zzOx,|+X}(< KqNRƪ6[ǏO{Mt|U\1L,h\gl@~꼂1)˙S&hIaJtƹ("c=֥K+ pZ95gZku<8U\!Baz2HJ,5|!$Q%N".[ 濊JZ;~Ǝ .I2@H0b(ɀIZ3FDJ! jc;xb-!x'v0#<AћP67V&6]E);Ifv5`=.oLl!QEuADq)q< I(J[ŕ`-fF u@`7g vTB: 20 Iӈ(!IbKr]F5 HFTj((eЙOa׆=XVm[:FC_Rmj#ewИsjM<;Z +>j6l~v'o o?/,ulv2]fBI1@Ұr6,s?Gt3Ԋ9?;؍#v̑E=0^ aI^aylo)( )>ZYY*k-0|#ӋK^W%x]`+!o Y usylGɢ)=2 mTf!}_]$2*%{MZu)\>=l;Y^yoM{iFQjAD)'eބsֱt)wAk3[y3]vǮJYx(cV O_ mY__1~-b  B9Pu|. 8Iq7dT3|p1 $Y 2B5B7ji.}]vEX ?%r ?d,]5B(,Diꖫt1M faع?vBZ򍅥|[`C`׮'""B_ẓ9q#MUԕBxǮuLGҢTB eU0 izB1{o,z./'M6+IZ&%OZl}TP؉SF1υI u4mF$qYN_dl꽣Gl)4H?7n&Y&04[7ruB!TEHUFlH"RLr lsͬHћ4ll )l#h; [sJD7ʞM#u.PY26U[hALoSZyfFSXN b۲4>VMbd5SwC!æPs]l`ˇY?ݏ?xZۍ~lCߘQcW:RYdSuF|+gya(r~&Yn~v96hy؎jL?B#o5L^u˓_RZfqԴKH"Bona5:f¨7{BmpZV8(1o`h49=x.:YeXm̢lT'ƴflOL IW( BiRVlo0 %ͬ8P.Q<Eg}N[ZoR+tlNsgXץMV i̮۸b$Y#=MӬ&خ DJ }ƕm&Bȼ DA4 e4BIg\r"p I?\s &c5VVRYN ,aئM0NP(PƲdނE0\&)d `+aDQ \k޽PNsz9qσ5_uHE $ k ;TDQ~/! Ftwr;R靏?,}<{Z̛CZCKe`,Qfr3{e7OsCK/md(\:&Fm9'?S4 N~ŋߢ"qA"" _by5"'”(60U2](rYSLɢH4 󗞢S; ec( p0"U3'ݶJ8$}}riZZ9+4ZQ,1q.0]*\l_s5+mObcklξR]Y6PҤXJs_?Z3_f0u/9&ҏc:5$QL{GǹO.1:81f) .cn i~]319:U}KVl a8vˮ> گN(=(sc!Iɲ̡κRwPSivKj-g ^Dr&4 < oU/4Q bR5+Y.Ego<5 wjt ?]IZ'_j^9ol 7xϥ.Gq%Z#Cߏ9_B.*,C∈'H{Ҥ9N)…/g_D"xBO!tTJ9H!@$iNAf-6S)~_ !'W~t*[9 eFeH!9q+*t>q 穔}Zmc ի<8!.(89scyˇP:cUWrʒ|l_4w^P\_W}#50!$M.22O6{OE6Ɍǖ<颔C5z[.~i Jqjo'bUZjЎ٧)eEV?XP.Y݁aX b&оo!}C ׆LVMh^=5+ybfϮ^ueLІzIqNvLw}^^<Υ5C b^]hRR.N(s|Ckyu؅(ro褂6q \EER:%83_NοNSPI74va2C"jݾYXzXЋͥcWsƪ۞p}Cb׽^!- oE+-cWbwl%n~CQAA~wzg_L˙-#ޱu<ǮrrgZ=:QF4t}}cFtaw8GH /E?ǎ'Qt]:^OU_G`KY.e325sד BRj}GVnBt|3I%>"[\by@2= r TN!3&i>.h>~,Q4WV;9,iKxev  Mvs=r;kFk36,ӓ-#eMV~Jcҥ f +!VУewZB)pnu{; mo {oYzHd.o wi&GҤv(d1'lϨM^^4O\*artf(&]j4Ч|H7CV3- `sOh{. J۱t }r|+=&A̢>"!o).޲KmyN>&G? ,B0ifNO)SM9>]2{ON;|KKA6mSS6˜8N [v? ApO˿-$e> %5<$NxT4I":s:F QE{fO 7$ ?ltb[K??_K6Y*,e1dwܶ7)U-N XjJJB .^Dv8x|o"3 LձJ6%Ε"ў|!R-J:dհz+~fbxBmwoZn ǩNֲ yI+nvo)-e !Ȕd _ `v?u47{YU=XV% MS IDAT4 Xf)s+V xd Hۮ06;U¶;TP qted?_fjGQ`1r$ۻFApZ=c -Tv|{]|haz~~gû"ZtGJntM *!7nbΒ`g/P.]QϬ)±CU)3f%::uLõPD)ۮ1י!|IgīmR \=CyLN&uBØrʠ]|5N*a(,eܡMK.Ve(8'ayDh>:>Eu/&ݏ4wo̶v9BWc6SS)ZJi Խ||hVLye++#E!d\v'_51 7mصQmki̘j++7i^Nyd+~8D=]=sCeβG&BfLe!4Pb9GHo?a j1c,_`yQ\HtL'J 1?xj~i`]gyna Q<a|?DreBH6 pRҟv<Lm;)W,1e\? 7a8(eQ&qӡy+tgEHGm׀lwy9ܼBI! eV1cxUlqF޳KI\;b*6:Mqt9׃$驄ckզc21"Jrf $WmzO_3Azcbl6_b֍< 71Жi+VCٌ,ϭ'3w8+Ia_|}n~~t`_iMJ8 R㮼eN 5OJHb0 ="bK'/u42E&^Pυftr8qa.~a=ök ͼ FB1DwAk@</^ukB+a8fpM옛5Բr9&4 $ Ai(%h8|ޑ@q%r<8ͣ\8)헨TvK2IFao'l}p4|M)Q_WBHY.vXIwZw3hś!Gsi5 Ab܍@ǹF=rD06'&HiEݵcK$5vg޳I,+a$i^M_aR?Xc 9m|?Xe7 Vb<7,z4)%) d!$ փ\j+u|=Oƿ7 *f&(i9 þ)@I/p?\D[:¶/eQE9NĿoM#)gp1L*q2 !+`Ngpȋ 6*ekCrաfUo&Ws>04ǘtC%^4{*yz+,`3sdf!}_J~蹘 iUё4od^iT{/<}! ) Na_dO&ALa1J.Ȓ4bYoeBF$2vg4Agc+xqqfF?yNQ}ucAR!B<BJ!+'/ĭ͕3(86n4r<Ѝ/`(gdK0 ,QoSCrIp0e og)r qyc4,⧂cu17Uf'~ʶ0h>=)&-G= N|Rg+ߟ!GO7ބ4PclKKPaGX]--=k*VMVwӥ4qF>|}#\g ۪̦g(e®; Ĕ LSv.Ǘ:a&Ҋ(yvV|^L؟R4e|,iJtp@7`;{cZ#=[*E_a|! MtF]No@(? Jb<ʥ1H\3guƲym!,%ĴІ>]C.Fp$NTݤZhMNm:ŵC U22X\|w|"',b+<4[4Qz?Ϗ6|PƉ a~N/^Yz4r" eФ<}r0oJ]Nx``(73,oYEv!;^xZa6ᇜ$efuL Yywg!kzx;`K'& = oefN ETbal.ӽ2|3p(ʺIq|Cj?D׏ ^xŭlj6Zg7*N'_Lh8ܻ,&M`:ZwaΛYȵM TGy<^3#gC3l4 6yU5VW=Ο&aeZ|E-( R9bsdg&GeUK*oh>ߦ8T?snDj$5 `-l19#!N'.2 E 'g(T&iր]qi`~CG|fw5t~TgCU 2Z?*2%b@]aPRSf$mP˨fi$ZV,^ߛyeSţwyn+Ϸ;˹ \.Z t{sLBZ r@DvCʅX4FhU&P~ oB=Q"VݶypU1%lZ_Tp"`e8Eh<}\5rP!I%vq;^yg>&;"*PxABg) /qdˣqHp-l (?BfDգSo =*XڈLNq/P14J4r|2UAJOb )RV5e$IHi_C8K/=!i/!c tǹ˗! ?. Nzt9,~y2Sm`ZMηologP84XwM!0 vP;Dsf4 o8x{mn@05:.C^3X [d4G|4>AK+᫡m̵.n}!!1"`$nn/̝"N6+1'} fAV>,tϰ@ V^{-gJK=0]T.@ !wFY__ܳGD *U_+ŤT8N$MQa! Y5rqҢS-膼oKMS_w$)Ke|} ?pxefWYkYׇnj$ Rpʜw?aA2AdY ;n00\$${DyoG!T^R}+$k_@H zN~V@qO]f&>wк+'[ թw$iL i w[+RG'x[$eww:ML: vg HbcuT6p:&MY)+W(꒦!CB-(#B #O $"DQ(F&Zޚa?X"ı$~ 6PxIL)p'QB1X~nK쮸lZi.egrV8|w[0hv33?Ol 2M?^(a{,қAAh$FJMpy T1Bp%$ .Y~a X_Px(b%UbDsi&{B$?w.* *IͫB0tsױU>.Eo1|琤"SU-!>Q: :TȳQo( 4*=_ 8aNΚ^i"uIߢsQΫ?LJ /˃,h%((D] 7-\v!3=nd/: Q1V~4q2Xaʬ~44¨°i"f$" ;CҌBE]>KqD(C9Z!<`ù˗h8[-Emm2BD=`j7g:ᔶF]4 H7jZꌪw*R0k)e'>QWs8ǃDRٜ?);i {qȕmk-_G >wvg'փW&>Rv^@?L0X,o߉ e4j:v0lQY!1F^ ά(N/(GD%Zt!YDJ3'߹Tv=F}J" Y"w+Iy?ym3BJʹll"]E>Rz^4{K&6b= K"ZdZӍFb$A.pwv#!a@ujZNIt@W'I|\C?O0= òKZ'P3)xjȷ8{L,@avVH\UBb@G]Gur1KgNN|=̵n%Ay8/(89z.qӵ*?]smE ع$a[Aւ;T!R,uߐs8㾉3i[B,^ 8~>|e/P燄Fk#CI3I]ۅ 4gd:-O#&v~q;UCuB^8U^9sMq2Ӂד]k{yQr^HqR >]""vY\8f^C,.z&ɤh/ZRdݡ??2~h" !M)@`d ɖ>SZE,`I0 U9 WONTr f~МcywZX)6q6W77^3,!(.ZtcvϠ toD5b"yGB}86m=_X7=z.a[y`KX%HWAFv YIJa^?rlTgfz":VУ, ~qwQsV~ӣ +P^Bȑ7TL">D7Ƥ?G0RZX˔oӐI0zK$da/DŽ'wI2@J{z 8 ܚj kvL1cTㇵϭ=А!]b/f:xbs*A)!(W IDAT֨La[PڹR7_jk7SSaXF*c8=QJ}N,6lF AהfNɔ%?2+SSo/wEKfP$:"hs2{BHwci6[ n><aİhq)}k8֚$U)J)/*PȱA)1'R7Ŝ}q_YB~ԎH\\b]VL.qO35|\Ur g 9^c$J`ɻqM1~,0( !İm `4|W? 0ŷxm~ X$M # f$'YY 6]@;0QDaM,,4Ǚu2yĘwFgWp4wˋЪ=ރkPH㖐V-I@zw [EUϟ2Tݴ,vkj JHfR8XIvyco~q%M]`)v/a%ZBa]TJ-g2mr*3,^X]b.ؚֆ?k_=E#i1 jkH}uXc{ni!Cs]&dae.{%rnƦR݃UiOQ*qx:נ%j!K{K hsQ4nhyY,\3EKogJ^9i!AaQDwhv;<.XlSWw4۩'h5fiPM1AvlBQ߼>1":cXO\I6'M gC -M 7-1d.a5dV=/W%I׈un0uB8p*]|=ıu{!Lܢ5rs"[!pQwc6`x@Z||%A 2?m"{.Tlj2gVMړ:X B^ q&$>Ip"H4a:۱m Xd0eH;\7.Qr8it.e\OyϫVN/W\I}7yDt9-qCeZ JZ"KuTYnJ}xN"9NܐQ ͊dB5_|d{ӗml *sDQ{tGvcch:> F*s_'ȕ]3=הUKMQNHÆܝr3A.W,lep<^ yX.ͳwkZRf|LyBq.؇>Mc b1@XY@7~]ftc퍯._}?ئ߈1?e8N>cB`v~Vq",9F/l#WYCtJZt22 5H D Eho&]\4YN6&/M|NҌ7tVwn˴P)yRA=%|sRy'-,d\RT2!6|mXh|DqC?T޲dXʌm,g4,u,'} Q*&MCOw⾙*S1Q!İv m:KMu2]3| CHz&I>qݿF@o s9.QtutEksZHզBSK\N;aعn+xI8ZH-,7z}Շ{fCr]Lͪ'Yeh2\Jdžib |m~9'>F$_Z)*{(O~||Im!;B5̷wm mȼP5"FF!^a,#I|p6Yk¨3*b72un~Ls%!4 35ɔ2I}BQ?ߓqs T+O=N>W}kW87gU.Darg}7 ˲,AƥS~HTuyѼ-f=TƏfsWJ %7id7~ _<|ڵ !پ.sL`Y1zY5F?&оY QccSHa*iNY;T5 ”8ď9Zѱ l qrrI)SO&kFq`&YL7\4$ _hyl7^YUK]Ûmkuf.Պ`٤oyN[ylJ# `qLvd-IKCCX,(]/M1gz~DpyΟ*rM°EX@e8-")/ӟ˛nxc !.QV&#Y᧯pE8[kF[SMZN {M 5mۮITE_`g SYtaOǨ,Ri;ke?Mi:6X~Į1g_/x0ELw")F Nd\MniαQ+1ʬ0}IT4OhFҮ4!NeCAg̃9G.\iл(vqv tD=Ԗl/Wyr4ѵ3~|{/噉agS5ba3YSIsO|R~"6Lse=6M -~?-ZNxxo !w-?2VjXjfF,hFk4ゥj8 e cZ8N_y`K.s%/s!Z“ST=TNPZq'Ď+FZ.$CS$*d LG~X1~Mכ^Dᅮ0+tض.^X!gs gU@km,p㼶hog6.\^I)쉏QmQ*d h k/@J)Jٮ)b&-\Ǧh{W\J%Ԕ5 ^&1]d:ͱ +TBN\B>?F(?KiTHˡ2̷ybz*߿Fެ l2?i >@GSK'zԺO{BX{w!dS3510CުTl C"`1p2~A#NH1K9#l iiJ6| )NP8u8w&:qhoݖ3&ϧDf̶:rNJvQP%Gҋy-WI1al;OX3, t"Qqmel݀"UNxiZ٫ߡ8D&Zq0\"J_eTZ`~̺0mα^=Sh8D&vaո`c}IqY!j!3|oj3k^~Zd6)~ۭQQ )cn]= pd)(8#+Iɝx!:qDYo} %f7Ft6N0ƣpjƞ>yRi\a7ڙ"{7~(lyXMV•q?:vbe/FJwR !L,/Sޥu{ޟ5晴ңPRiLȱxn)+˟1FB~/a{M.pe<0T@6(4FgI< :Wh_c7ydb.u976y\To~Bq|aBq e 6JZaY.qdDO°c\>hfCÞE\-]Z׾M}IڽKt}v4d2?! B~3nnu^h^RʃoOzn3`OdeY\k_4Gqc,igqe܄Cun{prcDQ(jm°cnV0:̖&kH:AiE=oY91@`m=E0RN.5p 3D`djt<\WlϴGqVi/?0$`*B/l(cvWZhqmUKn>"szϢu8װ7'\疑Fk̓91eE\ )jZ)&"aVDR i\K$k~B+"'$Uăx^\~ )m4d0M0ȑRָ>I6ɤ)Mc܊q<$M͇ܧgOmnheuliq$_^ ckVYl !Q*49rԽj\%R< $11\a4Bиbf .}y8_ۭ9HIx6 ?B AH Ft%L4L-BkEI$1BH4_m5n+L$W^;o 2l]h8=V?B~ &8No~\'IedeO2NU#ExY?Z?^=Ų]H '|6Ȫ݈cxةsGYhRo@x[bA?`Wp_F;!n\jEX`9w~ \dϒ$qn=4AZk ]6@?8yboIrqf%5Qme |Ո3raC蚼N)UYU#fڟ%ϢjAē 7~яS[,~8@N&KǨnIys΃ׄ,w:Jv"B|X6ˡ~[1)efݮ!OW2oqOI.24' _՟\vBrK ]ʎón韠\}\!t? pAj ;dnsuūC焐?+Ľjyq|tވre P:ƶ&` ǵ];?B>Wi1Bg'ssK}=G~?8CHn Z:*2mf k[5 ZЬ}߮u-d NIDAT.ܨ<'{3&ق㖛tf1Ro=m{H;|ba )a9`-.t\#jR~jTw||a4ՠV)AzgDZ %E7j|: ĵ"H_wk>6/,ܬD<`vFnKE{ RJGA4i)&`]+ytk6ZI3_|a]oo{ұԶ_J) zӾ @'_%$ɶ|6hX\״v'w٫e{t] XK/r")nC0Fm4t妗g}k7vLΜu|0ZGPfWa\r6 ))ThSq"YK3n8Xš ᵯӣَ~D[w1B(ok_}G8!`1:f BVU#,wh5Ru45soZEK] )Y/bv=w}rrT^Ai2~W5qݔ>w((@w9VW,]ۓhiSW/;n㋥?+ K'¹Wwaku TYDFnyo;qٶa,|a>byu*͉GH~*q1B 4X ʴng}_k //\ҥۺ)&=V=7H[+a9@ay0CS'kBk-Σskߢ4I8QҧAtԌVW ?\\$ H+ApBO&Wt'p"-Gnr@$1X/-0 *ĵ)϶<P*Ne/9徃1X'")!Ia{+_ =ЂWNKo :X\|9\hi.!z<$i60oDm` Id4,F qR,N#diL|n"q2@(-p4GAYïTg 7fx,[lOޕ*w 1tԶ>uKRZ{mx&>ZӦb481I Xʅ F Sy`!3$;4^Q~PtרIncZr֯|g6ONR ,&{Dqvkn91e^Beyruk+LP! [tz;Ca7ô#;"I~ϯ30}8[~^ =|&I[4V 6 &iT`&[ehd0bh~O/11KuwQFC#gPsv3!{i?! v3V)M^Bo8¨`:v׭:IS\튓puj2 ӡtߌoH-~Ĺ}ySnی{8O)@Bou(e* wgRQiv[9h}_8# ׷w qྏ@ڿ ?dۻC=ݕ]3_Kkz->7oB `z?2;bWxk1&:{ho"s_Vk+qp'J4ҲV[ƐWxKm_zGߤ bϞQ ?#F<(YNp1{TZ}L eΟN5}VbǎO=K?fiG1aeodrV]ŋH4,Lŋ/v -ypk)E>dYdF^1 /ӈ(’"ታ~7kGuZ={֏H !Z|:>,ji֩hi[JG9flH25bOV砰~CyF7cZ뼙m^X6o d =@,hkRu*N>|xpo `8z8Lr&ZoSI!@"hb {gR=5'kD" JXBcr\2Їjb-8}ǾW-la [-la [-la [-la [w tռIENDB`XaoS-release-4.3.2/src/ui/main.cpp000066400000000000000000000537541455214672000166700ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "mainwindow.h" #include "filter.h" #include "ui_helper.h" #include "ui.h" #include "param.h" #include "timers.h" #include "plane.h" #include "xthread.h" #include "xerror.h" #include "xmenu.h" #include "grlib.h" #include "i18n.h" /* Command line variables */ int printspeed; int delaytime = 0; int maxframerate = 80; float pixelwidth = 0.0, pixelheight = 0.0; static char *defrender = NULL; static const char *rbasename = "anim"; static int alias = 0; static int slowmode = 0; static char *imgtype; static char *defsize; static float framerate; static int letterspersec = 20; const struct params global_params[] = { {"-delay", P_NUMBER, &delaytime, "Delay screen updates (milliseconds)"}, {"-speedtest", P_SWITCH, &printspeed, "Test speed of calculation loop. Then exit"}, #ifndef nthreads {"-threads", P_NUMBER, &defthreads, "Set number of threads (CPUs) to use"}, #endif {"-maxframerate", P_NUMBER, &maxframerate, "Maximal framerate (0 for unlimited - default)"}, {"", P_HELP, NULL, "Pixel size options: \n\n Knowledge of exact pixel size makes random dot stereogram look better. \n Also is used for choosing correct view area"}, {"-pixelwidth", P_FLOAT, &pixelwidth, "exact size of one pixel in centimeters"}, {"-pixelheight", P_FLOAT, &pixelheight, "exact size of one pixel in centimeters"}, {"", P_HELP, NULL, "Animation rendering:"}, {"-render", P_STRING, &defrender, "Render animation into sequence of .png files"}, {"-basename", P_STRING, &rbasename, "Name for .png files (XaoS will add 4 digit number and extension"}, {"-size", P_STRING, &defsize, "widthxheight"}, {"-renderimage", P_STRING, &imgtype, "256 or truecolor"}, {"-renderframerate", P_FLOAT, &framerate, "framerate"}, {"-antialiasing", P_SWITCH, &alias, "Perform antialiasing (slow, requires quite lot of memory)"}, {"-alwaysrecalc", P_SWITCH, &slowmode, "Always recalculate whole image (slowes down rendering, increases quality)"}, {NULL, 0, NULL, NULL}}; #define MAXPARAMS 40 static const struct params *params[MAXPARAMS]; int nparams; int ui_params_parser(int argc, char **argv) { int i, p = 0, d; int ie = 0; int is; const struct params *par = NULL; int error = 0; int show_help = 0; int found; for (i = 1; i < argc && !error; i++) { found = 0; if (!strcmp("-help", argv[i])) { show_help = 1; break; } for (d = 0; d < nparams; d++) { par = params[d]; for (p = 0; par[p].name != NULL && !error; p++) { if (!strcmp(par[p].name, argv[i])) { found = 1; is = i; switch (par[p].type) { case P_SWITCH: *((int *)par[p].value) = 1; break; case P_NUMBER: { int n; if (i == argc - 1) { x_error("parameter %s requires numeric value.", argv[i]); error = 1; break; } if (sscanf(argv[i + 1], "%i", &n) != 1) { x_error("parameter for %s is not number.", argv[i]); error = 1; break; } *((int *)par[p].value) = n; i++; } break; case P_FLOAT: { float n; if (i == argc - 1) { x_error( "parameter %s requires floating point numeric value.", argv[i]); error = 1; break; } if (sscanf(argv[i + 1], "%f", &n) != 1) { x_error( "parameter for %s is not floating point number.", argv[i]); error = 1; break; } *((float *)par[p].value) = n; i++; } break; case P_STRING: { if (i == argc - 1) { x_error("parameter %s requires string value.", argv[i]); error = 1; break; } i++; *((char **)par[p].value) = *(argv + i); } } ie = i; i = is; } } } if (d == nparams && !found) { i = menu_processargs(i, argc, argv); if (i < 0) { error = 1; break; } else i++; } else i = ie; } if (error) { return 0; } if (show_help) { const char *name[] = {"", "number", "string", "f.point"}; printf(" XaoS " XaoS_VERSION " help text\n\n"); printf("option string param description\n\n"); for (d = 0; d < nparams; d++) { par = params[d]; for (p = 0; par[p].name != NULL; p++) { if (par[p].type == P_HELP) printf("\n%s\n\n", par[p].help); else if (!par[p].type) printf(" %-14s %s\n", par[p].name, par[p].help); else printf(" %-14s %s\n%14s %s\n", par[p].name, name[par[p].type], "", par[p].help); } if (p == 0) printf(" No options available for now\n"); } menu_printhelp(); return 0; } return (1); } void params_register(const struct params *par) { params[nparams++] = par; } int ui_render(void) { if (defrender != NULL) { int imagetype = TRUECOLOR; int width = 640, height = 480; #ifndef STRUECOLOR24 if (imagetype == TRUECOLOR24) imagetype = TRUECOLOR; #endif if (imgtype != NULL) { if (!strcmp("256", imgtype)) imagetype = C256; else if (!strcmp("truecolor", imgtype)) { x_fatalerror("Unknown image type:%s", imgtype); } } if (defsize != NULL && !sscanf(defsize, "%ix%i", &width, &height) && (width <= 0 || height <= 0)) { x_fatalerror("Invalid size (use for example 320x200"); } if (framerate <= 0) framerate = 30; uih_renderanimation(NULL, rbasename, defrender, width, height, pixelwidth, pixelheight, (int)(1000000 / framerate), imagetype, alias, slowmode, letterspersec, NULL); return 1; } return 0; } const char *qt_gettext(const char *context, const char *text) { static std::map, const char *> strings; const char *trans = strings[std::make_pair(context, text)]; if (trans == NULL) { trans = strdup( QCoreApplication::translate(context, text).toStdString().c_str()); strings[std::make_pair(context, text)] = trans; } return trans; } static MainWindow *window; static void ui_unregistermenus(void); void ui_quit(int i) { delete window; xth_uninit(); xio_uninit(); ui_unregistermenus(); uih_unregistermenus(); puts(TR("Message", "Thank you for using XaoS\n")); exit(i); } static void ui_help(struct uih_context */*uih*/) { QDesktopServices::openUrl(QUrl(HELP_URL)); } static void ui_download(struct uih_context */*uih*/) { QDesktopServices::openUrl(QUrl(DOWNLOAD_URL)); } static void ui_fractalinfo(struct uih_context *uih) { QString fractalname = uih->fcontext->currentformula->shortname; bool higherpower = false; for (auto c : fractalname) { if(c >= '0' and c <= '9') { fractalname.remove(c); higherpower = true; } } QMap map; // Dictionary of fractaltype and corresponding wiki hypertext link map["mandel"] = higherpower ? "higher-power-mandelbrots" : "mandelbrot"; fractalname = map.find(fractalname) != map.end() ? map[fractalname] : fractalname; QDesktopServices::openUrl(QUrl(FRACTALINFO_URL + fractalname)); } static void ui_feedback(struct uih_context */*uih*/) { QDesktopServices::openUrl(QUrl(FEEDBACK_URL)); } static void ui_forum(struct uih_context */*uih*/) { QDesktopServices::openUrl(QUrl(FORUM_URL)); } static void ui_about(struct uih_context *uih) { MainWindow *window = nullptr; if (uih->data) window = reinterpret_cast(uih->data); QMessageBox::about( window, TR("Menu", "About"), "" + QCoreApplication::applicationName() + " " + QCoreApplication::applicationVersion() + " (" + QSysInfo::kernelType() + " " + // QSysInfo::kernelVersion() + " " // QSysInfo::buildAbi() + " " + QSysInfo::buildCpuArchitecture() + ", Qt " + QT_VERSION_STR + ")" "
" "Fast interactive real-time fractal zoomer/morpher

" "Original Authors: Jan Hubička and Thomas Marsh
" "Copyright © 1996-2024 XaoS Contributors
" "
" "This program is free software; you can redistribute it and/or modify " "it under the terms of the GNU General Public License as published by " "the Free Software Foundation; either version 2 of the License, or " "(at your option) any later version.

" "This program is distributed in the hope that it will be useful, " "but WITHOUT ANY WARRANTY; without even the implied warranty of " "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public License for more details.

" "You should have received a copy of the GNU General Public License " "along with this program; if not, write to the Free Software " "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA." ); } static void ui_font(struct uih_context *uih) { MainWindow *window = nullptr; if (uih->data) window = reinterpret_cast(uih->data); window->chooseFont(); } void uih_setlanguage(uih_context *c, int l) { const char* menu = lang1(l); uih_updatemenus(c, menu); setLanguage(lang2(l)); QSettings settings; settings.setValue("MainWindow/language", lang2(l)); QMessageBox msgBox; msgBox.setText(TR("Message", "XaoS must restart to change the language.")); #ifndef __wasm msgBox.setInformativeText(TR("Message", "Do you want to quit now?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); #endif int ret = msgBox.exec(); #ifndef __wasm if (ret == QMessageBox::Yes) { exit(0); } #endif } #ifndef Q_OS_MAC static void ui_fullscreensw(struct uih_context *uih) { if (uih->data) { MainWindow *window = reinterpret_cast(uih->data); if (window->isFullScreen()) window->showNormal(); else window->showFullScreen(); } } static int ui_fullscreenselected(struct uih_context *uih) { if (uih->data) { MainWindow *window = reinterpret_cast(uih->data); return window->isFullScreen(); } return 0; } #endif /* WARNING: Increase this number in case there are new menu items added. */ #define MAX_MENUITEMS_I18N 36 /* These variables must be global: */ static menuitem *menuitems; static menuitem menuitems_i18n[MAX_MENUITEMS_I18N]; int ui_no_menuitems_i18n = 0; #define UI (MENUFLAG_NOPLAY | MENUFLAG_NOOPTION) static void ui_unregistermenus(void) { menu_delete(menuitems, NITEMS(menuitems)); menu_delete(menuitems_i18n, ui_no_menuitems_i18n); } QTranslator qtTranslator; QTranslator qtBaseTranslator; QTranslator xaosTranslator; char languageSetting[6] = ""; bool languageSysDefault = true; // please keep the languages in the same order const char *languages1[] = { "__", "cs", "en", "fr", "de", "he", "hi", "hu", "is", "it", "pt", "ro", "ru", "rs", "es", "sv", "tr", "vi" }; const char *languages2[] = { "_____", "cs_CZ", "en_US", "fr_FR", "de_DE", "he_IL", "hi_HI", "hu_HU", "is_IS", "it_IT", "pt_PT", "ro_RO", "ru_RU", "rs_RS", "es_ES", "sv_SV", "tr_TR", "vi_VN" }; const char *lang1(int i) { return languages1[i]; } const char *lang2(int i) { return languages2[i]; } const char* getLanguage() { return languageSetting; } static int ui_languageselected(uih_context *c, int p) { if (c == NULL) return 0; if (languageSysDefault) { return (strcmp(languages2[UIH_LANG_SYS_DEFAULT], languages2[p]) == 0); } return (strcmp(languageSetting, languages2[p]) == 0); } void setLanguage(const char *lang) { if (lang == NULL || strcmp(languages2[UIH_LANG_SYS_DEFAULT], lang) == 0) { languageSysDefault = true; } else { languageSysDefault = false; } qApp->removeTranslator(&qtTranslator); qApp->removeTranslator(&xaosTranslator); QString language = QString(lang); if (language.isNull() || languageSysDefault) { language = QLocale::system().name(); } strcpy(languageSetting, language.toStdString().c_str()); qtTranslator.load("qt_" + language, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); qApp->installTranslator(&qtTranslator); qtBaseTranslator.load(QLocale::system(), QStringLiteral("qtbase_")); qApp->installTranslator(&qtBaseTranslator); xaosTranslator.load("XaoS_" + language, ":/i18n"); qApp->installTranslator(&xaosTranslator); /* Without this some locales (e.g. the Hungarian) replaces "." to "," in numerical format and this will cause an automatic truncation at each parameter at certain places, e.g. drawing a new fractal. */ QLocale::system().setNumberOptions(QLocale::DefaultNumberOptions); setlocale(LC_NUMERIC, "C"); // printf("Language set to %s\n", languageSetting); // fflush(stdout); } static void ui_registermenus_i18n(void) { int no_menuitems_i18n = ui_no_menuitems_i18n; /* This variable must be local. */ #ifndef __wasm MENUINT_I("file", NULL, TR("Menu", "Quit"), "quit", MENUFLAG_INTERRUPT | MENUFLAG_ATSTARTUP, ui_quit, UI); #endif MENUNOP_I("ui", NULL, TR("Menu", "Message Font..."), "font", UI, ui_font); MENUNOP_I("uia", NULL, TR("Menu", "Message Font..."), "font", UI, ui_font); SUBMENU_I("ui", NULL, TR("Menu", "Set Language"), "setlang"); // please keep the languages alphabetically ordered MENUINTRB_I("setlang", NULL, TR("Menu", "System default"), "__", UI, uih_setlanguage, UIH_LANG_SYS_DEFAULT, ui_languageselected); MENUINTRB_I("setlang", NULL, "Czech", "cs", UI, uih_setlanguage, UIH_LANG_CS, ui_languageselected); MENUINTRB_I("setlang", NULL, "English", "en", UI, uih_setlanguage, UIH_LANG_EN, ui_languageselected); MENUINTRB_I("setlang", NULL, "French", "fr", UI, uih_setlanguage, UIH_LANG_FR, ui_languageselected); MENUINTRB_I("setlang", NULL, "German", "de", UI, uih_setlanguage, UIH_LANG_DE, ui_languageselected); MENUINTRB_I("setlang", NULL, "Hebrew", "he", UI, uih_setlanguage, UIH_LANG_HE, ui_languageselected); MENUINTRB_I("setlang", NULL, "Hindi", "hi", UI, uih_setlanguage, UIH_LANG_HI, ui_languageselected); MENUINTRB_I("setlang", NULL, "Hungarian", "hu", UI, uih_setlanguage, UIH_LANG_HU, ui_languageselected); MENUINTRB_I("setlang", NULL, "Icelandic", "is", UI, uih_setlanguage, UIH_LANG_IS, ui_languageselected); MENUINTRB_I("setlang", NULL, "Italian", "it", UI, uih_setlanguage, UIH_LANG_IT, ui_languageselected); MENUINTRB_I("setlang", NULL, "Portuguese", "pt", UI, uih_setlanguage, UIH_LANG_PT, ui_languageselected); MENUINTRB_I("setlang", NULL, "Romanian", "ro", UI, uih_setlanguage, UIH_LANG_RO, ui_languageselected); MENUINTRB_I("setlang", NULL, "Russian", "ru", UI, uih_setlanguage, UIH_LANG_RU, ui_languageselected); MENUINTRB_I("setlang", NULL, "Serbian", "rs", UI, uih_setlanguage, UIH_LANG_RS, ui_languageselected); MENUINTRB_I("setlang", NULL, "Spanish", "es", UI, uih_setlanguage, UIH_LANG_ES, ui_languageselected); MENUINTRB_I("setlang", NULL, "Swedish", "sv", UI, uih_setlanguage, UIH_LANG_SV, ui_languageselected); MENUINTRB_I("setlang", NULL, "Turkish", "tr", UI, uih_setlanguage, UIH_LANG_TR, ui_languageselected); MENUINTRB_I("setlang", NULL, "Vietnamese", "vi", UI, uih_setlanguage, UIH_LANG_VI, ui_languageselected); MENUSEPARATOR_I("ui"); MENUSEPARATOR_I("uia"); #ifndef Q_OS_MACOS MENUNOPCB_I("ui", NULL, TR("Menu", "Fullscreen"), "fullscreen", UI, ui_fullscreensw, ui_fullscreenselected); MENUNOPCB_I("uia", NULL, TR("Menu", "Fullscreen"), "fullscreena", UI, ui_fullscreensw, ui_fullscreenselected); #endif MENUNOP_I("helpmenu", "h", TR("Menu", "Help"), "help", MENUFLAG_INCALC, ui_help); MENUNOP_I("helpmenu", NULL, TR("Menu", "Info on current fractal"), "fractalinfo", MENUFLAG_INCALC, ui_fractalinfo); MENUNOP_I("helpmenu", NULL, TR("Menu", "Send Feedback"), "feedback", MENUFLAG_INCALC, ui_feedback); MENUNOP_I("helpmenu", NULL, TR("Menu", "Get Updates"), "updates", MENUFLAG_INCALC, ui_download); MENUNOP_I("helpmenu", NULL, TR("Menu", "User Forum"), "forum", MENUFLAG_INCALC, ui_forum); MENUSEPARATOR_I("helpmenu"); MENUNOP_I("helpmenu", NULL, TR("Menu", "About"), "about", UI, ui_about); no_menuitems_i18n -= ui_no_menuitems_i18n; menu_add(&(menuitems_i18n[ui_no_menuitems_i18n]), no_menuitems_i18n); ui_no_menuitems_i18n += no_menuitems_i18n; if (ui_no_menuitems_i18n > MAX_MENUITEMS_I18N) { fprintf(stderr, "MAX_MENUITEMS_I18N is set to an insufficiently low number, please increase it to %d\n", ui_no_menuitems_i18n); fflush(stderr); exit(1); } #ifdef DEBUG printf("Filled %d ui menu items out of %d.\n", ui_no_menuitems_i18n, MAX_MENUITEMS_I18N); #endif } int main(int argc, char *argv[]) { #ifdef _WIN32 // On Windows, attach to parent console to allow command-line output if (AttachConsole(ATTACH_PARENT_PROCESS)) { freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); } #endif QCoreApplication::setApplicationName("XaoS"); QCoreApplication::setApplicationVersion(XaoS_VERSION); QCoreApplication::setOrganizationName("XaoS Project"); QCoreApplication::setOrganizationDomain("xaos.sourceforge.net"); QApplication app(argc, argv); xio_init(argv[0]); signal(SIGFPE, SIG_IGN); srand(time(NULL)); QSettings settings; char *l = new char[6]; strcpy(l, settings.value("MainWindow/language").toString().toStdString().c_str()); if (strlen(l) >= 2) { setLanguage(l); } else { setLanguage(NULL); } params_register(global_params); uih_registermenudialogs_i18n(); /* Internationalized dialogs. */ /* Dialogs must be generated before menus because menu items link to dialog pointers. */ uih_registermenus_i18n(); /* Internationalized menus. */ uih_registermenus(); ui_registermenus_i18n(); /* Internationalized menus. */ if (!ui_params_parser(argc, argv)) { ui_unregistermenus(); uih_unregistermenus(); xio_uninit(); exit(-1); } if (defthreads == 0) { // defthreads will be 0 if -threads command line option was not given // so load it from saved settings instead defthreads = settings.value("MainWindow/threadCount", 1).toInt(); } else { // -threads command line option was given, so save it to settings settings.setValue("MainWindow/threadCount", defthreads); } xth_init(defthreads); int i = ui_render(); if (i) { ui_unregistermenus(); uih_unregistermenus(); xio_uninit(); exit(i - 1); } window = new MainWindow(); window->eventLoop(); return 0; } XaoS-release-4.3.2/src/ui/mainwindow.cpp000066400000000000000000001603721455214672000201130ustar00rootroot00000000000000#include #include #include #include #include "mainwindow.h" #include "fractalwidget.h" #include "customdialog.h" #include "ui.h" #include "ui_helper.h" #include "timers.h" #include "i18n.h" #include "xerror.h" #include "filter.h" #include "xthread.h" #ifdef __EMSCRIPTEN__ #include #include #include #include #endif void MainWindow::printSpeed() { int c = 0; int x, y = 0; int linesize = uih->image->bytesperpixel * uih->image->height; int size = linesize * uih->image->height; showStatus("Preparing for speedtest"); uih->passfunc = NULL; tl_sleep(1000000); for (c = 0; c < 5; c++) widget->repaint(); QCoreApplication::processEvents(QEventLoop::AllEvents); showStatus("Measuring display speed"); tl_sleep(1000000); tl_update_time(); tl_reset_timer(maintimer); c = 0; while (tl_lookup_timer(maintimer) < 5000000) { widget->repaint(); QCoreApplication::processEvents(QEventLoop::AllEvents); tl_update_time(); c++; } x_message("Driver speed: %g FPS (%.4f MBPS)", c / 5.0, c * (double)size / 5.0 / 1024 / 1024); showStatus("Measuring memcpy speed"); for (c = 0; c < 5; c++) { for (x = 0; x < uih->image->height; x++) memcpy(uih->image->currlines[y], uih->image->oldlines[y], linesize); } tl_update_time(); tl_reset_timer(maintimer); c = 0; while (tl_lookup_timer(maintimer) < 5000000) { for (x = 0; x < uih->image->height; x++) memcpy(uih->image->currlines[y], uih->image->oldlines[y], linesize); tl_update_time(), c++; } x_message("Memcpy speed: %g FPS (%.4f MBPS)", c / 5.0, c * (double)size / 5.0 / 1024 / 1024); showStatus("Measuring missaligned memcpy speed"); tl_update_time(); tl_reset_timer(maintimer); c = 0; while (tl_lookup_timer(maintimer) < 5000000) { for (x = 0; x < uih->image->height; x++) memcpy(uih->image->currlines[y] + 1, uih->image->oldlines[y] + 2, linesize - 2); tl_update_time(), c++; } x_message("Missaligned memcpy speed: %g FPS (%.4f MBPS)", c / 5.0, c * (double)size / 5.0 / 1024 / 1024); showStatus("Measuring size6 memcpy speed"); tl_update_time(); tl_reset_timer(maintimer); c = 0; while (tl_lookup_timer(maintimer) < 5000000) { int x, y; for (y = 0; y < uih->image->height; y++) for (x = 0; x < linesize - 6; x += 6) { memcpy(uih->image->currlines[y] + x, uih->image->oldlines[y] + x, 6); } tl_update_time(), c++; } x_message("Size 6 memcpy speed: %g FPS (%.4f MBPS)", c / 5.0, c * (double)size / 5.0 / 1024 / 1024); widget->repaint(); showStatus("Measuring calculation speed"); speed_test(uih->fcontext, uih->image); showStatus("Measuring new image calculation loop"); uih_prepare_image(uih); tl_update_time(); tl_reset_timer(maintimer); for (c = 0; c < 5; c++) uih_newimage(uih), uih->fcontext->version++, uih_prepare_image(uih); widget->repaint(); x_message("New image caluclation took %g seconds (%.2g fps)", tl_lookup_timer(maintimer) / 5.0 / 1000000.0, 5000000.0 / tl_lookup_timer(maintimer)); tl_update_time(); for (c = 0; c < 5; c++) uih_animate_image(uih), uih_prepare_image(uih), c++; c = 0; tl_update_time(); tl_reset_timer(maintimer); showStatus("Measuring zooming algorithm loop"); while (tl_lookup_timer(maintimer) < 5000000) uih_animate_image(uih), uih_prepare_image(uih), tl_update_time(), c++; x_message("Approximation loop speed: %g FPS", c / 5.0); ui_quit(0); } void MainWindow::menuActivate(const menuitem *item, dialogparam *d) { if (item == NULL) return; if (item->type == MENU_SUBMENU) { popupMenu(item->shortname); return; } else { if (menu_havedialog(item, uih) && d == NULL) { showDialog(item->shortname); return; } if (uih->incalculation && !(item->flags & MENUFLAG_INCALC)) { menu_addqueue(item, d); if (item->flags & MENUFLAG_INTERRUPT) uih_interrupt(uih); return; } if (item->flags & MENUFLAG_CHECKBOX) { char s[256]; uih_updatestatus(uih); widget->repaint(); if (!menu_enabled(item, uih)) sprintf(s, TR("Message", "Enabling: %s. "), item->name); else sprintf(s, TR("Message", "Disabling: %s. "), item->name); uih_message(uih, s); } else uih_message(uih, item->name); uih_saveundo(uih); menu_activate(item, uih, d); if (d != NULL) menu_destroydialog(item, d, uih); } } void MainWindow::processQueue() { const menuitem *item; dialogparam *d; if (uih->incalculation) return; while ((item = menu_delqueue(&d)) != NULL) { menuActivate(item, d); } } int MainWindow::processKey(int key) { int sym = tolower(key); if (sym == ' ') { uih->display = 1; if (uih->play) { if (uih->incalculation) { uih_updatestatus(uih); widget->repaint(); } else { uih_skipframe(uih); showStatus(TR("Message", "Skipping, please wait...")); } } } else { char mkey[2]; mkey[0] = key; mkey[1] = 0; const menuitem *item; item = menu_findkey(mkey, uih->menuroot); if (item == NULL) { mkey[0] = sym; item = menu_findkey(mkey, uih->menuroot); } if (item != NULL) { dialogparam *p = NULL; if (menu_havedialog(item, uih)) { const menudialog *d = menu_getdialog(uih, item); int mousex, mousey; mousex = widget->mousePosition().x(); mousey = widget->mousePosition().y(); if (d[0].question != NULL && d[1].question == NULL && d[0].type == DIALOG_COORD) { p = (dialogparam *)malloc(sizeof(dialogparam)); uih_screentofractalcoord(uih, mousex, mousey, p->dcoord, p->dcoord + 1); } } menuActivate(item, p); } } processQueue(); return 0; } #define KEYLEFT 1 #define KEYRIGHT 2 #define KEYUP 4 #define KEYDOWN 8 bool MainWindow::processArrows(int *counter, const char *text, int speed, int keys, int lastkeys, int down, int up, bool tenskip, int min, int max) { static int pid = -1; bool changed = false; if (tl_lookup_timer(arrowtimer) > 1000000) tl_reset_timer(arrowtimer); if ((keys & up) && !(lastkeys & up)) { (*counter)++; tenskip = false; changed = true; tl_reset_timer(arrowtimer); } if ((keys & down) && !(lastkeys & down)) { (*counter)--; tenskip = false; changed = true; tl_reset_timer(arrowtimer); } while (tl_lookup_timer(arrowtimer) > speed * FRAMETIME) { tl_slowdown_timer(arrowtimer, speed * FRAMETIME); if (keys & up) { if (tenskip && !(*counter % 10)) (*counter) += 10; else (*counter)++; changed = true; } if (keys & down) { if (tenskip && !(*counter % 10)) (*counter) -= 10; else (*counter)--; changed = true; } } if (changed) { if (*counter > max) *counter = max; if (*counter < min) *counter = min; char str[80]; sprintf(str, text, *counter); uih_rmmessage(uih, pid); pid = uih_message(uih, str); } return changed; } #define ROTATESPEEDUP 30 void MainWindow::processEvents(bool wait) { char str[80]; static int spid; QCoreApplication::processEvents(wait ? QEventLoop::WaitForMoreEvents : QEventLoop::AllEvents); static bool dirty = false; static int lastkey; static int maxiter; int mousex = widget->mousePosition().x(); int mousey = widget->mousePosition().y(); int buttons = mouseButtons(); int key = keyCombination(); tl_update_time(); assert(!((key) & ~(KEYLEFT | KEYRIGHT | KEYUP | KEYDOWN)) && !((buttons) & ~(BUTTON1 | BUTTON2 | BUTTON3))); uih_update(uih, mousex, mousey, buttons); if (uih->play) { processArrows(&uih->letterspersec, TR("Message", "Letters per second %i "), 2, key, lastkey, KEYLEFT, KEYRIGHT, false, 1, INT_MAX); return; } if (!uih->cycling) { if (uih->rotatemode == ROTATE_CONTINUOUS) { static int rpid; if (key == KEYRIGHT) uih->rotationspeed += ROTATESPEEDUP * tl_lookup_timer(maintimer) / 1000000.0; else if (key == KEYLEFT) uih->rotationspeed -= ROTATESPEEDUP * tl_lookup_timer(maintimer) / 1000000.0; if (key & (KEYLEFT | KEYRIGHT)) { uih_rmmessage(uih, rpid); sprintf( str, TR("Message", "Rotation speed:%2.2f degrees per second "), (float)uih->rotationspeed); rpid = uih_message(uih, str); } tl_reset_timer(maintimer); } else { if (!dirty) maxiter = uih->fcontext->maxiter; if (processArrows(&maxiter, TR("Message", "Iterations: %i "), 1, key, lastkey, KEYLEFT, KEYRIGHT, false, 1, INT_MAX) || (key & (KEYLEFT | KEYRIGHT))) { dirty = true; lastkey = key; return; } } } if (dirty) { if (uih->incalculation) uih_interrupt(uih); else { uih_setmaxiter(uih, maxiter); dirty = false; } } if (uih->cycling) { if (processArrows(&uih->cyclingspeed, TR("Message", "Cycling speed: %i "), 1, key, lastkey, KEYLEFT, KEYRIGHT, 0, -1000000, INT_MAX)) { uih_setcycling(uih, uih->cyclingspeed); } } if (tl_lookup_timer(maintimer) > FRAMETIME || buttons) { double mul1 = tl_lookup_timer(maintimer) / FRAMETIME; double su = 1 + (SPEEDUP - 1) * mul1; if (su > 2 * SPEEDUP) su = SPEEDUP; tl_reset_timer(maintimer); if (key & KEYUP) uih->speedup *= su, uih->maxstep *= su; else if (key & KEYDOWN) uih->speedup /= su, uih->maxstep /= su; if (key & (KEYUP | KEYDOWN)) { sprintf(str, TR("Message", "speed:%2.2f "), (double)uih->speedup * (1.0 / STEP)); uih_rmmessage(uih, spid); spid = uih_message(uih, str); } } lastkey = key; return; } struct image *MainWindow::makeImage(int width, int height) { struct palette *palette; union paletteinfo info; info.truec.rmask = 0xff0000; info.truec.gmask = 0x00ff00; info.truec.bmask = 0x0000ff; palette = createpalette(0, 0, TRUECOLOR, 0, 0, NULL, NULL, NULL, NULL, &info); if (!palette) { x_error(TR("Error", "Can not create palette")); x_error(TR("Error", "XaoS is out of memory.")); ui_quit(-1); } struct image *image = create_image_qt(width, height, palette, pixelwidth, pixelheight); if (!image) { x_error(TR("Error", "Can not create image")); x_error(TR("Error", "XaoS is out of memory.")); ui_quit(-1); } widget->setImage(image); return image; } void MainWindow::resizeImage(int width, int height) { /* Prevent crash on startup for Mac OS X */ if (!uih) return; if (uih->incalculation) { uih_interrupt(uih); return; } uih_clearwindows(uih); uih_stoptimers(uih); uih_cycling_stop(uih); uih_savepalette(uih); assert(width > 0 && width < 65000 && height > 0 && height < 65000); if (width != uih->image->width || height != uih->image->height) { destroy_image(uih->image); destroypalette(uih->palette); struct image *image = makeImage(width, height); if (!uih_updateimage(uih, image)) { x_error(TR("Error", "Can not allocate tables")); x_error(TR("Error", "XaoS is out of memory.")); ui_quit(-1); } tl_process_group(syncgroup, NULL); tl_reset_timer(maintimer); tl_reset_timer(arrowtimer); uih_newimage(uih); } uih_newimage(uih); uih_restorepalette(uih); uih->display = 1; uih_cycling_continue(uih); } xio_pathdata configfile; void MainWindow::eventLoop() { QTimer eventTimer; eventTimer.setTimerType(Qt::PreciseTimer); connect(&eventTimer, &QTimer::timeout, this, [=]() { int inmovement = 1; widget->setCursor(uih->play ? Qt::ForbiddenCursor : Qt::CrossCursor); if (uih->display) { uih_prepare_image(uih); uih_updatestatus(uih); widget->repaint(); showStatus(""); } int time = tl_process_group(syncgroup, nullptr); if (time != -1) { if (!inmovement && !uih->inanimation) { if (time > 1000000 / 50) time = 1000000 / 50; if (time > delaytime) { QThread::usleep(time - delaytime); tl_update_time(); } } inmovement = 1; } if (delaytime || maxframerate) { tl_update_time(); time = tl_lookup_timer(loopt); tl_reset_timer(loopt); time = 1000000 / maxframerate - time; if (time < delaytime) time = delaytime; if (time) { QThread::usleep(time); tl_update_time(); } } processQueue(); processEvents(!inmovement && !uih->inanimation); inmovement = 0; if (shouldResize) { resizeImage(widget->size().width(), widget->size().height()); shouldResize = false; } }); // Start the event timer eventTimer.start(0); // Enter the Qt event loop QCoreApplication::exec(); } void MainWindow::updateMenus(const char *name) { const struct menuitem *item; if (name == NULL) { buildMenu(uih->menuroot); return; } item = menu_findcommand(name); if (item == NULL) return; if (item->flags & (MENUFLAG_CHECKBOX | MENUFLAG_RADIO)) { toggleMenu(name); } } void ui_updatemenus(struct uih_context *uih, const char *name) { if (uih->data) { MainWindow *window = reinterpret_cast(uih->data); window->updateMenus(name); } } int MainWindow::showProgress(int display, const char *text, float percent) { char str[80]; processEvents(false); if (!uih->play) { if (uih->display) { if (nthreads == 1) uih_drawwindows(uih); widget->repaint(); uih_cycling_continue(uih); display = 1; } if (!uih->interruptiblemode && !uih->play) { if (display) { if (percent) sprintf(str, "%s %3.2f%% ", text, (double)percent); else sprintf(str, "%s ", text); showStatus(str); } } } return 0; } static int ui_passfunc(struct uih_context *uih, int display, const char *text, float percent) { if (uih->data) { MainWindow *window = reinterpret_cast(uih->data); return window->showProgress(display, text, percent); } return 0; } void MainWindow::pleaseWait() { char s[100]; if (uih->play) return; widget->setCursor(Qt::WaitCursor); sprintf(s, TR("Message", "Please wait while calculating %s"), uih->fcontext->currentformula->name[!uih->fcontext->mandelbrot]); showStatus(s); } static void ui_message(struct uih_context *uih) { if (uih->data) { MainWindow *window = reinterpret_cast(uih->data); window->pleaseWait(); } } void MainWindow::chooseFont() { QFontDialog *fontDialog = new QFontDialog(this); QSettings settings; QFont qfont(settings.value("MainWindow/messageFontFamily").toString(), settings.value("MainWindow/messageFontSize").toInt()); fontDialog->setCurrentFont(qfont); connect(fontDialog, &QFontDialog::fontSelected, [=](const QFont &messageFont) { QSettings settings; settings.setValue("MainWindow/messageFontFamily", messageFont.family()); settings.setValue("MainWindow/messageFontSize", messageFont.pointSize()); uih->font = (void *) &messageFont; }); fontDialog->open(); } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { menuBarRef = menuBar(); setWindowTitle(QCoreApplication::applicationName()); setMouseTracking(true); widget = new FractalWidget(); setCentralWidget(widget); readSettings(); widget->setCursor(Qt::WaitCursor); showStatus("Initializing. Please wait."); show(); QScreen *screen = windowHandle()->screen(); if (!pixelwidth) pixelwidth = 2.54 / screen->physicalDotsPerInchX(); if (!pixelheight) pixelheight = 2.54 / screen->physicalDotsPerInchY(); int width = widget->size().width(); int height = widget->size().height(); struct image *image = makeImage(width, height); uih = uih_mkcontext(PIXELSIZE, image, ui_passfunc, ui_message, ui_updatemenus); uih->data = this; uih->font = &messageFont; buildMenu(uih->menuroot); uih->fcontext->version++; uih_newimage(uih); QSettings settings; // Try to load a catalog for the current language and if it doesn't exist, // default to English. Fixes "No catalog loaded" messages on tutorials // when using a language XaoS doesn't support //if (!uih_loadcatalog(uih, QLocale::system().name().left(2).toUtf8())) if (!uih_loadcatalog(uih, QString(getLanguage()).left(2).toUtf8())) uih_loadcatalog(uih, "en"); tl_update_time(); maintimer = tl_create_timer(); arrowtimer = tl_create_timer(); loopt = tl_create_timer(); tl_reset_timer(maintimer); tl_reset_timer(arrowtimer); if (getenv("HOME") != NULL) { char home[256], *env = getenv("HOME"); int maxsize = 255 - (int)strlen(CONFIGFILE) - 1; /*Avoid buffer overflow */ int i; for (i = 0; i < maxsize && env[i]; i++) home[i] = env[i]; home[i] = 0; xio_addfname(configfile, home, CONFIGFILE); } else xio_addfname(configfile, XIO_EMPTYPATH, CONFIGFILE); xio_file f = xio_ropen(configfile); /*load the configuration file */ if (f != XIO_FAILED) { uih_load(uih, f, configfile); if (uih->errstring) { x_error("Configuration file %s load failed", configfile); uih_printmessages(uih); x_error("Hint: try to remove it"); ui_quit(1); } } const menuitem *item; dialogparam *d; while ((item = menu_delqueue(&d)) != NULL) { uih_saveundo(uih); menu_activate(item, uih, d); } char welcome[80]; sprintf(welcome, TR("Message", "Welcome to XaoS version %s"), XaoS_VERSION); uih_message(uih, welcome); if (printspeed) printSpeed(); #ifdef __EMSCRIPTEN__ // Obtain a command via URL: emscripten::val location = emscripten::val::global("location"); auto href = location["href"].as(); int q = href.find("?"); if (q == std::string::npos) { return; // No command was started with "?", stop and return. } auto command = href.substr(q + 1); if (command.length() == 0) { return; // No command was given, stop and return. } // std::cerr << "command = " << command << "\n"; // Manual url_decode: const char *src = command.c_str(); char *dst = new char[command.length() + 1]; char *com = dst; // Taken from https://stackoverflow.com/questions/2673207/c-c-url-decode-library char a, b; while (*src) { if ((*src == '%') && ((a = src[1]) && (b = src[2])) && (isxdigit(a) && isxdigit(b))) { if (a >= 'a') a -= 'a'-'A'; if (a >= 'A') a -= ('A' - 10); else a -= '0'; if (b >= 'a') b -= 'a'-'A'; if (b >= 'A') b -= ('A' - 10); else b -= '0'; *dst++ = 16*a+b; src+=3; } else if (*src == '+') { *dst++ = ' '; src++; } else { *dst++ = *src++; } } *dst++ = '\0'; // printf("command = %s\n", com); uih_loadstr(uih, com); #endif } MainWindow::~MainWindow() { uih_cycling_off(uih); uih_freecatalog(uih); uih_freecontext(uih); tl_free_timer(maintimer); tl_free_timer(arrowtimer); tl_free_timer(loopt); // Sometimes the image pointer is set to to 0xFEEEFEEEFEEEFEEE when we get // here and it crashes without this guard. Not sure why. Possibly // related to https://sourceforge.net/p/mingw-w64/bugs/727/ if (uih->image != (image *)0xFEEEFEEEFEEEFEEE) { destroypalette(uih->image->palette); destroy_image(uih->image); } } void MainWindow::readSettings() { QSettings settings; restoreGeometry(settings.value("MainWindow/geometry").toByteArray()); restoreState(settings.value("MainWindow/windowState").toByteArray()); QString fontFamily = settings .value("MainWindow/messageFontFamily", QApplication::font().family()) .toString(); int fontSize = settings .value("MainWindow/messageFontSize", 12) .toInt(); messageFont = QFont(fontFamily, fontSize); } void MainWindow::writeSettings() { QSettings settings; settings.setValue("MainWindow/geometry", saveGeometry()); settings.setValue("MainWindow/windowState", saveState()); } void MainWindow::closeEvent(QCloseEvent *) { writeSettings(); ui_quit(0); } QKeySequence::StandardKey MainWindow::keyForItem(const QString &name) { if (name == "initstate") return QKeySequence::New; if (name == "loadpos") return QKeySequence::Open; if (name == "savepos") return QKeySequence::Save; if (name == "quit") return QKeySequence::Quit; if (name == "undo") return QKeySequence::Undo; if (name == "redo") return QKeySequence::Redo; if (name == "fullscreen" || name == "fullscreena") return QKeySequence::FullScreen; if (name == "interrupt") return QKeySequence::Cancel; if (name == "recalculate") return QKeySequence::Refresh; if (name == "help") return QKeySequence::HelpContents; if (name == "copyurl") return QKeySequence::Copy; if (name == "saveimg") return QKeySequence::SaveAs; if (name == "fractalinfo") return QKeySequence::WhatsThis; if (name == "autopilot") return QKeySequence::ZoomIn; return QKeySequence::UnknownKey; } void MainWindow::buildMenu(const char *name) { menuBarRef->clear(); foreach (QAction *action, actions()) removeAction(action); const menuitem *item; for (int i = 0; (item = menu_item(name, i)) != NULL; i++) { if (item->type == MENU_SUBMENU) { QMenu *menu = menuBarRef->addMenu(QString(item->name)); buildMenu(item->shortname, menu, false); } } } void MainWindow::buildMenu(const char *name, QMenu *parent, bool numbered) { QActionGroup *group = 0; connect(parent, SIGNAL(aboutToShow()), SLOT(updateMenuCheckmarks())); const menuitem *item; for (int i = 0, n = 0; (item = menu_item(name, i)) != NULL; i++) { QString itemName(item->name); if (numbered) { char c; if (n < 9) c = n + '1'; else if (n == 9) c = '0'; else c = 'A' + n - 10; itemName = QString::asprintf("&%c ", c) + itemName; if (item->type != MENU_SEPARATOR) n++; } if (item->type == MENU_DIALOG || item->type == MENU_CUSTOMDIALOG) itemName += "..."; if (item->type == MENU_SEPARATOR) { parent->addSeparator(); } else if (item->type == MENU_SUBMENU) { QMenu *menu = parent->addMenu(itemName); buildMenu(item->shortname, menu, numbered); } else { QAction *action = new QAction(itemName, parent); action->setShortcuts(keyForItem(item->shortname)); action->setObjectName(item->shortname); if (item->flags & (MENUFLAG_RADIO | MENUFLAG_CHECKBOX)) { action->setCheckable(true); action->setChecked(menu_enabled(item, uih)); if (item->flags & MENUFLAG_RADIO) { if (!group) group = new QActionGroup(parent); action->setActionGroup(group); } } connect(action, SIGNAL(triggered()), this, SLOT(activateMenuItem())); parent->addAction(action); if (action->shortcut() != QKeySequence::UnknownKey) addAction( action); // so that shortcuts work when menubar is hidden } } } void MainWindow::popupMenu(const char *name) { QMenu *menu = new QMenu(this); buildMenu(name, menu, true); menu->exec(QCursor::pos()); delete menu; } void MainWindow::toggleMenu(const char *name) { const menuitem *item = menu_findcommand(name); QAction *action = menuBarRef->findChild(name); if (action) action->setChecked(menu_enabled(item, uih)); } void MainWindow::activateMenuItem() { QAction *action = qobject_cast(sender()); const menuitem *item = menu_findcommand(action->objectName().toUtf8()); menuActivate(item, NULL); } void MainWindow::updateMenuCheckmarks() { QMenu *menu = qobject_cast(sender()); foreach (QAction *action, menu->actions()) { if (action->isCheckable()) { const menuitem *item = menu_findcommand(action->objectName().toUtf8()); action->setChecked(menu_enabled(item, uih)); } } } struct palette *gradientpal; QSpinBox *seedno, *algono, *shiftno; QLabel *img; void MainWindow::updateVisualiser() { // Get updated Colors int colors[101][3]; getPaletteColor(gradientpal, seedno->value(), algono->value()-1 < 0? 0:algono->value()-1, shiftno->value(), colors); // Load Curve QImage palImage(100, 1, QImage::Format_RGB32); // Fill Curve for(int i=0;i<100;i++) { QRgb value = qRgb(colors[i][0], colors[i][1], colors[i][2]); palImage.setPixelColor(i, 0, value); } // Save Result QPixmap newImage = QPixmap::fromImage(palImage.scaled(algono->width(), algono->height())); img->setPixmap(newImage); } unsigned char newColors[32][3]; void MainWindow::colorPicker() { QPushButton* button = qobject_cast(sender()); int idx = button->objectName().toInt(); QColorDialog* qColorDialog = new QColorDialog(this); QColor currentColor(newColors[idx][0], newColors[idx][1], newColors[idx][2]); qColorDialog->setCurrentColor(currentColor); qColorDialog->setModal(false); connect(qColorDialog, &QColorDialog::colorSelected, qColorDialog, [=](const QColor &color) { QPalette pal = button->palette(); button->setAutoFillBackground(true); pal.setColor(QPalette::Button, color); button->setPalette(pal); button->update(); newColors[idx][0] = color.red(); newColors[idx][1] = color.green(); newColors[idx][2] = color.blue(); }); qColorDialog->open(); } void MainWindow::showDialog(const char *name) { const menuitem *item = menu_findcommand(name); if (!item) return; const menudialog *dialog = menu_getdialog(uih, item); if (!dialog) return; int nitems; for (nitems = 0; dialog[nitems].question; nitems++) ; if (nitems == 1 && (dialog[0].type == DIALOG_IFILE || dialog[0].type == DIALOG_OFILE)) { QString filter = QString("*.%1").arg(QFileInfo(dialog[0].defstr).completeSuffix()); QSettings settings; QString fileLocation = settings.value("MainWindow/lastFileLocation", QDir::homePath()) .toString(); if (dialog[0].type == DIALOG_IFILE) { // fileName = QFileDialog::getOpenFileName(this, item->name, fileLocation, filter); QFileDialog *qFileDialog = new QFileDialog(this); // qFileDialog->setWindowTitle(dialog->question); qFileDialog->setWindowTitle(item->name); qFileDialog->setDirectory(fileLocation); qFileDialog->setNameFilter(filter); connect(qFileDialog, &QFileDialog::fileSelected, [=](const QString &value) { QString fileName = value; if (!fileName.isNull()) { QString ext = "." + QFileInfo(dialog[0].defstr).suffix(); if (!fileName.endsWith(".xpf") and !fileName.endsWith(".png") and !fileName.endsWith(ext)) fileName += ext; dialogparam *param = (dialogparam *)malloc(sizeof(dialogparam)); param->dstring = strdup(fileName.toUtf8()); menuActivate(item, param); QSettings settings; settings.setValue("MainWindow/lastFileLocation", QFileInfo(fileName).absolutePath()); } }); qFileDialog->open(); } else if (dialog[0].type == DIALOG_OFILE) { char defname[256]; strcpy(defname, QDir(fileLocation).filePath(dialog[0].defstr).toUtf8()); char *split = strchr(defname, '*'); *split = 0; strcpy(defname, xio_getfilename(defname, split + 1)); // fileName = QFileDialog::getSaveFileName(this, item->name, defname, filter); QFileDialog *qFileDialog = new QFileDialog(this); qFileDialog->setWindowTitle(item->name); qFileDialog->setDirectory(fileLocation); qFileDialog->setNameFilter(filter); qFileDialog->setAcceptMode(QFileDialog::AcceptSave); connect(qFileDialog, &QFileDialog::fileSelected, [=](const QString &value) { QString fileName = value; if (!fileName.isNull()) { QString ext = "." + QFileInfo(dialog[0].defstr).suffix(); if (!fileName.endsWith(".xpf") and !fileName.endsWith(".png") and !fileName.endsWith(ext)) fileName += ext; dialogparam *param = (dialogparam *)malloc(sizeof(dialogparam)); param->dstring = strdup(fileName.toUtf8()); menuActivate(item, param); QSettings settings; settings.setValue("MainWindow/lastFileLocation", QFileInfo(fileName).absolutePath()); } }); qFileDialog->open(); } } else { dialogparam *param = (dialogparam *)malloc(sizeof(dialogparam)); switch (dialog->type) { case DIALOG_INT: case DIALOG_FLOAT: case DIALOG_STRING: case DIALOG_KEYSTRING: { QInputDialog *qInputDialog = new QInputDialog(this); qInputDialog->setLabelText(dialog->question); qInputDialog->setWindowTitle(item->name); switch (dialog->type) { case DIALOG_INT: { qInputDialog->setIntMaximum(1000000); qInputDialog->setIntValue(dialog->defint); connect(qInputDialog, &QInputDialog::intValueSelected, qInputDialog, [=](const unsigned long int &value) { param->dint = value; menuActivate(item, param); }); break; } case DIALOG_FLOAT: { qInputDialog->setDoubleMaximum(1000000); qInputDialog->setDoubleValue(dialog->deffloat); connect(qInputDialog, &QInputDialog::doubleValueSelected, qInputDialog, [=](const double &value) { param->number = value; menuActivate(item, param); }); break; } case DIALOG_STRING: { qInputDialog->setTextValue(dialog->defstr); connect(qInputDialog, &QInputDialog::textValueSelected, qInputDialog, [=](const QString &text) { param->dstring = strdup((char *) text.toStdString().c_str()); menuActivate(item, param); }); break; } case DIALOG_KEYSTRING: { qInputDialog->setTextValue(dialog->defstr); connect(qInputDialog, &QInputDialog::textValueSelected, qInputDialog, [=](const QString &text) { param->dstring = strdup((char *) text.toStdString().c_str()); menuActivate(item, param); }); break; } } qInputDialog->open(); break; } case DIALOG_COORD: { QDialog *qDialog = new QDialog(this); qDialog->setWindowTitle(item->name); QBoxLayout *dialogLayout = new QBoxLayout(QBoxLayout::TopToBottom, qDialog); QFormLayout *formLayout = new QFormLayout(); QString label(dialog->question); QLineEdit *real = new QLineEdit(CustomDialog::format(dialog->deffloat), qDialog); QFontMetrics metric(real->font()); real->setMinimumWidth(metric.horizontalAdvance(real->text()) * 1.1); real->setObjectName("real"); QLineEdit *imag = new QLineEdit(CustomDialog::format(dialog->deffloat2), qDialog); imag->setObjectName("imag"); imag->setMinimumWidth(metric.horizontalAdvance(imag->text()) * 1.1); // imag->setValidator(new QDoubleValidator(imag)); QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(real); layout->addWidget(new QLabel("+", qDialog)); layout->addWidget(imag); layout->addWidget(new QLabel("i", qDialog)); formLayout->addRow(label, layout); dialogLayout->addLayout(formLayout); QDialogButtonBox *buttonBox = new QDialogButtonBox((QDialogButtonBox::Ok | QDialogButtonBox::Cancel), Qt::Horizontal, qDialog); connect(buttonBox, SIGNAL(accepted()), qDialog, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), qDialog, SLOT(reject())); connect(real, SIGNAL(textEdited(QString)), qDialog, SLOT(update())); dialogLayout->addWidget(buttonBox); qDialog->setLayout(dialogLayout); connect(qDialog, &QDialog::accepted, qDialog, [=](void){ QLineEdit *real = qDialog->findChild("real"); param->dcoord[0] = real->text().toDouble(); QLineEdit *imag = qDialog->findChild("imag"); param->dcoord[1] = imag->text().toDouble(); menuActivate(item, param); }); qDialog->adjustSize(); // this is sometimes too high in WASM, FIXME, maybe Qt6 bug? qDialog->open(); break; } case DIALOG_PALSLIDER: { QDialog *qDialog = new QDialog(this); qDialog->setWindowTitle(item->name); QBoxLayout *dialogLayout = new QBoxLayout(QBoxLayout::TopToBottom, qDialog); gradientpal = clonepalette(uih->image->palette); uih_context *palcontext; palcontext = uih; // 3 inputs decide color, Algorithm Number, Seed and shift // For Algorithm number QSlider *seedslider, *algoslider, *shiftslider; algono = new QSpinBox(this); QString label(dialog->question); algono->setObjectName(label + "algono"); algono->setValue(palcontext->palettetype); algono->setRange(1, 3); // Algo Slider algoslider = new QSlider(Qt::Horizontal, qDialog); algoslider->setObjectName(label + "-algono"); algoslider->setRange(1, PALGORITHMS); algoslider->setValue(algono->value()); // algoslider->setMinimumWidth(this->width()*2); // For Seed Number seedno = new QSpinBox(qDialog); seedno->setObjectName(label + "seedno"); seedno->setRange(0, gradientpal->size); seedno->setValue(palcontext->paletteseed); // Seed Slider seedslider = new QSlider(Qt::Horizontal, qDialog); seedslider->setObjectName(label + "-seedno"); seedslider->setRange(0, gradientpal->size); seedslider->setValue(seedno->value()); // For Shift Number shiftno = new QSpinBox(this); shiftno->setObjectName(label + "shiftno"); shiftno->setRange(0, gradientpal->size); shiftno->setValue(palcontext->paletteshift + palcontext->manualpaletteshift); // Shift Slider shiftslider = new QSlider(Qt::Horizontal, qDialog); shiftslider->setObjectName(label + "-shiftno"); shiftslider->setRange(0, gradientpal->size); shiftslider->setValue(shiftno->value()); // Add them to Layout QFormLayout *formLayout = new QFormLayout(); formLayout->addRow("Algorithm", algono); formLayout->addWidget(algoslider); formLayout->addRow("Seed", seedno); formLayout->addWidget(seedslider); formLayout->addRow("Shift", shiftno); formLayout->addWidget(shiftslider); img = new QLabel(qDialog); img->setScaledContents(true); formLayout->addRow(img); updateVisualiser(); connect(algono,SIGNAL(valueChanged(int)), algoslider, SLOT(setValue(int))); connect(algoslider, SIGNAL(valueChanged(int)), algono, SLOT(setValue(int))); connect(algono, SIGNAL(valueChanged(int)), this, SLOT(updateVisualiser())); connect(seedno,SIGNAL(valueChanged(int)), seedslider, SLOT(setValue(int))); connect(seedslider, SIGNAL(valueChanged(int)), seedno, SLOT(setValue(int))); connect(seedno, SIGNAL(valueChanged(int)), this, SLOT(updateVisualiser())); connect(shiftno,SIGNAL(valueChanged(int)), shiftslider, SLOT(setValue(int))); connect(shiftslider, SIGNAL(valueChanged(int)), shiftno, SLOT(setValue(int))); connect(shiftno, SIGNAL(valueChanged(int)), this, SLOT(updateVisualiser())); dialogLayout->addLayout(formLayout); QDialogButtonBox *buttonBox = new QDialogButtonBox((QDialogButtonBox::Ok | QDialogButtonBox::Cancel), Qt::Horizontal, qDialog); connect(buttonBox, SIGNAL(accepted()), qDialog, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), qDialog, SLOT(reject())); dialogLayout->addWidget(buttonBox); qDialog->setLayout(dialogLayout); connect(qDialog, &QDialog::accepted, qDialog, [=](void){ QSlider *algo = qDialog->findChild(label + "-algono"); palcontext->palettetype = algo->sliderPosition(); palcontext->manualpaletteshift = 0; QSlider *seed = qDialog->findChild(label + "-seedno"); palcontext->paletteseed = seed->sliderPosition(); QSlider *shift = qDialog->findChild(label + "-shiftno"); palcontext->paletteshift = shift->sliderPosition(); param->dint = 1; menuActivate(item, param); destroypalette(gradientpal); }); qDialog->open(); break; } case DIALOG_PALPICKER: { QDialog *qDialog = new QDialog(this); qDialog->setWindowTitle(item->name); QBoxLayout *dialogLayout = new QBoxLayout(QBoxLayout::TopToBottom, qDialog); uih_context *palcontext; palcontext = uih; getDEFSEGMENTColor(newColors); QList< QPushButton* > buttons; QBoxLayout *layout1 = new QBoxLayout(QBoxLayout::LeftToRight); QBoxLayout *layout2 = new QBoxLayout(QBoxLayout::LeftToRight); QBoxLayout *layout3 = new QBoxLayout(QBoxLayout::LeftToRight); for(auto bidx = 0; bidx < 31; ++bidx ) { auto button = new QPushButton{ QString::number(bidx) }; button->setObjectName(QString::number(bidx)); QColor color(newColors[bidx][0], newColors[bidx][1], newColors[bidx][2]); QPalette pal = button->palette(); button->setAutoFillBackground(true); pal.setColor(QPalette::Button, color); button->setPalette(pal); button->update(); buttons << button; if(bidx <= 10) layout1->addWidget(button); else if(bidx>10 and bidx <= 20) layout2->addWidget(button); else layout3->addWidget(button); connect(button, SIGNAL(clicked()), this, SLOT(colorPicker())); } QFormLayout *formLayout = new QFormLayout(); formLayout->addRow(layout1); formLayout->addRow(layout2); formLayout->addRow(layout3); dialogLayout->addLayout(formLayout); QDialogButtonBox *buttonBox = new QDialogButtonBox((QDialogButtonBox::Ok | QDialogButtonBox::Cancel), Qt::Horizontal, qDialog); connect(buttonBox, SIGNAL(accepted()), qDialog, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), qDialog, SLOT(reject())); dialogLayout->addWidget(buttonBox); qDialog->setLayout(dialogLayout); connect(qDialog, &QDialog::accepted, qDialog, [=](void){ mkcustompalette(palcontext->image->palette, newColors); menuActivate(item, param); }); qDialog->open(); break; } case DIALOG_LIST: // This is used only in Formulas/UserFormulas { QDialog *qDialog = new QDialog(this); qDialog->setWindowTitle(item->name); QBoxLayout *dialogLayout = new QBoxLayout(QBoxLayout::TopToBottom, qDialog); QComboBox *list = new QComboBox(this); QString label(dialog->question); list->setObjectName(label); list->setEditable(true); list->addItem(dialog->defstr); list->setObjectName(label + "-data"); QSettings settings; QStringList formulas = settings.value("Formulas/UserFormulas").toStringList(); for (int j = 0; j < formulas.count(); j++) { bool found = false; for (int i = 0; i < list->count(); i++) { if (QString::compare(list->itemText(i), formulas[j], Qt::CaseSensitive) == 0) { found = true; } } if (!found) list->addItem(formulas[j]); } // list->addItems(formulas); QFormLayout *formLayout = new QFormLayout(); formLayout->addRow(label, list); dialogLayout->addLayout(formLayout); QDialogButtonBox *buttonBox = new QDialogButtonBox((QDialogButtonBox::Ok | QDialogButtonBox::Cancel), Qt::Horizontal, qDialog); connect(buttonBox, SIGNAL(accepted()), qDialog, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), qDialog, SLOT(reject())); dialogLayout->addWidget(buttonBox); qDialog->setLayout(dialogLayout); qDialog->adjustSize(); // this is sometimes too high in WASM, FIXME, maybe Qt6 bug? connect(qDialog, &QDialog::accepted, qDialog, [=](void){ QComboBox *selected = qDialog->findChild(label + "-data"); param->dstring = strdup(selected->currentText().toUtf8()); menuActivate(item, param); }); qDialog->open(); break; } case DIALOG_CHOICE: { QDialog *qDialog = new QDialog(this); qDialog->setWindowTitle(item->name); QBoxLayout *dialogLayout = new QBoxLayout(QBoxLayout::TopToBottom, qDialog); QComboBox *combo = new QComboBox(this); QString label(dialog->question); combo->setObjectName(label); const char **str = (const char **)dialog->defstr; for (int j = 0; str[j] != NULL; j++) combo->addItem(str[j]); combo->setCurrentIndex(dialog->defint); QFormLayout *formLayout = new QFormLayout(); formLayout->addRow(label, combo); dialogLayout->addLayout(formLayout); QDialogButtonBox *buttonBox = new QDialogButtonBox((QDialogButtonBox::Ok | QDialogButtonBox::Cancel), Qt::Horizontal, qDialog); connect(buttonBox, SIGNAL(accepted()), qDialog, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), qDialog, SLOT(reject())); dialogLayout->addWidget(buttonBox); qDialog->setLayout(dialogLayout); qDialog->adjustSize(); // this is sometimes too high in WASM, FIXME, maybe Qt6 bug? connect(qDialog, &QDialog::accepted, qDialog, [=](void){ QComboBox *selected = qDialog->findChild(label); param->dint = selected->currentIndex(); menuActivate(item, param); }); qDialog->open(); break; } default: { CustomDialog customDialog(uih, item, dialog, this); if (customDialog.exec() == QDialog::Accepted) menuActivate(item, customDialog.parameters()); } } } } #ifdef __wasm #define STATUS_VIA_STDOUT //#define STATUS_VIA_PROGRESSBAR #else #define STATUS_VIA_PROGRESSBAR // #define STATUS_VIA_WINDOWTITLE #endif QProgressDialog *qProgressDialog; int progress = 0; void MainWindow::showStatus(const char *text) { // This is not working properly, maybe because of a missing QTimer event/setting. #ifdef STATUS_VIA_UIH_MESSAGE if (uih != NULL) { uih_message(uih, text); uih_updatestatus(uih); } #endif #ifdef STATUS_VIA_WINDOWTITLE if (strlen(text)) setWindowTitle( QCoreApplication::applicationName().append(" - ").append(text)); else setWindowTitle(QCoreApplication::applicationName()); #endif #ifdef STATUS_VIA_STDOUT std::cout << "STATUS: " << text << "\n"; #endif // This feature is experimental. It works natively but not in WASM. #ifdef STATUS_VIA_PROGRESSBAR bool newProgress = (qProgressDialog == NULL); if (QString(text) == "") { if (!newProgress) { qProgressDialog->close(); progress = 0; return; } } if (newProgress) { qProgressDialog = new QProgressDialog(this); } else { qProgressDialog->setValue(progress); qProgressDialog->setMinimumDuration(0); QString t = QString(text).trimmed(); if (t.endsWith("%")) { progress = t.right(6).left(5).toDouble(); // save the percentage // std::cout << "t=" << t.toStdString() << " progress=" << progress << "\n"; t = t.left(t.length()-6); // remove the percentage } qProgressDialog->setCancelButton(NULL); qProgressDialog->setWindowTitle(t); if (progress < 100) { progress++; } else { progress=0; } } if (newProgress) { qProgressDialog->show(); } #endif } int MainWindow::mouseButtons() { int mouseButtons = 0; if (m_keyboardModifiers & Qt::ShiftModifier) { // Shift key makes left and right buttons emulate middle button if (m_mouseButtons & (Qt::LeftButton | Qt::RightButton)) mouseButtons |= BUTTON2; } else { // Otherwise, mouse buttons map normally if (m_mouseButtons & Qt::LeftButton) mouseButtons |= BUTTON1; if (m_mouseButtons & Qt::MiddleButton) mouseButtons |= BUTTON2; if (m_mouseButtons & Qt::RightButton) mouseButtons |= BUTTON3; } // handle mouse wheel operations if (m_mouseWheel > 0) mouseButtons |= BUTTON1; if (m_mouseWheel < 0) mouseButtons |= BUTTON3; if (m_mouseWheel != 0) { timespec timenow; clock_gettime(CLOCK_REALTIME, &timenow); long elapsed = timenow.tv_sec * 1.0e9 + timenow.tv_nsec - wheeltimer.tv_sec * 1.0e9 - wheeltimer.tv_nsec; if (elapsed > 1.0e9) // timing is hardcoded here m_mouseWheel = 0; } return mouseButtons; } int MainWindow::keyCombination() { return m_keyCombination; } void MainWindow::mousePressEvent(QMouseEvent *event) { m_mouseButtons = event->buttons(); } void MainWindow::mouseReleaseEvent(QMouseEvent *event) { m_mouseButtons = event->buttons(); } void MainWindow::wheelEvent(QWheelEvent *event) { m_mouseWheel = event->angleDelta().y(); clock_gettime(CLOCK_REALTIME, &wheeltimer); } void MainWindow::keyPressEvent(QKeyEvent *event) { m_keyboardModifiers = event->modifiers(); switch (event->key()) { case Qt::Key_Left: m_keyCombination |= KEYLEFT; break; case Qt::Key_Right: m_keyCombination |= KEYRIGHT; break; case Qt::Key_Up: m_keyCombination |= KEYUP; break; case Qt::Key_Down: m_keyCombination |= KEYDOWN; break; default: if (!event->text().isEmpty()) processKey(event->text().toUtf8()[0]); else event->ignore(); } } void MainWindow::keyReleaseEvent(QKeyEvent *event) { m_keyboardModifiers = event->modifiers(); switch (event->key()) { case Qt::Key_Left: m_keyCombination &= ~KEYLEFT; break; case Qt::Key_Right: m_keyCombination &= ~KEYRIGHT; break; case Qt::Key_Up: m_keyCombination &= ~KEYUP; break; case Qt::Key_Down: m_keyCombination &= ~KEYDOWN; break; default: event->ignore(); } } #ifndef Q_OS_MACOS #ifndef USE_OPENGL void MainWindow::showFullScreen() { menuBarRef->setParent(centralWidget()); QMainWindow::showFullScreen(); } void MainWindow::showNormal() { setMenuBar(menuBarRef); menuBarRef->show(); QMainWindow::showNormal(); } void MainWindow::mouseMoveEvent(QMouseEvent *event) { if (isFullScreen()) { if (event->pos().y() < menuBarRef->sizeHint().height()) menuBarRef->show(); else menuBarRef->hide(); } } #endif #endif void MainWindow::resizeEvent(QResizeEvent * /*event*/) { #ifndef Q_OS_MACOS #ifndef USE_OPENGL if (isFullScreen()) menuBarRef->resize(size().width(), menuBarRef->sizeHint().height()); #endif #endif shouldResize = true; } XaoS-release-4.3.2/src/ui/mainwindow.h000066400000000000000000000050421455214672000175500ustar00rootroot00000000000000#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "ui_helper.h" #include "timers.h" #include "xmenu.h" class QImage; class FractalWidget; class MainWindow : public QMainWindow { Q_OBJECT private: Qt::MouseButtons m_mouseButtons = Qt::NoButton; int m_mouseWheel = 0; timespec wheeltimer; Qt::KeyboardModifiers m_keyboardModifiers = Qt::NoModifier; int m_keyCombination = 0; bool shouldResize = false; FractalWidget *widget; uih_context *uih; tl_timer *maintimer; tl_timer *loopt; tl_timer *arrowtimer; QMenuBar *menuBarRef; QFont messageFont; static QKeySequence::StandardKey keyForItem(const QString &name); void buildMenu(const char *name, QMenu *parent, bool numbered); void buildMenu(const char *name, QMenu *parent); void buildMenu(const char *name); void popupMenu(const char *name); void toggleMenu(const char *name); void showDialog(const char *name); void showStatus(const char *text); int mouseButtons(); int keyCombination(); void readSettings(); void writeSettings(); void menuActivate(const menuitem *item, dialogparam *d); void processQueue(); int processKey(int key); bool processArrows(int *counter, const char *text, int speed, int keys, int lastkeys, int down, int up, bool tenskip, int min, int max); void processEvents(bool wait); struct image *makeImage(int width, int height); void resizeImage(int width, int height); void printSpeed(); protected: void closeEvent(QCloseEvent *); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event); void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event); void resizeEvent(QResizeEvent *event); #ifndef Q_OS_MACOS #ifndef USE_OPENGL void mouseMoveEvent(QMouseEvent *event); #endif #endif private slots: void activateMenuItem(); void updateMenuCheckmarks(); void updateVisualiser(); void colorPicker(); public: MainWindow(QWidget *parent = 0); ~MainWindow(); #ifndef Q_OS_MACOS #ifndef USE_OPENGL void showFullScreen(); void showNormal(); #endif #endif void pleaseWait(); int showProgress(int display, const char *text, float percent); void updateMenus(const char *name); void init(); void eventLoop(); void chooseFont(); }; #endif // MAINWINDOW_H XaoS-release-4.3.2/src/ui/ui.h000066400000000000000000000022431455214672000160110ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef UI_H #define UI_H #include #include "config.h" #include "param.h" #include "xmenu.h" void ui_quit(int); extern int printspeed; extern int delaytime; extern int defthreads; extern int maxframerate; extern float pixelwidth, pixelheight; #endif /* UI_H */ XaoS-release-4.3.2/src/ui/ui.pri000066400000000000000000000005151455214672000163540ustar00rootroot00000000000000SOURCES += \ $$PWD/image_qt.cpp \ $$PWD/mainwindow.cpp \ $$PWD/fractalwidget.cpp \ $$PWD/customdialog.cpp \ $$PWD/main.cpp HEADERS += \ $$PWD/mainwindow.h \ $$PWD/fractalwidget.h \ $$PWD/customdialog.h \ $$PWD/ui.h INCLUDEPATH += $$PWD macx:ICON = $$PWD/XaoS.icns win32:RC_FILE = $$PWD/xaos.rc XaoS-release-4.3.2/src/ui/xaos.ico000066400000000000000000003540111455214672000166740ustar00rootroot00000000000000 F (Ѻ   hPNG  IHDR\rfRIDATx\wu/wz^U$c[qclB I$//@)$/yy/!$ Ix@ S1`[\"yWe{}?wVҮsYhvw=]BԠ K>5AA  jhP605@!Ԡ L Рm`j5hSC4AA  jhP605Hrsq)7VvAkG pi3;S$zAkK pң>z k~w~z#U?&;>Qg l_Gn٧ F^?d* 5AR32.cٝǪӿ]>Mլvif1} ؜l,e%^8Vq>~.9a -TMiNE$d&f+JnC-Os' /5E UhHTUnq:Bmn"vbq#$P&紐MRﵥ|1Zxt ܗe| %%2_|eY3dO.+|~d 8H .$Sl#&t$h!roWTbt& H57. $iyx?YR|.h2=|aqqɒ\0֘. tWw4^g?. ٯK3T7xkRSb^-r0{TJ#[D aFEkz 8oxv&Hliv?Nvn @a~J!R[]:JVD66`j9oE]h"#d"IRxg !LjAKj=o 6}"v)jŦj{ azjfFR{-}@n Afd s'>^*K9 7`obq#M}]-M?p?B?jeIwI gLT{NX#^SQJⵢ0s#VLU]Ӂ(˒ #3 `nkom!C*<F{\&[ju;=:㟜O1 DA@]}A"#R-R)@(@fq.+)e:{ $$#_ƇXQ4`ok mugɶgo$4l{Sû[ΓSLsK˒w,1R(eɌmӑArBAϬ5O}zP}~a/g,  >E-w}̯2坰={"e3VMw:J+ 0Ъ~Er9+~Tw}a*`$B\ΈZ;ue' 'ZeB)X|3F`7Jg/ԲNGÊZi!7d776~KTgdUΠ.G:RJgtbV~]*e0dxr؜ۢR Jii!\˒%JtU<+?p @ UZ]w$zH{4v3鸳}yVOZs *PE#qIB 1  sggh;/(SZp5IXI*ZTjf>+< UϾ VWWTE4 pNeȳ&w ld &\:A21obG- ~2 A+_/0a}o@!O$Gg |g])Q׺M: 3U ޕJVE) q Hd"(Ϥmf2  BmowcY(E'q|ldyNg0>.Pjq@;I]¯BSh1'*9_ ̐8AfZuZ,0PTctB@w0 q(ݟH("%‚\,%衿fJ/[e,jZfkw5_?ௗ*EcɆ t6 |ͣ&j>$,mx="7ԯ"Rл$6DD&;pߘfPJ l.`5d:;V*d29s \ R i];AeY[jkh Ou K6x˄"vs͎ԏkOIX$  1jNC2wҹ9 ƳIgg /귯$BMpۣ[Sӏz67~ \@|7 $h1l b6͵/@9H]euwyÇ iTvl?ͰΓH2KIבplw) ώ|ik3 <_ZB8@$_ ´YT*Ed3R[r- (lj-z b\&%.Llߢ劄UuȄfho=~\.ؼΈjuf w:Ð'3Q.13Oh?(+*F@ߝP"12VDmt܆ HsaQ6;r%+,WÃ.yduiī]6IV՝K~zffӥ8t2a4+~_^m_,>Ig kqݦo=qXPp%{c%l|fV#e4GFnlrJP߂DqPB67'B/n,`8!P\ 0ړY-vXN}~!'I@%Mend}{\k2>EfڭL 嫶ZM,z+ӬsbhS0s: ?_C@)d}XTpZm7߆""3_$P$69 X8x:Ч@&? '`~.IZRrJ46$%z9OYd늴?!г٠;5|n9b\vɦjrN ]B@/z۴^AE-V$Fd~=ׄiIz5<.#m]B3[-.JF6c" !0b!B.£[܏[1nxB9 3bCܯ9(&ׄ ]Z9 =COe':5㸄%"^OqӦن3KWj򜎠_]$,İ|7i'l`~a?'Փ)8G@/9ǠE9p>zPR,r\%b*و[>MzowJ;ǺC~owl-M?zD"W#'>龏)Kr)Lz3OO݃:+c^cs 7oc%1-~no/6.ө1 Ybi&>~&,UjI0T6"p Q ߞ}SHH"G̿`wU۵ f|CnS>9럍y03rާ_lޥkZҐ<g>y+zu7^?ϖ)G6zd]h|:j} 6?3i2D"/Ge5<gF =0fn+ȞqH x1yh̯|nw\nDoqyc~3g󹜵<'nE~ELN8CnNaF|=\v|ѣ-bfw m>L XBgM \ۋ! MFPO@i7zo)@ geL3'_\5 , yGEY1!' ON p,I䕻ڤ[N3\apŚ 3?g>q|08%X{Ͱ_1; ;*a{؊#6fm; ;'鈂# t(1<)q{^a](^qވ_C_(^,WH贚?g a0q $ ?U"KޯJE6&(>y\m"5*B|#lZO >Op?Ÿ?Wnø7T B,G=xEE ErVc# =$"y8`ڵ|?:/u|PpO!Fyz]($V̔  +qCkh $Lmb@B@uHmAҤZez&aG. Lo9Q?~{\M>Ǐc1Nڸ֦YL.[)X$mfgKVzC&iq#SOR.hډ{ѵB.;GZ.;"ſ%P b#Z{{99Ĺ)b_č1x`z ]4xn$T5nq {liј ;d E]Q#Œp֭W}01| +ubF==hm>z-miJ`(] w?!!"Wv[KU` 5~.;O51 ;C:[881}mجfۯG_~OT "9T2ΛA8)tM43genFyRb IbщtYsQ2zz\m[ 6Lq0~-9}]zS_,Wk}8WSІ?ķQmcdSބ5mwb6bY_?B0YL<*Ts,WTfh,n 1\IȦ?ưˉ(Q4]ޜ0r2wb5Z3L~zCmM#롎rsf+$opY&-YwȯkvsJ^mN: gF߬"$~^2-©Wpw^$ 1̋(F\Mvo fzY$b9 w~A2w  Nݥ6d6̎;G`0=Ś$^M6G!kf'$25t ~/x]_$Jkx7.}22<"o==&3uhN@=Nt:\!:ɿDG#Fʦ"=x(6|},x2{ۺΦsw %.fLs*аEn%kF%uEBM2X d akV4;9ᨖ`s͈42Q :]hkxˆp5 WG|[»_*Ԝ|_|^a`x܏>G 5XՎqr)k]x ƵE$N}y'0ӳHV=7]?MGz:A_z&$pxJ#[{ڹS0wҖc }3@R}O,M^Rn^=/?5L]#i"g]hv6/~h|Y5VWG|vWGTMek1LBCPUMĽMMX18$!ό zǜ1>kb.L!?r /F06;'uرcG;n #xb8 b%} p b;pgc$z J+pi՞B& >e8y4$w)ZL)hJ__c2Jxw- &ͷozW5>1Kb!-mC~3`A! A[ֆ 9WT.mW<kzba聵c 8|J9%r3O$s`<"Q^8:+c?}||Ulǃ]߇Ev.8\-tB;]af:#& dm'P`>eTw)PfO"hF2^\H'D S^S &_G_=8zkX3{o&-Fk_dh\혿VǛ[fdHҲvYQŎ@Z&F@wmX@_ڏk> Gh1Tcs-ìI)v*`_@lD ,0&XXƞ~ 6`:ى<& !H-נ9'E!%B4:zW=%?-3-;F;=aSIYbpdzpuv$nqo}6lxqײGi˳]ZAk[V[>l'qņn.ů>p~ Mpo(<./l'j`70EʣHބ/$@wE#ȟ C/)O ~ V-+ ݭ+I@LK;;-'P85 [bk{CD s.7lMBR^P:IN F /uѴ wbǥf:yI 0J`D7ȋG9};ŷIج`3Hk z=qXL !3kѩY/pI|;?C!n4촯IӾgͦeOWIF\`h'fGb;H N+?Br]q e߇֎pBp^ VbЊp~0;w4 h0e<]w&h->LAQīNtsq"rf/ vqbD挻bwr/Fx8mlHK螸[# a2 uRB?a "Rm`'__MՊbDQxIb L%$_GsϭǏ a%сxJ?Ny&,b<}lsϟOT|L-̓i }LՊ\^QOɞpny~1~]3\qǎ`rk6<} ]81<1W |AX)3] V$^OcQ"C8GAB#8>[Nl+LLJp (^?XQ(KȠ]~4! cz2tT ?Y;6epW I Jt[z !d{q(Э Fb5C<9w[m{K"jyO׹Vbl}!-_N9q37;Uާ2H M@R.#.S,Jsȱ L&݄##N^,*j ?upT޺B bhiVwj|#oᅝN3'fs \Nt^|!ebXd=*C),! Es?V]0i-#WavUDnC0ZCQaӮn<@ \-gmG IyB.TJYť\AMtй&$v2Kr;C T7Pt⍥$~DpODНB47V8#F7.;Iash6Jf0UD9 ShR'ao+Zn;J4 2l,D3,7|PBϒN~|zɿ9zV`=T%I5v9L(ڞ۱m/sar粔 T"ru ە[hq1 {&At2 8i-ÖC%^h );kHkS~+ c;6+/N*e֏q(ĂΧqA ^O[>m8^\❇6{rz<]$ ^􌒶}T*V֥M[_sYYE{'uܫ}YkqCEkG<]< yGxZAhqbc33%! >wrQ-CMxAzԋ29-u)H_HjMWkg?3zq[&[ƓxH,Π=N-;Encr8|>ln-9Ղp<=qq l=Ekx;QD]ې,#TJa$5ȿ~y\ /Ƈq(\Hd p?+PUud3cWxUM%`8m/?e/::Aϓë t6c_`)jLǥ[z=KI#>,^| ϫ#gt$߂>L/P@]C=;pMpZB<yvuI7kPvLM u_y焨i_# n)!W@Q!KK@g^;S 5r,b|qh1a  ˆoҋtqŇp@w$HRllnm~Wt2*-h GΐFDl3OϠ蹙 ~)mmy޺5hOBfpbLώ1Dt#H^|oh[PlS^>/m{KD|7Rkq1[!'^1(IL-4,!XQZW׌.`;$Zi^+zKzFo~ڟsN*١wnB]tb.hd8Nl Pe/9/O`WЏmmdJfA­tZBqɤv#39-28L}dÓx h{<;>xlH ctP:L3X\1[p-Y6j_g$C!|NU]\nʥB%AA29hʓE3%$P/^~/T|igz Ï] ݟ?|x\Xsnr?o–[ m?ݿϧOJfW Ͽ0Ӳu `X-rN?XAXg<83o^_3aE,Nzf=>L}v"|iA5X_hkDkn.DDBNK'G07n t6żH@xmq9^p8B,<ŁdVInCk>%1gVD*ڏjUd˄DY:Ȑdzx_03{t6Qo&Sbaa߯'̯'ӡkY~>fܟcaÛ1'"Nb!-b XF~=}x `.1syٓ| q6+zjs>pO`ޏ#+ 9%^;>^CIO[<$-U&Z67FLyVؙ&Os5ķC:kd.9 n [ϩt~> j\ZiNus [,Ыq%cv)*3sÏz Flp28z v#. Lrý5ܕ!yp>Dsu1yyS h[-J:Ӂ@h3lz8x2/P2>_˵G Y.Z-3:ӘSiݝ7Gk4,B{3)״mV}N,i^X$p،!53Ǖ^WYt2YD;m4N_եZ$HbAQ?OD~o X8[bphC݊ʹ~ގxNAˑ)|^\k3M;JfU{ulE|GmB oWd?L<:s NP4BVgzzRs9O'ص+[i[__} C|p|/=}N^ Cj{Ҽ M3غbz>$:.'PC)fYf3Slޱ?F7Al|tdѧ { 4rN//Nbji8V6iV/c#)^"7̱[¸kC"*a-M&բւ587e%@Ee7,JPMBMO .W}%̣\2GmMTlpήN;sUvR%8 :;tXv1tV>sG%70(60J}=JtՖׅ>ND;j*Z}` I -йFJ΢?hd?:B06fGǓ'Q*EWO_iPKqm <(u|`'ܮ0ISPC, ѧѶXH ${:7#/';)Ն!r`Kcv :+ s"˯ܢ mzRh7Qd5*;ZBY1DMlC+5<;0h=0&;#ʢ2=cPo#!ϜH5Ӄx߳Г C6Ӈ~&DWoK?uZi0E:o^.Q{̺]] &͆?J#НT\ǵgbGȼ{(Ѷv-vOՃ˝\kNSwqZx(&BePo֛\m%\s|qZԛk´E:Z Z/;[3 8r eS1~xu.^$vK\R! d "xר/@kM;"ynR<):#[vؚ +3sOMe&u;Qg#Қ7yO~aMi3zI8V._m>m)/G 7*kRv Dj{(?rx%pD~F%\TBA,ώ;[E,3a^4g_B|Oc˻29j*3Æ^&]!D bo6Arh? Vd:M$Pi]ފgu C'Ci6\[h@5A"O_5Opرc~z$t03S AnE$wHmxm-"=c ̸`b!.ZquN('潴(C[7?:QTw"Btq3Mcmjדa|p;[wiIFUq̦6 dCf87| D}"'tB+g3jx?,Zi| Ezة,CU۵6D(|-n]žg3e&1 H-=HŠ2j9t83z̽mخN#q?SPKKBUH"WQ>D./nڅ=mpsZB_3=0;8̀{q 8EoG+75n}b% T9V.x`^ SxwnC%x. t,,c_Nv&B}E\#]DbhY.1"&{,pwߋlȳ?C[gH$ "S*Ic>~釱ESA˓S7=7w 76,oA_F#m>/jV&p`V>Va#|Lo]}/Wm+fL|k9Gwʢd.lvY+_?>\TtB{ό܏0ܳsҶ[I^6##:ى@vBVo: `'N<>Ǟ~\2~7 _E%? m[,a.x@uocbI Af /cAΡ{@ku"aLN Zp|^BM ue{I'$] m~"iv6B Wi]:!V9 yɹ͙ \΍!d:GMV3C ϴTg/oz:5lz 1B 8c R͕ pTnݞ8"vIvWM@a*raT{/8B1|`XPGȣqgðwmD' '!q;LR x4nn*U0:o\)=W:B[C]͹fzނPv(4!ds©W*E(ye@'=-u춧C҅E>]/}ßguo 58d]5sgoq3;&y~K /hDH&ȞoUHHXa xQۖNNWCbG^nq4¹! +d )_FW.{'S6q<ǫznB>\MpG|"@v$%ssT#PyVD̍gq"2^fÓ9n-MhJxIً][ɴk@\Q^ 7 PZ4yO0ת[;J)w;2dxB3,fOj#9K6 `A86-G=<%pvd!EpuxPkG mnCE$Wz2=QŊ{q:ZP SHNݵX±I>"%RAy HC֖5Br4 YA)lt z'ޏ^ 7;i+@& yzBmh&%sR9*\@X( Yτ SX#hw9{_Z+3"n::}QOnڵQY 5W@+>a!Qb';e-4l7cCiXhۃ*[$06^L$ Ã.e^HxvBPn?لojF"H{%cT,IT*,"#1Zfq:f&ݰ/9l {+؆OgCBs2)doh@?]jlv&g)7ߩ(EUZbh2ft:/毑W;Es͓V yVY_ j_蒲HE+&0F=ԁ~ fp]YPOp__"2j]w"iZF +gUz 41J&ׇ28l~{A9mۋl']3GE ‰7<u#n^|b9U ޮ?q}"-i(Sm}Gssu^o,fre ^O8XCb6z= +mkLϼ=b7$>'ʰ d]AϾշ;NV1cܗ<ʿR1)֋E_ ('#I$}N wɣC()Zxq7)jӀ Gt1U_AKx G<'ϋXЫVYk(g=:3b`()%YVqe+׎['7YorMMq{r;qږ-K$*IQ$z s0  P_Dr0szIGVߎ_;[,-j+_cQ-]Jt]~F:FC(MOi ƯcH߭Z%DqdsYĒsRKe"΍#sru[ǀ+䞗dikǝ]mn8$I?bpϋQ,D-tb/o8\=_BuJy5|x16z?7V@F8"QO$AvO0߀Z;w (\9y; } H,2nsS'|fSYrׇm6įmM DW>/\;bn-xB{P)DʌQnQńef~*0YȚ*ݾ҆d?L @oi֚/uVwC,_ \9=^+҃Ȓk' 5 9k;Zgr%Q.x-. H&ы,Gq3Dg_HQnis"T-PV\ ϥ\^1@manE:5$ƀ+S' 8x@ , 5^ ڷ$&eW;SHbD l,v#]}e&'|yUѣ3*qL(Ԉ d1n<#Rh92ףYX tT~|xӳ_|;p=)p"Sp 6k BWHr7\=ꥈ4Z/I,^H/I}Ng584PY{D csd$z٥ ; PI9r%u8':{&,{}E@Nl#I`t Md{(yG*:0Wv0sf#og8[w4z ?{d(uE?#Fy^ `4?v+sR-3nFMmM.F-=oG1vS-A\fl=YLc G\9Rśڋh`5y ;- P֣HiJD̥WQ]&K8ele11),~588JXS2n-Im[XfF%xx$o[IMDB!ܲZ!+PN_СV+T4[u\` - v-A+hhi^mm~csq ) |)w~e,6W?ݦywly\NфRWQ,4>,ɓE~]5|н="!(N_Ȇɵ*cQ; feb}P5[*&K AwZ;a+ "WF{e: Ex9D+zN}뷱FuE +FB~ Cе7EFSE곁ʪP@g#.;r^6~.5p9KNIW+ 4c߅ #x'Jk]EpɅYɫȗ2G6Fֻ8N+'VEM2AW\Zњ  UB: tܟ°d$_W֥\f= cmprj IsaP/_zaխ2o Pœ‹vP KO [.3S$3d .r6]CI(G#C.y@hLa~IZ2$0r=^k\4R2P% @U;f.(uYN~Wni>#rU f؝$ @D.;>pzE[j5*ssM_qzL[č:bB' ]1x=Ja{ȕ@&+ANS.jm8P2spya4{#qBn80z?Gaɚa3 Ql4raoTB>Hq::JcN2[:=Zɸ-!MU2S;}&PJ>0ܢϊ@pReZMW(TH7f1P| Dcœ~qo5Bg" J㻤GgG`yƇ̼;}YA1݂ >9d͜i@t3뾶抯\vk!ӄMw.8)7Sh0N+dŘ:s(7r,:c|FEFAĽ 8OP <8B}XjAVcJQ{T"lz\Xz}J2'9"BS_EnI8c0$D"2<30R/ wc : dc]ȍhxjRU(&q k>$!!h!etv wn{Uױ@C%&M- B q%VL.6T3MX|\͑PWg 8ߡәDSF kAӰzss21v˨1-R8L4{~_ -2NB1-D| bW15^InqcCo>R>ѠU/6lL`+{%w_ !mz>$| ')dGt{3•*,9A:fYe%XͣJn2Ph>g^? ]ܐ|Ea["ᗐNQN`:v sx(TA6'CsF+j3$aees~yp+Ca|X%z1߆A7Tjp7Gǿe$ul%[!h*YSY0]}CiFe>n,ny%SgCB$e,L*$王f7;'b4b*o.[Ϡ6sxR⑩^7N(%Oeu9-zګflPEt$"{hR߻nn_NB( ~|ӫM@ o l{3P?nD-8 к_Jށ%5㟛8ɉi%`v_:O} o3b݀:w:ESFFbj86!_u:燦0az\v߇WZ/Ҕ!cu>ېόHFGi搵N|[趯c@|QM:dUk'{R>e1٧ 8I8?,aE@H! a! "!' hQvWJNfIs=~jهB>̢:3u{Ӛ9t\.k*;Ɋ4Sv@햏,muf gm=b.)?lA)W@Cbгȋ [HWHgңȤF=(妐 T1̷P06A|f"zBIܻˉ/c,2:'@ nI#.\Qh)L֎ܤchE- `a,4ߋfT k?t|biLUTnGdwVJhf`jN y'8aT鯡}_0yIJR<5R>1Q[$ a2K˳O&,-؛0TRi]f[8>G&Q_e̓ӎw7 Շd4re*K⁠W ltZퟥPˎ;_%!UW{ wXQ;@r@K҂WΥP`ȸR`s JEÏb߅G`u8YOJ=1#DTET#O`"| >qɺ/^=.GtچK>/VC_{-^;Cd`f@;B_2HAd_{Iqx)`)Kafn~b~u^ubE fRP`{XQ  poBihB NC|܀`߃޻m>$xIYHL#76I!dіt߇d ńJ s]RIZ`0l6ݚ0/dQB H$8:<4{Ng/YK|pzБZJfb\WyaLc 8z<:3x0\6 eMӽwZp_,ab@ lj+`jik4aG0@,0[~k>Bf.h~[q1@rw쥠νr8Ӎ}G4t#@ U0 =Pրux-xLo! \4AH,2#B P0bL_gWH78D<2Fg׍&:F]:; Sq $đ kLQ%<7Ҭ WY8X܉ \@ۍ;P$+j^/܀ԭB:oU j&. Ah]9R2M&a2V[dجA4PYITIKGf!򟡥|î{Q!%PNLa8[d6yL v0nlvatG fXy4-|K?QƓ&ٸnz<#)v-7ѺKtf(@e«hvU^$ щ aѺ@^JV1Z3tQJP(Gh" ./0~\gE G(%̽P=G%oŏCDI =&؛wde<%ȇiH•nKWDi۪Nb", Ls. mv5_,%N }bZ>GWǝ/5ꕍsCn^kcmJcj}vF\= HI10eQ1|BR,OT`:BVw/TR:-p\'pz$\3ZSn O\)sX vS;o Ř,X+WQƊא\uhabTdb6޼ъ8cCW'#֐"^/JV7x >r?Tńڠ H^V EOg̐bX`҉urE߹Y4Ұ|ߒOW2E)D,&.0rCOc^tI^l:ȵx5ŽYVU0/ېT+${ED|lN:]L3u;p7*7QđSGHn b*.aQRAї/z7p}:ƏVQӹ wlӘb΅R(_w Nqrh5UxC-@\Y6ROu˿`oC*5H[]㕺`T[%q('CgJ7j]f>\D'H8|-6rL%/A6D&Õk$@B/p:!0 o~| 6q|K: {BA5gܽd Yӊ(D%1z! !F-SOX%K}  *o0;drs%61Չe҈ϑaKwuPO(}[ጌ#[œd )8Nle & 'OɎQ"98hE;ڳxjڋty6@eaİghLS4k`1 vr1%x ]NX,]ދ5pP.$\d|X\T5}j栘7qׁj,2-hՅK̽%;VT6K&JcPwCYpSP!0q"Kg$v c3V0x$fF1qш\ߏakW@nhMD%/033Džۼv)ÁY.kQ&W&Lg7c} ֚xc~Rb( ~+xsO%u?>!\|].\c3c 1w,j BaN #ɩ!ʔ 'ry%VKKf309̟}lK_E~P:>mdA$jrvOo~3J T{ @o]x HS3lB|E&=M2;8e65+c& [wl:bj(v~VK+Y FIef/T2U46fNbf`(b #54o5lQ6U t*naPMl`^8s`  3əB䁩gP-;Sw$Hs.O[}o'jd@ #:+ (1I>?\!"y 6r&I8<KVW?i o`H&Hת9)E#T$y;aH%dzy$-0'$ rދPNXLQ0[XuV8ZCSE:,2ӑf}?YG%1a+kV^n nn'x,ceA^pf8%eSxrfLnbBWN@z}}c _9J٧8De>Spk RmE+f Nqv1$nqTG,a,Djpb ' 2͐[vàye3##u{r&&^$!)Lk#/S:G  oy+vsVL-7BgQ|w R XgIgfP|-1+Sy m=\W0GB038|/@WUNt/[<3B<:ϡ%h# "W`Bh)ޘ–%LnpEi됴7e$o(,ֶϝq6g/= BgǛ4.+TVleEy˹_p C*Tך+چXx4t_A9=Jo"DTXr)3jPYZ~#~44dn%Ne: *ɣxu[{eɠ1tjCZpsVAGK*b9E 'О Y3fdH&a4!ٮLX4la7Wihہ_Bǖ#1r9h%e@%Ӎ@O=y zӾj"-8,+!Z@T!H8q@ EXv*n_\=s;o@OiaJ…R\dDeGbeyhXOf9 OAF;1%dBh~6fi +n,L+) RwFmtnm4*1*{@*_&9>}$z{]Scskyˁ+>ܿ20 ZJwOx u&!g&z SDOϲsM-vy .ST@rJy̜wD-6lzP5An5^Fjib&oTffl&$ؓp%7!M*=DP]A~F&Z>oki+|K{씠;+VO3 ?ycO$n8[0i __mMz ",pi r_XX%PF$FEI{@f!y%^x aAdOc˵ >7™Ys.z HG]!j-SP'EP 0(!"k}t,ETk_k$ɠ#ELEqO7ns46K8XHJp>ePsXL֌^uVd_E7?!P\{|Bw@gq1W/^'k 2Yi ʴ3ҸKX,PHCÐGٚFņq$zB`Hx RtE, h TkU _@Gf@yRr:3+@@K^iY%>͝Q1e)-}37=1F@^.'`u/hq5h͇ g s9{DڷFZZv$-SǠ):gSsTrFZmarԨ3׵@5e RZs~wp#T Q "0[hӊ1JFCK_`ɥeƶBOpok[` <[ѳf'Խg<Ř %?yj-d)N8ǃ?d }`csb-&XTQ˒CIJX `pz?NBYV4xn!aWKb G-+hͲ!'7'?"hC:8 KOq$+0KONʱ$R6i6%'`ѕ1`|C~?+#n =aևa4(ͣl\d247Z|iSC. >a\o\hiۅ=-vdf^NbS9}Sl֠=xϭxjv`ep6A$ka)S]n4;->Ģ"qBR)!> * t|;CxyΆiinR赍{}?xAt:̥W&|-Nx]2#ʠ0ʀm7loE'Ku\egR|ØyKEDZ{Mֲ?g_EvҦr@!giN$8>j_T~~Pu9E7ऀ2g@"Q3_*b}6c; #K՚A6h_)KÈ& o …l֣Tg߽ nuYT[ nx6G4fq?}焘`la)IL a3Nߙʌk ~MJgƗ( vgڭF!dM`a?bytlp5\EJ̗^g%<`ep3H(U3CB* R̈A*3lT')尻]fSeMTy$p)>/:7^ӎ >N!p fd)"W,_}X{(e]ƢXsd'X[:P b6ά+zl=mX_Y7:;57PfMtҝhXQ18"!E>n2ATЄ18J C."0p[O}#F#@wrk%M$ DE@/W7wcC:2}[ī,(p %!|x<%XX"/J.CXLےѽ|yXxU܎Phjκ? e K* UTB !] 5eubt HBadjz:d³&RFYt HHiZux_ȉa݁@;a'NR%a.e3b{% @nVkU:pFRkg!ޮdU՜Sچ%i鲜xgY FEUxX .D}@UJBk?Ft.&L8ulŲj3 (^?~5+Qg)=~lN(uݝ`qmQC4@;͆,DՖR?D_*-Tf/-+{j.u7^^;VI@n]8DtuO`eW$aFKo@oGBѪZ 87' xzt B?ȍmACGty` h n kYlf"&V=f 6% ,A `qv3+fͪ*.%L<~_ 2$XL`!g)35騥BzY"O_,yNkf8PМA)E1xPV ɽh<i'FO>gN WkZgqoȇ608QE5`sYJJ2dg&|6^׍'N50j߁[ 'Pl`h}?W}԰g@H MlZmӱ[Jo zjD^7P[ SeӀ]v 4 xrfxxDpBU¸t0fg#>;{AK|+Avv16(r2x^^"oF$z/hF\G݉~~Í`w2,nlD{cUyne ~V!h(]gP)ZoL:A/dqOL I)r)7?+w–R~7m/)ujؕVzOi0|Q9ڋ_W4# =QnTdLf9ڤgQLJm×`<<$=c>|tux!eg'ɻ G/R-AT:68 ̸)@>AOg;Oa IɤpN`@? Tuxt>s -6c)@ ~UYj,[;,8Α!n%t*2cfS͒ aSd zN$/8=7Yy[B)w&#Ŧ;7ǯkCnAV;$_^OM?-{x6as1^ށH913TD1R+O.cύ܅jUI h߻@v&xf qK$/fC7x*^J'}O@kY0[$ yzL^1#94`NpbtYȕ$LD"mKSlA>.MNTkU3xZr U/S'R (IT4V_"%`aR[T:Kb9,3Rfz]hӰzxjCl1:f\ޭ ga#­d,27Qdg?~k@=5zk˵c=- ,1\⣨@Eɮ"L,nR?ND:B´q#Cȍ~Ca1! qهƍhHH~AQ'|7KSpx8EvWqȤ݊/&dP\eTT b 5bG.^jF=:=::zPx{Z?H CW`Hsڨ#!7"綃np%s߉U.1ނD2"d\!?VK:Kvw&Yad‹B EDXQɡo? H}/n?[S\*Ih.)F$8$(GX$xtjKw 2i8tr3cO0 aJ9Gls\֭d==0Qli>Hd1b"1gaǨ7%#KVOM!dۻ`|4i<itv35d:AR#Y+f|ELN)Vǀvdtɥ'ec&Cyg)]@ &wkn\r[1w78/:CC!i!F@|,]g afq$_cX2Qznsp=3bȞ1&۱QzKj:Tfr-ۑ4Bgo[-Wr[/89(_m-y<%W?M/cᙳ2"8\OhM# -S T#O׀#] #$XdHlB09ѯ{;WD6f$<{od/%B‡}cwY`P%O#`6\Ļ]9 -DiC\Zs 2z&Je x1G݅HV/65H1=,,oϣK'Nйw}m7 Qc5 SMm &0lFzk(;w?~P"%f.. ?kz٨/pys_}h^iHuiCNxu bZ۱N 92t@Qh\pqߢ~]^;pM~iXd'_ U!Qot6N0axr/JA']kÀ`-(^"Q2r.`Ȍ'2Srx†v3V#a=T/{z[~hOŁhn V SZcO$I9 -1=Cz?z':n\-R'X!+'1tkH|n l=H`PC?kn!0]\uNHsd~V+W&eM*y$*ҹO!D(߀2MB^DOw@-qb^$8GWO"n-f5p U V'O 1wl,\eKc\sL6ZC'\, դ2{.>Hb ?Iױ0 LLwz`*L^Ӯ-X-^O$t#?@οm]GYtj/MS ؕ^V م)o{r&eρA@hk%\V'N53Ҋ;εVAh!oGO ^˰7`V: Busu4I9 yE t"<1ȶ^nȤHqH@zW} ޶;73Aqc*WJdYyl# U!PR PE4ȱ˸=,1}u׭:݉ EIHX<LʉPYC+6܂sL _V MWP$s@Ia#<7ѳ@2yZ WI;+XQ#Ť+W3ed'ƫpW KK@=;ۂ ˩M|\BՋA$"`~ W.LB239'8()@R ܗ57׎ǠϔU3=Ҕ_kVW( `tw*jt^NeQuMUK ȗ}(-@VZ}"Ep4 A#YI(yUF"I 9ՓjJG92+7f(bR1%&U\ B/4-8>9Lq4q=xYOH}-htf:fUCP1͝y !ˆjMW0+P5q|+ Yms&K$3~ibKUZƖ>RCXbx#ZU}w`p S"P$؋glBޘ`ԩGЩ+MlDtYg4hyڐ`댒B@<9QcEz{z6W ϵvVXmGgn.űRc%Uzj _^MMA ~nϵ,lUpU\JBfmyx%fk [Z@/PFL"*oRLX| a˵+O&= g(brn&LrχkSGRk iC%B.~ims% 5 ̄ά8֛%kcM0U_ABߋGg052{QjP[,d}YWwsdzA,ԫoqzz!D WM9Z<賬 ;{=hVMtO&Ρ$1* P*{>NZJ5O"_]K- _jm$J@l Uڅހ4ds,+ `|hz/W>8c0'^&=S 9'xB7S(Kyu/Ya܀|~Fd5P舩 AEYIp^Qx ^ZQO)|[~VG!=KhMCVR܀Ė@!;MyJtm.ω BOѨC.[Z3lpߏÈ~!f@zs+(2 T"Y{~>~ bK$|,YWeՂP~F}ģޫ.AbN[\ {ƾA@MU>,[!SgBi?3eY@ |34B+" F:FmK3y+TeL|ј4@&@fnLN Co;Y ☌0l {3QT Ɗկoe_~:fɩg?+hkQ.Qf^Qmns;zW@*jKka.ArPކp@T EK^4s*#g/lt)Ar$8A!3LMi eVңH ⧤8]sZ" %j- W`yvhpǢEC>,`FҘo6UJr}|QXHȑ\Ab Dzz-2l>BN7$6pQ^K'lsWӸS>~\![EO.?#@!Ve]EXgWׄ/nQ-|^pkJyuG/U.j7RrYu`7 4a;l$K+`!cۯč܁уءDaIL:Ж fl¨7#!_XqC MF |a܆N@ZFrV?pBw A~"z`v_@}Ab`j>$3x[6Ӿ@|C $q2ɴKɧ![@TOOJ?qmlxga<| ;3?@Jgä]ppҧb8[Iov3C)$YdՍ7x l>j1lAvqL2w bC3O0XX}^R2O*y݉əgޚ#TKi&%)OohOevufIMǔnwh-2ȒpE-_>8:&J侧'{{u~ŗ)hc\ Eh},6VLf Ha1SwSBqgAbP¬cwVE/IE]K Sje3[Pxíyl ,g_<׶0t"ǡ [T 7[dB^C#0KUPR!Lr?7{Wa q0!ٙ(nsYMmD*U!0q~U#Ѐꂛܜ Blva@V+ϖJ@VcoH%Є lu 9 %,-w\l ! VGAIbZP!r+0D> I -~ <Ʈ}ճV 84jA*)R*E jSA"jH4"%JI mԎ,yr~|,̽'s  piᠼ/ȧ΁LA"0(?cG9Q\4֌̿MVcbd|{rz ic;f/`9qid_?bwV+3׻[v1&Hu02X0UCP`fḂ.R:;305ymLDIUhG9 6BVx6plMCd֑_{|r?ŵ)#Wf/`E1Qnw;ڎ}5}V7TglbnG۩ LbM>GBԨH/pȘ?y^5N}bE y/aMzxImdXss4YXD gL8/MSL4͠)7zR<1`Kk5wبF&+즂!J12 L(0uYGгP q02!TvY@!LAs"@3Fsm,duk~g'9w&ȵknn[I A%I3cp+~}?3!SvrNAvE|~>HhA\=q2_9: cJ0GM9+|iH7'&DVe~]!l"Ij}R_O(ZvܭB$0@XE_C^cks  Jԯf.A97s4@<k> w1|'a%h:EECI}HgЍ*X*?NEwpq/ +LH v^1Ptv$Dv?ff^?Lݓf/`w`oaB8}LhdthV/%dq(8rIȕ˰ Q"#k)ӈ}: ≨A@cοuE-[ڻմG[uD|KV>3q>ƃ_yykI)C-LJr F;, SdF)oc`/ $d~D)85I} }q S}̹?ƱinE{DХ8BC_ Z>񡏺 -Y$eu cb>Ȧ2s %CMOXGwqKdD&ހT"c S̴-fPd-_J{H8D8Bw۽'޿ngx0m{>9A4Ь¡.*#a/af%uM A,.^~LT{V3vn]A %#+sV7VaZ8cmVW󖅲reL*JKXg^@h&;Z EV |'=--? >̽Zi7@ɰӎ}Fn&؁E0@\ˤB>LUAdqCpP|#C^D x:;O3#{_\$Kv X@kOnXw3:ܐ)s w{p5h9dXbIĂ!f 7=͏_}jmeDR(+<{@w99h~hc]h蓟ƴre;ܵY&(yvUrڎɤwd21pZ0á`.e*B_౺' DB k bi|5/(4ޝBFm`">9n0¦QM=L|$1@ |q\^|TA6}be>˿'D5V؁xlr ؖ 'N1:hl(4c=1iEbzvTW͸n2Ap8|O0Y fFC0JcѾdTs`n&2ͪ#rCqŊgϖ 9pN0 oMZF5T|쏜bOȒn4b-q[,a^|6NXY/^5ul:{,{1&^dM:a?L &Cu]}_8BajB+SgBgtb I0LI`܃ڈxQNJ ]Ry~V+8=L iSmpk"1t@S>)t$j;ŒT` &RXZ*loZ2Jj\j|1p?' cA}Q׋,.]V,Ԝہ|-$Ol#ɲ C7 d/Cm~@">t(ʽ`);-@Ԏ*l^4Muf hI tzHŕ TVtv-AsKO*I(Ti巁<8.δq奕Pbif0%]|Py4+Woq f<@PH2|KЃfL4M]M^tk*4Llt35?˴<{c<)DK/;< ȤdA@DmH:+M mN!''Q((UU""S!'.Q"'[Q"&Q!&Q"&Q"&Q"&Q"&S#'T#(T#(S#'Q"&Q"&Q"&Q"&Q"&Q"&S#'T#(T#(S#'R"&Q"&Q"&Q"&Q!&Q"&Q#&^R"&5U""U$$Q#'BR#'}Q"'R"&Q#'T#'U#(T#'S#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&S#'T#'U#(T#'Q"&R"&Q"'R#&S$(GU$$U##$S"'iR#&Q"&R#'U#(T#'R"'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"'T#'U#(R#'Q"&Q"&Q!&kU##$O##Q!&kR"&R#&T#(T#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&T#'T#(R#&R"&R#(mM'!I$$S$(GR"'Q"'T#(T#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%P!%P!%P!%P!%P!%P!%P!%P!%P"&P"&Q"&Q"&R"&S#'T$(R"&R"'R$'N` K-R#%mR#'S#'T#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%Q"&S#'X%)\'+_(,c*.c*.b*.b*.b*.a)-^(,Z&*U$(Q"&P!%P"&Q"&Q"&R"&T#'S#'R"'S"'oY&&KQ"&qR#&T#(S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%R"&X%)`)-h,0m/3p04q04p04q04v37{5:{5:|5:w37q15p04o/3j-1c*.Y%)R#'P!%P"&Q"&Q"&S#'T#'R#&R#'R$$I$$S"&rR#&T#'R#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P"&V$(`)-j-1p04q15q04p04p04p04z59?EJRJQCI=C=C:@y49p04p04q15q04l.2a)-U$(P!%P"&Q"&Q"&R"'U#(R"&Q"'wU+Q#&XR#'U#(R#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P"&X%)f+/o/3q15q04p04p04p04o04r159>?ER[KXP\P\GN=C=C=C8=p04p04p04q04q15n/3b*.U$(P!%Q"&Q"&Q"&R"'T#(S#&Q#&_S$$1R#'S#'S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P"&X%)g,0p04q15p04p04p04p04p04o04t26;A=CCJPW]f9LTaX`GNBI>D=C8>p04p04p04p04p04q15n/3_(,Q"&P"&Q"&Q"&Q"&S#'S#'R"&R"&5U R#'}S"'T#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%U$(e+/p04q04p04p04p04p04p04p04p04r15;@=C=BFMKR_gNWaNUKRIPFMAG8=p04p04p04p04p04p04q04h-1V$(P!%Q"&Q"&Q"&Q"&T#'S"'Q"&N'' N$1R#'T#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&R"&_)-n/3q15p04p04p04p04p04p04p04p04p04:?=D=C=CGOKQZb;Q>ATaiV^T\YaQ\FM7D=C=C>DIPKRZcL\m0KC GVadmZfTa;YR[BH{5:o/3p04p04p04p04p04p04p04`)-P"&Q"&Q"&Q"&Q"&Q"&T#'R#'S"%oI$$R#&S#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&Q"&_)-o04q04p04p04p04p04p04p04p04p04p04o/3{59=C=C=C=C@FJQPX]feoP[+Lc,ICQJ#I7FCUW_HO=Cy48o/3p04p04p04p04p04p04q15a)-P"&Q"&Q"&Q"&Q"&Q"&R"&S#'R#&KU'!R"&U#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%U$(g,0q15p04p04p04p04p04p04p04p04p04p04o03v37D=C=C=C>DFLPW`hTdRbU_y2EPc@] WJXgpfnX`JQ?E=C=C=C7D:?u26o/3p04p04p04p04q04m/3T#'P"&Q"&Q"&Q"&Q"&Q"&Q"&R"'S#'P!'VP $@R"'R"'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%Y&*m/3q04p04p04p04p04p04p04p04p04p04p04p04o/3v37;A=D=CDDJJQKRYaAY+@OY'<XZ#G_J"B_&:PCV^eJQ?E=B=C=C=DDCJIPKRKRS[`i]g:JA!H#d&[+1$^Lap2O^fQYHN>D=C=C=C=C=D9?u27o03p04p04p04q15^(,P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'S"'O!&=M'!S#&S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&a)-q04p04p04p04p04p04p04p04p04p04p04p04o03s158==C=C?EEKJQLSKRKRR[YbajfpOYN :Q $,WC(MCW^hXaNUHN?EU]#_ RH$CS_enYcU^LSJQCJ>Ds15o04p04q04g,0P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#'R!&U+Q#&U#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&T#'h-1q15p04p04p04p04p04p04p04p04p04o04o04v279?=C>DEKJQKRJQJQKSOWV_YbXa`iiq]gt4P"W7"V"dN\ir`iYbS[KRKRJQELBH?F>D=C=C;Av27o03p04p04Z&*P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&U$(P"'P!'cS#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%W$(l.2q15p04p04p04p04p04p04p04p04o04o/3t268==C=CAGLSQXQYSZU\U]W_YbYbZcajfo_iT_BLA G'S *S^'AP[blircl\eT\KRKRKRKSKRIPGNELBHKS 5G ($I{1AHTWa_ibl\f^gYaOWLSKRKRMTSZU_KXMT=Cu26o03q15^'+P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&R#'P##3I$$Q"&T#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&_(,p04q04p04p04p04p04p04p04o/3p04x389>=C>D=C>DFMU\DXA$N@Tw7S9$TF%MXbblakXbe0KI,Vm3P=Il3Ia'8C+ 9$a #W' &Y#4w0@t5UIVMXR'Fv6V`hajXaU^V^Xa^gaki-EFWJP;Ar15p04l.2S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'P"&M Q#%nT#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&R#'d+/q04p04p04p04p04p04o04o/3r15|5::@=C=D=C=C>DHOLSYb^hp4OM$hS[#2;KO[R]?M# R 5e!W0?(9a!#R"?F"]6  F [=!&J"F,ZF#CN#8"Y&`B[gofockaibkemH[/IR_SZBH8=o/3q15_(,P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(Q"&xP$$#R"'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%V$(i-1q15p04p04p04p04o/3p04w377=D=C=C=C=C>DHOKROV[c[fX-Nb%kYT*bG%E8Ec%5M-9T     F!F%*Tf.QV_\fSgE\N\S]~4E&LS`ZgGP=Bx48p04l.2R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&R#&N!''Q"%T#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&\'+n/3q04p04p04o04o04s15}5::@=C>D=C=C=C=C=C>DHOLSJQSZ\eUaO.V4: V!)<*I##Q4+2(A"T" &#GD"=:KITo-AW'Sb)BO 9SF&M~;TMV=C:?p04q04]'+P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(Q"&R!%>R#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&S#'d+/q04p04p04o/3q04x389>D=C=C=C=C=C=C=C=CGNLSKRKRV^^gdmNWS$>"l+<`,  %(J6%DW.-)V%FBQOd-QTaQX=C=Cw37p04i-1Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S"'O"&DQ!&T#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P"&Z&*l.2q15o04o03s16}6;;@=C>D=C=C=C=C=C=C=C=C=CGNLSKRJQOVYbenblR\<%S'X$ !=K.  @E#Lk1PJaNT?E=C8=o03p04Y%)P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#'Q!&333P (@S"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%U$(d+/p04p04o04v378=D=C=C=C=C=C=C=C=C=C=B>EHOKRKRKRKRU^clir\gMYj+=B9  H KU&F[d\dKR@F=C;Aq04q04d*.P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'Q"%RR!%T#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%S#'`)-n/3p04p04x489?=C>D=C=C=C=C=C=C=C=C=C=C=C=CT!T==W110J!A  0BV*IO]ajV^LSGN=C=Cz59o/3q15]'+P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S"'Q (?R"&U#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%Q"&X%)c*.m/3q04p04v27D=CDBHHOKRKRJQKROVV^]f_hK*M(^$f%WR R <,?5@V`dmYbPXJQ?E=C~7;o/3q04h,0P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(P!&U +Q!&R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%Q"&V$(_(,i-1p04q15o04t268=CJMWYaRYJQKRKRKRIPFMDJBHAGCIELHOKRKRKRLTPXU^YbZcfoajt3L&b+F /!80F|;VembkZbOVCI=C8=o03p04o/3U$(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&R!'U''!Q$&kU$'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%Q"&V$(_(,i-1o04q15q04o04p04~6;o03p04q15]'+P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&U#'Q#%tQ#'S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%Q"&W%)a)-j-1o04q15q04p04p04o/3u27:?>D>DIPNUem9Qy6Qjq_hYbXaXaYb[dckKY^h`iZcYbYcYbYbXaYbclirgpT^:J>+R67F7m2NHX@P`-SRZ?E:@p04p04q15f+/P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'P"&UUUQ"(&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%U$(_(,i-1p04q15q04p04p04p04p04p04}5:=C=C=D=C=C=CGNKROWR\])EI!CHSQ\T_FV^gak\el2TH9HT^_ibkbkdmfohqgpcm\gLW@+P(M  6#nH'TQ\CI:?p04p04p04q04Y%)P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(Q!'uQ!%T#'Q"&Q"&Q"&P!%U$(d+/o04q15p04p04p04p04p04p04p04o03t26:@>D=C=C=C>DJQKRS[gpN]7C7D0SO"?4E=KLZKVw1C=YT)NFQ{8Qs5SXb]h]g[fZeS^HT`&:T  DG$NK`SZCI:?p04p04p04q15`(,P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#'Q"&U""Q#&S#&Q"&Q"&P"&](,m/3q15p04p04p04p04p04p04p04p04o03u27O(M?LHUFS@Nf(9%W%=?Nbk^fLTAH:@p04p04p04q04m.2S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'Q!%EP#&sU$(P"&S#'h-1q15p04p04p04p04p04p04p04p04p04o03x48=C=C=C=C=C=C=C>DIOPXYbXa`i`jWbh,C M1Y ["T,% -3 0'x"bS!67F:H4BN$7*J ?`,H9MR`MT?F:@p04p04p04p04o/3V$(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&U$(Q#%{R#'T#'R"&h,0q15p04p04p04p04p04p04p04p04p04o03v372g(7`%403"? ?"PO^KQ>D:@p04p04p04p04q15[&*P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#'Q"&UR"&R"&d*.q15p04p04p04p04p04p04p04p04p04o03u27D?EAGDKIPT\UaBS^h`k]gXbFRf'4T 7  Bne9O)O[fNU@F=C:@p04p04p04p04q15h,0P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&P#(3G!^_(,q15p04p04p04p04p04p04p04p04o03s15:@>DAHEKHOIPJQKROWV^aj^g<?:MP[O\BP9GC=XD(&{ /"=CeX_IP>D=C:@p04p04p04p04q04j-1Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'R")KJ#nl.2p04o/3o/3o/3o/3o/3o03o/3n/3t26n-=X$;7:S*";+X / ;7_1YbiPXGN=C=C:@p04p04p04p04p04l/3S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(R %g^(-gr15t26~6;8=7<~6;{5:x38y49;@EKKRKRKRKRKRJQOVW`YbYb^gblZeDM0J`X#`Sk!O ( -$IRe[bLSFM=C=C:@p04p04p04p04p04m/3S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(Q"'wQ"%6;=C=C=DBIGMHOLST\Xc[cV_S[OVMTOVU]]f]f]f\fYdYdJXj*9*;'p 58+v ' =MbbiS[KRELHm*8?l+D  #+FXem\eQXKRCIHm*8?l+D  #+FXem\eQXKRCIn-=X$;7:S*";+X / ;7_1YbiPXGN=C=C:@p04p04p04p04p04l/3S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(R %gG!^_(,q15p04p04p04p04p04p04p04p04o03s15:@>DAHEKHOIPJQKROWV^aj^g<?:MP[O\BP9GC=XD(&{ /"=CeX_IP>D=C:@p04p04p04p04q04j-1Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'R")KN!''R#&l.2q04p04p04p04p04p04p04p04p04o04s16;@=CD?EAGDKIPT\UaBS^h`k]gXbFRf'4T 7  Bne9O)O[fNU@F=C:@p04p04p04p04q15h,0P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&P#(3Q(P!%]'+q04p04p04p04p04p04p04p04p04p04o04s16;A=C=C=C=C=B2g(7`%403"? ?"PO^KQ>D:@p04p04p04p04q15[&*P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#'Q"&P#&sU$(P"&S#'h-1q15p04p04p04p04p04p04p04p04p04o03x48=C=C=C=C=C=C=C>DIOPXYbXa`i`jWbh,C M1Y ["T,% -3 0'x"bS!67F:H4BN$7*J ?`,H9MR`MT?F:@p04p04p04p04o/3V$(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&U$(Q#%{O#(:Q"&Q"&P"&R"&d+/q04p04p04p04p04p04p04p04p04p04o/3x48O(M?LHUFS@Nf(9%W%=?Nbk^fLTAH:@p04p04p04q04m.2S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'Q!%EU""Q#&S#&Q"&Q"&P"&](,m/3q15p04p04p04p04p04p04p04p04o03u27D=C=C=C>DJQKRS[gpN]7C7D0SO"?4E=KLZKVw1C=YT)NFQ{8Qs5SXb]h]g[fZeS^HT`&:T  DG$NK`SZCI:?p04p04p04q15`(,P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#'Q"&R"&jT#(Q"&Q"&Q"&Q"&P"&P"&V$(d*.n/3q15q04p04p04p04p04p04o04q158>=D=C=C=CGNKROWR\])EI!CHSQ\T_FV^gak\el2TH9HT^_ibkbkdmfohqgpcm\gLW@+P(M  6#nH'TQ\CI:?p04p04p04q04Y%)P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(Q!'uQ"(&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%U$(_(,i-1p04q15q04p04p04p04p04p04}5:=C=CD>DIPNUem9Qy6Qjq_hYbXaXaYb[dckKY^h`iZcYbYcYbYbXaYbclirgpT^:J>+R67F7m2NHX@P`-SRZ?E:@p04p04q15f+/P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'P"&UUUQ$&kU$'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%Q"&V$(_(,i-1o04q15q04o04p04~6;o03p04q15]'+P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&U#'Q#%tU +Q!&R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%Q"&V$(_(,i-1p04q15o04t268=CJMWYaRYJQKRKRKRIPFMDJBHAGCIELHOKRKRKRLTPXU^YbZcfoajt3L&b+F /!80F|;VembkZbOVCI=C8=o03p04o/3U$(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&R!'U''!R"&U#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%Q"&X%)c*.m/3q04p04v27D=CDBHHOKRKRJQKROVV^]f_hK*M(^$f%WR R <,?5@V`dmYbPXJQ?E=C~7;o/3q04h,0P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(P!&P!&6R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%T#'`)-l.2p04p04w379>=C=CT!T==W110J!A  0BV*IO]ajV^LSGN=C=Cz59o/3q15]'+P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S"'Q (?R!%T#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%S#'`)-n/3p04p04x489?=C>D=C=C=C=C=C=C=C=C=C=CD=C=C=C=C=C=C=C=C=C=B>EHOKRKRKRKRU^clir\gMYj+=B9  H KU&F[d\dKR@F=C;Aq04q04d*.P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'Q"%RQ!&T#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P"&Z&*l.2q15o04o03s16}6;;@=C>D=C=C=C=C=C=C=C=C=CGNLSKRJQOVYbenblR\<%S'X$ !=K.  @E#Lk1PJaNT?E=C8=o03p04Y%)P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#'Q!&333R!%>R#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&S#'d+/q04p04p04o/3q04x389>D=C=C=C=C=C=C=C=CGNLSKRKRV^^gdmNWS$>"l+<`,  %(J6%DW.-)V%FBQOd-QTaQX=C=Cw37p04i-1Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S"'O"&DQ"%T#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&\'+n/3q04p04p04o04o04s15}5::@=C>D=C=C=C=C=C>DHOLSJQSZ\eUaO.V4: V!)<*I##Q4+2(A"T" &#GD"=:KITo-AW'Sb)BO 9SF&M~;TMV=C:?p04q04]'+P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(Q"&P$$#R"'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%V$(i-1q15p04p04p04p04o/3p04w377=D=C=C=C=C>DHOKROV[c[fX-Nb%kYT*bG%E8Ec%5M-9T     F!F%*Tf.QV_\fSgE\N\S]~4E&LS`ZgGP=Bx48p04l.2R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&R#&N!''Q#%nT#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&R#'d+/q04p04p04p04p04p04o04o/3r15|5::@=C=D=C=C>DHOLSYb^hp4OM$hS[#2;KO[R]?M# R 5e!W0?(9a!#R"?F"]6  F [=!&J"F,ZF#CN#8"Y&`B[gofockaibkemH[/IR_SZBH8=o/3q15_(,P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#(Q"&xI$$Q"&T#(Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&_(,p04q04p04p04p04p04p04p04o/3p04x389>=C>D=C>DFMU\DXA$N@Tw7S9$TF%MXbblakXbe0KI,Vm3P=Il3Ia'8C+ 9$a #W' &Y#4w0@t5UIVMXR'Fv6V`hajXaU^V^Xa^gaki-EFWJP;Ar15p04l.2S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'P"&M Q##,S"'R"'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&[&*n/3q04p04p04p04p04p04p04p04o04o04u278=KS 5G ($I{1AHTWa_ibl\f^gYaOWLSKRKRMTSZU_KXMT=Cu26o03q15^'+P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&R#'P##3P!'cS#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%W$(l.2q15p04p04p04p04p04p04p04p04o04o/3t268==C=CAGLSQXQYSZU\U]W_YbYbZcajfo_iT_BLA G'S *S^'AP[blircl\eT\KRKRKRKSKRIPGNELBHDEKJQKRJQJQKSOWV_YbXa`iiq]gt4P"W7"V"dN\ir`iYbS[KRKRJQELBH?F>D=C=C;Av27o03p04p04Z&*P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&U$(P"'U++ Q"&T#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&R"&e+/q04p04p04p04p04p04p04p04p04p04p04o04p04z49;A=C?EELJQLSKRKQKRT\YcYbfofn>U]#_ RH$CS_enYcU^LSJQCJ>Ds15o04p04q04g,0P"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&T#'R!&U+M'!S#&S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&a)-q04p04p04p04p04p04p04p04p04p04p04p04o03s158==C=C?EEKJQLSKRKRR[YbajfpOYN :Q $,WC(MCW^hXaNUHN?EDCJIPKRKRS[`i]g:JA!H#d&[+1$^Lap2O^fQYHN>D=C=C=C=C=D9?u27o03p04p04p04q15^(,P!%Q"&Q"&Q"&Q"&Q"&Q"&Q"&S#'S"'O!&=P $@R"'R"'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P!%Y&*m/3q04p04p04p04p04p04p04p04p04p04p04p04o/3v37;A=D=CDDJJQKRYaAY+@OY'<XZ#G_J"B_&:PCV^eJQ?E=B=C=C=DD:?u26o/3p04p04p04p04q04m/3T#'P"&Q"&Q"&Q"&Q"&Q"&Q"&R"'S#'P!'VQ!'US"&S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&S#'e+/q15p04p04p04p04p04p04p04p04p04p04p04o04r15:?>D=C=C=C>DFLPW`hTdRbU_y2EPc@] WJXgpfnX`JQ?E=C=C=C7D=C=C>DIPKRZcL\m0KC GVadmZfTa;YR[BH{5:o/3p04p04p04p04p04p04p04`)-P"&Q"&Q"&Q"&Q"&Q"&T#'R#'S"%oN$1R#'T#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&R"&_)-n/3q15p04p04p04p04p04p04p04p04p04:?=D=C=CGOKQZb;Q>ATaiV^T\YaQ\FM7NWaNUKRIPFMAG8=p04p04p04p04p04p04q04h-1V$(P!%Q"&Q"&Q"&Q"&T#'S"'Q"&N'' S$$1R#'S#'S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P"&X%)g,0p04q15p04p04p04p04p04o04t26;A=CCJPW]f9LTaX`GNBI>D=C8>p04p04p04p04p04q15n/3_(,Q"&P"&Q"&Q"&Q"&S#'S#'R"&R"&5Q#&XR#'U#(R#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P"&X%)f+/o/3q15q04p04p04p04o04r159>?ER[KXP\P\GN=C=C=C8=p04p04p04q04q15n/3b*.U$(P!%Q"&Q"&Q"&R"'T#(S#&Q#&_I$$S"&rR#&T#'R#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P"&V$(`)-j-1p04q15q04p04p04p04z59?EJRJQCI=C=C:@y49p04p04q15q04l.2a)-U$(P!%P"&Q"&Q"&R"'U#(R"&Q"'wU+KQ"&qR#&T#(S#'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%R"&X%)`)-h,0m/3p04q04p04q04v37{5:{5:|5:w37q15p04o/3j-1c*.Y%)R#'P!%P"&Q"&Q"&S#'T#'R#&R#'R$$K-R#%mR#'S#'T#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%Q"&S#'X%)\'+_(,c*.c*.b*.b*.b*.a)-^(,Z&*U$(Q"&P!%P"&Q"&Q"&R"&T#'S#'R"'S"'oY&&I$$S$(GR"'Q"'T#(T#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&P"&P!%P!%P!%P!%P!%P!%P!%P!%P!%P"&P"&Q"&Q"&R"&S#'T$(R"&R"'R$'N` O##Q!&kR"&R#&T#(T#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&T#'T#(R#&R"&R#(mM'!U##$S"'iR#&Q"&R#'U#(T#'R"'Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"'T#'U#(R#'Q"&Q"&Q!&kU##$U$$Q#'BR#'}Q"'R"&Q#'T#'U#(T#'S#'R"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&Q"&R"&S#'T#'U#(T#'Q"&R"&Q"'R#&S$(GU$$U""S!'.Q"'[Q"&Q!&Q"&Q"&Q"&Q"&S#'T#(T#(S#'Q"&Q"&Q"&Q"&Q"&Q"&S#'T#(T#(S#'R"&Q"&Q"&Q"&Q!&Q"&Q#&^R"&5U""UKS")%Q$(9Q#'HP#&fS#&lQ"&S#'Q"&Q"&Q"&Q"&S#'Q"&S!&lR"&jR"%KR!%>N!''Q((U????????( @ P R"&5R"%ZQ"'wQ"&Q"&Q"'wO"%ZR"&5P M Q"%RR"&Q"&R"&T#'T#(Q"&P"&U#(U$(S#'R#&Q"&P"%SF. UQ#&_R"'S#'T#'R"'Q"&Q"&P!%U$(`)-i-18>BI7DRZ=Yr6UPW}6;q05f,0U$(R#&O!&=O %7R#'S#'Q"&Q"&Q"&Q"&P!%X%)l.2p04o/36;AGQXp6U %/C[EJ8>t26`)-R#'R#'Q$$9R)R"&S#'Q"&Q"&Q"&Q"&P!%['+n/3q04w37>EJVV_\h`0KE\WaKQFM{5:V$(S#'R#&L&P#&U#(Q"&Q"&Q"&P"&Q"&`)-s15|5:9?CIM\:'Pi4M3!9# $&F(AK^=W?Oj-0P!%T#(Q"%O#(:R#'Q"&Q"&P!%P"%V$(m.37<;A=CBHOWQb%2  "3IY~6:U$(Q"&R"&O!&=Q"%S#'P"&T$(['+i-1=EKTLRHOMST\Wd-!?81R`;A^(,P!%T#(Q"&U$$P"%Y&*f+/m/2z49p04Y&*P"&R"'R"&z4:עELDOJVMYL\Y,N (P%1QZ9>p04Y&*P"&R"'R"&Z')iq15p03~6;BHKQO[D[!5 );M=Bn/3W%)P"&T#(Q!&kL"&C_(,p04p04z49;ADJ\cr7R - 'Z-E@!5g1FAGk.2T#'Q"&S#'P!$FU$$P"%Y&*f+/m/2z49EJVV_\h`0KE\WaKQFM{5:V$(S#'R#&L&O %7R#'S#'Q"&Q"&Q"&Q"&P!%X%)l.2p04o/36;AGQXp6U %/C[EJ8>t26`)-R#'R#'Q$$9Q"&DRZ=Yr6UPW}6;q05f,0U$(R#&O!&=P$$#S#&T#'S#'Q"&Q"&Q"&P"&Q"&`)-n/3p04~6;HOHZHWBI7EHR}:O  q3=w37S#'7N!%>EHR}:O  q3=w37S#'7 La)-r15GM=S_.B #include #include "catalog.h" #include "misc-f.h" /* Well, just simple implementation of unbalanced trees in combination * of small hash table. I am lazy :) but should be OK for my purposes * * This function is used for both-lookups and adds into table (since most of * code is the same, depends whether newvalue is NULL. If newvalue is nonNULL, * new variable is added into table, if name is not present here or value is * changed otherwise. */ static char *find_variable(catalog_t *context, const char *name, const char *newvalue) { int r = 0; int hash = (int)strlen(name); struct varnames *current, *last, *newp; hash = ((unsigned char)(name[0]) + (unsigned char)(name[hash - 1]) + hash) % (unsigned int)CHASHMAX; current = last = context->root[hash]; while (current != NULL) { last = current; r = strcmp(current->name, name); if (!r) { if (newvalue != NULL) { /*overwrite value */ free(current->value); current->value = mystrdup(newvalue); } return (current->value); } if (r > 0) current = current->left; else current = current->right; } /*Entry is new */ if (newvalue == NULL) return (NULL); newp = (struct varnames *)calloc(1, sizeof(struct varnames)); newp->name = mystrdup(name); newp->value = mystrdup(newvalue); /*FIXME. Should take a care to full memory */ newp->left = NULL; newp->right = NULL; if (last == NULL) { context->root[hash] = newp; } else { if (r > 0) last->left = newp; else last->right = newp; } return (newp->value); } /* * free memory used by node and its sons */ static void free_node(struct varnames *node) { while (node != NULL) { struct varnames *nextnode; free_node(node->left); nextnode = node->right; free(node->name); free(node->value); free(node); node = nextnode; } } /* * free catalog */ void free_catalog(catalog_t *context) { int i; for (i = 0; i < CHASHMAX; i++) { free_node(context->root[i]); context->root[i] = NULL; } free(context); } static catalog_t *alloc_catalog(void) { int i; catalog_t *c; c = (catalog_t *)calloc(1, sizeof(catalog_t)); if (c == NULL) return NULL; for (i = 0; i < CHASHMAX; i++) c->root[i] = NULL; return c; } /* * Parse an catalog file and save values into memory */ // FIXME: this macro gives a segfault if \" is used in text. kovzol, 2009-06-29 #define seterror(text) \ sprintf(errort, "line %i:%s", line, text), *error = errort catalog_t *load_catalog(xio_file f, const char **error) { int i; int line = 1; int size; int c; catalog_t *catalog = alloc_catalog(); static char errort[80]; char name[1024]; char value[1024]; if (catalog == NULL) { *error = "Out of memory"; } if (f == NULL) { *error = "File could not be opened"; free_catalog(catalog); return NULL; } /* Just very simple parsing loop of format * [blanks]name[blanks]"value"[blanks] * Blanks should be comments using # or space, newline, \r and tabulator * Value should contain and \ sequences where \\ means \ and * \[something] means something. Should be used for character " */ while (!xio_feof(f)) { do { c = xio_getc(f); if (c == '\n') line++; if (c == '#') { while ((c = xio_getc(f)) != '\n' && c != XIO_EOF) ; line++; } } while (c == ' ' || c == '\n' || c == '\r' || c == '\t'); /*Skip blanks */ if (c == XIO_EOF) { if (xio_feof(f)) break; free_catalog(catalog); seterror("read error"); xio_close(f); return NULL; } i = 0; /*read name */ do { name[i] = c; i++; c = xio_getc(f); if (c == '\n') line++; if (i == 1024) { seterror("Name is too long (>=1024 characters)"); free_catalog(catalog); xio_close(f); return NULL; } } while (c != '\n' && c != ' ' && c != '\t' && c != XIO_EOF); /*Skip blanks */ while (c == ' ' || c == '\n' || c == '\r' || c == '\t') { c = xio_getc(f); if (c == '\n') line++; if (c == '#') { while ((c = xio_getc(f)) != '\n' && c != XIO_EOF) ; line++; } } /*Skip blanks */ if (c == XIO_EOF) { if (xio_feof(f)) seterror("Unexpected end of file after name field"); else seterror("read error"); free_catalog(catalog); xio_close(f); return NULL; } name[i] = 0; if (c != '"') { seterror("Begin of value field expected"); // Text modified due to // segfault problem, see // above (kovzol) free_catalog(catalog); xio_close(f); return NULL; } c = xio_getc(f); if (c == '\n') line++; i = 0; size = 0; do { if (c == '\\') value[i] = xio_getc(f); else value[i] = c; i++; c = xio_getc(f); if (c == '\n') line++, size = 0; size++; if (i == 1024) { seterror("Value is too long (>=1024 characters)"); free_catalog(catalog); xio_close(f); return NULL; } } while (c != '"' && c != XIO_EOF); if (c == XIO_EOF) { seterror("Unexpected EOF in value field"); free_catalog(catalog); xio_close(f); return NULL; } value[i] = 0; find_variable(catalog, name, value); } /*while */ xio_close(f); return (catalog); } /*load_catalog */ char *find_text(catalog_t *catalog, const char *name) { return (find_variable(catalog, name, NULL)); } XaoS-release-4.3.2/src/util/grlibd.h000066400000000000000000000205671455214672000172100ustar00rootroot00000000000000#ifndef UNSUPPORTED static inline void hline(struct image *img, int x, int y, int length, int fgcolor) { cpixel_t *current = (cpixel_t *)img->currlines[y], *end = (cpixel_t *)img->currlines[y]; p_inc(current, x); p_inc(end, x + length); #ifdef bpp1 memset(current, fgcolor, end - current + 1); #else while (current <= end) { p_set(current, fgcolor); p_inc(current, 1); } #endif } static inline void vline(struct image *img, int x, int y, int length, int fgcolor) { length += y; while (y <= length) { cpixel_t *current = (cpixel_t *)img->currlines[y]; p_inc(current, x); p_set(current, fgcolor); y++; } } static inline void rectangle(struct image *img, int x, int y, int width, int height, int fgcolor) { height += y; while (y < height) hline(img, x, y, width - 1, fgcolor), y++; } static inline char *savevline(struct image *img, int x, int y, int length) { cpixel_t *saved = (cpixel_t *)malloc(length * bpp + bpp), *s = saved; length += y; while (y <= length) { cpixel_t *current = (cpixel_t *)img->currlines[y]; p_copy(s, 0, current, x); p_inc(s, 1); y++; } return (char *)saved; } static inline void restorevline(struct image *img, char *saved, int x, int y, int length) { cpixel_t *s = (cpixel_t *)saved; length += y; while (y <= length) { cpixel_t *current = (cpixel_t *)img->currlines[y]; p_copy(current, x, s, 0); p_inc(s, 1); y++; } } static inline char *saveline(struct image *img, int x, int y, int x2, int y2) { int dx = x2 - x; int dy = y2 - y; int ady = abs(dy); if (dx < ady) { cpixel_t *saved = (cpixel_t *)malloc((ady + 1) * bpp * 2), *s = saved; int plus = (dx << 16) / ady; if (dy < 0) { int dy = (x << 16) /*| (65536 / 2) */; ady = y; while (ady >= y2) { cpixel_t *current = (cpixel_t *)img->currlines[ady]; p_inc(current, (dy >> 16)); p_copy(s, 0, current, 0); p_copy(s, 1, current, 1); p_inc(s, 2); dy += plus; ady--; } } else { int dy = (x << 16) /*| (65536 / 2) */; ady = y; while (ady <= y2) { cpixel_t *current = (cpixel_t *)img->currlines[ady]; p_inc(current, (dy >> 16)); p_copy(s, 0, current, 0); p_copy(s, 1, current, 1); p_inc(s, 2); dy += plus; ady++; } } return ((char *)saved); } else { cpixel_t *saved = (cpixel_t *)malloc((dx + 1) * bpp * 2), *s = saved; int plus = (dy << 16) / dx; ady = x; dy = (y << 16); while (ady <= x2) { cpixel_t *current = (cpixel_t *)img->currlines[dy >> 16]; p_copy(s, 0, current, ady); current = (cpixel_t *)img->currlines[(dy >> 16) + 1]; p_copy(s, 1, current, ady); p_inc(s, 2); dy += plus; ady++; } return ((char *)saved); } } static inline void restoreline(struct image *img, char *saved, int x, int y, int x2, int y2) { int dx = x2 - x; int dy = y2 - y; int ady = abs(dy); if (dx < ady) { cpixel_t *s = (cpixel_t *)saved; int plus = (dx << 16) / ady; if (dy < 0) { int dy = (x << 16) /*| (65536 / 2) */; ady = y; while (ady >= y2) { cpixel_t *current = (cpixel_t *)img->currlines[ady]; p_inc(current, (dy >> 16)); p_copy(current, 0, s, 0); p_copy(current, 1, s, 1); p_inc(s, 2); dy += plus; ady--; } } else { int dy = (x << 16) /*| (65536 / 2) */; ady = y; while (ady <= y2) { cpixel_t *current = (cpixel_t *)img->currlines[ady]; p_inc(current, (dy >> 16)); p_copy(current, 0, s, 0); p_copy(current, 1, s, 1); p_inc(s, 2); dy += plus; ady++; } } } else { cpixel_t *s = (cpixel_t *)saved; int plus = (dy << 16) / dx; ady = x; dy = (y << 16); while (ady <= x2) { cpixel_t *current = (cpixel_t *)img->currlines[dy >> 16]; p_copy(current, ady, s, 0); current = (cpixel_t *)img->currlines[(dy >> 16) + 1]; p_copy(current, ady, s, 1); p_inc(s, 2); dy += plus; ady++; } } } #ifdef bpp1 #define myinterpol(a, b, n) intergray(a, b, n) #else #define myinterpol(a, b, n) interpol(a, b, n, rmask, gmask, bmask) #endif static inline void line(struct image *img, int x, int y, int x2, int y2, int color) { int dx = x2 - x; int dy = y2 - y; int ady = abs(dy); #ifndef bpp1 int rmask = img->palette->info.truec.rmask; int gmask = img->palette->info.truec.gmask; int bmask = img->palette->info.truec.bmask; #endif #ifdef bpp1 if (img->palette->type &= (C256 | FIXEDCOLOR)) { if (dx < ady) { int plus = (dx << 16) / ady; if (dy < 0) { int dy = (x << 16) | (65536 / 2); ady = y; while (ady >= y2) { cpixel_t *current = (cpixel_t *)img->currlines[ady]; p_inc(current, (dy >> 16)); p_set(current, color); dy += plus; ady--; } } else { int dy = (x << 16) | (65536 / 2); ady = y; while (ady <= y2) { cpixel_t *current = (cpixel_t *)img->currlines[ady]; p_inc(current, (dy >> 16)); p_set(current, color); dy += plus; ady++; } } } else { int plus = (dy << 16) / dx; ady = x; dy = (y << 16) | (65536 / 2); while (ady <= x2) { cpixel_t *current = (cpixel_t *)img->currlines[dy >> 16]; p_setp(current, ady, color); dy += plus; ady++; } } return; } #endif if (dx < ady) { int plus = (dx << 16) / ady; if (dy < 0) { int dy = (x << 16); ady = y; while (ady >= y2) { cpixel_t *current = (cpixel_t *)img->currlines[ady]; p_inc(current, (dy >> 16)); p_set(current, myinterpol(p_get(current), color, ((dy & 65535) >> 8))); p_setp( current, 1, myinterpol(color, p_getp(current, 1), ((dy & 65535) >> 8))); dy += plus; ady--; } } else { int dy = (x << 16); ady = y; while (ady <= y2) { cpixel_t *current = (cpixel_t *)img->currlines[ady]; p_inc(current, (dy >> 16)); p_set(current, myinterpol(p_get(current), color, ((dy & 65535) >> 8))); p_setp( current, 1, myinterpol(color, p_getp(current, 1), ((dy & 65535) >> 8))); dy += plus; ady++; } } } else { int plus = (dy << 16) / dx; ady = x; dy = (y << 16); while (ady <= x2) { cpixel_t *current = (cpixel_t *)img->currlines[dy >> 16]; p_setp( current, ady, myinterpol(p_getp(current, ady), color, ((dy & 65535) >> 8))); current = (cpixel_t *)img->currlines[(dy >> 16) + 1]; p_setp( current, ady, myinterpol(color, p_getp(current, ady), ((dy & 65535) >> 8))); dy += plus; ady++; } } } #undef myinterpol #endif #undef drawchar #undef hline #undef vline #undef rectangle #undef line #undef restoreline #undef saveline #undef savevline #undef restorevline XaoS-release-4.3.2/src/util/image.cpp000066400000000000000000000513751455214672000173630ustar00rootroot00000000000000#include #include #include #include #include "config.h" #include "filter.h" #include "fractal.h" #include "ui_helper.h" #include "grlib.h" #include "c256.h" void flipgeneric(struct image *img) { pixel_t **line; assert(img->nimages == 2); img->currimage ^= 1; line = img->currlines; img->currlines = img->oldlines; img->oldlines = line; } int bytesperpixel(int type) { switch (type) { case MBITMAP: case LBITMAP: case LIBITMAP: case MIBITMAP: return 0; case SMALLITER: case FIXEDCOLOR: case GRAYSCALE: case C256: return 1; case LARGEITER: case TRUECOLOR16: return 2; case TRUECOLOR24: return 3; case TRUECOLOR: return 4; default: assert(0); return 0; } } struct image *create_image_lines(int width, int height, int nimages, pixel_t **lines1, pixel_t **lines2, struct palette *palette, void (*flip)(struct image *img), int flags, float pixelwidth, float pixelheight) { int i; static int version = 1; struct image *img = (struct image *)calloc(1, sizeof(*img)); if (img == NULL) return NULL; if (flip == NULL) flip = flipgeneric; img->width = width; img->height = height; img->nimages = nimages; img->bytesperpixel = bytesperpixel(palette->type); img->palette = palette; img->currimage = 0; img->flip = flip; img->flags = flags; img->version = version; version += 65535; img->currlines = lines1; img->oldlines = lines2; img->pixelwidth = pixelwidth; img->pixelheight = pixelheight; if (lines1 != NULL && (nimages != 2 || lines2 != NULL)) { img->scanline = (int)(lines1[1] - lines1[0]); if (img->scanline < 0) img->scanline = -1; else { for (i = 0; i < height; i++) { if (lines1[0] - lines1[i] != img->scanline * i) { img->scanline = -1; break; } if (nimages == 2 && lines2[0] - lines2[i] != img->scanline * i) { img->scanline = -1; break; } } } } else img->scanline = -1; return (img); } struct image *create_image_cont(int width, int height, int scanlinesize, int nimages, pixel_t *buf1, pixel_t *buf2, struct palette *palette, void (*flip)(struct image *img), int flags, float pixelwidth, float pixelheight) { struct image *img = create_image_lines(width, height, nimages, NULL, NULL, palette, flip, flags, pixelwidth, pixelheight); int i; if (img == NULL) { return NULL; } if ((img->currlines = (pixel_t **)malloc(sizeof(*img->currlines) * height)) == NULL) { free(img); return NULL; } if (nimages == 2) { if ((img->oldlines = (pixel_t **)malloc(sizeof(*img->oldlines) * height)) == NULL) { free(img->currlines); free(img); return NULL; } } for (i = 0; i < img->height; i++) { img->currlines[i] = buf1; buf1 += scanlinesize; } if (nimages == 2) for (i = 0; i < img->height; i++) { img->oldlines[i] = buf2; buf2 += scanlinesize; } img->flags |= FREELINES; img->scanline = scanlinesize; img->data = NULL; img->free = NULL; return (img); } struct image *create_image_mem(int width, int height, int nimages, struct palette *palette, float pixelwidth, float pixelheight) { unsigned char *data = (unsigned char *)calloc(((width + 3) & ~3) * height, bytesperpixel(palette->type)); unsigned char *data1 = (unsigned char *)(nimages == 2 ? calloc(((width + 3) & ~3) * height, bytesperpixel(palette->type)) : NULL); struct image *img; if (data == NULL) { #ifdef DEBUG printf("Image:out of memory\n"); #endif return (NULL); } if (nimages == 2 && data1 == NULL) { free(data); #ifdef DEBUG printf("Image:out of memory2\n"); #endif return NULL; } img = create_image_cont( width, height, ((width + 3) & ~3) * bytesperpixel(palette->type), nimages, data, data1, palette, NULL, 0, pixelwidth, pixelheight); if (img == NULL) { free(data); if (data1 != NULL) free(data1); return NULL; } img->flags |= FREEDATA; return (img); } struct image *create_subimage(struct image *simg, int width, int height, int nimages, struct palette *palette, float pixelwidth, float pixelheight) { int size = height * bytesperpixel(palette->type); int i; int shift1 = 0, shift2 = 0; struct image *img; if (size > simg->height * simg->bytesperpixel || height > simg->height || (nimages == 2 && simg->nimages == 1)) return (create_image_mem(width, height, nimages, palette, pixelwidth, pixelheight)); nimages = simg->nimages; img = create_image_lines(width, height, nimages, NULL, NULL, palette, NULL, 0, pixelwidth, pixelheight); if (img == NULL) return NULL; if ((img->currlines = (pixel_t **)malloc(sizeof(*img->currlines) * height)) == NULL) { free(img); return NULL; } if (nimages == 2) { if ((img->oldlines = (pixel_t **)malloc(sizeof(*img->oldlines) * height)) == NULL) { free(img->currlines); free(img); return NULL; } } shift1 = simg->height - img->height; shift2 = simg->width * simg->bytesperpixel - img->width * img->bytesperpixel; for (i = 0; i < img->height; i++) { img->currlines[i] = simg->currlines[i + shift1] + shift2; } if (nimages == 2) for (i = 0; i < img->height; i++) { img->oldlines[i] = simg->oldlines[i + shift1] + shift2; } img->flags |= FREELINES; img->currimage = simg->currimage; return (img); } void destroy_image(struct image *img) { if (img->free) { img->free(img); return; } if (img->flags & FREEDATA) { free(*img->currlines); if (img->nimages == 2) free(*img->oldlines); } if (img->flags & FREELINES) { free(img->currlines); if (img->nimages == 2) free(img->oldlines); } free(img); } void clear_image(struct image *img) { int color = img->palette->pixels[0]; int width = img->width * img->bytesperpixel; if (img->palette->npreallocated) color = img->palette->index[0]; if (!width) { width = (img->width + 7) / 8; if (color) color = 255; } for (int i = 0; i < img->height; i++) for (int j = 0; j < width; j++) { if (j % img->bytesperpixel == img->palette->info.truec.missingbyte) img->currlines[i][j] = 0xff; else img->currlines[i][j] = color; } } #define drawchar drawchar8 #define hline hline8 #define vline vline8 #define rectangle rectangle8 #define savevline savevline8 #define restorevline restorevline8 #define line line8 #define saveline saveline8 #define restoreline restoreline8 #include "grlibd.h" #include "hicolor.h" #define drawchar drawchar16 #define hline hline16 #define vline vline16 #define rectangle rectangle16 #define savevline savevline16 #define restorevline restorevline16 #define line line16 #define saveline saveline16 #define restoreline restoreline16 #include "grlibd.h" #include "true24.h" #define drawchar drawchar24 #define hline hline24 #define vline vline24 #define rectangle rectangle24 #define savevline savevline24 #define restorevline restorevline24 #define line line24 #define saveline saveline24 #define restoreline restoreline24 #include "grlibd.h" #include "truecolor.h" #define drawchar drawchar32 #define hline hline32 #define vline vline32 #define rectangle rectangle32 #define savevline savevline32 #define restorevline restorevline32 #define line line32 #define saveline saveline32 #define restoreline restoreline32 #include "grlibd.h" void xhline(struct image *image, int x, int y, int width, int fgcolor) { /*Do some clipping */ if (x + width < 0 || y < 0 || y >= image->height || x >= image->width) return; if (x + width >= image->width - 1) width = image->width - x - 2; if (x < 0) width += x, x = 0; if (width < 0) return; switch (image->bytesperpixel) { #ifdef SBITMAPS case 0: hline1(image, x, y, width, fgcolor); break; #endif case 1: hline8(image, x, y, width, fgcolor); break; #ifdef SUPPORT16 case 2: hline16(image, x, y, width, fgcolor); break; #endif #ifdef STRUECOLOR24 case 3: hline24(image, x, y, width, fgcolor); break; #endif case 4: hline32(image, x, y, width, fgcolor); break; } } void xvline(struct image *image, int x, int y, int height, int fgcolor) { /*Do some clipping */ if (x < 0 || y + height < 0 || y >= image->height || x >= image->width) return; if (y + height >= image->height - 1) height = image->height - y - 2; if (y < 0) height += y, y = 0; if (height < 0) return; switch (image->bytesperpixel) { #ifdef SBITMAPS case 0: vline1(image, x, y, height, fgcolor); break; #endif case 1: vline8(image, x, y, height, fgcolor); break; #ifdef SUPPORT16 case 2: vline16(image, x, y, height, fgcolor); break; #endif #ifdef STRUECOLOR24 case 3: vline24(image, x, y, height, fgcolor); break; #endif case 4: vline32(image, x, y, height, fgcolor); break; } } void xrectangle(struct image *image, int x, int y, int width, int height, int fgcolor) { /*Do some clipping */ if (x + width < 0 || y + height < 0 || y >= image->height || x >= image->width) return; if (x + width >= image->width) width = image->width - x; if (x < 0) width += x, x = 0; if (width < 0) return; if (y + height >= image->height) height = image->height - y; if (y < 0) height += y, y = 0; if (height < 0) return; switch (image->bytesperpixel) { #ifdef SBITMAPS case 0: rectangle1(image, x, y, width, height, fgcolor); break; #endif case 1: rectangle8(image, x, y, width, height, fgcolor); break; #ifdef SUPPORT16 case 2: rectangle16(image, x, y, width, height, fgcolor); break; #endif #ifdef STRUECOLOR24 case 3: rectangle24(image, x, y, width, height, fgcolor); break; #endif case 4: rectangle32(image, x, y, width, height, fgcolor); break; } } static inline char *savehline(struct image *i, int x1, int y, int x2) { int start, end; char *c; if (!i->bytesperpixel) start = (x1) / 8, end = (x2 + 1 + 7) / 8; else start = x1 * i->bytesperpixel, end = (x2 + 1) * i->bytesperpixel; c = (char *)malloc(end - start); if (c == NULL) return NULL; memcpy(c, i->currlines[y] + start, end - start); return c; } static inline void restorehline(struct image *i, char *c, int x1, int y, int x2) { int start, end; if (!i->bytesperpixel) start = (x1) / 8, end = (x2 + 1 + 7) / 8; else start = x1 * i->bytesperpixel, end = (x2 + 1) * i->bytesperpixel; memcpy(i->currlines[y] + start, c, end - start); } #define __clipx1 0 #define __clipy1 0 #define __clipx2 (img->width - 2) #define __clipy2 (img->height - 2) static inline int regioncode(struct image *img, const int x, const int y) { int dx1, dx2, dy1, dy2; int result; result = 0; dy2 = __clipy2 - y; if (dy2 < 0) result++; result <<= 1; dy1 = y - __clipy1; if (dy1 < 0) result++; result <<= 1; dx2 = __clipx2 - x; if (dx2 < 0) result++; result <<= 1; dx1 = x - __clipx1; if (dx1 < 0) result++; return result; } #define swap(x, y) \ { \ int temp = x; \ x = y; \ y = temp; \ } #define doclip(ret) \ for (;;) { \ int r1 = regioncode(img, x1, y1); \ int r2 = regioncode(img, x2, y2); \ if (!(r1 | r2)) \ break; /* completely inside */ \ if (r1 & r2) \ ret; /* completely outside */ \ if (r1 == 0) { \ swap(x1, x2); /* make sure first */ \ swap(y1, y2); /* point is outside */ \ r1 = r2; \ } \ if (r1 & 1) { /* left */ \ y1 += (long)(__clipx1 - x1) * (long)(y2 - y1) / (long)(x2 - x1); \ x1 = __clipx1; \ } else if (r1 & 2) { /* right */ \ y1 += (long)(__clipx2 - x1) * (long)(y2 - y1) / (long)(x2 - x1); \ x1 = __clipx2; \ } else if (r1 & 4) { /* top */ \ x1 += (long)(__clipy1 - y1) * (long)(x2 - x1) / (long)(y2 - y1); \ y1 = __clipy1; \ } else if (r1 & 8) { /* bottom */ \ x1 += (long)(__clipy2 - y1) * (long)(x2 - x1) / (long)(y2 - y1); \ y1 = __clipy2; \ } \ } \ if (x2 < x1) { \ swap(x1, x2); \ swap(y1, y2); \ } void xline(struct image *img, int x1, int y1, int x2, int y2, int color) { doclip(return ); if (x1 == x2) { if (y2 < y1) { swap(y1, y2); } switch (img->bytesperpixel) { #ifdef SBITMAPS case 0: vline1(img, x1, y1, y2 - y1, color); break; #endif case 1: vline8(img, x1, y1, y2 - y1, color); break; #ifdef SUPPORT16 case 2: vline16(img, x1, y1, y2 - y1, color); break; #endif #ifdef STRUECOLOR24 case 3: vline24(img, x1, y1, y2 - y1, color); break; #endif case 4: vline32(img, x1, y1, y2 - y1, color); break; } } else if (y1 == y2) { switch (img->bytesperpixel) { #ifdef SBITMAPS case 0: hline1(img, x1, y1, x2 - x1, color); break; #endif case 1: hline8(img, x1, y1, x2 - x1, color); break; #ifdef SUPPORT16 case 2: hline16(img, x1, y1, x2 - x1, color); break; #endif #ifdef STRUECOLOR24 case 3: hline24(img, x1, y1, x2 - x1, color); break; #endif case 4: hline32(img, x1, y1, x2 - x1, color); break; } } else { switch (img->bytesperpixel) { #ifdef SBITMAPS case 0: line1(img, x1, y1, x2, y2, color); break; #endif case 1: line8(img, x1, y1, x2, y2, color); break; #ifdef SUPPORT16 case 2: line16(img, x1, y1, x2, y2, color); break; #endif #ifdef STRUECOLOR24 case 3: line24(img, x1, y1, x2, y2, color); break; #endif case 4: line32(img, x1, y1, x2, y2, color); break; } } } char *xsaveline(struct image *img, int x1, int y1, int x2, int y2) { doclip(return (NULL)); if (y1 == y2) { return (savehline(img, x1, y1, x2)); } else if (x1 == x2) { if (y2 < y1) { swap(y1, y2); } switch (img->bytesperpixel) { #ifdef SBITMAPS case 0: return (savevline8(img, x1 / 8, y1, y2 - y1)); #endif case 1: return (savevline8(img, x1, y1, y2 - y1)); #ifdef SUPPORT16 case 2: return (savevline16(img, x1, y1, y2 - y1)); #endif #ifdef STRUECOLOR24 case 3: return (savevline24(img, x1, y1, y2 - y1)); #endif case 4: return (savevline32(img, x1, y1, y2 - y1)); } } else { switch (img->bytesperpixel) { #ifdef SBITMAPS case 0: if (x2 > img->height - 15) x2 = img->height - 15; if (x1 > img->height - 15) x1 = img->height - 15; return (saveline8(img, (x1 / 8), y1, (x2 / 8), y2)); #endif case 1: return (saveline8(img, x1, y1, x2, y2)); #ifdef SUPPORT16 case 2: return (saveline16(img, x1, y1, x2, y2)); #endif #ifdef STRUECOLOR24 case 3: return (saveline24(img, x1, y1, x2, y2)); #endif case 4: return (saveline32(img, x1, y1, x2, y2)); } } return NULL; } void xprepareimage(struct image */*img*/) {} void xrestoreline(struct image *img, char *data, int x1, int y1, int x2, int y2) { doclip(return ); if (y1 == y2) { restorehline(img, data, x1, y1, x2); return; } else if (x1 == x2) { if (y2 < y1) { swap(y1, y2); } switch (img->bytesperpixel) { #ifdef SBITMAPS case 0: restorevline8(img, data, x1 / 8, y1, y2 - y1); break; #endif case 1: restorevline8(img, data, x1, y1, y2 - y1); break; #ifdef SUPPORT16 case 2: restorevline16(img, data, x1, y1, y2 - y1); break; #endif #ifdef STRUECOLOR24 case 3: restorevline24(img, data, x1, y1, y2 - y1); break; #endif case 4: restorevline32(img, data, x1, y1, y2 - y1); break; } } else { switch (img->bytesperpixel) { #ifdef SBITMAPS case 0: if (x2 > img->height - 15) x2 = img->height - 15; if (x1 > img->height - 15) x1 = img->height - 15; restoreline8(img, data, x1 / 8, y1, x2 / 8, y2); break; #endif case 1: restoreline8(img, data, x1, y1, x2, y2); break; #ifdef SUPPORT16 case 2: restoreline16(img, data, x1, y1, x2, y2); break; #endif #ifdef STRUECOLOR24 case 3: restoreline24(img, data, x1, y1, x2, y2); break; #endif case 4: restoreline32(img, data, x1, y1, x2, y2); break; } } return; } XaoS-release-4.3.2/src/util/palette.cpp000066400000000000000000001027101455214672000177250ustar00rootroot00000000000000#include #include #include #include #include #include #include "config.h" #include "filter.h" #include "misc-f.h" #include "xerror.h" #define nprecells \ (context->type & \ (LARGEITER | SMALLITER | TRUECOLOR | TRUECOLOR16 | TRUECOLOR24) \ ? 0 \ : (context)->ncells) #define PREALLOCATED(palette) \ ((palette)->type & \ (LARGEITER | SMALLITER | TRUECOLOR | TRUECOLOR16 | TRUECOLOR24) \ ? 0 \ : (palette)->npreallocated) /*emulate allocation routines using setpalette */ unsigned col_diff[3][512]; static struct palette *context; static int maxentries; static int needupdate; static void genertruecolorinfo(struct truec *t, unsigned int r, unsigned int g, unsigned int b) { int n; for (n = 0; !((r >> n) & 1); n++) ; t->rshift = n; for (; ((r >> n) & 1); n++) ; t->rprec = 8 - (n - t->rshift); t->rmask = r; for (n = 0; !((g >> n) & 1); n++) ; t->gshift = n; for (; ((g >> n) & 1); n++) ; t->gprec = 8 - (n - t->gshift); t->gmask = g; for (n = 0; !((b >> n) & 1); n++) ; t->bshift = n; for (; ((b >> n) & 1); n++) ; t->bprec = 8 - (n - t->bshift); t->bmask = b; t->allmask = r | g | b; if ((r & b) || (r & g) || (b & g)) { x_fatalerror("Internal error:Invalid color masks 1 %x %x %x!\n", r, g, b); } if ((r < g && g < b) || (b < g && g < r)) { t->mask1 = r | b; t->mask2 = g; } else if ((g < r && r < b) || (b < r && r < g)) { t->mask1 = g | b; t->mask2 = r; } else if ((g < b && b < r) || (r < b && b < g)) { t->mask1 = g | r; t->mask2 = b; } t->byteexact = 0; t->missingbyte = -1; if (!(t->rshift % 8) && !(t->gshift % 8) && !(t->bshift % 8) && !t->rprec && !t->gprec && !t->bprec) { t->byteexact = 1; { unsigned char ch[4]; *(unsigned int *)ch = t->allmask; if (!ch[0]) t->missingbyte = 0; if (!ch[1]) t->missingbyte = 1; if (!ch[2]) t->missingbyte = 2; if (!ch[3]) t->missingbyte = 3; } } #ifdef DEBUG printf("Image:\n"); printf("rshift:%i gshift:%i bshift:%i\n", t->rshift, t->gshift, t->bshift); printf("rprec:%i gprec:%i bprec:%i\n", t->rprec, t->gprec, t->bprec); printf("rmask:%x gmask:%x bmask:%x\n", t->rmask, t->gmask, t->bmask); printf("mask1:%x mask2:%x allmask:%x\n", t->mask1, t->mask2, t->allmask); printf("byteexact:%x missingbyte:%i\n", t->byteexact, t->missingbyte); #endif } void bestfit_init(void) { int i; for (i = 1; i < 256; i++) { int k = i * i; col_diff[0][i] = col_diff[0][512 - i] = k * (59 * 59) / 256; col_diff[1][i] = col_diff[1][512 - i] = k * (30 * 30) / 256; col_diff[2][i] = col_diff[2][512 - i] = k * (11 * 11) / 256; } } static int allocgenerictruecolor(struct palette *palette, int init, int r, int g, int b) { unsigned int n; switch (palette->type) { case LARGEITER: case SMALLITER: return 1; case TRUECOLOR: case TRUECOLOR16: case TRUECOLOR24: default: n = ((r >> palette->info.truec.rprec) << palette->info.truec.rshift) | ((g >> palette->info.truec.gprec) << palette->info.truec.gshift) | ((b >> palette->info.truec.bprec) << palette->info.truec.bshift) | palette->info.truec.alpha; break; } if (init) palette->size = 0; else if (palette->size >= palette->maxentries) return -1; palette->pixels[palette->size] = n; palette->size++; return palette->size; } static int allocgeneric(struct palette *palette, int init, int r, int g, int b) { int start = palette->npreallocated + palette->start; if (init) palette->size = 0; else if (palette->size >= palette->end - start) return -1; palette->pixels[palette->size] = palette->size + start; palette->rgb[palette->size + start][0] = r; palette->rgb[palette->size + start][1] = g; palette->rgb[palette->size + start][2] = b; palette->size++; return (palette->size - 1); } int fixedalloccolor(struct palette *palette, int init, int r, int g, int b) { int i, coldif, lowest, bestfit; if (init) palette->size = 0; else if (palette->size >= palette->maxentries) return -1; lowest = INT_MAX; bestfit = 1; if (palette->type == FIXEDCOLOR || (palette->type & BITMAPS)) { for (i = palette->start; i < palette->end; i++) { coldif = col_diff[0][(g - palette->rgb[i][1]) & 0x1ff]; if (coldif < lowest) { coldif += col_diff[1][(r - palette->rgb[i][0]) & 0x1ff]; if (coldif < lowest) { coldif += col_diff[2][(b - palette->rgb[i][2]) & 0x1ff]; if (coldif < lowest) { bestfit = i; if (!coldif) break; lowest = coldif; } } } } } else { bestfit = (r * 30 + g * 59 + b * 11) * (palette->end - palette->start) / 256 / 100 + palette->start; } palette->pixels[palette->size] = bestfit; palette->size++; return (palette->size - 1); } static void setcolorgeneric(struct palette * /*palette*/, int /*start*/, int /*end*/, rgb_t * /*rgb*/) { } static void allocfinishedgeneric(struct palette *palette) { palette->setpalette(palette, palette->start, palette->size + palette->start + palette->npreallocated, palette->rgb + palette->start); } static void cycle_entries(struct palette *c, int direction) { int i; int i1, i2, i3; rgb_t *co; if (direction > 0) direction %= c->size - 1; else direction = -((-direction) % (c->size - 1)); if (!direction) return; co = (rgb_t *)malloc(c->end * sizeof(rgb_t)); memcpy(co, c->rgb, sizeof(*co) * c->end); i3 = (c->size - 1 + direction) % (c->size - 1) + 1; for (i = 1; i < c->size; i++) { i1 = c->pixels[i]; i2 = c->pixels[i3]; c->rgb[i1][0] = co[i2][0]; c->rgb[i1][1] = co[i2][1]; c->rgb[i1][2] = co[i2][2]; i3++; if (i3 >= c->size) i3 = 1; } free(co); } static void cyclecolorsgeneric(struct palette *pal, int direction) { cycle_entries(pal, direction); pal->setpalette(pal, pal->pixels[0], pal->size + pal->pixels[0], pal->rgb + pal->pixels[0]); } #define TRUECOLORPALETTE 65536 struct palette *createpalette( int start, int end, int type, int flags, int maxentries, int (*alloccolor)(struct palette *pal, int init, int r, int g, int b), void (*setcolor)(struct palette *pal, int start, int end, rgb_t *rgb), void (*allocfinished)(struct palette *pal), void (*cyclecolors)(struct palette *pal, int direction), union paletteinfo *info) { static int versioncount; struct palette *palette = (struct palette *)calloc(1, sizeof(struct palette)); if (col_diff[0][1] == 0) bestfit_init(); palette->ncells = 0; palette->index = NULL; palette->size = 0; palette->rgb = NULL; if (palette == NULL) return NULL; switch (type) { case LBITMAP: case MBITMAP: case LIBITMAP: case MIBITMAP: end = 2; start = 0; maxentries = 256; palette->rgb = (rgb_t *)calloc(end, sizeof(*palette->rgb)); if (palette->rgb == NULL) { free(palette); return NULL; } if (type & (LIBITMAP | MIBITMAP)) { palette->rgb[0][0] = 255; palette->rgb[0][1] = 255; palette->rgb[0][2] = 255; palette->rgb[1][0] = 0; palette->rgb[1][1] = 0; palette->rgb[1][2] = 0; } else { palette->rgb[0][0] = 0; palette->rgb[0][1] = 0; palette->rgb[0][2] = 0; palette->rgb[1][0] = 255; palette->rgb[1][1] = 255; palette->rgb[1][2] = 255; } palette->maxentries = maxentries; palette->alloccolor = fixedalloccolor; palette->setpalette = NULL; palette->allocfinished = NULL; palette->cyclecolors = NULL; break; case FIXEDCOLOR: if (!end) end = 256; if (!maxentries) maxentries = 256; palette->rgb = (rgb_t *)calloc(end, sizeof(*palette->rgb)); if (palette->rgb == NULL) { free(palette); return NULL; } palette->maxentries = maxentries; palette->alloccolor = fixedalloccolor; palette->setpalette = NULL; palette->allocfinished = NULL; palette->cyclecolors = NULL; break; case GRAYSCALE: if (!end) end = 256; if (!maxentries) maxentries = end - start; palette->maxentries = 65536; palette->alloccolor = fixedalloccolor; palette->setpalette = NULL; palette->allocfinished = NULL; palette->cyclecolors = NULL; palette->size = end - start; break; case C256: if (!end) end = 256; if (!maxentries) maxentries = end - start; if (cyclecolors == NULL && setcolor != NULL) cyclecolors = cyclecolorsgeneric; if (alloccolor == NULL) { alloccolor = allocgeneric, allocfinished = allocfinishedgeneric; if (setcolor == NULL && type == C256) /*non hardware palette */ setcolor = setcolorgeneric, cyclecolors = cyclecolorsgeneric; } palette->rgb = (rgb_t *)calloc(end, sizeof(*palette->rgb)); if (palette->rgb == NULL) { free(palette); return NULL; } palette->maxentries = maxentries; palette->alloccolor = alloccolor; palette->setpalette = setcolor; palette->allocfinished = allocfinished; palette->cyclecolors = cyclecolors; break; default: end = TRUECOLORPALETTE; start = 0; if (type == SMALLITER) end = 256; start = 0; palette->maxentries = end; palette->alloccolor = allocgenerictruecolor; palette->cyclecolors = NULL; palette->setpalette = NULL; palette->allocfinished = NULL; } { int ee = palette->maxentries; /*if(end>palette->maxentries) ee=end; */ if (ee < 256) palette->pixels = (unsigned int *)calloc(256, sizeof(*palette->pixels)); else palette->pixels = (unsigned int *)calloc(ee, sizeof(*palette->pixels)); } if (palette->pixels == NULL) { free(palette); return NULL; } if (type & (LARGEITER | SMALLITER)) { int i; palette->size = end; palette->flags |= DONOTCHANGE; for (i = 0; i < end; i++) palette->pixels[i] = i; } palette->start = start; palette->end = end; palette->type = type; palette->flags |= flags; palette->version = (versioncount += 65536); if (type == FIXEDCOLOR) { int i; if (setcolor != NULL) setcolor(palette, start, end, palette->rgb); for (i = 0; i < end - start; i++) palette->pixels[i] = i + start; } if (type == GRAYSCALE) { int i; for (i = palette->start; i < end - start; i++) palette->pixels[i] = i + start; } if (info != NULL && (type == TRUECOLOR || type == TRUECOLOR24 || type == TRUECOLOR16)) { genertruecolorinfo(&palette->info.truec, info->truec.rmask, info->truec.gmask, info->truec.bmask); } else { if (type == TRUECOLOR) genertruecolorinfo(&palette->info.truec, 255 << 16, 255 << 8, 255); if (type == TRUECOLOR24) genertruecolorinfo(&palette->info.truec, 255 << 16, 255 << 8, 255); if (type == TRUECOLOR16) genertruecolorinfo(&palette->info.truec, (255 >> 3) << 11, (255 >> 2) << 5, (255 >> 3)); } if (type == TRUECOLOR) palette->info.truec.alpha = ~palette->info.truec.allmask; else palette->info.truec.alpha = 0; return (palette); } void destroypalette(struct palette *palette) { free(palette->pixels); if (palette->rgb != NULL) free(palette->rgb); if (palette->index != NULL) free(palette->index); free(palette); } #define MYMIN(x, y) ((x) < (y) ? (x) : (y)) struct palette *clonepalette(struct palette *palette) { struct palette *pal = createpalette(palette->start, palette->end, palette->type, palette->flags, palette->maxentries, /*palette->alloccolor, palette->setpalette, palette->allocfinished, palette->cyclecolors */ NULL, NULL, NULL, NULL, &palette->info); memcpy(pal->pixels, palette->pixels, sizeof(*pal->pixels) * MYMIN(palette->end, pal->end)); if (pal->rgb != NULL) { memcpy(pal->rgb, palette->rgb, sizeof(*pal->rgb) * MYMIN(palette->end, pal->end)); } pal->size = palette->size; return (pal); } void preallocpalette(struct palette *pal) { int i; int p; if (pal->index != NULL) free(pal->index), pal->index = NULL; pal->npreallocated = 0; if (!pal->ncells) return; pal->index = (unsigned int *)malloc(sizeof(int) * (pal->ncells + 1)); for (i = 0; i < pal->ncells; i++) { if (!i) p = pal->pixels[0]; else p = pal->pixels[pal->size]; pal->alloccolor(pal, i == 0, pal->prergb[i][0], pal->prergb[i][1], pal->prergb[i][2]); if (pal->size) { pal->index[i] = pal->pixels[pal->size - 1]; pal->pixels[pal->size - 1] = p; } } pal->npreallocated = pal->size; pal->size = 0; needupdate = 0; } void restorepalette(struct palette *dest, struct palette *src) { int i; preallocpalette(dest); for (i = 0; i < src->size; i++) { int r = 0, g = 0, b = 0; switch (src->type) { case SMALLITER: r = g = b = i; break; case LARGEITER: r = g = b = i / 256; break; case GRAYSCALE: r = g = b = src->pixels[i]; break; case C256: case FIXEDCOLOR: case MBITMAP: case LBITMAP: case MIBITMAP: case LIBITMAP: r = src->rgb[src->pixels[i]][0]; g = src->rgb[src->pixels[i]][1]; b = src->rgb[src->pixels[i]][2]; break; case TRUECOLOR: case TRUECOLOR16: case TRUECOLOR24: r = (((src->pixels[i] & src->info.truec.rmask) >> src->info.truec.rshift)) << src->info.truec.rprec; g = (((src->pixels[i] & src->info.truec.gmask) >> src->info.truec.gshift)) << src->info.truec.gprec; b = (((src->pixels[i] & src->info.truec.bmask) >> src->info.truec.bshift)) << src->info.truec.bprec; break; } if (dest->size >= dest->maxentries - PREALLOCATED(dest)) break; if (dest->alloccolor(dest, (i + dest->npreallocated) == 0, r, g, b) == -1) break; } if (!(dest->flags & FINISHLATER)) { if (dest->allocfinished != NULL) dest->allocfinished(dest); } else dest->flags |= UNFINISHED; dest->version++; } /*Generation code for various palettes */ #define DEFNSEGMENTS (255 / 8) #define MAXNSEGMENTS (4096) #define NSEGMENTS ((255 / segmentsize)) static int segmentsize; static unsigned char colors[MAXNSEGMENTS][3]; static const unsigned char colors1[DEFNSEGMENTS][3] = { /*{8, 14, 32}, */ {0, 0, 0}, {120, 119, 238}, {24, 7, 25}, {197, 66, 28}, {29, 18, 11}, {135, 46, 71}, {24, 27, 13}, {241, 230, 128}, {17, 31, 24}, {240, 162, 139}, {11, 4, 30}, {106, 87, 189}, {29, 21, 14}, {12, 140, 118}, {10, 6, 29}, {50, 144, 77}, {22, 0, 24}, {148, 188, 243}, {4, 32, 7}, {231, 146, 14}, {10, 13, 20}, {184, 147, 68}, {13, 28, 3}, {169, 248, 152}, {4, 0, 34}, {62, 83, 48}, {7, 21, 22}, {152, 97, 184}, {8, 3, 12}, {247, 92, 235}, {31, 32, 16}}; static int allocate(int r, int g, int b, int init) { unsigned int n; if (init) preallocpalette(context); n = context->pixels[(init ? 0 : context->size) /*+ context->start */]; if (!init && context->size == maxentries) return 0; if ((context->alloccolor(context, init && !context->npreallocated, (int)r, (int)g, (int)b)) == -1) { return 0; } if (context->pixels[context->size - 1 /*+ context->start */] != n) { needupdate = 1; } return (1); } static int mksmooth(int nsegments, int setsegments) { int i, y; float r, g, b, rs, gs, bs; int segmentsize1 = segmentsize; for (i = 0; i < setsegments; i++) { if (i == setsegments - 1 && !(context->flags & UNKNOWNENTRIES)) { segmentsize1 = maxentries - context->size - 2; } r = colors[i % nsegments][0]; g = colors[i % nsegments][1]; b = colors[i % nsegments][2]; rs = ((int)colors[(i + 1) % setsegments % nsegments][0] - r) / (unsigned int)segmentsize1; gs = ((int)colors[(i + 1) % setsegments % nsegments][1] - g) / (unsigned int)segmentsize1; bs = ((int)colors[(i + 1) % setsegments % nsegments][2] - b) / (unsigned int)segmentsize1; for (y = 0; y < segmentsize1; y++) { if (!allocate((int)r, (int)g, (int)b, i == 0 && y == 0)) { if (!i) context->size = 2; context->size = i * segmentsize; return 0; } r += rs; g += gs; b += bs; } } if (context->flags & UNKNOWNENTRIES) context->size = i * segmentsize; return 1; } static inline void hsv_to_rgb(int h, int s, int v, unsigned char *red, unsigned char *green, unsigned char *blue) { int hue; int f, p, q, t; h += 256; h %= 256; if (s == 0) { *red = v; *green = v; *blue = v; } else { h %= 256; if (h < 0) h += 256; hue = h * 6; f = hue & 255; p = v * (256 - s) / 256; q = v * (256 - (s * f) / 256) >> 8; t = v * (256 * 256 - (s * (256 - f))) >> 16; switch ((int)(hue / 256)) { case 0: *red = v; *green = t; *blue = p; break; case 1: *red = q; *green = v; *blue = p; break; case 2: *red = p; *green = v; *blue = t; break; case 3: *red = p; *green = q; *blue = v; break; case 4: *red = t; *green = p; *blue = v; break; case 5: *red = v; *green = p; *blue = q; break; } } } static void randomize_segments3(int /*whitemode*/, int nsegments) { int i = 0; int h, s, v; for (i = 0; i < nsegments; i++) { if (!(i % 3)) { if (i % 6) colors[i][0] = 255, colors[i][1] = 255, colors[i][2] = 255; else colors[i][0] = 0, colors[i][1] = 0, colors[i][2] = 0; } else { s = (int)XaoS_random() % 256; h = (int)XaoS_random() % (128 - 32); v = (int)XaoS_random() % 128; if (((i) % 6 > 3) ^ ((i) % 3 == 1)) /*if(((i)%3==1)) */ h += 42 + 16; else h += 42 + 128 + 16, v += 128 + 64; hsv_to_rgb(h, s, v, colors[i], colors[i] + 1, colors[i] + 2); } } colors[i - 1][0] = colors[0][0]; colors[i - 1][1] = colors[0][1]; colors[i - 1][2] = colors[0][2]; } static void randomize_segments2(int whitemode, int nsegments) { int i = 0; for (i = 0; i < nsegments; i++) { if (i % 3 == 2) colors[i][0] = whitemode * 255, colors[i][1] = whitemode * 255, colors[i][2] = whitemode * 255; else if (i % 3 == 0) colors[i][0] = (!whitemode) * 255, colors[i][1] = (!whitemode) * 255, colors[i][2] = (!whitemode) * 255; else colors[i][0] = (int)XaoS_random() % 256, colors[i][1] = (int)XaoS_random() % 256, colors[i][2] = (int)XaoS_random() % 256; } colors[i - 1][0] = colors[0][0]; colors[i - 1][1] = colors[0][1]; colors[i - 1][2] = colors[0][2]; } static void randomize_segments(int whitemode, int nsegments) { int i = 0; if (whitemode) { colors[0][0] = 255, colors[0][1] = 255, colors[0][2] = 255; for (i = 0; i < nsegments; i += 2) { if (i != 0) { colors[i][0] = (int)XaoS_random() % 256, colors[i][1] = (int)XaoS_random() % 256, colors[i][2] = (int)XaoS_random() % 256; } if (i + 1 < nsegments) colors[i + 1][0] = (int)XaoS_random() % 35, colors[i + 1][1] = (int)XaoS_random() % 35, colors[i + 1][2] = (int)XaoS_random() % 35; } } else { for (i = 0; i < nsegments; i += 2) { colors[i][0] = (int)XaoS_random() % 35, colors[i][1] = (int)XaoS_random() % 35, colors[i][2] = (int)XaoS_random() % 35; if (i + 1 < nsegments) colors[i + 1][0] = (int)XaoS_random() % 256, colors[i + 1][1] = (int)XaoS_random() % 256, colors[i + 1][2] = (int)XaoS_random() % 256; } } colors[i - 1][0] = colors[0][0]; colors[i - 1][1] = colors[0][1]; colors[i - 1][2] = colors[0][2]; } #define MYLONG_MAX 0xffffff #define rrandom(i) ((int)(((int)XaoS_random() / (double)MYLONG_MAX) * (i))) /*Do not use modulo type random since it should bring very different results *for slightly different sizes */ int mkpalette(struct palette *c, int seed, int algorithm) { int i, ncolors = c->size; int whitemode; int i1; context = c; needupdate = 0; if (c->flags & DONOTCHANGE) return 0; XaoS_srandom(seed); seed = (int)XaoS_random(); whitemode = (int)XaoS_random() % 2; if ((c->flags & UNKNOWNENTRIES) || !c->size) { maxentries = context->maxentries - nprecells; segmentsize = (rrandom(maxentries / 2)) & (~3); if (segmentsize < 1) segmentsize = 1; } else { if (maxentries > 8) { int qq = 255; maxentries = context->maxentries - nprecells; segmentsize = rrandom(qq / 3 + 4); segmentsize += rrandom(qq / 3 + 4); segmentsize += rrandom(qq / 3 + 4); segmentsize += rrandom( qq / 3 + 4); /*Make smaller segments with higher probability */ segmentsize = abs(segmentsize / 2 - qq / 3 + 3); if (segmentsize < 8) segmentsize = 8; if (segmentsize > maxentries / 3) segmentsize = maxentries / 3; } } if (c->flags & UNKNOWNENTRIES) i = rrandom(maxentries); else i = (maxentries + segmentsize - 5) / segmentsize; if (i < 0) i = 1; if (i > MAXNSEGMENTS) i1 = MAXNSEGMENTS; else i1 = i; XaoS_srandom(seed); switch (algorithm) { case 2: randomize_segments3(whitemode, i1); break; case 1: randomize_segments2(whitemode, i1); break; case 0: randomize_segments(whitemode, i1); } mksmooth(i1, i); if (!(c->flags & FINISHLATER)) { if (c->allocfinished != NULL) c->allocfinished(c); } else c->flags |= UNFINISHED; if (context->size != ncolors || needupdate) { context->version++; return 1; } return 0; } int mkstereogrampalette(struct palette *c) { int i, ncolors = c->size; context = c; needupdate = 0; for (i = 0; i < 16; i++) allocate(i * 4, i * 4, i * 16, i == 0); if (!(c->flags & FINISHLATER)) { if (c->allocfinished != NULL) c->allocfinished(c); } else c->flags |= UNFINISHED; if (context->size != ncolors || needupdate) { context->version++; return 1; } return 0; } int mkstarfieldpalette(struct palette *c) { int i, ncolors = c->size; context = c; needupdate = 0; for (i = 0; i < 16; i++) if (i % 2) allocate(i * 4, i * 4, i * 16, i == 0); else allocate(i * 16, i * 16, i * 16, i == 0); if (!(c->flags & FINISHLATER)) { if (c->allocfinished != NULL) c->allocfinished(c); } else c->flags |= UNFINISHED; if (context->size != ncolors || needupdate) { context->version++; return 1; } return 0; } int mkblurpalette(struct palette *c) { int i, ncolors = c->size; context = c; needupdate = 0; for (i = 0; i < 63; i++) allocate(i * 2, i * 2, i * 4, i == 0); allocate(i * 2, i * 2, i * 4 - 1, 0); if (!(c->flags & FINISHLATER)) { if (c->allocfinished != NULL) c->allocfinished(c); } else c->flags |= UNFINISHED; if (context->size != ncolors || needupdate) { context->version++; return 1; } return 0; } int mkgraypalette(struct palette *c) { int i, ncolors = c->size; context = c; needupdate = 0; for (i = 0; i < 64; i++) allocate(i * 4, i * 4, i * 4, i == 0); for (i = 0; i < 16; i++) allocate(255, 255 - i * 16, 255 - i * 16, 0); for (i = 0; i < 16; i++) allocate(255 - i * 16, 0, 0, 0); if (!(c->flags & FINISHLATER)) { if (c->allocfinished != NULL) c->allocfinished(c); } else c->flags |= UNFINISHED; if (context->size != ncolors || needupdate) { context->version++; return 1; } return 0; } int mkdefaultpalette(struct palette *c) { int i, ncolors = c->size; context = c; needupdate = 0; segmentsize = 8; if (c->flags & DONOTCHANGE) return 0; memcpy(colors, colors1, sizeof(colors1)); maxentries = context->maxentries - nprecells; if (c->flags & UNKNOWNENTRIES) i = 128 / 8; else i = (maxentries + 3) / 8; if (i < 0) i = 1; mksmooth(255 / 8, i); if (!(c->flags & FINISHLATER)) { if (c->allocfinished != NULL) c->allocfinished(c); } else c->flags |= UNFINISHED; if (context->size != ncolors || needupdate) { context->version++; return 1; } return 0; } int shiftpalette(struct palette *c, int shift) { if (!c->size) return 0; while (shift < 0) shift += c->size - 1; shift = shift % (c->size - 1); if (!shift) return 0; if (c->cyclecolors != NULL) { if (c->flags & UNFINISHED) { cycle_entries(c, shift); } else { c->cyclecolors(c, shift); } return 0; } if (c->type & (TRUECOLOR | TRUECOLOR24 | TRUECOLOR16)) { int i; int i3; int *co; if (shift > 0) shift %= c->size - 1; else shift = -((-shift) % (c->size - 1)); if (!shift) return 0; co = (int *)malloc(c->size * sizeof(*co)); memcpy(co, c->pixels, sizeof(*co) * c->size); i3 = (c->size - 1 + shift) % (c->size - 1) + 1; for (i = 1; i < c->size; i++) { c->pixels[i] = co[i3]; i3++; if (i3 >= c->size) i3 = 1; } c->version++; free(co); } return 1; } static int allocrgb(struct palette */*c*/, int r1, int g1, int b1) { int r, g, b; int f = 1; for (g = 0; g < g1; g++) for (b = 0; b < b1; b++) { for (r = 0; r < r1; r++) { if (!allocate(r * 255 / (r1 - 1), g * 255 / (g1 - 1), b * 255 / (b1 - 1), f)) return 0; f = 0; } } return 1; } int mkrgb(struct palette *c) { int ncolors = c->size; int red = 8, green = 8, blue = 4; context = c; needupdate = 0; if (c->flags & UNKNOWNENTRIES) { while (blue > 0) { if (allocrgb(c, red, green, blue)) break; red--; if (allocrgb(c, red, green, blue)) break; green--; if (allocrgb(c, red, green, blue)) break; red--; if (allocrgb(c, red, green, blue)) break; green--; if (allocrgb(c, red, green, blue)) break; blue--; } } else { number_t n = pow((c->maxentries - nprecells) / (0.5 * 0.2 * 0.3), 1.0 / 3); green = (int)(n * 0.5); blue = (int)(n * 0.2); red = (int)(n * 0.3); while ((blue + 1) * red * green < (c->maxentries - nprecells)) blue++; while ((red + 1) * blue * green < (c->maxentries - nprecells)) red++; while ((green + 1) * blue * red < (c->maxentries - nprecells)) green++; allocrgb(c, red, green, blue); } if (!(c->flags & FINISHLATER)) { if (c->allocfinished != NULL) c->allocfinished(c); } else c->flags |= UNFINISHED; if (context->size != ncolors || needupdate) { context->version++; } return red * 256 * 256 + green * 256 + blue; } void getPaletteColor(struct palette *src, int seed, int algorithm, int shift, int newColors[101][3]) { mkpalette(src, seed, algorithm); shiftpalette(src, shift); for (int i = 0; i < 101; i++) { int r = 0, g = 0, b = 0; switch (src->type) { case SMALLITER: r = g = b = i; break; case LARGEITER: r = g = b = i / 256; break; case GRAYSCALE: r = g = b = src->pixels[i]; break; case C256: case FIXEDCOLOR: case MBITMAP: case LBITMAP: case MIBITMAP: case LIBITMAP: r = src->rgb[src->pixels[i]][0]; g = src->rgb[src->pixels[i]][1]; b = src->rgb[src->pixels[i]][2]; break; case TRUECOLOR: case TRUECOLOR16: case TRUECOLOR24: r = (((src->pixels[i] & src->info.truec.rmask) >> src->info.truec.rshift)) << src->info.truec.rprec; g = (((src->pixels[i] & src->info.truec.gmask) >> src->info.truec.gshift)) << src->info.truec.gprec; b = (((src->pixels[i] & src->info.truec.bmask) >> src->info.truec.bshift)) << src->info.truec.bprec; break; } newColors[i][0]=r; newColors[i][1]=g; newColors[i][2]=b; } } void getDEFSEGMENTColor(unsigned char newColors[][3]) { memcpy(newColors, colors, sizeof(colors1)); } int mkcustompalette(struct palette *c, unsigned char newColors[31][3]) { int i, ncolors = c->size; context = c; needupdate = 0; segmentsize = 8; if (c->flags & DONOTCHANGE) return 0; memcpy(colors, newColors, sizeof(colors1)); maxentries = context->maxentries - nprecells; if (c->flags & UNKNOWNENTRIES) i = 128 / 8; else i = (maxentries + 3) / 8; if (i < 0) i = 1; mksmooth(255 / 8, i); if (!(c->flags & FINISHLATER)) { if (c->allocfinished != NULL) c->allocfinished(c); } else c->flags |= UNFINISHED; if (context->size != ncolors || needupdate) { context->version++; return 1; } return 0; } XaoS-release-4.3.2/src/util/random.cpp000066400000000000000000000027661455214672000175610ustar00rootroot00000000000000/* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* The code is taken from GNU C library. Goal is to provide same * random numbers at all platforms to make possible save random * palette just by saving random seed * * Very simplified because I don't need to have numbers "very random" */ /* * This is derived from the Berkeley source: * @(#)random.c 5.5 (Berkeley) 7/6/88 * It was reworked for the GNU C Library by Roland McGrath. */ #include #include "config.h" #include "misc-f.h" static unsigned int state; void XaoS_srandom(unsigned int x) { state = x; } #define MYLONG_MAX 0xffffff /* this is enough for me */ long int XaoS_random(void) { state = ((state * 1103515245) + 12345) & MYLONG_MAX; return state; } XaoS-release-4.3.2/src/util/thread.cpp000066400000000000000000000140011455214672000175310ustar00rootroot00000000000000#include #include #include #include "xthread.h" struct taskinfo definfo = {0, #ifdef USE_PTHREAD 0 #endif }; #ifndef nthreads #define getrange1(range, ncpu) ((range) * (ncpu)) / nthreads #define getrange2(range, ncpu) getrange1(range, (ncpu) + 1) int ethreads = 0; int nthreads = 1; #ifdef USE_PTHREAD /* Well conde follows is probably very ugly, since this is * my absolutely first application for threads. Please let * me know how to improvie it */ static pthread_cond_t synccond, startcond; static struct taskinfo infos[MAXTHREADS]; static pthread_mutex_t synccondmutex, startcondmutex; pthread_mutex_t semaphors[MAXSEMAPHORS]; pthread_cond_t conds[MAXCONDS]; /*This loop is executed whole time in slave threads. Its function is following: 1) wait for message 2) call function from message 3) synchronize 4) again To invoke this mechanizm main thread(#1) should call xth_function xth_synchronize forces forces thread to wait for others */ static int nfinished; static int npending; static int counter; static int bcounter; static int bcounter1; static int range; static void *data; static xfunction function; static void *control_routine(void *i) { struct taskinfo *info = (struct taskinfo *)i; int mycounter = 0; int r; void *d; xfunction f; while (1) { /* quite a lot pthread calls. Please if you are * reading this code and crying "OH NO!" so ugly * handling! Why so much calls? Stop crying, I am * newbie in threads. Please rewrite my code and * send me better and faster version. * * This function comunicates with pth_function from main loop * as follows: it uses startcond to wait for order start function! * Counter is used to ensure that main function did not give * order whie control_routine was busy * * after order is received, function address is read from global * variables and started. Pth_function then executes its * own part of calculation. After that it waits counter * nfinished to reach number of thasks-1. This is done * using cond synccond and synccondmutex. Quite complex * but it seems to work. Looking forward for someone, who * should reduce number of _lock/_unlock */ pthread_mutex_lock(&synccondmutex); nfinished++; pthread_cond_signal(&synccond); pthread_mutex_unlock(&synccondmutex); pthread_mutex_lock(&startcondmutex); while (mycounter >= counter) { if (bcounter > bcounter1) { /*Well we are already locked using start lock..should be OK */ mycounter--; bcounter1++; break; } pthread_cond_wait(&startcond, &startcondmutex); } r = range; d = data; f = function; npending--; pthread_mutex_unlock(&startcondmutex); mycounter++; f(d, info, getrange1(r, info->n), getrange2(r, info->n)); } return NULL; } void pth_init(int nthreads1) { int i; pthread_attr_t attr; if (ethreads) return; if (nthreads1 == 1 || nthreads1 == 0) return; /*use nothreads_* calls */ if (nthreads1 > MAXTHREADS) nthreads1 = MAXTHREADS; nthreads = nthreads1; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (pthread_cond_init(&synccond, NULL)) exit(1); if (pthread_cond_init(&startcond, NULL)) exit(1); if (pthread_mutex_init(&synccondmutex, NULL)) exit(1); if (pthread_mutex_init(&startcondmutex, NULL)) exit(1); infos[0].n = 0; /*infos[0].id = pthread_self(); */ for (i = 0; i < MAXSEMAPHORS; i++) { pthread_mutex_init(semaphors + i, NULL); } for (i = 0; i < MAXCONDS; i++) { pthread_cond_init(conds + i, NULL); } nfinished = 0; for (i = 0; i < nthreads - 1; i++) { if (pthread_create(&infos[i + 1].id, &attr, control_routine, infos + i + 1)) { nthreads = i + 1; break; } infos[i + 1].n = i + 1; } if (nthreads != 1) ethreads = 1; } void pth_synchronize() { /*Our job is done, synchronize now */ if (nfinished < nthreads - 1) { pthread_mutex_lock(&synccondmutex); while (nfinished < nthreads - 1) { pthread_cond_wait(&synccond, &synccondmutex); } pthread_mutex_unlock(&synccondmutex); } /*Ok job is done, lets continue :) */ } void pth_bgjob(xfunction f, void *d) { pthread_mutex_lock(&startcondmutex); if (npending) { printf("Collision!\n"); /*FIXME:remove this..I just want to know how often this happends */ pthread_mutex_unlock(&startcondmutex); f(d, infos, 0, 0); } if (bcounter < bcounter1) { printf("Internal error\a\n"); } if (!nfinished) { pthread_mutex_unlock(&startcondmutex); /*no more CPU available :( */ f(d, infos, 0, 0); } data = d; range = 0; function = f; bcounter++; nfinished--; npending++; pthread_cond_signal(&startcond); pthread_mutex_unlock(&startcondmutex); } void pth_function(xfunction f, void *d, int r) { pth_synchronize(); pthread_mutex_lock(&startcondmutex); data = d; range = r; function = f; /*And lets start it:) */ nfinished = 0; npending = nthreads - 1; counter++; if (nthreads == 2) pthread_cond_signal(&startcond); else pthread_cond_broadcast(&startcond); pthread_mutex_unlock(&startcondmutex); function(data, infos, getrange1(range, 0), getrange2(range, 0)); } void pth_uninit() { /*Should be empty for now since all threads will be killed after exit call */ /*FIXME should be added something if necessary :) */ nthreads = 1; ethreads = 0; } #endif /*POSIX threads */ #endif /*nthreads */ XaoS-release-4.3.2/src/util/timers.cpp000066400000000000000000000177331455214672000176040ustar00rootroot00000000000000/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * All ugly architecture depended timing code is separated into this file.. */ #include "config.h" #include "timers.h" #include #include #include #include #define EMULDIV 1024 struct timeemulator { unsigned long int time; unsigned long exact; }; struct timer { std::chrono::time_point lastactivated; unsigned long lastemulated; struct timeemulator *emulator; void (*handler)(void *); void (*multihandler)(void *, int); void *userdata; struct timer *next, *previous, *group; int interval; int stopped; int stoppedtime; int slowdown; }; /*Variable for saving current time */ std::chrono::time_point currenttime; static tl_group group1; tl_group *syncgroup = &group1; /*following functions are architecture dependent */ void tl_update_time(void) { currenttime = std::chrono::steady_clock::now(); } static inline int __lookup_timer(tl_timer *t) { return std::chrono::duration_cast( currenttime - t->lastactivated) .count(); } int tl_lookup_timer(tl_timer *t) { if (t->stopped) { return (t->stoppedtime); } if (t->emulator != NULL) { return ((int)(t->emulator->time - t->lastemulated) * EMULDIV); } return (__lookup_timer(t) - t->slowdown); } void tl_stop_timer(tl_timer *t) { if (!t->stopped) { t->stoppedtime = tl_lookup_timer(t); t->stopped = 1; } } void tl_slowdown_timer(tl_timer *t, int time) { if (!t->stopped) { t->slowdown += time; } else t->stoppedtime -= time; } void tl_resume_timer(tl_timer *t) { if (t->stopped) { t->stopped = 0; t->slowdown = tl_lookup_timer(t) - t->stoppedtime; } } void tl_sleep(int time) { std::this_thread::sleep_for(std::chrono::microseconds(time)); } void tl_reset_timer(tl_timer *t) { if (t->stopped) t->stoppedtime = 0; else { if (t->emulator != NULL) { t->lastemulated = t->emulator->time; } else t->lastactivated = currenttime, t->slowdown = 0; } } tl_timer *tl_create_timer(void) { tl_timer *timer; timer = (tl_timer *)calloc(1, sizeof(tl_timer)); if (timer == NULL) return NULL; timer->interval = -1; timer->handler = NULL; timer->multihandler = NULL; timer->userdata = NULL; timer->next = NULL; timer->previous = NULL; timer->group = NULL; timer->stopped = 0; timer->stoppedtime = 0; timer->slowdown = 0; timer->emulator = NULL; tl_reset_timer(timer); return (timer); } tl_group *tl_create_group(void) { tl_group *timer; timer = (tl_group *)calloc(1, sizeof(tl_group)); if (timer == NULL) return NULL; timer->interval = -1; timer->handler = NULL; timer->multihandler = NULL; timer->userdata = NULL; timer->next = NULL; timer->previous = NULL; timer->group = timer; tl_reset_timer(timer); return (timer); } void tl_free_timer(tl_timer *timer) { if (timer->group) tl_remove_timer(timer); free((void *)timer); } void tl_free_group(tl_group *timer) { tl_timer *next; do { next = timer->next; free((void *)timer); } while (next != NULL); } int tl_process_group(tl_group *group, int *activated) { int again = 1; tl_timer *timer, *timer1; int minwait = INT_MAX; tl_update_time(); if (activated != NULL) *activated = 0; while (again) { group->slowdown = 0; again = 0; minwait = INT_MAX; timer = group->next; while (timer != NULL) { timer1 = timer->next; if (timer->handler && timer->interval >= 0) { int time = timer->interval - tl_lookup_timer(timer); if (time < 500) { if (activated != NULL) (*activated)++; again = 1; tl_reset_timer(timer); if (time < -200 * 1000000) time = 0; /*underflow? */ tl_slowdown_timer(timer, time); time = timer->interval + time; timer->handler(timer->userdata); tl_update_time(); } if (time < minwait) minwait = time; } else if (timer->multihandler && timer->interval > 0) { int time = timer->interval - tl_lookup_timer(timer); if (time < 500) { int n; if (activated != NULL) (*activated)++; tl_reset_timer(timer); if (time < -200 * 1000000) time = 0; /*underflow? */ n = -(time + 500) / timer->interval + 1; time = timer->interval * n + time; tl_slowdown_timer(timer, time - timer->interval + n * timer->interval); timer->multihandler(timer->userdata, n); tl_update_time(); } if (time < minwait) minwait = time; } if (group->slowdown) { again = 1; break; } timer = timer1; } } if (minwait != INT_MAX) { if (minwait < 0) return (0); return (minwait); } return (-1); } void tl_add_timer(tl_group *group, tl_timer *timer) { if (timer->group) tl_remove_timer(timer); timer->previous = group; timer->next = group->next; timer->group = group; group->next = timer; if (timer->next != NULL) timer->next->previous = timer; } void tl_set_interval(tl_timer *timer, int interval) { if (timer->interval <= 0) { tl_reset_timer(timer); } timer->interval = interval; } void tl_set_handler(tl_timer *timer, void (*handler)(void *), void *ud) { timer->handler = handler; timer->userdata = ud; } void tl_set_multihandler(tl_timer *timer, void (*handler)(void *, int), void *ud) { timer->multihandler = handler; timer->userdata = ud; } void tl_remove_timer(tl_timer *timer) { timer->group->slowdown = 1; timer->previous->next = timer->next; if (timer->next != NULL) timer->next->previous = timer->previous; timer->group = NULL; } struct timeemulator *tl_create_emulator(void) { return ((struct timeemulator *)calloc(1, sizeof(struct timeemulator))); } void tl_free_emulator(struct timeemulator *t) { free(t); } void tl_elpased(struct timeemulator *t, int elpased) { t->exact += elpased; t->time += t->exact / EMULDIV; t->exact &= (EMULDIV - 1); } void tl_emulate_timer(struct timer *t, struct timeemulator *e) { int time = tl_lookup_timer(t); t->emulator = e; t->lastemulated = e->time; tl_slowdown_timer(t, -time); } void tl_unemulate_timer(struct timer *t) { int time = tl_lookup_timer(t); t->emulator = NULL; tl_slowdown_timer(t, tl_lookup_timer(t) - time); } XaoS-release-4.3.2/src/util/util.pri000066400000000000000000000004411455214672000172520ustar00rootroot00000000000000SOURCES += \ $$PWD/catalog.cpp \ $$PWD/image.cpp \ $$PWD/palette.cpp \ $$PWD/thread.cpp \ $$PWD/xstring.cpp \ $$PWD/xerror.cpp \ $$PWD/xstdio.cpp \ $$PWD/xmenu.cpp \ $$PWD/random.cpp \ $$PWD/timers.cpp HEADERS += \ $$PWD/grlibd.h XaoS-release-4.3.2/src/util/xerror.cpp000066400000000000000000000012121455214672000176030ustar00rootroot00000000000000#include #include #include #include "config.h" #include "xerror.h" /*On windows we use message boxes done in the ui_win32.c code*/ void x_message(const char *text, ...) { va_list ap; va_start(ap, text); vfprintf(stdout, text, ap); fprintf(stdout, "\n"); va_end(ap); } void x_error(const char *text, ...) { va_list ap; va_start(ap, text); vfprintf(stderr, text, ap); fprintf(stderr, "\n"); va_end(ap); } void x_fatalerror(const char *text, ...) { va_list ap; va_start(ap, text); vfprintf(stderr, text, ap); fprintf(stderr, "\n"); va_end(ap); exit(1); } XaoS-release-4.3.2/src/util/xmenu.cpp000066400000000000000000000640631455214672000174330ustar00rootroot00000000000000#define __USE_MINGW_ANSI_STDIO 1 // for long double support on Windows #include #include #include #include "config.h" #include "ui_helper.h" #include "xerror.h" #include "misc-f.h" #include "config.h" #include "xmenu.h" #define HASHBITS 8 #define HASHSIZE (1 << HASHBITS) #define HASHMASK (HASHSIZE - 1) #define HASH(c, len) (((len)*32 + (c)[0] + (c)[(len)-1]) & HASHMASK) static struct queuelist { struct queuelist *next; struct queuelist *previous; const menuitem *item; dialogparam *d; } *firstqueue = NULL, *lastqueue = NULL; static struct entry { struct entry *next; struct entry *previous; struct entry *nextname; const menuitem *item; } *firstitem = NULL, *lastitem = NULL; struct entry *namehash[HASHSIZE]; static void x_menu_insert(const menuitem *item, struct entry *iitem, int n) { int i; int len; int hashpos; struct entry *list; for (i = 0; i < n; i++) { list = (struct entry *)calloc(1, sizeof(struct queuelist)); if (list == NULL) { x_error("Warning:out of memory!"); return; } if (item->type != MENU_SEPARATOR) { len = strlen(item->shortname); hashpos = HASH(item->shortname, len); list->nextname = namehash[hashpos]; #ifdef DEBUG { struct entry *e = list->nextname; while (e != NULL) { if (!strcmp(e->item->shortname, item->shortname)) { x_error( "Menu error:Name collision %s:'%s'(%s) and '%s'(%s)", item->shortname, item->name, item->menuname, e->item->name, e->item->menuname); } e = e->nextname; } } #endif namehash[hashpos] = list; } list->item = item; if (iitem == NULL) { /*printf("ahoj\n"); */ list->previous = lastitem; list->next = NULL; if (lastitem != NULL) lastitem->next = list; else firstitem = list; lastitem = list; } else { list->next = iitem; list->previous = iitem->previous; if (iitem->previous) iitem->previous->next = list; else firstitem = list; iitem->previous = list; } item++; } } void menu_add(const menuitem *item, int n) { x_menu_insert(item, NULL, n); } void menu_insert(const menuitem *item, const char *before, int n) { struct entry *e = firstitem; while (e != NULL) { if (!strcmp(e->item->shortname, before)) break; e = e->next; } x_menu_insert(item, e, n); } void menu_delete(const menuitem *items, int n) { int d = 0, i; struct entry *item = firstitem; struct entry *pe; int hashpos; for (i = 0; i < n; i++) { if (items[i].type == MENU_SEPARATOR) { struct entry *item = firstitem; while (item && item->item != items + i) item = item->next; if (!item) abort(); if (item->previous != NULL) item->previous->next = item->next; else firstitem = item->next; if (item->next != NULL) item->next->previous = item->previous; else lastitem = item->previous; free(item); } else { int len = strlen(items[i].shortname); hashpos = HASH(items[i].shortname, len); pe = NULL; item = namehash[hashpos]; while (item != NULL) { if (items + i == item->item) { d++; if (pe == NULL) namehash[hashpos] = item->nextname; else pe->nextname = item->nextname; if (item->previous != NULL) item->previous->next = item->next; else firstitem = item->next; if (item->next != NULL) item->next->previous = item->previous; else lastitem = item->previous; free(item); break; } /*if */ pe = item; item = item->nextname; } /*while */ } #ifdef DEBUG if (item == NULL) x_error("Item %s not found!", items[i].shortname); #endif } /*for */ } void menu_addqueue(const menuitem *item, dialogparam *d) { struct queuelist *list; list = (struct queuelist *)calloc(1, sizeof(struct queuelist)); if (list == NULL) { x_error("Warning:out of memory!"); return; } list->previous = lastqueue; list->next = NULL; list->item = item; list->d = d; if (lastqueue != NULL) lastqueue->next = list; else firstqueue = list; lastqueue = list; } const menuitem *menu_delqueue(dialogparam **d) { const struct menuitem *item; struct queuelist *list = firstqueue; if (firstqueue == NULL) return NULL; item = firstqueue->item; *d = firstqueue->d; firstqueue = list->next; if (list->next != NULL) list->next->previous = NULL; else lastqueue = NULL; free(list); return (item); } const static void *menu_rfind(const void *(*function)(struct entry *item), const char *root) { struct entry *item = firstitem; const void *r; while (item != NULL) { if (!strcmp(root, item->item->menuname)) { if ((r = function(item)) != NULL) return r; if (item->item->type == MENU_SUBMENU && (r = menu_rfind(function, item->item->shortname)) != NULL) return r; } item = item->next; } return NULL; } const static char *findkey; const static void *cmpfunction(struct entry *item) { if (item->item->key == NULL) return NULL; if (!strcmp(findkey, item->item->key)) return item->item; return NULL; } const menuitem *menu_findkey(const char *key, const char *root) { findkey = key; return ((const menuitem *)menu_rfind(cmpfunction, root)); } static const menuitem *finditem; const static void *cmpfunction2(struct entry *item) { if (item->item == finditem) return item; return NULL; } int menu_available(const menuitem *item, const char *root) { finditem = item; return (menu_rfind(cmpfunction2, root) != NULL); } const char *menu_fullname(const char *menu) { struct entry *item = firstitem; while (item != NULL) { if (item->item->type == MENU_SUBMENU && !strcmp(menu, item->item->shortname)) { return (item->item->name); } item = item->next; } return NULL; } const menuitem *menu_item(const char *menu, int n) { struct entry *item = firstitem; while (item != NULL) { if (!strcmp(menu, item->item->menuname)) { if (!(item->item->flags & MENUFLAG_NOMENU)) n--; if (n < 0) return (item->item); } item = item->next; } return NULL; } int menu_havedialog(const menuitem *item, struct uih_context *c) { if (item->type != MENU_DIALOG && item->type != MENU_CUSTOMDIALOG) return 0; if (!(item->type & MENUFLAG_RADIO) || c == NULL) return 1; if (item->flags & MENUFLAG_DIALOGATDISABLE) return (menu_enabled(item, c)); return (!menu_enabled(item, c)); } static void menu_freeparam(dialogparam *d, const struct dialog *di) { switch (di->type) { case DIALOG_STRING: case DIALOG_KEYSTRING: case DIALOG_IFILE: case DIALOG_OFILE: free(d->dstring); } } void menu_destroydialog(const menuitem *item, dialogparam *d, struct uih_context *uih) { int i; const struct dialog *di = menu_getdialog(uih, item); for (i = 0; di[i].question; i++) { menu_freeparam(d + i, di + i); } free(d); } void menu_activate(const menuitem *item, struct uih_context *c, dialogparam *d) { if (c == NULL && (!(item->flags & MENUFLAG_ATSTARTUP) || firstqueue != NULL)) { menu_addqueue(item, d); return; } else { if (c != NULL && c->incalculation && !(item->flags & MENUFLAG_INCALC)) { if (c->flags & MENUFLAG_INTERRUPT) c->interrupt = 1; menu_addqueue(item, d); return; } } switch (item->type) { case MENU_SEPARATOR: x_error("separator activated!"); break; case MENU_SUBMENU: x_error("submenu activated!"); break; case MENU_NOPARAM: ((void (*)(struct uih_context *))item->function)(c); break; case MENU_INT: ((void (*)(struct uih_context *, int))item->function)(c, item->iparam); break; case MENU_STRING: ((void (*)(struct uih_context *, const char *))item->function)( c, (const char *)item->pparam); break; case MENU_DIALOG: case MENU_CUSTOMDIALOG: if (!menu_havedialog(item, c)) { // This code caused a crash when switching from julia // back to Mandelbrot on 64-bit windows because NULL cannot // be cast to a valid float parameter which the function // expects. For now I will just special case it because // uimandelbrot is the only menu that does this. // Also, similar problems occur when compiling for WebAssembly, // but also for uiperturbation and record. So we handle these cases differently. if (!strcmp(item->shortname, "uimandelbrot") && !strcmp(item->shortname, "uiperturbation") && !strcmp(item->shortname, "record")) ((void (*)(struct uih_context * c, number_t, number_t)) item->function)(c, 0, 0); else { #ifndef __wasm ((void (*)(struct uih_context * c, dialogparam *)) item->function)(c, (dialogparam *)NULL); #else if (strcmp(item->shortname, "uimandelbrot") == 0) uih_setmandelbrot(c, 1, 0, 0); if (strcmp(item->shortname, "uiperturbation") == 0) uih_setperbutation(c, 0, 0); if (strcmp(item->shortname, "record") == 0) uih_save_disable(c); #endif } } else { const menudialog *di = menu_getdialog(c, item); if (di[0].question == NULL) { ((void (*)(struct uih_context * c, dialogparam *)) item->function)(c, (dialogparam *)NULL); break; } else if (di[1].question == NULL) { /*call function with right *parameter. This avoids need to write wrappers*/ switch (di[0].type) { case DIALOG_INT: case DIALOG_PALSLIDER: case DIALOG_PALPICKER: case DIALOG_CHOICE: case DIALOG_ONOFF: ((void (*)(struct uih_context * c, int)) item->function)(c, d[0].dint); break; case DIALOG_FLOAT: ((void (*)(struct uih_context * c, number_t)) item->function)(c, d[0].number); break; case DIALOG_COORD: ((void (*)(struct uih_context * c, number_t, number_t)) item->function)( c, d[0].dcoord[0], d[0].dcoord[1]); break; case DIALOG_STRING: case DIALOG_KEYSTRING: case DIALOG_LIST: ((void (*)(struct uih_context * c, char *)) item->function)(c, d[0].dstring); break; case DIALOG_IFILE: case DIALOG_OFILE: ((void (*)(struct uih_context * c, xio_path)) item->function)(c, d[0].dpath); break; default: x_error("dialog:unknown type!"); break; } } else ((void (*)(struct uih_context * c, dialogparam *)) item->function)(c, d); } break; default: x_error("Menu_activate: unknown type %i!", item->type); break; } } int menu_enabled(const menuitem *item, struct uih_context *c) { if (item->flags & (MENUFLAG_RADIO | MENUFLAG_CHECKBOX)) switch (item->type) { case MENU_SEPARATOR: return 0; case MENU_SUBMENU: case MENU_DIALOG: case MENU_NOPARAM: case MENU_CUSTOMDIALOG: return (((int (*)(struct uih_context *))item->control)(c)); case MENU_INT: return (((int (*)(struct uih_context *, int))item->control)( c, item->iparam)); case MENU_STRING: return (((int (*)(struct uih_context *, const char *)) item->control)(c, (const char *)item->pparam)); default: x_error("Menu_enabled: unknown type!"); break; } return 0; } void menu_delnumbered(int n, const char *name) { menuitem *items; int i; char s[256]; sprintf(s, "%s%i", name, 0); items = (menuitem *)menu_findcommand(s); menu_delete(items, n); for (i = 0; i < n; i++) { if (items[i].key) free((char *)items[i].key); free((char *)items[i].shortname); } free(items); } const menuitem * menu_genernumbered(int n, const char *menuname, const char *const *const names, const char *keys, int type, int flags, void (*function)(struct uih_context *context, int), int (*control)(struct uih_context *context, int), const char *prefix) { int l = keys != NULL ? (int)strlen(keys) : -1; int i; menuitem *item = (menuitem *)malloc(sizeof(menuitem) * n); if (item == NULL) return NULL; for (i = 0; i < n; i++) { item[i].menuname = menuname; if (i < l) { char *key = (char *)malloc(2); item[i].key = key; key[0] = keys[i]; key[1] = 0; } else item[i].key = 0; item[i].type = type; item[i].flags = flags; item[i].iparam = i; item[i].name = names[i]; item[i].shortname = names[i]; if (prefix != NULL) { char *shortname = (char *)malloc(strlen(prefix) + 4); item[i].shortname = shortname; sprintf(shortname, "%s%i", prefix, i); } item[i].function = (void (*)(void))function; item[i].control = (int (*)(void))control; } menu_add(item, n); return (item); } number_t menu_getfloat(const char *s, const char **error) { char *sp; number_t param = xstrtonum(s, &sp); if (sp != s + strlen(s)) { *error = "Floating point number expected"; return 0; } return (param); } int menuparse_scheme = 0; const char *menu_fillparam(struct uih_context *uih, tokenfunc f, const menudialog *d, dialogparam *p) { char *c = f(uih); const char *error = NULL; if (c == NULL) return "Parameter expected"; switch (d->type) { case DIALOG_INT: if (sscanf(c, "%i", &p->dint) != 1) { return "Integer parameter expected"; } break; case DIALOG_FLOAT: p->number = menu_getfloat(c, &error); if (error != NULL) return (error); break; case DIALOG_COORD: p->dcoord[0] = menu_getfloat(c, &error); if (error != NULL) return (error); c = f(uih); if (c == NULL) return "Imaginary part expected"; p->dcoord[1] = menu_getfloat(c, &error); if (error != NULL) return (error); break; case DIALOG_KEYSTRING: if (menuparse_scheme) { if (c[0] != '\'') return "Key string parameter expected"; p->dstring = mystrdup(c + 1); } else p->dstring = mystrdup(c); break; case DIALOG_STRING: case DIALOG_LIST: if (menuparse_scheme) { int l = strlen(c); if (l < 2 || c[0] != '"' || c[l - 1] != '"') return "String parameter expected"; p->dstring = mystrdup(c + 1); p->dstring[l - 2] = 0; } else p->dstring = mystrdup(c); break; case DIALOG_IFILE: case DIALOG_OFILE: if (menuparse_scheme) { int l = strlen(c); if (l < 2 || c[0] != '"' || c[l - 1] != '"') return "String parameter expected"; p->dstring = mystrdup(c + 1); p->dstring[l - 2] = 0; } else p->dstring = mystrdup(c); break; case DIALOG_CHOICE: if (menuparse_scheme) { if (c[0] != '\'') return "Key string parameter expected"; c++; } { int i; const char **keys = (const char **)d->defstr; for (i = 0;; i++) { if (keys[i] == NULL) return "Unknown parameter"; if (!strcmp(c, keys[i])) { p->dint = i; return NULL; } } } case DIALOG_ONOFF: if (menuparse_scheme) { if (!strcmp("#t", c)) { p->dint = 1; return NULL; } if (!strcmp("#f", c)) { p->dint = 0; return NULL; } } else { if (!strcmp("on", c)) { p->dint = 1; return NULL; } if (!strcmp("off", c)) { p->dint = 0; return NULL; } } break; default: x_error("Unknown dialog parameter type!"); } /*switch */ return NULL; } static char errorstr[256]; const menuitem *menu_findcommand(const char *name) { struct entry *entry; const menuitem *item; int len; len = strlen(name); if (len > 100) return NULL; entry = namehash[HASH(name, len)]; while (entry != NULL) { if (!strcmp(entry->item->shortname, name)) break; entry = entry->nextname; } if (entry == NULL) { return NULL; } item = entry->item; return (item); } const char *menu_processcommand(struct uih_context *uih, tokenfunc f, int scheme, int mask, const char *root) { char *c = f(uih); const menuitem *item; menuparse_scheme = scheme; if (c == NULL) { if (!menuparse_scheme) return "Command name expected"; return NULL; } item = menu_findcommand(c); if (item == NULL) { sprintf(errorstr, "%s:unknown function", c); return errorstr; } if (item->flags & mask) { sprintf(errorstr, "function '%s' not available in this context (%i, %i)", c, mask, item->flags); return errorstr; } if ((item->flags & MENUFLAG_NOPLAY) && uih != NULL) { if (root != NULL && !menu_available(item, root)) { sprintf(errorstr, "function '%s' is disabled", c); return errorstr; } } if ((item->flags & MENUFLAG_CHECKBOX) && scheme) { int w; c = f(uih); if (c == NULL) { return ("Boolean parameter expected"); } if (!strcmp("#t", c)) { w = 1; } else if (!strcmp("#f", c)) { w = 0; } else return "Boolean parameter expected"; if (w == menu_enabled(item, uih)) { if (((w != 0) ^ ((item->flags & MENUFLAG_DIALOGATDISABLE) != 0)) || (item->type != MENU_DIALOG && item->type != MENU_CUSTOMDIALOG)) { return NULL; } else menu_activate(item, uih, NULL); /*disable it... */ } } if (item->type != MENU_DIALOG && item->type != MENU_CUSTOMDIALOG) { menu_activate(item, uih, NULL); return NULL; } /*So we have some parameters */ { dialogparam *param; const menudialog *d = menu_getdialog(uih, item); int i, n; for (n = 0; d[n].question != NULL; n++) ; param = (dialogparam *)malloc(n * sizeof(dialogparam)); for (i = 0; i < n; i++) { const char *error; error = menu_fillparam(uih, f, d + i, param + i); if (error != NULL) { sprintf(errorstr, "Function '%s' parameter %i:%s", item->shortname, i, error); for (n = 0; n < i; n++) { menu_freeparam(param + i, d + i); } free(param); return errorstr; } } menu_activate(item, uih, param); if (uih != NULL) menu_destroydialog(item, param, uih); } return NULL; } static int argpos, margc; static char **margv; static int argposs; static char *gettoken(struct uih_context * /*c*/) { if (argpos == margc) return NULL; if (argpos == argposs) { if (!margv[argpos]) return NULL; return (margv[argpos++] + 1); } else return (margv[argpos++]); } int menu_processargs(int n, int argc, char **argv) { const char *error; argpos = n; argposs = n; margc = argc; margv = argv; error = menu_processcommand(NULL, gettoken, 0, MENUFLAG_NOOPTION, "root"); if (error) { x_error("%s\nPlease enter `xaos -help` to learn more on command line options", error); return -1; } return (argpos - 2); } void menu_printhelp(void) { struct entry *e = firstitem; while (e) { if (e->item->type == MENU_SEPARATOR) { e = e->next; continue; } if (e->item->type == MENU_SUBMENU && !(e->item->flags & MENUFLAG_NOOPTION)) { struct entry *e1 = firstitem; int n = 1; while (e1) { /*if (e->item->type == MENU_SEPARATOR) {printf ("\n"); * e1=e1->next;continue;} */ if (e1->item->type != MENU_SUBMENU && e1->item->type != MENU_SEPARATOR && !(e1->item->flags & MENUFLAG_NOOPTION) && !strcmp(e1->item->menuname, e->item->shortname)) { if (n) { printf("\n%s\n\n", e->item->name); n = 0; } printf(" -%-15s", e1->item->shortname); if (menu_havedialog(e1->item, NULL)) { const menudialog *d = menu_getdialog(NULL, e1->item); while (d->question != NULL) { switch (d->type) { case DIALOG_INT: printf("integer "); break; case DIALOG_FLOAT: printf("real_number "); break; case DIALOG_COORD: printf("real_number real_number "); break; case DIALOG_KEYSTRING: case DIALOG_STRING: printf("string "); break; case DIALOG_IFILE: printf("input_file "); break; case DIALOG_OFILE: printf("output_file "); break; case DIALOG_CHOICE: { int i; const char **keys = (const char **)d->defstr; for (i = 0;; i++) { if (keys[i] == NULL) break; if (i != 0) putc('|', stdout); printf("%s", keys[i]); } putc(' ', stdout); } break; case DIALOG_ONOFF: printf("on|off "); } d++; } printf("\n%14s ", ""); } printf(" %s\n", e1->item->name); } e1 = e1->next; } } e = e->next; } } XaoS-release-4.3.2/src/util/xstdio.cpp000066400000000000000000000344621455214672000176110ustar00rootroot00000000000000#include "config.h" #include #include #include #include #include #include "filter.h" #include "fractal.h" #include "ui_helper.h" #include "misc-f.h" #include #include #include #include #include #include #ifdef _WIN32 #define strcmp stricmp #include #include "windows.h" #endif /* We reserve character 01 to application directory so we can easily refer to * data files */ char *xio_appdir; char *xio_homedir; char *xio_fixpath(const char *c) { if (c[0] == '~') { char *c1 = (char *)malloc(strlen(c) + strlen(xio_homedir) + 5); sprintf(c1, "%s%s", xio_homedir, c + 1); return c1; } if (c[0] == '\01') { char *c1 = (char *)malloc(strlen(c) + strlen(xio_appdir) + 5); sprintf(c1, "%s%s", xio_appdir, c + 1); return c1; } return mystrdup(c); } int xio_getfiles(xio_constpath path1, char ***names, char ***dirs, int *nnames2, int *ndirs2) { char *path = xio_fixpath(path1); int maxnames = 200, maxdirs = 200; int nnames = 0, ndirs = 0; DIR *dir = opendir(path); struct stat buf; char buff[4096]; int pathlen; struct dirent *e; if (dir == NULL) return 0; *nnames2 = 0; *ndirs2 = 0; e = readdir(dir); strcpy(buff, path); pathlen = (int)strlen(path); if (buff[pathlen - 1] != XIO_PATHSEP) buff[pathlen] = XIO_PATHSEP; else pathlen--; *names = (char **)malloc(maxnames * sizeof(**names)); *dirs = (char **)malloc(maxdirs * sizeof(**dirs)); free(path); while (e != NULL) { char *n = mystrdup(e->d_name); strcpy(buff + pathlen + 1, e->d_name); stat(buff, &buf); if (S_ISDIR(buf.st_mode)) { if (ndirs == maxdirs) maxdirs *= 2, *dirs = (char **)realloc(*dirs, maxdirs * sizeof(**dirs)); (*dirs)[ndirs] = n; ndirs++; } else { if (nnames == maxnames) maxnames *= 2, *names = (char **)realloc(*names, maxnames * sizeof(**names)); (*names)[nnames] = n; nnames++; } e = readdir(dir); } if (nnames) *names = (char **)realloc(*names, nnames * sizeof(**names)); else free(*names), *names = NULL; if (ndirs) *dirs = (char **)realloc(*dirs, ndirs * sizeof(**dirs)); else free(*dirs), *dirs = NULL; *nnames2 = nnames; *ndirs2 = ndirs; closedir(dir); return 1; } xio_path xio_getdirectory(xio_constpath filename) { int i; xio_pathdata directory; for (i = (int)strlen(filename); i && filename[i] != '/' && filename[i] != '\\' && filename[i] != XIO_PATHSEP; i--) ; if (filename[i] == '/' || filename[i] == '\\' || filename[i] == XIO_PATHSEP) i++; directory[i] = 0; i--; for (; i >= 0; i--) directory[i] = filename[i]; return (mystrdup(directory)); } xio_path xio_getfilename(const char *basename, const char *extension) { size_t pathlength = strlen(basename) + strlen(extension); static char* name; name = (char* )malloc(pathlength + 16); //Extra padding for memory leak fix int nimage = 0; struct stat sb; char *base = xio_fixpath(basename); do { sprintf(name, "%s%i%s", base, nimage++, extension); } while (stat(name, &sb) != -1); free(base); return (name); } // Function to get the names of immediate subdirectories under a path QStringList get_immediate_subdirectory_names(const QString& path) { QDir directory(path); QStringList subdirectoryNames; QFileInfoList entries = directory.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); for (int i = 0; i < entries.size(); ++i) { subdirectoryNames.append(entries.at(i).fileName()); } return subdirectoryNames; } // Function to convert QStringList to char *array void convertQStringListToArray(const QStringList& stringList, char *array[]) { for (int i = 0; i < stringList.size(); ++i) { QByteArray byteArray = stringList.at(i).toLocal8Bit(); array[i] = strdup(byteArray.constData()); } } xio_file xio_getrandomexample(xio_path name) { QStringList example_paths_taken = { /*Where examples should be located? */ EXAMPLESPATH, /*Data path when XaoS is properly installed */ "\01" XIO_PATHSEPSTR "examples", /*XaoS was started from root of source tree */ "\01" XIO_PATHSEPSTR ".." XIO_PATHSEPSTR "examples", "\01" XIO_PATHSEPSTR ".." XIO_PATHSEPSTR "Resources" XIO_PATHSEPSTR "examples", "." XIO_PATHSEPSTR "examples", /*XaoS was started from root of source tree */ ".." XIO_PATHSEPSTR "examples", /*XaoS was started from bin directory in source tree */ XIO_EMPTYPATH, /*Oops...it's not. Try current directory */ }; // Select a random sub dir and then random example to fix load random example issue // if ../examples exists, add its subdirectories to example_path_taken, otherwise do nothing: QStringList sub_names = get_immediate_subdirectory_names(".." XIO_PATHSEPSTR "examples"); if (sub_names.length() > 0) { int randomIndex = QRandomGenerator::global()->bounded(sub_names.length()); QString randomElement = sub_names.at(randomIndex); example_paths_taken.append(".." XIO_PATHSEPSTR "examples/"+randomElement); } char *paths[example_paths_taken.size()]; convertQStringListToArray(example_paths_taken, paths); int i = -1, p; DIR *d = NULL; xio_file f; struct dirent *dir; int n; int max = 0; char *realpath = NULL; for (p = 0; p < (int)(sizeof(paths) / sizeof(char *)) && d == NULL; p++) { char *pp = xio_fixpath(paths[p]); d = opendir(pp); free(pp); if (d != NULL) { realpath = xio_fixpath(paths[p]); max = 800 - (int)strlen(realpath); for (i = 0; (dir = readdir(d)) != NULL; i++) { int s = (int)strlen(dir->d_name); if (s > max || s < 4 || strcmp(".xpf", dir->d_name + s - 4)) i--; /*free(dir); */ } if (!i) { /*uih->errstring = "No *.xpf files found"; */ closedir(d); free(realpath); d = NULL; continue; } break; } } if (d == NULL) { /*uih->errstring = "Can not open examples directory"; */ return NULL; } rewinddir(d); dir = NULL; n = (int)((number_t)i * rand() / (RAND_MAX + 1.0)); for (i = 0; i <= n; i++) { int s; do { /*if(dir!=NULL) free(dir); */ dir = readdir(d); if (dir == NULL) { /*uih->errstring = "Reading of examples directory failed"; */ closedir(d); free(realpath); return NULL; } s = (int)strlen(dir->d_name); } while (s > max || s < 4 || strcmp(".xpf", dir->d_name + s - 4)); } if (dir == NULL) { /*uih->errstring = "Reading of examples directory failed"; */ closedir(d); free(realpath); return NULL; } strcpy(name, realpath); if (name[strlen(name) - 1] != XIO_PATHSEP) strcat(name, XIO_PATHSEPSTR); strcat(name, dir->d_name); closedir(d); /*free(dir); */ f = xio_ropen(name); free(realpath); return (f); } xio_file xio_getcatalog(const char *name) { static const xio_constpath paths[] = { /*Where catalogs should be located? */ CATALOGSPATH, /*Data path when XaoS is properly installed */ "\01" XIO_PATHSEPSTR "catalogs" XIO_PATHSEPSTR, "\01" XIO_PATHSEPSTR ".." XIO_PATHSEPSTR "catalogs" XIO_PATHSEPSTR, "\01" XIO_PATHSEPSTR ".." XIO_PATHSEPSTR "Resources" XIO_PATHSEPSTR "catalogs" XIO_PATHSEPSTR, "." XIO_PATHSEPSTR "catalogs" XIO_PATHSEPSTR, /*XaoS was started from root of source tree */ ".." XIO_PATHSEPSTR "catalogs" XIO_PATHSEPSTR, /*XaoS was started from bin directory in source tree */ XIO_EMPTYPATH, /*Oops...it's not. Try current directory */ }; int i; xio_file f = XIO_FAILED; xio_pathdata tmp; for (i = 0; i < (int)(sizeof(paths) / sizeof(char *)) && f == XIO_FAILED; i++) { char *p = xio_fixpath(paths[i]); xio_addfname(tmp, p, name); free(p); f = xio_ropen(tmp); if (f == XIO_FAILED) { xio_addextension(tmp, ".cat"); f = xio_ropen(tmp); } } return (f); } xio_file xio_gethelp(void) { static const xio_constpath paths[] = { /*Where help should be located? */ HELPPATH, /*Data path when XaoS is properly installed */ "\01" XIO_PATHSEPSTR "help" XIO_PATHSEPSTR "xaos.hlp", "\01" XIO_PATHSEPSTR ".." XIO_PATHSEPSTR "help" XIO_PATHSEPSTR "xaos.hlp", "." XIO_PATHSEPSTR "help" XIO_PATHSEPSTR "xaos.hlp", /*XaoS was started from root of source tree */ ".." XIO_PATHSEPSTR "help" XIO_PATHSEPSTR "xaos.hlp", /*XaoS was started from bin directory in source tree */ "." XIO_PATHSEPSTR "xaos.hlp", /*Oops...it's not. Try current directory */ }; int i; xio_file f = XIO_FAILED; for (i = 0; i < (int)(sizeof(paths) / sizeof(char *)) && f == XIO_FAILED; i++) { char *p = xio_fixpath(paths[i]); f = xio_ropen(p); free(p); } return (f); } xio_file xio_gettutorial(const char *name, xio_path tmp) { int i; xio_file f = XIO_FAILED; static const xio_constpath paths[] = { /*Where tutorials should be located? */ TUTORIALPATH, /*Data path when XaoS is properly installed */ "\01" XIO_PATHSEPSTR "tutorial" XIO_PATHSEPSTR, "\01" XIO_PATHSEPSTR ".." XIO_PATHSEPSTR "tutorial" XIO_PATHSEPSTR, "\01" XIO_PATHSEPSTR ".." XIO_PATHSEPSTR "Resources" XIO_PATHSEPSTR "tutorial" XIO_PATHSEPSTR, "." XIO_PATHSEPSTR "tutorial" XIO_PATHSEPSTR, /*XaoS was started from root of source tree */ ".." XIO_PATHSEPSTR "tutorial" XIO_PATHSEPSTR, /*XaoS was started from bin directory in source tree */ XIO_EMPTYPATH, /*Oops...it's not. Try current directory */ }; for (i = 0; i < (int)(sizeof(paths) / sizeof(char *)) && f == XIO_FAILED; i++) { char *p = xio_fixpath(paths[i]); xio_addfname(tmp, p, name); f = xio_ropen(tmp); free(p); } return (f); } int xio_exist(xio_constpath name) { struct stat buf; return (!stat(name, &buf)); } static int sputc(int c, xio_file f) { return putc(c, (FILE *)f->data); } static int sputs(const char *c, xio_file f) { return fputs(c, (FILE *)f->data); } static int sungetc(int c, xio_file f) { return ungetc(c, (FILE *)f->data); } static int sgetc(xio_file f) { return getc((FILE *)f->data); } static int sfeof(xio_file f) { return feof((FILE *)f->data); } static int sflush(xio_file f) { return fflush((FILE *)f->data); } static int ssclose(xio_file f) { int r = fclose((FILE *)f->data); free(f); return r; } xio_file xio_ropen(const char *name) { xio_file f = (xio_file)calloc(1, sizeof(*f)); name = xio_fixpath(name); #ifndef _WIN32 f->data = (void *)fopen(name, "rt"); #else // TODO: unify this with xio_ropen std::string filePath = name; std::wstring filePathW; filePathW.resize(filePath.size()); int newSize = MultiByteToWideChar(CP_UTF8, 0, filePath.c_str(), filePath.length(), const_cast(filePathW.c_str()), filePath.length()); filePathW.resize(newSize); f->data = _wfopen(filePathW.c_str(), L"rt"); #endif /*free (name); */ if (!f->data) { free(f); return 0; } f->fclose = ssclose; f->xeof = sfeof; f->fgetc = sgetc; f->fungetc = sungetc; return f; } xio_file xio_wopen(const char *name) { xio_file f = (xio_file)calloc(1, sizeof(*f)); name = xio_fixpath(name); #ifndef _WIN32 f->data = (void *)fopen(name, "wt"); #else std::string filePath = name; std::wstring filePathW; filePathW.resize(filePath.size()); int newSize = MultiByteToWideChar(CP_UTF8, 0, filePath.c_str(), filePath.length(), const_cast(filePathW.c_str()), filePath.length()); filePathW.resize(newSize); f->data = _wfopen(filePathW.c_str(), L"wt"); #endif /*free (name); */ if (!f->data) { free(f); return 0; } f->fputc = sputc; f->fputs = sputs; f->fclose = ssclose; f->flush = sflush; return f; } #ifdef _WIN32 #define DRIVES #endif void xio_init(const char *name) { if (getenv("HOME")) xio_homedir = mystrdup(getenv("HOME")); else xio_homedir = mystrdup("./"); if ( #ifdef DRIVES (((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z')) && name[1] == ':' && (name[2] == '\\' || name[2] == '/')) || #endif name[0] == '/' || name[0] == '\\' || name[0] == XIO_PATHSEP || name[0] == '~') { char *c = mystrdup(name); int i; int pos = 0; for (i = 0; i < (int)strlen(c); i++) if (name[i] == '/' || name[i] == '\\' || name[i] == XIO_PATHSEP) pos = i; c[pos] = 0; xio_appdir = xio_fixpath(c); free(c); } else { char buf[4096]; buf[0] = '.'; buf[1] = 0; if (getcwd(buf, sizeof(buf)) == NULL) buf[0] = 0; xio_appdir = mystrdup(buf); { char *c = mystrdup(name), *c1; int i; int pos = 0; for (i = 0; i < (int)strlen(c); i++) if (name[i] == '/' || name[i] == '\\' || name[i] == XIO_PATHSEP) pos = i; c[pos] = 0; c1 = (char *)malloc(strlen(c) + strlen(xio_appdir) + 2); sprintf(c1, "%s%s%s", xio_appdir, XIO_PATHSEPSTR, c); free(c); free(xio_appdir); xio_appdir = c1; } } } void xio_uninit() { free(xio_appdir); free(xio_homedir); } XaoS-release-4.3.2/src/util/xstring.cpp000066400000000000000000000061131455214672000177650ustar00rootroot00000000000000#include #include #include "config.h" #include "xio.h" #include "misc-f.h" #ifdef USE_FLOAT128 #include #endif struct fr { char *string; int pos; int allocedsize; int stringsize; }; number_t xstrtonum(const char *s, char **sp) { #ifdef USE_FLOAT128 return strtoflt128(s, sp); #else #ifdef USE_LONG_DOUBLE return strtold(s, sp); #else return strtod(s, sp); #endif #endif } char *mystrdup(const char *c) { int l = strlen(c); char *d = (char *)malloc(l + 1); if (!d) return NULL; memcpy(d, c, l + 1); return d; } static int sputc(int c, xio_file s) { struct fr *f = (struct fr *)s->data; if (f->pos >= f->allocedsize - 1) { char *c = (char *)realloc(f->string, f->allocedsize * 2); if (!c) return XIO_EOF; f->string = c; f->allocedsize *= 2; } f->string[f->pos++] = c; if (f->pos >= f->stringsize) f->string[f->pos] = 0, f->stringsize = f->pos; return 0; } static int sputs(const char *c, xio_file s) { int l = strlen(c); struct fr *f = (struct fr *)s->data; while (f->pos + l >= f->allocedsize - 1) { char *c = (char *)realloc(f->string, f->allocedsize * 2); if (!c) return XIO_EOF; f->string = c; f->allocedsize *= 2; } memcpy(f->string + f->pos, c, l); f->pos += l; if (f->pos >= f->stringsize) f->string[f->pos] = 0, f->stringsize = f->pos; return 0; } static int sungetc(int /*c*/, xio_file s) { struct fr *f = (struct fr *)s->data; f->pos--; /*f->string[f->pos]=c; */ return 0; } static int sgetc(xio_file s) { struct fr *f = (struct fr *)s->data; if (f->pos == f->stringsize) return XIO_EOF; return f->string[f->pos++]; } static int sfeof(xio_file s) { struct fr *f = (struct fr *)s->data; return (f->pos == f->stringsize); } static int srclose(xio_file s) { struct fr *f = (struct fr *)s->data; free(f->string); free(f); free(s); return 0; } static int swclose(xio_file s) { struct fr *f = (struct fr *)s->data; f->string = (char *)realloc(f->string, f->stringsize + 1); /*free(s); free(f); */ return 0; } char *xio_getstring(xio_file s) { struct fr *f = (struct fr *)s->data; char *c = f->string; free(f); free(s); return c; } xio_file xio_strropen(const char *string) { xio_file s = (xio_file)calloc(1, sizeof(*s)); struct fr *f = (struct fr *)calloc(1, sizeof(*f)); s->data = f; f->pos = 0; f->string = (char *)string; f->stringsize = strlen(string); s->fclose = srclose; s->xeof = sfeof; s->fgetc = sgetc; s->fungetc = sungetc; return s; } #define PAGE 4096 xio_file xio_strwopen(void) { xio_file s = (xio_file)calloc(1, sizeof(*s)); struct fr *f = (struct fr *)calloc(1, sizeof(*f)); s->data = f; f->pos = 0; f->string = (char *)malloc(PAGE); f->allocedsize = PAGE; f->stringsize = 0; s->fputc = sputc; s->fputs = sputs; s->fclose = swclose; s->flush = NULL; return s; } XaoS-release-4.3.2/tools/000077500000000000000000000000001455214672000151565ustar00rootroot00000000000000XaoS-release-4.3.2/tools/README.md000066400000000000000000000035111455214672000164350ustar00rootroot00000000000000How to create (pre)releases by using the scripts in this folder? ================================================================ In this folder we provide scripts that can create installation bundles for various platforms. We assume that you are already familiar with the [steps for compiling XaoS](https://github.com/xaos-project/XaoS/wiki/Developer's-Guide#build-instructions). Debian Linux and variants ------------------------- Simply run the script `create-deb` from command line. See the comments in the script in the first few rows to learn which packages must be installed in advance. Microsoft Windows ----------------- Before running the script `deploy-win.bat` from command line you need to add the path of tools `windeployqt.exe` and `binarycreator.exe` to the system environment variable PATH. These tools are usually located in Qt's `Tools\QtInstallerFramework\\bin` and `Tools\QtDesignStudio\qt6_design_studio_reduced_version\bin`. Important: `windeployqt.exe` will use the first C++ compiler from the path. To avoid getting the wrong DLLs (because of availability of multiple compilers on your system) make sure that the used compiler is found as first one. If you use the wrong DLLs, XaoS will not start. See also https://stackoverflow.com/questions/43397609/qt-deployment-for-windows-copies-incorrect-dll-for-mingw To avoid problems with finding certain files, you should make sure that there is no special character in the full path of the `XaoS` folder. Otherwise some files may be missing from the installation bundle (for example, the .cat files). To create the .zip file, simply copy the bin folder in it and also the folders catalog/, examples/ and tutorial/. MacOS ----- Before running the script `deploy-mac` from command line you need to add the path of tool `macdeployqt` to the environmental system variable PATH. XaoS-release-4.3.2/tools/cat2prop.py000066400000000000000000000022431455214672000172630ustar00rootroot00000000000000#!/usr/bin/env python # Convert XaoS cat file to Java properties file import fileinput key = None for line in fileinput.input(): line = line.strip('\r\n') if key is None: # we are not in the middle of a multiline value strip = line.strip() if len(strip) == 0 or strip.startswith('#'): # print comments and blank lines verbatim print line continue else: # split the line into key and value quote = line.find('"') key = line[:quote].strip() value = line[quote+1:] else: # line is a continuation of the previous value value += line # look for terminating quote quote = value.rfind('"') if quote != -1 and value[quote-1] != '\\': # non-escaped quote found # look for line-end comment pound = value.find('#', quote) if pound != -1: # print line-end comment before the property print value[pound:] # print the property key/value pair print key + '=' + value[:quote] key = None else: # value continues for another line value += '\\n' XaoS-release-4.3.2/tools/compile-qt-web000077500000000000000000000022651455214672000177360ustar00rootroot00000000000000#!/bin/bash # This script compiles Qt6 to be able to build XaoS for WebAssembly. # Make sure that you have enough disk space. At least 45 GB is recommended. # See also https://doc.qt.io/qt-6.5/wasm.html and https://wiki.qt.io/Building_Qt_6_from_Git. QT6_VERSION=6.5.3 EMSDK_VERSION=3.1.25 PARALLEL=4 QT6_HOST_PATH=`pwd`/qt6-host-install set -e # Get emscripten: test -x emsdk || git clone https://github.com/emscripten-core/emsdk.git cd emsdk git pull ./emsdk install $EMSDK_VERSION ./emsdk activate --embedded $EMSDK_VERSION cd .. # Get Qt: git clone git://code.qt.io/qt/qt5.git qt6 cd qt6 git switch $QT6_VERSION perl init-repository # Compile Qt for the Linux host cd .. mkdir qt6-host-build cd qt6-host-build ../qt6/configure -prefix $QT6_HOST_PATH cmake --build . --parallel $PARALLEL cmake --install . # Compile Qt for WebAssembly cd .. mkdir qt6-wasm-build cd qt6-wasm-build . ../emsdk/emsdk_env.sh ../qt6/configure -xplatform wasm-emscripten -nomake examples -prefix $PWD/qtbase \ -opensource -confirm-license -qt-host-path $QT6_HOST_PATH -device-option QT_EMSCRIPTEN_ASYNCIFY=1 cmake --build . --parallel $PARALLEL -t qtbase -t qtdeclarative -t qtimageformats -t qsvgicon -t qsvg cd .. XaoS-release-4.3.2/tools/compile-xaos-web000077500000000000000000000003731455214672000202620ustar00rootroot00000000000000#!/bin/bash # This script compiles XaoS for WebAssembly. set -e QT6_WASM_BUILD=`pwd`/qt6-wasm-build test -x $QT6_WASM_BUILD || { echo "Run compile-qt-web first." exit 1 } . emsdk/emsdk_env.sh cd .. $QT6_WASM_BUILD/qtbase/bin/qmake make || true XaoS-release-4.3.2/tools/create-deb000077500000000000000000000053421455214672000171030ustar00rootroot00000000000000#!/usr/bin/env bash # This script creates a .deb package of XaoS 4.3 and above. # Make sure you build the program first ("qmake6 PREFIX=/usr && make -j4"). # Required packages before running this script: # lynx pandoc git-extras lintian set -x set -e test -x ../bin/xaos ARCH=$(dpkg --print-architecture) LINUX_VARIANT=$(lsb_release -s -i) LINUX_VERSION=$(lsb_release -s -r) PLATFORMCODE=$LINUX_VARIANT-$LINUX_VERSION MAINDIR=$(cd ..; pwd) XAOS_VERSION=$(cat "$MAINDIR/src/include/config.h" | grep XaoS_VERSION | awk '{print $3}' | sed s/\"//g) FSDIR=xaos_${XAOS_VERSION}-${PLATFORMCODE}_$ARCH rm -rf "$FSDIR" BINDIR=$FSDIR/usr/bin mkdir -p "$BINDIR" cp "$MAINDIR/bin/xaos" "$BINDIR" CATDIR=$FSDIR/usr/share/XaoS/catalogs mkdir -p "$CATDIR" cp "$MAINDIR"/catalogs/*.cat "$CATDIR" TUTDIR=$FSDIR/usr/share/XaoS/tutorial mkdir -p "$TUTDIR" cp "$MAINDIR"/tutorial/*.{xaf,xhf} "$TUTDIR" EXDIR=$FSDIR/usr/share/XaoS/examples mkdir -p "$EXDIR" find "$MAINDIR/examples" -name '*.xpf' -exec cp {} "$EXDIR" \; # flattening folders MANDIR=$FSDIR/usr/share/man/man6 mkdir -p "$MANDIR" cp "$MAINDIR/doc/xaos.6" "$MANDIR" gzip -9n "$MANDIR/xaos.6" DOCDIR=$FSDIR/usr/share/doc/xaos mkdir -p "$DOCDIR" cp "$MAINDIR/COPYING" "$MAINDIR/NEWS" "$DOCDIR" for i in CREDITS README; do pandoc "$MAINDIR/$i.md" | lynx -stdin -dump -nolist > "$DOCDIR/$i" done gzip -n "$DOCDIR/NEWS" echo "Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: xaos Source: https://github.com/xaos-project/XaoS Files: * Copyright: 2023 The XaoS Project License: GPL-1" > "$DOCDIR/copyright" git-changelog -x > "$DOCDIR/changelog" gzip -9n "$DOCDIR/changelog" PIXDIR=$FSDIR/usr/share/pixmaps mkdir -p "$PIXDIR" cp "$MAINDIR/xdg/xaos.png" "$PIXDIR" APPDIR=$FSDIR/usr/share/applications mkdir -p "$APPDIR" cp "$MAINDIR/xdg/io.github.xaos_project.XaoS.desktop" "$APPDIR" mkdir -p "$FSDIR/DEBIAN" echo -n "Package: xaos Version: $XAOS_VERSION Section: graphics Priority: optional Architecture: $ARCH Depends: " > "$FSDIR/DEBIAN/control" ./dep-deb-versions >> "$FSDIR/DEBIAN/control" echo " Maintainer: Zoltan Kovacs Description: zoom and pan around a fractal in real time. It can display the animated fractals. It displays the Mandelbrot set or many other fractals and allows you to zoom smoothly into the fractal. Various coloring modes are provided for both the points inside and outside the selected set. In addition, switching between Mandelbrot and Julia fractal types is provided. Other features include autopilot mode, palette changing, image saving, fractal inversion, filters, and a built in fractal tutorial. " >> "$FSDIR/DEBIAN/control" # Fix permissions chmod -R g-w "$FSDIR" fakeroot dpkg-deb --build "$FSDIR" lintian "$FSDIR.deb" XaoS-release-4.3.2/tools/dep-deb-versions000077500000000000000000000012241455214672000202510ustar00rootroot00000000000000#!/bin/sh # Prints the versions of the installed .deb packages that are required to run the xaos executable. export ARCH=`dpkg --print-architecture` (ldd ../bin/xaos | awk '{if ($3=="") print $1; else print $3}' | while read LIB; do LIB2=`realpath $LIB`; (dpkg -S $LIB 2>/dev/null || dpkg -S $LIB2) \ | awk '{print $1}' | cut -d: -f1 ; done) | sort | uniq | xargs dpkg -l | grep :$ARCH \ | sed s/:$ARCH// | sed s/+dfsg// | awk '{if (nonfirst==1) printf ", "; nonfirst=1; mp=index($3,"-"); ver=substr($3,1,mp-1); verpp=index(ver ".","."); ver2=substr(ver,verpp+1); ver2pp=index(ver2 ".","."); ver3=substr(ver,1,verpp+ver2pp-1); printf $2 " (>= " ver3 ")"}' XaoS-release-4.3.2/tools/deploy-mac000077500000000000000000000007331455214672000171410ustar00rootroot00000000000000#!/bin/sh MACDEPLOYQT=$(command -v macdeployqt) if [ ! -x "$MACDEPLOYQT" ]; then echo "macdeployqt is not in path." exit fi cd "$(dirname "$0")/.." mkdir bin/XaoS.app/Contents/Resources/examples/ cp examples/*/* bin/XaoS.app/Contents/Resources/examples/ cp -R catalogs bin/XaoS.app/Contents/Resources/ cp -R tutorial bin/XaoS.app/Contents/Resources/ if [ -z "$1" ]; then $MACDEPLOYQT bin/XaoS.app -dmg else $MACDEPLOYQT bin/XaoS.app -dmg -codesign="$1" fi XaoS-release-4.3.2/tools/deploy-win.bat000066400000000000000000000016561455214672000177450ustar00rootroot00000000000000@echo off where /q windeployqt if errorlevel 1 ( echo windeployqt is not in your path. exit /b ) where /q binarycreator if errorlevel 1 ( echo binarycreator is not in your path. exit /b ) cd /D "%~dp0\.." windeployqt bin rd /s /q installer\packages\net.sourceforge.xaos\data mkdir installer\packages\net.sourceforge.xaos\data\bin xcopy /s /e bin installer\packages\net.sourceforge.xaos\data\bin mkdir installer\packages\net.sourceforge.xaos\data\catalogs xcopy /s /e catalogs installer\packages\net.sourceforge.xaos\data\catalogs mkdir installer\packages\net.sourceforge.xaos\data\tutorial xcopy /s /e tutorial installer\packages\net.sourceforge.xaos\data\tutorial mkdir installer\packages\net.sourceforge.xaos\data\examples for /R examples %%f in (*.*) do copy %%f installer\packages\net.sourceforge.xaos\data\examples binarycreator --offline-only -p installer\packages -c installer\config\config.xml xaossetup.exe XaoS-release-4.3.2/tools/nametest.sh000077500000000000000000000003741455214672000173410ustar00rootroot00000000000000#!/bin/sh # This scripts decides if there are same names in different directories. # If yes, we should consider renaming one of the files. # Use this tool from the folder "examples". find . -name '*.xpf' -printf "%f\n" | sort | uniq -c | grep -v " 1 " XaoS-release-4.3.2/tools/prop2cat.py000066400000000000000000000013251455214672000172630ustar00rootroot00000000000000#!/usr/bin/env python # Convert from java properties file into XaoS catalog file import fileinput key = None for line in fileinput.input(): line = line.strip('\r\n') strip = line.strip() if len(strip) == 0 or strip.startswith('#'): # print blank lines and comments verbatim print line else: # otherwise this should be a key/value pair equal = line.find("=") if equal == -1: # there shouldn't be any other lines without an equal, but oh well print line else: # this is a property line key = line[:equal].strip() value = line[equal+1:].replace('\\n', '\n') print key + ' "' + value + '"' XaoS-release-4.3.2/tools/xaf2cat000077500000000000000000000043451455214672000164420ustar00rootroot00000000000000#!/bin/sh if [ $# != 1 ]; then echo "xaf2cat converts .xaf to .cat file format and reconstructs .xaf" echo "Usage: xaf2cat [ filename.xaf | -h ]" exit 1 fi if [ "$1" = "-h" ]; then echo "This tool helps you create language independent .xaf files." echo "The texts from the .xaf file will be copied into all .cat files." echo "All texts in the .xaf file will be pointered to the .cat files." echo "You have to write your own descriptions for the .xaf tutorial file" echo "into the .cat files for each language." echo "" echo "The usage of this tool is quite straightforward, but unfortunately" echo "it has a serious bug: it cannot handle multiline texts correctly." echo "Keep this bug in mind or write a better script which will solve" echo "this problem." exit 1 fi test -r "$1" || { echo "$1 is missing" exit 1 } export BASENAME=$(basename "$1" .xaf) cp -- "$1" "$1.orig" echo "$1.orig file as backup was created." OUTPUTFILE=$BASENAME.cat echo " ############################################## #for file $1 " > "$OUTPUTFILE" cat "$1" | grep "text " | sed s/"(text "/""/g | sed s/"\")"/"\""/g | \ sed s/" \"$"/"\""/g | awk '{x++; print ENVIRON["BASENAME"] x " " $0}' \ >> "$OUTPUTFILE" cat "$OUTPUTFILE" printf '%s' "^- This is the output. Do you want to append it to ../catalogs/*.cat? [Y/n] " read -r A if [ "$A" != "n" ]; then for i in ../catalogs/*.cat; do cat "$OUTPUTFILE" >> "$i" printf '%s' "$i, " done echo "done." fi printf '%s' "Shall I create 'message' commands instead of 'text's in $1? [Y/n] " read -r A if [ "$A" != "n" ]; then cat "$1" | sed s/"(text "/"(message "/g | \ sed s/" \"$"/"\""/g | awk ' { if (index($0,"(message ")==1) { x++ l=length($0) print "(message ~" ENVIRON["BASENAME"] x "~)" } else print $0 }' | sed s/"~"/"\""/g \ > "$1.work" cat "$1.work" printf '%s' "^- This is the new $1 file. Do you want to save it? [Y/n] " read -r A if [ "$A" != "n" ]; then cp -- "$1.work" "$1" echo "Done." fi fi printf '%s' "Cleanup? [Y/n] " read -r A if [ "$A" != "n" ]; then rm -f "$1.work" "$1.orig" "$OUTPUTFILE" echo "Cleanup done." fi echo "Exiting." XaoS-release-4.3.2/tutorial/000077500000000000000000000000001455214672000156615ustar00rootroot00000000000000XaoS-release-4.3.2/tutorial/3dtutor.xaf000066400000000000000000000115531455214672000177720ustar00rootroot00000000000000;Position file automatically generated by XaoS pre-3.1 ; - an realtime interactive fractal zoomer ;Use xaos -loadpos to display it (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (maxiter 51) (outcoloring 1) (view -1.237 -0.02608 1.515 1.515) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (maxiter 360) (view 0.3887273 0.1968478 0.002032969 0.002032969) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (maxiter 51) (outcoloring 1) (view -0.12364 0.71622 0.69741 0.69741) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (outcoloring 5) (view 0.306879 -0.0287989 0.0118667 0.0118667) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -0.80857449265495002924 0.66696820835337075704) (view 0.58202 1.3391 0.65616 0.65616) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (juliaseed -0.012005987660777653705 -0.74114138638056927184) (maxiter 51) (outcoloring 1) (julia #t) (view 0.03984 0.02255 2.062 2.062) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed 1.0554564823390124545 0.090525427031847784283) (maxiter 70) (outcoloring 6) (view 0.4914 -0.029882 0.44832 0.44832) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -1.1034769359676834024 0.097828372846225401197) (maxiter 60) (outcoloring 5) (view 0.1531 -0.5733 4.062 4.062) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed 0.71096311368481519008 1.2894272914547220518) (maxiter 51) (outcoloring 1) (view 0.21293 0.43984 0.22778 0.22778) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 91) (formula 'barnsley) (juliaseed -1.0336492290611611882 -0.11492371202731229457) (angle 250.59) (maxiter 65) (outcoloring 5) (incoloring 1) (view -0.1431 0.00927 1.663 1.663) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'phoenix) (angle -50.166) (view 0.48387 0.74198 0.20413 0.20413) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'phoenix) (angle 7.1785) (outcoloring 5) (view 0.37418 0.30903 0.20075 0.20075) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'octo) (plane 1) (view -0.3248 -1.488 8.813 8.813) (usleep 3000000) (initstate) (filter 'threed #t) (palette 2 909385182 0) (formula 'phoenix) (maxiter 360) (outcoloring 5) (view 0.49982982 -1.0535759 0.0002203857 0.0002203857) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'phoenix) (juliaseed 0.10537790697674418599 0.37499999999999999989) (angle 91.511) (maxiter 280) (outcoloring 9) (view -0.1907 0.1347 3.549 3.549) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'octo) (angle 89.97) (plane 2) (view 3.56 0.0213 24.6 24.6) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -1.064316860465116279 -0.037500000000000000022) (outcoloring 5) (plane 5) (view -0.2298 -0.9671 4.087 4.087) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -1.064316860465116279 -0.037500000000000000022) (angle 171.37) (outcoloring 5) (plane 6) (view -2.24 0.348 30.7 30.7) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'barnsley) (juliaseed -1.0254311388601783912 -0.043232444528173452863) (maxiter 320) (outcoloring 5) (plane 3) (view 0.8763 -0.5159 3.25 3.25) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel3) (juliaseed 0.42742377656962010423 -0.0095079491380823082557) (outcoloring 5) (julia #t) (plane 1) (view 2.38739 1.96112 0.0326849 0.0326849) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (juliaseed -0.049236902526869000176 0.70312499999999999978) (maxiter 110) (outcoloring 1) (julia #t) (view -0.1675 0.68876 0.89324 0.89324) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (maxiter 140) (outcoloring 5) (plane 1) (view -1.18691 -0.26428 0.0151632 0.0151632) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'newton) (outcoloring 8) (view 0.23672 0.27244 0.99213 0.99213) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (outcoloring 3) (view -0.764063 0.109375 0.0988709 0.0988709) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (juliaseed -0.10192585722409689504 -0.93229166666666666652) (maxiter 30) (outcoloring 1) (julia #t) (plane 1) (view -0.8057 -1.58 9.354 9.354) (usleep 3000000) (initstate) (filter 'threed #t) (defaultpalette 0) (formula 'mandel) (angle 90.237) (maxiter 70) (outcoloring 1) (plane 1) (view -0.3973 0.08706 4.01 4.01) XaoS-release-4.3.2/tutorial/Bclosing.xaf000066400000000000000000000025041455214672000201220ustar00rootroot00000000000000; part for Bolyai.xaf (initstate) (formula 'carpet) (plane 1) (view 0.32622 -0.49166 0.21305 0.21305) (palette 3 1511036653 0) ;(view 3456.7177667684657059 -2522.4799751508215933 4683.1080715734200037 4683.1080715734200353) (unzoom) (usleep 10000000) (zoomcenter 0.18669458707165150385 -0.38868516453635421515) (text "Kedves Vendgeink!") (textsleep) (text "nk most a Bevezets a fraktlok vilgba cm fraktlbemutatbl lttak rszleteket.") (textsleep) (usleep 1000000) (text "A program ingyenesen letlthet a Bolyai Intzet weboldalrl.") (textsleep) (usleep 10000000) (textsleep) (color 'black) (text "Szeretettel kszntjk kedves vendgeinket az EGYETEMI TAVASZ a Bolyai Intzetben rendezvnynkn!") (usleep 50000000) (color 'black) (text "A httrben jelenleg a Sierpinski-sznyeg geometriai inverzival transzformlt vltozatt lthatjuk.") (textsleep) (usleep 5000000) (text "Jl megfigyelhet, ahogyan az egyenes szakaszok krvekk vlnak az inverzv skon.") (textsleep) (text "Az is jl ltszik, hogy a vges terlet Sierpinski-sznyeg az inverzi utn vgtelen terletv vltozik, mivel az alapkr kzppontjt a Sierpinski-sznyeg belsejben vettk fel.") (textsleep) (color 'white) (text "Szeretettel kszntjk kedves vendgeinket az EGYETEMI TAVASZ a Bolyai Intzetben rendezvnynkn!") (usleep 300000000) XaoS-release-4.3.2/tutorial/Bintro.xaf000066400000000000000000001024311455214672000176170ustar00rootroot00000000000000; part for Bolyai.xaf (initstate) (palette 1 777280519 0) (formula 'magnet) (angle 88.336) (outcoloring 6) (view -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (text "EGYETEMI TAVASZ a Bolyai Intézetben 2006") (usleep 2544353) (usleep 517082) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500036) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500002) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 520027) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 443883) (usleep 59190) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500054) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 519990) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 516021) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500022) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500021) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500024) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500019) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 2055495) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 517939) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500074) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 520002) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 419991) (speedup 0.0018900000000000000282) (maxstep 0.025200000000000001589) (usleep 60004) (speedup 0.0019845000000000001134) (maxstep 0.026460000000000002786) (usleep 20043) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 39958) (speedup 0.0020837250000000002071) (maxstep 0.0277830000000000041) (usleep 56005) (speedup 0.0021879112500000003099) (maxstep 0.029172150000000005539) (usleep 60234) (speedup 0.0022973068125000004225) (maxstep 0.030630757500000007111) (usleep 59769) (speedup 0.0024121721531250005455) (maxstep 0.032162295375000008824) (usleep 60059) (speedup 0.0025327807607812506797) (maxstep 0.033770410143750010692) (usleep 60165) (speedup 0.0026594197988203133261) (maxstep 0.035458930650937512726) (usleep 59783) (speedup 0.0027923907887613291104) (maxstep 0.037231877183484389934) (usleep 60038) (speedup 0.0029320103281993956899) (maxstep 0.039093471042658611082) (usleep 60195) (speedup 0.0030786108446093656045) (maxstep 0.041048144594791543371) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 59777) (speedup 0.0032325413868398340213) (maxstep 0.043100551824531122362) (usleep 460015) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 500021) (animateview -0.3369840037 -0.3762948312 3.907769588E-06 5.73139605E-06) (usleep 400021) (zoomcenter -0.33698684382506478835 -0.37629136558411988191) (unzoom) (usleep 15992) (zoomcenter -0.33698426945484469524 -0.37629509551542317773) (usleep 88564) (animateview -0.3369839969 -0.3762948245 4.007209523E-06 5.877241305E-06) (usleep 335921) (zoomcenter -0.33698425887659436747 -0.37629509520812027897) (usleep 45501) (zoomcenter -0.33698424788601331282 -0.37629509488883898885) (usleep 91091) (zoomcenter -0.33698423601995480356 -0.3762950945441246875) (usleep 45506) (animateview -0.3369838701 -0.3762946942 5.934888513E-06 8.704504145E-06) (usleep 103152) (zoomcenter -0.33698423640803626264 -0.37629508118524376695) (usleep 35607) (zoomcenter -0.33698422269093341347 -0.37629508078675580058) (usleep 386424) (zoomcenter -0.33698420422251692136 -0.37629506123354350115) (animateview -0.3369836723 -0.3762944779 9.244948113E-06 1.355925878E-05) (usleep 107614) (zoomcenter -0.33698418341739177232 -0.37629506062914532013) (usleep 70340) (zoomcenter -0.33698416131562576288 -0.3762950599870791428) (usleep 34765) (zoomcenter -0.33698416197612606285 -0.37629503725075756743) (usleep 34722) (zoomcenter -0.33698413853852333919 -0.37629503656988473671) (usleep 69503) (zoomcenter -0.33698411367977244092 -0.37629503584772691665) (usleep 68524) (zoomcenter -0.3369841144443004044 -0.37629500953047371713) (usleep 69183) (zoomcenter -0.33698408653051470951 -0.3762950087195657712) (usleep 69071) (animateview -0.33698341 -0.376294166 1.43833782E-05 2.10956238E-05) (usleep 445900) (zoomcenter -0.33698404339988525695 -0.3762950074666017152) (usleep 70151) (animateview -0.336983044 -0.376293707 2.22333918E-05 3.26089783E-05) (usleep 363075) (zoomcenter -0.33698398142950180867 -0.37629500566633438828) (usleep 153581) (animateview -0.336982509 -0.376292996 3.4385258E-05 5.04317175E-05) (usleep 38800) (zoomcenter -0.33698390858202986322 -0.37629500355008278106) (usleep 157332) (zoomcenter -0.3369838255294403345 -0.37629500113736794856) (usleep 81281) (zoomcenter -0.33698373662640329482 -0.37629499855469500209) (usleep 40246) (zoomcenter -0.33698364456176114093 -0.37629499588017601449) (usleep 205598) (animateview -0.336981807 -0.376291884 5.34759214E-05 7.84313603E-05) (usleep 526100) (animateview -0.33698078 -0.376290145 8.33654869E-05 0.000122269395) (usleep 531693) (animateview -0.33697916 -0.3762874 0.00013057627 0.00019151189) (usleep 538475) (animateview -0.33697658 -0.37628303 0.00020569703 0.00030168901) (usleep 517194) (animateview -0.33697271 -0.37627648 0.00031826712 0.00046679183) (usleep 246113) (zoomcenter -0.33698206550416861431 -0.37629414900993578768) (usleep 42082) (zoomcenter -0.33697874579406925173 -0.37629405257087420811) (usleep 41317) (zoomcenter -0.33697705088517028899 -0.37629314356798969178) (usleep 42551) (zoomcenter -0.336974379545480938 -0.37629306596437820458) (usleep 43004) (zoomcenter -0.33697345654101241554 -0.37629303915068601041) (usleep 42720) (zoomcenter -0.33697058518505241479 -0.37629295573651249678) (usleep 42582) (zoomcenter -0.33696760841752768326 -0.37629286926008593151) (animateview -0.33696938 -0.37626721 0.00048549948 0.00071206599) (usleep 43366) (zoomcenter -0.33696555129119346137 -0.37629280949964683141) (usleep 43246) (zoomcenter -0.33696341748180289714 -0.37629274751153068379) (usleep 44013) (zoomcenter -0.33696120435500214252 -0.37629268321920833243) (usleep 37195) (zoomcenter -0.33695890747611145839 -0.37629261649385034949) (usleep 35806) (zoomcenter -0.33695653735282027761 -0.37629254764070980776) (usleep 35562) (zoomcenter -0.33695531593378780843 -0.37629251215794120414) (usleep 35745) (zoomcenter -0.33695405730114275254 -0.37629247559410052844) (usleep 250383) (animateview -0.33697605 -0.37625306 0.00075636153 0.0011093304) (usleep 520149) (animateview -0.3369882 -0.3762313 0.001173211 0.00172071) (usleep 516537) (animateview -0.3370068 -0.3761979 0.001814259 0.002660913) (usleep 535887) (animateview -0.337037 -0.3761439 0.002851769 0.004182596) (usleep 527776) (animateview -0.3370835 -0.3760605 0.004452016 0.006529624) (usleep 500706) (animateview -0.3371516 -0.3759385 0.006793244 0.009963426) (usleep 521974) (animateview -0.337261 -0.375743 0.0105534 0.0154783) (usleep 515834) (animateview -0.337428 -0.375443 0.0163102 0.0239216) (usleep 518263) (animateview -0.337689 -0.374976 0.0252589 0.0370463) (usleep 530621) (animateview -0.338103 -0.374233 0.0395275 0.0579736) (usleep 535200) (zoomcenter -0.33669901882413111701 -0.37628506661239618725) (animateview -0.338768 -0.373057 0.0620958 0.0910739) (usleep 36404) (zoomcenter -0.33617280233708092486 -0.37626977978834232457) (usleep 38191) (zoomcenter -0.33576582648982068055 -0.37625795695814915801) (usleep 72679) (zoomcenter -0.3356212915220945754 -0.37625375815276081796) (usleep 35477) (zoomcenter -0.33547232665891993681 -0.3762494306569304921) (usleep 35354) (zoomcenter -0.33501630373007816764 -0.37608272038440807662) (usleep 35098) (zoomcenter -0.33485816251612321857 -0.37607812631148773694) (usleep 35211) (zoomcenter -0.33453709862876960187 -0.37590593534600454166) (usleep 36765) (zoomcenter -0.33403367195346049038 -0.37589131057616387833) (usleep 35781) (zoomcenter -0.33369250075948155625 -0.37570833578640938869) (usleep 35732) (zoomcenter -0.3335140966790276708 -0.37570315306816413236) (usleep 73042) (zoomcenter -0.33332437241333636889 -0.37569764149348005257) (usleep 36560) (zoomcenter -0.33312881557335340766 -0.37569196047990689974) (animateview -0.340922 -0.371482 0.0951987 0.139625) (usleep 37654) (zoomcenter -0.33292713080059606795 -0.37568610144714878956) (usleep 38149) (zoomcenter -0.33271893393538754514 -0.37568005323519547449) (usleep 38263) (zoomcenter -0.33250392490967960144 -0.37567380712693608757) (usleep 40451) (zoomcenter -0.33228830387451265018 -0.37544552096723271642) (usleep 37725) (zoomcenter -0.33205852652144433895 -0.37543884583246525991) (usleep 76257) (zoomcenter -0.33156795028899409267 -0.3754245943737310176) (usleep 37683) (zoomcenter -0.33132231291218571816 -0.37516452877582784703) (usleep 37020) (zoomcenter -0.33106115931676076468 -0.37515694214720153016) (usleep 37934) (zoomcenter -0.33079171767911510617 -0.37514911474724573794) (usleep 124297) (zoomcenter -0.33050186029349726431 -0.37484223175054218451) (animateview -0.34581 -0.36942 0.14584 0.2139) (usleep 38372) (zoomcenter -0.33019288327089315314 -0.37483325582998957578) (usleep 40569) (zoomcenter -0.32987373652270415641 -0.37482398447436505643) (usleep 82406) (zoomcenter -0.32988366285451462567 -0.37448229156050700034) (usleep 77864) (zoomcenter -0.32951757068133039533 -0.37447165641931190935) (usleep 38253) (zoomcenter -0.32913947419839015461 -0.37446067254755507396) (usleep 38844) (zoomcenter -0.32796796820210270002 -0.37442663977495290495) (usleep 38794) (zoomcenter -0.32675742092606056789 -0.37439147283573084727) (usleep 38648) (zoomcenter -0.32634047530902047984 -0.37437936037927124357) (usleep 116479) (animateview -0.3551 -0.36666 0.22433 0.32902) (usleep 157640) (zoomcenter -0.32581533916469443643 -0.37436410493965619696) (usleep 347788) (animateview -0.37061 -0.36256 0.34367 0.50405) (usleep 76424) (zoomcenter -0.32579352955841981511 -0.37511485436657061187) (usleep 74718) (zoomcenter -0.32577026244081781412 -0.37591577552881914976) (usleep 36875) (zoomcenter -0.32572225401600969464 -0.37756836370294407691) (usleep 324970) (animateview -0.39492 -0.35489 0.52987 0.77714) (usleep 530607) (animateview -0.434 -0.34207 0.82918 1.2161) (usleep 510910) (animateview -0.4924 -0.3229 1.276 1.872) (usleep 214075) (zoomcenter -0.32892325975095715478 -0.37766135434970212704) (usleep 38826) (zoomcenter -0.33223479305497841913 -0.37775755587172371092) (usleep 13525) (zoomcenter -0.33548458010872552433 -0.38119822855831588435) (usleep 27640) (zoomcenter -0.34233264061809230076 -0.3813971677757161742) (usleep 77301) (zoomcenter -0.34222668517896859887 -0.38504445898303838047) (usleep 139146) (animateview -0.5781 -0.2921 1.963 2.88) (usleep 78739) (zoomcenter -0.34662972690166073237 -0.38517236931229074113) (usleep 242185) (zoomcenter -0.34647280369758239404 -0.3905741177000402367) (usleep 184771) (animateview -0.7017 -0.2416 3.009 4.413) (usleep 47464) (zoomcenter -0.35943626297595170435 -0.39752659867678111821) (usleep 14104) (zoomcenter -0.46404874860278503662 -0.45363170925199076952) (usleep 10297) (zoomcenter -0.54383728647808903634 -0.48280034980070399414) (usleep 13198) (zoomcenter -0.56415506301265945467 -0.48339059028668871399) (usleep 10075) (zoomcenter -0.57080476907495759415 -0.49043088604884792255) (usleep 169945) (zoomcenter -0.55502034765028856426 -0.48997234155423591477) (usleep 12093) (zoomcenter -0.55478899425196826216 -0.4979361914750748682) (usleep 12020) (zoomcenter -0.53868119430059553432 -0.49746825268978180047) (usleep 21817) (zoomcenter -0.53045841416483379609 -0.49722937725303213924) (usleep 10545) (zoomcenter -0.52217120524673036236 -0.49698863013136971038) (usleep 11517) (zoomcenter -0.5054486255875339777 -0.49650283172089068918) (usleep 12011) (zoomcenter -0.47987474022771449861 -0.50420121363659302919) (usleep 12027) (zoomcenter -0.47134576520170412566 -0.50395344310147869904) (usleep 9216) (zoomcenter -0.4541137917614031224 -0.50345284657406964824) (usleep 130754) (zoomcenter -0.44451500455326176708 -0.50317399751708955272) (usleep 12031) (animateview -0.8088 -0.1122 4.624 6.781) (usleep 23969) (stop) (usleep 118092) (zoomcenter -0.45538149295795307865 -0.50348967386021790932) (usleep 13913) (morphview -0.8441 -0.06208 5.213 7.645) (usleep 32363) (zoomcenter -0.45545610267126003436 -0.5034918413057238955) (usleep 15651) (zoomcenter -0.45551541212155710221 -0.50349356427175353244) (morphview -0.8449 -0.0479 5.376 7.885) (usleep 8402) (zoomcenter -0.455956781103357884 -0.49211847581468281317) (morphview -0.8356 -0.04531 5.404 7.925) (usleep 15647) (zoomcenter -0.46713247075418473178 -0.50383104501534613353) (morphview -0.8272 -0.05217 5.454 8) (usleep 8516) (zoomcenter -0.45579128994473475025 -0.50350157864577461345) (morphview -0.806 -0.04929 5.481 8.039) (usleep 15679) (zoomcenter -0.45618498199165509552 -0.49190338307051232792) (morphview -0.7975 -0.04502 5.53 8.11) (usleep 8172) (zoomcenter -0.45595117706524058063 -0.50350622343806029918) (morphview -0.787 -0.05429 5.554 8.146) (usleep 11809) (zoomcenter -0.45600341946603923287 -0.50350774110314456362) (morphview -0.7773 -0.0511 5.59 8.198) (usleep 11767) (morphview -0.7674 -0.04798 5.624 8.248) (usleep 20003) (zoomcenter -0.45607865608871330944 -0.50350992676064775726) (usleep 8285) (morphview -0.7598 -0.04124 5.703 8.364) (usleep 11759) (zoomcenter -0.46823005085162582164 -0.5038629302075579142) (usleep 8202) (morphview -0.7382 -0.03624 5.756 8.442) (usleep 7791) (zoomcenter -0.45617041368637268554 -0.50351259235985557951) (usleep 12200) (zoomcenter -0.45656771617449085277 -0.49129059577359021537) (morphview -0.7285 -0.03185 5.806 8.516) (usleep 8037) (zoomcenter -0.45627754157100661509 -0.50351570447276720887) (morphview -0.7167 -0.04217 5.826 8.544) (usleep 12017) (zoomcenter -0.4563189621368964099 -0.5035169077587123494) (morphview -0.7057 -0.03954 5.854 8.586) (usleep 8418) (zoomcenter -0.45637963758844822732 -0.50351867040768874507) (morphview -0.6941 -0.03764 5.874 8.615) (usleep 11570) (zoomcenter -0.45642072326255507577 -0.50351986396487796716) (morphview -0.6827 -0.03522 5.9 8.653) (usleep 7785) (zoomcenter -0.45647587108300423763 -0.50352146603370117321) (morphview -0.6709 -0.03351 5.917 8.678) (usleep 12198) (zoomcenter -0.45651168250989351293 -0.50352250637165227521) (morphview -0.6592 -0.03109 5.943 8.716) (usleep 7979) (zoomcenter -0.45656648224400361836 -0.50352409832841181318) (morphview -0.6472 -0.02944 5.959 8.74) (usleep 11997) (morphview -0.6353 -0.02718 5.983 8.774) (usleep 8066) (zoomcenter -0.45660103366541305366 -0.50352510206264077609) (usleep 11999) (zoomcenter -0.45663345343788169775 -0.50352604387151562217) (morphview -0.6237 -0.02383 6.02 8.829) (usleep 7740) (zoomcenter -0.45668026318825225221 -0.50352740371567773005) (morphview -0.6114 -0.02238 6.034 8.849) (usleep 12250) (zoomcenter -0.46949160647314029294 -0.50389957896200565087) (morphview -0.5991 -0.02034 6.054 8.88) (usleep 7503) (zoomcenter -0.45675315971885435947 -0.50352952139246071712) (morphview -0.5737 -0.01864 6.066 8.898) (usleep 12488) (zoomcenter -0.46963103780444355226 -0.50390362950447568414) (morphview -0.5612 -0.01671 6.086 8.926) (usleep 8217) (zoomcenter -0.45681992126075830752 -0.50353146084508100934) (morphview -0.5357 -0.015 6.098 8.944) (usleep 15505) (zoomcenter -0.46976430944415797507 -0.50390750110515301115) (morphview -0.523 -0.01288 6.12 8.976) (usleep 7567) (zoomcenter -0.45689147004780418935 -0.50353353936931153788) (morphview -0.4972 -0.01135 6.129 8.99) (usleep 12466) (zoomcenter -0.45691207050436271849 -0.50353413782177851505) (morphview -0.4843 -0.00974 6.145 9.012) (usleep 8015) (morphview -0.4713 -0.008633 6.154 9.026) (usleep 11954) (zoomcenter -0.46998182552682835254 -0.50391382004453726898) (animateview -0.4713 -0.007602 6.167 9.044) (usleep 7540) (zoomcenter -0.45697168481741730039 -0.50353586964420746555) (morphview -0.4452 -0.006251 6.174 9.055) (usleep 12462) (zoomcenter -0.47006734175412709877 -0.50391630432914757119) (morphview -0.4321 -0.004946 6.185 9.072) (usleep 7766) (morphview -0.4059 -0.00367 6.192 9.081) (usleep 12292) (zoomcenter -0.47011597637698820021 -0.50391771718667085226) (usleep 7256) (zoomcenter -0.45701795916289625793 -0.50353721393461826184) (morphview -0.3795 -0.001762 6.206 9.102) (usleep 12720) (zoomcenter -0.4566466175286491196 -0.51667176999050933462) (morphview -0.3662 -0.0007388 6.214 9.114) (usleep 7171) (zoomcenter -0.47020879804771582408 -0.50392041369767671824) (morphview -0.3534 0.01308 6.217 9.119) (usleep 12796) (zoomcenter -0.45705222268670686489 -0.50353820930529335121) (morphview -0.3269 0.01432 6.223 9.127) (usleep 7232) (zoomcenter -0.45706439169891817652 -0.503538562820535009) (morphview -0.3137 0.01491 6.226 9.131) (usleep 12779) (zoomcenter -0.46987636693673450248 -0.51709761947016949512) (morphview -0.3004 0.01561 6.229 9.136) (usleep 7067) (zoomcenter -0.45707751483078526547 -0.50353894405337895108) (morphview -0.2744 0.02967 6.231 9.138) (usleep 12924) (zoomcenter -0.45708029942852000869 -0.50353902494718725885) (morphview -0.2612 0.03019 6.232 9.141) (usleep 7491) (zoomcenter -0.47028739798751139972 -0.50392269706104496693) (morphview -0.2479 0.03059 6.232 9.141) (usleep 12570) (morphview -0.2215 0.03136 6.232 9.141) (usleep 6763) (morphview -0.2083 0.03174 6.232 9.141) (usleep 13202) (morphview -0.1951 0.03213 6.232 9.141) (usleep 6620) (morphview -0.1819 0.03251 6.232 9.141) (usleep 13361) (morphview -0.1555 0.03328 6.232 9.141) (usleep 6624) (morphview -0.1423 0.03366 6.232 9.141) (usleep 13377) (morphview -0.1291 0.03404 6.232 9.141) (usleep 6584) (morphview -0.1159 0.03443 6.232 9.141) (usleep 13445) (morphview -0.1027 0.03481 6.232 9.141) (usleep 6704) (morphview -0.0895 0.0352 6.232 9.141) (usleep 13326) (morphview -0.07629 0.03558 6.232 9.141) (usleep 14655) (morphview -0.06309 0.03596 6.232 9.141) (usleep 159743) (morphview -0.04988 0.03635 6.232 9.141) (usleep 71238) (morphview -0.03668 0.03673 6.232 9.141) (usleep 95035) (animateview -0.03668 0.03673 6.232 9.141) (usleep 6614) (morphview -0.02386 0.0503 6.232 9.141) (usleep 19247) (morphview -0.01066 0.05069 6.232 9.141) (usleep 13423) (morphview 0.002548 0.05107 6.232 9.141) (usleep 6488) (morphview 0.002165 0.06426 6.232 9.141) (usleep 13576) (morphview 0.01537 0.06464 6.232 9.141) (usleep 14383) (morphview 0.02857 0.06503 6.232 9.141) (usleep 20597) (morphview 0.04139 0.0786 6.232 9.141) (usleep 13008) (morphview 0.0546 0.07899 6.232 9.141) (usleep 6716) (morphview 0.06742 0.09256 6.232 9.141) (usleep 13281) (morphview 0.08024 0.1061 6.232 9.141) (usleep 6599) (morphview 0.09344 0.1065 6.232 9.141) (usleep 13362) (morphview 0.1063 0.1201 6.232 9.141) (usleep 8195) (morphview 0.1323 0.134 6.232 9.141) (usleep 18594) (morphview 0.1583 0.148 6.232 9.141) (usleep 13212) (morphview 0.1579 0.1612 6.232 9.141) (usleep 6894) (morphview 0.184 0.1752 6.232 9.141) (usleep 13149) (morphview 0.1968 0.1887 6.232 9.141) (usleep 6637) (morphview 0.21 0.1891 6.232 9.141) (usleep 13322) (morphview 0.2613 0.2434 6.232 9.141) (usleep 8309) (morphview 0.2745 0.2438 6.232 9.141) (usleep 7805) (morphview 0.2873 0.2574 6.232 9.141) (usleep 19235) (morphview 0.3261 0.2849 6.232 9.141) (usleep 21091) (morphview 0.4174 0.3272 6.232 9.141) (usleep 22889) (morphview 0.4563 0.3547 6.232 9.141) (usleep 12674) (morphview 0.4687 0.3814 6.232 9.141) (usleep 8131) (morphview 0.4947 0.3954 6.232 9.141) (usleep 11870) (morphview 0.5075 0.409 6.232 9.141) (usleep 8039) (morphview 0.5336 0.4229 6.232 9.141) (usleep 12110) (morphview 0.5464 0.4365 6.232 9.141) (usleep 8209) (morphview 0.5592 0.4501 6.232 9.141) (usleep 11671) (morphview 0.572 0.4637 6.232 9.141) (usleep 8026) (morphview 0.5981 0.4776 6.232 9.141) (usleep 12035) (morphview 0.6113 0.478 6.232 9.141) (usleep 8061) (morphview 0.6241 0.4916 6.232 9.141) (usleep 11852) (morphview 0.6369 0.5051 6.232 9.141) (usleep 8003) (morphview 0.6497 0.5187 6.232 9.141) (usleep 11998) (morphview 0.701 0.573 6.232 9.141) (usleep 8035) (morphview 0.7142 0.5734 6.232 9.141) (usleep 12055) (morphview 0.727 0.587 6.232 9.141) (usleep 7922) (morphview 0.7398 0.6005 6.232 9.141) (usleep 19193) (morphview 0.8043 0.6552 6.232 9.141) (usleep 20083) (morphview 0.8688 0.7099 6.232 9.141) (usleep 12740) (animateview 0.8688 0.7099 6.232 9.141) (usleep 6557) (morphview 0.8945 0.7371 6.232 9.141) (usleep 20328) (morphview 0.9333 0.7646 6.232 9.141) (usleep 19828) (morphview 0.9589 0.7917 6.232 9.141) (usleep 20313) (morphview 0.9718 0.8053 6.232 9.141) (usleep 12950) (morphview 0.9978 0.8193 6.232 9.141) (usleep 6546) (morphview 1.011 0.8196 6.232 9.141) (usleep 13454) (morphview 1.037 0.8336 6.232 9.141) (usleep 6879) (morphview 1.05 0.8472 6.232 9.141) (usleep 13149) (morphview 1.076 0.8611 6.232 9.141) (usleep 6930) (morphview 1.089 0.8747 6.232 9.141) (usleep 13126) (morphview 1.102 0.8883 6.232 9.141) (usleep 7018) (morphview 1.114 0.9019 6.232 9.141) (usleep 12900) (morphview 1.127 0.9154 6.232 9.141) (usleep 6863) (morphview 1.14 0.929 6.232 9.141) (usleep 13139) (morphview 1.153 0.9426 6.232 9.141) (usleep 7106) (morphview 1.179 0.9565 6.232 9.141) (usleep 12894) (morphview 1.205 0.9705 6.232 9.141) (usleep 6900) (morphview 1.218 0.9841 6.232 9.141) (usleep 13101) (morphview 1.269 1.038 6.232 9.141) (usleep 7021) (morphview 1.282 1.039 6.232 9.141) (usleep 13043) (morphview 1.333 1.093 6.232 9.141) (usleep 7976) (morphview 1.347 1.093 6.232 9.141) (usleep 11961) (morphview 1.359 1.107 6.232 9.141) (usleep 8003) (morphview 1.411 1.161 6.232 9.141) (usleep 11999) (morphview 1.424 1.162 6.232 9.141) (usleep 6929) (morphview 1.437 1.175 6.232 9.141) (usleep 13102) (morphview 1.45 1.189 6.232 9.141) (usleep 6892) (morphview 1.462 1.202 6.232 9.141) (usleep 13082) (morphview 1.475 1.216 6.232 9.141) (usleep 6604) (morphview 1.502 1.217 6.232 9.141) (usleep 13461) (morphview 1.514 1.23 6.232 9.141) (usleep 6868) (morphview 1.527 1.244 6.232 9.141) (usleep 13070) (morphview 1.54 1.257 6.232 9.141) (usleep 6789) (morphview 1.566 1.271 6.232 9.141) (usleep 13211) (morphview 1.579 1.285 6.232 9.141) (usleep 6897) (morphview 1.592 1.299 6.232 9.141) (usleep 13104) (morphview 1.618 1.313 6.232 9.141) (usleep 7087) (morphview 1.669 1.367 6.232 9.141) (usleep 12913) (morphview 1.682 1.38 6.232 9.141) (usleep 7376) (morphview 1.708 1.394 6.232 9.141) (usleep 12685) (morphview 1.721 1.408 6.232 9.141) (usleep 6936) (morphview 1.734 1.421 6.232 9.141) (usleep 13004) (morphview 1.76 1.435 6.232 9.141) (usleep 7099) (morphview 1.772 1.449 6.232 9.141) (usleep 12904) (morphview 1.785 1.463 6.232 9.141) (usleep 6674) (morphview 1.811 1.477 6.232 9.141) (usleep 19990) (morphview 1.837 1.504 6.232 9.141) (usleep 13361) (animateview 1.837 1.504 6.232 9.141) (usleep 6842) (morphview 1.876 1.531 6.232 9.141) (usleep 19631) (morphview 1.915 1.559 6.232 9.141) (usleep 20131) (morphview 1.941 1.573 6.232 9.141) (usleep 19836) (morphview 1.966 1.6 6.232 9.141) (usleep 20035) (morphview 2.005 1.627 6.232 9.141) (usleep 20012) (morphview 2.044 1.655 6.232 9.141) (usleep 20135) (morphview 2.083 1.682 6.232 9.141) (usleep 19780) (morphview 2.108 1.71 6.232 9.141) (usleep 20429) (morphview 2.121 1.723 6.232 9.141) (usleep 13149) (morphview 2.134 1.737 6.232 9.141) (usleep 6884) (morphview 2.147 1.75 6.232 9.141) (usleep 13148) (morphview 2.173 1.764 6.232 9.141) (usleep 6914) (morphview 2.186 1.778 6.232 9.141) (usleep 13119) (morphview 2.199 1.791 6.232 9.141) (usleep 6816) (morphview 2.225 1.805 6.232 9.141) (usleep 13121) (morphview 2.251 1.819 6.232 9.141) (usleep 6843) (morphview 2.263 1.833 6.232 9.141) (usleep 13159) (morphview 2.315 1.887 6.232 9.141) (usleep 6942) (morphview 2.328 1.901 6.232 9.141) (usleep 13058) (morphview 2.354 1.915 6.232 9.141) (usleep 7133) (morphview 2.366 1.942 6.232 9.141) (usleep 12867) (morphview 2.379 1.955 6.232 9.141) (usleep 7112) (morphview 2.391 1.982 6.232 9.141) (usleep 12960) (morphview 2.404 1.995 6.232 9.141) (usleep 7199) (morphview 2.455 2.05 6.232 9.141) (usleep 12732) (morphview 2.468 2.063 6.232 9.141) (usleep 7270) (morphview 2.519 2.118 6.232 9.141) (usleep 12730) (morphview 2.532 2.131 6.232 9.141) (usleep 7180) (morphview 2.584 2.185 6.232 9.141) (usleep 12853) (morphview 2.597 2.186 6.232 9.141) (usleep 7211) (morphview 2.609 2.213 6.232 9.141) (usleep 12769) (morphview 2.635 2.227 6.232 9.141) (usleep 7127) (morphview 2.648 2.253 6.232 9.141) (usleep 12925) (morphview 2.647 2.267 6.232 9.141) (usleep 7130) (morphview 2.699 2.321 6.232 9.141) (usleep 12828) (morphview 2.711 2.348 6.232 9.141) (usleep 7975) (morphview 2.762 2.402 6.232 9.141) (usleep 12013) (morphview 2.775 2.429 6.232 9.141) (usleep 8043) (morphview 2.788 2.442 6.232 9.141) (usleep 11956) (morphview 2.838 2.523 6.232 9.141) (usleep 8040) (morphview 2.851 2.536 6.232 9.141) (usleep 11987) (morphview 2.901 2.617 6.232 9.141) (usleep 7973) (morphview 2.914 2.631 6.232 9.141) (usleep 12061) (morphview 2.966 2.685 6.232 9.141) (usleep 7992) (morphview 2.978 2.699 6.232 9.141) (usleep 11944) (morphview 2.991 2.712 6.232 9.141) (usleep 8003) (animateview 2.991 2.712 6.232 9.141) (usleep 7048) (morphview 3.004 2.739 6.232 9.141) (usleep 19848) (morphview 3.016 2.766 6.232 9.141) (usleep 20533) (morphview 3.08 2.834 6.232 9.141) (usleep 19696) (morphview 3.13 2.927 6.232 9.141) (usleep 20195) (morphview 3.156 2.968 6.232 9.141) (usleep 19519) (morphview 3.168 2.981 6.232 9.141) (usleep 13209) (morphview 3.181 2.995 6.232 9.141) (usleep 7005) (morphview 3.194 3.022 6.232 9.141) (usleep 13015) (morphview 3.206 3.035 6.232 9.141) (usleep 8183) (morphview 3.232 3.049 6.232 9.141) (usleep 7857) (morphview 3.245 3.076 6.232 9.141) (usleep 12157) (morphview 3.257 3.103 6.232 9.141) (usleep 7398) (morphview 3.27 3.129 6.232 9.141) (usleep 12580) (morphview 3.321 3.184 6.232 9.141) (usleep 7595) (morphview 3.333 3.211 6.232 9.141) (usleep 12440) (morphview 3.359 3.225 6.232 9.141) (usleep 7419) (morphview 3.372 3.251 6.232 9.141) (usleep 12600) (morphview 3.384 3.278 6.232 9.141) (usleep 7218) (morphview 3.397 3.292 6.232 9.141) (usleep 12727) (morphview 3.448 3.346 6.232 9.141) (usleep 7366) (morphview 3.461 3.373 6.232 9.141) (usleep 12597) (morphview 3.512 3.427 6.232 9.141) (usleep 7552) (morphview 3.525 3.454 6.232 9.141) (usleep 12508) (morphview 3.537 3.467 6.232 9.141) (usleep 7300) (morphview 3.55 3.494 6.232 9.141) (usleep 12699) (morphview 3.563 3.508 6.232 9.141) (usleep 7478) (morphview 3.575 3.534 6.232 9.141) (usleep 12550) (morphview 3.588 3.548 6.232 9.141) (usleep 7128) (morphview 3.601 3.562 6.232 9.141) (usleep 12829) (morphview 3.613 3.588 6.232 9.141) (usleep 7238) (morphview 3.626 3.602 6.232 9.141) (usleep 12821) (morphview 3.638 3.629 6.232 9.141) (usleep 7274) (morphview 3.651 3.642 6.232 9.141) (usleep 12681) (morphview 3.664 3.656 6.232 9.141) (usleep 7097) (morphview 3.677 3.669 6.232 9.141) (usleep 12906) (morphview 3.69 3.683 6.232 9.141) (usleep 7263) (morphview 3.703 3.697 6.232 9.141) (usleep 12757) (morphview 3.702 3.71 6.232 9.141) (usleep 7121) (morphview 3.715 3.723 6.232 9.141) (usleep 19725) (morphview 3.728 3.737 6.232 9.141) (usleep 20538) (morphview 3.74 3.764 6.232 9.141) (usleep 19642) (morphview 3.753 3.79 6.232 9.141) (usleep 12936) (animateview 3.753 3.79 6.232 9.141) (usleep 7338) (morphview 3.765 3.83 6.232 9.141) (usleep 19757) (morphview 3.777 3.857 6.232 9.141) (usleep 20396) (morphview 3.789 3.91 6.232 9.141) (usleep 19616) (morphview 3.801 3.937 6.232 9.141) (usleep 19559) (morphview 3.801 3.95 6.232 9.141) (usleep 13343) (morphview 3.814 3.951 6.232 9.141) (usleep 6819) (morphview 3.814 3.964 6.232 9.141) (usleep 13214) (morphview 3.813 3.977 6.232 9.141) (usleep 7429) (morphview 3.826 4.004 6.232 9.141) (usleep 19381) (morphview 3.825 4.03 6.232 9.141) (usleep 13217) (morphview 3.838 4.044 6.232 9.141) (usleep 6617) (morphview 3.837 4.057 6.232 9.141) (usleep 20042) (morphview 3.837 4.07 6.232 9.141) (usleep 13289) (morphview 3.85 4.084 6.232 9.141) (usleep 14406) (morphview 3.849 4.11 6.232 9.141) (usleep 13363) (morphview 3.849 4.123 6.232 9.141) (usleep 6970) (morphview 3.862 4.137 6.232 9.141) (usleep 13060) (morphview 3.861 4.15 6.232 9.141) (usleep 7074) (morphview 3.861 4.163 6.232 9.141) (usleep 12929) (morphview 3.873 4.19 6.232 9.141) (usleep 6800) (morphview 3.873 4.203 6.232 9.141) (usleep 19732) (morphview 3.886 4.217 6.232 9.141) (usleep 26228) (morphview 3.885 4.23 6.232 9.141) (usleep 30382) (morphview 3.885 4.243 6.232 9.141) (usleep 20166) (morphview 3.885 4.256 6.232 9.141) (usleep 18970) (morphview 3.884 4.269 6.232 9.141) (usleep 32092) (morphview 3.884 4.283 6.232 9.141) (usleep 20802) (morphview 3.883 4.296 6.232 9.141) (usleep 19158) (morphview 3.883 4.309 6.232 9.141) (usleep 20246) (morphview 3.883 4.322 6.232 9.141) (usleep 20591) (morphview 3.882 4.335 6.232 9.141) (usleep 12834) (morphview 3.895 4.336 6.232 9.141) (usleep 92861) (animateview 3.895 4.336 6.232 9.141) (usleep 6504) (morphview 3.895 4.349 6.232 9.141) (usleep 30917) (morphview 3.895 4.362 6.232 9.141) (usleep 531932) (animateview 3.895 4.362 6.232 9.141) (usleep 6772) (morphview 3.895 4.349 6.232 9.141) (usleep 552452) (animateview 3.895 4.349 6.232 9.141) (usleep 508258) (animateview 3.895 4.349 6.232 9.141) (usleep 508303) (animateview 3.895 4.349 6.232 9.141) (usleep 508339) (animateview 3.895 4.349 6.232 9.141) (usleep 538959) (animateview 3.895 4.349 6.232 9.141) (usleep 528639) (animateview 3.895 4.349 6.232 9.141) (textsleep) (range 50) (formula 'barnsley) (angle 0) (maxiter 7) (outcoloring 0) (incoloring 0) (plane 0) (view 0.63179 0.75369 0.41932 0.41932) (initstate) (clearscreen) (message "fractal") (usleep 5000000) (text " Fraktálok....") (usleep 5000000) (text " Fraktálok.....") (usleep 5000000) (text " Fraktálok......") (usleep 5000000) (text " Fraktálok.......") (usleep 5000000) (text " Fraktálok........") (usleep 5000000) (clearscreen) (message "fractal1") (textsleep) (clearscreen) (message "fractal2") (textsleep) (clearscreen) (message "fractal3") (textsleep) (clearscreen) (text "Semmi baj! Ez csupán számunkra, matematikusok számára fontos.") (textsleep) (text "Van azonban rövidebb, közérthetőbb, szemléletesebb definíció is.") (textsleep) (clearscreen) (defaultpalette 0) (range 50) (formula 'barnsley) (angle 0) (maxiter 7) (outcoloring 0) (incoloring 0) (plane 0) (view 0.63179 0.75369 0.41932 0.41932) (message "fractal5") (textsleep) (maxiter 9) (display) (message "fractal6") (textsleep) (maxiter 11) (message "fractal7") (textsleep) (maxiter 12) (message "fractal8") (textsleep) (display) (maxiter 13) (usleep 1000000) (maxiter 14) (usleep 500000) (maxiter 15) (usleep 200000) (maxiter 17) (usleep 200000) (maxiter 20) (usleep 200000) (maxiter 25) (textposition 'center 'bottom) (message "fractal9") (textsleep) (display) (message "facts") (textsleep) (display) (usleep 1000000) (message "fact1") (textsleep) (display) (morphview 0.0 0.0 2.5 2.5) (usleep 6000000) (wait) (display) (message "fact2") (textsleep) (display) (message "fact3") (textsleep) (display) ;(message "fact4") ;(textsleep) (display) (message "fact5") (textsleep) (display) (message "fact6") (textsleep) (display) (usleep 1000000) (clearscreen) (usleep 1000000) ;(textposition 'center 'middle) (message "fmath4") (textsleep) ;(clearscreen) ;(usleep 1000000) (message "fmath5") (textsleep) (clearscreen) (textposition 'center 'bottom) (message "fmath6") (linekey 0) (line 'scaled 0.05 0.5 0.05 0.5) (morphlastline 'scaled 0.05 0.5 0.95 0.5) (usleep 1000000) (textsleep) (clearscreen) (load "flake1.xhf") (message "fmath7") (usleep 1000000) (textsleep) (message "fmath8") (textsleep) (message "fmath9") (textsleep) (clearscreen) (load "flake2.xhf") (message "fmath10") (usleep 1000000) (textsleep) (clearscreen) (load "flake3.xhf") (message "fmath11") (usleep 500000) (clearscreen) (load "flake4.xhf") (message "fmath12") (usleep 500000) (textsleep) (message "fmath13") (textsleep) (message "fmath14") (textsleep) (load "flake5.xhf") (usleep 2000000) (text "") (usleep 2000000) (clearscreen) (display) (formula 'koch) (view 0.00316 0.0009989 3.0 3.0) (usleep 2000000) (zoomcenter 0.0 0.0) (zoom) (filter 'palette #t) (palette 1 1675067824 138) (cycling #t) (cyclingspeed -30) (usleep 3500000) (stop) (cycling #f) (clearscreen) (message "tree1") (textsleep) (clearscreen) (textposition 'center 'bottom) (message "tree2") (line 'scaled 0.500 0.800 0.500 0.500) (line 'scaled 0.500 0.500 0.500 0.200) (line 'scaled 0.500 0.500 0.500 0.200) (textsleep) (linekey 0) (morphline 'scaled 0.500 0.800 0.500 0.500) (morphline 'scaled 0.500 0.500 0.650 0.240) (morphline 'scaled 0.500 0.500 0.350 0.240) (usleep 1000000) (usleep 1000000) (clearscreen) (load "tree.xhf") (message "tree3") (usleep 3000000) (text "") (usleep 2000000) (message "nstr") (textsleep) (clearscreen) (message "nstr2") (line 'scaled 0 0.5 0.5 0.5) (line 'scaled 0.5 0.5 1 0.5) (textsleep) (message "nstr3") (linekey 0) (morphline 'scaled 0.000 0.500 0.665 0.680) (morphline 'scaled 0.665 0.680 1.000 0.500) (message "nstr3") (usleep 1000000) (textsleep) (load "coast.xhf") (message "nstr4") (linekey 0) (morphline 'scaled 0 0.5 0 0.5) (morphline 'scaled 1 0.5 1 0.5) (usleep 1000000) (textsleep) (text "") (usleep 1000000) (message "nstr5") (textsleep) XaoS-release-4.3.2/tutorial/Bolyai.xaf000066400000000000000000000024361455214672000176050ustar00rootroot00000000000000; Based on "An introduction to fractals" by Jan Hubicka ; Modifications by Zoltan Kovacs for the "University Spring ; in the Bolyai Institute, 2006", 2006-04-26 (letterspersec 9) (load "Bintro.xaf") (load "mset.xaf") (clearscreen) (initstate) (formula 'carpet) (view 0.959 0.19 47.6 47.6) (zoomcenter 0.63 0.33) (zoom) (text "Kedves Vendégeink!") (textsleep) (text "Önök most a Bevezetés a fraktálok világába című fraktálbemutatóból látnak részleteket.") (textsleep) ; (formula 'sier) ; (zoomcenter 0.37 0.21) ; (zoom) (text "Ezt a bemutatót Jan Hubička cseh matematikus diák készítette 1997-ben, 19 évesen.") (textsleep) (text "A Bolyai Intézet 2002 óta maga is részt a program továbbfejlesztésében.") (textsleep) (text "A program, mely XaoS ('kháosz') névre hallgat, akár felhasználóként, akár fejlesztőként, bárki számára nyitva áll...") (textsleep) ; (formula 'koch) ; (zoomcenter 0.288 0.512) (text "...és ingyenesen letölthető a Bolyai Intézet weboldaláról.") (textsleep) (usleep 3000000) (stop) (initstate) (load "julia.xaf") (load "power.xaf") (load "newton.xaf") (load "barnsley.xaf") (load "phoenix.xaf") (load "octo.xaf") (load "magnet.xaf") ;(clearscreen) (textposition 'center 'middle) ;(message "end") ;(usleep 4000000) (load "Bclosing.xaf") XaoS-release-4.3.2/tutorial/anim.xaf000066400000000000000000000003101455214672000172770ustar00rootroot00000000000000; XaoS features overview by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (message "anim") (usleep 4000000) (load "anim.xhf") XaoS-release-4.3.2/tutorial/anim.xhf000066400000000000000000000201501455214672000173120ustar00rootroot00000000000000(textposition 'center 'middle) (clearscreen) (message "anim2") (textsleep) (clearscreen) (message "anim3") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (speedup 0.0017999999999999999507) (maxstep 0.0240000000000000005) (fastmode 'animation) (maxiter 170) (outcoloring 0) (incoloring 0) (range 3) (plane 0) (view -0.75 0 2.5 2.5) (usleep 3276026) (zoomcenter 0 0) (zoom) (usleep 254) (zoomcenter -0.096656976744186004404 -0.97500000000000006274) (usleep 23135) (zoomcenter -0.086134620573665520533 -0.97499999999999993725) (usleep 2254526) (zoomcenter -0.089856066542531838528 -0.97499999999999999113) (usleep 985127) (zoomcenter -0.092167141284922289601 -0.97499999999999998327) (usleep 22132) (zoomcenter -0.092167141284922307653 -0.97229372799475250247) (usleep 32640) (zoomcenter -0.092167141284922306623 -0.96962982461643588755) (usleep 17783) (zoomcenter -0.092167141284922299792 -0.96435152768104922291) (usleep 21815) (zoomcenter -0.092167141284922294154 -0.9591243989587320997) (usleep 32335) (zoomcenter -0.094335493813460100142 -0.94626382534119757165) (usleep 13217) (zoomcenter -0.094335493813460103828 -0.94114713963894691391) (usleep 21595) (zoomcenter -0.096466554388078681182 -0.9335635033872007665) (usleep 37721) (zoomcenter -0.098562610435358206397 -0.93107714724835884601) (usleep 10529) (zoomcenter -0.098562610435358203253 -0.92613763560711356192) (usleep 20340) (zoomcenter -0.10062554650639343569 -0.92369056661250625162) (usleep 23466) (zoomcenter -0.10266539480322424887 -0.92127088449488625288) (usleep 33919) (zoomcenter -0.10266539480322425424 -0.91888997743035477574) (usleep 31997) (zoomcenter -0.10464107274629004226 -0.91888997743035478381) (usleep 23365) (zoomcenter -0.10464107274629005386 -0.91657169828426876871) (usleep 23221) (zoomcenter -0.10464107274629004724 -0.91428161439910777283) (usleep 90918) (zoomcenter -0.1046410727462900531 -0.91647412801416771949) (usleep 33926) (zoomcenter -0.10464107274629005516 -0.91863010911138155267) (usleep 33589) (zoomcenter -0.10464107274629004575 -0.9207497667927464609) (usleep 23880) (zoomcenter -0.10464107274629004117 -0.92284810140001263118) (usleep 1372895) (zoomcenter -0.10464107274629004193 -0.92392426289888777421) (usleep 5187230) (zoomcenter -0.1045680896809204386 -0.92392426289888777356) (usleep 18909) (zoomcenter -0.10456808968092043846 -0.9240103170444490013) (usleep 113669) (zoomcenter -0.10456808968092043848 -0.92392904529252773208) (usleep 13082) (zoomcenter -0.10463610972525641385 -0.92392904529252773202) (usleep 36041) (zoomcenter -0.10456928574754863987 -0.92392904529252773213) (usleep 31789) (zoomcenter -0.10456928574754864001 -0.92400722638623318316) (usleep 23587) (zoomcenter -0.10450430093776641816 -0.92423848267483750307) (usleep 15246) (zoomcenter -0.10437499536681364745 -0.92454524899489097306) (usleep 31401) (zoomcenter -0.10437499536681364778 -0.92477188729965671324) (usleep 14570) (zoomcenter -0.10431179136840154066 -0.92507177937488105482) (usleep 23372) (zoomcenter -0.10424933980518617013 -0.92544218174981359739) (usleep 25442) (zoomcenter -0.1041260402053012239 -0.92588095825699037169) (usleep 16773) (zoomcenter -0.10418732747839525763 -0.92631715457308032345) (usleep 29299) (zoomcenter -0.10430797588070833511 -0.92674649647372548165) (usleep 28287) (zoomcenter -0.104427019668399243 -0.92695831231665137183) (usleep 12918) (zoomcenter -0.10454524492732944229 -0.92695831231665137216) (usleep 30776) (zoomcenter -0.10460361479346170456 -0.92695831231665137205) (usleep 39577) (zoomcenter -0.10466072234405435345 -0.92695831231665137189) (usleep 13742) (zoomcenter -0.104717491154444327 -0.92695831231665137199) (usleep 1435613) (stop) (usleep 46771) (zoomcenter -0.104717491154444327 -0.92692540461524138907) (usleep 310773) (zoomcenter -0.10474235329242240593 -0.92692540461524138901) (usleep 12222) (morphview -0.1060043 -0.9240195 0.005870556 0.005870556) (usleep 26711) (zoomcenter -0.10471762603288151407 -0.92689613643037024545) (usleep 19228) (zoomcenter -0.10474224241252057209 -0.9268962044959454031) (morphview -0.1059933 -0.9240736 0.005819776 0.005819776) (usleep 25913) (morphview -0.1059634 -0.9241149 0.005794696 0.005794696) (usleep 12935) (zoomcenter -0.10471773211537884042 -0.92689630529909075053) (usleep 23453) (zoomcenter -0.10474211076316318821 -0.92689636065932105852) (morphview -0.1059571 -0.924158 0.005764871 0.005764871) (usleep 27198) (zoomcenter -0.10474203171628931061 -0.92689645442526800301) (morphview -0.1059288 -0.9241959 0.005745855 0.005745855) (usleep 19094) (morphview -0.1059022 -0.9242299 0.005734698 0.005734698) (usleep 12724) (zoomcenter -0.1047419517168699003 -0.92689654932113102768) (usleep 19657) (morphview -0.105875 -0.9242656 0.005719419 0.005719419) (usleep 10671) (zoomcenter -0.10474192472430625939 -0.92683940720794162816) (usleep 31531) (zoomcenter -0.10474191706643314056 -0.92686801244156271414) (morphview -0.1058482 -0.9243577 0.005705357 0.005705357) (usleep 29020) (zoomcenter -0.1047418739066415781 -0.92686811483444752436) (morphview -0.105823 -0.9244172 0.005699712 0.005699712) (usleep 26744) (zoomcenter -0.10474185011120396613 -0.92683967272767116838) (morphview -0.1057986 -0.9244751 0.005697701 0.005697701) (usleep 30044) (morphview -0.1057745 -0.9245606 0.005697701 0.005697701) (usleep 18012) (morphview -0.1057745 -0.9246176 0.005697701 0.005697701) (usleep 30145) (morphview -0.1057505 -0.9246461 0.005697701 0.005697701) (usleep 33400) (morphview -0.1057265 -0.9247031 0.005697701 0.005697701) (usleep 37185) (morphview -0.1057025 -0.92476 0.005697701 0.005697701) (usleep 19178) (morphview -0.1056785 -0.9247885 0.005697701 0.005697701) (usleep 29916) (morphview -0.1056545 -0.924817 0.005697701 0.005697701) (usleep 33617) (morphview -0.1056305 -0.924874 0.005697701 0.005697701) (usleep 26267) (morphview -0.1056064 -0.9249025 0.005697701 0.005697701) (usleep 63127) (morphview -0.1055824 -0.9249025 0.005697701 0.005697701) (usleep 238803) (morphview -0.1055824 -0.924931 0.005697701 0.005697701) (usleep 1000000) (clearscreen) (message "languag1") (textsleep) (clearscreen) (message "languag2") (textsleep) (clearscreen) (message "languag3") (textsleep) (clearscreen) (message "languag4") (textsleep) (clearscreen) (textposition 'left 'top) (text " (palette 3 1758367448 0) (formula 'mandel) (maxiter 170) (view -0.79272158 0.16090545 0.00034821498 0.00034821498) ") (wait) (textposition 'center 'bottom) (message "modif1") (textsleep) (clearscreen) (textposition 'left 'top) (text " (palette 3 1758367448 0) (formula 'mandel) (maxiter 170) (view -0.79272158 0.16090545 0.00034821498 0.00034821498) (wait) (morphview 0 0 2 2) (usleep 10000000) ") (wait) (textposition 'center 'bottom) (message "modif2") (textsleep) (display) (palette 3 1758367448 0) (formula 'mandel) (maxiter 170) (view -0.79272158 0.16090545 0.00034821498 0.00034821498) (wait) (morphview 0 0 2 2) (usleep 10000000) (wait) (usleep 1000000) (clearscreen) (textposition 'left 'top) (text " (palette 3 1758367448 0) (formula 'mandel) (maxiter 170) (wait) (morphview -0.79272158 0.16090545 0.00034821498 0.00034821498) (usleep 10000000) ") (wait) (textposition 'center 'bottom) (message "modif3") (textsleep) (display) (palette 3 1758367448 0) (formula 'mandel) (maxiter 170) (wait) (morphview -0.79272158 0.16090545 0.00034821498 0.00034821498) (usleep 10000000) (wait) (clearscreen) (textposition 'center 'middle) (message "newanim") (textsleep) (display) (defaultpalette 0) (filter 'stereogram #f) (filter 'interlace #f) (filter 'edge #t) (filter 'edge2 #f) (filter 'blur #t) (formula 'mandel) (fastjulia #f) (cycling #f) (periodicity #t) (maxiter 1) (outcoloring 0) (incoloring 0) (plane 0) (view -0.75 0 .1 .1) (usleep 1000000) (view -0.75 0 2.5 2.5) (wait) (maxiter 2) (wait) (maxiter 3) (wait) (maxiter 4) (wait) (maxiter 5) (wait) (maxiter 6) (wait) (maxiter 8) (wait) (maxiter 10) (wait) (maxiter 12) (wait) (maxiter 14) (wait) (maxiter 20) (wait) (maxiter 30) (wait) (maxiter 100) (wait) (filter 'edge #f) (wait) (usleep 1000000) (clearscreen) (message "examples") (textsleep) (clearscreen) (message "examples2") (textsleep) (clearscreen) (message "examples3") (textsleep) (display) XaoS-release-4.3.2/tutorial/barnsley.xaf000066400000000000000000000113121455214672000201760ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "intro4") (usleep 5000000) (palette 1 1686618586 0) (formula 'barnsley) (cycling #f) (periodicity #t) (juliaseed 1.0010901162790698318 -0.62500000000000004022) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (julia #f) (plane 0) (view 0 0 2.5 2.5) (display) (textposition 'center 'bottom) (message "barnsley1") (textsleep) (display) (message "barnsley2") (textsleep) (display) (message "barnsley3") (textsleep) (display) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (fastjulia #t) (linekey 0) (morphline 'fractal 0.97109 -0.655 1.03109 -0.655) (morphline 'fractal 1.03109 -0.655 1.03109 -0.595) (morphline 'fractal 0.97109 -0.595 1.03109 -0.595) (morphline 'fractal 0.97109 -0.655 0.97109 -0.595) (usleep 1000000) (message "barnsley4") (textsleep) (display) (line 'fractal 0.97109 -0.655 1.03109 -0.655) (line 'fractal 1.03109 -0.655 1.03109 -0.595) (line 'fractal 0.97109 -0.595 1.03109 -0.595) (line 'fractal 0.97109 -0.655 0.97109 -0.595) (linekey 0) (morphline 'fractal 1.0027 0.47 1.0627 0.47) (morphline 'fractal 1.0627 0.47 1.0627 0.53) (morphline 'fractal 1.0027 0.53 1.0627 0.53) (morphline 'fractal 1.0027 0.47 1.0027 0.53) (morphjulia 1.0327 0.5) (usleep 2000000) (linekey 0) (morphline 'fractal 0.3282 1.207 0.3882 1.207) (morphline 'fractal 0.3882 1.207 0.3882 1.267) (morphline 'fractal 0.3282 1.267 0.3882 1.267) (morphline 'fractal 0.3282 1.207 0.3282 1.267) (morphjulia 0.3582 1.237) (linekey 0) (morphline 'fractal 0.3282 1.207 0.3882 1.207) (morphline 'fractal 0.3882 1.207 0.3882 1.267) (morphline 'fractal 0.3282 1.267 0.3882 1.267) (morphline 'fractal 0.3282 1.207 0.3282 1.267) (usleep 2000000) (morphjulia -0.3582 1.237) (linekey 0) (morphline 'fractal -0.3882 1.207 -0.3282 1.207) (morphline 'fractal -0.3282 1.207 -0.3282 1.267) (morphline 'fractal -0.3882 1.267 -0.3282 1.267) (morphline 'fractal -0.3882 1.207 -0.3882 1.267) (usleep 2000000) (morphjulia -1.0327 0.65) (linekey 0) (morphline 'fractal -1.0627 0.62 -1.0027 0.62) (morphline 'fractal -1.0027 0.62 -1.0027 0.68) (morphline 'fractal -1.0627 0.68 -1.0027 0.68) (morphline 'fractal -1.0627 0.62 -1.0627 0.68) (usleep 2000000) (morphjulia -1.1591 -0.6125) (linekey 0) (morphline 'fractal -1.1891 -0.6425 -1.1291 -0.6425) (morphline 'fractal -1.1291 -0.6425 -1.1291 -0.5825) (morphline 'fractal -1.1891 -0.5825 -1.1291 -0.5825) (morphline 'fractal -1.1891 -0.6425 -1.1891 -0.5825) (usleep 2000000) (linekey 0) (morphline 'fractal -1.1591 -0.6125 -1.1591 -0.6125) (morphline 'fractal -1.1591 -0.6125 -1.1591 -0.6125) (morphline 'fractal -1.1591 -0.6125 -1.1591 -0.6125) (morphline 'fractal -1.1591 -0.6125 -1.1591 -0.6125) (usleep 1000000) (display) (message "barnsley5") (textsleep) (display) (message "barnsley6") (textsleep) (display) (fastjulia #f) (julia #t) (palette 1 1183407127 0) (juliaseed 1.0485101744186047187 -0.04166666666666666934) (maxiter 311) (outcoloring 1) (incoloring 0) (plane 1) (view -0.1884 -0.202 7.146 7.146) (usleep 2000000) ;(palette 1 1779436629 0) ;(juliaseed 0.031613372093023257869 -1.0500000000000000676) ;(maxiter 170) ;(outcoloring 0) ;(incoloring 1) ;(plane 1) ;(view 0.1308 0.04816 4.578 4.578) ;(usleep 2000000) (palette 1 25997414 0) (filter 'edge2 #t) (juliaseed -1.0472928330130634481 -0.087398343635324930658) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 1) (view -0.1851 -0.09928 7.507 7.507) (usleep 2000000) (filter 'edge2 #f) (palette 3 558734359 0) (juliaseed 0.82617606890462195329 -0.59250450310750061547) (maxiter 54) (outcoloring 0) (incoloring 1) (plane 0) (view -0.5141 0.2394 1.84 1.84) (usleep 2000000) (palette 2 1355057888 0) (juliaseed -1.0221656976744186704 -0.062500000000000004012) (angle -310) (autorotate #f) (maxiter 33) (plane 1) (view -0.78537 0.20149 0.43535 0.43535) (usleep 2000000) (palette 2 1808462409 0) (juliaseed 0.58205451272674395567 0.83592626580482287831) (angle -405) (maxiter 50) (outcoloring 0) (incoloring 1) (plane 3) (view 1.009 0.04757 2.973 2.973) (usleep 2000000) (palette 3 2052922397 0) (formula 'barnsley) (juliaseed 0.0054390291189111917214 -1.0091451435058578867) (maxiter 38) (outcoloring 0) (incoloring 2) (plane 1) (view 1.0166 -0.015562 0.55972 0.55972) (usleep 2000000) (palette 1 1686618586 0) (formula 'barnsley2) (cycling #f) (periodicity #t) (juliaseed 1.0010901162790698318 -0.62500000000000004022) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (julia #f) (plane 0) (view 0 0 2.5 2.5) (display) (textposition 'center 'bottom) (message "barnsley7") (textsleep) (display) (message "barnsley8") (textsleep) XaoS-release-4.3.2/tutorial/classic.xaf000066400000000000000000000033001455214672000177760ustar00rootroot00000000000000;Other fractal types in Xaos - part 3 ;Animation file is made by Arpad Fekete ;This file was made in January 2006 (initstate) (clearscreen) (textposition 'center 'middle) (message "classic1") (usleep 5000000) (initstate) (filter 'edge2 #t) (palette 2 504284649 0) (formula 'sier) (angle 60.043) (view 0.40571 0.25007 1.3406 0.89436) (textposition 'center 'bottom) (message "classic2") (usleep 3500000) (initstate) (palette 2 504284649 0) (formula 'sier) (angle 60.043) (view 0.40571 0.25007 1.3406 0.89436) (textposition 'center 'bottom) (message "classic3") (usleep 3500000) (initstate) (palette 2 504284649 0) (formula 'sier) (juliaseed 0 1) (view 0.5 0.5 1.5 1) (textposition 'center 'bottom) (message "classic4") (usleep 3500000) (morphview 0.5496221675 0.316543832601 4.30048337789E-08 2.86698891854E-08) (textposition 'center 'bottom) (message "classic5") (usleep 8000000) (usleep 2000000) (initstate) (filter 'edge2 #t) (palette 1 946083610 0) (formula 'carpet) (view 0.5262 0.5583 1.16 1.16) (textposition 'center 'bottom) (message "classic6") (usleep 3500000) (initstate) (palette 1 946083610 0) (formula 'carpet) (view 0.5262 0.5583 1.16 1.16) (textposition 'center 'bottom) (message "classic7") (usleep 3500000) (morphview 0.7429239596791351 0.357662405256179 7.783970137290736E-12 7.728315519007004E-12) (textposition 'center 'bottom) (message "classic8") (usleep 8000000) (usleep 2000000) (initstate) (filter 'blur #t) (palette 2 921212061 0) (formula 'koch) (view -0.1026 0.04512 2.437 2.437) (textposition 'center 'bottom) (message "classic9") (usleep 3500000) (morphview 0.3920822 0.5506665 0.002344007 0.002344007) (textposition 'center 'bottom) (message "classic10") (usleep 7000000) (usleep 2000000) XaoS-release-4.3.2/tutorial/coast.xhf000066400000000000000000000116001455214672000174770ustar00rootroot00000000000000(line 'scaled 0.000 0.500 0.041 0.494) (line 'scaled 0.041 0.494 0.058 0.483) (line 'scaled 0.058 0.483 0.083 0.481) (line 'scaled 0.083 0.481 0.103 0.490) (line 'scaled 0.103 0.490 0.131 0.492) (line 'scaled 0.131 0.492 0.149 0.501) (line 'scaled 0.149 0.501 0.165 0.528) (line 'scaled 0.165 0.528 0.208 0.541) (line 'scaled 0.208 0.541 0.233 0.515) (line 'scaled 0.233 0.515 0.251 0.504) (line 'scaled 0.251 0.504 0.261 0.491) (line 'scaled 0.261 0.491 0.267 0.483) (line 'scaled 0.267 0.483 0.270 0.471) (line 'scaled 0.270 0.471 0.281 0.456) (line 'scaled 0.281 0.456 0.295 0.457) (line 'scaled 0.295 0.457 0.304 0.453) (line 'scaled 0.304 0.453 0.308 0.453) (line 'scaled 0.308 0.453 0.315 0.457) (line 'scaled 0.315 0.457 0.326 0.455) (line 'scaled 0.326 0.455 0.331 0.455) (line 'scaled 0.331 0.455 0.345 0.458) (line 'scaled 0.345 0.458 0.376 0.452) (line 'scaled 0.376 0.452 0.380 0.456) (line 'scaled 0.380 0.456 0.391 0.465) (line 'scaled 0.391 0.465 0.399 0.470) (line 'scaled 0.399 0.470 0.404 0.471) (line 'scaled 0.404 0.471 0.412 0.474) (line 'scaled 0.412 0.474 0.415 0.472) (line 'scaled 0.415 0.472 0.417 0.470) (line 'scaled 0.417 0.470 0.418 0.470) (line 'scaled 0.418 0.470 0.421 0.468) (line 'scaled 0.421 0.468 0.426 0.469) (line 'scaled 0.426 0.469 0.427 0.479) (line 'scaled 0.427 0.479 0.435 0.485) (line 'scaled 0.435 0.485 0.434 0.494) (line 'scaled 0.434 0.494 0.435 0.501) (line 'scaled 0.435 0.501 0.442 0.501) (line 'scaled 0.442 0.501 0.445 0.506) (line 'scaled 0.445 0.506 0.453 0.510) (line 'scaled 0.453 0.510 0.457 0.510) (line 'scaled 0.457 0.510 0.464 0.523) (line 'scaled 0.464 0.523 0.471 0.526) (line 'scaled 0.471 0.526 0.489 0.535) (line 'scaled 0.489 0.535 0.515 0.540) (line 'scaled 0.515 0.540 0.521 0.539) (line 'scaled 0.521 0.539 0.530 0.543) (line 'scaled 0.530 0.543 0.533 0.544) (line 'scaled 0.533 0.544 0.539 0.541) (line 'scaled 0.539 0.541 0.559 0.546) (line 'scaled 0.559 0.546 0.571 0.575) (line 'scaled 0.571 0.575 0.606 0.567) (line 'scaled 0.606 0.567 0.618 0.583) (line 'scaled 0.618 0.583 0.622 0.591) (line 'scaled 0.622 0.591 0.626 0.598) (line 'scaled 0.626 0.598 0.630 0.602) (line 'scaled 0.630 0.602 0.643 0.600) (line 'scaled 0.643 0.600 0.650 0.609) (line 'scaled 0.650 0.609 0.659 0.627) (line 'scaled 0.659 0.627 0.664 0.630) (line 'scaled 0.664 0.630 0.669 0.636) (line 'scaled 0.669 0.636 0.670 0.645) (line 'scaled 0.670 0.645 0.663 0.651) (line 'scaled 0.663 0.651 0.668 0.669) (line 'scaled 0.668 0.669 0.665 0.680) (line 'scaled 0.665 0.680 0.668 0.679) (line 'scaled 0.668 0.679 0.674 0.681) (line 'scaled 0.674 0.681 0.684 0.678) (line 'scaled 0.684 0.678 0.700 0.669) (line 'scaled 0.700 0.669 0.699 0.661) (line 'scaled 0.699 0.661 0.705 0.657) (line 'scaled 0.705 0.657 0.711 0.655) (line 'scaled 0.711 0.655 0.714 0.650) (line 'scaled 0.714 0.650 0.716 0.643) (line 'scaled 0.716 0.643 0.712 0.639) (line 'scaled 0.712 0.639 0.710 0.633) (line 'scaled 0.710 0.633 0.712 0.628) (line 'scaled 0.712 0.628 0.713 0.626) (line 'scaled 0.713 0.626 0.717 0.623) (line 'scaled 0.717 0.623 0.722 0.622) (line 'scaled 0.722 0.622 0.723 0.618) (line 'scaled 0.723 0.618 0.727 0.611) (line 'scaled 0.727 0.611 0.733 0.601) (line 'scaled 0.733 0.601 0.732 0.597) (line 'scaled 0.732 0.597 0.732 0.596) (line 'scaled 0.732 0.596 0.737 0.594) (line 'scaled 0.737 0.594 0.743 0.585) (line 'scaled 0.743 0.585 0.742 0.580) (line 'scaled 0.742 0.580 0.744 0.574) (line 'scaled 0.744 0.574 0.745 0.569) (line 'scaled 0.745 0.569 0.746 0.566) (line 'scaled 0.746 0.566 0.750 0.560) (line 'scaled 0.750 0.560 0.751 0.558) (line 'scaled 0.751 0.558 0.753 0.556) (line 'scaled 0.753 0.556 0.754 0.550) (line 'scaled 0.754 0.550 0.754 0.548) (line 'scaled 0.754 0.548 0.755 0.546) (line 'scaled 0.755 0.546 0.759 0.542) (line 'scaled 0.759 0.542 0.761 0.542) (line 'scaled 0.761 0.542 0.765 0.542) (line 'scaled 0.765 0.542 0.771 0.541) (line 'scaled 0.771 0.541 0.772 0.542) (line 'scaled 0.772 0.542 0.776 0.544) (line 'scaled 0.776 0.544 0.779 0.545) (line 'scaled 0.779 0.545 0.789 0.550) (line 'scaled 0.789 0.550 0.795 0.558) (line 'scaled 0.795 0.558 0.806 0.557) (line 'scaled 0.806 0.557 0.808 0.566) (line 'scaled 0.808 0.566 0.816 0.577) (line 'scaled 0.816 0.577 0.834 0.587) (line 'scaled 0.834 0.587 0.841 0.584) (line 'scaled 0.841 0.584 0.852 0.578) (line 'scaled 0.852 0.578 0.859 0.577) (line 'scaled 0.859 0.577 0.864 0.578) (line 'scaled 0.864 0.578 0.868 0.577) (line 'scaled 0.868 0.577 0.872 0.574) (line 'scaled 0.872 0.574 0.877 0.570) (line 'scaled 0.877 0.570 0.895 0.557) (line 'scaled 0.895 0.557 0.912 0.560) (line 'scaled 0.912 0.560 0.918 0.562) (line 'scaled 0.918 0.562 0.924 0.571) (line 'scaled 0.924 0.571 0.936 0.561) (line 'scaled 0.936 0.561 0.949 0.545) (line 'scaled 0.949 0.545 0.947 0.532) (line 'scaled 0.947 0.532 0.948 0.524) (line 'scaled 0.948 0.524 0.949 0.505) (line 'scaled 0.949 0.505 0.963 0.500) (line 'scaled 0.963 0.500 0.983 0.497) (line 'scaled 0.983 0.497 1.000 0.500) XaoS-release-4.3.2/tutorial/dimension.xaf000066400000000000000000000066401455214672000203540ustar00rootroot00000000000000(load "head.xhf") (load "keys.xhf") (clearscreen) (textposition 'center 'middle) (message "fmath") (textsleep) (message "fmath1") (textsleep) (message "fmath2") (textsleep) (message "fmath3") (textsleep) (message "def1") (textsleep) (clearscreen) (message "fractal2") (textsleep) (clearscreen) (textposition 'center 'top) (message "fractal2") (textposition 'center 'bottom) (message "def2") (textsleep) (message "def3") (textsleep) (text "") (usleep 2000000) (message "topo1") (textsleep) (color 'red) (linekey 0) (line 'scaled 0.5 0.5 0.5 0.5) (color 'white) (message "topo2") (textsleep) (morphlastline 'scaled 0.3 0.5 0.7 0.5) (message "topo3") (usleep 1000000) (textsleep) (clearscreen) (message "topo4") (color 'red) (line 'scaled 0.3 0.5 0.7 0.5) (line 'scaled 0.3 0.5 0.7 0.5) (line 'scaled 0.3 0.5 0.3 0.5) (line 'scaled 0.7 0.5 0.7 0.5) (color 'white) (linekey 0) (morphline 'scaled 0.3 0.3 0.7 0.3) (morphline 'scaled 0.3 0.7 0.7 0.7) (morphline 'scaled 0.3 0.3 0.3 0.7) (morphline 'scaled 0.7 0.3 0.7 0.7) (usleep 1000000) (textsleep) (text "") (usleep 2000000) (message "hb1") (textsleep) (message "hb2") (load "line1.xhf") (message "hb3") (load "square.xhf") (message "hb4") (textsleep) (color 'red) (line 'scaled 0.3 0.3 0.3 0.3) (morphlastline 'scaled 0.3 0.3 0.4 0.2) (line 'scaled 0.7 0.3 0.7 0.3) (morphlastline 'scaled 0.7 0.3 0.8 0.2) (line 'scaled 0.7 0.7 0.7 0.7) (morphlastline 'scaled 0.7 0.7 0.8 0.6) (line 'scaled 0.3 0.3 0.7 0.3) (morphlastline 'scaled 0.4 0.2 0.8 0.2) (line 'scaled 0.7 0.3 0.7 0.7) (morphlastline 'scaled 0.8 0.2 0.8 0.6) (color 'white) (usleep 1000000) (line 'scaled 0.5 0.3 0.5 0.3) (morphlastline 'scaled 0.5 0.3 0.6 0.2) (line 'scaled 0.7 0.5 0.7 0.5) (morphlastline 'scaled 0.7 0.5 0.8 0.4) (line 'scaled 0.35 0.25 0.35 0.25) (morphlastline 'scaled 0.35 0.25 0.75 0.25) (line 'scaled 0.75 0.25 0.75 0.25) (morphlastline 'scaled 0.75 0.25 0.75 0.65) (usleep 1000000) (message "hb5") (textsleep) (clearscreen) (message "hb6") (clearlines) (textsleep) (textposition 'center 'top) (message "hb6") (textposition 'center 'bottom) (message "hb7") (load "line1.xhf") (message "hb8") (clearlines) (load "square.xhf") (text "") (usleep 1000000) (message "hb9") (textsleep) (message "hb10") (textsleep) (message "hb11") (clearlines) (color 'red) (load "flake4.xhf") (load "flake5.xhf") (color 'white) (usleep 0) (textsleep) (usleep 2000000) (message "hb12") (textsleep) (clearlines) (color 'red) (line 'scaled 0.05 0.5 0.05 0.5) (morphlastline 'scaled 0.05 0.5 0.95 0.5) (usleep 1000000) (clearlines) (load "flake1.xhf") (usleep 2000000) (clearlines) (load "flake2.xhf") (usleep 1000000) (clearlines) (load "flake3.xhf") (usleep 500000) (clearlines) (load "flake4.xhf") (usleep 200000) (usleep 1000000) (clearlines) (load "flake1.xhf") (color 'white) (message "hb13") (usleep 0) (textsleep) (message "hb14") (textsleep) (color 'red) (clearlines) (load "flake4.xhf") (usleep 0) (color 'white) (message "hb15") (textsleep) (message "hb15b") (textsleep) (load "flaketh.xhf") (usleep 2000000) (message "hb16") (textsleep) (text "") (usleep 2000000) (message "hb17") (textsleep) (message "hb18") (textsleep) (clearscreen) (message "hb19") (color 'red) (load "flake4.xhf") (load "flake5.xhf") (color 'white) (usleep 0) (textsleep) (message "hb20") (textsleep) (clearscreen) (usleep 1000000) (textposition 'center 'middle) (message "defe1") (textsleep) (message "defe2") (textsleep) (message "defe3") (textsleep) (message "defe4") (textsleep) XaoS-release-4.3.2/tutorial/escape.xaf000066400000000000000000000134071455214672000176260ustar00rootroot00000000000000(load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "escape") (textsleep) (textposition 'center 'bottom) (clearscreen) (message "escape1") (color 'red) (load "flake1.xhf") (usleep 2000000) (clearlines) (load "flake2.xhf") (usleep 1000000) (clearlines) (load "flake3.xhf") (usleep 500000) (clearlines) (load "flake4.xhf") (usleep 200000) (textsleep) (color 'white) (display) (message "escape2") (textsleep) (message "escape3") (textsleep) (message "escape4") (textsleep) (message "escape5") (textsleep) (color 'red) (line 'fractal -3 0 -3 0) (morphlastline 'fractal -3 0 2 0) (usleep 1000000) (color 'white) (usleep 1000000) (message "escape6") (textsleep) (color 'red) (line 'fractal 0 -2 0 -2) (morphlastline 'fractal 0 -2 0 2) (usleep 1000000) (color 'white) (text "") (usleep 1000000) (display) (message "escape7") (textsleep) (message "escape8") (textsleep) (display) (usleep 1000000) (message "escape9") (textsleep) (message "orbit1") (textsleep) (message "orbit2") (line 'fractal -0.03 -0.63 0.03 -0.57) (line 'fractal 0.03 -0.63 -0.03 -0.57) (textsleep) (message "orbit3") (textsleep) (message "orbit3b") (textsleep) (line 'fractal 0.000 -0.600 0.000 -1.200) (text "z=z^2+c z=0, c=0-0.6i z=(0+0i)^2-0.6i=-0.6i") (textsleep) (usleep 2000000) (line 'fractal 0.000 -1.200 -0.360 -1.200) (text "z=z^2+c z=0-0.6i, c=0-0.6i z=(0-0.6i)^2-0.6i=-0.36-0.6i") (textsleep) (usleep 1000000) (line 'fractal -0.360 -1.200 -0.230 -0.768) (text "z=z^2+c z=-0.36-0.6i, c=0-0.6i z=(-0.36-0.6i)^2-0.6i=-0.23-0.16i") (textsleep) (usleep 1000000) (line 'fractal -0.230 -0.768 0.025 -1.123) (message "orbit4") (textsleep) (usleep 100000) (line 'fractal 0.025 -1.123 -0.272 -1.226) (usleep 100000) (line 'fractal -0.272 -1.226 -0.318 -0.859) (usleep 100000) (line 'fractal -0.318 -0.859 0.034 -1.036) (usleep 100000) (line 'fractal 0.034 -1.036 -0.189 -1.230) (usleep 100000) (line 'fractal -0.189 -1.230 -0.361 -0.963) (usleep 100000) (line 'fractal -0.361 -0.963 -0.001 -0.938) (usleep 100000) (line 'fractal -0.001 -0.938 -0.115 -1.199) (usleep 100000) (line 'fractal -0.115 -1.199 -0.346 -1.063) (usleep 100000) (line 'fractal -0.346 -1.063 -0.095 -0.880) (usleep 100000) (line 'fractal -0.095 -0.880 -0.069 -1.147) (usleep 100000) (line 'fractal -0.069 -1.147 -0.294 -1.124) (usleep 100000) (line 'fractal -0.294 -1.124 -0.188 -0.891) (usleep 100000) (line 'fractal -0.188 -0.891 -0.050 -1.090) (usleep 100000) (line 'fractal -0.050 -1.090 -0.238 -1.151) (usleep 100000) (line 'fractal -0.238 -1.151 -0.247 -0.937) (usleep 100000) (line 'fractal -0.247 -0.937 -0.053 -1.033) (usleep 100000) (line 'fractal -0.053 -1.033 -0.185 -1.154) (usleep 100000) (line 'fractal -0.185 -1.154 -0.273 -0.995) (usleep 100000) (line 'fractal -0.273 -0.995 -0.082 -0.984) (usleep 100000) (line 'fractal -0.082 -0.984 -0.141 -1.137) (usleep 100000) (line 'fractal -0.141 -1.137 -0.269 -1.049) (usleep 100000) (line 'fractal -0.269 -1.049 -0.129 -0.959) (usleep 100000) (line 'fractal -0.129 -0.959 -0.112 -1.108) (usleep 100000) (line 'fractal -0.112 -1.108 -0.245 -1.086) (usleep 100000) (line 'fractal -0.245 -1.086 -0.176 -0.962) (usleep 100000) (line 'fractal -0.176 -0.962 -0.100 -1.072) (usleep 100000) (line 'fractal -0.100 -1.072 -0.213 -1.106) (usleep 100000) (line 'fractal -0.213 -1.106 -0.210 -0.984) (usleep 100000) (line 'fractal -0.210 -0.984 -0.103 -1.038) (usleep 100000) (line 'fractal -0.103 -1.038 -0.181 -1.109) (usleep 100000) (line 'fractal -0.181 -1.109 -0.226 -1.015) (usleep 100000) (line 'fractal -0.226 -1.015 -0.121 -1.012) (usleep 100000) (line 'fractal -0.121 -1.012 -0.155 -1.100) (usleep 100000) (line 'fractal -0.155 -1.100 -0.226 -1.045) (usleep 100000) (line 'fractal -0.226 -1.045 -0.147 -0.999) (usleep 100000) (line 'fractal -0.147 -0.999 -0.137 -1.083) (usleep 100000) (line 'fractal -0.137 -1.083 -0.214 -1.067) (usleep 100000) (line 'fractal -0.214 -1.067 -0.172 -1.000) (usleep 100000) (line 'fractal -0.172 -1.000 -0.130 -1.062) (usleep 100000) (line 'fractal -0.130 -1.062 -0.197 -1.080) (usleep 100000) (line 'fractal -0.197 -1.080 -0.191 -1.011) (usleep 100000) (line 'fractal -0.191 -1.011 -0.132 -1.043) (usleep 100000) (line 'fractal -0.132 -1.043 -0.178 -1.083) (usleep 100000) (line 'fractal -0.178 -1.083 -0.201 -1.028) (usleep 100000) (line 'fractal -0.201 -1.028 -0.143 -1.028) (usleep 100000) (line 'fractal -0.143 -1.028 -0.163 -1.078) (usleep 100000) (message "orbit5") (textsleep) (message "orbit6") (textsleep) (message "orbit7") (textsleep) (message "orbit8") (textsleep) (message "orbit9") (textsleep) (display) (usleep 1000000) (message "bail1") (textsleep) (message "bail2") (textsleep) (message "bail3") (textsleep) (message "bail4") (textsleep) (message "bail5") (textsleep) (message "bail6") (textsleep) (message "bail7") (textsleep) (display) (usleep 1000000) (message "iter1") (textsleep) (message "iter2") (textsleep) (message "iter3") (textsleep) (palette 1 156627207 0) (view 0 0 4 4) (color 'black) (maxiter 0) (message "iter4") (textsleep) (message "iter5") (textsleep) (maxiter 1) (usleep 100000) (maxiter 2) (usleep 100000) (maxiter 3) (usleep 100000) (maxiter 4) (usleep 100000) (maxiter 5) (usleep 100000) (maxiter 8) (usleep 100000) (maxiter 12) (usleep 100000) (maxiter 18) (usleep 100000) (maxiter 30) (usleep 100000) (maxiter 170) (usleep 1000000) (initstate) (textposition 'center 'bottom) (message "limit1") (textsleep) (message "limit2") (textsleep) (morphview -1.9999999999999676 1.2552775948625695E-14 1.5237388174133004E-13 1.5237582502655772E-13) (usleep 10000000) (wait) (initstate) (textposition 'center 'bottom) (message "limit3") (textsleep) (morphview -1.26634765 -0.0442400569 1.68040637E-05 1.68040637E-05) (usleep 5000000) (message "limit4") (textsleep) (wait) (message "limit5") (maxiter 400) (textsleep) (initstate) (clearscreen) (message "ofracts1") (textsleep) (message "ofracts2") (textsleep) XaoS-release-4.3.2/tutorial/features.xaf000066400000000000000000000002631455214672000202000ustar00rootroot00000000000000(load "outcolor.xaf") (load "incolor.xaf") (load "truecol.xaf") (load "filter.xaf") (load "plane.xaf") (load "anim.xaf") (load "pert.xaf") (load "palette.xaf") (load "other.xaf") XaoS-release-4.3.2/tutorial/filter.xaf000066400000000000000000000003201455214672000176410ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (message "filter") (usleep 4000000) (load "filter.xhf") XaoS-release-4.3.2/tutorial/filter.xhf000066400000000000000000000062361455214672000176640ustar00rootroot00000000000000(clearscreen) (message "filter1") (textsleep) (clearscreen) (message "filter2") (textsleep) (maxiter 170) (defaultpalette 0) (formula 'mandel) (filter 'blur #t) (wait) (message "motblur") (textsleep) (display) (morphview 0.317788886723 -0.0325911744001 2.54218525225E-08 2.54218525226E-08) (usleep 15000000) (filter 'blur #f) (clearscreen) (message "edge") (textsleep) (clearscreen) (message "edge2") (textsleep) (filter 'edge #t) (formula 'newton) (view 0 0 2.5 2.5) (display) (usleep 3000000) (filter 'edge #f) (filter 'edge2 #t) (display) (message "edge3") (textsleep) (display) (palette 1 1134442210 0) (formula 'phoenix) (juliaseed 0.29505813953488373993 0) (angle -270) (outcoloring 8) (plane 0) (view 0.54252 0.0036861 0.519 0.519) (usleep 3000000) (palette 1 2134834367 0) (formula 'mandel) (angle 89.9) (plane 6) (view -2.041 0.02202 5.6 5.6) (usleep 3000000) (palette 1 1217907078 0) (formula 'barnsley) (juliaseed 1.096607601828901654 0.0041731272555902670893) (outcoloring 1) (plane 3) (view 0.8508 0.001555 3.978 3.978) (usleep 4000000) (defaultpalette 0) (filter 'edge2 #f) (filter 'starfield #t) (formula 'mandel) (outcoloring 0) (incoloring 0) (plane 0) (view 0.3115022 -0.027162 0.001338865 0.001338865) (message "star") (textsleep) (filter 'starfield #f) (filter 'interlace #t) (formula 'mandel) (clearscreen) (message "interlace") (textsleep) (display) (morphview -1.929321701117092285 -2.414219978211539841E-07 1.543578632967612663E-15 1.543564574490265047E-15) (usleep 15000000) (clearscreen) (message "stereo") (textsleep) (message "stereo2") (textsleep) (display) (defaultpalette 0) (filter 'edge #f) (filter 'edge2 #f) (filter 'starfield #f) (filter 'stereogram #t) (filter 'interlace #f) (filter 'blur #f) (formula 'phoenix) (plane 0) (view 0.199087 -0.562119 0.0343251 0.0343251) (usleep 6000000) (defaultpalette 0) (formula 'mandel) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 0) (view -1.76739 -0.00103757 0.0374694 0.0374694) (usleep 6000000) (defaultpalette 0) (formula 'mandel) (plane 0) (view -0.8399398 0.2245206 0.005903873 0.005903873) (usleep 6000000) (formula 'mandel) (usleep 1000000) (morphview -0.020414 -0.83211 0.10564 0.10564) (usleep 10000000) (wait) (usleep 1000000) (filter 'stereogram #f) (wait) (usleep 1000000) (initstate) (clearscreen) (message "emboss1") (textsleep) (display) (filter 'emboss #t) (formula 'mandel) (outcoloring 9) (view -1.2419331 0.32407933 0.00053065715 0.00053065715) (usleep 2000000) (formula 'phoenix) (julia #f) (view 0.21077 0.67294 0.10309 0.10309) (usleep 2000000) (formula 'octo) (angle -269.59) (outcoloring 8) (plane 6) (view 0.756 -0.629 12 12) (usleep 2000000) (formula 'mandel5) (maxiter 1) (outcoloring 8) (incoloring 2) (plane 1) (view -0.0125 -0.03543 2.617 2.617) (usleep 2000000) (formula 'magnet) (angle -89.02) (maxiter 3) (outcoloring 8) (incoloring 2) (plane 1) (view 0.7352 0.003314 1.118 1.64) (usleep 2000000) (formula 'barnsley) (juliaseed -0.023569826835954252408 -0) (maxiter 2) (outcoloring 8) (incoloring 3) (plane 5) (view -1.158 -1.071 1.341 1.341) (usleep 2000000) (clearscreen) (message "palettef1") (filter 'emboss #f) (textsleep) (clearscreen) (message "truecolorf") (textsleep) (initstate) XaoS-release-4.3.2/tutorial/flake1.xhf000066400000000000000000000005341455214672000175350ustar00rootroot00000000000000(line 'scaled 0.050 0.500 0.350 0.500) (morphlastline 'scaled 0.050 0.500 0.350 0.500) (line 'scaled 0.350 0.500 0.500 0.500) (morphlastline 'scaled 0.350 0.500 0.500 0.240) (line 'scaled 0.500 0.500 0.650 0.500) (morphlastline 'scaled 0.500 0.240 0.650 0.500) (line 'scaled 0.650 0.500 0.950 0.500) (morphlastline 'scaled 0.650 0.500 0.950 0.500) XaoS-release-4.3.2/tutorial/flake2.xhf000066400000000000000000000025601455214672000175370ustar00rootroot00000000000000(line 'scaled 0.050 0.500 0.150 0.500) (morphlastline 'scaled 0.050 0.500 0.150 0.500) (line 'scaled 0.150 0.500 0.200 0.500) (morphlastline 'scaled 0.150 0.500 0.200 0.413) (line 'scaled 0.200 0.500 0.250 0.500) (morphlastline 'scaled 0.200 0.413 0.250 0.500) (line 'scaled 0.250 0.500 0.350 0.500) (morphlastline 'scaled 0.250 0.500 0.350 0.500) (line 'scaled 0.350 0.500 0.400 0.413) (morphlastline 'scaled 0.350 0.500 0.400 0.413) (line 'scaled 0.400 0.413 0.425 0.370) (morphlastline 'scaled 0.400 0.413 0.350 0.327) (line 'scaled 0.425 0.370 0.450 0.327) (morphlastline 'scaled 0.350 0.327 0.450 0.327) (line 'scaled 0.450 0.327 0.500 0.240) (morphlastline 'scaled 0.450 0.327 0.500 0.240) (line 'scaled 0.500 0.240 0.550 0.327) (morphlastline 'scaled 0.500 0.240 0.550 0.327) (line 'scaled 0.550 0.327 0.575 0.370) (morphlastline 'scaled 0.550 0.327 0.650 0.327) (line 'scaled 0.575 0.370 0.600 0.413) (morphlastline 'scaled 0.650 0.327 0.600 0.413) (line 'scaled 0.600 0.413 0.650 0.500) (morphlastline 'scaled 0.600 0.413 0.650 0.500) (line 'scaled 0.650 0.500 0.750 0.500) (morphlastline 'scaled 0.650 0.500 0.750 0.500) (line 'scaled 0.750 0.500 0.800 0.500) (morphlastline 'scaled 0.750 0.500 0.800 0.413) (line 'scaled 0.800 0.500 0.850 0.500) (morphlastline 'scaled 0.800 0.413 0.850 0.500) (line 'scaled 0.850 0.500 0.950 0.500) (morphlastline 'scaled 0.850 0.500 0.950 0.500) XaoS-release-4.3.2/tutorial/flake3.xhf000066400000000000000000000127011455214672000175360ustar00rootroot00000000000000 (line 'scaled 0.050 0.500 0.083 0.500) (morphlastline 'scaled 0.050 0.500 0.083 0.500) (line 'scaled 0.083 0.500 0.100 0.500) (morphlastline 'scaled 0.083 0.500 0.100 0.471) (line 'scaled 0.100 0.500 0.117 0.500) (morphlastline 'scaled 0.100 0.471 0.117 0.500) (line 'scaled 0.117 0.500 0.150 0.500) (morphlastline 'scaled 0.117 0.500 0.150 0.500) (line 'scaled 0.150 0.500 0.167 0.471) (morphlastline 'scaled 0.150 0.500 0.167 0.471) (line 'scaled 0.167 0.471 0.175 0.457) (morphlastline 'scaled 0.167 0.471 0.150 0.442) (line 'scaled 0.175 0.457 0.183 0.442) (morphlastline 'scaled 0.150 0.442 0.183 0.442) (line 'scaled 0.183 0.442 0.200 0.413) (morphlastline 'scaled 0.183 0.442 0.200 0.413) (line 'scaled 0.200 0.413 0.217 0.442) (morphlastline 'scaled 0.200 0.413 0.217 0.442) (line 'scaled 0.217 0.442 0.225 0.457) (morphlastline 'scaled 0.217 0.442 0.250 0.442) (line 'scaled 0.225 0.457 0.233 0.471) (morphlastline 'scaled 0.250 0.442 0.233 0.471) (line 'scaled 0.233 0.471 0.250 0.500) (morphlastline 'scaled 0.233 0.471 0.250 0.500) (line 'scaled 0.250 0.500 0.283 0.500) (morphlastline 'scaled 0.250 0.500 0.283 0.500) (line 'scaled 0.283 0.500 0.300 0.500) (morphlastline 'scaled 0.283 0.500 0.300 0.471) (line 'scaled 0.300 0.500 0.317 0.500) (morphlastline 'scaled 0.300 0.471 0.317 0.500) (line 'scaled 0.317 0.500 0.350 0.500) (morphlastline 'scaled 0.317 0.500 0.350 0.500) (line 'scaled 0.350 0.500 0.367 0.471) (morphlastline 'scaled 0.350 0.500 0.367 0.471) (line 'scaled 0.367 0.471 0.375 0.457) (morphlastline 'scaled 0.367 0.471 0.350 0.442) (line 'scaled 0.375 0.457 0.383 0.442) (morphlastline 'scaled 0.350 0.442 0.383 0.442) (line 'scaled 0.383 0.442 0.400 0.413) (morphlastline 'scaled 0.383 0.442 0.400 0.413) (line 'scaled 0.400 0.413 0.383 0.385) (morphlastline 'scaled 0.400 0.413 0.383 0.385) (line 'scaled 0.383 0.385 0.375 0.370) (morphlastline 'scaled 0.383 0.385 0.350 0.385) (line 'scaled 0.375 0.370 0.367 0.356) (morphlastline 'scaled 0.350 0.385 0.367 0.356) (line 'scaled 0.367 0.356 0.350 0.327) (morphlastline 'scaled 0.367 0.356 0.350 0.327) (line 'scaled 0.350 0.327 0.383 0.327) (morphlastline 'scaled 0.350 0.327 0.383 0.327) (line 'scaled 0.383 0.327 0.400 0.327) (morphlastline 'scaled 0.383 0.327 0.400 0.298) (line 'scaled 0.400 0.327 0.417 0.327) (morphlastline 'scaled 0.400 0.298 0.417 0.327) (line 'scaled 0.417 0.327 0.450 0.327) (morphlastline 'scaled 0.417 0.327 0.450 0.327) (line 'scaled 0.450 0.327 0.467 0.298) (morphlastline 'scaled 0.450 0.327 0.467 0.298) (line 'scaled 0.467 0.298 0.475 0.283) (morphlastline 'scaled 0.467 0.298 0.450 0.269) (line 'scaled 0.475 0.283 0.483 0.269) (morphlastline 'scaled 0.450 0.269 0.483 0.269) (line 'scaled 0.483 0.269 0.500 0.240) (morphlastline 'scaled 0.483 0.269 0.500 0.240) (line 'scaled 0.500 0.240 0.517 0.269) (morphlastline 'scaled 0.500 0.240 0.517 0.269) (line 'scaled 0.517 0.269 0.525 0.283) (morphlastline 'scaled 0.517 0.269 0.550 0.269) (line 'scaled 0.525 0.283 0.533 0.298) (morphlastline 'scaled 0.550 0.269 0.533 0.298) (line 'scaled 0.533 0.298 0.550 0.327) (morphlastline 'scaled 0.533 0.298 0.550 0.327) (line 'scaled 0.550 0.327 0.583 0.327) (morphlastline 'scaled 0.550 0.327 0.583 0.327) (line 'scaled 0.583 0.327 0.600 0.327) (morphlastline 'scaled 0.583 0.327 0.600 0.298) (line 'scaled 0.600 0.327 0.617 0.327) (morphlastline 'scaled 0.600 0.298 0.617 0.327) (line 'scaled 0.617 0.327 0.650 0.327) (morphlastline 'scaled 0.617 0.327 0.650 0.327) (line 'scaled 0.650 0.327 0.633 0.356) (morphlastline 'scaled 0.650 0.327 0.633 0.356) (line 'scaled 0.633 0.356 0.625 0.370) (morphlastline 'scaled 0.633 0.356 0.650 0.385) (line 'scaled 0.625 0.370 0.617 0.385) (morphlastline 'scaled 0.650 0.385 0.617 0.385) (line 'scaled 0.617 0.385 0.600 0.413) (morphlastline 'scaled 0.617 0.385 0.600 0.413) (line 'scaled 0.600 0.413 0.617 0.442) (morphlastline 'scaled 0.600 0.413 0.617 0.442) (line 'scaled 0.617 0.442 0.625 0.457) (morphlastline 'scaled 0.617 0.442 0.650 0.442) (line 'scaled 0.625 0.457 0.633 0.471) (morphlastline 'scaled 0.650 0.442 0.633 0.471) (line 'scaled 0.633 0.471 0.650 0.500) (morphlastline 'scaled 0.633 0.471 0.650 0.500) (line 'scaled 0.650 0.500 0.683 0.500) (morphlastline 'scaled 0.650 0.500 0.683 0.500) (line 'scaled 0.683 0.500 0.700 0.500) (morphlastline 'scaled 0.683 0.500 0.700 0.471) (line 'scaled 0.700 0.500 0.717 0.500) (morphlastline 'scaled 0.700 0.471 0.717 0.500) (line 'scaled 0.717 0.500 0.750 0.500) (morphlastline 'scaled 0.717 0.500 0.750 0.500) (line 'scaled 0.750 0.500 0.767 0.471) (morphlastline 'scaled 0.750 0.500 0.767 0.471) (line 'scaled 0.767 0.471 0.775 0.457) (morphlastline 'scaled 0.767 0.471 0.750 0.442) (line 'scaled 0.775 0.457 0.783 0.442) (morphlastline 'scaled 0.750 0.442 0.783 0.442) (line 'scaled 0.783 0.442 0.800 0.413) (morphlastline 'scaled 0.783 0.442 0.800 0.413) (line 'scaled 0.800 0.413 0.817 0.442) (morphlastline 'scaled 0.800 0.413 0.817 0.442) (line 'scaled 0.817 0.442 0.825 0.457) (morphlastline 'scaled 0.817 0.442 0.850 0.442) (line 'scaled 0.825 0.457 0.833 0.471) (morphlastline 'scaled 0.850 0.442 0.833 0.471) (line 'scaled 0.833 0.471 0.850 0.500) (morphlastline 'scaled 0.833 0.471 0.850 0.500) (line 'scaled 0.850 0.500 0.883 0.500) (morphlastline 'scaled 0.850 0.500 0.883 0.500) (line 'scaled 0.883 0.500 0.900 0.500) (morphlastline 'scaled 0.883 0.500 0.900 0.471) (line 'scaled 0.900 0.500 0.917 0.500) (morphlastline 'scaled 0.900 0.471 0.917 0.500) (line 'scaled 0.917 0.500 0.950 0.500) (morphlastline 'scaled 0.917 0.500 0.950 0.500) XaoS-release-4.3.2/tutorial/flake4.xhf000066400000000000000000000534011455214672000175410ustar00rootroot00000000000000 (line 'scaled 0.050 0.500 0.061 0.500) (morphlastline 'scaled 0.050 0.500 0.061 0.500) (line 'scaled 0.061 0.500 0.067 0.500) (morphlastline 'scaled 0.061 0.500 0.067 0.490) (line 'scaled 0.067 0.500 0.072 0.500) (morphlastline 'scaled 0.067 0.490 0.072 0.500) (line 'scaled 0.072 0.500 0.083 0.500) (morphlastline 'scaled 0.072 0.500 0.083 0.500) (line 'scaled 0.083 0.500 0.089 0.490) (morphlastline 'scaled 0.083 0.500 0.089 0.490) (line 'scaled 0.089 0.490 0.092 0.486) (morphlastline 'scaled 0.089 0.490 0.083 0.481) (line 'scaled 0.092 0.486 0.094 0.481) (morphlastline 'scaled 0.083 0.481 0.094 0.481) (line 'scaled 0.094 0.481 0.100 0.471) (morphlastline 'scaled 0.094 0.481 0.100 0.471) (line 'scaled 0.100 0.471 0.106 0.481) (morphlastline 'scaled 0.100 0.471 0.106 0.481) (line 'scaled 0.106 0.481 0.108 0.486) (morphlastline 'scaled 0.106 0.481 0.117 0.481) (line 'scaled 0.108 0.486 0.111 0.490) (morphlastline 'scaled 0.117 0.481 0.111 0.490) (line 'scaled 0.111 0.490 0.117 0.500) (morphlastline 'scaled 0.111 0.490 0.117 0.500) (line 'scaled 0.117 0.500 0.128 0.500) (morphlastline 'scaled 0.117 0.500 0.128 0.500) (line 'scaled 0.128 0.500 0.133 0.500) (morphlastline 'scaled 0.128 0.500 0.133 0.490) (line 'scaled 0.133 0.500 0.139 0.500) (morphlastline 'scaled 0.133 0.490 0.139 0.500) (line 'scaled 0.139 0.500 0.150 0.500) (morphlastline 'scaled 0.139 0.500 0.150 0.500) (line 'scaled 0.150 0.500 0.156 0.490) (morphlastline 'scaled 0.150 0.500 0.156 0.490) (line 'scaled 0.156 0.490 0.158 0.486) (morphlastline 'scaled 0.156 0.490 0.150 0.481) (line 'scaled 0.158 0.486 0.161 0.481) (morphlastline 'scaled 0.150 0.481 0.161 0.481) (line 'scaled 0.161 0.481 0.167 0.471) (morphlastline 'scaled 0.161 0.481 0.167 0.471) (line 'scaled 0.167 0.471 0.161 0.462) (morphlastline 'scaled 0.167 0.471 0.161 0.462) (line 'scaled 0.161 0.462 0.158 0.457) (morphlastline 'scaled 0.161 0.462 0.150 0.462) (line 'scaled 0.158 0.457 0.156 0.452) (morphlastline 'scaled 0.150 0.462 0.156 0.452) (line 'scaled 0.156 0.452 0.150 0.442) (morphlastline 'scaled 0.156 0.452 0.150 0.442) (line 'scaled 0.150 0.442 0.161 0.442) (morphlastline 'scaled 0.150 0.442 0.161 0.442) (line 'scaled 0.161 0.442 0.167 0.442) (morphlastline 'scaled 0.161 0.442 0.167 0.433) (line 'scaled 0.167 0.442 0.172 0.442) (morphlastline 'scaled 0.167 0.433 0.172 0.442) (line 'scaled 0.172 0.442 0.183 0.442) (morphlastline 'scaled 0.172 0.442 0.183 0.442) (line 'scaled 0.183 0.442 0.189 0.433) (morphlastline 'scaled 0.183 0.442 0.189 0.433) (line 'scaled 0.189 0.433 0.192 0.428) (morphlastline 'scaled 0.189 0.433 0.183 0.423) (line 'scaled 0.192 0.428 0.194 0.423) (morphlastline 'scaled 0.183 0.423 0.194 0.423) (line 'scaled 0.194 0.423 0.200 0.413) (morphlastline 'scaled 0.194 0.423 0.200 0.413) (line 'scaled 0.200 0.413 0.206 0.423) (morphlastline 'scaled 0.200 0.413 0.206 0.423) (line 'scaled 0.206 0.423 0.208 0.428) (morphlastline 'scaled 0.206 0.423 0.217 0.423) (line 'scaled 0.208 0.428 0.211 0.433) (morphlastline 'scaled 0.217 0.423 0.211 0.433) (line 'scaled 0.211 0.433 0.217 0.442) (morphlastline 'scaled 0.211 0.433 0.217 0.442) (line 'scaled 0.217 0.442 0.228 0.442) (morphlastline 'scaled 0.217 0.442 0.228 0.442) (line 'scaled 0.228 0.442 0.233 0.442) (morphlastline 'scaled 0.228 0.442 0.233 0.433) (line 'scaled 0.233 0.442 0.239 0.442) (morphlastline 'scaled 0.233 0.433 0.239 0.442) (line 'scaled 0.239 0.442 0.250 0.442) (morphlastline 'scaled 0.239 0.442 0.250 0.442) (line 'scaled 0.250 0.442 0.244 0.452) (morphlastline 'scaled 0.250 0.442 0.244 0.452) (line 'scaled 0.244 0.452 0.242 0.457) (morphlastline 'scaled 0.244 0.452 0.250 0.462) (line 'scaled 0.242 0.457 0.239 0.462) (morphlastline 'scaled 0.250 0.462 0.239 0.462) (line 'scaled 0.239 0.462 0.233 0.471) (morphlastline 'scaled 0.239 0.462 0.233 0.471) (line 'scaled 0.233 0.471 0.239 0.481) (morphlastline 'scaled 0.233 0.471 0.239 0.481) (line 'scaled 0.239 0.481 0.242 0.486) (morphlastline 'scaled 0.239 0.481 0.250 0.481) (line 'scaled 0.242 0.486 0.244 0.490) (morphlastline 'scaled 0.250 0.481 0.244 0.490) (line 'scaled 0.244 0.490 0.250 0.500) (morphlastline 'scaled 0.244 0.490 0.250 0.500) (line 'scaled 0.250 0.500 0.261 0.500) (morphlastline 'scaled 0.250 0.500 0.261 0.500) (line 'scaled 0.261 0.500 0.267 0.500) (morphlastline 'scaled 0.261 0.500 0.267 0.490) (line 'scaled 0.267 0.500 0.272 0.500) (morphlastline 'scaled 0.267 0.490 0.272 0.500) (line 'scaled 0.272 0.500 0.283 0.500) (morphlastline 'scaled 0.272 0.500 0.283 0.500) (line 'scaled 0.283 0.500 0.289 0.490) (morphlastline 'scaled 0.283 0.500 0.289 0.490) (line 'scaled 0.289 0.490 0.292 0.486) (morphlastline 'scaled 0.289 0.490 0.283 0.481) (line 'scaled 0.292 0.486 0.294 0.481) (morphlastline 'scaled 0.283 0.481 0.294 0.481) (line 'scaled 0.294 0.481 0.300 0.471) (morphlastline 'scaled 0.294 0.481 0.300 0.471) (line 'scaled 0.300 0.471 0.306 0.481) (morphlastline 'scaled 0.300 0.471 0.306 0.481) (line 'scaled 0.306 0.481 0.308 0.486) (morphlastline 'scaled 0.306 0.481 0.317 0.481) (line 'scaled 0.308 0.486 0.311 0.490) (morphlastline 'scaled 0.317 0.481 0.311 0.490) (line 'scaled 0.311 0.490 0.317 0.500) (morphlastline 'scaled 0.311 0.490 0.317 0.500) (line 'scaled 0.317 0.500 0.328 0.500) (morphlastline 'scaled 0.317 0.500 0.328 0.500) (line 'scaled 0.328 0.500 0.333 0.500) (morphlastline 'scaled 0.328 0.500 0.333 0.490) (line 'scaled 0.333 0.500 0.339 0.500) (morphlastline 'scaled 0.333 0.490 0.339 0.500) (line 'scaled 0.339 0.500 0.350 0.500) (morphlastline 'scaled 0.339 0.500 0.350 0.500) (line 'scaled 0.350 0.500 0.356 0.490) (morphlastline 'scaled 0.350 0.500 0.356 0.490) (line 'scaled 0.356 0.490 0.358 0.486) (morphlastline 'scaled 0.356 0.490 0.350 0.481) (line 'scaled 0.358 0.486 0.361 0.481) (morphlastline 'scaled 0.350 0.481 0.361 0.481) (line 'scaled 0.361 0.481 0.367 0.471) (morphlastline 'scaled 0.361 0.481 0.367 0.471) (line 'scaled 0.367 0.471 0.361 0.462) (morphlastline 'scaled 0.367 0.471 0.361 0.462) (line 'scaled 0.361 0.462 0.358 0.457) (morphlastline 'scaled 0.361 0.462 0.350 0.462) (line 'scaled 0.358 0.457 0.356 0.452) (morphlastline 'scaled 0.350 0.462 0.356 0.452) (line 'scaled 0.356 0.452 0.350 0.442) (morphlastline 'scaled 0.356 0.452 0.350 0.442) (line 'scaled 0.350 0.442 0.361 0.442) (morphlastline 'scaled 0.350 0.442 0.361 0.442) (line 'scaled 0.361 0.442 0.367 0.442) (morphlastline 'scaled 0.361 0.442 0.367 0.433) (line 'scaled 0.367 0.442 0.372 0.442) (morphlastline 'scaled 0.367 0.433 0.372 0.442) (line 'scaled 0.372 0.442 0.383 0.442) (morphlastline 'scaled 0.372 0.442 0.383 0.442) (line 'scaled 0.383 0.442 0.389 0.433) (morphlastline 'scaled 0.383 0.442 0.389 0.433) (line 'scaled 0.389 0.433 0.392 0.428) (morphlastline 'scaled 0.389 0.433 0.383 0.423) (line 'scaled 0.392 0.428 0.394 0.423) (morphlastline 'scaled 0.383 0.423 0.394 0.423) (line 'scaled 0.394 0.423 0.400 0.413) (morphlastline 'scaled 0.394 0.423 0.400 0.413) (line 'scaled 0.400 0.413 0.394 0.404) (morphlastline 'scaled 0.400 0.413 0.394 0.404) (line 'scaled 0.394 0.404 0.392 0.399) (morphlastline 'scaled 0.394 0.404 0.383 0.404) (line 'scaled 0.392 0.399 0.389 0.394) (morphlastline 'scaled 0.383 0.404 0.389 0.394) (line 'scaled 0.389 0.394 0.383 0.385) (morphlastline 'scaled 0.389 0.394 0.383 0.385) (line 'scaled 0.383 0.385 0.372 0.385) (morphlastline 'scaled 0.383 0.385 0.372 0.385) (line 'scaled 0.372 0.385 0.367 0.385) (morphlastline 'scaled 0.372 0.385 0.367 0.394) (line 'scaled 0.367 0.385 0.361 0.385) (morphlastline 'scaled 0.367 0.394 0.361 0.385) (line 'scaled 0.361 0.385 0.350 0.385) (morphlastline 'scaled 0.361 0.385 0.350 0.385) (line 'scaled 0.350 0.385 0.356 0.375) (morphlastline 'scaled 0.350 0.385 0.356 0.375) (line 'scaled 0.356 0.375 0.358 0.370) (morphlastline 'scaled 0.356 0.375 0.350 0.365) (line 'scaled 0.358 0.370 0.361 0.365) (morphlastline 'scaled 0.350 0.365 0.361 0.365) (line 'scaled 0.361 0.365 0.367 0.356) (morphlastline 'scaled 0.361 0.365 0.367 0.356) (line 'scaled 0.367 0.356 0.361 0.346) (morphlastline 'scaled 0.367 0.356 0.361 0.346) (line 'scaled 0.361 0.346 0.358 0.341) (morphlastline 'scaled 0.361 0.346 0.350 0.346) (line 'scaled 0.358 0.341 0.356 0.336) (morphlastline 'scaled 0.350 0.346 0.356 0.336) (line 'scaled 0.356 0.336 0.350 0.327) (morphlastline 'scaled 0.356 0.336 0.350 0.327) (line 'scaled 0.350 0.327 0.361 0.327) (morphlastline 'scaled 0.350 0.327 0.361 0.327) (line 'scaled 0.361 0.327 0.367 0.327) (morphlastline 'scaled 0.361 0.327 0.367 0.317) (line 'scaled 0.367 0.327 0.372 0.327) (morphlastline 'scaled 0.367 0.317 0.372 0.327) (line 'scaled 0.372 0.327 0.383 0.327) (morphlastline 'scaled 0.372 0.327 0.383 0.327) (line 'scaled 0.383 0.327 0.389 0.317) (morphlastline 'scaled 0.383 0.327 0.389 0.317) (line 'scaled 0.389 0.317 0.392 0.312) (morphlastline 'scaled 0.389 0.317 0.383 0.308) (line 'scaled 0.392 0.312 0.394 0.308) (morphlastline 'scaled 0.383 0.308 0.394 0.308) (line 'scaled 0.394 0.308 0.400 0.298) (morphlastline 'scaled 0.394 0.308 0.400 0.298) (line 'scaled 0.400 0.298 0.406 0.308) (morphlastline 'scaled 0.400 0.298 0.406 0.308) (line 'scaled 0.406 0.308 0.408 0.312) (morphlastline 'scaled 0.406 0.308 0.417 0.308) (line 'scaled 0.408 0.312 0.411 0.317) (morphlastline 'scaled 0.417 0.308 0.411 0.317) (line 'scaled 0.411 0.317 0.417 0.327) (morphlastline 'scaled 0.411 0.317 0.417 0.327) (line 'scaled 0.417 0.327 0.428 0.327) (morphlastline 'scaled 0.417 0.327 0.428 0.327) (line 'scaled 0.428 0.327 0.433 0.327) (morphlastline 'scaled 0.428 0.327 0.433 0.317) (line 'scaled 0.433 0.327 0.439 0.327) (morphlastline 'scaled 0.433 0.317 0.439 0.327) (line 'scaled 0.439 0.327 0.450 0.327) (morphlastline 'scaled 0.439 0.327 0.450 0.327) (line 'scaled 0.450 0.327 0.456 0.317) (morphlastline 'scaled 0.450 0.327 0.456 0.317) (line 'scaled 0.456 0.317 0.458 0.312) (morphlastline 'scaled 0.456 0.317 0.450 0.308) (line 'scaled 0.458 0.312 0.461 0.308) (morphlastline 'scaled 0.450 0.308 0.461 0.308) (line 'scaled 0.461 0.308 0.467 0.298) (morphlastline 'scaled 0.461 0.308 0.467 0.298) (line 'scaled 0.467 0.298 0.461 0.288) (morphlastline 'scaled 0.467 0.298 0.461 0.288) (line 'scaled 0.461 0.288 0.458 0.283) (morphlastline 'scaled 0.461 0.288 0.450 0.288) (line 'scaled 0.458 0.283 0.456 0.279) (morphlastline 'scaled 0.450 0.288 0.456 0.279) (line 'scaled 0.456 0.279 0.450 0.269) (morphlastline 'scaled 0.456 0.279 0.450 0.269) (line 'scaled 0.450 0.269 0.461 0.269) (morphlastline 'scaled 0.450 0.269 0.461 0.269) (line 'scaled 0.461 0.269 0.467 0.269) (morphlastline 'scaled 0.461 0.269 0.467 0.259) (line 'scaled 0.467 0.269 0.472 0.269) (morphlastline 'scaled 0.467 0.259 0.472 0.269) (line 'scaled 0.472 0.269 0.483 0.269) (morphlastline 'scaled 0.472 0.269 0.483 0.269) (line 'scaled 0.483 0.269 0.489 0.259) (morphlastline 'scaled 0.483 0.269 0.489 0.259) (line 'scaled 0.489 0.259 0.492 0.255) (morphlastline 'scaled 0.489 0.259 0.483 0.250) (line 'scaled 0.492 0.255 0.494 0.250) (morphlastline 'scaled 0.483 0.250 0.494 0.250) (line 'scaled 0.494 0.250 0.500 0.240) (morphlastline 'scaled 0.494 0.250 0.500 0.240) (line 'scaled 0.500 0.240 0.506 0.250) (morphlastline 'scaled 0.500 0.240 0.506 0.250) (line 'scaled 0.506 0.250 0.508 0.255) (morphlastline 'scaled 0.506 0.250 0.517 0.250) (line 'scaled 0.508 0.255 0.511 0.259) (morphlastline 'scaled 0.517 0.250 0.511 0.259) (line 'scaled 0.511 0.259 0.517 0.269) (morphlastline 'scaled 0.511 0.259 0.517 0.269) (line 'scaled 0.517 0.269 0.528 0.269) (morphlastline 'scaled 0.517 0.269 0.528 0.269) (line 'scaled 0.528 0.269 0.533 0.269) (morphlastline 'scaled 0.528 0.269 0.533 0.259) (line 'scaled 0.533 0.269 0.539 0.269) (morphlastline 'scaled 0.533 0.259 0.539 0.269) (line 'scaled 0.539 0.269 0.550 0.269) (morphlastline 'scaled 0.539 0.269 0.550 0.269) (line 'scaled 0.550 0.269 0.544 0.279) (morphlastline 'scaled 0.550 0.269 0.544 0.279) (line 'scaled 0.544 0.279 0.542 0.283) (morphlastline 'scaled 0.544 0.279 0.550 0.288) (line 'scaled 0.542 0.283 0.539 0.288) (morphlastline 'scaled 0.550 0.288 0.539 0.288) (line 'scaled 0.539 0.288 0.533 0.298) (morphlastline 'scaled 0.539 0.288 0.533 0.298) (line 'scaled 0.533 0.298 0.539 0.308) (morphlastline 'scaled 0.533 0.298 0.539 0.308) (line 'scaled 0.539 0.308 0.542 0.312) (morphlastline 'scaled 0.539 0.308 0.550 0.308) (line 'scaled 0.542 0.312 0.544 0.317) (morphlastline 'scaled 0.550 0.308 0.544 0.317) (line 'scaled 0.544 0.317 0.550 0.327) (morphlastline 'scaled 0.544 0.317 0.550 0.327) (line 'scaled 0.550 0.327 0.561 0.327) (morphlastline 'scaled 0.550 0.327 0.561 0.327) (line 'scaled 0.561 0.327 0.567 0.327) (morphlastline 'scaled 0.561 0.327 0.567 0.317) (line 'scaled 0.567 0.327 0.572 0.327) (morphlastline 'scaled 0.567 0.317 0.572 0.327) (line 'scaled 0.572 0.327 0.583 0.327) (morphlastline 'scaled 0.572 0.327 0.583 0.327) (line 'scaled 0.583 0.327 0.589 0.317) (morphlastline 'scaled 0.583 0.327 0.589 0.317) (line 'scaled 0.589 0.317 0.592 0.312) (morphlastline 'scaled 0.589 0.317 0.583 0.308) (line 'scaled 0.592 0.312 0.594 0.308) (morphlastline 'scaled 0.583 0.308 0.594 0.308) (line 'scaled 0.594 0.308 0.600 0.298) (morphlastline 'scaled 0.594 0.308 0.600 0.298) (line 'scaled 0.600 0.298 0.606 0.308) (morphlastline 'scaled 0.600 0.298 0.606 0.308) (line 'scaled 0.606 0.308 0.608 0.312) (morphlastline 'scaled 0.606 0.308 0.617 0.308) (line 'scaled 0.608 0.312 0.611 0.317) (morphlastline 'scaled 0.617 0.308 0.611 0.317) (line 'scaled 0.611 0.317 0.617 0.327) (morphlastline 'scaled 0.611 0.317 0.617 0.327) (line 'scaled 0.617 0.327 0.628 0.327) (morphlastline 'scaled 0.617 0.327 0.628 0.327) (line 'scaled 0.628 0.327 0.633 0.327) (morphlastline 'scaled 0.628 0.327 0.633 0.317) (line 'scaled 0.633 0.327 0.639 0.327) (morphlastline 'scaled 0.633 0.317 0.639 0.327) (line 'scaled 0.639 0.327 0.650 0.327) (morphlastline 'scaled 0.639 0.327 0.650 0.327) (line 'scaled 0.650 0.327 0.644 0.336) (morphlastline 'scaled 0.650 0.327 0.644 0.336) (line 'scaled 0.644 0.336 0.642 0.341) (morphlastline 'scaled 0.644 0.336 0.650 0.346) (line 'scaled 0.642 0.341 0.639 0.346) (morphlastline 'scaled 0.650 0.346 0.639 0.346) (line 'scaled 0.639 0.346 0.633 0.356) (morphlastline 'scaled 0.639 0.346 0.633 0.356) (line 'scaled 0.633 0.356 0.639 0.365) (morphlastline 'scaled 0.633 0.356 0.639 0.365) (line 'scaled 0.639 0.365 0.642 0.370) (morphlastline 'scaled 0.639 0.365 0.650 0.365) (line 'scaled 0.642 0.370 0.644 0.375) (morphlastline 'scaled 0.650 0.365 0.644 0.375) (line 'scaled 0.644 0.375 0.650 0.385) (morphlastline 'scaled 0.644 0.375 0.650 0.385) (line 'scaled 0.650 0.385 0.639 0.385) (morphlastline 'scaled 0.650 0.385 0.639 0.385) (line 'scaled 0.639 0.385 0.633 0.385) (morphlastline 'scaled 0.639 0.385 0.633 0.394) (line 'scaled 0.633 0.385 0.628 0.385) (morphlastline 'scaled 0.633 0.394 0.628 0.385) (line 'scaled 0.628 0.385 0.617 0.385) (morphlastline 'scaled 0.628 0.385 0.617 0.385) (line 'scaled 0.617 0.385 0.611 0.394) (morphlastline 'scaled 0.617 0.385 0.611 0.394) (line 'scaled 0.611 0.394 0.608 0.399) (morphlastline 'scaled 0.611 0.394 0.617 0.404) (line 'scaled 0.608 0.399 0.606 0.404) (morphlastline 'scaled 0.617 0.404 0.606 0.404) (line 'scaled 0.606 0.404 0.600 0.413) (morphlastline 'scaled 0.606 0.404 0.600 0.413) (line 'scaled 0.600 0.413 0.606 0.423) (morphlastline 'scaled 0.600 0.413 0.606 0.423) (line 'scaled 0.606 0.423 0.608 0.428) (morphlastline 'scaled 0.606 0.423 0.617 0.423) (line 'scaled 0.608 0.428 0.611 0.433) (morphlastline 'scaled 0.617 0.423 0.611 0.433) (line 'scaled 0.611 0.433 0.617 0.442) (morphlastline 'scaled 0.611 0.433 0.617 0.442) (line 'scaled 0.617 0.442 0.628 0.442) (morphlastline 'scaled 0.617 0.442 0.628 0.442) (line 'scaled 0.628 0.442 0.633 0.442) (morphlastline 'scaled 0.628 0.442 0.633 0.433) (line 'scaled 0.633 0.442 0.639 0.442) (morphlastline 'scaled 0.633 0.433 0.639 0.442) (line 'scaled 0.639 0.442 0.650 0.442) (morphlastline 'scaled 0.639 0.442 0.650 0.442) (line 'scaled 0.650 0.442 0.644 0.452) (morphlastline 'scaled 0.650 0.442 0.644 0.452) (line 'scaled 0.644 0.452 0.642 0.457) (morphlastline 'scaled 0.644 0.452 0.650 0.462) (line 'scaled 0.642 0.457 0.639 0.462) (morphlastline 'scaled 0.650 0.462 0.639 0.462) (line 'scaled 0.639 0.462 0.633 0.471) (morphlastline 'scaled 0.639 0.462 0.633 0.471) (line 'scaled 0.633 0.471 0.639 0.481) (morphlastline 'scaled 0.633 0.471 0.639 0.481) (line 'scaled 0.639 0.481 0.642 0.486) (morphlastline 'scaled 0.639 0.481 0.650 0.481) (line 'scaled 0.642 0.486 0.644 0.490) (morphlastline 'scaled 0.650 0.481 0.644 0.490) (line 'scaled 0.644 0.490 0.650 0.500) (morphlastline 'scaled 0.644 0.490 0.650 0.500) (line 'scaled 0.650 0.500 0.661 0.500) (morphlastline 'scaled 0.650 0.500 0.661 0.500) (line 'scaled 0.661 0.500 0.667 0.500) (morphlastline 'scaled 0.661 0.500 0.667 0.490) (line 'scaled 0.667 0.500 0.672 0.500) (morphlastline 'scaled 0.667 0.490 0.672 0.500) (line 'scaled 0.672 0.500 0.683 0.500) (morphlastline 'scaled 0.672 0.500 0.683 0.500) (line 'scaled 0.683 0.500 0.689 0.490) (morphlastline 'scaled 0.683 0.500 0.689 0.490) (line 'scaled 0.689 0.490 0.692 0.486) (morphlastline 'scaled 0.689 0.490 0.683 0.481) (line 'scaled 0.692 0.486 0.694 0.481) (morphlastline 'scaled 0.683 0.481 0.694 0.481) (line 'scaled 0.694 0.481 0.700 0.471) (morphlastline 'scaled 0.694 0.481 0.700 0.471) (line 'scaled 0.700 0.471 0.706 0.481) (morphlastline 'scaled 0.700 0.471 0.706 0.481) (line 'scaled 0.706 0.481 0.708 0.486) (morphlastline 'scaled 0.706 0.481 0.717 0.481) (line 'scaled 0.708 0.486 0.711 0.490) (morphlastline 'scaled 0.717 0.481 0.711 0.490) (line 'scaled 0.711 0.490 0.717 0.500) (morphlastline 'scaled 0.711 0.490 0.717 0.500) (line 'scaled 0.717 0.500 0.728 0.500) (morphlastline 'scaled 0.717 0.500 0.728 0.500) (line 'scaled 0.728 0.500 0.733 0.500) (morphlastline 'scaled 0.728 0.500 0.733 0.490) (line 'scaled 0.733 0.500 0.739 0.500) (morphlastline 'scaled 0.733 0.490 0.739 0.500) (line 'scaled 0.739 0.500 0.750 0.500) (morphlastline 'scaled 0.739 0.500 0.750 0.500) (line 'scaled 0.750 0.500 0.756 0.490) (morphlastline 'scaled 0.750 0.500 0.756 0.490) (line 'scaled 0.756 0.490 0.758 0.486) (morphlastline 'scaled 0.756 0.490 0.750 0.481) (line 'scaled 0.758 0.486 0.761 0.481) (morphlastline 'scaled 0.750 0.481 0.761 0.481) (line 'scaled 0.761 0.481 0.767 0.471) (morphlastline 'scaled 0.761 0.481 0.767 0.471) (line 'scaled 0.767 0.471 0.761 0.462) (morphlastline 'scaled 0.767 0.471 0.761 0.462) (line 'scaled 0.761 0.462 0.758 0.457) (morphlastline 'scaled 0.761 0.462 0.750 0.462) (line 'scaled 0.758 0.457 0.756 0.452) (morphlastline 'scaled 0.750 0.462 0.756 0.452) (line 'scaled 0.756 0.452 0.750 0.442) (morphlastline 'scaled 0.756 0.452 0.750 0.442) (line 'scaled 0.750 0.442 0.761 0.442) (morphlastline 'scaled 0.750 0.442 0.761 0.442) (line 'scaled 0.761 0.442 0.767 0.442) (morphlastline 'scaled 0.761 0.442 0.767 0.433) (line 'scaled 0.767 0.442 0.772 0.442) (morphlastline 'scaled 0.767 0.433 0.772 0.442) (line 'scaled 0.772 0.442 0.783 0.442) (morphlastline 'scaled 0.772 0.442 0.783 0.442) (line 'scaled 0.783 0.442 0.789 0.433) (morphlastline 'scaled 0.783 0.442 0.789 0.433) (line 'scaled 0.789 0.433 0.792 0.428) (morphlastline 'scaled 0.789 0.433 0.783 0.423) (line 'scaled 0.792 0.428 0.794 0.423) (morphlastline 'scaled 0.783 0.423 0.794 0.423) (line 'scaled 0.794 0.423 0.800 0.413) (morphlastline 'scaled 0.794 0.423 0.800 0.413) (line 'scaled 0.800 0.413 0.806 0.423) (morphlastline 'scaled 0.800 0.413 0.806 0.423) (line 'scaled 0.806 0.423 0.808 0.428) (morphlastline 'scaled 0.806 0.423 0.817 0.423) (line 'scaled 0.808 0.428 0.811 0.433) (morphlastline 'scaled 0.817 0.423 0.811 0.433) (line 'scaled 0.811 0.433 0.817 0.442) (morphlastline 'scaled 0.811 0.433 0.817 0.442) (line 'scaled 0.817 0.442 0.828 0.442) (morphlastline 'scaled 0.817 0.442 0.828 0.442) (line 'scaled 0.828 0.442 0.833 0.442) (morphlastline 'scaled 0.828 0.442 0.833 0.433) (line 'scaled 0.833 0.442 0.839 0.442) (morphlastline 'scaled 0.833 0.433 0.839 0.442) (line 'scaled 0.839 0.442 0.850 0.442) (morphlastline 'scaled 0.839 0.442 0.850 0.442) (line 'scaled 0.850 0.442 0.844 0.452) (morphlastline 'scaled 0.850 0.442 0.844 0.452) (line 'scaled 0.844 0.452 0.842 0.457) (morphlastline 'scaled 0.844 0.452 0.850 0.462) (line 'scaled 0.842 0.457 0.839 0.462) (morphlastline 'scaled 0.850 0.462 0.839 0.462) (line 'scaled 0.839 0.462 0.833 0.471) (morphlastline 'scaled 0.839 0.462 0.833 0.471) (line 'scaled 0.833 0.471 0.839 0.481) (morphlastline 'scaled 0.833 0.471 0.839 0.481) (line 'scaled 0.839 0.481 0.842 0.486) (morphlastline 'scaled 0.839 0.481 0.850 0.481) (line 'scaled 0.842 0.486 0.844 0.490) (morphlastline 'scaled 0.850 0.481 0.844 0.490) (line 'scaled 0.844 0.490 0.850 0.500) (morphlastline 'scaled 0.844 0.490 0.850 0.500) (line 'scaled 0.850 0.500 0.861 0.500) (morphlastline 'scaled 0.850 0.500 0.861 0.500) (line 'scaled 0.861 0.500 0.867 0.500) (morphlastline 'scaled 0.861 0.500 0.867 0.490) (line 'scaled 0.867 0.500 0.872 0.500) (morphlastline 'scaled 0.867 0.490 0.872 0.500) (line 'scaled 0.872 0.500 0.883 0.500) (morphlastline 'scaled 0.872 0.500 0.883 0.500) (line 'scaled 0.883 0.500 0.889 0.490) (morphlastline 'scaled 0.883 0.500 0.889 0.490) (line 'scaled 0.889 0.490 0.892 0.486) (morphlastline 'scaled 0.889 0.490 0.883 0.481) (line 'scaled 0.892 0.486 0.894 0.481) (morphlastline 'scaled 0.883 0.481 0.894 0.481) (line 'scaled 0.894 0.481 0.900 0.471) (morphlastline 'scaled 0.894 0.481 0.900 0.471) (line 'scaled 0.900 0.471 0.906 0.481) (morphlastline 'scaled 0.900 0.471 0.906 0.481) (line 'scaled 0.906 0.481 0.908 0.486) (morphlastline 'scaled 0.906 0.481 0.917 0.481) (line 'scaled 0.908 0.486 0.911 0.490) (morphlastline 'scaled 0.917 0.481 0.911 0.490) (line 'scaled 0.911 0.490 0.917 0.500) (morphlastline 'scaled 0.911 0.490 0.917 0.500) (line 'scaled 0.917 0.500 0.928 0.500) (morphlastline 'scaled 0.917 0.500 0.928 0.500) (line 'scaled 0.928 0.500 0.933 0.500) (morphlastline 'scaled 0.928 0.500 0.933 0.490) (line 'scaled 0.933 0.500 0.939 0.500) (morphlastline 'scaled 0.933 0.490 0.939 0.500) (line 'scaled 0.939 0.500 0.950 0.500) (morphlastline 'scaled 0.939 0.500 0.950 0.500) XaoS-release-4.3.2/tutorial/flake5.xhf000066400000000000000000001550141455214672000175450ustar00rootroot00000000000000(linekey 0) (morphline 'scaled 0.200 0.300 0.207 0.300) (morphline 'scaled 0.207 0.300 0.211 0.294) (morphline 'scaled 0.211 0.294 0.215 0.300) (morphline 'scaled 0.215 0.300 0.222 0.300) (morphline 'scaled 0.222 0.300 0.226 0.294) (morphline 'scaled 0.226 0.294 0.222 0.287) (morphline 'scaled 0.222 0.287 0.230 0.287) (morphline 'scaled 0.230 0.287 0.233 0.281) (morphline 'scaled 0.233 0.281 0.237 0.287) (morphline 'scaled 0.237 0.287 0.244 0.287) (morphline 'scaled 0.244 0.287 0.241 0.294) (morphline 'scaled 0.241 0.294 0.244 0.300) (morphline 'scaled 0.244 0.300 0.252 0.300) (morphline 'scaled 0.252 0.300 0.256 0.294) (morphline 'scaled 0.256 0.294 0.259 0.300) (morphline 'scaled 0.259 0.300 0.267 0.300) (morphline 'scaled 0.267 0.300 0.270 0.294) (morphline 'scaled 0.270 0.294 0.267 0.287) (morphline 'scaled 0.267 0.287 0.274 0.287) (morphline 'scaled 0.274 0.287 0.278 0.281) (morphline 'scaled 0.278 0.281 0.274 0.274) (morphline 'scaled 0.274 0.274 0.267 0.274) (morphline 'scaled 0.267 0.274 0.270 0.268) (morphline 'scaled 0.270 0.268 0.267 0.262) (morphline 'scaled 0.267 0.262 0.274 0.262) (morphline 'scaled 0.274 0.262 0.278 0.255) (morphline 'scaled 0.278 0.255 0.281 0.262) (morphline 'scaled 0.281 0.262 0.289 0.262) (morphline 'scaled 0.289 0.262 0.293 0.255) (morphline 'scaled 0.293 0.255 0.289 0.249) (morphline 'scaled 0.289 0.249 0.296 0.249) (morphline 'scaled 0.296 0.249 0.300 0.242) (morphline 'scaled 0.300 0.242 0.304 0.249) (morphline 'scaled 0.304 0.249 0.311 0.249) (morphline 'scaled 0.311 0.249 0.307 0.255) (morphline 'scaled 0.307 0.255 0.311 0.262) (morphline 'scaled 0.311 0.262 0.319 0.262) (morphline 'scaled 0.319 0.262 0.322 0.255) (morphline 'scaled 0.322 0.255 0.326 0.262) (morphline 'scaled 0.326 0.262 0.333 0.262) (morphline 'scaled 0.333 0.262 0.330 0.268) (morphline 'scaled 0.330 0.268 0.333 0.274) (morphline 'scaled 0.333 0.274 0.326 0.274) (morphline 'scaled 0.326 0.274 0.322 0.281) (morphline 'scaled 0.322 0.281 0.326 0.287) (morphline 'scaled 0.326 0.287 0.333 0.287) (morphline 'scaled 0.333 0.287 0.330 0.294) (morphline 'scaled 0.330 0.294 0.333 0.300) (morphline 'scaled 0.333 0.300 0.341 0.300) (morphline 'scaled 0.341 0.300 0.344 0.294) (morphline 'scaled 0.344 0.294 0.348 0.300) (morphline 'scaled 0.348 0.300 0.356 0.300) (morphline 'scaled 0.356 0.300 0.359 0.294) (morphline 'scaled 0.359 0.294 0.356 0.287) (morphline 'scaled 0.356 0.287 0.363 0.287) (morphline 'scaled 0.363 0.287 0.367 0.281) (morphline 'scaled 0.367 0.281 0.370 0.287) (morphline 'scaled 0.370 0.287 0.378 0.287) (morphline 'scaled 0.378 0.287 0.374 0.294) (morphline 'scaled 0.374 0.294 0.378 0.300) (morphline 'scaled 0.378 0.300 0.385 0.300) (morphline 'scaled 0.385 0.300 0.389 0.294) (morphline 'scaled 0.389 0.294 0.393 0.300) (morphline 'scaled 0.393 0.300 0.400 0.300) (morphline 'scaled 0.400 0.300 0.404 0.294) (morphline 'scaled 0.404 0.294 0.400 0.287) (morphline 'scaled 0.400 0.287 0.407 0.287) (morphline 'scaled 0.407 0.287 0.411 0.281) (morphline 'scaled 0.411 0.281 0.407 0.274) (morphline 'scaled 0.407 0.274 0.400 0.274) (morphline 'scaled 0.400 0.274 0.404 0.268) (morphline 'scaled 0.404 0.268 0.400 0.262) (morphline 'scaled 0.400 0.262 0.407 0.262) (morphline 'scaled 0.407 0.262 0.411 0.255) (morphline 'scaled 0.411 0.255 0.415 0.262) (morphline 'scaled 0.415 0.262 0.422 0.262) (morphline 'scaled 0.422 0.262 0.426 0.255) (morphline 'scaled 0.426 0.255 0.422 0.249) (morphline 'scaled 0.422 0.249 0.430 0.249) (morphline 'scaled 0.430 0.249 0.433 0.242) (morphline 'scaled 0.433 0.242 0.430 0.236) (morphline 'scaled 0.430 0.236 0.422 0.236) (morphline 'scaled 0.422 0.236 0.426 0.229) (morphline 'scaled 0.426 0.229 0.422 0.223) (morphline 'scaled 0.422 0.223 0.415 0.223) (morphline 'scaled 0.415 0.223 0.411 0.229) (morphline 'scaled 0.411 0.229 0.407 0.223) (morphline 'scaled 0.407 0.223 0.400 0.223) (morphline 'scaled 0.400 0.223 0.404 0.217) (morphline 'scaled 0.404 0.217 0.400 0.210) (morphline 'scaled 0.400 0.210 0.407 0.210) (morphline 'scaled 0.407 0.210 0.411 0.204) (morphline 'scaled 0.411 0.204 0.407 0.197) (morphline 'scaled 0.407 0.197 0.400 0.197) (morphline 'scaled 0.400 0.197 0.404 0.191) (morphline 'scaled 0.404 0.191 0.400 0.185) (morphline 'scaled 0.400 0.185 0.407 0.185) (morphline 'scaled 0.407 0.185 0.411 0.178) (morphline 'scaled 0.411 0.178 0.415 0.185) (morphline 'scaled 0.415 0.185 0.422 0.185) (morphline 'scaled 0.422 0.185 0.426 0.178) (morphline 'scaled 0.426 0.178 0.422 0.172) (morphline 'scaled 0.422 0.172 0.430 0.172) (morphline 'scaled 0.430 0.172 0.433 0.165) (morphline 'scaled 0.433 0.165 0.437 0.172) (morphline 'scaled 0.437 0.172 0.444 0.172) (morphline 'scaled 0.444 0.172 0.441 0.178) (morphline 'scaled 0.441 0.178 0.444 0.185) (morphline 'scaled 0.444 0.185 0.452 0.185) (morphline 'scaled 0.452 0.185 0.456 0.178) (morphline 'scaled 0.456 0.178 0.459 0.185) (morphline 'scaled 0.459 0.185 0.467 0.185) (morphline 'scaled 0.467 0.185 0.470 0.178) (morphline 'scaled 0.470 0.178 0.467 0.172) (morphline 'scaled 0.467 0.172 0.474 0.172) (morphline 'scaled 0.474 0.172 0.478 0.165) (morphline 'scaled 0.478 0.165 0.474 0.159) (morphline 'scaled 0.474 0.159 0.467 0.159) (morphline 'scaled 0.467 0.159 0.470 0.152) (morphline 'scaled 0.470 0.152 0.467 0.146) (morphline 'scaled 0.467 0.146 0.474 0.146) (morphline 'scaled 0.474 0.146 0.478 0.140) (morphline 'scaled 0.478 0.140 0.481 0.146) (morphline 'scaled 0.481 0.146 0.489 0.146) (morphline 'scaled 0.489 0.146 0.493 0.140) (morphline 'scaled 0.493 0.140 0.489 0.133) (morphline 'scaled 0.489 0.133 0.496 0.133) (morphline 'scaled 0.496 0.133 0.500 0.127) (morphline 'scaled 0.500 0.127 0.504 0.133) (morphline 'scaled 0.504 0.133 0.511 0.133) (morphline 'scaled 0.511 0.133 0.507 0.140) (morphline 'scaled 0.507 0.140 0.511 0.146) (morphline 'scaled 0.511 0.146 0.519 0.146) (morphline 'scaled 0.519 0.146 0.522 0.140) (morphline 'scaled 0.522 0.140 0.526 0.146) (morphline 'scaled 0.526 0.146 0.533 0.146) (morphline 'scaled 0.533 0.146 0.530 0.152) (morphline 'scaled 0.530 0.152 0.533 0.159) (morphline 'scaled 0.533 0.159 0.526 0.159) (morphline 'scaled 0.526 0.159 0.522 0.165) (morphline 'scaled 0.522 0.165 0.526 0.172) (morphline 'scaled 0.526 0.172 0.533 0.172) (morphline 'scaled 0.533 0.172 0.530 0.178) (morphline 'scaled 0.530 0.178 0.533 0.185) (morphline 'scaled 0.533 0.185 0.541 0.185) (morphline 'scaled 0.541 0.185 0.544 0.178) (morphline 'scaled 0.544 0.178 0.548 0.185) (morphline 'scaled 0.548 0.185 0.556 0.185) (morphline 'scaled 0.556 0.185 0.559 0.178) (morphline 'scaled 0.559 0.178 0.556 0.172) (morphline 'scaled 0.556 0.172 0.563 0.172) (morphline 'scaled 0.563 0.172 0.567 0.165) (morphline 'scaled 0.567 0.165 0.570 0.172) (morphline 'scaled 0.570 0.172 0.578 0.172) (morphline 'scaled 0.578 0.172 0.574 0.178) (morphline 'scaled 0.574 0.178 0.578 0.185) (morphline 'scaled 0.578 0.185 0.585 0.185) (morphline 'scaled 0.585 0.185 0.589 0.178) (morphline 'scaled 0.589 0.178 0.593 0.185) (morphline 'scaled 0.593 0.185 0.600 0.185) (morphline 'scaled 0.600 0.185 0.596 0.191) (morphline 'scaled 0.596 0.191 0.600 0.197) (morphline 'scaled 0.600 0.197 0.593 0.197) (morphline 'scaled 0.593 0.197 0.589 0.204) (morphline 'scaled 0.589 0.204 0.593 0.210) (morphline 'scaled 0.593 0.210 0.600 0.210) (morphline 'scaled 0.600 0.210 0.596 0.217) (morphline 'scaled 0.596 0.217 0.600 0.223) (morphline 'scaled 0.600 0.223 0.593 0.223) (morphline 'scaled 0.593 0.223 0.589 0.229) (morphline 'scaled 0.589 0.229 0.585 0.223) (morphline 'scaled 0.585 0.223 0.578 0.223) (morphline 'scaled 0.578 0.223 0.574 0.229) (morphline 'scaled 0.574 0.229 0.578 0.236) (morphline 'scaled 0.578 0.236 0.570 0.236) (morphline 'scaled 0.570 0.236 0.567 0.242) (morphline 'scaled 0.567 0.242 0.570 0.249) (morphline 'scaled 0.570 0.249 0.578 0.249) (morphline 'scaled 0.578 0.249 0.574 0.255) (morphline 'scaled 0.574 0.255 0.578 0.262) (morphline 'scaled 0.578 0.262 0.585 0.262) (morphline 'scaled 0.585 0.262 0.589 0.255) (morphline 'scaled 0.589 0.255 0.593 0.262) (morphline 'scaled 0.593 0.262 0.600 0.262) (morphline 'scaled 0.600 0.262 0.596 0.268) (morphline 'scaled 0.596 0.268 0.600 0.274) (morphline 'scaled 0.600 0.274 0.593 0.274) (morphline 'scaled 0.593 0.274 0.589 0.281) (morphline 'scaled 0.589 0.281 0.593 0.287) (morphline 'scaled 0.593 0.287 0.600 0.287) (morphline 'scaled 0.600 0.287 0.596 0.294) (morphline 'scaled 0.596 0.294 0.600 0.300) (morphline 'scaled 0.600 0.300 0.607 0.300) (morphline 'scaled 0.607 0.300 0.611 0.294) (morphline 'scaled 0.611 0.294 0.615 0.300) (morphline 'scaled 0.615 0.300 0.622 0.300) (morphline 'scaled 0.622 0.300 0.626 0.294) (morphline 'scaled 0.626 0.294 0.622 0.287) (morphline 'scaled 0.622 0.287 0.630 0.287) (morphline 'scaled 0.630 0.287 0.633 0.281) (morphline 'scaled 0.633 0.281 0.637 0.287) (morphline 'scaled 0.637 0.287 0.644 0.287) (morphline 'scaled 0.644 0.287 0.641 0.294) (morphline 'scaled 0.641 0.294 0.644 0.300) (morphline 'scaled 0.644 0.300 0.652 0.300) (morphline 'scaled 0.652 0.300 0.656 0.294) (morphline 'scaled 0.656 0.294 0.659 0.300) (morphline 'scaled 0.659 0.300 0.667 0.300) (morphline 'scaled 0.667 0.300 0.670 0.294) (morphline 'scaled 0.670 0.294 0.667 0.287) (morphline 'scaled 0.667 0.287 0.674 0.287) (morphline 'scaled 0.674 0.287 0.678 0.281) (morphline 'scaled 0.678 0.281 0.674 0.274) (morphline 'scaled 0.674 0.274 0.667 0.274) (morphline 'scaled 0.667 0.274 0.670 0.268) (morphline 'scaled 0.670 0.268 0.667 0.262) (morphline 'scaled 0.667 0.262 0.674 0.262) (morphline 'scaled 0.674 0.262 0.678 0.255) (morphline 'scaled 0.678 0.255 0.681 0.262) (morphline 'scaled 0.681 0.262 0.689 0.262) (morphline 'scaled 0.689 0.262 0.693 0.255) (morphline 'scaled 0.693 0.255 0.689 0.249) (morphline 'scaled 0.689 0.249 0.696 0.249) (morphline 'scaled 0.696 0.249 0.700 0.242) (morphline 'scaled 0.700 0.242 0.704 0.249) (morphline 'scaled 0.704 0.249 0.711 0.249) (morphline 'scaled 0.711 0.249 0.707 0.255) (morphline 'scaled 0.707 0.255 0.711 0.262) (morphline 'scaled 0.711 0.262 0.719 0.262) (morphline 'scaled 0.719 0.262 0.722 0.255) (morphline 'scaled 0.722 0.255 0.726 0.262) (morphline 'scaled 0.726 0.262 0.733 0.262) (morphline 'scaled 0.733 0.262 0.730 0.268) (morphline 'scaled 0.730 0.268 0.733 0.274) (morphline 'scaled 0.733 0.274 0.726 0.274) (morphline 'scaled 0.726 0.274 0.722 0.281) (morphline 'scaled 0.722 0.281 0.726 0.287) (morphline 'scaled 0.726 0.287 0.733 0.287) (morphline 'scaled 0.733 0.287 0.730 0.294) (morphline 'scaled 0.730 0.294 0.733 0.300) (morphline 'scaled 0.733 0.300 0.741 0.300) (morphline 'scaled 0.741 0.300 0.744 0.294) (morphline 'scaled 0.744 0.294 0.748 0.300) (morphline 'scaled 0.748 0.300 0.756 0.300) (morphline 'scaled 0.756 0.300 0.759 0.294) (morphline 'scaled 0.759 0.294 0.756 0.287) (morphline 'scaled 0.756 0.287 0.763 0.287) (morphline 'scaled 0.763 0.287 0.767 0.281) (morphline 'scaled 0.767 0.281 0.770 0.287) (morphline 'scaled 0.770 0.287 0.778 0.287) (morphline 'scaled 0.778 0.287 0.774 0.294) (morphline 'scaled 0.774 0.294 0.778 0.300) (morphline 'scaled 0.778 0.300 0.785 0.300) (morphline 'scaled 0.785 0.300 0.789 0.294) (morphline 'scaled 0.789 0.294 0.793 0.300) (morphline 'scaled 0.793 0.300 0.800 0.300) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.300 0.796 0.306) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.796 0.306 0.800 0.313) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.313 0.793 0.313) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.313 0.789 0.319) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.319 0.793 0.326) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.326 0.800 0.326) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.326 0.796 0.332) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.796 0.332 0.800 0.338) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.338 0.793 0.338) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.338 0.789 0.345) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.345 0.785 0.338) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.785 0.338 0.778 0.338) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.338 0.774 0.345) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.774 0.345 0.778 0.351) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.351 0.770 0.351) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.770 0.351 0.767 0.358) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.767 0.358 0.770 0.364) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.770 0.364 0.778 0.364) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.364 0.774 0.371) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.774 0.371 0.778 0.377) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.377 0.785 0.377) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.785 0.377 0.789 0.371) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.371 0.793 0.377) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.377 0.800 0.377) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.377 0.796 0.383) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.796 0.383 0.800 0.390) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.390 0.793 0.390) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.390 0.789 0.396) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.396 0.793 0.403) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.403 0.800 0.403) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.403 0.796 0.409) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.796 0.409 0.800 0.415) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.415 0.793 0.415) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.415 0.789 0.422) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.422 0.785 0.415) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.785 0.415 0.778 0.415) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.415 0.774 0.422) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.774 0.422 0.778 0.428) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.428 0.770 0.428) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.770 0.428 0.767 0.435) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.767 0.435 0.763 0.428) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.763 0.428 0.756 0.428) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.756 0.428 0.759 0.422) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.759 0.422 0.756 0.415) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.756 0.415 0.748 0.415) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.748 0.415 0.744 0.422) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.744 0.422 0.741 0.415) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.741 0.415 0.733 0.415) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.415 0.730 0.422) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.730 0.422 0.733 0.428) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.428 0.726 0.428) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.428 0.722 0.435) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.722 0.435 0.726 0.441) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.441 0.733 0.441) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.441 0.730 0.448) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.730 0.448 0.733 0.454) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.454 0.726 0.454) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.454 0.722 0.460) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.722 0.460 0.719 0.454) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.719 0.454 0.711 0.454) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.711 0.454 0.707 0.460) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.707 0.460 0.711 0.467) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.711 0.467 0.704 0.467) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.704 0.467 0.700 0.473) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.700 0.473 0.704 0.480) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.704 0.480 0.711 0.480) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.711 0.480 0.707 0.486) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.707 0.486 0.711 0.492) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.711 0.492 0.719 0.492) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.719 0.492 0.722 0.486) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.722 0.486 0.726 0.492) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.492 0.733 0.492) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.492 0.730 0.499) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.730 0.499 0.733 0.505) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.505 0.726 0.505) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.505 0.722 0.512) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.722 0.512 0.726 0.518) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.518 0.733 0.518) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.518 0.730 0.525) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.730 0.525 0.733 0.531) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.531 0.741 0.531) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.741 0.531 0.744 0.525) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.744 0.525 0.748 0.531) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.748 0.531 0.756 0.531) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.756 0.531 0.759 0.525) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.759 0.525 0.756 0.518) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.756 0.518 0.763 0.518) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.763 0.518 0.767 0.512) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.767 0.512 0.770 0.518) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.770 0.518 0.778 0.518) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.518 0.774 0.525) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.774 0.525 0.778 0.531) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.531 0.785 0.531) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.785 0.531 0.789 0.525) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.525 0.793 0.531) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.531 0.800 0.531) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.531 0.796 0.537) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.796 0.537 0.800 0.544) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.544 0.793 0.544) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.544 0.789 0.550) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.550 0.793 0.557) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.557 0.800 0.557) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.557 0.796 0.563) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.796 0.563 0.800 0.569) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.569 0.793 0.569) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.569 0.789 0.576) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.576 0.785 0.569) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.785 0.569 0.778 0.569) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.569 0.774 0.576) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.774 0.576 0.778 0.582) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.582 0.770 0.582) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.770 0.582 0.767 0.589) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.767 0.589 0.770 0.595) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.770 0.595 0.778 0.595) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.595 0.774 0.602) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.774 0.602 0.778 0.608) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.608 0.785 0.608) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.785 0.608 0.789 0.602) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.602 0.793 0.608) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.608 0.800 0.608) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.608 0.796 0.614) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.796 0.614 0.800 0.621) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.621 0.793 0.621) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.621 0.789 0.627) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.627 0.793 0.634) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.634 0.800 0.634) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.634 0.796 0.640) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.796 0.640 0.800 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.800 0.646 0.793 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.793 0.646 0.789 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.789 0.653 0.785 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.785 0.646 0.778 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.646 0.774 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.774 0.653 0.778 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.778 0.659 0.770 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.770 0.659 0.767 0.666) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.767 0.666 0.763 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.763 0.659 0.756 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.756 0.659 0.759 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.759 0.653 0.756 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.756 0.646 0.748 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.748 0.646 0.744 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.744 0.653 0.741 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.741 0.646 0.733 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.646 0.730 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.730 0.653 0.733 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.659 0.726 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.659 0.722 0.666) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.722 0.666 0.726 0.672) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.672 0.733 0.672) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.672 0.730 0.678) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.730 0.678 0.733 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.733 0.685 0.726 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.726 0.685 0.722 0.691) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.722 0.691 0.719 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.719 0.685 0.711 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.711 0.685 0.707 0.691) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.707 0.691 0.711 0.698) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.711 0.698 0.704 0.698) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.704 0.698 0.700 0.704) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.700 0.704 0.696 0.698) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.696 0.698 0.689 0.698) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.689 0.698 0.693 0.691) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.693 0.691 0.689 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.689 0.685 0.681 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.681 0.685 0.678 0.691) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.678 0.691 0.674 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.674 0.685 0.667 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.667 0.685 0.670 0.678) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.670 0.678 0.667 0.672) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.667 0.672 0.674 0.672) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.674 0.672 0.678 0.666) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.678 0.666 0.674 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.674 0.659 0.667 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.667 0.659 0.670 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.670 0.653 0.667 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.667 0.646 0.659 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.659 0.646 0.656 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.656 0.653 0.652 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.652 0.646 0.644 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.644 0.646 0.641 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.641 0.653 0.644 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.644 0.659 0.637 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.637 0.659 0.633 0.666) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.633 0.666 0.630 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.630 0.659 0.622 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.622 0.659 0.626 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.626 0.653 0.622 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.622 0.646 0.615 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.615 0.646 0.611 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.611 0.653 0.607 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.607 0.646 0.600 0.646) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.600 0.646 0.596 0.653) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.596 0.653 0.600 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.600 0.659 0.593 0.659) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.593 0.659 0.589 0.666) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.589 0.666 0.593 0.672) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.593 0.672 0.600 0.672) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.600 0.672 0.596 0.678) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.596 0.678 0.600 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.600 0.685 0.593 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.593 0.685 0.589 0.691) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.589 0.691 0.585 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.585 0.685 0.578 0.685) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.578 0.685 0.574 0.691) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.574 0.691 0.578 0.698) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.578 0.698 0.570 0.698) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.570 0.698 0.567 0.704) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.567 0.704 0.570 0.711) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.570 0.711 0.578 0.711) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.578 0.711 0.574 0.717) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.574 0.717 0.578 0.723) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.578 0.723 0.585 0.723) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.585 0.723 0.589 0.717) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.589 0.717 0.593 0.723) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.593 0.723 0.600 0.723) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.600 0.723 0.596 0.730) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.596 0.730 0.600 0.736) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.600 0.736 0.593 0.736) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.593 0.736 0.589 0.743) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.589 0.743 0.593 0.749) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.593 0.749 0.600 0.749) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.600 0.749 0.596 0.755) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.596 0.755 0.600 0.762) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.600 0.762 0.593 0.762) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.593 0.762 0.589 0.768) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.589 0.768 0.585 0.762) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.585 0.762 0.578 0.762) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.578 0.762 0.574 0.768) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.574 0.768 0.578 0.775) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.578 0.775 0.570 0.775) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.570 0.775 0.567 0.781) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.567 0.781 0.563 0.775) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.563 0.775 0.556 0.775) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.556 0.775 0.559 0.768) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.559 0.768 0.556 0.762) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.556 0.762 0.548 0.762) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.548 0.762 0.544 0.768) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.544 0.768 0.541 0.762) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.541 0.762 0.533 0.762) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.533 0.762 0.530 0.768) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.530 0.768 0.533 0.775) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.533 0.775 0.526 0.775) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.526 0.775 0.522 0.781) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.522 0.781 0.526 0.788) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.526 0.788 0.533 0.788) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.533 0.788 0.530 0.794) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.530 0.794 0.533 0.800) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.533 0.800 0.526 0.800) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.526 0.800 0.522 0.807) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.522 0.807 0.519 0.800) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.519 0.800 0.511 0.800) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.511 0.800 0.507 0.807) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.507 0.807 0.511 0.813) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.511 0.813 0.504 0.813) (line 'scaled 0.950 0.500 0.950 0.500) (morphlastline 'scaled 0.504 0.813 0.500 0.820) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.500 0.820 0.496 0.813) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.496 0.813 0.489 0.813) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.489 0.813 0.493 0.807) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.493 0.807 0.489 0.800) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.489 0.800 0.481 0.800) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.481 0.800 0.478 0.807) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.478 0.807 0.474 0.800) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.474 0.800 0.467 0.800) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.467 0.800 0.470 0.794) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.470 0.794 0.467 0.788) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.467 0.788 0.474 0.788) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.474 0.788 0.478 0.781) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.478 0.781 0.474 0.775) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.474 0.775 0.467 0.775) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.467 0.775 0.470 0.768) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.470 0.768 0.467 0.762) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.467 0.762 0.459 0.762) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.459 0.762 0.456 0.768) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.456 0.768 0.452 0.762) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.452 0.762 0.444 0.762) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.444 0.762 0.441 0.768) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.441 0.768 0.444 0.775) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.444 0.775 0.437 0.775) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.437 0.775 0.433 0.781) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.433 0.781 0.430 0.775) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.430 0.775 0.422 0.775) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.422 0.775 0.426 0.768) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.426 0.768 0.422 0.762) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.422 0.762 0.415 0.762) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.415 0.762 0.411 0.768) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.411 0.768 0.407 0.762) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.407 0.762 0.400 0.762) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.400 0.762 0.404 0.755) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.404 0.755 0.400 0.749) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.400 0.749 0.407 0.749) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.407 0.749 0.411 0.743) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.411 0.743 0.407 0.736) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.407 0.736 0.400 0.736) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.400 0.736 0.404 0.730) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.404 0.730 0.400 0.723) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.400 0.723 0.407 0.723) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.407 0.723 0.411 0.717) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.411 0.717 0.415 0.723) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.415 0.723 0.422 0.723) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.422 0.723 0.426 0.717) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.426 0.717 0.422 0.711) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.422 0.711 0.430 0.711) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.430 0.711 0.433 0.704) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.433 0.704 0.430 0.698) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.430 0.698 0.422 0.698) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.422 0.698 0.426 0.691) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.426 0.691 0.422 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.422 0.685 0.415 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.415 0.685 0.411 0.691) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.411 0.691 0.407 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.407 0.685 0.400 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.400 0.685 0.404 0.678) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.404 0.678 0.400 0.672) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.400 0.672 0.407 0.672) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.407 0.672 0.411 0.666) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.411 0.666 0.407 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.407 0.659 0.400 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.400 0.659 0.404 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.404 0.653 0.400 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.400 0.646 0.393 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.393 0.646 0.389 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.389 0.653 0.385 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.385 0.646 0.378 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.378 0.646 0.374 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.374 0.653 0.378 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.378 0.659 0.370 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.370 0.659 0.367 0.666) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.367 0.666 0.363 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.363 0.659 0.356 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.356 0.659 0.359 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.359 0.653 0.356 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.356 0.646 0.348 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.348 0.646 0.344 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.344 0.653 0.341 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.341 0.646 0.333 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.333 0.646 0.330 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.330 0.653 0.333 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.333 0.659 0.326 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.326 0.659 0.322 0.666) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.322 0.666 0.326 0.672) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.326 0.672 0.333 0.672) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.333 0.672 0.330 0.678) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.330 0.678 0.333 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.333 0.685 0.326 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.326 0.685 0.322 0.691) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.322 0.691 0.319 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.319 0.685 0.311 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.311 0.685 0.307 0.691) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.307 0.691 0.311 0.698) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.311 0.698 0.304 0.698) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.304 0.698 0.300 0.704) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.300 0.704 0.296 0.698) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.296 0.698 0.289 0.698) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.289 0.698 0.293 0.691) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.293 0.691 0.289 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.289 0.685 0.281 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.281 0.685 0.278 0.691) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.278 0.691 0.274 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.685 0.267 0.685) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.685 0.270 0.678) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.270 0.678 0.267 0.672) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.672 0.274 0.672) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.672 0.278 0.666) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.278 0.666 0.274 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.659 0.267 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.659 0.270 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.270 0.653 0.267 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.646 0.259 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.259 0.646 0.256 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.256 0.653 0.252 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.252 0.646 0.244 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.244 0.646 0.241 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.241 0.653 0.244 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.244 0.659 0.237 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.237 0.659 0.233 0.666) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.233 0.666 0.230 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.230 0.659 0.222 0.659) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.659 0.226 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.226 0.653 0.222 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.646 0.215 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.215 0.646 0.211 0.653) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.653 0.207 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.646 0.200 0.646) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.646 0.204 0.640) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.204 0.640 0.200 0.634) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.634 0.207 0.634) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.634 0.211 0.627) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.627 0.207 0.621) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.621 0.200 0.621) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.621 0.204 0.614) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.204 0.614 0.200 0.608) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.608 0.207 0.608) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.608 0.211 0.602) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.602 0.215 0.608) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.215 0.608 0.222 0.608) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.608 0.226 0.602) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.226 0.602 0.222 0.595) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.595 0.230 0.595) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.230 0.595 0.233 0.589) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.233 0.589 0.230 0.582) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.230 0.582 0.222 0.582) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.582 0.226 0.576) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.226 0.576 0.222 0.569) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.569 0.215 0.569) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.215 0.569 0.211 0.576) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.576 0.207 0.569) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.569 0.200 0.569) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.569 0.204 0.563) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.204 0.563 0.200 0.557) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.557 0.207 0.557) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.557 0.211 0.550) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.550 0.207 0.544) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.544 0.200 0.544) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.544 0.204 0.537) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.204 0.537 0.200 0.531) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.531 0.207 0.531) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.531 0.211 0.525) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.525 0.215 0.531) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.215 0.531 0.222 0.531) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.531 0.226 0.525) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.226 0.525 0.222 0.518) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.518 0.230 0.518) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.230 0.518 0.233 0.512) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.233 0.512 0.237 0.518) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.237 0.518 0.244 0.518) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.244 0.518 0.241 0.525) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.241 0.525 0.244 0.531) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.244 0.531 0.252 0.531) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.252 0.531 0.256 0.525) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.256 0.525 0.259 0.531) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.259 0.531 0.267 0.531) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.531 0.270 0.525) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.270 0.525 0.267 0.518) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.518 0.274 0.518) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.518 0.278 0.512) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.278 0.512 0.274 0.505) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.505 0.267 0.505) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.505 0.270 0.499) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.270 0.499 0.267 0.492) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.492 0.274 0.492) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.492 0.278 0.486) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.278 0.486 0.281 0.492) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.281 0.492 0.289 0.492) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.289 0.492 0.293 0.486) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.293 0.486 0.289 0.480) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.289 0.480 0.296 0.480) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.296 0.480 0.300 0.473) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.300 0.473 0.296 0.467) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.296 0.467 0.289 0.467) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.289 0.467 0.293 0.460) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.293 0.460 0.289 0.454) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.289 0.454 0.281 0.454) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.281 0.454 0.278 0.460) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.278 0.460 0.274 0.454) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.454 0.267 0.454) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.454 0.270 0.448) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.270 0.448 0.267 0.441) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.441 0.274 0.441) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.441 0.278 0.435) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.278 0.435 0.274 0.428) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.274 0.428 0.267 0.428) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.428 0.270 0.422) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.270 0.422 0.267 0.415) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.267 0.415 0.259 0.415) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.259 0.415 0.256 0.422) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.256 0.422 0.252 0.415) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.252 0.415 0.244 0.415) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.244 0.415 0.241 0.422) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.241 0.422 0.244 0.428) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.244 0.428 0.237 0.428) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.237 0.428 0.233 0.435) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.233 0.435 0.230 0.428) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.230 0.428 0.222 0.428) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.428 0.226 0.422) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.226 0.422 0.222 0.415) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.415 0.215 0.415) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.215 0.415 0.211 0.422) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.422 0.207 0.415) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.415 0.200 0.415) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.415 0.204 0.409) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.204 0.409 0.200 0.403) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.403 0.207 0.403) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.403 0.211 0.396) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.396 0.207 0.390) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.390 0.200 0.390) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.390 0.204 0.383) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.204 0.383 0.200 0.377) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.377 0.207 0.377) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.377 0.211 0.371) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.371 0.215 0.377) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.215 0.377 0.222 0.377) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.377 0.226 0.371) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.226 0.371 0.222 0.364) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.364 0.230 0.364) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.230 0.364 0.233 0.358) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.233 0.358 0.230 0.351) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.230 0.351 0.222 0.351) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.351 0.226 0.345) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.226 0.345 0.222 0.338) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.222 0.338 0.215 0.338) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.215 0.338 0.211 0.345) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.345 0.207 0.338) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.338 0.200 0.338) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.338 0.204 0.332) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.204 0.332 0.200 0.326) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.326 0.207 0.326) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.326 0.211 0.319) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.211 0.319 0.207 0.313) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.207 0.313 0.200 0.313) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.200 0.313 0.204 0.306) (line 'scaled 0.050 0.500 0.050 0.500) (morphlastline 'scaled 0.204 0.306 0.200 0.300) XaoS-release-4.3.2/tutorial/flaketh.xhf000066400000000000000000000047001455214672000200070ustar00rootroot00000000000000(line 'scaled 0.050 0.500 0.061 0.500) (line 'scaled 0.061 0.500 0.067 0.490) (line 'scaled 0.067 0.490 0.072 0.500) (line 'scaled 0.072 0.500 0.083 0.500) (line 'scaled 0.083 0.500 0.089 0.490) (line 'scaled 0.089 0.490 0.083 0.481) (line 'scaled 0.083 0.481 0.094 0.481) (line 'scaled 0.094 0.481 0.100 0.471) (line 'scaled 0.100 0.471 0.106 0.481) (line 'scaled 0.106 0.481 0.117 0.481) (line 'scaled 0.117 0.481 0.111 0.490) (line 'scaled 0.111 0.490 0.117 0.500) (line 'scaled 0.117 0.500 0.128 0.500) (line 'scaled 0.128 0.500 0.133 0.490) (line 'scaled 0.133 0.490 0.139 0.500) (line 'scaled 0.139 0.500 0.150 0.500) (line 'scaled 0.150 0.500 0.156 0.490) (line 'scaled 0.156 0.490 0.150 0.481) (line 'scaled 0.150 0.481 0.161 0.481) (line 'scaled 0.161 0.481 0.167 0.471) (line 'scaled 0.167 0.471 0.161 0.462) (line 'scaled 0.161 0.462 0.150 0.462) (line 'scaled 0.150 0.462 0.156 0.452) (line 'scaled 0.156 0.452 0.150 0.442) (line 'scaled 0.150 0.442 0.161 0.442) (line 'scaled 0.161 0.442 0.167 0.433) (line 'scaled 0.167 0.433 0.172 0.442) (line 'scaled 0.172 0.442 0.183 0.442) (line 'scaled 0.183 0.442 0.189 0.433) (line 'scaled 0.189 0.433 0.183 0.423) (line 'scaled 0.183 0.423 0.194 0.423) (line 'scaled 0.194 0.423 0.200 0.413) (line 'scaled 0.200 0.413 0.206 0.423) (line 'scaled 0.206 0.423 0.217 0.423) (line 'scaled 0.217 0.423 0.211 0.433) (line 'scaled 0.211 0.433 0.217 0.442) (line 'scaled 0.217 0.442 0.228 0.442) (line 'scaled 0.228 0.442 0.233 0.433) (line 'scaled 0.233 0.433 0.239 0.442) (line 'scaled 0.239 0.442 0.250 0.442) (line 'scaled 0.250 0.442 0.244 0.452) (line 'scaled 0.244 0.452 0.250 0.462) (line 'scaled 0.250 0.462 0.239 0.462) (line 'scaled 0.239 0.462 0.233 0.471) (line 'scaled 0.233 0.471 0.239 0.481) (line 'scaled 0.239 0.481 0.250 0.481) (line 'scaled 0.250 0.481 0.244 0.490) (line 'scaled 0.244 0.490 0.250 0.500) (line 'scaled 0.250 0.500 0.261 0.500) (line 'scaled 0.261 0.500 0.267 0.490) (line 'scaled 0.267 0.490 0.272 0.500) (line 'scaled 0.272 0.500 0.283 0.500) (line 'scaled 0.283 0.500 0.289 0.490) (line 'scaled 0.289 0.490 0.283 0.481) (line 'scaled 0.283 0.481 0.294 0.481) (line 'scaled 0.294 0.481 0.300 0.471) (line 'scaled 0.300 0.471 0.306 0.481) (line 'scaled 0.306 0.481 0.317 0.481) (line 'scaled 0.317 0.481 0.311 0.490) (line 'scaled 0.311 0.490 0.317 0.500) (line 'scaled 0.317 0.500 0.328 0.500) (line 'scaled 0.328 0.500 0.333 0.490) (line 'scaled 0.333 0.490 0.339 0.500) (line 'scaled 0.339 0.500 0.350 0.500) XaoS-release-4.3.2/tutorial/fmath.xaf000066400000000000000000000000531455214672000174560ustar00rootroot00000000000000(load "dimension.xaf") (load "escape.xaf") XaoS-release-4.3.2/tutorial/fourfr.xaf000066400000000000000000000053431455214672000176710ustar00rootroot00000000000000;Other fractal types in Xaos - part 2 ;Animation file is made by Arpad Fekete ;This file was made in January 2006 (initstate) (clearscreen) (textposition 'center 'middle) (message "fourfr1") (usleep 5000000) (initstate) (formula 'mbar) (view -0.008173 -0.0008828 2.521 3.529) (textposition 'center 'bottom) (message "fourfr2") (usleep 3500000) (maxiter 600) (morphview 0.7403532753 -1.278489744 4.16355183E-06 5.828972562E-06) (textposition 'center 'bottom) (message "fourfr3") (usleep 7000000) (usleep 2000000) (outcoloring 9) (juliaseed 0.1802021025485444686 -0.44307513109390114856) (julia #t) (view 0.05842 -0.05412 1.992 2.789) (textposition 'center 'bottom) (message "fourfr4") (usleep 3500000) (juliaseed 0.26887131923227432749 0.60098372000587916913) (view 0.1005 0.005699 2.299 3.219) (textposition 'center 'bottom) (message "fourfr5") (usleep 3500000) (initstate) (defaultpalette 0) (formula 'mlambda) (maxiter 300) (view 0.5 0 2.5 5.5) (textposition 'center 'bottom) (message "fourfr6") (usleep 4000000) (morphview 2.8552699225 -0.56941678268 1.9237422042E-07 4.2322328492E-07) (textposition 'center 'bottom) (message "fourfr7") (usleep 7000000) (usleep 2000000) (initstate) (defaultpalette 0) (formula 'mandel) (maxiter 300) (plane 3) (view 1.154 -0.006172 5.417 5.417) (textposition 'center 'bottom) (message "fourfr8") (usleep 3500000) (initstate) (defaultpalette 0) (formula 'mlambda) (maxiter 300) (julia #f) (view 0.5 0 2.5 5.5) (textposition 'center 'bottom) (message "fourfr9") (usleep 3500000) (fastjulia #t) (juliaseed 0.5 0.0) (morphjulia 1.0 0.1) (textposition 'center 'bottom) (message "fourfr10") (usleep 7000000) (usleep 3000000) (initstate) (defaultpalette 0) (formula 'manowar) (maxiter 500) (view -0.0008188 0.009274 1.13 1.13) (textposition 'center 'bottom) (message "fourfr11") (usleep 4500000) (morphview -0.10867742 -0.012469446 0.00013476001 0.00013476001) (textposition 'center 'bottom) (message "fourfr12") (usleep 7000000) (usleep 2500000) (initstate) (defaultpalette 0) (formula 'manowar) (juliaseed -0.0023217465439582729087 -0.033693018764877235869) (maxiter 500) (julia #t) (view 0.1991 -0.0862 2.648 2.648) (textposition 'center 'bottom) (message "fourfr13") (usleep 5000000) (initstate) (defaultpalette 0) (formula 'spider) (maxiter 500) (view 0 0 2.5 4.5) (textposition 'center 'bottom) (message "fourfr14") (usleep 5000000) (morphview -0.302249620182 -0.324228671386 2.66220615653E-08 4.79197108175E-08) (textposition 'center 'bottom) (message "fourfr15") (usleep 7000000) (usleep 2000000) (initstate) (defaultpalette 0) (formula 'spider) (juliaseed 0.017075814143026497253 0.10954690170039975937) (maxiter 500) (julia #t) (view -0.3892 0.08496 2.459 4.426) (textposition 'center 'bottom) (message "fourfr16") (usleep 4000000) XaoS-release-4.3.2/tutorial/fractal.xaf000066400000000000000000000007511455214672000200000ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "intro.xaf") (load "mset.xaf") (load "julia.xaf") (load "power.xaf") (load "newton.xaf") (load "barnsley.xaf") (load "phoenix.xaf") (load "octo.xaf") (load "magnet.xaf") (clearscreen) (textposition 'center 'middle) (message "end") (usleep 4000000) (clearscreen) (message "fcopyright") (textsleep) (clearscreen) (message "suggestions") (textsleep) (initstate) XaoS-release-4.3.2/tutorial/head.xhf000066400000000000000000000000141455214672000172640ustar00rootroot00000000000000(initstate) XaoS-release-4.3.2/tutorial/incolor.xaf000066400000000000000000000046711455214672000200360ustar00rootroot00000000000000; XaoS features overview by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (textposition 'center 'middle) (clearscreen) (message "incolor1") (textsleep) (clearscreen) (message "incolor2") (textsleep) (clearscreen) (message "incolor3") (textsleep) (clearscreen) (message "incolor4") (textsleep) (display) (clearscreen) (message "zmag") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (fastjulia #f) (cycling #f) (periodicity #t) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 1) (plane 0) (view -0.75 0 2.5 2.5) (usleep 2000000) (palette 1 908613446 0) (formula 'octo) (fastjulia #f) (cycling #f) (periodicity #t) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 1) (plane 0) (view 0.0055066 0.0073919 0.53036 0.53036) (usleep 2000000) (palette 1 1374335931 0) (formula 'mandel3) (fastjulia #f) (cycling #f) (periodicity #t) (juliaseed 0.51635174418604654479 -0.47500000000000003054) (autorotate #f) (maxiter 170) (outcoloring 7) (incoloring 1) (julia #t) (plane 0) (view 0.29424 -0.50094 0.2024 0.2024) (usleep 2000000) (palette 1 1296014835 0) (formula 'mandel) (fastjulia #f) (cycling #f) (periodicity #t) (angle 206) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 1) (plane 0) (view 0.11921 0.61908 0.12714 0.12714) (usleep 2000000) (palette 1 1296014835 0) (formula 'barnsley) (fastjulia #f) (cycling #f) (periodicity #t) (juliaseed 0.99818082191979386436 0.0070950445135695779271) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 1) (plane 3) (view 1.122 0.01506 5.317 5.317) (usleep 2000000) (palette 1 1296014835 0) (formula 'barnsley) (fastjulia #f) (cycling #f) (periodicity #t) (juliaseed 0.99818082191979386436 0.0070950445135695779271) (angle -278) (autorotate #f) (maxiter 51) (outcoloring 0) (incoloring 1) (plane 2) (view -1.669 -0.2679 5.317 5.317) (usleep 2000000) (palette 1 2075544141 0) (formula 'barnsley) (fastjulia #f) (cycling #f) (periodicity #t) (juliaseed 1.0193608855903043253 -0.12168203319766217848) (angle -91.6) (autorotate #f) (maxiter 33) (outcoloring 0) (incoloring 1) (plane 0) (view 0.49 -0.1048 1.093 1.093) (usleep 2000000) (palette 1 178743984 0) (formula 'barnsley) (fastjulia #f) (cycling #f) (periodicity #t) (juliaseed 0.0033200691478789011099 1.1344324381483784749) (autorotate #f) (maxiter 14) (outcoloring 0) (incoloring 1) (plane 1) (view 0.1426 -0.07279 4.545 4.545) (usleep 2000000) (load "head.xhf") (load "innew.xhf") XaoS-release-4.3.2/tutorial/innew.xhf000066400000000000000000000156111455214672000175140ustar00rootroot00000000000000(clearscreen) (message "innew1") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (maxiter 170) (outcoloring 0) (incoloring 2) (plane 0) (view -0.75 0 2.5 2.5) (usleep 2000000) (palette 1 2092457178 0) (formula 'barnsley) (juliaseed -1.0116279069767442512 0) (maxiter 69) (outcoloring 0) (incoloring 2) (plane 1) (view -0.07681 -0.03293 5.373 5.373) (usleep 2000000) (palette 1 2050013617 0) (formula 'barnsley) (juliaseed 1.0320331828899885792 0.0011529625858033702327) (maxiter 109) (outcoloring 0) (incoloring 2) (plane 1) (view 0.315 1.49 37.9 37.9) (usleep 2000000) (palette 1 1635547336 0) (formula 'mandel3) (maxiter 170) (outcoloring 0) (incoloring 1) (plane 0) (view 0.010765 -1.0423 0.53774 0.53774) (usleep 2000000) (palette 1 440291327 0) (formula 'barnsley) (juliaseed -1.0116279069767442512 0) (maxiter 69) (outcoloring 0) (incoloring 2) (plane 3) (view 0.9819 -0.01391 2.869 2.869) (usleep 2000000) (palette 1 2046286303 0) (formula 'magnet) (angle 92.6) (maxiter 3) (outcoloring 0) (incoloring 2) (plane 0) (view 1.5222 0.0039414 0.58324 0.85541) (usleep 2000000) (defaultpalette 0) (formula 'newton) (angle -89) (maxiter 3) (outcoloring 0) (incoloring 2) (plane 4) (view -0.3512 -0.06769 2.5 2.5) (usleep 2000000) ; PAUSE (usleep 2000000) (clearscreen) (usleep 1000000) (textposition 'center 'middle) (clearscreen) (filter 'truecolor #t) (message "innew2") (textsleep) (display) (palette 1 316179017 0) (formula 'mandel) (angle -269) (maxiter 23) (outcoloring 7) (incoloring 3) (plane 0) (view -1.1191 0.018307 0.73169 0.73169) (usleep 2000000) (palette 1 1803744779 0) (formula 'barnsley) (juliaseed 0.91678779069767447766 0) (maxiter 23) (outcoloring 7) (incoloring 3) (plane 3) (view 1.004 0.0282 3.964 3.964) (usleep 2000000) (palette 1 1859447053 0) (formula 'barnsley) (juliaseed -0.001876576933332209287 -0.98171852920553827619) (maxiter 23) (outcoloring 7) (incoloring 3) (plane 5) (view 0.01817 -0.02144 1.726 1.726) (usleep 2000000) (palette 1 1682767831 0) (formula 'barnsley) (juliaseed 0.00091118775333588145765 1.1002594413894568254) (angle 269) (maxiter 29) (outcoloring 0) (incoloring 3) (plane 2) (view 1.016 -0.01369 4.394 4.394) (usleep 2000000) (palette 1 1119368436 0) (formula 'barnsley) (juliaseed -0.015201007401092396162 1.0175332998187412144) (angle 53.3) (maxiter 23) (outcoloring 7) (incoloring 3) (plane 0) (view -0.02133 -0.02183 1.838 1.838) (usleep 2000000) (palette 1 80287465 0) (filter 'edge #f) (filter 'edge2 #f) (filter 'starfield #f) (filter 'stereogram #f) (filter 'interlace #f) (filter 'blur #f) (formula 'barnsley) (juliaseed 0.010537790697674419326 -1.0000000000000000644) (maxiter 29) (outcoloring 0) (incoloring 3) (plane 0) (view 0.99367 0.0082224 0.18176 0.18176) (usleep 2000000) (palette 1 968576081 0) (formula 'barnsley) (angle 269) (maxiter 4) (outcoloring 0) (incoloring 3) (julia #f) (plane 6) (view 0.673 -0.08436 4.728 4.728) (usleep 2000000) (palette 1 1643640198 0) (formula 'barnsley) (juliaseed -0.041208426610812590712 0.99591053493170438997) (angle 269) (maxiter 31) (outcoloring 0) (incoloring 3) (plane 1) (view 0.001472 0.0498 1.796 1.796) (usleep 2000000) (palette 1 138178840 0) (formula 'barnsley) (juliaseed 0.56081884115315299691 -0.89205234389379667564) (angle 269) (maxiter 31) (outcoloring 0) (incoloring 3) (plane 0) (view -0.03214 0.1208 2.07 2.07) (usleep 2000000) (palette 1 1481811987 0) (formula 'barnsley) (juliaseed -1.0245174137601370517 -0.022967925537881418383) (angle -55.2) (maxiter 31) (outcoloring 0) (incoloring 3) (plane 6) (view 0.194 2.18 17.8 17.8) (usleep 2000000) (palette 1 518577061 0) (formula 'barnsley) (juliaseed -0.99582122093023262217 -0.010416666666666667389) (maxiter 31) (outcoloring 0) (incoloring 3) (plane 0) (view 0.01581 -0.01563 2.5 2.5) (usleep 2000000) (palette 1 518577061 0) (formula 'barnsley) (angle -33.3) (maxiter 31) (outcoloring 0) (incoloring 3) (julia #f) (plane 0) (view 0.607805 -1.06162 0.0167152 0.0167152) (usleep 2000000) (palette 1 2038512389 0) (formula 'barnsley) (juliaseed 0.99846306178704001907 0.57668952404741158693) (maxiter 23) (outcoloring 0) (incoloring 3) (plane 3) (view 0.6589 0.2169 1.823 1.823) (usleep 4000000) (filter 'truecolor #f) ; PAUSE (usleep 2000000) (clearscreen) (usleep 1000000) (textposition 'center 'middle) (clearscreen) (filter 'truecolor #t) (message "innew3") (textsleep) (display) (palette 3 468582392 0) (formula 'barnsley) (juliaseed -0.010537790697674419217 -1.212500000000000078) (angle 271) (maxiter 9) (outcoloring 0) (incoloring 4) (plane 6) (view 0.9442 -0.01611 1.387 1.387) (usleep 3000000) (palette 3 1742583910 0) (formula 'barnsley) (juliaseed 0.010537790697674419326 -1.0375000000000000668) (angle -216) (maxiter 9) (outcoloring 0) (incoloring 4) (plane 6) (view -0.743 0.164 12.5 12.5) (usleep 3000000) (palette 3 1922881361 0) (formula 'mandel9) (juliaseed 0.0052688957935183619152 -0.91151897227867659647) (angle 67.7) (maxiter 4) (outcoloring 0) (incoloring 8) (julia #t) (plane 6) (view 2.3932 -0.56 0.2259 0.2259) (usleep 3000000) (palette 2 1535806032 0) (formula 'barnsley) (juliaseed -0.67135237886336130721 0.92851329576250411335) (angle -128) (maxiter 8) (outcoloring 0) (incoloring 9) (plane 0) (view -0.04962 0.03751 1.198 1.198) (usleep 3000000) (palette 1 846255931 0) (formula 'barnsley) (juliaseed 0.074439009100257388105 0.88620092354082617898) (angle 123) (maxiter 3) (outcoloring 0) (incoloring 5) (plane 6) (view 0.3535 0.5206 7.212 7.212) (usleep 3000000) (palette 2 6684175 0) (formula 'barnsley) (juliaseed 0.074439009100257388105 0.88620092354082617898) (angle 310) (maxiter 3) (outcoloring 0) (incoloring 5) (plane 6) (view 0.9466 0.09311 5.669 5.669) (usleep 3000000) (palette 2 1422922994 0) (formula 'barnsley) (juliaseed 0.047900685112174212223 -1.1176182980173389645) (angle 228) (maxiter 5) (outcoloring 0) (incoloring 5) (plane 1) (view -0.1973 0.1771 4.156 4.156) (usleep 3000000) (palette 3 253325190 0) (formula 'octo) (angle -89.5) (maxiter 16) (outcoloring 0) (incoloring 6) (plane 6) (view 0.80469 0.0042014 0.8064 0.8064) (usleep 3000000) (palette 3 613694942 0) (formula 'barnsley) (angle -268) (maxiter 11) (outcoloring 0) (incoloring 6) (julia #f) (plane 6) (view 6.5 -0.688 15.2 15.2) (usleep 3000000) (palette 2 1521309623 0) (formula 'barnsley) (juliaseed 0.40294328013732376469 -0.45674577975254680885) (angle -270) (maxiter 1) (outcoloring 0) (incoloring 6) (plane 2) (view -1.776 -0.0682 4.625 4.625) (usleep 3000000) (palette 2 839761076 0) (formula 'barnsley) (juliaseed -0.93786337209302331614 0.41250000000000002658) (angle -135) (maxiter 1) (outcoloring 0) (incoloring 6) (plane 5) (view 0.01039 0.1092 2.344 2.344) (usleep 3000000) (palette 3 891744458 0) (formula 'barnsley) (juliaseed -0.0049611145721308544951 0.99265333408822306973) (angle -271) (maxiter 6) (outcoloring 0) (incoloring 7) (plane 2) (view -1.868 0.01462 5.271 5.271) (usleep 4000000) (filter 'truecolor #f) XaoS-release-4.3.2/tutorial/intro.xaf000066400000000000000000000062031455214672000175150ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (defaultpalette 0) (load "head.xhf") (load "keys.xhf") (range 50) (formula 'barnsley) (angle 0) (maxiter 7) (outcoloring 0) (incoloring 0) (plane 0) (view 0.63179 0.75369 0.41932 0.41932) (clearscreen) (message "fractal") (usleep 5000000) (clearscreen) (message "fractal1") (textsleep) (clearscreen) (message "fractal2") (textsleep) (clearscreen) (message "fractal3") (textsleep) (clearscreen) (message "fractal4") (textsleep) (clearscreen) (message "fractal5") (textsleep) (maxiter 9) (display) (message "fractal6") (textsleep) (maxiter 11) (message "fractal7") (textsleep) (maxiter 12) (message "fractal8") (textsleep) (display) (maxiter 13) (usleep 1000000) (maxiter 14) (usleep 500000) (maxiter 15) (usleep 200000) (maxiter 17) (usleep 200000) (maxiter 20) (usleep 200000) (maxiter 25) (textposition 'center 'bottom) (message "fractal9") (textsleep) (display) (message "facts") (textsleep) (display) (usleep 1000000) (message "fact1") (textsleep) (display) (morphview 0.0 0.0 2.5 2.5) (usleep 6000000) (wait) (display) (message "fact2") (textsleep) (display) (message "fact3") (textsleep) (display) ;(message "fact4") ;(textsleep) (display) (message "fact5") (textsleep) (display) (message "fact6") (textsleep) (display) (usleep 1000000) (clearscreen) (usleep 1000000) ;(textposition 'center 'middle) (message "fmath4") (textsleep) ;(clearscreen) ;(usleep 1000000) (message "fmath5") (textsleep) (clearscreen) (textposition 'center 'bottom) (message "fmath6") (linekey 0) (line 'scaled 0.05 0.5 0.05 0.5) (morphlastline 'scaled 0.05 0.5 0.95 0.5) (usleep 1000000) (textsleep) (clearscreen) (load "flake1.xhf") (message "fmath7") (usleep 1000000) (textsleep) (message "fmath8") (textsleep) (message "fmath9") (textsleep) (clearscreen) (load "flake2.xhf") (message "fmath10") (usleep 1000000) (textsleep) (clearscreen) (load "flake3.xhf") (message "fmath11") (usleep 500000) (clearscreen) (load "flake4.xhf") (message "fmath12") (usleep 500000) (textsleep) (message "fmath13") (textsleep) (message "fmath14") (textsleep) (load "flake5.xhf") (usleep 2000000) (text "") (usleep 2000000) (message "tree1") (textsleep) (clearscreen) (textposition 'center 'bottom) (message "tree2") (line 'scaled 0.500 0.800 0.500 0.500) (line 'scaled 0.500 0.500 0.500 0.200) (line 'scaled 0.500 0.500 0.500 0.200) (textsleep) (linekey 0) (morphline 'scaled 0.500 0.800 0.500 0.500) (morphline 'scaled 0.500 0.500 0.650 0.240) (morphline 'scaled 0.500 0.500 0.350 0.240) (usleep 1000000) (usleep 1000000) (clearscreen) (load "tree.xhf") (message "tree3") (usleep 3000000) (text "") (usleep 2000000) (message "nstr") (textsleep) (clearscreen) (message "nstr2") (line 'scaled 0 0.5 0.5 0.5) (line 'scaled 0.5 0.5 1 0.5) (textsleep) (message "nstr3") (linekey 0) (morphline 'scaled 0.000 0.500 0.665 0.680) (morphline 'scaled 0.665 0.680 1.000 0.500) (message "nstr3") (usleep 1000000) (textsleep) (load "coast.xhf") (message "nstr4") (linekey 0) (morphline 'scaled 0 0.5 0 0.5) (morphline 'scaled 1 0.5 1 0.5) (usleep 1000000) (textsleep) (text "") (usleep 1000000) (message "nstr5") (textsleep) XaoS-release-4.3.2/tutorial/iter.xaf000066400000000000000000000506471455214672000173400ustar00rootroot00000000000000;Animation file automatically generated by XaoS 4.0pre2 ; - a realtime interactive fractal zoomer ;Use xaos -play to replay it (initstate) (defaultpalette 0) (formula 'user) (view 0 0 5 5) (usrform "z+(1/z)*(-1)^n") (usleep 2958892) (zoomcenter -0.036363020650572499106 0.15609214017496222341) (zoom) (usleep 12628) (zoomcenter -0.50512921832317822469 -0.068113017154389505613) (animateview -0.0004599 -6.201E-05 4.995 4.995) (usleep 820963) (zoomcenter -0.50873279026478676851 -0.075311766498850337922) (animateview -0.147 -0.01986 3.545 3.545) (usleep 20621) (zoomcenter -0.51229495543543281761 -0.078869782628757682569) (usleep 19122) (zoomcenter -0.51582533374935828356 -0.078869782628757682677) (usleep 19174) (zoomcenter -0.51931937416402432521 -0.085849724073570153528) (usleep 39505) (zoomcenter -0.52275499687137783771 -0.08928134513083368928) (usleep 20807) (zoomcenter -0.52955670667644959152 -0.092678238879166689886) (usleep 183501) (zoomcenter -0.53266740396611493482 -0.095785312976430132771) (usleep 20675) (zoomcenter -0.54497844739176919322 -0.10500784105684267346) (usleep 21146) (zoomcenter -0.55717157424261605156 -0.11414203471386741566) (usleep 21122) (zoomcenter -0.56018856085622740311 -0.11414203471386741577) (usleep 160825) (zoomcenter -0.56297340320923414201 -0.11692363341481986196) (animateview -0.2357 -0.03798 2.745 2.745) (usleep 889735) (zoomcenter -0.56478321853498043349 -0.11873134075366595873) (animateview -0.3506 -0.0657 1.782 1.782) (usleep 22098) (zoomcenter -0.56657423414548585647 -0.11873134075366595873) (usleep 22663) (zoomcenter -0.56657423414548585636 -0.12050130565689074982) (usleep 139752) (zoomcenter -0.5682299273660215901 -0.12215507040463150808) (usleep 31000) (zoomcenter -0.56985741115567818183 -0.12378065857849787483) (usleep 21975) (zoomcenter -0.57308048970134121134 -0.13021930749232548579) (usleep 22487) (zoomcenter -0.57786459435628814208 -0.13659068396853338132) (usleep 23115) (zoomcenter -0.58101786593889167447 -0.14288988157190955091) (usleep 30044) (zoomcenter -0.58101786593889167447 -0.14444702450552960953) (usleep 25435) (zoomcenter -0.58255427340625130512 -0.14751626037141407632) (usleep 66996) (zoomcenter -0.58255427340625130512 -0.14900169639343308043) (usleep 80229) (zoomcenter -0.58541404320674251876 -0.15471457414644544111) (usleep 23698) (zoomcenter -0.58541404320674251876 -0.1589481336695267947) (animateview -0.3999 -0.08105 1.391 1.391) (usleep 21895) (zoomcenter -0.58681066290874322772 -0.16452810561244900109) (usleep 21036) (zoomcenter -0.58819252256144351199 -0.17004910612538598404) (usleep 22367) (zoomcenter -0.58956016681786535354 -0.17414725999350786479) (usleep 22861) (zoomcenter -0.58956016681786535343 -0.17549878236003682135) (usleep 30758) (zoomcenter -0.58956016681786535354 -0.17683529706207917086) (usleep 389712) (zoomcenter -0.59066218986229886677 -0.17793603652243184928) (animateview -0.4414 -0.1017 1.086 1.086) (usleep 52398) (zoomcenter -0.59173859870203701004 -0.18008634670216366717) (usleep 23303) (zoomcenter -0.59280309153090764244 -0.18221285261856702998) (usleep 186565) (zoomcenter -0.59280309153090764255 -0.18318395921974198889) (usleep 67171) (zoomcenter -0.59280309153090764249 -0.18412381425992940966) (usleep 462362) (zoomcenter -0.59355473229115545791 -0.18487457954473301012) (animateview -0.48971 -0.12779 0.7395 0.7395) (usleep 27512) (zoomcenter -0.59355473229115545791 -0.18561382053076396945) (usleep 94378) (zoomcenter -0.59426298789253012838 -0.18561382053076396951) (usleep 21592) (zoomcenter -0.59426298789253012838 -0.18631406491707011927) (usleep 795654) (zoomcenter -0.59426298789253012849 -0.18583916946755901947) (animateview -0.52799 -0.14919 0.46858 0.46858) (usleep 1027184) (zoomcenter -0.59310835316512109072 -0.18439755713788445087) (animateview -0.55402 -0.16359 0.28448 0.28448) (usleep 21188) (zoomcenter -0.59253696836623033777 -0.18382683786085877309) (usleep 21867) (zoomcenter -0.59225425792277785933 -0.18354445670509817587) (usleep 596318) (zoomcenter -0.59204228560604256455 -0.18333273128364580027) (animateview -0.56424 -0.16892 0.20852 0.20852) (usleep 26246) (zoomcenter -0.59183301551023826932 -0.18291467858776595343) (usleep 24624) (zoomcenter -0.59162625030932757968 -0.18270815421713708062) (usleep 61348) (zoomcenter -0.59162625030932757962 -0.18250772266133817625) (usleep 137191) (zoomcenter -0.59143855202990357835 -0.18232024300395178635) (usleep 73897) (zoomcenter -0.59143855202990357835 -0.1821394285627748941) (usleep 78192) (zoomcenter -0.59143855202990357835 -0.18196510836741492566) (usleep 81482) (zoomcenter -0.59143855202990357829 -0.1816300188384070749) (usleep 24778) (zoomcenter -0.59143855202990357829 -0.18146462279068043777) (animateview -0.5702 -0.17185 0.16294 0.16294) (usleep 141656) (zoomcenter -0.59143855202990357829 -0.18131026414511915025) (usleep 155025) (zoomcenter -0.59158191766214193383 -0.18102386685159560464) (usleep 21794) (zoomcenter -0.59172367506914840885 -0.18074068226216714589) (usleep 155471) (zoomcenter -0.59185507113099643115 -0.18060943924420883579) (usleep 22299) (zoomcenter -0.59198514892983448039 -0.18047951295381038032) (usleep 132974) (zoomcenter -0.59210711169458306113 -0.18035769224549526229) (animateview -0.57586 -0.17424 0.12002 0.12002) (usleep 653756) (zoomcenter -0.59210711169458306096 -0.18018028996693816009) (animateview -0.580281 -0.175905 0.0873606 0.0873606) (usleep 22878) (zoomcenter -0.59210711169458306102 -0.18009257421491699093) (usleep 162405) (zoomcenter -0.59218826550800253417 -0.18009257421491699093) (usleep 776448) (zoomcenter -0.5922440576729067014 -0.18014830139575837659) (animateview -0.584721 -0.177469 0.0547513 0.0547513) (usleep 162177) (zoomcenter -0.59229549895228835929 -0.1801483013957583766) (usleep 183908) (zoomcenter -0.59234252619498319769 -0.18019527386335536778) (usleep 228951) (zoomcenter -0.59242670405558557118 -0.18023731377047034543) (animateview -0.58657 -0.178127 0.0414061 0.0414061) (usleep 24725) (zoomcenter -0.59250987481951542858 -0.18027885071575824156) (usleep 379559) (zoomcenter -0.59254445745275343094 -0.18027885071575824157) (usleep 24672) (zoomcenter -0.59257861807600554154 -0.18027885071575824158) (usleep 49788) (zoomcenter -0.59261196466015469725 -0.18027885071575824158) (usleep 58183) (zoomcenter -0.59264434473333203225 -0.18027885071575824158) (animateview -0.587939 -0.178621 0.0318988 0.0318988) (usleep 22234) (zoomcenter -0.59270845194954293114 -0.18027885071575824158) (usleep 1277445) (zoomcenter -0.59272567512364268325 -0.18027885071575824158) (animateview -0.590172 -0.179397 0.0169648 0.0169648) (usleep 26885) (zoomcenter -0.59274270914901411138 -0.18029586490070626859) (usleep 25173) (zoomcenter -0.59282677755606692533 -0.18034624719360628247) (usleep 23361) (zoomcenter -0.59286001526216055635 -0.18036284668980269421) (usleep 23540) (zoomcenter -0.59286001526216055635 -0.1803792622116904229) (usleep 608188) (zoomcenter -0.59288446925303490054 -0.18040368771971809925) (animateview -0.590952 -0.179681 0.0120321 0.0120321) (usleep 23765) (zoomcenter -0.59289655974823227938 -0.18041576413248113773) (usleep 24627) (zoomcenter -0.59290850631349631362 -0.18041576413248113772) (usleep 200852) (zoomcenter -0.5929193452119782328 -0.18042659040632910272) (usleep 31305) (zoomcenter -0.59294071490797066383 -0.18042659040632910273) (usleep 90136) (zoomcenter -0.59295093989112147327 -0.18042659040632910273) (usleep 224526) (zoomcenter -0.59296009598260487005 -0.18042659040632910273) (animateview -0.591449 -0.1798674 0.009010607 0.009010607) (usleep 23217) (zoomcenter -0.59296915189823464333 -0.18042659040632910273) (usleep 24070) (zoomcenter -0.59299600485217752896 -0.18042659040632910272) (usleep 23785) (zoomcenter -0.5930048532393547016 -0.18042659040632910272) (usleep 25189) (zoomcenter -0.59300485323935470171 -0.18043532101845908656) (usleep 264992) (zoomcenter -0.59301253444799871306 -0.18043532101845908652) (usleep 37246) (zoomcenter -0.59302008154699579779 -0.18043532101845908654) (usleep 25183) (zoomcenter -0.59302753709610407109 -0.18044276788369800005) (usleep 213814) (zoomcenter -0.59303425638925117878 -0.18044276788369800006) (animateview -0.5918655 -0.1800192 0.006610655 0.006610655) (usleep 242377) (zoomcenter -0.59304620293006350023 -0.18044276788369800007) (usleep 24491) (zoomcenter -0.59306391132683181376 -0.18044276788369800007) (usleep 25135) (zoomcenter -0.59307557318456635578 -0.18044276788369800007) (usleep 109813) (zoomcenter -0.59309217852743374315 -0.18044276788369800005) (usleep 35641) (zoomcenter -0.59311942864144677609 -0.18044276788369800003) (usleep 36539) (zoomcenter -0.59312477972575926186 -0.18044276788369800003) (usleep 97041) (zoomcenter -0.59315030523451968202 -0.18043766872812587397) (animateview -0.5921585 -0.1801218 0.005009071 0.005009071) (usleep 35198) (zoomcenter -0.59319043872285215753 -0.18043265788528185384) (usleep 29058) (zoomcenter -0.59321019389908799887 -0.18043265788528185384) (usleep 29188) (zoomcenter -0.59324427035890105875 -0.18042779548968588638) (usleep 26036) (zoomcenter -0.59324907463893468814 -0.18042779548968588638) (usleep 620795) (zoomcenter -0.59324907463893468824 -0.18042069997222459716) (animateview -0.5924862 -0.1802143 0.003495924 0.003495924) (usleep 24279) (zoomcenter -0.59325258643829720863 -0.18040666913628266949) (usleep 21972) (zoomcenter -0.59325605975129825612 -0.18039973060138048106) (usleep 22955) (zoomcenter -0.59325605975129825617 -0.180396298602239389) (usleep 46726) (zoomcenter -0.59325941903354208694 -0.18039629860223938901) (usleep 297129) (zoomcenter -0.59325651118441031037 -0.18039048967782484697) (usleep 24645) (zoomcenter -0.59325076722787765065 -0.18038475241157983921) (usleep 81266) (zoomcenter -0.59324800659926923919 -0.18038199499842046282) (animateview -0.5926579 -0.1802545 0.002716822 0.002716822) (usleep 205780) (zoomcenter -0.5932480065992692393 -0.18037949615888914749) (usleep 156245) (zoomcenter -0.59324568725575547079 -0.18037486287478385871) (usleep 160761) (zoomcenter -0.59324354527403203139 -0.1803748628747838587) (animateview -0.5927901 -0.1802824 0.00210744 0.00210744) (usleep 82822) (zoomcenter -0.5932414878261930851 -0.18037486287478385872) (usleep 100166) (zoomcenter -0.59324148782619308504 -0.18037290431460929726) (usleep 42063) (zoomcenter -0.59323956645119527717 -0.18037290431460929724) (usleep 80477) (zoomcenter -0.59323771590977550486 -0.18037290431460929724) (usleep 220047) (zoomcenter -0.59323605653483288652 -0.18037290431460929727) (animateview -0.5928914 -0.1803029 0.001632529 0.001632529) (usleep 72981) (zoomcenter -0.59323445494390275834 -0.18037290431460929729) (usleep 48294) (zoomcenter -0.59323289038399504031 -0.18037290431460929727) (usleep 70864) (zoomcenter -0.59323137893598232388 -0.18037290431460929727) (usleep 131166) (zoomcenter -0.59322851838972369567 -0.18037290431460929727) (usleep 519875) (zoomcenter -0.5932296193663844098 -0.18037290431460929731) (animateview -0.5930052 -0.1803264 0.00108381 0.00108381) (usleep 38008) (zoomcenter -0.5932296193663844098 -0.18037398472118648267) (usleep 987551) (zoomcenter -0.59322894999080253456 -0.18037398472118648267) (animateview -0.59309323 -0.18034508 0.00065851433 0.00065851433) (usleep 24653) (zoomcenter -0.5932289499908025345 -0.18037332408512803594) (usleep 833578) (zoomcenter -0.59322850753911971004 -0.1803733240851280359) (animateview -0.5931395 -0.18035471 0.00043399197 0.00043399197) (usleep 248839) (zoomcenter -0.59322850753911971004 -0.18037371490936201281) (usleep 166379) (zoomcenter -0.59322778557520280306 -0.18037371490936201281) (usleep 303310) (zoomcenter -0.59322747375989079416 -0.18037371490936201281) (animateview -0.59316562 -0.18036028 0.00030610759 0.00030610759) (usleep 84759) (zoomcenter -0.59322717517800038772 -0.18037371490936201281) (usleep 62332) (zoomcenter -0.59322688471508342448 -0.18037371490936201283) (usleep 99865) (zoomcenter -0.59322660811175773266 -0.18037371490936201283) (usleep 65915) (zoomcenter -0.59322607273095652957 -0.18037371490936201283) (usleep 146615) (zoomcenter -0.59322582230721429948 -0.18037371490936201284) (usleep 75048) (zoomcenter -0.59322485113500065629 -0.18037395741962161104) (animateview -0.59317953 -0.18036336 0.00023609589 0.00023609589) (usleep 142938) (zoomcenter -0.59322326565112187439 -0.18037463612127125061) (usleep 249942) (zoomcenter -0.59322306509609986833 -0.18037463612127125063) (usleep 107201) (zoomcenter -0.59322211309061880039 -0.1803750164799233774) (animateview -0.593189 -0.18036577 0.00018517006 0.00018517006) (usleep 220325) (zoomcenter -0.5932219420874772716 -0.1803750164799233774) (usleep 76181) (zoomcenter -0.59322177719182688334 -0.18037534588709891653) (usleep 73446) (zoomcenter -0.59322129981312036274 -0.18037566376888457342) (usleep 1938232) (zoomcenter -0.59322123810161719436 -0.18037560212926003191) (animateview -0.593210816 -0.180372406 6.0331186E-05 6.0331186E-05) (usleep 215288) (zoomcenter -0.59322118270492186142 -0.18037560212926003195) (usleep 256631) (zoomcenter -0.59322113385931910169 -0.18037555334055030956) (usleep 41829) (zoomcenter -0.59322108606495035937 -0.18037555334055030954) (animateview -0.593213108 -0.180373111 4.70047899E-05 4.70047899E-05) (usleep 27719) (zoomcenter -0.59322108606495035932 -0.18037550625635723665) (usleep 28389) (zoomcenter -0.59322103951296343205 -0.18037550625635723667) (usleep 100435) (zoomcenter -0.59322095078465793657 -0.1803754619438777461) (usleep 125089) (zoomcenter -0.59322090907919463687 -0.18037542028699098843) (usleep 215308) (zoomcenter -0.59322087149160300935 -0.18037538274317960165) (usleep 26492) (zoomcenter -0.5932207973439163193 -0.18037534571251810783) (animateview -0.593214869 -0.180373635 3.64501062E-05 3.64501062E-05) (usleep 27007) (zoomcenter -0.59322076076420087191 -0.18037527263829984229) (usleep 26519) (zoomcenter -0.59322072464848713967 -0.18037527263829984229) (usleep 25400) (zoomcenter -0.59322068899088941263 -0.18037523702223439083) (usleep 105398) (zoomcenter -0.59322062113585805716 -0.18037520313423587131) (usleep 29402) (zoomcenter -0.593220587698441804 -0.18037516973576593188) (usleep 37478) (zoomcenter -0.59322055483508601413 -0.18037510408560970289) (usleep 116516) (zoomcenter -0.59322049283429914194 -0.18037507312132405215) (usleep 99975) (zoomcenter -0.59322043372084331148 -0.18037504359902240927) (usleep 48786) (zoomcenter -0.59322040483405208742 -0.18037504359902240929) (animateview -0.593216136 -0.18037397 2.83609996E-05 2.83609996E-05) (usleep 1538440) (zoomcenter -0.59322039103377262347 -0.18037504359902240926) (animateview -0.593218383 -0.180374535 1.3431147E-05 1.3431147E-05) (usleep 107081) (zoomcenter -0.59322039103377262347 -0.18037503051074073368) (usleep 289026) (zoomcenter -0.59322037964454753928 -0.18037503051074073367) (usleep 399540) (zoomcenter -0.59322037025619890036 -0.18037503051074073367) (animateview -0.5932190243 -0.1803746944 9.124942994E-06 9.124942994E-06) (usleep 1832228) (zoomcenter -0.59322036640813737197 -0.18037503051074073372) (animateview -0.5932198176 -0.1803748925 3.746519631E-06 3.746519631E-06) (usleep 207937) (zoomcenter -0.59322036292882890883 -0.18037503051074073373) (usleep 312452) (zoomcenter -0.59322035096889859525 -0.18037502752424074496) (animateview -0.5932199395 -0.1803749233 2.909546496E-06 2.909546496E-06) (usleep 69104) (zoomcenter -0.59322034518891641862 -0.18037502463761578095) (usleep 104318) (zoomcenter -0.59322033694764833621 -0.18037502463761578095) (usleep 70825) (zoomcenter -0.59322033429136050551 -0.18037502198442186804) (usleep 349621) (zoomcenter -0.59322032757246611522 -0.18037502198442186806) (animateview -0.593220039 -0.1803749483 2.180311097E-06 2.180311097E-06) (usleep 270892) (zoomcenter -0.59322031972181268775 -0.18037502198442186806) (usleep 65011) (zoomcenter -0.59322031401833167659 -0.18037502198442186807) (usleep 189117) (zoomcenter -0.59322030187365199671 -0.18037502545028876349) (animateview -0.5932201022 -0.1803749649 1.689424577E-06 1.689424577E-06) (usleep 64848) (zoomcenter -0.59322030019420056256 -0.18037502545028876349) (usleep 208423) (zoomcenter -0.59322029107518060051 -0.1803750284864216171) (usleep 140388) (zoomcenter -0.59322028539404452271 -0.18037503132368109732) (usleep 2355357) (zoomcenter -0.59322028494161792956 -0.18037503132368109732) (animateview -0.59322023827 -0.18037501378 4.4002260235E-07 4.4002260235E-07) (usleep 336094) (zoomcenter -0.5932202841730905008 -0.18037503209131338195) (usleep 332429) (zoomcenter -0.59322028417309050075 -0.18037503241806800212) (animateview -0.59322025108 -0.18037501878 3.1799177164E-07 3.1799177164E-07) (usleep 112305) (zoomcenter -0.5932202841730905008 -0.18037503272729023588) (usleep 147423) (zoomcenter -0.59322028359676928159 -0.18037503359076515741) (usleep 74606) (zoomcenter -0.59322028220629098111 -0.18037503553516738984) (usleep 433119) (zoomcenter -0.59322028220629098116 -0.1803750359851630415) (animateview -0.59322026096 -0.18037502372 2.1901930661E-07 2.1901930661E-07) (usleep 110798) (zoomcenter -0.59322028220629098116 -0.18037503619837189587) (usleep 73002) (zoomcenter -0.5932202820004111703 -0.18037503619837189588) (usleep 175417) (zoomcenter -0.59322028181145996237 -0.18037503657583414897) (usleep 207150) (zoomcenter -0.59322028146965422225 -0.18037503708794558057) (animateview -0.59322026601 -0.18037502677 1.6633282068E-07 1.6633282068E-07) (usleep 68698) (zoomcenter -0.59322028146965422225 -0.18037503725301565603) (usleep 394096) (zoomcenter -0.59322028146965422225 -0.1803750373880165622) (usleep 31263) (zoomcenter -0.59322028133641899715 -0.1803750376541766405) (usleep 25094) (zoomcenter -0.59322028120504001041 -0.18037503778540260325) (animateview -0.59322026945 -0.18037502911 1.2925194801E-07 1.2925194801E-07) (usleep 158984) (zoomcenter -0.59322028108332820246 -0.18037503802854269078) (usleep 28232) (zoomcenter -0.59322028072301981902 -0.1803750383884314042) (usleep 34524) (zoomcenter -0.59322028072301981902 -0.18037503850655826462) (usleep 343135) (zoomcenter -0.59322028052255164197 -0.1803750386066756052) (animateview -0.593220272186 -0.180375031321 9.82311812096E-08 9.82311812098E-08) (usleep 47234) (zoomcenter -0.59322028042435392622 -0.18037503880284228448) (usleep 49470) (zoomcenter -0.59322028032854428871 -0.18037503889854032754) (usleep 129217) (zoomcenter -0.5932202802381018325 -0.18037503889854032751) (usleep 2894757) (zoomcenter -0.59322028014932628656 -0.18037503903154854401) (animateview -0.593220278472 -0.180375037236 2.15667151098E-08 2.15667151101E-08) (usleep 1135147) (zoomcenter -0.59322028016210499618 -0.18037503903154854401) (animateview -0.593220279183 -0.180375037997 1.24241532303E-08 1.24241532302E-08) (usleep 4588519) (zoomcenter -0.59322028015935512337 -0.18037503903017520899) (animateview -0.5932202800567 -0.1803750389202 1.336859757986E-09 1.336859758121E-09) (usleep 112168) (zoomcenter -0.59322028015153111658 -0.18037503902496527985) (usleep 76817) (zoomcenter -0.59322028014776621006 -0.18037503902120475852) (usleep 4400745) (zoomcenter -0.59322028014791235851 -0.18037503902120475859) (stop) (animateview -0.59322028013804 -0.1803750390104 1.4376604995456E-10 1.4376604961575E-10) (usleep 18655) (zoomcenter -0.59322028014834610735 -0.18037503902163800225) (usleep 17139) (zoomcenter -0.59322028014963745568 -0.18037503902321447852) (usleep 17533) (zoomcenter -0.59322028015376611012 -0.18037503902705392096) (usleep 18475) (zoomcenter -0.59322028015771575266 -0.18037503902874465331) (usleep 16595) (zoomcenter -0.59322028016555906319 -0.18037503903322132476) (usleep 16447) (zoomcenter -0.59322028017891173296 -0.18037503904072345322) (usleep 16430) (zoomcenter -0.59322028019852510487 -0.18037503905120852409) (usleep 16428) (zoomcenter -0.59322028021197361882 -0.18037503905888443828) (usleep 16126) (zoomcenter -0.59322028022342831126 -0.18037503906651200529) (usleep 16290) (zoomcenter -0.59322028023210255396 -0.18037503907273935542) (usleep 16863) (zoomcenter -0.59322028023776164689 -0.1803750390765076897) (usleep 16680) (zoomcenter -0.59322028024124553964 -0.18037503907838144695) (usleep 304863) (animateview -0.59322028014803 -0.18037503901721 1.2384458318885E-10 1.2384458297201E-10) (usleep 574211) (animateview -0.59322028014879 -0.1803750390177 1.2284249995258E-10 1.2284249988482E-10) (usleep 512446) (animateview -0.59322028014879 -0.1803750390177 1.2284249995258E-10 1.2284249988482E-10) (usleep 545369) (animateview -0.59322028014879 -0.1803750390177 1.2284249995258E-10 1.2284249988482E-10) (usleep 514099) (animateview -0.59322028014879 -0.1803750390177 1.2284249995258E-10 1.2284249988482E-10) XaoS-release-4.3.2/tutorial/julia.xaf000066400000000000000000000213111455214672000174630ustar00rootroot00000000000000(load "head.xhf") (range 65536) ; optimize speed - images here are hard to missguess ;(palette 1 780175578 0) (palette 2 1449951317 0) (view -0.22311 -0.018983 0.54779 0.54779) (textposition 'center 'middle) (message "juliach") (usleep 5000000) (display) (smoothmorph 'view 0 3000000) (morphview -0.75 0.0 2.5 2.5) (usleep 2000000) (textposition 'center 'bottom) (message "julia") (textsleep) (display) (message "julia1") (textsleep) (display) (fastjulia #t) (juliaseed -0.75470740436081123169 0.27208353381654335628) (display) (message "julia2") (usleep 3000000) (display) (message "julia3") (textsleep) (display) (message "julia4") (textsleep) (display) (message "julia5") (textsleep) (display) (message "julia6") (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (linekey 0) (smoothmorph 'line 0 200000) (morphline 'fractal -0.788041 0.23875 -0.788041 0.305417) (morphline 'fractal -0.788041 0.305417 -0.721374 0.305417) (morphline 'fractal -0.788041 0.23875 -0.721374 0.23875) (morphline 'fractal -0.721374 0.305417 -0.721374 0.23875) (usleep 500000) (color 'white) (textsleep) (message "julia7") (textsleep) (smoothmorph 'line 500000 500000) (smoothmorph 'julia 500000 500000) (morphjulia 0 0) (linekey 0) (morphline 'fractal -0.0333333 -0.0333333 -0.0333333 0.0333333) (morphline 'fractal -0.0333333 0.0333333 0.0333333 0.0333333) (morphline 'fractal -0.0333333 -0.0333333 0.0333333 -0.0333333) (morphline 'fractal 0.0333333 0.0333333 0.0333333 -0.0333333) (message "julia8") (usleep 1000000) (textsleep) (smoothmorph 'line 500000 500000) (smoothmorph 'julia 500000 500000) (morphjulia -0.76053779069767441922 -0.16250000000000001043) (linekey 0) (morphline 'fractal -0.793871 -0.195833 -0.793871 -0.129167) (morphline 'fractal -0.793871 -0.129167 -0.727204 -0.129167) (morphline 'fractal -0.793871 -0.195833 -0.727204 -0.195833) (morphline 'fractal -0.727204 -0.129167 -0.727204 -0.195833) (message "julia9") (usleep 1000000) (textsleep) (message "julia10") (textsleep) (display) (juliaseed 0.36700581395348844398 0.025) (smoothmorph 'line 500000 0) (smoothmorph 'julia 500000 0) (linekey 0) (line 'fractal 0.333672 -0.00833333 0.333672 0.0583333) (line 'fractal 0.333672 0.0583333 0.400339 0.0583333) (line 'fractal 0.333672 -0.00833333 0.400339 -0.00833333) (line 'fractal 0.400339 0.0583333 0.400339 -0.00833333) (morphjulia 0.33539244186046518622 -0.0125) (linekey 0) (morphline 'fractal 0.302059 -0.0458333 0.302059 0.0208333) (morphline 'fractal 0.302059 0.0208333 0.368726 0.0208333) (morphline 'fractal 0.302059 -0.0458333 0.368726 -0.0458333) (morphline 'fractal 0.368726 0.0208333 0.368726 -0.0458333) (usleep 1000000) (smoothmorph 'line 0 0) (smoothmorph 'julia 0 0) (morphjulia 0.3775436046511628633 -0.6125) (linekey 0) (morphline 'fractal 0.34421 -0.645833 0.34421 -0.579167) (morphline 'fractal 0.34421 -0.579167 0.410877 -0.579167) (morphline 'fractal 0.34421 -0.645833 0.410877 -0.645833) (morphline 'fractal 0.410877 -0.579167 0.410877 -0.645833) (usleep 1000000) (morphjulia -0.086119186046511585078 -0.975) (linekey 0) (morphline 'fractal -0.119453 -1.00833 -0.119453 -0.941667) (morphline 'fractal -0.119453 -0.941667 -0.0527859 -0.941667) (morphline 'fractal -0.119453 -1.00833 -0.0527859 -1.00833) (morphline 'fractal -0.0527859 -0.941667 -0.0527859 -1.00833) (usleep 1000000) (morphjulia -0.59193313953488371076 -0.65) (linekey 0) (morphline 'fractal -0.625266 -0.683333 -0.625266 -0.616667) (morphline 'fractal -0.625266 -0.616667 -0.5586 -0.616667) (morphline 'fractal -0.625266 -0.683333 -0.5586 -0.683333) (morphline 'fractal -0.5586 -0.616667 -0.5586 -0.683333) (usleep 1000000) (morphjulia -0.76053779069767441922 -0.1375) (linekey 0) (morphline 'fractal -0.793871 -0.170833 -0.793871 -0.104167) (morphline 'fractal -0.793871 -0.104167 -0.727204 -0.104167) (morphline 'fractal -0.793871 -0.170833 -0.727204 -0.170833) (morphline 'fractal -0.727204 -0.104167 -0.727204 -0.170833) (usleep 1000000) (morphjulia -0.77107558139534883854 0.175) (linekey 0) (morphline 'fractal -0.804409 0.141667 -0.804409 0.208333) (morphline 'fractal -0.804409 0.208333 -0.737742 0.208333) (morphline 'fractal -0.804409 0.141667 -0.737742 0.141667) (morphline 'fractal -0.737742 0.208333 -0.737742 0.141667) (usleep 1000000) (morphjulia -0.57085755813953487222 0.6625) (linekey 0) (morphline 'fractal -0.604191 0.629167 -0.604191 0.695833) (morphline 'fractal -0.604191 0.695833 -0.537524 0.695833) (morphline 'fractal -0.604191 0.629167 -0.537524 0.629167) (morphline 'fractal -0.537524 0.695833 -0.537524 0.629167) (usleep 1000000) (morphjulia -0.10719476744186042373 0.925) (linekey 0) (morphline 'fractal -0.140528 0.891667 -0.140528 0.958333) (morphline 'fractal -0.140528 0.958333 -0.0738614 0.958333) (morphline 'fractal -0.140528 0.891667 -0.0738614 0.891667) (morphline 'fractal -0.0738614 0.958333 -0.0738614 0.891667) (usleep 1000000) (morphjulia 0.34593023255813960533 0.625) (linekey 0) (morphline 'fractal 0.312597 0.591667 0.312597 0.658333) (morphline 'fractal 0.312597 0.658333 0.379264 0.658333) (morphline 'fractal 0.312597 0.591667 0.379264 0.591667) (morphline 'fractal 0.379264 0.658333 0.379264 0.591667) (usleep 1000000) (morphjulia 0.28270348837209308981 0) (linekey 0) (morphline 'fractal 0.24937 -0.0333333 0.24937 0.0333333) (morphline 'fractal 0.24937 0.0333333 0.316037 0.0333333) (morphline 'fractal 0.24937 -0.0333333 0.316037 -0.0333333) (morphline 'fractal 0.316037 0.0333333 0.316037 -0.0333333) (usleep 1000000) (morphjulia 0.36700581395348844398 0.025) (linekey 0) (morphline 'fractal 0.333672 -0.00833333 0.333672 0.0583333) (morphline 'fractal 0.333672 0.0583333 0.400339 0.0583333) (morphline 'fractal 0.333672 -0.00833333 0.400339 -0.00833333) (morphline 'fractal 0.400339 0.0583333 0.400339 -0.00833333) (usleep 1000000) (morphjulia 0.36700581395348844398 0.025) (linekey 0) (morphline 'fractal 0.333672 -0.00833333 0.333672 0.0583333) (morphline 'fractal 0.333672 0.0583333 0.400339 0.0583333) (morphline 'fractal 0.333672 -0.00833333 0.400339 -0.00833333) (morphline 'fractal 0.400339 0.0583333 0.400339 -0.00833333) (smoothmorph 'line 0 500000) (smoothmorph 'julia 0 500000) (usleep 1000000) ;(display) (fastjulia #f) (wait) (message "theme") (linekey 0) (smoothmorph 'line 500000 0) (morphline 'screen 1 0 1 0) (morphline 'screen 1 0 1 0) (morphline 'screen 1 0 1 0) (morphline 'screen 1 0 1 0) (usleep 500000) (textsleep) (display) (message "theme1") (usleep 500000) ;(palette 1 662060676 0) ;(palette 1 598022471 0) ;(palette 3 2053063861 0) ;(palette 3 389600437 0) (palette 2 179327363 0) (smoothmorph 'view 1000000 1000000) (morphview -0.563733 -0.642253 0.0193372 0.0193372) (usleep 5000000) (display) (wait) (display) (message "theme2") (textsleep) (julia #t) (juliaseed -0.56373290058361424286 -0.64225330414353426158) (message "theme3") (usleep 1000000) (morphview 0 0 2.5 2.5) (usleep 4000000) (display) (wait) (message "theme4") (textsleep) (display) (message "theme5") (textsleep) (display) (message "theme6") (morphview -0.0075841 0.00025775 0.12745 0.12745) (usleep 6000000) (wait) (message "theme7") (textsleep) (display) (message "theme8") (textsleep) (display) (palette 1 155652149 0) (periodicity #t) (juliaseed 0.29449576229535342093 -0.016332967445424519366) (maxiter 127) (outcoloring 1) (incoloring 0) (julia #t) (view 0.000765158 -0.000268691 0.0186372 0.0186372) (usleep 1000000) (morphview 0 0 2.5 2.5) (usleep 10000000) (display) (wait) (usleep 1000000) (palette 1 1843312520 0) (juliaseed -0.72892441860465116144 -0.17500000000000001123) (maxiter 170) (outcoloring 1) (incoloring 0) (julia #t) (plane 1) (view 0.462 1.25 56.2 56.2) (usleep 3000000) (palette 1 1191063399 0) (juliaseed 0.30305461922625852807 0.4504536191559173757) (angle 0) (maxiter 388) (outcoloring 0) (incoloring 0) (julia #t) (plane 0) (view -0.052981 -0.50406 0.13039 0.13039) (palette 1 1112927008 0) (juliaseed -0.08085029069767437552 0.68229166666666671054) (maxiter 170) (outcoloring 1) (incoloring 1) (julia #t) (plane 0) (view 0 0 2.5 2.5) (usleep 1000000) (morphview 0.239593 -0.462394 0.0574963 0.0574963) (usleep 4000000) (wait) (usleep 1000000) (palette 2 1442034059 0) (juliaseed 0.093023255813953431353 -0.64999999999999995623) (outcoloring 2) (julia #t) (view 0.141299 0.507061 0.0383528 0.0383528) (usleep 2000000) (palette 1 1231368671 0) (juliaseed -0.76746965570853886306 0.067526146212247640361) (angle -31.099) (maxiter 290) (outcoloring 2) (incoloring 1) (view -0.49868 0.045671 0.28353 0.28353) (usleep 2000000) (palette 1 1034201341 0) (juliaseed 0.27541729708396692038 -0.0067143955333554104651) (angle -30.559) (maxiter 227) (julia #t) (plane 4) (incoloring 0) (range 65536) (view 3.3489798 1.1601067 0.00095219583 0.00095219583) (smoothmorph 'view 3000000 3000000) (morphview 0.396 0.209 19.1 19.1) (usleep 25000000) (wait) (usleep 1000000) XaoS-release-4.3.2/tutorial/keys.xhf000066400000000000000000000001241455214672000173400ustar00rootroot00000000000000(textposition 'center 'middle) (clearscreen) (message "keys") (textsleep) (display) XaoS-release-4.3.2/tutorial/line1.xhf000066400000000000000000000006331455214672000174020ustar00rootroot00000000000000(clearlines) (linekey 0) (color 'red) (line 'scaled 0.4 0.5 0.6 0.5) (line 'scaled 0.4 0.49 0.4 0.51) (line 'scaled 0.6 0.49 0.6 0.51) (color 'white) (textsleep) (linekey 0) (morphline 'scaled 0.3 0.5 0.7 0.5) (morphline 'scaled 0.3 0.49 0.3 0.51) (morphline 'scaled 0.7 0.49 0.7 0.51) (usleep 1000000) (line 'scaled 0.5 0.49 0.5 0.49) (morphlastline 'scaled 0.5 0.49 0.5 0.51) (usleep 500000) (usleep 1000000) XaoS-release-4.3.2/tutorial/magnet.xaf000066400000000000000000000121451455214672000176370ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "intro7") (usleep 5000000) (display) (defaultpalette 0) (textposition 'center 'bottom) (formula 'magnet) (angle 0) (outcoloring 0) (plane 0) (view 2.0193 -1.6338 0.17812 0.26124) (message "magnet") (textsleep) (display) (morphview 1.5 0 3 4.4) (usleep 6000000) (wait) (message "magnet1") (textsleep) (display) (message "magnet2") (textsleep) (display) (palette 1 2104064959 0) (formula 'magnet) (angle -361) (maxiter 170) (outcoloring 0) (plane 0) (view 1.847209822 -1.339254931 7.031666521E-06 1.03131109E-05) (message "similiar") (textsleep) (display) (palette 1 1979730731 0) (formula 'magnet) (angle 26.7) (outcoloring 6) (plane 0) (view -0.33728908 -0.37438809 0.00018856268 0.0002765586) (usleep 2000000) (palette 1 765726463 0) (formula 'magnet) (angle 88.3) (outcoloring 6) (plane 0) (view -0.3371366 -0.37663387 0.00069439878 0.0010184515) (usleep 2000000) (palette 1 1510803482 0) (formula 'magnet) (angle -269) (outcoloring 1) (plane 0) (view 1.275 0.006127 0.14027 0.20573) (usleep 2000000) (palette 1 1734551171 0) (formula 'magnet) (angle -88.8) (outcoloring 8) (incoloring 0) (plane 0) (view 2.095 -0.01928 1.292 1.895) (usleep 3000000) (palette 1 258644272 0) (formula 'magnet) (angle -540) (outcoloring 0) (plane 0) (view 1.2689826 -2.0404879 0.000258881 0.00037969213) (usleep 1000000) (morphview 1.5 0 3 4.4) (usleep 10000000) (wait) (juliaseed 1.5404263026792413359 1.2313365559633509793) (fastjulia #t) (message "magjulia") (textsleep) (display) (line 'fractal 1.5404263026792413359 1.2313365559633509793 1.5404263026792413359 1.2313365559633509793) (line 'fractal 1.5404263026792413359 1.2313365559633509793 1.5404263026792413359 1.2313365559633509793) (line 'fractal 1.5404263026792413359 1.2313365559633509793 1.5404263026792413359 1.2313365559633509793) (line 'fractal 1.5404263026792413359 1.2313365559633509793 1.5404263026792413359 1.2313365559633509793) (linekey 0) (morphline 'fractal 1.51043 1.20134 1.57043 1.20134) (morphline 'fractal 1.57043 1.20134 1.57043 1.26134) (morphline 'fractal 1.51043 1.26134 1.57043 1.26134) (morphline 'fractal 1.51043 1.20134 1.51043 1.26134) (usleep 1000000) (morphjulia 1.4602 -1.209) (linekey 0) (morphline 'fractal 1.4302 -1.239 1.4902 -1.239) (morphline 'fractal 1.4902 -1.239 1.4902 -1.179) (morphline 'fractal 1.4302 -1.179 1.4902 -1.179) (morphline 'fractal 1.4302 -1.239 1.4302 -1.179) (usleep 3000000) (morphjulia -0.3184 -1.1289) (linekey 0) (morphline 'fractal -0.3484 -1.1589 -0.2884 -1.1589) (morphline 'fractal -0.2884 -1.1589 -0.2884 -1.0989) (morphline 'fractal -0.3484 -1.0989 -0.2884 -1.0989) (morphline 'fractal -0.3484 -1.1589 -0.3484 -1.0989) (usleep 3000000) (morphjulia -0.273 1.378) (linekey 0) (morphline 'fractal -0.303 1.348 -0.243 1.348) (morphline 'fractal -0.243 1.348 -0.243 1.408) (morphline 'fractal -0.303 1.408 -0.243 1.408) (morphline 'fractal -0.303 1.348 -0.303 1.408) (usleep 3000000) (morphjulia 1.5404 1.2313) (linekey 0) (morphline 'fractal 1.5104 1.2013 1.5704 1.2013) (morphline 'fractal 1.5704 1.2013 1.5704 1.2613) (morphline 'fractal 1.5104 1.2613 1.5704 1.2613) (morphline 'fractal 1.5104 1.2013 1.5104 1.2613) (usleep 3000000) (linekey 0) (morphline 'fractal 1.5404 1.2313 1.5404 1.2313) (morphline 'fractal 1.5404 1.2313 1.5404 1.2313) (morphline 'fractal 1.5404 1.2313 1.5404 1.2313) (morphline 'fractal 1.5404 1.2313 1.5404 1.2313) (usleep 1000000) (display) (fastjulia #f) (palette 1 999460631 0) (formula 'magnet) (juliaseed 2.0193023255813953853 -0.022000000000000001542) (angle -268) (maxiter 251) (outcoloring 1) (julia #t) (plane 0) (view -0.02084 0.04831 4.953 7.265) (usleep 3000000) (palette 1 523407644 0) (formula 'magnet) (juliaseed -0.057906976744186156036 0) (angle 89.6) (maxiter 170) (outcoloring 1) (julia #t) (plane 0) (view 0.88499 0.039171 0.7298 1.0704) (palette 1 1982820186 0) (formula 'magnet) (juliaseed 1.2774418604651162634 -0.92400000000000006488) (outcoloring 0) (julia #t) (plane 1) (view 157 380 94.4 138) (usleep 2000000) (palette 1 1716597759 0) (formula 'magnet) (juliaseed 3.0208139534883721999 -0.022000000000000001542) (angle -88.9) (outcoloring 1) (julia #t) (plane 0) (view -0.9297 -0.02747 1.683 2.468) (usleep 3000000) (palette 1 98634059 0) (formula 'magnet) (juliaseed -0.26191860465116291456 -0.022000000000000001542) (angle -274) (maxiter 170) (outcoloring 7) (julia #t) (plane 0) (view 0.9202 0.05028 1.371 2.01) (usleep 3000000) (palette 1 952140389 0) (formula 'magnet) (juliaseed 1.3330813953488371976 0) (outcoloring 9) (julia #t) (plane 5) (view -0.01039 0.008669 1.341 1.966) (usleep 3000000) (palette 1 2094414250 0) (formula 'magnet) (juliaseed 1.6483720930232558244 0) (angle -91.6) (outcoloring 7) (julia #t) (plane 0) (view -0.011859 0.016696 0.8126 1.1918) (usleep 3000000) (display) (palette 3 1083366997 0) (textposition 'center 'bottom) (formula 'magnet2) (angle 0) (outcoloring 0) (plane 0) (view 1 0 3 3.2) (message "magnet3") (textsleep) (display) (morphview 1.94584 -0.90656 0.0534806 0.057046) (usleep 6000000) (wait) XaoS-release-4.3.2/tutorial/mset.xaf000066400000000000000000000115231455214672000173330ustar00rootroot00000000000000(load "head.xhf") (range 65536) (textposition 'center 'bottom) ; Mandelbrot set part (defaultpalette 0) (filter 'stereogram #f) (filter 'interlace #f) (filter 'edge #t) (filter 'edge2 #f) (filter 'blur #t) (formula 'mandel) (display) (maxiter 1) (message "fact7") (outcoloring 0) (incoloring 0) (plane 0) (view -0.75 0 .1 .1) ;(usleep 1000000) (wait) (view -0.75 0 2.5 2.5) (wait) (maxiter 2) (wait) (maxiter 3) (wait) (maxiter 4) (wait) (maxiter 5) (wait) (maxiter 6) (wait) (display) (maxiter 8) (wait) (maxiter 10) (wait) (maxiter 12) (wait) (maxiter 14) (wait) (maxiter 20) (wait) (maxiter 30) (wait) (maxiter 200) (wait) (filter 'edge #f) (wait) (message "mset") (usleep 3000000) (display) (usleep 1000000) (display) (message "mset1") (textsleep) (display) (text "z=z^2+c") (usleep 3000000) (display) (message "mset2") (textsleep) (view -0 0 .3 .3) (wait) (display) (textposition 'center 'bottom) (view 0.0 0.0 0.3 0.3) (message "mset3") (filter 'blur #f) (smoothmorph 'view 1000000 1000000) (morphview -0.75 0 2.5 2.5) (usleep 5000000) (display) (wait) (message "mset4") (textsleep) (display) (message "mset5") (periodicity #f) ;FIXME periodicity makes problems here (morphview -1.76329 -0.00180622 0.0480762 0.0480762) (usleep 4000000) (display) (wait) (message "mset6") (textsleep) (periodicity #t) (display) (usleep 1000000) (message "mset7") (textsleep) (display) (message "mset8") (textsleep) (display) (morphview -1.78384796 -0.0156186314 3.28608553E-05 3.28608553E-05) (usleep 5000000) (wait) (message "mset9") (textsleep) (display) (message "mset10") (textsleep) ;An gray mandelbrot (display) (palette 1 344773041 0) (periodicity #t) (maxiter 600) (angle 206) (view -0.69697092226 -0.44313598753 2.1102342597E-07 2.1102342597E-07) (usleep 3000000) ;A yellow mandelbrot (palette 1 1322755214 0) (angle 276) (view -0.1797721 -0.8418266 0.001259123 0.001259123) (usleep 3000000) ; Blue mandelbrot (palette 3 420905417 0) (angle 0) (formula 'mandel) (maxiter 520) (view -0.76938957 -0.11612439 0.0003879837 0.0003879837) (usleep 3000000) ;(palette 2 31632178 0) ;(angle 0) ;(outcoloring 1) ;(view -1.9854567 -1.351727E-05 0.00029196024 0.00029196024) ;(usleep 3000000) ;A strange purple mandelbrot (outcoloring 0) (palette 1 2003101440 0) (angle 220) (autorotate #f) (maxiter 204) (view 0.3146669 -0.02931828 0.001555872 0.001555872) (usleep 3000000) (angle 0) (palette 1 739115845 0) (formula 'mandel) (maxiter 170) (display) (color 'black) (textposition 'center 'bottom) (message "nat") (textsleep) (display) (message "nat1") (textsleep) (display) (message "nat2") (textsleep) (display) (message "nat3") (morphview -0.354983 0.638129 0.0145266 0.0145266) (color 'white) (usleep 7000000) (display) (wait) (usleep 1000000) ;(palette 1 650671357 0) ;(angle 0) ;(maxiter 170) ;(outcoloring 9) ;(view -0.205806 -1.10686 0.0239451 0.0239451) ;(display) ;(message "nat4") ;(textsleep) (palette 1 650671357 0) (angle 0) (outcoloring 9) (view -0.209751 -1.10856 0.0278041 0.0278041) (message "nat4") (usleep 1000000) (smoothmorph 'view 5000000 0) (morphview -0.075401 -0.89142 0.21501 0.21501) (usleep 10000000) (morphview -0.08732 -0.0515 2.866 2.866) (smoothmorph 'view 0 3000000) (usleep 5000000) (display) (wait) (defaultpalette 0) (filter 'starfield #t) (maxiter 139) (outcoloring 0) (incoloring 0) (view 0.23616578 -0.56339523 0.00054982648 0.00054982648) (display) (message "nat5") (textsleep) (filter 'starfield #f) (filter 'palette #t) (palette 1 477945530 0) (periodicity #t) (cyclingspeed -17) (angle 0) (maxiter 46) (outcoloring 0) (incoloring 1) (range 3) (plane 0) (view -1.780499 -0.002199366 0.004793186 0.004793186) (wait) (message "nat6") (cycling #t) (usleep 6000000) (display) (filter 'palette #f) (cycling #f) (palette 1 155652149 0) (maxiter 127) (incoloring 0) (view 0.19232992 0.59284158 0.00015478901 0.00015478901) (message "nat7") (textsleep) (display) (maxiter 144) (outcoloring 1) (incoloring 0) (view 0.294490997 -0.0163372737 1.38726242E-05 1.38726242E-05) (usleep 2000000) (smoothmorph 'view 1000000 1000000) (morphview 0.2944910925 -0.01633561217 1.083571743E-06 1.083571743E-06) (usleep 3000000) (wait) (usleep 3000000) (palette 1 1750754674 0) (maxiter 170) (outcoloring 0) (incoloring 0) (view -0.56159435 0.64187615 0.00043670151 0.00043670151) (usleep 3000000) (palette 1 1499405657 0) (angle 7.24) (maxiter 170) (outcoloring 1) (incoloring 1) (plane 0) (view -1.94257718066647 -1.77233397601984E-05 2.49864032459204E-11 2.49864033478705E-11) (usleep 2000000) (morphview -1.9425771806688 -1.7723339490488E-05 1.4771196375427E-10 1.4771196554556E-10) (usleep 4000000) (wait) (palette 1 780175578 0) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (view 0.2989409252714 -0.01731148436377 1.153372743612E-09 1.153372744112E-09) (usleep 3000000) (usleep 1000000) (wait) (smoothmorph 'view 8000000 4000000) (morphview -0.75 0 2.5 2.5) (usleep 25000000) (wait) XaoS-release-4.3.2/tutorial/msetren.xaf000066400000000000000000000115671455214672000200500ustar00rootroot00000000000000(load "head.xhf") (range 65536) (textposition 'center 'bottom) ; Mandelbrot set part (defaultpalette 0) (filter 'stereogram #f) (filter 'interlace #f) (filter 'edge #t) (filter 'edge2 #f) (filter 'blur #t) (formula 'mandel) (display) (maxiter 1) (message "fact7") (outcoloring 0) (incoloring 0) (plane 0) (view -0.75 0 .1 .1) ;(usleep 1000000) (wait) (view -0.75 0 2.5 2.5) (wait) (maxiter 2) (wait) (maxiter 3) (wait) (maxiter 4) (wait) (maxiter 5) (wait) (maxiter 6) (wait) (display) (maxiter 8) (wait) (maxiter 10) (wait) (maxiter 12) (wait) (maxiter 14) (wait) (maxiter 20) (wait) (maxiter 30) (wait) (maxiter 200) (wait) (filter 'edge #f) (wait) (message "mset") (usleep 3000000) (display) (usleep 1000000) (display) (message "mset1") (textsleep) (display) (text "z=z^2+c") (usleep 3000000) (display) (message "mset2") (textsleep) ;(view -0 0 .3 .3) ;(wait) (display) (usleep 500000) (textposition 'center 'bottom) ;(view 0.0 0.0 0.3 0.3) (message "mset3") (filter 'blur #f) ;(smoothmorph 'view 1000000 1000000) ;(morphview -0.75 0 2.5 2.5) ;(usleep 5000000) (textsleep) (display) (wait) (message "mset4") (textsleep) (display) (message "mset5") (periodicity #f) ;FIXME periodicity makes problems here (morphview -1.76329 -0.00180622 0.0480762 0.0480762) (usleep 4000000) (display) (wait) (message "mset6") (textsleep) (periodicity #t) (display) (usleep 1000000) (message "mset7") (textsleep) (display) (message "mset8") (textsleep) (display) (morphview -1.78384796 -0.0156186314 3.28608553E-05 3.28608553E-05) (usleep 5000000) (wait) (message "mset9") (textsleep) (display) (message "mset10") (textsleep) ;An gray mandelbrot (display) (palette 1 344773041 0) (periodicity #t) (maxiter 600) (angle 206) (view -0.69697092226 -0.44313598753 2.1102342597E-07 2.1102342597E-07) (usleep 3000000) ;An yellow mandelbrot (palette 1 1322755214 0) (angle 276) (view -0.1797721 -0.8418266 0.001259123 0.001259123) (usleep 3000000) ; Blue mandelbrot (palette 3 420905417 0) (angle 0) (formula 'mandel) (maxiter 520) (view -0.76938957 -0.11612439 0.0003879837 0.0003879837) (usleep 3000000) ;(palette 2 31632178 0) ;(angle 0) ;(outcoloring 1) ;(view -1.9854567 -1.351727E-05 0.00029196024 0.00029196024) ;(usleep 3000000) ;An strange purple mandelrbto (outcoloring 0) (palette 1 2003101440 0) (angle 220) (autorotate #f) (maxiter 204) (view 0.3146669 -0.02931828 0.001555872 0.001555872) (usleep 3000000) (angle 0) (palette 1 739115845 0) (formula 'mandel) (maxiter 170) (display) (color 'black) (textposition 'center 'bottom) (message "nat") (textsleep) (display) (message "nat1") (textsleep) (display) (message "nat2") (textsleep) (display) (message "nat3") (morphview -0.354983 0.638129 0.0145266 0.0145266) (color 'white) (usleep 7000000) (display) (wait) (usleep 1000000) ;(palette 1 650671357 0) ;(angle 0) ;(maxiter 170) ;(outcoloring 9) ;(view -0.205806 -1.10686 0.0239451 0.0239451) ;(display) ;(message "nat4") ;(textsleep) (palette 1 650671357 0) (angle 0) (outcoloring 9) (view -0.209751 -1.10856 0.0278041 0.0278041) (message "nat4") (usleep 1000000) (smoothmorph 'view 5000000 0) (morphview -0.075401 -0.89142 0.21501 0.21501) (usleep 10000000) (morphview -0.08732 -0.0515 2.866 2.866) (smoothmorph 'view 0 3000000) (usleep 5000000) (display) (wait) (defaultpalette 0) (filter 'starfield #t) (maxiter 139) (outcoloring 0) (incoloring 0) (view 0.23616578 -0.56339523 0.00054982648 0.00054982648) (display) (message "nat5") (textsleep) (filter 'starfield #f) (filter 'palette #t) (palette 1 477945530 0) (periodicity #t) (cyclingspeed -17) (angle 0) (maxiter 46) (outcoloring 0) (incoloring 1) (range 3) (plane 0) (view -1.780499 -0.002199366 0.004793186 0.004793186) (wait) (message "nat6") (cycling #t) (usleep 6000000) (display) (filter 'palette #f) (cycling #f) (palette 1 155652149 0) (maxiter 127) (incoloring 0) (view 0.19232992 0.59284158 0.00015478901 0.00015478901) (message "nat7") (textsleep) (display) (maxiter 144) (outcoloring 1) (incoloring 0) (view 0.294490997 -0.0163372737 1.38726242E-05 1.38726242E-05) (usleep 2000000) (smoothmorph 'view 1000000 1000000) (morphview 0.2944910925 -0.01633561217 1.083571743E-06 1.083571743E-06) (usleep 3000000) (wait) (usleep 3000000) (palette 1 1750754674 0) (maxiter 170) (outcoloring 0) (incoloring 0) (view -0.56159435 0.64187615 0.00043670151 0.00043670151) (usleep 3000000) (palette 1 1499405657 0) (angle 7.24) (maxiter 170) (outcoloring 1) (incoloring 1) (plane 0) (view -1.94257718066647 -1.77233397601984E-05 2.49864032459204E-11 2.49864033478705E-11) (usleep 2000000) (morphview -1.9425771806688 -1.7723339490488E-05 1.4771196375427E-10 1.4771196554556E-10) (usleep 4000000) (wait) (palette 1 780175578 0) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (view 0.2989409252714 -0.01731148436377 1.153372743612E-09 1.153372744112E-09) (usleep 3000000) (usleep 1000000) (wait) (smoothmorph 'view 8000000 4000000) (morphview -0.75 0 2.5 2.5) (usleep 25000000) (wait) XaoS-release-4.3.2/tutorial/new30.xaf000066400000000000000000000022471455214672000173220ustar00rootroot00000000000000; What's new in version 3.0 by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "new") (textsleep) (clearscreen) (message "speed") (usleep 5000000) (clearscreen) (message "speed1") (textsleep) (clearscreen) (message "speed2") (textsleep) (clearscreen) (message "speed3") (textsleep) (clearscreen) (message "speed4") (textsleep) (clearscreen) (message "speed5") (wait) (display) (maxiter 1000000) (message "speed6") (textsleep) (clearscreen) (message "speed7") (textsleep) (clearscreen) (message "speed8") (textsleep) (clearscreen) (maxiter 170) (message "speed9") (textsleep) (clearscreen) (load "pause.xhf") (clearscreen) (message "new2") (usleep 5000000) (load "filter.xhf") (load "pause.xhf") (clearscreen) (message "new3") (usleep 5000000) (load "outnew.xhf") (load "pause.xhf") (clearscreen) (message "new4") (usleep 5000000) (load "innew.xhf") (load "pause.xhf") (clearscreen) (message "new5") (usleep 5000000) (load "truecol.xhf") (load "pause.xhf") (clearscreen) (message "new6") (usleep 5000000) (load "anim.xhf") (message "newend") (textsleep) (display) XaoS-release-4.3.2/tutorial/new40.xaf000066400000000000000000000005171455214672000173210ustar00rootroot00000000000000; What's new in version 4.0 by Zoltan Kovacs ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "new_4") (usleep 5000000) (clearscreen) (message "new_4_1") (textsleep) (clearscreen) (message "new_4_2") (textsleep) (clearscreen) (message "new_4_3") (usleep 5000000) (load "iter.xaf") XaoS-release-4.3.2/tutorial/newton.xaf000066400000000000000000000124341455214672000176770ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "intro3") (usleep 5000000) (defaultpalette 0) (textposition 'center 'bottom) (formula 'newton) (periodicity #t) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 0) (display) (message "newton") (textsleep) (display) (message "newton1") (textsleep) (display) (message "newton2") (textsleep) (display) (message "newton3") (color 'red) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (color 'white) (linekey 0) (morphline 'fractal 0.966667 -0.0333333 0.966667 0.0333333) (morphline 'fractal 0.966667 0.0333333 1.03333 0.0333333) (morphline 'fractal 0.966667 -0.0333333 1.03333 -0.0333333) (morphline 'fractal 1.03333 0.0333333 1.03333 -0.0333333) (morphline 'fractal -0.533415 0.83323 -0.533415 0.899896) (morphline 'fractal -0.533415 0.899896 -0.466749 0.899896) (morphline 'fractal -0.533415 0.83323 -0.466749 0.83323) (morphline 'fractal -0.466749 0.899896 -0.466749 0.83323) (morphline 'fractal -0.533415 -0.83323 -0.533415 -0.899896) (morphline 'fractal -0.533415 -0.899896 -0.466749 -0.899896) (morphline 'fractal -0.533415 -0.83323 -0.466749 -0.83323) (morphline 'fractal -0.466749 -0.899896 -0.466749 -0.83323) (usleep 1000000) (textsleep) (display) (message "newton4") (textsleep) (display) (morphview -0.486472951 -0.239423987 3.40052781E-05 3.40052781E-05) (usleep 5000000) (wait) (message "newton5") (textsleep) (display) (message "newton6") (textsleep) (display) (message "newton7") (textsleep) (display) (message "newton8") (textsleep) (display) (defaultpalette 0) (formula 'newton) (juliaseed 1.0010901162790698318 0) (angle 90) (julia #t) (plane 0) (view -0.5467 -0.02844 1.927 1.927) (usleep 3000000) (palette 1 959136425 0) (wait) (morphview -0.603817 0.000543598 0.0629232 0.0629232) (usleep 10000000) (wait) (palette 1 871883963 0) (formula 'newton) (juliaseed -0.80087209302325586545 0) (angle -90.9) (maxiter 256) (julia #t) (plane 1) (view -2.254 0.006638 1.532 1.532) (usleep 2000000) (palette 1 1233017465 0) (formula 'newton) (juliaseed -1.1275436046511628632 0) (angle 92) (maxiter 256) (julia #t) (plane 0) (view -0.33483 0.0033715 0.22029 0.22029) (palette 1 1357086155 0) (juliaseed -1.1275436046511628632 0) (angle 90) (autorotate #f) (maxiter 256) (julia #t) (plane 2) (view 0.5762 0.1221 8.249 8.249) (usleep 2000000) (palette 1 1810645372 0) (formula 'newton) (juliaseed -1.1275436046511628632 0) (angle 92) (autorotate #f) (maxiter 256) (julia #t) (plane 0) (view -0.6110601 -2.484229E-05 0.006533619 0.006533619) (usleep 2000000) (palette 1 1281050362 0) (juliaseed 1.0010901162790698318 0) (angle 98) (maxiter 170) (julia #t) (plane 0) (view 0.252905 -0.5152498 0.004158874 0.004158874) (usleep 2000000) (palette 2 448045853 0) (juliaseed -0.57957848837209298431 -1.084202172485504434E-19) (angle 90) (view -0.45641 -0.0079525 0.48766 0.48766) (usleep 2000000) (palette 1 985867394 0) (juliaseed 0.0058931089247213081752 0.0044899066259199158438) (angle 98) (autorotate #f) (maxiter 170) (julia #t) (plane 0) (view 0.04955468 0.3812751 0.004336217 0.004336217) (usleep 2000000) (palette 1 1233017465 0) (juliaseed -1.1275436046511628632 0) (angle 92.6) (autorotate #f) (maxiter 246) (julia #t) (plane 0) (view -0.33483 0.0033715 0.22029 0.22029) (usleep 2000000) (defaultpalette 0) (textposition 'center 'bottom) (formula 'newton4) (periodicity #t) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 0) (display) (message "newton9") (textsleep) (display) (message "newton10") (textsleep) (display) (message "newton11") (color 'red) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (line 'fractal 0 0 0 0) (color 'white) (linekey 0) (morphline 'fractal 0.966667 -0.0333333 0.966667 0.0333333) (morphline 'fractal 0.966667 0.0333333 1.03333 0.0333333) (morphline 'fractal 0.966667 -0.0333333 1.03333 -0.0333333) (morphline 'fractal 1.03333 0.0333333 1.03333 -0.0333333) (morphline 'fractal -0.966667 -0.0333333 -0.966667 0.0333333) (morphline 'fractal -0.966667 0.0333333 -1.03333 0.0333333) (morphline 'fractal -0.966667 -0.0333333 -1.03333 -0.0333333) (morphline 'fractal -1.03333 0.0333333 -1.03333 -0.0333333) (morphline 'fractal -0.0333333 0.966667 0.0333333 0.966667) (morphline 'fractal 0.0333333 0.966667 0.0333333 1.03333) (morphline 'fractal -0.0333333 0.966667 -0.0333333 1.03333) (morphline 'fractal 0.0333333 1.03333 -0.0333333 1.03333) (morphline 'fractal -0.0333333 -0.966667 0.0333333 -0.966667) (morphline 'fractal 0.0333333 -0.966667 0.0333333 -1.03333) (morphline 'fractal -0.0333333 -0.966667 -0.0333333 -1.03333) (morphline 'fractal 0.0333333 -1.03333 -0.0333333 -1.03333) (usleep 1000000) (textsleep) (display) XaoS-release-4.3.2/tutorial/octo.xaf000066400000000000000000000052571455214672000173360ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "intro6") (usleep 5000000) (display) (textposition 'center 'bottom) (message "octo") (defaultpalette 0) (periodicity #f) (filter 'edge #f) (filter 'edge2 #f) (filter 'starfield #f) (filter 'stereogram #f) (filter 'interlace #f) (filter 'blur #t) (formula 'octo) (fastjulia #f) (cycling #f) (angle 0) (fastrotate #t) (autorotate #t) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 0) (angle 1229) (rotationspeed 154) (view 0 0 .5 .5) (morphview 0 0 2.5 2.5) (usleep 4000000) (usleep 245670) (rotationspeed 154) (usleep 343560) (rotationspeed 144) (usleep 341700) (rotationspeed 132) (usleep 309510) (rotationspeed 121) (usleep 308660) (rotationspeed 111) (usleep 338590) (rotationspeed 101) (usleep 346700) (rotationspeed 89) (usleep 341430) (rotationspeed 78) (usleep 306660) (rotationspeed 58) (usleep 305970) (rotationspeed 48) (usleep 308020) (rotationspeed 37) (usleep 313580) (rotationspeed 27) (usleep 323000) (rotationspeed 17.1) (usleep 325080) (rotationspeed 6.4) (usleep 324900) (rotationspeed 0) (animateview 0 0 2.5 2.5) (autorotate #f) (display) (message "octo1") (textsleep) (display) (filter 'blur #f) (fastrotate #f) (palette 1 1272174002 0) (formula 'octo) (fastjulia #f) (cycling #f) (angle 91.8) (autorotate #f) (maxiter 120) (outcoloring 9) (incoloring 1) (plane 2) (view 0.615 0.734 31 31) (usleep 2000000) (palette 1 2020627370 0) (angle 268) (maxiter 100) (outcoloring 0) (incoloring 1) (plane 4) (view 1.933 0.04551 1.146 1.146) (morphview 1.363 0.01996 3.548 3.548) (usleep 3000000) (wait) (usleep 1000000) (defaultpalette 0) (angle 0) (maxiter 50) (plane 1) (angle 24.5) (view 0.06508 0.02173 6.011 6.011) (wait) (morphview 0.1308 -0.1578 9.165 9.165) (usleep 2000000) (wait) (palette 1 1581679475 27) (maxiter 170) (plane 0) (view -0.07483202 0.5429194 0.009544335 0.009544335) (wait) (cyclingspeed 47) (filter 'palette #t) (cycling #t) (message "octo2") (textsleep) (cycling #f) (filter 'palette #f) (display) (palette 1 2090959176 0) (formula 'octo) (juliaseed 0.010537790697674419326 0.86250000000000005547) (maxiter 170) (outcoloring 7) (incoloring 0) (julia #t) (plane 0) (view 0.02298 -0.9176 2.769 2.769) (usleep 3000000) (palette 1 1251438586 0) (formula 'octo) (juliaseed 0.0013961132576639388808 -0.42931197236250143498) (angle 0) (maxiter 251) (outcoloring 7) (incoloring 1) (julia #t) (plane 1) (view 0.05096 -0.2509 3.124 3.124) (usleep 2000000) (cyclingspeed 10) (usleep 1000000) (morphview 1.08 1.35 26.8 26.8) (usleep 8000000) (wait) (usleep 1000000) (periodicity #t) XaoS-release-4.3.2/tutorial/other.xaf000066400000000000000000000274331455214672000175130ustar00rootroot00000000000000(load "head.xhf") (clearscreen) (message "auto1") (usleep 4000000) (clearscreen) (message "auto2") (textsleep) (clearscreen) (display) (zoomcenter 0.11830570195200643288 -0.63262382466199072246) (zoom) (usleep 267) (zoomcenter -0.033430232558139488666 1.2000000000000000772) (animateview -0.75 2.311E-05 2.5 2.5) (usleep 44274) (zoomcenter -0.50597332748852788379 -0.63107733520612090101) (usleep 163210) (zoomcenter -0.6272283548927215359 -0.4872437854576980818) (usleep 399822) (zoomcenter -0.55180300863006073731 -0.62641944354236262665) (animateview -0.7185 -0.1025 1.977 1.977) (usleep 153551) (zoomcenter -0.55957200243976194332 -0.53426310317901038447) (usleep 563498) (zoomcenter -0.58320407685096552328 -0.63237695694138654868) (animateview -0.6714 -0.2347 1.396 1.396) (usleep 480758) (zoomcenter -0.53643474912637531841 -0.67121162630718420007) (usleep 238181) (zoomcenter -0.54478195147021088853 -0.61675332687774657816) (animateview -0.64019 -0.35597 0.9841 0.9841) (usleep 721892) (zoomcenter -0.5389090203876405438 -0.62023658255430552883) (animateview -0.61193 -0.43314 0.69296 0.69296) (usleep 155077) (zoomcenter -0.53346574817747029559 -0.66866293532064771096) (usleep 326183) (zoomcenter -0.52417062832957606836 -0.66314996768672422275) (usleep 477540) (zoomcenter -0.52970204700481322998 -0.66752423900691178232) (animateview -0.58103 -0.51748 0.43491 0.43491) (usleep 478724) (zoomcenter -0.52677784988132239923 -0.67272729319905408876) (usleep 642966) (zoomcenter -0.52677784988132239879 -0.66511495176183804288) (animateview -0.55867 -0.58189 0.25221 0.25221) (usleep 324850) (zoomcenter -0.57706454064058434355 -0.62824014705209962135) (usleep 233330) (zoomcenter -0.58930262093696508097 -0.61856221688668589019) (animateview -0.55688 -0.59741 0.19229 0.19229) (usleep 78316) (zoomcenter -0.58930262093696508254 -0.62414362384237466013) (usleep 720616) (zoomcenter -0.59040772523228185822 -0.61824465332806304675) (animateview -0.56732 -0.60585 0.13043 0.13043) (usleep 408793) (zoomcenter -0.59449543080725952252 -0.62255475514505098969) (usleep 233673) (zoomcenter -0.59449543080725952176 -0.62303456756424900457) (animateview -0.573975 -0.609671 0.0954555 0.0954555) (usleep 720839) (zoomcenter -0.59392530580053555565 -0.6223582813493764375) (animateview -0.580035 -0.613616 0.06725 0.06725) (usleep 397125) (zoomcenter -0.59416045277480668654 -0.61984788468612326732) (usleep 321270) (zoomcenter -0.59395938307256255801 -0.62008639495361285194) (animateview -0.584162 -0.615817 0.0474361 0.0474361) (usleep 83989) (zoomcenter -0.5912589577572650286 -0.62237444004834770601) (usleep 480337) (zoomcenter -0.59278684601691370473 -0.62237444004834770574) (animateview -0.585947 -0.617326 0.0360616 0.0360616) (usleep 157569) (zoomcenter -0.59363587892642540663 -0.62203873048412698708) (usleep 404068) (zoomcenter -0.59456685001086576016 -0.62093440616327360166) (animateview -0.58774 -0.618464 0.0274492 0.0274492) (usleep 320249) (zoomcenter -0.59037801972761568025 -0.62235406884055244711) (usleep 555379) (zoomcenter -0.59053019667560118969 -0.62199304215015923796) (animateview -0.589094 -0.619661 0.0179378 0.0179378) (usleep 564006) (zoomcenter -0.59035634279017973482 -0.62123687766460201323) (animateview -0.589437 -0.620214 0.0136386 0.0136386) (usleep 640808) (zoomcenter -0.59099232888604331926 -0.62173981839328493963) (animateview -0.589687 -0.6204911 0.009989632 0.009989632) (usleep 551237) (zoomcenter -0.59118737521536688777 -0.6218940619272787501) (animateview -0.5899954 -0.6207859 0.0076426 0.0076426) (usleep 166905) (zoomcenter -0.59121734341979726492 -0.62235619230732235866) (usleep 231008) (zoomcenter -0.59119055761232205162 -0.62232441879776555384) (usleep 723619) (zoomcenter -0.59124707275493918856 -0.62221268771121213337) (animateview -0.5904998 -0.6214149 0.004432012 0.004432012) (usleep 651887) (zoomcenter -0.59135694631621453201 -0.6223756036813790219) (animateview -0.5907037 -0.621633 0.003228778 0.003228778) (usleep 712867) (zoomcenter -0.59123060214062214164 -0.62236407519426926522) (animateview -0.5908937 -0.6218503 0.002283592 0.002283592) (usleep 721917) (zoomcenter -0.59127848357459232028 -0.6224127585832911608) (animateview -0.5909938 -0.6220027 0.001608014 0.001608014) (usleep 708984) (zoomcenter -0.59135161575971778933 -0.62234914198823029308) (animateview -0.5910779 -0.6221213 0.001139446 0.001139446) (usleep 493467) (zoomcenter -0.59138228378363149912 -0.62231276336676023716) (usleep 147148) (zoomcenter -0.59143596245709859337 -0.62226182415662870492) (animateview -0.5911545 -0.62217836 0.00083467683 0.00083467683) (usleep 664492) (zoomcenter -0.59147503093488323125 -0.62228654058211452639) (animateview -0.59123301 -0.62220193 0.00060438138 0.00060438138) (usleep 574992) (zoomcenter -0.59148487628761120354 -0.6222865405821145265) (animateview -0.59129222 -0.62222255 0.000457072 0.000457072) (usleep 50797) (zoomcenter -0.59148294967599173376 -0.62225683090224463359) (usleep 315021) (zoomcenter -0.59146978729818324848 -0.62225487923932820304) (usleep 657720) (zoomcenter -0.5914530315285976825 -0.62226197774269942809) (animateview -0.59136281 -0.62223557 0.00027798147 0.00027798147) (usleep 649751) (zoomcenter -0.59144867546981413556 -0.62227644586621774677) (animateview -0.59138715 -0.62224299 0.0002027398 0.0002027398) (usleep 79637) (zoomcenter -0.59145035314421140829 -0.62227047565939710711) (usleep 320490) (zoomcenter -0.59144820016748629187 -0.62227728599496896978) (usleep 379492) (zoomcenter -0.59144939457930694056 -0.62227516076566050535) (animateview -0.59140668 -0.62225295 0.00013880662 0.00013880662) (usleep 172942) (zoomcenter -0.59144884524764033132 -0.62227320590262622701) (usleep 390158) (zoomcenter -0.59144429863493464038 -0.62226727335694404278) (animateview -0.59141671 -0.62225777 0.00010558291 0.00010558291) (usleep 732385) (zoomcenter -0.59144142468828634208 -0.62227068245227857559) (animateview -0.5914249 -0.622260696 7.39707502E-05 7.39707502E-05) (usleep 714714) (zoomcenter -0.59139728925507639815 -0.62224771090660505382) (animateview -0.591428797 -0.622263131 5.22728252E-05 5.22728252E-05) (usleep 736275) (zoomcenter -0.59139776215558527807 -0.62224621501901834346) (animateview -0.591419331 -0.62225846 3.65507653E-05 3.65507653E-05) (usleep 247931) (zoomcenter -0.59139706224783988127 -0.62224820758396523815) (usleep 156131) (zoomcenter -0.59139836226876607643 -0.62225005809651121546) (usleep 198397) (zoomcenter -0.59139812674795921946 -0.6222515946667407782) (animateview -0.591413878 -0.622255959 2.72756039E-05 2.72756039E-05) (usleep 401675) (zoomcenter -0.59139783599021713667 -0.62225113480162226571) (usleep 97965) (zoomcenter -0.59139718955308884381 -0.62224992981733977297) (usleep 409834) (zoomcenter -0.59139832505038205914 -0.62224876247391557569) (animateview -0.591408081 -0.622254023 1.75335957E-05 1.75335957E-05) (usleep 636372) (zoomcenter -0.59139760190925815312 -0.62224783869469734457) (animateview -0.591405468 -0.622252601 1.28704632E-05 1.28704632E-05) (usleep 553426) (zoomcenter -0.59139781412275886624 -0.62224849319040437175) (animateview -0.5914036186 -0.6222514932 9.836136498E-06 9.836136498E-06) (usleep 86419) (zoomcenter -0.59139834180083273896 -0.62224791540390862992) (usleep 91172) (zoomcenter -0.59139799224694331368 -0.62224809968979056445) (usleep 560018) (zoomcenter -0.59139814023435080412 -0.62224788903737052306) (animateview -0.5914019357 -0.6222504666 6.873546451E-06 6.873546451E-06) (usleep 128199) (zoomcenter -0.59139839006543567162 -0.62224825124458321989) (usleep 407431) (zoomcenter -0.59139809388742486674 -0.62224841339615200009) (animateview -0.591401109 -0.62224995 5.298639403E-06 5.298639403E-06) (usleep 73413) (zoomcenter -0.59139789648363192011 -0.62224880366571966463) (usleep 73380) (zoomcenter -0.59139768481878476284 -0.6222491802831718481) (usleep 403275) (zoomcenter -0.59139771928443058568 -0.6222493642584123092) (animateview -0.591400318 -0.6222497496 4.056020309E-06 4.056020309E-06) (usleep 92951) (zoomcenter -0.59139770274018801531 -0.62224916800946595478) (usleep 718350) (zoomcenter -0.59139777266766208985 -0.62224897446307794122) (animateview -0.5913994672 -0.6222495624 2.734717315E-06 2.734717315E-06) (usleep 317887) (zoomcenter -0.5913976922345006949 -0.62224903409455966519) (usleep 406677) (zoomcenter -0.59139775020005902538 -0.62224907338549969611) (animateview -0.59139895 -0.6222494003 1.923187954E-06 1.923187954E-06) (usleep 573034) (zoomcenter -0.59139770007333778562 -0.62224901392483726001) (animateview -0.5913986574 -0.6222493196 1.455825276E-06 1.455825276E-06) (usleep 559046) (zoomcenter -0.59139770963711510708 -0.62224901959714656776) (animateview -0.5913984299 -0.6222492471 1.109560102E-06 1.109560102E-06) (usleep 476791) (zoomcenter -0.59139770206378414744 -0.62224900163007173962) (usleep 472816) (zoomcenter -0.59139771413829044747 -0.62224901595293438504) (animateview -0.59139816231 -0.62224915935 6.9949925285E-07 6.9949925285E-07) (usleep 493359) (zoomcenter -0.59139773074949487659 -0.62224903002745242359) (usleep 214387) (zoomcenter -0.59139772645794069344 -0.62224905039013709911) (animateview -0.59139803376 -0.62224911982 4.9595497364E-07 4.9595497364E-07) (usleep 475684) (zoomcenter -0.59139773327363782008 -0.62224904230531016266) (usleep 107853) (zoomcenter -0.59139771228962847787 -0.62224905187891654693) (animateview -0.5913979579 -0.6222491023 3.7351887159E-07 3.7351887159E-07) (usleep 455058) (zoomcenter -0.59139772136930585512 -0.62224905034029141489) (usleep 743005) (zoomcenter -0.59139771866220852583 -0.62224905355146893681) (animateview -0.59139785238 -0.62224907964 2.0869955789E-07 2.0869955789E-07) (usleep 110679) (animateview -0.59139784876 -0.62224907893 2.0305710042E-07 2.0305710042E-07) (stop) (wait) (initstate) (clearscreen) (message "fastjulia1") (textsleep) (clearscreen) (message "fastjulia2") (textsleep) (clearscreen) (message "fastjulia3") (textsleep) (display) (view -0.75 0 2.5 2.5) (wait) (fastjulia #t) (juliaseed -1.7721656976744186704 0) (usleep 1000000) (morphjulia 0.53561046511627915254 -0) (usleep 3000000) (morphjulia -0.28633720930232555162 -1.0750000000000000692) (usleep 3000000) (morphjulia -1.7721656976744186704 0) (usleep 3000000) (usleep 1000000) (fastjulia #f) (clearscreen) (message "rotation") (textsleep) (display) (fastrotate #t) (usleep 1000000) (morphview -1.861217 -2.963977E-05 0.004662986 0.004662986) (morphangle 720) (usleep 10000000) (fastrotate #f) (cycling #f) (message "cycling") (textsleep) (display) (filter 'palette #t) (cycling #t) (morphview -1.863875649 -4.344248115E-08 4.042594923E-06 4.042594923E-06) (usleep 5000000) (usleep 1000000) (cycling #f) (usleep 1000000) (filter 'palette #f) (clearscreen) (message "bailout") (textsleep) (display) (textposition 'center 'bottom) (defaultpalette 0) (formula 'mandel) (bailout 4) (outcoloring 9) (view -0.75 0 2.5 2.5) (message "bailout1") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (bailout 64) (outcoloring 9) (view -0.75 0 2.5 2.5) (message "bailout2") (textsleep) (display) (clearscreen) (message "bailout3") (textsleep) (display) (defaultpalette 0) (formula 'barnsley) (cycling #f) (periodicity #t) (angle 0) (autorotate #f) (maxiter 170) (bailout 0) (outcoloring 0) (incoloring 0) (julia #t) (juliaseed -0.6 1.1) (plane 0) (view 0 0 2.5 2.5) (textposition 'center 'bottom) (message "bailout4") (bailout 0.2) (wait) (bailout 0.4) (wait) (bailout 0.6) (wait) (bailout 0.8) (wait) (bailout 1.0) (wait) (bailout 1.2) (wait) (bailout 1.4) (wait) (bailout 1.6) (wait) (bailout 1.8) (wait) (bailout 2.0) (wait) (bailout 2.2) (wait) (bailout 2.4) (wait) (bailout 2.6) (wait) (bailout 2.8) (wait) (bailout 3.0) (wait) (bailout 3.2) (wait) (bailout 3.4) (wait) (bailout 3.6) (wait) (bailout 3.8) (wait) (bailout 4.0) (wait) (bailout 4.2) (wait) (bailout 4.4) (wait) (bailout 4.6) (wait) (bailout 4.8) (wait) (textsleep) (clearscreen) (message "end") (usleep 4000000) XaoS-release-4.3.2/tutorial/otherfr.xaf000066400000000000000000000004051455214672000200310ustar00rootroot00000000000000;Other fractal types in Xaos ;Animation file is made by Arpad Fekete ;This file was made in January 2006 (initstate) (clearscreen) (textposition 'center 'middle) (message "otherfr1") (usleep 3000000) (load "trice.xaf") (load "fourfr.xaf") (load "classic.xaf") XaoS-release-4.3.2/tutorial/outcolor.xaf000066400000000000000000000147141455214672000202360ustar00rootroot00000000000000; XaoS features overview by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "outcolor") (usleep 3000000) (display) (filter 'palette #t) (palette 3 506457029 0) (outcoloring 10) (incoloring 4) (outtcoloring 0) (textposition 'center 'bottom) (message "outcolor1") (textsleep) (initstate) (textposition 'center 'bottom) (display) (message "outcolor2") (textsleep) (display) (message "outcolor3") (textsleep) (display) (message "outcolor4") (textsleep) (display) (message "outcolor5") (textsleep) ; PAUSE (usleep 2000000) (clearscreen) (usleep 1000000) (clearscreen) (textposition 'center 'middle) (message "iterreal") (textsleep) (display) (textposition 'center 'bottom) (defaultpalette 0) (formula 'mandel) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 0) (view -1.57696 -0.00116581 0.0500441 0.0500441) (message "iterreal1") (textsleep) (outcoloring 1) (usleep 3000000) (display) (palette 1 1245049028 0) (formula 'barnsley) (juliaseed 1.6755087209302326659 0) (maxiter 170) (outcoloring 1) (incoloring 0) (plane 5) (view 0.0559 0.139 14.8 14.8) (usleep 3000000) (palette 1 198115837 0) (formula 'barnsley) (juliaseed 1.8230639619079263791 -0.04306094545671143516) (angle 49.2) (plane 5) (view 0.03302 0.04938 5.449 5.449) (usleep 3000000) (defaultpalette 0) (formula 'phoenix) (juliaseed 0.47420058139534886771 -0.3250000000000000209) (plane 0) (view 0.4427808 -0.1555987 0.001142675 0.001142675) (usleep 3000000) (defaultpalette 0) (formula 'mandel) (maxiter 170) (outcoloring 1) (incoloring 0) (plane 0) (view -0.75 0 2.5 2.5) (message "iterimag") (textsleep) (outcoloring 2) (display) (message "iterimag2") (textsleep) (palette 1 1681768548 0) (formula 'barnsley) (juliaseed 0.02286743796152808828 1.9925366161234112981) (maxiter 170) (outcoloring 2) (incoloring 0) (plane 5) (view -0.02256 -0.01292 1.588 1.588) (display) (usleep 3000000) (palette 1 461113744 0) (formula 'magnet) (juliaseed 3.0220425832406331557 0.04789220763071800463) (julia #t) (plane 5) (view -0.0024762 0.011078 0.4363 0.63991) (usleep 3000000) (palette 1 1158293466 0) (formula 'octo) (juliaseed -0.61556665985505426477 0) (angle 90.5) (julia #t) (plane 5) (view -0.2206 -0.04937 8.35 8.35) (usleep 3000000) ; PAUSE (usleep 2000000) (clearscreen) (usleep 1000000) (clearscreen) (textposition 'center 'middle) (message "iprdi") (textsleep) (display) (palette 1 1615867634 0) (formula 'mandel) (maxiter 170) (outcoloring 3) (incoloring 0) (plane 0) (view -0.75 0 2.5 2.5) (usleep 3000000) (palette 1 1330071445 0) (formula 'phoenix) (juliaseed 0.50445040403954712195 -0.38196819024687423759) (angle -268) (autorotate #f) (plane 1) (view 1.04 0.17 11 11) (usleep 3000000) (palette 1 1126535193 0) (formula 'barnsley) (juliaseed -94.896551724137925513 0) (plane 5) (view -0.002724 -0.01674 8.738 8.738) (usleep 3000000) (palette 1 1126535193 0) (formula 'phoenix) (plane 0) (view -0.161155 -0.537444 0.0916634 0.0916634) (usleep 4000000) (clearscreen) (usleep 1000000) (message "sum") (textsleep) (display) (palette 1 2130172061 0) (formula 'magnet) (angle -90.4) (maxiter 170) (outcoloring 4) (incoloring 0) (plane 1) (view -0.1709 -0.03823 1.482 2.173) (usleep 3000000) (palette 1 1323513393 0) (formula 'barnsley) (juliaseed -0.00230571110290458286 1.6385322985723904033) (plane 1) (view -0.002306 -0.04014 3.391 3.391) (usleep 3000000) (palette 1 1851145686 0) (formula 'phoenix) (juliaseed 0.27864691783831166054 0.01692485553314466791) (angle -91.5) (plane 2) (view 0.00716 -0.356 11.3 11.3) (usleep 3000000) ; PAUSE (usleep 2000000) (clearscreen) (usleep 1000000) (clearscreen) (message "decomp") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (maxiter 59) (outcoloring 5) (incoloring 0) (plane 0) (view -0.75 0 2.5 2.5) (usleep 3000000) (palette 1 2088834949 0) (formula 'barnsley) (juliaseed -1.0748546511627907668 -0.15000000000000000963) (angle 67.6) (autorotate #f) (maxiter 170) (outcoloring 5) (incoloring 0) (plane 5) (view 0.01213 -0.04933 2.345 2.345) (usleep 3000000) (palette 1 1783717633 0) (formula 'barnsley) (juliaseed -1.0732010262763361698 -0.00156225599106755235) (plane 3) (view 1.115 -0.02274 4.276 4.276) (usleep 2000000) (palette 1 997905221 0) (formula 'barnsley) (juliaseed 1.0335457219786930816 0.09007071657342203218) (plane 3) (view 1.115 -0.02274 4.276 4.276) (usleep 2000000) (palette 1 260946575 0) (formula 'magnet) (juliaseed 1.9902223042457084012 0.00969657718521371465) (julia #t) (plane 0) (view 0.07979 0.04018 1.213 1.779) (usleep 3000000) (palette 1 260946575 0) (formula 'mandel9) (angle 23.5) (plane 1) (view 0 0 2.5 2.5) (usleep 3000000) (palette 1 941542766 0) (formula 'barnsley) (juliaseed -1.2698037790697675236 0.02604166666666666837) (plane 3) (view 1.018 -0.0588 4.577 4.577) (usleep 3000000) (palette 1 1737172376 0) (formula 'barnsley) (juliaseed 1.0200197307798127969 -0.02189586455981775694) (plane 5) (view 0.05335 0.06079 2.747 2.747) (usleep 3000000) ; PAUSE (usleep 2000000) (clearscreen) (usleep 1000000) (clearscreen) (textposition 'center 'middle) (message "bio") (textsleep) (display) (palette 1 1872601163 0) (formula 'mandel5) (juliaseed 0.58607974436293026302 0.00011176997199701769) (maxiter 153) (outcoloring 6) (incoloring 0) (julia #t) (plane 1) (view -0.04105 0.02435 4.935 4.935) (usleep 3000000) (palette 1 105062163 0) (formula 'barnsley) (julia #t) (juliaseed 2.8236810422098707935 0.05811237065355640669) (view 0.005205 -0.002584 1.601 1.601) (usleep 3000000) (palette 1 833849989 0) (formula 'mandel5) (julia #t) (juliaseed 0.76428252944698614841 -0.40658080189405711885) (view 0.07452 -0.008817 5.044 5.044) (usleep 3000000) (palette 1 277244305 0) (formula 'newton) (julia #t) (juliaseed -1.7896045256217635593 0.04005360812061721953) (plane 3) (view 1.24 0.13 11.4 11.4) (usleep 3000000) (palette 1 1938959247 0) (formula 'mandel5) (julia #t) (juliaseed -0.82233882390131325928 0.83264474211181399984) (plane 1) (view 0.2343 0.001337 5.078 5.078) (usleep 3000000) (palette 1 2005948595 0) (formula 'barnsley) (julia #t) (juliaseed 0 -2.1052631578947367066) (plane 5) (view 0.003888 -0.004145 1.757 1.757) (usleep 3000000) (palette 1 446680187 0) (formula 'mandel9) (julia #t) (juliaseed 0.70552939851789381277 -0.00148898531548975377) (plane 1) (view 0.0256 0.05061 3.175 3.175) (usleep 3000000) (load "pause.xhf") (load "outnew.xhf") XaoS-release-4.3.2/tutorial/outnew.xhf000066400000000000000000000074541455214672000177230ustar00rootroot00000000000000(clearscreen) (message "potential") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (fastjulia #f) (cycling #f) (periodicity #t) (autorotate #f) (maxiter 170) (outcoloring 7) (incoloring 0) (plane 0) (view -0.75 0 2.5 2.5) (usleep 2000000) (palette 1 1827611901 0) (formula 'mandel5) (juliaseed 0.57610567620503761637 -0.00036830714146752355345) (angle 57.4) (julia #t) (plane 1) (view -0.1414 -0.00246 4.176 4.176) (usleep 2000000) (palette 1 109680931 0) (formula 'phoenix) (juliaseed 0.48535441665931129164 -0.34884112172509833922) (angle -271) (plane 2) (view 0.7794 0.08007 7.023 7.023) (usleep 2000000) (palette 1 1244298651 0) (formula 'barnsley) (juliaseed 1.6807776162790698756 -0.34895833333333335581) (angle 127) (plane 4) (view -0.5691 -0.005598 4.176 4.176) (usleep 2000000) (palette 1 269758741 0) (formula 'barnsley) (juliaseed -0.030963345141690833085 1.7180484667357005222) (plane 1) (view 0.01973 0.02145 3.436 3.436) (usleep 2000000) (palette 1 992843336 0) (filter 'palette #t) (formula 'barnsley) (juliaseed -1.546548770316740496 0) (angle 90) (plane 2) (view -1.283 -0.07217 3.724 3.724) (usleep 2000000) (usleep 2000000) (clearscreen) (usleep 1000000) (defaultpalette 0) (textposition 'center 'bottom) (outcoloring 8) (formula 'mandel) (plane 0) (view -0.75 0 2.5 2.5) ; DECOMPOSITION (message "cdecom") (textsleep) (display) (message "cdecom2") (textsleep) (display) (cycling #t) (cyclingspeed -30) (fastrotate #t) (autorotate #t) (usleep 8000000) (clearscreen) (cycling #f) (filter 'palette #f) (textposition 'center 'middle) (autorotate #f) (message "cdecom3") (textsleep) (fastrotate #f) (defaultpalette 0) (formula 'newton) (fastjulia #f) (cycling #f) (periodicity #t) (autorotate #f) (maxiter 170) (incoloring 0) (plane 0) (view 0 0 2.5 2.5) (display) (textposition 'center 'bottom) (message "cdecom4") (textsleep) (palette 1 2076935928 0) (formula 'phoenix) (cycling #f) (maxiter 222) (view 0.000736974 -0.498205 0.0233898 0.0233898) (display) (usleep 3000000) (palette 1 95361573 0) (formula 'mandel) (maxiter 481) (incoloring 1) (view 0.3412215406 -0.04775941323 2.360577158E-06 2.360577158E-06) (usleep 3000000) (palette 1 2020659804 0) (formula 'barnsley) (juliaseed 1.1447857761691383914 -7.1800986429855469155E-07) (plane 1) (view 0.04009 0.1683 4.207 4.207) (usleep 3000000) (palette 1 1138140310 0) (formula 'mandel3) (juliaseed 0.46366279069767444838 -0.03750000000000000241) (julia #t) (plane 1) (view 0.3126 0.1833 5.519 5.519) (usleep 3000000) (defaultpalette 0) (formula 'barnsley) (juliaseed 1.0200197307798127969 -0.02189586455981775694) (plane 3) (view 0.8766 -0.1051 3.265 3.265) (usleep 3000000) (palette 1 1374519064 0) (formula 'mandel5) (juliaseed 0.72055268011327479071 0.20317223111390699016) (julia #t) (plane 1) (view 0.2435 0.1847 7.324 7.324) (usleep 3000000) ; SMOOTH (usleep 2000000) (clearscreen) (usleep 1000000) (clearscreen) (filter 'truecolor #t) (textposition 'center 'middle) (message "smooth") (textsleep) (clearscreen) (message "smooth1") (textsleep) (clearscreen) (message "smooth2") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (outcoloring 9) (incoloring 0) (plane 0) (view -0.75 0 2.5 2.5) (usleep 2000000) (palette 1 1506744519 0) (formula 'phoenix) (juliaseed 0.49022288223055247598 -0.39052593130985661457) (angle -270) (maxiter 329) (plane 2) (view 0.8575 -0.2268 9.693 9.693) (usleep 2000000) (defaultpalette 0) (formula 'phoenix) (juliaseed 0.37936046511627909421 -0.22500000000000001444) (angle -270) (maxiter 170) (plane 1) (view -1.65 -0.298 10.3 10.3) (usleep 2000000) (palette 1 523392987 0) (formula 'mandel4) (juliaseed -0.81140988372093028472 -0.10000000000000000642) (maxiter 170) (julia #t) (plane 0) (view -0.65025 -0.050542 0.18216 0.18216) (usleep 2000000) (filter 'truecolor #f) XaoS-release-4.3.2/tutorial/palette.xaf000066400000000000000000000001261455214672000200160ustar00rootroot00000000000000(load "head.xhf") (clearscreen) (message "pal") (usleep 4000000) (load "palette.xhf") XaoS-release-4.3.2/tutorial/palette.xhf000066400000000000000000000031721455214672000200310ustar00rootroot00000000000000(initstate) (clearscreen) (message "pal0") (textsleep) (clearscreen) (message "pal1") (textsleep) (clearscreen) (message "pal2") (textsleep) (display) (formula 'barnsley) (filter 'palette #t) (juliaseed 1.0221656976744186705 -0.037500000000000002407) (plane 1) (view 0.1341 0.03897 9.02 9.02) (textposition 'center 'bottom) (wait) (message "pal3") (textsleep) (display) (cycling #t) (usleep 3000000) (palette 1 150949959 0) (usleep 3000000) (palette 1 1502890526 0) (usleep 3000000) (palette 1 642437974 0) (usleep 3000000) (message "pal4") (textsleep) (display) (palette 2 999658208 0) (usleep 3000000) (palette 2 1165738401 0) (usleep 3000000) (palette 2 1668121821 0) (usleep 3000000) (palette 2 2140293197 0) (usleep 3000000) (palette 2 673420460 0) (usleep 3000000) (palette 2 271319198 0) (usleep 3000000) (palette 2 1491365278 0) (usleep 3000000) (palette 2 645592266 0) (usleep 3000000) (palette 2 1642408713 0) (usleep 3000000) (palette 2 2043158660 0) (usleep 3000000) (palette 2 49573586 0) (usleep 3000000) (palette 2 518313506 0) (usleep 3000000) (palette 2 2064431961 0) (message "pal5") (textsleep) (display) (palette 3 2091177578 0) (usleep 3000000) (palette 3 217046201 0) (usleep 3000000) (palette 3 1454067645 0) (usleep 3000000) (palette 3 223337850 0) (usleep 3000000) (palette 3 1566818791 0) (usleep 3000000) (palette 3 1875286429 0) (usleep 3000000) (palette 3 499077340 0) (usleep 3000000) (palette 3 506263511 0) (usleep 3000000) (palette 3 218877334 0) (usleep 3000000) (palette 3 570595679 0) (usleep 3000000) (palette 3 546033592 0) (usleep 3000000) (palette 3 640132085 0) (usleep 3000000) (cycling #f) (filter 'palette #f) XaoS-release-4.3.2/tutorial/pause.xhf000066400000000000000000000001331455214672000175020ustar00rootroot00000000000000; PAUSE (usleep 2000000) (clearscreen) (usleep 1000000) XaoS-release-4.3.2/tutorial/pert.xaf000066400000000000000000000001251455214672000173310ustar00rootroot00000000000000(load "head.xhf") (clearscreen) (message "pert0") (usleep 4000000) (load "pert.xhf") XaoS-release-4.3.2/tutorial/pert.xhf000066400000000000000000000030501455214672000173400ustar00rootroot00000000000000(clearscreen) (message "pert1") (textsleep) (clearscreen) (message "pert2") (textsleep) (clearscreen) (message "pert3") (textsleep) (display) (usleep 1000000) (perturbation -0.012354651162790650232 0.062500000000000004012) (wait) (perturbation 0.029796511627907026854 0.17500000000000001134) (wait) (perturbation 0.21947674418604657407 0.37500000000000002418) (wait) (perturbation 0.59883720930232566828 0.73750000000000004755) (usleep 100000) (textposition 'center 'bottom) (message "pert4") (textsleep) (display) (morphview -0.758669 -0.1510504 0.003136517 0.003136517) (usleep 5000000) (wait) (initstate) (palette 3 1298613279 0) (formula 'newton) (perturbation 0.29505813953488373993 -0.012500000000000000802) (angle 270.17) (plane 2) (view -1.877 0.04055 6.545 6.545) (usleep 5000000) (initstate) (palette 2 661894305 0) (formula 'octo) (perturbation 0 -0.025000000000000001605) (plane 1) (view 0.452 -0.086 14 14) (usleep 5000000) (initstate) (palette 2 783556080 0) (formula 'newton) (perturbation -0.36882267441860467488 -0.012500000000000000802) (incoloring 1) (view 2.5795 0.027209 0.99831 0.99831) (usleep 5000000) (initstate) (filter 'truecolor #t) (palette 2 2140656163 0) (formula 'barnsley) (perturbation 1.6755087209302326659 0) (angle -90.103) (outcoloring 10) (outtcoloring 9) (julia #f) (view 2.036 0.009591 1.128 1.128) (usleep 5000000) (initstate) (palette 2 1570942905 0) (formula 'newton) (perturbation -0.23183139534883722422 -0.012500000000000000802) (outcoloring 9) (incoloring 7) (plane 5) (view -0.0582 -0.01618 2.798 2.798) (usleep 5000000) XaoS-release-4.3.2/tutorial/phoenix.xaf000066400000000000000000000060471455214672000200420ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "intro5") (usleep 5000000) (palette 1 1792966073 0) (formula 'phoenix) (julia #f) (plane 0) (view -0.379 0.2916 3.284 3.284) (display) (color 'black) (textposition 'center 'bottom) (message "phoenix") (textsleep) (color 'white) (palette 1 1324551901 0) (formula 'phoenix) (julia #f) (plane 0) (view 0.188267 0.923587 0.0100905 0.0100905) (display) (usleep 2000000) (palette 1 1627920637 0) (formula 'phoenix) (angle 150) (julia #f) (view 0.471443 -0.296993 0.0302053 0.0302053) (usleep 2000000) (palette 1 1627920637 0) (morphview 0.390047 -0.191011 0.0262958 0.0262958) (usleep 6000000) (wait) (palette 1 18031315 0) (angle 21.2) (julia #f) (view -1.7599358 0.014872406 0.00016976324 0.00016976324) (usleep 2000000) (palette 1 257898815 0) (formula 'phoenix) (outcoloring 8) (julia #f) (view 0.25574 0.45129 0.19793 0.19793) (usleep 2000000) (palette 1 1729125249 0) (formula 'phoenix) (angle 177) (julia #f) (view 0.22169 0.75312 0.17615 0.17615) (usleep 2000000) (palette 1 1090844670 0) (formula 'phoenix) (angle 21.2) (outcoloring 0) (julia #f) (view -1.6126147398 -0.016209215424 1.5592934165E-07 1.5592934165E-07) (message "phoenix1") (textsleep) (palette 1 1729125249 0) (formula 'phoenix) (display) (angle 159) (julia #f) (view -1.0903 0.1781 0.12263 0.12263) (usleep 3000000) (palette 1 1792966073 0) (angle 0) (formula 'phoenix) (julia #f) (view -0.379 0.2916 3.284 3.284) (display) (color 'black) (message "phoenix2") (textsleep) (display) (morphview -1.75817 -0.000301212 0.0378343 0.0378343) (usleep 4000000) (wait) (palette 1 326098313 0) (formula 'phoenix) (juliaseed -1.7666199754006518578 0.00687153883595452393) (outcoloring 1) (plane 0) (view -1.760882 0.01045051 0.003687006 0.003687006) (color 'white) (message "phoenix3") (textsleep) (display) (message "phoenix4") (textsleep) (display) (defaultpalette 0) (formula 'phoenix) (maxiter 271) (plane 0) (view 0.0068593 -0.489751 0.0485972 0.0485972) (usleep 3000000) (palette 1 504531543 0) (juliaseed 0.14376580817539892084 0.3944496374263076205) (angle 271) (plane 1) (view 0.7831 0.2092 6.044 6.044) (usleep 3000000) (palette 1 1794703246 0) (formula 'phoenix) (filter 'edge2 #t) (angle 0) (outcoloring 2) (plane 0) (view -0.051043 0.83791 0.13455 0.13455) (usleep 3000000) (filter 'edge2 #f) (palette 1 906148114 0) (formula 'phoenix) (juliaseed 0.43390385732938146351 -0.31608426045400182656) (angle -270) (outcoloring 0) (plane 0) (view 0.04333 0.005463 1.846 1.846) (usleep 3000000) (palette 1 1283437285 0) (formula 'phoenix) (juliaseed 0.1901522684107088305 0.76657698818178892958) (angle -156) (maxiter 331) (outcoloring 1) (plane 0) (view 0.29204 0.63386 0.16135 0.16135) (usleep 3000000) (palette 1 245241219 0) (formula 'phoenix) (juliaseed 0.086781190600191699449 0.56503351835647285618) (angle 33.7) (maxiter 170) (outcoloring 4) (plane 1) (view -0.9381658 0.3498999 0.003672936 0.003672936) (usleep 3000000) XaoS-release-4.3.2/tutorial/plane.xaf000066400000000000000000000172471455214672000174730ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "plane1") (textsleep) (clearscreen) (message "plane2") (textsleep) (message "plane3") (textsleep) (display) (textposition 'center 'bottom) (message "plane4") (textsleep) (plane 1) (view 1.104 -0.006179 4.362 4.362) (message "plane5") (textsleep) (display) (textsleep) (message "plane6") (textsleep) (display) (plane 0) (formula 'mandel9) (message "plane7") (textsleep) (plane 1) (display) (textsleep) (palette 1 1188637657 0) (formula 'mandel9) (juliaseed 0.073764534883720934955 0.78750000000000005065) (maxiter 170) (outcoloring 6) (incoloring 0) (julia #t) (plane 0) (view -0.001692 0.0241 2.813 2.813) (usleep 2000000) (plane 1) (view -0.01593 0.03685 6.772 6.772) (usleep 3000000) (palette 1 732864367 0) (formula 'mandel5) (julia #t) (juliaseed -0.57957848837209306053 -0.012500000000000000802) (plane 0) (view 0.04427 0.00332 2.425 2.425) (usleep 2000000) (plane 1) (view 0.02166 0.1158 8.534 8.534) (usleep 2000000) (palette 1 1361222802 0) (formula 'barnsley) (juliaseed 1.0318186784683188817 -0.060273352372932779713) (outcoloring 0) (incoloring 0) (plane 0) (view 0.01969 0.03833 3.355 3.355) (usleep 2000000) (plane 1) (view 0.02601 0.04272 4.853 4.853) (usleep 2000000) (palette 1 212885046 0) (formula 'octo) (plane 0) (view 0.05694 -0.02316 1.966 1.966) (usleep 2000000) (plane 1) (view 0.174 -0.184 11.3 11.3) (usleep 2000000) (periodicity #t) (defaultpalette 0) (formula 'newton) (plane 0) (view 0 0 2.5 2.5) (usleep 2000000) (plane 1) (view 0.04362 0.0509 5.176 5.176) (usleep 2000000) (palette 1 540836405 0) (juliaseed -1.8805768479558366169 -0.001877370200985767042) (angle -93.1) (julia #t) (plane 0) (view 0.5411 0.0108 2.81 2.81) (usleep 2000000) (plane 1) (view -5.79 0.118 27.2 27.2) (usleep 2000000) (clearscreen) (textposition 'center 'middle) (usleep 1000000) (message "plane8") (textsleep) (clearscreen) (message "plane9") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (plane 2) (view -0.5779664 -0.0001781381 0.006779166 0.006779166) (wait) (morphview 3.4E+02 8.1 5.4E+02 5.4E+02) (usleep 10000000) (wait) (periodicity #t) (textposition 'center 'bottom) (message "plane10") (textsleep) (display) (palette 1 665365024 0) (formula 'octo) (plane 0) (usleep 2000000) (angle 91.1) (plane 2) (view -1.426 -0.0505 7.569 7.569) (wait) (morphview -17 17 2.5E+02 2.5E+02) (usleep 10000000) (wait) (periodicity #t) (palette 1 1857311811 0) (formula 'newton) (autorotate #f) (outcoloring 1) (incoloring 0) (plane 0) (view 0.307 0.04789 2.876 2.876) (usleep 2000000) (plane 2) (view 1.5 -0.185 16.3 16.3) (usleep 2000000) (palette 1 1722789775 0) (formula 'barnsley) (julia #t) (juliaseed 1.0580842317638900964 0.14354313661511941807) (angle 277) (outcoloring 0) (incoloring 0) (plane 0) (view 0.004665 -0.09511 3.297 3.297) (usleep 2000000) (plane 2) (view 3.658 0.02434 8.924 8.924) (usleep 2000000) (clearscreen) (textposition 'center 'middle) (message "lambda") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (plane 3) (view 0.9424 0.05905 4.893 4.893) (usleep 2000000) (defaultpalette 0) (filter 'edge2 #t) (formula 'newton) (plane 0) (view 0 0 2.5 2.5) (usleep 2000000) (plane 3) (view 0.9993 0.09856 4.978 4.978) (usleep 2000000) (palette 1 2094204211 0) (filter 'edge2 #f) (formula 'barnsley) (juliaseed 1.0490855747152614393 0.057982090780981126467) (plane 0) (view -0.1129 0.009373 3.93 3.93) (usleep 2000000) (plane 3) (view 0.9009 -0.0657 5.412 5.412) (usleep 2000000) (palette 1 2078692293 0) (formula 'mandel3) (juliaseed 0.4215116279069767713 0) (outcoloring 5) (incoloring 0) (julia #t) (plane 0) (view -0.03046 0.04685 2.542 2.542) (usleep 2000000) (plane 3) (view 0.9033 0.002104 4.207 4.207) (usleep 2000000) (clearscreen) (usleep 1000000) (textposition 'center 'middle) (message "ilambda") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (plane 4) (view -0.04515 -0.02451 2.068 2.068) (usleep 2000000) (palette 1 1366212337 0) (formula 'mandel9) (angle -270) (outcoloring 0) (incoloring 1) (plane 0) (view 0.001502 0.0273 2.242 2.242) (usleep 2000000) (plane 4) (view -0.3872 0.04514 2.5 2.5) (usleep 2000000) (palette 1 1930829025 0) (formula 'phoenix) (juliaseed 0.099603226790762798234 0.47676212210978708464) (angle 268) (outcoloring 2) (incoloring 0) (plane 0) (view -0.08725 -0.06146 2.051 2.051) (usleep 2000000) (plane 4) (view 0.1405 0.001392 3.027 3.027) (usleep 2000000) (palette 1 1389290519 0) (formula 'newton) (angle 267) (outcoloring 0) (incoloring 0) (plane 0) (view 0 0 2.5 2.5) (usleep 2000000) (plane 4) (view -0.2721 0.04681 2.652 2.652) (usleep 2000000) (palette 1 1756695113 0) (formula 'newton) (juliaseed 1.0165192138719228486 -0.015320623070085100277) (angle -89.1) (julia #t) (plane 0) (view -0.1768 -0.0374 1.351 1.351) (usleep 2000000) (plane 4) (view -0.7622 -0.1073 3.375 3.375) (usleep 2000000) ;(periodicity #f) (palette 1 1623798698 0) (formula 'octo) (angle -93.6) (plane 0) (view 0.05057 -0.04221 2.323 2.323) (usleep 2000000) (plane 4) (view 0.9905 -0.03988 4.759 4.759) (usleep 2000000) (periodicity #t) (clearscreen) (textposition 'center 'middle) (usleep 1000000) (message "imlambda") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (outcoloring 0) (incoloring 0) (plane 5) (view 0.015265 0.0011209 0.77487 0.77487) (textposition 'center 'bottom) (message "imlambda2") (usleep 3000000) (display) (morphview -1.14 0.928 24.1 24.1) (usleep 10000000) (wait) (usleep 2000000) (palette 1 21687438 0) (formula 'octo) (plane 0) (view 0.05963 0.01683 2.246 2.246) (usleep 2000000) (plane 5) (view 0.02863 0.002291 1.644 1.644) (usleep 1000000) (wait) (plane 5) (morphview 0.204 0.0603 11.6 11.6) (usleep 10000000) (wait) (periodicity #t) (palette 1 2079102097 0) (formula 'newton) (outcoloring 8) (incoloring 0) (plane 0) (view 0 0 2.5 2.5) (usleep 2000000) (plane 5) (view 0.008223 0.01861 2.028 2.028) (usleep 2000000) (palette 1 442412479 0) (formula 'barnsley) (juliaseed 1.7326770974776322079 0.0057832737825164998559) (outcoloring 1) (incoloring 0) (plane 0) (view 0.03107 0.005783 3.747 3.747) (usleep 2000000) (plane 5) (view 0.02936 0.005783 3.545 3.545) (wait) (plane 5) (morphview 0.151 0.00578 18 18) (usleep 10000000) (wait) (palette 1 1478827629 0) (formula 'magnet) (juliaseed 2.0756547649234260199 -0.01485114343840790007) (maxiter 170) (outcoloring 6) (incoloring 0) (julia #t) (plane 0) (view -0.353 0.04624 7 10.27) (usleep 2000000) (plane 5) (view 0.029534 -0.0050964 0.39172 0.57452) (wait) (plane 5) (morphview 0.4815 -0.005096 4.936 7.239) (usleep 10000000) (wait) (usleep 1000000) (clearscreen) (usleep 1000000) (textposition 'center 'middle) (message "mick") (textsleep) (display) (defaultpalette 0) (formula 'mandel) (outcoloring 0) (incoloring 0) (plane 6) (view -0.75 0 2.5 2.5) (wait) (morphview -2E+01 1E+02 6E+03 6E+03) (usleep 10000000) (wait) (palette 1 13426138 0) (formula 'octo) (angle 269) (plane 0) (view -0.01687 -0.03823 1.773 1.773) (usleep 2000000) (plane 6) (view 1.101 -0.03384 1.614 1.614) (usleep 2000000) (palette 1 379808765 0) (formula 'newton) (angle -90) (plane 0) (view 0 0 2.5 2.5) (usleep 2000000) (plane 6) (view -12.4 -1.93 39.4 39.4) (usleep 2000000) (formula 'barnsley) (palette 1 874618280 0) (filter 'edge2 #t) (juliaseed 1.0537790697674419282 0.025000000000000001605) (plane 0) (view 0.05278 0.03018 3.195 3.195) (usleep 2000000) (plane 6) (view 0.213 0.0768 14.6 14.6) (usleep 2000000) (filter 'edge2 #f) (palette 1 1022524630 0) (formula 'phoenix) (julia #f) (plane 0) (view 0 0 2.5 2.5) (usleep 2000000) (plane 6) ;(periodicity #f) (view -1E+03 2E+01 7E+03 7E+03) (usleep 2000000) (periodicity #t) XaoS-release-4.3.2/tutorial/power.xaf000066400000000000000000000062461455214672000175250ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "intro2") (usleep 5000000) (display) (defaultpalette 0) (formula 'mandel) (angle 0) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 0) (view -0.75 0 2.5 2.5) (textposition 'center 'bottom) (message "power") (textsleep) (display) (formula 'mandel3) (message "power2") (textsleep) (display) (message "power3") (textsleep) (display) (smoothmorph 'view 2000000 2000000) (morphview 0.266403 -1.26024 0.0388597 0.0388597) (usleep 5000000) (wait) (palette 1 590960451 0) (formula 'mandel3) (maxiter 311) (outcoloring 1) (incoloring 0) (plane 0) (view 0.4441447404 0.0215520724 6.388399051E-06 6.388399051E-06) (usleep 2000000) ;(palette 1 1633607719 0) ;(angle -320) ;(maxiter 105) ;(outcoloring 0) ;(incoloring 0) ;(plane 0) ;(view 0.117006125 1.13233683 2.87904169E-05 2.87904169E-05) ;(usleep 2000000) (palette 1 1311787594 0) (angle -23.3) (maxiter 168) (outcoloring 0) (incoloring 0) (plane 0) (view -0.584730623 -0.221175898 3.22228192E-05 3.22228192E-05) (usleep 3000000) (palette 1 1307004302 0) (angle -23.3) (maxiter 168) (outcoloring 0) (incoloring 0) (plane 0) (view 0.41330684 -0.64510606 0.0001145949 0.0001145949) (usleep 2000000) (display) (palette 1 1307004302 0) (angle -23.3) (autorotate #f) (outcoloring 0) (incoloring 0) (maxiter 400) (view -0.451065423507224 -0.022533000686388 6.95555389543592E-11 6.95555389577474E-11) (usleep 2000000) (plane 0) (smoothmorph 'view 2000000 2000000) (morphview -0.4510654227194 -0.02253299961891 7.419813071352E-09 7.419813071496E-09) ;(maxiter 168) (usleep 7000000) (wait) (usleep 2000000) (message "power4") (textsleep) (defaultpalette 0) (formula 'mandel4) (angle 0) (display) (text "z^4+c") (usleep 2000000) (formula 'mandel5) (display) (text "z^5+c") (usleep 2000000) (formula 'mandel6) (display) (text "z^6+c") (usleep 2000000) (palette 1 1158270005 0) (display) (formula 'mandel5) (juliaseed -0.51635174418604654479 0.70000000000000004515) (angle 0) (julia #t) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 1) (view 0.1249 0.1893 5.961 5.961) (message "pjulia") (textsleep) (display) (palette 1 1586552168 0) (formula 'mandel3) (juliaseed 0.36882267441860467488 -0.66250000000000004263) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (julia #t) (plane 1) (view -0.02118 0.5241 7.847 7.847) (usleep 2000000) (display) (formula 'mandel5) (palette 1 2087220895 0) (juliaseed 0.33669790083813088669 -0.70478147175782891021) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (julia #t) (plane 1) (view 0.092 0.164 11.2 11.2) (usleep 2000000) (palette 1 111980511 0) (formula 'mandel5) (juliaseed -0.62735732725661988549 -0.50514451660129260405) (angle 0) (autorotate #f) (maxiter 170) (outcoloring 0) (incoloring 0) (julia #t) (plane 1) (view 0.3083 0.0967 8.469 8.469) (usleep 2000000) (palette 1 1530690807 0) (formula 'mandel9) (juliaseed 0.51635174418604654479 -0.50000000000000003215) (julia #t) (angle 0) (maxiter 170) (outcoloring 0) (incoloring 0) (plane 1) (view 0.07038 0.1477 6.786 6.786) (usleep 2000000) XaoS-release-4.3.2/tutorial/render.xaf000066400000000000000000000012231455214672000176360ustar00rootroot00000000000000(load "msetren.xaf") (usleep 500000) (clearscreen) (textposition 'center 'middle) (text "This animation is part of animated tutorial \"An introduction to fractals\" See https://xaos-project.github.io/ for the 8 chapters.") (textsleep) (text "Rendered by XaoS - a real-time fractal zoomer XaoS is free software. Download it from: https://xaos-project.github.io/ to see the whole tutorial calculated in realtime at much higher quality.") (textsleep) (clearscreen) (textposition 'center 'top) (message "fcopyright") (textposition 'center 'bottom) (text "You can redistribute this animation freely as long as the original MPEG file is untouched.") (textsleep) XaoS-release-4.3.2/tutorial/square.xhf000066400000000000000000000010111455214672000176610ustar00rootroot00000000000000(linekey 0) (clearlines) (color 'red) (line 'scaled 0.4 0.4 0.6 0.4) (line 'scaled 0.4 0.6 0.6 0.6) (line 'scaled 0.4 0.4 0.4 0.6) (line 'scaled 0.6 0.4 0.6 0.6) (color 'white) (textsleep) (linekey 0) (morphline 'scaled 0.3 0.3 0.7 0.3) (morphline 'scaled 0.3 0.7 0.7 0.7) (morphline 'scaled 0.3 0.3 0.3 0.7) (morphline 'scaled 0.7 0.3 0.7 0.7) (usleep 1000000) (line 'scaled 0.3 0.5 0.3 0.5) (morphlastline 'scaled 0.3 0.5 0.7 0.5) (line 'scaled 0.5 0.3 0.5 0.3) (morphlastline 'scaled 0.5 0.3 0.5 0.7) (usleep 1000000) XaoS-release-4.3.2/tutorial/tree.xhf000066400000000000000000000046311455214672000173330ustar00rootroot00000000000000(line 'scaled 0.500 0.800 0.500 0.533) (line 'scaled 0.500 0.533 0.602 0.388) (line 'scaled 0.602 0.388 0.713 0.347) (line 'scaled 0.713 0.347 0.790 0.368) (line 'scaled 0.790 0.368 0.824 0.408) (line 'scaled 0.824 0.408 0.827 0.443) (line 'scaled 0.824 0.408 0.857 0.417) (line 'scaled 0.790 0.368 0.839 0.350) (line 'scaled 0.839 0.350 0.873 0.359) (line 'scaled 0.839 0.350 0.859 0.321) (line 'scaled 0.713 0.347 0.759 0.282) (line 'scaled 0.759 0.282 0.808 0.264) (line 'scaled 0.808 0.264 0.842 0.274) (line 'scaled 0.808 0.264 0.828 0.236) (line 'scaled 0.759 0.282 0.759 0.230) (line 'scaled 0.759 0.230 0.779 0.201) (line 'scaled 0.759 0.230 0.739 0.201) (line 'scaled 0.602 0.388 0.602 0.269) (line 'scaled 0.602 0.269 0.647 0.204) (line 'scaled 0.647 0.204 0.697 0.186) (line 'scaled 0.697 0.186 0.731 0.196) (line 'scaled 0.697 0.186 0.717 0.158) (line 'scaled 0.647 0.204 0.647 0.152) (line 'scaled 0.647 0.152 0.667 0.123) (line 'scaled 0.647 0.152 0.627 0.123) (line 'scaled 0.602 0.269 0.557 0.204) (line 'scaled 0.557 0.204 0.557 0.152) (line 'scaled 0.557 0.152 0.577 0.123) (line 'scaled 0.557 0.152 0.537 0.123) (line 'scaled 0.557 0.204 0.507 0.186) (line 'scaled 0.507 0.186 0.487 0.158) (line 'scaled 0.507 0.186 0.473 0.196) (line 'scaled 0.500 0.533 0.398 0.388) (line 'scaled 0.398 0.388 0.398 0.269) (line 'scaled 0.398 0.269 0.443 0.204) (line 'scaled 0.443 0.204 0.493 0.186) (line 'scaled 0.493 0.186 0.527 0.196) (line 'scaled 0.493 0.186 0.513 0.158) (line 'scaled 0.443 0.204 0.443 0.152) (line 'scaled 0.443 0.152 0.463 0.123) (line 'scaled 0.443 0.152 0.423 0.123) (line 'scaled 0.398 0.269 0.353 0.204) (line 'scaled 0.353 0.204 0.353 0.152) (line 'scaled 0.353 0.152 0.373 0.123) (line 'scaled 0.353 0.152 0.333 0.123) (line 'scaled 0.353 0.204 0.303 0.186) (line 'scaled 0.303 0.186 0.283 0.158) (line 'scaled 0.303 0.186 0.269 0.196) (line 'scaled 0.398 0.388 0.287 0.347) (line 'scaled 0.287 0.347 0.241 0.282) (line 'scaled 0.241 0.282 0.241 0.230) (line 'scaled 0.241 0.230 0.261 0.201) (line 'scaled 0.241 0.230 0.221 0.201) (line 'scaled 0.241 0.282 0.192 0.264) (line 'scaled 0.192 0.264 0.172 0.236) (line 'scaled 0.192 0.264 0.158 0.274) (line 'scaled 0.287 0.347 0.210 0.368) (line 'scaled 0.210 0.368 0.161 0.350) (line 'scaled 0.161 0.350 0.141 0.321) (line 'scaled 0.161 0.350 0.127 0.359) (line 'scaled 0.210 0.368 0.176 0.408) (line 'scaled 0.176 0.408 0.143 0.417) (line 'scaled 0.176 0.408 0.173 0.443) XaoS-release-4.3.2/tutorial/trice.xaf000066400000000000000000000056451455214672000175010ustar00rootroot00000000000000;Other fractal types in Xaos - part 1 ;Animation file is made by Arpad Fekete ;This file was made in January 2006 (initstate) (clearscreen) (textposition 'center 'middle) (message "trice1") (usleep 3000000) (initstate) (filter 'palette #t) (palette 3 974867599 3) (formula 'mandel) (view -0.5632 -0.00595 2.428 2.428) (textposition 'center 'bottom) (message "trice2") (usleep 3000000) (defaultpalette 0) (view -0.5632 -0.00595 2.428 2.428) (textposition 'center 'bottom) (message "trice3") (usleep 3000000) (textposition 'center 'bottom) (message "trice4") (usleep 3000000) (bailout 1) (view -0.5632 -0.00595 2.428 2.428) (textposition 'center 'bottom) (message "trice5") (usleep 3500000) (morphview 0.2962971 -0.01739749 0.001622609 0.001622609) (textposition 'center 'bottom) (message "trice6") (usleep 3500000) (maxiter 1000) (textposition 'center 'bottom) (message "trice7") (usleep 3000000) (maxiter 800) (view -0.5632 -0.00595 2.428 2.428) (morphview -0.79852004338 0.16597586052 6.5128239024E-07 6.5128239024E-07) (textposition 'center 'bottom) (message "trice8") (usleep 6000000) (usleep 2000000) (initstate) (filter 'palette #t) (palette 1 1814919022 0) (formula 'trice) (view 0.04141 0.0715 2.422 4.36) (textposition 'center 'bottom) (message "trice9") (usleep 3500000) (morphview 0.295245 0.1022278 0.001364921 0.002457083) (textposition 'center 'bottom) (message "trice10") (usleep 5000000) (usleep 2000000) (maxiter 1000) (textposition 'center 'bottom) (message "trice11") (usleep 3000000) (morphview 0.29560558256862 0.10265658338044 1.2599702089501E-10 2.2681542614141E-10) (textposition 'center 'bottom) (message "trice12") (usleep 6000000) (usleep 3000000) (initstate) (filter 'palette #t) (palette 2 1935120149 0) (formula 'catseye) (angle 450.97) (view 0.09452 0.06434 2.747 4.945) (textposition 'center 'bottom) (message "trice13") (usleep 3000000) (morphview 0.56456577513 -0.832734519159 1.28241119892E-08 2.30852689422E-08) (textposition 'center 'bottom) (message "trice14") (usleep 6000000) (usleep 2000000) (initstate) (filter 'palette #t) (palette 2 1935120149 0) (formula 'catseye) (view 0.02017 -0.07466 4.721 8.499) (textposition 'center 'bottom) (message "trice15") (usleep 3500000) (bailout 16) (textposition 'center 'bottom) (message "trice16") (usleep 3500000) (maxiter 500) (morphview 0.406444922 1.14602861 2.18541626E-05 3.93430476E-05) (textposition 'center 'bottom) (message "trice17") (usleep 6000000) (usleep 2000000) (juliaseed 0.94489594058854675055 -2.7574622589119373924) (julia #t) (view 1.542 -0.8268 1.328 2.391) (textposition 'center 'bottom) (message "trice18") (usleep 1500000) (juliaseed 0.98627653568137823746 -2.8328221743028723313) (view 0.3128 -0.03694 4.642 8.358) (usleep 1500000) (juliaseed 0.98685964056950791932 0.12558544068705411543) (view 0.3128 -0.03694 4.642 8.358) (usleep 1500000) (juliaseed -0.96569613980449897552 2.7259267076790570155) (view 1.6043 -0.77232 0.66467 1.1967) (usleep 1500000) XaoS-release-4.3.2/tutorial/truecol.xaf000066400000000000000000000003571455214672000200430ustar00rootroot00000000000000; An introduction to fractals by Jan Hubicka ; Version 1.0 done for XaoS 3.0 in July 1997 ; Use xaos -play to see it :) (load "head.xhf") (clearscreen) (textposition 'center 'middle) (message "truecolor") (textsleep) (load "truecol.xhf") XaoS-release-4.3.2/tutorial/truecol.xhf000066400000000000000000000065671455214672000200630ustar00rootroot00000000000000(clearscreen) (message "truecolor1") (textsleep) (clearscreen) (message "truecolor2") (textsleep) (clearscreen) (message "truecolor3") (textsleep) (clearscreen) (message "truecolor4") (textsleep) (clearscreen) (message "truecolor5") (textsleep) (clearscreen) (message "truecolor6") (textsleep) (display) (filter 'truecolor #t) (defaultpalette 0) (formula 'newton) (fastjulia #f) (cycling #f) (periodicity #t) (juliaseed 1.0010901162790698318 0) (angle 270) (autorotate #f) (maxiter 3) (outcoloring 10) (incoloring 10) (intcoloring 5) (outtcoloring 5) (julia #t) (plane 0) (view -1.2122 -0.0061572 0.26936 0.26936) (usleep 2000000) (formula 'octo) (angle -272) (maxiter 25) (outcoloring 10) (incoloring 10) (intcoloring 2) (outtcoloring 1) (plane 1) (view -3.0667 0.0055074 0.31049 0.31049) (usleep 2000000) (formula 'mandel) (juliaseed -0.75713699461548487245 -0.15694570011771199221) (maxiter 20) (intcoloring 1) (outtcoloring 2) (julia #t) (plane 1) (view 1.196 -0.11047 0.45714 0.45714) (usleep 2000000) (formula 'barnsley) (juliaseed -0.021075581395348838543 1.025000000000000066) (angle -45.9) (maxiter 28) (intcoloring 2) (outtcoloring 1) (plane 0) (view 0.0596364 -1.11538 0.0605633 0.0605633) (usleep 2000000) (formula 'mandel5) (juliaseed 0.76925872093023260775 0.78750000000000005065) (maxiter 4) (intcoloring 3) (outtcoloring 3) (julia #t) (plane 1) (view 0.08439 -0.003914 5.152 5.152) (usleep 2000000) (formula 'barnsley) (juliaseed -0.021075581395348838543 1.025000000000000066) (maxiter 28) (intcoloring 1) (outtcoloring 1) (plane 0) (view -0.027164 -0.02079 0.98288 0.98288) (usleep 2000000) (formula 'newton) (maxiter 4) (intcoloring 3) (outtcoloring 3) (plane 3) (view 1.059 0.106 7.56 7.56) (usleep 2000000) (formula 'newton) (juliaseed 1.0116279069767442512 0.012500000000000000802) (angle 268) (maxiter 21) (julia #t) (plane 4) (view -0.6152 -0.05759 2.537 2.537) (usleep 2000000) (formula 'newton) (juliaseed 1.0116279069767442512 0.012500000000000000802) (angle 268) (maxiter 21) (julia #t) (plane 4) (view 0.32435 0.002152 0.35158 0.35158) (usleep 2000000) (formula 'barnsley) (juliaseed -0.021075581395348838543 1.025000000000000066) (angle -45.9) (maxiter 28) (intcoloring 1) (outtcoloring 3) (plane 1) (view -0.3134 0.05978 9.413 9.413) (usleep 2000000) (formula 'magnet) (angle -91) (maxiter 2) (intcoloring 1) (outtcoloring 1) (plane 1) (view 0.59578 -0.017137 0.57299 0.84038) (usleep 2000000) (formula 'mandel) (angle -268) (maxiter 1) (intcoloring 2) (outtcoloring 2) (plane 1) (view -0.72954 0.0061678 0.65246 0.65246) (usleep 2000000) (formula 'newton) (angle -90.5) (plane 2) (view -1.595 0.05454 6.763 6.763) (usleep 2000000) (formula 'magnet) (angle 89.7) (maxiter 4) (outtcoloring 1) (plane 1) (view -0.2292 0.04117 2.16 3.168) (usleep 2000000) (formula 'barnsley) (juliaseed -0.009189967915892080768 1.7040566355656396908) (maxiter 42) (intcoloring 4) (outtcoloring 4) (plane 1) (view -0.03899 -0.04575 3.535 3.535) (usleep 2000000) (formula 'barnsley) (maxiter 1) (intcoloring 3) (outtcoloring 1) (plane 3) (view 0.9983 -0.05054 2.833 2.833) (usleep 2000000) (formula 'magnet) (angle -90.6) (maxiter 4) (intcoloring 2) (outtcoloring 1) (plane 1) (view 0.79545 -0.015586 0.27913 0.40939) (usleep 2000000) (formula 'magnet) (angle 89.7) (maxiter 4) (intcoloring 2) (outtcoloring 1) (plane 1) (view 0.46754 0.0010797 0.19677 0.28859) (usleep 4000000) (filter 'truecolor #f) (initstate) XaoS-release-4.3.2/xdg/000077500000000000000000000000001455214672000146005ustar00rootroot00000000000000XaoS-release-4.3.2/xdg/default.png000066400000000000000000007774531455214672000167610ustar00rootroot00000000000000PNG  IHDRUsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxTUw 2CXuu("ذZVme׵E  $!$310I&eZ4lF+,׳tmuy贳׍ /Mցr|"`x SQ%⫯%Iӳ}Q͚5ӽwGzIZnrtt~rVTլY@SHvhܡ%Kԗ5xЉz7}{n!'ɧJIIo[Y{_/ݱ#cPIFժU+IRݮ ?esfu\`@LHoN7'=K#q uIW_q$JwOx@k׮Sát]xy#_?5[ףtӟ׀c>L& ܺv颟Vw矓d ԥs砏 C;tнIڶUB .>mF2b0}?~ݼEy҆վM~Q͛7a2TRZe?m֛nTJɭ2T;@=wWNN>Keڲ7 8PLzB{O?BevN>LQbJ-YL3>ToP=dYy:}oknԫS']۶A)1h6wd2s.ƛ?yٚL߸Q$;_$I'cQ4mڴI;\>4씡=gf|򉾟?_+VԛSm۴io w.KrIך5k&L}EwWLwP`"=2 8x@wMcFvxCnƯ))I^KMMYgN^zQ#/D)oᢈ~/@ٹkns6lܤ.;KڲuFK;w 7hN9[ީg%K$I7q9L 8wߣv$-:gݻWGu*Iq UUUyw\r8HZD˸{ׯ7KzeKzeKҹ6o٢/24┩2ͺ;%IOG ׬꣏g]v5]^?yճNռ葉OKp %''Z۷ǨUVڥ4 knuA{\46 [^=weKI+S^ciAp8@&_ǟ~[oA\uvk\.7ORkwkİaqڷo9uMt飝;wꭷE*ݱCUUHOГO֕#/W֭q)--M.K5M&RSSe2K q5 N@ 8A q0 `' NTVVF 0Hٷo_h)}63eiw6W ]R `' N@(kf߯ >+WIƌO9"UVVLku~Y(_۫DSg|}J.+le?|<|>×RUUU_rZׯ7 ˖IO==_x-[~opbXjm:kC5Y{7Oۼyܵ+E ׎]޳UC&av{ExmyMõ\+F^V]:_U^^dc㎭ZڷhL,Lթ [z}km۶ }㟯O>F ׿_׃?qchUUU˖kAB d yv6P9/Y瞯~TFFFS5`.K|4]_~}}jMr:)oc]xy3v~pZy_8p@F]w\.m;v3{7B.Pt4Z ~ӂz'g3տ__gufLBղe˨kCF*g0~W}<=pzOkVKvK Ҿ}xR>bիWkM:ePõ3¶pEEZ9s|/B]xڿ>^;w҈ߝ&8< vvLgp84y4]tH]tHdرS7r͛@{^mx2驧5;II1#]wzu~?ϴۊ%>cM247!momMxa˯ԐaSCA ?O|S_c޽z=ui]Q'>gtpUVVz_{䱉}]!=cƎפѴW .Lps&x-\_1 j,=np+.p]֬YSL?BtApӭt}:$m?޽ܽK}^yjРa)_^k^ѐOR٬ONԋ?VԔ_~oCK.ޭV66&{ƍcysoIR ]vi:q`nۥsѫӦj]c5O˯gvtW+jSeZ*_] o~wֹpzyK|:K jÆsuQ TCmȟ,wywJyeJNN}}yڼe$}O?F6l^>Йgr kǎն Yjwݩ?V_t-1 ~ͷoU{mwz)**ҳUF$]}H;^oYzڟ=lp3WkV#M)ۮ];:bQ$I;g!cuޑ|ܟwM7qcexi'hABv~\H$IsO$uIGfdE#?''KIi$MnW3 >3O+tg^qck$ 8映W;ն/i}huJpvڥg}W]1R:H֯ߠg}^OMP'##~nGyU~tхC#nNj%KԦuks:#B.6oޢф$~]w zᇔN;4g!'Kr׽kǎzIz˖ᄃwyҽ!e%_=>x1ZoܴIђ{lf[,jO>7hʕZ~,-ZH6nE96F} vmz+jqFYNwv{ќi|\ݫY֭7Xǟ~+_v*޾]UUU!uAuc }=ϔR69ԫWO]}(]{:Ჶlg״ o$\ `{:E:@ںuۧ~}x_KNNְSOѢSMɖñ'y.b};gN=e~X?N&]~٥j,]zE[+GTլotՕ#`A.yu7rlo K |y4I(]вUECu`7P%/N};Fߪ?^w7. =^mF'h{чuT׮dX4e4z95L!-ϭ05sRRelJlV| kngz파 }y>c&Nv)!K.td׿k{nmrknR{ H8s4ty٥u!''&i3*##]w%%p }tĿG8J.'R͕ik5ھ}6h]"WF|[}[N;4e_~ߥKgJojժc8p8nx^/d2ըo԰S:.K7ow3OMR%IkDUXZnzzZ׼ysmظ2y՘ϕ>-Z)Ch?XCN78ZܧOo!O=zt(XMmLF ׋GӼ9][Yӏ?Iy_um둇PNv$_7;[󕓓-IyZoPUUy?,А]@ :Dء7- >S CNxZr 8F-8B}ѿ_S?B' }jL=ZlYE,n׮V\%KޭxHWY۫h6munyk֬QK' &Of͚YuViiij޼ԦMo`TԯO}Wҥo߮'}A:cI+e2O+tg*##CbfϙF{վFhŊzڬ6m-(;wUFF:JJJduծ][]Nk׭ڵkwܩwםyNG5kjSw"fz/Z]tV޽uEjizguJ-^Dg;uqWY+WVϞ=TQQ+WB*k^"eyXu%IԄ{ƏSVi/ u|?_z쑇4G*##C_|֬Y)/>R+=r!80Wκsc6u4?Qy'u9g+++I$m۶f{?,W6mÂ<3&+3,EI1kժMcݣ{ꖛn-7ݨxK׎^}xQu~mٜUT_'2 l65mK:Umظ1le S&¢oofM7^}/Y3#3t߄Ï_Zgt]pkse=^N4+w &I|mozݿājӺZtkhmx1Tss6mES^O>ըoЛy[Hz})8y}rVTҋ/{ݻw9C}[?,Mܦy +fK3^^yU{=m/quqz'TPXUUZ(_cƎӸSNT3?W]#7zǎt֙_~-Ish]v%zi˺њ\Q_Mr}[}]ڻw>dzXos>[YR΍gDüy?7o@}{(I[NtV\3>Tn 3.Ŀ鬐ٜb@3vڵk?E .Elg @<#8Pk@ bHF~H zE gqQT"#[0@!5;F-6 0 8F"\a\h1HOq : R0ȌrD hFy `dFgJv P4=߿`1 !0`ڢ}D (hĆh?0h 1;8 -ZE 0~} ]1dGkA0HTѸ"!d'ga0H4M}C #/h@")}X@X+ 2 h  5ս0!n@(@j`#DC,H &7 $@+i3a0Ahb'$c"yOC `@ /ry.R3daLK-ۡ!X=3la$G06Eh|#k"qB ` <ąQX藍ј8/ ޅ x #16G\X @"h?5)!dx$F~-=hz YU4\4PQqB E<FS@"MFCr IDAT x@@;ȢE$P6 I&QbDm ">6x6[++BʦA=#垄 xhH}@ѷ.ؠ7RFu -`(!2"vExM6FCh" x@f p d_:}C.#fK<=0@0@`7H޾c_ˈA0BA]p"Lh+x gya/TqA2sref{D#2j`F`Q 껷 N1h'8 4ua/06Yْ$3t֥)3gB1j`!dkG.uW4q94e ~<4ޘ!vb@##+oC窾=yq[[|^sۭυɭg K2sr+>ר!puF=O a ` `;q?pm|=ھU#&YJ5Ԗ}0yEW0[Y=/Ś6齪i}uTΨ)VP!`bM#>75v߻G.{YfͤuهG fh#}GzGI26#XBC9N߆}a/Ԇ3k˙s,l ٶ)gk?)ă9ژiE",s[=S;>o)$IXTYX{+9#3PfR-g:i7-f)s?#XD_I.`T6[G_E*ѻ5Gz^a6bj9mJF:GJbF =uM1[Գ5aPߖ }Җ fs?@ aTG=| 5),jhX=M'4xߢ~15;[]r؋z_ }_t[f:\BC& D{n 5[N=_a*UxE# 697 P$`$,B>1%9 ,9aIZe?WidpH-4#9l{4څ02l.14eYVk?Zp=E:PP^8lkii69e~lޟH};D$`z)h0Hџ{$H۫ _ H+4 \p}kf;=ŚuhFMmv08^D$M> >ԁ!s n<7X ʶ^Nή^](:Xho @|!@a Fh<5{v ;6Xh܃Du-|>!@ߘ)'u atﺿwŚݨ5~B78y_p2b;5!x6p?Dy զiꟼ;wd{=W?N iW`Qi6H8QĶ4hHl.C*p?46#zq:˪1+pKޖefMz/-urhmjt*xJ5O5[fY{lAϽ=B_Fn : 6yl:cpp\f֤TUi%O[\]k$^Ւ`XǎX | 6ta!'%0 yXa7Z,֬j..Wߎ&}[Rf{i{U,֜Z;T/5[R eff먲->s]{)Aee[#UVW;AQ@"X?kYYLv|ete׃0|pÕn}.<VzF_4віgv+Cb#ăXX聝Ś-Z(5KK N립u)KV,֬C?ه~#%UTH-#+u:1`lIlKhsgRLz7\4gOܽC?#rt"9Eu =7\}jS@B5 fx`\ =6pϳoΎU&UJ{ػ]?Wit$*[u=|zC|MuMz@Cx 3tSrh -Le#ѕD֍ >#m*ee[duŚkf+3'WmaK?HRY*unV)=JطkS*uJ%4]!H_# rz-!giyɕZ#=S&ʶ^`9@u@ ׍ l =j o8Y}w\YV Ԗ#NP^J5[RjKkpivvd)M/Iڽ\oo_ #+2KXkI cxF74 fY5Z`ZVScnց >#ÁC] #C,ѴF:~G'ъu_},lU+9=WkVPј18|>ilhX8}`7cy{·=gl<;zUi X R3sJ7T ~ //^ =_Zm h2~V]8/Ç   hwh?Y(^>9r ͶmZU},eZ} Vcx}55KLҫrgO]3ZMC]yI.@Saqp.$*#}`ѿh;̩{c5]) F=A.G. \[TL ]TmhqغOԶIC]Y !>$2Cܺl{#;azZߟ`4AcMiHA=ÿ   9O,kjR.?u;H&s\i+gpl :i'iUK.in_Ijx@e=c >/`x}/~~cF~\\SL%I}m&MCGz}G #v5\Zeφ3tPkʶ4*#.B>h@"_[]i=|V^TUe.9T{C!j C`uz~~Pfi^[8_ÞQkR;Omlf+3g )3gR?(ˡ 6[GB0S)#qͨ;u QŷX )]_[=wx?Tj;B<2qfv^n}͞'학̜:n #2OBC u Q?yc{v(`Hꗞ:Vh}?=5IVɒS=c40Wc{{.IQm^̥̣r}}hPF9jDu QF C-lX},m+bWڊ=ʴbVO/ D)qU\/H*8CuTa&{gJ}  G8`2֑/AO ]=e%>s7T}|C_n)SѾkڻ?F66 kgbRK;osgNϩ96OͤҶ\Fw3iaѮ#: 0ifۣ.@8piQ}_∇,->Y^fwmݿ7H-RLY?KU.]&꒤OvtRx5?'R{{aw؋}Q^9!Y#2]lqPKU=gIR{kس]'L?KZ}0KT},YJ55ߚβz멦@wcx4NZ-sQ4fv!‰MzGtўכ;J2%U`>|*ZoKY;k2sjPکZ0 f@A6[ǨxDP?@@@$"CvonqAwQ֪C:nztsFK6.s ol.C4{S5e}ly%~{Sn;XY(=;$2W n cf=v0m46yO1-%Á^ڬ;[`JKM^*ٛ g4ۦuJ5:It,_ [W)=}#iUYO֎,us>+k67l]Fk"~2)% @Klt5hXצw}mf=P}lZUV;du][G^J0wH+v%kݥ̜lYY*ԭƔ5G7&荵6[FG1Dn^…~&̜\}V/ݣ|Wx?V;IVk3iTei֟4ؽƯ'w.)33׳pu}m/W\Ex,ڇ !hm멮7-uJlumJOMIhWXRTUoK\ZۤwY93'7hp0:1>, H8{aF|wgh5KʊaRL¦o ]ZewOY학S;ܭ>so$id(SAGw<~ &Ae,.$#$Dkۍy[t;cSݏJm|5SC<^3FhpS~ @"σAa.tm j32Xtu؟9\;g)QDA bh@"σGXq#^N\SY=IfL0:F IDATwxB0u@?C }|\%ݽoFISj.PxD x Q0#!:,GG~T\ %)=ͤm*vOL*RٽgN\_iMz`y;s8(mf@[6jc*ezZ&ud*$ZFfZ%ʵm3 1bHw@:7esL,zĩ&Gҩ܏2KvR'_h_A+}\Ju3 ^$ ;AT(oon&`#4<äf4wWH)֚}N$YJ*ޯhJc3 D?ZHuKP Cߚ} 5$8&-cӎ6SUՎۿ Om_&8xP-5y=\>s, HkV@5lTV5ňK6[Gmv1 uЌ2P_os-}$ [XU%=+'nPh mXǙ=;[h/x#)Q( s>o+ "R,.sS,""lЍZ& !"R,t;>z,pkqK= fRPnM#T-uo7 .5&v[*tjsڜc7bIJoY6E4ttn;Sc-t |H>"""\HN&Sտm?Q;Q噊Fo0)u%|r~wsVE_<&_)^_G!nYodB{`_ %? L[DD`F`UǢ6mKnP̈́XYfޮ)e Ac % bhW +za9Gl&nv3f>_f~&dftED$Y""""2= DD>'Sw>>w}Qh;^_mrg͘3eq:%CuGdN]^RI]!cu-=ўLppcylv63^T\Zg}ɸ\|G"3Kדh EDD$KH}NB¾t9CgX&&_ otdxAb;7xJl%qEn'#)㉦eImsV{NZ6yV;_0bٚITBU|s.""JHP(""N9 sTn;޶?z'Rylк mKW~`E?X݌;_ 6C|^8^\$4%wbkSgͣ\\ү_o#JvS8iɳņkύb-$sEY:j""""O_OLFD s2 nm;wvIf,\*cu .KS" H<6hp41͟?-a}(W-rj; G!JڝT+y3CLo8ly._nЙF=a&$xհJ!>.d:""Kv ݵMI ED\u)Q;wd}mĢbJW 6j-u/͋_YkT2zA@*xa? m3POsk<ʕWtA UJs __oH?4oc<pUU&Yz Zy)hDuF6'V[ʼngEcM"Miݩ7mNqa:!:""KHNP9>)dT)tɂٚh?cP6*NUeG)Benkz斁P: vL싅cDn/)\~\‹\d[EGw˓-bJ_eʑ V#<>C uڜCǕ~7i Sf:rHxr?*""+L )dT)\c;}Lu!=,r&?\(ך7.wİr%f+K kˬF@Sls784s՘q\5=W{N`"6_!RIАn6ϛLQ޽l5'yl|+srŵ?r λ,""" N s""L8b;ljsxN5f 9J헏N؞%./۱y efX1NqVZS`1s0Йy37glhB:= K0tEDd!)s$)Tt(GEkXEһ%}\Q@k$Ⱦdj 6;e7_p6{:b|{g_+c5aiZ >DUiÜgG9@a4r W' :iWdUL׎9O ' 6S8eR>w!y9EDDDr)Tt(mZ~}§Ƈ2yl{2fᑻVJ׀O:W?|:+xlZ o|>tN>,6Z9@8Mspsˁ *noAh/l};?ŕV ?;j MK=yh^ͽ\b?H)kVDD`Y0Cx΅*d:!ܙw2فcZʝX,#^n(0n<[İ;Q.yqewFtoW|mxXsj92%(~$OOqC V.8 {7$ {U_](tEDT3\B7BDDDNyBLG:fݠ!O[StGu;F fT-Q +JΡOY0. T2J\\i9Ev~? l@ Tm2f˼>Wy}e;MKN^DDN,""" B@΃"kI(ɦƻf9x[nSQJS%Aw/7.2k3sfSYo7{n:-]܂3I(o+7z|J;[j1ee_Ae9-4J@H‰cVË *k(w 9|s1oFw{7tI5/h^څs/""`Y HaҽMK17{Y,vv6sJ3{DBq1 ɊL7=tF"|h׳{;=<-:ȍos\_V;2Q?] =L,g95M$46s8 GBÉsrg-5Caov>7ci<~3ԞLH.3}XDDDN9:"RtoR;}Le߉*s+q?UfO8N+nAjU<+CCgWNffc0cvV9C,{p[[@"ʿ{"cu{:9o2{'K=xJA9ztov9 GvZn"c'Mԉ0zl%p1Ug( K_DD`9劽W"d 9agL:DV~q 9r*:tѡz7n48T# )ɶN;wco7W;7#7g93RI)kKq \x`Ud99YYo0xt 3uY;}1Wgxz ο'"""rJ{@P/"I6Bx!DdU!m Vc6,*bav09j*_;9hgklܴjRS73,"\Ry9   xJ.o [RpoyFS1y>o?g"ocm5C*OBȅ/""ER\DD \U9Jp 33T GWfdᠿWz82ZFsTB?@v(<#>sFWg綥5(a 7/mcgt^G $l,P~.l}#_?!zS-Ot>FVNg/=\]M{ u$03T ' O} ""sM"""rj($BLWQ?y9^#*G64Kw }FAd#N!]H"i`U _V'%% .c{|PRc=J7{l48$o7݇*R>/ʺEN0Ti]{*d_?pge`;|T /ߍm|bH"@iJ.f(BDT5j%"""rJkXP-"K5BO>3GWƢ|tm{͈0N{Dz_|}aj-8:,I?xL!zH(cጳsE '+P{<1j;Aa=0'HNZC +o_̃)6Blp4xx*9[vY>8.]iaJGw/}48шcԜNj_"\)\!}P,""sEXDD k2]w73s8+hc[zXyccD;S`kVJU+KM|r84\oj 6p7Omvj-tV);1wDE[Cls8haత hP+0)ξ~#G'1=]̫leOkl;3v(35sb}N;JLddBĞc\zS~ HxwrIyA"|h?vUƝ8ct*aX}P?\P,"""b~;Ğ:HxtTqW_Z79vt]ֹ+be&>M~}loZ %<;0ș;,cO\aKQJ|gD[S\.ҕOW/<S&4Bx\sӹD9t />Bpݺ~ՇxOٔY:YYja6M\]cџ + ?zWz31܌f3xzclrq[̈́Pn/̟1+~6pտ0xe)I!XC[ EDDd^SxPL*"O4B=ÞO>?'kۈ,kz+!`8HpXnq(;cS6|)Qhsuljc8J z.Y IDAT <S ǧjsBDDfB̫B)$tJ{绞J/ !lUPŹl}8]pX`_,D#z'o*gDhp L/ZNA*&ycqbvnc~<rǝ 076x-D37լ+e2rޙ>\F:ϫ8:7]сu<'^S@G1:Wt4%h+({m7\_9t9ߌDZWʡ?%vjuYD>~Xv6X;>X8EUi'#ⱟFeI#/I7HӉ0o;>1{z}O;=Tdg'3`P*־E O-t#DDDr"Rt/*Pd>S}Me>|/W:xзlh";5Q}S=RO?ώZdCylĝw^|uIc1`6 ֻ U 1pƈ`}{^?62ֹ+idi 6_OP60w $[zYbK+Ky`#{I~FRCpv8?LߕFԚ$wvF\mо3zc>_>ks~.tT.Q_Thh0)t{{3]/3tpdq[ Y7]Ř}UPP[k=/[G~Z ze*A8.ݼjlOm7ʄaJg5N~x.3z^bޡ'eΖiŹ 0d+=egⲳ[cDQ ֻWU(3 C_ Kfmr@#R3;})JA_(@I"=LwX4@,8ѷGT =]>$t1})kQDDF̹bE^&ӕBS}qG/[RwCX4@`#w{CƵ-QRnmuX(c7Nx#aW_z MOr }'BWd-B$Q.]+hO)=@r`8B\Gܭk0;E| CF JipHq# L A;K;/,$nTS1 \}k""r2 EDDd-Md:\=L;jal%xUM<NƆE=9dþp7-)$ 9v7|I:E c3!c<ɳ翎ލ?O}c;[B86k G=8_Y|'Jmc} CL|zOuƄs$#N9ɾ =8x89'S~-rU}Y=6N<ISVsCDD&9EDDdNzP'"O1|ͥt2lnFߎۖw'=o'}Īq{ :*NWl;wBڣ>*,vjm.Vu%wb=Qq=4TGرȴBڹn>r>޴q>hkD/54z'OUICDp뱁nS x6Jo$5oڝi#)zq~xB6#lsdNQCVlssDDDƣ `SPa3_rd}L+\͘&N[ cа3FVώT,CBsDDD)9_Fd:%lwRٸΠ"6~ᶚXic|[NڶxOv=-㷱rw}e/w_M}vV3Xm1Z-=p4lsggv֔ڝ ˝5C{5jbm;nETOJ>v"yrO2` s;`deTm8powY5l*U}8BV&XDDDf-_B<&)tzf\S3VoG+pXV9 /277?p Oni]߶'vO8٭xc8FW4BE]O~>wy?p8zcZhi<đ0C?W#ﵴ,Ztu_I5l*v*Qܤ~"""2kT(<|LU. }s}o:<0gp` ._W`H-; qv8.Tw<_kWK}-^7ں-kG&P%n3oXtnv,5Yi%t m9tnPkU9~^!>5^MfZH~+ЎGD_2UZr-q;[&@l\wd/'teK3im;#bN:p]!S|+rWxmu~; n6Us|\9yo unR',"""3VHHұHнKN&9 xX4@S?tGӯ{#).^b̽]!Ivu^sDCG94Ү'x]kfKI߭oeKG8i_5T# 1w09r{ȞVVhs?XDDDf(" %@Kel|n;?m?<<t8^0sbrE $HWKZ yy.Vm  3'qX \CM9&{[6g.#P?V.Hq,tDDD$?JhZ(!"C-9\ ~ MS>f3m#w L8Xzm1/~ wZ{A"~~yxߋ ( R]v}៳\lѹWq rn`DD`)Z[r2gu>Tc;Hxw0`K+hg 4IUI]E{GO+ >sm9HˑW 䖯^{ίg6YՎ.ex>}_;TtS-W5V! sGD8hhBRPP(^2oO>LɆT6>]hZK2o] xz]%tl\bp~kU w;X  r( =1-57Lu;w?[YVnv7=sv73spαh`S7cc57 aHhknS߈>B7@DDDd!(H|{L&~]9 (wIp|beaS.7&<60\=)c5_|G7-Bq>]kI ~6;_>2FjJXSj'7F/Ef+ws<_C_g%Rt͉>Uȴ{e|{L$~ 7T\y*3տe[ۚef8˭&A g:z %a/mg9<{n*ක؍׽A;Aۄ*7[.W0Z)\ EDDh[_D:(`&q}]0&`j;>^HaR,"""S? ED2Ʃ>~ j.ɡJ (ģe~q 9/gJwK;AXb^]>q.6WyZ}"hAA:37.)Vpl4vθ`GtWUg]y [42Cr*V/Kw4R|1 ]7KqOǨJp:G7ʇ5>хn”rHDpXDDD$_ lOWh S/,wo NvpeM.6r_3GB)6mJ'5 xKxSヴ,q{غx0:\h껂ot2g;տV\Zfr TJ""k%V:  ÖᯁV1 `j̅TUpZ>U{_]S""CsHR""Nsh 5o1~xwu~tO4߻o$Ewv 9q:3eY|f zc}6Χs3ωʏP]fm/6gU5pɯNbX.cu-ps?[PO//esu) = % SݿF˗yID0(""sOVɶPo본aѩxj[;ŕ66yҡ.~hC AU՜ia{mY~wlV{ Ewu>{&$uWrz\ . \7} ]ܸF_&_/e|a{+Vʹy>B 3BZGXGDDTS,"""I_,H.=J-d[l|?މmŕ6:|vnoYB IDATx"ƋHjɗ3F*-W5 }mUi{y;B} Yi9õNrUzl~',3-O7qȼ3ֽs(-w,aM*Wb!W׎H"""2|/,"C(pdbrg{7~l5uAM~'V9 \fc0˕_9şϪAx|=;*|zَfaa1hHp7C *DRA{ Vs(*N<7 Lk`>sm\4i \L}O""ML*,+"tP{*1l8 PYC͉E/EX47 C~Y_+ĽWx/ NgbW*[W7FJneZ $ƒ)v.Z2nqy.L;Q<Ѳ'C089r=.s_H :)dnH1P+ 9,g} x' Ǔ=Ol& )v\"-pqs{(>~\pU/A"iÿ#t>H a֖YlOmvɾce"<.W=>хnƸ3"""T,"""ʷ/O"RrQB[L\=7ѯg+G33BaƮ6W زEuWP}w}1ni{ЏݰYwan\\o Ct 19T GVΤ8*'R¹\ \ʵ "Rl >ЍܔOj>UDMS#u> 'ymuv6hpwH$=YeWU6㑴G;vrl1xF9}~FR&n9J+n#ΚxUs]YhUzUDMM祝z sвL9{lʄ7Ar~.;;vQs.Z[֤xWP6WI|)[kGOFl6 m>`P<p eW""ô )4Jqtbe3׏uߩ=5cuۍ#)V3n*-;@tٙo~ Lۗ zK槉uُYP{Orz \O-Q"""rjXDDDƕk_VL$_)"C_.ߎT7x6J3tG-4|gyfGS.zϹZb%,[Qe&LO-eWE+?GCx}IcqOwAo&}lU1"ת|ԩDD`#_d͗vH}(|\wxlp!=]s7TClxڼ{L_7qx-YT-ՕghㅿכP|jsK!>E%"k>QDII)cqLw֟(nos"vI$+髎x o,Io樗Ӭ]|[Oq M9Snf;&_(C(Tm&_Ts( ~.:2L<%Z_u|+5?nm1Tqxֻ'om{ }~zvݑ0m;}NZ>'OQ48_.W}N"""27T,"""#F)~mϜ>sTUNuVmŠ=UgTH#Ϫ,IXy~䬪.N3ʺr no,Ag㚾?&! $$& UZjնa^}wk{w]k{ͮk{nݵ[AP!H |~VKhuPtBRGc6rZƉ}ju숱0W ! @ ?{G?"Bƛ}  !!i7ǖOqf%8[\!1IN,4s0填bS-3,\Y9.ym|ˇ8nhcs[ 7‡S|J{[(U.EܞEޡap1Od[`!K ! @ ? E  7#x~!s,#p rb%8oَr+Q6,'v0 I hlHsjXWbtO'N)̪זB 7V(eeϏ&:f$#m7 10V I w%@  ?,sXF70DP_fce 9VS^dپqk.'ϨEF ƀ_>(y٤'bQobwsbo?gd+ 5gq݃TV7.Kh>k5ܝxY⁾֤Xf;rL b Z&,.˼J1X5)?Z^mK! 3@ , ōx@ 5ht/6ގǘoiч8&&]yC4t XI~|m%dИɧ)Nkxoz(*z o<{ܩN^E\_$Gu*.! mϕ@nuc_s{C}:vˑ!XF@ B@GK 5h17T׏iUqE>ē<៣)T095o-7SJK[;y1lߑBJ*60{⡋;p_F?N{ Yt u\t. #{.Zݸg4OD  @ DC/`8k"^_weE %\Z!5%7HxQ1$BP-?oohuX}%RIFj7% ItfCRގ\ca JSN;;CyniagzZ8 @Fvȶ驽ێz}ΰI02&Ï@ 8"@ t"E< pl!s$B?}~{-NedҬhx~\. <&,rn(\[7XE6j#wt5,[WLVC|\VQ@KmTQy|3QW[ 3;֓n8E`@ G'Ŏx@ g/_ܐP0XO4Qii7up  5DUVGNȐY^bi{#@g85YZո$rټRmEW}}ӟ;L9o}2^5Gk/' =?XO8*Ovw70=cќ#Xy^duD]6 : P GGoӟ.8W3`ULJ@ Z?U`p ֞с^wkscc踞Ƨ^q*ҢTJ ]#vDiч8&M& CJJR=՞1(UX-Ŕ}RCJX4tϑ58u um*˶gDzyJzy3st*ns4x>($%_@ ȧ8jyԫX\xL[Kn?9"4O:< 1B󣮺 _輗{ZjLB~/u_#fsUA1 &] tymnc/*4'DC@ ģ? G< #?c-tldG8NHu=sյm]M Mz8&涀T smdgE΋Tе _/1x]L}D $G׳}t#E&[[qkWɆSlzRdF~sR^_uw5rc lw%e_1`wf3qf>6pwuc!v8!x(Zz~Kg$1s#h 7TpO}#Nd:&bWQ7JV7.5EBE@  B&~,"@ 8ވug2ܾ :Zî[#0 >^þhv;:ĀXݩQAg IŨ{'+IWyh)`~Z~]_"_&E~z ܓe= rZ~}׹'a9&$*xtF͇XtGsWPAc8,Rvot7`~bP‘`~'E++Z[**j)!^0pM%df>,!  @ MэXsF.#!owUsOn&XNnNX&?D G8@ 8A7TG ^_AtF7ınL5LŞ4Jm|]QMa4:Y_Vu-۬NX-hrhVu9;ݧ% jhUI4Y$ӞTTTʈt,bB8G}X[A49zs a;o pE;~R5'pqn?hxG($n&4U3Qd*`1" 1T?ÖjHNwkai `!ԡ}Lmu~?a{R݉kpFLմ5-~o}뺯^TTL8\YᴛކRLF\xl}cm=O10Z}'@01F /z3ofdϥdϘuwO_?p}\c&_/ai 2-0늂NDE|9sU֦R = ќ{o;bs;T*[쇘wEe8&NM9Z 3KwDdd?ױ9{y5\+gN$[G+p9Y\\Ǔsv?Nj|x.oo{v@MvǞl'÷vT$4{'u3GGk #8V7T0_nQ"ӍyI:r}'$x@ ݈frD/t99rNX HhuҪņ5,2Jl7r^4(fli۳:!b8sTŌR rˆ50qə'M4TVd}7"EP{x=v֗וPe}Ă15ZZ:C99=jX̞)_[C*z[X\GyF  Woq֔;:'3Kh25Tב$T\H}]gyX ^ 0߯/蚆N/Ч}s#DC vnk~ZS Kh+XiBb= DZhtv;r9z'۬co% 6,p,h@X xA="F/B0ϑXvNd;tGB%X Cf:6$G>Ec4$eU-=qd_`ch5&MtvItkKh^ipNb*}b6) ndyc4x,NsL W.ПpuH.v]( HĦbxYyu}g 8u=U\ VB[ ,E E!b3?B㤴h9[),*:w3"w| r >G#m TEF܎:H=Ew4I}E ~tK[kx$WfIyW JnX.^CA~?}'Z !@0Ԉufd0>L'ʧN@K9ZvEd yh92{fh(ZkSwNRSȹ}_laC5lh G_F mJʿ3W0>o`T/&w(hEp @p/bHC ^:oco=׽]"z)'!C?r)=_I;dLXʍ fUNv7M)rY`[3IjT'FZ*,4K2~q?7 IDATV˫(Cajyyt%|z=veqPwbΘ霓t3IQˣ%_ENNC?'Uk,/ҕ'no)`>w~>K8z~r )Dt4q.5"I]IU'+%ܾvdgFOc޲1{d޽ȓҩ֫u'92 mo8s{rvwGsӌb[U9N׸b Ej) GmsMTp̻2PAkn WdM[~0 :vg6AU?Ib*nW2N 6Lp <ZЉ?@ z, F/!/#=o42zjC"nbۥ3H5L$NZ0Wse|&8J,u'C50$Upre-*2ml~meˑi=/u(ׯRRSD83IG8xx*{ NJ姄wS8X? p_j9MJ]kC<_>ǂ'C@ 8܅0#'@[oFkKE5.K3$*[k#7Puqkrsرmw8wRtuU,^LSci `8wǫyсZr/g5rk+n0Ŭ{rF^7ڜvzy ȐEN6`*P]l%zjpHK輘.]*w G!}-WfrإG:}#Z,Xntgqj'(VGCk<&R~Nw}E ~9#ȼ:ychezND.Z۶?Ϝ-7LfGvi r\my m )w#EݐkPV7Ҍkp;EOnLO c!W {X})6̿i@]vfS6jO-*n&M f./Hhi'Ov@+f*lG6< ZNuPrsFFHh;0J\#\۽i=e,g$3״Ϭnjsfw6 $~፜_xro;,N2 })BWohFFF.@VA)àxCbowI mK0PwC|ĝlq 8>7B|Eẵ|d`TIV?NW@U-Ѕ-txdBZQZͷ'xf Ӓ0Q#QHUA} ~.NwAEJR:Ʀd3V@׃x-s06 Pn1Fn.Z]Z8R :ާ$PܫK>;2/`4"@ @ o%^~Vs kC9qhuY\~ofy)|@QVKk bAW,O3THRZKX^`ޮjgJB2 R2kk+ԯ:Ehyg{;WnPF g %zx ~*Zϼܚ9S :^Ӈy;Xc: ISuh q !G٦x{\R TXv *RpUdט綥/=Dd\6`?^zL}+z'K] G oؠ UU/Ŀ!K9?KRXkop֟'=ڿm)d/dq :"F+\)&I:fhNfί.'}DMjM"3@*0B;֢༔3Ybc{5^J׋k䲎94M9Vi6g[퀏q '"3ՄۮuE G {_plTA)?6{{?k/fyS9 Krݸt](mOD:5d dܩ|qc.*V$}jTq݅DydFvʱ'M%%>_#: },J ޡ0}&~>J÷k( WÅp  `@ NA 9D@p|Mp0xc.) t{P4/UbGK3xis(:h5Q#1cLg6]ϑ`)n߾}3߿ ЊfX< DMRXy/?o9ߐ8TG8DDNZOydPN5r^b jΩsH͗RnW(kuv-2.KӕonplsmߙGR*q8)FSpi2n]$o罺7l-w GLoZ+]B*>=#Mӵf^Hcz7(T2j vJ/UN %&&$8jDž2in3o;-~@!mG%S$߁ '%?Ms+w^9jxI4@}4{8o;*ͽXk|wqjJIkqEOgCq>o+kX<&COo?Uc<O'}Go"L&H ~n=KsTX>Si~ V/$+pAQKW2">R ,!*$} ;aČ1|]/~%zb8'@ 8AH#w 'R? wY&G#E Z8R>O {Z(} ydβqByAB&$Î H2->xc;ONtZ:tH)&vn̫Y\Ǔs9)[\IޭO2+Cɦ ^(əjW{3 S' %%A#vͯjeO-;n.8Lx<]̟Va +25B5J ocya7tLLaU4-Rw؁OdI-~^z^x.?~LVs |*/_Ixbd-&[Ե< ?˨Zͩ4jIVcbo`NsՓWRn}w׹*_o]3?iO8gp)BtT2T)x}s/pP i4r|aүj~{9_ovR#&6fdP9Om4<#L: pONOԏ&e{0rPqu6 &ངLvz\ c8[)O#!0LYmט+j>ژ#!MdiGB:V;!xos+4oB4Y?|f&ng zgGY?| +7`P<W 2 ظXE0lo-js 9V>mD~?Ȟ{qʊPݯWW]@c**TzJ 7@یA)cgsۥVv>.aߟz.?) 4U+jP`TK|חBsG[1G)ƠyLT1VQ0{LgvT>޹箱2y/Jy>1>LU>\gHnb"#-r{ܼ-'Kϡ/Iu#^u/cћk)9t$y郿`Mp|U%_P1a^3:S`"Yb&sƟ_<ǯOdJ*xy5|޿Ғ,{ÖMHIpasm:gBxLMk2qhu2`)9}x.2`mcW#Sw=LtwG'jX|2ֹHL>Z <|EV…^*ڡ,CԃqnhNޞ80D*+|ldN!o4w]^ϣX d1aw83%] 67v OVߜ 59XLEN㙪4S76_#lPW"(eLQqCf sJ JVٓ[ףK8P_"|*l"c3hXLLLcr6$ukl\/+;KQ|tvb[x H>{ fRUcOF*FU`uRkr^\{a+Y59$*[M㇆pX֮$*%NJ6z{=wvW<3=y(kb×ӺRàS$i7cK;Q#quc=(O m[`Z66O"fQ`~LO 6tUar#<Oj)j)!˿7J|SHd&6X*?fn\ v}#ۦ/e_.cqi  D !@ rS0b@  Zr|9ݾ oݏ8k[UP1x4]/ݺV.|חUƵj ۷5 }brGi9kyƒ//3 /Z95,LxW٥︊)5ߠg,LU$@zb;qw'ȋ()x}=jLLZc^'!G衋h$z:zml IDAT*yI)8&XtXf0ov6לJߢi?=H`P[w?FgH)!f,V 9?>3ҝv뼐U)xrI_kMcsR5tdd GPz]C{s[ `8(G8@  sDw #pve^8VpdxHgpdNBb&Ë?_\L5LHC@ غBʌoۛPn/5b ׯ $5#n|ܕ.ʄ봛,&I; $dڇUĎsjeyi Pk\"~~vJ3{W,E65[,.ઇwZ,ۥwr] ~lW"ݨ,kBjq7w+u_[u[lod^XԷLח-n?mcrSkjϻl5![^`CWS2.88lnfWG kr^>[ӎ9R 9f+j\]ʘV*.QHa3Rnvw<ث>G+qpk]ʔwyn\gBN4G^g{I"Q дxG?(j I 8ƻY.=:[)uvD}>(PMJ(PW9#}kiQ`o֠?-?rj;|ܮ&HTw .̈́TvU;!`Ϛlمy?c|3&Z9|'fՌz^ .Y1 }`Qθ>vsgz"`Km!V:$.Qe_,l/kH5Lx.0Tn_h V7Tg ۬1,9'[&1{I$ !,ч@00D`@ F1%F +bZD~w,G-oOy& 02>7pe68h"r0(9yDR֫=A &Nz^~[ xQu &짢uwUECG~r$~f65 8.6)cqv]2w߹cCCW>:SYk2AMet>pg?C9\%?$ZÆca)!6BUF'SUsxyzL>y%&OA Z^kɼ{i5~qKK/7/'86*LI1s(W1W˿sH?{AnkMR8QyCU 9הظ.*ךR}v>SΑI6 HVez^/ 897Y'N}ME'5"m(mg7:2:6`Ohd^NPL`Q̿wܫ=c=<" VD? #@ b%@pchn8oh_y8qv!qg]L]ah&`oJI269zxx|2N1H -~=6WxϡL=}TĵjjM'cY*'w6۽8=әw8(*Qᙌ Ӑc?W*e v-*$7Sbu`n21an2?#q#8n7PT%K~xF&^F>fl5Uyf=3~Ǻ׷rN CZ¨hloせoD[q>OU5 J) ljr^ 5:e{Jξo=`dfwo0g9KkgGi~pฎ к'-DEWqBX!8EV"'$=dn߮;_OY*.XEBZ>/j۪4kcn39bhm5zK%dhB,pDR[_ԙ+ظ:{ƠQ(=x糿.)>^0ˣcTh]q@{%.T ?wo,>_e<\ŧDʼt+W("viھs]6 (CRI*7Pe:Ϳymhu~W`p6qS8w-Ly[7gpS7l޵};S qnTugswB`huK0's(=#Bq_!D!׎G}d==&Æ];2y~r-0;yN4jc᫚ZmRa]?^P3jYWGޓ;ȵu$ľ50'b'C8~< .RĨSiT'R@%M mgԠQ+mZ^l~V~:l j ^+!Lm6 ̽kn4]jB3xN;{VrO_ƿkcƼ̲.oQaa՚|If& -58~3H٫jS P\SOS#zu8?Vgkj= j/O᳇j?W#~!(|pca [j2+ v8feX]k\ Sވݥ ;Ejܶ{w6XB֡o~9sS^ +nk^aC]pJ˸"K Ʀtw}<=v83riT%~ g5 [ft[~?;*`Urg$B!NQBLq oϝ8^[@]6$05(azxN U1! z,+m~7tŽ4߭-Y)cipQ©6ceuX&DYv+3ٳ SB15BuT>W{j4xYPHrH-i9K(u؉1_-+WnOW>Me[WC߶?eﻏ*} 70 ~ .W}!ܱsR,JBtB!)dR'f;i|lN9x,(n\ \ U:la( ng磰q4S e@Uh?kTn6r6 jx:{rvySӧgl#QZ]ϰ$/gpY)PE: }6̭_^DM~@{l=:,ܵ[˹3i: _V:t 8JܦZKluVawZ]6t-sv>H!y쥌+1Fr*` O R,'Bq :9BkFIqc9^oWn +Q(6U1'^K'xlT`P+|IhϿٷۯljنx!A^]*SvR4*3S3Sx 9ypcc>5 V38LM^!=\J;?IӓSZ;}8~fLd̐!73~L ]dȲ&$,T9R_[ wh@ \~rE* 28.< bgnϤAXԐHRtD(|vJL[᪡8gu5*,gu56=2c ~(J5?xMN:ۇe4V ͜8/&4}3WrocU8Š;h}4mvVXUگYāSꌝVk('mEWɱBX!8`@!DWH瞓j7>p<`PyI|Ul槄-3cj fIֈb+}y斫Co0T8~] 5KYg񛟾̒= &sq’M[9@ŰTp ;XُAmСd?A9aLwoڈA&#F7F*^mg1[0,E֘\-s] -\"Ql Yo3T,S1ԭ09MUWwxk $8Ƽl.ZKE g7)DOr%^?]<9ǣoN4rl޽8'˷5`Y$EuZOEKi%csaeMcsmvs`=eVun3 SVViu:Ec#ɝGW޶]}˿-^`ê ҥcHh,{fRSh-J6CXEwȱBX!8̐@*]!׊j㯷[997rnPXeKCA&? ̉2;6;sZ4 mBgs2F*UfM$jٞ^NS^ZEU^`5m$X܁Le46`vh̵3>e6~6Z[6fXq顱Tet#w0Z; bK asޖ} t[ei&rB7w+ M?4lGfm|ZO5_*( lVڭ?/ay B6ңVB/woqϚiWɶGl[rir .Mbi1uenoaԔ%`}x5q,f+:]+V;>!pg]6\Ԫd;sZp:`}]4 1K|נgkM vX<~H㵘sɈQb~=hB,+Ee[j]~?OWKu*uH9Bu !Rqz{X@a>,RD2=#qzteZ.Ȳ—~3+P]r6" **ޫa:uS٩Ƙ0gyc2傗zϲkwR%Bg4΋Xƚ"?2`W=N%IZ_ѨdcB湄jE]087Φy,W_MpA=![9y1+_3&`eu/FsԚ!Nx)_|~3;kn& A/4aۺߞ|]_2s"\>+lhZ^v.?ѓ }\_kMRL5:FcӢL\V+N Wٙ3 D]zߖjQ 7t؎h-ۇA;LVBttGQ.\W氹`@-;lQح嘳ã4yU]sH8R,CBtB!)F}|:=zN7 74 w$2[ 1qnLUGѦ+ 07xP2K8~rx|]O/zCc^z,{ ww|⻪ f5pktW=2&N{_˳?Kxw- Qc(([KOʬLlPd[2b[ؾ,݉ IDAT@`lM 08Ȋ+yɛŧ/NiM^Qeel\s ћ%mo/gK8ϖ͵,,u4k7O1Ui|M_/9j[ApGoy%lulyðWVcv6І\')$:$+afjn.w%)tGuZc@7ض>8OyۍߣaEC=m~VGQ00Ֆsnr#E<;96%sdD>Uحe9Э}Ȕ*`Ur,k$B!N1'39Bqt !&wo.pdR{sDw[ϭ+}+~h VTX\cs)k#%-M8ꜵ~s9YJ57ș?ٟSAuu߳Wr̳*k`Zn.?TZ;`wsmr 03^a 3X=W>|Uxxd%D qQ*r +]K݃ǯfbƔVYȼ[ߛn;:]8B};7Pi)DgdWmeU7Dc*ᡥLȪ/*8=﷞ۻ}g 9Kt8\56ٜG T;-mpJ57cb]ZΊD&P[Qh_Okm\P{=[W܏ ۳߷8$j4LNʾVVCkO䜢Rp2~IjO'u%&d"Es0}d0//~BƳ"7IB"D57&_=^fΞB7.S6'[Y˭FiqxAT*l)8<hb{)t9Ԑ6=g}ok0l eμj~9lǘMG-wi[30OqespM,n覬p;J׆>30\̮@% [LÛrqy83#@} Ve>Q$.GǷ: &nt6V{<+1 9B9 BST !z\ڒзwD﬽sGieiVa毻rC($na:[F0sߑl*##EPДKQi=Ǝ"KeT0U%&:$|naZu,&,5f'59/L$o7ICF;g3̿9ޝ?fy/w/}B_kO2e:-מGjvOx)nNhɈ !^ TZm?0< o rPˆSYe94[@}ݖJ+'G1D},;S5Ft0u 5Zw88\ Rޔ΍)6 ڙl2,ڍQnv.`[5JqZ?Z h% {Uh]}Q O\:"S!:'-BSBMmIח:nc.QGhHhJ{ӪYkqkK!B'q^ hx%ܻ[@$/~ww_0~~[B][D={X^|6mOuw(dYxȁeh-w1xzcY>"krV`TXGjIE09;jx` w ~Ymjy{R?dVx_=NO^x(kjjL_ΈQctWt9r ^?nHS1'"GϿqL>j1ZVUTG|Ym~ sl[~&GUc \_5DJ:\Z'je 1Q[ZV>NAG Od :9B1B!N'Ҭ/.]r=j߾ǻ|W~nAhsVz;:M)`jGIyUnHnrዯyp['lWƟB-aK6( NO`VU7_z_?mb|u^ꪼ2(ٳ >/ҭ;O|BSS֭c:K(޼)>,2?HfZ#o`MQ.e>HۀkLTkyy(,cs3yJ( O\:'W3>?lCU--9Xkl#" F?WU8=]KYHH8?B+60]zt z2|5JJgp53XŒ2BUaUR=%V~r*Nv8Di2-։#sV?9R;jll i W `*`=r<c !B4p`8r˴6-ppB  ЀۇAP功cj4oZݓ]2}S_Sgsl5_}P5jЖ8x  yOhڛfgGo|^ 聦8n[\66M,Q9tT*; x`%<7\on ]%2'5+?PKvRFJ{47<зu00V*+ h$wpB,czs#3Ъ4x|Xx/U5>B`7kL*W;n-baGzXU 4&Ń3ǍMou$.0W?KMNҮ8& Ҵ>9|E6wE·fr"և)j􀿎U6bxV v)HWS9ѣWgV\^Qڔh |~t ӢK1v(tIa;^ !b#ܘjxcм;pgv[,U9Bq8 BS#$CE}z^_8r; r.13^iC2ؖuY *NckɺH6|֯OZ U cTEk,_%Ӣd|XAO&k6v?ɉ`DEMǥMɚzKI!NgrV-+;jx+Xjfu-̻߱ʼj6E)ʞJYbLEžM$QN|W4 OrrPȬaSS-FrjS&1\feƀ%Pm5XA6"=%E&n|.8o~:7oɡiU '`R;E ^\MNPp#z*;qySdc t797j,O!ZW3@p ?! ܱuLu 4e5ƌ.l 4HFB%Bϝ7Btm,վC_=>=~vH,..XE]B4ܐzu~?D4c#^/`3343Qg9Yף}]\}RyHgE2c i3o.0W,9hqR g'fŲj%lZ< %{X'u_8]̾˛NI78~#gRT4=IJCn7Dੵ!Xx4ʡm`ǃ(8hsN:+hdDkA,]Sw74մ1dk M)WB++ɣ#^nP^Ϊp 93ؐ8Je09t0q!qTx|xnvOH*/ _rnJ?@ M~/K K5F l Zts'mZfh EwHB%Bϝ7%u:ڷ籌+^w; '(y54{qIݡy'-)ݐLK?GwJshXV\C{882kGv=|0.O.M2(ʯAeϊ;cv6!R6ok*"LA.ch/++oÍ#qD~عa~Ɔ~B]a#NC`xY!z/~T,69).CpGM vN5%%39WbsM g_;3o&'QÂ3oeL嵏>޴0Ƅ`j7EcQf`R)BWȋ kxnk Z*6}Bݲ1,aߟ4|*X}4]3ܘ p\vkyqzR+72̽l$/\~+zYXBgӹ%.LJo_}q75&.EC} Cd.?OuSԝͲw_gzL`gxrXO6 ڻ>5?^갮f-5 f4?/xН{ޖq#T!T=!B]} v!ĉq:##S%9vࣵ,+5ig-)|6=ivF-W?4p[ ՘LʤSO.g2rcHE#Ag?5 ,]ٯbW)}سF: ^?~t"TiTBȟnQՠ|?O^aY6 ^UΌ|b- U6/=(!1%kc)Ͳuw9 C5\jyVl1r^Zq#c'{v|Deϫ,$ܘuK9B!B!D_]qwNkxLa*(7VpkRk-nU6R2=p2~ý2ޠOW΍אm`v0}y/S *-k~V,ꘅ]Q l4ZK3TpyvRg06Rin>&$/MɺFu\469/#lv,WCXd/Mcn=6%>o yX~im3sXkqsuꋻO~E87ôm33 8^ײ\G/j%~bc?O+f2oI$u}̽k{տB!{BO7ӛB9_Z˹ړqv9:4gXlr/*T&L5;p)sL3pXQ1@;kXO7ME3< ǏD3*l*+>L.a('4NcθJBϯ`lꝝl#c>xni\P IDATO^GQ>&hnm?3tp@7hY|wѤho7(6Т*8ȧ{{B!>>_[ѻ"#Nxdd)oS9ul^.oFq*n#Lib]iF6FRPWzrʖ[Y=zﶓqK*nDY:_bhP(-?36woQq\12҆J\TRGTձ J1/:pxiYGF760NwYGlYZ /(_v̬wٷ˅)Z5On#rޖãht VA1f=Zā * \X#xq۬ter'l|"/zS!L`!:Q!Gy]};J{OkOο߱sFmgyGG)M\& 2UUl/+gwM`3P®VpA^vuzD-Oj aHh,N'Q)xP!ĩa8#)PW0oB>bbWߟ@}S.Pp0BFTB.ۯ|gY?w7w%D2x0~S̢" Z}2lH6ZcզhjuF)lD@`q>FdG.m:8jeېT#t&-B~D1ޟpBtͩ6ϧtΞ ޹U"*fhdzOjT|Q9+roZ Pdg5oU?482W=~8Gy{${[`ɇg0%j?Y~ ͍-o}͍AˢF;;'uGsrm(vfccY9+cC]$ez,ϭà q`Fs'n؆ >1BX!$BtթjC;g{>tZ>(n+# uy-?;jnB5V队FVc?gbi su ~Gq,GmC1>.o*x礏Co-jsەP^B+XQȜxLǾ&p@%)*D}6+g ]iV_4Fh6J=Vp#_ b{.l ihХ }n'E-.QčjSԓY XT !NW/"B!o[v$R{omo1āI˱[uI~k_gT{>qSDS띷Xİ񻻈LQA,y O_+%WM'%`ۿH/*X],ע^{{i#ɷTaS咪Ʌ=쵫07 t3QmoGWwXTO ! B?-8S*i"229o% :("Edɪct\_RĪ|F^}/blQD&?+BMѳڤTBX`Ȗzp9UxY$i"EUD=cK[hi&ۇEs#GZc}9=jqbqBBϜHKU!ȴ~Z6ϧ\w},;Z.:U3vpl]0T_* ۉݥ^0 \h(j\hX]Ī%=ާΛ(1m !E!/w-L4XHix86 $bJngC|&gKDٮp?/&zK@/ʔy{흃m[k=m 'ծ=%Uq `!B7߅-X}OOOmۂ4W&pϺF͍~ #^pz Q"y]lw(|5I]gpORI ޟd3#&*͞eZ4U-!D4u"`*9y+Ԣ|n/k-n<mmT^!Qw\ӕvB!ߤBﶨ x!Ngݳywl -s[Z]Z]Dre3Cv̕WSnz7W c(WIlG]7B*>_رS;Q8*=8~@9{9{y-mgM-1#BT@osЁxK-[?YQoOZ66ZhS.}T !H~\qkT oOv'[BCMh0u |>W?->]yp^5gqGDXv+Ak2XP$!gRZ۷ /3c8sAL֭[?ޚTBSB!iLS+D_=K+ZwoPZlrQeYΚpm|^,_og>LYbadmO!N4[iI1<bv0}13`hWl4KړW~8p+opW{+N}Q!* B!c }%An? |;zF_6_ c% j ZD=_OƘ`dX66!8zϟh v֚طgso0y^;/ܛG'^q XkfsvwzOeE!M`!8 ?ת#<~gտ]m\삨"ZM%*-~Β,,YGY9@f]Ϲ ]ZN!+ogڭ}36Obcx̨P*fM 4p|/  !Dw地݆aaԥg*z>n*eL&SRF3i!,:n d[ I65OMd84rV[ڏ!3woMbHL"IX!B _H|`zm 66籟mv?sMe(0h )-dxc,mocRt4<5|aDU!}ą|\>ԫδeWy'fXKKy} L Lf 5=F`֪8#]Eԥ5H埣=oDX!W^!Bt/@'B&^Kh=/s4 DA#noOX=~@Xjڶff0jvY\sN||5+ L[bWFoԸQ~ arm3uVx Gg>2s 19m.c+D7L2B %B!bKdz-}2{{{3Rl^_(oV讓|j:7}U=B ?~lΈGm= $,B #A"9S4G ;EgE{ (qRIr~/}ENWS!Bu'' mĆ<|Դ?X4<זmט9+B!bZ3aWB!]M15!DߘLqqLyq"v /rT8ֳyUs]eUGCǠr&5NHW <ƥ([ᢋ9 /.˩iǰ Ykyk(:W;zb|B ~9}mI0TwÎm8ISrRxT~f5&RvXHgA)huFS#_x<{ԓtE7{x:p=bhȱB$*dJ!s2/^=/vOf{z{; gv _^}SMPqm*,z秷S^"o_}|/ط6p& i'⦺Iq/ƨs6>/j-xz4O5>hQcvio4#n/eYdN'*9BD$%Ba":酈RY$x8{#߮J:Tw$ \r]-?<=*0= ak8oW'dqۛZ(zB_yޅI$9s%Z!fɡڗfRܜñ1#ܑ<~LmçgAd5j;szs[֮BB!D̓BħxDRϢh*QŁ+8ͳwԩq9*ꌡڲO x=NgR-cq=.Gd^gSu`MTܿ7r-t6&Id6z^9%q"Vh4CB!xQ/D,M}E_[ v޺uXt(]~f,zWm9=ZNMTaO3٢p}gca^a #`;lm+J I5=jNHgG:7coL|)+↜BD#%BB$x(,E\s]Jj*i?q4…c]\SU,c7]yItYYĖGWяY,1`%0oqMٓ1L;6O);N\ٜ~^B GMuAl6V{yf<0ߢ` lrH򻭾sv;#-!bB!D FiD"L1_FYJ=J{Io)5ԓw5L2s # cU)ԣWD_:iLU(] 8V] }c>TS7o2F+cu'p|TZt-W mY|Դ/= <_j{.} I*XZov݄"ޤ~=-E6?=φQbf|Eo.dz~eem-.*NS0R1su2ɹ :ћ*wfT#F^9znyAf5|څ9%A\-:SZ.VܼSUU6zX^C\}Arh9.B;c#+W)y'_=Z{_r@mfNu&WE }>E0c ōվL^L~t-w}w{obRWA>.5|uz p^1 9e"ςI"IX!1}Ԗ_1\b 'o*YƒG}_W;;䤱u:Z8Oic-~j |xˆC$nEu+mxIQ+l6[X\W\K黛`E_%IcOi5c[@_ƹ 2yڏ<.t~A50;TM8өdzUg˾_! ;7TI̽aq&lZNvƥ'~C/1 8R'H O,*,m'Xd `!"HW/񺭑t3Plg{cl^{ٶJ_ R1uL5Qh<$V==$*kU|-,ʘ2 3lmԧ8 Ǒ7}?6NM%zGsG[ [B!:zқGygg11/׿?z.ՌU(_9']̝-=r筕 qߎcv`ص2B$X!!RY[ld&2p^ TٿŸmc͉Y(\O3<kWܴI@f/ Mݓ Ѹ7c#' IíSZOHqA[e*8B~t?50z/UW>Oi1SWwF'a?[txyeA`Wܷ _3~mF' !05O?XCMzsH>۵I5Q՚ (G8c)ޖeuq$CXcc!DBCsK=';_~譁֞3#e]-V krqz4,05RPxʋԗC*h[WXrz4m-(J2`֤P=+ r%lԂImԗU`fVT#U2xqd')Up&Q]_َ׶d!|Wn<NE?>3RPـۧcj̎8pP>>AAʱ#svM|rFB!D kgp'^-1xm{;Jk7=TppzS޶&EjR4p>g7_Ov8eKn;zu x.D{/$jk5 Kpi x^FGXM+`ҷȱ,oW:IfNg s ,u|I9vJB{}ZE+ҩj _!@[1f2m29wѵ|n/M#T]>m=['Nf@E36 *U0 ]&o^mH"(&cWB!}_H|8}qDDzc0l t*aRZx1%{[#Z)?a<kS`Ƿrz5|wY|&s\?plasv 7|ZZ6oOh̑Tx໗s?BIƴY:n,LyjZ5gr9,*mTm7ogcT*P]ȄKC4pOov[n/zkqB !1Bb8K8ߎ7  Qm TѺYe7Q(&Fi4V~ki5GJޝ򇗇꽔793}/6ظWQ;wxo_ՍpYf?”Lc !迳rqY3o;p{\Hr;2TSQBfx;cNI&<6 &X/B#nm_ |z :cRbTvDzP]BxihCWPVP~y_ {NfC}y^]H5eQl]s\ [댳I^s.Z+[y`M'nx&~BrbR0i$^ܹKF8sYRܦr5~*4FnE7xKARZ#9Bx!`!"F7x$DhQEZ.î/727=m`ƽht\?U儼 x~/C!D|vod6^\r6zG(<<1ijq[z& 0د_&-&`1-!D !BĖ_TV@ nwe%KydzVv,8O)QֵD=?cA,ہ\`I͙'.k|69Ч$sQ[b)E7a2kΒ.ڧ˨[vڗnU0jXvgs-Lf]k&w5zXt߷}SʹW2ߒ f7{xԧE}L>!D"@!DP !oԱб.Dg<5,[ȿu|}1݂A>Nc bW"_:x9yG4DhpӒ⪹0kU܁cS^i3FݟXw.R[֛(4S='_|B7rnìUa֪_^ݣᄒ4 [[>iilշQu·7L_<B)-BĀΥDElJ5lNM}.GZ]j(+X3F,]Yc)S&J,i׎9zT򧱵5h ǵT^ަg}QXBEчrx'K>A }[hȼ>h%"z^}}'=w>^1fuL5hQE*R4EcGI}&pihgI&8vju,ᾎQ_ڑL۩C]:8 !bB `ClcW !UXV ]2L/ uDž/R x ǼK<\m{+Mlm[jZ<5ij@Ǿu*)hhI4>7?9ߎEےO m+SB`8,࠮*t/ @B: !C//p B~G<;FS^z[)x=N2sN=Q'3v7~S ǶԶ$a'&'M>B.Ts|R φe.=Q{5!'l_AMN#R=uwٻd9QmW82ߔߛW+rͳ.R4ܓvg4ۦI"izB!Dlm?Cֽ|``` ֓[bx_ug0fGnsTaAkE<X`'|bcLIÝr,fͥ|Ӥ\]!O៍Fg0gΏYjoC5}zSᢻ ݽ:ZhBx&B!?-⋜KGD(״ɔ߮3.  $T(“{ sC`_YR2E43Oh1XoZ^4QgO>8ӌ05} z6;x*ܿI3]>-B.?lp=+{4L`ڈL5nRO6c/i& H# ձ-U2Ѳ=|ȱB"X!Bұ/ozv@`ϙ7)gߑM`蠅u|d 3# ;n` F7xϵLbu+Ûx{TqMP0bEwzʇlj瀯BM`r,ciYTVڍu?o_.G%_~r.GB<>pwl!b IX!"Ih*9wqlMEsxڑ휒JĂX<;ïߎxpUcȝ{]nR@*11y*+t~pބv!eϟwDŽ~FO͙x`_9do4 fx.G%idO ];%`*BD,BĉXg8(g0fsL7BY2j*h)y2#狈'yF;3`̦RZǃuq,faJ)/F* _:Y :gSB2K//n%uZ6j v6p4 |@{tCvH4rN !bd !B9g{^+gfyE@OwZ.)YGd]x0i,<ǼFpʡ*P۬6 dc'C(~<&4??+] @NI6iB1>=\࣌f//~7ZĿ=C1CytT :ɢ+UzI΋o_Rӵ:#^ ]KqrIK9hu?wlާNנ5P_xx]uUٵw^5º7 M0ͤ"M5$6;mr.]MXg^V.5daBĢW-$tVIuiFGS)=R۵?LmQ>'z=N컗1֠,/85l;u֎Fq{$A"HB1DzӉ-X]qg%8mEwdZ.mCQayXb%Vr~O%+DeBĐ_kǨ&r GpFX=O ߮*1ۙf]6 IDATjX62Ao/PB !BİXxIJ 1* le>,լsTrd_pc'Fg娤d) . ߮Jj MyuvM,tO v7O' t Bc>'_fb;.BQa?rP}^Qաsс}@poٕV?ȯ'ǹd0B!jW@!Bg2wL`'^ǬB1ϭ~=w}< ̭{Șvp/:,Rg"#1nf~|lSjeyO>qw?^!D[q/O=}9F&)>y,L wNT1Ϣx`[%hGrA~JRS$)b-#"IBAs E7V۝U~`%rvFOa@oe97X=`viiCk/ٿ;{;O^aVnRBs[Ov~ހud}ݵ=UH劯PpI=UN0u90ѻ;'XiS1b>͞Kfy$bS!B!/95hK@,u|ڣ o41* +S1T9,ı2TV,:5,þ{~ү}Ϥ'bB!D `ab?p wkb컗oQ7qZ~7!'l߽ G:G_ܟ0]le>K+ҋ:XHz?t^}'zMEZ2Żu"y%tCc+v|@ (O!>VުQN揚ܳjϪz/[F)w+<BĔrzXח;Σ'w6Nz K4Ul6nѻ"j*lɣL6QYpFXkڨmT= 0=$D6"V:z%BF7E}"L&9d;nOW8MdT)ٴj+TsZzU*d{Z]6tc<SoY2 e%8)e](v%# RzhusonӾ,s;x}y_Ui?PbAɦ%W̽=uKQQlc`E*>sxi2{2_:.Zׯ #L~V原wEu!}+ R},q9*z` pYѧFJsG)|orRC"TmLeݓa-fmNT5.vyRPp H<G?;cnc-B!W0+FdF4a1]tR*&^֠`*$3w.@Sszzd3=v$7]P2Ab'G=?Vgz lIrޡ-}Gg_꾍L_INֱ\2K3pP۬MNF_e5'qU_ʲ(+fomwlXS[{KB1P%31Io3O`em{@!p ~( =ƥ9xN(XtpUvq/F)irՍ?/wkvbˇh=$)UBQ28$_˫ܹ?PogLX 'zN!Z d `!bI`71ȸdʋP\=VZ١N6ͻ?bzXW͢|f]yw0uqXڷY75baaܷ'1kUv>Ёnѵ[=o9RqjME#IqhyB1v1x=9gfsΔv6 wNT6p1RpiQ3ͤ0otr6DZ)̉y/X3Wtyt%m-I:T`̎=;! B!ĠK2}_,v gw R;3OS1se L7MUcֵVIMM0涩_;JCU*'ٿl`˅uLOOaFj%;=Y2,z^E!Exzb. v1u''䧿eBxĘlUpAi56OFc 3 ,mݏwzh=$ ٤ji̸"S6QcN iRr8n[H{ԄMEaQ$١/!v~Dێ'Z1$,B t~bklߡYAu>D =&im;~.qR֬;nnTdG(,wܥz`cK9gWEYWoQ蚱 e[S6P2GU9Eհ@d F KWp'y f&ҕF.0Fsv 76-_j2(Jo8`+d` Ӧr gNlG`!q[SHa5,{1d$ƛkPK>7[x !ʚ5f>[|6|m,?61T"۱UEuk>އ\b/u6p6M: NX !BA&6ԁ.)i1USQ`2GdK~{: QxG`eѼN;k*ֆun};*0T^Y%uNƦޚ*2%>Y΢3xw9u<#v ޶vjRPz'CUL9Iҥ1sdͩGrQ]K.Sf6ϘU;Sym,v4:`q .$J[յ$Ǟz!#oaO$J3yP=jIcUiTݸY#&3fr&qn掜+`S LmDT:})[toR`e@Xgc/&HX9BB!}>b9;"#XKMEQh<ɞ*c;s08*ۍղzp=L$7@? 2]Jj*p90TM6!iTsV8W{'31p8yG_u zORM*}UT1>2?Xt0ͤա|^'z8m}9/MhE hyOhb̽'~^p |Z=%l6VZ˖%a'&sUy3B!USznt~ Iؼ>X.֬/vw\[G$$3 q۩&N٣mI46Mnonms;hfOgډ86`cA#hc/9yHy> ~vYW̼MDe]sA8,> \$XAN {jq*D D q™UrGm\8+B  D\ )--chM1$".SQ~?ޣ'˴ˈ=z86}W_^cٶ,£s:ct_>QRH$H5{Xe}+s¼qYf?\z%W6Y|]l8pc\F-MQ+Ǚv@ ~yvk[a.H04ϛ{sAaS-'hN3K|+wN%`"Qjd}8b-`ӡZl9:^Znp֧%d@aa74׳$CkdEf)k>%+Y_[]|GO_驥l?k9 g^myׂ }\`f`U:~4]l3)44w?G*i m72:S?'nW ov)u `)8c-B  @ƻH~<9ELt07f$,>ׁ3A{k}6MQ;ŸBcQ )M" ZڞL)\y%?\_Xvl=v#%ΆvmJHk;z2c)z"`)T@/v+szkWc%ض .Ń?W.%q#]4{[N^\zmnf?X">| m;# Q w/|욛xӤ#=x)/ъ$gr44BMD&GJdNq~SpOIn2RS;*xTDzYqSP{C?+;X˯~{si\- |.v _يJ~G{Ϣaok8sAd6>q?_A8G玹_YK{GIjhKPbQz9 yN|r># %f/-=@e|ltFBU#Up& [dw@Aa:hS)7tN8zAYd5Ilprs*OPU.'U߽b-uD֗cet{ngAٍC1HN\@92K1B7>$Hs}<:ұL2^'\W˳#we/_Z/bݚ?cxiw3xi+G"ށwrz|f+Kw>B}IEArS }5S}c,] szxMy{b]!jA^.I+BK.+\ N!|Y<AEɴOv'Aa&0$9\:j_ZAZ愹bf݀:('"L\u+Y 'Rj7ׁY*Ί] ysV%y0ಡ\OXg>F;jp2F,/]d#BVe|c&xе#IiuO,꽓 0YXϖK| TObW,_{^̢6s蛟bNKhE4Pk,8G*w9<3oY F'BEz<-D#x Zdw@AGff)Jffi+O#E[#< z?noPfQFpyÜa`.GX"-Jh>Qc'ѧCQ/oO׺}ۜ<y=Q'DI|ﮘ33Yn2Q .*y`wfre)f||喽IwQīm/Mz;AA3m`}N;%ytk|ܢ[n#:캕lGLhۏHy)vqfQ Q-A\ė[_G~m|?Ek򩊘8XBuB}dEۯ% 0yyh$6m腬^M] vϷ7PgRŁXLG &ցa䚨G=z `3 9ނ hD  Bԑ©͙ N# ߑdU8Û1VQq՚Xew\ƈw498iXNj > IDATآN.+6<]r<{T!;q.ճ#N0:xRx}N=x7L_k |w}R[ &s2lǨX,,*7uM5?1Y, L+hx9Ă| /߼5^gUZr6qmJt<\%۶l`s H$*ML39ւ hD  b,a)&Ӈ3Aߘ1x(`י$:t.+̢[3 GLLGMgha9L8)AOZc n8oeĈcE'' J)HR'$p OD$SUOMfF"YV:|h\*O?/^Š4^Zwvof h0]Fˇ&? ©¿d5Ը];Usx kҺY |W_2.0P{{g.HD8Hbg3  ht'  A$Ù"~ j{ÖL {=v7kt m; [[0o׸M9Z:<'Ϻ2ej m;Z&D&b 'l*nT71 mZȉȜØHxx5Vۣ1Us?}V?g}u?'&l&ȷd>\^}/,m 5xgJ/ ')y y:op~4Tu!ô{Xeէ9'RZAho`{pr' 3 pyyܝ>^F#:Huߏ p2痏~ [8[) ><;c0tE {3=|P&Z Q+5pvsg){L$  ǏA%YxjZvB{}|bo^X X ɶ-!ojgdXƈ ;0ID"XAN"Gə*az=}&pGho%vDX FaOY^k 4OHEٻPcynlQ'!' .'(T0Fi HD;}}x^gpK+~x48 >.+uk> =rddPg)t5lm[:|O<ֱo^&h:GMj)kT>VKnZ'GAAn(Y Խ{7|,/@\}q:B"R0pΒ8_Xd3OoXo4m[ŪyXEYD!XAN"GG˙,ac<VS6nkHysV DgvwW"ؤR 8Vv?thrsGYܒ;LzZ((:7NNG'4;pj7T%" u>>\߯awn'Zo U dD~H/*9!{>`hk$ fXmvrg(7 pxi7Bk|6&8#IiGAXdUGڸ(F4cG˧lc>Ҷ:G|">FVe.[͠Ⱦwbz>.i ј d:) Z5bk1O6Er"2vO;w5:rK.;Zx)wxf![`AAfIgD =}9ӣ~;9 xhirR/1]qD2q5 FS[ncZ(aIG)[WH`^ ƠnAzj?mF(6XcɦB5ahW'uuzLѢA˓S' w~OqKd { DTk7BM(TvkǍAr!檏ZUOρ!Kl&:✓pɆFysV*O7 иJ4GEM[1LA&ơw7qAa.<^>&[~~|-{=z k+zx‘v:6v.72y1El$۶dR&'ut :Ӑ-‰@  L3y73E}7'd,Li K+ ipIJ1e/ ~~W\33 0kV`@E;<Ԅĵ q yn~u"3wGP;#^:~ D5z;Dï;ІUsק 4MÃagZBËIϮ\uTAu)ѿ <0_.YD XA*f&N ` %7!Z~cG/کp(cD5k.^hѾ&R lpS veVuiTy؍nmF(j(5+g*,Th -d 0xÒ"#xݮ^'nA4Ǖ6yyP1 Dڍ4S(>s/nqP$tn*Ŭ~XdfCBwGG8ч)QЉ ;t^'%fEZ?_ :Ffp+]TZeȋղ4-J34Hjԥ uמÖYsrkG{{f?`u0x$ѢAGpGyBC)X 1vv>+uu|ݔGGo`1Qs4lt>F~ .˚\7v5d"-n`w*lwݠ37%=c>X~~. n]s#_%\m3aEQP?i- [2^%UgAAszf͟q:|9cIy)W"ȡfLR"i@Iw&ZVRg{k6BFw߭0YQ9h;EZbV" MQZUz#z(~̚jgYN pqnǚc/v"O&B0y!Ty41ou$`O |wDۉj2Y|rϡ*ueE!fRirG T:ǛTսC_G6{\Ap%9\OI#6B{\oof߯yc[tCY?.ӳCjd :z(cɭɊ ABgrAnD 43DD ݜL@}>zwt ,?;QcV^c]:*'3Zoyb^ݮ |! oTsnf 7qCac#YYX2m,Tm WA8a,ҥYR94F 54 ]qJzE50쮣1dEduP9u#ٶ%"ޑx"GFB Ӎ`AAFƊ;3*#jXMyil=׽m{3f|A=K~~fB ꋐκ)  Lh:2.m Я!8! "qC)Uj>/Td//DoA 0̤gf"E3Zcf"Ѽe+}N|jSB/>oજ4zܔFE϶(jg97g:Xt}g>`]%M5}S\mFHKge0(ّHѳ &U:47! mG'?28\QĨYn)6x =c?XY{i =;Mdtl 9USp"&~D[OUԯږskǐ΁eèD|xKo`p mMln~^xN!h)7Y=%A?eE[Co SoSn53R:OD>6.B Ӎdw@Ag35w:9YߍѢ1ZmnTu+V|GbTz_2ӊ,ya6tZ3# &W_Qmb (TIy؍Xs p]Fzc;Ѱ?WۀkU዆4ܔgH:Lr֊QƗٓc1nK/LH1fB^ R4H)HL]gbs9Ɛ8[{\xޝ|ލ#HjL[Y>Zz,3GP"j1 DyemKgk(T!QCoyH]& ©D 4rg"U|OxˇFg:XhQPjV(5Óuh4a[ 6&̻Y_>P{Z(% ;}h 46)J,j49heU)GЇU36^ZBΤ}؍5b!mQI(Ϛl.v͞eG߹f1rnz٤r~.ѱсZ8br"Ru¥v|To;mqvk(xu.>`;p6X;^Zu-"81lwM ";1j,W\=f議Cǖ/O;p``\}eG:hlp=e5F߹{J" ~s9G[B.4fUH *G}7'8#A4x 0AiL{ We?^(lhuvp}J?]~r?ry̺hغuAfBc_+-֜FXor~l f Xg-V"jݤ>(Zz8gRPƭ9 \΁q&X9ysrg WH%-`7ƒ %O7?u^"76N)坬 ǣ<܏Ӂ%ﺉ_<69̝Ah`ꧭs(Ͽ/(cWCb?X? =Á`o[ij;`3h+]o(.C~_.ތ̛{kJ.9hTXE"gRXD  L## YZHEo*SݜT`]OTe` !ƀ*}t up;4F5͊b#'ǒ! Xq5֬ۊy$_C[?wy%l՚>mG{QH:G%a!6#XޓEf\A {v*|< N7L|55F:[O$HÁ49״ }7 ~ uQFCu2~unPo:) tjil)}OU<Rw{r9ȪuKyx6v-/eń=t/ghxך6.yx% 伕4N**8Kv'gRQe_?EC Ӆ`AA&F@{f!7|OU[S%G[g^ LN 9P'WQxՏ+#O4]90pW>wobt-(j@%??U{Q8(5+ΌtK'`JD4oZɽ󸡣 jX2!:87p7z5:#5)㼢OGM >A֦am[F9i|ZVYIv~+l V U8sN1 D?:%&%;u[9kD3snN=*М,C'ZVO;Jmm}~)gQ9f<9UAcy#5GKX(=As9|!Bpf![B  LgJ_I|!w8SR<4"8Qw9'ChDY:߀bFk3)#pS^WʥWKE:Ll{uoy,yˋޏ|oU*'_$נ1/я%s>؃Y_29'eGO.kfy{p>n":ZAs݆CN<P?^}0yN/%?{wΖ}ߠgөmsG\AZ|!)  Lmb^Į*q(ͽ|WP_ieC})8/+x!8߂ L"Aa8=;:SݜT mۡR!5bxh*R*IG#fWem.aN}F7J#|~s~c PW=Bo9UYH ~Q6 mEI#G MN|%GpÃ)z<`U>vMr=[_;vLcA (7x_7l-=S-%+NV:xtj Ri'39 L"Aa83skNuaCGvuFI}g kp ȸ\l{Q>V[B촬#лΌ#buF1{(i㼨=(C??^biUiciF?iwrWq Ia/3R酥Q KrլSGƻg'$Ikp>CY'נJ_{ҫ`Iʼn !l7)taodYauEHFg3ܼ3%PFZ7)6fh= FO4}<}`^qSo)3tZ`Y gL~ g[@_( SMٹw}oo-mggqhfJm62bG5)Ǻk"ya:М pꐙY, D3S7CSNlFO3ΓA,:fŌ<&=3foo,'|z>la;PѹXrojjZ䘶SC)38ҫ ,|kֆyՏre9RЭRkL5F*~j_,ᢋjq\?ɝU?D?ݨfR芆y|lNxJVx7krbn,:>_͠2lmQoқ3# _.NK:Åi{kGŊgWP֊G'1%n0'/s~{ܷ)YgjWpz p<cmیt/N^GJeQ ;+#O_ W_{߄Xd^;5߲ҿzslJ\TytTiJm+Y&DYqh#Y -*?z!ogKq|W_|`Dm) >XoEi~1UN9Z4%\a䮼nl-GݤB|:,N3P/ WKcMaZz/g]YD YԭA8j;c$ZIYs\jĴ0p ESBu͎߭eS|%ysVlkNz>}g:3c3)Nf5u?ºY 0=7AA2hYSCuo!&?Ia7<=| ,KNFxZyS39 L5ZAͩY9/ƱM&/ f#vL*DrVMҺȮ lq5M`zW+The` WyhbR&GD5Ծ5<jу>z[-ٛP}/_v?%Zz3ȇ &W8F >O7ia.ȡ7]'C|Cf7j0\(jnVDXr?GoфYSw\"B{4Fh+}1Wsx$XwZK99rn,Mi}|F=:=M?ɩ 'z:ƈRCtڥf%tYCEzW"O|?GOXAa*x'knFn9?F]L I{:I <c.T#XAө3x|U{ =y_5л5Y.Vbu{uz5|FXCg$},]rqҟ WO $x`4NSoj^/Oڷ5fmpg vg-oO?EFDc/X3X#u^z;<5,@Q#CGGٌ`1{[9,zjr}zXց NHT|s=Zy,V>Ϣ*:(`tGAZcup6=ce|'E7.s&nٶ51cV'&GZ6:QmE rAjD 4p`g&"'~/{=xv2,U ʲn'Ű4\[awlXKE{뽸1Ҹ+֙(XIݞsyL} h6 ;,|Z57cR%R`T_ 9ZІZ-s},](qxۅ͠ёq>x|.]Yc4hdt >p9{k&/ L R_Ϯdd*XѮQq4v(*,psӨ'#BgiwoRȘx~fŨjUhc'w*2GNgl7̒:z%[i !}x%$ޞG8n }h9ێ1XYR+7?|F-5-hl/\7B>ZڣH<_#,>ٸo8 .4 ks`p͢4r 0|վS͌ c;P snlBaO&oBeo7ڋLwwqKj+ō>Z9ɠ C-s6JpgX=c)q%RTA7|?8l,amf^zIVTdny|%++W!DcTâXT^:l؆: 8mZ/pI xb-4ձBq"oak pu5ͶvCb;x8 Ek`u)p&7L湍q*|_=_%Bz΍ e"I,k+@QbT?fQAQu,?/'om+cF:rx&9}Z"%v+wv1:;zB@ey-,>[w}iU2[o;?9Jm,-Y׎L%Me__n=i&|I'/"z5ßGKSG>F_=ktO2aTZmʝWGJOҮ崆yxX<״ݿ,"m~zur/BeFc2  ~m ]#Ue}r|BߘBE*B>жj?Uhӝ=NOV@~:K^KEG{ |Qa(77WQ2LyJYϞэrz4֎̚>+]Ы**=U5ΝJ}k7ѫ[eHCO_kvMaf2urgijmel=ѳ܌Q}_w]Cȯ}p6ճkG-U: î":o9+s|͍j7x)&*Nlf.뵼MIQaS T .~<>8ڸ flKpQ !Z.8-Ī\?TZs3>J>5k" 8Uwgq!f髈>3M^uy|{$FJB1>*ҳsP!8&'Ev+la/bסhCBﶷ:K.{cOea{[jH#9BH `!"$5#̖[P8$]I L u4n3s/ XcM|YLIEs󪑞֥?kN@Q1L+-?^Alt=%F~7Ie¯2˸z|ųm/ٙO]t:m%Go#>HpxJb'U:a Qg4r( /bTVF9qvC-!CZaB)ˎq֐Rj^UѨM%ΐak8CZ~֒m_Ue$iaԼAkeq67b'v *-lԨ4~ĭd+YgN+1o+՘B6.^!J IDATd~&.ȶ7-7 %fgHmu]n;l,<BDB!"L_qH3=m|,Σ7ٺ|\^8+Ϩ8S!!wRd XWVDĄX+bC)z4$.^WSR5]{8|f +vUCkcFl$fpQ{ ыϠqg^/AᾒZ[JvdsLԻeq<$|f/n+#cԔ4ȳanh>k[Vk3FI`CC*U^MJXCm;jQkɶ{y%F{{?ߟ{SP瞋eqkp@^ _l gq)}WcB!TnP>Ipڐ:&@wv]}2>ibw.ǜroVZ@w>tF9BX!6=sX=fOް玧Qƶ}P:{F\9\ņ̃ i #I,Wr̅"Ba%w`wzr>sIapşVjWsQhUYy,c_^'./x f5leCVr;u{GܟF+OIvŃ)~8Od+!gma՗yT*iG)qL2b_ef5'_hv!'§[3ai?hfy$(޴6GؿQ˵?nk|s؈Xm%Sv%ƉWchi  suq<8L riWژz8_:pKiw{B!DwijYr+z^g3.-|X]+/eR7{tcNj=;t]mP(}vWc/,`%vw'9BHX!K;0I;=9/° ,$Zk~fZuZf|R.ofq,c[(_l\n&ϐqz>=Yadqu6W|$10-6aGS%#jOeٺeFWae*/Q7nS{|'TO-(ٝb9Wbge^CRM,Iѱ S^g3mj\>UWu7 Uvt~>zZ88 bGPgeS~61h אE~B~aop RO@3$<f޵c$ q"k'tD4\C_&yrJ4z ,HV1RǴ9wT'9BHX!XGL^O>q,[ݭmoւmT4*5Xܐm N_fq &-t 릏g]f,M: E\6V|v9Q泹7_J ~yBms^?ļspW0Dc1ht9}VM~57"~2 JZ󺹚:m˜v'Eq-PY^O%Ub!pHG&;u&56=V^3NJX?N{F8Y3a 4751HKOI pos!D(FCzXB!HأJ;0I{[o$?)mo9l孾OZפ$I S|<\7Gl)?.+p-<9rqW"'7>Ħx&T ~`߽eg^6=z*Yu4F>b^B4s:Q4ٟ^[I֯ ㍲ALЛ{ݔl_'B!)3Ӹ3ܼN;LܥuLYU ḱ L _59jvyQd[\=ˮ(Fɋ[]~ݑ,VkiDD99BHP!"2$$-Hoވ3t74,JʰU6G0_Gl,N}*&o] LOy<5Ⲫ.w4W Y^  QYOcx|ȶp*|h0*$x|X<~FĚY]kMqmr(Bt+o=b P`cb_r=OҶ &,U1<)P'bri&eج>!BtB!*{|uWcW 4i!Lr/ݿO攙i^ٽDmGI ?q)2'C].ap.elOTfʚ,Lxs G we‹ Q6u,?k2ݾBq1>إkXXέsΣ82JB2|UfYLR"evyHBqH,BD+"E_ϧ#Uv~pQKCaBNAQKK_$J3_(f7~ۖ?>u>%+Tiڟ3N;x,?&]0 ;-R.E9Q*pUV=W o'h_TI #xut2mx88Ziܰ'"cB!2uޖs\d6a c TlLLeax~_ B!- B>r4VޑSwp7LU-.0)a_#\^࢔B46Ѭ暻FQW%y> Y_& \8e>*B@Rh%)IF2 N+㫓pgֲ:M(&':^I!8gc{;gÏdIa>_WyШMm'ң9B!$B![!'o s7Һga pRl)c `n frOTG,xWKx 9ޝ:w3k" eNE>miX<~yی#g#èz} {=:CtNa[8ﭵ̞2NB=Kcb2>7ĉ=!xkb`_i eVVnGQUj;u8\.G[8|J}4[-%+'C:N6; U,w$g&|VnBMÈv­L05x+صqwd5_T}EFì )r34Z\ 7B'{C`8t_{ oR857)&.>oavrkVRe6__P!V'`y3*b z Ou2yOHH vhYޑ0#\[Z!8J?O*C5n}xhν̔|Ĥ9#q˿^棯4S{|{o} Ƴ$>t#M*~f7rc9gf d8M lC;δݎ)5C˘eSE\ ݄:JsTd/Z-'WFdB!ui9pʈ4%Ob<6}_,p*=yIī1d_!"X!a<#|djUe;~ym;s&L "2!hO_xba/_O~*NCSUnİ[p$‹5~jnvYX`RXk0x_H6 8;j ழwt h4MG74zB!@їRDdI91 zY3Ԗ;8fQU-X`ҳ'b>&-܁F_85'ŧ\6bv_WWu(Ǻ8~0'`ѱ/'w$w^,BO|^OS^c}Zj\V\paʭ*FU,oIBR044d98C̓;hqKwhUG+=9D$\R,BcǺbQDs<]}ΪoCo Zs&?ᬘ&jj Te|{Ց[9(` \KXexGo 8LT2sՒ3;<{>7l%YSU 30.}}xw$[ 66aᛵ_j gai `v |$@tu%p >?gϽw;-Bo`qzTjq[ⰕgN!7 ;N36~QT !džT !T$"o7ToGyeyl 00(.59R#VH:l֣Xpy5*PLo'ɤjǛ4d*Ҝ bq 9Kֳ'3.=b`5b͌>3ء=әtJ#+xLqxU(z-*=n{ui+qsQ!$z5˙d+0f}>B!ѷO8{;xu5TgH#!i" I[:M%Zr(WU@,b r܅=&B!'-%X$=۫ -훃:6:8RCC8CZe'UiG)8}|cpRҤNGV5_zꈮ~?%:Riy ~gT d4fP]b)nɻyX;.Wi &NAnk3Oǒ_2 I+?U_Sy5ELop!K}F);EA!Xl xCan( ~}FC߇,=ퟃەX r܅=:B!:_Z IDAT$c;Tgm;[)*2݃;8qQ@,ͲTe/T9iB:Ʀ: cPie#OY9{l6,b2*VS׾}cmLk IR8ymT)}K79y5]aIkdT8b0v[wUR;MQqK}/s>1쳖?y^Bql'S[zsS qܺ)چ !B!"$RG!odl|O- 8l(LWnt+[,ΡJHqZ;Fz(:վ L ˫IX[? `a>X9y\~?V/HxM;m |r|>ݻ>ϛXr$_Úrl~3iU|ʈz=eb]s6塶Н ~C./5o_ |q65iY.b`X0>[b/běTDilh&e,P^Mmt^ەR=R zc.) BTI;r,{U=Gˑ~;n_rӨMo*$E)mvy]#3 Zt uv"g0-`USXPc f-\P Fƪ1nψv.o04 n3 >*Z6ng+1ߐsfј+-cJzg0a,k0Ԣ<b҆ :ѠdGe~\ 6rf&VXz~oc]#S){7uao{©c5o%s!DOI h!߁C{-;Z6#'-҈3C`F|3<;>?൵QH{76 ]c}'|r߃ MZoKY˅|JljTԖ'[{C!ퟻLOI h1PtF9BX!_EH3= ~ooC/zTr .;.pa3+wPH~Q5oK O5DO__:y 5GӔ˗%P[[ DDG+f{ юͻq#7f 5C|8SU`+h%n/n/C-G!è)9|z1xYBު>[!U|cRbgb-o6U{$>$<1qBB!D&w`zڶW ]Cޠk= ~C:Zapsq nȶdd5\> R12.bk ^2QzjW:ry Y^ iZ#=8>tSG+D{ʸ32ϳ/}ț[R[C乇r hX 8t^{{ qTxMFGٹc B s.1W2^tuQ vj[˴w nuo?uK5I'$B!"7pZ='oZ7<58 7oHG뷭 PKVoA`uI ƮRmb*$dAֵ(l,W<|5_?1V[)vϞż4-Q|^Y6V|}_\6[4Fx}k>1n ΄WS3̠ h-nL*,BsLJE*ʭ6,2ryQku2lVp n` aH'$B!"T$Pۛmg:K.>oLe7Wz^ê5|v>(MBΦ&>vxy>*~+gzW-e¯w~ OnW]\[# >{1CўcFk8)vA;}y}$ݡáЉrcGN*tc[ߞ3!b;qh ԰a+ҳ. =n;[~3Ma-%/$ <1BB!D4㛄mwʉ%L$op Xzx8ttsG˶[q9(auesk/87*KC Ch>{~[!7̠>z0[j'^cpmڣ} 3iCf *7sa_(Bw\Xݤ4OW'䖀lg-[s~fVS@гxgVN^|X poHxc. ձBq㛄3"hԦRU\ Nn՛u#-ΐeM`dQsf-)Ykt,Iё5rUUNΦ z Btcm;OFe!xu$]p>Pۙx|lzXx.!8eDZ-,_y<4I#xm4A!hV?M"у0sgUu;` e.Xe_!B!Dt{|տm7UDk ӫPUI{0yuv:,-BÅu4ZC8w5 o{yu =^͏}g磝;MGR ] Yǥ*i  )/qk={ЫP\C˷mzs[VER 8Ny !L8UwW%C9 Gm3pf(>̦)a\N!h%>^?g඀`OLr̅%-BHO[{<"98CZ0tTe3*0AV}7o=6=Ie}:)k3 gPl3٭J^y"Rf=`cuT|.PAǼ-,M ֚.KQym5/Bu|dq}4`~ R*n,nHB!#B!D/TRjK}9GswL6_N!:K. wA3@BĖen7|[DvC&m0ke M}%I=2 ˷Nquc&D_S71duK5|cYU&BJ^8un<bJ_yB N7՗t]k[q43"m_gƹq/\}ݙL-@lk˾fI?i=8oGݩL Ȑjs!DwB!Qr} 1(X5#CiP<<,.ZJY J2Gj,տB!D$Bc':w= }:m҅P0m 8x_EC۶mo[W+dtJ0<èxr^r^ea8Eľí؄k%6SՃsIK-^?OұrchLB!"1Ә>ƞ2Aīdr[ )%\ԓ\楬J} V# [N;d: BGZ@ !ԕ{w9ovAw=u=n;u<,8lTe2NkgO]l jUMR>b+3&a+ou_[-#7f}ж=n;IZ:3oH4S ɱ*L: ? q30DScտo,տ[N~,x+پs#$E0iU8(|,Z+ˤbo% ȅB3|Lnک&[ xn8l*=Lud}.I墔rΝŧ͠zWݐ_g3'!i"ZCxj|,i-(]- !ԕnz'7\o?Н=n;91hs,Bc%Vu`s$5#JT3 F(}ǷUI֑mYJHVB !00J .e(-t2[:~r[(PF --P )e #!6!dؖ)#Y%yDZdIlyEvy>z`z6a~qwApR ~c{=[8l7M(22V}}cT* yECkѷcb3:ƞa:CÚMuq\~F^!W 1kwvp5Tfu-b{iN}!;m=]:tFvyp^97oRVg G'y߅CaB!ƋJL]̲K׆u3˴*Κ1.%LwCW4}-Eq-͖Q<'u֞?n(Q .ʇ}+͸}ƶ}>9~*Sꃟb38BNTx,lM,nŎ<[.:B!o]OĜ;N/kXE8>L>'f}!ǝ|[pX ǤB!> B1v8~ \xA4$5[Tq':lEv7'zp_;8ˮM\"=[p5TqMewЅ'HtP5#Θ]wr Sm1;ݎ;y_Wڝwy#[?\u 1ld﹄}m꡽;{gEߧgUs_pB+{B!2e]lkٓ(nƮ9W|EN۷49R+BLl !#4BH߉xI.}Ƶ^zjWNsE2M SmOW* IDATIZmV%ac&]w M!n(˿+}wkL!&}P #-wvVBLl'8U*g^cw~q y൫ŅNl*,*E?Kg!BLZ!Tx<Niw|PVɩZ'G*G4rKa7p~amk5kT-۝1D>=ָ1ذ8ٵb^P'վFj9yrWYV֗Xw Gqe k6u1.97|ϧ (:9;|1֧u-BL$`[W~p|#)3kƶZ5djB!Ę%}43ZB05-Z }j> !bbB!8d 5=l4ak'{R;uEw]9||4 {+A2@տR,BLVz@ں!0#W.mޱkPwnb|ֲ|OJ:aIajhο<^c{_\Qĝw,3U= 22 z3= !%-BCPa1jů3`Xv uإ<Rq*} Np6uq%wfnAљI*16-nWͤD+ u.J' &q4f횑$!&vm?c*<hB1<.ph8}O0w]87W;O\VkB!RX!H3^BbYwdt[!9qԪrz­7eCFa>O iAۦgs8|#\KJt, #lemȚ緧hƒeV5X_2y#i{fŰI-eLU}ZX!ē\!fVŅfK!vϱ !"B1V;cu8<AgM{r*] Uͳt>`ba7),ò06B87B[^}AâuP V倢**TXU=`|+2F" 6O#L02yy|wM[?zuϽ*p}/]!Bb.YƮUy*k-6<Ek Z+եB!%k !#hlm󺵑z eݥuG*eo/lJJ-9v KWtS+ooe[ Z8>v]&tp^A; M Xz>Nf B^aCӌ9,]^Cs\N.m-ߓladcTn,ѱ-ܻNŒ\ B[pZ(kЂ{ڙ~h;ٻúBLD?xhe~l\lF3p/Pin `!9sx&>`yz79/ogux>FՒV %:kfja ``G !%B1?F6Bߡ, Nk<6ޫ~So# cN_(ʆ<ԱEV< mL6I'Bvv@w'0+c-_) 1ì}nη받־ZC9HE6U7YƓxwwվ6!S t8"[ݤP1IGA D)v9kxxdy54zlO0+ݼ(mUOo͚㦢K={lw>W{]nl\P`Gg3$B1a|뒳XyguKL.a!pQ@{+vf*o&}fhibvLt0S,V~kwfk{o^woxr(aVzfrQb+3=<:;[X'h=YOwPϔE\aVmm`L v r̬3E^NWsÈc;}gN0͎P3 ;;?X!+=nsp!ڻ|{J^sCu+.HB!D¬T\Z%= i 78^ 0XoبE+cg(u֩HΣrZG.{Ži;f=?\v;`C)hB`?v\g挬.rtZiۻTBGGԌʽbY\ / w͙B;lV'j>9U.㌹X֚XmVn]G9jި~ Fx8$2y߅0dzB!f"+d F׽̲K/)_R D~al߁Γm1=AhRpiVAwqm>\ְpk*{ Ȋﷲ8{ip W>RιqWV^D8o;^̧Wt6\\ :7;;t،z&!K>R_~&*!6&E,B%4|xU;.pzGDXt81A􆪑݁0&]BC4'VAӚOVjΘz4ZYg];꓎-`VU!仚VU3sxZɩr)n\hoPnRUAP,j{52~݊a!o{_qE,,8qBۭe yY<\^y?A`c׉GB!O`!  {Z,Gqe־3OaxO* uzz[)cصF;ӵc?Y8~xMu<mض#ϳty7z3g{ Wۇ1U!V50m>lFG;[&'m`ۊ\za9^X!Ŭoo XVa'j!L~ mE7`hտB!8H h! ot5[)s_ORs,_g@'ߧ5O ' W'xZMyq_^GK}ܾ^j[MO(dӝxŻ+=*ǝ+٤#/eA/_C]Y 'ez*B!Ġ" +Ʈn3 E8+oHUBqxX!Bf2H~_#ZK3s;*՞kᯫ*`WZYOUtO;G7wULWiϿoז/]ϏN4*K?zl 6ܧ߅'CIo1Q~FQ]=BٗpaŮB IB!@`!bLw"iUlYcŏǼ6~0x$x3zyіϮ*lo%6b,Nljͮx }m=0n{k ۲)z̊ 1|뒳5n~v '%SB!Bַnc㌫?dn.gԬ[U/r+BÓB!OD ~/3[&3{?_H֖_>=iz3%%Y,w",q`0V> b3=ͨ5TF=lwlE|T=6r۞挩_h zV9T~K}~BW'M+#'[3=!"O{ \ on]忠s4t[1uu14^PV!.B!5؎ʤ#`t4Xq"zyp5TE4o,gJDb8qAgtdsm_O ̃zX?w9VEC{yy=C޵Sld.[9 1KLOC!3xe>jaAxh{/wOOZ?'bBzj#ӓB!&*)~-癐l^eȱ`kuf/>[1A".1}ޛ=1:]/ͨ 03:Nchoeks+efn f]my kr!ڌz;9cɼoC'ׄi1EJ ʗoઋ~Ȇp0& [B,z:zBO|'ĸ[cBi+拉q?f*3bYU@QgaT-;hNςA;&bx}BCZ@ !hk\olK"{1,ʭ&78wչ#>g*?Xb}-JA צ?-?6h*ssl|.=Vl3_a׺>+~u`ɽ\eLNw7/4B!~uзA;Rָ?|R*CHE !i-B@l(؍ JZE~y4հyw-Z,C?پ*;^Įj=sy>p.7ұȮ`WW([Ǯ—lf.pT?ǩYg󣧯bf>uM6?>WfP.A}LOKq[sOLOC!܅?U׾ "9YGpSio(LJg!BK`!q膿}Uq&]s6vsvS+h=1cm8%ZԎ#+qdG$<+JuktX=DveE:"ѶBfsM>!_2#^*gߎM+駱X!,YX!y@f3odK`QJ{77(W@QOZ k3?OpaIS`K ;袽;wrl'u83_5[p5T!ͳt<͉ Gqe vM?c^~al&]rk v=!V5cgkO%}L?-{z.?LOIq//fz B!cs?w4u 95pL)Lp?KKL IDATBqxX!LUf:c7P( ־b$6t_dB:|ƵNg# G@omVO$@;]KJߊ30|^bnP?`Dـ'VtG__E>=?[iI>U1oi"B!zv8rcf[bb0VkB!X!~#t5tM 7_I;& p,B_m[WC+Ք?⯾0[ ӞpB-fg=689$@MoD!Z'~ eJhS5-aŽYՃN߃ͨ~.1O Q;K~0ǜ\)m}tˀ'?\L{B!ȴxk.A۔pom=`!B| !Lb;@vll>HXj.Mb{T9Yl;#R%5XNUخ>|EZ(udU)1hMg_Gq%T&$Ou{݋ѐ?U5DlM;LPr^3]Si|!'@yGµOH Y\lz.<rOƛVUgz B!TXMS  !blH,BThí=ns=v(o_[a]:}mб=DOg5^:0 ɊJ)Α+mNFZzk$;$zL, 0 T<솣)rl9|a MQ̺'n?o*B!D2o)fXi,Q\4MwHa!"B1F;Z-#Ig1v2s(k}R[ 7Tx{<ĭ/՗%T49ƇfK!}CYL ow[&6dOJj|NCU\k7U jfRXTH{~9L9qd0wnrL+KB!"LޯM\N;t~0W! !`8P~ڮy㦳nώJ6=%`3 KJ&zXjбfss_ӧS;΄1뫻S/R }mkaʭ*,V4cef$,;|塷ذm?y ny?9SB!Bkz?foV#_B!) BiO;1hu߷s7&ʄBvea[Pam5aWL IՆxk& Vc[5G֬u6}ApbX@n,Q. 1Hsl5nOA_-g:fR#.k ZN{[7[v`1kL /7ýsuxmYmt9 $הG,B!Dg JwO0pKB!D$B!`}mSZKZ&nH&o-YU7WC*=UUhQ[W<%兼vF r}q]g1aU?Y:^0ǝ|S}"mJgs}up¢IJhlIkũ".kP^l{_<͜ȸ~_#w̆뫪Es(iύ:sCZmvvzqoȮ@clԪFm;'V- zY2ؑͤ.gX/z<_?_~ !B1-<{^͖Bj-[FE!bI,B@l–<7QljbfY|݁*U>@k& ϛq"iDb`&9wݞ*FG(kDoºWú~O6kfV-El{Gqeˑ6}8h&ҭPfso7 }(ϥ{J׽7vmhᦋ3=r 9j6GgMRgrrRhhꢐ젓E% y?Jι(pIZv _Ħw}3j}hiOPb2²z'' BOkzڵ_QwZm*ъsM ˂aʭ ߙ]ɕ3zجgIw{%:-6 y/-U^[uaG4PaSnվF>z$,s~Iw[D1|C>L\YX!>t^Ҡ7r\.vd'GVki\,M'fyb _Gp5VT B=_)>h =b6m[?F!Bon6n-[ȕ<[~~z?9B!T !#pO8J၎>Uo#N1_WUPnTQnUfRxS[ReShjULM} CVJ'71cE9;mu?2Ny+ՆMa{[ rPC䡌Bws?}U`K u*KJpOs-a()R&*xǽs(^0_VYv_p,8co}! WmYI5b3)9k/.ۖxL҉T>3$m+ĜpnOkҶ`%%6z]tڱ@ZGLKMժA|X_= k9_Sw9qzR6l[ !B fowUT !b,H,BPpnIۓθ鄼[PEVW(־q5T:YEM {!z Mcomu8P1[Z\V=,鹾;iUr~Q>'R#wh爈o~_}>w:+0b,V~vyX-l6Nw5s<m7!B!}8G" '7[ۦ}nmLjB!D2zj#ӓB!&L!!odጓxGd>ܱ%[n{]aώjgWSuarc7 yυ5B7j֒~:-x$ss4ƏT}N\ W煽TDCtfQ޶ϕ5oV*C=fJȶHumd)z[o:t|yZ;o}#kU%_-=Uѵ/;茮#lS[Vа@ Wv|n|N90;ˆ&N0; cgY\!B2#ew.`;;sbBNC=m;zu6z: B!松G ;ڶ.̃=GD?B{8ƗX=BCZ@ !#PP0oD-#sΩ=v:{NGBA_VZ&s`mll)bON%^Q ztMyRN º0Ls&Ӣ_ eא8RGb T#F*ocS]CXi3ρVfBA9av!ѺYA?{+ ݬzv=/vkrsgUB!P؎\~瓨Ǜ7>C-)x"tZi-e !!B1akt?rHЗ,L [`1쒘Jo`1@F؛`k_y4{6ӤΡaţ'#1jbʒRpN|R;6<=+Y psT.\{=\`ll;LGx:+f:s6iͣyD`9s- xmt3=!BÚꞧhFS^ʜls(  !ĵ{=CBt2=!bTkL5[*vܾ e(^06Σ!kc}|_KݺfNSlt罬>Yy{tx_lO '27HGͨ;r/eZ'-|ָc]n~v B!{Ͳ}75ߙ]&qI!ґB_ !X|Zeil@q0 X-ua< jlIm=t5};@ ~qf7)VZYEa;LApZAYof;LliwR;NK1|«<~^1LOA!al[i~s5w6pTv>g8PY2g!BLL ! SU/L5h+Ug1gLp|[<{rԁe!MMi?cq~K,m_A<ʸ*,Ԭb]#-@Zoea>`fqǛᖯΣfi\OӞgV[On?LOGqgL@!Ж82C7p.7_4ݴCB!8'`+9ѰԨZ#A`0"Aoh\Qw|[בdId)q"ٱى@H ^-Br --piiAv]ZZ tB){HCvLo;#[$KEy|yX9G#5')کuۗ~O碷{Wea`YaiK|#q[m^KsqBmLJ5J/c] 4 ze@z*9prv3jtodI`}- ōp Mb/7)B!sٴ3rW:/&;|.3~e}(ߥFb}۶+e>RyEyB YB1PNg f:ew['kFS^;޶?Fr.c=)vu9a0b]N_5]!.`r mbuk? KkV6y)Vay+־KX6~26k>裋9i } 鷺iB*\y1-B!~I\9)@8~nTsoA}B!X![EhVmǖKt+_I쳻-3տ0RɒXSo=3/F3Q0xC4 d[{jW+(24|vč7D?V4@.DpTJ IDATU[UxN&EF @>`koө8>x=&v +~+{*_kCҐRNC~vyLzlnEH|ٍL?u=iSiXV|<%Lj'h j?MuSB݇^G{iKr ~XmU(Q n'ҼOz!C %$ !BB!Fh :&{l; UєcGv 5xu]h6k7ѱnW=k)}w<n3 wZ˟ih[jUoPH%ZU".ϭ`w> ϟ._\Dkx7[]5GTGZy{&fdiCsw*j>>Tf!T .?'ͫcdӂ+ȨUaѪPl2squ 1d__)to#Btz~hoȻ8]iGÆ*߯-!'ep]G B!8v$B!Fh atWw <kw7;6Tcֶ8Oarb_єh1"2[4H`)X Võf]>Сb&2ᑏs1Z~g&ž\,3GW8 !VouUz`w|r~&9mbVrҲ3kj"Be>%rV04ڶƯ X*BAB!l.w\4&pL*ǔvLx,B, ' i߮w뺴Lbc:oۍ-  4k(2ja5`ٛ7SWk;>6޳\1ҧ(>o}vl+R/NDӼ=5 P: V/f|3E,/S!_%7݇)sF\C[,x0[Gy2$]1T7@!;YuM=Օ62t wd?)SC}}ݻ~AM;RgHXŚ=sfE\v+BMow\K$=? \U!nW`{̻h U=Sxω/F;7eBLwYQT7E!WQei6 nW[-9~@Cj!BB!12C`nːu}Xǀnۙcҟ֞';w G`&t3 )Զxvn|e \/\f/[zB_n P%?J_u/r dDeલ UYZVei dOU'{ ̧SWf7S'/s(殹^-WR!_̸ֲ/hzz\wRU/kX˼p꺅 B1I,BC=N5ӧbȘoOi/exaca'< x33b I_qMd&em^EȘ#SӰ"iU#.Vei|<xd͐+oG?}%BLl,?Z7 ~8 XBO1GR!b*(8 d0h؍c!D#MOmLVuBǏ^}qjt=s&qb# NX0 Ef#fr5/s Լkpřw?|6]&#^cķ?s/{|{L`bSaƶ ,ٕDj]ѳ4fTlG-z%^l+!6:lt8/kemT/eׁrkn)>q&ƺG.B Vr8w}tz (뿿Wǥa̳/#'e|hDC6ߓR]k,|=9BPu柦B!X ~'zyPA/3>̱s:\x0S:Ø:חXX|dqƙ j~_`79m>-uI{UNS0ŚO-U"Zx1 VE$BU2fkh~N0!T7K!7ӇJq|Ag?Wrϻǝ)JҽD^A32V:S|z%@5_owZ1prޅ!B1 C ~-/8!ok { x{'76^AߊE (\e_bJEKi 2@Iu6Қ\툋,[ 2ع VFNLaVAp 7rZOo-k~(6 E8i4}f'7yLh(9EAQy%)jO<o17QqhӐcGglX4 8P!MB!dsؾ'zJy\ha\1ݒB(:HR!2v a`QGI<&]Aλb $B!ap7*d7*mĦ)4DEfStx>5ynΚAWxC>lr9FDTTIW4Tz"Tz"4v?Vm>9{i,+gR EXeQ\d-5a <ɠGM:WM7P~L+=@ Nt}+&;/*ڙBhO B7f*6TPݛ kŻ|N }MV#KGB B!0łdn xNgM}kZǥ 'N\uKf0w A[9=nRr$z7D34=6J~跗}Pv$Um!v,,Xlxrgf~O6IA~5v?XaS/| K7lOs E#O cѪ(MWcm+ퟱN*PS+IäѣSl !MB!lꂅxԬڟ㷫(sF@5[ҭ s!@)fH!BUfsA*Yp95#Hlv z}]|ѩhEUGʊIMaEx&zlEcn."븬nr'JHUYZh7р Q/glv{Ԕ*q]Ub PbS V^lj%w` 1|{ŷHWOk(7S!cesڸ:K])|kP?Mc4+ܣH| W&0UՊ#]ujЉGιbX!ܩq*.Q-;T}U񎴡Tw7ZG_mJ%p{[> ؏`-xEiS"CQ}PȦ( U>v_S `(xuiSrH-ZtLh(sFUѱ\"Gvn>+D5hA1Q3IcWOIn^Z>*X}˜4%L{0H 2zՐߘ !RsY9DӁ:*=PFS^aPb_p2 %ՠs!@iR!B ^_w3jv,ցcZztV)oHe4ƫ\3-n_R}6Ve5x}ڻg/wz/ƪlClSύoѨaMRW4ӾpbPX`&g+?LV"S#;%_Ŀݗ7ۇvJp7m-tT;ab&,bq\qT~{zUC_!BoR,B ñ;LUTw6ڎEL%`+{z:oJ[TxULEQ_,}kK6$|=1M x!( )fuVHկXPkvp8Nd\9 >Z!rM>~j.@ v7Bsy*;k`u SO+^,t<1IbTnB1cpY-稉rb%ZQ'V lh=mvٵ9#G<4LFS.D(sFC^^TabSGkwL|:ʉu:ueՁZknD}ixB??=Rx:z[j835n)]=bExrl\s&) %_:+f>ÒRRRM6s7:֠/>>;!]8dBJEJ0Tʶ~1VsUl:xůEOfښKe3BawڒY 蹩0 }O z[J_!bX!PBcݮ:| ”L>YdV:뛓_5|"𷧶^5]!N ~_߾e# ρ0/亯?=}b8w)t|VEQ~-Zzu;T!H?|ʜ~(}Ywf͑=u[,B1hR!b!Ɗ?S=3KT>JR:m* G :0hNlsx~οl!l.gqO}AmWbg V3O4 jZG< /:{oB14h%Yw2cy dގM.o+V8r.G$o_t;{fog :Kc}LE9B T !#DR yY<WXڭ\hnUhG" cvx=g4塶󍭰DܧêK|p@Xu`+yߥҟT Xʋ뾕 1Zm*~NNkB!ReB! e$\Fo]ƇSoqB! B!0^'bX0JuL̊;kn, [yǑIiC?[bTۗ@\0S%pOj: ˲ 6'VUQܱnU3 y 6\?EN8S-j_U8sV0t5*^kPGo8TYORr!b|rݓ*2gm APpccnq338&"8jC<*DN>x !C*B1! c=sѼnME(mV(sF(sA)lor=-)Ѯ 'ǰ7_l<NUȬpUV _ʶ`[˷';Oxep3}\w'XO[s'鸿Ӹ";>佇cꂅ)lB1|K?[=tAֿ`}}9uy*ZPGϱ.c]/c׮]vE;Ԯjw-]OLrޅIuB鬖;9UwfAl?S%nW=v?{|rw:{6Uє{%p.2716ݮzMWd~an+oerȈh1=`l0Xk(q0.f9r-뎣FE;HӪvڇBq(-^ ~Yj+LX7Y!V4>O:( l4uo|ǿt!.3skL,7x)^>m`\W|:SB͹huhuj{b_7s_H--LVA: - `+!ok93~U2`#@S6۲+I{-ıs0OTh|NM@{; ıtk\؜%; ғ44mO!2܌]B$ Ý/m5F.o*ٟey-hW峙n/gWl%'e|ۭ#A$]1 !4x<|ٱ ;osݗt H:v?z(qʐ{7fYߡH |#bNC ;imO鶝Ċo+(sv?Z%#*|GhNO3pT奯S8[|C:6B z^۸nL6 5D-o7xU-Esɾ{I1lB12NִQRv/cRX5EvOdhÃ8XZ+h@:oÿhgeY3U't.,U Br!>85)~ui,> d1rŃEfV{c݃[e;p{ev_ewjȨȨAͬs?s2}BS6!F[yY^@vG{zh8ǥD|(TBTI;ȯ+ٿշֳCSL;'+砎dkO3Әyk.4=o S2tn`6$}B!T !R*'Z!<?OCis'Vƪjc ݔ>٩;Đ?jx0Uu]-s&Z }4WP{ =f~u^5iseQyXF˴mN?]{>P9 LGMM33xi]joB!˗qDž<;}nԌ3H}>=.7Q2q J.͞Vr_su-bs., BaZ Z`'FWUOhs,nJJEY 7Q2Bإt4KzBU}|S7#NƧ?[͎IT8/d+:J4"xy5^a3Y&22f>{#B$W?B]*lRNt[8;gj]eY@%yu-o !K!Y-^ANg fT7cz:y4}bmLFvOeܺX35o 72z:kx@qus͖ѻ/PM&s4g_M'O/]ģYUgP׮Pdb;ŹH=f9g* =Ss*AB/ߠgQy6=U4 ~7#:f^ZO+RWB!Dry}o +9#,K;qg`/-xe/LK0^('a$BRB!D#_htV8Wbk<[0Ͼ6].ڵ=.xd~j|XXtD{ucEhxG?|#exyڶ#l_ =^}W;R55>1u} :BUsZ\W"!b< `!" S_= x0up_ıpݮzܮ:kvUpL+0Ȳ,$'%N2LdYǶ'=UVw㷧ج`( آW-J}#`<|2kI恦CLk%Mз'j`EԨA_G. gYBJzb ͤ`p"xB L*75-BSYy&߱@U x'Qs#_ቧ8f+u7s)4D+E>WŢ\vq:"9B!FZ0 bMӒծx!B " aih /#˲S:ZN{/ aO ."^v+\3ZTMn ŏsW]CXU߾thuke&܀o`=+N$H8PbB1B IuFd!΀ZXJ}k|cݷF?N~!0DzB j>*⾚ Jԑ| )umn)&Ұo\ wBAB! %`>z`MteO-< .Pv$MV}co5:8ɜ9ڭ+)7<ŹSX[ BXcp#ײuxXߕO; kG<5<4ɪ7aS״F"x v^>7'7SڙuvKKo\KY}.?;)BEvSeU9#S]:ߘf}p[ç05vk꾺! @Kbb$Bk\Ƥx e3"4irBLso9ZYWeYpt|`SDs!PH,B$p`$]A ~N2Z]f}=[igXl>x,lm}5|[yxf~G[Yn.P/⪯Ogۛy[|ͧwS#QZ}^u/?/K̢%il|EڤEoFd>{')mV=|v/HOc2hz^ ؤ0nh~yJ UN !#V.Oǝ4hm܄7^n)kzP3px눱I`!PH,B$p`xxh%hw4 y{ ݮ:kvUmŢ_FuZ;U᜿:­;͘z֧UP1fRDGEvۜs??mV`#Y 2\N]^)I_)ggv[r({gDTzao7v[X Af~2~ࣃnFzwBwK_?5Z `CPyz5[k`U5 pb. U Bpn\t֤ cY=C]:FJOcuF ]̠b nUhtm<#0t=M?@:, !՛irEaUv8e/[buRdpѩǸ0beRx7$GYdǥx|mm=all۝o>?qolEfv|8&EGb*v.XB!R՛#7tECaryZ;5͍)4x'CxN&{<,R&t"Kg%~Ou}|mG=TfOaGNq21&Ju=} B%Y:h'GBcʎff~/k@_p JЉGιb$B!d0HR}` 4CtSҤجPE3a4ev؈n'_A 3pZ}JOtGXn߽rW]Ck.Lw{8ݑUe@=TzҭZ:bޗ2=!Pz!zbLv~B/[^+M֮ !)ꕋyGMU{vvX5>Ū{ݮS}|ޱ|r*悤GH~B & B!DjB<85S݌qa06R(emMyv+k(4fEsP7=hh V(s~.nW=v?X %9L2jZ1ۘv=.5O__ysVzv[7kߊxZ 9n=s-e)2jkPQV7qVoU{"@K h11BB!DV,=ΩGh҆Z*ffm.8MڥhuIӊXO+3ڱD`TߣfL;2;=my8YE_VP>柿-$_ΔLO}[ʟc˷F3)yk^,fTw&vltO>q~]?6hz5hnIK[O +8B!N֏t^2&)iѓk{9WԋٴtE[!:qp]qsg'vMxR^߳)r?l,` cC9BX!`'!ӉDI;R|uL7:͞vEsyDsBA߮FLZ5e/j9?m*!v̦`^_Enyd0y=cGXz`>;d&9B `!""U}Uex+EI%p쌥J ݁-3zD'#z $0iU Jmb=~e{B4wtA"* UCx O}\r[~tȸO1i{7b_i-N.?W->sqZf_Q/^(hdj\*G:,޾{.T4w8JU{ v{ ]B16V2sOwo"gI4so.݁)y5|R3mPlǫ\q;7=ҳێBY'B!D EWVuP(bOi g_ `]8X@Z ]ZSѻ/ZO?ռi\3߽U޽$޸OGeǠiE `n#UB 2-_Ch(o`rB6,ފDcvOUz =ObAiIzrVU7RD;J> 6wlB!NfomcjgZC+L/2p.@QCVVd Ҭ+BmBe鹉;0KI#\1RZ!$!cgOv혇z((NV(NV0fJ>9PIf: q8N_'гϘ EQLw7KҴҳ"KόD 35ߣrONd=Yznoc}#Or[2;z2ΌEig_a0aj\!3Xq42{B!ĩkf &Ĭ&45'D-/ʂM%~eG ,BM`!u2V"$r 5>Pl2u)*vE_/3ٜ){.7<_8j$>?i ֲ^%I[\I}tLZ5SFm>9vX3] QvyKY)䛔KAC|[+yj#Km{>B!ĩޛ$8)y&sq|BA_{W*va+G5o-׈c.i-BPt OкVĞ z6Z񘭡&hmj=SܚG58Y|K@nțoײP⡥׌iy8i]Y[!S VaǁC)v3xHoZ=25#O+lbIx5~?ݝҴB!ƒ|t:Rxb/j7= kvД?q 3c21/A3{ӵ:#зP8cc.B!bDܥ)wMR b+X9MG} ]gaUls7%ġP.* 1s51[? 7y%k_74x *& 'NG!ytve_sSo]2bF/g8k+v>IĘIi_}ͅwNe1Y7!dkdgŧereZrp97i Q.^BB!pVbd$>1N4?Z<@,b^&]fo8. _0.)&]lڈ֚mQ>&^kk1ȶ'dɽov`s"U=7pn\2k<;o58rF@6^q{ndI,uBq5;RӳXҖ#C~m>Y<߿7鋷r+[iiBKC7&'xB1T !cĉx8ϧ{<4`Me J, ߌٺL!vo Y4g}-fͼ3I}N;&^R}@E2[yYĹ|V*F8Y&Fw*hRaҪ1iUԺ38}>Ɋ MDB1,-1M1RsmE }?"2uT:7evXpIe4;JKÖQ!B B!r2Vb$S-{j]ҰoLz eW/붐ۜY~OGGh;9T3w!~PTo_OS5z'X۱s5v~M=:B~OȘ5)tn*Gs\0^gИ:GܼES$2wL L]Q)cއFm=BѰ%M!uB <^;{#8#j-UB!Dl{OJ!c^kD}^];|!/c鵺fT7bTm"$_eif85hz y3 f: Fjvy(VfG+cٗ.z+sn!??7_&:=܁Dfeo%=Z:^cI-7s۟8@sJ-!j\j :6nʉgݶJSg~MZqЀ6јVghEgz?8ԅ/hO5䳯 nnUuԯ4z:=շ !kg~~j\`Hęl?z;vb%P5I9}-wۼlnSYUγ->~[=ĹmvxL{!?P;2#^@nc. BڜIBIB9DKp`8(8(hYv^T-.FРP|~ nS*YX>5-?|;ndqR!9Z|Lא4c>5HH kd:bqY.q/{~̵9y:v'1ӳi;s`#Wys'R$0)K 7q3}<ߏf ^֙ZPWvu7C>7:c75ă^j%_.ʠ`z:sHgX=n?E8B!NWر} KҴxB$hڵ<ƕJT[-kQZ4z:Dn߼C=!\U¯Ia g\!pb_Ss!DH,Bc#s-˯F]ʖjzIr{X_bt-U;C8+JyH<Ӈ`[|9e.;2\8;hؘ4 9;Vx5&d*I,f$yE~rZ*Tǒ4-̡Z]~MP:M$l$хʐMgbas$:vڛxzRqs^TlϼQ5WOIe\3_VlBO۷~]–M, %0A)NM ӧ:5vJRpί]"KҴ<ٚ}7}%%y9Uͻ ȟt>y%'ags!DH,Bcxωu.Ū  "p$V~wpS˖evxeae{JvRYlV'S2w_9*/ˆ ߬`n 3cZ`k6@=rHn'of_Ldgjc܂\4{jȋ PsRPP!y)¤U`P+',$Ck`+OaT*jԸ{s1'umjqP`PHHc(Lýyz| K[BixTT7ᛴXc3b•?NB"˯Ь+:y /T5[BgA'ags!DH,Bcx۩/Y-U,V7 3f$j}!-Ypavڭn\4`?ώvɧfwqPd\qkaֻ¤U13q;wPӸZTAVX#ElN3y} ]7'j˷lv~~#+uOvC.W6œtZWw;P%iZ đ KtT7 `Z6QRDj\~A|tڜ #"CU n|8q~U,lslpqY W ur8svfm%?Oc ԺdI; 4PuoǵqWVx[2kld;)WSfKL:LZN?EUIS(kҸ ZF;iwY o41]XtT^} $aZ:w[v(?u+2#C%qd N'O%fT=m=+ 2A`s_ԧedtH ~ꢣ;T}o؃VEKCI8^o'3oe3YG(sCNi2vБz$B|ZU," LnfK+.S`>:>7;:zXfYh9ᆞ7/8o.#!B1 N*`xxFr.|+VUί1Rna.] w\}^ũz*$z]d_=YB {( L_RoR.h|gsq`ͺ-ןis'.&1.11i x]~d+VG;Z x' wɳKY:왙tʺz nW7|uO~ϗӰq3VW3^|}+U{X9{ܠ(\d.oluewu?ģ^ƕe8U|*jWM86hV;TB>xֶ*tz o* 20j& f/G}QV[,ڽ.~JMlY+NTyۨ϶BKVW3m.BO7@M~*C6M$Z51/G!qڛrìnxd$ _KB!@M6Y8V(јCVnIϣGD.֙CIf>i壗P6S6sQvlُ aH%5R?3gV 0{B=!LZ5&W_]@JHxuG'gxv[̈́LN9b^sWƒ%K^ W mƛ{{B/>˟ØqƜ_o0;:=4E\BV>cof!T"B!(8+#xlJyiѨ_ ٷ=Oo;ݎj8jtX~3y6t __|j7׺FiWƳI&rUQ9,"~k+uW}=s;DKk.{{H4>pnqDZnB>4{6vbd pu1ŧ;[~p%&q㗦7cK|)kwG%fZ]vg4d粹rpzEffVX:wqZbB!hyԬshRkWBoohC;D?9xRKȟti>Q*GA?{ !bI`!bmNd[Hէu=F2.jVEs>BV7q/b f^VuQڊe[ w]RȞwyk3ǵ.$hP%wq[^tϸjr~ƃT`jE aP+vb0kJ'Uͺ$7}-!U!|&>ɷD&(VU^vlŕsXi?l9M|(A7?`n{n]*nZ*X&OOLyӊ$ԸŮ@nKnM8DQx8lQ J4"KOWЍ3p3w]ɲq{v/iqmmNڻ]ӦKs+ӵjHz/{-Vj4ZdOW'-erhvCtjZ':īYŤUaqBMAJG_**jⴥfh'v݋٤=DbC gh(WSfS(z]PdV7nNOu0/$T-$X|X]f^p'qV|njfFx u8<:~vOl6L!8NGe- ImNr^3{߁uf# gJ,N-r&B1 N$$S=v8DAu:!/8IMkp;̚of붆Z_>ϟ.L&a CP L–N 7$0/ 2u[/V[7@KJ+W^Y=ڻdÎ.1͌8LZ5Nce+V˭i:j\!PVg2NΉ4Bڔj'MwEgIYaXQOȟơ@qoo ؤ35Z(A jFРPsMsbpҀc~ᖘ6WM=Q2aCε7OOmBq֯LJUvVy<H*fa\:Ͻ-pw]> $: ?{ !bM`!b  ach?G7yx60h 2uP ġW|SC^.³MoQ;Ҳ(%|j̞.8l.M#GBku\:<_8jG.dINv5t'_ [X=-Uռ5&3dJ lPX?rw3GCtQߝCmT*j&Tg>7X!`XMsWPTAscP+TLwV2΀ڽ-=B!Hn}!Z84{o {50 d w\_ gs!DN !'{ }O*Q4[2!egSp"+s8^k%yMKpTw ^t_sF, ?-^*JO_L8|7ioywIe#34饫 Tgy!֙CXR,NrA`!bpcT6`smAFJ7[',8_2W)kjdNb6EfIqz z=\+之glFIPԔn-o5- 8=MAT' t.&f2V,p=pd9&(!`Z5A~d22c}뙴01.N ˚ ~.?7HkW /(}Lj%fiTYiu9z&Z/#Z@>ldSFe;)h7.h|w8xZ:Moq gv O^k' ?mg7+onϳB!N&UQvш-~}Wht&YҦ&ј3hV+>`X1$B!Fɩc;Ycvy/xPX1S뻽gkG ѡqYtLkk{5h;ըUVv;t72E.i&ܝKS6:\jf}&m-#UCL|"G o5(ފ] 8BoEm$q qw r98 KK X\1LK[/CILDӺU8ܶxBJހjw8߸:F:9+KwDZ͹{6xPԒ+~"+$LEQT ags!hX!%7Zz86 }s&99H 5h|ۿ2r8M8&Zԅ;baWQx&=M4דNyKL:*~nʉgFbw\km՛:pgHl¤Vs%pdp =QKu31쳰w`7.K_niB:.՝l3Yd`"8z4$$&7Y|Ko`AmC?R,lYI#e}1{ ]g7 nʍ A+mVRzn jln5d\wIO:4#}GP?sT|ڛy\6w෿HEpF;C8`7q!;˯mw :9 oºU!#Udr1l;(C)o.۽gSWSı I"[1Z$B!F`I'l+ ?zLQŋNW:w)z^F~]촶% \F.f-aD?#F7(4,Ha5+f%] GE^},5tXvaj*jG8[&M!)7j\"lxdu0%#;Sj Bin?WjƟB͟nQΉIj^EGw7dkBu,[)4~ ThdYi6ں9_ rWM*g/I6kiTLd ~+[$t%oÐYr;X W70{7X8ICτn?s1%e`‚ eiXdc[NP \}m*R>L VH3 ~9;6"<]Λv|Bcy2f'kcƺML3iӎ_7Tn=+@O5p+\ uīI0wk~RkJ668sي# ֶ)9i IDATBVn8z8Lnw*Y&w\{K+?fǖv( '=^GWx{C8>~̶C!Oi(38=DmV֙Ct=c‘p듏jN!8B& BQ4  cn1xտվ d.ijL:O5bLV[7Wuq NpaxUt^4\==DYS Y݇AxjPy=rPƯNGUzT-+J/oUqi 97ࡺ*HmWj 5pؚf*:=O17 ]}Y?lɖ,9xıff$Ulh@O)A-=-@'tP d 8;$NxȎiIdٖu銭}3k i7m? 辊'FpBj0`6kRqn>ɍל-'9&RyKWu*4*M  ~ ò B!DۖӴn5nx q-y|;E*Z`1B$XB1My^&6MEv{5v{X߮տ.Gm;9QŽGڸv|\ߊnɄj0Rͷ4XYp 5ͅnl=FU},̎6lPV[Aǯb>='֗]f&P wZ6{9%r"?{( m֝î|"m%>-(Cdzo=}7P,|KsNZ"ǽ{k~z%rNZ"yҴ4cw o,/k`h!YòB!DR@rLTGK֘1Y1b9v &vS ?"[1ҤX!AUMJKi =yLjxfo۵ⷧ>g:\Z=/Ls]qXկ#qLOaAF\̦uj<(I:<52nV~d_-!;OE*ܠwrV jӮU2E~g(H1GBQ8Ϋ[iI3i*w`Tkp~ o5Xnmf!IƵXE?[E[%Tx2߾~G/U :v +*|tp{P *fPPŗ[7x p!@a?)a!-Iid.g: !~bZpB 6(+$xpkTc` .+ю+VT,#ՠSo!HX!aS) xr!Hl@i2 h/q$"GdeN;E<g)ijF容q5Tx'Vo%!!}]|m\­tj [1kj9)EaZa0D[%o@BZb{PhRi֚5SjRj>≍5NcEFv8|+Ϗ˧fY- *U]2 +ot7uD7lWN:sw׽"߱2\m{:]+e~-MdLz !Ѱ_ p)-M`L!|qITlJC<.d,TCJHej5@c!؞3BjN'S8^Yz!.1{(4xޢqēa5 FP.ܮy]8$8'/zڞkXx N4Vj_M&>Vl[BS ok!pOUˎ\ϱQzC[1;IC}^cP7/arg_)ܻ/ iBl79Q^ 69;u7h;Lݖ?%,V-9Zxe,9i NEbI,BœJ57B֑cw?`n5Gozq9j9^aU wxY˦+5΃sH8 u\Mdvo[B4VJqS?lSdJ ؜Ώ7qtVg{A}.jCn!d$>KAM#1ʾNPz5$*xav7]~n]zk?i%T M=ڹ+Y>J!,phDvRlgmRUJ(bi1 S{;gk 0;Ii!yrFfnQoPCގwkϫkhk9oSO)d%w—&V dPbvnʅtY?2uB!ceb=Vl 1/a׎e\ܗPfd627J] 3[͓/]ʻ[BUL7fRn=JK9S;h** ;B B[3B5 'kAplir27PΡFd+<>{oWu5 sJzo*zc G;nЩY!X1;4MbjF{|PKY9wm=_Sc~Nv|p@ pg6e-.lpE!1ĉ)v*x4 [}٤it Vwmnc6[pqL=#:M/;`Eώٷ+JKު#cݟpW9W|Z>܇vKM$=,Jʠ4p1?C`!f!Gx)ˏrC|o_eOA˔:/ozV`WۛBmBL ڛ)5qFvv%@B` ;jЩEb4H,B0 ;H56B౬h #oDYlsX8IvXWY= 6g~] ܔh TCCTᡂo[:X:mK>74>+\k'3Vֈ\sOⅪuz Sǯ4)N"(pԑҐpJ9?vy.}wN7WĚOyNBO;JAK+269țw8Hlܟm^>xv&<ǵ^"4 s V\ڒp׾:B!!9{;>;̳kx~Awexrv6| =\b S‘z/fj:$՛- w)4:>. ;@pj-  !#si]Iw$5vz<;Zi$T>8bY¼6:򜥖`({qip5o'<Хwj+l0Ю 6<49li Á'͜- Lso8S ص:mPІ:Oy 3X4l}NHaSRxSy=ɚ׺ mS[Ct<uTPͯʂT%7oe}t<' SyDIlj'>1^@xFAjZa9)ZoBы~?_^߉s W yu|;W> ANbu>;ډ%6:܆77};[ή!pOUw&"[1$B!FT'S}'*1|mW)fhd+Â^ M2ͮApoIaf5o)xjxzXՂYAnliOɋ' Nbg%zR冼D*lEggap_m#msm*g{(4Bv,SM+5PYb&*o# h+H끊C đ9~Aaz/x&Z1?mcL:H^EE PjI%ElX`H)Bssx飏ؒmߣiBCPcYuh7QU!UcZtd|So!hь !bjd5eWc2՘p_} \ f(l)4 u̘[M);` [Dc_/G{krZxZCVf_Q8~Oڎ08Ɔ1;zx)0hhi9ޖҹ/$,$iaǬSX>ARW;u8έ{ hswgeV<رB׾MA֩ˉ&fa0u0v}{ ehaEfܘU|yIZ.6o/쩦OV`94uB!zrc|(O_=;{mf-؎}?+;Frǩ!yEE"c!B. B1.H<1I<>/XQˆ7:JphPؘ6< j#Z]ujhY*l>?2:!tnJP. >cϞN"v #t{=g  xkA/T`~|3_wg<"RiJj,X}p `y;`B]Vz%Pn*ӳ04Pf?Xvs\} K4 B+-٧?=[4؋f2nr9,x59/20s0Q!EZ!tmtCx&k;ܦ^yΎh;s9j,ZjJ9A*\*~7s WxǞupv5rD])G8t¹:<[6^vt[rg+UuZF~⅔ۻ:wKhrY6]N66(=}?4+lwp~ުU8{^lPG3rI3A*r-|־46u튝h?82sE1߁Ǟ\ Wu 5Ŗ#rEۜ1R(+Yv4S~B!hI_kz3 ECWU"R5M$;utf-,KST%ӂ=\i{YZ@|S| B1qf !b(jמɾ8&c%H-hS&IA6Һv~*``_5oh,xr9lfE+Vw6KEM؊I+H[@o7$>wL'O1qCo R5o [ԩ:{"V_/?Vw~_u~u6,/CE& e1Dݫ+xWCj)Br|[dSkiP X-,L~^ FBXi%^ =< ؊yf'86}ƞeE]b ?f,H 8B&i-BG$d ǃmj0bs}< Hu(srWyP3"6qEv!2o~[/P4tVn2l2*Z9#Ǔl*o`'rP1,#dزG2$\5DzB#|g fB/_)YYφksB{塷Q=% 'dxy`[Ydq}J+h!bH,B ABC{6`̦l+*86v, 7XDf/U=ͭk0fsb0Po-Tu= \ZB\MLV_vl~uU&hP+dtچ-p~|{3]S 7Į3C,My._hp1䟓_l[C~^!b4:qckW¯Z:IӲb1!pEɉLCf̺ y*,B:DB!R !B^%j(-ƻu-Y VǞ&5ֵ6\:';%ÂM')/}uPkrX«N޷Xt c#{Ouv[ >ZAum\_S勽b*sB&B!p-0*Dz| ܛ,,|pLzkǠߞhi+KП5lr5,Mcۮ p8jQ`ϾO^;^{3UB4#ͻPp~~L۩O)⷗_=ujpΟ]%S%Tn!C*B1aE*?Tn ݞ]ZrCFw-pbSeKV=[}D[n#54xNcC.yؼuZ;XCݎ<::p 1HPwNg% $^H{ڻ9&·%ts{Of !]l"/˛J<+j?_8$~~ǍkK0yΧZN0]bRbEƬះw!BħiM?B!>|vهsLc3Z?>gKZ)lsIs?\c/;y`i|N!l6_8-Qk$Qksv>PԴƤ"6޺3itւ]nfΏYVxƮ{i*1''tzl_sR|hAYᖼD>*6Y$>0y1)^2j'Inm;6 h>ߔ?B&k}' P$Ц8+WJTzk0UJ58쫥X@jBueXc&[;NZNgDI_cP=]bb/ !ƂB!FXJ=5ZB6b#`m -'x;k(hf 5ht @װ:zq<fˊ:nJg5 OWP-i|vE+DG+[B]֭b5u0Tƻ:36YW5w66tKuӱ?}+>ּu'><}0O_M[v%EQ^[Ls diY-hXo! GȦrcTJvWK=Hb,H,B" GDl =Zmu:~3Suh NXfo]-p@ >'M\5Sa5Dc> 2 pjpĶ֎vrlli kMs{p`3F^;eW;Qdۏ示BZʼnuoׅИN,q)i|jNnȨccy+;So!XX!E2ؙHaT1B }>;*E s;bH6Gp6Wq<7~.΅-svm +2ow' Vaaԉ> Z7zOu gc+ȾjxaoL`!p8Gp1۠ӴcA.yOS]y_ WsrC9Wec!4۬|8'f i K.<}+{so^SU 2(fK/=;lnc!SO]>,;/Ǒ25vm;m.0b-m!'?YB R\7ϳA'[>z1'xshMNhwRpv)O;ܡow0xߑ sR\3Ϗ5ǧr`&s~ǥ9t[{zgy#cijk}lOhnkcwl),n}5bMA4r.^^?I!U'N^kUT\l{6ih2^?+7\3w]Pս6ӵ4;`!h ;PSSuyW\7eĜncC,>bJc-+ !HeSD G+N]tn998@O:JwRk~ԅJӯP2b0Uv xAppo-U:Ǚ&/Vp+4lO1㒌JZ 49Yf9?d[6.M!͜O;IUENX*B cE`!bx8y>ՌbfܹBx,8q5v OjZ\'/hi^]p%`RG"f'3wGƎsXbVò*_=ɄB*k!l}I!rn$`̏yLx<eH`1ȱB% BQ& Ucg<Ԧw—`#@VY)hʉZ#/TqA58dIZƞf54[ xx~뿥kA NU;j9͵3 T|ѳsԧ'ؕWo@*ܘbmp4/÷(mȣƫ`oJŁ5#_BL,mkcIsib+QkCF[}~=ZH󓎙^YHeͅV̑ gU<::߮bC2t )jK{JLp}t'JbϋST!X}OokB沕_[Ga!hŷwM]h8~vyfBy쭕,2mN~;vةg XIl3ظP"|ȿ-'Z85[~9}|i3  'Jx6^:'Z1TcB!^aW*ؓf=U~Q2{[`{dݟ}ܵ@%ϫ9VrR_2w2m.掟;U{ 3sxٻdy7DIھC95ڀpkA=n~W_%?*kfaFdvB }lrGfJ/@3ƬSUΊts+߾zk 7m穚PX{wRF%RhfZ(4)Uj6Q̷+~NcОƣB!Y !l2&z &>XJINe]z Bt9,P"KBnÛ}.o ӾNuZ?\:ևF+|K -|?iWݘ̮۩]]}B1q-gu>([RϛϘ'xio PbMOTN0Upf}5E?|U7VoVqgHZ&z* P_SQa=#=wB!@Z@ !cB@O.2_/-G8.Ƕ}M~?7̓4vkv4se ʵ?k7c1]M2K߈V\b5դ7o%}=f.xuٟVS9.oMbgW'3P,mIȿ]R蔅8X7JZN7Mkcw2^rϕhrIo<ϵl *gmka˅BLTn97OE%lD2+i!.?{qmbuG*r-u!x[l8'M˓|q W(d盽VGLqB1X!tՎbp*x|1uY-;*2B 5='cl^6[p+NNfA*NvSmrsm3տǎ :ƛX ! B1N*x|FMNUB $@6|aLF }صpա|5e33T|ږm8T~c>[uÃ#9l6XCx<.Lnuv4@}N<pC]Cz6R簭VG9+NR% $ vTm⬓n~!CvDf6qgiܢiV}-'2Tݾ}];גE~.c_::VK2 ۝lx4̈́JNrBLo&Erɡ2Zk1oH,&%!#B1rr[E5u Mn܎9Z}TUbmU"[;cdN4R=5 4s8;W+~vޱgE[%v'o $Qw7UO4pڠt=;)8UKu]NXMWPN:Cy8j ?j."7~B1>-QȖ&>yt~x-_)^?[wkJy.D6%f s ש|`WE1_f;*U/\zkY}u癊%! B1F$ 9-F L}F*lg($完VDZE7P@C>V;NHd GhmHpJ9v>Y^@x>ZDK9zw!BfT>o~[Aɣ-(!6\4^ *[|j9er"fv]KԦrXhv;C+~cC.]*9X-,3?*% Xs-i9`MrfW@!۫V%ć۫1fs"a7߈ȶv \hߊğF[?o )6ȱ۲q9,~- /H:?¯+zq|~t+b#c AŜDD<{`V^b<_n~tG1eF>AZd` +J^BD`!BqF۫F=m)D^nVou91UNb j/a1{@sN8-z ÷w/S.\I|mJ]*g._upnBqfe8U}2u쵇yu c$0v]Cb:SS_:ܪ)e2qB B!8&af5hS=UFܔS4d T>Q.2G^f/G HSz ZfƱ0جSЂ(؜Q呙Bmko)b2O9ÅLfAp/t"h۟cϼ_ZpLtB1r$B!@Nf'1$ P <9[x<ͨl%':/"Nϟ}=UoD~>=CUAb{#6K?2&gP8W˜"ph7G!m9n3+eW s`_yI> /T+#SeN^BF5+ B!n^D"A>]Zkq9,\5S!`+)\~U0ƒTol>dPZgFBSE _BBIz/47QHA1iiA~{O{ -AB^yf:IRQ),٧pš2nPȘ̏8B_3 4s8K?׀ǂ_1gJ% !{834+!BLe=q-anLy^UG/4̂%4`MZ$b.~+Sų'Z}l[=gtdʷȾqo|ӿP dY1]ނ |.rx8Ӿ 9BJ*B!8 jJ)Vl!{bL·p 9=4x\IEf 奯&+.nGg1-Z!&6 8ݑf<Cr:["_..W\/;_ҶOiB!FM_>-oOԱ=: }j0vMYl)۸&;&W/n{/Xҟ zWg9`cO r|X!B5U+x(Uc˨(r]>K'bjJ#C@^Íӓ㧡o:9$OMv%}vC\_cq qB!FL l.:u&c<$/,죛93·3 '-cj6=~F+J!bQ봦J!SgG3 1C٣|!ooow[dIաu[MI۫~"D|u}F>go_ωQK]뜖FVׯgΙ%Y;: j;Wz".!eXk,!qyN.Ttq^%h qgYqok 4qK-3$]Z\g*˺UFƌFƗc̞ןe o||"&9BL5+ BF%*z F> [Lm:8M&O{~"~jmíSۍTCϼm2q7œ;QRZʬT,ї>Op։Ӈ!oɩ }sP4Cy冓i=#_1q\09{?'ͷ9qzgp+(xAz/G5Y[bv#ZOKXz8ɐ%b̚ןs> .3=+&i&^ZD xQ6s^Pۜsu7oL7_QR-ޛK$MҤ My>y|Iw>/֯&(JFogǾu4p6+0kg%h(y !=Wa-Dɂ?_@r ֽZ`<]gVzp?H8|\>nW=$% 41kA v㙣Ϯah.|O( 6Ql۹ųG%K9%ͩgZ|N)ct&}H9X[B=9^zd5era4O@We3O?5Ա<^bcjj~? 7`0ZBp0=!Bts 'P)ɔփB m)~O wϻ9.g2JQj5-k:A u4%a׏ົS4XS祬Iy×UsϋΣ3}N%<;~ͧwss@.;N9)!LBޢqh&9YBc"!~6UB6ܞ3݁Ͻ 5TEt{,*Oc!D `!biUp&%R#{{< ݭP": 7ùBx׹;u*4)(-❖jRZx}+ GЫ,(iqTTٱ:c$c?O+)4<(a㪿so46ڷiP"i 'gѤ" O| n:2B Wu#h9,n2Fg's2Yd=H!/1b7T |idF(IJsи+տBWJ+B8!$B!nl4ݾ۠}:FHy t@o_~ T& 'Y~u3WZUrONvkpR#S iZW |'"E_N$B!M$an~ JC{<莁X׮.x^z~nVi [uix'/޷nbU [+ܼ5ܛu z Q8O}EU:y%\ril9^t*w1ןŕ-Kcgw]i&ТG=Q(`JbNkl]!G~~;lܘM\ygw9HW*!][tl}d S7v&ϱ"H,B !===\1|s۶p|g8]YngphU[d>(vΊAop߯XyeU33:ރL8?GO<$UW 0f~n1JnQʭ,)Me(nffeǞG&}-̍?Dn 9a^NpuJ:SFGGd{' vч[X!DȮnɯ8LKCYl@ZrsHfW,h tWϷU w(m5co>EZ,Oc!DQB!*nlnKᴽk=jc2k1zʄ˭}4ıi[%^[ͩǠfzQNv|Uڈ@LϊYd٘䒡l^<d_ecbW㜑e\# `w{|)k^bg"r'B!DOsO+f򾣱Ɍ0DiOv<|m`U !kX!BzSaB)\!{ETR_xXl}o瑧-8 @IEUSw= )^0zƹ)vױ۹՞ MQGHUpiU98 aA&8Qκ1.[M)6[i uե5JMPl `3Ņ\”j۰֣P>4VvBhcm.F[9z,mgU 8F>yH*B"J"(*N{R [eYeolb8<'}~Y^g_5Il])IJKEKwOOm Ð #^Hus13 ]{ۚbDm-?CiObRXǩ%0zҮRcŴY㋺m8PIHy-~5f qT6h [TۺBcN"\\zaj7>Nߡ?P5?[泴3{!8ɘA!#i̠WHN )m "L8=2Z=WWW0󌋝D;xy1j4\a6AeC Y&5Q:~B>d3=F"5W%x$WdU͡ ;$Kg&i1u|\ p;`t9#+X"٦f=jɢ˅BL3{ͨUjQ$6y;|?vAmoUs2e8w.i+ۡGc!DB!Do q|Բ8R8=ugm_=cӳ\/,ҢX~_@-p+1l4B*K1E&ޭאg g pD||G3{\ Pp`@F* ߲(}JNjt=t>OH k5u^7JLc5Uw]S'x !ppD Sاɂx #z`K""IB1GhR)/~SY2SXW;X= `~ɇoF.>f x=(\31-" uXwW\2G2j~Ļ Np #:+;hȎ4NƼ5'oF'{)ʱJ&OgהY4Sb^NBi,Vܘb2 j ,`?xҫjhp5*uo:^vdogQ<ԫap*%|R+g !CPoG}!Cb.}OfݎFklmVU6c x5Du0l 4Zckh4pUrv[+:0<)+gx [#1<[mPثvxNB[-Ԧ;Xz*%  o wlܱ t.w'i`!XiK8$B; B!JxI,R8=՗!0x|W`0{v锏xNCX /&wO)>op^> +ȳhkW2D^q9}oߖ`84bXcQ֪ahl{J9,WPHMsBFJNOĪ,烯BHu7  Ej\977T4p %oZK'駏2 ϋ-J&H9ZNZXyf2{iv{ !D<G^G2c);3c3Q/pqݼ_bmS<#䟒ŏ}8} FeDܪΪf+wRBD B!/G|!R( }z:>^+#[./ L86ƛ3/QAq`[P3l7aO<>=!p 8!F6MJO>~1onws$TUb[olc@3~ZH%6}S!"W.a'gT=KWrDŽ9c-~}wʪy~OsbDEDL ~B{c/Q~ z(R+m8"R~A\b7͓+xǽ~Iࡧ8o_x;y%~l9ROQiP|pABeoi y/U}UiR9BD`@!GilCe J+<Y~S=}6GȤホ_Cz&ը[3$h=zDbuXb$*bn)͊/X󓈊[˷t|/q: Z5*ީvs#sNdջ;{n!w Ɠy%SC,' x { #k#Yg"8jJ,NK?&L2$.;S\V/}˄ÏB!0i-%pyOE;-; tv6 ;]8[&(:q;()h7~L[UaT\8❴̞_V{RMl} [C%ktOqj%N?|B< k]e~FA&,5]ޞBNwH嫽ZNۯ:\e/=;2wWmIXz5|j>Z~=ڷJ a[@K{&ϯ"RH,B a}q= 1C@&A譡Dwשv%>6]_ ^5~{#qf&k}4yT4|`u29*2gqy=UVpn\n ޢ:l|R!;XūiSysy@  QP!SSrKnvp))5X6BpМOԁǙwx.ʢL29TX;n`%R|\HMƦ:5n?OpHo n;LϢ/+$ !CX_pB EH7:=n~)pc+`3?Opcj4:NV{*}744o'>*r>ֺkXK<;8wr}ݸ+&rռL>_ٰ&ƦlTܭ1 !p?n()뱑mx㚽PpZȄQ>&nJ}+ıB#`@W%y~D`!b*`!‹"]}ÉZ3WUϠ:l4X60CQV# Nm󩍭˲KQ]#Z6ph=PpR]c2vp{F-|D9/Z+@sMb8XfL 7] lW[xt$[k\؈mmhcC.i|Ǔ0RI"H,B q}u= !$ XT8W!0?n]}~fZC-1^W7,VrawbkmJ&{~5 jL|͗)΄}Qfb48I:tv.JbMKԔDf8ЫX=ph'%;e/Yw`6K>Bd<a@F6 Fa2{B!86i̐\g2 D }>]^q.?fOW^v1 Z0$hdya@U3yIϻk;kBDEY2MFa?XƨqAB-~5~/#U[XQkPF&|3|TbE9@,pVX!*'6W*Ew˾U}Y rp-;w:ޜG>~[mUȊ<B.7%갸sru58煯el^/M#x_SYJeMC+%aa6ΒRNgX)3@bcv!ڦ} +(r;PobA,o$^ =8*2d !"B!DX.aaKwxApWݶu=>VZNpȣ(ѫA8[=V\4Q9z'bt W=,?nB o;%_n[;XUE\G=a&.7uTym)`}Z |d"B4rs+TB!c#`f+ anyd;e]~e%h -cжZ=oo3ТCd\F3qN6zB^}l FpQU'46pe[wIS."m !BM`!B!"҄UUܕxAvc}Yj8i~ X_ǿ/Na]ZB YO]BEf%%:ySD?e~,kGQ}G֗yĵy@uy}~&>!>$B!@_) 12K,'\ԛu>V /*+A f-$X~ޖ' ϭdqD7UO !D{WȂExoX#Ss/)lM$A wMR(ͻXBKvlz_!DU1|H,B!.! Xjܝ;Ufmu f,L 6&h&]QTGg<;a xX]]BeCE P:z/Fi[%ck&aVw<[3c^Or-n\X-`G-w@g*BB!0 先TI,'c/Z3u%p(MBpRdީvS|j&+}70N{[|hc~'ѷsѼF)Opͅp>BH&連1)-zR}y1:XM¸`rwf}cz uUL.mZ7 RyYEc` "XB%ϭ"IB&gGnU x;Q5𱪀:dvf-4UrE`.KfRP.Ҵ^^x*Wt&@_@_!Āǯp<7Tzl;TFf`(1VRyVB[k@h  d 7)uN|BϦB@`!B!pk mA"$# T+hZ箶*C=kO0kɱg3yy -[x繯(w;gcBpݧq+;{9L2 jf%0uQUcx!G/ƬS`5؄5=Hr7վ.R+B  !ØC+Dx *X p {:p3 (I]YN?e\5NeSX3Z !DHlh4;fR |Co)nޱ; #a!:G$B!ˆ"}/ X@=1!pW` `)8a{WO-bClPϲ!wgQ ݳ9xVĐiPiPc(mƙyc&0lF%*046bf<mo!M=3>!L !Üc+Dx j`"tw= C@aP{.ᯜKc2>̘r ϏBDѧ_ 5I)Dop1rof|ӌu p;x3$ˁrRFwZtoAw"(z#? !DwtZC=!BtNRe !c㱅v{{G;yJ00GZj\*jV'Lqf= 83tidtf2l2B;bU 6w0.!M5*^ZKO]NVluSVkB mϏ#);s=yLȎa׌'t+F;.$;:u4J[6dj8gr,gOyk)$=Z^z8֫$4(/BbG[UFsx{8 k_{|cdҝAK˭lm9Sbhj7_צ1-.ӌpf%f-Tt>ܾux(W[-lrw }u t~ީv{?"k_t'rݧq;Âx ɥP%Ekc`]l d Ɣ=x>wbTT1\IB!.C*8ړ>GﮤlnF |NRt) |x}l/>l3TM !1ܵl7(#m$N  ]7Jtw 6U3+O<@0ǼF}v [FQs:O>R$D3/u%4|^ Mj󉵚gq&*&ru#5{U&nz;VOW&b RɤyQ.7ӂrO<u^OcSU/VY:k:_7nf16uu9:cmz۲/BL*B!F"8D#O2Τlqf% S\1m4v‰8`{H۩[-BAMZkKCw_ORJ`QOvY~@eLh&雈?#̼Qg#9y,+oU{ږa@ɞ1|Yݧ𛫿u'^19apVw,_?p2iQ.bZk( Ij LE?+&]dg+߿ .vPg .:XU%{}0+C4N8+hlRPOk8ޜqT0:?ԁTF ÝB!Dp];-lµБ#Ӟq ඟ &\r2y0-ͨ6W#WRRMeG]_>VgowƯ8aM-.k0k}+HVs8o,zW ژ=SPgwQQz|vkQTm)QLn]94UX4A>8;ռl_b()_?~]^\WF߳u8kdbW|.?wd 趐WVyvD߃ x3tLr*xht}3yTbT1I,B<ۅ}c8%ᰟwp_^O#j0Fbfj6;I=}:olHViPSfö6[T]E\[͵;W,cRgU\'ӠFRݯ3fY6r#'?~YuijQ%fMc'qYU1<[dTUB fG9VO[^ jѬf-5j[hOؤw˸ĎNx:+YI8=-L5h(q8ױC[oF|j~ouU{$foΠ%lR28] GhKhT!$B!Z څ}'ҫC*8 }cz&UNJmWƶCI] C"/WqWr f FC6=-.S3+u^nkr| gMQ38돘[mGaKټy55 W8|}uڟꬅ<[ЍߘѺS[Q9B,EOs*!bo 1 ׽V6 EP^ѥe?6}+S.NF,wLfKV{7*O| ַv9@pȵ(4Ov'ѢbGs)≕,μ$F:cAqT6QWG>|t';&F?y6 ; U呎u9,TwԖ뻟qYvO2mOA:TktkݾV8i4* OSUXE~-?csJ_FIND% 'OWy~۟`aBeR$Ia{tnѷ9B B!lI(08|DٕuAy3[[| uQc˾!cmog V}fgQ,|t"soK5@Eܽt]*wV?X·΋uWcƵ3k?73i:ixq2>Bl֏8g-\u kulu;gMS'R;nl0P259!4/}&(f Vy9| ,z+R94>Y“'YG/{hxqX5ϬllvQQ) 6J'XcJl)5||t9snዏoeR(~>g6hJդJ*<X{(5u|GܲZxx ?JPEx?N&a@FKW=G2;o;իzqesyy翱z.ϥTx\GDΘCo;EwlA᭢F͈%Ji~|BQy\{lb#XٲcQ΢wbٸc,>/cȬkk8}C9z/YX՜mn jO~#M-.$4IdrGͅߣ%fkTqzqhRo=d9O]/(ؚvXQN$J6U#'[*,hnYG8-qq@'ˤS/:[ȩ (1xN!pgmtZ?Z" eÝc3Uj6\ :!uN@N¾Hb6]=ZǞqL636M`ƕܺ/@KB3XCg.Vx2V NT3է /H]!~ Ƨ͞OP|[ۗ`ݱLj5(&¿wֻoFٸn0nzn*):zb4GjkFRO@*o5k꼸jʩ72x-#u$נVuZ~OOXs+l!o)8j٦(b*gp* 눍c%ib{X+6)xʼsNlo5D꘬O矅[8`m.S c8 ?HUyxuT(qA@&VCP{<>_fLSvO>7~*YpGIg2?oC{Ӽ&KM4Tk>ࡿK/-~Nf ޜq1B`bLL0Ea)ga]Y~h)O;dcLl.wuI\iw%I:MQs1*RDkɳhA:.J= KSZPw?hv456v0CV0Nts 󎎪s& )$@(@PW6l+m]W~յw Mz:IH:$S3}~ 3'S̽w>9>~g,TjqGon/} wgJB_)X 3q\=.?y@MdtMwNv7$H@THVh0>Zβ5OT1GvgT~k]3s髟ӷb?1rU h[8.ȵHR{22urZ|6Ίe}&4~̈᷑dΈDp5rT_?&EgU첣fa{l^v/l$oц._.Ե*u0-\F+Z19?í-T91(lk15@sfwO_Ģ/OZ\ `PeK g*xajPsFu^,)y< ln9v\KpʡKe}>Z%6i هr"XdSP2Quhui`*պݽd9_=S "@ gv] y~%;#DŹxLpOНzO{Rߠ4D a:9_Zӑ1FCu+4?+v*1/<#e/(!8$WbEH9.LEEYWWpXouX Xlil-~7nKviws.:H dl*VXyefWUo^JߴF!> ΋Mp]>OV0>$$gueYb]dph wOͥ~>2h"hӵJԻԼqxHog@^I)QfQj~._Bum8grXVDhʰgHwx~jtTF(wyf&-#.\̰\6.ѵ mv8sCςAO@ @ '@ 8 H;kߞҿn"?ҭgӣ+G#g󢓥222s&1W,<ѯyL}JOn-~ _]peUi)y MqP8 ?ʪ-7D{ Qp I1JxluTLltMV%10LKM 67FWp9vkP)C")1*Xͅۋm"g@;c+,Ңb A,y™:}.\ggsx<e{Jv|{:KC Z}2O!Fͱut>ȭf.,/~៓/bXf_~ ЍDT Rح{60w#r$pDF"!=q} $L1~(4d#Z$fI *9vDjD7_biudl?2ޞNҾqRÊ5u\A qjoBڦ"(i>t3S7 E٥ab>y})?V@1rlv7).& }O:LբFL+1d|?n7pai`뚕Tih\͚e6?'p69,؈Mpō#G!{D䭥#}%.X%հ|XO޼ )ݹt,RS񒗉z%vLs{(p3UcŠaS?&VCc $!MS$4٭ؽpL Gһ-38Pik%$r7QbQ›9l.) #-Fx@R[،ɘO\<#o oTnc%~OeSǃ؟@3B @pqNv+'( }t> .|{ljl*L.55^whd5sg 4KrhY^Hs_dwb;ܫ&k⥞)*xn0n^:` hRGb" pG})l,"+Ϻ 5oa˶rSy#{-xI{$l1SW8% x= 9w`Ѫ}4m1o2n!ex*~Kv'_ yE9zč550Un:`G0mHo{V&K6l5}cZsNJ"w~ /x(9{)zl|[ړH.q:u'n>.MIÐiZN:_y_Ϫ qfŕrѷBM3CTSk4;<=VXQP[͵"f* ӝ! 'DW @ Gɓ‰u@pn"懣#RgsX<)"fbTQ[Mq-ftikİLipMUI=*쯳Pe qEP\Q wpV! Wϧ֊\5s W<͖J[?4^llerd, iD4L6/,ѵliWi9FPIٵ5-BƐ~x#mwΕwpE1j#ɸ;9+q~,^o>sGG*cb.yϊV;,xq1MƠ1-^ƺGzvNʆ { oOⷽHGsO\hGC̈́H$!&I ciDu_Fb:LKƺ)5*6w;#uĩߕhiPhKSool,5.Sdh W:.ۏ5D:6E?:_qzN ax @ !@ 88'Iu@pr.B~x:X*~.+<QIJxn&c>6KuIl~HJLxKJKsjluTō7^qG]ll(w}5oÒoe/ggY!2f#VlV]ww/y#Iڣ"J@B0QgBr- J6;d%Lհi*wf~2<+5Iuxl%k+MQHHRP~6`e_ͦ|t2# sŹ@pq(9KVmH&v+G^q/+]y46ԣ)jIC05v-,L#["w'~;WhOodpRh'n M.~m2vHsAuWbthQ'uP<ݭۏ mA|xQjvhQ'&e|>+,(gf/%2 =R~h . `b_ ~=@ >^@ !Cwp^rÓYoK5W~+Z_,U\ Uۥ'eEHgڗ6e]icLhiټd^q Ƶn׮v\[sxuc ܞOj=#gfT>^[n{Ŭ(_%q#I$20]Bm$ZXWF瑿.FJ9 aQ obOl+b.zh/B|SX;"~2Ooe̸ࣙ |q+֫ g$7KYI[4lVHr֗q1VrN9:?ee׹s箯w̱\?\U0 r dd%Xy.!(O:K"] [WܨX5oWIQq4;ԑ]AmvLV3Dc"*vU㕇f|P?x/LȸAhH c(A룸n \aM#MNYlsAF}5{"˩"=U(gnxLd}}R;3%_"Xb5.L S%zgT̺&h2zzYtsӵh䟸rfʔ-\ / 2OT;hr|+)3]:h6{n~OK,˛rKaF_ ?[Wi0Uf؀)嘐gH9=+UQ6ᴹ{Y|]295loMf~50}e0]Jjo䑔tbY9hԍ#ڐNЙhuIeCz!sHH"!y|>"+8ۈ})C`@ C n0h IDAT!vAos#zzqx@\ˇI\c[aZ3T77O\rϪ|E:%@0pfJd3I W0LD#I-> EU4כzHnTQ$;>FF=(jC0M7*46!,! lo'g͜'&rL|}\p@ZU)RK%,ao C"qXQe͠nZri JHITDږFf}p??7~q_ s}X'ZqC 8d0+B)LVEXLdKBo~bn79>qh 4zE rA͂T؜pwՎOsO6KƵĩ!B&Zv,j nu1l}~Z혴JA2ݍ+ *AZoR^%dJ pDz/ u H,;XdisZpw˓r"+-b_ !@ )gZ #1g~_DW6K5+\ 1އ7wehJzK$ =VfhĩrJI$hF6*vTkZf&≀eS(zr†6 aR?2$8 xVڊXa€Ûi1d_k ςZ'7nu&%Q_"I n!r{5#_r#2hL8/=֑F}/#)*nJà^:fLBT/#"2gx=Nh.MeJ,4_q07%(1o|%o}w cW~a3Yk*`t0:Ɣ#3wǵ桌ڈ;bVsC<ܕ̵&@{mc.lR[ϟ}&FRdzMJ(!!y|e5V:E$]0r~w*nCk^٪#ɮM5VrnJT`?;?\nUH0\ S]'_o'o: jNSN13l"={9&:܄^pxe4RC[v;L2_%) /Lb}]3"|b2QQ*5z+~S6S+f?ux&4`6t~EսZgAaɉ4^Rh|ro,LÁ!bm+N06$Lná˾0˽ǽw3~_WހW2O^0kmܳ ocr/`|icvLd+_eo4xk_5{׿o$3j8fG3"f~avrSbt߱w"A[ijwIږ׵VDyDVkCZS8:5 y^ u4;Իw&c^WHF"]׈il}C I?b? !@ )gK N!O=B3q:zOٕ<7ޡJC)vLդG"RǂZ'j/b_HLF W KAǩ!9#Y"Ϯf[Yr=3fص0qj^ΜӿC\.9Kd $ M#NAg1T?=g+RF69nrV5gf Y¦)[EM{B%d{C{ ܓ lhb!_Oja ygK>qݢw3G"VKXm|h:0K)!Rg%3}E)|[e{r8z'OUh߮ q5+$>vDNquvuml`YI}DNyyb/9)5$^q'Ua$^~x0!ܨ ] BkvXc嶸XZZK)hO3kގ-?uEp\}"%x@Gݧ{#K7Q|@G@ 81X'I8n?a6wn= s"+-b? #@ 1gD8Dqb9|tNw0P6Q:|9y$@nNm= ~6ܼѝL؜_!C\sUzv@-NJ,^GdžRɡ҄iCq:. >.ǥlXh 45޺8l鮬v{eF.ܹ|c/<}2c^aeNbѼ{yF&nXѓ(s+#cZc).4r9h6a=~ϒݸfN[8{[+6փ3Xm}nJlð?8=.GpHC`3bv 3?z5錉jjdEo;y8{nn4}LuyjF%KkleJxrn?oDw7|O_AoW N!@ 89E@p2 |z9 `>^tm`t}%)h rHm"kL4{X?N7+@*'C(t5G,R賰,æ&r-r9D?oD˾v'Z:* S/C`j***Uаr7{v~LucJU <朁~ 7MK@z*=Tӱ5\J7@s7_:Dz8OGeNIj\"M+Qa9*5Ҥ5;؅&RoVko]8s%O~n lTQ2n2}䤆+((##WסT<׎H z@pr,yH +b93ܕur{#;?]5nv_ObG}M1Uoom#12*A^I/E! m`{Y]j.澔,TɵL^{$. ~:ʐiz-0z$ɘ:g;TV-x_X>j/|bW6Y6QVe !e xAޮ3pv! d:+86&{Klvd**WpIU{,q:6rQD3}Ͷa*)z ;Mnj[NBz$)(̩wY݆vF肍85<`42mһ\ЃL0L$i?e}ydKHTp.!f+zI%u8~-&Im%ΜPmDKWgC:&Y5-{jQܵCCk[r1Lܓ:5bJtJg'_DH|@ 8yL_mdTvY|@>($V4).{se8~n?V`+> n)~$qsxcUz88eM2GCi\?%wC9Uണu$9YT6@}]##pU^Mdҧ, 7%Ņy-7UNa{T2 sI#M=H&L>\9/>~D pus*_Q$J8,;,S]u+͎uLV1^*LDžKe`ɱkXƍmnLUlфh?w'cP[0C0/tLCpn1UiP3Er9)Ի g@ t3z-Kv?v@NBn?0}9Oɵ \'&@'tq*pwe;M4٭mt {+4RwddeF-j25` 02r2 +`CP OazB P'lo6c ;vU8#T22>^tTf61Ѽ5k6fzꭨpj)=5^IX[R/{wf_؟=ڝs-mSA }ؽ >X6:,X @FZ"' o0**ЕCbؽ;2=U,|CS0/qkUQ[=eq3߳>cQ>m(wHIټ |D˼YŠU,3>*")4Y 8l'Poȧ,OOP#.+c$4ąa$/fzv]jFk_F?9i`R;=kCt'j:>}9g[IDd1 hlZR mZ6*o8NJJL,]}fF--\7k$}yg(J_D?~(bpv3sU(ȌTjXz4Ld<$oIcf:Y* ;Uu4*¹~n?6˟"Zd%DSUN7Б IDAT=`jj3TnwXί+X}!"uԖ4{?ނ`_ 扸Wn>1ws?FүIxcIːa9p[вZ j(mj{²L OiAx{cgqP6s՟&5\Δh{vgЩG> SXg71628D]GH@b7{*Hե3DWFo9ﴒ@GQ`!V)V*"`ioa?RS@ 8,lg?U~S}vYݽxp޶6K55<>XF|c47Zh_}, \Kq[\0CZI~%%G!yX&T4!y|eVDpPXh.eZhoUW& ^bgeHE$yE$/lMrkէaZ%v/h `hn!L9v^q9|bˠ>JZ2Mlf3HnֳP!2}r(iD.3+ُ- ~xd7NMrfk>w=G5Kٶi _jϔ4<}p dB`%N{=o<"zX[0ߖ~3qޱ5GWn, jm+u%D3g#)C҉#B#&C̱Ar/O^3]F`R`07;{gL9RTܲXFeL<(p1)(zO|zh>*s˳g«WGR? P> Lޑl y$MlF裙m\np$pWj]s?(,ۋY !3}skd77x sC=FgC9JZ|l3UŮϮ |h6)n">P"ŋaѐl[ H &l^Z|]D<sI(PG#eu1LM %ڐ:~jwowF*ruuZ]6K5:drMaDt ~kYr "+-b C`@ ~"@ 8_s*Oqwp(l.϶A1N<>~׈Fdʎ`OLT1'M$'\R0V⯥ґ&#uq/ۖ^,kK۞8wM>t'DVVG75Ϛ+Ͼ5_\i|ۜ<9g0v*R QBGo* #=gGܓd=ބ晒"9GC@ 8,O}^@p*}>?T:z 7REme,8W$sQqONOq>ƃfr-ofڃ+޽o qe<{$YmYJHqlI !NHqZBPB)B[@ ݸm-umo7v-/eBX8+gqo-yj,Y?ɲM^|_ϣG493g$9럹>SɣH << =5{fŗ3npv8<:' nwsn!%߾G6_J˿.a-G;;<~~mrwˋfkxVs6SzU5΋/4nus C+"=A((96u 6jm}TMV6nJtz] wqn}ܑ͋;;Qld!Zf9?UJm5pWa6wbo:-ŋoӰ WqܚeqojWފo:!~ʮ54WNj;+(β`@DZVT׼62.ybj˻q WGԞY Wʓ H 3u\2tѥtژ0c^_cOn{lGB=ApepS\:fOǴ9LMGWܷ/6}PrEu3)t;93yma.-mV.YK|k,Z8Vɧ}*?-0D]> ;'qfBڱαЬm#}h99$B'B!!( !O2m"z97Huہpϝ߉y ֲԢMȾ-a*ܑ):\ ^u5?<~C$]3[;xO ѓF8H3.OO5  p8j4apd. ArujT}-\b6?ձ;7хômb!;_*KaAF(P81};Op8/jc܉ao/o͹"SkltF@ 7:lyw7]/4^87TsiGrvqn8 sv2PT}S} s =qPcnڹ` ,-7pcV;Z}efV.d׭)nf_[ZFTwcʁ׶̆:[ CxB*X>a) ^S\t8ȱ%/ȏf/cUlo7 Qsl_OwoZeaͼduV?xۭ(kl9|7+tbXc0yNNωa{Cu C2*dvr X3xus;rƯrs?u!7ZthMOG4{gWtc::;xٳ\r6EGيX?ة/Cqe6:\m7?5j_+t:>U0P$T.FQtާ/ >l PO  1Soⳗʞs?5]stK<z-v,~| 뻘{]xobl- 1#Ljb룏c^ Wrs͖k9p>|fTx&V?r~78j帿ȽC pt^fl~ x+dvdx.Luql]# UȀaun jxz;7m5:L3xmf\0HKwM+/`yv{,bug#m#mE '~C߉6 z~lZ/k|i^6bs(E x, Z'+ SB11$B!2H2ܐO2!ҏ%sny0@`붳kK4|5894t3Wqّ` [୎..*hT"FD_fP:>,LZX=Ckz \ߧpGO/B=7lo:HA+GhZ|GL~ ywj*QQMG0k V3Bw&;>sVh-Ckmf znD}ʋì>A[=pω}\h4YV%6rMi9X'tFvzF7W i/A8`iC Vgt<&[HӍ4ӆ]WHTH4o⇉ϷNPnS5 \O|KBy3ODY'BL B I2Ad^AXϷM|6gU,h/~?\<򷿭cmoz8ZSȿ{Cy}]D\3Wi._M,|)(2/RwB[c4ZWL bH,Bdd/b"I56g n;JQy&/maV-N=]WCipI f6oB5oPqp |fƤ3/[˗+ػrtQR1O%vpK9iNx <;*X7 7iٚ3Xxl5Q Ζvs zQ QM}Z? Y 7^;g,GO;7 xᅽue ;4p"D!/ Gߋ6BMgU`sT]kf.v]0qӉhnŧ6{_+h2U3-/R }'h}]p_XW4v4}Η 4bK0L -f,.~w$YMn5*ٕw%&sQB*_vͦ'|c^+? .8{(-yh4J['ȷ.&3PŇ-]6K'ټCa5/ "Tl< |5@k#sWxZkǘ22d6?!X !&Yn'K9IB䕎C|iP=l+fֲ .R: ^j hZu37@:ܵ@t%ļl-B L=̦"WaUGG+jur|ZJ]G9);QozFhsVu۱_Re\2:lF+F໰Y8s)mp3doudvJ,C{#A.p^g{{XP8z ǿ7?WfTpBT 0k1J {rTl&W͡ѽ.]YǘF .5XwGSX8çuE^*ű3}haه?,ސmyhre~?8 -^V\r!{wSB0ӝDb]˱zU)c2N!p/ķr]?Vb,,!v<  &kȶRbb) !"X,%S] y!H_ΤeTa\|s_^xv4m'mTi`# z{z_g4՗sQ{{((.;).}}//+M+X=_`]n{Q?ʓ?Uo}gcQf yupv)(-C.&[W_ԢP`fǮ'0ZkzH2y ~CuDY ?Nl5*}~/(n߿C *n B ZT1}n3{دc)v:u{9?1ae+|ܺm,ǎ/&sрhBYftgE<69"ߡn~W]maqnމ V#ymNC[rן=|Ƀ- zgϩ ylDmf]l!.*d!hiXptu|wNV뷿~A" 9Roa\^m  [&ڎğY@R:$ߏ-Rs YnT)(^=Ed"5+@B!2P2 LeB/:5У9Lh{{F&v۹x.fiA]tݼ>`sFMukm ˦)zY5~#ϯmP\-nX ;gql8Je;ٽn IDAT ~35o|45[Y݄Z4zP8/]|XB'恆1<ǽ;swV½PܔO8h.oWQ=|W!~u]͜a`kX:MC 7IcF7 ((^܋N9߆[P=9b3-fV/:/[džDρ~N:IC10-osVqCUXytY3ot-LDө3 ,C`!"%SLeB7ioRGϷGzu/jsP\nֲX ߼ء)c//lޠ':h4^Z@gfpofid󻘹~rJN!՘g c,zqJ=1ɲÅCנхXfTX ꑽ\#Ӳxb;BL9#xgvxώ =aC}z?=G`&zI_8eef[8;2TNoֲΙO}ClSiߑߍyʣm0~)yy jcua˩%W7cm㗬F^uI$B#C@ !bPB"MIr=[{N e<^(Uy.̅'# R.,81Tp4t0D&_=|w&V>ĎHP#YG{s||6`\r/irv\?;kl\AAs`~4y$F OV?eӺoOk hbLEF/x04l&.5pk m5Γ;lgDBAιVӟ(5qv-ϳf,?,UT]CXSv fD~])9yXq>|H7PHhUnwrHp4=[d,?VsG-?ūc5|HY!#'B-I![Ʀ;'ц.W-+ι*Bx+d B X$x <NS}AP[ zf˙\[M-V[~z9}E*\;GavJ֓x￱. ߯{v Fs3CWE*d7U/(XZJ-apYj|9b#~=I}[Q* AuK[ǡkaڣ=T{پsW;ZyrHh.Z+~+H &;tS T_NSvVzgWޕ7z<01IxI,FJM!B!DK## T?N屡@&*|6)XBG []h,jȐ"$Nౄ6ӗv1/;2N/>ۻwQq,TXv%mtUHaȪ}ҳJq}7 /@ l;s=[dǾ&K4[| l}#7bI !ԐX!pz$cOڞ.Ap2-߷^ø!׳_`}]]Vt Y䪓dMt;^O4>Цpƌn~E9x E,5NtNhTjQnn_۳1gV}<>w099lYcM;XbұĤcM a*a1}Q"DI@m_΂%W^n2]vw&zB5,Ou!B1FT$Jr !2AEUݨ;)txHtz`l;tbfͅ7b27c{*̱GG^!o CNWnbȭ%zvEHS %'sh,J%EKP*7!5229z^#yUFU|6ٌ _fQg9,YŊs<+D"QRoB1B![2M JO#x4CBOU9|G*H?)LNOn6OԱ^YHwע=?4;ۭyyf^yVJec4Ի.g:?>>͖uFݵi S%6:The꺙޿uevb)s-D,?_ȄzO7RgB$B!!G2M J_OŐcN|e<~Ox՝+@ 7YϢv œ*Ae0 >A7Pd.pu.!؍:RߋL&׭B$ B,7Bd _2o!k2=Lu<Ϗ$Td,voQ&%lc7ųsi{i^{@ܕ¥-圙]HyZ*Գ!s},UhVsUNllVzN<J76SSJzB#B!bqO9= &x0x5x$p@Ipigy!4pqo%s1VrcY<1#Sۈ3|˞iij!+/5:ekYȋn?U{ ekSkbAnzCݱwB[ fa_01+IB!DS=HBAڣ̒ s9'q}n$s>Nr2vt],+6l[ҳsk NUJSnYbakqB{4: E^6>PDɴL3-Y_9RԗB$/T@!"Q.WܴB$i2KTyMML>F['P. d.ux<ێզpoUcsǙUas[dC{ ^4nOg+c(}Yf¥Pì+8Tdx^wØ܉dz(1u$!%Mz !$p6(&eN]djD{:L)Әɧ 5@m *U'UekBT|+< be!ܣơ{vPP\pRhLu1F$*6e6Uu)9TՕ1_Xʦ7 }/> \3)υRõfs p&\xG?k~ӭxzTUSfɂB6rkU;MÖvMk"P\ސgz Z"$Uk{.Yt;?ҙԕBX!J^5I !2MnL;u'rNGݓ_o~lՎV¡nV%&Fh5O~޺=j܇9\2}P_q[KިxO;wb4.>xt4/?sXkS ,i(N$ O7$k+RG\ Bidh!B )YTLW9yZ19zXL:qh豔e nC VCC>G~|>Eh8p`{59x\|lZOIZaJ2;]ߧ|!!aMsg\ųӉͱ@vL n9MsD׆BdT@!b<\I;BH%d ٞI`2XhᠣT>md.붓oV$'jT{+5Co O6ѿ=aYSKnqmG!'m7Bgڹ ;CA}]4G&s17; 0Ϥ!wt&{u|ƈO}TV}5+7еQC&9iyk׹zf/{n5PE -G=zB:*p|Nث0􆼓{=kFC;gdANr- != B1dY:Xf!DHնUL xLu=m6pGDe; y383\BZulvhP,jO51|6K8{7a\ KN{t$C/run><3^9_*\8ۋqJެᓅq-/}S_ʛۙ6mϙB$UU N>Odu$D`!BH*δB3AH>Sg⹘!``LS}9wECRXIVeL~ZkYwmr?%g3 ,+Go;!S2h9iǹ9,39U#CϢP顡k9X̒\lU54= vncf:KB6 9Rcu3[9ЭPSjr?+O4Z}|JtXW)(TWo] &g`:Ua*M !DX!#7SB!moΤsr*u{G_bf9qwI6?543/[KkL[wF?KLY8`3hYceZ+Oht5crѡ p/FjǼƴx78rEXC5៻±^N6:8 gaClL" Ż< W73(Ӈy/_ ԑBT@!b2\X,%S] !Ub .W˜)vfp&zEx?N'jܵ ͫ`Ϛ|5sp/\Jޡ=Tz-+&7}oN>󟺉k8olRYl.צ vt7dg!&s!&s@9I0W*"55&G3B!D? bI[+rM 6#ωV|`h2QC!;CŽ%nNɭ;!OkyQ ]7 IDAT'fAtj ѹ|sk'9FpXi M]\?ǖ&s"L" }{C-W͔'J !O`!Bd H^H<9Ra ab^Q`+ ] mn*qOrt|xLoOAvMV+WL#!HO !"!a_92%h3!@&^wjA//P vlnh&_O5 |ZŧO͎/\!Jm4{:pzptc[ 6Cao5x}mdBH_r !DX!GBi`!H&{9dv^{.]artMJoѢ9ޑp3iןP- nr%wVak߮.S x ˀC@ˌ3Гppp~ԏBdX!.4~!2[b807pT:jc2O“~p}? akX'ۿut_8I{=T.6JckhpPjQ(5l|f dwr$K-җ\B9$B!DƓ?&C51)Hrަ~ S{&s!VCo_[\o`g z{},}'sY|ѤCҨniqBK0H}-^˴Z*ba@5U߉L_+%u#E`!BZ:N"v$c.Ap*P `-)'(3p<10p⇰Ϝ]H:~͔̾n`O6u1Rq6Tm*Y҄%z#;[θ'dN GƎ6d7J#עBbB!"=X,%S] % ҆DX,s#X74@7Ltu Y=] hkYXy;~+l-ͯf2i"w\*;/5 XZmt涖F=*\[pttqUd]Jo'XW`dq00θ>fiDW5g}] hCE̅'#CH'68d7J=H!LuB!BL(*Uv2uarn*WO>[4>i;2x>YxWX{FIYfG>zu||:~9mV)޽= ׬~E3^++Ues[K>z.7ܩa#C ] @OHǺl>n]oK-JEii_U~k_>_>}w|\u)Ӗ{:BOB!ĸIG#]K9H!yhіkό/D.9bZ=0hA|Gլ\ۍM7?n7׳ss_g/l |弱-H/=n9goFU| AQx}?)C  9mRF?ή0;<]4\Qkf9o5 0xWry¶z4C@f(_ ʄ7J~N>R'B!B!W>$X !2c"Q2$td;-pˏ$,9\S}9"NmcVnd93vsL­7O쥾:\mr‘9>.l K dKAv{xldM޽Ƿ}$YmYJql'MIt:`- -[18ܷہqa@vckOriR(uzJjdY:ȒeY%[n㡇- [-堛WyaC×dpJN6ljp`n}#SD|ǿvR=7*7 hU2{%>l R #B:&ŪjJ .-K-5 ^[NcA1hs[Iwe<\1#q9c/߹O?q#cqt:<=n=௻ydhWp1zR}Q >uE-|09õ ᘁovx Db _>g(4@|&DfUl3h~iNN;e&w[lhq^Z{;ܴz+~[vn^/^S+}"""(ֿԾJ ǤUc uێ|Mo(0B O=m4855q-|(./$i .K7?>dϋ8u"WpZecrYg7>7ֿgp42;ył\voG?b{];<31'^n%#  [ >|8@$fJ0cc&;8N:763n¶&+:p;g--bG i݌5a+ERT#[DjeR j8W 9#M-u <2:> EN'ouh[^ۿX ]6޵9L( [橰][4n_o](]>:'y̧xspUh[4}n7`| x܄w=gс= 4r7tfoopCgxsCŘttphj3g9o{>CTp+,VH+nR("O2)?T܍j= ts>AӴ@pa/w:{ 5Cw楮]^kc#cA 2]} _4_c9nho=\T0@_NRzܻ98Wٟ;Yn|Y5_ϸ7{ Op6s?#CQpՆi ϰϟxhH>Jk] US}_i?DDd)ZDDDVE% *eXIеLUCBshB?7rsfW!7< Xxs'|G~(=wrc |^1s!Qs\1ra:Lck>B! ^"o?rx#};yЙ;"lįܼ_\*&y;^:~1noʳ=/ેpH?f yfMIm% `i fK9 %gdZlbz9 \I\(UQ/B|OmI=~f2տ/?4/򄸮mK*Tc^0 w;yF̷ӓ#7hs@_x''#]xpLfr[O4qg~b!6X l$~'CH 7<b334a㉉D:msDJoUy_?7_s >Ov^8Fׅ6| <|?o7v^p)l<65^K3O ,N)ʦ,?Ws: !2H`e$>sMP.Gik;;Zҏm~?Gf]u Lfs?[̹B| SUPi_H1Ȫ ^]ӤXK}^v؅aSOp)dࡋaC1bS|`+'286LWu$}gxykgc24t$MUc\s OL$ ̽on'_F= ?y81lq~>}oԋxpnOC >3%o߼\|"y5Wag sGHw }e rcg8s)HKE]ǿJ<͹e_lvӋn0Af0KsdQ3 ɇ3:ouDyg8-/U/,R4UΩJ}!""P,"""nB]ӤXge5L<>dl=~7y8-N>1Х(1hI;5x!9sxLM70ܶm)'[TO|{ C1.ƃhjog;?r0ML?^XGgĿ=֏ٹ vڭ&1xRnlK[XhDz5,s0ޡH޴# vv+c9m?3rFO|+,*EDDdBEPT5'"D4)V TG ]71;ʺI\ Iy Z{a39on043uvNLq /Gdȹc4hs“Ndr0#] _s=ohٖ,n4`_WJ[;h10Na¡KiloaIz< l&9c[NGc"3 6'ͫɁC<\oC6 vX-t33m=l]VOF&<2o]oaH+_l8t!323=svk ~΍ \JG':慿Ij:VY """1<,"kEP!j9pwO:dZCw}"t8^m BA+16SSa=NKc9yσX~Hl3Eڄjp2L]4%bvڂw3S1qys6;F:7njk IDATL0>ia{%6XgnsXEDf\tNpPpIʹw7p>w>UVh?J)5QK7 DDjkRZ au\L}\u\-H2ܺtZ69(of[p$ڌl3!irn'$1]70a.M=Rf곣fOv/'Ԙk0>dĒ3ܤH,Yap>?Os7g<_<h71o[h>=u]N~.&;ABQZ+<1$q@#Maļx%տ<7ZBADDJAz {HuMU!0ιoBdx"zŻeƆ{hrN7"Zh H |z˝r_&hI2w&.OhrNf8ML8ϟ[ Lx6p56O]5΀5Ʊ8TeOZfNMv'^w9g;w~!n]nJo;JӾQr=GG2s~nZp1տ<~WZ(RQ,"""koBa]פX|Xj(ջ7|݉ۃ3<HH? V~q{ r1C%;^0'sFf{ m\80<γQ.޾;m7]H+o1>U؎'O;+SlJ8Ofkij7wpjcL: p)U[ZD@DDJ$r7lHmuMl)wVMχ\~-{.hD'sZID|~'}hzBs>wl#9ܳ1=#<md;࿮vӏ|o[N8p^F^+KW-Isp;D=k394X<'J?},3ĵ}A9 ~ WkڨEDd5hhYS>lhMIjuHh(Pwz(|%oY00 ;G9d `$L\0Ǚm:6moDAs F|;0נq~nxo\؉)w4ph $.e;c|S9t0sm;\|d?u}襱fZ{ҟjkWSX^Y-r7@DDD"Rtmbr@ȵX@*L_B(L ? q޴#w۩\|mʮMU` :L(S~+7p'K(7mEPyvl ƹolqM8Tq3f;[|} ?^njjeW+&UȚS@DjmRZҜvά*u<mP.4T&-\7[њrͬV]*IUf+τ ,_8on)/򒛯K+{d-|NF8~f$flg` \&23׾w_\HBeWKBwo{Wo>_DDV|IEIjyN`(9Q|rUf{l.&ΐ4 FckՋV"{g/ 6cwmm?Ab|4glxqoaFƶwt˿׮;&;fxؗQ9rfEnɋ)En(0輿^˧ڃ(SEDd-XDDDBUbIEMJZN=OU<;΋\70nm7}6;Pĩyi+y.iڊwWp_j|&~qd p67/au7_ks$ v Nc-|<╼iG4/p!Uͥonz5cqSN{YKQu*]ߤ^ +;'[ypf &|GhO=wB6Nnw̟Sp 34 67zpLm Ox#`̯p%yn [8YGxc&Wh~.Mx.fq3ZI0u6>o'Az< loإ8O8g80w+=Tv+z ᜫmgULZWDD$or7?DV&x nD!-L(0B(0#o3|_Om4wf=9:w|mp]p q~&1v'hnbs=|綝݌/&^&ۚ'7ynW9ǓВyGFH޹r łZUrմk]DDE'"RtB)^zK_Kaf{6s{# {_VAiߝ aָgN>O> v]6C1Wo>}Zmyq_|.wk[889pƨmxV yƠϟHϏ157f+&lojyYZ{ +WE]BCZUoT~U EDR(Q7vKԲ|ӊdS\uR KQ~:֠ﹿ.-0oj䇣VGa!2e牉CN$ZS&!S49 \8?8g[0>úv4)v'<`a+}.wH p2vD wqvGK:MUrbB| *-kO}.""$gkP7"RtBx<[݄Usa%R#vjTo(0‰yG26ܛ^6UIhcq~pJ6fh/v'羱)>́wo{ܹ%ιI o|a:g.l 6E4L$-qy;J6srJ NZ>JXDDD*n/N#"N9)Bҭ s M/ -1opxJ75VɞF'h"/}}V)\[or !"NUU<_VBCΜ\ׯ笼^>[wLw;y_?cgn~}Mq5mrzVkh?ז[DDqoI""""x<[݄z,R&bR/+Vas|}tG˥~ aNu΅g؉F^dbl4rwaA{W9Du!'տ kK-""F""""5B7%D^z'* Y%Z(0J9ʨ\a7lϓ77_$~{ o[wl?7ϜNZz)]t UT#[ """P^EHݜPHӟ?TU崒s[ջpَt( d3 i?¸ȹp­x|wp|!^qõ<S9!b= tx9YWT;""R4T<_ ]$Zu(hX8bpy3M?o4Gis{wYhsO%x>?k0u hbÇX= Δw9C@ WBɵ~j!EDDˣ~zRT]\kfrwLxn!OnV;X;{pp<>;wsKWd;/W~S=?@,""@H I. 櫔8Bv9C/I<D988ϟ4h:`L>v g߶%>paQ-8sZj~ZXDDD!|;I.H1_HrwEv8N_toFpܤTr&49W=\sZ'~PMkV/zED(!"5OP05R xy2 }S T"83Mi5*xkίե?ֆYDDj`GʨD'b9z%5t*Խ6.< M:JEYnWG}_K""Rzkd堪!pn#-mNVFC1N;igV k3lmEDV)GzkdR`U_\MJQnhuoкZ?KKn>@DDj`:ziE')\UPJ944τ7 dTn%TV>sHG%W"""XDDD懈]$E֜Rtn7aǠ?4id-?2obCJגΝWIS-RHP,"""UIp/ ()d۱Xz63S/gy<[Jxs9Կ""ROnHuOdN+:31: ް&;-soel7] zKD%w-RH:""""a~NOQ3ԟ"Rot 1zr֏~]]zwdQx. 3u, Flo6-_j5vS&j3~,lÝ{dg9[1ˮ) Wեz `IШ"Rot[clWyh&} j GsOp +?y>p7%Ncý\o W ] \isV=Vz `jZW7շZ.WZUgᛣf]vXh䚦&H,l-fЈ_|H<΁V ۛDpsGI |D\tEo ΫW )2w% 'WVDD*EDDD$'4z^}SЕTAwQ ,ihopJrws;D{ _8 _} ^Ղמeh*Y ې{|m:'VWkL}+"" `Z=[7׵~_|U\6_ _/c;c?a5M_+]kwiջMdFA1Ŷf /o2C[G9j ґM-7ZR ^no)/KQߊ$XDDDD("RtOz^5oq lkT+!J 9{T^dW[׏{<2p[Ϥ@S2M2 Mjɩsgy/^[r O8:|4^j |*HG2CSP V0*]] WUDD$7 -""""EMGa=sUwgfihs֛~ 8ecsɅ{^@dz׶z7o{`C; :dᠥ4DOEDD g+wDDDDi)"u'u#Z׿l)w3jB!?-;794FsFGtqߘƓfMCKq;F  1JP`'wkA ýw]'m8R|ŋQoeQPYzSXDDDjn=+]ҕ]<_4lr;~ W܄fB Ԟ`ofo6?oK]=xv܆×O#a\prwx}% WL(=H4,Ѹ4/+]j_\z[f3SslnN 2NrP 7qV~oջ'f9s=rK<7p1!mS륖0;o٣rl"2U#=p7-tb1GAeii_""""RrZDꕮMCABv;943'ON^G/tM\z2qG=wXW{vZxd^qp?z_TR~89z<w_&$׾T{#rw.=1|?}}[zwv\NB0奠ԟ"""XDDDn3]kYX/# r' s g{rhN3k,|e|3W_ymj`0Loy),-HiihYZDꙮ.xr]'{wYTk"w%ržb~Lv@FsOR` ^4/3YT{9^|sf|Pqsp̫.\+3kk/wڻߛ o[s+-5Y=r7@DDDdCоzU輞R=5`+8]$]0_n7GoU:߶_s;˼j뱹t.R*D(P.5w/ɿox8ldž{:ql(? 9_łL}VwȬFk8NC+|XRDDd)ECBH=5vh(Źc\; o|M3w{ol=Ƿ8yi~!2 BN:s 7o{OA˕w Łќoy9uYPjsdOnBwZ=Wo(, Hyih[jiHӰի.1k[?$Y#zrg7(7||#`,/7Փ7sԣߔN~o7'Ai7vG W^ Ţв4ԏ"""g)wDDDDDuIDꞮI jN=͛,)sCIߥKN;oggwȹl?CJ~ EDDEu~zI|7-G&]`o*ٜ!okBJ8w?l7\S[>>>jQDDh`{g:n*i_H=ӟYR\BQ7s86GWp-.^ <4C,^[xЪ0uܝeT[!ZPDD2)CDCLuxkrArw;c_ǙttО5s0x@Um,3U\LBP?T.""""(T6 ?DDt-&gK}P`d(/l3|k\Us3x}rڻzҿvX+H[;ST>""""R܋ZX-= :w"@?yZ^=%|@/;ozlJ>U._ @}(""R &"jjQ!p7Y;Ilrgog= =0a;DxÛU~HUzP)]J?PDDz(ɠ0:)IUBZɵP`yf|m1p;q3CTX|)>| _)T @}(""R}HP/"ae =Ɔ{=DC&93{w|e|3]0wgGz]P`5|+c}U.m j>N EDDDyuSHRn.w';oR^\n (grνA{vvN{ׁE?RêKo*8&Cfu:<)w#DDDD*iq:=nHiuM@(>)ggocmz`wyl,ҁٲ`0ѝr©J ALӿj>~79PаSFgߛ_Y<\IH2?a)wDDDD*nK$P S+.w'gHȂ򭳘J9KyUQODDXDDDDꂪEDXYj8S*MzTpGAo%T&cDDDj`Ehڣ}*"2GAp8SrBQu刻%Y`g*-˕Q6 -"""=&PDd>]+Z++{x^ ok>FS+P"""O""""RT&"2FI(ZΞ7(.w''M%^)dePwi .WF'""R?@7kxE(0=%jUigHiKQx2?XDDD@ kt],JWblb}ϡHyZ] re"""IsdM24?pTk0=s(0B(0 @{W %J9+=.bNߥPxڳ2?XDDDR}3XDX?U/V%|ol3ҁp!J}Uʱ7JGJ'"""ZDDDD$ *"k|spը.irw/o18y{8#1 U~&?EHt(pЋBg]=4t05x:.w-'ܪ@L|ODDDcu:<)w#DDDDiq:=nHn5rfԶ{?^jGykQ3Ȅlq3]=-G rwr)$M`wmRC1U~?Y` CD$?]#WW)CS!տwlǎ 0;зջM P`99Ћ{s}w8_(JwN%jBD""""R4ԥXOQ^Ϝwlu;o.wr~졝 c_ރ݁݉ݹ1WcVC*SZDDDP7XDDDdT$):DDSE0@I\ecý 7Z^C&-*~SR3Q3$}?i|| -dW?Vj07I+WǸT߽T,"""R"lL:DDd魴8>~-sg}lou(8()(3 #<5ezzt)"EHAB ֖¾ƹ?3gf!(b͞{~7}=F,]^㓧¯1#ƽ6-Thşk';?oQ|~vԣ~Y:>yRJXϼHO  l0_. sg鏗?'ϾO)M [qM+^B }r~w2G4}EzqJiz{uzUmz]Zb % 5q= [GJ":şNCߔͷ~楁7פ%a_O0@fNsn/H]?s~6=yC8Mz< z//N|vݟs3QQGk#]}V3ZϞ9xx ߻8M߽N5$bZ:9[ 1f 0}sAmA%%ӡB P4SL k`")ZtH_؊IEjtzu( к}c,@"#z:ZheN @tч0@W{ (Ѓ 6@`e#@Z!gʐw-e,3IENDB`XaoS-release-4.3.2/xdg/example1.png000066400000000000000000160100761455214672000170350ustar00rootroot00000000000000PNG  IHDRUsBIT|dtEXtSoftwaregnome-screenshot> IDATxwTI^"MҬQ{V׵ om׊Tz#<}啹I&sNr&99qCDDDDDDDDDDDDDD/i/i l"D(,"""""""""""""PXDDDDDDDDDDDDDd&B`M""""""""""""""EDDDDDDDDDDDDD6 l"z̀A:U7sKZsz:8p9N:4~2L_DDDDDDs@c &OQoH${ \~‹[5+:uvlC*1c~/⒡1iCx ,YYgNΝ6zP/[|-""""""ݶpM ں:z|6AUXDDDDDD'mӆs-w{W]{=SM[.t ˥W]ͬYohm[r'p<1_Ƙq㨭e[poϠw0ƬsEDDDDDDZ[n|t.d8u'.~)_͙C]7xUW]uCRDDDDDDgԻw/Oȴ3wc?a/ x^={y\~zvqGIxٽTVN7a"#_%KRYQAEDDDDDg2xA| sC^~U>3iӧ?FeE0""""""<(M8fc Z~V~,'} a֌TUU'<_7da)M&ΛG*YSqa 6뮹t&óN=ʙo[w^k'mSC%%4nnylx]-ezu*CM_=>W^o7pF=݊)0#Hɧӿ ̝Ǟ{_WDDDDDDDDDDD[p:m{õǣsԱ'pGDڇp ر9w]u;3nO޽ֶָo_8dȑ<ʀ=qo ^Qi_s|:lv;/~Աq9|DDDDDDDDDDDdwoeI ?;QåÇqUW[x?wf̙ifyy~+c,Ys@G-sGH~J~O9 2 7x=w@,em{ﺃϧM灇/bSq\yRRZU_aC١!=$:ZV\1m]ֹ\$CO?ȈKq˭୷Y㲣njNbwadҷ} w!~;z>C]z+N:xC$Ydް|O>wO|Si|ȡ<7~S'Om6tڅvUUN:u}eeTs?>C:y>_+no]NWY{+.SO`۳bJnUsN|n.njme曯=UUU="Xƌ/'I'SQ^@AAF奥 p>93ki۶ ˖-n٧`YSZZ|owtg<ܿqjϧ|6:r׿nk=5+~>o˯kuՓO>]ŗ;#?B^=6}/Y.1acxo7ďd{3N`3gl/7]v{ jjj6>s3 ϝ7m&Όz}Z8|5}MPTXy_wߟb]k-m*֬sں:Ï;w.3g r|G VIO5iljwsZe;w7BMMצm_u7:2z4^{rL=v@޽88g)).^^ݸgIdq'M␃o%Ho!HV[ٶ͠djnS444ngf8xk=;n<;#d]& qܱ0w8#?~'<]6̨wW'ϸq9#[嘷Y6'SlݶTHKx /=O6-~nэ:{?.8O=Gi~daL\ZIee3N.;Cq83آ{w=Lx׸lgN1u%fORYi u&r*Kx*^|9>x4/ɧ+`:?[|tjjj(++[:2/a+/3bО{`_{ǂ ~-ՂDoB_מ{8s[gr) k@|6uӦ8%4yoUƌOϞ=+ g3xoAFFs…λʋ /?9_^Mzu>-eZԩ#_Μ?8}}m7-_|q'pu7n5;u'b=lV<L|~}M履)SltGl6m*6}?N;_ʕW_UW^NYx1 /ߞ*7sL W]>}z3vu&~{ia~gX,F<'QQQX6[mśFѭ[W,Y½?߿?vqnN>D1|4>(*.iyf2uc)(,m Nwg%A2b0|T"$ڶiW_#`Mγ+{%|| zI:fl6'Yv]_ I|AUW\ͷe#SVVƼy_ӱcv^KZjۖ*|k3g{ڨTm۶ʫe]w:gc&rroN?ƛ~!D#\}0f8>c***;n<#_}wFKȦl~tN;J62839x'93xgbyW_{2daDGH3~Ա?:F<}|<3wnq}vMqy{pYgEaGh׮+k'C~{H]]:׵Knz|J1s9?4555~]q=TWװۮPQ^|ɟ~ŗ`ҥ\p{/ ]y_y{kvƙ<ϧIg2 kO6R4uU]])}sO3vx>|F+/;o6ӧ7W\6}4->_ήIj3ban"̏NAvE06?x NJQP].7/)rBTTD0=?;/5gmGǿw7j}{5:UC7˯qbnw>͑w惙[ cs!uŤ\rЭux=#l}H?SZRuuyw$= 'jcMAEqEeErY+2BPh&d{C` 1Ḑq<2RY i2?-Ap׀g a[ lN#tƐJC1TRC:!B:kH;u `Xz 2g DChaC, 0xC<D (ѐl$#lχm`\ {8v ,$!D& 4)?' ޓ1v G m<[!ja (c-ƱDm lCHn0- d|gse$GnHfHf Hf OeO;Ie ֟LAb<a Y^0!?EB1=ߗp_O8!/m[k[c r J1y;<^*+$R!#Hg<2?fE>{Mq<|znÒ G ȝmWL= !bn:8qL4v,SKSg9|Cc"KUy>鐥]It:Âef}e 5 ",튲t*RU%jgI68,uYȸƣ4Ry=<#$ԥzmAaʢP_Ⱥp 5)28jQ3T,JeY=MMڢ:cSitlضMaԦ9_Nu44$ѐ$4%=)f=2)?͎n߶9}m~ښ q$AzXU9@SO{CF R~t߳D¿H$=2fzp ;o<[0qA+$,m 3.һ,Ch K̭06͒Dd:Cd e eĽ,踬L;̸tmFAr κL֐LCS1҆t֐q_,]!xPkQx11-Ce(0?f[uz5) ),X$\&'Hau,l"l,b!xȢж(XqQآ0l(DlCضmU3-\CڵH:!54fMY˯ ɬN%M1l#5DH C,lY, Ch|i4ma.m_vs=ܶM `VE)Eb{b6 jnYώ3A_ʁ܆riHdsr]S0@:3iNot\7+3A[c} ڦr} kΟ A8muAp[m^̧ ]Z >mNxv _?<ם\lP]'՜ N ڛS=h<=3M kA۟׌oڦIL5_ӤA ^<2+b²JgnSvhQq@ YoXs<Ț`r1 tNsX-AZ.ö+i~ @f(lZ|^PdB~S6g ^wMMuփgdsκ6į{NPAZlo+`!;P~R[L˽/f[뷛ב ʌ SPxZV[N܇SwMu^~\x,jױ!,^)njf6mx2=pهw< j٪gwBbhǟ]Y|%,͝?ȣ;o:p{:k6+gYjC[ie3rJWNe3[-gȕsQ^|ۣK#mw.S,)c{p>}:useNdx}O>p [eɼػ%V¤E:av"Щ7 d))PYl h &(xT{E],ȸ$]j.I8!̸4f]Y .]b!' z$]?8DŽpV2jFl!? :yI!2Z;dD 0i #~8b]XEc\iµ,,"%qCiEIP5F-b!x1d=C5$҆Ƭ>mX4 iC4VyvȿyqCaNbQ":fq1?]:Ԅ .4P,ڌ64mB3YY\ 0Pւ LP6 ̏KhF":IAe&ރ:jBMf>oۆrE3Ydm9&h%q;ר b Q#lAtB1A>m YCMjSP2ԦN YCC:H{ )\ m&~-{Hn\&"P>;ê ,M"|tmLAca.Q&hH |T&vIC5Y??~,n̾1myJlCIP"1CyPҸxW :-ǐ_Bp]] ?@Ɣ :;e! Y Zf +P2LCMPdOdYHQCAPX`(AqP"CIb,&cl1"(t<ߤVd.IV&Y-3VR\ȩrVLOxa[ە6OpN{.:g[^]֪ba3^:ɇSP:enY"#)IƏK OmΈKQ0 fמm(Ehg JUbjI. ;{O ٢h tFi߅e%,YƢ* &Zz\w*Nöݯ#v,glJ>~Cv#?s=n:z|c mD;e< <mL CC¯C5d#+tYÂ[SZ% Ϣɵ"6)"Yd= \ cYlhؿ.ZXM:_"L;3e=~l[~Gˆѐ߆zC"ާ3.l<brͤ%,J -b-,o1/1|1٦61Ii8l>YlL ;ng;ÎaG5RC tvٳ*/ҌCv*)4AzMG9xi,gGm,ū,gVwp'&ݼ2r7m8W92AZ-ù|ziκ~2Np wL~~օL8W: inlEe/lwJ炽́`Z8 2*N2c_eϾm2IaH &v ʆ\^cwZA-?!yx-?pn چsA\P8\j[zswa^%0Am6=g:|B| 8zsU-{|oAP8`5ߥ(bY-ݪu{0;sNUݽWuK}%˖dI^e !f3 K2dB2=03&aY 6`weIՒjz{m9 󤞧Tコn-y??K$>3b*b1EUlAIq/~;Am: t)8Ǡ#IŒ`_~SlJM hrͪPu0<|Ŭbb cFbNŌȇS=fvEK#z:?x:ϺU/2먑G.U%x'O&}$ϴf㮸g\lgvΛ|W:YH>s:ϩzc\{|-qJt-cxi=+SgqfHz'_|;Dg D/\n{uxUᲣ[zK7Z~u++]۹ jG˱ ~etW`ʒn=x "mp &(z+1]O4vX+""^Lɉȉ(hE#9Wi,qS+1ѧ0޼`Xe}d+ 7# |%h"h AKiyORI:Yؠ IDATz.$%O9z V,hDZF(i*I %j|NR*jg^U0ԂKB3H+jTW}Ap3a(cVQ.B%/E,煆S9 =W!Lѝ"I0 Dao3Uܭ@=py"C2& D:A :v9kep|&gvףăe@hdt"qH9( !k+%4,+3D0 XP*OʶkF4${8Lk s=u]`//44`h`NoG!/9@h5U'2s5Zm4wcSq(lA9)b z08՞~\0s&&" &b`,0uۺ4L6M@ jMAw$vҀg7B)AAr]Ў9 O[ ֡\cIwgD醁 _PkB4/+._ A.nF@0 FۂW}uB;׸1ꂝ/x 7]r ŜOkyq6fvfa nx|1"߽{rsκ-:+{^.z>ao;sogvp<#`vVs/llŀgW8gk[n{(|y#*緯)R,WY7(+cfw<#╽!XCmb$>E_(NqhLE,s@D_GL F8v2Vˈ91}ňh1#S1ALI*\*J.*cE+zhy@A@Q@H(QF#jp?p|Q1L#7LTw_DpϒKf:L: ]βK:; ҡr:a(yI'\u`+yb2c??A˚_f1?x8;<ԏ9>sonZ,)Brnr""=մA$)Њ IU4zQP/ ^MT H!0T<g*Oa8^p+Ȁ][&2'Kׂһ?#UVISy'=aL2W$j4Hpd,{8qZy{Ujlodղa{߱H+,\SNU[{h8t2U[٬nL>6Wb)80Kk)(!Ѫ X$Ѣ~ptE.JQKaoZ`;2 TjdFg;%SMق0_ZGP(mbqD:T>*}1U):[?9fR/sqU5Tt)LYjq=" ^G`JLw{秝C'Z[E#G=13n:*~D͖@aJěAk`&jB؆~_ϡZ"g^&LJCvSj HK98;bm67c+Ă1AE}\'fw*3rZgqX9|8-!2ed "DWr+BZ ?Ŷm0׭b/Cf;^]sC̻|(jm7:(^{z0nhxw)z;?gλKo|/?S~<';xmsT9+v{?=4F^3c/j^k(zyp>c<.ʳ3~ǹMwEW4%j(pn@OqN`̇ЃrI[)(rRۢOcaD-݈Qv#JNGDk܈cQ/Oj[p!g + vxQK jsmI@*\״S0P-%hIA8VF r#g$edJRԔVה%$%%nNRQt$]yAgARkZ}+A4|mz @P@S$pg+4Λ"6 UiZ\'A3ZE֕-tlc]1)_ConNCmUm,sН঒,5!M4aeVq߀DQێHՆbV :yZj[Xeԑ}-V(Pڶ5 C5N9Ҡw20vʾT_ZhB߷zXxZisyil2dE/FBcU M"Uմ1FI x2 Nbmۮ/o΂TKz9A9륌7)@&N#xPHb:q"/)If%}VemXK<&EmtdS0Yv]Nœ\!k;;L)taT$b{:$3:5HIΓ,]-#mܝSt{JNÅviۑ /o̼. Y]7,Ux0< ^^qyKb: [{"VT7R㧃 ɚ69{XlǿEOn>[~/8#bz^zM߆~Y:_˖ +q=l.{7]?r .y?'_gt_DS}QORl=qGc93ygݮ4+os6O'1.ibbXx4X&*qзm-µKYY-#-+5<0eaiq ."Ŷq] 4֭K"oMʶij#1m"堤D6OJ 8bܹ:v6n]=.' X!ҹڢTT<:)#3@I۴<͗rwq`݀NdKţC: gnMMU ޲Xp8]<v=ťg+UJ~wvթDudϫ-;Υ-eƟrhl/Kp:+VG iD[7,z?qgƕ> nU@9dDl%`Y?a&칄 9q6u}S{w޲jۯms&gϡ .z\:+CC9So %W84ú-fx.'N4aw%28p2ZwV/!|E%T_Aܙm=9!|D 81P2J%]]QZ\ , 'M,cG_k>]*[27aIr!-5%Y鷘(06fXV1olJe~!V+W8V͚BN @$stLuiĶI7y[} 1ER+d m``j}^aTzvqzsΛ_kUZL`*n"?CS56UZ&`{ 'H+- % Jh8f&6^ [ ,Jͪe.h%AXTO&$q4ǰT |XJ2W [aoqoT2`VUFlzeտNNᰁv3SU)vIӾ*߰39sK{|g7#[$"|F 'v*U*e+wB$VOʀD%M+Vхu}|A؆(2Qv}̶xmQ(th5% hKDFـуy9%CÂSà|E_Y1Kq~(K1x%#8y"%ǂ5O>3u.ORVky0~s.Y+[y9+wl#ذo,hsK/4_jsGizuϋw^G}ZQ8~eK=*Md[04&}r߶ȾoTCa6EIƸ-Iۗ7\U^ 3\A_Ny}#- Zlm^[̦пC@fn4u".{DŽłP>Z>UcGt`Զ墾>wڷAWQYX41Y}=<9Vc$JjIOQ2$h<". :bi;vk-I)&h5t8Rךa2Lwz9T VwHft8tw| 4Zegw ]R*:(+ƛ7- ,zUT ^L׎- ^;.l<7mŢ1,V,F1{Ol?s߳h م^# TK7w ?/\F|xƷ$|CL-CëSY`1|*1{v_{-W_zNO=ԁ#?`qեkO#duk)NL׏rv>Y|K~: ۿxi۟͏MO3߻?s/ <ָ~bYy>x%F ϡifAV]kbn^ũ~usI_U1;G/[|aVt:!לPo}] F;]!u`*Onx-is-ae<~tqfdꐓ3*%Ȋ†˲Y?l~vv}ݍiK]Oi9-~mZymGq#c2fsɹvJf _%Š F 767BߤY D7zzVd&`H*2-;H>M -x:X -pz>U;)Zj0@FYNBm2# 3ެ- T&ul?űT)9p[H*Xɜ*}S pl{4 n% $@4s2a26nHEzVkK(VЉ5;$D B>&HDL_G)is 28Utooڥ+1tde7}3`i*]:0c<*6yC/\<+/1 o z|Z%>+gwɝW2(r]C-&T|zȁ 2{=.T΢yY9Yr7^۷nϛ~ƽinG~?yiw{7= ãbe(? #B޿FI\*hQp9kQfzjƶoaT%JԪ6ۿduC8\SvzRkjkZl'g9'SML 0u247n/x[4LShKC(>o~څH$պT _uef39z$׏N*jj{8|2|xi{8=בEA|z?_8۸+$> 8T33U~oB̖|aي.lQz|Omnj\3߹M;Öt;]ܲȟK27}u>xm3G(9uvl#/qaffȱS˙vϑA{JgQTPlgӱ(197ffGĜޘΈb.&bF1C1qStcBLGNDQJ6ZKu|b.^LN-F H.ҋc=I}K\g䣬729#ciX~c;B+m`}o J["e 8QۖT6D䊴 D)DZER"*0ӂ~CNay3d=k)<6 LQI4՜Kvw( zmGפ^ JLBb(d_٬,,z[ кڜgo68D*erYqD@X?4oij.:M{=o*_S 5s7VAjepۼ2{g}5uk3 V_@Јu_-6c, ~RS )[z0E _;"=,9(2~)Uvl}!$t9q6x%E֭sGgl>ԚYpl9ˌbEhS N rBSX㺂C.ҢWN q~XV,}^j:o\Up 4+v+Ys̘zĖ/xxse~`uWj=!I~Ws6p9|cq3YT`xףSsAwp!'+ػ{MA䳦O h<}f?n^bI_v\gވj!JGOK;,t}^ymD3E޹]Pcvܑ|: >ls,Ysx6g )1N@IJfwK|_22ek\KXl?,}3gV_e B$O)h>xszg6?#6O=s#5?b24cEsb@vJyAg^JQ' %W7A+_7[I$-}қ})wƇALY :WonU258Gw dj%QbMOm0fUV$VZS8:9ѓHB}rh`hmdB1KwZsY(_m;::7$UZ(mT2я6Uηe. xkQfcvIe,,U>"UqS'Mo3?5ǼϪ}LSfng D gs/Q*KavAc[[%8f0FAA>Rx1 !V-c!u OA,qN,D(-i6L?H9ouUCQvˡ0#dt Yv pE)rġ''b>pf O|b ƛ**5|_`:٤!Rbd\SnDq{$ken+;ꮘW^LgM滑Wu4g_j?ZGi׋,Upbq!V,Tsl&8rx8w#C>1YOᥟǏ?y3 -gwqY{=j{X˰%̝*|||+"k?ƗcUY|b›>䋺5׳o~ _/qt{Yp^ ~=j$΋kC=Cǎrs{}G\žWSn៬gH쎐Jg+.,,_ί졻ЌN6NHfT@r"TAS0)[ֶ>S N:0W8ŘBL!bTQ#F )qnr p\-^E8oZB Z=e4R!s r@͜NY  l`#\"q.n-/8~+.G88RK_84d,RҖw({B .eGNs1$FZjy2WA龲06R;`|7U967_[~5[F ڡj/S;W}ȧD7q+_Ӂ. =څNר]mj(tLB Mߤ;Z3Vк\$ϾAj$cFu=C9k̵I)/[H^5~kl' 8}[-4F+ߜm-]XOB^W p1 }k#S$6 __?,pmo;c4*- N>xWÑ`$@+Cm؊XN:f}\]hmⲠh0ž[VBopD%%Pr$]IoN_eI_YS_s>m)0w&hj[o UtD$-bJ]]rQ֢ފPKs_7 w9н[3|ȏOs?=+/[s;OS O eB#ꋹ?%b۱CNCPf?/o՗wWjٙI.Ct _?<[0~1x[򬞐|¶og2l. b(i9w ]n&c^X\7G>aృ6Vz ?g@)qV>< Y1G{Iva|#Oo|xq6=7_]kX2[^KЪzj ~CtϾ[R{m8x/81_TK΋ELT,^= uJlWX32c?W Oz{&ZhA!68A7j7 cN7`Zi"[Ы]< uOv!R(~kgLŻX%U @, 2&q^i8S R9n7 ~P5 z8g@gnculH HKf6tTgc |t7Q#*L3cZ8"A jMaNAT%t6ho-r!2Q6JA\m@';T'D"2u*S*99sJGY54{h{?+MQaK=P[F=pQmAK$9ǡIrCKZ-I)X=sN0Ru!Q{M:#+7I9eWqWfٙ1qW{~}ۼq}O+cy,.]ڋ/ϟXQײՙ bQguxjlrw\*kU}:7 M744 AEqD,ʝGG1aQ# "9 sg YN3{ݟ];z{~r\ӫ:hΆUg*`N: ޼ -3\u=NE{̞ڐieO X5K>w?_b]cUye ,x no}^aAvI2 |xT'4X=\RN)|#<_exwX/xm+^<먿ދ™rl-14}ޝK0y1_x\8xQJ!v`|ó{v/O>Ԟg9cj{^^d'q]cBy b#xZKĻ#β;J*O;,cVR9`X֯}Kgʏyf[FR+U[_8{-DQ+_=Q lwR=嶫EfxAf1Kf$b%Op3 +^v[%N$/#l4+]Tμ$,ӯOC'$K PJqph;xl{+IMw$S9`[Ue(AWY{ˊ=VlY/E;y!Rm>M͘ 4f(*)UEcߠf;-+}(bÎ%}eSxG%zUsC[904ĂuЄfh\3\׌Xjp:3lOZ\6.Y%voD\We\O0Q5#BG7uGL&cf¬O%l)fitJX9fhD]<]o=0gO4Vqw5VP~gư )_ 5Ŵuud%Ol[ڍkgF'e0<D=[3T P"+9:іXK**v(H8X(kwa_O:4Eb̂dIAڨ `%[X]k . ; 6Z{͘l󊲝[q43pϐ~-9"΀_AI!Wb.[39 ha̽^[Bd]!-{[jw,a^+"Y?+ee3兊 0۱qO q V;#bNvL-Ž*_h&vMAbc 7+b1df>7-܌sY+ Md۱z[o,Y۲V>k72rq>IGHr"XlH [:amXi4[_XEXHaY|ķs’ƻt *r9$rPa=mq-~5"QhJ@zC1^ĔzN͜7D8KFK.ޮec<#Cs^D_%fSmaxy+<V7l0<}O V$ܽ&-dV޳#:bzĆUݛR RZ<?#HC_?e5䵆Mq09 _FYz~vOꜹ<2Y ,S;+6ɫ-9\ui$oKbl8c|7" Tap?>y'^⫌=cb#l^*ǞXiyaV6`LIy6Yd/>„LKQY@eCkM>My g<5*HDI[mE'ROɵcnu( ڠ+m( 8aezL3 v'fYY2%ȃЬ=wj󊕜ƂI8c"yA{1hϠAG@g 85)c 4BG9S$/ݕ'${>򋽘,_SQ9D5¶ N'ߦ:[>QVgpc0KJ)HmG("%Cg>)I\i'zJ:G:_E?~<&*FQMXQ4Cxq' Yf֖a>L *cH0$2Y%Q;4{4+vÎģ|ԘR\P%b/=y ßU7ֹd{T²#;W^O..=8e{hT74:8 ꆄ &{oҐDQn?eXѾO9[g/aai5=s_y7>wRo]µQ뢐ˎ+FY%67Qo ĕϼx| Oyg8~5pzc2pNJXLWs㖍3ffòcwۖ19綐@'u'X`){M@唟ӸX yl &kn<;g/ώ>}3zOnd+q¯֭DGl}jJ-eB^ڠUFں1RͼيbM+ a my6N=QEkugCP賍U^peʍ>RvxQ5B΋ $^~hSmQL}}ł//)a8uB̒q˷$R+TҔ}PX@kD$R2֟EKA[+R@Ϸv \~ee%ijNy#cXF&I,K+7fb#FI%"V Zt(7y*J=tFeRЩEvUZƄ;̋t)uO0ܳoYTP6PF(CE)P d] %]v_/5l\5ps o̩ľ"eC SXoK?,C)6z٨𫌀L%eE0CV W-TlvUlגghzmLh{?z Xq׫6(JbSfp7ӞaZO´1X=;g]*ϩ˚v0bL_)'sĪD9Mi/7Qv^mdTLBKr/1RcYF!K0¾b ]':8ٜ2^7 8}X.W?W:R۝\#=ɏFљlA. m &P052Ԫ%; 8|"oܝchCqg_Ȫoqnxɜ}Æ u1G5\Džcҗogg믯"cgpM<Ṵz,xz~{ L탞w"vh)Gib M*J0 87I Jd_j@{٠!qR2:\{j\I[8U y!N_ 1c Nu$mR4V.0C.zֆH@Q 2ĩg@0yVtqvo_#XN:8Tk4so,䛳9p ĄTX,{- j]SΓ⛬H=&M2 @2%؀D\ZY]Tdrd3Y4|W4^ % (Bؔ Ue$ʩbG ͆نmXTH%[QSTl=3A [5 eQ fj%Ĭ-1 ٥a㶔ѭR[<#oQl>>i!A1TڛS?'u-|*\amc0k/• #Vv1{T^J虩X:'ⶭ0N@uEmg{~%=e)§*|g {5FPy^^+0?iۏƧi)wrDƼuȏ.+1: ~(y3?;Gڕ}猲ƚ1Sl01'] YC͂WRmhV=Fښ]9S3ZN c˃)5CE)h+QȰ Tu0]mRy+y;54,UO1%FشH0)>-( +9CC`nCP`j%TTv%7NFƟ%><.\`:EL xjh}\ukǗ&pfOV~xqe۸ ?žy6 gLc)o; 58_Cv1Ld-C=qȁ X<9=ܝS'=x^fFs>I<`͋v$7M3lac7&=+ۼq=<>}Q)eߕ2ބqH[0K3QP;`|"dť D(VboXu- F)0 4)e`A`#or/62X- c䔵RϽT*Azx ,`5k{3P`[o ۹0ЅvPK)7c`[u[a'hAk0yqf.FCYo_  6T!CΘ.Y}+ȀB)a'nR9]=4٩ +M_v`m.c;Z "/P8Y v= 7pܤJ ,}mw-.z&3.P(p$Ko\^jLk+(ՊP$>IR4e %cp,%oWPTR)6Ĭ`U̮x {{=g崩P;gJ",KjZv p.ƟӰ:7߯x{{aG#XYlo~E+)9-=IRf+kأZ.7{&c ~v18L68|_&&F93_}cE[sA9_ċk|cϣY;]PgkOgr#p}Ņ?%/};Uo?MEl4:b OqYsG}|ϦGȃ8W4ǥ|K?dqzue'Mkɥ} d< 9 ]v!?;1) Ç%e{{?v`Fo:Ś'?Mp[k<=␞({ о!Y X5 CuŬ~łٚ c-ͱfV̊./`ÈwjYCnE54Jx KѾXՔbt2C 9=t֔p%%aRyQ[@( w4D1˔Jvh)E"MUxzN%4XZ?PXϲ~Üa+mvVpMQ_'ԕY&1beEJkX`U b/g}9kg?g|g _!Žce3dek@m+Mǹ_J\r]gQ^ɤxLŨ?6LpDQ6aB)NjmCY+ʶ@5F@tǹܞ^+LYoi!\fu TA"K-RƂX_YC,un*Is1ԕu(EGXNq,L4IhPcw&l/ L_%VP޽|_`#{ L"#4X=uXOXsVS@:o9&K*_R4E ~5_Nti&k#Pϋ5 7 C-oh G 3E)z5t{gQO_6 CMXY毱_=+L=wyGoI,ʁHCmniFZDl ROmT-Ttv(p+P2gC=a}|7|u8(v\Fd '3Sio:'أg5]'n&?srȺߏp<ξnY}ͽ*:k0KU>됙%f{! =}5*w?E"L ێdcQˆWxʢ9ƍ!k Y!rkY"x>)!`ɵ[T_ =*ˍei;E&Ӝ&S%LLNSUP3T$nZ7}[ǒ V}OE~-}R<^в )C+esǒƁRrmiSJ}b#jҋI\"llkf4J<IjL .k↑2vFa~fȕ]^`ON,y>c-Qq*Eo* aSVi&A RB#  ߷۾&cS;B3ţW伜2>0P} 6q nyubg,Kd!v38!RRdž7lj<22%Z|Q[RڠK /1x4Z|-e:oI% A`PGUiJ~ә|J/NYo[1wD%vR,Seu4RD b%6ƲZՒ(G\[HJ;߿y_4{0MMqqbEءVV̟e:Lf~[G؞S "&iyyl1SN_ ۔?tifNsq=3؅,[msgX {sWo>pެJTœ˔{vyC(۬NXФ\.3\*u _|8[osyGN[z֣wv.:fof`Fv{|+>7|ky[̊0gtgO#: >9hon^-_=/odi=>2+዗(7j2!.<ռaQHWG?=|lc7^rn9Ɲ1<ƞkӦ$i&cKۮ{]ۇ:ζqmbqY3|~eγx'g$Op p=dL8Xz擸'_aC|S9l(6*< b| Qu3y^Ï`)/MnXW4ߞ]}3ѳپcdk?3+e7/dгS4o8{>w==yˇ9lc8![= %o-=_<;ۃƮ ܰ)+6)gYz1G3*m!ޔ!g.Q1 @Cʢleی622i_eTJJxjm%RE+Q47OiV"rFk =E)TKZY|m;*R&yf뤟y ݄ɞ/~%Oy[2P 0?M,!=SQSooɤ5B0 N#b(FXkE+UĞc*/>.)RYdz%qJGBa}b"IqYX-9M6{m'4REmcT%ǐ%(+eiK϶.YNQ^UVlr_n3ŧpS6rV$Э[ m2u^x;\1\UdDiI XP5.]3 i>nTn2^r̀j?bldoxڧB%Jwn]_W-CwYmIZvw}k_q'o]o*&0sb5x|ZQ*cbj( `]4`)~+QđNT˸,J, o>ՎuL-|KMxECM`C3jhn*z;}]n; ag gIێDbt=5Eo5͜0{hSK 7#^xyGzJc13z:EN:hVr"dMK yeb6_dVW8tvr0[׬/O_{_/v2wߺQK_W2w EN8~4cNbeI5mk6 }%O)%^nyzѮŦ3V7aeN"}D,/yvD;oԂcs J"*uR8-:=y{]ܙmI"z'lǞͱyo6?XK2>* d8e;+ʉ3J\ʹJ .2&͹))++D1Bgr,WyJ<^&r Zηklj&G"!) IDAT=M{hQ#AM;25H3֌cMx[DS VSM)񤿩7V^Z%${?;o5qjCBkiH؎?>LMP08[ޘemJ]SzjvjO=jj[[0I1N18ˬ{GtJk;_k|-Îz'77.fS>Vv[^Pٸ{aK2tvFN>oZ\a^_'!%޷;ŗ&rmr+| =!Jh ٟշk;=9-]xtN穕eʿ3gկگ=k*fկgK.G\:S2gy GJm^4JJbTB+H9j UiƔ%H]r!AǰuP##f 8&QGm-mW;0IثIUhl=3ؑ=wJTP*ƨh2SIj:MAb zǖl/2qT<ƂnEY֓A. u/&m4(R-wr[ 扴jߝA_ _V+'oh-e/9EN/P*#@g2ڱH^mgݴ ʤEzyi޲Y@ .l*p璈 1::;4vC| \q"~~RWf=*eͩjV!|a?& 4~A3W3}v>Y}tT|6wLjfu*W2U,*R"#l"0}Aى5A 2TRpS[2`z$H%640VS++j%M<*N[ɖz( fh'SDgX[`[) B %$$Yd%ڡ@F-ڢ,~GQkJVIOhFHJHmH,.d] w ; ZA`fuzz##Jz2 &R%="r$S0x* V|W° NE%@'pkKC+u<Bcmo[ n) #R$" o_BU *W @1P ^OtORE޶.)+ҁ '`RE~Ղ0PsCY?mOUTfdn/t*5 myUH]3,vwH]e ǸjqC!>tX9t 0D ~oA_]h|_|g/{er^;̧~NWqy.2xvT 5599Sƶq2Gn<p+? ͙Lԃ'xhdeh&)ps .e@-Y^YQ 8#*PBkCFc$ 6],hăֈBau8{mls0DZ/:+B8꛻J`H2-p!gn7o5)ĵ뉙eHu&/حE)^N*31 Hk@-%OK,+E)(fE2Nrپݔ|@k|vq)؈D+zeE>ntPϏK|n7֝!>_>Įÿޡy=mmɹ/z%W\+WhNd /ߖ̀7 ^~'s>H4ۊY=]5MojCF=DZb@)Fl|$?TLY2bIboD$ b`3/&D93gkEP̪ÐZXc%]"sR+Zn)_ޣ,0lp&g>u.$i@탫<h$Xg;+5@.rR).8@SHVd&e\Qx?Y#iȀT"3rJ;9#߯ߘ9b&m ̛U6v2˔Tzs|Gq#:0Kv8c&ҲjtvV%;}@.Lplx͚>, X`kd!H29@JB{F$}DW"TƤ2>vCMk]mEQsg=.ygȎˎmt'p!~ߡ*ﬦ= 4\~9U oO;Op錮x?K& =>uQZuK 6),:pfF{`Wk^ȏ&s.?nm2z?oo_e k.>U-F&8HO5xlMs+QbS`_\g?9mz} @/mװ{h孼̗{W*/a[Ġ{;[&xEᶧKgN5<59E̘%YȎɗarqW6}0 2}vxEs>T=)s [Qb'>~%ÿVEhS3<3 AC1dվBVB]ʼn&%hd䨔OgPx@#,Dѹ'mZR=.у]uUO$5ֶmUQx)&I@ w"*ܽ)MBY"?jIDC$I?{yE[+JmGk,>aIV?b`DZJV#+<0U$RYܭ>csK~$0"O{`<w}h;nccFe+m1Ceρ`Bl(JXkЄԫGd(zlu޶4Ri)-C a$cȾ) ڎ-=ioR #?MQR : ZQU/REOdƥMCE2\$DѶͶB4s)V$o^#0thmZ 'B D+b-*_zDP+@G:*RP-C%^#ʣa4p 5Cf8DJ%*:]eEOU۩Aw ղ\o]˄140VvPM=%Ncc ~g7\TͮM )"RLOHbxӰw00ahK~{!˒;"O6JT9}.;.MV}j9 r-k;V(Uþ=Megu8dߙ<>4t|]Ax.bŵ7Py5~X{nT*vtvZr}\,80 ۴,mē(|/Gѐ ]̆[gqa#f9魗ofW`C\/2},fsǖMjy',`ɢE|{\s%g0دs]{߽4 o?;d/KcWaͬ{Q*A9#pWvrY̯ o} 'ntb^ʏœϦ͛]?aNEs|b|vxl߫P.)M$ [' ;)0rջد{7}e;ߒ). k`8$8&FnI)htM5XSHJ`;&!NtwFl.hwr =2ފ$ T M뗱-7&Ct}KfrH}7~ņ?WpN$:yn8S/rF7zdW{+1K{f,K$,;^76ӿ[x|7cwƶ>; _u%K>ߘhVB<6鍙] b^H/*%Cgh5mPb C>`^d\G+c;l6 tl,ծ k$v:7 rî;1"Y`7V.2ЪȪ Z]W28xUi 2/`m<&#`CֵhjY13BamAA`uv}Z_2R>_E64BMr{2'$}.jUHZk8A82Y/i~%HWZg2+2v]n_ι'2Iɴ|'aJ>q?}<:[kN~g6Ҳ:sJKDr\*$)pM8,;i`>=HSC+qۡ2 , ຀?+n0i5Y8@{,IϱM?~V.yJ=^ dUtMTj^v$Xc EkR:\&4U̚ȪNŝEkv5㓚=k|Gxݡ;|O(}|ދý_:C[nD9I<O-x!7qtLnw ϻ|wtF& |^q0ɧ~ 33 sh_HowLQs+g?7 7>G{6R>ܭ3sy277r`#ڄUOQ IDATw8FMx]K?`Pc Gt򭎀++My ƺF8a66y;MbgϚ䖇'^ҢV5@TGqϽ`c>򝄸nkkNɊk }ՄZq_;#1f{6ƞ2\=b ibE֚f-(ITc40% UHI˗()7@9Т`ɶ{:@΂gx:MxJ1JEƳJ(ꫴKBEPt2ZJ59_O; @-mG+4|E@=f J@/uT\_IadDeiAo#z[NO(Ig Oį7Med]T W[*`=/yG8nԩF$njQ>fo( TzN+?!HB| Z}x[d*ni~K@y}ĤB)lњsqohv\ob^I`e+KmY[ju]T6LM$-ޚ^xhcGp1YwCƉkzY/@QN2Pxv@UR4ꓛWwɃtҢ>A( z)Jpd_b U*wc[2p7HTKmQIuQ Rd`l3v V_?qz l٦5/n_7 =;Bu7~yyy)p1kEy2| üjcs~9W}ˬz.E}v{l~chHSP,aLx~4aʊ}w]w)+P]EO˜hJqli'z2;fabRi >]b\W-/9Lc0\АHF.H;31ݟmlbt}$O *}[+[O QvLҼ/J8Ā5#D&HN" aM[$$zƶS)BX o_m4ô4_M˾z=77)$o8N5koE3 ,84xGJ 6'mc9zM|ZKCGx73Ŭ#kBnJמ|FM]'7 -x0ziu|A"܄Dldu']drϊ6pyQ@ $w;,ir\ϼ$l&28`%ÑAO*me}_֕Qi{1TFMI.r6wHwROSDZ+Qj0:DuCICICaۢ eZ ZQOiȣ^h6=>ofS1>px<{2?gNrK8,c0>:ox{%?:֯ذav-q5w 7_^W2n^sTWw%mO-x+9|Rdu7ٻm3?0[<2p֌9k yd s:!5yte/by&յew4}|._^d2\u_35b8o/ʐXI.*ɒaUN=?Xv~u]F;g6< 0J 7Gb a-*/s[Tfڱ|vc$_ ER;wm(2Y{V7} <鋄wsvllq"ܴE8MFO4tƛ"?ޒD ym-~.⤓ &X1*"@ [b%RٓM C;Uv^EZΒ*]5EW:kvToGJ<#cmz 2Tβ);5}ZoMErVJY/d),瞧+j+莂RXHۚfk&BM;bU4UAf!hbZQP#ad`=&xYI0T c{[⠞"ܽ/yyqǵ?Y*oF#5 쾄QgamdQ.:dy%rgyּ]ӿ3Fi1N{×X}|~|nS~} oFo<%xz8gɌ΄1B.:ug3u%=cu}5wx3R:سsx2>w>AMw).o1{ B_{Cf/;wo\vn7h a7gO~y槿ɳxOzGh<eykMqq#H1V<5щ8o1w3QYq>0A;G5=('c)q#!X4Zr? > ,YA4s;s,řlBI0lv&et2WtIL:MD֩eҠ6AgPKR%N b2${$.ggG#R;~NXڰuD6aͱHwU IT&!7빀4`R0J`O^g90oNSnRgw8F,{d`z{ؤMHLɔ-#c%eb+ %#8Ȏ[Og˚L⼵{"w$ ~2CR =S6KSze`/ƶdixxjQ+6PDZ+D 'EFY N-MWTRF`j`{.dKgS.ag!$ łsCG#ԍf2LĚH3VLC-q_"IEߓJh 輈V"KeS2f$%ۜg\Urm-^+|_87",-%,,:Fk?l7dCkl>k~;S]>O;^9EatLL<42H4 ;iއ:O<k͚d7?~n1mۯm_?4}3=p=f1+60w^iG,_E`Ow;w)9L.8oz_F|+.yVT)pp~ NjX7p534ŲY0FЊ abHLRQ*U~nrNX*^nޤ/kUix¸3#j[g7uzn˪,ENax$F ρc߁cD婬)POms2*.Yf_z;HK8&Ma;c6")%R08F:/6 XK999,ҰAn'\^F&De&AX|vJ~U^.@p^ :H`ip6=X=yE_ܾ֯e/;[kΫqE29`^=I}b u{@᧐!o|)?ng&vr6 >".;|n߀96?N",,Ӝ,ܶɕI+ mgp\nx섗|)JыˬS Ŋ͓g G1a<ۨdH7[;Ϡ[Q-D5#FEtcJ^d3%(/P&1ePCgXwO( łTcXo^BL81Բm㊡\WllS{R8(hRP[-cџ ۉH3kF)!rI|:ʊ % 6M*&#hFR\E)P(7Z j}-,,s]+.=gWSTT[6IFdHct8Qx\lrJߕݶV(e~E)zQ&qLJ;ON0+Pש9_|ٶVN{8sEWKi"%-3ϻt{OQ$Tq"ǵU|kz,׬gq+h -2G7&j k*ea8BP'"-I5B8!,c$#^v/]`nXh[PmqH)KZr^KUЫwAS5Vyo}R;CVp-^ }0єee"ho 9bo{~Bm)#nRHuDV\|ke,BWMUew:Qkj(Ib1y >Cfx4'Zj*kzX}+EhڑH9N4.gݖ5tZQT {Lf)fI5ՒC۩9~3h"cF1{[ d$#Z[1V %]5<4I>8nY9{tW4+G6fAܶV &,qSު%\u6m xndb~{lX,Vu=f Mϱi37MOs9rI}gx߅}`S ۋ(@5[ϨQB?%C:ϼ8ꪃM4l1c־ؙ<u_ُ7V.[wLrrgC;'=Ϭc2߸sF3놨ԟgu5q҂bdx#m]Y_d3{&:h vt)\%3W)q~+3 vq!uHw\*˕ĤNR_%GQXewa { i8u)k#:($d &[F=csƦU.~lݽNlY$#(9 Ez+?NT)ZA5cǕ *`\Piap)-̍|:6,xL$*̓*)Dz,;$4E_WKZUr  $%%cwms殰Yk-8@ ͻ~8[ơbЩZQz¦ C1% QBW#wFgBG%aܻi3{Ä8I s; 5A>ܰ=+x+S;&&8a4Ws" WZ冏Ågw?]Wtqo~֌`9f^<»7hY(ذE3 xz|_7p:o;Xd6MUPyĆ+y9͉nFW6rs{.Wx 1l\*Yp}xtv6gs"S#E.9!n/sW*d需c6b]70tbb9Gc:R!!(&x!7v *NHLB'vh{_$rF:*t[@-Y7brEM'W,hOJK2EKKaUTxE(QqoUgŮ`LX! #EWh 'mL.0vhl!эDB:Wܶ1iwM0%*Pp PI?6Fk%o#VLV656%D#2Ъ/'2E-E+eUq*}.J+NKkaa8:J "OcƤ2^Ec(!@ F`~ɞ7N^V?oLb#Hr񉛿q-[H*W)WJn.;#CArT?yc‚u98eal-ljC? UI'&- ]> N󙩱^=u%GEgu{SףŸp♫e 6V Ki.szw=nͩGq0sKaY,ǯ瞖߷f)<e %NsqX~(&M/~qVN' "~, B F֋Xgs2I=+) l̐-s˹p~]Њ~VeD:?lA0&J Ȏ'}_WDr>mw'ܳW߈^n*Bo;ϸf$RPdeh"l4tahi=c%Ob!E `,1EZ@c$Vz\AE+VWReuprQQqw E|Ě@<"O*B3ܒLUt,ݤ$I 8&WLcʀBӭ&tӄt8yZUUt;:Թڵ]{UXzoVS*Q(;g{ : |8့rt:r9Bb;R4)NatVݲ;O2ij˻y5?hs Vx魌l'IS;Odg[bѲ{@//w'̝3NGZ\78; Vi%~v>z =g]/2?҉#Y2$nqyClW4Ok\K5:}LHnFK\,dXrL>"0+K`\NYI@e &Ryନ.4ɮR $u#l]^0# !1?ere_I|u]1m.H[@[^dM+yTdGgQN^Gׁ\nZzgTԕauܸFȚL"$8L[2;z [Q~qR"\d##cz+Vb\ rm]!oXk9g8qk U-ԆRfvfv jCi8#ؼdF+)Lbll {[~ /1jո{ޮ9 \![9 Xt ;߳3}8_ث;Z}Y1u+kLv9/S{ݬyy|WR9Vā{xy?oZ23=Pg 橨s4mGn'~v ǟ~0e3:OUutfNvHG=73~kU$M37'&.KNldm3]V$WaucTQg JY@Cg߫rW^xvh4Ner^"f럁yk>$eehKUCYsl-:ؒ4,QCdua,8(?ZKp k#^\y+|ȃ8c 7]eFTٟo/*w<9ڗ9kٴ7l |b7˫%2Ug?7y{OeCrj&ts}/S}?jm>Ų??}ӆGys^{{Wѻz53sjsn})ј ˗nfvXdsؼ\~xo=[$|JsAEn/2X-p^!+fh.3@ T1cbD)$-G6&tR4Rf36B >RkFH܌c&Ig mj4%yrLɔYL]W)V9ҁԾp++o)ڝ$NEc mV;тF˦g9B'J@uX}~Q*ّ&Zsfa" pGly,5W#vm;އ}:f1k=o-w=Y7ysQ'=GTx G'3:Yo#ݚ-#4h3ς3$n0On6ylksFaIGuyᬽu<_<rwK7eؿ-'{KZsBtl IRg4v}*Ku3vŠ9ځ4+r|"NX6N1^b}G( q e\SXIAE] dkJ1%]ykt,EY;N^Wy &0Z8UlQ麛/o"'d%wټ>Ǔgrl__glCU(JT+P"9?&XrϝUjr7 _tHڴR\VszTbX$;+U'rȡ96LX^70i,$H('Jݕ0+P  P¦!C<1ih` G-&y51t̑\YnKW𭏖ctkwկ};~)ïS8'MlyWFTG=>y.UKߚE8]۝|}̝"˖<ж?L/>-'ڗϟwuӚ{1V*v02ŇΪ{|?i'_[,;^?Wn^0D6᲋{yg)~~[Zerp#YV4- {u߽HDq1D+$pLCљg)1B-ŠqF-A)my5T%4S*Iغ*e&R*ckB0A>B{ 䳁U$00'̚ʺhNr nZ٥gzvv m6(Nr}UICCpCR5?p5o3ss B.+21Yś$61 6( y_Wqcn\&R]_ r+Jvm[$?mKNJf~8c;m`r,IT%e:W=|7Nf/vt?+Kl{ߩuɭ[/|t9s8OT[amH_`C8s) hEEl*eRR~Chl`j ˎ  «@'lh&Pn',taZ歊M[~}\ '\|@ u2w7f]090yڏqw)rƜ]xvtp7omWc֛9S:9픫G_'U SaMk[{ezcy ƙ=Vt6|O\S) t_)vxfgEX>{ JN-|'_:rgp ?;g:Ɂ︐-|I IDAT}/W^.u7+%'6o/օ|EuzaE٢X E1]Ӧj&0,cQBA%T+ 9b}̶EB+R.H,bP-AbbC%2(6D%T@UʢM=1~+@/WJT='lyc\JJXTGh۔5#JKTb&WTDJCa.e%y 3*/b)5bwa[PP*9ӶcgNH#eX$[Hzb_lS(  \_2Ys#+z)iK0pQI{Y*X_dh%ń2ad0bH$9P UC$)Ba!PQ)XHB+4)Nճ~ R=Y}ʶ!~0HA1f`qn:( 'V:ZzUt2ؗse^7rolҿvfԚtQ: 8±&T&9= q]ʞY-oBvecYQI^lj{V?Fk'ڬ`i0!3HoKܺa nt mǞzeδwho iNcQIO/LI` B1}}SJmL̎gI}\^dꌙ_XZD~,k\BP~,'a& 4dU0݋`E'dJQs0[H7Si&: Q\kXlްRLpӱ}[ O⦕~16EK񦥮enBPSr伻BKW,YYtlWIׯ?i /{#XZÑG ?-^qp;u,u ;v;嫚|JN+&̅|*?'?>̡W?Oˇ/宵uZU GDl;&437qϿq~~s^=}_ɧ|r^{5\z$W߯xS, m+TX0/1 m5KY9R@SkZ6ioVlu[1]A;u2 XݖnW~^,ZI§?66+ rLZD(+y OSI cuÖÖЄa 66,#a>WaVK[Wq·/ӥ? \:M c^0e:ԃOE\O" 7rJfl6mQ<>bYX5t spC1D"IYSL(hV _O`%idD MQ@[m9o&vpP`4Z'l\܈VM_yO @ԗ9). +XuJVAIA@eH=Btm?yj{8 '6_m@ ڕ~2}Mʓ%lc]oKA o Zۖu6F.Ε,AA^M lςaZ;l d\2Zu=K= MJ1.'$JA;3"/UO7a.q0(i/*tT`lv^jVWaײvB/}]Ř0eKįgU3^ͯ>{:ع.۹7>n |W#W[پ~I|ӟ+>:y~O/ae/ӆ|Coeyt.\S85=\ѷm~_sDdgmP|g"#WDL>aG3ѝpOg/>>wXy0mu[`<Wiuz=5/$ ڰ%٣bƀ)˨5LO8b*6Oz$^q"xY‚!("kI!ߋ NI~A"mfFik\bE;̸ļ6 n"|ڻd6r B5A9'*3]1ʬ).LRRq"V~WR)b2 43T^Z;nt0M۲LJ5j=$(:٭_Tt~.#2]JxZc!N i-ā1vf5 uki-$JI1" Erف@Q-Z8Nֱ~T\e1s}L ͒%)LJ(RUЩDE] xK(J6ID(ؑkUZXff@Mgc: WtLcݜǓ)Z>3<=mk lQ+{qY\tmdsd0 {c;m ;8a=ؚ8VG_j+_lj@'y5m3з<'1DЍ"Wp珉5%&tj 6ηu>vN^Ŷ+VɩA`K`4PR0 M@_ 6~=zAb9sLZϏ0j-qZ䶇@<к䒀>Aa:!ǝ2q<T!yULC^={a97U)JOM㘿LֲZךN-Ѱ[j* {"[dҤ2QWvr8`O+]̝g/բv}a{L[E[ Vt%^?t9۟@Kਅ~yٕ۟Y_~3aGL{.N޿ 8_%NX0OoJ8_/j<c7.Zׁ:(l=9 hq cAE鶂7# HQ@C YCljLKQ/4B~'XZ)|/2ViB2;<vwȉ ʶu[E{0ؔjI_Jk_bX> ol|gSg.p=}ke3{G9Xr!GjT&U4ɬ5Ͷ6 ~[ ]"NS|>׺D@$P$2׵aC\̇v=(HϓF|΁2vɴ>޷t#-hYEq6q]x@øTEVP Ij)Hժ|/oe' f %' cc G ' MCb-VS 3Q;2jXo2g }'\YG4YZ/ءGHW>uZiwdEOiҧ9Sy,~czcѣbs xۚ?4\£'=Ǘ/ۗ7}O˦7l>b2 l0|Q* _GU:Qs$\aW#=8Ȫx՚[ME.]rʓY0>s48xK 3:+p-% 8_B7/ȀZ51_쥶҇h^;=lM3_CbpxAo29V撇&3`HGQhʱb8762VUĄV:Ԃ sU:`S~r_ڞ`0<];)&?-WNvOzz '2I|0t,~g} K* mČ"M6 w |mE 徫2U9Х̩D m-gZ<1u3(~ 7a8,ʖiaUi]"SѮ0 -"\ahB]Z-˜>ˬ)K_݅ճ;-N?<ƿ7=gf^`xȞ: A,`ŸsGP_Qxz7aXc۽1/<;w~m.̽vǾr'3;usC}n[ĕߟB_7X٧m'dp%w{ +kb]G\Koq\\|ljU'k!|eKG-˶Nb8`cņem!a΀ shP)):D PSRMH,2P2Fbku /z\R Xóu|r 4FO/ B.0_YOT>˰dtQ;Pp!RjIH(w{I<50b튨B3Y%jA!t~Cy7z79H$87*, V_|$ĭJSu2V le QGь--C*wQ c:֯RC+͒Zn0A`E"0ScY/l}4-F Q%#;Uc$(%)R_8HYM.1E<<Dj.e5tDZ;ENc3?s%e"/?֊lۊ3{zm÷ϼJ X;LR\,DSi)H EЛg,#kƦ@uvNۏfdI}s@g6+*7*}o2ZyfoЎc'?gc tuhIjg%/}>NĽz0N'/c5蒘6oC<ϊz RЗܘG~8`-늺aGzdMbi< 뤝\xCj%9IRN](k@]PDv)HwѺ+N%.Dλ ,N2?s_c"X]|U/Q ŀP8'sYRȵWa%#5`x3$_cxpe[CQӚV(ał-jNM_HAWJ0iŚbkFj8y=`- #9e,GjUtW e(R$wWȄ~@<Ь)+M췋XUfX:-l0=R}a?_j~|^Usmw]Q!Ǿ~}߿fsy4_Kz'eAUc9`R9f\qœCO.cwvvuZY/[?z-Grޑe4|j6p'nE=sqW]^>]sLkvyf֘M0.lʯ<-[fѳ]p?ÚW3f^xj53 t)FoU$6o-۶*hizazY[}Ah [JEKOЗX֐$ c11zRyUezHl2V %؂,}@7Ro]&hW& 2)O5:D8u@a'c+T}`͘E,X}nH򶑖 Ҹϸ[ܶLF:$# \ВyXO:YoľojpYھ_7-yFk# 7BcCĂX3ᙘ "J8lᑇ硥O1Cq>ck(M k%*_dDȨ*P*0[H P Kֵ0,p`'ub]BE0'9(T?ߍ/f2Bi6%W=Jq=U|]yr̲j8F.sJ$,¦ ĬrU| ؁;H4*DR8GT*'Lu,MƆ\$--5 '"4y{Ebi=C*ck%~@U pI|ֿ8畂90w-}So_2RƝzi"ĵ'sBIT2}*eS>!&l[B.ʁi2q%0l0fUo:SJ莠n}EKRf޹>ykln}l}d$si;%mNxj:K"iRkytμ}sy$+JH{M6VR@iVE&q&Oԯ'NJ$h )P1נQi1P'j1L uW<&GLp91:YSuW>М?_|kEo{ohoOg52eSx6vm7}$nKz‘_p lߴ^']'Sv3ܵ9?u'q3 >3/b*:ְgXܲM\_3{Fk xkx嗰xzA0ZpuJ$w1CQ oZ.`Y|'n3Wc]XtWR.Jr޲6 c-C#6䞫%C`XC36C=60XeCK)0BKAj} ֩;xۢ@5Mc]# (ϗ%{[׏5Q4@-5PYT b 4M[chƕ4@cB.M*kK***-HZA㙈b4RE>(I k%EgIUQtej`$/}%/Ix;Ld5T$Ԯu@K$.ԁDa\R46]`tiIUXI>4֌xdŊX1h[ 㼉[)I@~ ,e])A%t> NʳZVP{,f񫵊׍׹Lb\id@_ d0[;PlE! e/d`VN hڙ+6[C7M[]WOWg-簤2p17SPմ6tA˺{߼WmI5n6@nE!ɯ\Sl3c8__|X-kL漲k?z+^lmD>4Ycغf #LjcrkML۶ec\;7Җk&8㨎 oCJ;Cٵw#d曱GxaL;.-z+g׫0M-צ;*90+C7Pxr4;xӿK'gq<50Z`n(-\#V>˙>S#ݼjq!VSkNx,Ŋ_U*sxk`((pܩ<<ްrel4ݓ0$ 1/nKX=ad,؊jf):f9S9־4L+DķWiW"L<ŻS>rhߡYﻛ~=-Vi-|Y4;2-69 x&67X#v#G`5UNVQZ]N3P`>}M,u@^tq9RNd`߆!%^y'㝼-msyC!,q+ a L;W;@QĊNEHp|HB\[LYӑE>dr@"A &]-C &Њb((j\B殢+}[-)ELc:(_p0=$-77.%ՂRtP'ݗgxNv!fJ6$ - G6&EZ+CGS5wlC+ ]gXX:ْ~6S-CXʡt*TcM h~ǧ<%FLd u7o?kı]%2אJaB nX5ֱ[s&0Cw d_x;WԁG!]YnBrZA2X,>Q1b/L "K(&RID Ԝ\^uO@}z2-%vYf7FU~o}yÐ"V [.xy <^e}Gwp`S@o-| Ο.w^q{,T~g>}'4]xtwoK[w'x O\#[Od\?3o='?<‰`ѲM,~*ᆻ2~8>_$`;5vᘷF\syo~ݥp'o7]؃EF͇<]c=u|EǷ&XS`5'ӜtV<_,rY֍|Mȣ 5h2, Y- \ݒSK XJʂ5ZXAhƐC-o. `ZH奌mwy֏?*|y5kg%U[v8>t&'a$4D@QPGQGgqF<"*Qd"$܄nsSZUO8yu]UWֳ{3VXAq86`")Nb-"* JEvA 夬*~IrJEH+2yVdyWA"LqILnXNʲX)RA%/ )0"TDvA"l{}._:J*)2eڱ = +9XB$OHa$85 bd lZK%= $O6|?HqXy]ROWI* {~6C9׏UƱ6+ 2?Z6^]|N(A+QUs漂=70;-A  2R|g0'׺e&]hBRjcQ~L|⣜ 5+S*/3cO+=(cs^%@֓W||m1ʥr9VuaW1Qr?J"KDJ9?]b:oS)Ws r|=Ǣ"#S_eը.()[3st4RR4eu!5VF?| X,^JM[j๻$i3ב x .H$eC?HbpSF&'B.֜rR6R `cW^*i xX;% (d ٴĠM$:H֮::&r%̌ȉvu OUȚʃh K%k/KWXJEy9SXngK)-_w LB := D"d.1K?[(=Rs\S@$IȊV$`o . a]|ֽ> ܜPC)8&sWɔgzN]1-oI83"{W 6R~EbbAߜ[eign)[$6{lzq}oJ|a`5(WwBp+RM̍V8ٸnz XB,FY( pJ~2o*`m&̊1ƖL6,01i7l5hY>jwjM ̨, 2: lo挝.mu1,>Ս|sMмg}vY]7܅v.,;s>r*찹݌t#XdnY<a|>"s@2} &F'73Ime;/3/΃~vq)/m3\|pq? <]xϧ9]7]0ׇ\lȍ5U3W*\} nb0cb xq&6AKYSD3E_W>!kKZS"8D VdTf!tm/o>H x;SԫR*-E'Vbl'l+ڱHe`U؟ul(I=(Ja&dLR5T4aEE"@p%rЁ&hT#֊E@dJdA+j?j9_6 U*$c$T(a9 8F :J]VNF˱'E2W"@iE*nc8K?gPi[50akDrB E $ ikrfT4+zǎo$p_EQ TP׳~u/P)qgpUn QTRL~Sk ZQV&ZQUVXt u)~7lq rpd36&L o @0#^8)8Fhرe9j~mn:8 ":s/aӖko%{KDOYB9~=Yq+ EecXh/:.Ue2+"Ė`[j[ǜX7ts[l l@/=(w1;6~ݱ&>#x)?r__]ZSr_mUJR=5Y?l$Q(uo%q%,$y 7 IDAT8R PdcԖ_^+ݛ5n[)igy9f{qX4Df g $ *y2~VGE,[RkR 5]B(\rx;ݱc;mhARSWkE.)c]wmX2{El\$h5%L=Áfz00jQA9;Ռ5ۊюfh&cꊢ5{ѕD e0 #Nom舕UO3{ٻ#(VeMC3LnX0,C_5X5,]1-5jݰ|7Ʒ?quyM^";mQI {$x\pуǸ ,:8\uZ~~i'3g9Y,~ɷolc.b%έt6q0٣j,Ɣg_[y {/?x=Hsonxx5]wG2vƅrӭ?/^>pfS+Ɯ18 E z[L,{5_9]\X<Ĭd/ϗ6xǑM74h߸Cel?XRjYucg\{k̴G'`XTakXB2&ZMR:duC5DXM-ۅ+Cf)uBæxI:%~s[7K)9Wlˌ?6_9;ɷ% EM'Ji!hV:gn=\Vؕ>ֶ%іUƔ9%@#vb$h )h-VCԍU" %Qg'LD| eb~ tnN9^JifǢs1 mQ@Fz" 0ݕ4ɴb 7PI]1륐(Љ~̍YAIJ9ZR(*U޹(9*j7FvqWDh N~ [i'+QOEogw`rϓv ώv+zɟʧ˿o[!VOX>~U%.E];)fZv5_yeOSՠ|<UByV":9*zn-%JTO|,AZd2md)I0ldNY1w3b :#`h>Zek\JeZ2of ySX/2Ȍf䯶IۗZ&i,p"?CGsG{M'I+|>~8_|a^@nSt{QW|z:z_o^[.L /pP§n0ow9Xm8̶˶㲥cR,ztɝZxAZwwͺemlXꖾ0e'%2i1p %E&G:y^:( vr#&Z+( rt&_Ja^&*1 V>P/?WaޤJSiŁ)d)dJ \d-@2=pasS!OdkS|Wb_;Wi^X/khLWX+}eyo.Wduj]bF(3ZI 09):TTqZd{ #|t!]rnrg"Uz5zFF(ɯ@xS<`R&Ȧxh$X@!XOrɃL|RzuA`cP^귂`wݞ}Υg?2ˍUHߛ)/"_n:Lm6VVJN:Jh[ L(0B`u &c-kYL[&',IǪlhY.CjFU\l){5~Gv g3wl17ye$u}3/2m q&k;Ê+z~xŧS5XRFkY6V&y$yT`Gfke*ww^{>z;<9m1-a;.YGp@Ȫ2p2cbbŌAȠbt6\5a-m4uD*SDN3 ,u+ف%xkKT4CHHb_3211>TySYUh 8R}P_\EIUE7nԠ^p^dU؊hH *M5"ԓc2V F%k?G-I "o%x*hK q&"% UcſX[̓H%%(Rq2ZъZtbQ8`8WB"ީq+&RQljt b;5SШ(m`iTĺ⪞+7tLJޑUt9d:Ih`YQk]mXa[ /ˆ=+\\bM2roa%!k\ǮOK{lS3KRK.=LۍKm'+4.m%P^N3i#|f,{طB.D t^>[3Ih+d- = w j{ 9wK׵%)X۾}6)łW"@ Cş9A<-):z훥6w4K{-fPz g|29d]3㒰Tt,oJ?$]홷Tj%:/%#l_}*E|_Z-m@D_7؃0VlyWy2HCR7VDR#,sQ|x~b@XO [Ӿ+_ԥ>ϔ4WtstB#fDU%ں:&b8oW1ځe HbwVy{nD0fz5`Ш_L5c]fc[jS *NeX0x ϬLK_X7Ltk0`aYXxjYZN˘֗$)k6g\f,=i{]C$_y\@%5' =;f5u쳳#PlJ7q1rE}yqu_Ko˟ObNvYǝᐭֱ[_%G0x{ecxVrߞ!gͽ+v>vH~p~ob?{w,ߺa.oܱu컍f]Ύ3kOOCZtf>,wm ;oF8z'04R.`&5S Xb~ņ ţK-1âNd'8-k[6oi;\5T!N ccXFfU 2JX‰R$:A2Y(U4ӌذ15ZM_ Bq5|f }*%['[́Y)@<]}ԵU-AB*/{5(]d^M ۹ cjc6=bHn\|Dr*3]2#ʁt;V{r>"( d-4~b).1}1!cvr&dAэ=r")a$7c^cd?o_} 9Rw\Lܳ 2% 8ௗql&1!z39$+f%f~"9!r݊Y򘃶w[1*̻7YBq*PV rh\+ h qIC5q.P3NI7y~%8<7~Սǝ^wQ&2ߵ@9d} |s))E͡ՅfGl/w0$O2tRt36!V ay, (y刭s熗SY 7Ϗjִ4*qNLlxSo;ũ? q {p҄51}}t9o%M7S^~q3}<{߱xKZ\$d=_?e+.:0gã; NO\ϗݞ[[/oOnZwvU~6ܬvo}kWt!F[IL AaBDM%ӡ y-x=&@I_8B`|v9j V_/˓_o3 š(1_zŇ H+e w,:-K3lnZbc4',Gq?/*v;ntRezQ^1gźm P{+Q|K8a!~{c<8D^7;_x߾Xڟܝ[[f{x`Lysظ`KO?7?gq߯Z{mk/y,+9󴓶x3O 򟗟=rWr{;<嬿N>;xN:t&oܺ:`zԬgl枧!lZLZF00QSԁ]K3ch Jr'@XX# %P 0X} -EI2ӮF&qJ|rҟ;oRSTPBvS ZmW`5:?""GbNRy_+WP+ʹUޡR`o"tZ-.洙rN8O#>?cWddI"!T"EE[EUZUUٯ|u~d}gT00@38,T:62Ȩ,PBaVdB=[Q4aآUS"FX58YZ~`CEC_+>USKRuɤ~)}B"KmYWηq l~dL,j[@31ڲrhsۦToFM˒A\2%Q{p N'ձzaZiS`9N3ٴ;9ևCb =doӎ$ 291c_+Z[jgX@mNJz-bal$?:/I̿'-]<ߌ́_bXw̃JBO]Ťdl^ fT+x}AlW4Ա|C={9H<ʪ8w5,6i2.djE8Ip z%ϘgX"+d =Т K.QT:|-}f:R{P|ޥ\/yI=;o@[t _Ϟ}\XZ(R%0ڵvac-+Lܶxsw2ƩTa=WDֱuKT FH< 4SXlj6wcf"Uth 6}8j;xKh"7͠XbD"9 KJ2v2 ?ei'@hXY3ጭk;SdOY1єnFTwaΔ)/a6y7HMċӖٍÌ5cyKc6M>cLXH6elll0팾zF?PR\gVli-*wn&uI563\KDXǎזlPr앖"TNL,;JRԕU|^tzZwM1Q*rKܦLS#4S+uNQCtWleʬqOY)Q-qJ/\a½X䭭r \V0o,R~{m_( 7s`o``83A"9]rPJms9lž:s  9W<_8;Gr$ 2{h]/p1WgA)1y$' ˆu9X(TKCm}s?J9> p{؛{K׸/yb0TLk:X `zo%(܅GH|N9$2&͕P PZ{(bs3VV Xŗ/S+M2$)IkPSAeZ+9v{&7an2MacbUKI9;mVWf**^oqG~u+8 )l0٥>ݓ-oӃ8o_\\r4 ^vV?/c撳niSZUmb_q\g[γW<}?þٻíSYG~]xy;X-Os`+K kif_4B$V}J@K:m<9PiκZ}\Q1VEՍuZNqþҎ)H 'T1UJH՚~+WpJAWUf왿A-r0=^3 [ f;|4-Q'<)km>(=[>zu׏6K6%Җ)y/L9 J{Tk+URUNB. [A)Az1~o)sC.{>5S|L/%LEuqvF$GZ׾ SX>I.[:_۩!ʶ`{#"-M<ة*|JIj⣃UV8K0'.W.rh8h \բ%` ]<O*Ų [D5KZH-޲i[:ɦ%t&,pZɌ9{' OX|׼^s 3'8j y'x~xaow}<\JoۑXŝ2Qj,ۼFvl~W`xN`lds2z?Ձ IDAT[YůC9ys?n)j-=W<[OdU4w}:zƩz-փQKrW ۿZО;_ҟ|^ۼOby\ صy22]۳$)_Jo tl?N ̜p- Icϝ@/`1}A_r^bٳ|"ʁ߸Ebma+ߘ) 0mWe6|zdII:9%l{S-nZ6.%#lĒ?u1,u}B¿7.@-ַ5%1bv7gj{P7A]aZw/ӒsbKޢ}-3][fQsr`r?Mbȼ-59Ϧ9x M=0.([:6Q:#K^ڝj[7sJfd+v}b2r>kvAU BQ,"}CSR~ z@7C5SgKF ڃ2sFoZLؾsgr:N超)l0'e"sol+bmf,  / jZT'Bh,E+Ш€( * K5bƎbSW3h&)*Z}N~ŴA[NXkſ8S%Dv,eЁ}Uװ}p!1/M1NFH8h c ;)  rӉ L3̙+Ý>m9|qnz,j,o>}\t;q@=ظO|?,xph>r #ճ9r}ϰp6C.Yp?\}-\CܗϕuO0̇Ξޠ;27.zw?ov6l\mfa N? vj /n_/?_<:ά\NM͗CZcc\pexLg>yj$_~x=;m0 F)>.L &2֯Ԧ_&tL?F`aiظYx2z0 iNlhu,6-u(K)hWjU*˪/4 LdP4` jo!\ yˮ mh$7\n~.үU<!9>؟T_x.(򙉶R6f.#vw@>xc[Ī8⼀5E|h /_(Di-v )#cE4rIX*Et @E޵c }sgе!SֶR@Ƹ t lHCgFw-AtVo/bHe,ϭFrپZz>?w q^Jwۻz\Am rܔqc{`b-ť-΅7X77m;q:=?pnI <,ۿy0~__|+Ǜ9`׹qa,RXxx|6,nhCj#CО!^ xB(OlΆ󝶅%f%}-N"(u%O}d)ӄ+#xVN>1 y 3%Qu Rtv 03TϾ0@( aK*@|A ߵP>.]o Lb,.q v4= E\*JrnWdJPIRS]$(1rWgh%,']bee]dN9t祜APO5rE%,A!cПr|_^gtȽ{cde6JҋS:eh #IPJN">^xRA71sd-&͙:ˬ20nbثX40\`k},9L~Ƌ+rݵWcq&V<+;k<~'s?1Ŀמs:r+jlg_[/còںVQʕ+_3ڧ'<чl/͇{w޳z>q{8`}Xz;i.>SZǒ73mC ]ܪm#V]8Nl5lh jwVaŬŴvgl Xu˴aZhd&cT&uFDAFΨیvړgтmk nTI"(t|sZUW՜tUSsNə|N7D2AiMNxdEYzMQ!3lſV^8>'JbY[+BM_ ,`"U6Uc(3ŤR"R"8Ho`*0TU V4X_E;Uh0+bB+ׯyOQ`1.s8U@6nuu5"D.@:Q c&-#r- RM-RV Tw쪁H_c}둗~*Jw p(HU@{&'⟹.ub0蒆$|7cd,m Չc0ğI&Xӳt-%JMCNܗVV#ޘt\+V ͮuϛnvuc|[l.MZ{01-5S; 0"%'̤ L&f֦g &*65*/poj5}[lwL _FF'dkv)S'͙*Ϯŵ .Բֲ}LD=Nw-3{w]C;qπow:wSl&x>8.=6"Ëg6c`+XBϜ~ Ե%tvτf3"ǭ/ܹ!' > JH\+3q?,X.-&Eb-\ѨъG7̺r&/%@rs8eWA]!S_U\Ѣ&}s {.1r>.gPJ|Fl %aW*v}m*&[}mE -_skʁUa4F1Q†X.L& 3iZQߧ`bCS!0*K M6M퀱nD馚 HӨ)i !Ƞf_l5kOzF1DheQZS uŴ~*4ӴȬf61c 6%O㌁JƜ9C}XfE"&5Uڶ39`y39-}>~~ƹဝqPȒS.&wWO}|NxZ̓b.,ʘ 3^ȸyj,_mX:cl2#3 sel5_5at2caaiHCK2T Dz(l$+q뛳LT"vZp-Ҫƒtm$N_I}^dER2C9ya.WJ!(-jQfd.Y%>^:S8T&"y1/QJ103}8{mvCVJ~'' ǔRw5R$ⓠKiJC#()lZ/\0uJ^b *-kLZj[" 9AˁU 5pr$pXZEzj kUʍ"ߚuP¶OnC]- 娴Q s0(TPw_qʊ^xe {䤏\]$͔˛uRbS^\\mɐeH+BP H1)"D5*U YVk/b+2TW۲*Gz25Jy&1n餚Vi%۶혿,фBka4FB*c(4Lρ!c qjivuekZ&Ɨ ޶@Ž+:VZ!OxbͮhwaвnRFf|s>Ě?ȣCu/d]ဃfܳX&=߾NA^Ǵ9jHWh>1{Gg``S0o<|x_]|%:W?e^\ʼy1{\wkQ,fݶ s~hXS -Q`bdڐ(C HS ZE *[TB>+.aA^* Q,}`@າ8| 6[J.}U* ]gA`BlHdTcB^8,l ` K`-U+r*qcP~ݚJTTC8XK`ȗR}oIzʁWOU'  cZ`Ǭp@>w) Az. .$*;-ǫ xTZTזT0~=%{^Ʃu\V^,Wx{r`KL8CdZ&.ֱslIсƵB1+ǵσv GZ:*{ٔ+Y  TUw:ᦾ};GB MITP:fqF}QQW#FrArn}=Tk83w9L}>U:^{=y1 ohgn+a=%\єN'HM5#E#D8 $,lXp㎾11GY!a5sw^笯w=^t}||Xw ]s枻w]ȇ Fn}<*[n~p:/`냎zN!wo͓e浇Vq_jMuN>kLVcPa;.Pݚ70.`K-:̲20Kq īרY)/̀_ `UZVf05Z'-M٪U^Cx7㸣i# s\\A 7)X vr@~K~;8/x;Aܿ#:d_<;NںLD}SYD7{ZJ1EX}B6;wчE.DQ J"_{/9)۰.LUfMU'w_w58Sgltȟd`((=V")*f5{hs v]ܠۈ4bMV: OT FЩ|'t}G' c-@P)vKlv?,a3 R;elm吶e,#$5I£.ke)ݲR&p?1\NĆ4bC2؉I-m'Iie-q޴ô>nC)q~{{dr z..˔.KWÒ2Mt 1;7r./wxzÊvF3JՓ37cqǺ!&=06ano0yiR[3=B<رYӄf#7Ocsobpn*OuLkޫZ9'}mwaC<,w4??z(fŚy٭fx'2WZ=,_2?|ZϜfް\&a|j~ۛf,oͿ޴ focw":Or݃48i>3Ӕ=+CveҘK8:W`rݯI[[cw%",'3Z<-އϩ:کMo{s0>apty(`/ƒa ܑy#KsCMXaCt>br#GO<5v𸂿 Z`)4PcAx~cV4 ;lsY fG__`E:N)p7K{1ľ{=7 +7q?zHgs}gvo'{޲O_]>Ƴrxy1_xGGߊ .#מy'q۳Ox?o}efIQ 6 (!JPX%kQ)7D[-dC2Zo s~5W2f5ȕQQx3V+#{2H!=j28׳xI9@$})Ptrs_E4q Wh&I=;yxۋ }x. ?y :VۼﺨвZ Ys^XMDv5"1"9In%,XGz DPgD¦M֐0g/zq"Fe˙a)f[OΟs^Np毳]l~Ao9}~tWA20x>e͎gãoN_ޒ ̣/_x[v1?Wcxeؽ]:^ur $_[?w*7~q|'wcM# ʏѳ~ƏΕ}={_x?|rb__{o#w@c=cEf֕6X:cn򵖗Y֤aŰa 6, aE6q3 H { 3xSvc ۖs."-4S|pkC!Ru`Uw52UYgJޢÔ=[|ձ.vZf ??ii bBؕ "j <3Koy&v1bhyOG@au3kXI7cM'Lo)=^mC+_~ta‰Dd͕dEy=h DZ- Dj*ܨr * r5Zc Nb_ &/' n)SUH;Oƫe6C5XOO mFz$RՊtQ8EC~NY9w2C'tҰ@d%.mɯ*k$T:#jL!]DC. SBa[AvPυs.*SIPUC 22a<( ]hHC훥{yG߫^NxS./' 2'~^b up)@˥ .{D0dxj̐:ǡq6TE[uBZ;7r.+%91z9Trgz2]^lyh;>RqRұ\M9 1ec&HNL:Imp `sz2Bj45BixK~k+=o:h~IP]~)߹ew,o?|6ᄚ?߸csmj ܓ>;Ng/E_gy&S5X`!ogm[Q>c8#HɌlEdp/:l;Ǹ=t櫷թMgGrp]e{{~⹱si8SLgua>񖈅;o{\q&f?%dzbt+y8ᰅh~[tٌY{i|['Y?~cLO-}qCvt\.Sntކs3:ccqO:4c42' CY  y',!e;+6[?Jۂ{q9. 2>V zN_,7VXh(n/s9uL,6L$X"SHÆ Y=;uڶ#w4b2׆vHgm/cp)EE:w0\g)1)G t8 6Wm!_&c).{)kG9F/ry~S$;}Z1N2lǸ2eC}^ߘA$r!mA'0BC=B\Q0l5ɹ b||9 z rtm/_c]7WYu_ĖLb,H,S:DmGZw#YMA<*ԧBa*ZZت?MH,G-+ò`sI+PIzf=g=xLR)@#-H0܂QU+f_b1K1qªV'V 7fԈEl;ϲOUK:ϲ∭g̋6yd}f^DOWd 1"<]9O{ZZݣguZNY:=&.os$h?_q3}GRke}짬a|\ V?MosY:0oB;OܹpCmzđĞz0{jc{Zi55)iROl%II:Q+cHcbcI*zZHz)q!duе(W=NoB8: T~f4WȀ>'z=)AܚI2l_aJl) e@Ǣ[.4s5)He o١: kV˝$Z, ~=Mn$YJ78M!{JV Uhb- (jbZ _p+o:eT* m&+d [Vepȼ ȵxhTN__]%W$):c >/N8>@0L$@͗Iꔇg1 $MtwoOW4I?KJw{OfϾk29>'w16ⱟ0ezj}ۘgm.~־ٚY2Gx/~|owO?yw}^F>/?Lws.,svܙq>{jkxd1 |}焳CGp8ۻ !fFhgy3"ncya˹1Òx퇭fSg {,kjak{`tREraӈFz#xityILQUN[(2+=Pת﷕whV`ZM1e)3V"zF@)96#UyQc^I3'褞C h*Lؚ5uR j@F~' 9}P x:OO`D]_ o^0O{ l:CW*XnU+2.ĎA}2Ty W,6. N2<Γ_'1C/:a_]ꀿ]dmWb ޲ G%7m,LJa (憎nG[Y )_D YA8''q!,Qăv/ w>V1mHCR&ofK`^c/o$#bIĦ9z,Lsm  X5H͗X5ka/?o6`)%Ưͼ[u/GA^R^A^ ؗmowI |yZ9e2{;u zw_.O輍Ɔ-+\Wؾ%[?a[k")[-DuM`K7 vZ5ʼn6.[lz8. *\(w q}T `rM-آ2ђomhMW=Z(œJ?07q]I]u#/+;e:K;woގ|j*'*~{dx}{g|8wdY<{Tӟ8c}cO⡗Xȍ[8rm>f:md6\b~:+26xα=~vc=6PN#6Lq^Gz#-Br{zʮLXA;OpX:W˜}l 2ng'/U #_+ч G`5\"S %mL}V.VsǞBY>zZu}Et}Ͻw{S-2gG[( ,8`VÁ^#/„\cC|IDJrZR{5P%*4ȸ0z`&bC'Lu!TXe5ަax;pjNDqgmiQ*J Ɗ:A38 =M=z%y]B+a@γ#.g0bxna<[xDl3++;5_\cX/X=uEq]Ż7i@%#y`9`8syl?MXvjLj/] VL5wXy`uWsQo=-ЖǼ|λ%Ǯ+Ȃcc=-/nrܷܞÃMOoty8u畹a%c51f8j.Lー6rr*~,=yEeSiC:H)h(Cz ah5T 1^bTOPt8adcq *'V\m Nؼ.TY>2+$?^3 e`9L^c6D0=YҋI e^TJR9$iUkW? Ά|ҼYR=p^um S s)7IXT N _ bksO xQ_HY3Z!$Up0@)R9iBI%v\%dӲS&oLKVX{\;  $b/s[<S8x+}^ * %UVpy eRݗR- ^$`]P\p*uRr#,w?#9Խ .;`A]QkTƫI"pé{'M8Rxy^ qOyk!بg|gOOtq*}<ӷx^l8a^w[z:QF.&3n䬅#|Ηx`\wZ4m1qLҹ#hfM{َs_f7~>/gQ_2||2+8kEp/j 1߇3>i|Ν_{{O<=479tI<a펂 p+Fqg%;Gyg^F}sMKݏL) C+2̅ߥ֌9ZϬF?OldegF,+"Ð1<1lBg0KgYclXqZe11,#C[aSĄOʤJ"9`+CЗRnkPϾ2;Vt+HdbM;DT~A{2A?*y~qyF+Kl^L&w'dW,s Z֔(oRw\A߱&2ÄtjD.2`X$&FdIҺQW  X=D[AFuc _ߴӦ5'FFM'o7k{ό,o*% >:0e;V[h!U+x>Ԏ2.rh}xa!d %$f;oA2y¾) [a!)b(@~h=xtXZU6\Av8pM:T@_ٞu*@s;;G؞P>Cڄ N,Xqm6H1{:sUاnac4Q)> IDAT8U4c ^O4u0 b19ѹ^#w@*p|NEI׬zMy :aWpLJ:=4.rLHNN5M}q m7 |iU OP8@p(P m6\2tlbKK7pd:S=dr o`TpMu%%̥i8Z; :UjǤ/Xa&hN 8We -BWe'+ 1Z%RpոY/Q7nDŽjҶZX)ZZ趞Ĉ7}vA ;~ReN ࣫&!,f%Fn S,  h6ikv&ַSoh >yugaJ ,D"tr j}DKlVK =M˂gaLw9SqԼzZ~3+^1sCu9*Зqn?/S#,Yɗ @Q @LSu([3 4Csy-8tib>zL yS?9o~zy}1K(x=~C yF} 3l8T$ W5eTG,_sdY-m?Dv"yD3rlV&v*Q vZ2.SoENVf.෭miĒJm놞aivf bТxŌt$W+\۹$6&`rwCê{]a7aZO̎}Ή7`i7ZgxyL[ױ»: ޹VĬM-F' 4Hq`bg]&x'\H[^桴)?tWcwrnku‰ug_;3~q'}onZa`VΪK,]s`qgquci:zyb鲞mcI)k QG:8Vp&KK4 F VX#zHzlrF*** \TИF ɵ#dQ7n~#Y/@Vj<Br( HgX׀"5P6H'19 d$D` v k .q2(#PqY:IS+S_x)TB#.;ʾNǚHꪯf?,3_YfZf!OKgKL!JL2/,)Z/ٽxk~$2W7suWdN&b]A+p谕[~\zRפrs9囝K vUjނwF/K*@+a[ ۼW s]SG " X|W<8҃8k7.y]{Ȇ^`v _}}|=-->Ll1G3] Sw-_\ƎDZz(޹6fdʞch\r>)Ol4tMtË˙ <y2>{GhYտ.}|twxx2`!$[ ^Όf߲,osx$Pξ3?̻x-OmxzM gGl$"۷*1`y yux6= ./eG|gkkqbRe^Ϝ6G!Qm Y S|JAc0 ru lҶRR:XGuU{ '$t(V S^AGxH!Plx [Spq^2]tQzv%4azh\=[aq'1GYpJ?#a\~5Tnܼ*4 z5,ќl.E\%ܫ<ϑ;Z܆A޺8s8s=_Uql:?W8R/gpi[|?ʂwGvs^u-N7KG:-gbE­xOy&2Gwӝx*fR)W_I0egYTs,:N: Bv`Gl:\2ca2]$' nD>$;\$t2FrQ`GR(-D<纑ƫnFYFZ/IfV2BSYT2u23$H׃"aXI)"'ToiRؿeKSrLT}fTr~[̦r Ͻ^7]%˲eşQ !2}N "aZmYY̔IpBnυcN6w pVUo̎Ȁ ln(dB]M@{IDzs*Ըsz|)JY8P9-A,dCnd`"i70QNUo(,I2_,.phkk5C q`Iur/އ::SiYy"*XүyI,cנi@s^`b=iz&F={W Pdz,ς~ǾaFg맧qCݗҧI7c-ᚭeϿM5m=}fӸgya-NoZ/yDGx=%<~Y‰{ֲ;8l\8Y|{U}'4xq {;aEwߊ@_4/qWc G>}Ƨun< ^\t d=[knb&);(.N z fwuxx>yqZ5[w⪱aޔVr21,oayC',KYͰ, /ænx!=LK`^-c?Q^C'̈#,Q;y=CJ(]DQ,A&6J{Y +魯#_TzD'.dž$!oL W,lڜ/YE۟U)ܾHPg<gP+LW e7GrzP0S-' ous"8 F:Ff^7ԢWؿȮKnWUZpBҲJ6s&˚mN\N: s^Hliik5Fdj+TYd Wogո L/ZԨP`7xӰ2(=y`v^*9;\5(hu䴭F=sY $HUmtW/"᝱Zi8ʪ5F orN.&h]*LzYz/scp4Um^[$zXnO!6|)?P2*+Mer|BN»܄l$$^>ᬎ?L9c!!CJJI⥈P9͞_9^a[Lў&ϰ=ҮC!Rw[[du fB21 a-RK6w[Ibni\{`I,c$U 82M찲+vo(±2^ 5m ĦSXIvZ2~.J.U6dmCb 7F-z 5Ray=4=teZe<=}wlJԇ>KPo#ho}aCo` 2 ÷&~y`Kߪ0%98 ãt. &rHfJuȒekggmOn.6 ù/Q_↡IBye8bo}[et[Qyek=CgMpNtIv;֖+7<8ȔV ḋ/kCl{9v |+Fi'l g.{?OzN9&.p.;NwcO2wč;ۙ֎`N׎K9ֿW 'ȃ7WM'[u i枟!>𚣏5=8i+$1<Ȣ ^Te\Ra驰57\8 .V-BQ/) Pc$ڠ` X=2z^4>UHrb&W Z$"xa+D&^U s 5Pwr=WH.Lo$Z|bdViQD)MeTD|IoSSnB1Ci|15 +|‹kīC${}/Jee=`"KR}=G9krر9_?,z: +<},M7đ6z.^~_{h[۰6/O-ӧz=cO9ڙ#3fb&:^TL" ԗeS`$:#v<4 2Q&/dALF0)2 g$6L`eaiK&ec#+H1dNA_$yS'Y) 8O)}^u 譩]*9DzZL,YWve6qp'o?ܝwU{Ϝsnm靐;HUDAi"HEŎ Pv,`HARm o?3s׿~s?9sZzT.I᧗Ll^ {dy/CGd]J?YNFOT"%J5όZfEj&g>5eBЭx|!Δo37IsNVg5?U~#0}3)hDm|&`6R92&ӇA/&Cwf7JV IDATUe4}a9>Q nScߙ3[zk岞 eZfz!sjaY4sϟupR$órѽ{h AoEP5OYeEYCóc `ø0JTƠTᪧoÞ/w jГ“#V8ս}f{Oq|U!C<<7)JުWH@5ޒӮz{wÞ_~8a(7o޼wόpMzf pu>`ikq[9-e cl;aY`}V~}N ^Y'igI)ITsj[:}O؝g;-ozvUVfK\v\}oǭO4gPz=3]~>hL84O̍W:&<V̙Մl aV0keن Ö+UV20w ,%-^ 00lm NDĐ:DeXhH۵lo/c=P&sA__kkXo lIXNQ9~.i;Vj`GpƄ>)ɤ$i {Xlmna:a[i  H8[FRèQCk[hXQp Ǒl P77>WMA඲[ʲ~%in[}d헒~ufAT {UYUNX㼂FYVoT9иbE$6~U,KLPӷAr9shW}e$ ž}iWndPu7 ߼S`ÑM97;|%[gl[V^]x,[ODu5ƍG4<Ǭ1ٻe4^"!iݐjXC{Z֘O O5\=XJr"B\Ï'u#t$P֯zʆtk'_[Mޠ2=#00,`;]o 3 6 #Rboh+[:[-=NKo]፯{{ " eCgE455 #CQ>bVx} /.WfBGĻG9wS];>qt{wuQk9񜫨ώ=,4W58bo`:֥'[o> /zX?0 #tu]˜FyWiVn} ܎|V>qqE,Тqل{i6>tp\xQ`8se_Ç6ߴV&^>zl5c[yusPZKv`4*z>a 񝖍cbFJlU.3\X^-VNonH"lr6-ǖ8DQKkxAP{5Cf6P& mp* Y,;M⑂Ɂ(O?v%&C#BXqt0}f \ƿd"'()Fy!"X 71nrlH@',4:^$5B&sL~aú:'N8:!Sy]9$,A_=MlR¶p5e(lm vJ56$Bj|}x`# eZ$ZvbB-/DGFeuYl2_wxggsh8P '7WXv3S3b۩-D"qP|3pF vQS Xrb+SƷߔs?kmSr\_334:Ӷ'׿?ǹ?pڕ7Nq7xׅ_`Zg7=ms^baQeFdzuRgsML=cg,4gyC- J9+7Ƒ,+ `~4(oO T!dD(l4 =P X A>}F(sb(4d9eNA;k:dˉA=a:ҙ՝T7K O|j,q[7_xMš)%0838ը1/%Mg <wmywYDo~+:Tu:{p LMB.?̶wQؽ=̺:hm؈L8 )ϑmUˆ Vx^,7̜dzeԲleue 30gtŸ,I )> 逸$^k186-yɦ 7d }pu LZ[}5CBVO236I1qF.2ˍj8ڲQL+C~h;wnyE$Xu/Arz:#3-So uJ^j9[֚TP֯1v ZySj&I&i!j0zC5MoJ @TE4dn&lAr)t=^^+{J/ 6"Y2Yy7?"g91ey'MEs?D$I@V'.^_Ꙓ|Mۗňd"0{iY=@Hu["7+5`õx(kR{s'j#h`g,ut_djgW_z]4Ͷ%[1wNü ɼ mapMf{ 8dP8ٲz]amW&?,K 3DlI!"<+~2lk75XI6ME;Cc)Ky{H,(^l;|z[zj<^C[ H2K z4>j:OHlViK=hHԎER~Ӯj%B(kMfWg#ԉDd#Eh]uÄֈnguc`5tR#MԽH> wp G 00C_3 C2 #Ro-qdi+Yʖ6qCwR.qH {W>zqlCw$ J, hj3l TEr+x>VÏ x^hx:&ڰIPxi6 <-b6s$CB]ylئ#fwpõy߉T[.?}=t'ږ-vx;Ž /IG<ݮN^c&MK Z#ܼjOY pѧ?1̸um1=;LϿܞk?>LWWq!yytNj<2+C9IqE%0`qV~RI\ EKy"֮8q,)~rfw)<>^]cN.cU޲㹩L8 eU 1JYmefuh)X^Y:jO  %./nDHYf7^2 )I-&1Jj~BaC={H1p3rXD8# sͱܮ69IAGcXi]^,x(8͒oN D^Zϼɤy .$NbƩW9Ě\fJ  6( bL!.mȔ0e>=2m )ߨMeNRWOD ⥼P+XU `pM7E q>܇'< \W#+OؿIĀL^'*vx>>g@e e#dXA vXx!\5PC MFJ oV҅vR[xx\ʏkΑ?K.<^{-vl|Oٛ-7o~C}g!j;}}K^rAC ;[˩oXʹ7yxuP[XuWLi(D;p|f2?k3hX̚6RfNNzciñ‹CS0۲ÂqZ,/w;vKRU`lx#> ԑ$[spd%fXXGPGYMD6eHeCGqtdNN-"EGAIDٿ fwi(J7C+NBv5wbyl Kr ^܊,K?{5j wޘzu+A@lklx+rLm meCK$,r5a6c bT4Hg6]{X5`qNQWVh#c3 wVA:V垫: UV+!@I]wr'QGkIw5jZ`:йߤ 2n w+: UA2@B#In#}u+7hSG|P 9%0AD ՠy;c6پ^ؾ,4!!zL%$ 8*5DD|&ad70}Ŷ1im{J{Gϓܼ*4PF>{BWEβ-ϲx~3 p\M`vlv2 r]w|\cy_s}*x-#)`>jØ&@یIJ/H,ټ]>2mngįF˻!8&3 'y5QDʮԌ7bBo ؛6jٕ$UKMEͦ@|n'Z?=1x(t"f5ɍVԠ7j?sm!DdkQa H0Zԗ}l;5faXjŗ,qlh,]Koe|e|"5vNnYNHXt7]@g$`ݰq0P3MK ƵYi1klwaن]dK=n?Yͬ]^qw9Z&4AGƣXLbٞ}J:Xr\rI3nesE[qoecvb~/?҉c _6ʴvNZ܁7tsf*vt<;ak5`pra6Ӈ9g~f*\}[;Ƨkwr*Ý_?iO\>T^63zV;k/6ņp>uӹ~fJ7|%gWw3~Um\ IDATwvT(KVDL1IYqj՘]%8HtcĪ[1h5I<㼧?3}8\*cd[-((cHO뀆DbG*@;BCV=[4Z P7ٟɥ.%3`oY8^#M`+N^@[(e$M7Nf[$?i;Jb|OJ 9!CR;N_Hz7|T0A$ds94j.#kMPCTRE( e[U2u 6 <{pT) 73+,:/qVc/JY\ I,L}0 p!gl[Ė2,`Rr8-LUȁ0{Il$gfņ$11Lfr6[ h<Ս5]U}.vD҆_LvOeYz<~S7F%Kkli-mmeCK)c+/2<^")CmZ>%j4CaHMcUtwxl@oų} v톹g͐ =+=ucv̚fXVL4ggX5OǶs,6 mXϟZvjcvĎ8x".8rN#^P!X6h>Ճ3l(tPiXVä=tamqgodY{Y?fxfu;N~<}p\|4>Հ?~w|V~YǞ {Vxh)kD<㬘 x*Z״≬zujxFgBȎ _r琝k! 2g\F# \LB?oCMek ,bJVM L\Cu+,L2.B= q'&Ȯ eչo*3 AA4mU mF{oc {ۂ& _7Eԅ.|!ey \;-L6ao?v,cvocm6*|_Ixip(Jnh:m^z%RJ/v̫6ʥר/ډ]/w_ qg╷99t^}f&ݢ ?uQ|⫹~.8-x֗%YqO_: z8>'/V9v~vA/-qo]I<0)51%֎L鍘ѓ2X_,a1+yJ.kLJF@–MSpjHSDWFǖ\4NX+}BP:p>o<Djcq9C]H_A+H_n woH.*d#--+ L^/qp/M>$qhM IfI?wIf́RP.r)什rB7e O To{G1P3^lfk "& TJV#u}T,,Cklh-I]r5#Aц<$AMs^շ='e33iuAE_aFΗfleh'VV`֚eks4goH L` +j^رgu.:j"r64-mcQ\,௏9( |( 8*$%$96dyݶ6܍n[DUp1I05Me3/̫'SSePX<]Mؿr kN^%Z΀DlĐ7^Iz{ëg>s OWo/2C> ME W= \8~hRMe>EBM|aH|4'u'MryC<{JHc AlkG^| /L3P6nu 7/ӓa$R*"Emf&AL 1)RI)eb=-V~>0r\Vuu& 𬖈HV+MWUSHjAH~ Ufp5M %^[rVw҈,XJGtŖފeBfbi)[:Ն"UdҼYn䮓?5;$Ciw3e+o)1cz?Νʵ_vk27Z9{V+Ojm'n뷝tg[nO#ٓbfM(a#^Ym3N050݊rԳYobUϟN>%+2*%K9DevЎyQF!+g&ݗ)<+A_k6 r᜔+ОB.b!) KCLg5H[u٢(QAH}ࣾS 7z9] i,o *[=׽ژWh!Ƌ_ YL,kAI:-M w&܋L Z6.I @gL`OFM!V08gADTRQ(e7cIC}W 8${Yó8,I}S),͞nfeZ4atMUڽ ޳ a`ؓ^ ΔV !ci8OC݋Ds\~oMΠUWvRF܂LlXgdYX_gXKFH[)[ˆR.k1VlĠ0U oHZt7Ned%T5$W0Zw*In5`a9W񓏰Mg2l=`ͳtx;vyg9f88^cs!Ų`г`Sleeaj/ixGo0+Uv`)t 9;>XWgB-e*cY9\fĔ.ˢ;~{AOf厰mMPuv4\߂'|1{bʕ+bGfs<?HK?eǽ3v:>W=6VO=Gg@kIʑdGF@(J`m[Rɞ(FeS6pn,Fe%+c(23N#6Q W;@2σ"#mLW@8!E'v&3nv"N)8畑z 5\ k?>t27fH>q<_wcdW$4/ߗIԨAd r1Ne#M^A}JYȟS A9cp]/HA7fkmDkv s$0p9h`{OS$(tڛXVW"X~ !Ck6}rw=ݠQp620 1ЙMH\h1. [H<1l=V5穧>:l='e芉D4V_!9hfl| VW$PHftE&~*iP5ԹjMr3y_Dq܄kz– *@pCIK[1cO,I#ըvH~0swðsaY#s )y -xZKf VH>,Z#OkYJ<N\!'06Թm$9nYL+h3VL.vN'xLOEb+-H.3P v YF-w3@VAƦ}:. _3kN%Y " r>蚁(36zE,vc/_ط9gvr-¾L2^j~ W`f²&r:NLn*CIl}U& jP)c`  ` gް̀*KqcXy~)Z`h-#U v.@S 2P(U$ksfIBaX&k?Pq 5i8ˎ}~<3(L]7`M~=[Xf,ҳA` 2 1~ICQ½LJ !a-6cMӐ6ڞZ%ȭݽ+ОµOTI-k!ǎ,,= #(IAVkXC I~$$ ĔߪJ>ՠZ՚a1HS7qW&zJxG`. zxG"\XH$feV{Z#K9;V U-axDZJ< hh 8JeK{flUDA/I<}[LK a˓C3ٲtil74x23u#Uv`jwB4VfQS;=+V1ҍf; 3.yl:~oyoɚ5 9.ZG9.6Uy-fʂq^3ާxsqf9uC-|ntd~a"[O3,R?vC^>py8,ؖ=7pN x8H O]o[Wn<vf5x:azǹQx̚[' 'O1tuĬX*bKYfNmSgFDz~Xl2fν}L`+?ʥ[IJ9+>v76pV4% r"M3.g} L y^,b<[<0Q) xi=v3c4,+<vdfs+<$=V2o|m:^b+s]9KpijKv1+eM >:ouY /|,8ՈW/\s饗b(7G%.?^w9 CCNl笿QIReDOO;,ƲnF0 :ZD82-{XdW80Խ:e*%6KBHgYpAl*d) c6"0 66 /^y@&.|2>]Do(HoPg5F㱏KH(5#46U+>k xP\KsּӔ5UpI9͖ϥM# K\df/.Q"Nqd KB@M`Y>U>b:Kho`z~Ӝ R.Y=0a6It1djd+FWf`mOlGc8׼@$A(LsvzL|_[\a6YiygDXY cgTa_8"F097"h<Ñe!+1d֝'mx:uJbR>fu=ed(~K2`h!de>9 bxyVT7:sN~nx|-o[~nDzUp~ Ou4ŷ>g߾7mKNZfb=g~to|7>o;/nx^?38ffuɅ,E,^Ylmo+Kk~ZqsW~aEL\:0玱):ϲvD1v-f矏iۡt.JF|ZI_̧[̉So3]΅/gmGsKF/nb~]L>#=i[8 :5}_4yGuxgof˞unz6Tҏ\.s={U`a'l-#;=k,I-DL(1#尿CY7)<'jxRCFSyrL`yƱ'*ݐ' 8W< IDATK&ho/RNNX:ƅ :A:S28 F6ModHkh$7 TO H-K@bɃ,\֧PK8ZZ 3TJ Mqm>?jt, u4$gY(Y}FY&#60K"s٪bJHY)IG$Jci4:f97eB")<,+:5{K VWZpJVv &:EG\ޥ8cH`!FPS!%\C TmMG mELk((M!PhhdU5P/^ /7 (}˃cX=M} <l=l%5BYt|[brd]SX쫌m/)ש U.hZih"yج^O}*P(<6IJ5KX=z/IA{+5YNDHQg@'&,53 Ds-yvMN?Y eZ|qiR)NW>HygA;cN.r_ r8¦6h70ٴoo:d uY0gD@=q^[m{"/ITy"+}-Ym㐸}"(RnZz %rxUn>0'x-25+Ҏj]@jUX2ժ,U=:/G Q=9ixTa`30fa/uXË뽋>kƽ.DDtW[-QxK5 ՌkQk=fLAޓFrO"GWVg$PK 6g^J԰d'Xvh5>0FF՞W{F=} ݞf~O}@ lhٞS'/;2!~8ɏ{:_x~z7sCXGda.(O8>{r涓7.1'mކO跌 mc~L:ܽ{| |\Gr z>t9̓+GyAڦeĿϑg^{'6*#޹:}_3>U8;{=,KX3xb%=WVXF-wftHjՀ՞5Q2-r *=kj\-o}K5A/I1*$ xer \<bS~B ͘ҮE%UjwKߢ3(OCzy"9h|ΉOgɓSAAR5Fq$&9X>Q{eP:Ojԇp.,YIC32l#*a!q[o^{ZI{BT%|&5x/ Ah$SP%>%@p-}8x2 I*|iL@/{&cJlPo(XY-8$`3#}cXaJ@AHOItQ3S܉ϡJy,E}U"7FlFڋ.Ey 6 -Ɠ zZ!,.wOæ=8x᧖pψ!Ym8[5pCzV.sFni];`k8t߈#Wɜcͨcvҳ#3o3݂V\`#t i觖Vxh;r|27)Oh;30K^gx 6}YԱ2¶*YR~ڶ>b4pTm3H,[0mydUxg,m4̉($kQ#pb'=4ճbJ߫毂^  "\3Wr*8d!  PBJAdC *k CIPiC)8־z^un4lM(Kɢ m\ղ礲xGS;{lXV nmt/yqՂ4wӟv<9ZшҎg tĎi6Y ]U<&Gn9b߱[{[?/_}?_?8&n[(p1lsf&I_/̓r++/}=}+/ssuo#Q\q9p.vhf~`xtl#nݼc]j3(~+^CÞs'l-0my@2hcU^ie 5K"A~#+>_ځiB)*:~]P2 K2 TZr| 0}w9':ꉙB9^~uAm^g`3vP^{kCoKHrWp,W> 03>qjટHAc'R.U!y*x_ulu]AKz#L8u{mo_L`!F.}ZVnY@k{=>a޴]& *!\Zl^ Pp \u_ZgƮnNCn{y3UHm={W!9VZWi$ nLJ w烿ȫ:Wg(fĺV|0oTlJ)Hhߞ&<A`UH3|\=zWT0LKͩ&';9W_DjHrײ0:ڈEI†eilDK-2ݷL,csYx07#Q~  $ -@CTg똜5Lyμse7baIA ~dsNϦIGa˗:#3ej1Ka[﹁k9ky6Kc?{i]OV~g~o/}1٫8ynnfüSo:|My>.|믲tJi>eoy^ oW< Z<0gx/\v=–{Ooq4{^77ɭ>˷4ضu%/7x*a^bkt?d;g}\u+G<*LK>rXkoµg6T\쮢02eпZ_)}^ %79y%@ƌ-qFf K@k_\x`Slj})GejGس}M IicMf],@}_{Ο9_\1;ypG/Gg;'O}s|߭ _}q߱y:.zߛDs>]x甥ko a{j޺÷^y碩g257FoeW>Sy_ c;9k .?k o>7\ǮIllf#h2ڝc'SY(cӴEpOjAg9dUAY08=,61) S^MwHFGo=̑D2PE֫d'Ne*aQSfT*7LͿ \ H [P SI1O (77صU)%8lU"Jn?4m3'G+ۢ Ik嚗X'özvjDXN%]mݫyvz ݮA$MkQ1M$`1V1 j!E]ιft"8!S%P8[.#$lޠȃ>uv5/4O*6,_a% cis.ܗ|>L})_Tº*%PY) <.@^/?}y]=j/S,08]h0c̐DL_ *@`_[`w NC?G`KW_WR; h0[ ػ5(kPCk$kWfUQ)%-cMl,,4?Z&ur.AYֻ=| 8oWOgJx3SdJ;L =L0t{RS8šrm ` Nҹ$bӉ-D߂2Z&9xOɮa.״aeex~:V8Yn^v|,xˆgx)cО#o?>Vy?0$0]wrk?›?=y+W6|y%KϠ{ػxa{Ľ{[w0cjT{<mvl0ޱ|aߖaIS8ǎ݆ݓ";:+ ,~ |絗N H2@UIaJ|%$22c4$Z{kO$%\J"qքBAϩa8#  /ߑ2>H 5p* KgUYʨPk^4MZ& aDQ[s]j_`dCz+ďXh+XcM+rmJ3!.c81.$D^0ΔߗMQ! 8*GVRԳ-WwLBz,뉑 f*[ڑs3֔zƙ}g ifs9qٿ{U*<!aU~=F9 [M O3}R.lĐk!bP~îix|R6MzRFlxȰ%@ o?/Yu[JBx=cn>C{vS rnZɠnoYh벅G z @_=^@(\ N]voҝ>+-TSL,MNgo_/s`:!O w*$~{/æ{Gs؊>] e8h_ tw3/뇖rpa1o:i?q~~w>tu1ky4 swҝEv =4t oT{.~k]}ox7,~1~t S_9c'3LX6-}ƈmY| +&8lm y/=O _ ~7ߢw |M:Ⓧ1=e09ǚ.tMvwqоC\Ξ lVN3.+ &oC O+&lդ9RؓĎf"pdH]k?/<&Kfs' ᾗe%`mm@''q>p%2MQ+i7  jb\G XzXe˜YKY\l K)N`Ӳin@b$JBKbK0< 3w_2+ՠM06,hZf,`p9Yf \df0ܓnB=Y!2H$Jb9^ih -Un7B ̶FkyD#;e`Ǧ6& Ls,Nj~#u aC w8ؔ熡@$5L+ P㨜kw{Ym=崧tJ8V '^잃3t q"2 f3鋴l/Wud~U"ϕќlt@[iT}9 fllnCsr̾ޯ4͚X?8nԗ lF% D*?$,G&M, ZFvrӊ=DӲVڑ]"}W3bhƾ|78D"Ϣ}س6 x3 xO[xVY9v+4ԻnZO3s*o:DYZ4 j / C@yERhP _Yj3C"KLvqdjG!B$}(JHɫ40?S_&ƄmEPJ ng1.w{@Y~ν/i #'or_ɋ*YJ֓зeEUV'",nQD4scr2 ,$wt9!cuYu vnjl{en8teΔŽB:̥L }L07Luak]$Pڕi7~.S0v;3taoar('GVlNMP0ԂahP#m4b$2ٷL=s{egM-ifF곶beedpʣCCmfSeLϐh5, :g nٝs뮜S96E9.Y>]V9 f"<{O7=| O\0FܷrFˎ=UVaypxl>)3[`s x`9 frìLLch˹Q%(#F߭Bn&$!1lF,/Ռ Df3C CI`blXv"% ZU2Y3]\j 0[LDaa,BnaD%W;& [n?;8vp7fRxt6wzn<+G=,Vxlo&vsDe줤Y#s۔ig#;2lga|_D#XPͳxg:cd0ԁe#̳u1iAh/"X F (bC'2 sʑ dKܰ?;YӇ^t>ϲ |oe =f㹇ͰEyV}3\SЌ ]L4[0dorѲT3׷2G/% pX#sm[EF2) n zfBGdQk`FV$Mm#WCdXdIUoe 5|fj-`L\D8^d&2/7*.퓅_#`}[doGjlS 1R.tf=nL pG>N?*'6;asµL_κLtlVWϼL1T8.CViu9!ֳG8l2#WAQ͆D+ٿzM!\/I^NKf `/ dP&*\yOnj/,S |¨m]- 0f j;yj|ycϠOI`/ > p}%|a*@6ճFU랚J&đe[i/&g;dS ps39aw P0` HIċ#x6e|ot⩎q7~CԳyW^?w%;qz$wf,SͲW$KgpnΣ/vpX _ʂ"o}_Lzi{=x3wSFC)|Yg㽜~p!tEO},Nt}duas {v68cp[)ݬ9o!Xq{`w x1\<˭1E }DgkVgvpݻ<ŋ2j3Y9*h ̸^A 5͎g.):~ZjzZ GrN Gp3O8XeZYMf 6FAk-JZ{\t,s9_5I rec+R:>e*⪆/2ue6H5'( eҔؿ֐ȭ!K Eydp-Dr!j*hI 8UpWf\k8#,\ K^bd 4lo0%%Ax ҔH46 G"=PT}LQfyG@Љ x- F3PP@ΐXO# rWެi+ es`, >]|K@(o:-eWZk-TB>UBrY~~Tdȋؓ}&F~-"8jV6"SchP~686jH))0eFޮ562!a x m Զ)xnb^W|KŔW5t *Yow}zMv@ءzi_ eŢm˅^b{MVe0):/!XY|-?Se}%^(P|+IBe].Jɹ^%ywoQ&Ǽ:ć8%pS9g-[썲aZc|楞 _wTm7T_zf;J)/^Ʌ/_]σ.dT=sGɚ+<( }Swi`x}<iBf P7 ɮZJISK.eH ϫ~}eR}O?5*Ioi_'垬/yS86 0`2La*L3zSQ/iм g%`ۈG$:Dۈ9t1eoN sA>2^KÂadFS_/j7fg*LJ1y#/[!>M.|+yn/[lAc`ߑ*L;r6.ر8VEgpa;9Ԙ}`9k}}asS7?`+›…|=F0ky?2WߟJ/`I9#o&'>k>Jo8#1<3uck%|lv}ʳ_?y |K[ }-c_hf!٦^rѭ>xᚹvAAaG Se&ٽ_[zZs/(=d~X4k>6D E$`uaշ,$i;l{1+9s~i랔ǣYF|/yg['Ougy ~gg[?F3,Yrjx2v$XMGkL!`.EÖvis=+湣[rȽGܢ3ʭy#0Γf^prpEGlm 09Z'SF${ԭ^4#t@#uMP*C[_ȲLy3_ڣ)j}nݑu7@A:S9a_wX 0c-`lo[((~>0L ?cbyeՙoG'Hbh4H14144ZUDd5hPwÜUok?paeʚ̧|+ em-}ˠeMh64[|X`_OO2#}K諾Fk@U{cu}N Sz u.tc );8ąTb%Ӿ#lC zeث!"<,ڳ0 Ð- # -+}#q4ϖ{Xr&f-ERy AS0u;p['eDYd9varyĵ,m>VGo0&[^ou㩞 ?Uk_ֳpcFC\9fx9Cίrwܾˎ~ie]{ 6OGKxùZ0t83=;|W~U}o?r+/'YHL8̭9;wFvp >!=ۻnh2XĉǬd.mv_%|qv~`%k:w|LV梏\WvRGyN{'7h$t\7ypaaga1v,*-( N)&bpHI"K4(H]sO?w#Q/!R@S.85)Hލ)8=<Nޥd@>9O)%P4¤nw}%7 Fۆ!nZ'&g#̲TϹ;+ i!8@߆MeD *q?2? ȭ/3E2C.4^kZ"R"<Zdpr0 s.0`)MBO6 IDAT߶)A`(A p'6#/Hx{IXAi$, #b~<[?H@ +R4HNX%+y*[J=JoY8/3K9潦rGll4"H>KOǨl7쭒,Ք;`o q5r^2 *[Kb/ +}U2xZ?DY ^ l⠢[}ae5ų+V,oUu_Aj?K_Oa>Ы`+;[s9Ð7J}@)kH]/@ +7 <coQms^Ω0bhwK9 _{LB_P^=63OugCWZ\ | ,a'|+_b*X =ZYՕe]Zv%ث3yM Ar. \YMS%uCTʧu7նԈsWUV:qއt0]s*U.Z+8JM#̙iG)viZc@j"fL:a2sKrc$a0Ma y羊_\mRg&7Le0z^lFgxF%i¯.{_p&/5q!6gu+isvOe<;9g _0=v8G-l -]O-9wczqŴ׬w_ Kq 墄u}<`u~|}9^ /Ǹ6fr1G;z`#~K~2}˹KWs ?fmz*w o%x;[NƇ.8{e8owR0bK$,1:,-Fg|9T1e0!${j` +K#'9j <Īib]|5GYg1X~IŠkB^ٿ2g%8{ W(% ++9-Y^S ϡoIׁ_AU)[yM`०G *v57HAWm:'=kw(K`hjW}JzaY5&yW)T ҃7}S6Pa MlTi=P'tq,}d $qd-"z 3aذ 1,hJǎ5đc9i S0VLl1ԝæo ۡ-xl,.0oԲ{%/['FǕcMlxJnq/ ]?oq\Ky{7I]ўqܲѡE|Crri4,?|0yxlw),YK^gWx>Ry#~}G羜v2}õnMozëOt?OMw \é̈́ώM~̎G,]7ZmƬC;ϙaogˆU|!oط9!ϑ6p9(g_x7nGNcs8fң n$\;`o_#Z\bQ]v2LcuLGǦŽfzTj֫ĩ$ G8z*G8c>}DJ5 rM#+vzHU6_$jFZoW8n䐚ED2JB)Ub߾hFpX f7S:I+IiIK̗d9E#<0[!F`JRׅ ˸JK߅e@k^=Fؠ5%Q"w$o_=ְ~ޓ{3+*<<㒺ڲSHZL#@$#6YỊSZYp?pCD[<,3a~M^ K2Sn_C2|c P&z0(֥  8 JhJUo ~mV O,"cN+kt &)2QE7+txvU[ԖW7!Ү,ZZz<`Xg-S3(jZCIbMR o\5gHOLLJqgw2QKۦ:5wt0Ԕqҷ/bRL"1cR3҄A Z"+~v`wҟ2Nq>O;q 'rL Yƛ,|ۦs{u K.-إcYʭF:q^o84ɝレ8?-,qc Iz 'e9`7:8NԹ .9$2in Ox; CE5Ò$)R< M񌤞y Xh8G/6%bM/䛮,TS4$U8*IS!}Mp=+c $ e;DMc.c*sQJmb7$]{iiP88ҵ K&hy䀬* w5o9GYܑp0:'|&|=SBB!JBCV3$!QKS{u}8Tsr#Ơjn3Oa.HVe]qzIZ(k,ߋsl$q3hH`1SE0>k $QFYteĀyVW':n*<d,fWJ7P<'<SNZA<ד)=iFp!/e=Qn%2Il<$qJoɵŦ 7zj|vk+6P^,{z;jJvE+vF]L4@c-z% +fa^A7Z]g7'&gRa[ ivikm̰`D4<6ls ;XrTխ3.cx0ccQ`1}e[2ֵa[{ L;OӉsZYëtziΆ93=#=ܑe4g8jxmCǿTйyu~φG} ׫ḗ_An\c>0.|R}O+[t8-: dži6Y5gd34Kb=͚%2JFLf3404z0BuyTi`!3kٳvGsy,;N $6DX%_B: Siʬ%Y`C&2*8tڅpE2&L $IĨ/ұvZFrF>Vv.1EƖ3e<*:,[a_,8 x#{ NYﰭ]{;aCJBPS>f+zTkgs N6J 5SkZUd\]:7*Љ/U-tLz 8ifd|}k\{ॼ d|b^4zs?; 7X,@߁^o$(ͽ!oz+HdtC-0`Fk# @Pn=Q;ޑd9[3SuR49d9pܵCd0-ǭhnűb8cu3|? :ʱ 񊩌\G\7>}*\Kyd(5ZB=YnϢ s;RF^kM?]cvs%W 3.[ }9n߻<Kyi bG(ܯAne_b^7\qK82(B{f y ./&]%'"SD/% Ljqd/(~@]:]/IM]cz=!z{]uȕj 䞸A\ϐʸ ZFRrB [X+1WQ+يwpR$!6k! ) 7?|1ƱaYZ5F'kZðh<:`3C hH-8 +oh=s0w!$֚iÎ ^~'{dS]Q<2~:3EAGl=G출uFZ1~mnS L' _5Ʃ<l~<bwi/l#&v7ZSMzsonYc3~>t*v;xis}r>s\~(X sYO8N8$簺V OD\k{na҆a~Ca8l*$9G;slۑ159dvoHo&:I&%Lj()HTЂ g[@*Wh*ֿ,g$rI;p^IM#$LjP[7zHƑz3qC ("-U=~3jk`=uN#.5^gdfr#1z^5q85QX.<}EduLfyڬv(f%˫U<>|,Lϙ Q&cHHY*5VɀTkg8!R :Uz%|UF Bh5z\xXyhPbHsJAKS_ُ4\h'pS(VxLI.ϐ IR#LloMP:%PSQFےN$X؋j,oB7(]d%K _Bg-6#MNc c}Yaac5ؾe;o}kwm1^wo]kH6y 9/w8eAzGlF^+:: ܲtF2,Y-DZ9ekz+:9j# P9'$NZ j\v.z27G׾ZMj[;/ykj&gLicdCPdȄQ_.X))~ 9wv+@δjg㮹E$ x/ H"R່IوPtQ ?ӗli,*SO'pUOj TV,jB#Q4xahJ'j"u~ ش.JAN@QE0d VYPrE!MT1U"XퟫoOU!Hߴ'YHRWw3~v] mT<-ΰTjD&CFAI_&AmU 1!$a(h0Q)j KzaQ+׏lՌp('"貲/EWL&.Q,t Z /b*:e ZWoZT  1ZY) JTYjLŲT`T1@4bFm8flUB!*rQZ®r}slFUFq󦴋v%SP /r^Ar:zdȸ9tR#5\,*8#*o]./`UoQsYNYxlLY=FaUEUb )YTxd'!l2)qM<)&rc !,swB5 LMiiN5߅1>}EU ƹmXYr yn}G],(uS%Ӟ|TSu`Y9$1{HrO0`*D%JƒWSL63i,m i!K)+N"uX cM9MPCjƇ>圯]5ha$9 wUn&canja |?r֫Gy3&ș,rp$xM,`Qs'?MX9|a ?RgwD珿bgY1r{|/}y+Ngu$wps\x٫}>pĉpE͞-=3N:K~}ҫx;O]精-?B1M틜tO;ZcG/@Q禨[<8_p` Ԫ}įWJ:C?K{B7725kU"kRZ(z><㏾f4rkusg$## n {]H-,cwh2fB9Tu!(B@*o=Fi1Aa l#{u}O9!or#BHlE^TYMXsz6c+**x:"d,$,5bldAJ2å)7zk<pb^b*^ 7 d·TB_RQW $;Xy!^L׼+xoogt2p V + $sIϺqXóe3yvw $r EVdzi6}g7XّF,aiϱk;beemkӇfc-_ 3EnRk:F0aylKo8c?^>~l嚍+.{SǼ]ʲ/\_]/0k\q]Ϋ_FvKzۯxE鋮kƹ\}r0#~Xď䊑:;~0_n)wi2O3⏏<待yQp۝lsn[:wvn3܍K>sW3W1/}_ gR˯o#//? {qp]rKk9ey_/Zn̝ O_0o}r\󙉈:Olc"qϲEvygy 5>QfFl v]3k!˜aдa2N=X 'v4uƑO;R5uԫHte؈aP1F[F6+?!oZEBPeV*f5Q*+ā"o-j9yZVoACW ~@j Y?Bkp 56#SIޗo}D۩ +SUUHj~fbaTKڹ^:QS $뉑K),C $J[v]F+oG@x! 6#VjFZC7B)FtU~S%u:[ ߼~Cc8`OZW-z$~*v }J-3/_X;c+d`OHV4,$dXb!1b %r^]zWl}72Ş J`l*J`q/AP7/FJH 㥭P X$0%; EDeGYB}wV_2%$jڝVmo9tA&(rr!-em, +!+~"rU5pDI؆QԳSXfO;_N{Q;_Z+;_J|TqH>c9)Gƻ7n%]|([7t xvmwKof)vx nO>x{q;r$s>#5לe߻Kw97 /81mڽ\ol;m9r\~_m{=oՃљʱd sGy褎Gƣ3):=f\J|TQJHr)+ߒ 6I2 !sYm=V.Z CODľR`{ރD2+Ĥ>;R7 ."KlMC |p-X"f)Xg)&UH,ikp)ԙ<7xV[y@au[FڢDؒ49)ʴ@HnUFG2xyG1<$zV7r7% ,XF·<:`P(=̈L!!7J:M rTYa4V1Gp,g*pg_%=Rӊ)$SkuQǹ|NX7$^lHY#Tk5n\fpVqd7+į7tJogܒQwMC+5zS|ԌEЬ <0<{pߣ(j+&!3W|8`LAɌ`R1< I6giͰ"1Z==8Y;y|ҳ h8Ɔ= F=73gs۳~S>H/j9hzţ1{tc6tc~ӕ<83s\d;+l#2R daͤg%_/;~G~B]zjq$w}~F*F}/y{ fi&=Yٰ 0i<< Fl*Bz ;p39r̈́ƗDڮz& _#54{PO ugq\vͬkVǓ%: оi{H]UPBz CTp`3Nk # H@[Wٲ!;asM4* ۙ[QG4 "962J)j@U3(RL* ;{Mܿby=LAK%zVy%~)rLf&![HE%kKJ+:ے|6?y$hv#cʚpAa޽֐Uogdp7QQ`sj,LA@n31\ъsT!}Y:qx>/^)[\zΫuZaQaEJgӗb[yp̶v ,}5 t,RX@V$&jh0ipt{~3!\2Nc+HԿ9D̯öAؒöL\6&R*St"C;VsڟQK#] Z 2<#ţu3=E-X1/bz"Ɵ]쒰Q#s33ۘ?lpAAղqK nK,~ gkyO}xN~ ~c>_К8oyIu1b>{ oȍpFvR>jg|z k]+g7 kg mhn#xI\U+_\ד7~7KUY ٿ7/o<\pӷyp08t~ǫx'dz~qCӽ,S,;t?gikY:~勯Do`1 ?yp8K$bu )W_͓sw<;ZsG<#u`0:d1lB]<-3{}>u$#NqxR+$:;Q jSdހal0oUzZ+!\N4Ewy[AF [.l@aL.ҾX*ۤWC[H̘@y_SԿHbceDRQWK$X1%y:9tsh54fqdsNp|6rdp;-t7S9^\<7,H&Yy?JV-D`!E>nO( plB`_ r.cSQg8|T7UZdpq-EElٌXgUJn@^SΗCJZ* Z|6g@T 3g`*ؾ!S6A%u[ܫiܣc5Qy^ͬ)A`=]^K+TϑӇ$H9+Hw:nW Ƕ$w J {qEA*xK{QduU+A<.gm#j Ε͝ZT;<=k9*8g^LF)rak S9BHYjS7Fi8#u| 80HԹmDB7"!~kJ EWӬW^io;q]Y_ab6a.o=F_S)TLu|nDDR'Tװ-Ɏ,0cZMs9pM #D۳iRNvkߑtx14:_y K--r?oV\E ۳G0gttKޗpmm3Wzμ`o2?Xr!ۓXqx+K^2ݯ 8{n)'?'>.ޥro9Gs[k8Ŝ]r!'ǒY9:ۃx1= 6߽/{ wEy=~y#Zf gOqz 8wsߓqmKSwE<;5_S|,ᖾeC3(m]SmdꞨsi\sQFȫN(Q$.ıU m?n[]oxIoWsQvrC'3Eb Y#qa,\B8uez֬3I5@wkRGȨMxuNJOu2hDIM=3E__eoaqyVڕ]8Y;Y;8d>mx ;:znF 3+SKuKԴDC>ԡф :Z̎L{&G+ذ>y3'g^)GDKєѥNrVs-ƌ.5\6`>7 =a{jnXw;k|% 5c9w ܃,Ml0lY˟IaG RXh{me3ygǴQG-J"C-scC=sHCAm<2 O;% YʩeB\(D倪uj`(8#>E` t .Tέ!ڨY;&{&"rJAV#Wo&ӳj7 kkS?(1kyroSMUoQB_GVuVf96`T8vr ~1 1BVcZjE-f|"T1"TR~k.T-*{N :F.Q^3OG^HwjW^Jpv3j|_H^?|%X*e>xk>S}+WP jM2{Zܷ[g6Y  zoz^sԠ[G+D] H@nNh-̤9x{lų{Ɲgt$?ynGq.liKv Y^5- .Ox{[#ex|6fAɅ}|=.wO}cN?s)^AGXr8{.X9,cfj[w{xA+iۋ7G.8euE9x36l9lxZG`Gg9 >Rvipi\vyUٶ >tziwnZ¥]U<+q 'm0\ ~k<9v-y` ^ȯlxt-5+*ÜA@[bAx^TH!ȑ:j8ny[+),r9v.U!L3&6j*~ c!V $h_]2__BO^4 ]p9C) q !!:C͋i`mFJF7 kmx/m$S0Biձ\:m(`ڨ@|լ\[*)/H8|q?p2l`$:6ٱ E+U잃WTl7>)U1խ=B*gJ)3=l'mmUuvxgPLF[ׄi! B%P[y%݅~=$jɶ4iH7vo(XPB5EX̓`GIzQʽ_Yf(Ȕf%AXA%$r/"(諽[~gSA:@Z\U[%2гQDyrfPJ% I&P/Ŕ Q\^A fkV VU-Ѹ; Kc, to*WUJ8XKPzYJaq(mbt[Bܠ`75J[sG1֩K"HV(&g1bq60hU Gԕ1fz=2+dsPAպg'Na=ΟV(Lqd*,߇q}pP ˋ)=,2>(3'ܶG1pV~.7mJ['8_Y&ɠ/'>CI|VI"U㕢_7`r^ $˸{c;7J{Vc3aỹ&)[PEAhBZVg@-f Hao`uH j<\VWJ~Ld & bSXza:5L qie.PӰ# ?jfw4RT6O{6ODWc Qϛc7e,޳ $,],w6Ky+wO4ks^>}eEiMs7'Zz申fy]!ϛ{`7QolSSWѬi|={gvw.k26+x-Lg8l+s{Nl<.yrQ&w!{,3>g:o?pB޺|FزyX3·^r#Gn:惡u$4,1q}V+6u6mN[7= {=cز#gxd4sFcqzZmOyG$2ϳ 93YΆ-s܉(cJSK@܀ڽf^{C/u{` fL5=)zrz"JF%)D.o=r-n>LҾy909wZ.F~w"ИBQD FbCXgJgMgt CVgX^';+0^oİɈ7nsrN}vaG12SKWrou.w5͢~8sNF_WΧyǗud-Xt2-Y ZmU|?1^ ߳}n-[vv=7OcdΎOs]nӁ){t-+褏QGy8ޙCgYg췜y79_6y77MVGq7v/?W]up_867Tϼ~xt~{+|g|w|y=ս0*a=C wMKg1=3rΖ0< 8b ,X1 )vE4bG2goƝ #QtrkC2ȌgWv°tGRtRmf qԗH'a2jB( &r*(r`_iRJJƔ|:s0OK=#_~"Fs #Б(^שd a Xm#4Q]N"ۈM o=Q`bf r#}h 琇 㵛Ji=׽t!c40Qg#({2ډRZ/rsSbd[mۡ,1~%紫6:!{ۺRq:NMker%03 u(H_zh 7}TΌ. A[fuq0 5dQG`GueF 9przP`RˠW'We@IaS |xy9(_Ν},9c^@Bb[N̷{جxBi6*ky VGR2]`wN}/|6}).{`s^Ya)̺NC1K{ ^`0n9+.CH}j08Ci98q v%0X3Q/ojUqW4)@Zm> m}}\Z"/}9f@SǦ/|FrPdZ7S[X촾CDb)Zzϡmj;"Emg{ȋ:DY̲˝0# "J$2† ㇲ}¼/ {CxWzZ>׽ 8\ 5+Hqq $"07aC ӅofO`= COSž ϩL+;10 01 ա7׾R|:6N-چaodXfA;fɮgm VO JAp^5DB)5Ta-bVLYeMlgx58AlGdw8{qĩL3brֲJ^[yt v-+;}8~}_̽_ŞW\Oߍa㋔\?VRYd_z;Z4vi/'⭪\re9)ou9'="k٩i>^ڌO{vαtU0faVgVf_^#?{Ǻ ǚug2bߗ1e2Ogt3b%! лZVuf<)Woe>0#@@ݿf,E52w^{."}1b#?tdвٳ2\UٚYD[Cꐐ9+ 5*fjFr'(w}s023`+qǸwt~~I9<`>vZe-W?_+,LkݎOQaӾ(`]N=$nGo6TϤ>#vq.s5S @Fyc/~8/k~l&ʃSSWyt>q3δ)Q 'A s|EE'x/ =a|, r'oVT9?1G,[^ὧpi:6 k;0i8qkjQ5Dʻ Szjlx*uܓP H>`Ue$sp͊^)Νs*.! 6d_<5aśc.&ߚӗgzFm?Q;A_X`ׯ|<ƫv|Z'69!7mjeMqTJkWp+9wzP¢_s@.GkV,=LZj>f1q-5\n[!̃s/4=p|C+˶s-C QIaC,2G=@0Ѐj Њ6`xYv[D0:Y"83g(߈<'φNY_¤g@A rHb<)3CNidp)"HnɎVZd'UQ5cOt y.JI @)t3C'9vI|Yy(\Dfd _K}!+Sx]ȾMe80~;M Ϲܳ AKnr-)-*#h[Y;H"o}.j¤xg`Lmx;\ss2G9 /Ru 7|fq, QvC`]j 7QoJ79Pz_zQ=9wv( ew 6@8 L`yd3Eޢ)3!߼TMx]`8fg={2uu5߯WPREYFٽ pDkqlJV#vJ_c g5_~9(:~@>YibO:T5T4H?)TE7^^]ޙ䧲D%{0pDQK_ j^cagRϓgiױ9Uc^Xp4*8ZmĴ 2?+9?8+*jƒوm6ИpX6bm3Yᖁ O鈕3ڎ]f7ahKS{2bdT<㷦qg_/}&?|7a5tsEmɜ {'aQKNHajgww̉3&1ZT+c0ڲ k0Xށ鮧ա/2koV@J P/U5^T߰zbԁ"OT|!!\A`FSBQ%9Nn;TS1*x<*tN&{à pf}nF_69"z7g䇅YZ(Qc*8ɽWg: werc64|,Lto#> ^--&e`8ťN o@s') 8 aA& +kϱ-zKV.K#y&$dm^o+DJyw0A<=9_ 2ꐍ4:.Fz`O 4 72!:(>ޏ1 %&@`M8^nC !\y);_B^ʼ?nM͗Y  Hr~,5xkK0'5 ;C1ԍ%׏Χ_]%&nuw1ojמ( \\‘@#8,bꑈ[W)>, e`c22bae g" "[>K#3LvkhyEۢ[ؒ9Đ$O6 IE& & q:1eBdNmXV"d*`0V hb-$ Wߜ@L'>a .?}9]a }{~b:֠LB9OTt\!^3^[@:1o(yj44Ш\7%ؗd5oD -Vy*TQvJ9o4s򵌜8F\}^B5dR^;{A ֵU7-XM,A۳r:ɟe\YQGDdíggoϡCB'kuePvjAndɘ Ed2 RϱSDp;3r08l,0V@X8V[8DHAT5`;c=2jhVf!S-ePR[IUM9JOR/v,\kv ˰D)CA`KP"Ynز]ҨY$5xbj f01cX;9 nn1%29p'wݻ̱dc-ő;켏,.{W;jͧb˩6IS qxٛ{y9਷1\smp li=u;.ȓ?‘U9s77scoc="|?}ב[w=;.[X(_5&v;CmT _TK y&k Ws:o{7)o:ѧg8~=ݟԭ߿,jl=|/;V7>Ȥj/9_]eFp+ v;izH0 b^1VzvԗԈbuFT[;/)|%#ˁYp]M1Pcc`̐y80v4E)P/:rQ?<~ҖJ,7 z*u{<$M_k 7Akq7ME_#& /ePC;~$/W#dt/ֱ2aWW %?gyx27r̳ǂZXџdL6%Oq Ӟg'yq8Ug,\ LxJ9  jS?!Fb~702 vqRό%EEKZS}j~_{ye#Yxf^/5tmvpZ- #4k²5gw`D", OHhb9;nԲ[vGƫ2(OFW2O9OyO:Mh-T59de;ʠ,thkL \p,+:YBG[vN#1V@HuxB6FA$gJr)爣|o՜΋y@E*$] ,0#ȸR[s9~ֺ)pT%@mc+_W +̝#ޓr%|sV"aMʅO)\ 08Mb;JTBGI@\ގ,,yl%4kN$iTvvome^`oG#Ąu&8 B&o&%D5Q+B9wEFdYQeJ뺅Y_Gn3PQ9H@5L1z[лw'Ξڝ`zmypUi,3#ѾhF{|<859cs{@`f_37"S*`y0ʮ5^a 0jy {+K*|'a;;fH9pK% SqPRQPc {-zH.Wԩ$J*$"ҋ2b|jRu!lmluay`9 LK*'gf,v[ Rʲҹ\(CپVU"=(kECXv#tS3/N󮲍r< ֙E(8?C@à,B+o@τ-vU?gc"Xb 뻚"3rνԄ.3uܺ MQ]i^pW`#q(B Z_Q]~͊5:q k z )Ep+ `d0̴aelĴarJS01Z Ng~Ô`i[-Zj2P-s[FՐ2f3?n$0PHm=Sm˺)iT ocpgNeۗ[g췻af|Y3UjՈ+V{1v2s i{m7ö 6>s/~w{w,ݕvyoxK9oSbe'GчJyYyogቧഃe^߿{NZGNgdr_oɫ\׀79 4"dN#?R u`}!yQ6QJ5]a1t .Gy%nF )L y\d%SVfofM>F9+~,4˘JW^ *Pi22gNw"Ex|Ut E IDAT[/n_S| ^ՆHr #7Q/9cyPxٝ̑#W4]+ WC Yh~l`XU2}VÊD4F%W!LPEoJ/F_(9pyWpLzDlw^;cŇcioQfT0n#1Cؽ@/_m&lA "}yC+e͹,g>{X$%oPAXX pec7 1JOk L ڮJU,}!`[ _NJc |fQfIXgD&Uw2cccݴcr`Ooj`F_Q*-1O3IxdCTٜ K~O%ܺ:Woi٘-& ff aö/fs9jQ]P5ݕ6ч#ܣwrm7~t͍da6˲6-qz_zÖ= a=ZfVfIӨXbKd .YozK-dk )! Za%?Ж&4F&&9P 7%Dcj|٩Fy)=\yq@o *y-<: ULe#(?euZ LԈY))9[eڂqU^}nI68Ľ8Slhu1+n,CC9U{}xbƈc48TfK29}0\anDZɯ6~| ͥE%o+SPyI<Lt g7_D 80V:FALDQe'o6JICi}>pÎ{o,d`croŨ&Qm7̤̤:0tGf4_SLh=i7(S<| keMΔ"oSjU*ϵJ"IA52Q9k NDk"2D6< wԭr/9iU>_H7bT`/x#]Nɥryk܆yi\y \z4P@Nl5NP&S-3=_XںOX3}+9lSKhz=z]O+Ӕ ):(!MWseԇRiTeK!?l4+1lLˣ -gS/y;>t fzaN۩uYx397J-Vfiw< 7ֲϯ|OyKtOc{vq0H1{VmW8'̖49_K:-qi;~/s x퇽GRV}F6y&sPl$sub7191mK 0ei$wr<3  9ulx?z߾>F S8\iL,,%un!kzM;NntV>vM[48vIPYl AqkJ:J%#a4be#ʖô"垻>\TLᯰapخLv*6Cn8>ӒaS}v &R82ubO6STG g a|Z&L4 3.Zbt3d<ƌh+ۈz1؈mDojXjJbswZӧlӿ7xVܳw{|YvUg~GωG˭/9gW4mgJV_KA\V($c˦X#>Hb 7̫5 K,Y! Zk,rq697Lo*(1)|yt+%)OECkV $D kg SѦ{;AF֗`]E&$H:A~A u;w>WX2$ k9x[сj.=4)ɦdeS_Jtgy+u:q44lWItnWGD~<}25Z9a_R_m$sݳFj,4"YRZ$XJCRHe%6r%{Hk˕`V ]IK ek1Tj|-ШjKa*oTjY+Ʊًk?Aɠ~XcH"ZE|S}U=BJ3#}ԂG⾝Ʀ)>e~yY5cn%c Έhfvڐjc/eQIXerȜGʈG[斖XƸzw T{Z޸\w`aKxlV8ϊ;MOnEb?jYwЗ2r [65&9lǘ=v?:yã-*aܘsblۊY\{O6iy0:Fr1n[O^j7w/c1sW^Žq] /^}p<r[貔V/~s?zWӾ4xu>w?oX>O\O녟qg< i)3q_~lBR5 l נM6 Dqї><>dWD[W4$Hdei ѣؐĞ{/QSN&dgj-/ p=31+ %Gnz e=FEjJXr09TT@֎ߜ܅ cLX{K>{s(8ZM|nfo]mK`o& kw#6 +^aW*ODDa6k$<`:ƙ.GjoMoöը}Y* {QuPI='@}]r %Y~w64n_̻ dY04B(]B@޵H 2S^r;ٗe+ԴXzy#$r-#,I""z! 椽O8=O'&+s`֑3dGOXkɼ~z.L= uBr U Qۖd+DF6{r&j1:~8iSiLӓdL +H_vSYTQ x >I z,KFk StdcM"-<z-E9e8!l0_/EYTV}ޫ߳Hl^]]}]t(Wz{sh2+1VKH_i 8&֠"b%\|v:|t#z./劫|o3_cruķH}]mTϽA|Uݽsf fHEAA@rsxU׀?sA Hə9aX{@z{>=ݧwkwWW<|k×"aRʼ`Z+%y֓[S}5 JT ]ؿ~VO IH ȥD6MW꼯}}Z39KZRV @D|[u& } ZFJIFxl5UbX…(Ǻ6 6MҦ!sbs7"M4Ϊs&Io}֧}iO5 ?gK jV*m5&Ӥ:o@CA*?4%MeJLI aK6Lt*rln;څ[QxB`Xn;kƎK2)ڜp畆uΰtEӻa!pҔWMe\[U<{&Xpus\{G)7?<Ɔ-o?eKQ[Kνr-a9yR{<U}l(E 8zm,±՘cPɢL03x;3|㘧šGdey(H!V]b=33L2x1d,8H×T'D=&:&ɶdzav5 +ƥޭ{ ̓Ӓ`* $v&V$1Z_IedCt"X:9(5m I^kӠ3`ʑ @x02㬆 @%]ߢ 9&L-&xc žzoo}&:q|5a:X-\DÖYʾ[̣VFmkVl $<1 A"Yr -b1I KX(STp= I} 8C4  2/}~f=R& VTJKRJfC]ausnMܰ 3XfXg04S=˼ Y*6]޶ƒ]d\r>u<{Z>~< |s7$y\p,xq7G`XioI8Mݯ;,/Bq|S8%odbѾ˰!ۮO=sV1h{[h_giq{Kv9%7#_x? >5}ۙPt6S7q,崛GȵuՆstcwx rZ˖k cs s ˗* +s<y16`>X<-(𝻸lҐd[uNi#+L{#i* 6GMT Z^%P=8, +S#Zˌ)$unр3}-#=J)0*mHf fY5F*Wܐ5!kδes!ZNN{#u9 6Z f$ } Yk|ᑽTT~ۅœ@(\T p7a_z߂J[Cer-an CoTZ9Wo1 vl7!^fLRb7B0rLa ,C.AQjH쵐6hKlJ5oxC_S; 4< IDAT݄X@jχxUWW\'yH3kWS}l=j+S~gO8_+MQF78GRlIr a[H+zog(kA) SSK#GPS%$I#|i^]XN4 p^گJBY6@\͖'n.!i%z[=6p`efF ¼ =>Ag8ۺk7K *5fP`+-lPs8/j`p~.Y%]fjmbқpưSIi eWXU=yo@8"<= ̮a]"ϥփ)15*scJnwl u?߇ ]vS{657񘡒Ԡx~M%&QEe=%b?^eJY@nfp;w:P>~f'ߜ|Qහ\oK䟧f<3FTZօU8=dM $x8A0X&Rw^2?aih$ v L2ٲ:6l G܋蔞&rt($c!% :;_2Ibw\CesaôU[3˶K An+s.0>:0&𮓾Φag_[ONŧ(wu&n=]g<[n̅{cN߼nX{uJV؇Nnށ:~b|s'/߀2~!9~_ϜTXs9կf[sݟ.cV0y.l^ Hşo>ƃg%y`7:dy~y\.=)咣[ח,p,v޳i}$Ų S4\;$,BԛS:/ZG$jYOdQt^s] ^!#^[4K=cAz F,-5X7c } 6SՋ:ÜqAe"~tR!̥1:gVD#6јiBU(Jb` G6 vCGYh>^_HEtWQ\A-Cd4k(MIs#W{>ńЯq̊C3YP.%&?&a_ȼj5n(;b8Wa?a>t;BqajuYTFHn/-Q2n1NH ]V{/p%/J_3*y,o티 +!&KX6j߉1\vBDP/@jJ4&ڱN`3vwnxh&}FW>e27kk`QW_g_:Nt *#܆WU&*ueIı_ڹՆ~7\e|S0 RW-J&;%[%kKLQ{q42`]vN<,Zn~rᄏo_˟yr/u\1=o{6,OOi')/:. ݱ t_eu[25laN1ypyI+\ o_?<NjDnobZ|؇+ysA=Y[.sa˥+i# J3y헤L⠷J:3X晹2ci+K)PLZ xfJ Yǀqid&[yZ8yS sP6fD5@`ވk=G/Fc 2a: y/AN~h%{eW a(sa+AbuwGm1O}=HWP80>v K-s=\o ?# C*Oضhm<[Y0ZdT RV3tlDXudZ-LDZA:ׄmp|kMڍ4񌏍jMFC@xBRɨsa֯PJ:7 ғߩ ceY߻O-E6kkdc%sVgTKpI/YUP2믇`lL0<  !j[ C՟[7Ư2aK 6e`ڧ}DLx{ S&'1Lǰ) CÆyC턖tr"Ko/8 z!懘lrQz ;~u{w+c'}Wy~üW^niAlX>{_q~ߜXu }ˎ'?>?}o;;'-ŝ,{!c|f+n=KO抃X}/v:Ou r~.γ6;6XܱѰaaQq+ l# iju 7,KeDz /cm6l %J7[eYMO^VuM$CLII G^*gjQ0X# $`p ? pXQu{CZ u4-ײ-TKb44ȹلf(õ7`=GQg틀SS>$uf!,482;h+ `CjjFjmhߐ U(wF$. يܳ5XYp7WS ;|/ *3 0+WmV$#歁Su\#*n:!Ȯv^baLeL%dóI@TWr4S oPP1A Q*60TLjR|ffXVstn}o48s=u ҡIF$V*uAz `Ll{Gkc43ь9{τ+&]XIWMZ,)*80@p,Augܝͪ65Huu,Tv`pBN|r!0I8X1jg`R)^w5uQ pV( 8@pfj`#31tv[Q9rG#4 "PatH)ѳp5LQJP:&^&n9W՛㘡v~_+FAۤGVoQ [A uC`e@]ƨ|r%޵9ޓzeOp5Қs #S` 1Mukw^%} VCCo` 6=j75!1IcFX~1k7Ǩ鉭}k~]۫oY{b|(Q_۷0 jKXWW*?$굍zg4Lvc8)-䌔7YL0Qxf;1X402`kHjw33Nz{dbݰqjo3챵a ðߪq-x wnxaξ/'b6/9FᇑNv\fvᯫw7ƒg〡ݸsƗ^kܯ³{޻o9hWJ_d|sC(o_w|Kro뿾5<9ߋBӎ}65X~#˞z0z. Iɼ4q\vُ?? K_">%}<9G.wf_7)W>q:巽 ? |oѓO㧜:] o nϟ7{oKv/aOG|s3ydgfyf5 -6MTܝ>B&~Ƚg٧6I8R>Enq ։rf-u1q*hó<4FfGL1UL&rhpY+(C[佖ZƁu~W|!s\bx>$WIbK㊊\ij089  $SUYfa=F]j`D:O1W,CD ֺa FnWa"-Dְ4ȬM卨_QUJRL_Mi&ZV~#y,,/N/PHͬq)Z2G9"S1Rkn=ݖA_(;)*Y;#.E_7kzg0NѲ [װnZN8%S8!8g6m8r.'Yr޽d^x)cX3iX][Æ֦p\;z[Mm„1Lzh5`2L)Pnb- d"^Nfxډc:b`'^xL+xΕύ&v)ehp8 _8QZKK~v JŨ}SA.2R©s8H]]C$9fɆ(@` gD6LלI:ߦBxRPmIػՇUϑ@`W Z^gVB8 q{FFrFx~N}௃A1va46m[>w:60D(ι8"!RՠYI2/8nX^qV0~5>cisY|?ILX >Oۏ믻1 f{fϯxl׾fif AG!luZDƭT51 xNd}֤U}56aH͹Յ)kO`|аin4Hܲt-e<_?t"Cks8%wU/x.9|?_待gy4blz>I 㫧w_ݶ W}_sء{ ;T=A@ ??ͧOmzppW]y&O\sse%<O /EܱcʟVY8vݙ;b{˺n†-kr3m& KCr)x< xgQN&R82GY)t-pXH}(hdq NkH^JāVxkx+ھ>^ce QK!0m~Md$'=$|aAKa(Sjs՜P=̋cANSq4J hYaNYJ`:c+7f]3Uo*ua0 & ghNP`V fbU N^u| (~}U0]g`y:lvre^)WEz9`FyLd쯫a*=.}9i k2#J:g҆ȰJ&5!^3ȍ +(l< 58gQ;2{e=[]|M4ܛ(cA"9C_a $ԃ10Ul~m)QRzY5SIB+Xi5 Be~a_x 暮%f[o rI z$ W akkv ;aܣka Hl=FJL-* t׺^섮 lm+hVpGEGd7˴),`s<޲90c'm#gN y2Q䞙gbN?뺆+چ{e`e'] snJ9Az*nj1N=%[omνIGd.]tZK{bwxqe/y{v.7^SS׽xlk]Ovav_Q{>: 6^bCµ?+(o/)?xjk֒dfg=qC[q8Ϻ7i`<#u턵k6Ŗ=F%ѳ)l,1*n8/8ސ6,qR4$SrX uT䊨@{z-Wz|FS%c_=&5iDV"lqSAP?q(C(A֒zV5 3j*icuTSJ+Rc % bklΤQMh6_{`<,0*&p[bv{ujolFp yG<&QBCr:rI^զ^~׾¾ 1.^βYji aՃw`g֭!vL"nPGoؐv(}13*KUKEީ緅^537C Ix4̥}v֚ 0+H0ʩ'bc'| ΎM+6~_"v@(Hr~PD^Id ;ӆCtnNvɚVƎcs!௳,u &gNI?t앎3)/yR^>ɵ}n cfQuy.p/ev܏o}1;Oie!Ë{^>I<1%[rh=sc^;Wscpk}&wt޾n^?œҗ]dY{:ݜw09S` #CMɖOPg& Eʃ6aO3IwtײmXSX1GF,ojMZSmaSǰKS(sZt&;05L0k K3(ROi=yyZ986:Z@~gTD|BjRA^NY" N:Ƃw 2IқG5*#טI2,3 [E(KC IDAT0rgB- '. hY"Z;!@xt NG 0Z?"i ɲyvz 8Tqc!fؐcg8Q'11nmU7!x]z0Gd9΁ \gWug͵Khjiߍ ~N4]z:V\y)^$ǨcR/Ml`TPf5g* 8욿Ib*7 c)^J:SsPezTT'oS}ͬ6He&a%S'1"oK5M> M1Nh,mV9kƎy0C $,=2[o {W\9on$O!c񌮭֖mvUn[46bZ[e)ICS*s0UBT+:b!J2 4zm *D_uMP[(k k _S0uWGDҿg. W5,kǟ kxϾ:WK@H^A=VcE gyl1IT+j۾ǩp l5y`ľٵ! Μ@ߕ@w@W||MJmY>0ф!6TL)b)](;:* AY #B'ƆվJvV@(ZBV:.4:E@` EaT".[bf^io1ѱQ.qk *DO?G2&8wzå ,& ^i KBXQS()J"o:O{FؿDnɍ&d5.Qh5Ww=eCAa5a $8%׫YIU osn$V`8:P1[78cuLD [Sʍ(؋RAoIa:5@Ҡ-($Q+m7W@ev yWKqbHoQ3]ωn 077Lud;Lw6 Or uփ&/& d S6`,e8MȤ&0R.-SUye6Lu-Rw}"adr>ixF,6= K枙g =33s}\ܒW 3S .gd`?1";{Y=>^{bn[,g{7fVmt5uv̰h.-kS6N4l4Yh2~v\52o_IYt ݎ- 6̚^PD qֱW"*酱%M9NC'19 kov@)Ut2.lR/C^RdhȘS#SdL39Bܯ ʘA^;FejЉ5K5*d&KjLEvC5;ZDEoHrR/x廓P@VIlKTl"sQl [/GΩg.lXlj $8z. axBdQڣ TJjj⚫VoucwO姹 v;} 4||=9Wu|+[iHL__)0cvS-2 }N.R(kd۴ 5yCF /E߮q+_Vc8Fj$^B#)$IDo'`C^[6/ِLwx@3;0r\w+ؗ/=dY FQ08\~{S7vl]?d+ vEbN?0 i ~7u.Γne96#hd'cK3['s?yL?s._m9;;w]?yOkf<9]aO,aCp==w3cM[,^qh,,m$x,m1nn3˺a&7l6[چaxݕh]tW.L0`r:fզ"ǪzMO+2RP=4}[s7c<.W6> W,OT9AK˱t L tw:DPH?y^2P)k͇`$RTtĂF}[MʥNؑdlD}Y U0 ?(|DvGpd/! 0OPY2}yZ"uhO^/`͈FD1,iq:;d0^&ԯs6NHRu"HP:wHLyO|U{1RoCkx8"7Az=l:lj`o% PڧV CB?{څ$TA cp[;-dIxzH!5OlND'&`VpxkԐ1|ijxF YX`aV'ux iK6_X0Vf-|m `e$^6%9";8Y&d|Ir ND՚V#($'" #㖁 5^ފ.2QȒP£lzg,_Ēmt_aV ߾a.۵O.B^?܇ۮxOnmιdzvj?>k=< >ڹb-}k};~?K/K/`_mOy[KQyZ8t~.W\~j룷-%p#y-Q<8aas_6Qr6f̲n>4~nOo]zg6ê ?s9%?=9cp0gfo n.d;e)'-HX8?aἄ ;6,wL,e9Ce ְftHlkOu`0*l0L[L L O9yc n!oʀ\-d"˝4X*SQK%m/-T`p9Y&* ~) p TH:Uvz}+#+4:5I)eM%A!I q\/10mN ,zXaNAڿ~_{xwcЏs  Z6AWQ z,5)M #lvMM%ugҏ2Щ׀^)Zp}⟽x3|kL` tރdK")d%pBz6Z{P= hs6jP3c0!E|^u|C޺SQ U7Ƭu5n@Ao4*ª6dD#>ReVX{,#`B#o$`!@af닸ǖ X0K Fz-*y9sĂi}G{O}×𣋯Yˮ-iW r7PnO]9G KÍk-wn,`zeˊ%2aG 4]6vnh(4#X2H Dc(L%^*oGm d4z)W(LR[#7Qע2&b<$A93"ejroOO-X !XX RW%: 1Z?FAݦW=42%,L,5 v؆M$>52Wؿ]TiCNƘAFƜ!+ p p&5,Ka+P2^s'̝|r8*pG^O7 oc=2lu|1fe(z3e% F5D2TWRVD%Y.W tE|6b,/i$0cj25s`gKZcXFP @k37}P nT`kT!|nu[sڦz[zkzlrFp@(y׀'Fx>Z磜azͣP6- RzL oJu[m_9$E 6a_1. \P0XWkxZ816~x=8lW`p-2pW յn[Ƹnl\Yݚ"H|*@o 4ac.U5CڮJTr kLj@) 4$5=m7ԭ82[&rx0ޱLt -LGvK'vnI=¡adF s[~Ƞ4.=Lv<\$g_{#a{ᆍ[cpر휒[l1daX>dX8dY!S93s.7r.᤟jԗ1[ُfl7x/=@>}|/|jї%zs%kZ^Hā6N bl"'#yx-~v }>ĂKD_@"E+ aM16K>&$Redi^%GyJqΌ]/ jL ,erwA|-^o=`rR;ߚzĖ R6܇8IBV%A̔YLSYZj8Ja*Hb-^pPhTmnj>xSծ+1 ue<6U([,a*; qAh6J߭ʞU p{Xu,=eibِ+Tb MԾi5J2{8K2}NU{;wO 9I KN* ɼL(FEXQPpT$)aTPI$gtUu96u[Wuխ{V y5ӊ A&[˃54Xt,MQm}LڥLR.T_[ be,r~GV>1x3OZ++ |_垵xכ?4y v}xosBZ:3'wQ!E 9^Pŧ—/ 0wBz2ֵ%pƒܴm'?+kI3x &S8]RʡY 7ݟIiJ2}AœO' ,^Ko0ZY&r%6d%QW l"q^F XSFg]= Ovi(`ؿJN/I@ҩds$<(J}Rv ZK$۳Q^6E81&ڮ00@\!TnENLX\Xb_k =Fc++YiQ+nSXo.2@ ^3 ~. y_}p|_'C j{36&&B"+IMd5DVXsd3(0/AurzaVNiMѱVIt^[*l$./&Ddeh 5f7[O$UM^=WzRKW: _P5YP77<5ęjS9\O`NXG="1ΐ%Fdu@QT>ȽmS wB_"8 Fi ք ^H!ZǪ33kƖui|z Ou ~]`l7Wǁg:͸ojٹ.]˖Oz]| <$={=ojh9x׉|b\=W_a3n\ q<ο2=~gVLj&yxほpÓ]6[=MO,ؒi'#9#m6gX^X^,s˟,,0%<׾Ek1=;NJ¶xj*gn&%*&`.qDp+ h<ӢLP0@1 *S+|- cr`ցɔiVK'bXu-<j (-!Sug8E,Ffh4nemf23~vڪgӧFWa&S#6$ H@icod0(81GV}6BبXSoAo'p v _ WMh 8%L"we0*BF c>'E I 6USic f+8YPM,04'K't{ayrH*lg>Xo }Z}VgJuy7u{oo WWٿW7vC凬  ƘƔ`"@M^:9X'S੯/)r2w]7C7'l6IkOKq0sD0vZ"KMپtEJ'/YޢԱJ@I2*0 SNak3S*<) H; Dk_VLpLՆ1>Ou_& m3UTY©UP6Iiq'%ؕtJ^[ɮY[u1 iMZz k^zyg}3_b/ZCO`uC5ǡc 2 6@@^czD^/߶߶wt'*x:&]஥" I~YcA~[ǛIISJ. $|mH4>"+P12|>4#!'ixRaسkfoo@ݶ˛{E) obߎ& 5ZbksLȍ΋wUGSC7603/if)$s5aunۑmcer ΂ cI -l{`0}7p7B |:0: c ` <9kܱ:% %[N+;\%/)wW3%3b垉³Y}unc,?}j`O'9|WqW3'Ͽ|~\{鍔skR6g+f`ǽ9o'.n} ,n1a^٫d0o1̕3{9?/}>Nԋ75Xrׯ5^~Z:e2}u_1.4 ̩"5?NA =r^֘u$g\X>P+ 6-v) e""/6SgE:f +B-Aa:mFFuFňJ-PPɡ`zSS*pqj1Tȩ 3ȃU"UPt2kРPUQS皊Tѹߘ87\*08zNp֋O9SO99o{ءȎOɶv{!۝8~d}gYqӽ|ʯ'UoLN,Ɂ&2R3?UYFd/\sM8S_ºޡP{]ej+{* n\yFw5yno8huRhUbWE2NYkh;qupg i),Þ&R=RC<\`lh`N30Boie0Ԃgܲ^\Xܞ~"J85uK[9;5>6;^~̼^\|ןkZxi_w}o[=ϽC|Al}e[49Ug4pO~ě8_1ѫ֪rZc⅋Yż&v+tޫk3xμu|U<7v^ɭϬܳ,v axEM˽aҰq쇭[za62IHe$.$+1tzsTX҆J;{'c9; 80D oTJ-n곩|m)L.1*y,A*H4z#&S`D:'Bd]TxqE P]65aKFLyZՒ^͆4CDٿbdIZOȬ,z$MK>r0`0 ^+>8HM^ ߶ }'_׉sIWA$Xw{Vp#qk"'J`2F~V:5'UU5L}LH]EPSͨ1)rH?I,؋W0YޒHnk]g_|óC$8=hw9hKrV ڻxR}YmC?B)]C$#ì݆8y\Kk^+0&0"[$]\G0XUk@W[}\ ~c9k,b P6T1սČQny. C IXVH%?Rz:e)oMoZtM 5Jxf N NP7g g"e2/iFjYZA_{Tp_`=Ax.5084IVp mСPvJioKlm0W78HT:$V#3 6Tf3*YzhZM}8]Wx!JD{WK<b^}F<º*l=D{v u+rE"vP 4ɾ'}*ӆ<[ s7[}5S&򄧖%<4aB[WSl)L`zPUnU xsxz^QR0{ A 3Q1e lcN7GPX9E~)ۂsn=CEEAc9G1&~_ñUtx^ʲbw8߀o"|6W1gdVl40ZEVW~"9EYl B1{P? &'I6`EJ?{`ZPza]ajIe +R$FJa@aLTx>yKoٟwf>f#uZxs='?lOrr~3\~g?uNs1k`׽r6Oip`̾A7,|zG ;=ozx|E{r!.s> `t\_Kq3vl/[,(YG:s ~ x^ 0$5VYVZyޒY޵QtaֈeVf²ՖCol$KfPv8W%*-5dIVՇ%be75UB$ V( *'/G:+#sk~M*S@/UĦR֛jZm:TŚ4I$J@9-NL SLVN] _j6LU9Ujܙby CB@rZG7HE(ؐTr|GH|U]|cVeo-]N`~crN{G$IA4i "URTxReN@85^|W&!~+Id<254Q%ns?Ng27M|%'޼dG"X:ߜLYgKaoH\*pH4G^W~D+`(,l=d9=0CM ZI=$,h<*x"-Y}-VpK5jso'y ӸGi6c=aKbzƏyir]m7~wSWc}/e쏇~a/?g޸gv| yb}1}wy _@:{N\9'I;w)wW[~^F7ec}s>+ rZOcUΫaF i'i6UO9\yنC<5by(5@42[e$h?bPv+meN*WwDnW2Hm{7/jUJ-p8=Tj;a `mju3ڱچi1'@|8kG IDATQY+6`p7'Zqʜw+2* g(bk}qTvXU*P7lV@ zQ W"*=*K!Ύa=5+k+8Xz#(Aްz?~TD*NcUNٴ f&R=U>̵kϰW yaD"-esїF]I E]Lu=< mmg y!E1YmW:#IQT@u8c'b6,a ;Y¤3㴦uUc orQt(/,b+Y-R$ s$s!n, IX\΍$(d7x6 .Q +Fpix:%녱,a"w:ҢV -_S&Z)lb&yBXI&$R$Ɖ@ ^,8إ(=Dd+ ( v 7^ċy y: VбHDLde;9hzdh^ぎT/ͫQ@ؔ.a׍Q":}8a]*=UjZ 6{=\ˮP/K|h|7V]sϽ|a t3Amdf"+ܟiӓabE˽c7 >aIE|K|,K-6<˨bs o)\4 [F3j)P/ j~2YO?n~{v~K8`wlTl 9}&gx3+ [Vxexh6Kf ~<|ɞo9C^vXy:Fޝ كy8o~mi~_8~x7\y;.wg֤l,xˆ<ۥuw̧cMwN)>vybsgGs˙}ﻞs"G}`vHt8ڏ ^R[loٸװ 4ayr=c`a1,N:ș43GCB+# Xh_/6zS!TMRxp:@q0yii4~Ϋ9yQ#A)1ؙB[j߉ܚN# -T 0T)wڢx:AK!f4j.=;u,[&;BmI̸5cZ<74|UERbd_?-7ꊷ4TS°tD#ᜯB13V5fsAP#ĥ}xv^e[Iʗ Ϝ7B r VP^HQzo乬~$JBqk^8ƅUa9W@o'Z;6ܳ8͛?VJ>{# gDwRy/WyH,"άzRCo ] Xg< $~-K/`|6a ;re&3z?Îx+⬻& 8‹>{z. idjn<șGq̶Y?_u-߹~6\[Lf+efĢ X{ݡ]ǝ?>~$˛saagcM< 'noZrkYMKL[֤ ˌa-e01LkYf Xz.YJk끾iiH5DH>0`0l`‹Yɬ+n%UKƺEJ4zo k%F kb_™JXG28. *P1J5pEY;/F&UVL `ʁ *Zz5\2КHؿ :`o@v^Ҙq .ղ\ 3PtErb=Zm) Vk|Zѭ}C:5H_cEf/)=rl74tyú- pw]`eK>=g?DY^洐r:Y M l5T௯I>+؛(6ъٴg=uwjAwr;8!j@oL6TS9P ElJPإfbK'R":V44J#Iг29+1xqҳSؠ٠3334S`eM337gp#%?}h9Noա>.j#8sމ#_,<@Ey`ŌNw܏~#a?sI=9a.?^hg#e\d;yk χx>ۓl ˷8g|' Mavu)(gol)s7޽ۿ.>C6_̙g_ȉ9ϼg?Ͷڇ_߱(~x |ט~9xeY[z8`5?u 7y^ y<9`M,ypg13 [O7<1dx]湆iDR L$od.rNyNf!E7bq]1ifN QZ#@Zh'8le ` ؤ2hFGgHL0p[{+IyYf#ML"xVmdk#yf# {W~VpҀ4y*=MϤc#mf2T)LIK*lϭ#/42K$ xgz2$C T: y玲}~ɎJ>5oHu֯& M[UL&  Du'S! _\^e7+9/Vk`$ɤ  ثYlKA;=Ufvr+f}KBLC@WVxJEw!kqp-} 6>Vj7!yRy'7B詋J=VSik/.M[(,X+uum /8ˌ%q9}NaUj&=|IC`08lG+զp1:e" "@k'Qfp1R%9QX-XUm\rm.MkVFAqX'0r_EB&%۳m t;^ֽ{Ma&^i"*-j}7@װ>茰[yB8.5>DXጲHDq"kWZfV(|EvLi҆s9I]2فf̅*clYhtUCD&g&C&V>s H= #RE ;sJAIRzY-wT"#ҩ\ڧ. 8ع *ގ1N9)~D~u5TEЁ%ld EnZZ[Ƹ˿u=61_Wp97Wqe!y=J]:TRUޯ"b!۔cC;cu&>=D4d^Amh&*\xz0xz)I7o+d+ϖs=Rg6D|Je0P0܂a`MnO;CgτtQR+@#=lu. ^| /wl0rL<*ѕ9ϭ)+JYɌ~dž<LیK籵cᆞm=Ou6oa?co'ėφZz8P>+>?#:qv^ߪ{`?a-7;Îg~}v^x5;dg[X%o}hՓe7LɂmN7,ߓly.`>qlV"k<#T!)h\m&FleF$ >D gZ} KY|c)3 R!諱Q 8 d22vrت@`-]w̢cib*"QcDrKi[94u8Oڬ(BF[zq1i -ecJG9]FV!G`OC zoAۤ^Z}E+ z lˤ˗Xe/Q`!q79L-YYUyaQ#_,Z3Unm'~hHxVl AI{S{FWwrl:րp,!fjVz7>L(N5W*@ ` eQcg,-ZQ^kq !ƴ6vWyM]WemVN[;Ǐb?}b461t|TXԍ佼Wgz#7|i17 /ٌk{}r\N/^vُlY1"֥{dGO>_='_Ʊ=vx͡edzL3 6ˌYw7)_9't' ֻi\x#]y,2w>nȚf#`V ,2a&eeX˄XZC_Ӳ ~Ca0 zR%̄޲'CACpW-`!YmC`\q*њJXĤ*$)Y'`:篥Վ'E#zhHP&WOA$,Q NPMa=5qXJYXTr$NtWa=Eg |W`(k\7 6NeA!Lt%.NY*87&o=ilޤb6^c_41k!GS@%~;|^_P$ztb žV'5Mtw':xs9g{KtZUJGaD:*e5ZSNdUH)arV:*Ya=[Al0`Z?YFmfy sg<ٳ9ĝO'ǟacv_Gk=m_~S<]|9Uxhz-7fq;__L/ܳ:fl7O~<ƒ; .x) 6YNɋYy M#oeYOy{=ƂOԪpp+N*NrGǸj3L5+ ?o t <\<kg2:3٫>s<|\0s| z'#cw]p3wIx̦ۅUV .30")h Jo{@ল3 za*{}Bdj˯<Ӷe@)~ܠA;`k>HLsRgN.0Q m_1;fd#g/Sũ}){߻9ߝNN*>X(s(u*`ۛf 3GU4 0}KꞲNA=E!/ <؊F(U͛[uS7ԅ 4uT `sZ+77=S.#0q Ln7 cDV Q>*Pk -Ix|Xae걫%Yk$Tdp=R9a/Z"۠4Pͮ0U+#3M_&xxh-Zn<8KOe3Kc糴 td̗X:Tmbh#lY`kS@ED%콉L0.%΋b2k7H?g)=H;e4L0YJ+O.6D\ω&m)y$; *{ADLfnEr`'*q$ZC#?!'PI\S1FgW`\+EǷZL,?gkBW"9޳Ͽr5dsV-W>yۼ\6]c?;~_צ}{O/MnlS>u >u\Ww)o|kO,:î>ccr]6ܛҜ`%? r/̦%S>|-W?|-1]t*~x>)Fn{~.8ԃ36n1+bZ=/fӛ~{l>˰,`ZyykÆ A( K1Xcm`o*3ΐR\SAU[RZO_oUlriDtdz*Voѡ _C_|U5a*b`.<_͡Ň$t&>@_LEYLC P,Ci<6e E!@אwU1pI1>b)~ ~PՌ13[UL5{0:z9).8_  l5Zp˪/(/L! B&_WLXtRۯ#K/gw>w`-2@_\OpJT,U*\`w3K'PY`o SWdGgkU:{v U ڹA N ͵𤩘m6iqB q#C_r /oI2C adiWަamy{1KX 8ڛw:[}/gmS~sޟn'>=!c1}VM 6OY{^4=|𤓙95sS'efk ?7Y֕22j-khe2kX,^a7A:@a`01 v C}" } qzH/^qrE \րR%FFBh/`M4A: =5с p IDAT1YY&A|y1Pg#I\Jb=S e  t%F_O%\,2]AN]`oh{wNݟPh<_mWtWl}G2 pm2u&aLWaJX M (Lmm: ]u>_z`0X, g1:06:OZ|FRY$Q Q&MĂ- ni9 K夗!\{A\}ՙ*,) `j`դAQ]IJhebp: īH/Bༀ<7 Áa ,M`Ex&'3+`yΰga|d8<1lct%//kCs✓>{7s6A$nd a$M$]7l M&RN2#5з@pXPՋAQps/`e[YOt3([O{&J PUHSzd<ըؿ cT 8l |-ʚr!A^%;0а :,*_\JM%뙙* ϝU hDaxyM\oqRN&D֯Ȩ1 QP$Q))};j >[Wz3N Z'T`oCߠaLޠ$AMUC\k[^`WΑu=69SWyMߐ vb_fSZb8ܕUF{^iAՖ䍩{~~P%P<-pSKyTZe>E":l Q68SR 'IMRU+ANY`x,LJS+3F21HAح&3FA᐀t:&*JR#I7FՎQډ v'U ZZRVXAvN`Ge~k( CX:a6–DVwm#_*]E L2Tt,80fY,prCQ@)W(-Vfyف"b'r@GiI-No 9o+^&2wF9&eo`B'F%5 Z37]ꍻyZ^yUR1d 6xa&KuL a"]PzޑdzYB'bߜg7I'xw@})}3#,O@5>c 10F/"=j|}SP⶿ǜ!5sGJ7G.)>*gjS֖ f)@ozzc%ZK Hs?v5_o:oWvOOg_n|,֮`h~#,:ukl:#ݛ7=& qsV}/,'7`VoOk;Xtz\/@yݻsqY␃_@r5 {z3b>#[1kH#z.sF 4 4exa 5R48x3|CX_?M?KCZ{R+hmz5f|(yJo"508oS)!D[hS1*e=,pl1kF 8)Ć(k*,ecӜU67pE0W[ޡ$ \iU9G6*'L7^X6[6:f'zth_2K@`#~^d X#2z!7[Zj`V 6؛g8L=j,k 0S>2S*%tCw5츲12!Q/r}PAm>n u^vs&| ˿~"b!w)j` `y9>o۷tͭt}UUuJ?kΣ=)`o{y!23[uK$U4Fgc$ǜ[ C+5fV~ *0l;ȝgIu'g= |f&,﾿=3kv٧zқ`"HA4ֈF%5DbI41Ǝ *£ *.p>eu3o993kڳfM~7߳Ws_͛t u# >;H—>Y^Wκ>GXHY _U'_>upӞ/X̣ .q3=g߻dz>o{. `O\{E9q:K=v׀k a1|{> Et؜86 _}y[ 0T#0Pxn% aTD:uԍF324fͶhc 8Xԛ %̈́ACQo±q1 QS'KZ{x'4rёMND&M4\@'hOJr jӞ֣SݸKbL, n'iz24C FXeUAj'Ԭ.;!}])ݴݮi~ `8іfBڪJՋD-]>ᷝL˶%r1];>K % p@@J_cokzLԉz ;/:'NShmϱ}&vaݮ䳝(08V9ުw1߰dz J **P{`~ _򟲥X>OUӁg{m@L[9_ gϸ{*35+Y2~'tf?~y՟a~saG1h=v4y^̇LXz= YvO[ksN7=|3g`ϑ嬘8~ d/'~mp*^y¿?+S=gg'$̑`χ9yrfq5!G~7ʸ} sSž-3N ;Xv߿szY t "+aNYv:~eM=&dy5G]$X8j*UiDDgװ &d,|@@#" a+mW';*B 0mLa*!σJ~VA[a`wnPh~wmx:zwE,'i2SghG͗k $F{ QԀ֨*`&. Ee&댽?~&N!6yoe.-t]0}e Z\揘BKi!ɧJyU['VY~( w Q -P8׼m0Kte4fm$EA\,i ^!M2U *D e0u/^g*StufI<(0U8jOb .Tf719kЕ(;_#lR*ZIU!X BZ脎oc ڧ*"JZrX;#NԊ9a^iўE^z &~ oU(Y)*ڣEE( p JGWܭEQsUnyK47{TRzi< xvfGێaZ-0swE)VtCDcy l>*]J{22# \iѷ]K/wz^y2S9**<461X- Ǥ:}3`o`MNb,_vp,yIjMD@:?O9>Am +fE%J[(B<4I<0NX2Qpbt$E[Rw tׁ9߹: pC>K3D|鞲y'׽M\wwMю02=-< 3–ia0~^]V1diij4, gf l lq^܅/3cE?86=cnzJ89^Ey2uܝ Hً=;[{g/>o_u= Ef x+8g8 \_kO=O]a;GO:ҽ^ƛ_v+ז>׬#vv/{>4{N|B>˟}}{?_OrKx5V>x 8b-['9p Wbzt-]N;l〝;S߿~}+ϫ㺛\t#;xlj7 ;qޒ9y|?X:03:e0hGU[On :aX[*8SwgڴIhέ.n[4f(Yd o٠l׿] t14>$8 тGӊ\,o˝oHm["ڒiVX(0BLAF`$o *͡SZؾ$#:.~ S.2"hwﴱl-ZDx<M,&8K`pzfQ50r$R &:w G[22撺X5'CP3,'#.q=&cU+<Ф]CPbUAjYLZ+6<;l_3msX@Ĝ{j'~6[A}㷨ErK׳"){\k)R˸8~{^o0%cA0E}hl3QP䟻 vDLqͿT 0O‡۾9ͿmWK>p\1{%3s^ Va)7~ۆ;X[o|~(3#}|3,_R$_04 `(YְdG/Dԁ[*S)A/ UH%X%W'˜d&ȋleҵr];afAXo3ceK%/Y^J^T@ԣdQ$1z p1w\w"a'VV@!WYBAa}ShK*r>sDiHmi`oHԟh@[FӮ֬kzwT1)bG)goEchz*g@1%G@${̟Z9&3~$-=kvb[SWy}#\ b=8d0gXN{ە"|G9- 8XҮOԀ ,xZ3E` LLz!2y:=yc^ l}o6MuǾpO?MnsoT1c=q7&.xNi?;J:Pys֧֮W19S^_?z2sm|-|+sv \,YTNflsGw`coۖ.冻 ~T?7}>xrxϧeӥW5 o`_)9~\z=g?x˙|[ĵ\? 8q{3<`_|7k̅`6ǜ%s*KZ^Ecѡ@'8 ;6t@ZiBB%e_hR65;lFF{T^Ih2Xl3SrEDն>bu`",$u8'&# |V]^LFSHR; t:Bd"6K_qԕ&TWb/QIK D 4Ζ~?@蠉,0`Nj Ɩv6/ DU 砊.Cl홿!H>[@ԫP .sa:?G7V [T|E]X @jW-V[6OQjE2ev̾,7WȼW7 ©@2!.h~fA`xs}aUZA@6WC :\} ﳾ֕qz6-&["W*" 9ZLȚlЬ;Ɵ/jmL=(cޒ{Ln?6eS7+2 DgvTʠŅ:h5;h!J- 0@Pp*2ܤ@n^&ϯc*2WjR<`T^Y ({y',bEHrתz{^ee8 JHWs+1QrX{ df>u~A%(:WE@JZ phΝk&(V(hz[)Jgc۱E4!hҧ1q&\i8MW`4 s28(3*y"#+\( +*̗SZ77<'ZV@MT:!`p6,Ɗŷlk U0a C)hj  vJHU02z 6 hSXzbf@R@ѥ lAmyUޑʐX%BhI4RSxT5;xcUVeۜh9;w1fA 6H2[*jX Z{:JGLd9_KG~\߬qigDٱ]Щ2@G˷tlEyц_-l=K+(L3*+0h F2Jx h IDATy z5ct`b&a$*eæ8yW^/VqbQ?^̧nE8i[}>3O|ܻb?kY=5+ e]8Sy /ƒ.wmͬPzr?%7NI8)ax4dou\05r7~s[9x{f=7,N<,rxj|k0=qΎC<n#$α|ȳV*v\a݊o}aj"KUAD,5z tAr@i>)CMJ?C7Uj^U} s5+]4O5tv>%8$f`%M!LQǜMU  a|NUVh{[IVwJU`j&p`DB+?Ksl;V\u%Nlpnoh#oHmkBĘa@Y`X  &n2`uku >q|z0Eq]I{V~6W/ |@+tr0=/ Ae=`+QQg:XXꄮs $`YaC]; 3<`~y__ww_f^zBS=xuC;t/?g|e9S9K9[`-«?͏[{054vj0._av}-o;W\qou%v-ᛪyjaHԱi Jlia)Pas" s¼T&pSn* e̜Xq &[HXR!8WA&K֝@6 &@t $@jA> bK=(: I~gU*cH8fc0vAI'ԠhG,jXm}x!T״gS T)N'uP4DMB9p8Y5uf,Ri~X[G-8{NΘ`&YK=G@{Iwe'ᷮI&~6[U|Md\w_+ǜӊ؜[ ,X[$P=&)-Z}}s`m7&@oxuwLBB e*@x+bYv@`:>8uN^L.N8 's i`׀Kc}APrs$0< \` <VϺز103hpc4a`%:/埞'7IO>뿾;Y/3z5+@DUƧ+Գqk`h`XJX;% yIE)GS=O'$#i "PXV [O(%ƺD ATD%{Sj^EbsI;O:QnF`dP*%&=kf$1@82~3!1 $u:'Q \þPvTӣv40IMw2j瘔ef) t,9z.Eb̡sp ny8v& & i` p@,m ߺJՂ@-D{лl#;$zW?1,(*]{~ 𝩴_La59x~_Q״@LXC[Y).ԾŢ d}Qo+7kSXPN}PMZ9q}Ŷv|,-S ul6 `f (g{zuf#<=ȰWw7h"4KmC`ph@!z6<<̋g+'ԍU~lY.ԋwԬY/?PZԊPEpT :'@p!^6j%VWI**km=-[&]D]\G^ s-IE{e"t@?~BS TYhgQ ޯ"sN,N/2&OӤ3c@*P!4S$m!ڷXŕbdN} G Wr&N; ]wz<ص.Q{EA``dGR*{\OR{ډN s+gJ1Y;+&\j*H  &t۲T:ݎRgIP)J[oۛځŅy(J$Ma$ éODyiq~~`309-lm god(U5Ae$Ja2wl9&‘{ͧa0sF=OaA e`MӰalV9G7pɋ kaf}hQy`ca{O[F_{,w?bߑr'q1>wgvorxL埸o߽tŻ1{I՗~9K'5︜[_#]:}.xb>Ŝ<ƍcۆ!Xx/߅'b[𥗲)߿~6>닌M8~cKX|g]ko>O_hxG',źIX3<> yoUHHWW-06PHa SX@!LKor=4p\hQ6]STvɉlxXLh`*)EӲL%4L4hcZi ЉⲥQ{z,az֎2l?x<5W4 2V׆VL%24qT#q*Υv>UaV}#@'jC Үiaf߷bec_c#j39RGdlR c_'`"\q*c(2akPYk19 ap拎?Q[J@oy+8esןWrГȽ`|keh;`c]{x8a6y| +g%N%+8կe{M> >{ j6Bzp <7[Ⱥݬчg\/xy\wٷБ.랼t"-(S ;?p{!ad02" sG!Tg%LTkpYZr,N-eP/a|F8ԃG]v6x ,Q :Yլ[ueک#Vߛя$AjK&FIchP8hƟWVJv%b2`F$Xk btA6P#FI{v;~-}1ܖV-PF%4 dzI4\#lP{$뚘sBrUI^X;\I!m'IHdM\w*vl#+k9Jpoc:[3ruB:oj~d# ـaqn[{Y5{}oSu5Fԍ)"ۖ! Xn.4Zic,[7y6ew4޶o_www8Ʋ?`Rv.\{S1Dr"I_"IG v4;)_7>0^w}x9+G/g}DNpEbzMIs0ߙ37y W͏qt;%yBIrգg}XPqyۙ t#Y`0u0rԛΫLE KqXwgfr U¢؜1ze1_T2[#%K˿o] M0ŢW(A{2"lͽTĔ:)sk[{'SKR)T5k7plܾ#+Y%TsJ, Є^U )ez/悂N{e7MV Ebnx3gRjx 8hV$͙%QSfWZIĩ̞DlnEDe@0?9|]B1yr\Dt4@p(1`*#1av @yOZ iy$Ķ%eVhc}-l]&Ԍ$b<5%cvTmg˨cȊ3bMߺX(.mܕڎ2iɒy$X/K|Qmg{+`oU2b/]V2Lja.oPoߩ^`/LN+w4LLĤ095q8z-reTΑ&;q,s>^yZ7ރS-=C9w X8G\nz\8_f`q]~pc‘G>q厧#O%#Q>y[ϙU)|o] 9})ʕW {W{?7W<}O8۹ۯ(o}ϱ䈣flpgv|ߟd^X՝x\"<ڄ?>碋2|u_/_\o8z<+'H'n]mG E|%OM+k`8aAaAG)X=Ϭ Hysc]O*<د ߚ5465TUAֺXԊ(K`b>i#ԖY^OH{e-YDu+>?}Xwߴ Eǡ:pפ%cΗ1V{bR^AsNF%SD[y(@5mSJɬ(V`Z`k,*vbjԌWb plsAڹh&z4|oN}A-)nyЫB- * =ԲbkgfNVCU{&lǓ휍h3ۋvl@>(AA8 p0A} \t,,@{CegP7PӀ^ 3(Q[׊eA`}@o?WeTP(5V(j:T;UTM P:QEzG9NH !4Ӷy lS<~?z \|ޕsx|q3l3Ee psd?ab#k9C^ a'W255ѝNl=tGN`g{+q~!'>pSS>>W_?^e p/]?G_^#R=O?'rbV>5ΕL)f(;.pc~3"tmefIh`o*I{`mxq{uX_mje+ 4ke4@E/*d}IMϭؠ`휏Fgj HxB3pfI>ۤ) Wb*䮋%Ϝ] f&ԵcXR"fy+KeM߆bmٵvYu< q{`[Y *&Lj]e /= e0;Nu`co%B7nA;#f[MƻNJo_-}uI[n|kCԽ*D4bd [PN-q{D"5ର?B4KыƭaL`2SX ,0ptIqG>:˝O|t>_r{x[7>KHa2>x`uLGwn«{X.FdZ]piȕoy" IDATWU|ӟ_pꎗ˾â]GraAfxjN?ƌߓ׾dnzv-;.ܑ,<6QqHvrfΰ~NъdhŖ/=0ׅ T+&T/3g&tӀCe,T8 M$JR*&>y +wy'IabBf( gx0Xs-QxUTrVA.N߰>&݇0CS * Jey9A߁0(; @G8eL$4 GoK--Pe~5n"0(*lV>ĊXmw&P3~*a:ו&'{MXTUM@^cڨDi&|c_X8 K2:+XյRyj,4_ej% ]hPvږ鍥`ZTV`,^Jg߰}UZg.ދcL}(FX5}UVihf5C8&[`!}L[%\u~%E'yU0 "h놢R HZpU­2a %#J) QPjUIR&3 e֖A]:X_SYրp3[zݫ/]}*&*u:VGmXe$ffAB_tY+C%w .r^ʃ%x+ ]>(iv530)(1`vyBќ3_.'yY%v>ucI+B6ta@ij 76p0BiLx/ԽxCc`vD4tЩʙ$ \Ā಴~^jV( \;bojq[@p.r?L_xfrSP ^,8o\VШ8A=VGA$ueQݫ2{Sz+:h)t>cZ<@/A 5iWFIǢ%\Tʤ/ʠIbc9* $TO@^~ 01&`r*09t?П| oL{d̅1S9 2P*8 9 Fys!a!r~\ F¼Aa0:,K~}=KlNd0-W Tp>p/+SkyqdOݜ?]#gayªRpW&8|(۸0?vgU2t 6-~8tZmM|;?/+8Y?7O;~?K8xz}Ʃq=qu?{fƯ+qůz\s:1txN;W<4t wN?N?d.%$icc|sQGT]]Xrռy|U`*x@9#,p0ˆL*f#lܠP`P`A ='+s(KN5k1кG5j'bqB$RlcirLl?{=A$S @<1Vks kƥhP_&I1O3ai*(ʖbE9=-@TI0ZXWx+H*=`5]_^8o T:mSY^Jh"'Vc"I +߯cΚsƺNpI xM<mbHH+,UĔQ*;Ĝ2dC 5?8 Q:B]fխXMcix3Ơ<{Q윷gmq m!CP/ضNh`C\_~j0؞Yo䶠l"P}m37/ΡmإZl|zUP5H0'Ec8ܽ:pCC=W<8޸|g'{ο?3C׭K'mmE0@օ&\_R(|Nt.Z5X8&Ka&0SNN^&H5edGցi9*4 t*cT&:ޒq-G;V}Ԑ%bR۱Sz4*ƁM*ɒEL(:65Vz$:qr~ .mỷ *Zw,[wd0g /~"x\櫹 x^nտګ>^5&[Crr7rƊ%A Lc rݒ9'3,YY;YX?Yhؠglc2XQU``.̓g@Β@'D+BݶH٫ {AV <~Ķ)6%l6oS$VYA=!b&{l;7-z4۪AٵYp_?c 7kv(e IρTDHte#;(W1VQ~E}{Al}1*i6NC1d i` CuMnvؘ4G 4$T֯..{0WiLӟ'޹P{%%JMQ N{eL:OW *4*F5^~ پ6[rV׻v [߽> -H\k=;sJMŷ(WSIH9sȱFdBD k!0iN+!~YiOa43pU[kYfkhqg"t`[煲 )s[K_{c1Wuݖb=d@7i@ԋKdtUיZq6Ci26g@ͳ`cC .Xl̵.l!182 Ź *4v,R؝]}moǘ(^V0 "pfptN{4j^e UQWVKxT6p7NbKcO(+Ok-/Ja-LDGx)u&tVzG0NbIDc8l l?$A^ 4o}~s~s@zs8rAr*qe7 ۷eeRй޳ZT n(H&ΌLh_1G,1YQE2ډYoxVή1OQ[o`TX4X!@phFP͍\­N֢T~ps ZЇ^`rFo&E)̴M+` I/L48!tCcn16X0?vr uix _?\wO$0ҁy0P Y(+_}[R9*ׇqk;qd|7[oTӆydÆ<9m pԊ|<^":s^ x] 2^}x_n2y_.9G\ϒx>k]}yɿ0VNnc<*~w~}1l|ODxë9cίS-7_uLjn]4>3v{:oa$ʴ9K-]UC﫠" *#(#*:.ˌ8۫㾏82+ ( ItwUum9ww}Qqγ}?/_ft$?,[zN:5ﰜr}Gd]1]fXrz66>zZ3=Ӌ]~a_{ &*y2䔛tU5 N1 pJzyjod.*x=:x?ji(-o6Rsf/7%x+% [@<`)J%;gkΉQIJ$"&RIGVnL,}j.JR/&wWI5 mCQZ|Q(IdD9 kya 6AK6Z-UPbN7vg]h*P~WzNcS0F].pInCE_ O dqWc`՘("z!Mhb"7kE.|yTTgMiuTIe-XkI Uo7"G7KY|332pΡOei=y|`晧>wK•mW_fs}5e˱*ٵv%LfY9p\ >m3'y_y5^xGѭW㕷L q,<3?[ [1Oh+<%\u0ƵvM}GއѿC~g?%\s,O ̗26v- j+C 3ϑzI aÍƙ\j>Qn&"E-Ǿ NKTW5UPt  AHե˄`bZVT$}/$Cq?ywY2V˹ &ԭ4ќ`da01#e4ioFYpE8埫**QlHR}6^7ΚBuo:FB\_ձ-=REi)E8/h_|%\K?SƯJydGLB؝۔wc$Cm5@o|>z>g4B P7ufڎxu*/> zzJEN;3DP3PYA`I QeƊ;zֹܮtؖyu֍{VuݖC&ia NY8Gﻆ.6Ꮏz,o#fV>^ǩo{7k_OxgÞNʯ ]B3oN+~ɱrx<8qǖl美Ǎr鷿/έyy=%^y8_eۜ7ӎuOcX#s}89%۾ux3{|-9Y9f%$xȫ&x/ZZ^{fٶ9hukΕ0[ :0 LzVLx6;v1 q4% G;;  @ -=$NHh2A{HjQf^}@T)mIǦ`3ezﱮhy'ԁ=%CĢӵaO`}ӼaݬM$1ܲ*Ԙ5w#>aYR# X&(M&"I V <8kGTਖ! (wK~d5wP@_m3oYKj~߾a1.N%^*d{CχquF엷TRMM7*4 ԗL̈K${lhI5ΠURF[L} !M%)坩 z+:Qg~Ml#[*FG@)^_Fc daC.SWa"(-Fz;ԝ@o_TiFK'}usPYTaʼ+ d(M˱|yC}jxŹXtB0ؗ 2pYc5h2^!I0iUgb4iyfLDI жe˧TPdV@5 B \ D@iV28WZ:Q@C\ -U+pkx$(T²abyX)*U|i)M[̣~l3RĊnsI$) Tm*'+emט+>F_/8kқ؋tHR[Sx& #] D%ssUDZRD(-V&pP.rS5AW 0GZ~VAdq+.Ko{C Idkb؝X A{<:q[Q(Ȟv7΍'`>Ja6}Nzlf-wrsrv=``g[o⠇Ko\wѷ8qϿ1}}_r N.w_GvWN}7>}_Ǚ=]t7?i98Jxo Z_8֌[~s Y -eҳS 4]fX֑|Yl@ +l`eLI, ; R Zy.KdnyKWzlyiAՍ ¥ڬ~9Ŝ$ERlamFf7ц*L  @\>7 Dn6`B/_Ja71ob[^À(چU*Amhc :&g.j2^ שc:ve >rS< K|ؿꠛ:{Ec?@e˩i]4-.^Y'%^Q) bR›J:CcH޾H`eŠ )*< 2{m{ ; 뷭oZ}X~S#K&~۩(rR[K>#S5#)F3 rrX||q>;g9$6.[Ky1]N8~Fȝ_!//qw0:bXmow讫Cyu฽Sr}VF?=ZCIs7d4yK$*'L~ *08&\h9t2)}!=M.X64cY`gSco8mNc&`hчAaqV3n..xbG>M9cktOx_{9O> =LY"03r|r~3`Vȥ^9MpJ+>H}ŭ$tIoC[o_2 %S|վ#ѻ/ޙu5|y㺓3z';Jʲ\ N9සE /;dz ӖM=êv`csYtlvdoAk Uz>Ty>wwC R g˘84')5iB6v*ոvWE-UJ9W%AP&$+}5s/R w<7Gw!3,,I~7~Oz^G^ x\tK$ل2ղ,ILt,cKeI4, ,sK=_&SX& EiX* s=]0Z^n%7rƊ&`z [ :6ouŻypϫ}/%x.艜K_]lpA9{;w~敗o{ b j5|lٯ`ˎinݐr+=><9 .'8ju ‹oqO}ofG6sIן[<|üiѳw-N[ۗ6Ω` Fc.zӞ$aXziOly dVW)؂[':IO*?^N\KdA c%rz5>Yx5- @cT|J.v'1nD *K' InU9h@0붌ƅ*Wgك au۠ʟoC#h=rRy"Gd6ed$Z_?5`tl5A^AdCHwWm|!6?-t]Z`@+"b:ǩ 1oi[R#\:[$fIYZAt0$ [H,̊]jh,|*_ie KGS_ĽVwn=;ﺟ_ޑ2ɦmG=~pVM.rӆx;g~0]cᴗ622;>~kg,Up7(&¾ r1m Lga>6y"[YCa4,8˜~3fRtm\'_d N @hKRsDI=gB'%?>ۣP4XrEr@)Dj~ć`+ ,L`~>kcjI>P3GU+ILTHǁQK QLM?RxJݗ/NUqpRАmW+BZ:ĄHLj#߳BR zC*b*D#H+WL [Mb]l%^WO.cb|>1Xn%!DC _k0\"$r{*$ 'rVvJLL lN婭4!;*4)IIYn8Kj-hEe $ƒjXx+}v>!P] ` o`8/}K+"PdBxA{#=v;Vtb0HdZZ C P<=sOTVPv#Q۠fM-U@n* aZ&3d+ay7amXFVCβ7;o{)dU+/ 07ZE*KÜ7[ ?a4,_k8 hu G?f9iӛ GC{n{V'|?~H|xxӿnS\_|#?ŷF>{ǿqꉫ8OfM'ȡx1-emܯ>ʶ2~0lccqs9O{C/g~,×|kn{U[G?7uxwf++܄_eoܲ\x0CLu X586u,,\ǜUf_ [,4+of<3=6㘞u uZDŽGO~Y^?pRxmAT_d%QBi>uF:C_\no5$7XW%,ER *V+br7c& ڊK5'"QEPH%^sfz\5b^#[ XdTFP* 1[c*[켼zUB6z+k?LmW- ,r\_JlJ|̷ x2/ŎQ08 8׸4 ׊:UpjGp,jU`x,4۱ zHXPk̀ @&q_ P`$c,Up5czozlpAK)rAs#E$`u,K(CdjQb5MO 6L0.DZIaDT.KC-'0 :ұ.Q$" ,DsOKCO>,U 0cl{y/7ȋN<}vtWd3wcVyg'O;_?DžOp8\=3J6bd3 *5׮e+'i\gX2X3(شrR[&GMq]dadB-x2fl^ f(Lt2ZPnV=U0^UBF=߸YCB Өp N* T%KIvJB).`[A`@{1q[_OL^N=+1.v <3j(,gCiOt0|cZ\hÒ#x#`kA51A[g6Pt>NI*yE4ȡoLm^ 0:1s[:!_D i@-?'.L[ den(85~#۔nv#лCL+=`b^k ow{< }z=䃕 kOz~cώޒT|Rq_* sw+DVV{{`[/ , x^Wws9ϝQkKG e\~gq ǔytX>ņo?㢋.}.fO;SN0\%v{w7<&{rqs|࢏>tZ[r o_v>œ6`A v[gS-B2kd;ozU3M;Ϛu#⏾38GzM~Ss lebK0fê 쀕VwN˖İpI<:q-Y9eYJ@9͠RОN*<"&H(>1ops粼kӤ)V8$'"̃FUAyFƓ4Q0W%L6r.mګݙbn $@e~~6<ЁΛԾG@s .!o/Ue+Kh:ԵPc;F[0mLTS2{F7e /ɾ n=rt{@xf~.P*`@Ϙt{l dh7_+f P~VGW^׺DM r-DJVTE'J s+Yp, IDAT:1RUB`Iw+~$Ȼ; t{u {)H\9jm?d"B {RDHR,TvZVvRk8^M$AG[^%4UoфsDj16Cje>qA\lX#,@p* pul`_J"{egYUvA 6N-kdI,>Υ".aO!OyW|(yI%u57&m.RK=ebaCjUZVA o,PCeX.Pp8xϣbQogJwOy֊XQX$u%c1QTa>(=i$ 8aKKܗ۸&VRvkAoHQ#ﳉbSdF[>^IK2Ak+WwT% gp2s7v /~S)ȍ&?y` H%ZN~@p*ضr9]iMFPD87Duh=1)#pv p` +yRr-UliCU Ë ڤBmO!@qAiu]2`k 3%(#Ze4?ǖCPqþ~W6x1T'ao.ԮߘU_mxN"pkQC(v9 2ey؁2F}XX2,sޒUeEƳNZRW?].g IT0NhY ݖK,° wv0hY4-{gsK,9go8K.LY.|?w >5d,4a13\^^saE|qGzܲms 靏Q{r_:M+ w|9>V8}Uܻy㻇u86ݸ[ ZW{ܼG`{:RpLرFng)05X=&XB`nIӞiG9p]2֓)ļR%ϣj4%ql:LVrɦ knHi7ձ`%~6.QNzhX1GŰU$vIz\IN ?02FtmH^R*wH0IQ,)RvjT:@kz/ǒ.ɥ{G ɬ61{^=Ҝj\7niX#5X 6mq@}o?"! ]P_>7OD!u[cNcl D/#Ɍ0ݍl,Cb l]d'ؽ.7!kP$ڡY*ni"s/ PjK{Q.z={O_ݿ6_{|؂WϯOۏ7/q>'=wGs0rZN ߿Ûէml{s[l1mͦ9ٵ`60)& quV2ڷܳt _'%arg8^sFUqkeikϿV*x0L3๟@!T=@*yL`eJJ'D뭪 t\syXp4!2q+ 83ƿؖuۖL$AJ2Vs5k*Azͨ*vd,fd:&0d8dVn7`O=*vWTO+ʅ{h?ao%lP8h:Um%P am>Id됦5@_%}jOYӱ@w2\( dMзp vUĩ{c<9Dvh~DddrmJkPP[vύ( .CN`!oS훘''oP;X)j}\YR$T'hch'H2K+\ KVU tGB`*u).8'waݪ=wyiC+Oqϯ kX7 7r ?4tv~1r\qmaOR| gѻ~rpѪp987s?㎸N_ƛ6Ob<==srs8vożmekŕ'§/;{S'΂# ܽrU\{9߸n ?"ݷ/F9fr⧭_{,>9}nܔYgY ^?3G;s3[ YC++Y@Hm Lt* Q"Ko"Wپ}{9" ݁2% yIK0}J+X4 {]D0F0>WM(+@E ik6fFU 0eWTۑ+v[qękTyEY69 "Z)#Zt}no܍nhb@`q.@@݆R=0@DI AW`CV;";8-0\=Fx5(@+-U1dstG`u uc ϟ~{㳶i+0DG1[S@KcDb56pBs{FTi{ 9׼5,*3HC*S 6&z_6`b] E>FTn칛[JeqXN$9eE^W㿺`߸]MY0`J* ׁ˴רl ЩĆ1~5KtHH#12X<?ׂ7FD'B eL{iV{(k&iE hMD%P s- >\R b:6j*9~SSm.LKB`@lA,N^eT:2x]$wPhIK`4$NVW ,T{|BBܭ!O`+0]nMX" ~=`p+Q,jUqU"+?2( Rm\l+ lJ-".5& 685u7 Pت֩*ՠ^-xQsbGlдOR$6Z[g)m)K1u%}u/`KADt #˥rn2VZl8BX,Dy1,A:B@:JU& tC' V7aʦL R˲VhfDL g藖}]wv03, ^t0WT&`Ӳ#x7pG>/^) b7~2]XV5-˹fG{;9hUN?ť1>[ {xб~ұ7q5{GAγUx7$n2UMU&o |85.h=蒒@c3 T06w@3q B 5 8 5 85,h U  *rY̑[]Ucދ7C[pYUrO wuxz|MWECF`a aZ-׶&Ωs\\L$[Saw C A@Ð%r2dJ<% XZKZ:V@VR  K =wP=7^(,m!]SǮ,/9x?JG9v|Ec_=K6%gOk~4Zoc׈au۰)Ùޕ/%' cUd <ܾymº3,/1=6tG=v֌0pޞNdWpo~k\u׀.`J`]/z ߚel2>f5,71 mI ]c ,$ҊQ&vI>$+ KѠL \|"q6b${L*S3$I)<58J&A%ƾ\*wk ~H@& FiJ@Ǥf9ؚ]JuXI~gܩ##~9dZD^+x̹Od.i9tx3?9uycWMҙc_~7;qBw'#^׎p{ƚ5lżu¹<<')o[3aXwr̊y}.?/Ywe߉0 3oj%y<N>S&yg}(ex m0=x+Su^9`7EXaO`C [^o\yAd_X)-Qԋ7^Z[S RU9JLd[ԏ0keZrNkk2 F-P1#ġ3SKrp܉hfdjYCnT6ʲT}N#\z)3I4,>+E 2 eb)|,0.2Z5ٴWb1cߖ WcTVn 7.ً^XLkyK >%T1N{0>bF;7O^iokF%m/|p 8O:Hn~?akj 3T{{~mp {P@F`Â1&Kb$&;X0"QTrJ]ffϳ>~dk^3{gOYOk~}Kd?z/1|M{qv9g=;@S^3͊+ZwPk&_M r l9<Ǯ&Ǻ. 9>Ǘyӟa?'gnx1og.e˖Y~ul$d1n=D8|t%sh{t,:!㋗pÜ'y礦-%{w8%ak鎯ro`zγscǮS%%#1 pm{f=9a)V٦5Ree7l3eWŖ@yDM~Z{ViMgS_S)}*~NI}{}:zXDNkEqE)} qvBu+>*W`p%KCL#6}#A'YU\g5.m-#Aqku4(W(^?; S #ri?*䁇HX8V ;t*-IKɩLU" 8Y~$B /r6/X+5CH;qY}7< ~Ao Ϧi&y$H%JaH\ijQ`xϯ;+7#0TQ C#44_%ׯ3bv |wt[ҏ ;Xb IDATzgiOXw8wm~m,An>%у ~ڸC0c~)d=c Ea6l9 MГjgodi~(GL񒵓ܿp;9cQFo<ہ;亮Eoϧ|>ch<'UO_^1'qNY`.ĈC ̴[0֨gtap04#ca5 al0:`i2C<\pHCـLR#Je+F0dN/"d <ܲ|R' X)5XF 55ڇO+&P3^ O#Q6 :ݯA3όΚ< M(D"6w{<:(L^UIMOZ3^{M2;" >*LWH,lbF֤_o> zA_ u$/QyM@TSc98_}݉*=uUG-< @$:^a{d/:te-P-%qwX}_}]}௯^e?\*uպTО'a+(d8FLYΫQTτ8r5)#~6{(^)#J60 = 3h5i)155ai, @g/wy68cЉW9JQq ?Kxђos L> '3;p8xznЄu_Ƈ7nu71}S eƣCئŜofp ^ښ׫j~?|maϭ?1{wXJ>;ّkЇ>Y?ӧqyǞy̷X۝şlI/l84 Olr#W=ĝ=K/c)r-pR~nM ijxϱ)&kZo!sLwa,LxF :,-چ=C;10gȉi4z & 3h4s 01AҴ&>FyD>:WHT-MR>`ajbMK1#]l2SV0~̐5<7 p<#LADX^ה$kH8&qLap0xR bf֓YB% R䕻sa`vOv`)2o-CI0~mœm;eSiG*y4ԗR (*HR! PJ42}k־;xUO*9&؞ 護I5;_C?WN]u;RšPdkՖd=1zH˒X<~ɘz"kA\Θ/ Jʥ{B3D%.sU5ҡ:XLa,lL/S" R>V^wF:RBK-綬!Oe EbhM $$>!AdJd X/.=2gsKY/qŕ2U𷴔%<ӄX&bZZ_"]v8#+qG jF{hGI`"SUO3UڷZ_Zys@0eP$@`dH-hb[?OuwL{IMbaHx3c%'rMuۯQ6^fD`֋\N 2` '4P=$FD(k\KTb93 CyC["(8Ϡˊ\/\d|.]Jؐ&ijaC._`[8ݝ B.*&}8-:SByzN$'{N5(J2nM 5.W ƚu08<ץai{Kz5)q:{_5i,ݶ UAVgm 1Jz=Mw`בB8t\|ț +!cWdr҇GD]Cɜ;?K#->Fz`48yY3HRDȩTiXe.7t-SԬs9|- YӰw<J4'J"5G\9w=9oAghSWAI^{roIy~h-=YUpҁp1vWg'f_#\﬘v,EO.}y٢huڋXs|+7.Ȧk?qc.դW8d:svӻz>7_۴Ws㣧r<%C3>9vU|%ο]65WC?[9U^΍o,=9dɕ\}aܑ{VFj1+J-Dž_xZvN:fJ|Y28k7CGzf=s>wZFo R䌥p <\&3d=#g$=$btQۿח!Q&Z$QIAgmc,m,I *8{VPj*hC1G{~%sC/Ă/1ռz y*r֋Bc"c2)`,N$sj=yYm {I  9}jJpYCY$8ƚ+<sa=V|XO3Rѱط[+vCԷ_z us2jLj2 kt͌kbT^ ~~& oV} r jkzNm77TZ: QA CNf04MKk^ \Vo B H uS&Ov}_\op 7pXVx8e}&OIyۙ ޺,e68#'%8Oe[X4,/M{6OKrlvo̺͛hoB{v;y²e(,$kֹM;Ҳd(+tlڰ#f vf8vUsLk8?O[%=v.gщ+Y.5 #3`(F- 3eg*,KLi9gTO$̼>\y+ziOS`WŠ) $_ g^<& U>0!^ʬT-$I4)U*kbf$lP,=P @hμ8ӡ2KaIx#AJ)b6'DIhBiQK d3vN töVL 0 GDgt0B^ɽj*D8wm@u3z6NټB33RT~OVz# p*[0ԹfWnXj"4  9cjb kZ t}f):w57ǒEmS<Ál)rFӂ]͂폏1{噫~x)xӹcyp%hxٚ[\8SgzE[ݴSo?LFwŠ%۲!.8q4_y)Cggl~)7ΰofd8Eo̧uk'0&9Pɹwͽ7pCS:c ϴ)k0f I- 7=DC{fKǼqĤ,-i%;wpxʪCt|ΝȺ95J@64VfhZMCiif&K+1FFC40PzSޚf&J" leِDshb:1ͅFF檀MXT0=FMhdm5(idM3fa*љf=$FHw` Na$3dȜH0`&R"_{tF_N*<X](Pܓs@\؅veXuk% fL 9={)A A)ȓIǨP߀ $@!V#Tb*nR\*W,ޙ{.(sN"j+ӢFUf?J)h\ ׮] `$w *1&K d%?c"]VH~,mmPʸo+EgGڥ<4 -`xV+NÜ(BHS$Q5Y|]ѹ봐bZbջ IC'^R>p5{T>sӑ ݕxKT.b w¡*G*0|Xgsk C } D3*RuèB%^L8CV^bJ NƁ7\J+N1Z \yl8{=x:I))ǣZepŔ s,޷ pNיYsT y&&~GLsp̮G (Cv ~tU;K.KO};/\,T2GUm6{c"3~4*[@K{,t.K%tY+ l(ި'kuV;šŒ#iFiz hQJGR'! L^'r)#+UY{R@Jm 4PX ,[JMj'`Bz݆ SOP1L!mXfslWdgnN}NXtU m 3u|[QuLyM |A =2N'N{ZC+sa #C02 Ft9<v$ $|¼Kv-9d2նLw,=K8g1֐eexаL1hkFrL Ԝa\a/?k ˝3r]y*J%w/w}?ص6#590aGħO8Շ5|ws'z,z-|g,G.;^_d9`| >vz0L5ho6"q?'& 9igg`-n;K*X;i|Sd(~e'o=U&jo.#;>LN[Ǻr۷ͱcV̗ܿy֌{<;p{%9,q,,Y1X>tXS2uvl5㘝w15 O+qV|nH碎gzAZ Lf'dr~VsDRR(.&1T2!$lJE֫4M4qp5^)<;n;vnfl߻m3[UihoR=&oDV SJQI!.C]PƉǠ8a[/Ǵ`׃POв$tTHP_+dA~׳_Zޘ5D.+[`Ԗ:>y, [m Kzp PA1;D s&ZSひU+KJ+ĨKM+}/EoH sTT,J yo-܂egx-߷ց|t(ҢcʇR@Ci?mF߆aVS3e+=tـr~3L,ĒZKXx#s𖞓nii9[>zni×3mo9gn9|w+ļMW}Wpҁ'5mM.o=nYKϦ7N3slRê윲lۓF 49rΐ ~(&,vx+YlsN\mX1cs.6bc6Y1@{-M˔?ْ3X}ix&/xúQv=s}9FwTnfofGW,Eji{- S`i) %L0 E& Y}V#$te0WRʷT=KuӤL¤3/&z*Aڲ| 'L-(3du0(Ё >`3'2u**P`P 1)2hr[^ze*fʈ55Cr&)jXC%70C n= M;Xؿb^I_{ 8/~" iHS_B#8ܡ;"lx'5FBgj _9?!:-T-*ou$`O\:_+$}`VKG|˸[_}D%Tj P]1{@T҇t[Lቩ&kҩRҪVQTI.L7؀C{l읲LΉ027YOF`b?x)ea!71 k7>wnڞ9(ռ|2oyzC| k.ęxd>gt0\9Ͷ$+y~pg_αA5->~믇pV>e,?ap^tͅ7||7׍X{5gZ[r8⹜GX9E|1C1+N5Th(`-[#͔T>V=4].ղ^L(q }lc!nP$UUҹgu$!,{8=qb_/  +mVnG.+`OhbL0G<: b0FĪj{*UdHDSV+,r-,ۇl[a\5+8 =mX 2 & ~u&籙$BnBUFs|WZ7b IDATxC[J=+ /l`>Nc!\*Qӻ(#^ij*LbЗ80?(;z=R5cPl 2iqCCHUQ7N})x&8gVƔ, t^xyK{ƋG ͤxОz=idER(_cCllћєbWvvS A¶'6=H\Ld =uvC\Ƅ4l\«RJ{RUb'@6S^XY2 rjXHJyZϮݿ,2{Z;a>7tOF6-H ZppKS)`+̼g miO'orEc g8~HܵsVώyGc1A_ˑ=6ylxx]¶ y),W)'{{|?/dW7p閩ˣ3#Xo<3{ޱQN8w޷{o@6?n]N/?|s #w]8;vvػ 'n{O)Or;0^<;^ѵt];sI1:rCCc|ǡ۟?]&(aG^xva˿CTb&MGjEk;D([EFȂ~7w h'yzS=V d0@HSp ڐz Ib( 㷧):Jз+u{pGf- y?ɿ=.*} öR^oX>Yбѧӭ??S.=7w gY?⍿1f!k Mzw-'x 2h)dp]?A xt޲svou0L{L:<#]+U|IY^cx/ߟeE|w ;-)lNa N8RA?HC;L$ xH FSHaQ @ӓ:b?ҤX$r{#Ca Pžq̨D5@`j$e l8e|όRaP'N,pbQnKd16xYd~#6} E+kj@d8Dy1T&p^܂AkE:m0~SUsYM:6mtTH8y+LU%>2 |owFv9>asW߽'Hxzk/{mz>?x/H|+ a?*˿[s^;M£ޏ~mw\6k`g^'k1͜|m?&)n3442O334hBV2 ʅ^E ʳRELe$ޒV_[Ƀ(lR_6Hv` S_z8Vdas|u7V^fH@ r:0P TIF*v >+vU{1xbNbj%@I^[J`la(akL<&CCĀQ-%)"\a2ЅunOdCAݍ:VBbi xzi< ս1bx~%YA_`z c4 p+"YI a {D`G `W\{D{/3ݓ| /SK`FF#IY)kK8W&*T%m*a <) :/65D׽Ñe 9Fdk`Bkb/BGe!~f$^&r/Cޢ,ibi" pӊl`2K;^t}@p>首)lD5ڈL\Z8Qj(85PKa"w KQ:D`9Xy|P^uZx '[X5 ]zoC]+->CeTfPL*Qbc>Ҟh';{+'FGvfHo," i.Gd?yMJ{*@*YӔr1o-=o'k<`lN@`Iakܷ JL{zTNH"z-C, U ʞ(K0={^U:6 kZ]ZVTBro&KbH|%'>G>wo^hqr|be7@=2|Mǖ#E\!FW6IfNs## ൷CP;?U&X'鰿4 QE@FM^M ibx+0U%q S*Үރ6je Y@j](KT^ bFZ䥧xf0ב E//])Oq0<ܹqN湒drqC?{﹉ga^1vy|쥿#<6Ƌ8WsKƟwm$YJQ{c^;\7Ifvk /yMsq٥p٥yo}=+g_/]o{.M)Gg9|# ?瑭004 g9<>u5wß|t39쌧d9 ]"ˮT0wrψ~]?.7Vlis=L$R;htL^r]/j_&C\R82F o=kIBK %nMKXx!JJgϼv)rӄ<)⣖R\^ @2^خne gDTvyswrZ,Z3bRb@Ii]8)k-+-䍓IRmvo\yQ{j/#b.C771&%+g'oHbs8{׋4t`oM mk `Mx/>WI00hh)HC)Pcp\jPC۱7T ic2qPW}k1WC@rޕ tLDYK$DX;k`JN2j%'b}bO($Lrj5Ԁ1 C+JIN&z zN|~&A[vwJDeL) /jrΙ8 rω?g"He{uGpݠK>ek0}eULѫ}$sr ;j@l_Mfe$/2=/AHt(s$u\ ]}˕djeYD2A$*^') L}n }iNe${IRr>Akq3&Qj,hYCS tQ|l$ A҄mu$x1gII'+9|r7,KM1"z| *hMD`0ز hXjc T]HRl%nT`7RP02 5a%Ry e7Y(;mivøWW -TƂ4Ե$Ģ jHW [3滃MFFT  5T9y49 F o~C#nn.cg~&2aW߮"{C/ @jKM)PIRNɆN$19`=֋4x 3: /ZO^2 /-_8['/Ld)~Wsx/e-[>_Ԏ;}WEVhoEYcK-P8l[5x=r $1-cS`![j*@?dey[(Zʚ-դ /eU(&#v827ΤbDK3tZ||( 㺌DTX4HY#_2BS@]@QNG;[VzHy2KQUv"K( v1'#AP|a=R!/-Կ$$xվeR<Y-0[0赭HbS6 -`iSؐalEUj%Kh}r.aw;LvHFUF MH06`4,5,,1LƆ :a3=L03 iel0{xNd̗lܲ`_jW01T߲\ȣ [%Þo%-&_=-8;>?q|$gw8x|#R7qk8WqKPOzLxqmɟ-{n_ˡgK07<33w[<-nΧ_{_]êEU-g :Iؾ}#S۶0<{w;&yH0rxZL g =QFꪟjj59@aC%AHu7t\FM#sT௚o_@ m Ϧ-JQ5S)d1OeV[3+`.V%Eϯ@Kr~Wj(j-ҪHƞ5_XC ɡ d8OWdC٫RIT#- <L*DihZעxT'ZG%kn=tUl0I%U!wA; 3BqBJ#*{Q{hj:RׄBZ'/gja|ր{gdgoh貙ɲe VZLjiei@Ko`f$93Q4.sQif00n ,9t]<_Z \a+,?{VچҖ[ro(J2y'5n <7c1ܷv?h+2~Ob"gby,Y+wcv]gn9ȗ~8(Csz=^1䓿} vKtc50IDy$eb$!KSܜ%wXvͤ; C K,{`mR}|jGL {vq?J9o{o\}i7oK.Ⅷåkek/%䁭vyyP&zQذad24h24-ɀ4 .3-C & ̠cn@XbTf@V{.u>@^lRV{fYd>}}uc3LfRa=AUbBA:lY 5UNiF_ j餪CiM =BHhԓN„B{"*,]`/$ uxJDf;aw9ʑDz䍽0$#חD+m~z@A_׷mHLk#FGEuq  7mQY^Q1\ػ(k}F IDAT}ʚ c8/~v3K᪄=WK]e#&c)e|cZ)DF@#a|>`|k_RW+Ć,'}e ێ{}̵g9x="G}?{alĊ~'o ƕwo}1o@ov.B?泟WS)/fqy(_uLqa n?}WvT>KSַ7EǝLRYKg29jY0b䒍;c Ӊ$YUhu`,% U_/Lly_j ]rWxMjynhwx-C7j\ZI$aV2Sx}4iuGwnFng-s<_JA@ϱ uay W7tچv:mNr\4 :$m sl+'Zʼ+M;jHjw<]:A͙Ƶ5] oJ;PwZ:Q ke <pFt-knUA3R MIdTLV pmֶfZOxm$, $c]^ +|; 8++k@eUW7󃁀~oQ4P뷂{UΒ"[zBN2 /¶<`(PH]$_%^,mӏՄacZ]N95Tz} o|gP`gROWWl15'-ί xߐ @0gh1HIu  J[+/u&&(Y*LY3BW@*ZέڼqkSo%3iw±뉂z:s1/[om& 7n =t3$W >eMw˧g׻8vҒ\Zx_=!: þmot(3¡8^ W=^̍}h 6*JZPc AU*"Dž0}| 5thP5!x:p(0QJ;&O|2 zI @6yj xJcru $FJ4&'2k_{I*# pܴE)(C)z:)Ka_kE-?L]iU>WULXєtA|S`IIJ7Sݱ!Mc)guV0jDo,1LH rH]Â.]~0px-#m(5Y<ϰHU%`qTb%5vfi[;]4f7,LF ?xg sΰ݅a/+cEǍrgatw=0>6&+ڃӓs}96q}vSj9&7_qKOd͏~Y/{ggRV*\wɌs;#=Ǧ,KX>pXJ7OY75n2Y%ggr3 37="/>WVtiٚ[yq.o%Yl{sS+cfzjBO`.BuȘ!`l1P$ c0F% 5>W;:6 ˸^})0 oDž0z 1Q 4ʉQ2IaPEWӢM kߣa7?Ӵ`j#OjXQ?L_!$Jb 4l !@pNEmg8J-`l$9(c%q7ږ +}z6Dט# b¢x*o a=$7g/yehimmJ,'4\ALv_m[AP7ĥBViB+3Ia,oljze;|iU) nBI哬[}+;*.b; >1!a\pb&CE}Ykop p75 N>V!Q6\#p#S6ºyW5KV嗛m:6{8'R( @pSYk,`jI?WjdOsÈAA溑=O3Atڐنϫ,~yJD*sO=s-l3{2yϽ{8i;uYJk1c't*}˞Ko :"SVoK)f,:R?ofsd-Ϻ_'Gy^r>7}bt:'~fyKrCfaVݞep±lij`gڒZ=[Yo@\T2_xz/l* bB+49èԎKd I:t'v0a5ZdfY5-26$5Q"$V0g2m+45N4g$ƞ4e Qzs LdCPzM l[YDǦx~#dYkߨ1?,ݵwYȨ3Sc}Q-`2 < Kk^e>qW%/Mzs}9YV!I$Fk'eX7oQ ΠW)E*Q@-dD(Su{mTjF%m{ {}O4Y|HHt5 gXcU Ww_10S'TzK,\F(1^Jk`PV582&by&1jS%ZV v9tyOP,dtarTg(t{cX޶Vd[At]z+N,j `[AICd&!Y$57JCq1^9I4Hm{=>5PY鯕Jj(U2#FJ>0y [)m7Z`}rWuK1JXQF+wG%vJ&䉝%6lxr39p;yd[8tÁ \?WΓ1督}&8e_~B}q߸{դ[|t?n8x7Wy_~6KWVkixb7cɮeJO99fa;<-IS g(C.e8D<>Qɰ `Y($cձ4 a m#.$Ō7]o&55H@c4%+(,%%-O qy- P{_](AW9\)SV/J˪гH$l4Ԅ{Dm$`$K=$owRYQ2Fhн|}|c^t{wPջ#-;e}]&G$LXb$ 6 odZ9a%",u_k)pԥzG<^I\c4yNR$ʫDsO%>5bzN{ԣm>wGuO*M0}uY:W[eu W3z;VoqxQ%=\ub:]G!#p? .EQR6x`87(Xc"3L1:) (7t_5`LI4%F@1lԒ%!mz\|(S:z#Z:HAFLSKAT%{ QZ$h$F@fҚ' ++Ӷf^j 7Nsr8u4X&uF߫eנf[t2JM];Q97"[m5k&7ì( dcqu!6[-y4 d*A*\s}}#[+d}9^=p뽣wna:9z*o釙p̳SpJ*k֬㺫㐉*ꠀM&R]6ybr0kð^7Mt= $V5FXM dvjSy?K$r S\0#kskq}òܰψHټ3s:H+Nݧ$-*}Jyo9ڰqrġ v>YjN;l;f'&9\wܞWL&8lr@ga=pyn>e,ugskyIs],z;bCEb<4oqig, u2(Y/~\{<wM߮!CX^81ijFh(\^6Fs6$A #̑4'>ægS}HPԭJ/wvev5̰ M'f<ӸV{%CGigS3ET8Y2 V]PxXC=k&||>Bلs /,8K] Ϡ nj=F' hWhrRcn}͓on$ e%J5~+6фDUNZUdim:I Sda2a"9豖 iɵڸi"znᜅ|qOQJ%NbK, :ɎaQǰhԲX G 48;j3V[a(r3 IDATډe%]ec-Yj)+{#,9&pX`2-<1UnKƭvTeE9XB5F`q[d O7qذc ﺕl}x y۫9ģCtWrwϋ^z!g>dn˵v8E>cjՉ|#/ q v57~+;o3߇Nv] y >xо|$57\ou}9l_lo3-K2,Ӥ=񽌪 Uz^ċֲ'M " K?x$snU٠1X[K2k? ,`gj J'0vX|e ٟgP3ki׮cvi~5) :8/wAU'(و* $"JI,aQrO#NESyH$݃mij$4 /qJa53]&7|ڇ!Vp%Mco>B cBYMhx S-=u!vF)1fҨ򵤷&s-=܍.VCk;Ox%wqeÉs=_=IvpAsxOxĀlpOZ 2nN^xLI?sLv=aӜaGfY:|Aܜe!t;)=⺻}}'\tګx94wP>:_ft!6L[Nt eJ0.2 2U0S xvta?. ޫđY$Q}eI-5h {a~|NN=oL(׃~mie|iBxy'k pJMqX"N0$$^+XIT"13}*̫`ո<_͎6N~p.fτk`vBdk a>wJt_S.]\Az3X6&N=ϝ;/UscpLs3F ܰ.kسXyV;=V7U}ff U8RpRz'R`K!$M$1+WcQe F*2F[ 6Ԭ֨DMjBO4'#TؿI 65HdœpZx^L|2ƅ@-X p&j ,zvlː^lFTdU]3mkԐ,0?o0ɘF#NDuD5*O20Szf=m[tU|!snKJF1ŬMb氯/ȒTTLDA]ꚃ%>:~bC RyX,!ox,bs8Ef2{vx v՚!/ҝa!Jº\¶f0"l(c^eb]o(DFj)"WS9J|Vkb.5:$!?]}㍴'ҭzfL5j0Ux)t OAFKM ߹&:5tL 8za#8_xd0sdyܙ1Ȱkb|}͜GfSg^zDkBx/Ƈ@pD^Rgv p !g@kr)p+M|m9d JRFRϩ]yXGdN3Dl 0U/Gg3@j,(`9ILdgXl*IdN,6!z}˳=y&[U$[YLi(JCYm+q/&r121&fP"2.K6UINƮ,3i_}^[%~ЖoK2 -VăRA)`:.$+W^&%-!- {>dҁ2 ya'^eO)(cpT7KϒY}R ӹ bFy W ~ :ި `]}"hFK^<7HGٌ+C.2́>&xx?7ϯ :%tڲOe02sGKudiNtH壩JU 5 闆yê+nǵr@?uKU}rcc}NA;C,K\ټ9'?_O.~y pŜ~>oK87rK_11;)7r! ^?3^yw,or.ozO/殻z{-\'v%R&[9s$yΦ2zdAfD~!%pCQ IS6ࡒdaBMfx c qu0eN 1]L >}.$9bTLbP1ĤMJʈ}-}Tٿ:;׸Gq&g]羶m&RK`Je,JԄ^I/[C@`/yشOMH9×qa 6 vU$Aa *UmlzJϝ!&FT^ L 5wXzӜK|ĊXxi84&+qcS [*e,%DR=u.i ~vV}M 6me헆{]wB״ X키mp]olM0IP&gVMbf921ick(!,Ai{xJLszmu\I29\i&~kaa8 1esm9u'1gzl_˳خxf݆)~s[7fsL=q#8gc4ؤ1zd WVզ3)'ؤff~6fu,':ͳkLH'3^r@W>6` ;jY2xnY2Xv-s]K>.VKrxbqw8|&u:ML)M XUqdneVh rV{e{|%L1H $[aUZ){BJڹAXn06fv^gM ao+- s}Cq}|J_76 ZFj%E'o7uePe$mMS;(LJàٽ2gL ,1cFdo0E_!R=ެ.3-Qfo/uc l}*d:  0DI.]",E7q:ˈ23{>b*zډ <7D*)P۞ژif%^k@k%xl"_-=37h0h:zj++i ΟE[(,jRQ4"$yTKhU%$E&vf| ǀ4(ɜ)D:d#:iM^RA:4s_OjkHրEXeqY'mrIkA*%ej<  Mv=wu]![#3MQ&~vԠoWm?.߾ƚjkm<5j, Q0xGcc]f5AŨCtQfP?[o` e aOښQNE6Xķ 5Cp7q(^ ^RMdKlsO>zh ӫ'J\)6C_ӿw'3 5P4jlCjv2V! "?Y:ޚ"8}QIǢ8x[uxg[#&ICpPKZ>{ZUpohqHcw*#볟$7zK ~h OUP@Uۯ~?^Q T9zF6#Q41Em3\ңkU$H+e)N"pmz a"LdGSUfQ-R[UcS'M6칝6ו%c6aAjY[,K:]aaQ05w #-a2I>|a~` LnZ{0[n[&ږ(jY+L²g5LXq'ga?љM ظdǞ+c,Xo"vΗnK橌VqҜc,kʹŃ9o GuZagwf{*?D,NV>`3:UJMdG:q_KRYUH R,(]$&050&֐ZRh_봭gwa^ѧj3F!MƩm*ձڤԤq? 8\ {=@M/M`[(&ʠqu 6(-קW?WDK=$;bbf!!($]@|JvA~{_x1Sw^~KV5Ǥp_CY5G&7 F$.۽XI47ٽZ-^Ou=mOY -輎@71t9Wp TbKTkMDx.]=@FT8(2#N9Հ2 *鄁}FY ,Ql0ӹl(qu)ոL r6SS>&["%43f|cL`c:Ы@u{5ìRߩ2K\fPo>@N!Xi3 ܐ|H)^ic;x)pնT-8|e},,[,G `x2{wဴ "Χ:NrKr+(8)Sp3D~V}D4QJd-eiF5ޚH%X,Txύ IDATD7uC`j TkU&0wՁP@L$㴲 $:rRHM1>oAbXgP[nI͢NBӨ3̞ $"yod᠐eNq0pe"NwV0[}gu; ܫ4[x9Ȝ6b`C%muq:&ۘ?FRpTV)M˩=YxK7DN:ԋxe\!fu|轏Hm!Aj~1ǗDʳT/y/i X)n++אZ+*QOl뀥vkI8Dac(1{$ Әhe roȍ@B)EI;{4lHoK S[J?+U80!0+sN,wWrJGXa'P25 &yUa= }@`eY3v^8^3' `{i Uy|N,aOg+nNl&&YFةx5k8],3 b\%t^DMU(1:>5l7o`s:V#o$Ob[HJ}ÎQC0g]A4UG_'s:8ѶRt% o B𽛋| c4D%bo4 .A>D#+K B {D5>/0 +։_鹢I 2xd=klS*D)r2 jCOԿ5!A~V|"&ЪXKP 2~.-ފ:J (WS)Xʫ*hNu֕$'?}=*uq:Aux-2rG&:bw菨Jh&hmS`>eZ|l>^$3L'` PXSg0xL% 0b/_5u=3~3Gerw7ogG̫u~'3x|9c|6_=e (Jl%ɹfA~rBZ/`ٷlv-Ֆc:ƺnqG>}ڼs-NǦJ]\AA4vv laURïg.} $$}"(PQպ[[պ*"QE%!% Y!{;s`_&3w}f=sw|az/cM˶S2?at4a hWذq jly<}25ذC!9˫Θʥ_l`d>$׏9t5;cw& LrwGMke qz<eYp}&yO[ִynS?=-Ot/^Gk| ?]~$ي/q߶?̩Hyp_pu{kxpƥv/fC_oc̅cɩt0-fOqi*.==K 5̏2֔o,{|7HDƭ@ceܿiX~)%J;~_-=gWb{ŹPzhj5˓Jldsi8! 6LQjҔ1ۖ-ۋ!m Wآ;zr ShR̖%61xj{]ܯ8 PY1y_]zk b ᐥ^X/ph`.)[ݑc6&M"2X.4AF+T!`{m}NǗf%/' ,<ۣuEL')~A @;"7TZ2ɺӓ0 mDCyB]pm!Oxn1v:FvT:Y n ,UE{! xM? + T'RQFN*ܧ˺GV2^#E>Yh]HjH[]:!搋*aTm9䙑XfT-3ji5ôar02T4F  ]Zіaii1P$3Ptٵ-Z]MD%8oYbwɻLJ2fU3f LTvױsNNXլjW)uN?ƱųY׼nyb7sT_ژ͜C?m\b = ?^$y;ٱ?q9Ωs'9C1CGiwqya~{s.Kw:nw kտG&Uk+Zfn\i9'pq֯3{ƅS 1鐻·.o;n֯e|]k+ShlV;*x9ݏC_Pa>)J #Ra rp'',Hyº3e$5A]@U+OyHFt`"SV /V& +U,YiΑ•DkJI/c9Re1< -`v֋JRi[V) LQЕl qRe&muef$-[Z d< Lr=sK/>Ϸ5EC't!GtÃor$Zb'FT(kOSZ5 ٘ž']5cwa>rsk9EnGmB=\^Aŋ'].yYyϙ1xX72qncSBzcۆmGgTWwkc; ~=l~oڷu6w?nAuVq>}}ߞ+~mƺ/0fLZMG;qGg {& !24`TMF#c'Z[0#WXs⩙D:9)sB,`kzYEHXhp'!ӫhcb(8?4P7Yr)_/]5<+/^QD'ˇ ǐS%&F:}I/~Bi.=S=q Pf9LamFl&KZc .hRv|qw%mY)FJTU+Wy 1*z/C`3wE[*p( El}ͺ AȐx{{ J+nZg>)[ _mrvz jx%#7 =h& jtD\J%TP(ͦxA"hTߍ`huSZ!8-Ch8GcHM U'*L3:F%g M39fݣakX<`y|ܲza;k\E5~}w}2}hpҢ5$uW;zALھfgTUϻ5=O=|N[;_91}Ni~⛼pew?v*y#}Z[0Z6YG2ìazsjp@6$pkE AC oN@qePZ*y\";ΝsɅʭڤr$>iM۽'WUOrBaS#lLE:aV *H%FiV)@II HC2w tͭ!K4x" &31j^)SgI7*0~r ["&Q%.J1!j$w'4ua̕9nv=M'&jg2&l3+mMڭ$GDOF2uW ?xx)/fe۩l'M`EVHROz1ΐq" r' &--h8_M'#FOb}DΔ ]0DM@_JR< ]F+}\&XER^w\&l`oBTeZCH1#!ص!Nղ4k|8S2*J@Щ"yO;W/z% U({i.0Lu4KF)m3 (q7L* Q$!X{e@I}-$AɳBq>Yic!mL {(ri*˪ . 1П_vt[4p6wp09/a0f)U}C/\L+WJ6v \%]:&XA'Xb܈{Wc])[鼇E.yO,ͥ\;M>{.#)s\h< *)^2"+8rsh\azSM>ч@6 __6zΝ&ѽ!Wy,PڲIuv*fq΀~ulh/iR4kzƚ0>yb XRaNI,c"u^MC_2x63☑8'I+m݄#u$=*'Ϯr~51r.O5|= \e๟=GfX6YpՅd[~?g)ͿsߎvsߜaWctGA. 0k%+r\j>z,;q>񩏽Cfm'8Ȝ ;68غUۇG߾py=zSVoVDzÜ}"̝6~7S#fv25`ߓhS<)aX [anMoyo9K?|'g$]~(DKb]FᅸQ1 #E\X:ȉ-/'(Ibs(!`zJ `YzcU `rE|!0#HH |iRK?M2IX@qS)$؊쯓*9JJ|w"8LWT#Il`aN*NCzrDXXwe -~\yGtz]I/$Ƅ8Y}(lA< Z_TH ۍNYX nJ: *V̊'KYECD]d2W@ G~Ni[]Kу IDAT@0MRl Gzm.MPͱ?XE ͟VC =x 5+23yMrT9]l22މ~ʣYp~x3fgdOO: ;FXO>OW[:c[lF'Ϻcat9?)lb606H*}PJ<ظ&g}/;]Rr>_9#:/~cU_u uƋY8k~Q?bVmgVhh3j#T\?>m7u8d O~3m~kp zBcgO|U`Wrþ<ڦu?Ť]ә=e?a=[Xj.ViR_{m{ū/e1^~o8hz Ǽh/;dn֞߿o`[.}6>/1|gKăۘͶWe"0c8ZV,[j}aJf&p[W߭OZ$¼ A͡( :2늾@c[2X\bRjV}2W E'8v~7yȝ$45T]۟j0T3 VU8h%E!}^ljmнaļɓ8.sh=z̶|E+ <9Ō3 8/\ RmDj\ؿ#\95}=@pl"W*($\i Z~>eX,+[3FE]ȻcLS,ş,ĘEZKMD?")]f$Βfmu@r*&#L>UL0|W?7-b|F-Z߷^$(\XAWv&Ąv&v&vh]Ybنf xKheJbZR)ܗZ#D`:;6m-< k02&F GO2,ṃmKUͲjШZ-S-043hrcGӱeԱecv3iW7f5wOYʂ}/.8޹+l^ R21o:'8 5fݷsoOdk;po!|=K9|'hI&_ڴsu?ar9XHg>\cb!֟Ue%9g5k_ ?|+g-э+pՔ.M/cSXĦ dLs{^/\̹'kGpY?g eG?o~ϝ5M}߸ ~|3S )+7Iܟrؾ)GI=0[ieݨ1d U>_/kqW+$yN, 2jȝblu^bO\p*umUմ`GF5:8;KLseG]> p$sV!ц(]kbCL- vXV5aP ~/o[5p/ʙMίTfMwMNtz^ _t߹{:OWjԦn//hirQX31'|l{__m||/rڂǹcuBmbSy|$얄| w]9nTړG=~.x^~&kaq+S?^x)r7󲿜d yL\ƕue Ur,g"- Og3nE'jZN`rUaj]t;TD6ܓ&>6}I߀^G3Ph#q*2%t\PYcqJ(:=$pQo/&d?*#v"\XI*N.̡&74 0Y+Kəҗ 6p@P%ypJH:q SJ etvRnQs'Ǻ]$cT0"?Q#o@T=2MrUob$P4~S#APRTW%Be4{'{~5QPfvVo72E)&iH}NY7gGڵ>DYG}6E]f3pHK!xXj>`1PKϽ˨*} ܰ%*HWS@Q11!PQ>tMcΜf3ac Y:-Iƌb;C`0Tw.E5! 99f {vm$ݒgRp Yl?)M'mFayn!6X寳+Vlά2gs9eU?ϐyPs>jChICJRHQ-R&kB0R^X&̾wU8fi*+j OaOh0{rOHBk(FF2\_хԥ#e=ť+VA:hZj?8Mڧ/ {ea 9ȢD{u=J}j5F ;\T]iU`ZY7钮κbvfVK{J-r"C:f3 oF[a)V0[B0[ƻ,gɍ$jbiT Cuˤ~˔I/8M#va{˰sҿW+>O3r mgO5XrΑ)sfZ.9<| 73W5hټ˾)<ŒiG9:/51̑#aq6<L9of.:%oO-/8'gig6~:?x9םy›ϫ>skgK<1`0n滨>p NsD`+r򆞱2Rz]s r E0L6^`˩ ~ /͚೅e.~L/×Іm>>TwlUcfwC+q+aNz*~zꚋʴvNZ8C hs+g3xj|~皛GU=nw+/5sfM7ߑafOO8q%,&;[{ ?IQ um#ԩVN|e/ZkŝWWԟ_~ wG/&saS8AlcaƏn3Zvɍ\t=33lilȽ~}/kRzKSNሷ}__c0]R o\;M1eݥuo@Ӻ!Z:Ъ*awݰavX sʨўP$JZ^!럼SBDt5L @ d@rP[)W* -kc@8nm@C 9 ѳ+E2|0=e2u:B9: T:ј u9rkThcyyv`>R _aKB-&LP:5+AH{Uk)~X蜤 hVSJUpbX9/ؾKvL")sYyp2M@j-]AK%qW zS&r.vQ K{uc"7|NLIGJ_Sk C;#A3wf@ &'UR,a%ȦDfML\0pȡK{K`sCwBMaOLDFgpݶZ ,$ֲL72:VϽg[ޞb|?ʢCpS+_ÍdCws˿W^yeOry+>sbݳ97<< ͚`{99dyoM/xi 0o9E1B}3M5/\[bJp%ۮu1X?:L xL=,Ķ5o*k~d'ܻC5x 1KiR~ˬ}-7ɎzcrMقa@ka4ǚ{*70멢cKKl-%\Z+F2UKHjY00G1øU61`jMwS@FÀ pf‰oSYmf; 7D͗zjF_ZoT Z.WӨN" /%4M̶K&A~qKO'3Ew5Qa=ierv&@NHⅸBH$!I&ު,jR %0Rj=XՊ ϼ404<#ڴ5p8ւ!!lnre.]Y^&L=(*_YRuN̽M=+9eVV[Q+msrL\DzSXUJR$ CLv2lq2Zt{[RMwLZ01h+%:!yOXe%m /EU +败 Ey])G o,/ym(-" ibJ8ߨqgy8o߀!V͛rop!X*mN*~L8~ا(0M`Ì{0W`~ F=\pR9o _M ,آ'gUˊ!u.qsҹ{Rp`+s@_V143z8ŶݛRa[a).WYK֏,`_b"| }:>諚ldҗ=p+Ej{ IDAThP9C51}ut\v1.+4CS:>=}A N1];BF In'a G&4&>{˧e?f0zMf˸gqGҚ1ZM[/E-{TsZq}x-lџ|rCYu^'<3U\cCæ vټe#$<7a@1#-mlm跖p@ϴqXq y'{ȐH%\:^<ȤU5eM*o'{"2&Ƞ+{j8/W `:ސel=dm~qR2>YϦ&U7;6og,\q֌ܵV_Wi/yg?<|&Vf1ؘqB˷`bh'&h>{yRsqGO휛xϩ[ذb vt^N]u]6Njp0TK\rѷؖdZFȨ6r^wc0Ѯg X3x&Na M7| }]aԲ/zSeKZå'Ibɥ|`1PՖE3 '<:?ފz!@A[5'!Nj4B+.0 ] j{QF`0w˗SuR%3 Wdl~%^g^Og g_ 7\o~ ?/WL|ngp y}M=#N6|=ٻN̷^+.y7}%3 s.Yw`՝0:–kwu9dzΚEنfjؽ1<-v Sss_>zJ9玓Az0jj&M ug|"8xC[^x^Ci[74Za*WɛHR#cA:-BR#LG IŨo hT)ؿeFӾ I3cxHP# &+ :SOnC"Պ ђ?&)ЕY%D,۹.x>u=eXc[?Lm0̣72| p/ ndzBQ1M<uy+PU3B)h{,,}גELknO}&yMUQ!ιW .t ߸>Fo \kQG葅#L!뾴 h}i5غEI^CR΅VFdKRpC sEFlj p]Fl;nD4aQ% L X:sFT[;eg9̉ΐ&x\K2 }k 1MeV+")fЧcxe$ [\ Xa'֋f+|'ӄhpKTr{<{`)U{Dm\d㩚^&qH!rN:}ܪmVzڊ$2No•=l{s_Ry Hlb8nC%@~1罴)d>̚ PH6<S/@?[h7Qp! ]E#W{dFMEAL0x%!Z ƺ&}jZ@>~r0Jة."uб$2wSCWBLfLiA`ga0`k'Ӡo~ 3_51oi枦qiYZx :zc}#LPN5WY^b;]Z"#*0~7"C8#"f沬s <}<0"@Wb@پY'HQX;WYdQ`⼱Nڭ wiNX3>o[^H7="UB6kW3ydY:FARX2PIZ&Y&7,-C #RJ5K^r|뷷1Zҿj& |:])oz3'Y,75<frxc]|lOgϳZ S[3.⚇<)wOٷW ^M?e. #<慇չN`pe{+^74}_ƙygw1õ#p'y~9)aCxI'Ȏ.;w{n\?MϔS~ujtmc+_;b7ϊֳy@v#U8c>z?;iwk'l&/!ªanӗxvanúؙA:3ky8 RQeCѯ.'rM 0s PSxM\ӱD̨ o@&B|+lWocoy sު q\U^QjRNbټ4+CHC@(T-:e2c {27R:xl'VS=Yѧc)Hy$s%YO %F۶U6Fs1_dA:e:$FKwht|zពcAqFIEN3ꔡ.t%0f(!໇uCz;sSܖ|)s _e{c< mW/[m&l31_v[{߳ej̩ * LBn+֬s%9R DC5kzKY `^|br V9LG79;7eWq#xWgü|ߪ5Ï7! {nycr'۞nLlL}avLzn7?5ϙÌlؐ12g23??')Zd׳iKxKqEiW>;pG?ٗM7oo܁_y ~Ƕlv60vZ{~맦4V/hםzS SaʠaaaxFg?d/\4%0jR.ç8r>: `@A=vaP+t>Ebը&0 L_Yz#_&Վv$D6uM60i ߐTmZa(Ë2K Y]o`{-'v`R!OaĖٿRfC;p^m#_Y"Fh`cM!MfV}G˥S:^U p (L!Ij7M:)wם|΋v㥝yN %X" %DN69ւMB$A!I@LRbw%oi6^Ky->%Z˂+PYTFu.C-k")nO`$Zu(#MX=÷~Kla _200"Šn$-@WCf=ՁQIH%,f ̟TmU?->;7p?/ k{]l{Z/{G~ZUhwj>MWe|Uݶ/;5gt~\^y)ߙƣL=Fo&*mZ׼vrdZ`~J'yp>]/ Y#<[˨y rp x s$6lc>:`}mwKUss;K)R`+V,Qh$3&{4&(R&{nᶧ33{Xk53gy3gg}>bɘ񌝗,_QX4^9'ˮz^M]m1$ˤUwa|*# \:Vʵ&*(GWes=Rx;1gQ˵p+*gQ$S192( gBfEcQaύe`lL6 v0Ipec #tn;?Tp%6kaM"ZI=1aj1,{224u4?vi;!N05 _:uzbZb?$81  tuULu1 0JKƂ$#_ |S?س>5_RPP,jmZ7ze)\XJU`q}]  "cy`pcn91U}'G <c ^F"5K8+p0}e>טz,&-+o XPoX AeOBOM?y;LT+} "#XٕZN*{w +5]um{WcTƺ1d7pdc3ƠUnW k1.7ⷩ]Mic]Fpd}n59okE$͵b}Cw~]ٿ.mlx<ִ,k{w㹶-D{P1#T'ݯ_}X-VMp85mҶ7^֎ȼV^̑7\U룵d,`D$iѺ.|riީo `{+泡c-bg,`|%V=`O]C}M }s䛚ii=56DՂ`\ -$ ߫p4cMc}N3(< iXU쳠NtCk,D{LN}R@* DkV(7 S)>1jr2{h-v:HZ PVdI@kh !h vy]kCmҘ1qȆ6?;4,*/}Hտ\̱d q[~:~֚w=?2amqDSS;&0i_wVٿs(CxؾVwvp97PzF81Q9tl;6YǦY<3u11m[ZgpLr] x-2F;=ґe#cKG3xFsՓ)+>e܃a8.,tܫ-85#lk.^p8?]s#E9fz:~{sk9ꌯ|渝|ka_{snB&en-7c؅/׼\z%_]k^r;̇_3yй*ZۅC\0 q1skt՞[G؁U9s#'W17e%J2b3=n_iUUT{lNɲnjg͹1i W}o3\sjxmNΤn!~gdB:^[1 wGdD&0f'7sw!9Ţ9ˉp[9Tl^+i:@aq|Nn^4 `G*`O|P5-FFp@l0Fp·>wbxOhǸ+-yXJ.oA\gcS[d_s4_ߐ|s9yo^\vbR_j>sT0̷jWR1$̩B[#^chF cZ1u " ;x-~Y?r|>z~70_HGf 0Ki9(;>5p3ٯ0u8=yў6 GfCw[SN=73'7qW_ƒǞ6_cïѕ[yv9_曟yzѼ8ۆ.?.F7j,>z7X{LO)3w?னマ Oaޮ?L j$b jq S1cSG<$4vu, T()E(h8/L̐l pNx~IΜ!,eL_2$}Ӏc(S‚t#=Y[XR1P`U 83u" ¹Ҁ.M љH(ӣY jMڱ81g;ϻ]8ž4r[ocq:I.!3W 4 o~an~c?U2Z Ғi $=WkuKG#\bF$ѴM.W 91 XV)W9: SbѪy`46R- ŭ~y6 }A:W+C0Ѻp"M6RISۥg=nN3F$l3; IDAT&֮u6wC'lDSfxXs,9V&s#wg_g/EGx]N y^i8ϩ7sg >o8Oڛ_} g'9w|+]k>ߝ| k@}|n|g.;; Ogueq#8\x.nَ~XpIef=o}!hÍL_s?p:a“uf6tU6<@HE"(h'ݍ tBS*A(pU~)[z t`'T!1fB$P T8 rPfNyTt?3+fD/=N"KU7 D8,`pS ZT~L(hnh0j_;+7g6g MSQaX+I̪ԓTKk H2KX/"ZO>*ĚM%eЅw.IQ{Z#X#xef-6e^̍b=1p#812 c_70jF RN]o@(˶1!k>w 2 W`u0)%ZPBUi2gRxẌ2YGvQIb)14ot>Ωtcj{3ֱ.D)DxeM.g^q98F2e"(Pll,Y$<8^וPBRB)=91$ x]✙#Q욊ɷ-3YFd@ǡ='5[f7#noZ'^qC [v]sͿ0&?K^͏> .|쬋_ ~ʧ{c~N?Ls/di>~ɵl7_>+@ߥmov.~p1 Yab_gs_pjYxXlGѡa.}ij{vs(xE6+qU.ΰP`%F 6M}ྵM + 980`:>xҳq<̚>l,'X\SHX< HzcbCF;%lUsHkڸ4$/ԶR;|jkbymI" zU( CBl~UCPyݪ"#Y(_T+&ji79vt$c`('[Mw+l7QEQl⛶0+/Zbw6lVsM<[@,q^bXg߫1yfia<ΜHN}4KFb$vsm/qdM4ZNEJ4)!}cx㮙|oǤ]˷~ήk=08kTp,<.t*#$y3bs~Ņ:OdS8[b]rN={J˵p==;&yaüa5|/ ^a^>WZro2nְ~CeEWn]r?ُs:>{;-ex7Ǝc/鮾,v}>]wv{4qrh4B+3p+f# -\#!ϯgLfoAM߸׬9S6 W `V=Z Ē*[Zb~m ̙3իs `L'{+13yG/3#1.x\sL1o~-Io~d~&cU?.p%%u%%q'Y7ӪNo Ӱ}c&TȎ2'Vqlbu brA!@tg>r07Pdb&2rǃNz#8v1roπ A3cݔ/;^e0k юJ<:܁^wnfTy5#{E#O=0]nCϯK1Psgt/o'|2Պ{f?lv #n+u?w#WW{r n'}+^esxqf~¥>d||m&jv(..]xv\eh]X3(2֒,q4gO͗uDiesfAWF,8J{2 ŀh 料 G{-jp\] b-hw+kX,4IV;B]9nXV̮aYc;SESl62'"cO&8&߅FczM]ڔnܦv>75`͌wj3Sc]ܨ"bnX;bLkfYneȶ oNch*`##uŬuʝ%|ZtuOb>3ݮcGtX xVfMXdD~^;o:Ζ`u!;#7>o\y>65 cE7>o_&y17M4態I\Mw.qDBnFJgȴiξ_k,GG{lq黒T5Jq|-ZU+c]x}\R4h H)HŠ$*cm- .v8-:G{;Q?R4"0sg kjl4AR2kRd&_c?<p1iJmyk{wgNw x}ciNLVx$/er(/>dp.X{wy{ެ~Cܣr9Ϯvt9m-v|O5FpYl3{;ﲈ<;qVwxٓ; [+$ݵb)uA:ycϴbj$_/7S7KOuT0HhT"Uvį}Agm_)APqCc2_*JrihYh s`9_7zv ÷<3mV1Rhbz$0c4s:˔;bFrgq2el_c>}#{mc-J}yw2<:Oo/ +OsrNgROOxݟ'l:osһO?slzn`dyį?{&tbgxNe΍ ;γFrn\Vd6n t z@zSɱg1'&CKq􃲀:| ֹͿum)8& :gՙ/0pB;eEyZiw\A!xefA2Fqu1PH+k&%p03=3[c4}M~s V[kL<&1g^:2M>[1BTݒ^v}Ied+Y&'5Ԃ8\*P9e_@ 81\ Rԅ7j'EH(.d|>m  A@6-3^f \$ D`W;6ZIu#!V*uX:s նʂ5AN[=bq]ߙmYvjTٮDY}[ 9;X*۶aF0<%8V-GlJ0Am&IMbYA;%+vaE>c2^j7ι;we2vsؾٴK,\>=K,}h=Q;\gm7="v\Esx{ j7zpKp;>#| L fp5chEZwct1urǐw4uh4xԨ`*3Xc\1h 1Ǟ ޳,/ix"8,"#G8پAF%"]{K[P:!N4!7Flti L2O% 4k-;eDg'brdճg,HiNl|%s mR Щ#d+$50sj,JydWPN 3Հs{J?N Ұoqc&$_I(B7=S`:Eil'M ;Q nb[pZm+s;Dc%CHRHA;h$־x<1ߏyeL+zl}d(ʽ{f&sMhi*`,`99+Ϣ ,rQ/ yG{r')n'\yѩ9&glunz`~[x5=[n=߼1t~q;^^_ gt3?.?O<y恿Ky2? ~;qyM{>7]11s|O`‹8+x˟D^|!2zӿxVoUj ܴ:Vg+sE  PJgX]٦A˹80kPs $[|$pi/c]pƆɐlXW L~Y~6U 4gǧMyeB_+[6&<| ms_w `oi~^eD^GhP+L@(Cm@U`AZ2|g˦f0 ,L,ѰNyfbg&sdz: 8D;A[4AK4. puFu*dҦyrNY؜CAXz^_xުVIX/M>IBW Tk7'GO0>ET'OIvOCyAٝ DҴ1lk(DAΙ}cCۏlT{4hp8vƬ|QkI<ܺU'GJSW|uPAj% *Qd\mC])HVMIN2z'fti% tsQ:ڀ| Ω vok_X,MۆImkRV_hGb)48r״g}XC.ߵUlgl.}os -YX6>Upq&vyR)&u3+s) ZAkWs+]^N}S=3YCMQ*BLNA;:1Ʋ%VK%Py-sޙӶ$wKs/p#\SZ( i± Zm1@FVakǀ27U"DPvyV}Wm5$@|3F DբAʋꚓaZR*3eOWLJt5Ak2gmQ`'&s,8'd>G"@ȽU%slms?MDŽXl־A\K6ihd@S̀`JCU 襌hml-Z&gV@Ƶ*|kGGy,a uSA{t8z063Uy-rseT;1kgb11͏ &T3[BC G%cCyspq A[Fy=y=8zɗxfNK}3~*vU_E\ \?l*33gÚDYzooֱ@Xw,VŒ @`k$2/8QY̶qnDGVѠj^Sy'9hv -Z|tW+Q;Oi%Ķ6J 67}+˘IpN6 ୏쭮sD;Ǿ$T}bC[1K՞XN#DX3ݟ8s>}F9 ;ln~qA2bl.f> شd5j*N >nG;Xb0MRHJ@o?7 $S0ư&; ~(mk"N,diV=>+xRIRk{60~fP*%z*Q."\ʾ˘r2G?(k2+U Rv Qz 쬮#1m:No@ }Sl3\A) +7nJª֚!m`I4FԒ`Cb{u$ $`v,b?0PШXǖ l `Ϙx[B<l`H'ܫ#ַ*;-B|m.47}.2p xJeJBNEEGōpLP }/ Ў㚂31bڐ-i Wu N2GUZߨ@U8{,-}i'* IUc'D\z4YV'1[1D9=e3n^t q+wM(Kkk ≕oM2Sa@afؘ`C&t Pu՜O92n;\ 1n+(\1q9Gb:({v.@nI @9[f}ˬMZj1Rl6ʘ Vp3uJMԩbUXB6(ls:};FwP͕Ŷ(H-\+d t(sd~R DwE 뫫4QD` v=Kq 9G-x}›oTzU)H.uNCgQBSompzÿ "=SZILȃ[JEMmp}(F% @(DkG[q|Jc*͢xbQjukr!-qTVAh:uuG+q~8^f/asuhXC v#eevDCfQ[fA߰} <@R]ieꀲRC+:X>%<G/\C2*X?8hl CIRiRMۉ|%Kd 7uUR%\&)9Ƥy(G'J Rkhң58MЄ^&t g=VxjF^U6>{W=l^q̨~P=wl|]6BO]-3q8: .*ݏ1>!-F| nD' ة?EL WƦHm[hl^ "I+cAم]uF_O֭gмϝk~cm`>om]DHjWY"}%dgqϧVNθ4?lǫǷpʥ#-g垭Wla>>X 6^RV#jX l3rQ9vɺV᠃W+)wo~yٻ×_.Y|Xoy#^^<'gH%5kyhz8Y5e!yJ+;9atVְş>^Xi 4*NnX@  Y't_l_XTBQG,ͮYQU`"`5܉nj['11Ri\rK fc|,Jk!I$lԎ5!}rHR5?q.H A)3NQ>.N Jњ[+vҾ}IxbA,>`16»i֌ s H $g6Ay!1薜">Y_i~< &UesdFTbE Jse]fR 6(²b׍ij9^Y]  5b=UqN#7 75hdn6lf=:V <'Ҟk0yƬA$f_ dV/Fẅ́YG>L9fsEǸ,΄ŹcqO뛎G-ų,X:x4Nz?'cRKLJ$ֿzõ꣧&xs׿ȋlV?28/}wKBܲF-K5W^|fÎ䞫.aي)^8dιrMW_X;__jsYw8?S=V#7uRf ',33=_8BޅبcۍTl**] KT/N 0[j-2hrG?$cO\AEe#QQXFrLLZ}ԆIf}GC$I+ҀqiB#iMi91Si֩&8yy[xe'^) ;2ltjt9T+Lb?a AVtqts9a AI@V)1\mqQ,F֯J fفh 5+}"!\t;72zH%*@jY.VTPVyV~E就`[fr? 1m4eY=ERW%'?#-Q,_!>-ZkyXЂ2% :I:W_ j=b'}[V֡ z` oG jlkm :I3+f=AxL I[MXm<8:xr0+ * D+\G@8O8ת԰N qX[W>k鬝P830`' K^4!"TjU l(+ 찠IĤb \ iExUDۈӀa;\qҚx,S?FIrSy|11Tg:ܱhfQQ(8k85cob␘!'T2 Hww<[RlneI(s5b:A_ǔ\Gp+GYTv< `3Sa} 2txֺ6`qx7:6(8J' +1 Z IDATWUPU2Sksd;K;/kL1gb+۵mcLH* "T(kQǼ2u#c2yxYFe&]bڭ~(;(+BA`4@y2=@(T:4EAv^h9E$̖sԥ@륓5A|2~LIASe43t/ pqsM_{mnKB`HHI쾌ޙGŝ&);N璮S? {sB>cN FeB\z`&bsRnW󻵵Z+KZ!372cb5bN:O W6HڶtfƇў?3_dL;s 9͛Yas`;Y8|?Ǣ{7qn=YJ׀'6`qOvěVr_|l>GW]+|uw"z+q\~\FN};o{χť?-8モ'{qŗ 9];({2FG8)O瞉!Co '!Iya+W[X8*߀e% ڧ#9eU夶V45 XU )j*\J`QZ ) ^P*h$".עľ^]k & 堬Xv 4yRlrK؉Sޝ4ϴa˜&fy'@(-6ڭ xU3xf/9xBbyPWam >_"(kZ>"ν)blJ`l|&'U:7>"tos\n{p}]Yu&\/an'֝6օEП.߸u`* O;unmm+?XuG_ڿMs]2y݃vξMŊC8u~o~kQبctF;lQOb:?:|N|nx_="B^s>g_sj2Sͼ'K^:8[|t{>=gOsu%s-_>y!wp5_=7v9`a"aۼqvK{)fԜ-8wN&:Bb *>_ Z*B}2˼J)x }19嘜v#(Wub6uh_Eߔ./\'1uN*_/*B_W+` |X(+s0>̈́^oF9u y\;v;gS9< 08k@[:>Z7)Z)o:g$@ҵJ(j%`RЖT~$src[yf|tU!X;"u-i"&vMזϔAZr s~I!1R8q |f߁9,~Nijs_emO^ň<;>^0B8\ ƦR݋^ir l`RE0HR+U ~WN;b);f!q%1Qk }Kjf1PsNpbs5U] T.眺l77s$b*#1nκ/:cma"l3 ?M|x1޶==7ޞ"S&轤ʴVgqEW߫% SJK u$mwI:[ >#Kt xG;p.V$-R09u/vSM.NSV9Fcp,rLmg|g9r..oȎz#qsis{7{?MoY?^c;|J|_5c;+Fc`R`]q(Az"x\\mlD/(DV5R¶ X:c  ǀ-Cٿ4U \[Y4}S 8,؋,#/f;C]1K8~E׹\e1 &XiH}";=0)w8BLٿ܊.AstpWBrU|阭 -a/| }[ Z29o>C$ d%Rގ`_^lNfEjfJ~=vcqssJ'/MZs*uHuiϥ{N"l(\_3"t\;u[ƃ&%~ԑZ $.$ШrS4 omI2n&iXYgw`p2hkm9}V)<4cdKI{5m ^c[(0 P?tLΊFkK)ֶСyŞu-qVX;c:Ĝ 6lA4yو@) s Ι/,`G\[`WR܊bƪ:'zS2mSex \K"WQJ8Hd*krHes>IMny`rRݻqhf 㝂^|J,`n#%4ǖ9j\Ai p> XJC  ҁL> Lk!G(R"vB83Ui ޻J7uwØݧi:T:*s`Zu۽5щ]ʮkeC!o'@ 2c}ndƟwz8$^MV1UDk.2G"Q73*Ρ!&Z9UO[NbC绪6o]~9SxoE(CZh~")JE-Rй4 `eS7ސX11ZT"9 ` ԗce BUi%h|8qZԭXiX5*KdEC2!N+e{ƔpYB Տ x-cQ} #1H)"cKΒɘ&m`p|_3IBWr)i|Ug'[>t^ضn"łVb"5l,i|6`¾8BO qb}XlI$\c3q6|\ǩ?2pd=@ :%]QKclcon~mdΝAgs cN;S*<;瘛w 6gEù齒۷|r%rg+ Y9#_Sz.W `bȱ;Z{ s]#n9Np=71`C旷oGpÔ+M}l[=Eslp_+nbw=-K>~C>wnoscJιгdI!kJVy3s,ǟ֍[t7/ο1}tWog[cO}a.rk8'/gNUooX%ԏ5\CbI?F"bJB)23ZX#UzY󘚯ЭߨDJԾjkF|?o9O.BY*QE&[W AmKj=Γ12%b*gqoαG~@ UmIkgj;>ZSg(؎ OcGAB$-*F$q I6^lsj-,v.q8%dP&eƶKBb~[};_F`oW R۟x0T횂 WRW p+l$령 g{~x~݂9$kax79v\w:=m0%?a{ =9i֊-+X2rqJ -r wLme{|#u |4~ƅv_ww~♜x~~g#o⧗~'3s䱋ypGƃ3gpW 0=LU)L0f:L(EvP|GJ`lP, ItIHk^l&F:4ZT+s4}}t~jKkf v)ݔm0 DE5@8:d͈`p Rev-߳jie HS"?n`ZA4DpQ$82ߡ/,O@PYLdtKK4s#jز܌JM#lH $UI W̦q,׼&~m2 &4,*d;XEYm57y 8c12kucE6fGk 4_B/ԧlġDNɷN mؿ鱹RY{Zr3u9ǙTm`[&;!93wCg?/[+/?{Y\w\[|q.lr Gܵ׍pu1) IDAT8u޲?rξ9ͯ7g0%{<_A.go(G>dok^+mswR_.{95zf=[/{y6:{GYÃ5Gk+(©=ǂܫSiLײ`wYp.ʑ|Ӑ҅܀`ko}MZeSk%+22Ew[,й*CT"PX\TyW4 g2k Y4V.Ft<:Qyiq36 ˯`4: K+GoZIKm VʠAi-h1@'Qڻ:KR/8\S;ggh-UAy7XlVĹyYo`#u+H26pm4JUHĊoХk4 VS6F2ƒ:4q3zJL38kyej(RYHac*.  3 jcWmHlKib"XYs4wYV,DKYc_(/KƱp:/W7GR^#]zx#vp mK?}m,_yQ0{̾q0ScctUۺtckc=Ws-e-jЯپ0݇w_XzۙXX =`fNkpý6.q=u>{,-y⚥ܼÎU72:Spe_Wy{+}4{ ,>h|^y2u=}r9 n9_0;?ʼnqؒοscX-L\4?l*ǿ?}Ü ޗ6¦M0:]aYe@/t`5S;kBU1ܭYT, 5r u` s>7W}0V#{Xe68ܤounF% '7k/H9mv,c1WSq4j SF ,,{#&JFZvzx')gP{iDmrߩѪDe j_koE92@l~Z[,v15#Mb 8N1ɣ:Iolln$`k:LZ1ggŷ'dt(kr}Q%rВr c|IIU$Slf9-)6(j$Zcu /AR~,X^=~\rIey%q3ۺy,ƪ`̶`6V9ƹb Z> /Hq?~upSk#9lߔ .aG /yo+u"Ur Y3\ =?o##m9;796.-{.g79Zr3>Y\/Ϙ/=?ҝ~#<QOy_?.<ל?_$q_"\#ǟS9s u쳢fhg>ɄP l*3g$cG9$Lu\zN{^Xy ,ȠPB#M?NIPq0W霺PgL Xk}h䁔` H7kuzm=Smc[Pȓ5Y7@-q[XP w,,č9~@t_m2MqrvBGP6==x87@j2T 0mxIU.Xc|@RӤ,&R_hpа;}bl aE/  -g1/XGQ8p/0I, $gK?v23֮"-W*1}QWyeh-{;dWd䤻0|d&Ư_wtjCHklӌyE`M[8 eSc[oZAO]w. w}lM;8q(Oo}yGna9jװ4?xg~2W;cU8a~?fQw$fXpxbE5S.0QpؾjƆaJ;ϛl%t7s w ~ Tjb2cBeHcUQ4kށ|B Sɨs\ xA@M@֞uih^yq1s!+F[b&/p lo$f務sN*CٿƎJevDrv0)q+P^yL9ę<_ ra69 qY5K]7Jު8 cTYJ5:ЫW =pWlK#A;^/1Mi|h$8`aWZ=jD_01STb.uJ|-J;4^{ W$%3jn)xک}i=jCB`ZM3+h%`zT{+q1M,D9JVS8Ṣ́ C{>_6pủH Qvp7en*m"p,8#6w =.TW%,I!BjSY H|ֱV@zMe%f`KglC^j <08gi4_FuIbwd}Mj5}  1!<.rZ,ƶ10jgS4N)H,# JAvQ90 :Z(:N GQB2n6't $Qϳ؞Bis1ӵsi}&jJ B[ !xqKc+)azyPt9^d}_8a, \)^5<;8#!K6Ygk~zc ݆`a;[6mf,r5.Х3a/ y}"2W" DBcp27.0+irԤ8-|C$4-eb_Mah;ԮQ!n <ݝs|e[q#[~STF%BmiJ EMC}_-xrZ'Zxy[wx]ZޤD&pz-@z;ǶM..h\p9 7O9kRWK*8˾zeE 4*5-c&f|ݰc"ZMKa|{1/x_[c~`A`[X`3H-~5H9`Y-_}Z1x^W@8hqisM✶6[m|iga+ *p0s:98x&LWVrvZnF ^ZsÎu^/9b=jv{;8eB>?s/~?p[^gRse,[",_,, \EP^ųD`L"kk`m.g|SЊ/HyN3xd+KbOoX1\5`xd-IZW\xb4o4 Luko)-PW~~1C0| %* ivfrՖ,+Das\dF@xzۚ<ǑƯ/Z/&Bt~(ڏ-Y͑_uq}YO=.Ůw4uX`I}; lck&ϸmf9r,q,]jy5Y=ک=x~+?O;dVebgℑ.>_ΞO|/m[l>Qǿ8~w}^O&gwp}6μ}5Y:緭`Ϟgl`\͆55KKC`0R\Mf^GFl-DJ蕁›mD]uJ/,WvJ-.%"{+˴OUd;Tpz1G |uɇm9)S=[.)hU/QN#V$ aypv/by0\UYAE0ck!L*@Nbs~KLl+Wf~%&RW(,etnnLg1wCz"*,5E&ӛi|XXgD"nݻ $ 8C&B}k[#7d+)BYE|X'm!X\mhG7[!j7 B{|<+ᖛ/oG=3Vg| _x՟=yp?ȏݹKǯtv]8uw>xW\Dw}+iowFZ9E|z49|I.Ҧ,L.UGK8 +4s"s1| xs[9f]YŨp%3smcůdo-)π.\q}زsx gOd8,Qu&&[˚n8 y:Fq IDATanV(d,X*淇c+i_h'XW\F0D5% $]S1Oҽ SĖl`ţsJv 3swJ1#Ÿb3) \(֚Yq^EErΓ5 gn?h w"X=G/ j?4ƱomH$yi9=Gf.JdTtjJTS "7R[Ш{D5 Uk߶yx|a 5p o] 7p,n};05 As @|J %h=XfTZ!Ze`qHZhi%xGjwi\P"0R l^qݹӃ>D sW[f &{Z,[kU!gm[wM ^CqƌO.Y=lP{3I'5Oz6WUtG`VEU7x 8adCcx1qt ^`W33n35AK #@Fd l 2x/5ViDŽO@OF/J.f#Jѣ'XJ2Е2O}e7UD)[&3g23yw e72aaio~%5noQ·9 =(M*D&Pnh1Ahw sTn,7SЮ\\O9R 4W5K 6}ӂ` nzj`/"9&gAV7UŻ2skh%IhEgA5)MbDwW׮%9t\l!mł^lcݫ150D( uaq+:[&ab9 aƒ}XQc8I^}t7n\܇ lߘs<5c|߷ssKyg}_ytoF!κlFx)0 9k q΍NNꗳhh2_C̙Y{߾1-.UC 0lwMmw BQf|cW/#z~)78O VGV[Jv9 A] ^P͝ a$o1J29Ȭ4\ 1cߙJ)ane&ϗ7:Ǖks1rU+c!蛉&.CX"31jzCyALsn #7mf&mtAFmz >@c,PܕZ7z j>B`7p5DX%-u6!-ǨE\j#[[jq YSQJ܇O[OLJ-ֵЩB ,` OA*\TV5t|W%sf {?rzN_:e%rKD{G-*4!@1L 29x)KXvZW,惈Qjصv'&zcaN.[V2wn#3@ٵ:GA?̽y$Uy>޾فdA@Pى "74QQ%Qp|FEB.(dvv}ܭk9MyTU^OUg<#L;FXGTtV@Nq{4bYI5\$ީ1 F G/O~?5p$v3ZX "# eoc[0;fIb- K"8aic?JgڂU %=&StFy:\C  cOǬd'T)zS"yM3Cq*JNR+k_tJ,9Vlz=[}1iч<0w Ԏ%VVeX =Θ \jIU^(*Q^WizaWLY&urcH{@۪!>F3gd”Wv' wu@g2\s+YfD=ɁVĘ :sH˱54RO7^|JU##ϊ#λ!1hؔu{<@+22N5QUx >8pENz'bj7'^~tۈ(p89':ra[IE,S1!GeZTKPKL`BxX8SVg@&@L"eWD!  /t%y-u+&phP&ġC>,7zͨKS9sy^ ;!kQM^ʶ$@h ŝȜD^Zx͹$'F~km J/*OYpnƻ֩\ېoj5 w!H~0ԂΧzw0|4x s ?Kxݛ^M{ 6v],[02Pp kFbaԲd4ӍϷ.[wY |2Fs߷-| R}d󓷱ro[y'mhG7rؓl瀽p®.FeQ@4O|O~MxW(n 0xv-Cūg4{cϥK&ؿqӝ1?8 {|Kؔf|5Ke,˘yheA1Xb,r)zLzM8֮wl(:+h7s₱юG;f3T3=+pI|Ո e+=3~%64o{DVR[BZv-eR0 \n}۾돐 /9@ Voﶶ"_ ztSm,e</Ɂ* ŋtߦP{T5SKiFfP2&签. W?WIq}#-gO}+9 \jk|$T^QzJ6 $yo8 reCt쥐+A+#K_U 2wm j転kOue͐BUc@_#,oK]eopAJ[:1HϞ, BImbWe/| z cY(fț1f¢񘡁ǧbƮeP@ .bv6,lx² v̙|g)|?_2y{ IKOV,߻f7pҫ^COp﷾A;.as .aPD޴L6 F <9ȖT$f"ORdq$8na$uV61p(L0VVh!V%[J90K-7T S8v g?2,R`qZ"7kZ+JtP#6DYTpMVHOkvY@>~sց2O%E{.:!x\)%:UWOJXMyג.1H2#RS~2V$118Uƈ^&#*0ZQ @_m7R"yxvJDdR*WI_$9/c(tJPzTZAvL2zb$IIm?mV}YřڴJnl9!e}L#QCy;nZOÓ&pԯWu<<`jd^ C}/\@; 3x D$"311~SĹ&6d\]Lw-eM[|,^Sg~S/z'f>soSڇ۾ɳ;Ly7le˪='ٯ9og/Oy C|+|}/]Y֘GVp܉{=m4F bv_}ۏ3S X=vsHma:ӎLrZ9͙r9[(pq-͕yȑĎ$r$xܹwds8 "5aړ5ТfJؐ$VdVXMu^.,2'2 (>0ZaelG -"" "5p,9rM Ɍ޶ϦpFL9w4fjۀV:VSФ{RWdQFm6.'Lv&IlhEY0bah#<7 xzJu.ߙZOkRh6Q͕%!MulB%=^e&K "fSk&0z{-mİa3l<#F`B;R[4$zFQ VA{^|?ͦryKkxW)JX3R_MC>L/Zv]yIԥrI9Oou2!u ֵ^}!aj*Ɨqj*U bu8SUFm ] sXhjqT!c ˟ZYIυdTA*W 5JU"/PރQGԞ{$P`a@Xd@x-~ewS+z_m.ӷa,83F'>y̭-SU'HJ51Vϻ(= i9>kH"K۪p@Up9S-*yHֈϕ^&=]n0Ζͭkcar=\ΓK7(V%8zKkBv[:,wLu=3Y$Uﻀ`HՖR9>U+Elp43d( j٨kCcm0 <㘚񸮰 "ܣ\mjOx- +3~AdUzz ;&,F?p)ذ6nĴ3>Br'6 _=Eap5k تډU%k؅k0 Tn_=Gnc=CEEsV'iX"+m\Cv 1+ | ~ķ\= Q>j28yw11^g0Ƈf \ιe\Pܵu%+J^g(/CmAx~N*>;7ӯ?SbY06ꮄw:.p٥vpn<ȏX¯ OO>yc0-':N=[!xɎ#L ޳G%KՎW9ntt`P##f`[q`ݔcôcȳG:#H9-sx`N<:7洰!PPZu0:S~E Jʗl<`eהi[!g(z|ݪN _ծIv+8laם.޻ | YH#ff"3,-]Np#b;eC wpi>?8<]8_?\O~W>eݕ{{_/v#4>/n]{9; +~:9IamiF #-qfoI3-+.VŸiB4$4$ :/AFްD-NTKrHeivNY^HAH&l`^xDr70+RK)ZmY85bgf14Y߾N!WBe\„/6ɯ 5 c_VT["7}ǽ͇fTgGiK4TFzJx4DY[PC磊$^T;${r)&M~8$QvoV]\cƑ%#X+Cߐm5)mmUQ}Aw:\S9m;.ϵ\>AZ-s>$^](0UBeT5ܒ,aϜHX%gj; l+X5jc;nK&Jڏ0y^|wh6pgjƌF\~=.k_.S,s|DMpۼz*> N;l5u4\u\/M<mz_䞴&AndSG v}s?uoKN*s6>:ɉ㘋p|NXiGYW3OО/cz9+6X `$,Lfms*:d06 ]IrH$E `za9eVu&n[*}mұDp7N\]:VD2\IM :D2͍^0sy*V(F/19ڽ*2mYm#r lW4i HRh"PhboH7=R$(|͜cf@l,`r6S#syf t. әo!@p'dt<_87$R%6.0L1 HX2E:@*[IP`wʃ6A W t[m{B:ӷ/ s:ޕҹ}=Զ:x8 o׈+;T= t['([m*MSX"#j7k`WcR_(Fp zNRNXc4Aq[r !3^W'ID)r\n&dywa+c+-5kTljyt ( IDATcIJ+Y) 9䤀QV~="T8I" mMj M},kV?L׉z99eM`/J*0l%*LjIQD<2˖M9 ,i(Pvo{"cG2obۋAg`gn(r\b'*wᩔ7lٜt 1 &3tQTl4_أplŏ@wO:]e8teF cQĐ\8FպLgDT$K&EnwcFA-$ #RBwX.*\:NT,sRd^X)ʌ\Z򺦭/BRLfƐЋ}Ri4*=j#(bcsg-ZNGdHq"%(;;6"K.HiފD>>G:᜕к֥ X94cD!t d^ V'l/^^yL,0#J~] :C[yJܠc%y|ux jdy ,w 5{Sh mF^e1sV5콸!o?m:߈r ,`0kAhB݀AZ\rxqABA;zƑثS Ydk<_=k|+s?Z}dN8^>w+n<Z_o?cg+/ܗ77rN>5kt5W'?'.myW0|3Cn]uobaxlZٯYM7w6<ƲvSDD,q Ş`̼C1t 8:1Ԍr' #JaVjpjR/D,BCfPS)ԄU6,ɄUqg\|H‡U-|OappD*E)0`RtYѶ<1e܉MKi^U#yի$iw*c1mNYjFMsk&E~S2kr, UYVl5v\Hߟ׆ϮQ\r?+yjSͺjmu$%jZQ86*/s)ڽkDDv1jA XU(ΰ7qԱ=S:ơaK`R]>JVm¾ϩXa?W~6p{]&u[-<̪R湐!-r'r}b\Of8zֲtbC-&|NsaѠg6F FlpN@77U9kyko?q^{|bѶsWοf57>1>y?>{;\|9ɜGYr<+ƔGpQq/{\vnڗ_='MiU̽$-<˖8/v`Iَ$0d:N CWVI$a(@n@"Uf+roj"%mjRx+RM(GY4]r&/g\z4X&`HUTR ak%KR%\,SLb=DD1d$YHG+}gV￿ͤ|wnZLų UO~uLxK4_&(t30%($泛I"O#$&i FjUbHQgxW9*=Y]֦. 5R՗g L#~=&/HJBwk7F%-YG*_|22&mM| X\Sy7vҁ)/᳍ծ5{ !}ȢEV OZ_ow6Û`tt`n ̋`c*+JdLGǟd[flAΒmSp#[Xs-q//qxw'8k^u8wQvq LN{ݿyW#0ke~rc؅\um,=y[^cM].}e˚Hw[~>v-pI^|1<9_z2e`8bŎ{]t ǚ\sapq/3m8r9omI??~WWy8c||0װ66Fi;bwsFa\;L°_"`ͦ1SzFضS $Z3xATPx* 4Ob ߍߝ`1`HZk @_wr vV' 7b4 d-*JUL:8'%nPn뱕SUն}mm(쫞grء +5 \$IM䔟YIʘ}uJ}- 8V %QhpNd=<U.AaXLbMkEpȺ驙趲D/y"䒼UxH(H'%Y$ozjb$Sg7ތQޢňrpޅ8A%fFߪ/c*"n9As;)s\v&cQf оҋܓ2.qI E ^/a>65)j\TR ݅ߣE V[ew1be 6/6R,Ŀ@sFzM[e)Pr-CY!*uKN3*]nzO ]Wu$$)?h;x$qݽcݭ DċߙQF^تe0 HZy!9" +_u^cYk"\AA _&#Җʝ[;V}y15Ww,!UG'(3 R9ϡHUbO;v@RL| w²_ŗnE"#=HK@ࡖEz?j?v.عϘd<)籵O/8qxo4{\?9 2;K~s7xk3<ɹk۳Ytw]4S薋3WV`h8ҍ<Yyks>>~ 7z͝m_Bs7XtHh59/ۧdKyߩ ^4ɜ8WUQnwԱ|q3qoyaB<H!|vz; unk"Α {ƻ5YkO?L]4rSS{9bo͖Oaė WeBTEd:-B0ˇ\yXRl;x$x0h0j ӳ"ǢQXr֧Ii #'Fw>7fJ gr{r쯯W==ed^swyc??ũ/^.;Ȫdg^'t n& 'ySwd|m.({Wҝ&wSlc9 Fqt2D09Mg0FG\9 *(äHEd&W\lz_桰^8D/ ,%bjKif:h9:)a%5L @0vQ$l>8p6,f\u7lW ~vvLꍦ6p\rjI0B[KUO'O3MF Dؗ&+3VZaBR;ps%_ NVX,V25ڹT`Yq0 Co%,1޿yxMʨf(qokKsw pR0z^^zLu-oUJ:u㤚) YKߡ M:gqdYza'a cy ϼgn3>n`dކm풌C9sC'jr qgˡCl8gr/⌫>e;}VW]u6iraϷ1Qn[y`~&y_Mw[8so8ZܽȂXFk{vZPdܴ%c9d`:i`3gز0LgYo8cZdERAZIql2LLB^ɼV[J+8FCc9-H,%~Z!JdfvJ! I+[Lؿ")Z]S|KL,p! lDnV-P!yݠ[JY%(l,y NloUXpJ_qwh(b0^ եC%q LX@You^^ϡ|eLLxCH|W%Jת WKvJgih#}~&_Sւ#S \M@`{[U)9 :Z*mޗy-;=WCkdg(XA2HkַuʜWm8|e"ccsvC uN";A0d8I$'98 c 6V@w8\di8_kQ[w U~ѾΡm 6TLZ+:/ۘ0mMR5PqwG9.cCޥȥg`#D&$/(c44&a5hnDnlHjU8J)dC( xc Xv8Wx:O$S/ Ci"MDa+1tca x%<7p)t&{,اeaic$fL瞬+0Ym;04#Oz?5<A~_}/7l uOo*,M<8dv6n-ְ C; 7#"fRGj=݆$. RQ0WUZե)M/TŒ +pD'-*RxAhQ+~/{T7V⊁\䩍Z`MUOCAK^LS"f2M$ࡕ4\Z0I'r^|xL(_KbQVs)rw9K}.ʄ*|6|)V9f7_L,OsU1qwo~)7{/]u9gz:X?a|o<25{#%h57{6NJhczr :Z؈=;9㙙]{Ĥ6呹GS`B|Yk<X$z.R@)v|[ԃ"丫%A![@j) =s]No Xr+Iy[NU?0NOٿR$C`H&n ʞM5EG#02wm$ HIuZoqlUa (YS1xG d _ڡpn|9vڙ1.8Ԟ GY1"_@lN Ĝsvf P: 1P )\T@`(mb.7+%K+@L,oidi jlWD0jK L\~>OZtu9` h|N 6 fc*éW#o{EW=yfr0 .c=0b'fzYo~_]V IDAT']᳇x_q5 n~j[6|/ܜn`!v_p3-|y 6iW껯{~xG ~e?\}=|Yَys/\|-u$|C;r 2'ؠ;;ùF\%c{<2ax,5UC0tM3Յ\gHW$1ę ݺ6c\ r/:)I/̻HJS7(CG• d7@aLuÆۤzws&$LzޔY0*-pdL na=^H@؛Y2f _.U ~|c>KGy[i_4'm7]u&FGJE߾g}/?R;_{7N%ܽ2bjm#iaQkX3r3&oeֻXu__sr8ݲ"eS& S;\ps~ [o5 2Y 8dzu=ܾ?(bgg:uL憎5Lc\@+DӌF_X&Ej{*lj'j@0 J/@7d9-8!1lLيI{v1 ٘A/rt8̋C;0Sx aeƉ,$TM<7<Y~&=" ,R`Էc_^-^zʥ(H0!չ [_PV//jl`W=58hQ-24lB?Q"Sǽ=-Z3DfcHK'^$2YϗNqƭV˵U(Z0l欂ϐU1țK} /Զy\L*ĨnP%x$Ea~ɒ,]=톪x-iE*<6,5!zB75t<=Ѧm`86 %vC{r} ͦN&g OpYxr29 &ntYtk-|,+@猐P2 +ԇqb{)X,58C9t^l,ŅA Z} .[Ŵo[%Tr<}"a Npa *5j_L\,υ> Ǎ&ѤxՌMhfTTWerUta+H兀&ψ%* 1o&aV+ g}HDUz0Wv7Mᵾٸkp R>WZMpՀ)T[Xygq֪tVlJT,a* SUʪLǞj$׍JkLm\k^3 czA(lj}5A;+$s'QTD ^"ZfD+(& ֗Q rebTV3%ZO^W8ҷ78jk^=8yNT_CP5*6T69`{pK֪Ùz8}ihfQAQAQ 8MrOqc#" s7=>jYUubojg5<UR4>Sp,p0`6tzNB` leVE& -l>M;< }W=\+^ .MOOoy|o/=KVc$mscS22Xn7[G9xeJޯ}X}ŜuYqCo<~x>7 wmjbvw pO )Ŗx#-kI"AAEK!u@)˵?ҟlTSX U\T$OȂX/{  >P.9Zcx͋go}VEV imQ|^e(|C|ECy"Hwʠ: eW~#g u3YDl-  4 &+R$fBEύTt>hՃ,%QB"nsH{Y/"aXQ>SZ E6hl8K% ",JRyN>`ցCM)V("$:7J/C%~3#y}:=|7Ё+oDZ:xK/, =l21tz fx,9[9“QϪf`H`|(n:z=m ֌iYz|\[_,SK.7פX2mOwrov&_㷿ɉ{͍?51'W>p^ j /]oқG9/<n= E]^5sSOrXk+nϜϑ/87=sNx\CG[\k~w[M>u05=ǫ/O>a_,˖\m{vwW87԰ϓdf>0=_@i#ND>B+y{0Ȥ(F'o7rJa^HXc̉cƐ1uˎACm [ ~q ֖1XF,u-]Ϯjg'9ӱrAMGZ~d h%,<ur1G?) I"sFe%T2y^U a'e :aE"XXc aE`Bٷv c(~%jt1Rʼn$[MrHb SC#ӤI"ۨ]ׄ]qo7,r5Ӯ\ bRHBf^}n$>r " Iu տqY'~3_U)5HTo @!}はY?J[jo+s~.~C TΒKSZAhS{j*Z?jk,V{\wL-|q6Du>au9GM<(VUz諓7oQH#V ca&l;|v4pP^{ lXxx7xd=nn K84w(=~_ԃu&ܹ4laepڄ C谂Ԝ'M_v=OW'jNяc}a5.pߺ./~LnC΁y)S7`Ʊ 8d˯\ʖ ˍmg`,,),F6{Ny<33p{3Ό|nP4 '*f<>Ñ޺.6V VT //ZBz=>ZkoݨTxԎ4lޕ=je!5V t^ebޫ ^2+*#uFt̴pJeEYa^bRYYe/o`YFEx#HњOǭpr]*p#;WK u#TDuyjc/"/;H{+q!Aː|a%PG0Re.2&Nd|WB(-:.6K7Z9>78ٴ hiת-T<)^iݺAZ@EÇEKgrXSJGh'8Qu3ն>_9:oo'TVf[ysNTy.k)/ g\Iҧ="ck@^f ` B:Fu`,1 D Y0r#o23,(Ha-?2?10ijl3V6K[` ;feU#w=N9ipgz>@~Av;/]~c-=tF{1/&L^γ?-_߻&2o9a_u񧺽?]%ŵ7?:~O]8i9}\h,O_N[g>::a~tͫ.S?an7}+/X(r{.? -{(?yߘW 430yoᶬ%2l LA mI2:'N艣_ˉepCRZ0]xW- }%\'U N%|{` Mm<6oG#qK^IfR Mch[CP\*aʹ([?^h_geeq@)HAQ׶%fB AzF"Xmf-P]bF02U ~cBz5A<@\Q_RX8וTcr,.,TMo3 xQ*"#ns+jrF 8sw"v''EtSRDMl^']sSHC:Ċ%Vfb>^ Fw.CCrIaQY."m|mx9P:.Pf2gҖ#bm2j].7@[2V~֭,:piM^V=En~O}zgCp7[\=G5ď~{y-_O~|?9ׂ翪purֽ nL}'9]Hiz H-knJe hyc DM<#xXS"[8.iv.*ivY$_&zUfȎq J}?oN/>.GEP# Z0 D a[h=ع88ݴ7b  u6-KhG"5w\L D[HhL1 :Ш}$pIZ.R˪J_<*xBye!<܌J:߿3jnXL \Nm}'ZA(`0AmNXå_;~&L;L` lq5N@ᚩ,O=O["pqM7`,L]ܫ]ѯ]t%n  ~~|Ci}l.> >1b-ζ8oO_wuSa^{7s_p f6.6_^+Js.WwO:+q\q`' R~x[ xxK e^ =<=Y?ðgt3 5<+F<31, X>feBJ\$jZn Z A9+ы 8 <ľ2/O, *K%8hèd@q"  Pk/ȪFb$+0tˤB:%3B*Wdލ^.HoIMT=Fd9y0a$hH"QѶ$0/:t.SUAI4Ŝ8JLd4Bgwծz @jj8Z#d-- jVV1|21<v8Պ!=Z(X+>_@;t{P"+Eb2`4?Zho|QIJL-)JBLpLuB~guS}‚>t;yF~ `Jaa`esZ2ܴ=ͫ7)&tz0ۅ91SsK-.aަ㟚26r?p >)?tqC>99\|7x/[D/~< Efz V{w^3LYv ΏoOx!z<fx3fX5g9_lr&`3.81-wm?u+r˭~sמ= ~Gy<-ƿ}r\x(s.Ywu,?-l1t3,;3Ƕ,a&t!v %0܄#\r~@bAnȣ9L>SO<DRk>qL$x5⾗o}_'??]^S?|2> c;w'֒S8hlW>;/ ^N>f|рO$R{lֹ?`p+߹a/.ok9i$'98u׷sہ ROioi@#M%!\! %LUF"}ĢAX=U.,| h[+,N_|jpbG\ (j㦃SL0nKfH 2ZA¢eo+Upc`Nvy}TT &~nb9<M_}Q"{;& \~. Dg{Z}|o88정-_S>g{WB$yMkoaLbJRǽ0Te>Ŷ8!1XY?#om?8U W2[% } r2KM`vOV`K+ Ln neeMײu5ۈW;4l{9.k[[{[ _ڇ/^;2x\qw~ M{W}_A{{.~|&g?͇~O ~Gs;c݇z_qpi|ԋC>c8>p2oNya,rGjF[% { xDٴ),0˒MĐe \f˞a~Iلf?Pj_iRhKkGG>:e nqRYA7 .jq.DQAuFj#eJƘhBvШE %1IB8HB6TpA{NCXbߚ7 !4jGTτ/݄ޥF%}1̆P9J}c^ݨݳUޡKCI7' S)HFE7%-eBr'(WAD~ JeXt]lT GhA縺7H$@Υey͔?qh0HT1CPq[|\M[৮q/\쭐ft$~ ΤN! DULbQoD8'U2r̓D>rTKcI1lO<>t-,`em0 4uQDc |D>([RF% 1`K^M*82~Ouq.{P^S/J.-- LRe(K{moKXu %~sQv tZC+<>A1Ke-Qo/ƒ܊u$H౶a鰡}VXi_Vtaa,ïojr&KG&dhx.§wpo_bؓϜ#ƒ3ʸ^>7o;:|\a=>xɍg|1{;4|M4n(6?oWX٠Ap!>+! 3)ؓ8.mNU]VJ`)ћ+'> 8E&cibސR2!˜=׍1RSB#}GCq~!;c." t{6,X7\ \l.Fw AK(-'d]#YH|8wcgAc׆2@ֱ؋Z乲a}G8(f1^p-yaƋQEmY5/OV/8W—ο ?kx[c~g|={"W9{=f7#kؗ'/knڛ=Fyз1;6߿~>44 IDAT;k kZo8YlZ-Oj nXOjQY IcP5b q{STx}A+JUURV{AAh?U~@9GFhHt$j[Kfc-q TVJN/6oFLxd&$𩐾&/].Dʱ!cw@>,fەo""L&-v"|D (J{ڽFF$*|m"6$J([I,2)_D/JgԈV08E[IsjJڅcr%5pP&U$P$"\lHkXDo%ĺxhHk@__U!,( FZL%0Xx%zLFrV8 Q xXaH40KSGwl ll%<γeۍ{-˃ecC8l[~Dv14xAoߺ0hOe'q 3|on[/t3N8r׷;|+|{o 92S؝'?i3?>݋N x!~τVCS->ǯ܀>G73Lmf_=C^ɡk߻ާqm'9_;wmY#^q|:FV.n[qv@BK{,e0lbV3 &یZ}OoiE:DYA7݄V.F!cfdVݔ < ֔Jb$,^ Z&03xؒl ͱ+=)[W3Ho򆒗ΐ6m6 T:!*PY+a˸C܋ `P(Wzyɲ=c_Ad;||L.``lYt`/~oDQ]ʜesҴ ,4D> q,oש ٪ڻy1VoTf"w2(5UFTq=*|siD[Tb\XQzA9r>%.>"\P#3K̋0HگURir3UϹ \J$+2"\] 6!2hU;̳1^W9 B0,׋C@n%,L?E5CIǶM`5])d.wS J+)q9lyo%K^{3H1*=k4&JPZ8rG?#GYޚY` -:W JtMDNUPNz€ ظ`4kX5,emj8<[$cӖl 5 í@+ ,ͼ'mnM#13g۔gǜgSsX`h`Y+ #wa H]fh6>[6L>y#2 F9#;3l,s#0]9o2axX`"@sff[fV{xƛe φy ;&={.װ)X9jp~!Mi& ́#ZKLhtgN=̡ IRaŐaH~grpK=iVL{_否mU} M0)4%K b\dl,tse9n8&, CZY1oP~%:&G 7h;%ɤ=%sP_~Ĺ Kk4MtK 4a` -@c~&'wBL[9+kR(iykED; ,ګ_npĦe4{ǭ[/m JǦBqY'\'"3F6uoR_59`eE=%ެ5^KrrҢOw^lϺܠG/MTYvr\˙:6Toy|]$֖rz_t}W7iJa~0zrz|2T-s4Gs/ϔ$dpm]UdQ!@%L$~tuF_ ݮ ~7cgև׾CnaNf~aɼ%MXF%m!a#Oa۶hhkfzs;aIs  k{l=%4Ɨd0`|[9lWs܉pO;~><7|לlX}SΞp~nNۍodˎëćUן҂:p䤥/>ɧ~3Ȑ'%xʽ!A+ӡ e^,#dY4άF s⹟jҼ@{f m5O4wl4{xqdTMU>D@25E,&s7wN^\F2 UXYq:Drw^]IpClA扸g |15=5Em+_hykjR{tu}5C./ıٹo_6V5!nk`_H=0j\h_W-\ {MLPNߤg;Hvb%aNT%b(!y#0iwo܅-DYMkL$p[1kI@LcJj"XXY\X%⹗B` ,qD@ưgoVv քpfxglYy.}mlg0v,=*֓?s5w]{gB^ׯr/O3OѢ_i 19a7b˳9h +yզeÜgq_^AyN˺\w/rĈƉ}Yp~㘼;>x7#o/]zg4z^g4UV9}gsm>)7lN帕3 <8hc g!ڦa=R/jʾj]hgb >l$m]./x9M`O :s-gYXfyy1+ MHzCZ)/{o-IUΉ̼uk(AAqFvhvn{x87ݶ6N퀊gDQQY(33"}ND_w~kVG\7+#✽,Ͱ&,x^GiJ,$<榵d&,8afJW )Ad]OQ:9}hGm6B~W{gS'X}AM192xp˄͹m+;0d, sƴmxJHyzgv]Ghxأ>Rro N<$$jqxlC U1plg@T,mM GyB$,)Z'bbj㷉Eḕm'Q@5Rs(W0(GN#As&~]a{BHzZy{=_>V_%s;_t9w-O{-7x _:'AOpd+ܵ0~snZްdH;Yb-Z6LRGR8lX'cF26vS6ןh8?4tsQ "*󚷧Ip!n5uQDXt}^)ԿZ5o Fuİ~p)8l9T`}ez%pU륚"XBemQ$3ZRHCnJHT} Z8QT-SgGk`a=x2bOMHʈFzNJ81,R֒Ըl6Q!ЇY-m$~^}e( CcRXбh ]pE)]Zob\DTT KbOptEPT8x JlF7N84 0E 0 i`on{R}?+ R򊄘X8_9/7/!g ;6{:7#Wٗ$4xR{ӌ ܣ$c#{a`g] B& @5 *UJS3VnfCgSBZ(N2T& 6&Tx"CЯ ]n6Ml]VG$-ԳPU XsciI٘&ۜRϵj+h_7oU?T|ZJÛ⾐ DkM1& 񙠿OĞz;&e5`nk5"UMH53UO[vꄴr BCg(X ۹gjɅ^,V&TY~lPY_CK_P>Ɗ`batߢ`q~ozUo)U ㇄ JNHh!x_9' R\QQ\-cY-p7a錰"VZʔ%a@8r1QKaeҰa͆XƏ ~z?}? y;^l,>Lo̼7t8a?|q/ݟz֭ͩ^_̣W_rF{7_zǼn{׿'Ka oX{Xԣs|7r%կٶ֡|s0'sE_3r8g>rrvp'O N Ck' pjLYL;afdL%ð7?y/]MԞO,Nr`!tJynpA^>: ) &~h/U2ˊJQRM Iۢ:0Sq~y<*L%g$jEJlk_k+[JRU`TIq#Z?;oY%}νA zFo.2:; G2gc60ck`挰`kU~PIVFEH;- b;睨 ϕs"5 lsMf$(RUV* S[wbVNmAP8!o~A6I`.5ys"5Rĸ$~I@ xWa?h@%`[TNl"v}x~j/i4zhlՕdp+ ߁$h%T{b *+ Ĭ6؝%֐x4`]< xJp(zYoHi 5H:P0W1i~{&Le9ǹ@9=onv8Ge'.gvJa.u N}a:~[سoS:-6sI1"/d*̒@?%K23vHQK\i$PtB+)!ShvVl=瘟tߘLw09G ] ?m`QØ|qaKI6tLBo_kkg!ۢsj!VYOݓ9qtGxII) d0hy@JsV!ឰTAuoċ:%C,U u*8yFu,~4߿%ޣA7Sn ^;FEij՝Aa|W!c߳&k+gkfæP6HJTO%2νd7(zV}/P+. AXF TW! A Y&պ_R,>/;IVzRz{-ƿG6kGauHWky$}c hc"l*bĘ` t(( sS15+L -sdYag堰|31(}plJaVqkM˘?,̃s~\vy֫W,;;?G>vn,-a$c{׹Oқmz0]\|np׍+߼>I7onz)W\_OG2;&9fO}o*38GY{Oz+˘^l byݩ3𵥞Ms‘ cwְAgFgadD8pX8h3x-d_ǦY@ǐ{Ci4IXr閖B:, sTgV@|z!s!vVZs#uqmP~XTM1`HT_*@e3&~>m1juFFc`M#(tA2d@tⷝA;:a; 1ACQY @6T=$pQV$1Mϙ>ql?0 m :QM }:l@GgE!lWJ(1㦱+NJG+^S~<;@{i]ʰv@T|"T!BB7rh+=ߊm8y .rn1n\ 7LR*LzM?(ն҉U2A4̍'T3`+U0>K=ߨJ.\6.WT1v…Pfj=lvv#7V@ k#c+ !$}"xzkQ  v[T[ (bovccBF "D NS}8_[A#p$fs6+Yo6I-3- pN_z5E D7`_žŽggxG%m8#,`Ob;hX2`, &f?aҡ~`F(8֎),,]vܰ-^aGO2!3v,M=[}{<9>cQ²egzFKw34c0IHzCg9̌c~dn  a߬eNKm (yv8l\pX)ǡF9aჇPL9i)XgKyp؜ Oܛ[?*el35Ur'_){q[8q~~~nN<`q@˞yqQ%̃w߷oh;Hsx[Xŷy~7vӃ{Y?>pww|>gpFYSXL7E`o)jMn^{J))V8k0;B: `HAABvד,:mGwCGΪQ $ش[|`JZ@W5{G-* +:{Lx#Ңh^*abrji1ԱK:cZ1U `&LNDmG|eʐ֡+oohT4~tYKyy*]P4nDψ=^\L9CGf:EB䯄9CbƝCBm"ZWL)= JQAZTu?{ \|Lu_߸xøt(0hQ[;Pa؏Z ~H UG_*n&Pqpه"Ӹ,ZR"jqZ2P@ RE ' AldpXH ދA[7!*CH&ppbtpnc 0ZHYD K Vұ0`+W'ruUUٛ~~'r-j)rp}pZSL/IGGt$҄O4,a4U;:`X:NfISKo9_Z;` #a%w #VR薖=lg XnWl23'] : 6}ozw~-ᯟug|xe-\F8<Օy>t> .Lo}4_?{N}2°9߱sfQ1Ç5s3F~ [?;\y!| Wl>;w?\5m5p3۟w4?o $Co֢c.S.bs҂l ٰDZvy!¶u@ʁƦlIٰ'偾 &8l95/Y=%Bk%]YW"uSFp cj$Z1xq烺bΆE@"FKhXAu„qmX[awgJT+iWlbg|, ,JC @=~qQKA{3C4J*#LW_aG<$ $p.D"xǢIC1v%ǐ[ 2'V*,%j2(SsBm:%3RۭW|^@Ffս OsoPi؀QnJn^l!@Hb bP,Q\z.E;K}=]LWXgi/lg娰rسbLxmzQQa8v^&o`s3 -x`G|Omc׿UCdPjn`'[_oc9묧~ey?:G>8֜TݒS_V3/+/b=?m_czyTj|F\-[{paS''[[ L &mCa }atH&A^y7\bwF t a0BNI`l{[^?cKh`'' Q4GQ l8]q!2a"2:LHG7ZIWꍽ[ikX$HýunWXVn+[)ZFJSWzіӞ%`mkZ:f) }_e M=:yn^zfHcg߫bCɁ&RWx-ډ!(@߶Aj!MeکrMԖMN‰+kU)F7}~@2*u>~Ky - @վApjHCH¸؎ VlU\jiVpCQ|/IxwH&Q[,sz `qi_BW@$P66vb(ڪM< Ԡ{~NUQMjȜڀ |}_zSښD]:wXB 'V7׭6*۵Lk 0 L ډqMT'+8Cw! 5= |KlT.t\%m 1.G8 ct =X翫s_?OUxey9gp}/yw.\^{-<ĶvzrfOl}ӗ>-/_~_+~|KyYፏwѯc[{1x]zgG2w=eW\3|;g/GW9or`ӌcc[13)ܻ3 + Gfچ1 6 1J̋MտVZ t"jA1zKMܪb: W''>T#.G$m1[>x_$9ؠiw>s"8Q7?J,%ZCie-LTB5>-e(^/178¹\d ؖRYbm*4R Dss\ " \o(P¢݆SWRToLYL 㼕%9-bV^W]ǻWz{v]͋OK;v-`8NMaғXn%3TzNXj==RCQYfhZ/K%3/juV8cE0 ે,7WP7* ֥*`ZMQ%A&456AQe=A`gTqR}1WXTKz IDAT 01zC@[@~++I"x rW l*z6--51'AD||5%IXd-t X$o TofߖW4*m "JՠE* |n$p7bqVkH_֬$=buŋTj 6TaNT:xkP"z.|[_tcUntܥ}᪟'O|߽Kg~MWp{s }ήEmp#{9]refN'^6)&p*O [F`\Iֳ-~R'j,u,UbL8NZAEpG@fF !r1pVօ&WB> X e:A'X^Q[6iC!:KA k Jvچv&!yUoWꢣϥ6w!(뵒J %*oh9QpH5. pxEZ\boCWb2A[K2$V( t&Kֈ-@ FTdę=XU*~&~7P-ܕR*owr2 \ĩT: 1Y2m%DpD5jup(|7PX$WDqP;`҉"P(P8#\p=z- !qaU:=BP'g6ǘJ1BDsF(* CO68 *q6xͫOvmŗh-4-GRBnҫ~?QЬ]3I}1NYe+ sbO-C'j ܂,>.^ ;n͓jBXyI=ifY;( .&D y14|lX?f<``a.!A%eIgoނmRRIHp$SHINo8AN~waTu7w9~cm`| LZaʔa`L n,:`qTSrKSO#ω׸j:T%Yil] aԚP۰65hLBbqSH4-Zeh!J4p Hƈ^.XNO$X4DebU9d'_o". =%2]ub5x@޶Yvw0[SP($ȬY1F UTE[S b8E uJ^*MJ`0s$ʡNNCB 8BnJ$0ZH71Kh$QDNnׂsWRW=/ .bKP Z=q|-saUVUoN( 6Ըdma3`ʠ$ e$ VHfjY[vjRaհз-\{0ba8v걄f{y8΍mXN8kp!Ѷp]6| Ӈv0]Hnzv;,^)9ɭ3˓N7#$} ܵ}?v[h=q-=qo|}ڇ?/n李>?(3;_F܎?9j%Wa(ߚ?mϗV% ۷C l8d}+>s'N:ySYm\5+.3_?ⵔ#wp6nl^pˆnO:h8jT /l^ !#-kxL_DD寡1 .>:G8^a~VFpE+,s_}PwV]l,jUkL-TLmma]T?>$xg̉Rb0~˃տ\$ {!'kMh+EGJ-Mٛ@#jsP1њ`x9#56CFJ5Jj,ޔ5dK?m)梨P,,NO}@LM[ފ>wV'guHe$_Uz|5p3!p5liM̡o js70(/Z"dR7mi.~׍+dz@1+/D/,yys8yQY]q[d߹Z9c!ڞNKH%#g ;` ў:5d.X j*C{ʖ(^įX$J FH iptZ*7Ԫ"Nq#!!G5c'O, 6ADoT)2Xz(e  C"!T@6Ȗ:_`:`ҷ=V(] 6I5 M"T׷fG l-7scI )Z5RQ."Ŋ`[:v¶aaK߳PĽ]B.L³7L;8ipSspgVobt奧Dҗ2vj~c^xe/*W0smغyd}.9a)_|ccm3OPf'q'l[ɣl _iC fj7[~ \2M{g97k?x΁\X:6W֟اyOx<73gK6\SgŇ[GO*y͉C |og(%CVprˑ a~z}ف-ae.fd2 ^J62T,CgWV4kyU::&PAԄ9N ש&&( `!LZZ)QRIHlE㜚VpK; :lZmi:-\HVEg/u2TS9Ch}P h#^;]S\~)hCC/Q4Z*V_*ƪ垒cm#t |…q"ZI_&`8u[9xTJ׾x7=K솝n :)~+7TCWKe T6aҜsks1URq6 @ ADw4 Rʼn`ou d/Pt'!Ex.TEz} jkĐeJ—+w*Va:|V'X@>$m0uQA؄8um$eΨA UuűX1+J],kj yhB {.@UD~%¨io}g>҄Jjyx:}uBU[0# =Ca.4?s/`4[m +=xj{=s-ֳu̳t3²Aaߢ3d iJ90$ -{fa߸VxF)Kع2{tRa2tz sm,’Ë<έ'C/VtټSfm)n*iu5~KLGN-C=iϐiw=ifIf3:wSUwt [.eX:fdzOq9X0 /bzGm¯ǰt8N82/G7 2S=oSp#_y./=3[;pun?u#%y#ӆb05e,qx}29rO(KB>w=['2.wggKǬ6'wsz'r,{``#saacrbx`LH9V 6O.ٶKԁK~2UØD'-qMA |>mt'oa\rs+O}} , y-ei 7yӐkS? $'yy?ޓ{{UŸjF$pRI:ȫW iGỦzsiw{,]N].vq_}nI 1wl:ŔTג@J(r|hvQ꟠@, \mEjp2F}=!O<1ipd+"3,sW{e&LRv΁Gp2'FvuFZ .9F@t&JLl.յ$h\bZ@F5) Ux]5/殅:J~`6Sn^ H`OļR")/N-䉨N(+PKÒQ-O\+v vٴj AD1j,!`)K嶱_  {dѣs_Oncl`7#\KA}&e,5.chAjj{oGU}ךNONNzO!H]B[x[@DnDf: H!$9i]ff珵̜}3e)뺮~lzy R3>Q)>7vR@{Ge^z*WLG_3hif8?&b8bZ{}j~\|>3i}NNU6ASErۯ<z:c3y:auf퐦Ok*i1i(/6i iƴ2n6IrKj㏇N/B^$6a{ %f',` KҬJPi^_/?{3 l4u&Uڒn|V:%Q2ISZEOM<$lkPWȜ6\MRt%bcXrOt=ÌsZk>o(06~nf?NSb;sds/ aX?,:i5-I,09*LWOiK?i`&{Ka͂t $I[9,&H[Y5cZ13H҉!5ʩĒW3?v52/k3ʻ>v; %~# ,!gMJcC0=>p_Sϯ[Dܴe;0杪bsYGDM[S,jJyE1Ҩ$ "y)AIqjW+J%Ő>*M`)Ctt= :԰˚u$4T^0(W2olͺN6D/`=jx_MK Rè=cQ)qu@G@*"bhLz 0zH7B2&R,p6y]*b> jQ3ۙNF\dDFR+2^J YiQ/%I,ddnCJ'מOQJ󳖜ڥ0];m@hKm*g3m/_e%%|ż/g[5oE tke+}z4 <*=^#~6琒b'k&vl"wݽnVg%3%-KdK6D0%ZP" JkƗ4flRӡ4=aMߐ-yż7)oܾgA`S澋,?8Ox='2̟ /wG<>d2##TUkn_8,gr_dn¡kXvgUoK͂=#y` V`{ ,zV7@K%D}s$p,(SVi"N( R#rњ}왪\$v `GxD9D@@IKLfTIJv*; _ؾ&dMŁ_B<22f<&տd[>F@Z眑.NR죥cmHjZdo5CV4eW޿_p[|)fT`hxI?uW ,IkfϡU3^Aɽ/ m_@ivk,V4eحNHn$%ŊHۊ_me%{-`DYuVcߋN }~12s$%ȸ"ǧn6ɋZ;?2!36eq?׫_I%XBXڞZ$S) 8f+LH3Dp.6~nf;P#rz׶ 8dsBV&[·s([=P 2Ӓxyv,Z,}e2- [3$3=* ĦE^d-f|+ؤ0g*MO^KU_ϲj %R{4 @X0$pON3 51T5 HAP+ #_+ 3T|ŚM0H`mfLjf}M^cIu~EghNkьk,f-G+>>c<ꕤs@00`;J. Z9=;u~Yr]b>8I13oJmu[grsWW>P IDATg_u҇P FIWO+^_Ici|J_fϧZ-&֪akoLWdb~Dsm_n>÷ /L:[xr#D]N$G9s?iG/~~~P3]>ws ' ِ¦h,7Zp >OUyyF1ś^vy!j+gux_+'_`my P'woy+8/SVʀgq|x AYaFgƂuLpi)4g:aXG#cXpƮ=ܹh y-Ϸ ;pع?Waɍ/:-\~84>7yɅ>P ܲ".\rpꢫͮSv0E;L"/h 0YK6ZKV>=ic'n|m -rn%9AzÅM0G^ͪc {",VEvTʊZAm 5HtC 3ge206 g*4vHb >Gn9 Z*OJ\l< K>*2LD)H6OVZNZb 4q&ׅڶ"ĦJ+mXR"#'=؄PV &gm砝/mϗ$GW;VVĪFIU{9"7C<jkZX28ЩP^7Q CN{)Y2سY\KL.vٜ:hJ[?/ʧ(N:fg&h{ b IIxU!UoU@76( IQ%_QJP #5PY08"(xp[`=MKlφ*d~+Nej ^F>ᐽg6sBg+si/PcBW8 f{i,~qXx1v 79`h#9G$vSL{ؿxvZܓs,]&5$x[ݐc޼l[ O'h*@Ҽա:dff La ߐϙDOlR7hGn/]q&/Y/SkM ')0Uר6k\o*5fv8y2-M6$zMg9|2,k59[eΛn%D`16"INI! .!&61 Ek"=^! uZ5-LZ Lsg2>(X6䯶IKJQ$RV`0i Ipm9`%YJ[P2سUbckam[nGYЙJ`kU)FbH/T -dg`ܹOTҙO;ˌZx@?3pM"dH25HaHboN'Gֽz{ּ߉7Sd_ XS HDezٝ0anRbh9~t @eK #9!#ϳ} 8lE#4D޽ LK75В|^mu4'0KwBCW q|rXM l@`Gϔx}~]֭sc5R$QR$FXg԰s%chJf9]S+heDE"34EHBG eV9/A } #7z[$~"ܥfK9h%E#YC$f;Ka񕕇Vb@慑{v]9/ !V6Tm'6ϮK'&H;ɒV:sUPbtJ:GLì^czO; D6Ve%`3Y' "- $T҂H N\+@"n.X )gzOQkB)ŸgfU9Ԥ2F1EqSsbb4,NQqpؕzYfe Ɗ&ը2c|5=_c\̺2mXR/_dӏ/%|5|-4gecE!CY*p,VTRVvBNB)uy A}rP|(8asnn caXX,G0R3UHPתT P^َG;Ne~'QR& E EuYKM.0˒gG))v Rj` 9cm2Ȍߐ G<5G"+HJ0kʡ6Uґ6򏱝k'& G6c7EچڋzjsLe_Ӥnv Җ$)=J%,.Ybw~9.NIWe^?}&G{z6kLF!l!Gx ';R*_fͨP:TDRA =ܻ,$uh5H7'_&ɭ 0 ԀmNMIKk?Mr+ @b@Ym5+Cod Hھ {itji% 5KOX@ADŽUE@L_bO+ h|E]$ *Cl"BNPO aK7kj}6?htmPӴu9EޥPT-L( ϣ??`|s9: >&GVIG>g7ro4LE<|HoG5j!aVJ ss'x6];럡sEͫ)gv_R|6>xb}':=55q3)w8KS̳8ç@}Is~s".xY 1o 9jzמ+MM؛WM#\} *5oʪgcxIۺ~z9sj##|&n4g>g]kٓ0&-tx&,2)aΞ_93yuʩ|Xpę|,yN:H~Ԟbz`#2~6vrܱHtlռH}1'`v[2>gIgK돊43mATAWTqDZ&B\yQE A억ؒ!a<0+2 Yw(N[qĞC2/Kmur3qzLm+-LmNG'};R>0]KVv,,^ ޭ=(jj&T)k͐#M!)iD$$Y'4=J)OL4A U),-cZo%b{CZGw:ZH*Mқ:X2YZ`3Td1O's<)3v<zMRz 'Dp4%5'/#-ٟT.$"targC$0R3`G1U~lw'u~bMw>]]Om= |3KkGK8$ 9>,eoBkvgD;|"3G" f+CThH?|LH>c{ +lNNjggζv;Wmseog I7SY"QJUxۛ5CzN%qatZo)ou>~d|eH.s8Ӂ:O O=h dbA%)5k͸"+h64/w*Vk6*Vi昽&(&;{4Oç zacڊsMg%io+>4,׷{/Όx빈֚){Mkƛ§cY[^K~pmN?bV/!?{/s vg\]%(Q=$a<ʌ`؇L8Ha !C!T1Uk1< e%Ě2U&<9[ì q`* "Vہ)!sפ=>ȄIЀS տ>s7H& "~NFj+{+#(;HS *5#E$I5&q,JSCykP33GM89i.U8'Ҷ6Ƒnv Ye x>zuZ*XmMksL-I޾i:sZR tTj-cOnSQ3UqlilpL.n*1v4$H-.9$=H?EQZjE$!Y1ֶJ^ iJHqTviCҒ7}aCHrL*a|OGDbEت_4IEoBi- ֆג>U1ҥ;+B z{'ge}C*[#mO 9z+LHdHi@YbzjfmόWc@>lo l i6+U̞hWLnY:!ii PDM:X %DIcgs5RYf@I<)%XrC7lݫܩUE6chU|t}B|1o&(Vo.18|j~Ւ'ΛDaxͧ uynU'?g1x0In9^YPVHs~5fG*L#\\~k;qƕT_[k Kϙ>^r97xsYgZEwVqg22:=[ƲIE6~>pp$7_s5;A3)%=c;4"/,hh c垱0j.7qη-MP<%$bi~CPU0T apD0T #AbTJb6mw1HdzA٩ yISIPԗ`QA|A7 HlhFŲ.f+9I_sb\Q,zK u.Z͹x⡻M?2kY9|*>̡%~y/\\nWn׿85X~>Y!NfŁ"A Lj&,xb%RdG IDATвM7f:{;E5 Ό!ڗCv8`v+`e8`Fz3m kr9ŔV.E `ӐA .  +㟻Gq[. %[xKbBnc :,Se cAvUɨ%S }tIB`ũ!Iܹ6G f2}Ge"$3c080Ƭu6^[]G:ii"e+qD#!%XWTN]ȭ2a ZvA`>#⋌2캈mYGjHbR#j8y=YJrXBX+NAW>Jks ,~KSe쩔{򤩴N4^-%OL'IZ4 i D(E׮~Tc|VS>$4&s0I%"c7:ƾf=IwѯY}˻I{ dd 2|T:Üt¿xf-5Mr!Iq*AE 0G$t$PfЋm^$"6.MqO>ls7^ T`.D9jW$K9c@Tz.@3i3,!E:0(?lgwyRRiO: )H1^}Ύ8 1e:y-DGZ DMgLeNMt}>.*1Є`ݑWcà`|&s h-A)Ќiǎgވ:QnV5%f$XbƐf8n=OR6aǓw:*)ϟ*)ذ5%EX7I+oL.U.7͏ShgLʕYmؖc/gFwO/2y3"O̸"7<8OOeC79~Soް]z{s>{rԮ>O~8$^N0Mp$z$` 4 gK>g*G6 rU焕UJVMΓ}M!qpBEj*H@hA$9e2\Y'7O#qQq`{z˘5UF^ 4:XLJsiml:5FiP̶VP5‚i9#WC!02@@NX*#\ ^L߲[ AT mƳTm\[UcU% =?"~`!&\O׏sFcA-~i^tk5 M@3  ]Â3$uVNRt<s&H[͞4mD%i&L״HlޢvV9o[F(2YQ(`) !=-U>Ŷw|-^UDߝ'_c9ϲAu㋟"?©|{. ֓Ⴋw\>v4)?CwY70~M"UV;;Kpbc8`7R+LYL=5}{gCt >so?d[j+ni~ /x';k^yAć[^߸GyNGW 8Áq)g͵Y{^/u!6Kxr_} . p6"!$&43Z'i|8't .٪[ X*l"$2ЦBH懁?G4Aljg<%`n|Y3)ԴTwgzue/s1&{J7%dWv\v6Wp̛?ME<<w6/b~SD=t4pCܶ}?4R[ '>gErځyآj~C8(3 Y؎An֬ޠٺ$Sՠh-HmHv7l P1L.e|Uqvp/CLQx5b"6I!<,,-CJkGXkcͤViӰ5#L iw)Hce0I_&2m8$Mȷ=iZ:iY_Y[)R9h [j$a'U?=%,rPC1(ߡoc5CeP CM9T PރX4@HYYT#YVO;2v7 F3o3fox:nq lFpY7h)0.{hAԾ*<"zvu $fEU=M !~S"(@wn21h%6%KLN/u$BƁ댷3pqı3-甽vY\Ue,Y+Dxt֦G km%p^rdXRTf Wks_tr8I^GadN䰓=U۸ 0!;^{ƭ#& sdp cGlDJMEfL%C382؜Ӽg$q`ٙQ2'lLP;`b#RU*^)5G4/*6o_ iKb~= &CT5N:vXwϑ0"!>g@2ؑaZL_e+}]p ʡk+տؐF_i$6~HXqL PRV.NiM_ Yo^s1T͎朘Cl %eVPU$S[i F֋uk>i 0?pjR>ևt2ˎdW[!MڰK0pF>+;Ǡ%iִ IZi4ۚX^##L0KqlϨX]e Z=i;1)hXe3 H&#] <[@suhm_jS9b*x# Be=-{wD'I)5TCZP%{/) ETCMjFB f|^~RHT]k-;[{м]ՌIu֢fj;bt ZJƒdtLgG1fb>b|5$+io0c}~IWUi`qPI 0.t5_@m`$/}γWKcc[aZDzϝO .zXq Sfz{LnFgƒ>B_Ƕf{g[V,-A/G^KT]5H[b6n 3dYga9Ӆ-`NśKu+kp"G'}L?I=oિƣ<@-7>n]CYN??Ε.{?7Eo_ù߹ٱ8Z wF[oBs$?󿐕x 7SӒd%W.)W>o}|u O)^>||L߳6co\t'Q~ru|lYwWtl`_#G_;7Et8hU uݙp7 9ԝ!>|Vi~ٶg֘:'xtw!:J0/fh < y|ʆCP+`+apȾS5kj g[0JEEIƄaPmTżFEZE 7QQ5mzW Ĩ\L\PU0lQld` U %´q&B$M V 8v1 .VH F Z+[ s\*%ؗ渓*O!D>IC  oX "*wps+/$1E ;KMV3Ə ,4 C8$FM6ʷ Pz:$MҠbD*)vO+HAF4!*f(ζoUʰð⊻[D#DM%<15qIԸ75n (( {<}{szҧ뺯蔀K7wuFߛҨM&M|#e0nqkcD3'lR:CMwhz!ͅ9T6"Жk*["W;XZůI`mub%pRlQAJDQ^Вi- YK{}s#O=dkmAbQ0eYnV}{}ol-h Qf*m}uݘ~wNY_}z1}^ fz^}e=2~O2/>p c=;myhwkt}.'ZV)NV7?v=YJN9 ggӖ?6gH-Խ2ki{K8_0qe~#FEN,_-~25^w C*.yм%ìilMӯgBɚdU.kjj4#5Q R[bbYUUB:;DÓ?=H{ e}X k>CD{&)b^##%Y½drىcWs$ ǐTV$Wo[pnj_3ku{Rd}ihԚӍ]Ґ.RvfEo\*l\"D,q={>[D;q#-+28tLJ?D~.J?(m0  J H25 Ea!xQ_\pa=!"GRJK:I" MD,N mHa$o w\c{TV+Krb(H|PPtD(Wzڲ-EFo70sWtvod'ozͧ+ZYGϳu=JMA2 )(iK@W=@чVA $7(Kc詨&-@D[ea9C:PUʄ z]-1rmfjEFxV}e*A㵱K KJ%bZZYi)-t 6Cah= {UFv[ih͜p׊u!g 8hp@}^J/fBz0?Z}?x=v[6hlXAM>ݳ~_}% v3tXh߼eহiEXnŞ=wş5}EOwOE~uEGw\a7m?x<|[qܙ7ڔ7a燋{[ IDATh8KМyɟsT 凜~|5Z#X-V#UV ƥMnb:R1֦eӖ 钩{ zR$i2wڐBPe-,8|ís<*Ykw:m͓m5WvDJ (qi2]]kD6us\ԿER|ک}{O3N: 4QfekָMf2&ON* ZVt.Vk-AS6pw謡!Llg+N"I6gŋn[Tx!}!+[ XkfMdžxrX71d˚? c7&y{R߮);6%q8ͤY[vTdzb78(:RcĄ{ߩߖ04 dTjkQ=ވ%V}6]dp$Ùgϊ#Q/m`Ѳ4_[DF1/\h/\cofiҜH:NT3q k;D& _.[F i3 vv\P%-zފjƍfyGmet; 9_锠Mu)4KBmi =iSS{ֵٕalufY445+JTf`Pfp%4{ .hi4ɦء:C-t hZCjBPY(i#hHiZұQf`0Auٷ,<%ENۃK=Vפع!'[>l Κq>+Prv]yOṲ̌sl_Yn x3;}!t6r5߫洣S३!W]K pxv3l|ls75_#םprǛ,+Us}_[o~I%s?R%;ۗF!=ڷZ!5rP\vՠKf}Qt(ȅRhTB.+(#toP"1yƢuI~A)`*u[I J!{EC$rXV鋔~G;݁N l<)"͙=9t)Rխ$[W [ыN,AIYLwrh~.C(q&虵5hʞ VG*n!(pg[%C, }b݁$*eTv~hThT:00NDU 2İV6.mrC2 tq:&.鄨7pb?:$BFi2 GAAcOm7:N̶DPԑg)򞎶){}|~Ϩ d<TGFeKؗڨ"{L߬ʒ7j)hkM.p w٦jqCqY'ys'o#/o'C9=u"X˛9ho¿r3)4;?5rq4ݍ+į%}ƍĔk Jp&PiS <^`89KEDH$AƜR}*47r&4Ds֒Ԧ=vdag"0S%3~͸ wZhS6鮉 vi-adD*h-ń*BdCkBa14T)Mi$qeϭDJ7q!D*:,^fc6׭`.4lJ~zU5f{mz5Nm ;Q_EM{gH}onF4HF \=cҾzHxFGZ닒bCE,I$¨}A:e@>κHa i\6 6fh8#_Słv!6HFQh6 vޫ)m'lEjmǝ Q!&ٛձӮ?YkxgoحuZWo:B$Vmmz, FAD$RD%udz:tB. %}Ǵ7R:j"E v"ya>]m9ϑ"TDm#I'xxtt󌭳Id+۟ފuS ٝauG&TCe;o؋< y6!"°w;tymmm@eΥ!}m_׮"x~mwKAP_?1q*a EDڜi(P4#ـ$Ɯ`C M]lј$ض/ui?*o 9jXAcB0K3i2U-兗^'L`CE4'4YGSp#sj^Hʼny*rSd}al+քo)Gҷ;2ze~핱}ְtݿ癘M~eC'H`(Q $TdQڿe'Akimo}~WG9 k\oԷk0tcun,9l]^^3 095~CSCFY)v$6I3;2ةP=a:}ª3dpDǀ&G}tJg h'&e&0aY8"4 bVFcfEN,"l|)vLl! "+fwzTY SiU~8T& k;RM&X]=Ng$Y ݣ)dzu1 x`,jWPUlVRVŚbEJ1B3FS_ j4oufҲ>ȺMe VO<;ysH72Q;=y)4[^`t&Gdž-`跟ծ#^'J|Y,堾K!/67rEEN&wr^m-1lI_ӯfrB%iclOJÕmxGJM; 3ÚcwZZ6#GB λ9G=v%$`U4A 6Y$ҷsgG'#R @:"kw\WK&"AR;9IY sdN&`12ItۚX~ lcį%tCa^Vp$. c:Ѹ4c$~p 'I5~bαYpg'}sR2 TI2}2<\f7Dm=w\6|Ubv֏3QOӗY> {gm`e{e]%V]:(&hPI1j&iVnHNv a@_b0'37wfqǚ{w N8"Ui`·3M]]D_)&uft<=hK6i%v_spÈ%(0]Q2<3=su׬)168ZX$Dz*Akn2eڇm7c+DEBa'Q;Q6sMȺ$囬LJyξMIx{]2<q;tc[t~tԬ{'$ISב+; ^_H 3d!{(ƲXxM˸6DI`Ց~o7& im!Bk(s"$ɗSs)5vW)L6ytU25vR2ٶ6V&D2b2El{OlCk_K|!H[XH+UeIH%g F+jJ(Z rSٮ7 IѸ&e!+ӟEK̚pi}ieޣU> b/9lïgDj4w]^);Yn0WN0-g[mxPV|ododQc=\vơ>̚*bk3fڷ/y(}6|/[9xV.8%V'DVff2.D2Ƣ=X4Aǀ"B)\kL~̳B2DD`A2Y#{Qjqls$D2f2%U(Pq)aIA>0x0yJ@! ƾ#ˆpI{XƧIA,(B.?q? $nfM[7S Gw%kA9lQq@CHۆ?-S?a6nY^^v/Ȑ_.O_}A*4 )GjQ|o-`\fzMsݘO_}9_5kW529ҥK⊳g7Yԝ);o帣q9˾Y  z|?cY]ܞi( g<λ]?gn/-ߞΠiu60"Ǯb9`~Yb9o2GyÚVQo k}8i}_} u⡴| >a0&:7QsXx3 ;mK7K۾aSyso{jɂ5>xS dLlJyf刾?_ vYt |m q\9#w9O?OgK!ˏk9bE\sx IDAT15+TŬPdf=xodXІoji11u yG.叙i̘>r N;)gO.m:'L駟ba{uBOs)AUrlU@S=YriAEFPS¨I$({R|_IMM(߳V  FDwJX[# -Qz/ )n!04qk`뻇Q.;9sܜEI[o$NC+M:U%"l[+_!52&LBWE@wxFQ%允B J6REmı{VDeP¸.9*}w !8s|zIďS&&wB&Fwe̼wRe5> TIUniH\ZDNy\d86vxt΢GOIRP@Ith⩔/ _PTg%UڼOO<ߴv9$Cf'(^ ht$EA141_;%R4~Պq*Y)dʐKCk^`xX++;8`TϾσFu.!X"k>v/?QEh[Ƶc-˘pU >? #:8ZeY;ϖE(/drKlD,P+SO؆f,?ʣg_"kymQ;g0in,wp@&H3w{1d)<zmYVjԱK9dƗ>SPc$J tCG7,] W’&h  6,iVXIK 5CfT3qof1 6m92bn \)8x%rY&OØ Ƣ+a(up.Z ne/0%KN[x0=t#ԆQz5a y.0sC$+vST0hv@RSvqb^ʿ3iz%/=!Ze :zuJ u K ,x]4%Eu_l}5.BEKoʑ[}&v^Iw M⻣~:('z>vʺn~{D5 fhI 5W6֋l(as!#H5c|+gac%쟓 bAߟQ !{jMHƵӧFs2=/VbTLkXR̄˼>[*x眑<)q[&O K/ z[,g[O?ecx6;L^悟ۛ?'i cFO3q ]*UT"SA /۩o-`,.P҂P);_HR<0x#sF1(* ۪] p~oJ?ח7xoIi/^ʐq67-Hi‘u ª|bmڷ9:V sZWXg%e !mae," ى@p.H'cmi,S%΅ ROTHIƹ!5Yo;Vdul]?l[c mt 0AxFHat'F*e,((t3!mڌnvg:'q[1mkj [Y%YDWY2OIPβ?Vǫ4 UIoK@6(J*1Jx飏H I4)1jQsJJkkh))W+OP&s0&R~e24j>EeW."G~d;Z%MJqxZFN:OuQ6$, l@#&`( >:f"Eƣ2iNXV*Ym2Ic6tX _R_,l٤YYS U VQ6+֢X]G I4w *%k|= [Rt|IKDIC`iQ#q,ۃE0bbjeU0du;jQpҩ2{{gSx=  cz`ܳPt."ǯ5o] ̘KN9 kƍDQC&Os9n['Z=CзM9;<}LJ"'Ofsύ}Y&2.e5; G4~:{9 ʵgg9|oڀ9s㴙OS/hN~~Ty[6T=x>4'Usyοn>H]U6KK.:y5ݸɍfd]8amx^nO%r#7xK9C[ډWb)w >V1a\_"թeje+L]ȴIw(WH[#(>2HҪ!PWҔ2r| ϼAHH\ZyS.8O#>kρ5xJEjiFX΂ii|ST=(o0dQ,*zV^ MTG7p}#qH = >w[e0ކ.i<*`'{nGے(8Cd{NPa>#/ZjCxsvgb2D~\gOI^(Uk*;Gy(+SثBU=q™ꔨLQ1Ĕ)oO$M u4<|.zePOS,)Vl|Z1bu|PF}K@}W=Oϟb ߉ULca7ˌ]f9 ~3Ev;r~ ?;_S\.l\2;)QTc8nW?b? !Lqc&^{od(7NcS^.8oѷSߎѝ%}pդ Ӈl9p4!﭂Ka:²5kŨ+C*)5tAc inWi Mm=(&L³/ >ʼn&ʍsv؟KADuјs;dWύm%8\W3[::[kz՘2=FF81dOI8"D$,n+-A*K**jIN;ږӁq>SkCgÑƹ@Z<\J+`8_>ZU4qY! fDѭv>/F #VC<Ϸ[wNk*3HK ː^vСma`(2m}`w<gN횲ҏʜٶnf_(cW%~Z$S;=' {7rb]'0v|^|u`x̊wݭQ a1?v΍,•=6䈃ĕWOzf'm!W=;zyU,-sƴ GLJ6͇PZV}EcYdAlS&`lj݋|( P($Z+- RxOB$Y- %&v u,܍R^scׄ~JͶUP St5)_6τ)$Q]xhGcI )A&m,4vZxD4&5٠ƪPƾō/N{lSV'm.$6ANU'V|5;̇EIܿ SD}#sk[`SRvUɃ3IO76IaYm+|_!mF4YY_DَPqeeH%} v[r ]VFk_cm_A(uaQH6I H XI/%bwe! D֤J:1N|MsmQ?mo.YFW!2 M`S{Bx\wXnb PKKHu,^VB(~ӒRvV, B Ik۶ˢ9Σi{waTW ,90岹C%{π3r}HT#K ƨhO;!$ E blOHHLymԯSBPve(LbJ0鷡DSdSdTHyj_QSkڲ$|K!i)*2F9pys~@>y#C+T~Hی4_Һ~=|I5<+r5j\.xoq}"6 kQ7<`qXrP5#ym .?ewe#c+Khm\U6JY+>}:KL4G +(F&0Dpr$-&dAmf$D!}mo.@KjJ;zǣ7pu9WGjr$!B ԁ@gFGR{,| RЁQ_=V/%誾Ad' BmG`]rЊ,(D͸Ăϋ#EPl䨾}#5H[f+tJ *$ʑa^&c C#b28ftn/2{j#a>$0%6,㤰+3f[V^p |l*ue. WnTzPoeV3PMԇN~&w?%a PVM+tj>lbyƈ͒ ҍ?bt}غZ|rIIy uo~Q>Ǖ|? :WϾurw\{!?*B{a^zSCk#8([0CzS1:?mT-8eՌtŋy' CͿ_pͩ/plZ92N1tܮ3s;[x0KF,$(p*vqtMAYѯax`T``%d\Ag/ljk-(АQ JQa(i/I >-G?Kޑ""4dkT XEńdU#¥m؇KbP3Tv|OS'C&F")2m ,5_i_[U IDATJ0chDakPlXѪKmk߯䓕G8Z)B)\[gåO>@97O1pD'g@ , 9kp!5#1jYp|=0PX-d_>9̼a zU6lul,SFX!I2XgwS8J^ԯH#P寴>hM3՚v L0@:S\8q tGp=W?g? =4V~Y 9ip;# DTP4PS(Hd_C9T"#+(MG7^IhԲҠ΄RIU-*|?.["uD}$ ,1$/u:IPd܄3M8PY \]Ub"),]=ı ,\ޤyq9I|ӀkB3y$D\zʐԊ$`O 1>V(m1!ItWD:H؜`hue~\Y+: d GgzVF`ٌߘD!~-&$1IsLJN8HN9ۇE~5`lZ4e_ !gMv; f#``&iM_\lEڧ0įl̃}js~.JZ8󾖩lh9Tj Œ#X(*-GY,*VvRVG28#\!XQ4TJ*<ϋv)49.#T'7pxF#"k`V\4EN /WQl1.s0c VԣZ|^Goou7-=ò|q~ 8M;g+i|Is;p_:3v0<7a _˓KBs6kQо*U'J)t,eDP1x&e@dpcB=:J@`‰$u!LpQ$/ȼ3]3҃*c +gH`!Vvwq!϶4G΂at-rg]*U# ] ^9n&ˌKƕ\;,n V:04 0JQ,oWl%#j%%C" xOۺ\`z-k% ~s&~z>Պ-EׄvBɐp}"_]![tv; nKe.Nm,LNJ > vbLfo)5ųf#әnދd\'oȞ9xN>t}d&F=yn}!w[nd%+O٧>w{r QTm{,S'oI'ƌs_<+:g>Ae[*UN' /o 't~*73f9?Ǵt>-ΑԽq~NޭᰣNfK腟?8??d3?SOcdM>2q0wejxp^{uXn{yP8hx5f4TְٰiTm.>5㥥f3iZ:yqam־_JM'K7ƿy3xrCTman͟^+tܫ6'{.OZЇr3h]gN.&Z՞}H|n6'{60h&)xkEOi`H@}"?oF|Δv*vߦT"WZuRX=. kg2f5x+h"t4fQd}2C[  $*X iotCn";% vAI偁CU6("Dɐ'Bm)Q9S(:Ad]\OjէJ+Oq ZAC4"BщhUft"c)kJOK`}Fe}qNdJ)X@;k&fD]*|$b-yY,48!c"4D ni[4u:d<8>p%pG7/.s˱ݧYpDZ<)z?xGqa@퀀Be}ZҗV>2B'G.z&6>dh)4cj7 U8W.a:Ґ* RB? ݯ;bK-JVǍ1)P󅱙F/Mǵ QB@L$R>Њ![X_ t͸ 3VIDDrq"Xd+aTˁ8c866f2ƈTP%n $l&46Kٿ1 HH8jPgiۄ~#op9y]Y1x0T<Z+dSwDo Et$݁ J躁"^cˋ9/rL 7217=R62DqT p/KT ғ5FȂɢR*f8Dh$i 噭ꈸ;G%yAXi J'yc1^\%/r IL$Cdŕb2ex4@i;}CB|qa;p|p%$p,dpbV_[w01|q{s)i/8:>wa[>5[b8g%#Psd-ęY}2U-ӜzNKJyf&pMI&019lZiR8V ZԷieOb8ߋtNZ>N;#ZSm5ϐ.D)2tgBQh*\PtD%ْQ U T]׼ˮ^+E2lu%M2_ oy"gN pMo!-#=vz 9/;?꺘{Osoy7⫦^|}=XZ7}V9+<6M9 ˜cV0mŒ[kx:r;K)2=Bv{2{l=%w Z*?um$7kkQ~#&#OT@NP˚!@Gpdo_}aKJPB$4 ֙RC( $XR]* 2SI s#Τ$ 8cj2Pt\Oz֎[.3C3#K&Z-’„gvR푦FA*erdMIud3}%z0m=}/ H%$ݧ- XH $VD(逩$CM ke*^Dk(!}Lfl[w?꘥!] d\t4gmmo 뚥$&a"x ‡ZоƮq=aXD}_>/?XѤLڮB\}mf@0yh ʘZ({͸QHgRH=hfW١,'j|~Cj.[tӿ9שYUs!X9X1dd&tX,Xa502 [kI6T9-Ny&Իn}W;+}TuC"}j9aa m,^FZÐL5;62c ԍhg`e;#|t+Ȗ~1pδiS|͢6.Z ~NqCPPLCvxc`Ťъ%{_Hu#ذn&(@6 u!O(Rt$MMe≐w91~)%=1H =vHElF%Gg;Z#͞_&-(R/uqI"Xlz8NI/?)-G$xMHgHG@|.'Lopᙳiv؉1K;;zoPCC4BZTڢUt=8:*p`?RYzzJ JRe! ]dCGKbL6t{:*|_p_m/Ҡ\ ؾj I"6}Y$-±P ~q[M:$DfDn>/@ک;\OJKl@Rbؐ#&:K<$"% $/L_)-}"~~8*G.ufB$/WK=.q?$\fҗK+gg$ -H67TطͳL8GGegKښGYVV5yKsH }xe ̶=HOO(W۾{Kw9~IۏYyx"{ \(*>ZOw4] )j>q~mIvmK!6U-Y}GF<^ȟ^x3oiZ xWD)&׏wrۧ!}:y}Xw;3g2-q|e߁o|`VؗputTMF,jdk{]nJR%UyE)4$0r$ * ~Y#::1Sfk[P!ALeN`dql0$8zZ(=xmJ@[o7q!j&X"<_Bgú)"#%`ilmhFK,l Q!|Ϙ{)8RFgB֕|^PWZԂ#J}mي!z^n#3mG]X~{5(,2_6}}!zeB2v}aSL-D_L;6sDQ h ̗fHe73r1lfyiIB#'4*(Z2RG&/ЗFZ<$ض6H%EJ #Qk8#s0q-_ay] IDAT l-ל\FXyɮrSlH,\#H|g_xWdD _A'4)hA!dt%$P4T*! T 6gt Fǡ_FP;d}J*Ek={9LgIKKae;T(jQæV_`@4T*Fò"{YyE4p{I;dڐ,ϭ,wWή̧|J'\wg`FnݖL`va6y~< f護$0wi%r^*Ս37bo8pףv\+<Ih7,8{/O?8o;&̖uҋXTM6 罫6$֮f-3gT̙>2_cƷݫΧiL{"[w倞"Gwh*ldq|Ī.Gr/PAEyN8 {{nfNe!l2_MُZ @<nnSgCԛWxLgo!K\pw'C6ߞviKkyǸk\wu|)bȨf NN0.ˌ)ۿ\mq_" &9vLjx O A0m8`}.GҳQk\۶u &_n#>!Jį;Kd]]nw-iFVЊ.@QufUY ,")vSP0 BEl n ֫Xצhm;}qop'rЀ.7nE_Q7}͋GLc}ԭwW.:Zb6UiXŝ?,qÊ:Z>kyz\ ){zN=z駟!kn~ AzC1w+"8v`8ÃQy!d+xo)|:}ŞIT!3zJV1a 64 +6<.]zJ.IS-'B ?FE1bϽi MfIH[&f5;HJאz<$bl)}8qP " qKzR)OFU6ҒZE!"JJ٤)J3t5E:7D@xZC:(aHFIAH cm, K_%m c¸Ov2$K}vuK٠`)0jh\n0cSg3a@ F81H4+7u+ڵ u#vVۈ}3RڵR Oʌ&6.^> Y1V)E?Ҋ~_$b]:ow Sڑ;s~Gr z {!u~ĤmG oWTWaSf uf_2^Fz }ݢ|A][U,ѧ赲QshhPͶ х7 GpM+.N%4&1懶%4Qo,aΒI|QoZid⋳2qo:?aDUsMԭ+p=ds)Y&h,']/\ciU'4zvf5Ҍ?IjCr'?6!v]e>26fk}\AnZFV -ۡ3YD%-ajI@H Dp?mcbrcKFI)ijX}AV4EFʐ 8J PS9TL jWkѐALvq]);HK#6}>n-lmڶg܈QA!PAI([_u:[6S<)Jb+h/mӅchːzKy eY*R#Q lڼ}U p3eyRn NC ەjy잟0b4G;p9Wgtp*]1pkskip*;i>w),i7#6>ͤb'KΞ@m;o,C2l>UKr4vWeaK”HAJ!De `2Mlau6o$( Awt?t],dS&Y|MD,=kt;uR-[^6ny]3;=_gΦT>c{Fe٬:U/D܇TUVj ]7ƅjG׹ ={"Rg;tzUz$e#h0D`13Pv4y5g UG@6׳W)^\!}v$* ve1Բn@Q,+weE E@Ϧ^9x(-{29J%c4kmmzbd윤>Ycf7YzJd -ql]hr6k"sEчe6&$nqRاXRPG7$0%U ( TإlMEk6K[}M4 2K챤LY;h\ED`kQpȀu"ZY22+9!]/9dzN+VnOަv'_W3[SG1p!r+)<{+ِ b41lX>нoȊG2cyMobͱ}.Qyɫ; z3X}ΙQB f, rG©t?碡[y2bW`>i}RE\Az+j%l^i÷[on ةߥ_g}޻odNLݾsޜf%_+K1ud𤃙xw[p)xIöہKN9_aXU,`17Sn}~%ϱY<#2b˾̅G7;m4n&N<KR-ugLj[P0~WM]w.53zH S'}'fVǎuf?vewp˥y"?pp9yu91퀝z7_3=m̘̘;¦ycHNm EU\vb--ZӘZ=r6p4j\0fܙ,jnB 1N,'_Hpl絰#8ab/>p9x5|`3|%Nb-73>{Yj9;X/\l' d%gΝ=[E%˖DqHZ]c45\y+QC<꡻K0e[XBwT$[f}DFR"Vn Y>1 2_Dm.P&)$99q\W:zPҶ" *3:/O PRGsBtt(O tb8 C,}Wu4CB~i:>452Ji@:cg f׍4g N0>bMŎ s5*!P$d&, ! PT1!%u 0"xUa8i4Ff. F`i)&0yTa)c]D@1h.D + q8h>UBE/$AP1F㉤ְc9+J{}߷PUCN˩*kqPi*z7":ώgA1 ~جX];k\֡!#h:u9Amޡ:+4œ.!~JeA,wxc<¡5Y[uy ~O]!atl?m ^1Z/ ZB>1b]s5-p, W & wXC:wxN~>e5ܸym{~{˖N503kNb:Ч=}m?ݫ|fT~.ǵlش՟~?_<_i:4y5,zqV5?ϹyT>;*GE,kXq!-˕د: HmHAJA ,YWb{HU&a!۬}ŰzɸA% I[dmdus6Igw9C!~H%bjàjVwPA C$XԂwEg}g7:D$}Qϩj1ٙX4ٜH{ Y,Îҙ e0]J%YJd)MҖ- 7$%}Kɺ3dk?f;m63}]i"!M83:HQ;ns>. NWj=Ty*w MoPС,A .="hݼJWP |AN,<j\<5md~>.uQl{ܰd~+#dKLhr;8v`g6El\rtl^B놏i봉6F$N(xg 캾صEZFf3Dp5PωD(M#-7 zCS#T/Fےp@ƒ5y: .oI`$(Xi6Cg}jmaPDY)tTT";Bpk\֤]ʺVy!PK%}Cer vhw&ǮG:hq%Ԛ2$ARB+Qd9!w6K~I%uEFʒ(ف*"!SsXקJ`iȖ+iiْ1 !8 .%z[qֆAl:JcI_:MD G5 XA-" 91B0D&}]K9d"VIښDԺ$DK.RȒ$(?xu վOWoNQQuikwظ!*kxKb&Eo''";gsO% ˲9HK%k;Kɺe{ ۰vs^~=cwмqθ}f;gG^zy M\ttXS] GW;˜;m|VvTɯ~Sz>&O0~Vo3xb7{̳4l\C7lf/} w߿lM/Y G9oOszQZUZݮms<0}mbG!Ŗwt_z3 *'-[wwqe'3ǩr2 Gq.?:-|5+YOן}ko}վ^âmx,*gto$by{[N{Oq* +& _:בOcEx:V*77s3%,c !堇IMeԺ7xoȚ,^?- /81_ΡM[o?)?X|C^unq6k-b' -t6w?XC[N807;Ē%9짯Թ7갋?ϧz|ޞ8~cNhٕs y} U-mt"vfc?GSS|eLFS lޖA˘y]m70-m?:z5hZ.+&;j<;wCu'Z~8g?|۷ٚCN7晾MGr*sqL,y@/ud@I[d2ɺj7bG+օY#Wk:[ln4JJIj m|g/t )<2p!0poI%]7y_hq"ϖCRP6@ʀ#xNl1`&aI: apޒӛu[Ɏ4ض>`Sf+M>G ֒:ّz axaL ߠL S$%}C X Ȟ-0FU JQBʰJ(cc"~i2 H C0mjMN(-%n@ 6O؟@ ʊ$Q@Y%R *kl&UR}-YlQ]ԉEMv.Fz,Q 1_ IDATdVYP0d&3!|{K$K"WАq ej3CUFP 7qe9s$)BOQ]{p+ffS9CoRK]%1[b}Ԩ1V,1Qcذb+JPPzn3И}]u͙g5k[G=YiʔEEڢ,e{фwOYyEbVF 7E2H貵cu|ZDD/W TAyFsOEc1Cp4Vsopͫ?Q#%#7pqӽx*ӼjZrF.٣[7]8.pq,yS{(|:#Xͼ_T%8p\~֮\3hAYZKyuTef.9,ϋeI׷҅U"ʳ0cpOE\f/( ص@Tey>iYNv.TҿdP $%dKdMdmOmX(. )r'[i|Z-\=J'M-K?AL #<&V&?q$Ҵw]?{ @V#F J@o¨-Ln t b#TR0wt1yE;^ 9L057XQ%2Wq8HaU?{'8l) l3Hc~C17uW-t8ފ~;_';iQQ6:1kbg >8l.eÀªq~=HPD㥰ہf@_S|Q{s,/9oo"PܲcƌP)9d}YM<-)I4% Bިmp,K[޵?gO4 bӝz`!i;BgMB/#OK @DLlAL C5v#L0!5;mJ#ih0-Lot qD:Hi֊~0c(4!|wWA|x[k8:fꎏ6$7{#` ~^L  AUu"FSQeph iw؆ a&;;;!o5~F }@0V,6ރZk8WR >[?րQ[7 W+QVBtf2U[C[J@= `6P#'n5]ZmErNr3L$2o(eQiAIB'˖AAЫܡKCsJqm_c߾)ΆxaIf'/bUԿ_K[Eu j`Dڶ o( A۶?6DoIvM9$wr#ݙ%C7D.^ V' s:j3Uo]{xwrE8><>+.82gq|iOiw} gbS2-$h^ J ]wCٺ$m)=].<\Wq2DY*e'eԷ Fl ٠ U" 0\>/x:ɐwjP5/vnɤT"PB3@0uMDPmi$EOP(BԷYeBI J%)Am>zzm>Կ"e֔ "74oҶ{SIE(S IGoj6ͰTUU+B7+Y]Eh95oA/= 7P7| X;L#7 ~}9Ri@ꄫ1#b=B5Fa;ua i*:JG0DL1 8eL&d~ *Mv`oA|5Nb]Q8k|w0;4~!qCP,h' $x`@nA.ݧYx}2xd]jC]EsN QR%6>Y(ٳf:ׯ%wJ'R&ސDyj*lڲZ@u )EՁ=W'-2uO) ~=={|GZSV0&ͦT{n/kIOƚgV0㷻XمjZDZ=E{1If_s6ѼuYŧawN?Z*]II,}}Y\[?-ݍغ+~'pQy٩;.91_ߙ%ZyªZn6{v| _5y*37 a~^SgpA~9w"O_vbUKm+&_'΂mh~CԶf8bތsf yo|T׏/ o|@^ ҃CڟKWqчZqo҅oWJGgw:%ܷp.6kxe ,?ᾅ6끿YnjZiMt֕xx㽹RϠt+}ǙC=;ˠQU|SN͟:.϶*zu*LчTқQv#Էjc=/f}t.:{G+OYRǓi{ w&u3rc/q 9q"?3Μݏ/dԀ,ROl^%8c`zX5o,lד|>ln jZnYF"ƲW+ۨzT)HZ%I7HyIiRѥ -m1!,s\EK=F$mMD$5L ׷ye0U2 @ `ye2$-<ߢ \/}e!cmX1}IqRnձ/-Cƴ:UaF(`-"7H^^#"&g)@&;&E]k%lXR)ӣħ{Ƨs'cOk.S4}>n rFߴ!٦"ڶv( @&@yȱq8pc:b bnJ8*$rq%4?MQ ,ubQJieY]kWϬ;4kHJV `,CuvS!#TDD0)2Ϣ}t hÏCSQI(EtqD08ǰ80?wzǿ`6 rH"c9~=IZ;~l>J_>A%0 /Yw-bKK%Y]pzY9ypQctY EYJ%+*jIJK$ %IE15P,0DV(JyI II'I+IV-A8#I' 漤 霑TJ3vħn5m6#vܑ>f2nx5ϳ\GMЇc=,dl/-[{z$O6[n`,Z.\N|ѯϟeyˁw~TAL}]Ves[~;K}n+Stgukfr/M|1̙3Ng"ACs\Zz= AΒ|օdЙt'A^*ڊ'p%)[T鄢נ뚚( R@J#'SQjK('Ii$ FA#T,ZB "t~X BSU,8^DA99KH[K>oR$IZ60u(M2 hA?l(z/4pAʌL7MZJ*~u]<[ m?(2s]6&%)Gz S8,-``TuTt[+oWh[hu޺s cUO~@ΙR)meT5'\&ix; aƧ@]Z:L!HeL/UPVJ(%>> _IbGJ[u$(!MҟL8 ÷?ak I#p$&Ҏ2"5Aa+}}dIxy&(0\Q:bF a i AW RF%I[L(JEE a _?+hV`iz(+dC2 MR+ѵ*4꟧KƢ m6MiQc9mQCkQ2:#>LB״U2hmWE݁1ev1|1},&V!S`7u^y-(MĶI 8 vI1nȜ[;V_i_cS8ꄳxkS~1)R|e4wokQOei#m6:'+l' R6r;?p>GtySyla 3HpsOg<ɧgcp|m5NˇpqQY ]җ݆bWyLe2<0aA458[x>yn&Ncm<1m&:q?7Xk =$Κ Yȕ;S~c+g=|ᣥ9'pөqV[VĽqY^Hs'XLr8ϡe39xoCSlܲojn7m˳[hm%NOCu^΂-tUIwE_29+vgZn{9͒{B3'yQ?~ݙ+ΟnC/~8erUoGbWr<6n-!M=Puy֞ ޝc=>Y5h/{$/nw<1ks˛0 9}OX:U԰|z*kutȳhy%_6=J=8fO};?ǖff\GpۢP#׌xx2`⤣<]s>_r/c'`5t^YӞx x t'˾E @~]GZPͫ,k |. 7׺]ۤ$n*#xl*C:z*T;=-6VBHx1ʔR(L@oHDcn\kɛĂj)Kľ9m(BuQ0'{%PB7dߔSSf[d,KEMHSV eʎ[B `))S!)cIKYE!X>:y8ng64UpLnC\_PkR逫Jz e"縖m*&ͫZ6!V8y4ςAKjRiXJ6:7rp[Q (PCF)@ !hWrQQ 5vt @ & %lVP1E<>[~@4].7εtOJ;jV:<$)%LyA4\P9'9T۳lSNȎT=lAЖhm.gw>Ĥ6ylmix$PTH()ˠf.[vE2 C{AOq>P }z̏xv.厤o"egy{%$YEmdKΧI"4SiIʄ$micѓ$yEkV)<65T[/XVqPjƍ &⏙A"HX BzBYU .N~}spدŝ7cFţ]BNPa.elmVEH@&c@F -YKf2l,TR%(%LZ{X< `)zt|odm1x2z1Agް6"LE2 $@h} &[ n*A<ñfLOvf JFj'*9$\IEZJҖ c)J4h+h%iJI%*%-W2arXaʭqc>^[Ƹ0gXx׿.S93v~X)Ut;gpN49(%/-s?'?wX0o[:O5ݼlmɂCW_Η WpVԶ$Ur☡}5W_ƶ47y}?My>T=*<Ő^l}}Oeu;Ϲ H$4+ GH"T8l $L:WM$}B T@hOH@*)H)W,K6z 3 C1MA ǧs2H_U$Aflax DRHt~mYVD W[bBK򺯛zEҚ=_,E-Jmr@^ µ5.5<{i=הcǶަSWuР~IG׺ՊUB"`Zdʧ y_QT^1p^J]\ &qW[)CQi42I;fa"E` M0>)sKbfk+MfVOX6Hch>/{f~O@! G{ V>WP|N8XD ~M:TGxƕ$- /0{༢I.a[Q2~A{МwOhD p'IKA&&?JѼ=-'_z^{/ 땧섽kL,[yﺂ\~tŏQhfm:=%[ָ38hPdȠY:;nynsI(_y)-y'9}֮“췛ǘFqߡ<'٣[Y6uj)5-sYY5[ IrK]89rxv^y;5{ƫdSbR֭Ι$}}osT jxC>pN0n ǎg֗ +٧_fo`gx|xv]SG9dg|̈́cp}۷|sٯGv P3WsŢ C&ѝߝq"/.tż3</+cKM@ 1z/pv]|z;o^ZBEuLWrn$˩,>O!F܃RGRֹ?>KVQ^ʰ;|y^x(qD GL!ȩss׫aJ enւ!9*A B(=,|@K|V cQ J<(q!A i)H t)5֎j ;Rv,:y5sO(Ql7){z*AxX|/v~1/܈ M<+J >]s0k6PԠo>٬"WrJ1K={ʢhJ_e|^)񭛧|$e)IVԔ@eZc]ӛmcp[t{i.0:]rͯ.g~_^Hk1{kv(ˊ`Ć&NS_-ޓrظ0tx)kDū2a5O/og8κkrv}-m)ߛ3mgݗsyo}/*<oQYWҼ;|('߇3O7tw2>'y̒ -T&T=c/`Qnm|oIbP-]* ZŢŭO<.>::IC󱅤ahESX\#{ӉUvthpWЪ"AJBHGπe =aO)}D pڨӎҊ`[s@ck{ DZ <ۊ^֚*`,M `ϴU_+}Eilo*J4.mfn;*rd=|~Zga$a0fD7U0 Le85*UP(<$Ҳķ,<|g֓@ I !*=MDs'G豯d>E0ET.|}e>2[O2TBϘoXoV"%L,ctcT? ^ `ծrL-@0h(Y-RPbIJ#S DᱳX(v螆6f)VAU|SI)wt+ -4mU7He-z\Ngu،ESEErR;Akkks`O]Q1jb)-OI] vAd&K-F/b[EJyiSGTj0!e2L7q:g -%cSeS_bhuyxE >^㹼]pn>8>=X)ݒ|Pn}gW'ZaY~-roney[v#Ǐcea=n<7.6g? #nNf/s6KWܳa sKWnwx֡{;{3пso.?.O#@wS90ԇxnߗʼ-\}Ǜj֕=Y|n| Ipo뭦%2w tz Ȗo;ZcW>[9 j6N5[Ǖ #Bǰ9n&_.'N@g}@C3b]IUͭ1dAes )r.˲/fb]z0˜"Kpϲb׸mC={:+ZG1eˡ\{ன8jM#(A>Od8mq,{J Y2 wk|O?vB|!})yÌ>rWN8 'o*uE7~se^'yY]x C_cViGɃ(Pgx6[n;~6qgu-cUrgQ>x=b{;j=uɢe^} r/>h<ÆOG|ǂr|O7v>S;{넋{qn{u7qNѓ7*0`q[m 2ivN{f+wY~&|Ȟ->^tm7&OϦT*H1Ԕ0fѣ̦$ɺ%E׮IҎM}}{OYʣ]8d4۔AeHBϳC02smBdb`0De=*Hfy`Az|׏U`ZτJ遊\;֊^=n40*3€:^ J䋂\^+~s.rњw!j>_xٯ s6'-E'-ea[Iۢ {֑$IEuJQcmiBKux/jthdQX<4Ϡ^$QRRRSN'v%-YEKV*ܢ>ք!Rgiq}=wVD q U>0`p Jpy\|wCV՝gD|BDi2P /Jw!l>7kig&|ˢ(qKХ"aCq|RP!I &K&!AԎ6TZ1%poNy*bTh b#Aǜ-t~'<g;|"Ieɨ9֭X(E#4LY9 LN,CH hUceAgJ`0.sɤp l0+C0Cn'Nu3|3nV*|e&;TIX$=;A")h1j:cN:l^ ,cZR~ےL^j* R67Ze-C"#i)\mٜ-9&{R)I!Tw&ec%d|AD-Q zcu @`K 50`RJ0^t"VkXC{'& BA"Q@Dh=@% &3}[|KHTu2J_8CI`izR%-;}jWq7:qۙc*:].-U31*{tzHY/6PWcK@zvTCR;F]vT{Ců X-YFu=/zʴX%zNj5\u я=7b Tߨ~/H~BF[a9mF 86=VyC0+T. ۃ O1-(}ܢu}J%HZ! ͂fMܦȶ\Z|?_)FΨ8e/?3xm?wҹ?)!3j%C:1cP=8: Y 8b$s9^ħ9/ŗO8_םʸS̿X/}~ӆΒ},*Ks:-p@_Ϡ2Vg}VW *Bu'PTڸEY-h$ WYP$MҴ8S BIA[jeƢB+Ҡp*S)A$\ 7lV[Qa?-v:yL7exƊxeETP [JDKH@2ij8vL0fC*+ ;V=Sc\P.n'tB)d[B*m(-AN( Q^hIRؾ' `oڊ1CX'i: USol܀MGR= \teg׍y}OBuʍ<oLkHkƔ^&T{!7󨏏PA gJ9P&$(GK|m hWĵ08a}8 IDATsEȬVOwOv-BxK6'e4'7AX0w3cdMW~ʄ0j [5J+5ܠΔJ2erDHҶtҊ|"[6(d =f!(u P$Ҵ"Q| 66H803 i[riIsOOj LͿ* J3,M(t-՛-w.g`Fr,_[_QV%Cc[L:oHJ<"-%?v28b6<0Tg|_k#,ov{K=KchhW춝'^}-xdyoԶ'}{& |~1fP2K^NW(րRQe}Q[Ug7~}-~'kgc$=!^#vpvS߿û‚\WO^5K=RIEY4; yZO>&w}][0ض4,مZrƭij?yh7g #˟$;f};Q6R~=SFeWkW߱#[uF}8Oq}o\U<4/˃l捅]غǕzygrJ\Ŕ[7!ӯ_>s،xsL7W7;w>'pqpIvZޗsܶۻdu)Oۏbib2fL/`㇅DYKy8?sjy-5AL{(9smUyfF9'%" ɘL0`#~DΈ 0AB P(kɹSߏ+d;k?SZ]]]Ss=|k~S~ᷣ^'!=IC2|6&gKe4/O?qbg=ۜXdt;mt,F ͈)x`Tz_8c w]qүΤחS"e7ב8a4OsÓݹzbw^uɧ\3ذd?l xmٜ:>? kfJ]}Oo:MjAMVM,7餒rKEN굘|v~w||7Wr9~I-_gjF1$ q9X'p=K$%ңåa A^@YlKyx) bO#eYtQFUׇ}Y`?r8a*l;%JL>Pٺ΢'޿k 4*7LԒ](E*༣Km=_UzXЉQ  v@] c2Q_H KZqb硊EO@Xq̤@ UѶ2=lǷ]@*C5>zNQX '4,Bg^)5NF!Rz ' a ZK"6~,OtUG~o!Ŝt`Qyi,:قE`/Rz1"a[dₒ`*PSTZPhgHA[^КvAc uÙ貭ݡ6w_cg ac7m;ǷËy^|N:['H]iu |xsA&XM~t>4qipW?%?.y6S\vfT8c{QSj*/嗧O1J4c͓TKM\l䌿"Z% [YnH2S>a c%Avo7|[޽^9{wгK[;M)nލ3={BmTzHY䊊NɺH&=XBRT&%Iı$'K:-v[^NYzt¬;DGtٲt|C/@.D(>1}@N=þ_.Oh'_ykU&0Es` !3VҷP`Ro_TcZJZAӖ<юB=a(<+VОEt-ٚ>JOP 5-Qe,~VǽK`%t"R:ޢÏ O/11z*\ Q)HjCX `=1X~1mt2e%Bl8e.?"[Befȣ]- RT+b!m]"  PRo=s'Al_ؽ_3gqRnh,g`/~Ȳ3FXNV^6%,yC ,Xɭ$x|z=n,[lww{cFr'ٿp,b@ESFDQV&%D9HyFPE2)'vB/)p"[d]ksy" ʢ(fB[F2dA\t>xJBŀN)LV*&-}eԪ*Uפ `]tҡ z:*Vx2"up#!B; |k P"C.վ;Xj'WAݷnljAAoqd{x@K6/]-ū gO@Y׀_+]il:$7åd  F2[ΘUkqG<&+ht #]]=?__9(F aJA(~#W:PrKl} SƴRZ Xb߼(x[LIo|%|cpy.0𳜻^cXP1\[nR~m ]+ѕ:X0W̓r!(UP"G \b yVLLP(IX$M cҤ8Ĺkd/2wn/!PtYhc m31jeedVVyzrS,r$(yz}#kَw".H BRoSqA2&L2mDU\ ysZ0YߞЪl_ GVN-HtT\+00XC` 0"HrtBە ^ 2!m_\ u0 omZ=:8hDݖ8J1ާ,H!@چt2Jo5W$oO4*þW;-|ͳ:M*72=W (3X Vd 4 =~2 Q> 33b`Arޗ0zXA\L (!-@E8HKؼ?WZsomϴ͠*ii g^HGmWyE EV$ =Z^ kS/'LЩ@qpmUTZ>)Ey\J%H:[%I螑TH⎤[[sP'#*8TgfoYy>Og`Bc2+}t3^}=#J5P__Gs-(uX%vJ9[˸sZ9Ͼ_+qxI;f7?ۯEp_r%pB>zeh^ƄSf*jl -^9Ͼm[k<{eu`\y쟠} \o_q ž%_՗rn`r,p=YP]CS(gg>F7k3+l/yyyn4}t-Sײ-Y*QE&QL2}P 0ʞG!E]Ųkys0|nys=ѝ6o.kmYCg^D| 5QWcnS7,2%l+3j?@ېtΫ+x')63=gAx  В.Թs?~Ȁ1圬XM1cL=O*ey^xIFOs]?w?ɂ!9ue2g`Ol=D.ajcfr`mI>U~{uΚ;viGW]K?\,U~kC;v1aLV^y*ƞgG䃵)v[cQ2Q̼dfN];T&'bE)T7O+!Yj7/շQ9M[8v@ȮC}^ฑq$qpL?q}lX|UVК%`~`j9J(v݊: O2.r9=e<ŧ=Ss0g*D*G#H1czul+z.fQt;6SK=m:dҲZzWbpL߭}()ReV-l`,)SEiZIt>-2*[q9" 0YZք5|fXb%>CJh0QJoaM\‰{VOZ-Ass 9As'tBkV )(@GVh0\|^3nQP0LfڤMkZtmrMQjSR d"(K[t+,,YZ".zCQ*oقb>\ث=Ont(;)>{o;{=NIk0c`^{~vwzfiYkX“Kٱ"L?U?ň/]Og}9,A%GyW ?9!rӲ`êtfŁ6@B80n}+$%e)-$ټ]Rת6m$a)JIY\Lۺ̖@߯٢3alikeKk+[[׳[PF;aԮ8)aq?t1>][s2+OժpL{qL;)ԭn87qp&,-}֘cV Ep6C$DF۔C"@l z2PBN]0}%4%E$+`*%$J&1wEb~ >cA - P&v 6d *x_*+uEר͏DEoUYXDH e)- S:L'ߛYR?a n9Ը iIj:$,&qh+O*'Mo-c֬Z°l mZ-MLJu~_'o֮ᄣ/mĹ\5Xk%ٗ`GmE;% WI?b)AyƢ[Ƣ[Z)E*iOYls ,9"sQ ]Mf -cŧk:6A4 TgKҀW @`Tx`YJS㺨Ta^`UB"o(0S$hM%+B߁~ %ul^:N$p@BMg㩮 +Cۥa0s 05FJ-v8E` G7n*8E 7o6~txy# bF___ G wiiҘ J[YeJEAy`[!k-~>+<33&@.蚑u֯kھ ۱Z}DD5Ѝ`^0(g>7)TXPi *lf ( Jₔ_u,R1Ҥl˪14JdR}13uç>`ˆ4w:NS1lYϿv%x5O<7q+(++&?o>~wo*cpFrx*&Nf򱌾v=}1}&}ETM8@3{j6L'FqX=-$y艏ѿBk{穕EJS#:t%4\:G(k&* ˖#m^A*IѬ.ϒ(K!|e} L0n&1A1#,S2Fdr ?\" &pbN^SqA@d@vH z؀Å\MV߶*O-pbBa㺶q@Q1HƵuv׶IMY8W?DrE{:m Ҵ A+"i5H푥Dз}SmfvBv"Q$ }^ckk;'gZZ_JtZiB_OIkoAgkC!tB{gW&#ZWb*fRA uTx01/O`Ǔab+I|򓃺pRuĄ%H X|I8(z\f'>v,a| ÷=]&A6rlXœ0dUo)lPȷTam*LֺuInY7vCڊX?  m\)_KiBw::I"5KTNjIۊtL+z36(W=h;^EEߘ|Cb!Ek$)z=K47KJ )KH~յ/H{P F8aOʬ:V9*Jv3g|2&E&eR}_3f21Gek)ǏN8gO|B$|,If__lcG E%72x9|oҒKN8raX Zi+;?:VY,R/o)'?81ɃSt6`c |%KqïH :C;>f]|yy}|2?zyoǂ]GFa4wkf^8☋%޶Kοe-9mÇkWk|8*Xxj_k`O?i'南IU|~m% g] yg {K.óǸ w/{~ t~x5u9'g IDATv/ԓjbVvn[K{AR۷ȉIKtwE' :^{pǍrCsW|rݷoMa|x!^6 M[=;صs3ˆkY 'ե%Z>%D*NFޞC.}lN;;wrܐ2Đa:'޾ķعXOrYRՎKyf7W෿Ca9aa!:҉v^I !p0㊘%>_vBZ x+أ astX Z9,y@;bT]!p&~%T ` D$."c gQhEl< J?i5-zzaRz@߂_2˼%"<)b%>^L5h6P6_ RDּF\ f/:P0Iyf[,F@r&=ASAT4)ז%rg( RҌeʹK&/mF* KT\~% (t+h؇P+iKvES-'$U9N;=S&Y5qGuT_͢%\/o?;/i.M 2ߡySL?J~qHQOn-xKf{vFa~y ֭@%Trm~}Q7Ëژj }ߎ8E_ƔJ\:i3x`*78mb 2߳i91a:ʟ a^ d4.o|D<~r,I^gXqe j+]#JIE`e?a?Ei>~KH(( }l䯑Xh3IsOK8Y8*<-`?^?a_ _?"n[A84$n.MQD3kA 頜 ,Qp)K(h$Pԯc'w#ќPK%mNY!h:]{8~p?焞-dbiZ{Gn*-/<$ d>ٽ{GY2W3hCǎ?aY8E2nNhQ薴Hڔ',7WRtuH޳)߬2 (pm iYHK ,hdtc˵ՃW%C.2a,m:YȢ *0 =oK x7TYtfMICaZ=ftd;!bAzїuzAI'qv(RPEI*rF\{HrR\"+6)c\Ec/5{o"qt3͕8|)<3yOo8_>֍iNc{P8DsK_d&Vinz3wfY.:e"?'YOv+ɴdܺGkIٚdvU٭Yٿmsr2o)u>vvoйEW=Æ|b>%'{frT69h~/Lҗ_,:/`1Xcg}Ο}.5dn\۫7ijt>znncϿiOa*}[;])ر8u'-!u; ; R_̾~=F}^dXƦCu4r(:%Ef\߷<wߥ{s3x~3O=]JP\u.>zin[=${j5xg|tJOo`ΤYw?95ScɆ&<ƌ Jlal-_'9w8ޝjl Ŏ;h\ͧ$8Jkamkd28vF%yc{X5n字dJ CXd1+/k wWͨ6e̖ԭ7{P7> 7r><47bKsz#mlܞaG{UӺ.쇷_t=jQQo$Ϟ8ǿTλLl~ů<)Βp!k駟ⲇe?@6ò>hٹ_<ºukX\ݗ~6[Δc'qWeu8`ojETS%'I-Vnl&螀C C7)Z+S)bd^ɚBdD RSRץH9E%\z&\<ϥcGk)zۊ"iiQPق@nm]N:F3WMKZ҂-H`gQGXaζHD oXZF=fJ(&6㈘UA۸XⰘPX+Jpؓ~> >~X0X|+dp0χ!h{+t% /:?mp0> <hrNi08\Pz[&9 G%" gEaC`=FuM+)}<.xE)FnEE-D{\-UuWAirMh,@SN~rZ47yh/~![B=4E [)WHe#E̲I,Jbe)e,JRzn!hJ}㎢4,Qt/S[L>A8g♓Gk?NͶ /¯'ˈ-gZw l?> |oя?S#d ֗};VGme9i@mP|0WIE7N֏m?3voŋegҰRN/ y洳y7˶Rlʯ?,]xG_gٽx;[΁d|*؋[Slmx}o='_FStUBEڢ(8iXCKW8,.! #3V!P{S@GўYFX!TNi0u};*?))@σC$|z PC]~GFI1 6 4a ϩtJ)x9,#H< GSޣ<Ӓ>h*B fkK\NWJgs73 K鉷dt_6/ k[[\U~q-AgѨ))(![@5ed612Wt(#,"'-r"E޲(E³-؍l^ EcQFTE xH'" PiZ_]- X(u #oERߧ(kEQ5VhD؜l.̘Ne8҃Pg܉ J`)t1lPLP8'5-KBy ʒP$XO.oёhfmKMg}꥔xKSߴ2kP4.gј,~i7{>ȞEݏ+̈^}yke7Npy 8ZXZd_`zƲuy =xb3aă|!\qbweJspAng˻kG_=eDarYΚ@kc"tK<8ZCYIVyc.qK3^ҒXq8B(_lg)l}a˴h,?vZsB6j@,uTЫkl0tQfZX@֖zu!iYOnuMm~KB["gt,N*D,T*5y^UPF"&+S:(d8BъE!S f8Ik;fePbo&pz2G:*~ w?ytx,H:-@_p ]:_>j+3'76:1z o"ozއEfsID\/)bGئ}߿!غ{5[KYx'Tj__lYa˜o--n3 `5Am+x"Z¨} ڷꑞe2-V [VGm-KV7}1)RKSB֣M,xYQ\m61E߸C\6X:"'J*zgB*tGĖTkgN-Aqvm+2ܥȚ.55Ir|X+=, A<iz9aow#5,\"zh}㧬k w\և5* e`J6qSc<2DIq? ?n:<ϥgwrꌯpYx=:e3GJ7eJ] JS;s?5]r }+ S[B]cmߛ}ɻ,|efN:NP 6x[~A{l<0 ٟp:|K޽'ؖ"^ŏ-ZHdŌq9W*pBF3=+7fc&4Ґ6OTocÓ7#dg^gŠ׏8%Ԫ,G]ߢgrN8]MxmZ۶ {<& KxϺ^u{r=71[c??Gܻ-/=`>ɽ-^kIƺukN.{7{>u/5fikl_^z0 CgdIHw~q1>_$=>{O>]HrW_G펵XWvC} \q4~kF 3ǟVfmy?C^ŢPذgV8|+uU6٪NJ |n->e#/}9o2h9m qWͥԯ~Uj_&ĹɊr*w6eaG? Ei~:Ɩ ;vط9%WA/t[6G:nu IDAT _m5Q__֯9X@{Zx`a*B86JX@ P4U ( D^!jecYYTE} >naDk׵ R(]_aloA(GY%bYzF !Tu8yh1kڷ3վ.@J_7Л(Nu:F؁&&,M&fQ)OTf,*F[bS(M[dm[ 0\tEOۇlEYRQVT@H'Kag6ɠ猉3mT琌M&nd2^md;ֻm~S&͜˧J46~-(rIYCG~ nVũmJ:K%!q1h71CcleCvrW|]w;ۛy4;nN5&ګ=3̘gW#U]K/7\=76yUYdxwvxX|%}*tYm;,5Ij$v]ر$-Ok!uҎVY01IjPvB V&@S{# -6P"z9BqN.Бa'zon? ,XaI\(>ppl5^" ˅ MDKآ؏ *xahg,?~9Ι-%6*Op_artdfoeNv_ ?8WD^wXA30&xb~_"&U1Z4[$?" (Epp@yt 8q% a x EUc/vպx¥SR摴=RqtZґ6y+$|}bum'r͵E >r;wbàMS\8QѼ5ͧ-'N &$T'mv, A wNBcKƷmI;U'ij`[$&獟Ns] ω#t=[?>i$4+62"Z-E;VFuڄ=]YbUΌ!yQą"aXcKcF-\@< TAݱ07m~߷uz}7zi+2Rv i|VW[Itxg˜T|R[Igdt~6i:g0wgZtz{W_R:j$Bp"APhodOGR!P:0@P QANКxb[RHEqEs'hɣcxܥ8/C?bQ'R( (*$c;ʸfY)6,t3Bٚ7xaI1i.#ǐ\0,]"CQ/=+ttmڭL{ ^tL-sgpV&cތrRR.}G_o~MDL൷I?+ӏ+[໷qީ 9+ɓ]>w2wtʃ ڽ;k ڍշV.⧏OwR~=^Fdt6-{ϗ3_'O5:~m>gOKōOcb^aU?i6_ {]_YKGlQhv/6-}<܍}zoi gr߭7p׾/Y_ac$^1M&g^͟,G~?w@i&i9ץZ Hv~Ϗ(?45D6}4w:җ+PQ)wE=DdKHeܬJZ(t؆p"ju$g(eM @rx=glZ #PYexdI86Q6H|p|EJRDJBڕ'Xd~EDmʲR﷤~PnʒџcJa%]eb01tO`6GM! 2t OiZ[EDZD$$߲8"ɏH򢂼ԉi}F= GƔ/qlAV[0&ɋ*bN]κ 񥂎=GK9/U*;kXsgՑ?k4t>w9ڙj:K`o7b'0ft9>51~:G=`X&95Rϻ)9]z[~<|A'noΎVy!Ĺ;xg\UhR]j H׼`*NY|K9*_0 |:?8uxn(%lzwK-34@B7H J42RѠVt_fbG}Ҍ8- ,Oogu!/Ū{Xuy-8(!$rA$I7No^Ja֐A-zL;/)NףGH)|‰ }0w!b Ea8upREM亱< u_Uywwm 9nÊVb?vͰjo/RQs)PRhQ^bѷآoM<<-4- )FϢѷh6Ec9!DXaʨDXB9בIږ$mI*"I:d"Խ%7{Ҍ*BHCnTO]TҬCh2h#N!uAPleտaOWXs^ 1T@` 6fo\rl]TlMԁR*ߜA-h6)[&x=Vƽa%s~k0񇇰>p%,iiM9,eWW$9GDΜ{v! QK\g 8t<\r R?Jxd[ePT*dhіu2ӊcQ|o !|fo= XolAfX-֑/ Y#sM&`6[pŧВ֙V̸A҉U($[6P, Q[gYR4m>4UWŦe,}.y>|Eo4t)$ =_1C.bݻu*:.fҥso+r:7 ÇhIRGٹ쓡p :'\r. zd.Yt f᯲ /'$uikl]bP#Y,(/(:EE\N>XD[[R L*E ѭ%G*WI6wi2%O0 tP7HӮjJl|S.V!c-sko~о2 XNZ :2OZu:P3f mu1AѶ srȧA$~]8Xh60g2%u&~'8vRi5Rf@jAe^7y]5n(~)`:&  k3C U.p& G(U0UH_-`M!&AePmA, *ۦKsP-3|@jf1ʋ@_Rd$&8|!ǖ)A\U`ia TtM!lAe%(k23}J0N]Jj0J+InO$Sh8Qs}u-Q$"~@ku5PMH,p3C5Fѧ !RT*ק+O|#TW\1 R)ÖlY3 {#L/OIݱFOJJS'wp 7~zf|Y=2_W:Kn þ/С߸n:- ӻucQ^ /"S0/P.bjVYG#x 5[m'$F鉗- ~{~gKH0'',xu E<7|/6IoQ!w?}r|Y-y1([◞`޵WdV?ۜc6T yu}%ܖOj.\^Hfs6?7i] 05/-| knسs+fp 1^;L<8N3͇89t/_q~i%&4_Ygr4CeEUiw'4s3wq33cxo#cYg+?]ɇo<9sҰl^Krkkż ӏ4j~%l)aIlHpV"ToTDOӋyz .u#,[ iGcz/9uLז32kuØsx}yo]v1jv;r,zK'Cν^Z:j[㮽q&t-;od|j#MKyF>]?8Aӡ˧kxP|˹L?bԅo4C1 u#禩=knAFqESwqSYؽ1}=Hzl类%+c`KaܣӣΣ'IH<"jkhHQg3 ;҂t9n9b WJjwO9t♓z˳ ,=}! @!,k1,`Ingɉl Pk3@nGvh^fKJ @(2r ` ;d aMxڀ]qNWhK8ꘜcD'ga 3 2ti̘*-tF3Qxi?`{ĕFˤx3UgV; llO 2+Vw+ d4"5p m? .1 tkRZi=ʤ.y=ҸA$]bv;zzCG-J"1҄oA""R dFґW65 (؁F{cx=vH]46eQ{;,-F7 m=-8ma7'3wqNR@csQ.?9Cnjo^Iۮ}8y$ #)&[>//͍Wfç)Ͱd`|izb'wS|nUIEw@W=8܍kx2xu8 F~Ĕ3m(ifPy>4њ2%6Ǧs8ԫ}2Oɋ%y"%[VI|i bxmmy93a >lZ kVRCyI ˪XVнr\#7 ? tCW7LGJvp3򫩒5a)8όem?YRB$U}QVvT_r) kEmƹo3k1bRaR 'Fn`"Y5w=t%tBOs $s1|]9)G IDATlإ:dt4 Xw `^VdEV]}yL5*}&@RZ!<*ܭcrWvnźtn{qQ(GGa8~7zP\:<7zl E-I3 .7ssGl?i4ǖt9 71G=:Ű>i$3Qҋ֔+m1Cy7ےoTva", M}¦1_ң&/.IVsBihS׈V"l(B7+bif\@l}DfYW> 2[BL "j|l2'Uv~w 8B7įRX X]-%y|B?n&ꚷI_6- ]JB>c/iK|2Y1zr{".)vV|xOx\ة'ޛ~]_Ԓl]ʂ (Vk'}8b|j SHɊIYgJ**妉(c'';ꜙTy7C{j{Y pYHq)3bmlLL1kR(k8fq8%qIB(SOav]rYIH⓶#L-`Gؾ)&0j`cKPi8pPZNmM`Drlu-`) N!~uYw1t!k5r Njk FIMf[ QxLڦ/u6}]`i$nsdt7NB2"$EN(SJ76a{ֹ(?!#tvP#WB|ifKN6~M߈ȬsZ՟k˫YIA*l tbьbJ|\ Qj+}f,O,[n3mQ:3Eul^7piu{r,%!Ir[f$'nebKfE`ő$t,l AlZC!.EW"X*x-)LSZ @6vR,02w0 P?nm+1} uI p`< ar^mI]\9T>;#>m>'OF} TʧUކEtĄM|G:Է:ElZDlzAMW1,E^-()*(IuoQذ7Fxߦy9|j=GDOv3۶nB-yƲ8nF߿X`ι*%<^|I|5 nG_Y7R^Nȶo/Q6!{]UDDLݍ{J9{MQ'Tx ѳcfE/}¡ݟ}soߤk ϝ{ $?ǟ;Whk[+HFu~v=BݲR ;yǗ;_cy<~{ l^5|K1&|M&哊]S_* {ͣf^xwӹ+ӝ\ȕgjNELZ/ڗy!/A ^w"}%<8$73wGƯ}}.eO.wo`74 ^E!o?(n`W7Ű 47ְq ]؛<ȝb}GW1}%L^ς҆eߛ'rj٣cyS~# ,&ޏWڪ{pTaǖ],^)D(ŏ3<ƝT¨nk6,gu$N0P~8WqM7"IQ GŶ|tR޼\N=e"Kfc c`νG_cϙ~5,&ywfa@m* [Ul6no/A< /^ӂL1;7\KmUmYJ/SQ̖Æd0,‹I҉qb6ŕc}*l^IVozW;ch6L,װl5>OAԧ[$OXdۡC{BAG5u?4ۙ tH;̊-B/I+$VXXM%X1'ȸ`7uVK!LɀH@RqEP X~( Fi0>p:JKgcʍB[`h0_e0אvp{9 ]ଜQ 6gvwl,.KY&PQ E23*=W+ݴ&2d9dYz&b`=p D]=G\ZFl&m3 EmH*GAbN#L NcJ}պeiRh˄yQȋczlh~EY̦4fQ([G%yQ-ql*|IڳHKړIsWt(;)cr3&Z:ϿkꩼwТbTdXɄaQe%pz8B^ElĸhhK#v|3x Y#uPzlc+]P2'_Oi[' *y[+sO)`2gylHkΊ %m<}=In卼֎Bve璍He]UlmbSCzB?38Ϊ*b߁T8*WQS}ڃMƃLL>E:]eڰ :fT&qemԦy2Ź5sDfx]4 V9^k$xL^WT@M#VKECD'byx v&БVAcZ5C[[m`e^Qb*bM%m00Z@ ` B`)L_3 U=Xeltceտ7Pq߈v,!Hwʹ r\CZ߰mrkd%]7G9ƽ53*[+FZKP}?H L E˾Ru^ҳaWTɔM%"](T,sIY `rem[VU35a{c;ք$ w7VoF/[ mئhivEG::s'IkҢ#eHa<DYq.mA??PAz͑m+Ԗ}[TGgs,m?3V/b,:tnռ A8n%7J҇qU ςuYE[ĸpl2nS~Vc; )\^-0᝸ ;i&v}E7%F s ݣ02y~,Egq /'xtz@EDTh/$dI EIKHas1:!Ff0!} 8u_J^;&E$fzdaJM"I+A$1$QNnu@`o ϶29gտݨ=2&:qöѵ֢pP(" v6HSIIv7eԾ#-H۹_] FXS`}L,^$y~%BXgajҤ fϙlcm-"'9J 0օ]³*VnDZ3! `X,[kH],}ЖxEf-a, A[z!s@%$8ҵMrr3t%|s_6 @[ss'fXGɇLC X.X5pHJq R8Ƞ&Tﷶh+&7 t~%[$Xf 0*t(%( }=XQz3 }O!N-N R]Bԉ:zdN~)} c>Mny ߕ4(צgCQ¡զ!jfQ47K#v3o`I$¾C _(VS<Ͽ8|嵲VFsF15]cv [dڜg2=w_L<̉xco9 embvnύ}^SF0BF dk32#s۳]>бèX_v׉yvUzr\wk.m/wo]obѣtgǟϦ3z:o_wAٳufʒT~Bd|A6>¹>:ը=jzËbrnUz[vwb@mzV5$Isno Op_9YYaC|w:ⱣF0uT'5cToK"Ggr^{Z?}Bk.h֬Y\yW8K_2?fϰty2q{RI06ʐ9#ʈu/[qy^z9 h&0]uݧqd󻌾o|'ų両i,^1G`ņBfRʂ<8+ |fNt U{Ӝ7&ŲI:k:9i@Oץfe糥ҧO*wm೽(ȢmliŚ{9m}5(WQQ(J$4j8D b:0b~;j(}_mQ[q[;=%IҮ&=O>ҀQ[13:1K `W#}m!]AǍcS''U:Aٙ0Ygk:fe e}>MxIeKhj>Wopk=Pc@f_&EwFNVY%D\M 24d=u^(QBP/oēk,v lġ }fq$1p*]:&* j i Z8H4,ˬ[&DNEu)|Nu"BGJBd6o\#䋼NK@A\P?HiD+IJɌ=-i4빩U&Ilդ iAs4CsS̙LKZrbaS]O߷8trO<O,eKx3/-N+xw ),Vz+i3 %M{{r"Q=y,&PcE̋gA%݊mʊ- - m6v_jsO „dpBR'ɏK K XLIĊYȄ\ҐA C2q!m!BAkB%Ӳ3 i d.iG ]8y T)|Qd!>؆M2qdvV]ڑ}r6۵+|@F͛K;Y\AMl'"鑘a M;!4Qʬ 8\TfUٺ:X3G]Ҝ,^?۠oʨ|ә\28RQP[d BgpgUyZx3*50MZFk *gGߐp0l îY˕ v #\w`ZQ@ɻho R4AC uESj2xkFR)6E֗ IDATVG|^]"NpqO>bA{h:%_L>m^+lb5ӤiU؛s x}a'N%{; O$ʊ:okgҊMl߻C;7jo_v0iho~uc=o ̖+)+!;̴9Xa&ɀ2W3$cD׷1}:ZC.` 1J 8wC29')zFyɉzlF%l,J,uQR2"2hBK ER$Oqa{uA4Ф~rlt=ZH72 "Hb9`lr$J J!mg(V4EX@'cl[ JI(]hN.)Q2 8v nTy1DͶ9K E u~Nm6*5p2)OJk8㙾"cD~G[6MPalak2[BBAB@RZPhelkoL*R+~CկjDPFLU >ervC^W7QN.PxU8")""jHߨ0t}9el C؛cױQ f)Kkd:Ynf] Vй悤QϨd8| kycAZ)qX/AܶEtl XBrЦFG ºc\!+X(dVa<߾2$W*3&ᅢC'v;QI/SW|§(q?˾ͤS <Ǧզá,ߡgC*eS]g2KkVc7p0HuS{DI8l&Q,TTU(#z^ ?ur73j]QH CN-ٺukد} [%/e UNi#JXmw3xDvк1ƜFYL>LJRVDU]X<|gLVڦBq=UeU&=>^e%<ټ@3feM̜.ōQx\4x='/tl{4g:gX;C/arr mbFغ! [ˣ9?9ICY&”5ho[n6bogV8~}>[}Qsdïh+ 6 v?IBvw,^_Lj㌏Ŗ4-EyDDe8 C ¹yE,]?%ƶ9ܯW.T #n˸3z^4u8;%SP؝ƕ k=g7D>If)nξ1n^?_/ΎIRTIoMigLhI UYU︋/`|7yPT=wh=΅Yd7:<9M`ǫ}I$Ѕ_./>EyzG4}C{г,Jc[-}D"ΉCgKD .nzyϟ7g%)暫Y2f? ̛/?AˋO󝿽7 >Ǿ]v-^M{E4uD1PY 6^s90z+Q<ÕS㨶mlPiB|FsGr׾EQL}D5@nH%.H,/4f9^ PJq2rggXf˺KS\~ سţKH{D) VJa`S`:'e B桌Xa#̉DqwXiv= *H[Ѐk6E1Mi(I} JӺ${B7Hl*, %9IS!#ih4H[MYI}@t.UBs۠!+hnc?0ۋ{QQ-Sc⏷ f"4/Ϙ|&V˫ ?zrư"~Bt\?.Ok}PBeN9p1hcviώդJ\~~5|zqut/*bbV;KYۅqZe ;v`̠$+ڏ@a̵ T:|QnWLDdA@oe>s*ĠDpxmc`_3Jv:U++@޷cڨ8* >J\*=ӥc9ߧUJryE#qQNYNŵQ '8UAVNK7E'y_F>=fgblZF ǬU|IQ~V%$iKFz9&[4YESIcpZu7JҪRb ҒA. .|2xQBbCdJY@A)l_^Im5ۏX.FV͊4 J}eXD8 1]4H e&ma1elg*DITهٱ-0XZ/gsK RO \aذ(f+vua Mbv$Vq~@߷13&k'$Ic/WX) 8'AYzGA&u7a maXB (.vBЇ6ƂXz CzD2 10ݡ"WE,-\TƓ"b=)piۘ@,m2xL(( nRQi 1_e1bJ/cϑfF!lo^^FX3SUb`\A[NЖզs+Hz"(% RfǢŢբbAE}=.֥45E;YZm'a7eNӻ;jн7{][k$?`$c<ϣhQ#0c%oj5i-ppˋ\to_WyMZFɮҥl}Tg6_dӱpxtQ ^rٴ>߿~Pq ?qLzY6RPgoO+Z%A" ӊҔ&|Z'r*VX±Iؒtr"+2"",J*\yI9Hc*9#ơch#{@"RВоt-?x%u ogWFmoށ? ێIPF&FِpTuL_ކ |fȺsA|]O)&&%ɣ@̶V݂j`夬4iŞ%%f(B4?P2کGRzpjTEj ~pRz /$\8YNŋB5Ǵ^d!F/3:p0z5Aة1Db%ߏ<@o2JH³UTx[#yvA?Ǿ fDT|(`WZP(]-y'G2Ah6q ,ʱir$ͮ-}'!||9W9~f7ָEPt/U*T[Xߧ.ب5O0؁ʄ&ICEjbƃ6 Z+)%)T$4e|: 'φ-:Cߴdž\C_[uz?{,3gw=\}2N>O<9_{%|U_O^xg;o}~)ܷfXsOp{O39K/;OT3jpoc$k$ODtZ}3/|9iWoh-/pdI)CZ3`<،]чWqO<4f/~^{Y$;O/sg]B󁓘h3Y#E.+&UȾ ~=@-][sٜ#ms~'epOSb6_LG;kرAV;JJ;`[Wyzo,KvuΆL+/iq[7?2%<1|pұ<+\^'45U-$_sϹ{oC5__^^ʹ5?TwZ(g%}s\rIPBK%U6~8[W9p]W/E,x.C? wx.Lij^ucy:ଶ|k?UoEQ7(SMV_asK?HHsv.:;'$ :յw| JD,h@Ve96 K.s o1W)'Lpx~4ٕ+ >5e]mtH؟ʤVl9Eeթ+x /V`QA _}Jodqܡs.AA#*f$9 3YDk a:&psVGl8`ÒxBd-\ y 9Y,PL!YBP"/|BRP>%q}(! 3tB> W&Vҗ0 L4L!Hq : Ā3)k@N@NB6 NXWBJ\3{Wվm; (-m}݂|-@&Dܯ)+g+%R\VJVDNUkTL!unA)2yAk[ڠ% 7ڠM ./*2 ׬k¶)[QR~c'``zF(ص TGX\:T*'K ۽%uB)u\z%E^<89 |#z=P< θLoԳqC..1m\ G\ʦ<7ʰa{0]ƖpzS㱶RL;Γ1S쑛ϼ<{h'NPKp Ż7@}:\;36]ݶ,4 ^#,Pc59LrX9n Ks  $aXWQXo&m)_G LJD^ySK"#[& Mя49 A22vRҔmK\79,_ced4D+|G\_P@F_q~ƀA>C]+nV+"h:9SpL2GYy[3@p}t>(G-qe!<sİ}sM*4WPX H.*xI>6dd%2KCDŔLU\>JŰOW0/b $Y{Yfb.XDRIF  hpOTWIAY >#o$dktidP<4˩݋Mb81'.E\пÐ.#:%U`TI*OIZҡĢĢԢsMRn%6݋m'%5< Gp$%%iIIJR%)IiRR$$%i"I:mq[sML~nTv> RhRfbQ?vAw?ݲ9D$6bzP"d, ZYQ迒L aN?`f'bQ.Gy^2ue --b,`77HƓ K IpIJ2ИBN%B ?dD>T_II2 a"9`;0RTc֯ٞp٪`-ĥ#W <ӻ/|Iڏek@705~ :Oi ZkB /wQbff)b7l֍WfX*cQB?`Lϝds1aETf;vL9ľ'4 iW̃UxYpmU5CKO2mSSбܡ.Տ}z9$;&tp1kVp2s ؕ|+ ^#5ihu=|MuTT̾.7V~>RW(0w~+-|5U]0MnN^]7*hl{ӟOJzQ۴[mJ uO|6}l|ع[3EEulܘe-tOnf6-y/z7sٔr%{RR a]fatp\0arSIh6!i6)S[#B(b۬n60hBu@^7^lZN #I:! B Aưв̮#moWK?CiBPП6e݂6O3[ l6_7?PnmdsI@)DOL9j?lA{>ߜ^f zז7` ,F mc=WRA (3s2 €–^iIIMߨ?gOC.x]\A-hvom\zﴨiO)'-iNKH EJjrJB0SҰ"isKY5c!k۵6K!3s &`uc$*Ւ|b# χ;ߎ~6fm IDATp[u3(z=07f|>XY-}yJlJM-L(ѝJ@I~#W)Sml|8W&y$)^6L>k7/\ - .sS|T×$ 6q~;CiISKYJfg=٭zZ >,ޙ[w2t\pԡ)2Yw9}LחbwT\7;riv>~ =% /?|UuA^en8 [ 'E ~0qx+;c˩*JpMuË:wi]bpYg9F`r0޳Ng,ֵWO|JQxo}/˛Xܓg_Y3Wۯ_ |cy~.zEXe9C}t_vf̘A[{<^]5KC|r&M4Qظ_1,9˷!1a'X_\47W]0={it&NqX۞eE,]_JbvoNlX[V~jY5N݋+~'Usp^Xዥln7+s?olpB .Ѱmf4`>B#$H%v#zI$S|'Gٌ,)}(}8mg sO(/ ӀR&'tr1)AQJmK's\_3sI.3бwR4 bhUߐ|;/KJ Tt `b~ =lja_> _K$[fy%hj/+K.E/B/`P1hI{Vbm Y_ R61 I+--=;L~ 97  "PĚ ̠3/")`gk[tsC'u 4 3VIerls(;2ED"V!(X4!҆f&YP)"T8TEoJZ Ɯf &iZ$ I\W[=sfeiAECЉX V$  H80l+G-wՊ7Vo`sU|{3zܲ5tK;u jCYCٽ%֯ђc^Og[m6eopvZ46{-Ǯm_p//Ň?@yky -[G싧6t_&d/yvY;xwiͳ#WGesEB?nvϟg*݋d+m8ܫ)^Ս?x:q̒->_ѷl7váGe;8ip;#R6R &WҜ 6x2i俵B&= Ig|};T 4`) X[QFu z:B1qe:e}D+Fjm莀cKH,"DxS -hD+O$ %]Eݟ~ NXB#B_js۾l)-@/*|Tu'jzdZsh_~ƪ!#L(^~0@32DrώǤ$&s%/}A, l,-4Oqȁ9cOG5P(CQlASЌf9Tu(吰65lN3ou12DzU~ q8«'r!]y[$CY;:zZ\:VTs[1gxMEE~By /S߻Ym5[|yGw~4wjB&\dM ߲w7K?ggv1>ٛ_ăo;coP`mܟw8.ClجMجpk%Kʊ%E)H\KjKZmA$Ph#O?3VqBy `$l d#pHKb'\sRvnI’:a)(ANH--ay K`4(}w5AA[۴iCJpz_ϭ= /t{x;ZxERbE5-+luu k|25g@aW|0xg7qA+(a R 谤4e\A2"Āƕ"I_fJ|eO_yWY#+(yJyEμ3o^nW"Oi؏𫗁\uZ*S!؛0#Uy.6XE5&.XUh2! fp.GfO|\xºL%a'k @az;{Qy =DP4h$@h̾z?`KB :j)a= s7t?rJ]O'i&HT$m\֧ޢQŒV6*lcN=Ϛ{PNͫ]vƚQ^m~zT:F2.CxYϼ3G_hpk)~8|˾Uըn73TcN=()[M"UF(| ro,%ytA<m22GpQGӹ5SnYOOh0ϸO JZʺr2qJٺ7+/7w;k?ʹ-s-rn NX<>{iڧeqdP& (^ //3\v8ncN{؁N>2K5CX~y*c)q}UgOyغl MqeW0}cfM3y]y-7֋L8[6+p-?)fzqm"6gv%6 e ^X ΞRGn78pqyʼXxlV+WjcrͷɧY.T/uGuy- E4~O+&qѷegZϟoyY&Gp2sP8Њ}?SFYa,flCھ~|ۇr.[U~%)}s9l.?LK46>]|֮Y{?d M-\cc}7-v5=|Fb?o{S0'Gw:p𳙴| 4~ɔn|SN:Izt-~k@Kcn 5 w}9eq޹pWuB]}1|+w83y0 99d8לډW&Xr8N705/|rut5 VE:̹SYQq8>eÂߴ[7G#OM ;r$?T"ŔM{.s\S.ͻ.=,fyz3g:7eO vXn7_aUsy rxZM2s=mM)?]mY|OAY [,t壎`q\5aYLKMۀHaSN8[{@߂$dB뢫-IR[ے/Kx.DtaaqPQB5Ӽ[';_*_ -$8lLB/`?2Lcb6x&!|U3 r_'ˉ=:BO XF +o 8Xd554 an$(wBQ,@*:7|sb_I>D %ZdYӀ)imRKx5\7p1)|=n)Ll66e6% (Kh<)B$A 'іBI(Ji7㦲k9Hh$ͮ iJƬ)+hioPD(eKZM~ARiAEXPd16(E0N#:1=J/-f6EM.#4ma`uUL]LK]nLųWo8=Gq6+>BVS݅,ݓ{4HlloO=-yiͫQ9s)ȖN Oĺ<<·î)&ۑ^=1nIQʁrx}֡(_Y1Gܗ n[HJW}ˆnoN=YkHouXa~m6 A6,[,clx329=Lұu!zQcG9XOYL:ϐ󴤸gJOR$,'F*u*}"e@ܑ} GnBX*n?|"؟2@k{Ozqp@VKZ7Jl!$kB,$6ߜA0s!Bg3*oN(x/苂TH}iE@FbKh~%u݀)T  `QP!~5h7}WpL'߀^)E($"7/ǀy `B˜"ڦ̵ s,,|"5 v z`[s}Z |氻 )z=wY)gy՛t)OX (XbtʹY#8M}Ug7r\qLΘǜeͼ9Jɷ'0mL1lcC ~R3#K)HV&D72xe I| .IT;jm9{I,EtՋK4c8-)E i(ELĒAW$D"#JAg+-#Eu7LUPV [fҿ7 Awԉ~߀;P'}n'` M珃k4Āϰa3s ~i=+a@EmB:^>+-Incnp "AP4'MEbAcӂFAS Z E2%LH>abO>]zj&#NfqΉ|~ԥ3z*ͻw(]toGϿe% ~RiTZm\ˇ+8[zX#/WQ1 }ɞfgfcxy<2M5.y~AJ, c~59ض=?_oMe`X3Og=o7Ks,ɥmW](W#l֢G`FGwhc}j\a9 ?q,J]iA:O?6t}Ii+<$rdVH$Z˲$AW"WQl^Ѐjayp|[B{> n+#t%2 8B[ΕFLc$x $΂i/,#$!lA2I#tPWaц%RAP)r_9H@ e\Hf nPpM[б@ HBṢR*(,J~PCJ䎣te'xkoe>p=%=ݮkpApCW@2lAi]̥_OaNpб7!uvr(EXx "07y4z6(ϏX~ $UWWҲСǰm#gI_5`+XҌF , EakYI]m݀%Dbu `pK o'@bxU2[Q~XbeV#S4)v|c(J/af೽>sУ:u"ŀŖ4s}+ֺ>]>)RZE߮MXQEyֺoieLΦSenI{\Vzezmt7y翶y(UB!i\?ޢ6bDVbw׳|ƫXǏ5_8?iG""gI|"O;ЭU2s{$ |)2?.^xՓ9=NF.9t>̂.ֿ2tI foIؓ6v'p_Cz Ɵ' riٽ72_ʙ6$mjWƟkX;=&?,IN/e33ض7Eq&W+#Vvq$[̞?ރ`j9r2[2w4|[[dyϫp?^`ޜy wstVʚEoѽ*Pv} ';ҳ|l?=xlYWg/U@n36-_NZ}ԕ ?G z?,m§D7rEOraL}9.<Ӱ;︆ARsa.<~͊;(L:e^gY;"Elڔ fg"f ׅQ{1~ m<ұt E %$(N* Eօzk%01!Xջ}|YA0=TZå->3z^>l/]9&hl˜OaFsip/`+Ǖlai&ꦇy$oY7q_cO矆Z:+,ǢKs'ᔼQ^+!Xg7g)Of2*E2mL!=S <+`|?Ǥ_qId֢tMЫak`9尮E %;-vXY(m)Zi 2yI[A$9O%@WHzJؒ-IYbKR"%ROUYT;HF0+XcC3 ?aoOkz" VڱJAg׀ XD2 4e1{mA_4JPTKUy)L@7d,ࠊ*>D;"z獟t,sp1rȲ /}0Q-D8ať$OD,7\ @749wc22gߣ"簚@,xl@`26,/-@mKGK`y0~MG+l1}2>K?;`ݎ=Wc161-A[ˁ( u[F)qgՒ|יǎLB T&IEUZQ4T):,TχBV}l쳹nEC}\=r7^Aز6Q ⩧gϞXp쩽xc߸&[Vqjcɺ2)VlKйa[v UjC~B'NԃQ7ҹ=X4coymBmS$ظU2Î]IRILyj߸?3s]`YX ,MJAbX[gcMLlI{ **`/(tes̼<̙}g3Ӿon}vŘφ2g)dE9mfe%hCpA{Eu&[t$ ϖLI:ZNa! 'I2R 2%atɒLI,]{HT35 e3ѕȍ   %$v@ *$%Ar@ I@J >$f em. A4("FP TM @Z@j %eIM(0ӆ[>@[p҂@P@6lvjR]91S$d1xYD1gkK9z^5T |&%;u$%<~\{Յ\u|X7_eqx˪Px:#rüMCQKZ0+ Y45K^l޹}:[7,Eg0p1:\==6Z|*o_M4qބdiv{C w;?ەorwxԗm:#s) Z>&;6=8ql/&I7\X48`RG_K,ṽe)ahu>ݰG曆{>{w㘻2f,֦20'_8?7'%3(=f\Nڪ49u;s`eugYǍur{&ڃxளҹ,mC r 󇱩 .;v0ŷ9b)1wWi0~./^ oxO?x'._-,?_<@\t֑a;3x%F 3lUS5'n'0Q4'_Ìd'󈋡 En}8nT ~C{Мf1!g0[yfB uW..ko483cHq\r3C|[#$Sݵy=sT:.'ulExסy=5{?[d:;Sx5KYxqnv+m [Kx[o>o#uDvn|o<_ gsvn=nfabp LPG|y=NAf-z_kY=,(La {C6|"kޥZ͛ǟ.}>,OIMEcYxn2ZSdMsSg3b6T\ˁ򁴶Lb2aAmݒZ؞0=O]A{tiwX[fsҦgWAM` c1FPo0ʋJ+*X\6㨱_TmgRHx,f(obM>W|X2*4}KS`6#G()+]Rɸ/[Y$dmyPJ{.-| 6w%PɅqEz~`;Hx/>F܀*.㜄Hto[xDu0_:+PtJľ%::l?;;Apedx+ٿ!aD27Ջe]aҁ Cj+CؤG X-%429֓O8a=TԔmAcL3hJZtGD$Ѹ nI[KT!AZ #YITf'*6 X.A\tTF&ێ:oK`FԐ͈~63;[?:̦oE{$  sIn#Q9vEGh(a[Kӯ3%7A0\[]:8ưcX[l ѴsӦ^cyfSɄg01)f9Wﳵ `Db)eBZt3 .`u=.@ii'x<1wsmK{A׵q=>b(EԳk+V\.Ѡ}B5qp TL`,8X*v,uױF hW"I?Qv;ZMg_Rov B\nZ'*x1q*Zh0dw4ĮPsLrd "T3 )ՠ͖T[{ĉQ7w+A.v¢Vpڜʶ%l^_䖇~ ?cbzoLҸ3=}$8pھ%|) |9AZ"'GYi9jG jcjˠBHʃG e UtIZ1I[Dt%˖0 "Uא6$7) "ى Dzɚ$u;Be1?PJӥZ&Ҁj*  ƭ|tW+ "x޿[DV&?u| _Twmw5]%IgCɆz~Sgx' 3Cp"!͓O[t ]7(qt1P(O9&tٵ޳Tcx)4L$aB pp)`WŕfV^Ѹ5c,j+Xv%PUАDCBw05pGS8@_'l(_$P%*6m%@ztK5k$_'!>Km >߀j0SfLG{ l:Cad葪y:&N 415xŤ\Ls q 6.=z7QRݟoxZZZIÐV Hdj:u A"sҫnO/9]kiRy_IS܋^m\7<z҉40Oe?jb&ZDǜ*:{ذQz1ƨ!YYYde8$ {Bz"HZˠCHDXSd%d% K$-:.q]f-I3\tG]gS1L-4B 8! IAH)!IJ@P PAm` ,R.RiRAE^Ʃ7- H3Ƀ-uoQӁv  lBP+޿A!ԁAdfHѸJ鴠tDQ҂.sD`,dq_n.Dc;7"tVPsWI-Q綘e+ $=W{[uF~uj9dpD^P^;ꄜ 9uT)ݓwxX/YA@ LehNQ='IM f/JLHdN*+`粂pA}[8ݙ]qyθLg$ΧѦ!`Z O6`/sD!bmOfsr%88J&ǦwCVmZZljjleb.8Clp8t~7B =tV}F~Wn3O=Jfgqu ]Eٺq;:zNfH`;9nl 052 ]#Rgޅtf_iXs4'z@^yӋy1i"N:n cy)P#Xb };Or)XoPJXC@E%Tw{)cpZO vWd4RX}ǩ?b4.v>qCЯo\&h߱ѹ|UZmLg,z~Q-oa>FNx*N=^]\}]ї݅u52"ZŮ\ xs~}9 ҼSjѻ.繍18!ԯp~f|z=ke,&۰R7XL4g71=2=7˞~wj}meQ)]/P $z& ᆋQm5|`w~Jj29aH&Ѻ8_/>0<:o:{e_Ի䢳/GHG{hVu|YU}OXtE<)k@{m /⤋`۾lxɊמG.l2߽V@'Pui33_97'1%cobΔql}8+.M5 OO^,2s3Uy@kN8=6{YXmrf IDATWpsO&n>#;rsa8Pf䂙ˡoc M8_zv\ yWIv eOUQGPzG^Y'~}_Uy+U%ٸמu۷ĽwsэQc9/OlT?YD[?cNJ<7hGB\aB/5X>eT=a27}Zh&<̊2LD ?y)̬q#xsw;I/w̳1#FpϫˑUe…TFm.,h}l͟ ;><{5冫oOQ}PКgN>Oka~a2?ԦkP昤mTnL, n2~A:Mu(mYWjSUe_nSj*ơ(gAw:u=ʕ8$JG'OCF Fј$Sۖ%u&#irJPƶ2Ua$CB*Q\)%BH;1AKN\-=GS pAűtI?+[t 􁿎/Άݠ;}!X8+UQe9KH_[X=ր'b jto/^qT-I;zj%$ p { =7}ߘaP5iҤ EBR H dRut;:w".{5ޚ4$-bQIGLJY* RaAz 3EܸͣCPNBvm]NIs36ԴdmF4Ԧ /N<ʟ[%5I䤡"CYV|ƚ&N_t!ɎKS8kar4 0}Y'dž`X/Wy%Idc;20*O__k"~VCdL[Zyd@]=TTAAN-MN<GnaK)_GO_MF ~L|rN{>͵unfhT{hfgr`K>&c7i `{AR)C Ā pSXzRJ<)Yl~Ggbh$AWL[-K"B (Jx_YVvt`ʓ;.tA树bew h+lz]>Qe'Z~>Hn,F)))j VdmcF qK~wF 4G",R5ߍ픾n,9G?ϸJKKϺT.$$=WYjbxln$ro wݘ+;kS7=J2cq^/NR3:ž5za'F<N@d"\C0z@Afdz&YY&uҤĐf]l\-Qgř8ZS˱7 }MR^{iFĄ̯W{o>'={Pҕw2ݴV0 2rٿ4»0|zԾa,ply.vջ>ߨ;/gxGgpx_8w)! ^o5&ӆL7[r|o; %3d N$ldH3,h풴ƔCKDbIZָ6hw$KH"BbIiH֭ۖ0I 'DQXuGXh@L_n&`O¾m/Q|?D _F >[__mpAFǢuUp*ȭC2;.(R|ak& cM-ǗdB;cu4V1~v_1uJO58]^o@$ь`ד71`.t߻^/u{ƦF"eWvvl.w<:c;m4c ĉl*DTDa$XW39)&3 d6.uI&r\}5eڴ՗)ھsם3vr!ՇjqIgdPۋh`tfx?珕t#[:f6sϘԬ3yVfՊV*i!ޙp¤I-N˘scDΟH=jgr ˜qla A؏^|~v0db6eTLA{iK;&uWū/{JfU3}Eǎ Ⴓ2c\"_&mh٤)~2U[rH7p`w͟~Λ-VΏ;ػK:\̙LB"Y,Hɽ=y2ª\w&G*FիomM%H~3e@rqs9{T! %a P_=I:%fHξ*VkYȯٟHG%MG(!76M t>-OFzËt,䲳~wԴm'̺W>2v~F<.OdG.6upʐdvmbV HtwyQ.EFj쫐OQuΟ+-Sbز[|q*V~đ̜}#KZ9|wyc>BɺuK}rM8‚8}K)9N|:kPYSOȑ>}0:*=ν4]Bv~(Nidb+ly0\{I|Zv=v!յIJV 'iB_2?iढ़,E[z]yI !5j:㹤:yj_||,rg/ ev}{)0b㛺NN֟mtv V1}TOJ[uW2da5obx)qõٿ B&Sj)jY>޷CXmd.b1K\r%ݲO-r9T¡D!ԲoY]w?ȗc?O8Θ%h1 %eÑM5g&N7 pʎ3fQSS?>Ĝլ\GÞOp ΠdlJRxj:Lc,VbNXz*w@mÈ6S*Vߞr6 I3gőFU1Rb1b nQ9NC[ߦ0bt= AU}jj&hijꩴꩦf+rzT3G5{VUIvj%`V.D 8ple" IIu(f9zm Ⴟ(/ԉ~pA$`~ܓvQ6  $|௎- `r *(.ܥH}+Q>>U=6nPMlKdZEAܸb&'J}n7MtJ. l$` 6phKZMd@ H2 M!3B:i֍qщR$AK;iK#J1jJі&$aIF CY)4AV70l"ҤAKC[sV 67:4;dmoS7NVMK{wRZJ9d)(彩sBp/N%qxvKVd]D_7ޢ[c%{ӠFYX+wΜX|+ LS'+1B,]ğg=.78Rۛhj(G{8JFe͗tFRt8@M]SYrʳJ#Ǫ/e>[̨{~sόJ2j`UZS&1g2NRZAA؁r$IAvɮIQY cSM8}*^GrXzGGl[k Ou̲vyj7~o&\U_o';| e۶]e)l5BO `T9 *GD zN$L J;h% o٫6$zW J n=/,`?)}'-::h[&$]B(ۅJ+pCMXk01/ `li&m̍QL] 8R(\qHtR qj^;v0aftK.8z3;Af s$L#%DCLp=22('+oNE`^a6!^Cl:$ʉ'S70wX]5x/`D6O]M7el[#-"ԭ* g"Lv9Miv ڋE 4Q6,2} {G 94n+l|ߢ5`0$8:((mE ڪ[ҷA9=$LIz$))JQ-A{LQAk\$YHZ It.S H^xՄo_b7_nh _|@e G(E+-H?X^'ݝ($u|+Dsвξ}n%-Q[G5޸>ɝaDEu']WN^Fϓ~v˨#+%6F#A FX^\* vS D f{qA]O9*hvoN0]p,xcݸb6*9“O VyGC f~L/G։}yJu P:&Zjw֯ <(9F:\>,*W2!^_Sx5/ ÐDo6Am4t@S't:tt%VJ0/)٠ AF҃L',f{I2yĻW/Z[?W/S|NcI Osfpi쫋xAyֿ+^ypV6^T1qO }9uf?}C% ֽ|zq,RaӺ9>w XoO1 2 3 iA4l$0H7%{y{pˏ[W&dlh hWjz oQCAvP"#$U$5Id4.4l(Pp$8<pJ@K2a@T@۠.+.(QoP@p@טrPK%4 S  }u#Z+J-#@gs+54Nx론^ (cv8䓂6aP~*I@Vnhq(bK};,z˘CGT.QsT#9%c.mceq0m\ӱ1!nm.䏫00T_AƆ25}`Sm1䡅e^0B$nfjQ@`w$j"BqUEBJ,IܖPRZBҶ݉'=sΞ7`Ǝt۴69DD\1]Y9NȞR6%VVX'Y)+:;TWt:lzgA,favc]"/"6<Mdt#f>z1^~sPI˒ŌqGAeOҼb!kq?MNVȖt^*`s+Gdũ9Tl%R g3I9lݺ)餏gFg_sdHo8渹.dA{: F% 7Yň/mtƓyvND叒h[N+vVFQP SKNr˒hh*)\u|`mlhECG&/O k6˟%3z_-e?p(z:Eۛafnիɘ>H!= e!{NJ$^Pdei6|:pg]ݿ꿾[_1!/{/EC{zV&ϼ3'K(Hk.O!=9`Ln-GظyO=1qOsy4I\pb;ͲeZx_*0xs0`]䕌U@{oi^xY+Ί08'SO\)C{q/vêU,({ɓ9Hkpl5Vy9gLbfNg5Ioo:Sg??̆#mY7nC.-,c”~xa@}'f'S[#g^˧wa1Φpl!fĮUzk C"UA~wP.џ-u`(~}yapƄ,^ i[CHZ^Yׯ!)1-o0fbj`5̙2 !jt12{[= WWX97ҾlLc,3ƧWHTlRIYd*}/^GuOVy_s8 I9^}};PU~'Q? {Չg64,{ϓ}0-k{W󇓧0c|\6*iijX{5z`R{pBzqAK?g+㛏_aʉ's̚ϒg?kG^L IDATL0w%q0{yvsdJ69ĺ9Wm%q:3:'NPXX8"Sjd,Z,ⴴ16YҦG@%WٶC{ ZQ#H1eH@Q ~ZNԎ+[ d8B_P C]0kRCJڊKOD8*DjYQ15|Ib"!h%.уGXn]VD G %ݦQR}n{)}ҍy8m*6n 붣Z)brI$H&.;؍m:`Me jY@(VjE"!CrdBN5Y80|AmԻF}Q JݑH[b:`@$UZX$HL77S@KYv ՘cֈbv)pWLI}g#N&qte3-7Έ^qRqZ=bZ0_ vg;;Y?BUCiL+yiB'9,۲֒"*9Q8f<}˒Ϧkٌ֬,(@q17=BW+'(H7_ 8/16b#:^iRsU6:zj޷ko~z ]AR* ;YC3A2/͕AyE>n8ܟu=i+^7kO89Aaf'B|H3ྒNɾIZIk +$(L OUfq9S1o*k0;k oWT)nuńJ"7tya7)"awvcq5+F@"0A~%l MrT[oBUJ*cd! Kva"gaHxj+WM n`;B՝n[щؾ"Bۂ'YhOQ';x}nk QoTzzjDvuGc;r7D'#mk,o]fwێku_;Me]V;#EYtg&@ bYc  ;3e9 BӤ&5/Hlf_`H-j R,Pbc5* 0>kYctcr3gI)d[nP3,#bk/ ?4`䎦u9pڨ2Ϣd6U@O! r}E v^{"2;4耴%LSлpႾGӽ@c P?k9>&.WNf p5 㾊@}&a8:JsP 7 W= W3q0ENk ~N$BQ77sˊWHS$^̐8v_%AdC O~Im! R; ͂t ҥCpH Ԑ Œu11;-2E}4ևذ+qYz>⸳B398gMXfG3izoж!H%,v>ByK_ފ9f!93?~<-Gb޼y3#-1+Ck'3y KAߛ)Z/~Ǧq .O@Z<sN>A|]v=i.?ۗÀ`g2׍Wgx -;(a<'>Ck'EouOܼ˲T$IP dPsĄ`Q%H`@$첰杙GU̪|S] OWY ~{os5j3gΤoTVz*ٝ _~KY3 6Ͻlhyx07"O_5gp3pVv=0$.>n/0T]X)3cdu1`&t*ϡG }~(y^yJHVp5\Е+WH74G/m+Ѯu[ϟ¶\Z%Թ) o_UK86k9ҋqyn^z}aLdKINajZkYpaEۀiϦ~t6 ӿum[LUեg _/\3esr\ASJ\Òw[_Ҩ~{9lʴt]E|=?N˶IײUw ؔP{諾޷ڟ˘kix>~BgFzW-#н<6ftUC|e?,?M~-n|֬2OWz*KLlzs 5=g3ͤɶ:е1iS5E*09 2iy>lVo++ Tr2_RqJ 9~,*"6g,NPfpHRUlH8)P˦a S+ey `^%in^Y$$ NsZ喊H !O/v1m`Bx~K("`ԹKi9)ToK b e$RJ7Xչ5S⁆nSIkiSu|cRMK܀͑HZ 0"D(> Ra`3Vt\U9:{oŤ[=߮A!TsK>]^H:8R&[ѯs>rm? ~b^d'n+{?#Go;xD笀#@&@ !1",](R u~MJYETeTzj Z4?}:%mMI]"O枑8&zaQ[Rh;NEqlf96gՐLk_,,֣Ž`" ^us]v9~Dt}k;%8-amź</LӻɊe]#ANsP ^祓a^iͮ1y3O_[ؖ5v!.m}[9l9L:#4m}4m_]{y֮YΌ2b|3P"Z6A1bcd&V|yTLTN40%-ÒaIOs+*H CewGCIoyn^y -q/.4S9$Kխp5Y74]+h54z,R$qYj>^zWH//]΁:Mmw|`R_Ty~~=dfsWog.6? C/(fQf0e?d$'dmfסdY_V=ſkfq\YFs9Sؔ`"x=MRbX,-JpC-rGsl<2E@]>~>)k{ a  *uXQ 3%A(-+6a*ej1>Nm~UB>A( ۂd U(*ZVI8SЃo5ns~? 8TG ># `V XV.0TP`] @4cq`TJVGPS_[0 f?~7_u_h+Z; zϋ {#KcqeE)%u:=$0O&$m5P5~j@H׍Ogr"13رy5yNqWzQ5k0+?W;?=􏏽oY2n}fR+q(~\_V Ϡ:J9˦s_кN>+U{\fx:]ǠY Álz2RDPD_ ڽQ_G.*4rKl9$Y-0tkU3dHBR+ IT+QDк @I9쮀Mr JVg'G=t1 X!( Iba8aHяA=2l8q'f!&vTlj~K RBjMe50}p0QGBu1IUJj d,E=B-~x`T Vkk##uȊDpV{RFb֮Q Ǵ7fDUVTk.4l}4 9wLxI?.PV?,DǶA+d(AW#>ۜ|;y/n[!\5qR|7۾;URut~v4O*EW|3Mߕڽr;}3cȲehخ'U^&wI$}& b<).iQFڍYj7{ ]qԧIo՘;{vf1|1ȒB[>| dTz_&=};FpGc^7O@<^xSGpԗ>(.KQV&pcJct';竮uocI(2ȭEѳbX[G}1\=mc\,_둷`ԩLỉUݯ6p|2=<‰cL涾ۨq0^ްW'3aPr`)xs̥{+:M[źi -Z3%XB(u !5CIU&tD{X/^_bٌs m(-\vR$ ɺfmnˊio1jմM#?_0U/<3.eS#nnvn}_~_t?DTmҞ-/a⡋/ӐR;esi0I0g .5$6=#eVp3ܟs'^FV!o66f!Yڄ UVB\@DAm,c6T S9Edz,㡀J /!sD;JQ})\FDPKZ3jؖjﺻŢ:0%K|"iSH}˭K0A3N IDAT!8긦VIGچT x0`r HB PZ§|H֊9/,4>t{NX;/kQ@e|}\Ŷ'd#$\(vACzj_C?\;kڢV%yF:^ ڍC_ĸ{wn^w_Auܲc`ȇik{k$h=Gt $*cBS6!]8wk*%cͩPeK5'85ohW OM+$VsC[s9oSR:<ӦQHru43^IlHla07|fJTjN3b~?(TSUQm'&Tyx(4:$IhSYM!l%oDjsܟQv\%86wp ϱUz$%E.wP@z,py ąNLj41ɱ☋w;o|ڷc\t<Sq5H MIb8 @F%$/N!$QPOA-w8DNl+d!Aq S*EP7Wc#MGO1')nL%-sI},fR;eT%'¢w7e\^_vzRR༬ *yLa_-kQǗL=b z59ѶI ONχmؙЩ4} <>7>O=4-9uI6_/ubwԫ/@#S:~8@@a51a+` PCP%(cʎ^MR3PkϾֈanpH }!l5S'|ތ3$ dB@`yE=шk3T|R%m)- ~}Ckǫb#TS/M3*`=`+syT>ѪW@3Tl\Չ4/~uL!Ah |& hؕq;St7! ]ܖ V:e|ߵ{&ATWz_ȥn-DžPנ%~}$Ccnz k0 ݉?2 zA_7x0NNvuDa[rp)nk9^FY*t׮;e*A0&ɦ$ՔA''N Orɷ\>Ry)}z-/|`;ѿv~o9f~|Y\Dɑ9{Owe??%OW3kw-ڝ;'}XsZ]|gfPŚ"ٹXN19Rf=j )ֵMFHd%GydNwij OKAedŔ-!@TjmHIAQi(.! ;R)MME U& AY%>']&10T3$D9kv"$)K26j`DRe ݱߘ#8*mpԣQX@%.nDB_ z\5jrI).x |R?V_[]V_3aǞ%Q$9qF]JR % RYe J#'KKmӃK *%y1,4I5 'KTnb(7XRгtɗ,4lneqY3f +(l8*˗~מ̟劌/ư3` \IUvoNi4b}8xkF\ ΰ|_]Z ̈ws)^gHSD{/]Ǘ"/W0WS*S涢^-x$Hg墩$㶱3坫=]qe]}V.UŞzu94-G|[L}d2~V;֑84W+YU;ngg|MVZ&Ͻ]Ⱦvd*MTrV4H+i q/`ͼ4#5浛fGIdQY=^(1"Y~"ϔ9;n~Ѐ_a83)//+sO0 \ؑIu;"v;|yf.`ͪiծQ+''aafZY1YjR޹Rߙl7?)z(`26NrXv4SO=řԖz6B=xhq7 usf~Lٞ'#λ39STgذ;qwF6Myo⻕ƤR*Cغ \l˧<R3.$ԡfkT]t߮< y\:ef xٜ ؿh6*d9mtp״q i䮋㮷ws]1/Q26A=_2%<8|"BeuV-~.dsxڰY?y`3^t__>o̼9_};]#SG (vU%KV)i(Rs_;>/PxW|Cʜ9s)1kLugd=~5e;w ]>&ëQt?D 7+';,gfާ\tYWڔ۰f_EA) J$7ip>)yd M-w3 4C]ɾϪn>h1ӧrEIQ3꿳CG6||m2%ITegSkЁw1zTs2c _̴/2)r(TS(9 id_駟KIˇŋe0=oq sMo3xtj4έpEwMF62,ٲ:A؀=NXV+Yɲ8}XвK k)."}‹'MSjTv +k܃ h/PЂ[fJmGPJ-7 l%јAZP-@8AK.kHob K!9XO' )9JTQr]|?8dCa a8Ŕ3#JN|͎xmPמSׯz>rnsgqO .P-@VMzR%A ,IQoX(7}.qXz+)%nGD *NQS.!?$aHOlym:=¨+$'MiRæAs;Jbѓg97,Cٻs5Z9l57%OɈ,7wkW?k)haWoL7|s=wҦb'u-_`"ݛɢ/vI%w`5H$VM.,giM(.?BȂ=sz[,dPT a;pJ@Z~z')8Ѷ6{pFR3աiE^CT= G@ӡN >v?7t$qׯE0^D$+`X[(T#$B'EΒiVCt~kq?uw輭ۯˡ )T#i ,_eJT+- @ 0=GXζkZW)}Wݔ cRVǏ:tMˁT6F&\ ċ l0lU)Q6juk{u]e0l)T"5͓\*]?1>oJnkU1& ׆Gmzc OE &p+n6㧴(df`F$cZ89(#ť<0hɛm$z)x%2 ۼ_ƖAEҾw!Z i">$wv M'ѮOΰ DuqeCR /`Z n0h.±J2l@{];iT ukg\~eү?;Xgҽ~)?fzӨa+3j ~Xa?)`SeCe4a!`PD‚_  #=@*Ӕl R@pLo`W7Ԉ<9dtv.CtMHzLzCn#kT֠{>i(k $&e=`Kxqv[B[*XRQ& N,Bt_Sm{`IՔD'IFy+,+6Nކ2x #5Z`@Di GG`W3IP: }]P &'#R9k_`E?)}T }y `ӀT$>AsCUWo,J,t[\. $A CX4{p׈8[M? ɡ A}14~BUT*IiQ +Cb1eICe}(crD''[ֹMsn7 P^>.JN,g_.{[쟭+?*/?⇘L9(ps_=M9k6}9{_!fPzjÞϼO&cRIïVZ La5;.8YYƒRIp& l7ȋXh`4 Y6=w&{NM ;cjBb Pn ¶Rg${[6g ز^S'LTu B{j=x`wB}^^=Yr.zܷlp04$>` TЖ)q)fqQh  ԘH@l=a !K:WMfښ% ! ڕc 7tm=&ZDT8`,e*IqJ8bJrPr$"I9#IA~0 łsp 69Ynr0nP;IpT©"|m2mj$wːz55ͲΒfałN5FM~?RSiٖ!bZ )bΒ%KyN.IӫpM tlۿ{/]GNd$k4|+*~uJO,o .2LWO]ٜ!kpT'~ ɿ[`P~oUZШI3ft;ͫN$sibWވF P6+c崇&ӮSo{׮bsY}1!I^/k9~eiQZ Ҹ쳹swU g`69{;S/`Ԩ1<"Z.`[L¤zRk{dlYJvm9]Y].Z2N~jb ʻ$ "&O< 2G痐a2?V w7wokR.ͬkȑq+Ev~vq2%\!Ss%}hWvC t7=8ƺ-QZgРy,ˣM)/!|mҴ*ƛG{r%fTX`Fdfu(28]o&;ِ`ͱl9-y爕..ѨyGVJrxQ1Yxvf?ljO?of3b_1<& :hrv]dg!rM1L4+hոE?Iz[u+v,gl.,%Nnt_|9q_< @Wr /ό׿_yF>}z~Y# Y8λXbTo"o4 _|CKٰh I:)AR6|:4.gEdƒh7-Z NQh5Q0ƽ $;랉0 7GV=!F*^fYŨ#o8gIܺ=s('/bw0_2y ƱcuF>_)^˜MG(?c}BǎmykdH'M;pqANspO>|PkCɁ ӷUvbҤtٜ)UgMmόw ;Z>CNr)].I:o|1UL[޵'VH.: fubTT9-Mc~0o ~+r8+j!=؏%啒2UrQr4eX1_Tq$: cB$JHܻ)9%VS@JU9m!'t- t\b9ű"K>{|hL*" S9xֿRJOl8J&{=}D ؎jsF1='7 6P.m>L A`wp|"(I'{/޶kGJ L>6xێ#)PbbC$!$%a!mKuՍEuV FuUR&W @Njhw. .Q#/c'Ak\cݱE\#d4$![AI IHGv^һV*TNAMmlBJ@$AjHu|Lrݥ'#aaS?l$ݢ~EfM쎼zNōk4.>VDd+|ֳpU[_z \ycFw}9␤:4O ~qScS!wsTnM2*q8E IDAT;o7Ud^.G;oM{ksy<).]?gyY"xmڿ?.[J/¶õ_ M|\9MMvIצ,?:\Ya٣4ʒ-i%I undoӕ I_(CH@MCu60>X;u,+>Wts#>D~:W9Xx)?dhʣm%^~1T@'ܯ$Jcܤ &@>}:;<9k>OzSy'ID\GEAm!)HCt1"Kr1[HO,$D}|BD_Y`‰tFDBֵʟ{}By `4k'& TIRG_c@YAq 8niۤv+*#Ʋ7 6ێekUTb?S-H_O§rrvlMpn̡1&w0F=x{U͓+ؕ+j#!ZV'WK؟vIYQB;HֽPh/̩x>5C(*eΌOeݲ޽ OݳO`죝`sr(*3 "` KOO{YB>-|%[,^_l3[u~o$UQE :''܀Ye/懃$WRsY}' 2WlDJÞTYi44AVAF = -E$d_X AMwZ#Zƒz[mt`$&JPH"@AsBGB3n$NQ@ˆD'$;-'/:m׋o&| uUSĭ=&*(vA ןP/eN=_@Z3oogV&YEu4JGR;^@o 4ch'UVj)/P䀁 nA;ƃίRގJ m[وF-ј(+lG1O>]jeZk]?@`H}*`O=3$zY(:sL hm.0v3lyo?+U|trv|s%-麌QK=ӏ!}PGB-Te@$Ke$DlK) 8Q ).+#cA ^쳘^چ=c^9:[=2 gO,k֬)Y5V{&t?||/]Q?9~R}W9yʇ)MDJID9]C%}o" dHvtСA/ggp"賣3l8{ YΒq c˖-y֬\Q/9pN&(Kgb.l°Ιl-vX>`=D/1:M#-RWdVy= Fۥ|I%[ʁJ8z1vn;a즮wK:uz7l+qM1z %$BB $H$t ).qý{ƞ>s}[:g {ϕYG:::iֻ>k0m\)FxYMM]QA[AAK`T?–dm546 IqK\IvXmZ%uԪ2 CnX R[RKB[JK@2 "AARc)]tI DH%ThR BW82}:bxC49t&)|j3N9hJVρ&=3ܴ/{rXwJQRkGHL;ɥU=C} z4;F=c쨜錁LM8u~> ɔPdS:r̀zڎn=ck7c\enK+rvu\.~r躹b2^{u)HOA<%+T$ēxBm'ճ $E"CP4( ?$ rBP5s8YB_|{x,ڸ!  d rBA^TedG BAeדm-ZR)Wl=&?jtorXR\$s% W÷Ý#hԲz;5;N^pޥzeL-8dL!> F~8u s2Ў%1a)$DiƁVhf+y*M*gNf^lس^_zo#AMoyםOM5hš1Xƫ1&,OQ1Ŋ-jZL\kr۔,**]йH9j`G5l=$w Z '}r`P_.sY숩ZGMӕ  M *X\Vt7ZĔ^[lv4~)9U{ :7F. WՑFFC?0ۿ/M> f H}yt_q,m+v:-Bl"c{i\2  j<>~14znjJm4vDmm:Z#wbNl6Ẏzd*5^ZEuk- ΅Ey"b58u%`GmKӡ{9m;REy&U!h rC ؅@SZ ՖA}13z) e@ =ص,6`*-V8͂pP)Uct;'8%Mqi1?_9P-3 OooH}yJ@lIj%uJ;n_jp@D:X@Ֆ3 ~zS^K0?2+1j!%4;&G_ |mIKRҚtS*XVwsINjOmA}7~E~ctbT)G+)G*U]>dF{)~o8A2!:H{Y TCR](ҋvN]=?Bx:t FZW cTR;hSNJRPk;`?#V( H47ui>b'\B$7qרL} 7)G-Z44ZF-8Q#;wq SQA,`V,P{TR|sGf.vIQd'Y؋coF0҉|lܸ7-b`/7I6n%Fn4@qD+}r{ NȶUd3"a@sjwcj fEnه&3oJwƬشKySCG8U5 Ao Ms@v!x,\y;w?Sc;r|A*Hu彵end!(fKѱٶٰ?~8YᅪӴz^?u0o~#[l2ƌ;Q#Na~mfwqF:^rKӁٵN`KD?8sXF[ n C,57<|c71_1}Y'>|ce|3Sn-g]G݂S kb¥ptdء?^qy$#+b2\DeK8q&}{ߙ):oJna`p迯kvˣh:#Y ۋ%{{8# IDATLh{a(ew͆%0du ,("iK玢%#9*mio@ lYvSau;.OP D: :pXXx,WO,_M \wz RhGmȫdeͪl> wWNb8ݚ9Sxesl;Dqm:"Hu> ɵk3Dt2 _⸛V[h:N}N]Ń@@@_T LK5(/Q 3ީ{W2#' {=сW~+?b?t3ap}ib9:cLهhl(@1;tȇ?zë'yoۂqh![Q"s9uIm˯!<3.M<]? 8Ǝ}ͤ?5/oi_X Q 4Tn sq A[ҧ.$Ig+y*Sc;[6oo٩Sؙ+&qQ¹1eΊ-$>Y"alA+VC}_7PQ]걍>r`Ʌ'nCqPСؠ@9ْ eAvX5ȋg 0"( 0Ri7*iկ}HLUXA꜓|lґ"CL+QuI! z P^t0 af8js~#ү=(A_^B(Dt3XݞX(%{IC@@mo ue_ӀR{@:4Μ;-7,˄޵􀮭A]v57>^8=Wa#k.AP+?!IQXRgI $QIne-$ NNRS#(O1;=)Uz "aW$pmTq k;}CGR{ꎂ Qۥ( K$\\ꏹ5%py׈ ThEزRu,Ze7 ,u Aѩ8DN(̮zZKMQq)Bl5h_r!sr)G3 Nӥ~5㴉7b6S%C]PNd^1^?Wo0+Nalv}+׷3;O0w쳥9rpKȫ\MЬtm.cby:I^` ;VͧM_1v/aU 9]7׸r8ԝg\ʤS4/xmLq\0j d|:vJ}߹ΙSpz̼c,]9WkX7J{Jwfoj,gBYs39|R76'Z쩁!?CWȟc^NU<ȑ=h5z O=FiY%fƮ.u䋝<4ccd2;HlkH]l]N/hiRuLFjlixuB.gOe,|s52ojJG}yvV>]lz6sdbKh32sYA?Ţ1ٙ48?qi$ɩ?iOa]G$`֜ u]byu4l!XWxɶcq$Y$eA3{y"̞an6ŒJx?7 M,okB<ƾ=rR&N(vH_öb7f[=5aʁ~!D@S&Q|ݻz3SJ,.28`wű|<ɻIvZ` [IlNr)nŤeB&'_qyWp`\:"G fWgſԻ;^ѽKزi/kl'ŪSiW,|{|j1.4@6⡇bٲe,[cq57_0Ǩ9,=qhX;qaCٻg7v.Gۈof|x-Aim#4RCL 9)DzQNQFl!q)rl>y 9ȖLeI}/Xq4?N$yfmoFpb8oR~R36}t?{ubkV=9궳Q#TS2.+(ُrWXt 0kx"tˊ0SV3^=:?N¥#5AkLEÐp$)G֘TU?4 + pRAb.3 PsR:%T֠p@)C{AfCۻ) eksZYi_ۻwοfn(,9'EE]WZ"!6m*0<1ozqJ˚FnBn`¿0_/6o_l,>|MeKO*[ٷ33Ee`B>(FEAsO4CP|_m`M^Ea^!^*hqpB!T6K7J%NBR!pѩ|1!!M_ej<g<35=t<)|Q)\`_+ӳ% aƖa0CtLpFOh~z#tf,/p H?j}H@* k.`o9h^nb3?ce#VP6ݷy XW߇"3I)qƉ +SW*M NrӀX 𹜯AMqǖ'd) ^'L)ւpi _?uٮC$gGe6T+f2DSג?&-Oaw$㿜;2BWNU};Vsp^}^s)iSߖbk1}Dp "8i 4鎽E}B&ńfcITr }3 NbRS.XT)36)"s 6pWh%̼^`0( :jD,,Z(jPH:U~?} @Z6 r.Z mHeBY[)yMU$"Ae֯^;zKyEIEƕu?JFH_ jd RG:h:4pU_I,!tdk=KFkP麿IG5NiU3& atgbIL7fk^ 5j&X"oƺWJgd4,1t"|E#_21 <36wRg|m~S^OCݜR5LH[@vِBIPH"$].9.ͅ. !h"8 K lk(`Avs^ϙS+U++?9TK4XE\ÕYt,rA3#"]5.)KrY;./ɖ>s6mٽK䞡L<{1\vBQVt ;ѱlwp4.dy1}:\q:.bb]#n#׌o)=~'ιO~3g*4uޭI4}b!Ffk8k!-Hc N#MO)$! S:;z/R 4Ѓ~= *uN@H¦AĀNl 򪦓dT2bS kׅ7#L9'A@?^?X*:Ueak-y;3{VS5O{f>QL"Rx1e/\1 R@J7 V;c3(*X%=,45˰tƇ ml 3'K 'kdn~11T TiVҳkKPϠ{НqRQF;({R!eOFm"^t!dO͆G3$r9 RHBr%AC`v SDoB0IK$3\LNƌ/ճz؆pv#S걈@8#WcRhʠsN)lrH bUv) .a@$qꤤc[wp G㰩F/.Y-)t\] #.KUPCK!Iwo $CC,^(5x;aa: C8)9߰a3[ѧ(c{_>4{-J]Jn/Ave9_|QWzZfm╟{m7b~~qSzKQ˖οhON:',ny`}ܰ9h :$4Š$TMn]Jv#|}>? f=O+`qR|χm,~B{o7^cv>ü>/ƘKyD+xC젴a9MT5ԂH}M9t|Y~o ,˛뚔ye׼1o)Jk-{^ 3fE;䣔ôY;Qϙ3`.LSl&#IxOxA w?y΋ϿH_^1cuܑtRus`"?qGAgo,;˟cUƤ_`t/,X̵w%>W;/H2oYeYJsMvN + W˿f0Q$'S^ɱ㊫^#xц:RQ5ڵIJ[LaWĢ :tp)a^+s{Pz:$0)YIK4E0N"Q&d.-.f b1p G`sxd]6cuexfa6#gq/ U \{_tjmc兒$/-tlø6'?!ډ> 9eXyI҆P>Rp46!r;H CȊ풛^mc%;-%NSbp9p0,m#VűrKy ;୧Az儙=uWPGműmS%4XW=Gn(׳ydʐ:$W\:;r