pax_global_header00006660000000000000000000000064134174754630014530gustar00rootroot0000000000000052 comment=fb05ff0cf77a5861f49a666adaab93dc67537670 mu-editor-1.0.2+dfsg/000077500000000000000000000000001341747546300143545ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/.coveragerc000066400000000000000000000000721341747546300164740ustar00rootroot00000000000000[run] omit = mu/contrib/*, mu/mu-debug.py, mu/__main__.py mu-editor-1.0.2+dfsg/AUTHORS.rst000066400000000000000000000017251341747546300162400ustar00rootroot00000000000000Mu's Developers =============== Mu was created and `mostly written by `_ Nicholas H.Tollervey (ntoll@ntoll.org). Some of Nicholas's work has been `magnificently supported `_ by the `Raspberry Pi Foundation `_. Happily, many people have volunteered wonderful and varied contributions to Mu. These include (but are not limited to): * Tim Golden (mail@timgolden.me.uk) * Peter Inglesby * Carlos Pereira Atencio (carlosperate@embeddedlog.com) * Nick Sarbicki (nick.a.sarbicki@gmail.com) * Kushal Das (mail@kushaldas.in) * Tibs / Tony Ibbs (tibs@tonyibbs.co.uk) * Zander Brown * Alistair Broomhead (alistair.broomhead@gmail.com) * Frank Morton (fmorton@mac.com) We welcome contributions from anyone! Please see :doc:`contributing` for more information. If you have made a contribution to Mu and would like to be recognised, please feel to add yourself to the list above. mu-editor-1.0.2+dfsg/CHANGES.rst000066400000000000000000000347221341747546300161660ustar00rootroot00000000000000Release History --------------- 1.0.2 ===== Another bugfix and translation release. No new features were added. Unless there are show-stoppers, the next release will be 1.1 with new features. * Updated OSX to macOS, as per Apple's usage of the terms. Thanks Craig Steele. * Updates and improvements to the Chinese translation. Thank John Guan. * Improved locale detection on macOS. Many thanks to Tiago Montes. * Cosmetic stripping of trailing spaces on save. Thanks to Tim Golden. * Update PyQt version so pip installed Mu works with Python 3.5. Thanks to Carlos Pereira Atencio. * Fix incorrect setting of dataTerminalReady flag. Thanks to GitHub user @wu6692776. * Spanish language improvements and fixes by Juan Biondi, @yeyeto2788 and Carlos Pereira Atencio. * Improvements and fixes to the German translation by Eberhard Fahle. * Fix encoding bug on Windows which caused crashes and lost files. Many thanks to Tim Golden for this work. * Keyboard focus loss when closing REPL is now fixed. Thanks again Tim Golden. * More devices for Adafruit mode along with a capability to work with future devices which have the Adafruit vendor ID. Thanks to Limor Friend for this contribution. * Fix a bug introduced in 1.0.1 where output from a child Python process was being truncated. * Fix an off-by-one error when reading bytes from UART on MicroPython devices. * Ensure zoom is consistent and remembered between panes and sessions. * Ensure mu_code and/or current directory of current script are on Python path in Mu installed from the installer on Windows. Thanks to Tim Golden and Tim McCurrach for helping to test the fix. * Added Argon, Boron and Xenon boards to Adafruit mode since they're also supported by Adafruit's CircuitPython. * The directory used to start a load/save dialog is either what the user last selected, the current directory of the current file or the mode's working directory (in order of precedence). This is reset when the mode is changed. * Various minor typo and bug fixes. 1.0.1 ===== This is a bugfix and new translation release. No new features were added. The next release will be 1.1.0 with some new features. * Added a German translation by René Raab. * Added various new Adafruit boards, thanks Limor! * Added a Vietnamese translation by GitHub user @doanminhdang. * Fix bug in MicroPython REPL when dealing with colour escape sequences, thanks Martin Dybdal of Coding Pirates! Arrr. * Ensured anyone trying to setup on an incompatible version of Python is given a friendly message explaining the problem. Thanks to the hugely talented René Dudfield for migrating this helpful function from PyGame! * Added a Brasilian translation by Marco A L Barbosa. * Added missing API docs for PyGameZero. Thanks to Justin Riley. * Added a Swedish translation by Filip Korling. * Fixes to various metadata configuration entries by Nick Morrott. * Updated to a revised Chinese translation. Thanks to John Guan. * Added the Mappa MUndi (roadmap) to the developer documentation. * Added a Polish translation by Filip Kłębczyk. * Fixes and enhancements to the UI to aid dyslexic users by Tim McCurrach. * Updated to version 1.0.0.final for MicroPython on the BBC micro:bit. Many thanks to Damien George of the MicroPython project for his amazing work. * Many other minor bugs caught and fixed by the likes of Zander and Carlos! 1.0.0 ===== * Fix for font related issues in OSX Mojave. Thanks to Steve Stagg for spotting and fixing. * Fix for encoding issue encountered during code checking. Thanks to Tim Golden for a swift fix. * Fix for orphaned modal dialog. Thanks for spotting this Zander Brown. * Minor revisions to hot-key sequences to avoid duplications. All documented at https://codewith.mu/en/tutorials/1.0/shortcuts. * Update to latest version of uflash and MicroPython 1.0.0-rc.2 for micro:bit. * Updated to latest GuiZero in Windows installers. * Update third party API documentation used by QScintilla for code completion and call tips. Includes CircuitPython 3 and PyGame Zero 1.2. * Added swag related graphics to the repository (non-functional change). 1.0.0.rc.1 ========== * Various UI style clean ups to make sure the look of Mu is more consistent between platforms. Thanks to Zander Brown for this valuable work. * Added French translation of the user interface. Thanks to Gerald Quintana. * Added Japanese translation of the user interface. Thanks to @MinoruInachi. * Added Spanish translation of the user interface. Thanks to Carlos Pereira Atencio with help from Oier Echaniz. * Added Portuguese translation of the user interface. Thanks to Tiago Montes. * Fixed various edge cases relating to the new-style flashing of micro:bits. * Fixed off-by-one error in the visual debugger highlighting of code (caused by Windows newlines not correctly handled). * Fixed shadow module related problem relating to Adafruit mode. It's now possible to save "code.py" files onto boards. * Updated to latest version of uflash and MicroPython 1.0.0-rc.1 for micro:bit. * Various minor bugs and niggles have been fixed. 1.0.0.beta.17 ============= * Update to the latest version of uflash with the latest version of MicroPython for the BBC micro:bit. * Change flashing the BBC micro:bit to become more efficient (based on the copying of files to the boards small "fake" filesystem, rather than re-flashing the whole device in one go). * Ensure user agrees to GPL3 license when installing on OSX. * Fix Windows "make" file to correctly report errors thanks to Tim Golden. * The debugger in Python mode now correctly handles user-generated exceptions. * The debugger in Python mode updates the stack when no breakpoints are set. * Major update of the OSX based automated build system. * Modal dialog boxes should behave better on GTK based desktops thanks to Zander Brown. * Right click to access context menu in file panes in micro:bit mode so local files can be opened in Mu. * Fix bug where REPL, Files and Plotter buttons got into a bad state on mode change. * Update to use PyQt 5.11. * On save, check for shadow modules (i.e. user's are not allowed to save code whose filename would override an existing module name). * Automatic comment toggling via Ctrl-K shortcut. * A simple find and replace diaolog is now available via the Ctrl-F shortcut. * Various minor bugs and niggles have been squashed. 1.0.0.beta.16 ============= * Updated flashing in micro:bit mode so it is more robust and doesn't block on Windows. Thank you to Carlos Pereira Atencio for issue #350 and the polite reminder. * Updated the mu-debug runner so if the required filename for the target isn't passed into the command, a helpful message is displayed to the user. * Developer documentation updates. * Updated to the latest version of uflash, which contains the latest stable release of MicroPython for the micro:bit. Many thanks to Damien George for all his continuing hard work on MicroPython for the micro:bit. * Inclusion of tkinter, turtle, gpiozero, guizero, pigpio, pillow and requests libraries as built-in modules. * Update to latest version of Pygame Zero. * Fix plotter axis label bug which wouldn't display numbers if value was a float. * Separate session and settings into two different files. Session includes user defined changes to configuration whereas settings contains sys-admin-y configuration. * Update the CSS for the three themes so they display consistently on all supported platforms. Thanks to Zander Brown for his efforts on this. * Move the mode selection to the "Mode" button in the top left of the window. * Support for different encodings and default to UTF-8 where possible. Many thanks to Tim Golden for all the hard work on this rather involved fix. * Consistent end of line support on all platforms. Once again, many thanks to Tim Golden for his work on this difficult problem. * Use ``mu-editor`` instead of ``mu`` to launch the editor from the command line. * More sanity when dealing with cross platform paths and ensure filetypes are treated in a case insensitive manner. * Add support for minification of Python scripts to be flashed onto a micro:bit thanks to Zander Brown's nudatus module. * Clean up logging about device discovery (it's much less verbose). * Drag and drop files onto Mu to open them. Thanks to Zander Brown for this *really useful* feature. * The old logs dialog is now an admin dialog which allows users to inspect the logs, but also make various user defined configuration changes to Mu. * Plotter now works in Python 3 mode. * Fix problem in OSX with the ``mount`` command when detecting Circuit Python boards. Thanks to Frank Morton for finding and fixing this. * Add data flood avoidance to the plotter. * OSX automated packaging. Thanks to Russell Keith-Magee and the team at BeeWare for their invaluable help with this problematic task. * Refactoring and bug fixing of the visual debugger's user interface. Thank you to Martin O'Hanlon and Carlos Pereira Atencio for their invaluable bug reports and testing. * Various fixes to the way the UI and themes are displayed (crisper icons on HiDPI displays and various other fixes). Thanks to Steve Stagg for putting lipstick on the pig. ;-) * A huge number of minor bug fixes, UI clean-ups and simplifications. 1.0.0.beta.15 ============= * A new plotter works with CircuitPython and micro:bit modes. If you emit tuples of numbers via the serial connection (e.g. ``print((1, 2, 3))`` as three arbitrary values) over time these will be plotted as line graphs. Many thanks to Limor "ladyada" Fried for contributing code for this feature. * Major refactoring of how Mu interacts with connected MicroPython based boards in order to enable the plotter and REPL to work independently. * Mu has a new mode for Pygame Zero (version 1.1). Thanks to Dan Pope for Pygame Zero and Rene Dudfield for being Pygame maintainer. * It's now possible to run mu "python3 -m mu". Thanks to Cefn Hoile for the contribution. * Add support for pirkey Adafruit board. Thanks again Adafruit. * Updated all the dependencies to the latest upstream versions. * Various minor bug fixes and guards to make Mu more robust (although this will always be bugs!). 1.0.0.beta.14 ============= * Add new PythonProcessPanel to better handle interactions with child Python3 processes. Includes basic command history and command editing. * Move the old "run" functionality in Python3 mode into a new "Debug" button. * Create a new "Run" button in Python3 mode that uses the new PythonProcessPanel. * Automation of 32bit and 64bit Windows installers (thanks to Thomas Kluyver for his fantastic pynsist tool). * Add / revise developer documentation in light of changes above. * (All the changes mentioned above were supported by the Raspberry Pi Foundation -- Thank you!) * Update / add USB PIDs for Adafruit boards (thanks Adafruit for the heads up). * Minor cosmetic changes. * Additional test cases. 1.0.0.beta.13 ============= * Fix to solve problem when restoring CircuitPython session when device is not connected. * Fix to solve "data terminal ready" (DTR) problem when CircuitPython expects DTR to be set (and it isn't by default in Qt). * Added initial work on developer documentation found here: http://mu.rtfd.io/ * Updates to USB PIDs for Adafruit boards. * Added functionally equivalent "make.py" for Windows based developers. * Major refactor of the micro:bit related "files" UI pane: it no longer blocks the main UI thread. 1.0.0.beta.12 ============= * Update "save" related behaviour so "save as" pops up when the filename in the tab is double clicked. * Update the debugger so the process stops at the end of the run. * Ensure the current working directory for the REPL is set to mu_mode. * Add additional documentation about Raspberry Pi related API. * Update micro:bit runtime to lates MicroPython beta. * Make a start on developer documentation. 1.0.0.beta.11 ============= * Updated Python 3 REPL to make use of an out of process iPython kernel (to avoid problems with blocking Mu's UI). * Reverted Save related functionality to prior behaviour. * The "Save As" dialog for re-naming a file is launched when you click the filename in the tab associated with the code. 1.0.0.beta.10 ============= * Ensured "Save" button prompts user to confirm (or replace) the filename of an existing file. Allows Mu to have something like "Save As". * Updated to latest microfs library for working with the micro:bit's filesystem. * Fixed three code quality warnings found by https://lgtm.com/projects/g/mu-editor/mu/alerts/?mode=list * Updated API generation so the output is ordered (helps when diffing the generated files). * Updated Makefile to create Python packages/wheels and deploy to PyPI. * Explicit versions for packages found within install_requires in setup.py. * Minor documentation changes. 1.0.0.beta.9 ============ * Debian related packaging updates. * Fixed a problem relating to how Windows stops the debug runner. * Fixed a problem relating to how Windows paths are expressed that was stopping the debug runner from starting. 1.0.0.beta.8 ============ * Updated splash image to reflect trademark usage of logos. * Refactored the way the Python runner executes so that it drops into the Python shell when it completes. * The debug runner now reports when it has finished running a script. 1.0.0.beta.7 ============ * Update PyInstaller icons. * Fix some tests that fail on older version of Python 3. * Add scripts to extract API information from Adafruit and Python 3. * Add generated API documentation to Mu so autosuggest and call tips have data. * Ensure translation files are distributed. 1.0.0.beta.6 ============ * Pip installable. * Updated theme handling: day, night and high-contrast (as per user feedback). * Keyboard shortcuts. 1.0.0.beta.* ============ * Added modes to allow Mu to be a general Python editor. (Python3, Adafruit and micro:bit.) * Added simple visual debugger. * Added iPython based REPL for Python3 mode. * Many minor UI changes based on UX feedback. * Many bug fixes. 0.9.13 ====== * Add ability to change default Python directory in the settings file. Thanks to Zander Brown for the contribution. See #179. 0.9.12 ====== * Change the default Python directory from ``~/python`` to ``~/mu_code``. This fixes issue #126. * Add instructions for installing PyQt5 and QScintilla on Mac OS. * Update to latest version of uFlash. * Add highlighting of search mathes. * Check if the script produced is > 8k. * Use a settings file local to the Mu executable if available. * Fix bug with highlighting code errors in Windows. * Check to overwrite an existing file on the micro:bit FS. * Start changelog mu-editor-1.0.2+dfsg/CODE_OF_CONDUCT.rst000066400000000000000000000037251341747546300173720ustar00rootroot00000000000000Code of Conduct --------------- We expect contributors to follow the `Python Software Foundation's Code of Conduct `_, reproduced below. The Python community is made up of members from around the globe with a diverse set of skills, personalities, and experiences. It is through these differences that our community experiences great successes and continued growth. When you're working with members of the community, we encourage you to follow these guidelines which help steer our interactions and strive to keep Python a positive, successful, and growing community. A member of the Python community is: Open ++++ Members of the community are open to collaboration, whether it's on PEPs, patches, problems, or otherwise. We're receptive to constructive comment and criticism, as the experiences and skill sets of other members contribute to the whole of our efforts. We're accepting of all who wish to take part in our activities, fostering an environment where anyone can participate and everyone can make a difference. Considerate +++++++++++ Members of the community are considerate of their peers -- other Python users. We're thoughtful when addressing the efforts of others, keeping in mind that often times the labor was completed simply for the good of the community. We're attentive in our communications, whether in person or online, and we're tactful when approaching differing views. Respectful ++++++++++ Members of the community are respectful. We're respectful of others, their positions, their skills, their commitments, and their efforts. We're respectful of the volunteer efforts that permeate the Python community. We're respectful of the processes set forth in the community, and we work within them. When we disagree, we are courteous in raising our issues. Overall, we're good to each other. We contribute to this community not because we have to, but because we want to. If we remember that, these guidelines will come naturally. mu-editor-1.0.2+dfsg/CONTRIBUTING.rst000066400000000000000000000056121341747546300170210ustar00rootroot00000000000000Contributing to Mu ------------------ Hey! Many thanks for wanting to improve Mu. Contributions are welcome without prejudice from *anyone* irrespective of age, gender, religion, race or sexuality. If you're thinking, "but they don't mean me", *then we especially mean YOU*. Good quality code and engagement with respect, humour and intelligence wins every time. * If you're from a background which isn't well-represented in most geeky groups, get involved - *we want to help you make a difference*. * If you're from a background which *is* well-represented in most geeky groups, get involved - *we want your help making a difference*. * If you're worried about not being technical enough, get involved - *your fresh perspective will be invaluable*. * If you think you're an imposter, get involved. * If your day job isn't code, get involved. * This isn't a group of experts, just people. Get involved! * We are interested in educational, social and technical problems. If you are too, get involved. * This is a new community. *No-one knows what they are doing*, so, get involved. We expect contributors to follow our `code_of_conduct `_. Check out our `developer setup `_ documentation for instructions to configure a working development environment for Mu. Feedback may be given for contributions and, where necessary, changes will be politely requested and discussed with the originating author. Respectful yet robust argument is most welcome. .. warning:: **Contributions are subject to the following caveats**: the contribution was created by the contributor who, by submitting the contribution, is confirming that they have the authority to submit the contribution and place it under the license as defined in the LICENSE file found within this repository (see :doc:`license`). If this is a significant contribution the contributor should add themselves to the AUTHORS file found in the root of Mu's repository, otherwise they agree, for the sake of convenience, that copyright passes exclusively to Nicholas H.Tollervey on behalf of the Mu project. Checklist +++++++++ * If your contribution includes non-obvious technical decision making please make sure you document this in the `design decisions `_ section. * Your code should be commented in *plain English* (British spelling). * If your contribution is for a major block of work and you've not done so already, add yourself to the AUTHORS file following the convention found therein. * We have 100% test coverage - include tests to maintain this! * **Before submitting code ensure coding standards and test coverage by running**:: make check * If in doubt, ask a question. The only stupid question is the one that's never asked. * Most importantly, **Have fun!** :-) mu-editor-1.0.2+dfsg/ISSUE_TEMPLATE.rst000066400000000000000000000012641341747546300172740ustar00rootroot00000000000000If you are reporting a bug, we would like to know: * What you were trying to do, * What steps you took to make this happen, * What you expected to happen, * What actually happened, * Why this difference is problematic (it may not be a bug!), * Technical details like the version of Mu you're using, your OS version and other aspects of the context in which Mu was running. Please remember to attach a **copy of the full log files for Mu**. You can get the logs by clicking on the cog icon in the bottom right of the editor window. Click on the logs and use CTRL-A to select all, then CTRL-C to copy and CTRL-V to paste the contents into the issue. Thank you for contributing to Mu! :-) mu-editor-1.0.2+dfsg/LICENSE000066400000000000000000001045131341747546300153650ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . mu-editor-1.0.2+dfsg/MANIFEST.in000066400000000000000000000003701341747546300161120ustar00rootroot00000000000000include mu/* include README.rst include CHANGES.rst include LICENSE include conf/* include mu/resources/css/* include mu/resources/images/* include mu/resources/fonts/* include mu/resources/pygamezero/* include run.py recursive-include mu/locale * mu-editor-1.0.2+dfsg/Makefile000066400000000000000000000076451341747546300160300ustar00rootroot00000000000000XARGS := xargs -0 $(shell test $$(uname) = Linux && echo -r) GREP_T_FLAG := $(shell test $$(uname) = Linux && echo -T) export PYFLAKES_BUILTINS=_ all: @echo "\nThere is no default Makefile target right now. Try:\n" @echo "make run - run the local development version of Mu." @echo "make clean - reset the project and remove auto-generated assets." @echo "make pyflakes - run the PyFlakes code checker." @echo "make pycodestyle - run the PEP8 style checker." @echo "make test - run the test suite." @echo "make coverage - view a report on test coverage." @echo "make check - run all the checkers and tests." @echo "make dist - make a dist/wheel for the project." @echo "make publish-test - publish the project to PyPI test instance." @echo "make publish-live - publish the project to PyPI production." @echo "make docs - run sphinx to create project documentation." @echo "make translate - create a messages.pot file for translations." @echo "make translateall - as with translate but for all API strings." @echo "make win32 - create a 32bit Windows installer for Mu." @echo "make win64 - create a 64bit Windows installer for Mu." @echo "make video - create an mp4 video representing code commits.\n" clean: rm -rf build rm -rf dist rm -rf mu_editor.egg-info rm -rf .coverage rm -rf .eggs rm -rf docs/_build rm -rf .pytest_cache rm -rf lib rm -rf pynsist_pkgs rm -rf pynsist_tkinter* rm -rf macOS rm -rf *.mp4 rm -rf .git/avatar/* find . \( -name '*.py[co]' -o -name dropin.cache \) -delete find . \( -name '*.bak' -o -name dropin.cache \) -delete find . \( -name '*.tgz' -o -name dropin.cache \) -delete find . | grep -E "(__pycache__)" | xargs rm -rf run: clean ifeq ($(VIRTUAL_ENV),) @echo "\n\nCannot run Mu. Your Python virtualenv is not activated." else python run.py endif pyflakes: find . \( -name _build -o -name var -o -path ./docs -o -path ./mu/contrib -o -path ./utils -o -path ./venv \) -type d -prune -o -name '*.py' -print0 | $(XARGS) pyflakes pycodestyle: find . \( -name _build -o -name var \) -type d -prune -o -name '*.py' -print0 | $(XARGS) -n 1 pycodestyle --repeat --exclude=build/*,docs/*,mu/contrib*,mu/modes/api/*,utils/*,venv/*,.vscode/* --ignore=E731,E402,W504 test: clean pytest --random-order coverage: clean pytest --random-order --cov-config .coveragerc --cov-report term-missing --cov=mu tests/ check: clean pycodestyle pyflakes coverage dist: check @echo "\nChecks pass, good to package..." python setup.py sdist bdist_wheel publish-test: dist @echo "\nPackaging complete... Uploading to PyPi..." twine upload -r test --sign dist/* publish-live: dist @echo "\nPackaging complete... Uploading to PyPi..." twine upload --sign dist/* docs: clean $(MAKE) -C docs html @echo "\nDocumentation can be found here:" @echo file://`pwd`/docs/_build/html/index.html @echo "\n" translate: find . \( -name _build -o -name var -o -path ./docs -o -path ./mu/contrib -o -path ./utils -o -path ./mu/modes/api \) -type d -prune -o -name '*.py' -print0 | $(XARGS) pygettext @echo "\nNew messages.pot file created." @echo "Remember to update the translation strings found in the locale directory." translateall: pygettext mu/* mu/debugger/* mu/modes/* mu/resources/* @echo "\nNew messages.pot file created." @echo "Remember to update the translation strings found in the locale directory." win32: check @echo "\nBuilding 32bit Windows installer." python win_installer.py 32 win64: check @echo "\nBuilding 64bit Windows installer." python win_installer.py 64 video: clean @echo "\nFetching contributor avatars." python utils/avatar.py @echo "\nMaking video of source commits." gource --user-image-dir .git/avatar/ --title "The Making of Mu" --logo ~/Pictures/icon.png --font-size 24 --file-idle-time 0 --key -1280x720 -s 0.1 --auto-skip-seconds .1 --multi-sampling --stop-at-end --hide mouse,progress --output-ppm-stream - --output-framerate 30 | ffmpeg -y -r 30 -f image2pipe -vcodec ppm -i - -b 65536K movie.mp4 mu-editor-1.0.2+dfsg/README.rst000066400000000000000000000027131341747546300160460ustar00rootroot00000000000000Mu - A Simple Python Code Editor ================================ .. image:: https://raw.githubusercontent.com/mu-editor/mu/master/docs/logo.png Mu is a simple code editor for beginner programmers based on extensive feedback from teachers and learners. Having said that, Mu is for anyone who wants to use a simple "no frills" editor. Mu is a modal editor with modes for Adafruit's CircuitPython, the micro:bit's version of MicroPython, PyGame Zero and standard Python 3 (including a graphical debugger). Some of the modes make available a REPL (either running on the connected CircuitPython or MicroPython device or as a Jupyter based iPython session in Python3 mode). Mu is written in Python and works on Windows, macOS, Linux and Raspberry Pi. The project's public facing website is `https://codewith.mu/ `_. We celebrate the work done by users of mu at `https://madewith.mu/ `_. We have `extensive developer documentation `_ including a guide for `setting up a development environment `_, `contributor guidelines `_ and `some suggested first steps `_. We want our community to be a friendly place. Therefore, we expect contributors and collaborators to follow our `Code of Conduct `_. mu-editor-1.0.2+dfsg/ROADMAP.rst000066400000000000000000000041641341747546300161760ustar00rootroot00000000000000Roadmap (Mappa MUndi) --------------------- (Apologies for the pun: https://en.wikipedia.org/wiki/Mappa_mundi) Mu started as a shonky hack. Now many people are interested in our small editor for educational use and we owe it to them to be clear what our plans are, how we work together and how *anyone* can get involved (see ``CONTRIBUTING.rst``). I believe it worth repeating the Mu philosophy we have followed so far: * Less is More: Mu has only the most essential features, so users are not intimidated by a baffling interface. * Path of Least Resistance: Whatever the task, there is always only one obvious way to do it with Mu. * Keep it Simple: It's quick and easy to learn Mu ~ complexity impedes a novice programmer's first steps. * Have fun: Learning should inspire fun ~ Mu helps learners quickly create and test working code. Python aims to make code readable, Mu aims to make it writeable. With this in mind: Next Point Release ================== 1.0.1 is a bug fix / translations release and will only include: * Update to Adafruit boards and future proofing for as-yet-unknown boards. * Swedish translation. * Updated and complete Chinese translation. * Blocking IO from Python 3 sub-process flooding data is fixed. * New MicroPython runtime for micro:bit (bug fixes). * Improvements to the stability of micro:bit flashing. Expected delivery: mid-September 2018. Next Minor Release ================== 1.1.0 will introduce some new "beta" modes: * PyBoard mode for PyBoards version 1 and 2. * Kano mode for MicroPython based devices made by Kano. * BeeWare/Toga mode for simple mobile (Android / iOS) development. It will also add some new features: * Use of "black" for code style / quality checking. * Configuration of UI for purposes of better presentation: - Change size of buttons. - Tool-tips and auto-complete toggle. - Colour configuration for "Custom" theme (help dyslexic users via colour). - Transparent background (makes screen-casting easier). * Update minifier. * More translations. * Cleanups to the documentation. * Bug fix release of MicroPython for micro:bit. Expected delivery: late-November 2018. mu-editor-1.0.2+dfsg/conf/000077500000000000000000000000001341747546300153015ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/conf/90-usb-microbit.rules000066400000000000000000000001211341747546300211740ustar00rootroot00000000000000SUBSYSTEM=="tty", ATTRS{idVendor}=="0d28", ATTRS{idProduct}=="0204", MODE="0666" mu-editor-1.0.2+dfsg/conf/mu.appdata.xml000066400000000000000000000027571341747546300200700ustar00rootroot00000000000000 mu.codewith.editor.desktop CC0-1.0 GPL-3.0 Mu A simple Python editor for beginner programmers

Mu is a Python code editor for beginner programmers based on extensive feedback given by teachers and learners.

Mu is a simple code editor for beginner programmers based on the feedback given to and experiences of the Raspberry Pi Foundation's education team. Having said that, Mu is for anyone who wants to use a simple "no frills" editor.

Mu is a modal editor with modes for Adafruit's CircuitPython, the micro:bit's version of MicroPython, PyGame Zero and standard Python 3 (including a graphical debugger). Some of the modes make available a REPL (either running on the connected CircuitPython or MicroPython device or as a Jupyter based iPython session in Python3 mode).

Mu is written in Python and works on Windows, OSX, Linux and Raspberry Pi.

http://codewith.mu/ http://codewith.mu/tutorials/ https://github.com/mu-editor/mu/issues mu-editor Nicholas H.Tollervey mu
mu-editor-1.0.2+dfsg/conf/mu.codewith.editor.desktop000077500000000000000000000005521341747546300224140ustar00rootroot00000000000000[Desktop Entry] Type=Application Name=mu GenericName=A Python editor for beginner programmers Comment=A Python editor for beginner programmers Icon=mu.codewith.editor TryExec=mu-editor Exec=mu-editor %F Terminal=false Categories=Application;Development; Keywords=Python;Editor;microbit;micro:bit; StartupWMClass=mu-editor MimeType=text/x-python3;text/x-python3; mu-editor-1.0.2+dfsg/conf/mu.codewith.editor.png000066400000000000000000000224651341747546300215330ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs  tIME }M IDATxytUE?w $@CTDPA@1 "j,؊C`kآ M+6(D"Ha r3F{{ν]˥fWN.A!II@ K@o'b;#@P4  C)@ vXlVH B|Tq=f_sHx$])#\ L דvHepyK6p__ߋ[Jp!w CF2.G;b?X63ȕV*%D`ʁ+ `<לb!_,3o6**o90 /}P,qcKĵ< ,n?/'N+U:==~ѳgOwθq㈋C4.Reo>|>Ln7[n󑗗g> x[@-3W2%%.]п*nVqҥر%KP^^NEE0Nށ3.vphoY~ZKOOלN_H8D#GvܩhG 7\.VZZ7x˜g uU{ǴoVs\Zq!-++K&@G d!uӶl٢ ?'33S8q J-8莔MD"|>RIXYC sѪ%Z fgʜ=%t8mZ]]Df),,fΜӔ+B0]B\ ğ**(͝;WTWWk_}(F/Iؙ1Xm֬Yu&F2;܉'JY----f a>8ד,rk4M޽{s Vk+Ex{0ݺuرCjo5^zxgUz`%Ff͚r"#Gh#G t`1yiiiO?y׵`< Wdty!PӴ`(|M03$$$ߓ&2A|WFFqFe]Fee2n8\.l'?.FΪUk#89K52hÀ-Fԯ[n_H?70f#"' gQFqFvߟ={euid pQ?}t ~sgeVI3=DuI*0xb}QnMvmTVVeȵ.ksHPmt۶m\|B0a\lYP:8p^z7 j*&L` Bj  0Q=zw^bbzxA?#==^^zP/ޥ:Hqq~QXXHΝW`q#AoaQgp rsscٳ'Rm6]3:*/Nqq1]tQm?!:F@ _4h۷o7rO gҭ[7*+O , *J ApPQQAU^JvO9 u 0QElذA_<111,_\ ['A?nΝi&#&MRya EAMfO5DEEkONmh آc7`s{VxOT^zTJzO 8gm_SўK9dSIq]Yuη{u0G\Q)]Z4bz Mit2ԞaӷYOвv;fRe@"z;wު> "r]^^8&=N0nݺQVVL1mlĿ1`̙èQBکU_eg۩ m: aX./RojsJ?HHڸ.&trae$$$ryhs%ۻps=!ʵ%v D٧(daexJ;huՓ}ПvБ:^)WUU^St ŃnlyH<,R.HgajSU1lFGcc#6lkN@W #^/ Fo.5cl.+vz1|M^&r3>z.ϕǩDOFU?o 2m۶Y̞E A &RJ[f-_:Gk;11zSO8i歷 (HXf.k~p8TUVPqq.74ESfNMMUa&-kB`sFQ$uN5ѻ-r^|eܑ#F辚,--Pv & G&]l>\BWkM& $:p88e#wU%埭JY;=:M]N$N=Bi?r7M -荿xp#::Z v@n$GP=.Ϧ!4_{Gv;ϺL>cyⱂr? O{ME:?5xرc[c~1LK^VbkSan>St$8R_>  >Sq.OITg@&[2΢p%3G)H<: h0`8`(6WuNiX94ɣS|1HO >>^?7SDu(ݺuTDkF1a 9:?G, @לD} OJk59J  C^N:I 5ۚcK.Ҭ` Zd=u&*֠Gkkk׮Ҭ` :&tYU]I| +^$ DniMA^۟}ӧO5IĥJkĥ|nSPP `x8b41{Icm|;Ўhy+ 1mM]!"8ܚJBDp5ةg/SA ՛HQњcI 5iMt-{^iVAߵ&> |eeeҬ` %iA{*[]Kvv4 w/Gm?4,W qK4S~ZW \c6,=ddcV8o5" z,^Zz ml?s_==MMr(~w G>S&?|Dz APG!hjjRy xPi|ѽU @>_{榉_$iM)᭷ޒx饗tk/EkSO uuu46 fzMEt+..\.fr"Kg1APHmm 3"3?.=& ٿ 3hlSҥKA!?^ZzJ:233n˹APömT=o}GsMظq SlΣ -BcT WSZCC֭|zMp<= Xr SafI Uo9Pl2f D<}^Yv 3\%p ҋ֭Zf=:ho'!N_@hɚQQQAAA or=;ŏd fY 4љ`nI B?~ 3'\khJSE!" r:ֶ%nm4<ҳ-S[`ڔyf]A8Fw-zk4o*,dJKxޚ-X@VxUv|oӧOسgs߷QCo ?cqA8kVź=Bn[jU`yQA x߲eTu.'--MO!魩w(Cc>P,.\HMMxx^T @ SO`96mDcc S_uہf5߸q# B1vXf4 #?,3O0m4!?*Sـ7T0Iܹ9sWAii){*sc (Y x't۰o `ɪL} R~CnW$^ ]6\ŻSɆ TӽNhC*fݺuk:x@ZUTaDxU|LڢFCELQegO?>@F@I#M>}T|K!g탂->kC*>Ib.B㻿P[9T@IXhׯWen q)?+,f̘!^$Xv72ݠg\W^y{7 c„ *ͽroP9`&Rvi2gD=U>^/:u B%ٵkJ-)߫2V[[+ӳe-Zz:EP_/Li>|#F4[zۃ64C`8Tӷo_#bGA;TϱA={ 1]o{ ON;M> `ԨQթ4x>uNE8pxR FVVJuI=tStSS]vFp]wuVf/ 3[4XUUEǎiyWU}!kTz\.OSǎ♂|Q fz^ 7 <%n/A^}#N iGg1b lmF.jkdT㑴B ׏7U>%-9΢E0`v^ ݬo7qh@Ghn>dBy\.k&Ş lb{Yyki˺]TMy<իWf෺@Pi|PZy Fa >K*"7*pkQYgEFF{ fg.a8}7X6y6עJ>dz9+HIIaʔ)l۶-ŷ}Ҟe> *e\y7m dgW݆ngW駟:KIII0-U^_u>VV]B[?#1U\x ~Dq_AQ *Kꀡ\)(d~3E`q.Sb|yo'(_'A66>l H*U #B1R ^} %|%o‰XY&엍?"EtR`0Y+oD @ l)\W.cSm=|p!'{ZT.ޔgٴ;đ, WlF13֦ߘ4&j>. 3zSE!6_S}]{J#hڏB"Ζ>?Vk-# 䘍GvAA:R}OIENDB`mu-editor-1.0.2+dfsg/docs/000077500000000000000000000000001341747546300153045ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/docs/Makefile000066400000000000000000000011321341747546300167410ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = python -msphinx SPHINXPROJ = Mu SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)mu-editor-1.0.2+dfsg/docs/api.rst000066400000000000000000000066311341747546300166150ustar00rootroot00000000000000Mu API Reference ---------------- This API reference is automatically generated from the docstrings found within the source code. It's meant as an easy to use and easy to share window into the code base. Take a look around! The code is simple and short. ``mu.app`` ========== The Mu application is created and configured in this module. .. automodule:: mu.app :members: ``mu.logic`` ============ Most of the fundamental logic for Mu is in this module. .. automodule:: mu.logic :members: ``mu.debugger`` =============== The debugger consists of two parts: * Client - used by Mu to process messages from the process being debugged. * Runner - created in a new process to run the code to be debugged. Messages are passed via inter-process communication. ``mu.debugger.client`` ++++++++++++++++++++++ Code used by the Mu application to communicate with the process being debugged. .. automodule:: mu.debugger.client :members: ``mu.debugger.runner`` ++++++++++++++++++++++ The runner code controls the debug process. .. automodule:: mu.debugger.runner :members: ``mu.interface`` ================ This module contains all the PyQt related code needed to create the user interface for Mu. All interaction with the user interface is done via the ``Window`` class in ``mu.interface.main``. All the other sub-modules contain different bespoke aspects of the user interface. ``mu.interface.main`` +++++++++++++++++++++ Contains the core user interface assets used by other parts of the application. .. automodule:: mu.interface.main :members: ``mu.interface.dialogs`` ++++++++++++++++++++++++ Bespoke modal dialogs required by Mu. .. automodule:: mu.interface.dialogs :members: ``mu.interface.editor`` +++++++++++++++++++++++ Contains the customised Scintilla based editor used for textual display and entry. .. automodule:: mu.interface.editor :members: ``mu.interface.panes`` ++++++++++++++++++++++ Contains code used to populate the various panes found in the user interface (REPL, file list, debug inspector etc...). .. automodule:: mu.interface.panes :members: ``mu.interface.themes`` +++++++++++++++++++++++ Theme related code so Qt changes for each pre-defined theme. .. automodule:: mu.interface.themes :members: ``mu.modes`` ============ Contains the definitions of the various modes Mu into which Mu can be put. All the core functionality is in the ``mu.modes.base`` module. ``mu.modes.base`` +++++++++++++++++ Core functionality and base classes for all Mu's modes. The definitions of API autocomplete and call tips can be found in the ``mu.modes.api`` namespace. .. automodule:: mu.modes.base :members: ``mu.modes.adafruit`` +++++++++++++++++++++ Adafruit mode for CircuitPython. .. automodule:: mu.modes.adafruit :members: ``mu.modes.debugger`` +++++++++++++++++++++ The Python 3 debugger mode. .. automodule:: mu.modes.debugger :members: ``mu.modes.microbit`` +++++++++++++++++++++ The original BBC micro:bit mode. .. automodule:: mu.modes.microbit :members: ``mu.modes.pygamezero`` +++++++++++++++++++++++ The Pygame Zero / pygame mode. .. automodule:: mu.modes.pygamezero :members: ``mu.modes.python3`` ++++++++++++++++++++ The Python 3 editing mode. .. automodule:: mu.modes.python3 :members: ``mu.resources`` ================ Contains utility functions for working with binary assets used by Mu (mainly images). .. automodule:: mu.resources :members: mu-editor-1.0.2+dfsg/docs/architecture.rst000066400000000000000000000057431341747546300205310ustar00rootroot00000000000000Mu's Architecture ----------------- This section provides a high level overview of how the various parts of Mu fit together. Key Concepts ============ The key concepts you should know are: * Mu uses the `PyQT5 framework `_ (that makes the `Qt `_ GUI toolkit available to Python) for making its user interface. * Mu is a modal editor: the behaviour of Mu changes, depending on mode. * There are a number of core features and behaviours that are always available and never vary, no matter the mode. * The text area into which users type code is based on a `Scintilla `_ based widget. * Mu is easy to internationalise using Python's standard ``gettext`` based modules and tools. * Mu's code base is small, well documented and has 100% unit test coverage. Code Structure ============== The code is found in the ``mu`` directory and organised in the following way: * The application is created and configured in ``app.py``. * Most of the fundamental logic for Mu is in ``logic.py``. * Un-packaged third party code used by Mu is found in ``contrib``. * The Python3 debugger consists of a debug client and debug runner found in the ``debugger`` namespace. A description of how the debugger works can be found in :doc:`debugger`. * Interacting with the UI layer is done via the ``Window`` class in the ``interface.main`` module. Mu specific UI code used by the ``Window`` class found in the other modules in the namespace. * Internationalization (I18n) related assets are found under ``locale``. Learn how this works via :doc:`translations`. * Modes are found under the ``modes`` namespace. They all inherit from a ``BaseMode`` class and there's a tutorial for :doc:`modes`. * Graphical assets, fonts and CSS descriptions for the themes are all found under ``resources``. All classes, methods and functions have documentation *written for humans*. These are extracted into the :doc:`api`. :doc:`tests` is in the ``test`` directory and filenames for tests relate directly to the file they test in the Mu code base. The module / directory structure mirrors the organisation of the Mu code base. We use PyTest's assert based unit testing. All tests have a comment describing their intent. The documentation you're reading right now (i.e. that written for developers) is found in the ``docs`` directory. We use `Sphinx `_ to write our docs and host them on `ReadTheDocs `_. Other documentation (tutorials, user help and so on) is on :doc:`website`. The ``utils`` directory contains various scripts used to scrape and / or build the API documentation used by Mu's autocomplete and call tip functionality. The other assets in the root directory of the project are mainly for documentation (such as our Code of Conduct), configuration (for testing) or packaging for various platforms (see :doc:`packaging`). If you want to make changes please read :doc:`contributing`. mu-editor-1.0.2+dfsg/docs/authors.rst000066400000000000000000000000341341747546300175200ustar00rootroot00000000000000.. include:: ../AUTHORS.rst mu-editor-1.0.2+dfsg/docs/awesome.gif000066400000000000000000031013531341747546300174410ustar00rootroot00000000000000GIF89a X18 O v d &)(&*#~0*(1 20.46f6g667417d7e7f78b9m:2;:e=d?>;?b?e?B9FcFkHeI IbyJwL[wMKIQ UUSWuX [T\n~]_^]jecjjhjolnnknvq$uurv4:x}}z|~ŅƆ㇈/8Ǐ􏑏ޑᒳДEM|kp⢡sw]eͲභɧxɳӋѹ̜ͧӯ̋̂͆y斞֖¼oڧԄ`YVكJYiIBA7;@JW|\lp! NETSCAPE2.0! , X H*\ȰÇ#JHŋ3jȱǏ CIɓS\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`yKٳhӪ]˶۷pʝKݻx˷߿ LȈ]̸ǐ#KL˘3k̹ϠCMӨS^ͺװcފ իWV )Ҥ5dКYƍ[{ X,mقuTIU+޴tkSMZXT_ omKpýcr1=ӬK-FJmզS* n"(%\sE8a\^ot ,*g^:psM2A^|x-_,t~L-뜗0g | i~*05c块=y_G-_nOF7T͕@jy_~`~OV '܈ ;)C.fcQcb:،XɦG™xavr '>!y1iNrH'Rާj%^ff! "T + . &pB*v]إr*P"h$̴x 3]RT6lR-"0ִ_ b}B+ֶD<_~b/('4+kHuLI6<3j3]ʚr3|;Wq=V-H+/{,'p{j0HqQDuWݞ8u=n#J3<+Dk.unCmY*m+5Sャh's|PK2UڎLkcOp:ئ!) /ڢ ^: x(//+k>P> OcI~^Q\(oz{^`69d.9 vu.y Z$a~( BÄ >Hy+xyٚ /Pؿ@*bVִf;8Y, tmÛp|=n$l&;^$VA"t7Ή. 8D$"N;\N%! 1rdlAJ<ɸ5t= VB%gaf]l5GFC1 -XNWBHC=c&Az>qs@&4)X"ykS[vc+:1y蕯ldi:նlk{[E"moBcuba#G?a _hVUU|&u2ϰIskvV-f;Bk|}yv?asc->! ߘ5Dž}1 >۽G= @W.QNiih}|G?bvǡA◧Xu;`p{YFu^c 1L^AIWǡQȂ7/GE]O2~H&\K{6lQ<LnSwZ.8m݆N8o~8rd;yٱ5x=]F}Klp7t?<>r\pB>b=WwF?hNdyFE>p<ЄXыoG]tw&^iw-\ LuoZD< G~csO7@E:z^xϴ{[W#PDixN}ނ^(ȯp=e_>k#K̳u;]r1qus2K]t@v_zia$xN__}}~ W~JWUW'Wf6Pp7z|DezWW} f g/|{G ٷ}}te G.9v vEޥWWy K@ D xx7wF wfvyKDgG )p bsYjF0 b/t m^FDR R|vgwfWq`;yh(v<H(ybeWu{ȂSsS` Іpgu_X>OXH@ Rb0 Ym0 x`~6QH9(^~N"3cƈ茶h(鰍Jፆ(eh7h鸎i!7oIh|5w0wf{XU0pɸ(؏IAȆjg )sun5^x( U4a( Yvytuu X618y I}i|i|)Y%97Y8$I}8 4@!٘ y+/ٝɈ{tEĩp[_I 9ńtNw֖  ^Y yyh|<` ٟ镹'j WfhIW8X x [6<+ nЗ*H`0F }1A @zr{v}B '@ /ꠞ1Yuէڞ˒E}}`oYWif1J`.3ť S:Afai;{1 Z_GG*q!p⪷jؗ9[gz':g: @u꩒ zکZ&R, `;I y: բ ް.h= 6Қ `T٣ު p'h+7['@ `/pӫ KuJ{Z6-˱ &' Kw6[U`S(:ݔ SVKz^]c+z `/Hڈjh6ڲ'NK 4>˷~K*wдO[9xQ.7#;8g&[Z+< \Z[J|DcO<Ƿzwh^ `rAVљ O25B , l@ʺ 7 L(iuuWd0 .1#Ӡ nmΨn0 0 p PfU ^ Yο>|]XW6 NJP Y Gِk9ϣcϹ 0:IQζ 𩲼J6sϹ/A #]pT- ڐ}G\4>p9ej< > f~ @6h:|8 cpԄz3\hZK[<ҰxJM &z\W[m8^&D|Yu/ڗ|{ 1>z k- GDm3 ndͽbJWr^id1 2Ldщ P[  >_ up 0 xmrpr=DmގXP 0-߳Vq!P 0Y@%% B 2] u ߂F:j A'"n3$N#IK 8 [2p2 fP W]*ZW!>Wּ+>wuX[>20f` Y/0ym3]͗rwϐ݃m|XРI9.G;߷ Xȷ2&= p] /@]?=k<pW-d_Ѐ 0k*ڗ rhҏe9[ ]I7Pwt'`h`H> YdംX#Hr@Pp&G.w<_j.*QM`4֏}\,n`h 80 m0 %Ku -n;ʇ 6>&6pO0 >Y_w> !_C&4sZ T/ @Ѧn͐Nh- rP*`8 }o*c6z*pHH 0hq}]8um8]L_V@%YP Oh;@(ߤO)2` װ>.eF*j~p)P]/`;N o;:@'h0k)WYPz.並 0Ο;+ߋ!hUPDӧOaotWXVŊu+U-J\g޿yѡO&ĐA,tG_G͠mZ*T&t^=sGRV,= 5k6lݩUHMh\pUb}sfM7zƒ ?'dȀY&-)TTc\ʖrjT`A3H<8Yjٺ͜;*R'Pil5 BPdiKJ(F8z)IqL6q툇'м~ҦOw"h˨%:}˫zlʤl&$>&FQ2) t1FgWPezkg@t~ t !ǓJi.LD},˝sn&4~/,g]Wh =_ngDRI&\z+Buh2' &N gľYJo-R))/& U+RHJ'~y&&AL:iF+\EK.oSj`"\q\q`'`XK.I.:с D0A3"<_(hiV-(7aNNdil wT}7y2Q?5(Ջ'N`BeKQF_}tR~mמŚNd@B&-$iJ{O [ڝ NCM,FFS{hqZFon$o],&ЦANH>eޚ9F=lD-TDeh8$lԩ)b̌BTg=L8 <0A_A/z8t̓$Q|$B'ڛKbA%V'+{,_Ӱ2Ɓah8F80$~И_ 5Y K"NAj|B>XD`! 0E2gU$ƃF278}ah&f aA,0|yGF 3'5E':5A^?Q1-Jb!x:܇ybs.z`c5Ȩx@ HRTUy@Q頢fKg6ȇNsbۆ8%~T]CI" N36RD. AöRFBXЄ '\$ "Ro3!40`rAV(T !8:28I)5IճLE0(Pܣ혎r$Iq+ RoK]єfx2!&5?A~7Ԉ.a`bS 'O8j]Pv d4jERu '5,Bt SJAKEIp9D"Y`9()ݮ=:|#>QSl:AS7#j.O8eAG%|F#uM\dJX4 `=*]|{MOi!YVAh. Д$|Jf tUzժ:QWis0lX`0B *$!ATct30 YB瘄ĸ%0@/T7FF0ϩ˦_l8yvֹ֘P/"<6U&&@. = Β2Z.\ӄ@Xl{`I$Љ6]hOMjcǿX{$UBY*12d5(Ёi)`C;As\?PG~zk0Aq8 {a.`/5]!>FEFD2!jzsh`x ' -I  .@wCSnH5P ͣf,*`F0.f-B:3d! I`5BЂd%p}2~%XCR@uy]З>V#XB(r&Ȳ0샪@"h-,ki8KyғLR8XZ"Y|YX5Y0P` 'Y(h=s r?3= ubY`x7 tp̽P;I?h 0:mAm`1ARADK3?㚄pm`A+'d|ȍa?$|RL`H48%A < `@b( ɈWHuJdP$:|94=%TvЈ,Hi ZBI-xB&B/4`Čkk0l<<c؂-+`+x<`-x+؂C1l"8hP˜Cp K\0lI++z8Atxa 0mxy(G܍J6ɛ12*P pq' ktEr؀s:w ZuXgd( *:K6A-`{PI.xD8 &PQ\0Hf2=M85x u a4=Hͫ.?U3&0Cv %Ҷx X@0{ss )032C))'נ8uPfHiI)5y@ؒBj̃Tȱ -ZQ$>ŀI@ >0;dk.34@"4 cJ (O.!IѤJՐSA8I=*xjN\bnc!1\Hc\We t(>A[:dpe-@YV ^ ^*T~oVa4X.+iE5b%Hۚ 4cJ?ʐT>-04}R`qret5Be5f)Ű JTxD,IZ:`c%@cc*ECg`a b'^6pY)د Ό 1 .U ^3V =B> L[6H -Y !u n_^tJ7CT@%qqPVvŞhՇ'hXQ΀4ՆuY_dsWeΪz (4T6IdFajg|1ݺmth9݂_O>1;mtzzîp(6$ >)ލnP6 f98^ 7Q:t>l;YmѾhlm6Ȭ8>i^bki1ւ@l]kJVA=>EJ4q>m2|>dSig`flFU qr3BLjsUN_VI|t)aNdDqCʑB)TnU;O2Ы#Hg<=HdI0ZrC~k̾zjU7rKw+i6`2׿lr|1! )dzÈҾht#3DɬwI&N>tСyQIآ-Vt"C *`e 4ocя!;Y2H0Ƅ3fC66 *UE f >'۵+)_fdΧ_=-Wc<&{fB"ڰאS&TFmdw,-z;;^,.]oO{IhX,ACGo^>@0B04c ?8>h#Dbdht"/"GXx!? (L0ety遂=T ML,/9Arɶ?E?ըˍfV!dOVKy 5eAȱbK JڇF5蔤Nâ./یĕPIR>;VB O<"x "p63p>Ȩ;ޢrgGPA|@q?8b TRŇAG;:]ClwW F5p]Hw<@Ih*8ǵ)- Gr>Upi|2gl(閧:X q@ `C'0#" U-5"0 bu2dw =t(eS/.'gC L-h%ԡTxg7?j:~r3@0>*ʊ=%0+6Zbvtdj }sNbg!1QJĂRR>џTCkWc.pH LЉ'r.{"|-c rŮ q Bw?!l"@"P]OP98io.QqtE[*9􃋨qi~g}X.Nh~)=u P(E bbWI"`2|&iu טj:z:vd3Rjdy0B +YK-L)HSDVVUzub;q8°d= N]ceױԘOqj!hAmt\;0:Shu 7s}D$B2`>Sz' ŶW+6R/% 5ϩ_5i* "!! pң=ک*m28D##{~'*h*hA %#a暘 uG͞A4ii MU1X;%P(`YP&Q LusM"zжosRpX#|ܣlO,(H! ӆ} &f&1Tbխ}By@c5#m{;ɷ]lnm_nv,q !'(VCt%`Lw-)@}1L :Ijh':~@_ 4x Xa?y b6>abX{ªNFKA d3G0 xԢHfFґ6: %1 h@T9#:UlBhF<$d]R%K8^^KuFP;o }~BOR0/)Bm=0l{7js1} ڐ ^` 'P &0ltba" `hO|Н;h rxV9EE  R ŌM}5GTC50c @q$Cu ]ujq`ʁ6@  a$\ VZ߰B&`S<#0 XB5UZ.].BQ f`@ N,aĘ8_N +4x4`uø4/!̓AKݏ90=eDi {@8ԅT`M?`D44dG\:xޏ*\1I=Z]2va* i9~.#r@HMQB"޾> ˆ3؊.i0EK~!=Gu i3CVQ҉c!N(u)$!9\jf"0iiϣA1iSxi8>@ }*- , >ʀ ull)2t颒22's'`2\_D'|0 PN8xB%X5LC<]ڈf3xhV$6 ,iu0=0]L0G?H $+0WK#0D1(Vo+Ƭ.yq1Ե80bSB[q g`kx[,`9hlЬ]r{Ѩn+,ZHFݠȱCoGU+T%)_ p.\ ]gq뉗$D( ,4,+ "ǂ& 4B:ЃM'Q;Zl+/C!:?C-B/,:# :Q=p ROnAl9xs2-؂%v4g0?Ӄ2 3d=4B+t_N/sN0.;xs5k #I$s=$BgRHt>~f -XUwUZCDk|2a MAAf-w_8 [1#aY3;s.X&h5E=P&06} ?5 o33R3/(oCl4=64T8N&TB>C$coC1XpgVh~(XB%v3453b_7z53T{(3*&Ђ-lúoºCүCBlQ1{9/nC;tC{ak:1'9'h75 4C_g9f$W-ŸXC 2z(/0*!x:h4C@mh-?+&$Q-"h7lunC>0mlT *B~g,~A1 >^w0>ĿT5=m2}4Ã97C9㷅??=L})J<{ƃ#GZg?@hJV*&TP!*TCfݾun?:tɓfsb8sUc9\ KxTϝM3uÒE)R 4AȐ%x]H~*jr` kQꥩꙝ6ѐ4Σ5hȀ"vnB_QQ#ǣE= N}aʬuʯ^٬e+fz}7$sڊ#=[E[W8c1+o'?AtK|7D6K'Ζ mBo_{.]9wQu&3('!llH(B)[oP1 O0L(iAs){hŵTdٮ ϬNr! Bb wasx1ƷǀDM]֘uUhP umqa&)WhYkZ} H+v ci3OezסZJ`Q|5XNוp^iEOtmoVg#tNFO;+fioZejW&۝+qa0˭*84P F?M)>hUkr nGW ID]'Fql_DB,ʑ^Lg 4 '(;cp0\U>iH5 k5py X:掕Q]{4k@)SXIIcؑ(Q }1c3YE!\,\I:wpc.i[[-)$ɋRN'qij+25e꜁2!DbsL./1"]+q[_kgUq_[W] LaK\D.xA9dlb,i"5).]`ez>" a[r5ӅuxȬo28[|]l[rx-^hU,9.5\pVUX=. dVlx{,Ľǵ2nXIXz[%._<HtVNšp+j5&[˙^E0+ B +Puj8E(<] Z65W{^gG{EO=\b>E][zך0;w&ohh:10˛7%tm{2DW-&^+ w81 77?=gj[6긝eP>m&Q!p=)]#īO'lnAօH 8N/}iZDs& nx ƍO!Mu5 "t1ŵ-1 prкFTI!Wе]TH|G/HtB o~[`FOhqԞn3V>X䋋2iQX9Pgswo:wE݃fi|B}a%(jZ&$j w(efy>ol/VZB/dȀ&$/a!HaFnGgcCnOӁbbB]$5/$*'x/p]b*˲,P"fm>L&6.fp+NayXпpGf0 $] [ -@P }k ۰& 1{k !q)OqG$5q9=I +Q/521]aQ01QgQZqv1s1WN0qAh+1qqlqqّqDF)+\ X ` ! b!X IIA,@@@H f`$ `@g}&`(`$A/M(RX-%1) *nARx2T% r((B(5-:H*/Yc$"E'RxR+ @jr*Ɛ1J"m@ @b"wqg"X  t5i#`"$A3;yβ7I$x]   .'\@,,6:3j 0"*$O8R,! S&@ ,  N 7s2]*,B- A]#JrC02'@b A@R9 +8:H4s, 9 *xv9r )S7Kl@3 &'+L'2T2DH ';M, Ls0݆#@@ RQ &]! 'w}s S8 !6#GI5@1SuuK`4.{y>3!4=o t!DMS @Vk j`:t7X*tZ@h2, HQ \DIa :S! ,2X BAES!@]Au [ 8T. 4/x8W@AZj#7v2@ B2 B @r69)_ PPoXaVbSQq5X65] V]I ,@[c]ilrR VRSa $6j nc NF;x5AB`_@bwXcGfY`>Ukk?2.5I4-U!$W:VV-s?XR33A!v 6^!X (+qb40V `-`+yt6;D^)8W@g$AX[#j`  tUw\ Vxx +7·D%sRanwdnp"!5r8d $ `+ 7 , igE@+ 4  HA%@F~}w^?x *DA @`@fTT3+w!~"kA*` @Wby7,a `pIrCut!fP  $ P?ܸZI(cX!` ?9G a9-R"-!ku50G3e>U@`fbj,+PIJS8Pg`DzC `*Bt-yq<2!tN:27bF'd,Qo  @- (@$L#*A-AyĒ(s_5@ jZ **XA*7x4S yGD*bd"CS[E᫇P}bZfMrW bRSa h*`8QI`uCc bIa YXH31B-` yGڊ3AUs20 4{[xs q5D `jm4$tzE8$!~orfi8Zۺa?T}EYm4e{vG B5i6*C#qE]p=IvBhShG5$1'X`-;+{ ¼ DAowd{J-ռA-I* ڲ˲),Lw "׺-!SaƷ}͖Rh(4CZo[\~#@KqWWG3qr!oG5d @k<3:0zS D2w \[r@ MG?p=V$*W3&B@qg d1yy7\x'T3L;U='? Ljzݡ(+YХq.)} (12 P] o3IRt;Ϫe\J9J+Q|/*[C 2rUwGp;!VA`j5U+cI1˙2$D?4FSp:E$\յ6-ly ԀЙߓZef?rslށw$8-A ~ 25a X  cUD ӊVjXa Նqk!&_&؈ЉPw>k/ÜC~!p< 4YC8x-A^bwUX P!  HPssO%W|}?꿳"r`L"?N0G`(CJRh',)hʕ(ER~<F+"!"e@,=sCV(jDF(R<@Hd4رdˎ` a70‚XfT\ĝ ~H x"( 4 6XJh QƝ l I٘q:R=@ XT% T+`qg (gN`0AѪMbF* H,'v-Ոp a X92юRG ؝\Hb+OA%a K ҐWTKzէG0t"E=gkp[ D=l֤ύDϡ䀯І$uob ˸$Tc`@&50VX1̃3Hl8+N y So, RAJ|_$s&gp',i`lO2Kzd)+[x`$YI%N m%5dc7F3X}鶦a sX}y{\ [\4cZ:>A 8pCc 8jnka}%FW^\;סgf}u3Z1Uoұx|F l`~?z̷|Ozoo0o~v~/~z+78/ԟ}>qtvqϏo8b`dL}8jx7` (Hhȁ}!(#H%h')m!؂+1(3H5h79;ȃ=?A(CHEhGI+ZmQ(SHUhWY@Ja(cHehgikȆmoq(shm0jNy{ȇt(HhȈd|((~؈ȉ艟kHhUhȊ芯hȋ苿H(Ȍ(g4ĨPX8(Xָ88hWgȎ)HXi긎8 )iWa ؏ !)yS"ɒ-/ٍ$Y9;ɓ(3(=IEiG)? Ə+O Q)3)*9Y[UYL9\)cI/)Ɉeo xHncq {ɗ} sIkR({ؑ~h4jIiو z陟I}ؖid( YFɚZ蚲YXl)ɛiÉٙiTXR ٜRE^(٩[I^)iYI驞9i͉ i)Ii)Y j(Iʠ : Jx Yꡜ)J%j! #j+ʢq3-*3z/Z1J9xz8A*أ>:Iid K ;ڤ(LHYSZUڋ` RZJYF0` _Xq \j^*i ~ rszhX: ~@ p:tjv:l (x 0۽ӿ-=Mi }GB:ѝMRi ٭HmD\ = ݢ<ﭓ-߀]}] JN^F >.LM jR" !md=)Z+.035~7aN=(>*.)GIMOKElSR[]1Ta>`n;]Zik^m| *suw炭Z}.h.H輨~H:>UNW镙Ί.饎ꭎn~ò^㧎oy.Ni샾9.H.¤~3KΕt㮵-l[v}m/޹O _.d9b!oOm̛=57/9G9?_IA/jDEΤYM9uOArdɗI.]SQNZUY24JW`n%[Yiծe+Ұq]yۗ۹[aĉ/ Xcd2\e̙ ;9)a͡E&]ڴGΞU}kرe3NڶֳuwڷW]qrѥOwͼ9Եo}낳{'_y".{^ﯾo@ ?@tP6lʽ+ԃK(CCT,B_ZPDST+KlcqƞZt5iqGsƔ`qH"LG OH&$YI*D$rK.H-sL1L2T<3]DsM8㌮ߔN<{C;O@ 52A$PF5,QutRJ>I+tS.e/SNCU*OuTTSNUUXib9Wc֋fV\{!]oWb(Xۆ5v^mo2f"gUSvZlEֹc52n5wm;\vLrەw[w^|լWx7};_w\-xaJ^#bwFx1АiE6^jxew 5ڐyfkfsyg{gzh6hVzivizjCk{l6lV{mvm{nn{oo|päQ|qwq#cȑM T(͋*„6U*ESx DtN$jϰ%2}0UJh/DdhE"˗زgPmɷ{+8w]a. U*[2I b.IK.m:_UemĂ,2DZ:@{3Iɽ/6Xl63 XM7r"΋PQ\5#IS8fw,+7+d҅Wf{ݗ~aiVI$ +1a`TȠr}9KNXaT,mW'}IGwE85 I0Th3YU"'X+%)r+7vܖJnv u(h+0&Z}đATDPD>V@DSH&4zR3S4%c@fy@xiiPa2MרG_EtYuk}ªiþ+)y5l$U%a,>jƅloFH~,5M*X6 Qbٵ+sB5FCQY=rѠ2BDAH%vk0)]cEvE 4֭s_d%.O?#?Pz\A d?D?Bjq3|E~N?~9'$#A/@cuqC#@T:.-Д6_Mڏ>{HISt }߇o3ڇ5@1~А ^$[@q>}:Cwc#oc!qd@e8wMBÇ# @E/JDq ?H7 "SBŽN$H,l pQӛr:JOӠdy*6J( { ُ/h^*TL)N _L- ӯ>([_Szt]-]'E$G=-?Qu%!,VSY8*ELaEV0V Jh_?~Pw>*HF"ۊEmoO򖡿 G&P?`ӤnsQ v pY0N1.wưt5*ygW`o-^c%w/As.h(PߨϺ)nwh~X&;gAcgB#nAwկul6;|bQ |C,bM`;䭉ŧWsIvR P>0x 5&AXd9'La8fty d֖H_ȉ#VK_(O':*1r_a VDu3~1nG=ݟ_(hBWjqN/#v4(9>CB9 sl,<[// ˗>hst"ek\l8EԈ3dzEV6AmPKbXu`ڍ{)[+cn j/ɇ o \_̞ںY/px@rBGY{쇱a:$Ncre1NYAF,Be9Ƒqr9:$kb3_s8<^a;9$3x'n*jT8A d'T$/lPA;ٶ6m:@hy{ W|$*ZAS ݈rzy̑2!iv׹,-U`Wj /a" aK_]z\X  Қ=xmc7Nx > B|&Q4u}iAJ9Hc-G=}(z17`.1 xq{|]GejuS':%TdVGbvՔnx NlQTyHz ro$FQ^ʤB*B3Kն0 2"t{VBV |j`3h9&$Ka|$}@DF8k J8E7oB4KO((k(tp??TOBY!' 1aQnth9&Ew%:?dȃUN1&#~COS3O3sf1&qz<=&4?d@h9S?W`UwE&A|q A NԐFx0&_?C)&>vFva:j]a0B0 OPZDx/A8p Ai x \4'hA s;hiC/q)A)#7n!П-hC)Gp`039bf1iK, @`)؉pnB:-aa q0ЉI@۩=b42IGJk6%O 6d, @ %J"P"  wW+Ib_G7%_@ ?#C6N9i$f%Y?أ {B*q@a&P &i^/]~dڨsFWYY!>cƖorr䠛0 J``t:,p~Nq&cEʫ$ٟ,jR*rjR *IŊGaTʤJIz W"$GPPgc¦*8 憧dZg;ѓQNO;h  A*jB β Rp oztTW!  PԪ:E:'SX7[.Ua =]B%Qj:ڳfҵ $Ep,1u a%xm-S:`cmjDJlEw4A+*0u{FKg6Ygo5' )pjyP|@f7;숟eؖP Ƴ1 3 ! ԧC7SdvO]#@xa>{UTJ(eѴPel'6ezPe`!@:cdˎg¿{ Tj$|h;:S{;u0/Gt:&OP N c %n 7myk:夁kE}: v+K|"!+Bstp&WhqO 豶aτoEk:FH!ߤOnmڻ,Z |x(dK B77K0$' rp '@VN8Xȇ@o AGe5eq npco%nDZʢ/U*y!:Yt:|ê"/| y`@ 5U1  vP1ͲGQmw,)TǎS}E2" hToja$!̂0k{F<ǣ"Ÿx*, M B g$2jF0,`@7mQcT}ḑsO jMF u`;za0$!&P#܀\csZ$I:6raqʬj]Um\ |9@8 -=T:t;e*|!3[)VM aadZ 萎Г1Qө+ }Xa$RB$fPrNK͝Րz]jr:}Ƴ_ho+1n o&@u&PKE:.$ ܥFmQP9STdp*^)1a=DYь0DY ӝᐣcy?sܰ9zAp%@F fF 0OLKMA)5GUeCO?pM@11A\|ox8lPߎ&3}>?_C$ G%VMBˢ>;Hנ P+B-U Ƞl PM ~l6)F04E۟NAց,|_}e$AyA_>_\vU:SZ:cEN% A+;P@ 2%l?jUC`A 8Q_]߼ͼ-$P$*h.; '84`D(c_GCٯA`@LuTƒF CZp dIF= U*Tb΢Xp- P ֥>6@HXx,3SDxL0[D6$t^ق= ̚Zukx,R.^1E4]/iQ gu5,X.696ܚ=l")w(ґ*SK/ aTU*'jA>rKLzJ$mHa!dJA~N.*RT.B.0f I*4|NtԱ wPg ";LݘL/4Z @r!tGy%4lL89,ZOiG4&i 2O."؋=t@ŋ2 '# KnѧV1TjMU' r(W^Q (Y9(DȠ6(+.'ؒ)0ɅL1.%ʟ~Xh6OG|@EWڇY@QW4!Tu!}XMPO( #2B2Qxf!C *-7 !vb!WKp'gFMFT&.ǰh9e~Ur'Rp6N]Wky}3I_z Ktt:\CfˍLe5Zm/#3Lk6j%ptЩ.nН!:Ѧs]t 2]$nХ:e!.ᄉSwʇs9'9f8{t%dVi}4ȍOHCuK?=wkMp/܈ ڢd% 5m_BJu3a k]VʧMRAK.!aNS[K*֘5ika]F&%D֪pmLJw`f 1D+[} )`MA$3!:,[Em&h"- JlМ%"hC?,7ؚ2 dspL5Q"A\ SA WF@A &F"ʂd@xc i)( gh9`dTdILD` Cles.#A#AXJ10C*ȰAa~Qo@d/2H[t&IPV.zSԙ?( `dB86{f͂ 'x V&'/t5S Sp!8%NPP< b(H! >MFFDD&QN)B2 % K$A=xk :ȇ-dq, @inh#yMA2=q~y֊B4)bU-Id"3V`ɧUF3QxLG)03R yHH+0V&]ZIM"L]L@D@Xc`юj7L:[QDX'@2I&< l` jz1%d+a,͚<eW J/() B8x iJ"+ VHá WIH Da 69! k8/~H;* \6?PhHpT<+?BU Y5~ZFL&!H D0-)Tcv[j1"%#:PM s+%p< ` vBkf2ɺO;@V6GbDn$!1 8_ 1ǐ7%_N͞#)q\99̠1~O9 KX0Ggq@b$CCAIABk)pa7V-nr[hr@QѣMxI']a6ܑm Zs;}W2afPa,\(v9mDLL?YAZ nDroJNif:P3LZ4&y| UxZQI#{٤i]Ufa07%P?|@6ThY*"EA`݅;rQ)Aw#H/ Np? s.:|S8Nԫ\zGPf~8|. svr TC!ri‡Cl11"k ̻#)(0 4\ l+#w/jēf#0X0B!Ȉ~#Hңȹ 4`) 8-!'C&{{CslA֒dvEp"*iq*IC/~*s!"Ы2kCCX˾pͣðH A1b+u& )ćDQDRʏ;s ? DYa=+ 4qR8 DID y@?PȂ "F;zd@E"8 ׃%*tٍ񒕏pC`EK>@r H I\)`:B0#ri0ca ʀ p?,qHF̊ه&駙Ȫ @s`̃O" ۙ8)a`ǁy<1H^x[XKL wh"w(xnB 3JT?lX &=Z~˞ɈbCɋʊ,O $ qKPŬը,,̊Ikp D}k@?x!>i \ʰ[ KO1 yxAS#9BXa O 9t A`iPShj-hI5k3 E9yI>ȷԅPJ.L iɑ\iēKϘJ ,lUpʣKAiJ\uMQLTҨϩ9Cn0@? LxZiFpQAZ&pVQQj!"aL#LЯV;@rrM$`&]Ux(5:3-%[I к\Cpу ڬy@҅hO ur4Lɔ 9ZFC=P9 1zPaɷ90[1((5k b}8&"Jt;VTց@Qg@h3XHCyX{<(FE "̅x,{]WHʴD3S82Tqr*!1)ѸHprQth"0qXpsTt! 0 uȩqPHuUjEXT-z $MT`y،\%.&|jQU@ażnɅQt۠jP(DzhYR8jĽE<oeuK5ׅ0YAmHpOӟb¯nUW鈜yph=%0FE͏ou04 [W4k|X0yX9X˂ H\2K'MEY]^^`:TQ1G%=W(zHKF#ूS˫]JcA\Ց(-\}5[XhHGȨ+Ѣ( K)MG MW хPYKW,,Q \I%BQm(ÛpCb;& EHR)a$TK 8 9&ZeJMEc꒿AdAf"c! Y(N)W=c+$,J(#c2&P0ULUVLE/a X!ȘX80ApZXYu]dbbLh{0z` eĶ%5eKF4Ae/G[%SⴣH&zZエe!>ǰkȻ$ ґAԄIgpg񇋦z[FiukudAv x yNf +hʝgtbiK{^YHteA\L(#鳄 =\i300L>Ƃj^ pZHܬ8gBz[ #sޅ>{ 0 O(v>%K~ ÂHdЅki(v.jt=%N]yخ`,2H;vh q8YY _@L ""[ W n:RbQ[ɶaBdH ͦ^m}ic͒f ԐF]x+9FW.LTćU@r-nn,]nXtfАX͈BXXm쇈e :AOaqD.-bmoS aoޠRHrVㆺ( Oߍ/|HdZ сXjqDIsV;:obih˖腌 fJpW&.XN&2ߒgpSc%t= TPJӄ{`A6-! G2>q , ߨtLO^!aK^DuHŝWb8­(y ^FZPXn,Fm=)&JTiFF.w$Ahyt`,2jq5X^q_elAHoT<&bnAG5 ?ZҽıEE{w6xXZhhw1~ʈAtLRXSp`@'v<:wq㴚*G@]ݒFdy4A JmWQBqdL"opKw}?'w/h،ziDgFҔbz#"9B }zf͟׻RyEgg;ß'H9nfCv0x!}W Y zHHhmxG,m{RK}cl'fiSmL|XzqA~0( + Bk' vЗƊ"Ƅjq:,!AfdHH!l,?2 aZR|e./2'P8޺ȕ-^9A\ ̅lϟ 5T?NF**ڑ(JaCf4Go!Ff{Q+VsL '-O0{?}A'tXyѥG^연لx5>jBs2R^DZ#zvt@ =%PW ,q PDq&z6{"N}uցheAp>squP >@$C>˅W%̂&LAؒ@Y itq8X'0υ9%H2JDGW:KH/d^ !@"X2P3O9rfQe*bJ7L}iV^Jvf L_S 9pyA'%sri擞FC,[z{bzb~$Prk(d.n1TmhfF >4Gi^Ƞ;O(f(Mf =,ղěc)Gf8:ƥcdu,)i{v &J9Y-H*T*թRV*Vխr^*X*ֱf=+ZURզj}+\*׹ҵv+^U鵯~+T =,b.|O}] R&,f3nUgǺ: <[)*HǓ0e KೌZF.*TK0{cmr\-mMۋ@',_(QCp_E]7TbQJl*,wd,t/oY<2wYU[%]֥]%^^%__%``&aa&b&bAc-dN&eVe^&ffXqi&hhJdVe8hjUEeVilla̓?m&ofeCak&qdaq.'s6s>'tFtN'uVu^'vfvn'wv^?(A 'F&MM'Zp΃zz'|Ƨc}HJ}'ṼM{bpU'B|(&gB8g^gYg^'9@hv"V ,%8hFdC hF0hFA~((`A$cЁ!hĄiyN.)*E*8}fæ*ƪ+Z'}*j+8c֫>ޫ+Le9A,,&.,6>,FN,ʧV,J+8d\lƆښɞ,zy,˶˾,Ƭ,֬,Z"۾[l2 -.)#b&-:B>m:-Nm-^mw.5b-fv-؆؎-ٖٞ-ڦڮ-۶mvJm`έe:Bҭ--..&..6>.FN.V^.fn.v~.膮.閮.ꦮ.붮.ƮNM.dT: 8yLkd<(FY̅S3-~/OTL$SH<Bgf%X?HP!ޯ@?-¨o1"?ELPFLh#W q%/ gR2'2((2))2**2++2,Dz,2-ײ-2..2//20031132'2/3373?34G4O35W5_36g6o37w73883993::3;;3<<3=׳=3>>3??3@@4AA4B'B/4C7C?4DGDO4EWE_4FgFo4GwG4HH4II4JJ4KK4LǴL4M״M4NN4OO4PP5QQ5R'R/5S7S?5TGTO5UWU_5VgVo5WwW5XX5YY5ZZ5[[5\ǵ\5]׵]5^^5__5``6aa6b'b/6c7c?6dGdO6eWe_6fgfo6gwg6hh6ii6jj6kk6lǶl6m׶m6nn6oo6pp7qq7r'r/7s7s?7tGtO7uWu_7vgvo7www7xx7yy7zz7{{7|Ƿ|7}׷}7~~7788'/87?8GO8W_8go8w88888Ǹ8׸8縎8899'/97?9GO9W_9go9w9999/gV"9i![$v"Z63Z @ Q:An:vyPv 6!S[޶R$S^AEt̟ PEMtRY̺](MO0izql!$ B-tz񆯉 `Jx@tdqe@TbWڦ+tePpA8# zHO~/bEߍD8R%:Z/w[^ RAq@zz e-Ky3@HhxGuN-jRઢPJx4iǥS;6 4ע8jI~ZU)SRNUZkP֮fc*k!^/L2^DG7cOAY(ia~6bo3(`='aNӅmu T߆`J34_@|T#E#T`g)֭U:ј=U94TӐEiϞ}VeM QGU@[$Qx 4Z(im1^J[liTt"Ax(P-0()NV >4+ȒF|iV'`QrD}&ɟCQ;K/$dG@#=eVԏ;C@f滯@/JRD-A4+Q]YUT @ 0mO<- =3?>gHQUG1N\]ɸO?Î-8\@;ы1F׾g-@Q)«պCtki2P/IyR !XeWJ@ 4?cF1d}14Z# AwumaomDD@Dp< /у{[.z v[3j7 _޺f)h4H*y9a|J8yCwm ]x8ZcniXTPTσkHA 0#tF!Q?q7B H?ځ%a(27`EKdtM%/Il@.zd1dV>Qd*3A;dGf)YKBbp, A8T>ee ao^1Zv(`TڅKtI6  CbIYYPּa,cl@he)h6' T$% 4B[d#8G](E"pe XAKy, S!m[C(.5&G xz^TkbUi*nK'LS+ "*F4h +*ZU ?ĚVة'hVs\ǢQ&J4 Oӧ8 I ubBGfoS4G?a^`$N:H/Ͼ$hiD'ӎȖu `LKt4?A@&9ge>6M5NN13E"`?Z*$8lkKd;Ta>; yVnHYBME)LZN pLsۢsDګ~9꨺u[v!Liߢ Zil^T4.߼{n"H`PNX^Gwdm"Jk&qG!RI/NlnD;fGe=u(3[xiCsX,IT{@<#. $]$4DQ$QP"̌Y lc!th=Wɜg:>ph9PJWԶQ/86mʍӲ\!tD1(2@'qAn dE(%*+qqf@(nE]&>Bx?~ux*|v\ %H{$`ś@&ّ/7Ò+wkRReF}1B9.5ȯ F1h%8BC $9hxw2}ϴ" ZPyL˔1 |YEL(P0"2J'>E'5:p^n)vNÀ)R%DS:V hc) 7'pQU.}$O|%&~ Gx!2A 5YuleB& &D0V:Sn39Z&ch&Qz s"Q(q79D" 0.-Cq0P1]iCQ7W5Cc(!wSVe6DQ(φQ`N5CB.UDxqpc6CN9Plp1}2<I&RZ"8<1H@b⍚H>8SQt'%wy=`7eM>'i$qQ gc'J*X!dXz(k H}X³!_j8@]h w@ z0 a)m's8W3i ) 7 `Jȍ/!< .dJ /]I6~0I^0G PMO/xy/mLaPѧe8FyzR1YWZA =U&j׀ VXkP~ F9`t*6d]h ̠›XW*~p* bSM?8F)k J6"|cHwvg%`j'p J%D@xQjY!*F]T(  ҈/JPE1A[Qi ;k3CFR @)pP2<*dh)d NYg 9E 0')IڀZ5 #9(Dwа]Jф}Qjvym:SQ`!ЅFQfRz* 6&y!}ykgM`7ؖK?r"H}Y²! #Q T/@)2@@ %.E>`Բ+84;8 (aJJ9[S˶කpiD,G%ou&)*07 Km8QɋyQ!jG(9ٕM k`zE]XQ;m6Sp O@@Z#yN(_ 6Ռ 21+_'*zn3{Y@APakЉ^ث z%6E^쾏  IrZzq, Sl0 0 ǣSPn%B/t(q'i߆RHE;:u_~]]h͋Byw5 0:~6Az{Xs Һڑۤ1 UMlH=Cl\ MḚՄ.&]?6"& ,<P`;vk@w~B(,_M|p_1E-/aq[ 64. x'Ǒq+,6܂-o9ZJTy~M:9-GE -8 7<V4 $=11pYsia魲 YQnF!u0̧(!E&L션0 (X;gHbV,a QrϜDѬ?4kM D>_uzmHLCDa+8Auɪ8C&\אS'˟Aynj7OΙz' F]͎M# f=f-mJ a&j/ޗaKuV-C -l7xCbdGJ<<%<=l#H9ew4T2Y<T0ˆPkKolY7z1zֲ31!}:p p`ՏxzV:K9}eB0h*0WYQu@P ϟA C *ԧaucxBG 7/C[QHA #YpeÖ_,hCѹTMRT?Q![~%y&C2u aD`5F׶UZ HP>aGZ \óMn$Nᄺ4CZ 65-ۉ(X`um3Kvj/UrUVlOko%HaZR{us!}`8q>Q0[e'H n3-9tCO꯭T8ԑy"(rǝZ< @=s AJ E:d Q!R+IvҢW)踸 =3H DݪZbP-Wpp{s,:%E!3se1 Z)κپ]o2B =ԡȻjTC)\L4f9r4 Bi 9M [Р;BN='UUIXm`ֺn}Pi}S-z5 @G-HN ̟V-B C:"'0Z{ ҟs:ۇ9/IT Qu8 /H?6]yW.q,V@mݺz!-"Z=#JQHX^2W M凈i)W!zHww;C9Hr#9>YH_aA~hK&HI^zĉ!H ZXfZO CԴ&'#UƆlxK3mCT "@tƌ-T;mI LczӎT N$ݱCae#jwIfyE;hlI$H>k φB˽Bx#'NB Jؑ@1ކO!>pŖ?2i¨x&·.DCBADI҄0RgOCGVd88E ^5B \H-=ЊrVFQ HUpSܺո6)c k O:D mLSjKIMT " D6^QȒ3)bV["RՐ̺y PAL qKWs`U7ddsOFiŭE#Dj<^l< ݗkgJw9ڲ 7Ag_}*AC1D9[1HFö;Kl}pt(({]' 4G %jAZN!Vз:GK\㑯mn't$(d!t6q\q SC,EKZlgxީP"RK]))Ez8Ë> H{1~̸ Hs\|"4=m2mx Ufu ^–!-zvJ4$6G(H=THc 3٦d8A芰!l)M,`n+E.xS$xfH [lFkkN+ [_ KO-R`.hQV%fZXx>mtq'& ")"~ч@#ٺ̉% cyC-Cu!Q^zK)EG W,k{zbڔy 8>nvۈc-O"%CVkvcR M{cx .?I{ HͰ!iS:AM>h72>kk#Pؤa"@i;zﳿ ?1(R?ۃ'03cup)•ɕn먆i[x˱Ha" 吮邇# {n$)$TB ,(‡B[B? ̉<,$k#B th[a @ºC(䠈@?,FGU H\8ClH7J@隥DPTDENLL|33R%q26ER^_`a$b4cDdTedftghijklmnF@oq$r4sDǜtdFtv@xyLu{'G|KHǀ$Ȃ4Hd F *ṕw\@6dd3.Cv]pBG]FK䱭NJRO6TQUvedR~YNdcZeeDP[_ZTaYa&cXcFeHefgHgikl&`n.ȅfoyq6gl,sViLuvgglwdygb{_}Ph. 6hv+VhJvh[j臖芶V܍Kf)蒎Zˋ2frDh霶l i&6j>Nrjn8j1XL&벞h5Vkv뷆븖빦뺶&6FVfvdžȖɦʶ&6FVfv׆ؖ٦ڶ&6FVfv&6FVfv'7GWgw '7GWgw !'"7#G$W%g&w'()*+,-./01'273G4W5g6w789:;<=>?@A'B7CGDWEgFwGHIJKLMNOPQ'R7SGTWUgVwWXYZ[\]^_`a'b7cGdWegfwghijklmnopq'r7sGtWugvwwxyz{|}~'7GWgw'7GWgwy}I1Q1QW 'X^/oXa0 !Ǩ/Szp]gu64Qݦ/|pӜ$K/LKωPQ5I%ȒO[XuԺ͇Xu S{Ȋ`X>zD_'Kt/SS`NXTw &p_Tztop! ,W! ,O(0U*b $Cͬ=Hŋ3j8GB jȏ(x$I +,WIT4mɳS@>JUGph#K,z4M9Y*2 -2 T`߳( :Wk.jضjܽ I2& TWkތ2sF/r&#h"ubڻLP(]~5Zwp۸12 o Vid"]ݚ! bH>Ҕč438S'PbQV!8="_U( +Hԟf4aaw*[멇҆RE#-e@%m(c4HP3iaCd Nc>RcQ8d͍SUs.>LPF$r&zw=UY#4"'D&Nc@1Jա%⢱9P5@ܼIOICbLiѧ& i)E D-`C3?a <1OJ4F\hbl@?0{- -IS<$.Zn6Ʈ@R֋Q>ϼkѾF'z[N: ;;Qk$ i(&=?ؗrpե@XƵ-A0tE?i0RKhVc5^P#O|EPČu-@$of5Aړ:u'~.ix9Ft?nێ@ pCwJK:AG;J@@dv {EuL1v|_DKZlP nrc>YhKNsFӓ@Q!k56 #c@:rduߐ`E1;jLQ@qMdp *4] -]E j2GHҷÇcPbbb7MW-.TBo|bG =$bٮ8"Ċ 9R:sPF} )~f&m6tC^H)fȩ.(vtG c-,YM 0 qR'BRdT"'j̣撦ҵ18;M;#3)Urc0;8㒤CFZr*aP>HζH.Ȍ5!Ao:E%6B˿qg'ta} s"Vu kɳti#Ƿ:@/CB Ƨ0/`uz1,q+r5@0tجRUJFܘupAd< @}݌0˜"b\<%YE<0L+)6d'aȘy-A!fGÕ4 Yq0-bR/MDּ|$qHZ!H2Ngd4y!SAA<;( M1N(L0n!㞈<>ar5]Y@~1qϚ5TP̺@s Y-oSoE ŋt"0N; 5-k DmdvAc9>#xA|U"èu`bH| 0txpĵ|@ L!Q;wFN1=}Y{&t9G'0X{Uvpw]N#w~Hc&&q3>$4ccVW}1Qzq"V}MguW` 6`T8qgJ' Q4V]OA"@  :H5"o ̰ (>7 n!Q0%qW/ip#V,s  h V_; ?TaN P?3 kx6VPDsZV0JgAEqWsDЋgK 7k\Džl|pX0 Ceԑ"D1HOH^<(q恎,8jqaPE<٠f5' piH!w!F RhExTvH Tt& mƸ+)1bs3N_9AQ zhNwӏ7 ZP' 3PCO  %TX qQQG%E ڰ!Rhq+NY`Q5iN}A1(Q-Bم!kH(p kFYU阷 z}#9d9z1𠃨  | O1{v} Yy'}V I,`E|9E bə#_O,5DE,uE^!e)d!$50WTp,=hxgIWZeQ<(@cp!?SQ 5RWE)59LDv)OzÉ8GLu~"!OE!P*cZԗ:D8vS68f$ĸ!z1MEEV4*+:YTlN#<2l[J/YA d yŀ6 {{وqB4=$c rZ;#l7͚#5TT{?ϸBlFS ix6>Sw#wAcqOp4k1nOrmUq!HP Ӷ+êF02wQX47#X0/}ig#.vQ}ɐ 6;ʀ4u1 ` 'AiB^+G}c!gȂ꒱))۵5ypNh"@Lתɣ+Zx"11,KW'gȒ7kIWrJu^Im13}xZ7n~}9; ')I(G /NФ7 w# ! @Ր { FQ:j Y0%hb9Rqk/%ghPLkNlqwcҸg;&g[#,C)AS!%` $ qc9 oKRPQpDтE1wvZH:"e,Ka4l}Ƽ+Ga  kᤝ9nJ0L8ЂC#Hp'p"wk'EmHJƣ,3Z['P{U&.\h`gN*蠈iA" psg0 +˳_$<9`Hٛ4L["\!@@[j:~cG}s.Kv0m+fț D|Z@DTh\>q T0U] GWg 'Dl$Ee6eU}m+@LawU,/Кc 1'`\u0Mv7 Հ ΣQDvhKK&u #5c\2M! wкU521Lk0Dyor#|rvN09bq8 <0ܵTa/U7=Y/QZ=&U@UyE[H&qC:VG^@pJb[ÜRMڐ %;גxHx_2bA&̀)W5#E,: y7Ya4EQ:[=u MR #>1^t0=V{w}P 3/=U(E;` ݒRBav. {C LYUVL[_ p%Q^m$1P0ݭ[ S`8[LnTFM j X6FPp]Wm!./>uq7f>98Ihd CL..A%fK||=Hp 8c%K%)BtK &N>r#e7D0,L(*(7qɭ-9QNbbn$h( @KkEa njWqKHV ].)u3`ch(k$.n"@ʚA2yo"M[`ڦQqfSl"n>- !}>Q>vWG4c^v4<q9aTaU^^v H@ 37P @ PXfםeQ=dPgF SO1D {c 3P:+x-I/Ua ]^Oqs!/񡊼dqDvCPG~0E9V2i no37!k37Jn5#|~P>;Dp_@P!o TC _-?p^}.SaL>34mQ4cOyQ%[ s-,!/ԪePB >/Jq=~џjfaȎR5͡D),PB%H%h?5 rL|9j-@HE EV-E]Y - eҲ6oaж \f/7TeADSLXzg AkٽVJ.r +䩐q[o)w.tmJE]iOBrߛX|{_;~ï x+Hzht)Ab,WfP @ZP6ok! y[rSp˛l讅tI\ im+h  Hb,o" 1 E ҰLn' D'l"#S|@.-¡ 9'f[DT6bpy4Z,H+$ñ#EਙkyδC\@!2-(J5eG02Qǖz xyF#Z(] Rj* dYgiUU>cuTZ7]ѠAVXtdm6$O [r1JQ+ :\SAӠӄV1W&,.JA![HV1J^R㭬a!OUx.lr@PWb9?آNtɏdfdNT釖i'=y%Վn*[`\6j'9! F5{Lmؐ&Vv*ҩn»ˉ9t[sHtH=Ɛ1gxCF+ WeVX (9`B85'e&a _ٖ<$3 8JbIr2JXCx4I+ИR!%.ˆҗ,bYL+1-v̱Bf6Mnvӛg89NrӜDg:չNvӝg<9OzӞg>OӟlPԠE(-P6ԡthD%J΁NԢhFYj!sGQ#JEI-]NhHE Ғ g_ )>[uA| )( J j@lƈR""m + 1AdA eP9Cxː!$% wm 3XRqty`$Hyv愣pGxp7x%>qW__{M\mEWǾv;jwv]3g{w!79w$JQ5olt>C7?zҗG}Uzַ}e?{}u{~?|GBE6O"|W~|D}[)v$?~k/BGA?a_w$4DTdt $4DTdtm?A!B!Ȇy8 ӈ?A>0$ CdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklmnopq$r4sDtTudvtwxyz{|}~Ȁȁ$Ȃ4ȃDȄTȅdȆtȇȈȉȊȌȍȎȏɐɑ$ɒ4ɓDɔTɕdɖtɗɘəɚɛɜɝɞɟʠʡ$ʢ4ʣDʤTʥdʦtʧʨʩʪʫʬʭʮʯ˰˱$˲4˳D˴T˵d˶t˷˸˹˺˻˼˽˾˿$4DTdtDŽȔɤʴ$4DTdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()RO;OL@7'!K1?r29fM2d eMQlOQk-3zDKiFnz#!hH,RiG*O=jFk $X+?8g*i|S2 @[BQ. ěbjߌ4FHؼa>Cbđ1$ns0M"w4L#"^E=*^RqbyBLLb3cҴQNd9 #CIkH,yGE"E,?)E`O>SldSX%bT#H2y"SeHFz"2ݬ)5l>"*\gn,G$<!yЭghDF4eTμDax` @j(&2qsC3N*9ӕ9A >ό 5EO4gh $;9%O$vJpQL`$D#0J]xsO^R*G?b A%DZj|"3SGbF ('8‡lI_q&h4E\Rz%UYHDҪAhP l( d+5BZF+H#- Hц>\wq0]t #sEcaZº~UFx !b m&Y(N 풤 +G}Ր׾Sj&L_ !1io­SStt-.AjvO2XSaBA(Rt/$Gp#cS Y D.I]6qGYRd4 qR x/ 囔*$uHe$=әrl4ȏ\9kS=d8!q| ۅ':>m\)GBU4[ZM'19(|k6@Sc܁ T30 [05I6M@_e^)VSC_J_d@+b0P@9t^ߞ3*m;zr 5)"߆mJ? I5gWف+!bhRe26|D$Fqs+c)|ï׃1x<F'9Adq@ >0KA8+od! C>R߮0z$?PGLEx]ѴPk|>Κ*w&󆈲E&9 *VRs"qNd&[shWhaxoHhtptć.*uC&]Q9q(K ckS42`HalvQE(G˔5BFD!(!Hc{7<ሏi$2W\7sLvFe+Í ؂7%![=@،DM؇$8?c|5[6@zaQ$An7i&hR Km#ѓ'Q8XEGyc&}`&YwL!Q%6A| 8unAe*0$v I0'%OI狏:Ikis&u!cF[M/K/'gMљ8e4Q1lSt[v %y49h뇎^9'C}GW9kv148DOѨ8)Q?UaL( mA2ǝt?tms6 l!HvCyB\|@J,2G7mi#PfYU5&*Fq9Ab%Z2u Q e  8 उ|0@?^*ʢ^FhȠDZSVǞ{ Twr.3y/\% 8@FJ?t/tpqh fp!}N P$:F6%0Sal&ezzw&h[ا )L,@9 X/ D l8Q&úG*nljZw8Dq)q᭥J3XA9KL EtTtXN*!3>eV 1> 7OlڮUpb5Ltt7 EJ40an8R߹]sLBuz h GKI` Qpj+x[f:>9A|yb@REA=)CjQ;6pĮD cPu:y=@@6:ȹ+[ħ@ewR5;{A.92*[(3cf/J &eS9[*T)spiA 4[IT8^D27K f$ׁAF` i4&|JoqF-\T4uMasBKw?,QI 丬)D<⾙ $o Q)[TkûMX1eQI$C3=i 0 Ky@$/y`K190ltB}MXF-h]yPSݕ-Q ,R;Ylݱ  "#EN`V'\b: cjSdn4}%pSƉQ8'E:swqN )ӿ1>5SI N:`H)[wzd,eE^'H e]D)nBv#n9 I'_K&pAFAp0rmUm0^΢w^P64*M?AP L#+8 P!&QFJs|1Ұ0ڴ؆J ]NrG#.!J,x8 0χ1N= #>!~sG0USa- .AP@ FNu=-T I1@ -q)ӟLc?]$9&1?3_Ja *F a8q2ԵM #N7n}l ONQ^*a cX ˓ .Q s?OBO`+NA 4!Ʃ%2->fm_.Ȋ$A'}_?q X VoOe oāQ"ą>q`… 5~H%J吐FVS23H5mD0oƬx&G?G&(05MS2J*eS9peIM~ T[օKALeQaQrn׺}mDG#t.cQ4ͻeMsO1GLsN!@1? LsB:TϛONP@PE!Zd KjROg#T?Q\8;'T `*L0KHyV\ttԤDl!`U.-RRZ[!0gHud) 6^ئPaksrSnr\UlSrRy?et$$5*+XMr&0TZD:8[}V{ $28Ђu8ވ;a5[qK @|٨ "jxz;ÿTj[k%r$"gԚ{곩z=S3e$3mԆ-֨'ko*&pGx'xG>ygy矇>z駧z>{{'|G}g}q( y?#7rЀ$1LD񳺜 ;`%HZ &AgaotЄyV"$k'%~ya u g GMp =a'Hįp LTby>$$Rb DZ+YŏTaDcF($hc8G:юwcG>яd 9HBҐDd"HF6ґd$%9IJp#*INvғXPrttHLiR.+eyKe.+Uҗf(QLbӘ14\.ә3+F,f6Mnvӛg89NrӜDg:չNvӝg<9OzӞg>O~ӟh@:PԠEhBP6ԡ(1щ}h(QhF:Qb i!҆n/G Ԧ7iBҜt)zzПt-PS5K]( UJHJZՁLu_kX:VլgEkZպVǥmk\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pۂGxp7x%>qWx5qwyE>r'GyUr/ye>s7yΓGD$7_3KڃU$!Lb a@L@0 F0N݄>f5@]6uO"(v"zF "XaזӦ CQ;#.VhF^B7yf?}i֡*;H*P=d?JH 4GBiqZ:끶]@Ds -:lYz,t3?ܢгFTJT)A;t dO>;NT jʐ;^N;&0P`2 Ou!s!CSQ?dO ;ȚE*iKQLuk@xӯcNpb㍚#M}e;3ֻ4&։vPCQ00FX}%]]Q9];K-N>CT:o2ItEj @ t4Ckv\Ä|#lg߈RQؕvI1 T@ʢu_cfr;짯U1̼@bA%u\㋯Ϙ߄i$zHdr=։X|Wρ9`RˈRu1u)4:g"GW /tIs szЈ=!8齏QHEPfOK$ą(赊0&]BV$a7RhYA;v$;11m鲌] =WBUU#.\"9I?rI2f#a q Ja rkyiEJ# ~լӎqHKIebYeȔ+Q'_yB%RrqzKVI@g}R2 $@ DaR)?s"{V.$| D hcueB-)G1ZT?J4\IA r td@3(Cq -FZ.h եF<6^0+34tsUq , ܱ.1a{qEJT̐ 88#j&G|xqT<(C6ȗ#'6O$;KW6^$xB  :/KJh` #㊜ V̐VV V.; Ȥgz"b+yb*%F04_d72kPQ#]Z*{:*T:2H|=\㼥maF0k JDtk ػ\o~@!yir*@plA Ȝ4UgJ%2x @,EnSc~QsF$߈.ߎ-dXy¥N[)bAP;BN]k6D!&,F~5z3,JJ%o0u; UlO H' ~J* FA FO$596;*qo@zx.hbE%u`?#5WXCr3}l!7֣/8CVt┹0x@0"W?@ar 26zA dH'F- ׾1 a[`x eE{ʷL x ~|3RfaַyJ![)BЁc7ueU9a w]`zM!ztŠ8M}M$t!PA0t`?q*+4&0+Rrf{V}RF6s*[02%[}ry}q|svl:a|1! %q:х1V vP h'|8BpuX']Avql1~-ysEB hHCn(v"Z5wqfrbQv ,E2ny~7p !Ph/OwWh(dFOyff`'`k tal@AC70]m5j!: i& P w0 0 0 C!@)TO )rfБ Qptq!hQrxx>Fv@ [VX{os48R1&||uP+HUD/`'*P<ݴNP% zy9@ )G9!'0| 1 `Q rUˆ( wRy+y8A{0I2h"`[Qrp,4P{ՐAhV.2_UC'[3?x_>PPŗ h-8#h0  ` I))!*&H uJ80v k\1 [ FkXqS 6Uw**{9RI`t/*S>:/r7P& nDـQ$:j ,(MW t E5OdB 2` :!$h[c[jW>XQ W L  [)Ioy:T&ВL\Br :!=KajaY`cҦfC-^hHҕ1a|کVrBWyXYHlz؈PZwix4zUXlc§Ԥ QvbSv9uQC1y$r@AlF/;zWZ2.eݪiP3JhjAzn3B9 "Es4k]*Iv7˕T*pyl&wr @&+㪰J k{l :YuТ B/vd5r]z54#n@4a dW߀ 38B+qC"3;!G@40깷Z*g2=P c+q/hنP!a 铹?aks ',8XՐy ;# ܢko;;- h&D a&˦}EES:QtQb21qxS11a[ve]5@m1SS.FN0x0bWa 'e(˱K;!;lRp1,Nv"  FP bZaH,fN/vA[ڼw@z}:k>8' p pޢp5+!'d^( "FmJ8!h0!jM% +b9e.7v Ki߀1]4p%mx)}GGl}cqv2¡ٻR+AC /ץ $$## pYC# @MS# q$\ b?Sq 2^N@q~=ý̀rz;%Pɛ (qEw 1 ?@C/^נ>W.bd QL$) kR$Q>ށ]l9n7ΡvnxNECA 4Y> 9wqlBP.8m%Q jrƁPc&1:R al껞ɠ}"(A  0qaɾn.qU_О#~~NB)i" .ʰq ˑ9*^ 1z/8n *" .W2Q9Ҟ^T%V*b ?N~w;QD-^ĘQF=~RH%MDRJ-]S&GR3męSN=}TPEETiDRMk6LTjN Yҫ?UXsܺeTZO)R˚sX `ޜ_QUIjLQolpF/|-Tb66\sN:3e.꧴Ϳ;JZl: \ rm޽vC uIeksl0GpխS'bK[ݲ[SN C$uy ֯X1nK(EZPXd*j+"Ч`)멚,bpk\ GHLǍjRÃdʥCHHQIN ɇRi ICH)LĔΓ' (L3;M:eB,S 8WOA%PCE4QEeQG>IRK/ԦI˴SO?5TQG%TSOE5UUWeUW_5VYSV[orV]wW_6X Xcx?eYg_'Zi6[m `Zom%\[jX\w-w桷^{ ^}w yv%m`z`ab/UƸcUXa?&Ι 1 RwЍ6a9蔋^etqy^Wv)zs^ZZ F;%zWZqޥzqr!G YFyAx w 1?CsȁH޲&t{bF`ϡ~ޯ_'IBH˜g3 3|p~tӷܗ\`@@`Tڑ]Qvੰ`8cem@87g8x <¥owq%ocٺ7B6a6\Gl.$ Epd8P4* ~xx(o5f 0ײ'2,!NHpzn aJF B@X`΀l(8`sqP6" 9q9.u)Јq qh@7lljdc*/Ƃ1y# x@ j&R1mPIIlr' c)gJ1R4+ײ1|a8zC9|9ppe# MmMkbsĞ@I'ghG)iNtvt_v@8흎@7p/g`$fLhg8p8n@pG]0'azS;qH"rj@3cu68r:dȐ -pc$`8n簁Lc&7y$HrKd*W9#Q򔭼e.?Hr<|a&sE dوC<*q$Y ~rgBwtb@Y?hJ39ғt#|iMwzEM]Nb#bԯ#Vַ&q]Z#Z8`φ1l0IjP .8@0wBܱZĖ2Bm\PVK@ϽSX:ҬH9x%>qWx/W b@z `bMwlfO"d[ _# @)>tGGzҕt7}9g>u#ر] < >vgGYuR}減4l8C .ב |?xvAn_>X{{}E?z̜| yK΅18?ǿ?|G~|7χ~?gTG2z>cƿ?}?y dzK?$ۺDTdt @>$;*??܃3m>c0Ddt,@K*@sLC@k6.h[0''*|+,-./012$344D5C$ ܾ!?C8B$ cx.?@BA$B4CDDTEdFtGH-dC9ÂC#DBC=)7y eSdVtWXYZ[\EY@=jF!~1<d<TБg#}~Ȁȁ$Ȃ4ȃDȄTȅdHGq @C[w,ƙy E:0,ɐɑ$ɒ4ɓDɔTɕdɖtɗɘə5BHNC@x4ʣDʤTʥdʦtʧʨʩʪʫJ,sILIs;D@?Xt˷˸ ˺˻˼˽˾˿$4DTdLTJlaKl)cLF3`˼lKM$MҬTdMtMӄ|Mٌ֬ٴMMM ,, P,ʴtIL9`˻N$4DTdtOKɼUBLIPLK? O>?1I(*,ѿS/-ҽ:MQEӴT,@KTPU?@A[]NCTEEFDՃINDUllV,S `Vg-ShgSgE5RgVlpl%WWpWsMWNeW&K8'%Va!H<-K4PS&<"2US9ˀUS3MM!eSE,uSl,SPՅmȂ?xX9j7]nmTWtrsYYL;BLlЮֹ}+P~lC(pX΃V-6,ZmPSEm<"XՂQ5,8(جE(("[ϹMPNy})-`W,"8,@P}O O[؂%U\OU PUmmUUP5VLIU uELȵJ%]9ؽC8 ]EQ]S6(ju[,^?`XT޵ G_R%ZeD};R< \,8_ OX5^- S۝`a \X9`h?EV e}^fffi؉u޹d۲,ceۉ8=w~QmE ?X eUU~aLFVŞg c>eFujYꅖ;ph%fgf`F]&nvmn~穥Kf8&xX&6FVeRςv6bID.f-.^mmNFm&vk}|ac]oVʦWB>9@deY߮f /oրdo+P[ gwo&M=^ yܦe&m.n~kon Vn]ZfnN@_vo.r掀cx?q6W&<deඔpVrf;r6en5r@sBq>@'xNmC/IJKLMNOtK\2nGUYpos$UYYeu[u\u]uZu_u]\u^ZN8bI8^aGjvbvjlmvmnwnXՀ>U0sL4qvs:svhz0||wz}wv@9lmphmhg0plghjGs`wywwwx7wmeW@j0sx7zGWOgz_wzw{_FxngnSYuxG9hwvZc6Qq cHtğ6wI;x[cH{g}Їp8Vn_Aڟw |}|;}Ly`c[Gw9puF=o_y{wx{n}އVc@z$wy,h „ H%QR3,[6pΝ#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:w\`ѢD  ȏ=y̙SjDy+01?umHEu"F=/.lحOB2T)SP K>r5,M٢lT,7bݻ3n츹5ܺwwA=tiӨQk`ȿ(o9`36Ce5j/5]xin=,|q%X^Sd{}%(`s3tV_}Ŷ^a!!8b|טq%f!xG[!֋$E@ me#;a$"C7[|=y%Yj%L&2qHBX0HpqZXg`CXrG f pa-XrFaL\yf:*%4ܗ)? $ApTp@I`1aUe N8Gf êц!.Umr #A $Xjki{.e~aH&.3d[XS0tfu1AF(\B疼2-L/ Udp6~8 T!f-Rc]Q5OEH\LeY{5آ SsHTpGI!p@[0;?p ]π[[!;H4#\6L7 LDqVMSm֐8{~;w*~1k6ڤ HnL-֝՝z5UN={تΌ -2 IсUln]HVTWϔ}'|uа@ I@񣏸 n'y 2-B48Z]vK! cL5ˁGW5@q0!(~GgC1|2\6ĵv=V|SUC)/iGH4d(/Ht\1>b(Qw49z퍶# ): ܠ & !+mZd%-M%bV85LdUɜel%,cyO*P+{-sKl 8Fr.\*D&+C=d``-I*U&\q!H8i7ٙ#!F&? s%  0 ,c7OB`& m>58y01J$  !F6aXu)jD3Tf"$Fǫә4%hiUdwXrхN(8Ž"@!U1&ctVAyc4@by )@ P G6ʲݬd.ؕ D!OU\HÝHpYE!um8Ut|UV9iGtK` Z~C\s![}EĈU51^e XE4TV bV́! . @=P6= xd, @* H6 ỲAԙ|D XpPzjD 6E" a%^T5M^m#g4p~^.@?5v6r ڢ0.dD $\<GJHXB ؀%H8,oŔ< cL=dV:ނN8  =6A>VB80 ;m9( UHoAQ$CO$ ИŔI(ID VJp!9 ;^(VMœN(aEaCdfacV<"yZ`"aΦ&B҇偀[p7kD6X 'L4 m.'ئ$LtrtAIf[h0v(#lw2'zF$-!gk4iegnh(}(hV(BↄbZ(6m(BRQo!ncBGM::\ntFi$_HꨑE~NK_)FA)OM h= ..iiLp!(VdI[eߙ0Df5IJfAG7%H%|DX7)&֝&1b}LT`ԍƞ*bhȧRY6j@Zb@܉\#XVth(қUWdim\.m0ż1Vt@?܉D!R݊@8(g,Ha$;Zp'ǰɮ@ xOu׽ehpm` r?<9,G*|׬I{lfUCLeLmٲ@ o5BYC@.Հ_n,MX3?ߊ4qŅfVR9Git&tFk/VVq%MgVbPh"*< á̏Y7kfxmuvqƞߦL58% U|: eF*K: +~I;/Vq*jJy*$Sy?,⩜J }mtz Wd'*`юh!hO%:AmUl$:Z_{GUtO)D,RKXW麲6z{/Oi>U3P3@`)ȟnfƧǫEN>*g~mv跩^~>S)Eƾ>9徎>;(2 /.5>?k(W,]?f?932g/(??g[(@q$ɒ(Rn{-q͛bE1fԸcGA9dI'QTeK/a\`ѢD ȏ=y̙"јG&UiG "T!DMfպkW_8͜vthQo >8Qn_<)Y8u TQ!GL7]zJּsgϟE6X-V:&eSZ˚vm۷qⵍ>kx%yswMW[9vMtߦWX;Ǘ?{tԁl{gO ̾J.DʿdkP )~;- 9,APIԯ9YQFOL0 gdEsGkOc1B"LR 3LOI)Ir(C/;2EKLSMļqM|S9jsH:=TN'O@ -?4AmэURG#%*>3tNE-PMtPTaMXk#[Wlu^-`df[i|ڿV6l >FCPH@ŕ t%vZyk{^W_ݗ| ~vpU#~Xbx-Θʻ;X)IHQr1;SnJqkeZ~ݜ/9!_v64=% K\?#&iDIeh8x:l"E]MJ{s:۩MIooձ><3Z\@szG"?o]؆B7H[L_W|_'(tRHWqdă_ۏ*kÃbŴ"Ը LX)d\ UV U3]0É7~2hϦXr\sbVd/&W]b*bcQzSDMenj X+Ey ^<ƎKU7ѫ{q(dÁf@$ËE4M3dKvGe.gRtMaIx~XSɇxYm9UD_(b7#A5H=בSW]%Ѐ]@:/MFDʄ"ZSfĜ^4$G=_đIgINz?æyvgj7>#Ѡ~Z EɰΗ@ )fnEN; Dj㌤B3Pr |ެ|s({@.[hz٪i`Λ'-hZkzDQ@r ;X.D8*Aj4gy::vĥ& ҋ@c 6V:I,~sKQ{TK)@n+И!cE(c^E1oCO =QlutH;56?k+?^@erIoLtwKk5zXܑcFx|7es\d8G/E35>I.(h\;΢9=*}uޅ“u7!nhSu%Ao h76qYg"@D}hu~E=FR\qrڅ5i8 GHQPsCrdiyGBIro>]I#SMt (@#.$ sX>,' 3I SH "H0+da5ļ͐ yG݌>ꐇ%HX&G3#@K'9pؑ:NOH. O" $O $e 1G;s#q FHBNCNq)A F)Z d8!)aRHI$Lf"E !B0^5$ %!4ZQ40@Z1A" iItS$  j,0%&6&@$0_5U愵&% | d +3J7޲C˫ʉd(d Q -ѹ iԉ5A wxW)X"C@ύDW B‰t#G'Ԑ;!:JpF*e09^qRR+?8”E> Ri Ny[L~DE<`tI0^ߏ?͋0' /ULOT1@W@$&,‰5"Lt& ^)wLydY@nP">_ji0&s33% D$f!-iCm6~zkp,NW 2L3/iFS7"KDrHe ]>QN zQ_X}\"ߔ6k|Ϥ&\A ! 2j-:@&Qݑ;g^%,߈%ٕD:ߍ. bE Liu"E8<8J< 9z$4<_ۈDZSPfL />c%ZD.Q[),ڒ,~$%'xVE~IaHbmq1Lmt 0;'|$k t b#=ň6nLՌ/`5O_HL9d9"w*AM8V"7FQ&LP^Ƨ@$Q~1闀}&"c~݅ 8 jfK%q0ч|7F{ Oזy't`Tq_!Pam>GNf=P $ j@~# h$5t%q uQ WTfpJ `f+ z'`#sXXKBT0cWFp[!:_u6xI=![xmlEx#8WT%nyR 81TXifH"N(8&pY 2ak!U%GUwVg% H4u4 &lIъ0vByt`tvqzCɘxPrX7kpP!l¦^MqL{!3^sV!@hplx}Qpgd(o2X`Y24"& s]3xQg(`Bg1 nj  0bVHv`!|jYiD!pXAmFD2Fw)o"|ypI?6  EraO'o.'&~M%6F&I ڨK F"80 i @Z_8@7;9G@0iʙi˖|oBob '<`YS7 Ā2Y"@pa'u*r q5vs~ 0ZAh@;&!  e<ȴa*`O&HD ښ :T2Q>("J7 'jr%9RPQIRsAwӕ*Ѕ(6N/0_vY5gh "I XL:M ja`i 愶354P1rIo(23AF <\<JݰZ(0:[ PE" o ]?@ 7p ]m3.Q  0)=ى;,}j5 iN~[̇ʂH}/W!'TM7jbGҥ P1;*  Z4]Urb`aO@ Xq*Wdޟc7=Qq m}HMW(5J=-Ն!!n G +)JA@!+` Ҥr}K%B0RݵNAQ ?$B.@`- 2LRc'-;N4O{FX.Z7P L1o^ (cb:j<^ hP)`U}n:E~"8֑ b5z{;1~#)R..hNO΃a$(! -!L c3;Ď ]IJ m1՞W Zߣq>~]ڎO%t kU7 0n@F>. \.M^X`#MoxUqp u>CUp0n /_NE'aQD-^LuQFdXJDRJ-]| RT'I5l&L 2㌙=EpMQ:EGj^ŚUŝI Uc͞Zmݾ dǮs΍Vݼ}:7+ Fpbx1㛩3憏RM2gbA.Zj֭][lڵmƝ[n޽goōGpʝ?]tխ_Ǟ]vݽ^x͟G^zݿ_|ǟ_~i$G dA0B RpB /0C 7C?1DG$DOD1yV Y!N9W\Hyr'1b"ڑESd΁!#G('$8'K,H̃ƁrZ4(J7t2N9k{3ʁM" j' qyp !3ՒEI%RKY3O@s 4" wFǃ$"6`lRYg E$,O.T?&bZDp'DMHw g67^HMT9FXF N à~D3Sp4eW^M MvTVr .wX7OH9>L1yNDljUfcD= b`cCddI  @zF=#2q0b UQ|q`thvHx 3Q4adrVT1(Q+H#<p2>gg 3Y&qC E6aVRP3lgu%M2o}r<S܇'^vk#ʴy xor>|'|G?}g}Yl~~?l jS?x@`8#. h@FЂ vpzd=8܁$DaFT'&?6i"LaÁDhu8D0141HD"\5pFAE.nbO8Ј@@'noOY HP6R O 0n i15ȍ$}Qǎ] Qr5.1qHMj$C`"ˏY5"ʙll@_07|jU1;(.}LȒ#+SqzE-Vmb(.o41oI,j7sh6$EUmV7ennc}kWׯuaMa}_sA'$-Ʊrmlx!7Beqr͝:[!#ar' E0okp,@A| `oQ2T8xowqE쐓|w7Gd4o9e )gBFRHql|0| voC<BsSmcWxl F`f EtV/Utи~m^m=^E.yE@ێo ^6&>r]mmM;o WV"̦S}X:#&z v4D~^2Ms8~+#G>C1N?B ̂ؒ?4 C!a4d6DcJăOPEADR섁X;LHl{D+H(-POLH+ULe ,P]5TPY= RxSaM/bmV[[MPdPhpMkbV0/\vr5gmTBfm Ou|P3n=TzUW|]W}%X8eb_} %CZXp-XIE[My]sMWv؈:>%T Xz؂XcmXUumVW-Y5bi}ٚԘuYV ٝTՒ5ڕXԣUZHڥu5٧ZhکZLڸ0",ZRuTRZ ZU8Z,YHZt]=[I[5[M9?ؼ8[`ٽ\CTX# BK{RrظܖMֆqUVo=ۯWVTU^! =Ν[ȅR5ע[dVQ -UVO5wdMV U^]=\ŐS=U]\TU]RS^]zgmY__]eV퐎MߐX_=_ե__M]_y]XM\%[ؽf/^\"Ӄ&` ^^N]v--RֵW n\nu[9[ ^ N޶U fX FPa# fbn=Nu Yv^'v.bI^ _)X}8_ V⁥`א2bFW.߲]agu^5a/6[IVmcb%d^%Whm^-GFdD> J6>VQ_`&YRdUcTu7F\YZd[U_^Cd:qbg`Vd`XVfKݟl~de. &b9`YE%~qn#T{`hf8`|~}]gw q&1hsF,w n})܍~َi搆~6OBi*g޵N=] iiΘi(^㛆>iajF5 u`jNP[\:MXW[XV֫gMt6Qaf.^JQegRvW[fhmvjaTJUl6!>>\*fW>'v[~ǎl'6e]&OUjh^vfdfebNveoe^(mP~n Vitn8#~_V~Ѕc,Nc m픵eUKXd`fL-l}%fֵn>.oNFm>ޮn-fp-7a:vNkmuoǏ >6_>?ewؖ!^mGr] E]3mjn.dĎY5=crx-db%_*][g*qf+`^s^S~i3:.A=gJ!oe+ Gk n>_s5&fvE(Wfa.]uF_s瞦n.g~ tFu05?ugTs&.tm]> uv>7fbWjX_nnuNVKbr E>w$wנ~KF(m|(xo@ڌgSxy#gGyeSw'7GWgw'7GWgw'7GWgwLJȗɧʷϿg1)ԏF c)ߪ٧}J/Ф{g*e9WYJ2i,й7~ЃG퇖kQ->* ᱪj*¿7M'c ` „ 2l!Ĉ'Rh"ƌ7r#Ȑ"G,i$ʔ*7f ʘ2gҬi&Μ:wI@-И1J2m)Ԏfk*֬Zr+ذbǒ-k,ڴS-ܸrUhjݼz/.l3n^G1߼̐7s3Qˌ@.m4ԪWn5زgӮm6ܺw7‡/n8ʗ3o9ҧSn:ڷs;Ǔ/o<׳o=ӯo>? 8 x * : J8!Zx!j!z!!8"%x")"-"18#5x#9#=#A 9$Ey$I*$M:$QJ9%UZy%Yj%]z%a9&ey&i&m&q9'uy'y'}' :(z(*(:(J:)Zz)j)z):*z***:+z+++ ;,{,*,:,J;-Z{-j-z-;.{.骻..;/{/// <0|0 +0 ;0K<1[|1k1{1!<2%|2)2-21<35|393=3A =4E}4I+4M;4QK=5U[}5Yk5]{5a=6e}6i6m6q=7%hub { >xЩ))cx?[~9kal9m8ϩ1zys^rD; oR<+<N:5! ,O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ETtUDV̪6fκx]YsRku/Ng4xbIbpDyt +DsLu,]]J.X-DY#¯NnYWrr9{1tqfz5cؓkgIчy|E/=P.~i }GPKؗ`RQg 4bJd&JkE><yejwzD %,CSW 4=CO"+h"(U;dЦ?؎@47ن7otoʹdL9PO;#~ L@`20ݛ˶+Y\QyAI/P?jL-DyC̔?B7LЎ8C9seH[<6LD;ѷi~zc7mDhld3j,ћBs@ɘE7-PJyjmGV_֌WLd{L .ъ:EWk..0w&PW7ʮH3%bJ^pE*hݽ{G$& 񮽅\L^/>|GȓSo?aƒ6Q|qӞR3I2 בi>c$ >buɟ>Ad%!1_; AB#H+8LS6xdBe,$y .&xͫגGDc90₠\o'Go\Af~&GjH!uq @&j @)P6GXYΐ"NZ'F+PUc("D֧"E(L'` hD]N.Nu 1+6#\B4l} K6;9$Sr@R?¥M#Phv#@V7)#(3#[4ۛw ]"36u 2eH /4̈7I ủX$gZ@#T3N8{\ĂGpw"gl-FnK.P5vBJNЁ /(Jh#tFjf-Ϻe,_1{H1n+!3qBXԔYv߉43]Ea nĩ,c47P>mC1"FͤpK͆(x )(%X,sI'S6E(7hpnpbKK1w觋z+@ A*h89@tj:Wp(Mr3x8%> sU#qIaI 0Q!Htw_+n59s` ` F{o @dR]Z5X( s@1MN`; { ^feQW\KvCxQ-ZX7Fv~|Pv%͙5Wb:eCT9A R-^UG % jqSsN+q1"@:l(퓺䑸O\ A  r^/r([ux1E+Z[`4"aU+۵6K;ۺ1/;! ;HjKL)a K@ `< &E NY(a   0+F%Z̳6;9P+ Xvq1ljP 13);l5띻a.QS;(LLliZ$Bg7 ^\?ס@yF/Ve@` "ci;﷛']=Qlɘ! QfAQEJ2,Й@;) 6v?y/2+H21c3ǂ w9 9fǜa2c͋!] !WlLI *, -P7p2-!2X\ -5v5ThSYI2Bm4e˘MJ Yq ![&tK8 -CU8>s@a]H_\/m@0͐@T  1 37D?a$D˹qy ׀} Ѧ e# H* |'I U 10׃'q R؋=( wLrt=1vm] --2 1-L4Q 梘D;8GS!͔׭nЬ>,߰}-ԁ-%!KP!x[펢ם&7պ>^~E?_ ?_h.VO!q9ϻl`#o O %od3&/(O7#?NgzF/~Pj KpL:M^` ;h/;ޮ5aXy!>,=һ306 +{Z/c1bI6`Cn]QZojq(A mp9@ g_v{_Id3o_I.f@'A׿1q?)ܿ? v~A*@ DPB >QD-^ĘQF=~dJH MDRJ xRL5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}? FX&aō?9ɕ-_i%ž^%2("eʤO7VGj(a&@d7ǸDy. :G$HAODq r9p2wD r$jpgH1H+n32#ȏDl(?'CRJpIJM7Qkhpd-:'H茁H D4QQ(T(0C4ӵ-L %@쌢# `ƍLO55V8ǃִ3l9t"^Xc3㒠 Xg ՁYhfr#p,o%\}2Ս&Mr57^y祷^{7_}_oUEh 8aÒڅ8$ R#b/V?'8dOidJFeQR _b&hfw!p&㞇>Fa'ƀHhugrjyf:;HP9P`;QILJN%Dڂ BggpUgš\C8G g{MLg|%OXg|UD5>U@ρC1A4ِ3mo 88ck+ RDja4 *7!Åp"ԑ!AXЈ"BxD&Fux cP^bE.nы]F2ьeD՘F6эmE88q ";~4x8HrE")KeUJ՝ ) ! "r[d* f`W F3O|$pf hB+XaA̠mZd@ QlAt! ꬃ"KTH1!:N 3D)APzLl:pfA4͍ !&<BQ aIIQ"-+k/V$i5MRuOfT*Qvu^*XU RuSt,f.3*Ĺ5UfͅƴOBיѭ*A|z9lM9љM6jQd )fqd$O W31r#e'$˾ul ؘӖv3Rm>vkCb@!mr[>@tғh֪I5&~9M L@.*ozw-'<ʮB"뀋 xM` 蚀ٌ9pN :S| c@LaXPc $pDTdhl !$"4#D$T%d&t'()*+,-./01$243D4T5d6t789:;<=>?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklmnopq$r4sDtTudvtwxyz{|}~Ȁȁ$Ȃ4ȃDȄTȅdȆtȇȈȉȊȌȍȎȏɐE!ɒlDQɕ<tə{II<ƛ@l= %ʢ4ʤTʥdʦtJU-1*G ʧLʯ\FY Ke  dh̍Eip˻˽˾˿$4DTdtDŽȔɤʴ$4DTdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-RP .%2ĻT@M u/6 !S3:Q$ mS 5}>S;`% = G{ԿHJKDR$팀! ,W! ,O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =4A 5+LJM&PkbT^-"uybc *Eh :۴3AM v1WI Q0pLW<=heR-NzH{}5\` T@eۏ?# 4N0DGQ2 4@VQ.~ۨ>}W%a#SdE(ys'B4'p, ?o$H4CЕe+A Ґ5`N_t)A&D0tN[ۻd+FVE2G0FIo7wQ{w_w ,uE3N nQwW8HdST<9M1 8AuC,A ѹv,Μ Y;DWZ~Qȉ"2 <{^QnU[j4W@H/?G/]?G<γHG%i,.( IgAGHr>O ph&i"Ȕ07?NH b"IVj0g0aFvP$vF98Ddy !i(הSꮓq+a9A8 mGNvVЙpfdl4x<0 d )|H5sMR1,A7A9A >PzR`JPS@T=d)72 dq DRP A˧ trrwCjP"3O`*!bDZ̐P1Q)+CTPJ9 ʲP"e@hSS S''^3Ta‰DU4պH@?Ɓt/=2M Ӄ@׎8MVw*V6р4b@pLsUf  D+gcُteW$I*GL_+5R$@BzQjk`k) a࣑ #(P:_f $k#r34B̘ ٴh |PH62$+nG~q򩐴TpyG_W @Z4Nk{rdPYMZ]pד)xKUȒj7~c"mPƸA2YMtBR +\+C^hT-EG"3)q"_ar"c6Hm[j[Q̏sdc&pc"n)ԡ"0 .8w}E9NzDi;Th@>"Hdn({==?IsS hmS$A^ |6wR'/`[nPC]HY7;Oh*[ YOFcj>= 8ly<&fDiqE!#Mh1L~ߺRtzNGزNs!>r w'_/Fp)1cssukQ'V3 g'T~F|# G4n`gp!rhth1۱7WjHeu6`&sІէi!#x^VqEw/{ӱ`s @w2hc0 0 q*0uhh%BXtk`(~Iщ81X<`A{P!Dk!G4Txx 40Nf[h&X"w~I1 'w2&N grNQh0r\(To8 zp7`ڰ`Td(("#G%:to!)?aVCW|PG c,2 77yQ1P2  7x Y;i]%'>P u N1W;(| }iy3n@\Hד5|xsW} iWp%I? %=CUG$@ Q 6pl qWVqhҚ2#,9&mAORwCyn#dvGi:?q&ZM&Cy*%jRQi@'ӟyL E0z| 7 &1` Z 6#(a&J*Tl8=Hiz^Ƒ)Xqumgu bѤl9&Fq|@k^I萆Y:/6L6 EIVap`oɸmXTQh:9F'(3&yYgM!=9y u KZ3F6pDƅ$a(ĐsF@@_|PH#է1 Q(L&o^TA ?{>7JO ("I%!_8H$::Y(sStQy1*e58rH!0& fPGHh!yͳ,1W̓m6,ykVHQlßa>ӲA %vW;}ǯJ~ j: S'O6";ZFAcΔ6BFi 0 9p9aFU2r7E8A0//3mȰ$0k>2w1'C <4R" H:+5Maڰ \8pP;)*^!6GEAF=m0]6 N;-(b_SbJ WҘ.ǡG=Ic Н\`4Dr74iO|!"Ap@ .Z9dt D( F8UC}*x܀RO] j@ -)-S-d0=Qړ* UPQښ@*D=HÝJљ R!`t@C6OJ80͌Pf/aP[-P BReٟ-үpݘ$-rຝ yK >) F]$Af xf#Փ-pxVar0F* D 3^4(ɽQ"kѤaQq^Z.=#Rqr'!_<f+X h0q=Sjۡ7pQN }N*.@aǑ萑{5M?W NٛDR҈n%tBP~@qq$meF|=~~o^Ip 9c7A`"",&p:¤^p-=?_ "?$Gi%*,(02?048:6>@<=_}E C,ka z~ Z;$N_wq fbnT ~0`ޑoO[ dGa768iUY_]\]"/oy0B}>QGxo??5U 0WxM.ޤ OY;8 /yEW.'_O?@@ L Uƒ >Q@R-^ĘQ#[=~Rȅ G*Dٰb']SK-gęSN=}TPEETRM>UTU^ŚU֨~UXe͞EVD`׾W\uśW^}X`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFz?][lڵmƝ[q\pōG\r͝?]tՍA ,f]x?ύMݿ~|t/ P+h1h;ps.<9ȉ0DEn 1n5<xgqx,r;h\D0Bo ?;\B 5Z0I-*Kx ILqI.Dsa:QLOj1 4䓪 (@3QEC4R,QI/ -/L"]4TQfNJ UWUuTW_5VYgV[o5W]w58 c 1z%؞46YeepYg=ɟZk1jZmu([n[pǵV\rGa$)sх*㥗WKŷ>5ʟ'vrd-C;8`yk]qjʇ/FN]X't0ٺE =#1!HdC9wi{{FnG`?|Wg~~ǿ׿_'@ `vU0K *;}#ʷA v`A8B'4a QB/ta a8`P AQUIk0[tDu>D'"q"Jt)+Q3E @Dn1i@: c;Q~݈Da#@(DAF 5td$!9GVR /AH Y8@pQ6E(A(%pHINF葓 >Y/x'k9"DzP.H*8 } b60,.!L8>$J2 9Oy֓_&t)D)B9KYI8 P8S  2nDHmЈ TbXЂ| E*҇T7 M1[lo81f1"Xՠ9aldF v=q81v21,yS"mm2f9יtG6jܢ|0e2D7ЌF#DCҒt-EOӛnGAՙVL ZWkSj] C:F9)뇴p]j#v|i [ٷfvA0`61=nr.wսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w~錟Бc~+Gv?OG,e_?ȃi$TbC@dtxг& @{'ʼ"8G˹ɚS`Aa i !$"4#D$T%d&t'()*+,-./01$243D4T5d6t789:;<=>?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklmnopq$r4sDtTudvtwxyz{|}~Ȁȁ$Ȃ4ȃDȄTȅdȆtȇȈȉȊkȌ ylCYFR IgTc\ ɘɡK^@\xF;j\F`g4dFQ"ɧ ʪʫ9 De! ,W! ,O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJNSJdJJfWBKݘEk,+Uʕ,G<ڐ_O,db/Gx!ξS EUp *Z*.]C$y"I/@q |@Y߈]vR'ys߭|%6O{:׋wcBBP_J4P+q-]}g 4LHхn'@}A4{ŧQiӇ_u"L̈ӋIߍ\t U@BF?Dui#L3r@]JO3OE@j_N8fgRm)P>g?Hi&j =q}e(A : 'AU2@%syj'C0͑LZ\>@z`zW?f*ќTi=|D 'twl- > 瘧䬰&UJ@J:ٓ:N9@-Z`2μWγ}b,7&14 B|y22t:3/OJFe Wq#;ѹ&W,\F ԋ7ʭD+1ިi9v;4C~ӦirD~=̓v=E|γ2]DNcaoO 6 ;K6D<:3F&-PW@ $@W/t:iWu.^QpIqNP蠓4D.;N[LŘ'N 2/ob{9}cD!/_I5K_1 Vd Ӊ"f[4:U $^ 8:9'l`$Hi_q >n"ig WCc.H 7 0v; )`PF(+-c! Wpm-F\ؑьSܢF&8#a \Pc_$:ձJȶ5c 1=)r,&WR-4뤍;=N JK]eb pfG% @O|`*Ee _Bx@"6\I#uYR!PK_)(qt eqR\rB͌&Cg޹xK k..lH6MC p> #FL%0'HON u@!L@0#ck#ʌ* xڼ=#Γ7'?LSa2 L@#'΁HG?H4>hgN֚}`.yFC!4%pn0݋xz"4#lP֍l!&@jfD,QDK2dU[VyJ l K m`*mq:#(CԡfD'G@Z ȞЉ칎#b1tAT^1/Co837oETA Y߽X-gGfQ:h<M5-~ЋTW|]!Gb~ 'SwlP0H~t 8_jDŐ3d9A|``!, lezY"mH;*%sF0T~8cW72k#o'O*3?6*`2`<`9Z㺥Msz U,ATIidlu>~욤4d&ahr">\t~wcNЦ8PdP Kr0NP Mdn|u!$u83*)p@DU$H~..0+h>o5of ]8_!#&4j ? I Cv0P GvAۇLu7}'`k y'tчhqYgB= \\ Հ}e40V8 ` @B (`gAJGL'4@im .Iu Yw)jP6}wQs4/r] ! 6x4L`C* N0 vޥyp &O:Yvq+uƥ!wIbd" XbGrp3:yww*rSE @ !qAlm[p~@+@6~3 G% rO!*&(vG1夙1 ЎXBCg5`vLVs&~'أ)g`KyeNXt&xAeauW(lj x8trL[0 G?T:Q,9!|v% cXyB=hBqT Lv%)D1(?9#C`It+PfQ OR8&i>l,|pYԂy1`U/1ѣ5xfQ9Hxv"^s4{()hc@ Nr 4b'oU::_:IA"!Ah6/b1c/8 7fQLri'aQ4 Ejiܒ4<5rZ)Iw73Z*Pu*&9(R@qq k zj8h b:ib8~)'8 z@ũ!r7QSrj jæ B6 1ojrU6"3*F@4pu9;~C-P1q!841 =vcI|~"Y(/ۚ"ţ'G?AMЄ Q>Ϣro"G篱`\@qSASkJX!DKP= _2g z%+ )%qb1iC-">i2K/ h0BW^ НǵAѪ1 ;P2a'2qyKo/Ya;![w{`'{ !T+'Jṗ$2ļ༒!W'a )M!O$!*#@,pk[Puų B#uU@ ;';ߢEKڗ"Ƌjt1q`1bO P0,B“q>R# (  Z.|M,F6H_A##_)ݩqJA. f;w0,4 *i'q Y`A.ƻG-P.5(ȕFUr ڳ[Y 0c2 L_\?.&I 9aoҐ u6H R#?w!G4Y8 \cf eTό9,}bGVܲ ެ24=PI1VAG -h;^zGA&-M)Fa+,. ӷ4 =޼̀SDs{)>|*0F(-HB5 1  rPG]p!Ҷ@%1+ MWb p-vgFI`k}4؂A?| s- `(M}&Eҏa*k+Q jҌ ܴ=,&:B>?6My,a *' {q].cU\3 ѭOLP" #| #m FR1a _(R+!}Iv "b*2I $'~%*.0/n%2"n !CQ,=w͎<-N+o 83B i퓬 #^MA./AcQ cY) D0筳>v^ +n j45w~ 8i NP !!BKA p~扂0%1CA` cM ݾGY~ + N^nd1Ё ᗡ9w+:#.8NfݗtQ۾. !|[UvB+.??_ ?_| "?$_&(?|#)"ȭ# ``2A c._8)z R~@]U^OLOjOX_iA G?a_-zzqg{;_SO=/!%mpF@Kˡ?zrO j(?G^/뒿Ӵ_qT/OLQ?Or?_RkO?_?_@@ DPB >QD-^ĘQF=~RH%MDRJkSL5męSN=}TPEETRM>Uԧ扡UV]~VXe͞EVZmݾW\uśW^}o.@c~ FXI -Yd8WfΝ=Zh#4ZZj֭Ssw 8ιƝ[n&G.@ἍG߹y \t$"0 sѫ^.^zHcsdǟ_n?$$ D0A0B# ~;B 7P@p )l#GOD1EWdE_1FgFoQ@1B1H!G."D2tRI)K/tt~ 2N9 s2<*5t9T=\JDT eQЁ%4E4S:9΄ Gj'.մVqEf(FQ}UUYuFՑd\QMwHEڴXmM Aۃ5#WQnRYC> bh(0 6?7$~9U 8Ov?rwm$5 rn @U0xb#odq\D| r@U\}^M: U3IC_ _A(NR5FdWm>P=G2jSщ v)z\a'pln 갪n(61O̡ugi]ʩF }n h}n ׯsxU'n7݋sgbcGrlz%HR~ 5pw]Arl;pyk^1~Ѻs bʚ XTFD@|+SayT8bB" 2P| 1ĂTcN6M~=4!gF@銸!c"ӹ%`fEH1vWb ۴g0AABr A 4ClĤbw9$rԢHvR1D<#,Rg4b1B 1L!cny Sl13W&aea5M`vD%L4 e9Iқ1:[b 0=O}$>_J~3n x6tC*hQXb ]FTͣ@y ӝE)TT . +d R)AhzS OmT4G-PG=" 0jAHaTV@PV#Ԃpժ_kX:V.Z՚Vխm[Wծu]Wկ}_jV#H+b+eld+YNֲ,e5{flh;;ZВVEi ,llkLMiku+mp;\9b]+Icr!\N׍,bk]n׻w^fEy՛^׽.Bh+šϝZu,u-L\w Kc_"ذEHr#/- 0q+LĦd !T՚ƩqqcX)n RFX!%29Z&Kvr<'X/ECd( ch@@<"B>H „E !8UbI \2(r`h Ǯ0?lJ[mk^׽lbuG, )qKMiD8! *U5Ҡ@սnvY7 ow[2@3WC1tЀ,w?x{*oG /ȿcC ЀOUQ8ڪ@ <Ԃ8 `  yfOsyr#Yɟ*G~#˓w=EBo:Fp+v|!Lr}N`?B +ڻݧXVgx^|Md|3yw<9y҇7}Q˫^RC0M[!9iC~={oi~=O|+WH{pk'.7#@쫟W@ $!0az?gv@vpawԆvv q8vH@j8a@@ A$4Aߨ4!JlvXR@ dAA A"D< ,lB&t$A%|)B(,|99p1 ~1?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughi  TjuԟTET suevIR WJWHUyuzx7P͈WG8Qu׃EXDŽe؆u؇}WWz ! ,O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуNs>*kÃbŴ"Ը LX)d\ UV U3]0É7~2hϦXr\sbVd/&W]b*bcQzSDMenj X+Ey ^<ƎKU7ѫ{q(dÁf@$ËE4M3dKvGe.gRtMaIx~XSɇxYm9UD_(b7#A5H=בSW]%Ѐ]@:/MFDʄ"ZSfĜ^4$G=_đIgINz?æyvgj7>#Ѡ~Z EɰΗ@ )fnEN; Dj㌤B3Pr |ެ|s({@.[hz٪i`Λ'-hZkzDQ@r ;X.D8*Aj4gy::vĥ& ҋ@c 6V:I,~sKQ{TK)@n+И!cE(c^E1oCO QQlutoH;56?k+?^@erIoLtwKk5zXܑcFx|7es\d8G/{M8sxaG&u5׎EN A{9Ak_wDhd};HT]mrI4piuo(2 tMGZg_ic ,!G/]?Z{?&+!&Bqy W= }^ %0ot7U& 2 O]DI(}X.z9UA>fp$ӟ <`RBjDys!Ax3TDHq$TKE~qޣaS $EЇ-Y\Hd~i'Џv]x`iA]p?Fm7th`B O0ѩ7Y$Q#t ,)f]yIۼCsH>@JZĖl.KU D&I"t+cVKCh3DNMc3V`^C<H2t_5ji0&s33$ D$f!-iCݹU?'6~zkp,NW L3]FS7KDoHe ]޳>1N@tMW (Vk7`h3i, WH& {\{lI|r}w0djwFa l` 6b+ĺ-% &+mjdJf|^-K$+=8u$53\]"Q7mnhȼ&e0ջzQ̐`H; ] e3 .`Hx]iU(;$("vQjgEzNd^ך#9y k?U_@.\~[AL$SeL#3b|Hivk}1 d!<Ǖ@}F"]f*Й ȱ}>Y S ıA{`4m|J DW|~ 5([qi?V[]8рFiT3}z"q_ztmAF5I h.x2'&q81LhTA@FXK pFah dq }7PF(X[FW{78qBma\'~EefU I fm|q60@IKhoZ@P(xX(fp[z":_u6I="4Sx#8WT%rkyR H1Uhi2l&! Drq10(`'0cAu!F !P%pr_Uhpl}1p WO:I_zJ1 +C(B`@I>'N5~ah(P6E1 "  $&ilX—Iq6 o,4cvP&ė7udqs0`P&pi(bTsI8F&9 ٨N Fv"  |0H0 !14ihtqaI!il&&~30&x@ (Ip(@*jq)D"v*Q%4wʅ&oaY;0sBI7i@)$J&  e<aʡdtFd8be!=S=( J7C j1L E0&iP)t<*(6N/0_vIEgh "4: XNM Tys^aCޕGvHM9!O7 y .C&v8Qx|lJ%qY1cva(6 :vJp`PM'Qecvl~ƪ tj^R:Zs亰aAܒ6hb4!@3 Knl_ڱ Phh& !` @QqA I(7ӊIcy p6;N֠PE{2(CRDxXJ84SQq c JQ@Fb_ )4з5H UqbJ[MOZcHm &|'7ɾ 4Nq“t, c1 p PGB5 %L̄:-TY5L$('AF\'~CcY\3,™>|#(Š% @;@$&1!.Tɴ!Aa V!2,dɘ=]<1:VlB!a& }n7qy `dVMIQBp*>"Bʱx%14*&V@ь6|E}F1,  T lSTxf"Qa48ӳ~5Q9vsN lEʃ+ m( -1}^!#L q tyQ#&G4N#(='bXmn!'Q_+gjEC3-lK 6BQӑ0`D!7/ ؼe @A*Mq`F@uK #p @}6.R  0)=و9l٘WٿD1p3{}׾|Z Z!qٷqPBw&@q$!]@ <~#JA{ q1yPPE 'ם\&!aEJ 2Fq%  =Cv# q*}MHjQX"SR !n ~$F!+!@!+` =]";R޴NQQ }?$B.@`- 2L~Ra8-Q <OTX.Z8F <1o2&&Q^ UߐV% O.{E~"8֑ b6z.{;1~v灮?E4~hJ΂a$(!  -!Ow3:,!_KA ]̎+ΞvkJr, xp=Ut X7 0n@F/@. \(anEQS ao/*2F-1בp uLuE'QN,%ZQ'4A/1"W>"J/$$S_XZ\^`b?d_fhjl?Lpr?rOtxz|v~y_gf_tOQ?ŏ_;ס-^<d8q eM/Ki?ʿ&PE Yo'$mt9 j j0~ؿ(RڏEtlG@@ DPB >(X*FĘQF=~RȏJh`H|iH`&gSNTSH 2M>UKApK֜5~2OXe͞EvJ:dV-[o RnްlX@R . ',Tkd L*ʝϪgҥMFZj֭][lڵmƝ[a,޽y\pm\r͝?]tխ_Ǟ]vݽ^x͟G^zݿ_|ǟ_~0@$@D0Ad0sA 'B /0C 7C?1DG$IJ9g*D_tqaFo1GwG9G!9H%q|2(dJ+H(J/=DB 5L5DI*GJs dN;s4" $йƉ3N?QC#d4SM=s-4TQ7'pNEQWeu5B WfU[oU0XeV\]%؍56Ye#feUт6V \;µ 7EVwu}LelLY^zMtR}S5ghFT~'_YƔalVQbO}NG.dg.teIGffFq+ߌff0z:ke@䈵f[j!w bg YF2>xdn;\XdQ:#"'fj8ǜ;Fy v  h:" }>ya3ݺ`AEB}t mJ?؉:lpνȅ=ҧ6iV٠7t?juK-z[A7jnG?q) ŰYW}\03(lg?D8BЄ'Da UBЅ/a e[AyG;$fcR\8Σj0v#EbE.vы_c8F2ь+ZոF6эoc8G:юut 2N`5tTÊפ=vT55ͫآAve(QҔDe*UJV< 2I$=>N9ah~'[Lfẍ́f49MjV3#OZ$%[VA@@ lރBdDeB@@1yng>O~ӟh@:PԠ'CP6ԡhD%:QVԢ(? q (<)KOŽ8;r jnhA e̳0EO{jSGeRT6թOjT:UVժWjVUvիP'u3pZ_1Y)URȑl$M0g9j:rb 2TC[X6ֱld%;YVֲe5YvֳmhE;ZҖִR>zF$1\ HA"X{nʎl68eC2r9DCq3DWv׻ox;^׼Eozջ^׽o|;_7UŧFDqi]zoLWeï%,X❻x1 L(c @}Evbվvo{>wo7xLWg._kA{;JW:)t_)hz^82}?$4D@{6YC.#?>KK$4TdtB\ kAۻr 18)B8x8,-.(0|0 243D4T5d6t789:;<=>4+D2Bn3s6%3?y)IJGuDwqKIPQ$R4S!8 B.JPpDH$OODKNEO N>0P>7  0N~5_&>pT # N}5P]v55IxtLT ' * KTK%X-pՂ4 1X' gKKq*8J ň[8'8+.8rxQ*H5]##?a}Y?J. &֥m5h5EzDS1< :[!h9+?8<$P9 RpDRXCH:@y7X4}l(./"I*8}E5W@5\#]s80:b00@H 0 AH;cB:5ЕXtp^rlh_?H;Ђ%xʃ! 03=?h!%۸ 5 !G.x_"9̈$ |!`-+7 'y8!?x$ !5dpH߁j78"U^9Ղ[KK6+baoIZ1G'pm_cP![' ,q+40Ŭ%KՃ*!hN#`Hy  0zh~@IIKP+09" b -thIe""H1Ղ#`]Ӵ[>l.!1$hkxdh+; xɃ HI6Yc $4m-QBH*8-U @jy!j[Cӧ|&g @ͳdjMHOA=?A[I*$M:SZqXbeZ:BUpA$v_~1~̱0Pb!4daxYf=syr=m84F `;f `(%\sYN d)|jFaN?! `y` E`4@vsAB6OAq"1"AwBd KC!nnDK4)lab8"H,8TцiIC5]&D@ ՚ %{1RIWaUYi2yupW^{%Ā6Ob G@݉C $ ~3iСV 4@T[u6|4q2mC@AW^Q:՘v7`k@ð w#V ї.BKpA> X1zyf/%p+OϤadX2.<,ц-k=O52&_ރrGw[sOIzcбC;Z6> ?-@/` |AA3G;D5*vϢv e8*9RJny ɞSVVgF)7BLω@}K\(*fAL&UeRUڐ",qB}PYӪֵo$EO=@U\u)}_4ժ&501*W$o},d/)q]GTt{J`ړ>i)lDY1贵ec+ĭEl3TsڤCp=1.m9EՑL.ŕbMG])&]nYNDItT.Emr3Ѿ6/G-dķueo+cy܂0w 1D`WӤM@2g4W)oG+|ەm %RGV&B!%P Y9 ~-_k71v.Q >[J^ߛo8'ӫUgvO 7SN}u&mӾߵh'ݫ/y_SL0FA%b>MCb4l_I(|%?a]hL tA՟=1E ^Wf N#|y5O՞8d0b N<-H R?<(,Q PTAFĤ.?DPӥYDAlY!"|XH [paECZI°!,Dr$P1$AOA lh h$!܂ O8_D́(BEP|%5gD$XExeCb>$XA%3M.V$9,"MHd85P,>YZ8A]M8@%Pb&B;@9r!$8E6,<NZ!T"bj,A  FDXAYF$p̃%,ԈCX!e]49d\FLZ"e,B ́;SxšXVf ahAH($-F8<h!T1[+ʛ!gā6¢D4^R!Bv)z>DWFhAkA AD(hcK  b8KqQK@E8ZAb6AYJ)0DC٠TzUٗ(U]VEdKҜC\)(# hQ8ۯEXJTG"\XꭧOdFAD0i"dCC$zBCA3CiCNvD,xQh!O$#DHa`O9ɠlg dWNƮ,V߹DZR>`Op)9"EDdwkGz&F s dòAhDQ5EGAD"$cO"P)[4LpegA3Hn@[H#[E1VUt\4~KD$tgn t-DgMy?Dф! DBSZ6Z]V IZCDg[V[M@xKDrJC稟#Áar;^XqcX¶"V\R|NwUCnDGp-FJ؈s!EP.}D>Q5Uv.O9h h?P)>FoY Et%89RDUDxw%Mu4{_\|tEEh,8#FKhA3y-A"&" u{r~tkSǂ`&;tP }6Xt=8sȶn=O * D`C蛱1E"A]g!p?C!]c<A C]F?:Ɨhw8D:Ág/Eu~`WBk!_)b#6r8XN@/F9y*@8`y9Y2'Л%VdȅAƂAxʐ6~,YB`ɒdxNe4C#X*! ɓ@?AB~,Y4/Б#~RB!:TXU*T~2i~ T2g*-[!\D@"i*zU`!C4 I%Rb2,[6pΝrkׯa޻h`=Ś'9p!mț&w#%=x&M$IB%Er!uP4lcѩ mnZc-ޜ +qA@KŠ8pb$.8EȠ"*.a/gp>2$P +11 0 *JCD+ NJ6GǨEyRslµ"1p p|%;V0-Ҋ.H iÉ$ƸMDr Q&-h!lPT5P L~1?r-Xg4=L.DqR QUHũ'ؓ6#Ò!&; "Ѓ D " eChlĄK\40Kr-XՌ3@4P;2}w- 77XtB Rm I4ȵ [rJ5 ` cbm:S!( Wub5IcGO9.I&Fz_^8*_::yor4bu6LQnma\TfF9la._V[yĭc{g [\ެBR)/ `Kek0nһϹ^ @b]/o2⅍lii.8\bm7IMʦ1鍶.m[4-9cX?uU_pkuײ;'XzhBKffHv8z5^0Xe.7O)Xo:G7k4l#Ӕ!1 VO8Zv"ov[!>!QqGQb S,RDۢ?1/gV$E ^9kf"Ǯ_K+ń)cHЏ<[a8-NLV, IgHc3fDZ"k~%n^u r_<9Dtc- 8O3_"ФdnM%oUcNA^dI КՔ)Atb YdeܩAJBK߂J,Q-=N~%2BBϞ#6% wp#\-rH0: 8dH`{|VWVV4( HR,Axmle;;A  )r3'6ԇD#HoC㥒g03wɅAg팹y"0w-Q_KșNS4BLDp A?l@>pXa BH62<80 !ZPJpRt) Bw.G8AJq I{,j g B$Ұvs"S(ܨpI+"XCA:<*of `+&l * `` `H dȀ m R X^ CNLxd ,- >Z ƾ/Xa,6c; .~(c `pH%bp{(c`D"#p B Ȁ AP H!oxO D/!"; GD2+̃ aQ` M6@b&`۪m&)d <- ~";b<6!Eh6HN#n! elX @mR `5Rr,x𫐀" C PM =cZPh/kK h"BHD 1DS` .o@m!IaHb"d%` aZNm8 D%ll 'BD$Ox\rqB ]%GS8Q&_c&N TQ8lB BRe$,<1@$#V tI>HwDqHv/8 IZha,$!8 0{"Ƅ2XӸlDJN%ʣ;$&n5*Бr)%dJ,Lfe,mH! g|^J^>5 Ra0 Ti@.lGgTb1#bl%s2"ChG!ڣ 0ԫ-/s: :R%aLsՂo %![(ZR,AO-aO-#?>5cHbKO@BW1 vdgv@ ~? 5R!#*1u$5 @XtQ@|;`c<ɠ2N=&t$p4 v`).Q2na P5n,R5~%e #,jVC-ML, _k>-b u LjlZt@[gd!zuA- H"!b,, V,tF: 2jR!4^δK4LP/K"Ē\M=ZN"2nRhe΢TZO%aE)yKV /uZlj[ AV R"@FZ28V9c-ur6~Nm^bf4j@kKJ t4 f Ơp1ؔ TE%! jNa}f .#vGEnv Ɓ V,(ET`N O$o\ƥc@V|)f 1@g#vV-W73'y$Ӌ4Plnjk|':"Ru "=|v)gt'V%ҕ m U]'y"q* 8٪*[C sk~\"JuvRodơ֢-Ԟ}@CX% aؔ fefm60`zeGfT@`&6v0%rQVanD&[B  6ZY HΙrd" ak.@ Ip:[e=f)B,I86 (V0L 5]Y.DmYrZ7:y `0(P!b;@o$B Hm=,a<+ *5\Xh^ f=yg-h1 \ #C0@9z $Ҍ &fb M-XW@\ R! xZBc&w"ORp69 1*`AvȉJ LEBŠ0&r ^{v;֭m.cAWGdc&:S 3 =N"  /`~`#2L ըc(5R/f/>'h5 6RvHٚE`0ФJF [SAo!; !KF5LeBWnqXQ!ʑ.-$E`DF맩@#]@؍TlS?%%8;+BlГD4 4p]':D7O=eK*lD!=}S2dCBlЖZ aX;P{H! $)LrOE|AѴ|԰ÉcaDGp'H)bt*l*F&j,ȃy)^dC$n.V#! @؝g2|=hzc~tCL? u8~0T%Vkh,½6؏,dlOO65N&)6P&J"%O#4uEY0c`" gKosJ2'fYulTCđށf:){߿>Lj_;h".arG}ڦF`)we}q Zj vܿ<0@A&o95I`Bu&8ȩ|A?z3h=r$w`[?.;xۿ1lݷ @bAGtIdA~xO`otarIHtɇ"Hb]&aA-:6]dȕeDafH=w#: IdFdJ.dN> eOV^eZne^~ fb9 iNJi^i"LϰpiЍFH <,Y" #̚H"؊!k lKll.l> mNKm^f:"H"ɫun8jWrʣJ#n pLpp /p?,/q_qoq r"L;. ]mnWJkA>;tBMtFtJ/tN? uG3B$R7Zou^ vbdj2)~8fU6c*s=Mxx/x?y䒗;yTyoyzk*zl %n/Ӛ5$7-z* *݋zO||/|?|OO}_}o};*(L¾.ݴmc>--Տ p,@ lJp/@To|Kc #/*/^1qXp4 op< oBb$*qLl(R" _"n9&ЄBa wYl]8qt]]j 5w]lc+{ٍgfҮ lB;.4 p9ۊ-o{^v;Z򮷽5Z;3 &yN+|x!H]C|W%RqK<O.np8"/An6<,8[>| 9ٺ6y'swBЋte=::ӟCDNE-kZp=d4ˎ}r>;˽nnnwz=;O#._"oy4> ;/̓~v5NzP>[~1NN>{ߔ^=-+̶7C?sOޛO?ֻ?Oy{'GXyz ǀxHzHgxz}'#w%y'sǂ-v/hy1(kGg7Xv9(y;ȃa烏AuCxEhWK8uMxOO'GUtWHxYEDž_taxcH;g}ixskwm3y'sruhww)sLJ}Xr(w('gzzhqvl'8qv.|rȉp(8xpXk7xϷ؋$ȊH8hȘ춌((w8mvȈΨƍ8߈vx~PjiX(HhȎ8(IiI )g8ɑYّ#I%iwy-/9)I'0i7)3Ik5? Af;4ɒBIDɓJ QْLw!yRYɑT gZ a\^ybiYdYj q9lٕ!bo)yHe_ )}ihIWnَ&i)ə陟 )Iiɚؚ)j)kij雿 )Iiljɩɜ )Ii׉٩ɝ )Ii牞驞ɞ )Iiɟ *Jj ʠ  *Jjʡ !*#J%j')+ʢ-/ 1*3J5j79;ʣ=? A*CJEjGIKʤMO Q*SJUjWY[ʥ]_ a*cJejgikʦmo q*sJujwy{ʧ} *Jjʨꨏ *Jjʩ꩟ *Jjʪꪯ *Jjʫ꫿ *JjNJɪʬ *Jj׊٪ʭ *Jj犮骮ʮ *Jj +#8bb j+i kపC˱ б!{m` +%{V06+Kiz 5+i r GpD8? AKEkG`IKg! ,O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ETtUDV̪6fκx]YsRku/Ng4xbIbpDyt +DsLu,]]J.X-DY#¯NnYWrr9{1tqfz5cؓkgIчy|E/=P.~i }GPKؗ`RQg 4bJd&JkE><yejwzD %,CSW 4=CO"+h"(U;dЦ?؎@47ن7otoʹdL9PO;#~ L@`20ݛ˶+Y\QyAI/P?jL-DyC̔?B7LЎ8C9seH[<6LD;ѷi~zc7mDhld3j,ћBs@ɘE7-PJyjmGV_֌WLd{L .ъ:EWk..0w&PW7ʮH3%bJ^pE*hݽ{G$& 񮽅\L^/>|GȓSo?aƒ6Q|qӞR3I2 בi>c$ >buɟ>Ad%!1_; AB#H+8LS6xdBe,$y .&xͫגGDc90₠\o'Go\Af~&GjH!uq @&j @)P6GXYΐ"NZ'F+PUc("D֧"E(L'` hD]N.Nu 1+6#\B4l} K6;9$Sr@R?¥M#Phv#@V7)#(3#[4ۛw ]"36u 2eH /4̈7I ủX$gZ@#T3N8{\ĂGpw"gl-FnK.P5vBJNЁ /(Jh#tFjf-Ϻe,_1{H1n+!3qBXԔYv߉43]Ea nĩ,c4ǂc vhQ7>7P6mC13"FͤpC͆(x9(X,sI'S6E(7hpnpbLK1t觋z+@ Q)h89@t* Wp(Nr3x8%> CU#qIqJ 0Q!Htw_+n59C` ` Fр{o @dY\Z5Y( s@1MNh`; { ^F~QW\KvCxQ-ZX7FV~|Pv%͙5Wb:eCT9A R-^U # jqSsN+q1"b#@:l(퓺䑸O\ E1  r^/r([uxE+Z++kL{ջ{X!]AkS0J+BIPjA:#jtʻ2X0A }+Q-Zckl?A;2^1 slT!%<;QC#0u1APa1ljP 1۝a.AS;'LLC,L$Bg|7 ^\?硿@y_k@ `E :S]`=Q '0a8X$" 4s0klI1B+4,1I׼̑*rƔta :RB0_}La :@<*K M5v5ThKYI2B ɭe˘MJYq ![$tK8a[.^ 0T3<$u?+- 4@ >0s IFB)J-p Ǭm: 8=a>:H* 'I E 10׃'{q R]؇=( wLoq=1Fj] --2 1-L4Q bD;8QGS!͔0 Hf9!/B !YOTR\@ [S1Bd^?g3J`WZg>{ Wn*FhznQ.ʹIA h(*R` zIT Ҁ1ЪqE% #CQꛃͤ'ἐz^U Ī.,߰}-ԁ-%!K}Ppx;b* &7պ>^~E?_~ ?_~}e oO!q9Pӻ5m`-@.*;"O<;_並ǴCLN@f?VQUtjA af+CWg&p6`s]q\}O~ mp9O~ 06W 93ok'A O8_Iqo¯{ȟQ?_؟ڿ?_A?_&Z"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>eq 4&UV]~기e͞EVZmݾW\uśWyzX0WqXbƍe;+;ƜYf72eʝMF-YDwjڵm~#\pq%/]t܇9v9?Ow G dݿٷz_;ЩlC(lD#G0BH^T(PB?)/p: 1EWdE_1FgP 1 .Ȱ1G2ȅXPH#D6HI'ǟ YƔ 'n (dM)3N3b33v3PAɣAE.! 0 JD/$GY ܂zx{;%HU$&-hh2aeV~!~cD } RuN72chq@gP j+_tv!t1ezkKshfE B (YX뭽or-(a'v9LBubqbtwFp8hxim3gˊ |j|z&2z. ukHQ`C HT e /p@!s@pQAd)A B   ІE8ט2HaBFl02af Fna)JzhE)diE+2|1JDOhu BƃH@J= df @8ȝdcsaD"l?|ÉcA#$K8 *X'Q͓Xj):d5@ Lj0y!C8O4;dr# ByH5-D=\ >?xy5j! D;鋗j<(@0 h5`Ä Rhz,dd+>UqaXT:|W %#&d] AR?#B)`)ʼ(A/z Ьhk lCHdS\GhG\Jx & 80PyQ?t $w<& U)ط3c9hG8&:Tʈ0(== JhţD;pGPŵs ^˶< =ü[t˻ 7˿ ?0!d0BmKΨr TT ;d ǼL ;I*SȄ7٢ZM|/LDn0Lj-0,MA 9%0$,!͌uͻhM< MPJz&B : Kl;ts+k.z7 ˇڿ/{{MH )*>R`{-'ܨ[Ċ,>+Pc1),/)M0v36PxߏTe,'`9-%P٠@9+P'3P_dR/S:y:]p +ͲTM8%X&r32MτGDhTx%%h=r]Z=-^$dT"R8"@WQoJGЯl% WAQÂЎ+{сI+N2KМ.(n {f:V6a%1e@KC庶;49/ȕk.g8)ʤۈ啨߄E )^Mս{Բ/:(*yʣN<,o3\O98kQpMek^rR,p9(K޸֤7;0_HA2jaXhp@T5Љ4"(~Uo W1QN3 yhQs%ЂAaR]U=@+~>U \giщEpc8ST,e%Ʋ;Qwd{jȃ* +JA(: E D!@ȣ$PJ?E+ Y +4Wx؈!u)Q[^~^FuՔl&/}+%< |dLjSt8h=?UXTUv@*&%h'`ζQC5c|+8Eɣ_ņFwd;\2qG88|}bʊ'JY7T4+C9KTQpֺ";Nm+LgK>idrfB~\>sS줮jf?j;UnT K>-0ko#VGԨkY28О&"ӨEsWN NMGF]G>W:+1ᆯfO4Hɝi)<&; jf䉯l/ʳ!{CQ fusO4$\?t8?(`,yC ]_<߯fr溶p7R^ .u獹ʱ-#OG-(d5Hv'DXyra_ghVustiwRD c1-u?E<k񇇭$LbG,?s{@=t7 iN̬GL3Ÿ R ybp/ǯz# KnqBGɧʷGXeW֣I߹)o[}VlbUqX<`׿} iy(-~(8<' W GG1)/o!!V'߶C\9w8ud ` „ "`ApKh࿊ & pd# TQd2A*e(J(0rE'2H?RI(ˏD `iȘxF.g%ПFjPK`k+B>eSgڄGETHY.9t#dΫ'Sl2̗-XYc,qb%\y&B.w8'\yAR)֠?a*z(XlB?,4~l,x8ICW<ϗСL.RWo7lb-O6Q&h 24n!8x!jQ8Gao ay@xXqэ@5`/&)`QQ[.!a|cHP^XPb  ޔCt-6$B` Qy]WPA8`ƹPHhbu"MxL2:)Zʐ-j<GyEfx011T2cKTУfFx_?zR ФZ._T]uA=-$Jw9mt'rkWp$˅U[3uzF$If٪ATWA2 +piFX I\FXqJJhroivfBj-{F _ lCu q2m8[o_jTWiZS'gb S }8sP(;W Q Wz8ַ#8 [7ߒ9Ap]B7]w5XpOQ)Rn8aD]MpxrUuy Y ː|%xYFnjqn@Ext!k[&0}aFeu.pPI|ew?܋k-־qxegFkAZ_Mp׋zuWE2`* !NC@Eʫ—m/Q1D#Hy:)7wdv11Qo)K9j{R4 !q5•&t ff~#(9PC >$HÚBhAS4P!9<܈+b YIG< Ϩ&*Gy V0ҶJ$TɅ#0!E9$Bڰ@́TP0$ %B(qNpv*c,Y捀"vWkR LH@8P3F8pgeyA_E/.Y! ~,a98AH 0I!B-TA (+Ah+CJX^ A\EB!Lp ´zNy(TLb'T i1Xz`+T8fB=b!-1&!dR PBkXa(ZL-%w쁄 R5($)-!UKl%SE VMMn$LV1+Hrؙ.3}aQ g +xzQfJ,vd8U^oQ4.&;֯`5Ɩfcs%c]ЖizH^3̜iAhMbL!,  Sd v ]}{Ùfx=̨Е_"L*._|qDPV 7 !y>j)C$sHcjV(;.B2J?iY5dye0iEHBL5a=Q3fs3=Q|3-A{-4HZ*ю~4#CK& $.JsӞ G5SU;6H@OMIն5s鰥"-aZEe3;@k6-iS־6ms6-q>7ӭu~7-yӻCc}M9{82.S|V+?<8񐓼S򕳼.9c.Ӽ69s>9Ѓ.F?:ғ3N:ԣ.SV:ֳs^:.f?;Ӯn;.ӽv;~;/?<3<#/S<3s3>/Sֿ>s>/??ӯ?/ӿ??  &. 6> FN V^ fn v~  Ơ ֠   !!&.!6>!FN!V^!fn!v~!!!!!ơ!֡!!!  "!!""&"."#6#>"$F$N"%V%^"&f&n"'v'~"(("))"**"++",Ƣ,"-֢-".."//"00#11#2&2.#363>#4F4N#5V5^#6f6n#7v7~#88#99#::#;;#<ƣ<#=ܣ=#>>#??#@@$AA$B&B.$C6C>$DFDN$EVE^$FfFn$GvG~$HH$II$JJ$KK$LƤL$M֤M$NN$OZ]TORJ]RPQeRb-PSfpEDU^%Vfe%V6TvdR%L%Ye0&eJl[|\%^e_%^_%`fRX`! ,W! , O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =.Hrj (VL'BKÈILhա ׶,ō ZX2ʖ EǛAf5U +tAug b*#_3&`Ky$ʤ\[N5wl;χ>^dJT6G}!7AxRHmyXSɂOITx5HQ~MhRFB!t"HHЉI'@ <-rT בbNR: ܒF(ٲ`HDVOIјe}COcEXieu\?@;ddC,G nXn E  %h2֔TgC<D͜H-yNy 'yrk`~OijAL3;2Y">l"O-r0nt쟇9Bq ,vDK3 t::v֥@r%PYj?3ϊn.LrJ]A,1Hx2Yi0Gn .F wo\cvLCϝd ќ<|"(AWy@ ]]9&|ѥoH"kJ}ISGbd9k[DK,4wDߚc4uuWݷSEsSW4N;hXdJWV$RBjąad@@܈Bd2!D^p~+V GD0щA<HBf1# 4*E"# p j䌾Y{pAIi aa:$?wc7GϏNd1H( 1FN-{z8:I5Ip@> F 98Ddy\%Jܕze*ɣȑ a#5HQu#gdŒ2x<0 d )|H7MasgD(4(}3ZK JtAC:% @&0lX])WHJRhEOAX#DDx&j\"3@~+|A,!CDa|A`ь)+LETTJA IʲP"$e@h!T*=5S)'^4\-jaÉD WZ H8pQN48_Ι׺caz9 ۑ1kP֯N-AōtÉ@L&fDfFG T CEx{cM[z~!DSE˲܁T $bCD'Dr$o_>C\&X$1׫xcH)"T'="G9@I1 Q5Q2 9C]% '>P9vNѕu1EW'|@0 9|0@` 1uh40|E9Z}DwevI!@} !kxuWpT0^ϵT|~" Đ`a9h|Wuv & rJ!@i@S`&hP&deJh;8Md]Gx/pO_:,1Lq&Z`xN& *@ xtYSZI@'s!L EС*$;&F 6 oK!+a8HUl>4B Hjx4TaW޶xqPg! Vc/@iIy{7&fl #a8 `"Dƹ`^tXffⶀFAi];>f7Xh2XKJhYP[@q:!9AaAK_XX(ɧzp4RCQ(PobfUAzv!@ڄ?AJO "]B6S1(28p *f@iArAf$ӡ~Acb Uh|4& 7C=̢btX{33kYQnc7b>3A (H;pHGa t'J&0<) 2F2.&l@ ЙQ ``쳵j5F8A0/0jȠ$p(+wN1%cp)N d-L#l gtrjJBu`(1FKC&Jr[cñ @ hl$Qp9 1Yk;"rw$?Zs2R oJ3tq$ۄQ̛k8q&QS0`p LeĻk8;skcAʾGK;rq3h)#.2GIq'2p2'KɆ>KU  yTR9jWN!2JT.2쇡a !@FlJq,l1q" &q Xdb҈ٌs\#&(D0ȡːc(pht,l@"W  Ke74  mH;m8" 9@\e|˳p̵$ `Be0+у%d6>=@ms;{ :`:1Q kKdٲM?c жL_=dCb74i[mH!"h@ 7Z9MA!@A D!VC*rS]S&#@ -) k <۳M-lDڻm VPQڙP*E=4PN6!`zC6λmܐr 5|@f!2Ѷ; W0U# +}ݘ$/aȠPƤ NR1 $aɍ}}Sdm<1ar5v9~q~+a4(ܱɽN^ P.RTNVCNFLIX.+N޶_m=e BѶ#]e01<@6[DrA )|3~[NqLTH1ߥ .g-c^BPE~A޿2a$[eHvN.| ~n pN:v>IeҎ"K2,a ^a nCH 'qh?_ $/&(U*.0@1?4_6/7:<=C!b yN YZ;0Jo?WZ?\=$!r\_f@~t1njlv`w?H.{_wOf# Uod_ C|^ U_;s??H5M ~oW!Ep\`_ޤ _Em@'_ro6/ 3?4J""_@@ DPB >QD,^HQF=~RH%MDRJ-]#Ƙ5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`…gXbƍ?Ydʕ-_Ɯs\4ZhҥMFZj֭][lڵm[wnnn\<G\r͝?=sҭ_Ǯr%q8]zΣn|cj/@Sd03"+4"0Q/IPCG$,A;DW,ā'Eg12*Î䓯F< l&!9/$dR!%RyH!J(ˁI1[ePA0)+|eK/|31N34΂3P-O8E>BbF jt 2ƐL91 /?'#oSU+56x7ԠՍՎ7xXa%XcE6YeeYg6ZiZk6[m[o7j`0 `=\uեSLYyw{w__&x` F`fxaa#xb+b3xc;cC&ydKz-vsqgS nvl͙g&hF:ifi:jj:kk;짱iٰc曋e;n离n;ooV ѧvm&xoe?K 'ȟ~q}XrَXtgjb"@@|Gp vfѰ l({(]8BЄ'DƆ :Aw8U(9qS`C~ h S-Ob8E*@a!<2MK1 PۤGE:юwģ*X8t ŘanDc9 <'ђd&59=bq`$ZyACR d7(DZfx@ƃ,Ñd09Lb)Y']rrAB>Px G}+nVr'GyUr/ye>s7Wy.ۛMțP -p  O8, "ձ~qw]{>vgG{վvo{>ww{wnŶ;MAɠbC IxҏRT#@E,T(C#zї0}Uzַ}e?{}u{~?|h)|az?}W~yaMYpb R?.ԟe`ڏ/Z_FO $4@Dt@ @A$,4D @gXA|q\e8,s, !$"Hc QxBBB+,+-l,B,-B1 .,B4C3$6d7T3L9\8tC;C::;<@ACA,DBDDECF4D$K!PPG=aHZh\lHVNw)yD#9=Hb@5X !++~ #bb" >X 3ScJmcȃ<\\h\?fdDVFdxdP[HNΌK b-R?uwY`c"N~eS RV&WUPhe SOFe8H[ˍhXE P@=N[hzN-nh?0+d(NG6cbIT؎@O ,e>.iZYL ta9v֬IWеTz]UYϑީaSReH Lh|pY~Kb|FsNgh= ]FxNRin*i>_6o:x8LovY-8XC^Xn n]$5H ܇iؔ$X#QU+ֈPmNæ]*l@ZT,.TXl]]г6'L j#VeI(Ή[8gˊߒV޽6.S~Px>=f1hRϰݼ6f6ΉG'Elߏ8#hNm~ H&Xpv<[\8I* jf/L0LSN$@rPݩ+rrЂnߞ06m G(h }~ekXonhnD!Z_ TqryxD~qpl_QUNF T(AGKinL&8^[USTi VjIHf9^kg+<uu%ePahyKv9^s!Mu9e p0Ȇsu ́=[tYHeThӓGEFx 9NuYO kM7̃ u8en GWNLE." ([۩6-gPtEHs O1`XMit5'gHG<K&Y=7\LT)_jhtuƴIt}{X'^PQf%=!f2gY~ۥǍf8isvY|Nuwec׉eƷƼ͡a_Tz]ύTf^g 4݉?i8y2l0?'RhQŌidǎ"G,i$ʔ*Wl%̖ĬiKKAH'Р-j(ҤJ2mFRjfȞWr+ذb3Fq,ڴL T-ܸrWL8s{.l0Ċ3n1Ȓ'Sl2̚7s3ТGw5Kt˲ZQ6)ֲ& 0ܺr<+߻37ʝCp,S4=}¯;D 4mƦ @7r3"wHg{qdW4]CEDKK$Swbw=}E1bJ;`b3G^IS691$E?h]Gy?\7?HRB-d]ZX@")A8sH 9J^:8U0NtƄ7h%NYftbH@4"Ľ8^]>%gGp$C ѣ1YT v$EEdSH߅DfGLKyR4O<9K&lJ AU;@Npb͂nِ%qmKNaеbĨ'oIE.cVNYSʍ:tQN5Lǖe&arJ7:K8<w8oG!JBKA )4{Rd Oleކs e,M ewN &J(K~A62J=Ev#9N*8Dw4n/ՍK#)FEN`3-s, rcxU:q,Ȩbqj& %hdW}#umT?'(?Ld)r&+%NYCQ!r^z` <.R]= O$I*7 º~BNU W M$vV8( K EENʈ X#HB%-|2h v,Y1ID&'.GCpXP QG~(]3]ʂxfyqvɳ!QG"Z~)9w"yS5uhq-ЏdQ$81y$RH&I$5 > ʓ<%DU*0Ád/^<.L29cLd?[.Qɘ_*`Q&Zna jj9́Aqg:xcG|L )ЁA@7L2,?Ȉ9hn釀bE#B&=)J#6ѡE,PєҴ^:a 򴧚QO*ԡF=*Rԥ2N}*T*թ2mT*V} pêY*X=s,f=EZVkNth}+\*׹ҵv+^MV浯~](*&=,b9c2Yc#+R,f3r,hC+ђ=-jSղ}-lc+Ҷ-ns򶷾-p+=.r2}.t+Rֽ.vr.x+񒷼=/zӫ}/|+ҷ/~/,>03~0#, S03 s0C,&>1S.~1c,Ӹ61s>1,!F>2%3N~2,)SV2-s^2,1f>3Ӭ5n~3,9ӹv3=~3-AІ>4E3ю~4#-ISҖ43MsӞ4C-QԦ>5SUծ~5c-YӺֶ5s]׾5-a>6e3~6-iS־6ms6-q>7ӭu~7-yӻ7}7.?838#.S83s8C.򑓼&?9S򕳼.9c.Ӽ69s>9Ѓ.F?:ғ3N:ԣ.SV:ֳs^:.f?;Ӯn;.ӽv;~;/?<3<#/Sb?ESѩ!?I@! ,W! , O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJYL* XBς&ݻ[G

fs'|r%<W5}mpqrEXuY#N!M7__G !L"BV"|Օ+CcE-@N&ƨ=@ .xPEDdD޸2JIJ 8Xxh bvXRE;DY,:0}b U8_[LŗݧN 2?uI8IWs sA v$}a"< 0$B}d!C  >c>ψ,D)r$;1KƑ`=7ZBȯ"z`VU#t9c/yo\zr3:"w.h09:RAS5+t (]N;!j#"GQI4~r%# Ph,0OD*e\8]jVa@g}Q1 $@ D!R:_B 60A6/&zD m:R%!:)(jRJΤ :2 M#Ts!LUA5|\l o{ @6N5]BzA`fGqJA`LB4'<"v"D aG (D̈|z@II҈SA"=xh*QdFOeRe~]\xĭS jo[:rSRN)JaoEG١BL ͈<>Yv!?eU=1mGf~)Y^q۟.rZ:Cc.GQCN[B4A*>3#;T#B 86{B|d^5[3_rFD(o `PI?̑,~ (,4#6)g]` |>]?ދpnB1b Y{6^8$xB  :Ĝ/6.-cK\!b P^̐|҉fs7lY)D?\Yn8 ;Syc :#koŪ15T`ip eDy @tf(-r҇A :f*%Ĺ/lE7tۅך4n A>CDK-ē&f“bDV dXȯb8/%P F$ۈqq> j$̐0w"ѲG3egYwS`F=ED9Y70m y~0 @DZ@?J R;S@qjA]goA:,p~a&Ȁz{13QMyQ ЙEbIѫ?1x:2"NGy" pK `@/N K:3m&udZD! A3D# ra 3 H ">0@#$].+Rԍc6f4' Zl6-zqVŐ#&kZw]pqLa0r`Ѐ:.A 1{?'d}^!~7`2p}~h=h:x1!m:сQ{KV Pr`NP ResW|u!"4oҁXu;K.)@Ad(K\Ur1h]8ErUof q8_!&%7k? ~!J#v0P JvAW"Mu:5|'`k }'rчAiqjw< a] }ae40V8 ` (RO rv>QwJ& GPP"@@pF7Lv]x!E@c`4{sз".ڕ< эWLˢ4xb0h V8;!А0y n0 wvزyp )aV^%Z&]GyCw4$K&%t/ ^w{W =hB]#ِUГ0AR7'54a)%G# 4J rOpЕ!a*%(㰕wAHAd1 갍Xx Aq[(T9r@PZp'ܣ)g`H]6N]V&xeiXRk x8!u9pI[0 ?(` 7$e|v##XG=i "T Ly%YDA(/X?I#C`1+Pf1 PRX&aҀ]$,umy ATf77U;:z1xFב9Iv9t4{ ',Ese@ Os=*oTU8:_zIhBf/b*c-:~1YL1*QoZ/@ BL RJnx-LSRŘt|#?EY7hrq2sr  €V+ b:-hѡ#9b/{8%n 1.;:kj')q8RS6 A ‚xA"3*F@_J)0s@s3!xa SgQ&'Q X/+<{`7KDM'- h'l  B bJMP:Agհ+A!0wP;b,K~rqQ[d)~C qE ۹\"!ka,ַd 롂$w6!#'u%{RC{Y. {K+Kǫ{˻8~~?aB;3v];K[?NTg~"  o &Igѭ{eeQ B7HU@!;Q:XKޗᲾދ,@i8C)  G,8~R *6B0<!Cy: qc~ˢtRA:A콜Cl#< khO - *G[fY@a.ÎPHc!6' "=hL#3fI0x =W>FLOrDžlA& p BpQ56+v1 ! ^K"DMWuz>V*:a̔̎ Bf=VDzJ)ɝ߀͕͔yq0х^~?_ g?_g "{ ` *V 2003%.#9/yAC_'N I`NPPQN U"\9A 8bW-jKBdMTok't_빹[<{^!ZOm6^! dϹw̡t?UOO j0(aQKo2=*2raBc?_~_;?_؟ڿ?_??_>h"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETREkUU^ŚUV?VXe͞EVZmݾW\uśW^}X`…5#G.@ņ?YrČ+Yf΃$"0 8ĝMFZ9 PZlڵmA6V1Ǥh r ;0 dI'~L `SJJ/K1$sL3DL5dsM7ۄM9sN;N=sO?OA%tPC E='i IK/ձG)SO?Q QGqPWeBQI PmV[:."}QN rf-%YgbFyHӁ~ ~%2hAgEW(Fu&}$(ʁ'`g('U; fH`:j׆9^wUٱR$e`?~-vabG * ?&ނ\9fUڇ xfYULrfhxYrM!} 8QdSS4F:lZ%rA'q()U쁢F86\ vjת͙ҁy*vZ ^b&*sH؟Gv [ Rw>I Ј ֣Ѣ?̉2$@H#ÈhD#vxFFBh<#W X#t (B7p!T!AJ;,!BA` 0v!A8ІO|0Dk5[U"PE+J97,*1I8]1`Bq|Q ?$3ǒs@vHqh9l @+9I’,QS6܂%\'QQb 0%%UT 4$jc“1P4ˁ4B 4V9̘Pt3WR1$ÈB EhiJJ2)MeE߬f89NpSD9iNvtg<9wS=O~ӟg?:P4%(B P.ԡH."ڐQNf@i IR4,=iLWRδ7KiS45iOSU@EjQ}ԡ25GUjSTVթQUUN_VUc3-ѐB3b \?VGg2K( 50@I $ S9j ٝdt2lh'YK@R+Z֞~:ֽ|ē7LmH56ݶַ$ymNb$ :+Ķjr\ kZEV:G;*2Dުn]^%Wj[X fsvZ^X·Qm9bR)%]MΫA`yw#iBQށd oBGQnnxK$Je K挆_&pYu ,wnl` dT,1CAv˞Y!.Ff`3y!vneY ٳBEݠ%GOK$!& 9An/me2F< $ `(FpFD Bd-h:&B<8X޴LDuP3gOvVPٮ_& 0}ئ)?&%>汅)!EU 7mcw;Y۶ADdo+clg@Zuu %CSH2^@뫍Lryv]i EAU˷ay,BXtey5)KARDV8B &Tλ*@v#-rxZ$z^Bs;oԥDn HjU-W5 aO?0w$2.İwG,ҖXz u0WS7]Iv| C D/deV+Gh#iɆ|!s "m_j2ts{!: :A>s@?@:b0,xd$ J=9T?Jk,0z -JЃ;4 v±!DB"$dBK)½"k)đ["0P Nj낏@;RA,tQ2(Cp [3d/O2885 -d#CX<=Ga9. bQB Ì,D5xD` Ỏb c<,I$Ll1÷M7^ <ۿ CEH11؎P `űPX7ì(;ÈkiȃCoDXFƊsK``qDK`D ? Ȇ pYT%Alj2 ;V !ẅ Ƀ6(6 lҤGMP<>6`c!/K+1쌴DDl 1lΦ`σ +,9P U;<9BIƖ̐p6r\D |/UE\889(Iycz$p~ %BڣjjDRȺ`pqHц8Ԛg?@;4hP[9=m<.;BeӺƣDQ1DGC՜ZԥSR{Q]D<Վ?@A'B7CGDWEgFwGHIJKLMNOPQ'R7SGTWUgVwWX?m1=.[M4OO^t\:!p]GdWv'at`t^vKvVwLDktgOe'rr6tWug-hψ! ,W! , O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуN|3Uֆ# ŊiEr LI@BgIu% / 44C-gYJy D݆$|AcM% tRu]9eDg(Pb7#A58=ȑSW]%]@:/MFH #ZSfԜ9^8$GA"` IgINz?fyvgJ7>#Ѡ~ EɴΗ@ )fnEN; DjhH3R % ?#@BJ-ybjIρh,)lIg9oĠaJhrEڪ?-yNz-a0\=SO:4J/ӎE|*0)V:Il|sKQ{T-@n+И!cE(c^E1oCO QQlutoH;56R?o;?^@(,E露l춇w\3,w$DusO;~DQ=58AotxJ8v8A"Fn͵,j#B^sNW߭_4n]G+T]mrI<4piuo(2 tIGZg_ ,!G/M?Z{&! %?qyW= }^ %nxA7U&`VB|"J &Erѻȩ İ#vȬHLG$0abތ#iAlÒ$VĢI"~qhjS1"EЇ 4¦\Hd~q'w {҆\iA]p@F%E$/@X~ PM4ɢ$Qj 9cfI4#NچzC"/@б6$e.KG ;&A% &-2:4Ƭ9v g4x<0 d )9yB?&<# ͆R*2&N  ܳ$@&]F#t/h'N@HNId!,7 dtR @qB2¤,0P%Wch2$7E@BJXazNH@J**'^4Y`D SYWH@?Ɓ "!@R-Rk,Z}A ɯ{dU aT"Z]MQ΄ɹHrV h ]FlGd珉 ;ět y,5Qt$(Fx(-$(h98ؓfx%Drcyd' *Y+†u*IMZ$EZ?4׽ŌG xv#7DmI9` p]̮nb9yL%el4k;ĕ30f$ɑb8 +Y(b;yŞhV *Ahcݐ1/ L3h P]0I变8f "7HjS+ͱy?I M\@gtBiBW apJ|tb xcG,꒤׿&Q sخ b d*; 9Y M)0  AauU1[m9$5O9&WX",ᑀ5r bEt0Pqs~qdZM"d!l N"{ ƌWf0:B[_2d Y4eu&x *zcM |x 0%H@a\s==PkJӪqvHPEA"Ί  Ȃ 7GbDז<*eo+T͟XFs"{?SJ;]m$|ndH 9tm$jSȗF0"3S@H8JUgQFQfL^f@$q~1|([iB[^8XViTC}Yz" '7| Oy'tT1PH>w"LJAHB2* pFqhVq0}7PF ([HW|A~ uQ wThF_J f+`zrц'"uxIKxoZ@RgxZ s^GopT#XC<`817OPpGe_"q*('!P;犧A l&! wq11(`'`cxV !AP%`r!0oh(6qiwvR{H4r4 &nIpvBytkyG!`97&Wxf{)` /pY6l&I:$wc;eWd%gwO4 pKh5!{J1 +B`AI>GN5(ap61 y7  '&l5l YI!(!ܘ@mB6vw)ob|4[Iy?6  Ur$q.+F~P%8t>0hBR8+z|I mz(|P 7 )3tN Z`8@&ht8D!il&&~50&x@ (IqH`Yq)E"w*!4xʅ&nY:vC0i@)E&) e<bZzO&M.yqq@! S!&:$RP$oQgѣ>* 6N/_xYUgh "I XP:M U ^qCK8X5P%sw25 U&7_FPHZp8 `B5b:&f` zׄzB0`qj?')<|*$G`*P%[513s 6I-ijF@@@R|pY4Lʫ$&lϦH|Pp*@9+%FHVqr0iU+PH{:1yrby11<QenL.pfh(A"$+H:?` +z?"J=]B3[) 4 1K0Pvxd(^h D_6@ | rbN8&wIk[pU "tD A aa1 p GEG*5J 5,><""(~<(.* \Gq14Ve!(&;BdZDSI7F6}Ax6Khu՚rQra ГVA-Dɖ;h==vs3p1($";fr vMxpzj>D|+IaBPȚ*?)wD#A!_,3ًBCo` bc:A,άó @T |CDg"Q(94!SM#Q {^Ma7 1y;L_c(]( =1 Ќ)bBC<@B/5 1 k<l VHkɳA-qr fBB84+baԠ@J8!$0`PZ(06}J!\ P<" F@݅ ` 1Bv  }MQ0]GM- &0)]s m5 #}!N{=\DА"ZBق`B؛&0q$W@ <}/I1 aayPpES!A r2Ս~1v İ2Fq%HMCBa mMH}W(%J]D{, Gn ~F+q!@!+` +M5R /^!!%&ݳNQ 3:$<.\ . !2ۢ=}b8I -A1f$!愑2&ݤ&K~Ƒ O>Y& I^{eg!Ⰻqɐ*A^@.!{.cNL΂(i )Q cCZ̹]ѻA]MZEA =tn(n 2+Wݳl0[%՞Pkֆu!D+F7 @>7 lL еe ?"WF-Бp p.4ZE&_A7 ;GrNA*%ZQ'0#l 68 C_VXZ\^`b?d_fhdjnpBt_vp4x|~O@?_/oz_#aYС)~<2)s oT&NO qO`Qa,m/o }| qfn!6ǟ&n<n?ɏ N D0@3D)QD-^ĘQco6~R$SHZ8Ң-]S̏hJTM=}SPETRM*eiQ^x&V]z{0հe͞EKlڧnUi-[MwKk nWpިFXbƍ?Ydʕ-_ƜYfΝ=ZtϥMFZjG[lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^G^zݿ_|ϝR_~0@$@D0AdA9g *A /y˰C?1DG$DOD1EWdE'dEo.FgıG;!R#Fp~D2jȂQI)ɘbL r J/dJL3يL54-H'ل3ˎ|s&$SN=)y'PAPCE4QEeTzF'G RM7H .T1SS+8&TlX%:O7B z7dV_ X;/yB2edUYfu6ZhZj6[lն[n6\p\r57]tU]vu7^x畷^z7] 5_&`F8afX=Gađ|h }ȟc1aĘ - c`WA@bˋPesaEB/򧟑h1i8h6:jI$XLj.b\'Z"ly[ч)F6Ȕp~;pb~G9pm4HB90!ݺ'23Zf)p8=$Wid(aF=x)&>^ xRxwCcF pSy{Ib :)b!*!) e_sc5g8WXF?sq1"AJic"CvrX<0W!Br(CFQ"p ʒ2d.xH^r Z,b8FQeDhF6ktc87QvG>я{c9HA2$$" HF.ґd##HI˸d&Ur)BIi;@!&e-|,. җX%0w)^4f2`2s,&4Lj>4MlrS7ũlӛ ':)Mu,'<)ts<`DE,l W~9J-?J"!pE7 EE=Qai'G^4P5'MKe*8#qAr:SB?Zy.+5j6 @ *VA;L?!ŧ ,D PT!bU&ǫiDyjƲ՛ (HQZ~؈>j׻R!o+^s$u&0l] &v}e$9O n&Z$ q!0jd:ֱ1i銔rU"6-j&CK&3\8$,mi<~y‡u2(0Mb 4-wXA!c fN?a9B-yxOB6$#ᝰ ޹=gsQ Ɔp\W)AJs?pqa.['RAuA3A!$N@;}y0% iX6Nu Y" Y9"3)S+<™%Rܞ'vA$hfG%4ǛȱrA64Iw[&Ut@zn`)V hbPB+$LSuA]'N6q/.ɌECcnVG8N. r&\ IzGvDo:ЫY7њfvŝ-Zfw,y@l/w>p!$ y>;/–yȽApA>ŸJ4 H@4#D‡ˍB@Ÿh',RD8#x#&AC܏LITQAbCkv@D`X= cb¡*Ы:tSt?@FX@슆Őlƛ; ?xC8FF- R B+=Ȇ8 _x(GFBxFȃSEPeN+ pQl5s {ԘKGNT%p;@?.-Z@3H1ID@|<%B/ɏH R5GAIؽCH׊ʘ:it J<{@T@IG4MX<Ռ:edM+[= A״M?d ,cDN?l贈Tͤ((j4@ Wl yZC; @.NXKК7 HΌs5f [(M(10 8Ϲ8 PHCDS#jtO# mC7r2u@ PhM-.X?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^_`a&b6cFdVeffvghijklmnopq&r6sFtVufvvwxyz{|}~&6FVfv臆舖艉芶&6FV6##dirRT6e=hR^π TY&6j,[=jpYH^"^CQ[^kD԰&6^Kj! , O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ET%zp`‰@U)tʜv۱(,Rm#ku{&` /h@œ c.%VuJkXGY.]Zd[:%B|ܲr9{1tufښ5cص3L]!plWO ɏ48d[vhq{'}&u@HIHs݀2fʄ!Eҗ Q:*V4D%zрR@ !CpD[b82- x R.O3OEE]u`2ϖ?GZreGLBIP?QICɢnN2 dKOrJ(#)Zbi;5Z>bJd&JkE><ye*B tː;lgO>@Z-BR hms.Ay-x0@0HKЛnNL EO0rk70C,*voe)YKCB7LQZ";.D.Y-8?WktZoC]Dξyf_6Dccdz.ĭ"+Kf?:+P2fQ * =J, 9єsFu$^!#^tD#yDbz:S:^}7qoH3%bQ+7WwBa|GNPQ@WSHEMў?Nʇ/`GD< "bW@%X +~ Ȑ䐯X^HƄ @ jDC J0<17p![S2Ri+;+I{ѻ{իXuaj^1i3s(S|/;'Pj1}뚼K84$D +iA }q+`B0Eں(_+! r{T,I[1;7%,K C 1A3)F[ sikQ:Q K,‡;L ;oZ<ס@yDӎslDzBg۵|7'x7^s5l1m#̤E;'(4ڻRa3*3E` N=* 1pEם-ԁ)R 56}R06cic7@.@9-̄ e%Q- !RW{ۋmܺ@dǑAAȫ   ! 1-5f\ZNcߛB0R xSS^Y /`v8Qb$ o!ia>\> Yq5O?=`Zzx }!tV `}-q-%!Ν;]OP X:=n8En>^~?_ ?_/ Ͻ_T# 30V DA |C<8@?~0y1 K0I@ANP QV3:A aho/Vi/$r?6`u]a^o~/<m@9 o~ PnozA:c ^]_.COI{?Ŀ+şʿv{?_؟ڿ?_A?_?AZ"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^Z߸v\VXe͞uZmݾW\uśW^} @`… F|t9p?Y2Hr.#дq͝?t!0O`ֽz-I,^z7y/=qggq(lR#GA0BR) /0é($B ?1DG$DOD1EB 1(1T@wD5xȍ=z$H.!K1e4&dJ*2K,ԲK.2L0L243M4TM6t3N8申N:3O<ԳO>SO{&hg ldQG4RI'RK/4ӎ(j4TQrE)y }U5W]QZTT_G[HUfWgj(Id5Yh"Gb*!2$d6]uZ$vpDXj(ϒn%hC8E]> :(Ha*2`eזQ! ` XEȄb2.f)!t sr(Z}{v9h5}9 (͘vhQ~zhz jߨŌ3 (Fj2%l 'Qf{h b'A n Xf;q"~k\e=m 3'R6#U{b)bȔ]Jhvݸ؟ɆvZ>"1z7ww2^$y"^~hm'b>}zՇƌCǟžã_ 7FY- '=`#@ V`-A n!E'4a KBP- eBư3aqP>c g,tŽ~("Xb T@x*r1آ(/ckB2OI@1BwT\&Aa^"@C#Ul31E&C$GQģHu8!ڡgEڑʤ<. o*$I=uNܲ*>ST*DVԊ%Zԡ<\%U#VCJ$)%+_: PYׂp͓a,QS61=[M$Ll2rcV/My+HPy!H(euv BF2ɪgOQRG܆݅ ʱѴrig!!/B&c AjvbW Aoދ$WREZ"Ĭ>8m`߄ Li Y {܌9sՉl#ĞnRY B 7F.Js8NMd*48jU(ld{!-HyM qBޒ"?2.YCDUK6c) !He>pzR!' =SB32 d+$d˨Sg2B1! '=xhQ%'LvHd%Ab!3B#I$  85ĥ% sJPj !s{#d ltI=$n6]$;$%C;K7Q%pX{|J PO ǸApj;7Bq'"7yErIrùfoO{\2[9EtHq mBsFUiS:/B#=R쳛nС7$#;Yc+W @==* 2KeFV ]Vkv"?zwzXN6Z'8Pސ?`6I:SN`63jq}04^9&1 /Ϫ&"g2N?GF CC*a#5xdHB7/HP0.8ǵ}k歡E",RD?!ڱ1C+ v?xK1X??Q\ѥ@H; k#:8@;DA@hx.@s: k 8Kz2s$8=ث@| ?Ȩ%TRpq?8*~[A2D-4d}%*yBÎ8+Lj aB<\ @SÉDcC#K`brC<+?:Z;ԈI;bB@5k>-;kߛ T7|@zĻ)C'ĈDL؈_ƅ&_< G4ahDDeƫjklmn@ˬR dr4sDtPrTx2x83  şHFá Ŀ @jl cw!at\d-38CxL]T ǁ05 ?>x ;  z*8RJ~ %pH%4@.(B  /f $' EH7A-DvYX4z˧XH0d) $iC H*>XIb,8LH¯PJR(JxLytyLĈ*_;>{Kp Yn|B|Ŭ"'NϛOPN5P<eu =K М КTHR5ј:eui%҄@#E$MUl&E'!)+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵݳ%5EUeu%5EUeu_{Wp_^!-vvZ=`" `慃;``%<Fa-fv>[ ƈ! , O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =.Hrj (VL'BKÈILhա ׶,ō ZX2ʖ EǛAf5U +tAug b*#_3&`Ky$ʤ\[N5wl;χ>^dJT6G}!7AxRHmyXSɂOITx5HQ~MhRFB!t"HHЉI'@ <-rT בbNR: ܒF(ٲ`HDVOIјe}COcEXieu\?@;ddC,G nXn E  %h2֔TgC<D͜H-yNy 'yrk`~OijAL3;2Y">l"O-r0nt쟇9Bq ,vDK3 t::v֥@r%PYj?3ϊn.LrJ]A,1Hx2Yi0Gn .F wo\cvLCϝd ќ<|"(AWy@ ]]9&|ѥoH"kJ}ISGbd9k[DK,4wDߚc4uuWݷSEsSW4N;hXdJWV$RBjąad@@܈Bd2!D^p~+V GD0щA<HBf1# 4*E"# p j䌾Y{pAIi aa:$?wc7GϏNd1H( 1FN-{z8:I5Ip@> F 98Ddy\%Jܕze*ɣȑ a#5HQu#gdŒ2x<0 d )|H7MasgD(4(}3ZK JtAC:% @&0lX])WHJRhEOAX#DDx&j\"3@~+|A,!CDa|A`ь)+LETTJA IʲP"$e@h!T*=5S)'^4\-jaÉD WZ H8pQN48_Ι׺caz9 ۑ1kP֯N-AōtÉ@L&fDfFG T CEx{cM[z~!DSE˲܁T $bCD'Dr$o_>C\&X$1׫xcH)"T'="G9@I1 Q5Q2 9C]% '>P9vNѕu1EW'|@0 9|0@` 1uh40|E9Z}DwevI!@} !kxuWpT0^ϵT|~" Đ`a9h|Wuv & rJ!@i@S`&hP&deJh;8Md]Gx/pO_:,1Lq&Z`xN& *@ xtYSZI@'s!L EС*$;&F 6 oK!+a8HUl>4B Hjx4TaW޶xqPg! Vc/@iIy{7&fl #a8 `"Dƹ`^tXffⶀFAi];>f7Xh2XKJhYP[@q:!9AaAK_XX(ɧzp4RCQ(PobfUAzv!@ڄ?AJO "]B6S1(28p *f@iArAf$ӡ~Acb Uh|4& 7C=̢btX{33kYQnc7b>3A (H;pHGa t'J&0<) 2F2.&l@ ЙQ ``쳵j5F8A0/0jȠ$p(+wN1%cp)N d-L#l gtrjJBu`(1FKC&Jr[cñ @ hl$Qp9 1Yk;"rw$?Zs2R oJ3tq$ۄQ̛k8q&QS0`p LeĻk8;skcAʾGK;rq3h)#.2GIq'2p2'KɆ>KU  yTR9jWN!2JT.2쇡a !@FlJq,l1q" &q Xdb҈ٌs\#&(D0ȡːc(pht,l@"W  Ke74  mH;m8" 9@\e|˳p̵$ `Be0+у%d6>=@ms;{ :`:1Q kKdٲM?c жL_=dCb74i[mH!"h@ 7Z9MA!@A D!VC*rS]S&#@ -) k <۳M-lDڻm VPQڙP*E=4PN6!`zC6λmܐr 5|@f!2Ѷ; W0U# +}ݘ$/aȠPƤ NR1 $aɍ}}Sdm<1ar5v9~q~+a4(ܱɽN^ P.RTNVCNFLIX.+N޶_m=e BѶ#]e01<@6[DrA )|3~[NqLTH1ߥ .g-c^BPE~A޿2a$[eHvN.| ~n pN:v>IeҎ"K2,a ^a nCH 'qh?_ $/&(U*.0@1?4_6/7:<=C!b yN YZ;0Jo?WZ?\=$!r\_f@~t1njlv`w?H.{_wOf# Uod_ C|^ U_;s??H5M ~oW!Ep\`_ޤ _Em@'_ro6/ 3?4J""_@@ DPB >QD,^HQF=~RH%MDRJ-]#Ƙ5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`…gXbƍ?Ydʕ-_Ɯs\4ZhҥMFZj֭][lڵm[wnnn\<G\r͝?})խ_I8ݽG8q^z_XyGp'jʃ/@_;$*мds(=KC r)A 7,@IBG$q Wd5pk1FM+)/gDzT<(pɦ!;Ԏ$ЮBĞ~&$FvZvKvv$7s0 uP^#L]\d]Ҧ yJpR/D(21 N%W!Q,*JW(`a+H9&I4y#c0EѮJJ{A?Lyr6z MpJ]%ߞ>VcfM1 !II빺 d繙(5k|NKqXOX$#x/T('$?[ EiHBCX04c| I H<) m=F9(@pJBqIx53Hn 95l@wJXר8PX :$Ix, +pAPԊ+ DŽ ++Ȗ&S,Ĵ{ E1@} g#YtL̐`L2$)H1l$IHHhTTG3Tʱx̓?[8HN<3K| -:盛!HF6$b"?k=ObV \C,Q@N9TЈHuP8P ;P Q } B]T0QQ !%"5#!$e&u'8%(PԤR+,҈.01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵ%5EUeu%5EUeuYN)\^R :M` X'M v~{5~xI5ެ{"ᬅT-! ,W! , O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJYL* XBς&ݻ[G

fs'|r%<W5}mpqrEXuY#N!M7__G !L"BV"|Օ+CcE-@N&ƨ=@ .xPEDdD޸2JIJ 8Xxh bvXRE;DY,:0}b U8_[LŗݧN 2?uI8IWs sA v$}a"< 0$B}d!C  >c>ψ,D)r$;1KƑ`=7ZBȯ"z`VU#t9c/yo\zr3:"w.h09:RAS5+t (]N;!j#"GQI4~r%# Ph,0OD*e\8]jVa@g}Q1 $@ D!R:_B 60A6/&zD m:R%!:)(jRJΤ :2 M#Ts!LUA5|\l o{ @6N5]BzA`fGqJA`LB4'<"v"D aG (D̈|z@II҈SA"=xh*QdFOeRe~]\xĭS jo[:rSRN)JaoEG١BL ͈<>Yv!?eU=1mGf~)Y^q۟.rZ:Cc.GQCN[B4A*>3#;T#B 86{B|d^5[3_rFD(o `PI?̑,~ (,4#6)g]` |>]?ދpnB1b Y{6^8$xB  :Ĝ/6.-cK\!b P^̐|҉fs7lY)D?\Yn8 ;Syc :#koŪ15T`ip eDy @tf(-r҇A :f*%Ĺ/lE7tۅך4n A>CDK-ē&f“bDV dXȯb8/%P F$ۈqq> j$̐0w"ѲG3egYwS`F=ED9Y70m y~0 @DZ@?J R;S@qjA]goA:,p~a&Ȁz{13QMyQ ЙEbIѫ?1x:2"NGy" pK `@/N K:3m&udZD! A3D# ra 3 H ">0@#$].+Rԍc6f4' Zl6-zqVŐ#&kZw]pqLa0r`Ѐ:.A 1{?'d}^!~7`2p}~h=h:x1!m:сQ{KV Pr`NP ResW|u!"4oҁXu;K.)@Ad(K\Ur1h]8ErUof q8_!&%7k? ~!J#v0P JvAW"Mu:5|'`k }'rчAiqjw< a] }ae40V8 ` (RO rv>QwJ& GPP"@@pF7Lv]x!E@c`4{sз".ڕ< эWLˢ4xb0h V8;!А0y n0 wvزyp )aV^%Z&]GyCw4$K&%t/ ^w{W =hB]#ِUГ0AR7'54a)%G# 4J rOpЕ!a*%(㰕wAHAd1 갍Xx Aq[(T9r@PZp'ܣ)g`H]6N]V&xeiXRk x8!u9pI[0 ?(` 7$e|v##XG=i "T Ly%YDA(/X?I#C`1+Pf1 PRX&aҀ]$,umy ATf77U;:z1xFב9Iv9t4{ ',Ese@ Os=*oTU8:_zIhBf/b*c-:~1YL1*QoZ/@ BL RJnx-LSRŘt|#?EY7hrq2sr  €V+ b:-hѡ#9b/{8%n 1.;:kj')q8RS6 A ‚xA"3*F@_J)0s@s3!xa SgQ&'Q X/+<{`7KDM'- h'l  B bJMP:Agհ+A!0wP;b,K~rqQ[d)~C qE ۹\"!ka,ַd 롂$w6!#'u%{RC{Y. {K+Kǫ{˻8~~?aB;3v];K[?NTg~"  o &Igѭ{eeQ B7HU@!;Q:XKޗᲾދ,@i8C)  G,8~R *6B0<!Cy: qc~ˢtRA:A콜Cl#< khO - *G[fY@a.ÎPHc!6' "=hL#3fI0x =W>FLOrDžlA& p BpQ56+v1 ! ^K"DMWuz>V*:a̔̎ Bf=VDzJ)ɝ߀͕͔yq0х^~?_ g?_g "{ ` *V 2003%.#9/yAC_'N I`NPPQN U"\9A 8bW-jKBdMTok't_빹[<{^!ZOm6^! dϹw̡t?UOO j0(aQKo2=*2raBc?_~_;?_؟ڿ?_??_>h"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETREkUU^ŚUV?VXe͞EVZmݾW\uMy^}p9p FXUr.0tխ_vݫ>9{G^qCf&?ի0@O@Dp+dAZA 'p"1.i 7Ál<$hDWl7#E$S0eYǐ F4.H$ '1G)|p$J-lp$3pRL3lK7 ISslM=DGYy*L8@/k,RK7bPG`Gj92`2 HyKg6D5jq!!=BL g!5jNlP3P@D Ĩ2E PAXUmDf7Hu(@9U4XjEUjTY:X!ɫD u T[(}ci]  icP^qFE$&蔤"Cp. uu;Vzt{h|I_tP ԛOݫzֻow=$qgǺ\Shc9_I% o{ζ[Rg} *͈+$v&?ѐz" ôyܐ x?p$ \ -zCXz@P@hI>@8ހ#P $@ F @?%LR;p>'s#,7L?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵݘ%5EUeumZ1(M.hB5k#}P}M$_jaߛ%M^`}MD޴ e .[ %Έ! ,W! , O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуN|3Uֆ# ŊiEr LI@BgIu% / 44C-gYJy D݆$|AcM% tRu]9eDg(Pb7#A58=ȑSW]%]@:/MFH #ZSfԜ9^8$GA"` IgINz?fyvgJ7>#Ѡ~ EɴΗ@ )fnEN; DjhH3R % ?#@BJ-ybjIρh,)lIg9oĠaJhrEڪ?-yNz-a0\=SO:4J/ӎE|*0)V:Il|sKQ{T-@n+И!cE(c^E1oCO QQlutoH;56R?o;?^@(,E露l춇w\3,w$DusO;~DQ=58AotxJ8v8A"Fn͵,j#B^sNW߭_4n]G+T]mrI<4piuo(2 tIGZg_ ,!G/M?Z{&! %?qyW= }^ %nxA7U&`VB|"J &Erѻȩ İ#vȬHLG$0abތ#iAlÒ$VĢI"~qhjS1"EЇ 4¦\Hd~q'w {҆\iA]p@F%E$/@X~ PM4ɢ$Qj 9cfI4#NچzC"/@б6$e.KG ;&A% &-2:4Ƭ9v g4x<0 d )9yB?&<# ͆R*2&N  ܳ$@&]F#t/h'N@HNId!,7 dtR @qB2¤,0P%Wch2$7E@BJXazNH@J**'^4Y`D SYWH@?Ɓ "!@R-Rk,Z}A ɯ{dU aT"Z]MQ΄ɹHrV h ]FlGd珉 ;ět y,5Qt$(Fx(-$(h98ؓfx%Drcyd' *Y+†u*IMZ$EZ?4׽ŌG xv#7DmI9` p]̮nb9yL%el4k;ĕ30f$ɑb8 +Y(b;yŞhV *Ahcݐ1/ L3h P]0I变8f "7HjS+ͱy?I M\@gtBiBW apJ|tb xcG,꒤׿&Q sخ b d*; 9Y M)0  AauU1[m9$5O9&WX",ᑀ5r bEt0Pqs~qdZM"d!l N"{ ƌWf0:B[_2d Y4eu&x *zcM |x 0%H@a\s==PkJӪqvHPEA"Ί  Ȃ 7GbDז<*eo+T͟XFs"{?SJ;]m$|ndH 9tm$jSȗF0"3S@H8JUgQFQfL^f@$q~1|([iB[^8XViTC}Yz" '7| Oy'tT1PH>w"LJAHB2* pFqhVq0}7PF ([HW|A~ uQ wThF_J f+`zrц'"uxIKxoZ@RgxZ s^GopT#XC<`817OPpGe_"q*('!P;犧A l&! wq11(`'`cxV !AP%`r!0oh(6qiwvR{H4r4 &nIpvBytkyG!`97&Wxf{)` /pY6l&I:$wc;eWd%gwO4 pKh5!{J1 +B`AI>GN5(ap61 y7  '&l5l YI!(!ܘ@mB6vw)ob|4[Iy?6  Ur$q.+F~P%8t>0hBR8+z|I mz(|P 7 )3tN Z`8@&ht8D!il&&~50&x@ (IqH`Yq)E"w*!4xʅ&nY:vC0i@)E&) e<bZzO&M.yqq@! S!&:$RP$oQgѣ>* 6N/_xYUgh "I XP:M U ^qCK8X5P%sw25 U&7_FPHZp8 `B5b:&f` zׄzB0`qj?')<|*$G`*P%[513s 6I-ijF@@@R|pY4Lʫ$&lϦH|Pp*@9+%FHVqr0iU+PH{:1yrby11<QenL.pfh(A"$+H:?` +z?"J=]B3[) 4 1K0Pvxd(^h D_6@ | rbN8&wIk[pU "tD A aa1 p GEG*5J 5,><""(~<(.* \Gq14Ve!(&;BdZDSI7F6}Ax6Khu՚rQra ГVA-Dɖ;h==vs3p1($";fr vMxpzj>D|+IaBPȚ*?)wD#A!_,3ًBCo` bc:A,άó @T |CDg"Q(94!SM#Q {^Ma7 1y;L_c(]( =1 Ќ)bBC<@B/5 1 k<l VHkɳA-qr fBB84+baԠ@J8!$0`PZ(06}J!\ P<" F@݅ ` 1Bv  }MQ0]GM- &0)]s m5 #}!N{=\DА"ZBق`B؛&0q$W@ <}/I1 aayPpES!A r2Ս~1v İ2Fq%HMCBa mMH}W(%J]D{, Gn ~F+q!@!+` +M5R /^!!%&ݳNQ 3:$<.\ . !2ۢ=}b8I -A1f$!愑2&ݤ&K~Ƒ O>Y& I^{eg!Ⰻqɐ*A^@.!{.cNL΂(i )Q cCZ̹]ѻA]MZEA =tn(n 2+Wݳl0[%՞Pkֆu!D+F7 @>7 lL еe ?"WF-Бp p.4ZE&_A7 ;GrNA*%ZQ'0#l 68 C_VXZ\^`b?d_fhdjnpBt_vp4x|~O@?_/oz_#aYС)~<2)s oT&NO qO`Qa,m/o }| qfn!6ǟ&n<n?ɏ N D0@3D)QD-^ĘQco6~R$SHZ8Ң-]S̏hJTM=}SPETRM*eiQ^x&V]z{0հe͞EKlڧnUi-[MwKk nWpިFXbƍ?Ydʕ-_ƜYfΝ=ZtϥMFZjG[lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^G^zݿ_|ϝR_~0@$@D0AdA9g *A /y˰C?1DG$D DDWwa1FsgÉ1aGs%qGD2I H Q2J)stqJ-4"+$L߲43M5dM7߄3NJM9S1ps<TˠW^1@eA *CmRKozI/Ә2hSOGS .8&10TW1HWo-/YɎ|% !a5 7;/ybZf5e `[kvn5([s=7]tU]vu7^x畷^z7_|շ_~7``68aVav8u `L 7X#qQ6dN;e@9K;UyэM~9fsFiʇGiC2^Y㛧OhE†bX㙣VjFرX# (삺 GHb6ʅEa tȟ~n¦a1ș懰` lj`p!-]5`A/Zk`((nr`)N}ӽ6hc rav8g*lX L=MyY{En/}رڟh-2PܰJL}K_UP8l9* eۓGhD#yK_jFA 3k "! mHE`2 j 7(Ct2l6`hC*{ѠRDuTFvcyY _x:(Ucp% b4*dp\P3C\Nc"CĠ " R)bAZ@'7E1|ɴX'(cpka8( HN4e0ˆDL%3@rT`2I-~8AZXa„Scl`0aY$q!ԙǾh a"SoPZ4I`)<@q+=vB0s`iBдm; 7D MOХs<^dr$t / #_Od_Qo{uPZ.-!|Wx6U# 7VwIEGyV?+/դ芨 lSRs?_7A<*E pGdbuEͽW }{—%Z_5-ڣ~)b`>p, %G,4ׇ簲?@& I;U@8(@;H^ ?  Ρ\ASȃ<`A܈Z 4$ $čA% "|v{B(*31 g&Bx3F0;l 53009Tg8< \i=@6C v{$l  ?Id5.D80eEL!= 2ÈLp :<`+xH 3AV/l 1귮2 T[FeCi &9[+ 6Eik38S$q`J$tF°pサ3[[ Jp$E@YC}4@,wjG rGIˆ|tFP'`TO7DdHЃdOPMKE %1h kN ͈6xJ8%ȧ8ыEVe d2}-wŮ<hQɘ@Qm\Nh*U ȧ>tP3/m Sh,Me"ƥSԟ@` =m +Reγ܈VJˀ YlTp?eNc,I *QψQLU - [ 4uQ5t L d#5u-Ո(mP u8TӄGH<11!@Tëk 8hVl>o Sp%r5sEtU2]xmWzJ TW{UW؀؁%؂5؃E؄U؅e؆uXz؉X'omҍώِΑ%ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵ%5EUeu%5EUeu&6FVfv &6FVfv !&"6#F$V%f&v'()*+,-./01&263F4V5f6v789:;<=>?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^a(Ze9Ud~HdR`I6 h&`H>Ukl^ TmnKKg dd foy{|}rxΈ! , O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ET%zp`‰@U)tʜv۱(,Rm#ku{&` /h@œ c.%VuJkXGY.]Zd[:%B|ܲr9{1tufښ5cص3L]!plWO ɏ48d[vhq{'}&u@HIHs݀2fʄ!Eҗ Q:*V4D%zрR@ !CpD[b82- x R.O3OEE]u`2ϖ?GZreGLBIP?QICɢnN2 dKOrJ(#)Zbi;5Z>bJd&JkE><ye*B tː;lgO>@Z-BR hms.Ay-x0@0HKЛnNL EO0rk70C,*voe)YKCB7LQZ";.D.Y-8?WktZoC]Dξyf_6Dccdz.ĭ"+Kf?:+P2fQ * =J, 9єsFu$^!#^tD#yDbz:S:^}7qoH3%bQ+7WwBa|GNPQ@WSHEMў?Nʇ/`GD< "bW@%X +~ Ȑ䐯X^HƄ @ jDC J0<17p![S2Ri+;+I{ѻ{իXuaj^1i3s(S|/;'Pj1}뚼K84$D +iA }q+`B0Eں(_+! r{T,I[1;7%,K C 1A3)F[ sikQ:Q K,‡;L ;oZ<ס@yDӎslDzBg۵|7'x7^s5l1m#̤E;'(4ڻRa3*3E` N=* 1pEם-ԁ)R 56}R06cic7@.@9-̄ e%Q- !RW{ۋmܺ@dǑAAȫ   ! 1-5f\ZNcߛB0R xSS^Y /`v8Qb$ o!ia>\> Yq5O?=`Zzx }!tV `}-q-%!Ν;]OP X:=n8En>^~?_ ?_/ Ͻ_T# 30V DA |C<8@?~0y1 K0I@ANP QV3:A aho/Vi/$r?6`u]a^o~/<m@9 o~ PnozA:c ^]_.COI{?Ŀ+şʿv{?_؟ڿ?_A?_?AZ"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^Z߸v\VXe͞uZmݾW\uśW^} @`… F|t9p?Y2Hr.#дq͝?tխ_Ǟ]vݽ' 9GnlɱW_|R~0@@O@dP%0B [zpB /O .b10$̻N3EGSCho!o|1H!g1%e0e%|rI%@ʂl2K,ԲK.2L0L243M4TM6t3N8申N:3O<ԳO>3P@g&с *2RIKEhS SOKQDtN?E5UBŔT4=UUYgIƷXXQMGŔVcguEHy }x5 Ql ctd}II$G(Gҁ2)p\]j!g^4l5'ґAg 8I]K]Ȓb1JN2 gQť8  YWkU:YKEn٣ 1Be)a wdnpWBg'7 !E9c!ft[YFAvX s0hhLn 7e\qVj`bX K ~Vp4#]ւ&"Fs0|Fo!2XmoNwVrLqlLLGH\wV=_y v7IUF:iC`HvT8B~0- AAQ"@D@vM| ,a @j[%^EЇI#,e#F_1q(b=O} g@:P~ 5hBЃ6TeC%QBԢhE1Qv4(H=RԤ"EiISzRԤX?a o'Gc "5B[]ioG Ѐ\.Vʊ7|f@N " G <$ `($ ws.ejg+b,(@b`ck_VP"X ϤPh9$F$z9"2uI =n fNiN&.A rT{ai` wf=Z Z1ڜb!/ fw[(ʬ#\MwAPG׸ &- pm;(vbP xƳOuCKvp={a<=zd Hp0 ;3.$-uh#~ ~󭜙O|t g_VH΢=ruu_ӉuXO {gvDCyo\=Lw@Q%Iiw!zmxƷ_lF -}$Đ •p`?8<ÏBX60\9-<, ӕdYF.jFPe)rkǹ@3b,3;i)DX6ʩǍXF83NJF@GpCݐljH>2HNtɎ$ɢ,ɔTɕdɖtɗɘɚ@` șɝɞI;H0ɟ4J3èɁPDDM/|Q䈭  ɑ :?-JhŐIEH˲l8.x+JLh,ǒ ;D8KX/8P֘ %Kx/Y *p̂5g̨ *J X\¸ЂqlKK+x/S$|YAN !bԉdK8̧Mp ůh 4͆:-'xNMΪxˈ!ϙ>4Ψ-Ǜp .)мN(Ȫˤ7x/ -c4z>ŊcKtHEC u% =,D% OѦ- =M%Қ"UҘR $](m[)+,-./01%253EӶ3J6!"79S:E;S3=%>@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵ%5EUeu%5EUeu&6FVfv >]#96"Vaυ^'\^*%6`lab_89&2&(b)+,N'ERΈ! , O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =.Hrj (VL'BKÈILhա ׶,ō ZX2ʖ EǛAf5U +tAug b*#_3&`Ky$ʤ\[N5wl;χ>^dJT6G}!7AxRHmyXSɂOITx5HQ~MhRFB!t"HHЉI'@ <-rT בbNR: ܒF(ٲ`HDVOIјe}COcEXieu\?@;ddC,G nXn E  %h2֔TgC<D͜H-yNy 'yrk`~OijAL3;2Y">l"O-r0nt쟇9Bq ,vDK3 t::v֥@r%PYj?3ϊn.LrJ]A,1Hx2Yi0Gn .F wo\cvLCϝd ќ<|"(AWy@ ]]9&|ѥoH"kJ}ISGbd9k[DK,4wDߚc4uuWݷSEsSW4N;hXdJWV$RBjąad@@܈Bd2!D^p~+V GD0щA<HBf1# 4*E"# p j䌾Y{pAIi aa:$?wc7GϏNd1H( 1FN-{z8:I5Ip@> F 98Ddy\%Jܕze*ɣȑ a#5HQu#gdŒ2x<0 d )|H7MasgD(4(}3ZK JtAC:% @&0lX])WHJRhEOAX#DDx&j\"3@~+|A,!CDa|A`ь)+LETTJA IʲP"$e@h!T*=5S)'^4\-jaÉD WZ H8pQN48_Ι׺caz9 ۑ1kP֯N-AōtÉ@L&fDfFG T CEx{cM[z~!DSE˲܁T $bCD'Dr$o_>C\&X$1׫xcH)"T'="G9@I1 Q5Q2 9C]% '>P9vNѕu1EW'|@0 9|0@` 1uh40|E9Z}DwevI!@} !kxuWpT0^ϵT|~" Đ`a9h|Wuv & rJ!@i@S`&hP&deJh;8Md]Gx/pO_:,1Lq&Z`xN& *@ xtYSZI@'s!L EС*$;&F 6 oK!+a8HUl>4B Hjx4TaW޶xqPg! Vc/@iIy{7&fl #a8 `"Dƹ`^tXffⶀFAi];>f7Xh2XKJhYP[@q:!9AaAK_XX(ɧzp4RCQ(PobfUAzv!@ڄ?AJO "]B6S1(28p *f@iArAf$ӡ~Acb Uh|4& 7C=̢btX{33kYQnc7b>3A (H;pHGa t'J&0<) 2F2.&l@ ЙQ ``쳵j5F8A0/0jȠ$p(+wN1%cp)N d-L#l gtrjJBu`(1FKC&Jr[cñ @ hl$Qp9 1Yk;"rw$?Zs2R oJ3tq$ۄQ̛k8q&QS0`p LeĻk8;skcAʾGK;rq3h)#.2GIq'2p2'KɆ>KU  yTR9jWN!2JT.2쇡a !@FlJq,l1q" &q Xdb҈ٌs\#&(D0ȡːc(pht,l@"W  Ke74  mH;m8" 9@\e|˳p̵$ `Be0+у%d6>=@ms;{ :`:1Q kKdٲM?c жL_=dCb74i[mH!"h@ 7Z9MA!@A D!VC*rS]S&#@ -) k <۳M-lDڻm VPQڙP*E=4PN6!`zC6λmܐr 5|@f!2Ѷ; W0U# +}ݘ$/aȠPƤ NR1 $aɍ}}Sdm<1ar5v9~q~+a4(ܱɽN^ P.RTNVCNFLIX.+N޶_m=e BѶ#]e01<@6[DrA )|3~[NqLTH1ߥ .g-c^BPE~A޿2a$[eHvN.| ~n pN:v>IeҎ"K2,a ^a nCH 'qh?_ $/&(U*.0@1?4_6/7:<=C!b yN YZ;0Jo?WZ?\=$!r\_f@~t1njlv`w?H.{_wOf# Uod_ C|^ U_;s??H5M ~oW!Ep\`_ޤ _Em@'_ro6/ 3?4J""_@@ DPB >QD,^HQF=~RH%MDRJ-]#Ƙ5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`…gXbƍ?Ydʕ-_Ɯs\4ZhҥMFZj֭][lڵm[wnnn\<G\r͝?})խ_I8ݽG8q^z_Xy9D;:D0AKC r)PA '@ /0C 7C?%F0DO, WTE_t1gFoFqG2H!18(1LH'LhJh#,c.3yJle :Ӕ3dM SM;l ΂ijO?WOAOB]Ga$'C}B,1h81%ΗQQT L!2CR;ZS:5Vdy(Bɔ:e/ t$~3n 5Xkjt G>3ZojQ kRW9ݷI\:5 h$; s)]Zdۘ 2qf(# l2`!cGW=j3?dbxRb&h~= WϬ-y{0F<ah^ W_"a{6lQ [\fc$h%کS rd^)EA*F|5ˠřbP7!k(5"08D!1G$"D&.щJbD)VWbE,nы]#1g4c˸F4Qm⌁8cv,38!e`ClDK D4$"rH0Ґ"#HI\%3YINb2ܤ'AIMD)EYQ<*SXr-u9\ܥ,iK_%2YLf*ӘޓqӮcYE‚qFAT.f0ч7TJ 5XMJU4-?dNTϺ.$Uma]K$kA@&W@7 .v omp@6!ūb0R3DnVa 0 FJX 5B z@eǘvK& UH`opȸM h*Z*+>v3&76q]juCdRЭTۅ5r 2,ձNTvv078ZAL:@.;!jbeիV2ȅbւ!@cѷ) J6+aP8jvR⦚R=mHN@& $)*c4ILb[  A!P9)SEb[)_F)m*)I#嘄&T!sDH9J0EiC:e:v T1jz.ݔT`FtAo&LElWjI 0) ,?X]RT>I}!s< sP6^l[VHѽnè& cB/wfvsƌFO:3'4Fm3/73mik q}ӢC7JqHzS%yG@qM yCAZQMU|,#[S2)vZC<)Txs"̾ AN o's\y'O?H{'R3x9P0܋K6ZsA*eơr/ 3UhaV7q Bb_ =TN{hhgTF$ۛM?4 YB;E)G64ٻ1ύi>!=Oo #B7L?!K,[.P'u$|O" %+ k(ۈTp?HЂM#;[j֣k-p:70)d.p00r? h,A2QAL@ְ-T/ A0t(()$5d6t789D;r3> >ALCBDDH#&,F c⋁+D ?0H 2i`?CD0NlŲx@T `WfŷªycXT 0Křڈ7`;189etf)Fנ8Dɠᑴ:$(ňxlj, +>(FT+t C Ne +HRC(S"z(c(HB9pA>G5rEٰ/'$8>ĉFMFi\ȱǃa[8ɏ^ՓF -8R,LEG| "ʃ0+ž4'SJ !xcJƨJp;ʱ2 ď<ƺJK˽2˒$4DԊ@ 6T,TʌLTpLˬ̋$4DTdtMѝz٤ڴݹM\d7$DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉Պ؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮ\ڋb[yL%ًY ȳۺ9̒ۇ`ۛƿٶYq[5ٍ["kɥZ]a\M܍! ,W! , O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJYL* XBς&ݻ[G

fs'|r%<W5}mpqrEXuY#N!M7__G !L"BV"|Օ+CcE-@N&ƨ=@ .xPEDdD޸2JIJ 8Xxh bvXRE;DY,:0}b U8_[LŗݧN 2?uI8IWs sA v$}a"< 0$B}d!C  >c>ψ,D)r$;1KƑ`=7ZBȯ"z`VU#t9c/yo\zr3:"w.h09:RAS5+t (]N;!j#"GQI4~r%# Ph,0OD*e\8]jVa@g}Q1 $@ D!R:_B 60A6/&zD m:R%!:)(jRJΤ :2 M#Ts!LUA5|\l o{ @6N5]BzA`fGqJA`LB4'<"v"D aG (D̈|z@II҈SA"=xh*QdFOeRe~]\xĭS jo[:rSRN)JaoEG١BL ͈<>Yv!?eU=1mGf~)Y^q۟.rZ:Cc.GQCN[B4A*>3#;T#B 86{B|d^5[3_rFD(o `PI?̑,~ (,4#6)g]` |>]?ދpnB1b Y{6^8$xB  :Ĝ/6.-cK\!b P^̐|҉fs7lY)D?\Yn8 ;Syc :#koŪ15T`ip eDy @tf(-r҇A :f*%Ĺ/lE7tۅך4n A>CDK-ē&f“bDV dXȯb8/%P F$ۈqq> j$̐0w"ѲG3egYwS`F=ED9Y70m y~0 @DZ@?J R;S@qjA]goA:,p~a&Ȁz{13QMyQ ЙEbIѫ?1x:2"NGy" pK `@/N K:3m&udZD! A3D# ra 3 H ">0@#$].+Rԍc6f4' Zl6-zqVŐ#&kZw]pqLa0r`Ѐ:.A 1{?'d}^!~7`2p}~h=h:x1!m:сQ{KV Pr`NP ResW|u!"4oҁXu;K.)@Ad(K\Ur1h]8ErUof q8_!&%7k? ~!J#v0P JvAW"Mu:5|'`k }'rчAiqjw< a] }ae40V8 ` (RO rv>QwJ& GPP"@@pF7Lv]x!E@c`4{sз".ڕ< эWLˢ4xb0h V8;!А0y n0 wvزyp )aV^%Z&]GyCw4$K&%t/ ^w{W =hB]#ِUГ0AR7'54a)%G# 4J rOpЕ!a*%(㰕wAHAd1 갍Xx Aq[(T9r@PZp'ܣ)g`H]6N]V&xeiXRk x8!u9pI[0 ?(` 7$e|v##XG=i "T Ly%YDA(/X?I#C`1+Pf1 PRX&aҀ]$,umy ATf77U;:z1xFב9Iv9t4{ ',Ese@ Os=*oTU8:_zIhBf/b*c-:~1YL1*QoZ/@ BL RJnx-LSRŘt|#?EY7hrq2sr  €V+ b:-hѡ#9b/{8%n 1.;:kj')q8RS6 A ‚xA"3*F@_J)0s@s3!xa SgQ&'Q X/+<{`7KDM'- h'l  B bJMP:Agհ+A!0wP;b,K~rqQ[d)~C qE ۹\"!ka,ַd 롂$w6!#'u%{RC{Y. {K+Kǫ{˻8~~?aB;3v];K[?NTg~"  o &Igѭ{eeQ B7HU@!;Q:XKޗᲾދ,@i8C)  G,8~R *6B0<!Cy: qc~ˢtRA:A콜Cl#< khO - *G[fY@a.ÎPHc!6' "=hL#3fI0x =W>FLOrDžlA& p BpQ56+v1 ! ^K"DMWuz>V*:a̔̎ Bf=VDzJ)ɝ߀͕͔yq0х^~?_ g?_g "{ ` *V 2003%.#9/yAC_'N I`NPPQN U"\9A 8bW-jKBdMTok't_빹[<{^!ZOm6^! dϹw̡t?UOO j0(aQKo2=*2raBc?_~_;?_؟ڿ?_??_>h"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETREkUU^ŚUV?VXe͞EVZmݾW\uMy^}p9p FXUr.0@$@lK ".A 'L-Ѐ* )hc(7Q8CcD;Bl2%2estrE!Q )l&n$f2K-s('J,$1dMФRM7%! T’IS4iJ)t(5DCFad#@P$A ˇ M4TEu&}$hƁSO# sQo5jgχiPB?3We+&v BN *8 P҃@]\}t.sV‘2j(ÊJ5_A=!X }R†l5H።%7a%^h5(8hJ4(gAq&9I!vP,͈i Yh' }8m(ycf(  AhGV8aL= rp"_93:S2hWqƹ{2PǴn|fxHj!ޣ[#,`H{ێf %Qw4eᡃpQr _{(G4 #ESbTE a Q']cbaP'Dwh@CtS)D*]}B|JЈ Q!jHt-*ADP!&4BJ .^1!;b7BPQ 4,3F"}]w1 fQؐYc!2яfH[ХH!V1 #T'0AʢCˠb KY֒e.b)Zتe0}9L`SD1iLf&tf49gVS5Mnbӛf79Nq3$':͙NvS@re8`DvFE,1T %@ bЃ24p(D "QFԢhE1QvGѐt =H)jҕ$uiL[:S6UiMuzӝ攧?iP_ ԡ U=-@!*$CyTuuld/lV3H 0(dɪ$pl(3?qdlV 8V;>(=8U]SdT)̃mۣ*ܖijp2#.Lb ܉W1xny+$mbĽ.{ɓ$S0 8Uk D%oHx%= FNjLlb"~qePZm+ Ꭴ0ydT_#G?ЋڅG^LㇼUUC#3DfUBv⬤Hƕb8yF+poBc J z+˂\bʓҏ)/0Dj8"ZH1 a9HP; ?aC4T"C DQX $ 8k8%z+==D у`|1!Z9uE(%4$;fI`G.7)?1cPYlF\ MrBO{: =8  {9D## Ԉs> # Y *A[ L"! lBT(*T9K™s.'|R-C-*3D4T5d6t7C@@(08<=4!>$D;9<03ĉ9#pB܈!`#ø ?(;NhAPDDؿ DEª hpA:FE #$`W5/h-8HBh1KNŞk<LgԊ FD`BYT4`G1%MU!GE`#yvG[9D"CHA/T\?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉׊؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%[^|eK+[L-Mkۼ۽URۤ}[ڿ-7AT@ܡGQ٤[=|\i% \͈! ,W! , O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуN|3Uֆ# ŊiEr LI@BgIu% / 44C-gYJy D݆$|AcM% tRu]9eDg(Pb7#A58=ȑSW]%]@:/MFH #ZSfԜ9^8$GA"` IgINz?fyvgJ7>#Ѡ~ EɴΗ@ )fnEN; DjhH3R % ?#@BJ-ybjIρh,)lIg9oĠaJhrEڪ?-yNz-a0\=SO:4J/ӎE|*0)V:Il|sKQ{T-@n+И!cE(c^E1oCO QQlutoH;56R?o;?^@(,E露l춇w\3,w$DusO;~DQ=58AotxJ8v8A"Fn͵,j#B^sNW߭_4n]G+T]mrI<4piuo(2 tIGZg_ ,!G/M?Z{&! %?qyW= }^ %nxA7U&`VB|"J &Erѻȩ İ#vȬHLG$0abތ#iAlÒ$VĢI"~qhjS1"EЇ 4¦\Hd~q'w {҆\iA]p@F%E$/@X~ PM4ɢ$Qj 9cfI4#NچzC"/@б6$e.KG ;&A% &-2:4Ƭ9v g4x<0 d )9yB?&<# ͆R*2&N  ܳ$@&]F#t/h'N@HNId!,7 dtR @qB2¤,0P%Wch2$7E@BJXazNH@J**'^4Y`D SYWH@?Ɓ "!@R-Rk,Z}A ɯ{dU aT"Z]MQ΄ɹHrV h ]FlGd珉 ;ět y,5Qt$(Fx(-$(h98ؓfx%Drcyd' *Y+†u*IMZ$EZ?4׽ŌG xv#7DmI9` p]̮nb9yL%el4k;ĕ30f$ɑb8 +Y(b;yŞhV *Ahcݐ1/ L3h P]0I变8f "7HjS+ͱy?I M\@gtBiBW apJ|tb xcG,꒤׿&Q sخ b d*; 9Y M)0  AauU1[m9$5O9&WX",ᑀ5r bEt0Pqs~qdZM"d!l N"{ ƌWf0:B[_2d Y4eu&x *zcM |x 0%H@a\s==PkJӪqvHPEA"Ί  Ȃ 7GbDז<*eo+T͟XFs"{?SJ;]m$|ndH 9tm$jSȗF0"3S@H8JUgQFQfL^f@$q~1|([iB[^8XViTC}Yz" '7| Oy'tT1PH>w"LJAHB2* pFqhVq0}7PF ([HW|A~ uQ wThF_J f+`zrц'"uxIKxoZ@RgxZ s^GopT#XC<`817OPpGe_"q*('!P;犧A l&! wq11(`'`cxV !AP%`r!0oh(6qiwvR{H4r4 &nIpvBytkyG!`97&Wxf{)` /pY6l&I:$wc;eWd%gwO4 pKh5!{J1 +B`AI>GN5(ap61 y7  '&l5l YI!(!ܘ@mB6vw)ob|4[Iy?6  Ur$q.+F~P%8t>0hBR8+z|I mz(|P 7 )3tN Z`8@&ht8D!il&&~50&x@ (IqH`Yq)E"w*!4xʅ&nY:vC0i@)E&) e<bZzO&M.yqq@! S!&:$RP$oQgѣ>* 6N/_xYUgh "I XP:M U ^qCK8X5P%sw25 U&7_FPHZp8 `B5b:&f` zׄzB0`qj?')<|*$G`*P%[513s 6I-ijF@@@R|pY4Lʫ$&lϦH|Pp*@9+%FHVqr0iU+PH{:1yrby11<QenL.pfh(A"$+H:?` +z?"J=]B3[) 4 1K0Pvxd(^h D_6@ | rbN8&wIk[pU "tD A aa1 p GEG*5J 5,><""(~<(.* \Gq14Ve!(&;BdZDSI7F6}Ax6Khu՚rQra ГVA-Dɖ;h==vs3p1($";fr vMxpzj>D|+IaBPȚ*?)wD#A!_,3ًBCo` bc:A,άó @T |CDg"Q(94!SM#Q {^Ma7 1y;L_c(]( =1 Ќ)bBC<@B/5 1 k<l VHkɳA-qr fBB84+baԠ@J8!$0`PZ(06}J!\ P<" F@݅ ` 1Bv  }MQ0]GM- &0)]s m5 #}!N{=\DА"ZBق`B؛&0q$W@ <}/I1 aayPpES!A r2Ս~1v İ2Fq%HMCBa mMH}W(%J]D{, Gn ~F+q!@!+` +M5R /^!!%&ݳNQ 3:$<.\ . !2ۢ=}b8I -A1f$!愑2&ݤ&K~Ƒ O>Y& I^{eg!Ⰻqɐ*A^@.!{.cNL΂(i )Q cCZ̹]ѻA]MZEA =tn(n 2+Wݳl0[%՞Pkֆu!D+F7 @>7 lL еe ?"WF-Бp p.4ZE&_A7 ;GrNA*%ZQ'0#l 68 C_VXZ\^`b?d_fhdjnpBt_vp4x|~O@?_/oz_#aYС)~<2)s oT&NO qO`Qa,m/o }| qfn!6ǟ&n<n?ɏ N D0@3D)QD-^ĘQco6~R$SHZ8Ң-]S̏hJTM=}SPETRM*eiQ^x&V]z{0հe͞EKlڧnUi-[MwKk nWpިFXbƍ?Ydʕ-_ƜYfΝ=ZtϥMFZjG[lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^G^zݿ_|ϝR_~0@$@D0AdA9g *A /y˰C?1DG$D DDWwa1FsgÉ1aGs%qGD2I H Q2J)stqJ-4"+$L߲43M5dM7߄3NJM9S1ps<4PA%PCE4QEeѼbH/IŔAɴSO5zK>%T `SWeUW_XgV[o5כaG0ѧ"T&U]MXYevj1<Y)t!"6]1]uߕXdx-W\'U_} $ץpZ栃E-}qT" jnȀ 2Y_Lۈ h%*nu9 ~zH9vg)ܖÂyFO(}+_ Dg{ ? JPJ0Df9!Av„o 8Qha+0 14Q25H k0O^'r[W|b"eь2vIxGK1@1B>ccKDѐDd"HF6P$HJF'J"(?B\ '+i Nj$e(?zL+G TB.w TtwR</}aD)1 IifR*-Mi$WAUU`(xH.]cr;tZ~L-ՋRܛXw=OT2]P5C=REyP[,p\&U0&#3f Ig=4|s}&FteXhFčP%2ϙ8)YJ$٧yhԭ>E-[ ֈ:iZCF<}=kl yY-Fl<9. B6,~IC:ܜ|\j'm]-[44y¤s&|h^P٭J-r#,E`wЊႄ}n%Axg`JyCj$R: IyI@ä/- <-ejQCrB g$0xil8qBd,ɩO`M2%B2H e$b`{vΏ Tp29I>$Yw~.G"H@;grO\r hvXs~r!Bh(9JыSBonzޝ7#6?葄̋犩s}~E<>}wn)BͿ~jgyJ׿"1p|_`4{ Y==*@=7+ =6[P?NJ@D۾1@xs95̈6:.XÊ/I/@ȸAh8Xp2/#$‚(8 +-C"  6CXBS=";[TC6"7c3B@`-#lT1A%d \ۈ C cӯ ÂpDd4c @Z» PtⵐHcźHCKl5DH4Í؉!B[ˆH9QFW'jno$68Fq>r4tcCutwxy4GA ?xCz?{ }4@{ TG? ȃDȄTȅdȆtȇȈȉȊH"ȍȎHX9H\őD-,4YCɔdɗɘəɚɛɜɝɞɟʠʡ$ʢ4ʣDʤTʥdʦtʧʨʩʪʫʬʭʮʯ˰˱$˲4˳D˴T˵d˶t˷˸˹˺˻˼˽˾˿$4DTdtDŽȔɤʴ$4DTdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`T(dV7J;f=QTRJ5I݊PCtmnNpDoM6 iQ1WL ݙ LE@MALݤ[pj{|~T N׌! , O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ET%zp`‰@U)tʜv۱(,Rm#ku{&` /h@œ c.%VuJkXGY.]Zd[:%B|ܲr9{1tufښ5cص3L]!plWO ɏ48d[vhq{'}&u@HIHs݀2fʄ!Eҗ Q:*V4D%zрR@ !CpD[b82- x R.O3OEE]u`2ϖ?GZreGLBIP?QICɢnN2 dKOrJ(#)Zbi;5Z>bJd&JkE><ye*B tː;lgO>@Z-BR hms.Ay-x0@0HKЛnNL EO0rk70C,*voe)YKCB7LQZ";.D.Y-8?WktZoC]Dξyf_6Dccdz.ĭ"+Kf?:+P2fQ * =J, 9єsFu$^!#^tD#yDbz:S:^}7qoH3%bQ+7WwBa|GNPQ@WSHEMў?Nʇ/`GD< "bW@%X +~ Ȑ䐯X^HƄ @ jDC J0<17p![S2Ri+;+I{ѻ{իXuaj^1i3s(S|/;'Pj1}뚼K84$D +iA }q+`B0Eں(_+! r{T,I[1;7%,K C 1A3)F[ sikQ:Q K,‡;L ;oZ<ס@yDӎslDzBg۵|7'x7^s5l1m#̤E;'(4ڻRa3*3E` N=* 1pEם-ԁ)R 56}R06cic7@.@9-̄ e%Q- !RW{ۋmܺ@dǑAAȫ   ! 1-5f\ZNcߛB0R xSS^Y /`v8Qb$ o!ia>\> Yq5O?=`Zzx }!tV `}-q-%!Ν;]OP X:=n8En>^~?_ ?_/ Ͻ_T# 30V DA |C<8@?~0y1 K0I@ANP QV3:A aho/Vi/$r?6`u]a^o~/<m@9 o~ PnozA:c ^]_.COI{?Ŀ+şʿv{?_؟ڿ?_A?_?AZ"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^Z߸v\VXe͞uZmݾW\uśW^} @`… F|t9p?Y2Hr.#дq͝?tխ_Ǟ]vݽ' 9GnlɱW_|(S*_ 0@o 0AdA0B 'I .+ 1Th ?q.j,BD1ųPCE_ ;p 'eLqǁ `H#DH%drI'I)rJ+J-rK/K1$sL3DL5dJ 7ꦛ4( gN?;ڳO@Et:A4h84R%C%4Ӊ(jԋ҃մadF`Qbǟ-GDmRSwUoTW}II$G(G:pNRy0 PvjTZ6,f *4Zqs$rB Nn2 JE(n82GEEX8GUVixm*C.w " =M18a[Щ#SAԎc dLq畗.`[Չ&A #G(#NnexQfmǑZ!t)C<*f)q miJ\*}߂!l"(<h RWGOb6QT .@p<$(!K RQDC008 ;0ĠʈԲ!rxFOvAd}xC&PQ2w a\qW$(@F( Ѣ@H7Dw1d-,yArȩq u8GHD@1F\\4,F yF1Nɔ]"peF(9YThe+]c &(8JaB( d2a+9 e d,f6 㴐܂.>Y5!NfR\f:BȈ2 :">u3'- Z,@g. ЁOp2rPj{;aG?ڐ)QX 0ERQ`4(H"ҏvt&-iBR/UIcҕԥ6iMu*ӝҔ?iPoӡBͩQT6K=jT:U*L}UUfգXU*XHBD@0a2P~TWZQ!" &1~q`Gscn @9r,(IϊQ. 2) Ji ,YG3 x 9xe& 5!tsluS[6cytu*92hSKH;Ѐ4G^˄$Q-Em*Ro\P qFIUKy󑈜(2 yz^yw64zJl>,ՃɃtnDQUwJgz-;Z{J>oq!:}#C%ݠ8K߾Cd)dIڋs7'*f;u&ov2$eq\op~. B| 4R+6(@{L . Z1 1@?[ Gн8h@z.݊j,@2(Ix 82$p>Bd ?%lRpq8#/9'|G/ < /4,sA0m;6?;7 6 # =:$ A<AĄpC31`SH+ڡ=KTѰ5cD>4 HDDL F\^C]ªD@ac4 ^[Eddftghij\Mķ EknoǷBK pDǛ2I|k>OQHt  B :(>Ǡ0ELk;H ťRy[|;LJL^3ƃHSThWt٠GY tP;& *I݊VɨШH XdЂE\ȐXCS| 4Ek TDSA Z.HJhV5ZD\r,GhB< hS" ЂO ':J(I .$KV9LpǙH46SD ́ ,̚ƎH54lͬ?DM.*\MDN0dΩЃΖxNɜ\ ۊNOa TtRpOO%5EUe/Br+P!ǜ UMUQ5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵi%5^=C!uTwr]@]!PIކOֵ7^˅;`p]R@K]_ތ! , O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =.Hrj (VL'BKÈILhա ׶,ō ZX2ʖ EǛAf5U +tAug b*#_3&`Ky$ʤ\[N5wl;χ>^dJT6G}!7AxRHmyXSɂOITx5HQ~MhRFB!t"HHЉI'@ <-rT בbNR: ܒF(ٲ`HDVOIјe}COcEXieu\?@;ddC,G nXn E  %h2֔TgC<D͜H-yNy 'yrk`~OijAL3;2Y">l"O-r0nt쟇9Bq ,vDK3 t::v֥@r%PYj?3ϊn.LrJ]A,1Hx2Yi0Gn .F wo\cvLCϝd ќ<|"(AWy@ ]]9&|ѥoH"kJ}ISGbd9k[DK,4wDߚc4uuWݷSEsSW4N;hXdJWV$RBjąad@@܈Bd2!D^p~+V GD0щA<HBf1# 4*E"# p j䌾Y{pAIi aa:$?wc7GϏNd1H( 1FN-{z8:I5Ip@> F 98Ddy\%Jܕze*ɣȑ a#5HQu#gdŒ2x<0 d )|H7MasgD(4(}3ZK JtAC:% @&0lX])WHJRhEOAX#DDx&j\"3@~+|A,!CDa|A`ь)+LETTJA IʲP"$e@h!T*=5S)'^4\-jaÉD WZ H8pQN48_Ι׺caz9 ۑ1kP֯N-AōtÉ@L&fDfFG T CEx{cM[z~!DSE˲܁T $bCD'Dr$o_>C\&X$1׫xcH)"T'="G9@I1 Q5Q2 9C]% '>P9vNѕu1EW'|@0 9|0@` 1uh40|E9Z}DwevI!@} !kxuWpT0^ϵT|~" Đ`a9h|Wuv & rJ!@i@S`&hP&deJh;8Md]Gx/pO_:,1Lq&Z`xN& *@ xtYSZI@'s!L EС*$;&F 6 oK!+a8HUl>4B Hjx4TaW޶xqPg! Vc/@iIy{7&fl #a8 `"Dƹ`^tXffⶀFAi];>f7Xh2XKJhYP[@q:!9AaAK_XX(ɧzp4RCQ(PobfUAzv!@ڄ?AJO "]B6S1(28p *f@iArAf$ӡ~Acb Uh|4& 7C=̢btX{33kYQnc7b>3A (H;pHGa t'J&0<) 2F2.&l@ ЙQ ``쳵j5F8A0/0jȠ$p(+wN1%cp)N d-L#l gtrjJBu`(1FKC&Jr[cñ @ hl$Qp9 1Yk;"rw$?Zs2R oJ3tq$ۄQ̛k8q&QS0`p LeĻk8;skcAʾGK;rq3h)#.2GIq'2p2'KɆ>KU  yTR9jWN!2JT.2쇡a !@FlJq,l1q" &q Xdb҈ٌs\#&(D0ȡːc(pht,l@"W  Ke74  mH;m8" 9@\e|˳p̵$ `Be0+у%d6>=@ms;{ :`:1Q kKdٲM?c жL_=dCb74i[mH!"h@ 7Z9MA!@A D!VC*rS]S&#@ -) k <۳M-lDڻm VPQڙP*E=4PN6!`zC6λmܐr 5|@f!2Ѷ; W0U# +}ݘ$/aȠPƤ NR1 $aɍ}}Sdm<1ar5v9~q~+a4(ܱɽN^ P.RTNVCNFLIX.+N޶_m=e BѶ#]e01<@6[DrA )|3~[NqLTH1ߥ .g-c^BPE~A޿2a$[eHvN.| ~n pN:v>IeҎ"K2,a ^a nCH 'qh?_ $/&(U*.0@1?4_6/7:<=C!b yN YZ;0Jo?WZ?\=$!r\_f@~t1njlv`w?H.{_wOf# Uod_ C|^ U_;s??H5M ~oW!Ep\`_ޤ _Em@'_ro6/ 3?4J""_@@ DPB >QD,^HQF=~RH%MDRJ-]#Ƙ5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`…gXbƍ?Ydʕ-_Ɯs\4ZhҥMFZj֭][lڵm[wnnn\<G\r͝?})խ_I8ݽG8q^z_Xy9D;:D0AKC r)PA '@ /0C 7C?%F0DO, WTE_1FgFo1GwǶ# G#3p#d26&2yJJ-K/3L1$L3Ga$'C}B,+A3O*OO==A& "$X`'tБsJG7ḿnSSjM kn (RpN(5bA JuU `n(p eA6WkZԘ ,q%M(#ȠX*br!,@Z(9l6߰aTJ} lZaa 5l5م7<ăB^AnT[W֠$ָg&Thu\fh^%a&h0nSZe_k8X2@p(>v#c ez膰;R:o|(&*5n'^6 " R z\%Ep8e ar ! <2m3%Fa)b)Je^meh_rNz]SFl) U#D i`ؑ|V#8^$b`0_^).V2M-mXBjq Q%K3CN.-9WGut O,HĜ;}",0طE?: i}28sLUk{Sl׻) FSIqy,TG k7~p8 " o(ȆKu1k}I=;'mAH7xRv&C}w%{-^ ;Z'TaYB_5BuFR1CuyK51ZN=2=8(ΣD C ->>/,# *\.p{'b o@̸A,TB>C@d K;Œ $B+,} 9$T$()*+<8-Tz&0 00l*-<54!|Þ;4;cÎYø@Ȓ60Ks =0=4 c; 5 E *F԰{  0j JD K?B7xĐ(;189U=MI1נ8D,{:$@Ĉx\Z,2E#R,AF:hƟ Tő~ zXAF)3\,<# |:$m tT6ДblT,)P IX45YcGȁQ$[8ȍOʓEt -8Ƣ,~<8@I7䜛 .[I0h\C<1 MIC4ʈXJF\ĬDʏʮ¯K+˳D˴T˵d˶T@?(GKT˼TKlˋ$4DTdtDŽȔLG ~L/L6ϴM*$ҔDdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉ت؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠ1Z} H9Zjː%XX} ȥڬZ)KZyeXYڐE[5XC(ۍ# HۻT۽۾5M|۩! ,W! , O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJYL* XBς&ݻ[G

fs'|r%<W5}mpqrEXuY#N!M7__G !L"BV"|Օ+CcE-@N&ƨ=@ .xPEDdD޸2JIJ 8Xxh bvXRE;DY,:0}b U8_[LŗݧN 2?uI8IWs sA v$}a"< 0$B}d!C  >c>ψ,D)r$;1KƑ`=7ZBȯ"z`VU#t9c/yo\zr3:"w.h09:RAS5+t (]N;!j#"GQI4~r%# Ph,0OD*e\8]jVa@g}Q1 $@ D!R:_B 60A6/&zD m:R%!:)(jRJΤ :2 M#Ts!LUA5|\l o{ @6N5]BzA`fGqJA`LB4'<"v"D aG (D̈|z@II҈SA"=xh*QdFOeRe~]\xĭS jo[:rSRN)JaoEG١BL ͈<>Yv!?eU=1mGf~)Y^q۟.rZ:Cc.GQCN[B4A*>3#;T#B 86{B|d^5[3_rFD(o `PI?̑,~ (,4#6)g]` |>]?ދpnB1b Y{6^8$xB  :Ĝ/6.-cK\!b P^̐|҉fs7lY)D?\Yn8 ;Syc :#koŪ15T`ip eDy @tf(-r҇A :f*%Ĺ/lE7tۅך4n A>CDK-ē&f“bDV dXȯb8/%P F$ۈqq> j$̐0w"ѲG3egYwS`F=ED9Y70m y~0 @DZ@?J R;S@qjA]goA:,p~a&Ȁz{13QMyQ ЙEbIѫ?1x:2"NGy" pK `@/N K:3m&udZD! A3D# ra 3 H ">0@#$].+Rԍc6f4' Zl6-zqVŐ#&kZw]pqLa0r`Ѐ:.A 1{?'d}^!~7`2p}~h=h:x1!m:сQ{KV Pr`NP ResW|u!"4oҁXu;K.)@Ad(K\Ur1h]8ErUof q8_!&%7k? ~!J#v0P JvAW"Mu:5|'`k }'rчAiqjw< a] }ae40V8 ` (RO rv>QwJ& GPP"@@pF7Lv]x!E@c`4{sз".ڕ< эWLˢ4xb0h V8;!А0y n0 wvزyp )aV^%Z&]GyCw4$K&%t/ ^w{W =hB]#ِUГ0AR7'54a)%G# 4J rOpЕ!a*%(㰕wAHAd1 갍Xx Aq[(T9r@PZp'ܣ)g`H]6N]V&xeiXRk x8!u9pI[0 ?(` 7$e|v##XG=i "T Ly%YDA(/X?I#C`1+Pf1 PRX&aҀ]$,umy ATf77U;:z1xFב9Iv9t4{ ',Ese@ Os=*oTU8:_zIhBf/b*c-:~1YL1*QoZ/@ BL RJnx-LSRŘt|#?EY7hrq2sr  €V+ b:-hѡ#9b/{8%n 1.;:kj')q8RS6 A ‚xA"3*F@_J)0s@s3!xa SgQ&'Q X/+<{`7KDM'- h'l  B bJMP:Agհ+A!0wP;b,K~rqQ[d)~C qE ۹\"!ka,ַd 롂$w6!#'u%{RC{Y. {K+Kǫ{˻8~~?aB;3v];K[?NTg~"  o &Igѭ{eeQ B7HU@!;Q:XKޗᲾދ,@i8C)  G,8~R *6B0<!Cy: qc~ˢtRA:A콜Cl#< khO - *G[fY@a.ÎPHc!6' "=hL#3fI0x =W>FLOrDžlA& p BpQ56+v1 ! ^K"DMWuz>V*:a̔̎ Bf=VDzJ)ɝ߀͕͔yq0х^~?_ g?_g "{ ` *V 2003%.#9/yAC_'N I`NPPQN U"\9A 8bW-jKBdMTok't_빹[<{^!ZOm6^! dϹw̡t?UOO j0(aQKo2=*2raBc?_~_;?_؟ڿ?_??_>h"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETREkUU^ŚUV?VXe͞EVZmݾW\uMy^}p9p FXUr.~0@$@#10B0C R ?1DgeL e@D_ (ilGǛ$dLhH#d2 RI)tH7̐2=Fad' 2L9cLG`GJhJ/PtdBf-@ PK&v BNeFAefZ\KwM3W* BYɊ؆@unxh Gey喷EdIK}HqEtme SuY6ll)waaA Z!eH\"7bGnbЙ J)haPhXp\`pZahLhHF:Gܖ~F`pp&H/fb]Y=܅4K]H\! h}#Zȣ};\ ʺqd0mM1s٥#Z".Ȏ (]"P&hx[@ ]g>0R=z]H/xjyz2 YSvqavia02 bTV^4FD8F82DГ5Ȯ< ̟g<0Ȇ "@.Ń-Bc4.Ѣl[L᫅P j"U!c@Ň,^( 6eD (2aQ#S(E6  12Y"@+ G?:d "HB>vh 5ytGNf%[4M.CSA 4E%MR0u$2~ e"Ŋe6Sd&4MjNӚf5yMmvf8)NpӜD'9yutg<9OxSħ52Lf:cp3(r2"(b0T BЉD E-Q(GEQ EiFGjR*=)L[*S1}iNmJS;LzSը?EjQJTD* c˜pw3'M` 8$ ΊVխok\C `k^ V"y vUW`ū_ &0U՛b5Ʋ fwl8V3H 0q# A^2цPTfPkjY eYm ʎDlڈ@Q`5H?BO w%0/E\$q-z1]tEg&aM q 90{S`pv{ H$^(.F*=/J1ޚ >h 0 8{ <%oHf=:FA R4FC[.ߤ5V&}t5.ln8>rH]sAXp<$CB ܌yт4Q$@?BVWG h?\.O둳0UGP "r@wvy!|o״weH$eTC z!Ri|d~;Qt#s6]/M VzzņR'M3Ain5+\(I cy[qD1oVBY zyuӁ(|6J&({Ĉ9y/;{ҥ^%SǺRuh]{ &bgbG;q=w{YN/ז\taޝCĒ%{yT "_=du>y#= =ٱ H~"/22|wLV糉*/@<D Q5 S3A> z$@@F8 ?ر%\R=pqx8.Z9\ +( # .081S=QCCxC$8*8h>/- $4TA?ĺ?:01C*"= =6JH|D"ģ(AR 4ED{UEY[\]^_t $KcDdTedƄ#8Dh I ZȞ<5D p8HD_#p/ 3td,I(H0ʻI^C!Bq ?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅݍ&!RصZYK\5%XR^]ݏu7PDT^}NQxE_}5E%YR%uތ! , O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуN|3Uֆ# ŊiEr LI@BgIu% / 44C-gYJy D݆$|AcM% tRu]9eDg(Pb7#A58=ȑSW]%]@:/MFH #ZSfԜ9^8$GA"` IgINz?fyvgJ7>#Ѡ~ EɴΗ@ )fnEN; DjhH3R % ?#@BJ-ybjIρh,)lIg9oĠaJhrEڪ?-yNz-a0\=SO:4J/ӎE|*0)V:Il|sKQ{T-@n+И!cE(c^E1oCO QQlutoH;56R?o;?^@(,E露l춇w\3,w$DusO;~DQ=58AotxJ8v8A"Fn͵,j#B^sNW߭_4n]G+T]mrI<4piuo(2 tIGZg_ ,!G/M?Z{&! %?qyW= }^ %nxA7U&`VB|"J &Erѻȩ İ#vȬHLG$0abތ#iAlÒ$VĢI"~qhjS1"EЇ 4¦\Hd~q'w {҆\iA]p@F%E$/@X~ PM4ɢ$Qj 9cfI4#NچzC"/@б6$e.KG ;&A% &-2:4Ƭ9v g4x<0 d )9yB?&<# ͆R*2&N  ܳ$@&]F#t/h'N@HNId!,7 dtR @qB2¤,0P%Wch2$7E@BJXazNH@J**'^4Y`D SYWH@?Ɓ "!@R-Rk,Z}A ɯ{dU aT"Z]MQ΄ɹHrV h ]FlGd珉 ;ět y,5Qt$(Fx(-$(h98ؓfx%Drcyd' *Y+†u*IMZ$EZ?4׽ŌG xv#7DmI9` p]̮nb9yL%el4k;ĕ30f$ɑb8 +Y(b;yŞhV *Ahcݐ1/ L3h P]0I变8f "7HjS+ͱy?I M\@gtBiBW apJ|tb xcG,꒤׿&Q sخ b d*; 9Y M)0  AauU1[m9$5O9&WX",ᑀ5r bEt0Pqs~qdZM"d!l N"{ ƌWf0:B[_2d Y4eu&x *zcM |x 0%H@a\s==PkJӪqvHPEA"Ί  Ȃ 7GbDז<*eo+T͟XFs"{?SJ;]m$|ndH 9tm$jSȗF0"3S@H8JUgQFQfL^f@$q~1|([iB[^8XViTC}Yz" '7| Oy'tT1PH>w"LJAHB2* pFqhVq0}7PF ([HW|A~ uQ wThF_J f+`zrц'"uxIKxoZ@RgxZ s^GopT#XC<`817OPpGe_"q*('!P;犧A l&! wq11(`'`cxV !AP%`r!0oh(6qiwvR{H4r4 &nIpvBytkyG!`97&Wxf{)` /pY6l&I:$wc;eWd%gwO4 pKh5!{J1 +B`AI>GN5(ap61 y7  '&l5l YI!(!ܘ@mB6vw)ob|4[Iy?6  Ur$q.+F~P%8t>0hBR8+z|I mz(|P 7 )3tN Z`8@&ht8D!il&&~50&x@ (IqH`Yq)E"w*!4xʅ&nY:vC0i@)E&) e<bZzO&M.yqq@! S!&:$RP$oQgѣ>* 6N/_xYUgh "I XP:M U ^qCK8X5P%sw25 U&7_FPHZp8 `B5b:&f` zׄzB0`qj?')<|*$G`*P%[513s 6I-ijF@@@R|pY4Lʫ$&lϦH|Pp*@9+%FHVqr0iU+PH{:1yrby11<QenL.pfh(A"$+H:?` +z?"J=]B3[) 4 1K0Pvxd(^h D_6@ | rbN8&wIk[pU "tD A aa1 p GEG*5J 5,><""(~<(.* \Gq14Ve!(&;BdZDSI7F6}Ax6Khu՚rQra ГVA-Dɖ;h==vs3p1($";fr vMxpzj>D|+IaBPȚ*?)wD#A!_,3ًBCo` bc:A,άó @T |CDg"Q(94!SM#Q {^Ma7 1y;L_c(]( =1 Ќ)bBC<@B/5 1 k<l VHkɳA-qr fBB84+baԠ@J8!$0`PZ(06}J!\ P<" F@݅ ` 1Bv  }MQ0]GM- &0)]s m5 #}!N{=\DА"ZBق`B؛&0q$W@ <}/I1 aayPpES!A r2Ս~1v İ2Fq%HMCBa mMH}W(%J]D{, Gn ~F+q!@!+` +M5R /^!!%&ݳNQ 3:$<.\ . !2ۢ=}b8I -A1f$!愑2&ݤ&K~Ƒ O>Y& I^{eg!Ⰻqɐ*A^@.!{.cNL΂(i )Q cCZ̹]ѻA]MZEA =tn(n 2+Wݳl0[%՞Pkֆu!D+F7 @>7 lL еe ?"WF-Бp p.4ZE&_A7 ;GrNA*%ZQ'0#l 68 C_VXZ\^`b?d_fhdjnpBt_vp4x|~O@?_/oz_#aYС)~<2)s oT&NO qO`Qa,m/o }| qfn!6ǟ&n<n?ɏ N D0@3D)QD-^ĘQco6~R$SHZ8Ң-]S̏hJTM=}SPETRM*eiQ^x&V]z{0հe͞EKlڧnUi-[MwKk nWpިFXbƍ?Ydʕ-_ƜYfΝ=ZtϥMFZjG[lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^G^zݿ_|ϝR_~0@$@D0AdA9g *A /y˰C?1DG$D DDWwa1FsgÉ1aGs%qGD2I H Q2J)stqJ-4"+$L߲43M5dM7߄3NJM9S1ps<4PA%PCE4QEeѼbHmC1T=J4T%QOEu4Sy5VXgY 2elRun _%صWe} `XEvYiV!h6[AMZm]Fq)C}*jXg\{9[w-^={֬A@bg݄u h!8b\XdAG݋'8Wb]bĠch Rpf lY xLL `pfwd3:9$)bB ؞hօj( dkvhZeh7jXpQZ b8np>&g1emh:GvgU$hٴ%jxVv*6:e'Waf˗vhz{ he_h]^"[ ewȢp'A?< :0(WIX9S 7Ȱݠ zMz *"; ~9AfI$"ñB`X|0t3D8=YD` p=2sAFP!$=g +X @E!43 DÂ0A(~ʸ` *XXBϾEj%RdQh@1"aR1#()(hLSF@8 x HǮ1"R (;*nj<  J |]#ܣ!s|Td]hfiv1W. L|edyYVӉ|1GKl!AYR669mbg6!cQBtw13zCEbOd(A434=E2ҊV(IG2 *%(&cԣn*6UXƦiJRuC-Lgz,D4]n 4"vtئ-m W!F5*ZǺV5oe+\Wծrk]zWk`*XְE,a{&uld;YRvXf5 Ve`ÝbQX }i RZҪ ]kʖmn[򶶾-po;\ָ=npK\U.t\F׺ӕnu{]vߥ.x+^Uýk[4֕D$@p@_׿01` |`2f7.LDK$o&NĹy$}Y)ƈ,:yCۉǩaʘ h+b`D`0BВy H!FmyX%kt(度M0`Q`VPu!*k" n_H c$Pe㜼t왇-3{)uB,N "   O">Iy7`bxFLs7]9]B#"Ef:,`va>=c$t8-uVwIdyU>&: N!S">)W5c/Pٲc EZ*YC]y!?CN%uUmχлARIa~Hqsv$CALߔUy%=Ў)rW|Ew| .7arh:x&_=eU>@aVB6O 9J:m!sU? >ÍXc>?t  @S @AԨ9` $A$1K 0PA/cS E04 1}+:[/# 28 }pЋ) P6 $0Cf 2̷HB44[;T$Ğ`sXD1Oˋ;мi393B8#C&DDDĊ,D .G[ Pƒ0T`E ?ĊZ D\;XDIC/?8AS<I]LTܾfDw0fFD(ƳEPKRƋGDϰo8@lw<%/+0 Z5eʈT̎% *3{TG)3^tF/ȏr '4iDJŠ >kg; 6,Q#IIHI{Ȉ LV+54[EG JɣsBe dʰ˲\ J(Q#JãT ì .L=7I 7ln, =CƔ[PL(=D!3܈10I+1,ތK̈6G(%ū(N#ԄD0l?29C|,OJm</UNɈN0N-dhTB!1l[U\\"p2@@` #lUuE?A%B5CETMG]TxI E TpTJETNOPQ%R5SETUUeijXYլ*rbJd&JkE><ye*B tː;lgO>@Z-BR hms.Ay-x0@0HKЛnNL EO0rk70C,*voe)YKCB7LQZ";.D.Y-8?WktZoC]Dξyf_6Dccdz.ĭ"+Kf?:+P2fQ * =J, 9єsFu$^!#^tD#yDbz:S:^}7qoH3%bQ+7WwBa|GNPQ@WSHEMў?Nʇ/`GD< "bW@%X +~ Ȑ䐯X^HƄ @ jDC J0<17p![S2Ri+;+I{ѻ{իXuaj^1i3s(S|/;'Pj1}뚼K84$D +iA }q+`B0Eں(_+! r{T,I[1;7%,K C 1A3)F[ sikQ:Q K,‡;L ;oZ<ס@yDӎslDzBg۵|7'x7^s5l1m#̤E;'(4ڻRa3*3E` N=* 1pEם-ԁ)R 56}R06cic7@.@9-̄ e%Q- !RW{ۋmܺ@dǑAAȫ   ! 1-5f\ZNcߛB0R xSS^Y /`v8Qb$ o!ia>\> Yq5O?=`Zzx }!tV `}-q-%!Ν;]OP X:=n8En>^~?_ ?_/ Ͻ_T# 30V DA |C<8@?~0y1 K0I@ANP QV3:A aho/Vi/$r?6`u]a^o~/<m@9 o~ PnozA:c ^]_.COI{?Ŀ+şʿv{?_؟ڿ?_A?_?AZ"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^Z߸v\VXe͞uZmݾW\uśW^} @`… F|t9p?Y2Hr.#дq͝?tխ_Ǟ]vݽ' 9GnlɱW_|ǟ_~0@$p;1CH*" PB 7Пy 3eG$DOD1EWdE_1FgH7w)GY>g ѧG'di|II$G(G:(jGLJ2L5פȑAg 8n&@Ί9(BZF;MIZ$JpJT"#Ӧ2!f SZu% fp"ֻt%?G tj#S!hm(hYY86C5۸yeYC ^"VCzwha*Ѕ5lEvصqUj` g; gI _Jڷw{"azWfoQ`?|+ q F"X8 ^wo _8LP +3Bb 3̂ԞBxCVl=dH [QC 5ĄPJb­܂.2VIbhRR D."8quhG>汏{c 9?R$!HF"ґ|d#!9IIV2$&-INnғH. g,( 򶝰m(%/B%Ar[ֲ.}`%2Lf.әT&4)g f69MmFf5Éq~S,g:ѹNp;kKQĂCCo} (H8EhBP6ԡe VT[G(ZC$*NԢ'JGs3Ғfa28NC pF]DKļllP?ʏ? OUWKOB&bH[@zUq!誇ҮHbjS֖t"tŪu֓ucU+f=K2W&o+EjJyeQ,ń$"_1[46%j]r2@:LK5P~0hեZЬQࠖ"]z&61SH`(LJX!ޑmkʤ5ȇV`$}3Hq0xh=D!+EVnAٝ6IFꏡ!N!vo %@#R~KVqAH# +}iJJ.*BqP,~8hNU uRᤲ"qLܢ$9l~;6Fh˨ƀ=D[~ĥg?$$'>B$ވ>ڌ`"v yϱ,$EF87?QHI$zc-jZWdD?K&mu1r롌5 gqN-lf#js KY%\vM=܁vmX[ ѽnsl06oH%gP[K?o/ W7Q8ׄт(5[>zR. 1 =i+s;"elE&k҆=&$yF#$OZWTT9=v=hչT0׭ IXo{L 'p?}?~ [yr%R}"x>0QZ#E-\-!~##w(q|G*B~ݨA,5H"mRPu{!X@ p$p!~CF}F%B  D ER/?$$~c/ ?@8(- ˈ?=<8ƪp8).觤9/ Tҽ;Brc)J@<)֐@ 4¥X#d&t'()Bv:г *./C0DC@.ø:Û3 ȨHLC@:(@ ?h> 6[+Dk0.x={CH<$B, ۉ P*8pAט:\% D% *E"ŨEOt XWd3ЂA@#Èpb|@dj@y*G Uj "!/sv FTF 5('G=Ĉ H83ʈ9H/T?SǨ-pB SlȰ~Ą}8 MH];2A GEHFŽDH Ib듔ITJ@ʥtʣЃ8ȧʠʩʬ<ʮʯ˰˱ =FT˓0H˵ˑ0T0˻[K˾˿$4DTdẗ[ {LtL4DTdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉ب؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ"5X"ڥeZZK5Mw !Ǧڭ?KڒƧرڇ;LYRY۳ۺվۼ۽M%3"ېۊ! ,W! , O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =.Hrj (VL'BKÈILhա ׶,ō ZX2ʖ EǛAf5U +tAug b*#_3&`Ky$ʤ\[N5wl;χ>^dJT6G}!7AxRHmyXSɂOITx5HQ~MhRFB!t"HHЉI'@ <-rT בbNR: ܒF(ٲ`HDVOIјe}COcEXieu\?@;ddC,G nXn E  %h2֔TgC<D͜H-yNy 'yrk`~OijAL3;2Y">l"O-r0nt쟇9Bq ,vDK3 t::v֥@r%PYj?3ϊn.LrJ]A,1Hx2Yi0Gn .F wo\cvLCϝd ќ<|"(AWy@ ]]9&|ѥoH"kJ}ISGbd9k[DK,4wDߚc4uuWݷSEsSW4N;hXdJWV$RBjąad@@܈Bd2!D^p~+V GD0щA<HBf1# 4*E"# p j䌾Y{pAIi aa:$?wc7GϏNd1H( 1FN-{z8:I5Ip@> F 98Ddy\%Jܕze*ɣȑ a#5HQu#gdŒ2x<0 d )|H7MasgD(4(}3ZK JtAC:% @&0lX])WHJRhEOAX#DDx&j\"3@~+|A,!CDa|A`ь)+LETTJA IʲP"$e@h!T*=5S)'^4\-jaÉD WZ H8pQN48_Ι׺caz9 ۑ1kP֯N-AōtÉ@L&fDfFG T CEx{cM[z~!DSE˲܁T $bCD'Dr$o_>C\&X$1׫xcH)"T'="G9@I1 Q5Q2 9C]% '>P9vNѕu1EW'|@0 9|0@` 1uh40|E9Z}DwevI!@} !kxuWpT0^ϵT|~" Đ`a9h|Wuv & rJ!@i@S`&hP&deJh;8Md]Gx/pO_:,1Lq&Z`xN& *@ xtYSZI@'s!L EС*$;&F 6 oK!+a8HUl>4B Hjx4TaW޶xqPg! Vc/@iIy{7&fl #a8 `"Dƹ`^tXffⶀFAi];>f7Xh2XKJhYP[@q:!9AaAK_XX(ɧzp4RCQ(PobfUAzv!@ڄ?AJO "]B6S1(28p *f@iArAf$ӡ~Acb Uh|4& 7C=̢btX{33kYQnc7b>3A (H;pHGa t'J&0<) 2F2.&l@ ЙQ ``쳵j5F8A0/0jȠ$p(+wN1%cp)N d-L#l gtrjJBu`(1FKC&Jr[cñ @ hl$Qp9 1Yk;"rw$?Zs2R oJ3tq$ۄQ̛k8q&QS0`p LeĻk8;skcAʾGK;rq3h)#.2GIq'2p2'KɆ>KU  yTR9jWN!2JT.2쇡a !@FlJq,l1q" &q Xdb҈ٌs\#&(D0ȡːc(pht,l@"W  Ke74  mH;m8" 9@\e|˳p̵$ `Be0+у%d6>=@ms;{ :`:1Q kKdٲM?c жL_=dCb74i[mH!"h@ 7Z9MA!@A D!VC*rS]S&#@ -) k <۳M-lDڻm VPQڙP*E=4PN6!`zC6λmܐr 5|@f!2Ѷ; W0U# +}ݘ$/aȠPƤ NR1 $aɍ}}Sdm<1ar5v9~q~+a4(ܱɽN^ P.RTNVCNFLIX.+N޶_m=e BѶ#]e01<@6[DrA )|3~[NqLTH1ߥ .g-c^BPE~A޿2a$[eHvN.| ~n pN:v>IeҎ"K2,a ^a nCH 'qh?_ $/&(U*.0@1?4_6/7:<=C!b yN YZ;0Jo?WZ?\=$!r\_f@~t1njlv`w?H.{_wOf# Uod_ C|^ U_;s??H5M ~oW!Ep\`_ޤ _Em@'_ro6/ 3?4J""_@@ DPB >QD,^HQF=~RH%MDRJ-]#Ƙ5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`…gXbƍ?Ydʕ-_Ɯs\4ZhҥMFZj֭][lڵm[wnnn\<G\r͝?})խ_I8ݽG8q^z_Xy9D;:D0AKC r)PA '@ /0C 7C?%F0DO, WTE_ѨW^oѮḵGG!<+H"1X/1RI)pD()d6K1TjlSd36 3N9sꦛ(0E9T:Dhe 4QEAODtQI'B4SqFr0!0,=RM_ūTT dUG1׹dy(Bt-P_OqBR!:\NGYokt GÆ X%@)[{[S m 6߃W* HW*2j@ S\78I\52#G R!e%eie9h0Teiqc"'stǝ <"#A"\ ?-"]X H z yBhbXe%zZaNXfglvh>h n)| x@<&=p?*K-&m 4&@M__ >l*g/`5U{`H d19;B X( "C ȃC 6 Л?XC+d 8Ӊٽ`9l ŇZţl0Dp%dߛ ` h;REGijNT8ltT%5i ݘ9IÅH1XB"ЊǍHwO4SIBGT1CK ->ȻàG,@EhrA#{$gHIKI(-[I'EA#3^|Dۍm[E3YɐLUbxh`N |+Д YԴ$@͈x,;ΐk$\3@Ohh϶܍\Α=KzBE: T| 4št3T#t$ l Ėl J $̆' ɩΎH@|ɷ4[8яԺ -K5 k!R@'5lQH3밎X!&;* *e ?3ň)4 3:<;Ӗ<=:mA%B5CED]@?(PET`THHԄT@GKNPQ%R5SETUUeVuWCJ*XZ[;Y=\S U_-`ֿ$bEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵ%5EUeu%5EUeu&6FVfv &6FVfv !&"6#F$V%f&v'()*+,-./c >g)cZ &5| 4;cTc 6pc@b!@ac6Bd"JdޝKMNTTGc! , O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJYL* XBς&ݻ[G

fs'|r%<W5}mpqrEXuY#N!M7__G !L"BV"|Օ+CcE-@N&ƨ=@ .xPEDdD޸2JIJ 8Xxh bvXRE;DY,:0}b U8_[LŗݧN 2?uI8IWs sA v$}a"< 0$B}d!C  >c>ψ,D)r$;1KƑ`=7ZBȯ"z`VU#t9c/yo\zr3:"w.h09:RAS5+t (]N;!j#"GQI4~r%# Ph,0OD*e\8]jVa@g}Q1 $@ D!R:_B 60A6/&zD m:R%!:)(jRJΤ :2 M#Ts!LUA5|\l o{ @6N5]BzA`fGqJA`LB4'<"v"D aG (D̈|z@II҈SA"=xh*QdFOeRe~]\xĭS jo[:rSRN)JaoEG١BL ͈<>Yv!?eU=1mGf~)Y^q۟.rZ:Cc.GQCN[B4A*>3#;T#B 86{B|d^5[3_rFD(o `PI?̑,~ (,4#6)g]` |>]?ދpnB1b Y{6^8$xB  :Ĝ/6.-cK\!b P^̐|҉fs7lY)D?\Yn8 ;Syc :#koŪ15T`ip eDy @tf(-r҇A :f*%Ĺ/lE7tۅך4n A>CDK-ē&f“bDV dXȯb8/%P F$ۈqq> j$̐0w"ѲG3egYwS`F=ED9Y70m y~0 @DZ@?J R;S@qjA]goA:,p~a&Ȁz{13QMyQ ЙEbIѫ?1x:2"NGy" pK `@/N K:3m&udZD! A3D# ra 3 H ">0@#$].+Rԍc6f4' Zl6-zqVŐ#&kZw]pqLa0r`Ѐ:.A 1{?'d}^!~7`2p}~h=h:x1!m:сQ{KV Pr`NP ResW|u!"4oҁXu;K.)@Ad(K\Ur1h]8ErUof q8_!&%7k? ~!J#v0P JvAW"Mu:5|'`k }'rчAiqjw< a] }ae40V8 ` (RO rv>QwJ& GPP"@@pF7Lv]x!E@c`4{sз".ڕ< эWLˢ4xb0h V8;!А0y n0 wvزyp )aV^%Z&]GyCw4$K&%t/ ^w{W =hB]#ِUГ0AR7'54a)%G# 4J rOpЕ!a*%(㰕wAHAd1 갍Xx Aq[(T9r@PZp'ܣ)g`H]6N]V&xeiXRk x8!u9pI[0 ?(` 7$e|v##XG=i "T Ly%YDA(/X?I#C`1+Pf1 PRX&aҀ]$,umy ATf77U;:z1xFב9Iv9t4{ ',Ese@ Os=*oTU8:_zIhBf/b*c-:~1YL1*QoZ/@ BL RJnx-LSRŘt|#?EY7hrq2sr  €V+ b:-hѡ#9b/{8%n 1.;:kj')q8RS6 A ‚xA"3*F@_J)0s@s3!xa SgQ&'Q X/+<{`7KDM'- h'l  B bJMP:Agհ+A!0wP;b,K~rqQ[d)~C qE ۹\"!ka,ַd 롂$w6!#'u%{RC{Y. {K+Kǫ{˻8~~?aB;3v];K[?NTg~"  o &Igѭ{eeQ B7HU@!;Q:XKޗᲾދ,@i8C)  G,8~R *6B0<!Cy: qc~ˢtRA:A콜Cl#< khO - *G[fY@a.ÎPHc!6' "=hL#3fI0x =W>FLOrDžlA& p BpQ56+v1 ! ^K"DMWuz>V*:a̔̎ Bf=VDzJ)ɝ߀͕͔yq0х^~?_ g?_g "{ ` *V 2003%.#9/yAC_'N I`NPPQN U"\9A 8bW-jKBdMTok't_빹[<{^!ZOm6^! dϹw̡t?UOO j0(aQKo2=*2raBc?_~_;?_؟ڿ?_??_>h"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETREkUU^ŚUV?VXe͞EVZmݾW\uMy^}p9p FXUr.HR& =4h(nfsU ZDU!HMkɖ ȖiUb}fYzP ]]UUXskX)6tfB5R Fd)"сhP=?kxSe6.~)\7l08 RՏ!ȡB1 ΰ 2ycLԅ2KT-~H\`!M٢eBj;5hT5[W^ha8"2ʺ2kl{]lnj0j!pF ["0% gR#ʩ[x#Gtg7lQo(Z3!ag]0WU+ "u {v)g<矏Ha GgH[]\C瘁B$zpgdcb , 򾃐| 2'AD͒AP B"ULJ!{(VD&FlP7: DyF1ȔY .@xYLQ bvQE H]H4"ORGXQYF:fEX ]55xA L#bT Y\L2>H. g8 |Ž~LȒ@,!T`h+cJUҕe-aY/{9L^S f2qL`2DŽ29gJD&6Mkf޼7)n3g:)`R@b|g%O!%( PԠEhBУs( C%:f(5I!B|ޤ C':Ҵd7 )?Ie㢛IDb`| Sk8Z8JEBӚT:OSΦ#6R12J 8܁~W-ꓳn+*KWܴڑZIrӹbdɐH⎿kB֔8ya(Q׉H$ #M_/{~5%pkMn4FAPIP)FJJI -J7\DmO׏T :H`V(J]7+ rkR H+>цXֵN[Qk^w$U$ "˻ nAI fQu!} nw8&=BDAoJ8voޥ*)v͊pa8(3g&ru!݆H ػdKחE>JrX EQ BD у c CBNT;/ODka!oD@;?tv ,Gz2P*H]Ai:ULkz(I>d%g\[j^wDkVW z(vLӁ(R2J&BĄ^v ;8{Žn%FMʝnvgwC$)ow{q|9w33/e8ϊmTX ,qx­#x 3qMe| cpShN e{?WgGson"vxwP9Z,l6y'Pڰ@-ON6n0Йs%Wd[s=G:Tdw5LT%C*LhgG237m(+ḋ 5Bn|yq4z;Ix$*ES7?(@s וkE!Շ$p!=EĈH3?~2ybq8#ܬܵEnQ|WDK bi-NQ6/<)*D7 r#K9?@ȳ=z@J |ʧ4C}=᫊в +C r@Tǒt+|$"D$T%d&t'(*HA),-BU3Ȑ!.$×+ ˊ9۫ KP1,C%B <;кC84 5 = cGcE P|!Hl2EGÈbĊJ*[i g <?33 ?[C`De47 p<CxT$dCpB SEPHTGF}lȐɈ[gEň<gɊd?@< ,X,E+3Wɘ4J ʣTʤ@\ʧtʩGʬʭʮJcƯ$KK˲TK8Th\˸[pK˻˼˽˾˿$4DLX;J\̇lȔL̫ʴ̾$4DTdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉آ؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞS1H.><oKm$M}Zx Kڪګ%TRZ]Zڮدu٭7@T [KQX. ٴڸZۻۼ URp$ڌ! , O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуN|3Uֆ# ŊiEr LI@BgIu% / 44C-gYJy D݆$|AcM% tRu]9eDg(Pb7#A58=ȑSW]%]@:/MFH #ZSfԜ9^8$GA"` IgINz?fyvgJ7>#Ѡ~ EɴΗ@ )fnEN; DjhH3R % ?#@BJ-ybjIρh,)lIg9oĠaJhrEڪ?-yNz-a0\=SO:4J/ӎE|*0)V:Il|sKQ{T-@n+И!cE(c^E1oCO QQlutoH;56R?o;?^@(,E露l춇w\3,w$DusO;~DQ=58AotxJ8v8A"Fn͵,j#B^sNW߭_4n]G+T]mrI<4piuo(2 tIGZg_ ,!G/M?Z{&! %?qyW= }^ %nxA7U&`VB|"J &Erѻȩ İ#vȬHLG$0abތ#iAlÒ$VĢI"~qhjS1"EЇ 4¦\Hd~q'w {҆\iA]p@F%E$/@X~ PM4ɢ$Qj 9cfI4#NچzC"/@б6$e.KG ;&A% &-2:4Ƭ9v g4x<0 d )9yB?&<# ͆R*2&N  ܳ$@&]F#t/h'N@HNId!,7 dtR @qB2¤,0P%Wch2$7E@BJXazNH@J**'^4Y`D SYWH@?Ɓ "!@R-Rk,Z}A ɯ{dU aT"Z]MQ΄ɹHrV h ]FlGd珉 ;ět y,5Qt$(Fx(-$(h98ؓfx%Drcyd' *Y+†u*IMZ$EZ?4׽ŌG xv#7DmI9` p]̮nb9yL%el4k;ĕ30f$ɑb8 +Y(b;yŞhV *Ahcݐ1/ L3h P]0I变8f "7HjS+ͱy?I M\@gtBiBW apJ|tb xcG,꒤׿&Q sخ b d*; 9Y M)0  AauU1[m9$5O9&WX",ᑀ5r bEt0Pqs~qdZM"d!l N"{ ƌWf0:B[_2d Y4eu&x *zcM |x 0%H@a\s==PkJӪqvHPEA"Ί  Ȃ 7GbDז<*eo+T͟XFs"{?SJ;]m$|ndH 9tm$jSȗF0"3S@H8JUgQFQfL^f@$q~1|([iB[^8XViTC}Yz" '7| Oy'tT1PH>w"LJAHB2* pFqhVq0}7PF ([HW|A~ uQ wThF_J f+`zrц'"uxIKxoZ@RgxZ s^GopT#XC<`817OPpGe_"q*('!P;犧A l&! wq11(`'`cxV !AP%`r!0oh(6qiwvR{H4r4 &nIpvBytkyG!`97&Wxf{)` /pY6l&I:$wc;eWd%gwO4 pKh5!{J1 +B`AI>GN5(ap61 y7  '&l5l YI!(!ܘ@mB6vw)ob|4[Iy?6  Ur$q.+F~P%8t>0hBR8+z|I mz(|P 7 )3tN Z`8@&ht8D!il&&~50&x@ (IqH`Yq)E"w*!4xʅ&nY:vC0i@)E&) e<bZzO&M.yqq@! S!&:$RP$oQgѣ>* 6N/_xYUgh "I XP:M U ^qCK8X5P%sw25 U&7_FPHZp8 `B5b:&f` zׄzB0`qj?')<|*$G`*P%[513s 6I-ijF@@@R|pY4Lʫ$&lϦH|Pp*@9+%FHVqr0iU+PH{:1yrby11<QenL.pfh(A"$+H:?` +z?"J=]B3[) 4 1K0Pvxd(^h D_6@ | rbN8&wIk[pU "tD A aa1 p GEG*5J 5,><""(~<(.* \Gq14Ve!(&;BdZDSI7F6}Ax6Khu՚rQra ГVA-Dɖ;h==vs3p1($";fr vMxpzj>D|+IaBPȚ*?)wD#A!_,3ًBCo` bc:A,άó @T |CDg"Q(94!SM#Q {^Ma7 1y;L_c(]( =1 Ќ)bBC<@B/5 1 k<l VHkɳA-qr fBB84+baԠ@J8!$0`PZ(06}J!\ P<" F@݅ ` 1Bv  }MQ0]GM- &0)]s m5 #}!N{=\DА"ZBق`B؛&0q$W@ <}/I1 aayPpES!A r2Ս~1v İ2Fq%HMCBa mMH}W(%J]D{, Gn ~F+q!@!+` +M5R /^!!%&ݳNQ 3:$<.\ . !2ۢ=}b8I -A1f$!愑2&ݤ&K~Ƒ O>Y& I^{eg!Ⰻqɐ*A^@.!{.cNL΂(i )Q cCZ̹]ѻA]MZEA =tn(n 2+Wݳl0[%՞Pkֆu!D+F7 @>7 lL еe ?"WF-Бp p.4ZE&_A7 ;GrNA*%ZQ'0#l 68 C_VXZ\^`b?d_fhdjnpBt_vp4x|~O@?_/oz_#aYС)~<2)s oT&NO qO`Qa,m/o }| qfn!6ǟ&n<n?ɏ N D0@3D)QD-^ĘQco6~R$SHZ8Ң-]S̏hJTM=}SPETRM*eiQ^x&V]z{0հe͞EKlڧnUi-[MwKk nWpިFXbƍ?Ydʕ-_ƜYfΝ=ZtϥMFZjG[lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^G^zݿ_|ϝR_~0@$@D0AdA9g *A /y˰C?1DG$D DDWwa1FsgÉ1aGs%qGD2I H Q2J)stqJ-4"+$L߲43M5dM7߄3NJM9S1ps<TTkW^9@e4A *TCmRK[zISO3tM RSS1TS_Elhlf5W%]6G9S 2edUYf  F1m5f6J6n7@[pՅNvu7^{1rFiʇG)bs߽&` >x/ZaϪFSmۍvcraEB/.(7fĠ/d!l!,(F\x0bXXelX_ ir?ȶ= !lIBe} ra矊ej1:%¹vp1p eLB{Ly@]SJ~pusab%Jӻ "eΎ<#]X  `z&n&r\h}w C&*nmSzl{-DjЃ(=uh`#{XF02(\v)>lx@F?%v:g! EUc B p"<@`(Æ@2ءn8 R[@A} xB#j(A7h` LE A!%H­z Wha|` (QBH2ZtAF @*C%ňDK%!3@rT B5Q#ըE8Ӡd%R]) altjR RU~:2bvpg jB$/JM #.jPjDrGKqA[.6@*PJb$EBY*g:aPb13^{b Oj˾-A2; rmQviE+, 72n,k`.A,z׼8(Qw_Ef <"-P{R rtH~'%G;&8xDyotaxph߷ iyLq kDϐ`$GJ'Bq+` U oX\8-0[悡C crc (V+b`H  0^~=@dXSF[W.[Df Lw@GAX#`Aȁr{)\ R|CABC$"3txނycx}{ΠX'>EX_1@lT *ds1>}s+%Po$97 }{}Ie"Yip$'i9snh=(F{) znʾp(:\ dai-܈bً7 5Hͫy 9s sASᑙ <(II z(?#0>()aQ–`& ya= YC7 ,8+ [ ӷa9A4Bat@L‘D#* r@H,NĮɃ<`RLYUčXc0DZʼn^F`$b hAcdFhfxhl9`d l)1TLn2xm,UۈKAA×x9mGyGs$+qԈ8$Ky {ƞeX% ӈ?HF^ ȃ 6Qԏ$5C8yAnț6ɫƘ &9d:>iJ8#&IJ0ʚH .dAC‚T K$YI@I6(KD9$GkJD˴l0ȗhGq0+ Ơd < 5h p IlbL∃!p̄XGLK -u[ xH1X" #MHФHKٰ> L9Bn;˿=HΒkNz|N'@ 6NNONؘƄ8O/JC},94L #ϐψǻ$@IKuP| P e5d$"N %5ьUQ Ѧ(!Q8-shψXĈNQXHOu yrEx)mGD2:>}C-Ю?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^_`a&b6cFdVeffvghijklmnopq&r6sFtVufvvwxyz{|}~&6FVfv,(ehbsHAgRhr.qފ `VVfi jm^np>砘H'Ug=Mg_G6NCfvj~碾! , O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ET%zp`‰@U)tʜv۱(,Rm#ku{&` /h@œ c.%VuJkXGY.]Zd[:%B|ܲr9{1tufښ5cص3L]!plWO ɏ48d[vhq{'}&u@HIHs݀2fʄ!Eҗ Q:*V4D%zрR@ !CpD[b82- x R.O3OEE]u`2ϖ?GZreGLBIP?QICɢnN2 dKOrJ(#)Zbi;5Z>bJd&JkE><ye*B tː;lgO>@Z-BR hms.Ay-x0@0HKЛnNL EO0rk70C,*voe)YKCB7LQZ";.D.Y-8?WktZoC]Dξyf_6Dccdz.ĭ"+Kf?:+P2fQ * =J, 9єsFu$^!#^tD#yDbz:S:^}7qoH3%bQ+7WwBa|GNPQ@WSHEMў?Nʇ/`GD< "bW@%X +~ Ȑ䐯X^HƄ @ jDC J0<17p![S2Ri+;+I{ѻ{իXuaj^1i3s(S|/;'Pj1}뚼K84$D +iA }q+`B0Eں(_+! r{T,I[1;7%,K C 1A3)F[ sikQ:Q K,‡;L ;oZ<ס@yDӎslDzBg۵|7'x7^s5l1m#̤E;'(4ڻRa3*3E` N=* 1pEם-ԁ)R 56}R06cic7@.@9-̄ e%Q- !RW{ۋmܺ@dǑAAȫ   ! 1-5f\ZNcߛB0R xSS^Y /`v8Qb$ o!ia>\> Yq5O?=`Zzx }!tV `}-q-%!Ν;]OP X:=n8En>^~?_ ?_/ Ͻ_T# 30V DA |C<8@?~0y1 K0I@ANP QV3:A aho/Vi/$r?6`u]a^o~/<m@9 o~ PnozA:c ^]_.COI{?Ŀ+şʿv{?_؟ڿ?_A?_?AZ"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^Z߸v\VXe͞uZmݾW\uśW^} @`… F|t9p?Y2Hr.#дq͝?tխ_Ǟ]vݽ' 9GnlɱW_|rS*WI0@q/?o@d B 7zp B?I .9DWDɼk lXƐPFw7 9SZ&eLYI&@I)rJ+J-rK/K1$sL3DL5dsM7ۄM9sN; #qn ЃX&>E?Ehl4RԠL1TRM75F4(j| A1UadF`*Rbǟ-GI G]%6E`%}$}`S$ŖjՇjZ`-4[sr$rB NZP(m`9n *%3h6A]L8*LL嘬E8GUWΩkm*#6+a@ fAec(jF㎟kWBBg9т(F,z 'mY Sqb=jb$ٖ@ `LH%l@噢Gg Z lJygegXy`5R{gkBfg`^utj4X|} #Hh{BcCMWsi#ȡE zPπSF\2 ` d!Nqà\LvILE9o!z(wn6#28;$ D.Hĥm~BQhaXazxḧ́"Ywvtp !nB a!C" i2Äءl6/`R(4Fuqԡ2F Eѐh!)e #c! ˆ`n<eX `K ;) 7T !a/ RQD#DZ.zA 3S#S,Pǂ$ax aH(%]ҝ6#hFU,F5v28&Dѕ !#/=fn 8Cr$h.( Wn+A82^}wn3ȆKrO.EJXЉpT! IS质Gu.61rP@Дrg4L "X:2" MY!V$ Pe\pв"8\ 2FӨUN4 yF1˔`ĈBW@v %H,:6 Xyl+0BhFX[Q(fځW+l |uc{ZΤo!] V▤-@n]»ܝBXpms;Fī֨֊-e"I  o `6Xf%a Cp1a w80=b"FqS|b/^egP!#((,  @d0y N^)KWr's9[se1gl5j~3f/ssg=~s, !!\᤽CWҗt5iN+RO+ubtꆄ:ԣ.Y}T&HT\ǰ9#p2( pX D,5esٰc}X -k:Xvp9&1d@H?M$-Ւ=$SE- >ȱp<&&' h{L+p(!bBW`@49'9IΡAe0 uĴn@A)C(K"mWFJFnx$0?rHaJ&~OKr $2)ɡJ ?YH ǼD!k ~WA|A<8J| *R!ooJW?( !b~N>A~]# G뭝5}k6K[\b"DgH>9wӝy ws6{s;=Zj=Ѓ#[!h軏x@?_v@}@ܫ?;kWB!: Ӽ07_[ZzX" r($CB6E7)8t3~Kx7=B9C|xQ A=D=*;E>aD(HħKDMO9P4E STEiUtŕ W s9D\]TTKC[]dņhEcLT#s+FFhԔq8׻getJ! `6XAA$7H?$Fx\lviƗH6YLFH4#GE&dc@8t 5H>2Ha$ 'xY pE hG)08`R@I(+IɜV :xȎhj lIp SʓɎ(>ǫd[5|J<بʕ^II@P 8w3$GKJ6[JppqxI8n8 Êl˖ċ<\9sL9\?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^_`a&b6cFdVeffvghijklmnopq&r6sFtVufvvwxyz{|gH}cg" f!U舖h9%nكg4lvf8fR#xfPhVcd闆阖i5>YM! , O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =.Hrj (VL'BKÈILhա ׶,ō ZX2ʖ EǛAf5U +tAug b*#_3&`Ky$ʤ\[N5wl;χ>^dJT6G}!7AxRHmyXSɂOITx5HQ~MhRFB!t"HHЉI'@ <-rT בbNR: ܒF(ٲ`HDVOIјe}COcEXieu\?@;ddC,G nXn E  %h2֔TgC<D͜H-yNy 'yrk`~OijAL3;2Y">l"O-r0nt쟇9Bq ,vDK3 t::v֥@r%PYj?3ϊn.LrJ]A,1Hx2Yi0Gn .F wo\cvLCϝd ќ<|"(AWy@ ]]9&|ѥoH"kJ}ISGbd9k[DK,4wDߚc4uuWݷSEsSW4N;hXdJWV$RBjąad@@܈Bd2!D^p~+V GD0щA<HBf1# 4*E"# p j䌾Y{pAIi aa:$?wc7GϏNd1H( 1FN-{z8:I5Ip@> F 98Ddy\%Jܕze*ɣȑ a#5HQu#gdŒ2x<0 d )|H7MasgD(4(}3ZK JtAC:% @&0lX])WHJRhEOAX#DDx&j\"3@~+|A,!CDa|A`ь)+LETTJA IʲP"$e@h!T*=5S)'^4\-jaÉD WZ H8pQN48_Ι׺caz9 ۑ1kP֯N-AōtÉ@L&fDfFG T CEx{cM[z~!DSE˲܁T $bCD'Dr$o_>C\&X$1׫xcH)"T'="G9@I1 Q5Q2 9C]% '>P9vNѕu1EW'|@0 9|0@` 1uh40|E9Z}DwevI!@} !kxuWpT0^ϵT|~" Đ`a9h|Wuv & rJ!@i@S`&hP&deJh;8Md]Gx/pO_:,1Lq&Z`xN& *@ xtYSZI@'s!L EС*$;&F 6 oK!+a8HUl>4B Hjx4TaW޶xqPg! Vc/@iIy{7&fl #a8 `"Dƹ`^tXffⶀFAi];>f7Xh2XKJhYP[@q:!9AaAK_XX(ɧzp4RCQ(PobfUAzv!@ڄ?AJO "]B6S1(28p *f@iArAf$ӡ~Acb Uh|4& 7C=̢btX{33kYQnc7b>3A (H;pHGa t'J&0<) 2F2.&l@ ЙQ ``쳵j5F8A0/0jȠ$p(+wN1%cp)N d-L#l gtrjJBu`(1FKC&Jr[cñ @ hl$Qp9 1Yk;"rw$?Zs2R oJ3tq$ۄQ̛k8q&QS0`p LeĻk8;skcAʾGK;rq3h)#.2GIq'2p2'KɆ>KU  yTR9jWN!2JT.2쇡a !@FlJq,l1q" &q Xdb҈ٌs\#&(D0ȡːc(pht,l@"W  Ke74  mH;m8" 9@\e|˳p̵$ `Be0+у%d6>=@ms;{ :`:1Q kKdٲM?c жL_=dCb74i[mH!"h@ 7Z9MA!@A D!VC*rS]S&#@ -) k <۳M-lDڻm VPQڙP*E=4PN6!`zC6λmܐr 5|@f!2Ѷ; W0U# +}ݘ$/aȠPƤ NR1 $aɍ}}Sdm<1ar5v9~q~+a4(ܱɽN^ P.RTNVCNFLIX.+N޶_m=e BѶ#]e01<@6[DrA )|3~[NqLTH1ߥ .g-c^BPE~A޿2a$[eHvN.| ~n pN:v>IeҎ"K2,a ^a nCH 'qh?_ $/&(U*.0@1?4_6/7:<=C!b yN YZ;0Jo?WZ?\=$!r\_f@~t1njlv`w?H.{_wOf# Uod_ C|^ U_;s??H5M ~oW!Ep\`_ޤ _Em@'_ro6/ 3?4J""_@@ DPB >QD,^HQF=~RH%MDRJ-]#Ƙ5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`…gXbƍ?Ydʕ-_Ɯs\4ZhҥMFZj֭][lڵm[wnnn\<G\r͝?})խ_I8ݽG8q^z_Xy9D;:D0AKC r)PA '@ /0C 7C?%F0DO, WTE_1.RH%FokqG2H!܋186#d2l2J)j2K-GĀ[Ɣ- 1D3ͷ GM7d nळΑLiN=AbGɇG jsOG2TE!2CHQMFABfX't)sKSoЁ,hn\hpA `Tq6!@ua %b=MԇHLr8(%3Zw S $qiy ܏EݍdViH\(ha}ExIstǝl <"#aݗ\ ?W"T]X _HNܖ NQ㗰ixvhehnzaxyĎhi\uăT5)5O~l ΁ vџ1̄ē""Y)N%3!dBXIq*X;` > 삢*@fQc+JA(Z1Vm+E[ZnHM S1թ@t:4&mLJkd^)D涨)Oj:VŊ["-PAV&mk^1 p3,$)`jK}%RXK0VZcrT엌$"RЖִEmjUڳõ&ke¶'`[D=ql%4l@0fO[*!Hp;] +@G˒eL EH%Q׼!b[^D)yKgJ;hu7hCl_0 V̗[˷1>0{RA Kou ;<*VGG+~L#siqA ЀL\G?@XC!/d0~pEy^` HPy!24p CЇѥ: %Hvk5.nAȑr|?z3lAhEDbֻ[ 4 9!Íob(Y#Btd!9Te!In+)BehGo*ZS.ȵ̐] acqD ej#K~] C5e_# !NK$V L BְŁ{!C~i_K !e&1Qcc~z(Ap X%ẖ$3yI;R(*RvYKToU)0d1'H{]~ifO-ڙ%5uSKU}U‡$$|k"7}#zշal ^0O}"sK}q<^!&6Ҍ:Rd1*q)L;0a }9pK+.d엄XbPl#Ve!ASC 6 SXCS 8n:`[@ ?Џ9{?hRKA8# > -!PTA!$̋ѿK,?>lIp'<+ lw@ a Cի6( & p"D Aˆ!ăX[ [ .X d@$H1?X"XRDHCL D CsK -:.iCXA3߂¹uC=|тG$ 4񓽍Pƙ ƹ=FjB#1aSݸg?"ԈiaE [BZd KvG(zDZjG 2~\y~$Ȃ4ȃDȄTȅdțPņH!Ȉ( ȋȓۭȐ$aǰ0DŽȨ8A%{:In)Iƾ6(KBt =0d cD T JЍqJEHG@PJCmIIx hm | %sH7KX6˜7$/K8@z܍a ˑ~p.@?ZL)0G9phFXIL L0Q9K+ʼn8 dL Hˎ, ]J3 *JHIHt -= ڈόZN;/ud [ήh8's@!0Ԯ d QOߚD]Mu-M P u?:P Q-QT@Q}ы !%"5#ER#J&u'RZ?]*+ҋ-.01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵݽ%5EUeu%5EUeu_V_uQ%^^+ v;޴4`` ~^Cu>! X fZFtM)aa! ,W! , O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJYL* XBς&ݻ[G

fs'|r%<W5}mpqrEXuY#N!M7__G !L"BV"|Օ+CcE-@N&ƨ=@ .xPEDdD޸2JIJ 8Xxh bvXRE;DY,:0}b U8_[LŗݧN 2?uI8IWs sA v$}a"< 0$B}d!C  >c>ψ,D)r$;1KƑ`=7ZBȯ"z`VU#t9c/yo\zr3:"w.h09:RAS5+t (]N;!j#"GQI4~r%# Ph,0OD*e\8]jVa@g}Q1 $@ D!R:_B 60A6/&zD m:R%!:)(jRJΤ :2 M#Ts!LUA5|\l o{ @6N5]BzA`fGqJA`LB4'<"v"D aG (D̈|z@II҈SA"=xh*QdFOeRe~]\xĭS jo[:rSRN)JaoEG١BL ͈<>Yv!?eU=1mGf~)Y^q۟.rZ:Cc.GQCN[B4A*>3#;T#B 86{B|d^5[3_rFD(o `PI?̑,~ (,4#6)g]` |>]?ދpnB1b Y{6^8$xB  :Ĝ/6.-cK\!b P^̐|҉fs7lY)D?\Yn8 ;Syc :#koŪ15T`ip eDy @tf(-r҇A :f*%Ĺ/lE7tۅך4n A>CDK-ē&f“bDV dXȯb8/%P F$ۈqq> j$̐0w"ѲG3egYwS`F=ED9Y70m y~0 @DZ@?J R;S@qjA]goA:,p~a&Ȁz{13QMyQ ЙEbIѫ?1x:2"NGy" pK `@/N K:3m&udZD! A3D# ra 3 H ">0@#$].+Rԍc6f4' Zl6-zqVŐ#&kZw]pqLa0r`Ѐ:.A 1{?'d}^!~7`2p}~h=h:x1!m:сQ{KV Pr`NP ResW|u!"4oҁXu;K.)@Ad(K\Ur1h]8ErUof q8_!&%7k? ~!J#v0P JvAW"Mu:5|'`k }'rчAiqjw< a] }ae40V8 ` (RO rv>QwJ& GPP"@@pF7Lv]x!E@c`4{sз".ڕ< эWLˢ4xb0h V8;!А0y n0 wvزyp )aV^%Z&]GyCw4$K&%t/ ^w{W =hB]#ِUГ0AR7'54a)%G# 4J rOpЕ!a*%(㰕wAHAd1 갍Xx Aq[(T9r@PZp'ܣ)g`H]6N]V&xeiXRk x8!u9pI[0 ?(` 7$e|v##XG=i "T Ly%YDA(/X?I#C`1+Pf1 PRX&aҀ]$,umy ATf77U;:z1xFב9Iv9t4{ ',Ese@ Os=*oTU8:_zIhBf/b*c-:~1YL1*QoZ/@ BL RJnx-LSRŘt|#?EY7hrq2sr  €V+ b:-hѡ#9b/{8%n 1.;:kj')q8RS6 A ‚xA"3*F@_J)0s@s3!xa SgQ&'Q X/+<{`7KDM'- h'l  B bJMP:Agհ+A!0wP;b,K~rqQ[d)~C qE ۹\"!ka,ַd 롂$w6!#'u%{RC{Y. {K+Kǫ{˻8~~?aB;3v];K[?NTg~"  o &Igѭ{eeQ B7HU@!;Q:XKޗᲾދ,@i8C)  G,8~R *6B0<!Cy: qc~ˢtRA:A콜Cl#< khO - *G[fY@a.ÎPHc!6' "=hL#3fI0x =W>FLOrDžlA& p BpQ56+v1 ! ^K"DMWuz>V*:a̔̎ Bf=VDzJ)ɝ߀͕͔yq0х^~?_ g?_g "{ ` *V 2003%.#9/yAC_'N I`NPPQN U"\9A 8bW-jKBdMTok't_빹[<{^!ZOm6^! dϹw̡t?UOO j0(aQKo2=*2raBc?_~_;?_؟ڿ?_??_>h"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETREkUU^ŚUV?VXe͞EVZmݾW\uMy^}p9p FXUr.ΚXť=Kk$~U4 b˹ QnAI'rdAu!} n68%D!XDnJv@ޥ-ֳf1p"vCWMlX*<,Q}7yHǨŝ 0A Dga2݉h!z@ABaCIh"?CPZ|(6}7K@Pӝʕ&I%=kC@ܓ%}tƢ=ryTŃƴD }h\Z$M Վ{R|V8mmMU]MiX nPa֫u M`((:׫xhxϾIlhW{&ҶvmmwYR3#o;;Ս@C*|f5J*ZzOdIvI_wa= pY@>x >bw?['0 ňY3O-9X!g1MCi"#h8ٸ)vǤD0s9^~T"GP\y=MRԠؑ I@Z࡬&4P?\I+ODCoWKܕR$FD^mRvS!%8=$;Po#N1uwBğD5Hh EJIu AX DT%#AKB  7D3.E./v7:9y9O OtS]yUi=Hk, ??|j }BH?γ*@`+ DAh KA\{+{{L  6 $T%d&t*L .@KĊ9޻#CP*BEzFCC=LK HyA\,Ƭ. ' +ȼľ .HqLd\Ǖ<|l u\Ph+D^{HÿAòHӌbIĈ2>O94 ɚɜ,HɕɟJ4(ʣDʤTʥdʦd?btʩ4 ʬ RJK ˲4˳D˴T˵d˶t˷˸˹˺˻(a%dKG<ˌL$4D̰TtDŽȔɤʴ$4DTdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؆؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖR1H.hm3seʇm6Qڡ%6%}؜MXUڃeڍEڅ}DMXKڢگTf۱%۲5[Ehڥ͈! , O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуN|3Uֆ# ŊiEr LI@BgIu% / 44C-gYJy D݆$|AcM% tRu]9eDg(Pb7#A58=ȑSW]%]@:/MFH #ZSfԜ9^8$GA"` IgINz?fyvgJ7>#Ѡ~ EɴΗ@ )fnEN; DjhH3R % ?#@BJ-ybjIρh,)lIg9oĠaJhrEڪ?-yNz-a0\=SO:4J/ӎE|*0)V:Il|sKQ{T-@n+И!cE(c^E1oCO QQlutoH;56R?o;?^@(,E露l춇w\3,w$DusO;~DQ=58AotxJ8v8A"Fn͵,j#B^sNW߭_4n]G+T]mrI<4piuo(2 tIGZg_ ,!G/M?Z{&! %?qyW= }^ %nxA7U&`VB|"J &Erѻȩ İ#vȬHLG$0abތ#iAlÒ$VĢI"~qhjS1"EЇ 4¦\Hd~q'w {҆\iA]p@F%E$/@X~ PM4ɢ$Qj 9cfI4#NچzC"/@б6$e.KG ;&A% &-2:4Ƭ9v g4x<0 d )9yB?&<# ͆R*2&N  ܳ$@&]F#t/h'N@HNId!,7 dtR @qB2¤,0P%Wch2$7E@BJXazNH@J**'^4Y`D SYWH@?Ɓ "!@R-Rk,Z}A ɯ{dU aT"Z]MQ΄ɹHrV h ]FlGd珉 ;ět y,5Qt$(Fx(-$(h98ؓfx%Drcyd' *Y+†u*IMZ$EZ?4׽ŌG xv#7DmI9` p]̮nb9yL%el4k;ĕ30f$ɑb8 +Y(b;yŞhV *Ahcݐ1/ L3h P]0I变8f "7HjS+ͱy?I M\@gtBiBW apJ|tb xcG,꒤׿&Q sخ b d*; 9Y M)0  AauU1[m9$5O9&WX",ᑀ5r bEt0Pqs~qdZM"d!l N"{ ƌWf0:B[_2d Y4eu&x *zcM |x 0%H@a\s==PkJӪqvHPEA"Ί  Ȃ 7GbDז<*eo+T͟XFs"{?SJ;]m$|ndH 9tm$jSȗF0"3S@H8JUgQFQfL^f@$q~1|([iB[^8XViTC}Yz" '7| Oy'tT1PH>w"LJAHB2* pFqhVq0}7PF ([HW|A~ uQ wThF_J f+`zrц'"uxIKxoZ@RgxZ s^GopT#XC<`817OPpGe_"q*('!P;犧A l&! wq11(`'`cxV !AP%`r!0oh(6qiwvR{H4r4 &nIpvBytkyG!`97&Wxf{)` /pY6l&I:$wc;eWd%gwO4 pKh5!{J1 +B`AI>GN5(ap61 y7  '&l5l YI!(!ܘ@mB6vw)ob|4[Iy?6  Ur$q.+F~P%8t>0hBR8+z|I mz(|P 7 )3tN Z`8@&ht8D!il&&~50&x@ (IqH`Yq)E"w*!4xʅ&nY:vC0i@)E&) e<bZzO&M.yqq@! S!&:$RP$oQgѣ>* 6N/_xYUgh "I XP:M U ^qCK8X5P%sw25 U&7_FPHZp8 `B5b:&f` zׄzB0`qj?')<|*$G`*P%[513s 6I-ijF@@@R|pY4Lʫ$&lϦH|Pp*@9+%FHVqr0iU+PH{:1yrby11<QenL.pfh(A"$+H:?` +z?"J=]B3[) 4 1K0Pvxd(^h D_6@ | rbN8&wIk[pU "tD A aa1 p GEG*5J 5,><""(~<(.* \Gq14Ve!(&;BdZDSI7F6}Ax6Khu՚rQra ГVA-Dɖ;h==vs3p1($";fr vMxpzj>D|+IaBPȚ*?)wD#A!_,3ًBCo` bc:A,άó @T |CDg"Q(94!SM#Q {^Ma7 1y;L_c(]( =1 Ќ)bBC<@B/5 1 k<l VHkɳA-qr fBB84+baԠ@J8!$0`PZ(06}J!\ P<" F@݅ ` 1Bv  }MQ0]GM- &0)]s m5 #}!N{=\DА"ZBق`B؛&0q$W@ <}/I1 aayPpES!A r2Ս~1v İ2Fq%HMCBa mMH}W(%J]D{, Gn ~F+q!@!+` +M5R /^!!%&ݳNQ 3:$<.\ . !2ۢ=}b8I -A1f$!愑2&ݤ&K~Ƒ O>Y& I^{eg!Ⰻqɐ*A^@.!{.cNL΂(i )Q cCZ̹]ѻA]MZEA =tn(n 2+Wݳl0[%՞Pkֆu!D+F7 @>7 lL еe ?"WF-Бp p.4ZE&_A7 ;GrNA*%ZQ'0#l 68 C_VXZ\^`b?d_fhdjnpBt_vp4x|~O@?_/oz_#aYС)~<2)s oT&NO qO`Qa,m/o }| qfn!6ǟ&n<n?ɏ N D0@3D)QD-^ĘQco6~R$SHZ8Ң-]S̏hJTM=}SPETRM*eiQ^x&V]z{0հe͞EKlڧnUi-[MwKk nWpިFXbƍ?Ydʕ-_ƜYfΝ=ZtϥMFZjG[lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^G^zݿ_|ϝR_~0@$@D0AdA9g *A /y˰C?1DG$D DDWwa1FsgÉ1aGs%qGD2I H Q2J)stqJ-4"+$L߲43M5dM7߄3NJM9S1ps<4PR+!^4QE"T]4RIjtRK/ERL7M .t>1Fh NOUlςD5%Yo ;pÍ `LYƔ `b-Yfu6ZhZj6[lն[n6\p\r57]tU]vu7^x&1qnhX&|U_~X`T߈a-շUxaG0ѧ"&.h}Yc*-Ye*&쨷^g&j{f_l)c_:QuaEB/ 8OeĠI8%: cF`;$d^ӷ`A *=,r,b$ !h pwpe+\%z$$l: 2Hn=h Mtŋ:GvjX 2YF1Bօe@pܟH~p2ay¡!#"nԯ^[J`bdt-DjЃ(=dA8ahot GǩVPS6ԏ Aj }  P"<`(# ҷ "e@ 0*kx" ȺP)3bDV@a`9h$ b et#EPD$a7(e/YB2sAFvEB"$I& TR$ 2f9ACTF!KaG" (*-JMFjz!A>F BL< oALM( Q a@#e<`,YLA%bdy&T\ArP ep3"s!ς(?]BS,R Q(;PR I>wbD":{A G9Q vT%A iBPѡ`4]䔅 RYȂ*CC˙R沔U}j7uVl KfH_W6"夭0"kV%!31Ƶ9 1 bg(6cAv]ؖ `=mk"d.A1o)"Vv#u^ ]|_׽pA; 7{^w7Z*,ߊ 8 Rj!m _xYy,^.@w(5heEr dYFr#7YNfe*CSre-w9_2f2bFs|f5xsk4̃l1A,a=CD9 BE+Јf iG'җt%iKkӜEjRWԘUQӧ~SjX:ִuq[yІvt-Bb#{c׺D p@7V`ݭU™7en,pMlAvAo$? 񢠣BHFÏcoOxA<IxeqphDXw 7p(>p :Q"ndiz?ĭ`}(i:7!'}0'RN9'ͫg"h@nֹ|y٫cw䣗-"6%;!uÓ YA r7dzGc;(>(#(+<80 @[r "8i:X{ 웿雈;?[4Q` Đ <)b{(4>8 чP=dd `A.T\>+AX*y ?8D = C*<+L `Ä`r?>>ç:lCC 4T ɞv K̳L @|2Z #Plc+l!!?\]; Fb,<ȃ9bFhFF܈?0WqFc$s(Qp[LI࢈R0==x`7Xȳ@, =0J8[Q:}ÂSԑ,m =P\݀˄T'MԌh L=]Ǽ/ILST88SEsčԗ@Ղx +h̓gU RLя 60V1f;H{ƘdUVU6!Mj$ xFiƐTG'Th/΍0崌BM 0UH'5Txw-Rch8u *HQ8ӊ0UU -T\>lmԉeYHpJ:74d֍؉!FŸH$:V٢CEڟMڦuڨLګڬڭHjڱ΂ %ۯ T[%[p۸۹ۺۻۼ۽۾ۿq 5EJ\ Dž*}ʵ%5EUeuׅؕ٥ڵ%5EUeu%5EUeu&6FVfv &6FVfv !&"6#F$V%f&v'()*+,-./01&263F4V5f6v789:;<=>?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^_`a&b6cFdVeffvghijklmnopq&r6sFtVufvvwxyz{|}~&6FVfv臆舖蓉芶&6FVfv闆Iɘ61SR]hR6 q vV6bW6 &h[j >ӆԅ[š6kBVfFj&! , O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ET%zp`‰@U)tʜv۱(,Rm#ku{&` /h@œ c.%VuJkXGY.]Zd[:%B|ܲr9{1tufښ5cص3L]!plWO ɏ48d[vhq{'}&u@HIHs݀2fʄ!Eҗ Q:*V4D%zрR@ !CpD[b82- x R.O3OEE]u`2ϖ?GZreGLBIP?QICɢnN2 dKOrJ(#)Zbi;5Z>bJd&JkE><ye*B tː;lgO>@Z-BR hms.Ay-x0@0HKЛnNL EO0rk70C,*voe)YKCB7LQZ";.D.Y-8?WktZoC]Dξyf_6Dccdz.ĭ"+Kf?:+P2fQ * =J, 9єsFu$^!#^tD#yDbz:S:^}7qoH3%bQ+7WwBa|GNPQ@WSHEMў?Nʇ/`GD< "bW@%X +~ Ȑ䐯X^HƄ @ jDC J0<17p![S2Ri+;+I{ѻ{իXuaj^1i3s(S|/;'Pj1}뚼K84$D +iA }q+`B0Eں(_+! r{T,I[1;7%,K C 1A3)F[ sikQ:Q K,‡;L ;oZ<ס@yDӎslDzBg۵|7'x7^s5l1m#̤E;'(4ڻRa3*3E` N=* 1pEם-ԁ)R 56}R06cic7@.@9-̄ e%Q- !RW{ۋmܺ@dǑAAȫ   ! 1-5f\ZNcߛB0R xSS^Y /`v8Qb$ o!ia>\> Yq5O?=`Zzx }!tV `}-q-%!Ν;]OP X:=n8En>^~?_ ?_/ Ͻ_T# 30V DA |C<8@?~0y1 K0I@ANP QV3:A aho/Vi/$r?6`u]a^o~/<m@9 o~ PnozA:c ^]_.COI{?Ŀ+şʿv{?_؟ڿ?_A?_?AZ"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^Z߸v\VXe͞uZmݾW\uśW^} @`… F|t9p?Y2Hr.#дq͝?tխ_Ǟ]vݽ' 9GnlɱW_|ǟ_~0@$p;1C @<'B5Ԩ0C g ?1DG$DOD1EWdE_M7o)GY<g 'G%di}|II$G(GpFeaLȪfRKs 0ͤ(Gb*!2$)eB$Nfy*BjeL! 3NJ4E4GT)IRAo*#~ >b 6Z4ا!u%=G t#SᲔ(H+҂Q5ZhhH\a ([S&Ab#l Rl!*ZX`[Z8Ĕ/R!*V}(i]G^Щpb S` Фt@!\XNh٠ w nu8L隊>tՅKiJȡE\ȍTh !Zn(3 n;(egFTD6}s{"= Z턺!ӎ[IZF((~!:slNvԼ[4Snu>"|&'4whL@%_ʠ.va'*مc$Oe /FMn491Ȇ2DA.hEC9@*2Ri!)H5v `Py4hw-"T  ADr* .!RUQ e#sY? gHDIZD%t[ yF1ɔ]0j"Ĉ/2_Ger+fZ2'>/qDzCϾw(zJ[i8m|G|8 gܞx#dqs |Z|%|EO=Al}Szx^ a?{Ȟ=u zl9ف?| HL3Ody…!oϙf+=~[3!bߏӿɏ'14]S{uj!#쫉6:#7H?$x=) IH?9` 522H 'x, pX>=A s )!c %T '<[c 㺲 i@B# GA8Ґض08!.;DCX5xÔ)̈IA@H? 8H/C>H FT52 ?p4.  '$# ë[ĥضAŻBXD@,Ő8Mt!c.ñZcD[ d # =\aE@A,6`lE\#"bF.A_Fwܱj/ zlINY H 6.D 4ˈE˅81-FO1pBb̧HJ81-qA 'ʜʫ JMd.'NJ  ?؄ s '`1XKhK .dьL6$9܈NlG81LLc:"OJ7OO*=>

?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵ%5EUeuׅؕ٥ڵ%5EUeu%5EUeu&6FVf k ګ \_Tx_!K &RL N.a텃; !_Rt_H" !&b%b! ,W! , O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =.Hrj (VL'BKÈILhա ׶,ō ZX2ʖ EǛAf5U +tAug b*#_3&`Ky$ʤ\[N5wl;χ>^dJT6G}!7AxRHmyXSɂOITx5HQ~MhRFB!t"HHЉI'@ <-rT בbNR: ܒF(ٲ`HDVOIјe}COcEXieu\?@;ddC,G nXn E  %h2֔TgC<D͜H-yNy 'yrk`~OijAL3;2Y">l"O-r0nt쟇9Bq ,vDK3 t::v֥@r%PYj?3ϊn.LrJ]A,1Hx2Yi0Gn .F wo\cvLCϝd ќ<|"(AWy@ ]]9&|ѥoH"kJ}ISGbd9k[DK,4wDߚc4uuWݷSEsSW4N;hXdJWV$RBjąad@@܈Bd2!D^p~+V GD0щA<HBf1# 4*E"# p j䌾Y{pAIi aa:$?wc7GϏNd1H( 1FN-{z8:I5Ip@> F 98Ddy\%Jܕze*ɣȑ a#5HQu#gdŒ2x<0 d )|H7MasgD(4(}3ZK JtAC:% @&0lX])WHJRhEOAX#DDx&j\"3@~+|A,!CDa|A`ь)+LETTJA IʲP"$e@h!T*=5S)'^4\-jaÉD WZ H8pQN48_Ι׺caz9 ۑ1kP֯N-AōtÉ@L&fDfFG T CEx{cM[z~!DSE˲܁T $bCD'Dr$o_>C\&X$1׫xcH)"T'="G9@I1 Q5Q2 9C]% '>P9vNѕu1EW'|@0 9|0@` 1uh40|E9Z}DwevI!@} !kxuWpT0^ϵT|~" Đ`a9h|Wuv & rJ!@i@S`&hP&deJh;8Md]Gx/pO_:,1Lq&Z`xN& *@ xtYSZI@'s!L EС*$;&F 6 oK!+a8HUl>4B Hjx4TaW޶xqPg! Vc/@iIy{7&fl #a8 `"Dƹ`^tXffⶀFAi];>f7Xh2XKJhYP[@q:!9AaAK_XX(ɧzp4RCQ(PobfUAzv!@ڄ?AJO "]B6S1(28p *f@iArAf$ӡ~Acb Uh|4& 7C=̢btX{33kYQnc7b>3A (H;pHGa t'J&0<) 2F2.&l@ ЙQ ``쳵j5F8A0/0jȠ$p(+wN1%cp)N d-L#l gtrjJBu`(1FKC&Jr[cñ @ hl$Qp9 1Yk;"rw$?Zs2R oJ3tq$ۄQ̛k8q&QS0`p LeĻk8;skcAʾGK;rq3h)#.2GIq'2p2'KɆ>KU  yTR9jWN!2JT.2쇡a !@FlJq,l1q" &q Xdb҈ٌs\#&(D0ȡːc(pht,l@"W  Ke74  mH;m8" 9@\e|˳p̵$ `Be0+у%d6>=@ms;{ :`:1Q kKdٲM?c жL_=dCb74i[mH!"h@ 7Z9MA!@A D!VC*rS]S&#@ -) k <۳M-lDڻm VPQڙP*E=4PN6!`zC6λmܐr 5|@f!2Ѷ; W0U# +}ݘ$/aȠPƤ NR1 $aɍ}}Sdm<1ar5v9~q~+a4(ܱɽN^ P.RTNVCNFLIX.+N޶_m=e BѶ#]e01<@6[DrA )|3~[NqLTH1ߥ .g-c^BPE~A޿2a$[eHvN.| ~n pN:v>IeҎ"K2,a ^a nCH 'qh?_ $/&(U*.0@1?4_6/7:<=C!b yN YZ;0Jo?WZ?\=$!r\_f@~t1njlv`w?H.{_wOf# Uod_ C|^ U_;s??H5M ~oW!Ep\`_ޤ _Em@'_ro6/ 3?4J""_@@ DPB >QD,^HQF=~RH%MDRJ-]#Ƙ5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`…gXbƍ?Ydʕ-_Ɯs\4ZhҥMFZj֭][lڵm[wnnn\<G\r͝?})խ_I8ݽG8q^z_Xy9D;:D0AKC r)PA '@ /0C 7C?%F0DO, WTE_1FgFo1GwǶ# }$HpK4Ih#(ʠ(1+K/3L1$L3DS,Fq|h }q&M=S$jh$PGcMAgNG ,97rdClf$SR;uM7]X$,:W%*hZ2:VEiMXĥ?]?pvdP9A [܁h/!.skT=*tS݄շ.Ls$%?(uٲ NCK]WߍFy#Y` HPy!ʦ_ȰQB z@fFL& VP95 a9(=|F.VqBnR?) "A :- D0v v8DY!Z:M|Kb7Qq>p!0DEs͜-I爴6| TжemLbRS[DN?$.JqexYoaچ`ֽՉn=jPKG5De6Qȅ jW!kX21=^sw;6 f9룼)$0 2[#30EJio_e?WTرǚ7#ݔ;O`FARݣ9K~#^Չ3EKjI1mM#\ɗ)ժxI&r-yC`\Gb@bHCu?fUzֽBݜŻZ;`>veuB m%Rx䨯yatT·눉wx=;&~d 7ђLPw'!O2` LFS]H0e԰DGoC0uA9\'S2[;nSsYV EyAʎzHpOhAkdQBY$i*OM' =44۵k+?˿l8ph#: h]BRG辳38 L%* I`T %. ԘԈT3ţ8Ђ#l\; {?*2j-`",0܈965-6\.p@z3}ۍsx<, A1LTBְ޳N47P CQL,*E(,4VtWXYZL)\T_ _bDEcTƗJ$GLV /}SbF?g = -i9pACXƕ0BF\SG H[ǎ?ʐĪ2p,\$Gxw hPHܔC tيp9sHs7ȎȂ +@ HВ C  + ɻC ?x #;j$ \ G3H$HHF]t‰xH8T Ȏ B$ 4OY3 *ǓƆȼ -;\Gh| 53cD ]+,ǚLL8L>8Ͱɜ- ִۤLMݼ|, 4DTT@? J΄pNHN@Ό$4DTdtO2HOOOݤ4P`$Eeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷۸۹ۺۻۼ۽۾ۿ%5EUeuDžȕɥʵu`KZԽ\Rpݿ;]w d,K?ޭZ ۈ$^ݛ޿][C8^ͻ% (_iM޽uލ! ,W! , O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJYL* XBς&ݻ[G

nvz5t<~e{_x|gYzbT@S&2g Yu<e1kt yV T'FgpS]WO)>&d&r،m;l}n9ƹ55רԷ״ /7/N~i^؝S>EWrzN6xz0;^:5R?ULڽ\{ o1!B!N+O[|;ںϾM-yAhmہ|d%3sչ9(T hMih ` kLc/͞f֣&hQۓfpZicZ=j wFiBm Sq {(Fd$דXhjP{Y*-hz-hQ:UYu9ZXѢU:amSRQKeM w(ūy')f hH|CShtM۷۫քksSyQ]٢Udr{0`0$H@ B(J B ! ݸ{eV}>k3s{w9{` .QYko9v^ hBxYvo/k:a,nh"dĄWe!-1Zn7)#߱Њ?^1>÷7UvW3P! q|*:Z:(=kt<^ EQZl!pE=0 )߱FNv+;v =$%>g Յ[ZVqQ]ID"H$t@hFagA@ÐQwI:H;ꈁI<ŋ_PfzgdS3i{UQp5t?=]<~q+3w vH4,hbWN&ykkɀŵgPb0QOa^ƀZڌcsb(qTEʳFފDYdX7aRU3 \y֨v($>{(`o=bb޴nB/AhB֗h &GsӸHXMzѢ*y`ΤA};zILw1D"H$ԤkƉ`hש{`sڠƢgkxY<`uFv)pU{M}LL϶@- kesMY?m߱s& 9;-1ֽj&bʽ,h90(3بv;=Ǵ?>:LMsd฽vBӳm>PgtŠ::{JtAfZib%HWעTډx5BQ WrSYkE[u34C{Ie0rh':>F@Dău.,hfAu,2S+eAc:Qqd'E3cNI]**5!Q;lVJQ~2l!$D"H$SZ,9h-ij?]e$F. G}ü ̟#[RT8@(gVmaIe֘,=^f$2j`:vvY>VJ~i-2Fź=x.雕h ]/dɃ)gϱ2Ӓ} stI=NeLɤɱ4˷Le3tqCuxWtcNBrq_!X1Ye5˔aY7}쇻{'hzougGoM"3%Z}6FI%\t'o[_rݜ1F*qV@@{I$D"H$:gyBϨQ]'RDGhlj<B&R}ԧhnoF $tK__" E[;u6~s)1Q,~Ng7$qC+[TQnWFdƍ_}`'Jkxݵ.m0T 6l?TAQ<^gch;%p^8;tW5zX[)u|@=J{I%x&[&U3G?ӸB~/yJ Z'-m}Rs`Fniw]Rm0.&H$D"t95]ɼiyl;Tܢ%>k'Ј4frھPG}>`eGunb̳_/} ϳ?TNwvLQv)OijBeI)'_@irtu0rbčٚKvZMQV9i zЦ$3YVEN~Dl̈> UQ|, Vm?Π̤Bv;6,;ɀZ#9Bsd Щ KGOf M˶mw30`Mjק=5A<^/Oz?[lALv6RL%U?kx.6yB#@̛֓69DnSļ ~|}v/X9=],MF&ea.* \t:$D"H$Sdx XlV3t.wۏw?x2W9)BL%t${6aJ:l9mTˮ$##h~9.?7fP:Ozxyx5oӃN7c)wyh< HQv{ [Y941q&e/QS悋 ͒ wpksqCEAiqjvTntrK V_9ۮuULՐd3O&#%]+f$)x[`WY1:'m1}n1:? Zw>ȯ૝'8?HI:mwdHZ|'g6IEYL+x6 ,\8u1z_OUAA]粙#xoŞ] $i.k5u  gewh,Lí\MAQe. N:mz:.X w]LjBhÕ<`.h&I5v\~4sp(5c>^6knEkWg7c16 c(uR"H$D"9ғakWs[gZ Km߰50fJB8g/嫝'xm4v!{sü ̛Ϯg5@fJQUlƤ*̝2 I8vtX؁EGaG} , ĿWv ÎaAw# B&l@o4蟖caX ,ճ73hJ,[{Qw{= E5;OPh|Nb1:o.fIGPK[ ۴. &A|vΡ5g>yĜx-N=IA][f֘"NJ$D"H$]!V=# lT:GJN?U;Og~ me\Ŏ#]gdDF j 6aQW7m'Ee=Be5r1d$hBsC.Ceg%!ZO7*kϯ^[z5C) MV@E7rTۻ9"dcF_Vj7^8Qo:&|zOVqeS62(Y],E1i5؜A!_ƽA;MmWLc㾓~%5'0oW5N:WcM~B̟1, y? s5el.h<"q )Ѥ'_<=/}?8^Rof~=?=10v5hŽ  @ӛ_ٜQEC0硣e=D[Z~Γ`qq>w<[wtyEQ|7t"Wne,& z<`_apY#C EhH$D"HN ,\yoM/oi=д~+YBh呀NlUWvTԋ]Q^O}sNKh_]`jwv=ZEw.w]-;kt8yesFh [ bt[6(°( Ui@6Bj)CIf$h~PnP؛Y͉:Fظ!-VO64}Zb Ss48\T31OQxv+eŶc~q>X 9ކۣq:݁xyUFAE&>\:0#_g6oSU}C3NǬ4h)5Kyw.97fle໪YWڗP/0ě( [?Gsř#HĤ佚Ɖ>^KR69aoT&ǧNAQCG:AXN2+7XrFP#lDb[\'s%rYx{Ζc_p4:Z,m;#nuR"H$D"92PTia#1Q]ďzE<"L>:lU}0ZN8 kvEA8 >8P}юWMgRnycdxN*G0+LZIxf5]B`2L-Nf̠~jܷ!nhI;xдeX/IUhz^P;)x1#lRygx;G%U l)x%>P qYg>WF :pᴡ6:p{m1I3Ã-7CCkZ4(2Qm/EMd΅&No.203%ĀXI5 vWv5u6:c(6>i6npCnOٙUK [΋G|zEdtu#A!²Mg/#r8kjVjt.瑛 !̳«e>4l^;K* 1@ y٩,fv-a2 !;.C'+roح?,`{% |62Ywy(l me~il3(\;_];xaoj-=ôhhtfasThPA.J3GN IDAT`#'ԖݺIKC⩨.DBa9({y.?)R#6Qn&L«i_aEӓbtp~p[/H w>`ƝԻӈ8A!e+92~Ho~kɏ(#Sx5}KJZ~tgR&yR_|8\鑷e:'qd+@ه79:X*QfS9g@Ι8~Tq噅 J⏷ꁤVn?m8x9РCXpqui7UUPΟSQc62#󳫦X_]c皳l$D[m H́Bc\}h3丞 ^$=Мz{8+Y|o8*d qq.5e냯PļL&eiF'v'.2&-f8 1QOú*#P] !'}/S0jFGp(L͟>=ǂǹ~ 滳>*H"H$D"96PQu \y˧3ۆ6&fћ픊V&Z~K"5I])w{) NXb Vi6 Sx5d7ݦp(_"#dG]QT`x磱m? +t QUa9) ͟Ƞ39~@wd NTdCj_Ĭ!%AX|ףEr7TF1"7-sn? Mٖ6;J]Hr|7q30נ4',wНkI\2s89㞿.jpye<~96 3C I|)

K!v\\9{$nOuITwWNZ- =JQx|202m{ @Eѥ!@֏?EQzpg+vCM*xeO_m˥J_&U ' h'T]ߍ#_ J hv ($ ^(M./|NnwM%SwmJ"o- ?f\6[ZCK0 ڬfy׬0 '_ҟg7ٰ-,"0>Vq03qB@Ňz1D;$LM֋/Z ;c$:g y4:T9EDRhq2=NJ$D"H$2}F}lt"Of(fJEg?T##[N< .ϵM JfԈ}@x _߸>Ͽ* iGpzx'˞-y ꍕ8)CS|桸֧6@3}),M%]=1+BJvzy)erԓ^X'%D"H$Sױ?qleʐx~'$5P\pSY}p` PH$⣍.o#$qd#W.Wl3q+ WtMQ{dVBޠ4׵ `g)n}{]~ ǧNGX{0ah3Ff3~h?b*C'wP\wcO(>t * bi1̝<;w ޹hzhH$D"HNzyڔuB"^ YZ\0Ov~nH; Kޓ(xPvsG7+n'_Q[BX@1jRU&e#عo"6Wn}.mks(dq#>*e7E;רc9W#Ϗ+p[= ھV 4ඎGt|BߵgIP̭! 5v @@S;̗mw~طD"H$D$յ$rX;ۙRH J/wE CRa'1"/jlG jBhpnT.JѐH;'lP:7J;уIZG( 3f /EmM~Ea{ d{3)hyR8u^`Bc遺W4c6PPYc옔!,P,)p>h~+-;}`)mo;پSMkTxu{ Q9}P5_ ux<^u2T9K$D"H$,g+X-|t__"Ҝp>G Tr!rT!;= M:M5`X^pgkc=3WuGwEm(-ϒpx_zϾ8mгۅnjW.Ͻۀ]F_:ݑ}Qѧ0ަ@z|%fV+XkNI{rkr 5}x|X5uܗoOq:ٗID"H$T#ͬ\ƹFlk߰\%}+9kC:Ռ؃c|.֫^CQ8t'83fb FƹqJّ‰ǡ`A4MWxEu뺹A1uwȣ-]\xU~]."ml6].}"8Wbcݥg&F_9Q9n(WXSa%;B@J8r?hT5s:zY@xIc͖bΚ5T[]Q[;;P]xisDaZ[۠Qt^>&LGw:vp uR"H$D"fPTTZ v$fdaS5j'~1W1}aTyG˿4PRf/x'0mhA?ᆪ%`շV=#Yu|6OLfN;*_#dG:nVnu2fh8r^o'zpK)+}\}z`|v8Q|+ǁi h.^xc56J ''PgpflprH$D"HaA+s`3մ 5_@t]\F*h39 1Ù4`j77#gt_|ud4= kvTy; r1l随Γ%l{6$H; p} C0 ?X nrrD΄R(#*n-fL#{*yk熑I*\jrnk@cs/6j Iͺ6=(ѝGj#RxePiU|}È3ԩQ=h]Z i4Y/V{LnR9([=ANj,)6L'p8 z %ro!@k7EKWTVowv[@uR"H$D"9 ;1L۟$[E^]c =1j@D(=[_WpfKCg m]̑m:9S,`͌Vhz Pڿ44K6D|'@[U| Gh*1 ; `wjڮ1('Ekxp?B]*Ȝhl6ˍhBPi?{X8)sӪBlC19CgRIiStU:&#M'q$1k Ucf1$O@aSP﷨9> v0s yGx,[_BNLrSۛ >>͉K3@@~}I$źyKZؒ˞eǵEzA쪥 (/ѷX-uҨ@|ID"H$tHSL b6313Ĭ:PHH/*;|G+?_ x5Gcwx:LO0:/~J?A(f AlPc{QBnkءP|g`<󾍏~kv*PYͺ 0&w.L憹 Yeb ~^5]vC16eѳMY/!V&bU3s6X@zq>rܡɎH:[cεp{Bo>6އvL+u?PEylQ}؁YU0Ҿ_a ;cvHk7On#rxi#qr#'s81{ ;~%_X|nV,y(uMs ^TC@ D}9qc:!6M88|ӫEQ q|ID"H$tgx`]|qcugd$]wԒ z^Vh)2Gހ+jOe5sZzP q^Ֆ;pCP (O'(QT,z)jӜf%4\%ԃ] 0sf/pa{I@r*Ev~pI:W̨-b喚K4>JI2hC*o|VR#Ѷ(.mW@z"cҒ9 LzJ OޠD?W0w(y']gk%M,MA@6M7n:Oi6]Z4Kyg+CZ'#o:)H$D"D,`23s771"*_BDYf^_eźx}/ӱԔ$.='{Gk"G[bɎ~OwR/MH9@=܉\4Cd-GU|~!϶G)D_`ӑ QݷK oB̀4n*˰hE]d@QER**s TU匩#%LUi-MMb{^ui[#9>._Y+9-l IDATgf939gl#sc5yd?>kbdVaWܡ%D"H$Ӂ|19'rL0%Tn5Oj,ݞ- CdIg;WedV%lg,֦JE#Dގ ɧk==jGvOJ6.2_5qo()TdpL=Xl#\6oE9Y3Qڳ5'Vt;,˾TDjj뺐L42mhJsJX3Ss@N߻$C #bo9> 4*0|PL=7*,x @/rH$D"HNMz,Lj3w`TN= 6pPl:l-cf[ʩj1aiq\_^gvzz5}3\SOqcpvs,61?L6+/JDo7; #BQUosqٓ<gZ@M|yem)^5^[cMmnn)/cBsQWz O5ک8.}wvrkGze~q(.QUW߻qVQk\zLJT~3RXBVrY 5<|zQ6J yog0v߷_ =g=;J;/ ׾>/G=nFc,yeZP)h`;D"H$Dqz$h#|c}y7z8+kP#6aSfX/A#n|b=nJ\D{<~~n^ow f[ Crϯh9ɋGZu OntZ7[wxhEc/=P8j˜ž.Y9G3LIȕ7CWr` B+7?>]co߿7<-ZJ|u,쑨 $]-hiߌ?/ejF#h/q<>Y>gdӈʿpeZ%r=jg6ד7PU88EZjye\|_#_r2ϘzQLU7gd0'5ÄMOR\]O2W|WU,5|S|ʕ__Ű-~p$yO#\% Ƚ>~'^LBQ8},cՒx鮹u_ZgDž9,xLf$oo1˖-使U9<;>X̃Zo1aտn`=_Ίŏp^2j2S}%V/?IMa%lg9>7mo]\ϣseg+",b_J諸,\Ɠ׏n[Ps_?{Eu*EłJ4XPkhKLD^jDM"I;vE `7"H*|>Μ9S{sIB+Mz O>TU9jϔfܝ~I.dr>~S+_m{7M"ZDσql<3-gؚF[izrG>jsfؽ70ݮJ:/K3OW%{?gvk0jgTͼ5fϝ3gAf.()Jz/yjxaٰ4Ioҥ:_ks`&%Kn84*Cr-OfsUϒr,P1<9d/g']sg}{O!\ ~s}''7B`#N̾眜j-lr//qf=Ыdd:ݟ~J*f|WOO/彙bT~;iQoW~5QLV3gЋejӍluiI፯ZWEݤbJ{9O"S?~'?Oi䅗>L 7JMFywa3wք[?L}_V)y_7vZfN|#MHJ}}3g<;k\tlS|-þJRW.KuJ!榞dҬ̚4,ս9sRW?qhCI{[>.v?87 siC/z楲í=f!8}J>y_-`IIo+IY*))]WkPiv> -??Wko>V.-ȡUCsgyG3k.=$eᤡW_' ˰ ҸAYRR;[xJN=]UjO$e)qש/bWsM!ޘ.ܟ6IN{n-I*5R*)MyF٣qg}k={BEZ/+LyVoxnU^LZk"sfMJJ!p漖:iCn+Ǎ꓾C~qsOg/mzuLipټe9g 5,TV})_osfgNJ52%wmkPC_/R:T̝9%UT597]򥕮_?̙֜,x"s̙[Lݔ[?A(ܑ:<6n_̻F̫٠Iʹj<{W~Zugmi;,h}^?^Ɖ.x9jbgTkJNQ9;mpW>};o^?NSuYePyƍ" 4NY>VL|3qL;rlV5Tj=N6|?P@ Ɍ><\\>eR&Oꕛ"}x g1{f]&d1O'fn9}:eL, 3yMQezf:2hqssE!3{ZI3yҔY&weUyWrگFeU[rNYWe_ٱ=r1Ϧۧۧ>-3}2")[5]0}P\_r]6")Z +|T]]ss纗O4?lgrK?ͭigժ\|\8Oy{VnV2qFذZ26F͒&I*Rʒ}bj&6;t?&'3 .e_z#rI'fǮIߩy[ɩe)I&.b#ɥݘGܑq?]*qq}t#hi# K53au|kO乒kskw}uF.><3?]>")[AknE>{~ۻy?}jtλ山?IKIixl\wׂ/ѻğ}iyE&b~F^xnOt1RVZ灏vO鐖JSZkr`<:"UI3j(iY Q[<6;g>*JJ,>--]xlzy4kcЗdOK]NUձo\ߊ5 ~siٽYV֝~N=6Jݣ]֨-ͮ2h)i6ojjƷ}iz9dRjhÖ}6%n4_'n=6iϿ<#~8m?9cQjmյ3~?~z޺go>Y?^h6{:gl4Y&yb칩b4U-jg&ykUbRⴟl);U|[_oJʇF紟΃}oKyqĹ9|}.}uMs-\s'哾y=ӿov4|*S2j(@r\<3 {9F3sB'=ީ_/G?/wz\|넅w3m@r9Ϻ2cRz vvcp͞O87]Ljtpn_[瘛7٣_^F TdnIvL.Qͩ|m:Aeeus'k·}?`%\y>1cm z@ P`(0AXIr|ifm# L&@ P`(0A Lv򔗗/|؝љ<_m2gP?`\=h>1i?2|[@ <u\8UA IDATW =KC2#I*&.{5_??gЫnР?_kdo@rM_-vYGq++2F}+Z,!Seybbt9oiǿeI9nH.rSesܯe}2W/R{}r[IJ^冔m~rO2]S?˵?&'ɮwa_|3=oS~cD4m=+??M&Iy&|g~}#jPcR*ʮmw΀WW$3nLvqv﯂#Y-=|7=']yG9ʳg2VOzujx~yy@wZ,[ͯ蕋f'ݛ^N wIկd˹˵ys3s[_90$ss?ys9ݎo:sf `vJFgҮnL4!;}^4m<}Up$X9gh fmr?̨U6IoE<el\v>(S;~<$U]ǎ{f6{BVE.;o;?}Nzٹͮٹ.٠IӼڛq7_]GA@V9Ÿf~?&WF>[\C6ݫs\y9坙_ߦvvtXZ)Te>iIt ^mۜv9SvgrMQSlcre{fg})Ck72s 6h<ؓY~f;54i{1l*8$ XX}gf̪Us5ڴ1:;Y2+Z+M&@ P`(0A LVbmXJJJRe_b ʂ 6ӲeTTTGX# L&@  $^xa~ߤAk8a-ZH=>j*=zH۶m@7ߜM6$I; /\k%nwuץ{+tU^=lM5kM.v[/sOj>&^{q9vQ(*k낒4n8&LH4j('N\}gرiܸkԨQFBXЌ3r饗Ay]:uRz1o矟{/o.uGkO?=ni95vZj4ӦMK4nx$=ztׯU.r}ժUSn݌3f?8LEEbS*9^y'gqFU:npwdOyy;fFeɩ_~iӦS^|g˽ 6رc0guVİaqJJJr7O?Mnݾe˖ҭ[4h#<2[N:u2t:;CWwy'zZl9V븠YfUV9裳gʔ)ݻwgܹ+\C9${w>4k,;wζn 4(vB۷j*:uʦn :4?;fyvao,Wwߝݻgw c n$\3gco$P|v3}To 6 W^yej֬z*XUTYg1cK.lx8p`&LO<1O> i /#Lj-++K3T))))$袋2iҤ}viԩS^~q/9眓ɓ'ԾyEw%իW/˅< 6 ֭N:)ΕW^9s$I{\}9SsyUtP6h\ ?|^{ cuN+Cz*v[c `EQNwyPf͚NȓO>;Sry~RVVN8! Xso6mW_],ɫ:*%%%+Kujq?~|y 6}Eonܸqի 70}IFҸqE 4ߴiӖN-[̆n={~>}dC-3g駟{]#I~ԯ_??|[/lM| ׳G)++K۶mW W^~_ IZhVZF3g.lKݺusW{ӤI}裏2`$u{ Tk$+Z*U d]vI*Urc]޽A+rj sgo__?=zXnQ&LjժGTZ55jHӦMnݺiРAf̘Q9 Q4iҤ̜935J֭3w/'tRz4j(SL_|}GJ$lIs͹瞻mVq'ȁvK2oXw}wPEIC~c&LԩSp9O?t3_˖-dƧ_!C|c'|d^=۩Zj6m~z_ݯcE1}B)ǃ>o&)))IM Vjd^kdҤI/}|=Y9#[o!X]v%g}vyswq"cƌz뭗-"C ɔ)S2rl_beY[!@|ݻwϰa4?>~{.jJ6m?qJKudY\wEEE6󕔔,wy|U(++KF[9_6Ud˻_L9>6mZfϞ+b=bĈy͙3gaβ?!X^z)/R~+Ș1cm۶WjߣGNSz1l2s]WKd5k|Zc+̦nZY[hoqк ^z 5,Ϛ5kC|=,X早UVKZh'o3}L:5͛7_rqmcذaZjf͚Uكbu())z뭷UR 2wU6<MX4h &LH2o`ѣG^ziٲe N:k<7n\%O,M4YhzUN8 2$ÇaV9!|eeevm+72mڴtر'ATV-|pƏPoۮrؤd^},j5:.Y_~9yN8ᄅ/W/5k\}/K+{j[ΰaÖ ,KѰa|={vyA1cƤiӦ)++[G@Z硇Zc,ѣGw͡d^u:uҢE{I r+_G}4CM;e˖9WѲ">hN=TV-^z"ӭ[\s5yG3ui۶m.4K޽{梋.O? }yg+_̙[o5]vYn+Æ K&MҮ]9묳2mڴL2%ӟ,\rI^xᅔCiѢEڅ槸N;.C=Sf]vlrqYrL2%ӥK\wuy'2~ls=3|vm+UIMUZ5;sz w:ts?pguUkܸB=7n7xc;jԨeҤI FӧVZ;vJcyp 9>~;;w.<0cǎͻロkf_|Ō3&;w1s?̭Z9|GN׮]sq堃W^y%7|socMbuo߾>|x:w:(ѣ;T;Vܹsӳgt!={\}ݏ㔖O>||$HIIJMjY$-[:aͫ]v~_- m״ix㍹{ҫW]Q۹QG<3k(5n8_|qz<k8:34ŶyfmҡCy睙:u.q{ln)k8@k1?cǎC=޽{k;f͚5kV\(s A ,a(A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&{8={IL T -RR. 5Zp%LcAavƩa-)uFV0A2[ R`qIBdw#='~=IDAT5!fϼ^&@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0!5jhs+;^;diT1)9c뢋.l֢E|g*o>8ꨣ}n45nܸAcoKrJ͟?UOO:u9F&O\GC9.:wIj-O;jŊuI'U{{~gŊu 'TgggUUuwwםw9"}{h4j5k֬aޒ%Kjl6zC4AժiӦ &LPmm#x^`،jUժVY͗^)u,hz'e`u/5,Y!a\ou1k5eڌkiU9!kՋ7ԇ zzzZfM-[-[Vk֬۷u͛Tw1w ^k`kmzzbGUZeu9OUJu~Wx'4:餓vߴiSz뭵zAsL͙3;A&M:nݺ_Z`?k@ըѿPlmʜ:5Gǜ}m]?yYM{^}}[Z?O|1v:S]6ԋ=[j]_ y캻j׋5i+w T}'n~ںieW׸!V4iRzuVG-ܲKZzu-\p1cܹsN)S?o 7_}e]v掺뿾q{s~ϛ]7ޅu၍j?v<պ|n}c§?PTUyo}ofL:Ո/|dK>߯w^={^8K.Yf;]mذ֬Y]~.>:묳j{wBê+jK?0ztEvW֚Y^yB?vF͛RtWk7׽d=uQu\8Ꮊ򣟭6זw/C?R{hX}kY=nmb-~rrZ=~!<ȐoB͂'ԄׁU ^nߚwf\Ucg̫Y}ߪgCz{zFQ^N8>|g-CֳߩVv;?fzsTg :氜,a5xn_9:wNm[t~}7~FZV5U=o4jkkFc\0q!?uݎZ=m0Z:Css^E7WAvu ԺwV=/5=wZ߇.^0~=ƀq7hjڵkŋ7Y}wWM=K}fx5zkPK]Wզ!.kgՅ:w[V՘7<￿:;;+tlر~gt#sr۷ŋkoxN?+!~Q={d?6wP]3=gΩ-WM}ޫj|zֹg^]όwQjǍW ,~}Ѫr@ӦMrBO?FFU"DM?Q_=!;,XPp>]ڰa0lh`5W{ƺQPU5f̘9sf=zfwFVĚ{ьZu7џPqaO}z͞={VU˗/nmXgggcoQ500xAzjVU>젱y#, Oe|oKIENDB`mu-editor-1.0.2+dfsg/docs/icon_brief/mu-microbit.png000066400000000000000000001550751341747546300223550ustar00rootroot00000000000000PNG  IHDRXsBIT|dtEXtSoftwaregnome-screenshot> IDATxgxչZuɲޱ1tlzp$@I!I( [SmlLM16qEιFm%YewV{}9;3== F?~B!B!B!T7yg9ꨣx<(LB!B!B95H oꦗR`=3L"4MLB!B!B!Dwa8nFΦ:cg̘7L44M}wB!B!B!6uiӦ Yp!@tII [n% !B!B!"]NCRUUK@!B!B!Kq{1Z(XWTTշg%B!B!B dz}}>B!B!B!J>=!B!B!BثB!B!B!DI @!B!B!؋I @!B!B!؋I @!B!B!؋I @!BOi'q'qƟ?į_}~x"Gp7/vD-_y/;op2ܻx'/>N=^won aƴ9_`=~WzZNBkֳ+%uwлevN?.yd-B!%!Bij?|7v6U0T{./3|5؍O2adnUG==}r- ֿ; X ClU-'B!7B!Df_KHWx~IohU reߟAf\yy!grrsߥz_[nDxO_1lf>2u#iG!BA:D~rOmVW_??1};=9!B!2xK V3QȘC䪫.dJB*aaPh[!BoѣFlW\s3NR_v:F־eB!T^p E.~anOWLIo3T4y嚼c?Has΍S^B!B5{~kYa#q;\Z־% B!?p80wyj8`G›E*Vcu@Dee"l<o(.&fB~$6'11W|剼v{ )M:([+/EmӴ$s^ʁ̀4ךfO^ɱOzɨ:N͎L'N&"B!n.<. |@B!(=i,ʡq d4nH'CCF N6n؆yh @od}1v8Ü_S3IgsU0$iOSx%oe73Əd8waHT.MB!UUWs͵׳i56o5]ϽIqQúMB!{A\y#<؝\ˆ/0+)o?E]O@Ob{ F:tޟ`үg0jwډs`  :#>嬬ψ stٱw0%"o8;TT7`mfy~s3-{':r0_z SB!BfZƏnigr 7vݺ-3B!ͷoeSl.1cf+>xwǼ/֚/;=ޝ9F3У,߸0Roeoo ʝ:\?}"ussj<6?Gy袜Sv'{rw}s/g2j.hSC8ws0x?ێrL5KoNJx⥅s"G G*!Ba&*.*≇dyi[!SB!Bf7s%sC$mB!b7rrrdFB!B!B7@B!B!B@B!B!B5B!B!B B!B!B$ B!B!B$ B!B!B$ B!B!B$ B!B!BŜDC!B!B!B}}B!B!B!'_!B!B!B p款>!B!B!BdtCCC_B!B!B!lcF}}.B!B!B!O@!B!B!#!B!B!b/&!B!B!b/&!B!B!b/&!B!B!b/&!B!B!b/@pw⊮ÈnĈmCkQ:zV.5 53k `Pd8_[qw`vA (EcRLPL01"oAݨG ʋvda$cHGp QvMpvmĈۊۅJԢL?hz2FUF$\0=cFp HQtGGtj 0L)FJƈ] tjhF9`x0]CH8=#{!r ۄ#Gl Ft'*QJAGF;rю"L`$cF]oԷ=}*!T 4e&\X!`x=aǘԺv:r@GB!bϤ]]]ݻ58p5^Ut8}iEJy9{|ƽKQjxx DQhGk죈Bqd{hѬCG56q"k\3 e4xHx ԣ(33 wCex5 oB)N D=j,$Kw,qhG3#:3 w#\Ũv+hbY>k$(ONi{ @:+ WxB(QM: ,$}81DbYS1Un>gB!z7`5^0nk(柁i|R#OS ƅs#G N$^GL0Ga׌Dl [2SFDsN"; Ql2ooG'Ewp0B+Pl?6gF8\I)t..l:qr9ꝎjxH}i[ @q%gƙ2RCM''1 !BWZk\f9޺q3=ȵby'ɿ1CI/P8C_U$Fh:G?h)3~t|Q&;8 .5No݋2&7pEč~_F{{=vؿDq{ RS3kB%5uIơԿ~VLBMFTkkHD" `o 㶭h⎮] #XmN:$|?{t?"B!x !p{08ro&k@ ; M Ͼ~@"krL`k=J QtԣLupH;3BVkewfXF9 |UN lDCcEQDۄr6)CpZb9s?.?(LedU?#+XƵ8 w)?y b`F D /#ֿ;tO\Ϡb;;)#۪_A9wk:U.2 #*EZ[ˠj~ht!4:b }UePT m-Ci]q oz̆"oun(wzuk?P6M_A8gzv<~QaPx n^~rEWUw膎ۤჂc,> 3R_ֈ%ʰPij$X|5s`dzOV QjWbV/(ڎhp*8[S+pEW+ck>3|=՞V}@3_8>6mZYP|`L .o݋7YvD!~L5> N !B=dWqk ^f;m9f;:x64xOF9=^5 w*^nD6!ʞ:LHqUG5GzoʯCcp@EPr!V/Zo wWoj=v,ʯ̽RUq`trAi0{^p|w(4|:Ja{ |5}.:~#//mZZs3Dr+`eh=M|:VTQ~ @㎭Wv;*Gg%߶f: l;G*O9|rsvK=v7}SB!bdk 0dߊ3IJ.:]i[b5|ŋ(6 irv#QCaB 7al{I$\r%ܳ`@GZGYwۡa6૸W^0H;t19(9;r;vdފh;KS+%KN.ktrPoz&t{ptc`U;'\ ;f9u 7@5hՍ]'_[q_ǝI0*k&Eoٽ@\BvPhu8JoP͇kIWUFM_=o$u~;/B!ZQQ3fHkG'8BK߂{Fz#1wdhXI2bqEV> sË.hj@4{ dQg=AP4 ; h+ _aSHkʫ -t&l>N !B=U#r&mn?q@Bu͛`ĶHTbg|+;M~Ȇ1C}|3[P- 351SW{L=ʶFF y](=dWߏ?}N:\h6+H @,+jEZ}Uv[ {(s /:ZS+o8i]>@ú IDAT$Ȯywݬ:qw5ΚR`r i4wD7`#5T3@@m=֢}]z}vpEW]~ **eqLܔg|Z }'`z!,)uR!Bd_]BAkGSOFbD7=zH(ٻ~a`G>֜ֈ%oyTˈgΎ=VKQ{V~;66 8J;b6ibZYb}l?#pwt-ߐ.g|eBIENxFB`@%33X-o`.ުhHI0O֬> b!Xk4rxcKpwIiש.wd?om 8d߆k 5x[n4V~PNA;Z;^*YC"Ќ—B!ؓz뭩vFSx֊τ!W&:ӓ6+4ǬThm?Fr?MF܃_W᫸t4I=J_xn_w OiMhg)gxa/͊ުpD7惩zNoR~m(b*jp٣b]10I//mGl f#ңn_A8saM9&T᭼Gln?mۧ"NVVIӺM%C9)\|?[PZ]UK:)B!)0t]LjW$w5-? 7i!\;SqF&{2:%dUޛ\0Fk|{lYCͻ#exz#q3LN_0b;_șbi hckx#_mo|v2(ߋӡ25I:3h :$Saգ?H=j$vL}vrq@ָ{}lh%iGxoLNwC6#W--奵|]V ~[^nka"k]#b$='׷̴ώfpVpsbj]^Չ6 %B3NMWbZwvD9kG7/OP0)E֚ۡq׿gpY |j/Vpӣ'l.VlWX6/YʪHǑ`ႜv>Ji(g1 n/H;w0c2rw+0bY;[SJ'hDsN%@W}u\EӞ!:Hڔhiyc =eO}Uߴh:-hmx7S^io_uDR0)m∮'wNf]g 9XںA[{:oAGfKy/>2KgZIwD)kdyqIUO+Q_շ>^Ue\qkZN3>]͸j )%鍤U,+@*nU4ڷpEצ޺NjyuySLyj2>N !BG#QM @(t7ZkI"g{g2sw Lך.OûvA3!Tr|j?;_bf'YLhd[jʻzv{55"D_e][|(o-3.3[dH{MN,@Y3_m&HrZWFK0Q71Fj\mRdWe7ֿfOe]_I2˨{kj> MYoX J"SkVnW˥y=!o[Uu2Sn˚Ejޤwfǣ[kɻ7$yj5SxPiS ~e]|B!OٺHS @e*OUۛG*〈xUh}l3 \_=ڕaiw~>G=p<<Ӱ'øۖ\ -!HU9"<)6; r}V;Y|z,s ףNGeq7̗vLÝU~^|%!n##qہZ6ZZp4{K7/ٰ-C)J |u.:~E>ֈu3`y#݈+Q!)RpkvTy| 76exed'0rP~J`P&$ 4%wvZ2QߺcÎ& lKc?SGnڧP8ƋYƛ_k 4A._n)V^ AE펦A"]ߡ'A޾Nv{IMpB!S:Tl{ƢSiCc] a5v||ynYK{`wjx#\v.ִ|~ȼ @Sk~c (S-wxGAx#И$ F{:Qǧ{--?e}jTtK2xRxC-/έ%N5Äw`b}{]ZRsĽO?&0C\~ Ek+QQu~hȌrS.9`sqnʡ1iTIfyGC4wF6⌮'Ϟc\ߺKkͬk:|-p{> ~aQ .ѱDq'0%ZRVRXB3{63(2D({ ;g8rCX<˶o0C }wVd#N>xLz3z:)B!nrc=ڤ4ZQX߹ ӏ3fܩ4k-\.$ajxm1݌L'&mR8czGYOI s6_Jixo& Cq>6v<ۏ+9ր\[J) CaF grj{V:: 87yOY~X_?>~i -Ʋ evM''^c񚮃mŘvguo\:OZ50FGqny#Vnuˎ㇧D[ Rc?TGҷ^4;г߰]ߺEky;|ڧ[Zr]r׀OOkͿg WZERʚv[7ä)q #i+0p&ѓ`}&{=nx`S5lzͪ?sq|}~vnH\2}B!SfВm9۾X S×͛\ᥠcucD֢m0i:,XyoAz=iGizRh\=yGo|f^u*6uAfn"01 O>igtOp-#(oyfRMxtn>gM'oHKG3 _F#55 a*jL.e((v=zri竟u1 G~Xrp: j!C#Ay%dmXO)uֲ)QYuPvE0ҩ:_a `a}j{KE9NٓѼ\*{tUoݡf]`>޾6OU f*'BMUyI3nPhӚ=J)>_mfڡR?:+_L@ Άvs ,Zy[C(_nf0KdgUCҿ~X e:)B!n=q9;Q6#Vri}V7*V#kDwGW%?x*Lz@k;Csiw0J J⇧dg Ғv^\ҭK=uO)ž#pǕӸPUj~-01Ob4ہU$o=R0 ⍳xϾBq Un; *Z*V2J-Y>2ڞ\KiQD&"b]nT{a>e24roEzK%OoI\?Ͽ=4 3ܺPZ.0 ŴCrq09eF,`[E=?_.'5jBov4`sY-ZÁce>%PkF 4H7$\?jͮ]Av&OAw8c'rO}*LfU vgO`?7ͤQ%,];+81\~|"<3o9|:\bqmᤩcp37Z7ZْȬ@@ /,L 4Nn@`j|rZji2xB!Wh]u(:7a['wsV8]߽ε%VNZ,XGA& SskS?3@!@ل0U2GX@8iwG#FQk-g{lTOukNn5 ŕge4ImHYh6kńM( T buTL%_Rzxx9:3[eN=+SQ4IAo#`#$і:fK𵹽6l-uq幇vt&5 aֽ;IaIk`qF7u?G籽ri6ᇷrpA|(O!eQS6N4d{-r5W?V&8濎i d:jV's1ij5I3}' /+s?ߡGg̥&g6t:0OiJ}ϙS9:QC(ʪ_XDr}h˾o}Vz9SVtR7`ϩws6B?o}H`S(iYrክ\ם@)G'WMz\p祙ݦ3(M.k߾=j`IrG'ukDl:W i޾ag .YGިxe@I#tmҁ0O]58a%;?Fbn/%n d9!߰Uߺ#>b񚝝&Ю|v}??/b >UDAd-[u gҨXΏ<3yx@89ե<. מP IQyKڭIsK |3e qxvƻB!迺HȳeA~5nn}0tBѤtHj7vwVDHF G3UΪv": EY@"aHu/ڡRIJi,PƷO? JQ~ \pwFN?~F9Yn8C'+_ѺI 8[;@ ;QNEz*7q; G㼱(ytho똤 XHUOwNܟ',k^U9r7DJf˽v?8)qӥ񓙯7/H5`5g9Gmm 'bS9( n0y>( f/j}xKGm6oH_o0 eyrβ.]zK%}6gL}AZ@9{; p;v8:9XP^5۪pZkLs}-A 1Ȯ]:~f&q~a|ذ?XռG_sչ<B!迺hpM}v6:ˏYNu|-eu)c\nx6Fߨ#bn7 IDATV348WOkWh&0 n}vaVGZyeg%ٸ}$MBFpUւ?msw[` O7[|2.o}[_OƝ5ln[u&2bP~O97m8l(?Gg܃zi +K)رߨN>x /l ,[_FU}(E7ؐވXvI)/֊z9^;X@r0|`>_odƲE[{rZ-2;ÈשԷ?^.ӿ=Gb>btu(Z/j wF)` Eb:ʺ@2k񺭠\ xxcim1tN&o.Z4&'uҠ?9ؚx;ZN !B[O*QUo(7Ϊ߶Vl*gʸR2*l}*TCtL19#ZGm*-஫sojz;20WMgl%)uOkͮtK4qg s;fҨGX~˨$zST+Y{meq8Q]?v_nW|hE<2JQvTG'L SЭFQrhGU~,wUS'~WoJJcN#83 v6GvNv yn0f6jW^RY .H,asS>08h|)s>_ϲeTN}3n2}u7ӽPBxfRMWkx}(y듽27ss x} T$5R\vd&Lݎ#I#;cu>fr],N?|ysIU~6eT.I!Bu/<Z} r;چ46;}Neha>gOfY:2\s*N v`pqAbw"1xK9Nnp6:6 }Gj3 κdqa0LH:P( BH]"ontxAАx42ro0h. ܹ$ʨhDQ,nkLPq~߸Q@(ʯ㎿[#+)x!_|u1SGXU~C@Cػ^d8m>|/o&&= ef9 f.bE'=`N(/f[4O =(?AcÎ>uxؿ3)O=3Ec{͂j̊:|o}ޣ2|`6z u^u$rA@ <;<>8eiZ4vkg0H̚f#Hݦi0mzQn:g3+k?y(#rbt,a=}KFR2(Fj0h+Shhpxjְ ;tΚ3͡0Ǖ@ o-AF(u!](q18ݥfL'uݢt\Rm#BP( "eISBvx<|2A9Rag> 8lfĄ1en1kT74s_o]HaNz=LڝϬ()+Īk<^K);”lqڒ}5l^*ɢk2qi+TraYV@f&fa U3|`6cն>hS}YkuvњFipmu5M0fYҡف3&u-̡Ze"Ο;&q&4k?<s" r3] PUԄL'UKjaJc҂NT6~Ǩovj ||pmU2tmi5Һ[3\`be,t-,NBP( ŧZFxvL l͂f dxmZFߋvk&R0S*z[k?Ϡ qIrңc$@~k?)ㅕ{?`p:w[ &ME/hwοnye*˷U8ozG5rߗ#2t@OyN;<LacDQ_>wFg4~ح׷=eFӝnMQu^:G HrXÜ^<%5=rӮ9 OĚ&]$:ndQCǺ]gpp_b㞣|kPR2A2{XO&@,M}j.L}j}K*%@PblƹsǐHRY"$nh Z'+L:XK!wD(DQkSΈ,nyն` Fwgk$J: )[^ Ҹ%a~Xaל=aQ6ƋQ~Rs!! \S mIЬc/h0dDl .l.čZ8?FMgp~#% Nk֣ͪ3 d1zD&DHeɻ0|`vf]'u:Et^9[sf5􎔷7trQu_jap9LY;{8kΨNAVN<~>y$@@3e vG u?GaN:irG[i4r3-_E'MI*4hsjp,;oF[Ay<2,7/ jΰ,yg!1; edP.kosq]pv.R8Zd ;9oc">ȀIJF>բ3k vn흇,1"ɑc :,' _Rφ`} uųFVjFv)+M9i4~񯕔V6ﷷ0q#/+ )%GkضOV fuvYa[_2" ~~[vQmoGd?`O( ȜZ'Rf)iV>yS{M$aT( BP. `tjBSiĞa8mڑA9\.GJBtSfTG/}Gj{׹3QÓw}0_<뛼[zQ̬V>(=0FiPd6˳Z4ym~фלYsF8j%^._8o_:! ()ar8N(?i=!㔚De(ilmpyxAj<}y!7=aבL/ ~&D躆R@u;G$V{afE3JڎU5pS/&[K) U0yxnMN4%F&Ki}>cxT?w,O%ZŨbar$x|~noz11F鄷57 kz=WfڻYzڔa awi5>nwP!8uP{m#/IU궩 F|B0,9G!qfSyez<+1ڧ!h%)_<"`2xzFHYMV>//e)0",{u0Ű,{un>e υw?iK:P( BH]" t|9 ֛olO%UGbjhsxA}c=ҩ,=S 007ʾ#5w;5DlEggNOhʴV =Уhjq|[oTJsF۴4=D9 mOJR~GYQ6(b:+]qL2vCoj{/uM^o 'f>7Cj{.%&?y(ל5ء:>{YAKd%y?pa~K;(=X#rӱZtۗn͋Ofָ2US.]0W~B=8lnd.Ζx&/尶ՀRio9NeΞ3!" !![)s2Oj9>uo}ԾV6__]ˆw16zWp[+qqc8 m46i+_:gw}9+7۸bwMfܴl?s2wa2Ƀ&h 7yF=/ d8: }y;rA݉-`bx^BkAho",$ wh&=2}M}fY0m8Xie=Ϭ5gOݳ|~6 ܜ2qHl$ BP(%@4;{k !hO  ;m"r'ϟxS=edwǮjNyX)=aQcѺe|gRyc nУHV &/@m-A N˻k<ױ/f|vfqmuA[-*ءC΀(x}# `@ !:cϊ8TE]CJ#CʎB =8 ۅׇ9#yW#B%q+h.mfֺVQࡦ_uC !@Q^:W-ff}p3=UgDQCÓoo_ooԧfѹ qj'H~e@Kpok7\85ˁ:Et*04xoA⺰B}h2c4)|}4bW7Fԍ3g閑j'=Ʋz4Y)j?;ٓZb#%4켻V"'Qfol"FkΚ3,*πtu xˤqYS?'̶]"иZR"DVD?O}[ <f)bvr ᰮ [Y$ BP(%@6 p dâA$Nhg/K iS|fsDħouDU/N0NﵵVm=ܖk0721Dd K>(4Ϟ>ٰ0sLmm/nQD"W"?+&54HRRBcdxeWo;P?,Js XG d$~ d- T^ϟx_|uIێL~I6?kk,9![)lg52'Z"prntn[PUڳS]>?+ ?$<>& ,W+)l`•Ke|?M{o^0Br2kٺ]J@<.߸Q&J~aq6n4],n|?zlEFjz,8?QYf˾ )[4bO_sScRl%9h!)a5,ɛj|S(;GrϞF+~!YI)?~lGIwڸ$BZyq}k _^Z3"!cA\)tΩX=!oܻp@@wf!xO杄M1aDCdym<5z&޳e_wN)0g\qN* BP(RAKZlXK ""BY FEg @-KCH [ۃK;>8DTԣc3sؼ{!%s38Gjsz_fyiN{Qcr !|S>~mN4"-N2*DlXM׹S&" xj ۅ QbpȀ,X4ߺZR*R.)|Db5]kk(__v϶7ƥŚm`SCzex3:%GRgV@/[O0b\4~df  =熵Roי= iv~EvgNfd읚KK):\Ϳ(N+O c ‚u51%Iշ# ))ʡ)<9CKf$ie䡼q?n_Xvv;m ̍,qۧF@/ĪiC΢ \[X[]I Ph2YD\uTVm;㪮yOL0'SVfYΔL'7l1BP( "uiVX;a} nb6t KoyM!@DVİB95oBEQ5*M$NcaבrP̑^JuIe!#;gFԣ{+xf6(k{쵍L5{+0N=nwVBp)n>/|ᜓG*Ul}؅.39^ +>tTWzAV|qɂ\pR6a2z~)*ܟ`!sFΉxװP7D%v69<ce;WϭwFTv9o5ܲ[z_~u1yY18,?s&vEA2דK,}*k Ufhln ѵgpֵZ IDAT"4Cz=B m@Nl6ȘZ(vqy?1|L㮫po^+xmz73F1uT!sф}QVnẈ(F{L:P( BHY"~/Vb&[~]I٭2SHj+@{y͑bhfbkx`EM4߹TΞ3?WdzW7q]OFפ-ڷI0Q)^=r9Z ;=nO9Q3N=ꍮ JcÍ7)Mk3$5`:VԅeMYUKE7P8Y\x5Sy ]^m??N51:ׁZ6)0s=!X:,%T=<@iJv8zpxfvY&14;}=tڭr\,W6^dq1|aT^?>,io9<߸h _:iun׾ )]S1EuCV9ꅳ nTԴ7mɗrڔ(yK>@L -5klT> 3;ԑ4ϟə3Kx쵍 Uno ;}_JŢ1i>pf9cFPlؽX"pB"MZ( eݬ3sض7G9r&/^_m-Z4 \,3Ν[MwH:Hް/!a-$%1C״!D>mef]=D'//{Syfn:tpVnTL\ BP($@@6 i-FCW .Kdͷ"eȁu(>rY-L])]8&Pg^K6}tTOzKCoFݤ.lW=b=V̮).P!xS~)EVcxS#?Zw,ٗG=K.\vDj=MS?VmMLɩ)%K I&p mNwW:52HRZ3+E5X,Y;8|ePnwmã~3shvɲIGKpEh7;o=Ԅ`ꨁ:}hBƨ\N0te'Znza}XiJ K"o i溒0!͆Nbdl/e'*@ 3ΐLȼ)C10!߽@he~̛a )gt]`m- %~1ʾ#54xL܉C]='-$uɓo=!fљ6j F 0$n/^|բ 3{Y٧9荫ik믆ꗡ̚7 P~ B<`B/7m+`ȀLs3HP( Bq𦟉+:4_n9M x]"%c 6 )Q\A^5;zgOmpϟpdg!lxҗD=xh,vۅQOHDjѹLYȃϭewiuB旑f3&q)G&?C/^vj?0a8$)y@S,}8D0s02R+`]) I- _5GG3ώ\}qd]a5gțl[tkϞaH: 0{ܰd$y^__;d/+]AAsܹc"aꦥ| 5y|oqꤡ+c ;$m#ۣo{wo=*&IiA\4ox!%TO'ByΤrٹh8Z:LW%`T( BP&Qx2Q !G%`flᯁ\2ύz()x3Q`)a ?+WIB,d_7kwa-=(>%?M̟<e_ws.xd8?9IwD`y3^4Cj6W }W%-\8^E'Fq!%4|8_>[hps,/36Ǽ7u);T !Ɵ^X SγmsfJyedk?I7mΒN8ќ5gn>̘ݪ iK\B BP(#ꢯެK4@ h|CF/SP߰C7뒘Z+pTџ`@OVΈzA3+ ;wJ1!Ň_x2/R&"x`ku:.n?L1FglRU~B>k*h-31>'ju }2䝗3E<|^tf)2hڤ{ka>6enZ.ޜ]{b@ m@Ns!$xs>GPKfC[T$>6@3BRw4P= %_q?UQOBP( "X7<6ރKTs ;87-R8iνIճf~+=!R==m[[9%hGQ|(EFsΉYmHu80IpN9=~c("RuMcꨁ\4oCdu/>_2_gmRƽG!\pX/Ƣwx$W4])aհO )9,3z0S/IRU"3 ] .) {/e$8H<5+kJ煢IBP( ʼnDLi2p.9?_ŭ+KIS1F1_g;|'_<`w XvpN9rդPQSPa)u(մ%-o'4‰[Jb(4g_~8Xo;}I8g\E|6S M=ġ)4}w%R`## Ѩgєu>DZ:):={^S}t30|! %xv*N* BP(Ntn-|fGww 72kOokș2^(}|ou\{iBtN1Zk}_sP!ƃmPj`m%wܘ;_=TYWD>V~}cRK55<_'D ~/x 9+SzNhEN9[{#$lƏM3So}lX ~`MC0pvRkVh9*zCyrKT4ԽOؼO;4r,y\[ocVNh7&ύ9CRDFҌ5?2wȄ+蜈;•гuRP( BqsFa Vд|57u[3b<}q\s2֦;/ԾΑ`"/V oApwWz$pg-AQlL~`k рI;N0 wAk>e]Ds֥IlQt_ O%ڬy E<-6k{666Ǚ'5@J[{#<߰xWkC6'/}%fPa-Ap|9ҜXg61)$>+#> guf#޺9*5Y%fB;XxjkGRSuRP( Bq<w Oŷ/!Ӭ1F|Ga]PVa ]'Tp$ietN."AC͛ m\>Kin]:e7zTax&Ibup??;Dhfȳ>2,5掜a%Hs2ڜO%={i+d6IabeNs65oFʧ^22h*9>F9 -pͷ7\pMk3@Jp{M!ƙFU)8myj[gO =c"VBvP64YGt"sh*-M:P( B8? tisz#_Ng ؊J潷{KGBӀ;ZZRaQk:8$ԯ6> 4gѿ͗Y]'XHu=jHHyF5_xǰd @f5%`NimGɳC_Un V~!F"4 zplApM,[)a5 @=}8)s&@)@~ 33vY9 {,- wp+qgm /תo >ZA0MY0m#hn,}wYOc\ 9Oj BP(BbvSK? AfcqQS* =0~w :w`h}2esz )4Ek5o$/ȰYY| O[%%(P G~ N'RspRw?6w<нpasϧimo^?z\;LVxq7"RQx0@q|t [aLILۡi#jz.?7 EX񧝄8r\RA}{01<%4wh5p}[t#иLа}p>aD1{ Bzڎfo7Ϳu894M;GҎ;މ9OjJ BP(ދduuX҇X ϴj:^g%WD8oƝ z ;}T3J2f&'R O@+fVUǯ4t@Qpo}G;hH 8[݋`_l:hm]~o_4}IQ١%~?;{ UEt؝ܳ ɝ3Gn 04E6"AG>贎Ksa90r3hyIܽTo3 9 %$1;eHݽgΟ ,W/ ;,>H= 8+G|b[Ro A3P(=+]S<AA( oo{ BP(~ /a{{}ю؇ŹgH%VWMp_Ӝxs9<өOhJҪ~Ža({锌JJ3siT=on[$j$P>ף98@aDq4/`4v3!t(͚NA;qAK'+xҗ@h1)ԣ1Ƿہu[ 4s}tM1wUn%T>vA3u aX b?_+pV>.%Zs!yQPJN&3YaK=񥝆'@Gjշ_"|׷if`8K8}FЂ5kÛM9oɅs&߮-=(d%[k6X_e_h.EsDPˏZ§pT( BP$'Ђ݉~tޞ c٨Yblj45@ ׃ M>&H2 :KȚ q z%B|IpVw_Y_G'u0D?7 ohYz(Pv ocAkȘe6|u6KG2/-]ffsI4}mx$>Mzv3:f 4DZ_Խ: 2!mL-gWдt863 E޼VgZ =PКw\4kĝ̓9֔WoM_ dla>GԯQ-(Y4LRuuE2S3H {ѷO5K8FAߖh`@7ߑ@+ 5,u9l-;*D{R40Amjsmlh[kS@ xsufO:P( B8>Ij @I`mo63,ĚgfZ2͏f6|IԛY]loEb\7\ Gu:@VWt.hBTO7#,KȘ5͉;#iιs*JFB(dU E(PvGӫث 4i`-hÖzc_i("1e7 E(4S^f֞\}-%@Zɾo¤e'>ݽg#jڤ5ߔ% S)n]V}kÛ@mK9$]5 4Ϯ'H4 hKIPDP0} XV_R?3@@+@V`kz[[_)TW;z-P 5'6_"|yid}^P( BJy avcm|c!{.R8iF[a^.wOKf_kA"z&u0~)NAZ@GGs6XG [K}hEaۇquy2*E a}cDӣ~Cvl4oBc khÈ`}L;$:XrGM;@L%bF`kzkz, ֌ci+5uYʤsL}&,:ф%Xt6Dk^e%@#l @ΉN&`S9IBP( I~,==h#hÈ` Bh0e `cXG4ҥVxd# .4@ a4!Գi+"h-ư°`XrI{_j Z^4R° &h+!hA:e`Q_;8Pv;ҏ/߇݃??"/! %۔u0}$A's=_; +}}ѽтul@ ``!@ TbFKf:Rؐ 6emh P ߗ' (~t^t40=i"hJ6u8Zد>#ѷ>_z҇MV{;Qg"Ff1[iN -\9IBP( Ij HB(;T(Re BP( BIFqǀ1.u.ܢxx!\siL1agfw,%v#O1:#<|ѐOYR@xϮ[Ƃi#6vK/xm0*WkRKBP( Eϟ+b;0돰|v68?d4y陈\ccwrȑuF=T;Yүk4[ե9Rȵ-GK'H7覺wJ5V[uff&joFRwfw~9Ғ*Y*bŻ_wn[ΣkyW٣,3!=f!WPSP( B%#@#SpR;wU >[oQl&5 X=mƗg?e Vr4X!xs&dlκwhH }NÈ#:U+5Q2tϻ6iuybS}e:%xJt,*/c9NRu3!%uַyp_"ȡW~ĕ 1rο?mhHAvܿQ_}WȠr\p2# c̔y\'Nmh$`p:b/Kq#F9~;O+hstxs{e֒9j(%⛏⽇oaq 6=֞׍Xįw͕w`̐y~.{{.!z^?&\w~p0tlyּ[n8g6cgo}</f̱|G6Ԛwo6>}%Ck~ʂwi%w4cʋRMƨ_0d(f_z/k &=~ <&seI*j}a8KO,4T Oa⨑L<,~hCC[a+OfkKg1d ?{fEytti6{(䍚k[RLk&1XbłFEQ]=Ҥ2b|9s3??o̙"~ }ny˟TKy}l%/WO>}G~9ۙ[g3 ڻ`S0A@m? ?>^<k[2|SFle}Ii#rOg7_;ߛ^+'3訝 KqsNΛ7I-!}S>.Itk:jTVgNI2kmwvYtc~Le3_}OIVPU޽{4HE˞9:~bVm>SspwģJi5ܦʽsI+cUSEi& gח$MӾN٪VN =;e9iҋmU[:o4sfuIͶIoâ,w.e:tN{z^ʐz\z5:it![v!~W߾ҴaoѬk|RbphlٲU90}v!'(;U7Km&'С[_.^Iiӭ:͚u>ͧNKt|řsƥƞooIEur@vj"mzCvhIvȠhļVy4\;#G}ݣU5Q>\wMw>z4kGاcNͽݚ-V>֫u5픃:.'~.>b[trE*:e)Sn&᳹㻦]4m#;uiY+/O|˚sr%Ǥ&4bfvV㕗O[2?ehO;tOF32_gG: G}ڷ~;5!m&;a\N*+W[9)6գ`SӀ}Mg~|'=~nԼ2|W|~iUm$).<4!w=M499]fP] J^k#۵~Oʶ=ңkZ]R^Y~!yz+YdijZeتKjghiy9OX|<ҥ?//U̘sd;liJʶ~8\|[O?#y[8=GtHݳ9 eޯ6VV[̗g.=?7i}è[[L~[ƍm n{S2oow]Y6m۞MʤI˾^oFJAGeʐGNs葻dd]CȣR U:z֤L\n3i^lݱ* 3'z^<9nR^SZ$nEJ^ᨲu|2vi}᩹`?؉3}|lNmdn߹#Jۊ5s}V}>%i)׏˷]XyTV=?]hF?9iUτMsY5[vWsᰍ=Y]&kc=t _뛺ѿ]O]|>mSѢCڷx%/L^.{)_J:n1UUK:ɗɜmv&W1'qi6BV9}2K3t:=Fiۡ:_~%+ 'I6g iHRv[3k#r!k_ϔ) q뎛lGy_~;P,/ʩNe#O6UHeEE,] m(G"fd[K=9'o}O~!j2Qy?Ъ %?7[qx:UVaGdG.Ʌ4ϑGoceRW?~qmjJ崜\[2aA]ύMS9u,77o4o[MqoYnǜ_0.뒺S3i܊AT o{>]0;}}qi}׸yiutn*#r :q%ĹYZY7=6_3m:`0/>;:3(iVzmFfӧ7_0Ö̔떻֦Jsv _q?fiur^7i5#O2]mO|lvяsKotNfq9:=Yg賯=\I&i\z9Ϗ}-5 ds]6LGYZNjc^~mm5t:Ic+ɳeן/'!]Wqˀȅwťv<3fzӸ!9c~9vO;^@_ޛt;o[g~]R^:/Gϫ$Ӽ>c::#_]ria^n97 -yJ^qޓg&ʼً~Kc3iUW*ܕ'^W'䉇GU\K7n/ɔ5YhO4`1rw}+祾k.C&8>5[VuϠA] ;2Im_GMqrf]JC:8/mcNYpFk|nzGueE|bA_mo5CU3_=8u){ÌhxE]l1E>{¾n%_nAi]4}g9d·O^eZi^SbEqb9>H^6͚ι«Lc?S]n9cnɅ]6;͌gMlu|]Dz<3hҽGx}{shEU?;ߒ^`5v_n,ٲyb2U\?sw/~>]:.Ww[f?Vw O7a5]~zBxƞC5u7?7m>ov6ضHn9C|6GSzz~t =oMe?~4 }R]zsj~2o< l\qGSsDz=.ޒIs{OiD 흞 !)_+Ћ2of.=:._pĺlwօsfҵze8Z<au|ge;U$)Ϟ=Pɢ%Ң&{_U͜93;c̙Х-C,<a8i(̛_֭ 6g8՛:GM/+h֭[lڣ IDATBt]|` U]](2A L&k$?xClI ,h: UVo>dɒ 7o^f͚uWi۶mZn=z4t)PEO>$߿V_ꩧJaTuuϛ7OЀy5tPe}x-G\n: 6A L&k Tr f_./Ku+^eb9ui]\?uּ6lꃀr>~fOJCuo-{5Oq,*S.MϕGI=lrcxo׿|_ͷܴA6@|1}xZ5t-oS92rԳ/[ȧsg7`zg^#7%;~af' Owf%՛U~g/j,prY4l۸*M~/Ӷ~2K˹[wΧ[푦UgJjY<|ӽ]wNL_6P2夽O;d~Ʀeϭ3qkF>}v^&F{"vnud3♛?MnsS^+GoQ?--,֥fүr?d`0mj";-&kG0),Ԝ)%Y:92;QcҧOza`cxCUm<%=];(9c@ukѵSά[Ͼwdn"_H7n|/8jC lּʆP-[bɒ,`2)Y<ҷKo~1qy=㎊T$LEeeʥr**o~xyi gOeI͒cy$ɑ \.W7I,E/ͯ~~S*:߱rR*\L޽J3٫cf)u-s;3qcye}9:}3>nm  j6=w\<;erF{.#iޢyJcfLwlEhVδfi?yNYR<|Qf~*gmuo.sh+_rS 4΀O}*;?sqpɃ6;ύMs]fۺ FeeJ}ӯwˑg_/~:sf}YͫU}o4K.?;{{73߿֜ۦc9Ó^K)I^_ؼA~˭q?]r-s 24oc=}\z'=DomwI7pC>7t-Oiq,nV-Usa5tHuu=YZlVkǺ lP`C冬<&@ %Ie}r뭷`=pUWo߾)J>.\W_}5-[… $gV[mEEym۶Mf[dȑ[rQG?~L:5W_}u/I&6lXFŋg-)R_UW]iӦk7Ìedɒ$^ҥK>Ol޼yy2eʔ,X ۷n]wu:r.l9?!~zzQ|3y,^8;v̾~ꪫR*r9笰_ΕW^|#ݻ ]x9һw >z<d;)S$ILg޼yI'̙n-r9}MUUU^}4o޼~#8"oFFȑ#WZQGR)S䡇ӡC+kg}MV2eʔu]yrᇿȀrwf:#Fd6K͚5+W]uU4i+-Zرc׿5|p8\;o /~e]vɌ3f6̙k&555߿ yg+O}SߣGM7ݔ:rH2|\q9VhK檫ʬY^{C:u*&LcfvJ^2vrn,]4Wh+ϯ?ŋ;L׮]sg*I뮻+ߞ;=xGꫯݯ_lvB}\f9묳C.ȑ#냀ucŹra*,o֬Y{dРA{Rq5L=Ͽ) eϐ!CR. :sM6I̝?~b'-Z^{- ]wݕs[lŻ~y 6ӧ^ˉ'Xi.gڴiԁܸq>|x>_x,\0_w…4iRo:+**rg͘1c;XhQ: $̙33uvajƍ^ŋׇor-dԩC92[mUvabc 8hF]?bĈl6+tϜ93I[kY{oYfIVӯ-9sfu떺̙3'Z5d7k֬ɓc}]m{V ***V nf9sW]C1|ADcǎM7ݔ$3fL~_X΂ 2mڴliٲeڵkiӦeB9Um>mڴIϞ=O_~ɸqrG޲ɢW]QQru,zMu$)k]~Աcm֬Yrg۷o]7UUU+ sֲP+A;{e]㩮s=1cO^mm6 ,ҥKӥK$o?}TUUװ,b߱N:kkjj52`\s5yW2cƌTUUW^+ӱc$o,XEбܸqᖖiӦ?mvזl{M6M3k֬T|:.5JN6趗W.7C2TVVnpoBJRϟ֭['ys`,Z(ӧOtӧg{M,ܶml6yW:d˲GΝV[e5jTvywުUt%O=T-ZT\.LEEEzYM6yWyѢE_r˴o>Æ {W0Q*2qwf͚塇Z!#<6mڬy޽{ yW뗕3]uؘu3͛7=\.oc?K.ɡ mСXgX ^6ܹsWu]m6gNTҥKjjj2cƌ>뽏Z6lz(ɛ֋/̙33p$oIskرc.\ &d?^0`@nJ9csUW+̀ҢE7.cƌɁp,}Ɉ#rgw3jԨnw׿r 'СC^=:z/Yfiٲe [n%ӟү_e9sfN;Ɩ?3~\{g}ҢE;6syW66f-[Gn)W\qEsϴi&gΈ#ҡCUTʄ $/zmke砃&tM׿$ۓ$uQ;w;wnwm۶mJR6l ڵkM&[lz:Srw駟΂ ҪUt5AHuuu; :4=\ 6mڤSN97Hq^rf6[1ڵy睗!CŋӱcǜzqWXwmG{,{oڶm?<={>/:u> :4cǎͣ>t5vZI.d-СCs}2[ou?w߶mۜs9{#EqsI'Żx?ǵ1իWڷoCG…  UVVf}ó~KT. $n!'pBN ]6l&{7r饗f(A7{{6t9lBz衹[r'#!C\.gwoR}7wNnݲ{4t9l6(3g^ˤI2| 4(͛7o}wC9餓L z1bĈ<>}4tI ;4j(` 8p`e@kҤIC@ L&Xr%z@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0A L&@ P`(0AT?IDAT L&@ P`(0A L&@ P`(0A L&@ P`(0A }e}΁'8zx42::bEjSK!ldncNn;YNnY8FXւ6V6H"-zZ!xq3=}&@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B &@0! L`B ڞ9|1wH',Xh O_o2eQ pUUuttyG@0! ?==={.š8qQx"ڵk{ΝiӦz{{)Etׂ jUksޚ5kjǎUUe˖?~s=\QU͍7?/o]~lٲڿ|zꩧjԩ5eʔgeUUBH٬K]w5 ;jҤIr75HѨ+V ֮][fs!5/:}~xKkDsӺjV6?Gj{]uھICsgo< ͚5?݆ZӦMþ8hC\{S=mw{]7oM ۑZԼ/-o=cמ\]{_=uw:thq<^cƌɓ'ɓkر޾snjSÆ ;O?{V/g}g֋ǝRx5YWW9wrMxz.>mBԊgLq'O|[}w?mwM|ackD «|5kҥKn޽mhoog:餓j̙}ƷnZ-'߿{@u[+[x5S ЌIYsc-zV]񭎺Ӌk齷ק}Y{=ǿ7著MzO}K?Q+>S/y_r}R'|5׺=Y[klͺf^}{z>|gӇīu7_PqUUr-uw֪U1b>#o=fYWᄏ,Xϧ [pHZ:_YsON^zg[^\ͺֺKeVUհ F?F|ݵ+hoG7XN|gW֪꺬>rke[W_\WF{fړ܇kѥu7W]>kѨfs{ =zO7~Zzapx"CVtUz󥟪31W 鍖j9}vUK{~G9h4xdk ~5-٧Vuڗ3U5_0=zkuiYzts~L>6mTk׮G}tc֭k֨Qy뗿_ѨOǶmVwjƍ}mذ.\gf̘QӦM~>}`x"#Us>?^z5rY5g:yɠ++ Sן|ru=vɍ͹n+֮:~-ϭO M]5}7s?S/b4iR-]tM60aBzUUjժZb>UÇP.۶my֭[>C 9sTWW:;;m [ .<P+(,Yv13;8B@kkkvQFՠA~~M4iC O>ZFߗ 42dHM0;=u9#˂ \p5xz'jԩu '͛kӳ׹F3gVGGGmٲ,YRÆ iӦ= }l6:::j}Bȑ#=غ袋\l qȑ}>|^cmmGo9QU͍7 GFgg@FU5$#L#3IENDB`mu-editor-1.0.2+dfsg/docs/icon_brief/mu-mode-select.png000066400000000000000000001160431341747546300227360ustar00rootroot00000000000000PNG  IHDRZli+sBIT|dtEXtSoftwaregnome-screenshot> IDATxwTҫ DQ6T슽cDc=EcFcآػ "*AQPzEQ:B4y眜̝ٙwf$^ `[AA *WIVu1[lݝe"IGTASRHKKՋجj$0e̙B@TT*?R؂  2 L\.oaѢEYU_SLa٤T*QT/bAA Ju$''s211!<<̏  ¿ X~HAAJ@ff&֭^MWEGGqAAHJJ|z444>v<  ZZZ-AA[>r  Y"AA(%"AA(%"AA(%"-U"wуܱ-MvgcwS ~QnNy/P;xOagѶM[~[46o{̾QH2./]V[{EJ+h Z&wNg̼MyAjUA?=sOǣގ|1b .Lzřhl=Nxm ?t RО$h0~RA:S[ A}kPf۵t t#S޴953, xϴ3S']'t duu\7R%aϪU<B{ՃZw|Z$6aé[܏G5b/h:E^ Ԛ=@oCktriS:gLn;H^#6y=ocJur6UtaeH7q2q EE.A5*q-L!IcPlml>l"J’ah3nά&e;OGcn՗J0QM*hye${gbʟgxJݢ:fz<>.$-jt2SUdGV%]d02"lV]qPf#M7po:hIZ2$Ylm֪*A-Y#Vܻ1bįE a5e~gџǹⳚSΩ' ]E-2! ۾0*8S<})[K~VkWYN^Qagz\uD*>7o$θNxLFnU+l}kk0`8K9BD~9d]Hoz6ĄK0zY'>lh 𖤏S)m97|s0or,j+gP#^*<8֓w-q.ɋP)Towb[Ӿk]6;Ʀ#-Gi&I^ܿsu0~i:ף> Hjt~RAۥ3Ѵ ¿:e˾3WWWl< M iR jIM,Fnam͙))hRxGWZ疴V<:}ǫ$\&w] 2fW< {3'+#LKcldTE%+8B(h\!4T2eѷ*1Jk\$E UF*_>3?!Dt;-L.C"",9/M r^qyOu P<8[*1«vfPp~5_Nx@Gw;4ۚ^U15/*uXjF(ob#mjK<>Uw@O,#halӳFUp1A~Ɩ%^CyKf$*wšR%/jL~PriӦ@ 2HLg< g ٟI_PU7*-7p-dTf*S";7or/]rCZtXIHb /QG;'m1hڷ rAQqM4p9.܎E;Rhߎ. "! khij&];udg]?K LAA!x  Bi  B)  B)  B)  B)  B)  B)  B)  B)QP(-'  @JJǎCA?G !ǎCA?G   #?v  )&CAA"-AAR"-AAR"-AAR"-AAR"-AAR"-AAR"-AAR"-AAR"-AAR"-AAR"-AAR"-AAR"-AARRD+ L141# 4?Bd\`JJ ޗ^ ~%=*RUB(J/&^{ZŦ dIk,:!B!娈k/]f\6Cؕ\re*^4wb1;֕h  -aTz˳Z<2p_3 R^lEb۞sgF\#?]O&u١Oүpvv2"RPZ ܾE~Q²bE(뺍 ayL:TQ};Pj%i$s!C}NҬ41x+V̪]#0*zj%άS %*?{;[PgPPv̤<6k?IzxpAwҔiHJGTĝKpDސ7qxR&+ύ=i3·|$%|~ZɄZZȲVSBL*LdEAAȲXw0e,nbPR ^QZ1eխ Ej<ח3e$u$_ cփߺo: ^1|mܯ I8+I2mḺP~N0h J6@F 1{9c!|q޿Kcicm+XP3t969f;&8ziiݼ*COeꮺճ k+[2ʼ>',옄RQBsd吞Nn}޷%5*aҎ!aFfFwnB*UI= {ߣtqܪ2Utf3xrrZ7]7هGX5 U1kz8P˥жA kQwlɻ!/ń-pvL3ON3ީN5&&8NI%VuS0C~1 MX8RTv?(d\Suz1ǾB5\ۏfw/ޟ گ2ҴRN웋GMlܦs>}h?zTinw{Hu:L]Mp@~<j]'xӷ/bt;WjCZ c}T\]9ձqC;=K^8RޱeFm*9e^pi*/sq]2gܶHyMz~G.ʟy1xy$vq-*@7ȁ3 K7/s1>287(vin<ɖ}qT<\7(A{[*,rnlOfo궄08 f0e4:Ki8я ^Af7{Zk"{YՔ}o9-c;%q#=p/X=lr?sʼ/d7NM}t^>Gطd54Hoچ*hۊ}.p"+пt^+ypz.OrzyG6YJbn"PrW^4{FᩃюWZ.:56.Ռ$J ۗ˩^WϞm+"3i( E;wd-QvEt %mzyӜl0"g5 Cg|;XPmMi{szy?G}^ 9vTE '|_MϙW)ײ559KA#i?͏r< ݭ^"=n(ah]ዧ:~ƃ>6]ݕJh3<+e5E=K^eѳG *Z`[?s7^NgSt+f,Bc;#L*Ӱy-f>?̥%f87){ e8#[1clZ+l".6-c~x%34PQm0lE:'Ǎ9ʼn!ץwiO7*XYҫ/-x7pmA2:vfk>' 2G/U*<*1H:hSK˅|B䄙6ѨRYj6k#1鳅RdQkFF#k=,1rh3ǻCBȊuYcޯpKHjU;ȰRz?%p-_Ț(d2+I/f5}@C'Ueѣ8~JTn&͆ ax;!Cڵ&j"_"Wc~9l!w1]ռR% f?gORT/i͚XgA?s U;h~\ADH()QS钦6ڒBH&;$;t~!ŽJ<"SAPhjLp}lBG^zY}24H%W6bwjqfᎪ*^5򺐪H85Aa$ &t%7:Ɠ &:ʗ/b/e[n{eӉuL9R IZhi(JW˳ŔM4<΅4;ι80Nq!.W)+ꔁw&#TPiS˥R."B{109͝+v@GľTU>pz^םd??aD]c-UR-I oai$+O"xϞlXI+5g=O]fo9ɸ aDŽZFz(h{ym1Q\뉯So2.ev33?N IMMl6> `IӜ|G*H?\P\RPP*e^Pyy(`+ TJ$+SIz,!L^=Ag,kT@vfW *QmRof;EU]j.5P_$)_$Tv֛Sr,P0L9NPDElkhmCSpj"Πݬ9Nh{?veOk\ڽ\;Y6RIg6 `O9'+um{IC;Ɵ9F϶_nZ ?2r,UA7*~,!ɨixwmB*cF߱LdQPɊ~~EZnL)+8xq?c*jTwHJp>Ͼ)H8T2i`=GUvCU W8 qlBt  W^0XUVur@ZXUK\Ͷ}׸R궨UZ n^}Z(Ϫ=e"(; ִs"wW Kv#z2Y+GkCřc;9x: u/~߶T]"A‹6L^6R^}O/ZqPs`7n6ylYa;yRwQ=T <5O|%i$<./h4G?S̞a/II|Fșx' 3W}v%W1k7'2{Oib*/#B O@M_I^qk9c:.Eָx~25Ȼ,gx6HBƐ&|$fпSO^'Zj0;Qw˺0m_|^v/ںb܊^΅X2;/MÇ hڀN3c\IO/hZӑ*Yԁe b%s"f٭z1nIx|3@&O}X:#p/PC |Ϩk,=LTj(Sc;6E<{8 IDATժQ( i.?H[siި+#9qɾ 1ҴR&r|HXц}Xz~殮%RaoF\߮kluѣPdXn'Ӵ]s}>ۦц1Ш%u^Z[ %mhz)2D@k5#S:BA?#P*vgECm4F3#KTahYegl2FwiAÙ1e4d{)!IwKoI:G< d0؈=\ܾߍG"|$@>e*Ihk}SG}*=dt.DO>i.lG8'A(C+[4d'i TF',?-H-AAR`hb^Zw  "AA(%"AA(%"AA(%"AA(%"AA(%"AA(%"AA(%E~2WJ#AAO^u|^Ӧ]V,aaa>| :v숡?  yOz033MJ``GHA>D9"AA(O6Ѻ{.Ϟ=bcc?BD  EI&ZRr|?BT  E%Z)))P(\&$$HAx>D+(((!bbb"AA(O* " Ӊ"AA(O&JNN& B-R(u)#Ӥo( X:wvْT8:=N31䜕Vbcuſ^[@((׋>?ϯzҼ-:XVC8T xň/_DPfi\$ IcJE,8ȽLOWB,n=:- %IܹCBBB?s{oa`%<-N&kSᝓ4F*F9Gcf.Ǟ@W&ȊIrRD6*bTmaoJ-J)߷˅br;mB]Y{k+dTe尴,-w>SMAIh|"wƍR&;%y؎.;ТYv~w'N&wPj-Ystf'T2G_Scz]z*x}F:6Ǡ "~iE 9<'6Mw?͆q$=`As]n35l|]up5}a+Pw\Fc_u/3{z$}kW!e%X01NXVǣNĩPESۉoSy&?>:RfϣKN#e֞Ɣ})GG`k7M?]/?k>o*kժ&Fzwäd}~Q0t+cq|7i 'Z\rHsB,<AQ'zk"01Ya'klkZ=ښg}.R( ql$oĠlBb(cI;ǔjr@CٖG :X ゖ2*2n΢V~ ^ Akee9t>c0<8I^ ^JfSUw66iٖC鷸jKvr12;/l ¿z'Q, |>ݻlݺ/,S&6H\i@>}Fs}`P((Jup1̫Fŋ+'k ڱ*2{$Z)O00')&~wwbS(0p3(yk|c<'~*IkIvr8N<컃WQ2d*[X7:* !NwJZ:hKm ¿'ZEyWjj*.]*ֺժUΗϒl177Dzt.s|1BJ̳Fq{1, :zWQ$uj6qx*T udaeMļ|zu@vLCtIbjS"I ItV EvڕD>􈊊ѣ9;y$ϟ?'-nCx}TergA]zs2ASU_Zln ǹn3ǵ3 HIM$(ST|$:-XpcSŁws31R!|NnEGlCztzq˔pZy>>J\\\+8y'd]a$i6fΥ BCk,khS_[iͺr®vo~mNzjz\5Ы?~ տo_us]]LM ے7!r!M0Ҝ?#j38Oq5W:~J {Qj513 ]q,5}{u3̻x>┩53ǩlo0.1RA?GTqё^+i1ccc9t!3 4ڵD̢.@ ,չJBT1ҩRꜻtOa _s)&%wס͛7/TT kk|+wKD9:"TD|&,AQ3{MMMUׯ_/pYLDGGOxxxK2wK'(ٹ=z.  |"JtfoVdaaQiii߿$hӦ u֥lWs믿HO/ꓞ Ĥ9{[p=; ,ASRd2<<<طo_ضmRV-ܹCZZ;/VSS[[[ެgbbb3u~Ut&s!qCAr(ѡCOBBB*JBBB sWWWW\.GTT*+Vebb[sAA>T=}QOO(9]tk׮HXXE.C&ajjJ6m O  R}̵M4f͚DFFr=RST--li^`Ȗ8[gǐ_m%YKcW}NB&J"~iE 9<'6M"@C|N7V~, ঍Dzoz[~߷8tcsSV.$ick^/2rHOe[OcKAה#ɦ6/SϸNn؛kD٧xgkժ&Fzwädmb FUySrƕZ|mH^^uY6BAtqHlthi!V0H~Q:|S: TQS;?ֻ|ƱzQZX:6f_wKiZU%Z\||#E2?agYT_Uqݔٺ+WÈ_m"X\NuɃ{Q޴y{rٛٝQm|_Gi)F>ѻxÄPJ-ъ)a ]& ͓I&hNU3} mh߬2F~oǸhjkUcƏ$qNΠ"y Ʀ+Y.>S-Tvv9~^m04V˖0*^+,QW4m+YV#+Jeǁ2tjFR:V*ׅ䠛eB_Yђk&Ӣb9l=j^l/^ aփAQƖڽ2A ˫DUSC,>gYz8uBYW/^rIsO}Ŝ6m&м]C9S}0TtjF^ʖ[kTiJW;41tꃗ; w@R &Vʵuʡgl{FjOe^c˸O!u3#p9{UQX9Kc Fja3vuld vcNyA1:͡ =WN*2bfs~#=ʻfb=N8]68ȕ,W TﱀG[sa_:tWJ5;2}x\YˆY 0߃ v8h2Ѵnsu@e%O'/gLc2U `WU{g`TrKߟ1HswD,̶ֺ1zhXѷ=c:W5&vaZ_G¾\mH!E*=4ܹ jRKnݺUZE*###ϻE!I@n **$$ )[צݘe Mz}^⛪eQSSCMM nKN 1USBy\ qE7,ޙly7`3\JoDDƐ{RA kIvr8N<컃W5 -m-HO#n\ L&qC<2z{"i9kQGH{P![ S HZ:hKvxz: cӧtO>j$n !usNdx'TXߔI/%J_LlէNYu:ILQf’8uaJM$>!μsJ̆ƍx|g:< &R\ s!RyރNs$2~T֍r%rػ(+齐F 5 IDATHoҋ], *b(* "HI@ Rn.߼_ffgEoօl"x}ЍZpbYxRjQuhvK>+kVj-ܡ.rERlzR)3f2WaUC`Pٳ?9nт@_|`̥@wx3[vJ3*3l"x¨ݹ9MF7mH׵Z L&S kڮ]j.1቏ WTR P@3+kkm \\pv7f,% Ҷ3qkXi`kKQgPB|q[ޝGİl63Y܇meZDIk( (U*+BV((DU9]Kι92`B۽ȦLc9V+VMC-Ȣ۳ů9 {K5VݻwWi;NGݩW^ *a=Aw8g LOr!m5S9=ϒ⃷3߁?J'2s3HصG ܓ2]go+y6/)xSi=/ |ċ?tܜTòCfPBa3X?;!p ްcH`mKFrcѤ3q,⊋ ֟!1*TϘ:KxM +i3_Nxup?2G7RH3'mDFTqaqnՕ:A+_҄Tf=Vs~X0B fZ^=Qb&;NbYL~]7a@y$] rL8)f|J.ArA*mD2>|2~E)'0~w4G>wے8Ūymks&߉\;;2elI2v5+vVS \+o%z0ۃcnc;t)}Ȫid%b.nLƬ4<4,x>J#wѴ0gM%^}d:IU4'α|^Y9da/?bmٻt>e_yY[82+:BW/YǑ.F#H.&j~kYǞ}*ɋ'1rJQL&/^v:]EHHȕM:׀!1Aߌ<;śkoݶ}?7>^O8"i?~ۖHi]%7ow Xm՜C=:\܊}:o>lI=KGf 8y8p1mJQ0cJ7vG:41F2y~EGw!%#x;|'[}-0ozW xs[8ۦ.x:4 M&L̰H2՟ į_pkV aD,]Maߙqq!Dt`ܯپ$LbШ^jdƕgS]榧grA'JsbMOG4Qt/7[p[)c/| wʏ;r4 a;xϽ$ Xŏ/fDv摥LY'b*q\~3t@h[,5ū)!.ݵܞWοrpCs<*9I]ئ7>{frZ{܏ nO_1u>dLuz/[G.z"HԪYߟd GR+(W3BόA`޼z+-J9ey?oIӛ^@at, a|/cߨh6k0ُ)a?86u} j>OL{ W42O`$d%UGn/n-SϜ9âE*^'((-ZZիF8ڶm[mڣ]AQvV^7Lg6PݩBT+ pp}JgmW12Ƈ[sg-U< zx{{ӲeKBBBXGbbb !]m)c}TY%1g1.p(nPK8yTbl9IYWuN wwwh޼9eCɀX`A;Kא?wRI$Izꊟ͚5ǧRxzz2h Ν;k1RM65e䌆reI$VZ۷Ã,7nU+ݝ6mڠ9x5| u6$麢k6:$UBZhЪU+"##Yd $I$IO)xj/Æ Yf:+$I$IOZӡC\\B$I${-5%ҿ"##=qqq6c$I$I +( Vm/Hn_2I$Ikt($I$IW<В$I$I^@K$I$\iX,k I$I]_$I$][m%.FI$I M;7gt5 Wr  z{?W$_ϧGҽe>>6nˀ:Y sqR׮ ]ShޗJۡ(szZW)$It@L:?8 $8ƙ|0E֝J !8V-޻?:;>fH|x&;_?[W3ÇhG&yN5i̚ՠea_1gG:@\n W$It=fW=xEܵ$_:yFEkJ6nD?v7 nN~5S?O#Cu6$I$隑5Zd6[xQ Y̨N^x:ٞg,oӇAVy V`T{u"[33gnfOAxF_8fH總%ҚwBL7ޡ:5Vi dx{4^my}jA'Z3_8cϓi9֥͔ jY8f:5'6^a9{̫y$.)m1Ø… I$I׳Rkgk.D)sȷ!PQU Y h4V@ECC *F{7&گ9qA1(ɻtd 鏒0mVAɸ2~@/ts0s :EWJ`OϮ$!;֯Ԇ[S|ޫfΏ$I$zmeulЬIi5[dPP=7璕C,;u\`ŨsFޏ }y-0e󖗈}h+ڄɶ^bjT:'‰n[' oӃi"ski|/ק|2O<̍熾i0xnka)X'ly m>=#xEIX(FnϤF-$I$]_jP4߱z2A(C==ѡ t}}s=PAAmޖP@H=w{I$NW:?YJ'̞L$I[h9wARN-P:lA@[lb EbߖLl CCAE|yNe~#u3h Bh([W?:4[+ ~ZcKٛQQmiDaJ9sIhXBi*D.ۼk` Ίl%/7̵, Z^.|M0{hR{j}z4}'{LYM/Mꐰ~=նԳV[ױإb޿M=>X$I5he}d=ywc"4ưV4򭋳X)rlJ9ݩ;YvONea4=w5 R"ud_8?\;• ;+*Y)]#/^ F3bD_:}IwU}wLSyYzp>nqʤ`Aze1{Mƽ:yfSmO Q {ͧw;`Y-9פL8swcႫs7"/p WD$I5t=G2R(O^)3ZuP4F7 :zE_A1Ǩ7 =y+tABdžUw&8$mo*Cf!EA3|0D6ȨW{  2k#=1v0v*k-.rjǣ'ept3UΥmRltΌ/OQGz!t쿰 5V^I$Ihb PܣkIʮZ࣪*[w|v VzYDl@k:]y$[LI$I g3gecPS5{eZ p\NgCSU6$V#vT4>_Y-(0A:EG֬=6<M(>GL@MZ$I$t5V  sUtِJgM8e I?[=iilKكBEX{v#\ i!Qm !ȶ\$I$IVc5ZBQ8x4, z#:3TON#n/X5 h*;J$I$\"n碎 j\}n3 :#a_}Wx?~Q7쏢vetat˚) N[SE$I$I*SVcui@  Dԡp20q'6ŬZGQ*5LVA݊iY5>GӬhN#=+I$IT밡OmuɧIɴ5!bkET ×(@tRhBnt#گNq~c 'V:A5QTI$IrhLc[p-ɶXv2 4ö>aIyhVMCCy@KjJO? c\,vS/$y1bVzi27}>Gb:&O@~G+au5+{+#a ?ƻjkD?NؚwP0R*@b:y/^aF^=Dz)gpPso ޺5ZdFbvmb ,={k%$p~6y懙\yvxvk}f>0<7U$5vԋiHHH|>΃eHHH{_f]ZG=ß?~nśٴ[^)SPQo`>|5 *kS/Yx͇Pf^K?#qQ:;~j[ pע}x!44JVA6OoPQ,y9A1~_]+X Ah=}o-` -u%uL|h9E0s:&#c; +ؕq$˟Xif?Nw#_n_Wy'sq͟а0"huq0Z{Ͱ9EwXߚ$ |C#I,V4sGPB- 0#FݨwybNo:o;]wކw7in nx= Y9%IO(Y&>CۘZBc*0>,^]yoJ۱v,gꎿx߾;1u;1uL>gټW:fxoL9=P,֩bYnǦ}Xe]ζmtn\L1DtD(*g>E`#iM`2:ܻ$Ӻ~Gʙ-t#l?s橁qDz՞[ZIrFZ><NīCL5=㱶Cg3/<^&3g "|݁AO ]Sh5YUQ֘r8SԺ>>7_ jCX(^C:!/3y;9k&b_dĄzUvw~F_`Dz_5C V`T[ƾ :6"=xτ>A-}q喽cVH-cM`K(O7_>į.%Pk˳<Ȣ IDAT=m>h}1 +> eZ5A(?_~܋VGpL u'=YvF33eoRC,|2ˋFR3l{ʉ`?[dƲpWkؽ *g~.'} ^eS72tS=hA|n (jE9j0c0Vv)y+,s-A1gŏb9!n|^eSu ۘYS-G#lܷ)_y3G2MLSQ_y.;S{{! `ڢm37|C/'xm䓞Lrr"'ggqĝ!SJd9{|'kkXCtGѫg=]qt_?}X|@wYu'''>TԧxB7Fdd̷[8yl<;}ʶ|@֔ͣ rTn53oor@YYי;umJ$V-giACN9@]ݽh*|Ms[`e hBFp\ Uiӯa*Un1ҵ{4:} }{rF+݃qtipCtၮ؟ƅn}? }=ɊߖVf#Mfy{C#qef6~{NIhZ )=Ywew3}C"0Z%>9GOxm#8 :55>Ʈt9YvԞ]QB2zXGPYe#X0O _2&>ݎa fvNt/ûY)Ǐ"&c{+Be/U,u]}z66 B mܛ"gNYxm/Fۓg&S/.Pf"3o 88q xvMZgAԋ繈?U7m}hj?g~nAzty` ]>Rjצ!e,?c|p|w<0_}(|ys÷0R< 7w'~4]7e2%d!IT3j-pU1OlK|`C:G; @ ZaP|kĥ`0rӻ3ON4Oo,' ˱JDF@~=Ж/b6 nCCˊ+NSJg=zޅl"&{!+˃C/HȁmۆҮXvt#Whֵ^aa̱3S3>0Ű6? ;DžޣYdg݈4MnD9T@kܾ#\qf *BecVeW7W(ȧ׆ ~H|bMqx=4 ՜#y3f%=ļoҸVF VfcnF3Vµi9j+np!)tIPiު9qJvɒ$z"=j9~ԼlV,V :hmXf[.+:\F\}i΀5pS{tb J]αchsG,y'NkhWqqu6>IJzqg}ۗy(PRj_Z bZ3rx3~O]}^}G%rQ}[a ,ڰFÉq!n"Ɯǘُ7 Q5u—&uHXj[ٿsc1<]Cx^9<տ6j.[pULn-|$~W[M}3L~=lp2*ر[YZ\$Ir[:%}+"qcȥ&ޯ&}\C)\\qd3ڵQ>Sٶd=#1a?.ϞyLdu.B/>=G9g=?{'=H|WkS 㣏ݶd2Njx^ڜ wˆJI: Qe!]$ǔĖ'2eY]=ܷ钮͒Ҕ$I !|{299~ zf%gOU,}x6M~38畿s18>=<_Q+Ͽ 'mNK*{frZ{܏ nO_1u+~1c9)Izʥ[‡>h%ײ !اYl2?N`b}@ʐl ~5֤WCes_\E jFcoiQԫRg hg<_&wyq_THF~uw yӽ-晙qrRUM)oIrMwfnnv$Ioo׶-Z0eIdI$I19tii~ /DI$IN@K4R_>CY?;$I$U LPg|\|H$IR}$I$Ij $I$Ijuhi~[$I$F]Vy(I$ITU 7uCe@*VՂTZmiɤ gxjMgM|Ukf&B'3I$Il4MC;1u(Vs mV{3fǡOh*!,f r54EftjVt$I$I\Hv$ 6K[yA _t ] W!K$I$IjOGK*\UO:Mo@Stا^P|S:2H$I$h a\) V74!X.-r\bG39T=s%$/I$ITuٚ ^(N "Yk*ywI$IJ5ZdiR RaH\X쵢44{WuJK$IT-> ;6) kJA.ed{!Ȓ1$I$I6nRi @EkB Qɢ:\^59Ջbv 35Jzf.ᛃ9dU { srE952 31$ʃz ,|?-TO$I]@KDaUɺ.Dk`z13e)0gR+٫7]rmU"35£#+9X}%I$I ~%u'S`IC@틋d]] hGCS- H 8~Y>DSZk,\o|ߞsljVlk$It-'',F /2Rj>YAUe@ӵGsZOq [B+|י݊g&>0 0ҮU=C y^91rpS h\Vm'^J$I^U3k,V+lUs^BA2|?QPiy"6'gu 1oU𚪒g%p95 Eyz2k7m,鼙:SBoN|qJȾK˵|{/B_:JHJYà-BcB0?ok·xl[.%/I$IRMᅦϩf]񀩴i;./k=;b1+YI6m|CʮcX¼3 b<;j Y-N?+?7=G\B#4%I$I*] hi|}]t;¦ ȵ粬>/",Qt &?e9Xm/l;,=4Դ< b݉6o[,\irzO>TN>Sve$I$՚jh UCg-fUJMVIEi_^+TB،i8ezr-jb)mÈOgCgtͪR id _]IeY'cMŕ~Bis?dН. EGpHhB4N K$IjUkV4kT2rXiuӸv:[4cPd)#CY!.cK'Ipz!y >Ք&X}U/d£CC̜8{) S_AO̸ 奶;idغ8\$%I$I hiI`-<{蹒oZ5Y%YڕK X}qrx2L14N0h3ctaE'_y9MVI$IȜо] o\MV{5MkJi.J 4Lp/jpɄ,`*ّwM3Y+,I$I]VkjVR-UmCM7z"!tX @In㙑NI:Ιj$I$I}Co.txBͅ TBsP\>j=-ˇyO~ؒ$I$IEhiU6Q.h:Plw K} ?/zBvZ˃by 5#ǾM$I$Wٛ*wX%y9"40xst %̍xrҙ vɠi8g -^ VVU΀$I$IQ@Ks `FuDsvY_@Ok_UQCx\1\c`UB> d%I$IR~8ZPjw슻>oW BuXNT-Ⱥ6u*TJ$I$UT44d9<и)b ='+%*CJ\Rcq.@K$IQ@Kq[8kBAs&lAPAVk !ׯĬ^N͍=pOX9fbdf#cSE@k>(㬮(U<7~v[Dˢv3wlu]sx2_lMtקp灛a7oZ?T~AnG'<8[Iק$ICVqT=V+gMH4LAU*\t4w wh]<;{O'繞~Zi*0=uNGԹ0]k`-_Ο0旃<"Q<C=-껑s /= H `r+7o,ItT`_A+c |M4dKAEU؟veyhΣ ,͸ykK="է{\'\T)*cD$3i޲1]d܂Rײ.w5 Y&yݐf&Ak7| sY$_6ʠuT <U$o_ata w%@ż'Ԑ:;g&>02DdeX9g̨zzLJ1,-^`d򦁗''tNX!iC^L<jI@)^sU5~yX*(ħ7yja~-qad&t<@RH> Ɣ8Oz!Ē܊6-CgdY&[Pmjlg%ܕ`لdIH&px9+yda[$Iʪ 98:zڕAPkqܶ KrN,MmE+C+qCh[ʶ<2hNԱS<*_#xkN+yd*. рL;i?Hf J=C[s^蹡kC0?sLsa`zLn_5d΍x* WdCF`3j 4NF֭= fg0uIvdx⒥qa/S{eR:K];+]OO. x?/N`G~MOKg}?qpn=x/\\;37xbw/r!gѾGwL'mi$KglLUOyNzyI|ŴL_,UK\vsB+oEjxSI{8Q)pV(4ۻC3@¾B@"Vl]V*Zjb7X2;IDATo.uUz]ֶ.VT76T-5!dd2sGB!I̛~|y s;g"}޳LQ@uA+?K(I jJ i6EǨl+sJUh2moRJ* Gn|q M,ܧ?ܭ}! |~uUUu@U-+բt9(ZolKi)Z3:Roᘠ ]1HfH 4 CO\wDD*|FQZZ8Lu'9G-*)>)^c4_Or4wWnu kMxiFo%z}O2GzYvIrwCP]^ڽD;HCq Yfj6P_;=:{dWZNˊj<@)!m_X *5n25ezkk~5TӲ )_fVk}iP11J_#?⊠$֚XM;8A-lK d+ˑJ252oSrf+'7cVj<1]7vvEZ<[Ꝝ |J?mWK=:U7WNd.2/S *F4驽$F_ǔ>9#t~h5Vf_&!A.($vXZ&ehX:!Th' UU=%S]rVZn :#S|E>-W+ZHSVn^ݷLl_cꀶmߧ;-\1= (bR?]{(%WiJ} `?QJl U(L=~uj|W@ i~UdNvѓ7MW\v躳OԩzsAb_?tTYśJo|+ҥ9zm@vͬ h U7씫-K tav)'jqć<{>nUխ}PZ\r i'[,]5Dm_+{ey j].[w$D(2R=^%ɣ8 Q8eI0+,_Rwm'Ez|GLuR2pa;#jq7PQ8c2bJt2HF+.቎PӞVm.tڤ+ON՚>Uv]vuƴ>W9p{U/@Tfj~hnpytOR.=<1^R~7"*=US}Z;}9{:}Fa0`?$(>E_! EQjV~hLq6wqͣaɊڽKHu@Ns9Bd5ʩހ&'mשOY]kJ*+Kv0q/Xv08顕O!{4;݇'xokQr9ƨƍԲ0Bf@rw$Yf5"t u`F{7gTS蒳kw6255m(h" Q*bQ?%aB _ !ѦLmLWbd"E+9J=5vB\6UE]*WnMoTe0FH/͛$yR{FkWhI} `ۼN\G ુ$=+͝vGH2y]=JJZl!,!,!,!,i rrTQQ⢢1!W/%%$hAG\y[)B+s :idǶ{kTFn6ry@-'G z(ǔիVH2&E5W_>svKata^; eO(m/*//]7UoO1[n_>E߮-˘ű8}+weömJh/ömqڵ趌DlU+ju;B뵦\ChU;;tc0e!: g=s̕鿯9_Gd(%mFL:O7>vulukRs>sk_o*|QߧMD7~H/_{Vqݠv~FfLӣVvۃ-@e>Wnַ\~߿K!Y=jt:iڡ1K OPz;uw֙dmsʇu+thfvN{g-q/Y8sNyiVf &tкDl[@;a c5ghwяvS/ML_!ox Kɽi܅Л9u2ƨtJuztvIMi7j_ǿ?]كgu#Wڰ;,T%Oߠ>}Oꆆ_j8wqf:4f}E5?DUĿ_En%TJ]{NxBɊq7ڙZnEsufd늻yrg?uu˺׳Ts?Նoz_+;}SEZ{λL_'_K__NH *ktKA}%ں=2fn!-nFZtqZ˴6iNmqkbj<F nF_SBey:ẇ;Lh/c-TR)5]7]u6SnШ×r9ztƠJL;AOtHukϯ>(1qϼAwҬ/Iuk=p;fHqUQR`r0xP`chNdP]J_=ؕ́j_$u%% )6 C`f?[R}[j @!WSP jBI-7K95!J]KYL|GGӁa)6!QR\o TRDOu*R8q=e}}M/ۋ-@;!<1Ek}R72Os8G?|?YW=>\>{rtS3##y$٥ƤT^Vxm3gFy\3Z٠4dVlkv&h({4C>|wZXEYxc: h0zBZZn/iڏSFjpfOED/&6M~f$Q!U5V/ߠ@KZ1/f\7ef^wfl*ϻN֏ObunOWWt>Smڊt[Gi-bz`t]૚br'o=_<0KG!| -(X14dVqg]cg龻BKrydTLuʯ$w~#%+i"Uu΄V҇)kfꂫ?.mtK/ԣ3"lSu/Vo.y Ah1AhZ8ko~U_&OD\b@#:}o_-Ҁ Tc4O1Ɵ~IZWUI#;eOIYɺmZ/%-!%-_' `߹q_IENDB`mu-editor-1.0.2+dfsg/docs/icon_brief/mu-python.png000066400000000000000000001506331341747546300220610ustar00rootroot00000000000000PNG  IHDRXsBIT|dtEXtSoftwaregnome-screenshot> IDATxwx^Ie[{/_K R$jHBl1ƽ7vw;?Vu'zx΍fwo3Ccˀ B!B!Bխ:@+ ^3paQJYIB!B!B95hyo}Ɨ_*`n#ea6mQB!B!B]a`ir7r=44ضֺJ,B!B!BnZ7 ?餓̟?ZzРAlڴD"EB!B!B!D<Ç B!B!BH$!B!I$ B!5#7e/6lxI0y9ͧ3Pu~l6iC<3ִW=f ;Ͻ^hyB!;Î9\SUpϯcKkߞt 'B!D&{ޜ_ˇϽGpx 쒗E7N"?.So_ꧯ9{ϗtQ My|Qo28pL:sSO 4R}?[ӿ+/.LYr3/ Rغ8Yp}Ԝ|7~ĂU;bSx6<6,[M̔SWD'jߣz.^{ #d|ŧ|r;{_]ȟ>qRBxv#Fq9;d^'kM׭䕇y+f0i\ySb[eTmD4V+B!l1,Y%W_{O?zV^QڷB!N81Ͼ7xZFr7<]~f1nȦ*o)mj~MV<2]Y?DB:Ē7fC>r)in'n⦗И1IWodMM>S=I&?u/Xݯ'X;P97r/{u/CrU\3T 7]ݳyw~A~y[h O-؂S9=0*Hqu !B!ڸ;1|k֮kkc -.fo B!=gr֤<8cay>Ǔ_Dx/ sMV aC=26j^nfbfk4~M۹Q+fXh]{\TvXt=ϹL[G ~61V:wiB!Į64 aF: ,lzXB!bؗ+Ky搣vY %Ȫζ P -ּ5X5s Ub/a(*{q9e(MY ljuXe55fߊ+{gN/a(vߗT'0Դ(-7uۧῩ{0< h k.#`B!_5/=j6n_ޘ־eFB!I(flG/Ʋ(<ͷT_V>irVETcWVk'|g2^1/=q WX nk&emĊN3Ǣj2Sb#v|m ck;<~r+_{XTˢ7fF'_}I=ur,]>h=rVuZOySEO^|C՛y{xhu1Q{"]ԪN/< sM9~" ,-}#<&ósG9ScCA __!BVZ ~M\YzuZB!b`[&dӷ4SdtGrz]ޙ.s>BD6}9/)1v`?sdUus6)P(_:7s/1Wņ!019 :*XPlVy ܳX܏2ɥ5;9VE=::6 Ͼ4%kvPfvAUV ?Molz^t c.N;mg8?R Q 7UZ[PR#} |0BpǸY6r -v$B!ĮJwjV㭛~1*^)K;x`9ǐM@AKܻeU /~3(Klه Ewغߎ:D$c*rmt_|fxkQ΃} W ո|HvʚB4`0+^0r|D(;Ҿ Pm9hV jL` E"?,D7;?_/!BTlXnloeI;??\mot=m ]+<(Gر%nNp<$&۝x~*\>)B!Ρw]UuQ-?h@{9XFG,Ծ' hY{Rw6!;egmۑBF>WQII &M2s6UJ5D@bN&#vjy!B!Zxᩙ v(㟜}9O4`T:D>'?ewjE4b'b1MhG:᭙:0ZC݅y:XY{A&HK7fW;@ۜHY{vT8ZkL]f 593{S@tD'A_;n @2|/ }:@ `%w61^~> EB!B20t*ðzSˉ'o7Uv=tin .$; [ed&fc'-Kg o(9sFi `E|Հ߃HeXYSeWۑ+촣'o?iG2j^[ʮōې `bۡ~S-FI6qοO3 rXQ`S\ǼkqEacFU(ftyg;ay)pU+Ԝ$cdvB!MFKcu.r܃ g? ޢ ^uPj@ݗI}7kHwm"aU<N Y:2ގ;P)|`;pᏱ{) Bwn; WN /:i I\h7NGFdMt֕ /MkhهN8˪Z~|ΎN-">ۄߤkU&:Wd ? hvG??7:L<5owo 89/N:AWP3j:h$:"g$fb -|Ƅo(റ?.f1nJعĶuvޟ)B!Į@1˦㩝~w0_<,x\9fjaNV4D ~'<-ߌΫ3"Rgl&FgjŽBf.>x7H#:<Ԑ%$ul4v@I)L/Ԛ`UCGPlLilGΨG;kE?%ޱ{ߴ^Vƺ?OSR:?4Qv; O!߅8wFv >A"Ka{r3 X `x^l'ev: O߆hKN'm3NP؎& '\p ӕú]Cqt?P?Ih|w܅5v47{o932=p(yB_4lbƒ'zB!bWj k.O/* :}nW:/8yH[I&4l#wK' c{/=Cr-nC+= vr@Knw$ȍN Ol٥waDWf߅j ]z(wFA*tL) 4=2_]kmt:g^~YG>&P;@?Q Wc9#7뜗fOtj yG°+!8w ^[r|I^VHw@ o68_̤ |~v/]gU,/3 @ӛ%i1S'o:uTK4!4FbY!|B!+,,nڑaגȢ)Q06(:-fVC~P܂o]N<0JqwV߀`퐽gfFuX!Ψpi2Ba /B=~َ@C}lGP"S'b&3թS:t*<əݘ4Qx# czL*6eAd"ZLU, ( FI[/B!BJ)S w:20a4oH3؁'xVw0aaU:jX 8 j>mH6fd);7L>X!nt:<6KnhrJ7py07 )4z3rF-4%eGF l2{JuZ {]zF{@كm0V(:{ M)/Hga$ }B"?Y;E"Xv/޺mWp7'޻™vraۀi>X3 @@jզvNߵ^:?; h~1٥ ^ySPgF"'Wc\FcbyGd(rB!b~ @)7A,v83f,YݴYF| UJ,xPFַ'kǝmߝT@}љ֒2ݜu=ZW:7+`lc@ b](t> m5ї[l6ck1ڇT˙N 6~gVX_^8?; xc_]r;jSkgDŽNٔig ;kEwN ,)L>)B!.-@@V+o0"q hz@aΈ:'Wi#{. l;`a}`ޒ'pFm'6%$HՎ c*(N E`CxB7j:y= Iw(n Ìo <8#w6kU8Z!]fwe_ȚЩ=\hȞ 6dD=εq&Pm0?1קA 3) %dFWo\JN첽ld(`Z%d܉o5F:nihbC wgqDU`@=J34B!;#9+oi(;e+<-iBxyw6c/K~A` `H)xmR`mSIQ:4xkv:4 ,<]tV 4RYroY -m~mn4IKO7*VqA챷9x=ȹ7Zި@hyȌo$P@lNuM+O.)cRJ80: [/YbDG7;18[?ԓrљ>i6(tOB!B|30t`tT|?tԍ󁡑ѿvڂ#dރ#|g|z!Rya h`R`,F )vob#Yet4b;-^)'7[NNV~krؽR-=ɪz#Efs>ЋRνiԯh|~gS=]vX5vO{B2s2fMJZdc5;q{3+<o Z;w'd?)=٣fV6#+B!=h׾KU~`hdG%m6ck׾=\)!ⱶqFWLJΖrr6it!fb{ڇvwF6'ŗ @#ŗK(L0t8C4/H9G{LlWRǹ=s*:'y3Yt*v_&FdIr}y ao/SJ9esS̀YڛۍsO[8؍k'h'߰Aξc@GlaW6Nx .OrB!⛥ǁ]ehL;eV͕KڵmSaSaYI]GQrjG &\O/a"Ɩ4plMw I[3P 1NmFjwHw\#S6Qv]g9ҝ2{Uprf~Z:M3mS ~g :iB|ӮCn'y\a{Uz;iz#Egˠ Q:4 *: o%*z6t}loF}tB!bg@@9 Ճߠ!g{rwނaU~>]*;DɝwR deۙLH }=h͖ Ӝ'7WeŦ2׎vdU> Vo5BXߌ; Aު1ʴv~^Uik}x(ys ݙܫF]ܻ(soӟ~ (mޠ5'=ݶ5Kye9\9Ƨxh ;:)EJ~56OW3Ƨ8'yj,@'B!(`Xxjf'onHEZc6p[Nʝw}9yh]f\﷾3Б)?9j^IyՎVm2D4n%WVf7@;' Y\WZC:w/7OtLuH)wIuVaUy'ycUXo)Fd4 yʹvz \uQ{;=.M]fVCPǺdkͲwSլT:ޞz3, 3i|կb5. Z,wM*W%k&OmAQOR|w?7GO72T7:ޢΌGx=y nl`lPAA8l3ܠ{kӝ@p[7%)R3EZ^M5;Pcdzg 9Y>p鱌E)|!T_83IkhoݱvkeRgnvZsL  D2DkXً9f1\u^   `ݍ+yߦ'A޾Owؤ^O !BS'ߒ`]o7͍ƙ:O^ی'ڳܫ޺Z=Pt~[rm7i@nkͿ^[co~րC 0 gVvَzK3޺QvmIaX)Rx[ew£o,&T4$ʄA!].ApajicilVp[_PQq Xfz`[jk?ok`sL֚u*oGbSyAp;*CE\z+|{rn7c}7]z! y9)( sÃXz;'g?ƾ֧=)B!ΪہoCFҦnn?nصx­"ϙ_mj КekG_Σ3\&ۀ'Gv:FB{Z;jI0 EiU)߽Ef|68șb\Tg}-{~{VlYå,Yý`牯G6$o?.H?Y9+xZ~lн`s/k^2OZvkܔFGc nC/%r%G%;eW(༣p?T{ӷ\4/kpukbG_ڔC; OoŌ,m/j 93Ҥɷ˜uѮrf\έO~4{ %";`#z0ɚp=.|p.k+7wSiU31=~vlK,O !B^j Y-g/\Swi~18s/U(U܂.Z3MȻ} *< ?JæB,$߽{v֮MYbEmuye .;u_4 t42]XH?i*f2{Y͛Jj}{+m#`5-ـiC8 ,ҴPqaNJOId;Ŷ6m -.7[whYz;w>D^ഃ'7…S|<[Qy`i-DhsY-uwn R&ж3{R|b ,INHt:^ldOG  Eb||sӶH`ƶoorOOep~vj}R!BXJ6Tը܃]8ߩCb&ayGuq_lyùC~,\<F6x# t16h6~Jz6r-Ņ9vqL_3\:G|-O^fT{An8cܦE"1XS,å>WY[-OL#'˗WkryL\+{6­OGu(9`GOfȁMKkx5Z^]8x{vʦF"@߆h0(O˲9yؤQ,aaGZÔqC2%#YF# ˛ZjoUZ 8508;){c:mq`O{,1y R8.=uRኤz'l_΢|gnKX6ӟhԝ \Q^ih1u ~\B}R!BY~{cQe.xõN~%g_lIÈxbk`Hu6(Ȳ5 O3I"`Dc:l^&Q,nQOިF% .%hG[N4P&d>{hXP}|總U^@?~]S']Zl36ϗ?*cIeg,ל2:GCQ}6m(]~ɔqC{30/Eiu!{O0ݙ9O|ʋ/#8Љ{G6~( ra{5 Wnm1+MXӹ>N{4N: 7;2)N'RM8JyM$G)1f-i^^8r7q [^UJ3\SQZyAnh~2զIVp1|luOks#)y a=O(%;MǪi(:^27n`#6mJO8/z1∽GnC`3kIA|'M9?%[eLw<&4ߔ T]$_^IB5#O)Ț褿 7p-[Jg22yW{p~Kݓ*yMk1^k=a<_ 9;}̜הR3+: /ϔgB1|A47w>6yc*n>ء.n\3n"yLn \ظ:} /"nh(GЕ+煹sSK7lC(۰m%y Yu(GO|sϕ΂?ۛl.9#Ek 0ax!wKx32fQUyx3jH^'NW5x}鏪ux(hm4 `Ǟcqxu~s fɚDR_t yxe߰o*!T''eb; H&#2ۑhkP%gg:닟EkoO}HIUQX"x~v5+uJRIH4 V̅U)hx]CN]@G~η IDAT7s>l^xUR>'ǵҀ ?9)i>]eZ-&B!N[OʪL#/j;%= P1I[~Rj3=rpΓ0 992vژ|d wϸ=C ~ɌoC)en$-խT9qA6gqԔ|)L=&Mvb t=npM#-f[E[kiVքl-54el-!xWrޓk*krXژbSyR:Pؔ:bPf}}鎪u\̞<*j"mi5+,,2`k \զ|He0qf@GAni;YaɚU|T3%:}-nIoR-i%|Wf<^ejk1S2y whth+i{gܺOք̜k$cSxRi#/jڶ۫#o1!B!v^ Vi,LW.48;3ߩ - o)ݬ#7Q{F׫OᚿVS;2t`ApuH46 mf}y_mԃ&cpAN33$wj:fwb1kr9QUWt&6p4ف\pN A{ K 7 17oKY5 &(֚}-r7?n)kccԠ@@Yuh,~ kS_ʹF@M(Jm$yPJt^xoY3u|1Dgk'v 6=y)-[h[1ͤ,-9e4xSʪü`5?qJ P8)IZnjSB{M>v6]:NR\,Am﷿`G+[>i\ 7+:3~FCbU&]gwLY{߻8v1IpLo1!B!v.I[u"xRXkgi޽0qFk7SV7ءNڿƒ /+OfApuw)Lyx=&^x(fw:rlw.svhnӿM)2hRҶI / m̅k>zwշꞴ;VYU(E@1h "cc ȀI9H! Er^I7lAslLwuͭ{o߱qgﲲ=g}ev6y7@jrk:sd @ 4;ޖo_m <VC4]uufײQ;h"N bzAV s&u,x%GM( dA<=#QyӬLJ&m:n8ɑgA qml=vgnGQ,^Xi9XO-D x靗e8u`n`*Tp )CuL 7Q|~#B^{wFnBӒ5[}b)IMk:4HMvvC^u<0sɮ8dc2HV 99Wn:)IJ+jذ`syT~}Ǭܴ}]2‚I{0"v'nWA ˞~dJq&`HLSb[q$$K$ BǍ-̺AqZ'퍤} S*'?Om)7%Zab BP( E#,trtQ7f/6 8EIMn 4wGu?hG4fˎ*mf+pcg/fQ#E;G'A/;j٩nM)Iv9vL_.?q,=sд(mFM #\gnZ[7Vfkn9if4::=sҬٯ{vi-BaG 앍&DPeɧ+ѷ[FKrl@,t=Nx_Hi͑$@g%XN8#6}bKc-uDD4 ~&egT|}ob΄監FpKn~.MΙ>R 0ٶwd^2M!F2>R>֞-JnS |~vXv/&;HJ.4[,QF)%;xQRQr, -P( BPt- `4x [\w]z,+qӋ}5d=z$47GoCujeM뤞GaGw'?aYu7I j6z + @ooyrҒݥ1oEeG!;7L0+ʋGzqQ. Djt kO)#z3qHO\ ZW<Q_{vz r \yʸO?AeF$X<{&Ynl(>S nV¥ŶH;_mdoIhՉC{6qFE'`{t Ɲ ;68竷3~Oݥ5='Y1B`o?a1s\>]vj4!8a2R\?Kص /|a}+d-bݖb~_<.0ނ1>c_,;/ҖjgK { w:>M;пZxx]1 {DB~) BP(]'osώ. Qk>.-"yb룶(jrF)k}Ků{/AL^tz8/2ɏr6be`licŻn(„1Lݷ>>CDiO)s&D躆$U DSjOţҒL?g?\Ul z n>pJ9zyC6 %?>.q&soFt&E_x/)aL/=~FIEhйb|ݷowm/rgԑ}(Jxe-Bp,m _[_njX/6o&Q{ ´XIGoX2@5ᗿ фk1mXb.ML S&^d~>lw{_y3FD;0xm!ǒ]v͋| -P( BPta 4~5ʭ@{:MnhFT->_gVdo.= r`)ݲRHrٲ|ڤhd&1?ȳR1aG/~7G?hz(ݹ{H׌k v2y$ڿ4m9i?cO@j#zۆYƑ 4 F9W}n'RRxw>mD5GL6k%;mG W9m/ꆠ{_a3&T+6eDo^L.{Uq듟4;~B¬Iq?SF ;BֵSgM<{dr̨>|u_=>| ZU* Kj]+?G la T0,fdN8۟ZȒye:Ν>n7f`=,[{8TAiy)=apOq-da9do`V#Nyu|sS\ yt[~HjZՅ0jŐb$P̠sBgxyaә6/ϼخ弲x?&sձpVVm 9Wt BP( EW&@l95{ p룦Z͊뭭"|'}D1ݳS/=ϒ.)U[ς۸z2gXBiYv}~7*j57o@9 itǿ釪5׵e 6VR^)K4awI0RL)u~ 5m|dc꿂.5=&%lU'e8: e^d d 5IMc-V>&kW2<ٶW<&ż4Ig&&DZ' ;-Jm` UsEF>>D#qv옾^ӟ^_`у[dfq }!\wdΤ Mw9 [@ 4UFŋK&+-)0> n'-M(vCT~眔H{>5 !8Ap-t"'Y տ[DQ\΃/}RpXgIBP( +V (%\YڄA6\4dK"qF(l_/9[j~Lړ9iM*=|v'm;͢!HT 9d:b vUTff_Kv9޲zc0O.//^Wp1Qk P]o!)vSkH)q9lL[eǏw~zul408ypbΥǏ<:}Nz2v~D<>PrXOFfk1ڪC~dL+c- ~SjWZ*Zucr5W2XsSk␝O-o.gd|zb4f͖bj^ʋax<'1֤F@5<%Y;93*oݦ󫳎d VlʸѤëGa $w\<-zMr)9%[#:aJxkyB$vnƧS$ f5h /}PAc ìuw^:?9zG΋1eD5[ϏGń="nuRP( Bʄ0lH{.#Z5:Do]Ә3(s-<DXϦkzTq}77ɖYm?~Cj6fǹتpÚ+"s8 !5?^yKb_#4_ DžkYkZ- 3rs^iGmX= iNb\#6/ingRJ|;KǫYV?*K-=IXmD| 2) M<qII3eDoJe/$;;\Rt /A 1O]1f T,ѵ 2R\]+s=Ixs#rQg4RRRQ+'kLNKLn,&pT( BP(2v8*XJ]}Դvƻ˺ +k:z&8p#9nR Ê{%Iɥ=mH5K@O;\+dtQ7Vo.1QkZ:{ GDC :IQl.;a SGig\1*І3baNk@Hqqfkxyڈn5ސ"k}?Ivz8?i,NA4 Yse+#> Θ6L7sæQYӰӫ'rץ2uT4,<(&H>G] ,'v:Hyjps3YJͻK{b2F3wyntM˖=RƝ%R"%Lғ:2Uk{  $Es-bpfhIQ_/ r~>[EnexĢqFddsY%l8 Q:XM`n~\[d[$RK%rt<MNExw1QEtJAeլ޲o領nXsPXxL:P( BPta~2LQfFd(y_F%;hvSە% r R $QA ؋FÍg{brg_ľ*N PI!C76jGnW|*=%!>f|I\3F;j siC|.b ;g䔣r'ԘI}C qaKO }xewVߛ(S#6드vn8s23+mHf\0s//^?\DXy7<>]5Hq/.]UcFada>p%o娜v {S0L~6:2B .k- "<S6}4W*QM$\qXf-d+|vUpVRJl68L[XiWCbI7MhZ BR܃q˟L`|z;=+8T N4r̞ПO;e|<_Z%T,ߞ$}=HC_P@L?OTt6>]-s%;|QL7 _' BP(J؁iIyg-e27L,5;B9,N!^":?=X+㺘Ѱv>Fy'|;Kش$ @WZ#A OX {غƃ;zHxoPr7T;lbN:ӧ [fJ*e0@Bw9] xVLdلiy\uj *WfӮ5>4!IOGdd%Y-i~gڭxYMDi.I8|[~6k<.SZm'9wn_J()!`%;ja IDATݘ27eb5/XV#;/ޒJ~-{J)0MR\z1Ob@,ANZWa|u`o!a]ԍE0MIy/>Y?&6i׎8O)m&W.Jށwﱸ %~sd5I= !0xgۺ?sK7LanG BP( HORKƛ2W3 gŵQ.;w_9 xӑ" /k$ 9m~^6^Za8Y{E !xRfEܦXw^:.ɎZ'O: lE Uh`@,zs雟}&g,lY5kTħZ2i8KƺkzJ;X"z1wzDKiJ (j\90 AIVOLdL)]An'̐><B䅪<~n'5w'톃o~ pMӻ%8i5M='S )c>_XH /YR_ξ" E-4M"#%o| 7X CXr{O"P/6&]'bpxiZ^d v&FɩSsѤcTjuRP( BDK;4wπ4mj_ߡ4u" oPI#Gapʔ8:&ϦkX@nad~|CGb{9A(;_<Мf {XM<~\ 2;&`z`n:KRכvlcT'ና5 ڴW? C)g{X;Jޏ2O.]53o 5 cۛ:og3͋vv$x67CZuq3[y|gkY+! (dԣ uq̑p}Lݗ$96]Sa=)trބ؃N* BP(]Ûz&8^o8/2z^L#MuAf`(U߂g7yS$^DPڶ澿r v^xNUZ+SvnU!Kmb:u{B.Gۉ'BP( BՈ8ǯ83{7^J!hd]{aͥȐ9<듹c'hҰ֪!M砸ZswŪU`96$o9Z"""S< ؀T.e;WiZA/Cwٻ8-YuZ' BP(FOBis1ۭf kջ=(ězb۔H&$2jܑHi0Jda%ņDÓ~:TShe;];.7<@0z2DW + }AXXt1kqKoڹ [w|? I5Vﰹ_A~V '5 Cz`[X֨F&ҸL_;wRJ[ T4 oʬ7[ش H7KA7P<sV`ӡr.! ¨jT( BP(~\DJd$so@jI//u KBK-_a>>|7}@~olM7QrLEMDGeGahTZRhcǖ!*/'ٹ x> nlzec6Ad4*Qnͩ- fZL |Q-6K U9ׂjÖDQgŨ-v;trAsЅƧxZ8Xa˭3*YfIKuRP( Bw|д 4'zPpFK?e ,BvlG7r|=X !0cNj!޹t|s*i˦Zht];zjjGUUU7m9@ @Xc&+=4 Č `矬J;s}w]\f 1 a6Ũo!u"ioX [n Lp~X`^5P'",{HT[[p ߀s7:II+Ve j4k1;WUBP( BqsG8͡/T>Hy겆Jc@L3/{q=4{:/-I>BKlT3-ѥHAQtN no?!,]᪕nnQ8AMf0nsevFK\6FX)? ZJ,qDwR¡Űy>-nw$XxjAxXҏ͙6MRŗy&5i6hlƃ=+6ŝϖd`pa:{A4*{sH*$VȖ߂`hj{.y!`두KuRP( B89'(hQ:>–;,ɔ $`'Q{3$ha$Q)"CG!yp>Himt񹧒.cGy(Z'6IcۭڝV@ i0ز:!%Ž?B`JpCWy1V Ɗ'O6ع*Zkuz6AZHogI1=\lU_:g (sd!>lBjTGާH؋j_P= %ToU!퐀?uٿ JE I[s[;M=5 {҆BX~i3G4}Tߎ1(qWBP( BqX{ @'`~ksH*GA?J^`&*o>RKNh3L= UF K~Jmiw|rΆ7"HQGU΍oKgvbVϷ*wgö"C`8#4zPYc ?﷊ @O|a(@Xl]hmA%貅MR>8%)Sι>1{[Β7gT؋GD;϶ ÚZ6v惘BXcP e<&MKq݆jc,r?i4?bnW( BP( R8ۂqJ>% wKa`FITRۥ9;fPl2H&ieԖ.{N6ˆ\ [w,mHlxr'Hv(=Î PxQlN @8 $d[E"Kկɑ@;&a#V=^Ag*npK\;73X;UXW%X+E'C\$[nv 50,݆5}O<t\XACYRA@z+`bz8?iijļ۲Е.([s{âg[up ^5BzVm:y0{RY m^oj-֩yBP( kp#YRGu4}O*> FÞ.9`oz=lDHAUu1gE؍{mͼY7]c%*Ml}CɻVY\} !iCvb DiiӀC$$ǡ X ,ǃ g$Vki6A c'P{NμFtk*n6Vٲۅ}a#qV-&v^1x?rr'"Hg,Gާ4TAs!0H.}{+&kveyg[Ax4/Xri@ ;3θI|v(k|"%$xa7}] s&tâƧ)FRCKHCk,>*U[C@d}y_Z?{/Tg]%vN8IBP( p%1ZtBmn]2rFtGa>@f+ñk\-pR+ #aHg$<|^L+(>*m9p1E }h%vo'XcvG#CĖjiG -ǐ{8hNzg弨YoNl_fV'GTk*“}9^(;:\ 4˦&XE:QMV\C!Z-cxHX` j6TX"ov3k؍_Ъ78@Z m$ r2֬eKKD`Q}5 jDOͬ l>hj/e%WA'ځW= :'4pvhK1m8z Z/ KbSreou&ͺ{3LBP( Bq@&kpVE4w[ُ4Id[2'փTBnFޠ<6L#@&_!h*[{|]OGج@qk9Fʼn"!d^4 ىuՎ*k7X5:%  w)FmhX8l.@Y}fB͎H[6I%әuXDXt nȱ:NB kVTg]#B8-I/Gw)V vN$4|, ۬[0)d\HֳmmDqV~ywl#ϪR'fzyW\NVNwǓq.ޔ}5^ҧѽ?5&9V2@OhH.Kp#Dvji7tF ~K L?hf 7,Zvv~,BP( Bq@Y?*7@sO7 Z^vrLl5+H*{f]hA!HG/KIȏب~]՟ j6Xm?#Җ7e&+%bFË#[+3B$fpj2!tD\m], g(D} ۲𦝂/m.e'4؛uXϨufaxVɦrݯ@ 'Rg7jW( BP(.F3Jq#?x񥝈g Eg-ױU}0~ 3y8'O[$vT$qۮvh'DH8>EaVZY@iH-*—2 {*Hsۇuj;|/Q _::ZڶwE񤞊!ġjbͳ1s?uTϤƧj bo9>c!MtG8*?Fv!j+5S6ֵ$;S0n>PjW( BP(C|?`\-¿!=QK Ҟ54.]X F 8?En~lE߷$a{w/HKo;2HJ)\qnq봗!h!ejVy V 7MvN-֝@|I0־}(m̬GgjV!%Q8;C%Q/;FyT;$:21&O%<guJ>lm8>^Ur]Ʊt4h>I;3Ig4qT}Y؃blhNi놑4 _$v 0%mT( BP(W:,`mBnB ADz6i+p'o۩cAhؼ||AzfBhH=Б {L{"LG!-8?w.°#ACF阎B G? {/ [v#QM{֣vX[:Rsaz 'Nv0:Ɛtc?o+th!0*f8!@ 6c߅e3@H@jn.LGw [wLGޘ"o]^lmh~a+ K@8z*ҖiaOiP]°0>9X~,3 ZZijYOYc ڝ`T( BP(W:G @PU(P6Pt^T( BP( E"U BP( BP( BPD ( BP( BP( Bq BP( BP( BPƨ@BP( BP( BP(1*P( BP( BP( a ( BP( BP( Bq?J|ˁLknBP(}}k*3 KK_dzv)* BP(NFdUM{X ۳E ?nk?M԰ǎGyWd IDATȎnZϲǑEVVYٹ4?ޞ>&[_Fs} 厙[,;#s#RlB㒲CAs0:,zMִʬ&;b'$Y",/6v1d%^KN~=3dϾVWwt:%bY؇oS{q?wcvH:'Mo1mt 쳯o_{m0/套q@͗ BP( EBi"s?GWDM'9/},\+>|ߟ14DG7!:yÞ{wex;im[={vxR/^]q0سgO_v@Y6⃿@Wrǻ]4P%8k[uϞݬiq2מ?ȒxM][496?]s*9$e/vj8jv熿=VrVF;5pG0y,{ nՏgGNѥ}v7sO.//ᛏsz .^!wͪxZ/ed=sBP( Bgl\vS_^xp>Ϟ .$E!>۹m28aݰ.8N88NvNg#'ZBw8q:̥1Ws OrNw4;*w~Q:[S+ 8AX` OgTtc|c  j==!- :my10 BP(54ƭG_e_ {{Njc̠BϭRl}xi%&VÕ M[+ߺAGL& O̹/,)Is;t2_~9OɁ%p.b_`uWU5d0W/fpG3jP!} 0$^s: ɞl:dDZ涿qBxT .:9s' OBλCi0$H ;a[naV6^}vf]͝Wآu}gOɃg0.M[޷tѰ;~2og^=0<6=}>oBh| =o =`FճR( BP(D 8_3䳻ey?~Ϊ |\v3^ ^. |.l|0aS6~v2///\ߓl5-#/-ؤul7A{k.|dr{}s'x տ?9Ǣ \Gڸ'|m S~x_sg#/n=2AJOHߘMƙ59S{kQ<6Km\7)(w/qiu5vѯZsg //n=rԥ/"3eb]/s]n槶/Ƀ:})?Q^wlgH39c` ϟݓ=䵚fZ=p,#frsIdŽDO\<<D#d҇}YU &TTlQTbA[FnLrsrS<'$'Ec9$Ɯc]#DAi803L@}y{ڿͰ>k~Msy9{4e ;gWkeT?~7/7rjViԴC}{X]swދWc]Ҭ!9鈎dq¯ý[Q=2a7ѕJe)o{-2>kZzd-?J+77}i'+O;l\_^s^y:?ۻ[."]T쟡쓟?2!=7Myuxᾌl34S ΛW>߭=ңͫjmR?(?È<=uNVJuR̝=7e{vΞ }&{x.så'/#tu?Ig7R{ªԥ"{?œp]<肜ԡ,Ϯ=Whei{̐&ГMzqFIn|3f]NyzP>l~vlJ|+Ou:~vl |~ָIR#Q꒲-s᷏o'5jƥUkskZ)|1WV]?y.yo}XӨqٛ;Ҩqե.ۦڜ̭+Gv_=ܨ[V;-yCZҸIՕW38Ԧr;~кvqsSwXKˋ57oL~ŌZ)Y;gkjӶlCVG|-?=gN~3&IR^VڕvK/Qz~YmfNO9x=6wv/:ٗrPMYibNX#l־_N:1e)/M;$_N/o5ɀ?^Z3sK5iI,#o+(m;Tf+s3$)z^\sbTni6'y5͋rqKgeWǝvGyA̩[[_WP{-~zvX>rީ،'M>F,|Og[6Nkx~.΢2V=4t+`v?Q^'2oO]=gںT=?z,W|LMm_湣>+%Fg۴(-Ny?v9-S6mj;L?isjQ^)f@,Y4M+;SV){}J1~#^wгs%ap:aהeV9k?g8_qzjR=:gY`Z|lb^-Ԏ va~./Ϩ55~FkjR[ gBNy3_-מF|;4hm~x䡗Hݪ :b*cY+Ȣfs5]I&i\JjUeŎP6'^̾{iܢ*%5^IlTo[s] <{_iϵˌEKh36pzy p=wM.煬KjfIs;c;_rK?Ȱf^O$*gyazN)OR2I9u>`9 'Ɯ79o`ta~S^eO:1vaUdCĪEyGǧZۦC@|W޿[YR!g}[rO\+:[{'v;&:Qn/ |uF_ٜr޽ӳhɆ>x;8W,>sy_ˢ|{|?{@)Gr J5!~}߽#&K{e?}B˞^ϙW-9m>yg,K㿟Z:?>lXpGr䛗\k+6{|;]teIJ-jq=UgFil=ϟ={^kPPcYdy2d2wgنJ+diEZ.5s`'TYYsϠ&*o}`ʚu|>2J 6=;.?lKBk@AUVV:#L(0! Qhq@YRUUUCZj+Wӳdɒ,\Ҷm۴n:=zhP@eIJO=Td ;1c$VUYYł,Y"4fɒ% = wuQ9TQT'|u~,ݸ"M+Tw=S{uʧZ?$M+gwˊi+ڤ}sFf깅R/go!=waxtA6z_&>799(y_s=wf L|nr=flB.5/V'?sᠬ矯֭;TW?vlf־m.Ŵ~eʫ;Ko?pg>/{cK.I_pzth}Lm9-7r~^Ȉ#>=so?as@'ӯ}ݕ%)r->cvVjEjY#yW~{N8ᄆRYYs_,x7O>[cv BX@R!l(0! Q C1bDC)KRZhQ4iM6x޳m;#sΛg1"gyf~??7zv̎k׮)++KTjF>|Zwq(0! Lw IDATRo9/SUUa;?~駟.7k֬|;ɤI70(!`\}ՙ7o^dڴi7k=R)_~y.6W^yf=ƚVZ^z)-… u?/ŏ l}';_VWWT*YfII! I*++lٲ־555Y|y*++71ִ{dKYYٻ.bŊXXӯ_y睩iҿm\lY,X-[fٲeIEe=ӢEM^g۶mvm?>wqGN9 80K.MBYrK_R4iQFeĉYbEv}{c2{u_j}XmV\$׺s>mK,#<3g*۷A}2v،3& .L۶msI'mQ=zt^x,\0mڴI.]2xlr192gNEEEki׮:]reFiӦeժU֭[=w~Ըq̞=;=P^y啴l2 7e=Xy\zYpaF_|1R)o8㌵5kVF9s椮.{9)Fz*G}z8sWdʔ)?`ct!WU7whWWWoUV%I'N'|rLx{9sfd̙8p`,Y$xFk+R)OEEE,X͛/sI'7ި 2~w)̜93Gΐ!CҡC̙wu]sGUV9sfᄐ97y{eРA{hѢuq.{-\0]w]4i;,-Zɓ?)MUWW[o3`7.|r 7:̠Adɒ<33gN>8qbn^9R[[ck矿XjU,\0vX:tYf,븦iӦeӻwL<9>hZlC9dƱrʼ=# oƍرcs=gϞyߟL4)7xc;sc]]]F=z-[{7nfB@C2f̘̚5h㫮*\p;1V^}3fsΙ1cF7~ҥK8u^SNkW^yױޙN:ҵӶm|cKFoon:<@YS??pƌߺL0!tPR{'IO|"Z_]wݕG}4ZAcs?Ɩ(J۳jժ|ӟ^k;vaYtis\bEt%^xa***$x`}ݹK_'x" ,Xk>ZؖjSN_\*Ǐ;+V[n 'VTX… CСCoݻwrop )//O=ϯsֲfĈ)Jy`iiӦM7w.]c3/_W_}5C}ݗŋׇvmm޼z#4wܼ9묳wڮַo={f@nܸq>;6?{YlY PeK/娣Zk}YYYg}6&M|\|[%$3k֬p lƍuӳbŊ}`rGuT̚5~g=~zؖjC 'o4ԩSf͚㨭M޽5$ɔ)SRSSg/'ONUUݑ${n,Yz~w_ӤIwu֩oY? Muuu-ZN:e婪J&M zt$UViܸq/^3f<{}ݗ3gfɒ%iٲe6m~ d޼yI[o5z;.CO<'7n\v'Iv}uѺu4o޼~-ѧO[Ν$5?ϟnݺ6Z>:j|[;_Yfgl8<>u9;{KC@YYz.O}S]>CV_3bҥBE؀ɓ'nKL4)>`}?O6{.TVV*g-[]v={vh솊ɿpi[M6իWz 0 ՙ2eJN=Ե[}w]VVRXmko {c]s$ITnqcm86\5k\tEﺽ۷o <s6kl.!`>}䪫G>TVVˤIr9lѺ۶mZ*;wNsMEEM˲9V}ozgmuu:!Z n!sɼyRQQ޽{Lǎy﫪ڱܸqִzgzLg[9kݷhkڴi7o n8СCjkkӨQ[uk*J[ewtҔoxiCw"uuuYtiZn9UVVf;wn}ܹsΝ+Vl]Xm۶ڵk{we[SNs=3vL0!p:j*;wΘ1c|KR}єW^i&Zc^|yw=۷ϨQ uuuy޽{4k,G^+XO6my޽{L>= ,T*eҤIc{c[W^i޼yN)J[9/ɕW^Y6cƌtl^}1ŋuնm,Z(uuu;t;w̛7/Gq?Ʀk׮=zt7wZX"ϐ!C9%駟n!orᇧcǎYlYMsK/ݢeee4hP;.s˵^AE2eJ&Mc9fXqoKf„ 9蠃ꏮ***rg}~CMgĉy>͚5K˖-3tq6cǎs53uwG-Zdyx7ƶG˖-sꩧn5\C=4mڴɢE2nܸt!gq.ӦMK [wR[[>{V_7;U|%ɛ;ȒN<֭6yŋuŋӽ{-^o۶mSWW]v٥lvڥiӦnŏ=<ySUUVZK.!K2r|l/{G>eȑOfyӢE3g}v~򓟬3:nm9޽{}9rd,[>xmV^^#<2cǎQG{恵K߾}x(KR[rgc!tu]pMog?Y>mvt-o~ 2$zhCs;9FR>ŋsM7[n9Cz8v(W_K/cfСi޼yC |0:tg"l1!ƸqO2gqFC1lذ4j(N` 0 !C405iҤ@8 L֣T*5`P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`B&@ P`Boc;ν{ @-{\)k+XZԹqb6L.%!6ݖ9gtjm2 iT)if Z˯VkmKֶ[|~???{_ 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! yIDAT0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! 0! /|{;stң90J^ߑ$s9jGNGL0h^ PXO~a/mkk\N;(N<aӦM~޳gOl2lmhhh,GFCfҥygGGqڵ+Im۶|k_}7HڼyQpunݺr-I>Oڵky&IΝ9sɼIl68V5k;5kVڎC{ͦG4_~iӦZQK/=ffsi9mwkO䅧}o3oIi6_lѢEi4} }:4B\Co}s>se_ȻzkwvY} %tww3fٙ={vٹs{{{3q#9cih?6{^WKL~M>\u=܌; ZV֮];blf޼y>88UVe֭7nܘ۷gGtamioOv=%7kzf^<^ptϫg} _3ug2~_3?ܳ wg̴S?~{ =yO>GgLyv.|_ }BnԼ?lA|L=u xlMKޚ޼0@yп}O#j,}|w^`>կ~5W#<2+^F}zzzFoZٰaC,]'0t.{Nɜw^2)y%y}qvܝe+_.=;ϵo[3OIό⭳} >lڍgsO~4oW[43w473Kޙ=Yg]~ӧO?9Gw0.ϵ_ӼFGW&6'{nq¶E{Yn(?E>;ٵ+2 ]5sOx~Ӿ<'εͳ9u?cݻwo`D_#M`T Y,LǕr^*Ǽ9eZIm7֖F|[[ۈw?c]o4c <15%ycYv,[u\.tV7CҞJ[rvɇYgǞxlڴ^OF̞=; ,8ȒgU͊ro<py1 N-{gsfk?u; =QsyK.qlΝYre6o% I׽.fz箮L6-i4#o4ʌ3rq=ߟs=w){O?sN֭[jժ ;' .̄ m۶y睙8qbtf$9眓V0a„L>}D2eJ&L$9cs>wX|)SF3iҤakGo;ޣfePY#IhS9aAIENDB`mu-editor-1.0.2+dfsg/docs/icon_brief/mu-running.png000066400000000000000000002243721341747546300222220ustar00rootroot00000000000000PNG  IHDRXsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|^We[ݦۘk/!B|! @B @Pz 5M6660ƽ۲tew~ک$z9Dݹ<3( \\B!B!B!vV7kp{K 3<áE)g%B!B!B!DDQ͛w*++?cYmcv[!B!B!ea`&^{-v[ƙU\s 7tX ۶Z]B!B!BmZ__G!B!B!@RO #B!B!Bj7B!B!B!" !B!B!0 !B!B!0 !B!B!0 !B#!ן4C)Nu9c83i~"hT;嚧֠Ʋ:V.y}1m@Si簫~.!B!"3B!Dc9цm/)UP0=\ ]y5ć-Ͻ>=?=+W=ŮB!ĮУ_AuuuӶZ.8cڷB!1((o>ϻ?؛ |?:r-\ ]WN>?Z^b⡟rѓUtsV_w \x(RhYɸ|xtL~z:>^Ė3H@l9OO^r!8O˿= 5gI g0l\N4o$SO)~ hx<25}N^?ux:,k^~^Vc?K/=)E |nJM /;S`suV?ͼߝ8O}^߻G_dB!1Gt\~U56R\qլ\Q#GoZ*B!UGi#z^ ?,KoR}͖aM_UXT[7J+`8Bŏ8hogݔ:7b}N׿>WGuGz(T18{,%Q{N;*9#B!Dn- 6krWqWr*27o B!%ާsƤ7)߸/~JD*@E 0"i0Fr76xm̽jKڷR&Ǎ7Pc G~bI?`&p_?br:9ַ&``Ã37tF)GlQy?2&"L~Dy9_e^7@2bܗy}j6ZPPRc 0/O#Ƒe!Bsnۍ#!BO)8ϋ8ihؐnOv ] 1]r9n]^S5f.=N<;Fmc}ռ6akg_QKe(JNP Pv&cO}iCM!{ xp{BJ\ExcFWC }iv's(h4fJ޻2ߎO"H1hp!mc j帢1bQV-(N4eb;oO,Dlb ת(;+O\D%oB),T|+<ܡyNU罉\EXqDG6Ѩ,\wm[\x @:;w !Q1cC <*"sqnSUN۹=Q!BWqqq O+xf3HF4Xb`E>Bv)_%\)wuFI}# st2&MDUUU֏t wRܡq?ư*Hoe?Xc+soUUv'<o (?6rHH}ޙX=R6* W|fl5f|Fl+ʪDYAбzf1g{$g hY{\Tq}5+m/ŌtO0xARgC Db'w.B!ίWZkvgq;1Q%?hyčATz/QY?=hYƓcЎzcHuxּ]i݃;Xqf36oBeA Om|5/@lSJ{Jc`"R=} _'!"Tl^0rО9{Rl_ x<wܶbcxb_y WtT+/т3y).B!Į%CG_S,UիF{ܕ:QW@Fj.:2mXѷ杊\d&|3S3 F<3\p8˴ *qn"]>jNB,~6" vQl緟v 8E*Ìm:87iH0sD?ɩTܙ3K5Ӊ2)תl՟ \Eu= _(lRcFw}U^~ALOGh om4,WS7SGF7rq'^vsG$Qpag'z}uKv!3գ;(ZNl`!.uN-VM9~; ?u||Uhcݫ?r!o?pVwC T܋} Lr~6f"9C_@|.+˵ p>]5[;ŏrgeN0UD4taIq.v@Ճjm qU> |c\WٹJ @_2gQ5)P NDqฎ;uAl+UC!*(am+ VeuCq0d.wK;5we(<98At:Rv/:l2C 5(e᭛iT|k'] 53 v:m;3r;a\a\A'g O4wZQreb:n[aِw3=bOfb-Mzm;'Hp Hc uSԯ Pr'\3ixOB!$cO~{<@ 2r65Ķǜ hc OF` l37J/pFfct~ l *_o7}6\A4H⡴ߴY^kGR: 3)3dg2j>g-Zs0KMkUX*voTN ]( 'olvӰcP)l{i/-Fh$Q(/>k>fC@ݥ]M̻OfM{B!$ v[psnwQxy'7i+A]mNyOtmŰ0Pttg[ %m~qQ?N7%ҲIv!SO{9\Ѓs7"S9^+AgvEM !GrwmUhc& . id_p&FBvWc97Xn6^G;wӂzBtRh}h0 XȌ,o=wa:z\^ @/&gPVMv4Κ?vf(oZ;uRSG?Dk\B%?o~MB!bT\\ p5פ#ⶏ.ޑ0/PrZo1 'C2Hzߌ;xΡh/"gM(CEø!gPx'*e^2\$|{S yVQ(vFwV }PS:,>IwAD(:IORyvRjܑO{`Xf*6eidŽZL/ ^~d-prА{ -Ӥ(]'o|FGwY,,Uxe[f00gQRÝuL)gPx 0knmlƫBz\0iҿ޷l[fw>s{.nOx.9&ngVIm:ߵ]V3;3i\ wcl`,h߻5]!B-ܒ~ @em!"0;0)˝N9,G:9[UJl[G<[YwV0a/ae:jX 0 j?;+l2{ g|(9΃{2َ2Iᅭ.luNYo֡R,C]쌼MeqGb6;phcٽV:`? g]zF{ _}m0&'=Ww4Ýk3]Gqmg8:BNxjf(8x3*9mL)g߅; /Ƭ*#O/}_zm"Mm묾k[t.vwrv00W0"==4]v JpG`{`g(rOB!%@[>wVYp̍3f3*9"6+oƴv  Wb#9[aU'ȁurh}@^aP3怅ZCNӎrQYٴ9S(NZ;LnH=|#C~һtfל~êU*w687 IDATkUm+>ѹe+otOᵾ5od>o 8%e:fnҚ1Jpbmd!i]#~ C/ gB$j\¥\;m[r bgw rnFY-R_jmOwʦf f 9Bwf%c&bB!I;/ u[0bkQ3zH9nl0YnCa%W!| CYa_J"琬t\pFeI PP! HǑ8X|4A`b*)M+xaYs]Rmcߠ9ߐ.Wb9CɿO;)7˵_)=_a\A6Evu Lqw}ɧL6 %*hNFl=D!&(s˶ՏVvŎUFN1ͳڙ7/3O=8 y'[qE9 +(B!7-ܒz[W+]n0:e+>9iB|3u?_&By`!H)Ay_3$W ;no MҎ fFCsjhSF\ ŧ 8m,gO'ug9Ӱ݈|qicЯX72Vq;@h1\ݡ?Iwc;IEa cDG7.'i-a-0.i'FlGQ-fdB!J;Z# /S!gm:{S)5]pD{Xo7 Ҵ<S$(}:qTvF3$w9Оଢ଼'mcKKr_ Ff3׋ Rνio(Sg7ҩ-dޚ߀ޤ5 @;G\ۍ -V+3wgB_-5v&Γ^8]wţ`7Ћ!wդZS8^ڐ >'q늴!D!B!D{ vg7*ܓEͲSYy7W=.Kk[)ax;`I]aM[(aلIV8du^+4yNgǐ @#Eԯf$U7˵*=R=e|e%ops-Y(ӹWHlԯ|39wUۼQkgИ1u蟔t,K'>bvs[%B!ήǽg1Vυ2UޓS os)R!|O%^U^yӉmgg2a;i(J L^ C7##óXF|3м䍁ݜkg,|j6UR`ۚ\Q <YOU~hh5/;7h EG;۶5kY|3KVmc*9ݸ bQY=~*Q%EfPl[&,VnjX&W2|.wͫ`[BkmH {֚[xe׼d7)K9[nCҜ 'EЎ~}gr׾+\7h fӎZ& =Q!B]E{ԕ[7;;yΰVo羙ڌptVvU´c3{in:;BVn][T \Y]?<u''pEh}qnykW z^lG.C+' }~[+ʄ8@P_\ң{WXun{_2sTE:z\&*ɣp۩RWZ[ԙHXw㉷>c͖N XC'qQ{P\vpnbkqG?'ۿG2<5 Qԃ|\‚/7P fɪmhevR.YDYW/8aѶc͖FulKIEomꒃI%gv15{_rO%~ئcaf/^)쬃>0/6g`yƃS7Dwz}Olڞ LK!B]E$]U' e&Tn35=\mTlhkhfBɹyuink̓.7>SW™]َz]Qgw݇hb@gTm_m捅ĺLq:+g-Z͂囈%[Ȑ= WcH{ici"g63[^7?2q Xz;}`W6[ʃKq>JF9hY_:|x+6Vt线*ă.悛_fΧk2wW!ws0F;=ޕ7-e !E\w 2%QCB~2@o, 8=:52ܶKk_=sQ-Rh tQ=Kpp %PJ5k*RJ4o-Zʺ4S()(:CۗqcuO',,^ˣo,anޭAx{)3 w=Q!B]I֣0wOMgGݻ~aq%ơLOϠ_l7457c)V'G=fM*W|]v#(=ʪYܿ5&OnO%,\ϧooakT'>{__/}L<`r99[4#wFXz2Yŝ/,cGM>\1kg.sסb7 o'x햊 {`6\`ws/k^aw?@t}Y&-un˻_牷bY6{-?;SIhF bP)mgM|VLz̘be\-eHk;%iOko}s~锯3Cg nz)q@!4-emj֝dXG7[Eכ^{iGuoč/zmui%D!B!v%K #Ew>k_:Ft%jOX'IhF;]v(.ø/~+gMM"1l=FtYr+[+~op'10Y%B!Į[3h5'@kW\gj ;0[#|'<]yN Zh{`6uݛFmN ?9y<{;7viG]˓}#?.i;_kHMVJ1i(h,-OOVio6OZ梓br;Mesj nI-^?4=)Źc<feZ35<={YQEy>~xdw4JIu_m(YKpنUwN%I5p?O\+{*ߣ&0 #`҈Mv'yj2B- Z,bQ%{FTָ~6$?H?jX/ sIMOײ&LQs= Nqaכ F v SmvTw7i(N윔cy.*l\7. @ zo,Y3+8v\p Eyz2^pER6/cS6 ,+ogVXhg{W² @._Re$ZX]}[/9>EϳK!B]INܱUWre(]+[o5ß%o trf/6 @#;zӤ)Ɉݛ֝v[U(jިFp,e!47JuFzW4wkւѸ}ep3 %gNZ!PY+R&NED#*ic~vT ^Ws UqߌE]2uքGmF7qO\~tdF*@kVYGu]=9>7OKOj|}y z,CgAV\+{֚^YƲڤ//=.<)K:.1CiugI-?;pjjM'uiÝkW ^_4 ~qp32ڶsNtJfLm:](RdmuW0asy)n'Rӿo[HES5I\TvUҐu޴MŤ%;_{/M ([ʃD];@`Z2#Pޞ]o~׏P N?tRf?;a8L7KS.WB!Bj5$èlo:n~5k XX: VF_o @K<gGzQ鼩xyĈot钭vdۚk'mlf~#mOF;Q ۏTp vUƲvGt*F޷祅Gj4b^w²5.7acX@iՎ,fkE]DDɣ5VaYv4QgB[5tRE`W0j,X`7[^6%5{u?<'cr:Nzk&Xàs(YjcXW?J1r;<)NRm8JEm$CH)QSFcD+j#d=gh&?ê@gL7ls=}{g@A?H~>EJVp!0luOks+HRs>]ƲZ>7y@Rc²Gkݻ/7lq֤@ GޗTFJG2u>X'^e+_m(g={c:b tَtd0XsRsϫĸ祅|"fĠܮ4׉R 7qmAdtݶ2k֢5lޑe;X\Ҕ5SƗr>";Znٻ먥)Kyڤsr6xӅG'uy\&cf<9 tsy&[3َ2c_oa{MJV72ՎZ00tB O-狎Ga;| 00e|)7_|,%iVpie}t=xfrӈ--n‘GuLv>K Rg_j[{d5V-?;[^&o-32fenb}o=ڏR}i{wKmόzgpa6>i);=c+1KWo6BRMoNϡ<HO# fh9|Q ogpcj]ꛆr#j92]fmz‚v7{9)^TS<ME˴ <]KR*)y}*P2 א8t'84r{LkL:r!) PJg~l"d IDAT\x򾩭{B!nz**y{@\f;MZQʘ2N>[Ϟ~Rj3]n#K툫adZs @usdh&QkK Rq .a'0nXM2ՎZ#Q։3×:,sGs݃Y|s3E00Fpr"{A}C @^S&X0cKEielcKEچ`em8ʖ ކ͖ [*w!59~OӾ6*XO]$ŵlic+b1)jP`ICx5mIwm͵OY6v^##L)gaᖁ[kߑ~ QFlc3h"iۖ U{*u{B!t4 EStP]Fj).n;uvԞQ=o  d%iaGECseiZkLtώ`Ijz;~ܼhmrYR]W'IaiT;`8ƾpø#)6n) m,XΚ9gTss55 s؝ѥ>r`R &L4H?kS_=?'kCQ_,A)Ų5y/J9;$o<[:YRN̈́vɈA|ekulm$H՛c-Xl91dRҶ#'NyXI>J?{GulVYnT7:BH @1-%HBhN Bh06Ƹ-[%Ye]I<kv]{9Nƃ$X"گֽaixm:6:lo{p"l}?Dzj"| &Pd/ޖm(/7Fu=9m)N{g ,ݑO,4L2Rd7/HkG_mf}$fRZ:Zl3;^ٱk_4=Xsb=ɘLk"`9uR1?=lwbPB'RJ2%AsbKa}[^}Qwv[+r3R޿I#판1'* BP(}cR!t"s c?MmfHL$(b=)N2O라uz4=j䳯mƱ#겳n~;HL*rXU Ű~yz,Za\!abuH0m5ݶ4Ƚh`HKonzC]!R/2~HOΚ2$d te{ -3B4%6](Rv{K6qٌѝ*@`+ cJ+k~JӉ>PUoVM%Hƴ6 &uVtSvn:p%'huŠͦ4=BP( BHȬPY6N !, d#޴.4izf P'tﳳ4)omׁ&`{ySqHpohc֗p~wuc6ŽsxijY3 +O@ w?;{Χ_A&/~nܩø]V'JP 6J%4Yz=">{oFzf>GR'=ՉepBFu@lɁf2 Ik_MzA,[CGAhU׾gNN*k Տ=cR0i$j5@.E͍eKsh.`B4%lA]8cR]I%}FD?'hN71L٦g,\zB5MIɊ犚d̉ BP( aFTs)l2c{0kb1l۠_  '=m'~y;oׇy^28ڨ[cGqlDQnX]=:] xm{ 9%#5Fv ):7#lwX\s8\_Ӽ[mkM£Ct񜖗MB8!bX*)nyY_҉$:Ya/ ;L-.gR)= MdJZ]M2M)ٵ* c7@yu|sdI]s89nh !HuѴ8DMM1fFݚPe;gHaGwq_i{#u33nϞ4yz+Sͦm'/#_]} #tp](Z z2lq>K6ꬕ4!lyv>]}JB,; ;uQj~Lއz@48?{מ9b ^;@ ˍ'q9ӿ09 cc h^)9(㜩:(R[)2F H@5d`Xv΄ظqÆ|ءIɁj[YSa&,m?a栓ZMڦo~&i)*ly]ҹc㩏Yy/?}ꪓ(ꙝd ټyLӾ1EiK%Wl9NGcDnC NI __>1|U#L?J"ݮ 4!puvî7k8) !@{asID_Fi")WhVQ' kz6YS6ꗏ.x/}Fyud3 8v4ihM TV3‡6c!Krܨ~񽩸]mϵ? +U1 -{*x&|z^3 &ӷ ʚ$m3\#%CgPlNӟÜy3سmY/F: ݜ}Nif+ '1c >]kwiO9{xo>y0Yi.~_fĀ%73)%{+jYow ղYwoa[lg$'ʶz.cA'9i.F꼍/: Ah$ﶸ0IłIb+)P=  'hLwtN;_Ѱm*^[N;CǪgm9vD4'* BP(EM6 xXծc wyzk7h_^X>-K#WyrKۙqw3eDΑYIKǴG;j. ްU8M4@j9=C ͠ Q}WOcWW b~)?%\`s"miiO9[Tg+&eC6eTTW+$~=sӸbX+ng߲ywם5z P{jjJM;'vϴ 4Dg]q9Y}ѷ|f?a|j{izN<܌Kj#~3ڹ=h 踌 S+My?Ky[ ฑ澿m젇/5-gE`P$2THA6Nooa#9_A&??^հqs'1uTƙ[K󏏛ͥǎˤa;|]@DBP( p#@a뉴#aYtK@^"Ƭ YɞeF_q4D[/[DaJNn jV юɍMbՖR} 0O.[J*:qQ p6<∮Q5sfʓ<&4Ks&`Ct CS'6ַ Kj]4N[)xIDM׸ѾZ-žv~ns i͂sRJʫ`-/[leJnF 7791*] BP( EtoN5gDj)k, bBε\C|cI$TV{)iGE? >`vjK)-XW48A澿=Xӎ#SqYLX+?= ME<dyל;>v?X\8ճѪCQ B#F<6Vw;˘<[`.k܈ LKpJs'k:hr# îZmO~?Anf 7 n`x0JÚ7٘b!Gh),mbȞΊݦ󳋎eρjoo^*d]Q4%K}s\yEuO=Zuqm楻0#JB@w^v?=Qg+w7s:k 1ˆm|jԴvtqQ{H{O pt ʏ!;t`ډث?{ Ak.lǨXlU= T}iej!XТ'^;:|m{+n"WGQ[ GVϷ*ĸm5Nܱkp;%?l+BrТ+\O6&Y& IG vt;ƒ)D IDAT1kB00ͻYf'+6eGAj4!LwՇzbIQ aem_?gF_78[cf)1ҒI&sɴQ,Y%frʫ T'} 3;SGc`llGOoS:2J )ak@c O^$6Bp;&>NSPY؜tOEvHt!O7o^w} 2w2ix.#BP( H!TORκzQ.;]V9_iHѱk41){/gvcͪkW>Y+mǕ9r}5B85kG 2ys:|N!Av!T̊*kZ$T|RB1Z*pV!땗n:-<:ƒ9t/C\}јZG (j\?( IK;ga&}Npw!YnΘ23 zgqD yi72=pM1cxo4J`6.IuٹL_WUz|ok})%6~|L_ 3҄7"A6HmE \du,BO;g\D Mȿя5݊P%@JƟy>9=?;W>YVLsYcp)I] BP( {Geg٨?w!m܆:BjC y4lI?j)PQcNK+\"?q\xve6L;k:Lmm-yyy|5tÑ8Ϳ $Rߡ ;i)1\f]ί至=ecMƺ[B06J"V4%=уۑaIXg` nCzcjdg2nH/I VE'h? wP( $eVݎ \/FE}}2ز:tԯ8qfNDq2N6 SȢBN\̏Ν0_^6@x_q ›uIĄnh[qXo;BK$11# T-X ʹdb)9Ѧk.*R;)!hHi4Mⴑʨ.9.> sLtBP( p䡇غuS&1G囍VvZ/[&}. `tL=6t\/@qぷ!LpjsgObaC%Ko_s?X{JD`aǗ{V񧟎f>QU 1{ic.Օtdj@iÆ/㜘_M=GXt>kWLPe;|`]hP7<lB~y#9qYͶ"}Q)S#up =RZrN+U$؟:*l9isb< >KRiJs])]ܥP( BPtߟy$okP,Qy,Gl2,|H˺&0jn3!}sS' 4 @`w8Bbm"@QO15Zgk9%.easU"Gwl?N&躳'4Hd8urq;vB\Gtѿ vK!G?>9i“G4+Q; n|Y gAxa!BxAo, oK-úm+fC3m 츝gnQ JzެKNCFm xZqV\>|E~l,*s51=8w0d~"2h]'qqC4wr樲7"7ͽ:nl-? rUWHi9+?,l+yn;Nw鄾nWfol)E8Yn#)"SȻ_O͉ BP( ""Sɿ~w2QQ0bRfY\G:KvRV|+U͔1x3/&Vڦ(;@46f ϿS!&BհWP{5oUĻnV6%>Aެ1SDn6>ۚs&)io[_@9}rg7R:`!w 5+"gCK>!l[D09Qa띖;>{I Ka0arR&TjNT( BP(lb,/'˄1 sFS98B×s9fS-}K [@IG\*89tNRɺkddV|;5OPq#MJ=.qXUf~\_$v_Nʩ՜P( BPy|;`tN|yO?ؤCƒ;VlcmQf]+±)7ҞvI֨y2}O l P!tj{>H?᧕z&س{@CKǀ iA2~Nu ;vma[҃7l 3lN4P90g/sƃf MmCw~5'* BP(GKݿ2Y}UR*Mʒ0SFS[0&2L=UóEZ6o#{]ZNϽ_$!:vc]ͷQXҐ\`i& )vZEQu?)Aw˽ _Y`٩ftw넱*.krg?p>lۯc fCtؚ^kU4=3o`UE6=O9#v !t|5w}Zw" d_7c6#mk%"f-o>ڂ9Zz\a녙r62 BZEM v%DZb×#|188b[QJ ;PEiG [O g1rY˂^jenZ/XpNKȗ{-s:-mǪxmVp\q_oTt>A5l<_GdjYIpv%Tη۵+h*a9xzEut/D#2-- ˑmϥVH oa˭P2:$L'GRn)>ܶF Ar+}bg:͎JKK:t(Hj&RZ/y߁-deڬb>k ;WDڲ{GuX(kl9r=jؑ8kR'DW9 /WQrfr}*B?+Ӌl56qfKBA/b۰ 1)"ͻMx/%N|RGU?6Ȟ=Lx]( CI)}2M+Xdd $^K&,[xA[p9QP( B8Il $m66z9NF"N Q״9WM?rtZh?eY A8ˉ54w|/RZo+Mkwxo-զ>8.v@f'?pt<rϬNΤJ-P%N0 `y7rEv8V%Ƣj>2:CXOJc3R!kwVUē,M5i lcӖbDH^A_Ȝ n!sA KҬ3ͽ)b_XGjÈm+m,φKvؑ@fTZY}#B*[xʘ 1u(m%랹V1EV"E#1 O5Z^9QP( B8HN ݿG[IvEjE(X-VcY ~pQ3 g'9C8k>$e[A)2 \@BU+Kj1utBɹStq0:ǎZ]lGv 8EqfҴ2D c(J@oHI]Y6,Y8*2hz!Ҧ>8ƪdXtY2/ξu6ݨ&kI- !ڸ,gdD,Tml]c9! E*z['*C`Z<VIqs:\\ٞUҴdf_)/u92Κ&苚YMjS~Ўm 6ƒ|q C7 egy*h)X]<ZѻnNasIC-^^ mWcY@ s.瞎^S9QP( B8Hj @^xͨlV-rsA8*' %yz$j Bg`N7zp@Asr8 y=ja^6CVZ`7M7G"0\f_2k3[!vdZ!eVzQ2CHIJ忰|ѲM;?txt~g[?xVZY-eM 9o]G'G"N*Y6[e[ȳƲzn~B ѽ+HxݷQW8-I/G/9)V OZ+<Ђ[8x.'dӾz' 0qx 0*[hiJ;nDRZmWހ_YCӀг@ d 5(eT<_m٭6YEsmY[ ݼ/9Q|{GPeݟimPQcBP( Bqx)p4G;8k>Bb*=@zvϐ\~[YsH옩#eM0uJ]A.H>S(َzo-=_VFcݧ!+@scŸ6{2BʪqUeck% ݳ7Ѽk_RsrOƗ~.kx'DqU""'U֪ Gٮi>kRn'r e]?프;m;ob]ꝤVWŸH(Q9݈:J>`c,]KA:zHF=CbIF BP( šO[`OA#/cIB L;s0_B,gNϧh[$g`tK X!hJȴLH(Bqr #0F%6}ߠ{E3k\ Ta9gat$:p:L6:ϰyW"B18C%| .QJl 'Js[kH)eΪqVY7ɮ$VrgC LB"=)ɝ?'жI_LX f-6c/}kB%zvJC[R!d<-q͉ BP( őD"AP ftfP Z`¨@t!lLGL[O BArA ߈؎ڃ҇0k2DCꙀtİƴ&(tarHr" ;Խxjn(p İŰR;lP$&zpZp/--T5FH= b8a ^@L)eXե6&C~6&t&4 ٭ۯ3P9Z` &nn)8D %%\^^10EZWJBХG͇ث?DmLDt &>@t$;n/Fc[B_LF ҇r?xY UǬ٬:MZ aD/;99 DBP( H{ Ձő1! ` nQ)v2D`OLZћ`x [EN; BP( Bљ`P( B L1}"[pz` zp;ZВrF5@>ROGڲ100 ݲ`BP( BP(F B1 IDATPrH4{/H=/GP( BP(nJS( BP( BP( 0F BP( BP( B8QBP( BP( BP(cT @P( BP( BP(8"0 u( B=~W_W_ʡmx<N.iWBP( BH,/rQ\z˛->`g^Qw#һ'2'ttk{1Iߡc9~/cf\Yķ-~slN;C'1yrsb^yu)ejlT( BP(:_ IW>ETϛE?~7=UX `r2]}q2LdmZX]{Afe%%% ?퀖ϥ/mmY>ʿ^=UAEsv%%{Xл]},#mܰ>zQA\qӹRg Zu=nok],{^ad=_`;OLsv)i$Ǚ͚WWGO3qt!w+<d3RNP( BPtNm5?K_U IqbgSu5hRr8]}aQ|_9nE Éөte?fw@p:8<Ég>NO,XCɝ}'A~r[wG]=<ݢ]~AX B[yn#i;0 Nv֘ޖGX?;h8_8=rUtO]Pǿoy^ zp2/Wm;=Q.;lU)0 BP(N jhzw~}]q G-b35HmOƀco}bb\?'3EPu =Vf/yәt OҺ4w🟟͔C8`]Sk4)[{6~L<]u*> ˗xqeUe<8x -b@p~>+V}cRl$l33hB)sXX92`yeӛpc2p09Kh`yM|ЏScB7 BWSa芀&x;X|oGwS;>9fȽם~=ϞSѿ0N9ִ5lځFÒ8o"}Wǐ}<{i$ Bl~~Bc*{oss+6~'27Yџ 7QnLx]|+6~(EFp7Jk ~=rǍ=K7OlXژu6ʭ7b:?~icX8nyޜ۹^0,y^9hl~Ѿq̽|Y9m2>5̚0}xC|vd-k_s9Aţ8ᲇ_RteR9n>XFb1r˛p9qܻ^Ƥ|p aƔsN* oE:Gp2^y{'f uOrzxBM@\9/fbf : g&y~aК4 BAAv,| rػvI3g<eoo6l>;+/zWȾoX郌^~H@VZ?fKFs|Sr2:e;E'Q;i~2;j{W?WZ}V碿|5ss'[m?+׾ۃ_YƆ]|TϿ=\wk>o^e u~?R1qo?/#Ȳv9|0Q^8G cVФ.EnQFO/G| ^o?W8fsI <>=-6E\^7x6#BP( BD&/]Emg/oO'??N#.)MO!Kyr$>?2 E qXLVY٣771f\^w\9쭠 2T8Qqsf2[2.2M++b5s@TAs~('Pxs}ݟ>\F8[ѝ][z3MD/Cvq÷Q'ZV+chOlc}.O_m5^@l jӵ]U#êbĘtz90weL7J%}ol*8X;e^ɜא J5NPWy.>R:C*w`(cV0wݪu'Y\+S,? '|h/wyabLo㟣/08֤mTrr&GqH7jםdyW|xpajjB}wh-r8y.ȌL{#.R~+ wwlK N ;jF@7]٥)'q>+sߝkӻ3v>6yR7UPV] N?αY7}H吮VMFּ v4ȸ!wwlpОU\ؔ->vLX"ʏ|bmM!?/7A`gĮB5j:Yk5>>L{?w)Ѫ8s3wn?^Q^G%k-aݾL}'f|dffb6֣w(r[}kfqdDs&a)IR+kU-zg+¹ߓ~\8?d친p|_, WFu3zTyΞs2/a5;!9=4adE̩ }\biֻiȗÓȓ>|f0}VG'q"=1#l1BG@\seT~Y9s&WT~_6X4]emcdœϹ1_8CLrZ^s [SȢ.p- 61nClm%kl.|]wj eɮL} L&3dJ|:ɹ38TB>>kQbN=MRt7Xckgݵ:찶ߥ.ozfo\ 2miNHp՗Ήu߰1׾Z)<6mvh3L?3vFw<<?I ؼտwtHl_8E`{q]3@ 'zQˊ/3D`4UF+t$>]]q˱ 898p/74`}2n/%j`7< 7ʶ+莧c'y6cU|^wE.Uūt7 XUe_L\ǗeqxH_>fK}Sy?y9 IE3D;$NWe/ VYd ۯ[y/ ֒_BxB-mi:dp9k<vǦc6]"rDjʨ5KmG6+rU>?\k>de Pgn2#˴t9}Ɍ OV7]_f_9Cg뚸+΍]ߙo'/cʸ׏GybB5 \Mten'|0p6xN0== `lf'Y߰M0xuD7N}6vœaKٽ4w{fң 39XziD'𻼹4%d0IY`HĚ9{re;ѱ /~8o?_8Sز5O کYY~|9q9[bH=– 8}ƚF򥻸ǍHP*^1KӴm0O'ѯa nD?`ѫ Xҳ/G#+ЭFX rء;Kuw3q? egO=NXVuv&CSbXHMj{1T1p?j&5 n(?Tigwuz`-{= w_YV"i<6u٤yo`GK#вvZ©Uqwruͮ2f qklFnO3 NVM6<ߑ 6~y/>Làk9%~6v;NxP*~q/i_GӠja[ 8dŻf,yǟЩC'ztc݊YV-Z1=%ޡ3fRzxXa(pFٽg'/,_tAvPDDDDDDDDDD0_'v"ط<.5)k3^Ctq/=V{E uw-Zʨ"ǚUMM/yt: :"ޣt68k/߼6۲oB6߇Xx!K.bϾ=ԯ_}{о]"/""""""""""RU?k[/ Hk]sw0_ȂG̛כړOzYana1ӳI,zGċ?g/5ߦtSZ2lރii{tIuٵs[4xQ>Huٻg?7SE^DDDDDDDDDD0Vnː-S2&ˬ A3.,?+GwbX~myr$z\_,zӼ&㨹u?ĭPV17;Ӑ܂ӻ5d4i҈sa7g^E[DDDDDDDDDDn8;ےx(gk-5ĤLEnG+F7xm ?FUFwd4pV6w-@J\V:epsBi00FшdPȿk?6c'7)l6À[٪n6e2`4'ͨ9I0BSۂWtb4d%-vvv%@ZZ+ 0dȐ+=V^̀XfMI%"""""""""""ԩS'_YV;ϯC)59HDHDHDHDl槟~b$''t8r;w &cǎ;h&Lʢ06nXaHD@!|嗜={#GO?ĉ6m M:?HVFFǏ'>>|%''3i$N>ʕ+c$ʗ/ݻY`z"$$$h[}YlmmY~=#55J*1tPK,ӧOԩSK/YٲHOO`̙9CXȺu눊"99+Ҹqc5jTg̗_~Ir1bD111L:#FPZ5d֬YÉ'HMMˋVZQFO>#?3222裏,ǖ-[3D@TTQQQg .xbf3 4ʊX,ew˗-ݻW^L&K.xzzZ_88s }ʕUV8;;9<]v-0 l2s]pqq!00в,..ӧckkKqtttЁm:륥1w\"##iذ!={"yf̘AZZ!!!_ř3g=z{߾}̛7*UбcGؾ};_5Çq>222>}:qqq4oOOOv:rVZԩSDӦMGzz:'OۛP._Mr۷ogҥԬYnݺa4ٿ?3gdذaԬYXh2 33[prr"00]v) """"""""EV%W_e۶mDGG[6O1bDOeDvCw<'Nח'N00|VJs=Y'ӧOKvcrv|bxxxCam} Օ+WR!4h5kضm[_Ğ={hܸl6tR~a-u,^ZjHhņ '8f3'##G}4yj޼9IIIcLMMeٲeTZ#Gbee@F6mK,6m"666GwÆ ^:K8n<WHH~)w$Gjj*+;wΑTV\\+WiӦӲN:L&VXqnh4RZ5:ʭRF V^l0O""""""""R$JPBBnnnܤ$뢸G@JJ ϟgϞ,_K"|uppav 4h-88+Vpԩ"5 ФIoN,OwGFFr%6lh){%?N֭s4 :tΝ;ٿ)))<$ p9ܹssdcccYdd$iƒ.׺uk,X@tteݻwSrerԛ{q;l]t\pLJbǑE:uMK]|9*UWWW,e^z+Wd(7:eΝߟ,.\@&M ~!I-=OGVn캯+0 7L 0f̘q{HIIIJH(p`޼y߿UVY}E`0Nrr2NRJ899QBN:ErrrOcT/O>>m_s777j׮֭[iذ!iiiLL VVV({\krCp2c Μ9ٳgN:9xyyW~]rr2)))9mll,-]+NɎԩS7=c@@@uOggggqqqv%'YYYX[[}K뾖l%C ')) xˆ{1L$%% \8dsww'%%K"חRSSx" M,ၟ6lsȖ짗LJʕ+}vCݺus쌯/۶m#%%Ųl6c0]e/^sJJe;RJTXJLL&;fy=9lܸ77灁DFFkYf6ٿ8X3ڵk@XXXle8g>cKϡ[ĉxzzj`)2(챹'3MHH1 jQyxxd4ٳgiٲeQx4Zr9t\o߾̘1-ZťK8r111|x;tÇhٲ%8p .Nq;prrw̛7f͚F||\q܉ nguԡbŊqF.]dIx݊DhUVl߾֭[L&oy""""""""a̿+ `͚5ԪUc+tj/_O>M6UnW_}E.]h֬YI#""""""""HXX:ub 2Dsi՘f4iRҡq ̚5 6mZለH)Wܹs?Ǐ}vz쉃CI%rǭZ OOOIEDDDDDDDؔƮ]زe ߟtH"%_~X[[c4Ӗrҥ ]t)0DJmI """"""""e7)Ô)Ô)Ô)Ô)Ô)Ô)Ô;l=W3gRK:*59{̎5;>7 RΟc\?l.p.HԆ 9d>͸㈍)%䎹t)IȑĒ@zj {)6ɩbNk_g@سw0 n)1i ,_~-ZӦ*?gﹹݶ&9ne;Y$;^rlӆAA|Ӥ ,v3۴aŋ7L0{rꉝOysQ犽o;Ec%hƫ)T._*6S_Jlt,rr7Z[6k5+ IzBWbcIt߾=.Yƒ8:޶H%+=""x%1Q֑xG(v}thR@MxtV;wELZ2^,c_OgpHo0 CJ'c6,Gxs|v xqƋn0eӖgDDDDDDDWzܹ &O̶m7n=6lmܼy33gΰyfڷodff(o6Yh{/jŅfϞc ٳ'^^^|':u]R|y&Lg{Y k֜g<9!K-z ]r8:Z^? $>^<=-Qbt4VvvT~vSGG f90Zyj ߄k5v>>XINN{uYYL0r?>㽑˗s5` Bd$ GⳀqp`Jz,zAUΞ?s9Ӭ4x4`3߄1gAʕL084s|QV{AA ·^^|P" G*ac,3tּ* ߵkݻsOak]W`H.=#;l;MSmт3g2y2uÆ\̱Mfj*oFĔzXd`4zB?˕ɩr~}/s>,DDDDDDDT(U=:t@,{UXh[/9s&cРA̛7z ///{1Kq1uTSO==fbL&:+ܹsi۶-/^7' S2vX ׯ_#|ync?[? 41f͊9oʠA̛wڅ=V3GٰS̙s8]}{;wP蘻t1c|y;{q2 bE\'/Lg74^mh4 X^:;RG@Ӗ {$FG^c|޺?-^LݡCq(_-_~ɜ!CgYʭ7SRg`?5yÇc6z2`,~%-.({.+r,[OKLssӤI8yzw0cV׮BǍë~}/DUX2RXIIܸ{qcBy.{Ȥ#G[7L>4i Գ'"#ND@jKG!!6}!mcml,ܞ=4{ ~- B9oMӛ7'yZ<^9ck2?0XY{ .dnX \}|`r^Cc^:ۑsh!j5˝D@^xmϏ?ȺuYJC1c`֬Y9O>$>,eF"88?W"M6|lٲӴiS}].\Ȁؽ{7>|~c5  "33qѷo_ 7|?C zzPU=}AhQ1mn͏?eݺnԬye1cǬY/hQG:v,^݅c73gq71; *ѽ{l{7%+3=߰\^OzٽF KܫWŋDm`ITS'Wgwf̎غPgOS=?Dwߵk䓴xY]s65)l|}K"ՕݻpxR FuqrյI9>l!1:'S:u"dXR*p(vLF1cKx~!XF'8}tͳ'VB E?Ē1Zܓ9H5 {mZѱV圽7s&nUZ}uQjclDDxկOԆ +=$JíGkȑ0\+8n^++c""rQ'<fȱ|?Pg@y_3>-ZXͳ13{vbJO4 PV-:na6mܓSt# y2ݿ?GYX..ޔ *UHz/3Lϒՠܸ1/=˜!ChW }yЁ^SX^0kލ`+0TȹnI""""""""Sb02dmߗUOqR騨(fϞٿ?X[[Njj*ιI_ڵ LWӖBifeW-.eQ:7GGk}y! IDAT8~\׈)3UODmHӸ^Ǥ^p}}!2KWl<7w>ʕ cIXd7lX-Y37$"""""""RJm"`˖-L<_~{{!E1l0iٲ%?wy*_c׽4na9n¶%'gjcӥ r7bs{HOJb'pA<yZÆԧmǏǷeK<Cшdʽ`q̯rn^G^ãF 0xqٗ2Xر4<8瞃m[ϙ}Et)7/("""""""RJe"ԩS<裼ԻfӒȑ#=z4'Ou׫W4i|!+ vPNHtjg(GGkSṛ..6$'gh$C΃aS[f3>'_p<<(D":LIѣQksV/c]B 8k{{wNg^_ "|˄EQn]taԩTу=g衇r48:^gɵlx[ٓfs-SfzSp<~8ٳѻƌ њh֬;ķ/b/hֽY7__""?r$pe8*-8h1Z#\. W__x.ĩ-[kƌ_! 16KW&5hcE0~%ۿzދo˖TYt1X]}TYv_2mǏȲeԳ'-z8e ~:裖n~~jŶ Y >۷;];3s %$p`.?=8oܻ7!>_v239i͘k"aυH|/V >'W[YJU-[޽{SժUZjt޽Cښ07n̤Ixg8y$aaa[Ůܹڵk0tPfΜI֭5@iְayfn˪Uy;W_MsɛS[pr?%KN!Z}oLСsҥLyM,^pA}aϫ9y-9> LhaY۲%+=hmȰ07&b$V> 'O2",7V˕k`k1{:e o4q-sFZ\y:>}X F#͞|$>`eg9`|ckqDFZcB^zY;~<<A ٱţG ܙvY(*+;;{qjV=Cw^!c\Rɶd莵mʧȿ0 05kPVSrw7NNe%dπ>Y FRkֽ:[Nڡ=Hm3GǒGDDDDDDD$0:uĂ 2dH r=\!`4yiKwxS֍'#υGG<ˬ!WEI)5*W?gǚÑ0WvLO=zR2^zÒ=GݥҠ]GDDDDDDD4mWǏ{g\޹Còc1XYة]>rJ:,ݥC)%ZKIpCj,,=y1.ÐR@k)44HDHDHDwq_χǟWg:D90SRlBX6:69j-56cYI9ķP )tu҉~ݮ[>t] `BL #NH˖#STRYY;/]v2]ްa./sC]b%Y8:ȟ:ܼ[d!,q?/״n:wΝGɏ?f7|3OS^k.gqz =N;Ƌo=o±sѣG |55S_i+_MVqgqFn>Kʣ撊ܴUe\RQ7yf?U+mk\RQx*m}x;vK.۩W#g|0O߇ZNzɓol6red^7o^<92vZN;-ڵ[#_aÆJ{riiҼZݺլmԭ_7qzޚr֫W/{zQFUk}O:toGkloQfZ3߇믿>=XvuץQ&I:ummkUmxc7qǪ_ڜ֦tb9F4h<{|{{yklՎ]رc3a„s=9#6?OOYfe…+sg1;j;us>gȏԨ 3fH߾}3iҤ4mt/'f͚k6_v3O>ӦM}ipL>U?mڴvi9쳳{T;nFK$>>X*+SvZq.Ǘ_~9Iҵk5ϛӧc/O97SLXus/1-.wlEEE.4n8~:!M_/fʔ)l&ٳgfϞĶǏo򗿜 fm~̝;wq:tȆn=3I{,v_*ϝ~z_1ٴզ|};vLK._~v횻{g~vaiժU6t7nnִh"|%[neF?O֭[Zl\}eeeiܸqڵk}fF-ys)k^nJ 6 W^ye뮼 gZ[n֭[ַ,ƍˁVFF_r[Wueذ|Kw>s}eԨo>Xȑ#sGI&sQGeĉUUYY]v%SNQG޽{gƌ|xN9唜s91cFt5>l|'}rO OmvfCIÆ 3lذwy g ?L&kb]lo=/e'e:wm.dBvXrW>FjHT͎cm߰ኗ}2OV=vw*4jT;*IoFgƌ0aB/w\EEEnԙ䍗qPpK/!Cmk-5nڋ/3WN=5\}gO5liypm7jTպN<1sF~[0iRjmPԨYsgX/Vn$IEe/=ʪYf:$:{=V\yڴi0`@vm5*u>'xbvy|[ʤIӧO 4( X\ԩ#Fnݺ 6,^ &T=3vt޽궾}vڹ[2hРl颳lj> I.,S4ټ٬f7cƌL81O?t6pQ;CfС4hPEM7ݔΝ;WK#8"[ou <ʜy9SRN|;Ɉ#rGd}Tm#LΝs׿usldÌl C@z֒/@UVVW^ɀr_Zί]UHkcf7g/5wwg೺//j׮]viɓgm۶ 4xp<'{Վ}+#;n\Ը??({Vsߗ=63_{-L/3Ӧeϯɢyvw2W_$ wL3&mwm&Y.}y*?!ӦM_AwW^y%f_ϝ;7Gyr#@` RFh"kj֬&M~y֯_$3gLp¼ jx;6[C Y~N&,,.ĸ d…iӦM{8XlfKܪբXx76lDH gϞ;v2^F4m4oJ6m__/'?L81k4^W/,ue-,gUg7n\'fͯf:ujiӦ+CymɦToo~3zke K|SdV+txg$-nZ|<緞}6[ZGlf_$Iu,yr;g7N|ՙ6uZZ_OYͧ97nY~ƍСC_N&M{-R+&LȔ)S O/i5(ӦN[Ś5kV5 Fz+cƌ_ӧ笳ZE5ZzIڵ5VY|p̙kf^&YnXik} ,HjʏǬm9'_:ؼ3L.]:x,#?>v>wߝMz-Y~Q;^|ۂeڵW֪xsYf9Sk0zk96lafA\xᅹ[vۥA}3g%)Q&MM6O~RVpY3gp fΜNx Eg+zzƏ5*_x` kg̙ -{$U2eJvau1%4% >(f5j$+~~eo޵k͉n%/3,cֶjQi{k+fO7'LH&vF4|٨Y]]?ޏ'N>|}}gfM6ɘ1cXhy/ɳZ+ҬMze>QVk+u~z嗫^&y˳p\?{v^yem;̝zUl+Ǫ\p/]vI_[mU^r>r`E_ӱdܸqy饗Vk'|rO.h>'M}yjM[џVYY1cT<kϟ=3mQƍo9'xZK/}&;իm|sN~Iiذvj_xuu9ܿclA&OvZ%֨Q#{l 4h:) 5ˡ7ޘ{͍ݺeҸmL?3Ӭsqm>aoO:);,oNV;ح:(5kfD~o29jq}}~Y0o^tSޚ4)nj ,w_y妛nʤI2r4f_ _W3|l2[^|qiܸ2ӡC瞹˓$o}OI&媫Zj^}u_s޽{jժ}iԨQF}Ҹq<3s饗.ocw?F4Nyen IDAT'3ywq5_ ֭[硇ʡ]'SO=u?梋k&_m:j[7?o|s /w?vI'_=-ڶm>9e4)c:w}tWi˖W2zt;L|8 nұczyg>93#?>ڼĘ}椱cSn݌:}[oM>}rEeʔ)ծϿfΐˇd=Ν;緿m*++sg+HÆ 3iҤ|m.,,\sMFٳgs͉'~8guV:jrwJ:o͕⋳;f_P$ÇOϞ=裏fmYs\|͓$Os /[o8 Sk o>0t^ҫ;;̛<Uʅ ogWT]Ϗ&͛[ɰ+eM#t֨;.#HwV?8p ,N:6ڨ Ri/!Ze~wokM}}}fpese{L}}_uY;G.ͅtֈ';3 Ι3''tR.|w-/łYw5j~85jhE+;H]ϥf7^ۯפIe޿mٶw5{+;c6x=5};WԫW/Ǐk +.MSYo}Oc_K{\S ت`q7L P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`B֧ox<>wJPF>!<_+Ivi6`$5Z  PqƥN:=Wr{@ܹsW{m7^t,<:_| P0! &@([a١q>}NFoybfdA^vߴ>ymJ \ r%_䤑\>Vޔ7VT{ͮW+9({_2IeuϴUyn*Lf׶kM*< l!`nywCou3b+yf%>0/g'fć.|{Txe>kj$Ԑy^|0!udMȃLOCƟCy.9}\֟ʼ3jdqԽ_^wo d֡7]r~dQ̬{kViq铙QtwVmۥ=n&}|g^ϠeL-wAg 3/5>$;ul-:So{6or搝:杲k>y*GCs5'vaIw>ukzLU.{͡7#ӿٸyzdmHێ_'\?1wv2s%vNGOo/v*mo+oVݓY7Yvn;U_>!Wvou]"[lۻAHnȠDA&ZmuPߪVKuUMD 3"}߿?QYv{~ǣθ}Rji揔vP*D"[+D9V[GWQP`"+N08j/2j̷Z#'4ojmR37fhڨJtlym3G9w,}^\Y T@6yJ_qZvtpLW}E{5ɓ=ݜ_ tm5[)PveXU1_Chۃ56*ɦųKZi~ Z1v4g[Ģ4jr-CS_*ɛeRM_$Y' uz6iD5z{ZzA>͙U-D/hˆc }m(^#h/꫍6ՁY}Jcҩ3Vo/Ou8S[Ւsy|YՒMkWc׊_ԳQwMv﬏,Ѣ>E5L]\7>]lciӒrF*iHӚ?OʧGX[hT`ӷ|.]ᚲwy<3ҮlsޛI[+A5k$JKw'GNײsaCO*-om2Q>ZT-^'ihz˳|PmUl33 +y o6/ SA@͊;-qU[Z!/GQ]J؞&Yw1XIż|T)?a2J;)CCUɨ^_P)Qմ')aWIƬScU@j8լ-,ퟣY ԲyI9^-PzyRn=IEjze3P!yD'onn:鳬ȯ M;v?n*+PGw@sU*=աE%&\X~>FV ӧj5 WQ~bFONo](H;5n*]RMYak +𦏫[W_@}jg׻.̞5idשZL-îT#jPE*ybeΪp?uiRAzzsM;$k#O(n:]d-B%ZV+ cKVWƅ\mJOJIJj+U.<&jǥplV۵Nnr˗K钬@=">>Qy;odӁYRKkUJOOW̭:-I)ej)Z!RC5Cҵ#i_:R!WwWVlrwsB:C)A\_-cVmV6:f@ّڑTټփ{u:YL>W~nty]J'kxir14͜{wWrvHܥ Sgj%~jf(VE&yL2;[Sl]nJ !ZlEn}$ͻmIe[~nd+ߐ`xV˝.93\ݟoaƕ{jfe}$%_}x|{B\᭘++_^Υ͜{euwPᘶ=]\m YتqTU9p*rAD]۞klpEdя+2PMY؍eբym/IrrݾJkO]f~f$(Cmdjd(_|RJRnk[G.hk 9 Q6iպvڎjU84T>*RD7lԡlREk֧d׮3fjWS s K׷ʥZYae,ɰ4Qg7mbgR6-h26[GU"O wث7f&;8I=؁zmpQ+gYPZZㆫ\lǚ:JT:tVS>;C!wwW۷Cϥfͦ;vۮF*YE.ݭCԜ(n^Kgc:g.ρѰڻЈapRjy|A2m_ Z p}y=գYպuW4:p.UӢ);F=:jKC:zVϳ)~Ff,W-U%9@mJ2n;]O(5Ð{;܅~NF=Gq|*\=J's2(VnЈb)R.s^cqo0 okI lN G\Zg2$O:uƴ)/lGHׅ{z^]bKՅTgBa3g2]@B T{kkBY-R{8%łyXnmD,wo]Z9*h'#Yj=ܗ?mPߔN͊?`vH۠_'WdrgX"3sm۶=:=QQQpKb`L #01L #IJ'5 wdhr_Kx½:4Gl66{G\ЦGt?-Utqy{pz݅:b}ESz<%ޫ!z&)}~KLͭ;~gDJPɗn0â摲ӊkƒrw٤s┕Z5SUdKcy* X}wv ]4"H}n$CoiŅ۶۬ߎՔSwP&-T_vu"OWZ ]Ѕ5*bPBOL߫m_j T=$jx5lIe0˵d\-^9*[dXN:Wn$MM;.RcF뭱/QPaYJՀu]KUIrVfd?[+eԋQKv-哇G>]ҞW3wWӈ +2/QZzҳ;=GnjTvY_GuհбlWvTm$Y%^ME5;a-[Rj_΁QOW=/^|CN8'!7w7iiJKm0D4 S"yG-J]9j-sd&w7)--M=t쇶trsW-M>9q|ItAhmj'jvU^VNyjwƞ-GP.IJ؞/3t yLϵ>QMO0{PZ>-]5zyKd3?;OqidE5{gۿzyOk]JMVl_bhhC 寧wgm^5eJNӤԩUQvIN|Cqи:٫h7UIV(5#CWtm^J] kW'=H@CI᭦oWßjWI9%vC/w?p 73t,'$h˯w:CruSuid}AՓWf_{5uHqU;o3hj4=V 2)X1^˒VE_YaPR:U))n%>$Gur:yӫEÂdK~)|=AuھBK0 JUj+ɥ֋il_Up8T oW?"ΥU.6oܫ[ʰ(\Q.]*̢W2<[׿o]u|/8;?$CmڟT ӓ4w%y!z+۩+{QJ/V_ \!adtJamW R߯>U]TTi5X%6ֵS1}*dK^}HsLux$x-QƯiGOlwkεNЅr-0pwP|?뉈UN}-EI)^BUӛMST̬V,S*%jE<:?5cȳ>Zi7 ?IsWP_h+VWTb [WDNВZ!)LO>fLvr|W%M*HOp+VPTTԃ>Jjmt9eU֭ kijd5Ԅ`j/kr:5|ХpO? k)JmI E`bA&}`?+dʸiik/Tz76[%钦tT3pnޤTܣֿ7ziYϼ4IvZ5ZÿXcZ:[FG>'EO ˖AV\:^c_Xy| ӥv<N4x}]՝ku<w-72\%-T"{"gA?ӭ ϧJ}҈%:1)*Pcl^|"UAK UnUzƨo0ZUX% ^Ws%ZU RaOoVV1u&"=;_^И4yli۝U!\ /75?G/Is 4Y {KvIUgw0iz'+S>ݵXGMcKt3{m }.\IWO]yϸ?ww7<@VY˷lv"*ɦS+Iڴ/QUԺYw;EN߫:mLyV?FkǑZ+zo p\v~L/Devur(S\-*Z^੅]7z>kcSل4=2+ pi5}e^خc֢j9Bo6ڧO\/~sTQgdT9:Z,#+x UzЦm$Y}wQU~:@+GӦWXUIU܊TUׇÕ}V.Y;f SQx@w:JrNjWZMUz \]]UB,ϟ_~~~PDD?,󓗗׽,&Nj3=[\ŝ%OAj1wDAxvnzvŢЂ t>|X)))rss^/Kɚ#Heu{SJa-8SO[d)Zc.d=RjeWJ[i{үa=R_o%XxOe^AzQGjȣ ^:@ejd. >|X7n̙3eZoؗ?,CI PLLM/^9shݺu:p@^#3KkGf#"Ԥ}LגI@VN'ǦXG4)::COevc9ޙXiŷ$:S1z7v6T?C$s6"mpL_+vDE}1#'M%Kh޽7+RH!@&__ߛv5k[MYϪCj1F|@=;)%idH)ոʨgTBROə3W0T0iԮb|hk҅%}}}s}AAAsFr\fWU N.x57@}kgf,ѹ-?]]黪9cUJKS:-I)e:(N{RC5C5.i2T&&*.)!$c5]ub:bom(  w׳%: 98Hwp9ra-$`j }V_qZ Ӎr~8ʿlin_d?Nk\R;ߠAUZU~~~7;v옎=Ǐݻof AeyG\j]371LsZMk1*v氎ߣRsoνaOu/ѪCgu?5nM=PժUKmڴi_jj͛SNݴĉi{հaCլYSwT[^15>˯m[X?Zv*QԈǢ4d GmH6gyi8BР&Nwb'''iƍ7lONN֏?`=C{jǎY#ooSTY+Sh>g:>rrŋwԎڵk'TY, S7N̙5զ??Z@(,[Liiiw!_CkJn~ GGG*T讵WX19;;~]B{jڲj۪9$nݺ oUatarqqQpp (pu{hh<^ahʕ:y"##Upa={V ,Ёn8W111l2yyyf͚^"TF v9:^SAAA7E$C7zF@98<~ѢEo:mNN;0)b!ΰ}IENDB`mu-editor-1.0.2+dfsg/docs/index.rst000066400000000000000000000122731341747546300171520ustar00rootroot00000000000000.. mu documentation master file, created by sphinx-quickstart on Thu Dec 24 16:24:33 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Mu: A Python Code Editor ======================== .. image:: logo.png .. note:: **This documentation is NOT for users of Mu**. Rather, it is for software developers who want to improve Mu. Read our :doc:`setup` documentation for the technical details needed to get started. For tutorials, how-to guides and user related discussion, please see the project's website for users of Mu at: https://codewith.mu/ If you're interested in the fun, educational, inspiring and sometimes hilarious ways in which people use Mu, check out: https://madewith.mu/ Quickstart ---------- Mu works with Python 3.6 or above. Clone the repository:: git clone https://github.com/mu-editor/mu.git Make a virtualenv, then install the requirements:: pip install -r requirements.txt Start Mu:: python run.py Run the test suite:: make check Read on to learn more about Mu, its aims and how you can contribute. What? ----- Mu is a very simple Python editor for kids, teachers and beginner programmers. It's written in Python and works on Windows, OSX, Linux and Raspberry Pi. "[Papert] realized, 'Oh, we could take the real content out here as a version in the child's world that is still the real thing.' It's not a fake version of math. It's kind of like little league, or even T-ball. In sports they do this all the time. In music, they do it all the time. The idea is, you never let the child do something that isn't the real thing -- but you have to work your ass off to figure out what the real thing is in the context of the way their minds are working at that developmental level." -- `Alan Kay `_ Mu aspires to be "the real thing" as a development environment for beginner programmers taking their first steps with Python. As a rule of thumb, if you're able to ask "why doesn't Mu have [feature X]?" then you're probably too advanced for using Mu as a development environment. In which case, you should graduate to a more advanced editor. Why? ---- There isn't a cross platform Python code editor that is: * Easy to use; * Available on all major platforms; * Well documented (even for beginners); * Simply coded; * Currently maintained; and, * Thoroughly tested. Mu addresses these needs. Mu was originally created as a contribution from the `Python Software Foundation `_ for the BBC's `micro:bit project `_. Many people asked if Mu could be turned into a generic beginner's code editor and, thanks to the wonderful support of the `Raspberry Pi Foundation `_ the work needed to make such changes was done over the summer of 2017. The following video of a talk given at `PyCon 2018 `_ outlines the story of Mu: .. raw:: html

How? ---- Mu's outlook is: * Less is more (remove all unnecessary distractions); * Keep it simple (so Mu is easy to understand); * Walk the path of least resistance (Mu should be easy to use); * Have fun (learning should be a positive experience). Mu's own code is simple, clearly organised and well tested. It's copiously commented and mostly found in a few obviously named Python files. This has been done on purpose: we want teachers and kids to take ownership of this project and organising the code in this way aids the first steps required to get involved. If you're looking for ways to get involved check out some of the :doc:`first-steps` for new contributors. Furthermore, we put our users at the centre of our development work. Extensive interviews with teachers, observations of lessons and exceptionally clear and helpful feedback from the education team at the Raspberry Pi Foundation (perhaps the most successful computing in education project in history) have informed the design choices for Mu. Who? ---- **You!** Contributions are welcome without prejudice from *anyone* irrespective of age, gender, religion, race or sexuality. If you're thinking, "but they don't mean me", *then we especially mean YOU*. Good quality code and engagement with respect, humour and intelligence wins every time. Read about :doc:`contributing` and perhaps try out some :doc:`first-steps`. We want the Mu community to be a friendly place. Therefore, we expect contributors to follow our :doc:`code_of_conduct`. Contents: --------- .. toctree:: :maxdepth: 2 contributing.rst code_of_conduct.rst setup.rst first-steps.rst user-experience.rst architecture.rst modes.rst translations.rst debugger.rst tests.rst packaging.rst website.rst api.rst design.rst release.rst roadmap.rst authors.rst changes.rst license.rst copyright.rst mu-editor-1.0.2+dfsg/docs/license.rst000066400000000000000000001050461341747546300174660ustar00rootroot00000000000000GNU General Public License ========================== *Version 3, 29 June 2007* *Copyright © 2007 Free Software Foundation, Inc* Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble -------- The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: **(1)** assert copyright on the software, and **(2)** offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS -------------------- 0. Definitions ~~~~~~~~~~~~~~ "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that **(1)** displays an appropriate copyright notice, and **(2)** tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code ~~~~~~~~~~~~~~ The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that **(a)** is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and **(b)** serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions ~~~~~~~~~~~~~~~~~~~~ All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: * **a)** The work must carry prominent notices stating that you modified it, and giving a relevant date. * **b)** The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". * **c)** You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. * **d)** If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: * **a)** Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. * **b)** Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either **(1)** a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or **(2)** access to copy the Corresponding Source from a network server at no charge. * **c)** Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. * **d)** Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. * **e)** Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either **(1)** a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or **(2)** anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms ~~~~~~~~~~~~~~~~~~~ "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: * **a)** Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or * **b)** Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or * **c)** Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or * **d)** Limiting the use for publicity purposes of names of licensors or authors of the material; or * **e)** Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or * **f)** Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination ~~~~~~~~~~~~~~ You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated **(a)** provisionally, unless and until the copyright holder explicitly and finally terminates your license, and **(b)** permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents ~~~~~~~~~~~ A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either **(1)** cause the Corresponding Source to be so available, or **(2)** arrange to deprive yourself of the benefit of the patent license for this particular work, or **(3)** arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license **(a)** in connection with copies of the covered work conveyed by you (or copies made from those copies), or **(b)** primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty ~~~~~~~~~~~~~~~~~~~~~~~~~~ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability ~~~~~~~~~~~~~~~~~~~~~~~~~~~ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. *END OF TERMS AND CONDITIONS* How to Apply These Terms to Your New Programs --------------------------------------------- If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free software, and you are welcome to redistribute it under certain conditions; type 'show c' for details. The hypothetical commands `show w` and `show c` should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . mu-editor-1.0.2+dfsg/docs/logo.png000066400000000000000000006264611341747546300167710ustar00rootroot00000000000000PNG  IHDRv%bKGDC pHYs  tIME 8!h% IDATxwxՙSIeK-+ؘP` @&oʾR7KYI~ŀ1cWYd[ե6i?d  s]$hGGgsS#Ye!  pɢAJb "AAA   CAAA '! CAч  AAAD! $@A pY`&aAD! 0-,Efph1YAD! òeEUUt "ABn&J0  ADȲH eqKAD! a$2X&_}f$I|NAލ*@A0,@2 V^M||(A}A#Duuu f;A| g$I}@A| gDr+4" CA8[ڰ4M,4MQ8 >A3Ge"z^<dYA| giItP4uLS! M"ծ (} A= Xn|Z7-ݘacIڌ.i,@ 0 >AOkK\f"R-NGg'~#IQQQ躎$I>" CbX *ph|DQ @QUura*CA$LF(oV4U;m*Y & JO4/~^޽{QEQ&ӄ "N46G}M;ąȋ ل%(ޗ?}zeӃ$I /|[n9!gdSqNp:u\W4LVNHNMb0 ;9gln寱x; >0"IR(EQuUU?R{;͕$r/`ہ|o|+_fDPUu 3§S'g Aѧ&:kD?ą+peY<ɹ8w)2N$SDp8Perbb#(\D;e$%%30k,^~e9p Ii~>CVNb,&qק&EX CPE z$s1QQYAx7 V^K/7˲?#spB b~xqe@}}= _D!r40,LDg0D"OyktEͲ#Bi'Mĕ@VL,S4bɕ ߶HW_}EQ;?Ouu5LJ1q_WU_K.7KuN'tM<3nhhhM4D!0`iLoJ_ 0`L24;]eacX|LY$,zHςL,:9g?[og cxug0?jLdD$t5)~Ok"AGigLӜLq n7477sUWqO:L̐9tޭثo>y^/ϵ^5\Ctt)bΝp 466bСCtvvN 2Y>?E1*dn y'e%W1<:Ĩ/DD7hmc]H)r;3#։_ I1 EiZȊK(aw(KsĿߒIxŗ_>IVV"NvB"`)a"D'䣌 pSM 9F.~p(֭ވ)9x MӘ={6ŴipbHODTddYA ͧk M39z9sg I?}w|Ɵ3[^Ko1zYv3W\Ann.O>$ٳ q\D""۶m Án' b.lH~~>v}:'f>OYhY ^ aPQ^(Qnܱaa*X;ƅn c;ƗbYoMӊΧx,ݍtӟ;^-mVE$=eRXf1yfjRL9lXV~1aC>&f'%InsRUUEll,DEE,c٨/ ֭#::0޷ݺu+6.r.]Jmm-mmm߿Mvv6eQTTҥK9~8vEtŮ]hmmϟ'bxx?:tBN(Cf&` !`CXdbc^z"dB ݞ^<=x{IL# K|F@XV$D>,ice|M 4e 2GMs&I'FGg'6ՉM(7ۃ$:: MHII2 CDEى %p8D"ȊHtbiȖeISQYET]=i4EZ'֭` g;^$L$L]vߟy$g?f[2bhnh b1(RS3 dI!9-3 l3XoK$$$bttvO8fCdb06DUmuc|x 垭*r bVZn UUپ};cۙ3gHf+`tt ~ߒΌ3&g= 0 0UUUs9b:::rEaY͌3BPZZ:dbf4M*++yꩧ(**";;{c}b)DJDqƼXqq1C|ȲLmm-Wo,۶dw!LT:Xq "vC5fg0kI"=7/våKHw`:j"-= ߏk22K;PO7BtLBVT,IJ !aIٓ(/?H{[;m>RDEV dN!Ke^WX2 i?XVJ%:*M>!QuMT}4A cK v0¢tQ13Pm#z. MWcw[^~7Aͱ*<]0nmlpǎՒ,)X$/Y0 뮻MMM t:gÆ kXEaa!===,^ GSS{ᡇb夤Lطo~2n0$%%s9T92}Æ Ynx7&##I6ms}}} ՉV~?7of֭lܸqr ؐ.3NuvKJJp\>~o|^d:٩LdeϧK(q,f/+.GBZno/ ȲZL223D7"$&&BCc-?BDװlH<(Ze(2Mܵ` Ĵ4b``nZZZ9V]CWg'))8\Q۰,6_~@̝3ò TE?<@Rr4LRz*`'1.7䧪|%$+p33KW15Y?bh0,xiV?S~ edgBѴ,7ձ`lrѻX(H 6:k֬Çm6N'~b=JGGv<K,4MbccYx18q TWW#Il3qqqozk={6466{n222p0c JKK9rdp"ןfx|?{^f̘! cpAZhhK/Y6mc H'`eQ0%P/݅3ʵR<~sYx!Qz[ۨmoP8ͮOš 4-@s& iarpuM XDVf9wCUe9XQBUl'H=Arrsxtvt0dn"4;Ԑ% vLmqج<_@fj?]!I2m]{8im'ڞ?F(fJ"|.fBGV(;SV*$IÌiax⏜{*˚iosW_Cll,-DE;xyˋ,YEeUTjA۷W^yu/؈$IhFQQSLA4mۆgƍɼyPUc"P1o͛QU;wv4MsrHnn.settZ1 [nꨩرcngdeeM!,Oz!6m4WSOMx`0Hiitg覉i$vn!p12RܜnaIGMvc:{GLB#\ugNctݻw,/ b+$kiD% %=Էi#tKVQ9XVC(d2<8DvF ZHNr$[[_x4옘jWT;1DNjj*1 ,7A]јQZ~+c6nuTf.ufzLLk|y֨":FÌvaGe͵t5Ϣcl_VrWLg/H.#>{UfΛFRy/@-B5uxj ̞1,q8]Lci$ꪫ0 =L:K.GGaa!o&}}}wyN?)))+b۱,>f̘7M?NOO?^ 99%P'l̙3"ihh6mڄ淋={t˚5k0 {N5ϟSO=E\\|cAд03$YK1XsjcYplXF-ͨ}"2 ]gd݅OPu\LlL,K/%%5_DZf:jW^uu" fXg?ơ*ں Cff>%aX2###''6@7=/ iI Ǐד9,#.>g bZ\bY'A|r"Mjxa$VəWN',8#nY& #K﹑~/Fˡ%bIOtC#sμY8m N.YQd:6J.߫$IzɁn̚K:㍼N"zVщ%xɦs/@SuGiN?- 5Ccx:;E#8]lܷO(2<ddd`&n5kPZZ @uu5y睇atvvK[[PS`lقeY<(¾}p8s=PVV_.\HBB)ˣYp!f>Lcc#6l`ѢEP]]MYY.LLӤ zK;'_Agԣ>ߓAZZ(3Ya|| iȒ X|;a* x:{5IQQ2#a?.EiF8VSMP ѡ!L_VҒR6p92D|薉*DGЂAj`/چf#-} Y1D^q)QZ?hv1"')?ĖG~F_0k _|LāZy?ao}. q:U=lO?MTTx\~ATT8Ǹ{l28r555$&&?n3{lQ,?9~. />Ͼef{q"4V32Gyc= Pw4&10ôTBII4eij3<MX200oE 73OG+yYd!3NgLGFf)|ۈK"l6;eba Qܼ<DA~WmlL7#=-4qCߐ_8Ӱ8;D$8bQ*_{Wr8PMddUaS8)*'+@N#} RS6%YYN-,"-NfE3sHv+oxH'f׷DU|QTYbx:uT IDAT+88E^Kd>֯FQvW0t YyYg7QR]dq_BEېA)*vLJ".J4SVya#:ĒɉԵD"lݺ  BD"N'ɓ333b``9s#{#IRq[ӂښnǐ$.\n)SЄ;6hSq} Đ௿}!:g8"?ʀ  8{7s.#LJ,eEX҈z ? DG"aFHLG kd<^t$[̜5Yf O7w icܻgIdb/ٳb =\<8_YPf.ƹs 7j&r8.]e]Fcc#\.l6H!v;Wfɒ%x^Yx1[ldGuSNŲٲe DD@H\\/vDyy9===X p5׈D\bb"^x;,oNMM 9rYCQ2 )nٰǻãx[/_ZgיR4K9O*xo,.0|vpTن,+(NoޱA9)bnt=IfN%6.^q8ccutG|B.JrYd O 2)Ip->CGtTIdbJ]avQd/?~JVf:pd%('FXM 0Ubƨ&%%b’bYƧccN+0-d fI2&`qd7ZȇidF3wF=>Sv4(4 Gd{0".]Ni?`1GF$Fػo?UUG8z, h;6EbBFӰMC2xٿpn%55urr~wM.pb ӕӹw"]1{`2%C20WֳrZ h]6c)2cT<@DA'K/򨭭( \wu`x^rrrxgW"99^xƏ~#zzzNTU{W_}ǵx$$$p=K/Q]]ʕ+O àc޽? 66VD%$$000~ns}A4"HMNp`E "Ȓ TMAŽw>JZ^{Qrf>~`o/ylذ K6ٶu|˷1,[DGW/x=2dJǕ&MG{+3%lqsǏ5 {[2 c,` $eQHuS'ӧ!P__O_'}$%)tQpz2RSb;qEť2S:r=Ԅǫpk2m!!w_]|":Oy<(UV+f,ZD$$>)1ܮӚ0% ݴ8R]CBRvz]w)  [&Z֙^FOIQ.cҋ3cYvxEV༙gI;eW'F.GFF׿!'7oo9 x B  &>6'}oPYy J;#%RvpY,]iwC\Y9*XBzs .]1O/ bqIqc~v!bNx; TQ7zO-((ꫯ:&??X<mmm0<<ʕ+[hoogllwMtWSQQAkk;;O:yjy__=PsN^o$Ae03f`ܹD"n 3"pLBEE~\@\\i/ݚFuu58RS? a'Hu 枫Ha+q BbǮKs>ϦMdZfm̝:TCe'hzGR4h&¿ueI\jjho#&3q*1{51H$tW4MQG -K/ABR&夷}sٽM>..H͒Ep{wws7 旰`el!Tk裴o&99)df|Q= d'`e)4yS&I|3qҝ>$ -#M\\4oJna8#z)EsCnH @2,t#txz(gv^z`@T3!(zGG"YaJgxh{0=/"|]ikhCdgytm'~1 /QXϳ}Kifs:Bk0wLZ٥l, -ae>֭]K}}#iQTTY*߿NRʯ1cb<sNFG<9IX $ 06laIXAn[T* XRA lg|::=R- re`$񠝚C!()Q[_KJn"C$dq7EIfΚEJJ }}}'0p:+gĮwQP$H^fJLHMIg۹ wF<=zadWȗj\j&P$HKK/?Og&Bnn$}Yn6cdgv'ᴻhk=Ο{׹閫ȝIi3 ِ 5X'%B832Pb("/>VR3s ?͒$S?OmHƬY:>|bobfΜiʄtZ껰"!2RM7x=v+#`0řx@nh ,jkkIt*2ES ҍL+)$##)S q$3LĤ231rcv<Y]U:,Dt4͘G4ºa>SlXf`{y:9.kK*XYtr_)49.X-9}m#<؋p˲#$OKK 6]?7ow<zR]]mƮ]$ EQp:̜9˲1"`xd";"e_XYY9Y^~46mĢE?>U͛ǪU> KƮXı!oy9N垻HeU7Qi<jA6|e޼Ede m8B噧q'ǓDNv&O?$xY"MUpٿo_ +_>3tAxZ ![& `ɜu,JOgy1w<."|>;̼s@V~CL)嵗{+0%*R~bAOk.0-FN F8ǂ琑4{ Gl6]26dYd^yu+$O = (Dj_ˢl3􏑒B|z2EP[YӦ xRT4ڊ\eeddHiuOdYf`pfhT݄B>r宻kmB1w,bcc2u*Njj erչ̜9O/6LρM M7  y200- 4& o/bjxx_$FM\3IӓuITK~kSwlȀFW1azF,99qL4Sr322¦M1cG4~_ʓ|;?G?e˖qc gw/~M0d$$$LWbٕ>Έl6###D"w< zQ7IPo- -8]#>[b٩n<-xu3A Y>d$S`4232&A orbk09R#6|?<8˗0%3gg7˱?E9|Aub? ,ٿ?99YxL6 -&33F\(wט> %t) I'PUUEɌtvuč7ބ$Yg-}iډ`C L Ĵ,,$,I|⃉e('^` [[mҝ>ƌQn^т$ ߕesTq"~(N;)F6wz'@D@Յtе8?ï!9iho*乃Ӊiޢ*aŻCg$>:닱$A{_!#* ,/畧pMmgLQ6l@N[o;㳟,&g}i I|_䡇:}-y…X,0#IR>XQDT6䃼)@۴iG9W\q)))<Yn~뮻35+ʙ={.##na4wìV;5o 8"f_18d,{.iz /,j7GX.,Vpv8zk 7|\WQ\TH2B0cc~[O0tbCufsbÓ$H$`HlJXT ^Ec4 Fٽ?|?wY|jbQUuJi $,V vF$$MQQ._ 2$0ʛ>F3+)`A$b2h.?уz˝T͘0CO|$~s`H$TMFň͙-Ȳ:=-; PGgS=)6@Ԉ`CsEQd{륦nV ɞZHM[DOo/K.&ɛ(d2#I" ]_|M; XLEb8>{ՇY2LUVtLTϦ?` Tt[ā:ypuTM`w[&?\őd+C8RT>͊Kشi ˖-0ϲifH$BGG]/ Odz뭧ݳ`DQdhhI0x^N'{ogժU|{K0M6O#//T}D@}}=EB#$"I"d/^i/cfnx, UW/`y3Y66m؃k[8ڴݻ7P9w1p\f.#GDu^xis]YMFƆ;BXflV i)188dB@$'@eYF儨'+' q^q͎l޲o?o0DwF}\z0XST2V?h%Dg .aͫ/w?)0X1d4QOV)\:{[ DcQ }nŧ^t&."Nd4f |%|_EtI!uu ̎"J<7CRvgztXD,:JcoWT `3qPsZ IDAT2ҽ477Ezz:!;;McժU\} /++|TUehh.I7n+Vpwpu%肧?O(Biii溺(//'994K.M۔5&"qБt</\ln!4ln1/mNfz[fziw&3+I6p'fV]輻n#wenFVױ9vh4(H|3 R}ded3<:lIDATUE!E^^ G~֭;زeV,cy̯Loevr*b02(%n'ϓ[mfZ4 t#㘙ON^%Y\ptCÄa,vCMKrH?> JTfx$m V ]SD"1 GuR=ChaT+QBU1Dz݀Cscw80I19]=ʫ躆 tRٹX`>mǏl2RHNc6|Iwuy`Zfd2@@NP:_4с7%'ڄLՌ coRs :C.VhČAP5 ZʒgJ3Kc])~+#!/ѕ(yvY5s:(JeNLLJl"';lܸݻwvO~}2\i\wutuuWUb͟?$x ֭[GZZ6 oڵk3g>o*@l*>622 gO?M~~iߴi7|Ԡ-A`k>C_κw2]̘._-m;č7o~ABcȒ~_i4!f|h hZ Au Q 2$PÇL4R3w.~'>BFf&P?!V_͢ obt!U%xcRmh<`dt@ qs܋u2DAfH>@@qFA_ȷAV\H?Q`s%+QuG_316par2||cY(0aAI FJ- ,[D3'd`2|>֏i_xh$ݗA6; ]KW_d V! 2pˎEN!Qjbz5lݺ4+Qw|TUU|-[Vk¿{'0,UfΝl޼믿+WR^?FLJ3!DL> OC-O8dY dcvy5O|v (1Hl (HSPBQQ6rH0;wO 1I aps;,* 4nhhZMװ(-OGG͘6PYꥧsR$e2;7`aT@N|:qNY;,ˉ brsH/KʩuB=g4Ͽ$7F;Xd+fe^p [j ;,z%DE7i6jǀHP%o_?…'2cag!bvWEII2I2<ڏlFUMN_A8i$FvA nT'/9czAr4D$nD 4R1GrI6IrKN"N"m\nY$mD0H"N{uy7'ϽD- ". e參J87S`v$IHg ?Y$48?h#)C=JAhtb~W;(n+jZ)& <9c=C>(?,'޽{1lذEQ{ᮻ: /D4jkkO;䩧:/Ł`4M{%$I 6 0o<֮]˖-[+Xx1=);I} |LY?ţx9S{Ǥ$n7gS>k tm4q.\Geۑ>Xd$ ,r/~".| wSXs>;B"i24QAuUp]L/qPX0\}ޱx.=e+|yNt:Oqb*IE v2[#C\Zkr:s([;&Li}az@hԊEQ&T%_s*m#*/gpÓ#t#)fPӆj#bک?{ ]1IBG{/Va6+f~ .1饳`|܏lC(`޼ I6PXXfMg]dYD(z4@oɺ( DY?2$15fʸ,!tbL1aTbn2b'6 x|go-a! Q290F87077JzB=aSs輱)q@ =za, K.<(^f =]w3D"wwwqGbHNNvپ};peK/aۉbH,F2334Çl2Nڜ$1L:>`}}}ѳ!GKK_vFnNE3 gxxbV%*yh>BR _b(JQQj,j!(s 7%\(<-G]DQh!NYq>)ӆ:؃ԴL]I'P:KwOd=8;*֖EO/@zYug5R3`2Z cGA1,' 0LD"$Im6y***N=F^o'iUUUr-ʂ HKKd2 0444P[[K0LO~>lذ/˔*F]5>`555+/~AlTj(J wWiLdxwͷ= l:ۆzD3Ӓ"81-t< 0::{B v .8x$)^e2hmm7nwb h틨r}k8jnJALԏ%%%Ο4=tuJ3&B+Zٳ &"s_<0~DPP,yvCh[pړ0LH D MMDAqRS{Iru4Id42#DCgRS7hqi5$ˑB.fUL3'8L?$IK yF,Yw72gN%<6n\/k~wn3ǚttTޞv/^ dffR\RjM,h1}u{<2_`4M lhaNxEQb?dwmmmi\iro[h-⭷J ?{l޼Ӿ@t:h4Lkׇ,̚5V0TTTFٸq#֭c͚5yx'OM3L*צO?… csՔό)q۸u '_Ȳ)$!VH}/l[5rϢ1ȧ?=fgЊ4)ɆݗB=,t.] :[ɴa800xpQD,KAn&.ORb-|T5Q+dX&3#δBIn!Ed$'`z^]af0 #gu=1 8td]βe 8z/ܹ7^~Ppm;olނ, lƼE+$Iz)Gwf/uhQTA&^CA6J躊h "NUP ~'<^D)QTM$;]$3@k_o5me%<]`,~ڮ4T-ΜxzcaU^x7W npidffxXhi dI}w̛UW\odT̝Y(ì<b"V_w+C;}hLI%"I hUAUbL&t]Cf׻NaQIeSy8A~B9U DTh@UuIǗ H '?wT=;)ZѓرoyoРDrpQdFu2B:Ҳ3ٵ*>s>["5= =mI5]@OqebqqTUnwpZ16c60͸='Y`0&R PX67\*+L!eƍwP[[G_288+J(Or$N &eUSpȉς0 (J`G#'_sJE%d?!"C~Gin{*uT+JqX J oCO OM}o tM,u4sF K&z;ΐ0)Db2ۚy}]>4]@@C`hpH$cjȀgGGH$MX,v}`0׿ukGz,s#"F%K BJ4-ZYnpH$µ^Kjj*۷HNN{AĿ;`=z<裼 %?)"S f6 BȲW_,\^xᅩ?q de! !r2e)?;}mXF3}D}m-M-)/CdAX/uw]j#ߛAC1Z6opvF;IsƜ d9+33&"Z,\r&_H+.XFeLfш?l5KQ>A%M'#@Jܫstf;}8=FFT0v$ z#%$&Y0:d%W$!G맲@m.9n3:ÃGuPTfD'EQpA~~̞= %h;[$L0ݍ{XQ}J=A@dQFD_T~r,K ?=1n1q94 B1Ƀ|a~L` [s[ 'C:a"Ӥ1s+KvsA @;͞90N}*~ˤXMTU-dMm 0vz{{7^Gy1yyq:|ߜN,Yс墷Q\.^z)̙C{{;Q^^N4ٵkpGcc# ''vw*>z(mOS:VZ,f}DB6(1e QЈy˸tJb[{1O<^W_EaV6JLUpH-y%T?#".~b7&E5KcTw6FZ:Zs;Q2i9ab߮x$2yb`x0g6s{/-d"Ġ ̙֟ DVn_{fo֫d231G~~MAU"IUБ я0{ hEU0JT$T%cQ1E`2T4MEz5d"I" : "qBXAH$kI .B47)q'`*8Go~Z=pLD< xMciTE?Vth*a EE픹ab\Vt9! ij("4%(RPP@^^5558nv]w/|A@.rm%f!))&6mڄff( TUU!"ccchdϞ=y睗5 㩧BUU֬Yh}l |EUVÞ={8Er>=S_H8B'͌}7NCM9Č/f(x{س{l>ܦ$?\JJMXm4na,XǿcR3 8{S{$B87Xq6d$+BzD7^eQ\>-.lhjQ~uL(ш&`[=WaT=Cٳٳo-ϫ/EOKPVQ&A z /Uwy,}d[!h13jMw M `q;l.cA\hYЈ@Dc|ѵ(fB  Ύ[-7s`=.(1>HNVY0l!0$'y[F|d@{?ܹs5k;v젷ݎOgOIf,s|K_:E;`ى~^M%K*qA({.ӧOvQvfvx74 ̼y󨨨@ 9MwV0UvunS\\LyyɍOQD 3j+V^NgO^},YkbI";m&g2n@C1 JIRe^p5jKDGD=e)6Qn$hy{$'es_Φf"1ZzK0`gqFBʟIf/KethumXt/@Hw=sHr(z ڋя q:lx"xo_~. )+-US>DIMב1䢡 ""*;HNvaq'5͋d 5=1y@ }D#?hFDl&99oo7/~ҥ1d6;"2EEӰ٬~T=`bQ:k6D$5O~g~o$ņ$9%JO# # K V23 hz};c;VDQ bd@@wPxF}]c<>r1+/*&=W&3 N㐋Wc[{&FIh)"Q.--{W$BL ьtG26s74 $% [TM@G5݋kfk;8KHg%0rVJD~~>>~BPobrE9]xs%eQ4#ARdh;աX2w6c[BλRSLyo czٝ0?  b@Gk>>:\8ø눈  7ٳf266Jzz휻1Y.~־._|۶mcspT-F8ʫ3X[DZU5$ID@G^ٿ\ںB8sشa+Gjj"7'Dݡh30dТG t2>2lwq=A&!Ir4G&"K"~n0z?GrhHֱ Y8nj !!Eƙ6zV>; _~<yj vg|R 8wqsAҪaKҩOd4&u>N|ttt"wu.?? .\f̘(ZdIb͚5̘1^{}%6(1}t6nH__j*zdee+Oee%_WO jL)); bl.r|L>e9 ^FKy*jNc欒8OI||L>5 $U~=JcHұz4rXg"=]$sv%3pJc“޵E\G[s]ȘѬvBBYHٺgaF5' <4o2ifTJ$^# ڸĚᢹ5&EzV)^u$tQ hth4!ڌx PE4'ULrYrp{ZvQp@AAu:) ## Q7$ӊ廉l&itw3];Pkui8堽a2YWOL ^GG<74k;ge?`7b ajAdF19B(!uz:طs;-MqzRHNMC OBꢀ((bv8Hw.)eTeيC$Y"#2OڦLr QjgPv ANv:H:# hx}>Cfd1^uс*a7(TE5,)nE i1\)>qg&i~IzZY?nQ'fuh4Jee%nMknYin"q{)/3h1p!&}n<Tͥtu g x|\^xG@$D?mRDЃ6AdGpCm3df` [~'aF˜VBcL i52P @ aUn16Jߐ@fpg 2E9{f% '~fqbn5bHdl%N(Q~ԘH@%262LW 0,5DA_=G;Սabxymn[Qg;1`?A"I  (cK*L,ȹDY[43s㪊$#G }~y <'dy6`!x?J0bE).h|0lI$9g. o{ӆ I2xm.Bo`Z̞iĶڃؾ}+V 1m4ZZq ٺu/bcFη餪j.fѡ~3| d9tt'&|/O:C h H!CR'vh5Lq08gb4lػm;]*J(p8((?[Bס'Fq47JDc&#[_ @2V<0fB#?JY¨H[,+捒twHARQ4 M8ЖkSחB}!ARq#q" 8@@aw GU CHr蚎ihR yV5"́G:ĥW^M;B! cljB01q\)h<ǥA&B,#ͱxt\y֋7772,RGv=lќL2|^n]Ϫ94O"|j@1_X˥|J>~ԧ>iZ|sc=ٸa#͸K,ә3-Rr/ R-'+Vo'LCq?κu8qll6>1nz />)UTe(͡ Z]n╍&崹ytl:#& *15;{~BD-Υ8~D LLR4R98b2_`Ws*[&_ٚhd$;jȧ8ȕy-c}'98mQͮgöm,z%& s<64+,hM1<54{~YNy/~KNo&w]&' ,яbY&O=4[neSO4ut,J8d]gi+ BvBC\|z~o{2+{c0h񖷾=_)7BdDk&3>LUѣgǗ͂pP%Axbr3|]|ucAˁ̘xDqQ twu7ߌJeanfOg?KLYW7ݻwsM7qq/bRJ[q]tV\f>K*^䅙)N>ߑ}wIxgol@umie s9'Mђ}?݇hHtgoUic~nbxܢ/sekb/sg'  30CL̝{Z8Eۥ>jP]2r~qm#(EY_P@Iiaϐ=Si$A`RtBH)'̥]u[X.F 3§ɉIq֭_;> dC.`xH8PF–PIZ;Yf L`nMuAeq H(L6K.djnyy8g۹ q:Z+hmm& 70RP*ۘ\v}R2.:rUB+.*a %* ׾ . B suaBzt{?m6,KEyv6`ώ5-\O=|%(ʾFХOPX_7I޸otn>ΖiyTR"|@7<¹;ϩȗ{Cdד<wqe&%VN2daa۶q]kx:+l^=$bYaf$6@Efg\ю)P\PKjM/>C}.p'  jjn5^һ{~&d\ixC]FHԷZ#Ɓ[e o8!ٽ9ʮF(I<4I̔<"Zdd ҥPv&H64w5S[c=__)RO9:LRܑL IDAT,]]LMDL9gVgV@$/} /8!I6"cvzinĉc?CCLXEE]d>կsWRRy#%5oHH0$zhJm]m %xnnkPBH&466w{ݍ؞B,_Q p`13H]M=j-Ӕ8(0+ ew~EI(`]G,=+cֽyc^d%s BCM&,S@sζ ̊x*c ЄBKjlG49ųSI S36-T<ɲ,Rtvv>,qyK{\r%\qJ%,˪ް**~(E:##aC獇y<뺸x6aۄBaP>"f"bJt+W)1$(@qfCvqo?h.uod Xa0#xM+hIZEMk<(6O"KQ eL RK tIrD::?=E&oo{Ypc,̗i>ğ&nڪaxDg"P~?byVKSUֶwz(,*8S%UTQůkI{i w^'fr7RYr.hkj")]Z.Dݻy[>EsI#;3Nm剙A֎=v?mi>\68 If3q&q&Hp牶аD'3;G~x\js ^ _`YF]ؑc|I:e2:"#;sN!JMik"^lahiD"dhmn ř^wO=͵1#qnf\%xIRg#"6#_fR)r%Gwv?#K9B ]705iQ <~&j-?-v!xe f_W3%5E&Qп< nWCcm|N] #14~};y/&9F"X&(P%>/uē>QB1+ZH27d(gu\Mp7ɟ]]5 QХf踞ċe5!B0e3 ageBjhUQEUD(•cbn|j~er])whB_Mi 9oŐgn|uHyI 1&UN$wyL׬`ԓƎ(?+},@ Ʒw`W_DY9zT֥Ml5}aR~QCl 3/4^1L4VJ*Dej6Tү8\pcxhIj2 m.ش,'Fٹy M,cjbZrR cd,d4-M8t-3>=Ca2451"8`ё{ɣbD7^zU:HXMTH2VB%[!&F9hi\ )z%(6aK\D X =N/+u]nR]R4ٙW W(WL{ {2 BqOPwn:_Dy (9.=lOOP~Og2J8JXǁhXW>&=4!($l(:0Bdm s4,M`E::?Nj^)Ph |ʘ /m87X&W%UQEU*C).xX;ľ3>>q|JW& Pe4 <}zde[=afMJn\2 5w>5t$1.&;q沛! IrNԔ$G|\MNocpBt: yOSf%h4Bo9\k!GPXSÓ7/}$hyVP.MjLg)c:[6B K&gI5j8sK5ΞK}9TyF¶KYgf5|px?SZb33$B4gzvS B>;/iPR.d '+6`<(3#e19IX0R*s{-cNP  zkb(F_VQAL|c30L.zxpP+Д`zxw+ouGBx<)zq<\nit O =<&zviZ"͵aZLn6$HTAUTGUTۀǁ[aj pGEJu0uq:#E%m ο~ۼ-g#Le(g_sJjѽz%K9CֶuR{e-e dNMG8:4LXix̮Lв(٠xt}B"fϹxZke̽O?u2$!(s y It$l'VR9d(Bq00iJ$(O=7tL .eOD,B.reS{Յpr)уa"(m' \nR٬_h$E(!z~xhoqV^ͱc{t,B*"AP0@Xf(ou8L Jy"(pd2N[c sjhl wrdT!c(861 rDlzS(`&+WLC "L^{HqiH ]6cMœ[ ѕOwghEy +VwwVT]B:OHe򌎌[Cv1MhS(E(_)|n_Ojt72M$kUTQ%UTQt)Aw{xjU/۷ShRN3ǩO⋹YE5:.޹:WyF&ζ.`!'!.^O%c$wЇ|酔r/,X⁁!FH`,r Cuo~0siJ D43RӔ/X(=f{r5\ǿ}p'뮻N;UgΧϜD| M GpXMY0sh(.3"gH9BJxGkjf1Sbbr kųO=nř ? wXrٶm|caVvP e L {ReĢ!3 ZKwg3}'M Q* hu0n5Ny͊DAI h2Yx^D+  :HcCCsefa'\|&ʅq%v8vCw0DJH4J$5|!%V~^>i*-:磊*^"~ޜ̑=@z>THG@q/cˤ7Z{/Wv.Yl~?'0f3sL }Z. -A F{ԉ{>Ϝ8J4U}|`]$709xh/w5\g{OF9qmB3XQG]2 kpZօ5z&ۓtm=tvع<4&ac1g)]Ӄٹ4q7F*N)ʎi;"@O=ij D4\Z ChMpdhj˯`sKp"48'g8yJl:g5bdMss# Q؅+;w 7܄I9 xH.,+x-3JW6Jzc}b&ehX|x<MOѶ=RJ(A@9 C(e B74AMbQM/j|!i V})Y+UUʲRO)RcEJ>J>^ځ+A&}$> $Ja _J# ƆMh(&''9qow5w4Qvp8+N}0 5ؼa=zfƦo{'GX*uw@OVk'<36Z.<+,uhX.H4P.t`(DX ׃J!SIc&\B!_*" [/u^^Îko7u;dy8[9R7_Hs#u=[iX[)ʞB74 )=z1.j̀;ΧaKE,&Y$iF<G}9w)֮YCm]-3 tv^6{($B4ő|'Ey. 2hr%~}/{}޵\ s94MI\ϣd۔J6{ 8J*Ad-i FE6&ϱ[Z;o>ȃ(l|fZAMC\H],b= D0L Ϥk$= VX/" **䣊*c@ R"QJG x/KNwpxb}1I.8< =HOJ}z uraM1acL/sb|~(_rxhpD(UoAJ |S b5O21:,+M8>;O =r}_x:,"1"56̳\~݅hDC<ߴ3dhhx^%KP} 2i(({ l%%eaHkah XXryn}bfM|֘$1nFIF!D#3Թk|W|fUQE|TQ Ga#H7d%'e/2ԙ} &Y~]}AD7 N򕻾w/7r sױ}6N 089FT$>ԷԲmώ4]9W]k_fdx ``6@H 31Zj3wũqSJIH򋋸EM資.zlY]ɏ V_˦6Ѱ|a'(e k(I7?z _ȧ7%7/# wjt.bu| 宻W_]wL iL 2?FbK/}IKBY:~cHLzy?ŵᅤ55yAVb-arNRS@zqM<{xcA# YFgo%Lep,Ip5pWp;hlmňLJhqЄNe"@ sCWWXi く4-yW` TEJTJtMu\NZXH4؊nfQDB^=뮥kE7/)7;>㌟zan,mIӴ5P1A,`(@0&=7K:a1+r"z E4DHL*cbzhk!C"]hR%H7 DN:aeO/N)ЉG,e;DH2n}ioCKcH *ԫtjUw:GPjD# 0 C )0{IM_LB&ڷ~'x%(Bf`xLϰzNo_tSd $u?h:9RtNki{Bz屓\BMW5Ke㳃\m~jn{D))KwtpVôBy/<3~y}̟T(.LRW>8}{?S<6C1=)\L/zb;|]{ضiY_A|$.`8YO=ɽ?%OPS_#c<ȣ$ٲyMM ]C (%B0Rc8plX]GJx~Zc IDATOm~9j4p\d˦lް5MȦ|}K.9):cqa y&SI87$SؼԘŌę_v=l%^ƕ7΋.%G u5x9Xr*/_.WJ|uPGP D qX Sӳ[aㆍJHh9Tz#L QΔ觱uzcfvZ:WtTXQCa.L J(JN%B>zNѥ%8%!d4S4k *Rdb6n6nU!{! vo_Gb\P@gǹ Ej$z4F\VD[VS]t!ԋ*~T3UQE[ `Zaj!W,&dFwq݈~eŲBR 5tA}2p 43U0F` LϲANWG -?k.i$L/d֛,tͨ y O-V*S=Uqq9MBa&xET$sR<0GAz M ]( d36O`ELƞNbuvb皵4#cNqf))m;w͛㠙؎3H)_rGJYZUr N4M)-蠙(i&ij Yۈ46m>HM%/]8dG03_i^ISk V4h\afgظi=+c#8X"lDB'K.xS c%0D C)|(-䣊*~%W hԫ"(B6O6},Du@{"ŻV^D(Ocxn*3@:(<:OazjBަkU/m]k)SJƱilaۖ@W*󒻢I<HןrքnJÓl`+ c4q(k׵2?f0 eۤ +bp+,64B.j[iH&LR ,dRd\_&H++Ԃ4L%RZ&[FA:d:J}/~vFC)u*^#Bȗ{#ASR7QqY@iXfͦ*B8B@m~m8J ^5C 5ry4:"]֪'@}y+_=v05ya֋ @LΑ)nJF Pϻ\l_癩NbFcl~Q-t[Lis1}v-}6BpӾƩ?urܮP}@}TVF`h"ҫcu8y1zx$(6dQvټf-^q%3EV(F*}/YFj'>Y|DxOP@k aZ% C\Q&Ƶ%YAM ){AzVn~ލ^X]9C/Rao=[[a .QG0n&W 4ޓ(^[?H3)RȿcDLg)*v#cfi eF֬ڷK^R)X-166Nvy8+V7[sSƹ{xͫo$ؠȥXhMlY#Xb1۩ӱs, Qx7nu/Vl`S[˯ 3Wӟ$Q^J~~2ֈPƶm(Bʥ"psFf\HHRFG;].rF׭fp ĥ/R&2"c$\.d?[~.cwN#K>װP2O>|gM ͓ٗǖ:J-+NJu[tu~Cl?xS L7l=>F,߰!2,z {'+sF #!.fc4RH:~HiecY6Ce;d4Ο+)ߠyABLS<@cqSއ3>W͇5yz +U{ |ןb*CBIDYB=h0nc1J daimzVb؝%I`"%"I ylA-ަ.98q'FpC;w[>5;~P?}},. hwpbdd0㣷LlPʦrO~&ݰ(r2SRgQ n7@Z= 37R-t#M9jcXHl$1`iI$rXj*J@>]x9<$zV }([\|R|b0V>c8Jabm gK@-~^+o|=E'NqϿ'ユZ;\r}|oi>%ЖJ L%K'%Ipd;KT.ga/f@XyZO_Z\vZl8/d?vq|&b0ę]I:-3pZD'p֩ḘA`S#z(eq T)]җSx&d'淮{1]"jTf'gY_ FIou+0#0;SQboxP>-KPkARD;LqHEDNZɖ%@7 Yaݔ#E)a0 Y|::d>G,a۵WW /mbo~&^ԢK>~O~꣼T8xaep׏KTFF9pW6\ѕGM^\aQv&yHhc2g}f}DH}R$A1<<[K(7-^rdx~r08؏Ybޭzʽ?Aۯ/H8v<ڬ2/?wGϚM\y?S tV m;8E{/v:3s!bt<}xN8͝}qKm߻]$͡\/ ( dD}JҡĴcaqpbzWmSw"CݜA=X |MiGA9:CFb聒'v|G8Xy޲ͫMK\yel\^)%6<%)RH鈴|k!֮^CjFW2U"4Ce"v>9߹-lav7t\y}5B|O(0|9VEO;(By3׊,?_ayÐ8q Ӵ m̙%FK|dĹ_ NoSlB񥆁J>xu,ǜ-!Gr ٬Ï܍- XLvfdjXXƇi%G}j:Vtb6qlc*&R)5LD8tBu} (L ~HqNJ ZsޞM K X+AH:6(~R"E|,RI$0\p)Wz;Xb%P"}%&ǩVgYmin[vƜekyu/ai6w׼XKƖ"H<ϥZ9=d>{mb"# .adfvun;q]qzցX,j+M)g! ^_B.T$Rn 8ȟTkޔp9>u;CY8C1zs,uZ EY#{j;8QTh#Xq6s4ˉ&:c7 k3)ˊ-6L1BÎ,H3.cB2vWFf!t1E8qMb(x$;2)~8"s4JXLo&tR!PH1#E)xQT5˖~ZK\.Þ}-LONRbժU|S4+GWqq?[/fbrvͭ_Z\' HiQgu+cnpm.t#M YJ+aY."-$B}`],"FbgGsLf->CH9}=Sl[y- ?|NZ :j!$C=8Rabfuh0qHRfmozfI72 2TzlXA01v,[/ ek RI(qNC#DkxH@tcR `kҗ)ttS#E)d(g,_jK ׽uf L|l޲}O>ɍ{-C#׮g gu]]kFI4fuL9(#M?8A}zx)6!c|zǢ^gD\ʥ\<-KxfB!5zo~Xk֯dLNM18LuFe){``dcQr3tj r'LjךLNU2qH!fBT\gnv%8ڣϵ!;n< sϝ733yh+_"GWf-{!\)H"%)R?EOcXp_?p#6syS_lE id$EJ>RHG)%F'z!xat5 m㌬\U?o#o|mo% Bǹ+Xj5;z8i7j֦yh|sorc;ebIC,0 㺠5"hNÅuNB`18.k3H}D IDATIڤERqq]( P@)&|Q8n0XMDBQ7@H,Ubʶ Ę,+봐R$--EPvD$R(t@ !clAǧ~~iz@9e٤>W[uDA).-C vz_\2*ci=ݠ_/}"+)/y̳3u!K˚Oc&#J222auDAD8񰤢jb\fEVR741 ~14 'Ԓ٩ xԛ BWByQ$,'!L8;M\7XW |Ç ΍’ضM>W`vfvb ȧĐIffk`Ig8I&#C /25(dm*k+mz͖ 1K m Lҳ^q[o[_$ d*>LcI:@" k_ l]wp]aQXK1V|H)RN>ИnIɒ{ #\& kWsHR)sd)G\FkmaInÇxa@Fh;iz6< .W֑+КFEhmO}NK<q1c JI(²$m\tBm/Hfk5ʽԚ58@\v3L\clA/|-[/brf} Pc]ʑcOpb Zv8:|z]NNf\ZΡOv!}! gp;/*^:f 3ưqf6v$Bm4c4M #F|MQ(\OBkW)DRYHaXMtCRrɪ(dl&R#W?AoIg?uj V4uj9FFFB hԐBr=n*6]ήvrѥWd^l)H?|?M)R}1ŀ{6htXeW:(6F3QDZͻ3l/ d l^2w=.uWpbX-qFG[˱qP"cUb0H! FA.W`~a1|+_fxx5װkT&EJI&رTUC#Yx@>EwDZ}PY3<9AR)PkQGHlx#CcǣpE/azz+WhY=[Yz*=ICʧ%t >$,0g>rArJ/:c|"aRrUꡯ'"Xdz$˖1SC"fbf"5Q;-rSwx; }Nk5ze=U#0ĸd`l|˒ {fFCYnXoG.tsl 'YOS1E?/duhDRP` %}93>~d{VMC;vYnx[bit\tvh`~b@!_ajf"4 (j*%FQD^P T"^6 Zg 6ԄQ Ad4adl73Ls:891A>#};naŊ!8C &f),gLN#BAcf4r6cǏY4)35aى(doS,3xpbamSNP.. V@L1FiT젵^$@/!%Iy^J8_fgNw|cG&EZ [+rKlY.vo,4Qh!R9P 6+rP I*ΒzM%Ěɓ?mVZMm'(W\2((KHvX FGL>G6i0Sp&:dM;{dY)R#E?yXb\/q2x5t W5O7WYbY؁ՃNm8SSDw\,azvv׶2b~cFsDa˂0Ķ xѻ]u6n͔2EQJ>CT"&''i؎EHmqLXIi*qhZXE.hELJoi#L1 `FIcq\75뙘~rqU+gt:E)V3 _(4P-r~OOO?ʶXb#'ƙV$^cy똙Yx^f\Hswf}Qt:!%o+ij7c@F-kabJa=NQawu;O`~~=Y ,R)eS.1h V^fx C MJzH⇊T"ŏQ ӦbX!iN&CQ gʃLUgYj%_5wqi;Hib~cfnZFK`llxNS\r٥d9Z&ʲN+ۙx<;=gqJ4ZG{3_':G9r {Cg2( i[8M"d,G.Zk,J)<[B`[ c`u|:^%m:!&~]{b| V~Nkxpq! Mp"%\H+lgF>z c-Ϻj3abť\.yBvAdrY8DŊLsٙ:Z+/#GKv?'?{qVV08KT`hhl֥\)Q*dsE@Jzz8Y,ey>~125k^dLi}O5)R#E|1p_ bMRԹ+||s?~/3XvYj;wa:G$}f-v5nv.h!_7AmDa|*֝E>&-5A |/~39Sڵvg )6nar((l!"Pf)lǚ fcpSeM7˲u1,u]˲mE&c#^oL% #RbR61F(gd2bm燸,~!w8x kVUncYXr RX\@CPP./gk׮cמGD!v6(SsL)S.119GoO?,C7@*E) ~2Ǭ5nAERk1_$rhq-mf>r(ﺕ_yY|*'Ǚ?Ɓu<СO>20Ї ̞8$LJF XhYF& ?K=yc9A8j!}|g}QAfNkc)IXMuv&1S?~2=J ,Bի(q3.t0QjA-h8 0!Bl˱ʠc RRHVE Jƭ5 !XȼZm&bML=Qr2,ML5RZ|ÜnVxZ6DHK2*6jkd%ժ3U;j i8b̀jOr2(;wkm4J&BH(Fk'>69v(+d.RFT*%BbzAv6fJz G?1_p9/}]u*)R"EJ>RH k]l&%= ]TI0=YA./g?#_|Xr%O;Amn\+w܃6 u,7ˑ#G)JX豣?gF1{tKuuNX0BC=q٣| cyGQ'y^ C!׉c(i:W$pl)%FPfh[aHlb,Bw+RvIF=( %?lu%\<ʾ;>5l8 %H'݂SDx~9o e8(ʥ!^{[ZܹHaxeN?1C(zbe?_tFb>b;.JڸC `c#a|W?J__A Q.FW,^·[߾m^KTD*EPIJ 2cl):ޮ;eeR-0{#ERy)~tr>DFZwM?,[IONThO}r\RՂXSR6iw#D{b 0q1B!26:]H`0 EX "P,RÒI6R077GTC)vgǨ|Wnмv.1r2 7_żwp~+1eذy 3'ϵ064(ٳoaAjr\Ba%2|z7QmLRʕر.pߥ`;i/]359NP`Jv7]K%VC 85똛;PT۶S"E*Ң)R`oK\K*AVdl-HQ $H#PBpdr&7\z7m[=Gcfe<>疻"_!h:4m֮_d(N۶ p'ĩ|<;cc 7MO8�H?Y $\)v0 tQ!d2:fjW! JZl. r~!$-b.O>ŵl,)ahCR5hH,Fq!crD&gq~򍏑);q0Vd1v^ ~t0r~h:7y. /{5d )2;"#eLX{LNNqPҡZazzK.﹃Ux߀5_ҿN> n T*#­7ʦq<޳g]Ekg?ЧT*͹XݜREVo䲂)fj @cv&H⇿]H9ϋ|}~2BtKe4D +фV|&sW-W_WgcC>s XNj.LgZzUWȇF*I͂ZDB>[vu1hl6Uh:_gq\f1q` ɎuvtK0fAE;`ۉ9 @T"c:eۗh6^~ JOfRc4Tgd3.^+0QblRA$^ a@~lۦnc88M{nݳЁu,0(4H"$m?6b:JaagY;}̇\ /," %ac<: af} RsKرA,Gccg,<_'i3i"So~ |87s,v@ Ql a~a:~M!S.ṘЎٶ*!5Fr@^G ng9ybM׳O7a%%Wq|&*E|xBGfA*d2n"P/|%XJ`)m KBGXJ "QpKQhal>GϒA+Q3Og (P]‘h4gNjN_zsL\Q1·};1h<0 %d"c,2FWx?$S'KB#lNDs9u](DA6% Cih0hcCcxBzDZ#m'q ϔ̓|>OQm[qthd]DD&H)il/hM^f' DFJuwOSN:ň^c4̛BabՊ YO>;//.^7#ԛu+^~{OВBPvePf] =*^q)A#!AS_Ȫac㦗;rs #E|Hx؀T RH1zVT8Q* Rl6eyjCVr8mv>/l\Vf.P?'SOv|ǟPϥ{A\a1 N(i5kzʴBJAӡRe=P($c֗!oC8&B<Ml [R*Ðl64MMn)Jl6)ݶĶmfLKB dQLDbtcۄq,R8&ɒtJޗ8N3r嶗a[91g=6g{|i\BF  RCdžװeKgF;Z5~3cH?tpD>f0gP{JQ.R.YnRDDQlXʱ|s_kuXBhцZFlIЪ޽|8x662]_R"Ծa&SaA{`R'kCH ), أYEd|Ib cH)>/DVp,Gځoz'o| ?>%֝W/㎬q K qRN_g$+}L,41D}r੝<^8B)E\V{Qv J!.>E5og󙜘 _p &>x/w+':^"C QJgg6@$ u\PcY ˲G}JhAܞ%#R(۾7),)"iK<4Q(p] \.!RMH!/<3Υ6K3g6vg^ 06]Q:4>Rm[",w%Wy{W:s,<, IDATO虞䠜$h.I~ `cc\c8ዯ 6$!@ hf4A{:Py}ӭIBBYzΣ>uTթz~ߵV{4Mލdz13z~ڇ* J~ػ/Wbqe׿o야@ ,ILQ&&*wމA_:/Ţ18_ 6gMB {_St;]ʕF8idǯ_r~mYcW R:;==a>k_2|;ٽg?oFOfʼn%1A |2#"S>ԇ9پ}+7n )%V 97eb(/DǭsΣrpj7^3ۊQV\)jshrr~&''qZFfhh(-};VuȲ0Hb\z{STqT>[aŊsTQ=$Lc% w~֯_ömzz.b.9<ʹ{X*ZIk|DM#&M,Y&lK>~IV:5O%rA]4?nx`'m 7~7Ƴ[57q#Հ/^}= ǻkVmݓ;|Wb9-c踖蘜qDkP d1lPרTlܸٽ>=4[_=op`V^C$²[)O>VDu]tE|tdXmNXڷ(4HmtEFoBM>y"W"3[ 51WJ-[c^?g>;y7=LSlCG,J4H=㸴!R,]r{ysI|u:j5 ӘJO/ qgq炵k!"uR"^fqASO:o$I`ZxNu]RJ7aq:#VkDa!GH4&SC)$HAW.QMDbUpC_O?Aq g"x*NfCzFFGGؿ?b{\uIÔMCdVgŲ(S})A5`rr Nw.cW00saHO @h/{߻HgyK勊^|RO@Bhbbܻ}س{sEDQ|}*=$}ûY0WΓCr=uriDQpżS֚jBBS(\4␠\!–<R(J ?do|^TG3U󡵞_M*0$XcpϼN9߼fJLW;6_wq /ijh!ӑcf?yqx[ZyeҼޱâŋ$s0(O89,(1SA9:[?̮/(T*a;s92RH:s)I)L8..\FGsC(h6i6HaA@Lgh*>yE<B|#BX¨M*?5lpX9a&?0u>&Gvڄ\p2lS c.yqmwn)zy\Hʵ:KU8ajVaf 6M|!KםNH"HAt䣋.䣋J&4hFXQjD` $%O>Sy] .=MrIR7`QL4u&g&H+)WʘD;jje.{yd~4TP)ɲ(g0&LN`__Y&'XM4*tjqRj*V( gjb,M }K$S3SVg'B'D{hE[u"wIb2C#$ia2,!n՚)/Dʍg3GSt>w]%]t_|B,<_uk~h'®[֐ZhmA YIG`rxl..f#`pϞ;w34BAAI~HÓՁm?[K_?uٿo?rq3>}}LMsϽwr/⤓Nf,fgas9~㳨Gsr$ݽuE]E]Т|}M7sg]E$K.K`ǦQ>kxq%="KV0(ܙHuy9@nsg055r 3 <7 lGYAeӖ{?&y!a}w'BJI`&SBGq,S8B(c}8dis c4ZPq\+eU&5kY2Rwނ(gZOL8{khXr&[ʕ+9OBy'!0,׈5 >k֟#2n< )} ( j<8ɭ7훩`/`xJpt/p]tE|tE\0,>U;J䲬o?x"Vݻ 6033( qc,jK1qiT+Վ:4JQM̳N睮t R22h0999g9q" jcFNadžWͧKYFaTX&;[X&CkM_?J8MBHM\B*c3H U(sPE~+y$I??8}t0媖X/U:4bd2֭%If ؿ;c;ٵc+XHW`#!3.‚t5Ʀ;_]k. ._d.ϯpqVx_f`q)8.t[7WX};xT"A[2ۜ,#-EZu(9u3ra"` )Ѵ(L5(aGX $~/yX[/D!V?rY>_dU8 dS/X4:nG0kI8ܺm`J);)S+0iۋ-]̖gA}xJ=; ONdpwO^usp\Ĭk kL,]5z,SOuR ZiL셴0 :!]7Ϻ<(G";'1ʓH+I܇BX9JMB(E(]c N&VvߏA>>?>xg2b_?I)Ks* q>ic-!wb"J%Tĉ=TkuWiӽ,YS"})ԓ$\.FC O{>֮<%ffyɫ^~a$€0J)s%q'w~.q$aA =2R d bim,c[O1T+)#ӹ&5]tt袋_sd3%u?/q'q5 }Y7o+{^ɾ>I0CI|YAHR*ſr>r눎Ѳ=C9 mQlbIVc_e5(W=&Im1(1K\ES#?uzzhaFn;di\,eǍ23; TI9ykwČ_MΥݚ&\yٲ.A cSZ%}A"Xp``v k\%Sj 33i "\JZ&AL_ (+jU4/ERzbp0W)X$& I븀Vc4B:iؒgK/kVB9q:g8;b {Eofy J*r+2'TUe/8^2q WկoxYg ke|GϘ I3z+=\q_ci,\ДkeVS - [4ݞ~l>#P pl?O$.䣋.xppn6,8c?ܲsVKW}Z{M }z73lџ;oT>K,DXˢŋ˥x9C>cc 9}LQ+zYoNe"J2^1)QRo8 xj1ybhܘΣSc ` A퐡a'IZ,K"uWd"sY$M7Ҕe r 垀1zʽDaBQ"b<GDH(|Dg4 (\JD1;=\ vمHDO#|6,+ɲ+Iq#hйR!RJ$&R)@IvFR1Bs| qȱ?80qw;_w?:NJöQ`;En2r#46SsCFFV1` lB: N?ϲ{#o$jRRT}_05E',.O`9IV&};E|tEOpɼab H jQɛ ~|ר52(+W1w0ҿϿb~go&һ9_>~\箭{Ŀ}eu$㶫Ǝ̇> g=r|8+>^eF+cyeoBb[|L78S;r,ó6|紐ZRdy$I:C#Xr5W~?8(%Ic,BjJdymu\j)ʝCZ QKpJ$3tRՉCڵ8JT*Ġ r-IIN!:FCs=&Q!!M5Rgmx\Zv0FV3I IDATJDaHP pڒg9UJyĚ:fRǯV(FPCeaYksC vN>wD=[#[?$ ܉%;dEZ(ࡰZc$-,,Zy'=Z9Ք罔'_߲m6Vq} q[y>-` } DyL$D5D!r).x!<@as<4X$Wduػ Nm3/8yFR; 䆓֞JN?$֭i7af[qͷ};/ȁ o*3͔W 4 \i$&' x$1xYr<)ܞm&<$fIf vq"$ ks=q]<#Bvln%il6i6yNE ^vލXku] S)1|l(frrk,XEiq{s# qP ÐjuLN /(K/ILLN5yNĬ߰8 cjPByp'yNj6R7 &r+Ї>WjBK-xۧvVSRs͕pnVK\7W8j܎%! 韸#\GxXyuހ%--%*hҠP`RtO+Vnjhj X'# {﹝sW@O~w ٷ}ozKyfRfdϿ^K}芕2[5sVxݿF"$@+ew?|v0{fqi~oKiʢECr7 wW}7]6ʒ}t|;mwmNH =JP'0vu6 RH1c[~p|l@Χ&. Jc*1;!C$Xi"nx=_GdaLC=i5ϭ`Px:jK⸖z-@g1Z80N|IZ,[i4, 91/yµ)H_g1haǁ^/+X*\(UJ(!#ІcBHi2)<JSJIJ܎B&бxUp\jB^o$` a /zRA,V6ႆNe' C(@v΃k5 4ژ"@a~PB"@ZBn%--FraɅE I[$T20Y"rcd:/o<XD>091ƐH2#_2}3.VhtQVlI@Ȏ.䣋.x`<ןΪ (WSQIs<@Z\|q>ѫxd*g|vD_/rkw/`:߻+Lһ|CsGxvWe"`zL|-4r;vFܳ}3 Rk,`ao[kylj`g9Mㆇq(uo|Ke |*mt|c,[Mdqm[8JS/uL4T$l;m¼I;HUV_@XJ| "b#}D:ڿ#KjC֑OYr$V:hJ "mi!* 8!,8k-u&%#Jbf&I)AP8ƚBp)$23$F)4f[`%cǑA)4IjJ%<'O,B;J=ؐ$ 8r<<_-COG$4baN>uK Q2YFM݉$ݞ01s0mlO׻$0$sZB2Zj(>78@*4q\3Bsu}0 c aX*&7ir=u<#KS0\̓CIu8Z\5e͵c1DzZ!Ғ }#Vau+[#;3NctP)UCZ-樿u{]1H]t DWpEh!pD1me^w}jVLH:AonG+Nd*'Z&ypVws a9w5G Zhw=ηyg?.|=0=`2Hy[_yUF؜x?FDczd+db O%I9\ϿM&J KYDy5rH2'6 qeHi2>6C[#+ҋKF( 0xwd!FYg۶qgsuЌ4ۼ5o~ëy ^?9i4BT351ŒKx/;uLyV.9<—<þlN1::4jrLhuZyI;D8Uɛ VRq$I'0 t뺅{W㘔jRYDQDe=ݳ8C2s W*Ϻ*|d`ކ΢9D'y8G=BUh2rcnc{۬㘫߳}ZE ׿JՅi;#eMvE]E]UmQ ! V9Fx姣N:ٔb3yѻQnۊ/-^Y1t@q?P6`UL9xE:PeO4'\FWySu.e9_0hx.BfuirHR#5Dc~5!$%x[t2%dljK#D]= ${K$dyGv?Sy/{61<0ʕkJr}68Y6KgzF|an ,`?%W3lR833YV\͂ h6<]wqމ/!N#[5}[)0hP*4MhZrCjp _r?iRtVzqT<.ij1Z3L! >W9Ha@JE\AbY)k$:#S_ÁCd\YkrΪ~ 7Xg $[6md0//Uo(塷f& BRX7E(ڷbG?+N\ +.^\pIb_O"~o͋P6۶$IC,FrLRi"MA8C-lAYʚq $I!M4if9duFsH$f!UT($i"̩ar.i ]X8 zBF̟7'KriFiRR2  ,ˢ\G tu],ݤ֬Rm1m6ic|$ AaFe#L 49Գ[ټitknh4,AI M(!QV% w/˗/avtp"EiJ>gǎy LbxcڝW}Uw Fsދf c/:xybֳ}.&NIe?{|Chᖸ Wr&2N7(,*=Vʤ1P -2V_y` v^|&GFٶsO`=A\F:s_u$I,0 q],A28NIXXEgo[XV"j]ZMA̙صk'f px}l Q[u];)>\x9# iШ(1::Β%GohQʆ=;y4 %e˒~;ݤf鶳8h 55o.F#Fq<4ADZJޱn*m\?WIRX,"Bg"f0̐?X O~/}KetuonӬXyyf[u眾kS(Oֹ>@__"Eϯ}Fp}=m,LBޥ|:vkCn%mJ=czHPoȽqL!1{j{wb~ȣ uX1eˏj,v˜x voN¹D_}\c {x=lJ4br!ω:JuH ^ıYБǑJi)DYJ"2% ua9}ںYbpB \-v/ٿo;ӿ'Wjr3,?hz7148HݥQsS>۶m7^-H{Oy f\KC7Skbsۖ%1=}= <i1880 h4|J}tk{n1wӾEWDIBXbbdDLNBb IDAT90A)Tiئʹ y!64&'+A(i͆x98uA6P(ccEGp֙5Oqտ翍>\Q09:Oo2g#dΟĆki=}}}MQG-ZM6ɖd0fٳccX4($Fj>ZLI-ɇLCi MW,EVJiLjJDTD퀴Ijg^,A328ϳɲ4K0M6T*lܱm7q˝kpW]u5-fD Oίk84S5`|a߁}4Ї>L`~Yr /ݻwO΅^޽{X8߿{?InIEogyGbQ)^q5w~8]#{Atx^'~y7FDTGC,)6_'߻xv!~F-#W80B ˴iiY}\sݿ%B*5OR,L'urI |(d$ QisMNit㵄~B6q\]7)4> 4ikk#bj2%|d(фvizAׁgZ'˸!m4&\;ED% A躎i+362F觜~),Yr U.|w0˗e-y0U6lyThCe41G}st[ o%BoWC8s$ `xx'a$DݖȀѴ?~1eah:q%|rD!MUoX* tE199׳枻Xan~JZrJɔB״_gs$~`3!#;@ΕHqwwߍT>$|\kyN6-ӤRreH__@|#_̱l GSr'Μ彴[񋵇}b;*ۻF5a҅f;>̩q2ĭm8X-?6^jQm}6ߺV.;!ϣ8mv'Äb<~KX4jgwq`0o}_ahBj>{eK^$(!?Q@!5,[diX~HӘ LC&}aȰiP"m搆L)t8ByA:v2S8NЌ&#tA1Q8feTY nd(("JV&nr’EK)162 by%ɲOT@$(mf V蚁$c0n>OWO7F҈MdsLpPus,KB!t9έp]FAYAa(s9GПKgW/#tualAOMʺgdŊ("D(5u쁹l)!gq sVS^Iymѫ)* k?xqWv0@F V%ǟmR}^RnGyCc[I҈R7_fn$h@L4M5 rDpH f0̐0>sXڇo坎ηo\/__y Y`f4m:΂ -/k6;loLWw8Vr)KH|cyt$޳/*S޷,SLͻXj%Ix>>׾&2sHcŊXp =|lƓw3>iп!MRlҞ3i7c^z!FzIo mG{ :j h:ʷSעKOtV2N9lE*(ߠ"Ų%/Y3h6?C;Ǐo<ɓk@hkIڌV8ɲ|@dLLS*&h4CL3ƶmHS7хM@(C'+&PhQ@( фF:#LNBDE! QSar"F@Z G F{B)L !t*%:IJw_A2::JDZZyM(2M׆LRM؎[CV jR& )3k<\̎]{)FދBwp1d>. ln5:#Ic}vJ EV^ώ-pJ dnvޏmq]h ʓQ[R_$ SC#6 WF[W!ĩd ~ctvvrhx?ZöЄiyD1$(J iSCYz=df0p%ksK8)NyEXVK߀x5s;x˛^R^I^ؼy#7ou{5I&oy+ߟ<#l|qftى-iwyKcbbbC Oinz|'׬EPu/"kuhFT@I (mʂH%s ,xjԨLHbh J=Ki!gMںzHuy%r6LE7L/Yʻ4|8N@It2uАd2j)4 t,@\`3|TaVZt*}7|TclܲW-x;+{qϓƻxǹ뾍z%GAA__W,5d`!4V,Ȥɩ': QW(عm-ccu;HWWׯc99Hms-={߸s>^y:t3Ùr漈.\-O矯Ĭ}3tt5hwB4ύw:i' Qc@5qEWhbx߸6+siPqt6$T9@i2@/SG~tcZ*MRrKVRRoVzSCʌ$ ÖV+XE.CduC7%eA\!#(AImhdRbT+ IEXvk?(HUZUI%$Mta) $a! Sph j&吥f%Xr0 CT5\+\4"MX8a%l(m)' Dh@K%2,E?4m[Ӥ1I2LDR4Cf RE31- 5Gy.m< dhz 2Ŏ| $| ?Nw\Vy(ڋTfY8i3 rGtDi*EKO|N'Os" W ׶AIoS慴г24ulЅAJt]''Ʒ/6L3M3 fK '\xŭ[o~_~/2p7V雽+ۇobϞA/[-OQ 2)Y~rN^~x:y%}?.NAna:bztVbwpΫ^;s~2J`លYx.o-oc< ,-Ͻno?r:0Fx3|`?m`N`%)flr<$a> FOV9,a\N?K8.~m-X%& 'r`M?ftxvV^MedYeYSb Y֘-ӹ QƦ7r7Y)34M`\VM0M-Ix>^fۤia :|l4MrIP,i6},ۦTtZnڦ,0ihIqL__z,M0M4UDQ@1-# (bV_~zݶmt!iXi-?S' }̘m$$tut066p] $h6,6loFDaԒU ˲HJW(R<8&I!` LIeL%if)j5 "B 8RU8f|[P{;bT&p]4EβPh ̟ے-:^#S)&Bl YC`mJ- N4 EM>= :s.{q*eGʜ6U:m •RpY(t,9D:-s饗l6BCf)RڔIao8{.Zb1?sA f0C>^J?cb~.7:_k,]{"Q|eEHb$%1qҹoK_ fK|x߽}z1 @q߸!tg6cheaGFw=.q=m*ˎ:[/䗣w3JȁjtCl}`/guOsN\=㏦8ngYzqxibRWqwQ-qS d&<(ҘBH&[i?RdY 0ButaO94yA)?(Z> SIgW;F%5T”?UliamDQZGPdKjM DLt]õ[ï%FcdA@ں.S.H2 5ƪ9TjhRL68:&cH^!J)DOR= a4g8G_j곅*#,w4C<7 t2cȈc_1EWO*Kх9b-(n`}7r/> ٽ(6r}qQ\m[4cdAT*o=.'>uk9l'jh !1$j)f!P,1Lt# ^Bc$JT5w<ֳwp ]v Q v$'q Qհ-$Ŏ"Qi l}BylH6@Sعg PdVd)JEQfܥdAzavSN_ӤT%ZOZ: QJhX>Zm yNcE'`0L+ J۰HlCԆQIF&c}n^ ˎʏ}0C3 f0::u/H뮻׿|hFqn*-daj =D$5O?0ٓirHz5o? x]p 2k`qI7XE9eK RLfі+eMC2R@FYvl>4οy(@: 缎7w^rh#o|/}O_I4$|49YG>CdQu%,c~1bC =y͞=86%ώJ~Nn5 IDATs1ѴSJa.tR|Ϳ}xMV0  Afyf&'؎Egg'$q#%$\3'to[ ĶM&+U0q\taS1Mc,cbbB1(Hdg QiF[F~۲,)%IS,H&Z#I@DZM&&H ˶dlrRW9FZqD4AEn˶ػw/]TU%S- vEe*PrLL4 q H㔉 ZXs3dђe'G9tp?34RXUt :A&MS^ɾڬ[e.inZ׏rqgPQ2s.t9G3 h e̞}[7?C"C`FiT!Ҕ{ciH330k6ǟp]WZs´ҴUNJά`3!۫JO Eno_ޏj[ضs4x9\u'wP xeatOerp%{7k!g4,k!\kY8DQO|#<Lh7?2<#e:ose%}+ʓ`Q2E1 tiV~xy;B\f]-/>|{T9Sswo#~z!=a:L xa '威UvsG{W<ߵYIt;gaӮPDiyRJTULl)TBq+]ujN3 p]z&ca 8<2LW Bӧ\tyV&mو>AiE}۶j$*0jJ%TEj B,Mӈ_h+ #;: b(IPh*%,"2n4+jFaF5" |)G,[\A>֯e6/8>j*RvaT#w > |wAU*κ`?HgXvG\~U$I"GX|x֩9MSv~O9>ɔbUmۄa;TiK3I HGX f Pϑ ꀆa8K$qfL`#U@]o]G 0 )3&BLOC:niYtcz$XErȬ%1, ׏fQK+KS:iufczTu8B7 4vܜnHiI$~Ld3 04reЌ#,į4 9Zm2cKK^9EUfͤVwWMlHؼQn[hNVi/Nd*" Ķ4*Ia ,p,0PҢr0iHd1]EH}4uR`c8|^>cs1z-WDjjX A&i/+$ʘ-)3xoe͸Ff)$ C,?b@FFT w` nRo};]&&+UGH, < 4?Q 31zfz>f65}9_4`օWsx{wlp<t0gA MgizDYeۗSeM;?͟׸[5JqgSW/ǯPCtZ$E$4Z( 4!8oo A&/2P1zަ6X3J:>+ToY'/Ȭǟ1 82EGzT)kID_jdJ#SD!(]#ФUi vhVj$Ie0%c-<^MvlL@ď 6M8"MR{@8"Mc$"$FAlZK#hT.q6aȗfFX ]k^g!$d)cb[Yt;I) rfiH q0m&yܶ{5Z}_${?u7^M%@Y@ʂaw5 'Y q Z-<ţ {YiZ,BЮ s*-n<j0gZH֭^EQ o^Lklm:РۥF*@i@&(s(8$s,a>H\sGɿ7u#YbˎYQ} ysy@{əg^|z.ZI0 ]tij9UWql?\w+eqMx“|dy?x~7nuV})tMq7n[&Y#k,իʊBqZљpqШ l'?tQv{7n ]c\-xnYn=3XzsRY_irH7D*g=eλtȋ ӰQ`8"Dbga6A,KRJ m8 eS@Rq,.rjE5qR,T(n&!^)Upހ,)TJb{BRWuRRt:A< Ulx`5QfYF86qQkXv5s3HZBdIN9NE(iDJ]٨B8dO:ц"sd.RlBnUQ*H%$1ZIZBiAja} |O>'4Vl 0rlñ\C!B-bjn%_R ȣ0h $"v= ۵Iz6?7VݻGxwys?#|w4-Ҥ@%E&'Ue^T&7n7c켟gq&Z[$pػ{7GmN翖,U0eTLSSWj!/GaQ?'.񞷟e|>D~."94CJEVY-ضu# q-7ݽ@I RJp <h9YXX8FSssၧa3O |.?-#x Ӳ!L~1c>yf@+W~n>\o-8M޽۬1 cC]XkB<ٓ>nTkLA*I!S~ӟ̓(m$0YǶi4 |ߧc~){ȗHR@0 iEFd2#"tv:4 *?<٦4K'I>~:hVYJ%%x`0_81ɋ j0 Ag1B)~`/AL>) }\'<.ʐ# I` dai؆5(,O`JBl<0f؉w '(D0XH1.UWjҔUK@Q4u İDIǞ)jp!a,w fbj5VI( .6 ʠ `0dvvf;tHX&hoRm#&(ZG}|{$IO_g4^c[>ZC奚KK5h6hrFэpF0*a*;ο4OjQVy_̇>!&''9/⥯|NOظXVLDgTvʑ?frǎ[9/bqa`lzz?QoE!?߿vox0:jPjI>T#_\L*i&h5&䣟g;|g$\`q֣=c'90OsYJ_&{,/hja#0M˖ 4I0M۶ˤ.idYFZ]~A8\r+EI=q]Ge%w.LRbpm۬X&3T.$aȚ+>*GҌ׈hHP/I...jT*EV3E: ab.N3HÄN~3i'J3H1MR+0 4u -5YZШ7t;!p]bL$)'(ThgݦԜXpXG▟ͷgv_zdY gv.$O%s,ϳ`4>o{?jet3aF6~x_?`ϾaU79z7K.em\zXa~6_=wyg9L'Sr?Rm} Ø?0Mɉq mq䑛صaN8Ws_n8.Svﺟ-[O-(x$ ۰(TiZ($f\!%c`#Ѳ4I¤XˑTMxuBC^ 00?>Y(vyffRBe*,0\ItiBcLE1LO0==Mӡl(0Q4|4l,Ly/yI OY6WI^$$nl:($bԸ_-B2˰8Ap10(f>: wNyi\;=:A<~b}4"Hhh  5ha,} /X׵Jq730p$0M(0A8~ ,ılT!AR?zoȕ֚8Z )rxC7G'M8% ÈFb1M4m\?@&0lvMZd[z uӐBEdŀ4`hE)&0R Àh!bTk!FZ N`>~%X;Iq2 >,A1j AeT-6o;;$3t ِBLdz=L۠.kSLÍCZps*.tOL{U4` w,ܿ{_j༗\:v|S$ċ&ù=A1U+Yr=Fdc5N!쟛#Wmu6Gs =`8cpkm[_MKERMsG @,}_yQCyA5Rp`Aasl =,bq"7gq[ I)T)𳛯7AeX^ rquWs °GPs;Xz/Qs`,P @Ux1G?07z Myv|#OS\5CJJ()1MZYX\\4J/eumۦ?eFc5i#Uc[Ra6Y_yDk0 q}$M@Bp#4eQ 8V pec-,6 R +RZ 4FSrd,LB帾 @gpHW v_J*EZ,Ei;B a |<$AD yQTgYa qSD9yXaq:]3eMGO\DaETk)T;5ZX҅tYQ061S?nvIt:=ňɩ&Yl&2RA)lf;xӷNxs30=Fa(JU=ZJkF%O+Wmejjy93'qxg`a̰-Ew'>i@'CEoاX"ןxv7qzu 5j`^r%Nï7x#{sƎ[/ȁӇ`R C$iuݏ2ȸ曹꫗΄yw܈P9Bd"$s0Pzt\{ݏA<[KM@e]f{7R>d:~ˬp0,+ygaÆ"YXQ>ccQhjT| MAE;e L˂4Ϩ7tE%JIm;yYrZZ OW%#ň+Ď;t[? _Oy ^Þ B;g^p0zw^|1fx.l7[3>s _eG?BkW\׿uO>͛7#\~n;]x93F< *:klx*G^[='pI(ÏƖI<\PZ`X;8@(40-$SrUV$9imeCC2a,v H,ÌfN"%Yڶ`$i4Ií8E 0U(T YGFӷuF0<4pl8qz[z4oK E#CR01sαzLa0cH6hZ{t;",-_\VnDX*Z)s4Gɬ۵9X?Q0l4q'N:هp=[㡝SHI&ز-DIBg4'<\|xiy@c&Q8u-%1ExSo789x`/Via{fX1L&Wxijxg@GΥh@ ,jeYn py6hfTvc`mDEP1g=l^bbrIRfs@LGaQzr$;v '|~{{9SJ2k3 8?p0Ou,fJ$4',01")aiܚet#7n;aIu⅂0ʰM!3V^K;@JMdcl#BC;h{l)b@MOa~$K@S !K#Z+(Բ5JPb9 xDfcMH: ͉6{qy UpS .oʁNW╯s^Wm-eZ$ bH脌0J>0;rlnI6~7 Kf~xNAOp\+%[hW4Ms8gnCk\}γd$G'͊e2;o#ibVI8Hci4 04T2 L ^7J4͘٬3;;K ^$Mh իX R0 &v 0 OR# <'IKuTu88$Ihi %MAwYA,?gk>ȁ;uc^@$EؤiLH=`rs5SS=46+ siO20SrstXHe)MY' ȉ*UcY5ݶu AP4sяKA@I:?tJZ$QVPR2!lX}{ַV;]w! M>֘ه?- ֮eEs&r*N1`ݺ8\ qFa_ůѠ˳_\KvwO~T+}}-?߼/}K|宻¶me#eu Eh++Z &^wr\ _zq~{^> /~ _}O׿x￘m'y gwKB2P(I.Ak J0R+dxH RԘ@*0sNsU>nO{yr_cPT9$;33[wiA'ȼX8p,PJ82ܴ,cm:qFwk9(S%usTrTv]G&IJDWkX|pɇ#d|sC-[`l Md9;ȲprpfyEGu]֚۷#dݺ\>_89 MozO~:rIgP5\qxtC20J[d!ZQNDC,IJ4TC̥}lP1E8.yV,qIEXV:D(C/+,dQGpm&%20\~}!K/5~4q]0cQaYI$bHQ8mt\| (}.| w@k|ϧߍ ױEeb LkE u=2`vnDzqcaj%Ta*r ~`T*>Ncjb5s3A 'tc+*"bظhmc!Kb b9h?t1"GG% UQx5\MCi8c+Wn=fמy თI92hXt!rC0֬rǖCwknb˖-\~=80-s:u+MCqFzi)d4&}Iv#袋8#g˖-(X?en=0M+yo5ơ T`XFR*T)CB9Ji ,[ư РǸ?ա(JrB s3pu;@^eO0 LNMEJs˲mdYek8%E!q=ޠG$yDgAo@k$ Q^VUBhY^ !HÄXCXdIic-ī {}TVe1 k5̧I$hTUA&4u|?`a!"^sZZuɲc,ɇϩbDAhхw}Yx0Uh7 )* 0"3c䆢?byj1>b8E S8EzI2¨iJL477^ByA]""Q) l Ua9@!S+[!&Y,Wz(b\'¡ߝ# }iiFQXCo/|wUfg癛^a % DabV,ź5㘦[&ܫS@KVKFBZzΒbJns_K/>|o.ox{^ATfX@Px~vK,%FQ(uS-TϽ^{:oV򗽔Ӟ >ῠ=6I\cJqpMjrҼ ؽ{۶my4m?j׾z%kӨ8^_<;x Cwn.^)Ǭo>6~UW|Y$o@.5h4E!T4B<~(PPT2UQDxOl<dKsX eIǚU+ȳ͖HQQHdQvy]ǟ$ qKWcEC,!pB]H*^厉cۤy6-*-4Mp Ũ2M纴-4}("hVљ&fPY$q0L S$AZFg$Qm:>,u<+˶-b*^Br&~`(ۘI?6AFD>!4aZJP0 Q$QmX`0=t{\>env &A,Jx&:ȶm+P>.uQ<︕ZO +-3sx"$Vx~(~`S}PhP 2gbbt Ä)r1쟹4Ɵ~rY\bۂ\0g Q&Jy*hɁXn#EQ cT_,M!TqJ,ld5^{o?K\qxƳ/>q ص7İ CIYh9߿F:|wZit'we%eIea@?47ZKbོ5o.[nm't?!w͹;R*牅aH%R$ZPٱsV;beN=߼ aH}Fk\$S@V(*wOJBU@szqY1^%Ꮥ&m\cO_"pp¤;-K&IBV;4qH˲<0J< И~E\v$K~9ҥ J@$K <7(U!px( :6n頋Qc\JiPU`@ KRcmidKZ Z] McLYc` j*Y dyLgf~ #ʔxڀXc[R$QLFW"ac:T (A30* *4]bmJa Y|[_>M7Mײc}k`~~A Q:Ȉho@ DѐɩIl4Xn=+V⮻,ǣM)H1-e;%Q-s4mgp*eZⰽ:9kQKr1A>Aq<#rđq)+am% dɹ/8.yGq=FwiRiTY9- !J|&{\<4C^ Cjc6n+;)Pl4 l|+ELR \C)Me8[/T}lϦ7F R܊5eg!V n_)]Ԃ,Θéיl]sc۟Əs's}j!SNطAz=E}NuUyߪz<=ivx) Q"ә,Tu< EBRBU,]ĒLȱ^(TycJqR!q$ "}3% T$IlE)$ :'5n9MdnFaЙLpghn^AtDm E@FBC{^z)Bn_I<ᦛn%|nǚBoC9v&&Fpf\+/Uc$,=HwMyf4Pz54J~( XKqE`h4,PH3:^bhw?̎nBW1M(ڱ8H4`׹88:(ݿq+!~aYI Z[vhJ>$B B!UZT.SjJ:lLdR)Omۤ)Bbf΢R T_%TZ YEQ)!D+mL9$ Tl|9<Џ0TJ!rEմ4@UU s d4J2Y$̇T~MZL+zq}TME@F(#膊&4NԸ 7?n.hsF뮻x>/:5=m/#>" [l+`˖x304] ϟŇ9ph<ȺBG.bS9qy??{x7@(j|N;LfvJmCCS&^Zz;[XO 0Xby{c\\BlNLC(B!@n f׎xqq-PD$<*$G=ZP4 XalQQp$Bra8M&FA2lSsZ-tD Zaj"E4MlE٢Pc*&F Mi՚ 1NR"Ԉ"H]ɦp]Lx jJGG':RQ\>b=P"e #CV*i2N\h4+hd2t-A4ӌΣ(^ 1 UQLUbSP(P."BcÓ* WP,S?kFְ%gj4ye|oUTI:&PAR"9aH7d$L6ƥtEbG!AOE B< 2!Q ,t39QQ LT*ǜy K$yHzUd$OcJ]p8d;Md!B@4$ $| |bfiD@U9qxx+_Im|PmkּHQyL"9/;K;qKWy )#/sBϊx 4jb6Byvh}c33uo'{t9W/$dܵíKoo/lU}-|;2YbU{iB<+j[?ء<KLj45F8g7#(*̛3KaunQ/t] wggxp4)OLL.٪8Zy<D2($JѪ7t %, )",RȉȦM1Y/j=3,h:RjP.JR8v[j C%|% FB4 4C33G9aDSWqIR] >ft%iU aL=efH%ӌN#W;Ol2N>d[mqst`Q}O߲UrYgW۶9r^ƙgɊ㢋.?׽,_}/mMTڪ<'A8  F R8hhNKtCފ%J2{vFks.'S48:HNkd)) 0sDExnUSAWW?|/P4$ض:$Yٿ=z۷ro6l6~8{Q)1sI'__qpS/₋=mUBq2 H`phCaOS/OO~z:fpkt׵=X"3 )=?AO5&,%! !0MBrLBST\BgHʕ2t tc'ċ%y(H&A@BW, eLDb%Lt]\P! @E0l[f*T/BJzI>ef_2) %.lCIrWofݷ7^8ȺNe/c~z'Ƴ^//eȟ 8iZvM.W`e_}}?C#T*UrNgbI&ܱܽOfɧItb;e?'駝GݟdxxzUVdjCX~i(2͒ u x~]ɦҀNm?Uh ٸMK8PV1e왋CJNΝ\I&#M0I'&+$- M02rI$TʓB U˪%S\>uX$] !ѬPE gљGg!Ѩ׈|8*f1ˢ<}/ۃƯ_7}>~}w(?yi g_O*[oϧ\.ᴵg`bAjE_Ƕ+z .D CGJػw/ VZI\Z-;WU]DQDRRڋOwm擟S "_kЍRF9 h0"xR*ٹ0g'=]TJc̙;}Θ? ',A1QD2"EU$sbu+AY|MȢI>#E>ۿ9JO J5 HنfD¢RI&Tke̙$hZ!bHb(2Y0)?pQUtf;"LNrF^rSN{,O`7mBW<¼9ph+aKFijU$=|}_‘-N9y cq&L24i6DQk- MDh"B#Cϰ`oʆ^C_Jt5}G渹^g}>ɽ>Hc,cC(`x^ڥP4sya況OW16%{ݎFO!6o !;<~cuQ4E3c FGGC۞omN{MQ;'?ۊi;m[36>̢3ٻ1\n&/pW344ĭʩJT{@y)#.27pjOS蚠\ir7W_}y~}W ϋkK>+-f):WqC"==;b}pr{yDRH<ēRL:M*BR( 2!h4ryg<+ HEsߏ$ *)F(!s j PLNL I4]gZ\TU%LQƩ2)%X**n}JbC!TUA4Z&lH!`&QaP駻]U S. 3͏qŘŶOqkhCf/HWb <*t|B4Et،8%60݀D"AiA0DN(j*a>j!؃hq]T]ӉAgǎhFG?dEx z).}eܹ>6Pg?YwWQdbb=m<|(D0.,ZXbT uajlE(eQB*'?œU'G>3qo|Qyd3E9rd?7QkUJj1ۢ0۶uEQժI,ӢjfHROВ4 Nz$ HX("v:LTLr0tVgFDJukNȩP}~RD̜9s=xɭd)%kB&&)Wpє $QNDQb EQתiXV8BLqWZw#F}{ xA6ԧ-XÇ=9|Fp d۷=,mJЇ>~8p0[`syx&hєT" "Šw1gf-%j[oBS8C@ l'BT WQ4E:$/X,=?g&&&,^琰R(/CԤIA0u4U% #MWj|:t-iT, q]񣀄"R4} ^kyhBib##ˆq<#!+bUpyYoaɂ5׾z = e:|MK ^`F \%(tPD54V Sь?g̞5(V.)Sŧ4Z J+#Mn\>LV* EEW=Ol26dsߗַ?3[wx+ҠdD}DZM2Y*cIZeE(hZD)?ݬ*g;z:l*RL7 i8a UXN1 )A@踄GD`W]dc$MT=$= LMES#T5fq꺫0>A B(SM9%s9%0}E ~;̐,dvj/Q*bUU]L: HVoKj^嗃m@\ncë_g='X,d=k/27puסmO6ڙrtuu111ͯ-o-T IDAT?|[uWε׼;m|9~3@!J6A/}ۿ|;>08nH:elLL֘?>'?J~v=. bY ̞Fwx{ۘ^>Jh |'=<Ӭ\ w>r4a088eKLB't]'XوM&"TnXlE!NˡQo"#,;e\J,cb&c(g(A4- _s<3Y}bwr=/:jEUH$,$2H: (mCOO?~_Q1-3I9H6n|4 6lWn'm۶xFHL>v<}k\uUD6/]w}q.8w-&,[8|o߆/g߾vm[I oZwYx)sgϤ\ah`36>N^˷m?Ū^]wm{j7\C.Ov%=3Ae]]]\{Ӽ]Lퟻ] XpAl#^^rZVI\c457|dz( 2x!y=?t+aG'G}^6{=(b{0P5mZu\"MJ躎똖8؎ >20P۴,EQ}L&BĆ9%*aYHjE]VYDInj̟?o5N:̟', ɍ7%fddK.}{EP5Φ[w܆]U )e6ONEapp/s'=+W{_汧Te̟?3U[Ms&'(53+e*evE>q]zӯ|cwk8aį$gԤS} 01>NVc]:t(z2pnq"PtJUs;/J@O>Чl!^`cTA6m{:rLײ,jeQ8K\KI(${k(㑞(˘(@WuFurTe<; N}%gJfũ|U?MȦ(pn:UʫdnUL^Mi`>O<\x%8~@:CJPE&chx!q&H%6.sP;266DR& Bt=d2&ټE*\ףa?デPdj%kV_L&љC1z |A" N/u';J=:Xz݌>]]]jӁ=E8#@UUa㣄,IF5pJ(4Brg(ƌ_Ng|/ $tel|-ƍO ar3̝<8ģG-Ȇ EPByd#wOLz!Tdc,X8@HE!"! 5 ωN{B, Sд?_*!EUt2(QHnh6Z|EEl洳y"J4Βg} C1hU[MʥU|68/Yt p\'4M:; 4 4]%"q=RJTUC Q$lfv04DVMĕga,+Ht=J\EUSySN>w^{ ̡Z+>Fё|w1,rd`b dl\:ECJ0RIKI'M ?]T%afzHDMFh޺ q*u0$ U><<b =/6m©iJ{5Wux-H$sf!әCa޽8͞I$~#Hg;s$I$"$ch&EۦR];wШ7IrAW/}}39 h~ĢkH,Sñ͛0;wJ$p;v=$b7C22eSּysӨ+lXF,e>NGvɤI [W1_yI|TùFPIsҳqZBxgNAQBR&G9@E߻x>7x~7;nb'SBeSh61׾ux[C=E]ڵk[Ƌv_ g|y׾X _:Y*^BiS4(LpuבH4m']̶'$+W?w̚C:W7oMn`K^BLQk l'!w`zcά.{Wh %Rrd@Ra-~h62a.QLsgtATGF*b:dp*֝Ӭh[tu`%o2w|3^R4,c4:"ttwvL$iZN E(Ԫ "Gjx,X;ƮG9PZ=BZF4DXlxOow `Zq4C #P4Uf*3(Kd29\K Qhz=;)t̤{51Bd1/PN@FĽ &v.x!@ZO2SW!b9]@J24op7=`ף.J߼ .ÇEG,pW! C:aOLor7k֬aɒ%lT#_BǗx[ww7]Ms>VWȣ"&&mwr _cQϦij}RJ"ؾk'vrٵ/o?qVWp==sۙ`׮P){8If(nVk],RY#rI :RUPZhR9y#5JyAVeeusqMIIB,6o`m&PdX$YLZggДN"PRa::3*vlG<ƫ^*Ww~XkdyyA{3ɮ}siKOM#O4)5*4SQƫ?>Oal2ӴWי۹iV0rU4ð<9|j% ݤtٿkJ^ Ky*'9tm!Ybqm:XE^F ^%V) 4ڝurSud h/TFuңƥ>1.3J%r1"O4%4]yi:DZi@+Zm.g%iP2YqNCn{Ed0#o^Z6%kY$IqBaS [wyk_i&KKK鰿jQ*}Ԧ&s4ly_СCzw}7 q(t][ne4#ǷVXez&1J^`_/?S_?bdzzFCG7GGumN=lN̟\Go5s9w}>3BmH`o|0},0@smS{w׿¾}{c0`3YLLa*'Ф畨c[FðDM0YY;Ѕ$Bc%0(T%z=,&MSa?`;g91JMRb&I 1\0)rFҔS´$Ҍ"Ι6ǾqEn1]?><diCAu׽={bKT9n@[WZnS*Bg-c;6z`i躠:.8rtYܰk^mxMo_&'>1}XZ^qmr0I$rxi; )5=zkz=zMjh}/8G"mMsL/co3_&A5 i!psT ?/2yA"WQ{<# c,'X[[8#0?~U Rp(R~37\2A&Q&)E~? iJe@(EH$%2M ]'"("cLAHݰp2$t;=S9:.h >AA0YTR"K4WRy*6#N<Ė2X4W)~_LvvҁSޫu8HAJٶuW9ɾk.(.j뒠S>C` 71<^mW B;u;hrp}G4;~wREԋУxT‚zNl1KTLL"bei;BB;hU11﹑\it{kZH}[ϭ0Ej$]"'#3Hwp!u+, % (,Tb2&L4U],iF4cT2Yf_BoG\ f|U#0k(PZexCXCF! , LҢ^:QeF9(2p#g\w|};v² 80,:[^G?Q~~஻:/1FC8(w';?]8|HҘ$O-FPXE4WYL4=uϟ憛 7b4#|c؜Z,ˆ} FGo/yCߨ6 c#1K 0 8 1 4ɲ )V MӐRaamQP~1VL5)m\tZұme'nK>e}~N4j㬬,P):n%M4mr: Za"U7i'i +R>ȃ<Ƈ>suLHDHeG$P"el7Ɋq)Rũ74G9e1UOz.u2;۶oųJ,?.ccP۳$JP;XZZ0-N/Rs $ i0H ӓ_qRAn1LO? [ٿTkf^! kX܍؅$l4+?ƗGL4s<* v,Ii,(ͨZmjI@$J)8p,g*EXdFF؎ILOnEK^OZ ~>ę4&]3OJ 1su(UQ'|r2rS3;ضS;Ss5Ƅ{?(Ce4]LNp 0d˖-C)g]#3>BSEGˠeԪ hcru<ϡ7@HtC1 D~DZ'4jxI,B5T(W*t:l&MM4?э) TܾrFJ ,?@g W@EhN SXޙm7&/8ٲ*)8Nu1*^)>ѯ^wor3/ǰgs˴4 |3xGF7y]} K^rlo:?em{e||+47ϱ,+(u_~?w~o8qr}f^.E|oѼ*^ )AHSx6ɎO_TsG2u1L#'M*\uoxwuf 0 Y\BZX.2Cx]R5p /AlNq1Ts^:f&EFh %RllPTl(ɍ:y9@RkmwSr=(Q`nŭzaaHw%2DC ]3Фm@P2L~M۵q<H!LfCk] S߇mKXLflwƗ>)6͖x7$-%",E"bLás-$Vm%(yu,ۤP!R(F:g1y4YC9k-(s,hR+_!\|>%'P׶ѰA0rPVN$Im8ϑ_fLSSTlw@oŧ7|Aqޙ$y.b`x- l357Ct˂YhSΠ2(ka<J ?>Mq53KZJ!hf"wؾm'3lŶ=iʹIBl${وs6yZF^H<良K|GX\=MJ~q!%RB"5v _n{~Mٞ #o6Vg39V#iUy'9q ϜCO!<W_ymwmϋ^4p?pqVe:q)EFcU(s?3OLMpiܤ1Y2 eT^ofd0.A&T:Yą.7a#mEADi { ~zX,à(E)qmô `H6z@ R0 0 Añ+\eoKQ"#<'=~qaؒK/Çg1cUt[]lAb%99md1J! `555L'2Dar?S12jA7{?Sj>`:Ipǿ$JS$A4@5]5ã zmJe@YhDk4;6q ,pJΰ0@4\* :6(32vr]'L#MB<`|b!, k+JT-C$IXMk9%|,k2L] aQ-{IykE')0 &1T=+ PJrV즭P*P`i|l=?_xe63^ )?+,݅U* U>ɳ*X(4MɓΎqaHV<ސ& JYY[#~Y_Lo{jh^6R@ U4uN rPsEMcMwGjID&uy>064%a-yYR0=ݠliwqm$I7BhK.A K!(Rkn^{FF}_ѭDYeă4N@+,IyM"qnu0 ӲzJ !'c1t:&&}V; 1xCw8ȶ(-3=٭1>>pwp7}n4##lB󅻿C>p*۷o%|D(kٵ{3,Sf S/p2 YY]Ǵ,:lT?J#{@J 8[#eϬrb`dyJ$I2Љ}3m0\P^.lj*},T*0aaU#{7T*@/Lgbax;$K_)I0$I OJC5@eOxu0@h11Lۭ #~l!M4E ȋzu & D9&۶ {Frb J%7V`Fuj$*U*V %QL]i 6.:SXQ5)U&i21>AKA( ARiwbv33]8K>$Z(I!@ӧ/ w瘰ƐE*BѠj!6~~9䦛n{>rL{ y>w~IHR sGaor,/pMU\ʮ0iv)&3*6,08фR`SV(5 S ,1MѤ6۶ՆFm&)iba/P6-^t \0O\}ǠզmPDb݄JLo1e\d"pL L ~ô5fKtM')[dLhFS2Tx $aj/S)i5d)TAc).A?${g٤ I"EʴmӓA2wbzbW_zO> pcgR2(r4CFI{e!(+غ[ba~飗4!/"j .I҄/'A` ehRl+,_x=2^% h *gdPmkjj?Ji4&SUBBn4|os?9,_vr!+9;C=D^~<ȑ#o5dYw.p]w3ygay2w8pwu:,K.annnT1wQ!#5qakyϟٟBTAApMaU&)oA*FJEvUt[]N=$o TǶK N/-x O=0yzq(8f˂g(C!INa=u21rQJDAL kèbDYL("2؎M* JNFJ;^$-x3O?No?N֘ĥk-L2('$}܊:v1 !1 j*a/0-14?x۩MQk(ycf6/UY_{,JY^h]. OM&yjmYe`4M]<߿9Axp9,ȅ⇀/leYꪫ37?mfP^ve]Ə؏=-W2#0TQ(w.z6c* 5e贛ԪeLM Qz0t8 yQl"A Oe N͟`~${.fe.NNQZS1Mk!J@q#X=tJ 4qaOu7MhNc;yXm %Ajir+S'O T0VxG٪1xVg_~/$s42D8ǵmDIT+Ul.I3>>*a0 /,Kòt #j?)uss)yաEq !&fQg1Z͒ 3Z$̹K]$alll謝eV=tK$}ObWl^You(Wj4&f9s aqa@h1Lɠ,pO+?%JxC7IhؖEYecowr9IX&9GeFH$ @䘖87v ; fI8r`~<ǢP`6i`[ řSibX&k-VViiY~@D~0r KQ.ܤ=9C< KeXIE 4Gu Da2˱0t㼒41 ]lˡi#589z(*WdIʇ%^^=iff?.kKgp,yӭo{EQYAe}u lצZ191IVȡGk4[m:v`Yiô]0% nB o}, rB*B"iz6E^P( J幠$cSd98>Ñ 8-UiuH]"5 ήݗ\n1٘650Fawsb$%}erİ\!+.N*Aq<ű5(2q Ud8%7$ q6i:KoevvBe~ih JzeTq(|)6sٯR9#\qL //s7'C7$y'_4r?!cn6>~G~oW՜9sO,,,0ɳLdzA*L,iZiEc$A\)+>Wni.1h-ۧYYF}txtMX -LàJGh[S'tZxy&Z IDATK Ε׾Ͱ_ܿ*LOODQΝ;9t΃éS /M;&DӴ? / mλNÛfСCm.rGqSO=5\5\$>(z׻F8"#1#|"Q)g?;8%\)J*Z ːT*fOX[]aXZq0f|bvC,MV&Wi@/cWutO'%!**yN ,%+ J4Y.dBt趚Ag:{)nBHWH R#2j:k+ EDxa KhNJ( !|?AZ8I B*LKؐ]^^$4#nHOnj v h1fnd:$*$1,c[QSS\g -"J3LѠקPXlvyvu/~#%:!mnbx %ԚeP$!ytp3)\FV{{9^cnn\iCr%!8>+`DYh4}.<O>9+ԧGyv4 vjuYW}O$w擟y?\.#dbb￟%9|0i2>>ۙb߾}̐)o}+epD>FcF87z~s6daW]s3xcZBѥ$ l[G5V2EQ166FNmQ9r "3tYj7Emv)I]qBKݐ|y\bV瑦OV M0M(H!"E iYq<˲ȲRĠG4$ c,˥H28%KS@3lb`ٳ_],/$QMm,~ۺOeb ڭ6Y ?mm,Rf"hT:O2W "4t@:!a8`:eZNOby6Qb6[;)w rAŭ\!o$H5dnFewiLL1ULv,Z) 7*' R\aޠOmC3{N5= 2l.w },5"?Q&vA fz i? dDQHKt͢ۮRkxk_;njmJ;~S{>K_HP 88mkXN( YYYU`I:5Ǥj3;e6G!)Y! ,!7 bD=133?9w/|Cw\տ[n'Nh4XZZf:7N:Kqvml߾Mػw/wy'VY.rn&zY__{> mۆa1;;k_Zn&v1"##͎)AooԐ4RJ, 5S dmt{E8خM>i[[MiR*yLOqrKAYtrlX2軩vrr.a)RJ囒*\,͇nyaBB+Ȁ,F j 岋K?i%_C,9tWZZX&BHz1I^ ݄<1t&nȮ$"'|_4F<{ι{#rڗ]H6jZF5"?c#lA7106k<(YKE6r_"2ֻs#F%ϟJdF8q({D$ehR*ոt|n:bnݾ VׯẒVkD8h4꬯!,l[PHZT1!$4M$11 , 5-)p .ʉh3+8 щ1Zd<IȒ׶{ڣusT0<,Ίb@8졵 FAvoppV חi;3w\⯐ 8q?9~8Ju ]Tl"lmow(OFm;-8K?O<GUC4qEͿ7w_™3>k׮!kkko޹w>S:u -(b߾}p$aof#Mhu۔E,/$w{G?xDJMs,!LBvz;T*5 &I2h60㓫mب\0 D1c=T!^1O^`gg1vѹ{2G)hBji,K):M"}Çdn=<{38ᡵ"Zk|^ӄ=S%ȇ:N78upŋ1A A8F}c3枿ǘ1c~% 2zQo}R64E,{x^òITBJM#q NXػn^T [[>J49tGcfv,WDa:ie9J瘦K'5BV =!loM?^eI SS%Ӭ@:Beb#KVaL'V+uI +Lv,L=4ǐ&Y# !A E(68q1B)nd}\nSGJKDQ44GU-LNNltZA!-MrI0y0-I$aİ`IEHeݺ•_4fgO_G},y3;4&0sLMͲfnn?SGXbm5t0`{k6LGtmXfyToi3SUo?WWA+ k4c&sLMN\ +q3~]iNDQLog6^^ re$u4avf/ A0IJ̑EBŘ8Ǐ~瞃nGO}Ǐs?snUW2??χ?a>2RDeiJ""ʕ+/2< Gl_1?~|Mw̘1 eNbeIhKįW0MU \e"78w6N?`HYI0vNyO_|qJM"D0NYc}*~̾C .%5z|_ò3 :;)- ,MArBƔ%d$8,cd` ާ~:++T prk8U*,p 9)IR)Of QDql:q'!3{0 a ^4$ɩkll!M~%0REڋu5C{},N(>;dyBX=js i(, LOnl#Ffnn6d!¥F*ȁq/aM,k&$N=kS{ݭ޺fv|͡bZEn &ӳ p+,-F6clnnt&/NMdYDQy,Zi#ErV<|sOK\(Ίm~۷[?6Ν;ǁQ`>Kg^18QC)":AV 2J7eTVHN!bmu"Z룪EVDz &JdI8ј!TWX8| jH-seVVW0,rqxݬ5waN=a}lmw!3tZ[mmSVl^&e9B5(!RBwwyx(o'9wNu3g`_י'/ ,ˢX,l6raLMMя~O}S=zB0cZ+cƌ"#OaHzLɲs@ȑ0P 7yKChH`ڷgJeK(p]`8$Ob._έ2=#~19Jsߓbr5Yv-DQm$qi޽.*WY~wmؖւRLwib8wU2M?Nɛdaak![,?DiI{GdcsXXaCVBÂ0Q?ac,aY.G_*QڏtekQbv`Џ0l7ɵ\.] f,O-2hBiITMڷ{B_l :\ы_au2f?GiZlܯ.Ыxa U2 UJܫv+R~vE$loopin.t2{3MW98{j3ڮ!H7ӟ0.\Ge8}?g!LӤX, $ɨzl6W^e8h4}tFNpdnnzj|1|3'wMR+`! 9Z &'1[[n--josux J+@"dJucNiw*[klHDcur#Dk4mJ2VAF4W^!aq> BkJ(M>EB=˩bw۷l/" )ZaM{9qsβ_o}j*VQ%)5bZ~0Xm4'4! R *0%H*K9ln1$ضE"S.h;!(sZ|3W^{Nza ,KtN\b[>0#rl 4 LvqcQ#Bfg&aLiG 0 #n;]T>~<8lqU=4 r" swF*|!벥*ApIi3b>OG`Qx˹kymmqJ 10110_u{J³>~8`0}>ϳ͛7) xGǴZ-|~xٻw"1c 7QJ,A Y1Ph$6^?\t1<ɓ< L_*.;Fb}}^O%Khar~)rS4 ?T>9B!AѰxоٻ$V4 $\g ӢR 8AH2TD~aE8I^%N"\!2 Ͼ)3?Wge&~,[0wKYd*p-QdZ!N隴h-Jn8n)PL7(n )115K,0vק! SrkHO CHm`DyNGHGP(5F0s!;=aW d}ìR+loy6V)fԦ [u,Y#:m  OsWy?Ű4a@2 nHD i arϻ͙fgY~ ADP.QY wh6RuTSHU#BQ0J% m ﴐ)(@)H ))i.Hd)h)R 02G@ (&QuonnzzsE#GN<]Ğcܺ|囗Qрrc1/~yq|4Mz!KV#IeQT@J'?O?};fX|3A H)1M˴H!-׶TNS{|ӿ 2Q]Dk%aEXJ ݈GOg0G(/!F]o$HFiz7 0hv7Zk"1eǣ0/rV ݖ)FY3S >4 i 9.Vq%zCܼB'iӆ)9x8=3TU֗WQ*DlLNedL IDATYa;:M J'ضCvClnu1M &`azjis{jD^#dLBO/ڢZiRj VPv9vg>!s #ngivsE^2[kzJiԒmDQL 9}䟰ӽIb000,%+V|b8ĴMj3LM ]]!<}{Ǐ'߭!AQ 4e MX^Ys 0=Ay>!Z*l=~)JGoBKP07?3 w({P0M Z3 x7DJI@UJZb֚zwmM!%J{}s?j(C ,i)GC $\LG|XCZ'IR677X$ m"0{=h.oo&0PF 45EΞ=c=F _ݠ4My>25553cƌ#@ln!Bb(ْZڜ}EO={3 aC#g8<LNWɲQU ǁ ,X/yd߹)z! |(yeQ+gz'^77$qS.txM4 #!@kE ,M'đ9vA,Vk‘Ë;},_c6jrɾ#{IYő'Ȓ4IZߢ)Llafsk)MO#װD­W$6wJuHj|4ͰA04GsQ#ɇ5"# .) C 6Q4d9Iڵ^~T)"T<|ɩ:͜ z.Ǐ=J&)ҴCRV_*cಽ֣R,)ʄiVH9eR|P4fɰ)W,ɱl$Ș8D2r`ڊXT 4O`YE>RLG`*!?Jh܏T+„\U66A"7_=*ur@vv\gks(Y^ ff搘pMd&Wy9s|3>}Z6hcc̘1@%==1 9J+WX[ߢ`{>':n*9Bwx EKe<e< D.Bqw?Jlz&Pj)4 &G?G?I];G)Q (AZALĤiNTB#G;6i0MŴ4(c?C)n\cGhwVx4~RvouN^GZaN%"&&ɴ I (U$ѐp )l@$4'mMfUz>a9YPVm&U묯-Q.U=n/)\'O2l"܂ e!IL.ԱL ;MQ: 7T*S@srCPkPڠ>YfvK.Bg93Mlz.(lڕH Dt5m[$ ^riMjdv(:hǧY[X\dqP,,9SXV a6V;\oO6w%sp!uF`%ʕ*CKEOʰC SNw4hmp~<27J2,CG"#/|nk-1?9m:sss9r8Y\\W~WxGXXX_1c1f̘>;aM4QZbZ>aYAG3Sgu>|Ņ98Ls%[z[799`t<+=~Cwx=;B%)E8Ds%._>Ovka l2RG$rL Q8C&DQʠGdA^0\||!l,RId-ҜNIŐ&HKS(rJp5lW1? l%I¾E8q01UE>'O|Z$Opر{D1c1f̘#IZB@P9R%5/v&x^~OP@ PYkժPZioPԨVjl!YƲ=<2RiL:E0ཟ%<R<vڴ{!Ǫ3==NkDgRY±*4'r MC6QZ29v1A17NB)| ^0yѣg(SV_!QV/ML}kɩ>F{䱏eTȳ]kjsT;{5w\FjXI Z7c9ɐo~ܺ~8T+ULu(5rX[]2E5`‹4gIa"˔F1rʐcTTy>2YGi1OT*xz!|< ù19 0Mڵ˼k d&Ml=U*k5BCZc$^bqUEeܼ}'k_l/!s훸%7^ч~^'ؑ9n%J7Χ~xH.~ȅsoo17nL#N?0/]LD+$b!GrLOpy\""di8KPdkkD5&A8#0,8]\Qoɲ7ol̡S%K_8:6<2=W׍8we<nd; q6;,m\cܸqÇt_au /WR4'w|o ^/O0XEm:gə]؇PS;cZ)lnmȳOܿ# 4J>(o\x˕KglŒ{XH#Fc#47A]'Eۇ}K}xߦ^*0=@ƫ>}mzH)q]jlnoF(5#wx%F6헙( Q.鎱3fX|Ce/K1|d0kTG#!fbHRǮ!q#W'~ˬr3LR&K\@YaDieH=:]ZZalts}B ZHiuV6:wPDvJh[-P=Vo/n07ߩPL`Vajr(Jto/E8}}p L3E0E?;=9թ&#,-ߢ׍x董oަ p Bd"4i~Hx>!q I ((sG?ؿiBcVγw](z8V#|۟'M:.saTLp{780RDL% s,&{,-A0ejuJiR)+dQv~j=GqgHU-dYBcV@mWf ͟FDC:=3GHBpPJSgY!fuǽ„8MmoSʮ3PF=:8LKKy4M\CHazxam}&kk+LLMP2-*IRa#BCklc>g3f,>ƌG]KzcU#l{ʠ} צ3= >ub~LZ ,5FFK0$ðNokjֶ91+S5</rET`;600],tzS$d╗_'u\bH TxE}WCo"aIN E+|l* !I NϾii3~rFaTetܼ~7/Tg8uLA!0R(\ϥyk94SX˞l dqqZdXR[X?,cƌ`o<1f̈_x~ɋ+c*}-MF؞MΘ-GLR;JeIoyjmަ׵Rrr\KD7^ W"3S Hm>;nOw,kUlƴ]!PJi[2(FHSzAۤƀ1{#d[J:(5iW"Duz@a$I:; lSm\HXpШ&Y' dyKTI&*2- p |@ ,&NBJ"i! !JY[]D?Ҩq|9UD ɗ^:'Ctm_˯235Zr%$yAp7U-cs}_˖؎GF)n -˔tf#Dė%yi[ >EʞE`f aW4llZD&B] o 5=x{b]ˡa rtaf"+a*he~f&gDQ&]Ӯ10Ͼ?ǔe<ô-jkW.2u)6BLNN I#ٻW(vaBnjs/O^oȋ _.'VL]OBet#02ZA~h#h -enWY}>wv-0_xC<|d2z rd2sy'@!EhoL9wC"|_塇>?-BR" vqǪ;49*<0Ĵ(XEBJt~og֨wZ<_!IB* Jyǣ" C=y\ygVT 6*")RE"ݶclOqGn'찧nmj%QFQAR@[fowxYEPIn<"̷~~9'V=E]l6JxiŹ%:݈T&Qg66atDv|r<%i׻TMyIHR0LDݐJ4[y8̳]`ENetC7cMxoV[42;B.S=\s\:Gp$K pE0-ebb%֪DJ3;sT*E!$TBɗs=Ha%!}ֵ@쪏*^ţqq۷uq M퀩!0A*c P3DtJagcf-t%\šѶѱ`.ܸ3P̾g>L G}^Z)*͈n$Q/gsfU;rCyV :V QaZ֖ʺF0 *Juե9Ο;s}Ͻ;v={ mqmDQjMiBzJ\+47^ȟտ`y!m6nnJ i8P _.1nZnvNRf~F^@% e1,LSg4eܼ+'(d$B -!^:c{a9Y>#/|pqj( rlv:|y <Ї^ST^*;裏>裏˳0wϱsg@<"4C%Ub/8y B3!,Z(|FFGq=v3H]B  IDATG-@ :8)clI!_]ݒ]H#W&ަ+'Lo5b'T(d}yNO翄v }EZ!A'"Jy,V=<7|g@h|yC؉gfA9?Nmp}Z٣.A:>i>㌲ZedxP^+=]t_;Ur΁DWKCBt qQWK;~"},@ޘ'﹖c> iIyV3O~;_4,ٹ"J%ĄTIZD&R;N׿Ce$O?$ mbnC*U +%an(H oclAv9D!a{\zz%爂~E}A0P t>oG}\8{ſa${r.@X:8$ŒF@ Mͷ64РvH2$o*BsC &\C řa p|6GO?~hLO!J݆)>>|9y苼綝4^z;pۭYbyEV}/ qiF$LWf"'_>s<޽{Q" iᅓ~ ]aO?.0ֱ,%(/'[\~\@i!PCYvq#k aܤQ]7z+ e<|- +uʙ!6O*Wq4Յ*t، ;\7/wtnnq-"1c'BB˓ē·Rc6.ǥD"!xb.k *qO bHX㕗Oj(J0i5ɨ۶S#'@)B3RiWyQ^~(B)X=8&etmDZ-su @iTb@y)k=׉iE}O.( c+,5}vQͧ/# Vt+,"+ ˝O]uBֱi.~,LV-Bm`06hZF-lC&d.#|spm+<;v Q2$;G=sž<|0:2ʻn |xc;1$d.?~7ZFA+|I~\*EhQB [XI4E bcE~[q \#AN*E)< Z 4B Z )UWz|l^I 26P AHP`jt&ɸ:ۇw: dN ev !}a7`jA jv-$چnSb&hEƐ8b WN vY[n䩴gҡ<0 sg'6Qm0k%cTjsk.Q/wV{GSܱL12 =q\iZARe~~0ضqNFJf#@';]|/^Ο̙8 gjĸ8HiPmL_@٦48L*[4?±mPZ111eR}S*@c8ٖNxO=N5>Z#ǰ+4sk9xjgW ulfZIhЉL" RۈB+`$Y; jw"T⚊ ehmԃ_y?~NEG~˙#i^XFuarNn+`ۉ6Kk>,|77H|SƲ,.Wh5j|gt62ic&Ofŝdb)_bi+0d2C&J+螾b}u]74F\fHzo~ܲ<?lT?q.:i< f .NB*{p0l1>xDiE"K Cc&R3\*S8{q7?d3O.VG08bⱺ$ bbC4i;x,Oי[}Jmp[1Noٳt[Ci7*$"lBh209y(A9wn={vĶ, B\.O6_v|BP.G'=п9?cTcЪx3OQyD[2݅3-3|.>|CbB'&$1RjИR1R!6!@ M$X120 M!R!F X=p}ۘ\egTț1h *-Pۼ+ ^#|̱cu?H#٦a@ Ivyŷ)ڕ9\J(#|_'X c>{r?OLoc"S(Mުn %&Ad,U<+p fZ :(MDLTe-}~Q!oh(s?AR"Ex Xj4AYZeFg=R|׌RuJ+ ]O1ۿ$gK;202ċ^XU# ܼe;f}Dҹdd -yy86Ka@<@5g/Lq|9:Mihfxhم\/ c |(ogva&*k%EpB P[/G0@$ ,˦jS0-(0Go&r?bmLV +Nh೗!FxfgE|ˡ%2D(;h4b;*fp" "ljygw/\1{(n%&1Z'?k ~ggNc?<¶N5҅2fv7ĵwއ;@ݤ_o'3p=}?}ram,q[?qϟx$ ,)_Յ>|UR^e иCtyg oJ!G9{fv; - eL8D`TMCHnJE4t )$\%d)Z&L>1 .]/ X#D ӲP"|ҙho#ǾjgP*4 tQqHKV- ; nh4ndiBZub.5LO:k-FFSotؾ}FY\C`H S cB<..ߊ|h}xF^xRjS( &"*騊ޱ&NBAu nSH;0 mK'8~Ν=g*2q)צc,/rp:. |#XD i%[裏78V LB$Bh.7KF )K>㭈 /_؋$bO:žihmVxƎbb*# )X!&܈JrY%x1~2*YMq} E&(BYpg_SO#35?'0 C.Q؉GaVbB]Ğ-&"H;9t>hZV]p;.ZuwC(%+R r_pl)f78q(0 ',4krbq~Rjcw5Aal^lHӮ&!)LF"$zN$i# "ros5„B&wQ(pJe֚ l'pkȚC!c܌ :" \D9E0b ;g#EY!P]ʹ1&fĖXK7C._Ѭa/<Ƒ'λh0M+1;P氈dԪrN>6E-/jl.ēr^^x߀/\vQȷ՟#q;i6ȇr}5_(^R*!@:$av,Ð/=̋Gm8yj {V`220G~dR_룏d8@qa GNБO Dl敖x aZ\HH @ B%BsBRm T؞F!ųCRDh-ktg]@QYc#[Lm[2…cߊѵ86ǟA~kG1T7&c®=x]([RF`?Pp//6iwۜ>}&خ,ca'ƙK6^!E%{')/iq1^;c)6M4 2L9y9@*" "DLa!;7I.[v4jcJ9fJ$cLz vH-S|T K6|N;!،+dRIk8IjsXn I=q˵S11b0XX\Xb]}Y܂iY,ɦ0M@t5ڝ\;Rw_QY322}(~0"R⡵@; _t^Mxݎ80 mQl/ƛ1mu蔉 .]\ ’kuQ8~-˳~JˣLNhأ8qāoJ>/iؠ"V/᳜~enPaeHSIע~磏 >ЗgX]4Qpb8P}C+ܼm|׹葍X^HGzég=_d`fɞ5>r4V_V>o|kD&]_10<@q061fAⳟg^~ "V"w77 XDZbM7tn2:ܻ AZM,_O>6 MvP݀]n[E&ג7.y+XԄa@1_9[䘭e!4sVdp m8mfhrWpg|±m>裏TX4Z`ɘܹs;kGIۛ[݅Ie) /wxyyW* q@i3=V;->z>|`\MFB71<47HW+!cT·xdB8vg.ۄL~sjZ]bfvi(%;=w8R*)' J+lt,fkXo8 !2 Y^DȧJTVא$L%^-!jD0%q֪|ocEľ}ײ0B8JXFj /8:Β+ɦtt&O!)6- Q]]ec6L-LF1E5W[_|NJWc`d_-ӌ}ǻ8): paSS$Vo yMr,"Ch\ lQ{>/b=Gt:xCڄ.|_`)" k4-5Y,}ʃ#,]r嘴@߷\Et#414#'8uE K'1m Ò *t>#̹i&4-2cK$8óO|S/24i IHzfr>Go XRMsƏr{&)f\鸜xlXh[&SO/r2L}EQD鄎5>x,;DfDS{1#޷G/hC nK?S[ـ&iGY^2==M!# BbrŗPt9sfh4d]M?MS#y|_. HRı<YX̠ _kxS b4'G?Ἇ(칓mE&Z-g"ďBV!x|_xy';y+2um=\3>'{h]{'x0_[AtCvM|o l/lٱc Zi0PNhl( T@abr5($mG*]/i7_J'Lj F\a2JͤbHI*cx|ÿO|ӳlvG'"j&_pi6E<7(:~ۆ0X,WnS, 5WbAǧO<NNIs:!L%]Z:wb)=CkdrsӢ7clܐ9[ #!,\z]$qC)c,cwT rem~NH)bQ(1 # o֥IH!3YB#@ OOGonhz9< $7۪M"I>h'q@[R:\@Ǝa+ͥ`ӡT@\rfq6RH+ʢDc`s!yINȁ*wC_b{bALƫ>^a6;sA#qg ሔT]9(/-ӈx!Bl/-Vz tGyS:@&bv XAh3;O0̑w|> n[cKo "a6T9>٩)p[oY 'X>o<<캖3g(avTdi,;DlSGb6R&C1W+rENYoD ]umX,33BaGBJ ϟ$ehD́{Q%T=YyW(e&;jkL΢Vk1-DZfE 2"&v+LBZc89R97eE}>C=a0Bbݳ+JE6v)b:Ų \!:]1B(J"60qe2,H'jl'`=^>x$#pDLa똝^X.&2)vI}I)/!n>HY>{MvMaiJorK) G|;Nc舎2_xe1ÑQN rqLG0B`%X/2C܍Mm;f5,q0bKOV ۈ}t_7AuȏyWoRoϞ;!T<}Y<+wCʵ{hjއmdVYeC,.X23u{cJYZ9F!ucQS@>J^,6*\ d.X+,f߁}\s ) 38g$W6fu,,]`~"(E~a UVȍˏ#msOA,h:Z ݰdeY^\$1!p vMaXED)FHaDHqٳrl"41f\< AA9X6`47x@WpuVGعG/X>1_WkU#v)5{#M* 7n:OLP̄U*f| \ҟm>*{zgu]>|+QV?c^|EnfcCx>ĴjuՐn$ٱ{8̞&/ߤQ7.DQdf,鴤v@)inǏAtJ1JgS(bUSDFe8!ji\* |Օ5XE|#ՐcXe)j4Zunciqf(JU/^՚cdrDpPDuI-cqZqaPR 0PJz7c"}iD萎kesӖ*W/+%(`QAkC.h2$}jN;[Q$F 8RlT֔lJ!ւ1UI9F'Z;|!袋qt=q4 |'qWM!ּes|tq@)G؉5Ayj/*S4M3ǹ%mJ"9<jG_OQػgǏ#DIDX]]&?=TVWX^Ydxh 3p7cfz.01(n=qe t(cOc6VC؈iԚ~kh5dF@HؑD;ob8G{ajְH$H01*kkK+sd.4 zh55ץh%10šFJuB`l3X%9qƆvhx J\8{|Ҭ/ '69JhX\\exh /0AiF+{ ")}^VaE ږzu ]Sȕ(uDoo &I"Xgey8LDx 5So4|ZCQPoQ,: A:5=}ZU senuvX tIr hp 6QfM$ J"Dq Ơj00`?O<r/|~^̥[vm:?xldzCl<_)<nhFG&.ެ3)0Bn ./)Ow##&+xm/RεvkA>S)ro5}]N*BЌ/:c}|ħw9|zzzjA\Պ[o(Zb8( vl÷Ýwq ~גxwl"QbacNke`pmYNcbKŸQ]]h4kp52ۄ:}ÄqD@>GQGX,Vس&I%yL0JP\$ϐU{{5q!N)XG1K 9LB)u[\xzm I ?4n^1jTBaW9CtÃLkM3ioK$˾OEaKiPŴVxOwXMO~|㑧o<(J*2ay6nj:(![6JJ \KM 6ȇLz}q;Fbh1s)29c'p=\ҏ'guEC6=xc0ݟ. [.C!cgivz-I FKGs28ݏq,#jڧh,Qx8[Ieȸ X_}*e>]\\ޱ{&߆٘X<IlƲ<{y^~ӿé[YdjrYʙ,(P*\Pk4h4^@'OdF4m06fuuٹ9tbܶk\,fW / b/|U"%T6mY[m07BC@Lh s9|![d`rQ|6uX7',֪ o&1RF@'cMq`'pq3%VHhsZu写ΩSX^@AXC(K`ud( yVWW6h O?%nCdiEA.iK$[fR;`II ^p<8]{#b({a un9t)^|zIZP(\'_y/܃f0l!=4j5.^@imrNw*]w+꒍.xKZV7)Ie 3ʙ|bw:~{v7 T9qG+j=׎0iBp xK0H|8O"j;s奠-%nyrIO|-fP.h!@7: Y(fll=G>_h AZ%vTƀ ؍͚qr!+`qi'14q\?e~v m&F*Ea'H!HtB\$ i}5J!pɼod6FEwŕp|A!!bq*39]ocB A&@p]JB)?Zu(!AJ*>FcbhpfL<(aj=xGp,q tv~?0k[myeO6W >SؤTiC9.p-( gj7g]GyN&A)Zl> sJ 2}g[ZvoFI¿7׉Z5UNx Ncr{R. p]w[RaufN<طQ$:)Bm$\Lѽ_䣋 t:ʡѓgwOsi>:˞e^iLee8=?g{a?<(a0VrEs22ęI;Sܽo?ɃrJ)YZZZ[IG'ziJs1s sD62bnNWV9} zi4Z ;deuo}LԖ$Ix"T{IpEl,$JN,BvfNtʑ +:qX(\@ V`.z5Ci69\F &Bk ihc룷DCRX**V'(]kf}2ur ~J;VQqGdi<3["[؇q_XDV;:^׳.5?@Ol<84G|6X`D` ۧ&hʀٙgx|_ZI :Ę8icuHqV8OOo?jRB1`ued3ٍ{jo=-Z5vCGuUg|];1P 06\KmI4tG] &N8yq),tIfL}|k'Y@ovVtqBkߥvsWg5JiP2sPNqtHaHlaYn|ujVK˯͸?o|K%Ir,cQOkF mk8`KEb4ss3#f_b/NdLWh A3'2UqԚmtyWw0'N>AY1(ץ}?$A)%뽶RokdG0e7[sFFZA S ZM} ZNZeG<`e@h5tI7q,qpXaY6N+W%NΝ;O+\#@zxObܬީ߷ a k:@v[NNxV+sւ4 H,@tWŰ,O=w:QHtL^:u*͒24 8QzT>CHrTt5R,-W+= (2_,|]Dalk$Eoz,b=@ڄHAN㩯tMvď<蒏.؂geNb5`AZa;3#,42HilVݘ&MrhraagO̿mnH ҕfn9N:ئ< …v}e=^T #X?OX=@;Jgo"q&l@&o?("4obW|BM$% fn@ozxai]$ `沬U*r%lO!&)O8ay}F[0q\'@x,x!i4ZE2~6u=/XGnGs]b>sǘy -jhaL&S`dx""Q|h#dqq|QaqZxABf'vl$:ުϰox5QectnF+$m=٩lH y}3\[YQ]aEϟclrB0H(h68d2q*A.O;L0¥xB->&G|I ) #hE"V9F&&8uCva>cvuLa3yH-nb I;1şpul'L0G1ޡep`i%羷S~[zJZlyކ$?C%~$S/8Mo)p<ǥ\*! ?,0PuvM4sgx}Vom^xj­nɧb|j;gh4Z^ 5K..3LӦsDG#bǯOZH!ѱ¥H%h,/5e5*PO3A1?|׷$:!_78.E ߏQ4[+AB!֚FJl"WFkȝxjN`l/p*J:yUJHڈ pQJmv0D 4B08mcws`1N`Bz$ u$"!?rq ?}~{{?pKu&$I{n@6 Ϟ!ɐ 2i;\L\.G6ѨE!A& ˲Z]C)#%*PO|EFFʬ,RWhr<=#^(.x*cP;gӼwqm_"#6tŏ7].kGQ^:L ւ$‚P^-pn7LB/CpUnLᗸ9ʹ6R/?9og !(oX#W*N?YJYQ)#>9 .ΰL>_'daa, Q rl۵ ??C`,T|w79Nʽ#?1(Ro-s2ⱱ^rA3ҹN_%ILNo 3rK57bh46ffb?+dUMUemCLaB:X.# !Q+$/e@#hF 6ay" 0dH`qYTq2b%K uj# \u \w};?Z#F QlP2*eZ뒎?#,[+@'?}'sEEX ƀ(!x c JZGG9{ oK/r=I& ^.rvM$1:1i\!*Zk W#" {w< , K+4LŢEo24%A*|募cѴ%U@i}6ݻ䣋B'rlZ3}T*#l(\\32[sR$6Hґkajvi>~˼c(rY~#g޾u[rr9Ro$e(sLQYw~ ށE⊀!HǩUe|)$&Ԏs{dZO3|$Sq#eZR4&? cR.MQUN ӹ--d4dLL):mfqn`_fGxyɧ,gEDBFO'㩐 {4qMj:m&f0mCo ߤپ@lW[# p1 KˋXk7({c$OcC&_j پB٠ہy<7K.["ݏMbQxR& T(cө9jyj[ v --N ՟]Y XwKTXqU'a!Jm 𕣰X$t*o]tvI~b$()9s<7_$H:A)'n,RXX\~뢋,5W̋fHJChwk4JKӠ!6[xܷ=+9sMn } y}D`+l@X? Dƒf({f3BvE__qnZ$ǎe$Z:82N}~}:JqihÏ~mTLL)zv!pV=ݩ!6,-/RENL6YB,.ebjkj{3̐UFZ Fbi#1!Im#9zW.,54#P3P@ WAFj\@& pyYt(5l.O#^${@x =p19qzq8ȽWtRJ$!LOpự|cK \8uSۑA8$A*ccd4h7eAXK_lT=6ɖ :BAˑ˖c~I*Z|Z Iux89 *A'h!;m82Dz.2aBD!{wC&-q$29z.QS3t=QҦQYclbzҤm[hW 7}Gn cT8vzsKs$ < nY`4{prY2\P``} t׍`V17}WB__??$I^i4aoΞ={5vyu%|z˽},]'߉u8W0A m:cQΥ2s=7>S7ݷ}8S& Y?f66_b2/~[6cqBr%L&CǸRUPRp4Ke5 %+Gx(e.*i4\\8ˎ7RoSgw\xO\T.ahdIJXsNs]w܀G-g]'@!%/W "(~=ᕗav֢<9Ho^NBHcVT:5+b]u<dj!j*7at8<5͈mcASm\;lGMN,;BgqA90{vνC\:J1v^C{vѴBR_@5cRa~ZU4cAZavݬٲVc Z*.忠yKxe7O;$V?\.0?3 Hl6B8 >s3HVGh2<<7Cdhd{W]fʑͿ2ybe:b) jsge|(HHPeyݤqD6e"3w!-b آm~.^L&Cl¹S!ccZ-tw:FzFg} 3>q3/"`?]\k Ru 6MQ?AIw_5~vNt>$hK::[pq$Cne᝗n2i \(_p]{Цuk E>x+2 qfzsLݰ؎RpGi-ֳJ> A'iN.|$ ϱgLjt"QkL3w Q׍IzZ'jb0 -Mmju ǵft$i!R4?ϷZO3i!I"uzfamHgϡ;9lIeis-ɗ sqW)˕p\gZP-BL7 dj!W_B#"D8RJ,v} {v#ӞZpl.kwŏe# ry 2R b?NO! cÐ$Id)\קXV屧^+/wn\;fddXZ V??17J*a38]}7Ѷ>x\\%@VxNNjUuk":5J-bfp`J)0Bxk<Ah¸M.c~$O1>~+dbn㬭.r햧"o0Urq/:K_yqz1FDb~kRDh . kk]{khGeV":󧬜>Bc-vf!׳ЉDIi7r䙧e; ,Ll6ZFԪUAN$%8~&u⍅~կ%`QR!\K؄$lR[Yfm"J-+[KZkRu]0dyyl{h:q/|t+{wދ \].8%vQERLHBIT2w0/%6u L\N,^|cC7Ug?'2av3H2+Iq1&A;6!S4O=8Bz{ɓ,ը{=D^'eD21 BT!Н9KqD@H/K!<ǡIqa3&dכAX=&o&nG !B"ȗpD.V#h AuʖA(z$"OIJ֢Z#Y>UVD1*|ָnҡ4 #&V %;{-vmg|t3㐾>ʽ$!BqZ:]caQ t|h.xcH!!iѨpԫ2IhႹ>+#t< 4 NrK`,RlVEuC*m:vtEv= bpQU.=M4?C>a)30HG^en~Wؿo?b2,yЯo4B:X6 +5*( 6Յ3d4K{_IE݉B2IZѩxe+j x :6YװZ4si%-02ZKN}I&ʕhC!:1(hκ$qg4ڪʡmg U&|]m/,06u 70%GFaC8&8D)j툢h/Gvl+l5,34˶Q5\vI.!y `|-kmoN drcp]wc }Z0GHs 9໩VX~7o[fZN'YbÏjz^km$:Ɍk`4\:ƦLt\mH7+1c RʍjAbm-κ&炼«i[IWozÀ6HAe0/9DD"%ld~O ,#hU+jM,N&GoɂPN:N ܘbe]tq=\Moԫ';{0kJ%˒% 61nHn:t&r!MtI:tB I$M%6ϲlY$UjSg{{Sly9O :SZ}cO?z6sonjaD.Cxӆn|+7o%ɡ7ިG>vrs6zBFZerru:-?bV)r 9éV8=4s% ʣE +IEZ#4QC8@D9OM?FNǸzͭVVSYbl|Da6%:S: wcG+|'y;8t 7oB8] #3ĎkxͷpʫII'Ƃj6Bk# |邹\8u.Wdzb%Qbia1>~%,*!135ԮbD.YnM2.Bv\Y5G],\`n/FU9Ȇy}M|Â~'cRSs{Ivbl!Lیf4# ȡ!/|O=;v\DX/!γsnzq=c* bkkףC:G*cy4C&[oyb ?"Q.dG965I׶ Pv`]ØRn˭@-U%ԫŪX "VML ʲ6gmoiJfSǖg7 }jq6 EPP)ZTA(stq]1Z"|ߗ+طY24"t1>5Mow/]U+"R qZ.<{.a%`púxTz2SOs&jaS##oM|CZ|T6Oş}];HkgW#Ik:Q?c*] sT5S#/1#"*Oo5k1e#%a@KƵ]b5%cQ:{ɥ<];dmX!җzN5͞.?>N[W/DK!d^Eӌ| G KdY X`t,3VFaqÒŚ`.t2Plx-'B.+;/aH:VJ 5 _/ZAVn|[˙:0| \Vɦ6Oh (RcPVUH|pAlD4_a0̩# $DEVbuT"PN0!q Q$F(PX4lM7i h5(,#@ `u)%{y (GN=HV 8x>#gh8COO% WXluNV%&^%Eb߄ ٸ#U %lz9 n)cjDTsT*UPNcCR q _$9݄D Ax""˓cN06Lezh~S'OQ9qFz._p+gΨЌf;q;_(t:ZځA>_$-I<_K*uHQ|Q"sZkAFG%*UJFGG(\wu9vr歃\rj -KeLt k z9C,UDBE%bբR DCvy%e%o_(4hupT4jj4q'W=X-K8ٵu_S? TQМxO~ !1(, еn N}Vjko[ڈT RF2 &B[+I5VyT R-H?b=Ќ1Y4',jfiii,F|-DZVHɧ> fO>MMkI_L!ػg /oTP+=Ⱦg{zoeXYFJxfmUg7.M,xm1ɆHnFeC+;BƉȕgTB{C,-㠣RïmY.ݵ+.D"FiLOz7'Nͦkq<. Q8 \Kt 'bBSڂmkM  Ω?Ѐ)ilRp3:ANLK\mpn o׋.~n(@5j#5Q1⹋( Q|ų9NM L[vpE#aUZ2peoBy>uyc8§-GZDaQt`DVK=Ji+4R)"x@ɨM'#' NWh06Z$8"ڎeV"МɥL33~ .GQYmDRMVGK e~yi|q_#([=`xKBa&2 q51M:ltM|`DLNMU 6DϑH,QfdQT(JrzrB&i@HHL*R\GZZAb1$F HK:؈ٱ1*( t ktS}qћ9cSki#N4jhaAN4%ޚ5ԩu 괡QU0 co橧bttikAسg333=z{r1=<ĝ܍YNѳ`W]J}N:18R=bd5#c<=tZMS?@ i+(11]$\Sgxs+ދFZX1f0F(#|Zx~8۶]D˨i{G{S*s+j23~jTZF0_(wv0=ٕaz4kf}~.&(%+7h#OrdӚȷ\.#ig!ܰ8fJPI': J5:uEXkiiiZKEj5=BLP&\AMR2BX[z"$g΄?E u(@ ej4ZЮ''ͶbYĉA @ؐ$ItyV&d܁+)P ^_]X6fx]xm(&bZK2@l7iĬE]W꼷6VZtfihg``p=|<ϣ&''rl޼G}l\GA <ﬠ/7OoHhPB,΁{m`Tuڥ:d IDATGg"u=A$3ka&> :X5Ϗ@:iBEI0:0mc}.Ejm%&j,V81-^\)rauH\09Fe48rBF5ss&OR8yZB qLEц|I "V p\ X* 3g&1AHWL|c܂kAdt\1bDA'X\!eagttnG8qR,T*d2iAkMGG3x 3\|x?\}5^ڋ뉲6 aB2Вαs副G O|Q#$hĴ얨]4R{9(7Q_4Ҵ ʓ}`JaQZap ˆH["+\Y]L+ʯ| k -g]r-9"fT+Bk+ R9fggq(=*E2<#dža{A+)np#q6'׆iC/ jf+kyByчbۃqYc ~n*M:%N%U:,U~@׊„"q<\/cڼ"@3^~jE0yO:J$ZA^L.$q[XوxmX)! f')+OIhR#4_׹K9v6oǘ/Z896p˻n/C>ՠB`äk*B.ɈxD!1M S}NQ:7۽RϏcE-J'oaRq%qM88)щxm\,TdRӓ8~V R ֻu+?0HZυФ^C܀J#mBFAT]4|qPCqƒ mML 34:bJj56_jGxf1k@]m^G^X| k􉢔H6e/F-eAMG4,}S|/-DeKLOuIHV#N:(& {VD}oa.HxqgCy/p|PVX4VHPnx'Q /*Q0=qB^C|IkkD2 -7P)^z.64HGqjmG 16:;No.ħ!ϳf:{1ʅ!]??˦-[*Os*jhHx/ (‚u:ٹ=HU=tdFP3߄l/ +pPBP?bfh1=H-)iJEBJClIeb? B:hbm/C2^,9x zvN#낭\"s'A:k{xnHy*Y O@R@.DSO< 6\󘞘+.'42BY.RrN6$5k֬COEVZk{- Q?_-'%pP0Ϸ7qz♀W3^ojaʥ.e"{u}KȘ$Ojv֝ x?KeO)%Ҹĵ6$?4/H/s'n.@(22z &qԑ{y_~6cz^c#m'gp2vbBJɉ)nNЦoFZ(QYe=%M+'plJx())yۮ$f{;\`ޮNs3 ~*la.4_ۘfp m=X#_/l=QF(ji#ӹ)OՌk+ܸOV&ҳ i?L\z= ջ4B\=2ԢbE/:NRJ`m:;8HsIrhkob7"uQmM5 CG!PXQZ$ydkؾm#§M03[i_GŦCe܁9FNAAD/!Dh "hm )Ko?w)qQRԉF|ޭ81:[)W*Yw!nf#NTPJX[frRTTKaMDXs,v^L:R.qw@ľJΐ;>yǏS9517q;o2f'ΑmS(ifFGiIBm1*E*tutw_ş4뿋_qayXsIy]i;oczb OKŃQX1K:ˋ3x*hXj_-YsՂ'c+xׯ\{ꥤqcfVBH!MD/ܰJ{KZxnߢօA#4Ki„XqL GO_:Lz!vMG{;ccc|uNfjz_GiLP m Ҽ4+D/ta 4+s 0- )D*nFl~F6mqf*|])e.#kqmѺ> @:E[w297O歴 ёartLZ[CEGyt: k;ii@ww]]t||| Z1AX!JǒqWLF<~X(D3zjCϞbtxq2rz=RSΑHʥ5SKE6m8vt?[/|Kզq~VUDo.7Նh*Z5c:e#pasdsytTh֚j-qF4U a_Ŏ.-VWu]󉢈(m芡aKƛHኻ!hWfQ]uXeP33RHr nf~J#܌eeY$%6mBJvM/!#:u:Om$6@H#غbr#4UƵBbDpХaF??iҭ-dQƒK/v'k:>wzz8)^?AKkGlGR)KGMWknL%*ҕKQ4[/d>T~X"S? >Gq౻?G8;P(4 @EtgǮ=l`Ep QԴþ33u }=G k uL>CP(G,d{6fPjÁCbfȳO?@oٔGQTk!F;hk󊙱Yzz0W89|knk\0ᰬMtSAEg)r6|__#ϸ%nXD"H?= OwSc'! Pqg7l32^gʨ%Բn`Nd ӭ~. 8B90bZ,nB: A%ac#PLӻ>+f]l 4V)'k(BR-[n )$^ܑ8+M"!?[XLc*"F Gҷ )r)g].>ߤ.@l#tήV7D\ՍTs ?HD.Vl:B>S?c[8|=Eq]ؼ>_k(5@JHwq>KLO17sT D)ΒiJAi֮[c>@[GuI`8"[tev*55}\w`|+N*Q0=ВCLGڧM6COG]]=~m߿e#h CTa⊪*\W,y S|_d0_ n(t"~kui˶PRVLMVvM7Cwq oagfցG}[poM] PnT0:rm|H!WJ7/^0Ea6cXŐZsf9xerPSOYCb0Z\R]r ?%bpL9u59~Bk@C&4(DZ@<<ެmncE"̩Xn,U'8D%4e5kaI3c('ӹ?t.>" f4Uڠ]G,ɜ ׿dԲ F \)ru #ncӦMmoX5W]s`%{*VĆё%ΠT V8]$JNMOQ ʕ|yR\ seZDn.8>e%?E0n]8ـDZېX4֖e`mudsYB JD!=ݽS>=]tӑl$*=~Zh)Ul\߉ :[yJ:G%M+Yxpݵq9Iny[WǟxYs7pȳ RR,Ԑ,c y?ņ}|?ΞgM7^QF8WR)]ڙ(~e6gцz3jUjQϠ* 9\^GmTAK]2슝bEJܮ0,z̹X$ U6bVǿqILmψXY/  RiL+>钩BDD'BI*l5Uؼd~KCg)e5`6Q\z T"`7u8x|[a^~z;'J&•.'F"2mlXOgG}{turji*EfXa&f`s㦟Coqdzشq+N6,^R4Z Ț؛T EӓӤ)0T՘0_ZIB.ܼ͛߿|>COO'ő){xArb hd.: a {1G1t0=}FN;i/`ŗp=j0;COQxͷ2t88}EXt8ǚS"&pYqƗoRx*f'>raLRzt0;&-5^vj*A0,Eij`|XquNr B%Uq%\[oy7@n:$jzC Vb剈\_M6Z^mEx&aZH1a" j`mHXVOf򴴶!PUc"9in8WP"u~CkZjRTbl,۷^#>[C|3ɗ%~[6M(?JNI2=w#)as/FWC9xGرQlZǵo %o8SGǑxrF\46ja!&&uP|g;kflڎ\k)1H)fSxjôvuؾ*Jp RDQ8x߳DLkr߼^&NM[.%klbӇq.zq§Nd0qzt|KtV4i8+?tEk_M#s7SjG>3Ե?!lkwmo)u`Q>E2/"_0hIssU:qqeDXb``+Ƹڏ$sYv-} 9[{&6pJ)vvy>GR4x~_kTre_Dy+/}qqV{uXvs׾ O>}y'×o-oe{]g~zQd3![w"o* ADQDpthOL|.R,ekh{ݸ^)@7-mx%zߕ[m63ڭ' :؄Di#IpDTlZ@RȳH`KNp 68S:0I Fqe㳯'z˱쏖:id 'ab:]!_Lv]Ab~~O>CrZ * b8GI"8+Ba\qF0Gc>`hE$3&!yJ ZG'UW\շ!dXAb B5,Ip8cr ZQZP@q,+u.*E(JX,A"bKwMff =htd\ᤐO =9s6w}_2~7nuI"lRcmɧ^,*IB> ʞ[]SJbjiΣ >ź A *P8x^J? 7-Be 0HU c42+ heJ+q{N}M7vcR6n]=,o Ch+ʽ7HLcMo䣳%F<"!: q  JL<"Bm6l'q<57ee;wzs$#S>rcOPIlIBRf"h>Ϡ:_etd)%J)S\%JRE1= A+DNL!+.Irfjc/shߖҷ86q/l:KSϔkK%) >ubTz #ܕZ}9_IQ0X,G33STTV4S0 oL)_|'xjO>"ak.ef;LҨϱX*33Ӡ5Y5C/O7岝ru^ΒXAu9>yka)+& +SJkjj~Yoڝ$ #H\'Gw$ fUIK͐$ɂxt]rޏŤLOu>j+K7m"_ko[ۯaҶ9}H#mI Khay՘`b2`9iKlk+BX#ﬦ&"iQ!87 }t4˶lgP?@٪s沓XiSm Q'`dh9.R=?!Ɔȷ6@iP8TOش( cci4y$WiŽw J5 CQXNA$}\^Q*IbA(*0Q0Qo=xhN. v|va|z8XM%3 ;#Z' &IŽ;ЉO{O<6 Gmw~#G&>*ѬZ _Wg;7沝rrT.a9S3==/X*So.qEOT!iΟaƒ$ J)c/0[U˧Ͳ˅"E |ڶ/} 099lڴ\&K/Z|}R(nF"Z9Q>ƦxǸpf=åe+AhQ(^Fitu5k׭8>1׭w?Ho?2v+=TV[RpZR/O`fz8f'+#_,PUkT*峔㤁+(p ׯj &?9@ġYɣ\q>csˉDzZkiR>qRVAW|yA -8D\)2i kr;Z9̑#|Km~i-B!GRn6ֺ3Ҟf-q]/Ɯ'1;m;B:Q_N>N+Ȕ2,Z$hS)!:6m:,!$B PA9 %HukRq [Zs]LX8`tкL 2&iDl n*;%U38Q u%@Sn)ZMʦNW)cb☌[{Y0‹ 逯gf%h 4/N_us.z{m4ZF׿c\8z~בJf M{ukPAkK%2MFV~e߂N,}I#+R0n3ܵM(*YGuE# ꯴.&!p4 Tx<\z 1-sBEVfFOoo۷uz}?:==Հ|8EF)>pQJ4ZM'y\YIq`^\6Ye[ֺRИz}Dȱ %ҤHY躻 c<tBS Gl m\b{hVCEIvJED rN;v]0)Ayl5f-Xj. P6_v,'1QX8cTZw!c 9"}B\pĽ'N2uM^R$Z#VPsݍ7~6ƕ]ZZ8{9xA$!.5vrO)9 :^#ͯT-kngAuuY);)EtG4Y’fsM$cӄHҳ7B|Sf*_ݧi~nBA gy|1)MB3P&gU8H hUR!:;Gƌk/_TYRM!-" a}k.£ت lzEDF??[8zt; ~Odu`ɨm{fN~uWZFpD؇:vه,۫& ݶ]_$D$c R4= LM$JJL2E% <׌3:6rE㷾COU8vsR3:AСqa$M:"H+ӄC$IBEcYbAxAGFH֖V.ޥT3$yL-h렭Uɗ 0:2:8,N! xgZ# S^8lqvDA8S!IӌBI,-(q+4hկQ*i5ZT֮c`tvJu<)br]y086a46Oo^Q.TXVG ~1bv6L}Y.8mޚQVp2'{B脞a{nkGQ4r<7ݸx+R֙3/DM 1;wc0;7w{ѭln /<]wqƆSݑ[okÄ8p3O,Nlc7lfKx,=(pCr"dl|XMA |_K Dfs(`)4j5zzu8lmԋHEkyhcXZɇ7#TI\ټBpғCTؕѩNEcV֢k$IB4w=QUlo~{xVNۏZLIR KT$->3Aj1+soD7c@b%kIcIL&Ӌ{K!8rlロr1W(]rZp-C#{94Ur AԠ93sO#'ŗ^!=/iFwntJY 1\FGG4[ q TvJfx9X$ V ]c?}+}, "8q n[e01v" Λr,e;- Ðk؃ߢ\~}ӆr[ktY1\CJAl@(3'GdD+DIVXmҞ7c<(nY'Ǟ䢫yG1>*crK(x,qaYjhvBkؚqn@$ hR"bVmH1i ];h . 182}Ha`,*?*v9A K&X :Sl9_Gsf+GpP?|Ҝ/J<$J 3]t:\!\K_뿡Y_ʕIL\Rz5TM}^O>F7D+==3O1fox_|#8=PH5)40P`uXf(&Gwbch;6nN6R4unaZ5C1}8W,Cųd =m,*hMlK|bd{Yz;|;q^L3Vɖ-xו}('ȂJ1rlۼ# ~UIt%;KqѸ_* aѶl'Ig2 lPE9Qcw:K.II",|X6 Vďw#;.AN׻g2 X% :lygCzS VRsk6?gy#$110) qVĀ'Eǎo܁#vcQ8Er"BR.Ie+3}{ ~cfcT+6̜jV( "Uns,Ƹʠu yꉗjN~_|};EXYpKXGI+˕1yC{v{KPl'(Ώksir/%Ck_ ^~i^x)߇:I@}c](]0%O"$ц>N(KMv B$1g^J}$qR7eK/Q &; = jHDA m.kSDn攝,%!hcEWu 4Yzvc\ 86o};]iO qQ/R.9,$1D2׌Oe{pn|?}z\<-.tZ =4ǨNwvD.,ZL7ZJoW8O%R]VQ[NF79^0Atl+B,1X#";Yr"4*IapTFVn ]ū'kŰkha)@rO_K݉6+nP[O=0;szmiz{X~-]t=< j>-S7,u0Q:QSS _"hDkp(. ~=(^xO3J@:([\#B ks7by^"lT[VX*2m&1V{O>dנxZuz6VF >fڳ:y(R1MLsOoP8p]7%k%S>y'}Qj&LCvv#ٍ3W0Vۃj!=9Et9X2IEıcj~E+(\b 8lZ`3ԁٴe _? 0>^_U6#a4VB׍&Y/,r66]:!;A}ffXj^lS18wxw=e].wb49fxWX*0S Z[ŧJF'lL)d-Hwd vpR&A-:2hAChGVrxGg8Fy_֟iVoU{_"(,y7R֖uy^6W,"k"m[5l9/ ,b~upI98WZIC7z8sU3]RӕÀW+ݐ(OFO=E_dAsp B7%/S}? IӚCHLk]} sz L98۩k;v=ԣnvf) DQp}RjåxeQHƆ`%9p[7mٗzxgzXAX#7&q%Mp_JEZ)5¤90n5G?DZ XIfq-XjYb  IDATWj(A!N5VaT8:1mV2YŲD>8I%n)ӥ@ feڑJu.Ģb8<̏a摎ITk-ViS8Yr!0nkąW9}z?8H&⾅q([&xn@(ԑ&Hibcr/@ /AJ99qegs:<t Vx $]Bk-6jD-TzX@&%eh=$> ,&oㄙh|nr EItuY5S/(`㴪x"4 H0 (A$ciwB]RxNr^" R8!#4i[yQ0*Id0tެjckt+5i j_PX,.!\ӲABd5;gp>֮ة0!cV$ mC=ՖCS5hW;Su:8~o3TW=p~+TBrp+<: [~ՙ+03̋/r| 1qsX+<2ɶ8/su3ؠퟵj5 xM_\*0BnN~SuLI~ Ϗs3٠lo,P+._u:uyuH2Ҟ p .ڵF IbT(4R ҝ⦟u?,3314XA&!IburJfw]7e6ԺBaDڤ}ҾΉɠqD>'NfokΗ*jVIKqzkϢ.& i5`@B8m,:#v%8""D#@fB;'T I,mgpJ/h(,H@T<Ŧ KAA̠PJy G<_d hy$9)F;U7R8܋6 +R"2??:%A'ƨx1k,jS.rÅ>LAu-RZ"%A I)RJV3naԾ*vCີ^ڎcM{8DQ\ctmu&Q*rI9*!>gjjZaLfm٬E: #a[ؾ1G·4[  po}VV9W&uSol1$7sWSA9.IbУ hT]>m^nZF<-?֝h44 R'OQ8>[D oYP7H_{Voop+V( /S&κD`X ZfӶ 40a'' 4A0Zm dֽ0\nHΦYtum5Zk-aERRLy|Ggf{@P`W304fu:NZGdC$C!qfB>Oy`, ",xL V\ѱ#[DO!660fP@'LOlݼQC\u5}c%ſl޺}t^V]k)aH٤P(PTd~քtOvR.`V]-n'f ?2SG_'?p4) (%Xdh$6$20nu[ C+|zw$_t1}D[7c!I1pXh 1fIVg )NWwDғ% oe0h!m_ ~?6IE#KO tM0)9 4Ak6)xRbO4htJ+b24mgv(!_aߗ?IFni5s47>=Ż(bMh] oıQ#k3Zh#^ ^_?&lR#Rpa'sȫh$\0 W6AXUyaU)'EDQDV^SV;?m={aÆ G$w `FV{ܝ}}}Cmn.߸*xO($rxKZ+):.fm94 ##k%pJ9DfZB0::́SW)xSqpٺj3*J Oa m]1;\~vs-*]f$tԟ~.yLNN39INW~2J}!ĂϷml~ x[N6Y 8sK+hnw.6_zIHyDm B9\re3$d0vt7"r V)K%*~֮[ǖ-[PJ|+ry0u$vt{خb,Lng뎫Ⱥ~ ϊ[Y_Hmb秙?v1+ g "B9vLui;JIInvl- {w+3 3GMߕ713I~uIAm+.G B ( ͸ oRc(@#8^*~/ V^ecP}J2R(" ]DŽ^"D&cu3ch4ϣbժU=۷) U`:%8cJ3P+q 1%[Gi>!",կ~ݺ O714tr/4Fc5H-)GblrxO%Ѐmʩ Z⏖"ykX!Bfp2O<&ZJ"!puD(R+Ʊݰ!HJEOǎ@ڇNqXkrZ8ieccc{RWjq ,8|ߧ|HgUlL_tŁ#?>TPex6bX I""7g;Ap7@ĚaZa̍k-;OzUW~?h6\ &LN6x8K,L!ڏ6vF-\J.R $dh?O(_wz)~1;Y֨W]y[c){ 'd'c,xeY 21L$(X+pBBW=M$<*Q(x饗8zh绤D9!q^2۶mmK-V dҵ&X~w{0_A3pS`LU^' /u9 BIZ@؄R>ϝ_ B KΦLR%X/#QZ16~1"6ko枿"OD8iE)ZH' U&jN{HIV!R ^6BV#E[纴8- ?qVxN&ΎvAv.jp 6 I1(6EH9C9PS="͙xJd8<%ƢHqblq(!R c Ұ) :05DډAsb;|VC;o%In5NMht j?YmrR$c0oTt5zlP$ (P %2!8 3>qcIT80PʬZv:f8 صkccczw:xcv?x^H$ڸIk J) $:襃qTCsw^}8:¨"B&Xk0I x tkThWY5uz`i3վm҇S x+`S&צI=).زs;oTkn1Ԃ&5K+ޔARK I_X!|kK!׃%Ӓ o)lE* ̕8Q4 g"LO?sGg:D&ez:|!OԪ3P{&oL=ħ>m|/0-i_-p6K)_x)P6DUh$:%6%Q $tKMOOaߌ䤦<8G~!?Ks *ѣ\D$NVFp {~ `rrsft3!vUjt۝v<c4vcX's=NQP(P*ROϪ3цQn&90 B)hb#Xn{~,ƦD4J﹛yqCEԯfT*S )x+X/57ĥdplUv$FXp\e5B ϷﺃVuނO(ka2z">m72hZVEY(D!q҂8J[I3+ޱaA8Xrx;%& '%''$Cueb$܍Zrݢ5u#K b)VO&Y  5HpMC(_}tdTI|2UW⭸>lhl<ƂyZSy0WcF;Y!&!VHڋBtc~GJۅm鎞-b=  alTkMW^ƢDL s"9Y蚳*086kI7Am] |D&^ǀC|)8WZ^^w^wllmC͂ N'%IOǁ}RP06؋X}lJ\\U&UrCYL`'02+vՔҋs I&ˣTa=.h1))E}4VCJZS霢oV@(*]?϶1̈E\r-MIr/l}{M%bwwݠ\Ek7O6l_ݼrN-%Pec, 5Ms@L 1 W.3tGHhbJkcU٤ -L192ӊWm/Dʺ:j&Qpԯ.Ќ&c ƼR|\x׭iVW9w9 N|EAE ''_O||Ϲec6 w }(A)>jn4ao^UA[> ]EbZщ#~#OFi*(!fҵYAjrKT"CȜJT"D-W2(QLLPaŒIW%y?A).H /߰6&(Z4qmۦ&ٍABh-W\o}++++Mگ5+ni \ˍ 666X[[kHUA|ӿA7l>0*XܗYL |=gqK6F^auLێdGYIG̶/2|Yf(*"z tX__.@뒂2ΓWN8GUqNω#qbfoo^_EI>VW_ q[3^w}5_8{Q&v!>jf1e1&@)JP^*3$kqVr_!mJ DGO w _!4:r+L^$>NATs~mmƖU r%mPbvw^爛X ;G#Gp̙fv:}&H|,HӔd5?''PT'(ʔ#&]ѾfZ{}lN X cEK)塕 *38gpIdrhoDsЅb[:-srJSX;vhA͕GRI-&EHq?]`L._˜ PJS*-ZDw}mŋ7@Ij.t* >ϳ73IkxUm@pfGmY6eY\viK7Z?u^m+נ؍)!LE V<̷)" ~Ko;`.33솴ZK@ |s_㓟36"/>G͵R)'ooDz1!D6JfAaH`oT :B:lx҄S_$y8>Kf>i~go>wa'P5SW#\;[>gß=r~'N\Uk!L- ٬k$MJ_g(+eƥ&<1VL.ANHh |)=Ü/S~ȰÔR#e5ǔ$4qVm5m/]2xoo _QN{\׾EZ\~MJߧ*B%NΜ9 q!{sND . 2"D}0x'XD hW0\ p!sekߢÖj>̕-"`5@+N'9Jy+@cjNؖXEOgh*NECu* `kbQAF1Iy/6ҳ6pn3%)Kz7=F{[Ȃ:ʲj/BdKw鲍V{C$QFN0*S>BPS r>5HBRU-}Y_΋顕fBYtsowli"!NdRք@9\RRI n0zIC[t#<||ss}z_9.ogg[:akm_|Whdg?@΃?SLa 7Siʼ@zD=BL1 pn~5.U1$)$RdUնW*Tbq>\y gz;_Bl A04^ f6sC0طn&Y|7h'WU/uNttҼjrdcatNQj",*$,Ŝci1?Mߧ뱺I4h7+hqmsZy>|-|v82- 3 pOM@BYAV/UYPEQuE":5,LzN(2@5wA\a4RΦ9Z\uz AABQHdM,7ӿcUg_`zn 6xG:ʒDzΑg}|+Y%W6뱹ɹ9sf3< )os¶CfE>A7V\n<{k|ݔ2Nga#6FӐ"^CT%"RyI ZK@1RJG|Oο|[^s_EJEw_[b\`)s(Hbu!Zr3U}:Ln ߕ ²J ֎2m1:ܻPc.&FFh*S2r1iYلݝmlﲳhwc= 1tD$|ckn zt: ~qLeTUEEM%I2.H;8eقvq8I X_O6%{ 1HSdzTC%Q JB LNSR CJ#9sE|>-y]xxxܱ{}}#Wyo;/w;o< f, Y0UۊlFH[۔]"CA^d '9-$Q^KQBhE5w^.sqm'\8wq7yU[C>'R/(yI!h!ME`P¸ 滈?1t O2+ `F-0zFYEIJO)ДIeĔ3ks]%JfF۝p%" DM±6Ъlu]1<3!t: Avl.\h:,>3駟hcZ/{.7qKBHޭY%60-:r"Q(y#(Y"c/A eEHI+P1U5 D'MnŔɦlKH@.h9J!L5ڠe-߬ԭ l@dJ):B2N\ߩmW][l)W&M& hYJ5N$Il6ckkkAn&Ct:4s*r}r5L,(cp4MxbEq7Y|;#þ_$$S-wn2vRjtud6cs}‡˲lA,d'ZFLo|.˜pY!tF'CEP9N$ڥ̯eJJU=V阁Xt >ݠC!o-|xx|ɇ%Ng.wgyse,GwF6G ^nee6b׶R;wnx=P=n U%hD8;Y]oIei*zh! ^F^ՠ ve{,X6pWf{DYW gRMF! ~ۘ%'yO@WE֍ozR+8yUV6Jۍ 2=L\LW=Mv;(6ZMqEedYBw013Y6;&E܄= Å*f<31n o>a <|Ѻ sαPRynfuwm~)QJ{kMf9m !6hNÑ#G C(BJI\|X"AH99xxHh")r~ GHlP'3Rkt}=>PUpcg4Wxt8n:6\ .q s RaUS19iל='>cE2x CլIkf^LSL&F#X}\懸F7Ԯ}wycRmrM޷m)x ^ְC}-^$YqY.]d%,IU?pNw[dR+͐Á@f=):3۽J7)w߻. C$5%T6 A@}YzyC (AQѫgMUV0C ^uJhx>v^A33]`C 0RQio<%bL@7a:7&#&hʅ}2!Ht N1L-hfze\l{}q&$eU!'6l{a5Ԁ'{oQ5EEjbHF$0EINe.H-PʐCBKAXAVWIÓ 2mf[I0<~s,ff3~eCm2"vwwԩSlllkY!ٴ{{{|[ZrvZ;K߱,;qe%]WVnlQU~po2Z\ n-ˮDLWE}>Q86㖃_ڸcIF@00ן|go@L&ŅM 2@k *Nȧ (JPavO|.1%Uew֋ݽ(}BhJ;U fB|J)T+O>Ä*$$*0\" 4aT!9G\c:ڲ,Wצ8̲4MF JӗetkPp[{V2~}ZikUmknDlo ˈ7+Arw{!Μ9Cݭp+UUq{*r!tTп*<||P`Vj#c9fmW'{#`כsDP)wƧ(TlJB۞)x;`DAwoqvdg4+Pj6$IqOB >"EuPJ\kyk|ra[O%10ekbba/+q@+TU"^s!wR&Ģ&k[:&c æM*O&vvvawwiaϵ"<6qeq:v+2{<Ğ$>΅kofMK},tҾ;|#G߭.|ڑ2 7$ILvqL 9zlڏoHG~~x<[פDiJAC݈w1f>L TsNH=FxC1ɌD$2&2'K F{LXItEXBbWmZe4TJ$ ()O0kT-q E1V27P!*.(:WHU\D]j'Zn' IDATYfr9q& & hfdYx&#۟϶wYe:6a"G-pٶ}q7e7í  2te7;5\ge;HBMddmT$I+v_F}_n0Ε+WzTPVI"^ZA>#zD| '|3kIAV@+QTEѣGMð0$(AK2J!Q~;g _xcݖµ1i^|e4ѡ0%S N+ QD$s\?HR@H5 0"BS"30=B æf':A_ <cǎ៤it:mvv; JbqV%naN/9Q1]SQT%`e SFe]@OgcT&#B=J 9h#,miS1IӔlҭ?"XRJi%mE9CO8?NCq|26[*Qٲc (wuz-<(뱲 NsC201ph2\dƏ}MD2C9zGLBeeQ)fz^S_&q{JWk!3GEY K3#׺8,U%* YLPaQdbtJ ]kzEeYvY__Xvt>[_$"666X___Z9᝝F>l^wԾL~؊큊*gyZ}n>8 -IASλU=v[}e2rnoIv֚ X[[cuu\؊/+C3݀2BLWWWR2͖ҏ  z" D^%&PVPYAF4AD{ͯw=vߵ]`dY͌ZGkAi*+W1B: N8LU~[Upq&N h. ;g,K& !O&*Uu$dԶ~7ˑ!ͬ !8y$_׉hes~oT6P2nI'A4Ut:aT6CmwhK߾Zǵ6ڷm7wb& 5B"C65ǣ3T҂$IX__o#y:Q jAPaI# B(Fߘ4cSI{tO3-<|qkMY$I]DҒ*5-Z"LR1c*ÁtU>;zA kI귯&l0_;UJ5-G]xMZd2if푦ie*^n˖mۊxⶭssgB<ϵΩS}2QC\m/_ٳ"]ѷ 6A < ,l0nwkM}k 4Wel݀5sK ֆ${mGE+_䘸Du<obK{. nNJV>H,oUU1NL&y޴*a[}:Ezmm{JyYkrO,c2PEA?VݵnؿETԩS9r{V&qsܽRV(b w~1l`0XZjy ^K;$i6veMA@ۥ_=beьl!Qw>G(P] ;kxx|xxHn1u&Yu[~aj1`)ѨVUaEBV[mˮ8L& }f8֠Іn`0੧b4q9f‚K/˲Z6mQtmY]Zs-E ;ߵ BAY6lRjaXU{zlm@:4O\e{mm)# rGTIM6}ݴA݋<<<<<<<<<<<|6P+O8Q)JH P7!6@H`><<<8|\&ؙ.@ke}())}sKSVn>h+>|xxxxxxxxxxxx>><<<<<<<<<<<<^? tIENDB`mu-editor-1.0.2+dfsg/docs/logo_design/000077500000000000000000000000001341747546300175755ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/docs/logo_design/balloon.svg000066400000000000000000001057441341747546300217570ustar00rootroot00000000000000 image/svg+xml mu-editor-1.0.2+dfsg/docs/logo_design/logo.png000066400000000000000000000224651341747546300212540ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs  tIME }M IDATxytUE?w $@CTDPA@1 "j,؊C`kآ M+6(D"Ha r3F{{ν]˥fWN.A!II@ K@o'b;#@P4  C)@ vXlVH B|Tq=f_sHx$])#\ L דvHepyK6p__ߋ[Jp!w CF2.G;b?X63ȕV*%D`ʁ+ `<לb!_,3o6**o90 /}P,qcKĵ< ,n?/'N+U:==~ѳgOwθq㈋C4.Reo>|>Ln7[n󑗗g> x[@-3W2%%.]п*nVqҥر%KP^^NEE0Nށ3.vphoY~ZKOOלN_H8D#GvܩhG 7\.VZZ7x˜g uU{ǴoVs\Zq!-++K&@G d!uӶl٢ ?'33S8q J-8莔MD"|>RIXYC sѪ%Z fgʜ=%t8mZ]]Df),,fΜӔ+B0]B\ ğ**(͝;WTWWk_}(F/Iؙ1Xm֬Yu&F2;܉'JY----f a>8ד,rk4M޽{s Vk+Ex{0ݺuرCjo5^zxgUz`%Ff͚r"#Gh#G t`1yiiiO?y׵`< Wdty!PӴ`(|M03$$$ߓ&2A|WFFqFe]Fee2n8\.l'?.FΪUk#89K52hÀ-Fԯ[n_H?70f#"' gQFqFvߟ={euid pQ?}t ~sgeVI3=DuI*0xb}QnMvmTVVeȵ.ksHPmt۶m\|B0a\lYP:8p^z7 j*&L` Bj  0Q=zw^bbzxA?#==^^zP/ޥ:Hqq~QXXHΝW`q#AoaQgp rsscٳ'Rm6]3:*/Nqq1]tQm?!:F@ _4h۷o7rO gҭ[7*+O , *J ApPQQAU^JvO9 u 0QElذA_<111,_\ ['A?nΝi&#&MRya EAMfO5DEEkONmh آc7`s{VxOT^zTJzO 8gm_SўK9dSIq]Yuη{u0G\Q)]Z4bz Mit2ԞaӷYOвv;fRe@"z;wު> "r]^^8&=N0nݺQVVL1mlĿ1`̙èQBکU_eg۩ m: aX./RojsJ?HHڸ.&trae$$$ryhs%ۻps=!ʵ%v D٧(daexJ;huՓ}ПvБ:^)WUU^St ŃnlyH<,R.HgajSU1lFGcc#6lkN@W #^/ Fo.5cl.+vz1|M^&r3>z.ϕǩDOFU?o 2m۶Y̞E A &RJ[f-_:Gk;11zSO8i歷 (HXf.k~p8TUVPqq.74ESfNMMUa&-kB`sFQ$uN5ѻ-r^|eܑ#F辚,--Pv & G&]l>\BWkM& $:p88e#wU%埭JY;=:M]N$N=Bi?r7M -荿xp#::Z v@n$GP=.Ϧ!4_{Gv;ϺL>cyⱂr? O{ME:?5xرc[c~1LK^VbkSan>St$8R_>  >Sq.OITg@&[2΢p%3G)H<: h0`8`(6WuNiX94ɣS|1HO >>^?7SDu(ݺuTDkF1a 9:?G, @לD} OJk59J  C^N:I 5ۚcK.Ҭ` Zd=u&*֠Gkkk׮Ҭ` :&tYU]I| +^$ DniMA^۟}ӧO5IĥJkĥ|nSPP `x8b41{Icm|;Ўhy+ 1mM]!"8ܚJBDp5ةg/SA ՛HQњcI 5iMt-{^iVAߵ&> |eeeҬ` %iA{*[]Kvv4 w/Gm?4,W qK4S~ZW \c6,=ddcV8o5" z,^Zz ml?s_==MMr(~w G>S&?|Dz APG!hjjRy xPi|ѽU @>_{榉_$iM)᭷ޒx饗tk/EkSO uuu46 fzMEt+..\.fr"Kg1APHmm 3"3?.=& ٿ 3hlSҥKA!?^ZzJ:233n˹APömT=o}GsMظq SlΣ -BcT WSZCC֭|zMp<= Xr SafI Uo9Pl2f D<}^Yv 3\%p ҋ֭Zf=:ho'!N_@hɚQQQAAA or=;ŏd fY 4љ`nI B?~ 3'\khJSE!" r:ֶ%nm4<ҳ-S[`ڔyf]A8Fw-zk4o*,dJKxޚ-X@VxUv|oӧOسgs߷QCo ?cqA8kVź=Bn[jU`yQA x߲eTu.'--MO!魩w(Cc>P,.\HMMxx^T @ SO`96mDcc S_uہf5߸q# B1vXf4 #?,3O0m4!?*Sـ7T0Iܹ9sWAii){*sc (Y x't۰o `ɪL} R~CnW$^ ]6\ŻSɆ TӽNhC*fݺuk:x@ZUTaDxU|LڢFCELQegO?>@F@I#M>}T|K!g탂->kC*>Ib.B㻿P[9T@IXhׯWen q)?+,f̘!^$Xv72ݠg\W^y{7 c„ *ͽroP9`&Rvi2gD=U>^/:u B%ٵkJ-)߫2V[[+ӳe-Zz:EP_/Li>|#F4[zۃ64C`8Tӷo_#bGA;TϱA={ 1]o{ ON;M> `ԨQթ4x>uNE8pxR FVVJuI=tStSS]vFp]wuVf/ 3[4XUUEǎiyWU}!kTz\.OSǎ♂|Q fz^ 7 <%n/A^}#N iGg1b lmF.jkdT㑴B ׏7U>%-9΢E0`v^ ݬo7qh@Ghn>dBy\.k&Ş lb{Yyki˺]TMy<իWf෺@Pi|PZy Fa >K*"7*pkQYgEFF{ fg.a8}7X6y6עJ>dz9+HIIaʔ)l۶-ŷ}Ҟe> *e\y7m dgW݆ngW駟:KIII0-U^_u>VV]B[?#1U\x ~Dq_AQ *Kꀡ\)(d~3E`q.Sb|yo'(_'A66>l H*U #B1R ^} %|%o‰XY&엍?"EtR`0Y+oD @ l)\W.cSm=|p!'{ZT.ޔgٴ;đ, WlF13֦ߘ4&j>. 3zSE!6_S}]{J#hڏB"Ζ>?Vk-# 䘍GvAA:R}OIENDB`mu-editor-1.0.2+dfsg/docs/logo_design/mu-logo-large.png000066400000000000000000000772531341747546300227700ustar00rootroot00000000000000PNG  IHDR +bKGD pHYs  tIME 2&* IDATxyu3r\/B Bp * +?aA x( BZ5h`9% Aq9G䘣@`?`豭lVo+i6l+o  Ba%IJQta`7L/Mf/灗?4$b*IPGftsp0pж0Bfy7ׁ8*IJ"R>D`ДdFX < <Df*IJ &Q˧vWZ_VWȼ*ITK)2zNfSDfmEVd1$0o0ahhh%"ISIRqHYZP`.pW8x xx8*ISIR fF"w2x[iHTT8um=D#SG/,g#IJr`0X wB]iV<,IJ:( N%/wwZD,QJ)8Akn~iQ$$(,ΰJ_op_IJR 6)^n 3;d1تޕb+MfY%b*Ivp>єqHE-2IJRGǁke@qHT 8$ǛdO}8$b*I4 \N橐!b*Is }QH dn=j,ہF!I;h%ɌJR%@R̾UJN=D$E#`0p/0($ӖjƻgyxR*I]xpׁSIQ/S`QHR]|ET`)-7%.sLT(J**n(HB5uQ%YL%QdaYwdIGy%'LfT"x2%=arSI$Sd&Lj3ISIq8($|lBTRMF!IE_׌BRWlYLf6'-CCTR\N]r㐤 ~ 88$uJ3A> QHJʅe\c$l6 b*)F!I*r_6b*)ZFbTR_"R?edBٙ!Coֶ_:~JEh3V($º'5R$ ˩ࢋ._~ 2#GRUUe@yrJ:(lBssUq*0DI,hR깬HJR\~466ҫW/ϠA88x'hnn6 OL,rkk%EBUUz+555466ңGzMI?3h˖-ZXuWFf4ISIY$0PW wTٓrED^,Z\cP>mܸVdd2I"ᒸjVɤA~|{"ȫ )f-RkF:᯲(//JKK?p\}S2p{d>1Jѕ^ar+x㍜x≆{ٰa:CrHd1{7qWrk/:,MƬY E@SSl{JSI0_(Qeee,Yޛ#F0}tCQQJ$*.{%$PG\>ٓ!Ch( E]WUPWm~fT ՕAQ__ϓO>I"`[n"Gyy뫪+~aT @92IO0l0$.!uBKuAJn9L4کj~_E5`&QHtR~ ZJ rwxljjJ9}t:͊+H&ͫGf{J<0T[[˱aI'DUUHPUUŦM B;UF!YL:Ocۀ831b)//7)jkkijj2MY@QHS).RFQFdk/&L@eeH1T]]ƍ Bmfd1NJX|9ՋC(=NSb*EP xnH$,[iӦQRRȨEKɌ>lR@ʚO,L::*K3iWp+"ӒT*&(^%%%$ >l֮]K:/T%uŊ8F!uZ.91z͛ǂ ?H'N sAJ21T*??1|p9k(̉` QHS)W?)>s ,`„ ")'z[oeayc,R=N_qGݹ$BwQC"0QHSJ8ݛx޽{S]]MYYH*2ZZ\ȝ,5i眕WڳYJŋyx7>|8 RI3f2J4EJJK.aɒ%")6$mmm8XmTړEdl*jkk9#Yh ,0IVUUŦM |1HSiWV!&Mܹs95jH*+29oL(d1~d&:8=z4sFb2d1t)p1_̂ 4h{キH*5YLp= 5x]]uUwySQQa(nW oJ .2>犐$ jQ;1U 4׿͛g> CiX[|o)D#!RǏOs1Iꂲ2ZZZ "~^ hzT*}WqHCgSN!L$eIyy9/mdYiJ1]|cܹy@rv{qi _ˁYMdO|tItAR)C$ vA(e1b$7h:WBnݜC,j!kF!}=ƣiڴis=466$YP91 Q1Xa)K/裏ZJ%)/5X1%cP]I2Ӫ+"0a]ts1I nj8p8w* )o@QDCmm-v'p~HRj%FF!T8cL5)//g.SO|IT=-r3Z6R{';)dURRB:f_A99@9t6}cȝZ.]ʜ9s(++3IREUyu$1b8r &}$ɋZi->ʫ\R[>˗/JM:&ND8-ZR;p1d_mm-Æ k_zI dVȏ3|z#Ɛ]'x8SvKjii2n$Fk׼F, 8sEpB$JKKikk3;1|T_ܘ7osTNjmmuY11UW o 9vZ:,*** Cl\ho>\|d1U> ,0ݻ7/2TPI,SGye)oPYY$I9N)//7w|WS֭я~d$ؖ-[\4k j/dQ)gM2>F2I򬺺7D|Q;8bR]~:~TٰabcО8b||箻b̙$IQ0v~\: d1UW;p1t]"O><p"I4$1:WXJg٬ZR*IRDi "7~ a .Cv\zs=0$I 68ko/0~>]9gPR93 D;9RN#ڙҮK&9n3<;$PkkƳcvCםz\r%9t:d $~77gk81t=N:$$rb* Mc;3? $I}E|T5yOj)$9oD~m S ]3h ~qG$IRȞc`1UysaժU90$I HKK 555=SۍbC'ND9s0Iohov-n Sc51t\2~\{I$ czW… D$6Ȏc{! 狖ݻ7vT$Tkk+d G8c#aY h 3j(-[F^ C$V2 c?O`1Uq)JYK_{AKH$hkkk!NST%I:|uD6<n EzmE,S^^N[[W]u\s?&$|*+T` WSSC[[_=\rH$ig au;&M8c D$'HAc*.6klld͚5Xɓ'$IF@Uc*CձqF^z%o $rnF?1-.,>ڵk-$)|*`1Ua3|p~S]]m$ 崡*`(p1XLʍΝO"i I g͚5v `1U5;c[)$Ifec/߸?gsr]wQYYi$)zN}6n,oƌvw1 I w 'C*˜?xnfRaH$i4@1ٳ~f$r> |,,cسC=!I,z)Jcs>|lԩh^$Iq) |,j_ư{fbҥTVV$I R[[!t'`1՞p1޸q;hhh0 If̘a f : r7۷/կ{ C$ H&Do S\34=|  0I^;RG]k 磼tjjj/~a)$I 'CfTi ;WUUESS{/Ǐ7I$i,b*`?*cعj6n~͛g $I(s# ^4] 6}3<@$Iکr~#+p|;uV.JX%I:sH1Xm ,n6i-Z7$I4/6@QXLC6îva<#!Id9ͧe!|6p^3]a>GyY$IG>GyQFPߟgyFÐ$IʢZ ]1#7Rkz;J$oMMMAKXL/`׾0n8$Ia94=|,!vTWWw]ϟo $I9qFJKK b> 5i1 n ; ֯_ϒ%K>f $Iy(rɏͼwSOeҥ!ITB22='bZ~ 3=z4?9H$YNn1䆏ٖҝӧ7xT$ aƐɭvnٲe̝;t:]:I+// v6c>GLs#Quuu挾6K$IRlݺdb3aG6lo䤓N|A$)J!r|b)kAs .4I$i\4^48q"^xI$YNn!p1XL`_cQ>}Ɏ$IbIv&`1t#[#xx/bK$IR mٲvt`1t-!{7ÎfϞͲe(--5 Ivg=Po Өh3~<0$I,dŴVaG*7I"PSSÆ  b׆/Cii)GyR*ITD a0i!vt3nK$7ݭ~9>5w ]SL[oe3 Ib- B IDATo;{0i ` ߿?wucƌ1 I"NI$|r~L3hg`G]vT$)%%%.kSbKp"***89묳 D$)---kڵ:Gy;. 4û/]3I 5'b+2wmٲr$I P2 vn 13R믿R*I0ݭ}1--lSN9[n $I#ln3i|1d5TWW$I,T-մO 1[n0I$cÆ \ ׁOb!iϞB]]ׯ.J$ ib%ӀG!c޼y{!I] ݙ#a眕w7^zq%$Iv>h8p1XL;*2/* 8쳙4iAH$i֭[g;wlcߵ$zeee4773c |A鴏fH$}eƝXb zb P[[/>c$Iv?]#@K)pM7YJ%IԹ‘rR#ǓFy7ӟ47 I$uK c@wcÇs$I$Ncݹ2oҧO$IR <v4X` I#աgRRRB:fɒ%ygf}Ovyn*Yyg >K2rHÐ ?nmuɳDyw !ũXNSmS(cKrꩧH{fx4Mo:_n++/ BʣZ bGf5!PSSCSS .o)-MoGв DE1ԥxѣGT䞙5 H9RFI5!YNۣ'4\#gC 6p2o<)^|֮xtsaHp!VVƸǞ5YLLizgg?GcgHIrgAp ^g.Exz(6m2I%8aArZ<g uS7o榛nbѢE~)HMIsH,5Xi1 ǀ~/X[nT*W#Ƹ֤%k} ra( %Æ WX5 [ B:hR54'W\JYf _|1C W,uR^ B䷧ EGWGlmnCPoKSN{U ꚛThUyPnʉu*pk(58'|TԔf16Ԥ;| XRYY&'!?B*!`Esl(ZVM;tsAHR1\`2 B;~5}l+"C슊 x Fi{wIR6 Q 2^z 2ri vtGK,+ N{7JQIRCЮKשqZiX=`^yOmYF%IѺ _YNw̨iQONO<ĉ=e$EZ W]]ƍ "[X|gp 7xJ+>6o6IR[j+~grE?jžvH~<JwS-;4ݾxbhs1I%U9VZZJkeJ|=x*++$YRv |b?'|y²J,#8z `+Pa1 GKmmm̙3oSXRIRpJo qA-q=Pd2ɝw=ue!$Q2d/AbANihh`ڵ}'?񴕅T^1g "wM;oi] \≺^{SVRIvQTif16˜qxuuu_N;nURIڡ߅Kq" ait]|-#4NN=iB:y8$I(f̃ r$p}9ģ&ozj~m[6$IӺqOMJ"G~e !@Q^zd<_|R풏J~T[P#[dXFOPQy3sLOOYH%I"F֮]kx-(29R:w\&Oi<=cT.2Yf!d|6FL h|ᇙ>}a!$)7\f&bGzqހbOȥtŌ5Qv!IR<5i(0~󆡨IbXn/Fz.[sz:QRI򬴦1J#A//ҐJ餡RID-R}6n8R7ݻZ(T$%;Cqt@\>lGL5#*~toK$I^ړo6f"#kժU;Sty~$)8jx34n#VJ+++袋8v)bc)$)0Viii|..4nЎM60}t***PqZ5 Z7n0I,ʢ#h\:_iݾV)G7Kҩ#I7o5I,EH&CDiv}##h̝;b-SFN$ILsss\[`gݺuL:z;=3e8$Iځ"8 @(N [N:RZV:R*IvʑKRGpy?`\n 娩dӦM~a)M$IڥDycAd8jZ Dvd$#ɐJ);g7HiYJ%ImƗoʦp߁C9ZJJJHOQ)u]Iok퀽sC:Z/}o"̬RIao,ꇋ-C_x8Zꏊ$IWU56}5#? ()-L<|饗a)$Ip&eOdF _uw_OK$I;|4%(QQPQ1 ģdto K$Iʅ/DCEV:.ǏtC)f̃;Qm[O]iPأFu/cƌ|o{z!ml^'osY5e6ZL ZLVЎ;N8ś]'JNLGcAtQ:&Ho KF4|0Æ R*IRDmmMmʎGL{}7x`,PڑqG0rH!,$弌n:`;뎜 yH(`@!={nਣ!|GFBjsj'(ܑ-@bkX0k,/_?$Y^ݵY" ;LJx4̚5o%Itp V6TVVqP72(| i&,$eE"bغjځ玚f=R$6>j#7m[dzƌ~3$ɂR`{fCDiV C#~S!Z^oHh>+QO@"mjKvU:s/DGP Ceee4773i$V\7A++IP!Y(Fa?[De4J)h~bhq IUeĒGMD^ڞohh`0֦ ATP5_A졜m[6ZL3.eWWWd^IR w*hq?G"2[YYY>OSڵk췘Jn>9/]z>kcD+Hkz,pOQ1 nZ;.1RI,y52?i.)?< /*Y}C$YJ1^֗]$H(㼅.)&=h z37$2U]X|ꊂ[blguUSG$ F;Q8a> x.C-燶GI"ltK!H򮴦dMAhqi.[vm~h:b!R aVTT0{lƎ#OMvYIR$J]&=ln33ǹ4upЊ'Cٳ[l`ĉ_7.I*diZ!je哟 vC+ iݛ'zLjH,Kp}+_ uӏ1bGug$Iڥ_!8*mzjpwl6pZJzQh{vў~K+`a0_Fc`\1:/bo!Ͳmٓ /3/sIviB!^ƍCSB)C؛׏}3;&V:$IyUuODAIY!H@b/C۫ .Ўtk!Hjm0]vԄgVR |^{1HжqдK3'в~AHGH#Xhf~,7MwS6pj{qӦMLK$)Wf )zy.w1 7m?iiISW>oQ/2}~2ok滘^ڞ={grLc;$Ikꊏk1=#W^I$IҮ8*ɇ MLušZLB{[n+P3$Iv)y)bkGkzC$卣')F؊e!쵺̠G?wf$Id2>؊!3#o4&VM;$IySRVfa.w577{W2UL=zH7o5IRތ{YCbXgԑHu՜b)N:$+IKBUUU)bzZH{mʔ)C A7ɺzCrC;6lf(bիz򌍉- A7bhc1b:-=vG0f]I$HR7KB[C ҳ5Z6I$uئMB3^LeO5440bԘxf8C$ț5+1nh.ci(ū1b3g$IP5C1t?[w.u'fH%!nAq- B;g8p $I׾q!dY2 qOk104aИ$I J:mYe˖7ӱžg?ۯ_?;<Иx_0I$c#fi (-=1ޞ={zJ_pU $J AQq+'w?pQISc!q+3*㼹,yL\<3%Ilz20'ĭ\{dL\=z1jځ I$uN_riinݺiӦyxH$Ib:/r{hJ$IJqq)i;3R$IR(K15j$I K1-e~$IR}w@ԋiP3LL8#$I A4;PD2C2FW$mCP6b:@CC ,CR$Ink5 Lz1m(=vZ/^LEEg$I[Ł>!SRRY(I$)DY[%tQ({`TUUy(J$I ձ9s&ݺuP$I;M@6PP3$I{ҥBX=c!h֬Y&j1M*++=$IR.V@릍 }оQ+=S@1}zJ$Iڱ`%maQ+g{L<#Fx#$Ir*E~(Kiig]̴$Ilݺum`0ѣg\ [ A$Iʮ+UL@I1J8p #Ge3M$`2& 5[IIIh< *tj'yfL&I: @ߡQ)'xn<$I$R2 mFJ L$IK>`h%cULzr***8qg$ISt) 'Om<;liQ"[]]i}3M$IvԫЅbOx͚5{I$d BBIzРAn$K|,4^Z:W6yfbNkM:3L$IɇPw c=3L$uӇb1 ߰BӊPi߾}=$IRml1oKRuR* Şn*vȑj$)kVgjځ u\'j1^ɮ[q$I!DXeuuumB`^Ї>%I;Be W@fJ ,̒$IY׿`;RM*T1c$ItGdg╺_iSL8ԞbvtĴijʔFY#I{'^瓊M"-e碘Bzݻwg5$)%8aQ?oXΝ`i@ڽdLGkllʳF$嵯׾w}ygz8Z6p4m-A$Iu}]L I$Idl!!VQQ#I$I1 t@xH$IRvv1 bqzI$Iʎ}]L{oI$Iʎ.i=t0R$Ŵӱ/t@1;]]]BPLǎSb>&}Q!r1-U 57͹ 5ཅ i 9 T*}IӡTyQLwଅB@1=Iv'87N;$ѷOPL477 @1m'-.`8SRb @C>Y0 S3*=`,i,jӎFNT**)-: 0BT,kd 0<]b,bJ CN])?Pbx#g.gL7>K yF1?6Qbt#i12eaP=*m`zUL;e  j&90Bګ]L2`^Pi!nY* XUbZLeUXikR3c P5W>Q̘T.!? $ee. e  Сe ǍgUisT1)Bz^ziկ:jjkk+.b( 8j/>0RqC `xT1P͘.bPPLᑑ* %)E'G>PǏC-+''7kƍ'[6ŴWC3s"mCӧ )9ꨣwt1]lH Mggg6#]L s˘iӦ9z-U#~*EImo{[^G,b:HiRCn"Y* )vu&bZŜBqEG -JBzE;G(JǏwԘ˄@])涌V1(~p$Ԑug j*%+VXt1Zh[e X)* yj.is|)eL@UL͘P?Z[[57,J'| z7 FbHQoxט@9H @֭Ew^-sƦ:pGmbz[^ywe@] :IhEJQP+\c aƽ`9jҬ-=ى'^Leg-h1xoE䖱*ld7pJ# خumU1ѓxΜ9.K9VtmfKոJWQVLƱ.t[[[}QCئqmbzeQ^lY;8GM^XƺoҞ6m `s+ƺ.(RؖU;f}f͚e[4s̢m͵RL%z(W]u آ#8h|u~Iooo6Z))uי[WM~V魅z;۲tRG Q;ފEC[ iiFґ./OS袑M#+ޙ>}wu n[G뵘~{ufG)4"nt1h{F.BG*4m$##]L{tuF7\_=6~xԤIٗ{1F~,_ h\Np[n,[ 4F4҆)ڞu] _h0'O.f(Es{g֬YQ;Q鷊J#gO'Y(tY*]we@(7~6ߤi7; }^S:岣G {cq)ԹmQ(oغK.Q ԣ3ؾ nbzjQ 6>~ы^dH@*i+5j1]{k':zfMcmZ*s5L:?^LT=.$I:::rI'%q'mmmE$6z1Yvڍ,X.̭cZwhæ1G'Ovm8ԉw޹~VQeo|N;9NliQbzA7Pٿo4D7jӿ˿uӿWb"3ggq@-}~cъi!~{nta}}}EےcYL{3Z.uӿ5V߸i7"C9$k֬q@ jmm-_SbzJw^z{{-Ԓ٩Zbڙ({zڵO<S*oTi^L{ꫯ6FNEYxkv&)=*IR.= )ꦟ:?@SE>{׌P+ŴPnZD/Bk>c|o-$禧m 0jbZG#<?cݨnE ]]]_Tc` TYgKV$/P]*wE5/zыTM_[?KaX#\.3::rV\ZSg"t|ȣ駟ܹs=uA~t&y#Pa4iR#[q6IyuYꪫ<0tvvyOLK1%ʴi6>~ꩧ<CuR=Mu6֭[q[oaC0~GpbZ]#j͚5)˞]`z{{?J/zTŴ7"w]YzgGzA,}dyA+ߗdb:2$*G0R|~ئ: ?x\P&k굘Nh#\.gԩ~gz6uR=Mu8:;;7>׿;ӡ1[dauKWX>37sL!$'T#sUW]7=$+c㴢 gժU>_?|S쀋8Z[[7>G?o١@!?^ɏӱc0y駅@!=%WLx&_)x$_ hjNc19@alzNJ<ɺz߈Fz{ay}Tem4g-@y͛$yiG}#hߘLF۠Q6VٳggΜ9!-MRY2Ŵ>d&<@,X Z\+^ AT|7w9lzio>?| I\<@MZm*>Kr ~z!TMrbNH^))]]]`LM0AH6;c ^6v;F['bZ ʍj mIgy& ̟)FM:U*D ?UںqTJ__vտS@ rܝdbZ,g'4ȳ~;ZwLQ7;}~0;rk`C5lfKP1-F&M̍7pOfL=#|d簢ޞ)Sl\pX7c 5eewn܂sRLx|;\xaϷό)4˅PJV,?:3dɒٶrY1Fӵb[<bQVt$)zdqNnl!ԡM#I)tSo窫rP͘>߈@1ݒDw@T@=s=\&tKNJ+}_4s V3@ŋw@1ݖ`srJ>я9jz >?~ 6wM,Mc˞H1  Yh(t$/gmzYf妛n @JiTr ֽ+xQLGLoZ*~x,X V*»u&$bx֦uŋРynݻEDMWMK A$OA1M%L [vG{@q]V=t1(c}\s>[>s'Jv$\1($K𬞞~'/ @0a+?A1E}Ƚ+<݂غiL1ll ;K8p~f1(Ió'?ɜr)[>n[ObZ^!m򗿜O)J)@ inn¶9W1I>'m;3rq)5 uQŠ֓&yT v= vI֙#bPL"ؾ5k` M6ma"PL_`8Tn e^Q.3i$AlW,bH /̑G2y bHbPLaz!SfؾCD6׉`6+^ T b6bPL}I~(-~vBTﮔί\ Ŵ> ʬYw#]]]ZJיbPLOD08W]uU>GCښS bpޔW itr:pex =첋 kIbZD$U 68؞L6MsObZd&q ͟??/{R*Sm0aB18n }QΞ{R$ -(JJdSIM ~<񄅍TJ$Suj*3˖-a5k@)|R )ϷO,O=h .QGիW ( n477 chf@1e^%;wn]@!J|U)@͛7/}kߟA IbW0x/θq㒸)P+V+_JA $b훤[ 7}$IJBhkkˋ^"A ^\W2,/ rIDATf„ >qD _JN*9$:1( ݲ$$ʮ^{gyF0@YrR:tdSlzOx oy[Jh(/ _BA INbʎ;*1 ͼy)瞂I&ŔyQpŋ;|$[I $/}/!S Y Խ]w5k׮,LbPL-]Iv?>2Ab 06/K^IvK!Tb!qj/0꺻*T16NrN9FKkkk&Lp9:2bPL]J)Pz.1' )u$r Ԏn1?LrSDZIr >3;$bJyUk+knnŽy$bPL_/H+}`>>IEѸ%Ű{b%Ac ԪL4)===q/IbX 1 S`֯_ &(qRXf'9N )0tڴiƎ{ObPLi<'S`dL2%\.Ŕ$A9KTJy{INbJ{_bPN_*/yKQHY1Uymi#c^;VԩS&5ɡb(&3$b1fOxܬVBT1vI-˗ʻճ*ɾbPLR_9k{!iO(QLE@$aTNTh,r9I~7o}[R=}I^6Z$+J +@c(JG?}s¨=xA5 Օ|+oNj2cJd]/bd S7I$׋j2cH$'a˩S\.'I:;;])]+(ԓzW*S +K_|K_'IPL7&yFΆwS3Lw K$R$7aM<97bAPZ((o=w\/^,ӕ%I#Ɍ)$koow) #rJ=Ptt=d7`ƔѴ{eȨz/̌)4,]4{W5SXAA`4L22{ @=ZdI?3{R:f%k6FSځ(1sJ#2c 5]w] cl"ɱb`1e113Ժ;3Gұ=bƔvG0̞(̘B8rgWc$bƔ0f,ZwOOrYg)c=J))$K 1hYW=# F]OOO:tR\.ƚSy%bN._M9NGGG?|7bSآIZĠb +_}S cke*i)l{, S^{m~_3ػ=ɡIEb לTn+2eJ@1{~z¨ ?L 1P/&5ɽI^)֖W=OTa0hַ'yRNHrUfL'9F c˩"3P{nYmjȑI)I-1 N@1U.S*2cƌ̟?HkGO<, jR/NKrܹ$3Z =R*2gv9mmnY5.B1QuuAAE1F޺urg檫ʬYR,rb cĢH *)0¾?y͛'ڴ>ɞ\)1k|QL{b clbUIL4)7AB'=XRb@1ӒdjS|QL6e9c`Ծw.41kb] P[zzy{ߛK)}I^h̘Ҩސ6c=eG1+W_}u~_旿@ü$(PW&&YdWQԶ:pOA(s=77tS~~b@1$oC}0b #c뮻.wq@G9ɛ5輭|BaFˢ,r@RZ_V&E)̘RrZ:d=Yd'ԇoOWPlSض;.~݇O)4hAѲhAHJ\w3eW\qER*b@1I"TSx˗g+B kMW$Y- S(W$7I(TSGs͝wޙR.J!1BqݝbPPQL^\y啙5kV.<G%PL/&ɓs>/b ?gyf~_gYٞ ${%Y+ S`$y Q73)4?>|r63I&&UmFˢhY$͚5+vXJR~eҥJicOrR 3c [$?Ccp>3nj)3>˗/Opǂ$OPLa&&y4()ԒG}4Od֬Y#֛d$@1Ir()SAM;wn宻#< ]3ZPLaTܗ~f)?Vj͞wv}[A(9_"W;d'yCQ5I>Q4O>O&?{8?~|vywL ^\i ȸq(~z}m0f'ySS#& kHD'Zy%t1յbu+WO? NKK +'9*ɵZg&lXf,XI}b뮻f͚wyP1Ꚙ$G'ך@ Ӧg*'x"%^{H*oM PL杘fQGָ)ӲsA,]4]tQ͛Gy$ͳGfIA111=IL(#TL'O;dժU9SsmeʕYlYL6A7'UB$xcSӦM˵|a.y#Gn1yrA0d3gp YzudҤIY~px&y@1FqGs577gܸq׿\ C4iRNAUIOOOy晙5kV+?f$N(@1FsdkbEli(&怛z{{O5===9srpCI>%PLoVNrͿD-_</xo_W9s`IJ(@1xYI2:KlQ0[hѢ]6sɜ9svڌ?>===Bb8>ɏ)՗|U (%ܜz:::rWfYlY/_%Kdʕ=mmm_IC vFH?~|ƍr+YYsଅvj Koooߟ /5\ٳggڵI]v%ׯO___̈2RM$Ĝ7tmn$w&[Jz:X1Yn]:::ݝ~~gʕIPBW%q(0wI&EU1W]]Y|yx≬]6ׯOGGGZZZ2o޼̟??]]]V|))P_OE1*5>`.]UV5]]]ydzp<#y7~5kZq{*oZmSJ4eQ9{oJFP&OybZ'|{Yxq{챍;WΪU|<3; I2'D)PB:1ً^Sά$/u6Qpw}y裏fŊYzuՕק-W~޿>}z:::PE_w&ZU6זׯtq[?0T(diѲhkQGR~uvv桇ʒ%K裏n,+Wիv)(טBѲ(pR@Y٩VkyPk.OeD)1c j[K_Gf9L)IP#nJr@1М72μo[r~H 12;Ab I.Nr%w&9 )`>ɁIE( EI/ ΁B+ ๬ lIoSy"qZ~짔)0\xAq(~, @1c/0Nu}S`48% r c ŏuLL@%91YS!ɥI^( מݩ\G 5g$W"ei7%yL@5eIO2>n5(nx^PLzқgo5sRnԕ$<%FSyth S9ڴ.Q@1nI~䭢=jQͩXXTB.$ <^)ƊSV6Œ[IfL0~SYTzIx}R 3X->hYTNe'SI IMr(`u&Is$c?yI>ySMJs6S^#-YIPLFljI+4Q֙$PLnINOrLq $-^$h@'Hyf^Sy$sOFVG*3_SFSiN|>kvԚ$^q(CTNS<ߓ\ ސ$$'`If&ׁ?PLFI丸.-yR찹o޷4ϏITfM>|hȏ$w0vIBއX;pIv,l$$a\# ̦nT-#ɇ>NU($ \0L$)C/M-'0J3xMyx^ǩ b @;bq}m* I6PV$M(IrQ[c\uJ5 Eufmrw&+i3ƺ,JeaM@$)5j߭>whYTNqx )˩\j\TV>$ɑIO¸jt'Y$ Ѕq()5Ok[׷fŕ6?PZ_z@'8=&y:$$˕OSb{7Y-^i۲{W &yU'%xFT9IO*v>T$+E9z?g׸4J>n,[s'ٽ)ycKTVl?P(XNY.G@ 2 Sr{fYޑ`};҆ǥ~)ms7:[}ά$SR9mxI^d$ӓ<1!YqM>mB7ѓR:>ZIdU`>>TNmKe!PL(枧7PIJ#x1P)ѲH;u[ߡb [`S~2/l%g|IENDB`mu-editor-1.0.2+dfsg/docs/logo_design/mu-logo-large.xcf000066400000000000000000002044271341747546300227570ustar00rootroot00000000000000gimp xcf fileBBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) mu-logo-large.png     Ei  )q[  \   D4DY+u"$?$O$_$o$$$%c(*0*u**-2z233334%4e5 5669;};=ACECUFGJGZGjGzGHuJ\MPRwSTZ\^!^1^A^Q^a^qabeeikFlruuuuvvv&wy=}}efjz-`pXAEUeu&6FVf!15EUeuLɯɿ `/3CScs15EUp^IY]m}SV PU(?;98[6443 1 ?;E8.63 1O . +w)%&$"h 1q #%7'_)+. 0 2468:=:#_4\0E ,!h '0#50!zW!0% W), 3/C3Q6T9Q   7 !0ARdv( 5Pn !Ae.W)u('%$#7"_!  !*#? ;P;8 H86 I4"4b? ;P;8 H86 I4"4b? ;P;8 H86 I4"4b/_ -$+*(B&%#@! "D "a$%q'(t*+d-. J/ 1 *245\789y;<?;_7 6 Q492U0v - +)&>$Z" q qY>6  A" L$D%''(_,7+ 3/ .0 2 ]4 5799);f?;_7 6 Q492U0v - +)&>$Z" q qY>6  A" L$D%''(_,7+ 3/ .0 2 ]4 5799);f?;_7 6 Q492U0v - +)&>$Z" q qY>6  A" L$D%''(_,7+ 3/ .0 2 ]4 5799);f|6{30 , )%   ^!1"%(- d,]2j4O79 |6{30 , )%   ^!1"%(- d,]2j4O79 |6{30 , )%   ^!1"%(- d,]2j4O79  % +0 % +0 % +0>3-(#t#).1t 59< >3-(#t#).1t 59< >3-(#t#).1t 59< ; 8 5 2 /.+% # !#&(+ -02 4 68;=; 8 5 2 /.+% # !#&(+ -02 4 68;=; 8 5 2 /.+% # !#&(+ -02 4 68;= @=;97 3 1 1/ ,,*&&$#! "$%'(*+-. @=;97 3 1 1/ ,,*&&$#! "$%'(*+-. @=;97 3 1 1/ ,,*&&$#! "$%'(*+-.689O;!<=@Y=!;9H86n5%3 2 50 .?-+A*(8'&($#!\ 3 !#F$%'J()*:,y-. 0M 1 2 35C6v78 9!;C 2 2 1 0 /u .4--,+*:))('g&&%$~#&#"!y  J<O;J:B:@9I8V7^6]5T4G3< 2=1E 0K /F .5 --* ) (  J<O;J:B:@9I8V7^6]5T4G3< 2=1E 0K /F .5 --* ) (  J<O;J:B:@9I8V7^6]5T4G3< 2=1E 0K /F .5 --* ) ( >$P%d&u'()*+,-. / 0 1 2 345u6d7P8>9*:; ;< ~1)1w / -F -}* 6(h'4']&$#P!3bI y!#/"[#&( )-*I+ j- , / )0 11 ;3N2k36 689:$;:<~1)1w / -F -}* 6(h'4']&$#P!3bI y!#/"[#&( )-*I+ j- , / )0 11 ;3N2k36 689:$;:<~1)1w / -F -}* 6(h'4']&$#P!3bI y!#/"[#&( )-*I+ j- , / )0 11 ;3N2k36 689:$;:<~/ 1% 3 4 679:;%=> ?/ 1% 3 4 679:;%=> ?/ 1% 3 4 679:;%=> ?== :998 5 5 2 1 10/.+ **)&%$#t""!  !"#%%'()*+,-./01 2 3 3 4B56789== :998 5 5 2 1 10/.+ **)&%$#t""!  !"#%%'()*+,-./01 2 3 3 4B56789== :998 5 5 2 1 10/.+ **)&%$#t""!  !"#%%'()*+,-./01 2 3 3 4B56789 ,/8.C-M,W+_*e)j(m'n&n%m$j#e"_!W MC8 ,!!!" #$%&'(n)P*5++ ,-./k 0C 1! 1 2 3 4v5C66789M::;2 2 344>55677"88T99:<;<<,=' &x%\&?#*$ ## | [2  h 8!"! v"G$%&'n';( )*Y* +,-Z. 1. / {/ N1 1 }2B1 34z5*56|6/78 V99 :G;=;R<=' &x%\&?#*$ ## | [2  h 8!"! v"G$%&'n';( )*Y* +,-Z. 1. / {/ N1 1 }2B1 34z5*56|6/78 V99 :G;=;R<=' &x%\&?#*$ ## | [2  h 8!"! v"G$%&'n';( )*Y* +,-Z. 1. / {/ N1 1 }2B1 34z5*56|6/78 V99 :G;=;R<= 4.*&""% B884=88.88*;88&:88"=888"8%8 2''4-''.''**''&)''",'''"'%' + -y E+x=88D8 8A8-8A8y8 5+m,''4' '0'-'0'y' 0 '~ 0ED8 8E:8&8:8~8 054' '5)'&'*'~' + _EB8+8 Q52'+' -0  E-08> 8 5-0'. ' ;.#!*1 8> 8A;8D.8;#!8=)8918 789>8E88 '0;'5.'*#!',)'(1' 7'(>'5''8 3.)%" #88 8E38A.8)8;%89! 8#8;'8 '53'1.')'*%'(! '#'*:;<=== :;<=== :;<===  = <;<;: 87876 5 %3 2 3 2 1 /0/.,+,+)*)(t&%&$%$#!"!%   !!"##$%%&& ''%() = <;<;: 87876 5 %3 2 3 2 1 /0/.,+,+)*)(t&%&$%$#!"!%   !!"##$%%&& ''%() = <;<;: 87876 5 %3 2 3 2 1 /0/.,+,+)*)(t&%&$%$#!"!%   !!"##$%%&& ''%()73655\4 3 3 2 (1 1 0 8/ ..A-,,?+**5))(%''n&%%H$##!""Y!  !O  !.!"R"#w$$%%&(&':'(M()Z)*d*+k+    887776655 443r 3 2V 2 1: 1 0 0 / / /.u.->-,,,+w+*0*)))(>('''&0&&%o%$$$#4##"T""!r!   :9`96 7274I53K22]41 2%2 1J 1 0_ 0 -] . ,M.+ F-*S,+p+(*' u)&Z(%='$ #&##%"y$#_#"B"!/!r  F  "d9 S $ :9`96 7274I53K22]41 2%2 1J 1 0_ 0 -] . ,M.+ F-*S,+p+(*' u)&Z(%='$ #&##%"y$#_#"B"!/!r  F  "d9 S $ :9`96 7274I53K22]41 2%2 1J 1 0_ 0 -] . ,M.+ F-*S,+p+(*' u)&Z(%='$ #&##%"y$#_#"B"!/!r  F  "d9 S $ ;:97643 1 0/-,+)('&%#"!   !"#%&'()(*+,+-./.0 1 0 2 3 3 4 3 59;?88:8987A88684=883 81?8 808/8-<88,8+8)A88(988'8&8%8#x88"B88!=88 <88:88:88;88;8 8=8!8=8"8E8#8%8&8'8(8)8?8(8*8+8,8:8+8-8.8/8E8.808 18 D808 28 38 38 48 B838 58(;/'':'9'70''6'4-''3 '1/' '0'/'-+'','+')0''((''''&'%'#m''"2''!-'' +''*'')''*''*' '-'!'-'"'5'#'%'&'''(')'/'('*'+','*'+'-'.'/'5'.'0' 1' 4'0' 2' 3' 3' 4' 2'3' 5'()-. 2 468:< ~(8@8)8-8A8.8 28 486888:8<88 ~8('/')'-'0'.' 2' 4'6'8':'<'' ~'8'8'8'8' ;:865 3 2 1 / .-,+* 88;8:88868@58 38x 28 089 /8D .8-8,8+8*8 '';':'8'6'/5' 3'm 2' 0'( /'4 .'-','+'*''+.1 4 79<> )&*-/1 2 4 5789:;=>='8A*8:.818 48 7898=<8>8=8 8B A8)8<:88:988&8*_88-8/81 82=8 84 85>8878889;88:@88;x88=8>8=''0*').'1' 4' 7'9'-<'>',' '2 0')'+*''*(''&'*Q''-'/'1 '2,' '4 '5.''7'8'9*'':/'';m''='>'=@=975 3 1 //-**''$$#  !"#$%&'(()*+,,-..// 01 1 2 2 3 3 4 4 45 5 6667@8=898B78?5 8@3 8B1 8/8/89,8D*8*8@'8'8D$89#8#8 8>89 8!8"8#8$8%8&8'8(8(8>)8*8+8+8:,8-8.8.8/8/8? 0818 18 28 28 38 38 389 48 48?58 58 68686878@'='9'27'/5 '/3 '21 '/'/'(,'5*'*'/''''4$'(#'#' '.'( '!'"'#'$'%'&'''('('.)'*'+'+'),'-'.'.'/'/'/ 0'1' 1' 2' 2' 3' 3' 3'( 4' 4'/5' 5' 6'6'6'7') *++,,B--%.//001 1 2 3 3 4 45 5 56778899::;;<<<<=>=) *++,,B--%.//001 1 2 3 3 4 45 5 56778899::;;<<<<=>=) *++,,B--%.//001 1 2 3 3 4 45 5 56778899::;;<<<<=>= ====;< :;9 9::998867766 ====;< :;9 9::998867766 ====;< :;9 9::998867766,n,-m-.h./_ / 0R 0 1A 1 20 2 3 3 4455h56C67!78 8y89E9::;;Y;%%%&V&&&'_'''(V(((*>)))+*w***,7++++,A,,,,.0----/. !G!""E#w##7$$% >%%'V&&&f&''o'((\()) ;)]** +7+x++,U,,.1---- V--. %. j. / / +/ e/ 0 0 "0 E1 Y1 z11"2 12 U2223,3 !G!""E#w##7$$% >%%'V&&&f&''o'((\()) ;)]** +7+x++,U,,.1---- V--. %. j. / / +/ e/ 0 0 "0 E1 Y1 z11"2 12 U2223,3 !G!""E#w##7$$% >%%'V&&&f&''o'((\()) ;)]** +7+x++,U,,.1---- V--. %. j. / / +/ e/ 0 0 "0 E1 Y1 z11"2 12 U2223,3?===<<===<;<<<<;;;;;;;;;;:::::::::::::::?=8=8=8<8<8=8=8=8<=88;8<8<8<8<8;=88;8;8;8;8;8;8;8;8;8:C88:=88:988:8:8:8:8:8:8:8:8:8:8:8:8?='='='<'<'='='='<,'';'<'<'<'<';,'';';';';';';';';';':3'':-'':('':':':':':':':':':':':':'467788998:9;;<<;==<== <848689858788888:87898;888:8F898;8;8<8<8D8;8=8=8=8<88=88=8?8 8+'4'6'('5'7'8'8')'7'9'*'8':'6'9';';'<'<'5';'='='-'<''=''='/' '8'8'8'8'8')(''&%%$##""!!    !!! """"!###############!"""""!!!!     )8(8D'8:'8&8%8$8:$8#8_#8"8!89!8!8 8 8888=8 8 8F8!8!8!8 8"8"8"8"8?!8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8x!8"8"8"8"8"8: 8!8!8!8 8 8 888@ 8 8D)'('4''*''&'%'$')$'#'Q#'"'!'(!'!' ' '''',' ' '6'!'!'!' '"'"'"'"'/!'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'m!'"'"'"'"'"') '!'!'!' ' ' '''/ ' '4546 5 4 3 4 3 1 3 2 2 1 1 1 1000/ 0.///-.///-........../////.00000 1 1 1 1 2 2 1 3 3 2 4 3A858=84868 58 48 @828: 48 38 =818 289 28 28 18 18C 18 18080898.8/8< 08=8.8/8/8/8C8-8.8.89/8/8:8-8.8.8.8.8.8.8.8.8.8D.8:/8/8/8/8/8A8.80808080808 18 18 18 18 28 28 D818 38 38 ;828 48 =8381'5','4'6' 5' 4' /'2') 4' 3' -'1' 2'( 2' 2' 1' 1'3 1' 1'0'0'('.'/'+ 0'-'.'/'/'/'3'-'.'.'(/'/'*'-'.'.'.'.'.'.'.'.'.'5.'*/'/'/'/'/'1'.'0'0'0'0'0' 1' 1' 1' 1' 2' 2' 5'1' 3' 3' *'2' 4' ,'3'4 5 3 t3 4 2 2 3 3 1 2 2 1 1 100.// -..,--++,,, *+++***)))'(((&''%%&&$$$$%%%#$$$$4 5 3 t3 4 2 2 3 3 1 2 2 1 1 100.// -..,--++,,, *+++***)))'(((&''%%&&$$$$%%%#$$$$4 5 3 t3 4 2 2 3 3 1 2 2 1 1 100.// -..,--++,,, *+++***)))'(((&''%%&&$$$$%%%#$$$$   C3     W   0    W   ! v 050!hE\#_ M     , P....0 / P/ / / / 1 0 ,0 i0 0 0 0 2 1 1 T1 1 1 1 1 3 3 2 >2 r2 2 2 2 2 2 4 3 3 :3 _3 3 3 3 3 3 3 3 5 544&4>4V4r4444444444 a3 3 5 5+4d4444 4Q44555 ,5Y55666 "6@6d67777 7,7A7R8W8c8t88 888(9,939?9N9a9x99999 : : :: :':2:>:K:X:f:s::: a3 3 5 5+4d4444 4Q44555 ,5Y55666 "6@6d67777 7,7A7R8W8c8t88 888(9,939?9N9a9x99999 : : :: :':2:>:K:X:f:s::: a3 3 5 5+4d4444 4Q44555 ,5Y55666 "6@6d67777 7,7A7R8W8c8t88 888(9,939?9N9a9x99999 : : :: :':2:>:K:X:f:s::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':'8'8'8'8'8'8'!!""#$$%&&'()**+,./01 2 4 579;= !8!8"8"8?#8$8$8%8&8&8D'8(8)8*8*8:+8?,8;-89/80818 28= 48 58A7888::8:<8988!'!'"'"'/#'$'$'%'&'&'5''(')'*'*'*+'/,'*-'(/'0'1' 2'- 4' 5'07'8'):')<'(''<<;:9765 3 2 0.,)$#.8<98;8;8:8987F886:885 83=8 82 808.8,8)88$8_8#8_D8.8:EE:88'<(';';':'9'76''6)''5 '3,' '2 '0'.',')''$'Q'#'Q4'.'*55)''54657879:9;<====================================================58@84868:8587888E87898:8<898;8<8=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=85'/'4'6'*'5'7'8'5'7'9':'+'9';'<'=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''='"####B!"""" !!!!B                                     "####B!"""" !!!!B                                     "####B!"""" !!!!B                                        d     , _      < n      . W       !Ae 5Pn !0ARdv44446666666666666666666664444444444444r4V4>4&444 5 5 3 3 3 3 3 3 3 _3 :3 3 3 4 2 2 2 2 2 r2::::::::::::::::::::@:;: : : : : : : : : : : : : : : :: : 99)9)9)9)9)9*9)9*9)9X8Q8Q8Q8Q8Q8Q8T87}7}7}7}7::::::::::::::::::::@:;: : : : : : : : : : : : : : : :: : 99)9)9)9)9)9*9)9*9)9X8Q8Q8Q8Q8Q8Q8T87}7}7}7}7::::::::::::::::::::@:;: : : : : : : : : : : : : : : :: : 99)9)9)9)9)9*9)9*9)9X8Q8Q8Q8Q8Q8Q8T87}7}7}7}7:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':'8'8'8'/.........................................../8>.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8/'..'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.' 8 '  8 '  8 '  8 ' >=================== >88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=88=8 >''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''=''='                                                                                                                                                                                        vdRA0! nP5 eA! >2 2 3 3 1 1 1 1 T1 1 1 2 0 0 0 i0 ,0 0 1 / / / P/ /0...P../---0-.,,,A,,+++7+,**w**+))>)*((V((''_''&}7766666655555544444o4 5 5 5 3 4 431 [2%2 &2 '2 1 @1 N1 Q1 "0 z0 z0 }0 A/ / / /...w----...,-*B+$+$+*<*P()}7766666655555544444o4 5 5 5 3 4 431 [2%2 &2 '2 1 @1 N1 Q1 "0 z0 z0 }0 A/ / / /...w----...,-*B+$+$+*<*P()}7766666655555544444o4 5 5 5 3 4 431 [2%2 &2 '2 1 @1 N1 Q1 "0 z0 z0 }0 A/ / / /...w----...,-*B+$+$+*<*P():::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':'8'8'8'.........................///////////////////////////////////////.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8_.8F.8D.8C.8B.8A.8?.8>.8=.8<.8:.89/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'Q.'6.'5.'3.'2.'0.'/.'..',.'+.'*.'(/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'     B!!!! """"B!####"$$$$#%%%$$$$&&%%''&(((')))***+++ *,,,     B!!!! """"B!####"$$$$#%%%$$$$&&%%''&(((')))***+++ *,,,     B!!!! """"B!####"$$$$#%%%$$$$&&%%''&(((')))***+++ *,,,         W .      n <      _ ,     d ,     M  _#\Eh!05&V&&%%>%&$$$##V#$"""!!:!" \ !u   !!r"""T###4$$$%%o&&&0'''((>)))**0++wt)x)(((?'''&&&'$U%&&$!$ #@!" q"w"!!i     s  @ 9!g!:""##$$%%%8&&&'3'!(k)&**+++A,t)x)(((?'''&&&'$U%&&$!$ #@!" q"w"!!i     s  @ 9!g!:""##$$%%%8&&&'3'!(k)&**+++A,t)x)(((?'''&&&'$U%&&$!$ #@!" q"w"!!i     s  @ 9!g!:""##$$%%%8&&&'3'!(k)&**+++A,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':'8'8'8'/////////////////////////////////////////////////////////////////8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/' =<=<;<;;::99 =<=<;<;;::99 =<=<;<;;::99++--,.. -//.00 1 1 1 2 2 1 3 3 2 2 4 t3 3 54667768899:: 99; :<<===++--,.. -//.00 1 1 1 2 2 1 3 3 2 2 4 t3 3 54667768899:: 99; :<<===++--,.. -//.00 1 1 1 2 2 1 3 3 2 2 4 t3 3 54667768899:: 99; :<<=== ?==<..u// / 0 0 1 1: 2 2V 3 3r 445 566777889::;;<;<<g==J,-*+ + /g / - 1 1 2 2 33C 44515,6]6&7859::;;W;V;8<U==U,-*+ + /g / - 1 1 2 2 33C 44515,6]6&7859::;;W;V;8<U==U,-*+ + /g / - 1 1 2 2 33C 44515,6]6&7859::;;W;V;8<U==U =,=<<;<:9T98"87765>544 3 2 >2 1 1 |0::::::::::::::::::::::::::::::::88*7 57451 2 b21800.0{, c- + >, U+ J* N) O(((( &%$P$#":8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:88888*78 5887884F885D881A88 2?88 b2=881:888098808.808{,8 c-8 +8 >,8 U+8 J*8 N)8 O(8(8(8(8 &8%8$8P$8#8"8:':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':':'8'8'*7' 5''7''46''54''11'' 2/'' b2,''1*''80(''0'.'0'{,' c-' +' >,' U+' J*' N)' O('('('(' &'%'$'P$'#'"'8'8'8'///////////////////////////////////////// / / / / / / / / / / / / / / 000000000/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8 /8 /8 /8 /8_ /8F /8D /8C /8B /8A /8? /8> /8= /8< /8: /89 0808080808080808/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/' /' /' /' /'Q /'6 /'5 /'3 /'2 /'0 /'/ /'. /', /'+ /'* /'( 0'0'0'0'0'0'0'0'8877655 5 44 3 2 2 1 1 00//.,%-,A,+**) )('%'& &%$$##"!   $ !!#$%$&%f&')*)*++8877655 5 44 3 2 2 1 1 00//.,%-,A,+**) )('%'& &%$$##"!   $ !!#$%$&%f&')*)*++8877655 5 44 3 2 2 1 1 00//.,%-,A,+**) )('%'& &%$$##"!   $ !!#$%$&%f&')*)*++8y8 77!66C55h5443 3 2 20 1 1A 0 0R / /_ ..h--m,,n++k**d))Z((M'':&&(%%$$#w""R!!.  O!  Y!"!"##H$%     / "/.-D-,+_+**o)((r'&&d%$#J#"!*! \  !y"##&$~%&&'g())*:+,--.4/u 0 1 2 2 3> 4u5677897:_;<!! #m_ ` O!d"q#m$Z%C&#%'9(L )R *G +2 ,!-$ -.(/5041$2012&64748&9789(:;<=>?!8!8 888#8888888m8_8 `8 O8!d8"q8#m8$Z8%C8&8#%8'98(L 8)R 8*G 8+2 8,!8-$ 8-8.(8/580481$82808182&88648874888&8898788888988:8;8<8=8>,?!'!' '''#'''''''m'_' `' O'!d'"q'#m'$Z'%C'&'#%''9'(L ')R '*G '+2 ',!'-$ '-'.('/5'04'1$'2'0'1'2&''64''74''8&''9'7''8''9'':';'<'='> ? ==<;:987 5 4 3 2 1 88=8=8<8;8:8988878 58 48 38 28 18 ''='='<';':'9'8'7' 5' 4' 3' 2' 1'8'8'0000000000000000000000000000000000000000000000000000000000000000080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0' <;::998763483 2 1 0 / .-,+*)(%&%$#"  "a"#$%&( <;::998763483 2 1 0 / .-,+*)(%&%$#"  "a"#$%&( <;::998763483 2 1 0 / .-,+*)(%&%$#"  "a"#$%&(,./0 / 0 1 3 2 #345787 8::;; <  ,./0 / 0 1 3 2 #345787 8::;; <  ,./0 / 0 1 3 2 #345787 8::;; <  <<:;y:::9M87665C4v3 2 1 1! 0C /k .-,+ +*5)P(n'%n&'%'()5)**?+,,A-. . 8/ 0 1 (1 2 3 3\45536788F9:;;J<~    ==9=>B98>8>8B9'>'?'B=< ;;*:>9P8d7u654 3 2 1 0 /.-,+*)(u'd&P%>$*#!  !"_#7$%'()u*>+-./u 04 1 3 45:688h9;<=&0.-,+)('$##" "#$%'()+-.0/ 2 3 689:;=>08.8-8,8+8)8(8'88$88#8#8"8 8888588"8#8$8%8'8(8)8+8-8.808/8 82 83 8 8688898:8;8=8>0'.'-','+')'(''''$''#'#'"' ''''%''"'#'$'%'''(')'+'-'.'0'/' '2 '3 ' '6'8'9':';'='>=<y;9 [<<:8 5[4 4 00.,*(% #"!!$%'),/1 2 5  8!8<8<8:888 858!848 48 180808.8,8*8(818%8 8#8"8!88!88$8%188',88)588,8/81 82 8 85 8 ''<'<':'8' '5''4' 4' #'0'0'.','*'('#'%' '#'"'!''!''$'%#''' '')%'','/'1 '2 ' '5 '8'0000000000000000000000000000000000000000000000000000000000000000080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0' ;w39l8_5V3O1ʙ< /x& ,F +d ;w39l8_5V3O1ʙ< /x& ,F +d ;w39l8_5V3O1ʙ< /x& ,F +d?<:998Q643 / 0 /o -$+)(x&%N$k" Km y"%#$%6&d)ߊ+ގ , 9. 40 &1#306E8Q:H}?<:998Q643 / 0 /o -$+)(x&%N$k" Km y"%#$%6&d)ߊ+ގ , 9. 40 &1#306E8Q:H}?<:998Q643 / 0 /o -$+)(x&%N$k" Km y"%#$%6&d)ߊ+ގ , 9. 40 &1#306E8Q:H}) *+-. / c0 1 24 578h9 :< ) *+-. / c0 1 24 578h9 :< ) *+-. / c0 1 24 578h9 :<  <;k:C9!8 76v5C32 1 0M . -,}*:)('J%$#F! &%$#" !!! ,8CMW _!e"j#m$n%n&m'j(e)_*W+M,C-8. ,/ !0 1 23567n8P95:; <>    ;88:9 8:;;<=<8;88A88:988:89J888=88:8;8;K88<B88=:+';':0'':('':'9:''8-'':';';;''<2''=*8\754 *2 1 J/.d-+r*(o'%_#"D " |!#>% (>*)'#(U - / 01,4J5g7=79= ;;<78988=8 8;8;8<87'9''=' ';';'<' @<:864 2 /r-V+:)'%u">  w"0" >"$0/o 1 447T:r<==:7 ([2 /.+'&"t!'*.2 5 9ɥ< ?88=8=8:878 !828 8/8.8+88'8&8"88&88!88'8*88.82 85 89188188< ?''='=':'7' '2' '/'.'+''''&'"''''!''''*''.'2 '5 '9#''#''< ?0000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . * & !    # +   08080808080808 08 08 08 08_ 08F 08D 08C 08B 08A 08? 08> 08= 08< 08: 089 8.8 *8 &8 !8  88 8 # 8+   0'0'0'0'0'0'0' 0' 0' 0' 0'Q 0'6 0'5 0'3 0'2 0'0 0'/ 0'. 0', 0'+ 0'* 0'( '.' *' &' !'  '' ' # '+   ׭iP<,ղt[C/ ; ׭iP<,ղt[C/ ; ׭iP<,ղt[C/ ; 94l1:.|F*pU; &T0!"s5GːJ ȸm9&˭d<(꿛~gXR>' -0) 4 94l1:.|F*pU; &T0!"s5GːJ ȸm9&˭d<(꿛~gXR>' -0) 4 94l1:.|F*pU; &T0!"s5GːJ ȸm9&˭d<(꿛~gXR>' -0) 4 (> $"f2ъWP&N  j ##%խ8+ 左D.}E/T4 2o3 5V 8 <(> $"f2ъWP&N  j ##%խ8+ 左D.}E/T4 2o3 5V 8 <(> $"f2ъWP&N  j ##%խ8+ 左D.}E/T4 2o3 5V 8 < 9@7502u / -4*T't$:)9z864J3 1 / -&+N)t(&$" "$&(k*D, . 03D57:23` !#($&8'(E*+D- . =0 2%356`89%;     @@:<9 / /==? ,8;=@@8@8@8:8<=88898;<88;8=8=C88?H888<888;88;988=D88@/'@'@':'<-'''9';+'';'='=3''?8'''<''8*'';(''=5''@;8u5 \2 :.+ V'$> V_%W*?! w ! 7#A( 1,8;<?C 8;($&.8C8888988;=88888888888888 A8$8J88&;88.A888A88C'''8('';,'''''''''''''' 1'$':''&*''.1''81''<P6P0,i)T!>r;_ &>Vr  M~0έ_:ǶrV>&9V5>1w,7 'A"у0PךP"i,(őT/͢r>9!u\#:&) V- 0>4V7_ttttts:9mu-editor-1.0.2+dfsg/docs/logo_design/mu-logo-nocap.svg000066400000000000000000000053351341747546300230010ustar00rootroot00000000000000 image/svg+xmlmu-editor-1.0.2+dfsg/docs/logo_design/mu-logo.png000066400000000000000000000157321341747546300216720ustar00rootroot00000000000000PNG  IHDR\rfsBIT|dIDATxyxe̜s/mҽ,URP,mJY+*)zAj^P "OהdO"+` j퉸 﫤<"xN@uǠ˖7DPzO`6 %;';~ 3Q "CB0 0 n_p8kctD]^~,GM=DwApY7%5a#7(jtk?ɺ !Qi.\!t5?@<3L)!\ji1mÃhkC82c =RùN0uObW7^=u h4_ݝB"+ĞCV"+:5O jE<֋yU?F p?ν8^BdkwRb/}"O8jUn&9/D>Jqu 0xYK|lDm 7 xLS"w#s' 7Nns+s7j1DOau,ә*ﺑFM JӠ0)LàPq lrDM(*{bmbAgzÆjm̡+)CZ{c 6;6R)ڱiKhm;hw:[:] ;5ՖEa20Ĥ4(àP7gEʠ0( AaP.W)MM#)6)M4|Hɶ.BNft 5/ʁj͊00kLb\`lʤ&K#Z#ZK&W=lFծ[ɫq}f?-5U03eaj¢7 -C2XCo I$x΢- \TfN^Q"R(XI~hWfyU;* QۏDfN]9QV)sRQݴd;;h ~ ȩ+y jʑ|(cZ24-H7Nu-fŠfD8 X@>rȑ\f3%Q|=BH(gQv6n]\f8@>0L'~Xl~y IՅdRU~p]yBM,#Ѯd<$(s2*cNtH.UF&EŅdRh !njnTii `e$ɵmMwQ2|3(䊟AW=n$1/O}ctd-Vء8Éx6 *.͹RE>6?F?lF3؞Fubc9;Q(HE[ZƋ;]PMW98zw<ժ*qM2v NMƸjs y d6,s(N_hjbsE;|9L8\'jqv?ir\(jJ^o ȵάd [-b(#b!DvF-CIn@|;/}Mm+Zz@0kG-N޳57j(uD8ཨ7)=hW^u}[Pc; \5)cQQ)|/:e }ʹgA$'^+)߾ޏC}uw F3'] Qc3a|Jf ìM8kxN;X}/U*ǀ 79A`L[2x#;5 o?܆YWw6_1}{]ˇs 2|J"E 7BћOdonH~Y(c+ .KM\w`oLQe)_DJgQtOatxr.Mr 1B3#'_hs!pUt½$4^=ots 0j I4;mr5/^|3!fPBHsvw||T lp,m2 90o^v # b~_9_[vy2S `VB""ϫP}#%Ky  sz$)K"PagdJɔ' >)4˝)L>M=qCo=*Ӈ Cl>eTxDU"/8l61(dsP{5 l/%@k) jfl88xJw/ 5X{Yer"#? ~bso'&B+?r+"r$= x4rN2mIa4r oxg GPOMy #My<^:8Y!Nð3 tfGnPفj,ߚy*K;W*[90<5 Gа)\ȃ % 4AB_ 9L[.^2"= 6BN4! +h(0XɔP N):pS/v+ ĉѢ;ȧ`ݕ|EG D?u Yr$rr|o(N]'>t(<>R*jW3cNn:ʛ.Wvx/Q>Rl '3t2KqjGnt/:W yfLeKӎwŗi4|wQsәq|)2 ǐnu#c?>p)!>rKQnVA#h wr32Ԇf27Ov_@)"ߝ(~6/0؝dPyRb聞:+!W}/ }h^ _|I"n @$:/NU t$)}/$A{ c/7y+!^rb/OkP{ Bfo"p׀6/OuN\vc AC%OY Gʃ4?]̧k̰0%];N|=SEb1* R mݿ+v"Rqm (b+p-lY@ `?~Ê!݉OuӉa [.D/?5+=X/SshJ@?m +?^'W >p4QwAcQmrӟ!ޛ+^'6pjdVd? 6_3l>4ktd8~<H°Пh"d&p>$;'߆6+u$A.nfX  Jѯ%j)H-.H.z$П!+yi _Km^ b)x]6 Yݔf.| }c-emUq]&'-7*-ω7޺i}XͶD~cڡfFUEZ}>$x޼Ĕݯh!/ UCÚ H!D r N^NB4~ W5w +QO_4ŷ$ ƍ/q~4}~/H5 p0 _{4> }&%b94e^c{]"{ x xZsYE@~ؼ 8rƍSt;zĤÐ4vOsY)KnsKݘ'E۷G{qoj] Bw-h #QzgN+e.N&mCy/Rw\=z9E`42r^4εtv+ S&eW֎=ybĸ)kz},̏I0@JB vcLΛhZ3OZ##.<`Ź%0x5^EHQc'x/M#{K<?6:/n%z^|cXus&fu,~ "]7j>2dЯ|rƍ.O# {t5UYG-n]`VOZAv  sE]r#2VL̉ ޢ>nZf?Gʝ&V~i.i5d EQc'$kd傖.'EQ3?z>Zz{+j|}Cm@jMs0`[v!B!B(5IENDB`mu-editor-1.0.2+dfsg/docs/logo_design/mu-logo.svg000066400000000000000000000035401341747546300216770ustar00rootroot00000000000000 mu-editor-1.0.2+dfsg/docs/logo_design/pythonic_world.jpg000066400000000000000000003412741341747546300233560ustar00rootroot00000000000000JFIFC      C  @ 'hiY>v(:nDP$DP$DP$DP$DP$DP$DP$3;@V$t Um*BIۃ3$ 'ns$AU$AU$AU$AU$AU$AU$AU$Ls%a$ 'mW$ 'm^$O=^;@9ãvܴ٬6tR<;ý<鞅?q3&0Zlߡ6:gqs!%Wz9ɯ^h4ܴp1Ɇ &כ:!,wyr͛:M͹3[n5-7{@9]۝Qi.)7^_Nw^X\w=6Y\{{7yO9u$þOn2|'C52huǢ~Fޮ^j5RkeS[~³2ZZb~qu~wN]yw7EPY-fG]Ǚƿ;Ǣw+*iQ9 j7U\{ F %MTN@ƹ.}oAzYYZQn WΘ'"Xٗ/Wf咀/z{:ķgeZs9ޟM/տ3`rtnY4h97wesSt9ywC&~o>c`hsאy}v*zϣ˲Y/*2B45 ;0YlnugPuV]]Nnu o}=ç -3i|//QZ80lZOY٠4y|}.\l+@seѢ0Ԝ_-Gbs8y@$ǚ7eGz-Ž #.GIO^Ose:z>`4緡ǼglKd][+v ѓ(d94uGl!3+4Z9ߴy½z=a/=iwbM_j}[䝺#QYo;w`r>kK>חyט`k>WyՋ.z=G_@˓[& sje$!3;^QywZyu:ǓC+!&ߔpuv>$2ˈcԽC=z<-SK>ƹӈtKR.FHBfw@F%C)89;ɹgP3Wn&]k/yt>˗=lRY6:4lcXXcYǯ ö7Uhp:sɗz^.=-xBd5?7@-ubcg=>wYqgmnM6B,J ƳwM&NWKb̃˹ H滨32RYƻ\0]fԹ4Cm7yr)` U % K8+[u͗dfBq qrw;:AUi筗k3@[.1PPBPBBoɵLkV~ym3Prގ[]sDPkc;{WNiM-,J%JJ(Q)T(RPhdvvǣo{MζZAP ) 0.x+)κXΛͫ(P@%0qLWT(-" .^I3b}rQTnùE2,B(j9yMf e*m.v'yKn)nogus'-nq'ӎ|PURs|B3NJ']e5Bje~h5;n!3;U@Ϲ徛`DP'N]9P Pq1MzgY<ˊ*Pm $Rl#Q>Muv (R%h Dʙ[9~}7xL P8_>9^rzw+A<6m$2ՠU"]mʪTR5DBFۛAUQ)QT9/7{swݸk&ˋQzu1n`)Dy1tfQ-F%_GDBn]l;ipVI(wg{@AUQ)QTDrӔyj\sxo \,ouA^kW4)Dp|s#UvHE,+7Sڑ FHTR6F=: &}X(R%h Gmx\Ǹ_{^}t}ө}|"AJ@ N+ύKŒZ\.z{>gt UEK1Z%eJylĉ d_Ӿ݅T*5i>nޭ2z7ڛ5vϋ728#<JDAUq^oW}'s~/_ u?U6:OVPU 1-bȤ[."RI[R)!XR%&F7Z3 pβ{EBȑi|S7, v^)Ƌ6β+:Zsze:H* .w|tqSqfݞ貢*rE*Tr!@\%J$F`"\Ǚj%D]ӥF5x;k׮FTJI;@j<=ʹ_ny>%ع{ =gc! 6p<ߗۤx|>o>}+Ӡ)Q9.xTT-" DnvzOE<I[&mk3F67OTCWSRN_1_Rj]ھNs٭tcL_+W9~⠑TPD jb= }cζ_̱nDͫnIN+d*5f8_Ӣ y{=M4_7>\γ/Ytk9{b :O@Y(ɇJey*PTEP8Qg%g$-\kzԡ9M\ߛ$ >_]}W]u0v1rn|ss7337J.M vƨyK$([" +TEݙUR}奻er;,οc;@su{o>PI;hisϕ>j~Cs5mއɟO[@ w4Ǘ B!a灔JAAl@Jjܒՠl;^y-bF]+ZGI F]m_.9@w<\bFCo 6 _6yo36]Ω.kO.=Yw@R-'xb*BuR踬&DH--ĝb54u{9UIKRV˛=/9=H ϓ<ݴYIu-w팛,fŴğrpw1ӭ>nkeR@cVy[ZԡQS̮lrʍZӝ߷4AnEo::+/jͻe"`KMoM%^YEy/HsyJD(Hc\Ae$UbFKr.zo5/2_$V1dˠ1vu.elwHq%֋!hȲI-3܋*Q!m[1э=2M5#T"PfmuγȩP4>~.6~=Gn`d"`R$ ^vrSV]̩ [aꖵo9e6krK*SHj5B$Hn7luٌ<{?S1|?Eɾ;+cן<0Hf2 o:@U%Tcy FEZ/g3-,m([vEjNLΓFTR5B;Q-u#dS gZLk8Tc[Ә8>2w|ϧOnrg[zXMvۤq l6m B2jc, @S%HTRB% kz-:ʭo=dY^kcQ_O;G,y/F;}_'n\BέϛoE[[u|J*NJg;lF(={5笨Yó]n_ǎ_Muӻp'Xr쬑ԳhhPYBi727V9\ޫR@1!.&B:μs;% Q" U k~9yU=sWYܹ%rnzˇ^;~ ݞ >ur:!  !ð ZVDeeo;*BȠ9j,ןZz=䝠cvqzc{X'}<ߦ8g]n1^Q㸺l\nRj 01nun( B ( O}di|ހUR Q@%vlr_30M!$r71tsnsKygw]-VQ;q quƠlP-E鍶 @Vel#mϣ~xJPėƧO]ڠǏeY-^{Ycmni=A 'h/c=5ǮRѬ΀s5-PP6W=?Lm_7-*VI'U@V[~z %ˠpSU;ː!$h=tNC=fR;ϟtͷ5ιnD$[8HKY:9{gbFYk6€*m֬dJ Y;@i|ހ-.UP1q۝>ZX?@ $BIZ7@b¨^{65Qpw{vxր(bL$dBI$5eI;@|Nۮ}'UG;Q~}AzI;@ BH.% 7Lqvu;瀼uTYf:D +"wnYYpytE[1E|g}ϣˉЕm{𝂑VS'x10`2Ls>>-mt  'hvy ײ\BIyWw[FUG?Q緗u]O=oq 'h)>D0|~o2vG˄["\-̓,.cY/1Ϥc{;O+%5Y˰bKư&E('@p5 @ k63.\6=ylrn1&kYb$TD$ {^=6\ Dt$)$UE8ٴ랪NzޏX>n_3Y~.$H3 ri^Y@zHXBH0K.~Y.($H P ]WD?^!$I;@(y:ke$ 'h&{kf_O/n~є$H"@K\6%FIx)c䊀D$ Rx^/]y>_O {PBIvQT i7!$|^A][6cdZ-HRD$"L2 1 @H"@.Kx^.dMGn{=x/oY?V!$ S'6v$c,yʵ`@Z-KElRD$m Dt].a;γIBIU@!$I;@Ev3BhZ-KD"dfP֘2exd2 H~N?A $ 'hX-|@Y- @|ٗ,( 'hBI( 'hBI((,r\_>_[((((((((((((((((2!1 0@"2BP#A`p3$4%Cc#cQXC]=o\a]=o{ߌ?W4~ i;~0_va7XoOaBY !d,BY !d,BY !d,BY !d,BY !d,BYad,BY !d,BY !d,BY !d,BY !d,BY !d,XX `,X `,X `,X `,X `,X }߀X `,X `,X `,X `,X `,!Z3\~f1Vòˏԏa}G#v_q;/H\~{.?R=pl .?R=j#RYҥ2SŮuN<'= j,~rAe2V?L&y1OHJVx"Х>_ʕXXhPȁ/mtRف:7Vu-vF*VuMz!_Z\`fb!:)S$kӲ&Bx8fv_kWPW֭߫^e+k_;$trzݟM DME2N/m)t<]):_^<8J+@|g,~yW`Qj4ۯt:|ߩڅ[*,.mYvz'q nI6iB9O^gIt)IJ[\ؤaڎm_焑G+_Jtͅ{XGZ4צe=d8LUjvnM>ȞFdaR"/+t&G ^[#^2[TG)RumC[*O4){4Xg$l@c͎E2ib8'na?-r9mZutΟ"፼4#; U)6Z:Eܽ-NE)6)ְ&Zi7 9I5v Sre"NlMviBY,yr8ۯڊ]1dWA0WM_ZZ؎剹O;!l7xG$1( rHg\sMk>P՞xI="H(ջ$%g5e4;PVFʡB$ VH[4'ܹ-]:͕FCKL,19M8b2i7$M߁\|GagdМPujVZ,I@ƋL$U7fzΥr3-6iQA`ieo:nLCV!ls%g*OlہnVmi_3edkZ;m_@TO_TSu8k@ۼ6'idTv|H7H74LgWP0iI?1dI;p|a#jx3tM#nXa"g1iNgΙiTB]qثj(k@,8԰+e>(S= ԧ,*l1IOyZŸbشhqU1ɘԮV0Z,KqFN]?@ȓn 4lk8fM!EqGwEiN5tU}Tc湼+A̖L[ZT}Mhk9w12YI|L{q9m{ ݔg1RpmHFzleJ҄d72Ka!ªUvx<i9ש4&׫n.sX:LZ&R>6ֵƋBYֵDyVV@gkUu.K8mm=;$퐜otwqspO biq'Q4'sϰӇdlq'ao@ }:ˆ0cSTv%fO [/Y6ԩkZ=˿PC[̼~~xS_R*}y`|ƌlhC4O"m bC!S3?Ne ùV3(cRVaFbZG0ȋDÛ-X+jC#o;Gavc15OC+"`p+qF6K3L:񪷙8I$a-˾W@* =k+VՃbE@'D?7;[rϊ6MaѴxEq.=\CVW$hːr<إ}>hT=QuocTsVFkl0a=(VzN޼#Vuʱ`CRvY|?NE4t^@.Z>)Z>1Ӽ:ekpO!jڶjڶjڶYQkBVC;{zݷT7#+ZxQ`}ŨÄ́߀LPNܖ>s+1 nTF-U]e-=CٿO$5؊RX9} ZXtc#g#ũ[᜝ɫwL,uJE<>fz/Bݩg<5hCvf>7,`4^{^ZzյYbnLqJXr}-wꍼ)B@rod0BB|l!CT_aѰF̹>\,e.Yr˖\,e.Yr˖\,e\,e.O1t//}'vonrRtXds,q:͸cfk՛&{b`mVӬ@>J;\9ZۜVr3}Ea7j8@pDnUY0J <5Mum>)oV# ÷{7ٽdĚ:WdѸKBVi5yGj[NrN3xjўF ֞?Oo{ˁx `7WEZrHjshK(D}.EJDV=oPo;{y/xD]_;aa*@EVVi/\ 𐲭hpRjiFF2S,(,X:ج Il@$u#kGPgCPJ\QH}~,v5-eLLQXL5CQaQ{7ٽt.z듃^&YUkt:}@fp[i.5ީLv S|nd.|x>>"Ãl j}%;U.vn֩Y%9Aԙ".ofo9-|X?:Ig85OJ/cTx#PiU~Χz)ߧwf^ʚ?k4c^Ż+^,]Ы׬soi*jl$ѵIdǨj<מCT:, 8S@Y#.HgiE-iMyddހ2Ϡi&GV>!KBܟڕ%3bcCValN~n4sڶjڶjڶjڶjڶrCZ(a]"l]1s,V4XZC˫jâ=JhG DG,ի+8J-_kWEԒyF6|2 'cvy5ft<٣V:BZӊ}EhR(o/~6fC4oTgsBQ@ \Az1Oݶ[gP!8zЙaE+IVxuX@Bsءc`sSND;.vWL_pFBۅ)$7ٺxjѥlDZU-^{~Vԛ!,Ӏ6U-xlF^ջeOC YwٻRJshMfmt]WEu] .++vD'wiCVҿЃvakfmb ؿ`sQs扒ncv>IMk[Ԋ[4?WuVc\&_ džݮS%c貛ϦW P=x'ccdmkn%8pU3f쿓5k:#p6B<$iAYcTJZy$_sZiB+JRS*zMFiLe eVimJMV::QitY_5 wXNEwXt 59ݻ %g8$;uJ{"@W5zu[d7mZ j?(bRj)7Rh:}:f'wk&8dpWsc$"Ks5+ /앐P$!5s+!Lhrk֕`A]7t Ʋ?%I3Qef{$cvkRN@dI8xYoEM,,fSFcD>Gg^Iș\ABVtꁾ Ud'N^Tdu8k.!/cp\̇GZH=SpG䷏ԎU]֜q-'ٜY'8-Me-YB24_OިnSR&y3rQ(4t[?ws_VuC2fe&&s.5¿W}7Ůkmg89Y[?b<+ YlJ!9-{c{ g%cpDM+Ω˛~+.dt.H%(Qa/:p)>6ǩ\Vy͡;q0 x`_7+h94Sރo$91y a*u9ߙ*% f3DfuM}9X*Waw^V`34<ݬjX]V!dub 55-&r,M.ޘ]n-s!e'qjۂ>1ɦQ7[4/-|K@׷.ȷglyc:ejT"htūWmvq1 )ϓZ'v=xh{KÁkݞ0 ߽>Mls8wM;9 v:23*CI-qwjGj$[4K!V6qI1;Ӣq3LAgL9O)/U\5($꺢N?6׭B̏LshOݸ}M +c#Kgơ7pjvI]VaBַּ#EJPiY3|OD.\ΚOW"-?9HbV*bд+ uGgwZ@OەwNaMɭ<7Mcz(G -(@댕qt=<2R"UZJ~+o,L:MO/G]hb@)܈%-Gx{j̯,L ǯ\mMwBB`$Q*yca dM# Oܼ'AE+%g28caڬkf"ӚdҝM2KMyADIw3.n pDhAۗ/ضќhZ=#yiyk.{9xGF_VCH_)BS&\6Ԛ=4}MҐbNl|ARo "Ư#{ cS7]vy-F$mo_1ں}!4NըٷV A+m5g:JڌrV)ioLnBhsI!(B m nFs<=Ѭ$tme{%ߨ\c_~Nk,j99qmM^(gqmGi5ֵj/k*E<퐵j2vy)|zmQGf>RY7V=!b#dnkiVC>+ΧZ`"{O& "Ư#:\N 8W`Cϱe0 #s9ATl\p/ɾfkI;͜mApk N:p=S|?-5a5i.?Q!tQfٰ)N'4FRrFWN6Bw,n˨Vds!B c=WqZtsA5Ĭ٦0G 4aa' "ƭ+$ɽ ڛN3h:\掕JBYb:9 d-pJ+mW@0`pX_#AB=FrcadդpszWq7bW(0%=!5i^$Z*H|"P.QݪbĶ=*AX;kJD90,#A' 0"=*dh%FE'\0ͮ&0Mn<&f8l49cBu[HT$]AZ6>WEUjnƎ9e4jϩ^) |g_{+h6`+ \!&)߈<jR*צT ]jj4Yfc],,|xn J )GzwHd+PmLpHU Jۖ Z$FyJa[G-Wbu_LW =y3Hw+MqC,x;K-4lLu!cV`>"ck *P1M4We|.q+qcFV= )-4 5/D|-n+q[Y+%d+ѱ:Weeeeeeggx^:[R窕 /^M6GxvE7j%TndYnҿooLJBA#ߺ96J.5XWkreg¹RI3·;k`|iԛVɫ}Qsdڋ.=Wp݌s>c@Wl9/=Fٌ'#Bսz&U{'rn}9waXr|Moy-ZD4ڡ260+2hse52+OF=.2_I8"-`[":,Jn:jJYjNsZ ~ l"xBl~'Kc~*Z.mfDcQhɱKӞ/'q sc^>$.).̤Y5!]*[&)en0X[ԩ%#g@(ؤ[uy8&]5 XSx֗7kx t jFn?QZt9k4'Jz0\.i V2Aʍ>'wՙڎy]nizkj77 V!`֡{4zܚ>#6-^7;MeF +@JLqbsve,b˿[(Aj;٬S/WgfpH)dT*Y=R1i CѕEuX&${js'9x8JBb%}vaT{pbr ^/S7]0S}VU[O[44J^9&Ox$_s0doDqfOƌ~ɏu؎ d+`9W2;r%̢QYP/KL7,Y$(%_fI-ۙ<暴#LXSJc XnٮDh1;ʱul1sϱߊr0G(+UMOrՕ9%[Ed.$0 \wخ\,eϩ[ri~2ScI帳Qf[>>,jʳHh.&U,k~ǣyo0 ^\9!dD^=Ww*Q|[5F6F5YeN]vK-nJ9жԝ /iY:8͡zb*/'5-(NQ}BuX8>EQEQEQEQE#[Qp3rc~Ds1#[ M=7oq,LPVWò,a;VJKbK.JjسK.5d]S|uM!>Ch3Wo4(5[N]/cQEQEQEQKй*?MSݲ>5ei ).LUK&s!IxGЮ #BYQieeY@\[(Լ嗕 VK5DMY..&c o,6/ ]r] umv0#"Y,K/oR-訢βQSH#kf*?<];%D!cɢ1C0}׷Sʺ:/5򭗲HZ=<{J򭇲 7lv^We^(I߷e񬬫;j+feH$9{ng[;7{WV}eY'2gyIt|G(E4]o&X(|WARy^t5]:~Y2w%~Y-] ,vl׼jF"ƒbY\}$#翱=XXvI'^jEoj =/je(QB SOOى'=cGO;?\q?QcQ,[㾊lS=2L }oK0bGxNI.Y9YWHQDcu8|Bحi >YVl>o ;ObGex|+/na~v˥8ؗE2Qk|Hų Go%48 yCX_顃k&RbwQh4 Ah+=&AidWM(qhP4#JMMt)X"T!Ydy85 h[79]Epk#Sxd>c͌q߁jE:ko\2KKgꕾK/Y=ߑO*(G85f)>X~S5N=K-O\1]YrKb1 <9fś;(cBj7Ϩk)7G=\اc{,o9Y$bǕEazw-< OM\Cӑyk5#R/f.:\!RhXK;5>NX'%х.YeYe7ű!G%hPeQEQEQEQEVXzbb(z:w5q٩٭fr0yQ~a _GIo<5±l}$♡~ OKu{'1" .:0T?S0Rz1t ^hnPXATMVueS.RT_!jy<Ӻ OQ&B$ o7ʕ*DtO-)[ RфcÇWRZaLuΠvXz)Qt狱"cG[w왡陜T:!.Iڒ41EFǛ!pI (s=N 3?d 갦囡o4 mUU\!b˜`*6uVH0w=K”;NR% eZN0UO=ѕOo`JÁVe5;(~n~J.Swt}vlǷ]IC۶ڛ?R!*V45D&a ?(ev(א2lS_ =uc\4\rJ^@΄.cf Es*.߲5*Fyxnq*2w`T]TwҠ](rjU(swT:FS\9hXVJ ,(X ,+‹Mد&z)F@(*5AiU:89r9-ӶT(QͅXS߅9Ӑ !JM') Ԧ Bk@ۙ9w5 ]ngeP:< (OllNw)OWkVеXMDzIฌ&3xPrBj8*QreULj+X -+X y,ߚw8%}?-ԏt-pVS-Mz_=ԎGuS1JQ3t ghot.%O-?ԨQnЍu?/ؑq+_wv{VkՕ^ʻq5Y~gDT'vK?biNz/*TR,Eb*JEc*y,?dڤ|PXdBmPs9/j9%X"^{# XVQh[*l s- nYjUgvQ??9OwPM9r.>ӷ?L#w*L&.:* 8] v M)'\l7a3lq@\}OAb(jNxnN5SՄV#XY _j:ewMprt!hZ`aV*XY@,*JL̕eYD{ [݉S<I7T[ TLIU&e(*Nhr"歖=oefR kM߸)ěCX@FZUU?1M3ȹ) g~\T[׏bVRWYqBTNfZleFH@jq=n$È&3GʺN:L/8}*- _߹}+UvVjxvC)J>YQt]M24Q=f/D]*Pv=cҵXPSi.\0a` \0` X Nt'U[pede&e'8ĢQNMp S)•E U\U(Q
Je߅+7q쨺T^D"S~&CPoY*y0Rtʲ_#kša*4#S34B9c ADO&sEFӋC3jnM.26ǁpɅaD|*: :QBerN[EHu rg~S e ܒSUpsSдr9꡻g==,7\?IAP5j(=oG$,<9t8â,0P2rZmOHNlTiFRrr,!T:M":kE3AN=еT t9,+ ͅE, XJz2%(<;XGHZuM SSaA-T]P(O}&tD,/sAU{9~.VbaQ@5| :g[gGX UKjmgm^vV;;?G !1A"2Qa 0Bq#3@PR`bprCS$c4sd?a!}iCխYN݃҇Gݓ҇Gݓ҇Gݓ҇Gݓ҇Gݓ҇Gݓ҇Gݓޮ}ڲ <!F Lh X:r9)v=޽`'ҘQ߄0?܊"; xʈct7JrΤ]Dd\@ݝyDj=#sOAPO*4M'7X;˵P >މ%:n_eM[}Ǣ=7iE ?"XȂ}g6[%):6͟][' nG'^[|/$^hWz.4.sC؄ݧ{%3Zl'a~^O48z3^ 2Ry&MO8C7ܘ/{Prfrء}Oz<3=̛N)$!8ySD󒝞6ٸk&lbW* e'ɴ?zdzR?'=.<Nۂ{Ĉ \b>OA>[GB8yn?Ly,; mx&r~z8.qL{c!TȢl|[4ZX\ifas4H ,p8[` {/x]WXn3я]9J'r?ld1boQ#rPx6abx)JYH30>-\'+\ƁP)d\.K}!5 qpknU#sԕ6u(81E I^be"jvOjJHuLkm2.5$~Wޡ ӱk3 tL 4SyC6cN '<\+LV87(Љ6&QAgdJ2'AcZX-i-iJr'΋~Hӭ,o-! Gc#p*Lvu\횔7jmjw'hDN"LE8Ia(n|,S ólϔFG #^]hD אi%!G9%jZnv_9\`grnL6}˓gZuˠԻ y@r 1=56ҟF!:6@G 孪rM- SYr5%sy<*@ϏVݪAJ& taĮ0 q|WbO8.ϢqR\=|B [<;}x^.T?Ofk~s+LnOns?u{x8ETu\>%,8~@rpNÎmD7?c:ܤ-͉56rJ,7NdSB,xifp~ʧX9A e 牘GzLcIDw[&?/!4Ӥ{ABٮҔ(k8c;( a^\!MJSRQ {T7f&ØSh axG2dpەd䠶 Mm]rNGzrK On4)%r9ELQalC]KcrBu;w#q X)m[C sLS R;ԅy+VP18Is?6P@A#HN:\3"K"rsp5W7` bZ:#)Jra& ql_9c6Zm:gگ^๷?dsL̮2M0u9(Q7ݟiVjGɮ񦐣NJ2Ci2>L( / {JgC-2pF4UD#m̧aDOu-4"?i-(q[ƝӋ\b8Ҡz!b>(Zaqc7qq1rM 62jC*&{:0Di^e5-3R{xpUYn Cqj6jwS77GwNdkHsvihM[}4rxd]?qܙ[vtMnܜLku<ºRRx8w4 äv鋾Dk>Zw|uD{(qDIhR|ɄHH#+|Ԅ=gVCz8dErVE~?=槮8LXuˉ>*n7ò>sv*9qRZ*S9T]\3z:r(( 7F-PK)8n蟇oY 1Chn@=7m>+slᑘ(Ds sk ,P7|h:'xzYbsC&Mދ'Cݓ]*[]\QL3`q&&ԝDY8qPLxz᜖6[,lLP@oz/,t1ǥb2FrwaabHkTJiŀ˖9g$4C*ey Mh'DHctME%lɮ~| t;6RzU|:_].17H4ܦZ8( +RT+'T% [I};y_*\rUʹW*\rC3 a?D>yG׫(zõq\ݣ&oA XPL$LT4j)];@hBwq7ݯc4bޢCh31*0rx}(uë(td@1*e"nXfm)d_n@yq0M:Mf'Peo%A 8?˩:$W _UAa;$Aת Mgwr9pR^w#se<&w'ַ-> 0\7_hkZy0 ;8ȓJ)qQ1Lpʊh>4磜\䱰uZ[Fk4Yl5Y*ѿBZRq'I Q$[BE nnAd, 5C{ʲKkϯJpDV\̜79X041%aX\6 C׸NGWCP8sM.$l .S^[W6s.s#? ֈ11Urzu+{!D: qvJg5GE}:(o~ B5]S P'h rO}ԅzPVP9濶u'◉52|(oubG=R𢵧,i'  EYD  ]K] Τ"aw Vva6,kE.S!]#~{1X(Dn dn`{lPxaKXD:&%#3 z#Dpkx6,N/~Ӈ&hm}ue^%8YX3n3$C' gpQ"io}G0MwXZxw*Y`;vu䯳a=L1{RF1i1;ίQUBn)Ⓠs3$%n^3ɰM *aMƙu8,mlNky4>p7$6M켆=,Ioz#KqmG9X&{ֆ< ֆf\:H>*}jC(t[d53: F<=,Q<癈qJɡQ^lk6-5u3⧠OETStHhAVAtZw"e&e9!'H~]'HmH?8`9 81?{9觵z.r;=$z=:!yAIrsܿ4v&.& YB"ɂCW*\rUʹW*\rUʹW*b|gl!6:1@.n z2s< EiȍJ9/(ֺ'Hx KY"f _1jdeܥ(r9k*JqSo ;8 l] 'c6+PZ g=915?2#5e 6qJR[Ļ”YA:%(br ѝ.ShQt=a h&fM8 )(%QQZ(I]2ܪvE0u f @<uX{MOAq&TKAWM5OZwMfښl,qSG'KeZ]4YRqS)X':r TmLt1 J2!D*kLIxJEӟ_NR]B -$*[iu,WEPk(C,e'q[A rn\ndV N'O0ɁV#ӆ偂AB/' Yok 67Ij=mާ ҋ0|=Ո,xAo`|\kf&tC|m_MpTTF\tZiЦxM*x.sd׳7 S;R )\/M% KOLjSdW4cE<&(Y7„"H4e#=c' Ik1aowЭH~9MS|r«ASFvqc==u+ѥˠ DKGNUTO$!5WMeRI)cqpR23WYj2U4ܦ#fш UZNOas+8O Bk;8'NU}4)lDZy sNb ${scLk1MpDԌ[/ ljݬAU&kCz' uө2t Mۑ)Cq,ͯ0D-8HDJWXǷsIQ[ u38 ,i㟂$)\,ށPX ߒ\L9QkߚmuRLm [y?c[6Ik g1tSٷzGAň@u^+LhB\DnK)7_sWpRyU:paj7e(n<c0pnjÖV(;T8f˛Ҿ)،aY(~+ፒ8w;"ý(g~Sf-X˥9lkA+5C~n6Tz(=YnE {) Ckz%Ӥ7JS`̫NQ!Fq-jcD~mpϴɬ,M9O>Q62(G†!nFh=j[$4 gɒ1X (a{Ň ?v*! 1f@5'508]G`k\)/+ELKVQ|!Nٰ9SeYOuT^(@3 nU)X^$aD.}OܷLQ}JREaJ t)Ub"DߢqbU|ʼ',J=?P|fhwN|rdHfd_TbC8[9ǘrX" d:a";@tNIZbDk agk1s%] CSg93A]#&xC"'A2FkTӅ -2.jisi/sIs8JSsf?)_ԇr.Yw30vFrD k}Q6޸·*7 b?+Qo=|3G&=锖E|Lt"A ,H&rra f$s<^B+0&p23 !5dMq:Sc5M58<ݢ1uozy܊~rnOi=VbPQ9;O&pk wG fmUW eUitCO8)g}BBjK-+A|i5@N~z|G[nޫ1 uZT:ZXaKF{@[!j#W?CkU'>Å6|hmf}VMm+ay5>u~0 ~Gk1SpGrg3OeDYdG>zxIOd2kTNv_S$Szpٲ̩HLx" x)R2J|hՠ1y*&veZ?9:.sQspS9fD쮰aA lx ܐ; sCǖ0WM7[_hRh;:/8 L %\#ǣmg\q8k~6roJCu7J򕔄fʲ⧻0>7]nޯS5uBj*~9U>fiXꝥZhҎ(3́e'0&°!9 ͣm(؈0}9Xf}-֑^Q=bs31.߹a{d'N4 KXK1RR+R*|do~Е%B4]q_ ;2 .+y*n[.7Cv7x*xa XZkNW7`r@5el4؆'o iڭ-6Ū|c.sґ@'6a֬dpH,]mVc$d5L$ʧ9JNzi !ٜuGmܱ gk8 ^E6~ʄ;xe[r|lsD}{`ʾc%&V[DJ}ߺLd:-Aґr-v7 o Tb@anZ`_N0̟'TdHN~Oz&!8c*g&b԰R.k ' bpG櫝^yS2 R_^RjECu xǴCiG:3Y*pDyLn5GͧGL#F;?#MCo(r ~+b:,! ~h FlIM8ɰN8ktX\dPّGKjPF>xb&c>]RT$pⵁͨxf@[7⠲ huD7A9a4v|+$'k [ޥYzr>lVb!R V vAJZ@՜U 'tfsR[7RUeb0]:\3R0k57Rial~ɼ׊/W7W6=9,.)8y.Of]Ow3~c4$^(f2*gr/_(pJ3օ# u8سPȠX,9St.W1Nuj}xk bÿ)Ģ,"Ǥi>k;Yp*f H 5{ V:SܤNQԄ>+hl(ɳ{l=ӉI8-j7UXrZ'N9-wf QS&gclB͙ 2:-%51:#eu: 2y5Cς f{R[k05>;.kӨz8~"Krqڮ4rUܭal) RHP >KW`uqޥN y,,?Yd QS5;}cF9 X/xޤ]. k1Ή9M&2I<h@L.>vC{f8ȭP/ssnWD3ZCv{”bYR.,;0S+0ޭOYLe]EZp Pa+TW5tHف*fDBcfB{[XjXsReF区NoTh SqTT†" siE2@aI,~@Y m>2d7#ތ@q4ݧ詞Yu{̚.SZ,Ƹ#4$=p)4LNxO܋p:͹y5^g/y?_懽k- ݞ)O*?¬/V;wP әi:ڕJX*TIasyӴ֠aA|I)iu˜#~}'BIvP6wɍ.S~`sv7NiEj2%maRPꎓ<3)opܟţਪ';?K[ګbEYnuV- } J_VqŁ̙ǑR3@,1Ȱ]GX!g56|U˽52&EҲRh4ĉ8pwoZ?52kŜ'шñ5?_phUW<Dc_6LC.72qb(g>G*k?AILImUUi2W/9Np ~d7KUy/z.`Fgܡʡ,=읗nS<sT :}mot&>{\IIѲ{>YP=COhM3p=! F].u&WX0K+ A|C8"p d`ISwvow+ULP;#f`\u6e;,4PnBLbtvQFa6ypTĨeSaHtlr"`{ vl%yQu):5>4>tZeN h(;pXb은n=O13WO{glJ5j (fI-íB]=L桶B̕bD^P]0urS, t ņ4#gy9"rTBX{a14NZ _5Z)Nt$*V(7~#OW~`agTλS5⹷1r}&JWg%iw/+V a|OX񉎡NGC›M=@bidʨ8({Y,QQHcgE2gM_RgzB#jTeg]_C;eefM5L[14yit`/567[5: rq= f#dep\cp7azTV'I ̓mZlVű*P㖻}AON;wtpM@aʙ HX[E+> қT(:rER *o$a}]ܹ g窈[GxSzJyL<0?>7|q&m5Cn}}EEECԼQSYty67dplm#FbL#!S3EW!F QܯS]pC9߽nT-5TU AqE^SgpC,޵N8+h5QFXy@U1e.t7 ޚc :+anF: e?&ʼnÆ(ev)pÌP&? Xa{>x "k82h+)r-'N&:U \CsUh*#au;lA|!,Q#)4H o$v^%(l.*q/y6?~vy'9lO/6~yj0beX$їURE=yQ]WXi|4UJa BRCfW:n]ʱ\ݚue9/iZ =G*SPL6s=ccF(i!Trkv\Ū v'[h@, i8ۙw $&8Sy:]]]]]]]]]]]]]]]]]]]IO3@U\ma7vVX[dH<"{tLm*owBp2T3|!=&[MMAm+8Sr^hx־"qS6Ъ8nsPzV= lVg/nv$$b?8zqLO#EƍWxJUT- 5/W*):ޑVʸ Xn;&i  w^qrfG:'x7q*-vPi=lY-jztϡѤ**fVʣGJjF?dj<>H5n9*#ӭP=>jF~Z3R {Uh+afU+eUd}4U[*URU_I\s\dg=KE5[lGV*TzlԯVVU*ThiZpuESSM}&lQQ"*)uE2C$ܤ.22$C̡fP(~Y?,e2C̡fP(~Y?,e2ݯ,!1AQaq 0@P`p?!3뿍Z//t Vc뿍->vW7~m=S3i7Omow{o~g뿍??]oߩMe;iNvӶm;iNvӶm;iNvӶm;iNvӶm;iNvӶm;iA4OmCmNvӶm;iNvӶm;iNvӶm;iNvӶm;iNvӶm;iNv -gNvӶm;iNvӶm;iNvӶm;iNvӶm;iNvӶm;iNv|rNvӶm;iNvӶm;iNvӶm;iNvӶm;iNvӶm;iNv '*: A~1h>t6A<{i_?m=~=/yS|??~{oOGaj~=<{iAQ8K|IyS#w OggN*~VJ+q(m޿S~ɇ?? lY== \v7x-z.468VOzk\w9 wȕ^ "pʭx`յ:hhOJUBJ"X8ST tAL+d_.ޠ |g2@&DȟalN: }+uxY]s3z<se^R[P͎V*ӳ>2V^\f&r)Fg[^y?]oֿNnicFGqDt3Yϔ?? !:`wgWv/ &M{#Qynr>w=IfԄ1;e~O N?prCRrHp߻ơ2T29W~9Z8YEr`i_4Ь%~Dawk9[z;M2[R5Ǽ{ir_Mn x/Sx<=$*+Uvާd7Sl!s(.QU傑~U0ȂjZM̻VtnUZ]_zy!EQNLAi8EJt/N(,˓-~j<.$8>DE ~' U^p^w<hF^A0l7z7E> _iti$>pV_˩L諮%oަAe]P]m;]Q-ڮbeoF/fK9rp׬c}]ek).9L}j &}buO Fd` 80osd`wJjX/!E2UZ>W@Rӿ~bD qje4.S,SxK1x^SoTθd]v3 ȷbJ!fʷTWV/kcyK ʜc":YP:K~XQ,oO>y@o_RHteLJ^qF٭ᩗq #RxjpI[?|"la #8ai+dt!Bܙ*zϥCf{B|b^XpQ^cl^p tf^>th?p5-~aSْX4G" 1J%P :%2&Yku`' }Lc'V=C_T՛3< :\YF/Q*cW,l! 9on.V@B<2m܋dW˔Y8"'txiAƕj[5bozL.=[A-Ie6wŅp^{GtpZ[Qc\v&X]rU?^ xxuGӏ_O]x }'8`׿8|?Z\߭FBã[JAoNFUGH'gt\KRT|*:wjoV.[}D^B!;w0׆OE%]]Ey]J\S=s_|3Euw%%M Jv*@snfijX^C?E^a^KXG $}mԌU+mO?N`Az]{G6_1(i))]$b0l.جx,((-;5r;Shm @h {/_To 2t;~^$4Piz qgXKA \uVT.ϘHmHS/s&̿3#.`v`: <"ˆ%'YO9kd@)|b K6 7qQ߭Gw?9TqvꕮWU1E,7Nb@l@<Dr$G -&{וh={\} {D:ڀ tCQUփd:_ԑ|N 7u2P(e% 8Ve8^E{9UM5PY%Ug u״a[~$#gًE/bxm1-Ew M /'Z K2xAJJ8Ƣs8,;fc8H[x]JeQR<@ sF.KFmoa.5ؕ+sF`ϩ~if|jFjQCDiW 7ocn;F \IJ^ bս\O(oU.e`\[K]2=HOJ=3dk3 Oh uDA޷%(%=o@LEb2ʰ#vk6Eo+zEja^L^Cbay0 m@뚏70vAPanMxzJ]_ 7arSU~ IgH\Øe 2bBN Ï!Ju DY.WDÆr16YUu"cFDzƖ_[?e;xJ7G98du+|vP'-̵J-UV6~ɞSFjc)+Iı~?~iy=aRvۃ\/B+Un7 ޣbP miDVMѠBrM93NsL>|2Q0D$~ɞeZS] ټԴd4(u4ף Գ\=as8EBtxDIuu|`q!.E]nLz6h3x-i?ky&{#_ ,%ɮr z?7E/j ]> QA'e N0H*fY)6ۏ̸يC ׫fVUrCI%tp0M޾Gp5 p\Yv0sƅZO-k2x\=3=ϞQV:_)_B|Xۍx)Y?=|m4d`MiEBlw +s`zJStwN"e[ vmΠ(iո\4TR%-lfq 0hL8<\QP=~-N5xsUcG qnPsFb% 5S |7L ptfNrf~R`Kb1Y_F! g?UQY#+38>yZY4/#-KZl*?ߋJz;i j QsF6Gu}f0 뵷t/iwGS#$<:%wLE@ xźԢr1[X0M}ds)h`eY=}Ct))tқ|~^x33@YTdБ\eOpc[\a VU>0-f)Z[t EhZxQ\cWGRQLqt/Ⱥ֬D;ۣnꢷԥӂ2hҺ9∔": }@dO^%~f~f~f~f~f~f~f~f~f~f~f~fECvc=!ڹ:@~ 黨9S7|֌zJx(17kı:k^يW|Jm|zGx4gb7%zJ`Ə)pPTN%C~ ccu#3"ӻ2^Egcm vh0[D,;]==;ۤS`q^%5XalT8C,q| `*-]>&oN%Rݲ] _5: 5cEK+z6Rp60J3ЗW/xykW Eu~34ů=*R-#,~s3} \Fe:#95n ~ cj\|O[έ: ?OL8m=I쏐sxL.Y/c4? DŽ%^q+d3a!ȂW_DѬ ^vP&4m~o#IPlxk2rV2+Ϧ%heTiƩ5P+hUK7tZBv GIS4ÊV6q/Y"bW׉1c%e\MgQD}>a?=XE|s M4|{o3-ipA<]-ؗ7s@pfS$kBN#u#k#*/5qpwJ{־KtuX$-^S A< ,h8:}%@6xMv…eB{BeChF 3oGJș4_=GM6i{#8iP meuQ{èq٤\˚Mc9Nv^MVC~g2skʺEx5Q6LP]^)>e0vv̻=>(p/kn&Mnqd m䩊u˼@ɝt.Zv#> y:E6Ի)76zפ:?i=p;#+Q{L Qϧ+^zʚ~T.w*'r0yZy ?Sϵ=\6 9Zj}31.2T}[ bUl~9u9'?'g>^2m¥2ـh]k2}C҉ɰ̭b%Attd*E`c7J40 ^Zs.zD.f2>؁-AZ^ূfoSu1RF/.R,i py<#Na .&ˋlh_T_:to98k:ߝuY%_d4j+)qf]xJ6WA@c pQyӀZ,0I;Gg]P[͌ߎmdq%mAⶔ&V 5A@e*eـC#?3?3?3?3?3?3?3?3?3?3܅qOFGKbK=J#Ր΢Հlzh#f'J4n[.kYA *jGQcE 㸆t{]):I[Zc?)thaqo~\T`q@{%.yܨli8Yf!p0cg̤cc8__HXRFkeJm:ĢtCK6kxDp9iJNb֌-tcY,C?h >Jjw91>9,F1zŮr_W[ps\Nhi(X釤 N,9_`xؖ[0<=P Or̎- . t敼Q0`3)>;83׈yҐK +ļmOkv,Ke[ LrNs@d>|-/0![BoiG+C >lvQF:B^[#s4`޹6xG.P/nMgMND@qt}s,`\x@u:?h#%xK c{w Pۘ^9^᫕IN-ls,Yi7gr%RGlyC{\N]w`e86JC.L_NX} ){ZQS9PP-c^j/ݚ:_H"Y;;=:/^d,o8($&O6ANEq*;q~JGښlAx<#{lƻZ}_oo#ôU(xd{20&N^lRBHU}NSwmF+QK\'S" TYu֒< -iNli6S^ lfaG׬9R+Z®߯0N _~r5KWw"l1tc*?u?-Q n Nr9 5R|wsyM'ԗϋsه{> ޤ xF "b6㙉 mJl -n/}Ff*U/^N 0v(:Xojdl,C95L-i1G,FܼE|`fJjn,wԋm;,ptSJ疗KX8+ k 69.D9gRҟMGBEg{)h/~y[/s, G4gVr¤03C\AK> ]w\fΊnQ3^| ٔ07`E ]UW톘a@*~sHzkF8P~U.57]:BjZUXx5 F7G.۵>Ԫ₊4c+Uknʜdq%q 0W U@TS^][68-N)KפgҹR ;K8@8B߼] 5kB  [7J;Wt:LtSiNiԝBEl:MKRQ5'%WۤwG~NmǼD͂*s/RoPS2{K5-嗋x:yh*q,8L3Zl^,K!Xh&*#DZ17KՈ4Ik -;ˢ|p5F-;zFXuk=j a\`]!8!mE5]OX<Ur\izX4!Nɻ~YZ^ӝ;?( q[n|((yN^rhKec]@*?藴%W8 uj[_bd1F"޷[2qf T:0A.{S)d[]NtGLuA;Ybg)S o\rY8)JcJ6zB]g-rsqo E:YSq8|UZHM"U_GaWPin=كgD&4u)v7Ǥ r]1?2טo (n iv9Eebe+vt[N v꺖),\6ئ cp3+2+vw$Lf(=Ca`ۯH,r2I!wҞR?X|[Y!c ~:yO̧yl\%Qǃ%4ۥ^qԲ\hVPͭq-&Գ :90%(`Ͽ1AFgsxx ?iUׇgZ@omTcXֻAiY=3Ѹ,jX@՗GKWK^pSxuj%<ᏃY_bS8Ga׮(Vۄ3-DI*#Zt SƮ3fm* ձ95}i"HLߐ%͋<&_Ėx.ƃ&ع oѻ"#} /a?L2[驉x..`+'hL&LTfGDp^dLiW1];} ^na65y^;Lb 骼0L=OF#댇D_ӛ-[Egx0xBkhwq!_xNkV3x:4c;s5]b'66Wr[9`8UkRc L:tqQza-E6-^N({_6WiUBjޮ;fUBJrȼ vM\xjB+UZ]R^Wr䷉a! c<}&yH9uBkcM/qa`? 56l*\JӔs4^B=teN<&0w\2EgvR"yCR z0e`EhUFKQ`Qf3).YJӠF U 3Sx]RQ,`&zaDkzhl=%^sK3~;xFDuaSW%o>0mXVd}|%b>_!,^|6XT Գ zrlAAmS(Eyu5STQB$L~ 6\@!|(~eF<#Vt%p_*NUk ",5aӳ~sJ=%d(|eR XqTmC[h^|Y^߼N,u52[ %W-aJQCvuK̊MA b 57U\ZK¼ٱ47p˙mhc@^@C81DŽ^/t;7*7)((yɢ7-ZS^Wݾ wԬUlxc zyzJʇu㎯:ZΈ[O*j=i1NsLVG;#ceh(x@(LO"+d]/%Կ,}e<˨mge'SV ߢE eYk JW&B@ߩR\=}Hh6&aB 9ͣTݬVqFC @iT:x*pp:W Vu Zw rŚxc 77 s7(\L:a-8.jKSғ| fL$k٧M^9v"Ppw.b5B2̖ _hkAirH֌/~F?` d2AcGv s+CʲA Tjr+W㓕VJ UDaȠr|׼y)i*S7n&`Qn=VX1~ _؎ ]f\`θ OT SQh<<ˡ0{bzy< <*OL9$RVa\O NSٚ\CpPbs-b3HP\u/{3( < sm] :|Sad1]zj4> в3Y6/r--9h`U瑼h4L̓dJܫwB3>Cݰ+x.8:jU4,:K拈qjb` bTu՗ð^fӯX/~((;|@7@|(LW+љBG0+}@W}v1~V|ܨ_ ; ŕ"Yo-V ׁ/ϟ\Y_䷝ūû.`4IvC50U6 .Cp(Gen'-rΓ5%]@Kf.6L[q\h淆Z])m z˗.\u MTwxԱ*b6ۧ\2L^X b/Kd1ySiZTޮ+?XWHwAз0m-OA|)9s䊭:Zv;p)|~D|.ٺt@~gQ>y&8HJp|F"H/[QaÃe+hp(Hmpojo5J~˗.eUrY_ꙵm/E"mpЬ:|lɪL2& cY3}%tĹ-.'g|Y\*3$e!lo˗.\гL XVBg+m=l1$|W%0%z9|" pul(ȝo.Xۣ tﬧ CN[1츊/S:ӟ:vhYkPR{4X#5BcX͊9%˗._/H`3XNQu}ԷSp >j[Ii %3[.3 e5 ~xi\'w _]}sT}.C PʱZ>բZʝpFxfYcC!܃A|,ZMV^0z_;"p ƾ0;6-qL]S#Ԩo9xFq%ɓ\r˗.\rl}b|A<PϜFFMK–Si ]fئzzG84U͝&G(OT}`9xX6 ]`vb&W;JxB_z r>P烶{uvt&yh"XSI_=U,?ŝ$5ͳc[6]:Q Q_Y}(˅\ӈI{맡0|.F?@Œ s.Я~f o[&iu xt sb= Kii(ۯ#o7RȈ:4)leF&&%b}{eWLE9J*퍅- F@G?~_.="Af n"ծ6АX]ڣ.c \Yz >|ω0%6ʪrJ5/Rg;חdM|Dje^OߞɈSdG C<9| ~*׿OA0i]^Ԡ͚vZ;)0io]^R poc Vy# [˦^34EguVRA J)@Y GnFdG[L& .zLQ0tv~ ?xYjco~I˗=X^qהΞ_x(`," 9"qs⪃)/heEQ1+fƉB2]<>&vEdz]w܁>u9r~* %vN.sS4ayzd2O/ؔwVEgv[x:\s z=rކsl?͢fs;Ks]!LW˜k6o/6*NsHyOeo- .-nb[Dm,^Fcf5z.! i:Rxmc€<MlSC32ѿgP~r;ErF;oɓAP2%d_μh@#Su"UN8Ps',SjyObv^iI3~@@1!:(=zSgK@G uj!#X-?Pn#lkt;N wѫ{EU(쯁@#PgusOYao-D|C'G.O7MF} {8⚖|Ռwr|YvQ_*zRJ~Š߶=|ms,~==PyKn BWՃ[_?)ZXmڻ쏎4zF*HPTfWJPOBJ>ё>}7n:|vH>Jz>Kk*f6uO@կVFgMt>dݙ[졙5<1^C$9xߣ'~ @mXx$"4.Գ[v3Z1W84NDi:&'UZr7K#\tf濗⏻eq!͙n1 5(Z~I$6yIRK`@ZȒ~/~v 8y7Cnc7Y$UC}v>>ɞ&a6VM04x'2UfB׷2űCH[k"n=珎b'h 9kvT7ڻ u/C7Qb\G9y]T.ݰ)4-Qi$djs<][k;6~$n0bi+|wF?'g>7DU l5705Ax5SΣtl5tKuuuuuuuuuuuuuuuuuuuιklH{c\T>)iMH"@ZϜ92 !lGxQ)ZM oPw=փ=O1_8w9?_«א>Аuu>]~ naNQ:r1VtW|cǤ~|F!| !(`&s[9?OX=%gEׄB[}nji<>m/=Z~5V/Ȏ\Uk_XľE50ل/른*cA/yAXl/U@/3DFF#;~a4_z,ߚ~>4\_π@O*M<~?K3!j|Vda.O/nh*J>H;3.I#<^l kq{~M_l5ScX | wo)=D#@m1S3Mc?korW8D8@"v~Gk%CC<_쏔k_H?#ͻ+g]~[ޅ>_e/hvfgDO +M]q? ? ? ? ? ? ? ? ? ? ? ? ;{&{#<>m/Pw ڻGpλȀ((ǺMV<[ƟGK؇?xג33+z9+=N6#LG:x|ۼ_3cL$$$$$[%^-<6(w&{#3LGg3g??dd~ɞ=&{#3LGg3g??dd~ɞ=5 I$I$I$I$I$M$I$I$I$I$I$I$I$I$I$I$I rI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$HLI$I$I$I$I$q$I$I$I$I$I$I$I$I$I$I$M$I$I$I$I$I$$I$I$I$I$I&I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$HLI$I$I$I$I$i$I$I$I$I$I$I$I$I$I$I$M$I$I$I$I$I$$I$I$I$I$I&I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$HLI$I$I$I$I$i$I$I$I$I$I$I$I$I$I$I$M$I$I$I$I$I$$I$I$I$I$I&I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$HLI$I$I$I$I$i$I$I$I$I$I$I$I$I$I$I$M$I$I$I$I$I$$I$I$I$I$I&I$I$I$I$I$I$I$I$I$I$I$dI$I$I$I$I$LI$I$I$I$I$$I$I$I$I$I$I$I$I$I$I$JI$I$I$I$I$OI$I$I$I$I$MI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$hLI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I&$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$hLI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I&$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$hLI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I&$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$hLI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I&$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$hLI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I& $I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$h\I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I& $I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$hEI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$ $I$I$I$ $I&$I$I$I$I$I$I$I$I I$I$I$I$I$I$I$I+I$I$I$I&I$hRHI$I$I$I$I$I$H$I$I$I$I$I$I$I$q$I$I$3$I&%$Y$I$I$I$I$I$I$ $I$I$I$I$I$I$FǭI$I$I$I$nR@S2I$I$I$I$I$I$$@$I$I$I$I$I$I$HPbI$I$AI$I$AI$I$H$YPI$I$I$I$I$I$I$`+$I$I$IO o#l$I$I#Z$I$I$I$I$I$I$I$I$I$IXܙI$I$IͲU’I?Iq$I$]rI$I$HPI$I$I$I$I$I$I$}$I$I$E!'lul$VI$ISI$I$HI$I$I$I$I$I$I$9I$I$I\4oKJ͹$I$pbI$I$IHI$I$I$I$I$I$I$II$I$I$&>?dI$d' $I$I$$I$I$I$I$I$I$I$I$$I$I$Icړ4I$I‒I$I$I I I$I$I$I$I$I$I$II$HrI$MdK+-!I$ɄI$I$I$9$I$I$I$I$I$I$I$I$#I$朒I&e- I$H I$I$I$I#I$I$I$I$I$I$I$I$I;m$I9<+,~~pNwdI$$I$I$I$9$I$I$I$I$I$I$I$I$I%I$xdrI$I,I$I$I$I&RI$I$I$I$I$I$I$I$I$$I$|eP?%/K$I$I$I$Mmm$I$I$I$I$I$I$I$I$I I$I( 9%({6b,2GLI$I$G$I$I$I$I$I$I$I$I$I$I$I$$I$vzi2ԡ`$79$I$I$rI$I$I$I$I$I$I$I$I$I$I$I I$IRruJVsm:VRH RI$I$G$I$I$I$I$I$I$I$I$I$I$I$$I$2F;*qU~}o$I$I$rI$I$I$I$I$I$I$I$I$I$Y$I I$I$ R9fJtFdF}I$I$G$I$I$I$I$I$I$I$I$mrI$$I$H] CCoxLj/$I$I$rI$I$I$I$I$I$I$I$HLI$U$I I ^I$ԅdAu?jDFPQ:I$I$G$I$I$I$I$I$I$I$I$$I%RI$$pW"S Cb7ԝ3V$I$I$i$I$I$I$I$I$I$t I$[m7;XOjw@͑mߒI'2I$I$I$mI2i$V .|AI$I$I$I#Ԓ$IGI$mmmmΤI$I$II$ &M]~&vM$I$I$I$I$I}:_I$I$Nm~Vٺ*I$A I$IHi$H I$I$I$ $ $Oܜ7$OI$J;m߆77s$`RX$II$I&OcLi Ma%'n/#{pn8Rj{/RgA;$co߱u=0bصhy3C21; ^Қ)_B(x&]Ʊa,#[/OE&܍շ L +Cѧ/V5)%]pIgn<zl YC^-HK "+65訢~~ξE{S~LA@_ce~Ht,HdI2i w丈obDI^Q}٩*!-[f灤l=Q \g$ Aa$ETOM'vcb"A(uF؄, )(4`Ij΃}^ 1zFȜF bg|1`Ij~s:Û6"tu ͜ IfӘ}{16 o(AvFƤ5hn#~k]m5ѵ yRKE?7]=ltf$3x>ʩAn$[B{J&y=yBl!')S"QitHD17sl{NKe}>~8Ry.pR I:BGmu5Q)lxQ5}vegfl(a>e%2M$=֨C$7ӣ'>~NwnIϔ#A-pt"~\FYT{mN'%c0)Yr9HDcqlSJKߩQ9q"~۬%*L&rWa_MA92߅6{"]KAp{dmi.̼'6m$zսc6y͞lg<6y͞lg<6ygf R~F~ u}>K!ixFO5ȱq6/)H#DhIT61GGL;_bԫh1nN2 4{B^5Lx3kD$ite96!BH'Ƥ#%A tZ! CUrf p%rz\ nK>N /+ǑyGyGyCtY0 pxeqQ!iESAKLh4ks^ 9x3Tƅ LcjQ ]2 &?.׃^ qnScDT#w]zUQHoފtYthCҔEe JKv+&+Wد_b}+Wد_b}+Wد_b}R b^5×0\ZhZ+F Cu6[y.IL 3Cs3 z-ީh:Uɒms^ 9x3ƨB2% RZK#.MiKGԢ ͱF4Ę _ eQW k/`\lWB'4bTr[6ۤ/qm6^S/b DGJ&jDL B0$MD2"MoIN/qD%!Ԛl5I,N ퟎ2lC6㔺MBUA$D!![!R߇/˱TDCxnRE BQt(6cz p!1-)It62CH*:'.D: h%`g~NHODM#7k-2W} L-%^mb{hKQn /Q"H͍lU|h#𠖗Xn&7Ff2t$Rd{ntj̚CWl4bCB1j(Q#d7:ZX[`Z6)\| "Ҿ7- e }$!. U!C'Џ11̻TaD>2%մINbhn:EhhkYL u{ 0&UCQ=)i5aMH?S`4M z`lMvlf6;Zb6^iP kxG7zcjcە ߡf< e#W>6&EzMt[5DIy*/dBh -#)`*0nJ[kAZ Տzӫ-N QI5HH`Jm%tMƃ|)z4=iR{5)ݦO#B45غnfFFn=- Zf< MaXJ5-ҔmhhJqKDbC}Ɲ4^K@FOsK!|7YƓK֍NkgBoĜFvF"y h֓Z]/ $ȹJEW!)?P5NQZ<#<0jGE5:57ZRgDdbϹh="IfSa*e]m]n뚷Dha#~ Kb‹Z5_Br1b^$^v&RkǂR4_U]}7OYv5cWLb-DMѹׯ/PXj]= aGG__bǷi8FxCQ+!mn1,0b[-a(}M޽}:(nDQ WbNUDʼ:j[,1xW!GYJ0f ^ BׯoDM<ہ<šMr5HKX>ŵp !D%guMwF|rxW,\K<)ª]5-^.Xkׅ۞xl:e79.ۚĬH썞B'WDvFnzyCbvbj`ϣ!%i$I$'_7ijĞN ա7)ׯ <<#<#<#<#<#H؞DgT^n^eez}g^& }Kl&1y+.b^?_f4OGso+.'~ѐIKq?F?F75syX3ׇYB_GȮ}#%?j+.QNx3`<g0_f ~3/x3`<g0_f ~3/.!1A Q0@aqP`p?a甲X|5Xc|q_, akX}>1A |5b\r˗.\r˗.\r˗.\r˗.\r˗.\Xkr˗.\r˗.\r˗.\r˗.\r˗.\r[RJ*TRJ*TRJ*TRJ*TRJ*TZ֥J*TRJ*TRJ*TRJ*TRJ*TR} S (i2֜1a?LXisņ1a?LXis^~sŞ.sŊ31[N~R;*!|a%VeMT78 oC;q /1B\Ce\nD[7k@/>]K|E+1XSAՁթn[fb)B,"BX7cL,P(ٷrQYQ̴(aϝy`<ؤ倖|hWq8ũft _[w '^`ܦ+MBzT^Rys18'%;JDJa}ѹCtexee@y8* DĮa+$-mԖ̥QҞDohf/xO0R |]G&=T2dP\ReRB TNݼ'lsfe"7S2t4 Z_hCn M&?FyF=@0̿b*3gWCb_c69="7P[RHt\yNKPalكڭJL0! ~aW;mU[a1"0O^ʪ*q.voIѹ wxwZ"&zK ܖ›K4\bu|hQHs=WC1W;7&tC‡1 `6!1Ѻ-L48e\(ro&=BYJA8"+Qc-/`V0jX|]-zA -bT dX`E}q[MÖQove6{F'\'1eqGB$EA7).&S>!`f+#pq˗ߓ-{3?M0(;gim3v0[Sk=v; u A hX)"7ߓ6Yp7 Bэx TNVM_R*ʈ06H@:+CGlwl.- DxzG[<`%;An;)aB*Q(؂E{F*1_TLǫg}:VҚo1*Q*U{F0c2_m rʨW9h"S'ӵ.MEmpw(}mUD;CgT9cʁMGth~ ŋ+Dy. gtʽ<Ћq771;lr@S?%h] WuW1Rܭ+f)s8"E}Z3&Zb97_=k8: I#;K,~mvqM#ӌ`',S~}߀ v-=IY;#Na* h+vق'ig yd @x gZEQw2R{n MQwLj;A=(v%`|F˩%%^b m-PcN|a0 c/7-Z`hgB{E峡'n&*V ,F93'%hpaəj(̒Wx3ĸit,c ɲb^g/z*S6t%mԷ 0r,LCdR"lZ2/30hAu/h=!6qXǶz 1CV=ĩٳu= V%WMo;ڞ,jYaPLΚVKƒ2s"V6A.{G̫$PSeLn U/MsU.k/B yh0"y9d031a6t4͠jhAxV2t. b f\z9 N'Q l_O=fSQ6jXqjgddb"aC?CxXb0)yp*߼gtE$36.X!}E;cy4.nf(K0٦6Iyuch59"żT}h11SX\xQ׎# NAnX;.^w“a zƵ7$e`Q*)TłyN&ngn*_xm[S .= wTeҗz"*SvB6y}Ё_0PUQm%hV}A,`X5e8X˙"b=JXW~&1E.J&.ԗ7 `VE13xq˜#^bwPvPBk;%Dp!c杠EJd)4@39Gh^-Ըq 6{ʬx/0 7\"Yۿ5lwMR#FJ[hY2-KXج4TB_xσqTȧ c¨(h#R كxB~y9{KVuƜF@ i 7d̸8*^`8 PVZ$s$Ծ_1e-K"57Ty+X< 1oœKI@ /WfX01^I%o2{!6u̾3tT+xX6 St@ fCzSE5sEevq z cx5v HQ`NK%` 2='BX ExW=D3+c/'Z֕[x5*c\(m3_@8-"wxx TeˎuP7Ũ%^EʌqiZV J01/:0ha+11DRx\@DZQ[C,.x&.va7AI[u+D;XAiۼP-k/6L" BpAg<`ۨc@o%rAΕh dR*R;mgfLs* 0`!g!UP:?}- %Y|a SK j+ ZR {Pf 0[U+.PrQ}Iq _Z>I v %}cf٥y0(~Yf,H7HII$OdZ:߄x ;@2=kW/,yOܼ[r`WaN3րt"!+D\J=pr 89>L7-޽FAxRC/c2*>ϛ<%;Ef ;՟oڟ|g۟6}I^lhJ}mY=TAߟ9,!1AQaq 0@Pp`?̐"з =ưZٝ`JGs>35Ц9ֱ$9 _9IO _9IO _9IO _9*Z ~p' ~p' ~p' ~p' ~p' ~p' ~p' ~p' ~p' ~p' -B||gZj~p' ~p' ~p' ~p' ~p' ~p' ~p' ~p' ~p' ~p' ~p%_S*oʭh' ~' ~' ~' ~' ~' ~' ~' ~' ~' ~' ]Ί>>c?O?O?O?O?O?O?O?O?O?OOHJ.V1xAPUJT3XJAXgw>>>s>3>>>s>3>>>s>3>8o}oCp6-K5>dnIhc}! o37!1>&ؔUw ʢQմK69IV\j U^?sx}&/`RUygK4lryA}ǂ= +'`+a_%(sdJ&Ǔ.8:ϩ!jPyB }*e.y STuOx#`?Y&{˯OOL@r-Ya*:4 #mV@#V<[(^aFC [M/)"fq9dD>MPAjn GKLi[]^@{J!ʕ=%Gp601];³qJEZ|7<#eoXfiC S!.tVЪzjRëK`Cq۫P T9!gT`mq H OPZE; ͘em`k(H wxgj G&z:/yLsQK5.ԣbl'A(:ᎬV$-PV/.me%"S-/!qцT dP&-RJ;-ޭsGpM-מ `G^h8U;=muŽjKg&N)vviHˠ pn쥮׻eX['Ɨ@ B.ǜ=6=HBp\u./AZ:hZS03˳EC&aZA$ 2S-\[a[DIm xszF"Z ~+Nn .̬NՎЊ< Ej E^^?H7{ o ^E%#@A]BGé[G|-9̡'Ax;+R\;Z#r;-1'0A%|MmvW;xMP9KȘ5][],ؕWi zD*p [/)]7tMȇqTׂj=Clx4jh5X=s*g0DQl.0ըD*5JX.x" Gʪ57S"2%;gvD"٨D%U̶ ĺ|>ڶ3h課G +L'ܯZ5% GZ admQ#[W/PI_z|>a~),}2\+p:5V:T:]ٕݖNyUg0%E+X,(i.yѡ4hVt$OXM)yz$ڭ{c(zإM&E:p7kWFx_usCV/TzFH+tʞ9GJ{ .tЃoMSC0p:CezQU8MxSޫДԀ.N+x۸pոI?\,d(e-A$c\0ψ2}0f v}R(8}#UKF`> E[҉y2yС33+~lTWfXEbfr_9)hs-XZ>J9^"vJvݖ滎U4hV޿@)+SFYqohEs2vvK[̼l2U/Q^^ql;F@n똣\%JD)U*eU )h%F%IݯJ?#bXѯKAt1G }ts 'R2JpUl#đI`% 怱 W ǃYj@@L:ŠU؁XK[roP9hj9- @g)% %0ԖJjw N|%ԨMqy.\/RoxVqcmh:A/)ݣ4I<.Vq^ \1ƹX)12!PȰn 䗼WC_([lcmσoXueV0Ej!nXp<#NHh*Z!;/6ӬQ( +=a "4lffYc0UA +0j, P9g%=9@rҮ{J=@Γ] ŠX,C^ECUOKll4 t*q}.WAl6rs˂ iV0H,i7sӶ]79+U%a/<]FDWPYI暚a~0KxsBT5^&eL(TmoSC5@Ayac*P %cV޽rtEokqf]LN.01R-#me ס6 28 *?QLt+mVgy_4wE2/W܁_uSkب2]-|~[xR0Eo`E @Ў!iӁjFڸ 8Pf mRiTm<;3lKalQ"g-v\OuhreAC)e^y/!=3ceQ0vP .#H嫬dWE`.]#P ΂_1,WV9TXxQjrAK[бi9;ao>|BT[bPR`B-]R`_} Ko~WQ}1LKkFcmTĖ.omgECͻq [ r#VhlGj"1@Hq+NQjX9&i/PƻKGw:1pFh5:0 | N"wE\5s[,x ;G^ˢoDU cΤP@UuCaX*<+r.g>lGWtGY\E%{=HmCR:X$KsoTxLﶀrQuh0cHcXFٺ( ;(#|JGw&6xMn:\B!,n2#LD@WAz(C䆺]7}sK-`,]m>;YդR {mX.5M3Y,TQ/& %" [J zNpyo5d+Nw s28w#i[%k@qtͬhlFy558&zUI *808tPt!J懖vkoMw٢0&BI81$kK)k?a@˖hTFjI"-o(g>hBuٰŜi;Jvp#r|%w8ŢC 'V %^c:gNɌGgtGZJ^WL=f,%vcTFQhRc ~ \9EGhelJ zׇ&Xh ٻs!K_\^:jlcys.lX:8]GNKCnk3u#ZPDѫ;RhSx5+LKK iH%q儍IOC|p&I HJozXjl '-J"iŒōh#1ss͢Lhє*b-ToxU "aHH!IV0j|8s*1ugqlOR\BfpdS7k .sZU?vc'o읿vx2Ym{A8%T[9GmLi}>ڋz pVZبV'o?GLW0uș#}+-=yL@*ٍrzЬ{D*f7qcջ(hbXj*Ōc)e%44ed.v/2н ]_%́Ḱ Qv0V#Aۤ2E/}UYxft̓5f,[q[ZG (8}|u;3ЖYNڙEu0o\bgREҗX@ w%Z~ WH00YN/u2"y A,ˬ  OHi.d _ TlFurSjVxK WX9]Ą *lyFk':~u]#م nc0BT NJ^eaY;T/{c/n\@~NNIZ_"]x4 K Xs\[ Qk0R7UJsR{p_ʒ\=*dX3l:rS};ˆ}KkǬ@wZ F,a0O)pl.ǫYFKvZ]Y e@/R4 ytP5Y7Htdr URMp0q%۹8VXG&`:^I Ͷ:;ۻlyh> tdaR|Txb(|G͇0,bwQx-yӾJh':y ȨU VHk6 H-pJ?Yj-[gAmG\ZT;Ϝ"X#kZ,puXG=>g nǤYZ BV11zZYkUyPDcȆU_[הhtb:FĎ\Pt;w/ؾҋ 03$a> ?tBCÕ;[a}o':~ݗ\a_Tز-e7v _{Jdڏ)Mͣ * pPbiF{ĺ7QLZ&xvj± ߖDtS8 Vgֲ JW)|(dek88jTo6 H vYu+}Fgg 60q]bBK ,Zΰ(@NY,Gr.Ek>>?S`(/ͅJA"[|E~ ? =ls0BcTTSr }.&Ͼg3}>|Ͼg3}>|Ͼg3̿n)3}>B:F=SoZ9߀'thN\]t#A%f}wTq\`!fu]ePo+aujg4 e6:4tZE3jf)K1)AɄ@1/DM eȝb//jR(}V"(-m@b iYd0t[KAղv%9U]((y_) -T@+3 b8""]9NKO2+_^a@ܠ 7ɘRm ':U]K1OX|h<4[) TyH˚[/KqoZ Ah9߀'thiԏZљ{< /i=Pq]Ժ0-{q UN8ڰ%)Jn-\5\)|De%D9|:,%;5@TJNtD KǙ!FQ Bk^@(galsۘ|f٥Hakk$ TM :%m rj-D+$ 6S6i:[{0s1 خO(^N8HJgG,l3E|xEqL̯ %RS ͗p9r̗J{2˫oOW˜Ϥϧ>GOӪjHc :an,djv+uҭ,3sC^:uy) 6Vadd7mnc֮аj:`_z[sD~Qj, .CV:8famuvK}hYpE**&]άW3v}Boj{|ZV06%F̾ʔ Quƴ%9bQra]2 C#+>(oC%<*gX)-=ҾH4dtp摸H,g5'Hkw #w>s UE[aMt \@Lи`sirnF:/:{~(ʰոk=1@ܨJh+BbwR (TFF='thR @WQN!x13`,DaC[e((hTe|Ã3,j;EJgQiΗ2hA@4dyX IɄ2j =RJYT 6Ey"M'iƄBWx3Bor J,}z4q1 DF LDK@%)iT| h@s8_$gL_l4kJHxEU^4PtfSXs~) ~XC1x)ww y%AWzH-/n[\X٭ ֨su7X J]؛CEc /#/&c YFS1s⬊J'Gz/ =W,k'@@\;ld(&%ڹ3LN^X@Lr1QcA ^51Wz.F_!yYY{~~~:Ot;h*nR XQʳ QIztjINKbb۔9// )*sCcb;鈆DCT( m[j#<( aMc<ܵpTċNxi* Q k Mf4Uwcn)oiɊ*?*2~npX r{\L!+R c Zs( 8^~bŭoE(3ךzAL5fb u 1v`bV@-µD$K@4q!@X5oMR c!xޔnV38\ҨtQ S3,M-ZB= v +c['h,pywJ0j6@. vPtEnt3 vPU=+R)4Bptp}1ŭc +IN(~ASDDE`q[[/1PJ(KḰ6 vyáY$WLqÁ{JbU%WX^5Q*ƽzD\&V$^:b iĩE mJՍļ3@D6cPE!TpuBwb+rZ&aXۂr]ndZˉMFȔYRT1 8X!c jȁ E_iZ*Z@G'K8!+u8n<(9Bǚ y[8*[CsŎi؃hCg,ɫUe*| ZxUx1݋vpEJը:qp/.)*!%89T?U3SYrlݍVmVR]l3NZ KoEH-zI c/{e[+^A -*5S\Z-/~C,[2osXC;AK]e(Mk_'_Qe6;ks`h/ qU+j2LQL] 4j!33A]=-Ó0( `\Yp-Y*܋q  Z*uaoIkZ1~Qsr>0Ulqa0Ө LX B`nstg[zUG|/Bi?O8TO@jM 4f*nm*Պ (YTp0 `HSk%@*"-TN&8+_!%ڨW `B({lj,X ҥs@%{3IATr_`J,4cdwY2h ++q~:lм>MPU1 Ҭ@ $ot8 8pBs.%:Ӓ,f=TgYƷ.Yy#b`4@6ge361})0+#AZYVx:jz _X$P.@J4`R0\# ` Ď,P N~fdQj"Ř3rNHҀ: BMVL=:YjdrxqMR3f)9Κ*v̠ȅi\SU0n@`P(&׀6B)6rx7O EZ6o,+(o>Q/cוJa( y!(8 DZ6 : oY+LcpT S1JMUNa!^َ(P(e+8Q7g86ؼ<_)X(= \ @ƹͣ6x/[ϼ@OJj7jаWGE#bs]#)W/R-S]RQm@"45,2jG$m[q |"(I|u +H lK. ҔZj `;ö8فXm&D{&)Qf]Y P`ʉ̖$,pYLDEݯ#x(AzÌUED d1Q +M==A70Mb H7?. _S XdGiK]{-͇~(=.et' ,`MG@~J`.ߦc]-W ϭ0(AeY/}ebbuC1z×eߴK̵ZV@T;;&h`"TvV66 52a +u<@@,W Dq ^m S|Y[zP Vowr8s0 ٚ}3 C%fg_PE /7X%[K(pjL܂vӤZ  ^_@uV{nT*͍ JQL*P+;dYZCR(,_մ$T)IG1X O;y. z_+x mTFJRN^z9eutB[s %ݰ5Y ֒c NG{p:þE9Yu-(|nB0aLX{OOsZ|.ZEZ(nD󈸔.r,eX(?k. 0WaN'!9NJGWSFaE:k20[6f6Z-nZ30h\!pVG?x!1W Hs,"pt,@ Spo/ܼeQU\Bxd{Av^Ln23s`0c79A] g2S$-e{LZ|Qj<׼9S+ \YUzr4ue9P+V0ycXJx{Ǎ\UkQrEXuO9(R%^?Fkʺ%uA/ S?Np"PjC)OU OZVvK.æAZ \(#p( .: 5qD 45fi4"qC`qc$N\QLY{ hܫ*RȦ%BH}yKWHMJH+qX"2q5A 1"4 \(%ڳ\Xbz8LbVIJ4RkVj[ȶ")#V:XZ[ʨ!h5n Re{16'1t1U2Uz)pŠ gV :QY^(H.ׅ8)B"% hjb\ZO#Bt~i; z[-if9(* <tԮ,1-H,VD)E 6{3+n dC2g:)ѦRp`3j8KH,Z-+$tT%#13((^, vi)y"I蜜z)\=3kMrYY2;5gNlW}{ 覩+)Vg'rݮD[tJ揶-T(;AQ4.AE2_Za-5t;Jh0P5bmB,*Qk4#E\ ZV`ns@ n T9᭕XZ `/C!pBЧUXM55 j a5@Xmq.Yt!^JJ*Hɑ)P+6yȏ2dUKs , ㍏7N+08q Î )N eSlSbwsSlEiq%j wʂPoxk8)xj,ػv)Qd:30tL ծ7PǬea+lQF3ZcPlpʑ)9KaR PF0ZheKӱ(,&3ռY+Gͥ0{_z E4}x SU ]چAAc 06לl}t:T常SMA} / "|I \ 1-Jm{ˋr ]8 t6ڹZKCf+2Es RVy @QDl=Vr7\.8m4倃| -nA)4AdУcrp&KB^(euAG\EJƛ 8 y8h;p wu&.*jҺKf<$]7dcXK2 -S\^X LQxI 2fE ־Lr /ϴ+-^)sו,iB}#[lVQF, L6CM]UЌمeϑ>}>fn iʫ9XzU :w@Y^mlon1MnTY@P.Q,QbyyDW Gl<2tgaWPMR[m~\5C0eG - 2Bv)8V7\2.\(Fȥ'Q5^]-XQ{>dWf(mhLg Kг[j-toFO2<jFP1wLMOVku(F yE_h5"5L4Jl1.3q3ŵw.+-ovKS)G-NlPE[nyCe4̵q,@WK ־P0;Tcby]zK&&3^6<ɋ_\XP-FevV xʚg2ah0Y`| J En~2 ڂ( V&tM 5T{# CmWxelbuy&t>HpjXq`iϓ)"vM@A90C,˚mJT=pk"~Ʉ47(B|eg5 ]A"Sbal/Bhd^k\b/9ʨWpCR tqn"A{4ӨVZalhrbWq 2j3y+F]i z8f AYh31V&-9A 2QߙInٺ8wfUwW ݴR}&h0`+tԮ*Aږlopt):b[;;}<Go|%Yj #[-=p}J7Cn6B54EeJ-x|EZo Sy(sjh;aqn '8xjc1lCkgDb? : .(^Bã(M vb'Li Q.X8$o+\FjN.ɘ6 q-F*WlaF{LHqAX\_Y4U]W("9[}(R]^}V`̶[ZUux@Nns( esW69ImygqS͸uM=\6@qx¨2(u E+Pg 0)=N' ڀ`ˀƠaq)r6Dhisb+FhbDWPѭ#1htˌ_`oNaid Y@^Xj«A5͢ԭrn$lF⭴m0@]1'W$^Anp^*!vfr\Žّ@dd}*ϲgU|@%b%ŁjlJ,kWX`,FQ*]N"_"p՗ 1⠮&mƒyxC8-וMY'>F1_nTuW/NadivحT&̷+^VECJYz&8ckBUߟH43k2nמ&F!iMf@D[ʂ;lH[R-zbi<.,a\M裃S xP<8GU԰yn9@/p:Hs,Ļ92}$_AJ g,lBIO /o{/B9ڨyW/UY_K’g=H^*DhXAז + ʲ+YoRVXSL*wgP(F< X]jMulѧ2Wf_1u1{XX& J#lND(qp]q}@ P=`vŵvH4^j 6첰Cԍ*ca^I-qO20GM|Xs WUǃ)]9Kkӑ.U?'sJ=A'+ -q[rVի"[|G@ (QG.*?P[TM6ED.UӎQtuR[$fp_1aA@ÿ( V(X=a6I''Ǎ<$i P?wԇOҾ@@Xy/£"-}Do)zH7 !t(fL@GQ xB_z󟉼2q:÷g?7 =V7HHs EjVPK+P0Zj/`m4ѥ. AilGupqnWMUB$6|.uc7!}Z=gQj\=.o-Ұ껫#Q|Rk)#%US-O:"P$5Ǭ9l`(9X: &o1F']_C\Ġ*?]JȡvL ㊖ZIcPWw3N]㉪˴&bADF"KC^k-ܥM:C`5󸽲y[|6i?Rm<;Y rm}1U]@#a4cة-ϸFEL\SҬa%F 8CFuᓤKBB0aRAcdO3[s~:+1]g?>lٸTсKmXUʡGTuU-kQX@8N _ZF ]=[b'թXjwg\x57:~佼)! T8n`,Qҏ EQGD"A0#E6Yz,Ӆ(UZ2%wѷHVg-uRqjzV EG5FEmvܱ6DwVh()цȍMuKgEoZGNJu7,Cet??ߒ'|[~DMLU8u1mvx0+mO%zC`-+5 Cħ[anQY-^`j *GLt(C)V|>zKB#E"{,JgvMG ?|Gh dJͳ!8Zx<ѷOth9Uak\9F8-W ^ px`ӗCh`fǴ`SicSlOCW6K%yw`-' ;9Q`M@+r-ruKBdV*^.B *B}C̽+!@!I_*?Ph?`h,/0t: bIWrXv>n6',]jߒG J"(s+廧zgfpjzb]=R1!)h@̪rzC)HY# ZA8 YO9م ګO^;_V@+ɞ*0:vi4C:B WH?$pO!  P(Dgz>_ĶˬV* N}.?m< %$;R :/&p|~}8j)Yxp[ڗXZBNjaS~ Ք^1hB@wV:KYX^BHNڃ6worzKH E1C`CRÍurA̬ZhPGt+h:sDNO@A^$%3 dJs-Yn{3޺#^*cG z=LҞE׍oF)B}i}& _!A<ב6@8CK6.e}}TKl-YF2Yv}'gܝrv}'gܕZVo|t,ƴESCg}GO'4mP)dQ  EE`5l/0Eքbx0C✎C3 劦^}[Zx/VVՔ3rR=vv{ArR`{>G&ȞJ}*ԅR8}. ˛xDR`mʤ7ɡj|w_G@Ngu%m_l= }"<ץC? >S@>bҊyho0US\ӌ'Pu.= 7w/⠵FAZ=_sl迨r/v<2~K*&UrġJc;}*v}S  KUYm#_rE~xc_U)%MH C 3iS!?{"`O)EuᏖ?NǺh># @(%/Mv_zZX}*!:nPhLe\~j*jB́at+ +DAf\z ;~jEX'd'EL.~s:e?sQO'a[ybQls8c돬A?1q݆DQH9!`ȟE6 ׿hpZ!bV'&|&yOe>9??SA5L.:KwXEY),LqjFkάV3ϐzIO?sߵ?I`0U=%>G Lf珡#|PDi)[\|&uw2K^<樅؝Oײ# WsA^ #Q]Dq㵟(Z>d~ vGou4f y@'o//?u@U1{_h>wY4u"mL(NmMN+:xPs5zxǨONO|>;YO[I'F1 4>X؟3@}qu!_rGJ+7i]>>}C=B~tګ?Or:1 ]V}>|Ͼg3}>/ӽNQ}|}˯@Ac]ެ.pERd"|/5CTX}D{LƧN.upVw0ܭkA,vGS; t~:OtuQGO_:Ot5⮯}>UWYt Lh!Ɣ1e)&"O*1B9':}':}':}':}':}':}':}':}kmu-editor-1.0.2+dfsg/docs/logo_design/red_python.png000066400000000000000000000357001341747546300224630ustar00rootroot00000000000000PNG  IHDRIbRsBIT|dtEXtSoftwaregnome-screenshot> IDATxwUy/w>s7zLĘ{M0jLD[EF` 6DlA^9sz{? eg</9󾿵~z^h( @C)4 @C)4 @C)4 @C)4 @C)4 @C)4 @C)4 @C)4 @CPP""ڻ;""cQz>>Z=}sW^=}\}l,C?{L;xD6kkը <ώDmd V^>MjTefwT=;*-ǿ?{c_iDk+Z:;e?=+*--:{nTZ[&3fFswuEK{GΞ?yzⱒhAjE߯Wu?QGFG66ᡉ8:Fmt$QhF}db};>J:kNt,ZmD}h_8.}ђ Ry!422Q68}}Q`T'ďNO\T{wGu` 굧x~/։xIt,>0:\,%߾pRJSQ8akը1=Á} >60UۣcɁѱݻbl۵#jCCO/h ' +kي\zDΘ:0}[lZ۶-1}knc[71u RC_($pRxn#1q]lX7+hzmDaG>ZD':cmނh '덡{5c>6:@v-cVŌÏ3;)z&ɴV{;~w$#vH hṃG3>6f2fvDTZZSG#S 'xϮL3c汫b{I1k qԱȄIR}bpTE' c֪b֪eƌԱNȆuﶛ]fPJkkgm槎4pxZ}G|۱bR'`*T*1c3NY'sX|@T$p0C^ۯzlX:@1ǜSN9m礎P8T;"v^sEl\:X5;!<Ԙ{cόJ[[X4~Ǝkm_(;u22cFysc Otz/\:DdjwObU_W]ԉ(IKKt}\{i1E1+]F12޻;]vIlX0e:-z,xə}qK '{dxñƶ.P84y/zI,8}L>3pwbϏޛ: e+bKΈg7+u#3;2Xp4pXskR}Ri95b~UKӀIb/Mo1mK80i:KXWf)!j;WǺklX: 4L=KbY9:NQ8Q;*֟wN ?P40f2xūb/J{G8MAl2w|=筩@RƒqxuNFR8ͱW]:;bٯEKR)Y`l:6dZ:bK;IpluWs -]]qK56gn8EP8 4mKлcuWjK~Uq.Zg5 j56_t~l9w}X%/{EDKK8YR8 1xܓ: 㐿}[ZuR(Q83WUc󅟉qlJ,:eo SɆ™kwCy[(TZg͉ױgD:δp^-\>W@BsN~nwGA2)RGbeCEOBH߭7ǃw1us(ϙaoyOtxP(ӎ™z=6_|A;QOxfao~w,8RGVinww@Q(kk ~Gc L%)sb'?/8/ d3{{bF((H}l4|?kHLJ,?{CS^pN=;QYx𷼧)Ȇuq$׮Ihy/xq-L3;obgW(_{Ntv2%΄zoQ<Q)6DN3]߻6(Фn)?H( p&+b2c Xz:JC)Sl_믋[BۯZEVW1vb'?:F(Sdߌ5yKD: 0 mX$uIc@}ޤl{elxmo(ꀱ CkV&n96|1&۷oM ΋ܔ:ƤP8'Yup bdQjл17sիX濌I(:~S8'Ѻs1l˱Lcil;ޔ:L֙ѵh=7fώ2cf֙Q@Ԇ:4ՁPE:xEeљ:>Q8'}w={UFSG}Vik'ƬNCE!}znCkbc;b𾻽y'џO4c{ǯѭSGRiiGO:9fD }C1p筱bྻ#ԑ'\xYt.[:^S8CV{_\Y@s^yb,:W[͛:Nn;yYl1LkWw?¹6|sSqXtbљ/COI }{l[߈=LK+b:1¹n9? ڌÏXk/Jkk8{>6;"6~1~m8ʜSNc?1¹zγ_[6Oh+?XpگGT*x7b>kפ3m{bγ:S8VϣR'_0b_c}ΩLz;FctۖquI/νKb{ޚ:X^0tbX8I9zN{D ۶ĝ1כ: -]]Lm}9up>xbg>:MsϏ SGҌÎ>qaSߺ"jOJ|>}NTRIu"'{V(Y<8_{vF߭7'0i?\1l/($MxΘ:JCQO&:kvKR'Q;"j1s#v^1hB8}G:JrjoKaFonK )?g5˗H`kwysR(◿2yV su#-:ƤZ}_i¹RGɸiƢ3^:Ƥ0L=tN=1~qeՠ gZ;:ccD*΃.`uMMY8w}[#dyV1yCф6<?~/\msƼ(u _9#*ckSG&,o!j#écDܨ^h5'f1GRG&,=N4zn9'?/u6a]l^ 'Slγ/.h)OalRr[S/Z39w^eWܗ:MumsTYO< kLhLaT{w:ӄKuh u(#֥@j隑:=9p6\V-R 9ZxE[ `Oh6 X|N  Ѽ gVp MSGIMo:_sthRğc]+s:'S/u&#췺X%< oX:`x##쿪PuN4kRG`1>i` 'hWFn.Y\p6x: {8u#Lh4\JaiR<QK gMP̟_/pǽtzoQ uIQW8>6Q@|>X35eS1N=+pL7HVnN}SG4l7z}f@/9rl*z\П ezhu =@셾~۶Q o^:{aUP+Zڵ&{6:;}UEQ8` n}?qZ==_1pqSG`lҟdS8`ٙ:Oadú}QHmx86c6^p^;+KprQK'0usl⫩cI)T_(u ?į, SlEp;bۥ_JX 'L;bE秎OpG6싀FQ8 xlڐ:1p]KR( FcGޛ:ZNHl뗿;1ʦ ΋Ki(0 <#ק-֟1 @7VozMSGi* 'L;S(V}l,VbdQ ֯]>}nc?-zo1up4SƖ/}>ub_Ki)0 ?N.8/6_1 PVc:Jֶ\raNj#qil+di#|gD:JkKxrj5ּ-QRBVG>ՋRGQ&0ź}0ui>6iFLlxMj?-??;v~Q9 'dd^w}V }{(Jŝ>+5u ټ1ߏ-_:Jrj56|ܸM㽻SI(h~g{>unRa 1q^ q.fzDH'7ņ|4zoA(JRŎ.W_NX:>X9{󍩣N(Q=_=NiqgGT*=X|;f!N(Ywm޵ѱX_ѵ~Кձʯ˿cv$R8In.8/6]p^:3:4jcUA)Є gsN95><#nޛn w4bP8ɍ;*v^{UDD͝]39 '@N Z-u 䣮pHa%Ȇ:@N #F9R8|pdIQpH2pHa%F=YR8|بdIN<)@>F9R8|x K ' pI2pH@N  dIQW8pRȒ Ä K ' Rȓ =YR8l84'ȇ:@N &YR8lx:@N VYR8|XdIN<)@>< %ȇ:@N VyR8|pdIN,)@6pRȒ f J=L9rpyqp ; 'qdG:@~N /VQ8XdGbȋ '@vN /&Q8Ȏ J ; '+u(@VpyRȎ d=Q8pdGR3ȍ dn ȋ ȋ:@vN +VQ8(Q8 ; 'N(@V dGb ȊSQ8XdG:@vN +6Q8XdG2c Ȋ{8py'@vN / '@vN +VQ8pdGpdGbȋ '@vN /ޥJf Ȍ ȋCCQ8Ȏ EȎ d=Q8pdGN(@V ȋ:@vN /VQ8pdGw(@^ ȋ '@vN +upy1Ȏ dŻpyRȎ š!(@VK ? '+u(@^pYqJ ? ' py1Ȏ dū-py1Nх^L6St4 XYpBq '5@v.N(&@~.VP N]8}bNхJSTNх^5 N^8SG&kSt)p:2Nمӄ ;ENԡ<)p:2Nхӄ @v.Nم)u(StȄ ;Eκg88.~OمJcs g(Pu]8RXi $@v.VP";u]8ԡ!AL8Rp4R9b geb ')u[8b٨N(:@V-upB8rRn4b /Nԡ`Jӄ pdi b wCL8RlR)Y)pZA||i3Jӫ-`ޥr g8X '@N-޵ %S8rRlR +NXuRl pBN[8UN( @^-&P0N[8M@`J)u({8pRJ3P0+u[8Rpdi r;@^-NC||d˄ +N+u(Wݡ![8ԡ`Y)pZC|A b CP0+u[8r94r :˻Rl eb CP0+u\8M8TK3>!LNN( '@V .>!A /ezJ@V,P8pdN(/*Rd;eRJ u(gRd f " :΄ +eNN( " ZBY)ppB B '͵HY)pwY8M8p&Y)pVSGY)pde3KN(/*Rf@V,ޥe;4" wC\" '΄ +EN /eN+u(Y)pZClRdt-J /eq +eNpv9)pzVw'@V,NC " 'Ρ!Y8= e12 gՄf" +SlKӻԡpJ)u(SY)p:e+Y)p:4S8Rf4ᄲ94" gxNY8M8p6Y)p~@ѬRd hKJ :@V -P4 +EN+u(Rd4Jӫ-pNdYW8d6y)ppBL8Rhf " SP6_T΄ +ENԡp '@V, ' /eNN(SY)pz ^RI^Oh$pdi eS8rRdtJ Y8.~y / '! 'ENpVY)poRNY8gqtc֪RGF +EΈıXId^m b gDDKGg#2cF8dq;@V.e/?qQ3Yiu3_/QN4Mገh8q}p䤩 YtY_W Ҕ3"b+c N?#u`o94-ݳw}(y[3u`N4uገJ%ߏUrasw8fIg8pNǛv԰RȊ9:-y|Nh+u( 3/\|y(P&N( >a{;ay + g{RI`Jn75Un9[cxé@s㽩#L8g<;?kF-u[͔  kx' ^sN95uV=,graRۯz;_bl׎i +|NLpTĢ3ϊxeʳ#Zq2@64im8o>uqtw|8'pN#+X7Fˌ.Nl(L-ljsME'f sX$bէ/Yǟ:L;VP8NvQFa 3f?oŲwNpdCH댙5.,ũ@Rupfk!q>Gǣka@VP836 _<};}q`jYdC\58Kߊ:;u$VP8 2cF,=q%g2*-#AcYdC,LǢ%q_xi,8qa P3="|s>ǬL& '@6ycgGcǤf T*15|~pdCl&--3"{S'}pdClBWe^t;<ɗ:@6&Vio;N|;~_Fy#S8QsCKbϋRǁ'tP8yR~,FnN~Ɖ]]:{J'UixoMj_:%CCP8yZS8ߩx2=XdCdUc~'N8_>?)u$pZZb O}1ą1/TRXd-u6cI'Gb%m_8j#c '@.RgR[zQlc7u s_cVRgR/\^8+ߎ8`iHJ &4V=7|76_|A|LURtwBpX0bbW#] NF N\/}㫱捩㐩]Ft+?b L=`N:?nƶK{R'#V0dZƮ]'O鸏>f?٩cL8V*3bg5Ķ.]1b &L{^1ᤩT;{fmx8v}۱W~/jé  'M+o_ GM7F]vڑ:Or VsjqctۖԑxG˿:{@ᄧ1G\Ï<::=ZȆukcnhHMwXp 'ecɲWFmx8zoxѭSk.urp>jz{n(r  'L3?2?AtC1amx4@>NhbgĂψۢGM7Ddp'@6NLG7x}T'̐ '@6NHի|-{cgW^ݡ!l(X5]ǮWGG7SNCP8a\<:-Eg#6D߭7GD]CDZM2-Rȇ \,:.Eg<""11x]1p]1\:@6NP5vloG}gT{lf*S8 _:=1x]1fu Y]$^Y(PEKK{RDD7/'V=I:@6Nh2gyc?VVctٸ.ZVFuh0aڧPY(@TZ[;?Sz=F6o(<C?#S9Q8'WF6 bh^mq 'O*?5ٟ薍1~]n7M1mKn7ބ  '0*mmѹlEt.[񤿦[薍%tݱ-w툱];'cSG^=0}FcgW6QD{v1g쓞:{@ZRl ' pP ' pP ' pP ' pPDjf&IENDB`mu-editor-1.0.2+dfsg/docs/logo_design/splash-screen.png000066400000000000000000007042041341747546300230610ustar00rootroot00000000000000PNG  IHDR  l)bKGD pHYs  tIME ,6Q IDATxw|u?Mo$$"%@'xR-`;O=*rz(O M$!I|~Y!x?}~2|N @!B]1"!""º3::*( B!"""4]@bcc,( B!t1t#B!\'}DD$66Vƾm $B!6&eHG5xB!BԄp͂-K <!B!5 hpN!B!亴;X\91.B!nB1IB!B!\AHcrusB!bN\lll-VܥB!Bȍh#Pd=b~yyy8ueiŋ;3>#H{ !)CHСC}QPrKh%bV>)#HVZl?Bnu%999ؾ};ӱvnM;%%Ҳ7)D`I/Q[,<777ё2c f?~g:t#Gܹsq,D3MݻwK< BCC%mA0qDgo^ux3ɓ;=q9r$,YYfyDBHmذ-Y%%%x)cA Nϛ,wg oFUc x^Oz1˹E̓;v0Y駟z'B:gӦM어cK/!::kxWпiۣGb&MzRFFz-СCtC]&XϪƍxJ;w |}}1rV{æM?>ףA>jٲe(,,đ#G0j(tèik׮(7ƍa4)3{9[[[lܸѤȁz|M:WHO&X?[[[|ömD;!yiiioGUHHeh/q>sXXXB=z5k;G"-- OR>LBn9TBG ">|{ndff^WZ_|@Vcܹ}DXXt:B!NOzSOh|駟wRW\?_ Fc߾}9r$;ܾB??^D^^0x``rr?ӟ >e˖|9͛7EWMzzzJ/Z1Ƙ lϞ=l_~&iڲ'x]rKyfϞT*Ufaa,X򺔮``;wdSNernee999_d֭ qd'N`(ޔ|cx6f̘6֖-Z9ryyyI-[aڢ([z53f?s_YY[p!g޽{[ls#{O[7ޠ57(!}2agyfaÆ.X2lРALN 6UVuֱ*hd hc xoG}k3gΘO>bL&}dǏԾoܸYXX|y"]m۶N]'7of&d,((ߟq"VXXh{ALL spp0ldFa=oM6mԢiiiɆ : @ٳM>˜{כxk_̕ϟ7\-V^zi_^W`B!@Ξ=kr IgSNI{73f>>>vL՚%/_z%feeŞ~imձ|? : >sݷcǎO?رcҫybgg'_V9s?߿mذEDDa0_|;d{jW_}exg}]iɓ' .d'N09/ه~hSvzǏz={HOEQdoeSLa|A[zԑ~'&;w.0|p$&&Jۏ?`Y|||p|׭{ظq#JI޴` 4|I؝?BVsuj}Xx} 5yi;LiלCQQocСmn<Ν۩òeˤx#Glu & [nݺnpn}1gD'|s[Ζ.]ٳgʁB O{M [nEiiijOb˖-HNNfW*xW~G/{0vvquuŃ>(-ggg8qO-Za 0_ܹsn咒n˷:|i-ǜf4gI666uiÅ Lg}t_~[g6Ǿ;̭'I < $X`륙47^],,,pI|ذaN:KK˛O>f[ jSGzz:{=[ѵ댌lڴdy̙JGi7lػw/{2g&OMJmsN2Ĭ _YY^/?sm$!B~ڤ)'|W^y*DݢELy nքFeee-wTԝw9_~&˂ ZXkt*{ Bj&rȑngsҼ=N˜vq5Y]^ H &˹cb}1w[o& 3 ѣq GmxZlT<:bcc… ֦nLDh0*-we=\777Ν;XnѼIJ``u׀;M>ڭ#?%%A_w64Ǿ;v& :7oL4۞5՘?>F۷#%%>lԥ{xxHt߷@O{S]ݽ[y'dZm/s s]TBn fŋQQQq%J㏨л:$A0c f~~~xOOOd2<LΑ?NCCC>mXN׫kgͷTju7Kk `071mڴ.lecc-\bk @VxGzjiݺuGIMͯ\]]1u26l`|̝;6lh9KΠwh4&]q)Xoboo{r&s]PBH 4FѼhѢ2A@\\+++:q(L5-))i-Z֤`7bĈ^}]4w,6|rw/]tS9G$!Yf t:6nqln{͟Xv&CH;hcصkW>w!iϦ`뮻4%Mv-M?vḺ/?& n44t:nڢp44EQ_vb_F~~~pi=? Iz=P oҬNNNx̵j*R̚5d.k1pqw11Ǿ;0tMrbccY!Ux{Wbbb1 &ۿ[nlٲiO<İzc 3gΰ)JiHj7onի5z=1bf}a "qF,mR7|ӭRZZjq]QQ<<n?&sM޻wo߯׻-s3 1k @-&7#Ft z͙3E83Je~lh4/\83= ٸqZLb݄ : z[cΝkdR{C>=,++۹s'spp0L٘1ckբ0WZ=W5 S(-ϝ;UVVH5f͚Ǝ˂LN( pBvNH_&1www~ƢrḺ/ʿ ]unQB(! :0ل :UhluϞ=-j -ZOwZfRzjhZwSOua˗/gVVV~O\{ ؃>(ϷvYY{gZZ'+**b[z^W_eUUU՛;y$jdK,aΝ|ֱcO؈#YvvuCS)S;w;c_̑] @zܢJk2CNe'O\]]7cGjj*hoo1Azd*^deeAV8p 8e^\x(Z>dP*4h{|Us싹󯳮zIBZ|2B?~<9xꫯRB!(XrUuuB1 @!MߚDB!PB!Z6PB!BHcaʕIm"3B!PB!駟ownsfgBB(^O۵k(5Q'8qCm{fO!BHQSS9s駟{7pk. 4xyyaРA3fL=n>B!!UUUQ__ߥnK.!##ӧOUHI޸tVXk?!PB!,z{'MNY@TVVx"T*f̘ O?s/_0L>KLL?t/b_?5k 55nnn;v,x 899uQFujŋg!%%=z4{1ٙl۷#663f ̙L~DGGO?E~~><==1vv;޽?z=0o<Ξ=O?+Wj_xGM{qbĈ0 شisuutnt&ڽ{7~g =M~ wFZZ#`„ 8N|LL 6oތ˗$+Vn3!eTB|W/ ={ꐛ EVV:|0uT9III0` ;v`ш1ٗ-[`̘1ŬYo۶m3)ԾXti2coٲ_~e?!yB`FbSN1, @ZyHV\?|XZ1Һ"feeϟc,??`SN5[ӧOg1,55UZqfgg O[W΍̛7`iiiҺRfcc0V+gj1Q'NdXaaa􃃃c?!5TBk2d#F 55gnBBBp#)) ǎ3p7xK.IvBĉ;\B߇Zn;,[ (6in ** 6mBJJ~ڵtxWh=y ȧ~ xgu:m*n Ny8pԌKСCxgh߾}n;΍ypixxx 44EEEj׽mB(!΍huSA4661cbbb 69פ^1~x{쁣#FwsC{`ҺGNɓ'aii/+Wʕ+w|̙3N'OXbT*UdҤIhkfL!BHм`o.MҺ/._ .jkk;Lȑ#iё("77>>>&+j())i!+M233q<<<: ̚j}J%|;ŋ{Yӱo>L04iR9sl:7n4ݶ?! W!tR{5 M +V/͛7㣏>a׮]?mRT30uskk\fnnn:[[[0`4;lT趲իQsG>>>>|8ߏj߿/`֬Yعs'moooK5K'[ՀBH7 0{x瑜Sĉo7ٽ{7BCCz0h dddBq`` \"5jҥK`24Q`֔~ii)jjjId̙t/(56m mۆ @ծBB(R {mՀ P(1cFW.#""iMѣGqi9)) -ߴqt:|g~ood}CCvލ`7NZ#}[fϞ ^琲 (Ϝ9@c;;;;L0gϞO?ԩ'JKKN^BBBm8B 9;; NBIIIk @^|Eڵ HNNƣ>T<pTVVbǎXv-BBB0tP@II nDEEI3… K>Cuu5/ ,@dd$-[_~FXh#>}:"##zjlٲuuuصk >/ _}jkkqi X0aIrCTTΝ '''W_/x{{K[[[GTT-Z; 4M@_LO>J ,Jc* ǵ9#|\[ `Μ9XbJKKqwػw/8[vx !5iS4$!DQD~~>J4T{x7p1=yyy(++Chhhz=QQQVGjއXp!֯_/m ++ >>>is deevCEEa mGMM jI&W\C*,,S둙 WWWUz !3YQ!-[Lי//vk[V_Zv=;_kw4*M[[׶t5q댦(baaVq&>KY@!0e׮]PR֓[ gBj@!y'1rHXYYuj==?!PB!!s hnҤI{zrkLBW_Ř1cKq FY@!B^a̘1mE e!Q'tB!B B B!(xuuB!B!f>x\J9S!PB!v ?ՐxBB0#D娯B BydР ! @!qy!?ff?P5 ĸxyetB:ERA&Iu:d2wzMz=JKKM]F8::b ={8}4˥}8(R9Bno6csӿTJ:` Q^\HG]`AV!rP`j:Y!_>\d Ə_*J*myr\JCaҥ@}}=r9AVF믿x$''ܤ@(!0ȮygmYYYx5 FDƠWZΉsPoRQb 9ὅPXX@&7͛ .z4r^Zj5a+߿?J%ZZ<ؾ};lllPQQT`5(!+L()9#{?E܉(+/ t0ơD(6D )`n<+X}Ri|暿/ TVAFrQgkFNQݼp@H_ψ(  /acc___\|?0.]*>4Ք(5nWSߍhlذ`4h0|̝;VVV& 9r>(ҠT*Q]]3g //O3_* t쩧Z| 0XRbPY]/ԩx#j6R%ZC2Qdelll`R%cN5/ݿ"\8OOFw@mi. "{8i*SB(>M6AP@Rax衇PTTsaڵGpp0z= IyV{NLT &k 4J !Xy̟?5Qs`Ll|,%1hRHD\ Mi4 X7cC1*'NA08 >;x^0zT\ߎrJ" zh5b8nzCPYƑgd?m:8> nn2 ǃ&Gd"8 A `c=BD{E\\ZɜXv-0rH(JßKNSp3j(TUU!99jxG쌂DGGpvv Aj:PWW,,,鐓7`0 22ҤHS~)7: ]vBCC )) ÇLYMy x i?.fsӃ׌Şx :ۡY9Fn^r5j+U#VףJVV0 pvvwW76PYU0*z㹫DQ8@Ɓ1N* FğM DP*͞pR]m<"=6cD HފS?x8j70x .f$w8B,&`AP5d%a L wB)Gn^.4 tz=//0PSU\Q!+`4 yܤl\'|رcT*\Ch4BTbȐ!(((qP(5k> nnn j?A tHHH0 77)))8}4)S1šAAAhhh &itP( "Ξ=~ׯ_cj @ݻQZZj. *2瑜:1g ,`삼l5.ΜMK?w +>pB]9RX-`gJp SP\X nj! PUY;QW[+kK29X&p`\J5ENvrrx.AR /3,5kxz] sN~%5p,EA!!o 'o2/-,p9+σAei ],wi7ꑟ_tXXZa`k`=8|0.&0exg1Ix1^ޞ9*@y|u͚5 ,***Jj`ҤIQ\\HDDDHOOlj'~z=RhhZixz8;;#,, ...8w)}ҤIBAAqaXYYaРA Cii)***,Hdjصkߏɓ'K-`jB: fa4qaaaAAL&Ûo%KB<=p(j&ދ4 J'BT8٣GAQ NĠF;{Iɸ|9%e "=QQqFA{dd"5-*ZmF 8o12"cx_Q_W 5DfLP^^dff$*W܌ <84h+_[:{dcprelfRptsAm}-lsZ$\Cee hCL8Q  f_AAAA= 66 GL7%z  Ý8^\-GNm zAQE ~?yj;{ }jdeRr:rs P[[]J9&e:$ u0tù\JO9xzxAr<.^FlYX- )"T*oy(/o/;vy8QOC8Q4`"|?Զ.[.8ixPVL톬X)=֠AG!cU;"`P ^t1qr&:h뮱ivBNo݌q".2rr1g\"77V*ٻ#Gr: aطoÞ={`0`0~VɓQ\\U__aÆщ@FQ(q+W ] :=m .,DʭP(£?T ye%4V ()(FCY6P]^Ǐ<2 JP tPT\̔lfAg(r!GlLDT^@?wgpr780nPBDȕrpr%5NHJ: AGXe Z1#aaqq?6K:SqKQ!a[ @DAg@Pg]BU}% .P^VPy9O#!B/Щx;ήuCqZ-8 phl-; 7 IDATApq)8pC!(+/~AhP|υR_Ȉ"H,iP3kcsP4ѶAvն7]MgG?Rr (5 Ǐ㡮v$QCZ0Wwr*}45.^~qW~1ZFE a~iy u6MXwњC8& .zυ^H\\L`QWW7Q#bZ9|0e̚5{UUYb^x!{i&Okײ}v/_~( :P(DVV .dddcǎqFW]uIIIR]]Ν;`0`4Yj_|1KG1DG8x<<G kjj>}ztp?Ctq>E& 1TT2 u {@ 1cLUв q; n I[n]]U] kb$ĠSd4-z9tNj%IqvA}^((1avE'\p̞s]ݭש9TG#u +16g,cU9«/E5!:>'PSЅ8Bcc9EEE)CMu?^ɦN5 eZL:c~¾!bYdR1(Zs` h8L_0ӊ9ti|PKδiSx|34(0~g=q8]v2_Whw-ZB : /ͺ) :1P >M267kS)1nB! شiowy'IHHફ"c49z(dgg믿NWWf@ 5kݻ6L&wutvv"O<ć^O[[^z)K.o0L,_s=z~VXy饗xꩧY3fX,Qqh}G`ll-8CPPPPy}49$@FJ2GI,b().)b$쥽 s\,)$TTDESHL$@v.]}9_Zu45{9P{}?zD9 b+*׽pgf4"! *"=:FĩƛX?tOfk !M<_Ls)q1-SH7h`NqnFl!1%Ia, ~:A' skG2 sޅ`/,Gc3xtFn9(S7p *"!!Lm*;'+2hc`TO( aU@Vu " NaRzE#-=}B5Oq|\+  ;PQQ@P(drMJ?3f &&/ʭJqq16m" 3ϰ^~e 'U$A( +"g&55VOEEӦM_2pA-[ƌ3&"=MHoɾSOS"ŤFg)#1$0D6A|ȶ-7ǔtuq!!w* #:Hw *p A8z=TA@^ECHq8]de&7?9skA 9kRNG38Cgwqʦ3Vbgb +*ʘwYhSS$s8| X}׹3y,]Ŷ=u|{b6B!1 q̛7.;w.o6mmm\.^Ge:i\}ռ8Nb:Cbcc;w.6FKww7-b֬Y\~$J@58N=I$55sAjjj8p($E *YӣI7@^HK7\w%Kع=r`2o{)Ͻ:+V}͆wd˿ߨ0FtQt ==] `KOgfěgb.lvLv+­fe爧 ϛ2:xp( (r$pz?9XbIN'%ݍ*hws#]_ _1o<1OK/V4TE7Bee=]$$'(HưׇNnQ5D?FMVDT@BV/b8L;u{qs^(@U| DzzQB>J/$#'$ 53 ?;:@uAS& ٝH NG, *ehGbb2/7pȲM7î]{ysfA"> k!(HkoҲz40DVHp7QgE3 l6\pz$ UW]jEQ"==_~Qx\.:zgtwwt:{/kYf {wz/^|Bk,)Bvv6匎RWW۹;Q.J@58 .]:)I8&  'bbb0 BQU޶~$ǎԲO>-H2S2Xrv{\ѭhΡgξN2$av{ttwz("34Lf#3İL uQRX2'5 2Sv:ilhVzz;:yɧؿk7m$;IMIb h:\O ۄ9FGlDՁȁF:$zFSD諸 HQ#ĠzBAnȜ%gbw"*qx<#̧P Y8PsG|<3OhQ* 0{~Q(?-fzgQ:X=.e]Fkk+uuu144DVVvNZZZfhhŋo}cǎ122BGGI.2***8zm~;/'k())P((ANJII PkEQ(בCEE'>s!66ӸBMM F/H})tΜ &Bà b,YkWQ8{Yye=%E&9P]IC_'A&1f81FT)nIKx3 L!+7UkDZqFΎapZ̚$s ^GՁjOOg׿[oVLb6MyY^YlZőF/>r7g%mcޜl lZY*)]>CCEn"=r ;QԱ`#lԡ^M BIэߧN= Qؑ izFa,'kq ;Ir( *z[QRbDf/;t$Q:%H<%>tK 7iC]&%3J[A;i/䫗^e߸_M˱F??B  ==5 ?k/=EJl%yzUA=Gv`3KjJp[T^u`Q"3R9<4T}&]Ԍ䱣I7)>3ڇxaqxTrѢE\qtwwm۶Ho.b=jCظq#w&8\.^{-<{M:yHt@LL ??"Q A#Iʕ+)--СCuRv}hmm =8@Pܼf2EJLBfYg.Q=?o}ŋQ9YSr =m&ř903(!%D; )ƆdKioYgcܳ/`1V'HV@kk~I9K>k8R4 Z:zDq::Xy'i>҄";'L6oh@}SY+).Njd \qWKL6d5LonB}ưN@heOM3sh22:IșRa JHh h&/7>[Ͻф@@tW:1-x"hAJu62SϜ- -G/(=NQv}~?o-x?o6MN/dOVF*U8=ݿ<O/w^eylںve˨?jL2`i!c\<ω01x<噿a4ޫeѣM@DqNN;@@;ɠJ GxL4z|gΊހOiooGD/_ΪUaƍ \,[*^/֭c۶mw]~ k^c0dǎ:t",ĵiF^^^¿H@I "K,ׯ'66뮻+VevnZZZt5h YC[8o5aѩ$d8ilÑȚ5kHLH0Ӧ@ooDՌtX?_lӣ<!?1z_9Vn Ilڰopnlqkb{u5Ce?. 3AD?|~{?X U@ fo$>>W_}?koyIO6<`UǵߺY49:_>/k!*">Ny|?zM@tHkbiӲ:#5Fh=Jq4TU$0"\ߎ ~۾m:;ٺc7>FQ wݽ T~$v3j (jO;*X ꇘ@z~o+;gc6mQA]Ih桧ތހLP4M#--g}~x/룹^#<2F&mo~c=^KMM 7x#7oF$Id2Q\\i"+Q999\.PhcHbeeĤꚨHLLd̙3rZ[[Oirdɒ/|>$X1Jf{ϝTVu`It_+00ϥ9f1Fv6WxRxyW4VVq͗/▛n@'JwtqM;#6zz:5/(:."vT(N!\PYILLegEɌR: BTVVz\]9y{ﯱ&#$cdYy'ZU*tQ dEhj4){9ˬ3INJ@~sF$z YP?4QP %;d%ልmc{ ?WP7 a^?.ǍY/OD\\7Ntx^a]}X?xzD@?V>~hs Evӓ74a\;W_0Wfԩܹp8~f?d`IΜ'7Ml6~rzMhDS>  &mtuuxnjfRSS/@Bh(LI8z :~;ITy;c8-}Hr8wa4 T Fe8~.\HZx IDATnVng_uy ^5*vd_ŲAؼu ?eg3OJa6=!?Cu;7cPFC:9@HS0!"4F#a9Kz':9s搓c`k>x$)(GZPGF. cT=M((=-Ќ1ƌj;mt6%)/EFj:HBAD@DvN]$'O8BNKo"T##ZFC5vV\pO? .aw~ W=]jeJv:_jЙ0h¸7QEFGGٹs'twuQTP@8$%ESa& h⡇;MfF q(ZD[{+x֬ANEHxpȲ&HcSRƎU PD})6_S =|}Q3T$] uw {)@Tt''*q[9mp؈(jH'mV F0|㿹 EqbeŋO֢*wߤ/r:;;ٹsm> ?я& Ǒ=o1阛nBTUvSZZ:ѢQ#11ӧSPP@uuqqq  :UU].\rItO}dO]Y˾}UPVމgh@'yW}33kii=BB| 08V3aB^i%OFM;>KMh _y?7sۗԏ\^D5lf]4u˴y.,MAMDQZ1oBjy ~-b5?KSCߌbDUeźi8\?:p٥ ++y%R:/㥩(ژr(F@4Md2M,z$  S0$11WY1س}/Y|2܅lBQhGG!0[lz#J(@F\,JQBRu9Ԁ6ԇI/b֙}dx/HqLg uhWQQ1DX0 &ʧ@K)Rv>9R0$IC@=[wf}!w1:8D#5$b0:"2`PDc.2NǞ{IOKrQQQAgg'xGGILZ@Ww7K,3<̦m;1MHJJQ(_۾Ǝ! cpXA b䜒8k[jYP50´FVVia^z06meE4CUUbbb$ F[[ۤN^~e|> v?|I̛7QC$ . ޽{9쳹' ԣ8ws,_:.PSS̙3?\ , 99eş$W Eڷٹm36BZqŬ}};6EP{c4=9k# ! h Y,u]l܌dV>g78SF7m>J$pGhl2r()dQ|*  0[m PYY+)ظ_x 9cp[+@,&#*#"Ed 4|Af6#GQle#5jxoO6Uc`Xǖ0(V;0˯d>:,Yf#==yrQ.^Jӑ# ;ܱw֎65{6}WIqQ1%M&Q4QJ'XߙH@="'s< "+} '!B "DAC>?dggO~ӦM\qAWB5Bd@UB44‚/_| =]4u"XtLϏe`1۶^$.J۹_t?Jn7"$Ν$&Ƃ롩p(D#Q0CTDMBp:֑:Q("/@DNNpwoGT|?zqesg1b ՂB$2ޕ`6"<݄TN<;/Lu0FG^?u a:18gGw) ֏xi)--e۶mDQ?9_5Myy9&m[toX&'xRnv͛K8묳;OHTq2&ޙ`Tx8c3q^$HMN"92;̟i̛K~&=>A-[奣lܼ~q|OaJmS+,(ptcFiD$TQUb2(^/mmm455a4t3sf|Jf:Rə=58~Lج]%Y~{e%v:n"MN8wDZťT%%=AGO\_z{d% aYgAw^Ad1JBClf]=ToȪsBA䍷nPe(fы6 RGKMD>^Γ4(d23q9gc0!PT@0̑09Y'gpLKCU&#@J0"WIOKd32;6 :#w@K|˦-` <( Dd\xn'7ϽrADD4M@:Ͳ̟(Bٗ76YSZ$I"#vF2 t2&KyN9(!(!t=\XZS:N0"0995@ww/(gt{߾} 6l0iQ['`XUUtM73>r {v"ڂ(Cn9Ơ^~Xj,J}#(r@ xGYX^NϢ#y8POX3`b4`]5,c`XTTT?>0J@TQL[k7s,Xc,L{x> Ȉ FZj(g"'g*@J$܉4@ 12TU;)WiȲ6"LB$IbhCu"f?[ᑍ%"2+xB8FTXU› 9،a$A;IT*2g<:rYI2C,7vljJ D i " f%KPTT?<,+ytիW4‘O0jҶnab'..ˎ;e/}K+XV0$0 *,]nK.d1_% Im"ʢcjܫ`5S\3 uu9X9U4SU464@zF(wc6h$q$gJ ˋ,X0*!*2FAB UYtvlٲAըe;(,2#cu f7s@ @kk+3fPN3TU%&8PU En sJXġw673"{+$B FYe̹7]ǯ*F  F49#2j8`ovaFɌ|ʦXB AYU#f``UQQ Q.YL+а:+ F6> 6l`fy,p9 t:à7sAWZ\(塄Ø,f²LBB?0^zǚXjDjt*#ʘXɉJ)E;wtGűd^.mn14:x`gۏgiS4PU\ni Zȇή TQ`e5sKȩ~ʡL]]F`0$InNo /@YY R_ v?O&m,_p8pUW( #)) шd2QWWGee%>o[x-/~ 6lw] PNˊAEE)wvyG9X(Jqfb.rpD֭}n%3QύW\%r~lOȁ$ b^ʔNʉ#!Ha:BdE&B2^>I2㭷jc:(tsP(Be~9zS?p:|%pm=]sk&+6]j) 1ڍa #O`222!qdybPy]:[nnub APF0Z!!:ڗ[D@WCD }BMv?;1^V>l tKqIثF}}ӏ&Iw{?sc,^>/ ƍ쩮;969FDTDqL)ftЩMwN;;1NȑV޾WdePeЂ8՝@54C!,Abl6CÆ.F|}j?eLr2Su8'ʳ& ~z:؍& u$3ט1 $:l?;β?6sLoFH !Tz,W׵+kYuAw*ZWEAEJ$$3LgW]=3NpJI?D1y=m&IrX# atur%r÷G~E:5ʎ]M[*۷`ْ&ő*A1c&Nf _# v1PdPu!,L!5$#KH}%4spmL$iɿ|LP_"?}o%Ȳ$d-Uװ,"ՠt6q8eKYJo7V]Cm &DQm`:B:P\1qɱ8~/_[9rJ8Țu̚3h[NSZ^ҏ?__ { 6,3<`w-v'xdbY!$J= ݂ϕK)~JwO#׿FdEFST,$0$/EP,{?>ͪwaY,_7΃KSS3'X} h?Mu2Em˲4ϮEh0m"!E_###TZ</XYۉ&p=EGGx EҹRNEQ& rH%RhdR]^ꦐJ%uu iRVVիfϞc>$ .bmʕ4(I,tI&AȊXPu re( J ;ՙ^:H.dZ [Ffv`^iMHI|6]HpE~anɰ".(o4pΗs{yx6Ou4$ldI` #7nV0Q0XUU4551009'cz>g}}{<%Kp0sɁW_}u~x櫴 2y{xG& !|x^TUe\~h6q83ϐE)lNJYY~yh˻s Rqp!_ E+#1esgss$瑟b헶f(?"7owf*HX96d 7ܵ ]䂋 OA6,/A6NuG?L1>w( dN/3ͦhu:55i:}f*3-auYHXN0LRaN<{(+)d6EqzQ<.aZpy5kI$˨ضEii)(H R.dMNn|>E̪H/$̞]Ogg'ee!Ldh(J*@Ud҆IUyt2+!1gNl/ZI&sΧ/DQs_KW vC&E@qqKtӇAVQ5-+h|9^EysTR' QaOWC)7Y墚AI7ŶS|OIflZ7eYXtSs4 8_|P‘xW7bk{%#dO.jK(\>  k}j6H5kNcc#a,ڵkYv-ټy3~;_Wp¯|+tMx^nq-$ UUlٲ0_͛73<<,˴M$!DZ,krHakk+aP^^Nccdfes2F:(Yٸq &zoy̘pѡFvY\ç}4~^yp=S ,I8t7e8Q4k.cŲ,^~-Pd !ɵWtWa,!!q4/m\v??l}|?cbb;`$,QyB75FI6<ֱʅ4v8< MhNǟf:7]Tp͍c~It= '!J]e%ld2H2A#ih*XVEy B $(0ٟ0~"u3k ,fN&L ӰI#0-4maʋL̓$,K b A{G;tT2A&%JRZ!(..k\.K<6BUy)L0٬,)Q_[ő#(Luu5$/ry"x:GABH$c bϦ?PV6L<R*ogzwFQdL0yn 4B;;i c$硦%%ݸU;_< 7h&;K2YC !l:b],X/" 0$tl.?6"L[FsֆS1jI滇4`G_LHN Y2e uuu8ps'gIQ?GF$_,o}rB!hmmex<<ih",Y,b1$IBuۇ5kLNGGTj֬YߏeYz뭓M̈́ Ae.RطoCCCL,u@2sq ^-q1GN8FC,>Na}8;>DQe]֯(mIZڷK5/tn_ eۖ9_|]!uw3ZUI<+ngbD`Rևk71拟{ INHKl\[R}##HRa}ȎA2qz|a{p*Ufr}[cWP:gKgdW1A8\LLx a,]=ICW5z{yj~L ԰KJ^`eK2w\vE?^D"1)=AD& |䜱 7odmêU,J,XѣGr\tE̚5 zw^;w.`d2Gltl2-Z֭[I&B%yU>(x*** +5eƌ,\ 7ideLCK.akKᜌqc#ҷPTU&( $l$IE]l,IFƢiс(}8:5S6σ`d,NiYCX`٥"I@opёTEfp?яYb4Mrq2mt<7DKhay2H($+#~#VR\Rc-Tfg蚛J^ [d8k'^ߏeMUôp84 r:b,3swE^m=G苹cT@ g2vtV+xSa;Ǹrvn[eTn0$&9Ye/3xpC$ UzeKd7)sVH8W*B}}=HAd7M" M6ٳ/| nLdAt]GUU*.r}Q>Ν;6mp*-y''ܧLʕ+,xX,Ɨ%N===R@2FI~Ip8*'C?F1*Rpf9T/3jkVZSK& c|>`?% je.?\#:rO34 g˘>J&cdLj:9rsL5BEUG^Z;'[2f˗҅a$Ni(Ⱦ#mゥKPVf%KY4m>={f$CF7=_%q!$[:9@s[/( [8~NC@-6՝[DH~Kd8~xc ˖-a9bcE+. ЯŊ7O=_Ŏ;Xb9?L6ds\w꫋L[ض $!a#e=i|5l~v;'$:6LmM5A㱣t vD|D2PO;0N!BtM('N+񃋪ȼϺT6qQn]IY1l%u zP[[KCCdԪU&;$ z444cq!ZZZ$\.m̚5M6100K/0UUUwcppŋsw()sF" x.K!@fH)0k\-!fɡG( {Y;ST1g<TȀN$l3sOB'@a&ٺg'+xm=tv{AIcI9TK%QH}>#~<"eHbʦ75&í H?Y;.X{u+cUWU}i w($YAlzODPXcZ,٤%sQ "uVb\IbI$a ̚`!KS\az{Y`e2Bm[y;w~~Üh>A ࣳ˖pWR,X߯1v>{H#uMpU56`2*\AS0ښJiNeI%$Cwr P ťerhx&%d)PdM}k`u#\pZ~޷E,ʽta⎕X\^ɖk(YCƕi&"r%#L +jF;vNi'SIћ|_ d ZUQ_:`p\CyI"yzr9/^L0ĶI!3/~혦O<霔"0|򖷠:MMMa =t&49Ș) 8R˖@`(Ŗ%d  pb,Y_A.59VbA2.\ٳx@d$7zikf/0l NY,(ZLt4Ottg>Ʃ!=MWV"TjM t>O4:EJXp!SKPI2!d \A_?ub KT9Cy%BRVSN^]qɝp' ϭ|SQb#}]U vaLz{ ѤE:#6:BOoLV_y}~Y[/-H PV= ˍl\ǃCV(TpL?SBLV._P/,&: x?P^R̹s( xfXHm¤r? }Q^tRHR8aBidi4 ǒ%K&*&Ea|8ph4r9n&fΜ9#GPRR͛d2\y|"zBzZyQ8ܕpd,kQP!{ eEć{_S%9맘l1AO[g4ۉHL\H*ŐY=%DL\$+12BBm۰O;"SQo8@jv3Sp f dќ^*02 \*+yE)$^sj@̤2i\pR&On~%B &( 0c:ect^P^y m$EahEUܹu֑ˤ>}:KKHl߾i&zfɒ8.Ɔ)02ϪK. }|& l~ 4=ly>jHIu \SmTF$Ҍx82;u7=cXM&gy1ᅬiw` M34orFCg۱8: ̞u_*7Fa6Yol]/$`P:%v5 I FBba pǎ̢q0@S,lH$9VsQ}MDSôET_CߏiY8N,kÇE44M1᷅R)֬YgIa~i&/L&ȇ>!0T\.G{{;!g>mD[C!R@&鐀h&Aӛy:TEEUYF s/@6Kgc#u<~n<][yni'2$ a% '܌4'9F"7Le5G<]XTWU` v/+ ?oZ)OmV1m15':_: *Nk&/Wx-Ir@b\U`!cć9{#ٌ C&3KRVǡ8]F:2dhx Uw3˰/{m1,c47`d8JcTVV!2U5lܸΌUTEp*I8\L*#%t>Ͳ /d̹ U|Mn!)2m{1Nz,NUFWU,/YM@]̞5o dh1H3Hx>+8t/^OA~p=Ĥr/s^>"Rr6x57F63.ұ$/J)h2H"JܴYYEA$Ri\N7f6 f\*&٬Z<5ܫ7Fo)SQȼ4_e$wtbb^qM\@R@ YtRwv-ߞ[Z Eq&-$ReU8+zŻ̚]|O|j.9m5'wP:7u4S[]5\md2LƄϝ;w.\s Y,]׹ qn&W_Mss3?4 Y \wu9Yƕ PȀPKň_sS?>oF<>eEUqjg Ec %,Nv`ptg6 0 h*ojERu4)K XJb$K656+~Qoۃw|vmitFS zƐnvkwlZ rt֤ħM\H?q8$yt[_P&%@,ld2M2k12:I"Rp6Asm #& 24f֜%4,dK3@Z[Al**e˖-4̙;_gxp;̝= $PVZLI*kʙ1s! Ie3 BA<_~+salnD/o(`RٰKvGRSU먬,vv!A&Emh"G4De,:@_^0ʫ odžo+ofL-AD_eOfLqr2]>iw`ϜaOW9Y%T-l!#! 9KAm\ŜVrS24@Y`hDS^~{x OfYv₃+`;]3H$(RUjBdYLd֬YNfG&+g EQXz5W]u466266Ʒ-jkk'_)`HztNl/񛩗E{0ׁ =EВs-6b ]w3 85Ãw KeʒdП%gVT2kl bvq#Btu8rKLG)xHIF:!pN0$f̚Iݔ) K/:4\G;9s:{1 ]s 9I Ys"i&k n?3ӏq͙-dr).B 3bʔJJKz9O=EL{ã8n55v:)). GXJҵ/nMƲ,nb'q#dSc(r>؀,c6 $+ +9kT3ͤTH =(YK`>Mؠ0-Y Fd_A xnH6Ya!MH>YXD0w/a",\_Qz>ḽsa}>}h'աd6a[{')CC2ѴML?A2 7? -A4ED@Hg4Kز1o߶JXhў^z H]],h̚5 C:f_* I^"(.O6cٔqq#3gpNGK[յs6߿֯[OIE۲F+jd@Vz]x]N{{{ulB 5m*Nwr`^J#IaӖi:N(طg/Y&k Ta畵 )-#J07jɦ@|Flab|[mDtP3G}x-Nc?_qStx):kM#4,#RHЪ*>]&(,rRvlF"y mp|fM-SM!l%ʐ4L|>/.Ì$p% WZNE8ȱ an=& =ID qR ػETi(5r)02)!g˶Peu"dyV? ͐ڽy3g'Mcs+HI1~A!OR_]/p]qSQQ8r`?/UoEQ '%x"igq< g wKZ8z{c@ۃ,2ȹ˴-MdQ*F\nd*´,LFUd |c%!\{u{Oow`XERջdI%uΉDZ'NsNڹ{s8qlq'vdE,KլBu QgvY,()(i̞kY{ LlSHcׁ XfڻߋS4|34F ,C FGʯ*׼f\% sQo vfpT( Jx+d3h 0 <-@yx ## d H+Ӛ7\IRA 5H 5ǁ[?l;bp=(#HiS_OGW>wٸe;#9\ Eku۬)ϣo<:7$0+6w?:I_}%_=,XX 6BkO'yxCߏlq,XΝ/rŅR,R C6v` tc=w v{zįwn"٩ UW3-b;ӹ"G`LRJR! LbO+^C,Z%l.]W,Xr{El"z ОƐ=k/+qO5ptv6`ǭ$T*wqvuҋ*Iuu1|l !.7t#[w ’ѣ>^0``*2 r^:p#Ht"AxuC,ۯa@j,3 3!N}KW^uA1q`<+y &$Iկr7טs5x2$h :$KH'902NSS+ 01gxN{_17-4i{1ZZ* LdQGx~ޛȌ om/@j*(zioj$`K dA_|}g=$2hjOʁ} 44rp>*mQUh(eZ!󸎍<}A[) cAP[8|]! %sBPc$ v= 2 6D"HB1-pТ>-]O>_!6 =v iX:▋Ȗ>N2+E|O>E(Gk0y+!P4}έ{;eڠP99 k"L0 ?Hr͙A:Hvz|13=vmÝ+/vjM;NL1:|d-G ƻ9r} O>z0C&Sz:S,$c)_{]5WhI.l|e2LN44i$_,ϞwH<RiM>X ʦKXRJw: ]p9.MruR7_D ehB\aö=p1۹w4zC*RiuǸ暫hofltIoկ}l IDATV@}N. W9!)#OO]e*!ސ/{sKsM7fjtK"< HM vIZXDrq/7 M.U ˂ŽE\#OD{E$`lHc2TP,Hע6|c.wywpwR%DDNW`PùZ^j%"@~ix(@"1;nFW_՗'aO2Y2g)۶oZRxaNF3:ă?{/Wv0h1ׅ־[B) P)H3iu0*$ɡC5' J+۷q>@PDH M3}t+\dUWnd}Aa(ym ش/l+VmvZ:i#Jc4E[4WT(<fOLH&ihi);6Jɩ,r(VmG}]Br<.K5cM&W^u=Aerkܓkjj8'T:<3NmI7o<CŒ|<?ݻޮvyLr|OR1Ϸw!?w't{#u]4=5_ woK.ƺ/hF@Z)L[w0pB1M6r =5>@>Ū5'([w2zS^!6tp؄a̺_w Oq~?4%^FBT\0hbJP9w^?--h,dL@ iaP<,% (A( .H ZɡR0 슍<0xJa!K )Z&-4Foolݼ'lZ.S*H%!nj2'IH RUP88{'!J{]H4#Lg&? lkVRuEF`xh%\JDT|GMPuX21뷈5$ABbT@h[ ;~?]kڱ |DS#|9vx+ى er41[׌/b%.jZ^j#FBБG8J$=`ԣt&߁(,2p<nk׮q eň)ccsWKDS8|Ics;—O P{2KS|_ _Yw_"#-Ԋa&m"0 7 [ ; 1Lin[iZX,Zt1%ZĆmLHfC/>o~#" KQ3ud®˱NPono{7V.j\v!XU *0`1@As(WFJ@ FcNPt@ )p%04E.g3214NGc+MY(E.N[{+Hp 1üJCדۊjJdMldaYd [q^F,i@p{g-k# [) E %%3}}^&؎/;Dl s0H5^gyYf˿ LNIhvh`Ub**c^7_ʗ׋\,o44V,F"b=@>0_S%Bqz[n{?XƓt=zx̸"rrki3egD%n#o~bSܵce8Zн6%^LfB! eͭ+DƋX4:϶c'D5cӾ) NlR;Hvvֽ;Xu12##4uurӭM7ꋯd &Rh0 4! $CK)C(0C%@1p/J{/g^r\4B hD4AH4o.Oۅ @y :i!pxB[Q#UE"ݍ7v"M"@hnf=޻ժK2jɇpL[ǎgpZ:I35ˡhiiy=uؔT*"A!_qlG14Wu% Rqf;w?l0C{hDb6VHclڴWd钥X4-$Bt] {= <)߽&Λ?cc4ԧ[ GD1E.\a*UT-PJP*p]eR0%8 u0Nah,!h:dz_w* aP Ģ%|/(L.`9!^b.`ECmb t]P# 5R# 5N@H8J:!D(J$%3}X(#nshf[bLAc]`(]0!͟% oߍ_289t IoWmlھ민|47St\F1 =c.ZޞC`D$e>r^ aʛuMFpf(K(gRKsUF2AڕKI4427 ќFbz{v0L*˱|VZ{!X|dUGq_)Yg~K\L]-DJsNT_3xZ 6& E]O,[ HD S8lf (u^7-mQ?DPÌMt2 9|thNۊ!C<$_݂jw `i0@ Leg u1#}47`zg)){BHROn1<=Bz)g󔴠=z{y'=:J*]DI8#ij'TingՊQ@c7"iT]!!}<CNrVP1=#߸/> : }Ʈhhi!pvz,iyh06]-1&&P*q5po~k/ i(V`B6!PZIsJ6sy~NzlNDk1bjBg:UH)@9~`WAمdCt<ŊK8$(%Zy2An{yZ&ݭMsaxguS ixTڋfg=Bn~DG?s~3)OjF@j1%*¯a)78*H$jh>gO^M? "Hkٹs?-<`f4޼t wq hf>4_aBhA22U`2W! >ri-Bl{i/CYVKIF8 d2w"U  3=5Sk>?{jXv# o'_Qq+BASxXTSV CYC稖H-_]|>B?~SSV=G-Xnc`E4j䣆3`rӤBQ5ӺvH 5gc&C#:jl [UpFhok`~OG3[qWrlxojdtdUVS(:v| }b=ӹ?O8~B bF$\I,"0!ÏgpQ|4Nǣ3[uiDyػ{vA?HG_%{uJ2sלMy>B8}θKՖrgLW] =m4Y"e Xt xveǖl8|Tw]qI%YՍ.%ֆ9hT]:iX,YVGG~##inDJӔBS9ʦ`:{T3rez_=twg2B< OhJַ[qu[).zxRG²,\=DPϊNZNT#fǜg;r::KόܿrLcNؿbXY@Ќm(h iij^; #Fvfy CVF@jjx/Jk\c4}A[nPy'ʢoHL♝hj頳lt*($]=T %B [G=#qnNB)Á8]m|wg8jYyURI\-UוKREݭ^KW2'8|e0DɀMdcpo\0M__4#t[%W3/aQǧCQV_<:Lqi?fB0\JWuؾs+HEp$L $_( +M aZERAiD>g@zM$6h)J(PȚy \'\rf dmER;-5p@P#7aW{PKE#,\Z:*dP-J$fHaQ*W` dc/hc]/CC~v:an`0]R06r +u^=*a^Be7E`d=]/}Glq\Ƞ[owS[b"q5tϠp]g3RW$Z s[!s?j3;ǖ!J UCSJ^iq"g3 SJEb;.--|wu> FL"!ܷa+eӣL'cO6=K/GϾHtx@ ݭU#T)l\P1 VKEL ]+Cz{Ci*uyC5p՗Җ3)S#w0$XV|5 H 5;i^.U!YxoIH(:[ZO7 ( ,])c.ULg[+}lڴ|/P8s?!MyQ֬~hMզ.YjhLG8yEߒU/b3p?hhiV03-ugugk9\s_l8N<^D&>w?D2޹_|m۟'`-*M2#$%T%!lҌ+'縤3%B$yHCCR*L"d&Lv؎" G(4uq IDAT=gR[x3c,h`ֶ׹u.]@{ۮfA{ y&2%lebYA'"e=Q8'(?[( IF#x~2EXMwQ`6IS i ,u\`~|JkZ%3P }AID O <-PH-Is.Ǜ̐U3ٕDS Ɗ/GlǍg7WiiPV!3H5YDSKD7X<%cSH2 CrBvuvFJTh{ϭ -LEsJd"Re,gyi]ILqpADjU \4.xq{j5"xYz7SJ!̠@ AB`aV;QˀPù@ˀm7* ޶6رc'z";vmgɲLo}F'Qv͊T,G=!3 !>^.Ny`0V^@}K+pD8D`iHFfejѿ]Plf^{ JjF@)F\M2LS sn}ϭ ѣCBQ{8oRvǻo}ͭ-ڱ~F 11ɧ.| exZ! c `hҚj-[s#$1:^[iWxj6U¬1_vyU}N#CsٔN/)zDHE.'ӄm۷I_o?c45L0MFFFilm%0ICy"#džqe)/ rdsBC,%Sq42*SD@UH-pDݻvs{n'MyC bn~A& l~1{tu Lx{zP# 5_A@j%X5PÛcxxR X`!qeo[$Yb9&Fi_w>q [cO?s_/tyKK/_'ٳg7#H5RceJ2\X48l_q> |_+.5py <_oEg2HO M(%li*DVpKMfZ{~}2ffM3Nq+9/q{D׳_-Rה>"'V}Ql4f:2J) i 4q=ôԌϊC.Zc' Rq!%!@3f) z -N1p]M.ǎM26rLWW'BOĉDJ%<#QD$MАn&I!Oh4NCs(s9twd+䦙dXz5Ѩ3O?Ɋe&ژfZdx^"_d$ g/öm['y jiș_ ,-W=DIg>Z+}{& b+0䡇smzJ-_ M>飏>飏>ya}jmo䔟 A3|Egw==wEV_7\qم9,]2ƶvЍ[>F}>L c ߇>=w=w̭.ݿ{1ׯ>I+C&+{~dXI>UpSέDcE)Ie8DO.F4eX)lNupz={(V˸~@qt 7$]sLS%#ԻXs۝_G9r|/Fv9xQ/R96= f}% v'Icƒ%Fx[gVge-t:ٍIRc N4- KljbCQ*]>LeF'0TdR9Hc8-ph;FzΩ*ű_as@ʅIim|c"yd# suWl57  32aqtG?' 8tD#8g.ӹ:}ޙ`*H W:$\'W/] 7\O0T_͡Goǿrynr츋3+t@&8kZߋ/9:=GX(nehtxY|Cj J)8:'gV(CjteaPdfVR1WJk_~; &ݾJv`Goͮ h&6w)JtZ]fNXL)<e̵CI5eY!'v(dO)߫'Ґf)c*~V 83<>uǏo͈cǏS,Hq_eLLE(<4M!bf)0$\8"PV:HYb%1elٴCЎc)fd]6sQJ12:ʶ_\ftJʥץZ^M J{cdSIf>{:|&iuM^{ַ?ɡǑez Yh,f&CV| tg3`%|w۷xbjDKHAd;,]1/*AZa2TZ#hC~UVSoTk>C J) zx*q="ę%(&3$Ƥ +W^#d,v裏> H} O扒/eWpw2+~oc TW3Nϲsv,tVYi#LMM1AqR:-| I/Z[>¥\.|zmǡi6dYFN4FaaP \.Kq\V$q1?ر |?`~jyU+6r: E)v+X*MzXc;:Q{/300r/ȱLM~8$1wugcfvuQ% |p1* ) O:E:M2OpC,i9kaEHR؞I*d}Gkn8a0Ձ##R)ё1B\*C$dqªkYr <%efv YtLRA裏g} H}/4 MgxZO+dq1yLͲb Z}~r2Z.R:,_6B܈^$ XZ6K,h]HX,nPsςɇ_>}NAI$:@;o~l/~Gs.h bY<4MDJI%ۑe10 QJEQnͫB\]$aibnQ7uPҥۍBMDxKF #L'O㡝21f0Q7w@=x!q CY!kaCFYLQZtιCv}8mRTe(Yt'4$qBPtҊ`nLf(` N+]o12RctlZaSU(KUB)a/QQw=zLwȻIRdzt~k@x/B>" @5?3,iB%B^q \|.Is=[;~ѪϺUٱdLM^ĝ$-ܳNko5~ M\%KB'?(bOI# I=p-3_$dqzh;R6o<ɣVY!ZM$Ijڐ$ abqZ9.Z8"\P4m>i16)%/7d: m,?.agr(}{Yb {ǢrPÞx]r %2ju)CXv=rn!+W25=Ó*'&cIurRݘJD/r3\YoXkP pEݘO_rj˖S(WC\%FG{aPT>SzR*|@&35u+ٰ~6HGGMBjkc4Q'h1;% ! ÷}_}Yl9M09q=DFaҘb322+aP6<«^:]@r.d'd'3O z9Orޱ\)ɇNH |$﹟NҤnЍ:8Jq]fgp?%WkDNZ!BBi'r',β<BDb"֤I !I q<,&˰Rq9jۤY8*BLs]2P*1h\G`Mr| m R:hjaO4<+"$RJ$BR᪀5+73:e=oBI;E!T GXv+jkNi%>(+V-!@A?+|5Cd>wq)|:_R>RfjRr\qܰJV8B HX։ږͦ/WpvJ}G}G}{ν4mzW[O4{rA^0q{"pGtBA(u|wZVX㇎P8\r%|w`"j=9p JGys=ڻ#[BE%H3ȓOhr1{y O>ZkjebazѨٱc;&pޖ*q"BZZbh ŗ_D٤\ QR𮝸.~qls㸸H@X170444IfQϪQ -YΎM_*[RTbxXdѸR`LF3ݷ(%//EJȒO@" }z}#  Oi q\E#@yI q.R "ky lkccDQq|;w󳯻Ox :F(WorNIXD&axAHyni8ANWJYP,iZqLPGz B! NY$8+%hB.F\'$":Mb$dДeqdޕjST FG(ΰrj_&76x2 IDAT2 RGF^Hk})XFIB|mgggi6x Y(Rpn>ٛw-ȻgSJ.C?G~~e]&A)2m4C8̶&brrss3LOOrq{I׾Zkg?wotg!J)5vؼq S;~/wX]I4R)|Gi(ȲNWE `fvzRy0?'GV}x/$\B،Xd!srݐ,xg䒡\+ٶ7ܝʋ8k;=D#U|λvp-Fi4\R+Ym< D陎`|LjZ&y:iuљXW{ф7.,˓߱* 4 ahp(p$. v 8# |4P*`34Td($M4Y$@tF+|+R#Cx% QTH 8ROEcqT&G)k2<4Ɔ[ 3d%0n; 7pbش"F!3sd&fnM_2m,)!nXbxxL[q2Kv>]^3?zjr'?f< fjD@ CiӍg9vd[ֳᬋxކp+M5?'>^k@xdvQ*d/Zީf'$b8 9Q-QG \G %82(Id|O'J-h5K<8gY~7:xt/Xd .y.\5F٠n,uA4VJ-6i,dPz#lStn_,:G-u4"vЙf>gjq!DXrB 5J%jfY72y! Kp qQ,<I!a)t4f ,ZNZQDTQo')1HSEN<:& ĦX,)IN(=:&Nc@$(/#VHnDI8iQ l2:4)DG6N}18(UZ~6c)#l9 6R^_AM2|.| fh5PyvO$-I)py(7``G$TkU ڕkiDTd#msk'_{ KO~ѱ!~[(sKRgf8I3)I,?UKYbp|B' }' }qI\ $X(4jeW$ox[ɴDI0k,::K)ౝ;9s&B\h*e>l Yt :Pc,]E)5s sB8>;9ygYi ]rJW ł$g]pP[ںBf?RL|$HȲvv}Jqϻ7m_)|^v;wƱh4EJ/wJS*g֚$NHSX#J|AJI^ZKi9 .F"e@Pɨ}7yw%Kحz6MI /jH0qo_! 4I186 K])C\A$Xj7oϳv*^s58rM^{hP98";d)q}=߽ U?X4_G?~u$#7Ro^.|ۃ.dt[m @JIB 5x+Õ$)֮/vTgr^SouJ P*P,j q2vn>֯I`Y$(I4 $!IքA.NJ.䣨q+R$ILV@]˗nPO۩sϰr^Y!M, CjCdsJ8*_BiYv;K1xR $bdxbb#'ؼy#{b\uլXql>w=ׯ#4uR$mN4mDm~h7㛸歿E6HhB'gBEyyؤs`\eBq#w}cM;v!1\p' ?XA"3:r,48^7>@[淿/Jx\y;Ju.y ׾A882wʴ^n3|Do7@{tbȠ=qX,ȥ$xh6xկD!|f[I5EjljL|J "UhgY6eՊu,]G},mz86>B!5mTs(4=ʕ2U8CAES(hY-HHGRB8xNL r*uw+r49tl|.<ƤBD-F >WE6K| C#WV} H}pH빌yKJ&dJ }%|hLʮIȍ|6#X?.81vL!{J Um_`VvwW]2|[~%({-k;gkN褘 ';bѕ*M3Z&J7\?u3i: Lb#cf^kXt9c1[J4Ul&Xf+W]97nn2O?gwwAouy;ibmty> zJkFD RCISKZܞ]p&,1==CGG ູ8n%,_Jԍq\z 'xDŵ{fkw)? ZOX~죏>~2 WI+󳥮H4-2UĈn.oB JEQ-7}=H.۸W_[Oph qԩ+"q\ZRX#?'0:schtbƒU\JxLpYBe:O?d)Q8:9E! m71A,/j6a.q[der.I3C!(P 9)Rv-v:k/)*UڭA2=3ƭgo~ λje0hncE #C^t''Yp:m6?…ʕ˘zk7n'_q5_[$ - }]0P\pe,8 }Ǐ`=waazBY!t:TR[H+ Yt%yG DTosWW|E_cZa J)/[M_;CGZ>t t-o _|'K6_@EjEbpˆΓE)uߑ7e4j9v< CQzOa&J2rV:POqR8kq?㡔Zq`<"8\%hm(v0b!4rq%ɺk(H aSUȬnvXtZS*i[hc5xtr9 Iݸ'# ! _U,~q9%sĀ?DRcCw Lh7ذrJe}.SRxx~be`:`l\AaVlsrFQ]>^k@gD K#$Ҁ[֚M E%/>=hh/%KF$mW z5 |Usk>6r3fy_#?կ}9XcNN-H3' 'rT5e ^P Z9~əÌ/gzj,,VZjv?6Q )ĜtSD9E {=ſ/.ab{ bBR.{ iEqAL8.Rr tfH%zfAd%wъ#3m5^'2" B|ߣui8_lI1'u@& v܄Lw0:`ɒUdC=T!D/{+%T*a/G1<83V9 _Il \ZVl {`$ }G}3:<5ZfE) BYD-띴ˁ/Y+/]ɪmyxΞ\HA% L.I&R"R"K<5 '~BIt&@*ԆG(.6"=sO^đFį៑ZTp\ '=CMD}aO%\*:?蜐nh5ncOS KH+) Dۦ3o(?'HPX(iaʍblXf\X5*tbqRʥVn֡Riz(V*$,˓@[C\@Ƥa i$:X-ma``&I:.R fy6mıcR*'6.\tn{-N[օCiy=x7 %Gv>L$݅NCS2w'2z]FADJIT!KR `4i/PJh)nER B\qb?A!jQ3WMm[IIRFh;}UV83޿W$'ursB _β ksxկaSv ``&R՗󢳯TYF)#I>BG' ?`oh>KBd2mw>6IS?Ɖ4Nu|+_AezϿFk]'ytmn,JJ "3xn@%ISf{.$t2زG?αTA8;i4Kr}G%RLj G=aDQD"4IYFDQD$JE* 0<6LX@(ATlblظe˗9r$'˩\ sq}c vKFdc{Xn]vZm11gNDIliCJ6n>GuםS((j339} _u58裏>飏>~`zvi҉ E6l{peUo/YP8Dmݟ~{܏DHt4"/%PIE艉OEC.JGa˖-#8XJ 1l" b'ΞȻ8q}THms\r;E,k{+%H҄T8 fffPJQVҌ(JHr3F#wt:=<>I-snn@ 6)Zk) DI,Bj \קJJݨC%^7>ömۈw?qk㚓|KZbV˲شi%q<@-`bbSppOXB0PaaAcս)n} h}D ݯWӟˮ-M݇ZO:DdtlɞE6;~hПXa[6Z87Eg_@Xa(8AoQ",22ms{w Cwσܵ1S4 yN+ IDATUWP(BE6} ǎ,esXj1in*̢(1yy]L>jP2wu$A,B-(Nr Y?<5?>x'hl8$q&J(}$ܞ.Dd8a(A@ZT04Zw[;w>LO΢S.WqBP^r>x6OB>NC:_>Dv!ruy޿܀:,[=/_]7}_0U(/2g|A#H8v c/( (S4iW3Ӈ9{zJ΀H0M-ȜHS Bf[&|Q`ڟCk|?D".-OLJ2ϫtksDcm9g -$"H$sŌ ]C#ӌ8ռMk,!"#J͖iGTS?x3g~&]*uaJh):3h7Jo%_z}( K{l)h66u3#BlnsNKX䱡CT- ;_4g|ӟ95E}tN< /q/Dze1ٹs"gY?VuȁVh)=x/}Gئ mMhX7=5U`E!AYo${FfAG~=돇 s-;ϬOM]fkVˣ#Di2٪~T$#|4ibSpxr},\eN񣈠p|*Q**jE$IFn $&8SddH8V(i5ǰ, Om\L aH#KN|HqU;q&N7$a Bh - äPc@.bHIjAqsm-I3a/ijΝ#к|:| 2K|xΞfU$ىbliגGyQx~ַR(~.\IO"4됊vXͲ8x_gh^!%)) |wm oR,[fw)am (%)T~Ў%iM@h_t(5B(a&bQۮ8t'$.p/^ON8A U+V2?|vb/}Oqo >'gs|kWpI#M Cc\Orԉ/!Y~Sd4 c.POvE?/ycl[n0-3WH !~ PyF~vաgC, 8IB!i"Xb4&eFqS@1W$$BI*K57K&qIb0LÑ#U$$qRЩAoO7#C  ,04aAZ& "Z T$*R܏FH)Tj-ئiX4[쵞c=b6$N0A.1aR7N@T&QDaq9"u6xVb(ϝ?1ˠbV-pY>ȄsKg' h)&v%+NpKNǴ;3upNE%Rw|#eΝ[wYBB s >pY/!ɑI@D{Jo6$B6mڔYI'I,1Mn?p'aj 1kW%cqML H֜lܰ#VP:K9Nggu7) OMXѷ͏MO1ӈغi6vblz~lϿ(27ՠj;>7)O=y-TUN8%2x(9xEr>^\4q,B;&N<|F4 iZAxMV`[6ibZq~ff-p%Qh4h4$I:Y N`, 5eQ,VRQBY E-A-ce6GGG099VAheRWI)LLi!R.(%wO~R۶I.x AsEڗW7Cؙ j,4M߻w;|B|/;^ںkfY&BI/./`XO~&V}fblt?q&8SSS##XmQ,&e%1i>Bg@7b&QRKdfItvvPkdD# B0,lA*t \% ry,iSJ"'sݚ  KP(B"MbƦ( T*Rp+Q98:%'(/ꥶh1]yXŒ|kw⨅ؾcfj>O|A#:;i r=zGOW÷x'D=T:qA?uY[>=Ν{Xl1\%x-XϛLNs'%{aHTc]E{nB@?mϒ9;+lxc~):ՔJ%l*'Ҥh ݻv?DJrQIeO) H7Z3Br$Fi( (ĶiPBbö %LDEiFJy4ejz ibYKaV IS5_)2MbH'>Af4 .89Sx̶DB[KH2xvD鳴L`=;-:!P*e]yY<qeQaۙUeYhmHLeIǩUL-0LL"mxmp oFc=7~'i. ߿RwB֬:@0X} Gޛ8Wm^ar>9s-"jI֋}e1P ٠A5K!Dp#o{R a LBh `R-%\ۢP0-MRk G1Mc8*ldRyץ11#H Jiy LKC*F3s&WaX&~c@ -/q Q4,TS0#A)b)mFJ[ʑA+ZB,Hk1 r( :mPpyKƳašˊ,P19! @ΎS t%BHIBu?JfRKL $ZJ2$B IK<.=8si |7󲗞Y{4_LNLU0%JR/P)~1iwZiaR%!gd|[&m8hMڍ\G16ǐ9N Naj b|Ns]\;0^"Q>k٫-1^w^PǷFGgե}&aqAz_.b``zcL6[6f|{|ߧj 뮿]WKsM,n8Møeb`8E"oaA8 ;}R,^Oof>FFJ#MAGYDIb-/EEJ>BCИm݌O'(Ȓ+UFaIhib+O5(6BAn5ƶ-YIαÀA$Qp *GQDV'Ia`YZdtd)L " #J\$}~񋖗EQ"#%)ed@dbq-4ZL ɂ#iB|o>_&J~x}i>2J#Y7׳fi'+u{l#W5[)V,_{m[͛{o"FG,v 7tj8Di! &~O>krhO HWW퐄[r@E08a؎$KGW\ޤR$!X1ǮcђnNuLx~{p\A֑DZS+.3: $!,yIl6BbfIrpm.(+P ke8yJ)8ϐF!\o k4!U| 2-i6~hhwLuߧRyѯz)VDar]hF1ٰr9wNyv>ח{|'ZlOIEeNRk?||G9m2,N`zL#ו,x#c#T 1x'zD}rdcb|ws2'?7nB=ObT&ѯ兵+B~n,I! %&Qi5Ū^$?ήhBzG>N3Ck ct֪7k/{.Iem& m/5ͦ?l4:ɚq/q}wA_w)Nw߄ӳwgSì9*Ͽ~qw19>71UNX/!?8WZv{pq>/w]֮[āqrVǬN4L ]Ev=r+Oape͗a2?R1m !iy/JÐUuBH(577ϓ,d6sB:tH)IUB I:kl[A'Me౼ vub!8ص{'7cN}y,\rZv^Ӫ{VXpFzѱ;\\e|tVZMs Q} ԣ'|Ӹ%sE^'.Qh6l 0I"4fpmiζa ɻͫPd6MFb!2zRh|?"0Љ 4JkyrV;[ N $add@=WG"$MDR?;F] t5YMRY E$%ͪ]=I~^%Z+DaH3kgSI I49f VXkgm& mƯB@` Acy۹??j ţOP,Yh {S[0N2XqЁG*}S#L-w`q/IR$u[ 5urOLG쥔`IcFXNEԸm,ZM{Smrļ|R6.duar3{ rv"o=̙o:7^p^E>uJ!G^%e291Na 4-ʕN<%`hP$bL@ $qaX²r$$$i3Idn]i!RVeI&NºYEC|2o U0W&B $D<{-? IDAT\k7iyq{Xz35 DJT&h )%Zǀ ~z֭[KoDKFm-FW XzzbA XBOe>AĖGaR$Q`a+ST 8HgWG?z5q7Qgɲ-ᔓerv=ƥ?o1<x^B[ O1t E/w5#[')( p'=y2 <\kʳd"GH$#0$4HiQ UTJj0flF%|'QUX:F$(eQQZ6&$[Đ]m& R) i7|/LHIJ 4&I"l$M DZ ?DmF@/rzۋiyA@XEZhZG( gI]ZiJٜLIVYo259M&DADDqsdӛQA_/I`RUQ44Ő! vL u41̔iy Jyr8|!X \eGDҍKD㚊[%iְiIQ*IJeUI)bT* [~y:,sRrE@gG3< SNnwX={量w 6w߹kI4i9-f ZQfͬ<$4'r acbdSN\ ' ޿ⴓNGE1{oXt_NK%RS5zJx ǫNIrX[r7_,)d"]kI@O' K>w0۶\.G* ä63nr̾}-N8Jj߯# Z-mx2@cv.\ S15=1e]8N.J2W,e^8"Iݝ4ҀNF&90ˎḩa̦Mr'bpOTu]l͐/Inj^qX ˴IPHSR((JE a&ICQ6%qϻ1&54j0nb:%:i! BLӤ\.g.aZ$crND)0\2yx_>v }{d$qVLMOmf5|+3_'?!t0szyKIҘfC񼐱 VZ͞=QLoOVC<3x@+΅d SϞ; q*r?!( b:[h6# ' ,AH8 EצWs? שSO; r4nh6###\z|3 lˢʟk[>ׯk6m1䋗]ÞO{\r%刺}p x //X|=UF~ԣlS7<54i$jmh~Ž?cEłslSVrϽ?att.~x&*k(m~z9gA{0!Rs$[?,9=涗:!s 2 ӄX5ITBj:FufEr'Am^N?]۶3q(A =bff( l޲b=[xJW zW>#g=)CC:r4 n}c˖\ߥȒGe^^{~7ǰ,Z8&/2"/`lztWY!l7_vcUC 3 iL`ir1jSHIU# f@#X.1Z -p, ]ј) LOϐsl A⣵VuX(h ̂I4hb !\~r /;_?k# Ugzlko/*6mؘM_VY8ji6g#¤w99ΊGbp5aH @jT*HZhQiYJ ۶W94J:!iX2M_E> IcYcY0mٲ)\|,]V !AYϒmZmFbϾ=\_rlotX1ڀ"gΝiap{.:?|R!v+ . ,j#}KguY*uey Y oj',BC*󵫞@DB)|RksچW Gߦ{N_}l)$I0 uT+x /xVˁFD/#>+>Ugpb G>|7%IS͈#8U=k(?yR k(N'add;A0r6"32kTgزSDQL>W@SOy J ihʕR]}rzLӗ\2R 9҂ny.=7tJK rEg>Iq,|c$JqEC@H=2O\`r?ǟ2y˟~6v 4yzs;Ȣrw羚oZ̪5˱dcSG %Go0r/ l 8e1>9%TZ).`SZB+ uʋHg߮?6@b!L)#Gtl61lAl\#hLML0J6i#Fj6[h64[3( MMG. tu p7Hݝ 8Xx~G{erj !Lƨ{#;آ} iØbrbeDq/'X'R&8v}TˬJ fOq]>LP!4dՋ^['oHߊD_{8i "qRpā#aH By"3a+Fm sگrp&Ŷ]Z5ʷb>O\~㎻gٲeZ-$K6 e˖&Ǝx⇗gFMttÆ.dڍ$qe_xKoIg yS{Zvx+M;X(f[O_e,tp*xdEرb*ذ|1ʽ|"DI;6XԧM(XtX'3͏ñ'e#9cٰzJiy`*8{gU#qǜIıs(]G' mRy!\DJjQ)]a)EҊv(HӘbDLNOPt4[8r$IeXҡX-4(J4`lr ? tuB 85șDj0AXEcVh]yVLʳgvHbr t Z3McHM.GA$;^.DtB H℞~ `llRBVVQ(1,?֤BSfCk#HI:jmpm;v3Uchd7Mkљc$MMɃD> jzNWO7}IO SS8WmV1zp';nñyyochn YRKR4rXTZ_Z$J>x?]]]KtlXv08U b$atüsf)moFm+\'8E8aNz̡U|_Ǝ> o<-sdc^ʳٴI6mzW(0,.~i?#S<<HafƌZ&l<}g%LNNO0T\q)Y%'5߹Q/b̿~{|覷Gp7۶b? X{䑬'aґRo kQa[%z%TplKrv,} dqb?[>8{+SlyWqIS46"Dkx>mm=Xv.NC&J ,ÀTcZ֟+W|]Ï9Q @H΁LuD؎umf+^!"M#y۱')nA-Nytw3xHT `)A!ͦG) q%mCTȹ&I.oc IG*( Mc(4LSb MP4h54k5 S3Qa9JF$ OR$ ڀ q< [~ S+`6jJB5 7)upn \#ތ>5PϭB++^cغy/NMXȕm3ws ittT) l f.O(Vr h'pvpuGfYC"J-fc*纲r9o (tcSRiT)bȕe編v );vW(_<ޮ>k^kgINBBBS""XTcWjE}jZ}mU ($a&@I tr=urk[3}QV\!L-O?@sj=+c$?'4?{&>n1^u'@ܹC|yal0؏i]wa f?o3AN8%'gFNk̇?׼Xl'/J8M+5|[3+X 2oh\Gb?Bg-{wEOne~3QZioT8UsBz!\yx|'PM$5gPW<6A¿;gjVyS |Z6VN2|W(%ɲ8.Zfkt&ŒpVo@jF둉ʰ0`]}&>wѹ_߿ .#;\1 &&:g|Yr%SN;u߭5^c.Gv ,];.]Rl`ty|{mĬ`8ijؽm+>9~iYl)y|w#(2lbU ตzUxr7v0vJ#rCj*KjL :a”Plj*H)qgF?F յXFaL'L':Dz#PJ"svض24b.ycCC$I!-9^RDeTUzuUuxr(>PҦiܹstz<öm\$10p<1!Fnq0ny.at@6$4D!ch`q 'b2^DZ:.a/!BXk!Oc.X&AJ HӔ, Uy&evJ 4nS*59tA\+YKu۟9= 4%A#]4#A)@,RBlwI EE:HlGb:d4BwGbrmA9/Xsf/Ll !q5Gr c+$4h 7])H0 ŋsu1 9&ZeYL3F9= \s ]OqnwV j}O@^n726>+_n?|.xXrz5T*Ʒ{c;b;Nȣoh8;nncON04ޯ{Yl-ַ]{I<UVsBd7GZi{Db OPYNfM2cNrGłvN|+G IDATs䪥~̠7 E\;1oFcp%e~l &? :NXql߱Mܽf6CٵsOܾO;xO;; FF撦E]9zqgyyJAP+nFk 2P |$A)r o5RJ|041 ydvPeo#I4H(18Ԡm@ f+j1$IQ!Gh$Zt˱1nxS$6Q<4M(($O² \T+@4)drr0["`6f`)0HA)8XEף^60IftZ](e``\tcP %4fǎ1zebJ1pA%(C`h´Gu._&LؖGh26I1(o=[h9?ퟘ?)Ll|Ah2/JHA;f(P=^X- YFuN8a2)1ɉҔ$IKp]w@s$\.cE"M$7?׾5~a&''̫^}ccc,omI}Nj¼袋>FGGG%[Y.<8yr'x"7n 5^^<+I*uO93m/MT xլ^s;Z!LMME1E)f?/"l! CrY8+Hӄ4i6I҈+TA1MsY}0 ,_fs0p}ziJ0==iض:XKg-,V iJT6Jh,&9if)m=8ZP8aILVCh0QLfhierZȽ&]#JaD+_0#хK $HqMu-J1 `XXq0=m,]nw{9B6LEG9,\[7Am 4(-׃4,_r$k03¡dLnb(c۷11i2o _p e(Y斞}-(泖 K}Y3ɉrhbM*Je[SN}{ 4Bh ǵBhq{~u?g/c͚5iW\A+!NR\ۦR.oXc+{~K]v; _#c}ا@_z/W.8<Zu]LNN~z8z;?Oȵ` g L3컘Wx靬^-]ʭW\e]OǞF{/ ~+EaC a1m*/˪Q a UqShpȋeLgg\OwckyݛᗓH$Kpxu|stJa*m`GY6L5{MSJchA|# -f&8u j\۠S7hsiN v䒏nvp-ki|>t&Jx.77x]3.j,w"8J;̝;Lb%x;$22-3ot3'ԲdNs;\o<?:4M3zD{nLAireo]ILP&@͘h! { FTK"dEa~IGXkG8SJA=*5|}%[~W\__K<& > FK.Qaڍ(}ky+X\Me.v<ʖ˦M8:TZ̆;1 ǜd"ɉEƵ|zq\~_ NL%^i]˲0 Ngz#Dk׮ezz sٜ&MSic8\EK5qRYu(3Ԕ+%&''@idy珐g`jz/vnl0!QF8UdI7 qfI^yIl$qҴz-B'rr|Bhh=QG~oųi,@QEM[U&vvm kp[qy>x(/!E;}T3tR}/i0t>7;e,riQ[?a'ͅ /=SYIٰ~;^~1Gϛ|O?ƒagyQB* {n'8{GWRqDQ3ÿsݝt%w<3A4 cR V ۶RhQTbiZz2}:6WwP.F= (bnAJA\f aθkYVgX%s6* ۶,a.CA(lcvZFk$jEJm "4OmrzNgLLQ$JC,G:'#!_д^BKZi 2)JDq̊+غu^% #J@JQiJ}WZy1sbZJZk5RsӱZa>`-E+3i(f̓\- isnP:v'meRªN$R/폔bƘ~~VR-ͣVOfãPVmpo'IR\EfRhp]C>kq裏Eᙬ:|1yӛٰ l?2ZP TΖ-[fUPj:ö @ huBLMMjgu|_~7{3Xj%IݾQooKKrV tH[k w~lY}/ i\rvl|GYp1*D>K֟|GwCOKͩ1Ny؞f|b'yj:SmN9ϋ?KecV<qt 'Ƿ}#d3JVy!1L` =a)R@Z!4@?Kj7˶,K-%sIR(0 ,#eaY($^0aEJ\8ze8C%J(Y7w6ɓBK9C QV#&&f|e ֮‹FA<)Iuc:UzQ,M K^R<ύ'\h+|n#OxѠ4 ;0^AG? s^a5l{0l6gJ%]wW9 c/\#v]}GA֚O>?aK=1):JVL;h0z?Sr <~*HcfCN1.MSxkgOs1+eW3Ađ'Ǚd]H͒hƏјoR'8cH3/nH-Z0(bԘ$-zvnZ 5dYc0#q&ΝKa{zR'8N0m(#c< <#S(-(!p@ ؎AQcphϷ6hN7$+\ 3lՀLT2Ll&&@\v,„b8 y3wxQ)y UB7UHЍzh-1 MĽi# 'Bܠ4\eh\Eb`>V s|1 \0T$t#TjNؖM;y裏>%slzrV.8<.bLӤQt3*toܱV \4~mJji>sW\;Nn.qý8Wq 7h޶L6m\sk,^g@EeZ!L 9o\nm|eXm9Zv?@.kHUY{eŊC5rGUlO,7g"R)<ۧi.7e9IRn)%sm> R8mq,&Jcn51=y#s0%*ƲnL\" C5zq/I*\`0<dJ%X8w?⤃kO}VKXBho,& } Wټu'Y24542ٚcqb0ʓ9m300@V}6an @63X.,L:Yҋz2% C&LONќ^Q*繅7=2 C4)8 ۸m;F+h4 I0.g^tg=ltm"DF0rMڋ1 pe`9R LWQ[H4m%)tC'z=#Ag23r[ϡѨ& ##3@Q*jUrİD1`%4=ɶHz r p.^4&JBq~#/(DxyA+MbѢyi4e:,>1g; }۩/_Kcdd.sPC=i+L,Kf8o`jral>|Uka{;w0P7׿\/E!O1AiQqg!y &%HD 4Tjsn!?[A0{nV6خ JU#:$4 YR$(H: A/le1BXeK:g+cLĶ"31Is\,Gj`u@KMԪ5!p]TD^8.XJShw(Thvd8ٴm^o+r Z{3G(WX$cdni6 .# ja SR.Uٽ}ȩkDaD'4w5] )M\4YVtH\qoJz$/=Ț1VX1s΋Y}͏gw^l?{O̔v]p {[Ts,sٶ{K2Pkpc{x% o4&;#K$LNL099E4Sm-ڟ?TʥŰ>' غy=O38T<Λ>ȶ*/#2*~s%.~"ⶻ7rJN9N}тƢL7P0ؽיJFۋ8bxih IDAT"u=p.]–-9#fs<9x9SlݲV?䙀^*l"WiQėNFHMjm?/۝(w{Lɫҳ*k_7JIYm)E/ySJnl4,qcقT\)#B+5Aؽ{l0X.iۅJ}%k#yKer$ znCadd,H҄`()sCQı^L\eEt:?=I,˚=BjZ1h$I%Y&eӚq,,L0JFotӭ2Op]JJGmDqH$R̙Y'ɤFJh)HӜj8NcѮf1+W ,9l!@ GkD0P(,A c!yknmb3qb.abX^\MʱLDzQ(%Rvyh ?}+5Q&& B Kӭq,RF IԂC,lڭ6i0zX[IPj#RQ#W!i!:ئ65Z&a)u]a@8٣d "FZ g%h87`&I.N01´R)`7LŲC$lvz):Ɉ4NiZA7IN54Y 7$jwiT!+t^h$ mɘ0uߣ\18oL~]LacKcMtC0F߼ET*=0d*Ǵ VrKz9St'=,Cqs rm!+~eK%\ ,C 5R(&Z*``h100gY^FdYN1`׎݈S_} a1! n94N?  *N6oXKk${ww",J`8h ;2}G[fEɕ\7? rG_沯9=ǿ ʹ翅3N~,?)%O>$j*~`;.JBS3|A!ǹo~qI%{n?Y=͛6x9?<#~4 r_%s.Ve}8Sg۾-b!zac,LS~Wʋx!%,oGnR*fx 繄av0+U$IsƨZTF/T:N4MjضR *ű=r0z]^ KبXIK0 !INO.#0@J53TLNM``0k((W+IЙ`8&a7PF!hB\tgl@ ZjnN)>X\pi 㔡Ji⸃S+%) 1qØ8fؖEnfAu̮do~7Dy5l<\YH"c *b{HMs%]RB$FGGG V^E_cYNfjvr)Q:.qknnW@1x}q7 a} W#T)& =O ,<qލy~ QdމwWQ.WohG~aXglj'ŋ'dnqѯ7C8sua(Ë{?¥U%~NB! BGVb_C&{$\ضRR$(Ugd8[( ȳ Ӳ IOm͛ˏ!#Ugdht;Rl۾ɩh3u}]NJϺlv*ǟxrAu,.۶mn??0i5N?t(&#:4p~Oi܄_ }/H~KO=IjFV !e@2_ Vـn014#.长ǮG/7\ςQ䤀,WkQڤ&FX6xu81K&EETJ 0TuBڽ.Z( *6/T̴f2m%t:=JkCئM^& ]jQ0=Iےhb6v#\ץ:\ja%Kn(,W ׆X'= ]o[:7ɿz2ӌI05N4=i6Қkn(-Np>$&XE%5Z^Q$f. #O2¾f aB֬?ի^ƚ*,-Z$s&S>wN|7r P588h ?z1C?[>SNeCX^3Z0 C < \/Ay^xObq#S 4]?̷fHb/FOxSh)`RZ}n 4͢Iid%1@0 (ZTӲXyF>h2L,ω}lǥ\b96s(aE!iwBS*8W*1?;%Y14TE Y{cyaXH6F0 R)_| ա SuQ?Cǝ& I1R )aٲe-@n"i>q:j(r&i q?vm81 B0Y#DkIqq-,|a֪4JcJL…/4o9S×Q[VaÚ|~GF=mH.V0?<*'5#lƍiwi hC%fJ2|Ӣ@B匮bT>  ^F\ 0J)a=ub\vx{cOb# >m6n[C+,rl\;O=;mF߰~0ŢӞ Kp΋6oDRohThXr3N{|p˭?\ary!_X~=qO3Cr \r{عq>Oppe) %^q=of׮]uu]n/X >\!B(\#qOAc(E?]]ngƨ ՅKx+L!x1M 6Bxu5y^& |<5T>~ Yz=$iﻘaXdYZDEζ,4-0@><%cl&c4)Q$iN2l!I{ "nM6s`msIӒTkU\cvML MR©9t"RDie}-JGDR8HC34TKÐ5 Q(~Ia)]Vq4z얈F UPOZ4,n߯Pyc9ĐãQmixDq!%0:z!,___Y247 /.\?wnn@k|;]v^uSj۶q?\s B(Oq^|oy+}+r׮Fk/ ` 5Cd*'ͳAk\+ BT3k \c\it|!hEgu=HӘQJB|Lq٢!m$IRZ"0Mj *B 0Bb6PQz<#W"Ѽj100 8.8%W`}\@SMP$FFJ ~?$iS*H+]RL&^:f&z˲m4n.0MsR*!vr<%M6a8Y)풥9*AtZ݀nֺT\Ei)nɢ\I$b|mŊkÈvEo 2)JbJr z6i`ž8%MNiEW%/̑ oR >[F)>Wc.e0wpʹ 6n~ MFؖC$gyxy^ᕣ`"$MS!hԆ}i"MzN@,˰m˴h8zd@3q<s=:4Npl<˘\ MK̷x4i, qIlk8a4QE)Kfq^j:au]fj5R%UFGrJL@#$KS@c9e2ƔA m )jv~O4(A+vMVǵRt.^GiEjUc#Ho/f|/)U<2%¶ sm)M٤TQB* ۲X9]\ϥu;hh oijJ%fc lt ~F 8.%bg.֭=- Y2X{zC!xJP%j* %6h(a1i6nۿIԍ\JV"ŖzZp>x%, Ax|8pO>vq>zp͵cl޼뮻9^ir9dzzA+Ba:z&z0aq]ʗq?#Zܗewlذ6oތRIqJڹO0 z,cot: K<ơ$Ґ+I@KAe!#*XҢIpm-&Ok$$SenJS\vHU,tH{9]B犽{=܊hqZo3=jnFFpʂ J=DaKT*:4IceC},a2Ԩ1qKE^'V B,8& bFky_Aӌ0=8< R1s&6-*kNe˙Ƕǘo{zp4M5K_) K YaJU.LcxQ~ uHӌ[e8\8Ö-$*KRױU|lK/J3/=8cctz|ӟZǬ3.&Ϣ~ޗA 5hL ԰4BKFw|{{y瑇n7-E'z_lʻnvw] C.a߯=uvV|_²L;8r6/yqo,!it1_xv=p{pZ+r M3rE G.ʄ5 Y6ؾJ#͟~+Z Dl1C|X,חxZ:[pmN"'P1+ Eb뺸ʓⰅl$Z81-TjOf#?A'<<ףy`שj6:ˑ<+9+C̥lE[7^0M#2igxd^'T3 +ZMe0Ҩ\1=snEVa|EaN:~*ꣳ8MUNm3{%gqn/11XؠCc##J<[z0|K_կ~5B>>?cɲdi@T W_}5W\q?œv"MU'^Q,CW_*<*2Yƍ_n jxoB}kH)1McN$,m˲z .3=Bo@;Wj86*O|n]rx?3^s\>t#"VH#'c6zRDǃEݦVJ40ՄaH/k$ak85V0@ IJMXN.tfjCU(F P"#!wOL>^p߾؆5ʖiA^mPFQI庋_)Qr:.Í5ߥ6\/o.zr$I^'2l|J!O2"MsTgF+hb Q?r lizE Qu+OSDcWg㦣rb ߻n|)Yu:Ai !FC 7xGA?4mסsEZett={C/edd!qTqeڔa$)23ԸIԇFV.PTC}O—34]<ObEg**/iaHQ&dYTlS YnEA8K9_xrΝxz> LLLi-_46mp- )߼n.RXퟜaoR ۑcfffnB`؎@7&LCs,___'ڽhK2\S|`7mYw>{(I/<#Ɏ=6Wbq\[ٲ4K"\RdO,GH!QP (DxQ<팏S~ЫxAB{>?At-4:4 ~pc(+Eԋp]m!r+\oRʪkA:h!t:؎@I8q@jqC# "baAخ-,ڭyΖ&9ģa ~`X}ʕ2'3A@5݌.d*eJ>ibF&4i7 NNVIQ.W2a&%J u22:Z)ա!Z-$aͺ t :4e#XG'jqZX?{D`.*OaG+ i" wJ Y<.۶)8CؖUҔ8͹y|p6 Uh5RõL.Z(*ͅTS)A L f| SHBk 0:1B9QcY.N6ȲɃ,[<+CC 8Q*^,m (6{>Q$MK6yc1DfͅyFFh@뷉<ˈ H8T ab8S>y&h?_V?= +z>Sw`l'@ٽ8VשPL=pAO;뚔e(iH-aHբ>s(-T*(GcZ>01lIP.W0#GVp !Y,u'◾T_-v>@/c/r䑛ٳg7ZOڵp0448W]Q>hN9֮;0K.a|W'f۱'rgW?a _^~ky/欳c>E]WUWس\kIyS*BBdZE)-TcْnP,zXh6}l;R$qݻuBciwxh5SD!CrԋE2Ҙ$wMuK|An}%c˥d _՜a $iD5Ji&&&صwnط{mnjz{-`BjZcZn 5wy'~<ϋ R|[a߾}ر~~S>'̟~C_%_~9Ž^sI'/~v|;7޸4K8,&,s u>809˞{g6x衇8S%giYqM7-|8nò,nrp2Гkp pŠɐII)q[Cn]Li ieQ)i>qcZ#rRrdYFP:'E0 2s,0sI:Wt=,)@ڒ4˰܄[BnOVeDMJ£^K5%[bMxq~ײknN>tX?q$׍qmܳ/—m[63yXms҉'#R zzoq_<0ypVM4B2mzʩϗlN<N= *a3Σs$<۶m5{3̑gzt!SL1;m,#Z*A8ա\]4{s|7h$mzFfsKK5`GIbMZ#} ^YUxVm 9jca'm$\# ~'zx 6.I4\ф,e(7]L'Y {щMKRV70y N!G_Hm#ujn% ׫K _4ġ߰j՗9di@$+_ ,᧯|@~HӔqߍ&_rCg%\~J%?|&gq"+V硇cúM,0 PRwyeo#@HJVm5ر_z)[mln7?+^JjQRZ-Z4ƻȟ]U3eG߁eBZǶ}Cq:PAkiJ+R)|h7Hvxlp3SO}/HZ|-44{>uqf4<;@C?\ZhwY MBBZilRRTQ"J b C`#&N䰐9J V-8Xa?$R Cy6&>JgOct#y:%.:W9ȓ{?䓷r7n樣R}qu+iM+~ lX{պ`c{J|rt:#cd 3aHZ%U}&R$P,EF|vKѠT:4m~cR.)JLM}Wt0K&[~/;&a~#Rۡ12L/~zTq1gw.xuk7kϽ9l>X QNY6sǝ7lbv 䉽tJk! IDATN;LZ%hr*a;}RXI Ga6R+zAmUpđ˩ B7pM1==|}@'Rrz/ ;+ךt'W6I@ ٯu&B&LMOdHgI!@Uf˪Ajn3/xvʋ G$ I U2==JQ }8RTDF~*LMgjratN*2n!|TU%J53%+RJt]'AJe "a* i Q9sYЋxi$IByIDT{>]]]l߽¼ 8q̡aO嘦MrIkCfE(H_b6A P4 EQaXz9yarFQt(! C2 I't]' Q58 SJãVͷA DbqNM]x &-9<Ğ b;5,]ƞݻ(MNQhIacc%ryAƨJRvaJ%҆WOS.BF )Oɵdm[n1O ,A TUTݞi쑱tKXbIrw :j#9Fsq.QPkLb)kر /\py/` 9Z9˸x̔z…GTN<>x_|?m4_Ţ`lذ;9M$i`7U+?=$Ikf\Et]cמ}[o .P(bŊ`WbG?1?,"ꫯ:ks;Oݿկ~~s>uikkerQHb5dEҷq~H3ȺYTU%#4-)ߚi*$U%mj8f x6Go =|\) owH(JmK#LS/WJ.Q|N[K':R!XSw-ЌI)EP D!I|8@lna,pD/M1- UUqLݭcz!E(J Og[;O\=|tq"}}81MpšS&<&ȵt!RM$ LUdJ(A\%W Nbb_",D#b4K%JTDQHNX 0]U]R,SWE3X]8aA",\O﹉ѳhtmm6cšB{no1+T~L&p]G!S ˴[u084aiV[1U,;7,QwYeКPm&(&(9TjNwO/ݻNv BN4)z.tMBTԜ2N6 Q(Q4MC"Q'):c#LN)ڋ{n];c(g}ϾS>u[x쩛[yz/ miTS.@alh56( eKKcW,5|R8FgYB"B䕉ՄDtv!,?TZa S`D"\jMĘAPpi%4ZYB|Ob$@4*J'yFeaaCXձ4a \)BN\%IUx$R|?&^!(W#"O|o~׾\(ڶ ̓KᓟWps~ꩧLLH,|)^7^C4Kk$>s5yZٴi׹g3iC&cqć>!P.Q|{?kkc2i29UaŜzک%FcnVJ i>2dsY(B? NbtM#QTIiYM1RG*Ih]lzJavB&1SwrV_%TXhBLZVN95"m21uBpw(~#~ ~c׮L`hh2m(E!Ru(Ftqɦ T ҏ&B$V2xuZZ215qeqcp}3IƌU(Jf.$fvDs._LՍDo^MTO# #P 4U mɤØζV2FcهW}Fmo;: SS׾VrρYg77۟tIl޼eskhK^xaoƕW6˵h,g|,Ê}\vpyo/eCwƍgL=%n}x[~]֭[ڵa޼(ZBݽё!E?LwH4BV,=~Ff4([GGW]u'.S_' /, {aǍ踩(sD4\EC-h5OMNsA~= [=xtu<4׿ov.:drĉɏn֜]%0옧6=qkSdY'O:F c Co\VU,:fWk@?ϾB@_ \zC >>8Tԧ{f>x駳}=瞃#=3ski`@#+̀[[ɕun7rwoEQ΍IdǺSֱzj6{]~L\DJŋY@eiDn`phiB!KTTb10Xd ͛i~8'N|gG>WWxi\pۚ qrsC"!qɉ ʕ ;og$ T+Y'thdA Egzĵh6Kd Xʀ$qHqØ r*gaPPf4JSFDز,* eQV) xۨXH?$ hx^@fƇX,b&a a(]ɤj5|'S [`i:b{,Zk֯;7q\'3˾;h( T+3>яpYG<#HbU{50䴓^e]_;ˆL6P!! Y0l6(QM5TMJBtCaQUIAC\\,2st/<EZ΂GDL{]0}3 zxd  1tFI62-m +ZTI~4mPro/< tu{_g dpؘXl=(t{yhƕW^˹k1 ͛7jժ 6ַ}ݳ`ַnF3==>+m SO=ERmm_N:cg'X|K.S筗}^@&SV1m/ϻz\!.{˛ZJ\IXt{/-^P㱧e~HLNӷhR W*H<{];FkMFTlʥk=wbX9(PUDV(ĎKL!S48u<Iy~=j4d^ƞ^a U=o|vAĐHJaHQU4[D#rCzL"IL.P`h`Uǟ(% SC4K!vNE-D$j(MA׻ή,n}5k֡Yx!);T*aT3.FPMϢlIdtD.Q"2;(D&!Tfl; PTZZi.txgD6\ܓ ɤ$1զ(ڂa|aCD~9y?QpkѴI<0sm{6#r,(\_z4MgY'prKcϝOX ?yw+Χ"qL.:^z)\r ,-T116=[Xh!SEN\:z,eނ%^:=}lں3_5ُYv-۶m.9 o{#''&^^LO8S`"*&22T u}JST:'@FˤX9$g\!(/1TØe˗q{>I OVEUQa BL&P={@50-i`(x]WIZ(GSF)L" ܀ @4&K+*'>SbYyOY|_>f 8%K(WqHVeltB\!ɢK908[LCK|FQb!N(.길dR&j~~4RO0s61;6mFW_}5W]u<o|9S1Ԁq9o} }+_[s,mUgK5Z-\}դ-ҭ8ƍysdU|_Lo*]w)' V$ jT+5\S{0Z@_oW{4uMXcБ3OF8x;8G6'CB'Ib(!ͰdQ/+sq'piםÙgcqLUS^TnC`Ɍ# ~yTf6Q5 0TAiAq8q5 fB4]'Ւ Dq`&"p|MW0t_[97ٍmHp Qy_>=K #dzbt_e$zB:+y_蚎SS=dvǢ務l>ӣXFk!8WVںډbMR u B*'\V-S. #ur1I笡qezLT'V%`NXIRb nAS*Jb[&q`㣘!B?I6\ "J9 wV$ӓh@&i8梩*Lf~M%DcϾ;_mN;Pl\}ǑsM&t!!GMFl~;I1gv=CL#c>gBvHI6A?Oxazq200@$6H*mo!],^r4aI\dzz!VO'r6q,"c(-QHb@CCR p<UqL(JP8!_36>N2lNa D$"t]ǜ)ǚ5% $DI"| 5?0Ou H [CU5j:E Oٍ ?ט`tt;ZGo87XwUڅ* V#/-(¢el04t;rڙ/FjTЋIg3wuk.jSdreHZ[t!Iy:}$}P `nm =V' #t3"4>B!eV,cdlL:)dri&ټu3e.Qk:~S1-ELMMb&ٖ,HgRQI6*$ɧD^PCʈ|gRtt)$*)+CD#ju3*S# QsRދwc[:>F=N2N/ṁ2{͉,!!Ffry2d,)$B"2Hr&^ *pڜWz yOa{NOOdp),cTw7Oӿ kͼ-o'dll/۶fe?/9M4 +/,__s/7}O|_ xp266Eww7mmml޼64]YkoIqK5/#`ykƇ?= -DSUp9L竔eCײ%Mo-|R:Zj~Ǘ58Qt:Cai DFc3"bM3ݐ5M QxHb =>S&ʀJiYaH qj5,ۚ 8&N>RYbbA60S&Ġ*_# CvlxDaD|;x :Z՟&]6n~|?R~l٣>)x՘TFG$橎jBlQ066F˞ݣXV)Mh ߪ&x~fl%ؖIGg7'V\ӑmbiw\|!??Nmd! - tm0&m(߯VbX~ƇLjZR6Q4 YX!ZF&4u*Մt*8]LLM`,RZFR.>H(UZZӴU ߤ{aT-FM:U$cZfD9ruئfTFX1V>@!%Q$/*v$P,%g-FH9vEN(x ](э9+GW{5$Ŧa8P(UQ3$YJ* 8On -[`vtfpHkz`'p;p+*LLLRĝw?>Kln5 |'xe`dt/yRiX4)((d3*a/!Qm۶qWm۶**foa`G&m9!1mҶ}sM&~}! t Uh<|(JTJ{!S6;3~OISU?q#&# s}AuRmfѕ y>șg 4/Pq$Z^s Ð(pU8QPȤҘiyaECMR,mmXM}JT.}?FW5Rv TIC= l駫+K&aU&Hi طkyYT-@j,a,B l/{Bš)eP)s*tp!YˤR뎧U82k jH\ ;TN+}JYgN}Iݥ:XŠx҉9A*W-3ZNy),ƫxhϨ?N+WǫDnBqDZc~$HF&)](DupM֗G[Y,bRL.--S9O0^ ՅjepE^y)fTSE X6:SM2&׽1l*X)b)HPfF.I ^6B4y8D\ B0 [6nDo %!A@$nXDQ͝Ƒr7|3]wW_}5<\!lbWCÓO<ģIy>՚3K.nOQ5RpL(V{.SGPj:aۿ3H6%g<@4avj (j,">n᭼e3{ѻ i8͛FY=;!&&́},>y= /2<97MTU-sbRY]S KeLQ'I뺎K[{[~ZAE(/1===nòl,$!#У5J[B/ǭ\`Zpi<)F:F5 Qbd$)K2) =J)_RDmD,XݻwI;p%]1ngxpS7twu151ARgu$H̴FH?ᮟ Wq .D(UbH$dŒUl|9ϒjIp-*DRvq)$S$Iۺ%0F&1iҕf])JcDGMz. mf;2PXOdE&R{izw m[P$qQQr<3 Vz2-D|;OV*SsN}aY,!SXҩ,]eI薅e躆QCw&+ug@׿;Җl>OT34q n=j?eTH=($IO~'HMJiN ?_(lA4͟A,]]$ƅh˲@ Z[3ĉP|z;bL>4&'U0 Pg~cV\I\/::Ve#Bq.OǮ{͊+9nI._72TB%1!K/Ž\MD.E!x쩻1tÐ&Q*džHd6:AKvA0 g4bu||t*mڍnCaxضIeDALw԰s_&r'" ڋI8LB~[$МOIvM /aYO/mGmJ !C4M4˯^TvrͿ'*_p#K, p6x-[4`Bq; Nq׿7k|sɚ5 xgio椵'a6irI'$ _r߽o`rv ~⽟d6&~H K( ArihBx2,=ZQ4|C ?t8utC#( f %T-b_q8`rN=>4砫uy))dY It]'|ia@Eaa H:AAvƊC8gRis``־Wr,xO"#ZVdsyl#K!F4Iͫ.6I -\),cST= SJ%0T=*CKQ ֶjxͅcgc*ixx'hh̥oG4j:+(t2$RsIgE  EϠN^wS)R0jIi*SSQ1QDT"#QMTz)*ut:)t,]E8PJRڻ TkSdBd2L$C\ߧR31u\?F!Ac&f#Aːt6[nd|08Z$:;gITFAQ Uq%o:."2lz-qѰ=1]}=A++H҂"|2JaY4 2ٻ?<ҹ NPeɪd3L&EWB.OHyjĩ&fao? *V=.o)nXF5,$!= y(&N@5ٶ>w7̦- $$s~w((B,q"D@╉яS{.rynE(R5z}xgURr=ѝ4ߜN?shu뚿+O=;v`߾ dLNN8B4mv% ѻp)+VS&DXK%DQn\QIzy^8 b: ضA{g7Ql֙u4*aōn*b<ԉ6E78qW֛a0y;"N# ClaBX)@4Abt*P5J$Sx^8븤aQmFr9jSWk_}+Fnc̓%;2n޼{JUZJ%yl`1cOG0D4 0 &i"Li8`0M# YT{խ[ٿyJ6 ύs[7U)sj긓çjScEھ <L@H ^$Vʴ- 0a&20%4+MkmPtYZ4q譯@h(QoPSTO0D,/_H%ڍ1,4,qϝo知2XL,rh%qF* ~ι˗9xA\#Ns C )nHi&1)u<|;%wU*5fc>G|=gBpQY[[{q瑦B Wv%nx4ͭߐ|Xůh4ԧ>ŗe>/}ir't@&`n2#~|$ׯ-GCر(!"}wdޝ,_BFƴKfxR9av&Y2D6_g_%ߐ|ܘֹ(= G#r"MH.Ǝ;E .z¥6UrLF ۳8R)&:mv,.ȒrB޶p-9B$QpAPrA}jQ"RQL4TaKsYQ P:ȫY:^*4I:B:KKwslTM\!~Rx!ZR1az|#K8u '0==MFlvgw?<|| 9yxGןWýur~I{>O3?3 vI\~J29d } &U/,/7W!cע^A}IA4E/1;[qMڝ s4m($F9"/>N"Wa(fccPItJ_o *,0L 񭓏-QDZ,{ki3I !+Xh4ZPkXAEŸo49K66t\,Ȳ v)vY]ms3Ll5\3lwZ(4ZH"\ R.̠D9g* ۵Xi- Sb&I_l7wtV/!sIaX^b( [L{fIJ\g3 JE!gS=(AJdbЍHcM˴gmP>My)S\倉֛3JS DqLg(ٱoyaXT״ٶ˗3j0K=LKc۠ZaJ,[qyTH#ǐI k/ӘJ4Daõ0\6a9y1V᚛k03$w0UGFV !77#qOk@"Ǹnn{E ܹsU IDAT/Mv(nؼcW+fQ :;)n<9z(;w"bBI`>ڀ?R˷KPa$)0q20{\9$܋0h5Q (M%k\]Y+,"ͦ[7-^uӯQ2.^\n8H)=ܩVL5(QqQ2]d\]LӘ,OZg\cQ0tNrp}"g_$:o֘=S۳dqir0졽+MZ b;߷J)6",JDQo@cΥSWQ9jiƌ&ع *͍6ʐa@cnӲQ)K QX%3OTLpJ.LfXth-rgY>Ϝ|{nWB] 'P&+2 ctI+wi]pK&L6,pפ<#6PD\#Szx4rRCaaocW F%R gHs(A}IPeԪ>Vhх@cWQ܈}Lyh=% ^SeT°ۤ(R,Ab>?(|u].gyuΝ;yg)J;^sߎyum>Jb2p *KK|ȑ#|I!F;wvy~:gΜҥKAD«; 2|ϸv9·ikԫeb:K>Gn9H8qAϡ.Y:͵+h7ױ6kMmc;QHdģa{KyuvCπE©3'9{#CJ&c Q`y0M06Ȃ9XuxmؖivA% h^~},.a3#3{(3l\L}Gy'-輠\`f~wVkR85Zn=tL\%\#J"r ˶c\:ЂfIcajsaK29n ?p)TA5h *%-<"W"¥ XDPT M4$81={Zm3;=Omnha/喽\t,G#rr|m ێGGl" 2M8)r c84< iJ`L$4]<ǴL*UҶ& Fͫ L'E Ǫ2=A48^x|Ϝ~Xqo9>E6Oqt{߷QIBFi 2o</ô$*piyG $I>7M~w=ڵk_˯9fuu]\K-q P; ]WW~ػw8-k ǨT*;wfi6޽G"8! 2|gRsKEwMհ-,1%?Am(aisʹvNC( FQH ! 875t۶h9$׭r;ٽV.^>K/a&(ƁIqLZEHAe|0eidi/Й (4ه7c:[vN{Q2mK{k+\>"B ,I2<)j^XCZ3hU08֘hi9i. $G7X:@پc7VJâ\.aSب\,d#kmvۅ4AӐ HС+ebs~4 :m!Q*k.Y<:MnIt1LKmYNÒd* 2n<+plJJQdz- C% I`Y֘\>M!g#`YRZm(J J5L}Vׯa:mwdu(s,;QiQXX`r"n M7~;V\Aa~~__%cvO?ͯگSrvnI)1 &g/Ca]\u]$yݸv|( ~i:Ǐg8 /p$ᥗ^ĉ8qY}Y~gvr'dB@&`B>Ф:_".^GiMRZXJe2N?ql7Z (13G;@DVaPM~P d]$9ž!11vJ^mNw 䕷B椹I)jӂG"AɝCEaSpHZE iHLC'Ҭ2M<K[ XV0Q0m,&9NHZ ?i򵇿~8Szafoa4TSw ןAG E"Fu !0]hIiG1" }Z&n L2RҞR)WQE?+p|(JbȔ$k”3RX%H_bH015e"jSnOkdT^{,c&Y;$\VF)$jDG`IoLLc;EyeVW1Ǚ  &UכA $r|Q\$}<)%q&iEQPשq8E(6ZN@wҌ P*ǔN~aH45261iI> 28z+뗐` a`6EQBP]l2LΈR qRp00 <&ǧHs$#2\ٷoO}QX|dضp@4ci:y1-Qb%*E3]OoT*H/Hi Ӵ0iID ^;n˝8KFB}'nFůT)50>ou?/7R *FCn D' !MAEDGͳ;,-mccm^h4@!4e)4y#M-! bB?ޱȟn9j/V ?/^dzzqsE7h}sر0ؿ?_Wh,--qqx^VWWi6Z QLfh"v0Փw'1 ^멠Xx9 8{9|0ju NMI eTkUlB#6Mz0g1^^Et=7㏓Jf9tR#,-mTR"KrAaަ5̿|#Ub\׉m_`ueJe71Rr](HI(ZcYcv)ˤYa$yzVRDPQ*`>Ks/}QvKWx%[Wy`vvv\QYWL7(U}}^8^rE(!zY__ųM $RjrH(;TSaBma'@ڰ)` D1JҌFCt$)%Du$\ }:Z'%gBG9P0;3k"MPrpӧo.ԧ^OPwq=U {n# Cazz{] &w` ^& s>q׏|r64%ìxxaYäT.#R$bܱ^Ze߿oaaq\Q*YB+LӥH!@ MFm$NߝiI S!se KiT /SK!21ͱ\+H(!IRL@ؕ뺤qN Lv,L hK/DC,.,e$% GX9P d?lU.&;Ç?R^;3 G8|0d|',//3)yNeZ-8fnnyΞ=ˏȏr!L"x≛ʄ'NKL0VR*,Iz # ULӥ(壄F9-5N±q}m]ǿM KK #$Gen28E+2UPT*4Mdn,1WO9sIdmyؒMkZY6EPq=`D M3 r* A)Qˡo{9r+Wlڃ(%$ca+ vg4yID󮇾GXvN4Caڂ([bzp87RT@ȄJhI%pLClx .^5 8!J($1S* ;9zjyV4ϨVf8F!RJqlu$Fΐt- 0W"K!M dLJb <+ JC:W7ȓ?f!W)Rx)cSv7qn k_333c1шpeYJ%IPT0 9|C͟{d } &x15AiUaHT^6gbp4V0,*9&y(e' #4fvm4qrt} is>&\ci^Be K}β\(ﲴm+5Q! M9v[BaaQ *mEEr,Z6BM")*\8ۦ\y8iG)>lsenmr4˙XYY&M\gvfiz;|2W)B"]ma,_ʨa6aڳ$ Q(쿝>]c YЁ[`Q ؘaXaDZ`XZ 4[\ hwZ$iF!%B ~"SBضGQL5# @Pxq ^>ϐeiRT<!O>$ x"~Z, Ep8[oe ~xl &d &&"BF1 AHvQixJWj7y~Oعk;ISO©t=^:sy ^x͎B` CQ$h㓜*/0 P*xYu: iI692ܹsa0PE4͝CJȊaG(Nx{!>fr"rn=v+{s\VQ݉i8 O>2_Ep]{jC=;p8$/g.]xG$Z- رcM`B@&`$ǛRbZln3Ʋrre+MsgqS -_tMڣ&ZKň$a/q_'720D^HeD'ZCd9SffnD h.cM3=<P1# )9wYW"fHm`(bra{ ٲs};wON/}oFD  De,ɮrreH(1M&a }Aat6$0B*$J:)zI 4W`Ѝ fXYXgաXT۠Rb QDh+~ α z}nmpsy( sCMF!+:!!ӝ&'wp9jDG%|accl"1qrr~ *2AH Vqw4HD }npqiHug{*) L@)B#BwDb`&SS?|<-FsYn̟G]K&_򗙙o}+Ba&GevvJBE2=,ˢT*122>O|z  1$ C 1ě H)1M˴H!-׶P,LSu|ꓟ@km(r.cc%I0s8+BEgQȗXmw4.~4ET92:xE`r֊RHrXB'`X\eüڋ2 4jlmz>RR-cU>JqԒ{vmAH8l.I3t qK>F@ش F>[ǴM*9 ,vH&6p7bwcY{]*&ZXXXHS 04͈ﷄe/T*o^؍LL<܎]l۳鹝,7JUqP vg>t]N<*RJNZHPRZO}cu cXbH@b75 D!M 0l"/7( 8o|3NÇ1=aHKll."N`:x"(ITGh1'QJ͒H7`e ;wR.tQBR`ƖIqL467cmm\#IS("g:)hw:DΟ' xv(DQ kACcL8ƲA%[\7υҒ"q7I"7JFq!|^{8v\|[auw|!b!"!7'c+uYh!1ItlI^sm^{~bzz4a9TJu{1? O>6Ff8y"IUL{5ǎ;  YۉPUS4!I|ߣRny'Vc'(aR,l6xMĘҠc###a UVrIlk qp[ٿA$Rqca{vp|u:m4auy;D(bmy&0Rյu4qh?K\viJ0BhNKP%  <&l+G43]aTBh H[Kj&q̠@ aIX#A(q˦0\EGicUb3@)#c#;-8 ISMci *XB6B| ` )"8ŲLrJ8V]4 6ŒD)FvT1mE(s{(bYyM $u*"?lV &A%KΪ#_㧘ܾ\J H&kˬSn,ay SH{rcII rwn#C$D ʨS !PJJYX"Qv;v |{1>Oq* 1$ C 14Dl}Y _(`XbiyF:k+tZMO/IEK|R˻X*'c^ēЊ"?~Ȗ|DP*I* BEB=?¥Ky#$q$ -~H\4%J[i0MŴ4ȱo!MW.]e4 ;-fw(iXZY&hT%7ZA(V] M'$= :Q#;\|Zu GGƱmU&IUz>^)IQ*Q)WY^NP|&Ʒ2ϓKO%؞Et &A?nDN\1ITԤk]R "q/&k.^;C\a*JTGtMKoMwCɉ:F Xͮpy$0Z]mgۤ{1R4"ze|~;|nò #KڸU@;N@sې)Z[qZ" 61R<~䊰" #@(EIlo9b)AfD i  :#BgW- N[7ǐcllߤZ255޽{ Ð;vO|~bH@b q}hzk/MCRr=1,c Hu`U_чcnP)_H}?8Iܵ0laxD1,V M>8r " O?Z`._4_ع{Ņ&N*6"1II 0%{q>jyA( qSY_[C\ED=$DBh$!Ik1)6Uv Ӱi4 Dq@ky\ o1=7mXtZ*,/,nH“gu8wѠIZo{Ӭmd63k@JyaemX||0!4gBCKخbfb~-HKG.m;!밾v29tTʇxP.즔߅)+%8WyZߩI¶B@ʋ$(2׫Ԙٹ8Ƕ*ݪZJ@JTk6b!b!~" + \\.)R*8<7/nn2hsϲ,nΣRarNϾGȕ4{u"%%5H˴15izr?vel $a'Ĕ.azy! ST$@䩔 aJwciB!,"Fw( Khb\F t[v0 Hm~eX<~KZT'= '2} 9Fx^NC.CIPIePZlP)U(*]kl8f|+7&Cj1a V#$ }z6ˋK#ƱIѫ1 ,X%ꣳ2xI2ή=PZٿqF́dj0pAܡX)WJ!#Wٷ1rŘcx#bUAAaf*& %!ƪ>Q"Mll|7+mw[c.V\U6c9QU^>GHʥ2im\ qr+'f 1%²Qd` adN?G  RxGPP>ě_~#<2pDI ?̩|r$:oc&ZYDI>E0>>ӧqM Pc.a8.\E#5r(뛫]<1 âFXK*"I25)t,d_SiYo]?Tv+/OǸ!V\_Ȟr*{vE2o|Ņ ?wџ/0:XEa:󯑒29 6uǴxؗ)lx 9('ϼN}¹ÒT;XH#Db!BTh-@ KwJMc|j sq9+mK\}VX\Z"ISڷw4>ҍeLOa|f@(E631$ C 1_ʐ 1_i|citBEA I;RPRݎ zS4BȔDD&jp<Ð89(iv)(l~ ?WE |E*m+1}<)G9q<{AE1k70g~;gll"E,IAb6AORMy *URaBn'1 $AF NrΉ7C9qw:Z6H4,A )&~m3G*!C2鉽D"pPJS&G\ݯ rwBMj6($* #&cy &&ܸ~'O 4q=! z2! %FF,--026B(FtrF'sy : 1C2 3.?{C2VH5(kK:L}cOճ31QR-z_ÖŠ2Ki$Cv6i],5lCHxHz=<ٳ\8uj;)K؎4 cM;X}(dR XqĎK S&(!~lzWIDF]IEAHii IDAT# CҸe80:c4L}ApBG!y/0n rq6V)96h؎A-Sg(&9w[t%iZ>nɠlQtP!*2lSpFI9yC`jrrXXV |c,X}۱0,8ryi-ITa l\T$aǴ2V izMKr"qwiz+lrrI|ihnwMض_YHͬ-{>IpA'M q-]&#fxk$R!|4*< _$RRtԪ5m&i(R3\׊99Õ9:IL$bKv))IAHL`a~Ç? r!zl߶ ӴQ*REhS<Pt~NG3`gēO+W9yEfg' M4NXo#Kg _W(kD*VV>A;αq%ץm1i#0"Eiu;Cݲ^sDea}@q w[c~ؠDRV{ 7{>*:~QΞ=R,+Vccc E\ףlbAru~S'Nl}zZe-[6!. CvWK6ݜCLz-6ʠ`$lt6BebSzN^hIs_){ cfHZ0Az4ϼȅ2hoD9uI$|{=4 #8@\F l!ŭ&i˄搦 69KcBHNՏ5mzj Q4T*WOӼ U? l)ﲲr: HsC6Z\8}Q 3f`dxRK8R* 2Iva M b:m@1x{8/z׸t;w'%ڳLOԘrolQ',,SW e/|RW-=(msp2G=4Z7x{>o{|w?'>2 Nt>I)r :_}woYvz ~.^mt-"c$RtuDR {ڨ#,|@hN=(B4s9fgvQL&J4-XW9r0O]\k'Iܙ n02Rk`Z111,k477Hf5rbl,r \8uA s(b!?` 5 xgrɀ);} L RBl ),GBM`Y4VnM NF6#KLMZ `aynBH +\o(0o}NA&u M͈atT 6VrW.ScsزDulׂu{ib6Il ҌHebdԖXr1M{W?_ u,/v$ R/\h6ZH0ZR봚TFj<9n˻tcH$xEE@ lh0MIPfv,ΞU]S{3e$7}nt\eq?uW 2`Q~lvn?R¯g"}[V~#LU 96g?_! njW^ vc*q?9Zܤulq|qOdHӴIc*ˈQBK>Jw8B0FS콂.c6$IH=iL:4>J-jYjHFH#ꕒ%WxWhwZwFT*tQIϳB\D'1" ڿ1O:ns^SrsaIUBQF e%R2HyoVzbKe#C%or- [s rbnnB\[{XeX뜧|OP9\/}رϡ5l}S*ԈZjYA u3cf|J?FY1D0:#ٿ?WZ!Ab>%g.qyի>VǎsAb! r9\q])$I" WZ,FT|AzJ:~I@ɠܸ̠DUfvҴ(WkHa)]5[̌)mZC cTF!IA4eiy۰2O*^:G3^8A!, *D"̔A$Z6&Qcvhc dLT4cStc bz!Ibƍ1^QB/=?t._R}QL8.|m{Ugx?TJ9ϟyl+X^ug/?7Q9FJq™gxٽ{7*nRV)=cg_Ev ׾*c3۱c]hcY򯔯p=qT̔t?\$+ii4$iIA7VKsO1__@Kzm,\d8N-l8łйZR*ٽvV'rewAMM3>=Gγ>K$x_,#M 2llD{| qul۾u\LcLG~y.^</x&N8׮mVpsQfyiX;Rb'"4)mLpW 9 $IX% [Ylyv.iln`;)`$ lBjA$"&UYwD!խzE$㚊! ehN~i}G93m7/?%_9Ah3fŴ :hӐNB f9oU$$*S,R^~=LV|/Cry&0+ېruI4 R̤(0d6a\oyJzSGN*qU_XKNH- (osk8^"4mG^A (W+owqm,-_%J+Rq2 FinZ8;jy)-RK9y8i.^H -Jhv볶YliKdDHHQTj?,mjk9QIԏ)! M[Qg< G@kMZ-/p)BؖI6!b3:‘Gi5TjJp "-u!oCd$qaY6^~6ӲHC d ' 8(%=G6qt+CH J)(v?;#l!IQ!W&L {{Z$b Nȯ?~C<3[8q vbčx}ڿ70t 0x) e>~C s9Z\)cje\% {\npC#9* M:&RH ˋH)4 rB2vX^Y`Ǯ-N# < D+eX>Z4Mm| ʢu&28$J:涣6ãZM2Y\^EKB_jyb>6΁%+MFF7SټyمyF6XX=EIK Ƅ|\[p~5b̕RyrkE, bEl,DTu*;pF&z+᝗ZK %HIlNA8ip#~eΜ>Md}QH=[`ߞJY>Obip,&98 ,BG=Wj<8wubֆg%Eby;=P+/څR Ivuwcුa4$gl)6(f+0kb>;MI=Pb,ֽZv- DREa̼dzL[3/6؃gX11̟^ nߪP}2cF ob =ZPH)V6n,_yh7s4K_; yy^>$Ь }H-Bn(qfB7&YkUW 7" Cl!0& 5y &ʱJYضM@JpvR@* QS# " ~nNۗ",PiWqlK)\C6mbr F74agcwَi^CHA]Gv,V"|VS&eg#MQ ;8 \[d)* q s s ,.,͛i 4Ͽt[F8-isI㊌d\ksk_7a#`b޽yt JqQDAރWǷh4iڠ8atm7o2>4m }^>|Ν;:^?*)σ`!pL`#=@kl(³$+|;Z[b8ɷRS={KO |Db)hHaȻ!:FVٜX/!儤mh#cr Sd?|86xef3+C3oJF<8 :6'*3'xOb?1~OGQ:fe[䷌ҷuV4*ٵ1)#V4NȚH-(|?v,Z'N`afWf1?7O:!"Li%ǰnFΜ9I>׏*Q!vQVҭ ZؒQfÈNIqɤ. |R4"ԫ- V2OиL6$v{V}UR- BL&E+na{}qaLLO& l߷~/e,,ͥ,@x;UZ6|':͇>|gu(=|S&BىeNDoF<%Fk&m#:uI%VBWƨ,tфߚ˓$^FcKkkyhH<Z -ʿa/rb6M;𩷖_all8Zd- 顇~H倎|_Glױit<7lBZ(K˟EK뇾߼8|衍D`RLCZMLX@  %v1ԐNyN/fxlsIVaqT;*|r Ucş:'>qvӛw~04+-2}Y o10<@qpڡҙgiq(|Kf?|b['d`DE %-,p'edy ұ_v:׺B,"|qQqO|q:yTHVfۙ@,#"a14RSMƀmeim>}t6 #N-PНK Ul;@6)'G8O< ,ZP']hbR@ -Ʋ&@),;E+h08MWeH^z=XTD%cg ?c{A0b!1nlrh<0R&9 QwN_o~+84aj-bp|3S^3SC" H-p`"p}_ݴY`HGZN[n;mjjL?0APG0 p,*~G^abssO3T̾=w`~Ʋ$HC#7/J~f=. ,J~{ _6K+ LllnI=mR46ȧTqj AoͺDG`~Eǹp4,'F fȤ )Z*^?Q$\*RuBY&ʸWXYٴe3""IS*4Srm!"E3P,pZH6ST9y#'~W>6K&Li\r~"?bphV51Q۶&^P][F0W#ov Fboi2i>Osibr!DkY!R\9"t'?)?~o~7A>7~A6Mz=CvENZ!LT—03g!8D=CF ibQ-c /q -spωbw.]ucjքALe[j VG9qXB,DWkbO?'$kly<^QCqt|#Ã[,kp8FGK< ҹk.L_ϴEY"F #8Vry陓H`f gR^!fp A_i{x;ߵnPҨ-1?wJXvBՕ 2=Ia0M"T#!gDGY/u)WV\6,lk}%$KF5s=.jzBio!qELX?s1#|x"hrmILDWnC%c@ X!-dj~kqg/I=zma\bJIyꛏ2uqN=WdH=lPmk" C6q:ǶU;Ђ+Ξ bִ3ӂSKi/8v Ol,,QXhiGY;|pY%nSnƱ|vɴ^+Xz6)ʶ-xzw226#.0>:N\g|ѡQe2 F;c02ZTg^xZ}J̾pϝÏxcoVo Gcͱ3002hDu}8c}paX9I5m)H6k#=i(ia&a wǾaz zn\b"tOGʙE)lfTht g1ʙ]) xaT&k,y)g$>A6&0D,KF~)OpīDm( N8([PҩdU3SLp7d H[&Mkf ԃ\kkdak-  @ū<BDyHAW6K3DdlQwm(*ualm;T=pUa$0sO|VRHⱖ66܏={X5-U)Wx\N>oD KMs+)9[ӵ!M2Fc!%7u+ܻ,X?}z\+{4pK|{vg0nath3xcbRfjjt0uW_Cԩy&'R:zV'?o} :v߼2߇H]jcM*bps,Ze*}kX¢Ҏ,TS?jSHE!z ,A&'4Z  m)צQ,)-(`eB(_~1QSԫ5H~ Gd}/q'Jic_'i37Q%~rCN"V&Yqѱw&:ǹSsd % R(%PM*\s4[FFF5 |'\܊+v>vW!²2fmLa) 8&6DC'f,wcTD$A:@v7)Ծ CMV_4|/0{([$hUDya8J/ H/ (:*s&#ݖS񣐕V )uj>;˻jSqԚDD)[c{2D_t>k~>ȶx+Ll9/<\u FL!G0@ݡ\ Qhsu7񵇾%ĩđ[a Ema8XVٔWW&۸) QѬTV\˲C<~uLipB_zDzSԛ23 yWLO(w;'40K&"-oml/!a e+6F1~c}ܰ1 P_X\sx8t&fȥ9|b);9mS(7jX,.H<׸i8 q JDyEaVw:.\'hԚ</iyAS,Z&۟‰\ 1w4 iCcKݳiZYĊ@גF#l0AK94m:N ˶h -h[u"h4Hj&#I'OF,^ط7XOAPBM*׬w굎+:4[5i1^Vx^ hw/E[1Z UW|qOHAB nGb?2 NĴmF]w;`Isaq7p>MudLx{WK __ZdFhlal۶{eHqdمYRr%bu/gnhMaa+,Vȏ&71{7< UmlNeMRiI.SB똥Y O:-qbЗZ!6JEHap(yj 1O4r5y)bKƸB \Af|JX`2-7@dc(5D" b\%Ut=AAm 5Tr Al y y)A'C!?~^a2"0,//cG204`vAmzjm;,ٹt6Fg͆ƶ!·Uճ$.JW)͆Rn>t΢Tq t!Jg)!z6([ -M$Y_BF[euB:Z% c &wˆFsٺuzcx4vi)6lfyiVe) JeqU[G,-^ȉ'2uP$>k 'ȉOD#h),[^gۖK<֮PS7Oׯ5)Z1h|af8dFC?@^ !I)/% 7&d: *)q @aZ5L1zm)a!mX[`4Rj"_ǿMVWc{SPJ+yd?uln1L#Maxd( Y^ZA`qVK$^ B*-'1!B!Ē %J,$PehY^ZXnkRz衇Mu(){ԷPAFR.QFzxO!NyD)5I}chJ3op ?,Wq"m{n`+^HqnNlDF037 |!~ނ}?%hX^Yf7~- 2Q~LFX%VSUHTtT ;gF_<|&_8Ėq@E[.7KWX ,ab2 M, :Q/g~)@tz=XR%OH?)!\u4Jֿ_?Yĭc/i\G9R I@|>s?#/D*s KKq =Fm)1( kAvh#?,^8Iyyᱝ~:W=.=ûm ˲;{LO0+䊵~W$z; =?PգT L̵FkŎbOϰ"ԥ!;Ji6AI~~#_o۱C'Tc4JYhc^܌c9tʱÀQLC0u[XQ C8*diq aۊ9=DK\2uWL#нp̆8m$-(-['`,+$#K hm!Q".i4e׫q@dLc"ՕUB?x#F <7Ksmjv3V_ѬFhBA921_^7}\+YgM7NӏWt(3M,EʆNpͷR').}}%lՏf=c=岬qzӝJ[w=[p_=B{u{!LN(ryK%0Qi7YXahTʯrsYH+NRm%Bx T=冽80}(KҵM!체[q%X\yx_E. ^*6 %mt{oO:ebJ}㷞cpTfw:`;m'9DWIg"m07X' $go,$B6G%9v,w뢞tꡇ",:"PX9_y{C?y>){]M]  w={l׏e՝6VRHбijbn^7x nziӫv{זLײ]/F8>XaenW~~ _]brsss\JzIuDaFtZupv_yk!of{r,C4O޽i >LJ(78 2Ji(@Kzr}8͉SQ13ssv m:Bߣkւfߡwd2Dqw8WA"w FX(#=𮬵qI$/^[&Ne%Y?k𞄣$ 'f9:- >g37];jtw;qW+CǶg/ ıƏ-swd(1;ă]#M㸛 /"% a~Ⱥ.r9p _yr}`0`vfB Ay2?wlfX( ZyxYt٨AW/' R 8yNym*Pv3(lVVq؄ĄHhuLR8"ח[ip] (a#(ȈXK41JE 1 􏲴z SGRi l,ۣZ$]GN5*^CmJB!;H;(!%Tds"tъQZ2rR\mw}~,ka;i(BJZvoplZWeߏVw*ir(Fb޸7S5ؿw??,k32:DPJ^ΦdqaB~f7djfEo!&leN|ضev羚o m˞輇ޥF Xb1sO|EIj`vI~ޓ, t玱6ç5B 7X^a@V3 {_L# Jh31/27 SOŸ}w;#^G&;RJ1$].L/?ɣ/RK? Y' 9N=f [oce̙3gh6[[em[Z^r;زK$,钱5@+Fgq%1Flj%˲wMlNFaxM- Zc;oPY)cG 'i6I0\K@VEĀq+x LBT'Kv3t +T* |]&[ie)1u myđEAl@cK \k+L:%¶ m,Q0Zy>kE[L*֌P;w`O71Fı( #$CFur]div |?G0`b/eSհ,bNG)M.Q^]$0Tzȷ6V6 N`lĎ <38H ͆顇V u1kO? [Ha4;C'eZp# =(fC6ErZfGi-T+od;1•;bsE~c6>p"Wc7-7/)?/"("JyODw0s1;Ƙt4O2F抨-<|>FưG)0U](/.02Tu]M7hnerT%3ӛɦF)wxsƬ H[6&SuV,ʸa?rE,{?셣Vۄ*V:F[Ac[gg:gq,a(Hs\vEj n&l BG8UM4ãD:&4ڷp[mRZc-ydu%̪ګzFwcm,J; nCZ Y3,*4Y!ٚ=tf–MIƒEY )p B[轫k_r˽wx/kj$UٙY/߻||ͱs|R(+"BV4 JyHgB) [#VUđq<\wvGsw$Y R sfϮ2f&pL:h6uerN a`^o203ւ4"q}@#@ mtᩐH$swo'Sx$xgZv!`h 6ʑDQr8ā!g4hɗJR !%s %;O\.`r_L1Oo;xL6B ꁏ^*6zfLtS]D('A⨃I!PpE$?@зabg?gN =od> `߄nP78G=~@: /9Vy2=%b36VX4"!<ϣHhK8 !d^#,,%>BH6BKK~"h]:%h6xKd|ߧRfnzjuKSO%6M'fG<M=UMS() NHuJަ\˔)fws`KM4sIbiw;&G^Xz@D̅ \mL]ϠdRAH2u "bC'v_]_iHУoy bO=/~95}ܺZFyuyṧ_}LOB2KW,]\@8R)W3; O~ Xu2y˝پs/2}nn&KLlF' ޱQk-sL؉p<)67BnRLR,?!Rftf$buIpi75Rku 99dtZ} a(&mTfvf׷:P,0008,/1Uڋd2YZk cfXaܙdYlBKfyrf0 d39jIgʑf}BG(G:.h,\Y$9sGq>{W?\`LR`ӧ?8qm_B#Vvŏի=#^Rehχxcpk-hA,,81˵"]*ӓ<;O-\8+D.;*+MO}g; $Y>Qq [k*RjZ\8q.]ѣG>t)KS/P(#evv/};fyyl&϶={0p?3e>;n74g.TG9wb /p?atlF3X*l07&BTkmoXD:.DB`Lqq;W}O癙{v >90`TenlYnXYai#ɲ\@ B:iDST&H:/QY!6C17A Hap3+dBeeu(r-mPDcu9;Hm8H7& JfV;]+PyX; ᅪy"l6@cZ1cA8s49<:gzl6FT*%:N\>^9d]E{eS'jUDa]G1#QbEfӐͻX4 zыg?ť8J@jkOs^{uBF&s 嚄JfKKDi U"$fpwmGnxwi CYoR}V~"[ۑQJj 9J}1f111133PCϿ@m{#!&&v U!n?$;vf%|q-9Q*L=npIZAsT)da!U(ؔjLs"MgHR΢8N\-ha(<#oeWp;廏}]X\|GJ b :I &w1332MrkGXѢ^kn1W.y"Hdp`'S(Qk,R,_ZCBGܜ mxҧ"@#U]&.-92A|o“ n"JTL-J o4[/dl吾1Ad\`De贑6d胷g$nh +tB$_9 sKϲg!N|vN@J|>G1qDm18F.{Y7jX$Ǟ:c( xC>%=b!q}$^nش&FIɉ9%cr vcqJɢ'|V3 GuYК<,3X\%j~_ÀXr,J\z={ ":QPי>ϱmrıZ:xΞ:;w gLq4;Mbk2wXn^b]HnBi' 1nH`S[nHLZtjF.kUc,2`FG1=',.NZ%AZ 6fRy'6qm;yq]#9ji1ui;rc"v2u}V E f: Ts@ J+rhky^o Oy~bJmzl @DV%ߏb尳O>DszFҹD:OI&wL;rH!#|ߧjN.K1߇+N IDAT%Fصs/Bkc\GnZ^^ػ/KUC Ce\yg[#rl/(J!u]2|zwy&'w211~Cs׽oEe+8\87݁ ?Q>3?{/@me;Q(T FXfFhWe2нî,v? :B/O>W&[o~'ՁIjz }MImx8y *F!h! RJ K@BawRoͣ|K 2R(2(}3С6 qN_% Zǀss%ы^\0I4!O|+<)3#ѯW2::kuJ;U%hy|m}T| ޹$?usܱ%=37PyHo3np'8ʁGy޽!1dsyVVj ~\%"\PRP\cv45:۶321^BIXV] + bRHX֛o"\ZK_: {v 3YcR&{9to>&Gz8 uE[`֤T(&k5 E%shMԖ:DH|m=DPu'g4p\nȨbBXB/p|J_Tn!]HUF[1ȈH((tR-s c+UkS*gOsyCDQz$b\BiRr<K\DH2Fc K5 =L}eELt2hw(" yY^? Љ<xehZd2Y(__~cdž]i%d|>lkwsdv_1~=1q#9uȻ9rعw/|diΜ^oW+w$.8a}$Zɢ 2Jm ã#NLRDS'O#`Env!kDYH%A 8 aAo<ϣWTF&!R*U`c>$wbzB"$QV*Q3:JHpm.ٱzꍘÔ2#iċOY 6~tZi[vӻUwQ8uQ4(|斚ZaߞٽgP)F/[BH}H;Չl;PbŘdX?.׊U!^~Y|l8Vc Z*i~j,-r o4\ Jb3T*Ef.21>,R9ZML:!b( LL#HZGIw=fffzkW/z*Lg~}sQ.%dPV.uS &}P!Z/r1I6RcSl-TI\>v&o'v9lL+hc|W?eCxXdY"a9Eڝ1J~6:P[F fz(r>)N8gevavdp0*_k,GT : :'9{g.¥YbmoFLBcpL.t! 醾l"%hFD<} K2V(# Z ECw 49w8{Qdx{PVj/2d&c31ZQǿvpCI_"oaB(vzԛ0 F8ـQ]ℵf-b\GY/ :>p$A Ph el sPm03&lgV|ZqR'{6ĭV) r 6?vfy~ -)TXR#/ y8Fye"rޞދ^!)H.~S8ւL94NllZ]t+Vqť wS>pMςk#-+xob$mvF4y-afhpJ) DxkM7ť% a <@e+DqeEJ1ILucؔ>/W/uK{i 5"$6%}OY EĢU522:N&wepx'SHZThx "u\榦8w,##(GHޕȌj,Ha7`a-²vC$-F':W-"F'B;Sq166:syNECm4* Kl{^jRy_OQ&ǯpr6q:" G$hZӾ,u#p }n#*8,diЋ^?LtR!} ;vM˻DmRV|k'w.Bax~I6q`18.r&RGbF;ɓ̭0ix}^'BfS,,V fL\6h7RhS}t:!5Z `1"8t1ݻ!hEd396l4W}7uB*A,(q k]"BJNMS.Br%Y)Zv{`,MN Ubr5\!Z10)_*&vL6G ;w90ET8&Q:9â@\I}jzŕ^ Msys/>O1w8.gZ'U3!($<ЀD:IU`+̟rX)uu3LJVA[X+E/l7 "‰Ֆp`'|B!˞;?@<3s|R,諎@5ӿ4f(P?t'KIXX5ضc'ˋ,-Y^R_ ЪR=MRUGJmN' tqnE\Yֶ MCiMsXQP*Q)K[(@dA8A ķi\BvAIfG=y]&cV%mS- cGqc7+k"* QH(v 0 Vz'$: yg׶2v S66FBigd=]Lc R:{:|&q87o綛?cG) M#Th!Ya5|o| B&TlcEBnCg N䥭H W|6)?iAh[]vOeclr]D+$uӶɬEh^nj1H)W"k%Qt3zWe^N?Jr| hT#\WDP[u{~:O0a. 8][^od/dj;T]H/zzc4Op뭷2=s3ܵ[o} AS*DVMݻPlVcfvl:-W0??϶ N8ɻ>aY) 鴙94=#~jʣ$D6-5 u )u?rc[:b^tlŮ 6P6'&;k8$6侔\F"%*GS) {Cw N&12L.}t8hu QpU|d!cΜ>G~˧/x_`]aYe`Jlsnj1w;7%E yM_]^(&̵霬]7~Y'.#Jl,=(/¢E&RM[1ؠ#$֤n")hŘ5`y$JصJڱȵZI]k4\G:w5sll7`v"~L0FyjE/b N<~Cw8xF;Cisﻁ?/pm3ϑe79"à T﷬<_PJ5PκtunJ?my6CUG-07YXp_Mo}+Yק+yޮZ?1"Y'ER Ft֠(56)K~6`v]ILBcѱNƬnS]} Iuc ]kRR,rx_^-jLYqBBJ581Gerrg Zm}>1&{g:`FFf =''hcš- Dl=< w{nV݇-]f)W@6^g+*.=/B( C ;_dDv(Z{qx>p D4Zq!"үnK&Tǎ]ǓOo91&G͵aێI?F_.]9=(}[k|GBo~Jq4){Ov$RfuR~~!?=g`+|$Թq}C{(_?d̜aPVzAjmvWqcDƥċ p㑛y[s{_~;cHM7ԓFJɹs-O aPgvv믿/048qe/.r-7s=;KoA80 UVg>A\&C'CXc&IҮv:,yx kMv;뗏xr"9]i5Th :l`ܟ F'r8W:ù?WF-C@zQ>>DR(\2,fYxjpJ[h0T-WxK>wvFI280Hypщ]8'F^GK6m&w sn'ŕC`c ϣ!+e 4%psǑ;qNg.n)SCFe^d;_,}o)T 4S Lp\" #V:?w@&a4k:NU=<Q XhTi#`D*OAsiO>#})sEqOx!qD"fa"I9]zH~g!6 #=hr +-1H(a{Wԏ @~-eBNcvC>_n*R+nr!᫔h!,B`#dkpyœԦ^&SHk" &hH\*V0\Qq$},_ UOL%†{Yi{%>F|5/]byi( nv.]hp=pEZNr亃!َ2&D:GX݀M!T! bRĪ坖t} J)Ry W~r%\H[ݤ䴹m|-P?K_yV}ϕcMd,@Rgx꩓< \B .#`MZ-FvD^ǚOo$qٳ R<< P,VtD69| xn"1 qQA k!e2֑6beqy= {Gi#7U !VQXB/Qݶ'wVT ̏{$h-B% 1aF_`Mok1Y7',jV) ?>C&ROWYx eza8:0\'N0117B żҬ4yx{) UY.hdQƠRYwssgYڍ5L-&/brӠ !FsEDrAR&27_ϋV#q\Ͽ%lqez֐u}Lg464,wOry__D}E>1~79|`gNwƓGrjP }Af8 ܚꏍc-+5+KT*%r"Uk_Ñ(9o:Fz&wg}Aǿ $!&6W!#4(\J)\>lkW&,Q!QcިȕfAAJIElwNP ` wsN;,lHY`}S ^N0:5 ]c~ы2,-4W^(V]pJFIhNи$q2yJ#ۑt{xm6%݈5i.׼TذvTm1 ?hFZ% CgyyզjcknvA> 龷+Y.ǧγxؘI 'g[DZaĚYߪɆc,F6I.N Ek` 7Ϗ\y~J.寴#(,on۟0:0\ VNP.gg_  ҁN+Dj)b*<ݴ1mfVhwV]X\|N8I_ɧSĩ:1_ff5>9 WY-32:BP jW OA\ViQ`͉9FhԖ[+k,6V)8Ⳝ< <26drmiAT:-<jj~ZcW!z^2!:ҟd6#5tPISz0< ?dj$x>!H.ͳB՛$Vp3>0};q@J,^5ƁvuvF%Kv^ !ɗ)"L~ 1-EKsAJ-sHˡ7$B$r]mW-•kPMނg-p+Dhe:sh%L9ȡCG8CNRn&#\';#|*:Be'^8X?Fh'~_QYbpF*EY>U( 0ubӗU}hGX%s'7~utkB3x-'w'}P'T,IA8 k' XGs:XH]>B.o v- [)kJ~xaՖj(M;)$E$zUD&F#?e&fa4va]õZxDbS L6VML62MEB*DjNf2y\'z>PZx\͊$ +| QB`1ԃY]_Dѫݟ V/|='~/10Rl\,nhaMNz m)D?BuQr91oرc\t iZ7pKKK>}o܋'xoĖ .yw8xtx xuNӧyċ mG`%~i(%*Bl6Xl}@J?eE/\-,\NjrJ#RU!o84ΝmqS0dֺd5krWu;*7G&hX,C'FP5>r?!+3yNT@5btPS gqqrE2|G`' YTa#yVu&$Ud҉W#RRN *ݘј'psEr2Y"@0Cz/~r#9cm1廮j&*vXc<}}LLloz#|3SSSxGT\.1??OP`<+Ku>>(#cc۷w>CCIV'CFxFs'$kܩK,,.~?;ʲpιr윓nr4 cc6dfCx{0 1cdK%mEKjKԹ+x{?ιRKjRK_ZRWݺu Q )p5?>);AR7=y~r I=Z|T\#>KM,i!!8d#$j˦ǁm~%wu/m]t2<>MA{!!R-æMycL`keHtєL7kK)#3JrfC$t<@j ),$lL\R2~@z djb![ho[bt΍uXh f(/2q6q̑#G8r0\wt0<8ѣG V5Ѫ4dX D+8#f9 /d< ?g!P%k|{xr|ϡ!¡F1qNPb\ٝ T*| ,"{Z ƐUDQT<9&&&Z288HoO?j\Ȯo?} Tӓ(-|j|qV衧Іε!U ςeJOuBaޣKi?/%˓fQZJԨC`۫^:1L"`Th Aa}ExN@jV)aD>8TjxΈ0LYQZP$o#f+V̪](x!m9=I*  >)w#N*b+Rc.%K\sq; cl|sZ@StogI$$R&x:t*C)l$).&':ܦFmՓG:ZA-&MXY$^Ir,HHR z˻ix0ưuV* >~;;/CfZZZ9r%:;;AK[dž9n}mbdP .J.,X$QGߥo=RЏ߹{ރ9,bU&M2ҽ%dB"ĺL4R1F&9B}_m(V$'鏈T#`!צ}eZG:¾)V,V[d hC\"W+\jD.QX?%;w5"b 2ړ(CC5:38r?auTJSbI>Hσ*)$oo}ly%-|BXaCk] EG`D:+1i& A݌,C8K gΒ͂fmvJ%ES&iBjκ]ΆN/!L\od2V굝M?MhW*MgcE2~O afTvD&џ{9%_eNշDiexR%? ™tb dRɄC?(I K_JIje*L`<ߔ3֦dq-/  ׊4-5.Q)μSZV?rlchp[6>鿣>0+;/Y|9=2#A~?šu*i塄J"$B8HˀAKPI+RsQ*D / 2>2 _OK1G*8́Qϴ+8|9ُ>JJ᭗~}.z'_ޮN*,A&$=]9tt hcltVރey6Zl926rKecY'$ V^wSRYBz6 BkjLkxG䲙Y c:I)QRs JBrZ&M|r[Ê 7D%u"1 t2`r\(i yRy`άp$-FjLz,NP8rL},<9S>]}Z\_,?uxR5Zlm҉6{bN ?z㇏Noo/!dddnvJOp[‰'E!Hk{;ddx9(ju|v 6fxB'J` >˩,E<;M;t7GΩvg6A$sL. H?Kl A2ZD~Z&ʶE{x]( N$SJ l&XTN[:RZDko\.Dzeصk\p o~9zc>JkW'V8eRg Љ^ 1RN219PTFF*r8feYm62xlcGYLhóuEȀK&Cz.Ђo4}kӲlؾ#rKz[pILFʧSV-etuw׋)E=+׫ bcrl{"L/bSF,B?$$!8-7q:b4ӓS e"_111I>'2d͚N~Cw~egXXj:_{`//ӆ4XTZ甋B311s{5c z~@,BfޠͨV]<8.5Jeێm!"`n`?EC5Jy\H!q#xYCyP>'=R4}rW.^jRWKUo <=X)L5[>zQ<"tl\Â1Wrqni%2.1$r.MsBn}+Ls@"pky7/a H8o?֛n"6<۷SO>0'>A&: )L X m<]+w1 EULcmL}z2la5tfVOy%r\~Q?*c\p-l8H$Is!) 1qCO!}|d#QC(EYV.YEUt`˶l߹uֲa /[Eh8Yi'q"=X=8e硴xɲ>%rB2O~R׉lݻ㌏xﱬ|Ƨ^VDk49b|h%Lb9U]F@=O4`!BJ%u&p[y&Ɲz_cpR'3"0!8Cw;O< FQ-O7!DQ|Qq.yL^83fv08gqΤgM!hPZqzFR7E|?D!Š4һz?3`mx|Rl(ܻqoMZ 9E[W+lj cS\sf6cd)h%3+Z73˲-LOs ?ˊ? .NxΤl9?{g?GWaHKcz[йN! rzN^Z$BlٲAV9x_?(4Zt1ē/ۙmPwg^dsExJx+P.BkZKbE5պkΏ}Wi!M9Z䀼)r%JNĘ0d#%2Aj:+KU1qܜ`q|~LaRsQjY& rTkuzH-v"nXO Y#<2qTx.DZHR"6X~ lCsXHLLq&S#MO'Blij$#rm=xT IDAT\lJ4kUh%0& i䬘alxR$#b_#[o<ԓd5ʳ{v>k*5aAgIq[(cO29 fJ-(M i[ˆ,]/C@> :aM IZDG[s:z c=U.#<\} ,_{y韙q͸GC^^*j"˳Hϗ5 ^Jqq${ABDo=e.*.jaCiuw՛pC(RzVR5LFټ1|Llcdͯ+)c 'HHgrMH =oj`'"]L gblE8yqe*By^l{/~2`mj@HWHDHŋt1^PJ"S0v3{Swy5$R.Co"SgwJu&0<◿5r,:L\Z~c!KRc&)qG8c|8 Yl~R)BkU+.(C!a<2ii>2I؏>e+(QYraLH8)8hoג+__t/Ekg;aJl YAFLG(V*T*+Shվ^ "ClYHS4y<32 #6fgNk.|LYIzw|#my*w%3LjdA!qd?O3w]gLk.@hT+cXb%O A$P(ϛM@fOke0lNdpM%[50=9Ë NNi :26V7Κ*%q"Az>Т-;.kHۧG37|۩śI&0 -*J-- })⣩*s6 ,⹿Kmҙh멋ΈslH4qpz ?˵C9D:&ւbAig|.c-˭y{ȢYP ?JDJzv c#yڴq5]0(QLYKZS3O^# CfRٹ<ݐ^NmiKîqa뚑lھo}xܜsH)@b(z J'#ZƢ_Il︎\chd -W`Ų%DBTMsUWe|{ ʕI.a(ï|ٟ~_Oճlq.Ƌ_-tvtc^0pCX`z|i^M"c Z0r/]8!tlbU+(%Xr$8cZ21)%J$ As@--\v&֬jVFk 0իYj-*>ȗO<ؓw ~t1^4FJ5\|&R+ọ"6kyzNDQ)ɪa.ƹتK7R;:/׊u"Y!od6iw%EI63ڱ ||SlDed'2&ȤF^QV.i:B)YC.kJ ~װ&&a@MSx2!Z9:O42aLZ{&+!Tcۜ Cr 3HlRc{#` O,Y΢gS)B.q<]dhrbNSMPѽdLGV Du<@ko/>/5߉1J I,R58F ck- `j*BAixqKlݾ΋hkMPIɮf=?0Ċu`\=;)k?VeZ/',k.K\{%Ħ #!tU "#'ӻ'Ge 2Ɇ5z7sm?EY2>Pb I (4_'K! ,ZX3D)6tQDVMMQN8'lkj{޼=6QI-zwoEg-ԝzY.j.f]nz7dD֦dg5"O+ī|IA("aR% 6O/ ]GFKb-r&$JXMB"SS"~G@QW)Èbj9tQ&x*,>qcc' \͉l\w>O?f_S4/$z,PQ(<~i"hkketFKw[ʲsaRDaIFQZ ]zS*]=>('GGXrK(K_eg'|Wyv~ xI'\\`yAPdlL5B{ZT_ܔqʵ6s|| 2ULN&rHIZeيR,Ŷ<''kR$U- ސ)LSՉxƼIJTZh?\|Z\%Hp[Ԑ)E+5ΙM~Tﻏ;R yO죧5Zox5j4, dֶ| FKK tww3<<̆ &hddsy8cp1YǺU*Q9~l{~\رgqՏw]uAXRZZ+gXz9Gad$ݬ[;y֎"eyfzZ:h[Ok6V ;G-`bjY*^{uyb͚:j9)dž1F|`[x޵윣 :y_QNGRd9<ߧ^"Ôg\+9c&ufܱ /|1s`br IϵP%44y+ l%bڅcxYbkزrA4b,Z9"u!pK8XQ ф4t\ڄc !RB) %k5tZ%wfm3ْBRb.aLsO׿RT磿 H%Ӣ_5l-(1ƑZ mޥ]|!KWnĎ]&#dk(kMS"Q=pNX$!W$M$+7la"m25W8vYY Tk/΅=zR&y\E8x2 P)`=YPk&٣6q60)Cpd3ԥǽzI  [,Wvz2,qSWN/`U;;$Z%\?ÿ'{봶)dٴy k/nw\LBn Y-BfˮqTH5yjb655QRCH! J 8Q4 GYXI5ٰ(j߾K<<)X+9V5{L5JD)RɤFq!ZLZp$ (3giZ= dYlc1R-ҷr5[mo8qqyC IGW!YqXK'3y2$( ۽zoL~gS4 HD6Wdƒ4n B=4L1c,ߦz'j٬@,S2!b0g0H" CF\=ņe ΡPD|:đ~ xzݠ]ɁQ$YE15|ե<:[wޒ<n̞ MO:Ĵ׫1 {:lg7p#^{=]w{_w,_SOM~ѢbN,_e/`ߡ-㨹k҈TW56#SmZvI #Ɓ~?+'ƒWʾaCD~BGeii-R*J6/"|ܗ 3P.d:[/!DhIz\pUtvqyԙ)^t,k[ eYhD&B!U%XG%Ɂ҂Vd__byˍW2t Gt}FV/ɺ>T*%b0FVXkպ8# 󹀠dZX'5:TJrMs[5h1έ +c~ҿ~VIM4 6m.kA N(B>gA(I1t('du =zLx |)0+.S(Ρ`祗s7t eu7PqS "k5k2 GC*4E]A-a =&j~]Pt))R9T1& N`,xyofsi)lg#8ԫyD)Ʉ%YI )Jc8 :p1 Oޅq軏ꭷaWm 2|㤒y@:jԨ *_3rGxQGNk2x;^[E xz+IA ̱:# ~"s+= $m3 ĉ0\=Pfۯy")e罏m3c{w#'ɭc1 cԢǙ> luCGi iuBS8Ř.g~ƒ_Os6A*!<.|yB |wY74t@ΰA*8pN#JlLD'9FĨO_v0_rh+zQPu*?N_bo2(NUd߰s,u`l!<(ZIlVɞK&@I98q$ƃ \wxۈsų`,k<{&W]ٷp&غu_;7 M1 bRjD!Ȃ~aqV,xF넪#b6NĖMLuc<>F?T{@h5}} k/ -ma@U# Z[[nW$ R0n #vvW)^ Y>u uHQ!46r5{/q8@31ʯ"O~>>tBJ.nJ9es%hrmB-3W\Ö+,I-$;%e\i&! I" 8WtmJ[ |4ݐVT% QS瞡`5Aa6D > IߚDH`ʽ}+$3r7S^3ˍq^@7e?S s45(KFT)ĄeQHƆ`%w'w?#\_>I{Qzny/:E[Im-) J`RjI =*a?'2a#&Yayrۮgj|36c(>62ֵ]TZ?qݻwa5u.g$mp$H) vK>pRL@ʹ2Zj:b(8=6*qP!I4jvg-;=5Owq'89:ָwso'՟giR#G"Z{P٭KlHU[G>.?QBDdFh0HT=CR:ItLCQs~FKm;b )e h@ PRaI 4"$‚X 3a!W h'Q"N{pǛm h/b^Y@I@ B&MB ,ԖQ9UeI 5=ѦOW|;Qk$20^+35^+vXӥjJ{}s  D Xը+( ת#oh c'DO<Eclbgi#%,"I#/<Ֆ#shgy_ZNy_i' SA\kٻw/>U\bU0F IbT(4R ƛr?8|yh159LBbORZɪw]7e<r]B"mRh91Y~QVLZ%VAER aeA;|~(uE H x2k Ǒhcщ.=.AP7(V37X HuBZ(³ Qv*i5#tt/hIGEJL\Aw]>=6 U3ާ51E^dyyiuJNQ1k,jq-^GОf-fՈm7~[Z,EKZTJE֯{6*-Õ`rcWv42cKuEKKK0!v}<ϣhPTրUB5>¦͛!yl6{̝:5^ĞScrrG/Xn|md|{ 4۹q nod [qdέu۝PK'ă$z%&Zx>˹t:s.EףQVjT3b\%yV-+<$/~slܺ 6n؀˾_4OU)0g&B\)cUw4s'2?;KOe 'tztK *r]7XchH6kAyXq=(rp&QCsJ$yAEe5Lqsm0}'X.? ڋ ݔI)\fIx'oCmYF+YPU$Qd᭵ I: L⠣#k`T /YL$vILg aNp۩,.2 X\RlP@4Goy0"EZU 14in;Ÿ!r*8&2ʃ 6pSɟ||~倾\akU8Y\\Ljɹ媵Z0$"FcY`]XGZ;I5\}D6HA9rQ* ǎOviNL AD@h`^O7reGIHoa :=& (4캊<͌]r\k_evt:ٷk[}j+Zfs}ZB^MRaI)ť'u.dߑ;K(iV .D[T㥇HUi~FAa7ɝpr[(Y`_6[X&HH1B !~U_ RE&W^Aۄ"nqp*$zmFmDŽ}KKcQ*7L$UU!-+$ ]Wf|&J}tkFdJaW*8&":nv]|Dwq;v(f:$!% l ± K)Q|D8 %I\A?f[8rmSJ |Zuj v`sf #X~C/m32Z9: <캒ARSbIS;={kwm-7IB]>=8 Ryg8YՍ1i6lBXm=oaO`Iϴ&:˔ucVO bFx;]7N1F;ۇ:qwrMs$dA0?t7"rjh66mvjR|**aI]!@[J@_p;OdU?m[xjޛo.ϳ|aoW̘Er0yLuj DOLPiϿ&KO>ԡ^8ugwsI~IA譻 6pj5У'6S ,'6"6JETFG`r)N!839/1T!o"2!2iM:8&DH@c`0Xf3X^^F)ŦM=߿)ie<+2\eqqGyP5P+TIjך d*a؊~ua~?\SSS{]7CHG]i>ca8s/>{QOl>Jhol6x.#3iv&nM^mp Js"KY }i$?s!m.Vڋ VC{02R`XpX[ykŬ@TT?Ϊ6~ÇVrP<==1~Oߧ^s2==w]'OFqFօZho܊A_obd:>׆(%d+}}"ͷV1oѧ_r!'ia3/ڬ,)/ur15+62?05FGc69~$I=Cࠍ ℊ}|%B\]3&8֬tBaCgVVupYnujULqƾ7 JfHۮ\ǁ Ʀ,'iORt#}L{G0t^G:nz#R1AjI8D(U |B/11oĊlBhb}*"\^Y!dZZ'16$ BKI$crVlERAR5h~i ɓE{[xraRi&8fթa plj c EE:bCd&u;ԩEZLO3m Q"!IRDQ<6r24t\/鋈X3>= yޏϫ\&Fq ~aL(qޭ`,TF6v3fsݍZ4\kT['G'!W!/?}WDyM,v:Մԡص{O4Q4 1Y㡵Qk$@a,//3I`bb Zx&&VVШVZk`I}ŔT*Xq. H$uA; aZ%6s]? G8 ZIdQJ;:,tT93"7&BY{X^l(EXm24+?3gjVDs.3Z^ .02$a q$IfѦ@Q~WPD&} /.餀ʃ6 k,a"m*&V`_eQZ'XmRƇ8wF¡Osb;W:Ggqx0ƤN29#h<)q ˆ_-sKRv-U",̒tI =T¦qD֣96F}b&;+$ԩSE1q{eff0>lQIy"7Ԙ&IB^'3j~wbbhE}Dm^xg`$1Z?#,'=>t-t:` TZ3yZkZ9p֢>LLO&&&%6MZ sյ_?5’U%n įM879,ڈg[&6l%z>|b;Dkt4M¶M9x`,}{oz 02m&'Ƹ XXl,!k# k|&JZ# IDAT0R4][ō+x퇉-R4cգ9Pߥ?;W`MLL0;;[R|nw߯}*0aRat1[~ilVu8ޘ( BXZy|aPH`OXp#%Jzn{ǻ񦛙ٔ_I9든PN}/Gk_"#58 I?c5QP$'BXI.<)#`^W]8Z(An^n=i7p0F_Վs c9A_Gغr L ܻ$Sy'nܱTesKxK <9(^>4Z0h`8c Kxn|5"%ٚ\jȩi292D&̘щyf͹4ǧNo8%QlWLE`SeނǠ@V'h"mQW֫#Z')xy h`0^ɓ'5[n-^_B+E9E]]ѶKI(bzz5V< NIK|Y# lG>:qAXLxˈL,WǴmFFF֪ a)!S1A!i//[kx[}pdk3[l+u q1]EFˬI N=IZ"ځ;`6S*_ A_R/]}qSQ Ʊ$"VH'|iO#w`e:-Ԓ32듓8q) [}><+*9M7 @ɻ5Q֝jlݺna&%M˿x⑇x;:4Jx/ٰy7zw@$$"R('tD_ZY6:-7ȗi*$Ahi%d%Dt"͖m[{Y{8):̉agǞ f:y!.sѤ.@ųAV I΍㝑H=N(Phw`7vy~sm,RZH'^59~d aplVF.`R~ >"oNogo}(Nu䥠75 R!Z{.EsJHtp4K+6!DL/c+ VJH5ǛTg% '撡gl4 qu[@y1X!JR IeIujz0HF' |v(KOu{/STB Sfqq0eQIr8NFrQ6ޫ1_AF.ڡNi$0 }O3Ǩ67Q0RdAI:ho,=o>? ˟u gz^Q_[?JQXK~9BMwI*RAB``5og,2:݀mC2,߿A5.?7cNF&x瘙hplnG\g jv#ԫ>`R%<{[Iet^oQ?kGc,t &c,Z|s4%,J8Xa "BZR3 _`0dž+ =+|BV,..yeQ&e^rK/WNH׺.nxߙWb $I|;] q{Cpqu?UoM2n 6'(|VYmKk1###3O3{Gy3@R)2IQbkouxW1rpa?kma\8.@={ ֨EBRw,ة}T 6zsm0:S1PUa엩! GZnŵ&Ah6-^g%hwF8 oXć>>!? v)C'XXH<.E<[85XObe+ټi'ٯ̡[qe']Wsm8y ஷ^͝wݐLG"jq^cl>ÿ#z Jӏ:co۹g:H!XZZ$ qN8Ǒ 櫿| !jV`EjE<!J"0eb)1%Ab5HE?s q]q+fUזK91[-ƕ}0,E90*#hZ)Sqwp8DQWop=}OQNMNEц<,x (b0-f,KKQ-*gfعgoF^>+W@.!ٌeQ]IK"ӌ` 3rq$ǫ1VHSkuOo3ܺMN8ݓxaVHsEZYJhԛZNMi[[oqX`E{H&R $&)Ӓ: XXX`nn9n3b䕇ロɢ"757ReW8w ȇk+ I0%"hY kq 4 B([ij5j"M (~Xj!m/o+~~2S2ZsXI#jmo0/>mIfVGܗ.7~}ӭTF..ph~XΫy9&Ƕ`aie? o]2lpk3ț/s>v Nk=\ kF:G[PT PBRq;&I%N,= aIjUA1Z8hbG"S},WZ5A|Fu[#H# 5L]e||Lm;r}KK=[Ar2 Drs!u'&sГㅅҖ~KV+ˉ &&&l _߸ ^kb\=X Kl:.#W%ڋszmиȁD7QT-(&mPI9{ Z90*W=em)e1_j3 ?/'^1FD2*Ns6M5Y7D@1NCcE|%bJxT&GNГ/sf?3w3:}A.n*92XBR9)<-jFcߧ4*pyux[71lbatѐє>>ϐt^spueųR[+12U6.%D+7uJ9\b^dr**6odX۶?'""˳Kgz^:o9M#- 5Aϓ4l@§hIMߛܙ3z/sj .1 kR67)2ePW.ԄA ?A4ԙ^S k.68/A '[9qxN߆*yҬ VZkZ a|(G{A@f$?p\m1ZSx4 \[o>4X^ H] k]L.Kk‚T6CFx9FZ zqm(m20X4L?t6bfVԱF`I[nRՁ6eOqM R3LdK8A#BTfM6ʖkV[X P@-Pnemy8kX\js_|\ϧZEQuQ$YRzQƨV?\-~#.p)?"(g2}-J{낻AV ,&T8 '`R:[ 0ݼ:I8N0FSID-+Ɇ̥t0NZk$5g< mV Ǽeɩ rvdظSlkxl|Թ(; 2,"8;ʆrlRYa8"hc I[ƹL#eY{ Twk]}/ˡcy[ [?SVH5X^Zdaq%qM{GߦZ8\PשT*43@ >a(,j!!@χ0\AM{nOR[L؄NiS0(ؼqޙQI,c<mplPs]+9p(RZg'{Z[oh;;[f6ﺁ{{Kk}`,w:H{k{}mBqZAb,J ~Mb$ 6nȤFEjc‘F" ,*a^-e V$ 1xGRY(c eL 6 ,{0,*ˌ\> ~h;ڤj5e||uly2~jem%~iVD|Z̍،.OEnn*MKYFQvYZZ $Iݻ.Ǘtql0bU9GJGޤDBʔMLVD3N&x6 >| VvG)T]͒TҾ@~RY1WH{-ᶛr67.Q$9Xm۹QG^ ,F! KYkFQI1 y&Р&H 4p\fGg6 4M:Da}%M!ܵΘSBAqIF#Uz@46IdqS t|y"'%jRHÁ! VkO._N[^yR.AQ>ܮRH\ ; '};ʾ8Teқ  P0r]NXL^v~OZe0077?O?66FRadd[[orIJf9>de欔Y^ w -fY AyE6?~%ӄ@`zn$ʆ}: IDATORSbıW4T7C.^ c,+nft!yW6Lw!pfLU;It G#Fwx [x9pb%/!HWe:)9 4ں87=nTyqw)Ե-9VwaBk(E<,vgh6(*e L5i{YVP ]Fѩ泙e2r"YQ> f# C0,|aY<11=nIZ_ob4jJ9; x}jZA'~Xg,I~XYb;ǏgnnnE._W%Klϯ<Ò?.]y"o*C'T*LMMh4hZx /l$9WHKxI u@;D[6܄43ʕ߯ HtBUg;;Jm)օ kJ"#U8 vtqjDaijTI@G Fg&]1Gy=]ܯmذ苢~yIUs]z (Q]D47Dc((&&D1FP1*QQ ("H /l~qfvvYvu}?ϳ̝3Rjjj$$cyHxӣ$> },cR*mI;|sdE*%; DŌ '']x36~ Q Blܸ;wV'l“ڒRR@VٰW?ⳙllj۶)'yF>|rsszdeeŔ ۙ-d;2GlP4:(EnҵCkJ>Xxq8(MC4\ZŒ:n}}J:bXQ,=~|& Bks(iFG.rN<,oJ70-RMquoD"1`0i~r{l;~lqǎ:H5j͊=_TzD"}v֭^7sԖMll;X]]ڵk]JKFlOcxKZ 8RxV<"HpgSu@P;D4 6pzDH=}@ P}jEDX?{"hM tUb7i :cQ=2#n2pjpȁt*Fw'܋m_Ϣ|wH'jFt+ʦt&" 0t srba_H7'bTċ bEMvH kٵ$- PT4!dt.Ag4m=_vZH џ< \^=4;wP6 3 ajjjB9sx*-ս֗>_x ڋ: |㟡dJsͳR;9Բ]~TJEEEPXXX|M6qVUUw%zTV)~`c+R"E}ACd{W$Rխ#ex\.r+;[ÍyځR,t ""n*»g`L0aY8eb58^"(]\2Bj*w%1G|.Ah136&510@YD䯺`M ;x~3o'\n7nsB! 1'h;l}4Ym7Nmѩ8y]>Uޭ`0XlVl@69'R97"CmC[nѮ]6mw@LdڵbP.>ݑ%>cz9ⷒSN#OE~~~,]AAAjM} 6y M}v Gqjh$%Wg:nPN>ˡ&`UmƛMe X'ze!Xʢ k71;u6aֱPt։*SWsD-}ljVw,5 +渧0&Fw"(w<wwз"Ehz 6deerb oaGi*++O H%Xo-+~a2UH|{|Kc+Ge9J1-ٴ6WBZ]k׮%'' :k'!_FkSEnD"Xm0И+yucfk.TۼVrͯ @5*}0ɡa:i͝\rP~KT6];·ߢlUa4MOXݗPYYnX%tf;6k?Db(d{M$8"aF|%8~:pgggf4NɝAnnn+\SSCyy9TTTv`[O2{M+ئf۽^o9Mmqe%s:&x!8LVe )Fa|d<դ>2|>n7#!x}]fhM9Y9;;Z36]У*ŧ#:Nuwk:`^)qµepO7a&ttpnBp?M oAUe~ 󼘖a;J ?i>J9Qj euxކms膎`@)6ʹi&!9+PLv\>0k'{3jq'xWt-2>WB֮];vލiTbG &D3jq2\Ϫ©\pH7?oPD 20MDBtСUvmEBSЈXQBDqh:t{ڙ 8ᗇ֚(ZB݈-cZ|_k. ̈́Bi"JЃsZk_#X+,DFְ}H9dA P aJpG,ursscͽT;XostرN?J0"yxrTv0{c1>yb|$aX={|ޖ۴޽gZRn%ƛG 0ucw7x{ɍ.9p$;vtMVVVJTkmm5>w~O=UWWk~X:;4qե#G5[H%h1VR*l/Y[n/ IV:Xz_\O}TrKEEEBQfDޏ,ڎtB8t #4d+Jah&\ϾN[ܑ2|I0$ĜL\5vc]1O[)o+&o#}%hɊann8UD4<p(۫6N3?ŽPeoAXObdJ'a'm.rE^^yyyxd%-*¡{ \`z$SD](B\]ʊm ,ҏkM aI$Tb&~2".3!VJQVV" =rQ5PlD9L=CYQ 3Š Ό(>v4A7~nE\.k.!1p|Z;pyy9UUUTVV.#vFT@4.T z_eYuLDi#zɉmT6vg 1ێv˲p8w65T[+5†&+nϟNu~VXQ l2 DMwىzNNNLXkV^…4,lk"ߵ+**pAxvXFT4QViF#(މwvvv̱;J-i}vd+{V>S|a!FP]]sIȿRmƅJv޷L؛Z}fEi+lѣGVX媓`&UhTMleN"6~{VPGLAGy<Ngl#9MFrXܽEhcmvV*++1pPihԱTG `8 B^v(&H8- /uKCi M3\=VQ['oϗ2KiCCOly3Xs{,~5Nu#?L c+4;שoEMLeBoXFݵ-sU;^;1 BnB~m&pvk ëObDL,((hO W>sJmRbK% QSSC$WbGWR%fLQl?K$B!zMaaa9 NQQnkST _ö9ln$-K;DyXÕhgw8|> j$ c~FRte p껉h^h\OwMWD|M>/2O[e}ٖ̍7߆O~X;Ҩ=N;N\.WVr.[n7555лwXI{7*mZ6TJd֭lh4ϏHgwrͯ Fr-on SM򒅰T&\!%F:95 |MhسژlitAU}E$ÝJLr;r]&M0!\AAI>44ЈWsrb* ]CADAhR%b"nAQ@A&@;!VpIAAAɈ57K>, m $  (   "    %U #N B bEuCQ(€ *X送eY(0dOAAXX].1 "#)_V6EADAhhhdx\n44f E4PBDADAh3Xb:Q,4ykTDsyi| " -t=1ۼYChIIAX@AAQ@AAADAAAAAADAAADAAQ@AAADAAAAAADAAADAAQ@AAADAAAAAADAAADAAQ@AAADAAAAAADAAADAA?^ SЮm8 lj"''v y뭷=c!?nӍ;DžiurKaQGq$ -{wAAyϿxh ʁ'uj{ǔ:?;(WbS]DEG{{x]w}݇E#shO|CMMiPu^`3lPs>ǰCEAA*f99޴+18<fآBzuLGVǝ?K.{w}w:/ epЉ]LJqiСxrZ[EͮnZ|hDLAA k.fB3t̰(K,0\:R kϙ;Jv#RUUw11=)螅-kFssEC'4ÿ; BuuuCv@AA`) KqxG0#&c;a8ü^)VE8Ø'"g 2\uPr;*rc8k׾o.<쬬F?  B+Sǎ w{]5h.’lz -?/ginY<9uίiuv}H108p(  @Ӵ\^n?Pu7oZ/wv1år;45Q|y-oܴ3M"(ݺ`̘1  m++pz:[Cq8k-"04L*P JTi/Jşi]INOI\'kn /اg0ʻtEެ   PR̜NZU痝S<=~d;WUiWkf׻}l(+E_bc)f\)=2˕nٲ%8  B+bܸq   R8^׿83->kpZE\ݛn+{ͼ_h5fФr-*g)&Q,~yܱz-uЁgi\tTUU=   2R(=z4sWW#\݉ƣ+#sX{B\iF@_SU1`08rP@P)OW~Gvn./<j]L0w{n)[]_F`#ff"N/>  JXj A\ 4?%uΣ"Ww@`= }yU|HOG?fux77^eY,X'NݧgDAAZ7o!CX"NέyZg=]8Ӂ2SDˑMw.jZaeKOGpx(:5:n0AAAA_Qm#UU\՛ DG6p^'n G5hFX85,Fz:;Vt]<׿W_"  #6ndsڜ^֥{J`4 ! 2EiXŬY8sݻ7^N:1|p|Ao.$  arJ6[9q6DHT<\b$L6M̲e2dguׯwݺu{O><裭Kߴ|/Ͻm6򗿰tRFԓԟsyfVXVkrwm۶6ǵvZ;Z~{W_} aQ,=>ˤ_rGX.eDߋ!Vo(v,,jwF`"ax͛ǙgIY`Æ Sf׮]tMp ;ZlLQ3b^o0;wk׮ Ǘ/_NϞ=fΜɭoor77˹eƍXEϞ=S~_UUEEEEEEx,|lܸsSVVFaa!ӧO{>`FyG9[='[`Onj3ٳ'~ieLBݙ;wnnݺѽ{wzAϞ=ٳ'ŔЫW/zM޽ټyT|3OŜx≌?N:Ν;sWRZZ5ׇ~8 cǎt҅zh4*'dҤIӇ}ҷo_GΝԩ=P+ӱt޼yt֭޿>U(MՆRV'3r$UV8cV23ΎCө"\U9VR(Ŗh 7}Iģ i>ncQX))ìp:2ꪫ4^{|]tŜ{=Ν;' &0fV^&OG}ow΁G-/,&3ߪU8SӣG`7a:(K VGᣏ>jVrk?DKYfi&6mĢE5jo+g`Μ9pB?x?0~}Kع6d~)'v4硝?rIgl359w`+gY {dn_d0NvN S*ǎ=HᖲV!eCb M ssq?`5#9{[n{[݉_Exܜ{0OU}GamԳH3ꫯiW\qg+0`p@w{_Ȯ\zlذ믿^^ $wQ]]S>i+GKKO2Z_|1@fޅ$;;;o+۽w/aHZ* M`Y.%L9x  ~{e(hh;aܙ(/׬] V:qe5YdO/~Aǎx?yYlN>(}>,cƌ3o(3fs5$|rJz)VZEnn.ÇK/MRQQϊ+pݜqtAuʭX^{ŋӥK>h;ᆪSNs1\~xizj9sD_,qWsνf׮]7 &8p }G}4c̙̞=9MF޽Yd w wM(ra1k,ώ;7n'x^3rH>_|aØ1cF17rg3x`y^}/;MUO0zh: |I w?~<to&%%%x 2]ywcK̜9{/a!k>s}).\]wF?wqq1_vm ߹;yu{饗xgbKKK9:t(~-zb̚5Ç_$>ECqFzݺuu< #G֭O<'NlԊqg}F>}(((#ޛJVҩLt1+SNcTacd2w}O:7w?biӦiZ}7cB&֗_~ɠA8sÜr)2e=P}j{ͽ4[vXe9"U3}=xp#k#l}yI &݅84 ww`r#Q>l_XB3%8ŋUt1c>Wu!߾ P/rZz!5t뮻Njر .\G±m۶)@]xᅱcWVG :T :J}7-R~Ŏ}70 ug+4cx 뺺K=uT~u@g߯:wPGy,+lG4MSWݰawܑ5.s9#<oS\lݻU;85c  ʞtI P۶msI&)@͛7/˕R|pLg*{{6m3}_۶mSG]v%oTz/7pҥK/X@\.uQG%oJYi.2ҭ0a?ΝyCs1 P^{md﬩}ߔqM7Ů>@͘1C{ P7tSciC PSFJ/3FU# Tui}d򌭅E)@uwf%]OS󻜜'~|C=.')Nǩ,å u)#k3d}Cv@۳cǎ^zsNjjj[{U-1i$ǬYx27 _p# }>#8#XjUUUU4H8 =Xf̘w}%z5[RZZRM6djG1uԔ-jrizJԩS4:vC~̜93j>#SꫯNX7[p!\rI)8p ˗/gڴi 6 ˲裏袋ӧ˖-kym9K6O߿?'|2~mx3)S h׮]9lLw@rrr>6QF`/^=쭏kJ9뮻;v,r 1 ӧ3yf3LYS="=\;wތ5*w''5`L<غukXcd#yGAݩ6#T5yŚHU2Ԇ Scy`0A~ 0`s% v9r$sW_9߿ѝs=ùk/ĕEEE >߭[7-Z'''?:5jcѢEw箪^ᅬ ZihgK/_9`Ɔ̕ꋎ3i$n&T,XO?p|̈́a6oLII^sYgѡCM=ӧsGӻw&fSz˸ظq#>,<6lN`͚5 +dΛoŋconh'|r˖-kQџ9s搝֭~IJ?T&3}g-Ȅy'i*;8nƟmLHE4M6123&;}<ݝae'^` VVi^_ * E8|^ O/; )B eн)((`„ _>l gΜ9 :tEgӱ^b}ꫯfժUAp!go~.GNk)멾wi&\.۶mK4h7pCN.qƱ{nfΜ : > vS^9޽;wq˖-CرW^yIavn斋ڵku.]4J1K--Qg|r~!0n8VXO> p:ﬥmuLȄL{ZN`FZ\)jerQV h W x߿c=1"ġgHWW?o￟1cƐٳc9Fd…_SPP)S(--cN~m>x ?l@Յ#;;ݻw=`:&gW]u,Y$a+o}zw}tM UW]şgL¥^ʜ9snk6ݺuGaݺuG$~i斋Hnn.eF=vec̙L8;f3LYkژ te͈>}zNv3.Tks{ ,iTռ؄C7(qGG/e(Lf8x.]ʄ=r#Fo{tҥK&NȚ5k(((`ҥys1;vt2c n77|svc͚5<]ve˖:I!̲, yZ~~>^{-+WOg,]MSοsN^9Yd K,aڴi}ul3=Ν;7 M^]1_bŊF)f_|9@JKVmtؑ?񏔕qwlaC2;kiHK3i͖2Frsrxvtj07}nΒڣwDxz÷yf"1wفMqʋJ|h¬ 9~F: Q@~fƍW\I曉D"tޝz'2vX~!<۷g̙Ms=~~ߧ.`0SO=du1~x&Bߟ#G&(O@㦮~XFt1 #f*^cYzu:~ B16{8q"NJtiꫯ7nȹ瞛Ҍdٲedggvplt47юD"̙3ә'ްstߗ-R>JJJ1b>Jc"mw~:!HBSdיּ)Lm?~+2if¦jK/߭s|PeE"Y=BRXlPj"nؓ0ż6P;рr(ʗ1zhh;,Kr-=Zb*//W6lPo;vԠAԦM2FrdLTÇW@ZaxC0`r8ꩧRj׮]jk2Uܳ>;!`8VCUG͞=[EQuVu(ǣ/]Tj nv7j˖-B[n#T555*7W^QwVj֬YcǎjiΘ12<@0vh;Qax;^]]n6mV`P-ZH]yjƍ ',Y`=SmTVV|jƌ62uTգG:3V̛7O)׫.BOiӦnI*˥f͚+/*@?\YvܩL9+{=(@1B͞=[m۶MXBwy P_}½dZ>SHCCرQ+C*0K/"ꭷR|:Ն z7/2 C7Q ,PjժUNP>}zBLeeoWq[:axϟp|̙ P#GL8ޔa2;kgo7lKއzrL-;Dm>P'tRX=[KUG&ϘRJzRNmTR+MjzH^_:J8AIDAT| οR3;Tcz(4*p|[:ʩ Pąn ( ?!/V~r\_߾}ɓU$iԹع=R@RjSOUNSW>uTF3^zr8*77Wi.\'MTvb~;t:4MSo[lՄ TVVjSO=Umٲ%< * |u]WjT 6bԩzTUUU<_ZotR~LC9Dy PsISQZZUTT OO*;;[N:N;M-X B1~xk@u7Q2-\>3էO뺚0aBWyy5jT^^r:jiܱꫯE] bzO<|&7꫋Lt-SD)[DzW&cM6F&3}gM#M%-Ai̘n,14=֏E_?Yb"CѳgOz_~[o\b7 y1-g\FcӧOgLy yr-cfS>)4 śa sxb{;!69WӫW/v[0#x gLDVZ5Q&E6eB 2U"J EC*AW>2XoA6)U  4N!n]AvCF-.U$ G r $7"" 4&; xeː!Cbeu)! ]Dv9A C  U:J   B$|ؤ\2dl  "|ݠ!;!   dxl62it2"  @5P6dȐ*`iLjIENDB`mu-editor-1.0.2+dfsg/docs/logo_design/splash.xcf000066400000000000000000011675561341747546300216160ustar00rootroot00000000000000gimp xcf file  BB5@jpeg-settings U            gimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) F2FGY\b,(NMPasted Layer #6     "5NM:NM *C 201*3,1/%m9$39445645/561*';,)21''12,-141+/123+3$I9*0=@=ZcPMY\QD69830*(/340.#7GbīncVE2)"#$0R8u ƬsYE0  ҰnJ7-PVɿǖiC%ʵ|mn_PKPOD?E@42KPZO[hˢf)чcT8790,230,241045/),01&!,4>@ELZ~J8106767877978:457.26/4:;<7?ABRaֆJ415677677523*$38+V`g}_:44776412347AIfhz357753237LYwhAjT=2776613ASq “pL5/9d5=867359Pz ŢpP>22#Fk,5751@` ϨpS94330%gh#/549c ҨX931451.K: *,1G ӯZE526675,8oL`iW eI27567752RAHAB pH<3177625iF,[IЧtU?435677545[<+_є3ᾄ`C855677635OC*O^#ǡqF:4577863GtV(6: Pݵ[=345778337gI4.mV- ֣qI;3566773)6TS15D1'1FiC356776411^N0/MP#893677529O@4,?}1/677841/T=31*D(,587787673,0G)%71v`%'..17660243:ai3245n. !)96.?N] X523,kL "g ܉ktrpxyjrrok֩4RnstѼrontspn~֦u'Ul}xrqssrnsԬ~x#L~˸wprrssrpڭx|]]Ϲxtppsspsܪ|mp@=~ѿuqrrssrunťK$ɴurrsrpqڱxl̆3лtqqrssrq{ٵlr̝T >ǰqosrssqsٱ}rotC|¦wrpssqls԰qszߛR;3tprrssrppױoo~r6 Ywqs sqtٞxqnvԍSLrusstrpn֤vrqkܪa9Dgussrmo{͘ljsp΀I%GDVssropsptٻqqrqНW& >gwnwѭqqnۭi2oƛvpssqu>uЮtrsrrЁ<ҷ{prspuӖHߕYط~qrrsmuГSemxrpssrm}ΑO JsrprssrklĊL% Larqrrnqssppn࿎R4 $ >aisuttnky؝u%';Liy͢e!.']x¾;00#}ycnf;T)JF&I/(&h}tywhzFJPD*i?conZK3H$HLKJGGIFLWWX^dedgmi`\Z_ZUQUHINex_)bxxqjZMHGKKJH\\KCglC)BPMHJJKKHITqgIFUg.9DLKKJIDPi`GFSuL@-;IKKJJKHHIFeXJIQprA2NRMLLHTaooQIKScrk5 irvveIHLPXb-%fsTEKMOUWXJ$@nwYIINK>:2"&3^o~yiWKGJH?1"-4YXOHEB?@>@='3/361542!T 3"SmzKF/ -9uơxb> (7Ηf<) "Su;#ݵwD2 ɑQ.5{ C7P [ &DB o _ - =  E s Y@. o  y sD)\[Do ^. vK -+ :*!Ur$JJ ''!(F͒G, 1h͡m8 0 0FH:$ 6]@@@@'&@?Pasted Layer #5     r3@?@?"r &2[{kG$0^ǙgD120)+gpiZ@;961+#O%G-n1.23219Jgkw_=`#!ZD05771?lՁR M327763Zʛ%x 2876<ә"h/4864Kͤt,".5A1744]|K072.+'rM+744mH4/6682+-%o1766^P635778/-#"z0786\2267758)8'-G67/Lg)67757Y(jq272HU.6775;g-80620O457765E.$iQ182xF357765U'8!#,8#F=16775:ou "'R>/3A00776Fn*$n061ut(58776=`(-4C14^k18776Jd.+2&F63Fi867765;_t,3+2.+cB47`857745Fv767.>!-53Nc45773;Zh8575,"2,:X02V36772H~X5675BYi,ID0Y?46776bՁD3772Osm,f,6V767765E_73776:,Q/{e357748asD247764]ͱ23-Mh,5751E̊J626774V:v)i+5547`ƈM44577826VӎdBh1526IkE7167760=j6}7~!31@jd5)867763Kk&74R}P$/497767C^@/`c6,}ME/433.0!00MltC<]~O2./(/(2DUyH41FL]mN<*,1ȣaA-)*37=(BYd`zuynb[Q>?22/2672#;86"  $'(,).+/0300-246554163'*-*-123-224/5.5.. &"+YZ 3G^sWJ3CjuaGG%,MTɶ{wsliQG.?%-eؾpnppqptk5E%A֭zprsspxIJd6#3ݨpqssqު%aݠgpssru"aڥkqssq}1G;޴xqsrqյ}pwaDB+vݻ~msqqʚ|rorsv\B- HΎpss߸rrstuN**ٝossnqssup'0Yگ{ssp}Ќktssp6яpsp{ٿnssrs- _ݨpsqoԮqsspu~:ptpУ{qrsso}Ҟ_5 #NmsizФvpssn޽b6stpqxˠoossptpKۥpspȑkrssrsU:(PxqqƎptssqxċ^8)4isqztrssrsʒokI,>yrt۽srssrwǒstmCB*NrqÉqrssqsۺsrtm> )1`׃pqăqsspxԫsrsstgLkŻyoxqssrƙzrssr|mE6ԙnr߾ssqxױsqssrugCpŊqrssrsӺzpqssrLn͌nrssox}sqssqrr^ÓlȌmrssl޽~qrrssprܳp xx՛prroÎytprsspuל!ㇱsܘiqqs֭rksrssrp|М珚֙jrr{Ėjorssrssz٭GӢxpuɪppossrqos۸֨uj}̶vosrssrrnqq~ݴr ZϷ|prqtrrpnrvѨm/o̮~ynqqnohoo}տT'.{阀qnnlolpyٵz= ޸q{Ӵ}yf;Ļwojn\( $i|wyrqmld[L;4=GBNOY[Ya]dcgfd`]gZ]SO=A!65<9?B3:>EKlhB3%% 1GFLcsk;1*#)?LKMpuZTPMLB/$ &&FNJGsmUDKJKKLA7$3>JMJI}TJHKKLC8 IKVUNJJvnCHJKKJRcwvP/mC\WNIHjfGIKKHOlifTMgUKIebIJKKGYgKG]JKT`HJKKHixJ!S}LHL`FKKJK|<n3bDKncKKIUD`LJRiMJKKJKdwGA:M4kDIuwNIKKIQrjFFMI7kSJXLIKKHT{񦧡ZFIKKJ='U*MwLGrXHKKJHSxrLGJKKC>dZI\^FKKJKX~\BIKKV_*5QHxPJKKJKZzHBLKKtsKxwG`RFKKJJ\c?DLKK_\IaeD~nLKKIH_|T>GLKKJFYnO*kQVPHKIJdhG@JLKKHG\isR}Ew]HKKJ_{WCFKKGKhf)IWpMkHKLA]cJDKKEQqi,3_eQJJA`wNEGLKKD\Q^R]AKGc]AGJKKJKLpp8!n]MKG]}D?JJKKJRgY4rkn[EGVa"hrqIJeG=KLKJKDINs󦧜RFKI;璃OORCDMLKHKN]eHHKKA)EHTh|o\MGHILJIUsjI-LYpyfXOJJKHNilI/zF|b\PJJIKKJFILib"[nijZSMGKHJJKJKHJLOkrf<va[TKIFJHJJQLQOSR^ctF% 3r0b([mz}wae,:VZaU]eU]`bffMuCeC. [ ?8OCoPZ7+*|'F,[eZS"&% $XjojnlmmnimL#B[jmommniq^S dllkkllmt t>plljllIu %hllhYHlollV g llq]P^ill^Vllf*Follf5llmn.=mll0Imlln? OmmliAllnf:[ollg+1rllnb+gme -mpO Ijmllpy~>pllp6 [@= \olljPllp: ^nlljAy.kll@_ll^`IdlnomFXoongc-Lq ML6?X0o{@y$ @{npK$Lȿge wNJŢr%.ȥ瘊~9ɍk=;Ȧ %2lj wn.Qp)mp+#ńw һ3;r RR Ѧenrȹl΋0B7Ǖ%ʃ LxO [(4z]`ȼ-czsż#4Ļ'-eƧƶaļ+8ƪ<Pĺ#ƋƙviĴ?YqOŦ9ȸ06Ή5[m'χ\Fa̶E 5@ͣ  Zi29'Ǽ~~7mz|./`ˮ?%;Ƀ'0 ǔ:Ʀ ŢȍnR~F*VYwk 4$  jҲNR)9!|5fi %IŗBN ! 5P ΚP lVJYOr)i`gZy =  5Y H1oxƐbNJ|F~N=C' Ażĺˆ@wûȧ tov Agɥ J}#_SnWq:.tĵi7NXįN0Qǎy~n`9sm/gt yRqa |0÷OKr _ 7qS p{ B{opK wO 瘋~   &2 x    f C8     {^ bQ  Q        a  ;o    6%  6   N "  Qm  K  i`g[y =  6Y*.K7=&|0=D=9 & GJKJIJJGL?8 DIIHIINu+LIIHII2v FIIF=1IKII: hIIM?6@GII@:IIE0KIIE%IIJ *JII!1JIIK+6JIIG,IIJE(=KIIF"MIIJBFID JL61HJIIKy~*KIIK%=,*?KIIH 6IIK' @JIIH-z II+@II?a2DIJKI/痊}IIK4(NIINGIIK>&28IIJ3,JIIL)HIICIH*)454* <+?CC=0N>f )+KIIKE)MIIL44C83LIIJ8IIK1  .IID #IIHD {^$KF :IIG&IIJ-+IFKIFMIIG&IIJ>3IJCbJJIIKDALJIIM3IIK#1JK)ALKM2"@E9$BLDJIM IJ FLIIJL< "M' JIIJF/>0)NM.AIIJ/FJINaLIILAIIBHJIIK1 LIIGHIIBGIIJ7;MIIJ>II<9KIIJ5oCJIIL /KIIMJIIL "KIIADD' INI9N "7EEGFE? 4NJIIM9QmBJIIN KezShqp%(gz|h9Q{n\\T "u(?Ιq}pkp& W{ngs %?1r}ip[uu{ba$!qxnp|rsy* I|qVr A/_zNjwvl%s|h]_o*S~yfyo$ezShqp%(gz|h9Q{n\\T "u(?Ιq}pkp& W{ngs %?1r}ip[uu{ba$!qxnp|rsy* I|qVr A/_zNjwvl%s|h]_o*S~yfyo$ezShqp%(gz|h9Q{n\\T " (?Ιq}pkp& W{ngs %?1r}ip[uu{ba$!qxnp|rsy* I|qVr A/_zNjwvl%s|h]_o*S~yfyo$,-,,,,-,,.,>S,.!,q,++c&I " +GN R0܎=  r#$P'V݃*-3 /!&Pasted Layer #2     wZZZ ]#_1UB v! 0q* !y 5^U_K#@ ].y_-q.D0BB0D.q-_yq.]@#tK_U+ my!   !p_$<X"U0_#] !!Pasted Layer #1     Cs]!!]!!]                                                   (% ,[o "FF G  R H~m c G nK+D_dM Ѓ s  8M*c{l. UF &   K 6F 6FpFF$+F  FF;88 Pasted Layer     Xcf88cz88cȖRDAS#m 3pߎ {-)iO ⒉=!h 2޺ݺ޼)/UߵǣAUfo$$VbC1KK~~C2/ʛ$4V&H4$$4I)nW*ꜛILvpNr ^jbXr5 p*>K'9"' *0015OK!}!x{ 㡹{H" *//12#\\ cvY?>xOm233?U7P?4poDi233</Ts 蘚A ~I9,=4133>_kSz>HB`[; >)JaP2/33?WQYw7uy +l]Gє"033B>H;%cMϧ3Kln`01{F#*(z_ $033C%vd3D&ib ).22422D'gpQ1:s4 ,I =8776=* 1/?e 9I2]zyda\v=Y7\Yd1  _ dCE_ gNDnVDܗܮ<;kCQ Z6d..ܺ~TU~| b hu݈ϧbRhĽ߶|@::>j |xa7ϚlrW!*޳F(4331E柳( dڐV7 K >R{t 4330&u}Tַ>0Ҝr6k򝍗>vhvvs\V!S233V/M>E39j22122>Uk$Mi52+m Ev %w/\Q133=\3qt;`+p0,/isT0H@233/5F Ek *\66H23308"tx" yu5cd]W:V&_x! Ai 583315 x#es(j'4}q@d(433S8L*6qTgd ;z =!LqzopVR334C7POT/ pUUX`$?6*&)'%]ݸ>-" T#󺛟EF%i8&' N(x1.e@P&*()qq7N9{>I|*gWGt>Np?K#9"XH/&.RfbEeTN+4^.xۨ|u@0/QtL0, B';hsB66wZo~E e:v?SQd POVs$T_N5I 1UT\:qmi[OO[s Jj\CC[Gݞi2NbUUb0!{ݳG\7f*]ff]*fME 7hYffYiPC& ěȌ鴡.1:iYffYiI0#ߋ꩘+DRCi ZffZ i[F1+;fhgffghfRBH ]hhb-I$ɢg6"#5hɖRDBS#m ~~0p {)'UO ~9!`'ߺݺߴ0/P߱ÙBR##JbD0GFxx?1-ƒ#w/Vz$C3$#4C&hW'}꒓JKkkIr \g]Xk2 i'>K'8#*0015PL!}"vt 㘳tH" )./..11$\X cnT??xKf33=U7P?3pjFh133</Ts 蒑? ~I 7*=1033<_kSz8H@^[8!=(JaP2033?PrKXw2my +f]Gє .33@:D7!bMΧ3Kdi`0.|E &(z_ "/33B#vd4D&d` (,2332B&_oL28s3 +J~ ;5544;) 1+?e 9I0Xtxda\v=Y7\Y d1  ^ dCE_ gM@dWDۗۨ<a |xa8mrW!'޳C(332B柳ݿ& dډP8 J Sk$Ld42*h Ev #w/[M033<\3qt;[+m1,-c޹sU0G>233/5FDe '[66H23308!ps! no4`b[U=Q!_s} 4*&)'%\ݸ>-" O#󵑓@F#i8&' {O|'x1.e@P&*')qs7N9u9Eu*hQBt:uMj@L :"YH,&.Mf[EcUN,2hT.uۥ{m?0/QmG,* yC'<grBy33|bRn~E |e:v?~POb OOR|m!T_N5D| -ST\9qmi\NN[s JjX@?VAڕi2NbUUb0 wۭAV~7f*]ff]*fL= 8hYffYhPC% DŽ策.2:hYffYiH/#܄ꥌ)EPBi ZffZ hZF1(:ehgffghfP>H Wihhi\*I$ɢf6"#5fȖRECS#mgg' pb |wߗRO dhVm+!h %ݺ'0>jnlߟtpDU\g&&@cDto$lz64cc2.)zlcW!U_----OT^~_mpqmHJ~bU8g WT HqXgmobR& mN {>K&0)0024OL!}#oVk upYH?@y?L1337X7P?.rWCQ1338/Ts}km1 ~I  .;&/338_kSz (I2mjc^[[1!<'IaQ2/3369l8Tw$acTy +x\kIє2338)?3\Kϧ4KJjQ`1"~>(z_ 133=vb3 D&Lng^e^ !.323323>Fk80*s`_f kpl0+Fy *)(&'*' 2!>fqok9I&BVzda\v>Y7\Y d1  ]dCF] gH*MYEۗ۔<=K+KnmotB&H_V..W^ܺromn^Z~TonU~|] kN_~}gRhß߶|@55?I|ya<ooqrW!޳1(/33-2柳ݺ dgnhwr>8 H ,:UQ033,%TY<㸨-0ћr7Truftnm-bevvtKH!S.44/>"6-lntF'9M321223@Nk#uLP53$T Fv n/X<033:\3qt;H,^..&MsK/@133/5E =O  jopP6 5H23308a`gX4X[TO?>bXstrhT[r 0j 583315t!ifP(G'*RWq1f)433S8J*6qU\>;{ <"LMVpzVE334C7KKT/pTU?baY>4*&)'%Vݸ=- " 8#juvfkm1Fi8'' ]Q\j!x1.e@P&*&(qu7N9\+5\*iA2t-jQGMBJ;"XH%&(qo8k`foFbRN( / _<.ZplۙsrnPA0/QT|6#%Zp _pD'? cq=^'(aZ:m~Eaj [}ke:v?_GB[KKCygT_N54muW fi tNV\9qmi[II[r Jk|I3 0gC3 rqyi3NbRQb1#pmДr 2Cdt^d;f*\ff\*fH+tdiv ~:iYffYiNE$ vjeo.35iYffYhE/#ocgkEM9i ZffZ iQG1kg4fhgffghfB(H CmhhkH! I$ɢz]7"#6^~ @7Mu: a Python code editor      Zgimp-text-layer>(markup "Mu: a Python code editor") (font "Flux Medium") (font-size 32.000000) (font-size-unit pixels) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode dynamic) (box-unit pixels) (hinting yes) 7 7 zose   q'<<!-|!H|!|!o|! v|!F |! ?n|!! |!e | Q((# n=|-0 `|l0pi07t|l0 7|l0]a |l0X eG|l0 y|l0Z`,/~|l0 P|l0 ] |l0  (]Q|l0 |l0 ( '|l0 i%|l0 Y|lB [|gr  |KR%| |#.|52/[U|c+=|IݜGe:B^N:    IJKLNOP677887l9l9l9l9l@\xV*l[3lml 8 a?lV$lWu 6*  050l50l 0loC(%# P0ld80l 80l80l80l80lZ$80l0h*loY^]lB.lo=l<\T>%   58:o:QSQ9,V)8R#}H 4H I8H 8H8H8H0A<K 8I28G4%8Hͳt8H8H8H8H8H8H8H8H8H8I.-_ z5BF-̞ u8-WYH3/:E,y:e9;9688:6gn3!oO47t5æt*   PpnM 4fvQ   N ;^T[ dI aY: q .%&3% "Z <u.Kp x1"H p \4p X4 p X4 p X4 p X4 p X4 p X4 p X4~`Mpp X4 p X4$p X4 p X4K3*:p X4N=p X4p8ViR2)   ?*;o;;;;;;;;;;HfkC PpnM +avV5 :  1>5^T\;IZrdI aYC_ X  .% /Z/ "k <u.SO "HD S  &           v@A ~`MpG$ 1 $L'mga >m v8v8*N*N =`]W0 =`]W0    *4:o|:|:}Q[/}bq/~$~#}H$~4H$8H$8H$8H$8H+avV5 I$<KPpnM 1>H8 \,H8^TC_ X,H%?,,tL}M)VRy7y7tL;;} ~<1/@~<`N`N<  <HuHuz<;=a =<+sp<.&p=;p=؅p>;p? *o+~\9c?Lq1r_z6blY{]aЇS܃@zz%l_j;$.P@<}%;=&'gpAzy^pAxx"r\@c bpB $mjpBa\y[A2pC yq΢iwcvRpCzp&BgNNFY M b 7`h 8ay 3 - 1"-'  * 8x4+tL+BstL+& tL*tL*)tL*v=(ҀNtLVy*MNFG6{2ޠbtմJ$~mt.7$ ^UtL tL tL EltL  tL tL% M,tLL Z9ky7;tLE z:  *7`N7 7Hu^/t#© Nicholas H.Tollervey. Suppor...     VUgimp-text-layer9(text "© Nicholas H.Tollervey. Supported by the Raspberry Pi Foundation.") (font "Flux Medium") (font-size 24.000000) (font-size-unit pixels) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode dynamic) (box-unit pixels) (hinting yes) ttS-nʰ͚ЋRw4/ȃhwo)w3C9 E - sK#H@|x s7: sK l$sB7ׄ sK9|e-$#s7sKGsǟ7sK)v2sO7ak)nsKUWMsA7Xz\sԳPWs7#s- g?s \7<sKx`s77sKdS0 s7sK <잙uSsk7sKbjR2s,]sKD svhvsKm)N sf MsK4l s#gsK9SJ'% , u2;gK gK]\xPgKl\xPgKl\xPgKl\xPx)*}[gKw8;͵wl\xPI`φgKٵx]Xyhl\xP6-OgK lllP %&gK lPx]gK `` l\xP agK* v l\xPligK,ll\xP@gK5l\xPbubQ}0l\xPME1P UQl\xPK7w4q l\xPD0! $  +.?u2u2 !"" gKgKY gKgK & gKgK!gKgK!gKgK!*}[gKgKKp&8.K `φgKgKyy$Ϝ, -OgKgK;|j# %&gKgK3Y)x]gKgKww!3  agKgK3`ligKgK3 O@gKgK 34$bubQbQyo3KAME11 a 637w4w4x 3xr0! $  $ & iFhG7{5r2&m4 5( Kp 37' "5z/dyy$GoO Ƃ;|GoO .\wB#GoO a/y4ww!GoO} z4aGoObz4 GoO{4 LoOi{4yoi}oO$/L|4 a 6!\gOKBiaQY8j}x EЮJD4y9}& " ^= )~<w#~<$<[$<tL%z<5Z''=>; ;;)/)*}[&8'MKp866`φϜ1ݟayy$Rۂ,wB,-Oj;|=y4=%&3f|rz4|rx]3ww!iz4i a3n{4nli3j{4j@3 1|4bu3yoQM)}M)ME3 a 6X }73:x 1~<10!& ,~<;<;<;z<;=r~*!!w3 o;#!sK o<#sK o<# sK o=#sK o>#sKb~>2qs 37''MsKUx)?𬁠(GoO1ݟasԳIy?19GoOs-6;o@$5GoOsK o@$dGoOsKoA%pGoOsKoA%eGoOsKoB&?LoOsKoB&i}oOsKyL[9&`!\gOsK ` 0iEЮJ:sK/" ^= -w::[8tL95Z'_:!####t #Q6 #;5#;Ns#Kp;Uow8;͵w/)2qy$;2ٵx]Xyh6𬁠|pGIc wB,1`y4=$w!;/ `` z4|r$;m* v z4i%;,l{4n% ;x5{4j&o ;/}0|4&a 6;VP UQ}M)[9&x ;Uq }0&  +.?~<1/,~<;<;<;z<;=Ms$%%&-1t:1J713243UosKp&8&8 37'3\ja(yy$ϜϜGoO3-9;|jjGoOjCD\533GoO[dww!33GoO3p33GoO3e33GoO3? 33LoO3yo33i}oO3` a 633!\gO3ix 33EЮJ3& " ^=;w::[8tL95Z'X=~*'o;K(o<K| (o<Kk.o=Kk.o>kKk*}[5z=%8b~>Kk`φ3n0Rۂ?Kػ5-O r?Kwwr%&fo@Ksx] o@Ks a oAKsli oAKs@ 1oBKsbuL QoBKsMEY8j X LKs7y9 `0!),-*:( ׄ(/&w8'Mak*}[=% ٵx]1ݟa`φ3n0 -O r %& `x] * a ,li @ bu $P ME Kq:7 D +0!9:N'  pythonic_world.jpg       >JVb  Fb~ٚٶ &B^zTd6[ *8^H(m*SZTRbfjzFl.%UUobceehpy}^8 (.7TM`hs yv? dhx 57So %A]y<=2 467899::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<=2 467899::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<=2 467899::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 04689:;;<<===       ?;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ?}<9:=2{0{aTkk0?G{REn0Hik0@*#!KYdLKnv+~+.%6iSA[dXD=I+3"#'IkX1a|iJ,\25fZ4}nYX+2(Uo505O_e't!D8_LNDKGQQeaf#<&@48NhZ"㎁>G.Y]lse3'B"TN~vRi@kfaV@ ?}99::L2nXc@0wqi~u07 T\a0I0?)#!KCUhz,v(6/+^RU}}lip+)(('AlX7rʢ+U,5biGӍyl+2(Oj9C-Tǧbpl'x.XAk_2oL_nksftpo"B#JJGwdXb?A[vd"ѩBS$e8aji<1Q"a\sw^l|>se^]TF A8=:8,ð-~{ɔ/Ni_c* &DSdchԾH+E^\XouԝԇdQI)ChXP^oԬ֟qGd_@7"#5Xe[uz̤տۥȨn4Q?G\7 1Kgdfij췧פσnFB0KR#%# !:Kdnnĵ¯g\qgahKTMX]SUWP,GFeK6^xveV`p¿ɠ禉G@QYY]D4=8vjbz~_Žě㴭)$AB<:CǴ|ynsMyzwpp6Vrͺuݻi A8=:8,¬-yzȓ.Gj`_ʿ*#@N`afмS-C\ZTksљԝueZ/- GZmqh'-,BlX(zj{e`cfXiohkncUQN=1"MȞ85S`|Ucefw~P`8Ijj`TnyoBIFHҲX;ySH_cXWUR6Xbl[vͣ礃CBR\^`D>Wcuy̩ĽƜ䴱|2)@DJV_ʼnxkş{6Klʹpݼe A8=:8,򧍚-rdu~y/NiV_{* +CS^]`yP1F^]LdiÍԘtcZ5%AhXRXdƞǏЊ[zvSF/"):ZeWorƱ᭮޼QpPYi;#0E_^\qmƱڥݮϥVTDYb98.#}sPG{\pwQ{z7Rj`ttz~nM7oUpxZTYSUWTHFK5󈏎q;{׊lxdHt\w w֕V]DjAg5 >oX#9⦷tv}kGÈ DC515A69,󌔐 tw~BwWOXK6Vs\GRp vהS_}~Le{0Q*2`B{wr~oIą]&]>bS)0t vqĶJ9+dyX^jxroY `ll6)y\UzONVGMX[U_`mj_aD lldEs{Fy y[ScVn_S[PZVE> 뺪o~S2 si\yyshLv8҆W_[==<<<<=:7667:::i:g:g7Q8ہ8zv~9ed7wj6ya_a5U|4z}v4)$73;h4nKQ?==j5eK6?LD3pKEWU*e8Jc3d`Qlfg^QGT1.v VjE"ӗrg=I306@<@GUQLQ6 up{kHjyWxaCAES8^S;D27C5+ ᆴsyxt[3YJ\1KnZPPi6xEڋRZ ==========}= ======}==}= =}====}= }<-% ." .& 1!o? ")B1Z S5OR8(z*=+5IT9't40:4vOyA>C:R29QsYMMJO+1O5.MvjMHNMI<)|ͭ\,5`1UJdIUW}KMPS5-H60QJQsQMqI;9872rKVSL}}JTM4m򬭯53XGJKtQC|GwQLD/20YKMmMoqLyLYHRN4[۬.HNYQnCWxLOLm',=GAKxbNTN[I6xƬ15JRXFgaIRF-5%4^PNRpIJcuJ:1f.HPKLPzNj6GUFK]~N0( !@&\H[5kݳ  }<-% ." .& 1!o? ")B1Z S5OR8(z*=+5IT9't40:4vOyA>C:R29QsYMMJO+1O5.MvjMHNMI<)|ͭ\,5`1UJdIUW}KMPS5-H60QJQsQMqI;9872rKVSL}}JTM4m򬭯53XGJKtQC|GwQLD/20YKMmMoqLyLYHRN4[۬.HNYQnCWxLOLm',=GAKxbNTN[I6xƬ15JRXFgaIRF-5%4^PNRpIJcuJ:1f.HPKLPzNj6GUFK]~N0( !@&\H[5kݳ  }<-% ." .& 1!o? ")B1Z S5OR8(z*=+5IT9't40:4vOyA>C:R29QsYMMJO+1O5.MvjMHNMI<)|ͭ\,5`1UJdIUW}KMPS5-H60QJQsQMqI;9872rKVSL}}JTM4m򬭯53XGJKtQC|GwQLD/20YKMmMoqLyLYHRN4[۬.HNYQnCWxLOLm',=GAKxbNTN[I6xƬ15JRXFgaIRF-5%4^PNRpIJcuJ:1f.HPKLPzNj6GUFK]~N0( !@&\H[5kݳ  78:H87&d346.7220>&/l)6-36,O/U33241+s/챍>04144/)Tq552540@,63`a+28/,5Q*C25H.43<+;j*bC(KC159303!.8j3-Vl321522B!05>P/+tV23250-N$䨰r8-R=33;618234m#䰭Y,7e43F0451502#讬G0=f6,an02.b%謯w8.JO,2yS%鮫a7+^?/5%쬨K3/v-7E%A,&/l)6-36,O/U33241+s/챍>04144/)Tq552540@,63`a+28/,5Q*C25H.43<+;j*bC(KC159303!.8j3-Vl321522B!05>P/+tV23250-N$䨰r8-R=33;618234m#䰭Y,7e43F0451502#讬G0=f6,an02.b%謯w8.JO,2yS%鮫a7+^?/5%쬨K3/v-7E% A,&/l)6-36,O/U33241+s/챍>04144/)Tq552540@,63`a+28/,5Q*C25H.43<+;j*bC(KC159303!.8j3-Vl321522B!05>P/+tV23250-N$䨰r8-R=33;618234m#䰭Y,7e43F0451502#讬G0=f6,an02.b%謯w8.JO,2yS%鮫a7+^?/5%쬨K3/v-7E%A,jFHKLӥ^2iob_bjwf:ҌQa9o2b7=ȥ<GPcU-["33$P+&`Kv?)1>լn 4=B}h/P-N_ִL~ Xu;Gk8;.+QGnC,ST*MWXG4,W(Eyav #!|荁c]pHP[ 8`γˇ͔cmһ{ڀ4D8"~٨A;3-l39㧞ʛWJ<-tosٓm…QL:Ja%no؛qG6i$̩kGT'pu'꺜/-0-399999999 4688556666666666666_OG_x拀OȫhaH@=02YտԖǖ ]HwnntsuϺG26F$IϊlTtklxhsX̦~D+\7J3zP:[<qsm̢Mb.&& \V(όGN8ffndΠY-dq`~]`gzv:ӕQ`8m;n62Ш<GPcT-a!>%$O,&_Iu=+18֭o 546xi1D+IZ׵Py*Q};El5622PC&xF'MTm74:DOa_4#a">%P0)!aQZ>)3:ذm 5E3|>A5ARҰ[o'*xAT|9c7 *gU=WC,4bO0_EZ #ؿ#-`2EjHoV$E" rِiU_NbqI;\ֻ- 9 YXչk5.)mP.lϜwqJ&B>.t8#ƌc/30*zkm͂_~J7QJ\>%qfSy}Q;m$Ϧ||Mz8'ڛtZ< 7['꼢/-1-399999999!C 8BE]@;>62B<>618BE]4F56658<<<<<<<<<<<<<<;<;9'"P5)zZ 䐨)y nᜱ#%(ȃ,#?T&*@Vt=5 %ؼ/'54Ktnz7poL)a_82׾.gSrSvF"khuAGŕRg"$nV| İX7iv0>"%ʠ]JBTsXbG?pǧNvT  c2N›}NKn5 $ؾqŷm@Uڦw۱ÐPk6xܵםVAxӣӡuB9ſ֨R9 3$Йץ4AW3&$ñڰ7,/,%[ǺĴԧ9u-#ZĻǼA"H"&xЧ;5Mt1ޡ͢.7%%Q8#%ȼDi^/I> Qp^AV/ B~D}cl-d=!YIpxw! I(+I ̪v(0kuo >?0)QZ0 u4:hr}-%J>(*d},44x[̏ 0S8(5+|XǪTP9+&('<:;::a'P7(_ 랸)sߨ1))ʗ>/E+l50#L!!_քRB.-޿=8IBT؀|" Ib7vȼŎnG&жRLLD*%}R8Ï11E$|֩S51^9(6'̑⻴JI5k/%K#ܴ䶵A1RBBg14Q#BѨ3_4}Lb0/U k׿}cx&E384Yc>׎1L:.1ySs٬m;ɝA8$#kHF\ǖFJΌ%RSNQka+ 4NUɤC?_C$! DOTHd,-. ı9\İpN$+0#$ibdp$ɨDbgvͳ"MjjB!űcqjCF݌ εtrns`o}~{}ȪkⲙchpnX͠uA|̩ٓZr+2F] ۛn}zg|z-9,T4R귽iJ}乨;3$][-yŒWQ%V"X+UӔ{֑櫧|yio)O'UV@zѱz{{oYURP27U(A78sݟq`Lu`aolAs'5.4PZ=cݎyֳcbls{jnxE? IVldbyn]D󥁖|fpnxkrx}WS]UgpkqU}yvshmϧzvmhbȭBJGRf DSF1`j~hσW\QR90PZ[ xdQC9J8w]iYsmStGH_.˗4-:VR ࡪIca'OE`xȔmbnN|xY_CWHn1%CMB: ؃rpH9$(tƦ{OrBS󁴆rood]i7'QLs}F.'23 ܱiHD/c{jjpXQPhXLNdqnj%|bXf91mY$] 3aƏ֦tdKQma9L8|wtzxlisyZJ\&WWaUt̿yoYT]\YaUk{rmZnn]AÖUa@I?HL]ޱهͪmfbXRWeR`TcóqvSV+@PO]et{q侈}PC>JG79VR>ٻ̡foXRu^BC4?2>M `x`d4Xw/5J]Ar٪kukviUNn42H:++QC ^w{H4{o~D0523'ږyqmhvqKG:,A@6:LF hxvMsqI跂{S H[,ẙogpnwd@*6=9*1,&6> j|moUW8،nxjHFEYKnQtlmrvE'M4$!!6LO.W ŌSoY7美I0!& -:VQCA5$1f цфyeI;̧tWM[Hg!#mƦc4HSebhM0BA7*(@8=35`Ƀufaf}yXCghYl8E.>83ģ~mgi^Z(  IZ05%S려g~JLdOhd##8*ۮwhjrnZSY 0T`rtQ08=KѴwmrsQOh~x^Lazyz|hVIB=*.@wnr!Qt!+S΢zr{7F^yf`'9=ӻ׾imVbqD"vAAL;;ow1yfKWJ5]_E+G^Sb,2%fR=sykpn>C9. s^OIM[QTTHX^BmVq"igPswtpokst4&=IˢyVfOH\MSNDY|zpjVd?u{_vojpwlbxٵˣOpuS_e;IM:RUqT"ԙ{{lz`bszLBz3i!=Fvk@\'a[3r{Wtuk }6pC f_w"KT91=;}^wfe ӽƞ^ilzf+8K%9sds|uI]jf լvk^no2BD&G]lr{iidTɺȜ[ƣWmQlV|Yk~Lz֛̐InfSocK|>Ľmٵ}i9&tܮ7~-f+= w糮ͫkD U݆{# ̺i IJ 󜭳 Բ )6.x3h-+IZ+@!(&M06=#,мo'3C;&(,(yqYd^WM8;_ %}1::kѺ!,SF) EdT0Rdkcaj_n뢴rq~΄eUZXǫx鹘z[.8?AEؽ}f̓TևnrwYHnw¹|}v7?Rj ̾hTymnGH׼ǬM8^IOu:E0^2>X⥥o;kp~Q2?]xBC-`2,X7wpgNԳ_Ty]T*,V..T2[wnwYdEHOJFLz+O$*R'%OC[ozWbM@Q?6>O57T%+; %,8ׄCgLQDAXQLJUEo&+$#+DWτ1makD~cQvSE\dFU|?C ;OZJLpZE9Y`JuWTSn\KQ[uH797VVYbAmN~a@17UsUaLHbЪIB1:R khGJ'0wsv@A|a]J,WJH16񶷉:.5LEG W,H1*+ܦ|:81359zK_N76)˛6*7@5 ѐ;D&%XSfMY42B!bFkFB;F7h, &(?# ΛR'@'^rfO?DIxKFNP:I*HCkl) #vc>@Z`Pޢ^K`NK3SJR@6.46S̐lxeaXSI>:?"12x`kZgr1i1%154HZkcFEܵrE4/;:#*?%~بGO8k*`b*1'.$0B ҋ[N={W/Jcyn$A"ZеsDED]G="T/,"#H9 c]nR;'`]mZZ'!ݴnfHMT]WNk#)$0,"(:4 nr|gwB\M6ӎVXP= !@E.uBTPY]iIU&,)!("*0 `wlZ_B4"cTT[YU35>L=kW>]QjQZ6)G$#'7JK!S ̄\Tlnye>.cMR8:( ݝͻmI@-6>9 .?OG2+"3f ʎ~ρpUD3)ҭGIK,A& aئܰJ<]rx^V76?7)'%1#LƈsN83>NO9$w^5DD24%%"&͏ĢxREGBD  &J^++N씌a}ul\ ccSֱVXN[LMgQ3 ,C=j|GSU=0~GDzO85ͫsETtvjW7BQdP/5қ‹aWc){/)_U>qudgm;=2* ፨ֹUku`6HGnnY:3J}lUxS%t$k^Nqna]bcnr0"9I⎵Z>wl@UmXj}=9Rlu|XCU>ruyuIj`]gribyӍѧwYRO/QXj~~^g^c`bP̕oq̰w\xriQ~]iv=a̬ǛS}gt{wvZIcV<{ürsdy| -hԍØgR+yo 1eઈ\ *  lᥖY< S׊_nc$ ѭN ᶯn ngy  w j+-*t#_$% GZ%3($G&&0&܌*;3 #(&ӽ~|C.6d$qe25/tۡ!x*N9( qs?_I'UoffiZUYfWc򏌓wed|rЋz~]IJDƬf쥅lG$7;85ϸzkLr]g^MFanyݽ-@Zo ˨UNfTtkC>ǶǪ[Jq\]5I;e2F\ۑ\!gZшiLUj|:E0Y4*Y2^[wbuLܻȭnjzRI*-L-*Q,^gqr`ILÊMPPIGPu"C")F$ ICQTdsFv^RAD.$'-94J!&/& 6r=rzr>Gx="399:UFU+ +Qφ7tKSxZ}Dz_4T=@Q^8O (2!G K*E<5'Z,0|#%~i1RA23+ҍxl%3D7 Հ{@!0# exY9_s"E'#/A}m+U=11B$;  %;! ЄI%51&~oE5'#i7- c_V8EI8>;.K]') kTB'*F7&rce\V1A.3Bggkq/"A_cchN:E:,$kQa *_YAG3ݍSC+/$+.0&a2Vj~q]LIXG'1B(d^W?lⴛVuipKMA,'.?CGMfjqH<9G]JC:HAN<>258W]pG~Ɛ920'#dqmQ_R`m,vL$.69N`UZ+=XO$!0lvaƣ9F6g%gwbA$2&%:I uZ=:q)8Qdq[8!Umc:6?] # %M; R[UI0<:pUNM("Pha9GSQZCLh#&)!+A? \frVf=N-#x>K70 $=K%a/MPVVkAy2 '!+&"35 NhsKX6RALEHL11>N/bMB[NmQL1%="#4FH"Z |M[c_pO+ѧaFK40,×^L@+7B( ,=MB.'([ ǂtpmaF- nj8E?+7)VȔИ>:^nlMI2-A:"!%>"DytaA*%/78+fX:;/!/&%r}jK>>:>" :J'(B{Po,TZMCeGJR==oH4=KK920fM jWiWNR @qqsxJd`\epic{Ň\K>dmU_U0P,!voM^YtN]p@ ɋnkYiT\rւσ==Hr/Q'@Acd^hoAS>2@Y8kqOlnf 鎻op1qiFd>j`JM?56KMi^t]y~c Ӣ[+UwZo]` ./SKA=]^ouqiEUce ɗWVw~]v]G\:LG"=?_^g^c`cRbyNnKcBFRk[U]dt@h7_tT*XXHRZns_I`S=zըkžf|uh &MÖdQ ynܖ+_ҿɪa ({ bzwΉa? JָuܧWyn& F ުlQ| cPa shj ^...+`#&OZ($ B"/)u'90 $$ ͯ~zr[eWPf͘┉x~Ͱs;OnBddasᲆ˞lzz>QlP)(:Tn򁪇kŏ_oBƅX:TAdvʰnX qzün bDrgދʫސ[]Ԧ Zwa쒥xyd卥®~{Zv_wl}bwnj uwuwsTxwbpnq{y}ikskQjQnsk5NZ_EVU,P|h xtln|VF{ueUe\\/zj2{ Ɩc|DX PLav}ltǹítOv xFA`aIER[T^,ȱˎ^yΌpf_`bPPYZqɼbmxs`wyu}zћXQLz E٦ {pgek]ztTu<nZʞqmmuŋ癠ynB[=Aɕ~|nsn}許sWj{o|{Ѵǿivn}x赲ç~yluݑeØϬöƱz˗ae\Gǝ{iItgOWzk]\}mf~}>=nîlp|vxҸ]{b+0͘wf[|rWeo{hg~ͽÆz|>HRVzgmθɎLFϸzx|dڰxay¼̯d ynjSuѪ˜пҺp碅rqыA}̃⢀]kmnǡֺsuⷾ͠՚m~fj}岷ĤȬU]}"yٳi{qʖss0hʴRCILXYdjnptkV島۰»ǽɚŌgHNpZKMxQ𗉚پԡ{ZTNUlm\]nip鐑jXϸƽ~rCDidAErU~4́мȑe_ExrP~e$sĄؿlenNWKpdžtq|FdGĮVŧy1ÕҸțáɖcNڻ䷢vѻƫѩxʴhšpݷϰͭӞòù̴LðZº,*Z6ȇpͿȿξķɪŁu˷qgýӇ|kY[cF5>T-))/2G.XK |xhjyUEytc񍅕>ACB[ON&l_ ǚ^vDU =6HZ\MUdcjjvot 霶ķpKu vm]/.CE-)7A8BǰNJ]y aJD@AC14<|H:I*ĩF(c<씬š{õv{vU`Y#1K;W+:C?iA Ēyytli=BG@A@GK?BJ4QAxjPiNkpm~uHu %@G $7E> z`fxTDxsc w]o8/11? =P#RhS ɜZr<~X 4*1CL7?ONWXe`cz 鞸ʻfLq i\P)/7:")4.: ċZv {J<9568&',!q9 溸n[ixBF/E=T>=E;HZRK}Fأ zpJJHDSS@1RMuPj\xnKkv6!oWɟT_?@`jB@Z_T瞥ri?V:@Ð~gC[K?`rH9ebeFmTgu{}~JWN>[fPEfbtSαbqu^EYW=]cMC]WsP겯vspp@lN2itI9dWqEݔe˥}|c?[vRkzpGieaedW>D=%C8*(GA8,C=C}t13djZEIbBCq\I@wxpβtNpZ"*Ï44$R?::@LG=IM^˸|}hul.@hd]H3Jom72|uݾɽRVNnC`aMjTțĿV_N8OWCUQiSPhQӄ? p{ξbG&6MC&WhT7l]Ěʭhlz×ΟY2C-YBWHcZDbHzJQqrw[8LU[N>rXRqe᥺df&bű$(74 :C?>31嶵ү̨wnpz[G-/J=23_J/VIĮw%115DG<>HK>L5愋dZϺȥۄFL$!?4$MF!hA}2 z˾ҧR>> MGC.cOJpDꚖpVmǰ@5A!)KPN=K_@q~zm7WEſSɚxg,ե͵ΏuUE⦆s}qШ^|ɹau˟j̔dἬʤԇ|e=BakV֨a=@YԐ9O[87iՕ@ΐ޿̋ʅ̆øǏsѴӍjXZc>-7P6:23,BG@88@)2C8J]ZTwy/K1172+,'*"+0(0-./*)'BR2/0&5&%%*-C2Fdy~=  &    #  "    ܦӪ]ҌsIJѾlnjgԜ{pbiɵvhya\amh{o`[\^gu~ԽkXsRmpsrlnYVN[X]l~kt{ng[Vdzl`QPQ^`WSfYy||~WJQWlodODZZ`QXgx}vvyR|RrQ_ZLNPNG9Ddkztxy~ʷ؝VDHGWRL=2>UlݛwcqruqsȘj{qaZOHGEZRU_YCil嚂sjkpqeαpqIti^ZVVLBFLVV\Ovgz{oikYyZ\^eidg_WJOOZST\[zxqpcdypoinghlom_VPQ_[V]YXxh݂vuqx^g`Wguplmljdc[`i^d`Y\ohyysqqztdbkmrlfinidZMRYWT\tpܰvxgsokonib\KNUYT\ge~~wqmme^LESVUXcwq{||lyݍ闛||}xrgfaUAGUXWZfpvɲvvxpeaUEBKUZ^afqpĢѤ|onidWF>LQX[ahjoydȾͥѫ{~wqcS;:?JU`_dii}SƄԹ}zyurqyxfXMWQN[_ajehsֿƲ՟ۼytnpllnoyxlb\ej]afhllߵ|}pcd``e{w`cvrpeil򫂌urqdfb\QWiun^^bgv}~kxٮģsrdgx`V_[M^_cWelbrqٳxmesqiidbQLSSV]fdlzڌGtεrtodinjY\ULTFX\bqqAP"R˽΂mmqscej_QJPOJT_q3' /]jȈhjpun^beYIJBTYoS>;>#&-@}~Mّvqgqj]T`N5J_xW%(7&*9A0'IU^msmboi`_>Gc,30+78:K3#;2IEܭOcpyz|ne_YUYU%1)+9"*A/-B;0[Z8bd`jy~qQTX_n.ARA>4U++<$-/)/*0a|}bYjSMaMo &(-(=G//0782D-K;BS`]oihoxy{rhT &H\,;)+1D!ADI=?,/197/@kvuj\a`o{xq\ ߱ł"9;>*%'5-=#3,E'2-.-,8ChepqEg~wo {yuu>2TI8;;.*#14>.>G;/+,/(kl|vcmr~~v~q}qa|01?3-:D-+;9'(HP:[U'22%N|y}ecawu|{L-/24B14D&*9G0-3.,1+(9,7k^}tgwšl|/4<638)/C.&'*AH1A31.M6*-8MxeYsqmnd/*0@S/:>*D14*24-:..+-)30hjbcbi~vy92<.)$<13;+5f2:43-<053nVrm}DSfixc=   &   $   )   ͍ŸȰm6ܦiy|PYfinpDY?e?6f|raFQBiIK[ziwmX}o?RQLyن?<[8D?PRRDDHIFJTRR\P=O/JLKFJP693@?FYbCXQVXLٍOI=8@NEB913@A>:Q6MYVVOR^tu_\m>189/,11+%0F}wCZNQPSS^Ŭ~dyz=+//221* 0:P݃LAMMNIGtxL]tSC?:20/729EC0LNTOGGKK>eOS-UJ?;9<2',,688@6TI]V_YLED6ˍ_W9>DCGBE>9,..1:35==\ZoLWY^OC=xMJNGEFFHHF;415;97?;?ZJeWXMKT;C[aVT;8GONIHDA:;7=G=FC:BQJܵWWPXctkPOepJLB@BINF>>B>=5*0;:4@TPܗdVQsnqhD\j_XTX^NICDC@;9)+396:JcDkY\`^}`цk_]UW[SIEDE>5$.7;:>EOmQ񦨡ΨϔnmfbjYJJLHA?8)(26=CHG`b1ֱĦdyƿ°eVSSPNN]STC93>84BDCLNK^[ג~ɸ`TNKNKJHISQGA:CH=CGJK_IÎu{ҫ[[NEFCCA@BV^SINTZMLXDGZLTDkfLfgVMR\]ZkkX?HHK_J_n\[QqHFV?MOOKMJ`ci`LOVhifk]17SKKHYp_TV_XH=bW("$,'#%"h|'17/),4!gW=^ X=>naL$,ie >+--./5viadG\sa( !9n(%+**%&KVfjZ1AX7'%$"/,06i-/'&('p}{bA-68.#! %7/E-=;-#"n]21"+(-'* # "=AV%:44)&"Mq}5-/((#$&'' "&9.I28.'2"0/,3(3+''$"&$!(/-95-:?NL*&8B +!%*" $13C9*Mf?F?08+/).6)$!  .?%L9<;5ZQ3]S7).&(-+! " ! $9N1A95(7s:^<;4.#!%## ! #.I1}g_|xdAA:5>, $(% !#%"/<+߶tTIjjuJB67-4:*!##$  %*(30%֠}r{w{WetvR>9/--*0-) %"!$**FGօ{:Qg<337/)'2,1%%),)02(8IntbXUm:21./*)!#.-%"$)"&*.*:*חeXOW7<2(*()%" 1910<.2+(2֧b:E7@yx566-11,-.35*"($3=1GoodM][^>D62C,$/+./3!)+9( SMKRtru|C?8DB;>87% '%"$*(#;BS*LM~k=FC;AGE15-$,*)-$220'DnSdpSN?AGK=?H=0(/+"&/(S1(2,;66$-/2[P2oREEJLA8GD:5C4"(@S"%3$2::.+>8w=UG9G;;LM>,886N%>RC=6W)$2%./)2/(AHHB39=JC8=;+B-[ %.+>G-*)96-9+M816>;FR:6;BJ;2936+~ )D]/9').@DA?/;*/.43)&7CE?79# $0,*- ՟aju~9=<& %3-?"/&A#/+.3/032/:I:(5%0-5 \mjBaDTifu?3UG479,*/6@,>F6(().,J718A8,02(-dSRqN^oPMJ\6|1*=1+9A,+:6!"LY7LL!.005B3+*7:*Idmf3}{GEQ\iXN"+02A.3F%&1=.47,$,((3-*3C+66JCrbb:X\FbWVVkjD10:425($=/,&AL2://1*15)39>5B [h;0JE@>[\Ykuur6\ް+&->P.;=%<32'/4'6-120)//<.As8>?<>O^]akm{rhGѪ2:D--'9+%/#8n/7//+7+5'E2cOob!(:=LUY_lst~e?===<=}<54;((Q66f*(f2X.K@(}e2FC5h/e=?-nCGq+ȟxJClo*ֻ[aOIZf%e6Jf}#jQLa$װn^ cܾɳ_Kٯu0wnh \,grv-RFQ}tв-~dJi.m}.W.n019::::=;:<;a:::}{6===<=><>=}<54?#$Q44z3(b2W>j`1sZ-krGa/{gj0jo-㫇smX+1fqnV$违@>so$ۭaSrhR$ǯ}NgXYO–w}=}t4I##R47ے=+d2[P?o^0ޕ_b-,/՝[+nC-rT&ݝaSgHKr#_KPM5LU%sZCZ"==^&TY`TNI32C kr>_K1:D=HA%!egK$:6H=G:A?3 >,HDE=;Kf2C7615=n.,G=M 2pC/+PaW-.尫P3dRLUKLNLA,h5-RK`JNwXJPrl,$⪣5.}SRMc{H{MsK60;3SKDKNGwrL6;᫭02fJJIQeKKuSMN4^ମq4BRMZ^LJ`HioLG`34ି2=MN~PM[INKA^A0a6G\MwGsYLSt6A᫨E46VUQHwGLLq5'ݭ.2OSNMrSOJIq]4_ݭ(EKMKGyIq0)eEMFJrI4y@55DS21 +9MLB- %:QDAi0+}"#"" + , * * ) % 3w% G?:A& .NO<,P%;4OLt6+n!筫o0QTId2=y쯮6,KUjMKP>尫P3dRLUKLNLA,h5-RK`JNwXJPrl,$⪣5.}SRMc{H{MsK60;3SKDKNGwrL6;᫭02fJJIQeKKuSMN4^ମq4BRMZ^LJ`HioLG`34ି2=MN~PM[INKA^A0a6G\MwGsYLSt6A᫨E46VUQHwGLLq5'ݭ.2OSNMrSOJIq]4_ݭ(EKMKGyIq0)eEMFJrI4y@55DS21 +9MLB- %:QDAi0+}"#"" + , * * ) % 3w% G?:A& .NO<,P%;4OLt6+n!筫o0QTId2=y쯮6,KUjMKP>尫P3dRLUKLNLA,h宭5-RK`JNwXJPrl,$஭5.}SRMc{H{MsK60;3SKDKNGwrL6;᪮02fJJIQeKKuSMN4^૮q4BRMZ^LJ`HioLG`34િ2=MN~PM[INKA^A0a6G\MwGsYLSt6A᫨E46VUQHwGLLq5'ݭ.2OSNMrSOJIq]4_ݭ(EKMKGyIq0)eEMFJrI4y@55DS21 +9MLB- %:QDAi0+}"#"";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/5..9.55555555555555555555879ɯ7:I/5/:/9555555555555555555556868;I/....8;;;;;;;;;;;;;;;;;;;;;95~C^m7g2:I-5;6{V6PMOP,MHUHT,FJQDR8VRNJ,wT55555555555555555555555555555556- 1> -665u7surt,xrwws6syrut,qwvm667777777777777777777777777777777 -1 4 -865,-,ĥ,566666666666666666666666666666667 -1 4 "6666666666666666666666666 ! !!ݔڛ!՝! ! ! !!!!!̬!!!!!!s!!!! 4"S$7777777777777777777777777 %$#Z}#\[# l# # Ý# # i#w##Ʉ#e#]####\####!#"6%<<<<<<<<<<<<<<<<<<<<<<<<<$ $ $ Kkvvb$ Ah:XG$FNV$]H`$@Q$[X$lY$[$$j$X$Y$$$w$xR$%&$!"#) b¹Z+**) 6盍%IPD 92^[A#KοNɰD7'>' 08|&1b0EN^ s8Ŵ5'0a| 8/1* "WHkظUF8:yɷݔ4o]$')E4Re2 #0H}2ON-6W=9|Iֿ#=Ⱥ>>>#R~SE'$$EeE)*m(6 WQ}&fyB+L\>+d² mM0,G4S?#-6LWA & ZO(:"2A/)&@,E* p,aR&b./(Yrʴg& &\C )43M2fpt>PYXD# ݧ܃dCt,=Ib*0Z;Imli=nedYc8V ݹInh6_6f+!ȋ<^!!$&+gT|n?4C)jSA)8";K"+!A$&"?lp$*Hq{yts32!N^3~t9Ac-g`ksM9@\},m^*{O~-ގri$t !W.Sx%tq^=od/y8 \,jm1g}}i.wj3Wei{WEZ9|xit-rBϸf}[>h+tsR ?(`7ظywRHMf639VP_Z .Zs-Fl/Ern| \d<$IedC򱔅6)t] $fz"u?&D{ʴƄmӳm ;>?06)Q8Aԏ1g׀ǃq#0c'$%3)d %+~B#$BRVmG'hqr{loc  4 1TQ~ԺA!$*M@BFַT0i! 9ytM%PE!% v{C3L:' 2-7I#4:75S5,yB?v1%3#=l%8% !#5W/&" !;6K=#)(6;&# ʦu*=a> 8,1" 8 3 25j (+&G~789ȥ=>lQгJ!#2 p!̍!Z@ 2`ȵ *&)  J7|,f+a{~V_"/g': *A= >,D+j * SZs o%c\';N4ѶLKY ->*/\Yy͗!!$37=Yث8J<#""%82#) 24ZjE)F~u9)?:Q%;/(: 59 ;4ep[yAEmʃ^q7'$[ '"QW&X. wyVMx˝u+GK!n$).!36-*-">x+Ȟk/6$Uz07<ʛ9*!8.dvUZM\[omd"D=5je*,&)Md &$Lz! p=gd.Sfe,K.:~1$6 .. D~/acC~616̷=mn7/]?(y< (23bpQ^oxU,&蟊a`e)V$6?:Ÿu)' pKfKb!dU`zM*\J,%(* [qyLUx1`\ODj[7Hݖ}0&/jxZcxwM:+T }cjY gcJF [PxyDWgVXW lb޺cpa$7)՞myR@g@sy`zC>'fy=،p<=C1t\J I_ɂ z+~ywcK=nwt,acfx~ 鬁wf@|af}{mdi ~tiPVaoq{tqT?vc xnZh ^vWr ʠd- Q~Ht<! Ȇ,^&-,  ^Jo]869* aC8') x'l5 '!/|pr#"#qdR^$!7Yf\k~X])+;Sm/xc`'DX-eO~{UfZ:0:v3]^ G.@1laKZnmjoP!I5Wh@a{!%)K:\/$^)3Yԇ3cOg|Q\?+.Q/83+>>^ur'6.3@hE>4.`_f%d5(HcHHlEZK(]>*MLOiC?6B*@p"2%%ZTCy-׷M:_uLFQ[#!*HL82NFmN(N0G+lU_w3.Q;FC8?,9JfE;EbVH`/;!ZH]y-)39H&)GK=6 ;85/5Hvi"6/!0 2m/=*)DXHpKWFUVv;l~QGNn>.5TG&2cUu$#1U_-F/>OKD2-K278EJ_bbnZ$;-QU]T(4WDk~h`($?+*.>#%_(13%BIQt6/:q+Wgq9;*)9QMzd4! ,U@4yA,H39RFGJ ]i(3T_r'VI"I^xNi"86+-:pxz%2% Wv)jB#).r H_f_HAGk%-Z+dnucgJ@\KkyK:RAFC)Z^t c`Rb&W{P4NfU<+7HU_NgUmK"\R6x"48MH5p4-7(5D/TO@(*.Y0/L4^-aoiVXCL6yF O?t H!K)vke2oVm2UkxBgFA@}`Xd6;7P@0711Vye<~ip LiT`=GL4Rt36MQ-eq`q:67H/h@$:Q)w+H,;8Kyj`j\gdGuSO~<<4ELdFTEyH?#~ BCpvi$.'*<wcNM+JӶRHF=>G4?IQ9 &7Ca*%690umCNsTA;0@C$O>۞nD9/>;)"U*:2Ff|OV!-76I)n6u]Չ;M<.()^-,rA4n:I/B :C':iwH\(?'.*31 A+8*i10"/ D# ,j ">=3i"@84%3 .!ˡf>Di 81ZnU<.'(37#Zؤ`:H/2+3A3(%-32(?{ؗaE287;?::2/$#):,4{ֺ{VL@=76`57@9;5;0>9; )'fydDC;4<6:<785?:89/<7& o۸o166:;;95/@:?;:9#-;`ʖP>>4>;6484157::>=6!=IÅK:=??6688107:<<48=M'$UĹKQ9<::7;:942429635>X/ңJ5<2,34:7<::=0*(-6A?Ѓ781A@02B<751RvQK<:6מn:69H92.78,:iϙV>@B9=:?-58,-|ԫE57@0:8@:>j}ȸS@62737E*+S8=;:2+-5M Ŕ6/7<05498 ծW-K/+A8<99[˨Z2J>>=:0*Bܔ_61CB9<7;0jM9;03?21)8Aޮw)='7=>607vЊ`6+90?;259=PøA541;5?22:7@^} ƻk-((4SC:;523:IqK ڎM./5BVA8=599;5>*WH@S=>ǡdA6K3<8;@A<3/595*E><3+Q@9D.>D>;?34746=9@:=?: žL727B3G61A2:;814464?9- Ɏ_6-0A:559:/4-2=3936674 ƶZ!?=89+/3E7-3(524@A06(γ^47<>712CL?876240@034GvN1;K;1B6=H5-9C-3131242 ӫa77L0>?063831(><@=82Mb L@DKyqtu6$=SdweXKRͭqȲIʰĹϿɽ͹چȬݿؤ¾۷ҾתȰռֻͷʣrj~Wlwojgz[gH:`X{zqIQbYhZ_}vۂѰq[e3>887-10;G88?4@4,7:D39-8::9?3//I995B>=K8;0:֯Lu274:4<8./?60<>:-99;2-;:5-+FC1D>479F@-5:;A<88:>ܪ`cVA4:9663:5,;605<995:5>:9@6:0I>;=G@A@26.7B>7073?}S>6<;H::6;;9;4.+3256C;4<;B782ON?:;=;8;4=75;6<@:@9;ƳJ<:1.0C+1<8;?8:=158/;3<:;=28;1<@706AA=D7:7<:672668;=ۀŇBC:;8635=>C=78:<2419C<78-86@5>@>D?9.3+;?1I<9>6027=@35ܖ@6;8B;5@=7<;94=9458MF/98::B;;87.A874.89G?8B<8>5>0;@C<5b=:97=-+93:8:1:-121-,,2:739;7:6J,T:/?915?JM76D-8;C=6,0E:ـl^K:8-:4?2BB=80nD>31>?J<3/57=9;5=O>5;E;6>D=;=6FEG42A3196Be7;;1.=:C45=?>9C29F686;5<:42>@73D>6=@7<8;1>;<1A@B79@CA568ՙ96@E60;8498<<;AP0@<9<-+4/79C9C;.,:A=LB>7<-8A@8<@35448@;6551#0..0359==;0279<73=IA=C?8/BHC=46=8<40F265/6F:,37@;65,=5=AG;:=->4264575;9;*͞mI:5==09>>=07-9484450,+G5522_8:4IE?@56@D09=695E,;<9/2,876:<70:107;;57<<784916R89-7-T87;9F<094<ҲT:2C;D:FC=99@99F6/G;/FA:&&8@56=S7I?5:;;@3<<5484=ٔD259=768B@5687C7>9;::<086;5<8764<<:-5:<28=445@97:DEA/21:;@2,;::>;A=?93-B7>6607680/409+5,897004,ѯ@6>97127/79<69><@90?2537<85359=C?4+0B8><@:=*<99:822:?1,25-?C=Ӏ762/747<787762>-78:6<9;<:=:2/*:;=6016964,394?:83*;>54:?041:/5جa2502=D?<434:<9?66<>9<:C777@@/079505509\K9?61;:-62>,ڱS17:78@9;80062<<911?8:578;856BG20:>6>27-8?H531BC97+007?3:>4385?5>2881<0:47=22;8X=/61:@H;?:641,@86:3)45;DINywu1-,9+)1+9d.22(%41:+,4871=+1<+--4/31,+78/,=9+190403)412'66803697++.1'7<-'2/+0/22k9J)72.1$$-%.1=281&$783F<6/4%/3:566/4:(*1>5'꼁(A7462(/'022',)'1>50)+-67*+093**+(")$(++-1574)+,/30-2>617+۰\233960'9?:4+-4/3+'=)-0(.=4&-1:50/&5+38<0/3%4+*-.0.072196%,I,13-*+$&+5,236-+01*'-037-4>=C=23/1+:/<5368:+B50,+12/0,833"ݩqE0+63&0654'.$0+/++,'#"@-,'*)/1,A=783:92.1.6,2'$0:,**.,,-/&+r6(,<9&05-0,<#230&)#/.-44-%1('.22,.34-.+-%*H0/$.%H,.43@6*3,4O0%9891=;3&/#"0<.1.454016.-=-&>1$;6//7**1I.A5-3//6-76/.2,5=*,/3,+-76+,.-;/612113'0.3-3.,))442%/34)/44>3"/<=<5+#*).-+%8]-5./0.5*++70-1<=9')(127*$321604271+%;06..(/.0('+'0",#//-&&1$;.7/-'+0(014-15481(6),*.40-+.1475,#(:064925"41230)+38+%*-%7>4}1/*&-)0511//.*6%/02-3023252*("013-().0.-%,0,722,"27/.38*.,4*,c*,(*5<74,+*0317--35-20:.*06$(490,06,67%$+1/%(&(.M7.6,%/7&+#7&S(/2/08130(',)440((6.0,//1.+,:@)'27.4(.$.3>*'$27//$)(4A8.$&1)K05:6/7*15+).,7-5)//(3'4.-4()2.Q5'/)06@250*'%3,.64$-,29-4..+-01<9?<433<41-2'1C7,5-,399@/.*,02B;7W24/3+;;<:798:3:55:7985.-4/E:;H>0+78/3*=5?5Pa:5;8264?4;67557?4105<5=910.GDAB5-3981D86<29@\:833*3;/<36256:9<9;78<>:..6479A99D40/11;37/.<29]7:8?>24985-+78A:302+;<77564627?4.784@/3=C3=6:5/,Lv}¾;69G0&#:I2:13;<;<3>545>732AA9;;566/&512+69+2:8>40&55EB+,:>A5945H6;21&6-;;7:2=9832:=/.08020D58<;5;390TmŽ6;96;9@:>B867=98-E4,9,,-5261=;43C4+245)5904,6156.2;M.33,3):H@93=@1;3./?I5=.28>6E@989<9331.*5246/;63,.-21p6.0+.8L:;60726:3570>=9504?;58;844920635>:<:6-075?(7CI6B26794"@&1A-J:449<<53=880856-+,9:;79/5768518.L=`G3:C-0@C754<233?C<9:6?954233-768<60-/3,4;?15/33)/;56=769**<6=54-C;,1/;Iđw4-567485:<887748=<<677/0;>71,44600&'2.?G952:&@<:/7'atã]5789;81,2;>9>2,8=66@=18*05266<=3/915B4,051338034;759Nj;88@4?766<60D4/>> 28;:51N>37)%+61=003.*30'177:--5,%3w~I8795<6;6=;B8-<=E/+23=:@G0/50'3115.<90,60<52.7)04(18b}ĦTC<-5:;8F/*04:C@7A;49;..--06.6.$%.E33,9.&.?/5Uf/93:@º90H2209@<5)7.657;5-+46?;4+5(>2.57B76=@C:6749D>;57:792(4Pu8-3.6>D/25<11383><8)..47;4)0.5;H;<>88;>>43+/277B><;5812;5;.475<3:5;3)-50..0-0193?5:0J488<=98:@;57:331311264/1-u3ACE.=41-883.23<;B8-*7A7;F90213=428>2A77.1662+41.>09?t'7>7694*./,5:BJJ6:98616@7C>;0%08493$*-594/?;5136:?3/G8D>6:?59>2/5E7?89C>>75,2:A=><302:2#.307<:G-B==1395<;:;,+0C;1-2>>6==4?;9;5?>590/><*2:<551./37?/0-a/6G08/>3>3800;?C:4+;A5:=42;7=0:9<9;:>7:4:27<=85:;D0./..lļ-B><68>57/7-9668+3-=9=95+1A2?91)55CA663.+0685;:,;-21);7hI<5;1."<01,;%,=+<57(/9-65C<>3B9:/D5986?507,.3148-+..7A2^KwieSo}YdI_E8F3EC96;@=9;:=+<81498?723.8/,09<-..B-n֫ҽĿDAD26?@:.37337.3A96//(/97C3122-G:::1=4TγD,B61H<29@>18<:?76;48<;58=102<:;8=58*)sƪv5DP@G?9(9876G29I615J7;/+51326-.)37-21+Hǹu@@H<015B9//554;3<<.;<@561/=,()66;357=HCkϢ׼ɸzz?DD>;HT6;+?283E}3596E59882:=?D>;;BA/A;+47/41/7>8030//6DjM8535=4C@9C718C<980+3EE;;5F9/8')6=-,-040348H3.r3&P=:467BA@1VD/=4*)@B?6=71A>>8?B@,5I=8?7880($-0-/2//<0(65?YR/:;$;AK@17A:<6679:6;A-21>t}5./@V;=H95HE@K<<1?@14-45DM1861A<<6:>92A46C9-*8:74;99>/4+,,-H:*7'60E9:@6=4>13353?67964375:59422.3358:DdjyMY<>?2*E7=;?;86;=A9E4EE@H3B1=17IE;4;;E;++5A;62521/+'9+8:22,O{UbBP6&/5589=B9;;@C1=?9C>6:019??5:6<::<0@>33..,26+;;>:-4=9.338YzhLT?M6/35=2ND=@9660/BBF@5@9;559D9;;F=?9F63.+'D<2-51868<45-388qu-7$)-./4<7><7990<;KL0=;C<75:BL688IGL>I.9046<8-K2/560865583>995@C?D(09A2=79-<96783D10,5/)ezNTB(&3,;2C4+).A>5/8HA-?6':>5;7C@9113?;Q2A9;73-=EFB37>C7?5-/EX-)5><9;3.GHDA>PDCHA52/568CGG@8A*5.J*>E8;B:4*1@J;@I?BA2A@/(:54@5--60@81~¼B7-'9>;5?DE77HD:71380:81:84>?:25:5/kI>+%*A?*2?D@C>Q-311=,)55DE7-9C9:5/;A?41754=C.>362./818(7¯`=*09/@58J;:3;8=C6.6-]30);8,-570<6>92/%54.=,-4/>2547@2082=J;*0B>F246/,6349.42263@9M<53@7A62451',*,).4/+9@űf9;(+A;.6,:?70:CE9;39,7?;/6GMAFAGX+3/(,,6(5<=/7(0,'2 P@-/ &#y+&@130>BJ76-;5F>=@35/451887/?G<:390&)84;53<;4:46?87/*4;2.)If)_Z|27-43-0;2GK28:OAG;<>/IGAC02;DH::40-)@,0822@28>AGE<99243?472/+FI<>;?ADL;<;,C%BK:80>;67:75:4S9798A8}3@!2/93,6B2+7.@:B60;373<0=B7)7+,?A9=:;4:A<46=A,4.6C386388K94t214+99*+T90/;42>8R>>6<:6ED/904928;36$9==303.2:023/362<8;6.=U22)49/,/+70.I@9'7<22>665=E<@9,>96?7:94?:;318)8E9181),81=K5;-30UaTZZ\VS``ZYb]TX`SOW`W_W`Z_]OKch[SOOT[|}[YicU`dWb_ebZYY`XUQVKUfZRZRQV\\cRQMPVVf_ZxσXZUYQaab`]_^`Y`[YY^[]\YQOYTj_andVQZ[SVObZe[s^Z`]VZYeZa\]ZZ[b[WTY\U`^YUSligi[TZ]\Uh][aX^f^\WWNW_UbY\WYZ]\e``[VZ_aZR[Y\`h``kXUUWV`X\TTaV]|[^\cbVX_^[SPZ\d][WWO\\[ZXZV]eZT\\YfVXbhXbY^YTQl_Z]kTJG`oX`VV^`_eZcYWYb[WRbbZ__YZZRJ[XWP[^PR[Z`[THYYigOP]dg[_XWkZ_[XKZSb^XYS]ZYWV^aSPU^XWUiZ]][UZZ]TtZZXY^]d`dh^\]c_^RjYQ^QQRZVZUa_XWgXPWXZMX_WZQ\WZ[SX`mπ RWVOVL^nf_YcfWaYSTdnZbSW]bZid]\]`]XXVSNXX[]T`[XQSRWTZUWNQ\paa\V\W[_XZ\Ucb^ZUYc_Y\_\XX]WU[XYb`c`[RU\ZdacblgfRZfmZhX\]^YGeKVfRo_YY^a`YWa\\T\Y[RPQ]]a^`UY[\^[W^So^zϸiX_iSVfi][ZbXYYejc``\e_[VSTST_\]`WSQT[TZ`dVZTXTJO\V[b٥hb_SZY__`_UZ^fd^]`bea]QVOMUZTNENKPVW_KHZ[bZYLcZLQTahĭZS[\]Z^[`b^^]^[_dbb[\]ST^a]WPVTVRTKDPHWb^ZW_Id`]Q\Nπֽ{[]^_a^WRXad_dYS_d[[ebV^PUZWZW\[TR^VVcTJMZVXX]UXY^\]\gׇa^^fZe]\\b\Vj\VedcW]`_[WtcWYICIWTaUW[TNXULV\]`SSXQLUp_^aV\V[Zfbh]XfdkSOWZedkrZTYTJVTNRQ]ZPLWUa[XR[MTXKPV{ڼͱyjccVS[_ZWgT[_d`lTMTYakg^hbX]_QQRKO[QYPFHSjXYP]RJSbSWr̉bfbd_ZbZYShg]W\[WUPQ\hc^^b^`UY]_WbZ^]LPldVOWT_ZXQRWSLNͥX_jc`]]W^ZZT`fWSWT\V\Z[T]eYZWWS][X[\Z^[fSXYZRP]`X^OONoͣRj^Q\][TNT_Y`d[\QXSSZm_\_YVUYcb`SPSQWR]WSQl]TOlcU`Y^ad[oVUT]d`YLZS[\bb\ROUWcaZQZL^XU\^i[Zadg^Z[X]ic`Z\_]_XLUkeWXS[biSVY_STW]Zfb]MOOX]a\OUR[bobcd^]adcZYQW[__fcaa[]USj^^U[^\`W^W]SLRYYUSTNQU_Xk]`Up[_`dea_bhc\^aWVTUVVW[ZTTN_hemVe[UQ\[TOSWbch`RMY^kXZY[VTV^Yge\Zaca_XXIFBLLOZ^Z]_YY`\^c[XjLS^TRX\gacabZML\g\`k^WYXZd_[^dYh^^TUXUPOXURbU_eL\db^_YMQRNY^hrqfhhZ^OSZ_mWX\VPVd``]VZg^jebVIRXY]WHOR[^YTef]WXZ^cWSk^ledfi^^cXV_k^f^`jeed]ZOSahdec[UV\VGRWU\b`gRgchYZ^X`_^_PRXkaVOTbd]ghcZea`c]ge[]POecRZbd[ZURSW[cSVSPZkT[P]]gZ\UTX^hd[O_g\ad[Yb_d]`Waga`d\^X^UZaa]Z`akVSRRЃRkhf]]babZ^U_W[bSYRa_d`\RXhYfdYM[aig\ZWROSY]Z`_Q`RWVK_[qhaeYTGi[ZSdOQcWc\]LU`T]\jceZi_aUj[_^[cYTZOSXVY[PNQQZeU{ЀkoϜv}cl_jYlj`]bgd`^bkT^^WZ^\c[UVS]TRPY\MPQfPԷɽkgiY^hhbV\_\V^Y[d_[VUNU][fWVWWOj\]]T_Vo˵kQh_[rf\cjh[_caf^Z_Y_dc[\`UTV``^c[[KHš[jviqicRcba`oY`p]T[p`cVQYTWVZQRMW[RVTLchgofZ[_lcYY_]\c[d`Uegh\[URaPLNVW[TX]bkZףjnojer~aeUj]a[mdfce`g]cRVSYT^YXW]O[[horQȰͪs}ÄgZ]a]k[_^_W^`biecehsahaRYZRXURZd^VZWWVZc{gT__`c[ifhpcX]fc``VR[dmbX`ol]WSckmee\rfWYGFQXQPQSZVYZ_nWPXGliib^_jhqbpYcZOIhjg]c]WgdjbghhS_uibf^cXOC=FSPSVUUbVO^[bxhKYZDdlvj[akfga^etbed^`i^_ed]_gaeidkc_oZKVcSP[VKNVY\[`RdTYVaƢOKOavafsd_rogrbbXefVXW^_mw\c`[lgf`bfaZfb[eWSP^`]\b^^cdQTJONPiPHUCSMofgj`g^dq`XWV_dornpp_bkcbehj\ZZVc_]]XZY][a`aZWZTWSTX_gjv\`k^Woagegda^cejbm^oojq\kZf[atpe]bai]PTaga\X[YWSNK]O\ZTVOrgs[qYHQ\Z]cglceejm[gjdnh`dZZagg_dagfdeWfg[[XTRX\Q`_`ZKTa_SYY^y]nbqTISPY\xohlebbc][ooi_kaa[[_ocffrjj`mjbULLjbXT[VXVSZY]VY`adžHV8=;STT[c^ef^`_S\`v|blch^ZX]eobgconuivT_TUaf]OiPMSST[ZZ[WaͼjMGE=Y_]Zqqilglg_fS`Zab`Rfnnqkdfh\fkhoUY`hV[Y_Vga^_`VhUUNRLD{ՐeraFGXQ`Yj[RSUhc[U_ogSe\MfmejgmodTVZig~_mccTTSgsrn_cagZbVJKȴ[tOP[da^bZUmrkhdxodiZTXT]hlhnrpf\OY]antnqcXcTYV]iiea]Y]^PT]ӼAIVdlg`Xg^elf}frk_gOd]wTgnacjf[JKn|knwmnk[b`MEWWZibWUXOadaҥ]RGBSeb[dpr^hrkizieb`jm_^_oeggmj[eo^Vhje`XW\T^\U`a_fe^RUabV9eZF@EhfPVlrivjnuqonZ^]]fSO\\kkf[gma`ZR]lg[V]]\elUeZ\UQS\R\OYƷ|YEKTVg[]ykcab]fpaV]S\XOa_ST\]WfagbYTJ\YR`PQXSc]]ZZ^RS]XEgmVEK]emY[f_WZRP[SYVSTZg`rc]Zh`_\fYbd[^QY`VZ^VPRU\FLLEJMU^[]fc|TWCFfh`]Saf[VblpbaTWT_jh]`lupqmrRYRH>QQ[O]deV\NTMGPCwoXO=@9IJeTOTgpq^]T`\piikZZOaa_hgaUguge^dVLM[VZTS\XUbcff^ZPLXFf\RGby@wtU[OQSPXbYnrY`e|osdbbXfuZlsmir[]foqb`_XSPLdJR``aiY]bgmlb__RUӇIM^FOXINf^_Z]]fmdbkZ\SRPktgdcnloxfgfThJluecYfc\\e`[__{`\^^fUQX9ML^YS[hXP\Thdk]Ve_`U_[imaSaRSeifjghbbid[^egOYX`n^SUX``oZNғWO:MO``OQz^UUb^[f_|jgX_ecpoYcW[`Zbf^aOaeeZXZSV^XYZWRWVb`^TǿF]vPND[cYQUQ\UTqibN^f^[`Yabhpgj`Sea_g`cbZe`aZX]L\k_W_VMP\U_ɿjR[ORL)5'++-'$11+*3.%)4'#+6.5*3+01$%>B6-%'-5Y_t,*:4&15(3063+**4,)%*)<0#.'(,229()"!"&843V()%*"2231.0/1*1,--2//,-)*-)@63?5("01(+#6,6,Ol/+10)-,6+2--+-0:+)(-0(32-)(A>9:,%+.0,B305+09]0.)+"+3&3*-().46214.+.22)'/-01911<)(*.*4,0()92;f-0/76*,0/,$"/093)(+#10..,.,.*/6*%-0-:*,6<,711)!W1,/?(1@)1*.4212+7-++4-)(77/11+,,+ .)+$/2$+.)-%0#++;:#$258,0-2A--()-&20+-(3/.)(03%++1%,)=.122,2-:$RI/201418159/,,2.,&>-%2%%&/(,'31*)9*$+-/*0(-))&30(-5Q&*,',!3?70*47(2*'(8B.6'+14,;6/./2/,,*' *),/)2--&(',+y*%+&'0D12-'.,/3,.0)762.)-51+.1.**/+)/,+4142.'*/.8572F64&2=A.9)-.0-9*:&C3--252+)3..&.+/&$%/02/0&34+/,(/&EAv>$1:$'7:.,,3*++7;410+5/**),+$--13/*(+)"+47*/(,* &2**=֏C30$+*0010&+/75/.0261-','&%+&"'$'-,5"#4/6.-$:2#&$7Y˘t+$,-.+/,13//./,0544.//%(48/($,,-() ,&8@2.+3952(/bѨ[,./02/(#)2505*$05./96*.!).+..55(&2)+9,%(.*,,0(,-4/+:Vu2//7+6.--3-';,'657,154*'E7+/!%,(5)&)%",) *0.1$$+"7~xA0/1+3/40739/#35<(#++34;B*&-( ,*&*'2/'%0,7-&$,&)$*3yޭM;44'&/51-8%,11.=("(,298/93*03(''#&0%-' )>,,'4)!(;(&\޽f47350+3..'88.(,-++'%/91//3/2(-35+7011 &D;)#+*50.'&-$7ޏ)0;51,-'2,*%17('-+4*/+)%.6*,++*3++-,.20=)&,0+ -0(,#$%wފz7+)//($*3*.2)-%,*(.>./31/%&554)&)'-(3-+2I5)$A7'-)057*@))(164-"0(/-00-&#,,62)", 5*&-14//13/-(,aŗ' .*3:A%*-5*+,1+431!&$,.0+('/5A1260/365,+#%(-.<853*0)+2,1(-0.2+2.4,#'.&&'(%&)0(6+2(G01-040/272,.1()+.++.))*(2:89"2)(&01,'*+41:5'$/4=''+(),/$02*)020.&'- $.0)133-4/)0,,@")4)%)*3.455/%)1614?2)*)+5*)/5*9//%'-,)#,)&4'.9 06-,0-#'(%.29@=,23%0&./,B,,1,'-;6.-(.8/;63('/,1+"'*1-(81*(,.27+'?/:2,05,/8.)*99.-$*29563)%)1*&+)321\&;63'+3*2102$#&73)%+462712)40.1+54-1''64"*2/*+'&'+08/'"t#,>(-+5)-%$+09'-+48-25-*405-1,36-.500,2+0661.12;'$("%+<8814;24+1(2,/4+)6151-#)9*73),066-/)&#)/1.43%4&+)"/.?.$3)'3&%0/!6-.'1%.-;46+:02&;'.//5-(0%',*-1&$'%05(vKwmjXt_gM`<*<+=;1.3851029$1+&+2.7/+,'1(&'03$%'6#ܾп;49)/892',0,*0)-7+*&)'10<+*++$>110*2+iȗ6%:,+B6,3:8+16480-1-323.06)(*422/5+2""z';F6A93"3210?*1A.,2F41&#-*+*.%&!+/$-*$\x26=2*+/<3))/+*1*38)436-.)(5$ "-.2++37C_~0<;45BN15%:,-'90272()+3%**.(2-0.4&/11GjɩEw[f_<.(--<,0/0(2648413<@-56&++"*)(25/'*#""*UWC*')0'53.:1*16)*50#&2>3)1@:,('3:;330B3#+!2:%$%)+'*+/H3/+_43,*+75;+R='2*&+:72-5.(8540596!-B647,.)% !,+&%''&3'+*5k»`2:8 18A8*/965-+2E7=<+*4.165.00,37291,;,'.($0,"),+),1#5"*)8Ϯ?1-6L/0<0+>;5@/.%66$%%*+>-0900664'*++(5..1.+*.,1,/+*)%,,.-.BoȃR^<49,%=/5352/,358.8-==8?*9(4+/?;4-32;-!$282-),((&#1#13.*-_s}RX;&+,,015:1338;)55.86.2((/554/2+2445(72(*(%#)-"1361%+60(-*9jea=G30&(1*F<592//0'&75>8-900**.?101@9:1>0+#<3)$.)//14-,$'+6zڍ28&'),4/66/10(66FH*6/510.3;A01.@>B4?%0(,*20'D*',-+1,')3&1̾^4/0!,31+BB:<8=83;(0(./-"287;4224*6:5:'09*3/0%40-./,<('!)"'~\]G(&+%4*;,##&94,%0@;$7-14+1.792''*52G):14-+%5>=9*.6;08. +[d2&46533+&?B<95F925/+&+-.9=6;1%.!,.59951/-49,%@Ӛ7.(9=92,2'4;8O7?3+5,"?%47*,33,!(9E5;F476'44(%7*+:1""-&81,S8*$563-8::,0=73C20//J050//>470:://:*$82/,&,0(1/'11.362(/3'*#X>'"&97"*5:6;17<778'--'0"#00>?/$/8,-(#095+(40)/3&6+-)&'0,3=Կr=%+4'8-1B31,0,3<-%.&\*#32%&//)2+2.&$-,'6%&+&5,.+,;+)1+9X>$*<6>*./'$0)(1%)((*49+?2+(6-<49(,/'-#,5-21++04+%&#'0'2D>4 #62(.$27/'/7:22)/#-51*/;A9<7=N )'"&&//54#*($,H8&& 1-?)*%6=B/.%4-<328+,$/0+240$3?20)/+!!-&1*)/.(1./7//'#-3*%!O}8xh}(-#)%,3*?C,10E7>234*6D&:B;5;&(1:C42/&)%!6 %/+*7(/69?=410'F䖗56H*6.#(7/0+0-16++5),*'!=C52/77:B1//#=!@H73,72*)0-,1,K305/4=Ȧ9F$232-%07(&0%7090(3)/,5'38/#1&&770300*,52)+28$,(0>..,*,/@-Fݤ݌30,$12$!J4)&1*)80J47/51,:;'3*.1(.1),-24+&+&+3(*+(),)1,2::G`1/#,2(&$!2)%?60!/4)+6/.*1;384&6/,5-0/(514+*1#2<0(0( !0$7ݰW>;(/-ڹa$6*1 C06.641*18+18B;&"&&QQE@[j$//<:(.VQ7-8C5/0*0=)(: &׎cUR[pĵ{w'.+.G9.?E'G76.<85=?r]4%l:`hah}ȩN)/C/80%(B8,3NJ5/&%^,-'Yg]fuɲķ]!$-]H18:B;a.e=>4*.1]nQQ^nOϲ¶:GJ)*O<.9)#2;68C>4d}.kms:5uєWе¶kW:3*/%6;2*e(F(35Hhnb깷񧦤#B蹶ٙ '긶捻ߑv 帶Ĭ2귶B'긶𠞞퍋|IR;-渴󔑐bk_dG䷳ugnO⸰i`snOU2T߷Sj92+kt+.,oA]?5*@*$n[FL_nŠJ++XjɡN2X*01&4Rp,e6C9/Bˆ@$2+q-+.$'R?=*&4bH::0;&<:Wx͈e.(hT -S""!. 3JE)'*V0.;#4; ,"7/ y,&-46$)/-&/);*1!2-*+;0Kp!#-,+ .:5%'/-8-7=-(*+2'#1;16=>4I|B$7,+<4/:$A)!!+4=80)'+.1.+%212zCt+21%CA0#$%"/55+*+4&+!&,'*6Z-,O5"‰.*8,HN0,7J *4#7/65*L?5Aa,0I#%)>l‡J!,90:Qi{|(/%"*1,2,-,0#XH,%-5#(,*A1.<&:4648G.&Oo~~}||<'AJ;K-*);>(&1*((3H9*%=3='65.8++42CL=d~}||X->*V-#L)$$4)QI+@'/J;2/4<2).4:22723)>O'Wdet}~{||{{a#8$+K/}BUEH7^PZWXMKHQXJPNVSIKORmK?8QbwuuԤDMGSTDNtQIXcUNO@DULHSIHԈ\PLTg{ļƖCKKPmbOX_EeVVO`ULVVuOAN\_\cv|ȺƨnKTi\^PHOj^PVkgRH@D{LNMRaW`n{}ʺţ|CPQzgU`^cYuJ[XP=JNUSeJLWh|w?Zjg@Dn\LQ>8O`VT_\SD캥gfl3.n~F˽øț7z[8LB7MJUVNHIgLN2A]gz5?&kIWι_ȒBH?NEqHKFTLGMNGBIR^kZE1qM#ogyðʭjuL?RZXTOSJK\ffxdV96vѼjƾeǿrZtxaUNGNHM^bvz`GMƷelĿƺƻDHFO@efmyBĒžǼBLJSGPr}h~ܼuȿyCCJW|uP٭;Ě^dOLgd]|^ֽ.kԹȜYOQVLr&áGJ^oqѱΚ{Ľܸtr^X̵ӻ䷶Xض}q{ؼꦚ㻺zP缻8sf00Qb_H}{mh_𱶐taT躸vhv2}a Be'E¿޲ )¿߲w"ӿ. ¿Ԧ; #ԫǽmJH4*ŻԬ]RUV>ľʮǾʭǬaU^B|Ҿw¾ʤžŬBK)M˦e{NKDĵɭǬ')*l͵WqVMD\FA|bcyĭ@+#OeʣRʱLpFKLAPnNZgXI]@$,#p, KG>@kYXHFVh\_SX@XYq¼q*"fV /s:<<:J>SlhCBF8sIEW=ATZ(71   zIKGHPGLRMFLFWEI:NMMO]Lr$+(.21&0_\>\D?@KV`ZRIDGMTTSNYWVfѧIB4+OR%3::ACMMOIMPYKM?DLLR^{KGfYCȩSDH0Ye" >;Up??L@[V[[Mh]UfTH^58N`ŨnBJ;MQ\HDFXPUXFa^QOUJ<>>JLGkɃHOG`]H>CKYGNPOOS;sRIG?JDDZKJQJ`mæRDBDC1XQPQW]TNPHNFDYIECOXVLOCAdLXY`ɣmBFAPDN@HJKTAOZIFKIkFEJcJ]FKRYPdM{oéD):KkKJHHIHtj??>GWM_URHAHWUUWVOOK\déBJ=NFGGLJIJI4K@CLPKNQPXfV]USQ^WKkdƧF@JXmCJW]UQA7OONX[fIMaWTLSZ\\WTYQN\MĨbLUH\KOEGJOQMRYQPXOU?Yu]L\]dfZPYXUOGaŨAMKO^EG=;HRfXOIaWaJZZTXKKSSem^yOXDsK@]DBAQGpjNbHOiYQRX`WNRY_XV[UVNeoDq𢟠IWEMiLq#)$7@*.7<660(2*32;6)(('U4("5>SQQ__v)964 ']S1&2:0-1$)8+,;+2wL419GT_mfpzח+))-HB4AJ.H60$@709=pa7%q>s7A;DZZ`fuԭW+*;)1+$F7&(VN93*'^-,07>5FU^Xjuw¹ܮm##ZK456@7g2h@>4 -175I/1@M\vpV ¸FLO,+L4*6)&17.5HD;m2N;JTx__%Ųβ٨TA2()!4;5.j.L27ݐ$;>Y/jQ/8`õ>֎|~"#&#^8,%3),4-*j,/4@KhA/^=`NTUڽiNhP$4E<74458BA:QivJ?&!UI^ǥCyҶuMfhQ3,%2,0>BTUqjD,fq2~ǾåA\ڧſ/*!1!CCL]^k~uZcj&{øqy٧3+)4(-O_^KWĥXcɹZה&#+5YPVk/k$s~;nZ0-JKB]o.*_>KF3׷ؗREP1n~Հؽz5B< }O9+xҫʋ!)ZS{C6-E/%oVZ|ռ<'G_漐J1`$#+(?av:q6C80SրG"$n( (-,V@@*&4vX>4,0*%8/,#'.0/,)1,'XHőe09+>-6#$"%,'*.#!,#-!1M5$438:.&/00+(2؍%0.1?)7(''("<(3Lt:,'W/*(xD--%':61**.'+")''!*1%,eH8>.>],3)&.7+(.-+.)_N- *8&(&%?21A%2'-,6J"3%X]CC;M2#*9:&"+!"5K8&#;1<)5/#,#&33NYIЃ-C&Z1&P%#"0$TJ&=('J<014:.%+/3(+1-.&Ha.gЙ)<#5P26~8u66n68o{:}6;;:|733h-ǿřCPFBB@3\.セýGJ@7($K.QO-I/c# g-".v/0?/y6kv8|n6kt6^l|6o8]p:i6:{?::;=<==76;676.6J6$+6F.-./.d-w*.l;(-_2 '-ᯪYE&I-jYUR\tS/=D9;L/!420W u.8/a-g:k-2lʾrfiWv-vfc^L@944i-×@KC?BA6`-¿úHJA5)&O.P!!T- O/p2 j-!+,x-8"D/a\_6iEYz8Xhd_6kJT6HLW:kHV8l3M9Ga7x;m;>|::;:;76;67팷7(7C6"7A.-./.h-v,.i8%/f.$-ݢTA&L-WBADPlU-*0(0B-2/-] r->/`-j;e-1k͹qbcUv-o\TSA5-+-d-Nj1A<8984a.ó;;31# N.ĹI !S- R-|>iŷ-Ӿ*2)w-;&F-999999999999999999999:9:99:::::::::::::::::::::::::::::::::=====================ż»ż:ֻ:::::::::::::::::::::::::::::::::::::99999999999999999999?6JT=>=5AG=R5@:9=7?:9::999999999999999999999999999999999@99999<;?C::;;9:<9B::d:C:S::;<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ӶȦ2Ų1گesw}QxXIܧh e;p&hi|Ti\'p7ܸ³v([qIv ɷ˵1Уyz1󚉢sgcZhUYKriVYwFsq\K%ʑ_ @_q{&Zjsz&ME~ī+\xrp}zwP'<.8R36;>=ru|yil\(X+?(BA@=:?^?RNAB4'*2.}P;-(,6FHDKA:96(J@;-,0*3/??H50-499..+830B12<74?1:0@350>@52>97:?3:4ͩG:394)'58..C7>.29295A68AE;7=B15<8),3B:,-41%1<5-6:<35<6(.5>B?:8n.>.53?53227=7826837<28A=94=:0?7265456012-?3-(63>208:0>2.--<70?xJE57:E;8527=807959>46BB6:B7?=>A<887>6?43=51.'/33940?0/?5723?6)93E8;334+A.;;<8@=;75?7997;;<:<6-*8326415<5!73.$:;916G>38@-.084eG2.<7'4:7R;>7;63+/995/9?67/>9814/6945B1*?8BAC71*9/C7+B9>6[60==66):A65*7|RB966<64556+62:;,821/<5.-814<98/064-(B?1>;9334240*3-r17?7<268::`M4548=+>63+3H7@8983<865<2=7):<:6-,=;.92549??0977370A.82<6-@817)=?455C20<=118,/G46537E3-05.4)&=55:<087:74/450;2212)4156.9A967:;C:;87:8/3903-46?>*!/*0362,;0AS10MQu=:+8>3.-9(446<6932;7-2CA6-.6;:73<:9+03=2.3)6A4:F15E9<22NvQowR<@..8;09)3$CB>4533946A?7542-04H.855/>:037R?603[A3EBJŠx;8<:58?,-1I;2,/99<=85'AX0>W͕РG9461:0,.134-@7<>008-61;D8:1-67.79C34;77=300241"W]]ƲʛΞB5.8;0198;;18=9?89976<6<@,.60.;>85:H98??599"6977/82('06?>5..4452638BuѼͰbQy|WW2233:=9<53*4749>E=498746/350==6;:310.63181/Ƥ~ѠDI[o;)x=88;8;20097?19,<<4A?<:55;3?>-4/2-/4@4-<-'08su?8<97::1-3>75%-.;>:;8-<7/..-;:76.15;6589=6.Bռ&#JN07 '84#B>:974.4798C6?B256<;?B;9552+3.690//56;>9-,^;ؕGF;K$ 050:C$E296<8;+,4D7799769771;42543=<:0-565*6@1-ư/~PF*>*,'@@8?4p2TD9974:99H19C9715938853710.7J>6/4750941Mζ[F.7/9(%G!/+*#&EA:''Z=<87==76/3=103>A<8(+8;552Pvʗ~+/`#('15C6, 07 w99/4;1556/75&3==;70054A;C;4226-58:4-(Pʷe+*?/&'5,'8.+6M2&ɇ1;44,36324:0979461022/2'243817361/EHƫF+>)-13(-C5+;09-1053?ſN8@<583><5<;7;<5210,6<0<3-52711A>58 k^2:512335537J$-JUk22%G22++;%E:0-Ǔ=:3.7=//9:-8?B4;9A9A6-7<2257.<05)2`iW82%' %R%:C3"*,(%-'&++˄1@9048;52,201656@;;SA1;5.0(2=3.920z˸7;5.5.))62x>7&,23--*?CæK?;8230.+*5,97)-=B73?277<1412'2567u4.F9B82/;,0)$/8',-49A?B<:?8<;-,$/;?0;@C360=-5,8,8D:7/-9/PpÝ\1*%#*-0='9$:11.39*:@ɽO<7/0>82-3@8*-39:=117(-+91@:57.35K @@5rD6-1&6.$%LF'7/;;Ʈo6<02:237482767):5951-6.E:?7z:*-6A'&/5G@D:G@<52 1*LD7G-+ǹzOG=9<30627-.3/35<44388;5E.80+1)*7/G6FC$6:7aS;'CB@NK B)(L*ɂY*68:3.90>7/7;<39343;?=60(:;;7=74:66050408334.952=2zS;Q0(5t#,4.+*5'78).'(*wfs7<1=9663886;=;11071<.3<065.,46kX<.+M(K. '/4J'+5$F8:0:Ƿɭ42.<:=45973:8;@:1:94586634;3+2Dp^%)W;,40,8&7'#(30''(6f*11:A<3684@=6216:)60802.6,8>;DS3.945k)11&%8D*P&,94(ƿȪ6FL>593<;=:01;929132:9C56.30203;lb3-)6$.;40+:512#D=JU4$älE<;>.2))<ÒT7::9::675).673>10+5?:23877.'U~ơ'PG9=3P@)9&#/$&8E[#(ƻG67/5/15531.=?/-32?047,55420Cȥ6;9'9" #458-@3*09Cs.R931.58/+8:.;<685.D:<<6(70//:zs?&*=$e8.,#-1*-=?93*802B=02233D:=3>8:8?@090315/6>8,E,.3(1d2-&.K$N>8MM'-1/µqD7%/::@72.!G.95-69078131)1!(#44 0F+3<2@4/4D*+/ÿv&;.B-?579013K83051*;2*-.úx)*-6C[7/$N<7 .42%)L:G=A824./)&3?;311046767H'F-/'(;'6.('8(!# -I;p0328/65252995.4;0+$.k2O01+812--**$)^3k)130P-*(.(3@㸩[TU6%02$%/&01-+36-+)6=6⸼?7<2KE%4$&&7F-/BtK.8,,3 ⷹd-50<1,&!06%1.1$+&:9(7⺻~.>*'(&+ +J?:1+4*,+1tM(%8_8((,V62.9=A&)+:⵴U/66&*1A33)9%1)$A(1/,'&/㷲kS$2$++/10*$6'617%!!.e4}՞z^a\^ZLY_[U^]ecb^VdYUfir`TQX\gWRJWYWj\\d]Z^O\Xk\^Ygg[Wa]^bg[`[maX]XMLY\RRg[dUX_X_\h^bmo`\bf]]_UHQZidTU[VGR`^\]abY\b[LPZdjhb_ɍXfSZXdZWVV[c]^X\_Z_d[bjgb[daW_WRVWY[\WTVPcWOGZ]j[U\`WdURPRa_Xg͚rlZ\_j`\YV[b^V]_\`f\]iicjg[Z\ZY[_ZX_X]KILN`PP`d\_^Z^[WTXXY\c^hbbcVYZR_[X^^d\`h^fefgb^]\bZdYWbZVSMTXY[WSBcRNc_XUXe]P]Uh]`ZZYPhVZ[a]eb_[Yc]__]accbd\TP_XWZXT\b[G\XSI^_]UZl^Q[jHMT_[kTQa]N[^[w`d^a\YQU__ZV`f]^Sc__UXRZ]SYk]Lc^inq\TQ]Ti_Wrjnd~[Wc`[^]M`g\ZP\wg_]\b\Z]\[N]YabS\XWV`YRQ[RYbb[SV^^XKegQba`ZZ[ZZ]RVJW^e\bX\]`_qZ\[^cQc^[OVn]g^_\Xc_\[bXc\N``]ZSSe`L[\TT]eaQ[XV_`S^R^Xb[Sf^V]Nae[\bi]k^`]XSZS]VYag]ZZdbfbYSX\b[kYQX_]NPXPTm\\[RZm]SUZTZOLcZ[_bV^[^]\YYZU`WWVWNXV[\R]hba_`_fabaaWOVcQTPX_jiSJJHU`^XP^ShzXVrsc`O[`YUW\LXX\b\_YV_[QSfgaWS\a`]Yb`]LTXbWSXN`m^bmRSb]bURipǕucfSS\_T]MWIhhdZ[YW]XZgd^[ZVRUYgNXUUVSTc_UX\zi^VY`Nc`g֝Ҋb^a`YZ^JSXpbXRU__`a`ed_gW\XX\\ZRSVZN\[f^^ec_]Me|XZkܤj`Z[W^OHFXZ\Uf]bdVT[QY`eiZZVS\^YbcnZV_\]bXUTXZWGxuةg[U^bWY`adcY`eaga_cfidb^b\`dPRYSQ`QLTRTVQU^jcmz¹~oYY`YWeae^\`n`^ff[``c`a]\S\VLKSZdbWNMSSVU[[^ep_{|XX>^b^aYXOX\Y^ckc[c`]YZOWYTab[a`XSQOWVU[QOױ鏿ZcuRCb^__\_VTT][cU]P``Zgfg`ZY[ScbQXVYUWZdXQ`TKNSրROZpRgj>yA=OH`\a_\^^UQT_[ZJRR_baa_U`[RROH_a\\TVW\UY`cbXMW&FLppMR8C\_Cc_^]\XRX[ZZg\egWZ[cbfi_]YYTHXW[_UTNTV_fdNJzQ\obmA:HSWgeGdV][b^aQOXj^\^^\[`^^X_XVYWTgd\VRYVWO\fVKGg[HaLJCYWZeVTtg__[aa^nXci^\VZ`Z__YW[UUVcr]]TXVYX_YQin[CMJ]D=c;JFE>=jiSIIx__dcf`` ^ZNWV[]e^]SWaUU_miZ_MOX``[RnܩCS|/;<=IQcLTGD[DܘacY^bVZ[\U]YJW`aa]VVZYf`hb[YYXPX[^][OjūQ@WH?@OFEVKL[vODVc]\RWZYXZ`U^\afabc_`XTWb[QYabWSdP[X]zlDQLP@FA=@LFQ>h]bcgc[^[YMXX`]YZXZ^c`UZZcZVVWWY[ZT`7?`rUTDfXXLHR=_TIF۰a_YT]cTU__NXcgZ_]f^i^S[aWWZ\R`TYOW|{lPNCE>FtGZaR@DD>>FBCEEޡUe_VZ^`ZWQRPV[[Yeac{hW_YSUMWaWR]VQOVYUZNGIWQVO=BIMHJJ]aպoda^XYUSPOUL]\OPah^ZfWZZaVYVVKVYWTPKaVbYSNYGHA=KVHGJSYcbfb`e^b`RQIP[dUabgY^WdRXO]Q]i^\SQZIkڳzO=7=KPOYAS?WRUWLRZN^cѡsd^UTb`XQWd\NQW_`cWX^NQNYTfe]^UWZBiصeiYfXKOJ[MB8>dpO[OZZ]cVV^ZY\X[V[Z[O`[_\XSZQe^ea`NOU]ͧHHMRgfmfod\UQ>LCogWgLIΗrnd_`WY\W[QRWSW\bZZ_^_XeQ^ZPUKJVK^Vd`=PVXx[Eee`kg;^HGiH~Q\\][T^Ta[S`ed]abZaYXV[bbiWRLMWSklKCFOT;:?BLcTTS1?4DTaQyRS_`[UM_ab]a\[`\\UZUYT[Y_cYdYQ_UҔpYhHDVOEOIGLWEPNEOIAI@ޒ[c\b^[[Z_]\ZacaWVU\VaQXcZ`\SMVZաrWKJiCeI;BKUjEENDjZSJUW]^`_bY[`]W^^af`V_^YZ]\\WX`XPWes@FwYFG?GS6A=VDAEUWK@@Nނ>LVV_fa[^]Xcc\XW[_N[V`URLUM]fccnOKWSTELLK@>VeNrNQWQDWegY[^Xabd`STa`Y`UWV__jZXMTRXZ\^Ք~{SMGXHVXQMFROOTGaaowQBøφd]adbk^]^_ZV[`_PKUVbk^[UUcnh]]~ϒN[i\QRKjQ[znF?JP\KQLBXثsZ``_`_[\ZNS[\XaTSNYe`WX]\\SJo޽JypZWMo]FWDCMADYl}2;:Jϯg\]U[TVZZXUQ`bSQVUbVZ\QYYXUQ]ضU`_EQ;9;ARSXM^RGNJO]]RQN`LPϾhbSWYXXibcS\aTTV\Z][bh[aVQNTt>Q[6w]TKLL_SUchRPMM=MdSSRP\b\ab[[]deV^UXW[U\d^RgЮGINAF3IGDNmGp`ZomAFNMȷc[IT__d[VRFlS^[R[_V]^WYWKѽ7L;@8LR@PdGR\Q_SNO^CPT؎H_SgS^X\`UVXp^XU[WPaXPSPנDJMRc]SChWS:;HLK?Cuc֣h`dYSZTVLHWgc[XWWZ]^]WaͯРEjNNJN\HUKBBUG=<>;JoaߍPSRZT\_XVYcb`[T\cWRHKȃNnQPK[PPKKHB;C{RYKODRQαduO]XKRMae[UTYmO\TϨpOOUXHRGEBCKJ3DbrW[ZĦҨ\zfUحnPO|LPNJCEFTUmCG?EKENQXεָ–]˹WHOSOYOkA?j[XOPD[ynRCvפвFLFOSGbt_jUNU]huMDHTYdҿPFPFXO\YWSQ[k2EOJLC[f;pmsYHQQ>>NFRTGB1MQTNEN`XϷYS\UqiDL:@CVjH8MahMYOHPR]V_OH>:JRCOOTCDCZZIY՘IYGFI=D;Gd][QBMFIMTņa084O}\ACHsTQL;TU[CGO`nGPQ>BL`TNEWCID?]EKJJFKV ϊrCPIQOOLGDXEVNP?8:JXڍT/202.!+2-'0/643/'5*&79B/'$+/0$%#0,(8&,5.+4&2);*-(69.*50.16*3,ݰB.*1,! +.$$9-5&)1)0+9.25.+(-4/'.0/14(.::4<8,+-1/15/+0(-#!$%6&&$05,0/,1/+(,,-2-C069*-.&1-*0/5-19173283/.-4,5*,6.*&(-.2.*9($7.-*,81$3,>+0+-*"@"/251971-+6.00.264/0-$!/)(,*&,2,-(' :/-&+?6(0: $*3/aB+&,+.3/H5*%25*,3.11'.2/4.0479/.,3/58$&2)&4%"+(*-'+6@3>tž^E(*3,+8460-1?1/77,113,/./'0* )/74*$#))-*,'/Avc[R'),,2625.,#-0-27<4,3..,/&+-(56/2.)(&$,,).#)MN^<(8-/303*((1/7)1$44+8761..2,76%,(*#$)8,%4#+6OEZg@PS*`#+#6'40,11($(3.,&'47220&2-%%&42*-'(,2.-0/1*!L&$IN07./=224-*$*--,9-8;+./437:1/++(#.&)1)'&,-340!-aEXC8I#/-'6A#C*7.3/2"!*;//220/1//)1*(+*+95-'&--",7(()SN-3!((C>3:0q4Q=4/0,220?)3<20*.1+00+)-'&$2C1-(,-,&0-'SrS=A;='%$$EC5#$_25,)554711."**/.6/.%)3'%*9810!#/1+,)F赗'6Y%&$)(330$,/y/2,05*.,-&.-,552.''.-:4;3,**-%-/3*!!OԷr'.@*"1(#4-+4J4,4./&+.*)+1(205;23404,(+6/$-45)%7$*$;lW!%;&&!+",B2:.=K,/9G61B'%)1=M:51+-('++(+ ,--2*0,/*'@QV4> )60$'<1'6+4'+*/,;F/85-.)53,31-12+*('#/5)6,&.+0$$51)1!|Τ_,5֑J2/&&4.)&+80"%+014()/#!0)94+/%++O츰<7?B5$(/&"JE%2(88̡k,4'(0(*0,0*/./ 1,0-)$,$<281q1!%+:媕#*/J>A>G;2.,.'IA2B'#΅M>502)&-+/&&+'+,3++0/1+<&2*#)!#-+Y1IK.9:eT8 <<KI>'&M(^#--0)%2(6/'495.23+1**)2669+(%'+-F\,("1L*"#+8),1#&5P:O&@+0)!387/0',1--).)-)3,-,%3.,53ԍb3X2$?|&)/&-:)43-,(yt-7$62//.20,*242(*)0*5',2(0-(%+7ԕe7''N(E*%0H',7@47'3&+&536--2.*2/271*32--/-.+-5,$(Dx"$Y7%,&%12%&,**#'.m$(*3:5)+0-:4-)(/3"/)-&($/%160BΧM443*0n(+.$"6@'M!$2.":AK5-1+4033)+21*1,-+207+-%-)+)&7㓄j/(!0$7,+-+;6/-D=FG2"ýyE0253<1123.(,10-&,)3://*&4?9*2qՒ>:@-(4/J&4YQl*&;67 %9ݢQ$21013/0."'/0,9+)$-40+,100'T*NB4;0MA(4,,&*Fc#)ݯ@-.&,'*..,*'68%%,-;%+0%./.+*I:13%9$$1..)A0+19Aq.^-+)%.1($13'45+.0,B/36/!0)(+DD,.>#`0+) )3$5B6*/*,Ω2-+((,-@56)36)((-.1+19,1& ,FW!'4Y5;))25*.=C(+-0&0A15($17156/0299)0),(*'-5/!E֦1,1"'n9+'EL=8JJ!('(ڲwB4!*338/*&A'1-&/0%./(*&)Ţ(.%2D'A007/?3,/@'"(*;+:$4,03*+,C0,),&!2)!".䨊%!)4Gc/'R81+.-"(N;㢙G34*%,(.%!/<6.*((+./'4bۗ"9,/ )9"/(!!4&,Q;z,++0&,+%%/21-&%/(&/ޅ;L&/%(,.))&$%\2803!1-ܱuPfs*.."+%6;3148J&0'}Re,(,+1%# )10*OW1.8ϨܨEzPŽv5h7/a&*/%&'55N$)!*4((,4׸ÿȘ\һSw)820G)M#!L1.&'.WP1)Q /-&23$=U?I4#&6Sm1$")*/ٳw*#0'7/,(&'"#(S1*'@<@$'&1 l:2-%.@5-$5"F2'G&(&$*+ڏ]!-$*)*+)$3<&&%4j> ?47.2;<6250A?;57=:5>=;B7303:4=;50;11/.60+648=A:95&2-+I5089G@+@W<;7916;9G:;109GCAJ;0+=65'78+7709718;:'FĻv:3>/(H5+-+E;8K943?8.65*98D21(7C6,@68636+/3.;/4<6/,G@4:2-<}}O7/*757:=6>>:><-88@@60B7.4?1-7+-+!m_(J#&AB.)1::C873.70:6970=B6>?:B5:E;A<07;90A*39A>:4*0C4'1i/Q6&,+408(+3BB>9362279@A2533/8P@278EA7X3?;3;<4<=04?6++5:&o@'5@&E'04:79;6BH>6L>Q60?<)G@/0DE<:7?:58:>=35-2BJ4273LAB.'\| 116E$#AT+::99?=/32/:C;I:;41>I8085298H577D3,4,122;7M0ɿ[r(+,:7'23$&94/?5*F6532'"-8C@=7H66';*>=<0A2-6>;2690L2,)(2uR2>44$+/=&7-#O?0p8;,CD72F?_010B9Fm(fU5EOSCQ:'AA73CW?.xΩG7#/=1)=%0%,;u~tțG¨~UÖg~P~îG-F#2=3l&74,JɹֱʼĻijͻɿƱȰƾWY-%3(#* H4B2@.)=&C;460+,ԋȿȊ˽̷ûɝĘS&R>+.M#(:+5011#/05-+*B*`7#kǭYfYyoyo}jqDKLWTT/I!1&%*%5>):-%'9Q%RKr27|Oj&TOg%EfVN7Yu.O!W^#G"E8(IK&:%123@. .;K)U:3J0-,/."''>4+b'+,)&BO51*-78&$DK5&3).'4BM2+F13$V(" 350+42-9$49*206= #3,43))=,,(233CwI&.636$GC+472(+g-+Mq@7e/9i2,))4*E8O*'') !%*&'%.*43D8+>+)#(*?6,:%53/41 F)-5D"%0?258+!&261K$6*+"0)5("*,0+@(6-'3&3(!G6,Pl%DQ(;J&%6IQ=/7530)!0E1/@*;0*(W:-),%*"#'W02&/+1*5;5+#.-1;58GC?5,\k>3,61E #/B-;F&$=#>H167/$$&*:2E,81=''/*"4('.7(/8/:5K(0<,0?51: )>,65.$6/(,=6,'(33/&/J40$,<-,6O0+!5.$!*#4.#-q>])&;')8-&-7o=4%%10('/F+$261*6&_!.9#-24./8B',$. ##)+*?e(RB82,72*#d7!835?+OB<59O.%>71K1!!'I61'&1S(07$2/.4%!.;=8(2,)1i$'2a4'72-m(%$%&.25$*:<43,(?712c!*2'E9/g%,?/),+%')-1"/8* ,447%(,%.-%!*(..)6(.-Lm/&/*#73H<&:7/:?$A@-E`8..;63B!6,)9/+7301J-=V',%*&/(7;)<0&*1*,/@6>/,.02/@:83/0->;1&((+JR1=C6 8#2,1?0121H9'E'.3@9%,"$#3*4287-;*=,'42S-6,+I&"1:%$1>;4@,33)'+&78;++S,--(2);>.O\s(6-&")'+,5-'.J09?;IY:=-!1/)y523/"*.R'0($'=+("R5'21,78!$0<#$,@D_/3H';&/4'037B-?64=1162/&7'153PE0',';J;*C:1>,6-<0Z:5=,)8?:44$I@8aH#-B.-9+/,=18-.D?:<:9'566; .8-D^6CV@0Fp(-.36632Z80KC93C*4,)8,/)/787K9P2C-/9PD/62+TS80R5,5:'-7*/-C588<>-41A788,4+$ 4.594B8D74*>3B1461$E"7138F77)A7?>6&/-$(:9049@$+//%4,0E5%A,<;/946;:B74)8c195;P8B3E.10T://5&02@W&2720904-,5)/6835-N32E75%M>6.69;=:4;EK8f@:='6"2(?1C38<;F8//+D-6=603KE5$*19384.339://+&18=5785):F3K:BCuW8'"I80H?232-1;B3@=:=qG1?92/E<$3)+)(459657+,+/420.(/A1^PD55:/:<&2&*@35GlD/2;:O_3T:R07>:(691(.I>785353<9*1L?86AA0!/./=2'*14))hF+::74->X5D11+::5-$&%81.7&),61+=:#%+67=9441<*&0$R:-920.(7J+I,/C:227OH,4-$%5;A>B;.9831*-/+-<3/1I6$/P*65@?=3C10;+FL%6NA7A2=;=-;Bf1E744+@3)d;"8=-E6F1*2*8-<-309=2+315-39A*(818B89?g*N'03F-C.6:OAA<1=A:D517)4#-78>2362<4-Q9/:-21=),7-3N,%5=*>@;:1W:4258.D/?265)1737:259::I./9&CE-5;:76A>5=::I96:3263B5%?K2,3Y\,.1=0+2E2.B&*-5:,,.4G0-9G6-M&11;3=2#72:3<6<58?9*1;3-'4-622*A5:&756-:0.)<6A.52?(/7A>*41=6W0-49J25>.>>@-4.20434:+@@12,63C)?A'5*B.1pI>.4'&(:L)770@6A('CR]N7];9SS3.@I0@+?I5+4;>495GC%98=hVB~]uq5hvw.;afty{a;DWo_jijoaiLI<.667361<-47>8+97iwwwosVf5@19+?535B53.(51Wkvx3::2;@2)'/J//w87Zkig~qS"18<8-0,&+=,#Cc.:h;+zqJ\~`NW7cw>_d+42.446:I)M@H 0> cW-JI6%xe1Y;;N97Z@gs39Q@Et-3D!,M88=/*2:)23-17@&8B&S6-)P=+:0:%C#2c&()8c4VX7.4q^:')4;%(32E:A;7:;9=C 66<53+*3.!e'0&)')=D-%9/&007&0-(0.70(0dl4&,85F2521D:2-%+2**/PJ%:3,5%,C/%9"8-#/A1)'%*)-3R*5'5'x}R25;)@R/,-&2,:+$*?C0+( 5(XC)K@.52(*G/'0'+2/?5(2)3>*/84-d?{9?:A>#+,1,227,?(;"/?/4D28'+4'FNA%3)&.!43.'9H-:)/'4B-*29 >i^bSXaa[X]Zjfb_cf\Xijfmb_WZa\eb]XbTUSQ]WPYX^cg`a[JRNLbNO\]iebae[iTcarjRg~fg[ZS_fcrddWU^olhpaUPbZXP_]NY[Va_[b`XCdX6QaRHp]T\Vk`]zm^Xd_VcMFX[fX]PXgZPjbb]WWRVXQgZ[`WPRqoWf_NSŝmQOPZV]`c`hfbegZb_ghcUUKag\_neUY|is]Q]ceaW][Z_[RMV_[qi\R9Műqh9_Yd[>]eX_[gb[XW\mfZTOVZs_hglk\Yhkja]caa^g]VnaUXaWT^P[P<̃xBg@JgaEMU^_jcgbPUXkfbXN`g`kigsed_jwaNYbe_oT[amh`WKYiYK]BeL@GIRLSEOYhllhb]YX[]loZQZZYd~m\]_wqf[gbZa\Zkq]bneZW`aJZѣAPZ>]=GO[\_a]mul^scuZYleImgY\ppfa[lgadbedZ\QYmz[X][vqlN>sʏи;LKP`@?_wP``_`jiVZWS\hhu^b\[itbW^Y^dcs]^^kZRZTZSS\Wo\EnBGHUQANREH\XTe[Omb\ZWKBNcpid_r`^M`NbeeYjYT]ebY\^TsYRNKMiӺ3FWTT@EHXDSH=oiXaeShi\SecUXVj`jHs^nx|fs^Jcj`[i|dRŨ˰]I8M[PF;XCMADc̤ЍfǷϤt޲qȨ½]BaAR^TCUTLhֻ̽ԯejA;NKGMak:]ZgLlM8h2=SS`XRzJ6GP9ӍrLVS>_J[OFFVoDoeIWa3@le}@b@si5UKe9nt;`;WNGlm>FYDSVWcI9H]nKw[ZlKBELH:FKc[V;6CFED_lSGDHTVDMWGMJRW:I=_QgDB@C=<;DKA@?8GIRRfZNbIFAGK^TDP;V[SJF:]:DTf=GSbX`]I:EQTOf?RCC:IBOBK>RD>iZPsCh|QYfBAQp|dMTWRIF>J7gYP^LUJFEeOEEDJEHAqKMAIFOIR`ZG9CCE[SWifbXL}dTFQOf7EXeRgwUNb>4UmWVRI@;BCN^S;]FUTbCDLH>MCEMWMVXHTP8kGP_MQc\SU7?U8KZDIFPNMMWaG8>[VOAFsYN>?RGZ=N8EWKW^QR8OT[tC?R@CSG?FJaL5GO4ABCQlPDQVQHTDYJES9FABA;BEH]Kzj[;PLWSD@Z4:Y\deQrfaVXmKB[TZX:;>GJIV<:PURSRC>YT;qM4QZS??RU9`OQaVawrODYgi]fU`lMJFAJ?G8@@`C[XC;=OMf^}E99B9lZVIKWzNRS9GG?I?>L^g`IGGJW>=QRERJFA>=>CMRaIM`bSRPBY;]US6D8MLtg^LTfK?BE;@DKNEZ_L>KSRS<@IGLJ?9ECHIDPFNPqKFPJG\Qf[KWM@TX?_bQg[UVc^U^8PMGWNIRUXViQ`uAC>FDMFUVBWKAEMHKRdXZHHKR[Wb\BWKOJcZ\]ecTYRhbb{QZQ=9OLac^jcrbZL^Vh[aa[PjbbiGc^`esT[PbT\[SDRPCGXWNSYbGNTHAURZo^N]I[ZR^Y`eck``T`af]asZdWjSVUy]RTYJP]kuD8VFILUOIWWAEQdab]OWV^F?JEv`R^XVRQ_pPlHNg_]_d~oNRKE?Vbmdg^QYWQOGQQMO`ZUWoVGSvRdVUUETZLLP_JTSYbxd~PRTQPqgc[e^Kr^XKYcoQNMNVR[SYeXZbPO][]a^YZdcbYkMWgRipJZnaYhZc_`Q[]]reeYN^NI_F\gVkZhRIPH^RcUXT[aVKTSXFNU`HEYWdbbecPsGW[aOl\Y\rhhcXbf^hYWTI]FAX\f][]ZbXUv[M_RZYbRQ[MRgCBV^Pfg``V}[VXZYRiMbXaXLV^Z^aY[ccbpOP`FUjXv`yYOjcV]AYTb]haQMYaBDMNGTJIYYiwPEOO|jbZchjQX`b`]he\gddp`\\SU^YdSJcnVSSvyLWWcVKE_UWdCEOWVJKM\mSN5[p\WtMWV^U`TG_Z`Zc]eadieRO[\XLSIWTVNdLU8J_Y[cn]brW^NMVIGZXgjE6B_begK^aQlfKgU\dWYZk^t|YlhsPbh]RVLQWWVBRd^\ueY^aneTOU[WiXeVdQJCUVeQYUbKT^ihITTb\ZV[]lTXbVcfgUUNYX\\bfJmkOfRLM^`o@A_aDj^ZYP8@S`ZPYYaW^OfgQRO[YkPbmGHER`fdN[SdMW}lUV@BTC[O@JaKAGKJCHVqKVHT>JtY\bSerLGGCPITEAGccOILCOAtWCjcTWLCLgLAHIGMQfR?JIZdNPVSPc`eakeDFDKFOMPF\F]DP_LN]O[:ETJon[BTMEC1=SONLV^DWSTEQ`MOTc38,.((17/),&883-.62.52.6-)+-2*42,'2%''&0+%1./481-*(#/i͵:#16I3,.8*9(70=6"9O41/1)-/.JMEM1"A<30?V;.W5 &9(#<!,0zܣˈܰTиΣgڢydãϼ\+B+A5l%:+'Q̺ⱀs6%/#%8D80oM/UO*],"674st3 *2"⦲ڻzB;#H3F35(*C H=!)!"2סb/\H0-F"#5,90.)(+1+--E-x̳F*ǁпlwnִĺ͊]`ecZZ0I"1#! 39"2&"6Q%SK/=Ri&apً.J$ncY0bAY"[e(F$C3RT$'8 .01@(%6F'S7-F,()-+ #:.)h))$&3E.C155(.30,H"3$!&2'1#&(+)="0,#+!2& H,"Ml)HP!1@3EN:)/1-&(!2"E /P"0&&'X6$%,"%(U-,!+'-%36/%(#(5.2E=8/+`n;,$.+@ .E.6'+))4.,-X(1$6+7#2N-(.0&!$$5&'>P 1"&2+& <}G2#*#+)%*<%#/1*)5'?+%7$-9 =-`8$-/2D/%YXM.&4/"%6)076#%<-)!I"--$,$%2#)(=-,,1I$.+$+SC]&.+3+(+2=(.$,/$$&)}073"%-1 E'78@`Fg- +8=0I/,**.1?93-()%E<) #+MO'0;52/&+:,-//I>&=#(.=:'&.%/,22)6/7( .4Y+4*-D-/1% *@J4:$/1$!$$025'+T.27#)"85-Wl /&&$('-'#+Q.1:2B]A:*-+'y6,''(+O$/(#$9'$M/ ,.)25 +7)FN`%2(C1#00+3QG%B6-8-(,))"4$../RG*"H8'?5,:(1&5.X6/9)&4;71/-M52oP'.=()5#(%6,4((=<873;'0-+9+52Ok:Dc5+^z-/14.30,`<.=940B(,!!0&*+(*,/J8Q4083'/.'%+R@%*1*QP*/Z8%;D+'@)'&:-852@,22=/12&-!/'*33G==**)51@,/73(=;C .''*806-B0782%1/$'15-,/;$')$6),A3#=*=;$+,.58C7.1b,627R?K5?'+)M:1/3$#.+41A)15-(0GA0)03*2-&*&36()'$04:1300+6B-D1,.,(09@.:1&:G/9/'-A8/(,%..1,,4,,%)0/*&'?4cN>-.1'<@(3 'R64RB,.8AXf8Z9W34;6#,-*!(D;771,1-3/*6Q?31==-,/(5/%&)-#$a?$9/)4,;ZAZ/*%:60'#5-$6#!"..+<9 %1375.55<'!,R8+2%%(&6)2*),(%+,+7.,0J8&/N#0)/5)2d,$"1$+('.I?Q)1.,1L:0`4>9-Yk7%',4D*)')1'2-691:='%201B<409790D6/5)UX .H:08):A9'9Mp,B64+$8&2t=9<'=2C-%,#7)6$+-<=,$+'*(-/6"&4*0;+1H6I"),@(=(,6QB:2+9?@3E;G-EaeXOqB,mj/,>D1@&9O9-405/75C:78EqPr¢O~В9AoŦݙtECov^[3)60-'&&2)4690$:/޴؍ɐû΢ɾݼ):03$7-00;48)1vӹҼɹԬٯ*58,49*'(J2)yD+k嚍ӱЯ֏+161%((#<0Is%M࠳YDrrUŮgv,/'(--,13C*T?D$&8+on,QcA&?cKPfEKzhˁ{?O|T[<7O-O019.(1"./'.69.Z,X;'+7kS+92;'<#;v&'-Er=gf7-EtCP2!)-.C9952662:@$11B>:1,3'!g!*!&#%KK-5+$487&0-)+2("%ԥ((42D0312E9.*"**(+/VP$824/&:)30+&99-(!#$(+[/7-7#*.9+?O-(($0)6'#*2;/,*-$`R-KE+30$'U2 "&(,*;1%/&(4""+2%Y5=:C?"'"($+,3)>&E!#0(*61J&4)GPE(5$#," /(04:J/;#5//4(<4&.,/,+,2.%20,*M*)/276/;0$J6/*2&Db|{{zx8520[+s&3,*()78J6'/8A);2;57:*1;5?4B29=B~||{{zzG5=DL)7+'6"(3$-3)**43 03615(wI3,,LDEHh~}{{zz|#.?4($P-$=-C*),6A34B3056+>`E.?I!#'*2/10Ohl~}{{zz-4?9D&$$6,,&;==/%;@45&AY-48(62.156034F+7:2+-$-1,/-42<:>44(4=K1!(4<31(~}|{zzy{8%-+,(6>F*1+.+B&'",./$&/6F9(E.,&8424-1130Pt~}|{yyv4$1$*-HX^2;=T+<3/"1=+ /8>.(154251+79)%.7-Byy~}{{xxzBI/2'-q.+SVH_"9'J,VC-%$14;0.3.2/355)/R%`h~}}{zxx~7+<%'8*%( *)/(6.34;3$2>7@:543+G88;.1/%1>b~}|zzxxz+N'-'6,< &68%B9/;6,7;9%*56+,-1.614465D~~}}|zyxxw.,9"/x)&):7'/+)?44?-,343)#<0,22=5<::;/.r~}||{zzxwwt7'482&5'P:+0"&6,58034'F\.W[9737:,'->/)8Lr~~}}|zyxvvt7*<0{.*(.717@s0ZBT:,H,3641&2*D+he_#d@\~~}}|zxxvvs -9;'*7+/8E4.*&+8'-94:--/.F&B).:M3/"Bhw~~}}{ywvvx"%+m,,#"1;E,1*,/747+-1/,9.*281@q~~}}zyywvv{($- &>&58./*"0<$0,4862!-*593+$!*@BHdR|~~}}xwxxv$);(9CM2))@5A(&/3)+8c4%0)58*@9317/Vzmr~}{zxxwvuk%*B{$1S,(F-2$2()%:1/A4.1)2)+106>49Woy~~}}{zxxwvuvwZ$1w$/*'.38-670 1+=<5.*6C3;.//5/+/6VW|~~}}|{yxxwvtvuI(7)O+11$%=,=77;.,&6(7/4-;8+-+*5)G8i~~}}||zyxxwutwpPa'4;09(,25EB0Q&S*43,D;=;",H31(R~~}}{ywvts&#-8;B5+:@173-3:2637/D017/&5-/VP+{kxy~~|{{ywvur+G **+D;,,8076N20561f@6?DL)(0AS5W~~}}{z{{yywvvuuwurh^jI:45.".:5G<4*#7ARF)&3003--&(8S}}{z{{yyvvuuvtsV%6<<>3:72\*462-8*$#:>/21(:8.+@1Ui}}||{zyyvuutvrtFfC3304;56391,37=!1)/5151;4-1,3(543+8:,3;+3:6065Q@2/78_}||{yxwvuutuppcʽݬ366,1(,*.:8<823.8?+M941('(12;Np~||{xwvuttssyreޤ395;24>2!0+,7393-+264@95:A0<8/A2<4:9987<,G:XuO~~||zzywwuutψZ?9356+?A2+2/-.+2+3:118+)6L}Yw{~~||zzywwvtuttrt3965305/%+*033500+;10&%'L7,2||~~||zzxwwuttsѶ(2+7$,*7>-,644-75F,'2-2/4'=9=,ER(,A9fLK_hz}{{zzyxwvuutsʐ423)&:78:.4-.A?;--;?!JD2|b}~}{zzyxwvuutsƢĽ4043*.1:0+25766'#-,+@43/e|s~{{zzyyxwvutuuttqƹש..907-&F891-2N&'3>3:*148^n}}|{yyxwvvuuttuvilƱ.O.5.%T<536(02/.8>1'.-9<^}}|{zyyxxwvvuuttqulsŸʿ58(*5-nC),.)151;*=#D/9SBx|{zyyxxwvuuttpskµ:2286f]z{~}{{zyyxwvvuuttssrrnlʿ½0]R_M,88F#&0,.FRWjVGPYcK`XbY]_OR]WaT`VcigĜhPX`jGTC@QKMOneepğGLZRFAa?QJKK]]LBYbYUEc|PX^N[QMQVWRTU]męUWSGXS=RGBXNYfbQIqAOGJBVW^`GL\Y]UROUbL?Nxn̛MVdQHJe}dcOYTKUYTOOcO@HDQVaVWJCYPSTVKDE[aV[OEOPJRV\YYNRSKHVdD˝XJIPJGNPU[TNPZLLUbHNhNGR^Z^]\TP_TcPTeYNoE\HHFCOTXEWZRJI@IL8LOMT[c^^SYFRbhO@HU`XUNɝ\CLMMFOS\BQJNJ^BDAJPODFX\eSChNLIUSSUMPT[ZrϙYCQEJH\fkRZ\rIWPOES\I>L]aMDLWVTWQKY\KEQ[RagNSEF~LIpqbz?YJlM@vdOGGQU_TRWMQQWXUKPtDϢ\I\FIOHCE\K[ZGCJMRP:QNW\YS=KJY^WNFCOecg~ȍHJR9]eoZLJ`T`<@QYNPWWHRKWXI`YRQ]Z΃HMY8?QuRJfMSDLFJIaWReYQUMUIKQPV^Za{ŚtFR;NIHRUZNXZQAUMa^XRN[iYaNOOUPMR[t~hJSBlIRSFIbQb][]NPG[O\V[TcWKMKLYKgR˚pyMPXNXINW[BjiWwS{R[YSiZZ]@@HiYUNoOKH]ZaU@L]eX]ZTX`Z]]dYgRRVSJVLPuqONcALMLf]OQ_U_[sWQY^Z`?YbfnHENav]zxyg^XYPEQ_[lcZOH_jubEDUTWSNKICMc~{>SdcdX][XOY]YRkYE9P^OYXK]XNKc[khWWST_ZZW\VQX\\?OGM[X\W`YRYUZhǝbQN\XZXaKXVXP]_OU]LU_\V\VrdZX`eЗnͻܪY[[NPHLKO[]a]WWR\cPs_[WLKO[]cxǜ~ޡ]_Z\QR]RAQPQ\X_YTRZ\]ha[_gXfgyrҕUebfKMWS^aa`YmU^W\[YXXWZMkawϞ|e_VWVK``OITSRSPVOW[QQWGN_pƚO_\XUOSNBHGOSUZUUP_RPEDMm]X^еGYR[FMLZ`ON[[R[YjOFRNSTa\~tΐ[WXW[ZYLbeQ\ZXkJ[\COZUZ[RRіݠwPMYXU^^aqs[s`fcaToR]WX~WTRuʒǤUYVMOJTXZO]dZMa[aNdqLRdcxxʤXUULH\Z[^SWQRe`[OOY^Coi\ѨջVTXWNQR[QNWZ\[UCANMMbXZ]󘗶ɞLS_U[ORr`VVRUrABS^QZKXYeÚLuSZRJud[QZLUWYVclZHSV_hƚU_MOXVeMNQMWZLUG]BiXdznŜ~^YX\XdP>&3$C].&.&:3,*+,),-3aG6?&:4(L %6$+7G6*c' ,(8443$(3)1++*4E,*mzA6Q/(*MstC#.,%593/-N6 "'&-!-%4%'((! "6;0K6)157Qhi-.%+,*(6D$"731/.+34/((3)&;M;H47L1,2/3L`j,+'*5,-6C),D*" -)-/-)&3*=/6G8.Q%T1+'+0Ldq#04-()!*-#&'/.88;21#0>Q6!&190."X..*22Mcp#.(+)D%#( #-7JA1D-+(;622')),'nT,3%04Ywt+9=X1C4)/:*"408+(21/.1,&6:'*4+P^O14*.v$$S_Zd2"I-#^N/$!**1&$(,-+1.,(5\+~S1?%&7# '&4)(20'*50!/:2:2-,**D322%.1).QH#Q(/#2(8!,-#D4,;9"/7:'%00%,*+$-,-,-(UJ3;$6-#&74$-'&<..9&'-.-$"6,-3+0*.+7=+-U(>93'39&'1-()+0,-11(5885#42/.91%-?'hΌT%=93'%*.&,1#A0(&%3/--.9/&64-2/8/A;Ʒ2(6+((?(#88,(;4+.,+,//2.)%3(.#*5;4(%bfL&-%:?'ZB%"->/.?+*,)O\&Zg>-).7/)5D&1lҵF)?6~/&074(6Iy-_X`D$J64/68+0&A+woSq*-:E$ 7026G7+!/3&&868'*(,O(C&'?kA-0])'-t+'# -39 'DT1-$'*32.&1+*'5"52Nş*'.!(:*3(($9A!)-/.0$*"++)(%%)=M^w]Ⱥ#-<,7LV-92@$"+-%)O}8"-'23%;4/0))zȞ3)H$7X'%E-4%.#$ +&0B-*-&.$&,+1=+3tЃ-1~ 0+'+4;/88+,&;A8-+1?/7)**0**(1me,8!Q),.%%:&5126)+.07*/(63&(&AGbb"@C6;,+*-J>)O*g1%)&>36B%&/D79i.-386;-,78+4/,4<&1')/J0,.( -#-me4о0K"())B;&%32(8U5()/;zL$37DL'%2P^FΨaiP9594&23K82*$;=YX3(3-+:421&!3iΊ*=,/4,3.*\092**6"&#%5%/12.$$6/ro?20++4/34;-(/33,&-6+//64//.:EY0"414/:%32-&25&-5)2>4.7C^J2-6=д^פ4.0(.&)&(2151+0*38&P501%$"$%+8C\gԑ+?7?=422.?.MCoʚ||x~[=8360#9C;..()*'0+2.'.5I%$gsx25332,-%"-**,3.*+(7$&"&ZD0@̰&-'3!,&0:/&--3*55H-#-%(-D&aǓxP.**135#5@7*&&>+nCA*45().8,㮟ݓp& --,;42Qd/H5;AR@UCC-.\)&eϿÓy+11(,*+(,&8?5)363(Wa%)N>WYι}/,-%$8311$2+-@59""BK%MLG뻕ϰȱ3#))#&.:1*+.0.58*"$.L<->ͽ&3:)-)^0)*)3R" -58,#,,*Q..&uI0,6'--(34=?))86ĸ.8$&.'F#-2*,-;&6)G+1gNc+.-43D3 ,60+5&U9-)/Ld{ƙB>3])&),22;' 6L8C89n0;./qr1_2vy~2jntw3firu7bfs|6^rn7eb6u89697868767776697w;;;;/0߼.qѫ.緖'Ǟ~{%٘w~tv%yi}$ɣÀbw' ⱼx" !!!--Xç--&蒦ȵó•&߮ɵܢ&Μ%͗뼎ٵ|Ώ^̌Ŝo͠z;l-0(-kg1R1|2x}3sw7vz6u6vo6}896978687777777;6w;<;w;.1q۵-gt{ɡ|.겐{uy{u(ƙ{uwto$חzmqdj{%o[sr}$Ƞv|^cD(㲴o# !½!鶦!𳦶/j.B/𚪳/岹$凜ܼ{$ةzїw$Κ%͔|q$跆r߲|}kɇ}xSvx}Ãnjiț|~vp::::::<;::6;:::::9:<=8:999999:<<6=>963;9:=>783<>:==>96s;:侍|}nrs|qqnrostr;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99-,1-# # % # #9:=88889954;;;;;;;;;;;;;;;;;;;;;;;;;;;9;9:-,1-# # # # $9>=88888;45;;;;;;;;;;;;;;;;;;;;;;;;;;;99;:򹺿-,2-% # 񾽺# 񺽽# 򺽾$󻽺񽹻򻼼ľ뽾ü𼽼ú¾9:;9Ǽ8˼998835 %%'      ,*+, !" .%)       **+/    % %ǿ#Ź%չ񽼻 üļ コ﾿Ŀ ü ¾񸾿 ûļ )*-,    & @?899,+,+ 9>9;9/+,+ Oh tQWOcZT]S| ::=99-+¾++ÿ!ÿľ ºnj?Ndÿ&`"?9wĹ'[@)ܷX+٨yx*]87879;;<; "?253S-\Qfs'׼I%o(ܧopt4*ߡc\*Q88779;;< "8&0.K- *)>CO_J|'׵T-E]TDX*ݭvxw2H^p+۠f`+Q87879;;< Cg1EBnt(S:/21b]/M@").%>2$7HMQRB-I1((6NH@(P0"H*GB'5O020+G:W6O>01)3=`%B2B1X'.k"$,+MC2$YTw-$%mL1F2U#I,GCK1f#!U<9,%2k1&$'c(RF1L,Ef*1B01<2s(55.1'&<&0.7#AD>*0(1&d 01l&-F"9 ʷϩB).˽H*## 㵳KaaF= ֲZhwJ訢߭ew ^Y{C²Iiⶄmrd~] khbl|w¾~!tY ڳeaǿ ӥ5įŨ,ƻҷh迗#˫ǸԲyɸէQ}˞Տqp#(y#/k]ʹ)V@w֕#܏AON2qz11K;7654110022346688;9[զ7Wg]Ey_PUZlGpgFMYLZ2>UjuuskUi17FI[qkjPp09@fJfgQ\n0UNHaUy_u]2@MTUw>iXb0jLH~LLEZܮ}fzj[uV!a[Ycs}p~t!lP鉩!ׯ_[!Ξ1߮Ŧ)ͼ⽲Ѵeɼ帎#ǧ˩vqȵͻѢIp˚ыji#'|o#-bU)T=tщ#݈;IG2mv11K@8854210022346788;9Wc,BHw)P8-''f[4V@""#P0(;JNTZB)B0,*7NG=#N0&J,D: 1O084/I04.9?b,H1?1Y//h$).-NA2)[Sx0''nK1H5Y$I0JCK1f((V;<,%2j2&$!,i)PA1N,Hj.2@,1>6v*54,1))>&10:$AE<)1*0%c/0ֳ`#.D 2 򼥳='*ê՜=%$( ᠠά3HRCD ̧ﮛϴBPf5噈ӞSb F9uku,.IҤr\n_QkM!RKJSdmf|rh!_@{w|} ͣQMy㣾!"~οݥ Ⱦŭݸ ϯ]ת#àƸơm^z«ųƖ:bs|ȁb|{[~#n_~#!QFt(F,f˃%z-;92en2:H88<86210122357896<=ڰD&V-$&-D)11+?$625))&*?8ٳ|);R/%24&-)Q@{&<,$86)+[ٮ1(%64-+--4-'C;9/),./1+SU} ԯS*=",.+.04$!/%*&034.1RV<԰/hD)1#J.+'.)??.,&%*H'Aa5Qok ԯWM/9/XHr խnR8,oF6M.)!$,5(1358/3-@7:8)I<;6,筮V6%,0&-,,00)3/((<7**9/X6KA5,A8KEЪR16*(0;'& ,7+0())-8)81BGA0L584FKGЩ]3602B702C:).'^@&Q+*-*5<6?06?EJ6sѨ]5/:.-/;2)1A((5$b7%)'&vU8$[D'0=)N:S]mբ+7?%.>-T<#172(!/-6=U22#=M8H=(NO^Y/9Jէ;@2+@.40*".=22+'))'% B7Jd6/W=.4I/qեv41-/#3',"+*6=9K9,+L40Ԣ?(,'+.13-,-40+D,6))+D2?)M3<+LM0=36:nРsxI0;3432/5(,/.-.M3;&0#=>DnS6#609.SQPQyѸNBDURKHJKRJF`WKCI@JNOKPwyaœQfJM?`HJKLG_`SHDCGdEfZtʷjQLXE_ErEKGGCWeYSAMIXy;`_^cY\ZпĩQ@DQOLIXZfIRTPKIMJKPI@Ak_brU^SyjiOK_VrTH?=B6FPFPUY[QQLe]\\Nl_`\SʢpRHHIFRRBKPLLHCG[ZLLMWO|ZoeXOdZmfsQT?WROY^[Abw_i\Glk{S\l֠W_RK_MP6IBCNWPWUG8FMKHDf`kSMs_QXoR PLHH=MAD9HJX]Xt^H?Y]H=gqbd]Gvidq[V \EIEJOSTKFNZRFaNXBBF^GTEt]gVurU`X[Z¿iS^U]YWSRIOK@BRtOS?J>[]ex^LXR[Q_ƾмw^YQ]VvSiXBD@FW^FdLEPEFJsOi]Lh[LTþмqQeUQVhHV^pRXWXJJhXIOMEassOYUYRRmҾzSQVPYU`TJL{Esma\չ{]cYZW[XcjkR]W9{jO`WNVaeָtZE@E_y_Y`NWlh;4fuѷREHIBVS*K@_jXaX]\}Kj jVSՎVܭ[b}󳴴 gTIi ]cMHM [kT XxS xhAҼ pT]~ū \crǠms {c[G<_yvV7M 6E__;** +K&-A+::4+$&'#**"@3kҡLF@4,&*)/.HOV&%A!8478N5V2CF;/4JM5մ{A)2'#%9%.&1A%'1f8""! uZ=]E!(7'O.V^3.>$+;(Z;/A7$!5&-FpV9%/0:);ճb-0'23W1L9')#/6$F.(4((-Vi-G4*G3%:ӺuCz]*19I+68L2412'(C@i054,EUU%741!1jK7='37"#,,-?2,*/'52A-I:n<~_10U-9ؒu,/B8-*.!+3#1).5M(.YQV,C[#,*/O۸A8)(%"@`(&85''%)-#+5CAS26Kg΢K1-=P8%#)6-,TO'F7)&f&MG/BݲXA?1/:)FRT50*x,hP/I?36-J–q]1 )4cNGI+4_S%q>hԐK&"787MϿ`FD3+0g4]˰â\>>̂QٲRN iZGk ^gPIS ^oU [yQŸ|jDӽ tV`ǭ ^fuɥn{ }f]I>e{~XddLumekSfuxLdPYgeq ]UG[]oWUXS}wǭ  sZZaK62M`x]yĉ`VH\[]fVMVDg}GQMl ߁EC^bU^gX@gqZP1;g ]EEY]_Xp_Fw^]E^GmoĽ ̐ʴS?ESa\hiDl|Q?[wxϾ ÊDIBH[edfWn}}vWr ݩ6jJetTOadgTx!A_ ǂpg3BF[^ GD7/439nhJP~Tr FWCC.S[H80 dj5R LqxaJ>2/55> iFPl3bcå ^_]NJbPPG=4A@i_A?b|zWH2GKWRXZGW7M8Hbb>leC!065+O/W3OSjeS%". q1JnH;SM%rK:GO=RQ$&:YL.a^X 5SE)hCW^EW3($5g`0VoGQ*>I:%>@qb0JRmSWOX,$SQhE7-:3R//^s:&(4)639%I02+))*(,*$/-*a-+)-,*4%*&=3&?)'6'8Q443*B4O5M6/{;95@;6Bw(&'7"(,35.*1 9)/02'#++''!)+4/58A>0*>$1/52/6D71Jx_P3,-6A('&(*1((,:<=(,=1N5&+!6,,2\595DA*[*2.'055,"/<0v+8P,I&0,A'86!&'0B"%-/0",#,)!!71248.CDB]txg!Szh/9'339(711,(2B;pg97",;53F4=>^v64i*VA3>-B$5=_1+":%/:7,,1.4E0=3;)v^-C$JJ4/4:<9S$G&$:/(*3?v&*47'.%4M+0)@*.0522*Dc7-*.%,*#4,+.**415./5-;424C$0,-\F{S66<3,,-/78->%1'.'7.I;-5*C8F8-.@15+8HF(**>;7<\[=-32./.7+3\w#260/$0:01,,7*4(11636*8EH230=%Oj{P?$,16607,EYt('>.7<:%/04*&):).>/16,?-0,.G+9czi@%.*5658:>I|,.$3$,-5.#3-7Q849016P**/;69G1 8-dl03'=4)7;8.M~~PWe5/(22H-*D*82'>101!"&-''9*/3JIs|:S6A%?D5Y|~}&0&-6;3884943-'.19%O997/1-044.166J]z|Q5%(=,$48$.2<]y}~~}|6.<41539&(/74/3$2''2'$;531/3.3C37'*Jd{I!3<.1(1,[1;8Znx~~}}|{&(348,03+4W/-1=30;AD1>0736.20.$6=0:G9Pu'(-,/723030X.`z{wz~~||{z/7*,0-)-07/+5:,5=\+$/3-86-I,4?=('99C47!(*&'3,7468.+Zrv{|{|{{zy2;01131C95004-D+%4.'-1%*/=,.%911%>106B21702.I4786Px}~{{zyy;/.0+/6;(321G94(4845@HL(7,3.&*4:44>.63*.)),47C'6;Biz~}}~{|zxx*C3,,/*0C7.-A6(928(,5_/.6,0-27269.3054([<3--3/4[fz~}||{{zy+//89=*34)6?*421);0618H3G.5,-%.G6(33-446!-+/C5DJW}|{zzyx9G?*+<:,8=6/'727*4>7RK+-02:77.%'$98489S>,40*L]{~||{zyyx27('+E6.9A6=14*,55((4134A.--/3832*.;9%,,-3=Bturz}{zyxxwN7.6@59-,1:;Ci;10+AV1=/<-, 0+449*735F?LMS^i{z{|}|}zzyxxyxxwwxww4-%373/-J!*.;DH.:*;<338)40E(85767A6>>BHw~}||{zyyxxw,&0301-:(2/722)2U;991<59.J;/.'I42XAD^~||}{z{{yxxwxxwwvY]V?Z$4-EE/(^P?0_%)%6E4&B]hu_vhp~||}{zzy|{z{{yxwwvutwqbekzvqb.HYJL5+2^kvRNU}{nyz||{zzyxwvutsٍwwKJO]pI{qexh~~|~|{||{zzyxwvutsgoxy}|bv|o}~}}~{z{{zyxwwvvutsr{}|}}}{{z{{yxwvvuutsr}|{zywutrqpxw~~}||{{yxwvutuutrqprvm~~|{yxwtut tqpsqqp~~}}||{zxwvt tqpsrkr}}||{zzyywvtutqppoqmri~}|zyywvvu trumtoqqmx~~~}|{|{ywyyvu tspmkln}܃~}~|}||{zyzyxwwxxvutsttsprq~}}~}}||}}|{{zzywvuutstsmor}|{|}}||yyxwvuvuuttvwxnusrpnog{~~|{|}||xwvutsvsputsrpry}}|{{zzyxwvutxuuqnx{w||{{zyxxwvvuuvvutstusu|O7`{zy|{{|zyzyyxvutvwvvuussusuvt{wcY_,A=,xz{rzyy{xxwusqstsqstruyv|tzJC̱~xuyzp}}{xydYS&;,#8~go,S4Qű{|rijd^mv[c0N1FKZ]^nkZPGEDLAT[/힣akaa^r>(%.edakomz.;([qylz~MO5"$%d[r̹Oe+tq^|ܦDV540$mqlxah]VOM?@jkhG`ʳyĵL1"1,da]Zhhoqv$JQ\h}h:B<,&.^t}•f%fmyint0;5Z}{~ori_RVji1YȂr8/OvhgVtodyFhm󅆌g6/6%m{\ZURntiI[SG}W]Oy`9bwBXFL}mc^col)qttELH2fijH3ưg@UB@gzloq~(X;MAU?B>aQLSVADAUHEMVeQKQ^RBKFGCPNJDK@;Is@CDCOgS=M]XvXZ_IKXIUQTAgQSIFCBEJGAMNMSIGJFCLbb]b[U`@?CU@EFKTMIPODOXQ{krOEMVISXcNeXKEI?GEBBGLSYR]Z][XUYbVSTVTf_[XXRWPeQKYRKPTGNU`KIG]VVJ`WUYbMLYXVRmYW[`|\QQRMQYXHQUUj]WIZ^XTbloK[VXK=LX`ZY`T\VTPEDKRR_DQamHaPJQTPTgZQL]WM_W]NRYBUWYMOKSWQUYRXUY[M~_XSU\ZdPTSW]_NXYNZaJXWVN`UZX_oWkQVKKDMeUHWYTZQS>LLVl_mu~`mdIM]^R]b[TM\W\OYb[rkNRVU[VULCECZ]Z__nYKTRUvRWHHMeZS_fZd\ZONZZKKVTYXbQNLMTXRRJSa^HRTV[fkmVKWe[]TQRW\l\TYPatP_S_ONCSN^]Z\M_Z]jlwv{SMBQ^\SUn?DKcfjQVJ__XZ_NZSgK_XZYZe`gdjpH8AT\XSR[FPO_WVLKo\gfZe_bPl`YHAk^`np򠡡x{ueed~WVh^HjXkKOIRaV[m^_pYVTO`roxzʶiTp@TOfeUH{yfVDFBTcXNkؙXqzmkQBQ}w~௲stwk㬭ܗ   󓙄 阖! 󗙙ߥ晘 򖛖ᛚߙҙoO*fٜ~mm4LJ9򢤨ߛbX%˛w}zm?K<2C{>gDZ묒qZb\MNIEVZbej8N3OYimp~{md\YWUOgp7鉓mS`WYTec{T:D:5S;O34551:40=w%$$4&)11*&-"6)5&-$!)%$'""3-*6A?-%A)-,..:L:/RӧN2-/6A*#&(*-&%*799%)9:d;+$2(.8^1.=SH2b-62-&)5&)50#D+M+%$<%)6'!%B&))-- $!0*)#+%."@\Pxk/o506/5#3.1BH/7H%D,%1A55#7[+-,9(''$<:1"=&)8?IԻ{50$+<51C4BE/3n4]A.>4I(6Do87#+0,%+1+;M.9466w(5)KM6029=;~Հ=C'';0'+2? y..32","/Q.,%C).02$2CcҖI'B6"')*,+70:05,2+% 9+'% 1/(-(+.*E&CT%5/4.56.Y+.#2!'(-'2-8N1,5022L'',87@Q763ާC0$96,6853sЀRXg5.'&.I,.D",2&?511!!&!"#4720[n۽·X^B@*F!@3n$-%,36/5>;2*1*#)26$X=75-/(/)767yܿ~R/&6)!6<%*/K1)6.*-*6(-)'-,3#/$(:)!:2.,.4,8D,-9h׿},37+6#,3a-BM%$/-1#%,9_(&3?-/BKK,8/4*2)-+,"27*9GIxF322,.)3&,7d7/5'')&!-)@7%07+1Hf0&)1/7/-I-5=;$!3;>3C"  )4+66&;&,ĺ/6+.,-*D2;6),.*F')%".6&&-<,.#7-+B*&5D,(7721L3272j2$$-))/940&D/-,652@DHP+7$,(!)36.-B&.57-&0;EH+O&@3))!3F:30<,#?+2 '..3"5*/(/F6Q%3*'"/I44+!(<>&)"/C:P_4D=))H;"172*"3.1$.<7fa.&'*951.*,"/5**,iL.)#*^16((Q5*5?4:/5' /1),7(!)B&++))231#'13':/*1BWАV?/%:<<+)-68..%1-*"-hQ51.:58/SC*& F65tFPzwc4:DhAK=T!!-519I56P7327GTLQvԡtTk#',Oa#1ohJ1a'( -89@r̼͸Ш.TidA.Emmx§ԻٵlakƱ^ϾؔЭκ̤̲  С  ǿɹ ȴņ_2hͮǽtr +5+8,,FތKS]PLQ|ԦpA#3O: VaXys{N',emBD^Tr}|h|f (")Z\dOtzk.:KUTՇixyygĬUDQ9yb][㔛_}wˏD>3)$V&+c랎`zowΤwRX7U;T6_cҼӛ?~~|{zzyyxwusrrstnlj~}}|{zyyxwvutsrrvpmn~~||{zzyyxxwutssrrukl~}zzyxxwvusrrnm~}{zzyywxxwussrrsolpbo~|{zzyyxxwvussrrqppim󅂂~~}|{{yyxwvuutssrrqoppk~~|{{yxwvustssrsklso󃁁~~}}{zyxxwxwuussrlq~}{zzyyxwvutrrqpoohnt 󁁀~}}|{zyyxwvutsrrqoonmqi~}|{{zzyyxxwvutsrrqonnmt ~~}zzyxxwvtsrrqnnl ~~|zzyxwxwusspontfkv~~}|zzyxwvutsrrpoonopi }||{zyyxwutssrronmp|zzyxwvssqronnokW zzyxxwusrqppnonmkNyyxwvusrrpoonkolugyxxwvutsrronrkp^yxxwvtsronnljkywwvsrnhyxwwvtsrrponlmi͗Wxwwvusrrpoomrgpγxwwvvttssrronoirͬwvvussrronnmqvvuutrropporrtko ܻҢvuttsrroniuttsrropnmfkutssrqrronmkvmlotsrqprrnkhRTt}sqrrsurrlikt{t]n}rrqkmnhvmbzrjz׻rrqpooiqobjldqxt}qqrrporitaO^mki|yyssswunao|HjE`Spfxp{|hnmny9>oh[ok`~zq̢`ijwgYeeblmh½Mze1\tz{wxghU\)CFBWeptw`ҘpQ40669[{wh}z~A.854BTRysnS2@NooR5/4''0#4<`ripq׷11,)+@gubiptizxx\.*7knoSWhajr\uxu^a%>nd]LSO`_]qjcvc-RXQ[>BRYdfguxxjg5&$&FWUTCEFZ`i_|ao^_u+) UO\OBF]\eccgyhU—1(%weHF|fO^ZxpctJ y0')BhWuXt~qqime^ R9.'IpcfcqljqkU 92-0hs~dVye`Zeuxwt 06,Eplfa9cyh[U[euln K16/6#$'qtqdSVTXpo{i`&13)B-2p{vt]WMT]ttaj '-v|K2PwYPQ_con l#6M_]3&+yMTR[otwqG#,[xTQZQXrso$"<W|~GSPQWv\i#,<Kuw~QE]Kuu$Hmmqritq\6 \u(Z#?~zzvpu`r' e)c;4:Tc`g2 %q뭬򔕖   铛阗 ꘕ ^昗b㖘|hۜbݗm۔͕ľVå̫ܰٮΛձ̜󘗗ش暙󘖕ɶ䙘xW\ز򙘗LLceۿ혖𘔗m`IZj˵훕vXdm_Wgrд떕`TO[^eaj`սmGKZ^[iff`bѼ󖕙TF`QfZcfi9/re\L_WPib^ǙeZJVVS\\VkƺTu<[|y||ahxnhgYl_n9795MXstz_rdj`ҡ~_0.0-/Iga[xph|B+2-*7HCg_[A#3=^byN1')"",OaYo^c֭ѯ,+!0TsjSY^]r\hayW##X^cJK[S\`Lfid]\2]TM@GCTQNb[ThU&ILDO05GOYXYgjk[k6%"%CQMI6=EGN`alj G NleGENBIbofb!* Lmp:GCEKjM[%-{ @hjsnxD9T{D ns{?`_c_YidW1 Th(Z#.olke^fRfw' N})\6.4MSPZ~3 _xпкѾ̾ۼ Ƿɮ Żӻ   ηoĿxιlkݮƾʽu굺޿“˓¼Wꓦ֦ȻХڻ Щνzѫ엯ɻ֝ޘw6?ЩƽD+;;59ƬȤ6E'7#=.>1:;]bѴ(KB:+>6+@98ְc}˸k_X2%\342<<.Ec໮^.)BHNXV0QP[^>XRDZ7("E;4% $@>]@   5HC+2>2:H);DGniĸP B94'0*93/A;5E0j650<%36=<6LmLC?k*+976$*'7:B7T7V>w@<9/<2');8F=7?zHkC,qό$XG2+^E066SF4RReT o $n?A\6UXDCE<[?=>pǻJ+'\ZhCR<:9AH:MV.m Χ%#%Ab/cIf o*DCI?9IjT4& 56[$ULQQ@F3GUo -VU($+>w<67g*6Mk的yϢll ܖy z Ÿ    - - 0 001-./1212666668796:;;:66ȶ6W6aC9Zk9^967zdv ̝z~ `cwz ޑt}  nv     - - 0 000--/خ121ȿ2666688796::;<8̾6¶7b6sP8gw7e878pYyzw{wp}Ǘtr}~uz{VZmpx wߎozs}ư kcE j    / - - -014ؿ-ȸ.ŝ32򂲹ķ1򐼮1667668796;:;:9Ƽ9²7c6uK7p6j77869786ď5ގ556ϕ7ŗ7Ș7葚67×657ն(Ⲡ)է+❤)ص)ѡ))դ)Ѯ)$𥢵۱%ߡ͠78886{5~666ƃ7676676󛆋5ͧ(̞)͙+ۓ)ͧ)Ŏ*)Ȕ)ơ)ȑ$Ρ%ߎſ58:8ȸý8m5qxw6vojv6utxrwsr5tsrss7vutss6wsrss7ptuss6ytprrss5qnutt8ttsrr8x|5ǝ(뽏|)Ɛ~+؏)Ǡ)Ŀ))))ú$}Ɠ%~뙠˗ᖑʖ ꖚȘ ϛݥ 󘛠餦򚜛򧦢򞤩񨧣3565  $##$##~~ဇ񶂄∂ 냅ڋ 鄅󒔔􄅇󃆊ꔕ򅇆򔓏3555  ##$$##  %Žuurttsttsnnmmlmlrrpnnponnpponnoppwuuvuuszqrqpnnmlnnmlwxxwwvxywwxwuurrsrorrqxvw}uqlsts srsrtutrrsv{yvsqttqrssrturtzҁvsssqos stsrrtv{~{qqrsttstrtsrqvtsqmssvpssvwzzvsststvpoprqrspnss}qpqrs sruy鄆zxtruurtwtrrqruoussrstuuqpptsrrs|urqtrssqsrrqssrtvussv|yvtrrsttsqsstusqu||xtutuwssqrt|򆄄zvtsstxvursw|3}555~}zvvw usvtrrtuu tus~wrtssttssusrrsvwwsxrqsqrrqqrrqrst}ws#s~vtvs#sutsts$s{vssrrqs#s톅|strs"suts~trus#sqrr|<:;113񜙟1橎)穏)ꡑ*񛘛)᠓)ܦ!઒ !韗"𚓞!ڗ͐̒ɐԌ喙  Ξ!З!!:2222../50..}=:=4}13ꏅ1ޚ~)|+~*ꋀ)ۑ+ؖ!ە!ᎄ!玁!҇~{~{܂놈!lj Ç}z!#73222122. 1.􅄅.?;;:=ޔ3mv1swus1uqptwu1֏rxtpvrvu*ڑmrsttwtr+݊oyrwss*mqxsvss)ׅuvpqwvtxrss+Ԋmoqs|wvtvvss#Ճmstssrs s!؀sswpuss"ރqporssuss!ntquvspwoss{qrptuuvsrsstvqssmxkpssjsktmssmjsxuysssstssruxssqvnssywlsxsssrsrtssprs swrs szpknqmtplmrvtrosx|xs!svnrxvwyuwwurnnmmoonoopqsnuuts'srs7s}xqrssttr3s|vsrrtus2s|wts3szs2s}tsws1srvwus2srt2srvussts.stutsts4srtrsts.ststrststvvtrrsrrs.srott    법   𨘚򨙘箏˙   𗘗     稃 {~ } 椀 笁 ~ 업ꙃ}4=˄|~~   ~  u |  rwstss stwwuvss trkrqptsslrwnuosuqsswvvs snurtzs soluvv sޢvurpyrwtts smnstwwvzusvs svxsxsssuxtvrssߚsulwuwtzsskvwsvvswvussvssxssus=svsstssrttwsstqxsswhxvqsqtrsro swupxomt| smwpzts sktvs stqsrsrtrouszsnslquw smoouq sryi stssqp pnr{r{44// 1 0 1 0 0 0 0 &&&&& /''';;;;9;9;;;99;:9;:9;;;;;;;;;;;;;;;;;440/0 0 0 0̿ 0ʿ 1 0 &Ŀ&&&& "'+();;;;9;9;;;99;:9;:9;;;;;;;;;;;;;;;;;450/0 0 0 0 0 1 0 &꺧&ͽ)&Ʒ&򽻼ÿĺҹ ۾ 龹ݻҽƷĹ̾ 'ÿ+,(;;;;9;9;;;99;:9;:9;;;;;;;;;;;;;;;;;%"      Ÿ Ʒڪŷ޵ÿ¸ڬ%%%0/.,ĿſľúĿýU#!Ͳ|kXK¿ѭSS[N_XRT[ їZXXZX XV\RTR ͊VQTP[j} ָ”LXE ú[]WY}QPYL¿½\VTYskckýÿȼ¿ľϾ ´ƷڪŶ޵ÿ¸ڬ#%%%0/.,ĿſľúĿýU$!񫭮󧰱𦥤󺻼̨[Ϩ򩨧4i񧦥!0 󫱷 p"$ļ %º Z%d5Sź ɐtfa}󧨨u0˻ źƸ󷵲䥤!NǸ婥c&l۾ĭ򥤥%Lο񼽽ή裡;,Eaۼװ¸ٶۼ ůǹİڪĵ޵ÿ¸ڬ%%%0/.,ĿſľúĿýU ˴½ެ ޯ˪ѽ㥨ƫÿ ɼ!Ľ ſ 󽻸ﺻý񹺻 򸷷򹸷,mgUWYU}ՕN~XKVmdUWV]E\]TT[XRcXXZV]ZQXXYS[JpTXXZQn\nUWXXYQv[٤PSXTTVVeǣsr ˴½ެ ʼޯ˪ѽ㥨ƫÿ ɼ!Ľ ſ 󽻸ﺻý񹺻 򸷷򹸷,mC% Oѽw'^_Nέ# FM* !('  !%8_  !yLʧ$  ):!{7"  !Mkǁ 2zU?>fɿ ˴ ½ ެ Ķޯ˪ѽ㥨Ʃÿ ɼ!Ľ ſ 󽻸ﺻý񹺻 򸷷򹸷,m46; ǹ ָ̩ӒgNLMLJGKh^MKPQNLKKJJG|ʿR[VTQNOKMMKHE@U|SVQWYTNMOOMKQCD>O¿`R`MKMSPKIHH@DFEDBxfKNIKA@IhKOIKBNhF=GNo|""%'&X46; ǹ ̩Dzᦃtwyxtqr칁}|xtsrpsiʿz}zyvuspjpiz롂|~{vrturorlohu¿谆|}~ywutsuponigzڹ⍃|}ɼfkmtjθ⯈~rhnm Ժ䃉iil ܊ymghl ҉vjgml Ќclk ʌejj 鹺Ӎ򰲬frk ӑruppnonhnn 渷tpponmlgke 圈xusnmlhlloʇusuppmomn땈sswmqloh㎊tstkumpcڑtssrpjgtrsrooxrqp""%'&X46; ǹ ̩ʬϣʿĪ罳¿Ѹٹ񹵺ʿ ḹͱ—ﺹ쪻꾑 뻷ߘ ີꔕ ِ 捐 蹺  帷筺䨩 ߞ޹१ᤥ㥦䦦蟱ꮮ""%'&X=; * ( ( ( ) ) ) ) ) ) ) ) ) ) ) ) ) ) ( (   ::::::::::::::::::!: !Y{ ( ) ( ( ) * * * * * * * * * * * * )  +   ;;;;;;;;;;;;;;;;;==   @| ( ( ( ( ) ( ( ( ( ( ( ( ( ( ( ( ( ' '    999999999999999999!  !@E\Ay`ɖSFVcĕ~O^=qe ȏӜvAJ\l ӥMDl ѽ=N]X ŻO7m 㺾LIjk ͏xL?p VCk} mrDOe na7ozt}pqFSfp}vXH\xqxGW^o?Dlsᗤv@Vcnzpus]SDit~} 0Z?d|k[>,v{:b!::::::::::::87;656587;\8M2jQﱯkxvF7GTw~_}lFR/`[|z`5?N] tw@5_w вū}3@ML籺{}D'W Ԟ}}x?8]f wX|u|?/e w~L6\u ָRc8?V lsxWW)csjgXeSS:F\UfgXM:P}^dvZm[:GTTpqtc56\W~}Y0FUVdY]V@L4\aiif&N6UeZT2'v^l4U ::::::::::::57975뾽ļĿܿþɼ6685`:P5mT[Y! A^H:JWzWT :EO ES1c\VcJrqE5@P` fTC:n{wL.x@7aw KUkwd=14@PN \we`Y6:6E(\ HYU$9;4A;`g u'/+5A2g N;)7M8_v zl'G:BY \-8[V)ct$ % :F\c 2S"/L:P/.5:HS4 H(1466]V:R7 3IX%L8^p'#%O'P7 #NV4&-!+6{в!999999999999:776HDYGA=?5>8I5A@<@f^I:95799[귦}cSDOIOhkfjrr.dzitnlw/>DƽƳF7Rdo/1'{oe;dks1:*]tmtxocLlsl[4,.eκoXݷku+%>Ȯ^_؋/>_G1${ffq~[U|hہ.A"ë}O䉓!+uҧuhPx4##:pkyPpI2('+ξv~0mힵK "Y4gꥬf."GsxOxGg~B0I°bDokآL$.,zdOʵU Vsc2KC5nTNY ʷR8%'5ktnE pԉ+K-*hrndOcc.¾_ ,)>W=16u Ҽmp66'.BdzJ5B9M氖n`}t sOTvk} kslcΕ Zyo jd\ | ߤq!  % $ % $ $;%%;;;;;;;;;;;;;;:;;:ꠏ~hngYiegxvvqy႞;LaN~abyzDVYλVFceo8Nt|CN=~|I jKU{傛DV?nw~}{Y ~S`s{iDAErÿý|d ĝ{):=Lгuj wy;IlQC.{xr` zxslډqCW4˳[ |헜4A!ز\ C98Jx]Uӓ?@@:Ÿς=T  駻Y/71hG O  v<9&T_X P  ɧNE6WɶuQzS T9FBNaM1@D~ ԽxE-V55>Nu VBTFT约ycy ڃSġaύs rvg֛`q ngf "x!Ј  $$ % $ $<%%<<<<<<<<<<<<<<:9X8ѪQOvy4,$(I~Źk?ob|qηkϖ`~倹cO{zקK uh}q۽R  kxau` ٺsznx}  wkyμթ|6 ρfndѩ]U zxqnkn yZn{oāGdry^`}dtUyqwq^Tr]іmqfmSgdzqvıju˳} ۼ ítک rΐ¢ ur  󶲕 }!ߪ!!% $ $ $ &:%%:::::::::::::::::: ?phIAq(@  37630"&1;/R̸ʼ¿{D$/7"ݸ\.5.BO*0+̺𻼼 +-/ֹ/3-uعﻹ-5+aں-8(Vܺ⹺Ŋ2!B_پ/0/0&zؼ..;˽*/9@6/)ȿ1,X¾躹11@Ǿ11ã21$*+*/*1209s藕#񧨧ꢕ&蜛 Ō䖛ٔ藛춋~훗є 񚛖禁Ɠ 񚜚ϖwܸ 񚗚{Ӣ s֙䂁~Ҳ{ޅӧހ}x曞ւֆށzӗ~Δۙ}z 򜕜~ڗϛyz} ȶ}w{齱 "ܼ""¾ ͵$(񼻻($񺹺 򹺺  Ľ ľ ý󷸹 ;  888A?ڈ#񔕔ᓄ&燆񥂄 ҉}zwvtrpnoo~냅{uspmnnoppoo̓肆}|rmnnortqqpoox끇mnpqqpponnoӊ톂tpipnmnpnnmpqppooĆ 񅇁tloo͸ 󂆀ȉhnmooϨ mnnmmooƓ bqhpmproodžƴvrnnoomnsopmmnonmnmomojsoo|ƥ~inppoorlsorpnnpollqionpnpovɖnonoompomnoqonnmkfsrtxxz|߅퀁qppqoonpprmr|큻rjămmooqnprqsmww~mqsnpopososj|rormpmopmnqlnokqҌÍjtlprqroonhǾnpjnnoplnl૪{qmqktls ȶoimƿ齱 þ"ܼ""¾ ͵$(񼻻($񺹺 򹺺  Ľ ľ ý󷸹 ;  888A?|wvttus#stsuv񆇆څsrnvs&svutrwtqrrsqps sxqstvtspopqqtusrsutuutpnkhgeca_aaqtpsspursqqppqprtuvvtokec`]_`abbaavhstrssuqutqvrvu~q~rmc^`_aceccbaajviqqutsspvpsy}^`bccbba``aݼtywwxssvquqqj`ecbceccbccbbaayqrtvs suwqulqj]aaİnrpwrs sqpvo^c_aa˚txos sluda`^_aaøýsqs stvZg^d_becaav»wrssvwrurswq­jcabaabaa_`eab``cea`a`bbd^gaasnüqwsspqssqo_`bdaad^eada``ca^^c\bacaauxqrqpotwsqssorqpnōadcaa_ba_``cbba`_Ygdfjijlzqqspqrsptssnrdɿdefaa`bbd^hzqzswrs~gtwwvwpqqutsstc\ǽyccaac`bdqrwootrtnwprrpvtvr_ebnjq`dgdebcce`c^mos~mumspooropdaecebcd`_d^`a`h̃ruwury^f^ccda``b_㾸cb[``ab^actb]a]f`l ȶe`eǿļ꿲 "ܼ""¾ ͵$(񼻻($񺹺 򹺺  Ľ ľ ý󷸹 ;  888A?.𛔡/"!󕒛!!򗘙!󗙙! ! ! !  􁀀  󗘘  󛘘󎝘󛙘«򜕝ɾ𘗘&4/11),*箩*ž ݹ½!)¾].~~{urtqqt/onoopz!񄅄~oomr"yomot"򅇃omoo#omqp}#ompp~# omop#} omov# oms# oqpoot nmmpuz~~  󄅅  􆃃򆅄~󁅃쿳~~򅀋~´񂆈&Ϻ4051),*箩*ž ݹ½!)¾]wxwttxtssts.spmqmgdfccfourps/syta`aackvsts!stsorotuqaabdpus"srnwssqkxabaews"stvrtyaca`s$sturabcams#suracbans"syro acaats"svsl abagws"srq aberts"sn| acbaadrtrtssuqwvw `__bfkosvrqssrqto quvvusrsttssrprp sttrrturrsrrssqs pqqpqrsrtrtussz tssuvtpttutsrrsustutrqqssutqpsxstwqxpnqoqnnmmpwvwxmooqrsuvsslpmnqss淨ywsnnprqomnosrrstspsson{qr̽ytpospqqrrquz&ʴ4/:1),*箩*ž ݹ½!)¾];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::..99876 4 2?==<99876 4 2?==<99876 4 2?==n K K KdA2 mu-editor-1.0.2+dfsg/docs/logo_design/world.jpg000066400000000000000000002467541341747546300214500ustar00rootroot00000000000000JFIFHHC     C   bb H! "J5^PB 3(BMȀ"4$]IϹk\y-ˀB#C;O7>K@=5zrʙbyjv@!0yבjtEz( gV S^_^@yzz7}Y>t qMW:yO\B?]^˶جƬV@oB@1]8݁=<.[W^yG:b so|a`'f5Q2"HDe(_;~O{eu,7V:7h62%ͩۛՀ@|Yootyds O3y]68gn:xz\S0qO/j kCΦΪ>#hc8q=_E{55'i@ DJrYyΣӠG|~SuuX<}[זUosUjJ #n۟NZzyV7<5;mwW;˾KG}Mb9-=[koyS/k.=.?nf} og@;H'n.r[بB9ҧ=~^Qugѡz齹fN׷sD=</yw?Gr֎{S0SX7!f->}3O~9,C{|2^iglZPގ_s~e[CYڮ6Q!s-ԶSmtz4ɮוu|;C>'~Vg!˯^[V0|pv*5Rh G=q/F=;\vKj@B*ZR*ITes<^nff|7isLt7>ϫ@!|kd{=I1q<>]qyZY .\KPTl%*Md:j<{k]֯JqVj ozyf3-BTJBR[$IjZ%$$:|yN-w9:z9{ x2QuNT}|7nϣqG7.j{y%!P I5 B%]%JY%BdS9q)թј}՟kmB4n8izg !T|nñkY-BZo\XB)F-}]co{u>&9󏛋Kq~no4xo\w۷vh%N{sO5Oy{/K%Q Kd0;_VHF TV(ԉV߮)Ie2M7| 搚yz=6gr{s__okxdIiPH-c?'ͭazzkuy׹bU)-5,{ҝIN,Fx}~kW-kO}<SJJLLN:r,tѸoTZTJBL<ؼ;ؽ8yTBԋl[S9};5SԒSԧe+$N?o<ٮ?v޽4HB5ZJA [Ǔ>?ooПS$| +ZWY*,~vSܧTi;(Os '=KZ5F~w>s_1^;=zs|}??nv) l@Xygq-&Ӻ͵t+f-(UdS]kjK)KrK)NOY.}ߝs35cY~~7絟|>.'yOj|_~Q}B%B[% yY[H+c$U$lI mF_5)YOR쥥+)Rn?&so?n5<8O_Oϗ>l^?fCd*!dYg1}X8vU(Z|,"m;Dk)GRK(SZst}랼vvγWPY=o[C>+O<>yFm{r#K,,J5Yo}=1~މ~7[8O}c>~odlBjC|g5Q(EKa3Rd&P-mLEf[l.M7ZܱSU~MJZUͽOvmǛ]@35ɫ oޒ<\7kj -Ifq<,Iju3kuu!jB֖֢\fZoWyŝ5fq+ū~=%Rl~ޒBzs@ Pͭfh8ת]ڭCIZ3'󘐕'%M5KuV)XݫZqgFڙ;Vc|#'6ꮤmI-nοYlԣ\~?nkYF A#.;x_Y&)J<|,IRx, X˭B&"*6֒3o\I*EMSKӾM5.cl3&%k}~{/E+)ji?<z[=>w^}')e=Kjy;?N2Kd w9oXĮRիޫg"䄑2Ilb)9mhZ\zw8'ĸNzKxṶg.Y/&hik~c0w˷sƔ 9D^K!CQ_LN$..HKuJۼb]'-Vy$ݼk~K< 'i]c4-nCӞ1Zkz>o]uק;c7ks~oM͏:Pʵ,9U;kH݇KQ֫g5K"E߾=sߙJ[sUfKf{՞$6c^1_C;xצ{rt-TмӪJz='ss[]z̟3#=.*ܶPgb[eKmi⬑(U1.<$Rg?%7߲@x3ݮ:7J/{\Y-54֩־n:9b{XD:&Ο7T%9К̚զ^f|↺R+C jdB_smӤ֥&6w>~S)Vݿ>\w˛7y([o˯0kF!<) -OYAbDgMSϚؖ[;"d(aLis\m֮q)WV}^]dԧw] ^w4{ܺf9er9~ϭdC KVV֮&muJ}p1.kU1QBSl/:,36\C hMWLfu_W4ꝒUG˕Ԉhr陽 r̮{>{)˓\4"B3KpۜݫWNt[S9V\ݷZfK]jr8Vwӎ~7~%jk%Ӹ܉R€Xu~z}V5-{<  >l|6J{5iW6kVKܱ"ZS+g2<W*>ݾt?=/}չSO7O*K*Ycw5\mZ~KA9nsrW;?\gk=s@ -=T>ΡB)"@2?kyS̒+cZ}.r[.[l72=3{JsKr짩!!L>-;rىu,cӶ9e&#@Q2ط}ɓB79w@+Y1OX݆Tm-$Mrw4ҞKi,R)H'~N\4UK\assCJp|8wy]^U"@Yoq\%Nt2䧙ߞ͊+w;mS+rRJR%D9=h W7]Yη.Wl yÏr[:vza0ݿOzԣ\osÞnZOs-蓜پ:8SK)ԖJS$%{Sx=@\cs㗝8y1-uT snǜUI&LmltZq?+>|opxU- loGۺ3U m4']?<yߤZ@$*SDk|=j90FyL|rh2~{e:JdlNٯonYfzR,syf:@ {.r\}3#"EK̾Nob4MԄW(յdnS:_~$II l{JnvXs:t/m׶2ݳ$󯛾ŹicY;םsۿEilZM?ŭkuyۉ%[qk.tq},mg{I,L͟Wk:qws3/㽭Y.[YzbgގPH!eP1p5g<)rݳ)W*ԶJJHJJk^>X5?{vYŻs _7Po&l{錆@ py3X?wxcd" RItB-B HշӢWޝߟ /m,\XP9k ry5:>̟唂*VU%B)P%B]%IIA-O?^s񾎹p/|b떲\:f{3Q@@!@Μ tgXӺg{ncrK RZ)?_ӧׇ<>~KBىwg#ߜSA-9ͦE[ˣ^~/V|>>RUƩrS[7[??_Kp'{X[IԠ-Z筳"-`M-|ie<;k]&9f4|oGT%{yh{ϛf5=oV[{Kó|햪~^;} nmŗT)\IkM1. ~WԼI^tw&^ucٛtjni%x۝|\,@4uHny{*.w_cTztW=,}h] {7o7~ϠIzyW .{M4ytΡm>Οl`qW.O|Cz|\?\fz̑kצ? yjvZFi>G/Y~ OSy?Ǧyzg(_ۨSY.: @Fz8?ݾ o8W흛ע qFr/|ݿĐVÎ_7x~l޵M|!?Ϛ!%HVǂ}o6SϾ>F(,u|Wڀ|1R gl@ D3 !"1@#02P%3A`$4B&wOCdH#O`oj]!l>2K]k:$xqafWԈ\J{61Ln3Q]E/?`AjZXs,Vq& dɩf9`)#HC5ɒn44ƪC:L>yg Z5Py58+5dʅWS[3M {Dݹ}! mt\Y焏5?d eOK^2y9'|lf4wkܹQ-dK5-. fTLmh,ߎFfeo~.r^[B vÀ5UNfTY? JR͡sIqQզwÓe_L6sUiM =&wt=vkycMrn$-tD&unŷ_P%y5zAD5o{YRVɢ[e3I,x1&(T9ڙzVZũ?)!X"n{4WvS͈vEIzP?Զ Յv JC&y.JPbD$j2>I~a?.2:bMc%*^~3BZp#3kA;kQj3R@,v\vfYIjFIdb{xBwzW^VһUOzJ~׎uBK\1o3R7$Z˙Se'S&Q9e3\[V'F2mWēbYM _ȵ$ПH'Y_0Ɠ&H1c{IxtWb\?&ҽٌ̇Jɂ::ju$^ 7r3{\\Q4鑒%KkNۯ骭(5ʐ 9%?nrvsjNWٜ:xڤUz6-u3.mh=|w^]@*OcȐSC28 N2Yh!UIK, jPЅ $8׮N81 JR9^NVmŐՔ˘ t 5c#V[Eja)[7LRDeMUP 86$Q#x@ ӊ^)\@9 əuEtC Zu/Δ0џ゛86^|w]!KduM({PԳS_S [qaس1<ꚎU],ڟ@=1j}UVC,{FXi+m#rv%q|)[Ur 3lm 08nV+S`QsE)X\7c afLKR42' @akְ>r:KnI4JunYJn}!_a ے>`l&:2wFתiupwRȽb숊Q3E^|^,W6nc&6ɓط,H)M 4zo+=,-!ث2N[Px״i,^]ߢ*",EiױH[H;k븼K\4ֶ޺g]kpuKv0y$QLtb. 姁_'o]q_cw:Sx5Yu"EE踹ԣݗsn> Ř:{M9F$򴮌*EkTRZGV2x_1[#i:έu=ƞ m?Ϧ&)`q=3{CW4^G|<T#.6dMtMI qz.jK.#,K|0p}VDqXwȖML'U[vŹtjk I+"k 4H]apMFI⤄ʛ*;r^K}UTW >!q.>\ (Zr,*HJȀ ڼe%\byuępPTW5O^;ZtޚJe6ov(KEۥ{Yxj5*ܤuhsKT~MCi"8R|S)zCm뺢㆜UUAg F`L2Q5[-7L9 qM+f}_eqz.j6{6z9iSȺp`{6"l&+" xee&c7#O_ٛ!`2A$b,y[ pSu$G;Iƕ poۆn8(AzE3/ӃXػ"IVmowj\Ux60بʅ&xfM]q\WՃA%Kxb4[2qGu_ I'^8+#7' d$#/Qa`[,k6$7rlDna7Uyȱi^lz7{r⪻c~Q^L +&wݜwiƄAM`4b+1eŒ o5\/QHqAehkSр ./@ND:/ qmX<東Yʈ4q D'ؓhYS%s:\9{ DSD,nG뚒d* rEGEkde#`uЈ]T$M#`]2j("ȕc|#RF;h8<=~凥bD^׺ɮ/+NP.騦*cG9ߕ)Ak8҉-{xć\R,%}i&7iBW|VТ5qF&)G똑׊8{Fb|/;}=!ʌ1b\Lj{&$?c1`6'C:2_cP5MVf~Oe AMI6 Wo%MK-th^o$jwDAE^WZCdPwc+fMlY9+JdVY]eBEM991Fϊtc:̠}7o|.[Y&wl9#͜bq5yp#g"l޻^@mut.^U02#sWӭKXzM ~?o!k$W*⨌bKK@[f@Iod:,39bLܐ@|9& ;+B746_^mYƽQ'lE^W:u5[KKJVm0\O LX16&$$ٮ|L'5Wnq-|y]7~줈O2kˇE#'>(nuZNHڈfClBo|@,ElL,:.oW_ @Hi_ 'l~+qlӉM3jb|7⪈ {Ӊ UGWwSwZl͂JqƔ1|^jkQ}VTGz oFCWM"`"=ۗ|7O%7pLCpHsm#L$ !v;%ۻ) H)M;U^'f4.*~P0ɒ>W ~&Rmqɉ^ sMϋErChʑj>7| ӒZdu١bܐ} |-6\x\}6ݘuм#{z9hhk'2HmX!32E }Ӯp>UΖFh[WZBYgdEmcw]In;2X2s*VUD2ET]8H`9$hmiiVЙd#d J8ƋsRx:0}8LŅ"UѻfZeͲDVC|7oϫ =4DL6R#U!ݤ|càk`ilYWl=H4 nDQ}*;}զP .B(4=&$x F.m( yu'u)`EcbDhD|B l E3*Df1e8\W eͰcV=z).!.PS8Vה*e@h|Z#m }:o"ЗdVzeuK. dvDdn"?dŽ_Izj fi蜡TN,%l揸}z|I6%=[897`m$vQ c5. OT5Uȹ~5U=t)U[X8Ex P=-Lwr 5w6n(ctɉk:尊90&֒zm]mfQ[ve8G,ѩqѹa9A:mEb)UhW8AY%l?,ꉉL.vNxD/\=>7?Q,"|^~.ZYWܱoy"rg6͐o1㦩n'WVaQYV6,uIy-PRt1z*> xb&|FSte*UU˭| dr^;Z'A$|CoƏq`m PͫU4c<װϘVki|q^]?=SG?uozJt: Nt׿yOg]*HfbL$6㧆ik]%S/pK$3e0! 10A"@Q2Pa`qBR#?ƴ}" X%;?ֶs݅h(uU~E_O 75v|+w) iTmPA0U>yU:~C?eGS)ҝDN7*)}Ii:.@' >Pu6 3BP2}mGt~")[e48BDW[6Y﷕_LNmoKGaulwʃ~s^>r'U2 m-o>SxPP. .l鼣i]OtW(1GDCn8 @WvAE qkDR2@mK' NΟeujHcu>raP{%4SL+xJ>@Z_:2F`q᳦J%uƜ)XIrQ)7';w#mダ |Ttn< zTV*{!OpJNkG RTʍP98A(aNrbP|zAT?ˌ!n}s+r9^4NܯiO*fpS,(E\#eZ¹rGA+= .@M 䦑9Gœj+ʓؕqBZQ &ehƀ:.<# A\( 7FcrbQnJp{(?4(OjxEI |[@ҠйJ@m\ $ap0 lM r(OWi\O4o)SqF(iY:(3*!G.+;Ҝ}2U:)d*5APMpv2e }.C4''rRicp*FUW\3) JD҄Oh^*r*TR$h%SsXw Wx6TlgVWGru0Bg^;P(SF PUxDT~U?B#)eưb $ʈ@ QAq{SisKQUjz;'Vj5! (O=T.*nGi\51ԅg]ig>W*{wt:W=+s`]{~{(4ATl= l5%P{BIʤQӥʬ?P" 흃N6 Qct$c1B3pkOqk:NNT˧R=;+Lttm'?Bm+Hѧ QܪS4xmI5*.ӵ1aums22gSm5P1WPjS2jZZ8lŦ(7 Rۄ" )e}- e .t^]tP Q*_(o+z\W+z:ƃ*5 u:K!;ID!]7RKI8hNu.+&S{FاxO?QĮ.q)B)*:kvgN:IGu]"P3o1U4.JWѢ*PJZ ߎ4ʑ8 u%U\pomgRX.iOth6ǰ+t;Nôsd@Eĩ]u 4Fu&58XRo:=հATt n3‰xR+ (_Pn}ؒT,*Ӵ n>4:Z!HQJ /rõcܔQ]#BDºP* 2Q;qM0@0HG xT(5((h?jEJ {pPN^UOi!T*TN} (Gu& 퓥Qq:+*t(D#@W(#IGk[+J:Fn;B򎑻ƓΑB(. 5JM-CUEFѯ(.΁ʈ\@Aed/ڕʐT;ӱ\!>+(*6Bw >I\DJAL`"TKtoiV|' Or .;%:!{3ln:5G3^;uCRB#A0eTk]з gap%%\&Xv A\UȆ=T{|F ;(vzw BF=O g=E:dqe6Xb"4LF%y ܜ;w)cUȞ*Ehƃan#qn"Q ʹJƤlJviQ/cS8cd.6_:;'lrUOg_QTha>JN' S?0Tk> S¥At`v=*{LNt}&?,~ʹKh X^UNwJpԦܪSkN=);ܙA Jp";[|e 5 ;}aSZTi([0;'PRgm'ZTN9[*tO畅r`@QuŭNZZ<͚P ԌCl)" #cF"J򺏹 ΘE7AK*4.GCTp/?;mD&jXM'UG:2`d }ʴ'Qm*¬!ۜ'*Ígv:0ULrnL~T"gT8ʶ @?Š(?0?5!1 A"02@PQ`aq#3BRCp??5ُxe!q?\m7OcaULC^̦}QRBj25ڍ"@c]#YX^y~PG~]!y PF~?!S3e7:Y MLϺ{EPAL@%6F0Pm-(T*,b`ur,'`EN{=ЖJ=([90,XR: ֒+~PBssL8+`dtrbV}OA;&Bhp%ߊAg`82)ʟ*IR:jVeb\>ۢ6=a7%]@U'Q4AЃ.vd#X`*B[4@z,ZhsSj6e?bFAwR2PEj)ȐtlpWORik/Jpiuo IH A쎥y^;׎9xjjt׵19Ua)ZjcD6UMC©ZsdAҤtf?KB{]L)T ѹ@(G#ʨaTܯn iA`)WǕxOodA\%Odcv¡O85T@1痢dJ;a9!FTɞT*OgZVM.!/¢=S倩#8Nm@7Dґjo&;sdOdk~5W2CD6+z-h9EQr<64>Lƒ65j b6iI}9Z 0T[M[]e2Wmznvwp8cSį 9c⹡+[L~m-C>+d(ZC 1nT%n'2 'Pj:kDzqJюGj~{GůLUXڀȁ_?¡%~0"+CWŪ"meNFrV^,Oxe8N2Hbe8(iu_N1}31V c_r? Y0ХQʙm_4/*rJdR/]O_j%~nwU%k*Ru<ʞp-P hCP A}Ka HjPՎھ F@]:aho)O4axϔuTۄU `VW%ŖH946%+C+G2(]9Lcij텦i+QWDeW)2SMT?:jY;gTY mݖsb, ve5ƪaOeǍ6XHryP:uz1NѵL,-KLA;0YkJ[2&/ e:&XWeIҼdx =N1BD/ D/EGNɚjmt;*d&i2r @QӨ ډkT"!JR!$. M2=74@*2l6! 'j}C+r-6N:aN;56^t%qLYP`^U:vhyd$ehGhIU:+\PuNwVEyOSǕH[6w*G}nLKP SD<=<g*GSB3(,mMh Z_ l%Vq{ }^[=~~x(\OV&Q(veB6T=c eʶFjӵo]z- $ @Lʝ\QM8&HNhp L#;hvM|,&&6 K[V(9ơ퉐@ʐ{&n~QSra p\. *V:G2<:aD!x[" Th9H2L3 :E?+rK̻F\"noHYB|<6L躓]5?FX%ɚsPOt+)0rGBtT 6Ә$6jSG*"Slv`L.j 8T =*үɺɲ+Ntۺ*SZslaSԴ2oZ?qZkf*!nOc`@FSj=)MoP۔cU5/z FU3g'&3QbWU*rk=tLOISP&פkJ\N{mԞNP{DFO?e2[fAa=U'"֒eS2,#VGI (/jA"TF>=zuseYuRNZ ;Ov 2x e6nB0HCSO'թ(ux +X+I#-Gts;Xupl?uuBx2H6i ށ*ʍ z-6Z9ScE;ڙ-TثgЏkpgDL`!yeC*~Bzh~b|P55Q'#9Ǚ`^e<4Ir0S̟tb߳ҟLI!1"AQ2a #BRq0@3Pb$Cr`4SsƒDc?M/ [DWX#Z$lkZ㉰JCwVvT( };DXXPT,nz^tXD1su6vN"=۹? G恍~8_*/4o~P^YEQRf1032Er9L^O/0ΚӶ-yʾÂNdV$.Вi\g*J|ASmRLFٽ:g#Cyd͐ 9ew_])נɧ{Pl(<>Yz3_Qme[{BkGDeT]3iXٙh6_F€*kvtkFh&m<=j[>C$jĽ,HF4 FIr0I nR ؋H2 a*XT|Q$sTu F쥁6v܁X Ō#Ĩ~*"Ο#TA+rμ`TFټ{ׇWǿM[HV4ELlA̽X?ڍ#h#w4gf%O[^'͖T܁ك1Vb`{5qt2HY3'F7)74K,1zb87d᮳0Jx&mRBy|$X(*v\H::sy0F&#[H69~Tuio "=3{_X P_0];V*&%"L6a!?%5 ̐a(?zS)C<%vU%]0DѶav$ؙ[.ӵJY?#\\T :WzHq~תȇ20?(XFH}FfR2fl*fut,?Nu7Y DEETUpm{KҰu֥b$V7ߘ֜U7oB!ޯ H^c.nxKښa5H[)¡#s,faDb#_\D_TtVC1*Y-.g;6f\:ZA i}٩!xfŇqƻRޤxm{V"L)84RטsmWSqIXf:$@T$U(soq_jZNQ`mKi~>]2|v5*r*o{sQV@ˠڒ`˽$>5I.m)[5Ó\w0/QjL9(^ +y}{T{H0}ҥ-cPCKv*k5-k/ֱ/CK <9]/h6Qb)ebxVoΝC!UtPy:}0`S"8,MPbQxkEKt/o^k[L>$ Ԑ0lxpy8k neV(!a H.iGNryTE(# uEfh1>?:r^!QtPɈ\Nk=`ް̧!n,9Jʦ[|Yֿ"1 ^\@rr\ *(ؚ[5yא􅇫X5 +.^'Z\oR h[00*HL˗_ GUa~uFܲON_0ϔiJD7+yTF2*j Bb] IfnND7kz83/G Lqp/Z1qs .c͔1 w~inz+!(>.<4 =Ө[8Y}u&vE\ԈԭegLSI*Km[6CZ^^_ap$kzSr n`x|hL_a0&/NEDq.vkEȀQ:e[ 5x軹*ңQEPlQ"t](fP^o3˯V(ta6'^=_S?b<`^*#z²kPbH/ȃ۠Tl F< f(|ە>V>Xq0/_쏧."b~0 u75Gn*)><[7㙰?+J)äWԞKqXӖָ@ŽV)LDk%T|h6N$3v6]:E(q"AeAab🴶Y#wb{b_0R7_39#Ik]yJLQY ǽ4ls,֭k;~hE(Ex|Y~c]*r穯%8^e/ Gޯ O5. Bw#d{ 9Ur-m$I@Je$֌'q&DuLu?64?,rF* $ALi ; 3h[Jc,%XڋA(ʝmVDQ-ud6MI[ʧn>{v/Ae[_*80Ø@(TS|6vOP8Eb$:^y_b0ld=V|~I 07/hI!<5^֥]6;oq1O*_ʑۉ߽O$@I̲͝Jˑ3oD1R,Wi~WCz=>1z -⏣n*%VwX6\ԘTXh ;)U^q &xI6'rWD_647I39oR);Su צyvSkwbޝ\J뜷SҮu)T߽Yhj\Vv[T/ӯnpdRaL9ЪcJB1vPIdl*VeuR6+v5Ä?ϕWV`Sc6V Hmk 2*#ڒRuv^UwFGwW(;/foRcu&k`o@uқyeH$6V LZF$ʶoWUZw* گ{Z-]Kr.*A>IdIl46DL]2v39]#6btk=GP1|ޔTIqKF~x`E_"T0CI!HVLSb_O) 4"U!zkϵ1j&(ȗ"xc 0f!7n±8`-!M1| ұX'ޱ$q$[|ARJ#-ʝҠ_.}KzDL+/7NS毵yf¼DnV𫭅soGX#nզ_jM~4^&Ҩb޷-^yv7M!7ʫ֋U,88hgxꍽ#1o7FA%(,fHSVcJҧ ˇI&= /aSDG1<'5}1>`>tps̲:°ŋyp%^-$j&F%XA{xh<Ŭ;S?#uXI@NMgz_glFW[Q]MvaֆP>MŻV>fZ?άZGKyRP5z |멽vZ$ RWVhVXe/w޳j ׿QͱͨnU=zt PV!مlU=k/Z$ !Pa!F-~穢)Ԑ 9"Ǝ+'ھ}mry _P椘$JZ'ӵc0r.saS/KU'h'*/{3[#!d:ё/Վ_ʬ?::ʬ*CvVaݪcҀD2'Z ~}mn1ZL,8I 2n\caUA)בڅQԍ(9nWvO{5Tt+6E*Hb<{^!PXRs3, .!)!X![Dfl7X^ݗzslES.[P6kņ@=hE v8 ;!u$4EB# A7vv_]ru[z˥Z W(ҼD^ҋph 7`jtuj![o*[VSZfmja*3k2lƭ !m^!k1P5 X{S;^[/lVeR1QnŶ~­Ԑ)wu3bhj$[ACv#i iZJJʁ^^Taxǝי5Uu;V5^ $ JT;MH8|9b:_kb{ W Z,ڻQ,GΚB(62|+F ~tК5γ0$0y2cdAp[)Rp/a$nԐ^jV\?hk,VKUmZUJ=(y ڏPh[>u+{_[rjۏ:5ʹ&t(yhjZ޳mޘ"U\u|V%mxd#]oԏ}ޔ n:W8}Q [J9a/7 ob?hZoC*(~ҪIhK6Ȉ|r?ֳ)skkע.q|oEkGJ+V]O_ ۧZvെPBkXXGs?̬ǽr[X~Vx_ƝZDHZhf_>ea8`˯Ο8-^L}UL+0c_e@S.@ԑ'FSfi~rtZؚΎ_: v] E"-ڵa؉8֫(W3҈(>cd6:j掺ZVڭoZ@7]+D̹:R.*@|Z2G@I6 aK$pя$ƃf$> I ۟!o7Q QrV$:p  iۉ6")`CJ6IflF#k{J U'bw4G.::aֵa"jXƙt1m˟E{RG*A4'QGdAjIj$e ܏#\Y[z/rhpDU+_4 EnG1[[ksjԃHҀ$.E8tlUkQ9rַ;UOίvM-p)[f uaE$᠙Jf=:\0M)7?*j1m3ij3eֵEz]ͨh &)HݦV:(6{а=Lm`C6#Y\d&Ʈkwj!PhE&{?!HT^~U-]h+.a#̥KZin2@YA.ՙv񰢁5֯QڙچtmX ^+Rنkjݫ7[wɫG=CB+Sz <-0^!p[˲j.&Tc"G) [0@JxLyq]9Bj$5b[ C5в)ѪƵ7+{,AV֐ mIrMouk1c8'nt6tAc|@׻GV,zVM Re<_}hӭ6FDUh2c& 'k. ͰُC҅on Q:E=2t76_QqŽ/p!>+%ڲO)>dV:X®mj"T SG4Rʽ,(Y5诿Jnli܄eV6}JsIuD3Xku_:[r}R."6 7ki:-Cӭ]nTmMsWNl[U DLZEVkC]PVw0>M=m#]}ֺҰ`ޖzF5vq*nr\qm~k_ %b=d6!C 8Hq}WoO3 ckTϽȍC?).mw^8CwӅhMcM)1Sn[UGmu:f|Zl׿Zn-ғ "($( ,Vz[pJ5{葯D~t"yUיƺRŘ?w,}sCyiJhokUޗ()ޞW77/,X'9yB(۔nkﮂ҃<넒\CmkN{^aiQxT74s\Ie[ffm)i0ʳmQ,CnQE(=hʆ:mS涄{4 Ky$a*uoI~$jd)W[YO)>ux/ϥiq8iec5Xh:Efu\r{e=( ٘uHl^ J͵dOyuA;iKzj??Z7|ة85΀X㭩Eox1I[ }D}+2Blܸvh7dU Mcux O2|Ҽ^bQ!{UVҮ<'sE3yڮچag9t'݋Te׳ ܾLQ忟Ņ=gK>(.^BtS"2tJ;1I5m-fnuPl̿YVi,CiNU@{ ̧c鳝zq։mҴkQm_:ϲJ1hu=qxM*۰7=Uh)ft~KĔ՗+.ipڻ}ʢ6?ov>xd]U([$hKJ,^4J.$jv.dX ^YKu{[]|-m("!ahdW#pX:ʪ?(.-@~spN-Hz9V*B7=o֍ﯝ[.k_=oWVhS#NS*VVs>qNW_U0F;~&[ln %vJG#0.ҜtA,[4ͣx_II#e (qZЅai;W,7ًW.ꥵtމ * k7ZD|;RjSi.Q֚Vrsē+֖UƿQLb#E~4(U:5>Z#6JK+!!Fځ ۹6P+qj/h̬wakm~Yk^+k^;v1=;S4:l=bB|EXo =Wbp'WvO1AFYՓO7+qqAoS5G %S8wQ?[/a >çfNSQ\Ւfpn[\n^@o6H X\,,o7Z՝e)Fv/P ]s|n2ke\*_j^Ri+{A}rH|Q\)/ޫ\Mڸ+4iE|M_/7sD+OE]b,G|`Ξ1Cc'(񞦠M٬o*K*+@ sOy9P8vi"br,1kم1?<\JJʵsvҭvcX 1ү9AMa\6ä }5ւ(]@αy՞33Ž܊>*"']Wͦj-\4Aaj.e ʽxK r_#uF!*)ޗfVFT5ͥTb0zW⣇)Y\f Ni$=zQi!  &n@"oJ9~$˛<d+,\>QzUkM&RbO%!B3ߥ6ulVxsZcڀھĪϊ|o>8֓ 0BcLD/[}KO3_ ΡV+c69ulIrÿzͽ4e]s dw|B^*!:fmю3U9aH+{ﶕ:F)NRc!#ܼڌ[省ue!RɉᶝRd8WΎ NXEHx;t?YOʊXp _\q߻UX*LO/xQvQ~)<6^|=Ioj9#ijNZ ?`[6|_*IP1=OY]Q#h,l.)%ZY!tZ}i~^j̨Md(|j^5??B;9c8?J>5+$$xпqKYLLu؞ƚЂ+jFs\kV_zXz#Y,҃)>{ǘ~JTMz'\B:֑,+M*d}X*3p; B#M2.:QwfZFl/Q(kj8Z fm.P>6\te48؆i^V'˿QbP)[Y?+ çz= \,l_Z@ye\:FO1eFɧkaz 󥕟3`;yaaSm=)!ms71}K^8~$s>D}q&H~DBW.548G|:ab"K6"܂Z3o!@.\-[v>ͅHZ97vJ&^'=Dc8j K.VudwކTʹw|* ڧKX 邑¿(>_LٔQ` r6i>X՟,D¯oVg2Y^I4m{t}pxHdg> \2Le:Xc 4ŻcD{jw2?v GL8yBI+'zs(Ae5eGab[P[jXu*_&(' ɈY=\wcc6GxAc]Fd-jNXlRœ?s]sү&سZT@X-$JmM\ aL+YeT_`}{}P+6hK*F|XYFkuҽn"\C{)xP*6ZǞ?qѱTr;3\ m6#A\y=d;Fy4&Ce>j3#ڎ+̹xlHR,;f'^l$#3e;jë\8[(}]&(NBv&~L?~KMJ>,,>\;d\qX)*6M-XL.)yVcJT[2mQV|kp#b>!{m+uSX#)VLpj1Cyc&PSn!խ͈AfvcƣNbЩcg\4!k+!1AQaq @P0`?!}q<ۜc]+ľA;]_T@Xn?i&CF?!M`)z0\w:?n!$wW_$ۉDL Q<:Y8[~ Z!mBkCCܚq S"*:k2v}%z-W09q80CvTȽ;*,#7-s... 8d4䙪֒Si8Hcpsp R2Իieܕk8b>GH) d}YC&΁ab2l/NYIVf?2QܢWoWn `m&1j`ZljČaTt{.BZ9g-uFǪ 5zZW t*GF Jj%P,y1iPZ_֍Lv/H9Vs] }Js?px)k"s;YxZ4KPQjnu|􌩍=KA*ZBa[)49=%RC5C$unߥQ2zCZ/UufB7m\fI$yk2cvͪ o '1ZXT4 ]J¢;خ)l=q,گ[`j +91ymǝ.}IDdeW|Lޑ'Uf# uYÎ}zf k'V궃]fS}8[7{op( )t1\@ K;nTol6)u[!jd`=*kSzE5j_ќʋ"d 6Q3M(ʅĥ*J~! kYhNa/|Eϔ^C@e{PJMX^?שx&ÂFvDu3')ǃ˂_yIhͼ D7 m&:7ш70"v1}E|pVoB/ce?o)vUcw۟/cqdBeӓ%({Q#< n>8zP 0=EM c#ZXzT:$'<W[ _[p:T&3sz*27Gt7E#\8I;͝eV6A-k-Kr4a>bu4_LWס!r2]]>jf 9b#[ρ@g5GS7 ;z*\Ms@s\J7aJ(f;/x46tZ;*.e.<^kpCpRqA䞱TnfM|R(\cHz>UD9=GR|Ð_+,,.f~^3n[+t{ERxfk}B`i3n>uV3}ő[v\7xآckN&R*Rޘ /m̲UY[2] W"|vm1^X_*`fSa%E1DH2.E(g@L:6ӬnBxahyX;G_EndOX 3p p:5+[އ&pȝQV0hq P!uWZ'P'b˩29pz8_7jZJVIr\\ڌ3Q/>Ǹgs%E,2aT=o7iF/ ;aD7a^ژ7JceDOXd~AۭiJ?FL,#`eڦeτ޸盓=Xxcܾ%HEh#1b̖cбх:z,Yq .}^`xWhna4C?_P6a]{0kRBs?< h_H-ڡ9B' 69C*2Vh>5h0֌^V~j,_F\}E`MdciNFn!U1}а_[NE|^RlӫYFcGqT<&NƩ4xU'Ms~ 62E+lPtNB]KbՏ1F(N-bPk- %6_ ysf6aJ{k ,aZo >ss+=*^W[hZ ZS|GJ؎'Xƕ:[}+_7!ytK9;!&kь}XSe(x{,v"YlN%Qfъ *Gj|$PZ%o&ЃA(c0h^f]|0\ 9})="dD. :%Ֆ&亚#Qf YiT+7D-V{ǖ߰R] u*‡UlyGnPbTNБA,-g( ITϓ` [Z6!-f$r/ T-EiٝaYu*Vٞ5?t]J L0ۇ*8U|x û=;IYko[#]5X(W-*jruCOKH:XT2.],R L!dKd̺oq*kqUG=,./F0<ċNf*ֲgD3 ڰNׇT}U7e>w3mZ/׮x3Mtf0vꃏt;ikr[;>CÙ.x:H ĦY]E_BwJǘ%Om)CPUadJ-qp V(1Z][dP|aqIlޱ0 7J R3wccTÚ!e[rUW0e;j!f6XT;CF1D2U\UaŔ[Vmz2}+Rv>6^);3<ۼo^A_Ea؝ :[% H2C0nѕ C~P8x.q扸\F1s0k*%F<RU߶f϶cost,JC~O#G`:s~puyaJTy%>[X!8nflZKBnr;`eˎ=sqN/Ҿ頍qtϘKiC8]'e㡏Z[2PD%-5 ldy*{G#ϤrL'5sPLRfzGBuo:Z1>a`xN{_^J Xqy}F/F^,^:彊wPύ]B/a݃X_Um6 NUp L+jo+:ɑ0 eK`D u)n-%J@beq2>W]s D`b;#[u?J/ǥT_+ jUY@4(:6Vzz[q#`0c.JzoP9A@ nH2.}GşC*!\׈RW$IZ˗z\Tcހ3ۑ*|h( ,[(tnP]a_v\9r߂qy:[5)b*a"=+ Dl7$INDpf; F YE3NN&L>mq ԅC}TJ]P(t0,t tn͵r KR^]2x_?;|8Lz`K!!!ŋ. t޼[Js X |!&x\/z*kߛK=MaqSp;!fF邌Ael0ˈOh/2N^V ~."}HWь& iUn>z[LB(!]4u."-E1LKHW= rAq9X+llI ]^l@5db)QJ"=zV{ATՇ*!Nԕ /WrFJ<- '걍Fn.^:GbF(sq-WTc! qC2.O`(27Q;V]Gr5NTh׼Wz ʵ1u>c^]\xM(NjSRnF{Ts/WV5dyvB=ɩkh aqp+y} k~0(ĸRo|^_C_w ~_nd tM8*6ЁMtk]`خńpGw_@G${xt} hjfo ;z,YQȉ H" =U .1+@k;>aZwL vvt63Z# 6YuzJ ՘&=b)ijl]sôNl2,"Y-Jxb  UB޿uDG_1A)^|{ zQYNIU`j!p:*LWX:s3T s-=v\.p3点0vJY&-S.4wД(KJqb"N٤吥`\aKvZϵz,X5o!;ưZ^C\DȬ!fD/蘎 ,^Fܯ $Ne{j MV1JҮpG 1åbZeC#6({ ܕ?oX}b]ֆ0KrKQY\1k4BUgoH|{8(#I[=Y 瑄B_ on%w crZAYqbʠ"^2o-ۨ.bүcļfH:I/U7 Ew]_nb%4Nr,;Xh^AjIq=]1U 4bo}=x.ՀogYg-h*1p.Ӥrp@Uak g>vz >VNN.ߥ[bV6{Ŭ4T(`h۬.^'KrA2/Cl YBUq%Wzw}0 }=esOj$Ld u. ^9V6i M4bMCZlc*ЫaמUoz_ k[F+ ۑˤXC[)2Q EG݁Ԡv2P۳"X+oA-ĘQNʜ}epu>$6,sR[x&"\}e&+ ғض ΃lquruE+}\ 3WbB ƥ(C5.ZE˖ds[K+Zy2F9 m5,Gof L)A'2Ì*dl5GSM,c}To[C?1' ãB m05;>!o^=f(Ӵ,GPӷEߪ@9v_6[,p|-XPVznGRdNbķq07dB/KR?@Pe2[1swLA-ThFKdx4jaSB͇0M UG Jn\lOlb[\gđ r]4S@^Wz3*(g5cGH.@i@VêμηQGQ}Nby,ǎC3h@e6gE IGPu 危:Ka +(fhŘܧY3 ˛]kQ%,Axaj-fbCųyM5Beq|X 9Zv(ajp۬ K~^+NgdcR:Ε*Umzj'\Pܺ"T&ۍF"u(Dj!0t03c]/}癁~ ~vY PV-:˱)Cn߆7}ԡ{i *h6#E-qSӺN5.90ykO# % ͱy01L.6 h_B",& bWtzM{bSH6vzEuu[N(HU  ,˗ NjMK,&;o`Ǝ.mbՑsٔ\[f iĺ#mWSam47Qv2""^4"](2ԼeL;:\~vlj&.4u@U71gTPvԕQ׼F+)ϒ+-_Y)A[캙M)Ux,Uzv*ܖMtRYޢ=/XSINGiU~B9Zr]6GM9%͙-%Zg$XGÈyľhgevs\!0铴M\UVWLk , xxrcs\M4k1[xpiGP/RQE*_;Qp]hRRGRcXMoN=&u]MA(:q:210skI(PKU?T}o8}MussTظ_WB Rx^M@4&K/aCDo[E(rEKUe[3 vy%c:˛!: 13qوq_K2:6D[B{Mgx N]}aHH{:RKEvXzˀ{ĈL, ST q˳+U/<>\I^ ^a+zCm6 :{Hv?:uud6xY]Pjp^:K߼_C6CfkP_/_wҠp*մLf:ml c57ղyqe^6'=R˞Tz7sQ Ȝ'q`Y 9o̮,'@ʫk@&]kAj/){(TWVuվm:٩- =eo(.یʨzW/Q}ү _̶\ C\k^zv߉p)1[YONbF* & ,.Oh"8nP*m :& y>eJ oV߼6R>Q}5'2%(cKQ£[ë?R:OgE0"@f|]e.5]uZ_tF +دfE tX!D3-GC7bV@бp~9b: }@l8>[ae<›d(j!QL1 YLBlu=%,q.)RK +0O 6>>j#Xi஄]eCQÈl\FzB=~ѷV_iv]cq a!cCUYşy"\ ^._5uRHG=;%lZ̰wV/;Q\ZLjA mf! j`PO|MxKp$#YCAi(2F?~ X:ʇa[s<*~"+gSugj'i\xF#C4yUor̤0woRk͜&5._:SWgB)E,n]U9JQ-e.f(y:-> RN ppNZI:c)-ADr'9}K'5_䀦Jp٢d:ACN?`22-%uov+I0:ȷmHRU&5}J "=JCQG}f ,Fx]iW )9ODԻZ%1aͅ|TY+~NzC T!%˗.b.S![p IkUe߇-s,0 ͞b dptn K@˒Rb+dpl5Y@.w f -g/9 2|껫UB50WAI 1%TΖ_=uiORu$c̲v`t.Zn'&i}1'5XwwN Em[r*\_`6szLub0l|qx ˗.gάDxcEDZ Q^xhry ˸_܎BJFH(H291P;#!cC&!mkv7'gCn;l?_{ NYzdtqBRjOPy%͌+*?KiD:aHbRlYga x/RV_I64Khq97s?&tK) @ugPo>-%։X@.\qe˗.\̡-t1΢MEd|{:-%-hfiu\Z,eBpKB-\o{UL}30 -Szv, j5 _VEM5-ln&H̾^hP )qbwB?yo _gtt(Vt2JX_(3Y/%GhT`ZsyA7SP`4&<q-͊)( k\3}%64eŗCY烫@LCfn)*bg̪PhXyu#W y+/K8ʝ?Y@NmAT;hxM>#{$e1uoRJi_AD4n"V,_F/E5^'VU.W˞e8ԧ[zQ &X}ұgdJ)A"!a7]8]/1l V]X]Ks2[;oۦa&̫U c2{41K-d U!Hgjl< vĻj^^^s퓶[4m1Уqnp,XYXUyqR,u`^( gTkoQuM'@V.w1N(*D !:Uzvh\# 2:pXpklF5a1^:DžK뙕xPh4ҶKXt Zyz؝S^F[62j" gаphkb,Abxab@+0ke (ەIZXԵW|P/^T WXZ;Rr˗6D"fnrTR.fEY۳{xE.x!Y 3$ՉaRyoPYTCi @EmBzq

WB(#@{ НTux*o0ޡe`,Lv v<nPXnデ`)LqdKˏQ!ofc`B (礦vΣ!J㳜bzFMm[eIe Q Krp#EBhsw0F/}EurA=J30V|E=Ph{Gfh@L"Tk@CbwCcz%;ʍ,TAcl m_.>Z8yQi]ߙ^yp@fݫ7sv-w=j{fъDbbŗ_J嘯92qFUшl!:\cBgڡ;:f]]Yx$Sb&>zzuDt$ s0.\}C<$_A\+iiR/7f\j|{hݷdZɗ&X r(;u"^HJՕaۂ_Ma6GGsLK_[,vmٳm ~yi׉m SG50VK\Y~.3qV(l^͊J^2o$LW n⏩@1دe#^8-,X]>coTѿX9__xQ1)wjx3i~CcZZ%^V㟑}I}./ZeN(hA`"^ ܡw"A£:XuykpCOrtNЬ7T7QWa(«}v4<:X&9ŽrI߬oJ, PMz,Pgq`~֤P7{LᐊxWœgg/o`qsίJTU-v~ԋrcy#4Xc|&@%wxg&FIϠ,iu%fc-y!akse}r.c 7I4YmZsVK2>ahڳ^xg?pb{It(>uZE3erI dT5phOdZl/*RfnJ@fٲ@QU^a@ Ä>ZA3Q,Jv>5mg܅=[sKmX*DՋburŞ_Y]negS2VlgO2cl6epU{~M],RuHV Wu_ I$I$I$I$U`I$I$I$I$I$I$I$I$I&p$I$I$I$I$I$I$I$I$DI$I$I$I$I$I$I$I$I$'I$I$I$I$I$I$I$ $IIA$I$I$I$I$I$I$I I$`)HI$I$I$I$I$I$AI$ qdI$I$I$I$I$I$$I 9$I$I$I$I$I$I!$E|PI$I$I$I$I$I$Ml $UI$I$I$I$I ="#$I$I$I$I$I$th-HG$I$I$I$I$tv `=a$<'I$I$I$I$H  u@# U$I$I$I$I$gf-p-ĄৄŢI$I$I$I$I D:6[Cl $I$I$F&sI2 I$I$I$ ?S0WNG$I$I$H$q{,C AvI$I$A >g0<-0#чI$I$ﻝ%S$I$G7%>Bq I$I$WK*աŎrI$I]+U>{@?_7$bȡy$I$I6JYN?%x$}bBf YpI$I$aO1v+XHAƒI$I])LG)d[1R/$I$HQRCT8(„I$I$A2o6L.yNDں1slI$I$O ՉؼP=Pn=g$I$I0DT8wpURI$I$##{LXVݞFO$I$I$W%~(NC\[I$I$I"QQODe{Zi$I$I$ צii#][6Yq $I$I NvV!f-cpbG]I$I$ATٿ4LWTLPY$I$I$CR\P"4k7bI$I$AOi I$I ~E4:}Qov$I$I&;=֨i:C7 I$I$Iin׷{$I$I$I$[B4"쇞]OBLI$I$H$Y"^a!WRI$I$I%OS8X}cU$I$I$ vOƢ:6Y$+ I$I$I `#Um(I&l$I$I$LvI k7k>3iJI$I$I$!!A~o^#$I$I$I$s>c&VqHI$I$I$I$R@ ioH'\$I$I$I$H7T2Ey3C$I$I$I$I$FdK*I$I$I$I$I$I P I$I$I$I$I$i&H:I  $I$I$I$I$Hs2 $DkI$I$I$I$I$I$q$ I$I$I$I$I$I$IbH4C!zJ;I$I$I$I$I$I$@$i$"I$I$I$I$I$I$I$I RI$HI$I$I$I$I$I$I$I$I$DI$I$I$I$I$I$I$I$I$i$I$I$I$I$I$I$I$I$II$I$I$I$+!1AQ @aq0P`?_=+7\-Ge/qD2-9=EP[U%~\֓;wÈ"Ď%F#WP _gTn8ø6~@g?"(kA̦mĢpCN1f'E"\Ej兢0cz_嫨q>΁ziɸ"Y<Ǔ铩WtJq { },5ʘR7Y)D~#.<6:ڲR&xkTدrn c3KS>*]Àb}&M@AYW*3oxG#ZWh΢3pj> J7/'KN5lY xORq#dc)Sxz\:|r1X`B}}&(_rb}/cd6e8XGN)yuN+ ~3ÇUeo>!mxzpk,'ᶙ(07P+#9TJ|GF g fW8aֲ9HVJ1 ߻fDr蒭kgJٍbU|>go-.+/ÒP~c4կ0$|K qKcd92Ⱦ  f5B |{Pp[_ OZei6a@5>,S%TZ|5%HP.W$h6S1,wȣЗj h#Emv8s1ܣ/P *Dq:{~XD1RD!Hr+ Fngf9)G(^2s*cYa6 C}SeWj``.0 S1}" UK(}6F erܨr¸>&[0_LC b2ZoU8k_ڄ EMoq_Lܷm G/CmE#n kOEoV#V7q_\u: CK1EFM !fHX {Ԛ>`[eJ̖x*ܦUn3>=WŨ:Kx3(jR/dkr; .xO0Src 7Y[ew7n0$|9 YD 3Q5\Ŋi2=3<Zq*aF-EËX"T5榠˙ZsrbYH6- .+euQ X!Wbd_7Η7LJ6p\5 1n)qṴTAҮHNȆUPo V20[|xsHٸf[Dp%\>".Uf+9qRѸХAE`bbnP^%{@VKA5]рZXGA|7Y6\f8K7/ቮE.<!)ceK <0@'Xb,~QIӧ.V?>#Ubk#1:|nXwq*c띳J\c\01f@2K*K=~ MU~ؿ4?U˘ bM?щmX~i5 9BYcRrS.i\}ԩu*bgKƶ |%7 __B*ظ07#:Ucl\_7Kܣ q. ҥԸKG\KAD/تs7BKkgPLu_lGD!^ bq|1>/5DWܯQW+,Qb 8 \RQԣ, Ө*Ych~ i!~?P֡#0zS ΣA"^cUp2ؗcīܠ\Kr1v1u.dFÖq1+w 2X^BʹdQKS2xƑ`w?*Æ4._J8 N\5X%B:a庹^&;`"+e66=LG0Qi.V#~6ffe0ʰ["KVܺ-L bX`GL0!JyٗK5_3j8&9Rmr(z`mAKǴ3Pq.1e FeXsQnb b}ŗǕCnkPRĽ22&e⼲wV:3 Y/56Y`X ]T2ʭs G2jx;SGQ#R./SYxuMp'qji&֑;pH;EnJk5ĥD;fʴ  Gq7n:O.7\8%Lܿ /iFP]K-Pu.n\!]bP2B5)EM0*8N(m.0&G\ WjTej[RqyN >mv@Y1K"*cOlq ŨHe {f;ZPKp5.,,, 2Yj f`;gEGp"Ub=Yrw0@q7heG|LyKw2 lnx\bC f 0M!U@%vU)Pf"9Ħp L(Rmx čw/G1=PQ!3Iw,K B)Yj,tb5$Q3 @v o[Uj-aQ%Ե.4Qo%\`&Dqg̿BaS蔙fXKo3 *wK;7Je> +# TԩgMFy5Qgu[۵\_ %o3,ô}Q.Զ/``((3KG4Q+Ca }pb/S0.aEG,?F6JcL%mP«Q~gbJVw0u,a(+p;3s$}^C2\T׾e E b*Sb"r)Q6 6Qf̺%'SNO6"yB <C4M3/*)7!u;ाL*(n6נs@ Dw0e3|bDjX]gFcipF+*%L!ZEVGTTPEomJ<2;ZjfLʀG$YiK bG4mff\#*:4`N(c1bK,2. 2p_{ kfu}:!՞%lo[fXB۱P(\}dG-XU5 G-T?i2Dk.~2挣,+7 GDJ5  5h-rߤ .CT~h/ziB\*xT*ycJ_,/X [01Y ?+!1AQ aq@P0`ѱ? /pkvvK!~?b*e;XUGVYL,b#~/gU@jgBfEG<2?_HMDDbgS+G M5*i }pcq;8ebdNCLQb[C\ ܵ'qs/L}kD5Ɉx 0?kyS!PL$0^q]]yKK s^X" CW4PK? ɨq 7) J%1%jo'b$Z%;@V7-u_Q>_ێ[-=Ӭ P[rGgӘtĦy_gr_QzLG2ߪQuy;KQ&jRYj0Q`;(WոN2wpZ=, 1 Ěvẓ Y €uӉzFQVUOi(n]/uׂ]]vxםRU3V9@ ;Ye!It)e[~CSC*l2ηEbJQ$]DhnjUĦΠ%~%i,7mRdKEe`bTw/S8/DTa;  ϊX GXw(d(ܭ:zfu(?T k;XЅ(ع0qWѪR2*Z=/~ !E@ ceh+ԩg:AUB>(BSS?4[%KF&H3,ʼnVcf"ZF0Od-j.t7g,C˿7qf\}PG)b T>eJUTj3 fe;cK% n: Z#uMƴ& IiGv6%,ҖJC Pʹvpy%0f A"ndXk2[5 fwLl Q Z(C5qk(u,4ABb8.[pYN}:,@J@; \UM#M3d,;LØP ӢWbx\W5TF% 1mCє6 g/R oѷ YaT/Up"YgQɔba,b%q\ԯ0uXL"A*eeۉ=sa@HbAcdBX U3sH%ulU|@C̬:K"w6#]$*Yf3{ҕX-ܺ%C0BCc%۪(.&>Z8VhVIaK+y}x_X!Aɯ iP2)Mq\צ\Բ-1 #Hrjf)B1.T pMv~#N=pNDj5Ǵ}w)F ٯ5nZ@0 E{nYk$tc-3 Vm+]O! 2넹p%Jhf &oR^n*cLjTt 꺈2R3Ph}uP>QJ+ [QxcC߿QRn3%F5-wZҼ0@(_P"baQfdQ 5}04"ӀX1j bU2@MTg?)+  /QR.&eˏ8hEMC) ILd11zb3XMP!u&`Ž [1[]CqDEJb Y~ѷz&lԶڥ5zKn%DZK0L+˨H븩\ЎCԥQeB ;P-ukĮ1VS"8t~aŰME#Q)G%X#pb \TrTp\B8 \!\tq, f!JS+E/2Zd_en3~!M`PfXl1)`+v@Թu4 \Q"Ub!RFya&Zsq %@1Jjd4FiCBAF%* fdJ B%~:,eL e^`R:*TMYsXyO08a" P-V ƛKbU YTp1VQ,N100)!־ 6D#@ѭ es(wa Jss/-`woC0E˶V߈ a[NQOhwEw;|Dl,]drgıwQ ;z%f9iHn_DU1VLmQE)K fRV1,Z)pm{ɖ ^eEkFbvIT5,BѢȁ~~Tme \=t^RZlA [nԯsgW ]`fH"^r- Z qɷ(Bۂe*H%I(B5Cd`WfV|_2B+Y.ekLDaGVQh\Ki RRSL]mK@Z&#X &H( ^R]ı@V|ӿ^;eFȨ[@%=@@KPpDK`1PE J%ϣ9vR,e&*Tħ4nirMD;uH0̢b<`,bYn͆+?rV7:)E&%uF 2e岲nT*-:ծ"lJapd 1R0[\DRAEDU2 ZmJRB2X[`D#cwp@Fn%d@WozS=2`+z1ŗeF\a4-22K4[d*Z~w:W5gMf%/KZ"#rThU\FPn]FJ# FHfK`@ib'ZM.`Cܖ-}R Y| GQu+1dh \$ R)LEX(W4F0PU%87C,Siߴ#h`Th>ezjl_\3(jURpqq 12eJ*TOs?s1>'-s'+MFϊaNμ}8ʄF;^u;;JJU1:u7#e6 ^rʨJ+2*XE`Jẕ %@FֈmdFB5,G0$ *Wr*Rhb*T P%q\su  X EaQdaQ<1RSx_0%@*Up㹞03tG+AuKb@ H, 8sĨO5*W VxTnmG_cf}h%%{-GDJo;/Z%{P_ܫ)%@G_p43+Зer5McV+G2u\l]cw;/,WELl`.]jjNeWqu Uj*=3d40S"̳[b-@lc2q(\vᕽyfѶ2 s hn%ERx6323ڍUwG~/3`"^JA MSliU~2G~^q=RŒѥǢ@c 棏:CfW Xz{02n[/O%KwY'g~oj]QQb)}Nu%f8»*Qt?V+^6h-u c@A- nuAgdWqC7S?#pKL+!1AQaq @P0`?-Lpx" xk\`/[ǣQ;~9beLfoe Iy7L0U`\ !)sEqf]9Ѯ`ZX$ UJ3 x́gxp{yHA#8DqIV!AQ Ygo6w3ّ>G'* F1!nޡMTp@PID.\}%=p/3YU =.x& W`o[ߔ50ɥΰH+ 8e5a5n["[]|k ۝I X`& ?|8*!IK) t) `9S#^b|㙚^qKw)_ ;)&Tp"ynvapoN`bkN=:|ꏓ(=aF3iJScfX_g!&41eUԽ" u]q0@ytie>TU*`?gJI"؏]buǟ(I&p6L LђxUE4Elܒ@! p@QټuPSXiqr`-"\^ -;\ ,>OvX4drpJʵ2ַNjqcd@1'Y5Czt~hA(:tb0"ήYjoOӃNy 8_NuR" ![k`V14AD+ O wyvU6wD 8!I'U+soD/8OᐇJǬչvu?,o6fV11U7Z6'<=w眙?G-6/ܓISec o[(>Hn/aY(O ;Tlg8B oh}ٳU`i7{8MD40ơDcT<9HEy\b֧}RAg;c_%pw@F9>HwC,bv/$Ŏ n+K1 d=]/XOCC-IRdqSҌ-d`nU-M\&F B,.]֣0.=8NoPB"O+hCmNAdj{m$>|K4c+ $YZ (Eo "bifg.72MF9J}ƭ(0sLEȉ#VUOZ¯zzAV/H6\&yjM8*߬(InsQ'Q}PQ8׀˕R,B \9fiA!5@ &}TSgnU) C37aʮN:/ɘl+3X@F n^8c{E޲j'790j6r)Ra:% xnBvCJIArKʜֵ51R95 TzsNԖ[/QgFn.?E Q3 @](XP0-Mu),۩2 =?8o(2z5|YJZݙ(Q oგ:h#)Z ѤFyDZG 9 IH] R8eDYg#SVߡM^2#AZ6WS eퟟ5DO+Ka]?ݨrga0cۂ֝:07˥ im/G*WSyα4S]*wt = 9È1O":ll(۲}F!҅11;et8ށ+)=pt.(Yiuð6Mbnf'~X0GBu X9y.ԅ:|! <C{Ž0>4Bɀ)ݻ=:.PЋT +l-<@N01_XUГ.뮲e<IsmQwvb!U?՛ob63b4鸂Z eByIL-ft+z=QP.pu-y8=|siuANUl?)1TmP`-r@.d`ɇO~W)~IU9mUK*~23IfCWpK#|mU3^o/ԡӢ=W_+aam+HO-ďVl;ۚP4 kד#L ICRMd{\f Mx8LS"Dh/~qV1ێi+Ep\׼X_jCU#+!ή1|#^)yXh'E>z95q ]w'a1 Vs\ XK$GPY;u[- 0|@c~s6 .Fpʴhô ZoBƠYfNͤ@yu ' y S`RWV2QwrMMO/KF.kSmw Ҹ86⊚yֲ?N#YaׂMna3ms|e Ev-R"kW1abiظ8^1K-xxZSVb 0+dWj=`G?9DԚE} _޸9bW$}vۧSa8Ш6.4񑪯@Fo::67X^s:p.TVtul7)78,E%KS 'WROw$s_&cEdYHn, Uc9ͽc)}{ǐMx.tmV"hKB7~F x]P 5DٶԁǜopDQzszYt*8d(xo|e*6=~*Q{~{igx*kci{W"1LLDSɛ1 D# h ]o!ډI箰PVĤu8;m<c͒ЇϬ> ~$%t>W}gQ '(x"Q|uɁc @۝d&wVpn+?nt)B MMeo\-4<|e lDrU_2Alpek?K. m}xx/KQnwE!Wf\#՗n=8TA `1C8n;N5}GӾt3D,;>ɷ*2fG N5#(*k:pśb@4&C` 5jer--]\:h#`DN^L2DN|N^A%r&i>0ZS6V-N1~@d ϕ7 Zemčv.6%`Y񡄤FOl E.֗Rѵ:$*^tLC.=!^cϒ3LM" oc*ɄkӔnz(cMwizu {V*q@(Ijo/@#Nk|LߏKF3lh ٢|@(x0c\ S TyEdJ^pҔ,֣J' kT4/~lpiή$XYf%Y1Qap`*SwĔߌwuAzg!Q"Bwg@tójTQA %Z!dI)9I#N=54[⢓?X [MP]gJo&ZNlߌZv[kx mՉi@oF;l-w6qbX+pS_qa:2R^CZXyKBӂ;Kh|RЋlE{X Ok0AXCF升8qux.b~Gݠ~ hP!mWFp*>1A7`~2.E(uM'?lAJ>%b@t/x\e!jh/(Q{Jo~L :BO& {h 3rT5HJ.9;t| @?YJbD) %*4~ Ju!j^d@ r~$H+ .Ä(MGX(4psBM$X1J=,!h@BnGr|b2;y\h&Vj7}ߌ O!0ʥPRB[Ʌ{4I7F]/-=AyF-!6[ em6}XT)yYEa4J&!REEHQ_)anB3dgPMq6).I0cvޫ^աjjk*G j9auY1I>ÕC|aôox7-u{.t uZ&o.Yt٭+f>rT/flu7< 3Fy§رV&(56C [9H5#|8} ]NꪶG%yW \mNlG+#&@"(4{.ik" Ex/d8.Qh^M/(= Q^^Fp,D^w?8) ~_S1B}9H ;LP>؊ $ֻSK;hX|pV,Y{Kf Gdv*BM&nɬݠP*pәC%ʳJjs0*=m}G\-Ҹ9G|^ii%' e p"(a0{jyLtNw/ wߌn̥b655f*~p nP)O /;NZd+T@C_YtyX@NV/7<.72Jg$o`@ʍ@܍4p[B@Ѿ DKkWsHP1녘Rjոǵ ɿ8 l& J *BRi也79'~趿H z[:&, ;^_2"!S LQ~K@'2EJ|9r)\ |@"ɒ iU (Yd@}}b0%A@suj" ˴7*P( Y]cR^G e(~|`ah7nܸ|Wq-Gʼu 9@.^)b?& o]I(k;88_LPo?h)7V>wcJj-X9=5Wy#)[b{xhEI!Ia !]qoA,(8~L5;Sa 1h>X%->x@pR( h9mGUDp 쵴*xf.c8{qٸ]h qa6?[q#FUB`2L] ٺq[8>qms*W`'ݚjb2"ӂAB„[} ^v󀡑zCx@ ?w%Zh&Y~ Xlw3BADU5dSI!S_ )C@!CyZߣҝ4}bH,|?W0R0^;:#׎0DIŻD:Zu@R '5R^y]@86S$Y:y|e!%¶lXTjҵ|ٻsg;VX -K@S"^qްVF.EZ ό1BU̸ή?:@)cX,4+ۂ&3 㑕WLS3IcyG.Ep):~[EpkXҎ8r'{͕%Iֽ~pphӣp-|zb jF"p`ҕ3 i}<ƔNտ++:ӘU i?8= 5@[:ƪp:ay F %1`)yϤ-U)H_r֠iq\( ,hyʴ1fh`-BLc8M_y L@tSG |In?oFEJԏSG`UהG8m[Mq?X34 *1shDB8F6VP7:N`:=KA_ٸaôn3kK/d4lr CON66][KWDjJٯ|с<+[wY&[Hqtz _% 7Q8~p'=A($I']✂e-0f<6h2'yE be xpnr:"6Ztd"{mȤ>fA#|E :0*fa D+QB-`]ƪ+eTͩoa t\O|+MU8yHt*qDU!=eX-4mчBTwu(# Qk& Z46!hx]<ą9\W2sY6}6w&Z#fS!ZO"@.ݽJο0?l8@g!TdT*o%9Bpx,;-VZT뜢b1m|cF`m닜lH5ru ثjGFs/eoR@!k{wx!N6F$039M$Á噻(7?G (/ v ˑ@iBQfzNss|`M,!NZvu/j!JGd PdkyCzfҎLe/O vx1-"}:~yZ~kxn )Jx)dwx(=`O53zs{MçQ%vx- Chg7Ӌ-~;p,#ÎǢkl}=5y1[\WrcCk~qBZϣ _Y~2%:m\./ыgdO>~GA59Ӈ'Wz "B/ :RZb oM") u{Z 7A_&\؃/_J)]y6Oyf )*z˷p0C^F6^4 e*IPPx#CwXP }1lOYxɇ ÜBՓ3oe?1>ify> t"Dl9s)f#ej4n^n 4(]߼1A]c"L t+]iyWu2{CRQN`f E-bO>pXPWjZLҬM 57]P΋܏B܅eC E4<==nVqnƻWa-ԫj!)ǎᰊʚDӜf$bPD B O]+ u^pd]?m@QeHP`A9 ?fmcRNU,WCp < ,.[;N(t38sqùa5TQ$@8'FC݌UwX( mR"ue#mFVb> 3bo&qQ@ߡ. ѫpś.5&V>9ë)b SO8߽6iæs* CmN<8n>Px2*.u(+Qj"em,V7a1N11|]Gd!Ccܡ l'x[\̮1!Z TSB:q] @^:ȬAAA EΏ8XHn#;,q^pĐ{]jNzżi oWo0&[.Ƀcf>6(je$32 ڂlS ilyܝᯡ1:Ӻ7Zq*;Zy2ƘY_b,eZƣZ1;!77 )Uކ~E9mVr'z3,=?:}& >3e+of.e1Pn|cl،8 2uyMB7o=$'}avs,,* ˉAC(wE|zJdT[;`h,. M侻8ce*(+ {pdP[yfʠn¢#;XvPxDnBwf$&жMhNJ}MWJ۲R=2LWiߔ 1w R|U| {, e@OX'`~fEl2b*v/)֗_@pk. D;5t˳bJ7VPd#hnw2QEyIv-{u{wZVQ5+7a9@jhqw?,~p)@A7 ʅxN"xYxх%$&B$!{Y!`!d$"z$t6UE_=4Zy*֎f؂##C.AKxpR Գ9#N1O2OyGQrctxjb2k `(`o_X|Vbgy.1GXJ)1臲]_7 ? [O2nį:>|6@-&0TT^'72>nj1b Zr7hGo M!Z˻ Dz | 7r0kA9J+M%6kx J!c^'A5 4HqAh77*1WExpm!#`]k~Ef&7 :IAS]µgtFmC#R*GuPHLMTow6!:8dP`r5 񬾗X]l|ij,1o٠N7&%=sD8dB8̜KȄ!|u9)aAhNH[ zIۆ0F 85Vy8h9Tƅ6yZ?|Y ޛoAlkr0O(:byvyxEo$Ҁߏzͤ~p]#)UAEŽCL8MHtoy #8yÛ82A+5Fs∡r\qưPIY\VgW(ѤX^cO_-b/x[h"CUlR҈50xN %N֪8>г<>'x(&R*rBCB_Emb-@h+;dg^0TIVC& o\3 Z}88v؃j`Nq7=B;@ 97W^тR</%3s1_XOumLx:b\AylNCU<0k+H#FFB/oEe06bukS @b`,L" Qk ko\Fu-Pߵ?0#-u ,^=`D,@:8sU+5 +cxF5<74dzOtfDj@ P^ו܁:w:][_XgjubR1;V@Da q.Y I<h;}\o4ĹKqa5]`6[kA%t c7Dا-Xp}p0Rʞ{:Kjjy1k#.bD` tQ~P x f\6z*h 6ic7@yzKGiэ8"e5i׼)U:i+־/.y)zq+dk$j'n80{U*3|Sa-<qP\ 8 PdaDǞ@QTq8x>Ћ'}L:a8|UƻϖiC. 瘅֜oArME a,3Wp殠W86@ޱ… '|v-Ĺ ^^WBI;E4zD-%P}bJB ;c` v~?|Ъ%Twṙ`mm3^`͟?rhɹ8Kg˖H^5e7P|rŐ+92V7|PQѼC.;gs\ 4G!?^:ېd0!z4Um/ }cS{Ttwq`8i潪`*8fJrڸ ƈAb|[Xr? 0xNs4/9@-Mf F3U0w&󾊋`mM'76mM:{$PǚG9P}Fr݊*8f Xr2oros3A H".G46Hteu_Y6]Ry:} dS++sFUy= ~ 3j?%'x5Y 16Q/K7OY60<  #-Ox5  ɐxhNOQ,i_\&,~AD)= _%$TK^\O "&[y4#\N^_8#,(.RM 1dkDnN"*JF:: `kG8nr/lYZj\Jo!Lksa5=VŃ44oS1Ϋ XjI̒I q~`=8kz5nd& 7`ߨ̚zn/w :2$윸 J圸ouh|cѦ[(Ģ(MZ܉{Ma;ѨP di4߆߬6~f98r>p 8^KqJ[f,?S:V.,gȶ[5AX}aYn(Xze!NvU>y#hAC490/9M~gEmzb ćwI\b+Cc)N]A 4t]\ 8px=-R]pΡo-ĸDY+]M8=BҠP^DC9Hi:*mp>XFek6P`G$YyzHuӬ־s(U.Ív38c'y'eoDСih a=`W7X1=*>r^ b. Arh$HOIz[zDԣrMZ!vR (Τ;j"͕]{oD+ϖ#(ա[Ʊ0SyϬ@_6/P!SCQ_X*&c䝴 TYȟ*Ac_ z? `d|%)ÉmE!)#X,$= zV8g S6Vc SR0oxe|yOL/|GONbW(94lDWް6OZ=ѿs5$x ׇmu4?$X[&ǜK0M q1PN l-sJ|HAZycQا N1#φq62|~04:d(.7eA({jrOUpj[,o^y6*ìIM`Gsql3oRnZ\8`k9P+b !/FdPϡXT!vyx=iZ/]; K;(#N(:sxTg mu-editor-1.0.2+dfsg/docs/logo_design/world.png000066400000000000000000013235021341747546300214400ustar00rootroot00000000000000PNG  IHDRbbdVbKGDC pHYs  tIME  = IDATxYadDFVYW+A;AJjQielq{~虱A9m˖IHIBj_2+r-}" /~           T6W)D tW,AELp"AA[!-^))"AvՈDD HѤ ;hF$  lD k@,  E "&p]L4A Ͷ8w  ;X#&Žr} AELfZ͸\ ;x4)Ž@PA#1Avl@O_BÏ ] c1Avb.OA ͔M&.\.B!  LtF8FX[QAnh4JWWVU!(b 7Ӈ.e~q&A1AT*p8PN\AELᦈ*Zl:-T^"Ž#aGt fNۀNj0'BA1Aay*>Q.D( 8Ѥ ;N!ԵbtVߊ (bFLgc#UM8NP_1Av7NE՛ t0x|f3F)  Q-vEiltZu:7ffE@ "&q˗_ fAji5$6$gEb b ;BXzʄ/W]9FF2su^Ӛ-  |,Wm:0~zA.?Z^"_Ȳw>I&N M Jŧ KӴum^"&ҠRcqرXll$E` bFLmO5mL}X\b&sˀc@U:FF܇Ģ+ZWϐA1A&_5?|JǠWhҠNՀd!L[AELc02q .LTQ:X Z6FJ)!B*Ӽ]bVLQA~Vn^\ qtKUZM]Rh% ƶLQ/Ep "&6﹫y*n Fi)7Jmĩ9Ct}OAį&AZM32k&͋A2`~z.~]M8hկtAخČ ۞10x6fBD!^c4H$LN짒";}l=@ ]1AfG~6Qn9r~l]!K[IV9Fw&' .rkE$(v%fĄZ$@GooN1;tcAoӕc`q90f $zKd&Ž fĄZX&Ή vR>F,rh/vV o{њ\djK ݉1fZi6".Jet{@x9earAg6QLG5<M]  -I+o?`=2`U^ԡ٬ѩeMM{HNQ$iee9 ub;P=}H0ESQ^ cB(  ­lULjmiAQvyw~7M `vɠjP Ӕdd7A#ƺ+s  -mxd#,ء~ "v GXFo )TjMCQ t̿>{)a[n{n`X.0vՕyZ-cpM:Z6F(b0ӪP#CANBm "&;S0ݩ$nf\*1 GVg{ˋH<XL*gzVAv N.Ţڵkܸt8Z !! #Uq^{E[CaaqFW^c9B$Rlv2Fj13y"v3o} g%{c/o\Y] "&S6U~ywKsƵ (e,!K>De:@:3|^JU5*4;###>116t:Ҳ(cӈmRMgӨw"Dz0}4,Ͼ O%~Itw$fD{;ϡot7Z=9F vSy@!c`Ľ(٬GuɄᝓIITzjccP[ZYY.\67cLMMȅWGK+1mnfÇg`mB|^zyd,/o`V{}{?B|+iΝcyvL@{>>+lG8z3q##H!,VFDUOpKN{<I^gbbLZYY~wC=DNS.ff^%~?ԩS|N)μ lbFLa{e?.=M|}XgiwrevGtӳ+Me6Wys]/V~᱃F\py1s;%類_&zYb4[UJ"}}!ܞI*t:(Ǣ[%E;S*ηzA8A1Ay Ffae=ڽ(쳡k]䲉!*ugx?Lk=(V|'LO`羈h!x~[ɔggr9ٷoccϳH^fllÇpEνw͡G+j఻@UUTU7*^zG(vG tuuOH/<b"dשڴJ.B&tt3m$'T ϠŊRVUSց\fpD>E˗Xu6ݧ؟y&&&4?H`eyxN H4)b 1r`pC tq(w;dn q (bps93okfIluRidvqn/rf "B GYC3xԋЪ}Ī[:^JS( ݘhrr e+ö,a^{WqhPU%ZRrin,VEWH$ -.Q,+:^24[oDP ǎ}{o233:qQotv '6fi6sDQZ$1bќ7[hnzJ}$jn}Y"'U(uȷ5L:m$+dThUhTR1ƃ^X5-3vP7W^RnL0U~F j:8].t(cx{/n) ?ddt],..2QmQ$JExp ]O Oy3< ChFud2HDteIUzW ZњuTt8,Vk:tZ`/Vv;i58'ʰkt|N ,/qwX ii?8@6Z+322fc=C5[|xMqq (bps|:ޣtftέyfv`O73חzeztf{,\VX`3yKZ+)ڤ"K xKK&Xt[=n7tw0 D"\.tBH @%٢RSkt:uwϾ#! h``||Q2\aq (bpsMV>'=A&s7ʧ:kp?=>6:LhM"_*YYK(Y%3F$jciεDѣ!Hv?{cmϱhf0ZjQ<ϲgr}{/w<[[U˗!Ir*o 5wTktp;kĄO٠NGS4)糤b"[Q󙓑h.Q0 rXI4::#dLsKJHT4H9wNn̐$xpdF8 0hYN Ã.`7Kh6EIG4c}k \m׶*!dJ%u#)nPxzdaq}|Qu$;ui xqHHoԇ\d*#ˉ ?&Ns3(R۬V(j2׷XMg)7Z$-\B{fǤסidjKGG3u ΞaܶZ>qQ(tl6\7zB._"Jc Iw!nl1;;K:w/0}c^I&Ȋ{@G' l#bFLD*f 'FQ݄jѥe|E6W?9kiOu#~nl:J<^[)L1LԪ\6+lPŢwPkpd.grF tQd$,ӪשT 4[Uܐ囊h3aN7z 4M#ThPZ Ǐ _Po vIj63+W&#ݠPIs}r q 6"fĄO쩯*CQkH0y;sj&?^$Y/"sbV;ݔEZDwcpHvfD= AEGEj)U+ 9JRdJBFݾ{ƭ.vE.]lF3?3 17?CQhPTd,hR Ѝݢ9xpɬ٪bؐ$IA5n2ua D_W<mD̈ H6ҬְX~2MjF3VE;z@B:S|V*T]ӷiE,eZIWcΚ(c!g?!V`r8P(wU% f!|Qkk*Hҭy9O4~a2i8vju ?c`PM6,.ͨI' !IuZ-PF6a.~ ¶OZNQ&N ZhdSʅwўdH$:_LBD$u?S:$kLH.VFsg sw=D6ggr&, zjlV;ztk7{Wkoxǿ_җblll01>Is޽W^zxi _/ߧɤOoD،2<<ʉrؽ5LwyM b2_D[/SoT6::d=N"_qXY[g+O1p\<|A_%bBRCIa3`RTj2X:f77Uֲ*38~FvINޱ^1F$˛*(Ȫi KU=Vx+oD7fAX^^FUUrKo~ /`1 333j1ܘ,j ;gSW^yJwpg>̙x<^At{EM\A1AzDQ4<.;,QT-y(ɚ"rѬSIL:#--=n!N hƙ]/ws'hi 8mHRi(?vv8k10\6ZfJTp t#[ʜcl44 Ȳ̥KȤRUd<+mmmq!F#2VxhdμQ344@l3J6烋\toշo/277b_" i /OkSSS (bpkk ֢VΣ%> t$|&dB{_~|eY&ҴV+ts6?FE&%B$j%2p Bw?i&GR,_a~&Gr_7ٵ9mckksSw/J0ɭ$|L*`jsh4n#ߡ~2??9o/DM _3~d<թ q!YXXP*Uط\]ctsYtz<קgxBRRp 3gOr5QA1A'~fUQWʨhpXmr꒞j*Yٿt?Db@XCVh$Iٛ9bY|2/_bdh{&[-xNFG8gL7Hww7ns#Os,/xh6*D֗6`Z9==t:Ξ=߰cǎ N.͂$I$qv+h4gr~>GيgY?~'P+ٻoyA<^O6%좯G$!L"IFC!BDOo]Rff kag Qd2Qi0Te6N[oC"]A}3O%kh;e2u2$g@oLt@1cb>Ix!h5;y⋟%!ݧfK_x{2ARx4UYѭ>VǃlfqaC"kz]5v/NJ]㲲gbUoaxhhd&,~z c/sp$3Wyٌlͥ05lV#gϼ=o|E\A1AYmGYڈ™3LE"t8-}hT ,NxHL|=J:O*њl/q]N拙>f̘6ʥ6 D $*s>w='Y_N裿ȟPYL.]|u X (2FdDU!K޳ûԱf2Tvz9/Vvp?:C&P*1 L 34_{OVݬc ˘T=]]]߿"L&ȲLoo/{/cb}AELn.ysҲVRFHj!hK`p82`7#wyh;.:nhG?9䦎JY-'^ȸtNfoEǥ2LR.5Z\N6*mg.z_ݷ_e#N$eysS۝=J|" ti60ϹUZBd年R)@ }Z~ZBZFQtd2iZ:YZk( Tͭu Ӝ>"=p$I\.%:^Gp`0(hƵkHRn Fյ Mg^l R*iwtCTMVlm%pf%dsUgn`s:؊E /<ʮѾzE";dsv;BY,t:R:ľ{<4[ &&Ƙ Nl6Ņ@D[C/HdTZZȤRb30!av0A&E6B^WLjyB-kfdA!oOOS&_;Yȗ[fiur qJNְ fL6B&8~`!ųorGm^jeN_t0H,'@U94Chd}f4 ZGdLf檄 6?Ng&llixffXN'ß!&zNw0DPk4dI?Z`P]#4 ${/Vr[Gj}([>!']j:FoW"ipx_`=84ef( G94UwL-,3>={fh,c*+++LLL .dzo "&7?r72-YⴣTkԛy|@%Wns*FckMjB Ph68U=Zl`ѨorBD8̍7W_}#|m py幗_33Qj:NbCӻɕ$+o"fUlnF8`_?g}?niqWxoqqٟ!N믣( Gft0pl67b?z37Q4=|Z-I٤R-ر#$ .\@^]`O+ "&D,-LK%[`vnd_Nf :m\0%:rhVfB[UZȸ, BekQ3*ffn7Zt}-Iwv.cG d*nUz`vv_:(j/iZu;lj]*FBI^hvdFShNfI TivBu0k3lNť &[kzڝ2Spy>;}\x=d￟d"͟?#˿+z:0L:cLOOS,$BG?z݊,8aqo\fE  2_96&WRJ[l7vw|%_ﱾ`sجfhRqOQ-:58*Lb+*(FF!QN-~V*fsi\Mk2B#b" r aDXI`dַd٪9s, 5絽cclt s79t:jF2X ubo .l:l'9gRFjsT,KX"~:GdOl!IF^1Rvݴ:J x7r|_|I|+$IM@oO7_~=MV?sN']=X,6qQki]xhr 1\c x OR|LL* {bϒiTybI^:͛?zEgdx?)RkeppJ$UKkk\'J^]N۲eZ8@6a}m~Td߾}8l/L # IЭp p3LLr,GW8|>W]! BقS: S8xbv46]~Er}ϥq{Tw?`P׉ h&Өa1թ|3'q:ݼҫ|ӏ`5XXX dqQdLq }X\6y/^߇dHf*fDWFB [\f⑇>K?Djm Aљ4*,ЯgǩS1 e{4I\A&.@?+uÎe _xlaUY$Io$9FB$H,uA/cي/viNC@pwXfѨWQdFZi3Ijt䒍2utƠWp:X&\.Tv^1Py;t&"G$l6z$ ՠVi4U+nJlfxx2kkkU \/[$m BrCalv7l9ˠGMN^HqcfPl3ծNa#= ҍ :ϰGImngkfw"osD9f![0,f FTHK6>aM# αgbA"Á`UR:IhTx\n,vIU* Gh l1R.1۬<Ǐd0077G2I7 `4E@D[p-Ns9yӏpk &nI=s160/˅$=|nvbQ;"[ѭF1ژ|8iit\x,lKFݡ<J9YSĩ4` @\R@^հeV7S4UUV+c5*k kԶ,cOW8˹gx5هYQB.Wgq)F.ӠK_Ĥjɥ a\r$.R>O١)KZuҥ)z;ڕW9tP(l6* V ن$ܔJ#h,cZI&Z- JB@bav\..?@Spy_R7q8E@D[< <|K`f '&8SHpW*tpFr瓤a霻{bvA @U"l].Ue[Uk] P%PҥH 3A@EZ,6N'?_IT-$DPuNs~}Q8tݰzma}ñb:o -NI4Pry68{6JcǎaR*}q}C ހFsi-r}*aޢ֨RdmZHmD_=z6|58"/nPK?n;+no}V6Wu4K'1;7ťp֐t: "K*i fmb >Fd8E.nzT2([r(pqЇ}ƀql+e8*x(ZHB"\"(.uyic?!q9v|I6?9rhmrddFF~0fl3?٘&f5+~uL$Ԅ6{4w/qpn {dzdv6 4fJ&=>d6'yߨd %f>3abǥ_%-AڠM5 O&ihS+.;Šd4WV1C,K"<|'pA|\ZaHڠ,]ư=#cnc'ܧz޿>^}YS< KXO,yII\Gx1Aə"a-F̛瘛4CXK/bkso~iR>٬31YozPH` ͠gb||1OP4M!~NmAn9J8a&ߥ\CYuIVVV(F(: =3.&ҙx*׸k\y$tr0|2uբV.23Й`xfkK؏1^cFJ+=8=@7uVϞc/#ϕkѤ3 2!yKG>q/? /\*F"b,[GRHaG Xz5w@Q%w`9; Mj|3̕(gm_kRSI:$S߾o4j}heЬUz5<#IV'(ߵT\a1 D$uX3;0Ǡߧj19Udgdsi,pm\:O"SKٻw/Z f1=ITC"!q\%,~[$LqY8m˙M=_# 62v@??*T[8Ghohef1Z|ȵnt\% ͣߔ 84!fb,3& 8|9Bi?|&Ӽ{ zoC2[~5 D"]DE@|$.kO&uz:f  kΚzjgSDc1DU}z1rE$^;pT2<- IM4aXEdB8= [m< !e׹pCj"P*xRĻ..cCDLqA`{{nscY4J"'Րe˲/yYZZbߡ8l6)J{v6SK#F!ldFFF9;lz% }ŠQa{wcyC~yﯡEshDcQ:Ky"ZD'KN]/"tB!9(\Ru!3r:zM26>ÁCpG4_yY]E"ZIƒ:iJ2CU @TzCWq= DK虜Ft{ǖ_ht&cuEQ,m:5)d )2"ͦp []Zdߛzoyᇩ7+\]]wg3wb T c&''r јƞ)6pCi|K|oЇ?SO=:u9} IDATs/P* ~~qXt3gbY&R Dzü?x>t*~e9i%ٱQQu~~055w[ognnnɓ'׿Ç9za_un=q wSSSZ-677I%Z-vvvǨv9s <OٳFAxsdFF~Ԋ\>W\ėms-G!VM۩x"}ZSHBaPH%Qb"JݥMfpW/'/{~A4̫ߢp83Gnձ-,}Xhl((b'ilZVݴbīD:nI#JexT[5Rqhv!nR^c{QQFQAP$8ݮ3xD"y pD"F"I ՘q"ss,,,HD}!i8rf"^3gΰ͇?a$Iԩb1 }viȲL=ʊaGFAld퐎W'[]7 <|@ 3_ aV:ARb_osd,xhR"I=MM\pf%Ա8{gR*ֻ xY#DT&V'O3M2Y" }:-*&$R ԇ=i @)oV 2&J*`b&fB sL05C,"}"dBlϬ&߸bdp(B:v<oXO%VD1 eYވEIP1ZK"&I*# xmOڢ3Ȥ$ bi7[O&=M".ia:árcX-07;CHxuƊy}x_}|?FA&!i˫4\Q222 b##?vg0ٿϔ"q" 7Vk/u߻aLSmtdp%^Y@LNd"cEb0:蕫Zʓ_:$fl_…_'#Je^פ;j d"˵&g^|;}5Qmݜ8qUrT18 {}mpb4Bx>RK︶鈸z)ϧ0D4B!Y)'LQUYivDbQHD,F$<ץըSB!Bzp+HL*!0 }fC2!*H 2(ˤSyLkȡCi.B2ghQULj ؖK$+kkqΝ;=Q122 b##?H`6/:lzo'?ғYJӡl}ԍ8O?a[?:nI j}ih+1&-x_&R8A8b5hL})JC(Ǣ8:;T>ۛ˄.Cw|UGҾKk2/)001.;..=݌HJ( xn9\1r1Mou]Ԑa:ht2ƠJHQQ$O}| DSjm$c1F Je)Byi6"P$IBo%OD0Mh4 "`~>k)dU̙ ?IӼ >]=yKt`?K֠^5>(ܧ~ԟzމޑQ*?ө5'B܀B*>;5W,O)[elrZU$ƋybZW5;Nɟg<2܀:Wq-nA3M({&i7œx\&q`Wy^ V!j*qţ?<ѴX!lj#Hk"FV0HP7i 8#|l A߱mjaNQc4Eځm;rl&(8Fǘ^|pXFcȪ,IMX 3;;KǔŷXA}cy.e pWQ, i.xQ I<2IQlסL&37cY̐H$Aɓ/q]w>H&ضM{ejf'2 !97=uR<G\|TѢZK(J+~{6O%G!ldFFmS}+_ u`m2.Duo}4>'LLģ땍GS *4v kXGPYS_6V©8@*!s3c}4u+D}ZA6c :w:e ɩɒƛJ;nJ]6:d g f(cQ,Ievum{AE>W7\g`^k-CD755Vt*"x:HA@˦Q5 muv^{pD#0V* "\|w/iժi i UXp8,'q $D2FXk:tzN%p=&''1-JB~-q'6+󯐈H$PBnW(xl{I2  Mґшqu6֮shb*d{?n*V7J{D$%cnC׆d4eFq:&fnP]'|{M3Eɥ1}֮r}yk\_7}ܴQ" b3MvU$ ױ tj\ @ ˦l6P w(:ia[>pEiR0Z -5N,x갹 6GedY,t;((ض4Td2Nes c'1:q T-*DIH& JR5 C'ϳŹsW~B7?i6>5Vq]'s躎x؃6A;Twtx:3GFAldTwKev}j|&.n0f1Tr3_{DL/J$y(K峬,c>|nѯҽV%it[ =$U&<'Kk%.<7O|JX"IBCGx"Fn[Tv6g?j-S~`sw4v} ,¹\_牄5C'(a6N!\WA9{ H!E!3/Pw3V}Dz ~-F%|Y S?pZ8:FA$]@߶:,-]CUU~".]dbbZF("v!I!Lk+ۤi%( >e4 òcC !L:o8:tF[n,?sgy+sGRDu3}R fk}ut'+/G? (#Xf:cq2iIY(Qf߼p7zmj#q]9qt?dT1(]XZ#0Q a[C65#_LL*q6*&n8iǶc0H4">-k2׮^ [gqۑ8}n{CH*Q5w\Wnm#UDB*TU%.8+d)؞ N$԰H?$ S,tkD4$R } x.ۭ BV\ѣ(looE9q ( \|v$&LN%qm\.h Ȣ1  Ceض$I7T8.T\>Np8o|N%xOp\x7?djI@T4-(CƢX˅KreEQ@ɱRy=߫baϦ9q$.UQ'۵ͷM)qRm&39Hig/pꙗh}Wn<"C[KNEaX \[T>rw3Wh\{S'gh&[-g5"K ^))~9B$Ѫ7tiN|@* EDbD"76A20 $Qڵ%ȑ,?^}-xśkv.Dh1;;NP.tiwh8 XAyhM,__* "T*A"߮sI^~)/ ^sFF3b#?;U^vj'F6sC˾ma>`YUNڢ.yq;9xXpؼC7'E GɤR.Xp?0KՀ9o;A՗8}0N4;T*M2E5 $!R@|,2vI<<͙g4MgE1O!ı(8MgW>8x `r& !:50 Yu8F* Ng|GLLLrz6lY Ebww#¶ͷB9,/_hvtogyl[6+:xbħ?ikʯ ǎL'Jrajo!{$#t /Q^w~ɧ_dRLId2XW_g!/0Q,a6A j\pnFK4E¤R)Yoi gHWLixRP2LH BpBKBwt6V}  Vr0}x@ybUUuWh-*|_farpM?A(M^fK96I2../panIrϽǹt&Rc$WW߇S(,19=~' ƐUzXiPX%|dT:&Gn9n4d׶;?$&ljgM8~ ҹ4{g0͝.oK-shZ=2c%Pc ]ϳni*vx,,ca2\=4 fjd8D,狟8yU2z/#{ ,//$he?'vמfkk+N;fY[&ZI(k)'O^BQj8ȮP̛*糳$3#/kϮ// i|)D2Fçb&aɤ0f5X9ёh\.Gex7N8?%yi3}xW?̓>"kxmV?NqT}B tJs왟޼qAontPE Ǒ\\5LAE,Ǧlxi`R.I&ڍHshivhz؞ -?d84XY}h(TMUԢyao' >v`?_} Z-.^i`mYS.Ea~p-חAwժb !wlV.؆m -5&cML` nX+lC>Z" *&NI*O|@kp* O&Dt:uDhǵ٭׈' ټ~1][}wecb ]4) (g rm ?[ӉrS\|'8xpH#}2bD,Fu GfYX=\nv}{Pdϱ0ƏDzeyi}:mH*Nql˄5t6m c؎I#ո랟~OO]et:cq|$ S(A},lm`+!@Na"2zLuOmBUol:>d|9$&,p<5s/}sͫ?v?7 "jC1BT 0<F%|#6iVC?vև}R$bzS:,á8+754}{3O1;_b)bC8ٵ pR#/ֈbqytz$ ffftZ'VWWТ$¶M_'8xCq v1 qI޹iҙ*?=l~rcOK|Oa%L "|TU|cn,"0[/S6jx΄TDQ ;.ᘡ:Tqxn{E{=38rdzx<\2s襟`|s*yq$iai$))i+*[cr]S3M,;oW'|;brm(P-Q B@ *ݟ Ew}=evnFsx.ۻԚ-t] B42LL]ŴK(qB K YiqHhz"uJJ6QRK?dvv0r(9KG~1O(78r<Ʊ9&RNa` 9aɫܾ'Ϟak#,gm ^Dj`& oPs 'I=|BnZd\yU6XxKm\`>+\hZi+RYQBg t]wOg0dn?xps ɰbtz̒=XC"Xs}"K lNġj8N9Gg\y/t_-MEHƬ2_k*j" NiDNrQpd?A)N'/bYhOK?qNglmmq45yr`!a09Q1Q1?az;}_Λt] U70 FM7Q! Qj \wʝW~N-9\os0V\ąBT T%7&)$g.Gc#vwԇ>/<'N\vtJDQḤ@$ NS-W!&5 neIŁT-L"%2)Y:RıwAxG-6_'/ފr(9(7bP˷ȳCUP5j:cD K:(QV(H$iwDO& ES R&&i@P1K*R0 \e%guYF)7pw_G7ߖqGJ&3ZL(BdBA)RSenyJJCߧbɒ^1ixG4* ic U% },AMb d S4!M1u8դ;3KQgok7^ M9;wX/vȡ;?4k_/B;vXNHٲ&H 2KJeB?d{} 8OD!aM#޺j O]AQVJw D8*PBsv#ll^m)N7< 5<8w>ncq:j2O(\:&u].&gܺG;(zN\c5i +V@)QePHH(ӌ*s!~:x8 ]iJ^B3t KVmTUE rIVO1-2-(I"45p!&3:  Ci;_n|!pD|E 3 \\zY^.J=걵E($I֡ۨP)U;tM`*#RL!DI-i_ ehJ|L껗wN>a`$fF7AmuE5x7 JCݸΑjZ /P*|S(L:ӔS0-E]hyF\LDI>V SWJwSSB(ALBaJA^*mwW+d2ؙ#eݭm.&ekGfϙP6 y{8}*r].]z˲y]W/y'p 8YZZcg_'OŹEΞ;NAUu`8!S]TEl8kYfF{D-Ν: n]y5,d8ѝ0;?GCvvv04-}ԛ]VWWc[f<"DUT! )S JI.! jT`h P*ğLIi>CT)Mt!!BCz'.D* Gԫm̼NG>dF.t4Pt0 &0LфAb*\׮өԏϢ ўC֙rv~-w6xqJvC;u ,Mu*}1ǼqYTY K2JbC!IٴyͷZݖKd\(H31,{bQ ,Δ 8T7  TgK#[h4?|fA^czDQ6|E |? ~_W_gyQ޿z'|z Bo_a^(1;;; Gܹwc'O0??yh:A{8}ڍ2͙Yvz"'#,"J88'j4M3UEQRǎ`ff=zIJ'O:Yf0"4s +G 2181 tE(΅(B T B+:,%(nѲ ݺd4T|0r(9_4D ~L?4IҐm5eQi"l~*Staz#mF{f>Vb6Q, IeFJAZdhRL tvm QP:_jpxG.{jKbM(fXN"| :3YnӶJ}) [lQQ$Wi0BdAeq0r,['/#.oblggty3N˔Kqyg/t 8^OŒ$QT4Q 6mL&dJ +G^ϟb6Aaske4 zde ]+G% |$wv3N/wsO?8,CN8 ˼HE>Qhrx<0 JE- Hӄy3Mz=4%|(W+ƭ[7\pM233Rr=<#%N:EϛI8|C2۹+&5DY>Z CUbA"0)15(k(y]J e&SV7 FܼyV 8{ F\B#MB>ZRȅ s44tTU%CtUCMQ d"1LrJ.qS| È{ȡ{ƣlu(cmwMKҋ<߻IS9ޞgHtsvc8 Y(:Nƚo|c2Goߧ<)Я,*"t 3Q'4TSR6cԺ@q,dnq|q[D3Aɤ?ޣBmrXa$AMO؝iXw6c[N\jXFF8SCkS*j!zǢkH$ $޾,ZeFdq cJU1{\zM;9ǟ{Q-ӈvk`:d,̯`f:^;zdmҥ%\o@h`4}2سXfxZ0!ӔG \[Ӝ:uOxGb!B@&U@9[ωLjn&AQH)\q]gr ?C>_L<͡+.{;rna=*4SL4Dت Z= IDATSb Zs<ݑ¡O_!qÇx.:qp{{;ʫ7vF3,$KV6x[<ݲZ!)lO0KuJ".5Xe~pL5#Ǎmݻ/5K #zŋD&[ENaZ^BӴ90OpoS5Zhe*NƈF+7(ThkL9V|L=g2BQm I#"):f Ӣhbq2p .EgO4CF/(,-O lK(,=.GTL!B,.*YY9FqPn  CfHp{jm$Gf4 ]ABeGb) 9~YQiXjɐsa6}EjLaI9dY BVh@QU %EQPV(mtCaqiUWp㰷sQz U"#, ct]}< Ȳ "A4EA'st:EU䚂iJD$(ST f(yNe$IBcr(=woߑW_'"lKǟVț 5~e;YĪOY.6i(!KGoD\zu}xXo6ݎ=EґFݙA),15aJo{M ?SQR,(V:, /* ^<3K˜L% NgRs K~Ewe){^ȌYENIcbkӴm2 q{SzD1LG 43ԙOS^͛7Y}dcgҀ -T qaW𼀙,͙E4Sʼnm$ @R%ht~u[o E08t-ڵkW ZdS],(JWyN9Ο?+Wtvxy~㳿L[׮z6|uqxӟ>hҿдT4@jBiBdaLǤY(\U!ܽw$>Ƭ r]7)$I($I!M(H$PH4C)R t]ES@JI! e!PFGAPTZ)Q{ ]?(O0r(5ۗ^y{Zg>K!řS|KK`yy j9;u7#sL0wlr"̗-YDQDL$ C2zp,'Tb0*"H yfZMVuJe T0l7&vCq4(Uzw̝o.~9 U{"nڛh-=b+Јgz#fz{L}ﲲPeѥ.ap8d0dNw]2tMix躎 q hm$9rK7ztjɦ2 ]E(@3TAPU}A^h1Ʉ'0L~ÔMV6uN;w޷7g5`%1j`: IS @J(a#$CSLG.ӮY"T$JuQ~&BA5 !L໳(H f*E"M!$E@^*! k c:2`Pr(m !swq/uL?7=ɋc'5^}]||y~GT ewj5LI&SiBoCR"P:ձOoGq X7|H0乍 s<yOP&eƉiU=o||r *6\_e,QP :2ES@ ,E2mϰ3(6G5 m(EӀtwP+Ҭ(W UFuCΔl<=̬[Q^ѣPb֡6t^{[֍Mu*;[[95`ؙ\tF'䫿uor9 E#/RLKTAd4"C1Vb8" wwy>-HQn1VkTu&$ti=&WmhZU[u] =&MmH{8'Xl,1Mz=4?3JYf~Bj]!f F.aD~QBu vȆ(MCSgHYFn& ^ޣ:NC<Fm86^`iy Vj 5jhvZxj7: ^ǟ{H(U-}"a1;Ոz^> :>Ξ6-{_riLSZ,- B4ZMs\a3t,aCQP()9O+ƃ1"8{v?=&1Z"JHQm2(2FP-*ﳷkJu(JHPV#Z AD*U$B rr8pVTdP1uYi(xI BS1 $Kd2 M0r(%ӫ/ɝ[oNkWԅ[\rE>?Kg?4mi*7F5G> |t$j(\pEs 7(?VE*b3V*#QbR y >8<ѥB &44bG91Ը?أd̸9L$QJ`ܼK̤Mi Y\3rK-֧TL:w HoKBw"ZH҂~:&RGUU&є4 25Z+spQNdx}wL]?9kܼ|jg`c(jI8򐩠Rje]?(ۡb ]e2)IjETdi/s6>@UQ-67|ZS3xNǐdushAV4M)U+vww]8d~n^'2"?s&T*5ڵi1Y[xgB'ns[G{kðE\$A)I`LtUCUt$D5$eD Cx`i6^Q!h*Q)UՃVPDSI&1t<)!EQ T(*(MW2EcFICUU֍ No'n6<[Gr]fg: owſ6g.V aBCxzn-6.(,:9 eօqL0-HW^`e2◟%tu"0%*9datp$ФAqHQҨkܽy ofhyWrâbXĽJQ傯lmC( (F10j5 3%+Lk:0et`:b+QmY]3 M SsRo4(4e;wMGh*u/Y__;LcZɓp©sG7+datq:ׯ 2؝h33Ll\Hеl[_J sTm4 4N \vCqrdNth4"+:Lܹsze8ؚ>"PHB6LݼLD,rԩmmm1( +2O"4I҈VCn)a6y 0Lٹ6d1rF+2? N(J%|0 t]%yz04 UJVHdz`P!$RyNt_ !H 2Ttr5yȡ{̟:&F=^@yLflOpBg.bXTjuRE4MvERaaaR0],_v}vBQ 3v nW78}v י0N"e33&Kbo3:wyq޽KG>! yR)իAT*.P>e`6ht[~Ғ?a:HכG稪UK&+d0$3 'cskBJ<'AbhZ0d(%OQ$(Br9H)Y,2TM("%B@QiDiH Ȳ3Xmd4Mn0r(5J#?yIPnՙ8co*8}fU?i$y{㎼껧δxHJu$S^X, ,Ű0`ػX؆5,R7$J"Z\")Qù3=gwf}DQEDȈxGWn\Q,1#>ե'w/RV15$6;ݥ uraN; 'b{m\ 13wjހ=ڭ>^Cdh-TvۜVU$U9u8g.Lۼr}Ț膤б0" Khz fc3nӎ"60 xsW36wXy4WX,r"f!Ezr6}l-Mg/bmПc p =2lat:Hqz啇9A`{f Be pNHX=t%p7ޤh}/BAq!i4tL,$bt13=15* CctHI17;I!n-6i? l?;piF'g5/| -.]:ETv 24nzʇJ&# =nql7EFA̗e?O=N޸>rQ ,SScX$lp\V`sszΙsݠ۠U4m׵4bl6ЇOQ#_,э Jl/쌋a0ĶLLMCˆm.a& o!a2+LL@,^1ô1 ;2-D%Ƴ:4I9.ٴK'zLS?!}c+4:m/G_^.bO?ʵ[/~~_{F>{:կ7w?;92-Z[+AVwʭWD;&Gff9u 1;AL8F؋sLFx+V~a{ kxf92ڵToN:):6n[ E1!%ƜX8ak/kI #Rgll_=EX[7h IDAT'#uGjJF0pnMqd&k[IijxuΜ&DL36N2QjRCv^xm53IO6O}z}S-t bN;I7Et7oPovCǠY*E '~HsXe*Pnyːx4Z-qQUɦmFGljdaX@M);86-?NNr2^)gQooS5ani7ŭ7o׿QSSETS߳k[민D# b.}ob#IEz -pI<bo<~? I1 "4kQ54IJ2RWY,4h!A,1 ݴAISBb av+e9lgW!XlSF?y^{qXzıdm{Wɿ?YO 7 9(lW.233^6Z,&'bJ`07~ӗ]}]m4.խ=eh&W:"Wn+CcyNQə`̗G.#79MX&bDX;tBf5V6 J~olp aZျ۽6Åy܌+7ɍbZ\(#nmKʰPR s.SL[;߾ސj0Z*ܼ6^srLm[gsT&Lp@6f 4Ǡj@@0^)=t)\.H^($s4 öXZY|>C'0t$e3±#l355Aȝ‘InSs=ix(i¿!m4o\gtlGAï|.<}6?4uR nL#ϐ+dٯ\x11"U]cce5&F5̛o27w~ϧ1tCe}swT'_ܠr!(ďB,ˠTγxpk/åp<.^ ?3KgVAO ]C`8$)%^r`Ϫ PED C#Ji(!C7 44 DI6Jl+q ]Jdl6{H qbߋg~S3,LY__筷beu0roe}2;._:`{wKdlb|Y槧hԫ5ff1h̛oލ[d9 ez=կg bmu?W~1 L:82?rJ|4k|+/(a4aQ[bioocO`9i<Ӥg8t_0RjMG\;;}7.W~G~ o?dC7L|T8tJLdieQE xf5[,zaN8,UI̝9E%7vTReG}Ý5;\yT=iu_QI ytĖNYhFr9gI %. !C>f(035IN\qM'ZNigTv?!p$XDDCdl+xB6ДI_\?y}G SJO )l).v8 -\ "PmuMV(Vj5cH6W~on6+(Jsγ̱CB t>!4I!43Z`Yie}ugN399}o2o_bueLSZ b|SY,s7p-E $|c G4M F8}$ 8EgmyucLA)>a#t>q%e12")AQPH%"%J yaHD!4M!(TD zHűc?\ ľW1]) uollg&|ʯ?N=3ѼxNҚӗ7_be{'O CN?A1gwm Re Oگ$f8_=h:_ԯO~d+y֊r?:sKc=5y(9[Q\B6&JmZɑO}ʧ^l=Biӂ9`m0+S6Azk#k60:CV V 9;utp eŠD+T;0"2jF/-gQR𥻯 tK<xq*'Or}~}hPmЮZ`eP[1YX0}laae x&-\*K;DePۯ邱lShJi0g80? i:$!/VahC/ Е"#,RT%13O0=.k8 a}y5Wkw^%oq=~m13>2$@073yDq2(8]IvW ='y }T&2?NdܴfTAiژTH!&4b T äKrGC5ta Pa qp0 tM0AxQ8Mw SeqwiCe;oϓ+LR.q}|&w<_3>я|R7~y+ܼs':C٧ncf3|''خQgΟ8S'雂(f zRJ,D48Fx;q8X`j&< ;q_`שo9qٴCdeݐb)fD[ed M L,Z6z)33GTF~Rel.s/<ωSNL ӴO_\8s|*G>3lmBdK 4ViC#[):i0m<ϣT)sɧ9v8|l6KPhFBCl&c <6|2•д  QȃVn)f caqbEI "N) 6;%,! i|'v(3}[{^HQ; Eid*^[YoY.<ףm#Ldx $L^!(@e+!Ll-XE菻(:BӰt+"ΐQ!G/И?\!VC?`imm ,--'_*\yYܠVcn~i[SOv>cWHő9,4~w>CGG(,rwu7)v s8q׮- %Cރ[|W_S?cl:_7z\`q)Aa6렔bxXK*A&0AnHa,byBHVBS(E0 a <!bLMvk(W`Ya0IH$ݍ "&MceR;\hEvzɋyD!J)B<_~YFFFi7 *f~ ðmMvvJukec} e@b /eH2}jux0Q:dzr\&ġPjd1MlNjj q,BT*DrRaNJ }%J1M2!& hG3 mG㔺&C~*¶ Ms Xrqb'1$c:疛;[^]ann)(^捛:uVP i>aS.UX\f~SW4^~e?\T:EM]|GM tL13~.YTL%NJr{@z Ɇ10$‡g&),%E >u, C '4Sz${$ĩ<||<}YoC'S)VXr.:6z1u#ҙ,ʤ!Fɘbr^#ܮQ4ӌ:6;k!K%jM3?q }rg4>P 0Gq0VH>HnlN @R&]BC خiq'(B` Ha-;(GiG&*NKh_)wuK&ߑFoOM>N-j$R!AgeK?a߭=N*]hhv(c:A$QZ2:# @tlM&s5 q!L !OdD0 w$f|wwTnjf94:^O6cRz=Do2513y≳\{>B۶C1l ö@tBc8f(  H uC׍D&RF(i#G41d2RtRH1<}¶m7($ "yq{PK$1Ft Bʡ_83aҹ?\ľb$gs;KGMMbl!E$tX#%벳SӜ^zŃUz{;hQ-Rp~V1JQ#4˹zݍ6wK+w06( uI 70@Y&FG"aȱ )ǥRS[DաJK"W."Lfϟ{ uStt:0t0(ZI͕0 bJi!wC]{(b8urP]h]I7b#fK7@X+%h cޑR a'h(uJXYUޝRԐw#?Od#}%]k ;ttwHe\*=j3vx]HR C7mmS)Q.MC`yh\pT*mC6㲱f tG4u:A2y)LT3Do r3 #L|3aax&e1,RigBtt=./PÕ0A=UMɟxƦ h{lW356Eutd ijd1`w$"xm MltcxL6<{S֛}]:k/"a+޺w;whF~s'cd|Fnso"5RsOlB:Of<.Whd6e=:+;ܜ*W!AbI"II,KmRH^3k~3kpi/{-E۲,ɲEI" XPpB!IQ]ZXMխmw{#jB!t$݋e'ȤXxUmGAZKə2"Nyj/X ( C#*ez2~uFNҢp0=@ݭSe``T*]w0/24ut@5gHjrY\NN "qv) [][YOg25SAwg8e[JM;3<0hYV!nM6$ ko\JPHX'h{19I^'ɲr~s3$ ,@t,S?_D38Oqh/|#"ɠN9Dr=>U6vo/Q.a6 MpM{ܘruvm%ߐih^\_OO?v )E͙z5a.ml6I$md)BKM(R6:"'ѧcH Ww-AkLu~!`xlw7C:4"kh7똪9 )186qrۥuQD6 zm40t=MW,A* #7 B FR {wLbzJ3@1,zv"PP"F@{4 v(w?Ar#[ l?9/JY~K bsg'?<3gϱ}l {(9z(k ̝= 9yIҹn5&ٮo}?-;oBy"oS=? ('N֨yw܅7QL3tqR^>>(bnrHƌ3S _HpI!t %G1^j?ٵ p5FȕXl߉:2i fҿ<|| sXT :Xu]\4:QTU!dnz9_ \(WܖWe"]P]A)<-),&etco!cvC).TAODd)8"HGDgۮ5h乥a`wYyAVN4C!["fo %V݆r1 |SerbFݡr$RtOOJ!C=E."=j&ݮG"$^"ntU $,v" Ͱ6»]I*B$:]]UEI($cs;ࣟ#`[ֶK~לZ/r:mK(ڽuMRr̶=(w<eF{x~1BU01ۤu}g>Ha(XJZVo/y㙢E\ͮOݮ] tAGk41MȐ,79=y*h7BAU"JCM0 'ѓ#D~%ɎbX#saL:A3!m02;{<?oǏ%j:aOJ^%Qԛ8tsjBzpf5T`0o.{]|FbSn2S<.OL:+7$aKQa2w ̠tUXqLÏ; ("O%Qa'mXY*f屳@KSuvFJ)8@JiN8qB*eJ, (/-ѨIg2 $,Mѩ+5B?@:e䙛_ BE4M4MiDga0T4n*R$,t% b.DlX%x0{?p,*j S7'o&L*:fץj064'Pؾj(_?Pi=;wpiFo#H097sw{/_cmaQ " w J;b1=їK܏g'3'/ҬܾPzڤ?rE5IsuAǦԟirId'v[t<2m|WG( l$!3Ƌ] P̃nG !N=S=ώTVPdoB̧ٱw rI Mm; FnQT(/]EĽh)6FFajWfo}z]Y>eӚ^]2\53"Z13-! C ; ? {!"u_ Lcf2? sKSΑϘԜ!_H4Bd4L*a(aCwNffY_ M'N8v }'iD `yqs.I^ 먊D"6R]Ϙ*)MWzdT5bDĠH*!>OU[@b Xjg'ہG.WZG\H.9LiF'ryv* 8<̏~ >z|Hߧ:M?*;}gS=4g~~B&Y\vL U;[p(uVP6wf鵳ՙiwsfƍ5X6)BmGdzfOphyV-2<~ R>*xn;2G=}FJu0m1ٰn)/¢1_BKڇWԿc&Z RB >^6@\끠YˏfŞn-$:DW\zP5 AQ70/ hqFCA7VI %}yv%MD8wr}%BEX*PbV'`5R_m4W+2&{ogr}?NgIV'e$)&ȘiHb%8@E?vF cs]J:**1vvkE&L gzl@UT4* %z"=<=|pk3ڪ- O2ujibs禐Rz>$H@բꢙ6 ۱sY]igx24/ctw~EF~OW,jr>yJS(%{ϧ+tbU{XyKkrS ;G .OO0ف?c&nj }ccߦ݇;:2v td%i!0"K5"@߾ 3sDRw#}a4abx`G3dLdjG B^pw ԡD^DuUlb=Y\@nWlIy]&Kc$.}8>I^u(j!oVKvAcw-{o:h}}z>jV\+q)*7O(zʺm!rubzٞRR,!y>U5tF AvQYYab’veӴefOO2?Dat?Ƕ>n+V1(жaLd^fqiU$ {v=~mjO $B`Q<C#)@8=aU ݂x#H2wѵa(I#|-6lV@iW՝4PD16G"n3Rut]Hml2t:gQ8<06χ?0ZO>fٵc'_?VrC_FWa ZzJYY1Zӧ&a(A2ӇH kRDt-򷧱vP- pVS$VRe̫n}N̥WPfρw}JPtB7?cy 46"Ym(.DZ9۫ EAڑey^suW[XI.7}}7r헏HHzEh 8 " `pdC b83$y}r٦zLfMc `ii_#1TQqX` 4# |T~EMRaEA-^"PUAs]G1t(wf=[VmZ8:[ͦA'P[-%R ai5dmm]{b6jR;v H /0;J0[]| ?ok->N>QR]ΉW!a~w9^~Vzbt23:5őSN8#5'#'Lmbl,6q+" 3>HztD r<" NŽv}ǨAaDFkt]DxeZ ]`wl*j mզJY:\۶Q ۡ\+3Rcvi=6M7iZAt}%CCCwal]W_RMMW5OK>裘335Ȏm~˜KОaFvc)[u3,.g|l;Νعs'ž!g)3mSkș?8ǹwt7|$lmɶ]ǡt b@'cg) Ĵ-q ĦĘ񼀮! a(t]\}ޤ)Ϭe#=r,-7;a`֦U[@l.TR_^LvA!~I&^H"~3!aD軌Sp:-V^,Wu~#c}{+ Kd/;qί,ڙyǾQQ#+ٺ:p~??|_v"uJyP3٨;s/QeHRIgSv UӀmQ9QHse)gܙ͆GF˱o|O ȶPfXf> CU1Q!tRs ᆛb{.m1.h\c}<d@%@O!6K@0yڹk1 3 X@"$} F" 4xPk .D`'!%a%xt/xfV85>;]2NOp{h b?|4D % ygp#n'(dm(KK-@Hi躉(G֑aHG$I,ۦl.Eq/2BAS5 $U{0<ņm۪+kr폝]LSg3ZNZ!ϑ"D,:!SH8K-A"0cXiBF=V/̻o_[5@ӒG&|eNQVrZ S)D|3`~{#@F4p7':]A 兲MAh*nUx#velK㮻 ^?IHtTfMGƤK%Z^U(mE!R #L[O1_!(Uis|75Hم5BH4J g!!nÀ8 ö0t NM*- Ui&ӎdVҦެ?6lV]t3՚/1?5MNw|/iANaXEZm>+*8Ifaf]Sy}7GRWQ*)x2{\C099ɇ?A%Xr:TUJ);j VjAKf-\[Z9q5B/=L\#%;.%v?ϊyea 1: dutCռd7y)E%0vݩMr ׈fR2.jonV[Ymݴqܛ\NQdמZc^)f,a l!lT 0LS7]Kt+M1Y϶D?KسσL162C 吞 S ;$aZxQm'QA>WOx^@աZoil*I`B4] d" Т.:*Z{hZ"? ۪[%jG!/{ |.GRgAutˤ^ov15Fg:qӥRo` 'yy]Z*[:})Fxv:=Uw]5ʭ7IZ۽ヒ]v0t)%é׎#V;d{ޱB ;N:g `!0s=$dž׿5>櫫r*E& z\JMz8nئQ*!Ɔ,߬;ob6MLM"?٬!(&VkXFupK.x1g&8sЧ.}e&&NQn)e)7"l/Tk|JT[uOOu]ɣ/H]wbF}8Lʌ*2o6r"Us^]X8L_ GO+;u!n/uE@䅢ӢH&}TCYXR*@zEXfqԻ8Zomc6i.cp@( Q6cwhbӮ"ؾ &dQvdh8ǽ~-ϐͦidyNJ4MZN MJ ¶-ͤP@1N'-&Plx+'&}`jgVh}"C^6+QɐP~$) Cm/< 6ɧPtťeV\պxv;!nۃ*'8wiXf!Pxt:$S1qv1j]9߸A_kX:A}kuDp=d2)z%WF4mx=GyrÑnk2<c>&PAjzx &+mji]%n_"ir]&`bq)uGOb]:AM$r)*z"I; ,H:nWHf$:aUmm0La'h F#kKU[@lncbˑZdt]\*h6d eiC"B iv|>m%֚j ~<ܳjYjkmfff];bٖ-EfSG-^{)2[Y!ij E b=([jնfh*콽"Zb Tq]7dBoV|}WY9swۡ-0U[@lnF ~xܨ05v̤M(ى u6$^hP^]C \0X^[n(D3 "NNpAwDgjATD*O? E]9.FGG2mnH&W{En5>v ?r6tb ~7xLѬ'}b B$ES/d-^ 6Bf|n<@my'h/}Ok$RRKַٜ֘] ˰ZH8ab641m0u]Bc(( 3A]C c8NANc4t v,hH@0QMA0IeXbNE*)|IE V[ +Q*tO}R:iٷ[ */=Jܶ}l1w[@ln˥? ptrF..ѬNcnv;8DXhR*<;i%)(dhd 5Zun?x;D?'8u4@r0 L.WZ ӷ엄->q{K?|JBQY]:ϨIa`?ɾ>^M9$4Ik^cz@jŘ]le^oHYX6v-kR=,!A譛(`~~re%(]8yAΦH&-S. ØRq.ЉcIGr52CK F!͎\\ݩNy0\J?D2 [ d$鄉BԺ]'PB6HZ ma' K'T(D!A>Sn~޶VuY ?_Juڨ);A:5?3;sg1 %^{%y EiZŖmݻv<_)lXYeɟ O=A-tM\6wfǾASabc{w?y/[/Ν;fzz~g-Na2jAJ9CrwnG'ZUJ|*N2BGy(((R B7uثe|u}ٕNW_'LބܥqDiY%﫮OمKWQiAl(B&MfADTQT$qԋs2l uQT8߷PqjaiHz^Zshx^0`@"TP^-ͿgMϤnSVQB\6~#qNV4[>'>WocǮO}kie=~)->+nziŢmrr0I%sݼ|%|2E /L!$fRB׾Ƴ>ˣ8ǑoW[mR ec&ev{e!|^=5- g+4cKc2woxɯv~7)E0440qxd#1rT@E|h3o^u5AE IDAT-.{ l~LB\EvZNn<))@Ukmz]_?gMc$+߽oGUduw5)RjPgd˔0=#@o'y$$Jd7^;kZ2+3w?Ȭf"ٔUD/8c>EU?91s;t(a5ژ3ŵPk%@Pђ,˨ y<\FC&&&HlD9j&i祼fueRJ|@&iǢ~dٯ) (U{{5C(q+0U~'%!1 (Hw=͉&K/pX4F%' vx>z\?55snq<`4]Ī(4$E! &fyJ (E&,0il3nӭVo1Y 4Fp;9?I]8ϟ{QCm;&B\pۏѣ {#VV_0WAd}}C,//3hCC80ݬ9_/utsbna&[ϛ/~ÿ٤y|4͹{λȲ -K=|ӧOg%}Fi;og8,@ö b0uAe?yy LNLsfm:[xýwIto;YffG2'%f^,(%8.i)4%;xY--Dd|Nn_w=P4JiLiύA*nHc<1L#< (e.g4bV)}'!RHa`th)( (i%rJf,M*^5qb; ҲS4H RSQP`HAh myPH U)n|rverr,/zse !|>9IΜ{!Fes2mt1+u,vf'rmJeP7-# : .(ϦZ1Xd"DDaB1,$w}c<{to_3qQ|vNps}}=r ۯ5Iֶ6xG捷no~8n.aSOq2+ҦݨV >_? |]lU? ~Sy}_\94ku.^:OAHgk|_=gϞԙl<'?IbkcAK8^)NhD7IF;&Ez\rֳ+bm5k] ^|%_ɇhP"=et*BPHZHg}@Ï*?FvN|߷+g"`.ixSߕJROjY2LVc6 CZaZSiZXEXf !REy( T=)r)eXC0m FQucaEP8T) )Ѩ=ː&}+!~3c7IM0J {]ۑ$Irtv4.J)!BJ4R1I^CJLP9Q"?c QaIū/1sqǕW)tiA$ibCopի6`Ҙtvפ]xO]?9~;d4ZכW9}5R8Dh"2;[Z1 V`&oqam9F hMx{qΞ>OdrbǏU_b[.^?4<}}߯U'?SF0~L& #ή+kvEѨԸ;ry q_2OsqIW9ws{Oy/`=C^auclTATdB'9ÍMWoP1mf9#=λ88+[|8)Ο|Q8¶mG/;/Z<<G@R@ % T 5/M6vïuCz|7o. 3-gq1_~"Li%Hy(#2 Ko0,@a0996Al6fggzJǒkif~* FAW $Q<s<$F ( Iv] *(%ձ$Y [&F @<+:ir>S?#f^_¦i]Q,@ ,+s"N4ϐQDQ'sò$b0}Z UmS~uYP:X&GLX1ҜQDU& !h 6)F1֌~ D),zk1r`؃ϮF207741G_( ϝ~?ֳ_ʕl⺊<׌Ws]wnrm zjDחU|N~Fx`ɩ159͡yΝ=8ضEC b ޳M~S{>bvAjNGɋ Q ZzE͟$][\SBDLM+{lZ ;J15JL7Z r 2ȋ@+Q!]Hkui$IFHF)M|GS(kQܳ,Cleskk&YVh5IF] Q0lC|‘#G0+)Jg\\e9XM˜ +WTl5|"3'%LӤ}ַ#=Ui9k;Y]]QL@uov3cVͣ=1Mekmv HiTG~S _yϾҋLyHkvrs*N6lJJo%c* b2);ph4$SI|Bd}&vS3??ϧ>Q9\<&JL?ډ ij0_B>5799/ ?!,|fYxhLLL ^}ggSjy?k櫔M4 YFJ:ˆrzwZ 8G!J3,ÔM EY\"#ebbC i[1B^(h4ZSlmXthu0;]&'qo\Cecǎq_`TZUo ȲM6nyGUk˘⩧lmmt8x [[=m!EhOmilwغN=@a0ʒ`E0LH B咛4(˜fF%͂BDE~{UfڕU:[xo8 };;4KARv] כxmp, if8 UضVBew܁ix^sg19ؑì\]d,{ `%[W𔾤dʄ`$Rǩ(CSRTk,_=(b{dYi<2EaYm^iP\\f0#&'3/Q]q9-KX9hYsdi#G:N$,_m$ .\Z"Grkxv:g>߷ ǎӪ֩s"WE BNL!˗/gQn|*qQN' &Zu$Ŷm41ƹNq")v}2]\S72U<^B Z*Y'~r{~${y`h%(l*ҵFr(Rƌ<H@+m }a?t/<,[8~0/];;;;}fUW]0XYv/E;uե20նqyNQD1^ 4d$ELgWs\'(]Fzc'] K+($9f^{ }n IGxUȩ|0J>Ӡ( V.Q9aV\4Mjm۸v2V\(+k[x(px(Z:[$Q< yS=ҮG콘 ĭ!1oav,UHiseeU-`9W_R PbZ9 :CzxU)QvNjSoՉ8AZNV[UF #p?… o.Ȱm(Hs= .3|+XB YrB`.%& 0u-}tv"aɷx/>GHQ翤6PJq}m2q-ðTTm4M񼲩IJ(<ω28RPHjv% ^,+ߔZ-Ο?Oq}2z{+~w:k#>_]sLǏ=O|dY IDATrklmp=D!?M;\_'1tqMcwﺇ7g$C+J -4Bz&(ٚcP}(Dg9(6y!( ׿\8Nq0\_ĂVusͤ׻M }*i>iS?Ԙ%+%ZhLa޲yNRgm v7q}+g8z!_;_~9q"L v\lF4 6Zk^-gHU^o@)Z)bEkMqZo_n>W97i^G( t0Q߉*īw߻]ЛǙHa" UGYcA{_[񉒜+繼|8 ň+.OQd4[MZ(,!"* °Ԫ-D0;u)>[oA^$5.YPKQ*PTf[J E!sbC ͥj=Kt'O|@ `e3_?Kوe,0-׷1M$J  8Z0̢՞b6QSՐҠQpkׯ0?0vpw} ~Mc-Lk/ldȊ~w{$S34[m*èӣseoʥsx: CH4Hj# I,1 Gtp"QdYNǥJ N!3ޘ6;|+[=3=֭w֭[٭wl`A#t})ǢhrUJ%)&w˵ AFئ@Ȃ`|9r!r 78x zmz>i "aNQF˱m4}z!J|cv5i!٨$Qe&'"8. 7!Hl>$) ,nZKelmC$*%  5a҃^4qfE (>c4PaBe$Qi\8hG8yˑ÷pQH^T*5,4Ԟ?U*nS?z0o8b7n4L B4 -r_XV.u%T/Y{S/[j &[-/~<<5 i <1)lCQE!9VD>Z 6MLǐYiNˠЂ??ï[amgGỲ~qӭ,­}3p{W-m-RBϦTR!ˤtSt7k+){(x|gXY/T[56r-\)CI*w1j d\ViQH/P~P'z}noNgs!ֆ;l G\U.8%uˍ0 L, FBǎcc{N^G{ ²/sZi_syLEz/QrV?&^8V*8Mie 4P*/}Hq[ (r!s08 zfkf{묮^o'LB^yE662C$ZcY(tZN_Lu="^ceh])%y^n8hDDeY{XaZ7&wٰ8F4Mq,)Ht{ '-I+ ^!Q||Ra,79AEh%=Xv )p$I0E% K1KOSp]9vvvM=I5D ,'*&M~"-X(2 s\خul[F%L9s SޜaV~n$[jRU`.i@K `u`[u*qFGA4$F  >Ͱm1`4u4Zɲ81ȋq7 aGob -[[j\E^/Thz|Or0z[Nk0xѣ{/zyI_2gNckcWQ$ :i &U\ץVb68%-ܾ9|tZEQ ˒\#lKk2ecxi9YVJ* eYhKIotYaRF1yQEI|i-W,5:q5LS0ӞC6ӇyFlLm"A!$J4:-^8vmwv!10$){|1"vIVLXY$$Um .6[EKi$w+qA8 =S*h@(v)ONYӨئEЁyn?~Go:ar[_zI+yLX]8s$Y, ܓMKѰ*kYԪ>Y%1N2-\H4jMHP9Va`" I+*)r:4ZM779\r̰Sm7ٷ=w?ÌEOk޳Ӟkz^'%Nc Liԓ\dוR{"-{=ߜa+5BeiKSa2bcl>K@zKgtM3Lz¨(~EJ&8AQq MF%7] (+X1.նJw\\,uoavn]β,aav{R^uɪ,k{A ((Y^oB@J635it=ϚeؖAGdyRDɖ[H%ϯQc*% ("LlIS ҙsQev0 )rMcbpp` aG?gϝﱴx†{_}7?É#w;;cOҹs_ek*Y>ިb5l֛Zu4$3\\\&yEW!K^vضVAc8Ԙ!Ȋi`ְl6;wX/_I qbIkpgtZa>rG-ûg̎MXPJ/i=hmlOr'TmpB%EQiJ\%S#B6׈$K#%D(%y!F-"ly^"-Q)P>r2{Ի5?y6az.I{9\7 ’JHt^`rv["8Z+f ,|o9Z yy%۱ BM 좆S3~ njspק#<ep)˒KU][$[&*m!s ڤ٘$'\b&&\tp8Q3iuFatJ305p0 z/Zo5q*>QA"fplMQbiPhz[LLLpݷIAF]e'<k~C޿=>~覣]}_CPW.%F8i@'(9Wp;JlT߾q=IInIæVo͎S(aXHC.]'yVʒJ ,) ,aj9 i239Ł2ۮr*IEo0C!^^K2d)$54 \0, ¦Alnuh219g~6_I"ٕD.St#BwedQ?BrǭUL|aȗB.ǝk|/qriX6[ iq`r.q!*BXI cףfo^) (~L Km` i(JߚS:q@ĉ_` qIf&l$fVoшVa0.ӶQFVo *qqkT=0q"s)mU VaMr -<,Ů8dqƱCoq=@{Igz9ߴM{?17HԂFdk?H.I wA!-#+iY)\,b]2+8= Ru"*:3ͼy{.%^<'f7ؤxM[?VVNDx8}k8ualQR51? p},1Ze i!0-$huΟ> 9rhn&g|#]m5xEp* \C'ᙇm}{w1VLX\Z%XGul4>f T|0t8n!SS 76L{?#+];'&z|RRC)5u2R9a1ږ?|S P(ȉ(G; JæսB攅$INx.ΑؖOft]\flA)rMQ1I)-wTHS I =ǨNy^ P~&H y&:/e;e $H]4fk;Er(6g@+5-]KH ̨y$h]Rn{t,K`Yq{!I$IzSj,ωggu jHP z[eQKeBKM4B!): F֚()Ki:фP*)G~,!1axk1P2 mhz 3PT%y#3EP!LeY8Ed"+Tn)dr%Il|l( MYhش4X  ~cIlTEǂRc t;FE$Z),!~$3^ieUT+u~JYhjBCbx-ohqs y>,LxT$EbPf رc7:T?4Dcǟ::%)dn+|TN\a+qX e9di1(2CQpZu-)l2YҔ(%L~e)?s?49QghZӶUG۱3¶%A! '4M/%4Yv-ȲTd>ywAml;vSffc[߉T[R'̨Yu}&S\O Uє%dcINdq6/<.xC{sySc5jqݔ$I)S 9zFYZɉĽ˱M>O_q (]wE?y{X<#_,-\~O?ɗSTUC6;)Qw޹,yg7E|S}0SDqJdmmJ5$2 C "ܒTceccWc6N͒<ŦqlƛiJr~ rSk- %9s ĤqdAΞj6Kڟv75;Akx1\&/cjRlnhZw^9Qsxͥ <<=z[^OVcs}zX7FJؼm MlNяSZeIS:\ZL|3i)]aQިR[Nf4pg3)FmVj2wr Vdݘ:54EXW9{)OU8T27ӋmBRx^G%)noPX(KR8dzTiFAVcyyyh% @fE#XYT*4TrфR"1YVnRg\ǥHȓsݴ%$mZn, u$ qb`q}02M  ϗڋd).cwh4ro} tc6G)`\ p}ڹ<7ر9C(em_!@m$DiK[+p^kHiI8Jlv/rӁݻ )˧P^  9o7`^#R~h{޿HAvBwi%EnBo[𿿣&p橘?Jo0$/ R Pv[Y>J B ,K$(<]Zh@z9Jӑm*6,P%%Qq(MFy6:]ʲ I,V`Ix N DZT 6Ē& I"DzM LXP*Mlt-Ky.Qv$J Mvcٙa@e#뺔J7_y͍ɰ$!R,xnJf -ǎ]wG8|Wٌ ef-J,DTMO͐&h 1&P(۶ gNR03=  l]s*sRS֩VjƲl{=PI&''Y\Z鋴6Z6[4U>qw015IA5w]ν:?(W,rs365K_2MS,u$_%J).]VwN4Zx>Eض"~X_>NUZql.13ݠ"cYcvXꜫkkYkȰϿKB߽{){-e ]v:p hf1+Ή!Sk_+1R &W:|3N~2ٵo{A%Ҋ WΓrHc18( c0*c6)%AOQ4EKgh]` WB8&"ck 4@چUIG{-xLOOuJ8.v`/9ls C.cPdiF ۶VȪhEA^GWB0 6U THX ƭYpr:T B0Q+0KSBP$9I)G9IAQ\@R:xn@#c(󌍍hAJLܪ74^}'J5:GoWvC<7(D-8,Gw8t.}Fen~Buy'8se,Jg&YX&KK Q+9r͕ Ν%l&ƈ t4M&ƚ$iG%t!vOw:25za6TjMvځk袤sۤFxfgNn(zQaǎsOqh:{|#gr\Z%r#p=^8:r}W^x>u2p(zTlDMr7$4?&fg?>߼3B*֌]o.~s.o6Eļ?ohnmyGwK!r7vo=UX^^ިȲl07l`!0Lې}uAu#]l.Eڧ( )Z:-i6GY,+G8JF9T!Z٣2K\R(] -Zlv4 l[&@׋fs(=677G-$IFCֻeY؎M8 !lMahڕEԥQ s5 $mȶCPm-S p "~%ac>J~7/ ゚fIyD%txmm'q+BՖr;˖HHK%qJ/6e>iN2#=\+[?hp%2qdu=brqj^~E._cy{v2ߠOaxR'bV + =t2˫Ki,/DC'ZШ75LyAkm/9'8txScCnxt*'y;IحqmZX6eEQ ^!)1VlnSB%fnfvcU291v!~{vHޙ)gdڡQ {&Bf&BV8)JgnN^|uN*z;rV^awLR,__C܋55g~حڪjRojǮZ^UҰurmYAWO"a 5HI#EV=+Hb TUΩڭΝG=H^~e6{-b2~Ò$G5yV .c7E7({NqhmN^ @l6ٳgϟ3F1[@%ZIZc.A`c(h*Ә-\P(jC5jXxhu9qY(4~:#0 \$#dH,RB%g+-o( 677M;6-0 Guc&|0I+CB9EI{@e;&٘0kQd%`jC{arN/rēd>S{s^\K`ϞTܾmb|=_VWN,_+]n ,A{O}j7i-kz +kܥ˼܋Lu~*ϟz+9AV =66_Ev9;.Jy?Eу|>/ߪH2-7)AoBGrfAp-R:RJ&''OQF4K04wfIjHq PZbk`ա [T1'r`-9E9t5t.Y ,4bm}T`aeIn״":dQђAGt!j~OE]״W>Q kt:]Mkv5_2mt0r lEoP(*/be,Qє}B3̄+4  QFZAV$XRv=45*opӧOk.0S Juqpf.bLII(M!iű\<=|& P>CPGA.=:ǎGt66yq:kp{ދv#._PV9:q׫0?7M }UfI"pqcB#/Fke4UjMz.R4ah<µ\xG(/>{ū+8؏paffw2ZTi(,; 1KXtu8!N,66΃G)qAd7m{i{]O?/=$+K/PW(2^cTU+]J-_>E}1nɿ/oH??ͿXfwcs9--mHAܾUeV[^\ԛG|%}i8o')bf0Yoҩ}h7/ce2SEFsu{1EQ!bjvMs.cO}3ޜffz*Y__%Mt{ |$W/KJg)vVdqٝD_~yE5RH^vo}#)|Ɂ?Rچ&^GuwBfC{p keiJ&@XJ|#KS&c[|7qQ?JU´hBZ8@ss DQ @VuJ]^Ze}mV ZNYh4%V/7nrmp=[ug1 f#m@m-NK^dYBi>^Ҩ9Illtص{QCJxX.3MBu;w~?bR]o{O6,BZiA^Wxo#>㚖R F}fҴFh ~nC:n~?#Qs8vR,/pl B עZczf( eh(,  Z0>Yr~oQ~XXC552>>2~ ֌ CZ^Ά-СY_bClYm;9e1rthy׍$%+2V /rR)Mk(H"- QĶqV1R 2UgؖfJh^mh4iT=T9%' -V7ֈ/7긞,F%m49v̠uAf|rCGqmw~&T*43,\]`brZf$5V Ze0jsa ^, }2[njOby>#Ev!&_W5;ZggYK2E^zzfn>~3~/?38/ݿCH.pu~tlQJ!!D0d![;N[WEo zN[]'lW5j܍. %L4io]We-ᦣG(UƳϝ ˌ8eD(]e)﹌7LQ^F:HBxN<7AFFIt0i9.MP4 WryH҄ߧѨ+YXnh:H(Fl0 0`NJ[Zk0Zj? EP( Qɐ(ÉW,\3YERi ,)y,F|qY),(G~ \ôTkM6?z.Ixuz?'y3Y sNr|c~ǖbEnDqHtwUh\ףe墔Fi6~0hO&ҥv7ѺK egqB7l|7uVtu vAdi}9p0S3XKő6nO<=_ b}T+URSzA%E9iv.)ӔՕ%Z4 gma׶Y{]kWO"eWsaeg*|F_KsdO}9"T*SO%ߪɏw݄kT*%ni_Ԫpb\r=bfc_`*Fo-46&$’diV9s7 ء9>{0_WH hq2Vm0?6xj HrrQO=ƾ8|hHAZŲmzN(IR[8Aٹ]i*aGE߲Eǿgi k`.,")?NopN;NFkz`x? ;gٱkVdye<\4QJ`ن_5 iF{E ȧ4}]ԴQ^0aC[2ohEB`}tAB"9RMrzEp yIR@$i<`y!J)QdΘ^Zb@,d<<(r`ۖibfP MS8AJvB,i:.RXheDFYBJ,[XeY Zv(Kι-H !$I?B9ih+n_ 7`]Y3\pL%qja˽6 iƙN23={{^bfbGY[ksei?cǘ;v{H@_o>g$ naZ L5|ۂ9awycwMfnW*5v K&ƙ駟ʕ˜=zRJh #mC)e˕و{v`jj0Po4Xr`7$i ۱EQh:IvDښQe~~{qdmc~CYUfueXZ܅EWWx.c5"TYb%vimLfOs&wR/?.Ķ }]^\ҧ~}8c.Rg|^K?_O~+u|Gnn}2It3Osɟil;GT/_?e@#gsFi(X[p¾B{+3ʪ&ro x19=FoXp"JP:<4rA$(UQƫdIIZdT&Gݎg5Nv^cK&09&#MQӻcKPضiѕv<"lE(˔q:/$Ir0tF1Q1T[TNPJK\{$ eYovF 2ʲDjd};s_p\(ضE\! g&Ovrj`έWPjx!4hG?<vB,u7̾nblb;{6:%cC#1YQsͳ'qڋ-G~'6a dηy' Nq\w&r({އ>Kn^ Byr_9uv ڹHuE3^XLBR)`rjTT&J:3tz~`l^R3c9Hi,**"Og8NrL&j5gsKخ^Z ټizJtm,#.~iMmcr.6@#1ި_|v-oe r~vs,fض}eL]|uzߣr DZr( 3*2gyS i OS 3s4&X}{@d:}A'^u]'TjIV"JeYR\\ʭaJbz,a-u,/ k =ԣ2xge!4 2Xgx1T H)xM >5QKLFNt(dq6}YfX\Qò,$aE߶J)*Bh/u\m$#]$Z$,R#M%|=H5H/,@˜8vpq'}RvT ؽelJk/JX"]&'-[0V‘$93J\S* Rs.(-MsIP0^߄PfŖ{>l[^]jLMΌo6xmbyn6V-6EKcy/埒bxHm3QyQn>N_|'1$s/֖\A9zYs] рw:rvɧen8Vw<#xwF()𦬓'N㓟 ~~uG>\FG9~<7R p]pSt!<<˫+; laλstZ#OijEKI=y ;5Y#o4 ǚ1%’O#%%jOl7J, "JV23Ykg{Y ʤ0Ek/~[w)1,CU׵ O!$_p]Q A2Z\3 }^ZFwmƐIZc X][g˖}7n'o,}jǖ];XZ:irYeaKl46iuւ?u],):Y[Ʈ$I#Y\^c})Wk[Ol'>06/gLo*q}œ{gN=/z)>p(lݻZ=GgYj|®⚫W8 O;* e.tTv7>O#ISmSO=c S[KK^{`4KCO??ț&ahagء` aO"<[FxM&~t}۔6*T 2, L6YZP.tM\88c,1 Cg~iŃa1Dz}," CCX@FxMiBPOli>4cmyph6A`b\' ˡG TbNΖEu땒gƄ8nAADYjLIӐ~ݻw4RF 5Jۖq|Qإ{9p!;ラ#^6s-.bF`` A^M}cwЉƂ[059ΑO|Cކp]FUرHf"c5ű-29iLtd#-²?LIJc[Bfv̎mڥ3Aݻұ}L0lpq~=w9l]NU={`0x b!$I|J/d_)u ^ 4hZYճ⋔eY]]effKXZ-)8UDAwg&X:S~wMoᶛlvÇQ*a֝#V̈́PU$괆?Yfgɟ#ޟ?r5˦KͲj1O'$CKeLf( )(uq#gǶGyFveHEV]k; ) :0i <V)y. ómˡqi;,z(%b4Gd!BlB{}uMjIgd=2ieȆq<Ȱk^sZ15=3Ү}!ڳ]pN*;mC<78H)Cc#T Ze$ t-+ZulԙN.B2ٳ {Yᇽy7+3>ZvAF\F:6Te9Nx̲ib4>HAy"nX]]5MWtfaJf"`  #RObɐ{o`=i>҉)lٵq1;}];vuf\qMn:/v$.$!:TJv>Iu7)VrN<řr-޽3sg9I7n>G`;MeKr)J'Ha<k-IYT kTkLLmEn78XY}V}w)͌;s|.(_Y،=u:]^MI}Jp{o qv]u1hi K=xVd_R|-|.ٴ^*}¸Ȩb֫1luQ$9\gf9p6N,=O&M3\'u C.iC撦9tJĶmֻđ"Tj%6'݇2UQ.z&132й-h@8(Crw"E:V=ל$E˶M%]BNq6ձITbJ`OMFI|ۣ J.N H(IXPVq}$ [Jl,(CX)ke)!A0E :MC) 5}plDȴ6ِYB+)JLM.QtplgXk4'M3cazzg8MGX$yZڽ>JIҴcD"3|Ye=s~M\ =9Cj`*rV9b(ŖA%Ϧؤqבi iTj4ygDm6MV0Uy+]=zŖ dfSȌy걇y^8y}KSJ6;Cten 3ݾWNҘJm{} 4ՕK u<}uj!,["(ؼyϴ&Z &'6XfRyIbи$ؼy.z{{Ǒ.H2X. R $Yf gZCTf_nw?DTFA@&[JH0Aގigd:CAJAEKt0zTt]² 8#?$IZ::C4$FL[ F{A< FY%g6pˡAhkQ6MS4 R`6%JzB5eX bRC+gnyo[o}mit !a_}w㫻x^L4󵨦)0RZMVfo!zLLL0S#%:˸O eL0*Qaq,G^8 e݌o`˖]aN8l7;y^ZZAK~7} ;nXdsb9q6/>Saa}yRRiac>~ VIO v+1bW F-^ 9LyH]|)馛8yh!h]mFv)*iJ#b Nqj(*He9ăѠd }yh6IuDAi&_caa V+2\l6y(۲li y-G%a<Ѱs(,ĂB)7 MhiY.RbYF0 '?tU<7ݤ%QD>eZUMF54QuMa0\xU $3$Y2RT} ^iu~ZkBu8Y0ݧRy>X-$S/uΉ˝T@VW׃%t΋1%8wZ(_ jM\:ozPj6MQ'pSǢT걼=;|1wzl Gq*?sIo>qo :+L ~_>f֌w|SsEG[۩MMg SV6%^guG7ZK3gnc \}D[gS:JUGl۾"y=6^|v9Hiy)mle},BxQczzK +H 3S(XdJa&GJE G|I X^Y!C;k魳[i=BX1A$I&\(iduFeWW(:>j\d)A@\a6nOon7L R09ư:ϞRޥK/ɂk a1} &@#wmaXWaz/fqquJ~L>޽191Ioy{g7lK\/{wmč{(ԩv9 ヌ`9p-vNnpϼ@k}vb^9kK9-={Ǹm?=Sl}c4[~:HgiAWfޘ`Ҳ]4M?E<pٶįdq q]mH r (QB2LNNG8)lB7zFӡT/t޺ɣ#pI>)P"6Vbv҃R8Fgٵ GOw%N3ea XM̌&?x1KXFZhƒ~EvW8C@$i:Is k.GCax*$1JiPRd$8MV#S<)zoX%(r-)Y< pMfA뺣sM0}ヰ IJT}0$·|cK"lט*NJG<5p n=x?kk o^{jè$1tͯ} 0|ѵ_y euaFыZ( Cc! rC}dN x3G n3GxidjlvEqKk-^<cM_ ~z˫+S^V7^qs{Qz/>[Z6fy5ɿ샸vѯ6v6/ j*Lϧ?éUkhq=<&7Xw%6}m#_ ndyqwz7җfmQޣȑB4Se lU \!kJeYEK ǔД"IRfIff6/ŴZ4 e˲,nϜ0Yx4KǦH^%|Y[cVR{/nB%#šal(}m2ޠht% ɊآhRX"ϻqLRJbĂY5bt"$'M3<i\ƫ,w`-"3^L+8-r-<&qPg2rVMk-]30MxgǿKJwNt$2ހRP6`4.퐫RX]]\2g1V5r9ߏ}У61FY][CS.U,gIn6f8+%?Te8JDf J@?gjS$II>AO^81e6e*-T.FqGɮDȘ:\c,aai L,-cuQ*~W|%#9rټuwv,ai&G̋ƐL#MvQ_^B">C5R]0K"52̼` GuɅ?}QֲVuꡯX!W\-s|ZY 9mLX3[>tsn`rzy N ˫Ϻ,w/6ww9q/7񍹓8sY6G~NnsӮn{T 6Z ~G{?'E˽S}>{8?lyp_|gWoR㾛`H,;q#~G=i={~s|eǖ1ˁ>V݈Hb"cZJLGMY,̡RM/{;|[X؞Zz?sd|b}/>an6wr>/p;7o;;ڙ9;F6DZ7S&㬭5ML#ຮ+Yh-FQ\H T2Y?RNr,S$I\q;ضKì3]fad8#MyRA.|lt.4ZC>7yJZF%\jڨ49>>N` Б1X^ ]Kz)J߅>Tu|-I#*22i?"h/agL)XgeI7Ip [d{?ÿ?{+Oo c3phRpb0ϸ-g{?1[-%L*e6cǠ?ugY>,ou j3mU+> <ɷ> }w3y+^ݬlON1}叨5N-rMxYgy_s2+YK2v!2nr55jшٕRJZHi3 L7_S0ڭqejj ׳HjX&N:Tj%&t;m甩6 $[wK 23R$M ÓXvq FOkc_bm~z~@MȔ FO$+wN#KKKHE({<%I Yf~<&b~縐 \,M_k,F]ǖa EZʘj$Ip]~K#GxwyV\Ϣ<Ćky5F*^ٺ2ؒ]p\|k\D8*w 3j#pIGְRwSg,Ξ%4o !mn'cӯ.^8oo{eeVlJ?wvM0!'Y@lb~y_K_~S8I_s;|-yqپǷN)p8Tؽ _| AezwB6$kqss?͠_~%z˝+EoD9yxe$S#.e/ r2+Ns *#$83ZZYAS8t{?W#LN̐$ cnn^7r<1gYz]=zT5c\ &ʨd}vY(Ð4qD@܍󰄤^'S)KD^邓0*("Laɬ050KF,!NM7mK..[%(mX(h۔5'TΧض4eٴpA->c $M -z8Iq vF!&` ˲ ,2Y>++{WCl[Qu4*\~ڥzimۨ,'cfXk6军9pQ4-SR! S1Ba˂K0yMRa5i ㇬_15Ds9svP .MRW?9DwŽY7bC+/WZ}bqaMOrR݀4@u?&'fl8X 8C 2Sy=tmr6cI,msAR Cy#ܶ30?4}4N<)[XRf$q87eVٿ"ڼl~g.2Ƕ]_{0X=u- NG-:{GtBo{꛰'{[o5?H8 }RߎF?'˱x ` U)c}c!oYIN-sbϻz;|~?3خ}凇 tFf;Ht5,F4'S3,U-K-J3dISM#9o'=ht`iS8U(wϽ瞽km%'p{)_M@-Vmٝ[S=v=Kd:~˔Uwކ5$-S_e3옟IdٮqDuȷC { jڤIJ0>QFf4~曜X8)Q CE45T'LOO$1LI1:"(KR8=3.qǗRdx/1)DAz$&Uɨ,2fssQJ`,Ib,'lD Y5й%揆R V-Al}٬ql#ql6Oh4j4-׼wcnwL&c% C($ъ#yBX(|EQ ̀N[Ha2,XfV|>k;d2끢C[KjmQcY-@l,i^xn\FZrT4b^ 7;^yNvIs P`\>6tIfˌs07տ_U666xwLOstXRqNՃN ?h@^x!57U֗t+R]%kKz/sCwe+j1;aqqu ^]7 ZYv@cϱ TʔNt|VLPCz<>*n\-M,}Rsieeqp'3U6NRKЯ59ln1>UJsO};v>~mҍbاv,sfsr9܌OVy}ao1HpE8E^q\R^Rbd5t>߳O} J`/zR.{g^$I"(߾ a;FnGV\n ++P)c0"$j42LӄZJ4BJ"!Dc۴ˆ84aԞkJvcf\8`I\&G6#X[[Vӡ8,j5) \B@JYkԍߗ $d,Ql9Q"m (\uLhĒ.aR.,B1 *bt_odn-c+wj ߟ@(bH@:V ""N=$nC'N>~,--q~~;fًKڵ]8=B&QJiWJw~|EwjK_g?wc'y:L*&eɋ$Yʩۯq"v"fnᄉȅG/"N 7HE8ċgOqx+g:feqÔO0K]';1ɏ7 d6n84^蓄 =zD&g*Osw'{|yvލu,bj g7Z4܈O=FASn3l]:rM_/ՏC{mGHu<󷼇o\Ǧ^U0VtyJk W$*7ʤC ۺ_#s~1Aqpi}ms3oi۶Fcu qUWDAX LH;ŶL%RZ$NɸIF/4x~Vc@WM\FkA/"3YjeA:RaX B- "c7Q.W;r&^oP#n[aT#}u3[[J JJG8~ ٮaI3Q\\zN?LJPTHi$2KH|öL% L4Ab8w]l&)6`;8m11QW^wBtl\7H\rBץ^Iw|jk2:_g|jyMOhFi5۫d# }%Qg zqykSu]ji>$eDb$,. ]/9}[B=KW~l6K\g~O6ұaF^G4ׁص;}t 9srwyͯ}ciaǞ|CfaLqSBBKR]`bj鹐~)g,=u[OW8z+DRcDs;Qq~mvp5⺞xC}v-;ο׿x{ O8r^=pjescck2c~,<*+7u?%W/ BO\ ~n۶~`}}8V{1*RB8k ,עeht]tYR" Fh1NEBX5Cf#}Jq8N1(˒TKe8 M/JIK::&Rxx9J_5dZJE=$"Nc|;{!*4L@,\>yZqR7Ҕ,v{T-ˣ00 d2eZITJa 2MS\ò%ҁfNJ2iv$+l@ϗ)\N˄ylu](2V^F^h&q²'iP5x"N}dw AVq2ȥ~+ukjqBPo\+"2-9[¯xmnSoǟ֟'nS(?#<#<8- ?b[잃B/S{_J7Owp&K vme:1QҤj;hL g`ߍ~nZ6'$"sSo.>n0Ω,O<fMm4.lբ(ΏaM\ʰ^[JLU | `v͉Є]Binc'X9>xzr/YtpEi&*vLM NYf)ލUri,>C ggџ,_7C+FO<\O/8{fLko $S,/o=Gs}{{.Ү5h;,HJ؛6WwֽULA[x3*K9C>'nؾ}l /E)vQIR$Qt5jmn7${f h!8;wd4 V={vZXn}U6y+(ʮ߿o뀽-ͬ&5Vݷ헿?F驪8svA۶]FH]JTFW[u 9D==1J2VAbKltz\\\"S$oټx=}l/ -(ry+aWJ0ly& /P*Xc~~^VNcя25ݕv۾i_}zӌWw &/s>Y/O% wx4[ZcuT 6 Or|emEn> A];Opl mGXg^C6hd{0ԛa[b_Q`z8C&Nh/|<`t|iud<v I:r4Ʋ4v [:K!5v)l ВI@ LԲ,סPTVwК&cvC\߃AP$WȒ85V LVđBLш3PH6lְ& i[Hm”݌qH LM]8"c n )%ٜR QҰv xhAwehY66R2SeK 0jtp *R( r`؆-dQgR81C &VM/0eYƿ,NB355Ec{x;r ~ F\ȭ$bo:=q bYrJJ~$²,hHSE?D;ػ=ʥ5iGTk~nV uzhb 5&~ H677),ndD\׶ n?3u[a`Tfy2 nm0ɓ&NI" clq1~BÒF'4cKѤ6Z@>3R;0aӂ4t:JYT1i IH)5n)7ZubʾCkxqBoNJ;7:W3l6  u (]5~Ә(I VMvug=sʯ OT"M4jO|Š>=,3eh.^?7WܶG| ]N~R\ DMtnrK=M5}oFJ$WN6`01NG!Z/Xd}׀\aSLT Wr}[ٸf f讛w4?kབྷluuA6;GYZv&SUT si-1>Se]ۜuȌ)S̗Eqt 23B G/lD;]T(S?RHaA܌řبEݻۊ)`J,$xHS}&3$D{iqSgrȺb&7ƘM0{%.=^x ,Sf:zH!D##߬שǹaƦ=& 82G6;f6k{N`RE;}1_!>. NWk%t]F}s985"$$;WB#:IhIڭ.] 8X'PvDqLpi7 ,/R*a$6J'vT-Rڭ *(MP3 "D"<$q":NXקn |<$i& ψð?^MScjz}|4 2bϬAhxGö225풄 E&!ɐ-I:˫ckK"S;vaلH9 #O2DIc{)RvL$ O72݁lzY5`䆲fz@')T:'$ᴰ̆ǖHCTaS /[˨\66>eZk-8#3ZrlKTWX'?AK]!9?q>{E1KG)a6NqdX{"_?7{L۩э\\'KuۡD\+mDcp˝)48vE%ڄ@3JCxh2 =7Y\ZU$u˓ʄiO1ThcJ|jmz??/}fŕEA}+=6z8vd3}P4=́m9>>7EmnV4wʢUo\2h.dGd¥V-=. ;/fyc|Lw౗^"'؎G?vl7\r-, RiPʞī2> ~ڭ_uYV"L+*:>qaqTq@"q<K4qQ4Rm 1j\ZτDŽADqBR׎j;wB"q\gԤ`͡j:`QֿG[^W0LpIlޒk9.,nr,7|Cbzƅ'ɦ܉3U.1[M9y6qe&}d/K2[-"K6Kgŕe,yAУjh4!Zmy'xsЮl˞=9w,رc|GSN:Y&("C {;O}C?͙q5T mQ5Uʮ]ȑ#T_r`>Μ9C`vv{I'uZkmAfɾ]MΜ;E47Fe\.G%ȼ+!Px&5 #la[xE@1qbY-ޖe(A+FB^7L֨T)jSRV_6 qj:[=zTUP.W &%md8a@{8eRla$B="Uzd!m -܆^e]q@v7<1)hW0XZ\٫^NMsſica!Da BI,\':ڃ??.Q.\X:uvTFvŽ[)沬,-jpl !"Eg 8&*cd%N8O/ۙs;ƗM'e):q̶IJ ŠP[A?8hě^*tetYhDߧEnY88+xW :H}a Zms!$I(tZci#GŞ74c <;xgYXXGÀ;tu'xiG&Z^o„=,/Ը\8^4nbJ qK/Q.p~{w))Ɲp/3Z-:;Ǚa"S坤3y{O|n]۸H?K%ꥆD+<QWXcX112f1eR8ض$QDQV)FVT+2?G|' R&,buOZQo rpz=iYd9D|VWWi63Hi:2Z#l1?C ,m"݁eJZ)N$͆#cpaIT1r0 2׵FCvlbRXRְ-f5D\9RrzH@jÊ]\BbRJRLIFRon|w֟'fFޱf7={c(R.PV@n_^, 7iJASҠ@䣜(J1[ J''nmf7OpaN]p'^3UWu=?^ck2>hlvVWij)隆7C{9tcHVY94BZ>K5vH'kQ;y~Te~ۼCsw3iCm\$e&8[kQw:{;D~Dņ'^|N9zs'Gy{dL|C<9PJ/iq2=s?H ,KiE-BЫ{^1Y7 sߏe^ xSHu!,NOWtWw^~},Ǝ8Q)n"!gO/ص{?NcESQkS[p1n9cbb4Vhll0[RXT_]IB`2)L4(sߦ&r a<"%@8 z%ÄTpPMk 5,^j٠tc^,E閉N]T*|)p,v_8П"jop,I|_IdNM1d Y:؂^G*1t=i G\cPGZ sŋ'9r u vQllo_|q%Dz'"*hK}ixJ:d,zn(og߄͝gVvR-&'V6x!)Y_|@)kZ5@ܸoxnq"Ma#qM7ijw:^xー O5}3w`{>KOk)15m71fYit9<9ySXi=3!?aRlssOYY_#Hؾ?C71G1JA۶_V_ m-%^K%6RظYHXKKrxzH)AJ$):MA(lGb;rMwk4iҪ3exǻ;xmڹfjֻKv.pӡ;RvLQ#K',͘O"&}T'F9>Z}1 ȐF@Q]XW76EQfy>RaGVY~VR Cb _W4̱L C z1q9a&-Zt1 Le|cn>2C*AW ]&dQBG!єF91zz7?ٳgi7[+J4/^IOM!R f1 ]jff͵[?wxW9v4x/bZ&,p2O=\,23;;KͳtIڭK{qgU*?+"lt}/c:xkB<¤POh993-Id)0 FF`GHic{>Ynϑu+%Y h V<%B)da>0 8JI*0|#H*.x:i бnϫU#qH%ЍjkUmCeloo3?? W%TCb~~x|PnjԾ( 4i:e)abZ:ќGVbh:E^25=m;* <%2(.nX& }> vJTE 3t`gw˪FOrgfn~۴Hc01L<1iOdv.,#PZMHOeI٬{SLDQu,[Dz tb4ckk b_{q'ƃ̸M19̴gsWwCܥ&߼եo3> e~6ڔYU-҄NhJk:E$tM4PWEdqq8Np"mgiFýTJ8ï7)mPJIXChBv FٸF`iaf ,LgΝu4'#":nj$34PqSs=ʢ${{L̐aYVLm®hZqY)@qRrHOWՅvoN6oYL IHKAEßǜSqxSR`>;mu~;+<}Z ʼj&ie9}Ӱ;L+]zQqpF)=$KſWK_C_;qhyQ\~S7ggP}(~m=W1gq,GN׮\'Mv¬Q =+Լ9\]RrExjB&(!%s5p2ݙG~tn\gDvy jYs*,)"Bd*IbCӜƶ;s(C}ty)joMXt 9E1fz#J`;ƭ6?su٦E8|O%_l!N,g< xF7P@{~^hxJ @>i$qCXC!aMVhBCIEoiUDU&8>EQEV>!5FZHYY>IVIEQV +#vYLr fYYU)idYeFe_LGcPJk$).8$S|#IR>Wax 0 ͐H%ф3遯<|Q('ЪJ ~p0}|,TO0vфZ$YDۍn,篮0 kUU*}(MӬX8&/cNt#tQD*Ld{ AQ`p44͑Ji4L`x8q\ǛJRM9ڎaU@E%R*,Ǟfy_^}$sS 'KL LV"̉1zY昺"RTY׶p"Zcǎch&ׯ_Eʒ3W8} KK&\&NwY}0hOOܧ>U5-D_uX\r^4SSS 1${N&/Łzl?l~w{Gi~$hIUit.wwX0\4`0 (ܾ}컜8ucN+aә^({ W@"rxl6Ґᰏ5νp O+\yمy~?SY`o(>bߖ,B޹2~g F%ݡwo޾CZt ׶1R"+Kٓ NMᙧN6mw{HM9e*|4 x%g;J$ıx^h8fݡ38qx#Ӡv1tsnq壛y3355a=z]d NӚ5i+DWlҀ"7tLӞu4F(,asmew678~|_3AݑbVe  #Y&SC \}Pk$MsZ1ɲgo'}xUSEj2`G93J2dahxCF(Sb:^̢,ЅiXƩe9,uIH㔢̩[JHIJ:IqoW._̭WwqO쳟С#lr=|#diektMK' da(kDť>3Gşp[;[U'n=Dn}t.IqzlT-V(JhZ$I9QMnVYY(xw){)?{P4B@WT RaaYMrN/۫ 0m߯l+0K\g{gW|]44RA^^X˂F|፷bwcp8Ǟ׾G`;VS`HVj|P F7fj|g1?H\%t~s;|sA1°u&i09+kw~gk ϳ+PTC 8{ZM"Gw]b~r&Htlyf5--a0lRL՘jL=q*(լ1eo‚swȭg`zQ e6 a:`^oh@0LgCwHv״^ qj{-bܻf f ,p8CMhET>K?a8sC߷JKa &m#C04 ޠY9aDYV;Ch$EmԽ*i<) *Xo)IS, ǴZlǠ0$ZPeje90 4д{$ie~0A;.Ѫߋ\NUU%q9.Xo|7_o]._e4@W(R Cg0`[>eklOsC\|oO[h<)n o/4:.~FZÇX^" $gnzȸy]#gXl/DD<$I`0b8 HZ}o)[%}𽛾9 OUkNu/]UBLZ.YR:MrBtڎB6Ԋ!g7,So)V~^emmc9v;O=\qb8:zX{G>bt'x/\c^?O_xσm }>{*e 3L-13.ޢ&n]Ӯ }r3pLɆwLo) 0+,1ۙ%G9A'%OSo7({{-'̴fip-C'x6qwo";_#Kg4pEh9adw\Ѝ[DXVPꖮ(`wSUE!un]#NB/ӿs/PzÇs mۥ՚SLMM뫼ul^_;b|I.߸Cu|9~85VVVyGP 8fwwËGsi^W/0'cqy\iYoz??k_vvxG٠>env9s!~W7G/ȩ\rIj~3|ü9~GELl0=:S S ƭ>W_iQX\~)%O7_z*mXrIzEtAR^x/y+XKض$ Z}x|`O (2$2͊㦙U2 EV~"SR:0E*5jn",1 m J4d!ö"H%4ZiN.o̲t&VY֖ݥfŸ GzWx ޟ«ݝ L/sGIP"%kWa4ݛ?`~jf'j7h] 7?z6wcjEaay:;;͟8{⳴3\LXަUoru>째|-:VŹ-..{*`FjUVdY2_OcR~t0&~6=i#p3UDHHnLќ?DkvQw Gc㭷xKFQȯiƞu ϧ; P$8 ܺ Wigaӿ>/gȲ,/-n[SEQ?bXuyqċC^yu[)OsDWn#ϲq6^HinV㟦f20bvkwFVˡ(24# G5Ew%xGgjB* " IDATD+790 hDĤ9Y&)Ki844 戗^B+td> ]XH#$>'Lx13પxWTP]BsS\y loo35޽{\]ēO>ɭk_i֯nokㄲT<|Q>ilmoi(\ץ"U["VWW9y(ux>e,++q;GlllDiV'YF)\~mΝMf: Viټ˷'7y\]y-ֶr!t+yqa.!˗/zw*3=5`,IP{ W"ÐC,/QUTp8zR$xqc6 bz2a@ݫi*͋/ʫ?S(JhkUt MGU;r5uzR84! %4׵1: DEw< 3=M'逐I{qLsQe_}5Btɋj2ԯ(Blnl!?8RvvoE(^{g_֭[ܽ7o٥Voq|K_C8#QAi6p\wphC!sťč;OƳxs6]Q.rrޣ!XL;׸ygO> 6<6 sxLF8Rg+16sW EFda8 0bs/#|$MtE"f,/7oLLO$Nf?4mF&rĮ9v^ˋܤsޔ޽[]^Flv >!K+8m$AӴINa_s4hj]2 \_ '^1o\ Nji6"Ɣ*C3 JrE[)Ȓ$3۫+7.P0@f wpbŬt5,bJ;~ ]Ǣ4C>Q<\Fqiכc 4)nޠlUסN61n2z{!QQTx%mClۜbE%II㑕!W_`x'C4BheiUH+aUTs ¾le>jEu ӖEJD%2J!e&0m{H&crQQta4 yZ'6Bԛ-J(a[}6y#O8u4{[iDyɏ1ﰶʹ?e:z8N褬{oo[7os(B ]lGñ] mܣ,./qqfR9w\z ˘jq9W6v )R|8u|8 1E$UН*e=t"sV5Mnp.n 1jq mFPg[BNT4GkXYY[4;DYѣuMI]#n08qtUiR QLcYQi97X[ߦ:DAN<-A!s~_cүі[vq /SHKW ^~ #|䙏rYt#@)I )Uh}0VTw蚉,s,sk]תQMsa"<7W}P./;[8E`ksDE8Qx8 ')8 jeY5fضNQTT.aa8ErNCi EJ7`jf0^ (ˌnd>PtL]" ]CibdȠm[<&ETǡGKIAl*RSځ8N&5vgzMEa<^spq 869gWYV 2uó dQmB (bhO|WaY1ߩjDqjDIZM,)eAE MVƥ֙_&F+pd7HЄOvDJamQAKB]\FסI6a]7Eh.qRyrqb5L#sP>05ϴƤF+*;F*.1anMݫSʜ<#V( ۳؞n $-LH8J(upHKL`5ƣ -,l[%A:4YJXF)$G 됧$ڠL@ $2\:hKg#4A)`l2dIFD: x5 E< &%Y:hDeC3&"hZ`*4YlQ)A2"Lb|_j(D1iaM(sEYśs}Ҥ)% q6mD8BQ!q"9R:mC ]rl'iaZPlܺDя{-\g~D4&frYz6ko],K|. d!IA>Ϝ}|'VRhkZ7V8k.n߾4BCog&K ]գvi۬8iX_`u|Yf\tO YX\%]g tP°t4M!E]E$ +V U(U>*ߩ~(|k(c&f1&5oe'8)_H3ZQ?~ݰhNs~-!׮]ܻwxv4 $agc>˙Y*yUBF*`><>b>"fk*p ]5Su6dkgșsdϞG*y?6/\آ Fw&Ls{OpZJ.k?FY!~0mjQX٥CZ5d{{k_" "K"d6f}6h5l#MѵL,C]Kmu`s+bwkMh:5wGO硇qm#GXv'?Sgk%Q14:a(#-KzlG>s,'&S24WBK)/bJl+m-^]Uy޸7p4 3f[W\AQaZnm g^s>EVpbn ʬdF;8VNkU$$ѵ\6QR#jZbaGKB Ǚ#'|۫E~ /M Zbv+$a}֤=Xvf1 oBZ\OBꃮw9PChiR Ӳ*12iV;m9i#}C|Ydy!4 !$xܬ0%E]3J)p$Ip04j: 'M*@Le.Qi%XtKMtM!*qAhUĒh(9Ƀ4ƣٙJ%Kn$12k?e*ܤ71 {`Z\ FX,4n$).\ -2ZmZIݻX#֮ԩ㎷E_8åcVs9ifp}+-G.3m$ȱB.{q菉rks?T =Re-UCׯZ5^8VOqϠb6[6/ɋ1* pR]D`X9&NT~-xd<R @k ZX?ZJ$<9-a+s엮PUh,1yYJ"<a$A ]f( ZeqVC<'I"pᦃ鬚n8(-2@Z,K5R h4jm*J=GDW%4vv㔪RI%ìF0\#Ac,˱V Q| HӔ 2RTAI1<0@*,D~)%Vh6ZqDVVhS30e a!)ȋ! s4_z.Xp8X0cmcp@wf37h$|41fYZ֒#gm5cnvk5kY`0p V,"<?Ф" CIEZĝ@siƣ"XFF야Ig*!<~db/_ CJLӈZ~EUbE<*g*mMZ͒Ѹ@xAҤް^0odya!͘|LݴBuqٿuzeeyΑ#_&M^|4緿˿%O~09. |;}ȇg=_;{{|kOql#?ٕkylW#i?l__f+b-1?emN1)>s񘨻HYDְ8(|" (G#RÝǗX+y ZJL ox 6׮px϶K%nxd` GE$Xh$)sDeW$DS ]U[ʖ,+kB?1 N0DQT@Q(vY4BLmDYѪbzzuuO&QN&X!ʺ!)%QyhH&T1@i" ӭH|q IDATc5RB0UFI)!QUcj,o_Gα#1E>ʻp FPE-(U!әWk+7~78v(}@TGmű׽K _FxSmoo[ gsog:6x؏9V[|'Ϭu>'[C\,|r] l%cnȡ/vBC^gyU>F d[[xfU2?W/,-NC9&$Sxf9vv@NSx;1=-dF#uSgʆU@ ,-]FYvXR6/LmRTV9oDu4?R#&^휌(H_ew'IوQ5k F}ﱬs0(>I@X ! |*mF)/[J5( TΛɀ8o8t"fcCl nv|"3jN$q^IY Z6'Ɇ?)978UnXXXMozw:*>21ny_5Bl}c{?gX^^]Cbo=kg8p].?z ;cOhMطt?v~{I^Yw*#rQD ܶc )6Jm@(ً3ÁQ>",`(ƽO뜻r!iaxȐ+/Y`lLFWJFP̰yRʀ∬1,Y+#8 Ȳl"jk6 ivwwkyFݦ (8 ET;C$<AOY82 B#MGc@ 2/B @X#$4rE FqSywWa -I hEg, z:,P@Tn|i{S8~WxSu{xg.<ˋfC.B&P4k6f{M~Qȋ :M mټ-eubŅy$ zc 92Y;و( ːoFT%ۄ4â>du}O%?uCd-ZT*4aPiohpȗ1eB%h-ָ1- u^"ܑppX!\A^x*s|AO;Jx0B V ɾ{R BRc' #*#0h8bii7;#+jA?qu+<[ČL/,qÄxF{]vk&*{6:!||N k<|Ɠ!o|ꕡrN=ܾbǰiwǿK+`B"`cy i"榧 CN{y#tMV.w\Z^㙗^M9Jhkcطt,+̬%S &G،(DK(shrqAt4vTZIӸvZYT$#FEP:3ǐ3|"~R m83vB&2+ZGCPHm총CY1F@ƻ 8" <( 4UhQ^ i#Lik%[:.'N+zmk+hm[ڵ3<{dEK?/Zl d Mc|D*KgQrɆ>78>qdnv+V;3MЍUI1p҉ǭ= {wmy9O;~ʶU[1]]S5aZC1ǧKYC<ɻ???O__&/غzCtsg7:ŭo'-kGYo<[ol0w'oaP ~g.~4[tB3Xǟa 9/^/on%6GT9hљܕ“7?evVb=RZ_y6xY +K-rF`6=x!y9"jlm󽧿 3De8tɜ&"?d#U yt.U_8}a][UTXZk6I U¼+<=,8iE Z;Sŀcʴ/<! Ct Q\F(fF?uxH1.E<(G9BI S)<$i#Ȋ1QL&<Qн~?RLpaRJ9h+&4 B$n&MF8[kkQJ6 Ca,$cvQ0MPB|Bƿn˅ i25զҖuL|ck c *eDPKR HУ )]E7x;~jdH”~O|}]ݰw,bQզK;- BV'$auu"3Q"T;&ϗ$aHGEI^iLw=T%0Z4Z}xghOyz!a 6R1[lnnv=fm|,.h|ዟM'?H;:e592M=i4F#u,yE7b~EJNf4V ?ΥSc|*Or6{r=2,`˒٪7ÇǏq}}RJ5A UbӃ>NǾԾK/g>Ν;g (G,m^Gӝj_x B-ш ߌλ>.~_|R|smr-iFnorq8yT`G#>'W^ N2=՗ȊЌ c6~0䑔[Ma(DFwz&}o;" ;.1=O0[E^1|<5J h϶ /,k=玲|%._1x=wťKhZSj1 ҥzaLaT~R`f^![&cdW޻FRP FTSQJڭ&.?ǂ7*ʌ$I&iUUQ%q~z 4;t:z b>a7Be]'CvwP\H;q_N?)䤿0 ff)rNWMJ1C`ԯkW6Jcq#ҐHO΍֚,s᧞'&￶~_\AĤq 8]182y[ &=0*2:(x騶6(,Y\.tƊ(T!V'yY/u94)Yչ^M:o}[9w (UN@V$4m'tn0t1U]l6iZ "|A&:{i0Jhk&uAQKc<)3EVȽ?q5W21 z.(Op!BWH|!( *(fҵ+R c1H!oEAV"@3Dx6 bP)(( _C*eOj)|D>񅏨E" J|eՍE-dÂf{1Š  W9qNj:r\{UcMIt()\['Mz } JtgZLMMsyNrK,.g8趚n;ыB[! Ky43<iatEosf3ưKDQt0ݢ3$ EC/χٹ)Lq%;ңl# MrLE.ںRo| QT%c+d006ڦlrI"|L7eս=)5e+i k4X& [XPaczś<ӌG90$N[EEJ 2^իWLbr~`!gUUX!PvufUE$ 4XvcA'$UQ<I;jObZe}LUh||2pldIRBUMUё%Cyc/1ގsfBX9ƒ̱ZHxŀ{5ʑ+Ɋ1 c6’1^rvtfQeVW ur}{?ݙo~O&/_fvv~oHV(G&>A"} K> wz%S3ݛ)vvM,J+ZcLeZZYDgcvwD s^F z}}$Fy$ sA^eI@J(UA3If^:{ )" O:/j1ZMln,,,[$.hՏI[%x`:&eؽ7) RzX!p^XTceA $VkJ; []:M0Ǐggg5kX:^%\pdÁLJƬ2޻ǜ;w"x˛#.[[Tu=k 1k׀]r$suFiz?G9q)nsw/< %';N9ʕr gyo}S=K1iX8oe iVG>X01k4]x[$N,pd.ϯII5hhD:ƯP{hDzSPeaXkt=,bZk'L^Ҿ}ndYEKQ'a^$݈N" !/c^/&cF:HU)W^h{#O/D.,z!XmX]JV6ַo~(F $Mh]}w^Oz;yšF<(Ⱥ8v6cs4D;n3}_[F8Tvw~4sgwͧHѲ&eV0 "Z|;dʓk5U syh8ήxOwitƈZ MDqC4DW\5c]9% PI^ōeQo\][f~䩝3lO{W5ƈro\A@hیFE JA#c0$I:3C)aL^kUUl{q' ̈́_ǀ8uh-ӄeIwG7?ti7@Vs !'b=c(3ʲԣ,PF caA5T$ I^מVlWKô()='J ]8K]2FtI/]9*hʺҎM G.qz:q(J0VP(RR{06 A"B K唥ӏ">Gle b@D`zpGF9P7޷`u Txc:oie1*Rz}/Wxŧ}o}ki %RD2bgxFnkCoU@{;Xqm*|[1T/"+6Ί_tkP][Ub윗 𒇥18nQ5,(c6dYx|L6H'XSeyG^Fk}cҁvC^ mAXvEPsˮpr #|_}/ٟS<߻#'~@_w?m^?^z\{ac8͛O}+/7 tv<ŋ<~o+<ȃ|=͍!?ؕ#t9%Vq/]lqy&ֱqrGGI0b.e9ϼ{dh N$U)K_˝)R5%Z8Pk):^qO𵗿B#:S$5ZkP/Vvў TDڏ3aL*lbiZ䬣ELomd2clzYJu*:`;Xc ː֒F1Ŕ)9?<ͺڌcCdP`@x|Y5gsn8<:ShY$ EQ`2ߧ4CES }Z,0P4q)V˕#68wYFR,ZhmaPL0CUY% 蚼KY]TIi5) P[^/c4)ٜ(2hb\@c!YR %y6`̩xLbsG=vN=1sXԭ gϝ_3OpYsРc ȷ,1M=,*8`4Q74mL"h+4!|ڀNff*=$e`|xý(Jюmhc@`<(ʚn#Bfs7t4)d6r|ly9:h8>gQzpO͍mpmv.ۦ%cZ~/j0ENwoxK_} _sW~K|[nzs>/M\`?KL`:QlV%&??{ė=k7Hޟnoؕ/>%zMB`m,_goS x F/S,3<µg0NunJn}/GsDץDH+PTU XDyo<7~)ƺ)Q9tӮʷW#um;tsjJ>eݬf^Ϗk19,[Jt:V8RѶ Zu2; cWJ O{T֬4`4K,k34hpYԵ/Ǿ-k,HVyQW (J!Y1NW^ 26u+r)dss NA iZKoD*" R@'aH Ȳ,M$IF` Y}ՔpXД*C:Iǫqh]@Q5-XKOi6HÕnܛ9o6Q̋PEi‰,X΢kܕ q?&#K0g8!e]0+M8LEL Ҕu&-Y~!4mAllឝS3&|F!N sb8#yvu~PpbguƓ $MZFo%;6!A(au( B@ zCҨǙSi[˗js,Iw[ ˯ ?o{?嬇M4Qcs^x1HӜż S$Ŭ5a{{{<29>d{g)9K8}w=>=w?Q TkZVG!d=ߔS'Kݯ~:| ͧ_9G'{(w}+eTHN??cXq5>OwOQϿn@ %BӍݖ0}^xL_jaU 홍8z^T~f&b:JCck-EAF$>5NVOV[q$EG>"P* ΃ \>}B} p\.B~MfDkؗw _i2A) p8o/* ]Z۶8, )i }hh4hM*ڏI) i-RoR ?L~(ѵE;CńDe-k I~vݴ4V[34u sZ${7mc+yaȒ*i~;RlJE s^owOK@Kj1^WJE]hSX]s||f1R 66qZꚪiH8еF8A0&d3_rY:JC& -aqxt@m 81 YTܗŜS3WE v /pZHiE1%˓ |;[R ܷ1K@2nwu0lcB8GY,TL1+ 8:Ż~7A Y}Ef qԲJ17 dNUiB,m iFE>=|5v_ɓ̧<ɟW#?׿<_⧐;^e Nb1CEm0B7!cM,Yqb4?;~?J$8&3o9a۶=/Y6Fڮ;1hYU4̊#N{BO(昦.h q ]*DEIڰ[a8qPtv1F.J"Gy`8=2K//Mt!U"]V*Œ%^9C _qw ^< N|6#PB- |@o]W QPTD:gBIDTl.찺 E7QD %aݭ,%nFIA[(&]v\ݰ*ʲ٠ˋ3~Bm*JdLF9`f8aZhwO}?O<>hncs/ o\FɊVT , ҅֐E ) qMӲɰx7m$ X J"7{yQ1׮\4tm=] zY2`26,32$W^es}֜g,p ^*_2^ywq$th(XmBt=zV M:yG zz즵lln믱huFk' !EQp pgy+̧ >xV,XגeōbIg9uLnņtwXk[ oLhڊ NܒwHGYw߼cmS6_\c/Qg>ύBi{q^Ξ:_{LQarx"Ѳy:gl脣=+g'7w/#U=g1,-X߼QvS(p"ɝoJ['oS!BzMU>=C1TM`0`}4ոV7(d a*@Zn^a<֭2M+42T` d:Z uKK dR H% @"CƴL&p49`@mg MCLSՆ4 \)Z4a)dŌ@]I?ZpѶlqZ i*?$NJ4 p*>)kn8LbkEnk W|' 7Cu;J⛴fc}!k&kkcʢA*㝺%&O<^K.g?b<'I#aDXaPd6eQ>X3ֆzP84<Ps("s/h-q샋0ʕH _/3\1 zeyOȃ燐368q"aE BUQ piZ˗m<Ҧ ndޮs3>LbX59{b6{7PABbs_['8<8 Cٔ'ȳIFo]qo$UkAO>9nMfz0Z8 I|)b^{oK/)8h*ɳ27q~bY0ϟc]k_>sr/9Q=ڶ6`Zfƻ?kVd=,#{,9afkAJB54͜M|<ś@e'1ibkфgN4,QBtǬ8vZ|T F!~ڊN3]qT4~D6%A u5muA@5~? eg~OSgY[[ !bN1qIEHck]sXn&$7w~ZlN(VpʗN>38m1,|y3_`9B~O/Kx<%NsNlms_WXDp}SQ3AԭonU,]pv%$BgwwoQ 3i[~?~E9/,QG>|}-|S^G!'wN#X;ga'̓7J MQq\*Ò̋g_I1VDat"ӯb}nY9ys\2oy0 z奕ZPR 4^6el6,N$VEKcYi!mbH`!Mrz@@v.7laEc/ix-4yNYQ6xY-uSƁuEf8FL :ںF0IUMNF1+} 3}?x # q;\?@68W-"q0+.-?̳/駞> eSss53"ΟL|_vo$pp-kyVӽcS8?sDkD#PŌ}jk&6gkBDKiK/w[pgR1d+fL)h4b`b>_+ F0I&"gJFOΌ0/fT%b){V5!d;yNQM8ɰb6cL"`~0fsQ%Y?5* pVEohKg&s,!!B|F64d. W_B(y1-.I %*h'x{wDyX4N#@hU8 0&=d<$x9uꔸ#xj~meWk]? kڨ`op_[Wyc0:)e;Mt;' R (F\|H%4ȺOf05-q.~GwN_ju+3SBJzNP\ TB%:DՂz0pYUjQajX/ervV̗ܙɥbX0Z1/n HuIөOj,TmE]hϲ4UM1_E>dt4M]%YBSXqtn,YާP-ZQx7nc2DavYx0X%a mcH˜i/ #dBmZN:Eg6^V6>6<˸pբ`:3Y4aPA@i. $hh|1…_ˌ3Otݬ6"i *'))6'cbvub5Iǿ8V7o!b 66MKPzn{{7`2/V!i{=qs^48k1.(3/| ?ƙ3=s"UUqy6N(Ӂ)!to-N~#=Hpllnpȍ.J+pLe\ַl9}{7YpY; |Auu -m/ˢh,ff3ꟜE/^\woaF~ğslj-efD{{~koƶ=R.dggcKU$IX[׾tv|>řvOOAdR݋" ٪K26gy=k d-%@ŧ( 4x2/K/ysmg>9GXRrDji}΢@Ȁp|"u5 sTlr۶e2)& ;'6x#rɳ>H0F)ijpW_}\$mN8kVpkѝQ* Ct￟ .wAVLFQL׈23I5k 9q񀀒Amn޼dgNnF8LqN㴷"{-_:Wۘ1S KCP%SQf\y vK8wn :hc0)Y^Kk wO.EQy keB-ڒ5-53r)_3owf*gs>z Ci9::Stjۖ(4( !y/5-r@ qbs5hD}$u]Gc353O0x樮5NSѶ^;T@FLp0$ʦF;x6%CYtǼN;0a4AUwt>4ΰ7 8fMb4ƞroְ( Ls`sssW 0$V2+) HXƓc_&+Vq-njF#63X IҶa^ꏘfT?'ÄhFjp1A1,%xo_8E&/<{ދ0'R!Xڎ4=x[EaKӱv5HN8h 76VzuD$ODussodcglOϳsjsgcsz4y6XE]VH)к$Cr\zj(t[W5ess3<=eggXqƱIz$QF$>1`N]5o('3ncc3kXDaƒ3}(3z#j/j AJm7ul k̻ٔ^z=i>/`Q,@)TdF㜥lK7qb#L!Wd> !fw0v˾UGW4A@4d۶+r|oK$Jy9fJ̋_[fMQRaQAjBJ`F4uCk'5bA$IBiƜ3@%`:M]Wumj*$sTWB IDATֆC4[9&s`A~Ql)ӹN2104>u#BA+zÜ$ 0ΠX`,R*kkkLS(Y[_ -9ʼn-0`^]D n<9R4M0/VnB%iuaEwYuu`%4A(IR7u]3YN(+BbA;[y-O%G4 K1++rǼw!2;4zg'{ rvw 1n e,hKCD ,*E$L'S&* SEIz3Mju%huK[$Jt6G믾A dHYT:yg`ccW_cJ,' L%kC6N_ !O>C?39QZ`)uv&0k];3aNnMsH'Q[-e<T\|k({7i!S0X1N39?jvy+_pdyΩS<=upR8a>Fu~~o\az|oqˢ,L)in-Ywݼ= 2b:vv_؟soLm{̏*(>1.GX 8}F;˘R(H")Aƕ#Ԭ ػjncЖ:u.s̖2c .m|UT>XJYGiDL | Ӎ{G0L#-W()ags1)y-e]Q ȏ-7likQʢhM, ifF[}Lk _IT@0 QVuz(迱I]Uԋlbp}vP8f^7N+Sɬu ұe>ƈ*]g4! %F E֖4+Ȳ?i|tGE+7i(!Aϭ b л|ɓ;lll0+'ahpփIQ(iY8=]W_ MUƂ|)-/}Kq}cT”r^oJpV2h*5!uڭs۔I1#czѦ߬T-^FcgYIU5Եgqqd19&#H1H{\ yup_E׆J+1É-آ[(yq@4 V},]rD_QܒTLl ➔EaaבRaE9I(ǼG@ >sevvv҄g>ey޳=};55=G2#'֐x81#@/@N  bYv `;EB˶HVd"Ej =UUu3y 9U$%ȟȵuY[=?Zpu>}:N,K,IJլO i *Kl3ȋ)BXTiBo ^tQ%oX+$'S tд-,'G<OUCH딺nX-k8畗_[׹[GXdN'tmM%,9NzEBGk'!T.>ev`gvoa<T% wƇwgF'*/@ܟ-1xn`%=WM-q0ޢ\TXcݝ=Ŕ[o4'<|瘎ٞnGpnZu+2jqg?+ܾs{fi,BN zcϗi{9G OCϊ_/ׯͣW7 u~嗿ĕ 7c^{-Ls琦q&]א Pj]o|5m {bk-ѺMqOq_ oz0M(F"I{brIx:`'BQ6M3tvJidlhmۆg2mzĸ)j㸌qQ&gXݰ.,+oP5u]GZۢf4 q-sL10Հ" CQ$[[V c[%$JkD&+N)R$4uOyluĠأô5=iy&}: `v'c,#R78#GY1Y4 zEVi8Lj0l o1T 44]K2ʉ̗sF!f6țSiOęDk8@G76 ,C&q~>K~G5$i"cY7G(n%kkkLFCY+n>wXܸ~H'8۲7cĔ}G6e`%c%ZORz{j1GxߵO˝;w?ǝ;+W/c!4J0砈HJ }oǾ[~sΡDȿR.f2Jf9gϜe4xHXV|S7_~e=ǟ&S-(Ӷ Q BIؚ/~sWYB6)|~[O۬8]2;O=ɓO>ٍ\zP]W|T7_~=K՞R0}ÛoS<ӴM~7*Oɒ]!ҧ@#DLrn%‹~'O{L|so1)ִD:Ck<r 8lNXէ4KAwHb]ijC(6.KȣQJX!c#@캮7#c^({r,PU{Dӛ,J6fXqDJDo[ 7 E RP%^l ńl6NHC ݙ =htߙ#py6xtb\ldQSA""Qz(0t HLzKcT%HqUK$#o Rfzd;ȳ Q҂ulj KGos'> $ň9i(9҇1Ӷ=$zuC}rL/=R8$K$y2oW$iJ׬H)|i>V-;,Oަ _Mȟ,;A4_0u`mO!IbFyJۘAt۵:`'Ʉ=y|#…h)B{]{p~P^':yW^}L'$Q͛low//)3CA$n CFxkNs'AnMXIz :Ǯ{\ Pxʇx%'b#u΁(¦~krZl-cHu!a:%ۄ37C'8, Oh_JXcB>Qy:;"i񆍆,VA{uI JJ®5mp~p6T8"Ԓb)i9JkĀhX7a2djфi6Ax/%w 6k<Х9ۆ :8}'`$e~r:$IyiJqB*~ChHĐҠfJcuGp^R5- IѦ%ӘT+DmjA]gn5  hδICT$ڶC*Ņ䄓 fY!}q1~.^?g<_{|~CVa$&9IT1RĬ5o<[ s;sLse&)]rrtL,kΝ)?bgo7|bDh,7 ٕ<ˈC3xB"3}ЛFt4UZ+: =(f<sL.7YTڡ͙/,>J]JDa$88|b->@˔i܊Lf[$IB15hL51Erv(e:DG(Mcf'¥;7n_[i80- 7٘k#(>=tiL&lmm==(^߽Od/y:g#(?w:_B oF ʁ*}IwVZ$-cv__b& ZHhtA礥Xa("hx/_)E{P{(ˑNL `.t>hlhmqQ:Qr[s&F)ƉՊ|SL&lS"^X+: "p!V%Ȣ9eZDiBQ$bY,OI0N`6s\7E]PfM{1dIt!b{x|>ǹS[#A6@_V qinLpI7=Og0k [C(E`i/1x!,Xڹ,.#,t0ZKڶforIW4MZ1 N-sL߮l,Kh=>>f5A njYC*S:OPLftk4`oA75?_XE)7_sgZUX]ۡF`h8/mw,G1Ʉ4*PuhBwx4:K%XHբ -Cb(Nb"J4m bLQ-ulRMYZt8RVY}goWam7Gu[![GYU(0;OD:"cG11={Fb 1]L.!7:uAZE8d}yk3-ij>?]^x,Nf<;MEݔܾu4͋޴X!(&0!uL1rڠ+sՂ$Mk׮aiOGJAׇ(f\x )$ 6mWYx)Mhiˊq>ly«^P=;؞\3vU&):d<%#4MzL{8ki}D]=50ThJJܺe-/peV;;Μ!J+.]<" #JX\4OΰU(!i',bTp| IDATh͵˗G>ʇ>q}Qfmz0Aٔg~տwؿ?sO>c]ȹ{<%]}3{z!-L@,`SZ<@x m ԚtIFPdG,S:S lg¯}W9{ 7޾I2'z#)tBnd(`in-$HjUnbb%.H&q4!:T(#Zw= |m]!e?UUp{<82nekgFkiY8UE1fk{9kZ\t\$Q czVSnݺtb^p$Q[m|JF(F 0pJ|`E(>"|f}@g;]J 2P9tD@$u&'G&Q2#I"bO<|ASܼn./\b$Z3aG([hyGC}& ug4J9{ gA!`ݳ_O\t iNA -B{89 ioZ?8JpXt"XN8mNԧc­K1tlyG۵] G:tlak|2A\?zaK)ux9G*Ekp}ƐJG1i!h|>o@뎆?=5ޅJ)EdIFj, P%1UYf Y1b5EFeGyƮPÀrU!/P>[*ZKwg"~188or` i>I",WlSUU'ۚ/pK\.=K}IrUR5Mxg\rtr498ٳ)k9cZLQׁ)nHYX.*V@#`}/xӷDɻ5=ڊ0'EvrMݧI)%o2/{/mb6f Lg=Y0R9A k1b]ହaքhJH\֏iN _kͪ*h Q6E!BȹQv(z}^;7z+ Bz-QLj!Q Zkomk[ڶe;CǚKiD^!D'i$u6D?)l6)+ڤAj5yG4Mň89<<*J bB!B+I 3-JLP81gT$6sK NCn߾MeLZ&T"UFcQ$ 7ַsdBQt-w( 2+& qc uӚvc([<9ex&\uB?ڄkzZF˸6L&`hA3Aq1΂+sx|7~,xLw&OgP`#ʲơ$RlM⥗%фY1蔪rU]pŊdDWd2a:/P(nOLSזCoE)†.}w);{3z"ʼnyuWLwH ŝŻHw[_8RhV44M k=6{vqwNws=}t5"Hv8'ܞ0NuԒ^yWɂ3g#Oū'mYo39dNsF*EF9OV?f~t|'>SO=h:ܥx(N1Ƒ1{;n:bw~LGA68A]A?^ y01뛳)v؄ބaނp3\z2Y`]CוSw1'I.ąC<%wu@`;Fh9J!h(#1Rag@cjqx4UC$4uF],%}!@% {V͊q^#B*7е iDHŨҘLK-Iok:\oe#21 pB`{V ٢I "IH%aiڞj{GΗЊHexkAc2!3ta\qrx8@dt a瘌gňf\1U7tmK80 ٌgY%:H1^L:\Xz6cQ7̶3=ȹt Zwnpz:1-VKV|ٚA33:JihD[X!pޑ#(b~zJc*Ge׉AjtጤZW h?~֕Q4AIr( 9k(AWb*~ru,68.pXUI>|tmݼMb1?<{Ch:G_Xp>ayYΜ;O1x qHqy|ݰ;YBpÈ7fdDIC(GRq;8^Srt|'8la:'bnt4͘o}r]i)0"W_v8ju(1LYJ3-2$0k}6EI_wHٌ[ zNhC'I2 OI)NX2H$3qL<ɒ0,$QAL4 :7~v f08$IQja&JBe<5Y02(݌DC(Ax<ȔrYҶ=I$t&5JH T89:ADCjC]Wh i< lEA(9hj5I`:U~-z7, Ork%SD 2fA!=EְZx)9>>F^yeusG>CZd{kFշՂO<$ۻ]ň))1Js% /HO-*b-"M۷ot֚ϑłi)%YmR*L&ELVYƐ:TU,M]FɔO4nu۱7%Iv;Cm!03![{ŵ/Fr!]|\q4R)m\sN5VC9%i&+\u|ӟ~gx9?WO|kW"m/蚎$!֒]Ο?#`}o⏅\43|Yjָ[׊{;/򸧝w=R ]B0_䤼êӛ7oK1U(>KVQ:#m[F?k>TAGkwd]dYNF z->W7 woV%''n:]#,34OUWXgJ(| Rc Z $u dB2LBZtU iRl KemxR)΂t]r2y ZQL&af HI(hĚEJto:&}H PZbL]߱,8#t4;tQu-DG«e4)(|d6\m`;K׶Uw ߞDGdYqDгE*B EߙpzBegH %BLFb!k4(0~R#~QrPw JGuHŘ1{W?A4dE!mQg\ _Qc0_,(o)E ӢE8є5td',OӔ,1PJ#d:^֡(;5y:VlME{E؃BN_Kzsk-;&T1J;~ɡo-q%_ _#cDrtx!6!Kߠ$_F!@Akb3lr_@p%; XmXN֚FSZ4e:nߡ inF}߳\.YWtMi czdT*-l~]VXSPЅ/Eg-8pHkVt}I1=48U=ManjM.0Z-n+J6.(NQB*{H XK4 !DIĨ(no!S[ Eg\x|X QQ+Q:Bˈ }אg)JISd9X,qbhOǡ3Liſ QC%U4]m˳<.h@(muθ;1"$BL 6]t2aYU̶vh#`ӟ`:e4ڦ*{tx 7>|_ I܂HPE؃IxOླྀ'[̘v߻^qcMV4mM4CnEo;w}={{Sd)}gGЭ5]lki Zmt\ a/{okiv=k=NM]U=&&Ғ#Qv8Q`A." @`ėI\&A8@de˚Q$ŹǪL{5bTUwSIZA g}w}=oC{'[Lݝu0 Yc 1SlR3bF$:kj<OTf_)5Y'%O?\|:2Y1iL;w),I"KUH0R!tM%N-;t})E?r$bGZڶm[ʬ$Q%DkfMZ8eu*PdsNOOMEQZz 1O4.Z`GG(:H f3Rt@6X0nd$Mߡf, t":e ZKwyhLנU)Il4qN-鄴H>zŷRvvv-gl:)5vw89>Eb8>O~?dfK11|;³_F݄|K\zxE[4h mMhf/ #M gUWg{4)mfS43=iY7w @߶D#q,Al6E}3\x|hc1k=lRT8H~̲}t؝ ʲoav@sBUtzI+gHFğZ`D8|п 1^&)" pxT$-9ǻ]KMݒ9EV[R TF1&J%#!֎,9͆ +K|`AIA:Rg)J=^Hlx$C fۛgŹ] .:#c+4@-R0 !'[l [=ta̲ bR BXyGZFf>?!u+_S BeܺyAm(RnD:EbtTo.,ygraI5{~⊘B<~@v"Ljӳ;;d:A%\jX51fPϽGd6cf $ϕP;.II3,#X%@Ns8E^jfjNd 3[>ˢ(px|SJI sNuQݸ/֒Yf--Dޙ` Ă fX`F >4+i"q+IΙ)̻&qK9P5OIA!9* snhŜr6#OXڿvtQ'%62[.(nPNhy5="U$Yʇ?*?wlOַ`}kGљ"/ 4;޻!o-3hՒg+`G1c C7ba"[.2fŌ1[qz|4٭r^y;\} AH8+KLY ?&EӜkF<(]JQu4>^ LYy`Sp .o\᝛r8\#RpqN5.h.|v m&C31{2Pd ^'i۞۷oĈ3kկLJG\vjwY=Mm8yI f ^Q[}@pno~+מ'/*XZudHd!LlD }ʲdxe4֠ #p, d\^ft]>&Oa8g<FNuGW1BW\[[nMg:Uc$mP*A˜-'Zrw$Y0 #@+4 Nkbah6kq>`waXM}j+ׯ}gy+WfVH@/ѧ=\f۷٬Č5}#|;7ɪ<;Z.Aq54 = 6k<%[wӻ>ztQX׼-^x%exekX!O TH8=Y%;{.J)޻}7YSN{6,;%^oQ2'P,rqPV -,C2KY-(vPQ2Ǹ8D@r@;Eq5U8{[^&8%k U'2EU,ϖM},a6Ƴ=w]|÷ߥP _cgoۇ[F&xV%Z [ք6ȉv^z9>|D=Y1G0 )u2h=z[;#ތu{LB ZoϼĖ`vIq##WĤ"r<'1ИHSYu+I RDfMS{9g,؁oX,cxtt4eBSa. RЏ<Ћ/aƁ{wiۖaxr|x@ :^㻌c قzw4-;#r.^dm}Jߏ̗{XN~8?!A5$naݻ^yݛܻ{|>g>ˁppLHJ=RKrIQT4\!TlO"ugo1ȇ{{"Ğfc Q$i͟xߩ7-F}Df'ow"p.0 -XfUiC\:g5ey>fMޯGY@kMD~!c0MRo8x>!)P~8cRnb/Fe`^#b\F4EDت,řŋ,o m[#l&*Ŵ'8,JeJ2nwvvx믿Ea*XHe#]j9UUg_Ooc iBpH! sA[7$sB5Ugc;^"KrVn`z 1{Jvƍ.B_%nuBxzOm{N4[NNNP- tuDݬଏߧb1 99b#iG|`b@r{FcVr:Şϼ^g\8Xci{>$"{m J$%Is}Y\xE!khێq4$7_.)g;꺉YGl7 )kB rPD`αYmHuj1g*N`G%i*%/!A8jY q0X'mZjJ@4I{C;J "UER!5i Mmב%{? ]þ+/P;gov9p Ơ3J1?own}2G)h3떪& 'G,l8>9b[.zF7l ? %.`Zqݻ٬RӶ޽M?у.SszF-rӘc0wd(QTWGEW 먷[-CvNVLJȋ~\tgRyᜥBxn1%wǽ1<_tF1c_h#F=wŃv"g{(Ti.] ܾu{+Z#:GgI`H$y .FiI^ȇK?aOؓOF,,27<2|sU([Y;DH%H2M^iV#x{:&I}!'ȫYGlw??#TK/=G^8+x0ְ]bm1 y ", ;1╋l-EQ92SNԖ )4~*ϊ !YvʕeASG `!U#,M ;XڦZG^fb"`,vd$X]7&3L?S}uѼk<:#[~ɲ(\)'|tx{Uv;&/4 ?&Qs5HbYR%\¼'sA dNSFh:%)8bHQTUTEr>Gy'Biם;_ǫ.Ī<,#A1YKOhAlAH!ozGdI~^ъգD%Sèeu$xD8iwq#=>R ;0S%k*( DDqɬ.|_d:)RUy#uͪBckmi3ߙM۶l%eYP+BTU|.=قOэ& 0ж=}>~)Ʈ1!KT1`D||6>iFeyIU=멪rg 10*"iF+bb6hښHUamyYn1[.2*A]7ё,F%+2pcKm#H~BFa * k;P1 {t#bJ2OCa|gk̈2+5CQeJ]yO|||xd,_Ό,C3ߣOXt]| /|}5 lcc@Yr"W_EuB&1e@Co=JH`ڞSڦC8+\oGǜR9M!x9r+Y iMJs|Ae E h[2NRKF@舞3=W\D(ɶn{ݽk4~OYDLPH Z6=KdT@ H7Us]-Fes(PIFpЏ=YacRQY"Q‘(O]'"{~ocھ*QZ}!>p8GOGd ~ϧʘIvI4M}ܿ>wMv4E%2tr,M"nzad6L%!ċCS~FUs4eC@v9)YCa]87TO`GЏ4uC `9#3}Gu HhCQdYJdYAFAጏ8fƮi mtj̓ܽ{,I&~%n\20_X(9e1Bk(ʄyA/ND 7J2x&z9Z\xn`A(@ C;,vdeAVd8kZO51SFP(!PADbHC* 0= %m6mYu#c;y.8$ gXv3ny~mE|~? Gks]wI$֎p9if)?{p45Edeg߻O?@'.PfH4MCYxmrg !L,0kYY?7؏ HBE!O_E+SN7'dyĈ\rAҧҗY,f.i;*.sEDY;KR yrmqRHܙl`t# ā"lLԲдX!F)Jx)=AHGRL޾X뚡h̜ IDAT3Zo&p .<;+L>EOƅ%ӞuaB=RLG+]a!4dd¡do8 =އ To $EژLXRd "D Ks<N!dzshnӾh7Iɺ|moo}z*g{n>gp1amY{YR?>'q7ݝ?vaC4юZbf@xbkac4ϋD1mQ.LgPA sNR,<TK8$,.PoLoSVx7ιmzTrVEz di4z@%k!(m %Ŭ FC8HDE,CS$X# B1k. {{{`h-R !xq&cVD?hF6-RͨHPʐcg"[LlľQZv I۷ȤD8Ie`oo({M@(1ƱmVEv# HHRH_aoF`FM$Ƌ !xi‘H&ǎ<[е_>z:l[o|i> ;~ӟ.>"[(ھh̴$I0zЎEQoF~;ܹL^hT=K:GhYH3tPt̀ B΢*"cNS=NU \ (p`$:#IӂAAZ(6m}Wc4~@hMג;ۓ=yˢK65*1I!@Cp/XD&{h8Z#L&B#B%X &A8"chGH%iR2*s*e61t2ۛ'B ;K|O"n߾m[o~޽CǼY\{kr)IkD^Dx{]~0l"Ly5bZqrr>9&Gwfq6$x,#Mr<*,Ij:zLfj5i`;<85)M.BuV:kH)ZO1)% %Bd"(|؍єYmۑ:-I-]#X 6zx=C|Yde c{{{ : '= mPזj^qpp kG3Ӵ`Nl9>9aS9.l8+f)_mns){_qa Iiz~[NJXZ;X̗4)%IP<%Ϭ(Y>U-w@W8'Za`b-D89hRw,81 gZx'+7DbtNs2ɢ<$㣖c$ywMí{8ޜpe.qUFk0C &H=OԐđ?{ A1'=C]KY2-'&|݄, *eF$ F:?O;OO{)؝of/gO.65fKeTfwwkWrqGO#eE1|_m'<z41Uzj9vww;;>#eoc2 u2v QbTTESyU&~gmtc"k-bwnqZ NkW8:zfSo"]Pf|OQ$ 1ތ,eXzw| HK 4>xLC0!";O]7(aA%%1: 'Xi?D!W9Ir mC݋O5(QF8zpN1'KTwK/%ofV-9Zd[,P:4& FfRй5wV%IJ&p|q8Gv\q^A"EH-=ş7R{" n|nU*eͳ,"u z筷8==o {zû7&On\bg";;;EBR$*eseHCt>gD&gaH1$UmJݻw9<<4EWs!Vgӎion[m8xM8o@L7NjWo}cXOŁ%lh7Q{bskǰcP,._谱q$s޾pNS~SŶmL $EQaޘ>QHVmlbيFI%gZH^J KQ%Q%y.I+jAɓwܹ HUE9I.5/4*!)+ < `)UpGJA8%sFJ),۞#+4"Dр8d=-h6 lҟWڥ\T؆kYy4,4ebnG=f4 ,h[f›W -JBUv91Y $%0UDǨbx2627Gu]T !mZ0\ su8~ҷOl2=ڮ.X; iQqA"ckc_yS z=ַx> 鳼}cqqW^| )K|>珲9ȡHR>OqG1]'?"_g:rpׯlHa;\xhl{<6->_18wi\KWQ&iv<,,Έ)w9|hQ%'xxĥuR1r8q/@ȇ>=L&рzkUa VQc{L'9ǵXZJlnHbEoultyq4v0j BV;z0?<* {RJ0 O+УRu6 cw.NR*T38>d0MHC3qAh!s.4Ph@Ie:SEE2P) -r,1-B ^ڙ&% lPSjp)ri81&|5c{w-qV&I Ǯ6] PtV 9hֿf tX28rt;O`m cC[ۻ,O^Ob=0''及xȆ,_;ynƵLj<'Lzfv30LEGXMeB*B/tcƁ= ;3%h {'߭RJma`ccC<IWO?ɣ9n(_q\a|g0>΁Ճ&WH}ZC 8z?S?OS *}S{u񄭍-LaiaNV-こ%b"BƻK Nɰwdjn>i-pqv0>1/Nwn#Gb S/Y*3T)pob9&AxkG勼q[R1")Vfxr1xgȲf]Fwq9*PVS9~(~k/ T}iskX"xBU(ҚMFDy.Kj6.I)QD:-W1(1HX6BrHc[TAϢq,a_UҘ:\C1nsmmj|[ n !ƠzCvyY8THs(sloo$n-ICmI]Tr֖WX^Q|']-sA3qǿR%n^Lw@嵵Wqhon6 [i6e49tnV:bgU\OU{T!5,'mpMg{̶?l6;/ER,Lˢʋ[?RmmwqSZx<32DŽat2qtx4)KLS3R% ]f!iRiwwPJP3JyvzW:{m,]GX5\Ty&!ZLB%BxE풧af=qZJʪgδ4WT+BBucRz# $pϩ{rJIѴYfu0\l'OUQ`)X`5`XAUxm\o,Ӭ@Y!yRa+ݝN 9gB{w9EUtiAPOˊׯ8 jfu$> Aa#O0N wp-IElomSƣcX,rhg?)x l&J)0lhKضCˋ YǶ}$B9X|^S\f:N)":Ye(=%.Ij%A(h6Buvz.gSIh@Dk=AU|zwAU P :Jq7)ʔF#lbvn3='9q8jYg.UQazQmm wxˣB׮nzvv'tl^3s'w/#8C u9qVV[Em\{oLW.\f%KJOW3aJJ(b֡YjO*n)ɘɟ::2*f+Os._?A5iv<+(V#b } \RBRd9Yg%%j>jz6HӜ8E; IDAT:ӼhL,IBd2ٯQJ;SKIɸ9 A: )pfLn˲ eYmR("EBP%BWaH$!30: D)0K* [;4ZM iOSbL48Uф.ou&ۥ >_sC|w.D5"DNG{9wq!UbѤyJQؖx@QJUdIi MJ0 لKKebۊN+ C2fx訄rd!ʘore{eN~+WҨ QIM|Pgĩ{?`|Jh/}ƵQe$ߤ V*JخG6z[n2FVsopWQ"jc C24 ۶] #<əL"ТmQ傝u Cl؎s^՜wE2J,ۀ {a@g5ղIQa8/_( {yЃ$ޡPW5 ~\hX3R.-6.^]XnkW$2HeY~aAmᅿA>IQ# Gm_HԭbV(ۮHdaA?ٳXKijtn8$P[8A^ =yx<< 3= P][[*!1,)p[9|01M͍ XvL<מ X[PeğtpP(XZYcPxkHUU4&Q14Klm^`sm1uF%`1IlSUYZPɜc(̹ɓw%EU.cS9풤Ĵde |?vp0ĶdLUlX{"NsPaFUNOKRwWM-h ׯ_NXIXYٖ,K9;}yU2|0 0RRe-K^ PLۥLI&YcE#"6Z~{H:yR$z 677 }4)db=6 $bmm7>xUVh4T2%X;pA|?d8쓕s:ӝu-+%,I ;xa@`؁A%1mcj`8( Y_Y" z:\ϡծ3B9uNVc'Iה*LQ Z̐1`26<&-b ˆ%^_T:&4YYIYOU ,KQU0LJeixtDRQ$IFI\jax#UaK,D9Z Mq3,ػ7V eYf5r1ttӪm{1$uEId3o BAǦia((Jm v\KV-u;oe~N ޲m_u@ oz.s/VeYb6RSpkNVlSi={8\$\G'}K?<ϷQ9E! e"tfBk{phٚ 5[7N1t<(t F4ucX:󨔕eBPV9,8VضK$.< (Q=:tƂ&EY& PPCPie , ۥ3KqB&Ms /"Q<Ƴ;v pCg;"^Xh6Xs(+ &oMX6eӝC`w_ 1g=>D̵n.S 7?9tO ѽǪR}/iB۟-,Oa7K .bߙ!aX<ϡ7Ջ[ ,vu iRJLƫ؁8'$Il[hhiaQwEz.KOl?GL*9R:,#/R4&MS,!2=) Q&E^jPDTa.iv {Wg\e f񐅁ch5| [7,uWYX0%6O~ uju%_ڟb;vi4_5m8mpiv{.6W/6HfkSDZ8i_"#[0 V,Xެ8= {5V[<_go9xhϷyWHӔf{Wr r&Ydx͗ؾʕkWW3*52idEYFI[}iey㳵c\rhex4O~^}29\x~&/<6p*O;Fn/s;a `[ ۩p|t*ㄗ^~+gb" àU{qpgĢ0 0šiCs>_ʰgKY Xpռ ]kZ8[~6'@$i{WLH8Z) ˦ THUGVu` !Ib9&@ z}Ҩ li;9|sǘ Ivw!k5d4#DRǎ5˯'?q+b7xɊ1|A`k[<ސŅ5,DA57^;2L7?/}! d@"pSjMt/C_? Nw!/ Ɠ)~EU.iq[|/Pfk5^|ӿd8sez&Jf,O0xa p_{ν(Χ3>w < j8d:ڳⳟ,t{l2vITDتaRL @cjBb 4DeaY{-: 9KdН2/:JD(h*dyq YriÅiJ^6x>#ʲd<Sz=Z,sL$xe]TqL^jj/CP:"nRʲ;?OYTi8yJKi1e0i^03,-.0BY (tG C?ɳ>/޳VlOvc8BALeZ2RI\ס?豸LC'}(ozSNLdPIx>[<},uOm wS#8:UIo'r0N4Y޿In шtķmƓ >6,i\`tDO%?mD;; ,SSOyܥ3#>eΟ>Ke-֪ !%gUtfKūπX>cuy,I؎eFF!+ q7#j>g9.#H$j;{AsOP28vnɐ$p]WN—<Cj5ظڡ.?s8~/?3ll\'/4c^{b{sB)M,'+Ȳ5~~˿?䯞y|QL<Ҫui͇"7Ͽ(d2?`ssg{~T}_8ˡC׿#.-*}L$ihX]]?1 u3& ^&QSdiwE6swGNO!K \HQB*s-ow;500(BXvd2f2??Oףәĉ`0 fjaej׮bŸ}} inI펢/tsɽ, 1*e RFz'%x6Hs2A~ōw~"oKKWnaYMoZ/6dyNyiCѳqFAF3 #b:loa R$K(YŇHPUmB?OFC $c Yaܤ0TJQFfQN/cĶM²<2mߣ !3Lq:G, $`88*1M˲i6뺟RVy+'HE*RlVNtydRalnqbFG Izemx._7gww>PAoMS8x /},3Wޠ-.]c8z6Zo'y,Wqu$7T>? O9ϹKoaqA_7~7n3_\rW!^vo<7XxVY[[ݻ̎Ozޯ`d-E4Fϥggg aI&k+E^LwHIcYMmuX ,yA,VbY,%*vR:6琗aۊxLziFUU=("K <ϼ~MZN8Lc+h-:*}xgqgYV4ܒs6w\.l>x?dOlG 7SIM屴<uY44MEYAUɑ8u=03Zo>=؇5#ӂHd&xZ|}68o}흻̣SlK8JEq16h4R[Ƅ➹M3ע-Ӵ<7L, VKQ8MU[ 'я5v"xQ7 uk:cٶR(b2geprm~X ¿r!mʚ$Jy.Rilƥ˛Qt# VϡG L8Sw\j dbaeuٟ-1z:-9KV=fc}_/wGt{-޺cȒ1lN+YkIDɐFl.39UO3ӄ͍nQU°R^Pi2hK+xK#D0 _ qLjQ5[;Ե@ZQ4A뜲L |+QF[6jj]EX~Q؎OdXa$UҒ5[[[$I+^|Y5emtaPR6YY!EEMS+|vv7)&Zռwvkxkd}TzBSW4o_1}?vq~P5gT Kqh ^)z):6J:qz2Xhg֨5:3؃Bl}~:xt:`.Y^oĽ-9* P(%A4o\ZSQX:P7%}T,`IAgMɢ|_gz)"_|PIa,BrTXJGTUUdww_kX^m@Μ&[Cee&f>L^aYq ]Ų H(/&Wʲ ٙ( ,EjPsHRevZ<Д44KA% S eKZ-Y4)`X qR~UfNW2Z]UUEv.`ݕ@Ʉ/Gj&%IMAO8<>%sZ|2`u2 G4~R[IGyݹ+C' }/|7x[d>-!IlRULpp9 4qD4YK؎u^@BiDӈ8IkrW KZUB%,/q;À?E9x wIy:!e%X 5<8rlg>+PDIf9YYr\c<T%Ak{mNFZUxضPp8=|K%ׯ(92w,m>rƧ5c=dFQa]ߡ5߯~M뇷օݿ&5H1ʄKUaa1x'E1ez/~l]ޟn$괙MnENfS?xjԃ/w7ydZ >aC5bagSf- nJ"EjK(te{ԕtR*PuEQEi&oPB%ًY6eYP&]V;Sl5KHJxG+ْ]Le;19a)IUVH$#}-K uL6(MaVTUY"XEi4F9ROsX$qxX7nvׯq ә)ONOx/;Lso;IwoƀRh8::dtzJUIf lPBpO>_{vqUMUd$ ϵ(T7,"=A,؎CƸ q9>8a> ' vU4Lobr,eb]5$el2˜7 Y,u9"e =,ft2dxzLU\y2ׯ?F4C(|9MQ'3ƣ <&h̦L#na6M1q.ZﶘLfGD*G4`MVv ˶q4Kͅ`4@9$i,ۣ XR-72wE!Ir(Ak8e峴|g8OxԄ? 6 KxK48&-[mWȒ|JQf9ɔFkԉ(s|8<<4neg tRݿ :$t?EZو~%[*nj:$e!x6:өyřfDhS!$Ã7} ϲl)P8/}Jfes@/B A`%$R_<L~8-UMR}I)%[Y)dj&׸cEPȫiXڢi$xй.R\Z>~V;`eemY.iJUiB+f%.b҈FO4[Zk2Ba y;?ͅK뜎G.VzRvYUIUHb >èkB9{ ECS2-XhsqΣ$DSZcfTpz0n*i>ͻUQ/ߵ[;ÄHplEY{\zJNv[Kqm\X$LfM3aeehc._D67oޤr-ϱs8JVCS3M#,¶`cy8iw&#ZAǵ(j,yq.#!{Aw@;{;<#8$)4T@|rz:A99<o|_:z]j%s /uw)FJ$N3CV&Q&m 0͇ewۣ z^;) hp}O쳨@qxmpx|d6CŜ4*\tH5N6ަj.wܦ=8&nsm2CZFZ6NVe<9"#fmdq X^},=c JONywp*[wyse;P.O?Koao.j)4 -lsw޿FYK PlV7%e')^ƍ>fxrlI$ #-utLzzǃ+sd<FO/vɌW^.{ -.\H NȰh)p\9kez~;OA?R>,}ItIh C]ԭAF7fuy_?#F·ũLny@( G$uz~0_8U8 (rMՔ خeZ$+++eMeyF"K^ P9P4%a!"ȄM4晧>?E` :m*txCo*vv89_d7H}?{t=l,c*/|G ,-h>YNef6SgوJ?z29o:o2ٝ]=N9>:3O渞˯Fn{Yjij˸N.i|g>6;Z.EYT\_L8x:mF^{@X>[K hĸJ\p{aX[^c5r%,6hyQCx7x;hx8OBAKMAIC6NчA6~^} +ۼHdDGcZ¥)5̫9I^+sAlV1Jm&SŽgeNuI LJ hƓO>Ioekg)Y:G5]k6yhySJ)8nJlAJqlYRJ<#H*a҃ IDATR9'{e<.4W/_%ڹG^f4.e%"+ЌBS.J 0>KۤI|:#U៕ ]Hᜇ}'W$;qyQ޹ YU">y-#cːNSfa8g.n}THIJ*dbI)5Iz!1ᅨ(lGq:W\c0 Cx6/",KT3J?{6-8LNPZ0XY/X kLv( \?8ՌVأy6oBTK4Y!UCTأeYEeVY$ʙ,@T$Ie󽊢)+>Q}FW acvqnAW5Uau"Ͱjmʌ,Eov/q |K_ypT1vç>i~sGSr:mu6Ҧ(*$'JzG?q^}evwwX_]P{'xE& nֽ{Tu: ~[`6+/+]!45MU7m[^c8퓧_y=PG)ph 놝C\$<@}/v]J eIlev(ꄢh9AF4hw:̓Ș|K4ap0 JdQ u^`ie؞EE'f:T,PJw Vtd5^;$ o(f%QѠÃ-0QPXu}CJ NOGԵb4%$a \.[m"Y{pb?ٓ;i>|dJ;;#%])ظ凞ƶ%i2{蔺NY^Z1ahJy U\Xg܏ZIjj~P !sc^xs 'Cc9.-EIY縄A2E88YpP8y8D֢ ׾F;/ `p`@7-vs W.\;/|2G;+x2ÀjA#W9ٔy2Q9VftuԠ^Ym,~_)EQ;ȳ, %~$Xe7sIb4<YF.P8hESWT& zQDQtu |s|b5{C.n47_t|{e"kMUh̄@?NA0s}MC]i4锪*Ph's {/gK =A5Z1yeetEe΃B']h6MVgNd2wtI/MlQ8e& ;[ߥjZ>BJ#+J>3ll2LPB*cqg(sھKS \O,m<ǣׯ Eef!5)EK Yd0֞g,B*e=&&uc`c|BgiYԌ&ctmKz88H uDh*  IS3ū&kVH4O+U&#^'n_[>gQTYqMR:CC:c`V ټpj#`_h`NNuIx⋴[_9h`0]>uaG(b{k0ΰOx':=ENN}dSP%uIӜZ>[8|䉧=%%4(76 МPbǵw. 2wme@?Ex(??佛1LɊ(N9:: li{]tU:A3SNNNfG;=Z.i {Gc[~u\ؐK+ ]%d$9˽ѫ6zAJ$و,?A#-ˇVGrzzE 9=$i\`:ESu%0cyYV7ڟ m2Et]vm®À8^`w:+ [Ǔ osբ({1JQ&:;f3 p8ϑ$hxWy嵗xu8R4 Mli9DKlmǶ/)׷B>'F |&U~ ajn7Aͣe[ |Gj+QHh$npm }cYBCTd޴mexR,bXdࢤK2K w:]M1*>l;Ҡ,j̎'Xʵk(eqxp@iJT\|K7\8F$Sr%I - |,!'$ut"[y4xkx>@Yc< l_} َ"+))TMY2[d zI ݲ(L& _گynqluI9Z;l9ýZpy2SX`0 [ZaAA/ċ7ulb MMЦIg:mڶM$I"YV$y_r]del8ؿCS̥1>@SQCB >p_}%OՈa 3մEiUai^2 C ek؆,zAH] F#N׵ s0m v~Nfϝ<&b?\Z2Ioi'l=ۼgy0ɅuN,*GEy@g)Հq>Mr%e^A]4FgE;{ܼn? =acm;] !o$5AaTԘ8¢g?/}{s@YeazWD/9^yqe!}<-\O7v=,Ƴ ,0 aBt:E5Z՘|*ic2`umb`:" 0RUˀ,¨mY eQ)J`AYϋ&pjAW5Ea;&k&+,(ZPq?\#$ >k0Ͷ˒ :w~7y'+4Za:+kM.*E:4=(f`lϠw|4c`qV3f(3|/]!wv&`N=ɨ{{t}>"/R^# %膌SƇ)P%whۇwH:$yʈ0r{@`|_wikTQv7{ύuI/+V#&N%q@y|3Z%;2/T(ˊ$>탂(@5KHyɄM>7};'x2w/ċׯsx߱ώ8-"Ov a%bH|l6 * {\}O=I4ϰ=˰Y]]Œ6ISW2ocd=x‹/<>a{yY텈ed8lmn 1LM$Y8y.Ez}tS4%UEa:0\ =^Kh:W$M,"M28e=P06\E x!,{@sXx x}W*!+[f>ܹ{E4sP1e86c <[[hNt|'2yW.;H6b+4 <v0L,M)f9ȳ}z@"4„0tL4Vޠ&{% !̶(Hp= )N@Ylnlul68FJq-ui:DH!a09IT`XVR9i(Ն$[EMZ)REXdyBgN Gk'66ں#KazFIjST|PTWim+[dZԸFAE<_++ ?VkktÐs8lsyD7o!! l[ҵh!\ȕKygy#kX_[CY7,1gv -MҶiZh0%Rm!pW+޿븴҈eʾ^nM",b`jG}NrӔO)E9Ck CQL ːGq YDt:>Z7H`6'ǘcÐL j4g8|-lR5M]xasRh Spx|p8`'K, :a7qx)ML) JM5so ~.E͒y>zzs\8w3g膴d21ONx[gQMBԪtHnRxR 0'DQƍ7ZДZzkh` B J"*EQ#-̮2-G=hd JՔem, y=z99ww߷?ük|zKWIbMx6^]^KL<'y>!GM\dJaG.sU~Ce4Z{eYp|rEs2)0dk{3N^kVM@KG?؃¥iZh;MiXGy_ #>UYE1MST:ວe=d5ZiT촺9^n,Eb-[VQ}x&R,՛U]1>uZ0eeZTYA%Te ꦡ,ZxO}/~A5~Ƚ{}8&Z䝻י͎w={#my*&ww{6 p6EUt ^f4Za6]mAh | }`*X[_gbƧx^y{l%nP)EM-BII]6MQ5>ṣ1ݮ{5e3MԕGeolf ሦj?Ԓk'hx39s~.^f`(aA/v\9'ܺES\r ,4xЍQRvWR Q91/\?<4UIģWEnMݐ^tm;-6G ,D8 @ (JÖFZ&g϶rNYxYn' 0AiTSvmBtH+M!0ЍF{%gcZTy^ VO}pxtw}wa#5޾6ka%I3Akba%'ئ|w{oƱl@3յ,d6EѲ˩aH ۷H҈?!q|ʵg6HwL7dwoy2r,68/:$iLZ؎Gh-k+C6ϑ%?2=,9nݸl:& mG B ddi(ݰqfFU8!0 |.Y$9Q4%+uή?B׌eRTU<gY39p\sh6gv2ccF<_0-\de;viNdHHPT[) ,ӶPsl|Gn{ENynիҰ20lytBnKUTU!n5i4s}Ւ .=rt^òAi*$Q;k /G''+!YO{.qTT'#,|Cde"8}J ٲՃhRo}>v T#!ZUń7U^12B5g|/p=ﳽƓ?s?Yi^Ogcvܥj2_e<#vL8OCf9yLVh:gϰut|ßKT,4Khc'sd2vۡ(S`1YOrt|@GД qݝ=Fk A s E-Ҽd0'{Rc,`6[[oV^z%ncA0EIGh]wAXAiYQK/qf,M]qxKFtBJnHf%{ɒױ0-I nܸ׾w c<'Sf)aM4ml!#°dhMwe2))i(cZ-|4 _o<ï|ֺu)A,PJZѯ\-ZhOuӔX7ư$M>Ǟ8>ϗ^~Y+LC>[UJke}2wwv(Ǐ؟um?a1"ޥJVKzxH8 S+}*[iK,%/*M +Wo*:x*zme45Mu\(-,E{C]Ƽ˄ͨV5BknMotwԟ|s6ϲvyֹ\ՙTUNloqæK,8c<2>.)l)i9 =iخcYX$2%DA@+M>KT}'iOB,G-QMK̏3 x=^Rղ$DaІ{V5iЪUUՒr//0 O!-( E>1~ Zg(ss^x80\0t!^25^xsX][cmI8c{[2Z!"̓)8U]v1-iAU笮Sv`>_ (899:@h5MYa{ҵ1LM̰]*|DkAU.kk-k([VcF!*}ã=iND Bq:wvL8k8MMUFeIi|˔dycHjUzAcw(,O(].^Hh3nb %].lٳܾuclL "RGG - .ES-04HVXL@4Ek!{|1 _x4+q|MY Ekh/_3jD 5| ʅh8nc=,ux2Y1-Oض% LC4%4I .ʌ+W.ȕ hNXE Z4Zr|4F`.Y,ضGz؞\Fuvl? r/Jp0Z:!A#QUEa&m_Q2%Q턔ISdA ǠG4 ap[lnc)'GcFEx#5׮]ݻmHk4Mg.ua1o#3,9œuavzZӔ5A?s|pFU?Ij h0{:m `J|!`>ppw!y0EaK\uQbdEc2ߣ㏀!W|kHV%h:}An>pgi@i`b81e#$sYH2!׿{݃~ܹsxA;NdBUt;!keAU `9.\<7xvgn@SklShMs1ؖZe9q-{RyOo8Vׇ/}OGhl+8-rChZdZwoJƒ췶CB,1GGG\2xtamS5m4lnWe8y{B f۹Jhiwo [m(OCYmu]&'SX˲- 0 R~ӦGy.^%i>dSS%RHU!" IDATSXCO A+lJݠYZWy=\/AYVws?кJY3[ԅb>lz݀(ڀZŽ q< 8>>2$^d㵢x44MT_Uxt:fzK0m-4A{!i|:C75-D6;_ \>wGZܾy,]H) iؘE3"-:TUmyn۶9BpmT] P55ER`8+410(ӄ$a[2)eP^w@Qkc6A7d{{!”0ІM\yv1~,>~!/l]`ѧ&gVO?G|>!zonpxxHS6ċ0E;B>+~l1#35eMA)F9903pA;|\3 " H;;8|~( ^$lEvwV/vQ1E>2zOqʰ?︤iNʨ-5yszut8׼o'9m#4hՊmEP9e`) StcWX[]ﱺ:\f-I`^aZx,ʔ4҄d`w{g:[r ڸB IDQLU}q1\ tCcpj||MM+7*AUW!,)E[eS-*C1,nHh)SH-JHAԨF¹,;xG'r2t].mZ/ʲ4ͶhF+>k$ېZuU#[f.Z+<ò-,E&hC FcY&_| >3GӔTUIemȫF3em|"I"^]<ǵ- ɳ*Y\eOYY] ( c0U1X:"Z}myF#fShu6Z ,cfO>$ ŭ[7 [Ν{|F5qT☕U4q8w,ۿ /+qLgbMU4|拈F))!uM4,Jn7dum4ldl:r<+zÐ8B>Zb6Y2 9*Qc[;+ܾq,|?u:|i j,5S2'Icۜ<1cۨFa.MU$ߧ5:[.Q ȂNxXfa86~ ϞEs A`jL@}J@Jb1Z~%hIG'XQm܌0$+A{@ijh4ߢLza@c^e<&kרњX,xkytFV ,ZQm94rTU™hǣYizԍҢ p5%JӺ2PkV7Ts(,FJă:Tu1oo<3I+!uP9JWJqi-M]߻8I]W[rzȡ& ~+4 A[+8ch4uP75jPZQEkW -DhѲF6i=1d 9#O?[/ߨd!^uIKU,sƵ,8'GYhݐ)uS3\!*bS Uȫu !W5rI hٛ~hv ne!Z udi5;Ye(6-+p6uYnp ai8fue!3F55F KkĶl$A vZ2Θ8&eYYɳ !J4dyޛY}<9wWul= `1I"(m٦#P~hR2lGHa)Dx)!1  b fޗvs2yfa舮꺷ﭓ+4fscBw5M]2G!iD@˒nj>9|pmix@?"L}g0fm}tEɀ4rQ55JFeKO?uQATdkk;w(uU2H6x^5 ƙbV̪0F1}g\v# ׷+jE0I "njT: iMӬ"|,=mSCjԝ&0Ï2PG y$6)+@IײF Eml{Ǐ&Xbd$YU 6aˍW@/?"hkz~ki4̵ǛfF>}btO:D>~ a㩈lI8@wmO ND)Zxz>.KܾIHg% 躎kP,3AJ:yڂIEOGQ vQiھGh(L8=d{ e?19us~6*& Ţq6{O]G]ס3uw Bhp!򒦩hqVt}c*b8_ETktv /kf)A%‡$IH qJ? mA^{iꊮ+X.*>gscz8q||̲}:Toӱl* Wv^5 Ms88 ,ˈ"?Wo޸{ڦ'"9#6v"G4M |=>>%K O,S& 5өGZ@E5$qJۊkW0Ë+Ao߾MttM|FWwaMϕ}M|b{6{{dِS%a/pr9(͕;DlH7&DQ{8;.+d1_1;|S?/xu{]GX (b)0{?]u=aއrY0H=^}N[<_12-YaZql6(jG)M۶F^X+͜^ 4# C0"tע{-zdlvq1xZzfstDmȺ=j EUclGO1hbϿaS2YF95C;qV)eG\F'ѴeNA| }E5<ܳ Ǐ999Cy1,҈FlmlP9rɝww f&m1=1 R2]X>鞓#4b\v5# 4]i4D.LO/,?\X!1Ї?N'i7+TmRIC՜MOe0J)ۆdC3UQ3bjјҴMɭwEul9M"|N;C@dYbA,K Y__'SuQp/4%<)%fB&eKTڄ@rrKȋ9kkkĞo3?i|weQfqQ %_ϰYͿ׼r]/[xG`;wkڽ7luj 4 '8FBE_^dA^te׾eKGTUu pdCE rab[{%5v1Zt'R'JZӵ=aҶnq2d6G0]9w\z 1RxB )U߲ /<7@X=Ŭ G}/% #cn>~ @l1 h{ *Dne7_~kW]PyT!EYݡ% Rdh8zkO]cyvƌϋe0H X,CMpQw5WPU lpo锭twh+8lΦDAJo;hI:`0d$Iiz A.wxlEW@Z9E|vJg:' XF`Crtr km޾ǽ{o&>FWU?Xl>#HCJbdE^.9s{C61Z[67c󈓘.9;^dczݢ 2Qa*E£j韸i ze/<.k7^՞9$ }m,yYXe2XE@6AX!Y=F{tmES̱}ǵkO1Ii߉KcQ7hC@7̝*6i4[alzvEܼ:_;xc_c辧%2B?ᄠKΉqDJI')=tڽQ^eR^D{A. At/x+M52؄Du x yQ1|K|3^xloI?_—> b>gGHilTO> O?(+ŜX}Ka! CUlVްp]PDal x+)u5.:xN+6ӿ6X0p~2; O_?M)8!P));Q3bY{h1\BE:̠DQ@SU$H!Waq) +W5VThuz0}]R5Մ~@1ϑxhQEmBH35eUL;4- QP"g'` E=~P'nW ]"HDlN6< dc1R:cOw.oOvYc}4UuE ]aE0 cל6\IۖшhhˆCՁK|֭[+ܺse$ |a4'>Xg#o5eE߷ IWTwKt[",h% }E4M1|,KB'NB$t%+yj78NS!;މ\۶E K߶,sLc\C.~p ]?= @>Zqxt*VIs{C@w3$['qevBӵ-]D>iGwCa<׭$^dO^eۢVaR-e8!r4ChUST-ׄ+.XUU(!1Z0H!=υR(ںkw#4!afjZ/~O~99Q6g,S?s||.m?EW1}!bw}O|gٙ?"fgo8Ԗ7_Cw-Ws'heY6zc&Ze`ژS&I6੧bw{lISڎdE,EcKQpktv){'y }j^νx&J)kO}Ejb/\l:)+ y,.(%𓀪BsgpZw$#Nf#'"($xC,4&B4ab}b^섗+r@axYVU 0Kn9.>/p|7k+=GYE]8B'C+9E]!L>qG!F{]Tሧ?mstA@}Ϳ?hs?Ó䳟 4h:S7k|O+/DpznK||IaCܹ{h1˞'g=z lbQx(Ie4\#sB?`:wz>;|KUĄT=m}G+,n 20ڴăOu o=c?I^ܹ'~e1G T,XCFN*8B2%1GGSԾm{6ؿr,()g'ge񲤔i}^Ayc:Sp9=`h}\8p؈1ӳst+QF%|4Ib|s9Oa :Eؾ#bva^.[gm8=yqrAiz>mu ʓO#du[L>9DVw0_P7%vL62^~|_y]CbZߘ0!ci").QRJ$ (1]HER*҄nۣj"0Ztv(N`1ժXZ-y饗 1}| NSH>OS gKZv1s8bmkbT>Wp6< F tsϾXsC"wa+-Xp?_DH$i@uKU 0vwȲu^&'g˚Ғe[t xϝwX)b0IwY?3)e%gKO b;7k׮Ь 7a]kB)0Rv~ga/}综u竼N=ƛlnmy>zt~}zi'7X8;9vvv.(IUAydYF/r=%ddq6ӳbzKmӣ/P=* $CـVy/] Wi*v桮uJe(%X,`:"={\[o5^"qP5:m֚qȚ ~Fyi{8L"$ (7:I4:ן(Vֿ w>xIL{t]F![Pд?e^dV-ƔM%x}KmOv`)R#/1&&U!!R:M1Ͻo=vk #oo}q+DZh@R[=eq](#ۙ(*xR1NP AmM͵yNC$EưT7nFhBJ!4 l)A(CΩ7h`weQ"Y,O; Ch6Tl6WYqArz:߼&_lr;AHf)bN31n EHUxUH)iց]h.Fs?XHjE{% iy%௪j6Pd6mOSm%%UbqN>eiZCo45>/, sac _Wy-P&{͙l8.O.ٝLP^ ]sM#<|/g!Xd2 UNNN8(՜'2lsr|JInp9;crIEiŏk弦<XB2 ӕ;/ C &ڶF%U> -*?c\Ҵ5 |*ckZeాtTF04m=tI;Q,WhZAX_惯e2JDpE }׺k!T_v~1NF`!GfT]o{M/,Mײ(rZD¸ *K<ںBZ+yYkCỶ((CώXߏ)|6oA YX1SR(i,$΂gZyOI,!KR* Ð1wfۄw!(!d#go;F:`OϗyN%hǺҶs:vK5adu"D mÊ=_QE؏݄ V B^69fKa8?>`(8qtReYVH)ZDJ^a/Z{(. (m7yi:#^IIxG7ȗ3GVRxgrpiQ(NOÿES׿}L|>xO0_Ou!=K2$ Fmpe pZ)f`kKLOsm79/\0i<g笍+)󂶭)j"H O?<6w9ޠ%4}E% 4MG]װU09Ś#9`ܸ}yUu̗3%Kd˜3dkcO!lW/EX'{C7x|gMB'd]@/;a*4\_J'SƣM>o|G;J]XJ)%nJ%|ؾiJ yeeqSkW]t*u]…v%s#Ny5=m0m{NCf4p@9Ιb|RV+\ԔûG\~aI7$Aђ-6n*궤ezF7{o#kv1GNwu-V)R$%b 6,[ C6?A\{%oMmح-5d)5k` w932o˛U%Vq:/}3hn㙟 gi;D=|BuQ(UJ&ŀh$8n+=V/jދF*pg1lPW3ʦ:Qn$gpiyW nv}$'-ϸy{ܽ{䀇E%{s:z dz{+>2\̢$-bIwm]bNEO  Ōf>?# #,''?ڽwN&'l=O4 =ʺ"۰[Q54M`JPiڌºsȥ4MM^xߎ,{bЎQ7iDiPO72ѽqysb$&M0b5 (6k1IԵݷ_#pV(+ xw1Yz29==/Oȋ5xNcJC"FDM |{=?i=fE{EP,/dҽ(쪪b\FQZjʚ82xJ#0"Mrz\Ԭꖥ6K!|+<|p7ƕy'r2կ =|?s\<,ui^fDC6/m3yɪ^U{CRMuF]uB֫jU668::"*lعI/XW8NkP9;Cΰ z.rViAԄNJ >$^*يd֘H,%4hJtc>s_d4pw?{{u<(?gywt~FSh*ׯ$߽O腬׻A@i,uZap)yllnr֓@ x5cZ2[-.B)8N A\0p}zMaN'K$eڡ*-MS(0]F^*5BKH!RNrڮPhs }:8m^N XA ?cjs^$YAm H..v?ld3ʶ@ت"s5v4V.qZs$R.أMh~ۋ3+ D,ΘKKc`Uncggn๊Z.P"I lFUYRMe6)򒺆Ncssg {6tq|Ҏ'kֶ& C0jp! <^y%,V<ASk Z{<7_}ٛ<$t-(pGC U^!t.JG :pxꙧu넛7oF |ț|l*Ks"K9=_ jx18eN' }%\XáR41Au1U% Aإ#U SX,h*ptCN8 %QwQ%Ѵ좮N`l$q}IV.U$֮b0,acç<ɽ8>>Du ɺf0+Qڴ@`!F "\'$/T+# ˩:3<}q2cʪ`eDh'@(Ac#*ć2%?ݮmv24c =߰5ob~Kx{?>ot5G dbs-v.yc iukV eS{5zF~jÀ$oS'vwwY/fKUF,g`OO nfЮCӽ+sC |Pq<KQWhE"p=縿_Zv[lO CF#4XAMȒV)qp4B;eӊϥ8Pd9rN{V$Z(җv(죵r΅Mi*lSQ B|QE?Qtsa1J #JIM+_׿utX&K2(.ZwUc Ey=׆anRwaA]EQ~[ [-,SP}4(-ɫYkW쌇Yf8Cg$%)*Sgo:i4A^elo\GP]^}MuC^Tstta/FϝXpxOX|>lɃeY犢pVP%UݺTUk* 'u|ʲDiqbwnU5%Xs>|؟{ؼ/fF,SN ֖0'geqƀ,uiwh2 KmLݒUUawE$,4ڜuj2(PY 9\XV`H^F-q2ڌtpg ̗g[+ݾ.WGy1%RLgk.n lmmO|x~o)݁Ϧ睻)R8_@;_z뺌F#G9EˆHF뜪D[݇,29Ǡr%z/H$8q-BOrr #r/}=!0Yr:`JBfS ,ݠ^w]=Ռz/h2cQtCzxlDʐ9{댓#*wGdEnGŜ !yZ/ӊ1-q"MSL{|Muϗ4jA]nBi($RmtrpKӡ,KB?hǕErf²X/|!0hr5d5n_ϵKh=8HKz.NIV,3e<ޤ(3^{V,)ռM1 |,A*`;98|)fjEQL@eQY+Q_IH._;g~N|;mONHҒ)n _3Ͼooٳ w;= YQPue;4JHDXI}lw98|8GÏB8Ɣ%;[Ý'~v4R}Rkkub19&ؚ4+q|e%Uՠˆ檤;1_R(s q1o7Bh[(ъӄ`زʂ\v"($Yh(jBgSfE^1 aSM%+w#\WT5q(ڛx4hjj\7p5QҡhEDlvDtqxst: Ok/ MS}Oy(GWNpokƴ'a[ŞSx9ZK) [WXPrOnj}F8f;&S쳟! {?|@R0-(O_*, 5^GKI^PċB/gdYA0""NOOl]㖤EK\@߿Ġ?&O]hB1GCn>vW1G]]|Mogl ^TDw|t.qb6P)#66ԎD*j%^r 2k\9R4S%ź!Y.QCYWuxRCCcjɜlh*날㑕 v"NkHטBi%[dJ$+nEy Q#>G+,9 |=H!Zf+5K{іiFgxf9Ua89b>aX9^"bE'ī0VL'Z\Ar|5aУ,2iXܰTf5TbBZ9-+lm>U\`hLki{OmVҫGiJDxY-@K^{~|7͍mܹ%w.j\ݼʭ;O~{yO r~kz:;8>>f:\[\T54ln!q$Oc|:yc,[v<._zҲ<;Fw?d}t*Np==ϊ|(8>B>WkJhi67>;O"',KNJlS aZ󳳘acG#/X9$YBZR5i8}+=x2]]3('[~]MUIoa=j-dWKMYe;F.RhLՎ}Ryyv߬h_hEYcp\5C-&KK4Ƶxɯ0/*&يמ;eWwpHݗ?#\bM(ʼ_,,ׯ^A=%ꦠ56Q%Χ6"'ɫݣܺސޠ*Ba^!( Vv&NHN=vv6 V:h9wi^JwxI8?^e)?Aqis7`oCJـ'.8Y_hF2{n`q>$XLui>e]wZ<֛͛`B7@}PWg,$4M#%Φx^i,{C I?\vj&h0;c=b/t~e, ZI` EWuMasrȫ^,f44l Fp:DDH A'j U4 )hC\iGE[$duFQp1؀*wBEkt ZpbȈ:Ŕn^ O?C޽B߉a6ss8Oo^bn#j]Ӌ6.4M<mxP!pq؏. 4m6D!nCMur#Y .+l5.G~1{ g_+ꏬ|kV]}m}"YQ)44#C$!tY̖\vյs֫{u#^n0;=f~R]}Rd+C[Uyp|N΋ZoiouEAoյvw!ⳇUٚ*)-ONSI1vsZsIj`0,\c$u>~ɓ.rR!Џ3S̳h?fr(N[r6p݌7{?W\5"3 674K7 .!9-Ԣd0cN=|/h r.P,3CUX$3c](!O \G{2f0QTa#2k>6ţmgw@8TuFY$ gct]tl1a[hhYlEA 2-:t!Ɍ'HXo3R.* rfCW aY+uh*0T g(d|]0vQZfOH,E5ւ#C%a e0oPZCV,"gD|Ԃ4.ԧn{];;Lᗹk圃[ry<R@ԗhlJc*QHi'%APOO\t}TYCFM%tI똎ZcҘ膛xNp "> ?gesk~Fߕ+-u:;=o_2);&jA\gF<يn5 zEP4*f4HN;޵(l5==0魡?[~R/MwI4kފd|. Zj=c@~zWf <=)o^dccH&).!+r"Jܺt e IDAT]!JJ=Ut:TE1-WZrf:]5 YWo}4H ȏZRDk vmo0h9`8آ(:ÒSlCU58`兞\L>}lch JjDK/jZm`'p\*V&AVfx=oGiRke͗~Wy{'DlnHvMEw 3"tAY5\޼CN'x8)(vw8-8%wq}L&h7sx|bF>#$EǸo8Sf9Yeƴh$ΐlڛTܸq}KE;~ꦤ3x/_IJX-F#T$,&.*[|+O}89OLPu,U2q`uKwk@KwfԦUdcY0hVVIlSw1MVklS%1RH*%.Te݂EM-~ߚQLoUNtbܻƧ^/ gӂ4Wi ŹQa֔W-w- KUkB uISsB?(3 x<>6ܻG'xaIS׃]D;Z/Ў `4%sk;X.I7!1{҇;]}PAX83x  {0'-ߦ?{Sy;tEB׹ Y<N9|l}]#,0޺ra6HaiG;l(4abMU%5yViVFmGou MCV1tS6+*PTeF] $q|DkM ϐ6GIB8$vbE#08&M(x'uiFJbxTY,EُG~siYoȊ׆+ xD.ee %՚=`/_R—I,8==E~Kz/<ͷ[o! O NOO_=;` 8{nqyɾ wLI!_z,=' Jf_Ewd~ m]*v<1.y&~wW_{PT9u]2=:B`iʊ(-9,S9o&>$- |/DiBF7nޤӽ JNZ@Rm,J5Aw9 '=gBɋéa,RY[㌯|v9[{/ZOJk+\׽{6 EUUF?[غAmMXCQTAʑe,-DўvMEc |¨͡NPUT5B7h' +Wła ݾɋ/}?l]=Vq֥1eYPے$_ڲ(JH( |/`n'llmk*<SضaudE=,g.G'h:goAYW #hu8eYgy õxJ^$WZ3W\z|ѻVetzDa4LOX+s' .o怲x9::bZDL umf's-Xu54k iWkѡ ^C]jPʰR[xu5]L <7l w$IRQT ~Q˟SRWw2yr=%LOh ۷P%y[GY0%u9< { y>oxn1ҍ0OY.1zTeM Z Ez5Dm.E-׮`8豿K- Rq'Dmd-Y{J!i] G-MӴEE&pl^FmZk'A=bQVM">,-jBZrtpj1#Ҹ7*) p=bLxn]0D&-*J6*p nrB% pjnE :gzLM>M.n4J- d2%w;oi7K j,E`%owx^mR%JdyDDZlzTd|rF |uݷ`6Ya96*?8 py9\,K߿:6EMfC e<&))(\R`ZOZk\"+ɢ<5npڧs8 qLA]ԘCYVfEǍ -} eyD$"^&2 w޼NϿmIkYj8{u?eƖ%Qb5BԺ4tEL*y|62YQk/[lo_U(Kw_pY!U`{4$nmR5s,f W\5%5ұ647qRtҕԵIŝ;wj!+ф2DUyYRsPM]X ̱:׏kCd|X?Xy]}~2}HV4Ō퀔*p-sF!UmLw&;d)U!)sE(ѐc! (k<%QmVHà*"CipyWc*q]ynZJS&q) ijHK$Z- U%=zIs|ץQ'LϦ6:UEb-1ZѰP1 N=곘J0?HWsZt$a8gNC9=+|\"cjKaYZ+]&D 0LztӤAvƷ= -ہBET*0 |CU@3A"Z`E%jqjӓXV8U3AqȲhyZBn^/+ XIny6eSUiuغrx|2FZ dz[jir<20-혴=HY8%,1m(&KK| Bgx^h#Eئ-iK:ũIU&LNf19U .rU2)ȒJ'vi߳>RDa".]d66I6CVۄY4J=w<.$ixʠV6epv6&fj?) "ΗTe8/2 .rqg`M)FFTV5 v(1?mкƵ5'ɲuR )5˶QE1@W,f3d3o`>Ae7#rj¶-:`1gzȯ?"zVȺ-4%!0Lo~g_zt:=>{{ך&V$e(Eogn.hx=-@=b:_cYRkt:N)blqTaE^",6?8{)F%5!a8ئ͗_&cƖC0 Z鶛tqs d^d8jt:=E4vjQ)xticxPT9e-fYHVŬӳhw:TNw 08j)5BJYHƌC(Jꢁ|,р4$7nd.OP" $I0$/SE\Aa <)hcp`>_y+KEeZTu3m!?)~b(u"K+!SUI%Xn=QUMV)TFӎIP%ep0UrVqt=%S͠-jdmf%~`P1H̊mVAcYDѣ1ƶMrrFpU+A@W(imkWDYLM1S'qeXx~ v)U2)UW9MG̀)0c֔H%)QtbyF+Dqn+lAY&y`tK\Brxf$KQdYS+z[;|p.Ya`6U%a Sf}0EcAP-;drx&NJ!)vpmQ*<( $j:}ǡj0mX 2f ʫQsH+"ϋ|q!"bWtQ'4U-7,g\~OHi P# mpay||BXьoyZ"M}ډjC,ˠRe8Wvm]I8~oo~HgˈTT m)KYp韲)!N !Af,snxnn?G>!V_}?qpxKosrr 7Je" ˒1ljjbgZ~ъIQ$m`!5yA \L(gތ$%\-鵇P+V5e^y?~/qc5-$c1_]dc&\gZ0Qd%wヘ% ¨&Ix6mW%Ir:>EjLk|~CZTR%=²,FQcКJ5Q>(ٸ*(sFsLv'hbfgg:b2>s|6FCP$yLqZ &s8rhײNWP:X"!l]BRHфr\YdNj-Q9iTI)m/BY(V@kV{:(T\ta>O1  qM Q8`cHP([)ȒjNߡ^ŭ9;&UHS#sà\$mzak<%pLϕTu]SxMt=BRRc&YZ600m!-<{߮O^TaK_?u2>鈽ϻ%P#'λn 쇥4pd"*ځGU ,iaYQ <— lmm.iRBS\EsEM t֊HV3w3YןWnfoooq-q@߻wӀrMT])aN`H(5 'a70]Z>y uR<+9qU?pIcK 'wERј )4Z PChR&S' '>YL$ɦܺ9}NٌW\#sI+snspz+p]4-ع)pq!Vtvn1.^ X-LbhEhAhd:W5ՠE"F7FTIZQz]*o:Zq6^ö\tmMDzQxXHp\Ӣ{i31k\UXz@Kv50' )o1J'x~*s6N=6yICi<(cJw-Mi `& 3W6[bֻ (3 O'ضAb[t4_KVah4b0_|ftI/{ї't.y% "f4̉!_olRh1<{G߬>`LOcaAUPQ7yQ j&/ˍ¡rl:6/@Aʐ9wՙͯm\GircP7p@^EYiJ5H {+"8D4%B| &RjpħsիcU,O1W-fC6Հ.-UӸ6zՌc,'c:a)nlb>'l>g_10ؼc ) bntqY LG ɲBJ=1Iעrf3,i"b}2DzZZXM5==~t:4`|26]$[ج+(ǵR'!E,BJlI])$c\}L*05²iZ^VZh-vvOgK`4I},19#F. _P cdm)y}uqULӢ(rx*9ϑwUUy&+$eSZ~I^Utm^yEi5Q`屵ќG'>b2a]ZRѰL3T"Fi>B@Zdicb)q0$Ҩ|xMZA /bw&^\mw@YdS6{`hhGS{ Ii}>"2\rՄq2\DUcH2 40mj]cQZR#/i>qQT癖q>Q8OkRIJQ'q+~S=w{V=+Ğ .}k:K hpU/O/ACX~w#*c^~ELjaHtI~q\b9F{{{'Vf+~w|NERim\II0 ±U 8/GҵncV%mTqvkmp!!5v57tLNxQ)uUt$I de /vF$aDU)[#Iݸl9&~p*u¥H3h6]HS%n(\;=l`:f)u|5UHt=Z umolelJZ)ҒxnF֧cj@Yb 3Fb:!qì1MJ:L'ht\|~54>_iƈيcnܸb֊ ,V+v Ft:&Z5JaXJG$9uZbNwT)tm+bݰ*Ilnpŏrcдߡx⼵or5:X fEHAiFGU !6-<Ͱ{<[F>K̕WO<ڿ\צ3*U3n)C ֫np$G F=$Rza–,TRQ*:/H) k{{v^gܾrK(\0p,H{wturpWO'V@;&ޛ\v+7n$|ol*N÷ ˄O^f*K "3FZ =ۯGwYf4 9Egܾ}=8;=v$2մMZvYEk5 Mǘ,LUA%0vw|Sb8 M ׇڣs0]N'=mhL;.{/UerEZ>}nEzM d2Qs7?cnE Moq:}H1(-2.pU)&[{QdrH-O+9E._dzwp{DHXdgo. f[]D9?o5A72n] ly?8 d_2SN8:dskv(RϐCY͹z)JWGCQ7n&!5,am}U 5׾T,1G+Lgp8l1BU&Ch3ky*5ZWZ h`Y|h@ԍkQĻ]2 @\-1uGԴ(oSLN8 ,,\.sjaQaX,@9h" ,6頄B&SAge|f2SʹуL.eDYZ4Bg@.)U򥇏Wnӱy=B}6OL#zxV__DVvΰpﻋ .4&\ Dz7ܤ?mVO5z>A82N\s(^Pv%2No})M^M>Gxt}>'$$q677͗Ԫv}a+ iRU%F)dE&[;g#5Mdiw|ipzr>%k: l\g IΒ䤉(2;t C֤qP9t0Mi4v!4y^RW a$ʚ#]ƣ 7EoiRȸ~E?oo1p=}i9; >k aRT%(o>ƲM/kAMTp<ϣtuͷ=9}o5Bk7>7 9<|D`1 ,unKpm8:Ǡsxo38=;>_2}wh[,9w@?sIɷML\SH.ӐFc|8rg̯~)Yv@ 0')Xq|v&~p'U IDAT|inCCS.o=!q;{nS}L"K<4s'bNQ-Qu`n8O4} O"2]「ǧY̧_-ƃA<|id_bY!w=_gss*"ƒE㗅!pz0$4ׇ!$ n;#}rzgg/o5Pc>ɚڦwWPz}S3g4YOOle |FX>{neKFC>ϑ-wa+1j]ZU." ʷA*$/>BQT W]r14//P&GoƷ}%4AaZ3_IG<|Sc>V`.ǬQ# }lEe1M )"B:ðIiđD%9H1 Z()Fך ٻ2ܿ!UY͘\0&D(ՀY,sBֈe͞,>9w2o5(0pLJ$A$ZՎ_#t$nTw B (T5gw*՚jGTͼ޺Y:Z[Wh EEUeags U;stwzhF9:O7|,b<i*ObWp£ضx{~CD(xȑ*Ξayv:ɄЭ@O} zq>Od\zhn͑2W=I:O=  \.F#ghU $8YZ.qc7K5ʕ:Q㼄*^h'/|E}nlR.{ܼ֧ZgckO>d:W!T&%- y޻:Q/op 8R$04AFF)ȼɱ#8 xҏz+? )'<=Y|֍MպR>Ĥl±mjs^Wq1]F,G۠{D  wdoJWȏ{?~nU(-')|fs" PP% 0MYNLRn*10bhT,Nevvq~eEDQ/ݢinr>x~@&T Z.FB b l]5~OUo4lCWNN Yo2t]Z ѐp*itf7~T-Hx|GH LՈdGB,e%vZaMPCs|"?@R)1&B>qP.WɳLlv7u^ljE!׮]C3 f:m,2 I 8^oҨ6Ej54b-F ;ox 4NI#<0YLeM7t:3[5ݼ(mȒ(˨똦 J'x5n߾)twU|iU_;*iGhT+MP (I]ә!H؝ aA?{,Zk4FC$^m`:Yܴ8M !,.)UUCQM7t(JuX@8a0g‘#X}Ehd20 -VWo'b1m%QaLHAt#Tgy[6u~ S#&rUEcij"s(ȂӑL!uh7QV qjt:XE?4U$Fm &s<Ýp=Af00m1)s{&[[[,,,Pi51$A  Д*Sw4NHds[\=$gN=N@bɚFc DQ-XBa6a rMc4Ki±ȹ_-1qc<]W)\& lLvM{+s8p]܇%?!T@  IA"#Th#I:AsoLoCJeםd 43mY\\ȑc,.9nbss)%'rjY(Եb$ w8s<'Eh2cwlfq~M,--iqf`NéQqߐ++Bf 8AZG1t6۞y#ool: )0\& Q0?P:؝ս[*n]iOgܱYӒqi_* _D@Q S#S,4 /( HٳhT0 )7b2z}5\gK-&<{W7'KE%M n<ɲ<(BCQ4$>QxyaM+zo A v|"UR^E"&WA 4X6ߧXp2D*:^/YbiyFΜfi͙7ڐkkkܼy,wIg*ئtUAl8QQȦqLgfi)?%#q'0aaarE\L2IŔU8T*⇇ɿ;}g4ך5ZX?R]pB!') (DZ{qм 7q'F$In(JEAՊra* 8m$2x2Z h f9nwX[wO<^UjFt8ak}Dz cw ݀ Nmb&`iL&c Х)#3՛k|>):sxϠFF躎唋 },FE> R#M /(JFZ+Ĉ8PTZ)0[&T+$)Lx'?6 B۔đ UZKUZf# |FW50#ie똦Uj q٠=SPͲ5 #0fiaҮ5X%7;R17Vk %B',D3YE6i頑86ph!)lGig=-BUuSbvcE+6/3O=N芊$[;;LSy9JeȲ m{M! . A$IV h)j4aQ[rHwgDɬS>20M$Pu<E$IJ.%*¹ D! Lq,Y<$ 9a8H5!E|c4jfda#J.jaoGQu?z;Sܼۛyם>SwLRnSdiNT\2 ]ZaA뺔+%e9VN&0;;Tu4BS%7f4rej^k5fyrMN&z;]?F\PTaEoZ*(Zgv[Zpz[S9*MD^ -<>H.>>^\ B$ֽ8ii+ƪ{*Lu9a3 , MS ٌ\իcz!1E,O35I*J b4-t(\zLo} $ KTbh&!q|(6.R8d2e,E7U+lmqk:?.)S)Fgs*߻GJJ zvs4v|zʧ,P)ʜp[+71>Iڍi$B1ʀB蚅flwlm 4!bLK%k;1ts|ȯ27?d2 JlnzJ5Y\T+MLz!r4+WuC!MM/ 8-HBESLGǟHP¥Bk H1Rдj10$ئwq ~Y*i#sH Iw}#3 elT3qRug ! ZG}5RI򔽲 2)4$ׇc^煸[ohޔewNd]\= l;yY_|3 xY]2-YY}ݐ}84MLQC(ÄRhHLy^0Avv/P4AcUaL%x^%UUqU{ko[[#*yb)9ϝ&ߦ9!x|7ØQ2ZQLPɒj?UH;@LfjEO?PgF~O@z{*BU0W̛oǨTM^GL-f; r;|E?.;q$M%S,+0B!C'qfd$Jbɔ\&hJNl47C[J0,*YQ)77,./} mV{y w:eu_Sv '0m HUU4 4T*T*tM0 g8ZӴ 4M C {ӽ^ v80ߝ-{;j{iъ` ͕T6J"$ZosAhBEf "GUVplZ]d`y!B*T`gXX^d2ޕv7TM<˲8L5DHrRX&UU &RGIA7m0VF9] m^{tD{t.}UIkarKnQxϱx!+ɩcGY69f!-R,g!_DʌfL_pګoC~oGQ͂g%4jz#vR1=6YRx3jA3Ŷ-^}];1fr"} ; + IDATWnݾ+?qCeqy.jΘjyMm`{o~OY+@*>('=|QLEN7f~u$I4MQU;pثi ʻަNZ\4C!rqQ+b<`?)A-\qBЃVI8IY/&uQxB\;&8eZ1huhg9YN$I@9wV?s Y[[cmuhi [ik_, CR!PdNwT*l3,ba~w.G_E:ߛMy{^I$OR666sVAtEZlҜju6D,dĨoNS$k&+u/@Wߚ<|SF5ܺuMw{>fwYN H #g~0[xK '=)Sh)Nѣ'1k/ a6da$idq|_EUQUѬ ")J$Ȳ;w*~ĒA$Nwvۉs2/3e z#WvW[Ar< K1ONE JDBϑҤnS J\1dO\x޹l rJզTdhn3L&h\^+tLTF woqa6]7$ n&B$Ԫ-/.&KsiH8g#8v //{2r'M6n]GQJN(Ήq>ħ^\546֯27!K2aK6vtloo1'QƑ8qA/a*hXY{uJfרԪ ']EtY_*#wo(cmjU8 /}#4pu4զ9[Gq`7R Rbzw?Txy&Tu]}/֥d{@L"9d֊}M>nE ti8vdt:fe&Q2F7 ˿h<I%j *ZrJg:(к=ltW<EH àZvN' `U<\. 񸐻Q ;&zS(&JV{ڢjsع!jv\|zlnn?nZIT˅z<'8sT TF3͓ywN]z'O3sF^ UH2)Smƻ[~{<?g{? wb7[RU{N*2H1ڶ cJSJZFʌ.I9O=},!|6nm-\]CuB? OSD&!sGV Ӯn/Pwk-G tŦh2ȉJBZ'" $0,Zm[;;(Bl"sAFhFfSL]mz4u$! 8T]\e,-wh4+L>qRv(!d*f86X:  RN9K<سo# /Pdq;M)Y `Nɲ \B35* LS&Q!b! ؖ? S54C U2S)[[[SR#dYL(L L;\vP KR;#&&%?V:9,&}/nd|;z׾MF=_uw^]Yxm H.ʎCF`]r+/!j9sLԪ J,ZSmL}/Vn?X[euut88t:Ų 4M!c,CCHAd$YZ.slq[7 d9NB K⑇KV=AOzokיiJyMtMXy6[,9I{ J3E(~W&| q\q{{r0Aѱm(>R?s nGxM+j6> j(7$+ 1. #)NsdZUcsc^$r0 m!BIpTɍ2cxjCu(,-,=&iaT["5(uGإ2^° TU0q'H<5-ڝj7RI:Z;!R ,T:y2ꏩ+:i"R6<ף^A4fj >q2i5geF1xB^eoI2Q* 5TC&gNkEr/pӴ1 ѱu|eh()8N0?X][aӡȀ`H%KC%LNxQJA&&뷶d e0M =Y HBu QIRf}i(uA V0m)STE# c,F%w[J<>gυǖIѽ8}X} B"ȳ",gp]]U@ G=NF5E/{ah捁=t:z?n5of<N&LZ"L]2 $jFQ&MtWq{{Bd63i9YL z)߿$UUŶm:G^igcc6d8!B@4MS\ץ^ܳj d $V׷y ΜS<P9dl{@5j+u_zׄԽ+~ƩHE(}*FmJ񼺫PhyNeDwd4$ 2zY%O%e(=4EnhδFlm "XZZ9MVW^iy劃e6nySʕ6q r%2"Hen)T&!Є`J yU)U g4HE6S5珠kLIp]vg Vg1+; n`2hZ$YS2IepluH I"LLˠծ`:ބ*TuffgrR]0N AKl9jn0$~D”\I6[G.=Ti%l=Al&^<̴*4A2Mö ƣ-nsSl =ڵxӿEX6<=r$v Za{틠ɪ{oOyO=8 ZpC JTd!_BƬ(4%E>}K0n.]waiijN&B$˨*lnFQ**ape8??Oڤՙ=o'ﶪ`wz?="躦( ͒p䞐yzbcc;+7oot C@v M8R*9R@)69Vvp{rg' 5E! 2MN-7oiǺ^|5]ױufY4q]^Gg8ɨj;qFfZj5E+kޘe215ՊjR% VVzuB71ML˲l,dYFޝZRRF#($Iӧ9wɿ8aks3ɗ_~ϾyE}]'8}$ZfB dNRzMfNW0x*M@=ch6/,{fs$Ja" M#JoDg!$R6&ڮ݉ D탰"3W>wuFx 7=`9IVAm($ 3&1zt~[ݶY2ZfADSKu]Z uTK q!!ȸuM8IQ.lR*1C0$ % NW C82 IP1-MrP$Vf깬鳔UL0P4w:jnA$r0n3LHȱE&0L#5~9iHYVq)Er4soECCɕ4 sa>v^mg~Ͼ){.Ql6QuFΙsY t9w᱿1c !ׯ2[MIKREQX__guce^1xQm}Cd3BLiJ C_vMAoWZC U6XYY^gĉq̣̙3_kxkBo47?4Ʋ3w5WwWwuGDR J#6C|J$eN/1 " JdD-ER"<\p3{é{{_WoSJGWiT2 (SGW-(zEEV;RĎ!FQ)w,5f m{o¸RsWÝ,c#_]ɉ;|h4FNv Fw_?>t|3ʲ|?N,K$!@(A^(J $Ow"LTy߯!=yKIxL^,--/Og?=WC`kkzs!SS-јQ%mW@6x4i6`6AsZP$Qe 4ð $amm$(TAV<3RrEulo`YiR(ud.Q%t[]f˗!ґxfLPZZIӮ,Y\\ˠZ8dH!N񑥢h%vյ%͢aP 48X]LUl,I>pN2<0~Do ebBV,h0ܙ8''(r|]CKR(gcG6]#Y]_eYYZhYH0ʕ+b`8#I( ژh`ffvM6m(64od1^kI^e`Ī -Ò]{7x]ӟq𮲄{;])cy yi gx#_ۚ;5wZe?}gJE@l?VA?8s˗Q2#B$X3zG{^^z W Z,++Ȳ(J0t8&cΟ;s,kؖA W_yk<1 .xOh4Lݰ()X_[cbb)._D!UFaiVi4 Y 5@zӧ51a\t l{.)5),ۦުŁ\ZZFVf0&44z$i@ , ٟ8bdYh4n3js)E_unp.{kĮȧsNyiVDD&_'Ӟߵv~g+/vmSbye_~7rWVԫ3gȓ,OX($(mq( $ ͚$3?wF࿗f]e_75'.3wyǰiΩPeySln_Q2yh6\p(Bu,k,q#Xv2(o<. vgtOSз]:Swak&ܼ !PMoSHLGx x]sfQx;.?;{]7t_VVwm\$(YwN*H|"6Ӱ^cjM( Vfv~Y4c,>ȏm5_?نvu~a_=Ww)_!3IItgIޠȁn(.]\bbfEYfEՄI˿ v=5y٭vթI]wܹ8|]ǰr S~grqTu1zϟT\ I2 a)n#9Y=Nz--xm4qF2&owެy%?>k[^cS[B K(%u;ɇ샰]ud]s3јRXNuA:mU]P~hn-Aac[c"ԐIFKdkT2 2\AF)0c'ÂRϩ2bLnD~ Mt鶎a iƜx,Vba Mnnal%*<^&)f</a&4ӬQdff$4ʄR阦^M6v$Mst`z G:kRDqȅ  )&iS)AJ8ɲ]יjU`SnVD) Ķ4j5L! ("ǿ; {!tD"&,,``S4*CG߷ $I(ra;hT)E #KlyD e2ٙ#~K e8 tD7 8Z;!u$Yo0=;`R5"s1J+Nɳ8<0d`:m LݨQjIDltGc4kMӖln/lMF;pWObY_ ѵӧcTLɲtmQqo*`4M\_i{-ByNސzg* ;rTʥ/a*s3{[E6<(RhI̅Kp2f#6 0X_]ba&:.+gNX} _w͍^!e3|;[&ey#fz1JA 8ZQOuJ'> Z,|-en%Y#exYﺂŠUᷴCn>_p݋$wkҮ c 8*ܯyc^zuZ?  O 4]ߤ( 㘌# q|Pzѓ$ڣN̙3ԼI<(lʌEyMU?.e] ,u]t$Is&xϫ1h֚YZ?86 T`fG&w2?(Bɗӽx )PuB6Q&}05kJok/P)%P„<Ӟ᳿KGW_̩ z}74jMtMﰾzGs_9|@)69p`8bu`rϿ_G}< />c rEo{_,wzU_&;'QNKdR:YD :]74R]p(K4󔕸Kթ3q@4BZ=U€4- RlA7 zΜ?LJ?I'XZHO}y\x(ʘ5vh7G!>1޼X l/-M32uLǴ()3E0 Y[YMl$?;Q1fN\p0O~fLNNaacz6`H:ISʒR)k chZt,_Y"N#$yGdff806BrYbj9(U@L1MfM6`x`˄q?[zڵvZwH ['$ A^dhnٔbgt [8V6[?|H6{Ol''9{ۯ=bgwWy&mi|^|<#I: $enL=L]_0 )˞2'jPIF[TSRyuG @:$0 ]ܘw'Bz%1-Evb:nx_rD*y i-\4];~t_#|w'Γ%__ON6_;\Kqm)Xgc} f1d"hNsKQfy%WBm) JWja(:excWh$Ѕ9|M._r6``˵Hh )c)\`}}>+}逅Ë|ُcM FE ykYZ I$)I!e؋qk56n׽w׸|% +3RE.R3EA.O<8 @m}~Wص?D':#Zu.≧WW}]:B̑c|?ƛ/5fYRzS(um7mD7{[/"p}7:-<(NfM.09;ͱcmo hz!AFe6aK3?3iO4AI`4Ʊ}~YHYPRR](,ХU&nPhd5ypsR(sEF+Ͽ@Kt|0mB1՝bkmvkfӧ$IBS'K*QiH渮,J,Ķm1^,ILh$yD 8!Lbd4cr4 }dhcA_YS8I5Y M]$ߢ蒗)Ju{i zXEJ,˦^dUٖ$'45tC(RHNSL sL`R H1Q$I^ f!4{S(ĉ<{]^G%˫l?w8w57#7`y'x/֗X]s ?2vlvݯ֩+>5(dN'x#λoӝlaM(2 98{ɩ.++gAAY<0+˛($_k2=yY#r4sL RL@GtR$ ].;{LnyKRfU.'uE9y57WrhaSgejf(B0i|o|۔9|ͷ^brpa&F eYRn( Wf9Q8lJ 6_cjj8s4++K,GQJ ͰvlllNVca~nul 6]fV C:F#9xhKt9 -iH1 _3YY@M^Poh"OK >p6vq8" c,m3;;8^^Y@s!) %{tǞ,4 C%1(ʘzv4`ĒdkGeĈrܷ9qexqXPf%OKaRJ%O9jO8d\ɧ~,SJPf9aYV%*T]3obnb)nb7]})ZezF7n^5bTZX$Q<=>}{ {{OI&z՗|c˼u 9~3buK2*E'ܹskXfm,3Bce'y (A~ZYQ _׷QJ2j^B)Q39S[RO} _T>-HHid!/Ѯ7Yc ,5G%\|zH_42tBlFIyqy0O?;(qlm,Bec ٍWBBg=\K'u,n6n WFS  5 H6(o}㫜;&]ֲ 99yBrE-q0ѩ1-aMm4:xHj54eyI )l"JU,Sg skhBnHӌp<:XA"2L).Ghw͡HB"to:NB2=1O٦\>OJP*2L} D HD0i7k`j61^rä㐒8PZF{ge"ex Ӳ#įK|ץu* -'ɢo Ԉ1)M+qq^|}81 EfCo:".) AdqY(B D72ꞅklml5j؆0-1t4%yWǢl;^37ݫݐ* ĞIu߮ ;mJs{'Y5S_!t ac # (5Ie {nanň^pA(>ۯ֧er, Lag^lDQѣG\8f(c(~Cܹ۬sH)<!`d~[]`<(R|h'( *YuBd:wG[`\YZ"Sc)K"' ^|y}dVLocy\g~\p6ӝl357gÐ( Msf&nR%dL( f!#P}4Dj, MӨ]SRg82mc:Qps5$/_biiz郜݉.^(! 6OcZmq|jDL얐qm-I{1Wמ»].hW $h 1hi0;/~+~k~Pgetۤ(s@a(YqxM8^W?y8a8Du(u4%+2,Łwr1x"zvk6zk qlʲ@I믽N%|(e)cU&Ih0FHh7Zd*|6iU!`QXKա3( iNlh4aHcQʊQR a<Q5h6NdyR& iMTBc^_$ cz!eQױl,Kt Ӳɲ8Jٹމ1 ZF$\p2IMNӢ;F)x4b4 IC3ff(33Ȳd4z>Vy !@;A4(ZG4FØz΁ضΥ1&O 6q}Ir),/ ݴz 4g4 9|a\#乢,% ˎg}ܙUP )%o:o SMM;;λ,aY̴u,6y1=,'8v0[j2,m)|c0J7V*'I"t]' BT( 1 Cf<eeY)Z( }AeWogsͯդT@Z;v8:xh@wF1ۘhhju#QPJ5n_M` E2{3ook#S\ZS Nz.]灳pOQiV" ,AڼYg{'T[2D 6SXcLFD xKKHȲ"[YN11/0[(F.=pS^7)o0&؛A-go)ڃ+@;nC-^Rlo^aVهc?ax'į?os(d{{^G~<4q:%VhG/_}}29uQ&lҵ q|>'jD |g:yZc_t<6O,,pgTe)BQ B`˺~ҍǂ7 i}qWyzB,KfszZ+dưRit:FʂVf3h鰴L?TY6AJ1f h0֐1EiJSdV5,"j-FM<Z*coPf n y;um:aB7dao:pc$ޤ yeNSrh1s|~3afxO}?~p /\'vVfRN?NecΞM666NF#Sߤec40mGVx"XR I:T}Ξ}OQkdU Q|q[^77ݿG3͟iȋDIa:y>_ $.Ч(2,-렔, EQ+MjdalvH@ 4=Ny8̓wCL؃SUZ{{փ_Xc-0aox Mq nF`,uB֚9.OgRpy4aoag0a^s_2x衇O?9ylooĵs=ǃ>X.a}(HӔ k׮%˵&wiM YuƳKhI+<~B/9vhx %=,׆ܞKG$qF$c0ZF(G0ɧ1HC 3'`J_ߠ9F'0p6& yY2ib˪t1tiu5Jק09Eai!猜 Sih r#O3ўƏ<4Np])-p5AcEaqqI,+$ 0tgInkyYpW g;>(++.y B\K08XAx./vxt O2 (F+ N&amE(dk*QC`tN ON@U&u 5. tʞ]Νq困`oײ$$D}@񨠧GEixʒl@iMwt_,-/͗O$ZK{l9µKy9nmr5.>U#n`qy<Dv=O4-*( ._|>]2]!c._y^9V>;EZS2cu%nolVqjlt:W]r2u|gI2MmcJ|W GxK+j{W0(q$c| 94ZB>C)q݊ bose$()%)LEe -,7 g쬠l|4αBbmj&=4H E1 ,OG5)+$%r\a*P|1qLԞJ|'pY6xcY(Z!4 IBG*YPׁe0K4ߩA8J x\P&cJ FH&$K }6EvNLJzMq ј?o7eQH[O. 1,C٘3+O5k蠞N⊝밲0b8`q1Uvȩ aՐx+[m#?# N$MO}/|Oxŗ4MchO01eIa<ȑ a:6Cl6'fe1G1(l1qY1`g EY+b&4T7Nւ1ucM{_VvWӿuJ~|WV$8Va_ZZ]zA kXYx{ '1YX]d8Y`eUaa<1O DŽAe%R+NlL -ZAD5b*8"5"\E*UP9(wQJn]N*-I1ATy~ ˜dD4MT "QxOH [YДYl6#2z=H1`x4fhǢQV<(rI;<_^FU}8N4(+PcM@s 3cX,*S"DP/e')vL7Y]1'RYQ#q h4B¦_`q IDAT,y.6 'YZ%F&p>cgg|? Y]^F[ɩC00[WCVV81׮m2 Q0" t]lDy3^&cN ZKX{03bb7EFح,o44ЎVh8.:GU]| *֏H\̘SVH/ I#;=f~REVlY\\`8yBI&iL^xAy UY :ݥ%(O< ZeR4+PJiR%>hMU̦3(p I耑NZ1Ob,C;A=ᇢ,KʢYʂPY;tREv4֖}W)J <* K\@Xt2w|*Z{l;/శz8.(y1 H*ׁ~-*F3 3 +4ƬD9錝g_&j(ϋGA-8ATHu"G>,j! n(bn{׭:a;Y5uO\(^o/^ k/]uԲ=iIJ-c[-4fpP)2f UfG`JG״~'PK4yXZY1'~ǙHC`2J))W]e0P 'c}uE>ǟw'>V z>I<Ø` k׮a ѣ8^.W/qt>ܺ(n*{Cc*AV{佦"8˳B1eEq5W'9w9T9z>HyB4f8 DFA5YYYڊU^y1V$Tn|4GIհIDLfcq|&=I2ZspSVʼ}=bo\fy-$BP9Q"%TDkɵku9u8Y"C%OC"F AG&s\ viF>J|'MRx-Ie JxhY5hvvs$e?KYCnT3%ԥ,g>&dh<&"i1If9i!f>KR' qX?A"b-qCӔ(H0r) hZ6IlQ%~q%vB-qp&E^)Q)i:8k_qb)]Ҹ$ &ڭ%2ǘKߦ_S"PBO߻s ?2,X^^(S!/Qm#`&:Qp1)oSu} qݹM]m7oת-T$Y"9Str,Txy7{„ږ-dਐvԂJlGzgZ9vl^P0yUcJ4P'i8jOSz,t׉C B#w:1-lnathlحi1t~oq:^ W c(zAjFL-Z*LOrY7:'o\聮Oy\ܹʌ%%(ʌf#Uvd<#SF{Cjb4ˆ 9q|UzK()h6CQ i8 aK; ,f kT8Z0hG!6/6:?8n%/sZmѸG\x<'+af1v+dm(a 7ixKe:AQpgc e61F730Ig1GN9)x/3mNp$uSe/~<׮^D3c<:O`Dh>e8s{5)D kk]=Fdjh4CKSz +%!tHMpSAYwUw]ՁYMPfn\VHko\xz]w!17۽]o9ćCBrɫ{ZY4ЪyʱcQI9ĂOQ?&%0+4^&]νv}dJ% r_Kx%3{՗ aBcy=q2ltj 2F IdvX1Lb0 bfӔ0 LIH&אG,OZ(J\ɌʑF TUA)ENi! '"TЁG"S$f<v(+l2( \aw>EQ7nMemhh6{[E٦l1Y\\&K#F#\}4kGhw"v7$(PJPHAȓvg cJ*jAI f#Jl9oD9Y1l윏 SⳞ[_qb<qdc/>Y6.+=]L8> X\젤Oxxe<w)r-^cw?Aؤ0˷qk̝~f^G_y1$h4vFL{%y撕 3<LJ¢1R_L}H#\c@UUF5YV vwٽ%}k[e{#q)׫YҖQf3lxhOE֚VE(2[O'jrtwȵK Sf@Ѥk5*/Ȅ%F$0`86JJ!. $ '%IpH!y= ? 9/1-A3Z4sThs[zY^|G!ng4Hwh[pD= cOBI PEAxl<<&A4M Z-64ڕ@;7N̲;&viu;ݿ~%W^]qC(*]]]?Q+fx{ywKRΙfS9'<8eQ66oM&[ߠHR&Aﳽ͙ϐyɳ^pK^$8:ů^WiS䖪G5F0s zۋ߭@xUZ0 xB(z!g2S8E )?0Xʪ p@CS[ʲ!(, cY\p6yQn8DA@UDQD!K^&6ƢИ2ψ3|킵Iv(KiZui5z>xJFD^d6qT.z6b,YĘ Gi5h.FtA # Ec Z&^`5% W[6]&#l:IpRN-h}-V{|7K^߿FY,-6#4EHKY(mң,'3L} `$54=V!4Z+,%ƈ⺶ݝ. :aw;]rwɃz n^$Et<4W9{ÇA޵ꏶ^x ^р^H; )'O=aa#@_=m:O~w̦|<گ#mLi7O=}+.y!BhVVx82Ac'5@kHDغzy>'K 7юqnOpc. Aˈ28(2k՛6޿M!Jko$RTF{.]Jil%UhQ1 qܐL,/-H'g%[[[xY'4UQa+C6i6 cJ( Q]bmjȭ#h S.5TEIaa^d+)zwc݊%qPǯ>ɵ[A+Y )KG5)MB6G1rrMM; p{s1o'> >W0=#ctgUiJZU5(z('à^(j8Veb{&dEU%e>R>Z;}v6gע ~O}~_}]=?~GG*%%Ukw(˒_~|9%PyY< <)rK2 aX2 x}8s#ÐsP'66tR'ʲ(2\ׯ''oI og &-Y]>xd>YXX"KWL8{,/>M\"*8)VX,cˊ3b><kFH#꒭j2 Uf)x'p%dP$Iȫ2/0iO;eU'ѪENA % j,ٯ>1hw= />r|R[걷5ȑ%$.'-fɸyNZVJ 8N]R)Q@U~贛H!Ob@h.E2d>˸xy^Cf\<">Y|o(ڞ&+y8dU(BJöh%)VVHipZo<) #=0MvzH"K\kP [WĚ6.S!|{aGujgB HuP2c$ W#>c<Ѿm#/FG??;<܋;#` *0Ɛ9k8nfI%t^3A@'-[ _EB$綯^bu;UJG|?cy4Rpi: %C v8}߲ %4gçS .vV,X`wz~{}/z²!L+e}h0V`*ɐrt]74OZxMOO'o||{m1jVSY!>˫0c>q$.AP˪"\bM53ټ|?h^y֦i;=#h0k:-S |9ip#<7C v露t5óO J;9_ݥm& IDATe" BR 'cfr]^:t;q\O}k[<#sxy砬K8aJYԖ/(y{okYv_>p68#6c;R mч 9ceE&nn<<{|8^*V$Q@{߹skshp8ؑ;-ڝhU1%IxH4]ˌwABV YJ!/m ysxnu5[ wEF#tj7feZmzˇzDW$FhJݧn1fTrTmjdc֍WwbwvmɛwIb X9uxùSw 'NKɗ_s>~Bƀfk~gL9x7i:Ӵ%kQ>!DZB| Sa8;tɥWm2¶F$YU6vSUUo"fĵCZ+Th4$M&`\|O1K1cERQ$ J=KQE %]*JQu@4`.*V82Jyc[=4@TEJe#Qk}(2J(aMQ\gؤɊv(jK#Mm(3;qLǼP:i-"*!e6BIFaW{TeGh4Ȳ^kley J;yVgE|q>t}O~w0_k4fȇϽ/m_ȟq>KKKY Y)gW/H) yB@L&sv},b00hZ&L'[_6{[Ϙ/ԋIu)N} 2^Y;tvi ?|@`(Kf{{^yY*%j6Ð$M(%^~y}6%#&ɜh1a /B1Ap ns O/SU(l00 3͑#G]k - ^̙XYY!KKA=Egxn`d&¿s32F/71~# g&ö\9Ήǜt_ "g:!UN((vvv0Z R[$8^#&I}ǤJ N@CHCN,MPXMRU]`[AX4MH a:)N'XqlvU؎R%QsF1N|Bբ,a&i6r*>6mbZBMZEB KH "MS[EQYؖ6a|*%qY>e<1If~N(epEk;8Gഐ$Mn% ,e\õz$gO&궶oku}۳Um݌̝Pт#4E jK4;sW<+M&47d2f{{sx?gNKGgY'Ms㢔Brq^ @qGaHѠX6<kC%F+pxwWLB=ScbϑRa2-mIYJ{ iuWfmn]1Wy_*8i.ZP1,FGrl3 n#w=ml ᩯ?ŷm>ʵKC%RD52 Kash8뻜?oҦjqh0B(|DyT3 S0TeY~Ν+B 4[]:A9qk7+/ߨETeAHQ hEv 6-XZq ظnvh=:d2bss IvtN*,Cc XeTAY*M{rQA+g23*e1eY.9E S24}~Me4c  #V!2瑗ءh7FpRfd4GWkLINRD~JڭeQal֬DJiExs}iG)Zk[ox !*m)m6J-.]}yQťurt:h ,/~u~??ϑ#G'~^}o~󛸾 ^f;"f\|]ͱ[+\~ו̧|Vt^wVG] B mqu{[?kn#[bߞ$djXS{DZY XUU38kc;|xx9o+Ϣ U L`{7| R tNIG>LJ> *Wڍ7IE ,-,AM-b1 )@Ϧh`EYCȋ9^$ xj(j>I:%KkQ[QhtL'(eLqnv<).Y5x=VOp߽q5^z+@Pj5Qd2Z=0;ϷlTRV)aGJ-ƓY1J͑D`l ʐ(2?qZݤ )F-"A/Y]?aB݃Ƅ EH s{[776u6Eyٻϐشc䕋+FsK" ,Ie l+d3'?p]׭k;CGl]3h8jv3FZ۳k1((jyeR,jŔemBoXoLb6`K^*F)BZtz;m_ݳЧx`e-#";b/}]rެ_$( hAǸ[ElXeyB[o]yܹstl2_kWxI"-sbNe6')Aӡj˂3SO~Up| px'S79}4c!qN:%|,u| ! u8fQM}Z0V#in oRSG946̲Z_Ut{1qa:][~49mַa!-r$(2=<qrnlQ4E T{.ecYi8aSumJ)Ale53ݬslBU.4լ@0ft`x^|:iR%4MBEf͉'v:aNassf+di`CUH!PiP7ZE5˲~0eYZF x`Կ_]M9MhF'Y^gsf!i1#7q|ǕT1Fj*=='5 e p=C*i{1}Sk;;i;[l@x| GjO?uy7IW_#Oi!fJFIFkP*on`lR*GZX(ʒ{׍y?びq e&U T~nᅇ0Ak`;kokc|{]}y@+;ALt|$IPU&o_Wrnzxrf4{o|Fwǣg򕧾[ӌd<'ʕK8G7_fm(O>$eYrU_'9w\_`w½A+I9Uu<F-jqe1 DR fH3FDbҪP jՔ[v8v1:6Ec; f2!|N^gfMF&B - ! it]rqEƎ1LCW`Y 1@ƸG4bV߅CkKaUA"X4{0^Z."=;TI|it)绬u~ N8%]l|YgeeѮ+8^؆ MaZWS1^eY֢ ]RU~ޔq]UNPU4-g80Ml]6wc.e.^3$vǏ"ME6.*0òj ̓ z67//ѿK_mskĩjwyxDőP#I#k{K+mN:^KU9vغ~DY=``"'͈*H|+~m_ÇOp=ot[3,P;o\߹R}JiV]M7gVڌMznw !v.R+UbDI)*A@YġG160`0mLqӌݝ1N8a4?p˸v .FUTFS `d^u8gýNb:&Ukت-4Z>lI1;;tKlm#*chl_uc+P%2 Y׉x]A b0? "m,۫[Z1hU )ʪrGUh*Pio^$Ո |t*4A`aHa[+dմYZ;NQxD!jh mdh3޹D=)+v }؟D;doË(3N]Q!͑5پq̴#ϥ١ma9n~UU\CJ֠t-\К)%F-t ׋h"g:srظ]7;a\t4S?8&IgLG#Ǯ!vꄉWpn'e._xOغ6{eo}eJ$%v$*uHu [H9o+?իW{,ZZNa*y޳ cxa.]̡#4;-Vwm|8%)ys'O6a3)!H;8Eۨ[v-UҦw[yt|Ī=q^hQ`AE&!B< -prX304c^Pna6PwlQx AÑK_{ OI*ØVQxܺ֘RQsߦ7>咦)Y2g2#FBQJ 5*]O]&YB&T&خ-iXQ dgwJLN. Tw58RuFIvQZcآMJHs $>T`ݞۺSn-Ży#j}ZyXEK/$4c|HGB6qi] gKׯ*h.qo #b˥d^w B,h-U)( J]R%skFX;xROJ|IFYdؕk/>W{6Veիo(i5" &n-9@`˗t<ٌe06"?usy?)a *gg0$sקh&9KKKnoM2O1JꫯOW9>('OrlZ6a:rMT G -n?wq<?fu>~yOr0o?ߧDqe̦)WnRs1UIYULSwV̓ߋPe]EµEN IDATVz׿[;h0\]dT PM8Dl3KaI3_v>Fh]BSlR dp( D~ftj&39UQQ"KJm~t2'i6[La-` , -fI:An 1rDH)B͙ :-s<8`Y"s|D|QEUmQTkm7&"R9tN[l%mp=T)akw$I;+Eĵ#Ze*kY=زCaB}@b/{> Wwc Ni|\?P"'9Yl >y2$0h1M2"&<|ǧ> B ǃ;xAGu3٦lsSnn ֖Lx/Ac(UTx< f8[{؎CGZLs)Wة\ 2Aq5^}YqkkxX_Bqq8?,p~+,a v|"_M쮏_zKO}lm3 3t:Њ`RS& y1 "Wf4$ FvKH)g}3立$~lq>vq6mgٟSs#||[/M>'OiDM::xkOaY(!q©k#~ U4&cSU OxPGkG1 9)ߣ?w3`Y폽SX[&b+!,c94^5;)#6o0 ʂ\NԴ)kBz,;8y`}APS(*e(ƵCT!Ex.Ge$IBgHz _Ʋ<,RaHZ$ FdFE 4j44 &q=8J(3.vJb6 (KEdk/,jU;` !-R dj{IeW؁B86Uq}^<{vU8MjK, k۵%W7!'Č0(d6sFF*E!z?/5ekysfme,ɫzҥK^[smFm|67,q,:[˲C2/\B!C۶;J)li9U ]ibQ)E#.>iN-p<7"_Of~t0)y6qg;{+&f۟'oqlǏr}yZ_RՖC+GE+vHe^VVVЦv)f09.q#׶_ W}?N{ַ lo ΅|x~L]c;!Sr7/*]x<ܓAοAFNJ8A<c c[DJkOtAzB S_b?0XZkn]c,-F!AZT/|Ѵ{'$@w`ڔ GW|-.\~|^ G(UAcXR<'M:=l[RRTUFVm 2Y֚(jf4Eqܤ* ,)"ǀ<o\ȡ%$!ŋFa#dg{@DA%= ]if"m$SRS>HE:b6hzldV2Q_Vq Dq\uEwm 8jmrqT5dxb?vvo/w'ꖤBgvo2gDnN O|u.5?~R\~<|YJ+ϰk /o0\A÷?qlz Gt.a[$ !D-uX[wY!;ߡVe"L~@|^Amzrap6#):`TРLE"1-#7YY;NU)iB5D5'7(w&+&i>#f5@Up*px4a{0W^#gxK'n1OFJp{d2&ĮO2xK9g!l1DNL-)vmhK&T*C@F@yNQ4¨PKSlPV /Je؞F؅,OpD )phw\z G`c:/_%+ zK}Pzou $[=/@`!,p߫.^<ʕ+ {/~X≛B]o"DZoi_1@cFdz<9ƲżD)UMN:#d`wwthDD"n4peJdcs!\t>CMVNaii((˒(j`I zG<6Na*nr~^|n r_4ɼ[alhi}QE|]!ݥB:bŲ eU`9aФ,,lP!#gQ̘'|KW^&IvfCyJ6->Y aJ 9nl-$iJƤi%(ƶm^|sB m!=&bN1p㬭Ø׮] Ϸi_2MffAm,^Y%\!;b}s4jpTE jΜ~l#O:"/XYj% )R1zuB.Zab)⻵,d:xnߜndsh=>1v?nV+f{}Y^Y#Yr>B)Cs hֵ֛E (k1yϿ򋬬|g;3*'<NJd4 cKE6ÕQy6'Y^"{sze ִKh0MI0O܊iZXV-Bβ[&gdYf>hD7hw[y]\Ǧk\$ϰgi~h?r[G?~ۜ8u}c,9 V>)Nz(qv]<%E6݈joR/1zپwG]Gbd Y7̭d>(x,,U Bx8c͟83]4niRP. {4]*1H?R7bc#vl);d((/Anﺫ2+@)7DY|zyb!4$6Cx.cIL35/ _X$IXmR(e RVL":Tt[>4(WYN&AG}!dHDKÉNng((m)LH-H X6I uxGHT81Ӈjn-lkl6j7l-)׋" Yôm$Zsbq+fyrez*GfDQ5@?B`D I"8hBۭls#ޏ=@~ৌ0GkA%T$G:&ImiX#DXG%#ZϖߏCbuuU/^F>p5.K%Y/C[>`=N4("Vd >(RLvE;F0bl$n>X$zLLiԒtuz( zPZ't:j7iT'ZR6,#tavRPT>*4%cuӚR Da&\R))0lKdU2Y\L ?[/]_Ƒ '(W' bؿW\.7 /?pir1ףIccKhhl"Dض6hۤ]vޕ<ٛ'b{n_T2CQ)%eab葨 el |bbz)At,JY~ئk`1q ɱY:G#7+T(s ڬ=:"Vn8<{zK4ȸU0!'(?jQߚ(~n^\wNhz12{ EM0ı &D-DbSu']5K/S 慟}Kؓ_)ϴLSSSbss+K?A1r\] N8N#%+]LAP*p]!OT)DQeYi=_(QaZ@iH~zUm~QߢV[ojlrjlkXѣGm?6#gAˤv`Ñ S<( 5Ё V A! #^w Ka#}\2⛼ ]L1K%3OݯqRKoq-TTeWVWB%uf+v4+D"MJ2I)N~kWop8b8NHVXvl R˒Yohth'ZX S晙y,zmUeckɑ\]<:RY 8ZN`"NG8QZwlw};u7Q|Ra#D׸Jt:+ ~@K{IƵw(BNp"rW~=&gg}?ޟ>Lcsq3h4XZA0;;K$i8|%@a`jz"?$m`'c}]0508(R( vP!PTb&/^… LLL066F>G%"uPO4bͰ͐h۩f7X,ɥ`ZNCe9 Pʗ0 +)|][ݮNÙWW7R.W*Cx~C̱chܸ}c5~eұǴ$"S=t Eu:XYa/A#5;}-.lnmOc m1_;=ɄN}iqz rIB6~ &nf\qb2.\ӮsS|pjfb:&926^'?yzWfJTk792{ɉtx/(d-^<"+7;;</'z6tfG31o~Kό y JJ$F'b25yDe QTTm5lC]"V :S'QY~4-DQB%8J?!3%K;'vE1knhox}4(qDHAa'gNnR14ߧ֍84m+ƑȉčU;/^Rvd2%J ( ;Vu:cccqLQ^8_7T4Xf1 }V-b}rq<3~!J n&b˲FuP661 R#A#dl]i&/ -lj#1p\cb|j~_ʕ笧tX4], 73wauBG8G$n+dE''IM e5FVV^k{OKCH=4SdHu:u'v@QI"e= CB!@3oSNSNbZL&CaRf,&vbeDEy~#8*M$JK=YųԶZT&2?V_~y0?wk-B01Sev~Hbz cgb}-PLQ isuL#e[u<7G9$uO8tzSRy+p;͎pz h4$]DZƐ(C@Oߠr}HbNM/psmLűcTbĚW/ٹC/vss<7;MZ̙:ԩS R_Hj}s}ضM~:[KP(&ZHàH/&9(IyZJ>WzVbb[6a33sN1==GTN5 |TE}z=eQ)NRD2F̙cYsy9kϜ{٬3?7#IߣX(Wp]bHZ%WgT*mlRps,a7묮\% Ct"ђ@)pҰfv垅L^.C0n@w8vlh Э] jXӴ@'i0e2&c6p< ߏ$10dR1O\4ԺR^aSLtPzoxmzORoXۨSz<0cGA ~jn|‘'W_͗0<]M.7F?L2?\JWŶ(`D mZXFl6GIF%?h٥0w[ĻDH-غjêt,H )# $7i NtqH[d+1BA,fqL?& j;Yy߯Kc㟪.]P^y ?Bo07wӶUVhlסX.aX&)dR?1 I![!8Z!Z'ضeQd&cC&yZcO]~]gQ;yZ|iJm$ƈZcJUEiDkm^-+d/]|so wZgccRDV}"ri{v njò`c{ڴ,~2LMAlRe)3Z$>X9uq>~ڲ }av7|(ȸx Z$IJkl*>^"n޸[dm}b "J&'rxn7#ɓ(o,^v:]* Z}s\];y#K'u)M$3I*@X*]`@>KÑr[ "̐#&` ڔZZZSͽ _xgHӣw`=6l¸)$o dL9AIBbÝR@D)e9#Ic /\'P!*b0^a䉧>yϭK^ZʓO<&%ạ̌UL>cbbLz\L&wLF6vXl%'?wM~dR4MlۦE xlht0+PvHdHz($&:u W@`:'M0 (p!m!Hw4v1abwMN鷲k韇Ǚ.ۀAT+CMe|V)8 1mAL<zn8VriR@@0 #ό 4Z @iKwܨ}7 V]{ +l3䓡Hif1$@'1:LT'mDZ񢠽AԡeEeYXGMHCRh5;z <^AxO޻{)/]'X[!:6i$Z=>`_btN_zb ӄ$d p?X9AjkkG4[X& G֓DQtM$qHu0 N! ]X_?Gmc1|IN8iбer} *oOsG!#677,Z[\,7QBQ!vʡ U)F !$UҚXɐ0FF/;~Hb_`l/2`>hȧl8} 4O3ݍx'|J)Lu=,i֨8A0 C$Ӗi$qeA?R2M0-VKڈ5M-=~Lj`!=0MS# $I$)w9myyˠw Єu:;A1KSRaCKIpJя_ѾLwdM2?͕TːhT? SΣ!%RK$db ۶9zAf߳? opaWW8{,ǏK͸005^&PDAdrHi/vuQ|\yPvֳ<N\i C7pri2Ϋ4 ,m>W\ŋa?=jrceJՙ{=o355JVopZՍry|ʎ4ilҮ60:7ZM9$qU)@&x mw*:/O oZ~y_k/u>~R9R!RY2nCz ef:[$A?B 8|d|:tq ²]g =Ee+<|OImPZ0>9V|L@RWV.ӋRw]w?JA!AWKbp 1vO°j!|8}x3Y<7GmC&\0=0|<:`ٙxK'yT޽cyG1 *딫Hv(m:g_!Rnsz2ֳ4@jn~n~ҥKi fuu7^yiОK֛?~;IX@$)W`S2)BD1fP(zg=#ҰY/~/\g'@x~;W>O66gtu:\Bf~v۶:>E>_$+R,W0 v8X$VDiS1$V&Ɵx׮\K(T*W#Q|iE "X3%=44gshdkmFJ:ha" A õ|ɨ3$DIfiGjha:; wk>&Lj]L?d|417{Qڝ0GLXz=5M#ZS$fʲh%B EcLwxD"DjȪ52A nenxKJ]]wSzj j+$JjJ%[a.e/467֖htkT&K.QپI?JA@Z@mA1G L* K/yJO?J ?Ͼ+6}駙a}s80 &kD=6kcY}+*?;|?fyu}?O{xX]ʥc`ԝjy_ !0X%c[ܼN#p}'7LLQ$-p֛WqSǑ  qw!"C#l\ ?J jK6% "|5Ԍ a[F;w={TH6YPa걦Bp8h0=AE$Cd' ( A$ؖKFMDtƀM0FxWZNfr>9wȒ|7l7 P)QBD A &fp;Xb&.q\Өx23 ,_aum8Pʙ~~'Wȓg >kZR(diw1>P`:&ٜ|v贚\tÇs 'CǥT*;t{mx,ҝ+Kۋ;8sOPbeo:οO;bu5|I*xj|˲LZOQ8Ri[hVKXNݲOJǛkiw=ۢ0;KX$lu٨olȌ[ ~rύ,ˢL":p$Y;C/ܢ__8q X7]bDY&bI3֨8@DE܎PR"KzlJV6ڋ-^UjբFs>5licJkbѓjs@` 폕&ޓŢ0Sﰙ{2|m3a"@6ZDaHkpA<ܩxNC.p n,vibo˔L"!@u<XNc94j U+0vMPml.G\rZBqjQ6L0A{i2Y$%?QA$%lu.e[-1yP7QѰ =4z |)Isѻa~VݺrUKXDctd{ffSNO-+ݛܸΝ!%fs9:@kDienf*nnJ eY]B "w)>DӠt1lcO,Ѓk. oIP٨3>QP(|ׯs1~^ܼys)aHkc9icWg_nn 0XXn6m.RJ.; ,/^ҖarjYləi*cUY\N>ajfO-%JUʥ*[\rF3#3 '.˲,NZ2=5ūWϞk_{Ot M˕7ϲA&ar IDATb'OoP6-Jc47_˜zq UiGǏ0-:Acc#tJm02h)1=p! wG%ށ v gfz REw7^ͻ  m3\”i*A' XĚ l۵ Ku[+t7k;3V>:jK fxE@JFaZILxNۣ\ A4m@,&*D*MZ-N›O'! 1992An9tScl5xk٘X4VvV\~Y/pm:1ef)lw:G>O Jbr3+?C2VV#c1,)*zc4Zm~oyf~Y13;Kfyy^DZcwyG/^`}}uײ#`Yu<AsmClPv,]\Yy%µE 2`ktNtMI$% L $ {J'1] MھT{`6[N!b;?w.5H;'wvh~Ǐ|ִ^6жi5}ulPİ<4&n%^wd-xW_ؼ2y٤gDz]p]4;vfsljrYRѣYˬ=8ni?@7V/UOR)P() dY:Q'qhAxL&mDA(V%n|2<<G}8i}^zU?_ ꙃ;=5=;>N<ε+[~ϙڵ+5dfǧ@ػ"zCJVo}^W7*e&l ,!\]C`6IЊ3LPYZF[:w|e(!cKB"e d$*Zw ; [w.rn|[ٞd--wN۶sMa#wۿǝ[°Qi1EoX&*\\{E vk$xu$Qt[$q]:$n ?w1:ݘZB!F^zru)JJo_±-r4[{s7G&"{1kkk:t۶`kk$IH!B! ,i~A \ፕgmO:-]klu&n_n6)$y`58bf: .\@ g^~:/~ z\cxr2Jh4u<{Rg_}3LOMO |~b&' rT+.\@#?V!k:tZ-L၇ ^S)7`'pVG D+B-@8ia <0RkهPAPz8Fvsylnp4o{xk Av|-bfP϶[kS򝶽{tv+!@W8`߆8`P- GFdǎ,pb~66Lnԩ7L |g(DuT;mn^^'L6V@ JR8Xn[5z|ƣU/g0m7YqAO{ /Z?X*yTLj/|.eԥ4,IKt{c[ S+~ \dž>eZחnG[oEA؍Xb91V*-c{Z㳢³O4y71M&Ï/>zUT( 3 ouϽ<}qI,f}}Jm?vss}bZ_u3:uC tZ\A .MiL&5iDA!AS4T;=fDv41GӵD}Ed]5 LN't;O9i~ l\&q1ZQuBdcW[ⱇ|it77ܔեeJb8tp=)q?2Lщ nlXN|a)3XVےtc}+˗`JA\Agt{-rH%jֽ3s_\$L8ScY! ChԶ'Ik;wK.a!T*(S/ DQu}5llvh)'8}~΍7ǎ믱YdnnXqӿ( ǎlw;!82]$@RWCCKVlڅn vނm)}D;-6]b4oN,[cu+]K3=[v'0;/;@KDAznLCI!p|(ܷStۆzǑωN}_g. LKjOE8G7YZm+ESoĜ;wN9,jZA@t0]q|ߧ3>6.חn3{q=='ɩq~P[`K~{Ej[[TJE "܌ae??.IxV?=;5ů4R O@LK8NT*)1DWs˿$ Cat. [[[j5:~dee|| 'T*Q[ԂNI-01?tM+se0 '3>} )zN"ϝ#7Ge зIvN  Jۼܑ9dhv):N@kLB)$*H>HY%tUnĐ(V,,)8Y755C?9 d y_ſ_y6:N0 0e˔tzMz[hiYh{!K? 0 A\`zn,)0uũ ֖WiOO~Ig`;6k7GscXZzd._:G1_b"HtBP>{ody},{F $ED/$H*{NŶ8I9UIE䩚$5I$54&3LRf,$S7H$ wo~8 :ES½{>:h Cx^^->|W.꽽=J("pl0!b5phyR)`{{s{E àP(&xe\ŏB0d{{4iR-$Ip]˲8~(2=ݦn_J)O2:pq8PJc\ڇq9cF}z SRu$3MG1B+lJ 8b4<'P+n DnWb8YLɿx`zyMaJ">[$Rol a2#я'SW~OO"c?n`M4-r~-n @dXfB݊?`(8XuQ*C)EBq&ʒdJ<(YJ0RXVB3c{⧚B.xټM{/3GTck[ E:,NCV0)p\a S9z;~b!qeV&Ʋ!w~!]rӈ 32!tqK[t/0H6"|c-mU7rqm'M?NW%do M?=}빓y֧&:w)<\@:H Er@@ 0 E4~im@=NiN.rN-TV'އzK/èiZDF UD$$̐$Zfy\]p G>o\>N1-%a8Rq}bp"$ylݼg;^/033 BiJʥ"bJpi `<R,JU +A6q itA&Dl ~&Po6>⑯|4&MS>j!(׉YV fضMǬ59s01q0e/!NT`9}r:]EQX]]E{l]C~Ti(1(*`$lmyE']y?sέYDO h54a<3\*YQbv?i& `ALωu])z|yŗGA4bP`<P.ɲq!&^N$a}}L9|>-,4zkt?]/wi3 RUdwvJE 7+/绱^W{5:e$:w8pFa+2\Z.uA,o2}'MբUyQǑ'R?"v0tNo3$!So>;7X9 )Ł^chHE8KQ'!aZ4I3l,BN;L)~T{e}"~L ISUjQCvm$vJԪMT!!0MiiVZ1%b ѰOR*z|/꿞zW yJOg/Lϴ:f8KG#R_|U t M壕ƄM ڍjɓ'Ak`0 rz+Q,)Nzm۴Z-mUFEfzMQc<죅 zC_/E}:{gcTIjqX6PĴ QzU+jy;w:QGQ (`:44dv+1T!ʐ A7WxcJj`:Sh?FXo;?n'D=:B" q0 6JpE0rUi'S"6?۸E8f~~wauu_~9AHVöml۾-䏢qJ8 =66e\Jgoq"m._dkcGc^U`" 8~AiY>ұ;q?p­r单Dnlss{^0"A Dc^DZ#"A vHk-FتWB}5Z٘?J ?oɐ+u)~ٕ0Ph9RBPi:H$ZŠ gL9}(ǏL]g'0 ?C h<ö-ַ!㐁!EhtP*%BAi4 6^Rr͘p賱ʵk?9by]5wt8 o0Lʴڨ4E$b,EAk>==J.\=@Zİl,KS*ydZӔUŰϦ^&DlB&gxH\f"jBc4s14տƲ,.]D^QQ*PJv+4M1qta86s)$cu]6 )[;,YīV,,fiy#L[?P1yj}__첿OIM\EcFTbZN^!BKJEh Q2 MB"3 aVɉTy NbNr܃렲!B1Pȃ) eR]oiM&no3RTZv> Ҝ *n/uaۀ,"=0L4PJ!qǰ5^"(5` ul|[+xn-c(3v7qRr d!i2f48BIEH R)>e%C*۶_8¡^*[TkM: S04u?r;ssȉXU/ß^۽׿gΜP¶<)AVSZ&"6,"6]իLMOsisOri[l1$iae@%(b \mZGTV)ژp$F)ЦnB`u>cnݮHI`S @ Ppoغ؝5{s)v$Z􁈜jhֈ8 s.@JA54SX1,4HZ%~qH!Rj "aOlol~;/+{ێnwRG\p7 Ä p@faYN@` 0ベPT(&@A}Ƀ ; vi6L5̓ J$O@eU/MfdYv%ElDIL$9ILeB ;L&RT*&Z8Vt Y/Z̘نGͳ}MW;mUeLFOAAtw^EGNlL;!q8 tQҤ)^n{}TNZ C^}E 4$a05fco,ė z4 eCeb%A>Z,NV' ~ 4v׮133ߏi8՗^z~W^yv¡<\qfffmM(boob1m J NhH,,,0'8vꎿsK?kzC^!k16Fi;u'vdʔ$af0@c#>DZ(Yo`"U,/4Dx0 :CM( }֊v0ɔTY^=)<̢덃۴&ӯ2V&i>A)Fb";K3yY$IB$iު,I2b?m?-b2oئT6:"Gă!7V5K4KM.#.:ˣ_W>ye9EģBzQTZo1[Ӣ\+$ݽ\;YpJ2z=)ab$aTJeImb&0#LQh)m9666vVPo ÐW_}'r?wrMF%'& &DlKܼJT\.l6 4Y\\|v4vu˲h4xs=G#(BBKOZ<FB/!>soow(;/~8k)۫VgPTK3l.~ik)SV](O*"1Ĉm9Ic,FRc<# :^R!TV#GШVTY٤0,ȳт԰_+q@4=jh"DtJBk #7|,&۴1R6B6Se ,P*Ae v)o%"$)m ɂf\{[_biͶɢ_|Vָq&uTHK? !X!XBԋ[r2]7VxodU1\acsy/reKT%WDBBFT^f (=,310dksBS0 MZi>O= y;;;VG=+*°?kW&$l y4k7\teJSʕ+8!r_"M7f\,?֔䎣$1H~Ĭz(3dlѫ}AȨ"1 R$ @l2"A)uQ$ lP.ZdƉYd˼aHRfBNuSSu{s4G$I$Y4RX^ ?#x2!c,)61t$** Y:&uHOT ,.zJEЧTҔ9-Stv6鎺}\[5St\Xwn/~8,G&W]!%²$!++7<}>.]m9XR#j3r2if*e0ꔹN:E<"$)Skԑϱc\zJ?g߱{M֧;W1&dyEs &DlK4 ..\H ^zio|7oeYmj:qALMMi/'HpAn =>s'GW좹$T9wG^}Zg2L' hڄ"mR1FQy$M $QFCˋE&J €TD*%QF*EaXdRd>M !C.4QZDBc ˫STND@!ͼ%,FaCt:Ē}#X.`-ټ'kEEXU(yeBk IJ KZp_ΉK65W]a[n ?Sw`;%-|WΉF_{$X*X:!{7+.c?Y՜FgIQeXK5ItL4ĭVϴRo6h7\|*/^$ #Zʳ}{՜Un޸8R*E&İu ozկ|S'䝧 <Ϳbss%fffackZ8LOOseΟ? W^Z}E:1xGxgMx)V=f1&[4C%(.aHX%G謏mDT.U{ x8[0w /FDDf0]C R0 T2Ad":KfBa"8oM T *0u_KPu]N{{{QJ\^SL |xإdKƣvkv=Kt c?B%S" ׍) Q8IhSt Rb&>m1l2UQ-|Ð7wX]ayON*v ;|T , akk'zgNr{re;Oǿ8gN\g8JmZ6cȰ6AJI\FHMߥ:RFYXXXw:4/=08w_;H#Xr5LEpa8 yXa`צ0Mͭ.SUPRӒf]*E4c..GwCE+ (9M,1ƌ$RdAHDdaPPr]j3m3-yfz= Y $f0'%M08(?Rw%ڗ&{{[ _&Tk4 ˿G8%JT=%ߛR("BHJ^ްaDYi1@%)J 2BKHqK<=~E閛O|cHuz?Msׯo<(L^z5SiבR.Vk׮ϲ9<xK|C}WnSgLW.$hkYľBiTla HӴ ep1*Q" 1>j<~_omeѤ1u=:!aL$IFCGBp5._. KKK y>$Iyj*/<[;Y^?bһv5DŽκǤ&O ~4ɰ M2v7IҀbI`Qx^vjͣZNqGEqF \EcS* ]=0N(zY'ḳ̘p*X_2쟮R\bnn?nMWi17/_^-l( dS9AVLh),K&f$ꁍEr1qye$ll5Ӆv|Ts+h8hU oU%Ή_>U$zh A' ;;ضM;b\iH))2aB#@J $ |#´$*MH@&XAvm mߣ?C 5+N?' &Dl ^wő#GU'jru:.W\A=yajX__ƍ^\>w- Kuwy0+:R6>^yYHww=(T m2E!- h&EFavZqMB A Lh;:S4{)y6%͍u iDy-Y|V)}<4f~~RE1*0J S E? 1 A w1 -Rl'Fkͨ?X,"4 J" \./J^ÒS;2QJݞL30?/|TJ(Z^thW̳ķx?8Yd N0L+RJĩ}T!u D&J'xiiJ,#N# $N3z.rZA|q k=7? ;;ϔSMv &Dl)Ħ,~Z@@c3a?PvZ Ĵ((ѦZK0RG0Tջo|^5VhF;9s?#} [۔6J 48tV w_Zω+. 2)R1FeIbHA9Xdd& )i4Z%j qn>rvcO0!bL5_nԧ> pZmLDIGpLMAF˄*6&^wт/D,HKxW=baηn3+/LŋI~hL, S<?H r)Xh4TJs3Ӹ¡9LkB*g8#M[OV ۭ1ߢRkzkn޼h0df??Ъg5|d ΐRɦRL( X>a;-#6p]0i4+]>Iw$J$ ! IDAT֔IKdU=+R*qK;oU8M0ۉ`sy-:m=$_AJ]rٻX_[hvn(JTe "3; j4J1MC?{wu{{{}}i`AHD2$˱+rdU+t$N,l 㤔E %SH ) 1LLϾ}ɋI2- wU=Ϲ9zϜ+g#GOa,T" ˇ;K.c`kshD\^ 2u7}@G._4'Cn`1HruEQPt *&H.dkYTYHf2n3Ӗuhw[du]贮R=ĩ;߇]A_KL]Ux=wp{ލ'$C7 rj!pmLƢ^ao؃р;%IEbckt:F/(aH !vx(tCAg4R*d(-MP ;L&[DZMԝlRF{S9.r9i̧|>O&c>L"żtyVWWOX`$b+"jhW-Ç[>gDӨ>/fo_2qYd<sGV!V(I|$eM|o.gp Ce99PUv\DYs6xlӔ:hıc7S_ v!!BAB,!\$9xBzy(*qGٸ ?'FOT* b_gIVE2kkkHDV#Yn6WȞr'i6*uMGk'rrM*e5jK/}/DApڼnBȒFeJ1$EQd-BK-)̼KX;OY(J uLAy!$ ]͛1AAm&E€JVQM*s {2b )ߢݽNݻS$I$оϜiM(gs7_HTU'N\6CYzydM UVдI$uT\QBֲșb g:&ϓwCR{;=}JO=, |Tgk9 wv}V-߲I]x.L65!0H"SS~H I sMi {xlIA,?i5)k !p;1siKA,zl\O@$|A'p=J O[neqq|Oq_;&L'bO,T $ j/2{{{ lO,TꍲvFx겾Q1?7(833^kh~wE{L!2iдȏbATtbJ>W&0eE&#Έ0+4Wu鴺EN|o@tzDb'4XH~ &BK,iE, Mp$IҌup"*Kr%2Y!!@ BF!0ߋ hÇ1\fiib@a~~jto|\ks k}Qo[|'2Eg4e,,Ш!XXl/RDa`04MQ9RX7@D^|A[iyll vy-^z\Br%TRIݩH4+{2% 1B0 ١^S,Ol8_~ β&1um|G(`21Q q$rpaLFm|b;=xB,PcQp0J,GOC kS'|ma-I(&If" (YNK' QH&d4I&6&㩋"HȸMg|9RͯxӴ>ֱmA 3;XJWwdkk3-rE\e:2R}/v2v4LISxe#c1ߨ`*x}"A&B$Y@W-=d*J^bvv|s&l__5HEMt#!W2`XHTR;`{>.33&~$I!1NNõn桟;eL l!]8=lg xCKELST]?8qLC uM֙v[wTwG[ə/S2t8%4W4ٹ,5O0D cŌ_fŬM8XLd A ¦,躎h&yDQ[{ȚA(qL{goGds a  UrEZ2 lY(܀0 NYKPl!{6|YK#H[}rէN'ISUt]eu}A,Zh] n"AȪ6.|}k-,퍸A=EP DV d, Ls̾[Nc(JX**E/OOO9_@do' J+Gs3\8 k >Iq{.3"CE$D$93q1hQ)e#]_9K$(drepoO '"Wlא4 Y5;Z1_xXDY%lcj ^Q4LGuk1?w݌ PUŘ8 Vk#,A%I$3fwq]3gv1a? hY>t wiuLzo>v{—rm.G!bXyWYE=c2xd,ˇ;14._bN\^jmIfVgjLmFA\A@5,[N;ɷ8J"kN8 >ce@l DL 1a(  BL(E[c&>2KKKEHC3cskRP%KIˆHd^)J|>qB  +Alc @,Fa [خ8O;q$!<dEB]@4$IžL L^4AH|gbeeν ޽L, #ڝ[} WKU#>w[ =EA3xjCrv@;BU\fohDQDR0L$1aNPDR6K)DH!z& SiK^oW\a}}FATCRfiw;TU=qǏg(LGcLu*i8w E ef8Л\c2Iw)+'ܸ@ &M%qKkbEgW%ugl? ŜEâ(6 MӘġT)Qc r&t:=JVv]G;&DE$5F)R 8Ё|!l)PU2pdY엿ln\\mP,d LlN'TޒoVVuzxWMg4\.$l"*(L>_`:!/_ #.n]!0$&SC̠ǚ)bu/~sJX*z -mTKefkuTA2sۘYibȂC$%Աh0eudB6EQs1 " C&Uϐgc=Rmټ4]A!MP`I,t;FЏzH1 k?,ٟD88ꨔ{#1;A@? zN($]4qI2IjG9h"2կ22a1B6嬆;"KhzJFT!#$9"$!ݱɚG)dgL ,dD9ۦ*d4FF,+|J,Ks4f2yu=#(Bj!QI;_>b2L&ZV%]LA,z=l\zDQ$뺬Zf<#2Aq]wrMGeYE& D$ Q.W 1DQr}4bumryG\_Ƌ=܄B+/1Y9L{]s@)"hGCDKm-u7 ǯl7GcZ>(2.b:l.P{M dy*Q-( YI" C(Gw'-5D"ήn$Ww|sRd a> e_E>O3 XZZ`<)*A#*{t98f{.Ǐ Q wIr ,,99zݭH#e* bgr۶N4j5t]Np=7zKX"a=AG$&4ff+TU "N$0!ڭ.[6?!>6 I%p#fE4 l"X=g?A~qPWLWϒPU~J',ԙ;t w"^YE(2ebf3ܸX"_ VH\! EXoA$@V'X$oh1k]L1|{0O tUӷ?JR9Mz8 zu~BLEQ4@&.mQu}v3s==JX*zzs\L!q1J Ieи۹[;!Q5ALbAX*lbQh+$0HS'&DLf1jLTCI>gP6,KP48ɗʜ8y;B_>}]a,AZ+f~kw}Ǯ=61 -S&a@R(3:Uʗ)gTύC3"."br UGu*,@*@6W`0#1puX$48lB QY*EhF8PR9KIQu\Brx>;;#έL'1b"&1xBqLd,Qk)U-BBHx~3r{ۗ)J . Zlvc͐fC3y`sIZ/ }Za1CTIyO3c2N'# MainZmXV~?[2ix'5RiK~LN?Ret:eYȲ? ik@3V|ʰ boLX@*  q=eM$BHY޸C*{/#'1;;T+ "4'P{qaceK溣#Sȧ:h8ϥkC.E3`nn*(fB& (Bם8 i4HN>[^9#6(/'$ t(ۈA 2&裕\m]~ᮻ#zo鏛V1ݩ4Rovoѧ)!d6 GCX:-s "1|D\Z7c4P)%I:];$a+DCk,oƝ|6~΋y,/S4MZ!8[%VOZJ՝MG*S5{vrvPtH )L$4=p*M-kB74Y߼7ƛo" =98H6#TUGQL0`c}=n2c; CE7TTছOfxa orq^-5Au_K}m?&2By0kiKA,z=wy.{rD]ױ, 0 >B$C)32#tid,~&NBcd$IAE ɀF|ـIV.SoCw>4ׯ$Iz YBu7̷?|U˴o1 1# }AS v6`O&F;YLb΢^lB3ȅ/9 3u/d<s;M_3zqq7uTR7F;70 q3hwY\<>{/4fY{>}>F #k)&#Z.A]?8o8D]ZQBocnق?LI?N|o0lr675a;K};npC]I3_RTA>Kgo'xt "aj2^0LGΰ҅KȲO!2A4XUU+S^^Tȑ5Mr|j՟>;O&3ض}PbuEwZ!,TMs/`eL-lER1z;mAipNx=T E&M$4E$I&ؘyQK77P İw}`4IhIj[Kif~Z*nnn#vO~CJ)9{n4б{ 3b0f3{ATly( P5 M3PY::ٌ5 e?򚞟Ǣ(`c{CIưuV0ΚJA,롳oq1H[6~BP?VLu5 ln|xpKkqLP&v]TEGU!(#*A; ! !;Zg}a_n\u ;LH5Y>R3 ,//_o<Y:#'LUF\צRŒ%,@4GCjz# 8XƌFΜHHDַٸd ^g~o,(JAFQMT=dbyk)g$qua &`7b bF\?t&e< ?|1,sKyq(VA=Y\*Ϡ(Emv(Bl}l)vQވo~yJt[؝ N<%gZYYX`~v"J)ﮮm2 B߁$KU?%Q13S%J,$@=ܠH`rmG9޼ K/}V1q|;#c!ڝ=|\o)Ă¡#=XTxgÿiK{g*TMŷ rVɠjN8o/ptk/>+h&s3 XY {R)3Nys\P~T l-У}kl8 p'ȄM3`wL9іdzϮ۽]*M'h؞O0:2?HƐi"糿3 -޻J$IHdRiK^?2M.|$8utcugzOA18.~e=FE:}ϝnX5+h\ MSJA,zs^T<Rg 2a¨;"Ǥt8Ǒ[DF|M˗zN3!b&AY),q#FސS7䘲\o+iM J.r/LGe]öm,+ˍnNȞLFcBD$i$[:*%YJ}JVȗy(8GdO:C*3sK'C<Aw'qǿ̼ 9n"ER$%JeS-GN R j@^ZK&)Kِċv,G,j,r6ϼ=u%NH!?'^y7yg D>VJrMM:BUUZ&^߃gc?X?.j)zhh o:"&ɧ3Օz=: r35u@U:]n-xlFSGlఛ[=X :?ݳ?T^YEHxg W<؏Tʡd]`xx @dSy%)zNLYEƆ# EBHbo-Y<~MdP:.Cc&)=`8jl&'Nh{C!nݺBV٬Cq5@MlNVB"c{@kV5,ei78-n+dt.cr.FEOKOmh jlj*U_CPB5h4[e"A"a7.vhԚ*'9̌B{W_Ӿoq tZm (t].XyLU(ZH\EL&vM^ժa(K쟜atd'|`qm7uXvS;7ob1YhRmz\EAj "7Cݠ^s.ǎp8g+k -ըa0Fs9H! 7Vڗ%1r,C~I|Gf3?0K&/u=ZAgg'f01}4@;2fSTEn߾L.y ًf"_LPU#4yʵ Փc(Ơר2 t|Z$V R ql[/Q)bBłN#W.4Hr~^lz<iV}A*:nRS$Ǝ=% 鰵K`|tCalb}z>̳ĖǸ'],Mm1t*y, rt]Zm gWru*4d V#8.lV3,;I~ EO? J&~RBXg"!ǤSt:-6zz2p(R(ָt*|AM„Ldn{4+ fA*fecNfEG6-.oE_HSљ|ac]:(AF!>B{D > N<8W/_'?(B}/'>%|5: !> ߪ {{~Npt([ws:˩Lr324DPc(YaDhˣQkh"vGd1?@j'ݤP(`;EcI! q:7ohL'O}ӧO31o$=bJ>6=we'g`EoM,WjZoyWcQn#LG\H!W4FhVjnGq+(] =l/GZzosӄ@'Iaq1-,'ӼiݬgI(ut02d}'Nj?kl]')8  y=z넃!&slnTֽ12h4r>ҩ6=y<E ,̈́V27ӯt^ՋRmY^^Gp:?:L?z,lly ;^̻n`29:7M,>! qߌO!}.n2g>y;1h9,N f]C0LTz·G4vl ~ӛ*hlx}'NL$8[ 'dm=Bh$'OJ ~AIDAT+!Ff٪`P{/” Y2hH$B٢/jlo6 >/W_8{4{tf#c X)bB!ޏnm7iTje\N]RtzU4O9ubFF#fBjpb2MBHB,S^C[jrb3;X[Y'j2A&i/FglI=&sm_O Q!EL!>Ǟ`>LFۛ:=c qi /Wܼs0&14LhR!H~\|Tqꉓ3e zvQIc[q6X4ܡ~'d"&XT:Bʱn3cY(K UF#&vfevnG<'gÄl BlmmiH$W~_klTv[nh:LMO2BHoԣѥ&g$"&{vQkTBB%UU1LZ- C!EL!@ħt]ͺ!"&{jjKm9/"&{I4Zz=!i!ޏ\_!wY]iQ% !B!B!B!B!B!B!CB+IENDB`mu-editor-1.0.2+dfsg/docs/make.bat000066400000000000000000000014401341747546300167100ustar00rootroot00000000000000@ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=python -msphinx ) set SOURCEDIR=. set BUILDDIR=_build set SPHINXPROJ=Mu if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The Sphinx module was not found. Make sure you have Sphinx installed, echo.then set the SPHINXBUILD environment variable to point to the full echo.path of the 'sphinx-build' executable. Alternatively you may add the echo.Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% :end popd mu-editor-1.0.2+dfsg/docs/microbit.png000066400000000000000000000500711341747546300176250ustar00rootroot00000000000000PNG  IHDRRVsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxU?ܛ:bh+]E)"]?Q+ Qj*@HwLmIy=y 93wf>sΜ9c1B!Q]B!!IQ!") <B$ewǎ%"==:=-I ɓ9pe-KVPDtĠAn݂]1;HKNfc K47`')`/W,8/ %J'BN~Wfhɗݙ^/Ӂ|/OsZ 6qA/dfu$AL&؂ ؝;wXK4…`#.CAwGJK| 0}:g`0[L`huyA3caڵӧ~f/Y!ĉ[p&.A`T:= 0&oY23D>]B\Ann.W_5M]B/5kYqq;Z\(ؾ}|Tm%i:#t)"+Vӧ_n"*5Ε+|i{A]~~>~ji? LA[BL;wk6y#|5j^#Qi;GP!O|M{Mkt-!D:xNu50apc5Bcofv5c9rD(Nk+ <60^s骫浣G:/޾-Y!ңcŷkt`*Uị'& n-MM + ܺ%w@c}``)>yPY PȿR%;!0d0|JN7NmIRs%x̤;9+vs[Rj*NroWJ, LؾHk=cyMlo'Np%T~ݔJKCXJXٺLjԔOE_8-E ۿL+:ʿ)Q%YB5z;.IUV? 3ܥ_x8?aݨQ]#P(r?[s8s:浟v5__~8_?~Dt__KCHjݶmSO9wЩk:THHp98` ~ qVnϖ-ݑN]v:}zӂNz:{7>/(/|8~DaN1obKqH(,r[8ViK\rݫtXX^ɓ`#FF Ӆ#%/[ǎ`7㮰r(Jm+0OO[SV6h^3޳Ӂ-[(OlSۗ_M5Z~_ ̿GBˣ#3g[4$e"D..xXȹƬusOmI+-l?2" s>[~eeD\\&$% PqenY@曬{ѡ5gDA0q"u/.*л߼2"XqCu?3޽@U{ǁX;#p:|{8WڵٻS[ ֮mnR*Q +wy)Q;YtgZΉ>tc`7nsenj ]g$nJ\&YCAX`jmLEث_n[`_?iեKVVVVZ E~mVZZʺv8}Rrgj^'c#U^7`8^ }{KM僉-A1>n]8cӟZf`س>( Qrd c0`ؔ_?O|}S=-qfV?,*ڶץ.^jj_.s<==q! !!z'N@ii)z!hiD^Rb9,9B/CtX}TtrlXVQQ^{5ꫯ֩S'J,qtOq` JUU`\q{饗XUUeͣ&6J&%x>% b۷ :ΪYII }s=bcɓA/~G1HMyC+p#8KQIt(57T`7G];W[q &0VFf͚4 6lu(YPO)&n]W'hn㏇1l~zT*B`=r 5Qj"PСdϤPEF=<ءC|A`b-Ԁ%'=,_vBX?mڴHᵎ;2GQ'J %'=bo χӺ5 ehCѥӁZ1Jmڴiضmf͚;vP/VZ#99N)čXd<|"2M#8J5ԧP(P(LGܗ?^z!KG~5 :^d <OEC;B<|!_ӡC!C>!IV㡠C!(>{M"7B!L_xđS*X|9]7n`Ŋ * yyy𐴵;v_"??III$={bϞ=(**Baa!v؁IۨQPSS#'.Ұ-2<<}ŋY^^4i0ae<$CT*ֻwoyff0drrrȑ#ȑ#YJJ ۳gS*222EԥKVXXcnJΕ,-?7%sα 2R8c ,`$'%KWO|3f`1qSNLѰpQ{Ve:uNHH`%%%n@v92^O$y࡚&OOOVYΝ:v4 =BJ%c:N_BB{zt:]3HJy{{3Jb111O>aƣP(ط~V^-7J撤g* :ڴiôZ- ^eZkNrJ~8AЉbǏg۶m~`=zH6o=X)P$ <75zj׮ӡC!G1&JŖ.]ʊXRRstЁ 6ܹ`ziZjNc1jʕ+i.Jg*S:w={p9s&;Mr opEM ZNc!!!ߺukֳgO!=Lӱ>}(ɶ%I ,[F鸓5koÊ+\,ś/RSS4xĉ-cǎARa͚5OT*׿DEEh!??_[!HӡISԼIT+Vׯ7nS2Qꫯ^g:Qٳ5aÆ{<ǒXtt,d-YV;3: TR0Έp&R L'APe` 5ɱst<4+\ *F!4KcB_GgL3ff*jRw(B3Y $5Ͽ,_NAB6s&0(DG&w[9m-/gsxyPGB_z:<VVhPUoƠe}TVCABӣpaME7 < t\5tB1R5s9BqAA@yܥK)B;KBB!C!DRx!H!IQ!") <B$EBhd* wV F#j11z ?Pk򽚚'J{`UԜ///xzz6z]AV;q5xHyxx˫R`!~`r>~^?(JN45JBg™IzúB T*k׮Edd!9%6?>.] J%wQ!j<`֭F-wQ!jS5k⧟~4Oϐ!CP8O 7N8Ab] ]xQ<BKC!DRx!HȀ't:E!1NFcv :uuu& cM.E(e{b{&^.zxl)#i2^/3AȒ3Oʖ%9  2nBƓW [n|555|2 PQQ 88[FnLΑ *j$''ԩS(,,VZaHLLD%$x": dqơm۶"0pq޽6}wƑ#G|999믑aSg:pcԩ -G/ӧs[lk0k,B\ٳgqF51"##< ڵk'B ˡ;h4|_Z]ɓxi^BC9vf{!33ǖtæMiefeeaӦM-ӱ}vj5V^,O,x9b~E@qmXvGo9d੭޽{E {Amm(&[|e7oĩS!MbHNNv Ewq.0Dibɓ')Bd믿V\\lsl٥;u.]0~x( ߿/_n%1V\\lo^!KΟ?/'22SLA@@RRRڢ8,Y9}]kXrewe"իW$ɏBjjjp-Ir c-:Ǎ3[lAhhڵkhѢf[6`|BOOO6lXYVV֒"5w9$)qq,+22Q gir[xz)(Fs7k-)RrOBWWWעL(-XmQ 0^s Nz"5/v[xxRRR0{l?~Y iI$884RBE׋9G^Zcn?)&s+ TtDRRZ4:JJ{Zx֮]9s !!gϞG}ԬeJK+WD0WP߿1937ۋ}%+v7wh45oW#uKJMMŚ5kpW^ir[ԦZh IDAT⭷Bzz:\{CFi2u&Y-K.#;Cnn.󑔔pE[Ctt$yuܹŋgٳg7o߾(((h2[ܝ:^.  588:tp`HKKÜ9s+V1ej&!D}A^^>}x1|OP"qCd{?~<"##/v233;w\BBOqQ/ѣGv3رc#򽽽1fAXtp1pGԦM 0@sC=_:' FG7nnɓOc۶m(..d &4xޞ1dvxo^zaȑc * K.Ņ  Bdٳg>>>XpBm۶v[f۶m1w\AгgO믘8q"&LyQXB@1~x]+J̝;[Ⰱ#gŵǟg٩t!,, ݻ1f|?Cb߾}8}J0`7έG(۷/k׮Fiii2r.]`8y$:W(ڵ+z!In9gn]z&I΀m0L/E\n3qEp:“J%?k DD#GPqq%ߜ4A(@ROǔsNrsHAFltq?{rƠ3c|%л7{ ;J2Bi:  8{ڷ!8.\TgOʹiΝݥrrVN}!D::8LGܼ֯fTTx֯ >0ƿw !19D16N޾m?ϔ) TD0|8M5C!ITA氤$`$߿{=9S!G$=cyIۃc@X}'"uC!ұtGӜx!D:׹@֮.BqcЙ3!#zBkp6B!!IQ!") <B$EIxyy̙38{,Lk.dddpv燐FGhM; [ T4[c7 wj(8 F_|;w.?~D?˖-Cuu=555bW4isM%)[J3yAL Nذax J%y߿{؅K.زe$5B1a^+P(9s&bcctRz 7|M6@sFBdDܹs˖-s=xXr%233v pI|kE"6 G\瓹u=ӧOCՊ^VGaÆa kv+))ɓ'qTVVJVfg#F`oEJJ N8Z-YI۶m{6o_,;v 0 q#$$I۷cǎV1-9OPP&OJQ^Nq?|1;w`Ν8sDtxxx 11cƌojQYY N<<<__c8x 4|}}1i$ <o]]5"??Fs1PQQ]v!55N愆GA>}LըkpSqB|7HKKs^Raܸq1bT*  ]uu5ۇ~I؏p{̙3\IjZk׮>|8ڶmk.]±cPXXVZ 7 pP]]-Jֺuk̛7mڴz`xx8 ^z qadff"$$D1`u떤hz9s 88X؆zh߾=xtwpQ ""Bh`!##6l@i|c58qjG>|8Zj{1?ǏGii)"""N¶mPWW'Hcǎ?>ÅCyy9w#F <<cq1!**{Xv- E)0e9R80Z-***0gnݺI_o>DGG駟"//Ϯe[߾}1wm^^ƏI*,,Ě5k* RشiN>W=&Mjpoۘ9s&:wܤe]t ۷oGtt48j?9]vWP`ƌ=zhѲ!((PYYO>ׯ_oqABBf͚%ХKL8E˽tv!z[n8e=Z/0f 0E=vN8Pvո|l_,X}oNN͛:h۷oG^^xEZbb"N*7oڵke2ưuV ZIII__:D>}:.|7o7WNN֭['D \w޽{cѢEO~~>fΜ.]eZ?f0'Oenј2e_޺u _l㣏>j󵵵qu>ᩧ}'l\,_\8TFFo.4ѕ`ʕN_4hfΜ 0P\\e˖ -E-oVnZ| .]d0iBBBsm[^2/hxb!H̝;Aӟd"MmtF={ĤIWXa/_.>>>X`햇5j(lZXnAu^xEEE sεkRk߾=;݂aɒ%#)Xp!얇%0< (_{5Q:.6m`ɒt 7By34x^z%a'TT?~1O>ppggg6R*x嗑1ڶmI&5/WPP,X@.]0vX<0o)J nڍح*Fjp_b޼ys-sA(!!AeeeUMٳP[Ð!C\|ԨQ]PPKɓ&͘tDFcL}ej[vnqqqBaii)F)yƎ+ݻKuׯpTPP KKôiӠg8;v(JKKEkʣ>*4UvY*OllzbY닊 |g86xOuK{ݻwwݻwjeY/܋0\A#K\8uinݺ @ǎe)CvP(+~)ZСP{Wl`%ǠAήZ\'{8111¾2dbln8)ad+Gbc%xyy { ɥZT*lQ9YqWvYYe9EG"snz^g% }Z<)44|?^$f˗]H>|Xt:MRFvvdEm(;;[+'NDmի&8r"""$O#_|$y1ưcwTɺ.q 7n,uֹLi[`͚5pa&Y+Z3^D>pl{O|jܨUV֭Q( IUZʥh44ZJRҳ qƹsD믿v+PQOx[{0Nԓcrrl7T*q\~]<֭[і/OOO:u n->L/oU*<'N}[lAaaKTMuܳgbǎ ''q߾}v_ .mP1m& 5k4ŕcӦMHOO?S/VM 2rHe߸qæsڵk5kVSc >l燉'mVJNNFaa!`ʰw^xzzG1Ǐ͛C߾}M.K`ǎV ^wyK.=oyyy6M?qD\t;w>| ;v@ش/cȑf?R$$$SN&?STTd7obx駭~}8})%%7nܰ/UWWc׮]`aڴiPT&?w9K.޲e c?~<-քѣ~:&MdhZZ 6 =zҠAAG9ѣеkWkÑׯ㡇ykj5VZդNBB:vhr=?6 M>s[TWW̙#LTOtOGRaСfwӧO]tСCMk^^ ˺z*nݺmۚ]VmmM($$׿0|fOUPPu!<b…;p4}ɜ`|E;v9… ɱb c˷~-Bn8uT{q}\,qB2^S]v:p`IDAT~Oc8s "##Ց:k44ODŽ l;{,<__fu4%ϦnITT>;v`1bM;|0RSSj ñuVb̘1۷t:޽iiihժU_[>koT aaaؼy3j5Ǝ^zYFݻqeDFF6;gȑ#j AV J~~~skqZj۷o?FUUѪU+@TEEE(--B@HH݄RDdd$^3gΠAAA ??F@@[\kooox{{ԩS8pz=BCC zTVVUUU햚{1PDDD:}6oooLj8alKxZ NN3^) @@@*M pb>ۤPδ B!C!DRx!H!IQ!") <B$EB(BB!C!DR5d!B߿/_Fuu5BCCѣGm۶ >3৫:uj; o{z2bÆ db 7`0`9sfяO< CŌ3dZp֬YF ??8}4f̘!C`0;{ѡCaY1}#^bҥK(((ELӡc ֭ٳgc سgnݺE,mpuTWW]WUUz ''8{,^{5aQboC 177yyy8s ^yCTBx'ϟqʱ*_~ ZVZF߿?uVk׮Ayf6]d>3c oFJJ .\GbСhӦHks7oܹs0 С,XΝ;~wddd;,i?3kʢme'{N^h"s=C tL>0LYYJxprܺurz=҄WpTVVUVx{:t(.]*Lqi߿u:dӾhi}O?={17ٛCǏ +OBU1_U:,lݺFyy9ʕ+`ATbΜ9ׯ̙#4'敖 SI<HLLD^O :7n?D]]9Wjøq`0+x1xFի8Þ={M`NJ%F㐕e2šONNEFF8DGG 3k޼yp3ڴiz?0&L z;}6 88X8! 00ELS(;v,ƍ{W8t:3ƹy<.\on*fgs&+** :uB֭#<<jZ-))i'/Jﰾh4xM6 vH̄z-hl?AEE4' WUU@O[nɓ' ۸o߾HMMENNJJJƘxZnݨ3+//Z{437lաC,[㣏>Bzz:N>&x1 Q;$9TXt {N@atغu+Z-`mPܼy3VZK.K,AttYSm(**w%‰Lx3dJ||<ؾ}{Yma3>}1aȑxk׮޽;8CUU͛Bx"c¿пY-._| jL6 Ν;T||X{b๻!6ca5cLHVzU 8O?4=_ > ^x,^ UUUرcp5T*ѯ_?p+WNhfܹpv%{qطoPQ(PTh48yeaԩk׮ٜ7c ?cv)hdOv턪QRRz( jI rqV^-&OѣGT*1ݾ}W^c ݺuCDD8C>}5;v :233sN3'N@YYahӦ pڴիf?s( 0p97n\kOll,~)bbb N}СC:3y05M T*fΜ5k11ɓ'7چ @rr]78CV`Fs˗7xXs1,Ǝ1c4xO>D[ 2\zjwnvb*H<ܧO5ܹstROOO?ƍ^gS ݋hghڷoŋ7zq vv|O>X.\V O0+ :P-%b㛶 âE~/hxB!n˖-O.!?{-.!^zɦxyfa4B!6myM뇏>#{QcXXP64Ę>ֶƨHASh38q{qaDDi>7G#ߺhEQ'EQ0Iizjn|>%`&A@ш,q8p: IJRhnL&V˲,r QCAfhZ?mf A^qmP(7 lEA. m.,B.(nRD} lƹT}X\.n?lۆ8(J$)^#}q,jv$2bu} bC{f<8OK`_ make extraordinarily awesome boards for embedded development. Many of these boards run Adafruit's own flavour of `MicroPython `_ called `CircuitPython `_. The Adafruit mode inherits from a base MicroPython mode that provides USB/serial connectivity to the board. Because source code is stored directly on the Adafruit boards, this mode ensures that filesystem based operations actually happen on the connected device. If no such device is found, the mode will warn you. If the mode detects a device in "bootloader mode" (tap the reset button three times to enable this), then Mu can also flash the latest version of CircuitPython onto your device. BBC micro:bit Mode ++++++++++++++++++ .. image:: microbit.png The `BBC micro:bit `_ is a small computing device for young coders that is capable of running MicroPython. Mu was originally created as volunteer led effort as part of the Python Software Foundation's contribution to the project. Just like the Adafruit mode, micro:bit mode inherits from a base MicroPython mode so there's a REPL based interface to the device. It also provides functionality to "flash" (i.e. copy) your code onto the device and a simple user interface to the simple file system on the device. Pygame Zero / PyGame Mode +++++++++++++++++++++++++ .. image:: pygame.png `PyGame `_ (or, more correctly: "pygame") is a cross platform set of Python libraries for writing games. `Pygame Zero `_ is a wrapper for pygame that makes it easy for beginners to make games. If both pygame and Pygame Zero are installed (as they are if you used the official Windows installer), Mu's Pygame Zero mode makes it easy for beginner programmers to create games. This mode provides a "Play" button that uses Pygame Zero's game-runner to launch the user's games. Two further buttons open the operating system's file system explorer for the directories containing images and sounds used in the user's games. This makes it easy for the user to copy and paste new game assets into the right place. The standard Python3 mode (see below) is probably a better environment for more advanced pygame-only development. Mu ensures that all the game assets required by the `Pygame Zero introductory tutorial `_ are available by default. Standard Python3 Mode +++++++++++++++++++++ .. image:: python.png This mode is for creating simple Python 3 programs. As with the other modes, there is a REPL for live programming, but in this case it is an iPython based REPL that uses `project Jupyter `_. As with other Jupyter notebooks, it's possible to embed graphics and charts into the REPL so it becomes a interesting to read and work with. There are two ways to run your script in this mode: 1. Click the "Run" button: will launch the script using Python's interactive mode (so you'll be dropped into a basic interactive Python shell upon the script's completion). 2. Click the "Debug" button: Python mode transitions to the debug mode - a graphical way to inspect and watch your code execute. Because of the overhead needed to start the graphical debugger it takes longer to start running your script. This is especially noticable on the Raspberry Pi. Python 2 isn't supported by Mu and never will be. Debug Mode ++++++++++ It's only possible to enter debug mode from standard Python mode. It's purpose is to manage the execution and inspection of your code. Clicking the margin of the editor toggles "break points" that tell the debugger where to pause. Once paused it's possible to inspect the state of various objects at that moment in the code's execution and step over, into and out of lines of code. You're able to watch Python execute your code, allowing you to discover where there may be bugs. Once the code has finished the debug mode transitions back to standard Python mode. Create a New Mode ================= It's very easy to create new mode for Mu. The following tutorial explains how we created the Pygame Zero mode. Create a Class ++++++++++++++ The most important aspects of a mode are encapsulated in a class that represents the mode. These classes live in the ``mu.modes`` namespace and **must** inherit from the ``mu.modes.base.BaseMode`` class. If your new mode is for a MicroPython based device, you should inherit from the ``mu.modes.base.MicroPythonMode`` class, since this includes various helpful utilities for such things as finding a connected device and running a REPL over a USB-serial connection. The naming convention is to create a new module in which is found the class representing the mode. For example, for Pygame Zero, the new module is ``mu.modes.pygamezero`` in which is found the ``PyGameZeroMode`` class that inherits form ``BaseMode``. Integrate the Mode ++++++++++++++++++ Mu needs to know that the new mode is available to use. This is fulfilled by a couple of relatively simple steps: * Add the mode's class to the ``__all__`` list in the ``__init__.py`` file for the ``mu.modes`` namespace. * In ``mu.app.py`` import the new mode from ``mu.modes`` and add an instance of the mode's class to the dictionary returned by the ``setup_modes`` function. (All modes are instantiated with the available ``editor`` and ``view`` objects that represnt the editor's logic and UI layer respectively.) Update the Class's Behaviour ++++++++++++++++++++++++++++ The core elements of your new mode's class that need updating include some attributes and three methods. The attributes that must be changed are: * ``name`` -- the full name of the mode, for example, "PyGame Zero". * ``description`` -- a short description of the mode to be displayed in the mode picker. For example, "Make games with Pygame Zero". * ``icon`` -- an icon used to represent the mode in the mode picker. This must be a ``.png`` image file found in the ``mu/resources/images`` directory. Additional attritbutes with safe default values set in the ``BaseMode`` class which may be of value for you to change are: * ``save_timeout`` -- the number of seconds to wait before auto-saving work. If this value is 0 (zero) Mu will not auto-save changed files when in this mode. * ``builtins`` -- a list of strings defining symbols that Mu's code checker must assume are builtins (above and beyond Python's standard builtins). .. note:: When creating strings that will be seen by users please remember to use the conventions for internationalization (i18n). Put simply, enclose your strings in a call to ``_`` like this:: _('This string will be translated automatically') Please see :doc:`translations` for more details. You should pay attention to three methods of your class: ``actions``, ``api`` and ``workspace_dir``. You must override ``actions`` and ``api`` (see below) and *may* want to override ``workspace_dir``. The purpose of the ``workspace_dir`` method is to return a string representation of the path to the directory containing the code created with this mode. The default implementation in ``BaseMode`` is generally safe to use although some CircuitPython based boards may want to use this method to point to a connected device (if attached) or a safe default on the user's filesystem (if no device is attached). See how it's done in the ``AdafruitMode`` class. If in doubt, just use the method inherited from ``BaseMode``. However, you **must** override the ``actions`` method. It must return a list of dictionaries that describe the buttons to be added to Mu's user interface. Each dictionary must contain the following key/value pairs: * ``name`` -- the name of the button which doubles as the name of the icon found in ``mu/resources/images`` used as the visual representation of the button. To create a new button start with the blank ``button.png`` image and use either an icon from the `FontAwesome `_ set of icons, or some other graphical device that looks visually similar. Make sure that the colour of the image is correct blue of (hex value) #336699. Please remember to centre it within the button and make sure it has the same sort of scale as the existing buttons. * ``display_name`` -- the string displayed immediately underneath the button in Mu's user interface. * ``description`` -- the string displayed as a tool-top when the mouse pointer hovers over the button, but the button remains unclicked. * ``handler`` -- a reference to a method you have created in your mode's class that is called, with an event object, when the button is clicked. * ``shortcut`` -- a string representation of the keyboard shortcut for the button. Valid examples include, ``'F5'`` (for function key 5) or, ``'Ctrl+Shift+I'`` (for control-shift-I). By way of illustration, here's the list of dictionaries returned in the Pygame Zero mode:: [ { 'name': 'play', 'display_name': _('Play'), 'description': _('Play your PyGame Zero game.'), 'handler': self.play_toggle, 'shortcut': 'F5', }, { 'name': 'images', 'display_name': _('Images'), 'description': _('Show the images used by PyGame Zero.'), 'handler': self.show_images, 'shortcut': 'Ctrl+Shift+I', }, { 'name': 'sounds', 'display_name': _('Sounds'), 'description': _('Show the sounds used by PyGame Zero.'), 'handler': self.show_sounds, 'shortcut': 'Ctrl+Shift+S', }, ] Notice how the handlers are references to methods of the ``PyGameZeroMode`` class, the details of which are left to the creator of the mode. Mu simply calls the handler and expects the author of the mode to know what they're doing. Interactions with the Mu editor are via two objects referenced within the class: * ``self.editor`` -- represents an object containing the core logic of the editor (an instance of ``mu.logic.Editor``). * ``self.view`` -- references the main GUI object through which all display and user interface related operations should pass (an instance of ``mu.interface.main.Window``). Please see the :doc:`api` for specific details of what these two objects offer. Finally, you **must** also override the ``api`` method, whose role is to provide a list of strings that conform to Scintilla's protocol for defining and documenting API's to be used with autocomplete and call-tips. The protocol is:: 'foo.bar(arg1, args2="baz") \nMulti line\n\nEnglish description.` Happily, various scripts in the ``utils`` directory can be used, cloned and modified to autogenerate this documentation from source code. The reason the extraction of such API related information is automated is so it makes it very quick and easy to revise such data as APIs change in the future. Take a look at the ``pgzero_api.py`` file and you'll find a simple recipe for extracting such information from Python modules. Three modules for Python's standard library (``json``, ``inspect`` and ``importlib``) are used to import the modules we're interested in, inspect the signatures of the callable objects found therein and emit a JSON based output (called ``pgzero_api.json``). The resulting JSON is a list of JSON objects containing three attributes: * ``name`` -- the module name + object name. * ``args`` -- a list of the arguments taken by the callable Python object being described. * ``description`` -- the docstring associated with the Python object. Here's an example of such an object from the emitted ``pgzero_api.json`` file:: { "description": "Interface to the screen.", "name": "screen.Screen", "args": [ "surface" ] } Given such JSON serialised data, the ``mkapi.py`` command will take such a file as input and emit to stdout a list of strings for the API that conform to Scintilla's protocol to be used by autocomplete and call-tips. In the case of the Pygame Zero mode, the output from the ``mkapi.py`` command ended up in ``mu.modes.api.PYGAMEZERO_APIS``. The list itself is in the ``pygamezero.py`` file in the ``mu/modes/api`` directory, and the ``__init__.py`` found therein exposes it via the ``__all__`` list. Back in the ``PyGameZeroMode`` class the ``api`` method simply returns a concatenated list of the APIs that a user of the mode may use:: from mu.modes.api import (PYTHON3_APIS, SHARED_APIS, PI_APIS, PYGAMEZERO_APIS) ... later in the PyGameZeroMode class ... def api(self): return SHARED_APIS + PYTHON3_APIS + PI_APIS + PYGAMEZERO_APIS With these relatively simple steps, it's possible to create quite powerful modes. Most importantly, taking a look at the existing modes in the ``mu.modes`` namespace will reveal how to do most of the things you'll need. However, there is one final aspect of creating a mode that we need to address. Unit Test the Mode ++++++++++++++++++ **We will not accept any new modes without 100% unit test coverage.** Please read the guide about :doc:`tests` for how Mu is tested and the various expectations we have when it comes to writing tests. If you are unsure about the best way to go about testing your mode please feel free to ask for help. We would much rather get a pull request for a "spike" (draft) version of a new mode and work with the original author on testing the code, than have no pull request at all. If in doubt, ask. We're a friendly bunch and :doc:`contributing` is easy. mu-editor-1.0.2+dfsg/docs/mu-debugger.png000066400000000000000000002501251341747546300202220ustar00rootroot00000000000000PNG  IHDR)BsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|ufC$ޫfYP,XΟyb/X]TlTADJ ޳e~, ٴ%y>2;;3w_h <B!B!8<| >>/c4Q%`G*B!B!|C4Yz5W^y%999/Pv3g2k,, VB!B!*xy*_jΜ9z V+B!B!iVqhєf|IOOl6PB!B!DzRRRFH!B!,g6 ZVVaaa=*!B!Bp4k(444#B!B!@xx8HQB!B!DjC!B!B!i4B!B!HB!B!EB!B!D-h$B.1Æzmƍ 6ÆzZoZY+s^w}M&'E^Yd21xp{[RfVm4KEE|7ﺇ/a¤<Ŀ8rG]ǟpӭ3|8.znvB!*}B!e[n&Ye|G/(;ѣs7}g5]HINV{^{Mb=^ }<bXxQu*];w&7/_=>Fӹ}׮=O-+(+/EJB!4B!Qh/Wl}lظ&no7&:hn:'_RRG|JrR_c:7]ǎepr W^y_ {2l;Te6nFv<ڦB!ÆsW,;oÆ{mi4B! 2^@aa!|91j\΃!Bm6l۾gO^^36oJV<ڶ4 !g+Noǎo+≄y]EQ^cth߾jYttMr ׯKHH/^}EK2nhƲ_W3|٥UMtOI^DGEs%}ۄzUy yW{YjnG:oǞ_-:v)S8]Ǟz.?3zI^(G`/%,Zw5X,ƌB!k^zn6-Rs`*wϸgϾINJgh2BquNOtļoȑ(ɓÏ~;|^C"##8u= ȋq-xR&]r1[mgm\>yr3fu2d lʟ61!vc=#U?%9wN۶1d Wbifn~߿ɗ]ZpZZ(^L={X~=S˝wn_~})]}U?]ϣ:vCv,^  *QhdQUQ#< /B5MLd/q׽qfxINJhh$Ba| y"FADIL `{d<̬,ztuta0ɓvPu[5Sѽu'%ʫNKNJ⶛?{Z ׏+S9|dNQU۸J^w'he(Byy9cFɣiB!?ep}s1qŹmH!8z}u>t\H[Jj!?P~Z[oʈy~]R&6[ЮMNO^vSO5Wmύ?v Yt$5֣U{>[cQBBSpEvmX~}ղvQRRBv?߁)*.91!!z:~Z0&B?9/Ȝ_uVNKcC{mi$B50;^K޳Gxʚu޿/fܼ\֬[Gv?LvhV+pjy}Fؾs-RR;z&ɣU_w/41,+.l]p`VG?ztN~~>Ǐ@ʩNoD4NM[?سw׮ʠqsҹs|ĄڵmKvN6*Ǝu_9]:wf@~Z'E6mt\kh߮]ח}{yŗHLLǟ 0ҋYj׮e1z^!ۻo;tgU4ۿߣmKBqzyXn \>yRuY7***NK?BZckͪa kNhh(,pz:Æ; ** M;ǪkXORRRh߮( Gd֭[ݺ2'+Wȑ?xlm5\~ՕLl;tՋ뮹s߯>OI|g.VautЁ_U=z###9ΒeHNJO^z`?<''s,#1Fs !~u=G@+*rpG!Bq1L\8j ݻucs]\3K![ddi$B!ܷb2fHi0B!0h$B!?ȬiB!HB![;-[i߮ڷ !dL#!B!BaG4B!B!uF#!B!BQ4 !B!BZH!B!B"FB!B!=b q!B!B (-- q!B!B (,q!B!B X@B!B!" 8B!B!D4!B!B B!B!DF#!B!BQ4 !B!BZH!B!B"FB!B!i4B!B!}h&tcMЙQMQ,y(BЬMB7Obh-CsP $9&yFsL2r13k$/H^(םZF_Ŕ-M E34֛XBcUB|'9&yFsL2r13k$/H^Hdc,\BH/(i(^޾h!Ayhx/$#Ԍ233ܹ3>ϙ7IF\#y9vf$$yLKgH4֓P^/Ե F`CYx{udِ/oVΆ<%Frِ烇嚳!/%9&@} ŒP+.)`H}g*5 GR2N:i"JJ&bgȱ$#ݬ%yD2r˱$#9 5gI^R?H2rL2F#]E*ٯlP ?wf޸fP C(;T5ӱqdٔ/nVΦ%FrٔOrٔD H3ZZTwAH aA wihPN~\غER3ec@ qcgaF^Y9 sd5cgaFr 5ga^R?L2rL2AFf"ۿ;΂i)^~z5ZF5e1GzmwciܬH~IF\#y9&&yuo^rO5KF7ٳgV1ZFWQj EdohZ "z-VD|w5IFIF\#yFrL25g$?$#$#hiE ѕeyނ(ܠ 6OFF-ТENO2rL2d5cg$?H^<#9&9&F#MH5*a0aAh+hyTjLBr@xi13ck$/H^IF\#yFdd$ 4 ]jEͮэ ʎ@˴RTE&gd44l^wdS^ȕg%?$#H^j |Y}Gma?jG:0Pw)q3~\kY5u>O8 z׶%c]yjŐ`"mx!XlCԘ˱M\ޤ3+*cVbXy qFi,xZLQw${7x>Ȩ!RvFsx ڂZ>>.cif ` &y$#<_XR΂u:bs#ui#zҳm3T H^3[sx'riJ)޾~b!c5pIyF[7Snpd^ywW\hd,\5J o&ur2 :vkIl3)pˬE RsSFyTky>|*F5+?1 2[̷+w3nukMУmSJ1wZ/|vV]dX>|cˎŃ:qפFy <[Xʒ Xv>IEՠWShitUIZJjF.`k|a ʳ F;ҫ؞ݓ̄#?C_N7Z!E0/yc519b)=S`.,z|#?3.(ѹ˪72$6aFť:֪RF g~~ʘlܗ>mi|Z'5As7cمOo)(K^Udo+7ޞ2Z5c;R3yKeɺH^)-71]|6~ץU 1^aFV?ݱvϭ;g>[YFpViQRnj}oTU#|0X#l23[7?CN?,AH_s!$yzx#`꾐dgFHCWϥ+r~6ͨڶ'x譥ϩe^ʨ!O4Xnf`:hѓ_|gGherF 3 ~8_!|PƤNFrL24NWW*H$>: [rbNKNJ^#Y^f-'K a4 E47GU_O>ohD`&5o7Ns0#7]4M#-3ZÍc_1副ɯyf}YF’r>wBV^1&%hEpqX{㉗*>iUH~ƒ.mrzմ=5{,+GQF㥌Jx%<:x'^?/ēg~Q1ƣr_ϗwFm{Itdo#,VsydXW 3/cfs3🛇sNfud!O|+uuZIhwu`Ы\yQw tL& A#Br|pJ#j;eZV5@k;|vdPVabհZ5MewYpU/$qF%e&f}؇>e۝z߁c9\<;=nz(Ϲ4MB@XGQwck(?\H_ bM82)(ᑹؼJ;R3y̾Ջ5ӌ4M#+Gߵ=0[4o-pnm{O2%.DS+*/gִ~FXTU!#Zᖉ2GKBPS,c5ntiv08g ?%yv^:VWk011% }sۣSVFAq9Jld(cu`X6|lsh7ƽ_FtIټ ;k.+G.#-3#O\? i7+jٿmk>ꧻ#F#0ʇނ̖͘7EHV+]s$&AQaI9]ڿ` 63o;E( pm{ds xMz(©o5:1S¨C up+Lt ,V댊J+x_DQmN[Kyx ((xQC|_Qi|o9( &WYNUraW[lry譥.(BNA)]ƫ{P#-ca|uoнmSS31O72{KkXϖs I=gCJ/5 Ć=GK;Fc0\7Fwm|v&#FAR's6yU2-z!"4nΐc:x,GrЩ*\P>;*̼2o]d%E㼳 4߷束6bjvVvTgP\Z|nd IDATkDZ6,2*7U FLfk奦 s xd2޾ʇPSgp9E؅ΌC΂Vޔ}QNA YRQLmYy^x>3 f_;$v E Yu14{^[ȑZ]EQ+*?}<)byg{7?7bum@U;Zg^~.A<k^R<*L]nYxxQR28|"n,IUU4 /j~FNm=GNW}Φ[K<(L2{nݕvr&tlVֲ|sݟ.׀r^v=F^UR>^ >Yej{h4*u',jyEe<uL"0ixf=RT)YOWd_g;YVp[ Fvfqtv_ Œ5%GѴI9ubXyۣjk̷r1a̙>P'~ *>=W I\tGk^5x#'j?Z(\?ln t3cBAiWup242uvA  ̨UkM|$KM|h aZC:&D*6ȃRxjp{wyEeu0U3((.SUn߇q:xtLXQH_na)-?p^Lԑpgݠ_,]GPSFF/c (]* nYhB1H^f~QrU|Zs Kyo{|taDefDz yU_i0{KŒn2yDqoٷ 3D36UJ@4Vl9DZf),)ӥN*(:=IqӮ]#Hf^1&g AT'˪i,\Cy4UUxpgZ$FyUZ#r亲ljD 4G.YJ+h:_{f^{m (¨s1%qii4[gԚ,D#ēzhw ({-Lf\nU[_NϺSX?2n. , n;xun=SZZn\O$ޞqD֞s_ofTSLD(1m[xkT#B Mkvtr=b"8Wp;*?EQ5Y7!Gu4 UQyb_JAVƼAQ6ܣsѯKsnx]['e e̟yU6NQOu$e-+7ش/G.㿷qX2oWã1DO@ܟ6Hy{&\iL{߭}PE`8hd-w BVUL:VÛ (>:o.a Gm};&{x3j/˘(ܜo?[nxCt:Ʊ}.ʘ7Uwfܝv9M=sP]s^^QZwT^v}os\+w%",%e3Ϡ?V,V+:BNɄOv".-|B˦}Wk+ 9՗^0G eQUɱING4:{-Щ*Ťe̺i,.WrX/z'M淭x?=L;N[XFOa5@o2[X)7P{ ƕGQnÌzi[>kvyBvnjk:EL;}PE`8Ws"-l'Bj~z齌^f,.'ݹ_b#C-#ɋ F~F q|TmVcU* aڄ^?˘)b?ƃ̾u<7ʘj[* 3lGswnyIk$ c' i4%m< 6`νPW嚃D fqK;Cge?rbAԾy,Fsx?K։}D-HgIn+'rkwLf - 7cXk0RC1oj>:6)&JIYlDtHk4.(ܽF#_Cn~ 4dw3J K֏02kpwIEo_v a!n ?_CC ڂ6I+wylztgR~]S3(/)Sq3vHlf瑪.:o]t:EQ(0aQk;ͻy):ْW lg(,\gc)ٮi {mJE[l0e7u!^h 2@\tz Ȱm <>{&w|&*/qqZ¢UԿ.5* Ƌ (9.1o,nQmvncϨ!>O4r2aCŢ1gt:+.^5[Wq/#0m|Ko1?x_<ƽSb48m1tx3N:m|_1N~p^uZN~K K+Щ wM#Ωz2}/_u65֌Dr9f宪eyL2Ю'i7Zc^*o=gy,HaՐ%/1c )xelڛJL~[vA{o k32s9vVQXu0b""0k4ł%S;4 R<}pKDC ;e 1u\AO<8W6Mx (5Dxͥv GQ!̺y8پ3j/ۓ~ZZoQ-pW*u~5X,֪GkeUVM#1&kFåC:n ȹ{4/ p^֌&* W > pL7pxAzW ̀SnT-םDpsڠ-y DV}4z{)v۾VtHs!HaU1eymm}a6ˠDX=\г5]r.s[Md0:ާ4MzjvVAZ?Ym}XeݬA4hIbʼ.lÆǪ>|}U0V=Vaֻ2GKtHrŃܬʘi;Ì7Hj s딛,_ Ȩw$CUӸ؃YEs Xe]ZŻ7뜏 J~EK!Tdǽ5<,3Xf䍌N򼵤f?X`8Bzm7Ɠ0) ј-V:ϪԪY NZ#\3ze"0j4vJImj e m[7+b hyBz2Vo{40pٞlZ$Fse>@gtso=o,&Iw\]\cS/.'ĵF#2j/azVN;c{3m\t:YӆeԞEAQl7|:YQ˘*g(ٶwNOIMw/1O*)3TVVGi'ihXwoYt5/O2-djMY^j=~H3j7XS.7wda{j&k<;y'G3,pҾl>^{+E[E0\7}TE`8Ө-Uvՠ`= p L~/Ҕ0*72k`JVܟ6lS*7ed`&Գ{E.YL{n߇)q/_fu0"vɱjߌeպө &q}=tMam#ydϰia!WbFVƪUӹU׎:Q~cmG^+cUXZNjې|s*7bЫ̸|q ɫd ZFƽgσv4;#"@I:ǎtf 'ڝNJ^% :x}z#Wn40@ir+dp(N-tA>_/|ryB_-& 7ʼdx,ehӽYC΍jCh]vJ@91) iv*_A(h۔#Y9!: Ql;x 6j0q\o.֝ ѴIo͘H<c;4 ?EQHIG[KٝvUUq\o[M(ҜoΣ.'v]X+52fjDp]jD"}XTɛeüZ$F]jA`ЫL2+.;?nd_k:G+cQ^hyyQ˦1xxs 25g+*ccho=̎L,Ԅ*G& 0wZ5AQ| _nG6~F#bxl.+喉}i$5~PRf">:YӆӱE[ӘKm.hsFߎôjk܇](#EQu8hbeob!&Đ#B XG so c㵶5?./Q̷r|Moi~ ȡ.mƟ9.yqlܛݯ.bx涑to=-ѡ34ب0ÍD(04DGPb«z8K5W$D=q7cp%57o[3{ ?jDe̪iOnۛvc=oyʘyjf?U_+IzaVƜnքoTR\$s~ky}ܽ%jհXޒSZ_u̸b0o_v_pWmOw1kz4:)y9MR^glw3ny1gx߶KId(JAI9G X0 нmSﺡoއk3"4Ȫ{pm2vc!x7fk+Œji  (*3W2d~ .Njשu*Ulֹ5f` IDAT=\3~tUP9hd +S};tKat¬$}ϐnsku3#g.$xlp"!H2w9߮;I?aYݘNQC|UE!!&q=[&йe$e!SԜ_D'|PƼW˦1<hxc Y̸|Sv}+G(/M#AT[5;p\ڷ5|u)<}T{ DZaժzWxCAT']!y9ųەxVNݪc71DؾZ4J++.7 =rxb"kE|tINZ㥌zwAR)*-sW!b2歼Z7k ;#'qnЇlՁC Y^45漼UZ5;ǐS^ƜQC<bqԁ(wؽqwduҗƼBC\='vd,pi'+*5ًNU2a}2qP':~͡FR?Èu^GV ti].(e4VnKcہUCN%6*Ln<dg(mlR ⌒"yα|b'/l7^#0Wk:еz(OfRD߈bvS#'` д*K]ׂjX7IFf˪ZLd(Ot:12-,eŖCFUQߵ풛8BFtܙ܆8z蘷3*0i_4%:<$0=FQuR\#y9&L8ϛ-V^VjՈ5?pG:y6e2[((\QVa&D#ImAzzOULFN!]PZsDSIW$b"g*IF_UY i̵ES[Ϣ~]RnhD%'..FV5Sx _nñ͓op+l;0Lp`{QI|ȤZJL b˜tAW3>Ȩ!RvF=&eLʔk$/$#s~z)! ւƴ;ٜA#>:zxYR?S3oOukc(#EQh$['u{qDrd!%e& zp%6 v]/KcYe ~Ad^b.Q<6 r-t E]fHQF8n (((H~IF\#y9&y&3u8#}Y^'%/8H3 {wц qE@Ej 쐷ʏ7>MT]E4HFIF\#yFrL25g$?$#$#Xbi8a ) = KiU4փ1^مdd15k$/$#H~\#yyFsL2rL2{])FƬR;[ ?PꭡQ' ;<#9&Frd5k$/H~IFIFOΜ97j&A_z!)KI@tҟv5t%މ)4{eL(\gX̑Px~oV$?'HF\#y9&r:Ykccr~y*L(t򖃡)fܥ{_k@D󖒑c7+ 5k$/$#9K$/WILД71H/50E Dg:ΔfV ZG }6dg;ޝɚ^a($a1c>fƌ1`%dwٗ([lEu߿?unTwxsssNNUJD#9XaчݬH2Cr5|eHK5=_r~o|eMA͗y(c#[r(#ys>޲"x]. H(b:]>&9XAQnݬ$+h |e+c-Gr$_YS%g#9ʘH4UiPAD7}s訞uR9ԺP雐X*V$$H)}i͊'9WH2Vr$|D5 _r~qIDFB@7+B!r\ȻBvB!B!"J#!B!BT !B!BH!B!B FB!B!"4B!B!)HQ!_0i$m!B!+0 ePP{u7r =rŋӨQ#޼y1o׮]f8y҄ :t֬YCӦM155___>˜'Oҽ{w^:-[dÆ 9-JŒ%KˑgDNJڵ111f͚ߟ۷oZ j9sЪU+UFӦM4iCvvNm|rS}u֭[iCKA2t4jll̋/brJ|||]rym'm۶u:ۛyrDy[dd$;;;vʑ#G2|LL +WE~F?ƦEp F~8r;vSN(QBۡ ԨQǏk9b :wL-زe bȐ!*U*[??*?~̔)SvZ?M>k2ydΞ=իqrr۷뛣1Ӈ+W2fN<ӹr -[̗_N2iA<ҒrWniҥ wx-\ *ЫW/.m]Rرc.]\%hz~VZ9{6lӧOgРA;vM6Ѽys BCCiѢZ;wE@@+V:Ν;ԩSILLR ? &СCLMM8@ѣ2{Z((*;wR^fZyyye6|xEf/nNowY:t(&LH<Ж@<==8!Ņ˗`6lHjׯ_N7{]7s҂ oQ}Hn >i$oaݴn333Zlɍ7ҍ+!!SRn]ٳ|vڥ_j#y3StI5TZoi+?7oV*>8s X[[ӠAfϞbݏ?ݽ@gz ZlIĉɓܿpttT1ͣGRF ZQim ~;vcǎT+++Ο??èQ8s ^^^:tH۷[*ˆh yNݻ7*#Gpׯ2GI JGϞ=x"'OXbڍC~hժݺuK1Oٲe;v,ϟ',,䄝7nTʮ]Ν;isMzsuuԩS@җHؿ?C~ʕ+L4/*>~@.\رc0`W^{ŋUVe2qqq̟?WR~}Əŋիz"222Ϟ=̌M6Fll,sTq\N0SSSjժE`` ׯ_W 4?;;;"##YjTsyÇ9pY9"""pttLutЁk*֬YC6m0440_mrE7o!ʔryg~G/^ŋ)WCv eʕ?D{sNݛm"3WF~:a͚5;v,Eׁ2:vٳg6l޽{l޼CgST$&&**ҺnH&Mٳ5s>47Ϟ=ؘݻwafϞܹs={6+Vӧi&((?.^H-ѣGSZH^̆ 8{,7nPY92ZW^wE3,>|!۷SN\pڵkW^ѭ[7\\\0aB`vZi8p@)KN:t(W\իTיWUWDD666Jw999ufV>Z4233cĈ|)|2gϞe`gg{̌5jm6 hќ:uǏ֭[n˗/sqONҥ)S ӧOʯ[...,YZj˗ݛRJꊵ6w}?~+++uF׮]w2͍"EPxq5kƥKq!oB߿ϱcI+2߻-ZD߾}iܸ1zzz4k /i4hЀ%K养FkmILLDW7K]fsss-kzfթS *`ddgȭАy£Gpwwgر$$$̒%K3f e˖ooo_ɳrL2ԬY~e*EFɒ%9ƞv.2{|믿~L22sQD ZlI%122RZ %_tB ׺uRCYR0`u4oޜr#m۶‚%KҺu s`&N 2J*iӦInJ*+Wf͚)וo+}_.qrrgϞP\9̔u&$$ЧO^~/c,,,RWv]5j ŅmۢKǎyiJ$u3ͨ1 <+V0c իLu_F|r3BBBԩ۶mcܸqٳ;vPbEqrr}iQQQTXQc/wܜKd"""x ʲo)(*Uɓ3f dС\xM͛͛7J˂;úuؘӧO{Di/5QQQxzzjLNfjժy#*UƖ] 3 ,t  \||<111tYFf͚i;֖Tx"*T\r+WoNy!OnlN!޲e fRTWZ5|1>_aCCf4gtիt+!o)744Tii9r͍yܼ~?ؤTR<}9޺À܎?ƍgzXXX[*ٝ;wV{GnKkߺuÇciiL300>He#H2:.mh׮7E޽Gqm/^̭[2\>ĉVyF׬ZjQ|yFIDDƸAv8|06l 11sXbpwUߗ>AAA|7ܸqҤI^4B!Bk4hЀ˗/F6l|[Rŋw^>s3pCΝٵk{&&&&K1GFFRT)ΝQL8m۶?ĥKXx1˺_ڵk6m2DEEm6͛71T*:t >>M6o>zIRXd ƍArQ l|嗜?QF1vX/_l_̚5m۶e)BK* .аaC iժB!"יp,X@dɒxyyaooϮ] 6CӳgOڵkz&=K.A 2sssڶmKƍs@@XXXо}{€@chhFʕ+ӯ_?iܸ1cƌaDGG~z055RJ 4M6k.n޼*Te˖/0p@:t@2ebРAJZ]6UTr.y*RڵݻWyRR<ٙ7vgΜ{/ju_GȈ˗/bŊZ_^E_isHy6WY:[%B! heH/_NŊٳgm TV-\m]rggl;Y*Ux5mڴt4hЀ3fٳtuvv&&&'Opuj׮{=x\t {{{J*"""裏4sk2d*~:t1mƍ޽[yߵkWvh-[73eڏݷ'ż{0eڏl۾5傹,**mRR%ʔ)pˉi#Ξ;Mu 9u$SY{B!( ### Bttz!cǎMwY٩lٲ:t@6n܈+;vH|񺺺pMecbbEOOZn־O{Q^B+OuO?ҏ7/8v&\ە;wm'E5kL؅Zj֬ٳg1beʔO>KKKڶm˵kӧ?GrJS>~;;;nj3\2FJ5ׯ~Ә~Zj9r$VΆQ~]nE`ܵ+׮Rsgè_ArΝ;3AAAd߾} Jpp0}eȑܸqo*~W\͍ݻwtRVZŤIOiT)յkLGVmptpsoX7q)gg'Ο ?QB!@#&&h9·~˸qV6}ٳL6X\]]iذ! ,ӨlٲΝM͚5h߾=ݻw{iӆCi<~̌kײn:֭[Ν;899ѨQ#?t4f͚ b 0@?qDׯٓ3gI-֬Yý{pss^z̛7'`bbBÆ @'%zzz̜93gY~lCXO)p퉍՘닯/Kw ej<]EooIuYWP޵k4{?B!׆iܼyU*T*nnn\|WWN~Hm:H==4$c&w.ה .]*Fk+W/裆 =88qtRH!BQ… 9z(? 6м)(XޫHk!2S^"""xiO>۷7oPa=;Hr1bƙۉC)nj[˖-_~ܾ}{1p@WNV _~!88/^yffΜɘ1c}6\pAY{طo^СCL2Ec5j`ggg}Fǎ)RHc޷/.5 =r KK+'sܵ-2$B!ćycƌONBd4*VVVVܽ{CbŊ,bŊ\t;wh<2'N 66(J,ɓ'+++ ͛7:u =zpIfϞϹsNy4ȡOXU0\\9xh_;7uV)u֥H"lݺUJ֩S'~7&NH*Uo3g۷;v{)-Z(AAAһwo_|]E.];vv>tv>prPkoJB!Vf׮]ܼyg2r\y|޽SsH!r{i4c FAFcǎ-Z4˷lْ&M5kRg4n///~'F㉉~c7mKUW_}+VVV̙3#G?bmm3O@:utuePbEvء0B!мy4ݲEVSX1FIf(Zhr&ҨC 48J(QfÆ 80S^"!kٯnݺc!B<`ڵY*߽{w_s(*֭[Vٱc'Orm|}}";ر___vܩxB!@f ȈI&1buFժUS-?|r޽K 2d‚/Hj׮ͯҥKYf >Ϗ3f(=vw}GDDL8֭[gG*U͛2ԪUիV^ӧO111ȑ#ԬYÇӼys>}׮]#00GRlYK```TFڈ#177vB!BH[n}e{;v,we<<<֭l߾]鉽=*3g0c *T@@@ 4`ܸqlܸk׮兇>>>?.]0o<7oΎ;ѣX[[~w~ 6еkWLzCVz֭[ϢEq%$!B!1omqڵkٻwFW mRlY”tԉ `ee >jժѴiS8wjsұcG|||(Y$>>>۳cǎT]X^[ŋ߿Z˗ 7Sû>oZƍg„ .]5kƍyɫɘFB!B<)11QZVJ N"(('N∏W'Dyq*U+z*{aŊqhBcLWW7EJ,4nܘ`jԨE>/o^122RR_~ ii$B!w[n߾ܹs5߽{֭[ӨQ#֯_Oxx8fff###ÇǏ?~BCHHjs022N:GزeKv" H!B'Ei˗gر(-W>7nZf֬Y\x:u0~x)ZUVQxqZhG֭[ZϋUP_ɤQ<}Tiի+/VXeMLL_v-bB!"+jժ݉՘7n8ƍ._Q6UV-6nܘn|Yj_$uޝݻ+ޖ`ooϑ#G咻jʗ/ϼyR]"他FgΜ?z ><׶+T*R smB!B!)ߵ47ojBR6xJ"..XLMMy%JȵXn߾޽{{.jJ*Ѵiz"s{Ν;RjU<<<(_|!B! .iE7HQJ1FM|||l_U>}2=,,P+q8qlmmO… ,\.]`gg+qfLMMi֬*'N0g̕8B!Bs]63'N ĄxΝ;bzbbXlBݺuiӦ2JŖ-[r˗lڴ 333z쉮nRG͛dž חCK!B|] ҧRoʔ)$5̮XfMILLI&)9;;s={,]z/^ФIH"vZn߾y!B! 7oh;鑐 Te 11ׯ_KժUy%Ϟ=ttt>U1C I1}ԩݻZ&(((uFQtt4*UJ1/)lRi$B!>؁x˽{"$7J IclݺU7m4<<e'88;;;ݻ))Z[[˺uhРO>aÆJ[fڵԪU Jlj[n)R$!B!B\Z^kkkYr%֭S߸q#Ƕ'>8::gQ|y:ǩSVi.WV->c"##Yf .\˗-W:uիW]#G(Gj֬I~c޽ҥK3p@uB!"""hѢUVcǎDFFпFsĶmјOjػw/W\ؘX-E Jq[-Z> 44?e+Vtn)S`kk=[lɉ0?ĉS'O֭[.3x`ضm͛IѢEQ>y &Mh+_|8cǎoeԨQ:tKKKʺ~z $,,ӧSN޽'|ǏgѢElݺU81bdѢE[ssslϟ?yr9΃ϧ\rܺu[naeeX3z*]ve޽ 2@ݫT+e޽ˉ'Ԕʕ+ggIB!Bh֯_OPPTTAi&m|;̧~+VVVmۖI-._̜9s077ԔYfq]6lH6mR ݺu`ҤIaggG-u.X:Eɒ%J+8+UDΝ^:J <3}t֭1#Gv̝;79۰aӪTB=033{-Z/ bjjػ*/@V E\ w9RsVϯfi}Ҳ*ˑij&8P\8q/A@$8s_>꫄voen;;;jԨ3gΤRJ1"EPZ5&NȯJTT,Y &P^=<==0`au 65jPpa Ɖ'26ʪ-Xԭ[:NnxW :b Cٕ+Wa*@I#>>>8;;L݉ɷ$1v/Q]缽qtt4\r=z4]]]2Lruu֭[QA .43aaakgVNebbaʃppp`РA3&ľzj6l!if 阚f=$sw&iӦѤI,r%?X[ݝZjrJ^{5xs]B#DDDDDDkaee &?VZE-h7)OOO:a8LLL Ջ{P8x f^ddaR~Ĕ q׿5nwww/rL2e޽{㉎ի,[< <ڵkQQQ={;;;za #..S{n~/]DDD>DDD8%+'^^^?s~76mdS~:u*7III9r[w eҤIݻ7888о}{FIxx8_>t2c V^MBBgΜa9Œ䯿Gv\۳gǏ'!! [oeޮ];9w}LNM%DDDDDoXP-LJC溍IF3f mڴO>)S7x}e^  [GL7o$ 355eŊ*T6l9˗/vTN 䯿2,h?8uÇ_>~-}ZgϞT\dXwe˖T^___?sj*4h@"Ew(Qq1m4|}}3g7\_gذa-[nݺ{nJ,ڵkٴiUT[nnݚcژ8q"%KATR˗ST)-Z0i$&L@rhٲ%֭#))!7={={pM=[xxx??SjUEҠAbbbh޼EO }Ŵk׎ 6e옞ADDDDD@@+VvTIHHuy̑ɃJJJ"11񉟶$)=C7<=}RHƍwrGܹs̞=1Ed yifCiyC1*KK'"')N[[ۧ*a\l,>d۶1q6C]Ջ#:?7o͛cbb̨Q $e!C3={6Fb  s+5N&Գ'$3^__#gcc~n>Sx޼chhIHJZffT+V Wp1.Rx)bczܘ7oӦM#00kf(SY&֭7Jʕ+ݛnݺxb9;vd 8Cݻxb{ǵkoR dɒyzNQJeʊk׮=[/O Nj䵥K-N+OOl˄ d^v,\=/fԔ^hPqn_z,oݻ`~~=p; ޝz%Kr39^*S2 J|<]-zb|ۢ\].66y^V1g^:{{3iӇ7;;;^z%~7LMM Yy3]75~eZZC ᭷‚ÇrJڶmKtt4'O&66… //d:vhCx{{O?=<= ԚFBpp07v(tRssJ. ݪVON&5==C^5jT4[ >ӧ[0ެYzwFʕ eTwG)) w^psrjڃ;-nc\7qC ܹʋ7|(FZBB)))FJDDDD lmm9s&[n%==1cl2N:ŗ_~ȑ#9rp{c0&L͛Ϗ… b ̙Ü9s tڕ!Cٳg$biiI{~_۷o7dжm[m̙3Y~=NbҤIw͛9y$7_~ֽgCO>/wvjʷD$nNΰa033y8DDDDӭ[7 . +ٳ ֭k{˖-qttTP2ZbժU <=ˋҺuk~GڷoO֭hݺaDMr˳>Jק坍~^u,X'|B;_n7m4CI&kL2H-nZh_>9ifbm{SёF*U? IDAT~Ӈ>}vJ׮] .nZjEV(tZ????͖-[f޼y;w.ݛ)S0~xKZZ[lߟ"Eojj*Y䄙Y2F...,XLLL;vqM PHDDDDDI\3+z3tW5kV7hЀCҫW/ԩ5js2j(Mx{{SH=s 5k̲ʗ/9x ~~~ҷo_֭[q)(LŋӮ];6l؀cz";RPPX"X N:92?7o'F""""""""F""""""""F""""""""F""""""""F""""""""F""""""""F""""""""F"""""Lꫯ0vOe˖䄯C|}d87gfΜ֭[;=hѢk׎>}n:c#"""""""T)I15-!"""""""D)PVZEJJ 6ݻw?ЫW/c&"""""LxxCxٓ={; G*iTdIO~:%J774vh""""""""O4Y&g6v""""""""O=-$""""""""(i$""""""""(i$""""""""(i$""""""""(i$""""""""(i$""""""""(i$""""""?m۶|78991zLvލ,[͛7 ///֬Y̙obŊ>T="F""""""@RSSyҒ3fpر޷zj֯_7\|sssc"b,Jp\rexY|yϏ#|cgg'E(4HDDDDDI*T`ڴi4k 777||| 2\7n>>>/^U2c õ={2bڵkGRxf4l777ڷoOddM6~~~*hʗ/ϐ!C &&&7[oe{_߾}O Ǒ׏J*QbEuF\\ dɒԮ];ԶƍGڵqwwe˖d5kdɒxzz2h nݺ@\\o6:uBI#y&ѣ ! ?˖-ԩS|嗌9#G߾};o&۷oLJm۲m6fΜ9u&Mtڕ!Cٳ''N0ʳ?,KKK*Wᜇcȑ$&&XGZZ۷'))k_o`kkk(cjjʇ~HHHuek}-#44_|֭[s,۫X"SN] ϟٻw/K.%<<1c @ZDJ=A>4% ߿=?o0:˃ǤJ1v(""""ϼ-ZKڵ+\xuRL,--iٲ%>|poiٲ%|'TP *дiS8?Hiݺ5666n///6nzIJJoɱƍ9s ӦMt-Zf͚e(+o˗/sU={6'NVZ8991l0|||9sf/_jժaeeE_>ի)SjժaccEy)4z.\Ɏ9ΥKO2x gFٖ&&|l}|:~| ֭s]~7p&8825=9rQ"5%5?|PD ÔPz職7nnnDGGwGtݺ"""Xp!ΆWXXXkO[[[>c&Oӧ[ѣxyyeYt?w899'O /o`z*C vڔ.]@ٳgOnJӦMYxa7gFOhQ#η:##?l^VeTW)rf|; 8lC~.]"%Ck'_c݅7}͡4KDDD u%ZjEzXj-9880h \bxEEE1bĈ|йsgUƨQ[.==<~ &&&Λ`ff=ڵ֭[̙3]vѹsgõ:uJ@@~)={6O)^8& `ާ8DDDDضmŊc/_… gJP<OOOvؑ>LLL?~<;ׯ϶\r8z(II; @ٲe133cر+r dȑx{{gJX9::{nlll&,)IѣG?v츊Ϝ=G{ԯKnim F3fz5̧F5lrP݃ϙ^Vehߍҥvʋ/ak;r3f^RS e"lmᇡgjC=hn)3Ǿ113öX1 ˩͛ys&E̮_ //g(W/9:2‚d6u{= oڵΎl=:QJ[Ǎcj D;]XY3k3kkN_3aCZd[[^ɝVXVDDDD/gggN>͖-[z*_5Νs}{&,,իWYlQQQjժk5i'''>a͚5ZDΎ=z0l0ˆcԩ޽`ccåKKKKϟOll,k֬7ԷsNGRRGڵk899=|Gp71?ٷofb֭fԄ=ѭ[Y~8:mf†ZL_ūn?/УG9v-CXX ֆ2z߿{o}:5~:N۶ntβe}X3`턈 0mZ8XIzʖzpA9\K%uq5kG˖933ϞٳF@Cٺ_{YT{ t钡>{ 8|9;vl&TؑnnDlȖcq"!Sjٲ% .ח-[?0j(;iٲC1}tΞ= ͛77$De&@ŋi׮6l1Wbb"M4wޡF4nܘP󵝻?vJztܹ~X[ߞJ,-8| Z[Bb.l4:SYٺ ʕi6HqMHIILٰm[Lu3F_ex4s-VSfy}Ӈקk[驩܊p(?jxἉY Q:S()6"r5]RءCFy٪&NunESrW#Y綷 >>뎺x{>CQ\ͿUڕG:~ZLfعr~}i>P{F޺+!˔!G8 y!JW*Hɫ1}>v숤}{w._N`Ҥb:w.Ͱa-#gcbTPĄݚi&͇n;-9wݛbժX,7.^dqظ+YlcGpn^x=ltF\;WW|}:zyzDZ2z #!JԩC˒-mY;'w<4ʥsغ G%11FW)Y9cv_7gНTmҥl[nɒs/x657;Ʊ@9]Ӓ%عfyo?ԔJؼyX9:Rzucb IV}e„ ?[1ZC~Wi:/]_~ɚ~0E+Uzm?DHP<"_&@ŋi׮6lxb66wwwvJz,_"ڕ2rTO+sp.穔LqƘ%ccD@@+VI&Y N:92?7o^p42tct;%=J^y )RG]c!GDDD䙕Njj c-[͛<;v}̎k֬S[͛7g˖-3qݷLZZm۶ĉDllꫯ`Μ9f> eٹ*{:u`#dRȼ-?;L>uNv8v/2͛76ӭ[ ?sj֬Iҥ޽;QQQk5bƌ;;;yyyqLm͘1-ZPhQ69sЬY3q 6m͚5  Chh(aaas{ĉٶ#F"""""̙7o#G^zDGGcǎ,EDD`aa%KXp!˖-M6hт-[зo_ ƕ+W8p Ν? 883g0rhU||ԬYpuu% ~qȑ~%DDDDDDxzzRNjժEVh׮ŋGp\ի4i%JŅvZc?BKHH믿Zjlٲ xbjԨ\no᭷ޢ}Ӻuk شiϟgxyyQN^}^9;;3cƌNz9=S4h!eF"˗qvvoSBruݑin2sqq˙:991zh/_ƍo'xɖw=s FaL>?CҦMH'== LLL T[ӦMI&|ojjj}NZZy ̙ou#Gcիǂ <ӓm߾+bbbǏva?Mxxxs7Gʉ3W^opr{el>+:::Naaaуƍccc|$?4g G2eښ^z{JRR$000}2YZZһwovŰaØ6m.\S] #00OO;@&MpvvfС\rׯgX,ʊr믿roϟ [[[vERR~~~xxx0`N>M||<ٳ'XQ1cW&!!H IDAT3gd?;:t(5kpM"""xx)U+Wfݺu;v3mڴl~666\t S.ըq<<< ƍL22qDݟ͍EI#y&K/^3p@2c̘1iӆ>}PLx ۗ>ԩ7ym۶L0/OOO>3^~e *ĢE8p*UϏX uL:pj׮G}DŊ4\1b-bȐ!,^+++5kFŊ1bΝ1GiѢ&Mb„ +W-[nݺ\%d^|E #믿Q/|w|%Kߟ^zM*Ue˖T^ݰT2ehݺ5ݻw_̒رc/?̘1cr\I xbڵkdž  C՞u\<AAAbŊlo N:92)(㱱1vOUƤIhݺy(seҤIڵ sssc yi$""""""FY[[3`&OlPJzz:SNeJ=!4)ɓ'\ۨعs'7nܠk׮E(dDDDDyw͜9M!"㳳c֭y^SIPN6nܘa*14p„;'JANUxqc (Pn޼yݑF""""""""hѵkҥ 3|c%""""""")Pk9;;G6m`Ϟ= >4ibDDDDDDDD*iTNԩc8nٲ%wfɒ%J5=-+?<111CDDDDDDDRFaɩ޼Gp39_77t钧og_v {{o8ޱ*ccϞ(RSөV͉ѣOYNPĵHeR҈OhrJѦ|$ǤQzZ:T@mHQFbݺuر[[[jժH۴175_x::Rd 3]H:P֖TV9cǘߡ*Uʲ.k*bjbBZz:1y^+믿 0w<B2$zRR>sD%$i: Ʉ^D <W;ƍdL9{c|Q5NA$OΟ ʖM7ȑLx]֖B2ƍ1bj=ر5س'b'xSX׭M˖|=1,>x!9￯ؼ9ͲLo4j䂩?ɡx-Y^yT{;6m8,YrTnOK\('n *ŵl?nnKLcF;ː!! PSwNJJd4ڻy/)V:E&߿y5`bV-X"vNvݼIrUQĵ1cRlˉH(O3gp%:uꄷ7gر$&&;4:DBJ >ŋF5j=Q =v,{obSϞ {KKJ;8<YmRrP0Z=x~ ^|XQRR*xeWF~~.sMùٙFjѣ_ IIiyNn8u* nfy.R79zG p57_Jddz211hɢDoV6VzW[B7ݷljQtt4ۗ*UQHOO磏>2vx] @%2731+_gߝ26n]*>|מ}wC]:伮Ujj:qOu.\iYɁ#>>pB{nHܹ,y[\@CZZ:ŋ/6 pu͸.Q(\˺,= ^yyx֘?>ϟ$B#I%Dqjskw ̉DbCDD&frǧ!@(ZO>Kb`sWhhakcXg&&VٳeF==C~rr]wᕏ"e`lS{GB#{{{ľ貵5PPPmm l3<7eJ$ho]4p֯wx+),ccMxx#-}!/ݻ[ܹ03eMzH;V%__Dbam-RSmh*+ '#/I""""""RkW^EaSXXX(=0 q#>oݒ%DgfD[\\XWXX͵d#lںDGڵxd4СhHȑ03 VINptpGe*cݺ[xH~mիo@".ԧhѾEm0[ǨfppJjSF:u /^>O>w}L0qL;|/^DqI rs!TSÆa݈;ѿp*ɕ TS%%<~,šzzF 9;@B?~;{﵂r}{<;s2mL ]܁R|m(& … !)SG:""ͫr}uq}ԪZ:;]]][٥4IE8x7|}\\ 1}U`XŢӋ0z|+xݖ TSf2Ǿ&ql.l+<ǚ5DW_ǎ HUa777I_Wo9005@PFDDDDDDR^~ >BJg_ QO&0IZ@(…$%w00-ww#zƊJ\ 45\,,$A'""""""jT64JHH_eRttac\oS|qiD"qOKHk DDDDDDDMʆF@˖-RTNnn1 5Аxoc`b,!X}e``bР """y&455]=1zherbcE(BVF.Be ss7 yy(4XMtlڵK "dh 6L٥4iEHI R- F9*iiY3]\Z.\>ME-""""*STT"eADDϨdht\٥4ih /FǦMhDUjTW9iӮX`޼HL̗kkfV^pnϹB˯و8=iQH,\:t0Ů]pd<}/DG⧟o^UviUZ=.K0~E̚u wf"#CyPyqQk7B GDDDԐ8=iQOB7oTv*!/O޽mлMm? >v;:կsǏUxV^.矷矷V ~Spb |39W޽;$IO+5-*7҈Pe!&I=~9Zj aذ!_\iZXv`&էWC 4HDDDDDDzTnё#Gзo_j ~~~8uꔲKjk|Qmr'c/F]0 3`dUeښe>/ƣ]20 """0k, 88cƌ{gO*&ݻ>-ZX,ϢE.\(w^ r}O8ƍæMnݺ!11?бcG>7n܀/<==czÇ۶msAnnnbL0tY IDAT=f͚3fE~6m`L<Xt(|([;ɺU005@PFDDDDDD@Ŧ ۷ȑ#q%,]ڵC۶m] Zn t-rrr{믿.~._\:Z* 7,XKKC Ž{KrǏGiitg>رc`©u)q)r3UE )ORDDDDDDZT*4 BRR>bŵDun[ϿBnn.֯_pͤPޯ:>slݺpwwqʕZ @:R* @fSSSH$iScbbΥ%¸NUK%5=Hu}aƍ8v?bȑoe!ǻヒI&)lcjjZ{,]fBPPO1d۷5i&iFa'''S  7SC%MރTJFǸq`cSvĊ+UbҪz dnnkkkšs5>#) *mgjjqaܸqDXz5/^;w*\/|dD"Q_yP]eu}煆B]]]V,-q}W՟TtڭAADDDDDDCu!33S昃ՕTQ ~R?m4>|'O;]u3Lr|mΞ=4TzzzD"ו#/RԲ3>x@uTTv܉#GBSSSK< Qg>ME7H#FO>A.]Lj#]Z>&L'|f͚!663fh8uӧbW\-[pmꑫJ0ɱpl(sgǏo}h޼9rJXYYa kP(oٳg#..sP.ӦMУGogFv퐜ǏxtRmq ȑ#իWC__VRXho^FIIH]ȺO ((`lΝO?xFFRx{T*49r$b1[̚5 hCU!88s~8::brMMMcڵ Ķm`hhlݺUT,ޏE{rhhh͛ؾ};9G"66A`` 5ko777޽-¤I`aaѣG˴qqq{xb޽`ooOOOٳGf L6 kBBB B__-Z%KPR"? СC?~ˉpϰ+MLLQrL'b߸qi:;csnMLĵ~ܱ#2=F\PKgOOdžmqfB+^*Q|?'Oz{"֎?"""""] z](ggg077ѣ1x`lݺk0rHcʕpttҥK/ȴ5k3gbڵ000qsN~nj .D@@^ybɒ%_Э[7B|X~=ЫW/:t϶rJ |+食j5pkүIZTy?ȑn+_. /\X߾}1|\Aoܹspss;pvvƎ;0c i>śombժU?~L={ڵkqu۷:uŠ+pA >7?3f? bfСCklSQuyK 7nVyo=¹sV6wZ3Zʴ,k-=bӯ"00c/D]GG}8: 07Bͪ.rbx 𪴝1vv)A s ] ]3#G ڿy;;A~D))t ,ZFٳpn܀/~;vo燨S`޲%L7}.C;;H0ҳF#.ظp#BN"""""YiT88;ˆ@~%SdêUBt2\\\d#HIIA۶mq}0"G׶B|grM0111ճY[E~53zj+Bt@lHL`&P( XJ\ 45 ll0|V98Hy/Z/p8;WiN2QIa!<ܽ+V[ml` g?w(zwA_ ];Xm Hv=s<WZ{u9b55ܱ6^ga_`x vڅݻ  (,,D~~3@ uXXJKK"h֬1M@&D"ttac.Ri i%PW]u> {x6KJJu$w<|9 #*KBQn._υ5+GMՆ-ZЧǘ1U_gbi iZJB#ccc͕kl/~;v, > ݺu)-ZUIShkkٳPSS<@ãV}'Vyc0껾(x+[ CC c-qTm&j}XnK_}w"#9"]fBO?+P}ui?h?i6:k<55ya`bRTJFvvvs2?~ SSeT]%%%8q"~m[^nӦ ;k 2ƊQVtu&W$h 7z#,-QkVtu80i||N__1h?7"M`575`۹s%%ABfڜ2Ɨe`:TJi4p@>}Zؙ3g秤dEGG#;;m۶9.2#GfϞ `I$G4"[, RzEB¿k_bl{t(['RxMFڌggWsaae S#}_6 Fɓr +.d:n ?(q !©R """""R*5( ۶m?1c8rۧpppŋ777\v [lSO?_;v{DEEa֭[9TIzz!ڴ9>p>3=ܹhDn„غ pӦ!!!;wF㭷\^aSbG<4y%tu{7^^G6sC+V8: +PWG q護9y{#(=?QNaxut8y{T,Ɠ+Wp{s"HJK!bc o+Å <3 L9=:H#ooo{޽{sbΝ~:|||{nlڴIfW3eRWWGPP<==b ̞=O}l/]QPPy8|ͫ䓶ӫ8;@$cڴ+x8tI#3wFøz}絟8Q#>aaC]D">B `5powŅŘi:[cIeCDDDЧO8p}Uڵkjʈ(״FTiioVC ~];1jW4kEb|9rr]JahDTl`ŵy&.rӎn>'Un@""""""eST#~&\tY>@X_٥FW<``400""""""NO#""""""""9 HC#""""""""Ј04"""""""""9 HC#""""""""Ј04"""""""""9 HN D"lقnݺ ?kw}͛7ٳP%˯IFn͛71 lڴ ۷G~2""""""" x^Ϟ=ѳgO$&&V,XUJiDDDDDDDDDMC#""""""""Ј04"""""""""9 HC#""""""""Ј]󼽽SH$@޽!0l0^ ())>|p8::*p"""""""L .\Py7R5DDDDDDDD]FDDDDDDDDrFDDDDDDDD$ahDDDDDDDDDr h:n^*iDDDDDDDDDrFDDDDDDDD$BM.v p5&S`V/G9䩲KQL/jK_~7wG(lvD+jn"soBDҠ5'=MuLb/#(-/=}[$FlFv܈9JNDeT&_ ,8"eSg&XܯDrϣ#ZaKS\HQMF999}5]`6g_73U:at{+\͖;`sbvc'yvL~-p]1Uk+7wi3i2qB&X[Be#8ĴwaSq.\cm Z`oh>9xUX/+.Bf5TǶArnD T]J.B[ƶfmJJqi6 B"""""Hp~%bbb>9 (4BGfknfo﹃*Ҳ9%ύ)~v\cy"qm%VT33+V@~кukȑ#UPG%4[F5os츑P&QQI Kr 2 s PqG;cm@dj^T6"ov6zFĥXYQ_Ena >QM5Fn͛71||rCCCQ\\u5kLLLн{w}FQ=?⨭>oDns]N0'RHAnz*#,>?FbcGX"&b}')lSH\Xsqk!QjRQϞ=ѳgO$&&*<k??? 404/FF8|'G`XK|= F"~\{}-u.F8|'B)?H:\s+clG ~>nxDE +Sώ}p`M{2e)^hHk LGA%2(*)Esr[TIo?DLyL9xo^e4ÊHO TLlǵ_7՛^U5Q\ZϏus2`IPLH"yڼzjh?^L: IJ?ow?y3<ouREŸA -8 #1^FzXvꑴA&@G;C^xFS*jգ u8qOoLu50 M 9btƪ!n5 Qik60i80 BqmkﺉowSЯ9uDS05uƠ-~n#,o@K6|Fm yiik}I̭Y/=D~q cJQjRQmhkk#3SNc5eT|هCwRorLj04e Qa Fl EZQ3 +_n9#pmO nm! DE%lM H+z--9HfJk 퍵1\昍\;m|D|u&ZzLd۹QB##m!iL+arN2voEkP*@ ^hT\RX]H,-|3.qAemkCm!u8d f|bq){@WC=M![B@Yht):wEG q#YbݥXd=[w<*iSpQZ>+_P[Ws]Bpt&L送RS/?8fG٥NM~3R >(h-@OS r w |t3i7Fu("!YbjoXehTTRYxސQӤ4)X`tڵut~40Bq)Ot51F2ASI 9VԔ~YχYu.W[4lxJ۫@W{8ȵu16'wT43Ԃ~2Շ.N0b S KZ<쌴Ѷwe kc}xQe{TP!TWÙJ#"q)$DEAl$P~q)4եm ť2iqF>8aXhV >=)Ť#3_,+NMP=)w+_,5벟ald::TceA.%ªmH͛7C  @)lD3#-p4$T16J n-,i뗅_yUbo1s <_9f=SZ}-4+\ pQyE4񴂩/*Q0E0PwJ-vFZ.COS ,`)ZO+|^Q[ fT64~:{ٳZZ?:|nzñz-FvERL +7=k4A9)?V=`x&=Y6Cf*g66jba`G{dU?xS3칝'0ERlZfS(3yURv@%!""""C%CxL>/hiRE "EÔStGcJ̓P E߿TJ6o maSxzDvf71(J%$-r v hiG#}䐺ZBd}eSz?uBVSvET;-Q5)z-QuN=/H xR𷣭4R8HDDDDDէr#>#cɒ%zߩ]g"`6C~Q)Q먩R1#7C"%ֆZH$IPtX_a@W{B];c- @Tj>>`2KBTZZ""!ʹoG,n&J_Fg| ~$CQLkϳ8\jʪ;ZZIb~ްʅR!|~-͐"*B8hcPk Off\6l ,2.^pavO SRs .`@WOFnQ jZ*s-6 ;n&ζp1ũi-B[K8tG3f|1.GWkck}jh=DDDDDTTh퍧OJGSÆ ի#G@MM [ƈ+?Ϙ899~5_(#?3CSqX}>F:-,#0 pPBdL|C<,p 4DaƳuZLu5>?o}N2l 0%4C|v!(g#x= pAF^!Te`z7{|툒R "r?Qjw5?'BCHM5-.1V5((LmCі-P*b1V!1&ٿ?\JwZYugv~ֳ)Rx-쓼/59fshA\Ţnw2]֟jy{>-'j)7rj^A}KSyO^Oߠ}r[^m\N#UP[q.ګհKxS~?}MߛW>;N^owBT]3] /cuHE߫sڰa3@ףB lxʗ/3ɷt!}W#W/3$zq9uYJ]1i{AuQ2ٷe/ҏۙ4:ׯkM`[nO9_j{/h^Xvo{=RҮj1۶ϖ(7PlR!!!zgcկ_?+HܶmGQfEFFZ{Xj,nbzK_&<-+N|JG߅ǪwQy{J}H*O{fF^s=zpq2Au)qw)/낤ՊXM ܸ#SqY"rb Ǣo}t݄Duzcs( Ǫm.&t=i$#;8zbz `i3_M}F0!4 L`BhB#$OFqqq/ *ԩSYfUVQ.]ۨZW vڥp3&;wN~vءm꥗^˗sR[>[𰀀… ɎתUKjղ~4h̙pn:x婝Fu ݼySEu)G64ԫ֭[[-j8Klh]5NMfTzѡ|jl _sٺҥh?աCl[ҥۊs6sV]YfZj)γϟ?Tcrn={;'GWc5T-c\Fy<(..N_~UB:u*ŹQQQR*T\2-u '\7ЬWgۈnm bo gd#ӌK!~}v.T@SѮ]1cƤ9wĉW^״}{,%ӼyGԸrqYFiC-Go'egQZTkƎ%egʨpᖶoV*Th<=ФI{`X0]UoR4 *ʥ:/r&}Ӷf…Q#m;Vq/&4USW{e„=c$$$9'|e_J%͛+b:S aӦi1c4zuM/ZTߴm?=JR5h />|l=nH{"7nT!CLNɓx._n:K/%jUש͛SVZWץ{H4:y.\Y,[c}+22u,+_qqY^;|/s6jo^|¦O>S1ooU~9yk}Їd͚ebRU0׊u~׮ӺGz%\%Gj;C={Wl-6~PSufW~,Ǐi6yF=˖d}\}ٸIej q04;%wccU9Su$'ZQȄFڲe-ZJ*RJjժ$^zZlY״g[wggs'Doz4?ld]Z/t_{%W *92 ]ܷ]v>OȶG&4RddN8cǎرc%I;wTϿe+9r=ohٲҥϻ_\{Qd_~6~I>ݺIƙ{1( gwwuvwMu3:7Sd^E9Ks|wO=eY37xzԩ{}%uR^/̙P|>KKUn4zth8_?ӧd,Z6j|{S*U\+Vԍ6mJw``8P'OAծufvem|i-hPzX1^BO54)~GK۷W޽UQ#ߵK?TeW-8.uٲBMٳ2 CԢE Y,=9sMk5mZJ짲ei]iqqɯ-[jĈ5~.ݾ gϊor{*tIMuaAW:f"֮յӧ\*4kO9'{nӷߖNktuUZt;&RE6fQC=VTN]֭;oSboZ}TH!-yӴۛu9d|u9|If BBBlY'y_>I_$vafd\ru pss6'<<\g<8Bwf+77= Ip? ׮ פӨ?~-_\ׯ_v)-YDѹr=04l0uUo+ȋ6ҥKKʔ))S~?UD-nݺ:x`^a7nչsg9;;uL4JLLԺu̙3վ}{IÇUn]M>] 4P2eԺuk?~<]ǎ~iٳ奏>(O5jW/ڶmiӦI-[5jի9s挪U&Ijٲʕ+oFtuY]&L䑹xM6M~~~*_ڷo;v 0@׋/ *Ak>|Xnnn:ydsڷo +V Й3gy*UT?y *`0 M4)k.[6mһᆱ>@$-^XӴiӴj*lRgϞ.___9::-[uW/(jӦsN-^X9rwyG}ϟݻwyztĉѣ6oެaÆiȑڼyUZ5\: WNKѬY榢EN:rrrŋ3t ըQC*TP`` ?N:j׮ʔ)ݻpK,+vCzJYfZt (ڃUZ57NEU͚55c ˗ jƌW4zhթSG)۠AuU˗WPPdIR׮]bb 5nXŋOwYFK,F~?{nfgg%K޽{?VfLז#G( ɱ 0 ?~\'Nн{dNƍuȑt_f͚:v$K.ڿ1+Vk׮YI54zS5a„ܪ+ PBBBiXX,X,'7>׉/_ի+Vٳڷo:vȀt7ž:u6lؠK (7nƍ9V\FTZUw5+Wm۶%9^*URŊeoo~-ɜ۷jժή]%^PHHVX-Z%k7A<==5p@;Vݓd;wNk֬ƍsT :TZ~ܹݻw+22:G}M泴 0@w̙3uu>|Xcƌ/,9;;o߾=zۧX͙3G2dHݵk;[niٲe ;w֑#G4|M6Hƌk׮?W2e4m4͝;W7ŋըQ3M||mM#l$ N1Gh 3B#FK34qㆦO˗*YjԨcǎy ,Лo7oZwY,$k_^-[~xfϞ0ٳG...zg4c (Q"ɹ۷oWÆ u9999˗/VZTX1}CXbr믿$͝;Wk׮պu뒬QbŌ|GM9MFw՚5k4l0 :zO>1cܬʗ/KUX1i&ŵ˔)5k֨iӦ_kUGZfMqZxqk֬]u<\]]=ϟ_Z|Ԯ];9::JR(7o;w \]]S TLLLKi!!!*QvbŊ)00P?*((H*\z))1b@K34^vܩ;vh̘1РAiqqqС5kjݺuSDDD988dHtmٱX,󓟟&N+00PCɓ'M󝝝ӦMtI.]z@;$I&Zn]N<"͝Fx&F0!4 L`BhB#&iFn5~x+7 KkBXXz-ISJsѳ>j׮]nL`BhB#&F0!4IܹM6Y?_xQqqq kݺ,Kܗjhmۚ?|,>>^_l&ШL22 #j@AO#&F0!4 L`BhB#&iFQQQӧJ.B N:/R 6mڤu?Ј#`ըQCC o[5 KmMz Iѣ5}t7NNNNR(rO;jԨO>=бcG9Zl#SO>-I*W\!Sʕ+UZ5*U*@jO|w ՚5kriCGСCNKwhtYjJ*Uҗ_~5]xQ[Vzj9::t]4C3gΨiӦJHHЦMTxܨ 6j#'Ne˖ܹsm6ݻw:?~u9Nj@J54)I۷iXbFTO a)\t)@.J 4 L`BhB#&F0!4 L ꫯN:rrrRʕ5j(EGGF}| ޽[M6u&oooO?ƍ V%Fj̙3կ_?988Hv2e^Ӗ-[ԪU\)'bhjՒ$={6gMe~gz聻wj۶m:uꔖ-[_UK,QŊs>@B(5kL?P;wɺ`Cz|XgVB4nܸܪ(՝FSN?~}'ٳ-Z@Xbn \N#IjѢZh T#l<`BhB#&F0!4 L`Bh F#Fb{w Phf`9UtFgϞU~{)9Yl,]QBBz)oookyfNʗI'Og)>>> mܸQ{=ӹQl,.]^ziȐ!ҥKnK142 C}U5cƌܬ 6bhuVڷoeX?4aY,-]4׊@H֯_س>~)((H>>>9Vl#ШH"jٲe'VT)q(uAǎ͛UT,ծ];9sFϦ Wz0aL9fTCO?TÇȑ#5cƌ$c/8CeG޽{UV-խ[W;wL26w\kpJ,i:7..N6m͛7(xyy駟~$ݺuK;wqE 37!S=z>Sttt.8 +-[h͚5 ȡʲpjӦڴiVZٺ`#iF%KTb4k֬ܨP~L=UNu!*^iFnҰa4{l]z5WZ={jժ*\#ɜǏb(,,L:tPR4k,;wNmڴ}]۷oWǎ%Ku KDRJڲeK׀uVmڴ)y5b1\v-snܸcǪ^z*\|}}5d矦wƏrʩpj֬Y}޽I&VZrvvfΜ _ݻWC 㣉'޽{oUI+VT``֬Y:@I34U9s:7Pndoo_]~M˖-3޽*U&Mhر֭֭+///M4Iֹ_|/_>}ǚ7o-gyFVJ۷kʕ:~>쳴n5ݼդIMzCO>D?O>?qKTٳgYf?qF=sj׮l٢ÇkڹsڷowZݽ{W6mڶm?\z7ծ];/B?ڵkĉz矫QF2ej߻wo͙3G֬YI&M]vo:@3Œ̚5ːdG6-jܸq0 x oo$#""$jժ5kִ;v!ѣacC1|p0 cŊ$cʕaѣG GGGcС_xB kƒ%K{1$k׮5֮]kH2nja̙3ǐd\p!NjH2^jKHH05jdIn޼i:ֶm[C1v$ϟoH2BCC&Ol:fW_?}6l… jժ_tΝ$!,KݫD.](00P $!^o?a]poIDATVwNHݻwK_pc...8I۷u1լY4bf͚@ʈ7nhj۶J*ҥK?$$%Jk׮*Vll+ݡ$=Z111Zh *d_jTpM0Ar"]]]U`AmݺU[?>>>YFftYժUӇ~2⯁a2 Cvv ;""B5jս{w+66V/Nv~յsNرCcƌQDD $OOO[.u/#˕+}j֬YԩS[ ekիW۷U`Aծ];C+&&Fŋ֚էO5k,KkJ߼AP}Lq7Ѿ}AJÇhѢ_,秉'j СCutrVvI[oǏkIݻ'{\]]uĉ޻wT$0{BBBLsoܸPq___YFTbES_=<3KkСCOꫯP{6޴i^},Ց{{{;V:ꫯԼysըQCÆ SN:v옊)^j߾FիkǎOբE 2$s{9-[L>>>֭[]Mᅲ7nG믿VzիէOcǎ6lؠ˗kܸq732IҸqt$QFߗ4iP]xQmڴR/|||4qD}G?奦MjԨQɞӠAuQСCt[N:uj׮#Ghĉ4c yzz* @k׮T`$I жm4uTh̙\N#GH>O>ݻwhkh4|.\X|-ZFiС ,d={OgVHH<(;;;yyy)88Xgdֵ dMRƍ3?B#H>|ϙi5s3c,x< &F04't$NJ) $;FO Ma0 IFO/B+WSiO> ]iB#F_:5Fߟ-ƍ\bZGfF06 DEE)$$N>mX.\sbbbbbKHH͒ 4aWHHܹ#~t)ӼsݻXھ}{oOAGQhh"V=xIRÆ U~\W4B#`ݫ?ٲ^@@j֬);p͍rbQDDDwm륅dʋ/(oB8'q"E\FT,-$GE Դ DP@4 J.ڤ ALB3f]4]t;q.yT*DRRZZZִNrr26(uDu#H=d:,oKMMEGGQXXL(>>񁽽=bs`nn0)d2AAAEdd$LMM79ͥh{qT^k$nݺ'H`dd c/^@hh(r9!>>P(wCRRX\pAEE쌄B ppp@dd$rrr`ii)'&& www ##C(tvv"44_ЯֆrWb#刈҂HP(&HLLDff&:;;qi$''[frrGE}}=N:,444jNȑ#Crr2j;bccakk:9sZŜt JZ}޼y7nڵkZ1?~ԉYYY-Z0Z thhh@YYيd2nݺ8DGG{n燸8cP__bWII  222hooN+W H=KJJ* O>E[['ODzz:^ `hsMHU"hɗ-Y6 FDDDDDDDw*J(^× O all c vBqq1<==111P*HLLD"AHH|}}r9ʐ/QX*cdeea߾}033QPPbpp2 FTTԺ~CCCxyyMkׯ())Ν;`‹sfii uV"*[DDDDDDDDK.qfJ111Z64޽ucbbXXZZ)IR^O#""""""!,^6sss\w/>)J!aшzoFSSfffގr j<{ cccP(**Ҋokrecc###4"""""""$rsssss8qZs_Lh4ܹsWPP4VVVP՘Fњ/ aoo/_`ll |cm W+цjll0 v؁Q֢OkL&CDD0>>R sss|R)Om4___h4S4`۶mX4""""""""`[趕֙caa5fhy^O#""""""""-R.͊?&qE0g\cIENDB`mu-editor-1.0.2+dfsg/docs/mu_sketch.jpg000066400000000000000000003516321341747546300200020ustar00rootroot00000000000000JFIFHHExifMM*   (1 2ï% motorolaMoto G (5)HHGIMP 2.8.202017:11:27 13:20:05FN"'0220Vj ~    |0100X  h `  2 2017:11:27 13:17:132017:11:27 13:17:134d @ @MOTrU fU sq0-7q0-7qqG~qGUbUf^ UU XU u0U U U U T Ctq DKȌd%UdNOd0 d1d2dd3d4d5d6<d7d8dP ?*jdQ ?LdRd92d:d@dAdB*dCBdP ?*jdQ ?LdRd de0 Je1 e2 e3 e4 e5 4VxppppppUU U0ZU@_UPUU`mUp rq q q q{q q >*q effAUUUUffff@fffffffBfCfDfEfN fO@fP@fQ@fR@fTfUfVf]fSQCgg g2dgOFgg g g1gg g g !NPP25.137-15ZY3222S89Q1401000, 1401000, 1401000, 1401000, 1094400, 1094400, 1094400, 10944001401000, 1401000, 1401000, 1401000, 1094400, 1094400, 1094400, 1094400BACK,mot_imx258yuv420spAUTOcontinuous-pictureautoauto_hdrauto51006a50258b710119683139333620Feb20176a50258bddR980100 N W ( @ H ` h x4':'  WGS-84ASCIInetwork2017:11:27  (  HHJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ycYrO8Ys⁌P3ҥP*WDly :¬xC1֌q֜)H0" Ҩ)Hjqh@G(/@ c&jAu=iGiG0}iң8ZB=Fv4il @"iF;@(8 74W={ԛL#ROoݜg0*iHvr}zKKސ >Z?9 ZC#1@ Q9*m3ޫF8'O*T8@QFsR3oVqLB8MlmiØsbhZ`W|"Gh'=j5jnIn(*q3#Ͽ0sޗZ=)xihF=袎h=M)I8cr P gހIJ0:fZZC`4Z)9N4.Nc68Tr5?0;y< (LcϠ&w8)?:S"n#x3LsOo#Y1ƚO)E+HԷ3@ gqgbm Pe<$PZ7=Sy3@ڎ(i>4tzN`7󢃜H G3v;ːFjB9Sw,!A>UOni# 3#W,xB<*N8ʖ"X?֦D۞9_ʤwCރzhr=?җQ3%cf۠?JڳІՃg$]Uؿxbs`TB7$9Xf'RP4xIP 9`TH,=*uSXdu#݅ l 0;2jg}jxnu|+=iK9$T;QRi?35Whݺvsg4Jn@ھ/t/]ˁKVa qBiBҦ]نN(z 5?Ⱦg y82~IKm<㊗4OZ) @Qf!z sTHZPg֐? :a16sCol0#y9yqJ['i.xt}ñ?Ϳ14o8ϧHϴdӕ sڐf40cLY`r/^֤'w͸/e)b FcNy`c$<6삤4 FnܩHm}N2c~U `8 2J98SSEDH,9;;j`Lzh J|$*fH%V .2LTy8I(+:%10'?xHۘ~{qTSfޜTJs1Qژ!:dn?O+>)X~$rJ:9.kmO'ͼ;a玝saNF}ˑ^Sb0 ?-L UiUYIߠNxL st motorola Moto G (5) 72 72 Inch cedric-user 7.0 NPP25.137-15 13 release-keys 2017:11:27 13:17:13 Centred JPEG compression 72 72 Inch 1/50 sec. f/2.0 Normal programme 160 Exif Version 2.2 2017:11:27 13:17:13 2017:11:27 13:17:13 Y Cb Cr - 5.64 EV (1/49 sec.) 2.00 EV (f/2.0) -1.00 EV (1.71 cd/m^2) 0.00 EV 2.00 EV (f/2.0) Centre-weighted average 3.6 mm 1714 bytes undefined data FlashPix Version 1.0 sRGB 4160 3120 Directly photographed Normal process Auto exposure Auto white balance 1.00 Standard Normal Low saturation Soft 2.2.0.0 N 52, 7, 32.4292 W 0, 58, 50.9170 Sea level 0.000 13:17:13.00 WGS-84 ASCII 2017:11:27 R98 0100 C     C   X ʹfs1X.\hq{^ ` HDl4%F+CBsChQD"5 #%1{ !W*Rk^0(50FXDa 4h@Mh AFJovK36T AL_c XR"H0-,BAdekb0V 6 B Ӎ%@is=سseeJ%XzaVBI*%G%5B 5UI E ) 43b BJ";㖓13Rՠd50*%DYj\E5a!fZ(=1"`"R Raɑ` W"XιșW&IMr`92rЏJ  \q֤f. WE: , Q@%8!O{L)sR^є3.Tƹ̸71a(A-H"A(k!EMZ&l OM) %iz0hbʨ*H4F%@Vʹ .Xľ[s K,4SQ!bR*k9}fd:QiNH` AFDPW)CD8B0t)2{qri75mWݦyHX6[r$ @m[L0Ԧ"S9 @B0)EI$&oPι5L9y)VK:&zL'P}L(J=]L, = BQ@CiD)()2F9q4V29>oԲY{bЪ.akgR-WB%¬Z+ PH,VQ3:g1RR YLA2HhP bjvvN}+Tlh!XŃe,Uo2f2ˎ3QRb0GPaa"\SYJ .%d!pz=dQP2BSqB$zYm,SbQ՗2d25UrF"Ha t )ϷrWZBg"YB$KFi Q *T##"BZ,d\+*тAB$F@rAdh5XAETZr,,!,+UQf{(h-Xƴ%%Y%J[4Ie8B0 5 (4rHeH AF` *EjK촪!Q\ZUEV/ђBh˩mRf\Tg-tK 8Ä` V1J S ,"AB)J)b1U-Z r+k]{+5^/2"А`]y3h$Jʊ0Dő1[r#ISV!pJ XjaL {5s"Ty'V8jZF{o#KɮXʺlF 2 @%o-b")*$ Mr)%U9)3%U:6r 4\Tu#[kcyí˙!ԮAӎb@4bA o8VVP@$-VQm4'vfLXiS5ް"ֱ+t\d/!FN3{=Q:0<.% E-B :yAʲI=г9Δ.u9]J[Me*B Ax˒͆ 0eC ][T J-9e˝sIRˮQj @4 DsY@1"C4WJ3@ lJʰ免2\U%UU5:e,a+@)%(D@ *  @Ct`EcYZ4(jR+6θ"fZ1:Ŧaa`Ȳ,HJPIz[JZVPhE[9B[ӭ$(D%B)lZ*07A3P:3U5]=Xv20J(-Zb!($k t55֠,V H@ (Z!$e-R2Hlh`zj0WV@ZXІ@‰XХ:)̗]#P)mh32b=E+ Jt ҦXb@PpT#X"`BAbcmPo U̴W#%,$Amv؍Xs1b+\9!3j4aBd*e! ! 5^htns-KZbϭ\ig)wR̹bEbmiK,,!h`T"D A ` B K]`K4j\e\JJTe+ 0R`  !J!`@W +D3NE iϗjj.8֚kdikg.6%_T-+S"BꄆMNÌ0"4"  MDP!@ #Шa,6&h۲˛gF*ːݬ0l3.s2Q"H40Ì bR"m B@ ai FJ`.3F3Ek] hu4Q7e"δ5Ϯ0F bRQ H! РADb D r!kY()2R*Ҡ@Y\#p AFă@#([QLA @PE43.\EaB>AF H!Aa5@!ADTMAALCBG$AFtB*ٹ7$U0(ԧ: B@APCD Ѣ@@AB*IzT$j1)`STPjB+Ʒ8,X]KbCAaFBP1((B(UDsӭAP.L558@&$Ƶ9W9LƦX@,bDF`„`E" H%YL4* DHιDz륃pA0j QJ$HUSRDiA)Axb("5Jg3-G$:#`# bS! $(F ꐂ@  0〖؋p))(+U n ;hi`(!BBj!sΨH(B,0CR$(S bVX %`#+0Ć, !F LWP`" ("pBP(di0HrL JhRؔEU*X(Ũ ` N}uH"ԉ$j"HH꘠(9:@Hڗ)$_PqHc! ֚JyB0HA1V+2MP,(m:R  ^5B F F4=KĀ ȍR4`r h K H'霳TEd(PU*RT"RBĦC)J!) ԵhŠ(  #X2\qUQ "%$YB! H80h J0- e^Y8RcnBn:PV8qHEuF @#E `6SHˆ, !$1"$ =JQrɳ㎳S q":pRā-mG:0U! 4-fosbXR0C $ u,t"0/OuSd&',@YҮuuKYd[z:fbtZETY":jy()I#Q EZV2ڴY]318WNYaA+ _:u.l 4"N}u!qӬ05ZM0abhB@P$ %@D1" WR*:pbaeR #-t!\lB qصqi$PD0!#A oا=;P`]ȁF=ͪ_7⼲ jP5̭eH`#HKŠ@") ,@RǫBi j˕5:t~c)Q: *NB  $J)X A`j4tVBUTI +R/E;1 #t+VrrS b\1X`@M `h!b벊PUVi"Rå W}eM(h )@@ 1q m$8h€XEtݢM mU`*mt"/#WemFRJ )aB!"P5  LP@J!lV`QѪ%ap͸V-}O"8 PC 0Jեq A,#(A 2)#BB=P[9&XXT+t¶OK%pԃN0Ņ╌p 4+t@`( P(UE *ŵc5q[- ɮ&gŴ!Q )HCYx ecnR @BĢd5ĕI.T̠^K4%2{$UUJz i@8@ koMy! Lj`B (vB*˃1ˮ2WbWZt%'7" j`@$B b!,AKjꁡIy6k>.YuȗlWBy5KX @BX$)0B@ (dCD+)b,i!emj+eyJ2 ;)!@$A(CP҄aNq!b*@ "PCDq4E g%,_1oʸ W9rKKB `jPH%%A4h @VɒiaF`GՒH/'d$HWiNk@ER ABR 2dN!i`@ӯ&$ڊ.KKaA s+i$Sj;\,&M@$ –Q:t \+ͷjZfXHBTA Xqt0]ҍ - @ H HQC X ҨXZWq)1 J ]_BBR"zRa0SE @A(BS1ʶ`ИZ,9ģ]swїIW//RE <:E`PĂ@ 0!XPS!F A("^aIF [T1+K@ӈXL^paǧH2",$jBP!!%0FB w@S-  !%YP$&\))/f eC QU J"Ħ  Zl"BbRh҆ HJPcArH(\#0FRhH @  HR HZP!VZfD1ie[cCjxP#/#QEUF ,(X N@B@"Ukpj_fUmYOD0Ð/ h"zr!C%[Qa$P5mY KDӍ/ZK ]JBHU<5=H#CPu%BEv;;J1I& UL#ZaT9ڙcQWAt-y -mNI]h(ko\2cu~ޥ]}4/$ɚZD8߬FWrr؉^mEKsj:n9c 1h_HS (T*F@@[J $$!X S)]8d(Ј@q5FK HA4*URh@j\V % (LՖ  9hjCPX8T ,ͣ K" Q RJH (\ڬ)PWJ( )X)hFab 5]R ԔAB(2%F@0(Ĉ(tX0hEDQE뤃KehEQdAK)K-{ $YK+ӣXZ0 PĆ@1bhXaI B-,.MhjV QUjxz#%"+!] $0D",% DG$$&Vؔ]( -F0$# [, !@"AQZQ5$- *H"B0B9`,Z8! BRA "TXEJd$PH Ӑ1䄇"\62Hk^(A (P@""ZբDeEňXm9 = 2G" BNٱIBi @fJ,"$KL0!"1A #%02$B345&d&L|XDh$ű<6l8g5ߓF:zǕ1RvʣOF',z'zCIK.IMgz(VB$tj5njjjcMcCVaY;ߖ؜fF^2lg&|9#cqI,nwLSFllD'{Hi ,cF=bhD&Gc,LLrFLϼ]7{O?}[̤`1?t^{񩩈X45dI&&,6=Em(6Bg|gh_; #.Idbc(&$F$51{eb6(r摼M)&76H hS7l6dmR%"xhrŽ8K㑄դ,91<ȅ֨kVa5˫UuZҫ]Q)Z59K_˼_ێkVuY׺).J<[q[rJ86CL`|xKĥJDu^G2FR,Ds2[)IEL3!K"2],u(GўcթЧiJ[EuOjhѧ=o08'$Fxģmnxc]x=HQB F$)&tUb$EE"$B($^J$K#&5f{Ǒ6llnJ8FD__(L:0%Os󑮾zIYHRkOj8H̢]( }ug<# DD#SVjHhO?=f{31YU3F廔{-{z̵ӌi22X%8p瓭^5lV#?M XVONn7yz;闼B7FK~ ?eh~ b|{pN2t$F8* , >IC/*CHJС>OBj^۩X40h8Yjr )HLq%HqRǟ@Ič^^jģqd'ҕFƼZFHJ>#Q?|Ee%~ؤ&特C*-a6]GyvwuR\{k{xqn'V:wVso,>?ຼ jƓ.n*sXJpkkr.id8Vρ/PMb8#Hm\EVeyAQKqCe:q4NQ(Dtz#Ta&,XUV I%&3"Vůy>.[Z5j㝫־-.ec^ӌVㄚE-mKxRdWƧԕQЩwÊaug^R^(/'3I|t򉌙?ӷU֩8P[3Tw|UiU2g^:ҍCǕ^SuT/(ϖkB/P^9xڳ.%g13Cߟy=nFffFd9:P ,>񎰌EqON&ΈQGQThh8m=*Ȍd{hTE3VjY5fp5fGC%E<HIP㔌)䩢jFdU88xQ> c% $OO?~^_ns5NR ,虬MbiA,ďr缧*̆m,m&916oʚ=D9z=Dz8sH8֜82n Ѳ76 #hq)rMM&Ӝ)7Y'&h^G~} ~ƈ $9N= Gсvg'/9aV4G/lbP)aXLK Hd̙/#\+[Cͣb(3Y2=q3#/;3slq72LD/z?Q"YHHR|eBH3HԄ84[gVЧTkiAFՎ2df53jg[{p#)rF%'6Ol3KalDǹ!Wr:/$ILs{A:Vu}[U#t)8M }..O=?Uz,i6_O >1~b?̐IA)ODc%yp!5F54FjѬHJgc23#ici3a7D&#M6C2r-J4OHT%TrS%d)eekz3[J5,j#'/3Lg ]g.T4QuN24M!! #bkX⎺קB}Z4MGXT[קiSJN> KHxcK D":hg_:Y^B sfX766F=Hxh+;Z>鮾z^LFb[bGsu? r!L^?$"Lch..Mb(p=4hVh(Y3&{DZ=f7333"М͚6fYcf)1NF=YRY3lnmoX*l0^=g djZڀgKTg>zSE#F.`Ig #EHH,՘f5*>,L[{q=ً{ffdffdm,7#fl͍M~d|t|93ğ|3'z,~z ]?cEi#$@qIE(~4 Ԯi.NЮ$nj3YS8)rH#,b}~m%Bʇ#Q++Ho]_>97e*ߩNg ! *OH#HG:D$4SӸsRVn-o-9۳m9yfx"59yOO X7677F雡&f7G4)hŎQFL9aNKI)?*8Ц^jKg!m+[kwyEW:? qԙI\hJ9K/CB0kD(C:D4CFMMMYHrǼ2=3"clɱ7Ņ̡F/!_Rr0'q)N$y0YWIHgQ}g>LU{_>z_1,=)r0Rxj(1!FF$%#0YbG ϼcfGNg̉9s>KcsarX&F6Mf"Q~oOsq+KώOY3gLG̿XF4MQ%j(MYBbx{rGdg̤e/2sU' R/.qş)L\\i qÒ6Mh\̡|ѓx=}t{>ԲٓX G 4DQCkjST\)K+Ӆ HP5GM:n$|=#kKzN%N5y> 6Nly*_FJ8ˏmͯK\N95q<7MY]bwCozHHOL wBVr2 ^K>&{F$:<>Fڒ=(RBҦ#Q걢Q5BMMF`I{q);_y=̙̌yxhRv666Gno1<u}J\4jv9;[K81y4iJq{u^ewRRg^z鋧u=I<*Ӊc(%{8Q&"jQ58\bw?{it9,ڝqiiJmӷJޝac!YXnn)#tn7F6F7捑fԎTmT8hƍٞɓF;Ka9c5xѬDa G>#˚EC.?J1y>O]Czct9mg[uM""j`o9V |g1ecԊuFq=ffgٙxݍ:;&m/}+=yeŽgqwZ ?eNJ!#6)>N'j2+׾f*|xc]tBtz|LyZ1X֤C+}r4~^7q/hӵ_Q/]jTjXF%jд%K.8n['BjҨ[Ѕ/:s6o$'32Ź$I33DbHć==ǹݟv|bgCm=̌CJSti[Ҵ ]yNݝ <7\X8*kR0'\kRs? |.KY|oOVS=jG x}./?2\\ѳJη!S{ZT%kX3He# HCS132?-|}>،2##W6lL|BGe m~?_c?]`>;ĸ6kq8žrk?#By|~mJW/6ͽȵrL9CS^LLK'W=~D_?6^ k{J?z ?QąLQȢDjDڂ5"bi*ʍS iXŽ"8F55 zq=8gHD(D5L3SYcݜLC{nFd'#g4n(R%T<I90G=.Iݷ*J2HfG2.篳=`yC}y>#ui)Tu "kDH$jEMR"n%QV[c&۔iӷ)m,91lͤ&ER%&l6f Lܭ{FGWq&&7BMnG>>w wYeUr޲`"4hxJ_q.%8Qd2NONΫTlIEqs.f&ru!|9 9Z\jgdapRK!ʅ:9)hd_!T*N|qԻb'<$ڿ7\TgkEZ[~EG3XD*(T_uz8jn&pֲW)[ۺ\̞Ig7^Ұ-(U{giV uZ(zc$ow!B(+뺛ZұİJ\M!ZE5XӎxFuK6*^KkxZҖI5ÎG&Q?-xr/'^\?"uSxU94 /QVI TׄQR4/gqdxxiM9srm,Rfrg['/`&0΋Hα5AXDh(DH'11l-)1=XOR#M&THFIxdafIF|4{ ,u9fOɓ.mvdHCQZ&"DFd3bgQ EQ3ԉ,zd͍6lٙloHR7R21?_'߃c66qkSO "%F) yӐqߓɑ!!3ׁD,&kHDgO21#G-{̱ǨѲ/=?#cgD9&p$?<3rȱ`:dY|<~`Ig<x}} <Yx,x7fX[~1"[ ""F0a6k# t{y#i"3ozE!Ϗ,>2q1#=?}Ex8"<7L De8=Hq7#R&=HqYde#dLOɟ9_GyGɞcL}ge!$odT7FScmmHE6k1YqB1q2)#>dќ9Y>>?㭆σ"yzlxf%5C?!`@Pp !0A? ?&>M;H3tp"'Lfw' ':oޝ>>:ޱT[VIGww^EMC*ʡ_|bC ,(fNep+ @P0`p!A?Ю\ZTL7Y x, Xj.IL2Y*)ꕩV튋J]Ur]JS bҨVj+e-7mZꅱP-+JҳjҴ%i*JUUSR*EiTTTb++=jWeZVl+6trUsYeOҲSԵ)2ڴTvjV_[}9ps+䪫|ԵEi[Vej)A{*CESURKQZRƵKRԲzصv-KR֪-F*-*K%w]hݞu0wUjZVAִ-%PWj@ԑΥd9gtse}nHU n!C9_]϶ZBƼbprS\Eu]R,تuҴ-+JVzRԤUUn)+IZVJ,nj#6Vilbeµ(<7_Vε P<ŧiZORosk6 ' ;'ge|Irĵ8iC g\ Ooέ6mC#4`$Aqloyy,Y*3%ZTJ.ża5klƊDb=&i7X{b[Iya<+AH -.$"L 5 &] cK#imdH`XG0vec9c>a҄le~so:Ӆ`gQM6140d*EޘYz=ˌzԱ,KݍkRZ<]Wbص)U[.ض-lU[Bت-kRZRZ%UOj×BǽfjUUSŊ|VAM(ءoÜ @lVpŜPl u0 q[,R/''x@-[ط2[lTVome _(|Np>wN*|. YMj+R1;! ʲB7s|MRzVVV_c>BE|S6gDoz[`;с  ,~Λgh0Z%B#/.Zb˻>S9g_|ienIY;+f|y9K⿘NAew%}E-su4]nr@p528LJVNRĆ γ efN~fdbu Bд=Ob3Yk; >Bj?}닺1G>Eg!qxvD-!x̌=;V@lO]nlaJȭqӿ>|.§jҴLOG:A"2[. p[ !zφae ܛhe'vh^bDs hYPDX2 9dk\!:ngc(=4+brQsLž 5QiY4*,Ù͚'Xg*C ۾80HsR;,s0vˆA>'r[z9]N 83'{][Z N]~v")m@,P䷽?s-v#\f\x[f&B =j\ͦ+b7IuCC!B3mMdX|b\lN'޴/1$эq^؏@N18b #&-ɰmbbӓmEՉo2|LjÊ9PĂ! L}Kbь㤃 +|(cܾV !\}DiSdظpB tq- =xpB煲tHV!YِL6/#b|r9rUTo‰Ź;Lų"=f_Bafm9d?{vxs3ETEjZnب)ı/qw+M8_!nju_`z,N%޷[);WGq(5gQ{{{{h ah 6_3Jfhc+TTTRCwQiTY)**]EEEEEK䨨QQQSK5RF`vCl[PCԾ 2-\ \)r{#+];R|ղ4`7ˁ9-!K *]Wj+QZVjUU e@iQk}hZKVhZJШTJVM+IZ V%i7QhR©}VNR. ݯߔg‘X\gvq}ߐK'E]㨷R콪QZVl[.ҳjҨꪭJ#uxbW艨L51t'O;UAQR+32ֶSֵEj=kQZVek+YZjZԥ,uVUHIQQhTVH uP-WUUje| <k9 r]^C5xOBUJԵkZتŲ튊JҴ- JVqϱi=KIT=K0zޥ_[UoȪ+K?Pu&I\<8',(***]JejZf*g82UUbR´+JҴ_MUUUUUW?>?$8'~f>/W_QQQQiZU8zTEj*G;N_vŬkR֧jZUjUUUT*l[/ض* 购*mҚq"3B>/Vg\q^3rm J$(_9='IJf+Bдi*P-K࢟T_< JR\ RYrN2B<{$8ͮG/C+aXeKGr=nhwjަ]񽫉b:!Us Ya`^.ͽžmorޔ޳YxǏcYܼmCK}{d''EEEiZBҨtVUP,)KSiQ07?dեiZJҨzR_UUUdUUyy_P~0V[z-;w?.($q q+|lr\1ˇ[QQQQdKQZֵjxִLvM)UUUT-bض**@%iZ{VkBд+IT*gO?*pH9 ' oDm  =(6z6W!i0B߭1Qrw;;[]-o_ !%wT e!6yHõLuaNתJSwedUFb!XjMd"~&), M.8N^ڢzZ忽qֳ7FdNƳ~#+t.,r 6[1Ȁ"x>m٫M99Gs^ؖV{wrk3?iX$Gljd;DAgԕEQQQRjU*OUZjZTi}&2qXH.qC;  4yt9a\BQ]9M0[|8Uo:2̡Fw42GdV DĆlv]6t&ʠJ>@vS֡;͊Q,2^ js6͑%9sZ,N,{Th<0GR.}IBc@<ՈDi("ˍ0쉗2#SMBe -%i[m Xc[Sԟj & "dsrf8.|4/~Gh:}9`d<b9_J∝^͟X'>f<`fEr;%:l2Hf%СCcfdi>!(ޡtw6ʨ9`b8 G [0 (82 H uΈm2tge1F`[D2[ '('% @lv7ĖSAL;͜YSڛ&4Z=kp6eF^֢[kZjeL60|?؅Ĉ f"cxO!>s/rgl{h^ƷZV=֯|e6Ou-=m\]״S?ug1o?e:*gum?ܸi?ŒZ忽|2'z_dc+]?q7R:^,^?\]i{S++;,6gz6^3q~Vv~}t聧x%fV!)D $ر }K{ܛE=w[C_t8ȠLw`^kRԵ-]PUUQcQoAlQbbiHMď D&x+mzqZL"9EiZVhZi+IT*P*YU[cZH/a 0Rb[koL/PC2tV-Ͳ6kC~(˩ -k9ٷ!g~FF*|!#TNs!t7DaZU\g**(EQQQC9b3:Ah٩74h`$L?^h0 Jjs=jj*k+QZVkRĵ-KWb[ŲZ{ViZU U ޣVmsr-<3}.+-p1N5v- HjzJOVl}UjZUy؃ qN`B`qapk!?jmQyO2;tgQ$Lp|00Q:;|8CL&O)u#u7HT%|Y xD"xCsڄ66MhG5JKDB7HԩŴpBqſP 8RѧΘȱۅw`OsaJV w3abO2usL?f_E1an.xlO*-FxfgHa CI]EEEEEQQB-QgSJeUjZjZUP*EUiTTRx qڄZ(80@s,Pɋ;.#ɤl|>L3/8 (kCم#kh>K=Eck\M'υ KRԵ-J3˴c{\VjVaLTF⥢'qLԪK'-kRԵ-KRԵ**Ul[űQQSiS´ +OZ=s'ܴCwux4$wu߬Gѳ{]Q*Zː#ӻ;rY5R]^RR'|Q {JuxUV=UUUZEX3LܜQ $l<;gi`ƷBAҗ1|^~0R_x;>Ե*JRősP\wW9**]EE(s_nU%7JM w,QX%xTHMk!oFXmVo^qϝ6%s5P,u.:X a~/=Iq޸H9>HްPBJ%{+?Giq2?ta\xQgwrCڿ R©vN޵Rq@jLjZ)Y**v=JҨU5[tb;.hq6X,Ln(I,[֧sDh1kE}ч*`5Tz՞h oٜ`o,Fwe>F|axt ,GNz;{u ;Ӳ9ghQt3z,fcf?VOw&C1l|w<?JrYtSPa8ͷNkJtV50ҲZɞiYiQn0kf }.jŰC!Zb1Xq/نC,b+<8puy= ,sy{Μ>y/cȩ0;U;TڨiZ;VO Ҵ%P*qVᆱR%.G%vH^߬-βGߍbN ntIZ]glwO|}{9#jd0c1?;tGϹgˏ{Bt}Yn# RaY=*-*|WTZԵ,Ҵ+JߛT t-C;g;\1/ Լ>_?ԛoip<CII9x3PwB#&l G};%J1qDK4_LǙfjlkDg0Do12ucbu!v!QQQQSUUK5UTm/a0xHXֆ<}W*࿦p'>ɨfspVG9v@v܉fx!M_!#6`'GaaNw%gy)FbK2bf4͂M8hǎ[ο1a: -9\1dH^cUI 3l%9ߝgeZZVk'r9 hϐZM`|W~'QQiZBҩwUUj+Rֵ*EO_ oK;x4W~佪M1_-~L=5MƋ޳~=+p/i ??le\G M>啶Zdl/Ors՞?[޳܈m֫vF8;AdUL_"z3eq 氾krܾir//s|̙q1q:=Cq7>/H,JWS-v\-v+#8lfl KV&ċؒ򁑺c6jV8&'*_+ ;뗰1(7@cj_+.DX`D 6&{!nY!ګ|ki;??HJ6DFÈy, jw68ю@}JF'$GUǝ F;I2t S]{sѰ]),T*XVi bض-AZ 3 U:qa#KZr=ZYqd Bb7 tq#([lEkċO2D$a$lQVa'h, fů20bj*?(KֲqZ6=Qcц66&S87ؙ;1;|ǐ}z֬ˎPbGv;^!ąA*-Jqm f{ض*-+JX rφR#xd8MB 3*P|2!yaQ>M^B@yٍ'4G9.=Έn+_r"Dƴ%^h7>Т[p7 45+5mE iӟч㻋 cLd }wF%Aˁ?Fw:+Y~Ρ#hVp@^k2͋=|~QfՌb'.D,ϝϰvWG ^ptVH$ :tx&YiX9IB`fCi'̍N]}[-Gވ/ŰxN} }Y>?bd:KLWc)xC!\9PpFo0lN+rSҨw[ 8 ah72i.p9gN;. gս sZ~U !YI)ýdS 51M}RR4Pp^,RK !3 =BtLOGN5*S29E"`5'h *E%I(n.,'1z𩇎-'caM 4p R2-,ԳW @ϩa@Y4Z"\fj@b|ٵǟV9ݍ)[-[Ya{ 4s ~Iq 8p0fjڿ o- 0֍]튡T-kRUJ̯֟ M oE lzv&> =ZmI>jd3m.cOEю[y^$~cÍXS s2 #Xhϯ]KL,cBfP fYޠ6B^+PXmC5ZA4aj moZțkRbU bبQiYa*g캷VK V>)8<1>ޅHHqjm!='KKL{KD?ZSo_;ovMb ^hv>'8B JwUOِM> ë tYilx5兩Slkq`<r?v~>R|J,9]5UZhT*f qZYmha"Y16Z@keG[>[P|ڿc݇跟,`l-#\*]6SXIquKB}7Լ0c@ƈ]E,,)z}+lEf&_7gQQZ!3qB}ea Hmwi*R薨{N$)]av0ꪪF1횉f9Ӎge]Z]!5>n +3'Fv0RZʚҲ "NjF,3#e0s?b[{ 8_fb u,&c f^.*5%92Yw-6rGZmpb-Ɣ2AtA$ѽ\^h tlOM-׃2)? H-*Sό-4IQaGt< 0Lre<@L1Dlp6SbϞi,nC 9@'!hO c0gQ3L^վ0)!@@ka{M=XHV{{mq#G.qؼM΀Jí M x`v4iHm.)|czJ %ګ;OCuMKޠYx9y[Hi8Lٙ'6 "eb&}Pf>hNG-6︥B3ܛa [|փx P**v)Lt!d@ 0":XF¢BؘᲇbrM^1c}Vf3|ԐTɀ;?D)]%9a5؂cG@X \ /}Lm]1: Mc ݆x8m- ˳bQx!xe!d46XZd$ڷ=Z~8 Ld6X-3f/0[Nf7<8]*sՑ" ntEVJ|AOҴt-k7U*S_-*rrTTT:\0SVjUURبiZJU YKRUQH&5Dx))r,\w˕jj vJ|ũJj|ޥNCԴ*xU"եhZJU ZU UKҒViTY@)Sĵ-Ej0 .RWN)ݒυ9]EEZjZֵUT)t JVCԾυ+t|# SwK>\ ][ê%U;XVU.K"-kZVEjZVjZEEiZJU UUUS'"v-KZԥ1>_^R| .\)ߚQNJd)]S֪UV-JlY|fN_+tUUTZUUUxSv\9prڗNK&H)JꅩjZS K¨p*z֢JsSlTYi+IZJXTY2ORS٩5%^y ݗg<|B쮩U_&!1AQaq?!ZfЮ37rC@p0 n>Y{ͅizZ1CfORNʑٟVSj".cZrCpQ) %1PR$&ࣔiyKCൔ,H;舱85_TR\a9qtG1iZnL<%IⱳdJlJċbKc%EWfά[MW>r|7q4'D E&UN0KBBi YeC2aPQ: A"SOID ¦CBȗjUrQ$RnFYOzѡ¥%'aӗܘ>2*ԋ MCJ7.Ke( ,.pLgVAMv,Ĕ۲l!lcȥ 4)DI;l8hk?BatA*mڽO%AC?*')Z !e:dǁO%df N"BZaw,~0B c%ra)jmt#u@A?1aت~澱ob6Ra5Q~ jJkb}DyApKI*)Q1! 7RUE5E`kՍmKBdjyD5RW$_"DSW70k'w'3},Z3޶yT&<E~AnM 5ONSA2Ւc&r6ȓ!ص0 "YHV[cIϱLFaHN..DM>~ƵOHXj u%,NCĪKTͪ\LCj}z(r>iF6" -{ Va[o6A[Zrw hz hpLН+I*m"/rz$r\9FFan qse,-1_Q|,7wJ3g\Al"( $d\ &gWMWOS)(]EIQ!O+{ \r }V nEc.&2#&qZQٝE"t G}:ka.v5=28d}` I54 gf-!1"Y\ B%"YAbC~ jpm%n%sԩCХ@#LEt(\4h%ȭAhԂt5P!ЈVKBbJĢV9<+ȒbLDzJJh-cgk',4B9luH>ۿ+.c%$17gbćO05l{o(c•њ&u&Ոp7Iݗ44փLYqAJ~HKPctvi"z77.\䮡,'tؤ$j\U)͓*D)ԐnE$=PХS/b~& a(hz@El> I@Z"s*HHMoB"镣ō6IvKt9^j4Hܑh~g*i>,>K"aw c*Bb*kAKdR%6q1nBAY8˷-7gD\b+[Ƭiw>3/M?&KiIЫ]C$q"EhSKOmz#au YCDWi'vmn1#hNM.(/]^4<6Q9R %/!Q:($@ (m|d&BʂQ-y ʜ ZtEqll0i!9"mJI)Pie%r?f;Ociϑ+"j'e)`cV1,2R2HD % P,v,0cL6!8RR X K^<ڐޘ =c9spOF+1$M1V"foYW ! fB0 J\xM2E_yEe&DMGJ*Ȝa Y:)4N#;OX] !')(m!{"hfMO;R)Ux5O,ЉHѨ9uD:8~ɏD! >cQ yk!/@Y*ţ2I e(&XRB!M>ؒMzNO 7"1RC U&͖%F\2GhЍKzD 쐪n?LGC$Nȟbe'eBDngZx`pJ[c~MlxcFB<+#̖-Cy6ɨ4ױR DCIKVd ^eF2|W4[}Ck#?e" S;(!P]#&FRul@M}2~Ku~T*y|$Q3RTniOiW ~Ig/PM섛9W胟@+G {%W {4cu/cۯ/kRҍF`Na '/ld?Ahrr=j%MRZɤMFO$KNg^ĦDHg25! u#GL[5&t i^W27Lvk炍d} e jI$vDƕXZ^>D;Q$_,Ķ/q׋qW[^anlkDgqyCUm@D4 ӧw4?f.a%ʼ ݏσiPĶ%GҴdR[MQѼ#92TBCi< r;A|M;a$ya+VL6怨um5Nĭd `Ma<!֣[PIn3MYyPh,S&Nm2E52Zmdc|٣b"K>^Qbۇ-578r/ԓ^dM OIj$T1%-?%J8HIrSe%ȂSB- KN$+OTҊ. s/BRL/e&v]']\{b Q7,.E 71c[8J:pBRGlb'Q[%B9b2MBA:`DF5ҳG!pIfz8HZ%]r͵XJ87ʫ${bV-x)G_Y,Uh:vfWH- tJITfXJ2~lY ղ\A.\p"Bla\Q 'H"lU`݄%SمL45IքPؔ1CS2^JTp77C JN.ȟ-J4$H!#~ & s): Hd GQiއ/Bjl]1jhѻE &D/sv8ᗳxW_,hE! q5 ;RWȂRP-T ?I8N& =aXF}nk%@ԉq, 3bK#iCɣ"}RF! agJ'MSU/b vI'k%vFTЧ8 PrQpٮfGQ0Pf"c pj$psqC{jDkAL+DQluH'(\2>*&QcZ"#T ʧLDjNO(Q΄ƱMr7>`jr"!cHA ,{ ڌ?ZAD,+-lU[&˛?$JaU^9 ؇iaД &ڴMֽ_. ЎS{%c؛e4Yk2i%2~sF4h9vj('^E% P`DX$* MO@ANIRh. Qk?V2r#pE74` *;%?Oh%5+C!ȑk V*S {2YlAD/D`kX芪o@phab21]?SGR&9QB IАv@r~B!TJEX T1@pJCHZBԱC fHhki٤ !!w M["E8g8CG(lk?c{)WO)TQc`},p<-Oѝ08 0'$V˂蟡J%(Q!L@Kǐ.HFBhyV6Q`t%D "QB KMdMv+R4}ݍKAC3A CDʉ@nSa&_FXo>ȜCFD? LՁt(%BiL` ?B'DFH7J/G= B[+8&HrBG% k2nʘݴ$R**&jKaQ)H=HLEA@OE$ Q@p5eMz$ȜƦ5%(t+i Aq1%MVCHDד+x30!ϑád#P!U-hjxKm:Ht8(Ls%Uk=FEUnCr-jl{X',Rzj,;Ȱ~H˩$cӡ".A*ؚL hb7a&e-W {C _-D#(pEHm8h:b(*܇R8{K&Y7 ɨFQ'45e5c"bOc <h4l4Pʡ-Ku$%|JVD.M 6ɠ4Ӳl=7!bF`*2NߐX:xC J$4uN$[nӑD4U@r4Dɰ*ennw(Iؖw9!>WȎ&^$!q<"j$4H8 gb)9& }̚IfMn#^'p$wDdnDV[m, } Z$^>~˲~J7eoCM&]]'Dr 8YL'fNu vn<7),#Y idD9OWBt0YBPhI8$[ @DcDZQ:e%O5K#R٦jLRxڑ7p; 2BĊЙ2#"RN͒[EK#AfDC%D3* 1^~԰ҖUUr:ne7$HA 춐HJHƄAa)YX.'1d&'1 árL#]C+qMR(JXrEshὯqbD`lƒl&Lg|Ahe<Xe d9+"c4%􎡨c HJԬD"7b 99騡`M hT>G}.ɬaE"j"S@c& @$&GiLnoQÔ|Ȗ`jג Z > ^#sMx@=4,e/փ H5pɺT+ $d7D_OIϢE$ԣx%D9=dIs3곰3RM:5L't{H}0C!cY%O}wFNڊB^)ʦQB$'+[ p3M^yX|Ey 9bM%Ȭl9NEbc,}a b,rpF(5y0TM!L?W7Uc& 0x 'Oԙ djZdWp3F CЂ l4.蜜Pi>)H勾,Q[(<[?Ǒ'\dHo n Zy Daq'_f+8dEj/ #G` Qj,'sB$_D"jIB MJǏbf5Lh@cD' 䖬csLJ'Dԫ)82!ږ57J$vʣZfQit7`b=|x (8Ԧp-i{aH$g ?%D wu BQ7˯H?oC`/HadW7CCݠ'_=(~)鍒o^xh7 L&7B͊$$/BFQj8BK R  F7km1B]}7?d!I:AD@7x5BX CIQ&)ͺyLjnLgLMO Qmѡ0 RȐnZELpƒ&Ɠ1=  Q)D m TDR EiIbȇ2>Æ'T<޾Byt3p7D2(PKK#N+‡hьP5b T(?xs(^Yhٱ"I[f?ءSh9 `DƮ9zjY geP;4 X05zGI‘t gAe |gcܶTK>}!/-mk6Xԫ. rn9Y::kNɴOhYX$j:^&Q2a.rX38h6RKv{Cjm.0bS?#qXbVOЖA5:t-jE (05" H6$km^&NDVykjHMIvCiE Q9ut7`69%j0a MՉk*ؠH݉8LC +U_0]Hݗ0T5dV(Fd+#/V ꏆQrwݐBh%N Z_JIDuBT@j;AMK9{r U9$$Du"W"><#5vyhAFV0{rJ8ɐuBIPDhXh~}'0Ѫ-"8I2%TFO*3لYhANȧ~DLq$Ѡa#S m lJ7Q6qQa$)n0B̜_Q U$ pf_#IFܛmݙbVT67yCd{ئI49-MdJ[܊Ȯ,CM.>{&%a&{$fq]ق{cOB /M%$a/h=w 7[${ۍ,֜ڹsǓ^i @ԧ 0b+VC0;^,A6NZvٍe¾_ҍP L*@bȒD=۶<"{ZNeCcьHJH}dQ~K^nZSb湒i9qbP#%_|m6o/(6%(d&7f$[BK?J_8%.@ Z"u ]L|!Hhj+RvCYAa)Q*|e&0~ԀyT_Gɣ|%F^X*`L8X&5SN=x۷fFȪC9NdL54O0Togi F"'Fwȯ!:9Ԉ8tt᯸葋i$Iٹ-̊bQbz)t IT F(q+0f) pCJ j(n5ǡGC0<ۍG!HObiJp%-'!Kq/J~QDz#-Mf!ppײL^ք g&D膳_}Bu.a vwdkvw){1. &"S4$7$)Cv2dcQAe\'KHȓ$SS{#VN4x R&$Z#L VdAGB?%D ;Xг yO z&G}߱|#%eO;q[ BUʘNgWLZE{2>diN?OC S~iǣ9aѰ ɯ5wZ~6ᆂ)iIgkM)݇o,=OkB) %K~CZ>CCM!TM-L2p=R[\Q J'ƤJ Irďd)p_5 0ρ'o@ FI6Z5"qhOSƢɥ;st9X`hc'XVQHc?X$鹆<+#RUc̿#45.dX7D-F@tW:5``21+Srr7Uzl^mh¡" I1Zh;[]/' \6Y]A33I Sŝq-+Xj<QxAs c2a?-e8 Ō!FkEYfCc {%YrN u3 U@kci1D&lD,N,sJIV eU7Yz2 QGǚ6!޵R,STrmtc#ٿW5ƧKFA@x&("Zl+H"HđLОb':C] z `ϵ~'Pi.ʷ!%E+=?@(EQm0'huU1Q}n`HkXcȊ%T5-5- i( D$P,zN*gZ}nzKECH!^wA8C~eĒP s6hO]VhO@$Dye y6v =@(ceJؔlUTc0|d*n*PE/nCcE &5h.q)GW}o[y&0%JE֭H'%vD@7 q ,fy2]K,Xqɒ A$d2 @ (*u1} (`'L'Lz~qEk{P/4~i'KN3bcL5hneB~QOta4$dP( Tƣ RQP~q70'CYS<&Ry"8C!JQ>NDcP^i|EnSG,}%,iO!JBW/=Cmkdm*gIdZzRzَrR_8U@F{)L 7J;cРd faG-7T_^^é}WUĢIL1(x?"?Hb1[!&=!":?ct$fPsn.X{!˅sa[ 3o_.+yĐݫ"=IF(DF^KPxD}[r:G_MID/+$V/7E>$6Fp#AF!$ Ue Jv£ĔsUAhXَyAoKz7U:B ^fN^<73nXr5ُAHsD/CJ]o|a`LNx'QrbK]C<6|d숕BȀHsҽoOOF8e| I&4 8]] C+%+r-D+L34秲, 2ܖf;,L8ӉKqO/`q?FpT^ZBKJX"d% ?tL!{6L.Razdy#h\ӣ[V&e7xK:Z (i!,*̪Z9'gqfV60cCNr$ī|FJZVMr$4IXИ\e7PW=  9IМX3kq{)g`% IR'"X"y"2`6Ѹ㤔%m&ay%22 W=b-# +rѤ'CV$s.ͳLK37N_lbzp!^8q "Rf!N_,qFX1R<"$h:1ݡsHSWj.I:G+N1 I''[ojL@v۴D&8_Gq"^'H1̼} m_/r,Rr /% Wd*M5QxB B{zIsn16ѓ@3-ODɝ/wO4cm#/-FÉOSe=D}{ј pT"&%Q]ud|_#|_%٨+Hkn/_"52)`XP#Uut-KZ8#c4=E)YA1$ʑĖ|2 ͜zIHQRxPBNq#Kv4@Ղe>>cT|:ȓz7/i"p!dɰӒY*Ra"Z-VL$G)Pޥe2[ϴ|:[ƤHn#B6(DR$'.CJ?'j؞B3F26&Kyȶ" ro&)ɓɋ * Y: 52(Q@&qN4PJbhPlAp& ZvG{lgp!s?D^WQ6$&+ iWG9;y}6FC&e\' rm8vJ!I8qwA]`lz wGofFǖ=[>G툽lWc1X`)"kT %r6;PnT,j6 $Mm%R5M w첟5j.U% x-%N2$S[h9rt>ĵ:VTm.ot0l$LSjfNԬZ1֐bˎIpK[$$#ԦJd o*G)PȦMZtl5[0q9S NvNT誕Le eYjbU̥IA46PCQ^e<K OKȑ¯X*Zm*|RH2sq)] $MɄ >.aeLX mXkyBL -LjG*W+T(+KIBԧelΥ ^Q&7$PZI%LOGT'-H#Cd1y'Ű!%%ېLWQO.3f䡲lx)*p6rHt͌?6EE}$poȩ!o0y#Rb"4&C$!ܛR%p)/Yqpfizt'bd"OܐtJ5d+"GJՉWI:R,/N ? ]h<ܠGTx\qnЎRf&(] }Fj nN|'^UE2Lp|rΟ. $Ox5zMJؐ pjVsL5 2|"!SbkhpIJH2飲CVxJ\F>_6H J T*K4X؝ tMlYVm$PNg塋`~R~Q;تEPZMGə=SrPy64ܦ2/9t(lv=AD-dKDw ki5^ʹ)/OpI6Z \,=.?bmjgic͑ 1K|zB\(w /V"Ag*EM'wؙ?| dZ@襕C->EcŽ1Eŝx/uH8[dU 5#. . -zt][70Eu07j})䮇3#a} gҋ ir>[~=!jnY۲Vݲ 9 6%d[y/oy,'srgq*%Ыp_Y&e J\ В7u"FH#'cEE W3o [NTrhEa}=[d5V7ݻ\BG!^0!I0, +SNX^-_J(AʖR[W $Fn/N*JwV##.r"˅,K_#zBKcJ(C4!pS+XKgbC̶fdf-$1e u"ĭbDA$L;"o&K*-~uU?քf՞@0]mW5+'ȴD҉ѿhfv>ůB]0dmHO<^^4Ofk>=2o*pFbB|jl&ccS X8"'.}#^$48) {VPR"K"Bs I=3t4F `&k#H.HѡP{7$u:%bm "$P5&[ZnH4Ԉ[fg aۦ(^:j C)ɕ G%J,aHP5M6ڌVTٺ^O'Bܜ=ϦbyT5ck!m)"h'V>ؕ4JB)pd~LZi̋aLKBJ&./YV6hTB:<9&77oI;qrI<-xӤҨOTb_2 CRSеDe<ױBZE$A{dj6JS[mX a'S:9h19Oɨ {i* 71L4TH%2D5d+q>p°[OF}腓L^Z$e+ph (.m,1"8GRNX(e;G0 G{1d~$KD(+>q9?-TQyA$p|]o%*l2rbb-spMZ3ʧB%KW@ޣL}dٻݙ+[M ۷ΤЛ%"q+-J' Ĵȳ)`?'>F(N4) RuxgKnA"Dt KT H1X1 f;> Sm[LSRS )ZI$Pk-%enz9|[ CPk*}.?I ;"`C^-/EFI`D0Fg!-^r7% h4:B&-l9V2eN3؊N534\7XF!%Ef޼rc1#j(ލ ! )ZAl|ĹADE^XE{FYXcB"JA̮Kµ6쎴&PX bz T߲4 a mT  Peyjm劊(q%]"Q w(reiCМ0iòGD704*p G gD9JSȵhmk+A%(ǂ{=A|cr=1lل͌1cdzWnpТHKqvI'1@9KaqT#+̏h.#L̄d[y2jI%'POf $ ĔQ$ %a+wIr![mR,m/k 4]-{  ;* =?mSǥ9_%Jh(S'p62X8TS($4x2"L`h1[9%6fZk_!4Tj)^Ilj&UGg ] I)WF"iΨrD>r a!>W##i+$C &[dmt;i`UH"6zabhn\ڕt&L#L}فsKAHiF\'[H;$n`V[O"5 M5'΄thfA9V )}"9cMaL/i(h()p8̩µ1MP2x jd ,áD&zm:Zz#rMIԅl`;2&PM%Lj#jI&UnUJD+cʫqSrƛ'.EG fm&,r,hI&)lQS$I bKdIK~ɔ$9 [#VQDHC`K j)H}7*}pŇ3eN )P5kQR53_,pM4LMjg0hwV5[BMI'qhmb# 0Ob;li|RV)`H0!S-Tn1jRKLf!1d&!$""Vzh$&1QM:$#G>.CAǒ4b4%FE(xE b6"Jc| PSsT%LbcvKܱ~XkcRkў6nZTZ4Qםc [ƄZ% _ptfU HlN?Cg@ZVCDjULN!I)bS$"h5YbiNbqPAfh$B)P DȜ E@dSK%!HU( lИf@@&Y@ JhB`,X7$pc. eJ` @ % 3IU)B+DA$ .IuH}H$IPBaI&<$Bj٪$lEA$  KR 6I" I$"AH$II%M A!4""`%$I!4&ą$HH [$%̶EK pJ`  $2i$@t ֌ZBEB A7 M$CA hA6HKX"I-Jh@&E,$I$)I[ `Jl!@ IJ`-LhA$S-!@4 I$$)`GE8`,$i:) r68AvDHl C +Y2 I lFd6IXP%Bl4 $@Ie-%^ le6)$$l" IEA d *66p$D@M ̄S%%A 2M"IȚSA(D"[-"J>"4$`AD;4 cKr2.J!6L*A ,@W#}C\ޔb Ab ÑXIh3!H A%) I XL $E  0:@ jHI$KRI4AA $'e6Aϥ&"  H D*"iydI*!{DRI$ AJeVH@ !! -D'L4Gs D Ai^c6 >bY%&T-$ $`JEbHami@PTI.6 d@0KA @$L E"K@@ahH%A$XA0 I*aRi eA .@HHH-#L,h"@$ (bѨdL HHWɍ ) A)fK i P$KaRaH0@ A(I@B n30$@0@aar) $XI0D` i0DHMMNq$Z  4h$ PGX  J!gTA )h@ 0# 0 A*@/J '@6 60PXcD H$:YI B2VHYE de6d$`0Z  @$ؐ0C)P"$I$A!"$$Z<(wj`HQa&D$A 4@HH2_$L e@| =7;d !) LvЄBTi|RA)`&GۀHE$9D$#;ՠ5VMc" 9EmI % $PH!1m %p 'WiȆe dQ`B HR!MMpYId[`-K>+h:(%–_EP%&ٱR,&s"H&&$܎2@FEMA@aQ YA )$@#"6`ăL--QL$RGi !`jBAaĈ6(c0VA!%D LAhZ0NSSoQ $$F Q 0@dN@ (P%mD -%IPLxIV h %O(M$ @!&K $AƲy@HAAPD$Y0HD 1 L (I4 BS!@ Fhn-1R=:h >O(S)@/  !01A@PaQ?HJv%YDDD,JENiX"",EIhBp$5$$#>Z5&8"&R8G:!8LZz^Gz=ZӜ"%<BD(wDҦ*bםoz]4VqEHU b}H~ y[Jj%|5=񗉥 F=!a L88Pjt}maL(1Ȗ<62ϙΆnN罟2~?7p%&}ўj$O I?z>rFFt1fjd'z;ޱRhCvxXj9ߍlѸ>q y&"!F;-G Nc."F aYbXz' s7B,CwG舰G\.t$/ICIje8R΋ð~!/z:|t% s|uxn\B1zIxb"" NēG'5u'-|X~Je8ECd#XO zaޔ!z4"$Kqp&ZǡG K7EydXHM S}!|3TVQ1;CbYxA'຦1uGz61\E#d9̤/Op73!hcގז'Բ9'~aQ\:>RDޗD{DDo=hPu,$1/-JJ{.|<{ڑ>a2¦qư8!{}ET很&ܯćtOktNDW ͤCS‹t~n8xC GOKs)fˌ2,-[8NGJui1#K7N4'ӑ̡gzpa_Є6NW+;T{  9yE= Ј% pNgT}In0\h 0Lj/Ƒ#Y^K/#wa'Mh^uҿܡT”N>JsK䫥{o$'?Wc"kn8dpU8'##or7y>Is) ŇtCWܳVxx^nzG'DevL?:ZVgNmZ9ç=*E8n┢k H?6KatۑomnⲻN^ `t]{./J.6NbyF*ý5 lOZ@z1?Іy7CK=8)R L .4"lJ tCS+?؟rc =Z\!<)"!ؘbn+_S8Blk1%ΊGWFM$x+4Fh~l9p~??yAFD%_ZV.Fޟ?G޴G?p{Ax??g A)V9b\nz|hHjt%IrỈ%ҼCz"#5֑ianpWEև4]O, AQ!)ᣑ&7!-׉ƐKڿX¯8hBM^NW~[u{FN nP.j6j~lRx }P} p']9#yNb/&izJSƜS ".)_J|(,43 6K>ațo\^ )GEXA |C|9|9ݛ̺Bus0K7wkI-&VabSo< 4B灋 ܵrHV^Ì#M9tMa)3fihZ(E |E?΄5\cI!o5e=TCXHTuМ/X\~tjB%%LXLgaD,9/uS= 8RbK)]>i7'rp|pY7%SDHF5JwF a)elNxWs9=89l?pX։~Ft"B"Bxo L^a#XoܧJ+yzx祽x8z<&keto=^NOעPx hE4.<.TG&as1C}Txqܱ^yz!Enq "&ɬ8q+(z?Ow1?\Jq"z'KiN&b#A ^iVfzZ$%6#<  !1A0@Qaq?-7lz9>MS# oɔɝNɤҒOT"l̤Hi7f_#ᴽ]ذk=MG>Κr {lggf͡>N09.M{K7o΢df1>pOf$Nd;&pȘp 2ՄWY3xmM!2=FΦ ݭqjMxkĦvbL2bO}Q dC,4=DxaOLcaK݃>r- fL#3"'iD5@іN:`-C8(#>M>N9flf`a.c{yLL2fD9nH1x|%= @'&:;XwdɈ3viK͢ߍ"e@ɜ=Bfom@dunAkùƟH-R.תagٳ -e'v%}LaaB͵Wf,]٬Npx[zWH;a>p7ԃopMa{6$qsfV'y8fL78>dƘ1'p&S&;22sy2wnβ8{ k9{2=ٓML!5i2cL5|,l2dmr5[byf^18?11r_yy"lf'u&c16ϑɰ.M$}!aț.GC#2&1;@M;Ƅ}.5!ϸӑ Mݓ`I&PI\fkLc gJ g6kfDit'gYSN3-6u:&KY=|G#Rf@ؖ{Fzl&+)3Cmc:g(!Vl8sfwg<~]Sy[H|&k5dHS;ëֻ1~,TgٽV8"u1,VsI& 2{p r9I+YBϐ{e2d9yEgq2í5r NCc76i7b#[/pTf4yyLfe p\` }ɚ̙lN;6}fePSE6CQ]~=&`u>ȽΨ D^;8u3YyI-9 ovm6q O1K1C[O8.MwSiŅ;iLO#]q81~nwa1֙ 7gVu>u2>D O\{634Ě7dNl׎Lٖ'2'iH[Em}ODfIػøyN3D!zc|c^fIwL}ET(l7C;7"Yη؛gl&u0$}yG‘gs;ّ혔yD8l;ax7c,]ؖI 2c1'I@5ygD(v DfL-OcY5"Y7/T! #jQ=ggaD44곸nvQ>p,qib.v}ecxs<b,'s0elf&,#L[lo|Rl^80GbJL> kx.{8c6{6׹>BiXdHx̝ޓHrD2g= !2ݥ'5ٓ8{YfMc>HF.Fu N,O;Xٛ3<cHsy6»ȏ-gOx$Z MW]v33'cAL} nQuD&ǿ׮?#fD +BaǺLxa"[G6r\'Y n\-cla:-P8񂳹Ϸ 8d|fG{I)u:lޣ[Y5?Wy\}^0.Q8gxȭ{-:e#y/#զEL"uz!2|W7x?,)Q9'.dOy >Clӆ;Dؙmɛ2h1 !}&;y[zٓasoo]5k>D돴8)3ʼnf1^]o p!ɼ3fu2lȓ 2l+ȓG~{zM3fm[Fmi6nCEa!&Dl!corll:C\f=&HE8M=&u[fw!,f\MCɶd-٥I&wwϓ&WQJ2꓁Vw3oZת6m"l:IAY&w uDtNX6ٽnG ~;{k&ئQ?;YgwBa3`VL0h͚fu2Yɕg"6g ?Izͯ#&3o&L{󑳹L95fcwvk7Z6xlnG6fh),jl}ogcv,#{̙1=LL?d ]Oflfl~&mS?-.SHBVu L&]gO=X{2i-͚L؜H.tſ)fZl->E$>wLj'Wɭ-e kFyYLaw0؝Ě};=X8d<a4Em5& m&de.qL|ϓ4Ml;"c G g= [a{rov )6'Q0e{bQ]mti–}7`}c&=sC8X=WrK=c򶳮 ;ё֟hi1([יGsc%Mީa7TlO>lvFalSM {<M*\?zG8Euɋ;o'(Zz&?u;iyslqJ!3ɢ`,>͚Ȑ2<d#8NY:زo`6u4"6.GEعa1chS["҉cX3YM;oS%!1AQaq?j$>4ȎpV厽)ĶOBb9Z[? ig"uύ~pZ5p,΢`/ē^k\/h}b 92*&d!@$|?GO^,֥tti\͟\[8^0%?c+)1$N?|tkY1lրov|})#6%Ћy3%K?o n^z=3PJr8F_Az 3`uqq:}k-+C@B5][Mr\Pk(:ÒA4'1析LY;u=M%<;V he)&=k$ \Lyue.rhD>ߺ-{NpHɺ˧.QqE/e/ [і@/?f] 6͐̐+}yp /0+LH!x7hin{TXVQ銣6M Tykh_DjNtq޸ŝiLZ j &" +bg+C@֏<):E…F` u6`Y%m~O`vv7Ep;ɼ)t y"H'˃gD6ދ'3ǝeq5)9CxAx \)<.S5gn0y5yأI]N?l{ZSr#|.`l0I;#n#9m:~rs!"gc h/m8meP괉¢;怴3\9WZ\Dk$!7$kNr2&h5iɁ5$rB(ںq 7:W&iOI4#VёHq= )©G7A`( XAJH[لo.VuсF* 'V0)X@N8ٽ´lN#GwF΋4X lbifn 4yw/ɔYO!5JY6ւ߁ػ@O$}4Is$hq ;vN;pA8! o9'} ^x5t,Tֳl5J'G-VaDi yf3s^PBo2@jb$'g W:vȂ]`) zi|bj&'R8ъU *=cDbL9UsUAGqh .Ԏy2wm(YiK_4گ>VSDy~` t\$5&U':>X5c\3#x&c {", 꾟Z\ γG~ˢ{ǣR`PIw|QMf* īC_|HMls';Tp` _0 "DW(!'b`g%gJ7]hM=,->b$r"l, ïG-Xz>ό8WcCÙU 7ъaJi*`=> 5ɾrP>㊅*Ie9\!́@) l zڎUq%XC㯌b򑟟y &ƨCC50fnSh8H OÀ:B,c:aO0˰Q^XtcMc(y:!AM4xizG4Tޟ^\k(c]d7G9:ڼ~2[ kT7CxYG9_<&BzW NnݚÉUO?ZcN؛W<8 V0Cpm4v ReC@Nqd[ <ƞPg"ul^WRCyXo|D#̄(UpL5#9S@fl!ЃfU)+>_F~j`x4I w۵nH  b1S8 ߏXv:mߺbDG-|msVœ4ErMD*Ufό ][p_u /W4C1C\P򦿌v,͠UWD_9ou2f*d8:i*mnwbaӊy[}v`sQ^׌RD8jupTYׇ!._ŚN$h t}yVX&rW-zp+6c9qq]#.?IXqaB9S_9?=H0po nWNXHdIau+Ģ0v(7Bwqb݉nJtF`ö (h?6Xtkpp 3{լ5&bS>0+_y(jv_TyxWe̥ mǎ1 1*^U8/&wf+4i5, n37pjA=`ڀ[*p̏8u0 RXlg B8ca"x:8d/w`$Ճ4#xš1Z b1{p`5L]֕15#눶[e園yj6һ@MnpO5TںS97\'˚~]׼7LޜA;1š߇낀c@' /&,q;K Nk+,:<3JrK˃ Ü'/m =L S5+s( qNjA TfaCY;vz2%t)8Cʸ041$"8`i뼝N&(Ek9S.9$5wGh#Z^9o8|h8lNwT d0ڿMɎ,l`uqɮJX:1RGCgN:aHƠ[A{Z ;<)'zwC[뀐 \uve674+_)jlh?| z0AEt7g$2 ]r@`0%KfqWk|$}ie|B,y؆NʹJ߈cXڽ<#NHjIo6!Dsq1!38 Ų(IYnhTb߬ٛVi-ƒa6>)i4R0';2;ka $7=x<ᢡ1[wLHvB ySyBǹቬ'"DqGiްfRe9dB;ep\ED^g7:|:TSrL٥`X&˜xEZ ="OM'%`usimA)/"5C,C{y)W]"{F1^R^VmGGe(ŌaPB,LR3B-kѡ8*`bbf:sm&vyNҬ ]>7p5na*;GYTza.wrq*HcB cbϼߧatvt){do1g84ȇ7z+FXLB3q (*&\*G'8F񕼴Tjwj 6@bp!^2BJ-sCϼm j&7\j9%1(D(֖ޞ +I0Y >9d0< !A->Z*o^@HC`%YB1((+ d Z2My2c~BOf%cca4'9rPnª{,OFbTJ!HbMBA9]02MUWKPEـSqd#v|J3ڰn=rlG$T'独,LQw3A:1d09x/fL7wPLhZ6D0B %笕BOb5~1 ΀g.j:D2#1%E!:ruM`W lQp"x,LUG eۣO9Ro`Α*]x2Y AJu pi)#ϼFsXWGf8$Qq sv( n :|VHXSPa-xBȀ#ֱchAf4Y b1o\`} uǫP]+e!耯/ a1\-H5&8~J**eiAji)b0Bk~dw6Hx= \JqiWقt/A$v*. H"Ħ`;x~pA'JVW$WL5f{<0 xʍTڽࢠZ򵎃ߟ+zӄMنP|cuTNGp6o A ףyyƐ(1Aq`0C}̏4@0uqe=z?- yƨ1^xSm˅PANۍչxhqI ?8ew(y='Lu|c = xǘkq(~pBƫp:HAyzhC^Huʓ*c4YUw-i$SȨIC2x]t=9Ҙy:`ds =bsT5_ >Ϝ rj^W Cp ZόD\Sbſ[b#5UЯD;t,{HLVv(uFsK)}dNxю~oXMx޿' pJ[ ~1]3X{C^?f  OҤTbGC.l>H!cSwcMspJt`9}D@,%=GfؕA_g4%jqC4)~c'q  W̆ &y(PGow5 !XYSt,ʁ q5X l4߾H 0yEDd?3y%T^gӃWx $9~f 񂳢s2UKcqlZxsixZ992̵T/tI*De|0UxOxIiP@/@9`)@aCoCn)ojcpۆ9wz)xO8iOi3 }% l X:exx_θf-oˬ1 "ⴉ#5&$`QhlQWMِ\0}D,JQbq.Ӄ#ܨZ)򍓄[C *IZOM'PK?*(/TEq( 8NHeҊ+UF YQ뻸 6?E yo7.߁H #>X9G lRsC/d p!P^ocW…};w ɳ{f^g_L~<rMW텔!c*:"o XK*s3D 1`s`w$aeiu!=x>0jjy[gKKiqb2.qn=Ƒ3vW]IN e4X &^ft}r<5ؖF@6ֈ X6A0 Uށhjnh@ ThxU$| txn7  .լ &F"PTVRZ RR  Ʀog\%p-Ux_B1KWCĵT'q fd e2Ҕ`#fP)Ǭ :1%3EXA s".->WZDS,-`TjLj0pDv(>?@$mkX@>]a/;la+"nxȮA3[B&>qQ^'Vw$VEL NrbCB|fӷnq KU5sC)<9B|eGW% iyCC2p]fpUc2DSB7]?ڟJ"fҳٴioOɛ#j_6_8R51uoMzX< .R(!ᔉG`1<#!HAx ^ݏ Jr-j-օ'0P8l8thOiН W0d)N%QhjۧxF'{d7.5hMwGh><K2RBw!B~qQɡ@~7P`,ZN23t߮j u6) Z4Y `;HE~?܎7:[4}pɔG9\c3L{ aEeX SqÒ왫:i/xuuD2r2x=8l\PyZѳpgHּe{'ukj`[΋d]8ŒX !ZJj^8#nzh|B荙|HS?_p $CLʤqm}I8cqM~p& 1QodyfrNPlH-W!j@DN]f}q ~uW@FWe*NC"ҜtokLe;UPhX1R"JX`nkQ-h'>zʱ:^Cj} چ`IX83>&8wyZDw -R(1(rSGcsiwlfBsל῀3P؄6, =q[$q:AO&H#bX@~ ]6ea%:e)h8fz-f_S"f$R}23(#W<ۛI8t vHNYxʐaF?>1`xU ~`(a!LF(oHtc lCPH&J#{|e`4xclOrtlC5Ū P;Cxx 3ٗ>X'wSJIwh3I^0x<%yb^ yd5wg:m;wyM'5 ݘ^8*N;. j܏x;09pF1A-f= 'fe99u'Y<Ȇ7,}~}aX`*~0?/FuǯX cUD^fN[[raB7૯񈡯c1jmֿS%fAUbM"35P1c64qp#a I yf?|xAޡxgVqgdWN?m]ǭ:pӣDcԛ]wLVNs#pz8Y61vlw\=u\uʐٷXo(p8V-2Ǝ+nfL(\dx ٣ o0@߯אI>\NO+L)ȯv{<W"aJoCC(sǬ 4p_'XB]wNw,O R_ :yD7p(@fhEw`qg@D{Tkt^[o0:_*@f{FTO:;q7:(Ɣ (CUf4DrxCJjtw,($|šUfɂ+x :Y<}18.E:og\u|GBb%i3 z',8]X(^C;*w=)"I&t&ŁWrȏ$=u2ā}rMưMI:~.hAuZ3$hg^w ХƞIPyCNO]l\0 q''qՖ_p-#/n׊O0#ˬ:Ӽx V)×I'3ol{G #yǽ!1PK+,O4:"G]n: Z8B<\,tϜ^x%WZ<%ֵɰznȎĨ\DIiAB6XKzr1Sax@!: ?A6 3$MMmP;z}N"DejaESZ:s&Uq@*zĴkwtN8xT8ZP]E%0Ul+*5 V:!k^ChRp~fsx9>B.نW0+[tD qYl!b@4V8AWf˺qxE Gqی1-^Pie N(/$UyVƉ2G댹؊7E&S@v _8PJȈ7y!ಯoSe{ MC7~qTvD37Nx,Zmx&`-hS 0fe6b= v:[8/|bG<;̐B>A'fp?9! U8(翌8޲UÈѼ[ y3cDXjU?"xk-Ep.cfqBIE:G8$EMD6~![fu}2kjliߙ2A&2 _treEU^ -xn5E3x06;;ͪkm(vtGxC \x-I Ʌ7A;['NL|ӯtI4'\ঋj > QL R ^;x(.{\# pDk9SGN0G$biM' >z ڈ%pMvIvIsEU^/䌸l`)]{͈7| ޤmtd!PvnF!>-@1| 6*}0C4q3Ɛpu^G+u8#dӈm9"'JZebw6wM:/G,zO7} ڽ`y̰nS{|=`FKśz%8][2#)C/ ~x*wyMsNw <ߟkR];vMb.QbX460ԚČNȉ>[L40w*$5?xİl]NpМW.Y L<߄$KƂ!ʭB7&HQMc-A#Ͱ)Zo44\e%={4j[ *5yPˣ|rP0@!:2T̖z&C[0l0:Q71MN|O>qԍ^-р:36T 8. oCp԰Q&.׸7j7bA|b 2bG']e&\av)|qca5\AB>3fxzpBs4[6qrMnfƮ\{ǖI"DpLßxl]'}0lLJ.D9Jw0t`K.lw0xy& (OM8}nE@i77rh4sD5FAbP"KkI+8s]En<'kuc787AyN&q7c.yi'&,^M0DM;U:N{ 7-xEĚpol'PP`C1#dbLHd8X~~> ؏?#qu~xĊ'dW_˼VEEcIu8]0dG)9U.XxFͼ$a,T .8ˠf5JF4b)Źo02GȪa#zOqqtq QVQ{q\XŜW4Yu 'Vr)Na#HxZX)]|㣴w]8fٓ:7M 'YES '7#"ci>&=1J:1+AM/y:ȡ-GyS.Bjq/:z!7}ّl09BL~BpxXýN~8HmrG"Ȑ.487;9;:#4/B o/W iכ/Jm(Dko`0csADxxoPLxN`H& U6GM^FT|7jI[C4 z)ܔaσ ,|<_䕙q v0#p{^̽-Bq]q9cm(1<(3xuF߶/Gsȳ_tӷ0BJ'wu?̪r4VqόXm-348P{G?̠*p`Q1 ,g)Pң딪+eA&ޙYD9%FsWH8G1rX _q4y_`xRN4z *ff>)!OY,^W#]_89Z OxX8RiQNr~p NP6YqwۖMBbkz{--d^9;5WDvyR WƳf#E/Uɪ"hq p u|yfY%I5MnᾇK|al\4EA\Mzb'*as(N HZrVnY0ŠlatP*"0ۨemFogzcaQPb~"}F!(oO}wCj6y`Y78:[irLBB^jJYnCm!B(Ryů0:a8%<8N*ֿxTt4LhSw> hgzb`Ewylbl(՜uF-o p%pMt9_Qlh>i0[ xqlpu"A:Ai͏ z B,<⢩P~׻@횁= Я048=&@KbN X^/b"9Maur|]"UߞofOX]9*yWr~r[qX.Sb?|F'J-z=bEgEyy>:!M@'+ٿ8=霘ZύCzzv; s#L.X <҅0xMSXBì8 `r:rBX2 KB~wmkwtuHT'\|8X0*}8%?7:X9$Oevv7_?&(lk1l\L+Sɕ7eX?nc6 ܊7fأ.qnfwp*bV գp]g\m`H|]->0)^kb4HJK`;CڴNJzf/92Y@9x*' |j#o$*3Z!'RiUQ(&nwкVXU@S6 1Ot F a UmE ljShs7nW({ht|uy 彦!R۵Gu78LrJi G8F.wO8XP ?(!˼,* I'tb)o:֩~K}HQqvh X' $ tn瓐'e!S DFЂ v/irEq#ˮn?^yesy QG{6wSj`!}CƦjLCns@X]G+l!ߗ mϬ u߇?lyXB>wKآ;_^74 ]]>^Жf.]b#hbC(F&_4o3o?@J4.x>Ls NnD#$lp":y+p.\/i 45bVwʰaιŊsH|` g5<7X| (q: HcVy`܈pa#0n8Vl9$6MI(N>Xӌ {82cQ3-fww' 氙'R"tAwP@20d4@/3Mۍ<Γ"0K ‘\q81Eõ6Нuˁ<F6 }9[<x*]ukxVόxH#RP/~" fBh8V)G`VO^WcXN|dn*G;oXw`Ҿ?|g:uHǮRWP|bR ˇn PmuiAnÀMYs09W..o$~sYH\SGyLˬp1y6Ęap2?<5.2Sp٦vyɯ=Ӊ=Y֌8lz2EdYYfE"Rbx'd>!Y,n(;4g Ox{V@)GBpӆU6BN=-n ٻzZƩyۯCK: lp.,ټ#PPx=~ )7^ /;v,qxz:P+&3bV(نyhМ٤pGLKK8P."w:?8L1ͨwwz>؂ݤs pUD}"T39朻f!#p5./<6_8W^2w۱0^X²Wv=Ǐ?u*vyl3z]b6oe*(2-3(Nk^?^|O`xPػ8!塓C]dK5)P,h5H Rz6`~٬'d (Q'viLI[p"ANXw4L v U]5 =אY:\I\VfU_݁5q# \-Y EuzɁ-MnBtoe@'| ^<`ɪ_X2lɟ0dBb4b@ĐEK0(V1DQ<{T:Zo8at$G ]2GabA{ ]P+"$R]_nnRRi5t繬жnRo Ii_C ٛk8z (9Jfmhj$6x9Ȫ0H7́ӉM5XN$TqQrMξ|4!%9"ih">p#\h}7%ӄp Z͸64 X6=|`0u ǮNj |9ET*yp#(]GF% G$`Ť,f4P*(acEwſxt>yr=oTxc x;Q x{<*4#m80ЕVcJz`}06 L^IVОDEQ: }/`㛉b:pmq{@BTb 6V4am`O q T@1 Ei/ q<3÷Gۻ f&1=xx\nq}H<'_3 s`vAM¼wF']=jwU;VI>m@8XA+@ hAeh5] Wӊ"I:OM>ל'@r4]CƢ8Ajm&a t<&mɘ+1 _&AbYqvTE$yA># '. {`. cDٳ|am]˅e'{<"l4y+s' ;€UP-^36-(2<iW ů:9[>Xe(e]7P,ǧ'7o.lW󒄜Gf`L~H`i i;D{$-8k‘P*{8 2nۊ<,ld\hu^+@7:8`x=JuJ ^x^0Q-n4&Z_ F%] LI6@ߜ҈: KT~0:}8N@NK(3C0ou9m 2@z 0$/s]嵷@E~J\>ͣ=s_,⴨`!=~##<% XN)ӜP o1*Tsw(ct`o0;|f8ٌҎx;Y|28BѷIA߻"a6r@h9Ũ\B/ēE3 IP96 ^I UUg9 x77$x}}vgeJU< 5dgQL4Hl}LiUUbRn(i=>Nal`]@֜T0YܣMMҡmv*K,t 1~Ҧs]$;_(k%(tP2e\*U+k/Q.u^H>Ů/_imW_ Ccpc0~ؙPr0dz|b!y{1+󇧉*ِE85A74[T_|<_^Jk:ِa Mej+K<`ٓnuU u97c8JV-bql֡5}1Nָ@ 08@"rW*KgjyI>\A7i<a#<8B3ܓd@ #M0TIw4jz3mvɟ⪎6ݩ%sd^Fkk|l?LC3UZ#UC";:DQ;B@ 9щXJqɷ*K&a Dy~rM߫jϼ :0P/j'p(3  y|ktT8Qc]a*~Vxh2qQ XT B qAt|d'0]1aݚ=uN^sBR#7n7Qr`(<αs-71̭矯9`*O|bE,b;0zY- p*..GG;xo35:1D.;4]MNYmGf uG(^E}:qu]yFl^-swc L !;c*11Ơ =}eR2sG6h {A$Ir!u6ZS|'*I!!p0P)VGMNYγZbw>^pb6X>\)؇BYFuQ,8"v대ax]-Ds1KChn Ĝ12xSW o;8G뚷PzpfXJ/Z1]@y9: ~cCv% \rQ&h13fXN7URሑbbѽOy5sI>_ń.=W Y7 /̕tҚ`;^a)`)0 _-`Gb404hޓx.D asZx(=O0eĆ\[9C u4la,$Rx;rƴFT;ː(~1 Mj{9x4rM5MU:~F!X‡.i1_9CQبUт֌ owY#XCL8t*Ni`3 ht9Tc&OX-Kw=d ksy˅)M9|qS#$#n4T޸h8ܦ8Y_C1 wƼVJ\'Odc> C^Kcɱ4[aJ',mHU*l^huu=:च_0GtUA\[AskѳObƦJxW3XtPNXu.SC>yL6&|cXoJCo:^+*^1gA=/>IaoL 4AYͰLeq:,·/HqvAنp+ŏ 5g3C4R=ս8+5 [uT6yI圛4gL`Cxsz"\(^w4_A]C8䏃NG@$ aNO\q䲍xv8%=u5 ޏXSz(};:2~-SP@ 7!0ٓeVj =暒c[>ꎴT:;d'|ٍh[Q5x0R Rj-#LV:^o:bv-XaF;RZ{ƬaX8<+Gb-]TwZ XY]̥:x5zA*-x fł> 䝟MO'D myKlƴSE9P6'I|{Hqvn1P Ae2ԣ)\ 82_Js4u\N"ŮQmyuY5d0Sp~qEDX iIL)X˄(\&J<ʌrU z)?mr<hz!Sx2Mk\.6)"lonӔ/ʱػsNlr l]s) t\@j`c&ɔݒ^~O ]e4!YݕP.>'Lgv,&9Msȟ`4400k4~ӃgעsE|0Lgidz&G5cᖿtW"tWJͭŋ]8%sm DZ>C=():FJ _.'{.tm\aHxCvpETCX P {)E0܋4T+-t!4\(u·k:{ va]LSѓnʯrW5LaG8pBձr4aHH"0+.2GI~hC!"Dio&ټ ܎NM>04Ů B9 y cPi 8b:Eu#@O!s/S .s60;GBSAyXW?AnN7N~qBq9Ĥ?_DKi~(ԧR`B_:E?&Տ!] K2)&ו; V$1>fvwRˌ [:&*}F(Ɯ 9ckDАWQVy}ϗ2@ B:H~ꦭ3*q1'ä4nqvXoAȣ54h hncx$UpӃ[]aDN利$oX9&" 䙱9u6x_ = kt799Y8voigA4 8S[ʮ= >:T0hpԜ.TU0!BExk(.qɈFqM~|nAYybҞrV37#t$ hMvsPpB0馝'?**1 ?g۶lf7Pjwއl u1D ^b5[ⷆ($R\IobF 88|Y  :P8c44nq5:}4|qq P߻GwzebCN3 F0VfFņ %Wo$}[댤6y:9k\p<7r`Zm,&SWN$F.T M{q܀잯뀞Fph\H4~ ({dpc4Zo\H;Twy9C˜8& 10?8"[{ =o ouun,`8k+Ez0kTFlf0YEk&Fq2tm``7Mi>'(n&hCьH0A yIsೱo/O@O~qZD+ :JV;rT1ku1(tl@yp 3v 1Y1qy^w|aH.= / } *c`|,WPSi?]is.l3#^wDq|V{`; )`% TQqSzڍzlҕcNNr0;5ɿ*) (0Gjpz4hC  L'G>6F)Qiт%7LJ)׏XGwV+Ź @-OvCW'7! V4#L`v^pJI\ɁozsF Vӎ`9pn1I|!sX@pV#nO%wc`x*#}N5{ņyf& "ylpz\e5אt`*9naUۚb;ǹ "WsO6/:a9Jh# ٛ]̋뜧Rr%PN+ܻQTA6r۔B7cpBmBrLÅDcyȠ$R?l5/AA+NRi^k ǖAc| 'P~qSzqшe"x5(cϓfY~W º*8 !>?|P!ǡv|Z!au_xݟ$}t'9v1189~qF0~ԻTsHlpqMp3BT|?*+YZ;Ey\eɸuxx M~rKggF.YE8 ;×BJ$۝N4)y`"qv VZ86FUɀ@޻ buh5'< tXD*= &2y˅ۮϹ-J*Co)4}Df!kL~}b!p7hX,0  #@pgA kIt+c+M,IvGFEqcP-rr">ŧd|KdI`c׼TƁH [1W.&&!Ɛy^^D&jj No!x q-!h͠hF)( {f3M8O*[w"B40,W o~C?#U}AqƝ(WZ W$*D/ٺp@j"edɟ`6It$2 1,+Fv2_KPw2G"M@'k,mSתQ.k xc'CB(Bb唅M`SU-iƁ<i_ĥwg UXv)iAl:lp{U;=R*.5AvX`I"u :RG!H"<̦py b%7Nt @ٯ?:XSR&|7`|1B}f6?dǠ-v>AxziFjA'b}2pH ;"o z|9&~f\*[F<$lp5Ɏ"rfXBrhlDAK^df'CeZt7zQʉ D<<8a˚lwtUEwgyBQlpn`23e<nrrSm>Pjc'I 2M]ȴ_YFlD!Ix< ]DH|+E 8rw&0 A>t`(c0r%zdg(cJ 8(.R@'bшSol ||aӍɮ% Xtd\h|&h2+vr_Ö_qd8bB~`3#IGkP 8lPn~qd'-r0"W[ۃ14IUA,Rqa'w*r$6)qRG8YNJfC¼Ûp<}dQQTE(/vuoxń;oW^04- `4îu]._9.ub:7vBln g@3?F/UH oAa*!; vG|a:4GgKze`ᜊOx%~ 6BH/?Rm-MR< @xLjtTwQ$}W]Qq0CNtPKJ4 MVo +MD1hzlbpA ؝2 iU>LP- `0@.y]y {dߺl8BGrVx%mfoK$w2W}gh#g}?00^iWGhwQGjLK&pG Y+Iy\`-h p)ѵ犰:rb%/t*xEV0pVBij2lHJ8 rzUyVsh%>`n8S͡y/شX I: {=sĺIGxsYW愕&7f @bܫ|  y& #zUGrsHRR/%}q':oZpga,XPaPͰw~IЦ(v=ӏXX ;ہϱDuykJz="t 8đm``xXb0BW}LMyTa^/^],@2EDA༸FްA0kM?P6Xe?L|Թ}< Ş,甾D2:,ל";fb/~x@:>u&틡.)<55a()GxKDӯ"BF";ͥF !YD:4|dFXNnl"b508誃} #ubФXyo/&,Qt`X UU,>^z\l:Xi( .!+&$)Ns6g|-m#~ vku箠5*rz571i_G8,dz-ͫEV&4AVhaD^~qN̔AЬR7؃1YVX"I'N0GjxQy)(&؇^FnrmHqHO9 5P] cj{((G>?Azu!rl~(UyPlB k+ G\i$ T2*\4spWi0ERT*k\`yy]pCC@♬8)NX}2VyqR rj#c1.K@rcidqDcAx¨8%\Sg9'`VVqq*$nh)i%2p[u9ppoXK*.70>0(F/Q\pϜjOۭ~ݬ tyiF̑V"xWbw9ih%:aP'bkÄ H`Dz!.4bi! [ R$Gnj*sg;/w$14 04l WZ2&MkN{I%Cߪ>1jczZw4?v>t!$/ǀdPʯ Wf>+E_!M*> BOLh).ތXwSy[$l)(Ru_Yu멃CoL7<K` qoNvNht=!E]84T/YYzL.!*8 )!lMXExx +b/\B8 AzcmyH`EQѱh8Mx4pا*Ļȧ|=$x~ WJ#"weg+*@8ؙ|_*{- ={HyAaTBv!8A"  0V/NCA; Nq!6e".S:8rc`"0@TEA)12&Y v5]<\,y*@0 KZ𘫄N 6zi:Su<&,&ha6|WD6m|_vÇ8LNi 9Bu9XGFE{ hiY& A+pEXU~77š{~ Z`#QKXe{B&Lx)b qIUK9S{)p$aoJzy::=Q`&yFkr:dd` ~x0ZK`Գj!%^F!L+|q`Ðq|p@fwG^'xqA83zJѿXq[^?!ok]J:;!@+p9S<\f4^>q:@@ԪfȚ.KOv %&[G>Yʀ;pvxd"QwƒіEy9e@ o1hWJS @0]; {f}?+5 2t}qAקU_*q۰c\x0VK. G PoX_0 ;r$y6mـ.ƘGDZb+>_:lP8wЈ9T$ûkAQ jr o|.ˡ[Rwn9@u!6[B0 $th&.H: "~9(!c`XsɄJy]RxNad1@f."hW䂴|%#+'  "Do BB軏8 3#[W_l "8пx0*Mah9=5]x$]rk_B[”vxlIگ]J pFsrZkP& Op([w$[hŷ+"Q2ca1U)῜ aEwxYwT\eT\x-v9DOp9ҿ3^W~3yINL,ጡQ55MpyEP!}8VĿ S]=ҍx@|dv=337NOxb5;ŀO?|`au>/3b՝'?,kAɪ "yWxMmlo bs1ʡP>y `.LmO<`03&GkdϿ?Z485 7t44Q[8)JW !of%61B UDK;Qxқ%%1%G@f7a|cd8u˒=xq9}rCƔȂ[lm8 GۭX 4cc@I[=om&X3RߟإPO!TL`?FX+ɩ9o4DJǔ.YډIP9B ZI_BP זBOAIj_Y#>+pj9MK3b_LF7A8_n(A.Ƽ:m tGvްâeXWj5jhf/P YOgyb`N; AOF^1_!c U-H Ex?V: ԍ8ƨsmn A{Vw=R-/;iy(E8$/Kz8Q7"p&5sv}3P \ҀlYL#8:Q5j-LC  ܫS Dt ^ /͆;0cٜz)Fox T(E˅''"$hlf00i* $>_8 ݉R]~2@ >18[V^q+҈-~uhyZ G[ѳ=xT8)qaBDxā$u]3{3 JM@ΣAbR(Up=/l|x6K&jk7 k+l (1 JN :.I2f5{|a R p_,7oE9o;ē"ɈB8UPOW jP^|LBB/ ߡSֱ mvaYF{vvxP *wXh"x[4!S t"+<ģb' 1*|G|hc eHH~Sn"hŜQjJn@UN)aۃ/WiI7N.@ fNLH(|C)L{~rUIwш@pW)E ;zİ3o^ZHkͣxq>xT:mF:b45 ˣ$G黇EP9 6ԩ1$ KUXrq ŗ3 N8(ca0P!Ozz#󈓾>2u6 ]1g.d&+@\$kI5,[QƃW%#T`[HE!l8"m QB'/GR˿(;wghZ϶BJNV1^r<2=3lI2Z=חS(GV"[5F4bICvKM*hp9!kk |.JH B~i r@Q;۔zƪ"nvr4xpOV81.ď_F^o=abTDk 66`EŴ`p`@ t_\F4bqK6& gD-{2pij^&k%: ǯx"FXIϯm^FT'Kˈα< Z7] pqBwe.HD[0]c7pЪRg,^Y'= _:o_YA`]m~qi/9 W ޹p3RnȔ6 \NGQ9=ӆO\HO9lͤE(CbiF;!$7d(,+Ǭt 7i_l`x9Kپ0\08I86"{pB X9 #WK 4-o[Bd_' Q񚨶B70p?y)hguݢ88 *_l58ƴ;+/YQF8#tr$-'X`+ /A }rCwD8`Yi-xDKRNu@X]yŬCF\+xF:n>N`ni`Ne-O\νokT\siIR(K6*8L8%Eq~yxA@ujш<_G)o ~1 r)HQA\1bF`nنo2g`NDY;Z)[묶)Ǽm 3GO߮AiQI>@wc*T ƐyͫYN]nޱQ>1G-j I٘4^f9s*np`oxu&0ȞBwxuD3mu-editor-1.0.2+dfsg/docs/packaging.rst000066400000000000000000000227721341747546300177740ustar00rootroot00000000000000Packaging Mu ------------ Because our target users (beginner programmers and those who support them) may not be confident with the technical requirements for installing packages, we need to make obtaining and setting up Mu as simple and easy as possible. Furthermore, we aim to make the creation of packages automatic and as simple as possible. By automating this process we ensure that the knowledge and steps needed to package Mu is stored in software (so everyone can see how we do it) and we don't rely on a volunteer to take time and effort to make things happen. If you submit code and it is accepted into our master branch, within minutes you should have a set of packages for different platforms that includes your changes. Such builds can be `found here `_. Of course, such builds are not "official" releases. We'll only do that every so often when major updates land. These will take the form of `releases found in our GitHub repository `_. Such releases will include the "official" installers for supported platforms. The installers referenced on `Mu's website `_ will always be the latest stable release of Mu on GitHub. .. note:: Huge thanks to `Carlos Pereira Atencio `_ who made considerable efforts to automate and configure the packaging of Mu. Without the contributions of volunteers like Carlos, projects like Mu simply wouldn't exist. If you find Mu useful why not say thank you to Carlos via Twitter..? Thank you Carlos! :-) We package Mu in various different ways so it is as widely available as possible. What follows is a brief description of how each package is generated (some of them require the manual intervention of others outside the Mu project). Python Package ++++++++++++++ If you have Python 3.5 or later installed on Windows, OSX or 64-bit Linux and you are familiar with Python's built-in packaging system, you can install Mu into a virtual environment with ``pip``:: $ pip install mu-editor .. note:: By design, ``pip`` will not create any shortcuts for applications that it installs. If you want to add a shortcut for Mu to your desktop/start menu you can use Martin O'Hanlon's amazingly useful `Shortcut tool `_ like this:: $ pip install shortcut $ shortcut mu As per conventions, the ``setup.py`` file contains all the details used by ``pip`` to install it. We use `twine `_ to push releases to PyPI and I (Nicholas - maintainer) simply use a Makefile to automate this:: $ make publish-test $ make publish-live The ``make publish-live`` command is what updates PyPI. The ``make publish-test`` command uses the test instance of PyPI so we can confirm the release looks, behaves and works as expected before pushing to live. Raspberry Pi ++++++++++++ When asked, Serge Schneider, a maintainer of Raspbian at the Raspberry Pi Foundation takes our latest release and updates the Raspbian package repositories. It means that all you need to do to install Mu on Raspbian is type:: $ sudo apt-get install mu .. warning:: Since Mu for Raspberry Pi is packaged by a third party, our latest releases may not be immediately available. Windows Installer +++++++++++++++++ Packaging for Windows is essential for the widespread use of Mu since most computers in schools run this operating system. Furthermore, feedback from school network administrators tells us that they prefer installers since these are easier to install "in bulk" to computing labs. There are two versions of the installer: one for 32bit Windows and the other for 64bit Windows. The 32bit version has been tested on Windows 7 and the 64bit version has been tested on Windows 10. Support for anything other than Windows 10 is important, but a "best effort" affair. If you find you're having problems please `submit a bug report `_. The latest *unsigned* builds for Mu on Windows `can be found here `_. Mu for Windows contains its own version of Python packaged in such a way that makes it only usable within the context of Mu (Python's so-called `isolated mode `_). Of course, the version of Python in Mu will have as much or little access to computing resources as the host operating system will allow. Packaging is automated using the `Appveyor `_ cloud based continuous integration solution for Windows. The `.appveyor.yml `_ file found in the root of Mu's repository, configures and describes this process. You can see the history of such builds `here `_. We use the `NSIS `_ tool to build the installers. This process if coordinated by the amazing `pynsist `_ utility. .. note:: Pynsist is the creation of `Thomas Kluyver `_, who has done an amazing job creating many useful tools and utilities for the wider Python community (for example, Thomas is also responsible for the Jupyter widget Mu uses for the REPL in Python 3 mode). On several occasions Thomas has volunteered his time to help Mu. Like Carlos, Thomas is another example of the invaluable efforts that go into making Mu. Once again, if you find Mu useful, please don't hesitate to thank Thomas via Twitter. Thank you Thomas! The configuration for ``pynsist`` are the ``win_installer32.cfg`` and ``win_installer64.cfg`` files (one each for 32bit and 64bit installers) in the root of the repository. Please check out the `specification for configuration files `_ for more information. The automated builds are unsigned, so Windows will complain about the software coming from an untrusted source. The official releases will be signed by me (Nicholas Tollervey - the current maintainer) on my local machine using a private key and uploaded to GitHub and associated with the relevant release. `The instructions for cyrptographically signing installers `_ explain this process more fully (the details of which are described `by Mozilla `_). Use the ``make`` command to build your own installers:: $ make win32 $ make win64 This will clean the repository before running the ``win_installer.py`` command for the requested bitness. Because Mu depends on the availability of tkinter, part of the build process is to download the appropriate tkinter-related resources from `Mu's tkinter assets repository `_. If asked, the command for automatically installing Mu, system wide, should use the following flags:: mu-editor_win64.exe /S /AllUsers The ``/S`` flag tells the installer to work in "silent" mode (i.e. you won't see the windows shown in the screenshots above) and the ``/AllUsers`` flag makes Mu available to all users of the system (i.e. it's installed "system wide"). OSX App Installer +++++++++++++++++ We use Travis to automate the building of the .app and .dmg installer (see the ``.travis`` file in the root of Mu's GIT repository for the steps involved). This process is controlled by `Briefcase (part of the BeeWare suite of tools `_ which piggy-backs onto the ``setup.py`` script to build the necessary assets. To ensure Mu has Python 3 available for it to both run and use for evaluating users' scripts, we have created a portable/embeddable Python runtime whose automated build scripts can be found `in this repository `_. This (not the version of Python on the user's machine) the version of Python used by Mu. The end result of submitting a commit to Mu's master branch is an automatically generated installable for OSX. These assets are un-signed, so OSX will complain about Mu coming from an unknown developer. However, for full releases we sign the .app with our Apple developer key (a manual process). Linux Packages ++++++++++++++ We don't automatically create packages for Linux distros. However, we liaise with upstream developers to ensure that Mu finds its way into both Debian and Fedora based distributions. Debian ====== Work on packaging for Debian is at an advanced stage and ongoing. You can track progress at `this ticket `_. Fedora ====== Mu was packaged by `Kushal Das `_ for Fedora. However this is an old version of Mu and, as with the Raspberry Pi version, relies on a third party to package it so may lag behind the latest version. .. note:: Last, but not least, Kushal does a huge amount of work for both the Fedora and Python communities and is passionate about sustaining our Python community through education outreach. With people like Kushal putting in the time and effort to package tools like Mu and mentor beginner programmers who use Mu our community would flourish less. If you find Mu useful, please don't hesitate to thank Kushal via Twitter. Thank you Kushal. mu-editor-1.0.2+dfsg/docs/po1.png000066400000000000000000001376111341747546300165220ustar00rootroot00000000000000PNG  IHDRxsBIT|dtEXtSoftwaregnome-screenshot> IDATxwtU&FBB %&EDBIB3 H!A^%HI A.HNew? !`}s\ܹ{wow|@cDDDDDDD$=g;p [lPre0 VS3B||<۶mEܸq#OC ?p `9Ʉll6SEDDDDDDlll֖A1v?>8#Flb_EDDDDDD#,KJy:ua Օ .Uo3̙plΝ.""""""b3gpg:˵kprrJZѸiwttL]2du[7둜mҹ""""""" """""""VJ]DDDDDDJ)X)czW@DDɹ]i?& .Yq͑uڷ/ȉ;udm ;&bMbonL& r.Lqwb"""I="""`۫UQ;}i/}Loig`kJĩeҩ@53ROHq' :kWk`وq?ICf2|gRFMJ,%Knݾ͐Ol۸.""b%l]Q͖MIKiΙAoGpݡ -^ˆ-`:YOlwokY$˛1i'J\k!_{~Ym3jG"+a%`_y!"""ȗ7/gߏ;tb y5mvcjFn쓾LT#1_jưmkVL25bwK=y+7Y 4iY}UyL0>%1ix?׾bbŭx%J;13n^j7(~4ͶXlwqw*Y2.+I=- Q}=ڍ$"._!lɬEEDD^(;MǪ)/D0ýۀ98F w,l‛-6mRy7#Ξ;2S&#+eclI2Oz)t*lKWs75qп=y?ӝ{3oVpvcqΏ%_`%S.!`LCVr/M-i\<3:NҞOeꕬ'\"&3(] )L4k\#hl0^IG_U5ROHV_2;__ Fm>8E^D5n68dx0uOݳs|A_jAUQJř2o+PPi1~iq4I#r؃ƭZӴ{NcC9w'&vSK'87oޚs\:=_t`Su:9SZ Uο?u{ ýuDŽŜDb9ߏ%Pg-޷^51s)L9Z_+ɣU!рI,37`-(|rf|kƶSyЃDg9s[WJhI*qӂ%$dtk%\#>d4yva,÷xE"sAb3 q6x <}(ۯxueYLk][m0+&3'6%t%}>Ƅe_>_%է(ִ/_yȰ}K8LfS\k!Nj'qxn*WL͘p-fc\r£Hwz$`CLaE f#n4,D9-Wg}̈́C]E Oz6Iv~wq$LUў\DDDD_&PcNyDǙNlf[\RoOl;r-?f9h1t*ʻn8d2nZ/GvYz}5P.s,O|/izS1y(L#F-g dߛXp1ŗlN]izY;[,g$7mڮ N^jō':`{煬;OZNDDDDy?cϑ*uDzPy箷M8Edv-> Vl㗸KLbv-ۛ.ケ >zҾ% v dȃOg/i㒉Dr;nٕy i` xyȖXI^=>Mŋ٣8ri񃃈׋ީ27Os3szfpB޼~ر7ڕ9m^+e{Y4 R kIbru) ([v3Y7M'I6#L| 'ھ![ fǣuwp̷=yc&O45.""""/o n3g8v&}&z!'ϥ eBŶ;S*e2etd7~KD7(d0/bS,c?Gjsαqd?֥]N G>934Gm9^ysb;/^51@\|_{Xkž`N=|ǝ?9F$-r4'ó?_<pZh _>˖IH&l:|=ي% ~6?^X#8 S5` ߊFxdV^%*C?I{ ^īeyR7X^+_Tlj܋aD zaᄝ;Yq( =l:y3lޔF=w\]6[KG_fY3WQ,dOؿ]rm .yrmH//,ߛF 7펟M0NecNCly/l <<65?p9:'q2O7%EDDDD"uFQÑ$͛ɢa]iC9)ոU^͒V{p-[O5NVj";/&'V(kԢ ֣† %o w*U(צ  ^”͆UPSx~9PXo\5d O_!. 9 N8UhM6}wo~=[>N>#̟że WcwP0n͘7}Wq6;EfƐ7m,J9x![RTSQZW . 1eI󦼓d}y&_66.勞8HҵdH#rq<"""""~z%/|a)=4xE_=m;~3]F,_ʯsly#oiȀ4U^j[Y#IȆ߉-YNODDDDDeiĤ8.m˧s/Gн."""""9"""""""/ww V """""""VJ]DDDDDDJһ"""""""r#[zCDDDDDDD"""""""VJ]DDDDDDJ)X)v+.""""""bEDDDDDDBRhR """""""VJ]DDDDDDJׯ_z_lp BA7{}f5kR9ҮIf.YMJ%ٷo/M4eC:xocY2˝+<0ܞ `y̚5M|r4iB`` ~~~X???%((___ad͚B Y{lyța,[QC:a|ֿ ~O3nR׬w}- jzO9TDDDDDYll,6mM6РA'*/ΔKܪ3ӹUC0|HϟOZ5{z{<{OCyk*kd,LvBd(+y-&ґg=KeX e~ wV3{رSJϑ]]CIHw:v!$$$%7i҄ &PjտUTa„ T\GPP 4`}V+9a]hڸ>{}fu7zwg mVQ:l޲:athZizjz3r%__ߧ 4۹Ɨ9K~k, zٳ瞺.~ht3f#)1p!<sml n#ёᔨKeΣKWůi-dk΢1ibfoE՛|9=nIDD 4]6mӞ9vӯ;[fo_NдUޠ7B?ٶr!`nTj_Gt͸֡*æ6unQg0g\Ա ,bt mt K3Y]yӃ o5pΟC8b7܋iժcǎUVرc裏Xr%Z}|9zL*{w3+7sOxRZ+>xU([Ho'𨖴J&ܾ'pr}I0-BbR;k58~U݇>[Xn'>OHHEeӎiÒkiިI|:oѶ)G~ûqU3cer% nגfψݍH,=EDDDӞW\IÆ SUVѠA2y!{>^L1{q0Z >>>ɨ KjxO,Xm}Y| f}yvӷGG&MF agIVe#1oB/s-Bl)Y OSDDDD^^==AAA4j(\re姟O{> Cˆ c)z4Zқi/KqEZ񌩆f׫wXǑ&}^΅?҉ZS6uF OF؃9.oNP?雵ѐq9g_r>O;a"܄SO1mT|=z&ѭ Иs7>&Kfgƥ*\br58%x=/yt?v+ٿyFr]l9g~ĵ)P9nr]fʴ&Cz7c`ܺ9~wGfiҠx/_NXDV-4kZ֭%X[OʽYf.\džߎ^12c8ݺSDDDD^^,[m>4Vvh՘yKBhߐoȬEoP/ϟOݺ}X~=Ń;w-_JM uxrs`p-W #N_3qIXLf,7J؅ci~MFMX'=2kJZ5iE+hg|Ow*3i*|kWfx{{-ׯ_֬Z*L[^TTؑpi {8cc'gW:ə c=EDDDZO#Z,,?Q5 8CdS hbpvN4 .^ő 0%q5~?S7cj0,I9՗$=='~fgm8l!uiD޽=j4?#~2,=$$ƍ3iD^ Ŝ'is]2t^z|Pj}?Cz.&Y=SILAdۺ-ޤD$^;M\TA a083+Ov\ʃmB46ӵ!El-e`0`H"E5}iOn |}}YjM4I+~ﳔU.x.l3~Crʾ-+&<+!!H X"> Qy l,I$+iIOӧ7,ٺukJOן_ҡy#Z7kٛ4hO>}ԍ]-}k[q 8<XlSDDDD^^WG```=002/~CV~ XI; XIwرcI)ą3G9k'~xoU:IIl3pfO?8wlaeP-[-Ns2<+e3g8vy͟'~f`*jcǎeܒX,x;ߓ˼c3xbpʌ {ehވ)ބ=qC8o/HGH!b"nBqE3>{˖\c$!.Cd"+Wcy-W>B zO*y/FZ*'OrL8J*vxG-RB,,k3wga9gN̥+\Np`~ǻC-> LdAXxjYdMOpMuac{WfM,Y2e̐ڼVӵIUF^-ŷԯ_ ڰv>ߒr.HrRv=s "֑l2`< XIw,^lٲgZ=B{9h)Uro5\f} eFF^e* u(]mJ}e>,[ 6{?3t4wūڿ#1T,-yg,X4(j!k%ꗏm ;;|7Cѵ6#leTq_wǝ ۝5Caʒq=ieݍX4}>{9 ؽi'Άrv 7||'O&U '-No^ԕp""rj.ߛy=z;`]x-B98q0ȹq{̆ e˖-ٓ~?۷3E:um d{K,X\r;Ul?EG~ :&` = ۏ䡰g,J\8nk~}mlF,7M 6& &ԫDԭ:篢\rPNGǼyhԨ 7vyvԩ~ߞQx.MnEu*laϵL| cbݡ\?[ fLq78ײt.09ו+4i$'}Ŋ,/_SzJrgn _~O3d=F;{r:S[;y4׉A|t 17IEbl$qQ$G)10\J=`W(f5 ׵!|x[OD`,܈6t滿;=p;7\;a9jӻE `pīlY\/m$`ׁ Yh_8 K|wz6//YR8:5nY&.O?rɓ1[Hsgax V[%b$!+dNȾ9p6s\dĹpIԩ!_Ru#NAx40e F#6HJL 6*$˝±~GH=F I Dݎ"!r)""""/ӧϐ?~֬Y2w77'}eԙkՔW޻, elڴsĉbpt"^-]g89ŪYexqqq7nH lFNE.Dg͞'49p”VŋO)-G2hЕ>CѰaC֬YC֬Yz`0<Cll,'O"S2oVwkΨ'2/f |Q# Lʩ=T > %wFNxt[Ys{'66ڶm˲eU֨QWЦe, XF]X`>=q==~N{cSB0%mV#fmZ/me`L{{{ެQ۵kakkG}z|ث7naP;sه<ɜ9=>>>ާOv~wra6lri'o^/_ΠlشՊӼm/|櫱i\-~ Neu g[ϕ+4k,%/_ 6aN_^:azvi֬3in21sE ǭ0w@NLLYEue>?;w>d.'C?eʲ iWgo[JIWɫoذ-[~z_hѢ֭Yf]???~g|||Xf ~~~Щc> JDDWș3g:L&3C~k1yd x(>1s1t\sDDDDDI񾾾,_&MKd|͵gDt:-HѼ2Ǭw@zW z4)CyQq>39y_z }d͚˧][[[իGBB<ƍ̝; .0ydcƌԪUٳg?r8ARR=Nh"|ooo-Z7 ,xzڟzNl&**HyX`Ύ3 DDD`ooϹsxzz>Q3gNn߾fW^7IJJd2gϞ%G>}yri *Dhh('!!Yb00Gk8xPbE&OD8q"zԩSԩS'ҠA&MD^oӧ7o߿%n$899<5ӧɓNj#G/_>9Bş!yxhi^ ,ˇN7펿W`akZg(B;ALI:vf.;'fd)B;YJlٖ-ܶ;vO/) vc; 2F +-v2`YR~8a¶[r8!/|(("Q@@!'m`7Rhw%wW&-R8䨤0>~@ ЉwOz\:d=WgX7{^-m')Hò`1JO݌SI]$YH|OC}$])7tR޲k!Yv:maZS&mt,wZF]7&}y3OwH0B;)ؖ vLI1uozf1oެØ̊&MHRyA=ex rfwlKaLwp.aۉebqcwlKձU=um)ޮU?-uƲ,9/Jԯ#( IDATOIRd$-RA~@qW]C\јH\QOy]w,KyQm}LјH\FW\ϴUC M#nFO?Q||~fgzE$c}fom +Fc+/tJ?{p8e+wј'|:o|#۶׍뫶I3+P(f 8=o1cpKyʸe=ƴRv,Eh KR1O#8h8@4I3*&pP"<(Ou7^w]_u1p@1$+&ے 8|#@hD 'ƫ]%۔s,o uz70,aۖ:>]u {Fq!G@qWC@m@ LRt ]_qW `+ž!pQ~fvIJXW(h˲6HR=m}>dI)[@v) @|#YV"77jiD=Ec1KA]K1a~  I<%O F /ߵ1m[ux7l,ؖ5|cl K:it;8T]@bXT;|/m]}Lj,<{d!z#zy fԣd?ZBhVvI;mKFW{rDLZ3mك@<_@GeY*hZW}Q z@ efm-f%f4yc]یUO][@o!EbqOgp-v8x[m_`ζكoq * Ȳ,Ӻ웥֠ :-]۵I8xG (rߺM:s<˽p"<Ϩ /vZ&A8x@if2q=w7A?q<ߨ!.#ɶ‚l>}@IK$5F]vy^qlKKj**f^q_bm[ǻFvǍZR|;8 k+Ƽ6@c7XrK&imϬ}74@ ; 9m+eԕ=/ it<ܶ2 :*Tq B;Yl8-'^y?CAG$Zۣ1o2d$rdQ$)3@B;Up ѵ B;o$e}wO{yM;g@@#QMnیe,K`-K\_yᾮm %w}<ϰN;}vzQ]C\˲-ٖ/.IMcaGvM%15ݍ"QO'.|?LZpI mYv"bLb,y,̶-D``v|0?ΒX.%B;Ȳ,9pH-=/(?/#"qi>[Ɩ&&;SoZԝ6]|,1@fԿ z+,ܶ-eYFwM|c)@f12{lRU;dmKPb63mwES7 y/-kv@4ĒZ=CI}R^}`d@H=]x7:nuEc^Vv)Q`n=@Hu[QK9l۶5؛'}#Yh歹Y(h>|9v=Ch$wvJԚsi:^wo쒴.C˒} *B;}t5УD` ;2&[mڜG5 -%pk޳^2M졠p׿Xǽ.6B;}ڶZgKzjts<{1Z?NƘ'#)/ER,KFxu*Vm?郁<vZ[fg7z>ӵ'cAfo3cdڣ1Odʞ,Ru`"xږ%$('͞5<KjY5=i%wwly0`|wwXkθdYM3Kx˲nᐓQ.'+',3-k7<g]oii$p7Oײ}#N)#q%?1!.ےݚt@/=Q4}r-vDZvz}/L|cqmKǦ۶ vK%eV:vk|C``?#K\$%Y%5Ǿ.&KRiqCmӑFW+rHU>&J}#DZTpl?g!B;qƤo  :jyhIOI7D X* (i Dhtm;ƕ'Z l˒XZxЃ{m[),ZmXL3cqH@ .ӆ}ǵ =B;)]데_pH@ gyy\v!F$wz\c:Gh +#Tḥk<] ЉFW8}=54] Ѕ+3 ;w`QcS#= 49 ;+tp37F]:P^@Nm[ު@/ m,z@/5T"Î,,F@(>~Ahb}BhE㾢X˒oAhDc1OR!1-Dh䜂|6\Kg!=Whbu*(*/=s (ύwuЅ|w5$c}AHuseY #r($@!cVv,Eh KRv,Eh KRv,Eh KRzo롥F?y~x(9/v_-PB:?wN*n^!gi Iwo]Q<3OuսoeWRC4QE}.W?}IW ڹx_N>Tw@}>clyڼlvx E$kZ£$ֻ5yFvbt/ ^W=;i";uuZua=]BL[呤+Ш~6A]wV2NIJ,yVjEMs3[@bFΐtt.7%;*M>B]xl,ڴZҨmWꄫn{N_1hhBm-_EDwu Sh|z-[ըʗ{8vI]=^w=ZvicujjYgިz?4u6lTLӅ_<]S -IjW'[W"U#O;KgV$y57ϱ#u%Zaܒ:#g ܷhf61]z/lz_OMHyI7_$qnS(w%>@ ת?.ӺMTj$OP#6\B4s^MVj~,!.Y4tWi3I2{/" QGhoT}ojSQǫbZuv}5+?j=~1W1)TRiة5Cu=wT߼Q+c5vH2>F&بŏަ۟ߤˆVIzD&Fhd)KSfhBpYѓud"ɓU2E <Կ+=}hLkP 2=_9%٥5^9 6c*AyFnK5 $MFr/I Oէ=\ }G}^'n6U[:3hAroѲ'ӷ.:T-?~h29 ;ix}ӡ{ioWa[CP>yNO gTCtH͵ 5J[{j\c2L}SS7K՗F*T$Z;i:)hid&͜h)uhʶ`b\{]lUEƋuQ*mʥkiT9iJ hcTa.zR u_'Lz_Jv[5@vIW7^93+vVm*'߾Yם9:1~dRԬtW>cVq6H`_=cdruvu򷽯usY:눲N:,IƸ] @"d)B;Y@"dk7hˈXխZu52KSW*?뚉j%"9-yUh`2~6._]& s )F^@9IĶ]51`!^TKӠծ *O׭ɚ1( )+lFS@Q˴쳬lcT"Z݁jyFU3)^UK7 ) Wh&*#_[PcYX {\X#'T߸F$GFiUxB'j-)KVlUH?($اq冫4el;w TV|2*7ĴmoXC4RU;\*Iߓ : -a xǨiت`]m^Y S5.ϒdTfkldb5׬ɡDroޫt2Ɍ-+*od KRL҉LlЌAIF k2+Jׁ=j'~DV&*̗2 "M Y۶)&I2ޫa%m7449Z* qg+5[+Ϥ_U+TW9Biӷ'ONO-ǑwVa?@wiDՍC5:\MEVdIn\5Z5Qėd $d{&7Zf6zFҡ3݄3^\)h)v$GV v{K2]MgR N&#G\e<;]<t!9e[P:\$'C4qbyl_%5DwLAɇ JnLsԓB= ξj_5Yy;;_fnG0]#t*Tk}uLC@4.7ӽvdγum4ڮoĴyѠKex ˴2% ʒw6PL[8+㫴|b-t<_!c5^iuzgeDeC6k'5<ֵX0ZckQZic51iK&](ZWZ5! 5ZU$cHb,Eh KRv,Eh KRv,Eh KRv,Eh KRv,Eh KRv,Eh KRv,Eh KRvT+m۾C+WUmm]WtHǎQeŠ ~@hr̶;ޒرJ4:6lݞx!S՘IU2$˻&]䠴cڍT˿qFOMVkHst} j{ 0&SZJ<-K8ri]{12F-סc&]/p`L;@JoӱllO*!CFO0W߿?J=xz+qIҋ7%D&8RO~=rvKFj֜ 3,mQ"['Wan~yg]˟+tUU4lj-Jۏ9UkhWiOOU"ZGгokiuTPʑu.1yIAts䫖~|,4˿TORj=]:B9m.KK=@n# !:suTxFqNܠMxYyt^䏜ٲWN+4'jBU/Y/gROuEu yV[f&oԚb:9tIksNLҚ/?ƻ_V},9k۵zM@yEfz>wdUI~_b49Zǫzqى8Lzp&hhvc>ۿqJ-=n]|iԈ#?ݳt Se{}|.1l]rx'>=iIC.YڨC[yZҧ=V'X;-:9W?ѧۍi765N_iDXlvAםX**/WkTzlM/ZwN1I?x=0 z>F{֯Nєg|7PM/^ڰN1Է^*t/$v 5WO7]/YV"[Vkٖ}v[&d3'X#yN}g&YL<=пmo3i9^~gteKƗ5ú'Y>Dq4$eݙOr_vIŒeIxAg6ݫ""JG Wjjm˒x<]!O,^R'_|>yq:zRR6`}?Nh }K7~7@/m˖%㊛5T:jmO,RMf5^5Z pУ@޶7nTAKȴxr)ȘkgժT֠ h=zd]fQZ)(WGTᡥ>Umv}oi{QCnWX*.` ]z><㤹&k{I/yꦟU ZO~@!9(.:d7oHzRї>v#; kܡ+ҥ]{Ieǝ˖Oᄅ_Qtg4i^oOO~6E[:]eڔ8oݥھ-W ~X%'ß@OeCt%_[Oi^?q]ǷknVc' rt՟iC2 7|r%4e4mެaCwu@K9YBZځ\"Χd=@nc#,Eh K1Ai3mv 8prR9vOEZVWVPM:䴩*sݭվ,W7ˤkSޮ\a廵jv2+'M S?yPrHCOX_TnKfS[u޳t땇$Xw \z.,Y712&}Tt5{t/\m{q-X}mG7_WcT-my^\34Αdv/w\wjo`qyԣ:E},KWNYux;E{Kq?9L/qkעgoiSԗ Љ\3'Tg@v{<@J7ۻGuţUծX+7F-ьs.UίuýOkm]uwobWkUxf~xEJ5 _ qWCеQz8kgcN=XV>mxϖ뗦^Kc*GFR2UӮ_;Fm3F^FLۖ60~dQ>܋ЊEZ=dR>Hw=oS~54ю]1r ީU:ߟU2V3)mLSqZ=22~H~U{Ȱ ɕ7U DhrI&髕3j&mV|! [{5r3C%)m[2j _mڟs}4~tT:5ٓ{Ṟ5T۝ڧI߷uHuJ^+jdcc$+-ٶ-lW :[ |g饻}k׫_W3'nDQ_xڵu-(IiW]絛`ciWOa*жzjuyzUvt~?t3mOS릉7(b ?+?{y}Kbo۴;]&L׸DnAQRݏePʲe#j:Nx/N҈խ65ߧ'W{~uhϿ4{~ӽɳ4v+ƨU%ckw^ey_Y 7 cZڲ5/{eoc;dVjQg뺏OSDZ=;=ujO|iK*^U{^5~@?~jjS[CyqM Be˧;ruÑcU<,-Aq5:uƹů]h&y;Q&:L{t%u^*.hz)P˜ ܔ!;vk fLIon~R_wVtM^XOg?Z?z|J+Texҕ.8f{rѬwrھoc`lw^azvҽZ/\I私҃ܢW|GvpxoN_oۻct :@6J+,IƸ]}䅿Qƨz RuOwDo~^7_.D@;y1R繯 ~S:(MݟfٵS^ 9F{׮Us9AE Wځ/1C'pr-@hi@{<hi KOnV8d8aN5ܠ} g^# j?Џ[xnٛ?E7]z5ت8F=pԾA0W7_s{tUuzSm}Z4c5 ]#h/w ixtnxGēfih7RC|Qp2kku~Tdhu\mby=kkVKC1%ddLIwwJsOwiӶږS Fv^DhrP1f &u9oʝ۵xYF֘x7c##*(VQt~:cUf̨W#uUWTIE}I}]WNu:Է4I\ΏTMV$\"#@#9(] 76*pyҹ5N dA:c$#S?W\v.{Tpe}@ kÏy+ըҥ~\l)RO~=rvKFj֜ Gۮ%I/x^:zUP>;\$;-wfdLKh7]S\Uݷb.:s%tj{p:ܒ1};Oi1_ӯXj(-\˫4')ST[.sF,Ђ5ͯ9+REgZT#g]c򒂸12='_~Sԃ}Hed?^MUwΜ6@NC O֮QNW[G4ja+*(V٬gQwͭ?>8\{xDvIN+4 W|ZKov5ԋ%|Mes+wt<\.ڦ>VSlپ5HG=VN7hZK]EK#v.]j?_^T2ZUD\kߘU?c6Wj|!xߵ8>Z:\}CkX }GUߙPB $@ RbA ذ 꺮k*ŲeW]WE]TD lE j(!=?0If& -|^ϓ9{ʽ3w˾GO)Ў5) &>Hʯ)9 R Ln%९pu>3gaYflش\=-^kXQ1!s"J7uwG bgK~#Fw""""gJEEpX(N&Alr"b8Aq#\98Glh\ʎ2K$"TP2}E$ǙTFe;{Чo} ; #x*oVk6ر=bD(A_Y!/'s9l-?L/KϠ֤O g;pf#/:%wsW|cv+aӨ&"""RO)i=U"ٴh!Ɠୀec%2Oi k+<Ő4a#-XΔQT$2mqOfޤft9z'˶b3cjڃt87} ~zͺl:J8nvwTxO<Ï{!ce|xNMaMt:cOc9zox²,mt≈_JE+?u_ʛyֳh~ ̮6 ]K"=?V4vBo0Vd[[ĕT ʎp8XRRbYfZE22` "[E=h9#ݑΑ4,JɼHkϐ3"Nn۪諪4лp_Ozp:urJ5,"[XK5h 1oYCJO""""r̔QV41u{^e/rJhBxi;UȨ1$Ý_9;)+{'a(?"{${WgM4mXLֈ"ӊ!W*"U'!rލCrl*1Gl*׃^q3yS~mo[tkpFL IDAT^L~sG}[yufQaCxciȁ+$ Ø\R>v2${,̠\> Gs?""""vzg[ zs3-6k&sWe/aӮ\ܭ'm>߻g}[ ~h!ӧ\mlڜ)-Z7`f~J}i糯*-69y]U ɷMۯgD;j#,K:=3٘hN 콩|l.qu \ou>/^DDDcJj;9E:t0DDDRR~ej; 9,PGVEDDDDDDDDDDD(%"""""""uv:JivӃvzHIAEDDDDDD(CW]?SL^`ga<4*?mc'n$yC?>Ye4m|W6;>z>KhWqVdk_7[r\e6|XHw%#/HT5d.Ͼ쨎 :K M[<%rV%=/L:[}wL^_5ќ{gNx""≒v9نO'ĥ+}ZȧFxRmrY'5{LX4a)&kl&]~x" {:a:ʼoثCwbܓXg/Md03,v'"SОjϹ RZ<'κɾT&׼c}-";H=d c~UrNq\Yv Sr[lӕ{ؑʇ32s^H6 sus咝Al מ\q9Nmz-/s3#CqZ~I~d>S>@mhҏo0oelyLwec?rM +GŤWqcZW ǿgB_ ڗ=m͔帇gGqnE_X݇p#?WQܺly!? ^\[0m\Ok>KI/1-xM\ɘ7:pC m<8t[?T1_LmjJ}߱;/Wɺ~~⾻/y|q=\|m iqbsthsVQxgt^=hkN(sNrpJ mUyU6r'navN gA´fӠI<1ǿHMOqc뼹&i=`k6&Eu %02fQGN>x{JYl3O^LӦE ~a5ىs&7>πGePCV zTHB 6yZU\@IP3z ّ|"FF)ۘ-Rt>־uXmY1֣Ik~r oON!/q| 3hz(JHp$ĵ;ztqI=D?Q,S~¸&̤1ljf0tVjO֊7yb'$=5/ xsq59I&qi3yJd2ڛt  Ĕ[~,qv^\ 0_g'1gsf._G۾_\ !bJtgd DMg沋Ik12oY;9X55B{3>ƹswwq,xk<""rlCU'j)b׊zy*QySwm#G06y7u.Mǻ˞]քPE@,#:ɱ Gcߏ+G d&Z!يc;;gLyEE!M#7Y<ĉDȁ +EZQn\a*/ܖOWRԉhxp}#sg QaT:+cp/׎\u9kWyV}MtM0UQs~c EDP.R/UT74*G&l6FN4>o$ѢQ>.O˱kGXMUuTOLjҍDꡪovMNIjChQ&{ʒT}zpotfduMP$mi(!+U2M8=̙=Q7?Ĉoxm.ǔSOՀ2>Xf{ bKm-vI2m].ϧW`gwN6%9ۙ\޿c@XX%|[L!&u,:2;ѣCOF{|c*6U+SZ@^1.U!5G6ɴH=:J )5B:.'rٞ,=e:.mVatф5s>deX7̶~:ҫ Mzq,9[s5q5?=;#uUh[o^Ҫ&_"R?i]1ek%NӰi<Z\3aL/͔op~$\vc6([Q{c)O(Ou{WD6'cՓo1ӣ\~ҝ xEK/ &[iCݛr}-.bfM{x_/bMJ1;A9wQ1gx/3+1m{]cu"ƪ~S#OΜ~ 0Q b,g3j~z}"l'8A` Uݔᄴ򜫨 jm#GE[_y0 D=\F=s݊=ۮL˘h"SlR dL8q現 c񜹋^c;xxim@x4Tq ပ؝Č4Z:<͝ PzmL];e޸__jrz&V&ThGvPvmڶc@97 04S䋹ߪݳw}θk=:%^bI:UL1I}V:S JH-v'`>\ sn@lW;ui2>NNXEDDR.R}q'?{(1%$p^?Ljߡ蚲v4""""i{H=hѢem!"""5cGNj3/RYUҮ>77zHہEDDN/-Ri] EDDDCDjvz&Es-^Jqv8"""RwүoEDjnD'RmݶKo߁EDDDY}z_ۡ)f*i,P݈NDDDDDDR.""""""RG)iQJEDDDDDD(%"""""""uv:JIH]DDDDDDR.""""""RG)iQJEDDDDDD(@DN={3ٔEDDDF6hܨam""@IH=go&l}菿H]&ЩJE!%"̦ԭt_ለHi߾RSCzOH=GIIIm""""PRR?z[H}vzmcj;&6-ROi]9C/_ZiG_DDDDv:O/WJEDDDDDD(m=^DDDDv:J+"RYo,x_Leێ8iд = ,/`-/-L~rTުcƔ'/cO(C̲hOSVQWFg~o(4tSxj/n<2^}?IɓwEZx;5jX4k_;p6hAvgr!l8[YZir\<f4n׉-0V߰fIDotv05gEЦG_C}$ Y>G~֣UD{Ǟ}ׅW)7w̾eȃ<5}k3kۚtV~.2VT|jJH==&;6Gw!Y]KBH5o ylY.G3n3-k޸~icğySڧT v47RNut~ԚJxFmL߿ muxtxg)`뷯?7)"""uvz[Bj/_ k=L-A hH. C?3i|4>Y?'t7rEhI)G9v?B۠}Hʎw+cd}5ӹ#5ݎL?L܆9p]MXz/o7/G/79S$retn]ulE$XŪ-{) nBAǫ;Yq;p(]mk7C:UPETl2r $-r}7'ck d­/zf/>'؆Q/OX {,{::q竏si+=GsoUz4} `Y›s62t8fx]Wb*L{!/ſ}m'@DyqY—?]Ey4泷d}ec_DDd;%E*޺>hq+O?P\!?'ꊜ!7ۅùwɔGVMv&98$dƳm.j_ﰜ֜Ѿ!DywY)I̕]"`: ;GΨAm w٤q{ i*_G>[ [ZfG+:Vf'K̍W5W9R ~q~ڒ.vW_p& yk18}l5W68]X!!+e-i6T֬+ ֭#[.{|UmٞA~}ItdWKQ)J=xY!tГV1[6ݱY\y~ v)c(/aaz*^a.+$L|<XpU@s?[{x"h{8yMt\~]9h=6ݗ_NjF;@O.>]SH^cיWC7ͳh i\gaYfltԨ|"^q1'o9A0ڶ7^} \{$ lXHYh탤ڰ.eVEOq;bhbA^b#_\5q{P8 x9"`GA)͏B>=<þ/?>"""rR)i2a8-b`Zl'z$ JNЯn6VUUĎ2K$"=lڎ{k[_\ 3ʙnrd/ˆ׸o,bbM ^Ә=|"K簵cS2}Ͽ.=2mωcGl~OaG_uWO͔Ҋ`͆";{LM`d@^n^!8-x<윃d0/y3sY^~~XDwȉ]Vr.fӢlOrG`YXv?1&Wx䟋!iF&[)o/*m}_ejR }vӮ#7c%2O[@8B_[lk]a5 7+Ա |,svj ^ƸnSl*ΧǀKL`WÙSo7իleӹWWުy֗]FqX̦rU+:{_@$'%KU}w|q0"""r="r۟JW\Dn]9mH㠱oIE5({V_e )y@s?,()]lKYO՘sowrc|-ؕgAkޒjVuRJ|EXB+;m2wH率Ҵc͛ձ9zvalu ŵi6|= jb8^DY`UUC4Uc?xQdZ1׼x2fNɺm}E4 SlTr||WoE@VoX19&ce .)_߉A) 7-aе|i]/G[]%+FfWg ڴjv6eQȵNcٺq+_XDDDN*%" gZmLNe_Eæ][O?:ɲ|"ƭf7piR\>r0ޚҏSݾNόft`>z-/s3#V){M߈6{섲#(wv+Xޙo 0j0Zgȶ Mq헐fy/kd3+ȍ|ɀ``m5yTcر}H};|} n{]旈i M8؞~gk.6 T7x5O#ml2W[.cW?K)fRXRaCHZoarb3 | /vfc%'a]Gup{~b~Njorm_xe}~X{/a҅NW ,kfrDk+;)o -(Y*u\C[c|012w#ۯWL :~.!}_ #AYoדmN87cs+@ZY\r\&5{y ÓBN"7%"vs_Ch"sȱ >9[3]YYdGiy^2j_q3W`F[?Y+ɟV;1h xT?bJqw;&pkϫp\u|/B~yɋu4vyxsqx?qs9+ƈ;J<?zO9E97X_¼qM9}ё뤩t8ݮ&K,8[cW` /ϙ jbJSoϴqO_c hY#Fҷ?Y?#kh%΋6Kx_}C\.,S.Ry7[[,"&w 69{[b ĹDZb$u"z:^>v_$#Hp%p@,#:ɱ a,>㫮Rzu)a׊zy*QyM5:?71Z{+'M˽q8μغo&]eO. MkBe"Хu*ڣHEÏ >Мf$4ْSmhYadq6yX~UG~ aTڟnӦE"3}]IjyqVzGQk0{_wϘ򞓋9nC*=Ouhc Ƙ8=B{8sJ(LnOp`v{m܆sϓ3(G6UˣNXs7оF-"\Dc ZCM Ay)x PeXשHɴiS.rxo)Xϻ}ǶkvDIHT(a/x+M"cpp8pX+aٺmD}h}߬I1N :aSe Oud8~H`ԍ#&?3 0J]ʮX8W*I`aSoWYѯ,B`\R_;>zOw8N'I-Xr,U|7|VómYh!LdF+n2N|/clNɑqX ~W9a6r7S&Odap]*SŲ*~_uyt^~sRIV:Ln2: qwusb./m1-DhkD#ocU~S|Wu}<0VD8MvJӋv_ZigB)**$00Cj*,,$,,Z]oќEҼyaaU?@DDDjUnn;׷wm""@7nKط@m""""U>IPDBE_nD'""""""RW)iQJEDDDDDD(%"""""""uv:JIH]DDDDDDR.""""""RG)iQJEDDDDDD(%"""""""uv:JIH]DDDDDDR.""""""RG)iRfw gM?H~__TZ!9lmfS)lNNl"!ceF.Ϭڷw2m[)')b\rT=Hf֬-\Zz=/2aEy9m(i=.mu4!$3ܳCڭƅ#x*6zgU# LSW1s>̭pFS$ ExB?j6GƭW&]go[j;91 Xгt[.+ATeN]FC5=i¢xc);3wqn=aVqnq6똶WC""Rv gL8fɖ80ؒKn|m݅9DK `ѻïQY>>6ՙ8c¹}h nnᬼ+- W>^8φ\XZL6!D%%3E9Oc]H}cW`0 M䳿$2&*8nX~؈g$x>B?Ļ jߒOva {}MTV|׎|1*ZX;;U6xSxI|z_2wV*mVeܔ|YڔCZٮ,-MsWۜæ ,aŸnK⣑M97Jm,()dCn0]نOҖc xi#u yb_oKIEva8v;#$~M !!ek|dߥp~F3{(l2H'N'DUDcxz\InL !mI)( NbBj]uiG@v8vy37#,4K.iΕ~"HړâlڍyĞMRz b|‰9ȬMN)ФqNSoϢ-;F30.A\zFlsOڍUnw}S=DNIH`Xy,I7euT8tޘG]Ċ6]ۆpYi<5m3C&wClk},qu+I.T\gB99g4{ 2^ qY=2 :ۘ\?)2 c챭[~]6%n?s ]\vM<74qMW P'X<BihNm٬8պz۲]p;KQwwFr2df^M <\R{t{?`aUhP{Ο_6r03J8Yg%:YD0lcODzel&56Z{xHJEDDD~O,'ۅy?&ȝvO9lhN=& W8I tx^$$7fmI|xQdqȲY<=a |VrUЦIN,"ޖrlAGEr0-^meeBRv=Mc&^I3=jХBDDDw&:1]7>-ݞ9f"[ѲC ڝ͗=d;3 XbovU#J YOz0}{\rhӯ6ϯm?krxy|0wzޟ$w. vnQ\_v7f 9](A@@pz56CQQ\ۮ_6%%Ogq)-=jG8"91G96yj\'a0~&׃wf~kѺs]gѢuc!^2R;_lѰI1e~A ޖe%Q19~~7 }˟Kn=7R' QmT~3٭*apI(%W$ez>gh ڇ$Wa˯yFINjH,ҼڎCDDDDN+.q8%"kHuhCzJEDDD~':uum a]k;=^DDDDDDBuJJIH]DDDDDDR.""""""RG)iQJEDDDDDD(%"""""""uv:JIH]DDDDDDR.""""""ٱ @C>hϡ`+Gv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% J@h(QD;D33|x J@h(QD;Dv% J@h(QD;Dv% J@h(QD;Dv% ꘙwoG.vIENDB`mu-editor-1.0.2+dfsg/docs/po2.png000066400000000000000000001732151341747546300165230ustar00rootroot00000000000000PNG  IHDR"vsBIT|dtEXtSoftwaregnome-screenshot> IDATxy|̽ B vYEܰU[mm֭~mvZ~kZju_PA a߄@!{B$#s3r\XEig,:>=ߝ."Nt\.N}k.a֍hٯ=wr!#Sbl?~$xvWbN;x-""""{Njٶ ܺ:>Luu5MMM_v^^xtW&:NIRUç~S뗒Y71FN xg'lMŽ7Ox߼ǒm5m^?kA-a~.hhjݣ>fY[صkބ`q_eY8233yᇩ=aQZZj%홙ٳZEDDDDDDi /e=77={0|p9Xtr-`Yo&墮]v1|pZZZ[n LÇR.""""""N'sp|UUnDuu58EDDDDDi兿?t/ѣG&LtsH˲(++믿ѣG契EDDDD6y7"22ROibdgg[7of{ϖeY_l_DDDDD\6f^aÆ)y#˗/ot;sBYY111\wu455Ң]DDDDDi.Y|9QQQ;sw&JKKkinnvw8""""""ʲ,)--!3Lu,[ PDDDDDDptRjjj9C-}#G; 5juuu㜡>p8rw""""""n}ȴ,K-}@7?DDDDDDS7 U^DDDDDD࡟9zgC?uw 齨::_FF܉ 1.""""""rvnxg).)g Aqq a|܀0=.""""""rB7o'"~a}ƄW_{{Q{"bxf]DDD qߣ}^uM ߽^f_ȍ ..chd$77H׿rjqs?Sn]@ylOrZcf$󯾉K=K3,7:ΫۚYoÌ:6_Twg{<"aRnQCƻ+x򁽔>g>KK& H/u1;U]71 ?ƟNg* 9_̺xɝOeޜE 1k?yGSf1s줺zY""?uϽ8ݏad8HLt4>w7h{ʼ!AA{]g]=%/""',kbYd 'Ԅܺyϖk@˒nb F&F#~q{ v.\5rCбS£\KaQ9k~/MǶ֖o|&~-Np~KcKپ|JxW$Yg Γwڮgc?Hn>7/ΪCǓ?[DGu䛷ix0:5oz{|W/%ʨgRXnٯzInon$38\z+c8cE742'C{h7G'p]""^ eGp#WM%5.!A4R}x*c sP.'/}/uXɬN`D8њhQMys=908e9ɾ6 J-?ç/ȴt폹g~eQo[:quq3~Ý#*nsuy4^lqBu 0 l ،dѶNyXi9.m 0 AM ɉOUED#G9L{n^ww?O<(a"Ix3vWO{7oa-|4Skgbt6CS>)NcLY:l'$'mncڵ,[N|wSC _4ގsK LսmL&Ae9r$vmBK7yVvɤ&:3{uKxR]M@ Wa;!\`ȨU':u9xMED={#7//<7G(JED3\vϽx_'%)  6ҞlX\qSjX>Qӽ,Yˮ204e:c~{oKg'W_D~nfe3O83Ҍ(pA&Cc X#%;&(fGuw,ãL9?c,J G{ܸ|.acX|Y̋kbTxSXnїw}NX:%sWPNoϋ.>j$Wvu\{,xߴ?أvst#fԅ<ٍ  oc{oM +jm\k\s. ڟۭ#]z}""c=FJJ{~Hgٹu//zsq̬Rկ6 4\۟aK2g;:9Kp/%"""ZK N%gJq$_=}Ryspc'.F`9WDDMEvE3x%s~?s,R'MMM eknnvw""""""Yyf0VdOˠDDDDDD]EDDDDDD/DDDDDD<“O>U^DDDDDD㎠/<'n;oeNpN#) o]k檑'a̽.=UγOg3ί03xCt/CDDDDDD<蠞v7V2=} /_ؽq3>H H{O7h3P1OŻ#J36o?O]07߮ wNۙtrS%DDDDDDDR؇ӹy;\B6sˆ l'=@S #0u$:)ٓM~˷n)""""""Qw鍏יװW೐Gxs.+_}¹}Ndwjlv|@-;'NdWfY\7y|ƽ+v;v,ZRd',,˅:"""""""d@H"R Jg^?IUFa/""""""K?%^xTWʼnc6-dOY=-F2ٝwO68]cO-ʴQlxUMG)>Xt|T( z+yxuy&Z2qKs ּ$o4 'ae݃S cmwpql +O|ƈXt<SIٹKXlnX>HuEDDDDDDϊ%ֶm tw<p`xyyW,;{muu%%E7qT]#::*??]:fU<Ņ444h<~~ĝy,""""}'"99a zr N1 l^f*IMM%,,b@}H9{|뤧,Fwi?]< :^ ?;D||w9'g)))fܸqxyySYyd@Cj8zwc6߻E9'UUUc;zh[UUEKK K!ZXֱ755/90 r?2 _b9ѣGg=$DQ:޶&| ˅eYXXXm>Lll---O_CGaRO# itcm|oq>/""""/00Pyf(C]}-4qY.,0,\477DhrUx1,ey7n(?#o3lvF&xh"%ӶƱ}]8]N:?mu>>n(E6`*WVZOjq?R葘 p88| P|"Slާk{@-"""""%ax7y"n[Əfd;8hd؏rwNqӗn2-Ec}5-͍\2&'oh;vQ7$x}""""""Rlq?0 äXXVkTSD]L/*~D_vGxq uL" (q\]N,E=;.GgѭMڃ,{@-"""""%i՟0@4p?H&l#Uq및UhזCc}C{bk{1xTfNA-<7l$6Yx[DwXdO[_Z^|ZH_}裡Η\Y0̧_I{XOfI#ޡv\c k-M዗ccq"wGE܋-942+$U ?EO?O[5,c| v][np|$y GQ,Qv;)*`w~#x ._[h{R+W^{Wvkf^˗1j(Gyi!6Qqؽ.ײ9˸;-{{r)zCf ON@]ٵΙ }އ'H_ks\6~.pPuоlw1y gy^>|i?6%l\2ύ/};{n NgNeN'NG;_&1:Ġ:l3G0g^OO;J=$&o$&Fҡ;~0 nzS!l_|~,%[UxF]w2n~ߏaXGQb5~ i9lbPF>a'>DoEs؝sr~y~Uio6lv>bX.\G^0C,^DDDDPWyНQtszB*s8PZ3_7r,X&abkYz?ٵˮ²ŗ_ݧahjlfSwCٻq{I=a&Rs#N,Xu}$yj}`F#c2sL>#,:Ծ3|;^u{^Nd!s;13~ *""""r+\{"əԆY IDATQżfWgKQFa>>1~]m}Xm5v:4&ͻB}e%{Kcw奕4\X' ؾ)ң4Ք_\ԉ,N-ヿFUӧk}?>""W\.(--Ϧ.W=LjsOm0L~68/tgp67o&^*x $!eU'U&._|Voʾ檥47~м.[m6M8O^{@,q:yXnۀs݉Al{~Qr3ΟzE^Xs)]˔L<=?_9tlsvB',eia9Op;| Mo40cŒoH_?`<|LX=񈈈yƍIOOg֬Yg=]r%SNϯg6ӭm۶(lc#s-&j*IJ,;{֭INN9|Ld hiirpZv fkK, 2hgĈ.bǔ)z{w+cj;eY8*;ݛ#F{ xMݭ5*ɭ8XDDDDޓO>ErrRٽ{7ӧOgӦMg=0a99ve>xϸ[8ht:_@0~!frƌ=0u, ӅaXau/hmuokmv8~7]=k#(8ӗ`75,IMI@+3uK]zc)""""2X΢Ez>g_|K.ɳ/%7,cժUo롳J- N7\vC}5~C;rZr.ڊ>q4inn??? hOMۓsilhf͹,8n"98\Q:_^>%st"""""2XTVV1k֬?s٢Yt-Jcŧh46mĬY!6-py`Q(ungCD{CwnRlʣp=hR5gq~{=:}{@@%%|rٳzFGEzӤZiД}^,q V!_E̙3ۧ7ndƌ'LOL|&.p+l g ~5iq?Yyk[׏%RJ+`U} _΢G X+bW/'%p&\h׏p{4ׯ}dU${EDDDD[[{[Raf̘>`Ӷ^[\0?% g8t;ʟT2cuDnu1 '_㝕IXYN]%6n?OU~0ӓomϸ/\M/p&|hX~iWfI=O6v|ĩ/UĖmGH\I{3 O&[ٳx4Sc8>GNUCb2%L ;VՆB6sˆ ll3?9^bO~EfH^q>=;=0ػ={RW^VYYEZZ-3g<Er&,u46l@ZZmqo:f|VSHH =wx{m#ŔDUCeS$ .OcYPYW}B*|roeo_8ωpQZ7W`ِfVƻm%T-=xŋۓL/0U6d VȒ3xM:7^UV1u/].IF;MR`렬+ M%ux뾦^2?a[|bvͼ'o'/IM m~ҤD>w.u0 }I&\1 4OgxOCDDDD mϸwlqOKK;E g ,ylں| pXc;n¸ۼd/4dOgM449MV;!rUQ?ڃp Ot=qv>KSS#>>+vޛ;"ct1hVillϯjhh8XDDDDdm/^7li\3ۧ| \U6s-Ny]&iP߀ٍ#8t HK=u9WyMQL:]sx ۱{e}גYeN_ /v1lptGRP=Ayտxbb%""-{CCe0sW[{zzzIzzz:iiiӶz},Ūu,?U2X4uYfQPP0ϸ;N-iQ^OE8]n7)1ӉaPzp Q#OsΔIAFmb 1:%|} ŵDGb $HAaݻwP]]=2$'9ewc6<B|<QRR<2bDCEDDDEX~=ftdmɧ~^ӧ8>H]8j XJo\].,²\Xrb&1sxz.^=oKҬ&JHZ)L00m:p%ÖetC c||^#66m?[i!88a*fϞzwf ,uX<kq/قifkm=dX8l6;<޹n (o#jçlX fv;aʿ~F/"/Kg>qKs ּ$o4 'ae*/"""""">3/^ܳY.Egz͟5z%^3g8^' 5L :at4T[NugfںĨW2j3~-WqRYYܹsOhQ={vKuzE_+/3wkqw\.-4pN"uur{w<ʼQφa'8hc&qMY""""""rcYٳgzjΝ{VӴ4JK̨i={w0fijLw III0sLrrr:u evsi&ӧO'''ҫ0 |}}n޽ 4M=."""""" ::DRRtsrҴu~rrr"eW׿lj%OʼEDDDDDD<w]DDDDDDăuprn2eʴ~ߺusDDDDDzkK8Jˮtw2}nsNDD0ROOv4$GTSD*/""""""x0u9\.eeSXT@\\,)IIy=wؾl~`cRF1*=qpg^uuCSu^]]<'3ATׇ&ol9  Kd5EK'0<'/~BiWqapwÕ7!NDDDܬlۓCIU.;Dĥ0uh"|A:E3b^"z/i1_^OŎxLZ>&z WZQ6i fm&cOUu3af=e=/557wk^O <ۣF%02aQvEX{4;49pxg{k-w""""rqdǼf; J\T>-UUbROUmGq;ܳfph7j:\Xud<>\5nu{)u0rd&'ү:G3q!Zfkٿqtstrn3}n)bF.ٿ&{s m-NZ17&3[;0||qfΊȉ7M}SRa~Uč#ω+M bD24  80;V5O@Ncք ܝv& ll.Os9{6ndw^9.?Ɛ6?pP s)no?p& u2F356p8N]sΑ͇/hX(*AQWp jY07<EDDqe ces6+^ZC~\rsV'i9io_6F26۳v39d&GO$a+7aM=LuXLLYæ8\EDCKV[š|'>O&`Og ;yWMդ6UO-# E7^V5?~u'MbjJ9pmug{)qrT&'ĴavpOMJQf*]s8)9PFF}音 |(6Qjp.Hf Żz:n$4)S0m&G $xG$ؙYz;5<:]U\v ͤq>@^G!_jF3>)[CW͋3狁ѩi̝=SF:ԙa}[yVAM==2ݣ9y: eDvv!u_G%/cgqe3; t!MA`|GY[Kex3 {rn2G2cr&yY7'ps:ό̥#p  bKj*wvSUYE]]L"L&, [m=@A& 2ŒI ;IdʔDi 2px=z,c#2ٸwK8lD1gl$}qdWbI L{uc9p|t(װ:g#tFfWTƷ\{š3\ˤVᾏkKl۱@- %$0*@/}| eĈX"N7Rf yo.%Ght餱IT[4TU`&a@]IO ŃQ$L`x9}}FGL8iϹShh?âفus`(/Qp]TJr7s?Jz34-.ؘͅۈ69B18:ƌ5l2KJ#9xlpuIL0ڞG 'g/pf$&69ӵ䤽R/vtgpS^}erZAyo8&nN6q2;ѯ3R6CL \vvoJط&pU3U>ӓqaQwιZ-yhcYX8EDD4D'O!:yy˭'9uO-AKP;tS%#is_!ep|3nu|G۴t㺺>]FA`6˅ť4ĄiL2qWɀ7"@C9TN^pB-b:g c҂8&ͩe~2ۋd?irYl_G8zn"""r@&#CiZhnv&6픱v&vVO8%{̫cË/,"&of pœT4wŸ3CWhH=mM҇Q`}0 !8u$-;Bis`S:>8E |3r,SX߫dl|(vG >|~3QC\_f>=d쇽F,_a2c{6srn9fDbN9vVm6k͠'!ٚ8BuC T&=uClVDM_l |S;xB;2s&Dc}^:ﯮfTH3T!LPFgӁxϬ qH edYuk~۷۔ffQC;l.s?gˡ,U9<>0HYr56%[O ai62lȎlopa8, < qXv|;{:Ӣ<˔?3licxgw91Ϲ0tq.r+EDDgS"-;~a$&f}7qSoMdnH<7&^ٙ-v'1g Gفp\z)ٛ9|- t-cf[۶mcXlc23q׾ѣmne]O۷0eʴoݺy:DDD<_qq1111ߝ/$m׎ACBG{ťk3ʘ1) T]ur]DDDDDDē)q`JEDDDDDD<w]DDDDDDă)q`z;9Η"gC齕o:DDDDo=vϠ"""""""LS.""""""x0 N硎6'ؼ{k;|Rʒ}щyeM`Ȑ!v[_\ҟ|oṉU;Wy|ŘiW0MHu0rױ$~8~ ?q_sossx> {JXUXԄH07of7@mN> aҩF%9,償>G|3 \>XDDDR6SO s5䙖V {?@ok4n\! cʵ?gW { |5bGq=laDq.cGYb*~|uyu^Uʿsw=Gp4'Ƞ^rX_MKsy2pŦO^|C 4" <@U6Tݏxi;is>~6?|=Ą0M???&…kB/ $ȿZدHmc 6+ޝtɾo"Z)ZU-mхqV*ՖWM-U)UjID&$$dfA%X os<3fю IDAT<_?Ȇi녓g+_mr?j͊灋?McUiZGNUqsp;tdߟ7P5ކ\FQ4jȼ|sd'J9iMOƘVjZA>{ix9^)OJͳscY='5=qvaױ,;uS(l +dWz6!Bk[+rccM턫r>>v\>GV+/- cEo*f˅(xyl+Ly&SXYY(`qqq X+6 mߛrpt[ъ&0 /pm̀Y' *>owǒqNz]V_)IXv/ wIfv6"1v;sfˆ/~L CgE]mN4l^}%΢@W19z?̠W(KҖ![3H#xN̊d R9v.Cnsz_Ly.B[o7oAZ<GK\< rOiwm_ŏ,c?ݑeaZ՘Okklllu(J/^k dd梚˨ъ:#7pM#jB4(/KMX?z0b ΀W3 GP@/X&aJ?SmBuft+/^!-^_M;}6M#4}"*ԣE#[}Ƌ+Ρ8=WNaZz5eUQOw Ҽa .e%glV1U8ġCTR34o{g+s~˗>{;>|w%k[LG?[8e5ʜtMH bSLQͨZZꃦ)J}NAQ?Z YE/u#z(BQ6}|ٽµ*':Cκp8FT`:[0(S.9du&ַ YtlmQ4Ş_#k$ĔUSIm]DE33P;$#ZW]Qf#9~FQ~ŕЉ[jR0 HX53?沷K !B\oU25&K5m5ԫ7-eg_wyy%C&qr)/s:-΄_e2L8{~{;~=+5ueIigiW3cgC:?aR@ΰ ='SO#:VNFESeoNndd$e{:> no} d'}#]_wJ3])Su9Oc˹L r87.\{Lڗ]XFnZ ߿?E\EeSl]si䦜%26#2C!y?"Fn q>&c^ͧQMy9&(o[CjWI(8]f\P@BYCJU#^ȑ÷V~=-հcWj[} zs[F1?5y噬?p9/_enZ6{N]\_]j ^#SndDo}B-%ȄfKw^X*Zs< SZtLow0q&wW❟])0{^9~ oޡ,)B^ݖGZTT4 2kװefʟӜ<@`* Ǖ$>M@l SuGӦM4.С%S7Ř}K(:\<@gǔrF~V:GlB!Blۍؼw|Wo|M@@{k},-{ {KkT7^'R1+qQ 189U Ѹxxq_kB!qdk +Vax>>U˻IT;GwR*gJpNUB!B|t?nx9ҬnB!i,N'B!BX, ܅B!B&B!Ba*[I.B!BX. !B!*+K]!B!T?1I.B!BXYU^!B!l !B!Lw!B!‚ʻl.p%.^"%%[[\]RZ˻ywGEUE V4Ne2!B!u2n3.nCnd'.&jW7W ׬$++Jnc( Juh=d.]ދ\[ qozJD-׼SͿ>sL;?_v>j/nkSYJK.& !IeLm;^Cл%AprFggᴮ鎃c%{MesA2!J [H"ů \+`zw~[ӖKIqBN9~eqrr*6+ SI1: 7塾bLB_ٔ'IT燖ih-)Ym= !I&l`$B'8z]/*?lu+6W [Mƥu#~ #de־ݏ~ˮJ$ʑȮi } U@NbJNhےF-HgO nАL%Wc]*f. h4@'7T4MCT4MՌD[B!cLWcK6+9@ɋi}6~BgX Ԛt Ï>o1g(wM%S-_q E n3{kkkVJF!?z\t#Gu[[l]كZPW`&ͳsYVwBFi i%];W )n4w,! -ȡu~\[G*z[tz譡x ;;ш=*{EP 8v yߧmZj cN { uĊx}o=&m8EbvKcohrCF=|xI$VՈtM}%LdGSmOf^ܵ$~X{F}zs;!C79v=/&szn w~XJ7&G7[sdmhд i:-$"G3:-'8w&Mc$>o6fǤ?% !BX<֛[д{)Fڎj3!Vb磿I=X&I"13  + ,Qׯqqbh^rŊgdIܙRj5ZEoGosWDLo=`^B0k0^8uoqb&ΩylUѥ;8(%7b`cK}y&+ܵhDUjWI2 ۄꀫo3:4Nޏ5|#f> S3 x#e4r&CFRᖗ~EPJt2}ŅОh\͓ z37G1m@WL/JIB!b ^>%3ɫ9 ZNvN89Y57!݂n?  (dЖȎ;䃏wuɉRj⩩H|ܔoZn9>Q[[[lm T0E$ЀnveKck,N׌W\зCk%r0=K J)( `ĸ. LmJ<۾1 RtYu+,sGc`f37[#4!B<Ҵ+l?9X0րb]nf{Xlt7RL(/[9қ`4zsHVFu:vHdINDØ_-xzzZot^2sbkcG^޵t%N}@qSdGe_n2 wJ]pu#%%!ƕT4g7\tCDrxKx0;yMUSQYފPz)u-B(2`^YV 'zm9_mM&OlU وG)Vopt/qh-zOy KTB*^+ V}Vb"GU7"@=c%j/?%Lk]ٻQثkcP.jО"6s l;NBq}JHX53?x :d:)/eJkrΑw!BQO!wTsI]4~o9UP*3,,/GO`ӈ?Qo>l ܾ.k-{{ vvprS)Pp揸$kKvf[ڇK[͑N_1<7~)#qO,΄_xst{Ou~Υ哛rL8(w~cx?-2)I߸teS l%.5?na(YU!Ma>#oܗI3YXƼKe;aDOɬ=p50FÖcʦ pIna5 ՝#5op D$33 PLl,Kjؽ{*Uifwv77jwo{(涌bZ7<äCTu*QN6Ž`՜ Q!%֣r1)jcm! ǚk9?$-.%U+xJnvĞS)w#ga,l\U dži55ijwA\>:"Ɫ۷O;|0>^ݖGZTT4 2kװ[1nD͸NVF&#fz^ER>uVEndh#F~V:Gyڴ)E:t}7}J@iw8OBaeBTZ?;7^!Bđ#?rE*WL7Χ?ѬXvf#èh)qcvH'^ťwUѕঝPB!75m Ka:Nd\ %~-wv4:!B!(NXZyB!B!ʇ !B!Lw!B!‚I.B!BX0 ܅B!B &B!BadUy qnxU\ B!x$p !B!(LB!B!,B!B!B<~ݩ۠Z&B!NF܅xڋ[x)zV%FҒ˻B!xR9t2}x`Nᴮ鎃c%{Mes̤Z̄- 憓[5=>6 NgE#V SU3y9 ܧih-)Ym;`:ǼOp- !Q&l`$B'8zv֍)\v5Yv?=o/xKa:s? ``ow růVg5ZבI;B4 Pu5 4M4MSA5i*&c>G\|cԦ\B! Xyldb,jM:΄vkȎs;+@ɋi}6~BrTͤVᓩ̱\9˧vsG˻y1ېѨb4Fms rϒr\I '"snLKeQ ?!g˸ 8-"U~fjE@%\} 3 l +dWzOnrC|߄BQ Yhtm;ObȺiR+.8[瓗p]+UO*s2nA"7Z G׊Ժk 62g(V=oYB!x(^&؃FVf6:{l*]a1Ŷ eΨ)U+O:y%U '9|X2&  nIP_<ԠOG+#XVOIhMO}iu,Ne?̷B<Ȥq_X^KH3Ȏx.zH[l΄#I;~0+KXC<?J2{v+#Vc FrxF5~\B!x|ӱI6x롻ͿӾC`ӊ΋~R4c+Vغ?VPIX鍖Zqfr I1'ŐwKZ1kp19YE@u2'D&~TLW:sRTX /ԯW>l#X&bPԩ vvprS1VgXX_)`+w'Sl]si䦜%26#JyB! y'i#&fwRw,Z@a>#Ugԋ0y}gŚ: IDw S;`6Ip| 6q_]MrR"]+v JVl9AUc)3)qT, Q'q)FIw"iwV+mŴnxxgd2f@φk| %}BxcMWlmmu~)I|[[[\z}KPylV]ƯvW>壨-/C~bϩk3ưlfֶn[}tcf_/+XՅ]uxV(zi\L}jq 1r֑ڍړpB%JHιW(VW-5.9zٌf6߲|iEj47=fxѯi@lJ(P5Y[ÙUJB84zy3fÐٷQzETXfv<[O-zvs8t(:=yT[{$p.p[7Pv0>5ɸL]E)\[d$Ne.i !B!Kw R$8KB!B<$p o,B!8]y7@!B!]!B!` !B!Lw!B!‚I.B!BX0 ܅B!B &_'̱ڋhܝʾ ʩeB!Bd]'UO"gUbn$+-X 627÷wKB'1K'ӷV%|gqlpZt9TJefR-fBUsɭ}gP}J{CM"xJUEF܅xtLy44UAŊۖ\PQpB6RKBQ60{ic=QKFF.;ˬ}] %0vʹM՟0}i;]9c^Wt3H$ʝA! :ih41ȣ{˻B!xj ca3;hf6Pkq&?^CvŜѮXZO^L?7OdE)|ȶs .;Z!ކ\FQ4jȼ|sd'J9iMOƘ`T=n8]\Yv:Q9?@‚θyȉf[ ˟DZ*^5 ; ';'*iϨ1^rZGNUqsp;tdhze?" >M\Ǚ!za["ѵs֞MyIW#Y:m?>V4wg|.pib^wNw rnc((Ngg&t.z?-96 v!U8[ӰEzBD2Ĝٌ@G1&=;ߌt۞̈5kI GIbv6"1v;st ϷcIIOd8'V.hQABO:Iv2~T@Ma)_3<NJ.Bbs₟; 0zSy r/%H۱]Vy&h;V`-^א[ Ty `xj/DN&>6}G"v0 LB_:iW DMPOq~#gج$v3ai-)5*\E3b *mܩڵJk%>So$2ތr ;g>n6;P9v1 aB`B^ "h&M<B!-'\;'|*8:9eg +C|2y5^#{31Vp4Eݚ,/DhW OOOtxLukGV5O5 7o(7΀f6be-`+싺־ };b_]!}[iIb XRVI7bHJ #F0EUVz{{lM5071ƥ#KE4 !b]42;`[Va [d-Mh-3MZyA/!> -XW.r, #j:V!=m=_rֿC"R5 7{Zgw_v˲Srq7Ŧ3?EŕN};}l\{=(ծt% 1n=>'m?HT~ra؇䑗wm+0c<4ǢB!97EZgR߯&+*0yDBKXwtl+Z0wu ŐhIbӴuRnkː9sFŦXjzFNe,z5!X^KH3Ȏx.zH[l΄#I;~0+- RZ?%K{^: p<#Xu=JC:GrL*ɿl#ցUrFwݞv)Bȗo0g.)oMgohzT.l:> no} d'}#]Vpɍ=|c]QzV-Fΰ ='SO#:VNvq!BJ_!=m$դ,[eT+=~D^MQ/2Rr TkR0'ZB- -LaBS=}Xf3 [4prvD)O[[{&%?3, %-B M[ײN_&W*l9AUc))qT,%y^qtVE(z}ٓ9J})#;S77G058zLQ 4իR%з3څ4 U]5/)U727>!O p9/_enZ6{N]\]r*mŴnxxgdra_/B$cM{SgYݝť׷j dži55ijwA\>:z8'Jvhd1,9ű񲵽vB>B;tkiaTut&/&UAUU '18.A~X[ۤ3YS+P:Sam_ٵ&V3sG i?~庱҅"{|Mśv?W!eKei.g ͆!o97xLZp6+&#zp峘oH˛¯3gul2wLʮfkbugy#{L`HϨˍAř,oNfz(>p/yځ.8ľ7]+0C:%>I*,\Nl.@UMw\JûZrnjއJ0G!B<$0%((d_6SN s3 f\Ԟu s&tOu~Υ哛rL8\;*TtAQ<5]l̿ vvprS1UWY{I#7-"zb᫽]ojt"373qj.0S;S4͊ei' !B'L0c#TGkb`ec dgHZJ7oC bo !Ogwĭ0Pk|o,ӺJwZGxp)Maг\ʱRp7>(|P>N,`1I__,_=@}o;r)twWw=y~hgq9Ҭn]1_w[2{=B!O -fSN7kfHMlB3K7U]y'/+Oj83rsmh<(W_+Zơ/}>--w,S[NXCjB!@w r=م-z&2cIO܀Ϡ _j !B!x$p C:qt*.e|q{GWSB!BJw ( !B!x$prB!I"_'B!BX0 ܅B!B &B!Ba$pB!B!,B!B!Ux9Q{QUs:SٷA9L!Bq ;5SdsJd%w ldpoo-(!ᴮ鎃c%{Mes133wKVFϾ3yԒ?jew`Lmr{_zS0n:S`f!J&#Bo1g(wtŴQ/{"+MߧiݙÝ+aPcK6+7EDũ$|=z3N*oaRR/ܵ~mG[#XUkcoYϟ+fGNoC^N.FѨz΁qd^>KV9Sϓs%'cI+‚ @q\WJvͲD6L_/율X=x|N4+N.^4>U-=m=(mRv1OcSQڛFA+lҕԊJ.6qg,B^Ɩzt\Fkt~y)抭 i7eX60knsOuYW>ߟ&$œ:AP`CZ4kMfmhբ-yy*9"S4 ~VcJL=66(RtnX3IJl|_rc,}^89R76ltV4hڅV4nNau WAPJaNlF Cĉ#SiÞoAvw,)Īe $V n{1i)c3wL_{5&gT ^ƢA~ʬ"<Ǭ?/|^$\Uf`s 8 6foBpbs₟; |Fڎj3!FbνNsjV buӅA[<HNN`0`mmiPPP@~~>7DŋehSS!u?(V8Rp xbõd֎;W;Tہ?s~r 88)1bm&FՄi7Qʈ Oq~#gج$?ڍLNnK#{fbVhЋ, 0L1Hӡ*fpOU^N#'' nxzz:,{uP<VOy pc5?|/V\H3o4Dq|sەs݂¾Kxsu|1;v!)=j}CYb;}YI qJjiuD ͺ%G|vިn1iGIB!ʉb]42; +l?96gg-VXQ)U+O:y?]mRU9-~94fsʾ ldpE[rvW:GlRSQ~ƅqo?jQ)Nvxj, s1WEji_݂SҾn%\\}hCv'R3.ޡ w\U׹Q ((sBrre27[j?s͑i*(^w!( h*t!J ]}yX,ksDG ih:]Ƀ N'6/b^*_>ȹei;~|w-ht-cM!r3 }kI'0s31 eLeB 3y Pn iྵ$& &##371faLf x/ [[RINN.R2Lhsm:B;:֘Pߑ ؝kqz?+f>#F}:\<66z?d pоJ[rr,JNor|ۧ㥗X[BTWI(?-O\N&\m3hC"uCDrt #+x MQ7}=J|iu6%ʸB4 IDATuSzT BT$:tnpM?^"NMK?\)`po3pA:~-t[tiGynu?#Vr1tՐL|j*txɄll6 UUEc4tcZ0n..m~G-Q0wpB9P?w8[lkE9 $<mG/dw\~֟G`]}׫Jj)x`pkM%~@>ʼn^}m8f nI-/B r%Ng@)?҆kiڶS)9dgw9ƴ7v6xRⵏؖ7JB׏c+6cF#WoF)<@vN2a/T9B!}oW91c,@R~4qgc~n (rߘk0+_}7U t [%$Dq$p`2 O;M`2]u/nmfRhx}pEsmmm'pnrRokTVQ{t ¬C܍ٰwrЈa5[P&vͶ!~svŖSwz@քxj^_lw=,2g C^3Y4$]VW kt _#}6275=u1`J?Y(NŅGl]в>; -A/3(ftͭ힜źcT9B!g!gfv cNPV,G}=_f3ՑjyNtPk3UsϫKGUlmmqzt1ݨ3"XލAaD2I -lF4TU-uX,(`@r9>hs32r8+t߉^Z͞9z}[2bU$7,`aױxx ťe$* bAXnZY$C5JXDN'dr۹rz_x~\h޸^)ы~fMՕK^C\{PJ84f?3ܗ3iev d3>) !P|\֏[A+{sqwY2}KݨçIBBz+wٌd* /z[ _}5Ԯ)-Ν9cB˻P#zNύ俇WcXLbJ ܼwoxk:'yB!gl6aÆ=ߊ`ooܹGGǂpwDq. 1qZj1uKgeF~MQ=#9u V6C+@qy*#51E.ep:d z]w|l,Itb,{x[&B!DP &== S'=|u'bccTŲj׻A49>H/czm3tךNXH,K6 _̝SHP v SN}Vé+Ql7#p%ӚM7'Xz|;wx+Ǖ}XvδuqW91^R#X2B!P٣8pw[ѢN*_ /oiа>nnn7omm3U&!*cM|;i=|LhVFnd W;lڴEbB!˦MRե{^n] ~NKMV|%o@K{E3d,sRRt cF˭;]m&B!Bq+W0-hIZf=D,;BxJ.B!$<=e>N>HR!B!@z=eh&6 @!B!.B!BTh !B!B!B!D&B!BQI.B!BT`|quGOݨ~=kzG !B!ĝ`B܎QqN/b6#Uywa<źy]=0H,l}w+BϾy|fsErNr/ɪJ#9wjI]5SX:jnN:4|ߌEߚ*4l&(Q4 MUPb߶T\k'yE35uέxG@KGļy8]~F B5v=s#0=?&CW3{D30 l[ ii Ըf,=_O` O{~Aש{//^CK0&L>+B: h*i*jAȚ"kX䘮W<,f` c BQjbQ` 7T/(Zfniϸ5`L#;/'VosGDklJr]OݩG<}ȧ;Ygyصգ/SGT.8NoCvf&ɤz?iWcHzd$'Z,ɗJǔ\l}ytplìSF86~Dwd{gIp^m*l@TsZ` B!?΍5z:-wWvr2&Oo O۾micS|=%!a]kIKGZk1̷Q93`-eV(q2YѴU7V(J.cV.杠}R!F6Cĭ#qcE,3bzjYǑpN>?nkR!*N<OʬDg/OHAΎU?b}e-1/Cua|d3۳^-gh2bym_]9B!8݋mfh)oҶlO;jXuσe {GH/ҟۨs$߯8NȠo}ɣ DrjA@5 XI 5Cz}Du,L B!*/Z!C.V-1<<ޝWo}1eEojI§?Vduf><߷rLSZE6gwo$=9| ( :-u[u,>zD%ȷ25dݲ[_#zNO !P5ĤB5#;;-sӎݮH㥂d-ypc Qu&XAؘغ9i>G8>B!('Ž;Cç3z˄[/'3'Cήجerx%Ϗev ɯ!sיϸU tzr#nߕS;:qM;t7 _yE܋+z0eDBEt_cVe//T5_fyY= W2ޤ;} -/B/ͪA:P1У*u`Ĭ}#~ I«I7Ưϳ-֠ /_}>y*'9>2Q_od۫M"Xލ\ef^ $?"6l}[0XYPF-ϧ۴m1Ap+:Lݕ9ǘ; j[&&9J`p&/끷hfO~Q 9b^6P==͢qI@_hLS^M͇̂3Ԣ7Vo9\׳5 u0/7=}1 'q6rgT:wz|'>Շ/XXy*OC#8k&3x1 f0eP|3,αS^~N\)57OaRf26 tn.p 8r9;Ò ͋X,FT\b1r%NnB!BT ^S\LbmmC~89RV˩ ɩ/uCol xGۦp>_ukX1;gҧQn/k.e[Nq"ף24e4[b6,iKX3)RMjݙ4Vl (Uh{=Z+>μ2(fM!KV/ ~+ 'Uљ&ܥV !B! Qt4%UЯk|,^(8T#\S[K&)TuD> .څXw9Lj64eB1^,A[F\ 2Zv<\5aᆜjtc WmC3l_xК`LQB!BRP F@Qo@Ӥ^9 ɘCų3 (S[K4n\ E%r-AM#NwOPlswײیLGޢ>f~!T;!0}!B!H$p`J˩ݴ}oP[)fhi^PP6{@&SHy. CF{"-\B!B( +?ş&-tS;%+d]k;]?}֠$>뢓Jf+B: h*i*jAȚ"S<,f=B!5B-!uS~2lgu*kG_;'VosGDkl,'ԝz)|3 g{|c -Cnx5g3:jbQ` z_%S[BTb: ٙYL*& l0vv]!Βxkd&_&+%Sfrujt;WkV x{+qFɫ2wh{;\ /tN28h ]juu!gƍ &P/4F*xȸ'1A{xzXMn&B։9dgmg0wm_6pA- Z R\:*];arx]5)(يՏb,)ĭH.DeinM4k^q"RV >ݝi'Z#a&c7Oq(wwp>v}fՌs[ϰo'k* WPo&KZ|4q[veECQ(qӡƮ3]5OG<3yߏKX3)Ŕݙ4Gol~DЧm]je =e߸`m; 4ЛQDˋ̕*4=-ބAOwjQe!'/>jc Gp@*48}нO[l-3,*8Qp‚ѻ'B37!*DblbE3)i}7Y>%S2]JN(g-ёDҸgȖs1jakk=SvJz +iȉ$Y}{l1a4P=&#%W/BJ֗SË|>9707G @@WŪ;} {GnHO@gΗ߬uߟ۪&Bx\[;b,)DYȣ DrjA@-_7/OjATԒp[;/↱k,*hZѰ|=\F۟x;o}!3p^/Rzni}k[0t_L~e?g.Мʙ$|c<1۽LʯHJm/tYwRl;(T {Nm2wbƗ x%Ϗev ɯ"kf~NO#:Gʘ%؏~ Jhe%{*9`Oy4kݍGhҢ !jl hpo' ܲcZ KZ׎faw iSs['?`W{G=>UF1{nnuh,l8Q~ݿ+X&֤wcPkn#GPkg!gfv cNPV,G}= >5Xb7K;q,lV rm[XǗ=bkkӣIJke3z({8@Mj=hQQ'xjr{(:be0H:\tz篼q7C.Nڡx4X3s~ e_=LqX# er]=>끷hf&jˌ'=1VG|r+.k"d b$_;\ lѿ<+6m@pp"k vC`V2д&@QtX9^(,LtD!ٴiUabѭkiI7[ʒo$05Rr*_[٢=3fq"DZnXNg׿ #(U8y"=Q3|MO=,*c,3bzjYǑpN>?nm1Ϟ̢_'yK^8yq56*UU.)Nnޥ`pgB!Bp)1] %/=Bv׵yyo A7 yf7bXyIEst<,ʘ3(E2_G;p﹒p\iҪ]jB!"TUF,ůȝ%.*׽it? { wUJfh2ݖ0m{c OZ='mhʄ $]9::LsB!Jdq GF'33gp6:`J̩}}l=\k1 P"9^AMU7't:YxC!B! +\VԪߢ}eH~9p9V&̒Cq^)|53}?}CDrtB!B;%{S[AAQӮaHڮ}%./5 h~D.ҍQO9u{9CV"O%`vpg:~  ^]3i#\-偀B!BbI^Ω]n.rijmRsjU,dž!4kHgs9=PDq( pǵVވy7>72|ُLȘ޸ {z!B!* bAX4ޚ!NlibA5YN/嚊H6,x];l~9ルOofo*WݯE?3^!B!Dq$p@n̩mJR:B!B* +ɩ-B!FW S[!B!čdq:!B!]!B!d9Uٯ3Xآ^~MS˄B!]J|n\+B: h*i*jAȚ"ǭpeu$VUՅBq/9:m 2wNe|zN=”=E>1:KˉR,bd1I|3̤:=Gq#'}Į]ί}-*/D%ېɤb2cg@Ү!=,ɼKfeR1e&\i "^ANhc"ߟSseb˽NUW?M`c9)xzXM4l|}\~x8;SNwW$B BuumllHXґV)q`z5lO[1^L\SWeϟ YnyV/h)]LgEV[٢(Yid\wR8"wsYkd77ohWX9aFD_V fT.qg G |ΦIxv"z2f,.BT*ױ*&FMS']=u-0ΎU?b}mlSzWML934 >y% Gt7Y^D6~!w!*3M#+)hRr(PC= 72fL4ɗ]R +Ξ~=ZO| Cm7JBxVo ;S5(ѲrBQeVRmz*hdU-cԬ wz nYݓAHzz"1{6碙Ԕ4b, Gp@SQ> Q):=er|ц<t3dsQNX]p9hSXn*=&#b !Ю"Oi5;bFzisi2~^y0et fV5oR6٠Sg#~qB @Ӆ(LT S[j}I:44(CjBSPrB!D%a&<̃i;_&$o=7=-9sQET$+2زz ɏo]t^&_HJm/td u`EL[[KzOEg{sjk$-) >zʚӹ=Sx.[.)* EWG%1ԩN$GN2 /*}=aI"Be6'g2q~D~ұS]ޢ#O;ZgMҹSgٙ3b%CX Dɽrr7rjȦXbJ̡^cax`>")p]}235uέxIPʹ:~ x&^/K:~&a谙<75.J+l1gyB!Ŀqgc~n (oWYXf7^ [L`O{2bƗ\"kf~NO#:Gʘ%؏~ {X@{!7=6H^-9n=zF|׎?'0ᙁ,XX䘤gH˽x/^e?b<1-|#5GhY͋A6iy2˅z>@Ν!B[e ,=2#>oCy'adu<,d}TOl'r}d+}1:TJ)6bݘr"F0_^o#%ՙͪA:P1У*u`Ĭ}7`Mz7>s q[$p@sjk`E`P ҮEw|: ɄfpYGmroOk~t+-Ù<51jc*Olx n8  er]=C{39xftoie[vM ͙wz?7i2 6&Pvd[cMԲN{bұ^-dV1I^ojYrPM&ⓘ(N^3;А!s0dN1lzZ"Bp6%5]WV !͊`)h]B]LR `SMW$%ԾskqwE͓n\Ü/,:ܨ5Q{C ^mD7[3G@0WL]ŤI|8GtŹEy4O#OdK=~}%|F\O98ҿG؟mehTu*W8yߥV !B! "˩i*I $''[* }[n^%Vi>:V3^)\ox+0]? Ιiۓڢœ}ƘsCo,̔S @LֈF+6qvJ~IEst& ¡_JrwtI.wUB!B$p`b"%ZAnGZ5@3 [vA4"nç/Nv-NϿ=۷Op}\ 2Zv hʕpZP]9#/tik`zO]F@O`|Mx@c6LY8 Chא.r-A/3(ftͭ힜źcXJw\kaxWh!+1!B!*1 *9ksT$VVnlԡ_Apv'gĽFrj+DSd׻o9'7 d3>)">7Kis=D&!Bh\Q^W sjzP7HzY\=M0evMC1gsB!B+ +9o̫]L/}S[!B!$p@$B!BtB!B!D&=BTr0QTqUSqƊOʟ !B!jQ`spzh!B!Ľ&wB"##QUNvm?N>AF\lIci!BW:=7ĉ6n[מZS]0+jX㨚x)y6^}Les1(zJL#^e$PmhC 'Н0՛P;tPSxuU"+➐;p!*99߿v- [oקYl;]^6Sh k ۘFnB AqtWS0<\*L] ǣL)8Հe|4MN\Ige<[R!zN^2Phc%O"]J.?p?s,`^N4چޗ6VfNJBQ¬)xT!M2 0uv+?d!%˂ԘDV8 LJxvp[viƍZ1,0zjABvZ B+ Qu)%;07GsH]{ |7:gf⏽q=C3=j࢚<sP~5ƴB)CW6Ҏ)ZΓ6TWI߯(ڈPбa>VÉ+*utl6wҦWD6>VUHO#bU~Nλ-0XѮm]|Ms/VPbx/Lgxz}jMBQ 87|_XV_Nj yuobƁgE^+  e-ck#+[wQ1I.D%g6~>Sl`( E-I,\U+{;}Y*~3SWX6eܥ= mx*܋~#3:9peE;i$ƚ;&@W14 N]\y;/3@N]J΢EiРfKyf1@4mM%VzU`?(2UwUT3wH(CoAPT+,ײ[vA*bWPWP! -;#!"I$>w99gfub uܘ9kk}vIRXH]+L=+*TH;\+*@}qSө -ۥN \rj-<ߓm_.Ud{m[Yo m>jZ:e0mX 2KҎvݛP$0qe[_z/#8LןevkK`+i>%>jُէ} o~@q=| v&.e}.RV=|T3.CԩSSn[m 4=xvmhK{4:J߭6cΎn/ WǏ:T;oXUÐ̓h?Nq]td( I'N?Xv 8"v).ܐ[b)-RXy?040OH#΋ֈ YF;VNV-ߧf-ZhpKY_h!RIcjD24R}xs>rb:oU!.׸WL\ƭӼq_qJZ34k*uV^ Dq-ZR{-Ϫ_HT?ozRue][Ϸ7R̊E+.-Cն 2 hԮa}~M3&ģmi^y 1 PigZQ^ 'MC YfmڴS嫛󣕴~ΰ<-Y-MUtO-"\ry,HRr<*leia[{GKZ([螁 vq~5զEӪQ5Mm;Tݗ4W.@2{lւ uhmZ|P n>'F,sK lQQlo>Jp ivb;7ҥ1y[UU2s-ٲr!]49Z7%sLGnNgգ{GjzTTu? VÝZZ PS>;|`-2ߵB¢$ےm۲mKmIWmSTklC1#kuA/W.ݥ5Qj`yǫr5ծYgdnΘ"tߕMokWJT[Fw-H!_醸F=OUy=zt TGhZ)O{ߴR|L/=>^mJۢOr%Mq4S|%~@w=VlV`k޾ D S^}[e3=i*11񸏃k޼"##kw\ ZnWW 镝0}£J_vYOzmYYE;"QqqwO=/PFiyY9Ao'b4EO/|s$e}/ӈ VȉϵȞk-?&z皋J3`dg-__+kٟm'79Ҩ&_CotyLxj\U*N>ѱcG_3fKa>DpwV^zji0 iέ*.sԬEےTӋ^׼uO^np6$VzkqCݺo5z$Yzz-7w!Ō֟类-MG97X7-&u H{Q?.Xo|KMW^j'EaapZvjɷ NmJ^x WS;\ tqGk=BzP p [8=lK^ƊQQac}e ac4D=֫D ^А2CIڨ$WwMW涼;jG7e<*e['i6]>)l mj-2nNG]{k4k59Ig֥2~fc4z-ݕR.j a [^gOUGOo*8f.w`_j3(Wmz^. >y}m6K%4dn?ݨ潪g_.F0Wб{vԫ_̛Z^s0]'- 8jJsVcƩ/5w\-<_㇗:%s}Wu~O&hcъ5R%2B~zcFy?:S9=Epwt(Oꢘ&;uۿYdq]x ,&wfɚzauZ=K{曟dh:^7_|Xoy>ِ s}>Y̸ :*]o&e(/#Is=52 6iܟ=@yi۴qK"dlԅjP^P6?Ԧ+ե힑+&^/9[qa%O0i[ߪ{x]{T542ͦGyQj?`f-.j`JIW3nڦj}yO! .,W+۶Mv9wwJm1 SVQ\o(Weu|>X*ѥFoRHvI>PS^,κE꥓Wq’zJQݾF,Hu "D4lI /ěyOz$)=u"Vc%B+P;ҾcOKC#ս Kw Թnu8#`wIp2l;Mp8TS?;5?ζu8߾,qM:HM[Qe_w'ٙ\Q[+y"㔴+egzyp Ða2@E;G^].fvb_FF6ьT\[̸;ey)Oae-2dO|^O4 EE7SX駳Qno%Ѯu+_8[==(BF̶%YSHXd[m[mɶ-ʶ-y qrRttLE+1dv.&~BjoUéb"KEE$:uBu`lSvvܩCأ}*ͨbG5^UT,o>yns=)G#/ yOuEG\om}^B/tM]ӻCդzLS^ߒd]bj*ZUq@u W}5%[z|g߭](,(T1{i?)j>EpwO=TƫϠbLC9v8|U5l{>|ݸQϭjqڹx ]W|}$ڷduX[RS6lYg_YT>[2[KK'lڭ\;Zl>WO-YfRa;-3uM_(Zg;o*Il[yڗ{30l}N2?pn 8,OG97X7OMH1]5u]<5yzlZ%,IZ=a˰%;].\6GK_iMkʵ^I˰*{,Mapu8^g&jO↺-]ypp tezV!lui=: 0Vy=+sysPz*+i6^GM%o"(~&۳^jwhtZc`ycݹ̛&A ,*TYTҷWxUw^vhַiQA $OF%w/wwNG57}jA |0}zes\n;Fp8#`w*:@܋,ѯkP;Ћ/:@k|](78#`wp0;Fp8#`wp0;Fp8#`wp0;Fpp 8iY``*Aypk,ecӡ];I]%Ibc_ @p3iԾ:oRPN8g Xt_* g^Uĩ8#`wwTc!!aKPCW233wnN R&u)g<; sj uڡCiڸq$}zc=ҥ~u:wdqWyyyyr***u)@WTT$Oyy.njeffh߾=~]VPP`רv5Ų,y^ٶRzʲ,_q#;̑ڷjvVa%'ot2Û`@pw{}5t#""ծ]{m߾tj[3 Pnnio9ض-Ӭbqj?@0zI 383W*q*wC_6']6>p~7GWooF и+>̔To]Z%seUm_< zW+J]5;m+4SWF=>^LKtm}LE=qT]s~R3Ҕ7V*ؓ_ޢYD俽^I{zx=w5$T@1UUv_@Iv`QNTX^͞=[SL9a`5w[L*%),\Qc'kIJGza]4T)_3ǯRВ3Mbվ['5y/9:M;[$Y 0e0J1_5H?} -lGEld #Wl:v8wWpuܔ)S42 H-Znugu =aXC' ՜GhEf Iza|Gm=_?i[g\_oތ"ĴI要M.ZoQmrweդ.6"˕7_Q4&?6$>{~껿ݮW eM0C~gMESV/.p~]}"Is$l]v<@Ϊ540cyD<5SI+`Xs^Z[]j}nF[}E th'ܮ;/l4]쬂uRv4iԯΫ8VQhNV8Dp:PU:~d}쩷 Sۗ75]ڜBۜW\'uVz4,峬崷my?_oֵBshjih3թt mҝZ?ڿOQ ҫ5_BrvjKVۥWrIDAT]iO9Zg>Wv;ޑ×__:/:c=q:_~F_M}Pl3lHS}|s][uzzx]rzʆ:_zb{CaKCڛ\oXwDei33jj+;zJs5뿳+ls bU2| +RȌk8őpU4I\>Y㯼USM1RBRζP++Ҿ+o/Eh7jd&L5nU T~g+޳K;{Kջm#EDin ޓ][VNr֝[)&_1ԽM~eț]q?G8ޒV _oR\V%hC*ohK;_mԨ_hudԮwomfhYQ| lH=6V-Mt*8ȯtFQkKem(;_5Rڐ<_[YIKۖ=JU'Z-ʹ/O<\-뒞͇!уԥa~~ݝ]mU綆~J+::O ۮ =uV~YI , ?<_!qj0GtڪUeV8Uqc%IqˋC;3u9r-'^^ٵUY܉-{uP+\ SUFt Mɹ(:믽B[Kizej>ZϕjoԞj>._tؓi#[2ːa7V2ޫƖe:V֫S?NNh8UwUz$s WJ;a5TN+l#'dZMO箬#f:eflSⶢ )qעS d4Ss{v mn+s~OPwcUy?uK4ye<2Mjs#3(vjAڌE҂JݿO[^O驩WUIP%=%;Q&02R)jI߮eڢmoB-Lկ$k_v Sʞ(e_JۗBˮOݿ+93Gf.Rþ3G@?QAn|sծ*"hx\-~1 sZ)4,_i/geko;Pk;sr.7O{<[q:ͯI^h';q̸qb`,+yq}>H=,ƭ2=1mZ'cβʶO'/)$ݾ5t}L=艹1+ Z|2 ݊jSW6FmL[jzuϞҔ1{0}=uOjeFGgnXiwv觻ߥ"EY!+o\o|>te*a:j:i\N8njui)o}3f]#kز#*̬8PlIb>.nKLܬkJIHX^lAYql?[fĸ4 ewKi/nm(9yz]9띷Ա#q^ڼ'_ׂZR7tYVܙ gd޲#{`fep*Iq)mfLQE[a ÐeY2͚eYǝ^4n^"xA??p&)+"""kdg*88g4> @}Cpw&MbYڵWxxDnLmْ>q30Gfoߦjv``Zk?ƌ;@5v)ﱹPMl''p _.2x̸h Z6Sq u9@uץ75j,ǣ*33uZxxwF.GpU.^mf. ݇zP #`wp0;Fp8#`w}]p޽R 5iSj{.Fpj޽{ԥK+=˩sԹs%''Wk׮.]jӦwwrץIEEEr{Jm?X3~~'}v_,˒m۾.z,v;ձFrwԉdNOU c}zȊ`n&gDn4 @-b0֨L;v\w1 \{ki2 u2p;Pjd֥kﻕueuqdΓoz]jZ/*}y-^Iwdʿiu6@Ɵ0Nww375œ[bOɿAoBhE?~Ή `E; liZb{MjFym6]k*8ҭm׫_3ǯRВ$VuRgzӴJvi`˼[x6uΉ*gB>{MYU{3V'ݢ6hmGQUJܕ-W46>x`~x]}S懪y5cNּ_w(ÌQAusԯ6G[6rb2w7 C5%ZGCKSU*XZ-5hO^%UXqBEpjYui)v(.UZ3FGUHC{ޘN=kP-h[Me.w~rb 01~`6]C l+M_ ؼ ?fِr]OgdmNӀ!e+:M[=͖7&|fg+u8qujّ [_ެR*ڮU ]jl{vi~oI TwFӠ'E<Z*D#osPmǫi˻{Z^wچ+QO>oْo&@u{g)[! )#T!.,yԯC5l]7Ni,+:N5=*afH[ .LZ[YIKۖ=JU'Z-e6ɒGwwvZjLvց}:P^v(]լj93CS׸ZOe6iX~;lRz:+uU& aCGNf?c'UxOڶ4NJQTN}5:Uv WJ;a5TTXX{zZy cYqTsZVTQfkG^֧+6hڷ3Q?}Os7+02R)jI߮e"1mnŜ :ЂY>-_Eڹn2-)S0Ge2dٶl+п@iUhB6coѤzⱷ`uRu?>Szj}^eko;Pk;sr.7+J~TyU{rꂻPo?gfiP=4$@'M든fq~OYy4;PC|PG?4GiEjAovaa7ay>xOm^20VG5Rrm5b|=gz:JUӿ{MVz6P-n˖)o}3f]#kزUXVv|r{͚5k׵iuu7 8\B*wuu^rfէ6kϯyǿnV5t*c]YE2u%&ϸ3Nc1cm̘[sjB58X:Gl☱.rNM3J{<_Qeŝjc즩3^䠚jXVN902>b0֨@-TX> YX> 0 YG2>cOo|8EAA*(W@@KTi;X|\F_AhmذN͛)449YJMMQ׮+mDlيcvjץ@-jԨ<֯_L_S焇G{iTi*((І _Ծ}kRxw6Sll3_qFڵ)NfJf 8IhL_nj;f587q87qL4e|;NӴ0N]͌{9U_G\~Cqpg@=,qw"X.5n[eȲ,ٶ-+[2˲J9.%%E]t$ٶ]'1q7m.eʐ![ ,Kiȶlva2]LӔeN!!)4xe^)۶$2dLY%ſL!:o-K.K"Gn[lͶmˁai0]mS$UZT;L,Ka8n?,Ia^I.CQ\mYaJ%* x%m2L![%ٶW.[$OQnl6UFq,ϖdaeZ2 `?`?t5kkM4eY^(.)t˲2d0]2TN!Oivi?@ COԍIENDB`mu-editor-1.0.2+dfsg/docs/po3.png000066400000000000000000002073561341747546300165300ustar00rootroot00000000000000PNG  IHDRguFsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|TיQ IH"DXb qlv5kǹq\%66nA& T*F3s P~><3)3-hhhL4M,ˢsE<>˲0M˲z^wϸ7}p\DVYζ?"FL\-_ʺ_x0~feM$tyuw{__'%$`D÷U:Ƈ嗮,} ֓sZf0tFqQMn|i~*++9z(DFFb/""""""2,RRR???ͨ~?%%%w~ fax饗xwp~***(..fԩx ΪȗeY~~?O?4en:l=zS&:"""""""_Z>~0lϟt*X~??O:^999<6m""""""""\.65\ ':"""""""r.""""""2LӜ<}=[ݭ44_`R^dsnꋈL$v$}Wx2:l9+Pzws\?E|BODD?´ii< o^Uj/""2I§iX]7X]ud;NTi'jJ& }}6D5Mf( Yf)=ѷoHeF81=^}W/[3yq瑯~8f<{zA7@DDDn =[o^?wZ:CNDDDFimi|vE'hΗg-g.de\'hֿcmz;W3sJQExϞ. 4_/[Ҩ.JN*#Ekշe>R8Ft Y """7~~7/ :ηyID<Q4#Õ5KIl!;+>f{q!O:σ_i@ K}?'iИ8<1U<};̈́tA\AXwm'cwӂgBƟ`Y /)]׿{MIADDDDDDD&!"""""""vIH$]DDDDDDdR.""""""2 )`LB4':"""""""2Lt>DDDDDDDd9Nt>DDDDDDDdMp6DDDDDDDd /""""""2 )`LB EDDDDDD&!"""""""vIH$ls|Xc{2w,h4dOx0>9ml,+{V^i)6ȆkpɔV _5cDp:y;GR]ۈJLb:sdԐ[y;78tFm!DE'>g)nI&g"{_zcӿwG]:ɬg;'frEG"""""(vɷ}DbfhOVuUEp'5[K+. NvT\Jw:p\ 9RpOȃk:fTDU,[C`w3Μ1ǽJoGnh Hb*.ϛm-o M$1IdNdDDDDDd >4~'~=ILwcO(ȾtĒHuY& ;^,7?{rhyS7T-fzjNUiN.-0Akϱ+)~jJOZu4->_ e//<_w3גs08xe /J'ﳥ/$fݶ{gs_]Y_Mb` >O7D5]D'Og]1']6q"2Ec?z1r~MEo=|+Iq}M_t1a;oyuD׬TTX'`N\1{==] [.H[)Z:{]x3`x+(.Q̛q?}k)fʎ`}?7 Ʃ w(ٹ)|5wbRRa#4+X2sۦk g=&]egi_CgP}Yo5is%!w ,L".n%5!rWWxq:kr?١~u/3+{=V50ӠswQG`]lᢷC?f4MrCl@-X͌)[(*(*OcI #WD&99]9u|ut9*8UBkζD nn \Clssy‰7s>SCp$%E7hı8>6mIg_sx?~l,W#oI8&C#}LF#0..t@xlrL3xg7R?,y'ipꌗ;t<+v_:$cKwQTV~LOI줼ő?ͬ˯'n]<~{ a![Fg״o>);<Œ N@P0y>aF*Q ϼuvkS]y8bjOHQӧp%(1F./YWr2b1%3iV`dd3ΖBAA ;wR,*h*!(H'!:`} slbQ9,|uTA\B f|u?6m̝= | 7mȸIgm$&L3EDDDD0C,$bs;~,e~oUZyzӊc~f'7tNmY_{s])uױct8D:M&~mIJ S2qmǻI6==qyﰣVZ*9{{*Bp6XM;zm˙ޥمs/;v"R؅HɖMy, ݗۚmP!|VFMk}>ǦeVK/~jZ[i9_Ѣ3XF 8vP#ePWv&oG 6:)qNDDDDZ; `Q=T>nId$1gp\@VD ܲBw 2bI"(۷nf-oFnR84P}Cd{)]@fiSGH-nCJ@yjPt[w}Ʃ .2A@;Od;斄_h8d=YS=̔d8Avmc4#:iiĶӍ[qlb.68c>aWgv 1NY7e|$]9y'b˦Oؼ$L&EIv̾Oٴŵ"h "i#Cd](̢͑ Hv;0Gd,ef LKQ{NtSm#%r>s=g~Z^ g mb,7ua'yx ;4}l34"xMvL?IwZ6i'"""""rհ^V_isydlo}<$^DDDDDDdR.""""""2 )`---9$^DDDDDDdR.""""""2 )`LB EDDDDDD&!"""""""vIH$]DDDDDDdR.""""""2 9&:_eUW6iH]a)g7VKK  DIi9|o?슿'*Y~Ko~]CXs|9 싈4#((xSf}sYcRWB AR^+$f~Yۻ*)vgYX&L o7-|&x&%M5  h4g˯iȺ4.w,;I{alޱ%sxOY1?sMZ:o/""""2.ZZx4x2%i\u { B#`a0y=)Yq\*0Yk#z"]> mvӀAp\3|~˂i (r7;v{޻O ʃٶtm'|Ul kdGTThikhobJPHA+>lS4̸,$Nkkf˲}:JyXɁϊOGpxXc;W><<[0_Ҍ3 c-::fWþP|nb[ذe;ߺZa㶽Yq|{WrߪDDۃ|9C[l"<ɂ96VW[= ܝ '"6/e ~?mU_7)`IO-^7KNMŲ,,M`9ɳ2 d[EeeegC\b`sQRZƲ9uw\FS<:eټm'V,j>ܸ;S޻ZA|txLN%{WUGp͋]t9a ."ekԾ,|'DRdY>A7@랎V>8'|v~+m>QMcgH$qSsYzrr8͔֤ami^~2ןeC dZ+1O5C4i fl4d_yZ{x7X>D{OSgy߿4 zvq6`kۙtEǒJԛ/~sikx yf6[=A5xn~|>OOxQW_5OY?q/{wkx Ss%&8z(dN'휬[tR䉩aSB,Yט\X&8b~~:./;v"''gcy;b=8QhbJkL9:6\D$=-߀GDDDD˲.el ,<+EX{;>5=SlOez[fO+,fmҭ.b~d[+E^gkOp&1l~}oݕ6) IDATeb w6ҍoCLbGoaks*v;ri!,Zn/7o'#Y2>~뗲rq>7%!w ,L".n%5s`k)L@YJ:y8(hzN.QQQ9<} ߧƹZfD\T(ٹ)|5wb*ld>{#c2|ibK~!Rl͔CՀu?\X|bVo'?7~7lUx!Yq w`lye ),,d…w͢ٳo[;,͹XtۢɞETŅSE9QCxA Acu'2{Qq.K9~7$$6ٙĆ8.bgq5qICa”{f&JڑɼiD-,<ɺp%1 EDDD|%i KӺ}ccþꤋ 2 jHY@#S({9G(c]8¾DV=\Y,iO/$E@~~:ǡ%ߴΪ }Zz<2Xu턆7M?>O;~hzڈ) gݼdt]m.oEΚN 'kzF0V=S+g555b_[kvAxvmg8yܼA޴C'_  b=K$<.DcKz7W_Ʀm6~; Xv o)d\>ؼ_pPyy3}07M͘v L.z=sEfm@X0.mIBEo9A&1* w:q\ ~c̻i̛y-d߿pPG.3y,f]bV?U%8 wA9NF7T3Nqq1OH.f3[>x`k8L3gZ}}LvQm$ŋfftcG/<")A{8a T{(HӮyG # 6vxD0MȨX@\pyso0q%%'9{,Fy}79L}rS<6]qVX_m]&|ݔ1ȹ*N&&='ݖN԰$V%/qx ߙu2M">=OiI xI# aYXP9O<;xנky?s[7?9WY`/'~vpZC/~/pJ ;IV#>&01ie600,?A]#ɜμZ8TO>X =y. fm#|!)eY،G8_{l-.WXu{6eIm*=8䁁J"ڲngf1#;m %1!{TV!~RnHi~ q<(Eܼo sOi w'CE#0B _ߍrnkR5%m~NqSjf@jOb&.wd 3faWLrodZTu'csvZs5q0DMN%(ԓꌾpݢ}2-:X Mf]=Oܹ-;q\v?ƪطo-շ. ~!HGM}^>>cƃYb pc53(t^vIH&yS7q[+[v͝ADDMֲ>@ !-8SOT>ȲLkk+5.]YɺsoE86oi$;7( m,X뛟' e}{/0IDkb#6G6꿜 zRx|u'-m]ܻj>/Y͇{V?Gy|^O>߽|Zq mf./t4LjJu"w,\t lG&1o~6_ 3<š=1 #q䶖rfnN:N%.&!qS;_mF0kf29sUWPvx?p:XEDDDt.hnf3f,~F7۠>sVhj䪊10 0l]tw^dGٝTU25o<ͺz?o=aS),gzfo7+i~__yq۸2WVNyE9!㠥ȫZvM<㴴צcS>_yDz$ ?&2?.,^/3`BntFbҦ&⛟ëwxq^_=W7;"yp)X6o:_~Q,$**jA8vl^n<~zþ릫 oMN˅f> v< gP0A.#ي]ᰙ>`vl;~O 9'"""es(W}mns4mKMGG6Ahhبq5=uwv]9߈ {6 l@tfaaaO&(7jأ0҃R6Opw꫾5 zLjk#xO|A~*|g=OkoOϛ%3)/?!?ς"""F\i.:CL6}x>kcu!=z-nw;݃v/p-?~պ|؂1}n0[<*kat[p"90<'55 1kyq{ڜO}s8SSs_I"L<轼λ,*[X{GsS~C[/WCWDDDD) ޘv41l:Z/t^:.`91M}66]]=UuF2L G|g G3z wоvu t=_&mRɞLZZq8̮]W_f|O=Ɇ #wS_^W[&zDDDDDnZch:_?qE~MOZ/돫 VV֕R{ZZ9Sʳ״ig^S_Tnw'ATWWg}F~~>;v`Μ9?fÆ /裏o>~a8 8DgHPP.K5i妫.<Oou88" w:1ӗ,gzN{=x7o ,`<|G]cǎrJ:::HLL v b&q8tu=/p\XDGG_2)};_kgg_W%""""""*ڡ Es.""""""2(LB EDDDDDD&!"""""""vIH$]DDDDDDdR.""""""2 )`y 4775nuTDdp'(8tL8$&MN9$^DDDDDDdR.""""""2 9&:"""""aYjjil)&&)S0 cs&"r}(`¹ZՁ)I+GMEDDD0ؓ#"5>ZkRVUOsG^ӎ+(d2In=PƩGï<~FIĹ1'j9Q§s4(>XBSx f&˲ג/ XC`:QІc<_֍pٯo7{yG -+?cI^Hb&vIϹq96E=g[=?G%&:ǀU#\݅х?EHXt]b 9cnl>fC\t}ԍ حVU0c<҂oM=&+ Jd ӫ[۝8Aj!VeaFM~ADDDdP7a\Vd#5񵯝3=BFPX )Y٤E0pdJ]́='h HfZP-Cyv|Biluˬ(]OiI9u-tFh3qӯLӣ\㶂Z}i#rfO'޳>Og t\l QɹʊVp|_gS{;FLJӢ||g^ Ppt݌{h,y>ԛ.b~EFZ~Ȳܿ-._ ݻKi5b[Q@ W'!y&G,ߣ9YzÕut!8wSv܊5$D]xn%:8[Tȑf̰dScqtRr%Mt3h ب llϜajF&ӦDt`pCHR:Y!tןΟ)/LRRJu9g}ghp?$L!Ο)%PЉ=2)ZhpտRWlEFJ! sL{JL 褡(yP|Q r9;E^n& Ԝ:By_2C:_ seF]0i6o&G)&0197Y~زqaҳ_=M[yϺZ鰜DZG]i_DDd\YmÜ2qDdA*!*iso;I:OX}Wd29y$ڱ.VS;sqvv s'vɈ:6BRHll9gr9.xp%"ӼBG >uRG25+a}kB]"$6!]|z.Lo-np&0?+5ʗ Lϼ{oLnDd0AϠFn@{b4̑H.Lo+U45aE|6m|~.dt2;wk%)]5{y5z\;GZ~ }GN7c1'2\4OĩZ[1DԊpᲺinlL Mbc^^Wj|\]pçm6wĹ"`:[hkm͟JȸU:LҔ,ZQU]Cms%Gz0!.lDpE\G(A %MFd|%:@wGݘx)tu[4I'0)=74@@"cji8ǘB @ael }et^n|DG_]SWl"f>4bhz+'zkL] U 4w1sV+>rm= 6\rαkvl 9 >>Z@Px⭵zVПx!`=@ȡ‘@.r"$- ;3g;31*$N`bˁ={*(%'DF~}"lv?{!vb#pz\j|=ilq̚rʱb:(?aDZLt ( d8|O. oo )->8(Yƞ\j">odGJ2#8M* , iy;#7q9d~C*qD:8:T_|-OaGI /=O|PN^.<ý)̥ŧ=|-gBh\ 8=jV63'@G_bAV\<u~coyFP?BmWa{W^%4>nívW}>l#cH躄HL|$r,x!)!`O?Gsn2 Ȋo@4SlI܏o(*%@Xl$(qQOwV{r97<|Nsa#m) (Cd& ؓz"Z(I]2/6o~}ٰf5.47,D2EŽ@QXv`a= ya@SáDDyڒBV|B`k*E}3[䲷FPxAyTb߯^?HȸA l=M~~;ű[?#zjO#Oy;KؗO۹ßp_UVv$4 b_U"xLýn,ǑhyvY~s-acys+%O9v ^IFL~`2ݳV: "vdej'o/}1?}(ƢE6PZZJ^:0$rG[ KϤnc'"y1)--kW_5#ӓ&kg>o}JF TgU!)D_O2{Td3K$n%Ϯce炾G~Z0K6¢89L&\ Q/9tt'Ňqb_wuqD(iKcο18οXɠyJs OGht%Fdo!#`/8[?KDDBgGtnPe󌙄V=eo`1uI٤$붰U GTnJҘspJ#7m j'8rg|&,~u5UO?8u齤r\XJ2.?~/vfSTm%8:QSfRR Z6Nb́$Y+|z-;Re $:%4^oΊbQCaW6N"2cD-6w իZ_.{Ts]z&*EN!Jإm X} HJJ]:LDD~:8ct:?yII( _o|I3 '9_% ~`'82tly[b',V7Ө )ͳmpsSɎOXNܸi `',dgy7$bXN&c,=ndVLΌ;-fu{X«l,"r(%;}+#u,?ϻ9 ;ӌl=_§|luQ4R|Muc-%6↌<%ȣ t,Wc/Gt#{q&y.|"IUX9PcZ S:39[obÐWGĀqL8zM6'&XUW\qh 8 n`o9snKc:&eɘ̭(3t> GUŴ-߻;c.bڮ4)bc@Woz1Q.""""QF7k`'|TpG^x`äCIO7 53''ɳCT8O9W|?70bGtm`N'RYZJi%>9&VwIڧX*)41\/VF#.%"""""¤jJ[qDz&G?4cMlS6md.f&IEƉ7tbMZWt=3x= `зn?mr#jn/"cQS,j&}[q: 2iV _9#͙IJ:r&ߴ;㤴z ~QXgcG`=w/Y5MDv7OfyN9aZ_D}8HA'ݕrh-4Llx-e| 8kJ9L|t3tw"""""'8'#h/@,f.[?|glĄ֜@K7w9 =9UF ~>xdY5|Ũ1"v~aƏaBBz+Q˞[™|V?$&μyJ{GN|21i|,5r@mTm喘LL;߬b+Q]ޜ3w<[5kv^a9n0])"""""BĄ 8M>v /Xm֤ZM_pgO`f̉d>@k/1v6?˪ņ }in~u ]_'bs/f0> ji#tL [EO.k؜uc5J[e/5Kg{LC "6j9HDD/Ht5cѢE-f!""""=919毾jr#G'Q1zFa+嵝n<3"?DڏEDDDD'sAxѫ$r&M,cG|/ %X"`b?"%"""""ҳ8qZ=(۳}x=\OK'`w\]DDDDDz^x%cۺ\;D͕֮b>W^̛ʤA,O~6P."=51}joI~CrV/gŏ_ """""'P."=_] foG 0סr?@jذp7""""&]."jeP`&G{eRZZl>ve{9ߔ;ooèh+7#œ}SIFl=XGw'1ϭ!AU];QI-eߞY3hp44sXs~H{lUG=LB<$l V]r vDYnI)J|r0Գh=y fDE""""j("h|rbj,9WLd$k/59NH>uEDDDQDQ@œؠd'PX^@!6F;\,w7=F53Ĥb77H3[,V >XkjI;daԐ@xxz0`@#,5lu`԰1ˆA$XVý8XuWvY& 02lIO50oxeZ<)i/"n0{Y֔}K \`5).d48IVGCq?'Orw_Vqn%ArELrўԃA= T/OnFD)aVr\65l lZĖGi ֺZ芵z/Ģ{nՈT7E{`wmq-V7{-44FtS4""OSE[X&w#&yu8b8=V/O OU-ծK&** /OO<="&:4:."]Ø {5PfZ䍭,{wd]^Z2s`cjJȎd"`i70!6&CJEKX И F jRZ\kh򎬫fy~S3^Hh(M w#!5"""""""=vH HpﹺӦ,ii9W9 H]DDDDDDR."""""")a達@JEDDDDDDz %"⾚LA~W\4"/;2ޞ׭\B޾Bf_^tܙ˪?eceMU8fu`EDDDDP."n*cS}}cϑ7ީ4zt.sJUWvXu<YNr+}7 gJ=~9ٜa8_DDDD1Mx yxj>Tw:f1?r?اr/.%*1M^!r2-v?.bs'74?`w+ZŊfu ]0+Yy 3χ?wpKs^ҧen61֕f >z˳3'XK Ǯw"""""MP."n{yy۟|]eOIw|»;`:Ɂ6|"GslJPdsYwSqݥL7#نKQӸhJ16|f Ӎuhk`rB>~LLebEpK3I cʴ"""""MLi A⺿MႭ投s:.y\艳 K3&f&{3ivqOF?8+nawv%lY߫g٣ cy?PNŒ HRm(z}#b"ӆz*)^Wmid f`Oy%7M6&3cT%k}UWab>rLf`,3cd9*[ jוonJ=UEDDDDZz9900 tV:+H\y GƛQc+/W᳭Ge\`,½3pbVaXZZ#yi^`>"-J@˫+>"&#]do%Kф|k/-e9=k~czYoPY˼a*yx&aO?J""\<=jIt-cѢEflllw!"d6^DuRD""]K7ioUNDDDD:ff@JEDDDDDDz %"""""""=vH H]DDDDDDR."""""")a達@JEDDDDDDz %"""""""=vH Hԭ {'088̞s1W^ܐ c6uA μ7Y]d {|-EΎ biцpCP|pwێߤ+;ny{ɨ8~(߯%۸l,s\H3ָy,_K+7{չY~3nn_50ч%S2w4e@bR~qBZ z]8kW˙=LXgpsgtw=j<;a<#?̇(89rL ;rt,&߳h(8א<>ܾZݟj1;M2+w%U&pd}cϑ7ީ+u =şl!= ر\뛘dk]La3L{1tBnӞ+E\+OX&\ܝaEl'U+:;u-9| .˾^{)1bs-4#@}_y_$҇~p|:oIiOѫV}N2E_nbWN̹֨t?5O^z5og~+掩'L$9~x\rC>e/>YGSMͻc}8izKnG[FZUUgbW^Si!VW5>ճҿ<؟\}Q"_Onjr/0_'~͉}݉Y\tln!m_xjD4!-ovfFkTM%x;_{ݦ(x& h6ք! }}v8bAV?&qADutn?oz[?r~-ͤ勵I:s>Y0@>9Z6q9`8Iaxx7y<)l8*B3$?~ȏmrYwSqݥL7#yr!yYEpH2%;\m0f^{ ƔiF첼七U72cH4!x?57~7Md))"yڙ 6r8,\6κ &'W]4T֬/޾4|3'N$88)SO7'&f"ulvuyRN IDAT w%wrfˮk@_ G_pB dB~|}3UKDDDDtvk$X ,x6+ n>W lΣw_-\skʩ&vnanoGU&6i**=nT08*qS!""""==a?s.^6|&qË3vrgJ-{ zh߹W1zfZrOe5:cj};&Xmmv8OW;s[&F0Y']k>b;\qx>\u?l$ #<ajf|^ޙ$JW+ ]Dž6,Iky~9Du##~P_M1:;~&e~́ę$F(9&f̅x"4.r1eZKTAZΪZ6gmKzj+lobk/kxb{I\ {ٵc쐾iZgZO˸niWY&*Z[@47"%_>%fRw޾>G?s/o/o(wM"""""g' o:K@[,erUfl`ݷeb;u{ʨ)dKoKV|q7Uvq076UMhOYn LZ%{]q4l8s2S^EiIES[ #tf,^eKA 2mMԟeldMfƨJ<seò|̬X7Mtwk0 w靶׷2*+s~pO^j:9ؿ3^}<5L"\v^/6._ɷ=2~k|e%M˝y|[,!u,fC$8qf.)m|)mrMV#ݏc,u Ĭ뇓A줙 z;!a,'s[w? 3n(]KP ǦӺ,-Ubk'S~ KY~ w&-I/Oʋ_/=̆bNvL9昐|D5Y;lngGIV4EDDDDXhq)^[ms? [w/""C[xyzIt}]~p<;icEDDDD䇥g_.""""""#]DDDDDDR."""""")a達@JEDDDDDDz %"""""""=vH H]DDDDDDR."""""")a達@]ײ yuxO4ο'ww$=3 nnVJײͷR;=Gy%Oo}6~rHE 7C~11V~e[qψչ~i3'{%Ci* >g53m~IHxtYMA~s̕ fWQ8`0d:48D,gpsgt_@]#ԓ躄 g]άe3c^ևy%UXb'>Dυ 3%ֆY{n{ x?v IMaϳtk7 IalZ˿K~Y=&&՞ʣWdĮ Q#sӯϷ5WO/cGO%[Hϫ+v,&f$,i_;Xh kCD2}PÌgFyg*Rk8~r \2FݞʣW8rץJY,/z7ĈaŷpӌDl. =~9ٜa8nl_zLa9f;]=t-ByM㱿pJ*X +E\+٭~}/O~Ezg0˙YF[Zo6z7o1%'Nk~\Z|EDDDD:NNDH'S G̾2ì_x D0E,}^Fnɻc]Y[*+c»xjg">;w2}C 0Hp!۳yh/z/*nZ>̼A|a.ò䥵-O23n|y_oc Rl8Jfhn0:Һׇ|cmO 4{p}Gr}O?OrW(~=4"mKiz>}>ggOO2>]-n|US}̉6V^]wׁ4lR6>vBX綌̌ʓ bVFei ޷Ӻ̲<ר~L<è= Zޟm{W6gu.;7uhk`rB>~LLebܽMYwSqݥL7#i9`8Iaxx7y<)lngOIpp"SoN9M|Ko!yYEpH2%;\g0 ^̸rbC 33:#ww$3gtmDi ؔơ:q $(n"SG5xLI!<dÁƅ*umo?uq6D9 .bpZ֦j}ڮn?o}!Ckm[g^DDDDu Ї_ufm˹ɞ߿ puGr,ITvaR3fPV]CuC8 \jxrԽ[d Oپ89597 YOAVj{ю3v(&4 l^t|cņrz$ǒȬ뫓cF2i,2"u=ɓh?@`"Iͩ!ov3k(عIxw:!}/""""=JLh%06~/6̕wZb_&-xMT+4M͜3lxLogbgx9_{Ǭ}1bi<>~n:=$""""Byw<1?Y|=/kld7S֘xb؝9Ϙv5^163;(U[ɜVM_eF_& q}G1f^"1UۭmK[mVΟ ~5:/o6[q+=&a7&3cT%k}UWab>rLf`xsUTPlΦFD -`U|S\(7 v`3QSɺ`kC3z\nٮ8);^x-5ػ5r =Y4ث(o:$t5^ә1m\fÙ*JK*]c{GwcC_XԖq4vԕes!#y3YjKa۫ңwr;Ë`_ qioz[ronc͓,әgṵ8R?ʓk^+EDDDǮL7z1b\#x:>t10xnzBHp& O!:™~8<Ϣ[_ޛA̺~8)cs7{uxFLȈw ķOcޢFAnĤľl1w-VXe0(Jn  4֮14~(7i h ƻ-;l\bG+Ҿ8/yVn=a²Y}/s#ݏ+%"r5jMiW?f߆S4όI8FP]U=ݑ̜I9%p`Ss ?q6D9 .bpZ֦YbƕJxaS,\6κ &'W]4T֬/فuȏċqeOܷX8NtŬ || vg9f^"11Iēެߒ;^k^v탸X<;.R." '>8 oPEE_l\j,! q\y!8{l5?iWQuߖ}ݬbɯSW{Ygu6s' {]{SԙOuΰUɚg_bcnUlX51K9ċ{sl<7o!$i8Fvv/ \_D<)øLO4~n~żzߵ5e`Q95v ށa&%9oh‹I?P@̠( $.~~*?YGqf:YE;KGRl$ā.\ W YMa^˩qxJlrlec)5vGߑXM{9{WVE=E$'1 'wZ'/Sۆ.ͬa{Z!#>o/lHďb7O}Q15v,޽MOe wrKhACmT]D~4~KIQ$~ʺDDDz. ~:Q%6S{+kBI4^^ f$c{:ƈA{5Q,a%86-ɮO@ y Ō ijcyG|6#`"O7s3۫7(z woeOm)椺㦀SgSg"dp 6(HA5##v.=|9ddaK0?Maَtv˞.P.ZiWL3ZNV^h+7w7s^fnՈ31I˴~w)R# !D=dee`d{ !n,+++puuEY:$рٸ3 rW-̧P㈯cwΎQPJ ;X37]]JCn g-hha_n B?*NRhѪ**7eĕF?4NK~^գi~veTIQl[4c |^_\S !DRUtRRR`R&>ϩJgbC9Nf9Pf?5?ÇӰ jFx=6VY:[ÆTBA$sK޳I4ŵ/JM)D z^QB^&=/u$==OOO ^Bd`0P\\̰apww'==a JRH7Ttxr4LB2đ'8WU k48W8*hP -1P\\UOFLb .[Rq-q@S/(=j9LJjUo[p>-BC ePo&m城'ȀTL^f.2~MB^Ojj*cƌ!5* :7|SiiL }L8,Ξ̡7Yaܘ6M.^^KVΈQcw.`[I>K-nIǣ7is+NcGX3q7('3,El ĩ&R*7gSp{Sl\tuĮ٬19;gwgtVUBeѢEBZZZQQQY:!Oƍk]֞=/go3l uBFjezH !DϧiӦC!,iӦY: !DHn1BQ VVrB`0,B$aB: !Ŀ=Q!$B!B!DT {6wp ͑ ~\`35k7 F?e:v~=[j.1K9b60׭B!uvg"B9@\8`?SOw8ưH87qkp#/?7ldY%7r3aI{B!fP {dA99A.zMgL>KvmqYu@5(1!õ3.fB72癅ʰ=~!Bq%5ޑYPP0z-6~A(fHhHU}OƿML`j 6,[ΦgzҲ8_Hγ; CǍ:z_2reKpG]9br~< C 'eG!ΥUV/YIRycdA[-Oxq^hދe)o̿`M5c+>m|I-t?#C&RI_;VxV=b} ??:3Y$s}V0.e3dЦ]P9fc|'1iEظbDfϹpU }q4B.W,ڽn;㯬"W>޺o_Ux9!oj̐#lk*p6ӄ_S/.S37c{'WՅmxl{K"! V~>ҍo!wp`*6ǹU6qS(:vSNm77&O4|e-tw2u\6?· _[yOig9u#&bg!{~C)ˉZͲe:2;`TR)@FLv6bфZe` 2yeX8{>Oñ:]}$f'dլ\vemyg9V+BФP %U!e(\)/ *Cqs6{UK܍,\ǞMp?C\Ncq t5}atF3WD>:a\:y'Z՜;ƍm65Ɲ:n0=`Hϱz?FgS*]j]mrI;Ms˭m(k ++;zt!ԐHBz8Nq#hun+[WXc+]N| ]]Yd8^Z+=(K f":);=>3w|G>' ݂=hK~4f6KAѴut84nND3 W5U}ݖRc^zy_G۔gks^9e\gŕc/̀O{7>oNҭϭ<>e*YYY<äiV F&{q 8޸ \PѮk/Gb HW94:FL驤a|xy*Lac,R<ԁcsIƠ%Qی!>oJf ;S.]e5Q]Ƥ@TJXM"OT^ s9m~v$i;lW)uԶgl&6;SKogW4Aդȫ MH_EƒӈwK+_5:WP?+!1?#H&& ?6ϝϗG9Nt{SFDV yԞwraORdG<7pbC`w^<>{=^nkS k;/P,f+<x߼ 7Sb)ukC3Ǹ;J뷢7 'hYZ:EpGn]ǘ~w| ݎ#F(>׿`V؊뮤Ok&.Y—I16i85_>*CS,60$0 !M/ӵ"edQlZM4%]wH\7hZGRBҦye)6:l3qL7,]]5Ä *(UI(8QEUULU5YϜ[(3}VLM@^l폦Q_:V8٣G?)c 6ZT>2nX4>"Z˓øL_T>浌OFѯcl_Iөb]pvɋo?_ PL1-[G}<5Q>O#yxnũI̯7Vճ1&p_*+E1WaYSYpP%@F5a熟y1\ܪ\yL>'U-]3'=̈́mn|٦DIxk(Py:׉5riA7N#j%;jINg6"8 VsՋ}.)&:^9ROԱRv=h_N6rv} OT>2ngr*ߎCqlO7sc.U6խv뫼vyz ~v?7{OaUP̀s yk/G#*&[`_wu® DfO[|ɺKװe^r{>?T}xwŅ0GE2zƷlXg)f=w. 0C.2_vY}@OQ2w\s(;i8/Fi-{y{z޻x{y`[xW2}N!D&s\EJDͿOX5#?ũmD˭+wt*?&:>C>bwhVסrAR gӲ/8<;õ(=ǏKV39dv^fcZa:SR,q9d^ȭT[ţ7ؗ^AǹPȠ;lˢ0 V}́3X~X%!w?L N&}r^~۝VD|F~>|̍ѯM:Ñ =} C̱="s:5NrWA۫'\\2!;Oo8'.}_-s5UsuW. %IUWXUwsץ< 8f|KIE/.x+8zc֩NFNeOIZSS8oҼK~pkәHGП9IBKrJǛWŚM.S7i mKWRJf|<&#LW[.^Zj9VtN-FgSOӭBT5FR# Z]q#ZoGi.[DžS^Űz;i5h][V֡oM}|[sލjkyŎɓGGʎ\*Ͽt}sƻ0fΨίt.%O}Gƃp zĮh&ye/<D@V\xmZd;@|5 01' nt'Oˊlp*[)sm3b\sŶ :W+;"4ّFtA =/-:q5W0XԬDvo [Ń!(eγgT5UsZsZ>!-DL|ws6G`*RhRU4w2?x5_qMKDֶ3t(@Ezj7 U*5j]mlu͆bZR?):jv .L3gsx<;wwU!D}6>5~ {k]Yz=%z+PLi[=ʲ.5.gJPt ɤvt.>ΡϣUS~pM]}y *Kׄ'.Ӕ3,0'ǾJ籥odm5?\#G3g+3iÏ4h}'F3PlkMTgť-Ez[$pRՙl,]7 gU(VW=}PI1v-*ih8|Ijmi*T9g9-xWclEZRBj$l= JJ* M]{t ݜ04ݤzޝiOr6>'~˖X8B!Ʌ785'\߷+beǹ<9MnoWѐcL^Wle/Kñs#vD wn芒x⤀/^7e }Vc,Fo eUn[m~`xD$hox)u+|T⫠ksբo[A?tLO-[ȼm0aZ<_@{dv~#Tv\*+[G|;cѷ:ߜi%8Khf{F{wO>,qqN!$7S66tCpRٺimuHƦě .?:R+/ ACgT;'֜q's;Z:JU"mv%|W |1ieJsFLƱ?oh)Jxz>y|O}I6ftJm}m}g}ʝ:ֶ_^0fǖӥQpOմofyM~w;dC-=a\|^̽OO[ؾg~ ӝ=Q;@ǥҲW|g'UڂBh՞OᅰyMFօP-ZWf+4<Sf}Oof8p* vx˘ao* tSx._oC9&ĉ- NsϜh1?شN,[΢Eu9{ξjo߀Z- d5Uu .abUXiG&9&UW(Ǝj^΢e ! $B!j߿[-hBѩ?n9A#ɾ-UB@I.Ba&u&Z2~@Zv-,[!h$aB!Dݰeo1z+[!h/!B!]!B!h$aB!B! I؅B!BHv!B!UFK B!n !D),,tB!" 楞YYǰ7fLM'n2n fWB!&$ &`MaÊ jǦM]XB!' &%;ۺU>n(5,{ȄzjjK 7Y%^qxA]owe˜|x sW /\pB!MBv!6V|KIy:o. }JV>=yxL8Z-B!np !ص1]ްSLe7%Ʀ! w!::0_C<Q !B\.tͽ?>g.WUogs3jc<3kvgQv:!B!jOaBܼOsyB't]B!MNF؅B!BHv!B!]!B!h$aB!B! I؅Rs|L:Un gs5s&3➑|#vTa'޾!gڶǐB7}^i B\O$aBр8q92;|_2m[עR6V5/o$ޢ !znB!03kږ+RMJ ;z|-+WǪ⹏zY0"!BԄ$Bl_NU3^O^XͱЌss,)w$#Lahs{@9g/g4hBx3{09 0mǷi *yʨ΂Qh]Iw)'v sL'b]𵮠)G+<;|wfĸ5>+f (2_r?ܱy &,WPe1>KLJ6yIҮU:spIMQxǭW8ZM#_Zaz~t cKq>[h-T'yX8Cx7S^!eI. JP!̼;@WHf.ZMȧs*64'=صU..oOd?;hR|۾pUgCw IDAT1|j?{o0WuG_X6SslNбQ2wf-Dp,L)e?'xq-A+03a$a`hה&l[2KWNqVTG.Ԃh>\s=jx|6?%=q;ˉTUUsJ/7ñqBz&B iiA=VBsC"g/MsVڇa4jĭ}#O'깿@#Nx綾m;~uWV)7;ˆGbwք3;Vzm|Cǝw .M3nb_jbGhM#n5JYՏ:\uj{#'tJ-[A:/[>܊+nj*8 a^AlB!+2. JNOHBA!%41VcONV6?{3`kC b7&%G u3԰ eiu:l 5b m鴵MԗaQ[xt6awJ#f=TB!ĵ# B4@=nj㹇pw8ʂk0p}6[ 6vݘz&=\x]^sH((9|[8VMCYz&5/L|XתKB!M !DyAyM}=pcm@M'líVVXQL뮬l_ ĜX/?)޾GOB z[ЬqVM-2`';?đ2!P !$aB 3 /W6{EAiU-^ Vױ;>ɸ|c M\޼\Ν݉B+؛Ҳu? Ï3>|bwHVף+!M&:)}~2ѫ>gSVeJAˉ|.dV:uqV}WD8AZ~ 4Φ`Vag\j&%*c>Zy)6.+ΨB!L7BN/~?ȉdl۴]-כMo/3]Xߊ.0a >]go=vn܍MDzΰ5ʬ5c~˻,~~<:կ# :5á0ؽ; Mĭygz`[ǥ7$_WFX?V`}!C _sk9t='YOqx&DN0fkXՙ`CܹүקUV^rمc7u !DCp}k4)?,dp9N.'^ZUcbht8:;]h4t4m}rjv\{1ci/KGQ+r{l>ϲB!nf$?o:IaOJ֯bŻrj ]!<9z'ذl9!SI>] |uԬbt5q=}#,S1qS< ٳ>X^@dPlG5P|l/ M?HP_܀}{8Б)u>|ɯIc[ضd8v d0مpyx.Wl+D/łĮL=F-Ξvp/hSF.܉c^&8!.ض`a ң8)s8gVȈCOffZ*1Ǽq2ŶQYB!$⺥f .Εd +}N닧) 6aؒq;0_&oCڰ@|-^У ˿&!$Ԧ*)=̕_LŞ]!bc[gI2Ww xNg Høڗ;q(?87P%Ƴxbˁu ˘iηKV=m!sѱM>;BN6Zzd]Ɲ:n0=X.( n/N)#7:qi066r5⼆f4P)bGh; q#m܊l!M1~]B!_y`o.iנ)5ܔJƇ5̼&w?{{;}qq1B% ~iù?f_q=ݚ_P:;yM.5_^ٽZ~!C{͟;ΑYiDl7[8&r"5|'ph׃vD@jl3Oq+Ӗ~k t PIbNA0 B[|;eRAܳiS?D-9bs`﫮f"9?? З7M@qS:/SUUڅ 9z$BaA똆AO06e^:gF1y9uNkyÏ 6ZNxI8[b.~7sg{%}iwN))L8URޕ RiRM;i1! ͣhAXWRM#lS}L?U*="{tfel6n5hHd|[7՘NBrF[[t (ѯY c!)OREhy _M-􁃤Ž -xՏX_u`HyUϋպ*z[ݵTE)_Y8oHFG˖;! BX$fmO#絬ߴM'Sȷq7=6W ݧa2>3wr58jtŮh&ye/<D@^W; >wa|vln2-UiGsZ_%Q-l9ԑN-0BvDto[i>#ӌJ~P{GW_<}tpoPٽ/L#[okPNP '͘qG,zsߒ&DX5⭩oo=m\ D6J+Ya())ʊYC!,IYho8)5[^aذ/@GLjo1113ō]SC07#FwkOQCU u {ξzacmo@B@F؅cfHH%YB\VJCC!nf_mIq2%34Q!B%#B3-AvyOY:qm!I.1M(/(^i(B!M@ !B! !B4 2%^!e !uBѧ;CBWHH؞U_tp86s`X/?fa|ubR#ݫXmj[k/7^ꤲxc& U+DUI.2I؅⺠-~L(͉4a礣m3[lL^+• 9ͭUwH+N}_-뱭iKɅB6aTHo4J!ג$Bq=GS}c?\-Lr5^- GB@+WڞbqZmV[J p #$U2vq B$aBjlmu`#8/D@BFZ.~;Y*(VtP "Hgb Zz؍zk7\}ppwi?mI7n x;5/2h !BT$Bq=0"X/٦S+lےɂ| 0uOshl/"|Zz[=8JGS>ے z2 ;$TWWs }kbjWBImz6zyZ#=,Η3pq'YI_f*I3 59zBԻ_5fԽùokB uBJd&}A/ 歾WDlJ.|v?Gg*JjJrMM$!Igߓq9J-!@ (hO F=FN%Iӛ)bZMf="~)DuP/%Hϙk+1n*^:[\VoATe7b8#SrBX|BJVj6@tpю2T}1pӢ$pqNDxH^[YmT52|s֙G~4op8/ v;-B=WqZIs Y{ÇI.!aBJZ|gA #;;`fk Z7}|o~u +a* gK.n0 ϴ/ hϥ-2Ѱ]i_L`DB!jCF؅7/Ϛğ`o*nT#)9&<5XWb獸p>pNI@M$S|]iq,C5()/߀V_a )EBTUmG‡K@{ !Lv!(݁H+QKPp#Ƶ9hoZ:v,>LQ)3P@ƹkETT#i!$=k]h &5l[ɹ"N qY 5! +=AFFՅ B\b8pGDcjb$|[~JS+F\y76*I ټ1D8u~<6${{49NEC;Yby>?_ k7ߴBgyoYVўvٓh)⚐q!I.)N!zG|1q<5$5+?ƌ]obڕ_*D܁Ɨ_5DvQ'bsCR:?Ͽcy,-zc>.i_ƗGNx$߶Tn sYz⚐]!eB+X1f//pAޟ=mYBC>l%{,u-%&\۷a},):K%֭BXVf$ znw}h₝s =>J?]=챲ëmkK|]S t_ ^ jꗕ|v(5c2̟BjHߋ0&%Qی!$ e3)p&W[.ʙIa\$tf##B!.]!ʣ(\y7EQP̙я2!?2Ps fj I."I؅Z@| ?p.a*KNs {t-Awx(PQo $ Bv!MT\@~~zL=ǏKV39dv^fc憽;lˢ0 ~jf!njj0B!,KF؅79'LcԚRte'{GW_<}tp:fwYc|HHD 5B!.]qR<Xyt}-)'ǾJS˫( I.2I؅‚.'FXi-!h((' BXPcG+Rs |7aY:ZiE=.S*VCv[[;K!75I؅‚FDvϳ*B41%e咘@m<!U' BXP;?+f-0LS햰uoZ~yܯ~مm#l\!0Ov!_+"|Xq@!D!aB!B! I؅B!BHv!B!]!B!h$aB!B! I؅B!BHv!B! ! ;;d -uoo_\\\}rr()1sd7kk+=t(B!! BQDzHHHe˖yX:΅ ;>*33t{#!tHAADwƮ ]뺫n_cAĂK@! RH/3s $|/Z{=y9;KRHX/P^I(,<۷I\8Zl U2C9r>oZgECH?۟[ZII&cziM薡ö^/,~Umczl9i:~!IW^ZUTTrwwKBݛ>CիvA`7OM^ӼysƬiE-yy-v4NM-XR9Ve/jgW6Rjkk]JT[[+77*++Z/}}5 s8YM[mZQ26s-`}y@p8deKiv.׭} 8+w_Շ+v*K]{n(Ԛ7׼-Ghy(RILӢegz]͵,,fC6[> zL,k¯Դ}tǻzs} =zV$Z{?Qr3X7=8M<Z={|yNLԡUkrT~fڃջZk2U= J=&ޯL*wI>ov)W1]i}wkD:=%`m{kf'3//񙺫&p+*[՛*%ߡ#5t>s{s:>;\E`V{5LǟuvE&|~?M;)ԒB IDATgyhS[v5u()=ub];]c47Y/]w'+*IEZ*MFLUW\sY7jGSl%9JáZ9{^{}yM􃯤L-L?YC+h+_kߧ( >Ezş:ziDGg($B{ʿX(kW:$C2*VWJ;6i_zyGz,hZmd(=%*>E[g§H^kViUjgtR{-}~ix y*jz`L={־R%2F: U{]*mG؁QS?rej\]l~}k+;(XiyZ*3|'\\SE߿D_O+e.֞ͻUh5mٯJ^{_;;<<<8r6:mN~\lYnTS%{z$†Ҥ|-zSm/XWjI 6*wTTS_P"~h hGҿ{S7[t]Ssَb9ZS^q^Tm;O:W?}4[O!zuף37{<~~ gU]=V9zĔx༱iuz/o~LyZW4_EHM+im9T}~cز4j_Η?J=wQWx3>#K?T)fŌ?SW*"шS7e yB0VmyZ?zi >pf|'Rw?ߌ qǖ;-uY~yhV"b a 7O'P>F/8}WݧN:zRkOxֲwR[嫘4ejQ_K6e׽7VR.4}mnz6!w ט?}U2%>V9?\sв3A:́v5 6C1_2&sSIzdBbL%~;0[|:ACjkj_&)TefiOBjZ8o_zݬ<3BQ5/>ǔYәB;R(V#4Xb{ڹǦKmҢgqn!n!4Θ#s~@C D j׬%7 R˷ZOu4RQ䝳_lVu>'`%&wQِR-ڞ~;+&_}k7*QwljL>D &_T|ba3`:o,:m #Θ9fxǸKn[o: \`>V ɻ F~R[rTTQJ[x]#Opgg逥&Ş `Vonלc/y2be*UVb]Gn*Э=>үgO/Kҭ/{ M!L!,Օ~oX?}bnC%JA>)}LF5Y9D7Ti>=1tRbڙZ!>'=;U+tYǣ_,8NM!36l}{]G@#sU,;Kӏu;TU.-V|D<-2֡֏ޟa e)#~RۦXڝs)񆥫ƌ҆ϾPjem;?/O C|4}z{MIg3%psuY1_Gko~hł`G<(C\kud1㩺Ѡ󠾜RmUmݨ݇@]ֿB_}[+\ik|g)wyWP^j]Lhǁ0䩺{r}g ?imCSBF+O8S8Z=EiCOˌ\[GttYzG4+Z}.t !^31C +:h/ fG0 '9Qѿ?=[=kW|'IEdz^Vե5zjHu2n PdQ7ŗ+{\i̙FLL6-%%E~ˀذat2ڼ])[GKt̝w~_V^޾wUQg}lpp8} h;a0{9pB_+;:k@{E`pᆳ+w@q<c&|Fgi} hF UfhVF_9iTաڲrj,< gQWvZơяݯ}~cέ dad2960Z.; S^:W$BƥQ5o=UoVs$꼖*yxx86J^fRUU,+3 [~7ktUox/&uvE&|~?M[ I)~JvTӀk [+_.)++UV~^^ڽ;E;gTR @Y=z)[ۚxMq`9Ox>;r5`z=mSrO7ӀK fӶmuag+9BCÚݷKn[TSS{k_VvΝ8@#.`fw_}lN >?<\<'MJ2TKRmN=JUԆ] 5G՝=;*cng \LTT]w4z&\X< M/MOV$G|yw~5gX_RѺ5ʬڥu2;eSD압/~n#CmUu WCU>\~+O?nC*E//k4I^AطNӊUYs? euOrک}v&szv/|E_$]h $y MӶ?W|o@[V Ss6Qrx'+̙3gmZJJn6g.aܷԽ*~Zyy{ܭVEDŞ0%Ĕxh%sЎO> ;. " ;. " ;.Q}[ Vԁy)0M tzdz/8tskU+I2dVpL/24y~E>bpגmtM]4tD]'S O&CY_=[>;nO~,I Xuyf^VAW+ȫ2K+-UUdaQJ55(\_~JIVVHvg4gMn{TwQZv%AݮFڼ#T+^qXŷ[ch QU~Jd#_?-#{ 7hY$eTkڡuOG>*7_oUOW7NWu\Re|Hֻ`5_ߤ*lMU֛hs@?/}~L7)pjia;ɚ-;wj~JG#oԣCkϖ5Zj6]wW"#KnJ%&CVjm^A-Mװ+;"E Ir<C*w8t6KU\bH 7%0p&{Fm!Sdve/5> mA4eK5@S5bw;z{:m6dL&I>)&YVIE_tN#XҕZ؎]>>VT-{zv@K:eWk6UV0&߈Hڟ[uږ[{+ GD+K^&qHG9)7:Zfm٬yGG+PqCQ|'N!M<l6Kf3Nʝ_irD˧h/ޣS)I"V6(`8qhҫϾOWl֝)ڶqZHK6LW_ i-uvW2o^Rma}ϔ-?)5gҳ+oJ}SV \ma֘r;?T^6iژVellJJy:mIٮT^m?u%+M2вy:xHeږ^Ⱦuvj3i)IOAjͦ RWKmGÿ+|HE7Jaa|;; h UkV"*Zu|Ru5I&%|enӖC'iͷh\L&_y`T^ȞUMvW eݗ[vjo~A JɽR}{vkνʯ0C@:=v/}}.:hbBեOw%iH~?WoT+nA1kOyUuRHx#m&jnh9vi̙FLLZZZ"b]#;. " ;. " 7I*,,tv7I rvYc @{”x\D`pAv\PӁ8]4Wy,HdO j!>irp;z'Ѿm{Q=J)==hg\s,U>_ՙqM-Xm){*MMc;tQKKU*.TFїg^yaS~8o]^EnGh&w~<p59ZpNey)P]}mqd{6}85}%W KTDo嬮gh|P3;񙺫={|yNLԡUkrT~fڃջe:T͸K/gtU^{b:4w>'qT!rrhE!;DyX+_^k7f?k÷迏?ŒT_|QpWmo&S{;iOs;+_+qmu'׿ǐ_O?ՇOUfϧq!Yn2dۑm3 ZN//8]tԺV_,r}9PQbک.jIL4b xW2uqm4eg.Oyy*;l\(۳3e鬞/wQ&eg~e)loCvlЖVH;>}Id҈>Nfa0wSz{h3K!Lj0\&%Ca涟V1gVs3[uT mYWݧ+ҟj,\([eK׮hmRH1$(NJl|%vK3Ohho|, 5ӽCT<*Mqz菷*̗\ 쎚 #d(WsrՔgk[[H]9<@њ4R_O+e.V]*˶f3iCJ+)WQa͜I!}`U:G֭)ӈ՘.'}Z_v{X7ϫ0 IDAT4e}EpUtޤ!Iw?g*2kw涟mˬ45cJE$_nb3:yV[+Cgת< pL3g4bbbY_mѸ=񁧿5:4=]ݏ_IwMlx+iiiuv*0QrX&oy{}<0{**t}zcrw\MlvW_FQ]hi]֦T{c=U~q vVTVQ|uҗBS@W*c_FHr8scGh@B֮a ,+WB|ٗ"\Vdڪ>vz[%{ޮZ.Є{O8-':yE'm@JCھxv(Fe򑏛<m]7e}jou){W#O[oUsf_t[\z.Ca7{7+a$]Wf:k)0ˑ^yQ=z^M^`,}Zl-VVvuz5F?$ X}M\َmWݐ!%ڴp{k[G)`dA9ZT[Q;5Q}G}E^_LnLeins|_!,Vt\]G{J UgSWBLQ½vzx៩E|#ZKW%7^nGQ/?^>$S+X7+5}0_dwA!>{S|5KKu/G*$RyXnpXg& Bq*t0K_M=\]zwBUao<_,4Zt|zKdtL&*P>gՍjnFw֜/h} haQMk/%ɫ&;xH ^Kzͣ#,OnmcTUZ YT$h$Q[37/T<$8u NiC9eTCK gEzkCJz${}7G.kiէ_(-1*FLpk簻5XٴVy+koNʫjesH>FzdJQg=J%=9AɃGQ=T; aQBnwO^+6/[S[)C2+E2n4rӛZczNr6bԗ3^ T`'QÒ4$a;WY4d`ouhzmzNJ0}%3u?N|%|ԩSRm;PAѲJrT9B#HiWAѱgfSF2~L k2,LI*Z/7P==: ڮOlR3~g2d jWhٖ=Z(]7/OR=)N$H]aV^3eZQors{7M6I=p4n2 Gӣr7jzk)+^z]{po]o۽6***SqPJUAvDM7Kœ/ҾOj뒕еMǯD]M٪%ୁi%LkzUuWjTTLVEh"# jѹ1C7+ǶR˾tV[nVqt/ќ52y*&1\܏(TaU, K)wWbvS{(:>Fn[cP-\^W\/c-TpLwMq=%vtzaG&$]wq.~$$}h֯_gQ!{M&\Mt, 0넊E.$Zk٘,`8a+m#Tp&hmvV@`6;@+ ZUpL&drv%8ΒjkkdZ]F^.97I*,,tvmTppRee )66=7I rvmVPPk8vO=zTXXx p7"8fgNF`pAv\D`pAv\D`pAv\D`pAv\@^5)[V8ܜ]압P] xxz*8$\~g~;qee%Vll:t8pWZZI|.vh )..VJ]긹)66N999gعڸjvgzv,6Fs8r82 ٥͙ @;p]\DaJ<.vhaooa1 ε?avv};Gs_hb©QF7io?SrЊ:SJ7_ǫ-SE` #WӫPld9+E@ h]$beISíu|CoSz@`vvG^vWtEkTew6 ÐaOݡ _ˬ(M}=;6a8y;{LMWi@VKkw%krvwZ~PTy&~q}bMa+eiEJ cGwUiU Q4唙0@FF(wJmLSe/Ln$UekKvoM5R@ꎿZ*ٕ*5+44ҡ2PtKY~R]8@ӊQ>jD[R4&:JF,ziW*R?)0diIy7]Q]5 Se ;_t$0$! ҄G˯&C_߉K/M;rbmNNOseڴpָwPP>-s} 8^^yFI~J#}&uu\BxMo #{s`xhLMoQ!JLLT붗Ҧ(S8N_L涟t UK^M(IѺT^vzx+X=njQK6!IrWdbgEtwpW%w[\?!oE$RPuQ; iݾp 4I^nr嵐ɡ:G="Ty{WxyRy4g=F+NKU_zըJ򋊑ךtPDI4017dUY%ɣ}U`zK߹E*6RUPX& ӒLnZ?Ʃw.L}9}}(i"cn:*Z3Diy{wřyYUQFKq\i|n=mLو݈}66:Nw><{4\c0K*$D鬪}!KR 5D(B'g2S֕rFyOu;LX{sx+Ÿ4?QY {6vkx2 XdGo5}7vI3 Dĺ1Iӣ0~v9uSX$|~׮];xgOn=wQ2L6Ae:v_'=>rayض5(1^'r_ A7|~ADDDDDDR333~ADDDDDD45+^DDDDDN G @ G A F aXnζ;>p a\NXxĀj]DDDDD{..Cř2<9ҩK֨\B`fhwsSTt FPy<ILL͐Adj]DDDDDDdQ.""""""2i>dvGٺwEDDDDDD AJEDDDDDD %"""""""Ca4.""""""2)a """""w-11@{nȠ]DDDDDDdR.""""""2)a AJEDDDDDD %"""""""CǭV%?;kK93~{[c.G'U{g9Sc~hM|&15j9S''c,dCq7]|M/ y֛=;c .g8>8 ;4̢zJ6Om5`ݚΟze\xeӸW!vU}|y&aN''ٟXDJ,,&'ʱҶ"""""aÙ ,3^1[6a+b[Tn5yg^,$iT?nmfoCw3%V񟟸ק 鴨z3rx홌2q4﨏Ǧc;p)Nu0+E7&jběغO?7ޜKzϏrwI3~Qm#/EXߍⵉ`հwafNQUl/KQ^A`>uOǰ^ϛrMi؁'N ''6wq`'""""%4qGETda&EdTT\x1mzW7Oឹ#Mx2oLK<_;Ky]"y9nlInz+jFu/BM8qok|?>G ?;aH߾6?,H\\2zK;vj2BbC1 w|;'ɳ eAag+7ǎ#}Ƿ3lK4q<2qSH ̲67̝3֝&=^F$!k2 fryn_&bLJk<{0rV"3|r,@9v~g .pm w Be?[VHo=53[}Y09sl/_R22O1qPođp{"z*AnO؛(YxY"rc(۾տ2vѻ_Eك2]cn.lZϞ1{93W3.3bpJ?=']_KH-3Ję&fz?YV6ӑpj_thby[i;ˮeD]֙lO),Zqmgٸr HgOy4?n̑W(=>X~{ӭw8OV3@-gKq.Y`ğæwˈfS y#JȺ{Ra>QsՆ$cx8:'LbӪZ$0H%>܄ {콞GuGn83(rQ{ix, w dOPbL(W))=uho '<#,vp냇t1i<&hΟϹ'BF31g }7Eܲbɷ_!۝ߘIn Re Nr=N'ΰѼOS{˶m kΚn4\!zQ_J|J|ĵnݶ 83V^|ƪti`Yt!6NoDES}9Eŋe|r#rCש AFN޺݈LgdRhWcѹh'e߱Gy򑎙}S꾹 wyؘ.6QE;pG hN7 q%[ꩩo L\9\>qXJ.5ւS@q^o@Ru/8CvQІqLUUb {z">CuHRʴ=$!qrh6Jۼna="J5.kR>y xxql]%Y3gvo9x ]7;io35'"""")sYr~->;"ȞKNܱnILJO-yt 3YxޝwzL 't x3Xd,^NpF|ba$>O齯0d۵BwQЂCi3z!ng߱$.e/n ,޺-+@$# ydzHU' Z˷8O/O /=9nQ{#G` ~koT6lT4XBzz ZxO>S~ϿțI 4VpڛDȨ~^.LI.ܝ cSl;Q}ShH 6lKFF4FW"""""?NME`1\aZG޽烓y$]`N&Ƞvo1WEDDDD7奷0p(Ybb^5mgU&U~-ʹD i*=D2gju+ z/s%y:sen2@Vm {j'i%3"""""g|G`."oٰTyi ,gfx"""""Cb ۶1HiJ]DDDDDDdrIJ,ea6``0x}{6˲tӵ… 3M鮴)˲0L۲01LIJ:)4ZA οM $bA Ķ-;mL67~X8t:麳mzi~l?Nz۠äc7aeYqK?:]4L+K7LatѶ,0L-0 A¶8.l0ƶ8Nl t:sQF>:0 Z~~qM p&0 tbYA l ӁAqN 4pt}m4J]IENDB`mu-editor-1.0.2+dfsg/docs/po4.png000066400000000000000000001727501341747546300165300ustar00rootroot00000000000000PNG  IHDRsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|Uܖ{!B*^+6b]m];Pz5RCKHHBͽ# )$$zp9癹y9c噦iv 7>iMۇ\vm,ٳffK$!̝cN|bs/ƪϏb~c^rb}a/?l OfMӤ={PXXHee%'dݹ;9(^6-ۂ(ze;/XZ2 :^?-r񝜗`=uWw{<;`[=j@bn7k55EifVF{u,`|K! t}RDDDDڙmֵ: 0000c_DDDDDD3dӦM<i\.6mĆ ۯ]DDDDDDD:aX,, ?rHMMeÆ t ى_Lrr1ci`,$''ӭ[7;9TWuu53f˞={JEDDDDDD__NRYYIaa!eee8EDDDDDݎ7xxq]Z*++X,α4Mrrr/&11ݮEDDDDS7-[ ,,LO;b;ժz.4IOO'**/U? ȱns{Gvv6JԩS\Ύ㘐CTT]tTWW+ac*NJDD9991ŢgJ2e UUUe&UUU\|dggSYY!3,j >|zƽלN''OC9fѳgCDDDDD%$$PZZa3N'vtCۑZہ.|}(i9,w?羸mee<<6;PxΝ̝2˯}\Q1N̫dKf0"8(k{ kgLfV6Yr̫  js&`S.""R}?u{("$"檙g۳d{fn;yjiilzMn.qTT4cJQq1/YلFnnsBQqq]#K;W _}L ⿘[wս+""]Ę4p ?oY?|^y?d!<,믽/̞^~m>w̺M/5=^DD, 8Qߪ|!R f2kj5'b> f{_?;x))||x3 z?n!Achi -}9Brz!xs<7#B#DDޝ_c֝wcu)[52v&::k??^~m>wg\.""9$>~aO^w5N9s> B惗_#&NRD5|saBfMfيtM(^˲MclH}'Oo c9gb?x,̵]EI&_6,6S."rxߏpwmfyauv"#yч;;ƿA!%"""FiSx|BV|?gsrv7% @gFg]vOdkY|{n* ?oJeDfLo3y@d=(ˤm%~pE?wx'wȈy1"#;9:/""1_^>*~K>K ݳܿsFX;y.&y *p! #d aerVCĊؒ8&Ÿ(t}FƿѠ>K>9{]y&qw๧ >.Դ4{EDDڝ;yJqkgoKu`7C/j86@EDDDDDS"iw<̉qy_YɸYC6cFpC?tlIrB7j#DRd,V,.5tˇn@tqA,,йϟ~/tNvz\ӱrɳD0:\#Ëa=bascSHwxm3MLӍl~RÛ-!a٤g##!sFK$v6'%0/+YB6Q`&~K+iZPƪ-bkA%ng w=6y(`'""""""ǹ]y=Èq fOSq} ?5-x}Y$Uثoh_3>~&O4Oh07Hp1L:0iEDDDDDD:7۲0̙cvv,Gİ;ڽ{AJJ 7|S;*]AQQYY)++PDDDDDooo"#ogϡwgƌG` .jדץ劊HgA EDDDD{IN^tks.8JEZ'+k7"$$C9BBB0`7nPމEVeeejaVppeeqOIHL04  4x1JE]DDDDgJڻ%"""""""]9L<]v-ODDDDD^6ΎVRR!t%%%3ۉ 008vv""""""]vi鲔w33.W6Wa?>t WN NDDDDDD%fW$ٱHWSYI8~?EO@ȷNf8k/;xU#odqDfK^}?o# ތ&n͹GX|+غ=ryhF_:;`oy骝[0q:7~4v0KVsI;Pӷ_ Up[y^_K'Pst3r*?{{LS~'}|_z{' """""N-NLh+H/G{ i,*mLe{PdzMp;=<$/Ʒ&y|?XP=fʛ\NԪgxxA.pӣo_Fih 2^x'׾ö9%]9ܷ͝ɠqaLj\(෵s[\{,=|pD_<.@c~ռ"""""G3e]5ˮEgnw#SX7Po6oƎOu:{j5=jaƍ8Õ{D&2`gww|kOw'ޑùxv.[E 8|B#m$7[R`o ߦ(M)fb֛ڸV ?F.:7=O'¤ymQ]1of>o.~S\9/~Ac[=K0{yo}&EvK{)sup%k<8&=\sWMev}ոcRoN7 n*\`ok `P^lCù}x`0 l܊X]9J)i*,udMX;A >r3B|65on}yK)ܸ\`&a`׈o`5QK p]==yu[uoXGZ3%֘8wii\&N /'>R@yVO)@DDDDn7)((hǟ|֏8FM如HjgX1 2rY҆G]?_[>v ۃTϟǛG-09 ֪YDEEj>cΜ9oCF`ðPӤgP(^9Dp7uvV^Ygt<]ߨ/WNh׺DDDDD/?zٳлw(((ߟv-ϓsgs |$cO/4~mADDDDDDX6˪&Uo;#vc'lvH ' 4.N4 &].v)icBiݾ{%M<ڜ@nw=g1 m8ބ_ϖeYF2uOē㥱DDDDDDadO>m80nO-vrhڏ|P@u6K~zqso}ϫfgWm1q6QWnw}~Ƙb`Zj3,ۨ)-#C;&u-e˻Ak| /eWBw<8؞q-E}Nrk;gxIݬ ;c,5e5ho{1fH8ϭJIa"$1f{rsCa1P+9u-_=1k~wNK g3ނ-xRIy m,Wh" '¿]:wE}.!ݩj_VF'P """"ۭv֕aPs;&[:{vX,qZpx@4Q^KHKdtC͹sI`XDSl6l~Ls IF&Uf.&?/!!wo>FjMvK Fݍf'vw\k]$7{yrUr=p\"g]-8a.YFF 4L"6^heYd5(Ps9.b]Mr: DppHg#""""rݛoJLLӸ\V?ͬuE]y8̤ݍU[jӽ~5#Q}tc5k0]M BI21=ޘ_9K ~_1+ھ1Ua׿1sb-`ex">j!%1BINҫc{8AQ@76n@YYig#""""rx{ӭT7z|k횛 nQ+-w)iޱ :1BlX63׽q-ŘK&b,]b$2G2,VT 1K݇o|Xn?")ݵ,?wT"""""ǫ7\: Xs͖֔6%UE3 a嬠8Ʈ,4bma?ƜK˜f3Dy=netF#Y{36 CBc˾rcKk 뇏wWVV[p9+بYF}^@"""""""u]\fm7{o}ꤽJY6dvJoҖ.Z[n7FiQ]7b<ȱM{RV30x^u,ۧ,9nrlTWWKX^Ib70e70jŢEDDDDDkj'U]h IDATUUn[M<<ץOߧH+Ǖcǧ(,,TNl m. ??v hǮZQGٕtjb::s0#Rt,}"ms,Ws$84v"""""""]9uwjt$%"i+ZEDDDDDD(Zڏ]-PLGұ\""]"(i9J\ތdLsY 1DDDDD᤽̝lߕM~iN/CbHQY]YJIXfN{M>eUxt"]61QGdp=ᡭ̢_y49Ki5 >T}xg=ۇ6̏cJ& vȻ]}oF2=Xvg< >!z5O|se׭ծwx(0Vzƹox%n*_|ʷ 5=/:fge+|Q#0SYĞu|chˤh|΍=4ώ »}[B\} R7z1Eav:d0y:ТiTt-&{Wx4?svezy.~&'c}5a$ \{x(νd:Sƻ<+s9: aos#+ ;3|bOR:͑K"2 pZCwP6N7Un F-79gHm@X$=FP6&/7}oіV}{KM:Mp[=D|tc&BvanlXbbqVjk,AyVj-]-8b:mutL=]q]7W^ +}λ;/OP`*KnA÷b_}TXx-a#Fzӷ[(HّuG 'Z槩S%kKًmX`]|,a*d늭XV"nyߔQAuaD̼mFQ3?.,4r sfm55m R#cG#cu sON ^~!M|F.ЁL KX&0 0?l쑈Oa *e(|w,:\XH%0 ^yD;3Y˼&2J3i3Ϥn_4˶ dN b2 n6<[__e=SosI;tϮY.}'w-.$.R&z4_gp ~MY8wL=7*'n`yfn},z{>,K!—^ø kU#]BHbLjf[ϲן*pKcبFffI :_MFi\D5lC}o;s W`1k$#.2SÖɢYv~"JYso ZY z.`eݿxcrWMɝ7THM ៾5^.."ǵoA oedP-ML`kmsoǘ|s#v>4w|{7|''sǃwז>fcy|e;σk~zo_빆R{{ii3xԙXJUy1yjxJP_iB.v̴bVh%^{_N^%ͻ?"sؚ.`f?;f?\ϰ"V mc1׬xzJ¯NOi[ða/cޫ\u\㋏W?=/?P'){ jwt rz^~7e:aɼs9e!-?: gN֬.urm)E'nd8+@O/Ew0zk:9`rw ^M>a?9oNĊ19eXF$Rkm4f)k&SÈS[e N83u'in һ+vi7M&nfcn,<}PDž18S⒒S扗AZ|C?[:>l~6՞fwq|ƙC%,[E(m |axh-oaҟq&2JjZtR󫱅aĐDzA2KIOCUK*$' `ьQUX5?=؟A1vm߸ ݝ;̊37J',H?`/qq݈ j˝-VbϾ7\}Ɇ|~DLB7v7qcGӧ:=&Nd`j fQ~8ww|kOw'ޑùxv.[EvK /NȨH3xgj~V3g>]Y_Ʉx3qLNw_s5s?ν~z7SNLx٢1t͍;0 ?<<|rX5iaMNLtP¬-dm=g8!Q=IYI!Ab9\爱 K' ' ;su;w _pp՗1?^~qWҽ5ֳ/3{}.- z$u'ہwX/oM, W\ÙIb[—+}81?^!$ M}⩙֋^ÆH& ‘t&Hq7v]GSmmɕ{BDxazszWguP=b}\9?^C8nXC𗫹^[RwۘTW`>z_#N;~; ͙lCY:k.cqz2*MFٷc%yowqᇴCKW'{CDp=,Ŭ^uQ^Z4[eL^vEϥf{."oqp c87jq\ly\v\Z3ɟ)mù;w)[˙W_ʘPBb3AYe:$cYV@~EM]q[I;qۋ v&3?UR\BB[-wQZLw]*. x_Ui)Uܱw U&xuVάG&0uB>|Cpߘm?Z--+J a,̤x/]uw{O6{*US]WY;f nhu_qWO +#]^\ЫA7z,ޕɁ+c߽] ,82,ņrrUa{$U%xDFeb4p.n;vE5=,#eY=Y'pސx|wx4\V˾m; k<M=<v;y8WS]ySsے3PߛIuk&eeWEwN693xj1ITe?^;7ä7w{5OĂc.e|Avc__y"~,d#Xq ネLkk9b1"JP2֖^`cm<6Aq{."7tb ?.ӲJ䈃.V\˵; K<5q\|#:7jON,ۑCƞJXվt j[STŊ߸hح؂ڈ "̓Fxeu8v|D܌we !>x暷kg<`;/`$T;8p0HnP>pQ߭{kNs753s]yOn> K{qm͵xgbww]M&^F9_1lnѽ'ݭ+غl &Ǒn7<&19L'i~W0}9ª0M]yW,^[1>8bmYMudN%Ay7PGn]D:@bG$o,05n1%^+ϵΟl|]YZȆp)؎'U㎋jgͳb,+~x(w/Sȯ6kc3(ǨOfgSz|v? Jߠ |{̀_nܮvnEuY9N$:Һɕggt(޶Od@J~~ +][kL;شmGLv64j;A|.V: ʊ*$42ҽlߴ[ٱ%WP^Il 'Q\\Qݟk;W5|kL+ib%zv8MSM;[\y`-_Zx5l271fcud ":x_0M}V+6p0}hmK&77w*:{Z1 LjFʖTgҖjQMn-9u72?lxo][)lku~\y?pqBBRS2)ow郎 vEӘkYǐ{c>YsW2^κe(1;=mTo\ߺ0MwY[&^vj4 >"w|<<~cyйQێ3M/Wkϵ,1DؖZ}бe5r'i#w)d}aqRV\Li ov [,AlĪ_K&/=R×#Y]uU*lf# $礰|e aX(G?>t6do`B=J o }A{m ؋Vxs\N Ս0{ ;V|:98V֓8;4.`u5]\%潙} mM1N{4FEYߙ̦FI3}:IwMcX`!~ocØ@ sNx9;/dH`צd/}o!?,t⎑OG%TCM.3uʉO;]E<{a#9%ios?>d"n0!^?O,q,W&^ m,[c.f%ç-&0ǮmYLzs 07u󅌈R-D h>jCn-_rЀix=O+by,yZ1=#.$3}Y \8;8o_䲃igC6fO<lew$1JJEf[)}/i|(XUv D?g#p0zImOdg];m|w-{|$ArFabĮVvqBYqնx/\xɩwE[׬ Ŝ׫f۞:ƘFAs <8;/^ݏo?~% zVwRǬ#dvE{:۲TUUuHnX**qVUm`" \r˭M"[i=T/z޶w~qOUDnNNp0}/g,ʯ>` 9V7NtL¤Yz ^rGk{ IDAT _ gã?${B $!tATXPt- -}ׂ.ꮫ]k $!fC >ɣ=̽{=sM{m&~c!$# .&BR?-/w,𥻏zFwsBc=9=~wX80-%޶2!СT?oo''s;큄EgBt=UXF5Ӯ8C 61 Kb~;;6c g\xX LG'UŲLZ!z2221czWq0imj:OڷzJRRzzmJzN,X?^GZ_I^6<6O%`gnASd˦˱8?St2uqZw'n9mEsu3imje?~xy?IMǺ+"7X>q;;ɯ'ҝ[ w՝ohsy <}Xnb:Nqw=rVOp<rJQ.rO*/ިv_BFDDDDDDP.<,۫MDs{tx@1Lq;}짤]4ӝ[ES.ҁMLݎt2%"+v3d:]KDWd?ڶQOnnb:L0ߧ߆ȉ;"_qJ0 \{|Mɨӝ[1'\h_q_U.% o8~;*Ziu~08wlUM} }C56G-Wf{ KH(& R٘WF˛4FKRs)nOoB~p}t2SÒ+XYЍ1o9ך^4RXZKW)}zSeTzߟ{E9ar[hwORْŗ^tr;q}ž^n}6|?6c`)lJ=AIܸ 2W`}.Đ6d}ΚX]U4KX 8?, \zqk߾ivZw'VZd?A唱`KݝhW܅?6',x51IfoY f-[WPkAOYƯ}V3|6Mp\E[(vs`dbo9Tgmxulլ\5ֱlmA9mv"` Kx[Z zԀZrnwkŌ}<`g"9 pa:7utɴ4@NOOw oFoIއn9ٽ9Ig_l*gWA~BB2&?cɰCr]Dzz6ӊ#H7puՋ^a,߲2"9W8֭q`Cq+p00ƻs7!Ȯ{h.o{2Y NHGF6؛{gm=hKg'2+&{Y@=g%n˂_d<~xڽ !!!0ftP[r)ՁorL 4VUh_1h|c/&lIR~ OΜ3^u6k,'+!?gǎa6d7ކICK+f np ""V /")ޑɖL7`^ƥHm` s0BpV`,ԝ aKi}X Go?u6i޴79m݈o!]5c=˸h=MR~P39ы#"oc҃Y2d`0F%yN g/&_UkؔSEdgるnӟ-CjW{#92ƞ%y碈GTJ:Q)3>YRYeO >$cSC=tv={{}u^¾3SIG\.-*  H JV3 )Au~k R@}IHtO~ ˀjn6n$h1=rǧ3$.Y2LpQ9wL("""{j/<{;AK`ZLj`} a ܷ改b~i? XiQHY~!R1YV@qGT(!N|"ʋKhuwX+828!ӏcr*R~gUŪub1^{7ovnvދm,]s*j{ gI-Ͼ*G4UQY;%嘄zcsԒ_ڄi8s~֏-+cn9w,,a:DDD1kX8{e@B6S]^Aukpo%xSSbxb`ӪJ+'}bN밧o!D/j+0jzAĀ~xG+,ًc)')Aiv&ȸ:yӛS%~#P$d4`U6T-{6?=_VGHxZNbm>xNibii(&ZM^5!3LJN玅_s(""r&;K)+̴BRJ*$ h9xgv4@3k(B8zdžaK'^}rnaNɜ5n}#m@(&a]-yX/za7s(lUP׾`U][w58]Օ[lv՗n;<ŗ'qkoQsC 6zڮ}+\>8&_}|pLĘ8;8ؾ.bk$GhOU&g'mYCI7&y9Mi̳m= eyܳQ6\ŎMA8S0,盿B0?:\Ϸ,VvBݓ\t:j<%pv|#_gDDD }M̓Swt@P~=ʜyy<]eeԘhW{h=,m)/i#et'OoeX QZ3mwȵ4+Y++tZ} ,w )%b}YCӎB2acc7>aUNSCvF@q5ige]bb6UpM('ȃ C(\LZ2碸*^8w/OfQ%Fꤺщ強={cX3YS͟>ݻ?d)}7.Cwkx0h5<;l+YX؟26(8ßލSxZ\]ᅏGCU̮utcB~4aRup!PHCk8 N%3?K.GP{p;GÒu;g˖͌@=IJLł7r|8w!W]~1Kf[ibb$vU,b)%0'Sa\|^҄OPxԆym &) ADDն%J``=ly% [w_\pξw4=c?pƌ)<,loy|t Ne`Dw랡4~m:5\ f<|K~BP` ^s.w^+nMd,'4OG'tnF|y?S>#h}fRn)))m!'IQ>pQO_' K#pۑa#ҳwz CFDsE. .#ienRYYocȈ(܆?E,l8 EDDܛo7_yu5ԓ(pQ\$,+m$a \y,~G5@J1ĹinRy-yH#Nr/b^ƝO3Y;,=˺oҡ=Wk3--Xmv<=v,V b`۱{yQSۈAS6|+{)i=uK,.s.Gz#} ~З#ǵ3[ vz]9-l)eDr_sR +4;^xFϐHڽ+n= bٲmzeݍB^IKKjH}^ǶZ'Uu|뤥2 ks-LOؖY-U7r0>gJ_,(eaf~_?&%#CDDTgbHjW pqȼi46,c:Y7ϛe^:%~L IDATD2g7RoA޹-woIi A|q=x@ﷇ7gśj:m:ظP[K}OybSI*eaqݰLYq%o8VG=ۖhs&!V(ƪ樎|.dWvntVn)JPk&sG#et82Hna C:)F[xqasɐgg"Zʙ܆o3///|H{d1͵5Թ\/ݗO|$aIEs+-~ V`Md0OGY}|rЪϭ.tN333ٲeK?8GL4&'xX;ș-쨳-Ċ-NM8MleqRDDMX4&]yUwsctѬPώ WW_ǎbVn&99̂l&|d>$ϽW Χ>oi\cݳ\pۤolOb':Ĵ'rbF^x[wc5`ohp6BSATHW繺b#(?`iX RZzT4$ ڼ~yV& c|fWI}m+l<䏌IUe#׍q6>t/gN1G_Vj&<06YVJui{/y.#pq7- it?#[;w-W͏ SgpYvQ6-!0$" k8=h]WK }Ise[|ġ\5?O7 쉥֣'ݛÆl'QtiҊ#`x`GGm3 )jW8jתi+*G϶||i cppͰ0$ɺG>vRljlX28.[G~ڡX ON4q6+`fTr0cih?x4v 6\6.|VޕEu 'KVƴ{&#ʝZl5,q lv҇Fpq@# sx1._=0,4_UHIm>^-\q;1pࠃ &3zKY9Ik8f#+9_Sp]4ξ%$gxb2Ofr~;%Cp۰k#6m4wǰrc+?7}(3aC\Ǿ'@6n&;yfN%&_I)wy '8[((?&--C6(i?{8̘~ EuWWѶ;Np4"""""r(%>}jCNqdG-"""""r(iSQT77]DDDDDDM)iqSz] 27ּy]%)%"""""""nJI:II{gO|ׁ˛J[EDDDDDD$%^t|ۋ-uoL/""""""r7{|H_9[H/{5wxq*)*.t(++E`@qHNNDDDDDD;"'^ox"3>sյ߻IK[ٵ䚛7]~3fa>*?~S\y$r-WVzU~(5`枛ʕӮdp8Vf7s?a=IfCRzgB~z>ߏqD|.gp"NPpG]]]xn0vX<7 {ܴƈnm{ønva? =!Yb߹Swwrz0єxk/qƞ,~<&/iy񱿳X*bs-/gƬrEI1$ae,~_$J# `%2mIa>lt=G>;w g}ʏ'u"((o|CLX߇uX70"bI:r*ͳ?b u>ZVgW!"""""ⶺ`@۝K[cBz'qyXH֤v\fyt%ִ:q?v<Sj9ڶ-+y)Aq5~v|E,<OOOuƠAlXPkk׮9z //6b]?@3я>pyV}Bһ m1gqpD0,4y}J #I' :>1`O:^$G7LI\e4a{5+y  $i8W+52^DDDDDN408p@+}xr. KfGi=AVԝ]{狇w*b5`CV|||a ;DOSvյ \1c Ϸ\6~#uf1x.w,n ^ X:qJrKٔg_! Yh*>EA=P&_q?`ެ,f·+4cg֋t JL>';GB}rj<%mvkl<1l8?5-1͆gjIa/Tm^K^d~z8Gc1΀_OfRLzAI4Z,DGFR]SCXX۳)%%c5 7b92[dw<K@ xlt9.p/Ჾ3d(<:ßASʅú՟k@@F2pW0n.ٝų` ]{'YSI5 Nb/A#?$ˑGPn{wL@ 9CDDDDD8pͤu|>MR_ҷ^kh '>߬_O{oDos^M8ع~j CBdQVU9,z#;F(<+u̻~Zs`xR/#aOLTq1 L?픺w"]lzBs{3w; pg7^^^xybkksc&2maf[y‘ oMup)͘Ӹ(hɋi{Fl_yb`><uɴgpc!"""""rT&ifOsk\-L7W4!~5oᮛ౗SBt{F8zV2xo,s=l:wœ_z%ރI8Ʀ0vzFƲYbP6̿6Z\؜܂儅[}31=_^gxy7V4ԴI'h01-6G!tq`1%%p_D9{ AM2iIEY9f@0Mlf?%|O~-#9&¥wEDDDD$9^Qxiss{7ι ιAZ:aa+~ EW_rC^}z:Xy|P˺%u=d|_Lrt:qdegD~A> џ{~7/{7-4Ծʲ-\>]l=zҽ?lvrIt W2!>W fګ1m?i }3gNuIЃ$=ÏԋaE/^߼3HC%VolcADDDDD䈹OOЫgoVlt6/~/7xzڱ466CdT8K,c#*?չ[/ޡFTnR+w?hj"wG} .8efa~=-%lf.KN휁7έ+XYZEQA9-/~^LkO*8+&ރei\~L7o!g^w*=w@d9U4`sV_?|#i2^})ȩ5,P="""""r(iw#ª&&6oLmm`P_WGvV˖/&!>_DTTÇ8 ,1\$}+|^<+.H!4O6+ύoɯa1ĥ3<};e%۹:SR12[D/f WYXiS`@oƿsӹ?V^ڕnalJ! #ki_} 1\%cq63g43UFF3fL|^ɓ8eĨTWSWSKcc#v/;âXfxOCqK_qnOd\׀w$?olӇlm.k3ǼyϿhs 'kk*˳Ijjc R+nxRQVkNnvlv+IqxmW_HE'e4t~R$a[LD' Ge˖zj֮"I5W]{COuέF>HwEDDDDDN%nlgNrdžwﶳˆ6zNDDDDDt]ܚm(DDDDDDiqSJEDDDDDDܔv7]DDDDDDM)iqS= uur DDDDDS|H[4<^DDDDDDM)iqSJEDDDDDDܔv7]DDDDDDM)iqS77~>yq-N͆)7,b# $-')DDDDDDd%I?/ 7~7YpxEDDDDDSiw#8NJ hnu2<GX^-7׻#s#[=0:kBlaۖ,ɥݍVMeC#im(ƚ]fR˗iin°i7X a""""""rBhx1,VZH5 dmmHJO\TPUO`؏w>Ēu-\:|zְd ~'6VDDDDDDȩݍX,6cۺ0M\N'LeLBs7(,G+ur%dVXǏ+g>*>̤!$H蠀"RUTXW];.by EX!$J )0(e疽T^DDDDDD)%^İx*q9+j _o36W7pVVqck9Q؉qOg.B%oyB159nRd5ȨP0:'Sޯ 3ˈucmo/*3x}UpӍ٬#V _?|=} 軟2ؼf ;21MOrÇÈt'vޓvHPܵ܀o$bl6;w!tؐW=m14| oGoZԵ~~9#3ƭ5=n+ 4Ƨ?WqwN ÏIQ]~sMۥg;'13R.ٚiE:9^"}~1[vfboo҂f<|ccCGjoZi`Ê߭aٔ҇nOb3Kٵv_'0AnV>ek91""""""r!i)5Ŷ?fEі.+yfяD^U{qYhw5tkbpZ\znә*gk;UfLqjeYXe`z, u #22D^ҒNtۅ\=i#$><9uCy>х&DB'!9w;^'ϝOsk\b"F/|pa]{/>uֳ~Tr\&`'K(޿[)FiRVCy p ~t2Ϝ.y !Y*Ȝs7iLTdZ.xMI{GB?gS6zBRgW_/'M$ c<l,q\5y"C0w2gSe-,+ؚrմO>SxqzEwRȯ&m%EDDDDg/ǰ9:7odڞ u}ΐUBh0k}-?)TQb#&&)7r۪n<]1Q;$Ȼבӕ󪶣Wndl+<+rqtxQ #+x /T'ŋ(i!1ͦA:e)ެwОLfѤ"MIh=ѫ{_%KR7;uKR7:'ۼ5 ~Q`^a5_g^xE;=\FMc(iHӜ>oَ"S+ޤ p8bYNIee%G~n={N2ݞo=zu!(ԎO'$~,5>ek >DDDDDD~)-{͆ix<n7ibYV>#l6N:#(T4ɜ-#~?0sQā~Ue-Zӱϕg9p9'cRx^0 r>z%cTxj$_vҟ6sqojr^BCmDl4`ֽk0Zޱy`YA朻M`Z%sŴ[N ן)w=A)N_Ф7DڌWkq !!MR N~CDDDDD~)i"eYrxm>3.# SIoC*A\R\V[{.\}yS" "4'63BH QiH/ēӲQ )cpźv/"""""KI),48-y~\GWۏM<͇^r=E/-l/;Z Sҩ,.΅ižr\(]se` eT%F`F ,a?K%{'+fx<8'zvL˭kO 0(<T wtr߁HQEJJv6LqUx0 Áv TTT\kDS]'0i5^*YgԓR`2h@Jey, Nh7jV? I|3*>_%^JryNv;a87W|Y+oM^.-ǟ?WpMy]0Oa ڂ/g^?'񉈈(i"nϟ$q?aAdd$~-GvV Jٹe/ͩE̺s sSQYyԶ:0?byNvo[â nF !1}S]Q󖳭lL`'k+gW3ODDDDDJHII);swXA,ɓ'U#ΈOO&>0Q/-dKIઇઇN6cg5â9|Y<b}07떚'o8~t{&c}OH=REƌYoСjƭo;QK&}^7}QEwNn;ǓsT+g9%+?yoS""""""v8:?/""""""h]DDDDDDk)iRJEDDDDDDv/]DDDDDDKx/gϞA~bbb;9ϔ{%_""""""RmRJEDDDDDDv/]DDDDDDK)iRJEDDDDDD%6YŽtLS!0bb;Sd""""""R_%vdָQxF6'{J l@s0 f'mw. o:y~>CZi顢ng22 L|Xw4 "ҹuT0Xlf).7"s^q~>N=qd.~^Kp}#"""""r{)LqjeYXe`z, u #22D^ҒNtۅ\=i#$>?g9X'.ϩh{(+2qLN|q".u]@K)޷=UVx5f}tU0IiIX:9K){:8z GM̝܋i9do'Y*?&. ft,]5/ ifPV=y`9t!!6K"O\Y]Y974mOX"j^X~*`vjMټ u8JMUA朻M`Z%sŴ(voaS\F׋;͠.S.%$&ٻ{;0_g8UL_.j5X>-r@LxY`q=|]90tmr:(,ZǦitY|]kXHsw` 꼉͎z8F֓י[__lJ<3v^.n7y'|F=X'MK_&"""""xoaY̭^mLLrGtXBB#hڲ DCQa_1c^ zk;ϗxW~ù۩.j/}A-N0;#˯k _*nr?ē; u=xo3($~%ۦ$h@1 /vC sdbC} 'c+Zi"sS+JJFyQ!aQ8Q Y, 1בӕG7Ʀ9Tf'щn wx&@]8[^ w @⧤SY\DIW@]NuHɃsyw i:Zx%^İ;0})ڷ<|aT9CVr75c( 2Qq`al?)Wށ **_NOh7jV? I|3$_DDDDDě(i":]F ӪWOO|,mz u.vYqL[eCR{۴un>Dv_)-,:8%ofOkDdnf.-z NIG~/Lq#eb{B f? p,t[Lrw=ļB v_ä5{5o{Rylf?0Hhͧo-fKA;3̣Ɲ!#&Suϧ+>Ny d`B*Y󖳭lLЯ"""""+݋vWRkY]S'?;aM* fSsÑ42[Z,/` YWď ~@{-LqjeYXe`z, u q7V=Yhxڽc5dΖg=Ԥ^f2;]D-JI6J vPv =UVxqmf>M/+ Ŵ[-=d9w3(!DJi)p.`\8Mކ_#u!Qq6[uJЩ`>Չر5su6-Z?F.de|OhrG:×14`h<֎H$pÿ IDAT-+c; l5 sy.Mt}HDDDDDL)iEܪ0 0=:Fyƿ?00N ;ڌQ/r͟b-鼚{93n퀏[E9D %={b;sG>?[}:i#""""""G)i"́w(//Zm1f夆cs$pWof'ZO$""""""R+Y"A9ee%ؚmՕӻbo3?ގj-?cZ'$1L'4l6""""""yJڽa`nZ^Г>'_fX؉)/唖Y' 0vç0sVMm 6i]v݋l?g vZOO q6-XĻ 2qnP󖳭lLq-jk>w8K~""""""rf6%^Ű h6rؓm,3짻~ >dC\|FkLL~qŤ&[k5_ݛ,G7ҋH -D5vLLv_.H }ݮ<˅Qˡom wdNO8>z,~Fgy/.NʛyCYbiz9^vl4 Y~gmj+;EHD-N(iGtFCI1wFLlzLDDDDDDVڽĎt"Yd\@Iafqa`6a4|9|'3y/¢S &""""""D+^4=T8ZfYX+~AXdS:*h7q!㽇X',垐|0}:!cyDf#\0?""""""r{)LqjeYXe`z, b$,"Hوf{}Y|e$sW6[Wjgyu/呴֎?3>X;"µ̏ >ȯvoaYŲLQXXCB!8N6X́t>ј[WݞSyd#%ʀ~l"~ɶ) 1tLld`م """""K݋6šGuEn  BB}eaB"5s|i菽vd;:qO946;-l/;ZpBӅJLp$pWofZg6E  2)?}ٙnv]ץ.ά܅eU}r HثXX6Fg j;PAEEOtvxf!js\73O'"""""݋ieѤu[קm2NБcT6i]O~Bu8N__|):isK$\5'IÍ` X5_<>tWEDDDDD~픴{́QmSYrgA 8f;;lW3v^y-Ydžo~ 0 ٳWx l)(`g"]$s1iܜZĬ;0w}>l_ ~ P󖳭lL\rJڽaaô<`@h߻qi׉}{ڨ0lU}Ζ|cpk&7K&푷! ؉qTJڽe^5IJ,,IJL0=XUɆzD Nϝ \xT Nz7#p$s?.m6e\&. ؉ҟ oxVJQZPZ3!w! ?_H!|Ӹ0p.`\8Mw`d}iՐV==fgy`9t!!6K"O\y̤9̽rRD0#yݓǦqgXw("""""+²(?[wl>^pдE؈v%+Ng?.'6s?_EpgВcW_z׾MfJ8R &l@1/ _=ǵF\KTf~9D %={7_1{M)<ϑYy]Uٚ ʔm,"%i 9wItu,-l/;Z Sҩ,.w:|7hnMicFMLSHo&V:݋vGҺQ`~ x[u;~^م_Sʸ8Bjkkz0-_{*~9= p{axf!js\73^DDDDDD݋6 e>~'}~>Gو~%I?gާP.5e@;s-?s^.xs5Ԟf;%#2XŲU!}}F0Oa ڂ/AzӉJڽM *:O-vvlΕ?s/KCk?{/dѶbe{Y^y7bҸ9YwNa|** پ>>5!yC.0Ol5L]cʍ,moeCN>`8GODDDDDDtW1#'J]YLew9nSV{p =*ޗwyF#F} ɡqX`#Y<:i6faK0̣[s}y\;KcX3̗褡<t_H2y x,X7l 2 ꑉpkʛyC5ɣ%e؂1BFTTA"Ƽ|by/.NœD*""""""5)i!1ͦA{Ώ?sBfFb|EDDDDD硤KKD/ %Ǡ'%^" 8Cn0DDDDDDċx/]DDDDDDK9/Ν 9;_4?ADDDDDD~=^DDDDDDK)iR'<Ͳ,vC\.W}S_!ȯ I{؛>bc=>xOQQ N޽sۼf ;21MOrÇÈTOH}0eiL CH];2 k܊fkB#r%yg6Waa`ٶ;~WbEھ}Ya*vV-,,ć_[{G ,)]WKݞofk2|O+2/aE!BDDDDDK =1i`Yi#.A 2, 2,LevU!#qAaDFFb#KZin'Mc$Y*DDDDDD[AtR/lv?*qL\.ߥ?ABo`er)+C<\eg8Qc?:[gJWUYysᅵ64 {}N !q_1#l}ony>}x!3nh҇۞)D7$ռV]57NQ4h@3MTGU7}TC[ 2͠h*+-̾-z8~|`Â͇N=cǨ޳,/n#-/`Lco0$z þzu_D2v(O_ȿ=-^B}hbX-^d%|˹},:~k7"1>޾46 A {a?xrf0~g|ykG$ZoQDDDDDsiӦEs\nt*Eܪ8oݴVq 't3Y'2 ps\huϿLe{j0:M]SofoizM~*ȨЃ,YC} 6aݫ.Rl7wIňۛѺ#/&nƆ̒WܺdUU_gAC~Ć@hOƞW%"""""R=ދ6U+':>g*`!4h,M?ZЍ)66mj1fXu,ZϠ`h?XezcP F@ .'>L ƝW]HBDE..pgo ۞DJow$<;f]nO""""""rvobUK뵼2i̓v+9ѱceaƑH٪-Cdq`W|]~1C40/^I|`0:N1;YKc7+;Wnz0-92 =qyB#̬⁈7:PI71lvmϦo,ﳲw! 3$@@A*"DTljve[okB ("+ad=ι ;$^O뾮u|u*)*^S#+G_?_-r$wWrYV?%-Y뤔]C/o9) rQ|ޘlcԀlPsIZX/kz%ULKߑ]n#Xoֺ?=p'4vb9d_Bbܧ[Vp>Z{󔛛 mc=yhMzA_kK^wO?lUq6~A➢i-CP>*@ߠq5]zE%#Hڷ3SUKm&N>{k)/srT=^_|ej){}>gv疪.m~T``z-I1n[-u6HGաi {M3}6R%Ϙmm4/ ØNj4Aחkc02XŚ0HGiŁus~xzzki;녛0.}2AWhg8_58ZO Tېi;52)Z辕=ثQF1c +!!qhiii>z]F&\y? RyaY;]i#r8n69”yF\uŲTZP$[ppWyay۷iRSTy9\x,Ј?_Y?rlYϿ. 'Lz}~ ¢m ;Y/wiYɼ$ߪG v$H}Dr߱Z:|4§ WAc(*7p p6GHQ$:lDW_eP <~ Q.5o!.;Cc(¯q+k8U-3.}UOZu j䎭Ԧ͙*7OTW=E{<^wU''R R3Ҩ5bkEfϐ~Tr[ i/?u{>yX_\S}qN՜:QMjԵcA R^l5|XA~j꽵y7ZV;kkY:QI~4|f&i'W(+'@/Ҷ"m\H[K5x8 dq=/PG̴ftc>XN[W|ar j'jWNѽT!]٥jjn$yv[xBPa YTuz3WbԦuB:r CG eo5L#0D#;~ٛg7om]Ru te+]2k+)0Kiq)k5kӧzrFv$K4"q>|etQpHiCsdMQrXGg+@Jx]2zwk'kS1Q?w>?'ܱjjiw&߰X}ەJ{V IVu}iX{ir}G5ܫ:$#VnٺF;KnPm>{VzB-nĈŷݧ/(ubzTPi5ޡ}}* {|ve@5ցf#v%8q:jG_+sN |jb̘1JHHv-ZZZO^פф W6QD,X0O}?Xj*;pa[`BB#N<gUb9emf>4,H0m̴!iGHQ$(v|I;>ErHRvvh<䐤HoѢz;y(v|I;>E1i)zhv8A3W뎚r=NW|s ]̛{JrS߼_7[kMsPrx;*/_d[[9bj%0]?(qp'e-(Pl`]s-Wq>oޟ)JTrb,񑵜]':꿷 +utwJ;/{l]{4)9nm/rZ[&Kkz ?g1r*@ueԩm{j9_'-w#%ޟwhޞ֋MaeIӧ QyȒeY2}V\m̹UkNWlyuܥKcg4%vs]w(mԶC N{cO;k9_XΡy~mq]л;)g0ן%hjMͲ"|ʌ ׵*PeZƋZ+=Rk+hbKscVeWF-!u&9MNގTL@l\@l}/ v AގTcUe|1*}1*1d#g7ټI;>E"iGHQ$(v|- 1*x;P?o`۶mcU`#:|I;>E"iGHQ$(v|I;>ErHҎ;G~o89$)11qhpby<>E"iGHQ$(v|3z1".89y3zokKD=|HE5/;Cc(¯`f}0c{並ZOڍ`%tŦ$@vdIѝ*>Xl o绦2}]!w^7$%IVY*?G%¼$U>ij[4Tdj LEvj٫ȡT RoUUZǏdVњ=OZ?7>7{XF]L#RV/}e_4Tq[m_4jxYR_9_|QJ!hSo\gޫ%WΈXmz鯚-IZ6Z&F=z֖+DJ3z<-ٸWG OWPJjWsFhn~~~*--=혿AUiʼTf%k9_` 'U#Z;-T\y[?j{H?%XaZף-s4Ӡ14fp7; bZ^M;=8lF%fIɚ7'~F_ES5g8/pS8(>>c qm s3+JR5D:M3kGz螟 W!K=TRiW^c5ql;ڐVմsD1ώz6=jD=*{Z+ծRu{o0CKxnV.ݨj7Oɭ:7t\dȐ$)3/i](סu围` K6rڏ> ,T.RqQBRJi=zq#Rs6Kg1B+']sr>>olꖜnh ֽ'Zfg]2iOꭈZL-Y2_ޥ:(({b}Y۩) "*;%^B%eإ"EIt@o]1{kOҨꑿV7 wZ-6,G:c$yvW6 y/m+oӮ"KxjٛZ["d+ulv VΖ:jIuهtBTʲH@Rp6djᗱ\c;6GEa*uŧg0D#;~ٛg7om]Ru 46 ,ey9DI##hцPvvtk-(wfmM-TTpd M`VLX{gֆ%˕uGն ]C-N۠%߆M@7OoJOAӒMWjDTRK Ьԓ!OGo5k4a•M.$ ;+!OM]CKJN0ZiSo!iGࣚh#:;yjBElƐ!h"$; {;),,ۡ\H/9v,WSJJ"#pBvQm޼IHܽ̃޽Nrrp委JOO'i2vXvC8Myy!I|w.cruF) {R=d<,v(Y<Lv<$EFFz;-44Q9~OSrr4N)=}4w{8I|_&i!ܥIܰpuݻwI)**jSklf ˲d5[bNBsf/b@MiG1xQ3 S6B\,6NuSg^n Pilr%I2gaw)88X!)7cZ^fs8_9^}K.4k;Q?y x\SIQV3[:5J;P {lO]{=(C͛zJ,+"Nߡ&%U~yp +[xvܫRd)pr[*\/_.ejٻ۔QؤG7jdTk^'l;VAG;T .H$-X}g{ji?~rSzL/Dkx0YGWhkN[ TQmKm֘>}N>˒UJ/nVPPrNԃn(˧g[5ϒiW(Mk.Wg_^NTzb!== j{~J['vմ3[ $םղg O}iO?ΐtqPqƝyW@嘘E/(8=ipKl1"ܧnKfa)R`Lgz]Y:EeVv곕2k<ίuӭ~3>K5SG]KR@ޚ4^CfƤkJoߵ\_[:}̴ gk:Gj+?OR{ds+0yb RUPdIU, UPR``C?NR')*R;Zلpr-~T/<[m5NW]>Bݣմ[vNاDMtJݮD$Z?Sf-qVͮ&y!)ݨL'eƧĬګ'I^ӎW$̰D$-{׏y=^ߍά?=TRppBg2;)1d蠳JOFe磿go0V8Eib{.}"}`}pWqg%&Ԏ,ɐN Ca?N\t h_U%>&uufN޲<v%ʒdPΞKGF*O^|9O\%xt|wϦr6h_1iLuT]j[U6&[5}-3qd-6Aq]JU~|.ڶk#.qVq@T}}M[%X{mOyW;& ]3*MZMZp]ij<޷`gr-qM&ݥ~I ֦kCڹa?i޺A f5I)eݑœyZ_~Hb:TPҼCw0O?Y,*C9*3Zڑ\.<;~PY*NR ]EU*-ʷ_A|`T[&G:_-ҢҲ}y*++-_84&sKI}[0fZ3j:hv?м;jAI=_FT4r?5 w^ۃ ^.1+OL&f^,@+gѱ2"-LT'%K;C_i5cS1ԺDV'`)L̷Ь>)k7Hk󬡪Wuur,9YC~Xw{xPO 4Kljrf.O>v-ZZZO^פQ߾:6l؈ 4eioNiTĸRS()A+g>>WӦ^/Oq4plDP;Ӭj/s`{#eގ`Y3Ft>0 )i67M%f6z$>$00@y o)00kl&k+ue5T^"WE}(=ШR+@'7;eiMS/D)rD)K˾Ci2%I.IF%g`9ȔX)jgdHY.׽Qk֐1)6!WX' #;kZ9αa V}TY~T>6ƣi4*'?婸D_e#ʲj`AGm#mʩrtH'jICNGOmTI;7Ncvꣷjy^:#eW*tQN%ZRm.QyI.]fO<%۵xU$'2q츎:wb}-]ciUw=tefg*D@3:v,W***v(-N``bc^uD&t:]oY,{zMY~Xڅ9*q*uG]W.S~YKwלrE%tĩC/Yn딙ӓ_:~ܪgy),]oQs F]1(YL֏ϮGvΛ*@Mym!O LZZOa;})%%E>͛7mv& {wX7@vQmڴQQQ JJLLlZҭg6zf撙yPݻwRNNiq\.?tWzzzI{NNzX7{h˖ J+17 ͤXvCE*//TqqQ2 w|?s~ގ )sXԛi>Xu,ƾ8ڷo FÓ HW"XsI-8l6VI{!iLac i4ӟ#i͇.eIa4zǹ\ 2|=3@3jD*%uG \S++tTr<8Crx#fK=w4{V-_x+:HWOVxfY,\3@K9fni+okS`!FYw uL˟f~'S=aEJvoG5wTqq`uꔬL;Ќwٴd=5(gufLY-ۢekLXT+2bAVrroq^`h<;h.u3 f2֪7՛w*3\~1~]cx9{fB']Fi dkG+fK3ۯU, VB~|t 1dk+oh{kQʈ)s@q6 xWʕG1rn`Xz5ApO/$IEZRyg9 I;Ќs:U[&hP*KzpB e~~,uFYR>)wMѥZˋ5щ3r3#uoQrOVHdG47`~0oқzZjNNܐYutwo^~D}L^θ-;(E3^-e=)xVmS'Y7}X4Ilcxc[ƍ5jcg롙%]Tp^^.˲Tywѐ.q}P`PX ZK>۟,*HhT]pr-ɓ_5sC:RQ3OtˌOQi]aIu_ _ksWh=0BhHQvڲܣn:1S yNTrGڰ%_WƄVSgo0V8EiԱK2lUk8]r=/<~Up׽ O{]=_ MŹs]V7']mqAqO;|u. ?yfeLmоvctӘP x:5lkF笺6m`Ѷ=Un Oq߃N+~TtqqY!`m<Ќ7)a]q:OpMӲ9oh˵{}#W9\?d[15:>O$W{7Ӷc_-ҢҲ}y*++-2-K\wU}p~$fsںQtioJ!58BxmcL~A`y<Ќ=riU/?G3U S4*Tnн[+{Pī%;fD]~Z"(]zoyMl-Wd\]~{:hz|2u ݖ{o?9on2ZkxZyDyfbڥh}U%R@-{4p`*1n<նm[oѢi[|\j%%uv-^zVۿ2uXWe/)9?WӦ^sd^X|=(ie1\k8Z|o4ّ0)/aij>5$@3bvaq> i͇h&a4-决c}n7$ _%v(-VIIj-psTRR"xfM6(!CNSPG Զmij߾cڳg:tP.x$@3iժn6n\cǎy;'44L={RLLZ&%uQii6mAeet*9:wNv(v3C{UKTۢ=VM#clMکlΓmYrV綫7kP(q+..a\zYYy9ܘ=%TwkJ/dӿz3u~q]\&4_5mr)I2Uɰ;f ,˔lg2Zy{= jUv/YmYqr-/7g*\8rM%']=LmMeWNx?I:Kf&!_*Oij'P~Rsl9'^_Krb} ljc&K3j"J?BW:W t}yA?Zg1(h0Psۈt,rji(?tk)&X^7G/D:]\ʏPaob&)}{Yx"sjm ?EȿUKRZWNV_>W^\uJQ*ۣ/ޝtǰٔsї=5閫`΍+(uB"N%Y̴{R&h@()":*6OvbR(* b^V^uDYdD!mF~.'(1.kn jO.[q.wޭtxvJR/UJptT~|hm4k4Khᔻ>T̐a;zK@KTULu;rEHꥡ4 SC[Pvc:VKxLOȌ2S2*Z[5ps='O4sLOgZޤKQ ߫O.ŶHO_eVgW*i];%nMkRz{ӲdYnoW398To1:ud_.E% U7ߣ{/ ֯hYohT}>2F<4:jЈ[7"ژQ҂CJ:O>vl=Rʋst8HUS.G#ڎ鐙E%*/UKv|HnOr3ҴqoA)X2 tpgݙZ3W֐F<ޯ(MQb$uX *}ך37W& SM5DL=3MS_ͧ(PM~OY/YbBa My5:'ze2#վKB*t+c(Z77g˖Fj,ye8]Z& Zg$o9CvA$9lF33B3aӸMrcy-ޡaSƝMݭMYjP[/\{k vp4dkVce(?>2U;3v)}o]6b%E U1nY |@9ٺP !=;I;>pT(f7d1Z)62%CaaTcL,ӒaSEO,YdYYr8u{hcE|$ ۉf2 A?~qZYSddɰ0 6lG,6 Uapf3d?Hv˒W $jIENDB`mu-editor-1.0.2+dfsg/docs/pygame.png000066400000000000000000003021031341747546300172730ustar00rootroot00000000000000PNG  IHDR,sRGB pHYs  YiTXtXML:com.adobe.xmp 1 L'Y@IDATx]չgnwFiK,5KLb&1*I|IL3FĎ {E%JStl߻ͼ;rYe5w;))ʈhh4F@#h4F@#h4F@#h4F@#h4F1:F@#W#gk}sשZ4F@#hm.u&fg=\qh4F UJۺ{ccSzFFnm]ݮԌ4Om%3@"0zk&%Ik4F@#ECY og}tG<;goӭ_nA|qyV)dſ=GwQ%;zM=1mPJ -"hHcȞZGȐ19?΁a>jqW5Ia҅7i؅`j4F@#@ Ś۽'?=sɐsN'DzLe[1 le/50%i} "5iaVߺ3Nɓs_51mTqr; xHw8:OF@#h Oh]99a/?۴JL`2l#^xi:oCbתּًԘ?MV[s_s!sq~̙3M ;} slm3ώ=|fj7vcdFDK&M%Sp;CTF@#h4/?;s!˾vQ*.u Q#EoWHP7B?p15[b6N?='Mn~{/xܳǵN9 F;Jg̘#yCl~=|zF[~jEy%%y{^p|rcpjBɟ)$7֢h4F֜g]~-߾ܰ%z\dJXRrl߶?LpV ))! WnAsnSzdǮǟMB~VdVngJnnRw4V/SL=e*uVhQ`u}%8a{1{J~k<-+v "Ov&'f{m6Ϭ uQW-͏(2i' }b˜Ao0D$\&FT#h4N"Q{?ؼ걟[CI-Qo||U8_;Kҿ_o),ȗ,K#;w_|U=vpLCB=W^b_Tm+U}ސ=?jnzz=ϸ-dxg{6_ pүWHv)3nc=K\ bv41*չ>P'K?rgJ~YgNyw͗ u `F@#|(xL<|UKJ'[fE2 ekuc@M>Oo]]`)AV 5Yr̵#r̼*9bڅ̵%1|5m|we֟ʅ3ȩIl\bݶݸ޵R>^5n EbمR]nE@LA}Eᒲbڃ񅩩B ⇙ȑpDv)tŤBx1NJYkeϞWeؘSf{~ΙlWKȵ>h4F(#0sp9w~Ui0#Ꚉ!5՝+%-7Haa{I򨭅MӔ&M9s~#O=Cz!Ǎ0qyb56L3((*5tz1|1W$nc=ivZezMf3,~ Xc055Gi9R~",$| $tc" 2\ ` !06,6PYT--[/t%w?lfc&h4F@#\0͋[P\|/[k'55M/&kzȣO,,X~{LYHH"I,//Ǭ'0^0Abdر 041~s.%nv͐˲BfS&;YF^N>pdqWJY/Ar_=xB.ee\#vxؾȃyObՎ $NZ4F@#|p̟ZO?e狽mOii^n^B?~A蔪bmWVnG=~iߞᶵcm=a[]vlppJusb!$^"vӚ<{>w%e]ޮTO֮a[q#w [Fvl.cѹ{ZNؗ'}WZl?m<œ#P߮h4a#8w՚y#˾qeFrZw/,M\rOv0_{=钖_xFO,@Zء|}6> ~t !zhC m/ӧ:ca#cMȗ59rW7=w|ON=ǹš4&~,Q##G {ɹ?%znC1Y(AרR#?k͛>kO>g?Y[n0}M#h4@W#YںuaNŶ_?|97դ o OoڇtxXDX.S dlР~rS"۷c(E]OUmEXh]Ȝ-Ba&=4dNVnWdĈ*nvI1KLpCwʭ?Y3990q!͑ ;xi?]j8W#h4y摃X*dXkElu_"MoUWW=RT:nݶO27[7 1mp0E$\O)$*Z'K+.o߾j,"3&19ܧ "-2# Jzߍi" !#;; =a+kY/`$a h4F3A anVVum'l6z&ydguX\ 2S}eϗS&cー5y t*[Â?+5AXNS+ǿ.zGŋ/, R ϖjyeXƅ'rba2m%:Gr^#AO߫h4@H@yjwI͖u[6/ɘÔ%Y bM޽z,R][ǰ߸ƾV ]V+FU,G8x9DHr"; q$\%YRVwthj5F@#83f`o*n>y"#.2/-_ ^+r&CNr=$y?|Dpuc%|$ w\~9q]G"ee2I;a$q0}RT=w1 gժU]ȑżK=h4F&Ng\9={h&g" "%% ñ(S%X5")$74rܴke8r9RI>Xj˲9$$¢ +/swْ%kt5 F@#->eocM~mEa,3iG%(_8CFqpA %΃D]2Vc Q*2_{$؄d?Xs[eۮfP8vjx[5F@#k'M\8t.1A6f>4vND(&&ăϭ8PlMm޺2|@\<33C2KÏ ~!S1W<&ƺjAעh4F3ϾsޭN;[F[" ?NxA~ ilTQfAUd eÏK Y@X)f>\)l=J/l 32sd1棸} #baz ;/ KUQ1Q v̙tqd-G[#h4C Ga?e=o^TYB`<`d@9BM8߭/:)+f☚,MMAٹZRVJ\%F84a- [SY$rH mfV 8NP|2f$}{~5kpԾh4F@#.K5'_A+'Mپ3_DϹ\/+=On03E[E@8;Jrh2 ܶm{Y-DW/']( 1IHC 7آ8ſF~,:{@o.S9a6{֭ێ7ӹـp pF@#hP)~^r_#%h}CUT@kJ \jVlXT"aCɛ:ƏCJY|,]Tvܩ\;D0Om&%,y9~=U8>/Q&kxFGr M7G@@xO d i2b{C (I`-1-PF@#h>{ox>bּ&׺ke`=@| DrNUת萼' X_p<#b ɴi+C*k`]}X|XfN@&X?D0'd`8K8a*} >Hv÷arGKwOe۹ztR0 }h4@W @px[X2vC#iE' F,ɧieibηExޑe˖ӝC]f {n[oUu&/OyLJ%mX4F@#$#(Ԓwh٪pMX`Gkč\ɎoBX9*ٹ>9aPH|vz1RSS,^X۷deeIAAbݾ/i&umŊU2t(@ls(Iӊz%+`) 2'a ^ܶm^Z֯_/Պ2< PO1w`ef\j~9(׮ `@N4F@#4-=›v <kzx n OĊHY !ȬR[[nኂ866bNjjjԶ6ލLVW__'>,E 3A@Z!'&Dq;+! k~+ 6ɋ/(_]w%֭k7X_ 2qə,}3dK<]`D [E.C!k4F@#YٸqEW O\ 1hDKqb.'% gy"_${%s&GVH>'}Rܭŏf2֞b`I /s,nH3m1))ٽg/QY}9Z@+9sԵ|;- v ;Y'nXH;{L1=xg?Y+xrZ[>h4! o KsW ,Lh@o+1+qd"O=3[Մ1cM7$UUUj3]urgyDۧg>La_0#$CavIv޽հ06ŌB޽%77W++Ȗ-[~g~֮$iY&1XrŅ!ߜ9o̫΄V[F@#욄`c/S}닊 n4n;Ѐw`X$Q~VT[ƌ Ȭud(VB [Y/?}FPж܏d [o{a<ʒ/8V7&£/j4F@#p8<܌ڬE<ޘphGvh[ ya1#. xrť䊫gK+/˜8ҷkn5 c,\*o/^x pV$?s̍򣯊Jp~`nȫ X/m tɱyۯ+e^0~,͛ɓϟg+Xhp ҳgOޏc#Y2h-@B׳HJ$!n).9gZ)k75"^@E#h4.AcӔ?-i8.bjG녟 yto~C=jtZr/c[**ɊkߖL9v6YIXP&3S$@r}-VGo &&W6޴ jH0jIV_ink-+ ,;qa9V=+'O7Skשf $&MR!xm-ܚO>2oْ]nOnaVsU)/A )c0tT4(RڝF@#h4BR,؜΁tPt !<"9\y5Kw+%3#E)Z&!R%X>ЍY>㆏uՒ/&5I1m%5GKМzRLib[˨e;M-}S*%%Œ&A?n놆M/Q9:D>( M;;]s[MVPvhxX4F@#h@/-lVb `qԽf<1n%O>1etI͹[zvC#`H\ tÝ j*鋉$u8CLPF4TENIOuIz&#"޳˰XrŅկ&)*?UNr _JУxZT!1,4‹_|NIb LNx| v 2֮] s{v/Z#h4C#੩f( q#/J&ӻa4XgHkȢ%[1-3,/?-{b]> ݼ<[f=|M@ܖFN3ǃ;A u2642ȼʽC,*;~]9㌩ҿ_?e#Mg믿%\Md )v0iLgQVƞ<bA8gsc;[MG_h4Fp4! 뙛sPST;to<.d e햻nʌR['X7φBV$L.vc(QZH]}ux!ڀHȀ~oSOk*2C޿|ON~g ;!q}ΓNn9d1!X:I#jdgg/[RfhYĴ{F@#hDYf׮զl؂G7%Q?8"g`_#fU˛OdbR+u=H7~#6#ڙOyp7H4 nyI@er>}qǕ[7څ1?/_!-gxH#9јԁn`adw!a3}p\VQ^}ʆؗH:#B#h4zn6),<5ح s h4 t -y>jdv2 EŽn󀐺2.[N1"VCHQ: =!iF@#t"25;[ߺne}0_>Z^09f,.3/\fE}ǟe47I]$BVSVϊ1D?HO Kȸ0!xҷ*uHYy 2q _:01IZ[nd[2mNych4F 8sΔ:z' `p$-5Gʠ~Q Sf<, dy{pHH>`Z`TzȖ8PZ臙.IKDŽZxsg⮘)6f8d%aM^zxr7^p.F@#h7of?tW B}R8 H'>$XK ]>O^OnO5??ۋnG+B Tp:gab#>#g-\+͓+/IC0"$->;HĘ|Xwny5Lm0TڡF@#h4AvͷϾG5>ۇ]H&A-7䆟 |xݛR7t!OAhSx y@ג!o85S "z$?]N;k<1yjij쟉4RBߗ'hoOuO4<<] z{Mlt(F@#!@H]80:p|?Ƃ%Xn|6~6nD`In1XѨDi%;M4C,nWӃ$t̒r<ԅNS$QpiAl a}Cbkr?USY|kVn{=J {R.lslpV^6ojZ&[Vۗ/S,L}&T:(ոl޸Gn=;dLMD !$[*6~ZS|*ᷘb8O{s|Ɲ~]H}m?=6q>'g]YC lkgu*DY<ܧhL}44a> \'/2VC׶rps$ėqcg:yCS&=G)޺=r%u@QQQo  '&]gz%Hf!յX֒S{0Ֆh mX]IxP- j.ܴVvVn;e杲a]|r^A}MYq/: )Fܧ,6Bh6c$D$ b%Dž3\:b愣KZ[>dNqXbB>hI3d_$a|8G6ʼn7DH9$ DS^Rqx$ӓq|! =)iq~.2?(`y0t!&0*dt߀Q"8oYڀ6m)//9KA %qv_J^RPBkO!-%2G}?M\_b4w%Д 1#Ena==EBalTEU%q L$5nnXahʼwneDDShק⤗1N$dPRu= m0&!O ez,hOl:G ƆVD#Ֆ p#ߠV~eg=ap$y9י-@@gˎ Mvy}GܞT'#?pY[csEپӭ9Aɻ'6=}? LxiE|\>.vKMr2jԨ>o89Xuך]eIS+nQWsf0SM@GItW@L$`F4(=5I#ܻLi ZsnJr r I[8] A 7LXIMl޴AW6q!Kד}CP}2r-}A> ˺*̤. "aކIjclAai]ԅ~ڞsfNGaw4l %[z1?z ]URi\v776NՀeWPbh[tKlV=z1vfaԡV୪e&ei|(10btMqp<4|~'bL;JRhǨ^90tOBUn6Apa}cϻ1P|WL/t(y[Bʣv9?iL4)^id5VHN̊#|r[z ިK$;@py+X}.pW+ͰQxJGn&HZgw5@2?,Ś~)!99+HOY-^j~RK|ŽIcr2H hQiarӺ5O=!AYSYh)|X}ʏ_-B0C ?/JL\Ba[⮻7UD FHBQ#OK DeD(j'm΃Y]/xv. 1but D#kxe}$YlO;Yh qa#/Bc";\ig#@<+U8'.-0 )Q NB G&Veƅy+v['weJi]fxs7B'@}1Ā Ż0~&¤8>$N(@?LnAm/P1=u 6S}lTxӲ26BN\pFP Gıe2ӌ$Ŗm6'_ ] ey`ްds,NYLƊRh"; 0BLJ 37f4G^~eX|Jc$Hp3E2bVw)eMfQ>ko5-),lIFHD [SiO@&Yu\1'h?v+bNNxaSPPc7"HSx]!R<^يw1ccVI/̒TQh}Seac }gDzH<ےQY`<_Ykx{,c 7|uSOH?aem/Qm_;[g)t,CCC\O|(5!b5I3j8Yx[H rIAe/ $Z5F9:>qa%+ó#MRP]F8n)}Вw;:*'70l (_:Rmi¤y`ܵ `^Tt$$]aѐts)* a}HCC^[1x-(EG6R,G.U3^b3/H'г[.b)a97@ eZx58"JƘ 4秡|m p@2p&9(F$M%2%B{Éq wnj"o2nѦqsv?7Iƕcz`tknP۹g({@p&>[% "xVSKr{@o_#PbMa2?K'G5VKuɞBMS/ ]|6yLͦmaRMUZC/Ȗ}UaYč3apE|mr/e6 krªijc\v}1qM3o05V,BJT$pV,>@P#.Di%(@^hO ^ ^$tc-p AyC*M=?Gg`tuD;|9j*k0ep5zt(c7/8!VoP޴RBf@A߆GY;aLc Tq@$ 'qM^t mX=F؛K<"4&Zŧ$9`vjWLRRAp=b^()h;Y0_ug&%\ eY0Dޚ0 #LS-tKgSOKA઒'\% T Cc,pn"CT}^(duW!2=pJINA ٲb Ag^ + J-^A7@a3x˺0+؄ZBbA"AXAAoCL C5H?6Z{_Nh>¸ayhKKr}:]=I`ٳX95ñoUFzߕ.Eh})ɎjԽnMBxKH׫H46PcP) +YcTdXU]Qb !tb"CsI(q IcЄrt;%4W4bI$ݗ,B鑃QVVTT)+ɇnyZyw}L>tϨ}1YY%Cyx&.t^uHX*8=o CHY_h+47' ;~B n`r9%ib LĶ LzoNᐏ<>mdgw_1~ SБKq$PX :GY I 7VnQ  pJŧ;oA] u#v? :Uy 4z"^P`J\R.0U#&^+ć,Z^t#yHr:ßYP|>,mkSC&S mX3d#Yށ2M|HT9[<*[}&ix|pmBm ʠxx?|K[ rʏpsZ]e&˛! P2ϤҳoO2l*@9I͍ QcȺdǻx+K5CV"N{ЎM8;b!,&5S,P!]Pe#aDQ<3qwl9Δ !A`=I;w$9o<2FC4S ξ:8v!L#?kWу4oH(\q|HdXR#ŹZ}< `|/&y%w039YhAFVn+m yB!Up<zm(MlKbhO7zlR^t1BMAL KٻP)+ƘIC=3cjd{>,R/ǒ" Y&X &N(ݔ=_%߮Em﫯zw_=kʙgEO2}QjDBĭ?Dv*Cl:ܩ$ v#g4Ő)6s휴 */P~c4,SDZZ/K(¢ `mmT.lp)BZ>Lh8fVeӕ_}Y1ig^`;%tP: GU7>(0xHy"Ϫ5 .f,[`ت,3T̡ssD1* fvx/VcUb0:'j 3 #c|o]6ćZ^@i/͖t :]l̄%̤S5 ҄4Y%/<o9-RC7B-l݄}%iQk'`H*8h4LeʂO_gV4=y>` &J 7@a樍EaSIxHa`C59x$$Z̩'))ĸ-ensC,#ݏ!]_rm۹G'J:̙3Mj) , k]v)9.2x}}-<ח7?).D[B*y!\K plƃ;x]Xnƅ`sְjx̶~f-r/dXXlf캘_[-޷tEp _[NNohQ ;l9X4čL})QFF$`@jZ?n[CZ?mptСb!g#P0T(CJ1xGV%DdA4"|eńi JCnѥ4edГ2D nZ8^Vh40u`Ec#o<{1% a)0̏,hN\iq ([TMŜ:vx#-ZB5TE7de_± aA ~ [JrIzt9A f 6~$u `3Qao$6R1hj1^Q5s wgV%;zR)x: Oi%5_ VH#6ND9l!ѺQ5֍›$Ђp2AQ>U&;{NĝiL*r"CinLf°ǵ:3^rbi\  &_QT٪=Fǫ2ew/!X7n\.,y~$H$_ h[e 0d &b7!ZUǖ2̗P2yPG/Lx?f}~ z㎅L5w9qp)+K| Z]atyM/& ҇^v' V-G]G~YPz#w G~}/h6b5AF'L"Ki16ech_pF Vp}`6u:nJgĄ].}UuyYIs[6#A,Dz@0n![|&=eheƌٳgÆe{׼‹7}Fɍ=z1c!~"{n;o>[+W'>R$' JScһK 5Km>.uaP".*$GgW;~Q&˶dwcLlh_ok7OW Y֘i* ߁;y4Efp=](1^89wi%#PuTqUojr ` x+ѫU)LEgU#} ąG3୅F^-L1t49į3i%+0wllt`5c2 (Nܰaqs}_S[Fl#w&܏=Xgɝ%وsP0lN,_>5A"3a~XV5gK8qK_q"Q 5VZZٴ~3 w0*0&KIcuLz 4P & #B2IrB7ߐMn}>#琟B'dG"A$|xb6ƃ3N@^#(\r2 ^#Sq:?UyT&^!D=@W(vGL" U/%;KpTrjIЩP?ƔIq(R.f$+g&f֒=:Gv(y?NLs .3 楧NQV@ @fxNT{dEc\5'\24]h珃 ;JK0=i ~uHsΝ }HQA.^^X~jyHf*Tg,3?,- r|:yw1zJ2X&e75F,l^%ނXoߞw9|3ʉ&Z%@&*'X^\h8ws@̓yw;N+Ǹ><Õ萑9JWdx[MN8!U</!y{Qa/ƾ8Kxʀ]*wVkV3 |`K&?\vUqpR465eђ tnzUAF!菠wʟ:q` {ٲe=-/M]qL:%AHK=`//0+7,ɞox DWϿ],f xZ`ڷWk{vm7J-~oI.<ww1pޯޟOT:`*I. 3Qn#.$;xI.%rJ `m.ܩpԌkfHB,- JlHG:9>L(~VGm  ( =]Pκ)utӁ[@`!Kz02۲Bht&/k6` ?>|$' G/Z^` b@BWzwhbBҌª!A3_ oؑhXeƝ,N~xI`1D+a`y'n `f>>UY6~&ZQ%x 'zu-OP3]栾ƌɓdʈ1I6^ f݇Kkefˀ%-7EVb`rXNuj-ʩؒCc4`1c >hus+g?{XUtޒ{8{ABV*m)}BҾ@({hvBL8$v;v,ˎHNg=@ZqɱuAxՎk,Qsեt.su w?I̤ަ&?r-¬KJr"L86l nQ0Wh*Ҳ\۸qw0LIb@OD 9rrr>>Fh (|rX`?>i:wxBha[;{vm6kL(/o ¼ "Le$I5ދ}[л#=b?Qc샟;ήFl-sz SWPͱz%` XFk3&z~ E1x7Qԣ 4z{#]]s1Ttm6u"+)Gm(Pq$y>qFP`Z){;v<"?ৈ6g0=!C{ W5(η0^L\mv}0H]*r m|U՝j4ՈxQjB26e"+r+T)nyN>)>&6 _s}i*"))i*Ǝ.CLPmΪ̀ .鞢lq#ƥOăG"O DF-qQ}aʂY%Ә uOSC Wdz kxYckeČtٛp6!}2^6&EQFz"V \RI#A@ CQ_4Qb͔%y ~i=ypF(G:KvG*۩kXfF~'[ Ўo: htʦL^hxHuX='5/ 5>33ncvlx.DJqa`[ }UNB`oC{{)Y (= (07\,֮x ׭m/ f&%E0ʠE!+HF6s{8ʞCPsc~[!ۻHL C}ĵDAEۉ:8MMW^=ݖ/X]+V{3VT9‚l{{`B=WrOwGPXWf3no"A'gw Z=hq{ ['ߤNW &bm :*#&ӓ٩~Qb wؾi>U{./Z1I-|͜'BxG˛{^XjZ,7P#is_:~UUb?o®5rD]EnԠY&lUى[00M>x^[eG9IJlk~YmDWhO=@owt9l^fW-mu5dboj;mQyߥh[rs1h WPYħ wu~_νWnj./Zv["1GS~ HD#n@}r,G{3=k;e__o}_oٲm; z^4vuw֬=WGVW>tQ:FKEDCR<9ss޳_-Ć 1j4 6BգLc5m6v~@鑺Skm6cڬHJfnp۶{tŊ&߫s_,ԋ N XMƆWiNZ(*|Zljx$\; :{~S50G*(@uWR/@&ꝫ¸ISC`QJΩoxA`>l\/H?*/*`ʶ OI`Cm|~9,c#TL%{| 9ٗ׼IPvDI8 iZ_7qtwj~,Y7:TW M)-nP I"!őQPl!4 6뮵&[)NV.OChiEE뗕A؜slES<*ґ~ p s2ώFzHX#DNбGŏg\t}{~g7~_O{%rɂ1/?K]hr%y$@ωU^8b&/94gcgcOJ;9뮱bS\ H[#1[QP>X=Uox C⧻hT˃\p^#v5OiXWĪWz?Oq!M_/b倿ɀ7˗jp}\ H lrwXTTQJQ(i'^b\:%!F<4,eC3$rhS38qxM[2KA8#-3]Yhuլ;6썷|?h?/Y]c γ5G36q+k 5wKprWgKhܔy/\G>W-U7 ?ouk&qH8-8"SqΠ6V*|(j'$8+s5vcIBokŒ銅ǿNKKI+TFt.-}dmIvp}XΖ7.$}bJfFRϩЕWgDއA=ʟn} >FQŸԻk_eg!ҵ{~<}}sdfcBm4-ÆBn7n{ V=;]c=~BuFr˖V^YGX4jO0X%%,?֯jw}qRhX7.f)*}%l1Jl)񎺇 D&}l! =T]/iډn|*wӏu1OQ9Pα8Vcc&ٔx8JJ!+YBN6%yX=aCknH}Oz'-[vƏ yTwIKWM?R\s\+;HگʞD-,k)Q::I} $5YN'C~uy] cl& !y"eD';Pf9! 69kَ &V8Q/Ԟ\Ml R{ iΎ&=m,*=~/)~w<ǂ&# h@#ޥ%j ul97wxzl(fz/}+a}䖛=d)71O4igܶz.Z6Ϸ9 2ΡH]Mo$>DB.勒_& 99Ooxe&P)| ;_7 &$z;{TW!U3 §q)61H񽷿oa;^s]oS+-'?\b8[Ț*Clmm&I`6tDQZ"ܝQEP3NXKko4Mr׃`~GO~-EPKx&by AՑFk5g۵aaQRΪ/0CA̼  ;cюvk^~ZQRA9Ryi)eAL3k)8} {bԜxY@s¹n/BEDYWPa4P\Ja6TKfa~=p!-9<$eyGYtk o{BR{}J=xG5o;!ⴁ=Tuƃ3ߓ*|ȭmdj' K )a1ZylQ׌c̓y%yYZ5Rg}{Wci)Uz:X!ALK$QOωˈ5ٕ+= /i![YZz-{"@>pSNpvP CTӋ 7'_9se0n{Yʡ <+M*+δ'n%WV s9ǯ?PVI`D[¶ -} P]}(Wr"޼lOWA`ow,[߿u折Ĥή6&15/E?xHJ 5Y/ݣ`l[⬶ kY.Mj!YSS6Ũ\ Ur0:eU%h}Wm ֛Cۖ NkojN(zfkl:P@/5;d-] ddXcl{\9^}=:S։RP"m6{Sֽ[JZ!*]Zwld'ǭ000weo.wٳgѣ% HVɫ@uzaz|2r,Efc,*=,IQ|`axSF7~z޵&@K9+h|-fC 0 ~(pb9_] 0ky%nSc'fܽ8v kwoRU",]ӉhuIW.:֑K/e'Imソ@#~ȂTjK`}&'g j '5jAp] -i^KI,ot3Dp,&`)vR+̂p9޽ZI32(njr#o_~]?Iz;yT@m i!`Z>,؊X6p4NWnw~Z~l Ξ:V$X^g* ?DV)Dˁ E%-NB 1ͷ~َkq}T%6q0`+ʭ@UMd(_7ViK]euM(m^%磑Lzݳo/kSَ-{&}Kѩ3Tξx{fɓf4sŭ|z,5 9~JQoŭ][G=9$gkvZj%caW;`nQrmu`[/-Z q-b>(:AYJumL\fskT 7;P~dH]ʧZMt)Iѻ9pse3O4h(@@?,T_6qD>ZCҤo "0aim m8!q\Wo~cYV<*|#\Ayi)yfߥZlSYd_ICֲ#(gd$44ےSl҄J؎2A}BsFm1vԭ-p!Ҍx9?+ɩY}P5Iʦ5bi;XԴ;0 77q>ls=3"ܬMȥ),*ԕxqz1 %ϒ:h%: +t>zζlfU3#{`~ Z>o[~-]Fn~Yk:djŠ޹%GAIMOնmAYkES9hy&w0fBd א jO'(8fiy9'u `:P!38:Z*"HGp8Wy\O=>WqP~ sbA=jTyDLE@Yzj-0yEtG ($UYe{j`3yUb; F /S2%*7` b _Xnj(=F=ET7UVF{6-,o2kb>ء*~=DA`8 1]1ś^ #y Yh*`~t\ )ڽGq8]PڻP6nzpmI[6ʂq5Q$xtuZ$ :O-iIH" %i̬2PmZ- EpB~̥,cT}Yb{q;5赏pl~<`<% 8 51%S,3~4 3PP'fb pPbF $N [CCmں φ(c[d l_Sܳ;0eҔcn۱Ѯ]ǎ{rZ5I TsgI[~7T}{G/$ *Fn꘱#rtH+?*.36TҶP7#-.ٕWYw/($#X#[44!lٴ^Oh, ?}[t-!ڞ{WOtMnEoJfvp7Ѧ.|.N|(ψԀP f+gQtl-w'בjے\/ 6lIe1F˹kcǎot 1~v y|*1v0s.n"J_VvRIxdoI| rR z07ahȞJѶ^'C!!7x6/+*Ч%nveϘG!ۺRXesODm;n G+1RQZT9)C͝g,ɡ|l]Σpʊ#BYE%2~ů?6.,,I"$g}8 &L PҬx9+|vr=Qg?[ sbB J }xϪBOD$>}JID(-VPaƖrMCIõy>=x?L|=dEv;@FO`U3ϯG~3ΝBY2s'ne׽f+}C,υX  폍[2a;xО\ڰb)6o"<#,jڶ瞳*JO1 OȮbnbw}Y]dW)x0)Z7Y>c(Ror+GY)4ڮIBM&[ԉ fV\hB޽;zfTX}2s2,53qY\y,JS=TӼ ]}^2wE9vsmK{0.s<}̚E)q<@\QUo.l1H'Yjr.S1㙫b'nom@IDATo|5F2L{w hvnz^`UK}6nhc:QTV,T`ɂjhɇ F]H/yXB|m78[)XY>t_u묿fOKAo[]_LA¾r`5..: 5ik:0;8 /MiAdzٶ؋hĚPa8+ ae{zTQ4/xC)녀8 &pE nkw}r"u\@`hBz9 h` 4ŵi$&ONئ7Jcc\hu3ᓶ6uWNM#Q^pZ+pめHg3 9|'%7F 63BmZcg yBېtsƒw}6R_^OF.om֨q/ԴXmm붢,?3?)weC6TrLSUyY=UUc`|J~Eszb6A(paP :!lf' /\҄&fbM0w.K=Q;Gwo+ k"e߁v~,s-:T'V1Ew,ֈ&h:ihG[bRq-n&?CnZk@νvv-7Z&Ozּd17ڄf /l!EYmo ćX;w'  :@.ˢ99{VnKm@sTC}vwy<7cb7FQ 57uΣR&4lʁ=UVZl =xy6\o_<[wE7 -݈~op̀-3+_H5μ~~int)VLɑ sPl;R +V5R5" /6} b ]WLۯIq=j}݃4&U΁^':kK9[/CB'Ca^<6{fկ1rŮů*. k |UFVV +N%F6 7f(~@nL?eU>CYZ۝BuC/11 sE:?hr#v¥ao Yə2WdUxJS Q8[9ؔ! 7 iQ1dh]#wIOKHco^%F{{ߋaܾ!}c+[|T_ֵ'mP%EC]c%(*W- Hl? ᎟<Ύ"6:[鱿~MIcKʳ ؐɘVq"& jLIA&WolZ~I96\s@`SXQ, pX0# VQ(N̜5fZ=^*V/bu9M̳3F 2gPlbm|-;yXk(XO}[5`^ȼhR#|VE0iF+&wN) | By`W,XvS^H.eE?6 B^՛ㅑ[pP.l=>rq=qux}DWL^]9 Z*R9^՟;Yu_4YMb8ּ&JKiQ  Ո :rV}RZhExjD~>{D;tޞ~q[!KG/YD,_͇čIKxEs"=559y8 ؇"ft< 464ZKkk˕K엿e7 ~U|ɉ8O(fFlƞs/e)E#ƊJ$6q#"yjl5y3Ek_bb;m& mbp83ߑ]\Cd(p[P:z ,­oy,B#=#ySln_a5y0 0K ]wr%wJɰn|$WE1﫧Kc5u[kEQ[O}m XP$`sOV:&!7k+{^AN \C6w{zx?խe,#9yxFp 3L6|}?~P?x2 -b `B(FRﮟBD;|={]L !g3+=pt_,e7uqѶdT(/p,bm6|`XOٴilI1Kp;ll^<NB Hep){:zKf3R0ѸҜaQ`&n"@Q=oV|Y[<ׂ( +<hDC ;||fecgoXfn{uSklB]i= s?r%ʶ?FBO>dʹѣG$X3 -i4jnnh4m|02#~  |zJB9RT{VqTW:g-Ct ŧx'4ͨ=+}sѣP1k2Ǻeժ(xfPLl02JzN#OEf4r+'HG,8*L7-fec1G_Ϗ)&=>AM[SZbMp$Mt[U<,?_ lD= UOgCLT͵jϬ[CɌy@Ы ;b?f4i>8'xΩ[ '+@B/60,.ɜqTБnJ3]}L6TM*FJ οyP xrA~݈lFZ&ib::&@H? N0%%^۸q]7DZesQHS?I@+b>3V<[ 1=+r11\'y k #cEQ%=@됽A4s  Y4OadvKPHEҏk=Gy<^|c׆kϢ,B°{ӭ")i?n1?Ooo,K tt[Wb'w d3Y qv;qS,EԞi9yc&wY\-3<7Y %*j}5o].ZkFW&]AOmjȏNp<X^i5C#~&o T[$3\"c];!v=(YO4҂ ^^50cn@yP/uk8[uIQgr#WS|r'Lx%f};WƔe%T,VXS)ۺkܓ.0hzzA u}iQw]Hi+}SFy! Nl`_;o5zw׹QVMXlLdJz9Do42A  ,Nدd4ttEQoS`kW{DTKckN=s;$5!g(Z q8f7pɓ2 T}h#B22NS k *[c8 uA]P%9dpgM 6:Zoʦk6 Gn^6*- _fZ2+pK] \vKf ֕atAiʔQj _!bU 8E tWN An6{aȸWϙV"/L{M4tƻGb. ,0'%eld&kO<P٨&Q:qz`uk=iqR":ϥ&;qRƌC"*R]P40rm.;`FUh/G8n|O=1-pZʢG[l`2CUG+=]1Sɫ;)_f2}$t-i g ŦU>d+"! vh|IjϮyб&O\@&oV7~;v"=4leDaۺu5\w;!k("47rX\;ʢ/O F߅g˝nWU%D2Zbwɨ|~[ _sunWz*Çm筪Mⴡ5|.$.!dՊG{m)ؿK sP ߙuϾ_*t (O=t?K\5pIvרzjI+__dٕhz+: %귂D(ʍF֫߮xjw}6,ɴTvR^6od5[.n'l'^.DaP ή"Kt ` W>{gNlmb \:*喋G@c0:mΜ,X*OV[xfZ&dk4kyklf`Z.4HTd̙p8VZ\ c/~9la c:xQd(wG[0Ԑ ZTCfZ'$>#f E.MxVy;O H*p`_KÚLe{D[6RgRv>ɢ*4ـ"@ ;ֻ685h]dť80AVVƹAT p*W )hlS6Sr8A 6D-*FWt8`q& WĬǑv[L U;96d14L߯8X-"H7;u;iOQt2E51#4k8mpp&:o"uz$#PKSP }¬],`ߣdqrrTL.0S_s7^_~HqE՞Y_!RGG,N.` Xcle*ЖciDթ9SP`4*.` -i1678lv۾o=ٷ~ T44rǍe]&*f]0ea{HuPu \rzEl~b{j3K6̇j$suv%[uS'[F W,۵{]v=fG *J,q]ƔYyEY4uUݳ'vC^Jc՛9w Ǽp#@;j!{~ipFr&j]= tNu:RHho3z Q6Vq^COGO/̌ &T]Vݢ̽~Y~o-pWDaCe6֬" ^`ZN8g%ʬ ńλiD@8+ =?Mr5I}uAPhU~pro6E2PlX᧥`TZz)O= vIia+F&U@ ?Y ,])4 VUUu_ bzy WABNj&Bh;0ۚniң*H [~u)&N@٨@qL!x&n1I|c5{a7: 6;yjفUABϥ/;`99S_rb6o=;K8#{qPPUGnӖtC VR:LY#l!NQ`콋3e%*/(G 7 啙noicOPUPȤ_e ĂTJzCK`6٩in!OfPY+䌎T/JN㠞EJs-i p=Qwn;hL~Kl^:G `ɕ/`Km2TW )x1r9Ơw~/@(ؘ}+9Ҳ\gOM욚zk!hhjzps'!//Ɔw!o}C;hbFl٢]hBl ;X[o:2`U:3! ٣yV?^ XVQaW.w1LP,2@}nׯAKF)a9p2Yb3 OD?;ٶ]M ?Xϭ?hXe /?~soz t'˥t4(0DH:Nr_T4#򒒆dxΟ+\,sd/!x:-9਺:P UeVtHu˷XR=sPHKt\uzb6x3۽ӣ $j( @tّQ֭W:TcL^) \)sEArSٔt~>MP p`kyyR&+GSh:'dl HeSЎEГKLb!yHGI݀t&B1A+&h'O:_hf)qPش\(;@lbY}.7gih7p8w)GUcX, شUʤ[TȤ$&BkihZwNFdl15ݽR[eT}3ЇLL9C=0fWxQBh ۷?gӦ.E VߚV9AGm#LHHAI#B&ˁ BF܍s WΖfvy9s Us_ : 5e I1֊F;rŃiy}{Pi+=hA[ .|jYLN;y=>xqҡg"D?TrzkF|HPȃe<;i\JK|McY *? 0.{x-,x*S}Q3 p0uRAukx&U %`NiI-+=yDP}J=/prRTfL6261g0R:m\O*Zܬ(5pD=3-< 1 tkOsC@Wy@af<Cǭ eAc ZʸOT(^э*waCC51lokztc ӦϴJ̊bD/9=+Mhdz #=mWoy%96gI~gxf{\) s'ۄ Dg_~raL=mˡÖA Hp0Nڵ[1V6uNlwbl}am~yGJ3 S˂M71x7˳3aSN߆ b}Mq5fCf8p wzI Q|'twN?4*mQD͓쟀DiJye>_pIEB\5+ehTWG<0Ci@(C+כixۼ#} @t3UtѢQNrdcDV/WhX&yh^x4>[( &^gIas*hw*}J=g)9J3m6mB-oSjUn54O< +Q[EU0lҢRW`P7Lиk#`UOͥ#`?臨*}#drY3n5jBd} P@@ \lw9VsOW|4.N' vDvl }U^ݰm揼쳡"++#6&.ijFpNO<=VT5DAY\klZ"-aWRYmYUrc/4V.J,Ļ6ۢy߮O}c櫖YSl] kzM֧ 2y9hG X/.>( ɧXlj?["%k׭]#S'L߬ p7?lzr⇉~?gɀ2A6˖b9&B4q "I0{uHLQp5)+A#/fغҮo,)[ح,|Y)ۂkM(m67w~Q@rb~$׍8*oc(-Dek@ds(_/8TN5v-w5l11;ll:z3aj^[  B뺗tJO ;VFNŴ+&rH LI6O+mbw 'mƓhP˫U=1a B9@H(%Vq"@W_G73|[ (Q}],R\p1(BFϔ;Ҡb%d*z."IpEy\896;ru0%;3[A嶎"u^V@t!cOklm畱1)51bz ϼp ߟx0WIP:;[vتY _j6uOp3ݣ{l >Uk<6 v a_m޼ VU&F[`-?ycu)OrږHlg".N3beSqin=RM2.:IKFWJ\q9Cf4q{~Fdj4ͨ\9v}?:ObŠWqRK L˧~3pTO.PZq̃]nˋʘ,`6ƗH _T ;4ӕI׽9>JbST+2|N8f:nw`cu0uL/yiY1 7m$;}Of;c ,$?PdD&Fn}?`ӧ>W xs|P@q;'*YP蝫Tv}u)8(ܜlٲϬ^;vnFfڋ<[׮]8.{ߨ=]aGanqGeaeJiMe/)ā-͇*:E4iCXl2oy2GRpb_}u;~1s}McK5үCVU\VfP5@ <xiCԁ;La=,z7 +9,|CURh\Cu{skׯ};|?.)}-[$F$ " u~}$L=0+trm~?%LHΪ:MQX@lJ ӹWG=+J!A|x7JpԖp|{Ho}ˣNB:O:4 T}3@qaY,X[ _l{>^i)brEKATHS30.)j={4m<Jy VtXG T j9sog+h:[@R>JGywA othX;ePZE>?yXx L`'#ˤhc&YjE%6QTl&%#XLyt嚂MD_4 O_>V:v}9EH|ΡI}w_fI`[hLi^l6|w.IH\d4A@9%O&$ UBΎ&Z=AH nvF,퉪7&dM+=56G=Խ2Gi `5J{K/>SXtmf߃T"AB9~ЁV5ꐀR./@JudBi:'qzN1clԝJ{Rw>0 Nu=n>bmNTE%$V.́I/9P&seӣ!!fl^fO3E3IPXemRITJׯyiO5]bB饮ţ19UeˌOQ+il*caP^2|YYXSP ȥg&[~w7D?tEek 1F6JױT̰؈Jo挱?!6>ӶtȚ$fSK0cn_0fM`T΢udC:dd2n&(QDW}UL8%>MRejC5w)s=51Bb 932m zWq sɦ \0pz\b. /sSz%9ޒ;5{<;t>i,A[y_[uf.֮mݴlmk)^pwKb #ߴڴ@}Gƍ@U+߷_>O>36A#.+w3 [ PG#-iNnQExb uyNbZϽ걅'aEv>xVd&kzz3Lj\t`@ v>?5Et[-~7q:< .=2rPp(V*m?}s_{[LT?=Neg|a1{T^BEE,J=$=$1Ur&m)x4h@#U(r+rP`1 >3qD~1 1^(==:w+aT(qG_z*95 zA i2\7FoEwzED48s\w/ӈrFPa֋5}Q~K92ǣ*MIwݯ<5מ:lOׁ*;륁!!TARS `ɆgB#ku}:Y-(*D3fa8G+Zg6{KؚS8u B's\7$6\_fu`< fw]]kBM[,pc-"+uCH'w;ti?{XU?W{-YNb'tdM o V)&P(!$@vBى,{=ߑm#{<먑>zQY}Xô狈264 %bo; ٘""Ve֟Қ^J@76#X+>"j YzZі[%tnFBr.pa0oB)-)ĜrKY:jAwև⹲q/ 7vj;v՛δ[ tk t6~[Y6tk6nd㚁o" 8`fXG(E!ԫb eS+jK7L8SW Ym甔lnn@K.{l$PcPEpsp"b 㜻CkÕpSa63eIpHۏ ߼nηmÎ{՗ڑ+WX֋"pq1opEe!]_A,TuļfJ;¢;}[wˮ>?K_v@"0X2߆-L@nr#D ? W8̌prR& ܋]F%{=?|NP&阧)S[ qM:B"J=LܿM^(b99C4kփ=/bRԵf-.]2DcOb½ /o 9н>ҝ92<Q')-~e\"bl/b"1EIY qׇCr"YMrh':Q &?é/:kSKkӦ )ΎB8J $$..]6G(h}npɧ KiZqY8 w;nx Բ' =s &92lNIɴ۩_D ~Rvoq1ơ"# '`??Lj?F?x C'"sXPO{o<8Kۘ| wbmW,D9a(j"rc(.j i־ "*@Т +ӔK-"Wޝ@)"FcR2 %xsDX!ͧf;ցK@.ǜ0~T'*WK.?s!I07R<<Ud5[~:"lo"G)bC;aOPW6D8XM ݸxkzΧOՉӤXZ\`e%Z{N9 Wjc*= i6DĥTte\;[ >(lAyhzIҊ]L)^{{D__c訄Ok s;5XwJ0[TfSX~ 8c.{c)FT]Cm}v47d9$aWC#v-lR6͇K.١n{[Ky.>wyܮ MY*\@IDATLx/iVYzbG_}_^} #b -A2*_E++|~GWEJr")8Q<ƖsWͫ2Os+{oӮa;\X#Oi9GF(2T"A2Y+#v+¢`^#NWXS&ċZ4]^B;qTA]nH|[ {w&w2.SX`Sd[wq0>&`~] \X<\Ez*S:D]OU/g=f'F[PzT:]A!Tۚ Sk޵N=r[(t|r4'~f"^c6`'m3vˍDq \8Clj3^ԝ0nX&9Ѯ7'/Bߚ=~aK[ vq-2P{!6?Hm*".;"/_ōo]rUv4Ĝp텿ʗ+ Ǡg$z/b4woy) b{=! <&|_qU@}W7wHHoJS 3Q>N Κx r Q <<)'T0C1"P ظň8Pq= WeAmg{ϑ+(NL>_=/jLn߹rٯ NO: bSsJsK1!8"+, FO#z“V{Eg؊eKt0~ `P3; EcӦO_gg?K.>nPq|kj׳yD3L ÍPoq ka0+M5G <nJ[ǁUC'|GI2(o7>{Ȼn`93%{ܻ$dA"}} D7߹H*aNj§oR4W " Uɱ\ݵ&> TI{ɪ%VN~H'J~s?w7$Jk{a!"d&4-8L <#W78*xc~KsK?=>Ғ8LG Zg|y۴!LvI~#$2V)rt,KckVIёzFDoByއxx/~T_,LTi. pg$3񴔋Dyո/y*L@5+Y9gۅKOYqhKn^٢*;f1k[}@lMLcB: `Aas/bn:]H̯TeЃx38xMpoܜ,ZWծ]&W{ /)a Dld\:CX)OL"6׳sD_cCRbf]2c\uBRn+nŝ}yVWBAZ0_Ħzפ;()Hwx]WE1C7ʋ8~^}'ltb/hFfcK֗^y"=ݢEN<ět񅷼= /l tʡ'"9`FPܭ\cguΆz|DiK$"P8%i ϮvRS"^kqfEXak*ntcwZ&s^EfDDtk8J|_x=R*%քazzI{\TD(c_|#"e}+]/SAҙ2 hS"VtbMG D9P fu4[N^1t`O5ĉ>Q+O"g(A^qG|aB^YQB[x;kl&uy@P S8(/-AaDK㰝6+@w8G"d@"@,#t%Ӂ.3RB=*a}zׇG>">OoYu!T!~|z+ z;g $ ] ~ ܗ8=G=l,Sx<)*.;A=\:A7etDIOD_ t7:Z*ЁVtEP`ɻܨlB68q`70XSd4,c6nL٬2Y y;4ie}CV^xq6._}P ـCWm?yߒ%K_v_k9OMw\7,|l0JܗT"I4ok /V5$>wğ$@#kЧO!. |&IPʛZ61'Ú{MPUdLsF 8qb4@ kZ2( ߸0 _.sCff$92MJ"6+C|kh /Ī"vC$fHVci ZL"Q0(5 zjȣN|;y+nit4SQm{n3p dU8ʇ7Crd::%9:(gә\P9'TQ*,6)u1/c{73eYXw{B}⾿/čC| >h19N6>.Ok/N(_nO;7ÃMGIV_V ^\1LF+7zu>\ ߇ lГ81@元e;72#^ºVT{wSh$u[ B'}NZu]'7/`oowjj1nYx;BZ(M{-$_2j|>Mo==N*>Pz_]sl1mfuaKuze`x/jGB(n ~B?#S-r/#49OMBb]W'$CP9zU_7_A\k9;|B yɇ^QI^ D$wl֎?<{[>i3-'wsZF syp/#LE}voC iҜz5:W"*T:wu y"}eK>zmܱh yTf߾= '鷅`x.Pz2N"TyXPe < q*2C;s|/>mp‡4.yn~@ 9+~6w9P{N=o7p6blҦ54, \y\\^2D'zx6uc~P`VWfW^y /ZKͬ*MCHu \3DO`NE-.oG6ZS@YC&S_0C k-R$6γ_x{x#p:2\+{pd_#/"aWmqFI0} LQ8ӎrY[',Yts믰۞<`/<?®op 8'CeA%'H.g|jB|u_eeXg#7r Dt}CUUZPpA2Nae,h{ܵa<#@^JVVNǞ^pF9C^Z z˰{[ C"ŕ?Tρ+p;G<{hf˝ Qgo?[hQĈRkBҾ=]6VXHƂ_$8qIrck JL8eJ38'[3%T9-1FOw;?a2ߎ_lT`A :Q8,})5Lsb $&P಻/j>am]z^A5 挤w;05>Pb[Ĭ#C@MZPD+{-aj^~U'#8t6l; p Ň_A ;lBN$KmqϿe+8vB59-Fk3/̌Mf_gssJ}v^58m~`"qUS.`Z?t~Xp#+},• v{llsU_5W|e=usU~ m=| ΥMAeDSkSWc}Ys1}K:a8@ Ae^P\NifV=Dͳ+t[@AdiXgN-P #7Nj2"ˋwZ~/w ࣴ˞xN=-jgt#r_.%ogw6u,!0ʹET:tipAVn +F2Cv#̣8Pv nA?pYı 1!d)C:ᜃ*%ׯ#5q22ӓ.ΊuNE*|9&$;nu6ni/bkG"Vw'qo} v՜>0bepDy42yǞ$}Th!..rxaa+clWL+@q^){?ޱ&z寇n>|tvoD;dTe7@;sхճ1P*/NcYy/޶DXzX/k,_(gZ>͡ޫ4s[T2*iWa/̪qnGw;pq%D '"hh RYf%$UyqSi[MV-Gl%8nOᵃ~_n |0Eĉ%xپ_q9D.lpw A0C?thGJbLc Jq;؈,jͭ[칍_W\F$Q[^qN[cV aYnz*A4a S FãkI 9ߙsڰMꪫt^تĕ-8P^Oֵɹ ^'H-zK(i;XP<^G'+x}ֵTΈބ|%=dI-sWQ dNT&wN\EYPXimm{ ҕl,c+:LQlM}LeNz.kWNpLYt[E~>Xݾ{Y9}һ҉$/rLB,wkmY).4||92al<^MXP8]@C>haggڮJv0S.khJg<(5qI `,009BR*!è]>t6dpN!N)g,޻? nLꫯkQW/A"0eIŃ$ĵpgDqBOS=a V|3N Ɓps qD`SZzT=+Y]8MQx0ix꛾Oޓ͠e!k043q=Kԏ7`ȅ;Ԏ#%' |/b|&Zq^' DSS$\ [tQ߶ `p&z{jmv̒n9\`X3ߨ"8{!2߱E:gWe+jp +H+Ü,˙.Ee ?]]XZj۶m {Т1˶ˊ!8,}_%ydrs~ !e#^7mN5sX@zgmٜF9zg%gddm☷T8\$2݊E!wS9fқYxyR4OyE`Id[XEU/WI4=bINde{r=P8(cY(?>z W5)x/Ne6]釉eo7S9F{8S׉_524Az&gж7ڐTqhrj'G9}Hgp\䨶,:,e@, pdr4}~K+7If)Kպ 93t1F(lFoȱ̦ t]žȜ#i8фxO=N J#hM</vڽ?I`q4HT#DyW .N:"vb#q/ /؂qЗuUg$|փ0mvr[ƚlW] \hbw?Dk?1ڰ5tRoHxbxc+jORu1&n\"{i/'|{[GO|*;v}Ћd.ѴNQZ"?Ԯ{Ztjt4z7!~Ԛb9eFjo|S ^?xT$8 Y 'h' I)`D'EG6i&D{dM-u͖Ν^,N4GO#cB?"7-@WD;RJhÖ-?[kyd'OZ~˅ 5+wB |RIOΗ;:x5ĵ D 2:L? (.`AAuv3x^yZp 56{P:+ϒ|{hY cIb_DM ;ᆌ832e;Dğn| J8XxȘ{;_\EeM gȣ,hrTpO2NL8FA1^eK_{>u8>(#<=;9>Ms{m|qry1eh=soꢴ 5Ijz+}}z)PWq1I-%/]_gW.JΟ9kM~H}@Ȋ'O9і}v 6SG%ٵǢ[hxZI8FOu32/< ?=-`a`љF>s{1L)CN򩇞6Ws4i fq q],+])hbKI AY/K+3;봫1o.)EU^ a1yۭ #-(Mwhc.@16lV~+ɲB@>0_X17{ݏsOozLO3RhŸ^B=asu&HۮNK%@FEcjսt,@xcN GXDdS'ʴp_nנjj}[?SeϹwzϜN>DXl@MtKdw NndwVVޫNU>+g"oV2*"P^'g߾+>3kwiijB(-._父,)6ǭ|za% k,(߆ Xp1Fu+w_Dn%IF4:;d]lѶ}6s o~Ɇ͆OYh: 0^lN踉Tpۻx8IzewvV^^v/J tăPUπwrfĶlzύvFcП˪nKח Aun^D1I M0,w`3~3Px?sGu7إ'wz8&d[m:,/5z5 =vejZdyxb>jjp`ߺ)VUjӃġa &.!|4_G#Z͂"Rsl#۬dZﭱUE!=?=}8mc=f^y. YS[4Ƨ8ϋOW hۼyOmO&l8j cpl-(}8'E,^ q:$ǟq0%JZm-Է|0iH3LV/ؾXaf.x1^8~YS|@_p ?uK+ fgdѠ/-. g2<\/Չ x|C[:;dk*O?y5@*4Y΀LN DԔҶyi'lа[ٸq%%˹.)H8y>TXd,<鋇qlI'\^DOr>:!ʞ؃S v8 {1)Iu(r¢ .+t w d[Ry />]\'dZ7w>ah;n9h:\`5v׳Er"atcGhb!:֠T;[R~_dOn-X\K$Č]-6Cv8 { ;cIL,GVBlQ릎"4W"LKsV0̶VWUjf+ZPlAD%_Ik/t\ otVXXk@o`qW):b3P  nq@ k75apg R};oO]+u,p2phlk;CPD-~siv燙Cg*l/^:t6p'0 ULㅛ"p<I}ؙ:= $w^q Ӓ9/AºG$$U|hX:+yfB)F?QFضe˖tG]߈u:[' p!<@Q]~rHPj)*޿_sG湨ODƎR߀"M z.*!᝸|:#qNu\]3mq5o{JNHE|T}V]g#@N%5qlzr^fшm6xCWp IXu)QlxZ8puWFGA> F ;!~;HbŸf> >v_p9L)ߟ=u;Vp#6OGl"1 g>Gp"zi #.>7e VeGlM͜,,tK9.gw=1%"rD̊hj&O#恾p` pŸ&w "hŕ;u‡R٧9- xa8u w{衇n$u]~_Mv։95 *9yqto7i`-yݒwS(Z5Y_=vDVAg Z9_W :mCOf.,'DWVea(W#\6 zK|"߶r q>0uhDS, D;γ:J;ڌ==wWUnؙ0uxþ0.O\\.xXlbzX{LY%O y}WDMNCTe"ޒ/=GºҗgG;XZ⸢7ly*09#bV3[m>:705<87WVUTb4史ALGlg{]Z|BuB#\(*hJ|Ô[P"t~M n󬡡#18[#2xh%^Lt("{$+% ܵܖЍC$Ch,H!GV-Ԓ=pymmmί~mwBaܢK#lʠȗe}vQhm:e;q;뮻y5A"P@?O3b@|ȱD`UZ/m|@!lƤ]4wq|*TAnڽ1Eyپ鳈}; a|l%gᱸr>n]֚^Vx}?%W|%,u>ZՖ]ZmޗbC^Vxwp?tKltnK_g#\iC,i2UR p{bVDɬ3L|AĖː? Z*^ܶ89'lVw|r"t%NĵC 'O@/EkTIͥwf:X?85mFP>-*Ӂj HS7bYys󮄋`XyERKz_È*IE'KIZ[@CE,l bQzJ =qA' D*йYYv)J"^܇~%ec?ßյ8e֍QTA݆bݚD͉ʓEэ : @ ӤL*'3fK >B2"T2LDcdGΊŝ[JJPa<1pb݃F,..[`nx㯲0[377T'zڹ?v'Zk''b6up~$^]ghG w_mݶֶ#3ٹsywhcsHi%V iwKo IbH`ΜHo4]ˮ,X@H/3J D1ARLD=N (at*>"EFԠ R\b8d`H`&9Ti &ew;K(Y0L4M M~7 Ny=pD' i3t} _xu2 gĨ}R'6̇EN.л,fSfݟ"b*aA%"n )s _mMv5A%븱:NpWy%Mg j&!CJ$r.:j*Ѧ& "lY[x{1 rň7Y [Xۊ}n .Ȥ'(&W1Bq Q^ēDݭ/#E ! .2N#W)X-.`Gq1GB- #ѵO\faS17/E mXuOG~Qw'B#Q*+'x`4b!܎,ș BXarn prĈכ`n;fʼn Nz`9`DIW4v\xp]{yvm[ena}dm_e{vDm=j %NHǧKLҳ@>ɘ }sՋ4rSfNw|ׄTW_eNiUU 4ˇ_V:}ww\#'[ILπi |AQ-h$MʸrYTGZiF]X\kUpH97nuTվ'8> JƑĶeGbCJF'' ?)cAB6wig{}fW$)eP(QN[)0/)E(:oI#kWGUOe1t0e ^RA!&g|X۟dV wpoC 7'}XQ9gKњPՕ:hD7e#!&$0̈b{gPf?jHg+@~ Z@\`%Lud[ZV%GQ."҉{yΝmK6 ASF6;XUd[GKEsMjm}OX ?łaT i:'Li?*f=Q&A»lwIMAG *?k56)UXص~kd dkuDd<vklO)tK$JS>(嫪YGR?> 11Köi5!5 tgnA  lGRsP{·Qo/T#l' N8i{gwNW*qn}]WG3;# '7W~ fdt/_z"ppqWko]^Th%%pmn޵Z;2Ϧ| ?/"~ J9ipػ0:KW3>XS<S,e̱])H!楗ZW\ rrYayG Ó.GTյ4&+يU!B74.٨ 47/Gq;&B_p'gW]t,slEq܉rdeFiсvFnR'N!MSDuh>8_ةkOkb/G*HD6SV>||-_}(bt2 yv!v ;0N& ,,.NZ9 $YKG@: N)QGU#`7Q2q"!7AH V;B'*<$C _%822yx:ӄtQRofX OVAZҙ*,O רq\GFMֹ"E {ȒkB+]`=hCh|Z/F8}#If"3>tG?3?1c50ijte!RdAPQvYk/ڥ"J^ҕK戽|+,8,b[ Sm-5 b? }xi_nN.׺&ZȍsrO_f@z*8pH*19gqBǫ/<ФPat 2HIy8"5SWgK\,Je* +quuR+ȧ?\aN~):F'MA/^) wZq)uV_'bP?*Q #+jBNUG{TՅLiibJ͈ ա@ϰ%o""*!jJK0rmk/%ȽǍғEڼ@a $Gg ʠ=$w "d=?;aVt{'?<#!M9SO1 g*ϗQ6@XUVZX65H@IDATYi0 ۶wo:S8>mu~qG9LR64V|_8HkVUUb]e6 ~ KaNQ%KO8—.qD`yyHMhkzo~_{U.*R;(|/Y6.:Nu)^>-B r60ASݩ̿u$.WػUq 3`:h $g7фEus¯@݋!8v"u!4DT[?Otw S9c`8^PK~VFBB?yRr}ѶAnj dCc(Bm @Q>A},IGx-Js#F!^huU|y޻/=91{M"pm&N >S΍!,w~7`9Vwxħ8{3T\n 'AZ.J)-E-jjr\k pdraU MthD[:v7FKE33$=n]]ˬJ yŹ(0WR} ʒ#$b1 2"sčj.AG;A4KۉlBQ6 @_6[]~}N?-hPp Rꪪ@X3]OeRQEĨp,ڮ=LuaƆ tE<" )Zc+JBQR_岔PDyi\wv%EoH'/ieO$ jzq#k"DO.fg2HL8nHa.;OD%m&nWFZz/nnp2G!RLU#9X( >h~,/4Ȃ2tR"05DBIUvmdp hᐷ_DFp"&>೎GGsF6S v'W϶!.Ph̠Џ8uu#}67*õq3SilҎTŠ#yz+\ymjIFw pIĀ~\/"ĢO(mm䜷X.ka-0 ?9FJ\~ِbzH2 (rE0xtTW@Q~#ThO#m9Mp*P*1NNa ʄ#<=O8f}$J.[%vނ >a9%9Lw=Y =')Q1Z2,~Թ2OЍBF@Ir|l];veϱtee NeljEzMֵTT,BVD'O`Tzm|kq؜ȁĩHXX:y)pIG?qbE CIK? r畕:ToԠ 6K  F4 mϞ-N\QQ^L"_ Ѡl>b hjNG:iA-шSxJkG'GH\@HU"589Ko|;Pu"a@>{#HQ8Ƞ.f w/L Şчo<&N/\ (e jjQD|Eت:!b E DHĖUYQcL#J_SH|~lhSR[[LG4^`@Mw:HcN?XϯƶmmڅŶsG3>uacoKjQa9Ņ!<^^oe(TE8'l1mPU† 3,`M9FT"t@\Byah.cy9 KᄧE?fvYG?>1.%X2{̃#0>U݋8筊?qʄם &S|UX혋 JtN˂N \l2&Mǧ<wtД92~|H:l8 $N"AK28y#>lˎw$ԨFX,hm "flOp3@sV B% O )⎤f[~%μ4[>EՈn qAs%KՐK P&&uYYlȳmhj,2Ik<ݘ+TKUY詒(M!5I*dV@Qtp"(G[#tą%S׺ ]0D(-2DogCv~u''Kt8"+*-8"R)ŃUXT)rFShl1Ъ+G/:)C*awa-Z|ҕDj 3ee5/a׊9Ljp+SL8Pu_8s_.<5͉q#c_G q܁)HSY2?}cbiYjA;*R{TOvJLԴFt8G"hU Aa+>;\Qz8wpUbd1㷎I:n}XKLDVp$j*'|cӋ0.H97'ۅ'>n!>䂎} v I?yEB&=>хwr,[k"f%lhiki Q̾g_H ┣pʡ>Ʌ< qy12k4,sX?n crGN>op#;#X/~3TB ߜfg{^8ؤTVq+0L@1Oz/w}Y/q&]ŁV[z:Fg'U?7tT{SO GWQʧkb [a^b @ s@, o&8Ҁ[_# %Z8^=&.:ǙKENX|>^y T|~{ m0ApÂ(_o6a] %}E~->`: DZ^_Gğea;B*{$V/J\65Jcpz~AfB)&Q)I? ,*3۞wdmr{(ʎ+|9x?eZKWYSJ#8F&L"Q=JqkyE Stf  lJYţQH= 􍔘|*&xj,8D9!8^oNIƂ&7d~"}օE]u@*GEe l;|"o1g8lA#^f!lxǕ8ip\,.%Rl%#>c't'.\MrpZ[э/A=2q~A^)j.T%<)XGAp/ *B5x+t.L~~vL|Et6z$+PhgsF_"!4 \B&M{rm^m{zLJ8\r)\~ ,ޥl6e}pDtc}:}Mm>>t>m_,?D{#3tx+)Y"Ʌp)F¸iڬG-\,A%UVst'0xv6etbʢm_hSĩȖ41d Ǝ^y$O_>pt'眊zÿYg}KVؖ}VAz|+.Ƥ>3Al{\sV#K咲\1Ksחť#,D> >΄ lGmh, \khh"k|p+lRnϾN)Lk:~t|<|5\[{70o`~ =*&mOO"d5鑏_-P ҉p~r8Ĵ]b 482*YOpʡ[$S`CȸODd5{ɏAE)}V3mxJVUaSzN[D'{hbet\Qw+AqJ;ʆ.;;xw>dO߸`ВG@ aR/돱e+ZP7|qعH o0DQ Qt+Vч&xt]P驭C<-WGJuIJ+lZEbk| OBzZ&:&AoS=1p$ۚU'p-^;})=149M B ֳi2̺tc,(qd-"WeHGO,wKE-BYe(Iqtlr92y^|e:hGJ1ھ9rc%Ҽ렶Po@ f5o`@Kbc8%o H!,u76%j_p RnƷnD;񆧬~gQefun.m"6<qzZ%a?u˥ t qЦLg'QmopǾ>ƭܹU>*Ȃh[l%u,S3QH5 '%8!.HT^9 UvǞwQ]R$E;S7T#lo魕I;0N% ~ ;BgM&h|9EUL I/Y~cRk^KNjt9uiR T2gtaa.aTN+7ϔ&{qe Gs)(ʨ UD3!P U}4)918{lsA% @3;F+eBw>k)HKF+:_J>U.aرJ_6.vڎ Pz Fϲn %CeV?V~љ ᙿ\H#p&gL4^|$HFDiB%=]~u'>-*[#rVDB6!xxO'bo<6pgW?Kc.))j}=s]?[&V:kHD` 65TcO/l3B]aإ-ٗ?;q·eS :v9Ldъcg`׈; 5@ >KϰzmRO;~so>;>*&kw^|tW^Sk &4t`6?'tJͶ|M_vX5΃ngꙦO=|6- Ǎ~i+W#Kݤӽ>Da4nKE![fk߀lݣ$hN͵Â4OA,4pP1pzc/‹I7 aG!J;äS%{Wäzx@x6kMIC3I/.B<WҖu$@UxL%N#;2Yv7n4[R .f!YVe'nX ׳_G 0foOۑN;-q#c,:e + ],t^P, qD,N/zd+!&3OD b{&q@l<ƚ؇\qZ(lb&9I"酪2i-Ӏ܎(&\ˍ6??OU6zmO5h 8tm|\;"cSkWŋ˭ }DtkҁG =fr.NjZA]o'Ip5DއHd+A=VdanُQ@nP8nN?ĥl}i T~=Bќ )r_O5D-C0̈}k}-Lg3Ɲ^Pg'0 ;Qi8jyB,u̝B) tm9noc%L1CPz;(">T![Bmַs}2}Ox.Pfؤq^-U0`hG؋PGيq] 8>GAͶm2\tBF' Keq2COWZ3kŠҮ]MR9ԎTbo4HE:*ݏ"nvI:,vawē .1^Mng:^ @j-&2[s&OV>nth&TӊW"uoo|쥪1pׅ=F*i+T 54h!}#*pԂ:6!t~िw8o{{sq} Fh,-0:g\\>Ac3$Lzw>۾e3ɀt0tD2KpZn﫷7X;}vӝ|BcV=٣<9܁l@ioW_~)'`<1I8d ;zB6}4NИ^Cɶuװz9s뮻.GE|B<ot',(^r o!Fp!K|DepR^|v}]U{%tBҫ@TO|>E? E @B! !dI&{}iI̺˷{i+E] re/bv.a3:tnUPh{(t",k=fBҀ7=xLX0(6a1SVnpɌDdl52$'}N~JmQCycWfM]64C& 0+ccwȥ\r2ȊE: @:ؒҤb$o'8;hi'Ҟ/cff^prBG9;3e9Ǣѓf/<`x=<)-͗͛W'˱hrהUk3Ql>M"֕R}V$b6-N!nO? 3;Bk<'0pM)h@ aƜ֜"~_,TԈ3QMGp2h#m]B9N%2Z B::c)yr5˛,l,nzKm;MtVkL`2KlV"rw!%r0R>6xcO v9~y`pm*kKog߹k 02iii]*_>ۃR|Rϑ8'^Z5FE6uX>6Ը&nxdta!TGN`7p vZlpy3ܡ_2OK)+?{<|lx_}2zLcKg/W@,*EPv.fГi̦3vxv3y qF 3;"NRdNu|`97[Y+Gۭ=G̓D˙p78u?M[b3P'KMm46DKU0ڸh۶5X(RX8)c2O燍 MhxҰDTaLsKRI83M_q܃8DݾXdb.hIK&nM@s.CVM;ĥFPF4cי6xL-Z(r#;|8s1V.'xue~O'ޓm+ZlAe X3Jr%'cyGݷq\/_ j` h;NJp@.KKBU 2[(` [Y"_zG c?!! qMza=r"9*3`WJHzqpj!N5cClN̗0Ω䙵vn{=a; "7_~F `/"FHgYl,j4q91`. rWIx4Z.BB$yEKj ?wP!Eb%;hKԗ%"7l!I-cH>*3Qqꭂ xBkH dg'xY|.\k^$uP:RN;ŧP18c99%iֵZ Kw)ga#U_gwt0vԱpC1k@~"W] _0U5Ѯbh?l;rX3DZCxH ~b=ͧl[)t 9)Q+~k "'2qϔ_[ynYz_X>ތ.]Ι2Yrr%gJnnұdZG2~fs4&##|XC4?pjV޸=B^"|ׯ*̺qN$΅pP8n*4V܅T/8V(58GRz|줅!HVcWx\x֕^36r2F+t PCcCO\3K&tqa"{c# .O^OϠ` l %ó+;Q׆m$<2V 7K}Yq?2,((uFb훌! 14a_f@Ƨ#h2s`,?3]|a0\ek.X `!i<nGBBذ8`͛V9Ӕt4Dh`smq4IqЏ UP ITcEN3dʟ)^cU)x7j|mVbB#Bj` uJm^,yK7_#_nYL4k,cE`Hńܜr'Muc!)촑iGf& b0@?5bv!'˖{rr1_O/9원}-F BK]PUKQgZon<2_r۽z6z=Hx|b>5Ƌq=mGQk%zXhZIHn_H`0t o63z{螳p 4tvK1{XN/*u2q:_)^o ͶQp/dD׳}e^ ` >BwKK/Q#`;1ZHը1D?ӎmFnzNٱnY8:T!n`/-2* o"\tL=hL2_ cb$FJK̟#߾!BgM Knt9R^V,[~&.~Y>m xg~OՅ G.Vwk[+\F4~h}ٽyJi@KeYw({VWʆm2&q ~3-ɣo9C9(iٽ Sd[Ekg .u@'a6|3V6?{OwC1&x;#N% Bgڍ&fJ%g7?%~ӗRa]r2+𸜸T1 Q 垷FW p q0b?l@[~9 mdL1 `1 ^%V [lVL.;޿ лcJP~Z/%hs.dвҲIW9))==c'1}q|̩ܖG?<#o=tCEۑTA?á!l\-\DJ}pON{%oOYaOЇʚ^Ak"-y 9UX`Ds_Ŭe.pTED].;J Љ->{ ko7/k 5z`&8 frdP11H7!:FJwV#6&F|N$ 'Mt{%w-(Ssd>d;7EYV8\yM5Zᔔm-Ŏ.YRW_cP P+0ڣSΈ<`4j\{n,!ZZؒhYjGY$G-c Fu;Vӗ1@360oryeLR*woșPYIJM bK}0ʵG;o<$;Nsp lyu.MX܌_~cr#%%5_@;݇_YZ_n_h0+$"ΚhB]f0p&DA;XgA@XZGKGΘ ā w{BS/ t+'G0'% MxaXa_6zxi Pa۬ZYl˺ERWS#zp|:J'CrttCs"P-v߈Kl[tFKm޺D/"cXNMULHǠ(^|w`b#Ajiu݅\A7 >= MY'BVX#.`bI܆[e54SР/2'ߓ?1mh28M@] k33лAKU8ŰJ)`'aTZ(}MTϚܛT_<`VDMd1q}}4D6n> + nI%adUh#[ENԭS50[_u"'E+%|.4 'ަs+O>Yb/jJgU£d˒v)Vh2>;b(ٴFCE޲%hX9Q1lâv~|l߱+),zeOFĮjԵ;='sB1UL`T @t&d "m*C}/at_Q$d[$}w}L"[vm.f"7`x=Ν/wIy?qU 4PUlC}w)]/iI.9 l K uH""BϬ/ܳR+=ILF"9?*5!鋁kVCA<CcʼnQ9r:""{q̣A?ce`:=s2Th ^hYl.8(%nlஆ"&uW^)S͗Dh`U DFa ()t\bM3iQ{o +WD>A?ۀ&۪aV@@yMV>`ŬHw咜2<{I||U;Vmgqsz;cMg瞒Ji,XCE;>EM t4UOOo}DeOJgm߸^%*JHS[8w~76IKEAWR Xm@ ۄX7l+~s|PrRQg[k',C-If^u3#=20@GȣOz 3a/-. eޚxΘ\(yM{_hjvg냺6HrG7~}~ٖ[=X׬/v_]Տkf.5(O6BO 24.L(P"l 7+07r'8S##ր:1N{$FǭO(خZ Ȋ7#+n;WǠO[?*.w KW䎃YГp+ `9~I*D9P$rm8k<$lD1 $55O֭X.MR\@*aPD8)*./S`%a4lqAC–-.ޱDl y҂!6tʬ+ݤ;C Um;>OYyXii9>C(q Ɓ#/:ib`-{~.ֶ4Y([Y2Mlt/NGrwLd/']GQS)5c'e.X1%J!9 VV{B x]E]{#۾!O̚5xmz 1 L'^ (MMm:-QQzU4GuW;F{z٥KbyynbB>85dߥ!7b̹ ˾X\99RÄ~p$`qMw8aì (2*}oy}=QMI$eȎMUzXzzuAyD[wf |\sC_hkɖ|l6^VX(yJ#֣zbHwJ8rGK#5Sh6@IDATSs1z!^^U/BY-f2W&>3JQPSXTY"s@eW7hrF4,㳝 |n~\Z*fROVl\%.5GZ\XeE|eæ2IIm%X\T+ f!9~Z{v;y6( L>_]\.=J?v9fw7懲ɉge7.!iKFjҋ߻^qq1>w_I)`j>;NI`\fqj Ye2S9 Kނ-#V:F=qs_ƭ13‚(yAnk0Mt#H<\VΕ/T,FhaQYG`*`+I˜7H@dB4prEgr5|šN+`-qٳZ`km@+54Taf\|.9`4v3#f=@}8‚PIMmB,#ntdc $*4H,wɠ!.T2Ó=(~4zU`Tx#U 4BڼCdj9 1rl3(nht,ȼ@|m%I\Xn ឳ.(}.P5ʪ-/$?}IۅIU_%0V8J?SSdԉ7fp eP˔wr`PڵKnPg.Fc]#MvoC0RVwЂ ݷ}M 87~RXBAvQa"Qmߒm-eԯ`SI ,`dQ=XLo1ać&?Eso!铤k hAYqЁm(uH/G!{& !B%x@^<2 [P(/{J{D*'IVjI.Kg?/^t^q#FnxG5egd}\K W~:OsGLAJ~qǫu\=L3q#f:h;e'ɬw?4~f'$b=ܤC.SJ(!/W V:zPz=]rͿ[kO>(r͗2 U]po%l0 [̤XGW6 04DǟtOZcYtbcn3qnh-+E=@&B ;+!W A]]P,嬒N iLă~G`]ttq`RscO$@bxĬB0X`[yRM9H2[o-'(}X,}R[ dž#]҆8Ņ{N%652_[%1;N*w;1IcH߿!ʥ̻ IEኝi'F?oqRfvLMU c0s׿$7~tb@-!*R@EauTAY$^sZR7w 8|YJOΑISJ6. -l"*=v23gRr$,҈z;H3J :ibi۳P佹dҤt!.*헾(r5Qb$ yhqج}w;[Q`VmLrϼk k3ve^zC!6*A;7މ_5,9QQPF ;vPWf޼+1.Rf'P i~e |S "cq}u%(;]\sd8(bw i)3$) -oԠ`?'J#UBZQ͢%6|B*P?ʟ'xBR&yIR^B/1NaLtK{(g> LEo'IJ꒪~-`#T+11)kΖV,g9Q0#l,,nA6bHX~~e&:`q:b/I]14H9X 0tlg^oܴ8)~d*F/9{Rj2峭lUc1Ь7쩑[ƝR Qׁl DlP?ODM#$o.9OAD0g;٧3݁)*2wj81Cvl+%.[0tķd8P~y .Ͻ?GvmITtf_뮻{i饗fϞmwS*1Ȗ.ِ@EřͲ '{_"p v!(X``? mPfc w:AmE9E9"CD UwTEúH.6G6^qRI Jib8\'pF% C%R )\UOWA>bwg$3w! ~ZFhu&kb@ٸn3*ƫՙP+/gYRB0 hEe`bcHo[N7ױq x g^:r{edʽ.n,Se!Pw,+X#緰B &䳑emNP[X,z,%YP1!uY򍿽?duɔ)YiUt\arHGt& &UCNȜ?5_"i,g6{TGeS8>%o~(';\3gDHXn`0t;EI$^l"؈/=0\\~?e8&lw06W4w ha|=)~$xBM W Wm@o 8DÎ)C\dJ J ʶJ'X΄7d VrLK`VZ:MvqM eݒ.(!NI;up-۶7oK _lR EBK`;GVpp/?D/:>Ä7e^Q"ym^;d ?}cG9s0Dɤk$zRp.=,o.,&;1 *2eQgCn ;: 1p\1}Uc6Iӥ_`tvwPF`/IIVލ1 ZGcpϹX KdJSmTo+"LΔf,nt 8 Gocp1ַg)%% kHV6U ioꔸ o}|9\̆b Y'fd68@ 6 #|8_%dH1>ֳNhW˼w(K"؍ufHRcحaQQq3+seIXF8„\N3`oSx#·:{+W_m/AÛQ{O kvsO_&^D/[ :&SǵH#x+D|^ꎗ8W1=/&d }g7 _00L+ ̯vҷl@堭c-_"5Ko_U~舸$3vu!"|X 9%*}&b &^PCj Bxs1 G8TRnoU,G}tdO pؐUX8)Zkȝ>hII:jmi$FOhYr?\" E07ݎ1d FsHEcQTCeه=}訶٬tEԤo3#P0 q0 d:^]9WscX+I*`ڴ *'V?V,|&5?!aD4{WWC)N5~>ƝR^$99Xoqػ1aچ==X( quo&/|JHJY) 0kD,vEĊ;&VCH TBhr icmc>K FXuJ? 7A\mbE\ K``Y8{ƹTK T6AI9c>:*~  rVO'䉟Y4*X8 ɵu`kH XE M]Ec8A#{51(bɥ^dΖ#ߗR T!ȞIO5&֌ϐlĭrXXQ.P* z uTl++ߔ$JG|4QmCsOuuͦ7.]*1<,V`FP"lYЈaA6ִV~Tdeb?nđQe;=[X{d2l*7 ^d҄c2Kx8eRƶĔk{14&aÆ#NbԚQh '}R:0?JV`U R0Ra*\:s]ǰ$uF*]!PKVKbE>>,DRD*JS)]L`g;QڲP)Ŷ1FHBz&G0AÌ2/#R3PXSޟqݲ$kQGd}⇼llaqàl1 %}vhiXj$2 )c(;;IMi<8:/X㇗I]nߝ$w/LDUXo`6ְM!q) y 7 79DiGܾs?&ՕXIit"o%%EC(N6m,yﮒMH7Vmk`1(pE !&upozwMGc}6kɒUrMK>LL sc=MpjvmYq!Cݷ!k˟z ƅǕ]r_ܝ:>!1yqI81Jފ:- < [kމ8+lt(솮6_LI2J`kPcaP>|\kJd;k`NnH?DLIHI WIP8٭n耂pD5P5ec¹UBА]jMgRv1YJb8Zf\+cOα!&QalkDE(x_=< Qd)! U.@1,. iRg!7#8&DNe% 8@t>uA_5U.%rIGIJV 63vӭwmM2My%*{|gM9%!V|\ͫ 5ylTVb2ưCbz(4,BQ`氃%] '\$# Pa(,zw뎾sDQ<-b.*!"[Rbq??AQȋMRS{˥gH\$L _BōA9L臰TЅoeuzyj`q& c2:~L !VKѷJ*6[e$G%er܄4sޓGq-Eŕ(ATDTQ;h˰h?NÐ(l[#>3>d&"w>صj}w=G6RHm.Ks$R %z|@E<[2`Udފzs"oaU"l$zV}0.Ԙ&>6Vd1dv>YEBqaoy5~&%Ep'K &dCC^8qEEAqB0U;M(K~ɉr qO?Ys&KpttA]3"B9{S׼M)` @(TKXf]B='mr2) *ús25>02E'GHDT4RؘieکJfX:@#&ĦWT&{ټNv=%ܟ$Y.c ~}<4ÙNݹTG{o`AGN`wȿ, ŏwa&B\//|5|'Ҹ;DDC [+ua^)hup0Q'(!'I{x E& ;)$A0 Dɢѡ;Ì}0X*:[%^ʥRk2\4nJW8 ]nnt2Z3gàme6:|<~4ɞ+0f``3˵iratE5REQ 6m2ٺz,}cǃɜ(5XٶN>43,b9_:o'%Y$)q,T4FU"qy  ETf{7օ&*++W.7-'RRsNi}qdNىIDVʆtO^)&$,ך@(fL %W[KWIzTԾA_Z_"`3wЈOx@nqK} Ȥq92Ub#%=5 ݱ RD!X,v#F ,_X0;L zJ"SONo|\$$FctMN~ME"&CoOQ-w=yi?{rk7Nr/$>aPJyy%igX=SmﭧvZGG,Boq@ϙ!n(ibZr68Kf@]xDּ.j,n'ǯ,-==^#-SelPʔtwTvb:,ݨ4ijrweeI8x]''a ^ AY3o .At~J,C:[]` &%z&ڛ|f4ҥ++ӺbD\gM̩vTV)Yjz & 0xЌ15ҁ]6DVvIǪRWS,1>8SDCĎ"Ӑ,c:Y`H Ҋ}\}i9)7]a;jDb,p P̆ ŧ-VHjn`r|2ٶvmABٌpiY G/Db09$KtbZiipxQBBqCeYn4tcYP0E4xA@ 3:GYގ[ e 쐦bi%;eBDyrD5c;4ÃpA90J(jIIZ]m[+ASBdW]5;=- 9oR}>Λzrg []OD19"<\1fnh/~* %#+Z0y'-! $Hn1ǷP0>9+=6Yy6cUK,^qI~(;+Wef2q-JǷ#D&Lq&i0^l+l}$MdHX6C1{]{}aPe6 z~Dt7q+=t٧5}A .nsD' zĀ& Z F w &, {`}ddN2ALΙ+!Tb{aۗ%ōAJE?tW=. <Nni+!([N&uE/ f]a<`ط!o2f1a4y6u> W {Y-=E !x|B/ KdX8>Pc[WctAa&xv?'L8S/$b@("\ [~S<1`(P jƾ؟Ԑ͠! qx7NE _$%@W㸵bD Gɤ'²JWrCK|Kee޽Yvlѣ z*uwƱǗGDև,)t[1Y66a?,DpM9_m6Fc:[ИI${t_HVC\8רx`k@-r~i|@Hq;|Ҋ0$uJ'r &** grvSD<5uH*ݷ#ɔw<kDZޫr^wM4cE4,]ktϣOk7aU_+ʟ1luw%,,šs fB9`ޡ cBz%3J"v]Ļziro`*_{D<1iyÎ} _Ѱ "Qa}X ->փ`IěBT=*XYџnI Q"hJ!q`2KbKRuUzaLY`OF ,.5s=Պ1\?{r?À`sBq B/Gٹd[qfSm}^y'!?&dEG {6zm0@:w֭\ X`’ 0u,*VvX?mi[}_5W,rޥC0a)wN mC9NJ/ȇ"1d BTX&un88HgfLv)j0qs)0S ːj!r@hF|26hg-CXMc(D`"&V_/uP&\3+3k~_9~CG>g>L!CJ{(##`-t+ (,\kDG+ 7 \0U`=P "16C-(.;k|ACWr:J:k9nlå?nȄp qft 9shDӻ` S/!y}}ߞۣ?m:]6PPsKN hXItSrVRP6b PX1FJ ܎_ofsFhk0>3qeлfz7=4l<푙J5B0Mw׀7TXFTEDZ[IT)d6lS1{ݔ/2) Zl >A?n!G[?fciٳ S+lBk_[¶wuYy]N=u&LW_OY m͍#GoȻe8HyH**uG|6d;{tpz`p\LwadG?1& tQ8+Ћl'$Lr/hGȭonob+O2}C9=Z^΍PzG֥='a_W6%/ MLXzg"l;֥=\ &R ek C><}s>/aپww X:;[l|mfo|;l[>-ThԀ"àrG䔀IT$|78L;J= @e8)X9ìQm [78Y$' G%50fx9g\fQg4ӱ=:%9R&O0y1ϜyY_M?f-`[;w2h-yw7VMt{q)պ_, 8#amLߌ.|A|*U7d1 G\`[Y1!*V1y秃 L)~эu{#Oޖ>C"[Pe7hqŗnsg `V4_o؛a>47?^ }_~oyߞGLug17AGe@0RE0ͬk~Z _GB#!&q.+nu$ "2VWMtԜS=ݱݽUQ.*J#`Q;tCae|*?+@6."2W+(uR7 Jׯ@:n/{71nsw/+V<_ 1mDRN9gț.Y92|瑌-F 1y3`fe\\h0cTF>_7xn趿yiMGH"`V׃75r@FD{ޤďy}(Q&7>x̆J F 1zʎe+g^%ʗe?|x%H4G+KأL%H1JɁqG* _1RjSJ? l/1)+I`*>vZ${?Ի+GY(%Ȋ_(Z8~ ~ l9?ן ̷Am?ơ|.x ػ堈zt)NX0<6$Ƒx-88ۊVD&xx7+_O|x7vTn fcL<3V_;z!~ؽOpæ<~<lCMV9`S."_Y#.s`*QC-LG_\5elmM8[T*#sQO[]-Suo 8/t3x-T< l74ĸQ&'ZVI`[~YƓlg߶RƝBx5 4_8+>`/r(**Vc$ D` (vRWW߄YaTDF'%'yycrץfmm׿^ eԪ2JW0O),#I_`~-ڊCF VavGH':t2_9 PWLxX: '׀Y7=Gy['#~أ*l`*~m%1 w%oFn6^7{\ب ~ <MqXZikTjƂ-jb:26Ec ٴkǾp|ro0e:Ֆ ~hS/G)3!=o=:Wkau1fq9a`^[ƙ-󙿴Pf+ mL@*{*0K% /%ƺzy 䝷_+.mj  ,VʉZ`푑]CUؚyynjlNfϖQ\%-{+Xm8ge#HׁXB.Bo=~+Np[j3`J #yeq~(`o=z?s+:K_m1?߸J9`K/{H}1  .{21Ҙ<rxapcHmnXxב/-4-6}LG]!6mxq p;OxN[^ewzydﻌU`Kө,^veGX6mjժ~Ls'e=qY1w-{q#@$6_;t@+D  }7MA'? feʀq "md{*\`Vd+g|ϲ ã/0V+&p-6 b yב$n2ne^caom#Zu^j_gu{DN_+w6|)`^+Ϧnd# 'ynʄû L9|&0n{"k'oeڞsi 1i'q/?6xti~<ǻ宻2LJHp9?Af@hx 8(`ނ0{ ͂[X6O  oL#ȰI9  f7$0tt؉ \^d-#H1uy_FK<ְm/[b vha{kF(GZJ!ra˸={l 9lVH(G-`bW fnWf'W !Xi8Ss7ROCAĔQW-6lƣBċqƊe2 ̣?b3},k-i#қ;l7YoYRys93pz1droeP(C(ISi,JS ²SyN(T*vYQoS- >wG*́J̸k<>d*2Uw"-5`V8 J?lbQA'xz7ޑ dp48LCLiW{q؏l^7"3L?"~lY&y`BA,|B.=@%hχa^z]{kE@8諾 ;zBF+"("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("(jϩ;IDAT"("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("("p!vy4UIENDB`mu-editor-1.0.2+dfsg/docs/release.rst000066400000000000000000000246031341747546300174630ustar00rootroot00000000000000Release Process --------------- Our continuous integration setup provides the following automation: * Running of the unit test suite on Windows, OSX and Linux for each commit. * Code quality checks via `LGTM.com `_. Mu has an A+ rating for code quality. * Generation of installables for Windows 32bit and Windows 64bit for each commit on our master branch. * Creation of a stand-alone .app for Mac OSX for each commit on our master branch. However, such automation does make make a release. What follows is a check-list of steps needed to cut a release. User Activity Checks ==================== To ensure nothing is broken from the user's point of view the following key user activities should be completed on Windows, OSX and Linux (to ensure the cross platform nature of Mu is consistent): * Start Mu from a clean state (delete your Mu configuration file, and mu_code directory). *Outcome: Mu should ask for an initial mode and a fresh mu_code directory is created. Upon restart, Mu doesn't repeat this process.* * Click the "Mode" button, select a new mode. *Outcome: the mode selection dialog should appear and you'll find yourself in a new mode.* * Click the "New" button. *Outcome: a new blank tab will appear.* * Click the "Load" button. *Outcome: the operating system's file selector dialog should appear. The selected file should open in a new tab.* * With a new tab, click the "Save" button. *Outcome: the operating system's file naming dialog should appear, and the tab will be updated with the newly named filename.* * While in Python mode, plug in an Adafruit board. *Outcome: Mu should suggest switching to Adafruit mode.* * In Adafruit mode, load, edit and save a file on the device. *Outcome: upon saving the file, the device will reboot and run your code.* * In Adafruit mode, click the "Serial" button. *Outcome: a serial connection to the attached device is shown in a pane at the bottom of Mu's window. Pressing Ctrl-C should drop you to the CircuitPython REPL.* * In Adafruit mode, use some code `like this `_ on the Adafruit device (in the case of this example, a Circuit Playground Express) to emit tuple based data. Click the "Plotter" button while the code is running. *Outcome: the plotter should display the output as a graph.* * While in Python mode, plug in a micro:bit board. *Outcome: Mu should suggest switching to micro:bit mode.* * In micro:bit mode (from now on, assuming you have a micro:bit device connected), while the current tab is completely empty, click the "Flash" button. *Outcome: Mu should do a complete fresh flash of "vanilla" MicroPython.* * In micro:bit mode, write some simple working code and click the "Flash" button. *Outcome: since MicroPython is already flashed on the device, only the file will be copied over and the device will soft-reboot.* * In micro:bit mode, click on the "Files" button. *Outcome: the files pane will appear and contain a true reflection of the current state of the file system on the device and in your mu_code directory.* * In micro:bit mode, while the "Files" pane is active, copy to/from the device, delete a file on the device and open files listed on your computer by right-clicking them. *Outcome: the file pane state should update and no error message appear.* * In micro:bit mode, click on the "REPL" button. *Outcome: you should see and be able to interact with the REPL of MicroPython running on the connected device.* * In micro:bit mode, use some code to emit tuple based data. Click on the "Plotter" button while the code is running. *Outcome: the plotter should display the output as a graph.* * In PyGameZero mode, with an empty file, click the "Play" button. *Outcome: a blank Pygame window will appear.* * In PyGameZero mode, with correctly working code, click the "Play" button. *Outcome: the game runs.* * In PyGameZero mode, click each of the "Images", "Fonts", "Sounds" and "Music" buttons. *Outcome: the operating system's file manager should open in the correct directory for each of these types of game asset.* * In Python mode, enter a simple script and click "Run". *Outcome: the script should run with input/output being handled by a pane at the bottom of the Mu window.* * In Python mode, add a new breakpoint to your code, click "Debug". *Outcome: the visual debugger should start and stop at your breakpoint.* * In Python mode, with no breakpoints present, click "Debug". *Outcome: the visual debugger will start and stop at the first valid line of code.* * While the visual debugger is active, add and remove breakpoints. *Outcome: the UI will update (red dots will appear etc) and the debugger will respect such changes (stopping at new breakpoint, ignoring removed breakpoints).* * While in the visual debugger click the "Stop", "Continue", "Step Over", "Step In", "Step Out" buttons. *Outcome: the conventional behaviour for each button should happen. "Stop" will stop the script. "Continue" will run to the next break or end of script. "Step Over" will move to the next valid line of code. "Step In" will move into the called funtion. "Step Out" will move out of the current function. As all this happens, the input/output pane and object inspector should update as the code progresses.* * In Python mode, click on the "REPL" button. *Outcome: an iPython based REPL should appear in a new pane at the bottom of Mu's window. Clicking the button again toggles the REPL off.* * In Python mode, use some code to emit tuple based data. Click on the "Plotter" button while the code is running. *Outcome: the plotter should display the output as a graph.* * Click "Zoom-In". *Outcome: the font size should increase.* * Click "Zoom-out". *Outcome: the font size should decrease.* * Click "Theme" several times. *Outcome: the theme/look should toggle.* * With incorrect code in the current tab, click "Check". *Outcome: problems like syntax errors or undefined names should be highlighted with annotations on the correct line. If appropriate, they will be underlined.* * Click the "Help" button. *Outcome: the operating system's default browser should open at the help page for the current version of Mu.* * With unsaved code in the current tab, click "Quit". *Outcome: Mu should warn you may lose unsaved work and prompt you to confirm.* * With all work saved, click "Quit". *Outcome: Mu should quit.* * Click on the "cog" icon in the bottom right of Mu's Window. *Outcome: the "admin" dialog should open with the "logs" tab in focus.* * In the editor panel, type CTRL-K while code is selected. *Outcome: the selected code should toggle between commented and uncommented.* * Type CTRL-F. *Outcome: the find/replace dialog should appear.* Pre-Packaging Checklist ======================= * All autogenerated API information used by Mu for auto-completion and call tips should be regenerated. * The developer documentation should be checked, re-read and regenerated locally to ensure everything is presented correctly. * The CHANGELOG.rst file should be updated to reflect the differences since the last officially packaged release. * If this is a major release make sure the resources for the old version of Mu on the `project website `_ are archived under the correctly versioned URL scheme. * Make sure the current resources in the source for the project website reference the new version of Mu. Packaging Processes =================== Official final releases will be signed by Nicholas H.Tollervey (the creator and current maintainer of Mu). This is a manual step only Nicholas can do (since only he has the cryptographic keys to make this work). Once the release packages for Windows (32bit and 64bit) and OSX have been created and signed they should be checked so no warning messages appear about untrusted sources during the installation process. The instructions for signing the Windows installers are explain in `this wonderful article on Adafruit's website _`. But the essence is that the command issued should look something like:: "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x86\signtool" sign /v /n "Nicholas H.Tollervey" /tr http://timestamp.globalsign.com/?signature=sha2 /td sha256 mu-editor_1.0.1_win32.exe Signing the Mac app involves issuing the following two commands:: codesign --deep --force --verbose --sign "CERT_ID" mu-editor.app dmgbuild -s package/dmg_settings.py "Mu Editor" dist/mu-editor.dmg The appropriate installer should be checked on the following operating systems: * Windows 7 (32bit) * Windows 10 (64bit) * Latest OSX. For native Python packaging, ensure Mu is installable via ``pip install .`` run in the root of the source repository in a virtualenv. Pre-Release Checklist ===================== * Create an announcement blog post for `MadeWithMu `_. * Tweet an announcement for the timing of the upcoming release. * Compose (but do not publish) a tweet to announce Mu's release. * Ensure the source code for the developer docs, the project website and MadeWithMu is all ready to be published. * Prepare a press release and circulation list. * Check other possible channels for announcements, community websites etc. Release Process =============== * Build the developer documentation on ReadTheDocs. Make a note of the link to the latest release in the resulting page on the CHANGELOG. * Create a new release on GitHub and attach the signed 32bit and 64bit Windows installers and OSX dmg. Reference the changelog from step 1 in the release notes. * Update the download page on the project website to the URLs for the installers added to the release in step 2. Update the live version of the website. * Push the latest version to PyPI (``make publish-test`` then ``make publish-live``). * Publish the blog post announcement to MadeWithMu. * Tweet with link to the announcement blog post and changelog. * Mention release in Gitter, Adafruit's CircuitPython Discord. * Send out press release / news item to circulation list / friends. * Hit other possible announcement channels. Post-Release Tasks ================== * Monitor Gitter chat channel for problems. * Clean up fixed issues in GitHub. * Update Roadmap.rst with reference to the next release. * Send out thanks / gifts where appropriate. mu-editor-1.0.2+dfsg/docs/roadmap.rst000066400000000000000000000000351341747546300174570ustar00rootroot00000000000000.. include:: ../ROADMAP.rst mu-editor-1.0.2+dfsg/docs/setup.rst000066400000000000000000000115601341747546300172010ustar00rootroot00000000000000Developer Setup =============== The source code is hosted on GitHub. Fork the repository with the following command:: git clone https://github.com/mu-editor/mu.git **Mu does not and never will use or support Python 2**. You should use Python 3.5 or above. Windows, OSX, Linux +++++++++++++++++++ On all platforms except the Raspberry Pi, to create a working development environment install all the dependencies into your virtualenv via the ``requirements.txt`` file:: pip install -r requirements.txt .. warning:: Sometimes, having several different versions of PyQt installed on your machine can cause problems (see `this issue `_ for example). Using a virtualenv will ensure your development environment is safely isolated from such problematic version conflicts. If in doubt, throw away your virtualenv and start again with a fresh install from ``requirements.txt`` as per the instructions above. On Windows, use the venv module from the standard library to avoid an issue with the Qt modules missing a DLL:: py -3 -mvenv .venv Running Development Mu ++++++++++++++++++++++ .. note:: From this point onwards, instructions assume that you're using a virtual environment. For the debug runner to work, the ``mu-debug`` command must be available (it's used to launch user's Python script with the debugging scaffolding in place to communicate with Mu, acting as the debug client). As a result, it's essential to run the following to ensure this command is available in your virtualenv:: pip install --editable . To run the local development version of Mu, in the root of the repository type:: python run.py An alternative form is to type:: python -m mu Raspberry Pi ++++++++++++ If you are working on a Raspberry Pi there are additional steps to create a working development environment: 1. Install required dependencies from Raspbian repository:: sudo apt-get install python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtserialport python3-pyqt5.qtsvg python3-dev python3-gpiozero python3-pgzero libxmlsec1-dev libxml2 libxml2-dev 2. Create a virtualenv that uses Python 3 and allows the virtualenv access to the packages installed on your system via the ``--system-site-packages`` flag:: sudo pip3 install virtualenv virtualenv -p /usr/bin/python3 --system-site-packages ~/mu-venv 3. Activate the virtual environment :: source ~/mu-venv/bin/activate 4. Clone mu:: (mu-venv) $ git clone https://github.com/mu-editor/mu.git ~/mu-source 5. With the virtualenv enabled, pip install the Python packages for the Raspberry Pi via the ``requirements_pi.txt`` file:: (mu-venv) $ cd ~/mu-source (mu-venv) $ pip install -r requirements_pi.txt 7. Use ``pip`` to install mu without installing the dependencies again:: (mu-venv) $ pip install --editable . 8. Run mu:: python run.py An alternative form is to type:: python -m mu .. warning:: These instructions for Raspberry Pi only work with Raspbian version "Stretch". Using ``make`` ++++++++++++++ There is a Makefile that helps with most of the common workflows associated with development. Typing ``make`` on its own will list the options thus:: $ make There is no default Makefile target right now. Try: make run - run the local development version of Mu. make clean - reset the project and remove auto-generated assets. make pyflakes - run the PyFlakes code checker. make pycodestyle - run the PEP8 style checker. make test - run the test suite. make coverage - view a report on test coverage. make check - run all the checkers and tests. make dist - make a dist/wheel for the project. make publish-test - publish the project to PyPI test instance. make publish-live - publish the project to PyPI production. make docs - run sphinx to create project documentation. make translate - create a messages.pot file for translations. make translateall - as with translate but for all API strings. Everything should be working if you can successfully run:: make check (You'll see the results from various code quality tools, the test suite and code coverage.) .. note:: On Windows there is a ``make.cmd`` file that works in a similar way to the ``make`` command on Unix-like operating systems. .. warning:: In order to use the MicroPython REPL via USB serial you may need to add yourself to the ``dialout`` group on Linux, or, if you're on some versions of Windows, install the `Windows serial driver `_. Before Submitting +++++++++++++++++ Before contributing code please make sure you've read :doc:`contributing` and follow the checklist for contributing changes. We expect everyone participating in the development of Mu to act in accordance with the PSF's :doc:`code_of_conduct`. mu-editor-1.0.2+dfsg/docs/swag/000077500000000000000000000000001341747546300162455ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/docs/swag/t-shirts/000077500000000000000000000000001341747546300200225ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Baby.png000066400000000000000000002415071341747546300214160ustar00rootroot00000000000000PNG  IHDR@sBIT|d pHYs\F\FCAtEXtSoftwarewww.inkscape.org< IDATxyg]L&d'$l! B(;#F@!qZj.QkKD"U(h ;",I!A!d{f?gdsx瞓<}] dsOguj6^~+|su@ig6UV{Wd~v{W{7c{V?7tqu wUuM|겕\Y]Tm__^pg..ff>A;+_uW45.v&{gU׮x4qܥ;y?JS&`۩sWrJ9+nf]pTSaӘ2t]M ۚg^= KEsPux}XN'0M;}&^эh\|`^ll:pXөVrJkj0h,0njF|e%gn+_ dF½n"W̄D>S]:4msuxn`{L`li[N>U}``],M'PX8|%X,o45!M͉T 6Mm_4w)m_?Y}}dQ/vAݸ$`qm醍/U Z=p&G̜ kOVX5(frڣiV.#M SV꟫F|X|W#}G,[oߐ8ȢX[el2=gu]Cb[Sj4nV0mjD|t;"v|سzPuLםhsU [e 0 Zl\oHjȢ>3n7"rIO]!a~@k365"_sNG+Q=6FkH|bhE L`u_= TVM骦wu]C,s]hxhЊ[65!>X:cdAL`V=fc` mkFzOձ[ǭ۳XV7]7ǖ0loۀm͆5Jؖa5v4e:pLSအ0.om?4 XJ2Wםlxlu.>u'#N[|A'656ЗDzGur֖U=zjj6/mթյC+XeاzDS9846]04yvM UǖMs"O`lt㪣ƖkFۚNG\9̺C'ca.YMWYcy,gƱL::3k`V<\;N>X];`i>lnj6|our`a|}5CY=cꯛNDX `[=6cuYF_T-XdZ]<0;UqrE} /Q5`m[zkurE㛮TzVrݴDI՟W-Wڣzx V-X#Ut"Uc#6VG7pxnumM'"fl9|nN8W<`64kǖ"\=zNuK3DKU:`>}z}ǖk M*=sl9RZ?k\ ,X>G5pkwg>, XwAkgfCkNiMTm[@U[7xSuryk%Uk`h>b8zQ){`W|M06Vi:\,{߯Z]3`Wh>9zAc=ƖV˃kve4m7qp`4=N9:!`i>p`8 3FX=j̵-_Ut:@8z^kXD_^t-kՏT?Zvp-O߮>5X ~qJM'!tEFkgJ?[p-\ǕL4`Q(W+:W2|j%J&Xej%J&Xk^\ u+3sGvηU?taZX{[~Z`nh>9zi9,Vz[Ӝfxnޞ3_cp-̎OTL|ۿiK uV`WV f\ՏW?]np-̏W: Pnj8_m\ 7ͅZ`(1T[1ǵջ߮N\ P=ak`}Oߌ.֓bCꗫ\ 矪Qqup-4XtT'T>MTm\ կW\ WP]3Xu,=U_uի+ǖGEWW;댦_]>m̻~Z`w]V;ek]ڿzQj;zUS#N|`PJn7Xk55 ~dp-4{W?TzuzF&<fݞ _\ vN`WVWnjcTfoVP]3f͆ߨ;uiΛ-k,y\хTk՟U4 TzB`}:Gr|`WzB`|}`Ii>0·V\;Xp~BX.4 {VA^m/ %Ý_\ 2Z]x]V]y][]pysMm~~wu׫`-[W`\ V%EM͂˪KVw\sW45 .YޅM͇YMW_Sbsu@:ڣw3eߕV751n]X:NGCMZչ׫s>YzA7n(lwlhjBM7'}ywX&_ifQ |`=oշ.`]Q}:Q4>MMCnSS`VP4cGjj|::s_]MW658n!MJ̋w4]O `i>m:|-W7]y 7|j˨Y 55!u4`Vlzi04UW?ɨ},m!V}- ̋X=`fTpUWN|`gY]} ,7=*7W\ sDql7<VӥgO7bLeYouxuDu_y*'`}*._'8`]PӚ[搮iUNZydQBxo'Fl|TPDil)97>k`\m!Vo~:wp-(Kn8`]S}pZuJE;շTG+{dQ;w4G7]х3Fö&)թj>]!qduE33MW1}t!9 F̄iS2ltm kXrW̓k8骤mv]ty8 4Ӫߩ>`\]}`םh8-Cշ#coZάcƬ3r::zB5wzo4|rhETݷlzDӚdȢ5>:֗rcՋчEt^S6o 0R}g`l^[rvXaccMX=gT>P}@hlCG6]갡[|X|~ӄ|vw`us#4;^۩MBX;lkc?_1`m>ujzhwT{ [UP]4րbzN[ vMst҇KV0tUcGlZ3ά~х4_=it!9TûwV-`!ԌxJ\=O4`X,=T'Tǖ܂7jxWWǖT}WS# =Vܒ˫Wrp-&իRvᔱPݫNEWS#Ms#[,S>:v|د꧚94 ~G'X.5 ~Jcˁze+ekVh>̾GU3X25lx[n:N>dW/UW]7O`vݶo5˚N7m;WOnIվcˁpm MflzJх;soR]2MgVw[,W?ٴ`h>̖;5vxB`[muRꪱh]ǖ &Ĺ `0;^Uat!4M`=i?T?4f!6ViM͆S7taVGgo]2gC˪`kө?ޚ&ճf҈qQ59 0 7~B`l;: DV?R}ft!"`}mj~ky ݛ<, Fs՟䓃k9sE;W<e6V?]j9iIMG k97WWjZںgQyꯚM!ܜMs!m:q\r'|XhWt -f֟W?^;y\%:[7q+ZkজShL2v;zEӦ M͆߯N\ p~#椦& GqM6WUpxwur]pTk^t:>X= `SkEU/m{,lZCdzM_0'vC?qtzk)5mųztS#Y^cˁ>[=BX 7:7"#Ý"SN6-rݹꉣ Arnlf@W9YpQ PgF8х0^"kf9<6Pv܆q_T[Yl~{@'ՃF+/-s~ fV=B=U63"6 S/յi}ƯyD+7}P/TE#[wVO˦XTonZHd=9M`=zCuх귪[ ~*o̲ή~zBX_2O?Jlq%,KV'V{Rw/DE*[T`vmtE"`W]ŧZU3T"k  Ze̷;6]znX"k7TBOO_dvNo`,N-k.Χ\{Vu~"S6XlUnLd5sQ;{%YlٴXFT'7FDV+ p|2J'W6 i8_F>^3fӫo6~(i!pS^Q]S`lN4~(;9A#^赜dkө=`&ܵ/Ev'45nbٝ]N@ /Ev5g7}RoX 55!Ȯ64a{M"/7m Wu\ƯDv%[6~!(+9w=mZPdW.lOdgsZMMM4~m(JXWW6~'3MacƯEv&W4X%{WmBOdgMI=>M3M TnNdGO#906VVkZRdG%EȎ䌦i`ّY=<v2/9zi9^MyMn2/FuBu@,Wg7~)rkyCO$drq od_R>^-|\ZX9>rYצ"7s|\Udܱ qyת"7s grVonnMRM`)5dv=zoװ"7S2X"GWg5~&r|zj^5 a,d@^Ω^\m v긦7{GqE X@ٖK^5ȶlml `Alȶ\4.ڹCubsXd[N `R}+mygoƯEV0rU"65+6::*9/DR=iz~"T ` 1`!z]BXjWU;ep-OTVm[Kl9MM-]9W05ȟT1oŒ,w>]=)?i:1zM-˝Vw `F|KuzIfu_06UW6~-˛/V `'V4~q$˙-MG,U'6̈́ESgqyo`qYkoY\]ThC/d9긦 V}kqYΜXm `Sy?|զl~ksY]ʘ_6~.˗Ww`ݳt;\ZK=JkvY|wAWȑɖ5Ձ76M_5,OΪ `7=YR=4`G=ƯeyrqvѿjF#W/Y,=k{Y\]Nzi2]=8|sX[T'6~$k U}{"\S0`H{߼:41{#l~2`h빺:#6V/Cl~&`DӃu]3R=" 3|fkv/4.󛓪MVo~9`q\T|8{)ϼ,`g>V|gd>;ehek?=O{U'6~% _. `1<:{-"F~iZ;rD/4,7T6&ٵb@/nCY+W?rx~uIb2_A2?t-,U=OV?,4a,7Vgf2?ZXD~(\t=u\uij2Z` []G>W}[l߳|4dpSG,gVW5a+ [|Ov,WU+Ϲc`g0ȉ`QN2y9ZW[ys>T^}e|^KgБ`<{` ?pdlQ=,X{GU4~/,csM`l]Wn3: ϣ `iܿz{uBꓣ }х0Wz{> a4 ,4Y{Uò;zxQ?.>ރ`]`6ܶel^s?6a"cj`v]{f\jK$2.o fϦwqR=3ʑ%ȸn06T=ew\8:㥍K˸Y3m#hȘl~.??룗9TLPq75c˘-fjCBwluU2&3ϕճez~̄pS4 5WlCA?UOzuh w? dsi`={qY|/k%գqLuQXW?_ wR}{sYh+_7W,GU#9at>^2MC>6;;.u/g.vNػ49wU4хRYP /_%){wY߼:VՏ7oZ7ܷizJZ{|Sb{>T4}^T]d@ӱsY>WUXojڗ~o@>gZs65A8}0ʳ} c y`][zB`}JӭںGgu jk;yIƿW kXBwk/aY0k~M žՇW>0~#^:3~ETf;W]kG^Ytm{Vok{ ՅE+kV̋}k{ oN6.iÑ aM}х;շ.5a am]KUi<,/TOHEՓό.5ꕣX-5XmΨ0Q}55%թMGXLU>=`UQ}BX34]х\ZT)EvQ=i<"|хf{fgY'|{T@ HP,Q p6\Tm]Wquw-kT\ڍ""D#PM&APHsM$I$IRp~$iWfjj$I$Iֽ} U{FGhX|::B$I$޵{ωQM~"<<XWח$I$I|= W:=$iDn%D$I$i`F?!~ou30I!M5<l$I$ILHSH0{>eox֮H$I$ >}uZzHT)7SCRYI$IT FGQ5tDR<;:B-FI$ITw!:D-5 qtzwZI$Iq>\_'#I-#pol֮K$I$I> "@\]Q!>oj֮k H$I$ Z.DĿZK%I$I Q2H*'7C2koC$I$IR[9y8XrjD% |*:B$I$"nvѠ~Ij ϻS5] <"I$IT!OѠF5jO^I$IZѠ>!isl6+6{U%I$I4&~5#Ikkf$I$IU\\_K U$I$Ufw87^UI$I$ 3qϬk#^UUJGt\LѠNt$I$IR,;{np<20B{SHו8$I$I. `{@6{UU):@3p+3T=Q\.Iʋfm?j^TKoEGhPGV$|8֌ߍiɤ݋.O8 :g4EwCt ]#+IjO~Ѡ |?:BZnѠ8/:B$U_:u]8FҞ]:UvA"{yir'9/gt5랔t$;EGhP@qo*C+h$IC^Eb)ʹSXڒ~jP̌ѠGtCuCq_ #!I/ɬ܇{ANqu>];(r2@PHv!5CMuxQtxO$Im#/7Qs*9O%4T2S)N-LnCONҳq)3NXc$ |9:B=C5<it"$ur>GN'CjCNه>Uwn4@ qC73V)S{%I s+#uʯ=۽!$i.̆QSͿ\H؟6}F`99ʼn nbA3$ NC4`G~@>[s#4(/K\3IIGT r><:Ip7XJJ7`q{]{!patDGh>m!!I %Q\؏ľdP4Vn"[BG\f]&I7EGhQ>qP.KC4 Oɪ$IAbr~,`Tt$P&q/iFGIRрxd>GwEGh@6G$۳y"SHieI>ȿ/iϏ{2p~Hj|:I8|(=(.,I*/_=kHā$F2Kltۣ$dpGC|xyt6)I$s,=yJ% Iɍϥ.\KqrP!&\$F^rٞ끽{$IC-cOf=$IA,}*iGP i'o$)Z^ evFGh@VEH%/bWӛ)$|/p{:h=54&рOoq!!9I"%ͳWc{$Ir3@YEH0̏Ѐ\<1L !֫/EGh@xUt$I#)ytOx wO$TOdDM3残ΑaMe3GG+qq*8X"IHȋf̄lGH*"фt9g>IjCoVG#q )#$In˶aB~ 93 I$~B/iYDHR |':B࿣#ڑÇ;K(.Q5\ :BᔻO$4}y!4D/PM4>,#AǴ$I|Y3ِv$Z3a[.#I~;x[tDq0Q |5:BV+t*߁݃s$I&i94@g~@vaxqt x GH*yѢNX{))=$+HiOGHR?%FHR/Eߞ&:8|9FGߎxn$I9 u9Ct$IC96͘.:F8O)4>ˢ#o^!I` 灣[$Ijd>RjFH.^f\%~QwFo##/+C$I|y_H $iؤ`>)7E_Z{!pat$ T@"I҈yg/N$-K#jQ\C1$HgȜ"IR $~I'sWDHjk ~x cI#:NCU$Brtt^A֊UC#ݝ.ǒ"57RU Qg|>)P}x{t$I]=c^"IR|?SҌ9?NԶ>Kho߭:r0|^ |):BrŐIOJ_n$3 )$˧wQFtD9|[}C/ߏ$ikEcYQHo$Iꯕtt9Im#/;j;Y8xq I*t~4қq I@Lbƅ{9눎V \~xUpC-k'EO(.-:D-K|"IR%q|kS$ .`:&:Nx6C$Ii}ߣI4RzHҴY_T{WRGZCUCq/IRi[.HQ$I#r^!jR*#n[c<ũT~S.۟E%IiRjFH/PR<2KC5 xt!$%=II!i6K3殌NTK;EOo>Qu>viR\^{?$I% ?$Iޤt{`I˻1Ua^>Ot$I{ͬ$Ie46K}$Ucf>.$hQ'{9[$IR2l9Is,`:!:<04C\IR|s$IhzK/>,:ER\\>M^Qe|f`Ftj-p ,:DԾrIt I4@9gG^"VQe8RE| >IRK&h\I)lL.?:ERtPDGT'b2_tN`IR{K؅ˁC[$Iec4{S$V`m@3:j<08 ލIR)4$CbzZx|tx8;:B}:xQtDyap=pHt*( GHO^z^4W{EH[´ySR+$}#CUOŽUN|3$ȷ^$ANEj#>=8!:j> GG/#$I'/lg:F"Is^+UGGO/\xM!Dgn$I# i/NT 7!ڪYUɇy_tEl(ڪDGH/w I$!\rxtʻ ~t@gtDY9|ز(ͨ$ !I*"jmK#Ö3:@[`Yt$rߣ;$IR)y|$ U7m{n^E,`ath 0st$r=H:`ITEy5LL)5K$Un`|tXeɇ޽+:@[u$I,/ZIJ$I4% >]!>r?|a)GIR%?$ֳ|i̵!*mG`)01:D[2|FW}a, $F#$Uڪ(777twwQzx8:DT_ye;C:J$ ]f#ۥf="Ҷ8}tzR|;pPf$i5IJN7?!>-5:L<7wCԫ{iIR}H_$Iu2m6)ftJt;GW+=U!eɇ9eA9$2svΐTyc)#:D' 'a$IvrׂS3$UZڢeɇe6FH)/lOhHq$IQ2U$4:Vp?~r4@б-;TH{NdEf54}A*op3*xokע^ |':BT_yɂ ;$Img5p)]F.eߕOԞVmä#I/&cI;[VKdr%͘":DR|-:B!poP$I$w-Ebat$ $2MIgCnt^IgOv$1M{VtnV -:"RCԫ #$I!q#-AHe}z:h9k6H>gIp 0/:BZIq)(>|xSa,x;$IIߙpMt̖Nώni#H /^uӦnÉڶR4B~at$&2ҥl|U:s"/`R$9R{ iƜj ?d]Vs- $I$w/8$e7Af>4}ӴǑsISkQkjptmu0S |7:BTcN$ZR:3MsP1;:ҌWrEJ{j$7el`:|x{/#$I!IR~wHf5:f837s?FN3 *#$V%7FGDh;&wC;(N$O:xp`t$4i~]2r>Agz0_+tb6 I0 XLfV{Dv8x(A4\'I]DǺq94}H{{j jcj"pFtHk o~/iIReҳv IRl|6|:CRmSumf 萑n'࡬>IpٸLXtK-oˋH% FR; FGWVGGHjj5/ΐ$UHAr>.M2K)4}λHiCtZy ttzumt*:#)$\4 ;CT)+=ǤsRiڜh=R?:AR<tgFGv>tP> $T!Ic4'}O9:jҴٟ& !VVR T>M>$.Ç9^#&(IND'H*c#Ҿ'.:WRJtFe5xEt4~跌M.nC[]Q!S $IjܵhO$UB&ץi/Rfʳ\RII #{P|PSIREd;M'[ S{Xxۢ['] > fN .nMӷ#$ID% \#;[tFf=F3 imtKL󶍎T;ʹu>td:k]!I*ht8bCtHݤBm^ >Jru>DGh3#$IR>+CT Nӎ#:GYGwTJc% ˣ#_<]IRuO8 +:CTz_H\Q{Ƽ̟3*jru>xt9] IRDHJozA3%{DHfj}t^4]N$Wp|t$2gN|(:]s.$K;!獋T[fj}t]^4]NK5KQT`Tt$ԮavrmJ0I5莎fj{t]'Ee1':BTc),:ATjMM)ӌi7iPtG%s$Vpnt6'5=_Mף#$Iod*pTt$h[6>FJFg^ONTk_اSr?Ç=yckt HkG'tجh;*`ZtZ[ |>:Bu>>#$$X4c3^WEg[1@R&:u>$WKIReO=Av#Nۺq9Cӽ7#3i ˦Tt$IReJg/_ `}tFy%XS+$ǀft618::6|xet6c`It$/N$X_Nߤ.(fǑ j6mUTxmIR 'gDwHJk=cDG色ؚ<,:AR[8/:@9b4|8M,$zfS\%IRo.I{~0:BO(otmb[: Έf> IR|Rt$ߊNA'Fwؓ$se$`ft6IR|N8.CTVaYU%vN6` u>tDGh_$ܲ#8$mI^f]]-*HDgRN$ע#VDIRhgG'HJ,%+Nrj.VΣSyKu> MX!IjYqPv)-N(D^=+$SX.GDG UyqLt$223ԗEV<4:AR[q?|*]Xmb1IRKv$T)ӌP#9QJy K1CQ Ĺ@$f=H,qmtRkի;:AR9?:@8!:b(>|ѓyVt$M$ I*]~JPJFFGhamKcv] I*ۢ oVI M̥*^tFGq=x4K4BEk_~ʞ|UN>fZR(TTˢ#$ImbZy꧎w$?DGh}RUO&> Ij#a R=:@SyIm}ry2pHt`TuP٣&5 ,:BFR~rt$VER: (1.:AR)M0U>$m!Ij'$indWNZ]P>iTt/GGhSWJG{GGq$$I%>TÇIm*n IDAT=n*舁GLj}v$''%*HGGhd $Im#M$$O>TOzx|t_TT\~pt,n6 IZR)#f;G'Hjk^<].DG DՆEhNj%I#- K 4`Ji]$5/.JWi0 89:B[|=:BԆR':ATr9qЛIѼx\N:#JÇ# iIRO>HpP=J)$=/.GGWͻpF$] I*ɇ4!:Apl*襪 /n$-? I˔_Qࣲz_" x\^L_^zU>G0 xѴ$)a$I9SwTgbd5s%6$՞O$`vtDT%i^4-I H$m ?͓rU~  IR* &'DGq?VDGHTv;):CTSrEc$O T -/$):AT9=9:Aak< L,WZFq]$ ISO};$Oez})a2p|tuhZQK$I%'* _s(O(I;Ft7>:bk>|8!"I 88_6GuڒAR 5U>~):BԾKw%% -ILh>':B}ϋ.(ARtJ^DoB$Im%St$R<1Wv9͌N(>H*# x}R*16/N$UL2(:$VGG(KN/~<!Ij_kR:&CT9Ӣ#(5|TN+EGqG/a 0;:B($)Vj<!IDmA#":Rr /,)..&EG(.2:BRY J'@.܎TK>vIRY],CÇiC6ӣ$IuP^=AϘSKTeM[z\)8|?P"ߌ$ 8<:@Ta9'KT_^H K!~ !IjokNJ;#*R/Iۀ#.OTC))/$K3$Iن _)BG8|K!I4>HZ 9_sͨvod* N$wuOT>G$^ :HS|5:&!Ij#lÇFq_$ ]P}yq*wKqrt+T_6It$IKt$6vg7GG>G_IR,P{4|!act$Id&E'Hj #,w/8xyt$iXl.PM-l*p ^R fwrL(j5/Xb:|--mBI]~&6|RaxtcC=KŪn`Zt`~ol $ޑmo:XǓ|(no:U ȇQoW-xDhS%n`] ]>'/٭@RB:Y}{?'L+" `hMה܇YGI&*)d`]ā/ b:FU.YW E' pel ,(A,IGH:VLh3t\5|8%O$FJg~o^wꉋU:e,,K5cBN I%mg%=%-I}۾?_7$D>da<|7b]$٦ '.4l-qb +[gJVx֟? IWDJnD$4t En`+BH<&*lW-x^'JMedjU V l<A*i/ %r&UI':7(r IK҇`y+G:@~XΨ^MW?ٶmkU ޔb$ i|$}AIzp6_RtUJd}T}*e\0(K]vY Iz$meKd˶kddSe۵])[A.GPlZIloo/I󖰒U!%[1x Jz\җMRU*3/Ggcq=8 I5om lJ# t5l8'W J`mW^]ph$ZRD҂܄=,IX>|z%=e:/J` nz?=# Mx$qE@uuu~GAIk(R ܟYyۧg<g=Bpoqu;&F388Xz77>FJ^0~4|Wۥ2IGi-o:0n%JVLq}ݻ-Z4yx,UVVR m[Ֆ-[/Im[{׌_|q!RH$+3|q<E`MQ>!TҀ %|tC&*++c-*xuDap5I.Zi{IR 'n}vuW1Ւ>u0:%vI3&?-qyyǵP0Tcccj<00O~qq-SCr~P.#p`ցvI/d;>4QZZjs=$)QtNtz***TYYr).#ipwIMQBJ<|$hdJ8 |^t%KR9sfZg˥v(F 9<\:p&t ==-Zb$˲Ԥ@ [<ß7sI (r5{V`L0׷:Cuuuu*++yCXKR$q;G2gx|!7[,\-=rJ>3}hTIGFz*i ǖqL{x<.I jlleYg+hZw^(IMMQ>*ɓr:GH zl)wx_߻vO=F3g*{KGGzzzRիW.^xW˟'(FMPJ$ŃJ>r<~}k4tezAժ$>pxp٣v'(Vc~>ɇiWL}_9^:+gpXđH$DdîCfϞE{FgLȭls||(iu-uGR%g"3Oo:t РP(I,mmmKy˖-stH:]Rerr/u IU9~&2C4 -[uE׏8aFKYSSɓ'{֭[qزޯ}kM-Io{ ľY$:@%l!`ض^smv>#ԿsBj\VV:ObbjnnN}QGFIwy 쌎.t1y{ѧs+))wީx<.I jjjeYD%s e骫Zq)./\OgIt̢4 ƻktu?t̙3]FGGzzzRkn뮻vu<&˒x {tE\>,ɇ]%N @K\~sŪZO2EUUקԸtSQn$r f&iF!9|2WAWܢY8מ{̳w4 jhDBHDmKJz={v-OKޓ``lK%MQrOax^R (v.|FqFب@ םZZZn־5.K`NLQ 2pp-1n]KFyI {N٩-[[$5{ Kf*9zg(fx\_<mvhH'M"DQƥ#u$sҖ?KI!ұBR (6o@߽\^q}}'lܸQ[n?rmwy.$}AfOJZi:"Vd"+H>r,Y@T_Z;w5;Ԛ핦LjobW[OpxN. fez& o۫s})۶%IpX <~DBׯOURR~%]nyZҵžYY|?ބCoc8{Q@.`vҢht{=}WhTGqD]' 3(by@r,Jȓ+o7VW뿯JDB Im+Xkܹ-c%te$8-?j?CVd7y,]ht05nhhP($6O?ŋg8RrIg:61?2|Yޏ됴tLt:u)O8 o/:Qee'hƍqKKOǣ$%gJBNAI>4*'g%cN.w IDAT^re7h]KQ?B'lj\ZZ:OD"#wꩧf %J$ 0NޜMG{tLtzhW(wܩ$)I>~ssbZe+PCCf͚p8f^Z>|${LDtշ/]d* I*--$7;5ú{lja۶VX{Lwqyt/%ۛlfjAl.ŽNBK` ߹F}QOHLjObW[[[jTJc"kG|Nc8{I`ГXZ[[GؘZ&M߮뮻.?-鸌j>&p@vx:_??*ao֪ܓX9bI&IJbZx|I]V[nU}}f͚}sovzw] ?XK_)$$a:"OJ&hdr,O զnSdwJ$+**4}tObFjnnN5}t% r-ꪫx綾^;N?t˴|r=-CwhɇV/pش90UO'wuu~zC0TSS'qضH$Z:餓o}50䩧{--ܒ_G\{UW+P?/I4ɳ/+{K+:BV]{{Rzٶ}sZti&MI'C=TD"Z`HJVOuY,Kg[Immoꫯ-$')۟%*iCMRƕqOHR,\E{IOL&['}SDgOO6M۫5k֤SN̙3u%80SN/K͘1cgYg(//K/?uM[[v}w!roHJ")MiH =r /z/75nfjCvn.vylۖ$h̙f+HhBS󝝝#>׷pF5cސiILA K?_O8{Q`ГXZ[[S9HisR5lix> ^bԜ:I32!Dz֋"6K~4уMZUTTxKWW:;;SwygkvLdww͚5cݾ){]2+H&);$uJ$l}봱q'Y~454TKK˰:w:app0eYW` O>BsW;fX@Ij6D; 3M>ȝϮ>9UWWD"!I .۶D%% sU__,Y2ђر/cԜ&fex=r77:'QАqt8Do,s='I<ђ-y#u/cԜzfزL84M }tnMdCgNW_ueOiICiӦғXz{{ѱr }myKW_A$ɻʇ{N\-iY '5'K$*XCdC=?d叒p@rj&iif̘Ix\H$5˿h~mOOxnɋ/|[_}&IͩT/53iytIzt$4 Cm[FYI ͩdeY677Ax@˖%'m4thѢnuQftE,L0@ftD]]]^:ݶMJJJ4sLOH$Z~ B3gΦD"1f?o95ζaZbXHi @~_jNH><wt\tS;444( zHkkRG}tҽ%uë(F#I-c^f_jN+j$Վ/d)&MA xjwݮdK&IRmm&Mr̔.uvvh{.<#ؾumCtCƋ@&)n:"5SRZ} M>0XJFtNwܦ>8ʊ zYU ?@:˲Q.m4Gl>IE&hd%D$4Q^^[$) ѓ lV$Q< {zz*\nyWfV>L>}e[%}^s75'sH>>D0IM.['AUIvƯz2}]ɊBT%B`0rbIep0CI+_@|`tU~/ɱ4/PQQQ94:u*++.Zoo:::R`08pꩧ喋%!\H$.%%|0(pN14.--U}}'AqE"ԸD{l\[.wԽV>ض|Tj(|hۜ],)X0N-:Ƽ u/9M=åCg/XF ϩTeY?D".G$)i(!Y`=| Zީ)J4E$f=Coe: ^~6hѢMx<___2OٴiS_򗻹\I}-.(RIsXhdۦ@H$:묶iCJM:Փ@aÆԸ4~GUW[[I<s\y8u_tEr˹>psL>ضʇቈ|W쟚C6K0UJIg:M̚5WTTҬ %5.--?YnQlmmL@I[LQN>TK65Y;vvNC`P0tZ@@^xa׭-IX* swLQ$M킱T=C2v6雟'6q]]ݸ*ѡ7h7o^(e~H>*,˨|g|ۜG$PH>#yWz jԩ,۫8 ̙3g(|Wki<ʇA2*挚? P0RzT說*OD"qII>> NCx0r=ɓZsssj߲,|k].H:G~p,$ qUaHZk: nNkD"59_xN;::6p \t R*H>VK3DVX$YQQ1bܲg``@qYYY裏2-WKZ2DgZH$4<)388D%~ Ըr D;tuʇog˶m_^`()^t8r, ?!Îg1V6AJvxܹs+Z/qeH$Q<$]|{zz&\RY-F!mH>H>G PxZ%>g7SgBlڴI]]]ZE+Zy]\.tq-cYPDI%v mn:"EGII;M̞=4o)jGme9`pӒt\ZAeh3|,KX3LdHe|H'`,@Iɍ&˾o_m[ZnѨ-)===ZzCYYYCd38qL> m mL|ی=[aRhx0JjqXhQUW]n(!IZj֬Yuuui֭҆ >PꞲqq˖-U.14K:[ɳsa̶KT>lK\v DƇͨT4Nw` 0~IJi{pwOHe!z{{GƲGu.$$}E/˧Fsuöą[&UiԶ7*QxmY{^zup8p8oY&wwwU$@m۲,+WUΙ&W]$%ΝsϝVUUUaYV x<[zuM7}Ǜ$6ƚ%8g?Akf W$U!]6؜ QOKZ"iQ z{z;~ߒ^iG%.kIC뤴 |^.Z%m4t E1@ۥa@!j }CIW<^g%}hDF|H]ʦaH(VHe| JBTo'!"Jk1I-$x|iWp,f QW-@t(wJ:\}\39 w&L.#vSa<E(Lmx1`YV.))i &tEjJN@@^7 *x1 dsT>@Z֙HU@ @ rO&Fe|P,iU>p)B v KBPbEYT>Cb0Q!o3hTH>*DOU> 0;T>^CjƘmf'쀌P$xʱaCvg]D>%f Sf U^r|qCɇ4|DC9 ;&f&D%@^r|H Zee4.Q`io3n`_"c^8g>[!>:<`YE\R Ԩ*̠(d8 [[חjFHd;.Chqoƨɇ<x3 v ڝ1yR"ի3zロ: \ƞ{Aۥě(d]-CoooHKz衇~ƍlٲԸ~(U3hTx3, ZR>#?@a̙ZtLKWf*6ʇD(dmx)*)e˖*++%Immm:SFnӯ~dG"\>\@ac LPA*x ovttTr~Zr,X֭gsʶݚ<@pYIo&|((췚1RhI i6QX]$]#zhI';o޼ Iz5{l#h婤$544%6y?T$K-|GB.K( .\k&ϟ_>gΜBV-\P<^y}cp8ܲzjC_(v(4mڶ K æ$)f:@~,iӄmd(H:MQRG;`:c8@^I#iIeN,_ANyn0%",IHSҦ4%d$Ϋm0@J8p<@i$-Dђ>*i7IJ * *p: IDATvIo*Y1b&L(컚3 O>L7xϦ1(c ǶKS gH> 3|2x/A%aՌT/Гm:ch3LQJJ>T_ }I>-tEZ"`=~v $ /~|#_|b0bt`suHH>LBxgh?MPhT@Z|N)6g>fH>T yi?$̨|0m|W3hTx~ib * /~|#_̇|!_͠R5anAHe|N%a_$ 74X$C~m14T>BRI@$ӑͦ6DY/z/,K>I妣(R|)ߛQN9 O| * 64ٴ].)|0tdT>Sm 34Y])a͠AHش]'a͠ }T>fP`7/,*|}X3|06g>fP`/z?H>f|0r/,v ؇5KqK~>]2$}X3|0M%b֌ q²|'a͠Ad OÚA%ȸA%b֌(/z?|'*( H  np_ H|؄~ȀmwA*̈@F|/*/Dˢ؏?bĶ ؏Ϳ3xM~lQ`/vOlv 87H>BK>~lB(B_H>ǙbK~lv^w$  7NCH>B%b?6H>B n/ǁӆb&c?6I!Q!^Xm!_ h$ ! 7 HLGQ.ɇ $٦(B r D~lH>~P< N6?\؏Ϳ8fb==.H>B7UmT>ɇCx~3)qG!J{<?щ&H>-ߔTv ؏?b&L%$LGQx~O%^ô]'c!RS8$ oB6Cx~v ؏Ϳ3x~=.I1Q!z~ G+?{\vɐ2Ȑ?$ )v JE QrȀ*LPLGQH>~؇57 tE'q|}X3z|0'!a2nPGÚAAd? H>3|0='VKÇ͠ $l*}X3H>C 3|}X3hd7Om}X3hd7OhGÚAAd? v ؇59d_kNċ.fP`$?e:E̲|.AASL|`MUHQ`P+A9NfR`72F,KC>*E@"ޝGzesMLH(؈t "-*-n&ADEIQ@hE!-"*6( B[T璓{:Uo-roճVNz:#=d%I.N1P~`f&B]#'Ըd#I.N2@;J]#wqW.ϯL2P'$91r@Hr\u:?Iu)BX/j(f%P7v@|hEg(40/ʇʇ ~(NZCLL>F]5 r4@إ| 9v oָ 1Pͅ0Pg9v _P>4@3+:&k w>4?̢sPs4@Ϙ|i5WzFm|W/&&ݠ:P@إRz):|5 31űKU6pI 5XzDNr:x&~@.}\Z>| .=u] =ȥGxj h`رKquޕ᪋s |L>&þk#=Uˇ׍@n|.83()`j&R]5}]jLPs@ܠ:@9v!>0Ӎ]c- C@wa!Ir:ȱK@@?e$Ve$ׯ0R>u:N)W$ra伕!INЙ| 9v /N0Pf3$\>$^rcAPcSpųKk0TL>Ǝ] _c`2V>u @?o|h&9v 4v@?o|hLc|J|5 a8v (|_|hWu.JYo_VˇsW/;!@%;5uUˇO09z ve(|h#|g\]‡vP9v }Yk\]&FI>8\M%xl}YkIpVjp5>;P@L>8Wj-7χv3rPh%G &C\8 ]C|(`w z>k&5NKqL>v C cv ^](|hۍcVWL>qcfTIrpY؂S>|mWk\伫[$Zz;9v (|hL2ذjpN:N65[?خ|%eaG>$=P@pV`󇗓]@%ZcAО&9:4JT=Р\:@)z&Q6b%z|虛UF)Z8CО3 Gʇ6}UuhR)Z{sNG)(`+Z]x=SkNNIYx[S>̱K1PcInw[8;z-"Pؑ;t(t$:4HԺ@[n!JSFh+L(>jCO|j|h}:ʇ:P w>4>jCO@}8v -Q|t$_X\fg!][Ts|i?0ͷvL?89ɩ!1&qzC Ԯm`3Pk1&ȥ:ʇ͔@]g!f!.4iY80S>L>1u޷|x_޳0X:@;nY`FI>|('y C@3:.ź}]héIWb>д gG/P˱K]uȥD8±K@_S` !#\8 s@+Yh0KaLr@+YKʇ:Lr@f!iˇ'9o,$M(֍Pﶙ~oT/Ngއ:F I:.6|g=,僣<&@c`=ɇ~a$cb]h:K|P>8 ijInSbk$gT(bPRc)'\0{%*|m|(f;[;>gqc(6}:S_6^>8zF '3S?|*pP0PCϳ8'^u5V>P$Vg-5gTjuc*}]uup5 )Z@uIY<9)Zc.suTyG/չsl0l Ps@.4Pɇ~n3C@!P@'vu[I`򡖣2P˝UZɱKOr!`V%E\Cy·gb0`52Peu%hֿ4vTIE@ΝMr6W0o:H!Սz_IA%Jm|X=G.Zg<0i||`?w@ϻpvkƇ a@1w>T0PI./[;^UIN)Zj]'MC =^.%CuXe`վ.4w`Ypcj9rVW VMPdSIgo>R>L>F\b>3n^s]'ɭCJuxC:Mrru彖ǿܵ:Xs*ݭ:}/YoXVLB?koO2k0?C|j6N{->{| wzWR>:.͒Zb>pvR-G %UYkOG.%ʇuC(Z#N}Z{W>!C|ju&Vþg&&ޙ^2)!`E@-N ܴ:Ā]_"(.M x%KuXP[3;[u{W"Z8;z$BT3|;kȥD.| P˱K`BvINk\'%Muk|$.赘$w4M=-0\kJ'"^hQ(;Z%,S>- \\IƋxE / v\R> pݣ:-l Zk1;'9:,͛|u.Xܾ:-~Ebv% '(zc.,j 2Xd$,=\#]XG.$.p~_p9^:X_|Ec6NrjuXT>|XHr}z29 @ @ûd6^`=34b_"_p(Ƈt1^g` Ro3_e,T?h &]|XOX?.T>-P>,=Џ្\ezϾc.,Z'E2ΗgR@P,͆hu6bOrI.EG/:9CBm\|0V>,֝Xb|X_I`|%ŲYW[^k3Z~Ps)$o_ /|0ɻLI shرK tb1p[Ȱj!`a6.U> 8Jr:-m_]fch(}ب`=t |Ku'e2ˇs|pn6!`!L>mpb>i!}I>_C=Krq,w~,ٝ1K@zoY/|%>KT=lCK{w$w1p$7X$_{}I:c6|ػouU$2`y ރa\8 ޹WpvRo$Ν@|C`o%Wuo Nrx!`O:w>MP>'nu;o&(O;3@uW(t#٧I.\(>L>=G>e\E{! C.W>xtjjVU>5ɥ+z/[C6*6|}x$o_|,߭޷W9v hNr|O{KxU.T[W|Zq&fw|orWnjwkV`5=$-ޙs+|?]`>|q50;>=zU.GIf@u0L>PMIƫzUcKNN_C̔@+G&Zˇ'Ŏ8?4]6*lՋ&'G$6p@+_629 Z+ߛJtZ;W(Fl20$auV%BŢ ޓ}guI)6r Ԇ7*/0hÆ`]HTQ>\mfg&uu;Vlwt6!$Ҫߴje3#OcF8v `ZP_U>}̇8tXa`J@In&!`*.Zqh%ݝ6!G|+ge IDAT7_`:|L=Ϫ޸|pR:LЊ .LAІ!/\ZL%WV]u@;v `g$$ozEIܿ:αK@#|3w_%ͫSr6Gy@uؕcV m(..`;$yuѡ Fs@n!HRxCR_>|4ɿg`B @L>p:I$Xe!qR+Tv|%<:IwW>p%Ps4.lq{+[X4%!H%ca &ykuʇI:I&l&w>ZxhM!Hy&ZY4$9#ɝC@+L>l.I:Ioo|U (ZuȱK@# Ѿ:I&gWH)>!H2)T|ZэOlWRKÇkuLn_6)66Zzv C$yWTRkfm^{UML>0pUߚ!HU6S>*\#:UV>452pMrpݸ(*Ir$\kW⢹ 1I:qhCa`{[$M=$m^jh#.ܾz[|:I! cvtVVIT$qu-.GI^W#~:L@:1В?d_)-I#"vV |Z1v0xIT#Oo|xSC$$:hǸ(UWӫCd[iu|0!8 P>pv.!j4:*2PKrBuntXaԵl'&ouhvEI.A$]340lHr$I.Ii|(hQ*)F`ϓ\\b;-I##t$7u#І΅`.!8$I$?P`2'eI:NZ/dt6@@#~_NnI.>,_[#n䛪C0T|i`!85vӇO @#0lIPb7}x8Cpw%9:CdhȱK }Cp_ˢwp1\,Ս@`h~(Ɂы R>!_10X9@# KI@OKpy&$^cwIά~yh(ɀ`sЊ Hu6}*"gCpXcFt&A%ysuii|(Uc<:C|1v0?M䵙BʇG#%gMc`$&ooIrNup4dhøwQg\4ݒO$ykuYmmP>EݾxˇHiVcu F֞$1.Ԗ?KEghDaXg]&I21nNu69#=C4+uv$7&;r)o/h#@ƽ}ƣ;:Ml$W`])Ft]s|\4ݚ'9:ļhɚ:9W`Mu|ۀ::+I!ؤ}/$CɣBP@3<:|>!W$lr$w4QWw$_UM~;!bͽ=YS:)V|֍~{ʇ'lIΨ|1^(+4ɽC{:^ˢUd#ëCfn]-@u&Ȭ>xeuEXW%9\M.:.O!PߪR>䯪CI~:ıK@#uyxpC|:"ӢpG%Q(f|A!8sSI.&Jr7FZ$&$y]uEYK~ui:Z=Gw2^ h^5Ѡ]a[$wun%pu6H!X]ڡ|Y`WXu'yUurVSCw&V(C^aQ^XE˓&׌3ثn|љ|G[Me͎\Jֳ|d7T(Hr|u W%O|:Ģc$/Q!Q@+9 XMra]oHǒ@Ophgrmx ?J&IWr w>$7Q^5x]ˇ$鿴{|uJ$K?V~.n|Suh|9v {%]uEWZ!qtL?0q/kqmZu_4xMN5!.0mܣ:GYۋ僋L%OT{+{xUJrCxÍܿ:GY닦4Et ɣC'![~BeG[+ !Ò\:=љ|7;z hu<:[ziuUJpv\<ݢc)v~hc_|<CPOGP|r,IIY-4xH fO:IQ4|Z$'W(hJCzwt~g)?z!ҋg'yu$׬@:w> llhѵ<:[`rV>:[a@F-@\SINdTb$V`KOHrLuՍL>84g)mfr*RWUX!.7C%9:rА#@k+C?!I@@;6 Y hӁLT= ` ]#g$yPu4u "@[J!|:D!??:zrsl֙|l b_=$Lr4f!!?KmyPU`KLU`Y[= @;| !s3໇$_n~!hH }dh$uutAWU4 :#4dc4g)޾$O^݂yr`G_w$[V@;;+-CqU|\liI@(vl(RTu$QM0l+<8-[vtN*=4!ؖ(tvW`[OIr4ıK@k$ybu$QʇqV`[e0lQ>Ul빙7^>޸Lr\u*|rxY pB'T`[$yUuVX0مI^Vm ɣCPsА}& IrlI. ='l'\:eL>I[mLk!Z|I~: `FcЎcܶVOThўIN@naXgr4m'yvux?ڻ::>CP@C R*=)˦iIS5[{fuv$W`4d46iIVOނak!5duVNñK<%5C!Z|sNrFuVh-qtώ/a I^Ye;8KCoLr>!c.Kߓ|Cuvk {n˪Cg$_%|hH|@uں˒:D;7oU`GH,h|12,Òܼ:;zeThtdT=5ɉ!XΝ@C:.KqBFISy?NIc!X*X,ܠ:;$ǓZ1cY XHY‚yz!qI~:K|aX%Vuv$oʇ|uv$R(v,miD0Suv//U`)[vtI"=#ƽ=ɛC~:oIQ3(ߔ[C+S3R>O:zf|Ўnl ,F\`J}cCa~<::&Ν@K\8 s[]=-}``7J!w$u Ў`^Im!G299yߛ1Ir:{bhG7V>8&ɳC0'9Tϔ{$T`W_!Ўγ0G'Euv$w{wy)?!S)vM>3;%OW`*}|X'tuvur.w|fKIN>!ցŸ,ɯV`*?!]Y 퓜U<#ɥ!ց y!F@16Ld?^l>e!օŹ8.IPYh`jߗ!3\Tb]X0/|:SyfC0 }@CL>9>/W`*tCb]L$O Ǝ]ҍ4LI.NI>YD[T`Jzxvs$?V|OW`&Krl|Z|I^P8fE$oLl|ZY H'%iuI:PX0֓>$-@KL>7KLmzg߯ԎMM[V} ij [eMCbzOLrEuv$?\$-&`WU`jWĝ+|X$yquf$W@4EuZ_L^!FPI.NLX :`^L(JX0\_L!3c<6I[BW"C_IIN0\c <:3X_1Tʇ:%yJufr$ϩ0`cR0@??>,,k*;C0K!ʺhG%Grϻ:Đy5JR!L>-0'&yQufL_)|WIXC X4ų dz^>ɛC sp$00%&`kL'ybuxwWW`&]&9:X-Q>V&?/HxoO%:3IT ~%`=5ə!ɥI~:8'C0Kr|Zb۝<:3{fOV`BЖ_Jd_HrluP>+`e97i-$yZufՙ\-@;$X_?6!&Rû=/LǓܭ:34d원!cC0gr: Q>`'V`f;:S>ɫ⸥>z|&4ĂM!ٙ\jcw>:zv3C07%y]u|hc!)(`|s%yLu|h:3뒼,u[)xqrQ}$,3I>W/>&9:3lU`{ʇ}1$6N9Ϛhx~7@}WV`.OJr~u[ۗI:3\N }7M]V`Lw; $A?'cQu:;IA:ZM_sg=O@4>'(gC0oOwE,@{;诇&OuI: Krqu$7kchυ#M<:s$C|"~)ՉI^wohЁkyH$'Ta.OOLb_{T}*%O_C0&yvu|K<:s$K] 2.@!ӪC0%: ?!˱30L>w)Vc0JG!r?=2ɡ$ϩ;@{0=$\q潤|&yYuIXW6+;y IΪ~=ɿV`v$_~=fڳolw$/>gC0$Oܮ9XОCh$;IA|:Q>K:sk h~Sж$KuI^^Y,(ÒܞC4Т аoL!ۡ$H2I^PO$שд  :|FquJx_?FI^\im|<mzQW`nHzRV`O;VhVwhcEMɣ\TS2K IDAT>Kܢ:@谣17KI:|X/Nriuv\JrLulfڳq&hDZI~7A%I^űX^/I<:@s+L>1-yN<5T`qI:{:N د|6|O|cޛIQ>+$ +ܲ:@3.W> F͒:{2N$X-I~:{r|&^:@9Whhlj]#'䯫Cx|:{I~:@s{aw_H,a}䧪Cg?@ SP燒<:{$rX,'y[uIn]A.@$y~u:ˣ|XoL.>T=9.&9:@,@{Mz\<,K֔{wV`n9tРnX%ٳ:˥|Ie ;9v VIP=@)L..WaϞ!VO4ȱKJwL(}K|$/ɹ'UX,@{&`ENNLE%yKuVÃ<>'Cg7M$ cuQ>uI^ 9ITQ> ˅I^$:hOy{|B<4!Xy]ߩB<#ɷTXC@{F&`!XW'yCuVK0LJپ$ctY8v I^ػp;}NITMU5TZGZ*kxzU(E+1bH P*EQKsr{_׵g}u BB> |3:Jbf_tI*.I!]$\w VtU!T!IeUX惤%I*`*?n>ԷwC$ %մ7$O!sA;8(:JbpTtq󡾽|+:J؀ZRj):g?&IJs`Bq,2* PK]|GY$:@ *+C(ʀ󢃨$l@-F ) |$D7aZ1t1Xn>%*OGhIyTI::J,!ɲ*CHRx쒤<$Ipphṭ!n>hk *DpAR.5${>B%t%:ɲ>i!T2=uHR-iqARdV>H aZr<凛FPɬ ԸIW% %I~- *I!/.a-! *_%U3]GNKJ` *y㖊A/N՚SCh!I]WtAR|$:Gt叛jρۣCFE.ARY IRg} Vt]/C(,-pNtL>:$u=$=$IOאO6 N(-Džp\tTV` )--.P$O IR #5C5x5:ȯCぁA$H$5Á[^ATRE0`NtU'IOCV!rtIj]sIyd$IB?: yui !TrÁH/'|$?z7 Y>n>+EQ\ xORAR $IJ 9Tz Iǰ/dY]8x֪߉!I()*) $I8 x":wGPYBOѦr(sA$` jϝ!T\ȫ;ATEc$.I^OC, d9TŜ,Q-j~ lD|KNK'=2p nn>n]ZlDR+|?$I_4EQY\):*C,6>DR+x\IT'X-:i NU* 󣃨,'xD $)2]$՝AT/ 6RzTIzxIf-AT6'; ᴤ\rATΉ)wW<BeSv"Nl8-)\OIj}զs{C69YV9ptMo`< @s%咕Z)R^AT6bUȅi 0 De$:Zg僤\r=%IUlfZDɲmpttժjYI9T(X IEw]G/EPms!J * GHYV>Hʟ,sATk>Deu)}n>R7:j}ғ+GT|O~6Ij@`xtS!T,R_"'qҙMA$՘=$PfiIRz8x/:ꃛ,:j;wtI5Pp") $I =;FQYeREW \Be7-4R)Z )$UZ` * C8YVC&IRhp")|BT πGPq!I_tII$}82:REAT|PWCbtݙjI꺢GH%?$IjpZt]8x9:ꓓeE 8?:*|!$UBIyd$} (:*{!T|P3{C /DT2,IR9NWmhΠ:B^ZH_GQ5גNAR.$UATvIDQ}sp!8;:*'p#WtIUhY<* InzGQEL!ʗs NDRARe$IGOtUmy!,+Oh FT ) 6$NPOEV"--@`atUD?v܀"V>H'?$Iy=0V[@6#:ANGS1!T1HOEgV>H%+$Iyg` oE>յϣCbwDS6On>Hf n` K+CHqAy6x :*f iUtI9K&IRlLVy8):'ʳu=lDRx쒤\AÁ;Ub^FHmqAy7Aj1lDRX ),ssTm:AT1 ^"Dž#!TQ!DRN|W7$E Du4htiE(Z\\B&p? rXp")_'IRHkFQE*:NUM&EPE|":`i9}$E+7CH惪BP}*:HV>Hʩً|$UږP_^Ӫ".Um }ڀ lDRJʩ \SI*ik`08:*j6VUqjp\tU n`"|SV>H*eRU&G:˅e!Tq?FTałiJn>H*aGv`@tUܥ!pA؀5A$UP!s")z,ITn;+EQ= B*'ʪf6_HFT1V>HʧrڝT?:* `$=UsAniATq}HsI9Or7:*=[U9'ʪ,:*7pp@tIeg僤|AT'{U_2`Jt|P8':B$U@"2{>HʩƢRpi!Rp!ZmMh՟Fj૱1$OI5$~gGJʼnjIJ:I 8):r(8gO|$8 VqNJfWYD! GTj8{ի׀ARrA `_`nt9?ڑY )x$[Ctl.' R9QVzԠ%:Œ%i.&}LR>Y I^GFQ"0 x*:Tn>BnGM+$TrK҃_! yպH͚T>LV"; V>HʧBk*IRg PW?!eՃc{C(ԶA$uQ!s")5`$i~-A  HQ\ȫ^\ "2+$SцӒ$V\xtift)Rxؓ!m < lDHʫ?$I;DQ.^"Es,%OJEQ.OڀttI+Z )|:)q ʅAHR-jZ"URMLjF-}8O R2+$=$nNin"U 7ιtND;0 CUY$S'IkDQdQ AjDY꼫3C(>պ[ñe.iF($5,Dr.%.IR5<|%8N }I]DY꾅~ ʭv"U1,c$|ն) E y4{OFQn A:IRY )TT=ƐN.Ht R-p,,`/ ʭFRbs2,rI}ˀQc/_މ" Ri^\2 ntj|SY$$ 5HeTz/ǝro 1!u ]% %)vlD.d!e<3վUہHWAR^Y ItpwPcO,|!`܀Pza6tSY/}k7DU. ,;ae5Yf僤|%IʓFGQG:RMs,`?܀Њ}bDt)w Y$Tj%)'Z&Fj y2"=پ8:roU6OzKI9UX8I VNEHT9$m@,rp)'') gppwЊD.ʺ2n@c"倕c$)VbVdH~*D ER>m8-IF*ÀFe)Ƶ \Eb僤|*4X Ipp 78C *:T|8t!:`/ǣHHʧ̞T!z)J."+R_'DPU}HO_4gQu9At޹BCBzg RX )R i6"sIy$FAT{)Rɋj3RyqAARNy$h/ATKN:89:R_"&`,R8gONKR7 $!{ E,;!$΅o?$fAT>D>{>Hʩc$#W'`si)|R`,P4|E9I:阜QT2QE>'RuFT`^p|OqC{oc pItI+T=FKjmK*kJt Y$Tfe$uЁgj?"c(K:``qtUokYˬ|[>+I \ Eի*9*T}nXDU/VAr")l8-Ix DUm1EA$u y:,6x8?+$IRkS -$=ystIDY^ދ !,R{H++$iYH #I`JB.v07: R|Wn>Hv77TDQ\E0,r*I`5f+gQCTŜ(Ka;03:jpF>I9`僤zEYұRwL"|jC& nnV "r+sARHToDTn>HY?f!)Ȳf+(Iu=T*/_ IDATg<DR8Qj _f|TS,KX ) 6TWwkgQxjRmzؙtT SMv ΢zzW$WKᑘ*ǀRMr1/ծR;Kju1;8Ei.n%X5Zh&FQ|DRy8Qj<`? )  ΢zoIyf僤ZIoJF``NtIb^} /WDQ80 )8jY|gތT6 ΢s `QtITZ#󣃨4^ ΢Z@+(I31p$:s,Տ4y<.z*YTkzARycNR@v?0<8jOFqޓF*< *Q^C%I]0 XXL.^&c1's` I-QxTw(էkY@,=7GUg̪lIeCL:IX~v!4NzaAJ5heRo1ATR!:1B T3IGQ^,n|':$H_F6HW~VDH1)0$:j<@ bX",շ Y+kgQj5UH}/p&i\Rku;TDzݍۤ#yxeIS<DR,^vD5mp 44zIRжp遗SU)@oĵ@2TFQ{x!:xn>HZj:3V*]HO[}EՠIyVȲMA:Vi2-<(p ջ@3(wZz3:|p1/<:j^OT&Ywԓs7J %f 88)ཥx6;8jUDN%}X pp<gQ[ rHʻwT Cth Rm< U9s}_D_8I9^ȆkU( y%IIz|&zTG⧁CHe0T(,DR #&= K|M~T%4,q")z{)m  =H&CH%4t8cP9'H?oHꌕ[Mʜq봴 niiߕx!kڿ-u.I*?>⾯9$T_=zxyn)^LΊEH<"Do ;T%|Y}Hጌ/ļ,{͟?s~f֬Y[Ϝ9szkzyϟ_7os Iꂞ={Ԕ 0eVZj5xi| 8pBssz7{oMLv5JHTI>%C! + RF:6W@|;G;?SkΜ9ӹ$hlld6zM]}'2~zz&7iCO _&~-1{4_f)%UJ8!Ti?N UI$U7HOeGlʪ1sn6mUVi!߻p8Z={̶jw=뚛?FHl ,(C"p/0-?;}OEm猣.b`,$IAFV9s\ I'ȑ#[s5`t8*zvqǷ]}oU:d/퍛5m%t=6U \ ,!+=$I #G@oe Guw6|;u8G [:;ע} ~Jj$ݽ! 2f5`j7@.T =I9Gݎ#I'I/{NinnqQGM7t.Qѿ>駟 xysG8XԍsHsW)ov!!HR $RR).C@zb ywG;8}ڴi :Çя~&߿? Pp!I+2o<Ν˼y9s&w^'dʔ)̚5˯{1yuG?z^YRc[WΤcb$n.#wAT"mJRy@R9\@r[ \ EzBSp '|jʔ)7>CC;}ac]va]vᓟ$})GLIR+/^?Ox&Mhjj*.X`qKKK{Gf,v~KKm <ɷ#Kʋ&d4<>T2l98惤r/פ u['5Y577{n[w7o^8>~Qْ- .[n!˲d\ F;VNH]"46ϾKj.E |DRqAR9mN*_':Dz Q?;}Bѣ9߿C&I pBnN>dzAj:}0ooƎ{W_=# L2 &0zh7$JݛޛoL:w޹ÿzavGHK(EzCHxPLIe惤r{ Mt}&7PU9sϧ~[ȡs='?Y2>ƽ˭[lŸ6m*3fx3ػox?[&`nx*gM2R 7$I^8yԠ38c]:byLTbvfC Y5x1ǜډKN(y-d`?RAw?G;% Hi39ñtIF$I5|']ۤa/j駟Fm 4(袋%KD$U[o{+6;3f̅E)6v_o+wlj%"}XO` 9$U %EX=:!;ƍ-r+ҳ1bկXm*MSNewdmLcc#ro;%]G[ǁ OJe}>fGW,>$)H%p6,m:37~{3mwy'Cd4IR̝;ӧ'M;LXlq?N[vN~??xZ\< vͪuuHdٿR^,"I[/dXHzrLssO|i'6lJ%{Dzw9kll?ϳ>ѣkI>}qTORm~ +޾ /u8٥ |$znp5M(IKdho%-:W&vqN#Fds)ˍ*IRy͘1#;A-~qǕwԩS^zyM4hPSOH_.ئCǣJ +V"m^"ޘ$Iԃtc7zph&]@C9&ɹves-)IRy-Z([-2khhh3~̘1eـxBe6H)E_3`&YMM=v8V4 )wH҇,NFJy 5,O<nံfqmTXn6mcƌK_O /^6xc~t%I0c =\k/&NHeL~;v,{/z( H 0oeYw}\з_ tӬ#H.#{>߁cH/`G $Il0pO8]$5nu='|VMMM]Q(x XIҊ-Y${dzm6khhh:Аm=w9#Gl6jԨ߷s [t%_HO{̒ҋT:ѕ1X I2V>HFo{Sm>6!N:( /py }o% (I*9s|]vم)SP,&oq]w뮻lUW]E"xwܼJ:8TP*K#7bci-70xT8R!}M"ITwv^#IMH;< ڪz0`@kE?+IjEKKKvg;C`v&O/CK٪bR?IRk*M]'8yL'%'IUI~` RT&= j]Vw]V_}$uͬY8sw}yiii`sfر :BՏ=z4kVߛ8q?:h3^|ךRZR$UܻH$ I7n[BΘ |+85jꫯ{J>%{Gm6+ l&7lԩvM0?av[:s],'|(}Ȫ;"p1w$I ''D X{ԨQs\pA=(I[رcvУGO̦OiUX^{Vo  p]{@%dҍ|(P`s7- HR q' \O*ɗVZaΜ9ƪ?OK!?0ƍ'˲noΥ^onvsVw '|8 8 [{tyal "cIbT35uQg}6guVt I{Yqso3B޽{k+h",駟ŋ{MMMdȑ#tZKK  bܹ}o뭷~ lE}!%XDvpi,}gSpڐgb-\MM|jU(6mÆ "IuGewgӇޚQF/|!C@߾}={6 .dĉtMo UW]_?J\px≝6&`G// tвH g "l T.n>H7bE5fذa;c2p8T^yc}e^(dM8sc=ѣޡb'|SN9'.wlӰaø;>|x ]ow_#|F'R-y D$I&bGǀqejlRI3K,Ɏ8V?>^k.X ;餓Z}}sٳ'b :tEש uGfSpڸT%I5o敒TwS@8R,\)SW^y 7ܐGǒ7i$ƍ9. ѣ ---<ޫ'>ѭܥR(xy'GyRT6%993xi}*I5_T~ l <D* p嗳&rw/wl$t.徶6AngϞz|}Ŝs9̚5˯]j#Fh{F:omgIjCHR% M#57TS"Ǐ<Ç/f\זRz'y~nm<,5`.*٦M/vءsdOwJ{BghI ]RZB:Kv7(RL:?5\#<>:$Մ3g.8O%{C2zednTmk Q|x 46TVHR7$ջ̀sHe5{l.r6tSFssJĉ߽z⠃G%{BaF߾}裏}P(pǷ~ Q~};p*Jln&|$7$)52p(0/8TVb &z$$uy嗗Zcc#kklf˽ose,Y [_{477^z&#DR7NpI $ǵ6AJH&IF^ze[J+zV[m̙onii_3SN 6կE̙s_XG+mK5SA$)/|e=lOj 4 ~oΜ9k<+#[xK\@z,+n>H}x=8T1b[olᆜwyL>=:$N^?2_ׯ---eye6{w+a}ݹ5kY1{l&LХmhh`o{fڼK/jia*pgP}yD`apI'ԶIMn"U?N;4E&L`5$R8 IDAT_~455-3f[%UKK ﶴOs)3fy,XN<7hV>cƌa]~QU؍@_#Z}jzA$)| Mj,;-odĈVCHz\UCԩS߃ bΜ9swU?YH@$B#D(P~%8Z\ժMQ۱Tk3uZmqiGꋊmI븀EB԰'$g8 %sz^\In?sr 7tR|mff&%%%t{6JF[rxxYkLJl+p$}!Iba{BHi۷/EEEwX`Ac7nd}i7ndѢE\s5cW~WؤI޽;׳n:^x~~i6lذrxvczmO'b ,$?S@Ls$IUO9QNNN4}g"IJuO=98#)--%3'onmúu: J|M;4p)<\lV$I$GK #Ƙ1c[o5O;6{999M7s?Qw7333c=??zuuou/R\\܈Q0x&Hp $IR ;/yyyӣ<ڸqc &I]&5jT׼ovyh;ZzOhҥQccc[e K#% I$%'`v8v 0 袋W_}2gΜ׻3fDovokjFFFTVV}ߌϟ{9ln|_җ֡ʁYp8x!I$%xv8~,˴| oIҮjhhn(77׹;Ne׷hjj衇ƏfFFFFTPPM6-zǢO?Kg9+g({8Hw8`P$C.hfoH8rss6m~:SN[n#Ivkll+d44450vXa,ZW_}(b}SO夓Nb zy饗r-9^QQѼyJDJG݈";rƑ[}%$Y>HR8$p)iRUU9#IPSSvijjȠ;SO=ѣGӽ{w22V7M㕕Ι3,@t LI@q'nQ URS& zCWiFEEE½&I[so}sݛ'r)0e 5pԨQmxW )Ս$^~ir#6$Ľz3 06t)瞜tItIᄀHV_￟;3%KPWW]׭[7{oQUU{ЅC&==[KJEg78^ DA_JRj.~{AH;mȐ!p q#IZz5>,O==uuu,_lرc9HRC{ɡHnĈL>SO=2jkkYx1555@>}(.._~;)f9穧 ꪾf$@d68xYTGHRIΫ[IJ y{A$GAqDZː!CBGp3{6KKK.]-@dqp0ե g$WI|)1iӦQUUfՒԉ8^y6;?oH RG0G μ1:jsO9MƤIIRªUӧmP?3|N+Qeo=xaH)3KJ @#7^(Kogʔ)0c x CG /[<$,`p'_A o$%g>HRb: :z͔)ScgϞ#IRR9묳x0`@òeu@%i@qW |x,tIRkzsZtݻwgԩTUUqQGQRR:$%Zիۜ;=3 8lB\@H\ھIs%IJ\C"Z{1>l ȑ#+3g7n Oc=nPVV]ecYK))p RWxxױx'i%)9.!ٕԅ89裙:u*} I;ꨣxQQQӅ^s֬YLEcNvGJK M@m,/` Ie_.Atѣ 22^,YBYY mUUUO3?a= FJoij$IIe$)/P|8?>_='NN8|+W'I]beee7wqOo=O)x$)y7빔uɓ ;$>!CPWW\YYنwy'/@ & ݂&"~|X8$i'f$%C#^@R砃Jh.2nvϝy<guq5hƑԎ 9Hvw_~8ׯz(L:=#t$I! 6k׶9WZZx95kVۓa& GƑ l:`C,]d IeQHbC4+b#I6|<힛1cƯ|8R{v#^>evx+%'o!I ^IRj::퓕رc9Ø8q"%I̝;I&EQs}m Κ5zijYrH9"IXzo] 'pI;(++Ç3a***4iKRgc…?~CEqqąÄn-%~ E ,$)ppp vMII &L F֒UW]5\Çםwy_z饵 e>x/+%y롃H:l27nsQy)E0qD&L!¨Q KRy͹ .‹;ePj;%)p93nb Ip-p.,^z1aƏϸq7ncIJb˗/g~;<޻# M<&nx#n* 0,$)=oH=5tIe ƌرc KRhll#`Μ9/,,fΜ뮻nv>e60xCʉghJJ]"IZަCB56lXB½#$碋.;h\FF3gμbOѲWa `)"I ûLIRw;ͣG,}7-4n88:f͚W_s_1[@R2J&uOY$IY>HZoH}*}^aa!#F`̘1Fyy9YYn#{3gn|yy?k׎$0U$%' %H%In'Ģ$mCYYYBb燎&w}̜9vgddEQ\ 1tIR|$'x (HV*$ƎKIIIXv@MM {,$Oko-%IiA-+o9HJ" :#F0rM2ͭjjjx7Y`ACG\6wWg$%($Ic8p3pT [nn.{WBbĈ'!ue˖)^{5֬Y:p F f I_")Q^^Nyy9#G2k/z:V^ͻ;… Y`oo6lORy D ` IQ݀3kY$%{'#Jŋ;{=g>nng$%I.dIARZZn11rHBG>rv$I!X8$) Y>HvU)Fs_\]RBi5QRR€<M>`ҥ|,Y>bARp9n&-I6:$u< 0`%%%|ܿHRP]]Ͳe˶?)tdI(oo&A$IA2Sg.C߾}ׯO>{իצDžԮkhh`ʕ\UVQSS-ZTWWb VXA}JJ;Kp{x%I:$3u. EnnIOaa!YYYK=ѣٳ'yyytޝ\6uQ[[K]]k֬Yz56l`_ 6zjaݺu k׮ IR2XI@],e I E@&IiW^ȠwmgϞmf`-Z -544f͚6ϷrJ(&VZӿ$iwP,pIR|$u2t$I$u&K,-E&|G—+o$Iԙ D^|Gҁ@e $IR|:$)=Y>Hug D$IJr~<:$)Y>HI%`L $IRyxV#HēT88$IWQ,$mb IJTqg$Iu@c($e IJt݀!aH$I 8$I[e IJ9%DI$$IR[A\:"I|$%݀oEH$Im9p#p'>pI$)YgH$Im9p3p$d IJv-16$I> .jg$iY>HREpq w,$IҎzt$IRg$Ibzg@C,$uIRF"I$}ޛl?Y$IpTTWcg$I^nA,$I80tI$WY$Itt4xc H$)~<:$I]A'YH$)u4^ E ,$IsH$)ym~M\:, E,$Iڬ/pp!'pI$%U/eH,$Ij+80,pI$%[uaHX,$IںLhY$I8^n~ 4"IRB|$iL.'.#)I/D $%:<$inj"b8$I:F?H4,$I9sY$IVKg$)X>HkvN.F"I]X8$IIALd#IxƑ$)Y>H"^\0pI$maV`a,$I:OO૸$$IRyV$X>H\I$)HԵʀqI&IҲmY$IJ$Ѳ$Y$IRQJ5Hv,$I + %$IvEp74.$IR0$%`p0$pIdw.`I,$ IQ&p_#IZ6/Y$)AX>H؜ !IZ,>E$m$I$)9A$c IRq6$IJr$)IY>H !IRQ#HJ3gD8$IxP8$IE$1%)@Y$Ie8 #I:$I+88 8G$ ؼyCq$IRg|$)='g"IB*- E$u2IHg}g$IxxËH.d IR_#IRD#

H<"Iۻ67g$I A$mH`:L$ C{9q$IR"|$I#886$IbOƑ$IA$, "d(lIIVOp`c8$)X>H] N\D|6$IEs3G$%+IQ)Eq@q$IvHdG4S?^HRb OsqhI$Y$Il`*P  G]V #.#Is,$IR&#Iv{x99aH$:Iӈ GM/46$IRdz|$I'q1 #IJC瀧 g7Hf IQ h:( GV/ #I,$I6/T  G/ sQD$IY>H$ 2 'h"IR"j^esG`CD$I A$i\FPlxX6$IRY$i'޴zb$)E $,㠉$I7ʒ$IG<+b0 H3ZQ<|4$IR|$IX=f .#&֒#.sUAI$IղBEAIRzZ L_<ђ$IA$ke#C\H HRl^B7D!I$IcA@$)^ sqshI,$I6RJM$IxE<`!2$IZ|$IJ݀a.$9IE|6h"I$}!oV%IW`c P4$횏˅M$Ib IZ l^i 0 J2e|L$I)A$){ӺJRڨޡu7`]P$I\$Ik Р$%`Ɛ$I,$I#LIDATb`_`PN\HC$ XH\4/J$IA$I!({5~sIl9.q.6I sI$)Y>H$ąDh91MJz_&e K$IiA$I0D MJ.Z6\4I$i3I$%B`PB\H|K>IɨXF\&T})P>I$iY>H$)XP(m>a1T@I$#Y>H$)d @焉$P +˄7# S$Iz$IҶl.&JhH$I;qi##uΪjK;>kI$II$)tv#."w#U"^ *=l# (h>ޣ9{ڿyl6|X=s"6h 2fcnֲhX|L$IR?IENDB`mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Baby.svg000066400000000000000000000450541341747546300214300ustar00rootroot00000000000000 Baby Created with Sketch. mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Carlos.png000066400000000000000000002367071341747546300217720ustar00rootroot00000000000000PNG  IHDR@bKGD pHYs\F\FCAtIME4IO IDATxwg]׹g&ɤ YHDHU]IJ,Y\w\U*R% (E,Z I@PLO ԙ=fL)w;<1g3x|2ל:u]d}ڿZW\6.j[Ⱦ;|~ڸghŸsSWV[o뫫vW7ڵ5u V]_^g\=U[H `QmCi7~Gܵ 5 X `i>;tQoN&]V/…\닫fMuxunh$5*`k74).hhHذޤ8w YTݭ\Gew+ov{4`"i>0)v$հkᨅq!G544T[swx}f@dFvTw}C#KUJjr[_ݽ_7o0ܹN`l?i{ΪάZ]<, ;Wݳp^y`E| =МR`1i>7_|FpG0.]Bu'4yaQI~M_-|`Gw`oC>ՁJ\ |Uk.wuBP`/\А8m!gV\]4E`_ݻ7X42p ӫo+ |.f8z'?Аޔ8[Y:z9zkFgw0y4&ú껫aG}OTVb`u[7n4S,m܍`|Xy VS]ꟺqC+H`yi8> 9::ꟳ;`h>,41S}U ͆lm8CАTY9zp74\S&Ǫo* |=GUlL͈WQ]p؅< `fpLӇWVpDoo6<2(ps۪wC3;|f\Fq ͆tM]/tå3IEw놝 n$,+tΈӔ%,T=zBCNJ2F=>P]$4|ݪTOQ$xOj,4|ņa ew†&LVkh8+e:=7]}ڪ$r|Ӿë4r8RI`I}z_ÎVFXjUih6PuHC#]J,`)ܮzB۰X=>TqIX, ϭZ$0U\RITzzD۾#oZS=aó{vD^I]승؆ϪS)ViV%npk߰HK.~sur5V4z@՝_oW?)PuDR`QB٦k *=Z$"V}Xn10{nǪCXBUT}8C|pG[9/ wCrt|鵾zJ.* Wj *%EճXŮ62|pT]wU`}ϫs&L c0_}z]j|ɳznS]bUor|`0 ۑ 80&>v96!`|.=c72'44TQ=zo #+Ջ)jc.UX^Q`XrWVo:S9`yh>~V ՇvB&`~rd% rjH&X"80#w0]@̝4rL+7T{4`|O *ԛWNY]ꥹ`\^{"[e몧UZ}rVo(ܜ w9Ru'p1˔n78)+s4 U=t}8S9e̲_~Z,qꏪw+HY|{bC%Uf=oV߫,zK5L;\A Bo)Ji5W=zYu`jϪ|`ڬ]սUիT)BiO귪+ wBF9tL _L ?Wur04TW/^ZL?ihD\L&/.vGwIطz^p`|zeCzvW]mVfE SN9X4XgTr|Ϫjj|ow{+ܪ/5`9VVjr,|꺛|m\]~ڰ;x'k}"+bKe%R2`)WՁp._e ; ͂u{,|ߵ ͂,|j3WTSmlhPV5 .j& ovի3`i>Tkx̘k ,7v|}c[5 ͋5'v|}H#Cb{sQ O`1={"VU74 v|}ӟ&¤д8ڼ;f;48::I)X,,VqpN^6m-qdž]~w JL4OJ|`oݱa (li8 7}jR654!wi`zi5`Oi>~ɨ !UX&ŦfݪW[x};*Vknvk]wλXjvŽZW`ؘiR)ľ]zUur4W/o`1]U}b./U_Z]ZbuRpk45*. 3sLևnZrur3&\C[/74ΪN>[]40QCuB}V sw7Jĕ MӪs'LuսqC/5~`;c߫*Pߍw3{nܐE֗{_h8fgrTRWI4=,| `WZ}ob̦kW,H0۞RJ3cKuFur7h8+@oUU6( ̌s_l04fWWW zgwF)uսȦ-IgbRrh ,a*]hBԆKVcАp\Lmю3C`6U?x8X9`j|x.v0k5Q}hns7񰆻#eap)J0LƆmͿRQ8۪FGsL@ G5=zlCC{}&|W+`h>LgVX014#>U],i G5=V 0]^qJ] >X]${mcC3 qLLT?Ӱ)`0UTXWX.h}9JЈx|u%USɦ0UIu_Uʆn8MIVݺaWc) :_~RL.ud?g+6lBNoLiMñL UX[_.Tɣ0yTP^9`]T޻WW( P=zJNJ+eڦC`<V̶{7<[C# FSX1W?]}V)&dXns .@x̖M V?P%ezU[i>~^_K)`Yհ='sw7kؑ؆]xjh6:M9XepYձ簨JrLnV^^v5MNM&]7ͤk`E7l~R^۾McCŽX'W/$`ymw{l{//+S GsP=H9`]SbaE9ϪWZK>zV};ꟕ`i>,߫U-6pRÖy@ݿX*-~ڦKG`iݵzc] Y-k]+ OWKF`}sESMVj4i8Z[=a7UnUկV[E^_=I)6Vzkur8zj1p>X7X<& fnpέpmUXC#Ep.s:XІ+Եջv9!Ќ_I`b;{[n0_}UW* 'W/ʱL3U?p'{`Xra ͆Ug+jw~{*I MK`i>6WR@UWpp5V8G7ܲVR0R"vbSu| tIջ]l'ֆ]7[fN%eZOU߭̐+7V^k rV Nʓ;2;7"[0>ÜKf(,̯= @UTg,3mXs1+;|̼GWoL˫r+`s,y`N̅x2RVVG2,]Fj`6ܣ4G+~XFcPLs>]ݐn'TWʔO,l tO3u2qC`oj+ӘWG;xԋdJj?C`:ܫ'\œp 0mmص%s>œY0lO.5) 80檧T2)3 qɳoY|7,:z¼P%1&ÝdLOk86@5\NsEZX~ɫLA.kDza Sw^Y]n(SoUO2VՉ6V\wya K^LQ4Q E M i=m-!˘+'z&ULzq6pd%LRvKMdp՛y YܰvچMd.+{aQYLjaܒ42j_̺]X2ՁpSG6\k$1!!ՇEdrjvpoLd)sYed#CݨBoYk} 98OYaw P5,q.5`v=ʤH04<].WZ 5=Ϯ7%۫C 5X6Uv%u3 5?Um3 %ʹS 3?X}ZF(Ջ 3~/5%P:0s`<&K q IDATf0F+Mvd 3xU_Ƒ%ʫ>Ě &9ٲ0yhX_{eijao&7| C 1>+ zI,r6io].BH Ɍ,rZ=_dsJul|j fֆ]۬dsVuG VV_1yEyՓ -`oZ+"k= -X_k"W38awu,V.`hs\uɊ,R.fXEPHvua#+MRdކ{Cva;drU VMNdrY"C C7l%2`=m؄D&T?_ )`_TC &!b X"ΰ 'XzϪ|^MF XbW[I{߀8pci<_*LC XfOeM&],VL6d/ꎆBE櫟5`dRX16W85 ~P3 o&'z0Xe\}ŚMK #sjB!{MJXM"i{Ia^dJk9ü]wɃaNi'$ X2/7i?BڧzwLdryuLVZ䕆o$0eY}ΚO a ~@ o3|)>0ɞ n `FSo[}؛JNMi֪r+=bT'yS[sjz5JU5TX ތ2_3TV 7XYb ,Wz[ȵs ֲr y!rMo-_,pC`<$Q- O{ӕ[ 0ybCc6o:h7\4l+7ͶYKqulbi鰦z$WO4DXLUWyTO 6[ʎ:`1ܷ7WIU=jUYMrIuqd5or|0^e-,7{torCu0S6U&䔆K`k?_Y[Xn-nbqr07W'V/S 7m:z5k6T͏ǣoxCm\;ۧjx~h>xMh4Z_m|7}}S%gyf׫:+˪P v ʁ ~KXن[`{;sW_;^ak7m6ں~4mknm͏֏mͯ5ШFQomFmhXSlї͟6jtZNvşՐ`=zmvsCp#pc/hVCUՏ6lEu&7ƍ7moGMhx~xӿ  x 6VêfKΨNG; .b5oKq ;iϕ\)`49} .\<~N͚4ss?ͷi4޿qǍ:F5ncuPqB꒯t.iS5~ 0,cT+Ֆ)4`U+WQ_Q f76۲q4msq\;p\u`\A UթpNF?u|}v%+ { ;TWV>:& P O7#mVoj;XW}[)U̲ )U/ *uM]~Amm~h40mhxF5Tո7jn|hu\XӶ :y4}z~Ssы?hvR< |`Vja"lz~6nnQ5?\sWVSFs'}b5PK)f׫.R * o7G*L;AoCxߺkS;5:g4}nԶS/?%0zR̴OTw34o 3U+̮c6rKFO]4ǍNONx_XmUUqJ1tOQaz0[_]0C9nQOT!TV''O~+,¾_5\@/)JiIieS[f櫛q2cTq8O4xS.]X+gm<>gTR ?VbfIVCx۶GhnGO;K:֍8G~-슯W^u# `Y?~Q)f5 L?p0m>S3.+Z7|أ?xw~Eo;-şy{c߃5~iuȸ:x4mk>rƅ^,˕afW}_uR0M46UV]0j?ћoq/~ǖG+<5/,몏Wݶ}UIUѳJ|`>I[ToR X^q~qOŸ)|ksġ?<9^ `khy}4j,XZ3 W|`Sz^Vsgp<.w7~_u#{x44fi՛Ϟ{`W:@)fΛ)HI+̹yA w]v\q [?wM1u;+m:MJ1s~z20i4D6|ȏ荍[ οv>ǯGXXhmly~epblSR0Q3<%`¸`z6]p)JK͇`w%*N=`uR̔ vL & gE3ރ6Ѹ}U 3Kl*$1bAD{ڮXh*4E MDlDz -!&is%aΙ~'-̜9KRًVx`{TWWBjۗH.^I!ID߉qaOI?In@XI@1r r җ:x@s]A!tcE1k*%ڶg(tni#-!IrC$7w|W_]gI9d6p+Pn )I>(T^ sF=Ns](\k IRYBpk{WZoI9b@)r2W22e(m 2qmOU֐$ֈd/[r-@)rCNS($M x3䄭L! ƒ!D\TvF' )M:bѲu:")@zţY򒋀,)IҎa0ue%/lh&S|<1)ۍ!}MAbr3su6oY~ݽmSIDRJe5pLݐCKK|C&EV"y~ h4?a+ \s]|Tl„ .J%>c$I=1+ ΦLfIYfz1  oM.>c5O=P,ܶeSˆ{zÇďkJc;֕MVh˺WM") f"{W~F`4.2Cֻ(X^4^ a`N,_ڕ rRD1gJ8xzv7NťڊHN[$ 輭[Q[}!$bh0XdVIw4P.!-%}SH3y2}/9bc5%I0p'k*ߍ+ HuӦjS ͠! 〟! ^2{3j DWu7-m7NUQ|$i^l/!bf қ+{} O^6 Ymp>Bn{q~\WA8x$iDМRϨ}zmEE$ȋ~JSdI*OyոC6[xRhA͆EO7D!̶$I/LjaF],")& ASvPqt`>R‡zxˑTtGsș!>H9@ʟ^S3$baWv8 '@R H"+E)VTl !:1U$)c_o !"pժ{Hp%7'1gp'Sϟ@x3Em3H}([KH3ډ o7_UsH`3Cz6gD=L | R߫-/8rI$|s:J>ܲy˛HD#pyl5כB})!k |KX}yYx՘$I' ) cXlݺH0S]LvZP_q%ɤ7#*6EVzh7(ߜ^!IR{9"zhYㅰ2H1p;)f`&)(F}rKR`~}q IFV-m<}„ &)/]3JSrm`R pf QV$Io5ݸ馺 &2j Sd݀s͠K SVZ ,2G* $i^mW "Dp G SdmZRQ[%$IREpҡ[t{HDonLVj^Cpp) Ǧ1$JB 3dہC)I>ht&3H}kkJS@E$IR/ S^r\myI 폾"Io1csMuLL/Y6!p\WwD-t$Iu~rLX z‡Lu{ MbT{gSd[#SHgmفp$i !|`녏f9$ |w:O3MPwz IDAT )HBɓ)hLV|!EЄI4J}ɏזW?bƍfRwU*@S;<:f3.YRSHG]^(}!I2Ėd#ڞ3~6x4EVINS< <4"lC}nj)ڰe9$,"I2PG T+V4vჺf*^q)۽rd'7!IL[ߏj9$2^`)M;͠qrS3dV`O/J暑3:$I٪WkI4xW6WAA;ROz L!u_s](J]XC$吅! E+]!/}=USM7A;;PSdDSHTWqQ.g IZCw.nmm38If;Iw im)if*_.1mL"'Y$IR* !:daemYqY$uÓOYcX` ;/G_b =88TWq)Q8$Io^"S:>7Ehv3]WI^ HQR4V~$I+:Ï\ҫ!$bY^`.i g!k$HT[y9KH$uK''H|+W_KھFaYsyf9|п <"+l6=M_h I^y! /_eIob?6@({BA_W^zLϷ߼4H ;nP3A;J"+,rws$I!)Dݴ3d\WDzfSd-IO"9|P x)jk` fVWL*!I4ZGEV>f)g5 |]5&K0:7R9bĐ}&[C$i-JEkC9s? '3Cr'rSd6T! kH$e-WnD| Ya)rÇv30 Ygam3j* !|$ImM < U ݋KxHGf 7Cnr~j7n0-uˌy! P$)V~Fgvʕ5܀: \mT<d7znx#Q"`5$I*<7$:OZDRqXi{6ANxb 0aBᰍky$IRH7lK%}l nIcV w-prK9Hf 7=㊒߉ҿ %I3M&+/Y[VQ\B[{UK87X.S^ ֘"w~x;~o[Jz8K02:j!Is=[(W[[L"J900}cf r籷 Xl {k*o,!I:p)n[lXIT@tn(ƛ"N~`{j>w-!I7l#O/6nYjUQqv= 6"f .N7C] | RPS@5$I)B0(E-21CÇ<$MkK=q",uW1$IDHR|]wAIP dp֊LISH3$I꥕-Q~=^|qIA5ɶ^o)ggSHx;iH($Izڹĺ![F4?FiAFw"`)W>d)`)b{IfDm I$RD!-~tK2IGkk]H!m&Z3C=FҳMrqN$Ii"@di@^r|)b*83ddkIo)9V.YC$I'< /_q-5X 5E YhS< L4ElEѕ$I 7/jiҀ9bY`* N]\hG6\TXC$I1%s>|}{I~$05nW>dHPdzf *N WXB$I",JЊ/CW S&`7ySdaf @$u_L!Ih[̅VD7E@)bVP3d]>oX; R̨zgd I$e$D2TWV:bD•kl6^V0ElM2EyCvBzmzS { ܌{e I$z".+κwժ5[-.ZSěW>do!^B USCٖ$IRLӑ ' )MV-xW;"?^%d)b"&&f8ɕz%YA$I1TIĹC7{vFmG$Qt3ě.[exvnYgH$)aK6Bg_6Cl=Lgvyfzg[j|aHʛeI$g*?'Jqpbi43ćÇ{Z࿀R h+H$)ED;[H]֘">KzpEf ˬ(8|$I@h-$߸*3C<8|w!~ \m_^`M$I@ nK3{f|2_ | RߛZ]]KH$IyVzJ3҅*9||<7NVA{Dj$I(<''d8me3O dXA$IR݄KfH3d.,bfO I$ȥG^:x 32Ç5/)~I1$I: ZHQd}s.7vl I$8XA;!vHo> !3 kyxqEeV$IҢ(x7> ,5Ci!!vR[j74/ $IBfOl:M;> ! 7C @Jl I$%Hh| 32Id3ΣW I$I +H}f/C̐9>dF!V:H/0$I~]rf/m3ET5Cp9S;AXoJ$IdO#fF!38|fgAx! $I@xR9x Rˣg apb%l24$IDo')bCt3 >[spAzEYA$IJ>`_ \nXI^eFpGhphXyJ+H$IpŊ' n/ap9|\I\3ǀfODI$Ir^܌HaAoAea`b ($IRQ Ҁ=pbepÇS | G V$IR[3n3Htel 0 rfi=b߀$IR?7[BPI fG%A701Rϵ⡜B8 ?+f2L4$Ib(`N}(ȬҠj>gX9 ;7Cl RJ&0$I2"޿uo7lX [WִҠ | j2C$e+,!I-E4gak K5BoTFD)2(q40 : f)e-!ILEdiq˪@jA>rnA,,eyf| 8 -3H6H$)cF/j]9W^Y:Y8Ϙ!6fa`8|8)/'esR n$I2ADtG)Z~IFz)>Hk닖2T3L00> }?h)-\i"ZB$I5Bt⢖U?՗wG!p–M-eہ9|%ϘAM IAA&3pc:752Xc8wߑf-f@r IvoJ쵰e\rEWo421|S>K`["޷p*_Jbc&pӝL Y@)x=5V.ƙB$IqֶS/Vj="m?5 ~e^$^j'JER uw% I( [qK۟{5ʻl)!6䙡8|?&!Z/AGZ[_d I$^&"j^Ҷmݿlݫ}TW3C,lN55RW?H$e590.XK-m]ݰ!g^*|3[%m!MꞎdjUwzOKYf3—IUr3w PoX8x RH%O$IR= x镮 ݃c1"^^=fd^yeu~3j+z[VY孫ξ :-xuǀ Mw TWeB.M_f I.-yr>Mzmg\x+^mg6u k\˂ǟǟ;boū<3_˔ơ : &b!+ޖ^10 7Epз| AJ6,5E"ZC$)^xfs(/-[ڷ>F=r&?̋|Wύ#06::>4ɕey&ߴ"":c|˪Rx?= >k/x"SHɫ$I%Ho\*G!\_y˶v}hӛgO?D"wK~^(5{Z]]UR7E->ǥt7QlIo@|8 h5VW'RKkH$eD"3v}P>/"~{w'݇䝷Ï=/ 8阷3ah\HD;{z}M'>˹.N{_ Io:04Em3ÇQBz|'A~M5U DZB+-.9yej~Yd$ΚQE]Ո}݆v_a7.?9ͻrAS_ϑ"θ*4!4]:% רyhy m1E]ʵ%͐Zq&SÇI|3d׀U߾r0$Scm%7}gMeC{;%lp8+).936 ٿq5*Qupݧڝ!e%]\k׷0_fD0sz#;;OR-mޖ&*gaxw>^W2zVH֐$)!SQb4!^tmIo῁ ̐Ç; Ig?wB-͵UGD$I ?fOgQW= etvzC6{NaSU[cp5`kk^5߬ݼ+e%Ń]D8ԿqreeiY+W!$uUcROEM+shSdC CFl,| $K!lw0ۃc|kXR>fM˄Q۽Z/dђ0ObR]9<qE$Ɓfx/a)zj^9_qp#n3H(D?$IWTϡ4cϲ|~|#,kw ~,X·;(mf 4Oi[ڸyge(f>Y'R1|hF\Pߙ^M/ 3C0rsI)`'Sd rnFmB7{!o/o_?߄1མ5c[qf>XvwT)).b.cim3&]gg{?G"`L4⢸=IC)x` Phr<ر8xoAD$9N$ci7v_}黎Cb1]!+dYOb(}Dq8vqH&;M*b5oB۫먫)')凗撕gM")op4p)z={Hz29m0 h I͵U$)^$fҸ&k`ʤ1Y7~L}yWy^m.ͱn_Z\oaΤjP(3.Ռ il='4˄F&k˷d歔gUo>P<ԙ"=Ezp&|虣qeU͵Gc!I ; IDATVU#25˸&0|ktPTA{΢jd6c{UdQ\σ! )͸Ð&.uQ4d2 dw7_QN8ziyS C zQ`)2C, 2wEE悰֐$YYi1S_*]W٭uWYǗ.ZW4ϛ6o[B1NüiNoKq/'' Xc0S]1ؖ :niCRc5"=cǭ9 \q6/ffG*|kH2YIquUéAMpjGP[1 Z֫rZθJZ^YS9w wvvKgђ 4LcmvoŪ5qXf‚|4T11=d?[]Z%fRSHꥹ]fxߘ|}$2DR(Iڮ溪DQt%$I˩9˩>CAmpmm{3.Lg3kDD>VE\|GcqߍsoTJ w< _y36n귯gXy)cGU35mzdygi[3CF[W?taRq8N2]'0xB8$d2ɰR+gĐR )cİr*3r*F r70Po_ūk4`?p65uwޓO fNۙ݃ M[/{E}s"5;q5flcl"y+xEx t.E>2vPp$uD`5$Io! -+aȿ7lHÇ2lh#3tH)CK2{x|Ÿf}5y{ɍg}_9b(;ٝ]@{sɕ굞_]*ƍaƎfLC v!$ fh!ܻC׹ZBRWY?3 :kHR+).J())BJ(+)B){}P̐Rޟ~~_Z6wo韚6Lf]u-wsoθ^y̚6IcOBgg'?N~uݺڡjXoT u#I&]6)&:!_ݼ{PRoh{9|ߐ^vIK V4'w%֐kJm%I ORXOa^y䓗LR\T@^^E Ņ>L(Jׇ ,%-[ub8o&3v/GQĕ_zFX{ܙQVRܭnٺ.G~aWVRƏa\c-먭[/E!AII3KH$Ņ(+.D`A}cK9׳-߷gO}zd}M) 3шݴ+5jzq.cdq5L-gz&m`QUC~{=h Ipp2a>:S2STz\Wyqq)$嚼dO~ݴ1I__ *%E̝͙KcWI_Uʹo VuM9ꤕCI1'fk 0h1^c-Liyhi#)s j+ٺx;kQ+-.b̘<'P5+48(QO%$Ÿ̐^ xsvS̐候SHkBކ#8r͐=hS&z10yW9Ia_.Mo;52e6q cI$CP&xnS^4eNb I=4xfӁ}R+ekAR<*I֐k&kO؃1艥c3s7fLO23M57EGgg}d2Ac]; 5[sqy 1Cz S>C۾c̐ \;c۲@8r =yiIEѠ_޵Wz~CUSjFW1ƺ*ъ!إȓ_6<{fיMә`!c] fIa„ 6%$嚲b.?Jf~;ro?e]IFG۲ekzq6yUvA9B/3D<%tS^/_E6"[)3NߛYR"G2H|K_-21f'0s3,)6obc&oHGG%?s|_D_^zƌh"`+9[:v_V2ww9FΧ(Dxꖓ/fSRqA 9\ۗ@Q I|I7 : dɬ0n]fvp?kmv)_Zcj9K ؓeMo*j;.0t1R7j}ϊƒ_=+i1~荳gNke9X3qPQC}FcFS6WOoV=}} S%`TB]f;ċ}MǷP1JIb$( $=#i7I4VF{=Nt#1sHY% X9+ORU~/hҸlGq.#'Ƃ_ 6OVBQ*k/>$ Й%_zAΪekp_ >l71?qY}d`3L p/KZN0Ԛ?bd1ZΕU#N.\C "o!k:^x|p1޷' B"PBV[9kXS&NԄqc4iR-G!Ĩhdsa+[ƚ Zlzzd9O;Nj&Im_22=VrƱ44dCcFV60PI(i'I5Y_k(' ~#QxrBlО1J%4DƍS'j¸4DT"w~{şy>vRǸ3dƊJt1 jfq-JI&u1|$urgDq RLJuigREl\.|kŮb\t*cFԗP,O=SWOڻzʎ[gۗ crE?!m jL$ %A,'y*Aҫ|GwkD5ҠI_OE@e Կ6rL:L:%:mkG#ƌC4rXUrYomk7UkꪵZ;qAO)P]yIߓṪ%-_NƋNPkΚ/M8PZerRL0>)j]w.;Γ[N֖+?^xE/Zl}}tY'ЁQیo^L<$iilϿ̺{B?(|I$ke; QxPܨH9l֙tQRl2M\^\qG{w75֧}̩D\vi;OYz9=kz/kiC{WM1IGF[ܙpN h>+ϭe1w5l7d$])D;W jaC+|\K^ jJLuחW_.r1j5Q6]G4օ/Y=?~ F Օ^LF-[Z9䋹? >Il-.E *Y˒D+%*'Y ŇVѴVy͞nR)2 nQG{$q}WP.k3/j#Ojχri=C~h:6j f]|QT#\7_gkq:e'2y‰L*jIwBt;"썧/S% not2I 淐UP! rM[o#uګ][{zB|!4o|FN5{sq.ITK71,<-iilE4q']rI%=)|&)OÝ$i>wn6P>btKI| 1F:tu}˴#{CbQ]7J)j `YgZ Z㍵V0夋B*NI% a/>,t"}wt?1@3!cI_\kUTSvko! }SΓQ,`7 9C~MVDM*+r…OXk?K꾖YI *HI"wihEq_Y& .&biK:FFicɄĻ{-+/*+_(*/(/rI2a}54DIWR,)KߺXw,^r6n!QGaP%$۝T7Qʉ<Oys#"wޥOQ:TF5\ǏS'j4a9LuJ%2aLѥ_?VϤO+Koڎ:i@Ԣ 1 ɧiwP#^ ~LYa->D$K%L ~eWߑT$_1F#ʤSjڨ#5iBv:QS&=r6.D";MԷtR wcF4'TI4j[NhI ~#$%pw>>DeN4~;?VwoK_=H"()I[VPRXRXTXRPTTTP7п]xb(mgWC.V=!85"*co=Axꮜw7dH%M*,iˈWI:Fiݪc z6+^!CX,X*\VXVTRTV\kmEo&4fDPZucwX,<#>y+aS&ؚO7|$᭕ .ON[쩿ou+:% # _ a|EұWߙ+ 7Κ9GF48 GD**]rUu庮ܲ+׺*oZsl_-N( 2єc_ݨ:CyrYߺXK|N߹jjW/͏|ֈ٩dJ$Rҿr0|IW_ɪ:vq%:mO[N GS F~ӧߛ?^ yѤK>[Ç5|y |~ˬ$X5YC IDAT2+KҚY! U2JҫD+.0P66fO}緢[ew]c$0"Ox(*jK3u{g)m̈l43Cs`(_범0#)BK 0pU$j>+fхg÷5i`xrm.~J{;`0I=1#錰H̦OJY/*5_" TІ:Bx,ijOַuѸa t)n `Xz) Ňv?| T5,17aHC|bDSs* l4,Tp{0)˗AۈWvoO"`iKPy%[ jh$ilZIl<d|dΓtƉw{(g 4*xtICZ%ŔߟK4ޢAAf#A>?RtWXSᏋ|$斊0pT|~{cr:]u?~K:*&IO!)0KP̑dEK̭$X Jcr |/{2_k][ /x'@+0B0~A$`_K.K˕$F$EB i ?}BcNK}`ޏt6b@nsckIuݢ+dK%B êUv!{뀽w 9 EXƄ7P|whwbUq@ ra±avX,4W/| \וYʤS>^^IC f]1Ţ0 q>CTҧzA/>?Hz`DyVߖE>QgztaSѐ%@qe|/kg_RP{JFˉ=:ʪ&Swsc+ tFi7_$k I5v)>TL_Ň c]{7:ziH #.hMJ$wdI!_9] IoQt1wqGq3$l#+7%'*;z_# C!L+I;H/h5_޺jgLkk]Y&ULo/Ň3I>=ǿ!1(=mmuKO qq'{*W$)3E5qάZS'd2?&2cU$~Txq?9]R$P_b pIcgjd U+͖d*i6Bu:>[zP߸zcc"@6OGo)^G <2FA:}>+M\hJkW~.3*j5S:=8v㏻lds~t_ߙo[l@DHQ"xX4j|D1ѿ|&4VN/naٲ Mx+m՚&cosC\YMhȡ:E;Nj.SƩiȻW$9Q*W:PE 6im#5;ZFRxk׫Oug :P7:zxX8ۡR[lqrbU.KeKYufFL&N&8N-T~'I" *8~I)>SPN?Ɵ$#?޻ͳf8Ƚ]!P\^~mK/P2)oWI vϤ4ebvԬvIFq9_*)SRWOɸ2ɤⱨa}8D!0NY 6Y$ P|7hE9~&kW-ϿC@x{WRٵ۵Va2EZFiI͚<ʗVR6WP6WPqIφ,$!0ڕ~7Ӎ VV P|8/H $kG_a2;7P5҉GD%1}C?~p%rH$qcFhIc5uRv2^=Sv]ufݗS<Q*P:`6Ds!^W(){%"iQ0 C%C?FXs#2rSWQo+Wk|8@~wC4Q2JZFjB(;2T3KK*+J*e6DMvOV*>JwqH `t3v/'IR_ŇS$Gx.z3D .z(>T"i'+pd j=L-cy0Mh1%\'SO6x,T" !j{ [_Vg(O ~!tzA(>Iz YgN?J2g >Tc%|[JI} Ixd?>N?I!/[& q[Cږ=.cNT$ lѥg"A\<U"2UvzC;&A)9H+:b _XG%k.Yje$N \N!It%%ujutPd꠰\ho{}d-sv7>&p_xXsEK~$$M^~m{5T2ÊZWֵwjmM kF2dWIyI/4oK.@mrK*wJZK }T|*iW/ DZޥoe:")?`Y&i|ڋM'"$Rt314Ir0~*>J IW/Zr>I@\r"AX,Q"~LjQlPVӉ1xVο|d$ #~*>|~ +$=L ҭ f")B)+\^:f}:{T(2!h2b1I@h-|7~)>nX^E\ II,^.xЕ˗3%uFm[zy)d"ha`U6_ІBDGW/UoW:g˿Isak4Z.Q5EhtK.Ӓ%G_F# ,~uvuD@cTNDȸ֪7{FeW-)kV 5(i@yB߈<wMծ]&ksm|A7ݶ ,J*8R6~sC[bBć0+̝Is`,I@ͺ|;Hڑ~ x&I= z/DձCMTXv!(mn}cŶ[9o׭ W@m!g^Ň$F dwMDKbݝ)/D@eIEC5dS!b]{֬oWgͽ5\ko_DV.mc$T^Xr]eu!IԶnͻcATND*z(Dlw7ՊyH|41{Y|H:+\ 5^#H=) "B[eC6Z+o7o(玔:'=_4 $Qۮ/DIf?[ST~rߵo٨dӽl. ،%-!ϥ${yĒKp#ehQOٺgJbݫn .Pa\Wv]ueBDT50^{^ imWY4acnDپ^]K{JG Jne2$j_9 c2i&&m*DXhQ6WBJUT7s +?/0_X)PTÖ^*iIԶoKַDեS~VsU_.n^צ ]ɺ!/DXE++ WS7\6~2ý*Ib$I;{񋽺`%*7g˪4jWPU7ܪrLc$ճ Zީ>9տƺ{xc_vÜ]9OI:?'xPQ ct>IԶjޝDe֪P,7mZ]] ߜk+ c{\pU{T2U#=)> 4N jz?YHݿq= ")zs9mo/nXN1y+]u~XZ1)+ϽF>$}!C$ 5ŇJޞc@Ux߅\d2kZv=aL*W,!TsAlкNuP,22y~q9ZqOxo,s6Կ"1<t`R/־'@U]zGgȪ@+/ʫoQo_0t PUgj]{֬oS{wlgEBU/l| rܛ\g%3[<4!axUIhkO4N ᒫߙ=oKzbGž^ N"mkTT" :cbш@](\PGn紘9:&|ʚo| @9VJCzQAQs.t11̙3}Px=uAgDm&x1". 'mr/O>o39)VTYM* I_$MRA1H6ܑ#`;>&iP|?vf;AȆ. EĢfD$b1`Ϊr5ۑu#-_:+:q!V0sd'҃p8F]I`BI)FKb<`P>lWeO:1Fq:0P*i]['A޻DS< o]c^ƾj S[=v%] jN\ldd$bǸhNdw1. bޔ4(({;xb{ƒ<rJrP㊥[ɗR IDATz N#8|ެwtjvut7ST& øFJuppm>I++2[$l^w/\JFI% ZWBAݽZ֡5۵K}9F S֠fڕ78[rIvct茽t'%iȤ xeUPTWOֵwꍵmZޥ> Y'nbܠkˤhW- Z[yw1$HѤ?vv80q uf be//%ee3"Q<S<1N&O*)!)_{A:%hWO箻w$RhT1C߼l VI+0fUPظgDVoڶut*ϫXb&vH>hf>Izn5Twٺ'e44+vQMWc}TI}Q;**7qFǔEEjIOHڋ(鰃2dB}ټ <Xg ۦbD<Q<U$!(6vQ|QZK0D޴/U P8 d0|#Z'H)͒S8YFMsƷў=w! Rh \0-p|UXzgf,U<U,U"q9K%m4(<UӷVTK.yvo8 ֝=s/Ic4z0MجL+LL jȤd-[Z E w|:ǢǣGE#rDIwI:(Jz%Q)%&@@ %swa`;7#{1QGH8qF7*A8xx6"Ys.SրϸUXR_.^m֛ڵz]ַuG}Yes%.ޫ}5g>4 I Hqsi!oϕ44o fsk]KT*m-qgLDÌ @5<. Ic3H!i]5^WzC@Gڌe$KC&iD6_Pw_V=ZѹqDַu[]=})_(X*ZfMt'1xH:Z/^͙~@F?MHJ@08Qc]ͧrUTJFqD4Q$Q4b䘈"Gǰ<`snYb!U)>W^Bbэ,4Jڝvx XhgR t*|2y hm[ʼn1o&"(VnL?7@`uIZ"P^2z+*>()By"ٍ,}se!?n7҈CԨCEeeݫVѓ>gryGDgRmfVbU1QQ1 qq."HHF[P+^I:`c;TޠJ̒KޣqQd~tV/`XIF#YIƙF ۅ c$א6sVpthVrHOb!&qb-[s7bѨm{vv_QNha#﫯~4FGh qa<[io<]Qո`% Tկwqt!HG>{B#1R!|3WqhuI/ L-ɸ%S5@1o]5룇~MS>x$|BeT2T.l@ؒg%L9Dҏ+~/"i䩻67>HVҟ{5Wıi=wѿ~\Mk! 9VFS%k5FxƆ:pR:æ,qPRGw/a`Kt1xI.ꟅR.>䒷Bj%%k&1q:|{cF ә8N@ˤ aE *5V2vA%^+зv>z.<a2>2bؒU#OUt|3[,5k.޿PCf쭆4,._f#i'bA|JKKx u=9-0uv:QLI;︃"O]^K'/+ulQެċU0TI+, {$ѨMj;B-Gh2e^ڐћr% BIeItIY,E ;,D3Iq mӆn;uHZ.ƚ~#@-ԉo|D\d\/]/_r*:.$C8AXZ[UA?"vLIRb@8QSxԿ(ijE+t@&zLR1 h2)k[$=M x-" 3GMVEpt0c$ i10 15|HKڍ01 bшT$H{.J*LHz<Sb@*Q|`%oQ@h (ր^ c׉j?ބcQg1-ϋ#$MOxj1 6+a xHo /0K.yG-1jR'Oo hŇȟ7P-HTM MzþN d2L*IiIЬn8yH%Ԃ!6=Aፑl_Ha/#DZP5f xj(Ǩ j c{/ŀjM<Ӑz6!<MR1eRI6^  Kv w05.P(n{fM7݌1PX4BxwIm_,ě .1jjlP([Jڮz@f>9I E#6@=))O ٮz3g"13^IOgmCT۹*)F{dRI5dR^zgmlm{;KJg،LZ*!ŸwҒn_ڞK.&|iH]Zx ‡qQoms]`{l6u^!`1jjW<% pyQb6,Ta E#V2b̠|V q <JEpr]4hXcCwvօ?-7J B"PAQ[ [VS[q|ut~cWmӎU۩3LiRRtua%,!,=3 ${szl6d z(Ee4,?7o.c.Nr'G7@ŘP}Xʇc7P>T3~ZƞHF@'PĄˇIʱ."K2@prWp`]1򡺔fʇ僛`J&r&T>_[''v1aC ݖNH;P!I_ 2V&T>gF0906SIՁK.sDP~V>Tӝ""(f|V;ppʇr#(gCb-I6Ch.1hqśX1W>,O2 77 @ xSw3, +Y1qrFW>xFjI3j`惛!Tqr59cb5*kC-b(²K5`i|{DPĸ305*opS f|q-d惛Kf|1=I`@ŭK2,"|'F{RNE<iPmCICcp_P]=٥|"(bL3n 9C]o.cL3l8c ˰R)š|et٥$TF*9Ҳ@g-P@PW| Kܗqa| 5Z@=xw]r30.ٻ .jp&ٻ 3*Hg0Z4qPq(jxk|/O1bix@E,Ix#IZb$`fe1ػ|'70V˲Kaܵg&9t$O4F6%)aLо@M4Z1>ZI64=@M$f>ԋ7|pcei1Z>\y&]GEP>y1^A]'E0b%$"|hZ]eS>̓G75|(c^bCiV|eXvU.ԋ2|pcf%1Z=\X5bi1Ze\XP7_P>JQ>˦a.Ca jaiJU ]L0>@ Yzf&k&%"Hˆ5|(cf3=pf>Ԓq2f6 EX#Q>ԏ4E ț0󡠧Da%Z,"PV@(gRAEh5-P?a˰쒋Ve@-̇LzQ>ԏq2|(HuҊe8lf>qiPGa0EE# @-cPP>P'e8l]*H5h|eXv Hf>ԏq2|(H5҈5dʇr4nP+6!eXv H#@-òKiFZc$rp|3h&C.$b躞'Eԍ jxlPƐfZ-@=}=n7$? PYd<.v$MIJrh*hXv v_o3;T$v)P\k'2}=;T |H @%b%zo) Q>ؽ; v_O3q@yղ@M>{>$=Ҳ@=>.6NM ^@x|p@W(ait) Q>!n{_t_k'2}ʇB4m0\y͂J|>NG:2w_喻M]Ht]O3I\P7Om۞sa]-2}]r@}=䖼}?& `5v+wtȆ6孿y&exl64u#"YѼ'* `2y@=)LҒCt. IDATe&8f\7֟' DPOcoHb)c&ahL^tp3v.Ah h0y P?co;LIy3\0mݱ3_&D~c%S>z"计'>^ٴZ-dH9\)\0\zUEv- `Z=ԏp7L2$;L'g6a=b%1}f>`z;s/ܸ>acsy.v|?|Zac;h%:>A) *b?аE5[]ݧ|pI7_:o_Vsy.v`ko+0:Iuz`_h>/exdD >]!CYv"G>uE; mf+@>C!}{vMw_`faI )e f>0LSE [?K>]V ]cϲK2SEl&."PV+^~U^k[y@ 05|elk&&"4nP3}^+5_!+Wt4{>Ԍq2P jhhx$yͯ|(7}@`i4[]el7}  E#M38lf>q'.j~?}4w@`hP3ʇ2|puÝr/0ٺc@` @xxf>|)dhx8^~U^?̰^Ö]P ~,?wy`c%z1[e Ҹv7e_Ȉ@`hfz1[e ҸTcW/ùSp˞5c 3 Ҹ4q]XO jjYv ^ÖMP +9/佗|6Om!F|epEt\zU9y753T>Ԍq2|(h`z|ù;ua%Rf>4WkͿ'yin\{@,P;DPop{^;ܶA@E52|el3V+9w}cBiIJK|(c.zbFZ|?/\{rP"bm$[gz^oߗ^I_YbMI|(S~C{h8}㺼s~,e@}Pp>zO-d|elJ޽?|&lʕߜ+9^ey^7hC﷌(CP>3׮K˿;w :Ԉ2,6<]rY7헲BNhP#_P>[O_s{^opP`P+_g.)lpxūV,ϼe~84c%0ZƓp;o.,g:w F+f>ԇ2L|(CԶ/_O}嚼^y~.<[@-ce.~`iޚo|,Y07{yEeQ Xv >|(c|(c*\zUrWDbCiKETՍkƵsѹM?zN^ְ4@-òKp{jێ\r7q+u/>#o|99jIL?P_~63Vtݎ$b$ɬ$[P^7fѼaZhZ$Py$;f$;X̷%,P>U_o.8}M.>38/V#GUAT$y}ˇGbKV | ͞לwz.><>SL#|PykP ]PÓg|H;P+oimWɧrM͞ >%F^vT>hp&u{&9^6]g`Jzr˶g6;k08\|yk+ jhaa|[SD\ty^ N_cj|e<3]><"7dۼu{>ٯ_s\x)yyg٢eKe<3(S>]nϷo=bY.~SsGhJiP]u%僛;oG>uE>+r\x)SrIfO@HKP]˰쒛{\zU2/g*/9kr .Ra%7@}ky Y`n.8}M^q)5;kPHtEÆuMeZ><,7@l|bs.uץ֬KXO;>/8xs:(kf>T$}Iv`Gr-ks-k$3gKN?!/ai]<t0 Ƶsh4rܑKWVɪ×a&:X!"X>t @EZܱ~CX!k$rG+rڱ+s9~ Q#-3xkʇ Tؖ;s?`nN[."N=veZs嚦Vf>T2n&͹s7'IFV.]S=2'}dN^uDN:x@Pe( t@ʺ f݆GWϙ95G-ϩW䄕s܊eyZ=Yv ٻ CË(mޒM}'\+愕˳b4mWYe@$Y&"X><,",M(]r]s]}Rۓc/+Xc\FӞ<;6sOƒ)(Cùcܱ~Cr1˗×1>|I.'nj@fɥrNt^ <]sۺsۺWh֌}gʉ}Բ9l4 vTjS>+0Wʪl: mݱ3}n}'/QK尅tlQV.[.-ӸYv ⌳@hk_M@}}}9bɂ8lQ.#,Ȓs|,[8?s4{Yhk̇2?MԷkPypcyp~% r3ļ,Y07 yd,;;`f|6o.yf> G7G7{gdY)`rlپ3[o̽m̜.#fK{ygf֌̜џffF_3w`fgp?2{ @g-cL3e'ɰ(.ؕm;vif̛=3I2w4ˌ4$=sFz e^DQ}ktھs$ϯ0IrfKT EI$&Vq|x8|elKh__0^Ijjw%iA~7 @W-c=z%-1dP>1"Q>q""(}APM'`LNA1k$]1Zp;< ?7 @Pƺ$A~KeùzbR(ifb8c CM*p`QQ>Ԕ}8j97 dCM.p`Q˹@_T`_/A1c n"1nZNGˇ[Y2nZNG]R>&L1$If%9N >okX2-'bHmY&yb,8d߇rL!h3^ZΘ{^*)mKsO`惛 N3)3k4"bS$Lsǧ=^JR>ܟIc`3NZI7w)[u8i9[>Xz0'-g\MPf>3-$LS%Y.bn7||:[4uW?0c7k\b|<2hƒ g7@+bƽ*RBGoiҗ4I f>ˢ$L3'Y bR>PƸhY]Yv$d&lMv?t(p&MsCPK圙_ 4141sH}6.gFSL]@P!f>ԓ’Keu}È̋Q>ӅryC|w>^n6mƍ7,^XPܑdۡ`sjrNL2_ P-f@g-Lr9`"Mi$9K wN㡔q=2K.Ud0)*2$˾OTY3ɋPCI6LM_$'NK2_ |"?<:bS"(ډ^"`2YV$-0U/bZIe"hX{bLr)$PڴY2j{uD|pTqϲ&<|pTqϲ*1{Iv;ŬIr)bYcP̮$7L ('(<1S"(IvN 2^*$`0Yֵ8P%;xaj8#157/)b(RlvNMr;?IٔNSH:/Eل;K.u]V'/uRԏAQdpRԹIICQ߹wzc%~4{(c :Y><禨 EԔ%ʺ7Ý:Xÿ5ΏxsuYWw`.urbj$Nj+FE"(ÍI69GEYz e=NHvܤcdE~4'闤6P-ʇ..Aq(Où*Jԅ̲&~:δ ެ=b*7b(;IvwIe-T$gsCQ2|TqjU>\d9sڝ8d$T$?"ל_Ke $Q1uQ>15iʇ"*5"(N!ymi$yj%z>ItZ1sfPԭI7'7nߍ&'y4єvn@Ig^N{${ 94 s|`z;?CQCI%<ۅȦ$MrsZk|vpԞ&Rt%N&xHS>$og,==dS>וzM紨,$`U0? ' G%Y@A˓@ ]ٍVpMIbI^/D@&Ygg/=ae@P9Mw!fJrmwÎ7ys[|F'99 { +n^'⾕dw7EPګJUTM%yIҞD,Suz?(9I.N$/1SҫcY*[{IM- Q>PI~.ɛҞ H`.F\<.\诧]>(g>P֕IZzfq^*o~n:;|:n~,qI|ˇ+J0 8,_$r`2Y _u|3ɽqqO-I9u?VB_w;<ɹb`2II,qLw%Y&⺾%Bs%^tڱiQfɥjn?`as]E@'XqY]ޮXDdKR$'N(gd*S~B/%9/ In$#I47L{ܳrec%4K.U×J^tLA%|,1ʇ*xSC31^xz{<|+J=pɹI7^z^QPe&~)xǒܞ}˅Iz"Xv1Sߪ$kSvdkIvx3'*ɫ\e&$_ǂ IDATsBcmL=&OGP_O!iϘ.K%E' L|3&99ɻ\@oˇ/:pV1xk:ŁdHu&ib+J>x$*A ~'I:SI~3k. nN/Ь@^$GOqoIrA?O2"fEP ݕ$V'] `%Iw_H$ 0P \SB;\/txsݢJI~J *0i9 &9JP!}uR 3~gC\N!@75BU,>:Cǹ~?$:;&trU,IR /JF Of>6:oNr0NJr*aCKU|Ir2.g~!QIΝ&y0zH{\R K1L/x-9YO`2.M ^$UteMJ8"04:p]#;FrQ1q|XUˇIpT)TL'ʇT<{ϤiV84K/UO&#cǘ3:kF07ɏ2*;^$];0+ɛ0}<ځc%Yp?{m&^|i oI2S -WU|ؒTT:QsO& <$i IVkV<lJ{`zX߾pO >ɿ7=?tZ3ޜ\%WZi/;QebFҁ,KrqYs!$?b4$05YJxg`)98$./$Yܴ7#K{ctLw2&Rɺ,wI욪]IVs{fP)oO8Ζ$''yjdm۶ࠋoXYʜ}I=>֬Iv=UF0}CǙ Pg?Cbb \WpW㒴D@t'~%YI6N|`L/|fו$EQ Z[e$w]Uv8|Pu(ԠxHS>$5J2``r=+Juٛ$*teIde5+:Ecz!n%Fղ1IZ.|UI!w᚝u?{fR&RCEEE)iA AAB"K@t"(Ћt2ǚədgf{׵$@ٟZ<z z~QZ)kc&2xi jBKJq| ^W8^pJTMQSqO,oT'ɷV`+a{JQq4x7+`êW7[=z]upW 0W-)W^km4< Jq4 үW{Tuѝ/^ls}cm&/8 9hz|Q}hJM;v<)q-V" WW?X:`}p/94=.><~e`ѸG&}yfuUY#ՎuҞV1 𳖪?aT^o4EW>57*[Mm`p-|'/"65 Pb5c%u!n%I2{ hqx}jy_0ת^?ΨN1|`Y뫛06 Gݨܴ{u`.RXQyTS>'Z ow0760g40IS>|;{ݪ#d]/I0GyS?Sox{ʹ?`1|C=)Q2ʤO}^r}9S-LR2w L}pz Qlu]'T?`~ )fE[W"g0|`^rb2,OVoD0n$ZOm|1^8=eXdX\߫m3:?nϫP}s?uj{Nv6 v= HSHm) `,.԰QƝ4TY߯z]>.а)Fc^~n.FQyT`Ύ0y,B2ֆE_'5=Zut:BX7W"輾 jv~|u2냦wٰ_HOAսeU<ѬeÂ|1z{TVd\É՗G\Y~2Η]ჃՑ29 tB3?hz EENy?V}s0:[[iz@J8aڢ|,Q::N8`^#(H҂}q.u>:߬.VT uxu mٲeiB ӥ%X-U_'|t aV>쨞u>JXoe0V jV>TpùG+%ӥXHV>g˺qHꗤW~HB?}~ Xc 6x\Pul-ep&V)Y.ĭ|`T}ᬇ,'7?[u?Jn/,۝3x7Z'u?Z6hcW2އ^ÉէGխestmV'/'Ç3Ga9fC FiE~q.~(]}lݦ `ч?h=:g?l.h=ݶ6ÁeKU(;WavTZá'0ZtPPFMg=Eg: ~s$a%J0kWLٖ-[6o,{]r)9a7 I1JikǢaz ui.,{e0fOࡲaw窾Z)(}x)f`|`YV>P#(a06+v92_cv|gY]arx􃆃t/,YL,BϹ]GQ:a疯H1ᬾZBQ ,a^Yx]6uJR̎Y.ĭ|`BW;V;+?2e`<$1;1q=Au ujul6ẎY.ĭ|`\\Mx]ʇ={[Fxxc =EQ{u1c0jO` ˫/0ZW{lu e3Çz v7d`~}F \ b] i`8Ͳ.8 MF{կT?bϬ|ػTϖaԮU\f2x/9;COW'<+XօAVbN.Z}Sg9VbFRd`=/sqT kձՏ,+ɳe][;ln,;N셛2 {pc [ջe4~d0yV> q+س_>S&ŨF~Ι}2#d`ؽ+e3|7`V]N&՝dGI|ed`Bp_`u gwz20ש~Oѳa>Wa m$}z fSp20bw*=0`IXuy)FեI0 WLٖ-[6o,{_r)@UGV~QQTujʇz w20Ba ~0vz J0zV>g˺D!RgTۤwV>mdxZS -AgH1z7"YL,BEw2Γ*Sa'0 >V_a.SS}gܾRPcpN˙Sd`k&2Çq| Fգe`<:JF<8z p2ZYIxBSܒ+g WVC ,=E`ʶlٲyf!KqE_~ꢮMW+'Y0QV2x'dbpx C#`|`YV>,#OWbY]"ʰaeR=^IP XEa*Ê;lmJ g֟Y.ĭ|X>^"}y4)V+Ԇ)wHtXa*Ê3|Xϩ $ܠ ;Vוa>W=_g:Ψ%d]unXG\)yxUgz^X p X~QId2VV qd\&avVzEQ&gF)su*>\VQ qd`?ܧ oY%KUהa~T]k)۲e͛`K.f=JIxo[2.+ֆqI2>)yam\SF2 WJx[ծ ÇLW^l!äإf>Uoa2.Q=H!eWam8jm]qZuR Niu!i8DuGXV>Ta2!"jzNS ֔{pu q2?~[8=g9Çx&IՅd`dgTam>GV?a2U=KgVa2~aѺ0|Xߩ/äܤ 폪0) kAկH1ߩ.W}[ Uqxu mٲeiB %uL|RLƗKWJ|X?Var?`"BzzS ֍-׆߫J1)z +`|`YV>LM70)Vmb}XWar! ,sUϒarú2|XNaR.X=VB2LʛeX_z0hJvT7.0y]bY]ixx7V]O)֗2Lz:FsXi Fa<ZmaR.Z=\Yzdu &0e!\ 2%CrT)&; &q0y|`Y|CUbRU[Xqa\~X=JɹB2<g˺`~jϐb<|30?Kp 9zAS Fa^]$\Pd70>ze6ltnR(>0y]bY]ToҩZ]a{FʇTu ӻSW I8w 3x-Çq;2Lw~`Y]Hv(aܾ0`zPZQeu;&!d/KocJRLw+Tߔ`YL3Xօ3OTGK19Q].xY0~۪{5d̴S=[Q:!)Q73|TanVEQ9 25lIb%)ʶKve]v `]Xu{U]gt|z t ?e0UaRؘ'5Y׭'z@um&ՓeÇiR=PzluժG0YY*t>L+a`m^:XIzGaUma.Q=E5R2LҶlg>I92Lݫ&n]Y2LϒuLQ=CT:+ 3xa o0Y\/xVua&yX IDAT+#e>Çyqu&V]e8 Ua-ygF&2LOUXP|&ϙ,Bܙ#RL։Սe+>OeëWKO^Ôm)|>0iW >yJue&a>Vbn]J`v <. q.T/a>Y]:Ca~N!ŤSui&mGu faUDI;aäأCKI{~Na v23s}z d0_ߪ*Iug⏫0y-<9j6T﩮)Ťẃ9pe];p@]`ko]ya޶7>UI;zuusNǫ0yl`= 2̛c%?).g%u!n%u2Lg fÂ\5\C{ZuUsI2L aqKu wHþGI,sW/o/´=z a< w6 ŤUaq>,UanV_`XRY8 az dfcdVoaضe1S}:f)۲e͛X';v88/y WjŴ}l?R,+_0 ^]&jǎ{`r670x{e ׋0 WNEam۶,۷o7VWaX\dY@Y}`a֭mݺl0 ?Leؾ^of9}3gqF~Y>83۷o `WeX\NbzoL)s40y^?a 6lhƍmڴM6q6n؆ gN_V.0+QI)f,ƅn]N;|.3x- ]pT}z q20G>nz-v<>lݺ,!< s2`.OnX<ܡ ՞^:3ӆ2ƿUO2|Vqu:20';v8N>?5xQ^XfԆۤ 8OTa66U.*02^py2?I{eW5t 6aÆ6nx_w]{êT l;؝?k[uRU<6lڴ:,6m:0`«"laR;7#ٓ/VaVz L6lpCC9w !vw !գ0+>'?MxSu#)fcGuER#uxu mٲeif;^۝M:\z֭mݺ3WElڴit+ ?vۆs|#6w瑀`!b6N[_ ` 3|X;;vh۶mguǎý37nX7Oa$zCO2_V90tUav]ILWbVΨnXC `v <. q`]T,Ŭ|Rc)X+?XmbVj8TX)t5<< W?f [kG `?0_OU4L7llLmXօmy:zk;R'WJRe0 ,RuBstZ63ׇ0KV`SIYzp(<́Pt2kȶKve]v eV7vH~瑀tc;ʼlz1|&e]>q&)fՕoJ[]3K_ר^pb癫ê7TJtK1KWQC6,b~>_FÒ;b%`lIJ.mL1{KJ1K~:U ӪW[7L=ks 'm2x`>>U=@ٺF ŲzquM)f~J1|`=z uӜ-eWWϑdj2=C{0[_DVmRv~y]hfk{u{R X-爵 l-U'Tוfw`]SVoM CזoD'N-[6o,{_r)L¯Vob )X V>VTH:z}uY)`6.W99aÖZV{0kGWo."LEv^3_(92څ HuR3j$kUOT׮/L3Xօ3q:H1kk8Rڬ|`Zݶa?9 {B.La2xTkN)f׫THwPZRڎn š0|`z w%F)`6T/n$=z 7Xk'~M0VK?Tb>X=D֚ጝ?ؾ#Y(`tSC^9KZ3|`|s].8ܧz C%)X7WOa!< z 1[d`,I:XSA{rxu mٲeiB %Uj/a7 -3xXߪn|Co acRab[GyЗ0|`,Y=RpP&R5!R,U'h1PaְD)L3Xօ3s աR,7W7KXlo8R,CWU-kWaQ|ᾚaOu♿V>@ʹfÊäX6Oc8a;pڰR,{U.ccXz \IեvmyXOQ)WAْg^)`!9p<N qN;X﫮S.cdcvFu@H]lޚ"Fu 1[;:zqBÓѱ;/ 8_ץ` Ta KIgR; JPY SqBu 嗪 K7x%)3>0%-B9JR._T>0% vU)4V9` 1|`jyV. j1R,]:`I1|`>PWsmH͆3+=205LճeX8GTo+ ZՉչX8ϬN)2|`HvH)T>0e^\5 n.3vÆGHpY:2aSX8Tn&3tf)On8՝R,C~_ ` PVWe^}P nIfdXH۪T/&r18y}Ioe`|`Nް gcLݪg^p-̂ss6L,sHݧ:a- 'ۊ3ͩ-H'V yPl^ݢ"sb}y _7m=P=+-SW_9~9hMۤXXڰOAR0BW/!^Q1)#CeXhN9zmÃ,^'se=&`]TH20g,?)B_ J::=ߔbah5խI.W4t TI>([ݬ ;]A ev^+BQE`"J~a kJzBR, +>)EsRu?yVוUt3bݻ:YSdXxGV'VwUpR,WϒEcz@" GH oP)˫"2|`QV]T=:$`cÎ O}73'\mE ~>!ݫWUI~8zMuO)>Uݲ:M ՍJAu/H>8:T_o})Xd0 n0__+p}oJA&՗`> KN ߐ՝׏VG;6F T ' ^T^[n?72 U]=_ =z 촱zŒ mzl}Mrcd2|=u2Uϫ`!\zMսdg{R;Uo#B9oֆ{˿UJ?)ՍJnťX[ D 3ػi@|[ Rڵ4ՍoIg[V[`7R] YG)OV}-Ӥ`7U'TO60 Uy^ݺp `N0j}7VGI0iGT$?c[uD)`y `߼aR3nXt]ͤgz|W=T տ7Ht\Pu)؃7l ?({pLm>c'߃2fp@T=ziYb9}P09FEw^zMu ̶NRp6np`ٯH0 W^ [5Ӫ[Tq#XW]}0Ks> R1|iQ)8GWoi؊ w\瓂)R3|&lll8%9`Z=::H߫' XY_nP}C V`UrR*0|w3)g\{΁X-׮>T]] Vn=ٻKP=;w?n3y_u ػMSuh Rݼ: `ueu5 vp')8?mر_c@pήp 'w`Nn]C X]6Njx )8GWoZ`,խ7I[l\:{tsl[Ö\oֆWWs?_,Z})v8'/֎WUwK2\RTMTe^ݵz `}{,!SUG,#Vϯ62YP X{~w>T]A `\zY;{UKs>To +g.'A?Ӫ}phuB]m}22|qod`ݱJ%VI>zXX`>xroFae`Y`9:zF(9GϮ0*0>ՇKL̥WK1|?47,ODܩPu)=%WzjyFꨆ-d_.ad%;`?~oK̯^s43?K~㪃٦mrS]TÎ*Ló2`lT:w^Qݫz0~0XQU ӯ5,kU귤`?mZ0 0-/P!\ՋTGӪWV瑃KD>4)8w>T]U `\Xu)8gT^$LLVKT/<VІꯪV8WKaL[T?pp]%ЅހuZu0 2|i{Ku)8@Y}:N `?ݩDu)8@[ffՍK:Wu|ubuA9e:چÀf +h 3|yxwuRnp(ܭmO6l {wHgZפ`SzEu8a]3BY]00/l@|N Vȭlkww^'83ņRB.Pᩦ#zZBrB>)a `YNVLjxum9`\>og i%7,}69`Q:VV;Uߕ'-q'T.5T6 zeuR|>Vݶ:A V6q0U./+wQulDeJ9"1 '4SC81*M4S1O*W+5;%6yH=씉C xTT@ 'D@pLXZ {U7fÍ󪗋exY8q;:9XzU>̏u /\ҁY՝Sgn#غ'3 ?)V'' '"4SD ̧7T5AR۷.gc;epCc=00xjQL> ^g\SL4`)`k[`,>Ijq[Tfy}:QR>Z}N,cż۪q2Bux!Q|Puiâ`V::HbSq*y7qί9coa9TiU;͎ՋW=QKP`CTO^# ٶɍ %E`1jQ-X=zAN,{Vl,̾9qKU/]psZRCQ.nZ4J:^ ^, ޘnOW+`7ՇP굢nQΩ, V^۵GOrEc#`c\x`ߟo,~FH`5F,ѥ>@|6WT& V>Vt=`zdEQClTO" VOV^ f+ |WR>W/+lwfcƈOU]m'V+W׋`s^\zV_=X̰ThX8XakW'U7T`K::.YWQY̖SU lIDATg׈\`KU>v|h&V62:Z$KV%R\iUG:zE8X%U.RVuT7`Tq"~` ܻq^_=RRP>KY uDƜڹzquau8XE몗T^X`9Z=Fmsr?]={bM%ՋbX7<E*۷1`=pjqʾRdu(|'Y+辍gW߫T\r$߉ q`_U:0YRT5QITW/l,Ix;zYHXB;W'WW'T[ ::qMapSx_ [`Fpi!]E„zFΨbÏWOVlY[LVVJR>CVOLZy8UV q0a>p}(|VW Naչՙսm8:pգ:m`U(t} `XJW3V"aOp 60 NQ}QLťo`.ݹ'Չ"a}zLעVi̡|(P5JKn: \ص:t; u}DL0INl煛%n"/c V=6 |&3lZ+ O TXSW]( SL,$:z(w_iDsk&֚ꩍ"aJk&`P=:>{ Ouaca'7U)q}׫7\i񷍧;, 7TUj`mW=1&"0-؋:QBLU% ̽׷~1"X5N~x%9a&`}zbFq0eh,:I$bI{)scLDL\+ ԕ_V^]5Y\}o `=`Ut7WgVN>nS.ՋO佸C$exK'ML}j`|zB8M`J(!XH6:ao0U0]f 7 0ͮNN4']fKr^zncLo6,[p5T}PL]hc: T.{,\+|fїOi[imu\u~؜\ՙǪ`-Y:LQ>jmwxd6"fܚ^[1 ߫~$q&01{|Q0CP\urHKC78L$̐ Wo0˔<1镢`e 0Zx"aƼqRQQE`l11e捧!y3{W^}zB]fKplϭ$fܗW0Zjk0㮫^P=8yG \ ̋Id0 ]bļd㡶O`p`CX N̉d<lV}./?Vܶ#7T9tIoп`8<ٻ){9ꗫw֔wsiӪsZA`(u[Ukj;0ήQ]! ۿhGYybuJ8c}B)^Tqu8n`Zmc)5̳: |fY O9l+ܧW]Hq>R=q.̳㪳6J-{/zO)o`9y=s/Q@4!|fL5c]V=z(6`֘y(`_M>0 LWO]=P7VZ]- M|rO^W' ,ܴ{,P>0 vkn8g7 `X{T~Qp~P(!UGjMF z~-Ql:zu(v}m&/TϬ8v}: K@:F#-ezSum`){T?W=z8Gzw+X:W i8'rV˶]dl<HG:q,-G7գEsAJZp\c]E5ʺω`.TX>_~zAnRT/\ۘSxգR<,+'V v" YN>\8r~էD|X9VoFN.>ZV5N;<"q`uXV=N0S|`Kݽzrc#[gDgS3AgpxJP$~zmN+ ۷_ 7tS>mqKկT_qq09kwL-gMci ,oWq *S>L=U'ۺzx! ,TZ]) ɠ|LGW& *vhV{* ɢ|\W/kʇӍF,u^X}OLJYQ_g.0L|zg}lci_Ê1_E0\L߯^p L&sx̣;VOT׉`)W7G0[il8zLH`|â?wLt۹zlpxbc8MwyC0]Z=qaնbzC[Օ>>~1X]ʇw`h8:C$0q>[ju(`6l[]F0y(~H`b]WzqL7lGhQP>]O7<ؽ/LW^]&  `6=zEc|XyWlnxluhX`j|:z(f`vXv|X~{W5 $߭Q>̾^]=BKoFpDl{YzUϯ.r0Ti,n8`(#_fƷW0۔e AilMzj7Y[zQmq|:(QR>ܾm4B/k8qB]^P}BE0ߎN! Xʇw5(v ̍/WS. |`^;ȼw~1BiqҞ~;\zY'0,ڿ`C_O2Zݯ:Џ^Zu(tXamX4<ŏ sE"eM7(gZˇ=CڰhO)pUzUu89wdo<ܱI/Kի߫EƸOgѢ;4)~ݺ`jW?"` S(#6œSDi%ˇݪ{V(^xmG,OWU) 6MmXay=YI `cP`s\Z;6|ئ{].=XEVQa=ql]m--ˇœ 5:7 IqS߬.KRQ`ڥ:'0]Ye,KqWLO5IS,5"`S=zf%qĺzz%i귫ọEQ@,AXNkV;4F1yqCg'׊+^+wϋV~ĕ"X>gW'W+>U/,z(X &T?) "~VIrDPQ&q-`(cn CW/Z'&IzJ?{6pYGQ>0鶭Z8s_zMu8Tv/5J}Q:Z@L:f׫QY̸oTRZq0-LTY/f7?"SH[bt8NL+b%ĽzEW P>0kTO~:XLWT֊Y|`VXz80^^]u85UOS:0̓#V+cVPN<:pQ_Au('١IӪzgG@ݳ:zn8LWg4Jzw~j/qPR}U|۲soTqY5pTO~z8Xϫ7Uk|sxur 0kV:Sp|xϨva˫O66ݪV`\UVZ}EievVX"u_Ul,{Zm-qS+WD[FKqL'T{`b]]zEu8`(`Z=5#&%k3Z VH&e {UH&8Z"qP>XtRu?q,JU,5QկTOH&-zGFc{`}է|ɳzlc/ēmEp+ OqlNClh_V_L&L!yLL!yL)L/!Ytcޜr|ٰƉ{BP qtS>9QBb8 vUjH`6(`vm_=:zrH 9q◫XFߩ8qP>ڮ:QDj"i՝E3ՙRP$R>[b"Iծ"v]uN?W7`P("R$ Wg5N8c}[J,'!8H`\[ XJ`X8qlH`U|:z{tZ$rQ>+˪O$Y1RZTj`z[p`uH|&!12S`\TqM=0h,>zLH`7U4ʆ7W 0Iۻ:zudHSWUgU\x}]$R>dꁍLTv=|tÙ0niv@uTuDjW0宫ko. 0ء:QD"`J|1N]EL;0l6vEl/&ή>"`(yk8z\u/>WSQ8840m'V%veF2D~DE&`l8hN,R>lh/#]m'nc/έ |c;Wo}`Ps/Ϊ+`XZ}]S̤uE 6E],Ǎ2٭:q*!b:cΫ>PX6`iF,DV4WW`i(OUw ^u~c_ydA4Q>5GXetnc: ۧЅëѮ>Q}Q6?ˡV`2bhm UW7`r(öAmXH0hâ#ublnV^a7{Z-`}Q.׷0}e֏j:Oh xa_`(fvս۰x`hpCuI T׈`v)~mXHܯ:P,NuQ n |Q>ps{W_($ōՅǫoR>qwI,X)a-dT}jx=nWԸ[ V_ CrعQ@\(%x`U|Q0\Z}12ZkݫmDc_TW|`l[ݭ Aծ"b]_} Eu"`(&{VU6 [~}@cLoU_m WחU7 I|`((D? W7 Y|`iTwYx.|ȸ7TW69m+e___։ ynߞޭ/& =^;lj]XnT6,ŦvX}\oTi_o ,750Yvi;,|mTQP;W;UWV4J~}qϽϢ5 [[/>vCu-~m]O ,~Sn-| [_4|  =e3IENDB`mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Carlos.svg000066400000000000000000000227741341747546300220020ustar00rootroot00000000000000 Carlos Created with Sketch. mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Daniel Pope.png000066400000000000000000002450021341747546300226130ustar00rootroot00000000000000PNG  IHDR@sBIT|d pHYs\F\FCAtEXtSoftwarewww.inkscape.org< IDATxg]eI/@BMwbhQ&J UHIb{A!:P@T  V<<> ( *]HH~g$$a&\k}dZ\}eH$I*A``hC;~~055vjhǟU?gU U> xq5_<оxhw |_XK$I*,:$IT1oFp uT\d-us#K$Ic I$]f&7qmбT tXs;ֳ]^$Iհ|$IRi6ưHشcTS%ʊ_BkaYRU$I*A$IU3 Zqwb#4{5s4$IR|$IRY4v$lNڵy۱6'  *2kVOw|;($IT$I*"aլqѤBXF*"[zx1.$I$I `[`^Z0lI itԹ %Ic IzNک =XضcmKjd&ra`a`.I$U$Izs8Rq+ҌI0$:?>+2$IA$I1 G%IcV-&\$I*8I$u5؝T0L*v֋ %p'`s"CI$8,$IS3i8`Bz%Yd(Ic=E$IR߳|$Ia\4 %a,' ZH'2$IA$Z:g3Lvϒg+ RD$IIث˚9I*y"]ּD$IZ'$I؏;v9IuE$IY$I*mXhx%004$C+wV.$ G$I,$If #CIR,gB$I,$IV3;>AT[HEĝL!Ig,$I}pW$EX%$I*A$aEٰ0(4$iuZIG5Bb~h"I |$IMXQ4M$IZmH%]o"I$$IRl@*#I2Nӱq$IA$i:Q:cPԨ#t+?q$IgIu,c$I/e%I|$I ؃T4G*&$bҬ $IjH$mÊ #cH*hqolIe I a8$iN/_Ƒ$I/ITUƑ$:E 䡉$IjA$U``_Rpn$\n[l$I*5ITf[ Aq$I%Hs"~ 56$IҺ|$Iex ( q$IHEmKcH$u$I*;!8$Y 0'6$IҚY>H"8 4Ƒ$"IITHeax$I=h]@G$5:I ؇T6>6$I$#V@khIԐ,$IR_N0*6$Io৤$I}A$ Rp~lI"פ"8$,$IR=XvJ/8$I)0 cpIJA89H$5Hs"$I$Ik8 8 xUpI$ Y$I*$I^jiG-H$S_<EB|$iM3#H$<^|x:6$I` IlG*H$%ͅx08$I,$Il?[,$Ip9pkpIBX>HM8xMpI$UϢHԗ,$I" "Is?@{pIATuM[`($IS g$n,$IUE$IZգ%׀,$՜$j;g$I^e5($Վ$*> lE$IꩧH3!g$,$Ie78 8 E$Iꭹ+EY$IZg "I$Hb pp>ipI$p&$,$IE80:8$I`ˀY$IZ#IRQ5 "I$S׀,$$h2m4`,$IR=Lz`f-8$Ie I*K=H$I% i{@E$IR!|?:$ITrG: f I7pp`tI$b~CԠ,$ISA$I8pOtIRc|$HA$IR_I ><E |G6> LgF<KW\<_Xǃ x=vu_'I5Y$I$>E\|xT,^u|kw|RYsϓʇiCI `84 $}Oz=`ؠ|Izy_"}ϐ$,$I DzjLpIkKygHO>K w|VMF*!FrH66&HIv,%I%f IKݢHR -fsHEA׫xe5TZFuoB*% Z9$Ib I=EXF*fuytǏ瑎6G-1oռM:VJ◤#S"I*?IRo%m>T,IG#HX@[T@5bj^oEe!IE|8x<8$,$Ijp&ɨY$5$ bAe1TFlvxiF$EX\|4H|$Td`kI\*t]|U[bbյLRp p48$D,$I=1$ҋ_I撊l-=i=IR=B:A$I` IꎝHO:DR=G*th%UhVyx`P*7A$If IZ@ _lI%3 1IR'Iݵ1*`.RcZ \ұ)I AA$ .Vhx@K{CIKO7u$5$IjL{_"cODU?`GVٴ/隤)2?QL"I[X6.N}%  C-IEJkH5I|G;JRð|TN*"ڃHAowˤ %[J$UhV̍ؗ4;{Y#= Mk(i[@spI=EoItT^BUDE;p=pBpIRX>HR5 |DR-'i5/&rM:@~$,CHjAe[JA$uc] wƑJJ*#X$ïv~J* 0IG`PlIk/Ү;OƑ pxUhIk,48$,$^\ CK- Թ8$`V8Gj<etIҺ||8.:ZBui$I2ĊCI7gsHց$Op"`,/[_/Ƒ$``_p(`8H3ZHbHzAeH ppd$z!F#53?F$u$PB}$gD$ ~ F`8RCj.> , "IzT|Dj0v6܍$I+4vLw$ǁ)A$Ikf Iŵp)p -E u|t$6L:8RCȁ끳烳HV7$\"U|s?Ƒ$U RqIlt-'I*I*MH&E*ls`: `YlIR5d#UtR 1/:$)|\ lDIwKƑE9uA$ITH%CV,$jҰ>x.πwOEFō$ɀ3Y*h'j>Cٔ$VѤ,"x8wJR/h$)ƶF*sÍcY$IꭱRm<D1Է] "Yg-Y$I-IGsN "b},0,$ | D*GtHvA!NfFF` IE*YI[=W$G:i2uplmY$,$68T&~B*~7$Ii.DҮMcH$ 2($NNj,3H$x&/WoaC$IA_\}}W$Il U/Vp;p8I_ \}n?ށ R=|x"6$IjP)YU\$A$IԷ-8U0$I#\ځ/$IRC#.WVH$WD:Ƈ\U^E$I6xOkp5H2z&z8I$U v Nkp0 Irۘt<<⯱\z!H$v'"z4IT5I&zI$|/.]ZH7$I&p_\\/"I,ځI7RCium$[IEf.Wֵ$T[^DegK Qع)N3u 41k͞%I*{#HWg˃HRY>H1wHgJe5"i׃Ty-1uR/i%kY_lR "ƝqZRY>H*6"g/pZEqo>4'Mڹ<{>-iب$I38 8TFI/HҺ|TVi[@spi]!u29mIu%IUՏ'H=40CtI.Ie2t. R<|Jۘ,c 9ş!̞yG_YJi{Fzd)ѭTx` p%ihT3I tVT9n#>"ϳɐH[xbIjh |%8גJeA$im,$hkHY૸A5ueMrS!(8fTpIR5gnm3$僤"ۗ4aTt \| g:Z}mo'c 0!:O<95:$:S[Fe6}tIZIE|<~Q@Seh!)僤KoDZCmAhjAˇLd]0{ߢHEAU! CtInD%;t~~UP9."*Q'e!?ۧ͞H*!FgZ t$ I}%>|QqH;r! 8Nb˙gy$#;3CԐ>E^g|PR_|8>:ԡWpZ:Gg08.=5s~tIR E=$`QtIf F"u03:S}rx'[F),|wtIRL"u iN?H.Ic` ',H=^ko'D$`osA$`67:jUR 41;3NR2G9vi5 $ÁAPQARwJ*DQh'y!8'yT~3S!>:jf(AIRYh΢/0 A9^t53?FQc[ex@L fqtIzawA0ǒTղ|6Pcxhb7;7eI9 lG}Z=0:$I|08C+iuA$[$٤7B}a:W@E ev?r ,> Υ>>Mg_F$r~ҼMIЩꩉ4{d0pGpI7!I\E:fDGHOBt} 6?G$F^GHsp5oGXCRX>Hj]ATyKKlֶIlGgt{$*!o:(6ۀH*IF{FQN(ht5qo>4'ãV{͞qut Ijl{@%;7:x =3|X<1+8A}eq75M`<*ڛvgE$2`E`dpUsH f i?Gx!iÜ ˎ%&CotON fxGtId iATi&;:8Rc{30D5 hZ>z}IV-dY~ItIh"p%ItU" EAj\7I0xltU׹cwmJ'1ҹ3^N"IR.DQe-&ߍ"9lQjLfJEQ5X<<&FQ][闝 |":$Iu484z8̀/g 5IOHI ,΢ n㲦I9mG f=xtIz4}b82R=J:7AT--[AҶ1G'#x-`$Gzh ˁᵕ, \ D \M:sU-+>I.{״3N!IRDzB8'Pwp ~RRY>H7pTtU Z:5Oҹ[G瑺Os[sD$0>:* R ~!:* ^(n7eiT4#[q)09:$I}їᵚj`$p$ *˝Ru~DNs2 fϼ#:$IA^Dr& jAQ/pkj'' (08Jsxtqz{Fz.G󀅻<Ē$$L}EW҉ OGT[Rl lD1xi'#-:zd,FaJ+#gD$)!Wͣ2 !,jD1x7 *sGb,*:TC<95:$I.DQe%:ڰ|c?V` gӁ[:J 8>i ށŃz&ұ9L5~mvN6`2 l4hـw.A$I*y7cĚHOF @ *IGvI7md-:TB|| $ *6]"J708 K$*.ã9TR/ ڲCHT`? 68ʩ*0*8npTWcu \L#=)2fd`H2 8/:J4`zt6q&'hm+.; $БyP\J)HOb300u/0`y~p0R ɚ<:$I%#`//AT:g{+RaX>H!T:7>D}$g`ht IݕvިW5:$I%|4!$Y>HEA!T* ,Sٌz&˲+f9$I*%{IYT.>BjtRӀ/FP7{RtŻG!iLi_/IRm<D_&Nԇ|S[ǐDp i[AT$s.h$Uğ *fAFb oc񠗷 p4\pMd 6/!IR gQ5vDjR8?: YATLySC2˳c1$IxiGWH$~Qh—Yp ױ*ˁ !Җ|N`QtH|r)3f $I8X5ҋ8|23pAk1pp_tKZ2uSgDGH  ,QY \" pC^sTS$uv$Iy 8Gthz`)պqv!* א}&:DꋺO>Hex$אݪ M"y)ղ!* GH}UTsgMvrt$IzN!* {EHQ)HoQ*! D2"߻9!$%>/*6 "Veo|)$EGH*r뻿!I6@GtaT>} ն1CBHȻAIGfMn<8B$m(?R9|P9vt5R>H5KN1cpt$IڤG+C> PˀÁ;JҜ'8ayǣ#$IfF(T=+`ZtT*T+[E(ԣowt#[.%i3'N9C$ma#! 5Ԅ> !gq L6NS;$ J!I9! sR9|P-Fծۀ#CJ=#ղcϚ4$iV퀸=:D.ცݗwGG(1ؒ>H5.M|~^3)IRyk~P>!U7_P_oڣCHg"IC:7EGHu'? Pooც~d^CR{A@M ΐ$I=>\0ud/N"fU&#C\c@>:D*A/:;$ϓ^r'GH/D(p+DHAf/G(D _F5GwH{6<|Zt$Is%Z@">$dW-wH _Ikr! ?$C*&_9σ;xIAFry$x;/U'MR8|P8RtB'ԹtZ%嬆鯋ΐ$I}r&3:D!f ც+ᱴZA5!Rv R :*C$^sQ{2i>M"{#`XtJ8>:D*'xu#$IR]G}o{tJnًSCpJ6=k^):D*S~bnM"ӵc%ٛCJ%^$'CruuIt$IEdG/QɸZ_H]0];ZcCJwΊ;$jh|_t$I!*퀫pʘFGdVfGHU"Mܙ"R/n߶$iG!**WYsru.% IDATv<"U>Hmu+:B$DKtJ#Ze*u뀻CjO>H9y$ Dd~ 9|P k:X%K%ZEM;4,:D$?`>ӵx=Z>x.FwH{twlt$I*ȾnQILP"mA変lᰪz$!R5;VK;$U$g6L3C$_ī/FGH9|P8RtJb=6x>@"I W^ * ]u!RH\:-?kR;3$IRArU: \eტ ~ljJARߥIzAS JT]!@tG&=oAѾ KpTBik$G2>zt$I*}6jtjE:LtJ R-_BUR|hVC3$IRxtJ d ǥeOv.3~_΋jUNITSf"I B])C5" &~g\t@StT4Kke?!IbpAtnk7p>pptĥӒ/&6!Id7SAv2I$ \}IT)p p}t[#T[>v.P k$ PrYO$IE1gtj~U*J ZC$ЬƧm;$UCnz|%INcGڣCT<:BE "gkyEwHI9MSt$I*{7}t A2Lt&>=CR/?ہ%ƈ\At$I*!*/GFG:9|P1~GhGK%Pqg54!I7#T4uρq!>Th #!:DEsp^t~HpJMN!I[#T4ˢ#T}>>F@'œ nܠDGHS#T]>MUJ>䃤KDS3$IRwwDh.#T=>PyX h,}Q`utS'$Nrߗ$IկƋ!* 褐>PGG(VFH4O ٰ#$$VD(Ap7i pxpI>H*)L$I%p<6:DEq: Ҁ8|@M~$!*.$`vtJqbSϟ!IJ>d;:DCT>h CTp)p*pstʧ|TT'9y $dn0նd|~~s) #TMw#$ޫ7JsĚ"Jӣhkm[w;[#~q$'{83:D+ZwF2Aup;08:Dw9I3?kW{:KZkV~($'{CTpW]%ɠU/pPnRKGARrGt n6\%UqW o5<8?Ĉ O "c>FZLvE^7OF8|P_8-:B,:+$UyߘL<-=YA6x|7u$gɞ/nT:[t*;[sɖztG'f4M>-W:Tp))wcv[3 :VOtGN.nx2Krvp ٕ=Oz#TpFGH*&kxv-04ERuxZxuq D<5/BMx?܏FG28|Po>:B-JoVC`I3ͳc5sZxsmtN ;9&Txt + !)βvn[4׶>լuE'wZA Mds<"I*Gvо*:D H2jSvFE`~ ShI3aw!u,՘ˣg5jN @IRH=:D ,QyS^~)EH* GלQ>n*K$ȞO|؃*'L!%z/߈P:I#!IR)|8?:B38XոP\Av$m1fBI&}m Z ˺码  ؙeQw#_t b;` pgtyA-CN~P-:DR;a ISt˥) ;V3EkH6撝5xl$J ARlptb9|PwƳdw="29iڛ$:CR\2qp)K"B6:Dq+Nߔa1 P-L=CRi2u\nQtM߱Y#=*7/ۃ[$IPG#Cmx8I r Q-2)xZ涷p*G.~H*ߧ#TipP.:Bq. O^!պչ.louʹGH\|%'I#T7GG(Çg*9!`ZR?xijѳۚysmtTHw~[$I]dTcE(x#ToI>TZGL{粪JlXDv55$:7j]!*p`tڬ9!*۫0"IEwHծ#cn{+l}YmtitTlcSd_vI**>@]pf0::Dk 5*OM%i@L&{6CF_=}.? ,n$UO߉PA.:Bl<Lр]!zjh|??HhGkKs-=ystl25:DK"Ud-uFH3L< =Cdiʂܼz7z:ґAڌ!+Ӏ1$in$y9>:D2ctJC88OTIUC;J;>Z2ՓR !>`N'$z6cS4@wF\RF! ̋N*IG>f.[\랡=)i&~xcp$<%ʖ=Cm6pltYc'$i|4C*gGurIvfm;:K6ぷ3H̽@ctdk`(oWd_;hl/';.Iwʌ'.[ Ilw'bN[3r]9R-Y4]?*IdoMX+7|T5խ졵*: `~t6q.A$G:V3:FHn1!1e[l}OU˝c8xH;T[;suTJIi)4]!ˣr+:+C$Ivрkt C <~Kɾ::DR 0.C*4#k\-U'7-$ծ+#4 Ӂ.UY#4 DGHM3L<)C*e]ܶim}[iͭNTxcv@K5 tw@[ .#] EHҙYرm-.%$2`o`UtƅQǀIs݊'&EzˣW!I #0Uf`ÇuO)MPkh\ nQuZuko+ȓIR7P]sP]b+$l5iڿ$9(CcMynkђbxet$)#/9`@tƝ'.C|&:BzO%4 .TfT>N6+:D}V\ 8|Cs$is^ L$M6˷?!*T/S#/P8,UR`6o}W,'h\c5[YԱ=o*;M>~/_QQrݏ%I/lT;>\>Nv-ۢC3O>T#DG_!IqVôo$P,GK6';xLXG$Gwvowh$#/FGh\sP޶ΎP$Uݐ.d>i=H.7'%I{;Cg~ <Muv/U'NDH@9q^2-ChIO/}u]'I$)V<`ODGh>b`\t JRg54ޚ«;B˺ڙʼGK0&JIXAʿ%;yu4y$l(p>YIvee>oUwub};ϲ#:G88]'0 =OJ< Pyko2/p708:D}$eCBxxt#$fMjlOݍۛ?:C|V ݤ,n%{xt$_<9|('>yl "I4krQk;y}sښYΑ0|y {4=w^l^Na^;3xРjG_#Ie`(p?"cUÇr0QÁwHRѝ1qj5HӔYמ_<|kX|>Ϫ5UiUkHSh]q. Cbao3js3aC0|=Æ0f=Fd1^Utch-n IDATp-Ny؟&+X~>I*3'OKWEwTg;yRIL8}ޅ{̾{vf&WpA*{ &G鷓ݏΑ"xgtϣ#jÇ8Áx\< X"Ivf=;HGKE$ SwߑCʡ3r؁S١aBt<$sIӯ&{Mt$8`>I`-:9|s&Io#$)ITWÂrhsf^c$mY sG"j6/FG"1-Qex}t$E:(Gko_mEviZfn{ #՜lǝWvzT$Uthסkk$i #k^Q+>!Ed:C$jh:{۞bqy4SttdS '{r4x3:DJ.:}e($iLw'Y/gc~*R$I_p EA;X=%]|E7 .NP|-:V8|(GG׮ [$Izy ՙ>EO?kW.RyqPt5x7I:]tyitsnk<G=:CRH'Vn<<:GRͺ$:Bv0(:Z9|(-.V[!I" ۸I_[duIԷ %x.izIE쩒Tu<^x{tDrCq ;GWNJ0uu.qyfZ\-UmƎ;`!)jC$՜wPI\JmpJtDpP#~Qx :Bf^ڸ<2GKzf1bJx[>'T,?P|lWOP Z#$j{џ?صOp\$˻C$E'Hƣ7/ITR|hP>Q > 0*g#$jԥK8>_~en[ .O6:A6/Mw"IO]=%:ERUZ |%:By`htDP>4DGGɮ\$HqJKg`,Ien҄m$'[S7rA]$:FRչi!ڢ){KC*'f0tO^6.IԴ_=s$Ir`t7>:Ab(o/:DR C =:B=6Xt$ՀAAR/I$BwNTUDGG'EGT*S|1:B=z87:Bj^IeIꏡtMkbtrTtz4 $`I (W[D'HR$$Pzup!P Ε`oC%#ԣ_GGHR q(/WW9|T1vi&)/{#ԣ3ɞ >3@!I5dIᱥ+$ivcMT5Rh_J< U~!I5fIO`]{Gt$ t .T(7DGGMxO>ڢIA$U|>ǞΐKn:1:CR8莎^QI>͙eIAEHs< IWK!:ERUxitz4+:8|轙+#EkDGHR T9ng^t$!Ymѡ+#*Çltz-`yt$ \'1':A (َ%cTEGG>'%plt)Y8|'yi];#Izb7GWH \[Nzsܝ$)I IV+GEWHxkFGh=k-r!$ NJ7EgH #E[zgDGh> tGGHR ?I}6[xt$!钛>!/EGh(wl4pJtVIq#$U+kt$^^{_IkEGhN×Öf$ؒ??s I*lo#$U/=Ry@tD9syGGh~ !Ibdtʴ|e T?ΈT} Q>l[#Y$ფ7.cm[{t$VJ~!*| X xKtDry] <!I>H<4T| iGGh$æ j΍$=ფ77qOΐbj>{4P_ڢ#YGFG#?ngE$=gXtw7/nΐKFoEWHxˀ#E>O>\vVFHWI/I;#GHR!g鰭#TCYs#ʉ'^;wp IƯ'$D|qߣ;:G ew~?:BR{^tƇ/ܡMk!;"Iz[WEGH.0p&ƍNK馭nlS$UN?lٻrgi6D6iKKR2# AQD(=NeHRRJ&ttJ^!ia}s]io%ɺzT3P  Ro݂""~3H=t-:ED~a!":Bv)uf>!ҩ:DDD:x8:BD)7';:uuH/JNwŬKD$ T0=~""~'D$i亟oF}CuH/x9-ֺBD O~'60:D:Fԋa"~Sw~#Xv7n  NI7R1n6!ҩӁ#DDdN|8:EsWo4}fTXxOsWKt3YGH(̵NU?:Jn!S""pu$NFFH&.fctPx89r%Z͍LϺ'xInܬǭ3D$0:D:M`ut>8g=N o!""]"aKqq1(,,$??|ӧ}!//m?{o߾mGkk+V]]M,kEillZꨪj纺:ر9}xNJ$(D.s'm|AĢ?yG[\LyH"|?*`o<|8x:B:6-Rн:0`9QF1rH0` "'':1پ};[la_uֱvZ{=6meD{5("n-o ldsV\ IrE;ՍUnHު!cuKy7njD02Ы8utK06񑢢"JJJ>|uJ 2R **,?рsmzu9{B+ "N&XGXȰ0r;x-""- "Al2?|rrr:u*cǎmriĈ 8BLSuuulٲ7a֭[ʕ+ywؾ]m )NqF`-wRgLn6l!WpGX7N,6:ADB _#~O:K uğJ+hEDzʢAQTTvtgOt'';;켈zn;FJv;vPYYvpuW+`GnOdvgl]jwCîõބbDrdW2cuB&PNTJ'.A DD:@$شi.Xh4J~~~ǯG'vz۽ӷYBk׬D$TZGHbJ4|̲NYGHU[Hz?f| # <7'S9ҙW. g D$Tjѹ~5f*4|гSA|+""჈\$!Ӓ [Ztfdd揉D4m "3a!d[GJ8%~(#DDWVZGs;~⼃l~D(((hwO @}}=m?oiiTWW} SSSCuu5uuum? Ne_M:fƎsglD^quG`yn7cuʍXGH1@uHdQ`'Na ߿?Æ c1x`(**"//<6l#77:<ϣZjkkjkkپ};[n-[}v֭[GSSS?lp1+3@hϹC<{~+:ʹ߱P){x?I|d˰H:#@B0Ё"QZZ!ԩS=z4F:+svXv-eee,YW^y{h Ἧ '>y޷^ͤ"r 7pZgVss3]tj&Λ ~CFT_KyvA -[Okxn jW:3i0 xAY6w$U:$:B:pu$L-g!7999s1|L:1cj$ ۷ofxQv<tPY[pK˱n WϕD$\`!d !J|7:D}%"A"A0p@FСC)..fРA1h )((O>;8:ZZZرc;v젲۷SQQ͛7a6l@uu.sȔ q.H eJNXgF^}ɍ}uξ2/8hBt|~4 DD¦ Dd֭lݺKA^^}m;://EvvvaEFFm?wQPZZZo&ڽhjjn{j@;~/i vJf+[hL^  I!NB{C؇YHnK̝Ei*Sw{ ߺҙZG^cj80딀:@DBV4|P<HLYI8 IDAT +.uV2[c>kp|ú#8"Z^N<|/?Г"4 bgΐ0΍:yuFp3筟k]!"uut\l,a>D/YGHzYD$䃈$J4o]RJ_:"x+F@hsu\:B:2!}}X""iNҋHRfs'ZgHxĈ;wC:$ݸ'ENjF74?ہ?ZGHTZȮ['NNQ ?K3VM6=;:ADBӉ~vu@ fXGHsZI"AF߿?QXXH~~>呟OAAAӇ>}Ɵ.((9v͜~Dӧ[hiiiyss3uuuާ*PyTUUQ[[K]]uuuP]]m****ڭ_SH1wuB:sSNV-z+P~|:D!%t~m!""I'D JKK5jTۏ3h (**"yyyV\\u***`֭l޼kײn:֮]KYY ء6e7IrX}}=I3m ?['HGn->5:@D]# !,N[GH;;XGHT"L*i!*y+db COH A9na>\D#{|/ m$" qоFq+dJ\IuN8:"N+I9m$" qrI9AcΝ $?Bq@_V[GH镋"S)Nhm[lO"6ڦ_&YGV(dX"}R\\LׯI^^mHcc|Z[[<_dǎl۶>$ה4QWްΐ=i}*L:CDTiB`uDo}m!zA^8IL2'c"Oo~VlofǗ 3f cƌaQ\\LQQ'##5_755c***ضm;v`ڵYիW;ڽGZI+眻!f!{0v֛-؆sS|˜^,"$:Dڜ|UA> v<13$rɟGsāݾfFfu䶷byO/a%f/93>}:'On{RZVVfzCC˖-Gi{bWrX7n['Ȟ9Ɵ^.l~=STTSiٲes9}KFroST$\ɌXgȞye瀻ܺÇt3OG|`. o88:B=<3m$8ygY}2x>d~,}<~͜x8b_yٹ3xնmܹsk#ҖK(ZHUgڊJDR:BڙE>x yۥ vش4KDDҗ]P3|!9 G G=C,b Zs>0vXF͈#{ڎ)yf6lƍٰaW7dڵ]'HSut;ߗ!HhL2GwS&/?k/;n,<(+jAAA۷/9 !;;sdffퟛbTVVsNعs'TUUQQQAsss߹9ٽՍ9M"CLӇNZHZZ o OYGj:d{<|ұMaټ_Z$Mn%9)@!4Gxc/"~/`usu@Oq#<1SpE>_!.Y6g&tEfFW\9د8I9I'$!8NOPv IDv΅ahig!""h7}Fd%%#♿W]HfFPwR\4oQw< H_Gti*t7h!m[GtW#&!O`unH`M*eδh4wz./;chuW@O>s* ޳E3#Zo要-\LF4/0=hqN<딄kN0Гy:GD$龟 ꛖ C#M9uF=l!]N~̿\sY)VH ͔)n ϣm"D:x_莠 αv~5s;h4O;oHp?>H"\_jl "iMOOi n!m?ZGh 2b3h댄_|LN0tƵ, :4|8(6@MHGگYҳgݻYGҷ :6mN0ph<\u=Q4EDdw4|@Ӭ3R}^ONvuJh%IlG¤ ɶN@/m!mݠ슆'{yu?i1wwqvM HutabN._i9@A>|'[3"";>H 9(;oun o ]פ\DN#QfuZuȞdef03\33vkŪ S<['|_:Bڜk'~>N6DMæNO^z?XIGw\O>H"8OO>ti&;|{H:?YGH@u}p:S/"""{ GW$ϯe!)fӖ ޲ENCvAD|G/N, Ai@ϿȞh%׋0wwk}= ,>c!{k]kNryi~>"?@ٝ̌ N*ǜjѩ:AxMN5i "~q"l@+C-O zݙ<~Yr38#3:x?X'Hx:CϼՋsì;|sQN܏^x9d?N65"">MGO=tW7|~z&vkU߯ZO3|Mg>?UYGHG!a!m(tUuekCkʪZY:C8:Bv!.N=4|B8Ӿ@uCГkK]gɿ_ӹґ~xj{mDį[G}_oICb"">mk!}ge x-b!Қ}rID$b#/qG:@DDE5!{{ *▫/h$]f -DDBi9|xwA@E F@wwŷ|N3ظy;h!p筚?""lK#Pş_>"tptG|!K >I$;Xg4G/ΐκBDDBw8|ЖK̵@K[+aS8C3x>Hx{KfZW;\IÁ!:BDD)f +7oNۿwYix5ZZ[3$Ho"ZgHTZG#>oÇYH?ZH`XʆY'FȽf[gcg K2I?o\t孚?܅""pz?N$ |ƶOXGH`i z rC~nu~:Ac([G-~#U""h -? #G""SE|6lqٹ33X .y=9:"x ηh RuG4|݁io""h>ovz@河2mxmET6Hvt-^p-""469O_=/ZGH9*N!sY3L_C#o@ӓkϾuB\sٙdef6,xfBدe3[`4h!""IXG~-DD/a8#ȅoҪ٦$T)ya-]I+#ϺEDDRB!܆r@ϳHo zs%g*jk+֗r^3B[C3DD$e^"~Q~Yq_:BDD/j '=o0v8'1մaz${a/Ƿ;DD$N2#0| P`!Nİ^ zE@O5]KLחK$1oC{o(b_""H8:_<",VXGH(h ko3C(o l3[_̛Hk߼ŋ9O>кEDDLx:BwA>aDD$Qٓ|ID_;d=c3K֗; 2o\ZWj"""ZÇxDD$Q4|@Exꮋ<k%I&yeo"ϛx419>h)K:BDDBC[VH z#ϾuF+S1[CcSUު7XW͍RVG<}/""n!̴\z`:FDDKO>H`~?KghvM]=.Yn ^[gj~6[DDWtL[ חrIDDKO>H`<ˬ,_o8MĒf%x7y ~Cw[i-"";ǩ\-vG^6XGH&yz.:-ARF4K]^#C{w4Zh""" }|e õ%P)uHw4pӜ?s߭߶N !sQ0i? W\4dmIK㵼/Е̘gc<{6Y߼sѯ0DO~.*#w9xݏ::& hoxݞk-Zmj޺Ml^Ijbolʁw5Д߂H"b!LNVÇ?6Z[>=G""*zL߆szx[xv Qrs";+l22䛝o'DJOzʺ$ nFYWt*liuV""r=pupp{Y(c""*GYGԽ? O?:CDrzJuN2x<:hƯZ[e+,zU_F=lP Dikz? H7:Ç4o:+^-!"";x4 Sh$}$4x6/""Ph r/d!"A & 6{eα o,oՂU>1&|y<90昋{2x8o=b d&O>!+"":_~c!(6hj<.7pOp-Ww_6{Y2`\*La<=֝7#DD$n!W]r]wuj4)/^˅oHݿ9mNIFED,u0)׀_xM8) ZG$B$xsaSSD$4V<׍6+zcc6Ll~̓p]N IDAThL~d!"iD`up)pwK)^S ZCDD$ZG$ʰż1.XH8UeཌSPGOtbğ|IDm3K?[gH}{㾇3'E.bT K:k/6DD$&Y =uuO{u_&?>""zDR!8[?፷W[.roZgDS4`uV.PdXy`Pq?O©_֘u_ j!" /XGI'Ek[""j56sW@cSu|hŪ|[4xX3puȧ lHsNT 咽ID,[\_ZgPWșLUMuuȧ#$S1|HQ[GMDDT@T-'=뭓DD? oǟ"]J{Io3^ 0P{ $MD"a oZ`zAD؂)Y $ɇ|}ٳADD+d!*;p DD|d{e_ %~"g4爟ל4>2V&I :B$U>1 "" =lQe%9YˡO} 铟KvV.gUW?ŅG?6ˁw " ì#QudJeYH Ih4IG|uxշ~YI%N*d^6aCɈvswWݸ'%TD<&4> Jx}ٳ""zDRebH s3DD|F`ufT9h_ DDO?gW3r xhCX'ɇIts@u}cq#3DD=}Yt<$FuD $尢d It͓""6޷IC'OMX{x&k_/_^GN^+"@Hsɸprɞ""*>HZX2:ADD`_>y""!r?_Çp^>GeEBmb\ff=j׽5|]4}Oi-0Çl$\W) f!""i[G$c['$tͩJWK""ix:"JN ' ו>i""jY$|yz(dg۾MVfFJICi+ ჶ\}DD$՞II>zշ(_)kK<~tJISi/5|u@uh? 3uHZRĒ| SH[lHs>D|M'DD$-m^I= "bKRϾ{hJIsܑ$x^@/ DD"2y(bZVI b>x23?sP@5yD-MED?. }i "bi^zKt=$:BDDj9da""~5j N=Д'""m6XG9_tރ-=$""~g :ADNKk+/VֻܙD]"""]u@;"Kgӑ^OO`uH"1}XgWSUSΜMDD QD],#QI൤ZV""bh"(NMk""M|a ?fX®yV[oh Ʀfoldgu-;Y],rӁʼnbZCGq! %:BDD6P`"ӦLNIkUN;^Vr~ЛK}{h "xkC"]:8ג{:@DDCo#De{['*OZ!&B""lMKԅ5|&Z3Z|ρ&`c3DDVcS3ooHZ(7>kP25  m-o47HaeOc![S&%;+:CD$m,_OsKKJXss~ 4v^RDD>D\(QÇ=!=WBɍ@uHo$p 遲l''>K ݀tS,Hs ߟ{GDDď6[Gƴ)>XZfc{숤\z=|wJȁ߉>q[(""~u+:B8puHZ+_)ekM;<)=hqD"dG&(GD$(tӖo|&':3u.T7YGD騡>:CD$A7zhR۷ cz=x 8"9""Aჭ)@no/Á@F#=j!""#J$P;|5tPqҮ}^xb!"g#X&D$\)]3 : ""ioʔM^nvҮ?eﱉLp ph".("si[/i|K(""A/"]F~~""i;kRI >|3I0j />HP\ ZGtL_uHZZRV߂^cqB-࿀&DDRO=m{!=Xg!""E끟ZGt)i7 kU5u)[++3GYП!'{wZ'@rNIr}4V z;|O+XtOСa/sED֧ľ&%M"")u@s@orɖ=iٝQC067DDdjR9|&}Q{%}?^ƧjQ$O[C&k'""A0E|GX'PSא[ZFȔ >81 $2>ˏo Bw;euMM)[!_@p"" Hcߛ0zy g!""Ce/#D>mqo1""8RVm}O>|$=!"#~Tl z 7ÇX[M"tީX'ȇ`!"C/Y{>xQI%"""Th!? 1bg҇I~?{uH7>)= zZ x:BDD$~i!p̴3|u|(l*vV'u‚n% %"$K&=`-:BDD$Zk#D.;wu|BNvfJ`뎤^?#%7'+ktљY""P Hc)vE_OIz7oO}F#DDAC{:|ҋ_6 XHzJ+lEDdrsS^Fkov  :BDt?N mdKDD$l̰OMa՚I_)ktE$.z: hЛ'F:SDDGfO?qYgȧ/=jMr|hhl!ktS:BDiG=<"""IXj!/i ""PTs.e^ADDA+uMW^@F祉HɇյVyB[k&Y""]vtw0E$aKDDs^S&GYgH:(krv(yuHA|@F7د/:@DD$Eް᷾H$mEDtД{?{wfiY {j}o^XYE\cL\$$xM5י,f1&q$N#ƌQ$ "(,""([C]u? ZSw:u%]uꜯϣ?GͿsٰI=?\iH8mKrt샱KNIrDι5_?˴x3OOMqak248##]}ݏ||9v|Npd>|M/]fxh([#[7纛n˵70W\sC.E.އ$t&IN4Mtw@m3487c0 r![jv\kr^C _W؏DPeRd|8~s$;C0g GT`=r]u~rzu NZgRdw>;9WV.۝dVuf+1hvZWq,9:t=3|$lI0O|XdA=ɜ 7&K/Aֿߪ3@a2dCoUu$98ɝyd.9$߯]:3dzN>6/}:@P`?nLHu>6`2\] g #20Ъ}?}!1}lZ;J@yFuf9êcp`1VVu3CT7?S{_t`΄'$)A@?96I!hٳ?{sʇ@X/˓Z$߭]4K9ëc9U#&$#!$K''L= {IW.98ɯV^p|u :odWV u&t/L4@+=oɚq_u rt ʇާ|,K$ 4_ȋwju ;6V C qUufI> 4yb~:$wWT ڮӱK ;,L1k/:͵f|=CQ^$UJrsu 3Nd4P0ޙ !hsfs}</VM2Z`WO $9v"#\WѻNujc~~0s|1ǧ?U$ޮK)@L$:?W>:uw˪CPw&BuIQ{DʇԸy~;T~g^WUPM:$Y?@|`yNwWٞ?Z%S\`ڔ}!iC=A󓜝d:c3{Vu|7 !fL:ܞ}ˇ%Iu& `ycëC\G&;l(hu$:lѧV&Y|롎ye$s:uQV$d: ȇo*zű)Zlqw氵+;nOrNu;u:KcLrfuiɢ9q@3-Ipu `&9:ͳlœYtaoThdl^:@w*`&nKV::Ͳꠥ9O>: O4$7'VO@'YɄzE.s҆}]IOש$V$WSS.f'Y,L7N4W:lM.sk a*!:zjC7U>3}LsuuzqnUu\ASk f׾#\W:m|l.?U˫@}:cc)~%tQu1rc"O}Ƚ}C{ڱ]$W_Ow3o(4HߩuFPg=ܙdKuT148 03ߌgCLGSO)DKL$_AK}g^30VzI^]`TOM|HrDa_lA[/3Nty] ˒U`Pw#}o$p0]ϼ|ߛc\W':DZg%X |Ƽ$+ֱ=I>Q|Co 0ݗ$ŎXW3ni ¾II~-70֬\/oeKd.^h|:D/$91c]OIے8A>/8iޗ?(pe4klEI~:ɭY*XW|h1`?:50_̗geq3.`:0i7$ӬNI.P$TS C{yK56 @'c$/,B]jgI>dnm&cŲK[ƿ49K IDAT.A؜Gg0c9,ɪX$;ߘ %Cj kڙc]#ʭY<}~GY:t\@A}ʇC=n Ϯ$MrN;ኡA6<4_Tj 6v NrGu>5Oi(۪@OsˇʗXZVugo}ӷjϝS|4íԄv>(j)`=r]_;!Dz% 'ޝ9:t@Cw |pt 7L‰ٛsy׿L/#׼<v@d琱KC5]al9ߔr|Tso}|C-YXzː aSz'}0dI4rp-׽ey/4_ϞϞ{qmYqʆ[5?@P>4uk3a/<|X=t@ʋsJ^S_/^O|\t5_w5<ް?G]h5Jrc_|:lтyy/4{?{I>߸˗moU/ϝ v>Y}GLrwuV4y=s/"_< /Ͻloyk_VǁfL+cħV>/O.V qt^W 222+!_zU.\|wm;jْy׼PV (288O>6|l\~ +׿fnP\lqyïp8 $EPaÊ.G=bhp0g!ga\~ z-j͹z-۲k¤{wy\~s4v 9|ػK==lAKs Oϙ/<}vڝ~xGp˦?qOnl۾9|P׽2/90$>]إf5<2{psnz=s߃syx˶ڽ;nޒ;weOl~dk,\V+?oNf g̟7'K-ȒEt,]0]}s3ko9|ػ=H3%|ɢ(@'[k<_xhC MA;zk'LVx?, w'iWC,y/'];dWC=G; E~0]k(z0v i3aإznu.4u|XQ7VfZإ&^7j@SO`R=Y8]c3||6v YwAAp@k0]k;viiAlP>4ƒ 0]kIkmIG%y0Ɏ}hKX V>4K;=!ԒDPy.4P>?4MdʇEA} h;ЧP>,>W&2v yЧ]U&y:@R>4Aۙ dʇŅA 6v y5'v>TS>@]h 5].~hQN4v>?4Md3z dK=MyP>k'y:0y:,ݥ|(9Hu`Z1v yv'R)f?z:0Am;dx $})IPc@ZEMjLakH2:Er@S|h(k̵󡎋CL>^·BW&m@CmЧPhKu`Zm;iku>eRm jPakTEM16v ְ>;:l ; i)Zv>4uv>Ҹ@SPakPE͡|h&5*MъKdK4n.4u.Ҹ@s(:l ; i)mc:lyʇ:7hVf[إB7h@3YaR!4KdƼ$S)=4dCIS]M#Hu>48ۇ+lLB&}v>];·7\$e=E\$ߛzl )jY\c·".vhv]h.gve@Y$C)|h.̇".vhczlT&}ʇ".vh74OPDb@sY>CM4ߛK}.b&i v@}Mj\cop(v>TpuϞ`n߫#m741̇"x][vo[}Ugx74HҪNчF@kvduG\ʇHҮNчdt0zQGͮ;{֧&@dco򡆋&}+S}{xЇF ~qIh_wҳszlP37[W?}<@3y}ʇ"c@Z|ͤ|>g>q~~u 3v v򡈋y/.Y.4qݷ{ }pb7cbK }\PnlQ~08%f}ʇ".vёv>/: 08}ʇ"~iɧv^CmS>q@޹+ݏ;~: 0S 6v vnC ;Lё!m@Cy}#IvWCf4il. 3,4qgR9`&k|!uNu`&iLcOPd?4 r>ёvu`&1v f· #IvTSs@?3oHvl^h֠3:@1d[u>|.oq.;WqQ]jCtmGl(@ 8pfCعmG>iD LMd4nPdtd4~|4D Ly5|(b}ڜ搜4Ak%!v>R>@{W|nm@XMPG=b/}8؋3:l c i\ 7ܿ8@/j Ҹ@ڱe{>gܶ:+]h 5*h]ykZR\tkߗ;:M-N4u[|q;W Z.46;qޟ[8t:dKu>7o~;?-zk3KMdMIv$^)`i۹+Wi3:ҮtKMd$؛+ONLm>m߻:I.4p!ЃI|ӊ-?0cmx[7?sl&SZm@PC\0sg._sddHu$@.4ʇ`m漳{ LU{fQ>xBPa~>r߭Sox7lLV˙ c=}ߺ)~{}<@u`F]h5Ls@j ^3^<_ VŁMcK=}n_{^w9پe{u$`o]h5J]i Isێ\t_\tٵcwu$F[.4ʇy`-9s?\tٽK =ZÁ=k伳~T iv>8AWQ.:ܾ:;eEu>@bCUfx1]9o˶UGc@XaRXYhm{^9|H?4_k<$C ]d3[_FNs+UǂV>4G+.Uy(Q5Ɏ$9I%\hw럾8~k9r+8:P-cci}豮aO-koejkky+,')V c@:S>Pvy+N V>4sˇ{ ms8rwUGkJWS<`Zغ#}\KuyO?+' ?93<7λ &h+KyN3Yziu,hV[.3(){sksqy˟yLZhˌ]h5|&ʌs׮u_6Z_rjNgeٚѠ|h5]!n'lws.:\t{Ά8'OɬAoh9AVUS.7s;}1wBNyɩ9jDk]h1np8d c\y+Ⱅ9I?qrrH5};úk=?<ɽIf'U*yIĬ9v]N~9'N @>:ꥯN~J=O\;&y0y·~ט~$+l0Q6ޖMo˹rKN?l-N4(*Lcy|NrONDD4H;7]~Cn|='A0.4ź}ꮌ I(*bKU_v.cs|6<}Ɔ̚3:tAPCkeT=>Kϱ||An=\sg.μE0|h|Ak $ nޒ^pU{U<&G=Z:V:"v7}j]]  'Y fdHnt ҇KSg31ސE+WGVt=˓%lbh]HΊXssgY ȥ:=/O.L+cħIMs/埿,ss艇AtHe@S>ؙ|اV"p4ڵ}מMI2>;j/W>6ט~n iss7O Ч5Ǯūg>])v>}n .ͦeO^|Q}{ u'87G]haCsSۜ^pU{UI Cpp4@Xg1ʇk &ز=7~訦dlwĚceͱkvGwH/]P. 'YUOÆ36zAطۜ\\kKW/ d͆uYs|[40%@lU~/[GHq\s{6wܬ8|գ$J]VaRKm}u>6w&ٕO]|:mշW߲ksꈃskrQkYyĪ]8.(StMPcG{ʇ$2Erspm߻5}N%UYq.[7@oD[4?+XʊWfa+lAYrMg@oZcܣV>8t'غyKnrO`Zgw˳l8ls%Mf}Ƹ}¾v>}n&ddd$l?l)ҵ˳|AYvY,K^fΗwQO)`Q[={pw~9YjɣIJ,>xIZ/͒UK2.'nK=$C)c(F;l]߿3w}q?84ygAp,7g,\8 ,Ȃ 2ɂ[ܕd{>G8M1d93Ysgg3;C2w Y=oNfϟÙ5wVf͝ expdyI5̞7{Q|]UklMrx[0$){&ٱe{vl>3{ 4®:ʇ9:@CU}oP>4؍{ƾʇv> |5FpoW#DY&·?HkoWTeC U(zӼ$VqG$[O)V!}ZGP}7u 7u eYGs󾾹$w. ػVcC<|H~$=j]E!~{Co`|F.Q>4`|>]# Ըyg΍{Dʇu S1u&R>\}Y76TSI߃&R><TJ:@Y}IA)*R<:@ȥD'::@P_|}n"'nZÄQ0-|x"u::vIPgCy!z$GWc'򠉖%gY8IN#N׶MI'/ȹul!c΄{ɔF/qx u& n&1KLCSb@C1 ɑ!RjLKp[&q ﬓֹ?]}dG\79:i 6L|0zFwILP>4 wv>ԙI>YEV&Y]}w2lI>zfu"Ws&[>l$N\@>Z$wO&[>$ɕS:gUc4:JҪeK_iқ|hIe$YZu|K@.Z+c6&:3d@.ZgK'CS)F\33d@qt+NR>$F/U:5ɬ]2;I!ؔ3'ӪCt)+ 1>·f2z F.·Ixc@Zgg@O|t v>Թ>֩TˇJ%YR`-K:Drp C봒V`PjL󡹌^f:#j|P>::4S>*)]$ϮHrT@u?-Kr|uirR%!ط|<y䇕cZeIL[\~ Op}In>`%9:@duu>vc@ˇj3uZ4r)Q>nB`Y&f략zb÷05!'Y_Lr>I'ʇmI05$ϩ!ϯ羓dǁ>I'ʇj 3ZnF`Y#ʇIV8@XT$;\LPgU8@M2X=N$:)E\;Y>|=+ɢS$ɩ!\wdpiK@sxPc :Y>lJr{SdR[թ'd$t7'T>\]k|Nu0IkSut}_026 I^\.J`1z h뚵Or]'hw97)$&Ի(c!1zڡ1 hgafh@3ʇo&> )YkKowI|ؑ:/J2X`?<:D4ɮN?tKՖ$yzuxVE!ܴ+f.s^g^ʇKLs31nZ9֮$MOW9UL,Q}+cNwtKf'{$!ܴ+fU؋_SsfVu'i%yIu>Nz,Jr4>?wHC<ɩITs&o|:ˇ^`kάOwi~~M ֻp:|ˇ/OI:J}|.nOq_}L!Ҍ[R$wN Lw$օ`lazsjM}7t5 &yquݾ 'w+<:H:D۝~n& þTNY$E5ǹ@5rTB>;-!:!fn$֥b|I^Z[g&iUs'/ԭa{ZOWz&ՍV ^d~u,H!:̋辗%[t|V{z?Vuzw'[/a4Wzg Wpv>Pߒb,z$/el]Z]]vеyR-N@X _u|!-]~MIZ!o cnIƵ&ɳC3s\PQ>[<˫3K_Uî~:0t)HTQ><uJ#C&y/ZQ>$9EL돽d=|bDn~`luYpM6?rj#C3QINA*_ _Ǯ,^ 8ʇP |rmϘ$9:0cdK ^|ؖ䫅ϘVWVfWelݑZ_I+ˇm3P^]>v@mHrRuԗ7'8c$IICbR@㽪:Iz`]clĩ1޽WBpaC%`z \Rʇ]I\$cЪ4N++C$97cz|Hz` I#<:ޝ}uf03v˞Ҫ}_D%""ې;D2F֬$ҪjE,5Sgsnq.6?n|ztb|8n:Xn>AC].Vt~:q:jɞzziyxp(ҝ/T-՗NGK7LGP-p:Z\vxUsC-#"`i\tXeR}t:`i|_u9[#fYLJ#G9/\>7q0:>Ԓ>*nV]b:w\`iїy|8tU\|:wTCY-~`9x pN<~tġ,PKkT:|ƇNGPվvS[23#gLJxtprMt|9yU}l:p}|ztz=^u.#Y-s.<>Yq:HVa|d.p \5Wa|zt82f\`%*X-nx6՛#ƪm( _]c: y[VQ Xw+sE*ou: xW7VtZ\c.^&/kqNVi|zdCܵl_uRW[OGpOz^.^&\}:b+Vm|8iX?ZUj-;O:qYsU.iX/.^._tVP^l,e_c%鈭ZNpU;Uל+ʥZ,Ӧcv_NGlǪU/? `5]ZW#EOGv.pvV*Zi:ܩ:e:زSryCo۵C#'km#-;tXU^[}d:ܳ7}=#8G#Ū^>]]w:8jW}txqcC'kQs|V{ƇwVw:ܨtpDWn0StıZ"ݧ##:9'^ϛ CpN8Ω^4e|x[#CCu;a]ƇZ 8=}19:>6]]w:ﯾt:|ztNY+#{NrtkaƇZGRȍ2Vu.y;iƇU?.R{:[U;#vҺ^0Z]a: NGp!kq6m|zNutx!ՉK7NGp!N vru.uտLGu5\tlVBΜ :>.~o%?Uo :>W=w: ju@<<5x]LJ_nMV`o: 95:.^N__}tl﫮35h|<>`8[Nk}~ニ UNGp!k{}|ptlӫ}\^4}uOG\Z_4}M\<.Zs:[ñ\mPutu2.Wi::s:`/lpV.^FS2S鈽)ニ׽KLGTutufrGeuFU]z: وϷIニ섓[,_?W6i|ztuQ]~::c:`/mpVOG ;tmE۴a v /VMGMStuzut[ܭx鈽ǫOGpP_\:+NMGpP~!~LJaUOG h;UY>{w ZuX!VWPtĄMjq~r:CsMΪz:FuX9Am)<>l컶VCO8TOGpHOiV࠮]l:؏T_>A}ztĤMzts\9m7}|Ņ˒VNt:_=s:baqǛ#8GV'LGhf|Xxtt LZ]m:Crޜ|gU=!=t,Uzt20>,쯞1!]Ś JSZ7o<yn~tc #g{MGTΨ>1,zRute#`NGpHgW4Lz_/X6/.U<L\[]a:絸h崿ztIJ1>\_ToN8{-.f9UtIJ1>8Ӫ+MGbuyA՟NGpH~j:êOGpH\t22>ړ8;WW]t^VttBE.:!ztIJ2>9Փ#8u:v7U7ఞ0>ޙG#8}OG.xb/ӿWϛXfƇd;OGۦ#8_jq~!)g#8UOGh:]v1GEֵ;MG[%NG,;y|utp .Q=d::zt*0>~m:úBu8>:zMp?=؆/3=a:`U۪OGpX'Wmxdut5T}tlWU9J[sVGqOG<Ź[#Va~n:#{#(|Oub:#z|~Xnƫ]#V٭۟Vu[OGaZ}tGla{^YtGp+W_UXEƇ9ztGՃ# V}tGla^RtGt\:m:#}VNh%XONm0>TtGt#a?x d|86gUl'NGpT]3ʌ9#8/>FWu蟫NG:ñlX>o:t!TXuƇqFգ#H?_]j:#@u`|<QslN윧U6]zJo:yd~XZr:pۧ#8*>1.;<:y:vJ[݆b|Y/Uqڃ+NGpT]}j:bvӫMGpT~tkKMGpTztĺ1>ϴXX~'VO`-=g#֍aw<[MGVnW]w:w#֑aw]=r: ե#X ʽa9{^Xd,`g<{NG+9ݫo`}CuC#֕awztG"ӪCXIUguUIuݵU?1JWuCZ߲K;#8j?W]q:-..f5~7<:.Y=a:ե#8jƇ귧#8j?Z`:ͧ#8joY0>읇L%X]l:vily{5#: IDATӧ#Xj>Q{]WOUך`)]ztGm.SƇ+#8j'VOMTUnq~jxYMb|{>7QnuOT9Q\sƇl+MGXt[#6a#MGp.Y=s:f,a|l [MG0Ս#ؒ>2s~#ql?V4s>S=l:-|Fb 0>zAlmLG{zt&3>:zt[\*).Y=s:-{`WVc#O4ztĦ3>,+[<[=h:òlɾvI-M%ϭr:2SlUMG+Q]c:-t,_`W}t;LGe7a|ꗫC'ViqPYƇlWx +#زW3`P}t۪NGe$,9zt[vN`[N^-8Weӫ7MGehq զ#زTŒYVяW7`K_e:-;tg|X^U1]]v:r9-uX-Xg:3>,><]/>3+MGeZ=r:C3>,h1@znSb:úiuG#84{Vlӫ/࠾:s:ma[Va.b<`Y]n:-_ݻ:o:3>U`[nTa:ܵt#82)Օ##ؖO`|X_s}!"- t꟦#8:Ƈϵ[g:`=#8zƇlcLGl9ݿtGz^^trb??쭓U'L-Uz:1>Ӫs#ؖkTO0O5י$jzOխ#6-S#ضW`LGmOtjutlau}ztvW11Ka{ut>Tt.թKǪ;LGpNu:a|XogT=%S#8fX=g:c|Xo絸|իKL sOz8[K֔aEٗx!&{ve'V`w6T71ME`Vr:c7NGS-..?1{J{'LGpkqNvasNut5tt"gVo`o6MGp̮^7Uϩ61{aguvčNGV7`Gܵt{y^_t:#vGOG#^Xq:e|Lu:cv\lW`G:Pխ#~b:9Ƈ/OMGc `zp4^}p:u%q!:zq!TMGWw`ݠztTt;.G#X~NG_m:X;w5{VV񁭸O츧VםwUO`ǽztVguvE[\*~`]zuut;ǧCX_`]ū.3, INGZlǃ`]zy'!y:zOVtus!Uϫ wc_uf϶x gCX=Ox[W?;GW`W<Vc슇V][P~~zt8cWaW;՟OG+.b`t0sϟaWփէCWoxFlWd:]GL줿j ,U/e:]sNG>gT`PMWUϞ` ?VtnONG{iUw` Qݮ:w:]-vQW>1>[Z=n:]:tk_=9QoOG즟19z}!0®<.2>Ωn[tuյCSC5kJCX_v?Tw`W]*jY_w;z3>^T={:]u-Lv!gT/`+t:]uߌte~tϫOGTl>9Wx'!Q;z}uvGUa3KWݾ?®Չ!]zE!՝Z {^{]vWMt CuO^5f1>0ۧ#u7j_V!wV`pv><®0#0cՓ#~}:e|`Cߜ`]z:6ͫ3Z|NgN6ix!x nZ:~:]_=w:f|`|;zau ?aS[6_e X]=b:=qWNՉ!쉇Vo2>\Kp6 +L^b!7VX&U7ž8zE!+&jM,n^}v:=qRuVIRngZ}d:;]#3'7N %C3U4eKVo~:VTo.3žyjp0ٽNGg.H_;+諪Taϼztevv#z\˧C`\r!T>7b|`}/RPoϫ~tk!V8{NGkMVCSwp:8:c:=EV_9KK[P<LBEr7oA_Wt{/`b|`Auܥ7W=aݣztlUuF)կUם=Y%CsϨΜ0>NԛC`|W!wT2>\@Nj1@x:vx[SVUwԟaϝXtW.>žt[Vu!WV7t->YWw9Qh' n;;KZ|el ZByWa6ɝUO0##`X'S[s\! l'-'gmX7nZt#U~~:)->ײyIIWa3;v&DC`9c]MN0['],Z\,|ƜWݶ `ԭSC9zM/N~zt-.kbs}or!P]zSuF=zt&oOG0ꛪ߭8Fg6¨khXk6-aԗWo>FJC`{>;Hu!j}tZ|tԿM^0>IoΙaxӷLzkuF≇L^1>iTg:q~tk-xtYe:MIDuVu-UL03#`T~e:q'T/>zwb!{Y`|`STtUάn` Oι;'OΛ ~ >⢟wO\:i:tR!,nZ}v:t~ztK&oU7J\F!,iq!0[ M;kNVǫV8ӌ}n:pķNԾ/a)]ݼzt,߮2j8`)ݸYCX 8K2>,T?>RSLCCOG21>=ztK-~. 0k_<Ψ=k#X*W]t'T/4RyCut,#ܹm?aܾzcuehqV9!phnPtKz-q!kT_}pZ\:XV8k1@tKx^w:];4M23>}uS!,V^y:]q7OT>YP!pt^ݤtKՙS[U?_=>8[T0G-Տ{UV]j:crJιC`U`k^5;CX:?P^uJ[MtW?Q|:VyOOG::!,x2؞T`)]zsG1X~lqOS=n:V܉[\P,rW=zIu 6b}k1P:i]a->N[CXZ7oqaTon=V-}m2>lum!,tꝹXC{g/~n:VvƧ5Һ\-^޻k7\a:OL:0>Xu!,Z\BW.V=:l K}:օvֿTׯ>0RN/~:u:<vvWߗrnꏫa}4o]a|Ս@rY}Cǫ+{^ w|%X]z~|qXW]onZ}f:w{ n?t7Vp5쾷T7}u{ ?b\u귦C``o7Ϟa]zcujp Wdw|y;m1@3;zb2-˫~ztl WU?sϪoX2_[ioÑ?Ro:r:i`\ŷ֟_2ydVε?{OqVX"X.;ʹD[iիK zJR1>y՟T_1E_Zt+9Kc|/M+Z<|tꏫL3XJX^8Jxe[R-^!VC -9?JYgwNʭCXIriXjX~Ϩ~:o:ߪ~p -^ꪳ)-^5U5s\uz{Ն[߮s l!`uruV7x!ƹyۧCXYVw>TΞae]zQ`]zJe[X]Vwhq99"z^^pV?H `itmIA$I$։ۢ(Gc 僔DQ~L "I$)?wgQ-!cv IDATR1,B8A$I$eP~DY>Hq3 *mKKH$IʞѤ g[HX%GQaC)I$Io''3N󌻢Hxj߰EQaL.'=E$IRN\vYTAJ,bz84I驦y[H$I~J?t qTHRq-$:: ei׹@{pI$I LpbtIa 2DQIO;'8$Iy#p;p:P ΢b8XDRX>Hŷx *݀ߑvA "I$~:΢x?*:Ʋ|CqAT8ewAE$INzHj<yTI i"`,$I6(n;gQTIGIHMAj>gSjpp,$I6ݑ"_mA$ /HB8>&?.g$Iƒv EŴ=R|e[DQa<@ !I$)[^W-Az0MR|ۯÁjOR]L"I$)pO*^")僤7EQ'-{$I4JSGgQ=n")Ixx *Q9,$IR3t*yTlܭI#$59I5J6VgY$I"&KҨ磃HIkZ8/: 8TBE$I*;Ӂ,*y-");,$$Eŷ#s ;I$IC34nIj*p&78|j>Ρp4p4D%8$IGeB9;#8|1G/GQSI҂2I$If/\(8NtIe \DMc`.:8$IecHoE_Dm6ݤ'EQ(bH$Isi8Tg>;H>Ii 79\&v "I$et%,j.O琔6Bp j:onD !I$5.H ΢#HIk j:q$IG4b^@[l5VF/D84EMhi ^Y$IF4bi,j>'S,rAP|8]*lE8V$IŲ5p.p p5%;H/ICu /i4 L$IR^28QzxpUtIf "=s}p51Y<,$IҖ΢5/:|T//Cmp%DήY$IM1`Vp5 H*I 0\FXs;IsrGg$I6d$pp7p\l5*p&}$Յ僤F88XDM4'~=O$IPx8)Rb3sH* ?(@<DMo"i<($Ijr L"= ":b|HHn"4Kw,$Ij.:\ Ep{tIe ў!=I Ҁ9 KY$ITlqRmA$僤88JV&FƑ$IRNN*q$ ݏ  " X>H.^(Fn -6$IrT68jH%äαq$I4LSG~쌍#[HX>HʖAI|TB#I]=}ʾ q |5i@Opic|N$j'^!cbHwA[p6!+IW]_v}#IC6ARBy28$%6$I6Q8T:L#mp|u ÀHh{M {  MaIIlt!0#6V> "IAR\LzAͰ+p!00i$I_ҘKHHy$i/wHҦ|7{?"m\LG$iNKZx%uH|G/G}Y5qT`DhIjN!D)63gf )!3Y-18TB #IT ]Ƒ{(e,$o=kH[hp:鉼31i$IT:}žq 4:$5僤fi עHu:,I\`rhI8t 054T'h~$:$5僤f_JE2 8t|`8$Im&mC[Ƒn1^Ԟ,4,,$5{D8 OOp(D$IU\ |hM$5ͤqD僤f(L/8Ō M$I4Q4 $oU/iQN4i$8$@WdVlFzhupI a ]R"=ax/p d#$Ip \<T|?!Y!:$E|}eYF+N\#$IR9ZF8Hj3KY$)$ 3:4L$ImJ# {}sHRVX>H#-g˚#~ #$IҦ+.Jj.U૤ "Ib I[AEsLpi8?~L$IR']/HR},>Eʢˁ'sCIfg7'##It{:IIKWF2lp2p'cƅ&$XƐJӁE2j}HRX>HR= W,R2=o}C+_Fg$)ZI L=8 4}KHE1:r$54?sHQ0]:GSG7e/W$I/=}]14ц#oEr$5cۀOgq[ǼEYĈr 3;FcxjIN ͧEʛ=(_bHR($ ݀DhLY9q$i<ٓt=,R^ %potIj4ZOTصs46-(!iQ\4,$)!A.٭s,[EǑ,4t"qpa4t7"IƝQP]bHw% < Kg1S$ƎXMTTHRSFMIT'Zڙ1.4|8z8R!|4V;oIʖYIAQna.v͎TJ^I#O>hm`?C&&Ƒ RS ē- I{ ~ L#^,b^":vhbz{73;GV*GǓ$_'0T8#3_E$G$)F_>^K R*c{;F1hH|hV#HeáBRcUIlEUKRv-&6+^޵z.x&IҠ l8 #Q"Izu}7nh|t+\X=ܒ3utc{7eJR888 *6ԔzzH^OfHR|PR0i]fJHıKE3tap>'E  Mㅓ$] '~#5*Yʩ׵dz{73:FIʳ(.IN:|"I ?U"j_I6)^,f~bʥSZG0i]LjoOIʲM! oZCIg$m%)4@Rl6ʈё$5c`R08G<| 6:$iyA`OீbHY]籕KylRF[>i]J0T6L#i#z/ "I"O>HRLDk{eDӴ.:!'4>va/J9$IuI*H#icb}K(1׵dLiI{Q`4ptހmOE$՗OHRq -g<Ef*Qb6dJw9IO> a{򧗴 ,|{-` migĔk鈎$i]0T4! ཬwsOwG$5c$|m8Ҿ^,f~b`m8IyWv#]^BIS,TpT8 ۷`r&u2u.'6Xؤ7 fBIj^0mlN?kK<ɰ7+Ch"IYq%A$I|MT4p" k'%5}H6j_#$5Z#Q)Une@!fA1*Zp0J:OY$I9d IRH#.&-P M$U,[¾U<_;5Uiؖ6-tWRa1JX HK}=ޗIʖ~"I1$IaA$iS)UiatQV+.0ʈr OPh}*{yo5/fIjEW/X/W2iIRx%IC"IR*Q]nBgBWJ  ݕ{O~zX˒լX^Dz^с%~%-*:$8/$5B,4*#-,Un\*Uh/(mk#ꠟ*+Xj>VTZ*VU$5'H;~D$IRxw#IjNd,ymzDGBkih/JʴTVi+iaQ}*KUTYO?V9ڥªI&XDZ$u`EpIRAe.DTDER{ (UymEƚZJ%ZJWO: u5 ۂIRI:RpIRY>HN? I$iF,=E$GE$IR#] D\G9A$I _ d Iʂ٤o"I$-뢃H$)Kg{G$IrnҩKH)Gnv"I$e}jpI^a Iʪ2p,,$IR<3]/6$I|$e]+> `ZlI$)S+H,$Iy|TBL M"I$ \`EpI^$)oO&8$Ih_ ,"I&|$HH$IH  E$IZ׽}Y$I;IRѕ "I$KIRY>HKH$ cE|$5HgG$IRpMtI$ g$IRqW E$ǀ,$Iʯ%,$|$i8S_[g$IR~,.EL|$i}#> "Iz8,6$Ib Iҫ+G)8$IN߀Y$I$I6lTROI44Z $eHyv#8"I[ e,$$I[f p 1`TpI$b\,$$IC8E$IC]|`QpIrA('TbH$i3\ TcH$ߎqL'cH$-~EB|$qH&IyV$a,$IjH6`,$IETt08$IMAXe0Q8I$i(zWh%IX>HӂH$'H$,$Iʢ2p0i/;8$IT[ }S$)#,$I6OCH$v߁'HWa IR>xB$53O9H3$叧!$IR$I9e IR~yB$Qk< IRY>HT NDL"I%.x&8$I"IgoR Y$I6f1p9ppP#IAj h#I .>c`ylI$5=bH&up iY$IRY>H|fNC%0.8$I*S7g$IAF*" Ƒ$I)*6$I` I|2I-sp!C`ApIA$k7Hl{=Y$IRX>HGd!Ia.P#IA$m2?8G$ cH|$IG*"lG$5" _cH<|$ICTD莍#It8$),$IRtcq$I&Z \C:`ilIT$FNBt236$IZrjI'^#IA$5Z'0t"`LlIBZJR$6$I*2I4\Vn`RlI 礑JWI4L,$IR2'4{q$I*ǁI@hIԔ,$IRV&u$Ic>piMY$I$I4h %4$IA*~<G$im$)GFƑ$)bઁsq$I^$Iʓ i4^x=#I*GInђ$)'Y$Iy68 tƑ$iz28$I[A$E0TDKlI6cqJ?Ƒ$I:ITT;cH"cH^wQJƑ$I?I IEa!Nq$IM!:jRITh$MdpDQ8Z\O*~ <F$iY>H$ hGCˁIeõ@54$IR I3XF&$eQp'eÍD$Ib Iq#,#k(IjV2X6\,#I]8K$m oxTTDU`>DÍeυ&$Io%If/Tl`=4$iK(n~ H$),$Iki42-Zh9ph ,M$IT $IU[`=TH &4$5[Iђ$I c I4 ۇ&bzJ77T#I$5Ix7{M$IF*nВ$I,$Ii{#jDGh"Iʆ^A}@d(I$A$)Z]Hs.nzBI$5y*I_[HYRpBI$iX>H$X`v*$ij'j? |M$I` IT|mt.$FF4Vvp,2$IA$yMbBbW`Dn!0P$I~$IZx`w`7`&؅4Ij^# wwG$IRvX>H$iSvINGOkJj']c@50$I2EI$ h`'/&f\63_0 <J$Ie IFI* f3HĎmsIyR id}\$I* I$ v`2j''ZIa`q`.I$5I$eI+0kMʄӬ],^󁞸h$I I$X`0TH~*i䓔G?ʄg6q?($I,$IT4ʢ lXx (I$Փ$IM @*$&^v}[LL*`iʄYS$I~$Iƍ3XLLdÅŘWGLLAi)"6\*~QLLI$),$I$u:}KJM}4k$I$Ձ75$IR]"c}+TEM5@ Ĩ>b9k5kju-fˁ|mlU<5P5/,z%2gׯw R_$ImLITIENDB`mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Daniel Pope.svg000066400000000000000000000145131341747546300226270ustar00rootroot00000000000000 Daniel Pope Created with Sketch. mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Lady Ada.png000066400000000000000000002774211341747546300221040ustar00rootroot00000000000000PNG  IHDR@bKGD pHYs\F\FCAtIME9:M IDATxwg]}f I $F"E1(`.eYnl*U .Q) % ^gܿ?l&I2唻<1gNsuݟQ4ٷگ:ګ:Pݭڻ:`6N~jjInkim߱g{V-;WW}InTWNkO'jSu6#%Cw1N~dиؕ8}Tc%=wmrꞓ9v${)ںI.||Eush>h6TGTF쨩QɸIqiCCbۆ&Ed, ͡QՑ;N`}\Yp;+ I̊ 4Z8f'9Ќ`ɏe3@iwC#JĂqz%`h>N i=[vښs/VW)kEpPNU'54Nk MBCsuJ|`OlFpG0][tu;4v֣Wch>{Wih0<`quqMgO~t4Ն˝ON[{) jhH5է[`h>̿wFCX.޶!J04ֻN&[[) ||]W&L>0hhD|x\,G`6U=:[w4<|XxennhjehsnېղLwT0eiU G#GMrjCuQF?U56Vp#gWznmHIYV:zx6NUᨦwukCJeX{ahxX̜-W}EYv9z\ ͆`nmmFSB%9wn1JO͡y 4zwu%1 gzAf÷%noKnmF`[h8pnl+bp5B|ݺaJ nqDXVQ=pƾpO۫wTW) 04yu|iգ)Vo>V'دzdC츬a7[h8 `i> 'T* 3 D3J"`lpS9w^C# #nV`h>)<:PIXPV%0:zD$p;TgVU}V9iL OqJk8XIԆfwW') /W[z_YI}GUOopZ.֌lnJ= 7W( Z4pXIа7Uq+IX)54_=[I`&l[zSu{JVOl8RYՁJ3m뎈37V+ ;4]zDVK7Tװ#-J,`g,U6pJ ;"ڬ$| ;^P@Ն_[}+ =`{[=rw꯫>V@ս~Fv'?wurb|ŵO *=KIzoñLohX0xNi{(RzwT?\=X9u𹆻!r||o]O6* 05x]u|sJALkͱL0w4`>Saq̠/V^iurl|ٵT=aór0TTڬ$0{4`U=̱VX}Y9`vh>lXdvC|vd=v9 .f7L1v9!`h>ZpxjAIvۖWVooXUϭ^\=H9V?n8JkGQUwmVX^ ↣<޸zwNi8 X%^ճhSÑL4`T0G+L;G2*|h%H&Xa^=h%H&X{STsmWvo~aF{۪ߨ>s4`V$9,Tzk= ܱgVX}r0WYmR=rX\p1˫n:ꧫÔtMg˪ 4ĆË}tK B,2iT]mPVȸzw?(HE|=ÕU7W {Z+շ*kTQ-+NyT=:f`}bU[yZ]z`|O|`U=)SK˫WV7+BywկV'(3+ wBQur04uT?Rbuo`]Vn{ |`VXzIur0gqr0k45U?;ajCT)BYOկWG( k`i>0~OQbW7+JiT=/ 귪?6+Fi|6}Ogްjr0-4&O~zR.9 X9XoLӪ\=J)`kqLoQ ֓oVS XQc>`=h>tUꗪ*kItkfp/W*k ?{VZK9ruvyύvonV5Ǝ~!"bS׫*Ʉմ_wIdU44 nn|nlM>wuCa,UwhhP[Tm6LL)O>>:q =o^ZbjP@;ᝥWu¶_9q|+9yĶߣaw޽䂆^t69'T&M% m?痤0khZY=L`h>RZzR3䖆Wϯh8a G5+0+pd'=:a P`lj8꼆 jRmhBYpXX:_9]_hxg~!SXfš ͈㫓M>> pK?5KD]WCo4w ڮMms~W`mۘ>Xe_~zyur4W/mx`%]_}L.VV_nPء4xcG9+܆F)4IJ졫 tNCaYy`խ7m=#C~Rpg43VgT?QmT`\ g$gJl8C`,W~B9Kvdz^ߪÕ74ΩΪ>\]40S:eM~wתߟ |`{m8bJlچF&Yr'̫uۆC+ 6v`+:.鶻ʽ nې8kK439?TPpT|d9uxön~{#b{z{}ƦuG9Xy[wH<:j?eqQk3bzhQJsnhHu`cun=鑓9ɒ\׆>E`^VB }K_mh4dцKշTV=!&?[?~%G;, ŰTXC倹꟪Wp!c Y_>awiգcƕ/54"`'v̷TnB`m=Bջ&?wGul;Zf_&l뀆mͿPmP9[uk9V=!3gzu504s߭T ixOJWt`pFeqQ`h>̗Y=Y)`&װ];`Ќx$i'v~0L^UgT*LKv5z[u{VЈJS귫RݬM`=JSچn8KIݺ+aJS'w(|]GVzRԸagû'XeL 2=[/GY`*UP]G`,Uϫ~r]yo^]$3kӫgV* VߦnTpX;?74"po^JcՏWV ٠0~uy Dx,C.~jp%5zy 04ߣ?iꃹ[-5H}BΈGL>UR 0[þ_Úaw['?uD㙞\$ի_V,Jʆw̽:%`[=J''s9tgn++ά^ݢ$ G2^=9 qRLqz=V 7Y}a>'sS=P9`]Yꏔ`i>oؖs oR U^j}+`}x =ܰ՛,6!p4FkTʮWuaB>Nh 8=ukwtCŽX~R-ߪPm[r0p4 oVm7V=YmRv\IuRnbW|Z9Xsm/u~R>շTt_}vE w8ٰeyP'78]oT[`h>?Ӿ^]Cmp8aWJ;_F`Dù+ܥ77\4`Wm԰⻪}/V[zR]:zm+n3WJrL@V 9L)]TE춹_} U)|X74[)`nҰ=fāJ;ǫ+`h>칧Tn8n r{VI`*W=zQeц;M&eEp44:O9`]}y')ƙ M+`i>'4WR@UTpxw5V94 #5?TG)XMU/m8~,"}zIý'|8 is lj:g{Xَ7Wojry5ЈxV>W=RR7]?bCӷX8vC TQ-p/pǎzRl0"1;UwW йի?.W`N~:Y9X@_~zR3 ۉe. UO\m12߫n/+ ϪW+~ fS=RT;8\e w29,Pn̯QeYlY=ݢX#U6ɂE`=zMuo`]]y՗XGU/~*/2.~zR,O?Jtq$,eԯ6ÉՇM>ZoUo8ƛd/ <|{AuɯinA'U8Ϙ< uovW^\Q:Pf ǣ^a'sT~'Lres^}/٧agdsv `=V,,7[^}P,T1f>9fI+;'oEtZɼP%6fñygOnn8dC.~EuI>ZghL諭n*s.>ʰءUW;kS k鳱:b*3N5vAK^5Y?j^5tw&2㹼p7C`XRf<%&2ùz+ &ąl9I35`٤Tf4_,3V s=eFp`m^hkh:c(3{{"OS=rtƆ&gMesAp`u٤Sf,,rmKӫUerd] ٧cM|zf$L{]eʆ;MGU2 F`6,UW7# _bJ|NٴbmeFrQC`׸Af%W/5lޓ7B,dd=]pJVQd̥W 5~-Af!V/1d ,\X<5dn2zEu &̍esy`~RagЄ\Y4d\:P`mxsgҸXH2`ua N29+@ @œ]=`7|Wu9La.n9MRW QR{ͳerS|CGꌆsMdZr]e.ڜ[(˓ϒ! ̋}יeS2<XE^1˴juGU6);o44XC^o..S[chꛪ/ɔշGT77)E)%0k]]o2'S 6;mT=_u{iXaիutK )F%a]=)>>՟#yKu! 8z9LAא%a&TO6Aka^/T4i y&izq_06V/0Ǘu G`=L)[n(0G^p'yGf(gMe!s?:eSS!Fo:CXOηu+%XmUo4uȍ| ٿ&kY0Va+T0Fuȇ{J;ɖq.n8b 7Ij k/T'~JypuIaT6ݭ<:Md sV0CvC5̵S =`w`uIQ^\m0`-5YUk Yl^d%&Ry}ua{^ke Y԰vƆMd.+Vcs9d^pGΤI 7TgTvjj~5AQl;_&Y w[9RƉ ߘ(j檆FQÅ_6U 94OYM`}ݻ[kY|:pz"Y\*`^]f"4`̉ իMrdi2y<0ouF k̾}7*7b0B0yQTo7憳:M`հ bpޓ;`&Z}dFV8_exyx9k"Y|lr@ ~ X# h qչ&/zL<`ίN2`z\]d"+WZvְ;ںIV*V1`V]i"+˪gV]xvu5P^jXxtuIPqMRBzaI &'z!޹n}%+рC wV7 1m%+2`=s 6!=ɍOW#C X!窛=o@<ÐszuIa>S=pV'd~ VVL>d XeU V {~s %`=5g 2`HdC פֿ6urLfY~Pip{j U'>9|Ld7jS&ٽb\[},UY .:,i(ؤ@v6OY.dICEم:~6vcxύ sP/Vvo &|&6Z}Qv27lgNAv>o1lv֎7 װ`=^v"T?cܥQyz IMz!K]]jM);2̃'6\/wU5dvՇ-k@<Ő`=C]v"Qo}?Ɣ c fii<Ν7ӆ !wkS f7V_^!;.̂K<%;7@ ڒž՟X]+1 r'TPX/jwT(ScҒ٣ry:P`SY$Miq,kUcz ՙr'y}w6Vf;ɛ aTX K%C`j/߬ceG yyL7 ֲry!Z_/~!0SKk=tɆ=G"j`5}_WvU"3sel`5՛>/1fwW[<:2B?v_li(̖Vy-t~?0FZ/tnP GV_Z0`Z~sQua0Cka\a 90NLͦ3 O^`fsskͯ4!xz!yZu5)տz-d`]]뵀̇&Ch!s]X_,Ӫk&s_k'=|2WCӷT_BG}S=x.WVvJU,\n˟Y3Rf̑Gb\pG=b\ڰ"`V,)3di<,˫ǤUoX(ސ V /VKn b啾V֏{,\.K'g#,V/}\0hz/}K'e a pisElr} \@s4li<,'sՓ)¸Wuf.-.^\бvC^gX/{cV?Q2,k'VV ‰_瀥6[LJ6n4>hy4>h4^:F'ӺG^h|h4Mrc\W7jyxU5f<_ax|͸k66_5}7]{̅_ƏoK݆GG.7:xnCFˣGux5:M~ZnV>j4h|ejՅƗ]0.GF/tэ7xq_:y?f/_~Qh|hqGmq:ڸu.%ˍ/0Mmw;YM3[.eǎ6NR'F0udf+Qkһ.{D XUW caQ\_}gJ̻ `{mz:j|щ;d6M:wT_7¸66|Qiw:>{~R[y<Ҩon܃4fruA}qԹK>w?w7]vyKur'Pqw5Ǔ=fBa †]/_U dw7VOޣ7^</_-=:pc+ބX.~ϸ[xqOFv|EKN-ӨWb쾼y43էǣ>56,}~je_8 |KKh<~8To_zG[qy|n oQ ׫_QpK)0ƏyK|s^Ҩwn M>GF?aˆq6}akQV`N|_>1nGˣ/m/]馯ս}a9vxK7>~lŰaܸF7l8zj5s`=?NNvݯT L -w,ȢtR}O;/ʸKUȋ~Κ|~QUtws1_ߓ `{Q'TzpnKvݵMxPpŔ[>8jt Ko?ڣK>h-G~ȏ.;by'5\t8Qg.k8/*Y_W{)ܻ0YW g?J)ޖy_)0Oƍ7\zsx4n]ȭ3ۄX?qum .9S۰xԆ{`zmԿGa҆#5ɺ܎Jz|`eXEVQ `\x^2wm 9޴Ѩ'50_̠5* k?낋T dXOOkw'/w>Z&&qy4^zݽGy"駪S7n8n׬ +5˱ <])ޯUg(0O.:/5vx^5!ֹ9 ;Rh;NlKo$F.EDKҥ+4 U) Ez.54 !ҳ2s~Lٙ;3ws>x|͝s571 s!_>PaHjwˊ"D$.,ޥpJEEDޒ֦f* !^$3j(L*tA I^""Lju1RQXU i0 2d2?|WQD#CC :Ю(D$.O2EUQ &ʿ_L[*Btg)po!3<2Hj}ES1HTt&&Q U`/`8X]x=Us"u4QK3:.#qU ""R(X[l($CUE i sQzkEko;ā&yoX{xC'![G!DH[xܻMuOg)T_ 2K|( )7yITnbm0_QHX7,{yJ*BThn烨!RXnl  l(bO AMg\#C"SxHQHX3f5ƚ ˱EOJ]uTBX-[4T""h`ÁδE;T p:P"`[DVE "Zd#m>cCDDWu pbrYdIEK\( 9<2ysT|Yk̕Mm4JDDDM2s$E,=S$t͊"~D$.>1pFe@nBllQBR`ҿ:m!"".$DB¤()6u7pk({3ս=y"\78.*Bcoӆ8DD8M1IgOSCl;831$+r\ED/ر5>8DDZ]EgMM"^vV* 9ci{#`Geѭ"`OiZ=G(XZl($ :[48i+"0w'Y@© &ĶzMATz]T r1^8hX4xHQ[d -BB8v +XKY;͋0Q@[EOJ]uTBX%|qfBD*E,]T:;0L)U")Np!*&~JtдAKHx(bBgFRak"vځn);a`B] W"uTB(DDDI ,$sG HJvWcc( ݜQwcD!<*B򾔩=qAHU9bG}b$'Wƒܑ=c3Kls]tׄЖu_]'u)-k3=c81&m[s?bUu7?W 'C E*)3@AñAD|`CmZ 5z#!|טr}WGBTpMHlv) ѯv%\6EC-!. :% -NkR DDbo 0XQJ̨'3)D? `v`oR"*5|-&!-7+r!t/q^"7g6(DDbgFܪгaE] R [v"Dѯ1E!*&~x7^(DDbg[)%,E!:[B}ElX2hll`v;2Z(Ӆhb[QFEDދxy2rwk{1>Hi!:xG\wYr pb f羔Hp>_ *Bۯ}v8r!tx/qai) X9pbkD NfB *8dވg7K,ZEEpϞav,G!K_6MrH,2|[QJ`+`H>I"6^hQ"y#ݬs1Dj!L^6a!/wa,_"uj=j) X< l(bY`g (Dg#9%!6>!3&71l9L;aI5!\_aTnU#k7KEg*Yd"P(bxJQH%ts  t"D8mG*Bxn>䯊BD$v| kTYW <'(9ceS ^G IDATS[H\UX!^E[ƑC~l4JCD{g+x ؞̏bڏv6+Q "R 7?5ď4;ph![GoQK O'S! (DDw#=?~Dg!dE ;+D*|!ڄӖE.r"N ڏ1MӚW""^k 3"ZwEIKO_U){T"Y3,aR`89p!:")GkKEQEVY˱3oU""^ V9=^:ÐѼqAf'Da޸g;~4:s)-:Eh[^th&Ee1\4mE"" xU}z̢(X8 Z1Hmt=C`<˽*B``*Bd_Z"'PTnUZp>"DtmG*B8Zkx*X0Y1T)T~`ޝADbh0;\pQTX!^E.ڣf4ݦ(DDc\9XQxo./-Vq#=id&\Z(D$ si1@EpѭE%Rq`No>jE!">KF{NP Agc7Q[(D$ G>v\G" -weo"&U_"eNo;DDGBTpMHRӆܩ(DD x~C5[ۊBDJ1{#39QADJ0gc 'u|NspWF#!q](ώgl9>׎(6)R>{ l$DDr'pbچ!^Sx@fE᭗BD1{ÍI4v"P  L1Om U*"R÷;N]d"'_wmGѩY.l*B *,&3fJQxt`k7[))֜= b/Um"IpCn"DgG|!zqŊ!XZ"BKI!YJADKϒ[) \_{Mo߾oR "H'gm|Iq+Bd{UP"%cև="DtXwH1) 6ZЬ$DDt1bv(=glE!"Śt4}Ü քVQVx_ȅeJoe{.7+PMg9.}:u4tFkh TQG#K}iz "%I,Sx0ŜkDQb::)u)?Ķr*i$󄬷ZWpBDzшhxgnT :DĻC(@LmL "%ɓE1Ay)"D8^G[߷Q_\pluVE cdstJj{I1x4]$p .w bR+pRQH)f UPklEOnBWV[1AY.DWQb[FA8}]pudRۤZ=3 "@N7_T|K/R୳` s."`[KEBU|%chE0# 賊!"#U2#q*o[`?GSbҾ̒F(ayט02m0ẘ2XG{-6h\߾#^O2sGJCD$V^ sW1;v)EUc wj{1<.]EcŎLm"s٫!\Ӯ8DDbi8&`CEEߢƒNF 5.dggyMeWz)_&Ķ܆8֯ڲ3ŷ<&ۿaoex|=پ|;?B%qcajL[:`dDDbo6p&pN2"ncK* woGbt_ plh˄߯F#![GSJYn\W! QLĉ4$t$,vUn03";Er6ͭ$[IK2VgL濎LX1H,|]1xit%dn#~Y}(D$ 7=k̍+[0]@ -<"DtmGUw)6w夵֒ؠ-S,Nbpݖ)2o'ѿӐ.WځYX6$` o5xm00DQx5`[@?p8N8T*ob{v/`UayRBѭcEG&IAdS5C[I6J"Cbw@ Lf`L17VDw+/\ܥ#f ) b>yD0^3aeWqRp[>!L8mxMQuT"ϞLqašbV!i 1m}˻$oJf&LZADI+|l|(=TNLO1--R"K=?_;WlyV!L%"G۷:Z-ѧ*S`ݒߍ(c6 WW;\V4""x(spbpܵ){( X`"0~XɿV"~EҖQ*BD~G1z*B&iIifT+5#ZJ[INpˁ7u} /_7nۮhDD"0^dG}Y/W) Ӝ#Ӧr_ {b~"DamJT;"Dطz脱Gڱ-ԌkvJjƶP3S$xx ˋ$/2v^D|_1xq`w౤"p!;[+iN56qUr&5aeW2P^"Dtw[2iJj'P;a5#Z!B#1E,/b̘ؗ})P"s';(ǎ^stJxFQHf{u}g+'V"'Dϣq}s@q+BԎm!1Pw9]5 T$""%24T^l) ;1?~s pb}wv Pl"DE\-Sz[*B\1(B$zwPa u.vJjDvd`cxw ZHbΩ5*>?0 (:=H~aƚ[ ߕB R±~9[(aM9*㺨:UvJ6YA&+h&V1a>H$oe2´bV=2Z(ܠ[.R ^v^Q"RupEJ_@b\EE2! T|I}+˜nƾiWS")B8*BD~G1zyRr]JH6j'{iqtyCD@_-`^d~-Ce% \Qxe"br5Ӎ1Wdeb"*QX["DſC|)B$vP2꿼bI"DwWEX~M˄і __>!L8mI_0u]sEn*Te,cvP "@d/>.GA`oP "x<خZEr"DDmUiTbu{1G:9i1=D?rqmØ;i}N˔8B+h(oL%3am=>w%^3!UkTp2{ "c*BT;$"Dݦ-:h ;-+"N\̐C+qP=:Ǝs!".{oHdf uI'˿nTp_-B:2I!:KԌlG߱83a>"=7#sOL^[PAD*N˒}B|MVʷ\0+KIT"&‹Vew pbIAD6u=V.^ 4bme<}TE|ﮊ.$tEӐ֎F$]@mf>O( qU)Q-^&SOD$rso) OMh_*B8/g%)g^IM%:xV?d 0<_7&-P "RA 2o(5_!MTxE 8DbvgҎK:گ|3~e{ѹ"rQ>h[ }yqsB(h /#M#?cȭ[ RM2uȝHvűTR8]_CwRI-2P "R)o` D<„ՖqgFnyL#!k+ۣ%>Ksg$<_Dk9L =[{6:ET|(c?+/#S$Z(DR>n- Eǥ IDATQuaR֥m±yB]u>۲Qcɟ eeNm4\Ġƒ՗<0bF>0(JfbTҬ曏5\e­_{Mmr뢑ѵe<}TH#!L%;~ "E2|FMb/3jWDdР(7(hCNA_ DiEb fO~o헛#!"jcޑڲ HCCy <D4t_@aHDQ ^hNP ȇpCfdz! W-gʹFBD&~02Qr. QX[-=XA3bv".c_]w=Dz|zp`LQC#CTxř "Xa5ZslwaGH2+H;Q(1(#!{D[@ "e:3_bd<ރ[* )Ɋ!<L`Egs,"9Co"AtK3 7+r2a$,߶g}Jbn$"HaǛq{ߨ(D̞"s=J) +iCxNE?,3r "NHێ*8 Q%*:v3! b[9p|aFB6ĶJ|KE d "$6}BD 2ץmC8T|G_ "H_/Ųb-_U\"=EW*BDoT>9AWϣBB8N{;HDU@p:D*>D4׃(qlG%eeYǂC WE9fn$".@׻v}* )kG)ҨPZG ?:KsxE *BTaC,BDa+Bd"XL4_[^oڙm0D$ddS#sWCi R λ xX1kg{1oQkl+EOc*BY"DE`mLWED.]H6H%3&o0D$dF)RvR$0AQ8m`vӆ6m [6E/73aUkʷD/ƺ2Sz[h {Mb@.v&XF-;ѓ^U"q4;E#w*<ר "H7ay~7ӶR#!JlS<~>ۯ#!h$!KHm<cOu=Zb@A/PADdL9;h:pbpxPQ Λ \DU6lw2G"D^(EW'G•iSjb"z:/7*  /9y?EыЊsbpOAD\eERGۯ*ATn;9 w7QQE`_YG}Fxx0"h}yrO!"!Y~MCT|(pU {bY@E"*~ֱK g_"cꮭnVZu\p }/"q"05ۜ w>?`*> `s35qv~E0U"ʷ|? c;*u~'/aU8T " H18o+`_P PxF1\@gmIpa .B亠OE gmۣ"DV{^Dlg;~M+"ay _18B4 *>f_`[pbXmQIp}B\m.BӯPĥD!O|wm9aE$9N}!"!С bNҜw=b/WSoץ*BVEVEs#!vIEH e$ q$%/ŀ `jtKwG*  ;_~S!Ӗ)=UHf QJEa/X{GRQH~P N Q1Cpg)]S " k[ٯz[x+r; b"D>ۯE[px]![hءڍWؗ_ DDO(v{y@!# "Tbq˻MIWtVAEomG9GATVQ!]>bEDg<hRyCn*>V we "2+>%\@|!Bo Z.}&Ŀ}J=Zm "N6ADJ"pbpŐ} Dk.rJ?QJ?EoyR߯ٞ-}߾(B:PLd1P BDBp.] S!3T "4 nEBK-F[E!*V "N8/ fsmyE c"D8QDAmug!Bm+wH5AD$ӓiF9HT N=d}Tm974H. ^aKEr+"w!fdJ_""As}!"%L18KwBŇt.XD$;dیĒ*EҼEEime-BP}"cQ_G=ݳ}{3b`juzA_ =W) )w/jӀ)gժ0(4T"' u&Ķ-*5>0˄іP^T` V&)6n5,fշ;yݙ|0{>.bXkj3L0b`ƍm6v[lH=zEUۻ1#"% L( '-9]Gƒ.AMi Q ]kVV5uVA#!*? ?+9ptJQz=yQ"ag<Z޴* ٍ v!،ؖq_W[uDziEhdd,=%|C ]*(˧f ̼jBGnP "G\ׯ>)dajM!nEg?<H`䛭>ڌ/dKRLrāSc&%כW"R$&➫ӫ9j?uZ}&:pb: u5 K=큝=a'kIXmM G;mFoԆP%fADBppbpR2WAt~N'iԃTYxص!™hկ2~{D?K*>s1^t+"s J$$w-N:b?~v [EL 2=WW'yg] "R];9 ]?XN7ˋiVZ3r9~NOexڧFӯ.y?l]Z}/nIdUmvƥZC$ -<,nOGw v3}{H[{W9TfΞ @sBXNWsa_2M{Y}@."R5ҩ[t-E KE mG9.GدE:\!RVqɿO}I/p'.HΜ5[5qmOsm7n`y}_qʲBx_18iw|5NնKШ2#:Of9)pȶ a)Bt3!!Q! lI܎l8miYƁ'^OӁL?p+'_g^iz_st 𕷦j)N}P!"!H.Z|ITkED5U}Q !"W*BD-a]-keK+=JwO}h2?nwMo=pYOzY7jkjr>̈&m$HpBT Nب:wst{ԇ.!3,YDꘚ܃8vu[w/SVI+]\mREJ/!T%Vwim#*3aO._r?mI?)QN{X{ݺgwͤԡ!m+"8Ep^_u_H5tR9YTtK=0}~-'Z`bp մT|L+:jπ:/T… yZwe; |*V=v%XQh63 D$D?S ΙRq_j)>Lv%d BKH#ƫl"DEEDΗU2)c"P~Ԏ3FR--mB-Xl*ڌ*B.uP'kT)S?/+?.S]YkaC7`J\js >( 7mNDDeNK k~l-_s|Skr./5EeW/7 ]knk]r:ĶdǮ z쒤nD(7M6XV-OYŮ*vrSJ[E}Kێ}hJjn ֶB_>C;'c q<  9 eӻ+ g3s 0a8 {pK+0(DDr5䪟a(_Dn-- bnm;%uP}ڕˊ{Ҵ$| Qu?iye=L&"@H G9QQA\Y]W%u D kDH8tE + &ǜ]3GUwuS~[ϧyyֻҧ~jMS\U_Vy~T#f@v@x@)/i%ٮ IDATWӼ04M"x_3zy_vp0ڊj2ÞwRWo؄x>2uR4Fb_g/Ej=h⏲UF (z埘ڍM4~u|G[Ͽ\R%D;ԭ9KoMUI Ω~CVTgXIJb"-(IמheΕNW+!P{Sx[ZNS);ɽ߹t?f97+!Cs4e52BԎ~qc֟J:XKT6?(k~H%5c  dJZڙ7)R?t|8C.CK2>4ŃMmE5'Cuvc sB1EttF Vc.mT^\tQr?mn Q-v_үyztКM1)<f9%{)9]ҏ)=%nIR 9OR;CÇp ;JJt[޴mw}!UdU !W;4?-R?ef _W[ce*ik"땕ZL S^_xF=7-x1K,4J5tMFS _^G Tɕ"|pQ'N6L4$E哾BdUʓV-z|D\`ɌhtH"+mM/vfߛ0*~l0ѴN #j]=PQ\ r[vpql|.WBqpXVШlG&o2?hs6E JǺFxiSչef3jozΆM[$I[yk6oRmڴyVY+h5z5 mFj]iђyV8˒"uG_{wb|kИ˚R{l]eV a3$i[M=ΗpNj8贷Z{z}*ןˍ.J=Y[2Wɘk@5@tpK*8NxuεRoϷVswaB[;Ơh*:1\w>Ozz?2L^SR;sBXMj;ߨd+UpԨfcdms4o/S$0 Zq^~H4Dz)m&(o2&~M25~v +\0C#5*i|j2Ai Zi6lڢ 6kCmܪ\nEm-֬Qjki֤c4uD?qXrmEүSѱK(y%1cM Hϙ )*O3JI&Iec6`W&ㄜΌn ;bV;M9E*naN2+c5nNkMrJF=Ym_ w擌ZNS׃e%*5.5QFuS#kowoJIZ&|ISK$KF^S^\ !-(w,Ǧ36HSVJC-t&)SItr s-7qWo\ 2٨:[a}Q-RF ez !4ÛS.Ѕ +ITvcd3u6}NG!DErIsIK+Iߐ\pZFxmUr!|k,ifZDpA0s-%/OYVpd$;B‘bm&e~﬚m js/jSE_T.Uio9BW|}:kǞAGP0 QVP ~ _$Xt?$P^c32wH7ɔKPA#;^2n567/Ptug_Ӌ_K^Vo_x_ho=Ru;3nJK1pO2l(=~=a)zI"xp5"x2xݒZ|#)W|%D4y%D q_ U(ި\ ,zNg]Z*:Awfw=p1Fv'$L5ǛFDzIs)3I:S-I݀ ~NԺ']9zʨUaoy!DÑR)B88L!Dż*yV_ժǼ@}3ߢRsԘ썄0zN>P@7pb1I)N@mGYLKQmA',Ñ71p|^X21:zz)]}ٹCQ6I? J34*+JDŽiYP^AIoұ(pWEBSzyNvLJzZn \aަLubCt1;OzvQފdz79q]k%]*)K)P'}ԕOp96I(<''Ͱv !1a-B@U7Nَ ob?]$7|l}]o/~ }uч}1D1ߵY<҇<)$vIgQ g\(‡HNawNu?_7!B"ƫP"!bRֻRwO:ƶkI$Ms1}^d/$ǖk9+aն"u"|p$*驤xRic)K%2u^F'T#:"rϱ*2D9j@T4o7H \ /З>~A\[%/F@LXҾ)C7xswWjB}^6sХq!7}>JDZ[$ j?4AEHBD^[bQb !/7VL6 e!0TH|@ZI NI\x&n3|u&Կ_ҔKCBTֈljU!D~T !>+Z$% \‡4s1Z*~6ĶT4ry!D֫sj0Ȍ1. ϧ"EO I:.I+cN'&P^ߧK:d*uDׯr[e1ocB!~HmB&FtF$(JG_$ FL&Ǖnyl‡S$up|97bi5nدitD !W֐"_v[%0CaCS|DzGČ2^ےI r yuԴs!y: q[Tr%B R1\ڴQ-z))Cwr\9yIR{&n+ !l@a>H 9…Cee1 &Ivqj#!O췭RK#Ŗ'VWQa.O2\_AÇN8rOD\OPf~fLPz/C !^o W>H!c!…2:JTG tږ3%sy]ΑO托x\`-~^Jfk(֫Cd_?X[=OtFEwRǍ]sO$|~Ipy> Hz2$uÿB(s*l"mWKL: _ۼ)ԠC9K%ep.c2O8'v8$Uym !W֐"_VnV+W?H(9"a,OS4Џ$Ç3%1J2o !B"O~[__!nJs\5Kom)fAwϲ$C%d)J6&9-I9n) 0;~&1`gVc}#!sX Y(p*!D4D m/928&1$'N>d%~ k#:p_Ŷ!FkC !Wn} a%HQg-] 4 Iz2'~nku*tD! B(Wu~Bc) ~$ N$V!1+\+igBrq_BTiJ=!'uxwbժ(+H2RCw8ׯbKnt3e/vD'15S Ujy!DX2(oݳM=zxHQpa=uy/<<*q$<ݮk$M8qo%m 0({6B0g[n yƫ6[RL\{/DRHn N&0>+#)%/LbNuY2C: +lkHeCPCe-5on1=$s!a%wd(X# I&_-!D!WH/v+mQu..ߨŽ(e1_,C_@)i5epS>>+ ',2ڔ9-M,P C\TQ1^uWd M>k_we]8IJn N8L>Kû96q%}}}gJ5WhBT*J^ mB(xZ!v._4\Ք!:d\Ij@j8Ù \ q 0ȳ~mVtUl"ԒP!ĶM1:BDdϮK%s(T{Pҫ >Lt$Džn C.>ti!|?"sX Y(p;B`muްQ[nej)ysZ)Due ɘ/P H'_S'#i +Jp z{{lk>ߠ!BQ!DDUj9!Dthmb֩m k(C؅ ӍjPWtCF#~Hߊ ',8ezoEҔ B-BT#:"!DhK7Z3{W$;z[?^?ܪYMs7@{rM7ﯣV{;eQ;7IOS'Nvyٽ|!DD{2E@V%Cާ{+ĽmԺ+6ےXmmZqZmvr!rv2Tp^]~s 5fJ'pMFvjYeMQ-_!WH/v(ԶJ}n~zMbKV^N[nٖ8V[nަFTn-!Pf%eޜU_ڣ<~솃%Ms1G%- 0+WYB+ !9:jB8!U>6tluR}n^^%eonVn !~v9!_M欖TIs N8=;|`%70 eǰJVQAG *y*JhjիʭG1iѥwvbwB eҶ{s˔CqrKv">t>yË1ͨySwKeTޖzj˄ؖ"l8^ŖJaɌɨ~j6(;NEʴdix~nꂵZ[\@JIԘի쒻N?.8C=s2X x1kƴU-P5Vu&$p=ʷζ<=ZuZ_ԷH ce֭֒ݶ]ෲC22膚 ƊF\g(gd7Z!D сB5$ײV !l(!DZ3,!?$,uխK_aͩcW([LYl@@?$fI~8‡S]@L~C WeMQ-_!y:ݪ BwUB؁+!Vx||z!ごɠf|QKGKzo777 fak%ճ!=%]~8‡SN'(3f㰯㊽#:Pye!DhCl5&~ !b hᯭZ!ӄ@ tHMv+ w\+!Tc*}GFN@tCq'c 3c !*FWATUh+BGE烨1"zjE!?!ijvuZ:j]j̽vo.zIJɎaaI+(C"!9vF $ _˵}Pa_w<*eM}rb6Z3֫ {-;n]>c8+~TuV^^^-4i'eZ b dq]j,x^VHf3z\)ѲJ-i"IY"V3$MbT/up \˼bv|c3s:. iJ;^UC?ׯR[%Cjcrzk:kk}O_ #xsw2wgTi^Zzy}tPn &QH:}u&KP c.͚4e|ܖ-Ƕ8CZRM7 qu4զpRk%}D&s:`<{.&y͒}$H";J!@URX(^,!+iqXXҿR(j;>-،56Us!F.[omOR*5OFfJ2eU&-yui2&;VNL(Ye)bi3I ZG2bÑe,I Pڋ6Vv~jBDN>2QWHB$1ۍ>E) x͔d/ϧ!~$Kcl?[[a ZCl~ Ib#C;I !=:hBVb}㨢BGe^ب$6IPإ.|h&knCؿ "B 1._B6B8pJ"riW:-yCd"1*|8NR35V|=qz!/3pux ]JQ*;r9!D*ʤͿآ_$o$|E41 jtT/U6i2^ȥ]B۪(iQ,pb۽]ZM|w@b7H j|J۫$"AC;C !(:BB8Z!DDdXm8t[k?Av~E2CI?yS@2' MrQa[vȶ1p_Fwi+!DG pyWk.[/o @ 觌ђګ"Q'Jʲ?cFBYkJ㾼 B(sB r2p@~8_!Z>p#QXi`骊"|`ȥ#VW%ۊ#hᯭAHU ZB^ŖWBt|G:GKt!DϢ>~pZN]!vU﷏"|8;.e2O1Jɶ7xQ%B/_ADBļ9p[ݏh×7U߾c?ƪ_ݔʳφmѓ@$d+!bBȝHcRR$v6mfNp \,ij@Çه{HF揻P!DXmEANz^JHQ^b[u6pzIRX \5>0@̳T5= n!DGGmTBӡ_YARQ<ǍT} vof$<|@e}%U&B !*Ƽw'*B趱­mպm $-aX-wٳ]}rb"@[ B$dPB0#mڱYc srM'$Fbu jW=ďbtt WBVE!DLXdRj[c2Bt_yڈC:Z>=@X9Ji!V!BXgBBGk# WoTnM9\Ce֏O^= =7}Hbl6!Dm"!DFwi+!DhXm{$RX%.|-P[$i ep̽bl" j !dXyaEQmSztJz2Zp‡c%eo@×8p#hᯭA\4.W1 !6~gq>Sj4\!Gahf b-O> !(B/_ADBļ!k|N3~U'|H k{H8; !DtXqU(Bs%11)?,4 zj`%'1C#_³斁 r8YG4!DtǑ"Zvv4{_=  e%5h5‡$5b8iP-LjoY!DGGm]!DHm/vˉ㻢BUٖ-l|П L<j ?I*eFv{!Bm+Pyy!Dۘ\B6BT'z[9Np _!}^2@XO+m !\/BC1U^G1E烈ƮVYu:\IRX9>d%~=˘y:=wr'ClUUQ6Zn1 .8>̔4+G*a߭ vzT!D 5PۢL_he'zdYNp'0 ;|`ȥxY@$2~xGgS;\¶mc‘hDxBD;Gz `DڿO.OIZI2; n[\n|۲QwD!;ldmB\ŽW%=Gbt|$ oB"m!.Bk|U_I !| ]qD}K9%RX) JDh'ko"mBk_E!n\-UZN3^{IVcaGob/O"dQn᳭Cn"m8*@!Cw9{%(CB'|H%uRNcC$BbuRKuDBDw !0C uB,jQB !(:8r !=A?3Pko,b!8p#hᯭAHUNbk(&CaǺ=8E+%- @Q0\) 8X2R!Dmc"X[MJ]ɶ(B/Bhqp0Eg*z7! ^&sȥACBmzڲ  ! uGXJ@!Cw&Npߟ7! ֯}LgIpGB<[B(m߫^GÇ b󊤗)W9Y{_W !=:h"(;Jӱ-ಥ^ GJ4|8})d2>}PNI[B !*Ƽw'*BзusH:*\\Cr^]g}V˷b~Unk{aX )іϔɉMU9 ;zU֐ae%ˋݪvj878]oHꔴNҳƘ=ϻOR!5OΥ 9J҂rl*|Nc`IOSpNjc>+tyLo3"ĶUj-8̈́ޏ&1Nktg}#KP-)5S(ClK:'W:?6k%=C1Fw~,CIp19:|TɡI!ns b: wުz휯 vd2es5\%m)I)Cl*$|]N8ȷR@L2V}('!W$I!*lUF!u8B(}吝BÛU76xcWvB9~Pc#_OcJV_RХv Bq!^ڲJ}B[6c2*!W9\)u̝;lJ ez]OţƷF/QtҦ?(Vm,BkkPL^PLe׫~z55W17sνRHA5'fxQT̓8e7YCmB("X[C*?B/Bp\峾"3)k[k"Av1yCģE<L/X jK:2^eG~ҚǦpSm׫mI2q~m2qlqil$(xl%e9O@bXm=]]s5.~RҨOvk&yӬYQH))Cl?'QR#p^_}:_W"`[Epx1w]+! ]UVE1DȭBmA)}lͬYTqƘVnꫛ?4>I*krÇml_$kd1 N|!BiPL1W !=:&Ʃ!j8Q3_/~1R3ߩ?4>Ir04o6@ѝX`,<./pBH B_^^Q6;WJa1Pـg͚5ƘO뮻JHG(A*e$v."(ޖ B-*B^bB*i+";oޮCqs IDATl֬YWIIOkd2OP% HReMYyW>$(mMowZ!D:6 EeN=Ha[y[;C1pHc Cʴg5zxNP/.}ƘΙ3*H^I ʇ:9B%FxwVځX :D^QzE]vU۲QwW<)uLǑ їLPf,}MP >o?4iҤ_4>I}R9wlxv*sC"m!.BkPLRU$brxxZjHkk$m= H8E"iߠO*'|`%dջ|S_1}NCmBD_yATxLB(4f43dj\Z{w1GS! GhL65QH93(&-c3-_!Bܖڲ  ! uGXJ@!DNT5 ܵ?pKT`nD"p.BYPqj*CGA^*J^?!;*z?FMG]c8@Z\`dJ ᬤ(Cl"!>0 uwIvTrB B֫T[eqbTcC:[d6iΜ9uT@?&|Sg\lZ+=sI%'ֈ///pBH B_^^Q6;WBd}~7eӯBv(L4)QX-H F.r5(ޖ B-*B^bBb-tTg\@ᕶ̙3@1R4|8f(cT34†B$ax! 1LWB(U!DpP?In^4R`(ClolF u;PׯrQrk9B[ !sW$#ȴg{1@֞T஧4>Aԗ7 _þjew] .Nw~OnQa[>wU(U(^}v&sh޼ycaQ!)A?i|Ag۟f%2tA;Q<B[>妒& og}|Jm^ڲMeoeDhڱ]LPdJ>vD/Y{_x>'O({yuٛˌ1WJ6:]Y2^'аKAC 3$- L+'};VFM?~Mr*MmRU9Ld۸}&A5j:U9]r:+=S~՜d9ly$Ӽy󎱶`xYjLxC͝; ƘGg k#g~#{@J'9$ .1C|:%@ &V7OcP*k$l2ocr` 0DvNJpH z{ ~:u|i*Cee)\fw?o޼+z17@?O&6{@,2wN$|`,*ƚ ]Ip/BlW%C }NBB֫K2^ʌ&yH=,'R 2E_^qW7ݬy. EԯGtz^þBDemC~D|PqB-7>Gd2F͛7=9sΝJ:Co={)Di||$^-i |^c1LZl_/F[uF[&iލpMBǁ3[5ڽejpzW֚7\ofg4wӍ1l=9IӮ?^ve]~wygK?k&yE]= FX!i!i-u狆Q)$ߋ8P9t&LL-zUa[!kHu5h 1C\$iiupYi޼y^ὒ5ƬvI#iI{|JKSy),iq6zayF}=Qd8h)4S]H*8i;X[;c=[Ǒijצ<`\uHYf]%; ֞",I6)%yw5k 1c`VIsVZu_*L:_y9t 5$2@,}FPc;6_vLmUI[&asX"8ŸUhWƜÎ?\ad,;Hs瞔d־&17c\tE+(s!%YA\')ޯ$u>.J?Ce}xWB$cwmŮ " %+!/ޤqWL%x@AV?}9 d={+W| I?ߏi~ o_/F[\ x֖cc2)^I7짺9Y+vY?ey5t<)0gΜ̤Itvz&+)c햴1手.h-II)C xX󯇮7w@7SXA_=ϰK g)% 2d$'@:^c VPL~m)X]TUpLk$x@9Xc|#w3l5iJC/ yʻI{,U5b\/B !"ƲB|!WvvqH_쒧O.f( P(?>ԑ7 |{vbdՁyB[%'///p 𳼼m}Do2"4~h|';ώUk8۾h}_)D |Y'iZeVHGt<S7EZ -Bh$l"MmoS^[hpP+'D?_},==fc9 /[7fg5h/e?1GM)"ZҤR;1;(ߋd"@[&2aE!|8 ]!$=c]fe6zFczIm7Fn2fknkY37s="(ђ: YW +a~f wTn_˫֎Ѭ\n*ik:^ Ӭ O!.%-*tg9C5bƶ ܪ`}c;6WD9!]B3Bj|q׾qTpN('V .~ߧY>3 JkϮ5o'x15>Ew1Y Ԉ#>r ;IvzV!" lc_['?0-FLS le?sLr>ć7g:;OuZՒ%Ymly&6`\,d&$! C3BI;LLY!xû,YC^$ꥺ:]A}ԩ9}}ݮ5:{'.mgѠy=vBd,Hbr?Q(ܥJN8wU%ԣK/Qj]˙VAؗ!ekvW3 mb1mnvBLr] !Ҧu3^WB/| b7=Ο T/vai<2aC}ooRUp_3ԈTI<br!D@'1d;ՠb`,T#_hGuӥ;t$W"> &Y~E*ЃIv=djO1X ۜy˅]]ZהB=3w5P!yVu;WFBeI2d7g]N=2z=hŶ[[f0h׺ҡuyO-0z@1S !߮?v6FGUU]rю)SbL \*{JУG;3Ј>.BRQx)Cz- !/Y?M3R.^'Ǖr‡rNzhCwG zӹ{U/tݶut8BtI]6Eo橆߮ւ4TUuE;~4K@CܫŬ; ‡SQ8:؈vQA>"myI! -!D=b?;7}+$ .ꯔhC9'gK}лD/BLh]SnOmBu&\DCkf ˼z7ڮ@MM>4mʭS~d[;܈3hv !_ԭqCwݾd_ 䟞 F|#.xG!>%(bC+oKeܯPRFqw9Ǽb5 ^!uR/gn&I=oi۫)p~]ƺ$X7,|Xķ%' 3B>k"f!Dʅ[ױ!yYUnuOnwo: ,GeK|N>f@N'>vI9BLhۻ]c\ׄBv6n].oGQUY[{Iϭ.ڼkf}rNlrPڝTxK9BstsQ3xLc]! n^ lf˨To+۱,ZΘyNX_UwQ#zZ ggj9‡؝d2{?u뷓|_]ܤ=6o)/JZ1ݻa ^"ky㚥VM^ݪ^yGwTI`ےd2aڥpiN0:Ǹd۱)G2H2;lּHR`hIu۪/؁@x@ T`Cpu{'7B!D c[|˦zmc89"#uI]O?mnDO;(Ԉpў:Y1ur{9u=ss+YgzZʧRUd՛vTwi@_-cC_U{}ߥmhz9ĺПv?H뒙_ !bYF5U}]=aNuu'Tj{ Qe1‡I@wMޛd_DŽdx3hv !_Ԁ)NX<ШХ._Vեo{OT[(鯖1'>BqGS.99Bu]__D]Ԉ>.]>wB&Bt5y]w͇:Wtu=U}HZ Xჟnq8ɣxF#dωmQ!D_c=vBd,hk\pޘzE\awRꂋW1y0Ɉ2qD>BQ"ubp*޶JoiO+BȺ&ݮCIkB!DZڴ˦2ޘzE_n^V 'y\ȇԩG8?;I> sDCL1\פBvnccN: ˖9ޔzDi?ת6l+vW; q=ELhI@۸N<!DFy4u6gk,(]~h7^pmwm;`BȻ |pi']=_tݸ]-?Ec/Z1ݻatLB*CWͨTUǞjOj}7_r]8#2NǸe*GaL2p\z-O]y7<}X:cy3ycڰgv4LpRu^9 iތzOt_R j=SZ)]KJ0)OK퉏֋<'cO4usN hv= b K)#!{Lν4oB=i$QUMm^y{ͻ*賖qf7<ê='`y G_|t}o';`:<ᄻtvj] ^^Mg]msHxހzMa[Ra_݊ Ve $9#,x4Ȧz}[G㎄8c^_}k#! J#!ڻ]m 1 J~h#!ٮ*,cibOUXUMWgn0 )pTy7Ty)u݆RO1\ט!D3.!D玣I'_לS y5SC~7TzڥISf+m󛞪zj!#9:q#0iGU_I54 !v &<[bB;&Bt"zbb8g74t_;pU:W'h3s$9?beH2 ̔ {oۺp$1S qC +F!D;KqLu쒑OG=F>4ɑ$;g/k!06muov/~C]WztICz2!D5K Of]B=Fу#TzQ ZlU:am>vpO%U$OwOB^W=vBd܀kjO2@軖 K]rC^߮ܐ~23үǺṁuM!&ݮCIkB!D;5o&j@軖1ȇ$7ϥUhNޭΩ1(TtH !RBQ.~t7^TUF>4k]r}=91C kZ oU F>!|kWkwIv7'Bϟ"8ٺvkJ!D^zIiEߵ1]Z.Nzsw}O]vߣdѭyNƞijv1!v{ft7^Sv a]sڥ%R?tܶ}Ow`I$!ĸ˧Bz!Җ?Y1urg#ug7^S"|(gqlX]pMnݻvڿCg|{WB.xSnOmBko zΨiFߵg9<z~uI(nSn=v;wmգ+&EHh*__9z4nݵv]F֋RU: ^c=vBd\9էіiǏ>8=ӯwu"u>D1 &B-̼kJx !&w!&qCmׁ/(S|h"8-Icz] muג|-{_I=wgk9mn}_5y8wQ9+^qV/ZC<+ҖԇGڼ]Өqv˫飪oס(Sj|h'‡%Q+0{O[I~/OU]$Bu`7/Vd蚳2p17vq.΢p^#9'rKW%;^4^ !D‘5过~1BypFJN^PU]hsq\`ڥ2v)bm>v0$M3sh%I:Ջ/J1ř{ټ<.tZU3t$C9xgg2Ry9u d`Y0g?cnVsG gxlٟ-r}~`oڛ-щjMbQ'G;}/] F>4N%(BΗ|e.~ݒ9R0u$9?ڤ~g !7Q5?<@_]sek`YCg%IFl?{*Gt Q0k8{A,H9 2p ]s'gEÛhڗ#{r}~d_9'uL)3zh+j|h 2 G789SIռ}`kh?޶?;fx8݇S?G2P#G'Bloi-ւTCiOk>7}+y_1/}ˆҷ|(}=hCZ 2ʕ{^wW<'Ïc2eۗ-R=?EQZ؟9i-Oe迗KG|nذ0ɪh}.~t_y8OznZ:8~yʡ̽=M<‡2'F>&| "=]?8vCDG$?;%#Ѧ{5w ՜cUU}iilZz?}G2c~ߪZПgj- 4 [u =^FwȎCq8᧏G6x jP?gT]h 2L٫uZ(Ș5j3'$Kߊ`l.8 @e,Ng>@ De<>惃8)|h 2 |p'S|h2$٣ U-|h9ڇN2 UL >K !j#K7/@+|()%>4yM!p'SU]h&}2浒 Gm@C!# ɏ0=J Qv v+AP>%j#iaڥ(4De%҇-ôKzFk.4>lF>d4E2a0 4Ee@CÖaCA7h5J #I!C9@ST1@3Öaڥ$n]h*}2LT CLeP MLe>#q*#I .$q>4>l]*Ha%f҇-c^+up2|(c_:MMu(Ɉ2t\_+pP A&ҏ>#Vh֗'%h,# |~!]?=I,@W*#K?vIw&81{BE<)@ct‡20E4.4~l  4Χ>wB%|<v@td4?7{bQ䯑Jq}$`ٵg_n=̫*.4~lv͵mǮm٢ }oh.wɣOlϫJR/.tw}ZvާL0g9&nf|'ߝm;v)n~@\7,|pruvMo撛|(0OsLOrJq;ߖ? N ӝ'|(ėϾ_%GF 9|<ჃHʟ]A.4~l  x?嗿K^P 1@ ȇ"[ICCJɧv 7F# 3y)AZIChs?]wWU-#H$ա47{x;nV5#4>l|(G 4<2|ּߑ;OA\pa8`C97ho}\w=6 zM[I 5//;< 0۵#|(=0]_sMgg~Y5@xF>$|Ypn'??(Fͣ[C97xdK^sAv api=I 疏2|c4iH # л|jwɕo~WTh6yLT-Rkwݓ~=yO7_= ݬ6+AF>t̋nT4@Öȇr$nqΧ>wG._<EnRU]hC|p]ftέB.xٶc@WF>4>l[I>οOd+~&|%v @SVCIE  w`n'?4r%(ĴK@]_%g'_|w* -cgTO:ɣjq%9G I2?^en?;o}572׬RzK߮^hGsMgd3ü$Ԥ&RH"|h/ܘzu7\KMJ/uVFJ277ɡ K-N[@Ts.[n:?2oGJfߩ6KlW>l p1ɽ‡`y[^{u{s}^f*Op^*C=?fS>pF,ԮOOYxA^ykΫc>jq+ڵ7g6-{IګsUepiWiR ? P"sよ7%yӫ_W2׈9ꖑ͡ZƳ9ñVuq̴nl~f\uŦGn:gqѽZ]*ٜAPYgxg>;H.ذ&oyչ+s٦ J&]h}2Y$({o_rߑü_sašw-ôKN#[r?[> ͝_)׿\KrΫ\AP"L$h)LV._W+_W$f^Uv 9軌gsc'=?jqۓ,S${.;?7\}y{yԙpO(@#<4e&~r|pz'զ$I(=N@{ye]_~AWڠjk~Lޜ$s|XdgW*?qfǔ'|`F,7\z޳׋ i|a IƷ(@;+qܟTUן_~A^~gLڕl%(ba!|u]{>G$Y8([/i9k[>t!I@۳@ůU+>D\~ƼM4զ]h2N;ݑO}$IUUYw\z\|\r\|jbF>4e []׹sCOo]x\sri9`Ú\qh#|h?.CЅLJ2ˮ=NipAĦ ggs3Os__PĸS@3<ߡGܛφsV &6y68oB" @w[tƶcxNxL}9+vp}Cɧ[>wpN6:=3] <+NW>t?S.ȱt?}2i8If%}r|pJ딠I|x"A5+B09eO}N>&9I@_c:Ńpt;}2N#$ `B&Y EfLQfL%( |N+\{ H2vE&F?$‡CIU?' @39ٍSܣN.ZνD‡画˘9OuWRE&4aoGԳ3,WJLx0ɾSݩ5zK8*A1wON‡'|8JP̄დiMikpzcMiK‡rK2O$lTb~"wh=65-/&eHl{۴cI'\C/-g9dS/)G闖3'@藖3##\s\ fI)^Rʘ$ԶQz>i9;<1;Ov*o11z>i9wOΓ LTDuL*>8ȇrf4|K}9+2ezԊ$LΓ EH b%(jRdÇ2YhrMu2hMIN.R HN< m=*ezLҗ4A F>4I)c^d2ӑȇL}Ѳ:2'ٯN2-g_{'#IRo'@t9L2:d^*$sI6+C1S>t9s\ @$GʘR`C3z \*#Fռ+C˙5\jdڶm7-[*E1'?^*$)t+@{-M^r0E˩\ ,RƔs#}f\*CY/Q`>UdcIPbf$/UbOe:;o:,Mr2$)C1wN NJ Y%(8~gYm fK,T'PIv''R{y>e(fg{ڱvIf",@әrKRcE6nKQ)pTog+,RNKr2ն;3|RTL4uq6ȠcIo^ 2RY?HDVj?.\YÇ/?EmJJ93 K4 JP\WJ>*K@k#ڹvId?9I&Ȍ.}!GmӚ517e[^‡)W>|%A(eKrgW:á ({)\ E}9ɑv5CkꥲNKr2]$ f/NFd>s:䎙XL|~+$ RDz^pZ3Ѧ^*k0ut (CQ3>n7*Х^ %2UW+CQu/g2|x"=_Qg'P.sYPI[3F?gm^h~ÇNbqz&W>83#aQ#IV$١tI*d﯆W.@[dK>(iȇGXT_W)%^CiwedÇ$X!L@pfo߉cW-e Kr27}N42G;@9˓\ @a/Ir25 3$v&YL@i}9~NMNj}:rlz1$+(dU TIاEFB^R$Oԩ`_I B'$G:D(S/$I^ uO/|-@7&R>ө'z',$+n``N.]gxpFFG'suHJP$wu:>&|7E!@:4trgϙgy{ͷ|+}) L¦gNK eUUyӛ2f$ ,K_WgΜ90}Ѿ$eu?3oW0 tgC͛wwk `#:dI7&^`פ``KpBVNOYͷ ŭNr2+r㍯͊+&\{u 0u/KR%J~ oTze]7L眻605\',>{ V^˯xє?o޼u 05~]D+ɗ6$٤ fs͍}݄.0}2UUe͚5 0y$Y }>ɞN?iЋ3+vn+/4 09ݡH?T?o'?̤5k _x^[544d%{t J}^eI*͒Kߔ|qjn&aC | O]Sfgm]y_!çJ=qKGK/˺u۾޹sfժ 01‡Pl@IŽ,ɹlz\jWYFNm]+CqU'/>Hy*[[`A~Wf3+WJUU 0Ѿ#e}.RO* ?4Yʵ׾rG&Z:+VPp7vçpy(Mf͚l|̦ /Rp;/fe .Ç|14Ҳerëo̜9s:|gyNǕ+ܕ"z;4sߐKv9-[իW+>~L Bg@Zl¬9眎>`;|;;?7{ҤItM@)KP);(* .(88OGgm\q7Pd(;e)-e{6]4ͽ?.E4z>>s9~?^H={] $I"cɼo$ǚ& J$Uah Ap7$IR*+87PRR2,_[[KMMB$oۍ!wV|Tǭ08$IbN>JK3vC$o^d Ab=C1FI$)h?f T2aͣ "Iu! , @B)>lr\B'(I$c} :v8jjk($IyC[Bq Is92bĈ :/$IL0 3nA{sH$)$DO\@]ݘÏ $I6 x±>AI$)'7pGKՍ $IYp1a&I08$I*8 eԍE$It`1!uz5$I%'.vuA"~bJ$A0^>pZjA$I#bΜ>I'S^^Œ$I8 x2Jҵ $Iѣ9K3)Sx$IR>zPb A: Kp%I$ RN=t"q&7_$$I#y͎ m $Ij'.8I&Gxᅓ$I`hcf*Cw$IR]]ӧψJjI|⪇p\Mv^=(@r륰$IBqq1;5pN$LXO:"J|.2`\ _ Lh $Iω[OhI/N!;{B`Bw(ӀA$I%H0f$I @1`pӌL3̇$I0L2mt$I [lAa Ev)`iI$[qq1u B$)l~b$&;_z%nK;A$)wEEETWWSRRBeU$22d7ۧIRtvtMI::: NHa!en$IAP"Ӣ JŇہ&lv=B$iߒ$8;v %%$bdMѳΝ;Yf56m3{{{>dB$IRC0wE`t!o@ïx/5$Iڷ9sSN,ǛH$(,,0SQ:mTNmk'gӦܹT*)H&)*o$IRއCr%yHnjCH.B$i&Mĉ NLab&M];wu<2vؑK$^"I%+#p6gAxF!IDc}-#F%I)//gz\V\cv$IRCX煈8 ʥF Iw'NdrCC^k"#<.z ѣ$I_X$b;$#fl.IWSN8λ9w\.;.Ni$Iy(V;ւ$IN"sO$3d(//kz{tww;P$Ic鰬D4KaPǒ$IҠI}D}?$IRp!(sT'pe*p1H$\GG!`ȑL1b#IH"jp\f$I/brvtr}b:MrR=]`$I#R(x.(o"B$I/hkk#N 9ә5{6V$IBqp1WQ=(~ X1H$#fÆFx,8Z;hkm͹B$EGcF~Cp/(#A$%O ==w߽tuuKYgL&͆ bs^ɤW$El4Q=j] Irŋ"s/5qD>nmlzzzXb9>] $IHGp G1H$M:fOKFI} ]l۶m@vss3W*jne!W\{֭[7EqqV$EQ'cJ30A9X` $I/wI[[aDQQs>͛7 li]ڵk^l}vAmnݸ~=^TIEs!("wk6$u|$I^ qeM4+ ,[-M6|rl$IQ|^x"?CŠ L5IWz'xexD"رjl\inݠÊYbS$E4 cSD2&׎ՇA$i_XyxRJKK34=mm/477s=cQI$Eeg8.~S1K c$Iz cmܸ+V5{ؾhGC$)@#CPRp"q)>lp\x1H$]v-1VZEgg>_@&30=72 ]ի839o$I#!(p"qZNc|H$I+e2}}ta ֭[Cklq{1>\;/$IOsǩp5˱ IwTkF?F[[kNꄖVZɛrH$̍$IӀ] q98:H$ݻws]ww ۦMB*y'jkk _$EeF+sBܺRx $I>mٲG?LooaL&+d29ASL%L$IY_dv|11H$L&3}*ڸbA$q!8$;q9zr$I}ݻ /uvёָ$IgJ!()bijx ?#A$iVXC=h>̹awMM&I|V|s=1n'?vx1H$%3O!G]ݤR^;zh$IR`1'q<ns瓀3$IڏT*C>] #mr~muuI|UHv%y8X\iL3Iۺu+mtwwGٺ֭cݺlڸVۇ}%GQQ1SNspI|u!` 11aO

1F!Io,]3f`„A֭M<~^/ؾ};k׮fΚs(**{RXX߾&N$IRĜ a 6#g0]n$I[o5ljjzEtwwrJ|W^| :::(++k*++9p%IRr>.L{a:g $Iټy3~+===ر(..i׳o~c_ IDATI}~>}UUU&IN2Ķq/>x:\0Iܭ\z2㫩a̘477srm֧/--c}#tI|'F{$",1.&$IRn2 Ν;<x≔HR,[(inޖpȡjSN]$IGCpbhz|(>i<1Iڵgzz<9s&aǎ׿b%d2o̙սi{dN:dMK|)p KM̓#s>$IR6Hp̱~ :;;[ys*@pǼ!HPSSKIIG$Q%I\Ht:(UdW?|($IrO0cLOܱ׿J.|F&QVZʼÏ9t.Ff*+>c:t:MOO-L&ho n7URZJ"S$I80h>c;8ہVW2z`gbǎ>/;::غu+;vlg546ϩ vaa!͉* 6`7XTEp>|%/yֿ Wοe ,>H}4v8;m92clmia›Yyzzzfw$slww7ȒKر}DYYS~ I|FB"A yqϓgzlxp_sI̘19`1N~z455DK.T_Ok֬dӦMtl/eAgAZ6\ %_N6g .5I[z~Vd.t)TWPP::;v _Ǎ7\Occc $I',HyH0cL? &RTTd(/d2tww{wmm)))~qr8JNg((Iz7"d?d-yo={m}߁ }#$IL+jJƍF/H$PRRBm($I$cw|ET{W$ W>HC;I&Q]]CAA+Ӄ+$IB]$5_( A p ~$I--ܲfuuc=g6&Lr(MJ$$ ̐><$I3!X?' `{?]"F!I4x2 MM[hj/)->Tʪ*;luuccaU<3zH&r̞3OK$d ([lŇlӏۀӍ"H_&($IVWg' FN/~>Css3Lů]RL$IWcM|C?6 IL&?~6`h3,/-@1H$_"`9ַ3fXĐիhoo%O,Swu'Vt0H>a ^rn/+IgDC9N;!͛7q =sڊ VNo$IQs;`1ŇW6 '1 It9PN9tJKKooo[-r)|U#[|غu+n$I YF S1ŇWz1kp1H$dzओ)))Nylۺ;{'Mee9xo_%I6VOY|ػA.A$o***87VK˖=ʪ}GSOS_ Fk4O<Ā~d\D-IC4,5`b $I+((wayms]d2>}ߨQ9 )..{}̱9~ظq?Xu$i|(3`=e d}`1H$#d}{XI&9өy@9qb}N} '1J$ !h0W7Wu%11H$z^7iۢqFVXѧ𤋮_䆆~JO뛚r $I Ea,>mcA$ՕsꩧS\\2lزG#Fs̔)_:g9]tU$i g A&ydŇ} l Je $In9 g26mژ]"1c87S?iҀahmmqH|[Jl;Kcxum7cc 9 IJeeey.vܹpswЏsx-[8x$Ip{+p1UX|ؿv ׀Bc$Iz;QF 1d2)FiYـ!ʄ s~5kd2 I4\i:þY|ؿ-!hKA$o*++:m5ޣꚚ~iӦGS\\<8=$Ǿ59gnZ:;$I6fC~ l6}:>,քK7$I95ԼʤPJ$zi |($IR+//giþaIL0$#F yBN8lDSS~_@$IXcڵJc??ɟA> 7Iƍȑ#zH&9ʪak]U5'Lii~_[ZZ@$ICm"qc7 g#}"cZ|$Iy ;tچӒ$i}(7<` 7_1]b $)_UUU1n8xD#Ad $)ߔ2Âi49P."f̘bf o̐$IP98窇>r#ؾxR(| m$)_TUUQ[; rH$7~<-lLgg'Ō3p$IPIb(Xl } ~#A$哆 1c2yrƍ'1I$ #!x_";/>xu$IR>(++c\J$EH%nOCY|80i࿍!x$I#F&/ε/$I/!x_­Ň`1S c$Iq7eT\oo.Il:p1o%p11K$IUPP|mJYY^$Ewudu,>ϯusӍA$ѣ:uZ^koo/6l)$I3!xk~{ꇨPd $):h %%.::ڽ$)oC$|HÁ?6C6I7O7ꅗ$IQQ`1o=cׅ=@1H83f SL͋sMӬYڋ.I"{1D?ƏMj+ IdŹqFz{'I"鿀M/,> N $I¼Y{n:;,@H9"k@1Ň}`1DbH$IbcWT*Ū+wo$I(b÷ 1 ٍu In**FŹZ]vͶ$)* o 5Ň]"@1H*((# ήNne[]t,I"a nba`$2$I"<3 OG˷mi $IQ9`1DWvc8 2IEΝKEEr.Yyd+T*@$I! |"y0,> NU21H'̞5'ʽMoo+}{3֮u0H%O5 $I2ƌslmmky_s0HPX` 1 <1D I⠃P\\ߛnYx3t9 $IRhFb_(~ 1D8,I8>ڵ_Hc~)$I !0aan aXc$IdaZZZkYatN߳gq`HP |"@ŇG`1Dw@QHO(vkNnf֭]K&nmbÆF$I A#s%0xE\Cd1H9XO:駞W5WͽMggC$ GCd[ c&$I ѨQ>mzlΧ%Ks ijj:i&,y$筚$Ix 04\U7A$h„ $ѿq=_w wq]]]ytG.af$I.FCd|ŇNcwg$I ʹI$>]vqۭp՟իlB[[,ZDwwE$ ӀCd܎sC̿]Σh.0p`Iƍokkgaٵkנ3 ϓ'a/r$ImΜ#it:իxYn-C=,Zt멭uH4"#MŇ xQDB /q$I\&CӖ-,_,_MMXvu^\HEEH$ SG+e0t,> F ?1 I4\NFUUUpŶm[Yv-gÆy˖\s9oA$I?7&ۓWC[QD7@QHp)((X4ͬ\K>}q= ot$I4P&a }`1 -K{F U7$IeeޙLL&ÎYf /f׮nʕ\w5쳩`$I@1DN, cW"2.$ۀZ$iHUd2y&,}-7}vx啜s5jJ$ǻs!Rh6gadwMF!IRr\d2R)tnmb˖-nW[lW^ԩH$,IWoC<1 ç  $IҐٽ{7s3 l޴׳qevnc^GAqqK$1)JvV5GEdpQHaC#iv6n XQ&ݻws]wq,8n,IrgKnE20|,> 4p9W&۬F$i=tA7n:i::ijjb<l۶-od2,_,---8B$Iҫ~h s9W 7: í)?$i@Um ]MM !59nNd,]mرcL0_N?c,1n8վ9"IQc)7o2a1 < $"22)jEi?8 J&CgG;vGy&vA*2}=%444pigPSSӯauI"8%F1(qctJ0y /QSt|gcaA꣢"zzz cpؼ91bDrz IQ S)L(c]cOG$I===Xoo/.]7\Ǻu!IR:1Dױ a/`1DJ3($Icݺu\?C3CS켏c * Ňl 31H$Kww7}W_}"IR p1DVcŇXi i I/tk_z@$IOC,';b!<=g!K?#,U$I1dرc oXd $׸R]Nv^Uی!rmj#IJRsWe$)~ L5 p1C>պ( c$It:իciC$)N>h >n aC$F!I_\w=6$)Q|xd!lf 3?|$IT*Ţ[nf۶md2C$)~C4_6pY|E;$IR-Y&%IC$}i 8|`QD6`.($)'@1Hb6oْ6 A<᣸$b<(] IDAT0("Q`>`!|ekg4cc$I$I, "i-Mc\n  I$I4,l )C">I$IU(6HC4]!2I$I!}`1DR/ngI)Y.4I$I!vbc0IAdV5FI;ñ$Tf =QVVfxGqIBSGFIL`QD+k9c $I$IҠ(~( "Cx"x_A$I$iP|x1Dύ!\}s%@QDR x L%)߹풤s% K4N]'*3rC=|"Pk$I$I y!&?2I$IC"k=%c> |"mA$I$_..0H(n n4/7gCd~b >رO7HAvr$I$IګR'UFi4_vCm $I$I{uہC4C<*ޒ}k"vǒm#IqfiIgi niICp{e(ɕ&|:eV\ T$I$IsɌ!,<ĚŇ{1DLJ$I$峟s! ,3xsg~(E#cSn$)vI9=$ˀC ((͕y Dqq("; I$I|yiŇqc4 I$I'+΋(~c C~h4țM$I$I~L5|Ň|bl I$Ibr- !X|?7WC,| 8$I$IRL |b7Ɛ_ܶ%?EmڌAR' B~O(.I9h!;h l5ʇ1B-p5Pn$I$)&wXx˰,>C,~b $I$)&~i p#p1'Nc$I$Iˁ !vh C~1ױ$I$It|h4e+%_(ᴤȳrz$ .`1e"l@-I$I 3⢝|Z"6~$I$I @pQn@(RNFjo1Xy+Ec$I$I++V]qpQFx[(NK<N+-NK_ 8켓{#>L ۄ(bX<`dARY|PN$w%F;@QhovI1J)p=0($I$I9li Xx>X|1h`QH$IAVIc"V4fcX`$I$i'5cp1h,>(ۀK!v$I$I &cƠ\bSA$I$ KCǁt4*6ce퉲2о>K7F+ky@Q(|P_F+Ed0 I$IOk7i}XxPX|P_ 1N-٭jB$I$ [ƠpD(J/dbK"mӃ.IbVF;ONP_Ax'ms2K,LJ$I%`!nnA}fAj yc7I$I1X,P>$p pQeAr%IKAm$˥!n2F1X[ ($ "rz )> "vyfЁr%}XkB$I$+G,<,>h ,ya$I$STE,p1\멁R4@,>h = |bh $I$IR~)~(bƠbA[o$I$oo1غwԥeaszGT]QXAjT,Q0MHcĂ%F# "`C{/Q ~ ScYG&'z ' O0Z=G)~o¯KYG3fۣaf]VXR 2̬eիݥgu̦>  _, Fͮވ)0Ε7G睷l6_80RVm)x[u,O>.WVyRإ:1,MÑZ2̴KS&>3Z}KիeiׯNvui/, A,M3;J1ӾPݧ:p0}w0ixxW)fg=_ 'X,Tl8Ou3! fݯ?"1>QXbݭz{06ZKzR(,wU/aYZ.L J1^\M/XlU) M0U/%X2،,^~.{z|`KTf/aH eR̼ox W0.[}G tbBFd%Q2¿TL~R̼K.:[TL;ofm& Gq`WPjc`Ixvi_?b-k8gX\0?%f|`RB|GayR+X\Z=.?eIQبzK )`ݿz{թ20 4$٠zO컰ϓz|`>X<{T'TJ1 'VVI$䲆 /(lR0S3X|{5Y_ï}7<`s'6b.h>R0ILU0Ͻ!pVR3O1>0^!hl]PRm'hz L"\16N͑G(h\X=L2Y2uJ>P$Ũ< L:U+eU~ϭxYQ20 LgU0*;TUc/d`Z&+/r7Twڵw<ˏr4S_.Iݩ:.fFgU0:VTgגbt L12Ζջݥ`DUTm-輼z L#왹zNOube`Zf.K ۫ቇ-WSYx)Fgj_)AQm&_=4?egUV+MD `va{<دz^eEcR0I dK'Toչ2Sd`=0>9Va|`\P=zQuLCsDXzHuՃsnߴqL WGtcvnw)ſ`}ႦK5L7VOb.W}N fYvbw2ڣ-`l^ᇓsw2>0l_ujLmUb^W 2cgdVv%CwbNo8.f1ڿKfRnoU.Yg|`,~Q[ZQI"[H1jm~gR0 9]"Ũ]K"sR% O<|I ؼz ]ur,=xTcՋeJؿzWwd cWdWK<:jS)FՓӤesWUzXpQލWIK1ᢟ/HAR6^=C /W.2>0v/CWב}j_)~}ӯ`̌0 {7 p-` ܴ:TT#cg|H 5 ո[JAuq_Y)W QGf+ '= \e`;I<߆KceSjzܿe 7P漲ʌpVSUI0JWUIz p.W}J j;)FZ JY]">ڹK1Rͫ3J|IWRp5oy{1;+*Nn,T~j_)ӫ㥀5g|djܮDÅdLWvqXñZ0>yA"׮NixȆw23>;47Wo؆ = 0UWo6qlNuK1XwZ\is^=)~:3>::U Va n(Dquf)XG5|# TUSj)ԽbiVc ?$H X?UTUؾzoQL,N.sg|Aշ`7\BX6^WHV/a|jGRΨn"Auzx)X 0>;rV'rBORI 0X3Y?`^UuZw`Ω pά۰zq6^pyՃI #ê ;zHS ~Ee|__,`/erֲ9߁5sQ_)``aD տU喝jm]_f6u8V=:kgJp%w>+v&+7KՓˤ` ܨPu%GIzbF)`q`iW=9kf Ֆr#Uj39X+gTUO{!5F6GR5zfJ)`i`isX > X}E ¡dc|wt26^p|r3 ,m!koK߫t@ïn+0cnY}:H ?T/&t꬜{ ̎57R|#e`-mUzIڤm6r̩0Q0ykYէ?2>Z=C .&h2[Cā']`P`"`rY ͪ%0i8Bj 9XP=OLl )XR}GI:XQy.f|ieRnX:H`mpLG:XpQRd3>t8:(fyuhuzuS9%rs>ZQ=z00=^S=D ]k~"ۯlK'V/˛VK:ںjK9Yutj;9XGVOh>W.p@R 窃`=\\=z0]0NY]$VGẓ TgTpa0&L0Y=:_ տVn.nTZ9yՅ ?{VJzg )ut`ꏥ`=W߇s`=m]:I` P2`=ڷ ``6^UJ ^ 'p Q}X`X_/L?̎3{U?yp-rWMÓoyj,)`6`|a̓/6 Pu c|Iy)';VjUӖrhmV]̓/燔00~\ݷ(&~>rܽW}>9Bffׯ=Y M.:DyUWWy~/d|!J_0UT_&L+Oc8R /(0NV7z۪k;S@E ;F_# d_g\~W=i`_UB _RYXr7ޝ'YX?+8ku)X@V_n\k,e O9|z,oUUgI ^'`m]UZRX4>Tr>^ݭH/`J?-,?nզr٬:\uo9X`k8jRe|wCWHۨ:aKwW[m" y#KWϮVYuRuBw^u\uZqKVTϫT]"pE`UP],`+ OC, J:@%s.&U9z`[)X[4Ɇ 5s\(9ڷzkrZ[})X$whViۆ?^,5\`^)1>k DSIDAT, RX-d#ѥ,/}?)kb|VEculr@W_ =J 6~UUE }OWof_Sٛ2>k`mR}x,k8bKTK"{IB)a|ŊY%rvj8`ݹHK7EvI29e|T{Kn'r-erΩRB `]uJup`)^Zp4L~e~vup\]և_o5`l[Q}zL=TGU9{)e|/T%t OV-t8EkݫI0.X=;Q>pNr0P/KhEIsXGW~'KhsrZ=kbOoTͽe,s.>\ `!^;,5jo9XB>YQT'H,>pQǥ`R,"MýVXuR ,5⿥`B1Frv^{,oB2>갆`^\Qm# h+ArI+#GU,4Mc܇³scIX5 g7e+IV6(29`| 1~窇: , ս7H,&jR0an]}` ܥP-`œ9R,6\puLUW'T7q긆W[&1s<, .:"9@4\Jjg9_]_u@L&A>kKLc{Tߕ o6;J0Jn'k&0~XݷzR3>S P~P & #7>tn' (lUZ=I„:csYRLU{VGJbCwF%})pL{w&4TUV 8ٴ׳Fm%a]X=%;LW=Lg~:$gLw}}ᮯ$a~WKL"04ٹ:ƒ % TW_iv)L ,$YR0%n8#L G7W7) ;X `_h&Eӫr6՛/4aIɰI/Von) Sճ`Zߗ)r`m\=~, "F `ZisVkuL[T7`Ql$.u.'F?TV]*SF S:\IuPuvÓ7)siO2 )wM`JzYoFb\JSd%eJi)i`}hCR0S=yWJNj8 OϹ`YjQ/)}Zë4;H”ZQڣs0k{#ٱK,p,VϮpL7t0kNvΔ)U 1_$UaQy'b|f.>UfUW>R'qڭ:lu$f+Yڭ1>aկ`FܳzWjCIAÏ/>V^b0~[=fE`K }uljIe×l]$a|c)Yf|; 0D f̍#6\L$nu{IŒy}gK:*cR0.h|M[TL;Tڭla9AZY `,<]`mZT}x=C`r-_R ̦3i0*`Yݫz^u8dIe&P\=(O0.k8շƯ!oÙח:;:v ]UiZr0W=Xe0vKYe[}RuJÓ~,ݪ㫯Ufx`a6<f|.ztwr0=p$PxrYqWϮ^R`n]W*0r$cY%J~E)|Vwoldzgg~esU}=G+1.+Ww{oz{VVדFuOOO>rO?#3>uicZ',0>0Ukxj!ƒ0RVV?`o+6[!,0>0< V/.`ՌkN.1[!,0>0K6O9l$ #qgX7OU6<.).A;̽z__mEo`y`ܳ虛K< `xiA{S+}zbA)֎`mpAR|!,0>0mnX=z=M+y}g9R=۫zM{>5/`놧hwpe?i%`~l[GX)j]P0BT]r53`TTh; TO~!1>̯WKkt`4U=Jn 0v^U#\2:/0LmGTVՓH0 .H;\ cz3>T6j ?DFTYZ!2>,T-ŴV$>0}] {Vճ~ k `\PV+]wf'X(6,VTf'X_7p=vzX\;ՑrL0>.n08<0/~Sujw?>pڥڧڷ(aX=KǛɱq)`jX .޷[I4q 3>L#d|Wwo~NyKgϤ ɴwRT1>YGo$~T=z0^X=05saφXX+~uX[9&/&߽W\`ƇqX>z߆K5,}˛#yOճ>0]p<kIߪU0ٌ..&ad} %%i'_\[(ƇE{𠆻'^Z]&0>LU9L tٰkuVm$ Lձs0}|Y0]X`i&M==m%ϪS^ٰQ꟫-%c|<;VjX@XW/^P](t3>̖TQ-, ۲O7g_ ﮞU}[ lzxuTu})`Q6=nؽS\߭!l1>̮.gjc9`Q]Ka\pwW0{Wa0406gYzgTO  `6pq۵c|X?˫5ώEuhj0.WϯYkgc:gjkY`\RznK90NnR2>چխ.^y_ífgW`\outu)`^.;U'Uϙ^:>\#V`~WQkue|`.~Xgcv'Tݶ@wK\]4bX;4>l\ݢ+ TTKJ O@`L]KWnU-X_TϯTl[Vyï՛ap۫˫~#WUjo)`&e|ة?"`=V=RZafͫ4 Q 0N\=0S=)fʓ,ͪ&¯.~iu,.Ψ^]mpXU/kxbIX(|`1ݼ^`\V_]M9X `)A Z R|R[j)`^Qma)X &n?WY7K$٣:VT[`צ}>8^XTϭZIa|`RmP=-+v5եr0iLGWW7^o+ `RWOh!'#9t͖ճ-3տVY'ڢzrr0c~ZziFi8n S 1r0̊G5)ꕹ`|`lP=r0YYDfYAyծr0aTR95ZO՝`}8cGnR>[Kj:c􀆋w꟫S`LٝCT`\VX:Su)fr.o"cf|]r~S[YP0>٢zl-`]Up9Ճ*s>[{9`V0Fx3V:A X=_ڹ]ÝV0.zaE9``ܠ:zJ371c|ej9׫T~-k?K05._zwBX?7k8j;9&9՛ g9 `|zuVc|yu$r,",WOΑLeJGW_#n+[y1կe|AiՃr$zOKzՁS~Pzy9``lPp/C$=+/>z{S0>d4|ewd|i`<SXx!Yti<Sa ODB` }:Grt3>Sj{9 ]qi I`6`vmRݿ:zX$Xyy뫷VIp;,T79``|vixO,_Uoix#rx`60DcX&`|:zc39`܌UݮzܟJ`uvo8T}z[]gT+$ {4 vF{WIX[˫7 - ̤_W'4YGVJKWթջFs$XLWzj'I`A:HsHR٠ڵiGVŷw5 gVI,60)vi#} /W'49C=0npa>} %+L$&t;T{ٳFF7)Չs~" 04Y^ݡh};z?f 'T΅af7PQUm% Sꌆw$V5 n# S[ )ZT+ 0io]HXQJV5` j"Pݯ$,WU'7 nfuMvy CoK#_m# k̆ Y2>\ن|w,\ťg|l8P`covpJkIkgdžK56S̤՗h8f|PX?[Wwix*b&L(Q}@sY֍`~mp4=ƈ{kIt^od?- mΨ> `qmPݶw7`}ˏP:,۱Ns^m/ ;|ù`I&N]~oQbSYZ gT_.`rF- qڻ8_; \û֥6 _V+boV׫gtuD,P.|n`(ˡ^tz.`L'bP>,]{m,$>xV m,`y)m,$> nTgX4`kQ>ޑTC!A&׫s ELuuU4'3}Kb:1vO Km:MݺC8x=ZLƥ-TWDP>_P@N6sX Lady Ada Created with Sketch. mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Phil.png000066400000000000000000002761741341747546300214450ustar00rootroot00000000000000PNG  IHDR@bKGD pHYs\F\FCAtIMEp IDATxwgYL2@HH$B@i)bP.eYnl*YWe-Q,D VbBds> dSz'$guFdcu@up:ZWVW7VTjßZXm6W7^_-{V۪[r[uCvK/-M; 0RXV??:bqWޭ =ɦX `>]wuK٠dSk[VW-劥\WUW. ̛u}}pRv5TXd܉>J@bǁ!eKQ̚#ccvy;qmuqN_ϗhT2|`Z,4p|[ /帥0`0X`ZmiFR.K~"oP0 $5 NERD̹ wT7+ն:zX_;`_Ý ~\X]P}NyX-CTxXIKa=0Lu /w>aа7Lk-~7 GG%k1N;&P;cS=aІ!CC 5]맪.W`^kꔥ<ຆKdYi;zpw4<:PiUr4`l\ L˻} }(qu;䔥VW5 "!W) 1|Wu oH|el68hxT\wHjQi&;;pju춛 G!յ/Ԇ܆AOUcW_p'pSnH|UYV:zLN6* pTӻ} q,}stn4<ڠ,Sg[ن!ĹK`>'U0lx̬ÈT.Ucp׶|5ܺᘦwW奄$f pG/>lVS#\` `-Tl40l8DYC~.K<:lxrun>oF$<1|շV7 $/5uJ2`VX=zfj?%`Bl/9ǫTk8<'o70=hxlj4;zj)F%`Z}ឈS}ZIidLcRzJu0.nD۔;zRZ$̩wUoV]$2|& շWgTƅ՛?>$1|& Æg8%S7j$Z2|Bujð;* ,/USSڪ$j3|Vg5pۆ7"\X `X=aaJk nP`>+KyJ丵zwW kXNr9a~JSa[ꏪT7* }zjÑJϭVj߈xsJ `O Cf-ވxGYIe쎅Ԇ7^PKI`\[ፈW[+]9 T(P]pQUVc%vf WS.|ϪV`;wW/N9?Po0XTX۪5 Ws) w8|Wur+=̇TY}_pgfY o96f̞SW/Q`PMecr8A9)߯.Un0'5̆To* L>V/~r3U]}I9`z>t0ϼ S&1 8x`m0yp &!`>ZNo8hÑL `=0+#``f#`>޹_W:X9f΍T(3__T`-V[rur1|sZ0έ[ֆ{";sT?S}rڢ kpOVU SN9vp~:R9M7TPT90pxyQ9K?o`>0N~jrL{Y#?UQV?VR])'3Wߨ~jQ9u̺ՙ7(kS Sڦ*fBꗪ(կUWmUffCL/V^Wݦ f~ _NR% wBNI9vLU?SG9rWTQfur0 VW_:F91WUmD\L!O,H`]0M0|`Z_h`\SaN&nCUܕ SM9TLyNRK_~ڪL&/WVKim0|` g)fpU)?{UPڠn~߻mW?uX?w.ۋ-_VV?+W:T9Kn)aXpKusy.-KֆaMKw}a,TUU5 (6VT#uKϏ).|hup?{UYK XvuKQṷUW+Yz]_;Pk~+߲qo^j8G5w y wQ9`R!V_.o}yꀆ1ձyǿWð`\XYY)X.,GV08l/]6ox[⸆m8V `ZV 긆W?&˖#\]F?ڦT#T'7e0)^Y}A9[쭃nf!]X]0X È-;*un{jC/7w ҮCܯlq0s_-(¾ZZ6`w>'Ψ^rL醷>S]T}Ey`NX=ፉ.('`]p_)o:>a1I6 ͱ~|:Zi}'O(wrDufz}l^?`OUW)bq ,T/{uOs +տNYÖzµ/V&=ሥ+ ۇ Wϝ 06TGVP`'i8Jvlw\_+P]f8?2c@䆋/V?p"sXtQ9`.]pT|tv=oC!iSkKv$3|oϪ~RR}:h0@oN:@Y`n\V\G`>=:zR̻;>Zݦ,X_=ۏlzҚdAi`}(`>̗{VZ}>̤ ^hIuhꛪ4 $g[hGa0l<03.>P} kLa ogV=:^Y`f\[l bQ9fal{D &#>X{fݱ~o/G}T)f:柮)Lmg}SPQM0j?eX=oT(L- 4U7+ :zlQMOj?bԸ/`>̖U=M)`*\VûwU) >;a8 {nx`06T?YYmTX_ixV* W o$06UV6n[VU 876`͝oE<:RI`\THN^T/T 6|2E&ӺcX,0Pc0}U^C9`]swT7( :z\9}u jrL귫oR X3۪0px7='6 "po%5ꇪ`:>L_~x`u]Yw6|rDÅϨVSI`m^SBurL6w) lxk-47#{BJ0 &ϿaUv[~u! 3=:PI`ō7T?S]LJYVԵ ߘ{kWMJ>X=a^J++Տ, ^ o;X)`\U]f%`k8y}V̛W)d0|gTR Xv_hչ j;yio*,kXR=wl[ †a993SaYX;7k^Uj-6LWm8  +W5aA6NjxIJlgW+S!7"`y[R.յ_RkR}N9Qk8%7(Mկ-ö(0|X=~:E)`||J9õ4칏UW}R)V[~o{䲆;ʼzNn8% {dK__)1|XY'TP=A)`}z[om N-4 qF[G+ W/+` pnwf{j}uz^mT[7W?S.o,;wL3UoVXUϮ^\=ֻU):[3G*ܩ˪?nkT}W Ep箯C;J< =ߡKV4X}xq0`%]ꇪ`>컧Woh8n b{QI`"P=zye];K{K6v4 ~X9`W}wyT77 !U =gwp^JUmaj$0uNib͋ގ/|o^`%P ሆ!ħuD7' z}|}8m[rxrY50xn0>[R\W4|[?--6Ȑ-ՙՂ-jܹ?NW 攻; ^R]fp]JzCՕՏW'+ssq@ڼN, w9<9_PvߨzJ6k*i.j|=J5'T?P,o3_.^X}B)K|2?6.?a%sMKk_c,smջgMk1u0T]G)qWXFE˫̾+VP :339Z ,dyj?m0Pg!,JU=QlT=_ Y·<l{Iuůhn^kcLVYwkuٳuW^\U:FS ǣ^e'3:lxP2>`gdsA0m0ݞ[]kq+3/mkq`-TϪ>d (3kqYb7<::gi]d}(Wiop|3Jf'5 {˩Ϫ6Y+ʌc Z`}{UW\p`^]]o(3kghkɳ:f*SY>B[CW6|xk=)~Ym 0SLyl:+/[[ʔ4{buũLqhށ`Y0ZS/'Vߨۭ2Ҧ "^R]d)Sņ{igq,DeJsqa *64 !>k-*SV+2O\XrtV!gMe c1xyuELY>4dXUo*S[,ߵД)'4OYU,k}pl!K|Ht eernu;lQ)SKtN/V$Uպ{2-zeQ̄#%Ӑ-KdZrMufuIU)` ӐWUkYpp7˯ ǪjY;rLznΪ֮s _BX&8WVߢ]wI o=eB`A&9՛*p߆/lv { t NզGUﳆ #V[ZՅ2r- ̺6K^Qע샅% Zg$ZĔs-dRrSehQA ^o-ťςfz2Ap9ཱུ'+ꬥuLJ\=iwluŝLPU}`=zLPouW_ y7kKcZ˄m LU7[_6;kmT_u{-N  ~J\V |`|z]zL^IX#Uo_9I戬}ΩNԒL㫳eF- L{4|K‚M2BOjx#º^2VҎ7ijq_^W`^^]e/kW'kG`^]gq&km S+0Cjº_"7TԊZ aYüz6`=QT? 4~BL(ZdCϪ`/ km5Ȧ?/3ꗪ[ d j6VʑyW&G5ȇ N>m%/7ѳ$o̿T~ryxuEbU~pk8=b.N~zjuŕbί`=bn=f*Y\[Z`-4YzRT/zzbT`ݻ:ZϐUʫ;7o%uYٷj;XvR]h!߯6h;\͢IV!TgVk;X1jd"wVj;`g4\k$ =Iy`{Y|,G;x@7J2U7j{Y|zNU_5]Tc"+S̯W7[ + ߮&,6f!Y:J:z`n`~`"HV(Uf05PWh3}\P:D9:Zh IDAT+_T˫̦QjY\T=Q;=PZ|7X d m3ccuf zmo-7̬GU_,}^LwX2gkY064^H9͝0bF9`<=,s>Z`zWceyX:X{:-mH:N{;E1_%O.Wej-\'WY2MՑZ a oG7r+#LӪk-VdrEm܍UWC2թ &-Rd{CvǽK2 -' z \@|m&Y:^K{dr[Z Vs$/TX5R2U?Yj%Z Vf|zvV'dn+ǜ]v@u=h'X9ߕJ*{nu=oJ^Vmؐ}FL!Տh%X>?}TgVWCٷďk%w?`i#`<ȞMĿF~ƂB!oF:c{7ه6=JP\ S%ՍrywŃe>Z=P S$X1h_6h!`JWe'@eً\_}Z{=ًZً|zfk'{}v?iq {06&ٻzEanKsEMZy- dwh`<=A:̣﫶Y 䏪0g:̓f M sP/nWv jf>W}GVb(wkf2x[õ .ZQ 9f{ٍl~\ܭQS~YrzuFeSnYZYԆ =Z`Wgo)Zi&uٍqu'߷ǔ- dΛ1~2@T4֊{ dwr]H4x@u~ٝ\Q=X0S}C[rXM..L{TxX]dKJ&^pY>Ls=%;L|:X0 ,wMIq|{UsX37{(]M`lh*wk¨zIWU Z`b\ڿʮKzIn^E¿n;YZҝ_,x-0UZCr'DeLry^EXIUm]oCT;a\9۪hVSTS+>[gjH #>Ts!'UJ1nN>=T')\zүWzR̵/V6 4732y<6T='koj~g\y-&?ث}@+L0:@+0Ab>yVNQm 뼱ڠ@߷wl#<:{ml7:Tߨ1%^sWi+:Uiv@bS)9>zs~u6LVs-KS{s7-}껵3jd GxH_n!Ϭn#_&é&̦Z j3ĘvTUzNN`X! /7ƇnƇZWbF  x<>l!/ƋmjtBݲxqx#m5aq-:::dirC7qmզQkGm-mNjkF/o[fW㪮9"zB)\C>\}KÑ0}'%`n2e;77z>`9Rn:j-n_F5g\WG-ej+uMi4z<_ӸyhѺK7ۥ^&]:ۆ/20_ή^ L#ՏTKշUR } 6nxr 5XurQtsr.\G.ї/^/\na%U 9P땁)\9[)\zZ`w<Ȏkh=dAzPHLFuɸѿ4_4j/-lr;zGu+['WL ӵ l}T)ؕձZwBSuʨ5{ܹnTō7]x|慭U}Eyp$+ o\L  ӕSO(U'ܫ- 4gG?5/l:` =zO×4.f>0M\0=R}J) uuO-Nzܸ:etyuA.5>hmo_V`=at; `ٴ1-~z2̕3R̗Q\',isu'Ǎ?X-n=v0a0R̕7|I&s䥁ÉZ>x|޸ƣ;-8>7p5SIsU]8r->s4) ֮Wt/5hܹu_Vc`=aj&lC45L?徇u}븅ok<~Zu0:ƣы.r)$ C)ƇiD2|``z\pǔ`6<0Z|xQ\*̡Mb}nK/mBpđJ17^pW*L&W syJ0p~'/,,13|F{q<>wq۶\|m+ #bnd$r|zzN'hѸl}[F>X-\_[}!J1IIb9LχoA)7녣z>h֭[KJ^zB@ 6rR0) $ 5T=2,C-G"*.Gcˡ[_V%`<::@){ӫmJ$0|`R06WQM)& //գT-F-[xEWy%`7c׿x4@NP05[ߓ;"ُV 3opܖY'6pyX kfZQN) tGğ k6F=/WIf޵7T_T VkaCùsUG`xD[{/[ݸp< g.WO(;g*ƍ즷-$)HE@:!R^EE@cyE! X!EEIlBږy~ JKBvwf9guy{ٙswPo}ԧ>?\7@w6iiغ&@H.1^Qu٬0$^ѦȽS̠~̐{:L!I7 Wb8"`!E~9$)L{?6pS%ڰ1 tp0"j;uXnIʥAv5E-6TnJoe\'0Xh IM[L]&pKAp7$p`:͉_BA} 3l`g`)$6m*" qJO/0Gy$I+p;)rfPO; $Cb!NdsHJ̜A<B#t/ⵅbnP-I0b-S֋Tؚe ՊRL[/SH\TfbWFZDʋZ GD={nO._{IʬmL[v:LZ(@5t6~3 `*Kzi5 _ x0*Rs{5.LmTFX؛APS2G.CL8SU^L2wO^טBzg\SB!SS|9鱗7@Tjj0u*M3HRύkmت9%aȕγs搤L$pri|S>ML['AzfBki9uU7":ϝ9!Imfȭ͠jL[B3/^ r@I9׸!O@{ +!I+7 < =3j&PM 2E.x;fũ137YDVe%y搤d5wMKP@,3zც̐KR<aHR,c9$)IF".>fUþDžKXbIJߨclx)o 4"w.>`Iz٤V(>~08b^w,*I_ G"wځL1H5T{)r`[K'i$%B̜u5$57{"w Xf uE͐T&%(}GEY!v~d|$Td6q3;>vٌNfBR=d4kJ'E8 'IJ;W Ys;.č1%?m+͛2ZBk3Uuȕ~xHg4^!N#p<0"~\8av[CovnM+O[ZCE.v5C ѦcpԀC;QYVr o~!!ƖhkAL+Á_B s.p$՛-&Fʟĩ@"+(̚gcHR 3{Ao|*&`)rf`DŽ7]g@8T/D.jynIS&*śMq5q#>3ߩ)$ՃqM H<"akHR li\3hu> \e\y؎k$I>5knTv$ ?ys8p*:Lˁ)ݦgWF{<-I+/^.u?9ZC6 `)rc)2^k5\| E"3Hʩ„bG-C /-oIR_x("76P.ITJz ?JRMh. $I=wßXSHR*L5En,2^.Rq/o,3<2`boYC{qvP|ϷTs;Mw.S\@u&M!)/vRt:!^lfIRu1Cϴ--TS#֧]ήLW`\蠲 SHʋMZ./l IR ?k^iMI)o[l o O>e%zȍ7AR.4>*`E$I5}–Gx1搤y X m\(;WesfȍkOARLh-\,x.`Ʈž` K,"I5s7)ra M!]T6Q ؙ:{Yc2xH{NE(; }3w,_SIT60_o^ȫb\OemGM!)77)RQla IRB3va I{VS *{zDSԯ އpT$q )&4@(Ae|SiOSHR<P|򡾭< 3E.| j\CS!IJ 5W9r`sIS'7mo?UgARVMli؆~j IRJ48miiI 7ΏD`)O>ԯ#̐ v %eԸ@5$I<ޙsn6$ՄPf?S nn0-)&Ac{sbB8 ZB<$ՌP|`3yS7OƝ n0-)6Fs{K cx8e[3pÇn*7}ARl:qſYCqB_l:`)$&a\ eA`Sdލf5Z{3I];>2$$ 5E=Ke>P_< oIY3ïp IʝItӺ2Tu8xЛ IDAT6pÇvh3dr*O<,2 [J8s)wI5 8hyeXL~2SdfEԅ@)2C/sq-KdSHipUh\|z_M!IU7o̟\t#7LP1C] | b7(Zp5$I=l__R'IUw/06 ok8hʺ%1:ВmyCebeW-7S.n u S|Hy50v M%)y ﰆ$I<8|^V$eqfȴE !3>_ۘ! tBR)F6#p)$I..h[ZT6Ef n2EC>퉻gb*MYv $eֆBYB7#gΞy%$f?o5Ef-6c|p/5Cfl 4Mh-#t/I3:7zM!I53+0u =osχ3P4E&uRI6ZBn# 𕒤 ̲ )o\d7L$e{W(JWM$ Bl5$2p4u6llr]4Cf}x R7S,!IR.Ç@,kl 1Cf]`IZ%g-!IRDK I}'fȬ7!{>dOM!ܰURLNSLFj_Ѕ6+HR(o3dR}QeÇ jLZ M'IkolX$UY2$%Tl7E& ![!NaIVF $u"<dI7>m:d S>Bͪ[<&II;/&|[Ru-X$_} nLCvl{d"Xz ^",!IRMKAU8XhL:B!; 4C&}x R7a+㖐$&m SHR{ UpYYlx;{3dρwARǵ)$Iw̜#KHRR~hL aL"7` Sdܗ^9 '$"N$%xXw*_2E\v)}'!>I(F-!IRq_r1$g.p2-̐6|H[0h6E8 `Bk9$Uǐ{x^og^`&!>#roa;ZL5afȜ6`0ir!sSHJݸ& L*vIu,86ڀ،ܜ-6GcaM_;B 𷎆*I}jp?)2cfH#De)2wp)$e╄p%$Izcb1-MY{4.ۘqGT=)=a@W@jjx4k:R)11k:]ە-5,Vro$I3bPG`tS3ieݵǰڣY1im߾]]i+h1}$KeOe͐i: 3 pVI0{[BT͜q4IcCCV~N]ç:WSzeHƙ"s iqF!`SdJ i IY0a;B7462t`hX*2x@ C|˝N`tvve*YtY. :1d@A:hC%K1"̛Ǽ1v_(#?ɬǟ`cOϰeUvx˖|s)w2w#hr}ϑ55 3dEfHÇfͦȔoɪ2`bpI96 u& 0FaO0'+z ;UOI|3zb!bX77O9)IZ_-L)s,)FZN7CtBRVk)^$f~p5b12hef7St3¯˅/[w9dI$/ g2`")Çt8 2|)$eńbtRIO8c!WpkWZKI̬z4Wǚ9|HÛYRv0°2'֐yw3v;ՍE-1_54=bǃL"L},)PG{!S.N6,H;kpAzn( &T.>hL C2 `s`)$eҟlo IB!pYgI BR<gLًʗO>"0E?3HʒqMB%$ww/>q[I+c-pC犎yǑKL")gn6Cx+ec _(gIꝱkpBZ!īοMve$ok͐)oH?ɇ3xʒyfKʔIRz h$٧̔5=OF´RgtfLY8 'G+0f5ʆ_ARo)3B%o1x>,v/aCR c}o`8 2Z|zKHR44sb "w~mܒ{fȌ`0}'Wq%?0^ǂKIR/;ygR_L!|q͸ vQ$%R`2]}ik/vόLSHNҜ^KR [{1"+(9$%jp?0+}'!KI4$^A?C!|Bᑶۯz?hI cw>w!3f_7L㻬 I=wA1# ]ϸ3[$s62c`3 }5ŲCr3Hʲr,gI-'gRxg\9N$IXlL Ç2fea@3y#HijxBf\w_3$;GfȌ݁> ˎOARuvw$̈aC} !mh ̶ۯ`gyCR8 q6[s~8޻\LY3HʼFwilh0 c/}=_9$ϛ!3krPg!3oIy> )3bb?ޓwE>5njԏc*)7!_wIʴqch&XBRxneFn#eT1Qjg\x EHcex)+4C8|">j%5\\uڕyWOή"H緍ۯؽ̐_Jf s429 fv$;Rnmf\{OAHc1C&L6>F#3dGEfV[wZ.$HZλM%͐_r?WU6N62C& r%2};ڤ.ۦ}"Ƴ"/Ln5C&lHeU78 8 dZBmoRޯh}:m9$fȄ/P*rP}1C& 4<Xr%Ib[7sENm_)$,fȄf.58 $p$M,+I=0i ݤ:nϸ,aTc_7C&|f>eL8XjI`/Azm[:P >ӯiI5 2C NfK1}[Mr%nOra=ϸv5$ufȄӨU8|3$ʾryFVn^n!6HSmb I5q*f3T<U17{? )${=Hh.j I57 3d'U:>{=d fWXhCʎ70 w4gT !yc{zo ͋ )a`eƤM>HzX|uތi߉a | p0 >x'}QYrIr+r$&n$Nnމjx [8 h4P];4\_ GZ Iݷzn#iNlcII>\ڸW읣 ̐5+B${GtiI9 KƐT%4C5C9|"ϕNE $uc67= $U) 3$ﳀrs͐G N8$u15CHG͐qAf=S>e=xb(~I}ARwη"?cکT%_1C>{h=s0 ;XbIi$uc}AR6 ^/8g>t_>m\gI >HR7ni6u?L! ~k}}auÇ{w*N`*$uSF P?g I̐{>tBgfT IPbaSO!K3͐nq=ۘ!i]g >? ~KR74I^?J-6\KӀN3$mk`O39oRtgMK .R#HҚkq%I9 ;N^3$s&Xsd`{3$EfT ͣFAR|m >,1Cvv4ÚqN7A3:P$Ua䰡FT-XWϿᦐ 4CO>M}̐g|sT|n6t$UQ܈EK%_M߻79|X3UTAIꆡ>HxۧzEKfHZ>n7 768 IsCI|:ფ|^zCfHQfX=oc@v:iI*hIZsC]vIRmY z 6V N0Cf6$AYAR߉?ARϟ>mo;Hꅟ͐fX5w0 I_fI7%2t}!PjBR/S|k}jU!iA*t;|2" n8-/ I%=fH)@ +aod>kIzك/GI3Y*.I{d׭g Ii xVêj}x [3HKY~ფ>0$6^x I;n^)+-fH23HD^5P,8%^ ͖ _!Yonsr iOAV$_P' r f !iO^ ^IU^nIZpV07Է33^8XldJ8|x=J7fU @56tI}|V. zap ÇWw'O|3Hj.jc| űl ?j>mg;H63$`}3ë̐ I G Io~I p$"fHVQ3Fǚ!YA=v$ɕaC$8`?h Imy3$x`*>X`U`$ibGPc'$Bp$‹TVQG=e?hd=| tZ@cO>Hy֫-!.2C>7 fH֗f5$iJE#(aqi YTqr\D}bIL(Z&2 O\mpgCeI=?*Cg<=Ç yL,*3HRw@V=Cx `!{ĮG<B?WZY]NHUc_,]lb$O<< e/d%iB(DC5;om_rd6rr/ 0X)” qxmf I=|)0xϹ==A'v eCHj46x)>7C/9"pK:m5[Pxe  >Hk37"98ʽ纎PFO{HҁMf^h)4ZCVhVAktI12oƴ)I&YY€z 3$`]`qT= }Ax lf IZ|PMſ u!.3^1)38^H j S}'e6ny3-TC"E_ҚiI~'!Y'Syͦ?1$B!#HҪ56?!'cn&)k<̎R&./NOa$L3$i]ÇIzʴV X$i5;;)U>֔s|~#e_: Iy+f:͒J1F# ~iw>zC8ܼۡ$7֝74AR/u!7zz0$=AeJ+I2uV͎Gzr{6O>Ϊ˥bw=%#wp rM9Qot=V` IDAT{'k@$ZK/) zo5Uv1u/kF9tuæ{h|)x.TAR5t0CG/]oÇ|c=I?0$UOc 8|P7.k.GGXX'no,T }9Y'Sgm`yAXo}+\vIk,^4ya[]9K;3+$Ur[fH8 ICe*+Ir?K蒴R]'"/6O>c!8V]~]Ň^(ÞVT%s͐闭úI& T]c1G-!IWv%^$'v)=S,)=AIղN4|PNNi$BZӚwz!g.-|v|_6*X`䔀c嗭C8c;IAj#z/I+Z線w;虦=^Jx6q J^2PzN$_/Ç} <7AI}tiIZ)|Do<4CN?].toფj6~7EQ'OD$]Le!IPjp I+z3ZKGpG|ñѝAR57C_RyAiYO=HR=b+It #Թ@dԔn>l^0>H5Crrtn4sM I}y,%$zV.]/ut~ }iσ,zZ~KH 9x:7N I}/\zI=6RQ&?|y,zj3$'Oun4]f~w ItÇ:]Ggb<oფZ.0Cr/Mg>p$C| 7)Qt !YeK`%V{:|T+QO~v{{&B`$⿬, &P-]fzFK$pn9 =XARNK̐\nz9FX1s|$fHQy0aWo 8 "$.TW}EOH~NV1j{ eC~ M/fD2$lK/Օrk9߼]1[ $LfHye4|  L I> IdKב{Zw>a3\,_/Tq$؅&HTsBf4Pp Ipb#g` Z!M/ J[FVTc7CRF(|"IpiIz P:;:7CbVXIֱ>p y>LL5U%)!-da?KE/>iNG>otbWVxV̐\|epPLʥ3HRrcI`A !mM£x͡[$RfHJ84/H1.3HRK/IK,rPb}2:cלAK.r?OKy>l_~kE> I/q٥>x̐VxA6>k3$e3`gMBHRKH_g6\j:w[a%n>dwև= p$)+KR~MMm }!CFG7;{1>r+pr(>|8q 򕤤?Wݴ` k?iLyg &HJ_OŲ%~5$kyg+HRE{g/.]f+,+dâ(;|Է̐La4_R.A"-!^ʵBp!!:,z]Bp /-4CRr<<|8(y% ͒L~Te]i…|eC1CQ>5bI}B*05?|ևJ/G I%:|9|ȳGBp/,]^SF|~edv饬lqL I $!Bpi,|=|ϗ[da\R`Iʆ?-1wVȖ;ZK}m$Rx9$?t8-)#˻ JR) %%O͙k aUYQfI !)ֲ8|-Uf EMPIgɇ*!^08|_.V!fx )L Is*/y/ZA90$Ƴ f0CR2w_gI $)[b ><&Pt<7yWr0AR?_ZX)Xd<fIʖPp%7i^ʥdLr~ʍC tZv{%z$eIz7Χa(ly$O&Sdz4|hJF;p$)n8-I0ˣqMM&x\IɍrA}{_ n4-IbXnIzSyZ<![~P`%^P. ~iivgXⱕ7^#H|!1A4b+i~}df饬 x\%c&0 $O>&ȖzOHon<'2|`)!Ǎ%)W>/Ilr涵"f)Jz=woEtR8ޙlH{L%Í%)|A^gcO!VȎVvAR x:-_0`?dkIʰ>C>uu-78+ARx:-CS!0|x70)n0#IYُ?a<[Wl38v )L`*[$- Ç=1 +X|rӏVVȆd$%fH!F{y%j\@2@eIz'~șo%2Z5#;RrhI|C3$c)0!R9Er[ПRU."Fͻm[͐VuHJ_NNG#Δ, ۀ Iy H)K|-=v3*ARR4C20?ɸ+X2$>Q!!qxC%VuVp )5'L^Typ?IX $f=r ;οHWWg羀*=$F`0LNydx }A)ױ$'>QqE˄EVX133$#T?{{$G$)'úBIZUy~~!r(T+i#},ფy0S|:9~XlfAQ ji9Nmʃ j t+ciLIs>`>e3HR>B R,#SfH#HR&k͐$裏8|(k?{UqIPҤ% w׽w[\w]{oرPT\+`APz $PSg?HI̙|߯/bfy|'So(|o*k"o<—Sj1IJBD$nbX,>5^b—* "8,ۨ "RkQ^Q ׮<C֕ AD$CLh ⃦\Z8FD$m8VI\>$,R EMh.U""qOcG̝W⃦\ T "8d{iJBDnz)\8s<_e YIĽ]6. @7o`bI 6CHТӉ2JY˔HB(S 1+0 wX@kČHH# *}A^<{9 ]I$ M;.ԠD1$sR߾2nܬ 5Ѷgp++=y6$DDG@b 1C,rc4>bTDDGxiE+5RPlmm!$DDx[1{GL,.؈)Ē^"" DŇfdƔ!zfNX%!"^W1#f6O5.b&K "``7p0[HS xm~T9DGW2~DI$Yb<{:4.bT@뉈$;hV 3@D괽Mv(D}s}&VIDe( T 1a>&^c$u fh%Q47*f4iM_NMUWkBpi8/&ηB! ЂSa2[D$A-H_ ? ~*S!v~1u0ƫ4DD7AL8 8}P|HlЪ""&E!4NiY9fgMV1nj@L+ fEcC0郈⃦\ KeAD$aH}Ќؘ}\I41Gۦ pivCLp-#"gR""7w y1|pƔъ"tٯi*݁\=)Hdٖǯ.E8$oF)fx-~xʢ|&7ؚJDyӗcC_t0W "" ̶̙QƇ"4w"fN(h֔H 壱L'w)bIpDDB3[}vnZ`xEl7s}v!""|clpŇ4dh%flooV""Yte yJm߾Y~(jf/T<{Q""r)hX0Huqw\@'DDq5JAD$4*ZXA4_n0fMݶoǏv|:]Z\ZDDZ18.TNqҔK E "*km&|<Kf~Z0cj{e%3&Nl0-E[w;AD$+`UIfw(P5e-f}=ʠeh 'N5TaMJ X@%P"" V)K@'۶fϜ|׺/6LR<;l!4o=H18ۉ*>hʥ"iF 3DD >R5\9m0 gLNilVx?bu4?Gǫ?~i&쀮|i j%9m17ksstHć9yXy6< TH#clh6Ň0ADy@PI$[DQYy9NAH Z;7kso`+=fN~\NP7HS}R5{'nH3],`"3TR407Z6 fL]<{.˵.qIh7D4uL%O""͐ )[Ν Bsʿ7kң;g-طZY5-c̶ͥK"">:~^މr`bi~,JAD$t@O| !5;7kҧE&OMj♓"7}έ )""k`bp\ԯ|7rώ{M,",y|/*{p`GD1}\~4f&ow.UAfgz6m0FED$;z]j0Ňq㘠KDDeP>3p ͪ[ܮ]4bm ͚$h13\9V.{ 'vWDDoC, <<8qDD/ 3VAD l&WW B 'چ XYw`k=a){-w`oKv2ReUT$'}M=tlz}g}\/ت7f%@kEᨨL (ڨ/7ADٞlwoE IJ3`G 4^/?() CD"Zf>_ޭ$D$\U'JSGs! 4咈H3B`@[!"""p:/鼶@h5o89-  |醢U|М[lW ""xS ""!+srE{w|h x6ܮE$l+ GE ,ݹY=H~pYif+eηWz@T70{kZ-azCDȇqn$ŇV@gLQ"Hp " ;!'f)h$o5ga/tpnk8_Dɇ QC `wD_@N\OGeQ`lL!"~OW^Q{>f󎂘9.6CE$|@CNޏt#)! NbT`4.ZNnְxjQ" W̳o:f^8>~(51)8 1;NH^ A$W?}p%EllD$|"~>ҟ#;ՏNE!""tŘBD O0ֹsONʤH -uPωHidS}~[%*.])"q{`bpT HtՃT=)0F0~u/M{HGc "q|`D IDATe"s{[UTج$DD_hvcԤ7wJSHKE<DD1[~O14`ko)tѬ9 ,SϊHT CKQ_{4u""!3(gW^QAĐz_x6ZhFDnkえ\AIKO4VEU`.T"D$\A'_}CAĈy/,L_ac)Gyqry*>HmE JBDBUE,XBA8'/Jr{檗E$<"r>_ŇT |DD$$"JiFAW_U!"zcljY|zZD<_M!8Qє"""FiȈcJKMul=8EyW[pzZD5H N#Q| yDD$dnF)HS\_]ܞ9}ee~0~7)+/]{0I+5"t>Y^H44O}QZRIHS|FyE|-]B4/-i"icl>/ߖWxM=," N38/}51#,&ifa04ծ={iͱs=f[}Svm͸̂˱ȷ 0_ 0%~)l/,7v^nӆ7䤤|n{YJ#޾n{ "a 9חg߾<$N8qÇ0{ 6\u/V/H38pbpkviƒ>S""wBp)*.a}vp5mZ:4SX\̴??wKFn.oON$ j]Osc +.c s5eICUxit~YGvj!P ""Z!H8(ٵn;7٧zNչC{"kG"Me{|;3Ӹ3ؽLZ=4o:JDafਰW!q|M\"""EH8Ҵ~|؞oV;{0G>^/'#=-0ilں]D qcXe1!#׿sޢ b0HA/ "ǟyGکO^1彏j]bIC ?Ḉ_QYm?DB¥^7Nb's$'cDDFS/9kH8O.k?'_5[H8d&47]US򻮝:0|T;G'^Z홭ZuW28u8-Y"NxM]rZ""ᣩ50 U| P8|DD$l1JAD"哹_jC~wTv6ycTz|jEgGfЀ9'EkL]^+ALuHxE>8%0D}ADDا*`M9mZۮ޹#/N&{p˵y_h"߽Wq#ORQYA"m̔7i>|||*`nHsX0дKNz bޚe=xDʶ"v@Ν}rOݸ9TTe+;w)ٵ57vCEe%CA"RgɷKGQc/+.vE]ʴfz]9Y^r_if/»6u'zh>q}* ""M pH[6}1CO`nʨӢy3-MIa<y7+cXsخH- W@f,{7~zZtfܸe;rk7n0O^WT@F$t" ԝ&|S8I߀RE!""M}sf茗Dܾ2\96c mV&_/\L01UTV{>FmeerQdi͊uUT4ͽ -QhSZ,Go;' dG9X@LuBf4A#BDT1pbpL6k ,ŇoYܯDDzf.4hYz <iohN _~S޺ >_On\xX^篥*ie\3F 2FE @@0J- plTZ[Z- >(&k&PjZAI {3\.NS8f ""ޓ暂z( 7|eer,^_ITk굜7n4ոn7圱'SQUEMBjc[a+@DG^yQk;}zԞaif =^wmR̬}I+,iQ|?gTk7'7SSR8idHB+B,Zq}r.[EGC.5V,!z3~:}tf0fz^}TjHk$tR1_|Y8إDD$T=&0د!"NXn=S.ňѝf*"zLW1jȉn>RS9i౜sM7|:&۶Ŝ:|^4{Zz0 ׇhhEcOBaۧeY<3ũ#MIfݖmTT>5i"9=4XYG">\.w^uyTڽg/=0ο_|*C PHr^kӪ%}QiW^e+#gվe8WQ18M-><h3gQ]|i1XD$,YyFiI#Ϡ}Yj5 1JLvڅ3G qjӚ2|0h3g^S ""9Y_c&IJCDbR**+zFo>+ƍ&`,[`0|kA,Z!mfgMM?u gIL),._i## KyϢfLKVǖ}}RI60UHBvOSbN0W1HCfz.?Ւx"' @v֍r1_N1- شmGx>6 .SFDi;y*}zv/!qY. Ihz0W3'uK;uLDm=$+,RGDHwqLZzrw9M[]c7_- snvދd'{JK(-+'8tDc = &͛JZj*-H󦐖֠fa%㰌[OQa_ɮݜwٕTq~ȼEY"璨^7YQ8iO(÷sADDjӣ$+\%!"0fҨL/Ư/<7*k<f}?P}[Hdzcպ ^)*) zPpvuQ"4/iiMez2ZNtZHeLO###$GU;^tT;|iԤN<!ت&"qk`bp,a((sG<W ""RL %!"`Y?^3`0m\.&WT\{_y{ASjJ Z"}"4/iidxh%=KFZ-HOEZ5k%zι(1]z\~ϛ@ _"Ʒe)Q7SQ&"qQொThF,Qގb^sۀvBDKSyW"VNxBZ$VYχ3ɜ)ٽo7iiHZ=SFZ$RSRHI]4/\.~9=ֹXN/O7 p C.>57=dꢪK4D$7bpL`e^yBhe: ""5m$D$~oG_{&{^~I|No6m8wݻۭ f.;$A0hl=e[ Wm)w/޻PV^Ii****rrii$%y$M%=Ջ75oj2TZlAv6mӺAk\:FV}rYt)s_Ekx )\ ֘ B)>\QU ""R;,~JIHy;=>۶;9grRSk\boiYv$zv"|;w{Ly.۴i 6caz~lb#"Rg6Z<x#&&k]* q"m3_\"#8}Rm©#bLtD^a::ضMEeՁgߑpeUVU)D }%WVVU'3;|0-O+*J 4E$#2:Y1CR}Q"kS(޹/gѶ_)V+V4cX\. [Xn}t%s.X{,6RWE$sAc_GP8J@H2֕@E UUgGQ1( .X]Vm6dGO-\^5rpr\.`WJv2Glxn~9\.71weGv "_v(| i[|)p2v&N ""u`Z+ qҺ[qt'wɃsnVYAyq$'Eq,&&6mۮIP,˵>Ptpv k6o͏gbݖԣn_i+đ}e@ En4;8e ""u|` =oj*' <]*,Ƙ}zt[0l7(Rħ ?^phaaWArEďzDU--. "q/0R18 x/2y/E@DDcN "b,7 c W_% O:}s{0WDgg5УuR?˾ZXE$caYc,-,C~~g5`@8='uj_`F 'uNj};-c*moR"KzU6o/8u*w IOSǸri^Qa^x ( IDAT@9"nǍknۃ~coq㊃Gf""qBI h;7G:f7V1H>9nV"K+*m33tOv=32"QªE6T#@wEppێ;Xq6.+؝+m5jD$N{c\'hLEDDJAD#599m,^)~t`7ө}ۈw3/:vX]oa٨&B>P0ppVdp};^[ hHKc"R|ЕѥD""Ұw`0i t8*<;-7:3\mx >|WU_]fuQUWb=ت'^eU/܈‚‚1[S2Y.WĘQqh8Q!hiVUˀ*!"Q^YIϣ;GJ= CZ`­򫟞1]^a?w/EvgÆT{ODX84е.,4tö1ƊL ٞl.:_ϐC|P%ODD$? `(('G~#wYwHz֞&yGA=_W./pd0afD#Rv,}`j  ls5lcYx8WhHR4NЯeE~P(DD!zf&EI'oD©}v/} W +׬h[w_sc[e-ak[km5lc9mmvlĪequnK-""*#Ѐ/4s_ ""`Txl/,b΂tEoҥ34O}wjhJ2u}: ""kuF) i Spʰ|l 篥gtT{45%S[_&9oR:&kƿ1C @^T\W|CAcMǘSmĘV,۝T{aհ‚upaBaEZ p;q3v48S#TDbX ol:+SGdžEDr3=lcS"k~+.lZ>l>|5,f]uo|ѷ-[=cY]AyHjlS X;OkCntٮ)3DD$D9Y< GIHc''͛ @ ^fǟG=]74W_eɪ7Ы $ ٞ s64H~BAö9?o璿bI\͐<_""R Q2gLt{yT ""hV; '+ i T ""B۶$D$+֬SNƛrwr{С]6_~`0o$=K܆-m!k~z,"&*fyE_/Z̩#\P_){K<_ipfqip4`'m` x r^sak=\$pPXp5`\XcސǮ\@4Fİ!suݡ!Ň@ߚtKADDBQ/Pf h4D ?C~ӵ rz0wB**K?'7iqsbcqiՒ56SZVw˼K9$'yP|1 }ťo|KOI >bYt`oZIƲ\j.,/,Q$pPXppamױ[wk|"zg(G,fu|Se eS](""!v߈JBDB,&=|]; "{`+ׅ͌4V:.|:k^.lov̈́[%E3 %ԚbzKT6}1>8%:] uPV-TQ6G,zݐ[#ޙ`bp2m"7ě2&7\os<8o3@Hmy/}mZ꼰4]~1j>5sإ%=Owc-s m+𫪬<ʇ:>H*ۻ'!VkhHZ"z43&2ADDr/HO$a77IoزG5/[r{tۮ#5%%] N P]HIr6`8HQBiM5P5ꝺBkN!;w<ςf^]@#UDbBXuZʇds.HbǰDxbYG v2zmWY5>׏qC$6s9i;tm/c/T2w  YX8bY\cl}XDbrT|pB ƺޭwכ#h}Ӫܷ`4D$T+׬g=fDHЗW|%A/㮧^িHYU/q=9A;CӮ1}2nϡEPnsDm,,Xaʦ|;l]#"OSᢺ_ӍuشD֭f3ц( i'^yCN ڗangəG0gB^KV7x w*@H\B"9z$ړmcz*tD0w|Uf/d=d9ZW[m.GOmUhE]j-V +!a$w e{I^ǃ&ܓs~})6N||,o-3@`ޢ`+D.0 RVYx[{{O2 M9LFw6=¦}\.ᚓvvȈ)ܓ~݆A g.,&N; ) xTk%4f)g+PJ95(>X'] JT7Xl>ihߺdduܱE7|@ _U55z/yy뿟os lܧ„ ijdcDC]\.Wq*-*l=A@`S(>BIHxWKYz}B=ye3Sg_|٠]{e _\} h3NW[~!) LdtU&j ;n㸂A# Z8􅅓/}v3_(h50UY H*BAGF.ȽoSS:4Z)8hoݮw?BL;7 I7ϺB7ϺBUUZulԦ;YWNC]s5|Qޮ'8@ &GpadgvZUe.ױF.6}La)kB9/}6k5mf,6SCRwr."C -ڶ)9}@_}|iFKJ˴{or +w_s}| p [%J$er:=D.WXP '8g|pzqIc!zF8a%Ee' S{Ok9jjkKn9ԤD:r:fdǐ?C2223$_]U)\ag.,3"d0pt Gi)T1gnkDЈ;U!,AbJ4Q 5zƩ}  # eZ򬗴9Evߓ! aӡ4iTj-ZX8qšRMuTo|&WNP|B^$`wImz//k~l4MNJlw 6 ci2K )T,/S.|8ua'Ns>y[!MЯj.:F>pڲI32t7ih=%w)Ǒgk$戮>=ێ^)=w7hI%ȺM-,9hXwOk9۳K|Ӛ9`JR)1.p\R m[4m ~Zp읨t9c*˯4]rJOuUeq]]_ 0 !,,<)"2]LL\Ĕ# G{s[rwKlDIDt''0Rhai@<>Ik2kI@s=H/٪~}rr}.>FN7l~zϽnmSqMLfLtv):%EFE[R( ]2fvo 4IF>XAKφFLd7߽U^a.M-XI.1)so)]@Z%hܰзW|lG])i_wmju;\q %OJib2Mαaސ]|Z.>8%u$/N@cO2(>h>O<^~wocP|lG#50ƅED􋊎.1 kkaksJ|i-lUktqx>TI*}]$ % -ߘۯ~]Y+isߏYAFxĐ舨nEy/C2$CJҡɇz'rx UtqŇ|7*ܒ%`޽aT$W?[>cyWrD4WwG$;|$ e%}%1unw Upt؜KRB]. XNz@c根4᫺p eU\j(}; 274ѐ9CRbwg{j Z҉"NQqq`:{! =Oi~ (|Ş;J=Ox]Mu84Q%_Ȕ֚.b=^" ucGemyev Q`_VwyvpMq)-סa{g&}"wZN@+Mhu- ]&HyUyi\4*W^v籜DӔii;a% rTEZ!n.0]\f@˳C>/r=L l/ߓS} 04I2tt CsK%ܒjLd%/~?>i:% mH$1X"/!&_̷A%$' b.F>؀ϱ9m`( $}z.WIҷGWEGEDT\Vjl)qC p2p44A ק ڸJUk3mp5vQY# {qCF;W[f.Fn8`|.q2$d(Owy㏔ԮaqKW_~?twd=p5(>BamR@O[a=b-[1$ǚvA5(> *qO},$(/wo]00=>]y!oL`Z㘙2X,'G 2@4z⥿?Ju!6^w=j~~|"D#ُxN"K*&@3e,%ҕav=p͊yartW{ uC3Z>^H:F$/1Be,#ڣ^UNth5PnpkҘ꜖bt8Zfh LVӠ`I`#K;8NM"\!v-?󱮼h l^nY?r8S|lL.KoA1j !6ᗴhݨ),I >_/nJ=zJKNj UԀ>{7ǟ[&`%GfXb%N4LR@Us[X=),eɂaZbFW?KOi(;u>_{LSs]`#Z#Rȅ1L}m94o/Ib_z]u֜yh9;Dnjsnoֺ^Os~B[r i~Wk0'gÿ 7S/ʋf8XLϼƑ3ztӿs:X-zUG?6W_}DGvtC_hML`'D`#w}|~dtv㊑t#I *!j̐|:UTULm۹K os2 *&:Z櫮|:<@];w#tz3o|~U}V7mlo[d3ITB]&Hb -$S|;I3w.2Q9-E\C0V^Yp 9zaaڿhvL|UV4jnGKW^10b.y""W ƍ(Ԫ[4-μonBk!$=)[|GR4Cʉ` .9$`_TTU=V;vLm c{ҟ;U:zvzq%ǣO\C)]$)*"B׷Οv *RiERk3 cL y@(IG A )l.^la@R@% kZOTs> q۩'_~۳Oz5?߽@KWҿ>BKNݵ޻H&M/-[h/AR1~K.AW'^bE| q;I_m~vJSƌ04q0-[AU4Sj~_\)ۣ[~i5eHWiEcGD74/hjw'ń8 _W\4CCUlt *< mڶCƏQX+p:.\`fKrEP$QO$%#˕ԝv7)ioИ$Iu]SXCJLH8mk,ݲM2Ү|vHjNO=0G:wlԶJ+*vWZ+m*K,V=KEEF$ zV`{%CutIdt%!]J]Ld:G:7n-ϕ%>a~[l{>_K_{^?7jףBW^~%KХӧ$ԭSf-E:IÉ!IzI;Da12Jm}=5͹ZIts5z Mo>6/5yp͘8Et8T>Y ww.ݭKȴ_N'K`'V `1`cIe ڴ7E:P/_G>?Jړ%Xm`+~)p*O靂Z=*WW'MVNC^cXꡧ_iO|r"1]F%ĐCߘ(㫴;!%9WZQ?<⑯Cz l1M _nܢ7I[>(>KXC!TZͳPRvJILԂ{RuGvz[48-a^A.X#Ab(>l0$RmЯ~:GfߦpWX@_Vc!H O-f[oUbKV^{m3j ]4~AǸpD ;'?1sO>[D=z~b"##t-?ev維o:v ^#h4!F>X3z']7\]{^Nz_).&:shz7Rlt-=R]}}yd%@XX;oh8c.>Esn.[s~\k~=sB~Daqy <@O>0GIqoPn~=ԋm4j ]TF2hJJ׷?.zrp֚}Ez;3ztӂf|-Y9Mݧݺآ |KȚvC5(>X̔TM ֿTPTr͜8P" +b߷{W-oŅl~.SJbzק\Oe.E[#yI;Ub%h_4UI.+QR4Ix nF=vı7_9Bȇ w}||fW x[S' +XnGydjZv ^C)>D$;O\/7nicO{nI nGIBӽ'nbћj뎝07k ?R>v z)%9$Ő%ʉ`'⃭AG*q;ϟ4^KEGEd_ Orz{եSO?1 y_6coڅ>[޺0Xp(>X#!ONH'Ξ}ZC(1!! /O$uNKG , +Z}'Ak^/F>ֈvH"=gfR|=?PC^uQz#S/!.Vs&YGZq1KILԓw.mhGUQ]ڷa=ىp& z书)5Y?xxtTTZvҟGFDw\>jei䋪9v}0~iޝ?ب*(*o|>_jKMֈvJ!ze']$E;oԓ$p& kյKh׾ol]8yIv&*˩uB*ں:Whʘ'[z']񨴢Bhrr`3GAޜ]:g{4 )gޢ%qFJIWCЭp|W"螓G Pהy;I^Nh9>uLInbuJ;UW_ھs\?Q đ4|@eUiE%msV80 9'C8r”_XtũnmݱS̹M)핹cgӦp:iJ_YA}{sZ}NC-\*Yҏ!8%]&i$YS h! h\{mվ}-ӔgnSUxX>ݻLjVgmJKNRFn~Nd]:XW~czu"TYEIew|OW~cJ+z*&߯׬׸CHp-zsJ!68uh!dtI*&@Kq~_Dh}\.VM9TSƌu,YS[*M553|źӽu|]Sr)3 gA3θp8N쒮K/ҹSZ"TZQ){5?r.'M5w[$)wՃ,w\aC Hp:}utOc4n`}lin( cI4e͜8V v-hTUk5z@%owVS{U5!oJ}{vWN-k_a[d ;'C%*(jLeZe=}-yw{}t1^HJAw$?1BYbr`dkߤ ǵAjp{?{(};`b5ip]q Hz/:Ȏ[K_;""\U_adH2>_)-_QFWx[]8y.z۵SaI0%SIyVorgQ0oђx7St/%!H '@!$az[4nF?gǞ[̬MENzqjrpKV>l>Zj`^zw*&:*~Ig ~T+ I%"֡Ne>ɮBI)Daoqw5FcOno*uzT,h.)+צlٔ7옟דQϮ[kfSv ?r:!&~S{hWmW'/$  xA:${=n,oꝥ۶ƄRA2`StMP{II~cc_nU->zkwǣ9?umfLNoֶLgj-rp`Sᙙ IDATߔF2b`j{Nz{4_߀l_azE;9sGlBm>ؒE(>B0.#]9w)5)1ݥi*r|bp`4r^ln:m4ݺ/$f0`WZQ!E4v;Q2uI9}zŹ^,NxX6q sߘŏ7ϛ$}5hxkg]|.C>I"vH @(vaϓDhuW\\8=Eywko4_{R9)(*koK~ݺ(!. K|u7rlI!K@AM9E}]KD0t Sٯ6ǟUUnUlt4$ʫ䃥ZUU]{W=ql M4yV:1vq3x$EPeJD P/9O풌AS7ޒsN0 M3B]qtH=ܽ-qC`m 2eӸWw-wb(4ɳ:dJ@ AuT*),j5}\Э-zIY2SvJ.͝>sO`p{9]; tTuRI&DF:L;Z\qzu =H}EnGߺX7]} +GWOPAQiѳ{ccq&J#$i01U!BRY:I#J2kS,Kd:sˎRw?5㭕jeIuE 0M0Z?bb / ݨq6oj]WbJt]Aw(&:ά4idbCPU%1kp4O723?mJ9L-:\+w7dS|8A'~[^]u)񶟏?sN3ڻ@l/2"B׫'Y(-_i햯,:cCQuzIg1j~ֈڐT'ORxb j%I~1~xp ;eP!,jȬ/^)cFiS4oVնnozեSNfr{=[p@+(Tx]:} ^UY/VkHrK #Z&i1BECG}/cƫ ny*>4pӯv*p({N؝Z[dޫk&#j`ޭ~1۳gJOKsV #&MŨqY&i1UC1;">4:zʑ-Dqy_^=܏*>gnp(V=ڹ[Ys*-t{CҸ1MN ^賓=za []Y`;I:gНY' I{M2ϋd@s3-NOtOyT;X_T*,*mD+L)I픚i]O.uNy_ufmg_*,EwY!LF>X7yPNܗ$zn"]W_WTAu kP?QtD PLt$):*R.SqJMNTJR{%kGj$Կ?_/]eg {oA4 _YT쇑\;5X`J3jSP؟(>HRFxͿvDŽsmA}}{r{=g~b< D0IgqC58thI+Jv'"CВ tӳT\UρȈ]iJ//yWx`0^ ,9$y!(>,n] ϬR~Y&R뛯W^% x~W?6||ڠU*k:_Vk_I-Ftw/ג<4_һN:kJ%%EPm4ZxIqzGvZ>st>rNx04kt) sEw%êeT%"I)dT$EC4/oo.8wCh%KkUU!|pCJ2AEՆ{Z!F>h*_>F>2@enxf.04 (>X,ׯ߿Es)$e3|h@ZOip1P|>]H$WH~^X[_zp+ kGk;Vhٶb IrP|1 >$VUF*jݺ6}~:i%,TGM+r'W*{ma4kZZr7lfj]ėz,y"/. ֨eu`C>_|[>RYi~Xk1:Tպz,y}&mg%|7l3ggVjׁ` F>@smW-XnSK @+ƂM`䃅(>Њx}]YsdiuC VN\NwN\fp0k ]7Zeۊu՟vg 5Z0k ]7ZzOO}R L`7Z@_];^^2la2kZ֡@l[濻MؐvC?5XpFk\}ϵxy.A6ôKC?5`"uk{tݓ+~Ava005`x"YU_Vh{~%v@`䃅ښR]䗺uYXC @b%ۡ.1*T1LԲmZU):gfS{'BK6Cu.1FB/}P˶cSz}L8p~6C?5jׯ-ۣoLݦB,f{ak:$5H'ßi?3UTɥ`]a$:IPАmQxzk>k} RzR4Ad0I!$_ ؟[ jÒL+e / xWF>Q!IG|5Lv~g\[7`#|@Ňl~l[m+VFx}w|wQN Q|8fڥJʯج>/U奀d8XpFk>@k_Vms?_BZ#Wk0+Z^8G|K]4wgɠ`'ZQT_ihxxK>R|t]2*]MbiWkTJLd5AFۦDs=E54_|_Q)1ը{}zg>面Fk|TKB5X ZXq>.E:pX-@ʯfkR4]4FN"i`}j ] DBz>ܐ7{j wRzb4j 4~ST腥9u֌>&p&&k>MLdc| )\*RR*v_*=AFMԁu4Esc8Z1#l0bk :z*Q B(>sZX˶k{a:o`ꠑdz|6L`:cʯC(>X!MR1֠Σw;k).*Lj4희0؟a `u[GJ$%Z:ϑ"]?MSiLd;鿅= F>D"DstXh"&tШI[1D&wƑ:Ň"r$z>X_(А5_HBh3v &vG GYn_krJ&Tۦ:&OUNq2 ZXp.wI]I`E5zai^XN4&O gj@5v i\-^0wkQ5w2:,a&U0{H#K0'}4x|GgzJRb\FN֤)'Yq.BBPv .'-> N;(nЇ|9 }5WI i~Wk0!$J ! ڰ\vKVdSO4{; Ho'B *[6.),qC$qC>HJT@WM G֋1^t1P+-/\\FKŒ:Qus{Y/]thgᆪ,ύsH!aea  [XH8b{ l, g3!$F#MN=+{MP]UܺZu߽Ϭs~Gv*HXv /A)eΐ䵳G $#1lsKZQ/r{ݎ{}Ewvr5SfH¬m|׈,>t~63'rzp"w_;eA`i~`NsO~D(1LyDn?=C^̇r(>8h^/Ϟ˳<dž9w, {sÞ~`2{Qa%~ar(>TЁ$$]Ql/ +YU冽ahn=ϞNֳ֕@ՓC).Y|8&R4IrDRÇϼQܰg qhX=v*JTfڗ׎{5N_^ɧ40ЖWyl8>\s$̌暝#9833#vhvN .T%ŇI$>[R|X J7=:}[\33;GsɁ#o0cbu|6Ňn[rݬ>}MX0deoQ1²K}&Uec惓`[2Z3$!f]3%YY)Ǹj9撜/.V|&yRnN>`\Mһ/j#$Ug\#(>T$cbX$P Ň>sĬ(>E&74_t汋RŇ'teW 1ZN/K|(SI/eKm m0걇nY.Y?P|$׊nH2,R(>)S.8jy}.8jy4ےq(>)Ӆ.8jy//W|8 KbpqE[PcI]5JO t0ɄJqٺCpa\*⃓`[vy6<c<]k)>|ZNrLy jk|,<rJM^lgY=Iv%)R<^T[Yz<AiZˋOAiT/P|pC,dܴ<CynK2"$hPN&9!Rԓ)$=Y6$/i >"UK˳:z^*SV/-Ϛf>8lŇkԒ%(>l3cIpdurlJ$gd[8iyN%9w)ȷ41q<`8iyUP|pR 3ʳŇ[IvPCi>1u"EPu[|x.'1>ZIjW! `AYH6* "/Ӻ'%_f0`nIC ⃙ْ0hkK]z8ɜd[ĸhy'ylt%ŇN$"6.ǓtG+0K/$-11WZ|ty-`@ܗ帢zKR|CWQ|\Ѝ+q IDATwEN6`ʏϖ咊y$ܕa*>K=ɔZFZ* 5F1WS|4Oy$_ `{}VC)|`;RJP/)>%9&Ҽ*jIX 94K31=IP??ʿToM}JcŇf۔rZ|P6(]}JKGWW[|8 PIܜdJXVXmK2n{CWNB1YW|pTqrUbG,kܖdmboP$7و|OjI(`RcIMjt0^*)Hva\ڈ7Q|p2Trmxpq1}n2]b(UNrV bܗ$4<oQŇnhRلw\*&m6>]J"WT6οŇkR!Ʉ>51jwhR5b%}EP dŇ6*}ʒKz2ɱz x\oŇ>3>1}@[P W|^O"U$Q,:3]|&}$X#+w:ajtX -߆+>lOf?DP(>|8ɂ*/g|?7݌bV {T\#ɗTdyߴIkrM%_ @Ž!ɄJ)ۗu3Y*>|0IG9i.~ZNx*>M V7%PQIH hV7pMsj|.>/W7&P;N %.>Nv,U=ɟPo%y0|kҙT}j˷[Q|R5NՓE q$mY]IP @ɾ(ɌJw6Cp:GgLef|fV-c'5qmV e/HW @I%W ے[U|`ymZZ($)PsI>UŇ$]K"Jb||HT/e5ɨ-6Ot[6N0XF@ :ɰJ~&y>N[?kkiHjENԛ9{n>Kz=!l?/O]oo&$A4Ez@EɡyDf&ZDy~)>s: +zͬ|\OeOԶYz|SIDE\g"_t d]sikBz_qIʵ[}%~[ 80f&Giav=20Y ŇGV~v?+FMd;vj `mz_),>XzNf-;[XŇj(m@Ňd^ۗIPn>0CBCI^/ҝO[e}xŇ$KW$1ɴ[7HmS 7guܑrF>VoVev39j0X ]|_ _1ЯvNofx?(r݁ے#Jx_^v$*A541}7H57=V%TƒI*jK-"ߴ{㎌ 73džꙞh ¾YP/2 RvxvNs"@,^I>䌾P ^o׍(~Zjŗ^Ŭj8eDIP8򆇚ډ4\26j%)|*fuܽTaj8ub}f&[C^db1>IC%TbJŇ>Q FPiNfL"~Xj5FTB7p UR>CE%|sVn>8*l05hK3E1TJ_/*a_7i6jynq䨾R _61ywfƛ}s;'i$w$y*h?AUMKe|JSC3H?M$i׳wK@1:~>R],Tx -ls5ci5k (c^APK-b_j''9T$_&D+fҏ'Lc`@%A1T$U}MeBn7s׊>="nWCxaur*X¡Yz:>ɸL3k7,..$_'ʨ8zK2Th(6KQ${t묬|oJ2"JKkU=*f .6?3ߣY" ls &9_ՃU<@}UPŇ_J7@e1ATq8U?ZSe$Fגz@Iub_L<_0FVV7cV&jkIbت_ߛo1`=6joFjE ڊI~/$ŬN%l< Uk@$72{V˫Gl,S%HbXwfddv3Ev^zY\Z[ZZI[߬tYZZIKKrV6"͆ 7DP)}EA?~=*^x(.V+239ۮX#zq5,ە8^/tZ|X\R 疳ҫtݫn^73!`IgP'Vl?VBV|$ߖݢrϡ1^I^KNCEF3NKW̹<}|^]t:/DԊ^7jl4]%?qp&U$2IWkj(wL="$9r'[ٕ< _ǽPQP{"P)?Oo?>V6Z|pOoŇnW?wf&s=ߵ( ap|Ϯst&LJueܯZ~6}MOC:\lpAvO1{ qhtLn?Z·^/nOGMWOߍc|V_7UEEy*wPK1uJGl4]-M~;Zmj>K !ɍeW.T7"_C$}NV)|^i[ ƻgoK?[ZdvvA8UInCVZ|:)Wzٜ_X4E֩\oݞ} ^js3$9rjq}?-JOz\|/IJ)Wz39uvI/l놉,mze}gkVrV{K\|8Jy{11|^gais-;CV?u>5MWͯ&9ѯ_W)SI^ysfn:0Ť KSusf3ْh4[}mI&P)}=Ň_JrRw%)yn/=3g eM'ss1B/ÇNcaqSJ'i Gxi;P)'@~X)w$ 1J'zl:xz-9k8g7nNS'rK}[g>[:z@_zKP)O~m^wg6e~63pNwcry|Μ&ߧ,乓^9af зUOߏ{oÇ|F_MrH yB>(ɱֆN]̓G]rʦ|#sэIZ $/Q&Sc}9yvI/jj\IxÉ<ętuUlq=KlsIFZ+^zru٥>~Y\Z[ʞќ;wX*j.$EKp/+e*ɷNY;# tL'K˗+,Rk6z^=?nۙ߱#ngȷ%CZm@vNcyWB %Ϟ˓G煱V:}~-{.6lcf֙\{8ͺK_IC mƹSxtZHbN8c/,*-u,Td#V_żjPwϟJr*L_._f;7r%[XZCOƩ3Frnv[97IC س3XjiI+``5t_ߎ_lI~[97$z1\s cJrn/,酜]Rn6k"GQmz=;u.`P}sP9?mv~ 'I&W-ߕpyGO-vϝgq$EZz+jepꙞhؠZ=SkHGMAd?D_xkJ$_7Epin7}Lʹ35Zgjέfymygs+9vj.z-{wFzVzv}jk%ͼ%b_6hEmx6,->j٥W.nч_}T}~)+WCFڭK?W52t(`Pm=~݋6NrscVw饩vzy\>?>N.wCԊ^ťnt;#m+$_)ٶMtwDvϝ*{|CLo;n-;Y/22ԼknfR'w'dlۍ_TF۽Է$F kJ%Y/rסɴW># Zk v?m` ]P9z问!_xݟ&ynvn1zt:n%oX#\3ӹev~%cyu;G.8bp>tu^VᨖmjҘ??Wҷ'!;}n>|bVEn:0[yK+TגQt,c|m;Ҭ<i&PI?9_1 n<}~])Y}X';ѮܱjEnv,Cz>ҹY^3i5k~e_pPG3:̞Vͫde/dif{4Y^^]l(YYP#ICIP9O'AR|xqoWJ%9' 5^v{C؛z厯V+r㾑 5O=y.sWQJ|l&Ft(L35:qUǿ͙˙_.rĹ:Qњ Tdw~2G ]x|gy-T|齻wf吮J|\z͛TsKyB~c;??zX[S!Y0j@|g)1T@l4A*>x~LXϞJj;wwPj+oF^Ʌ|';=r"s:FZ|z~%A6%ߕ4bXfSݭfΙ{tF[y+R]bJ>SgN3v:|Gb/}_ܪWw%$XnMӨ=f<f1ϝ\ȑ糼rAZVz~|9}vA'$O hd问{Yz&kbXnoeiWm527߳+ߺ+P#EIYϝvdthcn_;GN+<;C%$5նF{<$K< cŬ$jENvdU\p zI:[B'ãjYX3#͍^3Oޔbmi.s#^B`3|6QTι$/ІOIޥW5Iޖ'E~n/=?م^e2;}3Y$gt:t ^f/mb7(ۣPU>VxHo٥hlK fQ `Ü?x"OOEͯ\ IDATG9t`,2PfVTzv+A-> }PoY\㏞}tfW2vfzbܰ<_||rϡtk,ex[PIA&y_I8O'u>1rܸ,_]id+_|LNs9-^լef=311F7V-5'b/>Ň%y8ɭܔ(޹|򱥜O^ę5:^^r/cLi6Lxw$9$Q(>}I2?T&yq76H;7͵{FҨo s+yٹ<~l9z^yf6?u=7dǨ׆|*$.toPYZ`\G>Ǟ=sC{9zyW2NY}h91nO}I~$=eO(>|̀>^q0ɨ6H+osWi2[B/g:/̭Vd׎_.tKK|3'Wl$-:kwl'ړ;q"9ؑ 91?/ZZ&F}RgrĜNd*Ǔ̊a+pe1T?HC W(=7ܹ3--<$ɱS #/dqOո.}:^|LZ~11]llgEQ=囹[KpJ>,tw5[.dv~Es<#S|xwdž Uwvxq*.tϜ&wytz3$Μ_Of1*ەՍ^+)>'_ 5pe'ڹ4٥uݣXf؍Z'k}c9|b_* U `3Yljz_J"w&9(jۦKYj)I8r>G_&{dֳ-EYHcMzy\V:W{{,`Ob4~=GP$P kWftQ矛[COMN'FgҨH;uf!OYj$b?J[bx-ŇaT_OrH ksDƆʻٹ,-ojAQ$<L[Yc!^/_ro@ܜ䯊.L~6SbV&˛׍k٢J;YF9ٺj&S#k~م9Uϓ4PYO$b0Ň[IPiߘbv#8FK'Jg0y=վ>0NƪK˓Gfӱe4P oHb82pi?*Hb;G29({^N.Hf23ސϿnHƇ3K_tTŖRUv*{pqv>OޜZf=7]ais.cR+rݾɼ5ڰϯՊ?捧W:9; ID o:~ŮEpY?dA $ 1ҝ3>\/ zyxoܑ{[kvdzb>.JԌNn!ɏ.XCݚbv=&zHV [Η޻77M9Z+zԚ8~j>+6~JInC'Q1\:\kI}T%[ۑѡzQ}7MjdsL|Ιm~dD=[k;[D@Ɠ#1TZ7,U6'[v'I(A7nfTY/oOe~q8~tO"~/ɇPi$? `PJ27A"^;oIڬڙ=ޝq-CI/u\w`OTޟIbMSXr7B"w M/eV˓)1TYqI>թPT&$]Qb]ذK*djݾ#'M+.frCcI+wn֧{?|As_VdbNF)Lے< nMO*LV3wGc~P_)>\n!ۛ{ v3i J7sMO }Q|r5#bf1ݓicԬS h&+p:I-keu%{Q_+21<8wvvӭ ~$I[ YJSDpU~*ɓb?bV%'O/g_O7\!Ň'i؎ΌnVzncJCb ,ɊCݞovEclp.w&U L,WU[=?IK v251R˱ӋW#1/WIacx#by*`;9J6K./v¹t= H2);=bzc!ɿC_IP vPײgzd`ϞrM }Ip6HB@kԋv=:e~@(:e,Oİ1ts>f?7&&1nd;`2s2,Ç2Wח]qV:??c}'O?6: LU'(\Re5Lɘ|͊+o[?:-[zN;k`zxUF.ddծ+gϕSx3: o2יnL;0 ߯^+3|Xa4 X\r]4y\_=8>;kZ8f/<$3|X<-8gX~{La-}uꙗoi&ՕdȰ8 Y2c[L=vߵ:`{[~s̾2uˤv:Ir23-2,ÇutUFgJ)I>ȥ735 s[ߙnLՑ:[[⚫Y2*[5]ss;3:۶6nҷ|n~㫛0pEbW}^Օe&Ѿ{ѕ.l<O]WN,/Woa4VU/˰XVn}I27WطO^yv_|%<\` [ XQ2,o>,Uvb\=:J `\qc=ſqӖ֬SXۙ7vYk۴yDv 3o.ܣ;0v #I1ϯ>XT `9\JN\aEN9 enn"~κrYk s0*/Nai>,gWTJ1 T)VmY/+~KO>mMrm7-Vj ^^]F8;âea^&vZG.ՖZvc?8euYm˖hxֹw77ٷۭ+\r dW)0|X>gV%Ũ>`^0X27͵"u ;g8gcg^٫Ov:W٫k^yv^ilTWaT>,ayaͥVo#TZ˂=~Zlg7Yk6vk,Gr3_,1|X^[VbT^V}aY Ώr\vՆM[:{͆VG?;snٞssִvݦn|˴^;r'oAk2SL ǫT,h\RKa-3/ߞo鹹6mYYw)[vskܜǩ _d4ٴyK'm !ZX9Z-0|#3|'W0JGTW`"\z a#`0?Kq^Sy `y԰+`o)F92<FeXVO((z a0.k0ZVLe{տ0ZO0stIFi~^XZ{Vovb>^Kq1|VdT/`I 9Ǚ8PJzXAՃeUߐa| Y2dXT׬aΨa 2~ `Q\W::Sq2|WVanW 0Z^#x>ۖF)FmeXPATm5'x>70Z;Wo.+Lw=fQ}Mq3|\"hVu eTϖa I2CQ_Q{|F3|o/è dVa:>LW0Z{Vov`bVaz>LTϑa~z MegW?az>LUߖaԞаKyb~Nh 1E φQ՜_ dD׭aU.՛d)C [}Va>L'Wg0j7^$Ezy<ݙա2L'Çuj2ë+kF4t; F2Tu%2kd^mKMRڞ;f=aSȆL)ÇFz ̲WU-轠 a6s}F aY2g0 fچsRef-0z[S/3|aV5kLֆ"+O0 fS0z׮^_r+TגbN.0|-Va*ܫz {ju_#sd}[d ϫD`JX=G2Ç4FoevLWon^=Yc0NpRSbb*< avz Swdk0z a=:[WY@ S0Ω-2|m?AY@ e4yJSfGVa*X@ իT;K1>YZf\<)^# چsR6~X=[+eF05Q}_  /05X=Q`=z S(oRLP`BQo2Lu 7KA>Q=SsRF IDAT՛`zSu \_s2L7,n{T./L2paj)ͫLիI15k8ni\\V0U:L`kʓ3|⼢ S埪,W TH*(\aՙRLQmTm?t8zh}D \UOaVFÂURLGU?cyC6UJ,S-[e>5SBrJ)EzSu)ϫ1|`k^=BspE2LWg1|`k/ΓG,Va꼲z l 0u^RY`ܱz SSd`k>-έH1UviX*~])t]ծRL-CR VSsنN/LVmaxZ]ބV 2 W6H1uZ!VTGUwbo8}l+f9z VzNu SiWd`{>#_}Toe.#nP3}>\!ᵫSJGT^*T:jN ;!~M՛ߗ5Z,ԙZB v კrO=Uוw{J1Q,T_a*]at)`]p)7`BY_UVt톉'`v^S/uR XHjxt- ٲzcu)B1|`z SE}eZ^% 72LGV/̌Wajz ,4Yf)s7ajmΔfbt<֊RԺKL>!eZU L[5Uu|ja>6UΕbjQ05nT}KuNÑZ`>~P=FR]}#b2|`)z S1ѺBRLWofRy\eڵO }Uחb}z ,ʺ 1np&RhQSϪ`)>_RI1~zWJ xTon/TڰKKdzwT&N못I1^XS ,T0,&T+Ub}z ,5ӥzE8ϩ);a)Xj,TH1m`2Y&嶹K1VVk8gXZ\,;R _ q&^_[ X2waVl}LOTϖa&RzWJLYknR9zO320) $[CJ1VUo ,;f0KNnE &R̄=f 6w35O;C & #d{_J a7_-xlE4LUafS}nZ}O20 d>-wR6Řc2|`m" geU7WK13~^TmIe;uԳǫJߣ(X_i3)dqd)Whq})b]Due)fce`>0GUG0SR}nU)/^#c`< 3cJ捇Yd`,  P"LխnpR`1|`l~1ٲ_`^uLu9)fZ0ͨ>0FUOa\hu')AmpY)fV1|`^)٫R0Cn_}G(#Y@=WE fT{K1s>_=I1zv0L63A{ʈ>0 Wb欪%Sջݥ9Wn9q!՜3gUϤ&<*W}{/ezX)0E]=C Rx纽VQ{}ׄ`R̤êgT\Kyf1<̞7 `Z1Yka*>0M7YYz㫣2{aXqf]u'R̤տWϕ9:"GϪUJ41|`wپh{qLW!Y{uL/8F_mXдYs2w kR̬-ՃI42|`}GfV{I٣zwÃ̮#iwxò&fUTKLnR̴^ Y'di>U]Y  (n+LLq0 K1nT},k4t3՟W`>0+ΨU-LM` J1m?K)̒4,r$LRL%pUix8A f#eyU,. ;.'{\u fK0>X=P A{yWYczJfޮä`=zK3e`>0檇Vb歨YU,;`eÉ /}7H,KYa7zXj){T#շV`V>0Ω^T T./`#սY`>0x{ n]}lkUVjuuR0 `W6HAuH%IA_U).CQS .½%\A '=^7U=wW yh%POkecիd`?+i+ko;z =z \3v`&Zz\.AJR}O r W6I.ޚnՉRp!_\@ ps՝B~аt<)>%e4) ;K0n_}>Ψ^*\<t'UJ\P0)#U 9g])>9O^ .djSae㤀Kg[/QÅ=j_)Fm]աRk6WWlw53'gkH0JW>]K ~\h)`>e"ܤbB26՗IExZñ60|oտE\цW1|oX,}\'l;~fE[UaA߳iEuXjw9?."rLݪ7TϜ]C!1Rp1װjRLkTV%v>gb^@)/d4 nv,=JؿPQL,G4\p)ߨ^v,s{T?a `Vwud\?Δ,Uw~./Uה`QVRp ρE` 3)ݴb@,;V_n!d7{@.'IR},df', X@p~a]&;6TU,4<پQ .VpVTl K{R\zwiwmn8}R0|/3`ܻJuk)~ͫ/7<[cKC-R^}zpյ`+lRI XZ<^W=,ΪEf՛VVS^ Xz|z!lV_n"0c~|.Esc#aUՓd`\:YpHFR ^&,X~GT'`ꨆ>G6lW.,/ Q l^RQ `rK2nXsOq߆fG {+0A `<:\՛WԪ;}`S%`>y?`[=R#sc`;{)0q & '?A `$TL a&Se`;^zGuY9 oY2d2|WN`;YR翯<@ \,fգ-RV}zn2۹ᘜVה0pf@}VVV%LV}zVscHՃMRnZ_I,U_n'iseR8>z`Q >U{,ݫ#Uv\urr`$ `|Z/;Kͥ-U R>8A vWOy,>W]Wv0)TΗkuvիcoZ_&0B0nVtGHlCoT(;hmu ` `>UݽZ-;hՕջ-;^ o#f3]`ܵa)._T'4 ;R>8}u,Uo569VX \'L.'4 / gmT;X(?l5)`z>~`] 6<մ0v>T]Uȷ %L%Np, O5}0snTBbu! SY ~X 5Q.agxGRt2|v^uRoxBrԺeJ9X@oVL`ݤB.={Ս`j0 `6lY=O s]$TmދTgcniҵV.+> >U]_\' =)NJ}Ѹuswi K ̦V5샀v_W%`C~{(a>zw-`T}a'zr^uӀd]3`\${ɛ,ӫI8uu,{UjX.ފYCUI ՗`S:d_}}`_~Ñ^3|.pjuoa1aVϭvaת;"HQKIΫz,]CwܝTϬV"{Mq^.`գ'VsrȮ]}z_;`\z]`1UϪZm0QuQ =o7 Rf;5,Nu,M?sI\y]u\)X{6RÂ2`ܼ:. Y:k{U8XuRDnZ}ap.-`a.5$ץ` ?nXH}HB5]H\`kRݩ,+V>QPG` }mu0|Y]Ic_vC٫zNw%gKl-`[_=K ت꟪(&fNJ#NU؋U=êU`](OW7)v G,]Mئ-rY=] p g,npLu39_nQ}Y `> ORQ &āGWWEtu`RX 몃5,I;Vj_IX@{VV߮Q 0W^=:_`>.re{)/ջ6o'[VէwTד s\~ְR0~L:rp^;zn'XNGcL{6,>TW[\ ߵfLWVP,肥?hB\Qt=a߫_ NQRp'`B0$ {WV'0>78)I`L_Vw 7 !`Nvs;4UTtד zx;Tn=L =zB v}a0Ni*)IdL2{ T/jX@jgIFa C+K|6|L_VRB Fj_Z^ZS CkKHg~_HL-P=:8{ ߮Z}a7!&o:|zSu=IêU 0ohxR0"7^[}zHY,]6yt"0'7E|X>cs\uR02׭^-M%kÛ'4,ucVӫ{TO6\a1C=$XGT'5zIճ?N`ë?~.#t@܆!aվ,4auduUIӪW"0F}iug6b{Ugݰ Gߒ"]zu3$aNo8f &9i`LT7ۻzrqLGWߩ^pғv<}qzRF?ذzNFn oAW}:x: cnT1|զi}`JܶzojgI)S_>S3b0έp9ifn8L߭^[ذb_I)WM4<|q+I"_n^M `> 0X 5V'WGTW+T_ÿ$L7|3|fź'z+L}7,]<$ܠ:ᡊgV)sNSϗySu8)BUp<]r&20VT\OuBj,Lc~,1|fWϪ6~߫H݆~{5<0=r鴥`ԏPIDAT;U?5>܁Y,nyɧ4tIer}U?.$LT F9Yd̺OV7"Sn' O>f#p{ա{g1Ke⯿\'3`NG2G+}:Z) S՟Wg:W`F8 Xh~ҍ%aF|Uu_6 K`F\HTwɑL[1l^ 7?i]Q4R\fG3_/8pg`6sjEhÒH NÑ '7,<0oC'_/\[f1/E3|dUlXIfѮ "?!`]-_* 3h})p .\Ұ6섀Ym-;5rx['TwQuߵvU ㊑Q,(2n83GG 7XeP\ Ό#Qb BHBNw-ǭJ;TU?UzsOz9T?>W/$85oBMne {9|^5%UoQ># KlX8jD`wcC8 Nu O'X|bU0꣪?S>~_w{P?ybzVCpcCW/Q>?~Ep/WW/0դX_SWd\"ܗW-߽ZgpeTeaëW +Szv],ptrOzUGVܯKoLV͞-ջ*__eQ곪OeWU_0~8iՂ8֎G c_>Fphmm^V7|aqꫫS>̎v{h.|Xӳ eR>WT/, 8;s"+)R>p\}N>6kR>ۿa/]″7v{H;{pS3;?ga 3w@UKX.hν,pdznw;^Y5~WϨVT, sgRmXZ3"wЁn=t[7Mm.kyjvō|u7ްi36cFGgԶﹴK z|ष2yU ͢ V>e"յpnn'۾{{P;{pSlV6Ϩ~WѵzAu(hKھエYʇ3ʆOk( n`thXd.0Bwq/ʆs{7"q eӫ"0E07_}.aԶv_ҎܞK& 3VO Ǫ`y2`cyl st4vo5B\հSKoS(6N_UT}y?RG#wܲ*b] Vャil\۫'5Ok8nkXSբ86ƳTRG/J68g-7uof۶x=WOnX ՔX`d{^Q}[u86wm ɻˈٱO(]h(>#9WPAߛW__@C$0;t:G4ܞKڶ]HkʆϬ. frySEojfgs/mBʇQa|ꆏv kon` #>zQ :v`fvknfw^ 0v>auÓ Os|؜~پ PG~hzl]]4&ism-l< {}WuPGU/ &gyas{sHcZhlx{YcQl{Xlz0k6n;O$1=[n-7 rӳhyLEm۾'DkbqK/TKܝl-U,dt'ua3;ofpLLhi06㗏k]bMgzi=խ[ӕ R?Ejua35c_cGX3ʇ+ Wk ljR}KÊl[ϻϨQ\$9lmP}1'ܖ:z@Gjbr0i㚦|> m2FiX`Kql].҆ 019잶̎k_إK:konV>}ճ~E`Z?xS;پo(%kpI tN,[ pUϭ, VSd^=aď6QhiiM| ٶ-ofRLLN 6UX4|DezR=qpObpk~?w619Φgw7=m{NR2<_8 ǪT]EpCՏWO p*揶p-^hjfrgm? X}t* pX}K7(8W=#EŅ㣛n9İJbvW45陝Ml|bJppvU^=dr&`5T(8[~UWX K uu<韭pڶcuf=QY1~C S|t^^JwfoS +&&6q{!}  C~].Op.mh?T>Fʪ١݅k4ʿ+++.i0`,VU}ku88SX-Uz( s1<6\Sۛ6\۶_O5mƅ [8v5Ύ=]wvnx#;TX6UߞͤX-ʞ\hxQy|&皘=~>}|rj&g]foPK --=p>p˯;l۰DG50^}YexS3ML49='nbr'WΏ:>9m*XZZjqh G[wkqaؑiiiQVsSn0n VHꛫvOLޫnl|k|b''k|b''|K--. K-. c--.89VKK-miqRaax0$ۇ68X SM` ĉ]VM46>qK ---{Vʄ-㉖jq gV(*֒fK7΅0MO_qz87%q0*VꇫQ>0ꦪ/\lq\X.q0lW6ssC8u67U:_lr^XLuHl6TZ]*6V?^TJ6 8.?5/Jf1]}QC qXzYt`P>ٌWϬRWP͋Bf5^=`mWq( uOqpuc)l%Vϫ>AW?Tf$6;[S6F7U?P(JleWWϭdz]՟Hꛫf]`+S>qTP}cO+W"P>}^}i_Gqc;)WOxqOTZ͋M[u ^# x`><=!U͈`;VzoFgV^^z8(쨾*qlx_|3|{O}rs lW?YZ 5czvW#`kՋwV3 `CskF~k$e#W_Leeҋwև΍Lϭ-U2Zm|skzJip6߯^Z>Q>_=rqU^R$80zƫ'5 ՔHeeWӰmVCheV$M2`Q>c5UX6.!hr MåW5x8 /Vll|n(!'`^]RjI$9(`V}zT"Fѿ\fuH$(`k_}A~aMM[U !@zU*l]SϮDOWW l=KX&̼zEM1-Wx~}q+Lo7p]$dTWOh("X$Z~KW"8]'6_R/ؔ>\aVD*p6UPD|vS$ذ"΄X-3է5ϬD]5pgK +!>aeĬH`^_N E&fkVD<#8'nPt8(`(tͪ?D$>TAHg`(sez|j/ W7V-Xo`T\U=x8-^0R-57(zHÆO> `z[Ck߉%`]T=ujHآTTnHQ|6q ^}6V7zS667F)յgT;Ewp&,fkϪ%6l;Dlt`xF^Do(7To (`gCE: MMlE;>iե"`\iCEl%#>-Nӡʆ7TY-ت'2մX8B o @W2]ClY7tl"onN V(TRΆ on,b85nήVE\S}LM,몷TR}H,gFF3}RC`P4\W: ա|X[+X_PH|juX՟7p]A4Q>;^H 0bVV4`щ:hx[uh6/uI' pnىEûl-c+ G5sXqk;>(JYKbeu)aS[Y 8jI<7ûw1qe5.0߽ wT gBZP@\Y=xqx`= #UIzV]PH++'\McV|`LUub1r<)"ubr:,"FdouI8! #`#:ZRKC8ZNf`> 7U `3P>/n($..X>N>p|Zd܏ 9 ejIdl/.x1.,,3"۰7lT8"|7PZ1}N?cGJS=n]`2Uh("fϧVULTFAmmjĘv->gk?=+Ɨ';н7>>TukG;OzmVn櫃 e?\Xc/X~ meo4IENDB`mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Stig.png000066400000000000000000003462751341747546300214570ustar00rootroot00000000000000PNG  IHDR@sBIT|d pHYs\F\FCAtEXtSoftwarewww.inkscape.org< IDATxyu}}f&3dM (+XY[PԦ/HX6ԭ E@m}ܿ?>3$$!3s|>u0<{$H$Iʒ&`$4c:` 0hM@+Pw@#07nޯ_}Z{?&`#ЛX{޿ %I$e@$IT0}? `zm" .b ʒ$IR8|$IvmBL&67 qjvU7^,3I$I;A$ILe aRov4TSS9!@oHo$ITX$IT4i} c%0pӢѐ$Ir$IDؑa^ٳ7{ W]aċY_;p$Ir$Ida0m9hWMʄN b2X$II$ &`:Z^>`xNIwS_VE%IA$IJةZ``azoKe+C% '"$IR9|$IP]|a>;$J$I_$I;CQIi^$I8$Io*&€@`tR2g5Ḧ'z#☥$I$IjSr烀C{f`rRroa hot,%IA$Zװ``TRjFrǀb$IRu9|$I*gIٳļ$IT1$IkpXgWeYF$I$I8;C$I|X$Iʦil;hx3$eC7 $~c$IҶ>H$7mh8hHe{Hx$IRD$IWczs$a IA/?IaA$7P: 8w5HR ߰u k`SF$IA$Z:l8hH#݄~ցʨ$I $ILc0!j#I`O?,$Ig$If/qaqHoK~`A:$IA$iQ:7Jj<1M?^[G$)|p$IV}Æ%IaXK$A$պp0ap4a$)67K%IjITug@[:Z [wF<$Ir Ij8IaqHj {"~[G$>H  [G-x H6$I0$(FGIR~tvCM8I$)>H<80p8h[G!pOOŭ#I48$IRR:84nInaqawu$IvIuSwD%nIY X$I9|$IY/pp&pP[GLz .0'rIm8|$IYqap $I@#tƭ#IjIK 80lx:$ ہQHA$ FT.u$I*^X-IITm ÆӀ1qHT6?ĭ#I$I6ޜ@ IcSAʸu$IR8|$I20hn`D:$i7?n~[G$I4M#Z֑$ICԷ#6{u$IR^9|$IUA~`t:$J6?&숸[G$I;J&ƭ#IJŽu$IR9|$Ira9@{.$).xH֑$IYA$mMWE"Iy?E$eI0QH|z&@G*$)6$ծFcN֑$Ip,.$I5$IPG"Imp;p p!IRp IRm ]$IRmzp77?Em"I$IJN>nI$Cǭ#I$Is(p>5rI]Ye$p>HT {'r7rIxw]$I9|$)J c$IR1qHp IRL>\$IRU-n$I$僻$IR-s7$I9Alk'.I$I]$I$eI]$InI2$Iqu$Ir1p=paw$I$Iq.^$IR=H8ie.$$ H$Ղwk'"w$f8|$.pᅭ$I/#>&IT%C;ZH$i+d$>HTyǣ$I#$I$UG+I$G2ITa`Dh%IbH&I*$I*SZ"w$IRn ̏Eq Ikn]$IT}eNÑH$I=GW}$I;DH'$\p:-H$);+rI2$I/Br`]$I] SX$IA&E"IX| nI$Iap>$IO½OD"IRT$IhR=@].$I*=rIp I5 .ᑻH$/pW"$ 'Z$Ijo]$I:+'3CV$I#bo=HT5$IEU |8 rI$i{_ Es I*:rI$ *p=9nI*$(F>LE$I;!n6F"IҐ9|$]3p`j.$IPu | $IAW-ǁ+]$IJ[$ "VG"IҀ9|$M+޴E"I$Ur`].$6h> |$I4V_! !By$IY =0%rI$) lEr Iʪ^鑻H$IY3o@w.$IR$/E$Iʺ9|E->HH$I9i.$9|$e?."I$c=vIRms Io]D$I*?CT>Hbx=9E$I)#HjIpz523=H$I.).ET#$i8L>4D"I 6X#;{cy3Ǝ$/#w$ ~IR5> 0:rIʃսY՛5a`=gݽm" j!kJ`LP4@=0#4SF c{Nko$镭&gHTq$IP|Hp,K ,] _5зhb;N=;o200Z".[Zc$Iv/c ,_o8DȫE;0e~"a.IE$0-rIR8|$UWc$ ^/2FR{vSJIR^pdc$IPIتql"yGؑXUއp$eEp|.s IӄOFER;I `/ÈiAk{_GBbp/$IA4P  ]KRdۡB<+&>@)Z3I%W͑Hr$i $C*i=0xa,!b/)FӁ;&}QN*YQLߏ]D$I'N]DR" $aPK*)l=(bT?> <$)>Hve0[ERά'$)ql{D}P+X$)\\Jv|`B.x0XxxxYJҀ^ڛ1f)I:š@->H6Ko]DR%   RQ5fہ1KIʤ9]D$I}H"2a1fxeLaہA}tp)EIRsq(Iji)rIq,'ԗ$ [Rm|7Aj۩׀W."ituGÓx !qp4p02j#Ii!wΐAj1Hyl;h-9j#Ix [l:&),%pñHI-/} !JQ]DT=.$ ۚ? E"iz:hS Ij: 80x 0"j#IQn>ET$h]Dn"p?QIR>Gjz;$ B."I,T,Ӂkw."i#j)p/*nI*f0xLv~J $Cp90h[E.,!j)p' nI wDm#iW6_ $i>HR [K8JowãqHilq<xI"s I?Hbag}yp$)2 6' |E4$)J="w[G4#SӁ֑DknU$IA`."հ;̓$4 ½ qH51"E$I$C3%/ H^KD E$I;Ak,/ᰁ_P&"N`T:RMH#w$?̒l:3vV>1w}`]:hN$ "N&ƭ#ZN!$)[&v;|$vwqH p$ә{qHva,vIRAL`&0>v'pa$I š,]"Z E$I$) K' ÆہG#w$i{U R%\̏]DjI'.Z#wL=)Iʏ}3G39*c p0 wJR.h$)鄭o]D*"w$i$ !!UyE$ָUOK@s.R x&rIU9Eʳ a]HRp I ."sw{]$InoO/B=| C"T >HRhEʛ;n#l^I ±LF"M]$>HRu |86r)O^~L8܉$Lp/ę]֑r7GOIT p1\QHy !AN"8 h[Gʅgq$UIvFEx6H@8~E~D8qHA8vGH 9?vI$HJy1g+HbGBk c20 hF I0[] 2IT< 6 `D:RtO]D$IŐ~7L.HZncB@ I.AvmIHx$IڞwCHsHRV9|{7p3G"R7F"Iip&p)pP.R ˁ."I| $v^c;݄(Hݗ'?z1f8S4!Iچ?XmEa&UU$IR \;U[><$I`=?9cpieH$UVa}8< W6~W$I Uc#=P$Ilk!c#?ĝ?$ռScl5[E$ը)_fU|G{b$IfxG+IlH&S+)W#$IRMx Qcې$Iʮ8pD 2EoH$iL56$)NX^SS>$I 5Әjdp%Ў$IRM k,c[QH$^ Lc*y|x$IEHصNI|(g-iI$ Q"/ٝ' A$).G1H$i@%K+&$IT##~!]I$w0y `Њ$I ӘW-H$IC`X$IT Z,_E1#H$i`$$IT |eצ,K"I$L "̑$I&V5fGITd9e`60I$&|HkWcv$I5i*`#$I^ٛ k̎(!Ijȑb/Œ>O I$ i_}#ITpgm&{Y \#I$ ^ 8k\cg$I (fя2/"I$UN3_ӗ2$IRA4&B˘t.$IT=に k`cr0 I$I+&n5H$IR>%gD$6o$I|xT&q!Ino&)W H$IR>&g@H _$_Vg"I$In`%L$I|o&y I$I*/E$mq9ߜMr 0 I$I*&< .$I2)|e-A$I$6|XGg1 $հ~C6S$Ir? \$I5c@ߌM~r+Ќ$I$զ63IIjGq`v? sI$I`=L>R>$I5Lo&yx#$I#4^@}"ʅb$iGfΜ9\.JҘRTW.G @KTQ.$iJtf`r.`ewuuu^tE$I+?H7^I." 9Mx v 4pM"b={v݊+(JmmR-Irܖ$I[$mii:.I6/ƳD76MUI,+$Yr`yߟwwwhll\~y-uh!IWʺê."Ղ,<0H$"ʼH^WW7$ɔ$I4{S{?V$E^z隨 %Iq,bQun]D*:R72w{?E!Iʸٳg-]tϺiN# Mt$ISp1ˀ$S.Jrd}}\pAWr>EyHEAcEy'o-IrKƍL/JӀiry:aа0"jԝ$INtNO5{$I@=}."zv kkH{]Ӂqi'G$y4IGG{?S{ j`~0v>Hz~I!^{^W.^$ɁժRĈߠ)]]]enXl3Hf̘ACݱx(dIA_k Iu7N9\.T*^I}}=#Fؒ-K]]ݖoT*UWww7rN2]]]CWW7o~Y6mڴuWW6iHt}$%IrM6=|oK { ;UO."CTfڻ$I&2#IFɨQhjjbԨQy@'Se6oƍٰaׯ&6l`ƍi::ߦiKW\zk$Հ&`&pn"ʴzT%EYg Jr$Md֬YizH=6&ZZZhmme$qJĺuXf k֬aլ[r<5z4}$IK]ƍ{䬳o,I5|Z!veqE")DQ(Ark}u]]ݟ%IrHMDT*ܼeZ YR.YvaD߯W+{4O|fT#n{ s.4k2nݔ [+GJ4=;3f cƌaѴʨQܹQivZVXK/* $RQwwvtt<4cƌaَ!I*=.̺8g>HCS|x_"ʬۀ$)4MnהÓ$9"M#G& WFرc ƌCC'@0$?L{K,Ō3C `"ʬ~{4HK.LJ/DId֬YcoG ^{LR)ˬ\:::Xl+%I.R?)I''v =\X %Io."Io}\$ǦizaWC߷67n{ʩ4MYz5,]KqJ}IvYgU)$Y7{(.]B#|Bʤ~$ՂYfir|l$V%I˜1c Zf /fѢEtttT꘦&I /J|AI*ÁEڱ#쐑42 ^]D_4Mַ!IWW{J%Ǝeرc=6IUCGG/f…Y_vn$*ߺU JRI8ߋ#]B|a8As~"?$f;Mӷt0Z߫3aƏ㩫{Z~=-bip͛gSZUT-#t2 |n"R^8|v߉E9‹%iȮ 'pطߧT*1nܸ-C &Ro%UTww7 .d,\p Ig\/M:JR_]Ds4p0*veJ'p!E$)f̘Q?q7&Ir*p p0Ua8rHc=0a&L$^OOK,alڴi(_4M}Ĉ7wy/U$'/wRP}0v)>H@@["ʔ?Crg֬YOr|b$R~kk+&MbĉL4J )S2K,a̟?A}4M'Ir|%\ ה<:>0!ve sbჴkI>{([.~:vIʃ뮻nr$''&Ir"ƌe0qDFrjWOO ,`޼y,^ry'C>5߽K7W$tv‡>GKbჴs/?H}V."IYuUWljj:T* !TxB{{;&Lpg ̛7e˖ ,Mi~.ZX~#ۀcQ< XEk |E)'\0%Ik}U}}iY$ cƌaҤI[v6455UK5c͚5̛7yaÆ|Miz_xIR3 wAH}Ncr p3pn"ʌ|!rIʌٳg׭\r|2p2J~Vioogĉ466VK5\.h"ΝˢEHt0_$IdɒϘ1c:IR%g.L R8|^..n]Db9s8N&Wk3aN^{1J0ٰa?<< ׯ̗x.Iuvv^j̹, m8|q´ZX$2siR㔎BIɓ,nI\$ɍ\pt:H)%\HYAρ&(-N]Dӌ3O4M PwIɓ2e ~PPʢu1w\ΝKgg@u לwy/U$e͛;I(S{b hC,al"4f͚5\.${IṬ-ɓ'{3]]]̝;gyu __$===W]r%KO2d_Ž}hCcwH9|"A*xnr7O),]Don , fÎ4||u=7?s"" ޠAyqkp_߫a(.M" /uسW;XB|s'"{.%M#DO׹CDZZZy1cоOYYÇghC~ݻw楯cٶlٲq`ACĹO+]GI?QJYJ?> *9aphmmh1 Zii)#F`եPDUww7?|_VB 4 .H0 6 -o[7p.s)cJ!ԫC']U{{h49Aj+**#GР"6h_|'|+!fҥKi 1aCĩ )!"AO/jѮCĩ*"Uw_0Ì1ѣGSWWj߾}oK>tҿ)MD$H#;qCĩӀ͎;DN?uJ>(}qQl􇻈dիWnٲCƘ}}UUcǎeԨQPD$ycݺuݛ_{%K<< w\S:Hr~|u8v!""ɲ֚cF浡PC2fB۷o>,O=]]]ɾZťK%"ͪ[YCĩ.r!N>Hw#ĩۀ^t("R[[YkzJƍȑ#),,LSHtttOFz1 k7W\|ŽID$??Xk]GnϢ{߸I $WM\3d1}Vߟ566rq1hРʼn7`ڵlذ7/MMMKD$ qf9I5 $ g_("Ѯ1KN<#Fp2p4qF֮]֭[}IZ ^ztk\G3t"J>H):7,p%CDDzD>hO!=c̘1wqia>k-/?8vJeہ| .LcH:\|mNvI $`5^!>c]$2& XkL5#F`„ 3MD$#EQ{9x :;'H.D7p!!"",_߀d^ĉIoHػw/O<?81bDzDDЎ;x{s(uyޗ/^=i""%I~hEr> uHAb!mns""K$hi>eeetI9cmH"6lfǎɾd 7oAsssK'DDz6<@`pOC\Hw%nY ^7n&L P'"ՕZk?tO:DDRdJ!MdCDJfE_C$pwp""rg;\|$jhh`ԩTTT?ND$GuttvZ֯_Ii.R=L7!Ӏ;DDf7_zzõF ӽL8cP&"m?͛}n]]]\lH&uH_h 2` vl硈dիWlYc@aO5I&QT{EDaÆ H6HNy8 xuZZZy `zOVVV2c jjj(o:DD䀶F')S0jԨDD7:;;y'xg&m$"h族HW$i `:p7:`:lO9 \hiJW__̙3)-- LDD^㡇b۶mɾYc',YtvXj2 IDAT&Z?td $awhkk2?~<'|2P&""D$G?hp!Ԓ4|LV :DQ!""+V(*((X| }pӧ3bĈDD$մԸ܏N9$Id:`:l?\a!""7xcuWWoSWQQ9s LDDi֭Y[&˚~.$M?u Td&uM `H$2s;:(ON( LDD׭O,]+ID@!@-ID:`:q""2jy'|2ǏLDDڵkyZwvv.VL"tw@ D0u4|LS߿{\D"1?={6C*|e֬YömےZ1fҥK4DfJ]H e4|Lwo#o0,"ȇ1CN;jm+"od-@ @A2]GH :\-ֶcbܹX&""'xg}km2/|/#y"" VJN"5"dy$Nq.\iV{ٳ)((*KDD2֭[Yf [nM%/c>dɒ%"Yo"!vQ߿w"d<Թu@$1D=iӦyqEHVL"e 'jrf:DZS]Hu~:DDksI'q '$""Ykײ~db |;˖-Kzj!"<:D>!ōv-vk.:Bo =WP:D+@֫/ƻna5**E{eڵnŴbҥZ-,"A*#$^NCBs]HE\G.yr) D]D" 1yz 6,2ׯG#ߪ\E"NpIO#$n\Z z(bΜ9 2$27{Gaϗ~Z񦦦%"y!vt!C Xau}.!""mmmgXkob]70k,Fp͛7}dnZl4H*fLB J1C鉮C$oD"c~tSO=źuFکIk퇛Hw .É%w=şHZi ApIY&!""Hd1.=&Mc JDDH;vdƍ|\pAwD$?ƻ>u> $u?;;;7ƌwτ 8Ih<#ݛJc>dɒ%"y(^qׇܦფhQtC.ۂ'3CDD x?ɓ'X%""}dmŋ0tH?:Df'[dKh jI78e5eh{Ǝ˴icIDD2ۆ xس\z饗jSI)r!63Ii:Bf/ qhTC a̙^Hf`̘1޽7x#Ƙ腋-zn[@"v"ш|OC$7oI9q r?ǮCDDZ[[ߏ_imȂ 3dCR1/**_@g!6hooFc]/))ᬳ΢,0ٵk?7nLǻ/˟Kw䕫k]GHlNܢOKi!6?>B8fTVV\&"":56mD4Mt{ys9/vmO("9@5:3WU2 ![ARr{#$m8v"",uٳ6lXe"""}v>nMé?H?>u 5!""HcGfW^{e׮]=ݺZAtHΫ@:D)`*ud? $U"RCD+WBs`pe"""ۻw/w6lHvm$"2w"i~>H*,nE=i;DDXjUqGG}X 9s(++ LDDĭ~{è^l]"&wwHY]-C$F!udg`a̙}:h!p8ȑ#),,dƍXyfO~;qۭ޺7L-k1q")7 :D~B  u^}}X8)..LDD$mٲ{]v%Z.와D$`pIN`6["3/JC.u>EyzH"#$:ү9\CCÕɱp1/H 2w\Ə>c̴}ޞFC ,vj̥cC$e,1!""[r8k]:u*A&c 'OSN>.FkmmT䄇ٓ_A 8uW9քBXׇΰa0HPƌÜ9scx@෭S%"9f#$Nr iK@1.w!"K}}1usRPPtH^`Сlذxs-ZT=eʔ;n}YDq708q\6!Y$Fp")00:DDp7tSygg߀'\N>ѣG\%"""޽ロmz|󮮮-[7.z%=$!2ݮC$sh%9UhK6d/gРcy466t n_bEE]"?:DRf&YYAv"(r")uH,mmmcOXhz~!"" J2&4nwW)~>4|}K~ t!"O$98;ֵ?DDD$cǎN sQ2!.j\GHL>:B2]qcH[ veժUQϜ9#G\%"""m6.1 c;/^|oi":DRb/0xu7C  D$utt|8: DDD@uu5 ,`qVE;`d(Z8u>KCDDioouÔ)S.0`guՉn+O$$.Z]C$%]G[>7]GH\:BD$h4E Icǎᅈdbcg~zP@i"]GHJ,>:BЧ S-4P:Dm+0 ".hYK>wp8LDDDRmݺu]V{ŋkowg8BϯVX` V>V?ܹ@LH0|8wL0Arq1eIy WXQTdW?V\:BC9dϢE$ D"9Xת9rdE"""nG}43f>vXTPPUV%"YO\|!T2-f໮#DDzb5W=4qĞ>)"""Yjȑ̙3P( ;::~|򒠺D$\uD;P:BK+0u ⽮CDDzR__1X ĉNUTT+B4w؂Y .ddc*٫nu"ʇ1u[puH21_wMPWW駟Naaac~{M7%"Ye=C.Nw!!?EuH2ƺ6tP.Wjjj?~1fVggHxuNY:DOÇ `7IV4Bk'pB)"""jjjX`%% wFrʚD$?u!6I?}>MD{du4`dyb]:t(vZE""")|M?{c3Ɯx-Hv(Ǻ~>rV>6hAl _C D$kcV=䷊ N?tJKKcFޮeEpzNB@;z>/7]iynK]G$m1fVkh|WQQ 0`@NFbnSпǜCjv!uHoXkz8L VVVgoD$k u۵`>*/OW鍖)X׆ U"""r2,X@eee{1:;;hiiI8t9:3 U $i:Be{\yWŻDDD$N?`y^jUqP]":lw"`I= rO=/xuHoD"Qc]khh." wW:D$+ 5%h{ 8uu\G1@(ֵc=66%%%ɜ(9Tdчq83#$Ihjz tH$2 pӂ*-ZJDDDѮ]Ν;cƍ/lnn&"8ux`I |-ףC6 | D$;-%ADDDzSRRknC"r@'>s4%;:> ]GH4ϹիWc.u#F$"""YSTokŭ 0KD2 ]GH,:BRCÇP|u\G֭[? umB1ISXXc'ڮ 0KD2M\GH|t!Cn:B%R""X_ B7.!̛7p8E"+u`K#4|~U>Cv!""}> 8)ֵc&H2jkk?~ՔƘk#ȅfHf{\n!g&!yJ@Yd/h4$׍1?>Quuu̙3'cvF]"[dЎ_g5nKS\GHuH_u\$"""lȐ!= joo?9.hWw>\:BNÇ5Mo6햴ODV4(umر׈H>2d3xhH$2*&hQ"m$;}q!}C:P:Bl)O""}Yk?ڀ2dHI"""'F''\PonID2٬ Dbgmj""Q__32ֵqa :IDDDȱ1E@>8p= GLgϸI 5JHM4;&{իW$"m7'!`%sQ">d]GH>v""+W,umĈ\$"""SNi[nVDdCOfu!Cv)u!}v% ×g޸q|ygϦ:mjkkZPM"uٷ< ˿C]GHyHVGb]6$spsRVVommm뀻\GHr!!{Dgdjhh ƌpSTTmmmj> :DsT2?m.:BD$E.P(QGlA***;w.P!ڛ%"C٪mK54|w>_'#DDRaŊb]6lA'ٳgyqw ruU%"R IDAT]GH:BzC ׻>y X:BD$U@ikF FDDD$FN薣~zK$D$o,6>d0 2_p铥&""b(KKK ADDD$ӕqꩧyqce@]"q^ >-HÇt>pϻI5kmU1bĈsDDDDzI&%P(f='oW/^:B?T3O!MkQvIfZ{~k0$>97n\swH~|v"U%hy.#Ѯu!"j :huMDDD$Lr`ww/_^dd/u^>:BަC \:Bz##DDҡn0(5m$"""٬3fĽnPRRr]I"yw!i@3㛀>U]:BD$]<ϋR811""""YcСwqnYzD$#}xuJ =chN>:Bz% \q""WumဋDDDDRo„ 2$ukmk{{D$uʅDCwm"=#DDe˖-X׆pHzc1cYkbŊD$shw!2#遷{ ]GH8H1]I7kb}}РA#"""BfΜ1&-nݺSA6HFي?|uD: ls K""x0EDD$ 4?>-_߿M䧟q!`|@IvU""@̏%YDDD$xŻ\dի$T$5 $`>opO\Gda/VWW3`[DDDD00k, rҶmۮID2ʫ]GH,ƺ7>@^$/""AX|y 0'54-"""ɓ'ǽnmzI"Ynr!I+:"hIy#$i{:DD$%%%X״咈ѣG3|x=kUV$":\H'>G[2׀\GsVQ]]tHF6m%%%.AHFyu$2/@z#$i'鵈gb֬YDD2Cw'dصɰwtt1t6t=kx.kz.Ŗp_+pX ZE2҆ 뮸tEѩ]vcA6H(v"I:"h\GHN:BD$(G/ź6c Flc;a=M![kxk`9ׇ}PPTn)*r(Qʇ; ADL{{{A4ڐ!C ' O-c8=kIt8uzHط /nA7_7l`_k#BDEQ+RUeL s#F_W^uXldC$)SmCrV>< :D0ijuH"ȩƘĺvg2hРDDnns?2|GYIJŁUGܗ{E}k8z>Cqe@(+R^(Pܷgn:;;c^.jjj,dnt!Iوv!""A[jUqGG@&M1JD$;o{lFmI=octٞ$y_>!} 3R>tKMRSRWX <[n; R`y/^pyOQG#rV>G!eh "yj=;bP__tHZtǚ=^_g~- *[${_ UTaak`M萁E( Qj+2Qjˡ,Չ5553>h4z5pQU"!~:Dr5 a>g>ǁ#$)w7q󼹱^XXI[^ y'\Gdk̑Oulұc^xUG<$Xk\q@~q hꆍozGnTRh`RiiRW,JC9Oaa!'xbçh48kH^h 6q!DORJ[#$)W\G^F_.'OfDDRcVxS79#.H쇸gz~!}VHp{%:␳zcW ~b#쿋CLR BeQQT@}yA,!$EQn6o]MMMpd:BizDÇ r"=!ӻ]vX-ZDUUUI"")ѽ=|1CrÃCԉ=LݰJ4|]Cst ~LҎ`n}k?8BXK!D]X P;i9† 뮻]~jӦM'577GlQ!ң׀!B.h->"笵sb}XZ.xٰl+8 G5Pg*q5nZNZZK3 `Zu,U0tep, hmm{>ٳg$"ǫr -'$MS+swzob*b6>4}H >}}_ }:ʊ0! ~y:~a16nxV???̶8 #'hC| A7p9ߺ/c,ʆ$V$}8 z/ f8ac}=gw[` Ck *=z4T4%2Ree%Gu/RG744 :,_t^fk>t4|bË%}:BD$Čź:< ED_^a?M1a[x$RbɇX!va_7"P[7wZ팂ydWY/ߪ:SSz8t  tHB"aPH@(" vD! r<{} @4}tsNU:CUgU{vsvW՘NZͮcYص][jعSulPC{wk_Z(~l> ~=P|26R;}T_pw"\-]*;Q_f>gA*(y{ΆqUIsxZwq9<.=qeXXyW% r͐?]OYJ'F[&/l߄ذ`vmc:nclX˥E lZrQ@hש>;z#;HUП;;Q@ ]4`˖-eg!"r18PvK [I!u6t_^ ɫYz3ԉA\J띏ˇRt}$KVDQ5سm7`>)!(7DD!ǎ9rDT hOYQLwH5wԫ?DHoPT ׬J,hDWJj[6԰c(vŞcسcvc.8O~Rzj֭[o%G"<r&@wam; '} " Ç/jM6z Q +[toscϯ.L'38oO#t_ .+PbkX/I(4}o|Mvcسs {vaYc>5S/\-ç?i4ƘD_p |B\Yʀ͇ /c| \EDS/b ^crrC""lN0 < su'zp͐XL_|5z8eky-m,w ̕zO qs`yKZ|%֯cQ1;ǰg85-)122{~WU*;P7SM=|Y*((a@DExæM`xz$UCSlv(d5 }ye!y5K|ErM?Zb闞GPkk`|8c f&>>tDEXaY{]65Zîok>gxoɑ(,sPK }6Ysw"@ߦټys92k<v[\)sE*euA.$f5Q*KE~U>[s`%1e.$\KNn_=/ݔhyGXưg޳ƱwoKy!~z?~<\ED|;%:CpJPwbw+|M DD9tVu —۷C*""~}5DY&zX5FKOK`2jg3>6ɖAoyn65bc|ǥb7:8nyÄqRw%a\ԑ68<gzs\;n:]3=1w&ׇ}~>'=ըj;s>,U1g&(կ""Qz,,sU׺~}iz =R-̕:km*gpFD fs.O;y\1M'?մXҐ=齫0w6m,L={ؚ#fYr$" zA 6|{2|D'DD\8::u֕(_N=qOYc f VJ.g#A04 `ђk|!k<?Rl>wJV(`I7oæ(x?dVj)guK=sc 3fy eΐRO`cT0Pa2\I+b陕ôMx 'tZf޽0= 眳6Ӕسgx'|cSScػg>{5]^{Wazʤvik>lg2MHD^` dhEABR"C#.۰aCi7MwS}@}u﯏ ݗWHz(y8xZ׎3Ln $M4?%4S9˿m߼x(M>{ WazLOsZ[lA^Gٌ4:@Dm',BVwбn'-CDD۶m{4q鹍7( EфBvbQc})Ex| A/5s0T~R<́@#ݓa&~hd!n;38u<ǧ?5DX\ l<}`wL[ZUزe o \W_0,_  [e~uCbVdY2 RZd/P3a A"}wPK=E5h\/ԫɚ+wpGף5c}86mG}t-6mn`6oiY";Yx72n%lA>CCUx$j5,N|Ri+v`Q rAQu q NC>m2d׸>]Qd輥Պ7Nsg>I7caֻ:oQ1!(]2V7W} "q\"}Ӡy|b^JZ]_3aBA?qn)CJ<2& )s^;Uх 5bO%3µėX;MGi4OG2l/&!pۋK|v>"&Н"O$5H[" cA!x<)s')i EEx\< 9ͬ]FDCSwJh+6`d5FDrN.=ڭqBvܖȠ]qk K /)o0.4ȺP5 Ofԫ("d5 |vW} "ыlmڴ(DD^u_ƦBq'fȓ[r 2 zMs e\w?n|b\~`k^E>+y}D? Q\;Y˾CUʼn LLL(z;R |dH>ߢ }@ I4fp,8s,‡T0µ? ~3uDK;6fhSC%w {];QKUd^brEYJi2HΠl*tQf -km|=3bxZX08ur4WD4^!(6ة oJ1baeG!"ʤqhlF!J:yEW\dHk>V*tf{>28TȼštߐZ#0DDx G| +#`!{tADT% '''ˎBDw;~nzA>" 6F{.h2HfH(X]O.E~)ݧ)kiAԗn4ӊh8}CP 4l>tO'Q;Qs=l" ]Tª>q)dA/ cdcK X;齐E5㜋֎t86`˯g3a̍';ub "^o0;Y=!BCI|%CUɪUUW>QF&)pkq1!rJ5C0hrJo>NH\sf\sRx=Uv|E"wp!aa$AVpDDUj-]իˎCDIQo˓D[ǤsɠkvNbc$kI_乼f(6OBhd+u:鞲OI٣+.EQC(ͯd2!v ʎBD[I׶<+\ 2H38oO#ӶV+rYX#zI'x 4e.fIۣiшoAVwuw Qю\S+AkA8Ϸ͝Rh65{5 \9Ggԇf沽5'3tСI{"edz3|+;Y !رc{~onϿ"𙱎*q<Ff/ 2" Kc=C\}gPokARX A_sB~эMkSIsO #+fCHcAV7xU?~sl>Q,O-OܓArE@lnI_WeCzLj,zoQS=~qJNG~7{ttHD4~} p {a| 7hADTUQ͇իW^KOelkQUtyk<3X抍Q\ <,g̥,T`uA)J'F@ֹh<ά1f:UMw 0Po؛/ ` !*ڵkADdd2~tlmy9flT ϡfi*xEMʚ2OdVMҶZv&"nDDY1Ah7 07 WAV?z "1Fl>p%" l7M)Źz%%-52W!>,]p\yZepW<>еB(]{t]*ḱL2ul46) /AVæ)<_'CUm%6J&vVJ}75wEfP7 *-T?Z"{(E>6zi'ក5.G[/q%"r;p sվ/EpDT%T-UhkZھG1erY_\1 L:{ 9|^zLٖ'VW\/y38$%C!'ǹ5!:6T!H Z""}ݷj9@DU܄'myωjKSA!9CG%k +/2ҍ^2s`k*нP^~2*auPaj>ӄ,76{g#;;QC0͇"DDUWզmqURAܾ^bc-f+% |3Ϸ(#m*!~M 'sNkvtuY˾Cw| ݥ%">j=٪2CR E `[!a;'(Irj# &RY>ӼO@)[k=rW񦳾 v}&}(06~/AD4(+]KDT5(^IEkT!> qfiL ʭr[g\28+:mG,)~4qa{?ݿF-)t`""wAul|0^;[C ca͚5eG!"*kW=(Qm#AR ]sG+P"yO@_7qFqhvlMVKhri<-md" <;^!՛p#| [h@Dcݕ埓 r؞Jؖ'^VL?2nk% 7ZLi\7C)R6WrX >!ʡӊ$g;w2 [hwe(?| *ZwAm4~@USngA?9ʅZC{2ҍ 5Vm>rYA" { uQ#C6aokyKki]">þCN4L͇]nDpw"#|Xzu9VH^q+Ͻu ?Cܥee(xk Uj$̕0_"qO\@D99 W} ,|x)3v7rr0)=6^{犃$bOdHg͠5CbZ; Fҵ{rkQUmzz_/ 2o!C[!mz疄"|^pNqh֭R~Osgj8sfCn@Px^!4nekA"5]ZU` \"v[vN[I38oO!rPZFuT$O?`W።oq}j.iJ}iףj>+%UK!ڍ!9xzXCuG ""ʗDGAz6h?&僝MS¸$.L49)3 bUIoNMxq *[Gx&&FO,DD/ |؅ ꁈZmt}ժUeG!"#kcll rc Vd 켭C[ y/6 'H}"Sܡ\ʹ4,[Jll͵ttEpy!(hZunDDU7 ]9VndmlA=Qsʜ{ s9u[5.FxJӛj ic3%iW$"M; Ӄ|A!(&N!1+h`m{ϝJ|e]t +/2gsGB&|q+/cRO)gmȴ~J2Oz&{|xw"&|`K" ~=@J!;ʾkiĕ*?eL CΐPd(n鹩=qh 6(?CP<=͇@@D4ĕv[[ϩji# K<3(N,s! C|nƔjp)4JY]\<7"IxzA!1ft}||G":-OBvm3V_(s ̟\wZR#@"a}Y~4]LNQ;.弎3Z tgbaA1pw"AgW>i"Dq`qj:c!X2.hUy[+(rX2D.bY R5FQ7¸<{}s~zv^>s35+(wȃC=*4AD4 (rԳ">fIOI9,sfjʴF@BܵgVZIXӠƆ4E',~VD "]A]F0gZx?hcH׹ӯ-f;%]J}_oM1s3`:WhAo)k.ݓaf.BvgPY0NJ)J`eRη'*OBNV_z)~k<"|HM#\<&3#}3i[CP"|xԥ ཾC 'FGGADFCBH3peU -\3HWE\ƙ䧭~rPVi{%" zc ^;uK_hc D4tƦs,|}ݲ J:yEW\dHk>V*tf{>28Tȼštߠ9wabcccrZ"\A].p@t̻| "FZMFG"g7k!;*$pR*T[j^y!f{,DZ1ӥ0 #Sw՛;uy?AD4(W>p wF𸄊y;G龼2Ed屎s n0Q0%6; IDATb\F@+erM.Ǖ\75˧N0?WiŌDD(A]@pzV$oM^܋0ED4Ŀy4 3SuAz_2WAːSPFlbMQd-8#sZ!3atkLZmo4DDN~w ;C͇/=0GDD*"qۥed8":q-K}_y 3 NR3~>cbSAї1x"|sgi3;S3CPJ׿|7hXc&vX{~s~li*d.{-q>@\3Xrõɠʓ9tS^Z\R2.u:QM@$iٙDQqf",NM!Mh+͇5YDD.rQ۶gP6 mBȠ5$aCX2NW^hT3U5rh<"*ջЮQFwWUo>P8 W} "rk##-۞RiNܾJ:yEI`+ Wdʐ2W.Y~R* Cdxƥqlf&qM"} _A]*RUwrDDQ*6^߂)u)hR˜( qQ49~|\xB~ה:/;ZGƦ3u\ "!\TP٥&A;@D͌\Xnp;QqQۀKia|KweՃvk$eH_AT:yQ /}.WP!| "el>9X;%okbt}}+B@)s!fR.?Oj&84͏W^hPxZt.=zʸ#u"*~ay>YT;}e!VIq%"tk.}G:.jXm XL`2 w[Op'.[Cs1"{5==fg| "/xtXvw,|xADDA8|xzR_ "f9oobdq@-mߣh2Hsn{-bsP_Zx4¸X \SҟOƓeOca6y}mV %" OUj>xl} "fQ֝ \&&Em׭zIs!}3hsr ),CoKEB# ϹGJzvG~Nȟx_q =:m<;FUYJ2x4QV>p%". ZZn 5 @ԫ?ϷP?#l#bPOg4{Q*x:v(KD K%UFpj5P| "A}xyaBo+| \3*2 <2tO^~  f05qHJ"O]D[(\%4H+qO&s9avfɭȗU!h}HzEb#CвM#.g󁈨w6fW %{zh~D :a8]GR͇LAw"""">k OJ[ +bz?Ud*,CvNڦk"z\sY9 (4l>w]?䐛1C]VDDX- 컥|ybc;12d(藕Al9HE W$~؟JH#e. sO:th2Ո sA˂Zt!hR.>DdH}w""1ƈ| " ˺]K <-PkSkB\=p˥0pDDQE:ps[x7f{JzX1r ?2gN׸+/x?edtX!| s|_Tܷ0`w"""tn¾.#ĭ M q.\V^A!tO48Y|h똝LMM%#"+!0 b!:|x샾Q&l>UD^^'m4JEr_zTx\KR{[ [(FWs@g{?Z}͌sp'=wN5palN@DT ;;qYK$.gxCA1kSX9}^])[WL{?);jt"}} W1Ū39U9f;' }6:}CkX/I(cZ:j:2Qwv!|@!Q6\@D48ᆷ5kОy!i,1eErfȳQt#Bڭ4 gx"໇Gכ@˂9 CPKBDD|0U ""iT'TO5Ug@/͡=wA54_B,Z)R)#Cn f\@D!8oA| J!@{%EDD2pnz]kyg1]^=Q 1Y2dh*d q`4yt=3بIvJZyuet ?݉ E3t^֍]2= "| Cl>CDTaQ5}g ""?6pO7pK=zֲ"i+22[ NC]  !Hgi@Yq)u|d\Ed";p6n>Sw""rjNKכM. "&k"<MLw7Z=S׮z5Ȑm6]Ao0.~T?.'']DDe;n⾛ޗ~CDTyQ\ghm74l`bi+&i ^ ghK4ΠYyA/573<&6}s,Z" ]׾p0xl>$Om-p%"A 6~ "Vm1OiŋB#V-fA_z_)Y/)#\<&.30#X83vDDE}D*_/p= Om7| "V>@(3 f|M-?)Jb^(}R3Hǵ9H }T<[gza_͇ڴh/""DDjp݋xVyՙU)!|X[$ߣ}"Q7¸X~ixlxtٙqQY g} h/-gQ>^ל+njO[l`ŪͪqVok)b~{=)Z"\.HC<46NOFQ0xdz0DDEQ$DDf-< W; F"k휤-%3t۱N\RCm|BLgkwYc^} } "cĭ򁈈4ju'n7QIXqC")e{"~ "xJq.T}6jCPvz"ue F<.u/DD""W_藸Qk5a;ERm*hhuA = 9l%=~~ɓB<|85)KDD SngrSguᴕ垮 6F.4u_-CD/A 5"l\ ȯ)kzMsOϵ3j)f""u0^|Iݾ _} "܉@DDunfO}~kǟw)請9)eː~EP_Zx4¸X@" X5.27/{T""_>a!hW>`oɯIqK(\l>Q!ο;~rZ#O8Eyn9C_R@oܫo>˞Jy.g8}(d-;a?2_Cq`KDDTWh+0E=Ag휤J͐=qOyzO٫1<8{.)c~(QFG2_CoDGDDT| "R;~l]mR= )CpM F!4Kj~X=r^_8D8; n_d_%"LbaaaDD4$6NEw-`٭ r? ,Z!zʋ*}6D~,DDeX!!#| _d\DD4K| "mtluSW@v;˸ Cs1%Cc IDATSgN/t,ˊ}*Uiu2SkND41l>w{7|ok]+m)kHlARZ#bzJK A%r4wODD>!h)| "DQ4#]g󁈈|ׁKhe?2r7:i4#u_h<&3Jn*N? ~?'OԶ$"I`*p-U%Zh| "%|8sL9WQ kvN/doAFR_BZhjښl0t&Qqx\/TV^> [CQql+ZVqLpӚx˚-h- i+%ydh\R#e\^+/' Iv͹xsgjAnDD{g|rl> @DDW>z±~=p- xlGHJ[$4:.`sЕjĞJyEa[k-Jh\'$" rC͇ .+u(h+6(<ncلmzi 6Mrːg\-~`ExX> okq sb&""X"e4@!w""*8W>QLnp MԤo;42mrJ bƥ%WK䙡ƓyLDD^|!O\h8MDDo? `NznnNLDD "|cx<.c%D¹ U&i+ ~my2s,PH䡱q$" ۗ|(e(JĥLDDC\DDT[Dx3 1IQTP2H8S9KIp-tF磚8DDecҿE7p^Aw""* DD4Dx x1j,Y m "9D\:tO' TS'ꫮc#-DD_h `G/PtiODDTi6NEx.;ĭ:Xi3XUxM*3ͼš!z[-խc)2SC 9yͅ)PK W>@6y.pym:ondn!a.UwP#`vM>xo;Ú밽kF&/U{HD4d1\@DDCeTnX?0o_QojS>.6x?BhdilN'qkLmb4Q";Đ3Pl> 6@D4d(:,]?}tQJms,uKnHrh*Xsp-WtuuZDWgxZxTm+y|\s>;#.Ye󁈈n}^s&FGjҪ4^~Bq)\;St6)\W.*hn''| "rEQtlr%""*E xsxڕ L5hy1U4 N\]}\-!5E8kSGN>_8QَC1qQ͇'47|w""*_W?pZ*+x p_ H[))i,H9?+8yE@IQOfm<]kHD`ȍj>p%| "B###Вc󁈈7\_8g>aWF&1{]njd0q񷐹_F@M%=f9cWH=͇4| "y Hϝ:u4DDDx a ЌH\EX|v>wABA IH@ޏ븅똄ȇOS8-W"" KgΜ);QFM7= lYP6M,p9̕i C3dgoitmgC =i͇(`^>iDDMl>p%"":p sx1=5:$nX# TpG Y]ݠo<C uW<'e;nDDD6Ey̳cvr-tIW ]eS]($`]y7.0 G#""nDDDMkZ³-`͸璽nlk*8*O\%.p* R~gjժ]85<'̻-!kZblhh`Kx˳yMd]Z3U.kٯ"ay6)\-sզ_((ſ\l> DDؘ|(c?4vӛ[+cTw?qo|.\wpPٟ:n<ד 5W6מ|a}ӯ5Y͇8eOCQ0.]DD.>#% ""N[ִp xgcj( Jup b T~&\keȘG2 ӾC W8eQ81_sQ&F"n<flju=[JC(PS̕xjGv|""_k`7ݯEW\@DDGhM|5|Ku7jhRi8e D2"\L2t0٧fX̙Y)BO~w!8i*.(OADD0ƈ͇ӧOZ """W=a|<x}roHK#ײ oez!yt>c:Ys "2&DyR;g<`˃dy8`g2e(<b94(Žs OSio)^0$8ٱMdIGp![}3is|>+U|kMdX;lАqG9ETU4v= n2؋ք_}Xw'f۱~?S\GM-<]sَZŝ 2CMqiYOW~f=g: $^ }>ywTM1IMT'?wb7VԳ`Dϥ" .Uik bӬّ7#:$tIͷި䞨nLxIOHh|vKxa%{zK@ D6q'd;ʘEVa$Ǒt@4klG}u[Q^ 2,~=fn$2LUxmߚ$?L`IN:I53㨤!'V~-;;l}ehVɕ+THaMrTGVS3@ittX"%(>pYTb|@)ʓYuٷI+L!p{f`p,i +zj|.q/OXܔ;ZrlRRyvsM?h/tG CilI S tt@:k8 w~Kz^9Oy<YPy8r %,<|W &ttHҬT&HOHMd.G/pۛ,;|{|zrKy 2 7-kSΓ!r6>f9Vϛ,I2A\2Gb8 RlK{_A~cʑLW"T ޓE%ҙ! L%4?Ji?CJo>,:v("}0OВzU-gS!  ]bھn}7f_ofT|ᷤn~[;Gjlڙf{y.eq&\yז91G I'~xr.[cdf^Ta:HJi?sb d+ ضZ%rWSO9>wPyեߠOfu;&kB覄$"vhuh4AaFdN6gLdC$Y@*;owߑU OG&cq:u~fW ߝqvnJTI(bD(N9v?ʑLKoӗ>R{o(?8Pp}?\c\ΰ)?gIJ!ElI{Ld|Wy1r8 s̭#o#/k8 ftcq MYx_o$0IUO>O_m-g]Ս~& ~}5>,&N|\R@`=> \2o6@9v}ttT^Oidd$熆4000[ԟfKyTgS/xc#yq)oVq|dMqIR3%2=lv->H~pcMhD}}D"iLxEO_-Rlⓤo\Kx:,-1\VPoLrF0퀤(A$U`C#)l: {|6Fl0 ;R(^0nח7Twȓ߭akLS=^8C;/"aߺ>tT= %y҂-FdT3"MܨlN긥TZVD@n,iuSPڶwX>ۓi{.5ozij=Edd%n:DZ-/)C|X& {$̲n;;;ӳYq^4§H{Ui͢<7E1`_4{ k8=֔;tcC&9E'P2\2o2@2] Bm,0ф^l. |-K􅏔뫟һPb"5nV{p}kL!}G}4X5+@2M!FĸN*>{Q5y5dP!_Nb gFc6DHb9 s۶=,UYYi k[s XcUXQtR5;aROxukB ιbL~k.^uDuqyyy*JxP\R‘Ka~yCgj %ϳdMMگ.޻ɠ,k>WC%`Z Cܜh%>MdYf,.7JJK?8ŝҫy^6R*5νf7L+ 1yτ52Ln P} GMHƍG%vFeY+*QRRL ~GuOM(?oFE]rms[q˗ ߔX'5'C{&x?It4eY*-+S~A5<:gL'\'=s$'\= &L:9 HARybYFT),k3'U[\s~2x򔗗2Q8mے$߯@ YYYWΎh~=O}cRTis' WF -@aԜ Iu9c`NӦC_4v=8`eYSAA  )<7j}>QSa{&7ruԥuϹ?8mO LeU# @zER9,:A"=s@ɽu^46qt׺b}wSS'3ѵr-t=8VMa3R|`9l%G?aI(>UC]P> IDATyO t򢩛F`\{ZnҚ\/۶',z9q @YIwLx%Q ZuK.\ zzyIm\.6}L7cQz{wI4 Rs9·@%6e=v}hhH rÜڠ>j.ԟAwV*2vlR1T;/B]ۓc%N. Rttò풢ncrgibs/5Qͬkz1pڴӹДFMA|lْȉI*ϵq*1Ê EG% q=e6%fUu;/_j_|}{).XWi[Sk|Mi_{Be.CN# 7G."@9󬤛&^g䳤+veC=L_XC\7)s]8$J")dbڔ^xw>Ds(>f³n444uUY_b_4޷T CI1P$Kr646'zŇGvpYx7Sxd~ݼdr`x dI~*dU/%)-׿cNtRzdsF!=Kr+]*Gεv+O <\?hih<.H:IMQ8M|(Ԑj$(<fK|_Ü|}hce/4 wT(+7A'Ф]qM._oVmbԔ)r%9b:eYn׻588uYyu-wRy JukS},˺3%d(\NRpi:{0W4}&ŋ\HVi_z_wF%$<ĸiv^teY}xyۜOaq 9|f< 8&Y H<eY֏Y9ŋe۶|>~HdnILvXrpqrgeX|Q' \ V $gK1"G\|T,HU;۲eKqb+5zk+ԻUщM"j\dW^zۣ> xȑttU#l+>+x : @[DɅz;7ϿLo|cAmqL覫:;;J:0K4N58]iP|xqI\^J8.]}"(iÆJmP~N=6??e){MOR|_-#HҁX|\Thmmmm4_Z=7u~7TY|$S_ IHCL09S(>d.i^zb[[FGG),l,'_}6ݗW4KtKKnЖ?kp>rޟ ,)zCcCmtF8#it5ea xIjH_i[Lq~Ν7MR 83'~ܦQk8X+_{խF$ݶE<@֘Hj58·|Is`Se9|mŋE6m[k&dFjOx˲aTHS͘/)/TŇi1su۶ꫯz),r[/VOީ2ZS>kN˲<#wyҀT3+@@is=6m-ӧO{TZ;=G_o]J mI$}_-1C})>dr֣n;::ùM-խY-j,O dHO$u9˲UcMr)o`~y-\47iܲ~ảYGy$ M6m:)iؙ3gd۶lj0ShQ埀89cź2H!rŇ,B`8v}ppPi0n~׿zRv}3.>$-(=FE"Gq݅wq`A[.eYe˖@ sRM\w*>Kʟ8 $|^nc:fЂ 4gΜXKkjj>aH/uQ$i@Ce40ζ;zQuɲ;X~XW5ǵ0o`j|ۼyAIϺ9sF}}}'L*//WSSSuuuy9v>dI!ȑ#^g [z~88$uUs(>d^IC I.]cncNRlj0kx#p9|s2͛.[ncW(8fJCCv@n/@X_5gR]0׃ lT2V0]Iᰞ~iP fϞ<1˲q׫hLhƤ[aA0y`Ǻ$}B6>::'ھ}N<ϫGH۠HS]]]a2UD1^Ìr%}f`,}O-4Oi3d˲zyyy8cΡ! (**RYYUQQ2UTT(??? ***d@ Rd&^6#;̠>Ȗ-[_[[{Q(Ǵڮ^PPDyy)JWiizzz&ٶ@$fL+L,>%{Pd-[ؒ>q"i?<y&u;%Ο??~- c[QQQ^jFPRW/`qƨ#IzG>!| Y8˲K/i/a_S󩪪JUUU5kT^^.˚Ň:/s@`MQ|6 4&YK:sW_*~h45IjrIR?馃mۺ|._'z%UVVz0QQQ112Z0tnYVQ ^m{ު5 uYX͛7wKz?}QOOm۶w…3g5gϹHDYfiٚ={f͚%ӤU|pZ2UTco7$MY|`lWq:#iı2׏#L%FFFt>O$f `= :'&LY|a~xW:~uР͛7O I{۶٩ EEEňUUU;l;A Q/s@x ]@|3>Iӣ>|xZ ٳ`͟?_׼y󔗗uY={VUSS33 q 0^6c2 Hz\z8ŋuEܹSZ`,X jܹi-DϕƊ fRMMjkkU]]@`_2O8^c,k(^6rm=v!i80o޼Ă TWW"&ilgDUUUWWYfMu21 b JI3SDt9sfZAAϟX:C:xjjjTWWZzF1,qԡCt!IcͬܬEiٲe***Jst):uJTRR͝;W555im pU$mG=K I4$Jϛ$m3't,Y_ 녽Gu>mݾ_{b&iouym۶me˖Y/NN<'O󩺺Z jhhq5H˗][u|˖-q Q1lA7iW\X޹Vos9n=!mݾO%ksAkmٳ:{~iA566jٲeZt.\(ϗо}TZZsjΜ9eWR[[uq{]2ofXJwݺ޻%I_ku>=ܞu 8qBTPP%KhjiiQMMj]ӱct1~׏Hu + g(la:@KQ|cM߫O^EQ8zz_vT$5Q%IjiiѪUl2%=w4չst9Y*͝;W ,x&s׃$g<ɺd:@3X\!iYr޻%d X8S g/c^Oߧ3bmҵ"ZZZxTRR͝;W)Ӌ/'O omm+lI3"=' ;fɒ@)-.;|%]DO_دPc&(,,TKKV\+V,Ǐg*((PCC͛:D#.^k#d ]?vڝaBSC-fzTQ[?鹗id4l"ʴj*hɒ%iٽT[[;^O7=SIZ*9MRt}aTRHV&)3^ ,>L484{h}ں}~E㘎5IIIVX+WE)TSS3^Hǜ 3ڵK'Np?5dJI]CIŇbI!Iw eRaΐ~emݾOO>Gg/d._ϧ&ZJWV]]]Z歬TCCT]]9ljxxmי I_MAFJ:g0LzUB!&\|~O?W=}#MRSSnIWVSS,˚iAWMMMZ8y1q6n޼GT&tT'՟WH:d0L%v!&T|~?e#ӱSZZիWkjiiQ0?>uޡ|3C^gt9hWS$tI&}E9ttATVV;w,X43<<FnQ3@t9hW~OHFBεzkIۻں}۶K5!:xok޼yZz֭[t>}ZO@:ydƒl@:\6 GUHC n@T_S[{~?N=.=GFesGgϞٳgciΜ9Zf֬Y'uҵG3-X@gh& m['O܉ٳg<&ݦ@fjWO}]GޥQmsx}G^m;Ʋ]pA.\O<\R7|ZZZ`!?~\ǏgG57o2 GQ| ;rwy@[/]2_;wΝ;UPP+WjڵZrqq Ho@ڰjuŇrAr7Yehں}?;Ha޽[wV~~d (**Ҽy(D0:::trcѿyf-(>Q.4 eM߫O^E=k}zv G<422={hϞ=ㅈuiŊI"+D,X@䖗_~9֐8C^f4cՌ Iw$m4%gIL 8<ǒE9а^{t_ïqjii7߬nI)WVV QiJ @||XOeHJ9ے>U\Xp]KKu>=t- 3":x`Z UWWQ .TAA sƫ0CX5㺝;%n.Kj !&|HkE<ɑeN?:::SOzy`4K:i:D!ΫŇc *E P|9hT_V8}t"Ν&1)m֭jkksm<3Gt%ttDҊŇ6I"GRPRt icѶضu5ʼnUVoʕ+ `QYҘ֦[~^4Ʋ IDATO7.H{?Ժ!Q= `εG4 y`PV|r*..… h"1%q=u˛Z[[a$I}JL1- Eg%-0lC!3ض}G^?鹗id4kڵZ~dYɿT^^&5550)dH$Qٶ-i7Fr) F!rP%JR$9耤L P|LC#ڱاkW8']SSnMzjjjDz,׫QͣQ5lV__&~ԇhT?4886XuMbV& ,i9X5Ir%d١3zY[ӓ |n}}֯_קtR0Լyب4&QWWwq<9͛7H0ӞĎ.ͱ$-ttI2lC!;]/o`F?󩥥Ezn馔T.--բEب4Iz{{c >IAAS: 0ahhH?D܆GYy^wYHo:I7Ie:نCFm?zj_ij^hu$-ZZZtkIdYf͚&566r,pFH@ Ye:s8yy $}t* zf`Ӻnb}404ɴ~^8?bHW߮K&ֲ8PGG˱L ddd$g":;;U^^N3jdIyyyeP9( t5g dεzkImzn!mݾOmۥ iAܹS;wTee֮]k޼y ui>}ZZp/^9@r'BJKK9 Ͷmڵ+eY_>a$R|*" )>3d:@&][{Ehۋں}GF9ڶmmۦk[. :rjkkԤs ERקH$2@ #;vLPu̲Öe=q$fY$9$dz>䶡Qmsx}G^m'Ʋϧ%KN?D ܹs̱L@L}U0TEE~R188L;mx\?C$ #.wꙝu>=^ܥm[ǎӱcTZZ[oU6lPCCCBD"zWUZZ&555q, pJ\-bTTT(///M޽;VAe;9uX3h8m}9vttttdYeG4mݾO[wSwOsT__k*++KxScc#2L]]]IʶmuuuLEEΟ?g,kF%3tI6hYO)`L:.!^ѨGOiںc{FFS{9]2iZd*++S }FGGݝr⪢"FD"G?@[~+^fC>$LAkIcIwK/!0qkَ^-DD͚5g(> YC#ڱx_IiH7|֯_E%=Ouun D"B$*//O|iK/Ǐ[]]}ƍ^fC#{C?4VxcIr=2Ӻ/X֑זq|>߿(> }.]ֳ/^ҹIР 6nSIIIRsA-\PͪN: 9 e>߯ LCO?t"{Զ qmW(rwK7oDZ_9,I_ttݦC`ZOOϗIE_tXnG:gQV$ՁEŗNvmڰa4|577&9fxxX===ihz c x?ᘍ tC䠯Z)æiP%sF(D`Ficںc~u䕳 =___;TqqqRJKKܬE 9$'+ )MLOxٶ'xBݱnAkk뻼&_Ұ99Kco7$DŽ5V|B_J?ر(8=Vy/3~?پWށIXK֚5k!-[tD0mV8??***2ruСX×ʏ E$%jb%i[M'1}L S|qoMSpSy]Rxgwp{ʴ~zu]={vRSZZf577+???\8488DLwܒ87o]c@&Ķ`ohI+i$9[RruwwdY>9^z!"8%xd`hX/=:/bϡ׍ϟ?_w}n6%AlppPkGL''P(r,6mnc@/{m%逤զ˒{m 8===2 _dPNt29[>mtST\\o]wuWE*-^XBP̷UXX2@վ}tXpx>e&`]k< $tsIRdP(tT29s?2~`&]/gwo`(@@ZxqM.* D0TEEER_pԓO>)q\-˺oӦM8dIL1/[IsM BJzEVpSH81CãھMΜڵ7o~sһ!n E㨷WCC-TQQT7[x @Z!rK IM'1Io:{eY_0#Y>{D+~Io"3rwy@[ӑW;ղr֬Y`P .ҥKUQQ1i000KKKU\L\w^9r$pG8^qK092׎[NIj2$BRdP(tGMH+0;)b̤ӯ'/ST]?_d5449%pQOOO@>9CO?ty͛X ^/{K7ᔤf!$l>j:GYvXnGHNzDD";pZ^S"EB555iҥ***+( )e߯ ̷̇k.8q"`0cX /{5KEIu䘣@>lYVNy}!K5 9v3:z_:k[UUŋӠH@:@XRv#倶6mݺ58-v.i$9搤UCiB$t9>F7)N~=ׯpⅰ`0Ef@D,-s!a=cp,6m=搤CKI~)r6q9@),W$Xa-?7~4B hCC`@R8'#}X]5fHẺHGe,BP|,V\("eS6F[O H[ֶh]NuՄN\Q6WXKl6'OɓVOOnf6LQwBJ6b~~^lVpX~?MWÇ/Vxxi%@aQ匤VIw%uVX,vQ s+&`jR4,cc 9P"w-V[oU0S/ZMOOk~~$| B%Vz]Nzc5{:DII1Iԙ7;yba1ɱ")(DƦM?PL=== D/6dH$U2Ԡ%u:{*c>,(>8f +lWR)R(5)_4Oݢ~#դ4HWur^q-N:׫G֭+sj`uhiiQ P</D"\.6ښ9r O?P<P5XyY#钤nIK:U<Zi90_vNLlO Ig=ڌ^87edjkk۵uVأ.dYbf% )~(̙3gSO廜2Ƽh%3@zImCԙq#邤ԙcvj~^7]yfgg]A ^|eZTCl٢۷J5Zx/@jJԤ#G}-k[em.':jB/6SpKt:GرcZ~vڥnz6cK6"ijjJjjj*AB,{^ƒOU28c+/g$t$u洤-CZYk}x|F;UHGHGĮLi>t~Z⟝۵qFZʠf%Iq{ܬ o566|~<|֍J:D9cte#|$uf`QXlDH ^)B'%O\ȹdjiiѶm۴uVB2$d2bJ9d~坛4D>^LPxNI'$muΜ,*}Yү΁26@:F1P2ML+ 8+'l٢;v05<k͚5 %~ZOwŮqJf: Cԙ ?qμ&XT,I:ȓ?WjcEͦ:66^I(){׫G֭+SB̔^utt$g/^Է|* EI7Qg2p kIc(#+5ʆhz d W ^ut>T̅@*HhnA|PCCCIW<Ojs`R LM*M*p1Ƌ VmݺU[ne.R:.lv@,`ffFW.s_Fs@iDsuHZ&԰x<:K+ZT\ԗlFG^MXB\qU IDAT+`Pzvߨ: 3ZwD"*ISCԡo$,׍&Q|`Q3xMnZ'e::I D zBd2?~\'NM7ݤ;v+sb4~:;;ǕLaL&IaN]uܹ S`gMԩLB]`֞V4v+-c W qɖjs!ޱC.gc)pt9;wNڵk6lPc5;;Db-<Ԕ\y٬{׭_`$gCɝ9N>C %RV5"ɟ+T0=)C!Wm]kY\ k͚5ڶm6oLz--- %1==l6 /hnn;/]}X7捤%NR~LҳC1kz9P'"HGeCAQǦf97gkܬmݺU`L fbf k=P(p8,WUX,}k 9+ $=:DO|puʧLCڶjةTZYŸ5:OݨRdk+_}Y̔1)2@@]]]jll,&''K6ԺZrO`4tܦTZy"+s!~oL&!I ]fuq=c˗˘X@~\NSSS_y]p!\?T2@(>Pkhf +lWR)R(uY\u8wޝ-' Ynؘt 7hΝ ƪ*߯iY[\7*+ɨD W\.icG8>ܡ@|>nz+g (hQ&s 'JOɗ q]1H?~])BI5:::cmڴXUŔ˭|ܜr:::jrѣG5;;}}}{*aݠCT(1KXu@R7)~w(r6ױP ]:DD"j*A9+g޽{522t:]Auuu) ~TJSSS%jZ饗^w9>V<>s vyf6h6Kwke#ZfфH$r[o u2Ȉ٣g}v'|,l6I%{:ZC)aCT(@ssE kPiB{4ߺY%+7@cc^-s8O?X,@)CdU,L@ٳg] BKXnćyWPcgnAd騂I3qza]箻JJs??2+})ӧuiuwwk׮] sMMMb[633L&p8\ ?bT؇uM@F%Q|@ղ24vج Dۥˌ%[?$}LoJ ~bbBTOO6nX{QBŔdV|T*Ia%VkbbbkƘ#/^\#ފ}X7hNT>fXs1׶Ml{ ݲfY{ڨ4cVDDU҃ڂ;LMMСCڿN<,$D"f٢S' >|X{HUmآvcޮ|}Z.?>000\<:\S|p(:Z>sM!뽚MƵdؽ{t__Lf1C*b8u2Ȉ٣Ç+H:fuvvX"P<$+l6_|1圤?`؇ucPq@Prv%[7io"< -۠ݻw+)tm.ɓ'կ~Uú|rb z}D0,555j[;vLss ?iy4TH(>1o$uJtHzT7J2s 'JMʗ9ʳ2[~J}|3?~W/ׯ_;wjڵ ,ZxaBL&cVUݻw".]+6N_޽{uСp8֒/ijjJusѼ'81뮻1I \T'(1BP[nU 2'"=)c=񪃱AO~Iy䑟/urFGGuYmܸQ;wT8t^kk~W<Zx:;;K6"jrr,ԏ;جO\TnHKn@1\Q.خd&MwJ!i<`TAۥ|"ȥH$G\&cG%Zh4zJ=?^'QZ[[.cO$kbfffJl6'O|9}d_ P쿺8(C"ZnVbͻC\,:Nc```[1tеzgo>(N1)Ess֬YS 333KӧJ]ӁU:V*oZ J5ߤĚwQZ\*?S}m;}}}fCsM&ў={kn3XP(.53??Z梞 *W7b8('U 4+u˥HO)T pqTc̫Z1,7(ݴNuy)SS $$N>,g/Tm4::3ghz߮E1ƨC`p'+' [|8zhK`0вC*u:8 PM]gP8נT:x1ӓ fbRwt1~ ·zhsߑqk466nڵK6l({^Ԟf~qyd2e|&&&].x`;)_݈I|pz&Q|i\{;߫-ʄHjÛF"{FI7qbbB׾Qqr jhhPWW/.cǎyޟW0 `eu#&I%ͺR\Zs(#Ot\Ԥ)si)4[~\p塇Z#i[E1hoomݦM6竲*+LQpqgffկ~5߉'#{XFIӕ!PY@4'cS6Fm[zf{n5A|XJd27c>$dkOkϞ=Q:.cRcڊ^PSNmdope(ەF3&sZ!588_#|Z{1B֦i:znݪ;v̉QŔf)Ux^{-_AƘOSx^opYҶg{ =欂-ʛ 9S .˗+ uۥ|n>.񡡡=ϻ_tq8qB7nmݦrGF{DC"[NA466M~oד'vZ:@x0 (>Pcp(hQ.ТTMeLO*/%e)>,?.I'7T@<4::3ghz߮rE2ƨ]Jwjڠ.%:߭JE8P{\$"㒦 ];11a8p@ccc ghd@Im(>Ǜ"l T#נtӺhu25RgX{9 BƘߕtе!x ={vӁepffffp@im(>Ǜ"xҍ7hGk""hB}}}d6ItеhTWU:uJ\|AQWNm ],u:EۥU7E06v@ҍ7hc;߫-4t:rTvޝD"Cی1"B& =3ڻwFFFdʘ..kw]p0CnQgv/D&>/&Lc22OLM*y7>%688Io}|hh?M&/۷GPQs^}Ue|P,bՍ|pSRP)xY~f(9+5ʆhz d W 5Kۥ21XI%%}@ҒRFFFtQmٲE;wTsss#F={6ߥ]]]߮`@$uQ,>LIʾP~FR\/M%e)DhIS2^{PGy-_HZl6ǏĉڸqvڥEd2p!~w0X*\ZR?\Ԏ4Q8P-|^&{\]M|L4\'}}}/D";}>vIJJrqsuj\|`aZ/qTc=%#/i@ j4=FNVz{{OG"{}>6])BZ1}_דO> Ï:w\Kd@IQ|pG o.>0t c14{^~H$vUz{{_ZE%E ]{8p@XBjE[.]CN<ƢN>AYc,."rܑX,v:>055u^e{9 B[1U3&&&4<<'xBzuyy§)iUV7(>BT(1'j1}>wk o?{`~~~Iy{Y4աC~>}:&4j+[k?[8b o 剓-"^FF?kVKόo!hkOk޽:r䈲Y ŋ ^3=-q o f(>N1cg<FekmuZ188i||m~U ];??ڷo^z%s.]R.*Pz<Ə\\(s,ηmtC(P*1Iߴ>d\3Ւ=ϻ_YeܹSeJW{9;vlKS]]]q</))):HEI?xeઠ\J1@m KƘ Bh4zd``$eIג Tf:~ۧCizz9QYwF7(<@[' L\7Ez #aA5Ac_KXhD"q`.|?ܙޡ+E;xQ߿_Ú,oPܜx*P\rkE]iM@A1 1^F]fsϑH$r4_:k]O>&&&^UiS6~Ye>i-qtbqp-N>P#Ø$uoy1σh4z0ǷV"H$ry1(t t}XS)>|##T?Yӛ> I+o›v @c/O'h4:8==:X5{LFcGUy.]x y/.x?6|p-u.w(?³Ƹ1f1{w,b:55u\f}}}|-JkѨ:ԩSWZMNN*N/x-1jy'V0p1tN,{9 '";D|[1tеDB<ݫe2T\mrC(vo c$>@I_R ը7ی1&{M&yJʘW|0ܽ{7C@m`Ս^_sX1j)!ERN IDAT'i=CCC{w6NkddDG֭[c5/799ӕ(\S]Złƺᢵ]%#/{.Ir:~{1:tH hnnnkQ|p<{˼,..@02 xY&:D-A$mxQ߿_Ë=2|rKSp[-;|(Xn`)Ff_az8t$mӕ"տVccc׿hllA!iñh%ʆU7R2XiO R<.$ QOz{{_ZE%MvbbB׾QYOr7lZK%쯺񪤷AZ/C%X߆3sԣˑHd[1T𑆩):tHO.9X1R|xƘ^cLu\q]w%n?%vvvVg J&eLZ=}…#(#iujC ϋ)>.:Iy`X1恎^ZyH}I/dm*ҋ/cǎiڱcʚ-rAz\@mX+u:`=!_Klxt߻c%=>44tyKatMboI6ڷo:ؓuaéJn#,6̊k%J ߬]vuWoooFҗ$}ihhvBzQjÆ Ѻuʚw5Zp9e&u:ɇib|P1;::ރH=qc̗$ ];66'|RejoejܡPe*i.y=Ƙ=Ə^__>o%vbbB~:uJ\o1KP;PF]:pUc)>o]f CӑH,.vzzZ<ݫu(L.V`9[(:@[_I^鳠ZN>gQ\{9 l4֞)tm2Ȉ٣{N5Fd -Z1S[n͛,9p)P3b+nXA>,f!X|Nc>fɺ΁{0y7 Ço>KJR Z&d2%:=@$u:EJqTXKѾp8 !P~D~+m1|BRе~={СCbeLZZ GP|R}`!W}`r~\@m{~0,JT\.Q=z'56;ap@΢Bf> 4,P|PoK[[Q!P[)I;DžXrw뮻JJ nmU]޹D"{N?t7Ge\|m1(Q9ť1IS:Kb/uuԇރ>Cۍ12ƴ6ܹs:w:m۶Mr~?O%Fv!Ըb/(AN?uV_E?/G"l6QIYe:tH_WjvvLIf{+P7JjwN-Y7q7vΆ3w{`|||17$=St:Ǐk߾}ؘeJVڼchΒu.tNIuVzp)<: IYI/yG%&L[k5661555iͺ[^UfZMj;%)>,A,oĊj1lb=,7?ݐd/cLD-ב#Gtuuui˖-ڴiB'd+A,oh֝ioob~{W[2'%SirrR֗e:tH.]*i\.Z0.sthQ]¬8ś7=<UGƘ@!d#iPyIQ=٬FGG5::6r-ٹl-5y@mqNyN,B HiEq\Kp"^Mn:ɋ45V/~񋍩TI־siiiM7ݤ[nEEFz' f $:D:#iR/*1Q|p坒:32cjw]w%%=*ѡ=ϻZƘb3;;Ǐjmm}DDWWWAjnn.4j@xulɖKRqŇcYP|PFۿ:PJ%L&s_Ib333ƠF]V֭_,V|hhhԱDS|>j2ư!8! pu6](J2ٳguYIRCC:uttU |r[XIe&웺SPЙ?%+pD.!X-.H7u(D"馛nwA_s>wDRB_t$R(㒶Q~B3KГpBYHj4:)< z%[>`w gƘ.gT~EѬϖiu:r!/* IˎKM\`5b<ﳮC.޽{Bg%}vhh\.O1.$K1_x$>h!/,Ic;E+жP쌻%}^?wf2*%ƕZ% p띮ԱCS|8*駋ς`x WYnP[Cw=%/%>2cc?66|n||T<ؓp7W1@~muw}q裏ͽInU͒\]2+1ycC8 (K)NPLۂ?Qq3:$y+`{PYndCp>IqIԩ ya1OrVI]`U0>f>{)<m(~1u*>;E(>TTH|P ߸P8NY/z΍s׬ ֮];:@^:!ؑb^\lEc1/]gR?:@+>PT4ko.@*wUQw$]*fr|akPuZYk?:@{uH)>zɝIbPh ^6oCT)#һTN>T.I]P(D@5vwwkCTmָQ*R|[^ԭl6K@5{nU˒斱 Pr\ LY߿u*ƾ;Nh9Ň P~ LUa +vr\zy'T%c~XQǖUXn4JzZ}u*N])@e8PhKZ񎎎{ \r'񄒡K|P1_wʱβg@/(l( P8 IsYD%vH @q@~SCTNIQǖ]XIIqJc*41:@q]ˮpzz Pw1TkA-rr[T'T]rrr5I+X]+ca4jC[CԱ ..wJ7yǝNI;]8dQ!%]c_X]13@NcRCTv^b\]PMθPti${` mTTPǬgWr&<.(!c UluCԱSl+->H^rGzB%g>l;뺏֞9''=J'6@DQ b:HD E)!t) Q U !p^ϋ$p8ms].rƙ{T瞵ʥ00&N>4׫zsZ~o|?M|<ՉLg_zKTGhI[s$WI>/2I>:4I_Kb|do/T܇|g_d^? {R-G N4Ju@OyYkۯ\JC#c:`׍[yg<7> õ]Զa _wlNsZljUG"{{zi)lGs|j_h^? O|`N_q o y^TIy|y%\.`nPc'^q4ܰ:`ÿkyKrLu,t:5>}c|؜\:bv<LJky%leet:u M9~=6F(N>=gʥZbKw9q0Xą@`qu9=6I.]ClUG\h08r=>|$ɹslW/0Hm^N =fs<LJik90HM^ifgu@OxKwe|n=>$^Th P۶.17Ƈarq蛶mwT7čI_e ;i1gf]0Ju̓!]8$P1rMg_tCKՎKr']m[]/1#Ƈ4o1>z5>;6-4 d|84=ړ}‹# l%9:Wv I#.EW/U;, #`@x!$Ɏꈑ[s|ðݬ:_W0>57OTG^%jJuȵIeQ_|×|j_C$?RsiWv ࠮2#I/!q ]`(|p`7`=>ӂ>1Ca|p`E~Eϡ]?E#`@I[1rm/=>|1'JWGvm$UI;:ꦙ=ǒ|i!IN_gpp0kgqƮ$Mu&9zޯf9[Bs1^`_+InR/ۓ/s8HU{1>}d|O'Xuȭ%yע?dùI>eva|/)7!z{G @oQ}yNYo)W%,k|pC$Tulʊ@K'sX`Yû|{IMܴ:b:>r`o7OTG7o$~:b2>Ѷ~'3ɞe|2z7Mrdul@yQIn\@9gK37KwzK!Y$g/ؿ[Vfm{DuVva%}%ǖaIi"~3Mn؊yͪ#Ie}ز/?z% 'ڽ{ af%>)'zm[ziee<qSIgɟɾ~3IS4襵50v^O?_,y]a.zQN>}5L]?ɥ#X[ >}fulT4|zKaO粷ߪMptj|A۝7U%yO粷$ful襦iD+UGJeh$o.\}a|z`<솒UÛ>@_^r[Uddǒ|k'bul ^jUHuLOV|p$~6N>4ͮ"N=t>r|nuul%]F e*LJHgIP4%]FJI~:|3;>r|v*|f$igܑZ[\8 Hy ߫LJ.u\:mI[`Ǫ#HRxCR?>|670c<]q\)0B]@cI>WP=>$^w9ꨣ.#tt๻ 8@'ٳ}@1v޽+ʟwa|xg#HKtЎ;|S$ﮎ'?TGd;ug`,$ I̞tI+%nu|db|z˝\?#Hґ]$q4 N1>cq̞Vtg|83#H2V#ą@1$uuIfw=|:"$ Ir$?Wh IDATrTGCٍM>3>cybw:]>$JZ@ۑV$I>38OrH@iUGc׍ $MӸp30twB^]:u,dn"s`.$]kյ!Ѕ#+m#@Xߎ?NzH9>xRwx|z/y~{ITAg\:qsmv.FVGd<߯?OZTYN=tk3{)]TG0^MQ_׼z I;TGpN>Opzs#H\6/UG0^|nǎ`hnr$=Ggutu|ؓ.eݻx^&]?][%9:qrU0$$Eus.%vuI#ܺ:qr軵50$KnnVVGHLJQ*J8ʊ -IYq ]_HrF_6LP\%#Pa|NuI&ɝ#%'^[__7>CqBf w~7TGLLJs3;:B7n|s`@9 $8KNKr^ut}|HWWp+'ƣmە$;;c:!QWGpWVJƇK/{T0guS@5Mc|sf7WGJƇo&ySueKTG0~=0Lr.0>$ɫ.۳g轶m@%Ɏ.ԋ 2>9sw`/Oے|: xNGV7l;dߨBg%yGuFi|XK.3ɝ#t{N>={qt:Ч!ёG=2Ln.SMVG^]MзL.im[{^ԍ.BwWGlFƇi`/.`a|~̞FƇgGKF7im[w>C.=$]\< 4M{|zEI>PY}^{-aN>C`|zIr$muf˕ܰ:q40^̍\:KILJ;N`xv '`/Lꈭ$/`/ ]ju{yIuVy|${#$ɽ#'0>}q$+\hOf=RLJ$yku{k#{.z⨸hkޔꈭ@w#]zυ@O}.W#}4 kܻ:|5iaw`/Hrm[0n䇫#+|:b;>>$=?z2P`\8 :Ͻ0>/UG_Or8+'Yu{xTGlƇ$yiu{$Wu0;۶u/U'f8ω0/sIVCйI.!׹瞻'juv{챇5M$Vp$?ʢ$X^Krm۝1<qg;5od8C2 8>s%`0;05M{WG<$UGk$Auf|ck~%ի#yIN!NqiΝ`0VWW@לX>^sA Hʀz,l 󲲲b|$7`/俫#$#蟕'X[[3>] p}*#ihI^Z>NHre:L&+.w#Nj3{=CI֫#96i2N+&ݲr)pF7WG{'9:h֝`4M| Lr$[1oCyI\@m0^t=\:}RCޜsIV#臦i`xrn|UG,PLJiUG+&UuKxOr 㡎I {Hu0$N>OwO&z`0|$ɵ#ǩEx~|m[Pn롏.%m[0MnFǒܰ:} }|ptw=:nkk%C4cM_`C鮺C|k"?6cM_` ニiGTGi`H@enE$'W_Lr: @%kuuJu2e|8-.c`0#瓼:b2>x:`0딌ⱌI]@'%`1/08i X#37&buIJi|HV_Kriw>Cb|I.^~\LcNK!q({s G$yPu m|h<:TTG mۮ&Y0/|I.Q~=#ɴ:bGgv1! Idwu:묣w9;俓\:}|#和ܱ|HfC:$'TGP%`h|1Cc|$W`ޔ:>$tӣTGPgee93>#8>pZOTG_WIrm04`Qק^Qehߵθdb|,$C#8gw|:F[UGPc:z04AmkVG_%yiuD_O q(9 Фm`PV<:zaFcم=q'ϝuYN?tBWG_mVGT3>.xku$;#X.0Dv2>###87%duD538+$sqK4;ٽ{KyG+UGp@7pӒ|:zLFm[Y]]u]IV}2۪#0&yNut\Fi]gee`NLr=o=w(#} vyI^ZƇzWGp@Lr`&خ'xutr ޞdOuI.Ru]$$.1>$] 0N>CM0^ ]b|Iq!H= %#XmLS'.$Oþ>$`8l#2ln:-Ǫ#ONLrʝLSIr0>ے|:ڕ,4MKV<&@-;#p`OJ,m|6I~:zJu@WI>WL igmuDWl-_TGpPMr‘b`pq،%Uu̞#Ƈ;%W#8&ɟUG0_mN2`Pڶu،fn:'ɋ#ppLܢ:93w9lo%/3{~IίNJZ|uQ{i::lĎOꈮ3>ڗ::>]#50HN>t$W^K]g|ؘ''VGpPKrLu۷j|ɝQ4Ӫ#1HIX^N>$^S}`|ظ'WpHNrgee`ڶ5>s$RƇ$ﮎࠎLg:Ajky|u;:/IYֵmm`v 8K9%j%ɟUGuĝ p82{Ew/}b|ؼ?~- #]`~9ɯTGpHN=laސ#ғo^L&`}$og7ZIP0] I]!=.lak6Ǫ#8''9:iƝP9|}I:[3MRIVmk|{=&ɥ#8el+|:CzPVGq^ SI^SWƇ[OrRu3/M:mۦ:脧ǩ>x|fρ4TGpHl&?I~:CLfoa۳'N?Ӓ쨎`C 9/`v&yju$k}f|ؾ&buIU8 Ν;v$WGpH_Hꈾ3>lwNxl ٞ={0^H6O쮎;|$Oڶ5>K0^$/|/#ؐ%ʝ`;t$'TG!'%vuYIΪ&I|k28d<ʳ;;#8Or t:uI~: 9)UG a+lȓY~y0XrT'UG!_6̉a/<:2>4.<"e#ؐ'&VuĐIΨ`C0|W۶Tw,>Ւ<: |UG al%Ks4'`T'qIS14Ƈx~TG!7Nrf\6 `4lȧ:b'#ذ?Or\uɎ;pFظOd:b$Y\*"NN`ЦөW/=)ɥ#ؐ'yUuPg=WGaJrL&|i'`خlأL#XCl$ɳTY۶N>ֶ0\+INg}$2MGluAuM&0hN>7ɵ#ذGe1>,ީISITG;kKgvq1/I:bC)cն;Akg$9: {tu$o`~;ͪ#ƨi'sWܺ: {[<] <:MyFd.FϘ0,'yVu-5Kb|Xw'ysuv$N#`|ayD+WGaoHꈱ0>,ף>yx#ĝx U<: kR2>,: ;,ɳ4!c4:'`$Ϗ?,W'PuĘaIvWGa7Hrp0tmz@I~: w.a>6)I.W0`蚦q2I:MyVC%9: ;&s#k3> <'qlع10>8;ɓ#ؔ'}u8 .@N[TG)cd|I>_<3%# _O6sI:buO6IV0p`|̞RPI>X1oTG ;s+CI^Y1fƇZ$`Ӟ ,I6!=?&ykur$Z0P`vmRlS\:MySӫ# VgVG 38cguanlzUG`|芏$yYu$9%ɑ!`>h^~8"?Mu$%L6IS0mH`va|~x\TG)NIQ=0u#k_W.{êCnWGiONrFu3Ƈn$gWG)+I^/۴sN\FaeeÒ0>Ǘ30>tyI_hf؆5'QX__+mOH#lc|:2>ts|:M{p_tj|Fa28IP}"!Ƈٓal$opGVʊtj|n:*KuK}̞!ƇnzmVGiWR`:iv ITe|ZGf}4L|Fm['{nlZWGƇ$'WGiM'hu@ߴmk|F㒼0:3|:3>t%9:MLf؄iv i|nyNUGi_Im_l6}0^r$`K}KI.U`,v :IN`K=ɋ#88C'91I[¦]< h$Xu&_iug|Nדܹ:ڶu0N>@{$yu[$搜Ќ$߬`K]i`,ڶ5>@+&yJu[zW$ya:v iv L2+I>_W7Hr.s0|RNlg<:3>˷<:-$ת誶m(4MKP:I_=(l:;#ؒ2ϱ>p40^%L$;CؒL6O'&Y`Ki]KXpJ<+lzμ$ϯ`d|FX$9:-{vVGyƇztUGeNCc|FTWLrJu[$`kuvGTGe=+!`,v c5_%9:-{hs#C=/{#زKq '`9lٿ$yau[g|i{&S–=:VGt '`~>ë#ز$NVuƇhgUGeI^!`|X㒼,^wgla(#زLrru@m'x`l<:3> 7<:mu߫rYg9F4VX{$]ur$Wo:myf#*~`4ڶuIŻaXlّI^dgu^DN>䯓U–}+ɽ#ð|&#ؖ$9:`VWW|%qI:1> II:m_fw@mW#`@n1wl@b@ó;'iCؖ%zuLS]F嬳rIN`[$I:2> ;:m9*K``&wڵ˽}2{~rLu$o`$_`[~4_TGq%T IDAT,C۶`Tvls➇;'C#X p}9##ض'9:`ќ|fuus$w`+,aNNYIYHmۺ]$Ϭ`ޟ,aئ]>V¶IXi|Fe}}dZ{f2> G<:mZf1$w>c3L|y~`۞C,a(ɧ#ض;f .clɉInW}2WGxƇqVf!lӓ\:`޼v db|$O`ۦ=vug|w$9:m;,[0ON>c3Nv 6$$﬎`9$gTGmWN$Mu8aM&Ru$`y$`.~=#aIrIΫ`ysjWUG0'%ypi|CQ'VG0/K0NIm%+!0|Ʀm[哼2IT$`..ڶ} iv ̞w\:81Y,a^#OrJuvx06^$׮`.ޘ0>۽[\!.J۶N>=$#AuuI^<9.˝`_7 IΨ񁓓CusjϜ|FŅ'yUI^PA-m'fusj|FŝÓm\0=yc[B-I$`n~<#6m&p$ש`n3>p&I_gqƮ'BNrBus$O֓%wC''C9cr i|ZܜhTG07I&CfϞ=W7,  Oʸ`zHt$R\,k2 v0:^uI~:yW?[|$wJI^ށZ__7>iFI$תan떦!tg<:$؟0FN>0VOHrI>]A8&9:zTߩ~ԫ1r1]WG0WoMIIrJ^`|`l%=`Mr̞#>&_us+\:1BfL;7,U`.$V$I۶`<|`,!/Q\*ɫ#6q$_`IVC&;1r1XI$?Z\F͒<:Hֶw^0tOKkݓ|:3>Q&yQus$m2YPI:I[=/ɛ#q$`xm0Js{_LI\A،'Sius#KůZ ڹs{㓼.N 4%Fua|`ޕ/#fjT4ݻw;x0\OKOxXOTG0w'NB,U'I6ެ0DOV|;anř],`׍ E$T}'װ_Bت9TwHQL&^P<1VGKxJUGNr`t:u!Gf$yzue|`;ru $Q _۶`|`nY,W9I[Aخ/'F4D+I^䧫C3>4u:jus&k/UoX$&ju0h`ڶ5>WWy!,ğ'ycug|`^,3.Q iv >9%CX&ydu`|`^IUB\9_4`|FɅIސj!,76! yN@0LMm~'處$/O3!,Wua|`ޞ,̯y晇'i;*$`a^ EKWG0L0uQ^V4IN`aHr"|-ɝW0۲f|Fm[]n ,4&9:1>(LrRu $9% C~[]]5>zI^J'$y{ud|`({#XÒ!@MS0Z^@TfaaZX w|:9"\:'0f^@]3ɛUœ+T0\3IUB],[\db|Iޚ =|:a3> /OrINOr_ڶ5>cf|k.$a eOVGPW/#.Ry]rlOr|u $`,In읐GV0rN>G$95ɵCXs*ɷC$a~:/ hI^CX6]3!3#X'yEۜ|Ƭm['6I$7aព NV14ж U1>PI$aޗ {2lgWp@wy0r^@'&gu wNfa|TBLCXGev`9@&yXu 7Mr$aTzs#Xܹ:'s wI,}ue|ڣCu $y~;T`|`n~Ogޑ j::[I3$iBI^d:rf^¸/g6@8|+I^!@7x0r1%$$I !@)NvGzb c̞MC$N$c0jw@E$cq~fӾZ@/=#X#2觪C~FmǎIޔ$Z@W4s#Xc5OVKg|FmeeeM~@vumۮdv hKrzV4N8]'m19.'fuxg}SM&p|$XuKsf$]b|뾜7RP$$ר7>u~TuK$C`{ܧ:Dfw@_,ښ='ئ㓼=eCX{%yu8%,eSc}}t:5>UWeCXg%yaul>OwUGTLI~:U0zN>E׈c$2>'\@2ꧪCN`|` ٛ0.g&u\0M/er$oI!L&0zM،$9=ūCX >zoUGt%y[_*m[0zmب쎇VtNY$ϫ`J$7y]uުTeH@v!E(Πݭ?neEEATdTPP Q@ $Uu~|SL}=gZ^u-{KJb |$ӫA4>\B ;u"ih|$Ȳ=:$)EѰxOti,Td.Ѥ ARX>HIxD1`!=UY>zPDî 84:q$vIԧÀ+QA4^ *85ۀ,:];MH$%Iq s%,:4Tj#HG40N>Huz-p)yWs&R=X>NZ| xCl IIrAZ(׀EA$^OZäiktIc IX>Hz\HzUT>V\MAE/A|8+: s$4\sQp R=Y>=<DaN>A,$y]= "՛_̩YE:DaJړ.),$ ڣH´ %:"5僚UC(1 A| \AzqR>;!F|P;tI5D I$Q !pptR#Y> 8:BlDK,|$I*ɤ(P7EKMAeX1:BlD*J/2I*mH_:OΡXEAe$p($:BmK IRX>HR9<:5:B=M~ p|Ptȩ+:BmJZwtIk$ ^ ":Bu&" wGP 5Aʲh!I9` Iҍ(ܻCHAe9S!np5 R-]ԩIJ*YE$5B w6p^tiY>Jtk C*.IZiN?HR9N RU\D*@kp4Fa I+Ŕ$5ƅs{7zHl9A opa$i+VX>HRs |x{to#eA(*< ʅÁG]KK$j I7 !pht£"E|R0TDH{SHIzIWW$v->A FY>HݤQA ۓ WE$Akq ʅQ]A<|^ccR R3VRwww{tIҠF.a ʅ x3IX>Hk*pFt Afe$TV|9 &ȴ!<|!ʍ/*Y$A|AkpEAZ߉\ %`Dp)8 I/qA xtwFAZnxA+'WHEWT,$iJb I7]k RY>H,p0p_t\҇iA"˲lTtIʋ,,$)vnfPtt R^Y>H}{T@<Ds RQvI^$ګ[4I` RY>Hv?p|tDHE%Iz[o6\y>:wR,\\ gƵKRRi IZM ppOXD*%) R8 I+X>HR~ D \D* i`MZEQt7琊AV$OC(w2meA"|KC(^N:H&|xArao` ʥ.Kip> |<:ri#Z(ȲAVrA½tXzrtGEAӰֺYi,$i%'$)L8E9u1n/ŤsߟR!T_/Yub$t󛴦o'Oi,N:tl RX>HJN>HҰ8.8>AeMA[{FrAVrAվg GA]A[V1IeYwJ*J=:$ɤDQn "5~j!*[h(ܫ+IvIn$%|`DlA R|Q`QtڱAcǎ|Y>HRl >:rs|~@lշxB%e I|xetd!5@mp5 pjmm|Y>HR+p=wPߞ:R | @$zzz{]Vg I38>?"5+n^;TXyBMAb I{ ʽH+~CjjR]6;DZZ>H,$iZ,~Djv!A{*YȲAV7"2WHT}r(A2|wHDWt^+I `Bp|-Z=:$x2l &2:Tp,À;H$m̘1^%-viCzGA~NznN"KR|5,_AD&` *WHec Ÿxv+,Ґ9 Ik1b$m8Rb`TpCrt,8 Pw/" Ee>(JZZZ,$o/n%R# D*+)E{CPv~N ɵKnIZہ]PN':TfRsB \HZ嗸*"5T C#Io_ ΢bǣCHeg BsퟝH$IZˎπp>|4:$)O> |$: gg6{$ZZ>HK -: V|!T8KOmY |X>HtgQ[%\|+z ` R_\$IksA =: l.E)ڕ4|jt'$܉ATHgw(R.Y>Hu6*Q97Yu|5T*IeAZ!{10&8!$僔o fATH DZ$!2Ie3rLtRKKf 灷=ATH[?Fgo>HҺT* 4LZIkrnHω"oR1\8 .8De'$VI)@e;DaRq|8ڋ4|\t$I%pp0+: x#?A$T,VDQaE%eY+CƃӒ(\r`BpW7qrIa e *;=\/^ԃ$k$5WNB[ |%:|J *[&N>Hj2U},*e0DeT\^Bk>!8JAIMdk:l\Y,$),bp0lt>/X>HҺY>Hj'w{ŃThR\ lEMAARM Ep(iFRY>HFx*:B'(QA||j It4p/i-4TH:yx$:Fe,j"jAIEA:>3>n">,r/ct5=]ҐeYf If H$='x3Ng"~, A4%468 AAR~lE7"Ԕ,0I 魦_gQU*IZ7Iy7SHR=+d 5HDQSٖt\ep5ޡJA*+Ho<DMk!{M$NJ+,$ '?ў'&,r <DMMgQ>X>HzZ>H[Ie5߀Hc `/ jj!wOY>HztuuY>Hj i,jnfE/$#:x:`, IZ NOHScIZ%,$+04~+5kHo[gdYf IEI6 8olI"),$yAFJ,^jAR= 8YF"i3A$僤5uo dY$S||Tד-Ig']Y$僤9x"8a>[4DKp5$J:(;,*.sg琔Sr p0tt;Hd,krI֫RX>H=𠴆ϳEA$僤 <D1T~M ΢:ZtSԇ,,$ T4s< :||wDutF4*~p"Pz|>8 iV,ӥ>!}?pgtIg f7PL.~ EC4bIt!S\~<CRAX>HN *_&݆PX>HR|c"MEs)%A$僤zx-pftN;pS!X>HRzzz|.Ҋ{b㨄> ,"X,$ F 芍ڌY4N>HRߜ|n"X*8ʧ xp*ERY>HpR1fB|eYf $\6UYTNET\Z`i4ܪ HSjA$`-S8*H*6IpmPyՀ_gzdYf I}pA*9@GpoH*>I$p*&rv΢58 I}sA*gQ}x":` oލǨk.piO,ZIꛓRFQeIzI Ip.p$\tҞy*$RxH**Onb=K:,}FpIM/b$5;FQmJZk`^lr˲lTtI3.I00%8petIAR#tA$v"8K)vI%t:`,πW"yY>HjE7)/:\ˀk$i,9p>uP\x,:f i8tJV%=8 舍S7yN~ Ƒ<~6p BpI%` i!Gy4Pxmܜ| |ol˸8*ˀI/gTeuLR^L"= XiyA6A*!YE{_"\,$Et &9+8Kӱ| |ipM`,Қn!=<:|Qҁ H0!8Kp$mP{tI5p }HrBX>H xʟYuO:J}>ypf` I}k˲̣Rm 8Ƒֲt{gmI,$H{4ObJlB| XhR~mDVR>= . !Ir=? !O#sBlB| 3fwܿ_GƑfsmA$ ,$A>!=t>H*!)Iڀ˗[>H!ܧ;HIy8x!8߀,*_I1VJz'^'8RorAR^}x5ށP8w_xQ6A{Ϥ[_cHE9$i,$w T$ ɗ1cƸrI[~U`![RYl_nrAR=DꧭHߵtuuY>HR?8 *p,t >6o%wx,:$/D$rm xB2ݤ&hmm|~|wq~[ x"8$m僤" 펇H3p1]¥m IPV-iN"ɼT"~!:$僤 ::4@S/aR}3*:$AOOO~?Hä4z/0T43ۣH@X>H*H50i@)&j){JP9 U;p2p?iu8Ҁug "If 2l`(84H%@GdF˲A.ƒ&M lGǁI =Q$ip,$ t m Nz# A|T*#$MnGkHPX>HjqTQQM"&"&Ʃ/'$,k $KJɡiˀOsq_R|,IOFd'-CIR|~pAO>7LM# HkNHR]X>Hj6WDh/uLgh|ɲAڰ݀KHC Dz|ԌG:Hgj9pih,ARvIZY] IRYEb Yuge@kls$kTI/_ O_Đi൤5K˃HRCX>Hjv+H!:b$kUƒq<:$5僤2xA:8 x8<4M|qAb gsCHeDA$,$ŋ7^Goxb̓Ӓ?N>Ħ^8G1/gaa l DjoH  ';-$,T&@{BZ 4,$џWgYF=C\$I*&'ԜzHg&rTV]]scH 5/JiA9,$|P3ێtA]bH 5Vg'ׂsH6Ɉ\d Icf4 psPiOHR$IJ^<Ej*i J&I5_t#h M$5 #Y$)$]Aa2l+ If[sҮqas087:$$wޤ`YpiJPLYY>HRX>*J* E{HR gI*MH\| PbK,Y #I.˲E&L,:O7o"x'A$),$o ̋"YNALeYֺt&IMZʳ 045y8\8XDA6 g" j'ҲQ$<_D))Y| "If I'xW*MCHRM.Gns1uQlFq$)*ʌۣsjѤ1g$ L,$1*[HAtvvr2gFΥwĉ7FP:I8R!< pgc I-%`Raj5:;;Y`!$ՁZ*; I6#ʭ Ԭ,$ 4i@&Mġ1^{EGIͯ簉'^C pYy8EO4|^|xetj+;a„wEЀlL* +#~,u,IʿW^`iX={6#F$<.jo>Ie|`|U?"IZ??IR1>+iM4ߟ<9s0qHXe_0a 9Nz̃Hï $p&BpIX>HRd'H/$@R=3f0{lfϞ+^ W4IڠJrcGGǾ9va.pP#i.:$i|0x;`lpI>0{l̙Ö[nIR>^fDh"SWʆ+ ǀ˂HA˶gyA$m6lj*bc„ ё$ݵZm6>wa|{sH`Ԝ"ZZZ}w}{y9s&ƍ%)}ZmCnh M$i N"I/Ij^I h "iZZZ:u*3gd̙̚5-OJ/Zm96A*fG"ݮw,|yUA$ ͔)S9s&gf̙NZm9hK*^ϲR ;:$q&IPD:618:2eʪM;3j5:{VuDBgJh"I$pE "Ij0I*IqtƏ{͞{VEǒ4pkZ{ta26i?$5Bpp:88$iX>HR9M#>(:]4sLO9rdt,IZTsY+ tfi MI_G$ /I*CsmHގf=czo5"{Ry< |$:$)OQV") Vic=c=x㍣cIVT&utti5&?V(QHR瀳O/g$|$ڜtx ^VcڴiV5M>Si8Xb7/M2 lHR^|x'`tIR<\$iiJ[[mjnMI }VSp6`* FKw7F$$i] (HzM2eBbL2%:Th---;79؅Ջǝ$Ig,|$xGIZ6lôiVz=n-Ce{L0{KM%y>48$)|$NyA$[{{;nZ$UW?!%6ca7`\I*wD$$i g;F\FԩSq6m;#mn-cǺ^^e&L;/# V76> b|$ Y$@ ulVTRU*yW$mmNR ,$i>+$ioogM7]g11m4FQSWW?0$˗{GUR7`TǏ_mTRc^xرkM`z ų>_oҥdYO$iH#M(/"IjrB$I$ 2Ҋ?g$_H" p.$I:4A$I>H3sH$IMf?"I*'IR"/:$ITp\DTn< D$I*ISŗG$ ,$IS^E$Iʻ,$b Iʫ*p$,$IR<|EY>Hnp,pmlI$)_O˂H^h@*!6 M"I$ 'HùY$I IRь3QpI$>|x>8$If I*1g$I D IDATqSgt$$z1;elI$i"/g$i,$I͢ 8TBL "I$ 9xA,$Iͦ  |E$Iڐ?g_HT7fUv"I$^cY$I;IR^E$I5I,$IMAT&s3H$t g$,$Iet0 $Ijz?>\Dd I*=S〖,$Ij=UG[HA$8x30*8$IkptmpIBY>Hw&g$IRq,. "IR.X>H1v "Iz8x.6$Ib IUC{g$IR~7U+8$Id IRN#$I*I"IR$IrMY$Ix+ "IRaX>H48[og$IR-. "IRX>H44cS]H$i, "IRaY>HT`p2@KlI$ @#,6$Ig IRmOZt20!8$IRY$Ij*$58X\$I7.J$5$IJ&IxV$iY>H4vބ+$IKjsg$4,$IѻT`,$IͨwSY$I*IbUJ&I\$I c IR~l 68$IR<|<`pI$IyT'݅X#IK/Mz$I9a IR9 !I) "IAbpB$S$$I4$I* $I*(IiIԌ㔃$If IRsx#i"bjpIp1,$i,$Ij>{JH$e)]z #IAƑ$I^:eq$IR#X>HTGoF$I%[2ZH|$|v!MCqpIܞ.'M9E$ #Iʫ 8TD,FƑ$IM1p`ylIA$l2I*DpIA$1+ "I~k+ "IrA$e`!i5E$Ix@G$$I**Rq40%6$If?zbH|$IM*"6#Id p%i8$H,$IP8$i^'M8|XG$$I"H`tlIOˀkI#I$Ij$ɈQq$IMpx:6$Ij6$FsI8$SuH3q$IR3|$IUlG7jJk$I&$)J؝4 Z`ZlIwI-@OhITJ$)/vʈWI7J7g$I^$֤@khIT6\ >6$I,$IRM9舍#IRU+G$i,$IRI{IRsiJx0Z$$ȶ8$ ͤ 8$Ic IH`8 xYlw?V]rT˥ZjLhƶkMX ~PT.-P0A.̙IVf'{qYkܵS:T8n|3 Ek"'gǍW/ |֢=͎hiԸqX@g4 V' )fG4qc8B5 ?U7FM0"R盕TFM<^Yp2j"9|mՋʈd V׬leu~8ˇ3pi˓q k*Et:ְpeѧGMPx0U/4xnyD܏1JGV>5*|XY[f~Cr.G7#kՅQ,5BGM6}Tp_Ñ Q>owdX=1j"ц\ 0*|ވi)eDZvHulP,|X6VZZHzX|'[Z4.*DM`kDTCM쨉/ŲfVߨ֏ 6;㏓g,T}ķmc֌;--ި>3`BQݹXKcS>p]շ āV7T |nLο5%,NU41b.EĎn-&WFܛZ0Y3a[CPJ|m21eT6 Vo7t4b.GmsTC!1ӝOWƋcˆXc̓՗[ZLLǾjx`.\ba:UNj3VjOC!|#`5ZWCp6g#|`((GVvbJR>|PH쮾4ONƉ*p:pLC0}1NLxpg;]͊=ݾx|2pRݾTX>??NLXyo(-el;\C08;yX>j`lPDl76X_h8 j[\m64&ϷNݺߛԺo.w[/>T]Yjɲg7Q}k eW'y}fE3`Ŵy5 IENDB`mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Stig.svg000066400000000000000000000106461341747546300214600ustar00rootroot00000000000000 Stig Created with Sketch. mu-editor-1.0.2+dfsg/docs/swag/t-shirts/Tim Golden.png000066400000000000000000002422271341747546300224630ustar00rootroot00000000000000PNG  IHDR@sBIT|d pHYs\F\FCAtEXtSoftwarewww.inkscape.org< IDATxyg]L&d'$l! B(;#F@!qZj.QkKD"U(h ;",I!A!d{f?gdsx瞓<}] dsOguj6^~+|su@ig6UV{Wd~v{W{7c{V?7tqu wUuM|겕\Y]Tm__^pg..ff>A;+_uW45.v&{gU׮x4qܥ;y?JS&`۩sWrJ9+nf]pTSaӘ2t]M ۚg^= KEsPux}XN'0M;}&^эh\|`^ll:pXөVrJkj0h,0njF|e%gn+_ dF½n"W̄D>S]:4msuxn`{L`li[N>U}``],M'PX8|%X,o45!M͉T 6Mm_4w)m_?Y}}dQ/vAݸ$`qm醍/U Z=p&G̜ kOVX5(frڣiV.#M SV꟫F|X|W#}G,[oߐ8ȢX[el2=gu]Cb[Sj4nV0mjD|t;"v|سzPuLםhsU [e 0 Zl\oHjȢ>3n7"rIO]!a~@k365"_sNG+Q=6FkH|bhE L`u_= TVM骦wu]C,s]hxhЊ[65!>X:cdAL`V=fc` mkFzOձ[ǭ۳XV7]7ǖ0loۀm͆5Jؖa5v4e:pLSအ0.om?4 XJ2Wםlxlu.>u'#N[|A'656ЗDzGur֖U=zjj6/mթյC+XeاzDS9846]04yvM UǖMs"O`lt㪣ƖkFۚNG\9̺C'ca.YMWYcy,gƱL::3k`V<\;N>X];`i>lnj6|our`a|}5CY=cꯛNDX `[=6cuYF_T-XdZ]<0;UqrE} /Q5`m[zkurE㛮TzVrݴDI՟W-Wڣzx V-X#Ut"Uc#6VG7pxnumM'"fl9|nN8W<`64kǖ"\=zNuK3DKU:`>}z}ǖk M*=sl9RZ?k\ ,X>G5pkwg>, XwAkgfCkNiMTm[@U[7xSuryk%Uk`h>b8zQ){`W|M06Vi:\,{߯Z]3`Wh>9zAc=ƖV˃kve4m7qp`4=N9:!`i>p`8 3FX=j̵-_Ut:@8z^kXD_^t-kՏT?Zvp-O߮>5X ~qJM'!tEFkgJ?[p-\ǕL4`Q(W+:W2|j%J&Xej%J&Xk^\ u+3sGvηU?taZX{[~Z`nh>9zi9,Vz[Ӝfxnޞ3_cp-̎OTL|ۿiK uV`WV f\ՏW?]np-̏W: Pnj8_m\ 7ͅZ`(1T[1ǵջ߮N\ P=ak`}Oߌ.֓bCꗫ\ 矪Qqup-4XtT'T>MTm\ կW\ WP]3Xu,=U_uի+ǖGEWW;댦_]>m̻~Z`w]V;ek]ڿzQj;zUS#N|`PJn7Xk55 ~dp-4{W?TzuzF&<fݞ _\ vN`WVWnjcTfoVP]3f͆ߨ;uiΛ-k,y\хTk՟U4 TzB`}:Gr|`WzB`|}`Ii>0·V\;Xp~BX.4 {VA^m/ %Ý_\ 2Z]x]V]y][]pysMm~~wu׫`-[W`\ V%EM͂˪KVw\sW45 .YޅM͇YMW_Sbsu@:ڣw3eߕV751n]X:NGCMZչ׫s>YzA7n(lwlhjBM7'}ywX&_ifQ |`=oշ.`]Q}:Q4>MMCnSS`VP4cGjj|::s_]MW658n!MJ̋w4]O `i>m:|-W7]y 7|j˨Y 55!u4`Vlzi04UW?ɨ},m!V}- ̋X=`fTpUWN|`gY]} ,7=*7W\ sDql7<VӥgO7bLeYouxuDu_y*'`}*._'8`]PӚ[搮iUNZydQBxo'Fl|TPDil)97>k`\m!Vo~:wp-(Kn8`]S}pZuJE;շTG+{dQ;w4G7]х3Fö&)թj>]!qduE33MW1}t!9 F̄iS2ltm kXrW̓k8骤mv]ty8 4Ӫߩ>`\]}`םh8-Cշ#coZάcƬ3r::zB5wzo4|rhETݷlzDӚdȢ5>:֗rcՋчEt^S6o 0R}g`l^[rvXaccMX=gT>P}@hlCG6]갡[|X|~ӄ|vw`us#4;^۩MBX;lkc?_1`m>ujzhwT{ [UP]4րbzN[ vMst҇KV0tUcGlZ3ά~х4_=it!9TûwV-`!ԌxJ\=O4`X,=T'Tǖ܂7jxWWǖT}WS# =Vܒ˫Wrp-&իRvᔱPݫNEWS#Ms#[,S>:v|د꧚94 ~G'X.5 ~Jcˁze+ekVh>̾GU3X25lx[n:N>dW/UW]7O`vݶo5˚N7m;WOnIվcˁpm MflzJх;soR]2MgVw[,W?ٴ`h>̖;5vxB`[muRꪱh]ǖ &Ĺ `0;^Uat!4M`=i?T?4f!6ViM͆S7taVGgo]2gC˪`kө?ޚ&ճf҈qQ59 0 7~B`l;: DV?R}ft!"`}mj~ky ݛ<, Fs՟䓃k9sE;W<e6V?]j9iIMG k97WWjZںgQyꯚM!ܜMs!m:q\r'|XhWt -f֟W?^;y\%:[7q+ZkজShL2v;zEӦ M͆߯N\ p~#椦& GqM6WUpxwur]pTk^t:>X= `SkEU/m{,lZCdzM_0'vC?qtzk)5mųztS#Y^cˁ>[=BX 7:7"#Ý"SN6-rݹꉣ Arnlf@W9YpQ PgF8х0^"kf9<6Pv܆q_T[Yl~{@'ՃF+/-s~ fV=B=U63"6 S/յi}ƯyD+7}P/TE#[wVO˦XTonZHd=9M`=zCuх귪[ ~*o̲ή~zBX_2O?Jlq%,KV'V{Rw/DE*[T`vmtE"`W]ŧZU3T"k  Ze̷;6]znX"k7TBOO_dvNo`,N-k.Χ\{Vu~"S6XlUnLd5sQ;{%YlٴXFT'7FDV+ p|2J'W6 i8_F>^3fӫo6~(i!pS^Q]S`lN4~(;9A#^赜dkө=`&ܵ/Ev'45nbٝ]N@ /Ev5g7}RoX 55!Ȯ64a{M"/7m Wu\ƯDv%[6~!(+9w=mZPdW.lOdgsZMMM4~m(JXWW6~'3MacƯEv&W4X%{WmBOdgMI=>M3M TnNdGO#906VVkZRdG%EȎ䌦i`ّY=<v2/9zi9^MyMn2/FuBu@,Wg7~)rkyCO$drq od_R>^-|\ZX9>rYצ"7s|\Udܱ qyת"7s grVonnMRM`)5dv=zoװ"7S2X"GWg5~&r|zj^5 a,d@^Ω^\m v긦7{GqE X@ٖK^5ȶlml `Alȶ\4.ڹCubsXd[N `R}+mygoƯEV0rU"65+6::*9/DR=iz~"T ` 1`!z]BXjWU;ep-OTVm[Kl9MM-]9W05ȟT1oŒ,w>]=)?i:1zM-˝Vw `F|KuzIfu_06UW6~-˛/V `'V4~q$˙-MG,U'6̈́ESgqyo`qYkoY\]ThC/d9긦 V}kqYΜXm `Sy?|զl~ksY]ʘ_6~.˗Ww`ݳt;\ZK=JkvY|wAWȑɖ5Ձ76M_5,OΪ `7=YR=4`G=ƯeyrqvѿjF#W/Y,=k{Y\]Nzi2]=8|sX[T'6~$k U}{"\S0`H{߼:41{#l~2`h빺:#6V/Cl~&`DӃu]3R=" 3|fkv/4.󛓪MVo~9`q\T|8{)ϼ,`g>V|gd>;ehek?=O{U'6~% _. `1<:{-"F~iZ;rD/4,7T6&ٵb@/nCY+W?rx~uIb2_A2?t-,U=OV?,4a,7Vgf2?ZXD~(\t=u\uij2Z` []G>W}[l߳|4dpSG,gVW5a+ [|Ov,WU+Ϲc`g0ȉ`QN2y9ZW[ys>T^}e|^KgБ`<{` ?pdlQ=,X{GU4~/,csM`l]Wn3: ϣ `iܿz{uBꓣ }х0Wz{> a4 ,4Y{Uò;zxQ?.>ރ`]`6ܶel^s?6a"cj`v]{f\jK$2.o fϦwqR=3ʑ%ȸn06T=ew\8:㥍K˸Y3m#hȘl~.??룗9TLPq75c˘-fjCBwluU2&3ϕճez~̄pS4 5WlCA?UOzuh w? dsi`={qY|/k%գqLuQXW?_ wR}{sYh+_7W,GU#9at>^2MC>6;;.u/g.vNػ49wU4хRYP /_%){wY߼:VՏ7oZ7ܷizJZ{|Sb{>T4}^T]d@ӱsY>WUXojڗ~o@>gZs65A8}0ʳ} c y`][zB`}JӭںGgu jk;yIƿW kXBwk/aY0k~M žՇW>0~#^:3~ETf;W]kG^Ytm{Vok{ ՅE+kV̋}k{ oN6.iÑ aM}х;շ.5a am]KUi<,/TOHEՓό.5ꕣX-5XmΨ0Q}55%թMGXLU>=`UQ}BX34]х\ZT)EvQ=i<"|хf{Wy}{Hƀئ/NېlHˆ&,MOvIH6,%\ ̜Ȕ *#s>5syƑ\+xHv$Ӿ!#zHmn&wn1!""` ""5΀ES{|75 =FkDDj{b=~ΊG+M1r#"R:BPCgշ6ύr|={ guDD${d7zHzHh?61O!ZwxG𴵵m'!8kT4|$g"8rn$!U {k_ r,ɾr`wT >Z B]RuۀzЬm#w)x8'Rԟ$ntn-;DCY!YS^ [w 賖\֨fAIV@\GedC8ݼ*md0{Zʕ+ k[[7Fw|jL3%h&UI d^;BKw#DDDDdB(jom>o\~j#|;AUmDD*~\!Ue>Gb*p'~Q#ޖTCDDDD !@z(c+r'G#dۋEGcH}H?Hv<  lڦ ĕ+#ZCDDDDc .r/>8ZGrqx(rMtHDr}Ba"}t셆7xGHU}wH=4Gzw UozDD$;B R4|<wT/#DDDDA-K9 DDd _RU_yGHAQ ^ +IײF!& qwd֞mo亢4|Qt-ˀ.Uw`w0Ut<;BDD2zgڒqn!R%LO!""""`mEvk{HUڐ'R=y5xȎȨXnYrd5 ""R7V񎐪)? !R4U=> !US2ѶbŊɻM+hĀM(H&6O M2$ 6).[Lw;_P}~ B nYŔlwƁG,Dۈx!~7ܽii{ >,mwԕf_vIZ&UNjZ2[! 6#!fM;ύm 71룈;;(,7[p’/ygH]i"U_>HxsT6+VgL.W*sœss!a pn7y'w$V\Yz3]~/M֠|@LȈYrealöc-p q8De m2<chk]_ak'dl `\%gzwٱ 8"K.էo/YEDofzȅ,gAx6l;84e%c5 ]2{WU@swȓ hA0n 55!22 \!U~?#DD$ַL+NLSHxwN̮&_]}qw{՚5mNBW n{ߵcw^;DDD|wT?ѣC}fxȰ] !""Y8, 9MR: aYnD+LX3޿%EDDj\yw $/="CÇ}2lI\z;DDDj[Ns!8޻GRf?hvQ}`%hPuQvyx`w w{G~]7p:;DDDjD%{މ22~ߝwcFU3;-# _V8ha Y$)%t!>nxȰ]|;BDDjʕ+ (dthwK:wzu5_`ث"""2lwugiP;B#DDv^|@{=RvQ;xT[{,78ĥa*aY>dIM@;De5p*#,ޏf\0x/5+&{ /Yp$KzUg3-CCBmm[N4xtJ籞{׶.šۮ>;h8<_'˃|I]'Ɇmt}:Ӵ!..a{zqޞ7=!`>ǟuh]Ҁڻc쪅/~w w ;HA>dZ`w ˷wzG븭`MD*wVJ?^bR{T!Vǀ!R}>da8 ѱmJ="#FyxwNֶ5xw/Y!""2'xȰd L$t96 IDATxZsՇFܹ+|<"""p%u#yGHuiC#9';DY@;DDDelC? {Cdn _Z W+\%/o!2d]$gm![!DLDDRlrWG7 ',]6fΕrm85 _** !kxGHuλx<ݻAD$rR{krI4k 2NfW.Ú1 9xm$""ٱw bRZ 5 +Ih]lж%"#+`Kc [|wi{kg~ů!{X<"ãC6\ \!Cv7Ɂ*""!\~1/+c;w|au =u{s8\:j_!""REUa2tSOÇ; :~re$"H k^!#R,g?v+WnrY4/8~R*{'t,*3IHR:!"2E4>"":Zn AsBZ~eGi{orߡ&{7!C_i2d;BDDo-'ш[HZb@a֖ C]"GOk˴ """#b2d;BN.4d;IGCDDd:Vnj7|»JCTț1v5`Xbf1a}ҮJxsj- ʥq'Np(Њ#6< hfWxGH֭[Vއi`w Nd0!l6vW|jفpʭX|N;|QwHw 7wyGiN';0[$[fH Xrn |cw <T :P/z ԟCaB>!q8y"}6yԻ^e@,4D3rbd,PjG TdQ`Tb3Ȋbٔ Dz`a5mĢXw$.xS5Rסs:DDܭ]03B rAc({F)*(dhQBkyIŘh .K.LvN6bJytɴ!C U~i)/!C[\zBe`wH c kj {Ug*FMHd D#Ў83a_'""+e2$!/"ٶGa?CDD՚ۮ>rY 42 cs}+ {tJVPTdۧJǷz*ǁ B 2#,=qFFdYDvc^2V1[&j;l]""2pwӼCdZIBRWLEDd%_AD-g0\3DK`k{ZF{߹U2$!{.`w 7{Gԣ+WL)F "շnp+M۴}HM)ZG#m!?m$IOvzӾj+160ٻE$MLi{ԝ2p!bQ".&"Rg&wCd.!vEw^K-!""w3"&(0HfBJw(;]/M2p"Hj>j S%];BD$ktk)^hѢ2@{ky$IԆ\I_߲)j\i/ɘoAxw<2hw'ڳUDd㺃*B2?ϓ’rR> :E&h ;FDh_b3q6[DDRn,N$sCd^ ;BJÇxȠCDDhŊbc 0woSfG1S$aZ1+,KVG [;HD$ "Xzң|;B#DDdʕmK,KHy۟%bЍ"78tH} G۽DDRǼ#d..'hP[&)!2(m)h*"2 , !OԿy@R0ZԤNDag2w}E""5"0ɖY;C$Cm2ppwH6_ |A.a6X``܈dL!1,@Dm#p؜3!7NRC4|3I,nAE4ُ_ u0@ƈ B#""RnswH Ѝ6y'#dP"wyAGkl?-F;ƈ Hd"R}"bGmfEU$KzxwhP+nCW$ŹCD$W: 0ջE$h ^DFc@ ~O#W۬%x+u4IGH4Z ˀ #DDbm˞gQG,PAwh7bv%qswA"";#dPZ%NgW{GȠ  I֖^,1b`@?DH A9oqჯcCdP""iaKdM95]Aڎ[;HDʖ˼#dPڀIaZMh6?BA)*E)D0{"Rs0{~aaC!("Yw q#Ꙟi:r4  h)YuͼہF,(F0)׳xIM9ߵygo)`w @wH=?By'< ؊+?DOV֓V#;#DDdm/q, hӳwɆ-7#"2WzGȀ[C^xw cQ$˴DDd:V, y]D('KfDD`5:.M.EVF^Ì#;w [xGŚ-"i76Ѥ'"RVcr*?/־"o!V"xwH=K2`gGDdVvv._N 1L D< \Jr1""`E!2`W{G]'Iߎ8+F0 "@""k}B;> 4zȀ볫Ca]ih "2 +r]9< [`fSAD8མm8l\>;HD3bz Y 2`HV=t{Ao`ӻC$r EHD1~D>gsoy"hH>#d ٷODDpwHl yWԴ^DgwH3k#d@rOF,;B#DD`-ʕLnI 0A[- .]m;cDDF #NÇq#pw `wH ᢨ?=˻E$U""2X!,gbkkI!2 7B-#DɎs!M>""v5x!z#"24v!| -;ͻFDڃxGȀuZ0"68$ϊwHkox!-"i7 4|!"N"O8ʹ#|4xH v4xȰM, DDǀÆpE;HDN ]_JcyGdV>p'RxwH\0.u#0ӻE$ \DdBoygs9.hEZ0rބi YEh 2lӊ!r n,ʇ Lx.v[W7-{wQ`Θg"UΒ e=1r06]a?朵λDD2O$ףmv9wdB63 ҠBr.^ AۻA$&4xݝ=#% FZO ]lX~yAH5= |;Bc@;"4|{G~!rIDD!."C0&+"Y{;vVLP)w6vk).643tDD2Nٯ#NOw ?qTnIz-O]ԕF,(ꭽ%v6- D$ש} 7zG~ ;BD$ zLm RCkw22:/L&mM΂HpNiX"]""q;ٯk#LÇˑ|.9TM7 6E 41metkyKXסY"REz#d> h y__ W{7M.S<.4vb –nob/zGHfl!5xwDZi049_!")q4;A$mr>h 6v#:H#?W`wgu!oм!1`wHDnI2ԷR Oilrذ" ixwDi0x|;Bf࿼#DD&hAA36{d@; #ºegyH&X!i2> Kc#d>Z-"Ruf'y'6zTaSPOݎ(`a}Vp_xGP7 ""YE!!6A7HI=]F~d' סewޟe_!T>!"Ewz40ɻC$ml]h٧GK}]:A.c8_׶3#DÇww5""Tx'.J=},鯼KͿ!/cC#D$?w@h0pN}|;BD$ nIR&<`S'Խ2̮_ ?ۻBDR_Oi0pwHmّIwȩqf(\H/X`b< [/N1oDqXlw%_N<@yX,}ڌ8r5 DFXW+FcNK $[}  [BD93r@Ξxxʷ*!P(@96Jq4%?{H} 8;D%Bd,qd}xw#DDhr-"imBϾ%3bN'.r\H F|@9Nn+F)@)C]ƟXiW؜%T{' ٧ou5򴪦MCdeVDdtj~w0.I 0.I]ؕ-r QxۖW7(U`=IxHjہ#CdzIʒжK>4xuAB ;D`korWwlwBs ?0oA#!L!@HVMVIBS)ǷvMSɹubKWyHjUO*>R2rLj L|joky!C$3,rdn+919hʅd`8CDvYkR.V<[js4{WH],򎐽vy*ٷC- #DD,.Ѕ* `Qi2x D|2tGDd{nД|ï<*}OTBN%v7FƘ/*4[v;3GDRh^&o.Uw`=JjρzGdڛb$IE&UɌlD@SF0&_W[N YI]eG>nsw I_yG^hPzОj""#Xy9<%n#AR`VS`b_ IDAT jL?ew'^٫ÀWxG*=ۻy>};BD$ u=]=\]dtWe9o0!sZ :dD`,!w?#d>K)[ PE~,kom.aT LY% :+k/ hVJR?b";ў;DDRx^;^> u4xQ"&o;,0јl4)pRzGH=|;BIדOw Ԫ]3CDDy"!鍱.JM ݝFi[" 4EƘ\0B;{*LO)S<}|W \dDf4+#"ȌBߏ F^Jiv97ygHjM6CdNZ#jI;iU4xqM">zc3>601dtU#A1JV24s[=̓vuG[w}W/Q<}E=iѐ0\drO|.yb>@>(O~Qdž7QI\t16""Cw7xG]dÀuh(Szx;DD$ۮyywԻɅXڥ[win6mb#]*: (UO]QG>=>!Ho0 XȑM 9 9L_xYzwDxHJ\^ZO{R˾""#0;AD`{ Ӌ1.Imvбy'95T|2!GcCyN(&E&k /TC"2T"*>R+ q!ү9@wH=ho3"h3b z.SؼGsd"3M,rش6mN(jDb"g,lyHv3!@w?-hP>""&uY^"761B| pGǴRF!`7޵M3{X "xw.A.~M\R €v׽$6=!""cU˻"TCTYTgO[7l{\ΐ;3 9ӧsJL%![Nr}5k"GΚȸF tR*̶glj$9vwk;,~4xe2bX<1_Hʔ+[?ªСX8xRS'4pF&m`|Sܐ(RT@o5FOoX7 !8~|Fo9B{ɷ{޾\ }#<}!dzή27޵myS8pB;Jܹ,"2~C鞩D _=#8'"2ִ5Vcb"ݵ-p߶NVܹz"3N(2kjeƔ&L[N`5\w*JR4FBS.k̬'7qk2\ lFC>:h(DV*!ār߀%Y=+DOcFj#z9K暙P$gJYFr{]3:d%^Ԧ!"RoV^1.W*@>Ԥ+LzԶΞ2Yw ͜23'0qF)[A:r:x8^1g-¹r%S[®2vuG/vP O vLE6o3D$;B;_tA.!Z GqztyMr>HNZV=@w2ۘY8s #\,#xl2;wPp1ĹW`|8ؾM[;H砷jGE%$x Yo['wmɺvjUx11y\pMۼ*:i>Qt[=I5n~wL> #9y""cu n}<1 5u .k߻ ѳ'Ґym˽C#tn*QXx7UB}nnk[ƻ˄9/6ws[D$^ ;BX@`]Ç~%'HXbE$H !owQ>"%~י2sLnQڜ%W{TSX2 ?O@UEvrڇyxVBdY!&ϰyлGDR-A7YתTߘ0Td.<<[hQ˼;$rQ`\>0s`C̴b14VXafSY}ߞޘ 1 1bn-{mn &opxs\JOqY<[ljYSgswtwkg5]|tw^ B?RGkADfPYtywHzDr1+6̼q%f7V0!'<(X`|. Wbfc\n1m!2`&6Cse`vQl^B'>')p3ye , +~Os ԛ ՗y9}^dT5j>6'~:0'{u5+OS6uK~=%)r_GuΣgTvE;A6i@Ҡ iAp1Ik$I{'8ZҟX@CJGCwaXcaIPPݹfS NVD3j{=V'kl+uU# \>n>%CAK/QJM|HgiÔ n| pZ6P/e@Jo>h YԽ&!IEk瞽xI^W5X5;39& g1';w#jח~_OO7}ku˕>]&~+,ie }Oֳ)t׍k5SqqBv:R}j$.#R%]")3'W4nQxXrwU[=yUjQ!I;iu=5u'<>k5zT>:w>,AsQ/pN^B[ 6}LM_T۸D{n:T]_j[褬~::"c!ͅ㒫7rdՋki4W]A=U-) {ؤv;uzm;#?rqfCn-/*(I^ODr>'|r]~QOߌ o 5>"u4:)KŇՒXRs]s lS tW;}EWskZUQ\C42b\}O4sۯY^6~upvDMz$sy._| &E *bC\ݩ 4RC :IZVi]OE=mߓZSQ1fmע"CavLþ~*SߺMw|:FҸu8 kT; $-k?NX mj%uNI;Ħru4'OWaIŠ GbNZSP; kmOE]cͿ dz±9'rzKj3?qo>On-gVB ;]%ņB?>j-^ydu!ƨϿTFnJvICMqFt8Q=;w7U ?+#)q=ypw;(.e+D餤Y@C:@'dZuWM \"FJUZ|൪T1s΅DYm&:8UsFQ]ʰCHu'^|I8DpH-[0?΁)FJZ7ZT`BM92R^mJ]6ݱ:DZ9\W$|]Ŝ^eYǿ1y= n uP8KOp!poJz:`ZO%%¬9x奪gZNg,ޓMo_ҦCQ͌!m匜~3]_+w5|m\|ټp۬H%)Ճ\|`t<=*Cuf _S_94QsZ]Q)l&tp&yt̎}zfi3a#Sܿ(N5Kl<|)=3eP|ߖc8OOxhlzˋNu]༆U㤚w:]kI󅛙0бr@B& d7N\CdxIOTvPw:XX}s:T#8OOx++!qAߜXZ)G^wpS_*ogxx-oOjrq .} 񑿔(NtK> ~:Γis4G$)?mo~)#E~ G)JrzS颪_B=wp׋@IѬvh#UJEuk64z=Sͩ'o٧&hhrm_|vH }tpXqn{@Qkp6qסDp}6P}h j }A}K9Ghp}BŜ,pCJjt oOcQ╍ۂ%FRÒCypqڊNC<%u@?/9آ"EU&j9 w?ԼӑrH'?lZїAӇCU@Y_ƭ`Z#>cyni+>I75Ij^^{mEU3#>G1*: w^ 49o:Z~ Dckv8Myqx3_(NiqC8 v#I|PMn}bp:\E!q9s|J}S9tr1=R.1gWuw0I#\k+Kd%Kt^.G@;='!pa Ji*>Hg!pYt%tI΁sY@?KwY$9iʨ3,܁KK.{gc@P}Sׂ,_ԥf’!d@}:sܩû%1^u@BgS9E˥>V ;[|pP U*gZ5@q 8>ڸʡ'i#Gq<܆۟s,<|:Й]d@')8ǠwYJ|PHWߴI;s;UkDf _$Uۼ!ԛ Pڮ6Ni}+הwBt{X>KU)EiV,n={r,>_e@&|:ΓuVI:qJ=U BO[g@]W]Q4 "^/8|MŊwhsthi\-5o?3PSV,-t8MmzQE~# ~}t*3`u)I'CJJ|y4#MK輚~NR:mzy]huC>ɅZTjXњ6LkcϴV*TՕ ٰiA{R|߱Nٹw>%} =@wBc|>i$:DR|xu&!6m{'̟(ВUINzuI6Lk}׌thUWcM׌.ѦimҦiHBUrPfŇB.PoWi;)!/M f  ﺧ ևU_C|R7Hb[iwaVSKmї_&+7?W;ͅ*a}FC3rC`.C =C4:KNy:Lx^7CI:B*P|:Z:ɫ?ύaHJq{R> %I9Å"s*6;Tjn{$-x0x5I2~IOY9+)][9>$ ɹYGȲ\v/rI2<rV[b@|:1$N wz2$}: ףq 8Ww>&-[|tԧ$s$z;(K: I!ΐeقlĩ)>$_W7o{1tҤfCuDJr}!pVMlʖG~"vҲpMv8 N ]r!hA.Xp!nuayIdb^|@||]>pwUUpfВ(_gʙJRb[@ǽ !pĶ^Jo߫$]at:@V%*OIESX)Օ IDAT76^=&X狗$m1I->$vIJ!DHslL%&Ek;W߻ ->x:L$&{GN]!pj 8;j!j kV|IA1w(i;י~tĎ sG 쭛 [YeI?f )4Tr C"9HZfC Ѫ$$ž,ZMuI|5gxI['@g5.%^ѳz_,!pĭ'X C3GHMR]̩I/SI/>8׼R__:PpHz^2uxyD 1JZ&I+C=c_sG9LRF~Hﻭ#`>)6,g@f1x:^VHzuV$pAY83dYy72dIXȓ#Np06Um:!ŇXGY D'iAһCଲO[Ĝw#d4sŇgf|ih>/|q礑] d. IWB>*iu%1h0~hH\@@4(>EUja[/y[G@kIW`___RW!mu@1x:^J:\%iygrun: h \n ~ugz|^;V/I6ޞ:`$RR]eg='Axs^ΐuw~pAiiGN'y[k-ç5]5|lE7 @ 0x:^~A)iI4I X(ɉ%(CZ/%Ah 6e7z!hۉie@m!")Ňl%M.'Xҍ9 M\`ceUjaD[G@+G,iR,a(>OK"˓P|tuEIǬC-X0RF5޹z :]KZ}TE'NA˥:.I}!.$ Ň}9Ǭx5g@-+Th0Cu_+?:uR0l`]0>zTUkI(>eg!,\eXh@ 6^W[Gܼ,tui1hp]]`D55:}8*^HRX^-QBN4~8(.[ą8vIC!f7aĭz\se 84ZKݟfƝ]F'+u8MdkuX\o/R{\QN/w[Yߑu@={7HN:NW/whlJ܇0: [Z}ɾ#[.usM' v [Hu8V8S +ܱTMbN=wI%D!{c ~Y\ލ>k7uUuX/;E踘eDY] puπub!6TF'+ KU%Ir$5NRg&ǹO/JjNfhntF7iĶw.9>_Yw}GzӺe)+>KbgTWCؾω/۬C,R.] p5Py=d_n᱆__[B\:v @,^P}t$-6^u@yZZ_T1cK'vQZ.IR<-t! ItuFZ|`">>#)vb-aZC﹧~psu'%0|pNZ5xþ />x&Xd̜|Hj PK= 2 $uk$]dJ:mkȕӡny9(bfݲŇ3v8MZ':[V_7S >߼K`䤤[$i+CZ܊?og}: Biutr:hy_Ǟ?ys!GIͿɚuhM{K^w[xba$g .аGrnMyo%1וײqzI=g~u>}3 ^o#0t! )fsT|,2T`tpWUnvFDXYmCd~IY$NhLy.72 {/`Ocl =!? ^뛷\Yԥ}.xPuVJ:$[.! yΙjQ+]1+9prRcS.kYȄ39 klqg-z%}:$I7H!ŧp$ghhQXg@WtN%/z/㋣N&>}ku4{U-.'?b=@ۭCH)>a=~d,=>I^J.Ⱥ 4.F㋧U S0)ƫWw[GI#+݇Sex|cWj@PE؋z{Es"99ָyobHPWU @]vקʵ $wf?b"m XYҼ hA\h@tû:(Ň7Kbd<00?:K+`2n?:>|zn_zsi"-U =tU?|E(b}1$:D=%idaCZyp!@r.]xÉ=}_t{3! 9c{N6mm vHuH;0yzkrLnРȨ+ ʹƏ=Dgô_]b$v.U㋍w=wu*(@}:$`ݺAP? uשJIgTo!t⾢64^=6:F;z~7XI"]/}C;7pݦ% UqMUz֟i|}="iu@\&s&‚^S笣/^t9r5lv=~$߽w$G =M Z]z`׳I.>o$"u'΁+9=?5j: eLM>Dmׯ@=i$~wMvbv=@Ň^Io2>Br |IKN; .@Vԗ@ܸeiӅґNf^~_W[8Npm<;-&͒.nY|YRQ}I/YnxI_΁(x秵4ݧV5VO@ t  }OVr߽wۺ{@/W .SeMe˘Z%oh_H߳΀ɻP^Ul댖'՟++R\iH|NNt8Q\ qU +Kd0w-֎ū{nYotΗ@mFw"v}TrYtU-+L颮3}Z#g s@D @o|?{R{w0QGݤZ}뭃X HZyc:zqb>[fŇxxՅW(7) H } h;j8ݧkTK S*5XdH.^x$a(w0QGw=V~}kNJs >˖'C@Ibqa-+= dJմ0u0VVJ-[_c5]Nma3/K~Hřw~ߐ>)QЩ)ᦏ[֣k2 c<3dAՋu`~&U"smWԒR=2o|߽wk"uF{{{QP ϼ4/`E] }BI_m&+o[H@^C)-)LqZ:P?~×4]i<6Uگ7\LW] Hz#߽rO?";^bh7KMzewHgN.kW 耯HM͒S__:!iDRDhc ?ޜ”委c486:>ҬwKڥ=wg ,=.=yy=/+SƕwJsߠ3j]EanF*9E[%]z3ur|Bf2Kҡ $kI:tTP}RүXd3O>zP\EÅq nNOTG^ҙʬ+pRm[7HB=IwJvX[֫;^B; =>#闭CdQoLNvF‖K [H 453$ҢނzZX=P>}T±C;x/<0|yx .[3w^d%m:y&%oI3d07-$^w1wn|3>xY_{%k7/њf݂0{׉[,IRxR]1>/y[od'.[;x-48U`ÅF foQI ޺mVu끧Rz䔾KYԥ.Z#}Z{s^]ЭWh;b4)>I?g$&;qN$CBs_(wd"9ICI--L Ȣna<9u>={?bN[ j ;rltF?F%U*f 2`MJ@N>6իZJZ%u@ܡ령@Vxgy<'8?-v+/Ƒ>y`TK|։N;bNjItTk^'ftԴԡSӚ|9]ub]7WCA2fQ|@&/a!ne-/)@iו-WǴxk5><݇%Ջz+j.Sw1숗BJM35OW5:YtU'*:1V֙ B8']r@oҢ^Zes(>X{}NZ$鸤\殗u@xO%շf^մ8܆r@:5GwG'vb>PW! S1(^y<μ.Iӕ4] 5]jiE8\#h }n}WDh;/҉ok$=f=<:G9%I-)LX[nN 쁱sӣP*WCNU"=o֕ .]=/@O: tBoȫ>Hr=# VFUɒn|^e;8g੩B,ekqVV$}K{dJAmfǼuKSZ^z桘tA]vPU><=tԴj!ZNkh>mXާMv(>Xk}oMX%6_JZ&u@~_: _tǵ(?eRZ:tjJ/:>6 ڡ |QIhn,R!\3Ӑjڽ!w;C0+H.so$Vԟ_Gؙ/dYUNU4>UUHYR^}y t4]=NJzD A2̩>@ojqa\kvCZU<\: d@wAm{/M*4]i\SZS-*WCUk^Пs_5(Ձb>8[(88'礮BNBbN]/goݘhh(>X{\|xcϏ u@V- :IZIb9WO: huk};5HKGlr 4RU%q>/-Y|`׃=v=̄z 0<3^ҽ!2I]'n{qm{"Nre--LY$b^)>׌C{H~Ez 8 'W|M|WҸu@6رc@!VFsu$V IDATHQI?qWKmlj۵(p\΍: |ɫ znu+Hz];Nܮ-Q| 0} .Բ"  ckz>Ňt:)qR]|X^U#_Jmy1w/3i՟iQu{b'mGᵒp^}jj! n zOGZ.٣OԦM׏I&9ͨ;Dz)>ϋv[dsK:c#jK t:DžtCDk$yu(αE\/pω  Nu( '#@ikHҥQ0-lyQ!Ąu]ܴu H3:؋t}C<%u$$u( 'C@uuyؚ+?h# rS qdQJZ:X)TQMKNI=A<sikQ,k#<ZW]k9楿α zy@wيlCzPҨuΓKn%'?`4tiI?q,>\к@#[^C ݝד++B%^u}T'HzMDuqyZV *>lѹкCL+~Q1}1ҠQ(Cd[10/?4nfnZ.VnWQ~:lTS!2.{V$@jcuXGbV$C*>D6# \y峒{:\\#wڊ·IGp̏u91 sw5uUl]){'I΃yF  Ȧ䤣9.7:,iu +^X(\E[n-Ku Q|c{Zp%! Q >8vR/ƺS|H>~m۶=^ǣUS?i˼L$E) ICdFIKr uW:xy߳aNu 9B\#@"mݺ>ig]bP/>@b\`Z1Y-õ |=︤gC0_[n-9^m 7eSOI:m"*-pL@ft΅eI:(l KZ1/p^uѓ_+ۣ/7#G]2p!Ňy_x: uM7Us!IuXu|_ü/ %:JYFȻzsӖ=z(l`'FC[-3 ,9-iu xۥ~I{Q,[$ӁZT<XspŇ+Z,?lT9r%`nR9v@j't|_8\ Un馪N_k(?ZuW=`!;`cZ?Z j5?.5ɩSکyBҌu W=#IDm۶m%S+F;u9%a<{0l1ICNZSNFf NGj@t:D\`CPޕW^9Qp֕iIP^ң!2#;(>ءȄЇ*ibɹPÅu|ڹZ|X-iiAdd¶mێ88 LiU6jI~T|aI[yA \Ǭ)^??c-n np{/7}k^?I*KQl풭$}kOnpyGtK:nNk'%=!IHT#G%:HFmU ŇV.]vZCu fvH:DFpIGtdwn `VJۥՒ[˂@ֱNjg>Jk4n"\'h;OH!X()֖;찕X/C!euڙs$@%X/·%/ *iOJYȨs->l,3C@LLIz:Dm˓Z|X73"8C̩^@!(>(>ءOZm;]ꓴzaY0O$1sXZY+BOK2Inq0?1u $]2']-1v.zi.ŇΦ =a.Ň~juhS;씤#! H:c"\|X$i(,hU;hKz:DF K *>`vm_`vڙ~@!(>ءP츉΂" u}Cd;hͅQ.>$6 戭B07X+ي.8ڇy07ȩ^hh- ANӹiuH2lC(>ďW}B;(>iZG?%MXt:DFQ|HtК=2C i}[BZn$F4+>Tj[̆h 7u葴͊ۗ h vִ1f ?{p;9buU; |~HXBOǺ 0*u D9h갤qEۥ`4Wbnujl  mU-]b ~8ꩱ X_1CNҊfApqU )>6VAQaDRq?@\Mvv X_Qg3-UK1 :+K:`@*;;9pqQ"% B @J98ޭ8d*7+TƎ;8V9UKUѢhB)HE =3 3(ܘϧe̠y./5dtu8ϗ7!'{- h]f>$?.CMI 3虧^)CMC he]..cR' .Clrw.0he]m>kgmԝd*rʺz]h}Y˸$'N$=MñTi쳖ћd8U2<ʺڀ\|'FY:pc.ד.C-;x^Jx-Dt8Ɠtu⃓e8 K%6}g,>,mb~n\%6ehԂ< jq=w. .'ڃ{C R|V7n@ZC RVץ@ZqNf'vEM%6Zji/$=MDݥCg1@x3IU:D䂣_[|0l}IJ΢@8@]&MF$LLh>컖B,'ډ}2갤Ryh.aߵS|XZ hKþk.m:[]*OAR|hNqʙN>`K%aߵS]ZR hN>eҢApCe@Q|(ィ8p~ x=*mڇ}2:pIzdhCIK&@8dt4'U|T]L8F$KP$ive(>7?mk+-KeOâ3W:0IN>t(mZIR|h7JP-@څKk/@p(>q~Ci.J-CۥvQ]h/_p}8^쿖aC p@ h3_v]8 n쿖PXt`́ه K2^: a@v ͌%9T:D Iz?43|\3gY:o_zJG:ArHrNfAޞ$ K'PKvqc5w,#$cRqjrޜ,_'+y՜'ρ$сH3`lKj+N~Z̜Y2ȩ d^hlT9ІÖ'):&Cɼvt7ed;rn,_'KyUht\`R|h?ߗ1ɇr0I=>rOUyo?0;^x.ח%gł=91` jKLJp]Ԫf=8W=(WKTqС|(G-`*ݍXLϟsI`JۥJvP_$5:WgUE%c m rY<ȡk~ĵ NRs ه-ɇuwZ)#9edł=Y3\: >lN>gCՂ'I=FMױ{)&*mڏ}2|(H `b?UY\:d8zܾ,_7K3fZ>lN>ߩj#1W}#gy~U}8'z Uڏ}2+>ƍ~$\S:G=3V6d}WC;@[Kit֛0sUUssp\=9~ÖRA*np _*kKhԜ|hCap 78Z&~k6z UN>!e,P|(G NVJhWCKR|h?av 78Ax7tVdp5ZM%c m RqclX7X:G;8|1c=INѡpsFW:G;:S3D8PܞhmP$-Uo?-c0Kg$x|ٺ{?@ÿXvYW/_7MoC Ц,,t;Pp*:񃫫W?T#Bx'fxC9:щ{jY<@ߓe\ '*ړS|(?ѕG}־5Uycpq\$WО6_CnvH&98cWw&x,j:Ww'6e?|(Ij$ژ+e"\5hSq7C!t%\:cp5N~lu$)xsjj~ܙW^ړ37;mjX5+sW3{U.'ͧR!nv:_KmE4DZkp^մߝړS|(@Ǫc#Q:eWWΜ|hO_7C!t4$חAk06w'd? QicUh &i~whOgt!nv:҃_YTJ=np{t޾t& 'iО6_wO):TK~3[~liTcTUs0;ŇB8UkI42>'ZW-7Ʃ]hSc'ZA1+_d0Mp9]cY2o_op53[Izrd@|b 2=%Y\:it'e$W3#q7ѓ#Ufc|sUw2J瀣 fО6Co$@ǘ/Tեs\ժj5=KOh'&}@Ǩ,&L?%|k;@|GO>\nv:::xo0WsJ)>ͧPc>t.j$}h?7PY_2GJF1C-<@3\9PYVUUzKJgF;qp,/~2/KYcΐG'%y56IQ:4ڟlzWHD>Zժ[K\|,ۗZ;~a튿t $הa^%y)奓tf<кV$?V:r f^me|li?t I,FUt@zp5Zd~^qtptv.Z:SzCtjIMI:IV;]ֿ~ݹJǁcpu\Q/Nt$St_}>/|.YqYn_ܸru&$IUrp=7;^9]d~(?5X-_%t?ɅC@+YS8{s~޻_sW_X*5()9!:̖$cSt#׿hVt[xťcAK}fgߥW7Rmtɇvy@;ΓO=on~<_*nPvUcAE=(* zt~a+@|TUm۷fk~]ynJWLybgW̍%$1Q|i|yG_4ܝ[o^9sJǂgp uMvt$CStIJvw<|sˍk.( Dov .ˮe^J%v3t5ؓdtu4<<'z,O}q-sb%cA1,ڌ}2|(G `||,[ޜ-OoΕ_ u׮LV+ ΙWKoXWv ؇-cɇrTv#;t.^qY־|Úat IDATmT/ؓ ށ\@[@z|<`޻[sW_X:cW}8KvZ@{Q|(ɇd}ydC7MV玵%+JǂYat{d5z6Ce8P2::[ȷdvU6'oұ`V?0f+\|{tV|h/aR|(G *۶oͶ[sWds겷4WknÖRA*nB^R>_˭7ݖ9s斎qS9?\}L%vc m Rq<|sMksV3 ޓyݣ#b ' Rq6<2'z,O}yu7dmet,\\]v ؇-cP7hcy-y-ka=ڕjAG8npum<;2zł=9jmڍ}2 .Mmf;OgeֻuS:t􃫗ۗf v ؇-ɇLϞo籯?3ݺ! S:t"k5mڋKe8Py33p?lz(Ka-ٰCYұ#5mpOO>|sU y>СkIޞt|*VJ瘉Z]ukۯt\_k7J7}IuOtݨвN!:N>LUUٶ}kmߚ/2wtui;k,Kϲl9ƫ>/{eЅ98z&ΏuUʢE;f?OQh5o;լ\qCghQZZr{oXj#0-ے\_:D'ɡ):tGW1o-w}aXOTfEycpqZS[#I>ޘ̀4e =.w4e(>7?={̃'><?X:zJk+.Z ZC px@6=|SܛU:Z}RUUd`nŇtѺ-L)>q I|2IDzo皫ޙku׮LV@Coy``(UUR}諃-xjƋ0S_8Cn~പ />^|>,}n\:]ZLLLT;D 眅~~3ߩb̄2]jn~`R^{|{< :Sq_Z u[ZqmpSߗG6=/yv}t$h;N^>$k\iZɇ ett8HUUٶ}kmߚK/"ܝ=uЁ)`0.:^Z83A`쿖aC puꮗ'6?ёґ圪QumZUs(SCǵ]2%{98RUU=/w  0%KKP'J[^:0{ ɧ'_oV:5883u`}O Rju]ɲZƁ̇Җ~clyzslXOvej5t3\:o`0 ΫeW};lL2Zh/>V\޳!7߰&=cASM0?,JQ|hZ]*`r_QIOW:j//>vAs{Wߑuޕ  3<<ʤ^{uW&R{G7z. ]doh038?ЗG6=/yzH~}ZVF컖q->/CO0zx$<}^|t$_|Hx/ hT[#z$6?KSZFUUٶ}kmߚK/"ܝWNWW][@SȤ_WCccݿw8'2vñ'(E|{˿ɦ'ґ`Z384\گ~[/ w-:ñŇ7 C}G}c—>}u^MQ 8PeC p .VA<- ɧ'_>;KGO14`tV}w~:+!evؙex21>gݒgݒ+/&ߓ]ZV:iopp$wxȇ<\8}2jPh[;_ޑ}:K/mޕ57Koұ-}So>ph(wN%]|4tR mo7?<ާ͡300A}iT%|tƆ,Q>])o45Mwӿܛ7vt$:X_`4!Ij78}R*>ۘwq=$s.JZSqYV嚫ޙkXU:楗_̇}7j?}q$4Ǣ$g>K2vhZIvPoUU />K.<}qt/gHO. 6P%]4o}qEᡄ$~qlۥ*!I..^w?< Mo0LF`&&&fN_[/UɯlXװ tKKPoH!ŇR.+YM>|K{KGb:x>ŭCR8Z)>q\}⃡ex322'z,?ҫ;KGb\:TC֩Ԓش|ػ'C@Ǫ*۶oͶ[sdwݔډ?4?s]XN𶾉_H5~k-H% Ηwd;¥Yz_fu]^(NVMV~kglP{΃'><?X:m`_}Ắy/<64N>Ђ< 008MO|9SܛU:-pr騾~JGze(>Kr ~b||,[ޜO?0m&UUE w˥\|HW\37߰&="r騁CC*Z!'˯'F]C\i~qc/G%)+<ÏMep1δfȡC YW7"Kz'^OIj`Ȧ{x>?vFz8rYYN>LDR|lDm?K/X:M֨yG7$U} ^Yx-G o9UW\ޔ8CPUUeٶ}k._swn\:]]ݥ@#3<2k 6 R?kEf1'xox!9/MWw_ N>]IuSv @ ɧSzn\yKYұÇ28؜S-IU%LHq6>ߪ>k'ZI0ۍeӛ͹ka=ڕC&k J&KU&211j,_ ;=sT.5y׼Сz,/CMR9zA:Ηwd}˳ Ys))N˥ : dЁ dpP2p`Oyw_wdWU's=MB9oCk:EFxƼwYw]Y`aXDС``24ԟTD[_v jg}5SqulR'^Or8G>Os]!:Y@_PƗr[rβ%+J4^B؟C>tʖHUf+7Z e$}7OU|H+G\1\[sW~ucqo~yq:jMw~t`WSX<-l۾5۶oͥ_k΍VK+FG>_:ƩIj޷a:2N9tCpWw"jI,CpK4yI1mZP||;_˻1w}.;06>t ZNJ$ KP.kV&̳[̳[rd{rݵ+SJG^x @U'I6|yGv,Y,zWܼ.sJǚu}KG(>C{7ޟǾY}޻s9痎5+LTcZ*MIkXNG`Ȧ''ܰlXO/t8_:žjI/NW|H$lP NC0 eӛݭ5W3ܝ߱t=-8}2^LR/NW|8&ŇbUU />KV\׾?7\skI쫖k:oV$9t_g7ɏMehPH-]?ʾ{Jdiu|+|t`PGr{ߗE,.%}﹧KG8PCy{:p||sUpˮ*?'>< *. d~5죖C0-}ydC7MV玵%+Jǚg:cК죖Ц`FFGyw׮ʆumW\]:֔=gg˳$ٗºaTml۾5^|E֯;7Zjdd8;~1hM$(CL/8̇R.HrQ.z)yo/gxxt3zn39$ #d`##y͏kW;>+.rJk<g0K`'&ٝd0]Iޕu\+/&ܕwt7_=7)%mjU&?RڕdR=R'[|HqR|((>Цv#;_ޑ%[ʭ7˜9|& iTΤCO:R9}3n?Iy9-8+LN0Փa`Ȧ''ܹܰXvqߛ]oZ:~i9(>rD P/cc|wsݵ+sRUUX$.)>2$*ɎAުs۟)pmRFCf>䦬4!*@OZξ$oLS)>$zG3'-gæ^*GEtI˙R}@}xNC9 -><;S?&YR:@!˒\T:D6O_O}.TjaW0͚ph9%ys*oj!IN=ԇ Ti:ʹ5It&E[|(ɇ8UC4ٵIR|p,Nc_]ڞdp>:]μ$+KhrAӪ8О^:Ke5Ô{$ytK%]!$W]IrjIn.ޓ#1:K%`r"'ZS:@)>Uî$o̺@+J!:؏>7tf~$ח \P:D뙼yŇ̺:ܷgfŇtYV÷T3\SfJ`U-3Y`ŇIvp $W J IDATPgoOrQlGOLK9z6=˚Q˥Da6}ϲf<lc߳8WIaIP'+\]:DMuԣ0{uX%Y[:@^:@{:LG!z4G~gY3n(>F`YV]f[: ݥCt*>lZL]O^]12gaWSI˥~z-VC|15N]puY߬b.>.N>P:]|x&Ɂ:heKz.XD&S!ډ.=#uSCRiGo4}e[^f'vhH2܀u<],P(>HrN]:Y$t9z/ڈCRi$t5yCt+>^>fymU|VxhVgCY| 7ЗKrNq^5CtʑuרCRisU:i| IoaۇJ8IjC䃥Ct*7x#o$ysv%yw')ťCtm,>$N?GVF9;1j̫-\Ň>g6ɅCĒ$KpUM@%kpfI_:Oܓ#lyFMg*̩-(>hTއӜgҝC}flHoJ2ބpzKR:$Y\:DKD/ҌÁ$mu83GS9I_/ҬV<>JOY^SF%4`Cy7'YQ:б.J3CМ*>|+Pũu%tclZ?ɷqf<٤kqz?W:бO$qfZ=ItstOY4߇/{H[|${x=NJ:}Ll.D7z'-9r򁲾jŚY|H^j$tcܝ#fO3r hf^ŇdIR+rpPL[E}V(>|#!H0}N=$*JHZ$.$GݥCm+.$Gf=Q:D:Ň$H\d]@ؐ!HB-h[J8;|tJS:z!H<䇥CJŇV$JZ=IA_W|tA@_K-pV+>ԱIy\iaf좤)զTKe+N$"DH1f.RTJIWQ"fj̹yc .U`:jq_MGO6>].\t~:n:jɞzziyxp0ҝ/ߧ#;5oZt[ xusC-#"1Ҹ@uε:>V}b:`ipu9ۦ#dYLJ3S#8Gs8/\o0q :>Ԓ>*~t0bՍ#8Ҟ/pj:t0Tç[r(pyN鈃Y Օ#1Wk:s-*OGPվ۷8'dOGʲhvr29tġ,Pu#=C#8KgƇ׵ėflN{ιLY3#8MNG{rՍ#8k[/PuleSՅ#8J\U*ÛZ36r4l}-'7OGUNo( []m:sy[VQ Xw =R! tRW۪MGp.Oz\4LztVpv`8[./oq>2Vm|{d\< EgWq|#8`hzC鈭ZziܭY۾ꧦ#8V#jU_6y\Puc^T;>qtp9yYW۱C 8xXMW?y`:`Vy|uݫ:f:s⾇G7OGpwN\4lXtvP+ɚDu`n_]|:XU^W}l:go:8b{LGpN8>>|ztq:k#8TOGUj=YS0>ǍLGuzLGu^8y\tpX'>;a]~^X5yܩ:a:8;NGpgV/ 2>|m#CuտMGuj .XCMG糯t64>tq:H'7LGu>Wr:tp>'Mp>/kqνi|5z$e( *,kTכ|?m|xG{OGz`w6ztNZ #8W6[ou[5y\$epK7MGp>N vBuտNGu=\tlV|N :>~#`]+X.\e:b7pvՏMGeu٭:>Tzk8~ϙy|pr#`pu EX\<<{yrZu\E؄B=#`ݿ9e/>&U'Op@w.9k՝#8S¦et<>Չ?Wo 2>xzyݻtW'MGp@!woP.^V1k^%#8h4>xzy= N8C{eƇgMp@:ke#8ҦV3=tOGp@׆\4}MWϜXaw.;jut^ڴMGp@t\UY>^86q|T+OG SЯ_im#.+#`\ŝ, `SLJc\tWWXtĄMja1~v:sMNf:ZuX>]utĔM6][+am'MGpPOmUYt,v:dI>>Wѹs/oP ?6ї%w'#` ݾhiƇťoU;KBOGpPov:baiԕ; 72kuysƇsZt".\=x:-ztuk.l+LGpPOmq޼ymK#`EMGpP^8,LGpP5S]f::tIJ0>ד3#8.9.Qw::eb|8V`Sbr{q/p~υ e#`}IYN'MG,eutubCiq4ꯦ#0!T]a:嫻MGpHΓp`ol:ps^]d:#<!ݹt좫Ww8꟦#8cLG.zluի#ά2!D] I-Α9áR}l:Wt'8b9}zt23>ggOGpHSx:vЏW=!ZcpxO>?!=t epx^<!]t쀻U_5!=eg|82OΞY]l:ENGpHgWOXƇ#7oMGpH7G#8V7 G /m>VȽzttB؆GUOGpHo5*[NNG|CuQ5V2!Stl[k]6J[K #ՏLGpXz"ֽ `] VoX5gn~Xתn5p#[ ƇyUWMG\4x_]n:bq֗Vxxe#[EƇ{iOGpWNG*U=~::`Y<:n:zTs`pt^XM#8lptՅ#hVO<:s:bsMGpX_S}:vֿT/XuƇwzXd:tV_XuƇqro%GOG~to#ցag|ztGշLGQ]~:#ss^tuվ6¾QbGLG ?;3yaU|Wu6­5y|ua|YZ}d:#ډ#8"6t~+T`=tG1g#։a=tGgkLGtG䟫gOG|w\3[?Y>n9?NGpD[r:r:^0Q_.1Zx]%ΜXGƇLGpD4c;q՗MGpD_l:b]vY/NGp^}t+[LGpV={#8"^3J::9g=k#֙v#8b\t+^յ#8bmq~.1>7TRuVʗoOG;XVʯV=l:`i[#8b?Y]o:#ͦ#8boY0>읇N%Z]x:vlygժMGR]u:#ꏦ#6ao=,71Rz\ {ϪWNGpĎQ`쫞\}a:#v,w:#ɻ{#ؒ'VW`)\?LGlÌGV]ztK%#8bX40#ؒT`mOG%T}l:bJlӪNG02Փ#ؒ~m:bS|zt[r-a`|Ϧ#ؒ[W7`Oy%yoMf|uvT`S\zt[ 1>lNG'X]a:-ycutĦ3>,+[<U=x:òElɾv-M%ϫj:2lɕOG+Y]m:-\,LJ_`W}t;[LGeO>8ar׫CUmqpYƇQl׷x #زGT3`P}tG廫NGe$,9zt[vN`[N^-8Weӫ7OGeWkq IU#زӪ7LGp~Ƈu߬u觫MG%׭2Yg:3>,N`Uϩ.5D:_?/T`.#زT?[ [W7nZr:myH]tK#8/N`[ztf|X~gU'UCز˴X>T`WΞЌ+#ؖUwsTpo:m@a|ztZꛫGMGm>?3>WT?c}{ձ!lU`kjՓ#6ӫkLG-gu+_=g:msu ql3MGuƇ?#ضgT_9\2}ztc|X]2]{XS~tla=ztXSk:mla]ݭ:c:m{Xk{`άQa}B"M IDAT#ض V/.5&.Q(^eRtG~tkY#ض93>OUܬtkuʽOOGp77NGpTV]c:`E]ztG zWձ!+Չ!lgOGsLGpTztyrMGVt;~_ʽ[D1b@bOpTW}tzutGeuva=ztG)<~:`I]ŦC8*/:3>W9Q)Kꙹa}zt>\tG.#OUw=tN5Q{zK몧MGpztnq!WWpfu痬)jCMk#8jO;2>l_~:v0&:tGo_`6g[\\:{['NGpnqNvas~utG5tD"gUo`o6NGpԮZ7Uϭ2QPaWuvčNGV7`Gܵt{yPl:G#vU`Gzt{Y}d:vL,TaGX5^ g[7aT`|c#ꛧ#1~:yO#13pn?,8v8;|ųCXU`\!_Ks:yh/#1^&ep|KC1o~e:b|Uݶt;Ջ;0o_յC1i񺥳CX.#9T`Gx`=t;OG|̳S#Qn3l[T?7zs_ݹt;f_uJ!-'XkuvԅWW6ƕZ\0}p;맫NGoT9L!ڻh/B^v:,7GտOGY:f:X[T/~:oI,?G]#q׫7'W7`ݥtzCvMGkNս#qϮ8j0>i::T`u؊n[=ŽPKů>kTaG]ݱtVvܥZZ!r\tv<v5Wx`+^7+W`؎U0Žվ`uNwzװ~:c|`ޓs]ݪ`eSPt2-N9't}OGӫ[UaW\ .Rvg>?z0>o^.`Sv};0>ӞYv:]s)M#53z1>~vݪC#521>mut[գ#5gW>>1>[V=~:]:tk[9[#XOv/T`W`}[{aqjaMgVk:]s|!MՉ!Ox!/OG.]Nu]zsU` /3BuZ!]:t˧#X=?`W]7#.9lū߮1®l{-ZO- ytpĎP]k:]ǪM쥿nWaW}G.TvN-g=a|`ztKcC@z!'W`j_!wW`pF>:®Q0M#0SS#~{:e|`Cߝ`Sj:6ͪ[|Ng~6igxߦCuT/lA`oݴziuv݇[|6e_EՍC`hMqVu|ї%`|`Yzt{BoV7 kCN2>\Kp6űիMuՅCo70>LήnW}p:=q\{C` }_M-ΞsX6Qݬ:}:=q|ujIYn[}l:']#3ǷѷMv!왓?/f|`Yzt{b՛oM[KNgVtevm왋ҵC`}CuZu;LGXfgT? 7%߮v:V5ߩ.=žC`,E%Uלpt:=szC1> t{-t,kTo.?ž{p8V)/XB_≇/aO=zt ۧ#S~X"]#HX%\@ԗշMV7a[u\0 1>j/ZPoKVS}t 2!siVUGս#sR}pLw<\j:=wUVճ#s'VU]g:TVa=:e:*;)Po7Tם=}՛NUw:*s:qE?≇Cs^<Œs.t{ՍC`ܸzmu/ܲ?nWaWA7^s/eu!p߬= x6!nQ]6/V/`|` Ψn^tzGu6ҕZ:p>Pxut6cՍOL0-!liy!S1{&-.r:s:Q_L9FmCuf'?{ysu]:!붸2!gut%Փ#w!WNagMG^3>Pt㎭^T=breՅC!0_ݩ^R]pvL7.<%n,}utLKMo:p!Twa)uub|`}~M߫d:rՍCX ?C`[ ջOR§T4ӌ}a:pwMԾǯa)Qݬzt,Vwlq5 CXJ7nqp.-^R=b:qBꧧCX*w^izhX&8GVϙ`iS=žf-,LG1>têW`Ʊ OTX4vVu=!,Uo.9T;- \ݢ:s:aP\|t{jV?rf:?Z aLzWy}~Xf8nZ}v:r귫;O+VnugV3GMӧCX*NZ38Y->9PݼX8rU?2jUVuʉkMtΪn[:[?Օ;؞+Ton4_LX%غW??ROZ\HOkM`{[=a:t--`ݢҗa)=zt"l߃zs`U/hqA߳i_EfSXR//`y@oTo k;O6UMn²+Un5-}m2>;I7WVtݹX{w/~a:VvgVai]b`ݵś .;z_u!s>YݠtKP$@ WϯN.4GO0>տM~!k+Wa9ρ]`|g)о[[CXjț,`W`wUu#Ctuju5wsGs' wV]zrp.\zB{`>[ݸzt+wT7>?һe=sa}+~֚viM2@pxN;pPݼXwon3CXzTݯ7U?82_nVq:6Z gN.X=zmueurwVWra:6֫qշO,kW[p8 /Mb|N!+VP{:`IܮzGuVL1>Vw9zJՉ-S.ZzAuVՋC``󪻵ĭ?~:`}Mw)‘_T<Sw:r[<9 nWI!UϘMf|yO7JpuJw?[.[/NnaJz\R``9K'{:ݮZ!G NG.R=zUuxWȾ:a#3>r{bGNO~{CwrV꾹\3Ξa%}e{/Wn`伣l +jW ?e:84gWwS=z{u`s}e->VN6VǯWΜae}{ǚo5lUt+3C#c|!U/^X8TO~p -.'VV+Naݶ!/{MΨ~`kPݢt+ջ`\NoWO[ V몛Ta[=z[u`]:z\]W7oL``vu!Su:XYWt+ 3էCXyNN.?UmqE[X}n ``=?CX ?RMK'x-0W{w%W]}]UYl,o*(!> n##8ϜtppuQ@EA\"KH l_W: IHUuuNTI{s,A$僔OFQ.l\\ L"I$){I'TOFTRK* 84kS$ILOpgwFT?RԾaD1TSOpI$Iq:[gQ~܇RJd !QLR=HO518$I?SHR=8GHKd 󤣰WGQlKZuE$IRg7;FQ8 DRcX>Hx ʕ2ig$I8T(_.E8R- |#:r5oH H$INlWgQ\",b>|.:r.ÂH$IixAe`tIg Gtx{.&g$IH~ ES%}q*~&!THx=Ptq}b~$I_t,ʷGA$ IEQ;g$Idgzҩ(ʹۀ7FzI*8I5J&VgY$I<iҳA$e僤U- D F*! "I$ѡ@{p߷IE4| $P ΢pi$I\ \G$5R8 0ERX>HZ+s'g$IQP,*A3sH(Is1pbtB7iH $I$m[qKq7H.I:`&DtƞͤkrpI$)&N.8)Gm6ݤ'(bH$Isi)8T>G}6ԓ!sXv "I$e/K)YT,$,$m#ˢp,i7$IT4=NE}/D<,$me;pځO(&I$G4b^S@[lЗˣHj.6E80E44`,$IR# Dup 1T`88&d i, .c&[bu+I|  EŴx p~tIAX]G#2p"pi4$IԬZION*qTPWE,$CqΡ E$I p IDATہs,*Hj~e>p9Tl;WNE$I;v:\EmP`^tI` eT5 4'/8$I6 QTpU,zI Ipp<8: 4'}=O$IPx8)Kg琔C~#Q~L17: oi]ѱQ$ITpL "= ":||HwUD")iY$IT,:\ E / AR=EzAHؗg$IR.ʖˀ7OGo2Dt"+)Ztwp6G$I9  TbH@?x48|4^Qun gG$IMT6&=GZi9p, Ax84Iʊɤ;g$IRssҘ)YU 8$:b|Vb"aH7gg$IRs5C`,Қn!DRX>H'҂ HkF `,$IʦmIWEZ INARGF^Y9`FpI$eÖyRlevx-)僤,8x,:sH%8$I iO؃)@{li|#8$Y>HʌߓP^CZ6R 0sblI$^4`ȏqut_}ktII288':ݤι/6$Iv^).2AR 'KHp$IT;:T:L#røARY>Hʪe_mC8W$Yv}=B5%6$wfpIZ+IY5'-q$I azli܄$e僤D@[nZށk%I T:\ lG`_%wx::$HjǀqǮwvxB$)j'G`ˁVgWd \Bz F i$I_AҘKIH1^oE e ,:vb8$IF:z/i1l~D6僤fp p:0EXېS? t$Iʯvd`6$q6x&8$m4Iͪ <ESI%ę@dI!4}26I"+ FMc 6:6 =w&0!4$IR%NN#m}5A$i,,$>f5TBHʛ[Hc -iӥbH$ekIAjf%]_DAR=EV6&Rh"I3+;IIR3YI:#Ib )Ӂ/g@rv$%6$IRÕI_8P>4fi 8$5僤 'q)/."菍#ITw=e/6TW{EF|TsIcDWg3BH$ksmBH҉A$,$2ғSA:*Ip iαq$I6.7HUL#B]KHҸ|T4n"5@p2pi<8Y$eW x3p%p/!=4wtIOhpp0Ejb_$ M$I41i4$oj4KvDlv$K~4i8$#K.=6Po"="8$|Tt+8h}' !p$$I3KpG1K7DHx88he҉q$$IjUG+TBI$p< 8$|QwDƉ#$IR9Zձqqsp^tI IZ`,xYu$Oq$$Ip%C8ZIRDz,)rHh "2g/<%4$Iʲ)녇H *gIXE2NjIZkHK®"؁421҂YxB$YH ۇ&b\K_itI*IZgcIK|EEFZy $V=p -4c9p:Wd IJZv i'TT$Xʤ])^ 9ppI<Ip M$[Ã]oZCI~Y$iX>HYF:b{0pp) < !IR>)iԣG%Q$X>HҦ؇OCԖOH$my.O9Hw琤d IE/G "eɖ~;T`Rh"I>$R(顁"I ҟEY$iY>Hnt)$q8h M$IR1g.q\F<:$5;Ig4r`.pGh"IaL`6p#p2HʨH':| x5pet)æw0:iD$Rpp?p@R]MNtII? XEʺXK?pt&IQ+iHף&o;4&TTGvORӨ=qKz'3(\D{>x%wFPaH lGj* x(:$ %|8h#e/ΛËPimg6m}~"I҈݁Ig2/CQ$)|PkoFQk{Ͷ{btIZ;O>q"nx'MpY%potI*I_-ǁHMɯoi쏎#I,T_EjjK$+Ip!pXtٵu"bh荎#,4v[o#qpa4v7DA─vAgrwsz&oCϤi艎#,i'{u|gBFMFT'm]L܊[Z|І888ϥz (xtI*$tkq|XK{hm{VLڒξJ~#IweHw#S`yKRLN"U 3*&NT*GG'|*LL#eǁyA$I'$)[' p>Ul)V,ysxq-mtO{ҖLښr5:$uHq8R= yAapr 鞸gIR3CQ" IU%=u:bpIZxAk!%7p.P!^Z8/-H{ k &Lo$I{ʆcai<&etIҺY>HRH Iͮ[uauLڒ өGǓ$̀##IqB, "Iz>!IeŅBDW4'nIgс$ecfwɆY!GE$m/$ Hzg8RUY|4TD]}S[Qni(It.I't 0E,$TœlRX4.ϥT*ѻ9]?()I8t @kh"I5U"yY$IaIj~N )C喕eDW4:z&GGh]jۑY8AA$IΓn ''6A,|% X9k4&̠;8$T RpUlI,1$˶WHzetO91JK{t$Icɇ,!On}fp% :$#[Ƒ>+-bE,|A(LW4:{o ǎK$n8&1N~DT_O?~FZ)-6WTls,[\yD[gSۜ8I #mk3H]i`QpIRxTׁHN:{kB:T)sIE,Rٰ+JfcA$IIʿHc>DZ6)6M58Eh\`22i 8IMtR{M M$Y$I ݩ$d8 Yʝrξ-݌8uMW|XIc^? &,qb IŴ i!A$5VmTSGttOg2ݣ0LZ]װ P %~|t"[T ]bz88866FYsTSTuEݓ!Qjf }D?G$Ű|bWWlIVVX% ỸTZӘɣZ|PFxiRmD,, "I %IR B*-muNg2= ~(i1vi:'v M$)+Dϓ'_&=(XY.zvJ2ttONDdڻ'QxI)T# {=$eA$Iᝢ$iMN@|4FAVWlbޜ_oi}duhi L*iLvgag g>YLCY$Ic IZabˁӁ!=(I/38'X+Vii~ں&9~Z;zJbdmEtV_XEQyT>%8C/gKWz\g0RLOB鼼`x-`(i> Dm G9Nq$5(KJ:%G{Z;i襵r50i}aW{`.IA$IA1~ `JlIyQb,_EkcG*?<1\l׶@R=|7` 8$X>H6 B_#$5кF8A:1ֵbkry-֬\ J /Y$IMȧd$Ic5hIʔکJkg*):zhi\YXPrׄ<7]r*_\NZ0I2 ;`+$wZzy-9 J.Zۺii.ZڻvP**caV,cpb` ssXlLbARs 8 IKATo"IR*WEs}N-muevs14 ,eh(XW,axpe@5:$˽eWE$wEF( *8$RLJk-mTZ)QQii\iR{?cPuPV`xhU\~C+Zju8:$n'[$n$5R'p )?8$e^BFB J%ʕVJ rR%R*(W(ʔ+rKzQ0CTaR0AFP248@uxpe044Z.  FIR3xH+,|$̀|h "IUR%(*ʕ?Qʄ5 xj6A4fH'g$$i<3p~$I0p)iҜ,IRWI$It-p bIR7fE$Irf7D$$) fξ1:$In> \DTl, D$Ij2wN_D$|$eO 8tGpI$)~TH$)?;g$IQ_oCQ$Iz9IRֵ"I${"p><8$Id IjmI%Ĵ$$IG*g$Y>HM g$IY ׀%Y$I`f |;`FpI$ޞ|KIR|$58O[F$I1Rp!48$IAmH%ĎY$I(p.pt$$)og]H$Idpm`08$Iuc Iʫ2p pWpI$iM g$,$IyW78$ItE,$I9g I*Yg7D$IR E|$3H$)n &:$IATd*Y$IUg$)$I=p a38$IrRRppIBY>H4js_H$y,.EL|$庁)8$IQ\($e$IVx}pI$eHI$mi2$It3iA$I:?<$i㼆$#8$Io_{H4,$I4[H$Og$X>H46={S݃H$i\Ee IR}À?*q$I__q$Ij~$qL'H$i"IRX>H8q$$IR< |G+I0$5#$I9ZIqd Id$I/Jg$0,$IQt*[pI8$Ic IR2pQ$I4Oq$Ia,$IʎiIGmH$5'KsH$,$Iʢ2p(i/[8$IT[ }!?S$)#,$I6OCH$v߁ǂHu|$9xB$$Ij2$5OCH$IMAiIGC$IMA||t"b,$IA"?H1|$)!L"I> ˁjlIT/$W;fDm@KlI$`tywKbHF|$E$JsH|$xv'K`,$)ߞ.#r)8$IG$Wpx+G$+B'@lIA$lxe$Iv"{,$)$IZkw "Im6_#{H |$I;pi4E$Ixi@56$I"I!"8$i-~ \ #IA$m ?xYlI /WN8XG$5I4IE[8$iבN8#I$IpRq<G$m5?^#IA$5B?$H'#:cH5,t8$)o,$IRuH'"&Ƒ$$bH<|$IieoƑ$)~Ft5p$IA$E){NC%6$I(p9pM#I A$e2N$ic\AtSpI$o%IR&mCZX},pFn' G$iu$)GcHf!p p8$If IIؓ4X`o$+pa$IjެKf p0 8荍#IҘ-n&?Ƒ$I4$)/:"π]cH!SRlI|$Iy8+=6$I+ !R}lI|$IEK*"v#I*뀫I$IRY>H"舦cq$I94T4x42$Ix|$I4 x3GԄʆk?D$I,$IVhq0HEC 7CI$e$Iu3ZFPTTs-^#I]8K$mvk*Iʣ*pDÍeτ&$Ij"(K$MTL`_=4$iS(  x.4$IR|$I.hIeAZh p;hXH$)GIDAT,$Iz&xYh"I*Hn~ %IA$i|݀-$M$I(#n$oF$I*IxS&& =lCK$|$Iʦ$)-n#CI$iu$I͡؉ ]zNR=E$IY$Ij^VyL M$Ic4\mׂD$I$$I2؝QM;P F&I|$Iʿ6`GV/$#CI*aV/nG$IRcY>H$tV/$v M$=EPd(I$?I$j `R!+i$,' wwF$IRvX>H$iCvINGoהRN2 Y#@50$I2EI$E?//&vʁ$mxyp7Ld(I$5/I$5B7؉TJl?"0TdIlAȤ%$IC$Io R!Q{NNl Eޚcj$IT0$IʒV`+V/&j޸hR&,dbXM$Ie If2L#k߆4IjF|O2᩵'I$m0I$h/CQ%Iz|$IRєBb*k[o&0#-r~z Tim Golden Created with Sketch. mu-editor-1.0.2+dfsg/docs/swag/t-shirts/arrr.svg000066400000000000000000002100301341747546300215050ustar00rootroot00000000000000 A4 Copy 3 Created with Sketch. mu-editor-1.0.2+dfsg/docs/swag/t-shirts/arrr.svg.png000066400000000000000000007206531341747546300223110ustar00rootroot00000000000000PNG  IHDR]bKGD pHYs\F\FCAtIME  94 IDATx ٻ +39v7{ d"Re1D0#24:DA(/ (ȗE"}ιfS_iw>[RZjQz$VZTV-תVT*WKQRRQTT*U;K+W*UT;wFYY7={?[F$y戈ؼys$I۶mm۶֭[c۶me˖زe˾_߶m[l޼9e!bAPn*UKׯ׏:uDZvQZZQv}={cÆ ~Xn][.֯_}QY&֬Y%v׳ 8hի4m44i5Gz#uF:uDB֭kƇ~k׮>(VZ˗/+VĚ5kRI_‚8;iРAҼyh֬Y4i$X״iӨ\@XbEXbҸK{ HÆ ͛GVyѲeh޼yTVM[ǻ޾ϫVr/`z%:t/>:uuruxw7dɒT$U,Wz&;w^޹sԩSt!j֬) ަM7ߌ +rƍSLfAz%]t]F.]]vN!+X",X/r,X /^>-@ \iiݺuЭ[޽{4h@rG}Ϗys=|ThXe*W]vMwݻwmF:$I,Z(͛͋^z)sNaP,,PV'x∓O>9N=())FYYYOƬYbڵP C5n8ӧO;N8(((޽{㭷ڷ,nɒ%P. y駟.]ɒ%KG~8-[N.aTp5kֻw'JҒ%Kbڴi1mڴXv8 *,,O>99G/ ?<ϟ<@<]vgAT ͚5K:u͛c֬Y1iҤXp;0MPΪTguV2tܹ a^}՘:ujL>=cAN,rRn /K/4j׮-d[C=wuW|_ СCrWYg@ٻwo|x䘴4l06mZkYT;v^x!͛l2Q wX_(Ə,[,TJ֭[[_2))) @?p''sO4jH \]6FӦMsG hڴir=I'$P q饗ƒ%KB>!JzݪV:$VZGII&""WT*Vyyy~<ڵ+vŏ۷o?R_5jT2rȨ\ @k׮0aBtM]v E,[nRvUVԮ];JKKN:~^vYEp$7om۶֭[cӦM~X~}|~aÆX~}|''ʄm۶M|h׮@F:th d ԪUk|ƍGԯ_?4hu֍#<2ׯՋ X֭[k׮?0֮]}Q^:֮]V+Vv!3*W#GLFe޽qW_ھ} ΂81t:6l4m44iz"qX"/_W-[O?-:wL:591r:th<d0bKZh-[/>m6;ټys,_<,Y/yʕ$I2Baaa7.>|xiA$IL81Fڵk Ȃ8ѦMCѡCh߾}h"T"ƍwމ7|3xx7OݻWB9c~8ڷo//^g}vd0yyyѪU۷ uQPP Ҷmb…ƽ+b i 4(EEEbY,Ǝ&LO TpvXo>ҥKt5:w5k믿/r,X ?v- pPծ]{ԩSG <1xM~8`*W]vMw'pBo> !m߾=?3?Ƽy7Zرc2k֬hܸ@NZzu?,X~1@g@&MnݺEnݢgϞQRR" 9mÆ c޼yrJl` 6,{P }g}W^QNQXlY̝;7̙/r?Z1eʔ䬳/̙3'=ܦ7o^@cA"kמuI'ݻw+Eqx'={|Q(++Ǵi'H޽[AÆ K~_9 %I7xcp $I, N>dРAѳgϨT(P6m⡇ @(,,I&%G??sN1ʙKq4k,sqBkמ_׮]^}8S(g3-řg 2$t"dݻwܹz] IDATscԩ?!w^Q 4n8ygYfb+W={2@91oqɅ^\pAԬYS`+Wɓ'ǔ)S.ܸq}@fjݺu3D86l}W^y]dr`(_k׮W\}|A ţ>~{fA~$=XTZU SO9[p(,,&W^yenZrIļy;?fPs9<bD{ . ~:Wp_(**C&W_}u4h@A-;#O fذaɤI"Np$I?bĉ%"1UV/8kVZbŊ{bɩ2AKT8C믏q pJKK_k;\tEQ\\,w>裸KڵK('#FHƏ/@9bȑ'd0䤒KQFEjև~wqG7(1* &ĵ^2Ad@N)**.,1bDԨQC[[jUr->3A 曓ѣG Pq1|prBaaa\|u]{F'x¬1c$7xM7cƌq~ 0t |ɝwGuꫯW_;@W]uUr]w P]wuq-8;p=䗿ebU$1{1bD\.,{#Foݹ)ȰsG&&LG*e:;w;3nԎ;0dȐdʔ)d$I/ɓ' p5K/MnƨZ @Yzu=:MfB޽/@ٻwo?fϞ`@VW֭[TO>d\qrJx:uJ(** E=⥗^r^ ;2` ~Ʉ sΉTʸ xvzk~]v _⨣J,Xu mٲ%?XhC߁ _~ɯ]@x2dHkf֭+ѨQ#1իs?Y)LsG$=X2k,ဌѲexWbIQQ EEESOYEׯs΍1qd~%/}dt:Æ E%?EeT*x]vbd6m̙3<1qdz%>l2k֬Y @FkҤI̟??&NT\YrҸq3cܸqI݅Qw\|^ $"8cٳgG˖-?O=T 47ާ줓NJΝ^ے$~~;wI&EQQ>~믿n@FjذaoDڵ m{l,]ԙ(u+?~|2m4BF_A%ji b֬YOIII̘1# P.JJJKF!רTR;I/BWڵk7tf|jM4I̙-[[zc[@ֵk^<1;{=zs=300я~̞=;jժ%~ZhQ'VZe@TZx}{bV^m۶mÆ #pq3;0`|#};9()Jmݖ\s5bw(w/^Cii|c[lVZG}@D%`),,ӧ[pۿ[;t(w&MoZjFc>aOh %@^zyYPN.318N8cRp`;z)Xe0QZZs=סubT3gΌ>;矋AQXX .L7o.ˣUV21Zj3XP?|$8cp5m4F(䪔|UVy%:uzcȐ!$q^aÆɒ%KH ]vE6mw9i _vX̙3r8 nqwu=XASR{rq*UܹsN8A p-ٳgr)AգG8S{rNJ5kVriaژ0a췼XpaҪU+18/_-ZH޽[ g%ۺ뮻,Pv[{ި ~2dp2M6 /Й' $3fLr7 {g}sxu!iӦ8ꨣ.ܸq}j -9眓p Bd={vk[uVZ8jԨ#G+RM3;wn%֮]w\ZVKFQQrv͛ʕ+w^Z1̘1r8,Snx駣jժbƌc9RJ1vX!`C>P͚5k:(1?~zj޽b5j,]4 |ѺuxܑZZJAAA<裖dSO=5ƍ(W;vp/~!l+M4)袋I?Yxq@K$ڵkoN@JKK-!T*8c5Kƍ #JرcN:%/Rc>h߾ׯ?S ڴi[NH$:u@V2ԬYs̙3-Q 43f=zpT8T*F-l`t:O>dҫW/1rܘ1c⦛n 5i$Yti@$In:/^u}~[@DDp ѣGD 5rHRT\s5BYF|""OL}O]vfrG\2*W,֞={裏UV9dԨQC=d9N:CE*$@>|pTxqW d73g&gy|gq]wy#jԨmժUJJJ۱cG4juuTi r\`9Эm۶M \ppd;,.J$%@jڴi[oÜ|%KDǎS;w Ųe˒ƍ@XfM4j(g1 7#: (P1UZ5~ @N8Fݔ2qY裏N $믏J* P+JrE~~~tI2qYdر/{^O>}D r)"%%@vhٲehѢHaڵѴiΝ; O>IjԨ!9cQZZ*++n dqY@Rnݸ袋%*?r8rNqqq?v n d-Z$rT8#F*UPAKrI'$1,]w]F=T<~x 4țw*=z@N޽@H?o7z3i)J[SP# "= &"ABb.as ɾO,C81&JjIy6+kaMg<}ijioLoSSS~z{{@/'O<1@FGG>$geMSSS޽{! / jf3{%"l rltt4q!ޗ_~@VVV[q9g~CSNz+@vvP*y^  o6 #sssĄ!z8}@@N} @n,//SNJ F7 8J$|' w/l,..D 'ϛo~׆ w?~&''O?}i ~:99i1|8\rſ %F/r/ nݺe.YZZ2@j:66frիСC%077g7Ǐ/-J  Gnݺe 7|xR32F @|ȉҥK0n߾$1s`p#ȉ7oCPf3?>#~n$?q9$Iq!(7o97ȟ;w\7Y__cccǏaNK1iz~wƗ}~(pʕwq8D$̙3e FDT*w}*q#DI  r.\H:d Æ谓'OJ "wu#Phj5謹9#fggD)1@rBꫯիW>np?:BT82"p'@ @@Fn1pS@$allТ #lR:@ @@ 7dN  #V]P#lTT T(|Ȁ ξ}O===F7(8 v_St@_2pA#.5 #C. E&eHmR#%eCCCF6j5#%eqlF Dm=j5eC$eqБ{VH #=+E$eqlF jMq@Q t@O (*8.`3q]opO6$ejlH m=،@@ { 8.U*#$eqlF m=،@@ { 8.`3q]V.mT*F I zzzm*(&L' ]&h)fTISy=e===F`Cq]V*$kd. E@ @Wm}@Qy=eI$ @@$"! 8HDB  q@@$"! 8HDB  q@@$"! 8HDB  q@@$"! 8HDB  q@@$"! 8HDB  q@@$"! 8HDB  q@@$"! 8HDB  q@@$"! 8HDB  q@@$"! 8HDB  q@@$"! 8H ww練`;O< >_~iB!4Mz?£Go?~>|>|zX__ן;kkkw>}/{Ͳ?BKBˡPR.2u 0NkttS󸃊i*MtS<`&LE S0LN.ٲyO*x$WrW{7yu}ܯf())ϼ߯_m)~;z뭏~;x㍏^kꫯƟgN e2M#^y問F^}xc~x饗2Y@ݻG}}}o|^yXnGq/b]6^|| "@'0$ꢮ{矏gy&֮]>l]6^xq}^5jT5_ /=Gף>ywEF K. 1k֬|XfM=O/rjoo{ny뭷)؞jkk[VtMoXfM:sRCCCR(tNSTTMMMqgڵkcݺuK/MͩD Ibذa1whoo_=I&L&#P YO><@OJ^zi;vlRgW[[s΍{,x4o޼ԧO@SF\rIk,Y:T\\,  94f̘K._|1y晩&)2q@:th?^z),Y 9@7t3f̈XfMjmmM]vmmm~ti={d=q@^;/^yt饗$Ule (1wX~},^81Pu ,f͚l̟??t6R^^ ,˗$Ee `:uj]6?p#qf1z7xc,^8u]`@f͊5k֤E t#Gիc޼yFe `;(++K.$TQQ!Q3gƚ5kRcccR4q;?pzFO0 *++cɒ%`TTd?N$oN:ۡWNC Ij@a3FocܸqF;CZ*ZZZ@2E׿u{F2űhѢX`8(0cѢEX (ر7pCҥP dq뭷]y@@hii_W[nb@3#X|y82eʔo~8̙ z7xcL81}A `?qqGĸq{駟9県= يb}IqG.]DtgƪU}g$86٠A̙3㎋!C9(~ǘ1c Ǣ8蠃wߝ^~X`q8#uuuqe%% ;`*++5=iҥ1ud2@3gNL>Hdq|ˆ#_^}@+W^Ôe =ztZxqzgNJQ 0 .uJ@2P&M-[5kV裏/)@@jiiI?pz%2(P2L,Z(***Nb L4)w}iٲe1aAO:+)@@s=ӊ+<SLLwbԨQFs[;C= *))+"2SLmmmG_`L<9o$%`2g***b瞋(.."?OW^Ô@@(..c=6[.-X w. Ug}:%`1ƎV^-ZfoLj#}aUUU͗^zi~Ǐt ,q9(ٳs=>w(..0_bI xr̈#ҽޛׯ vpd2B@3+hmmM?xL2E`7n\~I Xr@cccz衇R[[[TTTt;/JKKd  駟{?~ @:th̙3')@@M+WL?񏣬L +q>@@1cFz'bʔ)bY69昤t qYGxdɒJ\x4k,1VSSw\R=qY`:1p)Dn݄m@@'֭[\s5 ?fϞm@@'9rdzGQG%N=())!q`i͚51j(15lذ1cFRqټyҭݻwy"ۈ8,t%DQvu8mX$=͙3G x"6b 5445k4M}rEMd S  5};찃@;EM`  "=,5Fۣ_~by1jjj %zBYcvJ+W1dYVWW/^LF +1"Z*  wN*|q@*))_QUU%nԩda (XgqFs=Ž;VZ[;C466&% ĉ駟.n(9 {qFII@M+VA[sUWwQ֦{7*P0&MEE&/xZ ʴi7M!NW[[VZuuub*qѫWaW^y@\ M4I ףGhkkȆ DrNw;@A%%矟,q@0`@^ ?~Ԕ=X! |"9_~moovI ;v=W\b@ٰa@Nׯ_W\Y 455a [iB@2䂾}{qqԧO?я@w.\EE;>ӧO+Wlojj`e1+ӦMK6l Uz5lnj#fe]DO1䍒8` &={{.f@N<Էo_!@T=z˗NjD1^z ;餓;tXlY0a@cc1w' ȿ/NQQQ~{2eHCC1V]]dܹB@ywDݻǝwޙk/1;ee]s͞0B$fL K€C@P=ܰvrH vm{x`uwwjRGGG8S 9%da}s1XWW`8&qqȑZKKKXpa1c12 !ԜpYgrL Jᡇz12mXG 9'tRq 9& /| CP08֎pyr_70ZZZBoo8@477h ja 9r `jnn>`|x={!w [k}7@=z+wq@U/bI[o5p G6'TO<"pr1j@U+~6b #+I(z!q T9s$I ?w($I[if 3f#{q@1W^y%^&%I~O?5hv0'TI&Ž^z%#$Iga 5zh#{q@U3gx嗍lT$ᦛngy1j@U(Ic=Mkgm7rH#{q@ՙI4J%8Ag}vo 8qba  bHԐǛn)$Ib  :u!HԈo]8rO 7o޼xmB8Nj`H@?~;BC:8Ϋ PQƍǏ70D̝;7vm!IcF#kq@EM6@fDzx;  5'@EM2@4 RI$*N?O(8 PQP.E9xwInFrMlR B4i!HT$26{x}FcIB@P1{glkk3P1"q>:p/8N ɓ'88zGuT|" r@B$NXRI-V(@ #T8|i07 J( a6PUD`|_r9x`k #kq@En@I4J%8Gq8 @οMTĉTbH ,X0q@E.MS8JtP --- IDAT 8"&L`?-ZZ[[ jHYfGyD`kll {챇!!6sLq8A$d;)"q^3f̈>hn0HM0@MJ4J%8!L6->#pL nfP.EȵSŋ6c 28 s]]]FjZ"q|n ! dN "q82m.'SLO>d>|1@ư;"q~'8 SǏHӟt|ꩧBGG12 d@]>qp2mnPO>%KQF Cq@vuW#uM$z},>3a7@Luvv{"q2q82%Hha08 3#FrG$j|$>pUB LgggW"qT=#.]4|4@2i D&{G ;1@? x'W*Dw=.]o@c P,C\">Ǿ0n8cT!8 3G6:i9q8'dF `C"qdiv}}}UL Ȍ@{]w5.YD3f6B$.ľ0~xc8 3G6&0ve_2|C2@23f#lHiw}}}p5F Dccc1b!އHa}5F o2ICl4MCT`@viPL1b\X rY$)PLttt`+i*;vl\dIm݌@M7&dbF8رcҥKÞ{i jڵk@ 09V.]4L08N Ȅ@`cFPO@ v"q1cg}vĉ@]Yv58 qC$ލMk@ L >D$ F5㩧я~ԥ~#kq@&WT*ȑ#,Yd}1ukڵF L 6X,r,p&Ol @y'dC MS85jԌg}v'> cP@ :"qmĈ駟^>\x뭷@ Z"qiĈEw}@nwq@&H@}O?t'?i r74&dB  "q-w'@D6$I[)b $q VxG$oz1`꫉;8HwI[n%Ο?0VZVZerO &U$o~1`X 8 o$ ?gi ˗/78H'^{m<묳 CdŊF 6k^x!` ;f"q@=kE]dbq8HPx2|r#@`䪫^z! #+V08HP˗@C@$eW^yeK ?$8HPxe2 /! 0DZr/P/`8HP .~P!qq 98}k_]w!?ȄHP?}Pa˖-3#@fDjկ~5^* /ILda͚5P(B'Yz18 7`k֬ [oe !4irljj2s9GȲe˂8@!T'oFC@h/qTHn-$Ib "q!8*J$Wx@ӟd/qTH0͛'UL 6U Ě5kbP0zzzիW'tR;BCC1 Y&'o1`/[T4MC\MMMܹs-[,n1-i(J"q6;wn;7/\@&+\.q8?x2!JT$jsL{CP08x/8 q H5fϞh Z6$dbڵF`@D-qG_j_+̶lH D08`s:@y!dbڵF`S,F5l@~#DV,cT 6  Xv"q@!r!~ߜb x/8 F`Ј@|7jr@5kAi(J"q3tP\h8Ը{ q@&|M#0b("qpP?~_6A Ȅ@C%MS8ȁYfEVc@x dB $m֬YG:|׿5l@ 8Hԧ3g@կ~e 8 qdA$-Z$uq@&ȊHԇiӦ'x"38KlذAMccc #qP@}X`A_^.qFVi 4vl̙̘1C .avF}ٳcb@>} ]@HT1c: /ҥK%ƍEb5z謹9k/1Nw}"N2t 6@E18ԧӧ;@% P@:ꨣ{:o%`8*8GuTb<۷ov8K[TiFSS8(QFe?q8SMMM"@;$]!nݚS *VX|>J%15*kmmucС vk׮i ,ˉ̙cO~0c 2k֬g$:aƐ!C:$8Z9rd6gpP^zX`A8ˬ^Z85#GbwY d 2k֬b$C̙C ;C.c jd$vΈ#ٳg K.M3tqT+#qFň#""[ov8˼"P4&#q{Ɓ(ׯS&J1tUV@UkllB`$~mY[[[tAbjjj͛7 @e P 451lذ8nV n͛3%b1|R* >}@+R$Uc677>>Ԃ bܸq+5Ht,bʕBP4Br91 {GfϞmiW_} ]n"P7P-~=|رb;eҥ1cƌD \.b +Ft<{饗nITn{ĬYqƉŋcرIeb@4Ht_~9ٸqԭ4MP(d\N E~bƌ]r嗇q8(q@˲,.]*uHݥ1k֬Nh{,fΜ(c K,g$֯_x;N `\r%"@3<#8N߾}c̙I'$K(e ܌U*b„ B@0t~Z-iFSS8:]߾}cƌ',?#-[(6Wg!ITmbƌ)"z8C}7' ]/^,4MP(d\N :dvx8aW^yec 6-ރ8:W^1uSO%KĿ'J@1tqzӦM>OtHeqFT8f$իW{g!Sg IDATa~{%J@rt߁$Ib{-|b|>|^zԩS391Nu8bb@71ty%;vvRF?wwf|^ |ߍgy&Q r=ّG)CX|>J%1P=o>l1Nx7n@7kns)M( Y.#~:կ~0@͛'#qGqwd_җ:ՕW^O=Tt?@1bDrJ!`wmm=z)Sd_:ռyOLo.Tq@EXre6b!`M6-Əo$F544Ĕ)S˿TׯѣGʕ+mP@h---"@466FPr5&I馛eq c g:(MS#q57p_W:ݽwyq80.>5tTX|>J%1XCCC|/V\cƌ9xݺu+byk֬9':AQ(\.'@J$nFp@Ylݺ5/q8L1{l^׾&P .Ld s>I 7ܐ}_(;&Md* vb'V^b@'6mZ?>)JbT$I?ao|C ,~7n\yf15HT-[ĬYNB!rbT$I7룱1@3Tӧe8 v5d P;vs9'-[@PQfΜymۄ20PK/(/8fΜi8]vҼy21PY.(q*b 8ӧOH@e[@̛7/.pPe ,Mhjj2M@,_<>/ںuPe g?.Yccc #q]+Ⱦo ͚5kST^5*RSS45ЅewfqgƲe5:*`BX|>J%1K.ɮZ!)J~6z!{P,-W_MΝ+t4MP(d\N 2'p@YeY\pq8$t!#qqee'N(K.$Lbj {b^_}nիЅbT*A7BeuǕW^iCjD@ZvYf ],Mhjjr@1TnMQ(좋.(oo~Ƹ*ZϞ=㗿e6d1IT`']tE_/PV&MۿM,jL@%۶m[qB@7I4 B _W뮻Nn;pP J7rg$qR,#'RI 777N@YM81.R7 5HTe˖%sQQ(\.'{8ew:`  'OYd$wyw&Lp *;^zlYX|>J%1|%[e/qgDUo*8ޜs9ٝw=z(G}4>Os=gꔁ8̟??yDŽ i455jYgM28P6B!N9_7u@Pu&N(T( F/|!뮻gϞb.˲ǏOyAY $SOeGqPabT*Ԍ/| YSSq8,~8sb6 h6Yſ (M( Y. rzgcܸqT\.?|6b1ITZifB!)P{~G@5*Jqu *M( MSTvw:ݶmb„ 8 jշoxAjڴi1~T*T??ݻ@ZjUuY#{W@ڼysL8Q`Q(\.'P87t?F=8a֧Ox糡CX,F>OJ@:ӳ?#iy睸?`4HT-[Ŀ˿.M( Y.Hvq8-\0ƌchrx粃:H pb1|R**駟nT۷ok6yn ծT*W_-T4MP(d\N "|>p@YdIwqo8K Zгgx駳;L ӦM{#ЭN8~tضm?A|Mn*$jmK/Dccc ,ˉt??~ӟ:œO>&L0t8fL>=iiiDFnqI'e?bwM6ń cI-Z(t =:[hQ44jQ,#'RI ?xp@9sf\xK/n:H.!iB!rbeuqe=q8C/_3Lb( pٲeˢo߾b@)R$?졇M6ĉcĉɖ-[ʦA֬Z*8qPe4Br91NO|"{$˲:ujqqW.E{'|29rPebT*tرcٳgmΜ9qŋ3]Amݺ5oU(M( Y.c=6kii13<gSNI]@Pf͚E! :j̘1C= i+W . >%3g4 t  6,{gbwPX|>J%16z謥%k/1_2ꪸےm۶ t Z/'W\qP4,ˉ1cv+_CM&Md@ѣGe--->'x"뮻۷ T ztkXQ(\.';<Ȭ8,Yf駟GNnvp@EK$EϞ=ˎ>h1ITQFe1x`1ow7xc<ԕcfϏ={Ulڴi1~x#qP;찬5 "+VĤIb]v"@1ԝ/1wlرb@0iذaYkkk|b@ڰaC,X ͛s΍s&[l`'-x``w}1mڴ?~8Cڌ@غuk<… GK&Y ?>kii޽{5X,F>7Cv{עP&6mz*XhQ=Æ abĈ1lذw? vMpjlٲ%^yxW_W_}5VZJ˱|k| JT&q__٘1cR,#n~es̉~bn?v֭[?o=!Cd cРA^{^{$R^vׯ[ooF曱f͚wW^W7|3^}UoU]%.|Gr!b@ 1kРAk̙3#v[hQ|[o\΁ڿ}o߾ѷoc=ѳgw{DCCC;߿! ?t,bݺuM6ů~wnݺȲ,6n۶m{Nlٲ%l7n7[o7n 6ƍM6 Pg C9$7o^ 4H !F{ [ZZybn/SO7ߜA /$gqFx%-iFPrExC=d]O%38#+EP[MǏOJPF{G;V 'SN9e5kRZf B={jHX|>o$d=ٳs1bn>ltI{m,5A6mZryŎ;i ,ˉl=ȬYK}8䓍P7E_W[n% jIX|>J%1 0 f͚{bn=\|ky6uA]sm%]tPc4Br91 ?q8vq8ꕁ8/8,jHd$:`=~87n۲eOOP\pA`jIX|>J%1>`v '@=qI'ūu%7:ɗG?QS !F}?OO9VZ5-7:__dwqGrޝajյek}F>p,q!)f m!PMôCiBh(B)TBזd$$[g'ѮW DH27\ݻwؽ{i*o{fd2c,244"qjkk~yӦM޽;7Ʈ]}`sHp_|GKK1`8xq8^={xꩧ{b===YD$.V[[yಉ%Mpel۶-~xᇍȝwַ`f}OW駟M6 \AKlڴicc,rw??0??oVcp&p;wvvm/~YxG|[`NJ144T;e{gbӦMO%88pqfH={ q[˶شiSرWx nOOQ(HsEuuu|K_*oݺ52EHK;p@lڴ)o8/ Xtin,]0K Hƨ2t:=l6{Qd.NG]]T* SD׹\.dD֘L&#˽_3Ldو &TЁbͱm6w[e8DF_jWWް IDATp ,KDdf|$d|*/{"NO€Lvشi8B{/|!.ӑK$HR[ at:uuuS{OHR'F&=UUU^u*yq^!iڵkwbY@$D-d2SqBL&E|d2y.L&uuu"LC͛s.5i'_7ft:uuu[d2Q__B!\.^744D>=|>"JCŭ>pLIK$=yOs\f}\.wQDR|>Bt\. Whlٲ%z!XUp0 oի3HL&#m0wBkll4$\`ll,l>;*9\2L|/{qL& 3HH$"orrQ(^#G:6"XvmUx Ls~{_jf"uuuQ(ʯ4*wC\dll,n_wW5r0>d 0C Hd^2.bE?>o޼25>>~{{Pfn}-,Yb DRT477y---777G:6$ `O~|WbppP$#DP(wttDXB0xuwwGcc怉W r0C^/})nFc 4<<"qJAK^3fǏw_*TC7/uD,V #O]]]bƼy󢽽=ڢ=͛7< ;~x-otOo@PQUUeADDSSSP(DGGGxL&PAǏ[ƏcwT q0[q7f r{{{̛7/ڢ#͛L`/ĉ񖷼E0pЖ-[ʟcbxx8Dd2Q.\Xtĉغukp9.6 + uvvF>70k8q"ַƿ W8YP(l{>inhh(E`rUb===j(`;ydos'qsDKK˷~f p ,NR)btttL},JӧOǝw?Gȁ܇?‡>d2iJ$y敻#&?vvvFOOOtwwGgggicu̙;?p9ϟ_{~wdY4444"q/L&< _ xΜ9x;{p 8Z[[` 43<<"qkRSSbQ*T*%KDCC8sL/r5phhhw{7:;; ӈHp5=]c1hii1rgΜ+ א:.N~ciB$2LtttKR\(H3ٳg㮻~Ak!/}( pYCCC̟? ,1hnn6LSgϞ__quc޼ykhhh(E!,XP^`A󣷷7JRJhhh0\Ν__o}[4W*6mT{o{R)50<<"qR(J&q>,XdHPap0=9U)w]'.\hD$DT*O.\8722;w.w7MwM`qhkL&cƍ偁뮻(p H0%(OF^bΝ__o|4 6w@466x \./^\^xq,Z(,Yϛ ĜsܹwL`rxdo~smo{[-o Tp He* [JR).|X" Ĭsܹ_09 6no{bҥF 8 iiiEZdI,^8-Z/ŋGccqΟ?w}w09[jU;n-6n555F A8+ŋ,YK.KƲeb…Q]]m r}{+_{08fq-[b˖-f͚H$*Z100 p R)J˗GTzP.~_oaJ{{{ oxClܸ1nXjUTUU.P L#BaKTz񸾾f(?o}RA0544č7X ƭ[. /C$`fHRQ*˖-KN=-[---U+ۿ77 Po1 /0<<"q3TPR*˗H$\䥕>_җf {xd2,YRcʕquŊ+7 644"qH.E_[`A$Iqr9>EwH`rdbٲeSlٲXpa,\0 !07… F#r|C/|  9RTXpaJGWWWtttD&1HU[[;NV\q}g!\BkkObwwwtttDgggtwwG[[[DKKKEcc1DP:Ec˗/Rd#H|ӟvof}TWWGKKK9ZZZ5 B466FCCEL&\.d444D*2&1ϟ8vX8q";q8qDƉ'ĉ111D">яFmmxMDx9||'/ƭ^:ZZZ3Ma;0K8i.L&@6t:uuu/z_6L&c0F;5Ξ=ǎ=9wW""N8ӧO_y/k&Q,˓Ѹ|fs Qٟ08o.?zc HIuuu,]bŊXjUL~?q??O~,f8*E$+%Ŋ+˗/fƩ~,f 8*E$%JEOOO`ڵkX,2}cO|,f(8*E$kP(l{`2|XbE>ǟɟ @D8l6˗//^:^M=.gs7f90ÉP)"qLgD"-ZT^fM\hjj^(`RDib?&k׮b8?ƽN(`RD –. E"1U_U08YD$J`rbŊѸ뮻.=sPf8*E$.Ś5k֭uڵkc>~w=P ,$@0״dݺuk׮pܼyw~w9 R"qTHs]X,cÆ rE~|+7Q. s@b"qTH\hM76l5կoo'H"/-JE___yݺuvX~}X"R+ws8 sH"\]]]^q7Goo}-\!@S^~}_>nxG}{80E 8*E$ 8cD8<8D8d29*dDD$HLL&UUUEmm׫T*56jjj.5EDDcc~Z[[}WᒿߗSUUSED 8vXTĉqW>=zϝ;w.&&&.%?W.cllE?~̙8~/O~f'OSNM>}t8qŸ 6q0GP)"qpid29 RR2ܒNJ*l$ꨮo9|~*VWWd2Z[[#HD>ڨbD"tE2hllL&o օq y. ?~<Μ9G>".MN:'ON~n={WE 08*E$ HD"G*T*RTd٨8[.l6QSSN#RTD248Dn2Pw8vX{;gϞxc|||v;v0 '@P d2T-NoI騫fShnn E}}}FPT*e\`8uT룩)"Gkkk455ży󢵵5ZZZڨ3c||ZZZ%ۣ-͛bѐTѣGq1>>>;vX{&;vG')"qTHUUUQSSl<vhnn[GGGDWWW4449ɓ1::zǩS^󷍍\.N H". dr---Q,3+ W3gb||<&&&bll,bbb"ǧ~|||<.KLLLWE x8*E$. 566|hnnhooꊞXpwCN<8w(8D8`&t:LfKmm磩)Z[[X,FGGG,\0.]QSSc88w܋q=\9r$9r#GÇȑ# qKRDi2f﩯 Co===1Xpa,Z( gϞ}QUWWw_KKK̛7/Z[[3,X/R]]]QUUe4011GÇO>Ç/|0$,8*E$H$N#D.+777GssstuuEOOOtuuł bŊQ, 0 ޽{ctt4FGGc߾}/s ^8*E$fd2L&jkkjii뮻./_CΞ=ÇǡCqС8tPݻ7<}O60 H"3C2t:LlnnbK.XbER)P'Oطo_ݻw?6::>lb||`#\8*E$d2L&kjj*FWWW̟??,Y˖-׽uQ[[k,طo_:t(80|Sg}6<<1&@@e%O555pXxqX"X)r9<gyf/z}ę3g \Sq"@+S]]Q(b1:::T*ET+Wƚ5k" ^'Oƾ}b޽/駟N=zX!j"qTHsY"vP+bѢErXzu,X  s=gyf2>{>xС.^8*E$(LFMMMrrKKKtuuETKƪUb͚5h(N:h\<3SQ={ā?)qk&@0$H(JlٲXbE[._hO?}QTg={$N>m,#RD."DcccX,Fooo,]4u{]E24pU߿?~xcϞ={^߿]1%#@p5R/555=9o޼(Jk׮oY'09s&>틝;wΝ;c޽Sx`*J$J൪O-UVE ŀ IDAT\J)G~:wzk׮ؽ{w߿}3'@$ɨrXXrep aÆHF Og}6v;w{ƾ}^ڵ+qyC&\"qTHܕH$6˝xXre׿dp###m۶O=T\.`8*E$xD444DWWWyqx70LLLcdd${xGC09%8*E$x9555^^xqǛ#Lm۶Hl۶-~>|W0} ӖH"DDTUUEKKKy…q 7ĭ[lsʮ]GO###cǎę3g0 ӚH"sK6u]7n;3 سgOă>۶m ǝ?@W@0P)"q0$( Zx}iӦ;";####?>`l۶-FFFbrlw3H"_6իcqwFkkaxGq>`xc|ظqcw^9C D8j֬ 4H_ZL&cʕO?4y晘?~a8rH"@>QF|i&Mm۶qGժU @uxꩧb޼ybŊظqcR\\lrH"@>\rԯ_?mܸq\tE_"/G̙3crشi3!rH"@.d2|%mԨQl28S {SO= .+VĖ-[RG@sD8*5j駟~;߉vH`1sXdI^m&ijpI"qdH]AAAx鷾:tc90E{.f͚/R/IvmL9K$l<]gu{[:DÆ GO>}z̝;7VZf۶m K K"qdH@~d2QnϏv/~Va#(zxcٲey椴0#%@L&K/h߾}t!2ars֮])8 {D**Uĩl2v76 W>裘2eJ78E$ZjqE];wFolݺ5M>l\R0"8!@]*U-ZnݺE&Mݻ7f̘>hꫯ}'Y 8E$l8rkٲet%6mj,***G}4xxl۶mUl|8E$l$I'pBڼyG?Q$PGc֬Y';v0 dH"p$c=K&M&t!:tL0Ė-[bڴiOǛo@ [DڵkzyweUW]UV5 @~8qbSN&MLСCt!2Q'G}4^~実~D8E$ժU>;7pgjO>$&Ms΍'F\8E$8R aÆO֭[wqF /߿?~oJ{nPndH"5kF&Mk6.r@D]6ƍs̉ 6$iF  D8 [֭i&sAs۷/zooFRTTd(82 @rqg]vY|͞O0,^8&OϏ?ط9/ʈH"ڵkڢEno([l|0f̘֭K8`N  -"q$Ir)O~իWtIF#4y䑘2eJ+ݻ@V18E$\r4j(ojժʉ7|3Fs΍?72/8E$OjvڥK ֭[cر1cƌxwRp8E$r_ZnڻwhѢAۿL>=LjR\\l>@$@A[nڦMۣQFxb…m߾}E08E$*L&vZz饗F^_Q Ϭ[.Fb; " 8E$*ʕ+GƍN:ŵ^+W6 [lÇ̙3cÆ IFSqGH"[*U믿>HWvWTT<@L6-֭[ m p-"qPTZ5oݺuK/ !ۿL<9L+VHJJJ28E$իGf>}D6m d]1cƌ7n\ɾ}8E$5jD;#8}ٸ_L # 8E$VZe˖i߾}iӦʅEŘ1c^8E$VZѺuѸqcҥKcѱ`dΝ`8E$O:umvB30P!-Z("TqH"_L5 /L_Gƍ 䔥KѣcΝ; PN S"qdH|jժE-G- _|1F?|k.#qH"jժѬYn6mk-#GƢE"eqH"G+((>;޽{t a1f̘Xtio>qH"GTRs9i.]k׮dpf͚#F^z)9pA8 B$l#e28n!t" pL4)֭[ij2$P-"q䢯}kiΝO>QzuݻwǨQb~z82 P-"qڵkھ} 'pA۷ǘ1cbԩqF-d-H"GETf͸袋GF P;1pܹ A  [D K ]tAʱ_~9瞘7o^R\\l/H  [D($ ݻw]F&1 @Oƈ#_OJKK p*88E$⤓NJ߿T^ 9`߾}1vؘ8qb_7 @qԪU+ڷos=qI' m޼9O=i۷o_o'#DȆ}E=b„ ILUT)?tѺukW^y%K q9E$CURRSN|>e_zڭ[[RJ ""Ncǎ7|Zyͅn#i̘1#o{5kFv#Fĉ'h;vСCcyf@B p0,X}_DJO Z2_c1o޼ @^p G,^8Xt{SN9%馛⦛nL&caÆŚ5k4M ,rHkժU1xx' j֬?OӡC '`֭[cc}r 9N$uŀbƌI!k2Ls9K dɒ뮻bɁ 8< 6lsOL2%)))1YSN.;v0xpԕĘ1cbܸqqFPyB$ lٲ%'NLg 6m>< [W}@@mw1cȑ#]v8餓k6B:uj1"֭[j" ψ䞒2eJu] aVZ|29 IDATOG 40ƍo3g&{1PDrǂ gϞj*w8lOw{$_ ǐ!CbݺuI7yH@ŶlٲӧO,^?jժ0;vl| olڴ)O?tgKyL$y_~1c da_~ڽ{ݻw$+$䷇~8 k׮uxu^P98a֭1jԨ{bpH*W[N83 |wqG̘1#ٻwAB 8r0ƌ#GL ![nڣG۷od2?i1f̘x} Q^F"qMiiiL:5~}h޼y:vhܸA^:zOJJJ 9"q /={+V8 SN;N:thTZ %%%%1f̘7n\lܸy.Pfx=NyO: I$=t| P?E>}⥗^J45U.Y۶mÇǽޛVF{; pر#ӦMK d@I$߿?N{O>9"ݻw>}ʉ)S=ׯ 7pX\(;f͊޽{o잃RRh޼yz}7M@9f͚ѣG,\0)--5dȮ+WFϞ=c…9(jՊk&:thTZ PA޽;'ONve࠹l?%p>ׯ_L:/sP6l6,~*Gy$ Hٿ<1`dΝsE]w}qir̪UoEq1ࠉ|1?|#V^|u15\>}ӓ"t8wߍ={ٳN>tqWԤIbРAi&g@DpD>[QQQ1"ݻ |L&\pA:nܸ8 DDҥKgϞlٲ$MS@ٳgGnbÆ LUVvڥ<@wq>͛gϞ1s̤ 2&P,Y$i۶mk˗/-Z%\Y/nذa={\\ՋDAAA?L'Mu5P!=zĊ+@!2%T֭nݺ?^zt95jTTV @NXbE\lٲ$MS@91eiɒ%I۶m@STTwyg|[J]w}wZTTp@NiܸqK;來ZJ19W8"ZhΙ3'j֬i \Xxqt5z-gyN:] ݻw77nrK^͚5cʔ)sKTb8ph"3gNԬY;D׮]^pN>tѤIco=ƍݻ pQ! 틑#GwzJ$.o|8HqwLj#ݻw 88,-]4tWv6$MӧOSN9 4Fw}wk.<GHm;vߟ$d2 7q' KJKKcȐ!1|𤰰 P8Dl9sftMyfy_jڻwرcԪU e$M ڵ P\\7xc̜99x׿r-ѵkרVA4Mc1tdΝ,r1rC$8ӦM={ٶmk wyg\qQPP`hԨQ1hРq+"qڰaCt%Ν;zi+(G4CƐ!CݻwK;"qI4Əv[k.䉓O>9ׯ_\}QreS1`=ztw^!\>뮋 :_W^z_UV5@QZZwuW1")..6|.PnUZZ'O={&w6H_~z뭷F׮]Zj{1uԤ p(DիW5\/3<|Ӟ={ۣGa8wѣGL2E( (D ?ѣcIqqArj^ν馛zQ;vΝ;3<>@H䗕+WFǎcʕεsmv 7 Gl:u?I"=H侒=zt 80)..6HYfx_җ //;7T("q֮]/cٲeβsXգ[ni߾}3ꫯFǎc͚5 <P@nI4&M={LvmUrԩS:pWAL͋n!֯_[xb*$8 ~t)-Z:Ge2K!C駟nԩSW^mm۶DJ4&MzJ Zn927nl ɠAbذa޽{@B?.]ij>:G5k,:thh7ǏO8`rTx"qPqL6-ndǎA\pA:tg nѱcǘ={vAYq8(>bΩs駟s=,ğ[oe]+WtH @Nʘ\dɒm۶QXXh (gΝ*;aÆ K|.qgƊ+b…驧Z\f69E9sf͚lѳgϘ8qSF[>}DZ QF߾}?2 @p #G+W]uU[ΥsH&+"6lXԫW iccοﻏ 4Q qA ;&.F%%!cjM\}uqFA(kP@زeK\{q{l]az^wu@Zvm~$i @Y2@2_N;-ϟ.t5k"͊@x饗⤓N%Kx@٩JU(\.bQ h`v[pq?6mZO?1tv|*^6M|d21}$nm۶=GE]ַ"\uUqW$7n>UHԿ9sęg+Wt\jkkcĈW^۷nݺ1bDL:5ITJGT #qP?6ncǎXB 0 k?Te˖СCcҥ$9PUyWOŋozuEϞ=;/Yf &B!rQ,4mڴܹߎ;8eܸq3&p @2_mҥ1lذx/Ǐw] B! VV&S#ժP($\.Ţi-;wNÕ:(- ӍWfoUW]6o\GTl6d2b@D|1bĈ>};2۟{|Gff͚6lX̚5 (8/>h ><~me6F׿wQF ,Cʕ+QHB!rQ,*mٲ%~_FϞ=p{>|~bŊկ~6o\G?d4G&;'=;2뮻^{mp b@ZvmxQWW F BX,@UxGC1Wn=zt /Fкux衇bܹN;*@C0a$ji\}ѳgw1W .]43fLd2A}ƥ^6kLGl Pq>|xչ3.C{g:a„ѣPVZ ~[ E BX,@x'svm/{8;ŋ{I)- l6,M?~|5*ٴi efۿn&M6řg'ON4o@| F(gk֬>;^wef]vI82lٲ߿kj$V(\.bQ ʓO>pq2o}+)]|q8(C{w_: l6d?>FlܸQ2ҫWt„ ѩS'1Z*?Zj$P($\.ŢYg^xq2ҡCoO@رc,Y$&MlRql#Ɉ@IyW㏏%K.qW\qE|*XX!Cٳ H[P($\.Ţ|>]te|x ұc*d|>iF>8P*4:^z"UV1f̘tq衇 U_~rJ$ IQ6M|d21htk׮38#~e7@<1pӟW ` $EXFdɒ8CÕ:SNMg̘ao]tw}y睗&g D8@=fi>L&# nq9$֭%IÇOǍo/dɒ߿\@GPHr\E1h07o/8N9pe`}I B[o#GLF@r"zf|>LF {Cy-q-[.,-Zj/B7~moE 4#qԷgy&=Xb{wQGrKtI `]pq7&iP%|8 Heʔ)qYg%%UVq嗧FAz|ݻw6@ BX,7i?s 68\ӧO/G6ԻN:o\rI$6*4l6d2b]6N=Ԙ1c{ֶm۞_gq@xgO>OP|HH[W^c=6.]N 0 yU1rȘ8qb FhxB!rQ,KE.]z+]۷ߞN>8$$o9fϞnZJ;I'ͦ|>2cd˖-bÇƍvA $lܸ1 = HaÆя~&Mr[:tx1d14mڴ8Ӓ׋P|\MHwމ!CĢEߖ#Fcǎ6mڈkF>}b…ޢ  $EX=ѵkWp%jvJq8,n:,X7pCZ[[+@4l6d2bTYfI']Vt'7tSbeiŊqGkfWHMP($\.ŢU[n+Am۶ywSL1|;ꫯ\&8r% ͦ|>2l˖-qEń Ֆ\.N81:v(PQϟ\ @0P>8c̙iKL6mkI=\1qc Tn)|vۉPBLy@ fi>L&#@ؼys?'-!{zwDnkF=b޼ t $EX 8pqsiK,1ZnO=T=:MO_l6d2bUVŀgu["ڵkxĉ 0ʄ8ҵtr[o-{N'M;v`+}ѽ{Xh0MF(B!rQ,(!;K zpݻwGHj$R(\.bQ &tUW駟n$I?O g]vUVrH@0eH@ٲeK?.,ISo^ZvO>=kE4L&/K.$MDe,ͦ|>2`ݺu1lذ1cp1ǤwygtQ F2w߿'@|eH@xSOgmb//ѣFFD׮]W_8l@0а|ӧOXwnݺF&M+uB!rQ,g/bdYp%K{9p%w]vmimm@T#q'#F&9_Tl6y;C :wMd]wML]tM>=?dӦMb| : $EX "֬Y}1ׄ?q8*0pX|y;NQ*b$Zzu'qpM6ƌN:5ڴi#@mbժU'v-UP6M|d21;D^bҥK.N6-;01؈#bҤI|  $EX*oVuQȑG>SwqM755f>GPŲl#ɈT_~9z+VpO=t„ Ѽys1oO=T},rFjdɒݻw{HY&[o5=餓s{qƻ}@DHխP($\.Ţ@Ez駣{Wk|'x8_jv+VDnR5 a$\=Xs1ɟKh\ Jzo+?gy8"HPy_~G}$F#+2M6U&M_}$@r"l6d2be롇c=6Y~h?o߾bM̙\.ٸq@1#q@99sfɆ hDp@z}.bѹsdڵbUF BX,|0N8plyP:u+VHwmT >8̜93 _^F$I=:[z׺uxW裏6T q23flذAFdbڴi1c3 &Νgy8:A_HPMwqF|'};N ͤIb̘1i$bͩZl#Ɉ)Sĩl޼YFҽ{tʔ);@6mZ 6,ٲe@E2|mFRb{ ybФ-ZGuTa1c *FR>n_bP2^{8蠃k׊TqV34ɓ'ilٲEFN;{otM J·~OZ~P1poH?3N:db4}'1cFnbP6ntP,[̆Pj$Br(bSN98\#իW:|p-ZҥK_~@%0|cFRWWw\a19眓Μ93ڴi#e#Íe@M m1xdb4f͚Ÿq[n%7o.e;_FHԇl6d2bfѷoed2q]w 7~袋4q@1ԧ D>}>H;<@|bP1&OÇO>S1R#P_ BX,lgy&8\;Ӆ |1cƌYfbe@P瞋^zzj4;.?~.bP?xڢE 1a wFojɒ%ѳgϫܢF5jT:uhժT]O?nvbe!h(l6d+l6}] Yfq 7?O[~%k׮(i5 P($\.ŢZre8\kٲeL<8Un;8E hpl6dGydK/PvO>;L ZX+V\PVFa$8c̙tڴiѪU+1 3<|8t*HT4Mcȑq=k IĿ뿦'NZA+O?Gq84)MHTK/4&Nhƭޚg?_~F& Ie4G&*UW]]v;ҪU:ujm h2$@3[os9di۶mӧ?ܭ[71 4(O$F`$*׌3bȐ!͛h:tHg͚￿P3f̰4:dʳhѢѣGn:1{>C{ G#fU@( I.b(Te˖E.;8\8C 4gΜѣGИT%'ͦ|>2PVZGqD$1Ѻuk1#yFQ#Pj BX,e?}k CMg͚eќ9sO8$~8v!.]jJ `ʖ8h|~i~`pm۶=y䑴{b@ycѢEi85z6mqzߛ5kÝ;wܾ>hڬY31o@PA[k5Wڶm۳.]#?iMIq*8hXf͊Gю;8eܹwY 0'I$f|>LF 'K.nݺ%k֬kn9so vu~3Vq*8?^t9VXno/gnkѣk  d$ݦMgϞ1o:u>`1T#qѵk=>vڵ[(&0aB@`8sN3*fi>L&#e>l7ѹ瞛?{;wTI $EXp9kzjz뭷 W^y%zPY\ l6dĠݚLpiP=z:{aP$0B!rQ,ŠM0KhmM|Ip@x'bwLBFfi>L&#%g\.455L[mՙBW@IcOV\)* 6NPHr\E1(9 ,N:p׹sxG%W^1}d+O`$Rz3fL,^xӡCӃ:H dpquץJ@y2LF(5{n꫉w뭷G(y_|qzF l#ɈA;cܸq6W^^qBFSSSlv'x ʈ|`$4w}b(F3y~+!v磏>w9YfP&$tB!raV__cǎgos1/~ !vivOa -\tEk%J4ρQ]]-n1n8#qP&\hal6d`:uj3ƙ_3K/}( K+ZG IDATvJU(\.bQ 6?Oqg^DlVg>S2k֬r-v3ff|>LF ZڵkCp [lE< /rHNUIy $EXuUWk$IbҤI5lذˬ@;ff|>LF 6?#FHhǧ?O^+yV`$hѢg}5é7$(˗/:YrTI $EXfI48 p4lذWq8bt5{Sh%FrK<>T h_\ hel6d`̞=;o$ bl޽{/}wX;S{6&ıb~;8H[lEwK91g׾5_T DP($\.Ţ|>8\3vm"O>1yT h #qɓ6 w^zYg cǎ>H.l6d2b>s=]dɳjl#GO=TTWWWc뭷~`ce 㯥iGyd<36Ҏ;Κ5+jkks΍'MMMb@ $EX[5C׮]7k+S%tTPBl#ɈQ~w}UV:tOL&#F1cF92ISm?;v-^x턑tkb6…^tMBUVEmmmrJ1UI> $EXL{6ҁ?-s1yT h{.3l6dh}8m}s̉~va1m4@@k-Z{g,\yӧÆ `3>}$˗/HOPHr\E1ڡ2Zp&L*mǥv,ͦ|>2ă>mc=6}#Idh-Gyd<^6A3~,]4v}㏝mW^nݺЊ룶6Ybʪ$h BX,Q.p!ԩSOD6M|d21JЌ3bȑIzWnCMO>d!СC_O8@1WVX{G|6矟g?}ѧOd͚5b@+| $EX\ve6^B=z_*%2f|>LF6/СCF16@߾}ٳgǶn+@ 8p`v*TIP~ BX,цV^vZ0:t{8@ zꩧLOeH\ۛ8qb[-u?No POOe2f|>LFV4o޼o163Z ͧJV(\.bQV~z0={9ydp%Cq}l^*u7+(a&M4mv8cذaPAl#Ɉ|{&+Vcs9m&@;dɒ۷of1`3r $EXc3H4N?0a{nٳg\~y$Tl6d2bqꩧ:]tW^y%4hvmUIPy BX,B-[\rn3=Ñ$PFZe]|6رcq q衇J@rAe4G&̙C IXs̉nݺP-[ɚ5kR%@e+ I.b(F34550~;v8@֭[\|ũr `$n~/'J5\~B'F^UZ*l6d2blŋǮz~_#H|$#JrOG%1hF6gwq3ѣǀy潷vۉP`y0~⠃JX/=(s~NIb&W(\.bQ/8x*Ā㏷(ufi>L&#_ׯ_:o޼jV={&WJ֥P($\.Ţp¸+*Ւ$o8@ܹs\r%|JFE]_|J|}{G)@+W^*͓Hfi>L&S B|Ibӯ2p^?+ѣG۵f 䑸5k7tP(pn]wwy{w$`C $EX_8KSL6Z6M|d2K,w??u>T p.Il#ɔַ?s0lذ瞋*OtҨM֮]+l74$B!rQ,=֣sqw`w'tRlYhl6d466c޼yԾ 7ܐ^|B{ICCU BX,mn=g:+UυZT6M|d2v/_uuu駟:O[5kV:x`1 ѵkdժUbWT(\.b~ &[K/8CqJWs"ͦ|>2L~cvKV^퇸 J?3:u$@YjU> -[+Ve˖ˣ!,Yk֬UVECCCG;0555Q]];wҥKd2nݺEݣ& ^z e)u떬XB Xql6q$㏏z9:TUU /:T 2P,c֬Yk| .ŋǟXtiVZ5vCoCѱcǨdu-zѷofmb}<0 %kK/ԻzجH܋/tPV/w^z뭷 NX"f͚z1Xhbڵk3'I555ѵk?o= }7:ׯ?Pz,]TH\SSS 2$fϞ mvat޼yѵkW1J… #̙3_ lٲg;IĖ[nnmnСC#n&o9." @(;3ƍ+}zQڱN:EӃ:(1o誫+R+bO~i!Z@CCCs=q=+,[L2[D]]]zG\[o(ѵkdժUb_@i둸ŋp:usuuub4o&MG}4>$MSQ*Ж[nC IO?8J+?g?  [nqfW^yezW-[>`̛7/Yz(8p`zGy]vM0@ h D]]ao555bDzeo?ϟi* 1rt @7n\yv0 P"Z{$N7'H:(!s=E*cA(+Wݻ'k׮ %Fyc=DGNz!!Q8Z8*ј1cbԩ0x()1wC=Kt%zt "֮]_}~M;G\sMG}I@ٜ#qj 2 puץ?*/?Ob̙ڵk$$I;Szy9#eCg}1%isč92OKեs΍N:T˗W_wuW,\2%SNq衇7tS @xbv,@E@ @j鑸>9gd0}tB'DŽ b֬YISS ;KO>?~|tQڽ;Ν}?*aJZKĥip@̚5ٗ8{Gb,Y$.x衇˗ BYaÆrK^n͘1#F}?*aJ^K=1zhc_[nol@{7sΉ^x!ijjտk~b.m6駟zT%P($\.b~qUW &L0w1xc=3g}ɉ't=KbڵЮ\z"P,%nd4G&٨#ĨQ}+={vTWW4M[nkvESJֱc=zt//ѫW/Ahr]tIVZ%JڋBr(&N(:xlٲ8묳sE]޽{'ꫢPҒ$|;T7l6dkַ\Ks1c=&P6>8SbISS kzСC$-Y$jkk=Pq\]БYf9;[lEi]]@g駟|x4;qfd=@*JGB!rQ,kz)pp9ڽEŘ1cbmIx pLO  80yA()/D @f|>Lo ={9izh,Yg}v<F`34hPz]w/%axQ%YPHr\ſӦM3Ǐ7KK.cFmmmr뿒!C${g̙3GUW]%ŅB6M|d26lX agРA믿[l@z7n\=}bf2Lb !UP BX,s=gnnFp@ruE={8ٳg' H;Xr |; T b(+l6q_bĈ>+.<3qgğ'PB:vӛoY ZՒ%KW^IډKQkᄏ@I'pB̙3H(az׿F%fszNUI34+Vرc.1?d.o /\* 2ףG{{(I^zitMɚ5kĀv(Ir]vͪk׮IXV%4k֬fmk5XO&-"@K$ۧNԈ5kI'<@=i>vI ZܢEo߾#(kU@+%={&SL1ej.쒜uYbz @YK$.oFTWW?1f̘9sPAzԩS~A@{O\ @# IDAT eꡇJG-&LǏO֮]+TC9$}'c-ѥKdʕBP$~FhSoF?.rpPfΜ;{E5*UrHgڴiȑ#OӸk&11ttڴiѹsg1h ;`7Aӧ O>$o;:e2:ujz衇@?>#ϝ* L8QML4)va8>b1;d̘1$2n8(KȨQҩS 8cguohSM}G 69K.QMP:t&LhUӦM޽{'ZxدO~1(555{JPn @8w]UivZvaIX$MMM1qdpBA`eSNoϟChѢZZǎcرc`4A FuYVqwn68N;M +I:the+o[nei߾}6N:)wV3hР^nݺ:͘1#F9ػ/}FSXBrKR`aeYy[(Jq嵕˨ԥELM$1"r!.3Ἷ?|1/0 3s?{3Ik_q8M;av`{SO=%# BUUU.L<ӡgϞ+b(͛7?ܸnݺ+$tZC=n4o=N|A1/{*^@ /ZSO=ƍ466^$aʔ)ꫯB-  @I_q8U}#0c:uj2qD1!пХKJP @ W\q@K¹瞛 13cƌdĈ!ϋ@;v*P @9묳b>}Z)nD ͝;7ٳܕ+WP殼J(y^@  ,%7oԧ+!:u s̉#Gƍd$qgvkoY=䗿el̘1QJP"***cZg GuTuV1J$L:5~{ =#@r1iҤ8}t!{ 'l۶M ,\|[n ɖ-[$$p嗋دpʭޚ}BQFE(U?>6LEpg$BA {I'$@H7{xQG [o5\zIQ 5*>Bcmݒ&1(99 >OZ+ \rq8s= 6,l۶M 2$I8p0%@e]&.p7&J_~90`@hll |"PoҥKCee@~w#W^ 555bdغu>\ @Iu%vo`|daӦMbd{vqR555sh'Gy8@3ICCC6f̘*Pj @J}_555Br93f +WL u@RcǎaҥGb;}-L6͝A: BȠ;&[ngҤIf⋍%K$'CP UI$\zB;4ypmhuuuɧ?i!2SN/̄ ⣏>*]^{m2e{lȑ C֮]v @Ir饗lM7dsBP2 @ <8qB _~q864{dĉBdã q"\pAH8SOs9Ǐ`ƌW\!@Fz"P2yWc߾}>`aȐ!֭[hGӦMB͛7$(g R_~qѢEB;Ɇ hg\.̜93;V ׭[k֬i᪫0t`8 B0aBpB1JܨQ@)0){I& |ȑ#o(P<|>r!ڵk(a_җD$8쳣 M8177n C |^ /~1$5 EB}}}ɓ'n=@2dH7o%{7t r@q38_np)UWW| _D1BR@M7$uuu8@=Cu]'@ :E "k&Ba͡GI}})$Ix'a&@ ٴiS@$ BsϰaÆYf'1iӦ 2UUUICCJNh{zPI'd,ygH^z9:\s5"@:餓͛ É'xAP E*c X޽cϞ=23s0sD V=z8hcgyPfĉw}w2w\!Rbܸq":^.@J$;F (#'N 3fpս{rJ!RP(:$1F1Hvh̳>~#Z*˅H\.;JmV(3'pŒl-ܒ,YDݻ<b HEEE7)??]vHP&L  $b ȧ>ءC!L̛7/u]4ŋ믿^"g>#E3ӧI& eW^7poҡC+vM "7o^'>,@j$ַnO?](7tq8Z)|BAqp:6pQGٳg e1t%ihh5kV;vER]]lڴIR!'+B(~z0:묳D(]FH qʪG-Ez(Q]jժHH qƏ+P&N:h\sMe!`"}3‚ %h-3.3P__l1+V$I ͟?? <ZGa`c z԰\ hΜ92lݺua}M{UUU% BPtTUU͛7G% ێEZѣA.dܫ̙c06W__n!Ѿ+` ZE]$dܤIB@B @;ݻ8hO2_/BeӦMaB}@*V0|dۗehwv[$@;8p8h"@=a޼y|GvO|BRhE1VTTտxbw(P__hCk֬ ݺusr/%c@ ,]4GȘdӦMBP2^z8l0!ZICCC@Q$ӹs`[o (57EhE:u Ibr"4nܸ8sL! czVX%%˅X]]-@+mݒ|>/{ޗvι+dP BꪫhE"PT^VNr)& K=c!{ڵkPut%IקOp1B!̚5u]OJ*++d vرcEC>6eZIeeU|vs=G)dH޽Ê+ܷrqXUU%.믿=KSYY@̟?8P(~!ZAǎE @3xQȖ.L2{24vX C B={vYvډO=@f 2o|^2e"\& ;v Q Ȏ}^{=;2"466Ɗ 1ZhĈaܹ( 7~l2dζmw).H 8hqƉrׇ}' l6m@f VȐ_2kICC-dLb3;PUU/d[o%JUB!~B¿PL`:  E Z(F6@q?~!<dޢE7 BA@g-dIJe[o(@C!Zo(8؎; 1uT(/DhB Ee O>> ߨbٲeo-N"PT`;=P #.\֭[wcI"PT`;N;4 #n&(;DI "PTr\1%Ȃ޽{+VW@Yr1vA f{/X~Oh֭q8Ȉo 0}t!vB>7@Qaذa"@Fu]!(e{`'y(*q=X #O.eo[@555@QyzصkW! v}d˖-BP.\  @3r$(;Jp ߃q8.@3 `b3O> 2{f IDATG??"4Ê+D =zf'|^Xp8'|[l VJ}',^X@O$裏2`ڴi!(` -[&Eg ާK.c+** xEwˉ 믋@ׯ, .PW}}}ذao@9CE زeKX~O_Jظq8x?^Ȁ7"<"lGQ@G$a̘1B@<"K"l8@GMMM2_筷Jm&8x}'dĪUã>*vb31b xP(1c  {s1"@W>³>+G1@?/d3<#|˗'*|8q8x{ Xl|>̝;WH)q^z'dʕ+Ccc3fR@kС"@<" "|}k3=zO>-R@k"@Չ;zD1@B. 2`Ŋo`|XzB PSS7IRm۶qF!?>1F(:qBݻ*@liΜ9" @,d?.4/,8!=ZȀ^xAh˗'*@¸qD XxL6lBA1@rЯ_?! ֬Yc ?2({555}(uW|^ ?2({={|U(}O?Dx8ހD xEl2@i` wSIVR@eC2`ҥ"Nz ] PF)doy sEx8Zeee2`Æ W;'/^,8Z.]^TJ_>|^h{NwE Pz1\(}Z襗^R@eo߾"@"@ +"+(Eg 6d ͛'вeD1@Y;CD XxBW1@5JȀ+W-{ ,8~32mmwۅ>+O)RjRrZRQ J cRRjM!/01AJ o4RM`0,1Jsr;m|@~ YR) ׿UQ G  =LLFCBQZ@ɚ>.4!8`9bt! ' ŋ^hҫ*@Ƨq$kŊ"@ YCCC"@:tHh믿.䄁8TVCZ "@x  ' +TbxD&9rD q$iʔ)ϪoMz뭷Gq$i"@A466*c3@f̘![o%4i||\ q$i֬Y"@A=zThؘ!*jHҜ9sD0r@I7oPyFCB 8~P(1I1F '  @  8S*BwwP"PHNggP y1F ' {Uh4/1ƃ*jHι{ P;U yYUV3@rP (?1T_K@j&M$H\^h^e"@ 9SL \.1ƃ*jHNP rYhRe"@N 93f @4@䇁83}t@ P$H̙3EV"@J%GB!xPZ~. @4\.9a  RD&Ah5q$^)4@䇁8-HVTTP@Iɲ̿@tuuMا䃁8bgԩ"@zzzT!xPZ@IT*"@̜9ShRooH8(YfM2e!8RT2{lI"@N )jXϟ/4ippP q$ZrM9s!8RVE)JTr\apo!gМs9a TUjqHJR ;eYBbti@ )ĕe G qPL'O&V9b b:E *S>h=q$@ӢED 9s#H8(˗4o< G R#2(+Wxb G~M>=dY&LE]$b"rH9`E1@R @qM2A8Er9u! G qP\CCC")r@I1ŵ`M: 5=C@IײeDS4k, g q.R-\Pq$ettT(+W,˄S0<<,䌁8r1rN'> !(-g =zT(!kpj6m3HʱcD[dp @ ).2$-\P!q$ettT(O~"Ir@I16sPTpUW.1Fh9q$ettئNjN ˲zj! Ub[`p===Tr;I K.N`hh(d ~z.]*䔁8b oڵ!2!ߗ@> )FC(wp|[l=E c nҥ{TSHΫ*܆ D _H஽Z8֯_/䘁8s!M022"qE Ç XpexZ͛'䘁8?IHڵkEw7oU9q$/~"\ve"@ 9%K!FFFD3@r @:;HS\Vr@_"$۬Y @0@r9i馛D]y"@4h=_HNR DjѣB^z).[Lё @K$ 5cccattTHҥK = IoEDl޼YwEL6a $7m۶e$mddDhH/,$;̘1#*@, _8 1t w"@BJHy;;;6a $"@BnfHֆ D6b »CV$Jb $,[,@jâE6b $@rV\i ڌ8m۶P. )z F8PTŋ=Z6n()ȲLZ@ɸ馛D W6 pb @ ]w]T*Bo]hCHFT +VJPtaݺuB@2@Ro.vZЦ Z @q"@2@r U^Vڔ8կ~U kP 97n ZM  5kD(ɓ'_l2! Iw֭[0q1ڑ KAFT ;w_Ru7@a\2{B@3@PTN r.J(q$m׮]"gUb0@Җ-[,Ν;0@nFh[_|q @׿*;S(q$\.5kD%h7&M}L(qBؽ{m۶8!\paѢEQ EZ wuQ. h=qݻw@ؼysT*B@}# Q T*_(uow}޺ub__P@Pׅ x |QjŊqB@Awٹsg\E3R*–-[ٳ?a! {w=#8xz=lذ!*@^}N(8qp?B\\7y P|8&M6mf͚! }ݻ7T*!hݻw0+lݺ5*@̝;7~Sa N{^VB{b NZm۶E%8-Z ! !$|[ sU{c NB\v[TeŊK.c N]wzzz˲,!βF!` NO(p\ я~y'-ȣF!Z-x /qp\}a͚5F&MM IDATPOw@A#qmVRmv; b/B eY~iӦzzz¯~X.h3;v֭䂁8ȁ˗x *>֯_w!@A / @Np aӦMF@~&pٿ?8V^Eh4D qyCoo9T*O?(4 gz8p@ g׭['@ / @͙3'<쳱Tr /nxu PPFCr]aȩիWGy$fY&@}{g rldd$ر#*:b|09cǎuVk-044y!h4D  @xG¥^j$, /rT*bg8h?|7o838p u1h4D  @(Jᥗ^ SLW 3\._qΜ9bg8ٹؼ뺏a݁1ءLi0m * ib| 7F8b@D!D3 `P+277 ;R:8+l9o;4uO_cȔ)SbhhiӦX`k6q'h A Ƙӧ֭[<@cAf3n<3PCi c̙3sN<{@шO5%@)`ꊇz('Md h\|1jL R6{X~}N0_g PsUU"7X~}] _!b8`oMW\qE^|ņ ""2Eq㎋_"q.+@q`9SCvtt_7W_}!_2A ƙxsxF7pC~_5OUUFq0͛7/nݚӦM@Dٌ}4Eq@<#3fXm Z[[;̾>c/ P 8f̘###}]]]j@-~\d12Eqnʔ)1<<GqHP+'N 6o Le 5[lc=V8 lْ ,00@M4X~}|Ƶ~922s1*#P8;#.8`\m۶ӍIqPC^{mtMb `8sƍj ޵@;XsĉƴFW]uUG?2Yf"@{122jwqG^~8x裏Ɣ)SĦM34[UUFq@ǃ>g}H0&tww?G( @z}-1b~m۶8蠃#@)_z{9ydcEi4qWh6=* %@)z '۷o#|&6{UUUFq|xG3 mmmq7~c"ٳgǓO>K.ܺuk{`t qnk6188ַ lٲ|'cΜ9jI x׾/HΝ;7 &LիW5k4^UUFnF;}XbE6 Yooo>g 8J!/qiz---1007nS*3@No˖-SvKWWWnݺ5WXa fk֬n-'Nh5袋rtt4zzz @12E:+x~@tAaÆsk4ߟ>A(R1e˗_\lY6 @ uuu-[rժUlzrUUeث:::b͚5qw3V[ꡭ-ohyMq>qꩧs=׷bŊl6=Yooon߾=1*#P>500ù`/'OիWƍc֬Y`Lt< q>7gΜؼys\wunFwycǎ3 7_|qܹ3#Eχz(ohmm5cVUUFnJ#VZyqǥE`l9s'e˖?A8s̉x ֮]]]]BqP+g=34F#(ex8qAF#-[/b^q`ܩA (Ҋ+_/~b؏z{{5kĄ  Fq@Z[[믏۷ŋhyurƍm}@ (!k׮z*.]*{YWWWu]944'tA@13'+_h,Y @0r!188O8㣷ׇ1E &Νs΍?(g{,zxg瞋^x!v/ͻv7]صkWd[_lFDDKKK4hiihiipҤI+<8蠃bzhtuuٳcܹqa{a`o-'x~UU"4M@e(@@!@ !@e(@'@) !@UUe @e(@@!4E2E(@Fq2A ګA q^f"P{qB q^UUFq^f"B L#P8BP{i @UUe P8j/3@=8J!P8j/3@@ !@e(@@!4E(@@!4E2E(@FqԞ@(@Fq2A q2E2A q^f"P{qB q^f"B L#P8jO RB L#P8jO RB L#P8j*#P8BP{i P8j/3@=8J!P8j/3@=8J!P8j/3@ D IDAT !@e(@@!4E(@@!4E(@@!4E(@FqԞ@(@Fq(@FqԞ@(@Fqs&B E  &c*`^~/`:8Jl" 86H0xqTDpm"` 00xD Paaaa@A3  m8g@A@A& qqqo$Dpm"` 00xD   m8g@A@A& qqqo$Dpm"` 000xD  m888M " 86H000xD Paaaa@A3   m888*P`a=@A@A@Aqqqo۳ DDpm*P`aaa=@A@A@Aqqqo۳ DDpm"`aa@A@A@A& qqqqo$DDDpm"`aa@A@A@A@A@A& qqqqqo$DDDpm"`aaaa@A@A@A@A@A@A& qqqqqqqo$DDDDDpm"`aaaaaaaa@A@A@A@A@A@A@A@A@A@A@A@A@A& qqqqqqqqqqqqqqqqqqqq߿"aaaD =<<\?~p?@A$p߿_o߾pǏSu]~e@A\͛7Bp+8˔Nq"p+8x7A0nqׯ"p+8xÇݻw.q*p8xInc|Ync|Inc^ncٻ(zϔcujժR4Mx(VJՙvƬēPaF"wHAF>{8W>k=O؁@I v @o8kz@`}1F v @oЛ @젽8؁@I v @o^#;hll4F vqF#k` F׼dAKKKuttDKK!(Z|;o}!uwwǚ5kJ-w86oMMM%s<}{cvb) F \sMw}@8qb~"}x_=~篾j'zo۸+J1mڴ9R֭[gzM Ȃ¶>J{]ʼn~ZId^#@&. Q)Ȃ,=3QJMqd@ ~YijQJVZ:F L\ ]{{tttD>/c{}h!{TJB}}}lٲ82A (tFc7Zp:R y#ЫȄ2_ 77M%u<]]]Q]]R.]jzn @0,<3k:7N L ]R^. qj*++X@M L ݶmی%`%~z5X֭[ʇ*82A (tFPDC)@O?o)fϏnCЫ8mܸ^. N4;x'\ּy@ B'bDgƫ o@PV+@aҐx@^ˬY\Җ-[b…K:? R{@a\rky'S}}Lљ9sftvv^'@&_ P6lP(גb֬YN0EgԩF  q@۴i/lb(r555% N4R. mQlr\̜982A (F"jժR?Ƶk:C֬YS6}$S4,Xuuu>D  q@1Xj577Gcccyg]]]jiiq jkk_~d?زeKL:Չh71C L@Lg>Z'ޠr%}Ǐw) ]]]C5YB!@& =P=X3L:5mٲɦ͜93OȄ؊+2s555N8AYĵń l رc@A bPYYd({83Z]]TUU9rMAkhh>< q@1߿PyҥKppʴpB'5jԨhoo7E LXbEfx,]4r9'vQ>e˖eqw;\.{!(8qd@P,8UUUEgggfwQSS.ZjUlݺ53:'ǪU|p@ b!] oٲe:ָ;x έj @ EܻEa…N<'|2s|w-[8?$@& =PVX6l`(2s̀Ulٲ%FS0***@m2!dh6X|yt h q@16m-Z( =c.x ͋ 6bVq%Dww1(qd@P~a#@2ebF.9rd3g!mnXl(*qd@PxT[[k(P&L0_<::: +~5Y+bƠUVVFEE(:qd@P|5  /_455͙={!̚5+?/!C_|qtvv#@&07o~#+?~^ýޛ~Ccxg|(@Q |(Ni冀b„ ;&MJ yx衇DvW\VXaް &ѣw-? R@ok( ͋uywcܸq_2ZZZ m_җ{..2OP8򗿌nC@=z^ȑ##vpuXxq .ٺuk 80@Q bf͚4sLC@ؼysL8W/sG*όOv!x]r\|K_˗(zqd@P#@կ~---xwy/Fi]T^^f̘av:u( qd@PNV^meF2k AĤI| c'0{[o@ bcƌ1{,x \.~ӟ̫nC---qy-^b1xE?p\}~ eeBQFEGG!9;iܸqi bܸqU=D}}1=X| _Hb? R;@[~}m5551i$o,vR{{{~ ~Ekk!zʕ+iuuuox8sS[[1(9qd@P*nr=?qtuuu9rds"6n#GAD{ҙg ,YuVcP8T~_yS:m߾=nC97tS477b7xgR~bӦMȰ~:N?~MMMs@ Rr7#FDkk!v]wݕVZe2cݺuq=b7ZdI:S⥗^2F=qgVP8,\0=c=`֭q]wĮndCA=`SN^x#rkP8\wuF='?I455ͱĮ;vlZl!(yUUU1vX@!SN%K#ƌ~` +Ȅ2_Jӌ3 ƍo{z㪫|>o J5\]]]؃ҩ&Olcq饗&YdBJ@)//\.gMnغu!zӄ  Aɚ0aB̝;ׇ`۶m}. >%-/ǰaÒ(Y#@&hҥ顇2ׯ|'mfJNKKK|5D/1lذtGkkAJի㤓NL R =lС"C=쥗^J7t!(97tS^`رo߾|rcSG?˗,Y 8T=s;4%KĘ1c nSOtyQ@Ӊ'xc>|xwyiӦMY&@&?aڰa!2dHtwwc7K/4:::A\ϝ(01x}- RV\vZ 6,r9yo6YPV7.A {gcI n_}{ƀ7{Laz7zg-ܒ:t1(jrK,^󢀍5*͞=;?f̘'?icԨQo;m۶ lIϚ5!'N . ߣgЇ\%nҤI1xi *++?N8lE?TUU}M(IC p ~@^:.9swǘ,H)g]0p?~|~2@Frk"v 7 tttėhii1E-.+I?O>8qAzYWWWqqG'q88@$ #FvAeee~"5{PUUUַeη(B֭K\pA>k׮5H/?~{qצf+ r. O+W4]]]q%Dgg1{'?z(.q".}Lek֬/8N=Ϻ5 Yy@ƈd[KKK\ve^p7ƒ%KjzUW]uHmm!(xW.%JCkkkTTT|Mw}wtuue7شiS|[ߊ;,;6y ;G L#kDGMwu!`'<3q-͛7לb V[[[\p4~+2vaqwD{{QzMbq!,utt^82A ,ȶTSScxq%hM﫬L]t/*-Z$&Yjkkӵ^85jvQCCC|ߏ>8 6,m޼ RqdBYYvB/m"q_MU\wuxb1iҤtmsmŘ1c<+2bժUk_Z:<֭[gbŊ2dH|[nIF7@ LH)-H@v-Z( :O̜93~ӟ >}{iƌ`̞=;=+2.UTTC=4]z饱h"x3ό?<1"z@ G։d׭ޚfϞmA}}}|+_\.g JO?1u>l 4ncdX[[[=:}cKGydTTTD]]]783L={v,82!ˁ8 J$ .¦ 6 6$k8\^z)7oU]] cƌM6eW\qqőG***K` .F$ d 7g)p ǝs9Q__o 83cڵS1mڴt%w鬳Ί;jjJ'⩧o1=8RyyyZx82A H@6Hw A=HئH\2}3m۶=fqyEuug;3f͚t!;,?O?>8x[^7ne˖… ~g 7d@dϜ9s_~'|J$ {wxGnjAflݺ5>nm:SӧO/#?6mUYYY|:* 80ƏȎ? .wuwwܼyg?)Sz48p8{D.TSS??}>}W>}b>}ľ{Wo?ͱiӦhll7ƍӶm EJ LW&=k׮Mgyf~޼y kVD̙3'{w4b1p9sme& r.^_#q{12bٲeϏcPnᆸ;EJȜ9sҧ>hhh0oXSSSuYp82!ˁ|>`dկ~JC}*AO=T:bڵ`mذ!>Oł <'(8qd@8o~zCPRf̘_W¥:r)Q]]m ^{.N:Xt8I L'=7|s AIX`A\p%nNH<1is̉㇬ZJ%@&e+q 8REE!(j?xs9i۶mȈg?N5jT?m޼282!ccWd~: ЯꫯNk}k5@1 `׈du5\Fi Jeee򦦦9Ȯ#GO>9jkkg?@ r.8l='?1EaѢEqgTlڴ`ѢEpƌ ?1(*qdBq|&wRyy1(hs΍O?=566X70`@>|xtww$cqg 6Pt8xD"]}ՑA@1 ʲzzH@׿NsNl޼kÇǕW^rA)qצOӱn:ǹ]tQjnn6EO LH)eDgΜ9cX<ƠWŗ6lXbڴi`n\./#H@I .v+8K.$]|bvqũ֭['E;3}KÇ6/~~?SwwQ(Yqd@^"q4vO|"^|EcУZ[[..(m۶- 8x*&L?<.qAV  qdӒ%KG?4qDc#VX'pBw}Ii裏qEwwQz#<|| _H555 d@PVݯ ı'd֭[cРAiȐ!jv}}M˖-TUU.(s1BqG;.=ܴxb2G LH)O.Ǟ&#FH}ŋץ!?Ҷm BAk(;ZZZ=ЇsMO?0%@&%]OLi^ӌ3#HLwkDOsL2dHl߾ #<G}t=Z'NL Hp@ 2$-[ff͚C=4|a;qd@8l#F1sLd\MMM}qu։Q^~g\:ꨣbfW;#N98Syyyu wPSS>t 1q7QGfΜ) EIJÆ K~xG?7tSTVVf=Y>K7}>8]{iS9>@ 뗟5k! CV\vX&G_:/E@A4iR <8uvv o7mo{AJX>'ŪU^+wO~}8߿{cCCCO9sĴi⥗^r5$/ơя7.("q{СCK/7M)1O>d|ߎ }V'>۷o|qFYYYQCMMM,X /^Ϗ%K\.@$SSSrH&G?v(("qcxѿc:thL4Nx}uQqQGGGydk577GUUU,[,}٨ŋygv7,H)m\. 80Ə "bɒ%iq1䯻?ojQQQ6-[ܹsܹstA/:8蠃w]ѧO-oy.s[ZZ1>֬YWիWǪUbK/|>$&@&d90)T"qKA [᠇]6]6ϟf}>}wxǟv IDAT;O~3---kmmfd(Pqd@&8> _c}1L;wn~1uԔ -֭[ %d@Fk/cL_WҁT^^ׯ7J/|0N88Ӕ)S  ee @@$WS__EEE:Cҥ^Ow^zG?QL L zRyyy:=P r1ꪫ~! JSLI=& r._#qNUuvvɓɓ__3_p~6h'_/>ĉcݺu*{Ȅ, #hmm)S)S~sN~qg{^9ΝӧOɓ'G]](8sgzUǶ@mLmi[qT8ƨQ8%NhơkDjU,Ἅ 6E51!VF8Ľ =OBH \}DXiy)&''͛͛W\VXjo433fff/ˇ $@qN"q˾}-[Җ-[q6mT.t%.(YS=p@o~~_={={\v}gD;wygSJ)MNN.(]xiƍiÆ iݺu8Ͻޛݛ~ߧ{_i޽?  ]P .`ۗۗm_[reڰaCٸqcZ~}HiiڵCw;s=Nӟ.?C .0#'iϞ=yϞ={˖-KSOM'|r:餓+VKs:g,Y8RJw*O_ҽOsOB 8B:ӌDu3Dh鮻wu1L@qr(dc9q "@W @tH]$@U @]&@B9:8D D 8B@"qt@!DĕR|!@ @!@ @"@[ BU}B/GT"q@!Þ] Dh8BDh8B@x"q@!DĕR|Dh8888N 0*3z8x(8L 0r!-$@S @`"q4@a'@@p8"q4@aD uDh 8ˆ+|8@ 0*3z8;8FM 0r!-#( @0W"q@a!(@0_"q @aD uaD&89OFH@lq!H@\qQU1 A;$@9G 06E  )BJ$ 8!Pv"q1455Uz^Zf1PJ).:B$9lZv1p*3z88ns-^/~B9<@tH@w ! tH@7 p9^8 c ]#=q711Qv%n8/^/[)n k'q5>>^vޝ֯_o J).8:묳Jx^ h?894C[ bh7893KKg}1C B$:BHDI V^]9c h8[zuM\p1!j k@@vigggcXcA@\)Cp"q!Rp殪b>Rh 8:S;XacC9CDO e6mܸ$ tq-r)|wlzg /8hUVm~8 H@3 '89==kӦMX]>pX"q#pp|l E+|DE Ǥ?>)O1@TUgq4@@Cq89<@0"q @+WL/STc@щ@@,_?-}s0$q '0q#lٲt-=y"8<8![lYھ}{+0dq'0XqCtt-]>W"q#0$p/| 0"QqH` ҥK#TU1 "qtt7ss $_qdɒ%/1@ H@ XںukyK_j 8tM7 "0X"q'gccci֭k1@D uX8>Kw˫^*c4P@\)C%pq}266WhrM$`a`ll,}.yk`9.s(̟@"UUo׾h888E9~u{1Z@ `4DN `ᮽZc@̍@Wַ-5W@$)眾/mhR>4H á8vcPU|F_Jq@@ӗ%q89<@D"q'09/~0@ 4H# __wG$/]w!:@ DG (>ϔ|舨]>x"q%p?ACtH@\)  pXԧʇ>!CtLU|F/H@|, A9F$L A>O|#(88xG?jh8 "8u]W>G$F g?kv@}+ D@@Qa-7p!+"Bz{SnFCSUq ]!t@λÞ] 8Pw/| J ;D¸ktHEq@oy[׾? v :I$87ptH%q@Moq%t@Yo|˖-[RU_"Wf,D t_C7|!ra.D!_D׿|b̯Nk8ȁ}@("q@[eW_}uٺuk39WJm$t+_rM7G=QF h|{bD hWe۶mpIU}F/D'@Z/sس  ^?!Htq@\ye۶mp[@\]>D&Z~я~-[f -r x8ָ+ʎ;X08L$h"88N$h8.cǎtqEL$h8.D9=@щM!4e]V~7qHq@#]zeǎ7}9W׵`DQ|fٹsgZ|1ȁR`DQxFңhcwq̕H0*q@c\r%o``8`F`*3z8M ?oO+V0s{v8I /X`DaFfӦMeΝiʕ`(",H0 qH?8`x_fff'l F&q!@0p^x8  $ _)b F.r k" _z^Zz1hȁR`D~bjjΦ5k`DnjjzvZc(q Hq@_wyevvVFK$X(8o=駟n )q',@p@&̗@he׮]309W׵`DDebb޽;MLLƋ+e IDATFH$+8`KK֭3 (s!,xٽ{wZ~1h 8FM$88`:h^ 9DPnrrN9E$88`-˼ybddDF9WUDOCѴ`ch9"PS"q ;wGD;wGGGӑGi ZA :RbWn8mR>h8@ |w9稣2REgh8ț@ p >hc:q4HK М9s~.lc8h&8h~8s{!@nDy믿{1`2gqfJZwy("۳ M$C L׿7@9ft:i͚5q)@\UU>D:NzWbŊ 9>RJ"qPwq0N'YF&A > % tK/]t1`#"qPOqN'q&,}F/@@t: /%\b (=@{#"5WezK/5L@Hԇ@XQ'.9⪪O"qPqPSp+W4tI΁_"q0xqPCEQ'x"~_H O$K j(ǵ^k 2888q뮻e3z8&J$C j(c@E 8?8(ң>_1`DV^7p!rUU`D`V^V2A΁0%"qq0@w3@LH@ }v!`D`޸ }V>Dw瞸; PEgD7?ǝwi8.8>8蓻;?(@\UU>zB$K `ժUq]w,@\D88[o5xC@ @@w@|Pq["q0uq#rK5HY^ ~㡇2LQٞ] ~.馛6Ԑ@HL@tэ7I aꫯ8peSz8L$>"l2q8h(<@u'}XlY[NZD K$`.Xv8@ԛH=Xti[.yl#'@S,Yk׮5WUQDȕ@|Ygof6m1r EqDȑ@rgƆ ʲiDȍ@8 q8DQs<@M&@Nŋcƍ頃2d@ I$\ŋ[o% qdO7@fDh;8hѢذaC>}1 3⪪rHm&@v~ǖ-[1 CEQh8J G?wy'}31d,|J/@Fqd?alݺU2WEDh8pI')%8h#8D ;餓wMg@Kq~غu8!8h/8@ Zpalٲ%͜9r UUȂHM'@+{122̙c r E "q4@_ث)@h}{cǎ}EȑHM$@k!yih~cǎ> @~Dh8;80nq'8B F[`Al۶-} _00.⪪rdO$&,Xccci޼y-@\D|H"qԟ@t80aeSz8Hu&@~166/(<@|Hu%@|ߎQq8`D#8[V/}K&M 88F F7)t@i"qԉ@waHl `r UU`D 8j{/}k_3"~Pq֡cccp@WeO`|D48jC{/}_7UEQdyn8?8I Wcccp@O!P+p7qx0qWK7@0"q@0o޼ؾ}8s⪪r0I"q@w!h:#\p0"q@%[Y^ N$~``Νߝ;w#<@E;D58bܹsQG+8`D%8Ν;A$^v}B 8zA 3gOnݺc100⪪r"qt@}1{#### .40P"@Mqܮ8p@eOD8zjoqg q{"qt@=3k֬m۶?xc!HS%@O '` V^`*躙3gm۶ʼn'h v~`i&q8r UUD 8fxx8mٲ%-Zd r E`3f͛7O~cVy>`"qO>@E`D/8dwSN1q0qLڌ3ҦMFI$`RO~8S4@0h"q@6mڴ~8ӌ4N\>ԈH{# 7x#,Yb r E`Oq>@ceOD48ehh(_>9cVEدǹk :`78LZwyZA +8R`v?|c!ԙHqQIk֬ .@@CM t/+V0:"@K Ot:i͚5_@+eOyD$:Nz饗⢋.2ZEQdyn8h&8R /_l ȋ@^x!.c'4H@>2WezK/58D (ғO>]v1l@ @@H?bʕk ."\>H@ d(Oį~+c)< @@@fH?x\{TEh'8Eu]g [q@@@&H=X׿658mDE  EQG}4zcH$=2z  UUDA ĪU Kp8h?~c2ϧn lq-u}mfO)"sG>C$Z{o{ B$Z{;{!D$yZOSy睆8 7"q"w}w4~j|4@@ Z*.CC4@@z`2ϧ8h7`qn"q&PrKo3 ԙ@@|C`> POq sM7?lIH@4ȍ78@H`e!@\~sωH\>0a"qׅ5\r LH@!@M,_<^ytC9"LH@~xW` +| S!qlٲXv8@E=8 cݺup}$05"q%0 K.qUU8XtiL_΁]#q}dɒXv8tH@ Ygof6m1D DK O<ذa8eO^8>83j(l.H@wŋcƍ頃2@ H 駟o8@Hns .=!pq]y믇Ac@@o,@@6oޜА1JH wDO @6mJccc7@I5>A$`~ rWT@1۳ "0wqx8#Prq!07qte]vTD΁N}%phq P=9RJ.w"q'@6lH;w ˖-3@H`Æ jacT@@9@<_>ZpG| e#?8y Ԕ8@=@PF"qo'0Gp P>"q'0~ Gu1*.@\q/8C8j$@\JJM$@ ֭[&&&Gm (78 wqXn]jaժU8r&pgqFF#ߧq@xO?=pqbٞ] 8 Gq?8jr#iv8Pc9: TH8ڵk2s .%B ޚ5kR 'p12 P]"q@Y&ٳ'|Ȅ@@u'dkթnd)@P"q@ YZzuڳgO8ScgD$+8 ;'tRjp8x≩ncd*@\qF LSO5@rĥ\D:jժ499֮]k ԓHPq@\2MOO3<ԘHPq@NFOU'ֱݻw:O1۳ L q>@@Djcݻ9cqN"T@P+{pM΁ dG$86o8Hq@O4 /[oU1۳w:KD]l6?n6cwFOSJ.@Eh{.~&8`1g}6}ӟ6cq!,@3qJSz8J (\1<36l6=@@o !*~t=Rj4}J/{"q| 1z*{ru:D c O>d@K)}"̕@h1<bٞ] Dm۶m _!F#ߧq'@(۶mKψ-8D$ן;#׿ [qԍHԋ/@ #ԧo~q8l6=@@}@} 2O~2cA z |H».cF#ߧq''5<ru: "qPmqPc/,9Rr2!%5я~T@ \@5 @ }#IG}?8r"#5}(p~$"5~0 K,18|@u@M|J  o"qP qP믿w@"qP~qPq{o!R1"qPrqPa}{ӟ'q8`NRJF e&eq8`^ؗH@T͛o̙@$#iӦ466̋@""iӦ4>>?pc&lD<"466&1fyn8F$A */O#0`NH@e]v%,ZJH@إ^*F ڰaC ˖-3P8C$C Jhjac`Dd֯_‘Gi Pq,H@\Z8tY1s P"q;qP~ Gu1t:F`D7^mE$O KSSS裏6Uccc!X8.8u֥ q8'ǭ[h"q=q'֭Kv;Zc1l?Y$B@w@qizzZ 8";t8HEb @vin?@߉P8(@8G{P8(@ڵkS'p1("qxqek֬IVK(58"#]f͚gϞp'J$h("qpq%WNv[8" #]0;STHEtInc%@QD`~@'x8T@s @QD` 3qSO=@mP88(ʕ+dXv1bF8"&r4==D(H@+F&''[7n4@("q bŊV /("qN barrRj&h.("qL f7."c̑HE Wqp˗//6<P8r$lٲk׮t%j*h.("qF 144FGGӥ^j 1("qD  ;wLW^y1 "@QDȅ@.]ztUW2c4BP8r @fpW_}1D$Pwqdmҥatt4]s5"qE$: [att4]{8"@] o@b#V8"@ %K;v-[2%"qE$ +W_M[n5@P8D l ^{-]wuGP"qE$ aǎp%$@QD8jo&w!cBP8N Z;+"P"qE$*fp7p11XD(HU%@-5Ͱ}t7؏@\P8H i6ᥗ^J7t1*J$P5qJ ۷oO7|1YGP~"qE$*6fx-b bV8"@UP f3 [o5@͈P8@ k4Ov191bD(He'@5sϥo UHEcxgwa `^K$PVqTL2@fD(He$@3d,Z5"@QD(8J/~@!G$oq޶mEC'8"@? Pj۶mK?9y` 58"P.\2~310$⚏HY` 0쮺ꪸb C~ IDATCF 98@5\cHY`0l\$Fhb"qdE$ ?ww@"qdE$ 0䮸@!8$+CJ DȊHY`\~k50x=8"@_|q! .8DȊHK AwǁXu%oE$p0T˖-O 88@梋.7xc( 8މHY@x2AqEśnI$@VD_ sG$5 8"p @>/}KZ$F`8t/48HY`_xRLwy_j(@K$pЖ,Yc A !@VDx'q}C_8P8P"qdE$#?oVq8q0DȊHoE |@hXq,8"  vmE$Q đ8" _JR[&GVDȊH{ JRC[[1&GDȊH!9x]w GDȊHqVg}vC{{1\c08&;:묳=#@E$4/8… ۿ#` +"qI `q8 \"qdE$89S=Fi $1N$48ޠ7_>5@n 1TDȊH@5qÆ @ 1DȊH@s  P +"q'@8 BWW1 p +"q&Oh*q 8"_qMl޼yp@S*\g8|r ФfϞׯ_Fm 1DȊH@8hB'xbܴiS;v1$v"qdE$ _̉'7oƍg i Q/DȊH@~4=qӦMp@8|h'pBܼys8C4=8HYh|qMx8HYhlq9wJƏo W SDȊH@r c~/&q38"Иh̙3֭[ɓ&I&@VD@@38HYh,q9sQG-[)Sm(DȊH@ȑ3fĭ[SHDȊH@c q8}'G +"qO  <ȸu0m4cBuzHYoNܻi&q8 G +"qˉ6@;<zzz$1 K$'8%pht"qdE$4;,nݺ51@:=O$' fon8@I\ +"qC zq֭#0A#ODȊH@}hp)F WDȊHh&M7n Gy12$8"0ܤI-[Gm đW"qdE$`Ա'>e˖0k,cdH < +"qC N+BuzM$ ='uh„ ;*c9 I#{"qdE$`h ԙWps=Xc 8HY:qudwT*9w1QX4MC$ 8:1vwq8$h*"qdE$` ԁ1cL߸q9s` |DȊHr 0^:餓0D$1MI$ 8a6nܸkܹBq438"08ɫq(0 in"qdE$ {NAwww`$IbHYV ѣ}~äX,Er\vm0`׿?'/>_{{{5g̘1!I0rikk{=/rxjZسgOկ~'׿/_cxٳgsV3&ШQ½͛g a$UJ%YxHCP1bD|Cggg ;=_wuu1cƄqg 6+~_^x!o~^|3τgy&hFy`5*[.1YP0HYYxqXx!R,رcرc[^~Wcqᩧ O?txꩧݻݻ~ӟ4P@GGG7O=Tcԁ$Io"@I&I&c=={?aصk~j5co qN;uB ޚH͢-̜93̜98>G ??;} 68Ax #LL`x?h-`_d-yqSB4Mr\vm0죎00B?d⩧+nvq8$U*T*jj zh'?xOիW=./8X.`Ţ iPՌChڴi. ۶m >h\re1cF @([nhPp*JR*BZ5 :*X" c@ JJPVunƌK_Rxc,FaDM$ 7pC?cT$F!i' ' ^xaA 0<x$I??K.9V:i&r9j5c@8Ú5kΝ;hZN^$I'?Ic\$F!TTRժ1= ֭ 7o'xP 8W^OMPpZI__H43<3ر#q]zP 2'@K$\wuS1DX4 4Mrj1 dɒ#˿Fzm}s]v!H:= JJPV hԨQ3Lx^-s 4}sqh2q04MDM6-Y&l޼9 9īM(I#0|83÷rn@ <3fbݽ<ƎB; Z[[C$a̘1o( ۘ0jZسg7ko~~_ᗿk_Η_~^xᇯUV˗I >oAI\k׮ 5rȰbŊpďa>@PFƏǏƏ&N|ܸq+tuuگѣ ޒWK/jx饗ĉ-~T*T*uօN@9sfH4tM+LժQC-L:5N6-zaʔ) SN ӦM 'O&M ]]]2ƎkB$F:i'9$IguV͛I ԩSGOO^I&a:=ԛ4Mr׮]:::  'lܸ1tM+LժQ`9Hkkk1cF~I&9s9s;.s1aƌ84B`Si&}}}"q#===g__'Qo0ybp{MfrE HOKKKXbE8ҥKî]ۼ~64ӧ0>$W ivaȉy慝;w.(u]f MX,ٳg38#O>9704R$R)[.tvvr;|7xcK^z(:qsSL . - gy  Ai@Yf??޽ۧ: gg-Z.\?'EhFNε??s=wY&,ZHR⠱ jC'|rرcG={~4%'Pf͚WZzxm0Ē$144Mrj1 =@=zt۷oTh@87~800ϟoD---FH4jii 7xcXrHMC x=ܸiӦ|',[,ttt@:=H[$aŊ믏x Cl̘1ӯꪸk׮vڰ`$a`y'MӤ\.Zf ȩK/4z뭱m"'N|~ʕG?Ѯk&u|T*IT jSw^{b{{1-8d===q?+V1cY:=UI__HaÆi rɉ6 Yfů}k']vY9rQNA@viaq wh@zzz@>򑏄bh3qi&r9j5c@Nr) Wh@F;800/ u*JR*BZ5Լy† bWW1 88H'N|믏O8ȱaqԨQ h9rdX|y|^zaĈF!E$򯷷7}ݱ4<'$ K,UBwwQ$Ibh2"q . v[lmm5 M iw#< IDATchPЌ4Mrjz9m'OrKܲeK={A AT*IT jSG?h mx̅B>h?C ⠹i@]uU+!9qI'o}[q`` twwrD ڰtR8@IWWWz0w\@ +ˡVr(Ip7SO=U$D^ώ?pKB$T*IT jCmmmᮻ 3fa8Bwww6l~A K47n\{Ø1c[FDhѢ $I M@ x38ȷ3go}WKK1{NhZaqڵaʔ)&"8ȷ:+\s5;'4c=6>C. I@v4Mrj?-[&@]s @SI$\~qǎ3T*T*jj ȡn!tI"q-8Ƅ v mmmVI__HP[[[79U Νz9 .4OD ?f͚兂ǫTr?n߾=/"q_}}}ꫯ[]]]oaĈHI\Z3WN?t8@tQGw1VTRժ1 GbW9U^; .ַ̙3d&MӤO$rfԩo^n @׭[Ǝk s"qOr9,[,Zz @. |Zzu9sHN 7zaÆO}H4)ˡVrbԨQ+_Jhmm5J 6yuָ`c%I#R$R)TUc@N̝;7_EI uGm۶ٳgi/{wmU]e @%F(j8].@HMV؄g.KdҖejqثg!S3:(߰O x/a?ӹ~?oT(D E/|#"q4@Miɕ+7@C@ 0 \y啡!h:]]]o=H8H' V,@#T> 7l QD ]>0~x8N 1{ 7Z[[$RQX &7po~3DQd J 0o޼пcV*P.Mn} G}tԓ@w'VЯ_?cUE8* "q^xa1b^HO}S/@@s?j+8jF tMòevmg Dy :4}نfhp7Wvm7cuE8*d=0a„%8jҥ@&J+ec@iii /65!@,ZrGȴ8B MC 'NXj!*s!@b@(}نWb 3cƌ^{U,@5 PWmmm-[,lx8h>K,1U%@~|rꫯ;`8b640eʔ%8fŕӧH($VTB\64E.:::*gu!z)P(@( aĉKP qܶn[kCKK1Ĉ@@83@UPS _}9r16H4ٳgvکb 6@5dɒʞ{i .\h6@5V8 CEqT,Cww1 9v%qfm6ꫯ---Ruuurl Hְ`I`cP_~Sm! {9#48B  u' &@͟?rGg ӦM3YQhZ"q\[ou8C+`C PUG\tE{gC{{{xg~hR"q\r`qTҥKfmfH{.~Zȴ(h~"qL{wec@B̙3'lfc-@_ P]vY|  K/ӧ'|kG8* "q sy@Cr!z~}Qq8d9@ Q.BC@Bˡ3x(H'8H=#|X`,^_SN <k!H$@Ə_9S  +{QqGb1#  0&KC  &CG _T|(|C>X`y䑕vC@¼ꫡ#<^5B!P(@͝;@}6hРկ~0zpE>!5s0tPC+qٙgYvm  oӧ^3V"q83f̨XOFO? oF w8@DQ4 @ֈ@̝;@}r6l! !|0}tq8 dUQX ===::çY"@.bM{OJRC\6ɀŒ3~e >@v~`M{@QeqGBA$h֬YF ++t! z뭐h"qP_|> <@r`aƌHQHԩS+`}@vC@-_< DZ8U%3k,#^q|s9`wy8@DQ4 !1s̐I~n~-^B{hM;"88*P#F {g@xb#@uwwBnvq8T*E|>ec@tvvu`:;;+ᄏ!Azzz̙3w!PQq 88G uZhAJ8@DQ4 &^{M7@k5yJ{{!VX?p뭷P"qP @kuYg`ʕ ˖-()7D6:;;Z >Keƌ:[[H8`]x38#r~*@=X"r!'?׈u"7qGb1CPvm+T?/mmm͛7PG+W g˖-D+JQ>rPx8˂ &s 7|8@EO"P(@L2@ׯ_X`!N~0{p7zqN$c}1#;6lcUV>Z%p|O@:SujժpQGkVgZ%'˅[~'B8qbe6;͛L :D`L28B!F[jU?~8H88*Gq@aРAaܹZjU8cW_!@BTWT|(>4iR$@zheYzu?8qT(Dvy%XC pqjdc W]u8@DO }7i$#.8;vle7@R ÕW^!@ ԎH>1#.8;c]rXzu8·-x$S%7i$#.8 (̛7PeJ%|3 W\q &P{"q;'N _{Wƌc5q/ܫB8`Æ ƍX2mܹF*T*᳟l7E!@8bzzzn@@f?P%J%r).֢T*E|>ecZ?2[RSO=5\zpM$|8B k1a#BȬ#8P% . \rWMF 1D`ƏoBqfΜiE/ B&$8"q~;s0`!Ȣۯ2bCF:묳 @h,8oƍX8 5k`#}_ _׼hbq'mF@  fΜi_җy @H8bzzz@M0dͮZ3f!`}_{) R)\.Li@@̚5򕯄s9kAH8B @F@  k>`#8Ò%KH8 ƎkdĈ>׿/^ ԁHY6jԨ& 2󹜟\pA>'BS$HY6f̘i6@tvv / gy8@JEOI&@VF88 0E]8 /RL  DȢc 2bv3 _|q8ӽ H98 @ F^iE @48dv0@ dDGG\r%a…^d@@s +FmȀ(>cXKSO=5T*8#@ ;seԨQuXtiX`8@4'8nĈ&쳏`pI'd@@ ͢( [o˭&SL1wp'FW6@ 478lF08 g}~7p p&DHm&rmmm7|{ 8@ Hi4zh#d@@M2eKW^ye8H8bzzz@*lF08r46#d@@M4B‘GZB\H8B @9r2i6@M8d_>OF1xWEFH!8@  RlL͛'HN  RlҤIF ~sVq&@3kkk3@ @Yv 7^q'@2dH4h!2J  Ȫ#~mcNq @9rd $bȜnI^8ȑ#Qq)5|i[m!ȔgaΜ9ʕ+Ȗ8bzzz@S1b2J  &L++%?!XJKK2T*E|>ecxÆ 3@F Ԅ @f'_ע(2@q 8O  RjF ~_b(@ dH@  RJ ,կ~%68N  Rj„ F n0k֬l8DHM6%Bmحm&F 8kذaF(8y睟i_:̚5+6E 5DH"8Hwo~y@5r"q$@@v9HcV IDATx8bzzz@ dl m~߆1(J( F4h2J  vqG#wuWpT@qT(DhV#d@@ w}85#hq%2 [o!hzA[oHq%2cƌr~?Vܵ7Dh8r 2ohjӟ´i-8A  fѣ@w(@Poq%2lhJ6mkԃ@}%@=? RfF<aڴi׋POql8ꩵ$2q4x ttt\ꫯζ˹R8*TkkV)#@3yh(+JQ>rL.f 4@,0u/z}@Crq8 H52 4 E Fi8 #@5PKcdw c-Dw$c=8q8}+E$Ziii1@ [la'_D8lH#Gz'B{{{x 68-@@IOK;JjA$jjii1@9H6#8_Cgg8E>]P"qTt߁&H#GDygC{{{xg q<D#dl I}p/p$@qT,COO1 q4 EH{.hQ36W*|>131I  Eڌ@í=nh+GQPzi6@lFz)q8/|~DHM74?N*@DHaÆx饗ÓO>%M#s>l!C @ݽKaԩG("q8HC@ݽaԩGs@#4 % V$@"h,8`mRbذaFn^y~a/hZ+4H^NRB zY{衇hjQS7 oq)!@=ꫡ#<^H8` 8:t^{-L6M\ YDRcȐ!Ffx㍐/@jD"qlhmm55oӧOT D ۜf@oӧ{W D f@&@EO$Hd@@JPMoV8=e˹R@@8HX~'@EO488hmm5maƌ"\y@v8H 86CPq q48)!|p; 8Hl8p ˗/tP;8Hlhii1}fΜNq82'|y@z @}fΜn6Ȥ\ΕzHlsQ>X+JpdVL@QH#++V~x[z cNB$i6@Z~ع@/\2vaaٲepd{WHlhii1&w-c,_Wb4@b}ϋ(,M25s-nfF܈sn:s~ M6A @3qGF-jBEJs?oE9=}?y@#6 -yq  /0\. B]q0p׊B__1*`F(8 wuW/~!Γz8Y|>666TQn`s=k $!Pq6{  z(8.8/?Ԁ:ODF(P%-"'P>0@F*_~Rd F (8 _Jq81qP9"q'O  z!q8Quu@%1NQnB/^X,5H *)644>cSoo2m6T%Kœ9sUcccH8 d@@JJ%#Ԉ%KGpP<jRW.2m6@JԆG}4̙3G@ K$`>022br  ^zi, 7TH RB `b={^5$@L 8'mq)Q(0AVZ@yRE$m6@JE#LիWK.DH &H dl( F'xBL &^>\. zzzanRX,||'J jCSSSlhh}}}N#dl( FK.ڑcccHٳ6 %Ţg ַА1 N#dl5@=!ˉ@/8lHA#Ts=.8<\. Ȍ{'CCCF(|>.9Ld®]qq)188h2y饗BcccEkii1qiqhϷu0k֬+?E`۶mF@  -: !q D$DT 41a֬Y۷:k[KH8 yP, @@8pGoYflh۶mF *7zpy"q@Ҵ@@Z[[׾ ٔc. j޶mی@A  UϿp熮h ȮԴ͛7@@ on̙+F |>6665;{,!Joo۾}{8sOjYss@@Y3g<DZ%' @epXhFcq)c ٳCgg80.1^,jMss@@Ȝp9v_oc&Ԋް{n@@ݻ@ڵ+|_ mmmCc. &̫j>E  E!Lw^NX 뚚bCCC30!6nh>E  E B6zw3g vp|lll&@GHN#v8sNq8lD044^{5o8lϞ=a̙aǎ@e'T믿 @V]]]ap@Y486nh>C  e4{nhmmPq"q@lڴ|@@is8;e+|ra``@EŰiӦ+-RF Hp9焖_fUB__1knn|"Kp$8ikk3 { f p󱱱Q$(H822b zzzym&TT#'T@"2@bý۾jHPN_fH;wH?0444zC3 H;vHgy&l޼Y]M#1 Ν;$Ҍ3Լ|>s\0pBy#pLq)$$ӍTU ijj ? ---'8&8ڱcD $B>"qs\0pTk׮5K  ZZZ$@PM1F#enCn:|.8jƌF30O=T4K  ZZZbX48ӧO7P51F#ewg+W1HCvC3c #&' ~1H[HO?=L<@U{L#=att@@577HS$@p+W1H18 Mf*b_PNvZ8 |-_`R__e Nj*r;KV>iɒ%Tc'b޽@L6@"}F>V,?lE  嚛$@P-1ƯX('8{-x@wѰ IDATDSN5H=xb#0nq)ꫯHj1~ @9}_4Ba޽aڵ@@ʽ+P(HiӦH38@!KC0nq)woHSWYge  ?8 ظqD6m34֮]v-ȀM6H8 BXp8aq $͙gacrm^|h N2`Ϟ=@bՅN;@ϲPNq}J!8aqK/H)Sx$@d۾}Š+%8qa#2yd#4:묳poN@@F[.J%C1e#')N9C@FvKp2+Hɓ'88Lr -Zw%8Yq~z#1e#rꩧ M###3e!!q@c4P6z .]:::8Pq/ơ!C0yd#'@dSP ,0e#!aƍaʔ)FE ia~ȘkH8b&P>v cFFF7lJ  c֬YJ!7yd#'өjȘ%K;v8h2=曆j@P q@9 @ [o@@Y@;ӍT@PNq->`hkks@ d@_$@dG___[ @EdЖ-[ݻ 48bFF cw@EdPT W6PT@PN~3u]8Zr&T@PN;@6\СCb2^۷o7P&Mdr{7²e,PQqcYq@5$w5ׄbh*J  YL nOeٲeq߾}2A !b.,M O/6 q@!,X   q|w @e˖0| 8>+._@ @k  {.0<i B 1¡C @CCCCxw(q{.C!422.°yf$@`H8HR̙y$@ϟo  }ڰtR$@xeC'rM7;&,J%c&qoѡ' G5huu@^~.%I JW"Ak6|g  @i770 p6oޜnVC%G JOMMM|[JYI q 7_|@IґeY|ߎK&8p@\}mPX=޸ko`s'iӦT[[kd䳤w]]]`/~eA uק;w(  Z[[΋{WN6=.3{)L)9sf444@Y`=C?!|z衇b֬Y MMM.Pvw?n  jkkӟtzת@9`PŸK@n @~u]թX,%y_o @ݻ7Νz@s'A|zjC$ï!O6m`\uU@0jkkcƌiǎ.#쌅 FWW1\_򗣺:@Cb˖-ꫯ6+q0lguV\:72wuW5`dYqgFq8`H]wui͆r!%Aꫯ󣺺:8p _0K.cîPX= /M6lp'!ښ.20`߿?Ņ^^yq8x`X<+~c&%Ipi/]wI avt76q0ڢ:͛vq W!a!g͚5qꩧFmm opVY5\֭[g ` ]tQ|_L8$wv}}}q饗͛7R)*Wb1n喘:ujڰam0@ȅĂ Vo߾)h իWǔ)S+_Jڱch0ȵie ` ,CTUU… ۅ` @= .PqXjUq1SO 0s'P__>O޽{ 8UOOOq1yҗ~ia8 w(O>d:bϞ=DJ> @y[n%&L-J۶ms rF ϧ9s/l  <޽;n8k/^v) 9UaJMccc:쳳{'Mf=Kg`cٲevk(%ii|Ac@#QGGGԩSc֬YipPB(Ymmm\pAZr1PX=#GCCCTWWGeeeN=%ҫ]wu8J][[[Z*nxg`ŋ֭[gq衇xG(E]]]nݺXrew}(00b֦l͚5 I R7nիW~iQ~tfcҤIȭ֭uݷo_U``ijjJ3f̈;37oAP(\sO_>i(3qH.(]~8CV}}}7n?yg(cqXYEMMMzDz;3>xB`\sssE]]]O~k@#ŢEn-:(@* F-K/ESSS466ƶmb˖-ؘ  8ߞ}׿u{2R2@)---cǎhnnhjjصkWʲPm߾=͜93'?I}F2Q(0tuu޽{^{/{쉖ؽ{wڵ+Z[[S\Ȳ,jkkƍ+VĜ9se@ `xeYmmm===GGGGtttD{{{tttľ}޽{c޽74&0b?y饗ܹs_z(=X&S]]͆(Qb1:;;|x7s oeY,_<}YMMM\~R2 @q?@r'={E??njwiɒ%aARJF W(lٲ4y;(0  _waΝiѢE鬳ΊM6J\J@ Os΍-[JTEE88uuu3H^{mڵ PbRJF W X|y7n\={JDzŝl ===Q[[&L,YF ovXlYG?n8ȱ8$0|+^x(3w`uwwߞ> ēO>iF'pBv9dz1=zt{챆 7`әg>Oի00Įؼys,[@̜93OYa%-\0M81jjjb߾}F@ SSSSZti:SҒ%K(eL r=-[&M6:;; Pf gRuuuLW^yeL@NuttߞΝ&O_4 &%OwG>4eʔ馛⥗^2 #%f֭oL&LHgώe˖Ŏ; 0@|0-Y$}NSLKF}}}dYf $#֭[SMMM5kV:SkkP"`jiiI˗/OӘ1cRUUU,]4ꢧ@9Ua!544DMMMs1O~29sf̚5+O~r@ LGGGlذ!mذ!"";차z+7cƌ3f@Oq7GDDeeevg?~L>=> ` biݱ~~CPvgi'OI&ĉcԨQ q;ҒZZZ &dM4)&LƍѣG ]{\uv IDAT޳ضm[ڶm[YmvǏ?~|Ӹqbܸq1~7n\xqI'őGi@E mmm ?Nh:2N:館3fL;6ƎG6&P6a֖nRQcƌƎpܱs[?;8#8"EDqB@ [sLTTT|8jԨ8#xۿsaőGixڵk裏6@P6:::""ۗ`+x &8 8 8 8 8 8 8 8 8 8 8 8 8ZJ@@N@@N@@N@@N@@NTF3gN*ųvis=Clԩٳ>Clڴi3wlX ?,XP|3ڵk& 6|TUUeO<ӧg?xIK..5ke]V>;{G}s9#<{͛KW\qEb _,` %y={XtvgwyayP6}׻; (g)%#q9!q9!@YK) 8@n@@N@@N@e-drC  'rB R2!q 8 8 8ZJ@@NPRJF 7rB R2!q9!q 8ʚ@y"q 8oarC krC  'rB  'rB  'rB  'r0rC-ɳ3&R=2gw8</ I /d5jT*ųWUUeOC `>H-g=*a j?RO {(T@HB4>|*Zm`z9"qP3q^!`|@ q=);|pX  |^;t@9?Sw3 05 f dϱcǢB L @ g"TQǡ\.s{گ׻k&+CKg=TJT_]3S᳻}p߉[l \r ̼ h֭Q>>1<<}H Oq|3u4>>:::Olڴ)J%!g >+g /͛E2aQ>Bmmm"Y:3ڴi@&m۶ z8qPgmmm7e!ȼ\.:;;#%hkkB7o@={@海 !Xnd`@ VLioordpn`x !dJ>mmmBiaÆh||\27ڵ+R8dYT 6lX 8;q0o-8qdٶmJٳk׮W2Aq0CZZZD 8֭Ȥ8o!=L8!dNggg8vXUk׮9~xزe0 `J[2祗^ȴW_}5LYfM(JB$/@^Z N<6l <L8Az 3zzz»)dԩSA$q0r\X~dK/$@x .c!Ȅ0y`y({sѨC2Aq0^yP.-[DJ|lժU" BXvm0y`F7o/R$'VX8.W&@$s='ws護 L8H&&&a>|8GJ/94|>֬Y L8HŭBаP.X, @CZvm@$7>=_^0= !V^ @ٻwo쌔8=94 L8Hf!h8+V,!h(+V|^q K.R.òe˄8rJ!h(?Ei2 nݺGk:) IDATpvFth$v 48,[LoG;wxb a.]J^___XvLSO=%Ê+.V@$̇~Bz˖- BAIzg描 @ahh %` @-YDR-tR!Xrڣ>*T@$ڵk_R5ݻ7R`j@jر#lٲA8HR-Z$#0 Q{{҂ D*0 dɒƄ u>|Q___hjjr~@$>?J/FTyP .\8rᩧX +aѢEB@$؞={ @j,[, @e-Zt³>;)a BT , /YD\.oB@kiio.J| ^z饰g @ ̟?_z{{˗ @͛7O2qV#vU6o޼P* Z[[۝*3)P.C=$_D_"Ԁ8H˗Gy7æMFΝ$J[[[ Ԁ8H@s="PWWWs @̙3G%x';#7!֭[ EQt~5Ϛ5Kw}׌5i?J89G?Je~kfa֬YpoV*?e] ~=&7}PGӟW\?-6nԈ )R(ܹsSO=%qTzr>kJKDw3g\3nh,~kw=5(ˣ{Ofן0>>.3W^ oPC eJR`y'@}h@޽{'xB}^3gm&uqw!N @{BPs|Axᇍ$@n q@M;'t~@\sC> !ڢgyFj&p7R$ԑ8h .v)5VZ 3{졡!!K7|A3qb馛BbPu[n .3gT`;;3 -zg͛ hѢh֭BPUwygP ?q@fϞ=444$U͛g rC\غukx'b H__w}T7 uh…BPpud ?mܸQ*OfoH9sDa 2 \._WallL 7z7(\.\wu!c1]vyf {B0m7xc\@lܸ1ZhLYX ^{m( b 3 jQ{{Lʕ+êU fϞ8p@d޼yAHqРrL@[Hpׇr,sp0 lϞ=]w%6]@[..s/'1 nQssŋCSS4+ڶmٳݻ1 .puׅ18.R(5\r믿}Q a @=z4o~#U,UW]FGGh0^4{l!_2q,$8ȈիWGK,/{o V^-\.k&:? d 2w]{n!aw48/~h߾}bB@B r?ipȑpUWue1hC. ֯_>p` ck&q,@ pW Ȇ]vE7pvȑpWvJ%1 @… Ȱo={'@,_Vwww̛7/mڴI 5kVڵK <8JJJ@3={[o5Cq뭷Fccc|g~@?` Hof?~>|X <7|sڵ/>-[3fDSSy⥗^o}[)Ɉ8෪Lv8<rKsNf͊61rܺuoO]]]b@?a X?|Zpa:::bΜ9kذaC@9sfjooq3Ϥ??L&#@;3V^mE;wn>|X oĬY8YlY?fb䐞;cժU8&^|t]wEww9bӦM1cƌ251|bMsOputtܹs3qjժ4shmmYfMp j@u7lٲ88cܹ_8!'_L&ݳ٬{ޝc矏3geYfeoŊ1wܼկ~5ꫯٯl>3^xalذ댳}q]wWN3g?C pW̞=;83y'R{{{'|2Nv ` 8v~򓟤o1/'gϞ׾˗/w iӦ4y/)d2]wݕ:::"@p]6M2%6o,Xzu\}SiiСCqwC=٬ cnkI<K6(((HXÇcɒ%{vAƍꫯg}@p\tvvƟɟEEgg  ,%KA}t5Ė-[e˖ŴiRmmq8#KiӦEmmoĄ ⩧r a֭i驧{{7ym7kfqEEoo1y`@iiiEE[[ DŽ bٲe8hll,={vZhQ   w ttUWl61u[o>q t4qظq@1nܸx\رcGRqqq ;wdɒ-Nm۶k6G&Wzzz8 R]]q8(**J7pC >h|_zjwO@zzz(͘1#v!/TWW5\EEE&vJ7n\*))>Aw޸;{I͖/@S^~4vX%%%qצ7x;'im6AS^^cǎ]Ϻ;|.6m&M-|J6lHǏO#v7|s,X 566)|^aÆtW^A'NL6mΟ9tuuEQQQ4iR_^ 'Fiii\y_tw8j 93~ &ĺurREEE7.1 GɦMҴiҢEA g+1~XdIjmm8 yWU>}zZhQ߿_ 'ciǎl6K.M_~yAiiixGDڻwo,Z(TSS pLƇ.xr 8zzz4ƌz)8hjj\dI:ujlذAG1ztҔfEq@inn]dI4iR˂O?W\qE,Y$ ٫L̙۷o8***bرСCǜ8 omܸ1p jjj_=;ӻロkʕi̘1iqAgvw8 y2?>-^8'pTŋ_jzW\eeei%O]]]ۻw}wL4A0 QVV.* 444KSYYYd2@:x`ٟK/4JKKâݻc1f̘㏧l6+ pBC__#G>(..K.$?LQG]]]ZdIˢ,z{{E~Gaaa\~婬,yN4q@t¢4jԨXmmmQRRFUTTZZZD<{x4vXlYx⢋.J%%%T~abaaavQ_s(**.hqaaajnnU~;{K/xK/M?a8 #FGcc(0ݻ7cԨQ8566Ӯ]Ғ%K҈#IxXhQ\vef P8(]tE:Q`پ}{<1rTTT:$  ҈#رc(e2~7tS|+_IK.M}}}9@0 ?F,Xׯl6`˽' p---0]r% ***" HkkkŸqFz饗*@0 hQ^^N&N˖-arוW^ܻ~Gd2LgNW]uUEGG0z\pAZxqںua8 UUU{M#Gz(}Q Omݺ5,Y^xaZxqڼy]ǪI/Nw^ZhQTVVyQ^^1f̘ϩU o_{ /0Dyyy9宱cǦ" 𩴴ҥKSAAA+$8 -[Daaa\p% ,H&S8 IDAT) 体$hL&*++Seee{EwKāRUUeeecyOںuk*,,;wnv…q7)" ^<裏FuuuR |{M%%%1eʔwϏ>[8yx[S]]]O'x"8㌋̙}q-I'VM8֚"cժUW_>l6֭K֭}{1eʔc…1|pz駟Xn]f]sssҥKҥKs.X ㎘6mZ ;wƊ+bʕzjpe (˗˗ǠAbٳg7=z@)lٲ%V\nݺfEr^cccYyyyYyyyviq7f̙7tS\tEGW_}5VZ+V7|3` d2QUU(ƍ5kVԩSSO >=V^/BTTTDmm]@^쌊TQQ_|qvƌǙg)VmmmTVVFeeeKkUuTSS%%%qiԩS\?~| 4H$ڨ+Wƚ5kÇETVVeeeqI'ŤI7xcL6-&OC ~knݺXzuTVVݻ,` 8TYYsN뮋iӦŴi⪫ Edb+Ě5k_nڿ0e7֯_֯_ѣGgNӦMӧLj#"/[ok׮=2 k.p8h߾}''|2"" 'ON:5O&MO?](JOOOTWWǚ5kW^k.nll,SR^=:;g-<3~zuwv3;ٽ8;O}}}yy(+WF8qbL0!0aBuYbS2L;QUU7nJ|NrHkkk_F>1s̼|fnl6Og?6͚5+[QQ+bܹy}Μ9y/_3'Onذ!/>eʔ?Ssܹ3ܹ3>`F`,+"Fi㢣#n7oظqcTWW8F T__+WAe]?~|\yqWرccȑ1x`8f:;;coFMMrqh3xwߎ_WQ[[QUU~'|r|K_^|?.:txXSSS~ǎ;R6 3OtuuEuuu;s_|q5QF\~r)0MMMgϞؾ}{;.)zzz6~6?AwyqS/})=Hu| gϞx>?q}}ņ >9G]:s⬳Ί>;C 3DCCC444޽{c߾}sΨ={ݻc׮]],R >:kcvpذa1dȐ_cȐ!1t2dC___DsssFKKKFkkk466q#8p8 mڴc)guV^g}v :4<#> __bȐ!R38Cߡ=5ڢ9:tCESSS477Gccc۷/b%,T+FCCĆy3 I'gqFbС1x8NSO=5"ȯN=8rUsssd|WWWtvvFDDKKKE[[[DGGG>|ȯ舖@Ç>gqqJC^/|!N9~FkkktwwG{{{AgggeWW TԔO@'DsssmDԺ r8a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8q"g4h{f<3cdy]w3k`ݝݟ@#ӦML&gwvgwv>*x6l~f߷o_ <8/1&N<{}}}>&M置.oq<=/͟??ϟk1gwvgwv gy7a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8a  Gr8a  G/;w[cp_-10y8ڨAT ؤA*$gz'y^k`꺯n 8 B  8 B  8 ڎKM9w(V`fi6ʹZo:ϪoL/Zz}HF ۷odʿ>x`k:T|rr_|YΜ9OR~ȑrG֏?=kc޽33S̿RξT._{^>Ǐ>|0{]v...v޽2??r‚"Wj:B  8 B  8 B  8 B  8 B  8 B  8 B  8 B  8 B  8 B  8 B  8 ڎG(vlZfsw=k6vjg2g;Zk-iw]'C$ wݴ޽@ٓ}gRξRΞ=zv?rExQz{{g ۍߺu޹sbB  8 B  8 B  8 B  8 B  8 B  8 B  8 B  8 B  8 B  8 B  8 h;ft:ԳcDֹK)Z~r^[V;rkk+{#;lFd?={jV7v;֚33}0D&&&Vʿ~M9uTsMMM^xQg?zhnviS?~()w5=rҥ>;;[& f~7߿?wb\߿_Sx}}'&&R ^ @@qA!@@qA!@@qA!@@qA!@@qA!@@qA IDAT!@@qA!@@qA!@@qA!@@qA!@@qAv0::`ddhZGH{^tx7wp=WkM{v;dvVڝt:)go6ij#3 8"e}}::yds_]]-vjd)g>}J9#GZ٧J{ܹs)ٳٳg^}vܹ曆/Ǐ[> r}V?^766R.˾}7͛)ƍݻ)Ͻ땬oޑnݪw5anv.8?3t- W/&DH`9<QӰ 4&BH k 1rP.]<32!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  1ׯKZuf_,//}4}8}A;3LJξWܗ@&xo~Awf0 z߼y.`+};㮾W'ȃzϒQrӧOwɤd_~i_uɻ:N۫WJξ֪N[]]-yW>Uݙo^۷o .#GgϞ}g666mn~mɝ9vXٻ:~MSgYUok׮{?; q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B1p|muumeeW5 ʞx<.=nysFeȥ%? K&ox{f{ջ: J^6 Uw뵮JξW{X<8GN8vwwKoN*yeϽ^r*~ٮܹs;w䢿}փM&OӲKR7r4]]woS忛}Çm}}Wq/{E_9sU;;;?,F>|{eɝy捋|Mٻz֭Q矲ѣG˾3wstR?<|ު܊Qr7o[[[_rY._._\rg_޽[?v] @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B }ee=칯}oo|^u]gv}FvW5d2qW߱JU̻7ξTx69w{3 ö\V]z@8G?ޞ?^pG*~ԩ޽{W%>~ǏK_t=*9ٳgo;wڹsJ3_.Ο?_rߏ9o%gpBٻ%gn/^,yӧe;U='O=Ǐwk٫_Uvg^ݸq_r]r7wB!B  @@8q!B!B sQk3̴in\qHH'ML$u[8pnB(?nآv-H|_|+x;W @@8q!B!B  @@8q!B!B  @ / IDAT@8q!B!B  @@8q!B!b ۑ#GJ>Lʾ`0(+++egf[}#~}iiɍe;zewf8}N}4oFM鴽|juext:-[+׮]k.]U?>|XrK.uW\qsB!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!b/9{k]יf7`0hɤ~9rKKKmggpyT꛷t:mGgYٝY^^.{#GQ:Rr>Kߙ*`03_"oG3g*~ر.9O%g?~xc>Kv?C766٬=O޽ۊ{u޽矗 .tUw͛/(3{{{en[ڗ_~Y򷺵]~Vޙtjg 2!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  Ģ'Go?+>Wg_]]-;d23[^^.kkkewf:/^}8ղ7ʾx<.{ߗ̜ZXX(ooh4j [d6튳믿^.f7bwիWL&^777;w|O?Ծsʾ7ŋKݲ;s9888(=3N^նJV^ڶKޞ @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B,zx{UWVVʾt:mϟ?/9{k]י öxR{;s^~{W}2ݙhVWW}-,,}7/z-2o|rwa;{lǏ?~lC't!{U;SݟJ_~}?qDwߕɓݣG^u/W}ww7ng 2!B  @@8q!B!B  @@8q!B!B  @@8q!Bs?U[d'f1TP[NN,XBܓg&RJ!H-=`;+&Q397 y`eB!B  @@8q!B!B  @@8q!B1cppt:fii_g?t落Oٽwwȑ#+JϾY핽3n~z̦K㷰P͕}vvUn^<88@FQW}{{{LӧO7,e1婊U̽{.Tjz.--]4~~msofoo˗/~ΝM_|E{ҥfmmY[[|# X@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B88:Nsȑgz> fE˗/gϞ}nn>f;;;eVKϾÇKmےcn;OW}0[mϦ{.L@ ѨyZٷZ{Ǐf/^xFnݺ|'Sg?sL{{qFsْ{_YY){#wvv> ڇ8Fsђɓ?Xv*ZjZ|7͍7J˗/7_}Uߦŋ`:VA  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @#IDAT@8q!fNӼ[8{+n+> >ξLbٽOOOtݲw}̓Jݲ{_XX'СC)f0mzy۶-m`F?*ξVG}T6;ŋwf'?v'ڵkj￷ǎ8|V3ᰭzܹs%]3_.=sΝ?ooʕ+zɽ嗭Hѱ q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B1cppt:fyyi?ާmneL+{ߧ}'O3cիرc%egeL-kh42m[F>|L9;;[F.,,4&K h쳒w~+yɲw-SN?C?/9wׯ~eoz{E&cB!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @@8q!B!B  @;Q (ȌXVx:-<$2a<|,"xjmqqqqqqsX,f9nwvݰaߗ˥v;GV+ϻ};f|ޏ &y\ L4n_@¯ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""&z5x< v+0od!IENDB`mu-editor-1.0.2+dfsg/docs/swag/t-shirts/dnek.svg000066400000000000000000001304101341747546300214630ustar00rootroot00000000000000 dnek Created with Sketch. mu-editor-1.0.2+dfsg/docs/swag/t-shirts/philbin.png000066400000000000000000002647261341747546300221760ustar00rootroot00000000000000PNG  IHDR@bKGD pHYs\F\FCAtIMEYǂ IDATxye]׽6"l9i)(CC9Tوu2O@v:DzSiд2S*+J(Q9 "<] a |>V-^w}u&ɺjjjjjMujj}]ovZ[ޭ-,ދ[[sKWUok7Vl^Qmů]_]WP]+MeWm{Yb\^mL `Ima;ue]0ؑ\ﻨvܶ],~}ſT6UqYub.^7lfMuPun$m ֪[_oHl=2p_߬2>!м긬xm/hT2|`Z,4ph[ .9a`0b..A0|`0H6jo1nlD\W]"&+m]uA} w2;gN[:BuzX),}TxPu}s'VbK>08Z=,%vŖ˝0h{5L˺--tu3 -G%k1NL|[cV=a!Tl劆]맫.R e04\LGm `Z]0VD-`:V=:hx0~CCՇk0<LtA#=| fLwH7jnWW G"-KꌆAĿV+`yVGpuuf7 $>T]aMÆ#uj8jz_7 $.S 0|5UAã0u6U7 !ΨNccX}_ð*Y[Z}JmrQ{(uA1M_]m ps[.2lTG7 #\` `-To40lW-r Z%`ݧl8JXbWU7#R 0O yp@a=T R=VUeOul*`Bl/)X-,1|fŞc Lކ8zOÑMSf0p8ZՇ3*0MVn8J00.hDTL`R'U9uU;TL*`ݻzFu\jA%mW'W[`> Æ8%Q4truF5V ղP0l*%꟪Sӫ*VW*e] oDX1r۫:a*UqmA?VWX.rc09WC 2KX*{6 ^T=]%06Uz{uJ]euՓTzvJ`my#kT `GT3 oDZݨ`{>c: WwQ ̕˪w4jJbܖ7`u7.j [zXy=܆/V0|Zp!v9[S]o0pҳT,Me9c簆;~:etyuJ̇U?XXPu!R:`>ZWS*&# oCF%0{ `VzA: veO9 f̆C6pouS _VQ}U0 `z-TOlx9V TZڨ>0}^T:ꯪ?03oC1|vp=rxLo9>oC3|-m0O֨`mY:`>طzAu| u,/Toj82u2|ueOT`]UMչao7/Woxh~r+`b8 ,W/JΑLL `i8Z `z9 qlq$,9~x}0s\:`>4V3os7l#W>yvF;nۭzV`9ڠvi{[qQԯ.WnrPVwT-몯 ~ WN B֨%2_Au:Gc_ه^[{ӫ_V'߫ڬfnzZuB=`}bU2|`V-Tϩ^S=@L/TSyQfn u0z}u0+ Wϯ~:2_nO3|`]zUu7u0.~յ`Z>0^Z:X̘K?nD\fꕋ:ql@Au:L=TRs[`>0v~u0p12|`R-Tϩgu_u|ϫ`>0ߛ~;鼆켭ڤ&wvȹoTWj3|`Qq]цNQWOT,3_NWWT}/WP+ = X1ㆻ [yupתW`mů][p_Wo]uVsom/6|2jOudqHs [b8aqՃ_ կ7K;[o6w .Cܯlz0qܫZP.~z}u:^6`)]SW}-W_Ul^}Whxc⁋_; Xjo8T0|`{&i}az`M7m9!AvWVbm9:j:pY>`87$$|o^-_!6WoKu:KezaՁn YǪUSe껪ſC5m>pKOh8b顪n᪆AÖ!Yٹfnwtë;b:UlawG"UEmr/08$pѵK59`VXS̥o6%_5u`Q[0~g1ގcWT̍ 9F\ ,-oH<:jOܸo_g'qwA74|A-*X[}g7=ɂj`}(`>̗ߪ^Af7 g.>hI_{G7 $gSWs#0| +fƗ>T[ÅЎ5A ogQ=:T-03.~aY`=OmJ޷n7 wGxvvÇ> e0nx5ꀩ: 15ꨆ#SgsUՕ=yWƆ{>pGkppTXVN`ܷ)pA[ []]w08 jx`0v~:ZX_ox}ջ`ݥAē{&uTA`}U窆pJV}魈#;&竟NS2|^Wz*`b\fsveL5 2MXm/V`>LUwR>wJujuJ֞ccgUP j:tyx'Vͦ?w4 nd> 7J`՜]d1ULw[4oTn$O0_hiSU+nSתk0 &7Uߡ XQlxGMH=͈,2Xz*&ڿy +چޱWi8)^*e7\B&Ӫ7TwW,>1U.ZW=a.*erLr^ X6TNNnT dMÑLUϩX6'7 !.Qd0|U\Yp J{KV g|`o6R&}.>:9,wW csdj_u.VWo W솣 "`i\YzczX64 ?Q˶u00F,3U`e V:`m8`FݳhWߣiUA+`<0UNB:ý7OT?V}J`-T?[v:`\p ; 2:`lG&u,u-U wy([p/q oEngV/`|sERܮl4 `Gnx:zUa ՛nY_UoXwY:ҳ?ܮV/ ckU.`;,~ajuWTT*8am:-8r?ċ﫟.Q1|uTon8n # 8MuJ`"Y=zyemF wl0v~ڀ|avλ:fNnB\ gsj8PU@U7V0px5V L>X󢆷#5?Z}@,=6W?>[`60HDX::P-̪QAijUœ;za UT]7է~[u,6Ȑ Ղ?njܺVs]-; ^\] m3|uϬ*C\E up@u\sՃfc)`{Yq^'Ɔ7dO%eZo pUS=T̑+T`ܻeyzAu*W;2?92-`[_c%s> @UwFY$Vz(VI{1cC`=zku7U0㮨?CW?2.^R :!LG2<]F}be0W}FXzLQud5>$3ZՕ62c6':\Q0{5j+KV[;xKdFj/K`6|GI\\p`y|29ze0ݞ]]fs+3Z[>b(3+Yg${)"C'dvrCùreFޖ6d{Fuͫ@.oD`^Qf ߪfYL &V|s,koOʴzbe 0VLy0t% Sfo)S E62Źz{YKb!W5pі35vMLiP ,v^\}S49؈ʔ悆2حaqLi>PRX^W|f}†Xykٛ+գ-cN|j!׫a::^U,/>Dd)Ssg5OY~:U,oh]pHK|Ht qgeerFu s[}ͦR$_n:`:m{[\X=1wi7WW,[B4d2-VuBe 0.)[=-[msLC^[o̅}>Y~Lx>QÒ9;Ȥ `.ݩC([;$ o CeB`A&9Zl=>Y&4rLn>\nQ}Z&4g`^]d(s[gTeі(0랗 d2/e;Zk 7>[&)W/DY4Nh8GO&%W7\% ڻ+eygfźm6z2Ap9]-Oѝ2)9!ld!&+;eա&0MLH>V}e *zL!{s\XfY956s2J{G`6~]&gYrX`_]?j&9գ*a^=a(v:IG|rDV?T$Vo T,I`ܩS6lL)Ć7"e5sFuU]`&K:lm{|Y|zmd-Efȕ-E`fXV1j0^R6T?c+iTRRxCV_, Xn{Vo%__g^k=*je,;_Y|z%ݷzgY|%,{WْXn؆#I=7Js,?`#uܯ%Y\pȒ7j[Mdpͧ@`uݭ'(fu"Y|Ud93,cjyAu͐,cNl:zgYP=RjM,S.ixj%2L\o{,վLA5Y24^g IDAT#˔WO`Q}3,SN\0#ToɑeȆޖ̌u 'P'oZf0ns#ː> şWSjTYll8Ffn oAl,$K@JT%Y^0w]H8ly88fsj ֞ oAo$K-/|>o"KUOEOYI0_oizpuM,aNhip=7R,-x%+F|z,Wx]-'X~ϯ6|.ޖN &Ŗ,AvRYJ {v-dҮ ~Rj͆B>XRVɡտx6]-%X:?|6T'Tk,%`-TCٵYJ~j LzeLGU&-#y]0ڳB~2j\Yċى7ىfԺ$;_|)UY:xaugA<{YE6L]0gP}3@6W?m0~d3 ;t9gg @`$\p<ϊ ~ܲ`Wm_3۲W(ۙ[6̲d ۟W[6۴_ugGiϷlEϪn^#7V?gܮQ_A?gZ6̒}%-)e;rCu%,xRÅ^ N{1ϖ dfM]#]eu_xƔȵ,<7 !-CK}Z!ۓ˫[.LU-`B'Wi0V}7mb]EvPIt\߬6z*^pS|z;01MZr${\G},&}s&gugUX5k}SI`ҬUn#XTX ;˭dsjRW/>ym/9:߄Vr}BK`*<ֳJNDXIꛯtK?*EreKʭ䜆>wEr9`9P7\FUgL}.+̦l?{RjwUp P|%esiޣЦ5wopPZXck4޳ͣuگknoP]Q._ܭ^Vѥե]֚ѷ4j_=K/,5o5\F [P=0|sDuj*ʍ+P0Ƨ>yƣ5Z 5^_h|ޫuWU4}oӮ ~j7Uk>aUm3|CUV.S `?qn]~4zHR=)+էΩpNk o8p;:Pl[l upndKlsձxܨӞ>ƏY=c߿::Í79z{ `Ufn_Z=Lr2mӺy>uf/FWgt>猞{&{#UV>Q=Z `vkTѪ`+o^pTjܓFѸ};wfg3GO8݃%̯7[zFHOG*`[ϪU kTLX}qϧ4=Onj4uN;:M1:_U ^S*ʛ3m oTm~SUjcƍ4=T{ke\Ԩ<:gaC2 ''@կCp3ps/mVC5sw4y6q\~ՂV&¦}5:M>֙6fΓ/Z2l~?7_^ `bfN9vFjݴDn4>MG9 Q <:U`[V^ 7 > `O:nM\z g'unFjc}j`ܻWM‡̆O)|Sj7ZF=Fu5Tnm^8+'ߨxwz*.S3ݝ3T۫S';\}L~H{5gk|V-hYmOF50qpw |:T+̳=VUT?_9XqӞtH5?xp;6U oHi9Ysw\XukW? \] j:z*޸zMu*ԧh5z~.f]Q}k6ۦ9Oj`_^o'WχC̫/no7T?Z*2auA/l<4 J-,|ƟnO GO8'`y=j*ޟT?a]Y=:]J{[kܯVFոsM=M%ĆU<1|`]ZviLUmޣ]4„r5>t^=;Ձkg5\ G;b]0*4wM?hsa&G[|;%`=::TsӪ`>0/T}*Փ ,Ƨ=5~YF_>ht~7ۨkgFO~T7s;T18ỹ*S}sڿ RΫW֜e{}ṈTS\PuTu*ẽV/R\ ?XR㓎۽;\#k8ia|A6[k/w~q4jf)kYe̺V;T, ',tϩ߮5K 5:4j}mk= ٣ۆ _m50 e?P\-bnOlP;66`\VoԹq[pnzN8azBk7lsU,2|`V=joṶ?~v9v#jڀqmu~>۸k|^55=RnT^JṶ)*?`\}:Ts^]X}zZUx;ix}Ww'oRk0V}oUU0K 5{VWR\W*%Cִ5oVhf w~gk3GkyOF=Nq ouL0|`y>AU̥KX =m^h|4oaӹǧFGŪ`Hm;NJz̒^jKToS9F]+[-Cz`|*k_W5gz.X=z*]x'4n_[Fk<ݴytNm)^vӫP=T/ZL;?e^Zs}1[TKS]%` 7Zh|V튽>5z7tl1<GT43|`\}:DsYiv֥w7<+`CUs6}ttiP 7TܹzDUU0 f{TZzf>U;kŸUߥ `}:q4GOzG#MPGsT42|`z5 ~P=_~Z`BԮj95:6m>O]o 0U&Co^sK 駫?Tܹzj<v=O{Boj}Lo6>慏憏z07p;ިOﮊry꣪v]OݣFjA# Fh `G{CV=D|7~lӯW LyXΪ+_oxBU0- &.OߨT `GǍ:?ި߯06V׸3Կyjz!M *LLϟO?nmF㣴p37V>h|Zk?s7`*=atƆ; g㬪ǏΝAeq_TefR [4LvZZlErfPsK!@W@f~~PTP3sι1ow^=|\f(*/g)$m0Bs\WF!z("L"I+bSOIWJ4JCqb x+i{^LkHR͇P Ll?/BRa u(n@TpsⳜx)$m0|WJ[pSiI*"A;MI$)v%@ 5Epj%%YOSēB UqnZ p[t&ه:ˏJ$J27..k7c I[#LJi=$uyJFz1ERq:Z8aSH#ifYC:Ux[ȕ)xRHR۟xE HDn0]\J^SHaf)@_kHR43_ߣSoYoI4U@oS&>S(I>(iše I&>n߅Ba$)^[rэ!IH`:EE^^3w%IA8x3,IzGaƤr3BRi.ӥфk!IX)?I@)$(N2w&1jk HIiϛC:q@7SK͠$p8JLyBQ9i2!w IY'bDO!ʁ]MQ=lÉydkB; _ ^OMs҆?Dn6$?eȼe?l u&lkI}t/z)֐95]DߡK/BHRzRSd=DUuIv%Aw{^Mt IE 3?㡪CaTU%} |ry(UNL'ox0.6wf' $yD|UnNTp5COrku / a)2R`$qUID$iGk I*o0CB:Cs"~ oI$TW~ո$igw.*f,6$ϛ!&^|)ԱpRǻ/HySHڜp !I 55\MTKLSdޏ ͠~:ҩ͐ywM9D%N$i-! F)$ ʀMySA:`pe I*N$JԮ;xES!I6x1UK|S8|P{*Au)2k-p,F6nʬ!I@?W4$x@oSd#@)r&P;6x$mA*op IxJ4UZ ʦT3xQSdR 7ˀK,!Id ?㏦V ~9q?MBMCa J8xafp IJn+d Ij?_5CfMBko(3 ꊫ5$I ȤarSHT<VRSd^w̠BpB$^NS,6M!IJЯWaTϋ%i-&Ȥ ͠ Km\+)L!iSaj~E4kH-(=t$Uͦ$p#0j j7vȜTBқNqؿRKAZe:UyXGmeX3dTWf8?ΰ$)c. 3+oIjo!`K娵LɃ iS!1:B8qH4qjs3HT5i"DJ!I*D`ՠ !I+j3dY)fیOCL)Ӏ-Q|Q~&$H>?.*rTIj7ʎ^2Sws=q ia݉wA*<*y4=DAǀ!S^%^F6 mOOXC7Os IVK|RSdIă%i\vId@Sd:`)$mU{!If%-*zjYx|ЖD/p%$mp.hK͐)0B _/!Iһ~r+$-͐)OATJ TvM@KHէЏQV`4f[HRL"3烈o m;V%p%s7w ul$m'辬v$moB5Ef~E|]Qz՗̐ˀSSHzHf$[BVoBڤz2Sd͠M9|Цih"^jSH(̪؃ ($I҇(3HR->]v\ mmAN3H(̮Jigu IDAT@?kH 3ˏ6$lb3dFW@)/̐3S$Imœq^\~ʆϛAA!31B !֐$`d Iq0 -`w3(2Aw1E&L!iP]q)%Ij3Bn3_6$ Sd= xyCV4MK,!IR{|ʾkI*%)@)2(\yCq<6E&| 6 3&K.w?$|ن  x;u8xȊA&¬c$uuZ7!n@}PćH&(ZN4C&oc0g\.v$IbOV T0n@if(N.T>YӒ&TUs-!IR]$Pg ``)w>}76t$uƇ0 7$C?n8|(>'_V} 6 3& ,!IR'H8T0lL0._F*&}'LzAF钟 `R/ iPu`rkHj>fUB fHK͐}~> Si$p0Pg Ia=vUILifrz)$`zo\j ~NMЗp IRҍ7:I6?ә擛m[^v.0 6 3&D.$Ia# I$I3xls]C/L i0~JYCTWA fH̐M@?3 M!$IJGBU呆 v} 7Φj3Z gϘBF<'$)euѩB j40"Xf|ȞfH|6}cQt%$IJWs$Yp=uMeÇ*RfQ:'Qf5$IJ0c;HR݂_MEf2R+ff%v$IܥfvE?fHo!;![*͐Z8YSH(TUC,?%IʌqQycM8zNi8x0sb__A,NT%3HRX ">Ge]Ç?%HoAқ.?v4$IP}3HR U _O^ bԺ$m*̜4™$(t $\mmr9 4m!$]j%0Xa)5Aj}7T;*]I*\i3-亴uJK@PB~}CChҌDDGaθ6C yo4yC#CZ@<|ׅY$ih"2o]@i_( .xs^-u\ -\jiWA͍YfH`)RvtcT>gwG"WWo I@Ĭ{=֐=*g(듐7hx ?7׽1h^ f?mreFo_j Ij=9nHS߮L!A[ͬ<b UzOMJ5M/{֐}8 ;%Zji-45Ox@,OMk)$\\eTzp˔·t*jp$M($m|7.tn3-ki`bu\ }}[(0n~L6F_.5E:xCzL_@7S`oSHT1i4SeIψ7&Z%6#6-Ѵ&(5 74CHRgi yS]Wd3MfVafōβ$B`[m|[X ZBp-y} w;$͐J>ds0C*dIof8<7:ɕO@ηѶk:X֯tZֿ&tyqӯ7$[S̐JG!3JQe{.7gd·ړx2D 6&1R/[C tJPjz?6Ob?F@|1SHRTҴigvr]-kz(9T8`ʠZ!DZhi:hY%6Z9ʺ$pDy=L,=<cM<$f3γJڢP]~D_$Pv< J٢?h[Exp\ss]Es@Hbȉu~ÔG'.IՓx%ѦH!Y>$O`03w+,!I6{ 7l^?9vio=_Մј}%"Uv֛"9>$υfH+A; w؃kpY=I*>0 pYC%^k⟦M- cCGјJ7ΐmfH DWBxd,@ScA8Y.BUDKHR;zu _ M5o 'k%>AAÇT>ɕES>#ަHKf5E28|H!UCg3˿B$#adhi5o9ѼfkiZwcVE %7F%I[0PfTquqÉ7,nT$m~uN$͎gBi[(Z%lsbCN.oL`0fvX#Ioӧx8DWQ⍌2Cs rHHすf<~۾s1C꜃I~^Qֽ WAj7>Eu^ (,lIzxSs mT 0 YdI@kh>aaoӺFRMn2C nNiTx}8IjkI,O@JnPJX0`FI$+W̐*cб>t+wKY MYjb)aea Q&m(.7Crб!5` Im9|N{nEvo!(̟^OaKM"))`)Rc :Çm;M.5چFNT I} ua߇mI R)8|8̐ @l Iyh*QQZ2,vSXvs/HJ+g̐'c8|8).ms &$u0Pt.%DamUa߆ӺDR4!Uecm=3H* íT+>J _%%LfHcc>t Ki)%3H*w>HRk^^~]‚i_7< q%>͐_^1Š>HR̳!0ڲxHJW3CjT}9|hS͐sAREQ#HR.RLW?mA$u!5ʸfH JR.6$7A";HY/qk "RZbVir3HjuO@1W y.-mId33@ڇÇs&RUfn"ʌ I QAW鷇3$u/!v>l}tn, ڍw>HRn8;#^ fN2 qx>O;![ ]y$%KK/IE3i sH@f!v"^F_1C*4AR$%(p)4T{=*fԡdIJ6{xjQ?)$͐xCO>]7͋|ARG"Tuq%I a'hqpcHjˁK͐ _m>fHyK.IRgIJZh\fIOa]cM!\HR-E]h v3Z 7bq:%W͐x/5NXoIJ8YWss 1x w ^Gooi)fH/ufr4$%\jhZ elmRS@ss|^SSG~^~`гG7qޭkwJiI={ЧWJJѩ"zҲ0с'DR7H݁6pК af IP9|(6Waي,}m5WaVyӟYuԯkdmm=uhjnߵKY)={t_^tօݻүO/7ه0o/~}]]+WXaLET.4E}+ma۝ mĻ7I :K-IRa1g k`Wx,~q)7򲕼tVf}Ssjf֯e՚mޭ  ` 4 dl?x 3rtλwGBRݦHz#8L$)Gc-!II?;`ِno/ijyjaKxeFCψ1b6; fC5bF GFz(ART!ۅ[xmmt+Z}yꊿPTa$nI}3O,`%,~ifQPm?x Gc=rGn۳.;`""NƔ+CR<+$$ [Qm p\3HJPU">f IJ^cape+<$sÏ={-h <=njd#^s=vWLMyL4%$6C [; ^KZ` )$%I%$)r]a[tkyqKKW%r;#Ƽ1}wUFS[|%0`>v8ޝlMxd87ºWp[tԧd~#Lg=4-^_|`WXnCCw݉͸Fs6x@ e4}nNFW".ƥ[e7I gz ԙBR҄ʯ+,!I)xQKK}[Vϋfo^i^ch32|@4j>ڨCM|`O)SG /!> yTR]y>,!I)ѥ?  3z:?{wHk Çn_4u5=OYF?5C8 Ѩw=bz p9IfV|o,!I)PmbZwLE1l5#`>cڥ, oV%HF`g⥲w/!N2 U'7KHRl7x g>ṃ%oԵK=w}ۿkjSލq{ps3_ehT >+}͐hawH4; ,"6$ B4"vjT?T7g(bl׿a`> ЗzӻgzFYi){v{"E.(o۫fH[Zk`՚jzjX55u*\Vʲ,_M~]FQvq{pp̡1tPABR`Z\noK&xGW!p0f5|̱OQrA{-'$ jZ hq-9؝x3pIJ0~45$#UkX,[e+Vkxu*^|5 8e"G͛Ux뛚yE<37I}tE_G9p/>PqxW*F?5Cb=OD6a&3̐X ķ3d Ii+^YBR$W #ρduYSSzԳzm ֳzm־?K~ I3d|b$p#lxWq#O/-K@.q{2=2pv2p[U3"M/5O͛ke3HJP]8%$)]gW.lx.xh0q}:Ѡ}9S8(쩅/0Gw.>ק1r=N<`+*hL}Hj_0CbUfx3o/KIZ``)$Ip%$)]n>n!w|SSܙ'ѻgwL}C#x~nC\]1j0{~}> gKЭo4a:}Im?_3 oGCfHKf6afş|.!c'Ssyhniau},_&#{םXs49vّ~}znoDFr?!rʽe}EHz_7CbvHUw=6 At%$)]ֵ4`g]OsjȨff;uw~8K3U]]?;osyu&T %a)Q"Vb78 57n7іtR㎇Fct8_V˱9H?DF0^]Q/r{@%v+I[ᒾ(@)b@/S$ҫ((TG>?bCtҒ~tyZ$.nq_1lwKڂ^Bi-01,<$8xOkFt:|Fa}C;=/_sзw,?50g^1Cb0j;< 5E"-x 3&O %$)}jd} Hcvځ~q)cvzv08NIzn7E"v#^yCl22ے`m3$x3xFU k>l Iiܟ.tU N:PҵKYQ.@TCR/&/+YN5KɯH.׏Pҗߞ]] ڑ( "н­\]7{n]4d顽JEI 9eS{*yὨ9|?ȟEb}$eBuE=Iʊ\¹OijvBG8(i+!K=c?mB9r|pyq[9O/|! "j-$mf3$ZMv\Nz %rpIJn]r1! S!{11'e8Q5N$={1'*QI[ 3$RbPÇR\nIR愗m I5nL_#L.! 74UyT4jDGDc'ؗ(?ݛXݹorisWh5$m|1&o6y wHARlXGrfg@ Dwep4hei{Ѩs1GAnohVV^k%%9~zgWN룾sHz5C"&/ AR&E I)6nL#G~p1%%9aL4h+RpFOz"U~!M⬼xy1Ζe-xCubLuH O]|4w>z[(oPVZ(:+Ug4ra֞hL=,6DQcӧ?2/LZC|~,2C"/Wtu9@R]4AR&E% I)֭Kvtدݳ{J#p;FC ѕW1c:Õ5r$A]3$#8x1^k%&)$eKěIRjZu♋U_dSH|x"-%JR1XdIJ;ԋ[k!cI_K.ht}&.0Jo]+'i+\,7C"SLÁJ_߉t5PoIq-6$WYiĨa= + hI3}&"]q1_#>o^p#Of}I u͐Hlw$JR,6$K/m_}9hLC>[yx3Jrϧѽ+8iu]XֺXe)*[,ÇL_ۉC ߇Ι={9'D4t?;d<-˼ˉ8(mme #Y.&E~χ{681JrUp!Y*3X|ZCIMu5]K;v6VhuھBnm.I1"6.C}9{1HXM%)ZeE*ZZש#ݍ[/ wlvy_scdRdƎ]g.hljr'ݓvݖ( 怿س$Y`~r/> ZqcTbv뗥ɻ]~/i:oɻMS,'FC~]=4=jv)8{VR= ` )˽)p2I-5IJ2/0\дhؔ+Edtg=zК 8$ '͕st?p1HhC[V6#g3_MCKn9Վ\|Ѩ ˉ8%MmjĦ!5'N7IꠛCpx,sS#T $)֯L[2hj,97:l bN6 ;riDæ\AOOK{G $|^$@6Z|p0-,gbe6?/6UU9_`d65ihj^Chj_GRMCpvr->Ml$ v%IJUeVv~Ks19=B92QtfN\Zf/ ֞ݻ5t㠉93Gq.H* p1g O92`n4׀Ayg1HRzW93GqM0ѹ:OcΡ<2>;pBgΦKy{,Rdg|P_O /FRlAp}r0l y cwDs@R̊ll`&4ǯY.7s_4lvPnkCm-E;,ׇ Q$@2 _No܊j`1H1IJe>~>>v՚@Ǔv؀.ǰI顶7_|ZsqIE6s|9r*>t\#z0IJܺ|[=]u0k\n Mr//~~7Nl}bn8s$qPNŇCgPn7Ig Ii9^ŇN5LvbeKQMN~5˯(%(FAץsTpTDR &/Wcf->HRKF=pq`$ZJ.v=`?Ca\5z>yԔvt] Jπ3ò0H>dA c6yvavH*ȏ)eR9r51HRk->H4aǭ|̫o,ckKy--n 9,y NGQ7?{TnyWH*g) شr(>tx3Ij\ZQY#ҵ=0@ iZn 5?: l;jXTmmTB'i/>tq6cV?U>fڟe ;n$3O7dGWCi>Z U# J&Qc1@m@ڋMà Iv$)X;mEy(zEεގO}pr!JF~i~i/>RX.1Ij3īMBmg=T(ezrC!4c{/>,6=d4%qŇ\.gu<8rr!h琔.h`k]P7Ij8cAR4UŇwcnAr8f?kMMe;'ye:ح3bȀ#vI q/,Rye>p1HR;=} $)mOS6m9M]E=>d߲G8}w+p0;$%f`1ej*ox_i o$#&!Ii{l;}Õ7ޝ\#VASwG1ɻ:ju oX $÷v.$IiS!{>4q|Y58B,{Cp S莜[HJЅc`5:ŇXl ȑIJl|)y ;P]Uզc>Khg>O%T?f8bʮECcHJЫԍgRgAHR8A%2v5ֳsΙ)Jecre{X;CR T UV|c>p1HR,Xnz*KMl_--Sċkc@:8 l^ˮ!)An<.ijp7Ѵ$Dte-&!I)|褝dڶז2$~EuviHE/cҮ:kHJO'Ui*>Tڿ$f$DKŽ~cm>KqR5S5k;;|I8ARx:,GUiil`\MKRa$)5+m}m>g3癅mhŇi, ^u,. lƏ.b_5$%̍+-MSa}+(n8#IrHRJd+pؤ]nۗ87MmMTcޭM. Ip0,Yz)-ŇN`n7I*#Ϛ$@|hڅɻmqVZ]ʦG<{v5vyϽ ~$w[܆F9/7a˃$0SwѴ$K/IRTW;3.[%WZf33vԔd%8k:X[ͦrq';tXihhZnƎOÍ%t= I)PŇڑݻ/8.wjyv{7MF喯\U%wk`LDR x:,/OCKA$]Nl宄RS]q}ãO?.]Csav֔J IDAT[|7[+:|wC6[a\KBa9~_4e7b4o$Iq/O5(|kG)QC/ sV% )$ 3 Ñ`0I*wD fj1#|ܬY1c)Y^j p1iRARPn1`L }G7⋸$)`5̀ѯ^ߧ3R =mKzcN^ͥhrDRH?!SoLC/> ؏$'n˭ Imwo7 >t)ezT#${+ȹo[|p1HREnx Xhj{ЩOMҮcKK@%W*tzB9D_VdARp2`=~r?$RtHR!rr;NTW}l[斢J xY=-f]nɀ>%*BFI!r0GRŇ7V I $)@._j;fZ`gn/k}K vz=ER.VC:!rc^}o$x ܮy]<1b7oxuCJZjo/sσO29WU6[烤0-4`;jl S$Ģ &f$bv9r^J%bW)PbD|~_8z5w+MadAR/ 7W}M7Ax$) .$IAv}vSu^\э:]'wPb]!] !6,K.b g ѵZ@ "s؀}؞rwI7*^0cR`ZjK.]V/ܟ=ە$_% C,>d~P$)Ѿ/n3 I DAf:qq)Ppw:E_r鼋bs/|;$ XŇ] zD/$9}b%1lJ 6IJXM3T՛.3Q~垇Yk\L=벟*"&E^?V|7 Ia8WKaX L3IJ| LByGړ-oy/w]?Ϟ]UJVllj? •Rc a.A+dϿ^EhZ쇤e-WY˧u.q\?|o6k'I:p1a0uP `H0.2I D= I jJNڙGoޮc,\ZFߊ_VUJfu X1_G;O/x`竮œs饀nBjLpKABm]eAeя~B[|%_oٴ~iW(!Q# ^䧿!{>^;IڸbcBP>T|la4`1HR {_<$$)!]AVLyLnj1{ټ7*V<][Z8?cu;gN?yOZc504ƄT|8̾$,CTwsɥv7N$m#{˖,VӚhYsP ocn8?եz詂K?Yz7`AHŇCAx$)0QfNc'ܮc[/s(:&^0soR \E*W]|󤣼vzP3J"Ӏ1HR`r׫T<մp)1E _1~v{/$aSBiHOa>1HRy"2I*-͠>{~l5bp}m24.O8ƫT$MK~ X_|\|=gmM5")I0x{Ň`/C I"bb2 I*SJwoPrw>o󋋊8 3}WΟ1_*|b>V'cr^@Ijˌ I7"@!J/IA?!HRt+i?ߋCW2Ug*-˂k7!Xח'UێW?qP:04;'݈.GL%)h$B3tao~}z89_؜gԺx$-zkWI>yS3MD4--9OY+=omM5UAY->n#I?{'I%u D@<ֆz.}8ƛˋI ZKTnU^VGk!V8?0?Y~Q7"JRaL3 T|a y I[}$Ⱥn/@h;z wYv]Z}%{^֋iY5^D\g?&>u/㸠1d罈TXOC$I\r) n#I)t[Rb=uۚC5wk?8(j^7 'v\\FFϛmև^Wˈc\ukQwC}W 뼐Tx7!$n^p%IJT,M;8D8?ұ/_rխ|)b+Po$o bƅc_?\Aϛf9`Đ^HI*KX=O] Iy̷ IP[C }'㼋3/ Kt/gCأX^'NE gq^HI*YƐ:(d%pHR Iд#DYs(ښjz7w~}ɵ埰vb5 VVϿqWۑ9׎%0#q--|_pY(JO?ijgHZr#Bb>$Y|uO$)E"Tp@搀͇3>m3Yju=gWqL<fW1^ůGNf=|>OJCOꅓ*>l luO@ImI*[J߇ۻyoҷfxgųgWW 3` 9em>¶};('CKYacHܦ@"ߴIKa$)mOم I8:?AOamyyI?"ַ}LwӯXxd8)>4މyA=7,<*ǏO^5 /eooF2֬]W{(_;_}dg119\..fӛ!xWמ y}EDbgrdļ~jOJ8dJ>.%&6Z'j!0B'aʃhv>9:Ho;o)lRD?V09 )LB65b>Q]^_ᇿ]q3֯/{ٽ+&{ۺLn!>e?$\xktoO{w>p1HRJAo2gJR4n =0~yvlS>z g~#4v)^10s!0D#ؕxǀ|Rvf8tYF7~$_1mJ~r@Ip+qn1IJ3SḆ&!ImT Ϧw^s©o,l['ͧNT-d(h~ϕ"C~ hrG]{Ἃ檛%Wd?5u ~Tه⃤0 RXzXog9q%6B,R%/񯢜>|q{$1[<%Lf-#Wu>auL.]ٜ&ElJ~<3% Kg?$;x2 lT&Hԥ1zRb8Q>n gNLB輩YTKKO\.x_<7_<`>y:&uD,#A:1+7Ր8n&t"D7S=\-7%o U,1|󤣨ʖ2j$Cɯdm~?a\!׹{ql-_X[5/a~($)}flH$YIJL&Cd|퓇ӳ{W>_h̸c63MunLiL"(z'翐x:r?—N8g;HRZ H~e%g"RP;u^D}o4\FÀ,ͼOym鲒nv~K={2Cɤt xl.asxn8yI Էo\vIR91$j ) i"$tƤd5 IZw84E{qʏkCS.r8[n6 ^x/Y`A}*x4O_`!%݀;"Zvi/gƒ$l[9s bP^qY|釿ח\Hxs9zz߻ܭmFn٤/߻F:쵗\ŢW7Yƛ,~m) _yg.Ң׊DUuWNXjumzm2nan }wmj ]wuֳ|eoi+Y|%+Wa5ew-k}9d疤u68/R-݀WOJ8>c:uLBdAeYT ~0R$p{q)2x@o?]Tv2D'CQ2%x#{b!iK IeGCĈ!ҳ8Oй@F>y7'_ I^5cHT}\Ju8H%IeN e#M}aQ+'Ɯ.七} ĝp?eȡ D*K 0WR&z~T~$edha{7s_?|7@D7a,n$9^{χ^DzKBG|Ô&(rE/1 }\./b %V_׉_<6۴=$b\?2UE~{{ w7$o+LMBD|=}wxg ȶl0;t"'ݻ5$^ErwkX/Pn^9Ie$Ulg{4 8؃&ṕ{p]છaS }z6q{p!{1f"Iژ]IqaW_5I*Kk@Rũ}W(gmgmY\|\8m&O{pa`ߞ7a#wCU4$Ir-=cHTQ`C^Z`1HRo2 g*F]/dBEsσOr7sͳX5Lv[=DZPԛ>|T"3@o`I1N^̙zH$loѢı9H DŽ&R3cF}>[㦻Y2wĝ0amh$uT N0DNU8Ň~TrqiI(ANm;Pɍ o7>}_[uϝcփOԂKval;j(;o7]ES.v IR1\ŇJxK($7;LBRB)P* ϛoއfփO1'9ƲԽ*ȡl/8 ˋM.I*{1Gu.̇V^D݉I*'Q7TjzBe] nXז.c3 yj yv!O/x3/ªnڅ~߻MaMl6؛*/$)IˀYnF1@='.]N@떨@XZAR99 "'.?cF-[ů7XR^}MVZÚx[²+Yf-VS-jˠjPOc4vLS.ݻ60ON=I%IIv|:T<ThV$L4OfN` Cu]cHԮX|P+N~ I$)|5kr$I4_~57SLY z% g $I []GC$I*zvcHԎabv:yuH$)hU h$Ixf:xEhK.%$IsdΒ$I3C+po!O)R#y Id{I$BcHT ]|N$Ia0%Iu$j \/(ta)Q&Ipd=a_v6I$}5Yz\JVBI$!]6I$}WtIޮ*A< b $IJTm/4fA$IxUB|pd95I$IB8h<$IV7#!1;$$IQi~C鮣-H*A0h豧I$to IDATK'k T7(̇Q@%1{A*3$Nuw+mb$I*p߇$uOwD*>$rcJӒ-[Ma H$T"1(@P.C$I'r惤yg3ACI$*ȞU!5F~%I /S@!I$%NcHLAV:*D3#11p1HRq惤BH6C$IIVu$(>lGfP$U,"p>$IB 0*jY9I!.,T,>H:o/:4$IBt'4~@*.IjACmo$IRN0txCy|%I⃤ Itq3Yzyx$"Y| o$]8$I&󁗀~F@ $v#_7OA#$IV2D9AG.,IR%j0I3b; $Iduh.mo~$I%z]9HouiG $I*'&+XO̫ I*@<$I*_KnFwПJ]#OTrQgA$IL~t?HD//r{Ha'# TAP,$IT fa!II0uHR"]*Q4΢$I*=VuE1HRs Rp$I*}C3FvNOˌA*T5T,:H$Ipz.0(:@{ sOS$.n8-1$I݇ŇltNU$a$U(`R[x$I[|p%?lQ|H h:1 I$i5Dfl:9njA*X5Ru MnYH$I05ḊyXg T@JN}3$I:kqFvy̖IRŋ{B5дN$I^,>$ek 6:wbAlRtnc~D$Ivr\49Sm9=\C&IJVH);B-,:H$IhFS⃛M'g 1HRs%)dQ t j$I cmg>=Ip{ta5&!( #Ig;$ITGb~`Q$ubA*]ss~KR8&Cu7$I>,>$e۶\!$ki&1)B]$ITl&XZ|ڌ5$Uѝ1HͻBMB$I* Qm曘WA*\K D)I*h I$b%cH̨|iy$ID|R)tB$IJC@?cHDm->la~$I/n6jy7,$I=k (ja&a#$AT2m,tW(1 wQ|!Hp49E[vi|Ikb94f!o2I 8Nn@!9ˀ I7z ]bI$I <`9(1V20!IcR1D I$-S$Iy1}]uI*s 2 I$)C",>7Q$O;"KIHAQqH$IxirZBŇtp$ L  NB$IJKS̀ߴLzqc$q " t *$I zh GibV$ r@lw I$*`1$f\r)9N!$پ S  t,$IirZ?Ds} AjL~CAUqH$IMӪzAU!O Iz[KR[ddh$IRe#$NKTzNv$ITvrZRk]晈WA@.Iut~V0*I$)^!?v(JnP?j@dx$IKrkch $IRExzbDkчqɥ͙l<ڃ>@)eB$IL&C,2I&ƭy\H$Il!&(JCt79&ª$?`Cu[1ƒ$Ix {V|pCr\Ltw1I$IKtci!\$Iǃ Av}gs$I^&gb'Ig>5$I$7h~h$IQ1 Um, 3D7IVmҊRy94n$I>3*cH3R);Kqn!"u&Bd$I>Pc hwg~p$Q@/~$I$|_ninO{qI{[6UDUf!I$5OMF|b6V\pɥ@YH$Ij-}->iH!2zf!I$-Ab|_X|OL~vI6U6I$Imf!9XGW IgoW 3 u9H$IjcHŇJ'IךI*_U]K$I> m.>d斈F Iaf^S ($I$u_N ԚIR2CPYk:5I$I嗺蹡3KӃ$IG Aet$I$`=჊$)qn3CPYk2fTX#$I `=~H$I!"*OM3$Ijr,>25c$M61 m[sPv[!H$`1$eRͦ%IQP k*;=vm*K$#HnyĊ85H-O䭦Rr+f$Is|5mZvə~8$II,>dtZә$Is|5.>dCxlsP:uZoA$)|&?5lp35?E|PyY1ZVҩj.I$d=v%?00ZX9(V|$I †)k Iom*;o> -kAS]gA$)|-Ɛ S"$+r%g?(2]vI$)|끗!0H~*co>Ϻ3$I#HDf>X|C!IJ\4 T4ʺ$IRJ%djN$%-b CPYsfm.I$_N.$=-@eJ*g>H$e@_sJ9IuSj]Rs$cA$)%gMFWox/PeN"'IʫFXJ-.$I&?PA~($IT1T;A$)~u m>X ,6IUg?(-29g>H$+:cHD_d9c$Y|PeqҠ=$Irl hp*$?hKCPEq %I%CO IJN|݀&.ʺ$IRzedIR֬ B .I$_N.a$+A Y$Iᗽ̇Y|$Y|P%˭eԒs%Ip5d%Nlo>d|$IJ[_++e{O"^2IF*ZnM~%)4.I$B#HDO޳{݁*)#6$I}LB e$IRd1Cq@t2^$(K8Av$IRC"!?TI-2IRMKZ`!#=$IRqdX|b#$Eۙ5p$IR8wWXr%?`zp$IR8 |i.~$IɈgLlj{ֺE|$IJ]K~$IAdAH"IYbxw.%$ `H"[|$IJ7N|pC2,>Hpii# .$I.&c.0?|>ďi]$IJ]e%N _7'0$pe,>H$Ňdt{\HuC9AA]$IJ]$wnjs)U[ I. jg>H$R`1\n񡛙$$ ͦȭe$IR ,1DtIsIDg-;>L3>F 1q.NO^9 $Nǹqrsc6Džb,$ڨ74IQ3s~yy9eZkZoWԞt?PFe%2V%9Q0CS(C@?2Z!Ň(bn~`t?PBm>]ER|X-"v*=l~ue%KEv@Uݷ' 9M:AE(>ƫ/Hv9ŏkk>!eR|X)"T'&9^pgR袪6@Q|(ce%ljzp4t?Mi2Ld,MџM~K:+@Yp:#;@>u>!eX@Yy28MЇW "(´Kv~J|E$s@]n|?_P|(}d9'I%K ̳V|+L]M2%jU!̷*]?I+>,|ݵGMVZ0voLq90?jz [dd,%F;C0:ɞ;|Q|Oe,ie NʴK}z ",.k~`>u>)ߗX烝.|a+ '}z "t>O ꜜ̓H̱ڴK}jCADPU˔K0vov:AaڥFDP`~`?MЧÖa%;=W)>@7~`.uj.'e|(H@c'@sj|OaP@cU-{6&n}8l: RqhcE]25Kښ}8l:ZEosA?-cC9}!@uF\|vv ?-ôK4PwSg$vj\@2[i RqhI*A@uFR|+q 7&ZPYJѨk.'e,Q|(G zPFU|Oa0RA*nMԉ(IGN?-ôK4(IGδK8lKZIN@t>@q82:·2ui:*!@p4{k>$Sb躡V0*Lw=a-vпvߐ·2&EX E=@Gp$sIR|^٨*xl)>2vпv_[@Wzfu@2[Y@w|^c%e S|(Dj5ʴK}xl `gk~`F*e<`gޘttbsX]_cϴKvv̂Гgg}wɁ^<Eg;;ݥz[u?p؋'-'ΟP|ha@LYe%>>A)>ЋvߒԮKx'-'gi;;]Vz,M/ EuC$m9Zz^JUv 9>.說R|^7y wxu@勠 Q|hZ ^<ov+I%LH'ϴKKs+A\=woXC|p.uZQ=1/w.7/tݷ$3q"躩VnR|~2/oПvߔ;;]U)>@uAy\)>`Bwܪ?)>R|]c">$Y:<?9>vvlTЇ&%C8Of>ŇB\4U]+>@us6ĴKxl)>VjrO94.)qZI&`gKj.A_uSt?4بi`gt>@_ܓ{K}z&'S|]|u>) NwC!.ZKd߃rh%k<?9>;;]Uv CӴ&MПvߤ⃝nju`LNXyO:j%Cיc t>uSa \陜δK,@Cv .MSMv ?>ŇB@ԝ!а'.P칕dLE,@O0@&v&CSTC:1J2 u?4EK@2[Vr(B &fbgrp`J>@2[A娸4Lt?4B˂}8l#:Qqh"L;t?4~d 4 *V|?e|U$S4#9Y1@qx: R|hJd$`@v? N-cD72 G0*k>!ev 7R|A~PU˴K8l]*H jdےav -CCA*nMU|[@jv -C9*nMU)>ۚ|TǴK}8l}]2إav -CCAKET@mMF jǴKe|(hR|y IA: Z%;c~$q2|(G Z$GUv (>1N@B{Zà|Ca8Jr@vzMK@0@?2M[Iƒʢ3M3t2iq;d'ϻuwN4ҷ߼;ɔ av}KδKf8R1t$Q|(fpB>~Zz(C@A^&y YUv -C|hz FLF7ˡo?[:C@7U:v(@1Z;?(>@c<~K.e(>("h=7ˠYp-ôKv~>>-~c%~c=·,8 T4ݮ[do:i2$Iٿ(>TTbFy$S-;!]EE9&% dӫt>eNQw x+޺/O^q_|/W3d5YxT {WYp|(k>N ՞|&w7C-sEM~?+ʾ~l_g kYaMv}Z- @9FEJt>v IDAT]_]>DJ~Ϳyz [7,8qE: N[𩫲>qy!7gaڥ^TUk-ɉҀf[*O2h=_3?'3í r0lAbii,UM@1Z⃝žP%>Ve9}zwe]/ 3|,8yeOY'+^4'Lkq۶yQ@_ivC|8d,Btբ$+@#m$+QeKƟsNԞ-%> _Wdi4㖥} _q^4pf!L?V'@Z}֐δ7*A%@3Uy&$d[y7;zL~y]ei_^8CkniZKϴKĬ3eyzy_ŇMI T[@者o~ oaZN{ⴏYK2zqkL} \֊Z(C+bQoNT+>ce<'9[6]X-<;xo^' U 2raV,JkhTK3|QZKک l8CLvV.z[;1@8NEJՖ̂C^X|贃njYp8cf2[|P@S:Wck`挷ЃTz{p8 O!e(>8)Ut?h`t>`t'eW3f2zЉ/-hVWX,}xCIC->lOI@S)>3- OC۞O1^h: eo~Y8*Cc|'/b0?..$%X+YzA%e<2,/ɢzXl,Hj/YOgԊ,03PCXdCBfSIKT EvOl@c|fmE-!YeJ խG7b\$zڰ5[|nerA1|ؒdTfE(>4.~"ɘ ٨Yu3Z$;^/W|$yTnN%7)>xUx(IRh/ LҋTCrьuŇs\4Uвdku?X˓#""hGte%KC9},4T˿Y&XDPЛ^-[]Ȃ,ڠFzr8\$TpVC42NSE4Tc:1IG(YN O0I^%"$w<2V%9^ U[8ʓz wRb(M@SU-,:#Y0)Q|pЗA!Gkt?0ܼ]Μ ~8x::U2~ZΦW.pv,< 2sL9f ,<t.~"Ɉ t$>j`NWWYuEP̌"z0g~Abܴ 3|{Yƪ0Wk5?Re(?w$at(,7-gN]R|($K@̥mf cVY,13v$&"V S]ۓ0WZW|m3JkFxP>̩?Per/-guLTSV|V5Dxi93|p0jNsnɹUV^@2^Zμt>(>s~aLU,: ̋leh;$犡Ň,yyNUNLRƼLGXDԂÊK~/W3ɖlou_Ř ^s fI_^'qr϶`rT˺ZVJ4@3⃃ ^WUZzQuCy->-bNJ!ٵ5c>ʲ7*@'9^ 3mvF4PչG$'V=b5lOeY`LT@W -KNb(%'-gs<rvp=ږd$nXtFr =3YZx2/@3~fQ˙'iKuS·6bhZVYZWdJACY^hʺ@XzqѲ2IA@չW@ k@qE9dlH"-o]4#U[: (bܑ3_:[LTIYKr{JYVTmYu 'bpN(@EVɿJk,3]#|O^hڢ@yK/ro Nt)zCG(>45+sk@iVQs^1|LrڏV_:NG򋭣xRS/$0Cc:R %v+']2y0/$9S qh.xB14v3z7W9wZ sGmIG\MSz M%VVZK1RYE:zU%_9 9PV·l}1o=@?j$']ʉqY <G;xQŬI14L67V} ؿJk<C1/m&V4TdWCYULD,ޙ[JZZ9ZYVZ e+2YVÍIj۠?&t?kx}cʆ6c>2 SOIn98Î$ŜT14MɺOT9Z9gZYp"8+b(fSXk^z4u eɚrrheT "0Y؍GBi*R+>OlE3YQ{E `[fAGjJ~ڏTZg7}79xOm90YVOt>lL2a[sNbh_ڕ)IM0ʚro, `L13䎣}|IrW l"$oI9Q4IN$}#b(X$6&6}HWy=>H{^MQ|(mQ|h#uA\Xe Ԟ=uFHFd䁤s@N}ʔKe82ŇMtIݹs $Z,KoINƟLF3@GL@0Y֜{CI!/ɂ'WYySǓ'??Qg|s2NgDl=`esPTOK7 ۥvK\+ X\?Ē0,Ydk[^as0ؖLn3c 1#ܙL_ej΁" IC'ɭI.my{։Mr4FkId/.LBtA"H:N]g5'Ѥ$ 0#\*$s2Bk_ԍKQ@ԹS -2|l*Ϊ5[{UVJka3t~Tb3.5g9|Q7.E]i!996Ζ߭f*b(jw÷mڙz鋢hԝC:cUg줞,3{(mΚ TIN},1޺cN%ޯ_LnpLT֣IՃߴ}tG%yZe>XOwe"(s`s]|Sk/;P䑟݊G$g9W|,UE1@cuvI~z*u7s=SIvgzUrxW.;S:{C-c/kgI$VR`jꎴZrg#;9x,]ZL{^C9dzn=ţI `o5+#kٖ7K*E2kr$dutyvIFm}N&;?WgONeǟԩ'd3:䶹~vi,fE֡$ShGN~Ť@] E};|l(>*" Tb8Rn}H%KCQB^,rYaht`F] =7/yzߌ)tEuu;ľ=lNŎ@y{(k"ɍ7ɝ2ޚdYh;(\UmINvN:+I Ems5/Ke-LN14E} ^duOOe ==IPԼ+> EuM6}R @yqv?hfI$&t;R I:ɮ'u;QU:7%ɃIβ 99ɹIkx0G,Td_:#wAPԽIv׃~(O@T~u2=3:T }"(n^p [e4Ig4:tarLj˻a>=/:ۯ$Yd(\UmdL:G뒼Q EI2O0ŇIH*۲$N'pjc*`?2=nI9w'yf>݅7qmJ<o;2x"ɰ0AIv_]g3K`Xk Z]x^ꍃ%V]$Kɖ(< $Cq>nߍ·$6IrQD0[urd:u`)Z15k$ݸ~w[m24AݹM@^3uN2NY޷'iw\b۴A}\U)}gdR'<Cy]Y*7˶iQ&9.9S2!F7%;?ɞ#8>Pܵxn-B$#iQ$`{́$ߑF#w*{JA>CQ؍'Va4m~@ PeS'owdk4nH2э'jwM]ݶmQK4Q ژC@O|$M${߬`b|\׭'je-y(X٘Z+PԞ:|'S{@.OX ]ۭ'facIپE}(ndy4Ɵxv鿪{ݾ%(>*5PԊz;#G~ 3\m9;#iJl Rʭ5Ng< {rlnȩYLdqn Ż2=.IY]]޽Cs[ ;]ɮ/Mp4ve"۳1Թ*+ٖYd(o|2,)z_wɺ]|x0ɣIN$?.eu1y`n>XgJzr7:;_3+{TF2 J;UvŌnG3y{2?\-͜[`.2=ɱCg2Ȋ2;y]ޙ6>xKPu~Ň ~8z;k., #4TNv_Ugjo*uvd<ٟR90^4N:S/XaD:|${&;kSwJݩy>3rg}_~2^rv))z×>6QML-+SΦ$g`p׼ϓÒf컱/K=I:hSٖ=LRgcڅ쟞CloO}glK]9v^R%uζ?ؔnܞS/Y|¤NmG]ٿu4I+Ϫ?}W=jʚӗe^g( DN= S7,}Na/+ !ƓKOZaOo%ym^Ԇ$Mr(TUoLMnd;2߿7{3٘şm[YKZLNeTN;ȑrkOMuy[}uR|SooKyP%']6?ߜky]Yy8Z IDAT’;sy>.ε+m} YLtd$Sy Jɢ if(Xg;ywU:X<I212{|&o Y{C<:M/a.-e7/]|.LrTe%wc%?S硟#{';?hjr_%S ֟?'7}#sW<-˟I;.T$9O =᪒O.Ir;$e}4ɯ`MI3'Vg;{w_Lk\.'&#cLc̮d,?nqVttlxεO=W.|ڐ搎=Og$k0S/%kzB%ZBYڡUUoL2%WՙܑLLOlvEN6}b*r*>?$m }oΑO Ut\Shp卹3Oݹw._9}δ 589gb}|篞Jg{LNӗeEv~ t=IYEBa"uI>l_IR`T7%a?;[gb?:<ݯOl{]*Μ3,8>ؒ쿩o9pG=P2CwrFL>;>wspQ=O]58)q\Gsm)g]z\S]=v֞<ǜ"[Bdo6e~NH3GN/B0C/8#$ Aӹ9h[u};Lkܞ^gw Uɒ7TYzAoH,ξ#}oǦ?<߰%{?uAsw/XrC^}I6/>ڜ/Z䴜tڮtGSs rwLM$'RT|7֠hE`t{_+ NzqA*%v^5tJns驹⩼`Z~Q֞<7yhAo$^HNrc77X  uI9Ėd칺}:ONʊK,{SBvI&47Syϯ]:I5Oug7fWɍ`ܻ;W{Ϊ\7ȩK=?E'/hsTCk%Q1o&鉫v(>㓼5ENW_~[f[;@::d7f֢dٛxGeUmj_2r oKF7fudAv{N]п$Ko5Tˎϩ-DzݹWosVO|̜?v[xêt=pi>+/׊ʾ>SU7'u##{k9 gZ,*+.me1*{Sg(65Yʩ/࿼0KV{U^߹?Oݵso ɛ>yv}9xZ`"KŇMIJ:GqI I&E0H:7'=SɶuGduv_=d; Πo9SO$ܗ{Sd~95ȎܘCrkocw嵬۰"?[o=_x<7C3ͷgƜsO-p'ܞ^y1 Q|뒼'=*:sd*7gh0Z@3Bɝο/^,7UYkD<$c4]p}pvQ^q/rn>oeo&\o3wU^Ss%k|jڋqlwv`н/Z1ҋ{Or}'h(u*u$}aO$_,=%OSjl0ۓ'=<[h2O'2wEVJ]Yva~߼1kN[ՙsߗ̷w2{ŀg,~9kh|d>g0 8.|dOAHЗ<:z+/:rL:.Q J]_]ݒl:[:6<xr3I5,:ʢ,>;Ytvg(˽gdO ;MqQQ 堂UA69*. *" pEYeO BN&}zhPY纸.HtWUw=Mgv@н*{%t ^rnFwO"͟ގm珥bTs"1e}"^~"4e-x#|4d56̆5Ooi5$h>`  z58ɱ2*$ />=t-@␎῞4RP>ʧTL)e&Aj<#RӐ醐ܿltcHzt !U$N5s yL[#;9J6t6_s@w%IR< e VH}-//$8w2LfU=wg;HQIcyǛ>4}ՍBNS~Ujy3aΨ^nӊ6xô7v ~ue/->He"a-0=&Kd|$xe`u܎g-/~1cAJ|7n ?'<̆%#~*9=ib+8ayaw?MAڀD$# 2n $"/%4I*"xCX~|՞:).FSʤ<_%wcMU&y x1sH$]iOs۹ȐM<i I>a 驈u'qSBDȃbr7ѝ:")}'NrԐ^;C`GgR9ѸrN~,&Uq"ӝ{h,̆<{*6)R˳D޲7 U;?؝>BI~attGͥ#@1HRJ=#~Wp[ߝI Q< n8!V>1r+Ozx(c{qe-t?囏b+aOxux%Izq8Pm Ճr\ES$]z) R 39Ir'?̆x:[p?w~)^h#=$I>atEϥ,c"F-u~ҥ ؎sD*z'ӓeɝ+dcX)%wI$AxCF!IE yDAx-a3#$!"G2i>w'F*nm{͟!,e9+@33ǘM<|dz\M$uNV4 4E}Dݵ$)F@h! ugE* cj 7<_N{k>9.L6] nZKmDI${DP|7(A @H} ãB*(f޼ǯ}߹Gϰ⑆ۊGhZ$w6d"&AxA@F\JqI̦ta6yM;ߵ+Y0|q[$I$$'boOQN$):FjqIIJS Ñ`U63?2|bStd<9$IPf Vqi\W0'KR셷$ ) v e@YpHgL*Nd8%\7lKU$;mv5MQeT.&Ë́pZR6.B;>/$);E$l&]Q?TL"7'5 IW [|9z0Iů$3x^Q+M_WoMb6U C7vokXtJ6$I Q{bPx 7Ct,$S 48֛]HG1Kyll\!!Y`C2jr04jc|t#m"J$Iy#ش(S`=6;WO7 I0 APﶌ|lK?ɲs޳-)u,tHWK]iu;jK`$IҖf ;.Cpc,ʁg$؁?5cB%$L`&w+빏6}3=YeR RR>c]VǴd c$^{fM=Zrc!pŇ(Y [WA@CAF\&{HYcsŇBY>}_JUI&*عl4`*Um뉕$Id2H6NýY$x.X{,>;5c4P/Y wV6g7T-Xx$I\)Z|x$X*!~n? Iy=EdS8~<'S[=as>? R|{ IpDc8x"ơ_帋C̀$Pp_^kǦ*)tr2OIs=h C9h]ʽk߰c53]6#I3!RǹՊFb,}$)Ap؟Z TRo҄|LG}&$+`[ح|쐽Wpu7,"#5=1$I9_==RrPk [Ca5e?3JI\K ǑHG2ԛλGkfICwwOG%t'H$1DF82x1HR i~zxh_ ^yfd}R5U7{՜Iِ%O+=A$d + Q'8# C|a%dꁣfS}Bi~XI$IyP|xXXCAb(-` PRo/˻}nY=BBn}󛞡g0w6?L'K$큃!RC$d\xܸ1HR >LnYf.6qU1|b*>drPc /w æ');0:Q۷rCk37?m˷uV-*`H$P-Yc4b R|x2RF6I.COigso@mb{=ltrr?[!9niNn2 IDAT|>$|7HXS x:z#?Po`N$峈fZXriʉ[l昍gsvm sBӹ0ɔ$I&d S4SEtRnR%ww$H&w,zH!"8vC".`k_:^M kQ ٵvmd\=*ƲWv.gr $Iq>`Gc&b0T|~G׀8,>HR■19 ԗhͻmd5A^O-񻶗 ڗac;:pGRAщ2MV3%Yd%T$: ]an6fT:w8Hh9"sT+5.6 I{xޛ5*I}YGaVY-Aҹ&7?ݍ#aL .bӀ~LA$E\ c_Ӈ)} H_0 IgkIR_:@w$Es=4-dckQav(jPؐdyMi#f=y$؝Bq.*C\|DZ)GBb"C"CH& OmdhDefe\Ҡ)۰GX%+c!de{:tx%IR1 |"WPuE U'rۀߢr6 I\߇p^wy08/MJR_:A&Dߗ# 7sNB^H gSXLMUbQ'H03UZşWrER6g=$TC)%8֬nqFΗZcX' pփ~u%[eyJ-~ּcp!A~b8a< zA+'nkI$EH yc?C^:^#g,c8ޝo\o>ǒK9=a[;^Mۋ^fiLocvcjfH?d%;$I* q9Jɺx ḍC?Wh;V,Ybt9u%[ܲzSw$XP7r\Ѻ$I$En%E bp( \؍YGB/xmm-$`k6f:!~]rnn_EG!V9GFU0Y볝}'W$v] }4JD_IS@b$~ßYN.gy-*xZsHR\o De9%tTR>:yDzz攍о靖D"($i|HmW%J$x:>L3I$6I\2.~GobAP7RksFqѸi\1.YLIaRk t%ң8QB'41HRuט$hwwj?f-74﬜^笠Pc$IEhch4R*>x:S$)_o_B~tYn:Hq]όWMOqIΫ3W$I*rEϟxLNߑ4X` $Iwx^9+Cv5AmcP:[i$I*/!.)[jŇ[t Pe $IW<]z5ދۧꨌElؐ$$tHBN6Hzi4R+>ŎH |$Iyͽn /K`P$*̇R_s]Mn=IT( IBKTO@c= $IR4d<ſoDv*ۂA@2ObZ&y YO%~$I"z*zZJC'JD_xi I=d+{19s)34g'$Ip0"闔=QbS\bk@$Ie1-mS/E!<_#ٞ&/+j$Inez*zJ@JGl|$I>@kD*P%Q`dw#]1$)6fC$ ,)(~>$A$)B<ů!#ύL i8}; +$I4\Cd}R.> <؏$IR4zV$.Uů Cڲ^5f"#] 4d:tI$ O!,_Ň]k+&US$)2ZI@D9[ڍ.yf8l}KlI$ Uc (å~s Gic$Iy?aRL^ 7xwC$Eǁ!J9R/>4Ad}{?H$t6&QU&vÒ5ri$I$p1D.kk5H 1H$>.%ʶWQ|ؘ⹞HeqW䠐$IQp$1DRCkq1D֙@1H$K=ye cMd>L'?kYG$IR0Ⱥ(r.2Ț |$I5Lo/맯_;װ)=3My͋hG$IR-3~3^u+1Di@1H$>.Z=[g:ܧ) m/xW} $) *Cd-0 !%W͕$I*k3[{ ` k^dV^(ܱ+Z:$IRT L5Ⱥ%ÿ]Aw5 ITx ȳmS{g?,<: g5=Mw-gc55-σ$I:YMUƐcߚ_CdMl $I#qbnk˦Yiߢ}q>ڵZp]+zH$q0"r,>@1DcA$H#nlKz\ۺ[_ D{漦E\I%!zÿ5V4HQH$N^?5.ԛgz6z,!,9Â9C,3=9iQT01QT S5LHVRk{kCCU6^LT:$Ih5;'^RH($I g_qK{mt&g:k_k^乞&NߙY!|.n]ƟWЕgCcxW$϶@z,SqI1\iESg e፞kT ?$I*2mg|vVg-$ndA|z:dNȚL7UygbTIږdzfгʂ2$Ik6hXh ew`!ʎ. L$I  ?^о̤"HZw76ӱfMۋоUNdɼl4c$4k3<ֵ{:ױ{1`JB$pc[.EHaۆL'j_jf:7 3ձ:P$brqQh.ln,46QI;Ik$I#4"F;?cɭ($I c|m&OZ_`Lc m<йa؎#̰UnjT-~Cg8O$I2uu7ook(KB$p>tMVIS:H+ZeӬʴPXt}Dz$)JC Xk }00ř"Qvp l$I t汄Ve?WHq֘=ٵ|lY(cD=;y[_౮FC3S$I}i 7\/h l 68$I $0vP?Qz-<&Iؽ=.U7d^$8z'Q$E׀Ii7Y|s lc $I5;lvoD.Vv{ʂ٥l $<$)*'Ckca7HN7IzTоUO#$ pؽ}*'A$EǙ@1Dڽ00FyG;$IRlK%3p"` C򞻗a[I1DޙF0pVc$Cc$I*EE~SUMT OVr=9j+oVɭ9!I4ΆN%HysD! IT8fb MJTQ %HU9z~:HQHy$IR"Yda 3iO$IIC"[,>lk%y'A$i% 8yot8'+8~>yjͦi,H$bXcÖ2y_$IRD齑sC0]1?H&IF@1Dޙk X|:Wˍ!o $Io U^tVusKᮍ0I4>l 7BN~2c$I~;PwY48&'yl'L$R9p1m[rec/$IR!xDwcAiyg?4g{s'L$җy+aX|z]S .N&$IڙQ$4{~2!Y{?\Ӷ 'M$D ?aX|k!F5Im46Q9z<ŐmԾғ&I ᇐ9d +czF'cc7$IIV-K z<;bf6[ITr4X80t~ l0X ϣo$Iabmx0[c &ޘ✦=&ITRr} /ah8N~}ÍA$i񌧢m+mUvZw믇Ib?HI g04,>  5 I4n Cb I4ea\ EʾaNVY‡:i$I,JQ1 '|_x($I.s"{-tN$'઩r C@:Kt K- ^'bl@Ұyco$aK: c߅I$I3f8i!ly~X+X0Ժ,]a IT2%x5.h ǿ+m 'c$Io#ab}aKGY?D3Z4Ou7z$Ip217ax|p xb{ I4<7> umc z`&/ӔH Ŋ1e0sA$iTl軹tc`۹nFʴ֥/IӅ@1Ʒ`p0oF!I4WO IlcŇz 1 g{^$Ia8 8d`9`5*BTI_-bzƓ!I wHp-1N k@1ƻA$p&RW˟ؗo#sW6Ww I ;!6UY|(e%+SA$&R'5L#9 r?7sF6$ImCx 8h2$IFF% N|&S5|c|/$IҠ\ 6،Ţe c$Ip ٟ CUN: $IO4X b"`1H$mv vJO IDATf e[Z!Jg cFN'p10$IJQ{Ž ֹ0m$i|05~A>FŇu1'ÌA$iMO؍ WeR$Ip1#+ b 3l*$I w1k؛؉qo[ R$escSՈ}WH+p1ʶA$):*Ip8Ӹwp sL~.K9͋} $IR>S!Vn4e!1 I-$,3}6;1~;B,4-֥d-AH8b%|FŇhx b%.jB$)zHqӸ}=y?'M/ZMO9m$ (b `1< bep1H$EW e3x E\!Iv0Xc `!:^.49 $Io elNdvN1NK{-AHTN09Xe `!Z~4C$_F!I}Yfr:\)\1O\OIT:*Q|#\a!Z3!vDn$Ib )\L0Y_ 7!5%'$ICCw+ZʀEl,?pQH{>̝!NNe!8I v,e]6)j&*(rv 3lt<&>~79/x/$Eۀ{pCe4TTX `4{0f ut$Ib`1zLc.Ѷ\gF;n7 IxE2x6VZ:i2դC`2wMRH0?!,>Dߥ1F;?5 I1 &P>XisteMI9C,=\a fχǂ3ch<$i$Iv0b'Fm>wK1I$IHY|b7V"'mK3A$I$ YKz=(,>J)(rs&I$I4zE,}Xa ˦8ۿ\nc-Z$I4$bEwC,Ur'I$ITX5r0xOicAe$I$ms!2y,Y|E/!0I k$Iǀ#!~Wp1r &B$I$iX" 4CeQx)q7p1^u BRiq%I$%w_Ds^c( J)*c큫N;O$I*.3{8JŇ |¡ .7$I$SCQX4CPzn~k El} I$I{CQJŇtb/ J$I3[p1$c( cjT\xI$I*Uw7p,JŇkFc( $I$I*{CQ3p1&fc( Ԓ$IRq p1& P,>׍h %I$IR| WUP,>.c( 6T̜ I$oQ_CiU4Ic$I$wauǿ 3:좈(⎹fJ e)Z&oIfo`j+{*f)<3>۳ss0qWxyW#xu jսe&0y[=WqI뤠 WϒablSYD `ܨzm.$ϨΓ Tab^&1fL7V{J11έN.+[WU]$ĸ]*cm&:XK28&ëdsG0Q \ee(Ϩ#DY +d>pMfW?bbTVH,VBIq #U>pm[=Umj_)2k Lb< \6_3e({TgU;K,0vjx:RL^'JM2LV˥5խ(߫,c&d e8_H6MuVd8R=A`̸ce8/*2LW'Q2 VGU류(+._ `+PZ)DY_=H 6d85hr/LVa8/& ;!Fr$:z l.oWJ1q9_O%'S{I1q4~l.ԧ2T-:Zt|lTa"=C8 j&2 ]] D:z hqW/a"jV [~MkH\UH1qfUߗa|x{ܓjj)O,}/Aw[dRQ?dH{4 #L %D|20 /kGWb"0F4f#`ͤH?~D  ; Lw.`,^]"zZ%/̷Voab=O,0^T=Lo+dRQ{7eXOT`q:v ΟWOab}}o,I1Nl#Z_]X  dX3թ}W|=z ,_VabΪ*f,v`ݩRLgW zLukՁR8z[ Gj]& I2LݫKc&;L'T_dbxu &>9uuRLVfbyJi&~ oF*0fff kRLD 1np&Rؾ::X7`1>R]J1RZ%뫻K1f5 2LUK̋Y.[V^=Pd`b{za&odxdQ5Sc()&Ǫ?+yesl#eV7dx?nR)XlHV; Mg4\4)-%`]lfƏ2FƱ2LoWߐK_۪0W }̗߫^$T2T XjϨ-ě^Q=Z X2N=} 2 Xj}O:AJ^cا /d@m?UC6ld0-UɋF{a*ά,,_Xb*<:GF9gZP=P `߫m oNQa(Y_]}[z}u)`3i͆K0|`zDF} q4lCLKOFǪcd=I jZ$xr 5ӫ05VW pfm}mjW)ƋQd(; ScI9nRLWOQe(\@=MvQ$6RLUGVJj>9VKyQT%T_(cu-C_H$1|`}zH3)~`"-^ϪUߑI 4bj=Lt0V6\,)1H$2|` ڣW;Jc}L758e`R>0Njujw)T(Toe`>0 z Sq5k`(&T;hhL˪#H1>X'#ލtSkë5R0 ?~"T܃ޭ1cxzt)څ OP K 9b]C1cCj)چI0|`ڼz So>RpRLT41|`z SooKcϑ՛z'U/iczz/2LիQ7c8yjնRLU.i5[=zSozVujl '.(߻19;z)F~2.mRP=z}l7VOê5R0 v?T}[ VF̬ceW﬎ 7L3jDTKonRP]T=L;|a+ܥRP0\;ͭo&e#Jpyp5l2{0l}`<ỄHAI]\kd`՛'JK LC3d_1|20gyҹ.| 0f6|o9 =wgV\jKjeuzu\['WeWo]SRp9GWovKi `WJWeg/K6pqs)`=tnZ}\W.p a)H0^}$/qE?T] \3ظU٭zGx)`1b{Bj)WW%\;4ZYQZ\-ЌGes>RYæ;˨R,X۱zcu\ɺR1|ƆcvfJP[X X]`S}:B :C t >p!Rp5o8v e[=_ջbe#.K sqzsVU5\P,̃2}`3;zm\rl1_s{=z]#e_gEObuUGWH5xDÅe7`$ܸph)gWjBT>(էä-4=bi^$T :0?~Q^}V ;b`pru|zP3)`>ikRp 7\BX:Z!ՏaICMXP7έ~G s`>;Lʹv>{ `ͺuZ$'Y0|ꈜȵ۽z{GRƘ=Y^;;p.;p vT/^{ ֶi݃k!Ǥa êK`#0r\=[ؘ ;-qqÉ,sfݦIWbs=R2|Ά7/ؽz[`cf?lKGTo,o@ئMծr/py3rHaߪM3՝`=pE>;l̆뤀cR nTz%`[F X\4NfU_`JNkӪ`VO^%,>X:z!l߮>YJ ΌEaSVON,WT$ ;g'`3W t `\ lmS^ӹ9ᘥ`3y|`i>h/e`3ρRfǪc`3=z `tuLV͹L:l&߭1|$L;UZ)` ^R[lr=S-`̚>LW$[|#|h2Ynٰ=RcRNw(0 `tTU/P&a sU;xfl`4>h{AÖY)Q}>ḼW%[`\. #FK'V` ܰzOubB`mpLm8jERh3| 2˫s} VϚ[暭\X }0>zLV Н5?Z Ɛc#VJZW=G)`<>xymeRVWNva0Nάv-݆Ɂ1a) GUn'@PGulV^ IDAT˪߬E /0ΪY]*[#՟<`0>UZ}_š0M `<{b) +Tn*#`\ܨ::in[jMud 2|Ϥ`+ݭTu:|uo)JƚW.:z{{F^՛.Iϫ#vc&ùyK!#`Tfu^ñ~\VG 09>\ݽ̃=33d熝ӯf`|OQ)`2>d9a)'GV_h8k WF˯ͭ|Z!LyIRRiգKfa]yR#,y`Z}:._=Z+L>ysӾջӫ`^mnWNL c:B097+/4l+bm8$)`@tZud}0߮W[uFl ;Ʈ w,Kwp%Lr^Zojx")X GVp'lmx^yІӀ)d1=I&՛=lcATfaOuX)`puRp6/. ֛irVZ}T n@ݫOJZ]:lr;v%. GzӾsAuՉնrQWz^2U'TQC;Z@>W׫I[Q0x\5v>lTUʆ.uTOf`W:;5+<lUWn8n lqZ9˳VI"8φ |.Ru,s̝ pMLՅRvh s꣹PRbؘwWVߖErC ï堙ev>\]v,5\`)kcl79)Xϧ.>TӰ Upұ9Ź>#&NuR[V:P)ٿzguF,Uw)) 3`ݳt wC0MP;VӰ;~r^;}O6<.Y=[ ٪(`ʟX:j$,SNREwQLn'4,|6tC9Xdk?Z\Av8Duzκlv>g]` \T=z2|ֻ;5K9vT긆4k|ƊϯK8s6)a1̇/7>)X"T'V,DŽU^T,KC!Jl-`RnVaG΁rLWIÝ%><0.[=-Q>pNj9Z;ICuBH9XBճͭN^\ ЊsrTϼ1f0YUW}zV-cib`!oH^q`$Z`RܷdOu`}guB0|.6{9ƈEýTXuR bXhkxR0"{>c`f`\]:%:0Zά]}_ `!>`>XX,Yy7;TUYS-0[T=X`Yrf- ϟJIFX0l8%$aDnx)pb0|}cQ?_cĬ Q}ᘥ`|G/RbX m#R0bn^qCv>#N7T7ǥTp˥`ݥ::Klf 0nTr=`|n`IXKiM_:RS˱D}<0kcfWw)#hå_mB\WE`4pOWV$a}WuRFŧΡ| C-:wd,$ͭ?*0 Q~IR0v[t~aZ6 }xyuy`Ԭ. E`1mz~aIak2|FիF߆\=5g?;űᮯ5$4 )Qd12@0N_cm$'|ֲ?{K`w`2)7[~M`z ~0&~K-E w |׆_^SLĚS`\Kߖ1r`uZ g 9ff=aec2hxY7E')qa1VWo1~u1l*;a'y :^qN'Ɖ0zpu|N̍.zu\$ޝYUS߰0fUϮ~@`Xj:o=9C{U'6 !Nvlv~:Gέ#`ܽmu=g5wB$W`0tJNI˜s%0,I Q¸ڽa͆IFN0tKlaL`R[pQHN wA|zAu/23y:7^8jWIcpSrb4o>,cnOc:ԖXn]p5sgKL`}gÅԳr0VTGV>ذgʾ_y::lus ,ڰ`Vjmu|'r0!VLutT]SlYέo^`B]X=ᘥK&C`{uۆaRܦ:r;O߭;`W^$LTΔd4F1L/Չ7O挷`z\:aEՍ$a¼aGR49 [amtꀉ[?y&ͫS^xV$LVj8>b9i`1LTW muLņ DlLתTUVpq&4ju:9#wVհgDZ&̎ /L|:zp`2o8^w`Zm8Kr0o8/; G2| |ɰo}Uߘ{.9H&ط{7t42|[V*nuUj1_꿫rY4.w|p'xɴޝ0.ҹՑrYpWO^X`>J#|qr壕n) S ՝X\їC.)q#_#u$0f\}9G+1]f69~.i8`ʞ R_ɼג53yF^s _{~8"30]~0Tk"] M MLfd!cfda 3^|W:0o0V6\j7eW`]~ûVZSe1q ݭNVKb&;`i,k[UwN 6ͧ=hbk.n Yb˫;U`XlKޣ!ff|~`]v9|OrlC~b7z;`ݰ` ^Uݺzb`]OSݶg̯ Æ74,KT"9{GuPj)*n_N1GTl_a) /ΜB̹ݛOTYHmqxs6 7NίέvvMw51|_gV"\ccvi2|YՍekt:URy!ՓjñLjU.6 _?WkaN[*,UV6ɮQ _|~?"_9:apnqב6%ݫ/pcxnUv=$0VfοWppՍ-Xxk[ l}ڮt~׿J0|` ݤw[ ur,oRٯ{@{uDm/0  7V a>[~_R,.jBݶ]_{uXil~ WwVyTȅKN`i]z܂'cn՞.z%e8::9̫UO%F%7ֿSzguٽ۳;[}[pi G ̻Wp-K`ZX#,Կd+{{vvoEDSkyuHK&̙V?`4>U/n ,ڦ{j:`S(@ va #]$I՛-kyy oۖu^=ڣ=[% 0o &6 0Gk/.`2 `ݽ:5âpa!ۭm<6[a,n0l85,}ܹ_UO[ ՅջGhmvi@g c޿MXtk]],hfxM҆ %nN2wW (;A ;`)}zbI)ƃ2x>፟=䀥[+cv>]|/\ ÇCuÃr6txq^a0_=s 4]ڽCڭ[s d0?}v7ܥӪ?~(X`ln.nj_0 Fʾ êUH#翫?Α`|9`}:zRjGI`4\ܺ>ҏH?#imn;u7 X@ǧz^jw&?TF ڮCڽCڽ[;;&jdž6n/TO.d`|rćW/F׷o-oZ]ڭ۷kK;zT;WwkprY`l|zj&)&-dzCZ) u~i7Ӎۡ۷KKwj׶B^՝1?k{FuSw]g]tHwviv0c±K[eAa Æ[XP\v>L5Cv[]]P È۷koЮߎ-}0ޖW{v뺲Qu\jVfu 0]v:&g!٩m]vvVܭ[j'Hplҝ~Z&eճ0 .06tvVwP[2a`>T.p_%pﭞְ#){`|z@uDuruI`2]+_d}P, w50p},05]Eu:?0}vn1M;wVwvnV h v>\cJQ0~^XDeo1>խЁsG5n-Ȅ W;n_XezKR%6Nut7L O>O~V/[S۹&j8hM4|zjul`}k7e~7_=[aānV e꠮8h8Lk^`Z'g<f[݊nv׎ݴcPapx=-_V?c' ÇWz$:: W}7mn:7د'o:`u4Vzw Rpm U=f[tvϯjY7iJݰA۵GV&Vh2|πO`SX9TzlW^aMR.nN]7h?n>m۶evL0v_7QU2|`s]Vzu/rqګU3KcZ& &aW?\X` zq7u5ޒ`k]ᢹUFɆ]{봪}ۻm5V~x?v' {7\oKa(Y_?7`KYi0_n]=XL{۶ڶת_ϻvPp%wYtI.hM.hMtI5kV,`:.I0 o_,0)Vխ:jV]\JPKZ߅][Zs߯ŸQ`5\&6)/VE,ecT7&+ZnhVGڥnE;ܯ8GG@muvak˺]?m?.o. Lo4CeuBڮ:jg9-pb-oO;M+[ֶ-oe6mL;qiUڶem<6wq뺤i}hmk.k]v/3뺴oG$\67X~ `~pK`!>Y=Z)۩mLj9~nqyZ֪^Ӻ\ٵ^wakp8l]t59ťKv(Xf}uFK_-9qէ`1t꯫äyϫHR0|`p=ջ`)>0JNn/l7*>S Ft6rYY9eë[/\׫VTQc[QVuBu9rߪzYFFbe Ca9uT\! Tqaڡz|A:0 wczFu9sl:Xƕbe!r0f^:%w:0 4˪WU\FWWVk`R>0U],#yիur0i Ϻë Ksf3|`Vuu)Xdz}5+it9ջ`>0n_=zt\ms42|گ:j;9Bk3)~e]gzC ]) d#c 0٢"0o8oD~/_2cf[lnlN)2l'V H[nZ)uH>ɷWr~9WOYVu88F۪߯+P>l>TNu8x ;U^,P>k[UX^C`V^͵6~̧ n<seÝ֋`\}= {EIDATc|կUg`n>^=.8>89n~"ϫ?vNo{T?Y 8P}AQ>{K:Tg`b=_}X]tpl~>+&'Z N,[+VJ.~5+xǫm|1^ q,j[|Ƭd8T_#`(`r_}8fWUI8`)`~^"xҷVkz&&iS\8`2)`:)2>!yai`ɔL5̆ _nx8)Pu[|suC qlwAlP>ZW]_BjH 00 +B;ir_0?0Nnh("n֊X{[WDGT[Rb2'S|wess8x|S8-4fRDUS}.AS>bUΆ"f\yR+G|Ꚇ""aE+p2U77WESmouwÄ}"NX*6?U! /Uw6L8|zA$R>¦I4LF.({;5L8<'`))S꺆WgV "N D3՗V*ݑ;e|Vʪ!~L$$vT_h(Z ܔRPF8.۪V*/`RL.jH`Ճ eç 0I;yoI$̩՝ߏS"&&V3Tfܣ Wh`JLUE[mm(zL$4R>b}umC"`J|a]՗DL;0.n("pW:0!^a]"fTeꎆt0Ӕ<:M7V%tO E?V;DŠM"8P6U[uP,R>,z[ eĻaW_olzI,mixPsʆ;]"82_K5:L0V&k,)_NΙ;"~Z'3^zF,'FhX eĻr5$S=P4lv`i(N6?Z^,k 5l%D2嵪zw ěvB龆`y(VGh(+J0.hވq)^,R=BѰ^ P>Lե-.$.yOhx+*:z!<SɆrkg0}jK Z-`Œ'_G0-.$6X[\44Wo݆2#< I|`((D/Wtbj3Bbs9i"5쫞n eѿ yZ(&ȅY^dSkoå̻:rp.)`PZY?zfOU;JgG/50YVk("֏6LU65PQ6VkJՙ̳su{V~vꋏT/ھ^;=5wzz ;z?z - /^&.UtIENDB`mu-editor-1.0.2+dfsg/docs/swag/t-shirts/philbin.svg000066400000000000000000002057001341747546300221740ustar00rootroot00000000000000 philbin Created with Sketch. mu-editor-1.0.2+dfsg/docs/tests.rst000066400000000000000000000054671341747546300172140ustar00rootroot00000000000000Mu's Test Suite --------------- We have tests so we can make changes with confidence. We use several different sorts of test: * `PyFlakes `_ for checking for errors in our code. * `pycodestyle `_ for making sure our coding style conforms with most of the conventions of `PEP8 `_. * `PyTest `_ as a framework for writing our unit tests. * `Coverage `_ for checking the coverage of our unit tests. .. warning:: We currently have 100% test coverage. It means **every line of code in Mu has been exercised by at least one unit test**. We would like to keep it this way! We can't claim that Mu is bug-free, but we can claim that we've expressed an opinion about how every line of code should behave. Furthermore, our opinion of how such code behaves may **NOT** be accurate or even desirable. ;-) In addition, we regularly make use of the excellent `LGTM `_ online code quality service written, in part, by friend-of-Mu, `Dr.Mark Shannon `_. Running the Tests +++++++++++++++++ Running the tests couldn't be simpler: just use the ``make`` command:: $ make check This will run **ALL** the tests of each type. To run specific types of test please try: ``make pyflakes``, ``make pycodestyle``, ``make test`` or ``make coverage``. .. warning:: The test suite will only work if you have installed all the requirements for developing Mu. Please see :doc:`setup` for more information on how to achieve this. Writing a New Test ++++++++++++++++++ All the unit tests are in the ``tests`` subdirectory in the root of Mu's repository. The tests are organised to mirror the code structure of the application itself. For example, the tests for the ``mu.modes.base`` namespace are in the ``tests.modes.test_base.py`` file. As mentioned above, we use PyTest as a framework for writing our unit tests. Please refer to their `extensive documentation `_ for more details. In terms of our expectation for writing a test, we expect it to look something like the following:: def test_MyClass_function_name_extra_info(): """ This is a description of the INTENTION of the test. For example, we may want to know why this test is important, any special context information and even a reference to a bug report if required. """ assert True # As per PyTest conventions, use simple asserts. We also expect your test code to pass PyFlakes and PEP checks. If in doubt, don't hesitate to get in touch and ask. mu-editor-1.0.2+dfsg/docs/translations.rst000066400000000000000000000126271341747546300205670ustar00rootroot00000000000000Internationalisation of Mu ========================== A really useful and relatively simple way to contribute to Mu is to translate the user interface into a different language. The steps to do this are very simple and there exist plenty of tools to help you. You can contribute in three ways: * Improve or extend an existing translation. * Create a completely new translation for a new locale. * Make a translation of `Mu's website `_ (see the :doc:`website` guide for how to do this). In both cases you'll be using assets found in the ``mu/locale`` directory. Mu uses Python's standard `gettext `_ based internationalization API so we can make use of standard tools to help translators, such as `poedit `_. .. note:: You may need to run ``make translate`` as part of this process. This, in turn, depends on the presence of the ``pygettext.py`` command on your system. The ``pygettext.py`` command should come installed as part of the Python language, but some operating systems don't include it by default. For example, to install ``pygettext.py`` on Fedora you must make sure the ``python3-tools`` package is installed. To manually change the locale Mu uses for translation strings, look in ``mu/__init__.py`` for the following lines of code at the start of the file:: # Configure locale and language # Define where the translation assets are to be found. localedir = os.path.join('mu', 'locale') # Use the operating system's locale. current_locale, encoding = locale.getdefaultlocale() # Get the language code. language_code = current_locale[:2] # DEBUG/TRANSLATE: override the language code here (e.g. to Spanish). # language_code = 'es' gettext.translation('mu', localedir=localedir, languages=[language_code], fallback=True).install() As the comment suggests, temporarily update the ``language_code`` to the target language for translation, make your changes, as explained below, and re-run Mu to check your updates are correct and appropriate for your target locale. Improve an Existing Translation ------------------------------- If you want to improve or extend an existing translation you should edit a file called ``mu.po`` for the target locale. Such files for existing translations are found in the ``mu/locale//LC_MESSAGES`` directory (remember to replace ```` with the value for the locale's language / country code combination `as specified by gettext convention `_). Open the ``mu.po`` file in an editor or translation tool of your choice (we recommend `poedit `_ as a great solution for this). If you're using a plain text editor, remember to make your changes to the message string (``msgstr``) *not* the message id (``msgid``). Once you've saved and, most importantly, **checked your translation strings appear as expected in Mu**, commit your changes and create a pull request via GitHub. Alternatively, if you're not a technical user, `create a new issue in GitHub `_ and attach your ``mu.po`` file along with details of the locale. Create a New Translation ------------------------ There are three steps to creating a new translation: 1. [Optional] Use ``make translate`` to create an up-to-date ``messages.pot`` file. 2. Use a tool like `poedit `_ to load the ``messages.pot`` file, select a language / locale and create appropriately translated messages. 3. Save the resulting ``mu.po`` file into the ``mu/locale//LC_MESSAGES`` directory, replacing ```` with the value for the locale's language / country code combination `as specified by gettext convention `_. Taking each in turn, you may (optionally) need to create an up-to-date specification of all the strings found within Mu that need translating. This is the ``messages.pot`` file and you simple need to issue the following command to regenerate it:: $ make translate You'll see some output ending with the message:: New messages.pot file created. Remember to update the translation strings found in the locale directory. To create a new translation you'll need to use a tool such as `poedit `_ to load the ``messages.pot`` and configure output for a new locale. The resulting output is a ``mu.po`` file that needs to be saved in the ``mu/locale//LC_MESSAGES`` directory, replacing ```` with the value for the new locale's language / country code combination `as specified by gettext convention `_. This process is illustrated below, with the cross-platform and open-source `poedit `_ tool. Create New Translation ++++++++++++++++++++++ .. image:: po1.png Select ``messages.pot`` +++++++++++++++++++++++ .. image:: po2.png Specify the New Locale ++++++++++++++++++++++ .. image:: po3.png At this point, simply use `poedit `_ to fill in the translated messages from the source messages. Save ``mu.po`` when Finished ++++++++++++++++++++++++++++ .. note:: Please make sure you check your translation is appropriate and correct for your target before submitting your work. .. image:: po4.png mu-editor-1.0.2+dfsg/docs/user-experience.rst000066400000000000000000000352661341747546300211550ustar00rootroot00000000000000User Experience --------------- We care deeply about all our users - we want using Mu to be a positive experience. In particular we focus on our primary users: * Beginner programmers, * Those who support beginner programmers. They are at the centre of all Mu related development. In order to understand how Mu can best support our users we need to learn about their needs, world view and how this reflects upon and influences their experience of using Mu (hence the name of this section). This includes taking into account cultural differences, special educational needs, level of education and other aspects of a person's life that may impact on their accessibility to technology. These are not problems to be "solved". Rather, this illustrates that Mu is an application to be evolved in a way to inclusively address the needs of users. As a result, it is important to keep Mu simple so that it is easy to make the inevitable changes needed. It's also important to point out that we will make mistakes and may need to revise how Mu works. Therefore Mu should be simple enough that it is easy to fix. It's important to differentiate between design and usability. Plenty of software looks beautiful but is difficult to use. With Mu, we aim to put usability and a great experience before looks. This beautiful yet inconvenient wine glass from `the uncomfortable `_ illustrates what I mean (used with permission, see :doc:`copyright`). .. image:: beautifully_useless.jpg What is UX? =========== I have some wonderful friends in the tech world and one in particular, `Ann Carrier `_, was kind enough to explain her work in "user experience" which I'll reproduce below. It beautifully captures how I'd like user experience to relate to Mu. I sent her a series of questions to help me understand what I needed to do to bring about great UX in Mu and Ann gave some great answers. What is UX and why is it important / useful? UX is short for User Experience. User Experience means the overall experience of a person using a product such as a website or computer application, especially in terms of how easy or pleasing it is to use. It's a really important part of the process of creating a product for people to use. It focuses on finding out about the needs of the people who will be using the product or service. This can also include how they behave, or what they do right now to achieve whatever it is they need to do. Once you understand this, you can then go about the process of designing something to meet those needs. You can even include users in the process through interviews, usability assessments or other workshops. There is absolutely nothing better than seeing people use a thing you've designed to help you figure out all the things you haven't quite got right! Can you describe the processes and techniques you use as part of your job? I start with research. That takes many forms. Whether it's desk research into the latest apps or design patterns, or into the other products in the area we want to build a product in, or speaking to the people who are going to be using the product, this stage is vital. Once we have a better idea of the problem we're trying to solve, and the context which surrounds that problem, we can begin to try and solve it. There are many ways to do this, but I always find it helpful to draw things out. This is especially helpful when you're working in a team. Having a diagram (even if it's just boxes, lines and dodgy handwriting) that everyone can see and suggest changes to helps you know that everyone has a shared understanding. Once we have a shared understanding of the problem, and if there is one, the current workflows or processes we can then begin to look ahead to how this thing could work, in a magical perfect world that in reality, rarely exists. When we have this, we can then look at what steps we are going to take to get there. This allows us to have a firm "North Star" in mind, and with every step, re-assess not only whether that's the same direction we want to keep going in, but whether or not any solutions will take us closer towards, or further away from it. At this stage, we can and should also write down the success criteria - in other words, how will we know this is working? Next up is sketching out ideas for how the interface will look. Coming up with lots of ideas at this point is really useful. The first idea you have is rarely the best, so it's good to try and get a lot of ideas on to paper so that you can figure out the best ones. One technique you can use is to try to come up with 6 different solutions to a problem. And if you're struggling to come up with all 6, then try things like solving the problem the opposite way to the last idea, or something completely wacky. It's amazing how useful this can be. Sometimes, the right idea is just a tiny bit to the side of the absolutely wrong way of doing a thing. Sketching doesn't need to be just done by designers, and you certainly don't need to be an artist. As long as you can draw boxes and arrows, and your handwriting is neat enough that you can read it afterwards, you're good. The point of a sketch is to communicate an idea. If everyone you're working with can understand what you're trying to describe with the sketch, then that's all it needs to do. Once you've got more of an idea of what the solution will be, and talked that over with anyone who needs to be involved (Product Managers, Engineers, Testers, Users) then you can move on to more high fidelity designs. These are called mockups and they show what the user interface could look like, once it's been built. Even at this stage, changes - known as iterations - can and will still happen, because at every point you're finding out more and more and refining your idea, until you get to the point where it's built and in the hands of your users. How does your UX work fit in with the wider software development project? In a good team, UX people are involved the whole way through, from the first ideas, through research, exploration of solutions right to the end when the product is out in the world. That said, user experience isn't just the responsibility of people with UX in their job titles. Everyone has a part to play in delivering a good user experience to the people using the product. What advice would you give to people doing UX for the first time? If a good carpenter's rule is "measure twice, cut once" a good rule for UX people is "listen more than you talk". Do your research. Find out about the people who will be using the product. What they need. What they want. What problems they've currently got. How they work. Then keep talking to them as you design and build. Is there anything else we should know about UX that's not been covered by your answers to the above? There's a great Shaker proverb which says: "Don't make something unless it is both made necessary and useful; but if it is both necessary and useful, don't hesitate to make it beautiful." This gives you a great set of questions to ask of yourself whenever you're approaching a project. Necessary: 1. what problem are we trying to solve? 2. is the proposed solution needed (can it be solved a different way?) 3. will it solve the problem? Useful (and usable): 4. does the solution solve the problem for the people who need it? 5. does it work well? Beautiful: 6. does it look good? (beautiful things make people happy!) UX and Mu ========= The "story so far" of Mu and UX starts with Carrie Anne Philbin's (director of education at the Raspberry Pi Foundation) `keynote address to EuroPython 2015 `_. This formed the basis for usability decisions when Mu was first created. While running workshops to test a browser based editor for the BBC's micro:bit, we'd heard from teachers that while the browser was very convenient in terms of setting things up, it was a pain to have to continually download scripts and then copy them onto the device and they also wanted easy access to MicroPython's REPL. I wondered "how hard can it be?" and set out to create an editor based on Carrie Anne's comments about the needs of teachers and learners when it came to code editing. Halfway into the keynote Carrie Anne talks about a development environments for beginner programmers in Python: .. raw:: html

She starts by explaining the problems with online editors. Often they require users to sign up, thus excluding a large number of children who, for legal (child protection) reasons, are not allowed to sign up because they have not reached the minimum age (usually around 14 years old) for them to be allowed to create their own accounts. Online editors introduce bureaucratic problems too: often schools use a "whitelist" system with their firewalls - they block everything except those sites on the whitelist. Getting a site onto the school's whitelist is often an onerously bureaucratic and slow task. Furthermore, assuming the website is available, many online editors expect their users to have access to modern hardware and browsers. This is often not the case and intractable technical problems result. Finally, a significant minority of children still don't have access to the internet, even in relatively advanced countries like the UK. For these reasons, a native developmnet environment is preferred. Carrie Anne then explores two offerings for students to use as native code editors. PyCharm has an educational edition that is both free and open. However, Carrie Anne claims it's not very obvious for either beginner developers or teachers how best to use the application. She mentions there are too many opportunities for users to fail because of the plethora of buttons and menus. As a teacher, she wants something simple and obvious. Next, she turns her attention to Idle - the editor that comes bundled with Python. It's good that Idle is free, has some syntax highlighting, auto-indents Python code, is cross platform, leightweight and simple. However, there are no line numbers, error reporting is incomrehensible to beginners and, most importantly, there are two separate windows that often get lost or confused with each other (one for code, the other for a sort of REPL). She suggests we turn out attention to a project called `SonicPi `_, a sort of programmable music tool for the Raspberry Pi, as an example of the sorts of features teachers and learners desire in a coding environment. She enumerates features that may not immediately seem important for beginner programmers and teachers. * All the panels are in the same window and it's obvious what each one does. * There's built-in help. * There are a limited number of obviously named buttons that encompass the core tasks required of the user. * Zooming in and out is a killer feature for teachers. * Simple things like line numbers and help for aligning code make a huge difference. Finally, she challenges the audience by asking, "Why can't we have something like that for Python?" Being of a teacher-ish disposition she sets the assembled conference homework to be due in 2016. When I started work on Mu I watched the video mentioned above and sketched a rough outline of how Mu might work in terms of usability, reproduced below. .. image:: mu_sketch.jpg Notice that while the details are obviously different, the core interface looks like Mu (if you're wondering what "micro:ed" refers to - it was Mu's original name until the BBC got shirty about it and I changed it to Mu). I simply took Carrie Anne's suggestions and made the simplest thing possible. Since then I've interviewed many teachers, observed lots of lessons and workshops and gathered feedback from users online. Changes to the usability of Mu generally follow a pattern: * We find evidence of several people wanting a change to make their lives easier (we tend to ignore single case exacmples of desired changes). * We use our issue tracking system built into GitHub as a way to come up with a tangible plan. * We create the simplest possible solution and ask for feedback. * Iterate! Resources for UX ================ In addition to providing answers about UX, Ann very kindly pointed me to various resources on the web that helped me to understand the challenges and work needed to do actionable UX research. Andrew Travers has `blogged about `_ a free pocket guide he has written on `interviewing for research `_. I found this invaluable reading and helped me to prepare for the observations and interviews I conducted as part of the process of developing Mu. This is where I would start if I were new to UX research and wanted to get a quick overview of things to do. The Government Digital Service of the UK Government has an international reputation for software development greatness. The foundation of this reputation are the documents it releases, for free, that outline the "best practices" and expectations about process that GDS have about various aspects of the software development process. Their `service manual on user research `_ is a comprehensive outline of the various tasks, processes and outcomes needed to do effective UX research. I particularly found the section on `analysis of UX research `_ helpful. Finally, it's good to read the suggestions, heuristics and best practice for working with users who have additional requirements when using software. Again, the UK government's GDS has a number of resources, although I found this blog post on the `Dos and don'ts on designing for accessibility `_ (and the associated posters) to be a rich seam of useful advice. All their resources in this context can be found on their page about `accessibility and assisted digital `_. Mu has a long way to go on its path to being an inclusive and accessible code editor, but what is certain is that UX is a core driver of this journey. mu-editor-1.0.2+dfsg/docs/website.rst000066400000000000000000000152721341747546300175070ustar00rootroot00000000000000Developing Mu's Website ----------------------- The purpose of Mu's main website `https://codewith.mu/ `_ is to provide four things: * Instructions for getting Mu. * Learning oriented tutorials to show users how to get started with Mu. * Goal oriented "how-to" guides that show how to solve a specific problems or achieve particular tasks. * Links to other community-related resources such as the developer documentation you're reading right now, and online community discussions. The site itself is hosted for free on `GitHub Pages `_ as a `Jekyll created static site `_. The source code is found in the `mu-editor.github.io `_ repository. As soon as a new change lands in the master branch of the site's repository, GitHub automatically rebuilds the site and deploys it. This means everything is simple and automated. We expect everyone participating in the development of the website to act in accordance with the PSF's :doc:`code_of_conduct`. Developer Setup +++++++++++++++ 1. Follow the instructions for your operating system to install the `Jekyll static site generator `_. 2. Get the source code from GitHub:: git clone https://github.com/mu-editor/mu-editor.github.io.git 3. From within the root directory of the website's source code, use Jekyll to build and serve the site locally:: jekyll serve 4. Point your browser to `http://127.0.0.1:4000 `_ to see the locally running version. As you make changes to the website's source, Jekyll will automatically update the locally running version so you'll immediately see your updates. .. warning:: If the instructions above don't work, and since Jekyll isn't supported for all environments, a `Vagrant `_ image can be used for instead. Assuming you have Vagrant installed:: git clone https://github.com/lcreid/rails-5-jade.git cd rails-5-jade vagrant up vagrant ssh git clone https://github.com/mu-editor/mu-editor.github.io.git cd mu-editor.github.io bundle install jekyll serve --host 0.0.0.0 --force_polling You may need to restart your VM to ensure the port forwarding works properly. The source code is arranged as a typical Jekyll website except it's not a blog, so there are no articles in the ``_posts`` directory. Since we need our website to be easily translatable all the content will be in a directory named after the ISO language code of the translation. For example, all the original English content is in the ``en`` directory in the root of the repository. All images should be in the ``img`` directory. If an image is for a specific translation of the website, it should be in a subdirectory of ``img`` which is named after the ISO language code (for example, as there is for ``img/en``). .. image:: awesome.gif We use GIF based screen captures throughout the site (such as on the front page). The dimensions for such captures of Mu are 1140x660 pixels and must not include the window title bar (provided by the operating system). So far, we have found the `peek `_ utility on Linux an excellent choice for making such GIF based screen captures. When adding such animated screen grabs please ensure the ``img`` element has the following classes (for the sake of visual consistency): ``img-responsive center-block img-rounded movie``. Internationalisation of the Website +++++++++++++++++++++++++++++++++++ There are two ways to contribute to the translation of Mu's website: * Add / update existing content for your target language. * Start a completely new translation for your target language. When adding content to an existing translation of the website please remember that files can be either HTML or Markdown. At the top of each file is a YAML based header that must contain three entries: ``layout`` which must always be ``default``, ``title`` which should be the title of the page you're creating and ``i18n`` which much be the ISO language code for your translation (this is used so the correctly translated version of the site's menu is displayed). For example, the YAML header for the ``index.html`` site in the ``en`` sub-directory looks like this:: --- layout: default title: Code With Mu i18n: en --- The workflow for creating a new translation of the website is: 1. Create a new directory named after the `ISO language code `_ for the new translation. For example, if we were creating a new French translation of the site, we'd create a ``fr`` directory in the root of the repository. 2. Ensure there's a version of the ``index.html`` file found in the root of the repository, translated into the target language in the new directory you created in step 1. Also ensure you copy the structure of the main sections of the website found in the ``en`` version of the site. 3. In the ``_includes`` directory found in the root of the repository, you must add the new language as a list item in the ``lang_list.html`` template. Ensure that the href for the link points to the new directory, and the name of the translation is in the target language. For example, this is how an entry for French would look (note the use of the French word for "French"):: 4. In the same ``_includes`` directory, create a copy of the ``nav_en.html`` but with the ``en`` section of the name replaced with the ISO code for the new target language. For example, if we were to do this for a French translation, our new file would be called ``nav_fr.html``. This file defines how the site's navigation bar should look. Make sure you translate the English version into your target language and remember to update the href values to use the new directory created in step 1. 5. Remember that the YAML headers for your new translation should have an ``i18n`` value with the expected ISO language code for the new target language. For example, if we were writing a new page for the French translation, the ``i18n`` entry would have the value ``fr``. Assuming you followed all the steps above, you should see your new language in the "language" dropdown in the site navigation. Clicking on it should take you to the ``index.html`` page in the new directory you created for the target language, and the site navigation should reflect the newly translated navigation template. From this point on, it's just a case of adding content to the newly translated version of the site in much the same way as it is done in the "default" ``en`` directory. mu-editor-1.0.2+dfsg/make.cmd000066400000000000000000000000211341747546300157470ustar00rootroot00000000000000python make.py %*mu-editor-1.0.2+dfsg/make.py000066400000000000000000000177061341747546300156560ustar00rootroot00000000000000#!python3 import os import sys import fnmatch import shutil import subprocess PYTEST = "pytest" PYFLAKES = "pyflakes" PYCODESTYLE = "pycodestyle" PYGETTEXT = os.path.join(sys.base_prefix, "tools", "i18n", "pygettext.py") INCLUDE_PATTERNS = { "*.py" } EXCLUDE_PATTERNS = { "build/*", "docs/*", "mu/contrib/*", "mu/modes/api/*", "utils/*", } _exported = {} def _walk( start_from=".", include_patterns=None, exclude_patterns=None, recurse=True ): if include_patterns: _include_patterns = set(os.path.normpath(p) for p in include_patterns) else: _include_patterns = set() if exclude_patterns: _exclude_patterns = set(os.path.normpath(p) for p in exclude_patterns) else: _exclude_patterns = set() for dirpath, dirnames, filenames in os.walk(start_from): for filename in filenames: filepath = os.path.normpath(os.path.join(dirpath, filename)) if not any(fnmatch.fnmatch(filepath, pattern) for pattern in _include_patterns): continue if any(fnmatch.fnmatch(filepath, pattern) for pattern in _exclude_patterns): continue yield filepath if not recurse: break def _process_code(executable, use_python, *args): """Perform some action (check, translate etc.) across the .py files in the codebase, skipping docs and build artefacts """ if use_python: execution = ["python", executable] else: execution = [executable] returncodes = set() for filepath in _walk(".", INCLUDE_PATTERNS, EXCLUDE_PATTERNS, False): p = subprocess.run(execution + [filepath] + list(args)) returncodes.add(p.returncode) for filepath in _walk("mu", INCLUDE_PATTERNS, EXCLUDE_PATTERNS): p = subprocess.run(execution + [filepath] + list(args)) returncodes.add(p.returncode) for filepath in _walk("tests", INCLUDE_PATTERNS, EXCLUDE_PATTERNS): p = subprocess.run(execution + [filepath] + list(args)) returncodes.add(p.returncode) return max(returncodes) def _rmtree(dirpath, cascade_errors=False): try: shutil.rmtree(dirpath) except OSError: if cascade_errors: raise def _rmfiles(start_from, pattern): """Remove files from a directory and its descendants Starting from `start_from` directory and working downwards, remove all files which match `pattern`, eg *.pyc """ for filepath in _walk(start_from, {pattern}): os.remove(filepath) def export(function): """Decorator to tag certain functions as exported, meaning that they show up as a command, with arguments, when this file is run. """ _exported[function.__name__] = function return function @export def test(*pytest_args): """Run the test suite Call py.test to run the test suite with additional args. The subprocess runner will raise an exception if py.test exits with a failure value. This forces things to stop if tests fail. """ print("\ntest") return subprocess.run([PYTEST] + list(pytest_args)).returncode @export def coverage(): """View a report on test coverage Call py.test with coverage turned on """ print("\ncoverage") return subprocess.run([ PYTEST, "--cov-config", ".coveragerc", "--cov-report", "term-missing", "--cov=mu", "tests/" ]).returncode @export def pyflakes(*pyflakes_args): """Run the PyFlakes code checker Call pyflakes on all .py files outside the docs and contrib directories """ print("\npyflakes") os.environ["PYFLAKES_BUILTINS"] = "_" return _process_code(PYFLAKES, False, *pyflakes_args) @export def pycodestyle(*pycodestyle_args): """Run the PEP8 style checker """ print("\nPEP8") args = ("--ignore=E731,E402,W504",) + pycodestyle_args return _process_code(PYCODESTYLE, False, *args) @export def pep8(*pep8_args): """Run the PEP8 style checker """ return pycodestyle(*pep8_args) @export def check(): """Run all the checkers and tests """ print("\nCheck") funcs = [ clean, pyflakes, pycodestyle, coverage ] for func in funcs: return_code = func() if return_code != 0: return return_code return 0 @export def clean(): """Reset the project and remove auto-generated assets """ print("\nClean") _rmtree("build") _rmtree("dist") _rmtree("mu.egg-info") _rmtree("coverage") _rmtree("docs/build") _rmtree("lib") _rmtree("pynsist_pkgs") _rmfiles(".", "*.pyc") return 0 @export def translate(): """Translate """ if not os.path.exists(PYGETTEXT): raise RuntimeError("pygettext.py could not be found at %s" % PYGETTEXT) result = _process_code(PYGETTEXT, True) print("\nNew messages.pot file created.") print("Remember to update the translation strings" "found in the locale directory.") return result @export def translateall(): """Translate All The Things """ if not os.path.exists(PYGETTEXT): raise RuntimeError("pygettext.py could not be found at %s" % PYGETTEXT) result = subprocess.run([ "python", PYGETTEXT, "mu/*", "mu/debugger/*", "mu/modes/*", "mu/resources/*" ]).returncode print("\nNew messages.pot file created.") print("Remember to update the translation strings" "found in the locale directory.") return result @export def run(): """Run Mu from within a virtual environment """ clean() if not os.environ.get("VIRTUAL_ENV"): raise RuntimeError("Cannot run Mu;" "your Python virtualenv is not activated") return subprocess.run(["python", "-m", "mu"]).returncode @export def dist(): """Generate a source distribution and a binary wheel """ check() print("Checks pass; good to package") return subprocess.run( ["python", "setup.py", "sdist", "bdist_wheel"] ).returncode @export def publish_test(): """Upload to a test PyPI """ dist() print("Packaging complete; upload to PyPI") return subprocess.run([ "twine", "upload", "-r", "test", "--sign", "dist/*"] ).returncode @export def publish_live(): """Upload to PyPI """ dist() print("Packaging complete; upload to PyPI") return subprocess.run(["twine", "upload", "--sign", "dist/*"]).returncode @export def win32(): """Build 32-bit Windows installer """ check() print("Building 32-bit Windows installer") return subprocess.run(["python", "win_installer.py", "32"]).returncode @export def win64(): """Build 64-bit Windows installer """ check() print("Building 64-bit Windows installer") return subprocess.run(["python", "win_installer.py", "64"]).returncode @export def docs(): """Build the docs """ cwd = os.getcwd() os.chdir("docs") try: return subprocess.run(["cmd", "/c", "make.bat", "html"]).returncode except Exception: return 1 finally: os.chdir(cwd) @export def help(): """Display all commands with their description in alphabetical order """ module_doc = sys.modules['__main__'].__doc__ or "check" print(module_doc + "\n" + "=" * len(module_doc) + "\n") for command, function in sorted(_exported.items()): doc = function.__doc__ if doc: first_line = doc.splitlines()[0] else: first_line = "" print("make {} - {}".format(command, first_line)) def main(command="help", *args): """Dispatch on command name, passing all remaining parameters to the module-level function. """ try: function = _exported[command] except KeyError: raise RuntimeError("No such command: %s" % command) else: return function(*args) if __name__ == '__main__': sys.exit(main(*sys.argv[1:])) mu-editor-1.0.2+dfsg/mu/000077500000000000000000000000001341747546300147755ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/__init__.py000066400000000000000000000007641341747546300171150ustar00rootroot00000000000000import gettext import os from . import localedetect # Configure locale and language # Define where the translation assets are to be found. localedir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'locale')) language_code = localedetect.language_code() # DEBUG/TRANSLATE: override the language code here (e.g. to Chinese). # language_code = 'zh' gettext.translation('mu', localedir=localedir, languages=[language_code], fallback=True).install() __version__ = '1.0.2' mu-editor-1.0.2+dfsg/mu/__main__.py000066400000000000000000000001271341747546300170670ustar00rootroot00000000000000from mu.app import run def main(): run() if __name__ == "__main__": main() mu-editor-1.0.2+dfsg/mu/app.py000066400000000000000000000144421341747546300161340ustar00rootroot00000000000000""" Mu - a "micro" Python editor for beginner programmers. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). Based upon work done for Puppy IDE by Dan Pope, Nicholas Tollervey and Damien George. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import logging from logging.handlers import TimedRotatingFileHandler import os import platform import pkgutil import sys from PyQt5.QtCore import QTimer, Qt from PyQt5.QtWidgets import QApplication, QSplashScreen from mu import __version__, language_code from mu.logic import Editor, LOG_FILE, LOG_DIR, DEBUGGER_PORT, ENCODING from mu.interface import Window from mu.resources import load_pixmap, load_icon from mu.modes import (PythonMode, AdafruitMode, MicrobitMode, DebugMode, PyGameZeroMode) from mu.debugger.runner import run as run_debugger from mu.interface.themes import NIGHT_STYLE, DAY_STYLE, CONTRAST_STYLE def setup_logging(): """ Configure logging. """ if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) # set logging format log_fmt = ('%(asctime)s - %(name)s:%(lineno)d(%(funcName)s) ' '%(levelname)s: %(message)s') formatter = logging.Formatter(log_fmt) # define log handlers such as for rotating log files handler = TimedRotatingFileHandler(LOG_FILE, when='midnight', backupCount=5, delay=0, encoding=ENCODING) handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) # set up primary log log = logging.getLogger() log.setLevel(logging.DEBUG) log.addHandler(handler) sys.excepthook = excepthook print(_('Logging to {}').format(LOG_FILE)) def setup_modes(editor, view): """ Create a simple dictionary to hold instances of the available modes. *PREMATURE OPTIMIZATION ALERT* This may become more complex in future so splitting things out here to contain the mess. ;-) """ modes = { 'python': PythonMode(editor, view), 'adafruit': AdafruitMode(editor, view), 'microbit': MicrobitMode(editor, view), 'debugger': DebugMode(editor, view), } # Check if pgzero is available (without importing it) if any([m for m in pkgutil.iter_modules() if 'pgzero' in m]): modes['pygamezero'] = PyGameZeroMode(editor, view) # return available modes return modes def excepthook(*exc_args): """ Log exception and exit cleanly. """ logging.error('Unrecoverable error', exc_info=(exc_args)) sys.__excepthook__(*exc_args) sys.exit(1) def run(): """ Creates all the top-level assets for the application, sets things up and then runs the application. Specific tasks include: - set up logging - create an application object - create an editor window and status bar - display a splash screen while starting - close the splash screen after startup timer ends """ setup_logging() logging.info('\n\n-----------------\n\nStarting Mu {}'.format(__version__)) logging.info(platform.uname()) logging.info('Python path: {}'.format(sys.path)) logging.info('Language code: {}'.format(language_code)) # The app object is the application running on your computer. app = QApplication(sys.argv) # By default PyQt uses the script name (run.py) app.setApplicationName('mu') # Set hint as to the .desktop files name app.setDesktopFileName('mu.codewith.editor') app.setApplicationVersion(__version__) app.setAttribute(Qt.AA_DontShowIconsInMenus) # Images (such as toolbar icons) aren't scaled nicely on retina/4k displays # unless this flag is set app.setAttribute(Qt.AA_UseHighDpiPixmaps) # Create the "window" we'll be looking at. editor_window = Window() @editor_window.load_theme.connect def load_theme(theme): if theme == 'contrast': app.setStyleSheet(CONTRAST_STYLE) elif theme == 'night': app.setStyleSheet(NIGHT_STYLE) else: app.setStyleSheet(DAY_STYLE) # Make sure all windows have the Mu icon as a fallback app.setWindowIcon(load_icon(editor_window.icon)) # Create the "editor" that'll control the "window". editor = Editor(view=editor_window) editor.setup(setup_modes(editor, editor_window)) # Setup the window. editor_window.closeEvent = editor.quit editor_window.setup(editor.debug_toggle_breakpoint, editor.theme) # Restore the previous session along with files passed by the os editor.restore_session(sys.argv[1:]) # Connect the various UI elements in the window to the editor. editor_window.connect_tab_rename(editor.rename_tab, 'Ctrl+Shift+S') editor_window.connect_find_replace(editor.find_replace, 'Ctrl+F') editor_window.connect_toggle_comments(editor.toggle_comments, 'Ctrl+K') status_bar = editor_window.status_bar status_bar.connect_logs(editor.show_admin, 'Ctrl+Shift+D') # Display a friendly "splash" icon. splash = QSplashScreen(load_pixmap('splash-screen')) splash.show() # Hide the splash icon. splash_be_gone = QTimer() splash_be_gone.timeout.connect(lambda: splash.finish(editor_window)) splash_be_gone.setSingleShot(True) splash_be_gone.start(2000) # Stop the program after the application finishes executing. sys.exit(app.exec_()) def debug(): """ Create a debug runner in a new process. This is what the Mu debugger will drive. Uses the filename and associated args found in sys.argv. """ if len(sys.argv) > 1: filename = os.path.normcase(os.path.abspath(sys.argv[1])) args = sys.argv[2:] run_debugger('localhost', DEBUGGER_PORT, filename, args) else: print(_("Debugger requires a Python script filename to run.")) mu-editor-1.0.2+dfsg/mu/contrib/000077500000000000000000000000001341747546300164355ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/contrib/__init__.py000066400000000000000000000000001341747546300205340ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/contrib/microfs.py000066400000000000000000000251351341747546300204570ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ This module contains functions for running remote commands on the BBC micro:bit relating to file system based operations. You may: * ls - list files on the device. Based on the equivalent Unix command. * rm - remove a named file on the device. Based on the Unix command. * put - copy a named local file onto the device a la equivalent FTP command. * get - copy a named file from the device to the local file system a la FTP. """ from __future__ import print_function import ast import argparse import sys import os import time import os.path from serial.tools.list_ports import comports as list_serial_ports from serial import Serial PY2 = sys.version_info < (3,) __all__ = ['ls', 'rm', 'put', 'get', 'get_serial'] #: The help text to be shown when requested. _HELP_TEXT = """ Interact with the basic filesystem on a connected BBC micro:bit device. You may use the following commands: 'ls' - list files on the device (based on the equivalent Unix command); 'rm' - remove a named file on the device (based on the Unix command); 'put' - copy a named local file onto the device just like the FTP command; and, 'get' - copy a named file from the device to the local file system a la FTP. For example, 'ufs ls' will list the files on a connected BBC micro:bit. """ COMMAND_LINE_FLAG = False # Indicates running from the command line. def find_microbit(): """ Returns a tuple representation of the port and serial number for a connected micro:bit device. If no device is connected the tuple will be (None, None). """ ports = list_serial_ports() for port in ports: if "VID:PID=0D28:0204" in port[2].upper(): return (port[0], port.serial_number) return (None, None) def raw_on(serial): """ Puts the device into raw mode. """ # Send CTRL-B to end raw mode if required. serial.write(b'\x02') # Send CTRL-C three times between pauses to break out of loop. for i in range(3): serial.write(b'\r\x03') time.sleep(0.01) # Flush input (without relying on serial.flushInput()) n = serial.inWaiting() while n > 0: serial.read(n) n = serial.inWaiting() # Go into raw mode with CTRL-A. serial.write(b'\r\x01') # Flush data = serial.read_until(b'raw REPL; CTRL-B to exit\r\n>') if not data.endswith(b'raw REPL; CTRL-B to exit\r\n>'): if COMMAND_LINE_FLAG: print(data) raise IOError('Could not enter raw REPL.') # Soft Reset with CTRL-D serial.write(b'\x04') data = serial.read_until(b'soft reboot\r\n') if not data.endswith(b'soft reboot\r\n'): if COMMAND_LINE_FLAG: print(data) raise IOError('Could not enter raw REPL.') data = serial.read_until(b'raw REPL; CTRL-B to exit\r\n>') if not data.endswith(b'raw REPL; CTRL-B to exit\r\n>'): if COMMAND_LINE_FLAG: print(data) raise IOError('Could not enter raw REPL.') def raw_off(serial): """ Takes the device out of raw mode. """ serial.write(b'\x02') # Send CTRL-B to get out of raw mode. def get_serial(): """ Detect if a micro:bit is connected and return a serial object to talk to it. """ port, serial_number = find_microbit() if port is None: raise IOError('Could not find micro:bit.') return Serial(port, 115200, timeout=1, parity='N') def execute(commands, serial=None): """ Sends the command to the connected micro:bit via serial and returns the result. If no serial connection is provided, attempts to autodetect the device. For this to work correctly, a particular sequence of commands needs to be sent to put the device into a good state to process the incoming command. Returns the stdout and stderr output from the micro:bit. """ close_serial = False if serial is None: serial = get_serial() close_serial = True time.sleep(0.1) result = b'' raw_on(serial) time.sleep(0.1) # Write the actual command and send CTRL-D to evaluate. for command in commands: command_bytes = command.encode('utf-8') for i in range(0, len(command_bytes), 32): serial.write(command_bytes[i:min(i + 32, len(command_bytes))]) time.sleep(0.01) serial.write(b'\x04') response = serial.read_until(b'\x04>') # Read until prompt. out, err = response[2:-2].split(b'\x04', 1) # Split stdout, stderr result += out if err: return b'', err time.sleep(0.1) raw_off(serial) if close_serial: serial.close() time.sleep(0.1) return result, err def clean_error(err): """ Take stderr bytes returned from MicroPython and attempt to create a non-verbose error message. """ if err: decoded = err.decode('utf-8') try: return decoded.split('\r\n')[-2] except Exception: return decoded return 'There was an error.' def ls(serial=None): """ List the files on the micro:bit. If no serial object is supplied, microfs will attempt to detect the connection itself. Returns a list of the files on the connected device or raises an IOError if there's a problem. """ out, err = execute([ 'import os', 'print(os.listdir())', ], serial) if err: raise IOError(clean_error(err)) return ast.literal_eval(out.decode('utf-8')) def rm(filename, serial=None): """ Removes a referenced file on the micro:bit. If no serial object is supplied, microfs will attempt to detect the connection itself. Returns True for success or raises an IOError if there's a problem. """ commands = [ "import os", "os.remove('{}')".format(filename), ] out, err = execute(commands, serial) if err: raise IOError(clean_error(err)) return True def put(filename, target=None, serial=None): """ Puts a referenced file on the LOCAL file system onto the file system on the BBC micro:bit. If no serial object is supplied, microfs will attempt to detect the connection itself. Returns True for success or raises an IOError if there's a problem. """ if not os.path.isfile(filename): raise IOError('No such file.') with open(filename, 'rb') as local: content = local.read() filename = os.path.basename(filename) if target is None: target = filename commands = [ "fd = open('{}', 'wb')".format(target), "f = fd.write", ] while content: line = content[:64] if PY2: commands.append('f(b' + repr(line) + ')') else: commands.append('f(' + repr(line) + ')') content = content[64:] commands.append('fd.close()') out, err = execute(commands, serial) if err: raise IOError(clean_error(err)) return True def get(filename, target=None, serial=None): """ Gets a referenced file on the device's file system and copies it to the target (or current working directory if unspecified). If no serial object is supplied, microfs will attempt to detect the connection itself. Returns True for success or raises an IOError if there's a problem. """ if target is None: target = filename commands = [ "from microbit import uart", "f = open('{}', 'rb')".format(filename), "r = f.read", "result = True", "while result:\n result = r(32)\n if result:\n uart.write(result)\n", "f.close()", ] out, err = execute(commands, serial) if err: raise IOError(clean_error(err)) # Recombine the bytes while removing "b'" from start and "'" from end. with open(target, 'wb') as f: f.write(out) return True def version(serial=None): """ Returns version information for MicroPython running on the connected device. If such information is not available or the device is not running MicroPython, raise a ValueError. If any other exception is thrown, the device was running MicroPython but there was a problem parsing the output. """ try: out, err = execute([ 'import os', 'print(os.uname())', ], serial) if err: raise ValueError(clean_error(err)) except ValueError: # Re-raise any errors from stderr raised in the try block. raise except Exception: # Raise a value error to indicate unable to find something on the # microbit that will return parseable information about the version. # It doesn't matter what the error is, we just need to indicate a # failure with the expected ValueError exception. raise ValueError() raw = out.decode('utf-8').strip() raw = raw[1:-1] items = raw.split(', ') result = {} for item in items: key, value = item.split('=') result[key] = value[1:-1] return result def main(argv=None): """ Entry point for the command line tool 'ufs'. Takes the args and processes them as per the documentation. :-) Exceptions are caught and printed for the user. """ if not argv: argv = sys.argv[1:] try: global COMMAND_LINE_FLAG COMMAND_LINE_FLAG = True parser = argparse.ArgumentParser(description=_HELP_TEXT) parser.add_argument('command', nargs='?', default=None, help="One of 'ls', 'rm', 'put' or 'get'.") parser.add_argument('path', nargs='?', default=None, help="Use when a file needs referencing.") parser.add_argument('target', nargs='?', default=None, help="Use to specify a target filename.") args = parser.parse_args(argv) if args.command == 'ls': list_of_files = ls() if list_of_files: print(' '.join(list_of_files)) elif args.command == 'rm': if args.path: rm(args.path) else: print('rm: missing filename. (e.g. "ufs rm foo.txt")') elif args.command == 'put': if args.path: put(args.path, args.target) else: print('put: missing filename. (e.g. "ufs put foo.txt")') elif args.command == 'get': if args.path: get(args.path, args.target) else: print('get: missing filename. (e.g. "ufs get foo.txt")') else: # Display some help. parser.print_help() except Exception as ex: # The exception of no return. Print exception information. print(ex) mu-editor-1.0.2+dfsg/mu/debugger/000077500000000000000000000000001341747546300165615ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/debugger/client.py000066400000000000000000000342201341747546300204120ustar00rootroot00000000000000""" A debug client for the Mu editor. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import json import socket import time import logging import os.path from PyQt5.QtCore import QObject, QThread, pyqtSignal logger = logging.getLogger(__name__) class UnknownBreakpoint(Exception): """ The client encountered an unknown breakpoint. """ pass class ConnectionNotBootstrapped(Exception): """ The connection to the runner hasn't been completed. """ pass class Breakpoint: """ Represents a breakpoint, identified by a breakpoint number (bpnum). Users set breakpoints to stop the debugger at a certain line (potentially in a named function) in a file. """ def __init__(self, bpnum, filename, line, enabled=True, temporary=False, funcname=None): self.bpnum = bpnum self.filename = filename self.line = line self.enabled = enabled self.temporary = temporary self.funcname = funcname def __str__(self): return '{}:{}'.format(self.filename, self.line) class CommandBufferHandler(QObject): """ Represents the work to be done on a separate thread for connecting and processing incoming messages. Emits signals to indicate when messages are receievd or the connection fails at appropriate moments during the lifetime of a debug session. """ on_command = pyqtSignal(str) #: Signal emitted when a command is received. on_fail = pyqtSignal(str) #: Emitted when there was a connection failure. def __init__(self, debugger): """ Receive the debugger object containing the configuration attributes and socket for inter-process communication with the debug runner. """ super().__init__() self.debugger = debugger self.stopped = False def worker(self): """ Buffer input from a socket, emit complete debugger commands as signals. """ connected = False tries = 0 connection_attempts = 50 # Translates to 10 seconds. pause_between_attempts = 0.2 while not connected: try: self.debugger.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.debugger.socket.connect((self.debugger.host, self.debugger.port)) connected = True except ConnectionRefusedError: # Allow up to connection_attempts attempts to connect. # The Raspberry Pi is quite slow, so Mu needs to give the # debug runner enough time to start up and start listening. tries += 1 if tries >= connection_attempts: self.on_fail.emit(_('Connection timed out. Is your ' 'machine slow or busy? Free up some ' "of the machine's resources and try " "again.")) return time.sleep(pause_between_attempts) except OSError: # This will catch address related errors. Especially on OSX # this is usually solved by adding "127.0.0.1 localhost" to # /etc/hosts. self.on_fail.emit(_('Could not find localhost.\n' "Ensure you have '127.0.0.1 localhost' in " "your /etc/hosts file.")) return # Getting here means the connection has been established, so handle all # incoming data from the debug runner process. remainder = b'' while not self.stopped: new_buffer = None try: new_buffer = self.debugger.socket.recv(1024) except Exception: # Stop if there's any failure in receiving data from the # runner. self.stopped = True if new_buffer: if new_buffer.endswith(self.debugger.ETX): terminator = self.debugger.ETX pos = new_buffer.rfind(self.debugger.ETX) full_buffer = remainder + new_buffer[:pos] else: terminator = None full_buffer = remainder + new_buffer commands = full_buffer.split(self.debugger.ETX) if terminator is None: remainder = commands.pop() else: remainder = b'' for command in commands: command = command.decode('utf-8') logger.debug(command) self.on_command.emit(command) else: # If recv() returns None, the socket is closed. logger.debug('Debug client closed.') break class Debugger(QObject): """ Represents the networked debugger client. """ ETX = b'\x03' # End transmission token. def __init__(self, host, port, proc=None): """ Instantiate given a host, port and process for the debug runner. """ self.host = host self.port = port self.proc = proc self.view = None # Set after instantiation. super().__init__() def start(self): """ Start the debugger session. """ self.listener_thread = QThread(self.view.view) self.command_handler = CommandBufferHandler(self) self.command_handler.moveToThread(self.listener_thread) self.command_handler.on_command.connect(self.on_command) self.command_handler.on_fail.connect(self.on_fail) self.listener_thread.started.connect(self.command_handler.worker) self.listener_thread.start() def on_command(self, command): """ Handle a command emitted by the client thread. """ event, data = json.loads(command) if hasattr(self, 'on_{}'.format(event)): getattr(self, 'on_{}'.format(event))(**data) def on_fail(self, message): """ Handle if there's a connection failure with the debug runner. """ logger.error(message) self.view.debug_on_fail(message) def stop(self): """ Shut down the debugger session. """ self.command_handler.stopped = True self.listener_thread.quit() self.listener_thread.wait() if self.proc is not None: self.output('quit') self.socket.shutdown(socket.SHUT_WR) if self.proc is not None: # Wait for the runner process to die. self.proc.wait() def output(self, event, **data): """ Send a command to the debug runner. """ try: dumped = json.dumps((event, data)).encode('utf-8') self.socket.sendall(dumped + Debugger.ETX) except OSError as e: logger.debug('Debugger client error.') logger.debug(e) except AttributeError as e: logger.debug('Debugger client not connected to runner.') logger.debug(e) def breakpoint(self, breakpoint): """ Given a breakpoint number or (filename, line), return an object representing the referenced breakpoint. """ try: if isinstance(breakpoint, tuple): filename, line = breakpoint filename = os.path.normcase(os.path.abspath(filename)) return self.bp_index[filename][line] else: return self.bp_list[breakpoint] except KeyError: raise UnknownBreakpoint() def breakpoints(self, filename): """ Return all the breakpoints associated with the referenced file. """ normalised = os.path.normcase(os.path.abspath(filename)) return self.bp_index.get(normalised, {}) # Commands that can be passed to the debug runner. def create_breakpoint(self, filename, line, temporary=False): """ Create a new, enabled breakpoint at the specified line of the given file. """ self.output('break', filename=filename, line=line, temporary=temporary) def enable_breakpoint(self, breakpoint): """ Enable an existing breakpoint. """ self.output('enable', bpnum=breakpoint.bpnum) def disable_breakpoint(self, breakpoint): """ Disable an existing breakpoint. """ self.output('disable', bpnum=breakpoint.bpnum) def ignore_breakpoint(self, breakpoint, count): """ Ignore an existing breakpoint for "count" iterations. (N.B. Use a count of 0 to restore the breakpoint. """ self.output('ignore', bpnum=breakpoint.bpnum, count=count) def clear_breakpoint(self, breakpoint): """ Clear an existing breakpoint. """ self.output('clear', bpnum=breakpoint.bpnum) def do_run(self): """ Run the debugger until the next breakpoint. """ self.output('continue') def do_step(self): """ Step through one stack frame. """ self.output('step') def do_next(self): """ Go to the next line in the current stack frame. """ self.output('next') def do_return(self): """ Return to the previous stack frame. """ self.output('return') # Handlers for events raised by the debug runner. These generally follow # the pattern of updating state in the client object to reflect that of # the debug runner, then calling a method in the UI layer to update the # GUI to reflect the changed state. def on_bootstrap(self, breakpoints): """ The runner has finished setting up. """ self.bp_index = {} self.bp_list = list([True, ]) # Breakpoints count from 1 for bp_data in breakpoints: self.on_breakpoint_create(**bp_data) self.view.debug_on_bootstrap() def on_breakpoint_create(self, **bp_data): """ The runner has created a breakpoint. """ bp = Breakpoint(**bp_data) filename = os.path.normcase(os.path.abspath(bp.filename)) self.bp_index.setdefault(filename, {}).setdefault(bp.line, bp) self.bp_list.append(bp) if bp.enabled: self.view.debug_on_breakpoint_enable(bp) else: self.view.debug_on_breakpoint_disable(bp) def on_breakpoint_enable(self, bpnum): """ The runner has enabled the breakpoint referenced by breakpoint number. """ bp = self.bp_list[bpnum] bp.enabled = True self.view.debug_on_breakpoint_enable(bp) def on_breakpoint_disable(self, bpnum): """ The runner has disabled a breakpoint referenced by breakpoint number. """ bp = self.bp_list[bpnum] bp.enabled = False self.view.debug_on_breakpoint_disable(bp) def on_breakpoint_ignore(self, bpnum, count): """ The runner will ignore the referenced breakpoint "count" iterations. """ bp = self.bp_list[bpnum] bp.ignore = count self.view.debug_on_breakpoint_ignore(bp, count) def on_breakpoint_clear(self, bpnum): """ The runner has cleared the referenced breakpoint. """ bp = self.bp_list[bpnum] self.view.debug_on_breakpoint_clear(bp) def on_stack(self, stack): """ The runner has sent an update to the stack. """ self.stack = stack self.view.debug_on_stack(stack) def on_restart(self): """ The runner has restarted. """ self.view.debug_on_restart() def on_finished(self): """ The debug runner has finished running the script to be debugged. """ self.view.debug_on_finished() def on_call(self, args): """ The runner has called a function with the specified arguments. """ self.view.debug_on_call(args) def on_return(self, retval): """ The runner has returned from a function with the specified return value. """ self.view.debug_on_return(retval) def on_line(self, filename, line): """ The runner has moved to the specified line in the referenced file. """ self.view.debug_on_line(filename, line) def on_exception(self, name, value): """ The runner has encountered a named exception with an associated value. """ msg = "Exception encountered in user's code: {} - {}" logger.info(msg.format(name, value)) self.view.debug_on_exception(name, value) def on_postmortem(self, *args, **kwargs): """ The runner encountered a fatal error and has died. """ self.view.debug_on_postmortem(args, kwargs) def on_info(self, message): """ The runner has sent an informative message. """ logger.info('Debug runner says: {}'.format(message)) self.view.debug_on_info(message) def on_warning(self, message): """ The runner has sent a warning message. """ logger.warning('Debug runner says: {}'.format(message)) self.view.debug_on_warning(message) def on_error(self, message): """ The runner has sent an error message. """ logger.error('Debug runner says: {}'.format(message)) self.view.debug_on_error(message) mu-editor-1.0.2+dfsg/mu/debugger/runner.py000066400000000000000000000423011341747546300204440ustar00rootroot00000000000000""" A debug runner for the Mu editor. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import sys import os import socket import json import bdb import linecache import logging import traceback from enum import Enum from queue import Queue from threading import Thread from mu.debugger.utils import is_breakpoint_line logger = logging.getLogger(__name__) class Restart(Exception): """ Cause the debugger to restart for the target Python program. """ pass class ClientClose(Exception): """ Cause the debugger to wait for a new client to connect. """ pass class DebugState(Enum): """ Enumerates the three possible states of a debugging session. """ NOT_STARTED = 0 STARTING = 1 STARTED = 2 def command_buffer(debugger): """ Buffer input from a socket, yield complete debugger commands. """ remainder = b'' while True: new_buffer = debugger.client.recv(1024) if new_buffer: if new_buffer.endswith(debugger.ETX): terminator = debugger.ETX pos = new_buffer.rfind(debugger.ETX) full_buffer = remainder + new_buffer[:pos] else: terminator = None full_buffer = remainder + new_buffer commands = full_buffer.split(debugger.ETX) if terminator is None: remainder = commands.pop() else: remainder = b'' for command in commands: command = command.decode('utf-8') command_data = json.loads(command) logging.debug(command_data) debugger.commands.put(command_data) else: # If recv() returns None, the socket is closed. break debugger.commands.put(('close', {})) class Debugger(bdb.Bdb): """ Instances of this class represent and drive the debugging process. """ ETX = b'\x03' # End transmission token. def __init__(self, socket, host, port, skip=None): super().__init__(skip=skip) self._run_state = DebugState.NOT_STARTED self.socket = socket self.host = host self.port = port self.mainpyfile = '' self.client = None self.command_thread = None self.commands = None self.quitting = None self.botframe = None self.stopframe = None # A flag to indicate that set_trace was called once, instead of # set_continue, in the absence of breakpoints at script start. The # flag indicates that continue means set_continue from now on. self.continue_flag = False def output(self, event, **data): """ Dumps data related to a referenced event to the socket. """ try: dumped = json.dumps((event, data)).encode('utf-8') logging.debug(dumped) self.client.sendall(dumped + Debugger.ETX) except OSError as e: logger.debug('Debugger client error.') logger.debug(e) except AttributeError as e: logger.debug('Debugger client not connected to runner.') logger.debug(e) def output_stack(self): """ Dump the current stack. If this is a normal situation, the top two frames are BDB and the runner executing the program. If there is an exception, there are two further extra frames. All these frames can be ignored. """ str_index = 0 sl = len(self.stack) # Bound check for stack length. if sl > 1 and self.stack[1][0].f_code.co_filename == '': str_index = 2 elif sl > 3 and self.stack[3][0].f_code.co_filename == '': str_index = 4 stack_data = [] if str_index > 0: for frame, line_no in self.stack[str_index:]: frame_data = ( line_no, { 'filename': frame.f_code.co_filename, 'locals': {k: repr(v) for k, v in frame.f_locals.items()}, 'globals': {k: repr(v) for k, v in frame.f_globals.items()}, 'builtins': {k: repr(v) for k, v in frame.f_builtins.items()}, 'restricted': getattr(frame, 'f_restricted', ''), 'lasti': repr(frame.f_lasti), 'exc_type': repr(getattr(frame, 'f_exc_type', '')), 'exc_value': repr(getattr(frame, 'f_exc_value', '')), 'exc_traceback': repr(getattr(frame, 'f_exc_traceback', '')), 'current': frame is self.curframe, } ) stack_data.append(frame_data) self.output('stack', stack=stack_data) def reset(self): """ Reset state. """ self.line = None self.stack = [] self.curindex = 0 self.curframe = None def setup(self, frame, traceback): """ Start state should be set correctly. """ self.reset() self.stack, self.curindex = self.get_stack(frame, traceback) self.curframe = self.stack[self.curindex][0] def interact(self, frame, traceback): """ Contains the loop processing interactions with the debugger. """ self.setup(frame, traceback) self.output_stack() while True: try: command, args = self.commands.get(block=True) if hasattr(self, 'do_{}'.format(command)): try: resume = getattr(self, 'do_{}'.format(command))(**args) if resume: # Resume running the program after the interaction. break except (ClientClose, Restart): raise except Exception as ex: msg = 'Unhandled error with command "{}": {}'.format( command, ex) self.output('error', message=msg) else: self.output('error', message='Unknown command: {}'.format( command)) except (OSError, AttributeError, ClientClose): # Connection problem; try listening for new connection. client, addr = self.socket.accept() self.client = client self.commands = Queue() self.command_thread = Thread(target=command_buffer, args=(self, )) self.command_thread.daemon = True self.command_thread.start() self.output( 'bootstrap', breakpoints=[ { 'bpnum': bp.number, 'filename': bp.file, 'line': bp.line, 'temporary': bp.temporary, 'enabled': bp.enabled, 'funcname': bp.funcname } for bp in bdb.Breakpoint.bpbynumber[1:] ] ) self.output_stack() # End self.reset() # Overridden Bdb methods # See https://docs.python.org/3.6/library/bdb.html#bdb.Bdb.user_call def user_call(self, frame, argument_list): """ This method is called from dispatch_call() when there is the possibility that a break might be necessary anywhere inside the called function. """ if self._run_state == DebugState.STARTING: return if self.stop_here(frame): self.output('call', args=argument_list) self.interact(frame, None) def user_line(self, frame): """ This method is called from dispatch_line() when either stop_here() or break_here() yields True. For when we stop or break at this line. """ if self._run_state == DebugState.STARTING: self._run_state = DebugState.STARTED self.output('line', filename=self.canonic(frame.f_code.co_filename), line=frame.f_lineno) self.interact(frame, None) def user_return(self, frame, return_value): """ This method is called from dispatch_return() when stop_here() yields True. For when a return trap is set here. """ if self._run_state == DebugState.STARTING: return frame.f_locals['__return__'] = return_value self.output('return', retval=repr(return_value)) self.interact(frame, None) def user_exception(self, frame, exc_info): """ This method is called from dispatch_exception() when stop_here() yields True. For when an exception occurs, but only if we are to stop at or just below this level. """ if self._run_state == DebugState.STARTING: return exc_type, exc_value, exc_traceback = exc_info frame.f_locals['__exception__'] = exc_type, exc_value if isinstance(exc_type, str): exc_type_name = exc_type else: exc_type_name = exc_type.__name__ self.output('exception', name=exc_type_name, value=repr(exc_value)) self.interact(frame, exc_traceback) # Debug command handlers. def do_break(self, filename, line, temporary=False): """ Set a breakpoint. """ globs = self.curframe.f_globals if hasattr(self, 'curframe') else None code = linecache.getline(filename, line, globs) if is_breakpoint_line(code): err = self.set_break(filename, line, temporary, None, None) if err: self.output('error', message=err) else: bp = self.get_breaks(filename, line)[-1] self.output( 'breakpoint_create', bpnum=bp.number, filename=bp.file, line=bp.line, temporary=bp.temporary, funcname=bp.funcname ) else: self.output('error', message='{}:{} is not executable'.format( filename, line)) def do_enable(self, bpnum): """ Enables the breakpoint referenced by its breakpoint number (bpnum). """ bpnum = int(bpnum) if not (0 <= bpnum < len(bdb.Breakpoint.bpbynumber)): self.output('error', message='No breakpoint numbered {}'.format(bpnum)) else: bp = bdb.Breakpoint.bpbynumber[bpnum] bp.enable() self.output('breakpoint_enable', bpnum=bpnum) def do_disable(self, bpnum): """ Disable the breakpoint referenced by its breakpoint number (bpnum). """ bpnum = int(bpnum) if not (0 <= bpnum < len(bdb.Breakpoint.bpbynumber)): self.output('error', message='No breakpoint numbered {}'.format(bpnum)) else: bp = bdb.Breakpoint.bpbynumber[bpnum] bp.disable() self.output('breakpoint_disable', bpnum=bpnum) def do_ignore(self, bpnum, count): """ Ignore the breakpoint referenced by its breakpoint number (bpnum), count number of times. """ try: count = int(count) except ValueError: count = 0 if not (0 <= bpnum < len(bdb.Breakpoint.bpbynumber)): self.output('error', message='No breakpoint numbered {}'.format(bpnum)) else: bp = bdb.Breakpoint.bpbynumber[bpnum] bp.ignore = count if count > 0: self.output('breakpoint_ignore', bpnum=bpnum, count=count) else: self.output('breakpoint_enable', bpnum=bpnum) def do_clear(self, bpnum): """ Handle how a breakpoint must be removed when it is a temporary one. """ bpnum = int(bpnum) if not (0 <= bpnum < len(bdb.Breakpoint.bpbynumber)): self.output('error', message='No breakpoint numbered %s' % bpnum) else: err = self.clear_bpbynumber(bpnum) if err: self.output('error', message=err) else: self.output('breakpoint_clear', bpnum=bpnum) def do_step(self): """ Stop after one line of code. """ self.set_step() return True def do_next(self): """ Stop on the next line in or below the given frame. """ self.set_next(self.curframe) return True def do_restart(self): """ Restart the program by raising an exception to be caught by the debugger. """ raise Restart def do_return(self): """ Stop when returning from the current frame. """ self.set_return(self.curframe) return True def do_continue(self): """ Stop only at breakpoints or when finished. If there are no breakpoints on script start, do a set_trace to stop at the first available line. However, use the continue_flag to ensure set_continue is always called thereafter. """ if self.continue_flag or self.get_all_breaks(): self.set_continue() else: self.set_step() self.continue_flag = True return True def do_quit(self): """ Set the quitting attribute to True. This raises BdbQuit in the next call to one of the dispatch_*() methods. """ self._user_requested_quit = True self.set_quit() return True def do_close(self): """ Respond to a closed socket (not a user commend, but needs handling). """ self.client = None self.command_thread.join() self.commands = None raise ClientClose def _runscript(self, filename): """ Start a debugging session with the Python script in the referenced filename. """ # Clean __main__ import __main__ __main__.__dict__.clear() __main__.__dict__.update({ "__name__": "__main__", "__file__": filename, "__builtins__": __builtins__, }) # When bdb sets tracing, a number of call and line events happen BEFORE # we get to the user's code. The following measures avoid stopping # before we get to the target script (see user_line and user_call for # details). self._run_state = DebugState.STARTING self.mainpyfile = self.canonic(filename) self._user_requested_quit = True # End the process once completed. e = ('__debug_script__ = open(r"{filename}", "rb");' '__debug_code__ = compile(__debug_script__.read(),' ' r"{filename}", "exec");' 'exec(__debug_code__);' '__debug_script__.close();'.format(filename=filename)) self.run(e) def run(hostname, port, filename, *args): """ Run a Python script identified by "filename" with the specified arguments in a debugger session that's listening at hostname/port. """ # Create the correct context for the target Python script. sys.argv[0] = filename sys.argv[1:] = args sys.path[0] = os.path.dirname(filename) # Socket to which the client debugger connects. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) s.bind((hostname, port)) s.listen(1) debugger = Debugger(s, hostname, port) debugger.reset() while True: try: debugger._runscript(filename) if debugger._user_requested_quit: debugger.output('finished') break except Restart: # TODO: Log restart. debugger.output('restart') except (KeyboardInterrupt, SystemExit, OSError): debugger.client = None break except Exception: msg = traceback.format_exc() debugger.output('postmortem', exception=msg) debugger.client = None break # Close connection in a tidy manner. if debugger.client: debugger.client.shutdown(socket.SHUT_WR) mu-editor-1.0.2+dfsg/mu/debugger/utils.py000066400000000000000000000027341341747546300203010ustar00rootroot00000000000000""" Debug related utility functions for the Mu editor. Copyright (c) Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ def is_breakpoint_line(code): """ Return a boolean indication if the specified code from a single line can have a breakpoint added to it. Based entirely on simple but effective heuristics (see comments). """ code = code.strip() if not code: return False # Can't set breakpoints on blank lines or comments. # TODO: Make this more robust. if code[0] == '#' or code[:3] == '"""' or code[:3] == "'''": return False # Can't set breakpoints on lines that end with opening (, { or [ if code[-1] in ('(', '{', '['): return False # Can't set breakpoints on lines that contain only closing ), } or ] if len(code) == 1 and code in (')', '}', ']'): return False return True mu-editor-1.0.2+dfsg/mu/interface/000077500000000000000000000000001341747546300167355ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/interface/__init__.py000066400000000000000000000000621341747546300210440ustar00rootroot00000000000000from .main import Window __all__ = ['Window', ] mu-editor-1.0.2+dfsg/mu/interface/dialogs.py000066400000000000000000000225061341747546300207360ustar00rootroot00000000000000""" UI related code for dialogs used by Mu. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import logging from PyQt5.QtCore import QSize from PyQt5.QtWidgets import (QVBoxLayout, QListWidget, QLabel, QListWidgetItem, QDialog, QDialogButtonBox, QPlainTextEdit, QTabWidget, QWidget, QCheckBox, QLineEdit) from mu.resources import load_icon logger = logging.getLogger(__name__) class ModeItem(QListWidgetItem): """ Represents an available mode listed for selection. """ def __init__(self, name, description, icon, parent=None): super().__init__(parent) self.name = name self.description = description self.icon = icon text = "{}\n{}".format(name, description) self.setText(text) self.setIcon(load_icon(self.icon)) class ModeSelector(QDialog): """ Defines a UI for selecting the mode for Mu. """ def __init__(self, parent=None): super().__init__(parent) def setup(self, modes, current_mode): self.setMinimumSize(600, 400) self.setWindowTitle(_('Select Mode')) widget_layout = QVBoxLayout() label = QLabel(_('Please select the desired mode then click "OK". ' 'Otherwise, click "Cancel".')) label.setWordWrap(True) widget_layout.addWidget(label) self.setLayout(widget_layout) self.mode_list = QListWidget() self.mode_list.itemDoubleClicked.connect(self.select_and_accept) widget_layout.addWidget(self.mode_list) self.mode_list.setIconSize(QSize(48, 48)) for name, item in modes.items(): if not item.is_debugger: litem = ModeItem(item.name, item.description, item.icon, self.mode_list) if item.icon == current_mode: self.mode_list.setCurrentItem(litem) self.mode_list.sortItems() instructions = QLabel(_('Change mode at any time by clicking ' 'the "Mode" button containing Mu\'s logo.')) instructions.setWordWrap(True) widget_layout.addWidget(instructions) button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) button_box.accepted.connect(self.accept) button_box.rejected.connect(self.reject) widget_layout.addWidget(button_box) def select_and_accept(self): """ Handler for when an item is double-clicked. """ self.accept() def get_mode(self): """ Return details of the newly selected mode. """ if self.result() == QDialog.Accepted: return self.mode_list.currentItem().icon else: raise RuntimeError('Mode change cancelled.') class LogWidget(QWidget): """ Used to display Mu's logs. """ def setup(self, log): widget_layout = QVBoxLayout() self.setLayout(widget_layout) label = QLabel(_('When reporting a bug, copy and paste the content of ' 'the following log file.')) label.setWordWrap(True) widget_layout.addWidget(label) self.log_text_area = QPlainTextEdit() self.log_text_area.setReadOnly(True) self.log_text_area.setLineWrapMode(QPlainTextEdit.NoWrap) self.log_text_area.setPlainText(log) widget_layout.addWidget(self.log_text_area) class EnvironmentVariablesWidget(QWidget): """ Used for editing and displaying environment variables used with Python 3 mode. """ def setup(self, envars): widget_layout = QVBoxLayout() self.setLayout(widget_layout) label = QLabel(_('The environment variables shown below will be ' 'set each time you run a Python 3 script.\n\n' 'Each separate enviroment variable should be on a ' 'new line and of the form:\nNAME=VALUE')) label.setWordWrap(True) widget_layout.addWidget(label) self.text_area = QPlainTextEdit() self.text_area.setLineWrapMode(QPlainTextEdit.NoWrap) self.text_area.setPlainText(envars) widget_layout.addWidget(self.text_area) class MicrobitSettingsWidget(QWidget): """ Used for configuring how to interact with the micro:bit: * Minification flag. * Override runtime version to use. """ def setup(self, minify, custom_runtime_path): widget_layout = QVBoxLayout() self.setLayout(widget_layout) self.minify = QCheckBox(_('Minify Python code before flashing?')) self.minify.setChecked(minify) widget_layout.addWidget(self.minify) label = QLabel(_('Override the built-in MicroPython runtime with ' 'the following hex file (empty means use the ' 'default):')) label.setWordWrap(True) widget_layout.addWidget(label) self.runtime_path = QLineEdit() self.runtime_path.setText(custom_runtime_path) widget_layout.addWidget(self.runtime_path) widget_layout.addStretch() class AdminDialog(QDialog): """ Displays administrative related information and settings (logs, environment variables etc...). """ def __init__(self, parent=None): super().__init__(parent) def setup(self, log, settings): self.setMinimumSize(600, 400) self.setWindowTitle(_('Mu Administration')) widget_layout = QVBoxLayout() self.setLayout(widget_layout) self.tabs = QTabWidget() widget_layout.addWidget(self.tabs) button_box = QDialogButtonBox(QDialogButtonBox.Ok) button_box.accepted.connect(self.accept) widget_layout.addWidget(button_box) # Tabs self.log_widget = LogWidget() self.log_widget.setup(log) self.tabs.addTab(self.log_widget, _("Current Log")) self.envar_widget = EnvironmentVariablesWidget() self.envar_widget.setup(settings.get('envars', '')) self.tabs.addTab(self.envar_widget, _('Python3 Environment')) self.log_widget.log_text_area.setFocus() self.microbit_widget = MicrobitSettingsWidget() self.microbit_widget.setup(settings.get('minify', False), settings.get('microbit_runtime', '')) self.tabs.addTab(self.microbit_widget, _('BBC micro:bit Settings')) def settings(self): """ Return a dictionary representation of the raw settings information generated by this dialog. Such settings will need to be processed / checked in the "logic" layer of Mu. """ return { 'envars': self.envar_widget.text_area.toPlainText(), 'minify': self.microbit_widget.minify.isChecked(), 'microbit_runtime': self.microbit_widget.runtime_path.text(), } class FindReplaceDialog(QDialog): """ Display a dialog for getting: * A term to find, * An optional value to replace the search term, * A flag to indicate if the user wishes to replace all. """ def __init__(self, parent=None): super().__init__(parent) def setup(self, find=None, replace=None, replace_flag=False): self.setMinimumSize(600, 200) self.setWindowTitle(_('Find / Replace')) widget_layout = QVBoxLayout() self.setLayout(widget_layout) # Find. find_label = QLabel(_('Find:')) self.find_term = QLineEdit() self.find_term.setText(find) widget_layout.addWidget(find_label) widget_layout.addWidget(self.find_term) # Replace replace_label = QLabel(_('Replace (optional):')) self.replace_term = QLineEdit() self.replace_term.setText(replace) widget_layout.addWidget(replace_label) widget_layout.addWidget(self.replace_term) # Global replace. self.replace_all_flag = QCheckBox(_('Replace all?')) self.replace_all_flag.setChecked(replace_flag) widget_layout.addWidget(self.replace_all_flag) button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) button_box.accepted.connect(self.accept) button_box.rejected.connect(self.reject) widget_layout.addWidget(button_box) def find(self): """ Return the value the user entered to find. """ return self.find_term.text() def replace(self): """ Return the value the user entered for replace. """ return self.replace_term.text() def replace_flag(self): """ Return the value of the global replace flag. """ return self.replace_all_flag.isChecked() mu-editor-1.0.2+dfsg/mu/interface/editor.py000066400000000000000000000500531341747546300206000ustar00rootroot00000000000000""" UI related capabilities for the text editor widget embedded in each tab in Mu. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import keyword import os import re import logging import os.path from collections import defaultdict from PyQt5.Qsci import QsciScintilla, QsciLexerPython, QsciAPIs from PyQt5.QtCore import Qt, pyqtSignal from mu.interface.themes import Font, DayTheme from mu.logic import NEWLINE # Regular Expression for valid individual code 'words' RE_VALID_WORD = re.compile('^[A-Za-z0-9_-]*$') logger = logging.getLogger(__name__) class PythonLexer(QsciLexerPython): """ A Python specific "lexer" that's used to identify keywords of the Python language so the editor can do syntax highlighting. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setHighlightSubidentifiers(False) def keywords(self, flag): """ Returns a list of Python keywords. """ if flag == 1: kws = keyword.kwlist + ['self', 'cls'] elif flag == 2: kws = __builtins__.keys() else: return None return ' '.join(kws) class EditorPane(QsciScintilla): """ Represents the text editor. """ # Signal fired when a script or hex is droped on this editor open_file = pyqtSignal(str) def __init__(self, path, text, newline=NEWLINE): super().__init__() self.setUtf8(True) self.path = path self.setText(text) self.newline = newline self.check_indicators = { # IDs are arbitrary 'error': {'id': 19, 'markers': {}}, 'style': {'id': 20, 'markers': {}} } self.search_indicators = { 'selection': {'id': 21, 'positions': []} } self.DEBUG_INDICATOR = 22 # Arbitrary self.BREAKPOINT_MARKER = 23 # Arbitrary self.previous_selection = { 'line_start': 0, 'col_start': 0, 'line_end': 0, 'col_end': 0 } self.lexer = PythonLexer() self.api = None self.has_annotations = False self.setModified(False) self.breakpoint_handles = set() self.configure() def dropEvent(self, event): """ Run by Qt when *something* is dropped on this editor """ # Does the drag event have any urls? # Files are transfered as a url (by path not value) if event.mimeData().hasUrls(): # Qt doesn't seem to have an 'open' action, # this seems the most appropriate event.setDropAction(Qt.CopyAction) # Valid links links = [] # Iterate over each of the urls attached to the event for url in event.mimeData().urls(): # Check the url is to a local file # (not a webpage for example) if url.isLocalFile(): # Grab a 'real' path from the url path = url.toLocalFile() # Add it to the list of valid links links.append(path) # Did we get any? if len(links) > 0: # Only accept now we actually know we can do # something with the drop event event.accept() for link in links: # Start bubbling an open file request self.open_file.emit(link) # If the event wasn't handled let QsciScintilla have a go if not event.isAccepted(): super().dropEvent(event) def configure(self): """ Set up the editor component. """ # Font information font = Font().load() self.setFont(font) # Generic editor settings self.setUtf8(True) self.setAutoIndent(True) self.setIndentationsUseTabs(False) self.setIndentationWidth(4) self.setIndentationGuides(True) self.setBackspaceUnindents(True) self.setTabWidth(4) self.setEdgeColumn(79) self.setMarginLineNumbers(0, True) self.setMarginWidth(0, 50) self.setBraceMatching(QsciScintilla.SloppyBraceMatch) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.set_theme() # Markers and indicators self.setMarginSensitivity(0, True) self.markerDefine(self.Circle, self.BREAKPOINT_MARKER) self.setMarginSensitivity(1, True) self.setIndicatorDrawUnder(True) for type_ in self.check_indicators: self.indicatorDefine( self.SquiggleIndicator, self.check_indicators[type_]['id']) for type_ in self.search_indicators: self.indicatorDefine( self.StraightBoxIndicator, self.search_indicators[type_]['id']) self.indicatorDefine(self.FullBoxIndicator, self.DEBUG_INDICATOR) self.setAnnotationDisplay(self.AnnotationBoxed) self.selectionChanged.connect(self.selection_change_listener) self.set_zoom() def connect_margin(self, func): """ Connect clicking the margin to the passed in handler function. """ self.marginClicked.connect(func) def set_theme(self, theme=DayTheme): """ Connect the theme to a lexer and return the lexer for the editor to apply to the script text. """ theme.apply_to(self.lexer) self.lexer.setDefaultPaper(theme.Paper) self.setCaretForegroundColor(theme.Caret) self.setIndicatorForegroundColor(theme.IndicatorError, self.check_indicators['error']['id']) self.setIndicatorForegroundColor(theme.IndicatorStyle, self.check_indicators['style']['id']) self.setIndicatorForegroundColor(theme.DebugStyle, self.DEBUG_INDICATOR) for type_ in self.search_indicators: self.setIndicatorForegroundColor( theme.IndicatorWordMatch, self.search_indicators[type_]['id']) self.setMarkerBackgroundColor(theme.BreakpointMarker, self.BREAKPOINT_MARKER) self.setAutoCompletionThreshold(2) self.setAutoCompletionSource(QsciScintilla.AcsAll) self.setLexer(self.lexer) self.setMarginsBackgroundColor(theme.Margin) self.setMarginsForegroundColor(theme.Caret) self.setMatchedBraceBackgroundColor(theme.BraceBackground) self.setMatchedBraceForegroundColor(theme.BraceForeground) self.setUnmatchedBraceBackgroundColor(theme.UnmatchedBraceBackground) self.setUnmatchedBraceForegroundColor(theme.UnmatchedBraceForeground) def set_api(self, api_definitions): """ Sets the API entries for tooltips, calltips and the like. """ self.api = QsciAPIs(self.lexer) for entry in api_definitions: self.api.add(entry) self.api.prepare() def set_zoom(self, size='m'): """ Sets the font zoom to the specified base point size for all fonts given a t-shirt size. """ sizes = { 'xs': -4, 's': -2, 'm': 1, 'l': 4, 'xl': 8, 'xxl': 16, 'xxxl': 48, } self.zoomTo(sizes[size]) @property def label(self): """ The label associated with this editor widget (usually the filename of the script we're editing). If the script has been modified since it was last saved, the label will end with an asterisk. """ if self.path: label = os.path.basename(self.path) else: label = _('untitled') # Add an asterisk to indicate that the file remains unsaved. if self.isModified(): return label + ' *' else: return label def reset_annotations(self): """ Clears all the assets (indicators, annotations and markers). """ self.clearAnnotations() self.markerDeleteAll() self.reset_search_indicators() self.reset_check_indicators() def reset_check_indicators(self): """ Clears all the text indicators related to the check code functionality. """ for indicator in self.check_indicators: for _, markers in \ self.check_indicators[indicator]['markers'].items(): line_no = markers[0]['line_no'] # All markers on same line. self.clearIndicatorRange( line_no, 0, line_no, 999999, self.check_indicators[indicator]['id']) self.check_indicators[indicator]['markers'] = {} def reset_search_indicators(self): """ Clears all the text indicators from the search functionality. """ for indicator in self.search_indicators: for position in self.search_indicators[indicator]['positions']: self.clearIndicatorRange( position['line_start'], position['col_start'], position['line_end'], position['col_end'], self.search_indicators[indicator]['id']) self.search_indicators[indicator]['positions'] = [] def annotate_code(self, feedback, annotation_type='error'): """ Given a list of annotations add them to the editor pane so the user can act upon them. """ indicator = self.check_indicators[annotation_type] for line_no, messages in feedback.items(): indicator['markers'][line_no] = messages for message in messages: col = message.get('column', 0) if col: col_start = col - 1 col_end = col + 1 self.fillIndicatorRange(line_no, col_start, line_no, col_end, indicator['id']) if feedback: # Ensure the first line with a problem is visible. first_problem_line = sorted(feedback.keys())[0] self.ensureLineVisible(first_problem_line) def debugger_at_line(self, line): """ Set the line to be highlighted with the DEBUG_INDICATOR. """ self.reset_debugger_highlight() # Calculate the line length & account for \r\n giving ObOE. line_length = len(self.text(line).rstrip()) self.fillIndicatorRange(line, 0, line, line_length, self.DEBUG_INDICATOR) self.ensureLineVisible(line) def reset_debugger_highlight(self): """ Reset all the lines so the DEBUG_INDICATOR is no longer displayed. We need to check each line since there's no way to tell what the currently highlighted line is. This approach also has the advantage of resetting the *whole* editor pane. """ for i in range(self.lines()): line_length = len(self.text(i)) self.clearIndicatorRange(i, 0, i, line_length, self.DEBUG_INDICATOR) def show_annotations(self): """ Display all the messages to be annotated to the code. """ lines = defaultdict(list) for indicator in self.check_indicators: markers = self.check_indicators[indicator]['markers'] for k, marker_list in markers.items(): for m in marker_list: lines[m['line_no']].append('\u2191 ' + m['message']) for line, messages in lines.items(): text = '\n'.join(messages).strip() if text: self.annotate(line, text, self.annotationDisplay()) def find_next_match(self, text, from_line=-1, from_col=-1, case_sensitive=True, wrap_around=True): """ Finds the next text match from the current cursor, or the given position, and selects it (the automatic selection is the only available QsciScintilla behaviour). Returns True if match found, False otherwise. """ return self.findFirst( text, # Text to find, False, # Treat as regular expression case_sensitive, # Case sensitive search True, # Whole word matches only wrap_around, # Wrap search forward=True, # Forward search line=from_line, # -1 starts at current position index=from_col, # -1 starts at current position show=False, # Unfolds found text posix=False) # More POSIX compatible RegEx def range_from_positions(self, start_position, end_position): """Given a start-end pair, such as are provided by a regex match, return the corresponding Scintilla line-offset pairs which are used for searches, indicators etc. FIXME: Not clear whether the Scintilla conversions are expecting bytes or characters (ie codepoints) """ start_line, start_offset = self.lineIndexFromPosition(start_position) end_line, end_offset = self.lineIndexFromPosition(end_position) return start_line, start_offset, end_line, end_offset def highlight_selected_matches(self): """ Checks the current selection, if it is a single word it then searches and highlights all matches. Since we're interested in exactly one word: * Ignore an empty selection * Ignore anything which spans more than one line * Ignore more than one word * Ignore anything less than one word """ selected_range = line0, col0, line1, col1 = self.getSelection() # # If there's no selection, do nothing # if selected_range == (-1, -1, -1, -1): return # # Ignore anything which spans two or more lines # if line0 != line1: return # # Ignore if no text is selected or the selected text is not at most one # valid identifier-type word. # selected_text = self.selectedText() if not RE_VALID_WORD.match(selected_text): return # # Ignore anything which is not a whole word. # NB Although Scintilla defines a SCI_ISRANGEWORD message, # it's not exposed by QSciScintilla. Instead, we # ask Scintilla for the start end end position of # the word we're in and test whether our range end points match # those or not. # pos0 = self.positionFromLineIndex(line0, col0) word_start_pos = self.SendScintilla( QsciScintilla.SCI_WORDSTARTPOSITION, pos0, 1) _, start_offset = self.lineIndexFromPosition(word_start_pos) if col0 != start_offset: return pos1 = self.positionFromLineIndex(line1, col1) word_end_pos = self.SendScintilla( QsciScintilla.SCI_WORDENDPOSITION, pos1, 1) _, end_offset = self.lineIndexFromPosition(word_end_pos) if col1 != end_offset: return # # For each matching word within the editor text, add it to # the list of highlighted indicators and fill it according # to the current theme. # indicators = self.search_indicators['selection'] text = self.text() for match in re.finditer(selected_text, text): range = self.range_from_positions(*match.span()) # # Don't highlight the text we've selected # if range == selected_range: continue line_start, col_start, line_end, col_end = range indicators['positions'].append({ 'line_start': line_start, 'col_start': col_start, 'line_end': line_end, 'col_end': col_end }) self.fillIndicatorRange(line_start, col_start, line_end, col_end, indicators['id']) def selection_change_listener(self): """ Runs every time the text selection changes. This could get triggered multiple times while the mouse click is down, even if selection has not changed in itself. If there is a new selection is passes control to highlight_selected_matches. """ # Get the current selection, exit if it has not changed line_from, index_from, line_to, index_to = self.getSelection() if self.previous_selection['col_end'] != index_to or \ self.previous_selection['col_start'] != index_from or \ self.previous_selection['line_start'] != line_from or \ self.previous_selection['line_end'] != line_to: self.previous_selection['line_start'] = line_from self.previous_selection['col_start'] = index_from self.previous_selection['line_end'] = line_to self.previous_selection['col_end'] = index_to # Highlight matches self.reset_search_indicators() self.highlight_selected_matches() def toggle_line(self, raw_line): """ Given a raw_line, will return the toggled version of it. """ clean_line = raw_line.strip() if clean_line.startswith('#'): # It's a comment line, so handle "# " & "#..." as fallback: if clean_line.startswith('# '): return raw_line.replace('# ', '') else: return raw_line.replace('#', '') elif clean_line: # It's a normal line of code. return '# ' + raw_line else: # It's a whitespace line, so just return it. return raw_line def toggle_comments(self): """ Iterate through the selected lines and toggle their comment/uncomment state. So, lines that are not comments become comments and vice versa. """ if self.hasSelectedText(): # Toggle currently selected text. logger.info("Toggling comments") line_from, index_from, line_to, index_to = self.getSelection() selected_text = self.selectedText() lines = selected_text.split('\n') toggled_lines = [] for line in lines: toggled_lines.append(self.toggle_line(line)) new_text = '\n'.join(toggled_lines) self.replaceSelectedText(new_text) # Ensure the new text is also selected. last_newline = toggled_lines[-1] last_oldline = lines[-1].strip() if last_newline.startswith('#'): index_to += 2 # A newly commented line starts... "# " elif last_oldline.startswith('#'): # Check the original line to see what has been uncommented. if last_oldline.startswith('# '): index_to -= 2 # It was "# ". else: index_to -= 1 # It was "#". self.setSelection(line_from, index_from, line_to, index_to) else: # Toggle the line currently containing the cursor. line_number, column = self.getCursorPosition() logger.info('Toggling line {}'.format(line_number)) line_content = self.text(line_number) new_line = self.toggle_line(line_content) self.setSelection(line_number, 0, line_number, len(line_content)) self.replaceSelectedText(new_line) self.setSelection(line_number, 0, line_number, len(new_line) - 1) mu-editor-1.0.2+dfsg/mu/interface/main.py000066400000000000000000001142001341747546300202310ustar00rootroot00000000000000""" Contains the main Window definition for Mu's UI. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import sys import logging import serial import os.path from PyQt5.QtCore import QSize, Qt, pyqtSignal, QTimer, QIODevice from PyQt5.QtWidgets import (QToolBar, QAction, QDesktopWidget, QWidget, QVBoxLayout, QTabWidget, QFileDialog, QMessageBox, QLabel, QMainWindow, QStatusBar, QDockWidget, QShortcut) from PyQt5.QtGui import QKeySequence, QStandardItemModel from PyQt5.QtSerialPort import QSerialPort from mu import __version__ from mu.interface.dialogs import ModeSelector, AdminDialog, FindReplaceDialog from mu.interface.themes import (DayTheme, NightTheme, ContrastTheme, DEFAULT_FONT_SIZE) from mu.interface.panes import (DebugInspector, DebugInspectorItem, PythonProcessPane, JupyterREPLPane, MicroPythonREPLPane, FileSystemPane, PlotterPane) from mu.interface.editor import EditorPane from mu.resources import load_icon, load_pixmap logger = logging.getLogger(__name__) class ButtonBar(QToolBar): """ Represents the bar of buttons across the top of the editor and defines their behaviour. """ def __init__(self, parent): super().__init__(parent) self.setMovable(False) self.setIconSize(QSize(64, 64)) self.setToolButtonStyle(3) self.setContextMenuPolicy(Qt.PreventContextMenu) self.setObjectName("StandardToolBar") self.reset() def reset(self): """ Resets the button states. """ self.slots = {} self.clear() def change_mode(self, mode): self.reset() self.addAction(name="modes", display_name=_("Mode"), tool_text=_("Change Mu's mode of behaviour.")) self.addSeparator() self.addAction(name="new", display_name=_("New"), tool_text=_("Create a new Python script.")) self.addAction(name="load", display_name=_("Load"), tool_text=_("Load a Python script.")) self.addAction(name="save", display_name=_("Save"), tool_text=_("Save the current Python script.")) self.addSeparator() for action in mode.actions(): self.addAction(name=action['name'], display_name=action['display_name'], tool_text=action['description']) self.addSeparator() self.addAction(name="zoom-in", display_name=_('Zoom-in'), tool_text=_("Zoom in (to make the text bigger).")) self.addAction(name="zoom-out", display_name=_('Zoom-out'), tool_text=_("Zoom out (to make the text smaller).")) self.addAction(name="theme", display_name=_('Theme'), tool_text=_("Toggle theme between day, night or " "high contrast.")) self.addSeparator() self.addAction(name="check", display_name=_('Check'), tool_text=_("Check your code for mistakes.")) self.addAction(name="help", display_name=_('Help'), tool_text=_("Show help about Mu in a browser.")) self.addAction(name="quit", display_name=_('Quit'), tool_text=_("Quit Mu.")) def set_responsive_mode(self, width, height): """ Compact button bar for when window is very small. """ font_size = DEFAULT_FONT_SIZE if width < 940 and height > 600: self.setIconSize(QSize(48, 48)) elif height < 600 and width < 940: font_size = 10 self.setIconSize(QSize(32, 32)) else: self.setIconSize(QSize(64, 64)) stylesheet = "QWidget{font-size: " + str(font_size) + "px;}" self.setStyleSheet(stylesheet) def addAction(self, name, display_name, tool_text): """ Creates an action associated with an icon and name and adds it to the widget's slots. """ action = QAction(load_icon(name), display_name, self, toolTip=tool_text) super().addAction(action) self.slots[name] = action def connect(self, name, handler, shortcut=None): """ Connects a named slot to a handler function and optional hot-key shortcuts. """ self.slots[name].pyqtConfigure(triggered=handler) if shortcut: self.slots[name].setShortcut(QKeySequence(shortcut)) class FileTabs(QTabWidget): """ Extend the base class so we can override the removeTab behaviour. """ def __init__(self): super(FileTabs, self).__init__() self.setTabsClosable(True) self.tabCloseRequested.connect(self.removeTab) self.currentChanged.connect(self.change_tab) def removeTab(self, tab_id): """ Ask the user before closing the file. """ window = self.nativeParentWidget() modified = self.widget(tab_id).isModified() if modified: msg = ('There is un-saved work, closing the tab will cause you ' 'to lose it.') if window.show_confirmation(msg) == QMessageBox.Cancel: return super(FileTabs, self).removeTab(tab_id) def change_tab(self, tab_id): """ Update the application title to reflect the name of the file in the currently selected tab. """ current_tab = self.widget(tab_id) window = self.nativeParentWidget() if current_tab: window.update_title(current_tab.label) else: window.update_title(None) class Window(QMainWindow): """ Defines the look and characteristics of the application's main window. """ title = _("Mu {}").format(__version__) icon = "icon" timer = None usb_checker = None serial = None repl = None plotter = None zooms = ('xs', 's', 'm', 'l', 'xl', 'xxl', 'xxxl') # levels of zoom. zoom_position = 2 # current level of zoom (as position in zooms tuple). _zoom_in = pyqtSignal(str) _zoom_out = pyqtSignal(str) close_serial = pyqtSignal() write_to_serial = pyqtSignal(bytes) data_received = pyqtSignal(bytes) open_file = pyqtSignal(str) load_theme = pyqtSignal(str) previous_folder = None def set_zoom(self): """ Sets the zoom to current zoom_position level. """ self._zoom_in.emit(self.zooms[self.zoom_position]) def zoom_in(self): """ Handles zooming in. """ self.zoom_position = min(self.zoom_position + 1, len(self.zooms) - 1) self._zoom_in.emit(self.zooms[self.zoom_position]) def zoom_out(self): """ Handles zooming out. """ self.zoom_position = max(self.zoom_position - 1, 0) self._zoom_out.emit(self.zooms[self.zoom_position]) def connect_zoom(self, widget): """ Connects a referenced widget to the zoom related signals and sets the zoom of the widget to the current zoom level. """ self._zoom_in.connect(widget.set_zoom) self._zoom_out.connect(widget.set_zoom) widget.set_zoom(self.zooms[self.zoom_position]) @property def current_tab(self): """ Returns the currently focussed tab. """ return self.tabs.currentWidget() def set_read_only(self, is_readonly): """ Set all tabs read-only. """ self.read_only_tabs = is_readonly for tab in self.widgets: tab.setReadOnly(is_readonly) def get_load_path(self, folder, extensions='*'): """ Displays a dialog for selecting a file to load. Returns the selected path. Defaults to start in the referenced folder. """ path, _ = QFileDialog.getOpenFileName( self.widget, 'Open file', folder if self.previous_folder is None else self.previous_folder, extensions) self.previous_folder = os.path.dirname(path) logger.debug('Getting load path: {}'.format(path)) return path def get_save_path(self, folder): """ Displays a dialog for selecting a file to save. Returns the selected path. Defaults to start in the referenced folder. """ path, _ = QFileDialog.getSaveFileName( self.widget, 'Save file', folder if self.previous_folder is None else self.previous_folder) self.previous_folder = os.path.dirname(path) logger.debug('Getting save path: {}'.format(path)) return path def get_microbit_path(self, folder): """ Displays a dialog for locating the location of the BBC micro:bit in the host computer's filesystem. Returns the selected path. Defaults to start in the referenced folder. """ path = QFileDialog.getExistingDirectory( self.widget, 'Locate BBC micro:bit', folder if self.previous_folder is None else self.previous_folder, QFileDialog.ShowDirsOnly) self.previous_folder = os.path.dirname(path) logger.debug('Getting micro:bit path: {}'.format(path)) return path def add_tab(self, path, text, api, newline): """ Adds a tab with the referenced path and text to the editor. """ new_tab = EditorPane(path, text, newline) new_tab.connect_margin(self.breakpoint_toggle) new_tab_index = self.tabs.addTab(new_tab, new_tab.label) new_tab.set_api(api) @new_tab.modificationChanged.connect def on_modified(): modified_tab_index = self.tabs.currentIndex() self.tabs.setTabText(modified_tab_index, new_tab.label) self.update_title(new_tab.label) @new_tab.open_file.connect def on_open_file(file): # Bubble the signal up self.open_file.emit(file) self.tabs.setCurrentIndex(new_tab_index) self.connect_zoom(new_tab) self.set_theme(self.theme) new_tab.setFocus() if self.read_only_tabs: new_tab.setReadOnly(self.read_only_tabs) return new_tab def focus_tab(self, tab): index = self.tabs.indexOf(tab) self.tabs.setCurrentIndex(index) tab.setFocus() @property def tab_count(self): """ Returns the number of active tabs. """ return self.tabs.count() @property def widgets(self): """ Returns a list of references to the widgets representing tabs in the editor. """ return [self.tabs.widget(i) for i in range(self.tab_count)] @property def modified(self): """ Returns a boolean indication if there are any modified tabs in the editor. """ for widget in self.widgets: if widget.isModified(): return True return False def on_serial_read(self): """ Called when the connected device is ready to send data via the serial connection. It reads all the available data, emits the data_received signal with the received bytes and, if appropriate, emits the tuple_received signal with the tuple created from the bytes received. """ data = bytes(self.serial.readAll()) # get all the available bytes. self.data_received.emit(data) def on_stdout_write(self, data): """ Called when either a running script or the REPL write to STDOUT. """ self.data_received.emit(data) def open_serial_link(self, port): """ Creates a new serial link instance. """ self.input_buffer = [] self.serial = QSerialPort() self.serial.setPortName(port) if self.serial.open(QIODevice.ReadWrite): self.serial.setDataTerminalReady(True) if not self.serial.isDataTerminalReady(): # Using pyserial as a 'hack' to open the port and set DTR # as QtSerial does not seem to work on some Windows :( # See issues #281 and #302 for details. self.serial.close() pyser = serial.Serial(port) # open serial port w/pyserial pyser.dtr = True pyser.close() self.serial.open(QIODevice.ReadWrite) self.serial.setBaudRate(115200) self.serial.readyRead.connect(self.on_serial_read) else: msg = _("Cannot connect to device on port {}").format(port) raise IOError(msg) def close_serial_link(self): """ Close and clean up the currently open serial link. """ if self.serial: self.serial.close() self.serial = None def add_filesystem(self, home, file_manager): """ Adds the file system pane to the application. """ self.fs_pane = FileSystemPane(home) @self.fs_pane.open_file.connect def on_open_file(file): # Bubble the signal up self.open_file.emit(file) self.fs = QDockWidget(_('Filesystem on micro:bit')) self.fs.setWidget(self.fs_pane) self.fs.setFeatures(QDockWidget.DockWidgetMovable) self.fs.setAllowedAreas(Qt.BottomDockWidgetArea) self.addDockWidget(Qt.BottomDockWidgetArea, self.fs) self.fs_pane.setFocus() file_manager.on_list_files.connect(self.fs_pane.on_ls) self.fs_pane.list_files.connect(file_manager.ls) self.fs_pane.microbit_fs.put.connect(file_manager.put) self.fs_pane.microbit_fs.delete.connect(file_manager.delete) self.fs_pane.microbit_fs.list_files.connect(file_manager.ls) self.fs_pane.local_fs.get.connect(file_manager.get) self.fs_pane.local_fs.list_files.connect(file_manager.ls) file_manager.on_put_file.connect(self.fs_pane.microbit_fs.on_put) file_manager.on_delete_file.connect(self.fs_pane.microbit_fs.on_delete) file_manager.on_get_file.connect(self.fs_pane.local_fs.on_get) file_manager.on_list_fail.connect(self.fs_pane.on_ls_fail) file_manager.on_put_fail.connect(self.fs_pane.on_put_fail) file_manager.on_delete_fail.connect(self.fs_pane.on_delete_fail) file_manager.on_get_fail.connect(self.fs_pane.on_get_fail) self.connect_zoom(self.fs_pane) return self.fs_pane def add_micropython_repl(self, port, name, force_interrupt=True): """ Adds a MicroPython based REPL pane to the application. """ if not self.serial: self.open_serial_link(port) if force_interrupt: # Send a Control-B / exit raw mode. self.serial.write(b'\x02') # Send a Control-C / keyboard interrupt. self.serial.write(b'\x03') repl_pane = MicroPythonREPLPane(serial=self.serial) self.data_received.connect(repl_pane.process_bytes) self.add_repl(repl_pane, name) def add_micropython_plotter(self, port, name, mode): """ Adds a plotter that reads data from a serial connection. """ if not self.serial: self.open_serial_link(port) plotter_pane = PlotterPane() self.data_received.connect(plotter_pane.process_bytes) plotter_pane.data_flood.connect(mode.on_data_flood) self.add_plotter(plotter_pane, name) def add_python3_plotter(self, mode): """ Add a plotter that reads from either the REPL or a running script. Since this function will only be called when either the REPL or a running script are running (but not at the same time), it'll just grab data emitted by the REPL or script via data_received. """ plotter_pane = PlotterPane() self.data_received.connect(plotter_pane.process_bytes) plotter_pane.data_flood.connect(mode.on_data_flood) self.add_plotter(plotter_pane, _('Python3 data tuple')) def add_jupyter_repl(self, kernel_manager, kernel_client): """ Adds a Jupyter based REPL pane to the application. """ kernel_manager.kernel.gui = 'qt4' kernel_client.start_channels() ipython_widget = JupyterREPLPane() ipython_widget.kernel_manager = kernel_manager ipython_widget.kernel_client = kernel_client ipython_widget.on_append_text.connect(self.on_stdout_write) self.add_repl(ipython_widget, _('Python3 (Jupyter)')) def add_repl(self, repl_pane, name): """ Adds the referenced REPL pane to the application. """ self.repl_pane = repl_pane self.repl = QDockWidget(_('{} REPL').format(name)) self.repl.setWidget(repl_pane) self.repl.setFeatures(QDockWidget.DockWidgetMovable) self.repl.setAllowedAreas(Qt.BottomDockWidgetArea | Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.addDockWidget(Qt.BottomDockWidgetArea, self.repl) self.connect_zoom(self.repl_pane) self.repl_pane.set_theme(self.theme) self.repl_pane.setFocus() def add_plotter(self, plotter_pane, name): """ Adds the referenced plotter pane to the application. """ self.plotter_pane = plotter_pane self.plotter = QDockWidget(_('{} Plotter').format(name)) self.plotter.setWidget(plotter_pane) self.plotter.setFeatures(QDockWidget.DockWidgetMovable) self.plotter.setAllowedAreas(Qt.BottomDockWidgetArea | Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.addDockWidget(Qt.BottomDockWidgetArea, self.plotter) self.plotter_pane.set_theme(self.theme) self.plotter_pane.setFocus() def add_python3_runner(self, script_name, working_directory, interactive=False, debugger=False, command_args=None, runner=None, envars=None, python_args=None): """ Display console output for the referenced Python script. The script will be run within the workspace_path directory. If interactive is True (default is False) the Python process will run in interactive mode (dropping the user into the REPL when the script completes). If debugger is True (default is False) the script will be run within a debug runner session. The debugger overrides the interactive flag (you cannot run the debugger in interactive mode). If there is a list of command_args (the default is None) then these will be passed as further arguments into the command run in the new process. If runner is given, this is used as the command to start the Python process. If envars is given, these will become part of the environment context of the new chlid process. If python_args is given, these will be passed as arguments to the Python runtime used to launch the child process. """ self.process_runner = PythonProcessPane(self) self.runner = QDockWidget(_("Running: {}").format( os.path.basename(script_name))) self.runner.setWidget(self.process_runner) self.runner.setFeatures(QDockWidget.DockWidgetMovable) self.runner.setAllowedAreas(Qt.BottomDockWidgetArea | Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.addDockWidget(Qt.BottomDockWidgetArea, self.runner) self.process_runner.start_process(script_name, working_directory, interactive, debugger, command_args, envars, runner, python_args) self.process_runner.setFocus() self.process_runner.on_append_text.connect(self.on_stdout_write) self.connect_zoom(self.process_runner) return self.process_runner def add_debug_inspector(self): """ Display a debug inspector to view the call stack. """ self.debug_inspector = DebugInspector() self.debug_model = QStandardItemModel() self.debug_inspector.setModel(self.debug_model) self.inspector = QDockWidget(_('Debug Inspector')) self.inspector.setWidget(self.debug_inspector) self.inspector.setFeatures(QDockWidget.DockWidgetMovable) self.inspector.setAllowedAreas(Qt.BottomDockWidgetArea | Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.addDockWidget(Qt.RightDockWidgetArea, self.inspector) self.connect_zoom(self.debug_inspector) def update_debug_inspector(self, locals_dict): """ Given the contents of a dict representation of the locals in the current stack frame, update the debug inspector with the new values. """ excluded_names = ['__builtins__', '__debug_code__', '__debug_script__', ] names = sorted([x for x in locals_dict if x not in excluded_names]) self.debug_model.clear() self.debug_model.setHorizontalHeaderLabels([_('Name'), _('Value'), ]) for name in names: try: # DANGER! val = eval(locals_dict[name]) except Exception: val = None if isinstance(val, list): # Show a list consisting of rows of position/value list_item = DebugInspectorItem(name) for i, i_val in enumerate(val): list_item.appendRow([ DebugInspectorItem(str(i)), DebugInspectorItem(repr(i_val)) ]) self.debug_model.appendRow([ list_item, DebugInspectorItem(_('(A list of {} items.)') .format(len(val))) ]) elif isinstance(val, dict): # Show a dict consisting of rows of key/value pairs. dict_item = DebugInspectorItem(name) for k, k_val in val.items(): dict_item.appendRow([ DebugInspectorItem(repr(k)), DebugInspectorItem(repr(k_val)) ]) self.debug_model.appendRow([ dict_item, DebugInspectorItem(_('(A dict of {} items.)') .format(len(val))) ]) else: self.debug_model.appendRow([ DebugInspectorItem(name), DebugInspectorItem(locals_dict[name]), ]) def remove_filesystem(self): """ Removes the file system pane from the application. """ if hasattr(self, 'fs') and self.fs: self.fs_pane = None self.fs.setParent(None) self.fs.deleteLater() self.fs = None def remove_repl(self): """ Removes the REPL pane from the application. """ if self.repl: self.repl_pane = None self.repl.setParent(None) self.repl.deleteLater() self.repl = None if not self.plotter: self.close_serial_link() def remove_plotter(self): """ Removes the plotter pane from the application. """ if self.plotter: self.plotter_pane = None self.plotter.setParent(None) self.plotter.deleteLater() self.plotter = None if not self.repl: self.close_serial_link() def remove_python_runner(self): """ Removes the runner pane from the application. """ if hasattr(self, 'runner') and self.runner: self.process_runner = None self.runner.setParent(None) self.runner.deleteLater() self.runner = None def remove_debug_inspector(self): """ Removes the debug inspector pane from the application. """ if hasattr(self, 'inspector') and self.inspector: self.debug_inspector = None self.debug_model = None self.inspector.setParent(None) self.inspector.deleteLater() self.inspector = None def set_theme(self, theme): """ Sets the theme for the REPL and editor tabs. """ self.theme = theme self.load_theme.emit(theme) if theme == 'contrast': new_theme = ContrastTheme new_icon = 'theme_day' elif theme == 'night': new_theme = NightTheme new_icon = 'theme_contrast' else: new_theme = DayTheme new_icon = 'theme' for widget in self.widgets: widget.set_theme(new_theme) self.button_bar.slots['theme'].setIcon(load_icon(new_icon)) if hasattr(self, 'repl') and self.repl: self.repl_pane.set_theme(theme) if hasattr(self, 'plotter') and self.plotter: self.plotter_pane.set_theme(theme) def show_admin(self, log, settings): """ Display the administrative dialog with referenced content of the log and settings. Return a dictionary of the settings that may have been changed by the admin dialog. """ admin_box = AdminDialog(self) admin_box.setup(log, settings) admin_box.exec() return admin_box.settings() def show_message(self, message, information=None, icon=None): """ Displays a modal message to the user. If information is passed in this will be set as the additional informative text in the modal dialog. Since this mechanism will be used mainly for warning users that something is awry the default icon is set to "Warning". It's possible to override the icon to one of the following settings: NoIcon, Question, Information, Warning or Critical. """ message_box = QMessageBox(self) message_box.setText(message) message_box.setWindowTitle('Mu') if information: message_box.setInformativeText(information) if icon and hasattr(message_box, icon): message_box.setIcon(getattr(message_box, icon)) else: message_box.setIcon(message_box.Warning) logger.debug(message) logger.debug(information) message_box.exec() def show_confirmation(self, message, information=None, icon=None): """ Displays a modal message to the user to which they need to confirm or cancel. If information is passed in this will be set as the additional informative text in the modal dialog. Since this mechanism will be used mainly for warning users that something is awry the default icon is set to "Warning". It's possible to override the icon to one of the following settings: NoIcon, Question, Information, Warning or Critical. """ message_box = QMessageBox(self) message_box.setText(message) message_box.setWindowTitle(_('Mu')) if information: message_box.setInformativeText(information) if icon and hasattr(message_box, icon): message_box.setIcon(getattr(message_box, icon)) else: message_box.setIcon(message_box.Warning) message_box.setStandardButtons(message_box.Cancel | message_box.Ok) message_box.setDefaultButton(message_box.Cancel) logger.debug(message) logger.debug(information) return message_box.exec() def update_title(self, filename=None): """ Updates the title bar of the application. If a filename (representing the name of the file currently the focus of the editor) is supplied, append it to the end of the title. """ title = self.title if filename: title += ' - ' + filename self.setWindowTitle(title) def autosize_window(self): """ Makes the editor 80% of the width*height of the screen and centres it. """ screen = QDesktopWidget().screenGeometry() w = int(screen.width() * 0.8) h = int(screen.height() * 0.8) self.resize(w, h) size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) def reset_annotations(self): """ Resets the state of annotations on the current tab. """ self.current_tab.reset_annotations() def annotate_code(self, feedback, annotation_type): """ Given a list of annotations about the code in the current tab, add the annotations to the editor window so the user can make appropriate changes. """ self.current_tab.annotate_code(feedback, annotation_type) def show_annotations(self): """ Show the annotations added to the current tab. """ self.current_tab.show_annotations() def setup(self, breakpoint_toggle, theme): """ Sets up the window. Defines the various attributes of the window and defines how the user interface is laid out. """ self.theme = theme self.breakpoint_toggle = breakpoint_toggle # Give the window a default icon, title and minimum size. self.setWindowIcon(load_icon(self.icon)) self.update_title() self.read_only_tabs = False self.setMinimumSize(820, 400) self.setTabPosition(Qt.AllDockWidgetAreas, QTabWidget.North) self.widget = QWidget() widget_layout = QVBoxLayout() self.widget.setLayout(widget_layout) self.button_bar = ButtonBar(self.widget) self.tabs = FileTabs() self.tabs.setMovable(True) self.setCentralWidget(self.tabs) self.status_bar = StatusBar(parent=self) self.setStatusBar(self.status_bar) self.addToolBar(self.button_bar) self.show() self.autosize_window() def resizeEvent(self, resizeEvent): """ Respond to window getting too small for the button bar to fit well. """ size = resizeEvent.size() self.button_bar.set_responsive_mode(size.width(), size.height()) def select_mode(self, modes, current_mode): """ Display the mode selector dialog and return the result. """ mode_select = ModeSelector(self) mode_select.setup(modes, current_mode) mode_select.exec() try: return mode_select.get_mode() except Exception: return None def change_mode(self, mode): """ Given a an object representing a mode, recreates the button bar with the expected functionality. """ self.button_bar.change_mode(mode) # Update the autocomplete / tooltip APIs for each tab to the new mode. api = mode.api() for widget in self.widgets: widget.set_api(api) def set_usb_checker(self, duration, callback): """ Sets up a timer that polls for USB changes via the "callback" every "duration" seconds. """ self.usb_checker = QTimer() self.usb_checker.timeout.connect(callback) self.usb_checker.start(duration * 1000) def set_timer(self, duration, callback): """ Set a repeating timer to call "callback" every "duration" seconds. """ self.timer = QTimer() self.timer.timeout.connect(callback) self.timer.start(duration * 1000) # Measured in milliseconds. def stop_timer(self): """ Stop the repeating timer. """ if self.timer: self.timer.stop() self.timer = None def connect_tab_rename(self, handler, shortcut): """ Connect the double-click event on a tab and the keyboard shortcut to the referenced handler (causing the Save As dialog). """ self.tabs.shortcut = QShortcut(QKeySequence(shortcut), self) self.tabs.shortcut.activated.connect(handler) self.tabs.tabBarDoubleClicked.connect(handler) def open_directory_from_os(self, path): """ Given the path to a directory, open the OS's built in filesystem explorer for that path. Works with Windows, OSX and Linux. """ if sys.platform == 'win32': # Windows os.startfile(path) elif sys.platform == 'darwin': # OSX os.system('open "{}"'.format(path)) else: # Assume freedesktop.org on unix-y. os.system('xdg-open "{}"'.format(path)) def connect_find_replace(self, handler, shortcut): """ Create a keyboard shortcut and associate it with a handler for doing a find and replace. """ self.find_replace_shortcut = QShortcut(QKeySequence(shortcut), self) self.find_replace_shortcut.activated.connect(handler) def show_find_replace(self, find, replace, global_replace): """ Display the find/replace dialog. If the dialog's OK button was clicked return a tuple containing the find term, replace term and global replace flag. """ finder = FindReplaceDialog(self) finder.setup(find, replace, global_replace) if finder.exec(): return (finder.find(), finder.replace(), finder.replace_flag()) def replace_text(self, target_text, replace, global_replace): """ Given target_text, replace the first instance after the cursor with "replace". If global_replace is true, replace all instances of "target". Returns the number of times replacement has occurred. """ if not self.current_tab: return 0 if global_replace: counter = 0 found = self.current_tab.findFirst(target_text, True, True, False, False, line=0, index=0) if found: counter += 1 self.current_tab.replace(replace) while self.current_tab.findNext(): self.current_tab.replace(replace) counter += 1 return counter else: found = self.current_tab.findFirst(target_text, True, True, False, True) if found: self.current_tab.replace(replace) return 1 else: return 0 def highlight_text(self, target_text): """ Highlight the first match from the current position of the cursor in the current tab for the target_text. Returns True if there's a match. """ if self.current_tab: return self.current_tab.findFirst(target_text, True, True, False, True) else: return False def connect_toggle_comments(self, handler, shortcut): """ Create a keyboard shortcut and associate it with a handler for toggling comments on highlighted lines. """ self.toggle_comments_shortcut = QShortcut(QKeySequence(shortcut), self) self.toggle_comments_shortcut.activated.connect(handler) def toggle_comments(self): """ Toggle comments on/off for all selected line in the currently active tab. """ if self.current_tab: self.current_tab.toggle_comments() class StatusBar(QStatusBar): """ Defines the look and behaviour of the status bar along the bottom of the UI. """ def __init__(self, parent=None, mode='python'): super().__init__(parent) self.mode = mode # Mode selector. self.mode_label = QLabel() self.mode_label.setToolTip(_("Mu's current mode of behaviour.")) self.addPermanentWidget(self.mode_label) self.set_mode(mode) # Logs viewer self.logs_label = QLabel() self.logs_label.setObjectName('AdministrationLabel') self.logs_label.setPixmap(load_pixmap('logs').scaledToHeight(24)) self.logs_label.setToolTip(_('Mu Administration')) self.addPermanentWidget(self.logs_label) def connect_logs(self, handler, shortcut): """ Connect the mouse press event and keyboard shortcut for the log widget to the referenced handler function. """ self.logs_label.shortcut = QShortcut(QKeySequence(shortcut), self.parent()) self.logs_label.shortcut.activated.connect(handler) self.logs_label.mousePressEvent = handler def connect_mode(self, handler, shortcut): """ Connect the mouse press event and keyboard shortcut for the mode widget to the referenced handler function. """ self.mode_label.shortcut = QShortcut(QKeySequence(shortcut), self.parent()) self.mode_label.shortcut.activated.connect(handler) self.mode_label.mousePressEvent = handler def set_message(self, message, pause=5000): """ Displays a message in the status bar for a certain period of time. """ self.showMessage(message, pause) def set_mode(self, mode): """ Updates the mode label to the new mode. """ self.mode_label.setText(mode.capitalize()) mu-editor-1.0.2+dfsg/mu/interface/panes.py000066400000000000000000001410031341747546300204140ustar00rootroot00000000000000""" Contains the UI classes used to populate the various panes used by Mu. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import sys import site import os import re import platform import logging import signal import string import bisect import os.path from PyQt5.QtCore import (Qt, QProcess, QProcessEnvironment, pyqtSignal, QTimer, QUrl) from collections import deque from PyQt5.QtWidgets import (QMessageBox, QTextEdit, QFrame, QListWidget, QGridLayout, QLabel, QMenu, QApplication, QTreeView) from PyQt5.QtGui import (QKeySequence, QTextCursor, QCursor, QPainter, QDesktopServices, QStandardItem) from qtconsole.rich_jupyter_widget import RichJupyterWidget from mu.interface.themes import Font from mu.interface.themes import DEFAULT_FONT_SIZE logger = logging.getLogger(__name__) CHARTS = True try: # pragma: no cover from PyQt5.QtChart import QChart, QLineSeries, QChartView, QValueAxis except ImportError: # pragma: no cover logger.info('Unable to find QChart. Plotter button will not display.') QChartView = object CHARTS = False PANE_ZOOM_SIZES = { 'xs': 8, 's': 10, 'm': 14, 'l': 16, 'xl': 18, 'xxl': 24, 'xxxl': 28, } class JupyterREPLPane(RichJupyterWidget): """ REPL = Read, Evaluate, Print, Loop. Displays a Jupyter iPython session. """ on_append_text = pyqtSignal(bytes) def __init__(self, theme='day', parent=None): super().__init__(parent) self.set_theme(theme) self.console_height = 10 def _append_plain_text(self, text, *args, **kwargs): """ Ensures appended text is emitted as a signal with associated bytes. """ super()._append_plain_text(text, *args, **kwargs) self.on_append_text.emit(text.encode('utf-8')) def set_font_size(self, new_size=DEFAULT_FONT_SIZE): """ Sets the font size for all the textual elements in this pane. """ font = self.font font.setPointSize(new_size) self._set_font(font) def set_zoom(self, size): """ Set the current zoom level given the "t-shirt" size. """ self.set_font_size(PANE_ZOOM_SIZES[size]) def set_theme(self, theme): """ Sets the theme / look for the REPL pane. """ if theme == 'contrast': self.set_default_style(colors='nocolor') elif theme == 'night': self.set_default_style(colors='nocolor') else: self.set_default_style() def setFocus(self): """ Override base setFocus so the focus happens to the embedded _control within this widget. """ self._control.setFocus() class MicroPythonREPLPane(QTextEdit): """ REPL = Read, Evaluate, Print, Loop. This widget represents a REPL client connected to a BBC micro:bit running MicroPython. The device MUST be flashed with MicroPython for this to work. """ def __init__(self, serial, theme='day', parent=None): super().__init__(parent) self.serial = serial self.setFont(Font().load()) self.setAcceptRichText(False) self.setReadOnly(False) self.setUndoRedoEnabled(False) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.context_menu) self.setObjectName('replpane') self.set_theme(theme) def paste(self): """ Grabs clipboard contents then sends down the serial port. """ clipboard = QApplication.clipboard() if clipboard and clipboard.text(): to_paste = clipboard.text().replace('\n', '\r').\ replace('\r\r', '\r') self.serial.write(bytes(to_paste, 'utf8')) def context_menu(self): """ Creates custom context menu with just copy and paste. """ menu = QMenu(self) if platform.system() == 'Darwin': copy_keys = QKeySequence(Qt.CTRL + Qt.Key_C) paste_keys = QKeySequence(Qt.CTRL + Qt.Key_V) else: copy_keys = QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_C) paste_keys = QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_V) menu.addAction("Copy", self.copy, copy_keys) menu.addAction("Paste", self.paste, paste_keys) menu.exec_(QCursor.pos()) def set_theme(self, theme): pass def keyPressEvent(self, data): """ Called when the user types something in the REPL. Correctly encodes it and sends it to the connected device. """ key = data.key() msg = bytes(data.text(), 'utf8') if key == Qt.Key_Backspace: msg = b'\b' elif key == Qt.Key_Delete: msg = b'\x1B[\x33\x7E' elif key == Qt.Key_Up: msg = b'\x1B[A' elif key == Qt.Key_Down: msg = b'\x1B[B' elif key == Qt.Key_Right: msg = b'\x1B[C' elif key == Qt.Key_Left: msg = b'\x1B[D' elif key == Qt.Key_Home: msg = b'\x1B[H' elif key == Qt.Key_End: msg = b'\x1B[F' elif (platform.system() == 'Darwin' and data.modifiers() == Qt.MetaModifier) or \ (platform.system() != 'Darwin' and data.modifiers() == Qt.ControlModifier): # Handle the Control key. On OSX/macOS/Darwin (python calls this # platform Darwin), this is handled by Qt.MetaModifier. Other # platforms (Linux, Windows) call this Qt.ControlModifier. Go # figure. See http://doc.qt.io/qt-5/qt.html#KeyboardModifier-enum if Qt.Key_A <= key <= Qt.Key_Z: # The microbit treats an input of \x01 as Ctrl+A, etc. msg = bytes([1 + key - Qt.Key_A]) elif (data.modifiers() == Qt.ControlModifier | Qt.ShiftModifier) or \ (platform.system() == 'Darwin' and data.modifiers() == Qt.ControlModifier): # Command-key on Mac, Ctrl-Shift on Win/Lin if key == Qt.Key_C: self.copy() msg = b'' elif key == Qt.Key_V: self.paste() msg = b'' self.serial.write(msg) def process_bytes(self, data): """ Given some incoming bytes of data, work out how to handle / display them in the REPL widget. """ tc = self.textCursor() # The text cursor must be on the last line of the document. If it isn't # then move it there. while tc.movePosition(QTextCursor.Down): pass i = 0 while i < len(data): if data[i] == 8: # \b tc.movePosition(QTextCursor.Left) self.setTextCursor(tc) elif data[i] == 13: # \r pass elif len(data) > i + 1 and data[i] == 27 and data[i + 1] == 91: # VT100 cursor detected: [ i += 2 # move index to after the [ regex = r'(?P[\d]*)(;?[\d]*)*(?P[ABCDKm])' m = re.search(regex, data[i:].decode('utf-8')) if m: # move to (almost) after control seq # (will ++ at end of loop) i += m.end() - 1 if m.group("count") == '': count = 1 else: count = int(m.group("count")) if m.group("action") == "A": # up tc.movePosition(QTextCursor.Up, n=count) self.setTextCursor(tc) elif m.group("action") == "B": # down tc.movePosition(QTextCursor.Down, n=count) self.setTextCursor(tc) elif m.group("action") == "C": # right tc.movePosition(QTextCursor.Right, n=count) self.setTextCursor(tc) elif m.group("action") == "D": # left tc.movePosition(QTextCursor.Left, n=count) self.setTextCursor(tc) elif m.group("action") == "K": # delete things if m.group("count") == "": # delete to end of line tc.movePosition(QTextCursor.EndOfLine, mode=QTextCursor.KeepAnchor) tc.removeSelectedText() self.setTextCursor(tc) elif data[i] == 10: # \n tc.movePosition(QTextCursor.End) self.setTextCursor(tc) self.insertPlainText(chr(data[i])) else: tc.deleteChar() self.setTextCursor(tc) self.insertPlainText(chr(data[i])) i += 1 self.ensureCursorVisible() def clear(self): """ Clears the text of the REPL. """ self.setText('') def set_font_size(self, new_size=DEFAULT_FONT_SIZE): """ Sets the font size for all the textual elements in this pane. """ font = self.font() font.setPointSize(new_size) self.setFont(font) def set_zoom(self, size): """ Set the current zoom level given the "t-shirt" size. """ self.set_font_size(PANE_ZOOM_SIZES[size]) class MuFileList(QListWidget): """ Contains shared methods for the two types of file listing used in Mu. """ disable = pyqtSignal() list_files = pyqtSignal() set_message = pyqtSignal(str) def show_confirm_overwrite_dialog(self): """ Display a dialog to check if an existing file should be overwritten. Returns a boolean indication of the user's decision. """ msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText(_("File already exists; overwrite it?")) msg.setWindowTitle(_("File already exists")) msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) return msg.exec_() == QMessageBox.Ok class MicrobitFileList(MuFileList): """ Represents a list of files on the micro:bit. """ put = pyqtSignal(str) delete = pyqtSignal(str) def __init__(self, home): super().__init__() self.home = home self.setDragDropMode(QListWidget.DragDrop) def dropEvent(self, event): source = event.source() if isinstance(source, LocalFileList): file_exists = self.findItems(source.currentItem().text(), Qt.MatchExactly) if not file_exists or \ file_exists and self.show_confirm_overwrite_dialog(): self.disable.emit() local_filename = os.path.join(self.home, source.currentItem().text()) msg = _("Copying '{}' to micro:bit.").format(local_filename) logger.info(msg) self.set_message.emit(msg) self.put.emit(local_filename) def on_put(self, microbit_file): """ Fired when the put event is completed for the given filename. """ msg = _("'{}' successfully copied to micro:bit.").format(microbit_file) self.set_message.emit(msg) self.list_files.emit() def contextMenuEvent(self, event): menu = QMenu(self) delete_action = menu.addAction(_("Delete (cannot be undone)")) action = menu.exec_(self.mapToGlobal(event.pos())) if action == delete_action: self.disable.emit() microbit_filename = self.currentItem().text() logger.info("Deleting {}".format(microbit_filename)) msg = _("Deleting '{}' from micro:bit.").format(microbit_filename) logger.info(msg) self.set_message.emit(msg) self.delete.emit(microbit_filename) def on_delete(self, microbit_file): """ Fired when the delete event is completed for the given filename. """ msg = _("'{}' successfully deleted from micro:bit.").\ format(microbit_file) self.set_message.emit(msg) self.list_files.emit() class LocalFileList(MuFileList): """ Represents a list of files in the Mu directory on the local machine. """ get = pyqtSignal(str, str) open_file = pyqtSignal(str) def __init__(self, home): super().__init__() self.home = home self.setDragDropMode(QListWidget.DragDrop) def dropEvent(self, event): source = event.source() if isinstance(source, MicrobitFileList): file_exists = self.findItems(source.currentItem().text(), Qt.MatchExactly) if not file_exists or \ file_exists and self.show_confirm_overwrite_dialog(): self.disable.emit() microbit_filename = source.currentItem().text() local_filename = os.path.join(self.home, microbit_filename) msg = _("Getting '{}' from micro:bit. " "Copying to '{}'.").format(microbit_filename, local_filename) logger.info(msg) self.set_message.emit(msg) self.get.emit(microbit_filename, local_filename) def on_get(self, microbit_file): """ Fired when the get event is completed for the given filename. """ msg = _("Successfully copied '{}' " "from the micro:bit to your computer.").format(microbit_file) self.set_message.emit(msg) self.list_files.emit() def contextMenuEvent(self, event): menu = QMenu(self) local_filename = self.currentItem().text() # Get the file extension ext = os.path.splitext(local_filename)[1].lower() open_internal_action = None # Mu micro:bit mode only handles .py & .hex if ext == '.py' or ext == '.hex': open_internal_action = menu.addAction(_("Open in Mu")) # Open outside Mu (things get meta if Mu is the default application) open_action = menu.addAction(_("Open")) action = menu.exec_(self.mapToGlobal(event.pos())) if action == open_action: # Get the file's path path = os.path.join(self.home, local_filename) logger.info("Opening {}".format(path)) msg = _("Opening '{}'").format(local_filename) logger.info(msg) self.set_message.emit(msg) # Let Qt work out how to open it QDesktopServices.openUrl(QUrl.fromLocalFile(path)) elif action == open_internal_action: logger.info("Open {} internally".format(local_filename)) # Get the file's path path = os.path.join(self.home, local_filename) # Send the signal bubbling up the tree self.open_file.emit(path) class FileSystemPane(QFrame): """ Contains two QListWidgets representing the micro:bit and the user's code directory. Users transfer files by dragging and dropping. Highlighted files can be selected for deletion. """ set_message = pyqtSignal(str) set_warning = pyqtSignal(str) list_files = pyqtSignal() open_file = pyqtSignal(str) def __init__(self, home): super().__init__() self.home = home self.font = Font().load() microbit_fs = MicrobitFileList(home) local_fs = LocalFileList(home) @local_fs.open_file.connect def on_open_file(file): # Bubble the signal up self.open_file.emit(file) layout = QGridLayout() self.setLayout(layout) microbit_label = QLabel() microbit_label.setText(_('Files on your micro:bit:')) local_label = QLabel() local_label.setText(_('Files on your computer:')) self.microbit_label = microbit_label self.local_label = local_label self.microbit_fs = microbit_fs self.local_fs = local_fs self.set_font_size() layout.addWidget(microbit_label, 0, 0) layout.addWidget(local_label, 0, 1) layout.addWidget(microbit_fs, 1, 0) layout.addWidget(local_fs, 1, 1) self.microbit_fs.disable.connect(self.disable) self.microbit_fs.set_message.connect(self.show_message) self.local_fs.disable.connect(self.disable) self.local_fs.set_message.connect(self.show_message) def disable(self): """ Stops interaction with the list widgets. """ self.microbit_fs.setDisabled(True) self.local_fs.setDisabled(True) self.microbit_fs.setAcceptDrops(False) self.local_fs.setAcceptDrops(False) def enable(self): """ Allows interaction with the list widgets. """ self.microbit_fs.setDisabled(False) self.local_fs.setDisabled(False) self.microbit_fs.setAcceptDrops(True) self.local_fs.setAcceptDrops(True) def show_message(self, message): """ Emits the set_message signal. """ self.set_message.emit(message) def show_warning(self, message): """ Emits the set_warning signal. """ self.set_warning.emit(message) def on_ls(self, microbit_files): """ Displays a list of the files on the micro:bit. Since listing files is always the final event in any interaction between Mu and the micro:bit, this enables the controls again for further interactions to take place. """ self.microbit_fs.clear() self.local_fs.clear() for f in microbit_files: self.microbit_fs.addItem(f) local_files = [f for f in os.listdir(self.home) if os.path.isfile(os.path.join(self.home, f))] local_files.sort() for f in local_files: self.local_fs.addItem(f) self.enable() def on_ls_fail(self): """ Fired when listing files fails. """ self.show_warning(_("There was a problem getting the list of files on " "the micro:bit. Please check Mu's logs for " "technical information. Alternatively, try " "unplugging/plugging-in your micro:bit and/or " "restarting Mu.")) self.disable() def on_put_fail(self, filename): """ Fired when the referenced file cannot be copied onto the micro:bit. """ self.show_warning(_("There was a problem copying the file '{}' onto " "the micro:bit. Please check Mu's logs for " "more information.").format(filename)) def on_delete_fail(self, filename): """ Fired when a deletion on the micro:bit for the given file failed. """ self.show_warning(_("There was a problem deleting '{}' from the " "micro:bit. Please check Mu's logs for " "more information.").format(filename)) def on_get_fail(self, filename): """ Fired when getting the referenced file on the micro:bit failed. """ self.show_warning(_("There was a problem getting '{}' from the " "micro:bit. Please check Mu's logs for " "more information.").format(filename)) def set_theme(self, theme): pass def set_font_size(self, new_size=DEFAULT_FONT_SIZE): """ Sets the font size for all the textual elements in this pane. """ self.font.setPointSize(new_size) self.microbit_label.setFont(self.font) self.local_label.setFont(self.font) self.microbit_fs.setFont(self.font) self.local_fs.setFont(self.font) def set_zoom(self, size): """ Set the current zoom level given the "t-shirt" size. """ self.set_font_size(PANE_ZOOM_SIZES[size]) class PythonProcessPane(QTextEdit): """ Handles / displays a Python process's stdin/out with working command history and simple buffer editing. """ on_append_text = pyqtSignal(bytes) def __init__(self, parent=None): super().__init__(parent) self.setFont(Font().load()) self.setAcceptRichText(False) self.setReadOnly(False) self.setUndoRedoEnabled(False) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.context_menu) self.running = False # Flag to show the child process is running. self.setObjectName('PythonRunner') self.process = None # Will eventually reference the running process. self.input_history = [] # history of inputs entered in this session. self.start_of_current_line = 0 # start position of the input line. self.history_position = 0 # current position when navigation history. self.stdout_buffer = b'' # contains non-decoded bytes from stdout. self.reading_stdout = False # flag showing if already reading stdout. def start_process(self, script_name, working_directory, interactive=True, debugger=False, command_args=None, envars=None, runner=None, python_args=None): """ Start the child Python process. Will run the referenced Python script_name within the context of the working directory. If interactive is True (the default) the Python process will run in interactive mode (dropping the user into the REPL when the script completes). If debugger is True (the default is False) then the script will run within a debug runner session. If there is a list of command_args (the default is None), then these will be passed as further arguments into the script to be run. If there is a list of environment variables, these will be part of the context of the new child process. If runner is given, this is used as the command to start the Python process. If python_args is given, these are passed as arguments to the Python runtime used to launch the child process. """ self.script = os.path.abspath(os.path.normcase(script_name)) logger.info('Running script: {}'.format(self.script)) if interactive: logger.info('Running with interactive mode.') if command_args is None: command_args = [] logger.info('Command args: {}'.format(command_args)) self.process = QProcess(self) self.process.setProcessChannelMode(QProcess.MergedChannels) # Force buffers to flush immediately. env = QProcessEnvironment.systemEnvironment() env.insert('PYTHONUNBUFFERED', '1') env.insert('PYTHONIOENCODING', 'utf-8') if sys.platform == 'darwin': parent_dir = os.path.dirname(__file__) if '.app/Contents/Resources/app/mu' in parent_dir: # Mu is running as a macOS app bundle. Ensure the expected # paths are in PYTHONPATH of the subprocess. env.insert('PYTHONPATH', ':'.join(sys.path)) if sys.platform == 'win32' and 'pythonw.exe' in sys.executable: # On Windows, if installed via NSIS then Python is always run in # isolated mode via pythonw.exe so none of the expected directories # are on sys.path. To mitigate, Mu attempts to drop a mu.pth file # in a location taken from Windows based settings. This file will # contain the "other" directories to include on the Python path, # such as the working_directory and, if different from the # working_directory, the directory containing the script to run. try: if site.ENABLE_USER_SITE: # Ensure the USER_SITE directory exists. os.makedirs(site.getusersitepackages(), exist_ok=True) site_path = site.USER_SITE path_file = os.path.join(site_path, 'mu.pth') logger.info('Python paths set via {}'.format(path_file)) # Copy current Python paths. Use a set to avoid # duplications. paths_to_use = set([os.path.normcase(p) for p in sys.path]) # Add Mu's working directory. paths_to_use.add(os.path.normcase(working_directory)) # Add the directory containing the script. paths_to_use.add(os.path.normcase( os.path.dirname(self.script))) # Dropping a mu.pth file containing the paths_to_use # into USER_SITE will add such paths to sys.path in the # child process. with open(path_file, 'w') as mu_pth: for p in paths_to_use: mu_pth.write(p + '\n') else: logger.info("Unable to set Python paths." " Python's USER_SITE not enabled." " Check configuration with administrator.") except Exception as ex: # Log all possible errors and allow Mu to continue. This is a # "best effort" attempt to add the correct paths to the child # process, but sometimes configuration by sys-admins may cause # this to fail. logger.error('Could not set Python paths with mu.pth file.') logger.error(ex) if envars: logger.info('Running with environment variables: ' '{}'.format(envars)) for name, value in envars: env.insert(name, value) logger.info('Working directory: {}'.format(working_directory)) self.process.setWorkingDirectory(working_directory) self.process.setProcessEnvironment(env) self.process.readyRead.connect(self.try_read_from_stdout) self.process.finished.connect(self.finished) logger.info('Python path: {}'.format(sys.path)) if debugger: # Start the mu-debug runner for the script. parent_dir = os.path.join(os.path.dirname(__file__), '..') mu_dir = os.path.abspath(parent_dir) runner = os.path.join(mu_dir, 'mu-debug.py') python_exec = sys.executable args = [runner, self.script, ] + command_args self.process.start(python_exec, args) else: if runner: # Use the passed in Python "runner" to run the script. python_exec = runner else: # Use the current system Python to run the script. python_exec = sys.executable if interactive: # Start the script in interactive Python mode. args = ['-i', self.script, ] + command_args else: # Just run the command with no additional flags. args = [self.script, ] + command_args if python_args: args = python_args + args self.process.start(python_exec, args) self.running = True def finished(self, code, status): """ Handle when the child process finishes. """ self.running = False cursor = self.textCursor() cursor.movePosition(cursor.End) cursor.insertText('\n\n---------- FINISHED ----------\n') msg = 'exit code: {} status: {}'.format(code, status) cursor.insertText(msg) cursor.movePosition(QTextCursor.End) self.setTextCursor(cursor) self.setReadOnly(True) def context_menu(self): """ Creates custom context menu with just copy and paste. """ menu = QMenu(self) if platform.system() == 'Darwin': copy_keys = QKeySequence(Qt.CTRL + Qt.Key_C) paste_keys = QKeySequence(Qt.CTRL + Qt.Key_V) else: copy_keys = QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_C) paste_keys = QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_V) menu.addAction("Copy", self.copy, copy_keys) menu.addAction("Paste", self.paste, paste_keys) menu.exec_(QCursor.pos()) def paste(self): """ Grabs clipboard contents then writes to the REPL. """ clipboard = QApplication.clipboard() if clipboard and clipboard.text(): # normalize for Windows line-ends. text = '\n'.join(clipboard.text().splitlines()) if text: self.parse_paste(text) def parse_paste(self, text): """ Recursively takes characters from text to be parsed as input. We do this so the event loop has time to respond to output from the process to which the characters are sent (for example, when a newline is sent). Yes, this is a quick and dirty hack, but ensures the pasted input is also evaluated in an interactive manner rather than as a single-shot splurge of data. Essentially, it's simulating someone typing in the characters of the pasted text *really fast* but in such a way that the event loop cycles. """ character = text[0] # the current character to process. remainder = text[1:] # remaining characters to process in the future. if character.isprintable() or character in string.printable: if character == '\n' or character == '\r': self.parse_input(Qt.Key_Enter, character, None) else: self.parse_input(None, character, None) if remainder: # Schedule a recursive call of parse_paste with the remaining text # to process. This allows the event loop to cycle and handle any # output from the child process as a result of the text pasted so # far (especially useful for handling responses from newlines). QTimer.singleShot(2, lambda text=remainder: self.parse_paste(text)) def keyPressEvent(self, data): """ Called when the user types something in the REPL. """ key = data.key() text = data.text() modifiers = data.modifiers() self.parse_input(key, text, modifiers) def on_process_halt(self): """ Called when the the user has manually halted a running process. Ensures that the remaining data from the halted process's stdout is handled properly. When the process is halted the user is dropped into the Python prompt and this method ensures the UI is updated in a clean, non-blocking way. """ data = self.process.readAll().data() if data: while True: try: self.append(data) self.on_append_text.emit(data) self.set_start_of_current_line() break except UnicodeDecodeError: # Discard problematic start byte and try again. # (This may be caused by a split in multi-byte characters). data = data[1:] def parse_input(self, key, text, modifiers): """ Correctly encodes user input and sends it to the connected process. The key is a Qt.Key_Something value, text is the textual representation of the input, and modifiers are the control keys (shift, CTRL, META, etc) also used. """ msg = b'' # Eventually to be inserted into the pane at the cursor. if key == Qt.Key_Enter or key == Qt.Key_Return: msg = b'\n' elif (platform.system() == 'Darwin' and modifiers == Qt.MetaModifier) or \ (platform.system() != 'Darwin' and modifiers == Qt.ControlModifier): # Handle CTRL-C and CTRL-D if self.process and self.running: pid = self.process.processId() # NOTE: Windows related constraints don't allow us to send a # CTRL-C, rather, the process will just terminate. halt_flag = False if key == Qt.Key_C: halt_flag = True os.kill(pid, signal.SIGINT) if key == Qt.Key_D: halt_flag = True self.process.kill() if halt_flag: # Clean up from kill signal. self.process.readAll() # Discard queued output. self.stdout_buffer = b'' # Schedule update of the UI after the process halts (in # next iteration of the event loop). QTimer.singleShot(1, self.on_process_halt) return elif key == Qt.Key_Up: self.history_back() elif key == Qt.Key_Down: self.history_forward() elif key == Qt.Key_Right: cursor = self.textCursor() cursor.movePosition(QTextCursor.Right) self.setTextCursor(cursor) elif key == Qt.Key_Left: cursor = self.textCursor() if cursor.position() > self.start_of_current_line: cursor.movePosition(QTextCursor.Left) self.setTextCursor(cursor) elif key == Qt.Key_Home: cursor = self.textCursor() cursor.movePosition(QTextCursor.End) buffer_len = len(self.toPlainText()) - self.start_of_current_line for i in range(buffer_len): cursor.movePosition(QTextCursor.Left) self.setTextCursor(cursor) elif key == Qt.Key_End: cursor = self.textCursor() cursor.movePosition(QTextCursor.End) self.setTextCursor(cursor) elif (modifiers == Qt.ControlModifier | Qt.ShiftModifier) or \ (platform.system() == 'Darwin' and modifiers == Qt.ControlModifier): # Command-key on Mac, Ctrl-Shift on Win/Lin if key == Qt.Key_C: self.copy() elif key == Qt.Key_V: self.paste() elif text.isprintable(): # If the key is for a printable character then add it to the # active buffer and display it. msg = bytes(text, 'utf8') if key == Qt.Key_Backspace: self.backspace() if key == Qt.Key_Delete: self.delete() if key == Qt.Key_Enter or key == Qt.Key_Return: # First move cursor to the end of the line and insert newline in # case return/enter is pressed while the cursor is in the # middle of the line cursor = self.textCursor() cursor.movePosition(QTextCursor.End) self.setTextCursor(cursor) self.insert(msg) # Then write line to std_in and add to history content = self.toPlainText() line = content[self.start_of_current_line:].encode('utf-8') self.write_to_stdin(line) if line.strip(): self.input_history.append(line.replace(b'\n', b'')) self.history_position = 0 self.set_start_of_current_line() elif not self.isReadOnly() and msg: self.insert(msg) def set_start_of_current_line(self): """ Set the flag to indicate the start of the current line (used before waiting for input). This flag is used to discard the preceeding text in the text entry field when Mu parses new input from the user (i.e. any text beyond the self.start_of_current_line). """ self.start_of_current_line = len(self.toPlainText()) def history_back(self): """ Replace the current input line with the next item BACK from the current history position. """ if self.input_history: self.history_position -= 1 history_pos = len(self.input_history) + self.history_position if history_pos < 0: self.history_position += 1 history_pos = 0 history_item = self.input_history[history_pos] self.replace_input_line(history_item) def history_forward(self): """ Replace the current input line with the next item FORWARD from the current history position. """ if self.input_history: self.history_position += 1 history_pos = len(self.input_history) + self.history_position if history_pos >= len(self.input_history): # At the most recent command. self.history_position = 0 self.clear_input_line() return history_item = self.input_history[history_pos] self.replace_input_line(history_item) def try_read_from_stdout(self): """ Ensure reading from stdout only happens if there is NOT already current attempts to read from stdout. """ if not self.reading_stdout: self.reading_stdout = True self.read_from_stdout() def read_from_stdout(self): """ Process incoming data from the process's stdout. """ data = self.process.read(256) if data: data = self.stdout_buffer + data try: self.append(data) self.on_append_text.emit(data) self.set_start_of_current_line() self.stdout_buffer = b'' except UnicodeDecodeError: self.stdout_buffer = data QTimer.singleShot(2, self.read_from_stdout) else: self.reading_stdout = False def write_to_stdin(self, data): """ Writes data from the Qt application to the child process's stdin. """ if self.process: self.process.write(data) def append(self, msg): """ Append text to the text area. """ cursor = self.textCursor() cursor.movePosition(QTextCursor.End) cursor.insertText(msg.decode('utf-8')) cursor.movePosition(QTextCursor.End) self.setTextCursor(cursor) def insert(self, msg): """ Insert text to the text area at the current cursor position. """ cursor = self.textCursor() if cursor.position() < self.start_of_current_line: cursor.movePosition(QTextCursor.End) cursor.insertText(msg.decode('utf-8')) self.setTextCursor(cursor) def backspace(self): """ Removes a character from the current buffer -- to the left of cursor. """ cursor = self.textCursor() if cursor.position() > self.start_of_current_line: cursor = self.textCursor() cursor.deletePreviousChar() self.setTextCursor(cursor) def delete(self): """ Removes a character from the current buffer -- to the right of cursor. """ cursor = self.textCursor() if cursor.position() >= self.start_of_current_line: cursor.deleteChar() self.setTextCursor(cursor) def clear_input_line(self): """ Remove all the characters currently in the input buffer line. """ cursor = self.textCursor() cursor.movePosition(QTextCursor.End) buffer_len = len(self.toPlainText()) - self.start_of_current_line for i in range(buffer_len): cursor.deletePreviousChar() self.setTextCursor(cursor) def replace_input_line(self, text): """ Replace the current input line with the passed in text. """ self.clear_input_line() self.append(text) def set_font_size(self, new_size=DEFAULT_FONT_SIZE): """ Sets the font size for all the textual elements in this pane. """ f = self.font() f.setPointSize(new_size) self.setFont(f) def set_zoom(self, size): """ Set the current zoom level given the "t-shirt" size. """ self.set_font_size(PANE_ZOOM_SIZES[size]) def set_theme(self, theme): pass class DebugInspectorItem(QStandardItem): def __init__(self, *args): super().__init__(*args) self.setEditable(False) class DebugInspector(QTreeView): """ Presents a tree like representation of the current state of the call stack to the user. """ def __init__(self): super().__init__() self.setUniformRowHeights(True) self.setSelectionBehavior(QTreeView.SelectRows) def set_font_size(self, new_size=DEFAULT_FONT_SIZE): """ Sets the font size for all the textual elements in this pane. """ stylesheet = ("QWidget{font-size: " + str(new_size) + "pt; font-family: Monospace;}") self.setStyleSheet(stylesheet) def set_zoom(self, size): """ Set the current zoom level given the "t-shirt" size. """ self.set_font_size(PANE_ZOOM_SIZES[size]) def set_theme(self, theme): pass class PlotterPane(QChartView): """ This plotter widget makes viewing sensor data easy! This widget represents a chart that will look for tuple data from the MicroPython REPL, Python 3 REPL or Python 3 code runner and will auto-generate a graph. """ data_flood = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) # Holds the raw input to be checked for actionable data to display. self.input_buffer = [] # Holds the raw actionable data detected while plotting. self.raw_data = [] self.setObjectName('plotterpane') self.max_x = 100 # Maximum value along x axis self.max_y = 1000 # Maximum value +/- along y axis self.flooded = False # Flag to indicate if data flooding is happening. # Holds deques for each slot of incoming data (assumes 1 to start with) self.data = [deque([0] * self.max_x), ] # Holds line series for each slot of incoming data (assumes 1 to start # with). self.series = [QLineSeries(), ] # Ranges used for the Y axis (up to 1000, after which we just double # the range). self.y_ranges = [1, 5, 10, 25, 50, 100, 250, 500, 1000] # Set up the chart with sensible defaults. self.chart = QChart() self.chart.legend().hide() self.chart.addSeries(self.series[0]) self.axis_x = QValueAxis() self.axis_y = QValueAxis() self.axis_x.setRange(0, self.max_x) self.axis_y.setRange(-self.max_y, self.max_y) self.axis_x.setLabelFormat("time") self.axis_y.setLabelFormat("%d") self.chart.setAxisX(self.axis_x, self.series[0]) self.chart.setAxisY(self.axis_y, self.series[0]) self.setChart(self.chart) self.setRenderHint(QPainter.Antialiasing) def process_bytes(self, data): """ Takes raw bytes and, if a valid tuple is detected, adds the data to the plotter. The the length of the bytes data > 1024 then a data_flood signal is emitted to ensure Mu can take action to remain responsive. """ # Data flooding guards. if self.flooded: return if len(data) > 1024: self.flooded = True self.data_flood.emit() return data = data.replace(b'\r\n', b'\n') self.input_buffer.append(data) # Check if the data contains a Python tuple, containing numbers, on a # single line (i.e. ends with \n). input_bytes = b''.join(self.input_buffer) lines = input_bytes.split(b'\n') for line in lines: if line.startswith(b'(') and line.endswith(b')'): # Candidate tuple. Extract the raw bytes into a numeric tuple. raw_values = [val.strip() for val in line[1:-1].split(b',')] numeric_values = [] for raw in raw_values: try: numeric_values.append(int(raw)) # It worked, so move onto the next value. continue except ValueError: # Try again as a float. pass try: numeric_values.append(float(raw)) except ValueError: # Not an int or float, so ignore this value. continue if numeric_values: # There were numeric values in the tuple, so use them! self.add_data(tuple(numeric_values)) # Reset the input buffer. self.input_buffer = [] if lines[-1]: # Append any bytes that are not yet at the end of a line, for # processing next time we read data from self.serial. self.input_buffer.append(lines[-1]) def add_data(self, values): """ Given a tuple of values, ensures there are the required number of line series, add the data to the line series, update the range of the chart so the chart displays nicely. """ # Store incoming data to dump as CSV at the end of the session. self.raw_data.append(values) # Check the number of incoming values. if len(values) != len(self.series): # Adjust the number of line series. value_len = len(values) series_len = len(self.series) if value_len > series_len: # Add new line series. for i in range(value_len - series_len): new_series = QLineSeries() self.chart.addSeries(new_series) self.chart.setAxisX(self.axis_x, new_series) self.chart.setAxisY(self.axis_y, new_series) self.series.append(new_series) self.data.append(deque([0] * self.max_x)) else: # Remove old line series. for old_series in self.series[value_len:]: self.chart.removeSeries(old_series) self.series = self.series[:value_len] self.data = self.data[:value_len] # Add the incoming values to the data to be displayed, and compute # max range. max_ranges = [] for i, value in enumerate(values): self.data[i].appendleft(value) max_ranges.append(max([max(self.data[i]), abs(min(self.data[i]))])) if len(self.data[i]) > self.max_x: self.data[i].pop() # Re-scale y-axis. max_y_range = max(max_ranges) y_range = bisect.bisect_left(self.y_ranges, max_y_range) if y_range < len(self.y_ranges): self.max_y = self.y_ranges[y_range] elif max_y_range > self.max_y: self.max_y += self.max_y elif max_y_range < self.max_y / 2: self.max_y = self.max_y / 2 self.axis_y.setRange(-self.max_y, self.max_y) # Ensure floats are used to label y axis if the range is small. if self.max_y <= 5: self.axis_y.setLabelFormat("%2.2f") else: self.axis_y.setLabelFormat("%d") # Update the line series with the data. for i, line_series in enumerate(self.series): line_series.clear() xy_vals = [] for j in range(self.max_x): val = self.data[i][self.max_x - 1 - j] xy_vals.append((j, val)) for point in xy_vals: line_series.append(*point) def set_theme(self, theme): """ Sets the theme / look for the plotter pane. """ if theme == 'day': self.chart.setTheme(QChart.ChartThemeLight) elif theme == 'night': self.chart.setTheme(QChart.ChartThemeDark) else: self.chart.setTheme(QChart.ChartThemeHighContrast) mu-editor-1.0.2+dfsg/mu/interface/themes.py000066400000000000000000000202331341747546300205740ustar00rootroot00000000000000""" Theme and presentation related code for the Mu editor. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import logging import platform from PyQt5.QtGui import QColor, QFontDatabase from mu.resources import load_stylesheet, load_font_data logger = logging.getLogger(__name__) def should_patch_osx_mojave_font(): """ OSX mojave and qt5/qtscintilla has a bug where non-system installed fonts are always rendered as black, regardless of the theme color. This is inconvenient for light themes, but makes dark themes unusable. Using a system-installed font doesn't exhibit this behaviour, so update FONT_NAME to use the default terminal font in OSX on mojave. This patch should be removed once the underlying issue has been resolved github issue #552 """ return platform.platform().startswith("Darwin-18.") # The default font size. DEFAULT_FONT_SIZE = 14 # All editor windows use the same font if should_patch_osx_mojave_font(): # pragma: no cover logger.warn("Overriding built-in editor font due to Issue #552") FONT_NAME = "Monaco" else: # pragma: no cover FONT_NAME = "Source Code Pro" FONT_FILENAME_PATTERN = "SourceCodePro-{variant}.otf" FONT_VARIANTS = ("Bold", "BoldIt", "It", "Regular", "Semibold", "SemiboldIt") # Load the two themes from resources/css/[night|day].css # NIGHT_STYLE is a dark theme. NIGHT_STYLE = load_stylesheet('night.css') # DAY_STYLE is a light conventional theme. DAY_STYLE = load_stylesheet('day.css') # CONTRAST_STYLE is a high contrast theme. CONTRAST_STYLE = load_stylesheet('contrast.css') logger = logging.getLogger(__name__) class Font: """ Utility class that makes it easy to set font related values within the editor. """ _DATABASE = None def __init__(self, color='#181818', paper='#FEFEF7', bold=False, italic=False): self.color = color self.paper = paper self.bold = bold self.italic = italic @classmethod def get_database(cls): """ Create a font database and load the MU builtin fonts into it. This is a cached classmethod so the font files aren't re-loaded every time a font is refereced """ if cls._DATABASE is None: cls._DATABASE = QFontDatabase() for variant in FONT_VARIANTS: filename = FONT_FILENAME_PATTERN.format(variant=variant) font_data = load_font_data(filename) cls._DATABASE.addApplicationFontFromData(font_data) return cls._DATABASE def load(self, size=DEFAULT_FONT_SIZE): """ Load the font from the font database, using the correct size and style """ return Font.get_database().font(FONT_NAME, self.stylename, size) @property def stylename(self): """ Map the bold and italic boolean flags here to a relevant font style name. """ if self.bold: if self.italic: return "Semibold Italic" return "Semibold" if self.italic: return "Italic" return "Regular" class Theme: """ Defines a font and other theme specific related information. """ @classmethod def apply_to(cls, lexer): # Apply a font for all styles lexer.setFont(Font().load()) for name, font in cls.__dict__.items(): if not isinstance(font, Font): continue style_num = getattr(lexer, name) lexer.setColor(QColor(font.color), style_num) lexer.setEolFill(True, style_num) lexer.setPaper(QColor(font.paper), style_num) lexer.setFont(font.load(), style_num) class DayTheme(Theme): """ Defines a Python related theme including the various font colours for syntax highlighting. This is a light theme. """ FunctionMethodName = ClassName = Font(color='#0000a0') UnclosedString = Font(paper='#FFDDDD') Comment = CommentBlock = Font(color='gray') Keyword = Font(color='#005050', bold=True) SingleQuotedString = DoubleQuotedString = Font(color='#800000') TripleSingleQuotedString = TripleDoubleQuotedString = Font(color='#060') Number = Font(color='#00008B') Decorator = Font(color='#cc6600') Default = Identifier = Font() Operator = Font(color='#400040') HighlightedIdentifier = Font(color='#0000a0') Paper = QColor('#FEFEF7') Caret = QColor('#181818') Margin = QColor('#EEE') IndicatorError = QColor('red') IndicatorStyle = QColor('blue') DebugStyle = QColor('#ffcc33') IndicatorWordMatch = QColor('lightGrey') BraceBackground = QColor('lightGrey') BraceForeground = QColor('blue') UnmatchedBraceBackground = QColor('#FFDDDD') UnmatchedBraceForeground = QColor('black') BreakpointMarker = QColor('#D80000') class NightTheme(Theme): """ Defines a Python related theme including the various font colours for syntax highlighting. This is the dark theme. """ FunctionMethodName = ClassName = Font(color='#81a2be', paper='#222') UnclosedString = Font(paper='#c93827') Comment = CommentBlock = Font(color='#969896', paper='#222') Keyword = Font(color='#73a46a', bold=True, paper='#222') SingleQuotedString = DoubleQuotedString = Font(color='#f0c674', paper='#222') TripleSingleQuotedString = TripleDoubleQuotedString = Font(color='#f0c674', paper='#222') Number = Font(color='#b5bd68', paper='#222') Decorator = Font(color='#cc6666', paper='#222') Default = Identifier = Font(color='#DDD', paper='#222') Operator = Font(color='#b294bb', paper='#222') HighlightedIdentifier = Font(color='#de935f', paper='#222') Paper = QColor('#222') Caret = QColor('#c6c6c6') Margin = QColor('#424446') IndicatorError = QColor('#c93827') IndicatorStyle = QColor('#2f5692') DebugStyle = QColor('#444') IndicatorWordMatch = QColor('#f14721') BraceBackground = QColor('#ed1596') BraceForeground = QColor('#222') UnmatchedBraceBackground = QColor('#c93827') UnmatchedBraceForeground = QColor('#222') BreakpointMarker = QColor('#c93827') class ContrastTheme(Theme): """ Defines a Python related theme including the various font colours for syntax highlighting. This is the high contrast theme. """ FunctionMethodName = ClassName = Font(color='#AAA', paper='black') UnclosedString = Font(paper='#666') Comment = CommentBlock = Font(color='#AAA', paper='black') Keyword = Font(color='#EEE', bold=True, paper='black') SingleQuotedString = DoubleQuotedString = Font(color='#AAA', paper='black') TripleSingleQuotedString = TripleDoubleQuotedString = Font(color='#AAA', paper='black') Number = Font(color='#AAA', paper='black') Decorator = Font(color='#cccccc', paper='black') Default = Identifier = Font(color='#fff', paper='black') Operator = Font(color='#CCC', paper='black') HighlightedIdentifier = Font(color='#ffffff', paper='black') Paper = QColor('black') Caret = QColor('white') Margin = QColor('#333') IndicatorError = QColor('white') IndicatorStyle = QColor('cyan') DebugStyle = QColor('#666') IndicatorWordMatch = QColor('grey') BraceBackground = QColor('white') BraceForeground = QColor('black') UnmatchedBraceBackground = QColor('#666') UnmatchedBraceForeground = QColor('black') BreakpointMarker = QColor('lightGrey') mu-editor-1.0.2+dfsg/mu/locale/000077500000000000000000000000001341747546300162345ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/de_DE/000077500000000000000000000000001341747546300171745ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/de_DE/LC_MESSAGES/000077500000000000000000000000001341747546300207615ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/de_DE/LC_MESSAGES/mu.mo000066400000000000000000000754011341747546300217460ustar00rootroot00000000000000[ &))*?!j$4 "?&b,(TDK +#5YKxJG7`1j5#>b~#9) "6XY"&%$A fer7J2\B7aVKb >g L ! !")!@L!!!!!!!!"# "!."P"l""r"-""?" # 3#A#F#&e#@#:#7$@$9G$J$$R$2%NG%%% %%;%#&<&A&D&#V&'z&!&&&&&@&6'!:'J\''(' ' '/'d(((m()!*+,J,;@-'|-----B-`9.". ...////0 020YA0 0 000 00&1,101 H1T1Y1y1 11 1#1$1#2$)2BN2*222[2<3Z3q3y3 3333333 4=%4=c4O445/6N6{U7L7898O8;:JA:E:j:b=;+;a;.<5<h%==!>E>1>1,?+^?s??@/.@^@+|@@@K@,A+DA(pA A#AA!aB8BB"B$BC%C.C 7CBC JCHUC DDD+D)E8EVE8uE/E8E0F.HF/wFKF1F7%GH]G*GGxGNaH'H HH0I 3ITI*rIIXIJ(J0JSNJ$J]J1%KWK K*K(LHLeL,LAL6L*%M|PMMM9N/ZCZGZJfZZ'Z Z Z<Zq8[[[x[9G\*]'^_e`K3a*aaaa/aUbXmb'b bbcdd#d6d >dJd6Odde&e5eHeaepe%e eee e"ef $f2f(:f:cf4f1f8gC>g*g g%gwg*Vhhhh h h"hi$i*i;iVi-mi9iUi+jj%kEkmRmmFnanapcgpXpz$qvq>rsUrrss]tu?u9v7;v9svv0w#Nw/rw%w:wxxY"x3|x)x-x,y15ygy!y<zVz*nz'z z z z zz zi" 2.4s{#*]_hAN>` Yea'Of|Wo}G%L-1,qy)7J8 k( HCbUmlX&<RK ^\Q~Ixj9Pn0:v$3DBdp?=M6w@tcSFZV/T5uE!g +[rz; Runtime: {} above this line# Write your code here :-)'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Adafruit CircuitPythonAlgorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.Awesome! Zero problems found.BBC micro:bitBBC micro:bit SettingsBe brave, break things, learn and have fun!Beautiful is better than ugly.Cannot Set Breakpoint.Cannot connect to device on port {}Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copied code onto micro:bit.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Debugging is twice as hard as writing the code in the first place.Delete (cannot be undone)Deleting '{}' from micro:bit.Detected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.File already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFor the Zen of Python: import thisGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHello, World!HelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)Is this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.Lines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.Minify Python code before flashing?ModeMuMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu {}Mu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.Now is better than never. Although never is often better than *right* now.OpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):PlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Pygame ZeroPython 3Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 (Jupyter)Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPLREPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.Replace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaveSave the current Python script.Saved file: {}Select ModeSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.Syntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way. If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The micro:bit runtime you specified ('{}') does not exist. Please try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.To understand what recursion is, you must first understand recursion.Toggle theme between day, night or high contrast.Try to see things from your users' point of view.Unable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unsupported BBC micro:bit.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You cannot use the filename "{}"You must provide something to find.Your device is newer than this version of Mu. Please update Mu to the latest version to support this device. https://codewith.mu/Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-outuntitled{} Plotter{} REPL{} [{}:{}]Project-Id-Version: PO-Revision-Date: 2018-07-25 12:07+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 X-Generator: Poedit 2.1 Last-Translator: René Raab Plural-Forms: nplurals=2; plural=(n != 1); Language: de_DE Runtime: {} oberhalb dieser Zeile# Schreibe hier Deinen Code :-)'{}" erfolgreich auf den micro:bit kopiert.'{}' erfolgreich vom micro:bit gelöscht.(Ein dict mit {} Einträgen.)(Eine list mit {} Einträgen.)Eine Datei mit diesem Namen ist bereits in Mu geöffnet.Ein(e) gute(r) Programmierer(in) stellt Fragen.Ein(e) gute(r) Programmierer(in) vermeidet Komplexität.Ein(e) gute(r) Programmierer(in) ist bescheiden.Ein(e) gute(r) Programmierer(in) ist geduldig.Ein(e) gute(r) Programmierer(in) ist verspielt.Ein(e) gute(r) Programmierer(in) ist bereit zu sagen: "Ich weiß es nicht".Ein(e) gute(r) Programmierer(in) lernt zu lernen.Ein(e) gute(r) Programmierer(in) fördert Schlichtheit.Ein(e) gute(r) Programmierer(in) denkt über das Offensichtliche hinaus.Zugriff auf das Dateisystem des micro:bit.Adafruit CircuitPythonAlgorithmus: Ein Wort das von Programmierer(innen) benutzt wird, wenn sie nicht erklären möchten, was sie getan haben.Ein offener Geist, Abenteuerlust und Respekt für Vielfalt sind der SchlüsselAusgezeichnet! Keine Probleme gefunden.BBC micro:bitBBC micro:bit EinstellungenSei mutig, zerstöre Dinge, lerne und hab Spaß!Schön ist besser als hässlich.Kann Haltepunkt nicht setzen.Kann nicht zu Gerät verbinden auf Port {}Ändere den Modus von Mu.Ändern Sie den Modus jederzeit, indem Sie auf den Knopf "Modus" mit dem Mu Logo klickenZu {}-Modus gewechselt.PrüfenCode auf Fehler überprüfen.Drücke den Reset Knopf des Gerätes, warte einige Sekunden und versuche es erneut.Programmieren ist Zusammenarbeiten. Komplexität ist der Gegner. KISS - keep it simple, stupid! (Halte es einfach, supereinfach!)Ergänze und verstärke die guten Dinge mit Code.Zeitüberschreitung der Verbindung. Ist Ihre Maschine langsam oder beschäftigt? Geben Sie einige Ressourcen des Geräts frei und versuchen Sie es erneut.FortfahrenAusführung des Python-Skripts fortsetzen.Code auf den micro:bit kopiert.Kopiere '{}' nach micro:bit.Konnte "{}" nicht finden.Konnte die MicroPython runtime nicht finden.Konnte kein angeschlossenes Adafruit CircuitPython Gerät finden.Konnte den angeschlossenen BBC micro:bit nicht finden.Konnte kein angeschlossenes Gerät finden.Konnte localhost nicht finden. Stellen Sie sicher, dass Sie die Zeile '127.0.0.1 localhost' in Ihrer /etc/hosts Datei haben.Konnte {} nicht ladenKonnte Datei nicht umbenennen.Konnte Datei nicht speichern (Problem mit der Festplatte)Konnte Datei nicht speichern (Encoding Problem)Erstelle ein neues Python-Skript.Erstelle Code mit dem Standard Python 3.Aktuelles ProtokollIm Moment funktioniert Mu nur mit Python Quelldateien oder hex-Dateien die mit MicroPython Code erstellt wurden.Data Flood erkannt!DebuggenDebugging InspectorDebugge Deinen Python 3 Code.Python-Skript debuggen.Debugger Fehler: {}Debugger Info: {}Debugger benötigt zum Ausführen einen Dateinamen zu einem Python Skript.Debugger Warnung: {}Debuggen ist zwei mal so schwer wie das Programmieren.Löschen (kann nicht rückgängig gemacht werden)Lösche '{}' vom micro:bit.Neues {} Gerät erkannt.Vielfalt unterstützt Kreativität.Existiert diese Datei? Falls ja, hast Du die Berechtigung, sie zu lesen? Bitte überprüfe das und versuche es erneut.Ärgere Dich nicht, wenn etwas nicht funktioniert. Lerne daraus, repariere es und versuche es nochmal! :-)Fehler beim Speichern der Datei. Stelle sicher, dass du die Berechtigungen hast, um die Datei zu speichern und dass genügend freier Speicher vorhanden ist.Fehler sollten niemals still vorbeiziehen. Außer sie wurden explizit zum Schweigen gebracht.Die Lösung zeigt sich oft, wenn man ein Programmierproblem Freunden oder Freundinnen erklärt.Explizit ist besser als implizit.Datei existiert bereitsDatei existiert bereits; Überschreiben?Dateisystem funktioniert nicht gleichzeitig zum REPL oder Plotter.DateienDateien auf Ihrem Rechner:Dateien auf Ihrem micro:bit:Dateisystem auf micro:bitSuchen / ErsetzenSuchen:Aufspielen abgeschlossen.AufspielenCode auf den micro:bit aufspielen.Spiele "{}" auf den micro:bit auf.Kurz ist besser als verschachtelt.Schriftarten.Für den Zen von Python: import thisLade '{}' vom micro:bit. Kopiere nach '{}'.Gut gemacht! Keine Probleme gefunden.Google, Facebook, NASA, Pixar, Disney und viele andere nutzen Python.Grafischer DebuggerHallo Welt!HilfeHebe Treffer für "{}" hervor.Hurra! Keine Probleme gefunden.Wenn die Implementierung einfach zu erklären ist, ist sie vermutlich eine gute Idee.Wenn die Implementierung schwer zu erklären ist, ist sie eine schlechte Idee.Wenn Du etwas nicht weißt, frag. Niemand zum Fragen? Schlag' es nach.BilderFalls etwas unklar ist, versuche der Versuchung zu raten zu widerstehen.In der Theorie sind Theorie und Praxis gleich. In der Praxis sind sie es nicht. ;-)Ist dies eine {}-Datei?Es sieht so aus als könnte dies eine {} Datei sein. Möchtest du Mu in den {}-Modus wechseln?Es macht Spaß zu programmieren.Zeilen mit Kommentaren oder mehrzeilige Anweisungen können keine Haltepunkte haben.LadenLade ein Python-Skript.Protokolliere nach {}Spiele mit Pygame Zero erstellen.Mache Deine Software sowohl nützlich als auch spaßig zu benutzen.Python-Code vor dem Flashen verkleinern?ModusMuMu AdministrationMu kann die Zeichen in {} nicht lesenMu wurde von Nicholas H.Tollervey erstellt.Mu konnte die Datei nicht öffnenMu {}Aktueller Verhaltensmodus von Mu.MusikNameNamespaces sind eine gute Idee -- Lasst uns mehr davon machen!NeuCool! Keine Probleme gefunden.Jetzt ist besser als nie. Allerdings ist nie oft besser als *genau* jetzt.ÖffnenSerielle Verbindung zum Gerät öffnen.In Mu öffnenÖffne '{}'Der Minifier wurde ausgeführt, aber das Skript ist zu lang!Überschreibe die eingebaute MicroPython Runtime mit der nachfolgenden hex Datei (leer benutzt den Standardwert):Spielen.Pygame Zero Spiel spielen.Bitte entferne das Gerät erst wenn das Aufspielen abgeschlossen ist. Überprüfe das Protokoll für mehr Informationen.Bitte stelle sicher, dass du genug Zeit lässt damit der BBC micro:bit korrekt vom Computer konfiguriert werden kann. Dies kann einige Sekunden dauern. Alternativ, versuche das Gerät aus- und wieder einzustecken oder Änderungen zu speichern und Mu neu zu starten, falls das Gerät weiterhin nicht gefunden wird.Bitte stelle sicher, dass das Gerät an den Computer angeschlossen ist. Das Gerät muss eine Version von MicroPython (oder CircuitPython) aufgespielt haben, damit der Plotter funktioniert. Abschließend, drücke den Reset Knopf des Gerätes und warte einige Sekunden bevor Du es erneut versuchst.Bitte stelle sicher, dass das Gerät an den Computer angeschlossen ist. Das Gerät muss eine Version von MicroPython (oder CircuitPython) aufgespielt haben, damit der REPL funktioniert. Abschließend, drücke den Reset Knopf des Gerätes und warte einige Sekunden bevor Du es erneut versuchst.Bitte stelle sicher, dass das Gerät an den Computer angeschlossen ist. Das Gerät muss MicroPython aufgespielt haben bevor das Dateisystem funktioniert. Drücke den Reset Knopf des Gerätes und warte einige Sekunden bevor Du es erneut versuchst.Bitte wählen Sie den gewünschten Modus und klicken dann "OK". Andernfalls, klicken Sie "Abbrechen".Bitte versuche es erneut nachdem Du etwas in das Suchfeld geschrieben hast.Plotte Daten aus dem Skript oder dem REPL.Plotte eingehende REPL Daten.PlotterProblem mit dem SkriptProgrammierer(innen) beginnen bei 0 zu zählen.Programmieren hat mehr mit dem Lösen von Problemen zu tun als nur Code zu schreiben.Programmieren ist eine Form von Magie. Du musst nur die richtigen Zaubersprüche lernen.Versetze Dich in die Lage der Benutzer.Pygame ZeroPython 3Python-Dateien für Adafruit CircuitPython Geräte werden auf dem Gerät gespeichert. Um diese Dateien zu bearbeiten muss das Gerät angeschlossen sein. Bis ein Gerät angeschlossen ist, wird Mu diesen Ordner benuzten: {} um Deinen Code zu speichern.Python3 (Jupyter)Python3 UmgebungPython3 DatentupelBeendenMu beenden.REPLREPL und Dateisystem funktionieren nicht gleichzeitig.REPL steht für read (lesen), evaluate (ausführen), print (ausgeben), loop (wiederholen). Es macht Spaß, so mit deinem Computer zu reden! :-)REPL gestartet.REPL gestoppt.Lesbarkeit zählt.Ersetzen mit (optional):Alle ersetzen?"{}" mit "{}" ersetzt.{} Treffer von "{}" mit "{}" ersetzt.AusführenPython-Skript ausführen.Führe aus: {}SpeichernAktuelles Python-Skript speichern.Datei gespeichert: {}Modus wählenSeriellHilfe für Mu in einem Browser anzeigen.Schriftarten anzeigen, die von Pygame Zero benutzt werden.Bilder anzeigen, die von Pygame Zero benutzt werden.Musik anzeigen, die von Pygame Zero benutzt wird.Geräusche anzeigen, die von Pygame Zero benutzt werden.Einfach ist besser als komplex. Komplex ist besser als kompliziert.Einfachheit ist die ultimative Perfektion.GeräuscheDünn/spärlich ist besser als dicht.Spezialfälle sind nicht speziell genug um die Regeln zu brechen. Allerdings schlägt Praktikabilität die Einfachheit.Starte mit den Bedürfnissen der Benutzer.Starte iPython REPL.Schritt hineinSchritt herausÜberspringenSchritt in eine Funktion hinein.Schritt heraus aus einer Funktion.Überspringe eine Code-Zeile.StoppStoppe den Code.Pygame Zero Spiel beenden.Python-Skript stoppen.Stoppe iPython REPL (kann eine Weile dauern).'{}' erfolgreich vom micro:bit auf Ihren Rechner kopiert.Syntaxfehler. Python kann diese Zeile nicht verstehen. Überprüfe ob Zeichen fehlen!Der REPL und das Dateisystem nutzen die gleiche USB-Seriell-Verbindung. Zu jedem Zeitpunkt kann nur eins davon aktiv sein. Schalte das Dateisystem aus und probiere es erneut.Die nachfolgenden Umgebungsvariablen werden jedes mal gesetzt, wenn Sie ein Python 3 Skript ausführen. Jede separate Umgebungsvariable sollte in einer eigenen Zeile und von der folgenden Form sein: NAME=WERTDie Datei "{}" ist bereits geöffnet.Die Datei enthält Zeichen von denen Mu glaubt, dass sie als {0} oder als {1} (Standard auf diesem Computer) kodiert sind. Allerdings sind sie irgendwie anders kodiert. Falls diese Datei in einer anderen Anwendung gespeichert wurde, speichere die Datei nochmal mit der "Speichern als" Option und setze die Kodierung auf {0}.Das Dateisystem und der REPL und Plotter nutzen die gleiche USB-Seriell-Verbindung. Schalte den REPL und Plotter aus und versuche es erneut.Die angegebene micro:bit runtime ('{}') existiert nicht. Bitte versuche es erneut.Das Dateisystem und der REPL und Plotter nutzen die gleiche USB-Seriell-Verbindung. Zu jedem Zeitpunkt kann nur eins davon aktiv sein. Schalte den REPL und Plotter aus und versuche es erneut.Der Plotter und das Dateisystem funktionieren nicht zur gleichen Zeit.Der Plotter ist mit Daten überflutet. Das führt dazu das Mu nicht reagiert und einfriert. Aus Sicherheitsgründen wurde der Plotter beendet. Überflutung passiert wenn Datenblöcke mit mehr als 1024 Bytes wiederholt an den Plotter gesendet werden. Um dies zu beheben, stelle Sicher, dass Dein Code kleine Datentupel zwischen "sleep"-Aufrufen sendet.ThemaEs existieren nicht gespeicherte Änderungen. Das Beenden der Anwendung verwirft diese Änderungen.Es sollte einen -- vorzugsweise genau einen -- offensichtlichen Weg geben, etwas zu tun.Beim Kopieren von '{}' auf den micro:bit ist ein Problem aufgetreten. Prüfe das Protokoll von Mu für mehr Informationen.Beim Löschen von '{}' vom micro:bit ist ein Problem aufgetreten. Prüfe das Protokoll von Mu für mehr Informationen.Beim Aufspielen auf den micro:bit ist ein Problem aufgetreten.Beim Laden von '{}' vom micro:bit ist ein Problem aufgetreten. Prüfe das Protokoll von Mu für mehr Informationen.Beim Laden der Liste der Dateien auf dem micro:bit ist ein Problem aufgetreten. Prüfe das Protokoll von Mu für technische Informationen. Alternativ, versuche Deinen micro:bit aus und wieder einzustecken und/oder Mu neuzustarten.Dieser Editor heißt Mu.Dieser Editor ist freie Software, geschrieben in Python. Du kannst ihn modifizieren, Funktionen hinzufügen oder Fehler beheben, wenn Du möchtest.Dieser Name wird bereits von einem anderen Teil von Python genutzt. Wenn Du diesen Namen nutzt, geht wahrscheinlich etwas kaputt. Bitte versuche es mit einem anderen Dateinamen.Dieser Name wird bereits von einem anderen Teil von Python genutzt. Wenn Du diesen Namen nutzt, geht wahrscheinlich etwas kaputt. Bitte versuche es mit einem anderen Dateinamen.Um Rekursion zu verstehen, musst du zuerst Rekursion verstehen.Thema zwischen Tag, Nacht oder hoher Kontrast umschalten.Versuche Dinge aus der Perspektive der Nutzer zu sehen.Konnte keine Verbindung zum Python Debugger herstellen. Konnte nicht alle Zeichen konvertieren. Wenn Du am Anfang der Datei eine Encoding-Zeile hast, entferne sie und versuche es erneut.Konnte nicht aufspielen: "{}"Nicht unterstützter BBC micro:bit.Benutze CircuitPython auf einem Adafruit board.REPL für Live Programmierung nutzen.REPL benutzen, um live auf dem micro:bit zu programmieren.WertSehr gut! Keine Probleme.Wenn Sie einen Fehler melden, kopieren Sie bitte den Inhalt der folgenden Protokolldatei.Weise sind die, die wissen, dass sie nichts wissen.Möchtest Du Mu in den {}-Modus wechseln?MicroPython für den BBC micro:bit schreiben.Du kannst den Dateinamen "{}" nicht benutzenDu musst etwas eingeben, das gesucht werden soll.Dein Gerät ist neuer als diese Version von Mu. Bitte installiere die neuste Version von Mu um dieses Gerät zu benuzten. https://codewith.mu/Ausführung des Skriptes beendet.Ihr Skript ist zu lang und der Minifier ist nicht verfügbarIhr Skript ist zu lang!Hineinzoomen (um den Text zu vergrößern)Rauszoomen (um den Text zu verkleinern)HineinzoomenRauszoomenUnbenannt{} Plotter{} REPL{} [{}:{}]mu-editor-1.0.2+dfsg/mu/locale/de_DE/LC_MESSAGES/mu.po000066400000000000000000001127751341747546300217570ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2018-07-25 09:39+CEST\n" "PO-Revision-Date: 2018-07-25 12:07+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 2.1\n" "Last-Translator: René Raab \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: de_DE\n" #: mu/app.py:66 msgid "Logging to {}" msgstr "Protokolliere nach {}" #: mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "" "Debugger benötigt zum Ausführen einen Dateinamen zu einem Python Skript." #: mu/debugger/client.py:106 msgid "" "Connection timed out. Is your machine slow or busy? Free up some of the " "machine's resources and try again." msgstr "" "Zeitüberschreitung der Verbindung. Ist Ihre Maschine langsam oder " "beschäftigt? Geben Sie einige Ressourcen des Geräts frei und versuchen Sie " "es erneut." #: mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "" "Konnte localhost nicht finden.\n" "Stellen Sie sicher, dass Sie die Zeile '127.0.0.1 localhost' in Ihrer /etc/" "hosts Datei haben." #: mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "Modus wählen" #: mu/interface/dialogs.py:57 msgid "" "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel" "\"." msgstr "" "Bitte wählen Sie den gewünschten Modus und klicken dann \"OK\". Andernfalls, " "klicken Sie \"Abbrechen\"." #: mu/interface/dialogs.py:73 msgid "" "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "" "Ändern Sie den Modus jederzeit, indem Sie auf den Knopf \"Modus\" mit dem Mu " "Logo klicken" #: mu/interface/dialogs.py:107 msgid "" "When reporting a bug, copy and paste the content of the following log file." msgstr "" "Wenn Sie einen Fehler melden, kopieren Sie bitte den Inhalt der folgenden " "Protokolldatei." #: mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python " "3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "Die nachfolgenden Umgebungsvariablen werden jedes mal gesetzt, wenn Sie ein " "Python 3 Skript ausführen.\n" "\n" "Jede separate Umgebungsvariable sollte in einer eigenen Zeile und von der " "folgenden Form sein:\n" "NAME=WERT" #: mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "Python-Code vor dem Flashen verkleinern?" #: mu/interface/dialogs.py:153 msgid "" "Override the built-in MicroPython runtime with the following hex file (empty " "means use the default):" msgstr "" "Überschreibe die eingebaute MicroPython Runtime mit der nachfolgenden hex " "Datei (leer benutzt den Standardwert):" #: mu/interface/dialogs.py:175 mu/interface/main.py:977 msgid "Mu Administration" msgstr "Mu Administration" #: mu/interface/dialogs.py:186 msgid "Current Log" msgstr "Aktuelles Protokoll" #: mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Python3 Umgebung" #: mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "BBC micro:bit Einstellungen" #: mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "Suchen / Ersetzen" #: mu/interface/dialogs.py:227 msgid "Find:" msgstr "Suchen:" #: mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "Ersetzen mit (optional):" #: mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "Alle ersetzen?" #: mu/interface/editor.py:222 mu/logic.py:952 msgid "untitled" msgstr "Unbenannt" #: mu/interface/main.py:69 msgid "Mode" msgstr "Modus" #: mu/interface/main.py:70 msgid "Change Mu's mode of behaviour." msgstr "Ändere den Modus von Mu." #: mu/interface/main.py:72 msgid "New" msgstr "Neu" #: mu/interface/main.py:73 msgid "Create a new Python script." msgstr "Erstelle ein neues Python-Skript." #: mu/interface/main.py:74 msgid "Load" msgstr "Laden" #: mu/interface/main.py:75 msgid "Load a Python script." msgstr "Lade ein Python-Skript." #: mu/interface/main.py:76 msgid "Save" msgstr "Speichern" #: mu/interface/main.py:77 msgid "Save the current Python script." msgstr "Aktuelles Python-Skript speichern." #: mu/interface/main.py:86 msgid "Zoom-in" msgstr "Hineinzoomen" #: mu/interface/main.py:87 msgid "Zoom in (to make the text bigger)." msgstr "Hineinzoomen (um den Text zu vergrößern)" #: mu/interface/main.py:88 msgid "Zoom-out" msgstr "Rauszoomen" #: mu/interface/main.py:89 msgid "Zoom out (to make the text smaller)." msgstr "Rauszoomen (um den Text zu verkleinern)" #: mu/interface/main.py:90 msgid "Theme" msgstr "Thema" #: mu/interface/main.py:91 msgid "Toggle theme between day, night or high contrast." msgstr "Thema zwischen Tag, Nacht oder hoher Kontrast umschalten." #: mu/interface/main.py:94 msgid "Check" msgstr "Prüfen" #: mu/interface/main.py:95 msgid "Check your code for mistakes." msgstr "Code auf Fehler überprüfen." #: mu/interface/main.py:96 msgid "Help" msgstr "Hilfe" #: mu/interface/main.py:97 msgid "Show help about Mu in a browser." msgstr "Hilfe für Mu in einem Browser anzeigen." #: mu/interface/main.py:98 msgid "Quit" msgstr "Beenden" #: mu/interface/main.py:99 msgid "Quit Mu." msgstr "Mu beenden." #: mu/interface/main.py:178 msgid "Mu {}" msgstr "Mu {}" #: mu/interface/main.py:354 msgid "Cannot connect to device on port {}" msgstr "Kann nicht zu Gerät verbinden auf Port {}" #: mu/interface/main.py:376 msgid "Filesystem on micro:bit" msgstr "Dateisystem auf micro:bit" #: mu/interface/main.py:435 msgid "Python3 data tuple" msgstr "Python3 Datentupel" #: mu/interface/main.py:447 msgid "Python3 (Jupyter)" msgstr "Python3 (Jupyter)" #: mu/interface/main.py:454 msgid "{} REPL" msgstr "{} REPL" #: mu/interface/main.py:470 msgid "{} Plotter" msgstr "{} Plotter" #: mu/interface/main.py:511 msgid "Running: {}" msgstr "Führe aus: {}" #: mu/interface/main.py:534 msgid "Debug Inspector" msgstr "Debugging Inspector" #: mu/interface/main.py:552 msgid "Name" msgstr "Name" #: mu/interface/main.py:552 msgid "Value" msgstr "Wert" #: mu/interface/main.py:569 msgid "(A list of {} items.)" msgstr "(Eine list mit {} Einträgen.)" #: mu/interface/main.py:582 msgid "(A dict of {} items.)" msgstr "(Ein dict mit {} Einträgen.)" #: mu/interface/main.py:720 msgid "Mu" msgstr "Mu" #: mu/interface/main.py:970 msgid "Mu's current mode of behaviour." msgstr "Aktueller Verhaltensmodus von Mu." #: mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "Datei existiert bereits; Überschreiben?" #: mu/interface/panes.py:297 msgid "File already exists" msgstr "Datei existiert bereits" #: mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "Kopiere '{}' nach micro:bit." #: mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "'{}\" erfolgreich auf den micro:bit kopiert." #: mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "Löschen (kann nicht rückgängig gemacht werden)" #: mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "Lösche '{}' vom micro:bit." #: mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "'{}' erfolgreich vom micro:bit gelöscht." #: mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "Lade '{}' vom micro:bit. Kopiere nach '{}'." #: mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "'{}' erfolgreich vom micro:bit auf Ihren Rechner kopiert." #: mu/interface/panes.py:409 msgid "Open in Mu" msgstr "In Mu öffnen" #: mu/interface/panes.py:411 msgid "Open" msgstr "Öffnen" #: mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "Öffne '{}'" #: mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "Dateien auf Ihrem micro:bit:" #: mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "Dateien auf Ihrem Rechner:" #: mu/interface/panes.py:527 msgid "" "There was a problem getting the list of files on the micro:bit. Please check " "Mu's logs for technical information. Alternatively, try unplugging/plugging-" "in your micro:bit and/or restarting Mu." msgstr "" "Beim Laden der Liste der Dateien auf dem micro:bit ist ein Problem " "aufgetreten. Prüfe das Protokoll von Mu für technische Informationen. " "Alternativ, versuche Deinen micro:bit aus und wieder einzustecken und/oder " "Mu neuzustarten." #: mu/interface/panes.py:538 msgid "" "There was a problem copying the file '{}' onto the micro:bit. Please check " "Mu's logs for more information." msgstr "" "Beim Kopieren von '{}' auf den micro:bit ist ein Problem aufgetreten. Prüfe " "das Protokoll von Mu für mehr Informationen." #: mu/interface/panes.py:546 msgid "" "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Beim Löschen von '{}' vom micro:bit ist ein Problem aufgetreten. Prüfe das " "Protokoll von Mu für mehr Informationen." #: mu/interface/panes.py:554 msgid "" "There was a problem getting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Beim Laden von '{}' vom micro:bit ist ein Problem aufgetreten. Prüfe das " "Protokoll von Mu für mehr Informationen." #: mu/logic.py:68 msgid "Hello, World!" msgstr "Hallo Welt!" #: mu/logic.py:69 msgid "" "This editor is free software written in Python. You can modify it, add " "features or fix bugs if you like." msgstr "" "Dieser Editor ist freie Software, geschrieben in Python. Du kannst ihn " "modifizieren, Funktionen hinzufügen oder Fehler beheben, wenn Du möchtest." #: mu/logic.py:71 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "Dieser Editor heißt Mu." #: mu/logic.py:72 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "Google, Facebook, NASA, Pixar, Disney und viele andere nutzen Python." #: mu/logic.py:73 msgid "" "Programming is a form of magic. Learn to cast the right spells with code and " "you'll be a wizard." msgstr "" "Programmieren ist eine Form von Magie. Du musst nur die richtigen " "Zaubersprüche lernen." #: mu/logic.py:75 msgid "" "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your " "computer! :-)" msgstr "" "REPL steht für read (lesen), evaluate (ausführen), print (ausgeben), loop " "(wiederholen). Es macht Spaß, so mit deinem Computer zu reden! :-)" #: mu/logic.py:77 msgid "Be brave, break things, learn and have fun!" msgstr "Sei mutig, zerstöre Dinge, lerne und hab Spaß!" #: mu/logic.py:78 msgid "Make your software both useful AND fun. Empower your users." msgstr "Mache Deine Software sowohl nützlich als auch spaßig zu benutzen." #: mu/logic.py:79 msgid "For the Zen of Python: import this" msgstr "Für den Zen von Python: import this" #: mu/logic.py:80 msgid "Diversity promotes creativity." msgstr "Vielfalt unterstützt Kreativität." #: mu/logic.py:81 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "" "Ein offener Geist, Abenteuerlust und Respekt für Vielfalt sind der " "Schlüssel" #: mu/logic.py:82 msgid "" "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "" "Ärgere Dich nicht, wenn etwas nicht funktioniert. Lerne daraus, repariere es " "und versuche es nochmal! :-)" #: mu/logic.py:84 msgid "Coding is collaboration." msgstr "Programmieren ist Zusammenarbeiten. " #: mu/logic.py:85 msgid "Compliment and amplify the good things with code." msgstr "Ergänze und verstärke die guten Dinge mit Code." #: mu/logic.py:86 msgid "" "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "" "In der Theorie sind Theorie und Praxis gleich. In der Praxis sind sie es " "nicht. ;-)" #: mu/logic.py:88 msgid "Debugging is twice as hard as writing the code in the first place." msgstr "Debuggen ist zwei mal so schwer wie das Programmieren." #: mu/logic.py:89 msgid "It's fun to program." msgstr "Es macht Spaß zu programmieren." #: mu/logic.py:90 msgid "Programming has more to do with problem solving than writing code." msgstr "" "Programmieren hat mehr mit dem Lösen von Problemen zu tun als nur Code zu " "schreiben." #: mu/logic.py:91 msgid "Start with your users' needs." msgstr "Starte mit den Bedürfnissen der Benutzer." #: mu/logic.py:92 msgid "Try to see things from your users' point of view." msgstr "Versuche Dinge aus der Perspektive der Nutzer zu sehen." #: mu/logic.py:93 msgid "Put yourself in your users' shoes." msgstr "Versetze Dich in die Lage der Benutzer." #: mu/logic.py:94 msgid "" "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "" "Die Lösung zeigt sich oft, wenn man ein Programmierproblem Freunden oder " "Freundinnen erklärt." #: mu/logic.py:96 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "Wenn Du etwas nicht weißt, frag. Niemand zum Fragen? Schlag' es nach." #: mu/logic.py:97 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "" "Komplexität ist der Gegner. KISS - keep it simple, stupid! (Halte es " "einfach, supereinfach!)" #: mu/logic.py:98 msgid "Beautiful is better than ugly." msgstr "Schön ist besser als hässlich." #: mu/logic.py:99 msgid "Explicit is better than implicit." msgstr "Explizit ist besser als implizit." #: mu/logic.py:100 msgid "Simple is better than complex. Complex is better than complicated." msgstr "Einfach ist besser als komplex. Komplex ist besser als kompliziert." #: mu/logic.py:101 msgid "Flat is better than nested." msgstr "Kurz ist besser als verschachtelt." #: mu/logic.py:102 msgid "Sparse is better than dense." msgstr "Dünn/spärlich ist besser als dicht." #: mu/logic.py:103 msgid "Readability counts." msgstr "Lesbarkeit zählt." #: mu/logic.py:104 msgid "" "Special cases aren't special enough to break the rules. Although " "practicality beats purity." msgstr "" "Spezialfälle sind nicht speziell genug um die Regeln zu brechen. Allerdings " "schlägt Praktikabilität die Einfachheit." #: mu/logic.py:106 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "" "Fehler sollten niemals still vorbeiziehen. Außer sie wurden explizit zum " "Schweigen gebracht." #: mu/logic.py:107 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "" "Falls etwas unklar ist, versuche der Versuchung zu raten zu widerstehen." #: mu/logic.py:108 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "" "Es sollte einen -- vorzugsweise genau einen -- offensichtlichen Weg geben, " "etwas zu tun." #: mu/logic.py:109 msgid "" "Now is better than never. Although never is often better than *right* now." msgstr "" "Jetzt ist besser als nie. Allerdings ist nie oft besser als *genau* jetzt." #: mu/logic.py:111 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "" "Wenn die Implementierung schwer zu erklären ist, ist sie eine schlechte Idee." #: mu/logic.py:112 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "" "Wenn die Implementierung einfach zu erklären ist, ist sie vermutlich eine " "gute Idee." #: mu/logic.py:113 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "Namespaces sind eine gute Idee -- Lasst uns mehr davon machen!" #: mu/logic.py:114 msgid "Mu was created by Nicholas H.Tollervey." msgstr "Mu wurde von Nicholas H.Tollervey erstellt." #: mu/logic.py:115 msgid "To understand what recursion is, you must first understand recursion." msgstr "Um Rekursion zu verstehen, musst du zuerst Rekursion verstehen." #: mu/logic.py:116 msgid "" "Algorithm: a word used by programmers when they don't want to explain what " "they did." msgstr "" "Algorithmus: Ein Wort das von Programmierer(innen) benutzt wird, wenn sie " "nicht erklären möchten, was sie getan haben." #: mu/logic.py:118 msgid "Programmers count from zero." msgstr "Programmierer(innen) beginnen bei 0 zu zählen." #: mu/logic.py:119 msgid "Simplicity is the ultimate sophistication." msgstr "Einfachheit ist die ultimative Perfektion." #: mu/logic.py:120 msgid "A good programmer is humble." msgstr "Ein(e) gute(r) Programmierer(in) ist bescheiden." #: mu/logic.py:121 msgid "A good programmer is playful." msgstr "Ein(e) gute(r) Programmierer(in) ist verspielt." #: mu/logic.py:122 msgid "A good programmer learns to learn." msgstr "Ein(e) gute(r) Programmierer(in) lernt zu lernen." #: mu/logic.py:123 msgid "A good programmer thinks beyond the obvious." msgstr "" "Ein(e) gute(r) Programmierer(in) denkt über das Offensichtliche hinaus." #: mu/logic.py:124 msgid "A good programmer promotes simplicity." msgstr "Ein(e) gute(r) Programmierer(in) fördert Schlichtheit." #: mu/logic.py:125 msgid "A good programmer avoids complexity." msgstr "Ein(e) gute(r) Programmierer(in) vermeidet Komplexität." #: mu/logic.py:126 msgid "A good programmer is patient." msgstr "Ein(e) gute(r) Programmierer(in) ist geduldig." #: mu/logic.py:127 msgid "A good programmer asks questions." msgstr "Ein(e) gute(r) Programmierer(in) stellt Fragen." #: mu/logic.py:128 msgid "A good programmer is willing to say, 'I don't know'." msgstr "" "Ein(e) gute(r) Programmierer(in) ist bereit zu sagen: \"Ich weiß es nicht\"." #: mu/logic.py:129 msgid "Wisest are they that know they know nothing." msgstr "Weise sind die, die wissen, dass sie nichts wissen." #: mu/logic.py:439 msgid " above this line" msgstr " oberhalb dieser Zeile" #: mu/logic.py:484 msgid "" "Syntax error. Python cannot understand this line. Check for missing " "characters!" msgstr "" "Syntaxfehler. Python kann diese Zeile nicht verstehen. Überprüfe ob Zeichen " "fehlen!" #: mu/logic.py:669 msgid "# Write your code here :-)" msgstr "# Schreibe hier Deinen Code :-)" #: mu/logic.py:707 msgid "" "The file contains characters Mu expects to be encoded as {0} or as the " "computer's default encoding {1}, but which are encoded in some other way.\n" "\n" "If this file was saved in another application, re-save the file via the " "'Save as' option and set the encoding to {0}" msgstr "" "Die Datei enthält Zeichen von denen Mu glaubt, dass sie als {0} oder als {1} " "(Standard auf diesem Computer) kodiert sind. Allerdings sind sie irgendwie " "anders kodiert.\n" "\n" "Falls diese Datei in einer anderen Anwendung gespeichert wurde, speichere " "die Datei nochmal mit der \"Speichern als\" Option und setze die Kodierung " "auf {0}." #: mu/logic.py:723 msgid "The file \"{}\" is already open." msgstr "Die Datei \"{}\" ist bereits geöffnet." #: mu/logic.py:735 msgid "Mu cannot read the characters in {}" msgstr "Mu kann die Zeichen in {} nicht lesen" #: mu/logic.py:758 msgid "Mu was not able to open this file" msgstr "Mu konnte die Datei nicht öffnen" #: mu/logic.py:759 msgid "" "Currently Mu only works with Python source files or hex files created with " "embedded MicroPython code." msgstr "" "Im Moment funktioniert Mu nur mit Python Quelldateien oder hex-Dateien die " "mit MicroPython Code erstellt wurden." #: mu/logic.py:765 msgid "Could not load {}" msgstr "Konnte {} nicht laden" #: mu/logic.py:767 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "Existiert diese Datei?\n" "Falls ja, hast Du die Berechtigung, sie zu lesen?\n" "\n" "Bitte überprüfe das und versuche es erneut." #: mu/logic.py:773 msgid "Is this a {} file?" msgstr "Ist dies eine {}-Datei?" #: mu/logic.py:774 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "Es sieht so aus als könnte dies eine {} Datei sein.\n" "\n" "Möchtest du Mu in den {}-Modus wechseln?" #: mu/logic.py:846 msgid "Could not save file (disk problem)" msgstr "Konnte Datei nicht speichern (Problem mit der Festplatte)" #: mu/logic.py:847 msgid "" "Error saving file to disk. Ensure you have permission to write the file and " "sufficient disk space." msgstr "" "Fehler beim Speichern der Datei. Stelle sicher, dass du die Berechtigungen " "hast, um die Datei zu speichern und dass genügend freier Speicher vorhanden " "ist." #: mu/logic.py:851 msgid "Could not save file (encoding problem)" msgstr "Konnte Datei nicht speichern (Encoding Problem)" #: mu/logic.py:853 msgid "" "Unable to convert all the characters. If you have an encoding line at the " "top of the file, remove it and try again." msgstr "" "Konnte nicht alle Zeichen konvertieren. Wenn Du am Anfang der Datei eine " "Encoding-Zeile hast, entferne sie und versuche es erneut." #: mu/logic.py:862 msgid "Saved file: {}" msgstr "Datei gespeichert: {}" #: mu/logic.py:891 mu/logic.py:1229 msgid "You cannot use the filename \"{}\"" msgstr "Du kannst den Dateinamen \"{}\" nicht benutzen" #: mu/logic.py:893 msgid "" "This name is already used by another part of Python. If you use this name, " "things are likely to break. Please try again with a different filename." msgstr "" "Dieser Name wird bereits von einem anderen Teil von Python genutzt. Wenn Du " "diesen Namen nutzt, geht wahrscheinlich etwas kaputt. Bitte versuche es mit " "einem anderen Dateinamen." #: mu/logic.py:968 msgid "Good job! No problems found." msgstr "Gut gemacht! Keine Probleme gefunden." #: mu/logic.py:969 msgid "Hurrah! Checker turned up no problems." msgstr "Hurra! Keine Probleme gefunden." #: mu/logic.py:970 msgid "Nice one! Zero problems detected." msgstr "Cool! Keine Probleme gefunden." #: mu/logic.py:971 msgid "Well done! No problems here." msgstr "Sehr gut! Keine Probleme." #: mu/logic.py:972 msgid "Awesome! Zero problems found." msgstr "Ausgezeichnet! Keine Probleme gefunden." #: mu/logic.py:999 msgid "" "There is un-saved work, exiting the application will cause you to lose it." msgstr "" "Es existieren nicht gespeicherte Änderungen. Das Beenden der Anwendung " "verwirft diese Änderungen." #: mu/logic.py:1052 msgid "Could not find MicroPython runtime." msgstr "Konnte die MicroPython runtime nicht finden." #: mu/logic.py:1053 msgid "" "The micro:bit runtime you specified ('{}') does not exist. Please try again." msgstr "" "Die angegebene micro:bit runtime ('{}') existiert nicht. Bitte versuche " "es erneut." #: mu/logic.py:1123 msgid "Changed to {} mode." msgstr "Zu {}-Modus gewechselt." #: mu/logic.py:1168 msgid "Detected new {} device." msgstr "Neues {} Gerät erkannt." #: mu/logic.py:1175 msgid "Would you like to change Mu to the {} mode?" msgstr "Möchtest Du Mu in den {}-Modus wechseln?" #: mu/logic.py:1210 msgid "Cannot Set Breakpoint." msgstr "Kann Haltepunkt nicht setzen." #: mu/logic.py:1211 msgid "" "Lines that are comments or some multi-line statements cannot have " "breakpoints." msgstr "" "Zeilen mit Kommentaren oder mehrzeilige Anweisungen können keine Haltepunkte " "haben." #: mu/logic.py:1231 msgid "" "This name is already used by another part of Python. If you use that name, " "things are likely to break. Please try again with a different filename." msgstr "" "Dieser Name wird bereits von einem anderen Teil von Python genutzt. Wenn Du " "diesen Namen nutzt, geht wahrscheinlich etwas kaputt. Bitte versuche es mit " "einem anderen Dateinamen." #: mu/logic.py:1248 msgid "Could not rename file." msgstr "Konnte Datei nicht umbenennen." #: mu/logic.py:1249 msgid "A file of that name is already open in Mu." msgstr "Eine Datei mit diesem Namen ist bereits in Mu geöffnet." #: mu/logic.py:1278 msgid "Replaced \"{}\" with \"{}\"." msgstr "\"{}\" mit \"{}\" ersetzt." #: mu/logic.py:1282 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "{} Treffer von \"{}\" mit \"{}\" ersetzt." #: mu/logic.py:1287 mu/logic.py:1294 msgid "Could not find \"{}\"." msgstr "Konnte \"{}\" nicht finden." #: mu/logic.py:1292 msgid "Highlighting matches for \"{}\"." msgstr "Hebe Treffer für \"{}\" hervor." #: mu/logic.py:1297 msgid "You must provide something to find." msgstr "Du musst etwas eingeben, das gesucht werden soll." #: mu/logic.py:1298 msgid "Please try again, this time with something in the find box." msgstr "" "Bitte versuche es erneut nachdem Du etwas in das Suchfeld geschrieben hast." #: mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "Adafruit CircuitPython" #: mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "Benutze CircuitPython auf einem Adafruit board." #: mu/modes/adafruit.py:70 msgid "Serial" msgstr "Seriell" #: mu/modes/adafruit.py:71 msgid "Open a serial connection to your device." msgstr "Serielle Verbindung zum Gerät öffnen." #: mu/modes/adafruit.py:78 mu/modes/microbit.py:215 mu/modes/python3.py:136 msgid "Plotter" msgstr "Plotter" #: mu/modes/adafruit.py:79 mu/modes/microbit.py:216 msgid "Plot incoming REPL data." msgstr "Plotte eingehende REPL Daten." #: mu/modes/adafruit.py:149 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "Konnte kein angeschlossenes Adafruit CircuitPython Gerät finden." #: mu/modes/adafruit.py:151 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. " "Therefore, to edit these files you need to have the device plugged in. Until " "you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Python-Dateien für Adafruit CircuitPython Geräte werden auf dem Gerät " "gespeichert. Um diese Dateien zu bearbeiten muss das Gerät angeschlossen " "sein. Bis ein Gerät angeschlossen ist, wird Mu diesen Ordner benuzten:\n" "\n" "{}\n" "\n" "um Deinen Code zu speichern." #: mu/modes/base.py:177 msgid "Data Flood Detected!" msgstr "Data Flood erkannt!" #: mu/modes/base.py:178 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. " "As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent " "to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls " "to 'sleep' for a very short period of time." msgstr "" "Der Plotter ist mit Daten überflutet. Das führt dazu das Mu nicht reagiert " "und einfriert. Aus Sicherheitsgründen wurde der Plotter beendet.\n" "\n" "Überflutung passiert wenn Datenblöcke mit mehr als 1024 Bytes wiederholt an " "den Plotter gesendet werden.\n" "\n" "Um dies zu beheben, stelle Sicher, dass Dein Code kleine Datentupel zwischen " "\"sleep\"-Aufrufen sendet." #: mu/modes/base.py:273 mu/modes/base.py:312 msgid "" "Click on the device's reset button, wait a few seconds and then try again." msgstr "" "Drücke den Reset Knopf des Gerätes, warte einige Sekunden und versuche es " "erneut." #: mu/modes/base.py:279 mu/modes/base.py:318 msgid "Could not find an attached device." msgstr "Konnte kein angeschlossenes Gerät finden." #: mu/modes/base.py:280 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Bitte stelle sicher, dass das Gerät an den Computer angeschlossen ist.\n" "\n" "Das Gerät muss eine Version von MicroPython (oder CircuitPython) aufgespielt " "haben, damit der REPL funktioniert.\n" "\n" "Abschließend, drücke den Reset Knopf des Gerätes und warte einige Sekunden " "bevor Du es erneut versuchst." #: mu/modes/base.py:319 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Bitte stelle sicher, dass das Gerät an den Computer angeschlossen ist.\n" "\n" "Das Gerät muss eine Version von MicroPython (oder CircuitPython) aufgespielt " "haben, damit der Plotter funktioniert.\n" "\n" "Abschließend, drücke den Reset Knopf des Gerätes und warte einige Sekunden " "bevor Du es erneut versuchst." #: mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "Grafischer Debugger" #: mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "Debugge Deinen Python 3 Code." #: mu/modes/debugger.py:50 mu/modes/pygamezero.py:109 mu/modes/python3.py:166 msgid "Stop" msgstr "Stopp" #: mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "Stoppe den Code." #: mu/modes/debugger.py:57 msgid "Continue" msgstr "Fortfahren" #: mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "Ausführung des Python-Skripts fortsetzen." #: mu/modes/debugger.py:64 msgid "Step Over" msgstr "Überspringen" #: mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "Überspringe eine Code-Zeile." #: mu/modes/debugger.py:71 msgid "Step In" msgstr "Schritt hinein" #: mu/modes/debugger.py:72 msgid "Step into a function." msgstr "Schritt in eine Funktion hinein." #: mu/modes/debugger.py:78 msgid "Step Out" msgstr "Schritt heraus" #: mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "Schritt heraus aus einer Funktion." #: mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "Ausführung des Skriptes beendet." #: mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "" "Konnte keine Verbindung zum Python Debugger herstellen.\n" "\n" #: mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "Debugger Info: {}" #: mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "Debugger Warnung: {}" #: mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "Debugger Fehler: {}" #: mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "BBC micro:bit" #: mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "MicroPython für den BBC micro:bit schreiben." #: mu/modes/microbit.py:192 msgid "Flash" msgstr "Aufspielen" #: mu/modes/microbit.py:193 msgid "Flash your code onto the micro:bit." msgstr "Code auf den micro:bit aufspielen." #: mu/modes/microbit.py:199 msgid "Files" msgstr "Dateien" #: mu/modes/microbit.py:200 msgid "Access the file system on the micro:bit." msgstr "Zugriff auf das Dateisystem des micro:bit." #: mu/modes/microbit.py:206 mu/modes/python3.py:127 msgid "REPL" msgstr "REPL" #: mu/modes/microbit.py:207 msgid "Use the REPL to live-code on the micro:bit." msgstr "REPL benutzen, um live auf dem micro:bit zu programmieren." #: mu/modes/microbit.py:257 msgid "Unable to flash \"{}\"" msgstr "Konnte nicht aufspielen: \"{}\"" #: mu/modes/microbit.py:267 msgid "Problem with script" msgstr "Problem mit dem Skript" #: mu/modes/microbit.py:268 msgid "{} [{}:{}]" msgstr "{} [{}:{}]" #: mu/modes/microbit.py:278 msgid "Our minifier tried but your script is too long!" msgstr "Der Minifier wurde ausgeführt, aber das Skript ist zu lang!" #: mu/modes/microbit.py:283 msgid "Your script is too long and the minifier isn't available" msgstr "Ihr Skript ist zu lang und der Minifier ist nicht verfügbar" #: mu/modes/microbit.py:288 msgid "Your script is too long!" msgstr "Ihr Skript ist zu lang!" #: mu/modes/microbit.py:368 msgid "Flashing \"{}\" onto the micro:bit." msgstr "Spiele \"{}\" auf den micro:bit auf." #: mu/modes/microbit.py:370 msgid " Runtime: {}" msgstr " Runtime: {}" #: mu/modes/microbit.py:416 msgid "Unsupported BBC micro:bit." msgstr "Nicht unterstützter BBC micro:bit." #: mu/modes/microbit.py:417 msgid "" "Your device is newer than this version of Mu. Please update Mu to the latest " "version to support this device.\n" "\n" "https://codewith.mu/" msgstr "" "Dein Gerät ist neuer als diese Version von Mu. Bitte installiere die neuste " "Version von Mu um dieses Gerät zu benuzten.\n" "\n" "https://codewith.mu/" #: mu/modes/microbit.py:474 mu/modes/microbit.py:611 msgid "Could not find an attached BBC micro:bit." msgstr "Konnte den angeschlossenen BBC micro:bit nicht finden." #: mu/modes/microbit.py:475 msgid "" "Please ensure you leave enough time for the BBC micro:bit to be attached and " "configured correctly by your computer. This may take several seconds. " "Alternatively, try removing and re-attaching the device or saving your work " "and restarting Mu if the device remains unfound." msgstr "" "Bitte stelle sicher, dass du genug Zeit lässt damit der BBC micro:bit " "korrekt vom Computer konfiguriert werden kann. Dies kann einige Sekunden " "dauern. Alternativ, versuche das Gerät aus- und wieder einzustecken oder " "Änderungen zu speichern und Mu neu zu starten, falls das Gerät weiterhin " "nicht gefunden wird." #: mu/modes/microbit.py:489 msgid "Finished flashing." msgstr "Aufspielen abgeschlossen." #: mu/modes/microbit.py:524 msgid "Copied code onto micro:bit." msgstr "Code auf den micro:bit kopiert." #: mu/modes/microbit.py:533 msgid "There was a problem flashing the micro:bit." msgstr "Beim Aufspielen auf den micro:bit ist ein Problem aufgetreten." #: mu/modes/microbit.py:534 msgid "" "Please do not disconnect the device until flashing has completed. Please " "check the logs for more information." msgstr "" "Bitte entferne das Gerät erst wenn das Aufspielen abgeschlossen ist. " "Überprüfe das Protokoll für mehr Informationen." #: mu/modes/microbit.py:555 msgid "REPL and file system cannot work at the same time." msgstr "REPL und Dateisystem funktionieren nicht gleichzeitig." #: mu/modes/microbit.py:556 msgid "" "The REPL and file system both use the same USB serial connection. Only one " "can be active at any time. Toggle the file system off and try again." msgstr "" "Der REPL und das Dateisystem nutzen die gleiche USB-Seriell-Verbindung. Zu " "jedem Zeitpunkt kann nur eins davon aktiv sein. Schalte das Dateisystem aus " "und probiere es erneut." #: mu/modes/microbit.py:573 msgid "The plotter and file system cannot work at the same time." msgstr "Der Plotter und das Dateisystem funktionieren nicht zur gleichen Zeit." #: mu/modes/microbit.py:575 msgid "" "The plotter and file system both use the same USB serial connection. Only " "one can be active at any time. Toggle the file system off and try again." msgstr "" "Das Dateisystem und der REPL und Plotter nutzen die gleiche USB-Seriell-" "Verbindung. Zu jedem Zeitpunkt kann nur eins davon aktiv sein. Schalte den " "REPL und Plotter aus und versuche es erneut." #: mu/modes/microbit.py:587 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "Dateisystem funktioniert nicht gleichzeitig zum REPL oder Plotter." #: mu/modes/microbit.py:589 msgid "" "The file system and the REPL and plotter use the same USB serial connection. " "Toggle the REPL and plotter off and try again." msgstr "" "Das Dateisystem und der REPL und Plotter nutzen die gleiche USB-Seriell-" "Verbindung. Schalte den REPL und Plotter aus und versuche es erneut." #: mu/modes/microbit.py:612 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will " "work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Bitte stelle sicher, dass das Gerät an den Computer angeschlossen ist.\n" "\n" "Das Gerät muss MicroPython aufgespielt haben bevor das Dateisystem " "funktioniert.\n" "\n" "Drücke den Reset Knopf des Gerätes und warte einige Sekunden bevor Du es " "erneut versuchst." #: mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "Pygame Zero" #: mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "Spiele mit Pygame Zero erstellen." #: mu/modes/pygamezero.py:51 mu/modes/pygamezero.py:101 msgid "Play" msgstr "Spielen." #: mu/modes/pygamezero.py:52 mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "Pygame Zero Spiel spielen." #: mu/modes/pygamezero.py:58 msgid "Images" msgstr "Bilder" #: mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "Bilder anzeigen, die von Pygame Zero benutzt werden." #: mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "Schriftarten." #: mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "Schriftarten anzeigen, die von Pygame Zero benutzt werden." #: mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "Geräusche" #: mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "Geräusche anzeigen, die von Pygame Zero benutzt werden." #: mu/modes/pygamezero.py:79 msgid "Music" msgstr "Musik" #: mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "Musik anzeigen, die von Pygame Zero benutzt wird." #: mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "Pygame Zero Spiel beenden." #: mu/modes/python3.py:97 msgid "Python 3" msgstr "Python 3" #: mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "Erstelle Code mit dem Standard Python 3." #: mu/modes/python3.py:113 mu/modes/python3.py:158 msgid "Run" msgstr "Ausführen" #: mu/modes/python3.py:114 mu/modes/python3.py:159 msgid "Run your Python script." msgstr "Python-Skript ausführen." #: mu/modes/python3.py:120 msgid "Debug" msgstr "Debuggen" #: mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "Python-Skript debuggen." #: mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "REPL für Live Programmierung nutzen." #: mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "Plotte Daten aus dem Skript oder dem REPL." #: mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "Python-Skript stoppen." #: mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "Starte iPython REPL." #: mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "Stoppe iPython REPL (kann eine Weile dauern)." #: mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL gestartet." #: mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL gestoppt." mu-editor-1.0.2+dfsg/mu/locale/es/000077500000000000000000000000001341747546300166435ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/es/LC_MESSAGES/000077500000000000000000000000001341747546300204305ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/es/LC_MESSAGES/mu.mo000066400000000000000000000751061341747546300214170ustar00rootroot00000000000000[ &))*?!j$4 "?&b,(TDK +#5YKxJG7`1j5#>b~#9) "6XY"&%$A fer7J2\B7aVKb >g L ! !")!@L!!!!!!!!"# "!."P"l""r"-""?" # 3#A#F#&e#@#:#7$@$9G$J$$R$2%NG%%% %%;%#&<&A&D&#V&'z&!&&&&&@&6'!:'J\''(' ' '/'d(((m()!*+,J,;@-'|-----B-`9.". ...////0 020YA0 0 000 00&1,101 H1T1Y1y1 11 1#1$1#2$)2BN2*222[2<3Z3q3y3 3333333 4=%4=c4O445/6N6{U7L7898O8;:JA:E:j:b=;+;a;.<5<h%==!>E>1>1,?+^?s??@/.@^@+|@@@K@,A+DA(pA A#AA!aB8BB"B$BC%C.C 7CBC JC*UCDDD%D+D!E>E1[E#E)EE EF9_VPVVMWVWrnWWWXXC3X/wXXXX%X+XY5Y$;Y`YhY4oYY'YIYZ-"Z PZ \ZDjZZ:[@[\[&[]'^7_SK`J`$`$a4a=a!Taevapa"Mb pb|bbcccc ccEcdddddde.$eSe\eyee#eeee$e/f17f-if1f?f) g3g;gXg-gh $h 0h;hKhch!zhh"hhhDi5HiY~iij!Jk2lkl^(mmI5n}noFpIIppuq+qtq*r8sw~u9uuvv1v&v3wKw'QwVyw5w x''x,Ox$|xx%6yA\yy!y+y zz z &z2z :zi" 2.4s{#*]_hAN>` Yea'Of|Wo}G%L-1,qy)7J8 k( HCbUmlX&<RK ^\Q~Ixj9Pn0:v$3DBdp?=M6w@tcSFZV/T5uE!g +[rz; Runtime: {} above this line# Write your code here :-)'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Adafruit CircuitPythonAlgorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.Awesome! Zero problems found.BBC micro:bitBBC micro:bit SettingsBe brave, break things, learn and have fun!Beautiful is better than ugly.Cannot Set Breakpoint.Cannot connect to device on port {}Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copied code onto micro:bit.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Debugging is twice as hard as writing the code in the first place.Delete (cannot be undone)Deleting '{}' from micro:bit.Detected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.File already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFor the Zen of Python: import thisGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHello, World!HelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)Is this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.Lines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.Minify Python code before flashing?ModeMuMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu {}Mu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.Now is better than never. Although never is often better than *right* now.OpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):PlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Pygame ZeroPython 3Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 (Jupyter)Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPLREPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.Replace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaveSave the current Python script.Saved file: {}Select ModeSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.Syntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way. If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The micro:bit runtime you specified ('{}') does not exist. Please try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.To understand what recursion is, you must first understand recursion.Toggle theme between day, night or high contrast.Try to see things from your users' point of view.Unable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unsupported BBC micro:bit.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You cannot use the filename "{}"You must provide something to find.Your device is newer than this version of Mu. Please update Mu to the latest version to support this device. https://codewith.mu/Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-outuntitled{} Plotter{} REPL{} [{}:{}]Project-Id-Version: PO-Revision-Date: 2018-07-14 22:56+0100 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 X-Generator: Poedit 2.0.6 Last-Translator: Plural-Forms: nplurals=2; plural=(n != 1); Language: es Interprete: {} por encima de esta línea# Escribe tu código aquí :-)'{}' copiado con éxito al micro:bit.'{}' eliminado correctamente del micro:bit.(Un diccionario de {} elementos.)(Una lista de {} elementos.)Un archivo con ese nombre ya está abierto en Mu.Un buen programador hace preguntas.Un buen programador evita la complejidad.Un buen programador es humilde.Un buen programador es paciente.Un buen programador es lúdico.Un buen programador está dispuesto a decir: "No lo sé".Un buen programador aprende a aprender.Un buen programador promueve la simplicidad.Un buen programador piensa más allá de lo obvio.Accede al sistema de archivos en el micro:bit.Adafruit CircuitPythonAlgoritmo: una palabra utilizada por los programadores cuando no quieren explicar lo que hicieron.Una mente abierta, espíritu de aventura y respeto por la diversidad son la clave.¡Increíble! Cero problemas encontrados.BBC micro:bitConfiguración de BBC micro:bit¡Sé valiente, rompe cosas, aprende y diviértete!Bello es mejor que feo.No se pudo añadir el Punto de Interrupción.No se pudo conectar al dispositivo en el puerto {}Cambia el modo de comportamiento de Mu.Cambia el modo en cualquier momento haciendo clic en el botón "Modo" con el logo de Mu.Cambiado al modo {}.ComprobarComprobar errores en el código.Haz clic en el botón de reinicio del dispositivo, espera unos segundos y luego vuelve a intentarlo.La programación es colaboración.La complejidad es el enemigo. KISS - keep it simple, stupid!: (¡mantenlo simple, estúpido!)Complementa y amplifica las cosas buenas con código.Tiempo de conexión agotado. ¿Es tu ordenador lento o esta ocupado? Libere algunos de los recursos del ordenador y vuelva a intentarlo.ContinuarContinúa ejecutando tu script de Python.Código copiado al micro:bit.Copiando '{}' a micro:bit.No pudo encontrar "{}".No se pudo encontrar el inteprete de MicroPython.No se pudo encontrar un dispositivo Adafruit CircuitPython conectado.No se pudo encontrar un BBC micro:bit conectado.No se pudo encontrar un dispositivo conectado.No se pudo localizar localhost. Asegúrate de tener '127.0.0.1 localhost' en tu archivo /etc/hosts.No se pudo cargar {}No se pudo cambiar el nombre del archivo.No se pudo guardar el archivo (problema de disco)No se pudo guardar el archivo (problema de codificación)Crear un nuevo script de Python.Crear código usando estándar Python 3.Registro actualActualmente, Mu solo funciona con archivos de Python o archivos hex creados con el código de MicroPython incorporado.¡Inundación de datos detectada!DepurarInspector de depuraciónDepura tu código de Python 3.Depura tu script de Python.Error del depurador: {}Información del depurador: {}Para ejecutar el depurador, el script de Python requiere un nombre de archivo.Advertencia del depurador: {}La depuración es doblemente difícil que escribir el código en primer lugar.Eliminar (no se puede deshacer)Eliminando '{}' del micro:bit.Nuevo dispositivo detectado {}.La diversidad promueve la creatividad.¿Existe este archivo? Si existe, ¿tienes permiso para leerlo? Compruébalo y vuelve a intentarlo.No te preocupes si no funciona. ¡Aprende la lección, arréglalo y vuelve a intentarlo! :-)Error al guardar el archivo en el disco. Asegúrate de tener permiso para escribir el archivo y suficiente espacio en disco.Los errores nunca deberían pasar silenciosamente. A menos que esté explícitamente silenciado.Explicar un problema de programación a un amigo a menudo revela la solución. :-)Explícito es mejor que implícito.El archivo ya existeEl archivo ya existe; ¿Quieres sobrescribirlo?El sistema de archivos no puede funcionar al mismo tiempo que el REPL o trazador.ArchivosArchivos en tu ordenador:Archivos en tu micro:bit:Sistema de archivos en micro:bitBuscar / ReemplazarBuscar:Terminó de programar.FlashPrograma tu código en el micro:bit.Programando "{}" en el micro:bit.Plano es mejor que anidado.FuentesPara encontrar el Zen de Python: import thisObteniendo '{}' del micro:bit. Copiando a '{}'.¡Buen trabajo! No se encontraron problemas.Google, Facebook, NASA, Pixar, Disney y muchos más usan Python.Depurador gráfico¡Hola Mundo!AyudaDestacando coincidencias de "{}".¡Hurra! El comprobador no encontró ningún problema.Si la implementación es fácil de explicar, puede ser una buena idea.Si la implementación es difícil de explicar, es una mala idea.Si no sabes, pregunta. ¿Nadie para preguntar? Búscalo.ImágenesEn vista de la ambigüedad, rechaza la tentación de adivinar.En teoría, la teoría y práctica son lo mismo. En la práctica, no lo son. ;-)¿Es este un archivo {}?Parece que este podría ser un archivo de {}. ¿Desea cambiar Mu al modo {}?Es divertido programar.Las líneas que son comentarios o algunas declaraciones de varias líneas no pueden tener puntos de interrupción.CargarCargar un script de Python.Registrando en {}Crea juegos con Pygame Zero.Haz que tu software sea útil Y divertido. Empodera a tus usuarios.¿Reducir el código Python antes de programar?ModoMuAdministración de MuMu no puede leer los caracteres en {}Mu ha sido creado por Nicholas H.Tollervey.Mu no pudo abrir este archivoMu {}Actual modo de comportamiento de Mu.MúsicaNombreLos namespaces son una gran idea: ¡usémoslos más!Nuevo¡Muy buena! Cero problemas detectados.Ahora es mejor que nunca. Aunque nunca suele ser mejor que ahora *mismo*.AbrirAbra una conexión en serie a su dispositivo.Abrir en MuAbriendo '{}'¡Nuestro minificador lo intentó pero tu script es demasiado largo!Reemplazar el interpretador de MicroPython incorporado en Mu con el siguiente archivo hex (vacío significa usar el valor predeterminado):JugarJuega tu juego Pygame Zero.Por favor, no desconectes el dispositivo hasta que la programación se haya completado. Por favor revisa los registros para más información.Asegúrate de dejar tiempo suficiente para que el BBC micro:bit se conecte y sea configurado correctamente por tu ordenador. Esto puede tomar varios segundos. Alternativamente, si el dispositivo sigue sin descubrirse intenta desconectar y volver a conectarlo, o guarda tu trabajo y reinicia Mu.Asegúrate de que el dispositivo esta conectado al ordenador. Debe tener una versión de MicroPython (o CircuitPython) programada antes de que el Trazador funcione. Por último, presiona el botón de reinicio del dispositivo y espera unos segundos antes intentarlo otra vez.Asegúrate de que el dispositivo esta conectado al ordenador. Debe tener una versión de MicroPython (o CircuitPython) programada antes de que el REPL funcione. Finalmente, presiona el botón de reinicio del dispositivo y espera unos segundos antes intentarlo otra vez.Asegúrate de que el dispositivo esta conectado a este ordenador. El dispositivo debe tener MicroPython programado antes de que el sistema de archivos funcione. Por último, presiona el botón de reinicio del dispositivo y espera unos segundos antes de volver a intentarlo.Selecciona el modo deseado y luego haz clic en "OK". Si no, haz clic en "Cancelar".Por favor inténtalo de nuevo, esta vez con algo en el campo de búsqueda.Traza los datos de su script o REPL.Trazar los datos entrantes del REPL.TrazadorProblema con el scriptProgramadores cuentan desde cero.La programación tiene más que ver con la resolución de problemas que con la escritura del código.La programación es una forma de magia. Aprende a lanzar los hechizos correctos con el código y serás un mago.Ponte en el lugar de tus usuarios.Pygame ZeroPython 3Los archivos Python para Adafruit CircuitPython se almacenan en el dispositivo. Por lo tanto, para editar estos archivos, debes tener el dispositivo conectado. Hasta que no conectes uno, Mu usará este directorio: {} ... para almacenar su código.Python3 (Jupyter)Entorno Python3Tupla de datos de Python3SalirSalir de Mu.REPLEl REPL y el sistema de archivos no pueden funcionar al mismo tiempo.REPL en ingles significa (Read)leer, (Evaluate)evaluar, (Print)imprimir, (Loop)repetir. ¡Es una forma divertida de hablar con tu ordenador! :-)REPL empezado.REPL detenido.Legibilidad cuenta.Reemplazar (opcional):¿Reemplazar todo?Remplazado “{}” con "{}".Remplazadas {} coincidencias de "{}" con "{}".EjecutarEjecuta tu script de Python.Ejecutando: {}GuardarGuardar el script de Python actual.Archivo guardado: {}Seleccionar modoSeriadoMostrar ayuda de Mu en un navegador.Muestra las fuentes utilizadas por Pygame Zero.Muestra las imágenes utilizadas por Pygame Zero.Muestra la música utilizada por Pygame Zero.Muestra los sonidos usados ​​por Pygame Zero.Simple es mejor que complejo. Complejo es mejor que complicado.Simplicidad es la máxima sofisticación.SonidosDisperso es mejor que denso.Los casos especiales no son suficientemente especiales como para romper las reglas. Aunque la practicalidad supera a la pureza.Comienza con las necesidades de tus usuarios.Iniciando el REPL de iPython.Paso dentroPaso fueraPaso por encimaEntrar en una función.Salir de una función.Paso sobre una línea de código.DetenerDetener la ejecución del código.Detén tu juego de Pygame Zero.Detén tu script de Python.Deteniendo el REPL de iPython (esto puede tardar un poco de tiempo).'{}' copiado con éxito del micro:bit a tu ordenador.Error de sintaxis. Python no puede entender esta línea. ¡Verifica si faltan caracteres!El REPL y el sistema de archivos usan la misma conexión serial de USB. Solo uno puede estar activo en cualquier momento. Apaga el sistema de archivos e inténtalo de nuevo.Las siguientes variables de entorno se establecerán cada vez que ejecute un script de Python 3. Cada variable de entorno individual debe estar en una nueva línea y con el formato: NOMBRE=VALOREl archivo "{}" ya está abierto.El archivo contiene caracteres que Mu espera codificar como {0} o como la codificación predeterminada del ordenador {1}, pero están codificados de otra manera. Si este archivo fue guardado en otra aplicación, vuelva a guardar el archivo con la opción ‘Guardar como’ y ajusta la codificación a {0}El sistema de archivos, el REPL y el trazador usan la misma conexión serial de USB. Cierra el REPL y el trazador e inténtalo de nuevo.El interprete para micro:bit especificado (‘{}’) no existe. Por favor inténtalo de nuevo.El trazador y el sistema de archivos utilizan la misma conexión serial USB. Solo uno puede estar activo al mismo tiempo. Apaga el sistema de archivos e inténtalo de nuevo.El trazador y el sistema de archivos no pueden funcionar al mismo tiempo.El trazador está inundado de datos y que harán que Mu no responda y se congele. Como salvaguarda, el trazador se ha detenido. La inundación pasa cuando se envían repetidamente bloques de datos de más de 1024 bytes al trazador. Para solucionarlo, asegúrate de que tu código imprima pequeñas tuplas de datos entre llamadas a ‘sleep’ durante un corto período de tiempo.TemaHay trabajo sin guardar, salir de la aplicación hará que lo pierdas.Debería haber una-- y preferiblemente solo una --forma obvia de hacerlo.Hubo un problema al copiar el archivo '{}' a el micro:bit. Por favor revisa los registros de Mu para obtener más información.Hubo un problema al eliminar '{}' del micro:bit. Por favor revisa los registros de Mu para obtener más información.Hubo un problema al programar el micro:bit.Hubo un problema al obtener '{}' del micro:bit. Por favor revisa los registros de Mu para obtener más información.Hubo un problema al obtener la lista de archivos del micro:bit. Por favor revisa los registros de Mu para obtener información técnica. Alternativamente, intenta desconectar y conectar su micro:bit y/o reiniciar Mu.Este editor se llama Mu (se pronuncia 'miu’ o 'mu’).Este editor es software libre escrito en Python. Si lo deseas puedes modificarlo, añadir funciones o corregir errores.Este nombre ya es usado por otra parte de Python. Si usas ese nombre, es probable algo se rompa. Por favor inténtalo de nuevo con un nombre de archivo diferente.Este nombre ya es usado por otra parte de Python. Si usa este nombre, es probable que algo se rompa. Por favor inténtalo de nuevo con un nombre de archivo diferente.Para comprender qué es la recursión, primero debe comprender la recursión.Alternar tema entre día, noche o alto contraste.Intenta ver las cosas desde el punto de vista de tus usuarios.No ha sido posible conectar con el depurador de Python. No se pueden convertir todos los caracteres. Si tiene una línea de codificación en la primera linea del archivo, quítala e intenta de nuevo.No se puede programar "{}"BBC micro:bit no soportado.Usa la linea de placas CircuitPython de Adafruit.Usa el REPL para la programar en vivo.Usa el REPL para programar en vivo en el micro:bit.Valor¡Bien hecho! Problemas no encontrados.Cuando informes un error, copia y pega el contenido del siguiente archivo de registro.Más sabios son aquellos que saben que no saben nada.¿Quieres cambiar Mu al modo {}?Escribe MicroPython para BBC micro:bit.No puedes usar el nombre de archivo “{}”Debes proporcionar algo para buscar.Tu dispositivo es mas nuevo que esta versión de Mu. Por favor, actualiza a la ultima versión de Mu soportar este dispositvo. https://codewith.mu/Tu script ha terminado de ejecutarse.Tu script es demasiado largo y el minificador no está disponible¡Tu script es demasiado largo!Acercar (para agrandar el texto).Alejar (para hacer el texto más pequeño).AcercarAlejarsin titulo{} Trazador{} REPL{} [{}: {}]mu-editor-1.0.2+dfsg/mu/locale/es/LC_MESSAGES/mu.po000066400000000000000000001115061341747546300214150ustar00rootroot00000000000000# Translations for the Spanish language. # Copyright (c) 2015-2018 Nicholas H.Tollervey and others (see the AUTHORS file). # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2018-07-14 20:48+0100\n" "PO-Revision-Date: 2018-07-14 22:56+0100\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 2.0.8\n" "Last-Translator: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: es\n" #: mu/app.py:66 msgid "Logging to {}" msgstr "Registrando en {}" #: mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "Para ejecutar el depurador, el script de Python requiere un nombre de archivo." #: mu/debugger/client.py:106 msgid "Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again." msgstr "Tiempo de conexión agotado. ¿Es tu ordenador lento o esta ocupado? Libere algunos de los recursos del ordenador y vuelva a intentarlo." #: mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "" "No se pudo localizar localhost.\n" "Asegúrate de tener '127.0.0.1 localhost' en tu archivo /etc/hosts." #: mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "Seleccionar modo" #: mu/interface/dialogs.py:57 msgid "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel\"." msgstr "Selecciona el modo deseado y luego haz clic en \"OK\". Si no, haz clic en \"Cancelar\"." #: mu/interface/dialogs.py:73 msgid "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "Cambia el modo en cualquier momento haciendo clic en el botón \"Modo\" con el logo de Mu." #: mu/interface/dialogs.py:107 msgid "When reporting a bug, copy and paste the content of the following log file." msgstr "Cuando informes un error, copia y pega el contenido del siguiente archivo de registro." #: mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python 3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "Las siguientes variables de entorno se establecerán cada vez que ejecute un script de Python 3.\n" "\n" "Cada variable de entorno individual debe estar en una nueva línea y con el formato:\n" "NOMBRE=VALOR" #: mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "¿Reducir el código Python antes de programar?" #: mu/interface/dialogs.py:153 msgid "Override the built-in MicroPython runtime with the following hex file (empty means use the default):" msgstr "Reemplazar el interpretador de MicroPython incorporado en Mu con el siguiente archivo hex (vacío significa usar el valor predeterminado):" #: mu/interface/dialogs.py:175 mu/interface/main.py:973 msgid "Mu Administration" msgstr "Administración de Mu" #: mu/interface/dialogs.py:186 msgid "Current Log" msgstr "Registro actual" #: mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Entorno Python3" #: mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "Configuración de BBC micro:bit" #: mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "Buscar / Reemplazar" #: mu/interface/dialogs.py:227 msgid "Find:" msgstr "Buscar:" #: mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "Reemplazar (opcional):" #: mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "¿Reemplazar todo?" #: mu/interface/editor.py:222 mu/logic.py:960 msgid "untitled" msgstr "sin titulo" #: mu/interface/main.py:68 msgid "Mode" msgstr "Modo" #: mu/interface/main.py:69 msgid "Change Mu's mode of behaviour." msgstr "Cambia el modo de comportamiento de Mu." #: mu/interface/main.py:71 msgid "New" msgstr "Nuevo" #: mu/interface/main.py:72 msgid "Create a new Python script." msgstr "Crear un nuevo script de Python." #: mu/interface/main.py:73 msgid "Load" msgstr "Cargar" #: mu/interface/main.py:74 msgid "Load a Python script." msgstr "Cargar un script de Python." #: mu/interface/main.py:75 msgid "Save" msgstr "Guardar" #: mu/interface/main.py:76 msgid "Save the current Python script." msgstr "Guardar el script de Python actual." #: mu/interface/main.py:85 msgid "Zoom-in" msgstr "Acercar" #: mu/interface/main.py:86 msgid "Zoom in (to make the text bigger)." msgstr "Acercar (para agrandar el texto)." #: mu/interface/main.py:87 msgid "Zoom-out" msgstr "Alejar" #: mu/interface/main.py:88 msgid "Zoom out (to make the text smaller)." msgstr "Alejar (para hacer el texto más pequeño)." #: mu/interface/main.py:89 msgid "Theme" msgstr "Tema" #: mu/interface/main.py:90 msgid "Toggle theme between day, night or high contrast." msgstr "Alternar tema entre día, noche o alto contraste." #: mu/interface/main.py:93 msgid "Check" msgstr "Comprobar" #: mu/interface/main.py:94 msgid "Check your code for mistakes." msgstr "Comprobar errores en el código." #: mu/interface/main.py:95 msgid "Help" msgstr "Ayuda" #: mu/interface/main.py:96 msgid "Show help about Mu in a browser." msgstr "Mostrar ayuda de Mu en un navegador." #: mu/interface/main.py:97 msgid "Quit" msgstr "Salir" #: mu/interface/main.py:98 msgid "Quit Mu." msgstr "Salir de Mu." #: mu/interface/main.py:177 msgid "Mu {}" msgstr "Mu {}" #: mu/interface/main.py:353 msgid "Cannot connect to device on port {}" msgstr "No se pudo conectar al dispositivo en el puerto {}" #: mu/interface/main.py:375 msgid "Filesystem on micro:bit" msgstr "Sistema de archivos en micro:bit" #: mu/interface/main.py:434 msgid "Python3 data tuple" msgstr "Tupla de datos de Python3" #: mu/interface/main.py:446 msgid "Python3 (Jupyter)" msgstr "Python3 (Jupyter)" #: mu/interface/main.py:453 msgid "{} REPL" msgstr "{} REPL" #: mu/interface/main.py:469 msgid "{} Plotter" msgstr "{} Trazador" #: mu/interface/main.py:510 msgid "Running: {}" msgstr "Ejecutando: {}" #: mu/interface/main.py:534 msgid "Debug Inspector" msgstr "Inspector de depuración" #: mu/interface/main.py:552 msgid "Name" msgstr "Nombre" #: mu/interface/main.py:552 msgid "Value" msgstr "Valor" #: mu/interface/main.py:569 msgid "(A list of {} items.)" msgstr "(Una lista de {} elementos.)" #: mu/interface/main.py:581 msgid "(A dict of {} items.)" msgstr "(Un diccionario de {} elementos.)" #: mu/interface/main.py:718 msgid "Mu" msgstr "Mu" #: mu/interface/main.py:967 msgid "Mu's current mode of behaviour." msgstr "Actual modo de comportamiento de Mu." #: mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "El archivo ya existe; ¿Quieres sobrescribirlo?" #: mu/interface/panes.py:297 msgid "File already exists" msgstr "El archivo ya existe" #: mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "Copiando '{}' a micro:bit." #: mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "'{}' copiado con éxito al micro:bit." #: mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "Eliminar (no se puede deshacer)" #: mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "Eliminando '{}' del micro:bit." #: mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "'{}' eliminado correctamente del micro:bit." #: mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "Obteniendo '{}' del micro:bit. Copiando a '{}'." #: mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "'{}' copiado con éxito del micro:bit a tu ordenador." #: mu/interface/panes.py:409 msgid "Open in Mu" msgstr "Abrir en Mu" #: mu/interface/panes.py:411 msgid "Open" msgstr "Abrir" #: mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "Abriendo '{}'" #: mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "Archivos en tu micro:bit:" #: mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "Archivos en tu ordenador:" #: mu/interface/panes.py:527 msgid "There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu." msgstr "Hubo un problema al obtener la lista de archivos del micro:bit. Por favor revisa los registros de Mu para obtener información técnica. Alternativamente, intenta desconectar y conectar su micro:bit y/o reiniciar Mu." #: mu/interface/panes.py:538 msgid "There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information." msgstr "Hubo un problema al copiar el archivo '{}' a el micro:bit. Por favor revisa los registros de Mu para obtener más información." #: mu/interface/panes.py:546 msgid "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information." msgstr "Hubo un problema al eliminar '{}' del micro:bit. Por favor revisa los registros de Mu para obtener más información." #: mu/interface/panes.py:554 msgid "There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information." msgstr "Hubo un problema al obtener '{}' del micro:bit. Por favor revisa los registros de Mu para obtener más información." #: mu/logic.py:69 msgid "Hello, World!" msgstr "¡Hola Mundo!" #: mu/logic.py:70 msgid "This editor is free software written in Python. You can modify it, add features or fix bugs if you like." msgstr "Este editor es software libre escrito en Python. Si lo deseas puedes modificarlo, añadir funciones o corregir errores." #: mu/logic.py:72 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "Este editor se llama Mu (se pronuncia 'miu’ o 'mu’)." #: mu/logic.py:73 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "Google, Facebook, NASA, Pixar, Disney y muchos más usan Python." #: mu/logic.py:74 msgid "Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard." msgstr "La programación es una forma de magia. Aprende a lanzar los hechizos correctos con el código y serás un mago." #: mu/logic.py:76 msgid "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)" msgstr "REPL en ingles significa (Read)leer, (Evaluate)evaluar, (Print)imprimir, (Loop)repetir. ¡Es una forma divertida de hablar con tu ordenador! :-)" #: mu/logic.py:78 msgid "Be brave, break things, learn and have fun!" msgstr "¡Sé valiente, rompe cosas, aprende y diviértete!" #: mu/logic.py:79 msgid "Make your software both useful AND fun. Empower your users." msgstr "Haz que tu software sea útil Y divertido. Empodera a tus usuarios." #: mu/logic.py:80 msgid "For the Zen of Python: import this" msgstr "Para encontrar el Zen de Python: import this" #: mu/logic.py:81 msgid "Diversity promotes creativity." msgstr "La diversidad promueve la creatividad." #: mu/logic.py:82 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "Una mente abierta, espíritu de aventura y respeto por la diversidad son la clave." #: mu/logic.py:83 msgid "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "No te preocupes si no funciona. ¡Aprende la lección, arréglalo y vuelve a intentarlo! :-)" #: mu/logic.py:85 msgid "Coding is collaboration." msgstr "La programación es colaboración." #: mu/logic.py:86 msgid "Compliment and amplify the good things with code." msgstr "Complementa y amplifica las cosas buenas con código." #: mu/logic.py:87 msgid "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "En teoría, la teoría y práctica son lo mismo. En la práctica, no lo son. ;-)" #: mu/logic.py:89 msgid "Debugging is twice as hard as writing the code in the first place." msgstr "La depuración es doblemente difícil que escribir el código en primer lugar." #: mu/logic.py:90 msgid "It's fun to program." msgstr "Es divertido programar." #: mu/logic.py:91 msgid "Programming has more to do with problem solving than writing code." msgstr "La programación tiene más que ver con la resolución de problemas que con la escritura del código." #: mu/logic.py:92 msgid "Start with your users' needs." msgstr "Comienza con las necesidades de tus usuarios." #: mu/logic.py:93 msgid "Try to see things from your users' point of view." msgstr "Intenta ver las cosas desde el punto de vista de tus usuarios." #: mu/logic.py:94 msgid "Put yourself in your users' shoes." msgstr "Ponte en el lugar de tus usuarios." #: mu/logic.py:95 msgid "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "Explicar un problema de programación a un amigo a menudo revela la solución. :-)" #: mu/logic.py:97 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "Si no sabes, pregunta. ¿Nadie para preguntar? Búscalo." #: mu/logic.py:98 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "La complejidad es el enemigo. KISS - keep it simple, stupid!: (¡mantenlo simple, estúpido!)" #: mu/logic.py:99 msgid "Beautiful is better than ugly." msgstr "Bello es mejor que feo." #: mu/logic.py:100 msgid "Explicit is better than implicit." msgstr "Explícito es mejor que implícito." #: mu/logic.py:101 msgid "Simple is better than complex. Complex is better than complicated." msgstr "Simple es mejor que complejo. Complejo es mejor que complicado." #: mu/logic.py:102 msgid "Flat is better than nested." msgstr "Plano es mejor que anidado." #: mu/logic.py:103 msgid "Sparse is better than dense." msgstr "Disperso es mejor que denso." #: mu/logic.py:104 msgid "Readability counts." msgstr "Legibilidad cuenta." #: mu/logic.py:105 msgid "Special cases aren't special enough to break the rules. Although practicality beats purity." msgstr "Los casos especiales no son suficientemente especiales como para romper las reglas. Aunque la practicalidad supera a la pureza." #: mu/logic.py:107 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "Los errores nunca deberían pasar silenciosamente. A menos que esté explícitamente silenciado." #: mu/logic.py:108 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "En vista de la ambigüedad, rechaza la tentación de adivinar." #: mu/logic.py:109 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "Debería haber una-- y preferiblemente solo una --forma obvia de hacerlo." #: mu/logic.py:110 msgid "Now is better than never. Although never is often better than *right* now." msgstr "Ahora es mejor que nunca. Aunque nunca suele ser mejor que ahora *mismo*." #: mu/logic.py:112 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "Si la implementación es difícil de explicar, es una mala idea." #: mu/logic.py:113 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "Si la implementación es fácil de explicar, puede ser una buena idea." #: mu/logic.py:114 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "Los namespaces son una gran idea: ¡usémoslos más!" #: mu/logic.py:115 msgid "Mu was created by Nicholas H.Tollervey." msgstr "Mu ha sido creado por Nicholas H.Tollervey." #: mu/logic.py:116 msgid "To understand what recursion is, you must first understand recursion." msgstr "Para comprender qué es la recursión, primero debe comprender la recursión." #: mu/logic.py:117 msgid "Algorithm: a word used by programmers when they don't want to explain what they did." msgstr "Algoritmo: una palabra utilizada por los programadores cuando no quieren explicar lo que hicieron." #: mu/logic.py:119 msgid "Programmers count from zero." msgstr "Programadores cuentan desde cero." #: mu/logic.py:120 msgid "Simplicity is the ultimate sophistication." msgstr "Simplicidad es la máxima sofisticación." #: mu/logic.py:121 msgid "A good programmer is humble." msgstr "Un buen programador es humilde." #: mu/logic.py:122 msgid "A good programmer is playful." msgstr "Un buen programador es lúdico." #: mu/logic.py:123 msgid "A good programmer learns to learn." msgstr "Un buen programador aprende a aprender." #: mu/logic.py:124 msgid "A good programmer thinks beyond the obvious." msgstr "Un buen programador piensa más allá de lo obvio." #: mu/logic.py:125 msgid "A good programmer promotes simplicity." msgstr "Un buen programador promueve la simplicidad." #: mu/logic.py:126 msgid "A good programmer avoids complexity." msgstr "Un buen programador evita la complejidad." #: mu/logic.py:127 msgid "A good programmer is patient." msgstr "Un buen programador es paciente." #: mu/logic.py:128 msgid "A good programmer asks questions." msgstr "Un buen programador hace preguntas." #: mu/logic.py:129 msgid "A good programmer is willing to say, 'I don't know'." msgstr "Un buen programador está dispuesto a decir: \"No lo sé\"." #: mu/logic.py:130 msgid "Wisest are they that know they know nothing." msgstr "Más sabios son aquellos que saben que no saben nada." #: mu/logic.py:442 msgid " above this line" msgstr " por encima de esta línea" #: mu/logic.py:487 msgid "Syntax error. Python cannot understand this line. Check for missing characters!" msgstr "Error de sintaxis. Python no puede entender esta línea. ¡Verifica si faltan caracteres!" #: mu/logic.py:677 msgid "# Write your code here :-)" msgstr "# Escribe tu código aquí :-)" #: mu/logic.py:715 msgid "" "The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way.\n" "\n" "If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}" msgstr "" "El archivo contiene caracteres que Mu espera codificar como {0} o como la codificación predeterminada del ordenador {1}, pero están codificados de otra manera.\n" "\n" "Si este archivo fue guardado en otra aplicación, vuelva a guardar el archivo con la opción ‘Guardar como’ y ajusta la codificación a {0}" #: mu/logic.py:731 msgid "The file \"{}\" is already open." msgstr "El archivo \"{}\" ya está abierto." #: mu/logic.py:743 msgid "Mu cannot read the characters in {}" msgstr "Mu no puede leer los caracteres en {}" #: mu/logic.py:766 msgid "Mu was not able to open this file" msgstr "Mu no pudo abrir este archivo" #: mu/logic.py:767 msgid "Currently Mu only works with Python source files or hex files created with embedded MicroPython code." msgstr "Actualmente, Mu solo funciona con archivos de Python o archivos hex creados con el código de MicroPython incorporado." #: mu/logic.py:773 msgid "Could not load {}" msgstr "No se pudo cargar {}" #: mu/logic.py:775 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "¿Existe este archivo?\n" "Si existe, ¿tienes permiso para leerlo?\n" "\n" "Compruébalo y vuelve a intentarlo." #: mu/logic.py:781 msgid "Is this a {} file?" msgstr "¿Es este un archivo {}?" #: mu/logic.py:782 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "Parece que este podría ser un archivo de {}.\n" "\n" "¿Desea cambiar Mu al modo {}?" #: mu/logic.py:854 msgid "Could not save file (disk problem)" msgstr "No se pudo guardar el archivo (problema de disco)" #: mu/logic.py:855 msgid "Error saving file to disk. Ensure you have permission to write the file and sufficient disk space." msgstr "Error al guardar el archivo en el disco. Asegúrate de tener permiso para escribir el archivo y suficiente espacio en disco." #: mu/logic.py:859 msgid "Could not save file (encoding problem)" msgstr "No se pudo guardar el archivo (problema de codificación)" #: mu/logic.py:861 msgid "Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again." msgstr "No se pueden convertir todos los caracteres. Si tiene una línea de codificación en la primera linea del archivo, quítala e intenta de nuevo." #: mu/logic.py:870 msgid "Saved file: {}" msgstr "Archivo guardado: {}" #: mu/logic.py:899 mu/logic.py:1237 msgid "You cannot use the filename \"{}\"" msgstr "No puedes usar el nombre de archivo “{}”" #: mu/logic.py:901 msgid "This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename." msgstr "Este nombre ya es usado por otra parte de Python. Si usa este nombre, es probable que algo se rompa. Por favor inténtalo de nuevo con un nombre de archivo diferente." #: mu/logic.py:976 msgid "Good job! No problems found." msgstr "¡Buen trabajo! No se encontraron problemas." #: mu/logic.py:977 msgid "Hurrah! Checker turned up no problems." msgstr "¡Hurra! El comprobador no encontró ningún problema." #: mu/logic.py:978 msgid "Nice one! Zero problems detected." msgstr "¡Muy buena! Cero problemas detectados." #: mu/logic.py:979 msgid "Well done! No problems here." msgstr "¡Bien hecho! Problemas no encontrados." #: mu/logic.py:980 msgid "Awesome! Zero problems found." msgstr "¡Increíble! Cero problemas encontrados." #: mu/logic.py:1007 msgid "There is un-saved work, exiting the application will cause you to lose it." msgstr "Hay trabajo sin guardar, salir de la aplicación hará que lo pierdas." #: mu/logic.py:1060 msgid "Could not find MicroPython runtime." msgstr "No se pudo encontrar el inteprete de MicroPython." #: mu/logic.py:1061 msgid "The micro:bit runtime you specified ('{}') does not exist. Please try again." msgstr "El interprete para micro:bit especificado (‘{}’) no existe. Por favor inténtalo de nuevo." #: mu/logic.py:1131 msgid "Changed to {} mode." msgstr "Cambiado al modo {}." #: mu/logic.py:1176 msgid "Detected new {} device." msgstr "Nuevo dispositivo detectado {}." #: mu/logic.py:1183 msgid "Would you like to change Mu to the {} mode?" msgstr "¿Quieres cambiar Mu al modo {}?" #: mu/logic.py:1218 msgid "Cannot Set Breakpoint." msgstr "No se pudo añadir el Punto de Interrupción." #: mu/logic.py:1219 msgid "Lines that are comments or some multi-line statements cannot have breakpoints." msgstr "Las líneas que son comentarios o algunas declaraciones de varias líneas no pueden tener puntos de interrupción." #: mu/logic.py:1239 msgid "This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename." msgstr "Este nombre ya es usado por otra parte de Python. Si usas ese nombre, es probable algo se rompa. Por favor inténtalo de nuevo con un nombre de archivo diferente." #: mu/logic.py:1256 msgid "Could not rename file." msgstr "No se pudo cambiar el nombre del archivo." #: mu/logic.py:1257 msgid "A file of that name is already open in Mu." msgstr "Un archivo con ese nombre ya está abierto en Mu." #: mu/logic.py:1286 msgid "Replaced \"{}\" with \"{}\"." msgstr "Remplazado “{}” con \"{}\"." #: mu/logic.py:1290 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "Remplazadas {} coincidencias de \"{}\" con \"{}\"." #: mu/logic.py:1295 mu/logic.py:1302 msgid "Could not find \"{}\"." msgstr "No pudo encontrar \"{}\"." #: mu/logic.py:1300 msgid "Highlighting matches for \"{}\"." msgstr "Destacando coincidencias de \"{}\"." #: mu/logic.py:1305 msgid "You must provide something to find." msgstr "Debes proporcionar algo para buscar." #: mu/logic.py:1306 msgid "Please try again, this time with something in the find box." msgstr "Por favor inténtalo de nuevo, esta vez con algo en el campo de búsqueda." #: mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "Adafruit CircuitPython" #: mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "Usa la linea de placas CircuitPython de Adafruit." #: mu/modes/adafruit.py:64 msgid "Serial" msgstr "Seriado" #: mu/modes/adafruit.py:65 msgid "Open a serial connection to your device." msgstr "Abra una conexión en serie a su dispositivo." #: mu/modes/adafruit.py:72 mu/modes/microbit.py:215 mu/modes/python3.py:136 msgid "Plotter" msgstr "Trazador" #: mu/modes/adafruit.py:73 mu/modes/microbit.py:216 msgid "Plot incoming REPL data." msgstr "Trazar los datos entrantes del REPL." #: mu/modes/adafruit.py:143 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "No se pudo encontrar un dispositivo Adafruit CircuitPython conectado." #: mu/modes/adafruit.py:145 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Los archivos Python para Adafruit CircuitPython se almacenan en el dispositivo. Por lo tanto, para editar estos archivos, debes tener el dispositivo conectado. Hasta que no conectes uno, Mu usará este directorio:\n" "\n" "{}\n" "\n" "... para almacenar su código." #: mu/modes/base.py:169 msgid "Data Flood Detected!" msgstr "¡Inundación de datos detectada!" #: mu/modes/base.py:170 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time." msgstr "" "El trazador está inundado de datos y que harán que Mu no responda y se congele. Como salvaguarda, el trazador se ha detenido.\n" "\n" "La inundación pasa cuando se envían repetidamente bloques de datos de más de 1024 bytes al trazador.\n" "\n" "Para solucionarlo, asegúrate de que tu código imprima pequeñas tuplas de datos entre llamadas a ‘sleep’ durante un corto período de tiempo." #: mu/modes/base.py:262 mu/modes/base.py:301 msgid "Click on the device's reset button, wait a few seconds and then try again." msgstr "Haz clic en el botón de reinicio del dispositivo, espera unos segundos y luego vuelve a intentarlo." #: mu/modes/base.py:268 mu/modes/base.py:307 msgid "Could not find an attached device." msgstr "No se pudo encontrar un dispositivo conectado." #: mu/modes/base.py:269 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "Asegúrate de que el dispositivo esta conectado al ordenador.\n" "\n" "Debe tener una versión de MicroPython (o CircuitPython) programada antes de que el REPL funcione.\n" "\n" "Finalmente, presiona el botón de reinicio del dispositivo y espera unos segundos antes intentarlo otra vez." #: mu/modes/base.py:308 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "Asegúrate de que el dispositivo esta conectado al ordenador.\n" "\n" "Debe tener una versión de MicroPython (o CircuitPython) programada antes de que el Trazador funcione.\n" "\n" "Por último, presiona el botón de reinicio del dispositivo y espera unos segundos antes intentarlo otra vez." #: mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "Depurador gráfico" #: mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "Depura tu código de Python 3." #: mu/modes/debugger.py:50 mu/modes/pygamezero.py:109 mu/modes/python3.py:166 msgid "Stop" msgstr "Detener" #: mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "Detener la ejecución del código." #: mu/modes/debugger.py:57 msgid "Continue" msgstr "Continuar" #: mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "Continúa ejecutando tu script de Python." #: mu/modes/debugger.py:64 msgid "Step Over" msgstr "Paso por encima" #: mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "Paso sobre una línea de código." #: mu/modes/debugger.py:71 msgid "Step In" msgstr "Paso dentro" #: mu/modes/debugger.py:72 msgid "Step into a function." msgstr "Entrar en una función." #: mu/modes/debugger.py:78 msgid "Step Out" msgstr "Paso fuera" #: mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "Salir de una función." #: mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "Tu script ha terminado de ejecutarse." #: mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "" "No ha sido posible conectar con el depurador de Python.\n" "\n" #: mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "Información del depurador: {}" #: mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "Advertencia del depurador: {}" #: mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "Error del depurador: {}" #: mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "BBC micro:bit" #: mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "Escribe MicroPython para BBC micro:bit." #: mu/modes/microbit.py:192 msgid "Flash" msgstr "Flash" #: mu/modes/microbit.py:193 msgid "Flash your code onto the micro:bit." msgstr "Programa tu código en el micro:bit." #: mu/modes/microbit.py:199 msgid "Files" msgstr "Archivos" #: mu/modes/microbit.py:200 msgid "Access the file system on the micro:bit." msgstr "Accede al sistema de archivos en el micro:bit." #: mu/modes/microbit.py:206 mu/modes/python3.py:127 msgid "REPL" msgstr "REPL" #: mu/modes/microbit.py:207 msgid "Use the REPL to live-code on the micro:bit." msgstr "Usa el REPL para programar en vivo en el micro:bit." #: mu/modes/microbit.py:257 msgid "Unable to flash \"{}\"" msgstr "No se puede programar \"{}\"" #: mu/modes/microbit.py:267 msgid "Problem with script" msgstr "Problema con el script" #: mu/modes/microbit.py:268 msgid "{} [{}:{}]" msgstr "{} [{}: {}]" #: mu/modes/microbit.py:278 msgid "Our minifier tried but your script is too long!" msgstr "¡Nuestro minificador lo intentó pero tu script es demasiado largo!" #: mu/modes/microbit.py:283 msgid "Your script is too long and the minifier isn't available" msgstr "Tu script es demasiado largo y el minificador no está disponible" #: mu/modes/microbit.py:288 msgid "Your script is too long!" msgstr "¡Tu script es demasiado largo!" #: mu/modes/microbit.py:368 msgid "Flashing \"{}\" onto the micro:bit." msgstr "Programando \"{}\" en el micro:bit." #: mu/modes/microbit.py:370 msgid " Runtime: {}" msgstr " Interprete: {}" #: mu/modes/microbit.py:416 msgid "Unsupported BBC micro:bit." msgstr "BBC micro:bit no soportado." #: mu/modes/microbit.py:417 msgid "" "Your device is newer than this version of Mu. Please update Mu to the latest version to support this device.\n" "\n" "https://codewith.mu/" msgstr "" "Tu dispositivo es mas nuevo que esta versión de Mu. Por favor, actualiza a la ultima versión de Mu soportar este dispositvo.\n" "\n" "https://codewith.mu/" #: mu/modes/microbit.py:453 mu/modes/microbit.py:589 msgid "Could not find an attached BBC micro:bit." msgstr "No se pudo encontrar un BBC micro:bit conectado." #: mu/modes/microbit.py:454 msgid "Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound." msgstr "Asegúrate de dejar tiempo suficiente para que el BBC micro:bit se conecte y sea configurado correctamente por tu ordenador. Esto puede tomar varios segundos. Alternativamente, si el dispositivo sigue sin descubrirse intenta desconectar y volver a conectarlo, o guarda tu trabajo y reinicia Mu." #: mu/modes/microbit.py:468 msgid "Finished flashing." msgstr "Terminó de programar." #: mu/modes/microbit.py:503 msgid "Copied code onto micro:bit." msgstr "Código copiado al micro:bit." #: mu/modes/microbit.py:512 msgid "There was a problem flashing the micro:bit." msgstr "Hubo un problema al programar el micro:bit." #: mu/modes/microbit.py:513 msgid "Please do not disconnect the device until flashing has completed. Please check the logs for more information." msgstr "Por favor, no desconectes el dispositivo hasta que la programación se haya completado. Por favor revisa los registros para más información." #: mu/modes/microbit.py:534 msgid "REPL and file system cannot work at the same time." msgstr "El REPL y el sistema de archivos no pueden funcionar al mismo tiempo." #: mu/modes/microbit.py:535 msgid "The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again." msgstr "El REPL y el sistema de archivos usan la misma conexión serial de USB. Solo uno puede estar activo en cualquier momento. Apaga el sistema de archivos e inténtalo de nuevo." #: mu/modes/microbit.py:552 msgid "The plotter and file system cannot work at the same time." msgstr "El trazador y el sistema de archivos no pueden funcionar al mismo tiempo." #: mu/modes/microbit.py:554 msgid "The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again." msgstr "El trazador y el sistema de archivos utilizan la misma conexión serial USB. Solo uno puede estar activo al mismo tiempo. Apaga el sistema de archivos e inténtalo de nuevo." #: mu/modes/microbit.py:566 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "El sistema de archivos no puede funcionar al mismo tiempo que el REPL o trazador." #: mu/modes/microbit.py:568 msgid "The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again." msgstr "El sistema de archivos, el REPL y el trazador usan la misma conexión serial de USB. Cierra el REPL y el trazador e inténtalo de nuevo." #: mu/modes/microbit.py:590 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "Asegúrate de que el dispositivo esta conectado a este ordenador.\n" "\n" "El dispositivo debe tener MicroPython programado antes de que el sistema de archivos funcione.\n" "\n" "Por último, presiona el botón de reinicio del dispositivo y espera unos segundos antes de volver a intentarlo." #: mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "Pygame Zero" #: mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "Crea juegos con Pygame Zero." #: mu/modes/pygamezero.py:51 mu/modes/pygamezero.py:101 msgid "Play" msgstr "Jugar" #: mu/modes/pygamezero.py:52 mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "Juega tu juego Pygame Zero." #: mu/modes/pygamezero.py:58 msgid "Images" msgstr "Imágenes" #: mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "Muestra las imágenes utilizadas por Pygame Zero." #: mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "Fuentes" #: mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "Muestra las fuentes utilizadas por Pygame Zero." #: mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "Sonidos" #: mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "Muestra los sonidos usados ​​por Pygame Zero." #: mu/modes/pygamezero.py:79 msgid "Music" msgstr "Música" #: mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "Muestra la música utilizada por Pygame Zero." #: mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "Detén tu juego de Pygame Zero." #: mu/modes/python3.py:97 msgid "Python 3" msgstr "Python 3" #: mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "Crear código usando estándar Python 3." #: mu/modes/python3.py:113 mu/modes/python3.py:158 msgid "Run" msgstr "Ejecutar" #: mu/modes/python3.py:114 mu/modes/python3.py:159 msgid "Run your Python script." msgstr "Ejecuta tu script de Python." #: mu/modes/python3.py:120 msgid "Debug" msgstr "Depurar" #: mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "Depura tu script de Python." #: mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "Usa el REPL para la programar en vivo." #: mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "Traza los datos de su script o REPL." #: mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "Detén tu script de Python." #: mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "Iniciando el REPL de iPython." #: mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "Deteniendo el REPL de iPython (esto puede tardar un poco de tiempo)." #: mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL empezado." #: mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL detenido." mu-editor-1.0.2+dfsg/mu/locale/fr/000077500000000000000000000000001341747546300166435ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/fr/LC_MESSAGES/000077500000000000000000000000001341747546300204305ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/fr/LC_MESSAGES/mu.mo000066400000000000000000001101641341747546300214110ustar00rootroot00000000000000n   "% H,i #   . ; I U e t      !! "!C! U! a!k!!!!!!! ""."H"$d"&")"""3# :#F#N#0a##*#!#$# $=$[$4y$"$&$,$(%%N%Te%D%%& && 3&A& X&+b&&&&&K&8'L'R'Jp' ''7'1(jL((#(((#)98))r)")X)***"A*&d**$* *e*>+S+Y+i++++2++B ,M,V,p, ,,,a,K2-b~->-L .!m...".@.//./G/_/n/t//#/!/// /"/"0 )0-70e0?00 000&1@.1:o171191J#2n2t2R22222N3P3U3 k3y3;333#344 4 !4.45484#J4'n4!44444@4*5!.5P5JY555(5 5 5/5d"6666667777Q7V7mr7789:J;;<'K<s<<<<B<`="i= ==$==>>>>>>2?Y5? ? ???? ??&@(@,@ D@P@Y@^@~@@ @ @@ @#@$A#%A$IABnA*AAA[B\BzBBB BBBBBBC,C=EC=CCCOC DD^E{}EE9FOFHJHEgHjHbI+{IaI J5JhKiKKLELL1L1MGM+OMs{MM5N/:NjN+NN NNKN,-O+ZO(O#O!O8O.P"GP$jPPPP PP PPPPP Q!Q:Q"@QcQhQwQ|QQ QQ QQ QQ Q-Q SS"S1SJShSS"SS+ST TT#2TVT_TeTwTT T T TTTTTUU*U :UHU_UvUU"UU U UUVV5VUVkVV VV%V!V*W*?W,jW#WW6W X X(X>;XzX0X&X)XY6YVY4uY(Y*Y?Y0>ZoZgZOZ>[D[J[(S[ |[[ [@[[ \'\@\dV\\ \3\^]q]]@]7]^ ^#^^^0_?9_.y_2_f_B`"Z`9}`:``2a EawQa#a aa b5bQbgbE{bbWb /c)9ccc c#c'cjchBd~da*ese"f#f,f,EfYrffff g+g BgMg`g%hg)gggg(gh$h54h%jhKhhhii5(i\^iLi?jHj;Oj`jjjCkIkfknkvkh{kkkl l/6lflkl+ollllllll+l+m ImjmpmmmLmm!mnSnenmn2tnnn?nhoqoo ooop p:pUp[pzxp prs8t\NuMu1u-+v Yvcv3|vfvtw)w ww.w3w.y@yWyry zyyMyyczszzzzzz,z{{5{O{ V{$b{{{{ {{1{.|->|/l|*|A|, }6} ;}\}7}(~D~K~R~Y~r~~~+~~~; :Ic"w+Q5VƄFd=ÆV;4p7`=6C܊ 0&Wߋ<77*o<׌ތT,[$0*ލ$ C.r<<̎  "/ 8DLUnŏ(ˏ  ' 5@E Va iGS(9f%mO#L]h-=[K=Rs"/a7 ,Xk)BVE>iU]#l)@:.'5>0hM:QZAU^r|.2iTI dHA$I'`S*zCk1c;R2g? !K O-c^m4<bZalPFjb NdC+Hu5ex*G`_;J4j+DnpoD{BE@? 8X3TW  P "\gyQN6$&7}YY0MF!Lnq/v<JV \&_~w3W,[8te69%f(1 (deprecated) (in Runtime: {} above this line# Write your code here :-)%(commas)s and %(last)s%(month_name)s %(day)s%(month_name)s %(day)s at %(time)s%(month_name)s %(day)s, %(year)s%(month_name)s %(day)s, %(year)s at %(time)s%(time)s%(weekday)s%(weekday)s at %(time)s%(weekday)s, %(month_name)s %(day)s%b %d, %Y%s %s%s (%s attribute)%s (%s.%s attribute)%s (C function)%s (C macro)%s (C member)%s (C type)%s (C variable)%s (C++ class)%s (C++ concept)%s (C++ enum)%s (C++ enumerator)%s (C++ function)%s (C++ member)%s (C++ type)%s (built-in class)%s (built-in variable)%s (class in %s)%s (directive)%s (global variable or constant)%s (in module %s)%s (module)%s (role)%s() (%s class method)%s() (%s method)%s() (%s static method)%s() (%s.%s class method)%s() (%s.%s method)%s() (%s.%s static method)%s() (built-in function)%s() (class)%s() (in module %s)%scommand line option; %s'%s' is not a valid option.'%s' is not a valid pyversion option'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)(The <> is located in %s, line %d.)(in %s v%s)(in %s)<>

All modules for which code is available

Source code for %s

A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Adafruit CircuitPythonAlgorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.AprilAugustAuthor: Awesome! Zero problems found.BBC micro:bitBBC micro:bit SettingsBases: %sBe brave, break things, learn and have fun!Beautiful is better than ugly.BuiltinsCannot Set Breakpoint.Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Code author: Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Debugging is twice as hard as writing the code in the first place.DecemberDelete (cannot be undone)Deleting '{}' from micro:bit.DeprecatedDetected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.FebruaryFile already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFootnotesFor the Zen of Python: import thisFridayGeneral IndexGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHello, World!HelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)IndexIs this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.JanuaryJulyJuneLines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.MarchMayMinify Python code before flashing?ModeModule author: Module codeModule levelMondayMuMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu {}Mu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.NovemberNow is better than never. Although never is often better than *right* now.OctoberOpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):Overview: module codePermalink to this codePermalink to this definitionPermalink to this equationPermalink to this headlinePermalink to this imagePermalink to this tablePermalink to this toctreePlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Pygame ZeroPython 3Python Enhancement Proposals; PEP %sPython files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 (Jupyter)Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPLREPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.ReleaseReplace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaturdaySaveSave the current Python script.Saved file: {}Section author: Select ModeSeptemberSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.SundaySymbolsSyntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.ThursdayTo understand what recursion is, you must first understand recursion.TodoToggle theme between day, night or high contrast.Try to see things from your users' point of view.TuesdayUnable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unknown configure key: latex_elements[%r] is ignored.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWednesdayWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You must provide something to find.Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-out[docs][graph: %s][graph][image: %s][image][source]alias of :class:`%s`continued from previous pagecontinues on next pageenvironment variable; %sindexmissing '+' or '-' in '%s' option.nextoriginal entrypageprevioussee %ssee also %suntitledyesterdayyesterday at %(time)s{} Plotter{} REPL{} [{}:{}]Project-Id-Version: PO-Revision-Date: 2018-07-10 11:01+0100 Last-Translator: Language-Team: Language: fr_FR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 X-Generator: Poedit 2.0.4 Plural-Forms: nplurals=2; plural=(n != 1); (obsolète) (dans Exécution: {}au dessus de cette ligne# Ecrit ton programme ici ;-)%(commas)s et %(last)s%(day)s %(month_name)s%(day)s %(month_name)s à %(time)s%(day)s %(month_name)s %(year)s%(day)s %(month_name)s %(year)s à %(time)s%(time)s%(weekday)s%(weekday)s à %(time)s%(weekday)s %(day)s %(month_name)s %d %b %Y%s %s%s ( attribut %s)%s (attribut %s.%s)%s (fonction C)%s (macro C)%s (membre C)%s (type C)%s (variable C)%s (classe C++)%s (concept C++)%s (énum C++)%s (énumerateur C++)%s (fonction C++)%s (membre C++)%s (type C++)%s (classe intégrée)%s (built-in variable)%s (classe dans %s)%s (directive)%s (variable globale ou constante)%s (dans le module %s)%s (module)%s (role)%s() (méthode de classe %s)%s() (méthode %s)%s() (méthode statique %s)%s() (méthode de classe %s.%s)%s() (méthode %s.%s)%s() (méthode statique %s.%s)%s() (fonction intégrée)%s() (classe)%s() (dans le module %s)%s option de la ligne de commande; %s'%s' n'est pas une option valide.'%s' n'est pas une option pyversion valide'{}' copié avec succès sur la micro:bit.'{}' supprimé avec succès de la micro:bit.(Un dictionnaire de {} éléments.)(Une liste de {} éléments.)(L' <> est située dans %s, ligne %d.)(dans %s v%s)(dans %s)<>

Tous les modules pour lesquels le code est disponible

Code source de %s

A fichier avec ce nom est déjà ouvert dans Mu.Un bon programmeur pose des questions.Un bon programmeur évite la complexité.Un bon programmeur est humble.Un bon programmeur est patient.Un bon programmeur est joueur.Un bon programmeur accepte de dire 'je ne sais pas'.Un bon programmeur apprend à apprendre.Un bon programmeur promeut la simplicité.Un bon programmeur réfléchit au delà de ce qui est évident.Accéder au système de fichiers de la micro:bitAdafruit CircuitPythonAlgorithme: un mot utilisé par les programmeurs quand ils ne veulent pas expliquer ce qu'ils ont fait.Un esprit ouvert, le goût de l'aventure et le respect des autres sont la clé.AvrilAoûtAuteur: Fantastique! Aucun problème découvert.BBC micro:bitConfiguration BBC micro:bitBases: %sSoit courageux(se), ose casser des choses, apprend et amuse toi!Beau est mieux que laid.IntégrationsImpossible de mettre un point d'arrêt.Change le mode de Mu.Change le mode à n'importe quel moment en cliquant sur le bouton "Mode" qui contient le logo de Mu.Basculé vers le mode {}VérifierVérifie que le programme ne contient pas d'erreur.Appuie sur le bouton 'reset' du périphérique, attend quelques secondes et essaie à nouveau.Auteur du code: Programmer, c'est collaborer.La complexité est ton ennemie. Reste aussi simple que possible.Complimente et amplifie les bonnes choses avec du code.Echec de la connexion. Es-ce que la machine est lente ou très occupée? Libère des ressources sur la machine, puis essaie à nouveau.ContinuerContinue à exécuter le programme.Copie '{}' sur la micro:bit.Impossible de trouver "{}".Impossible de trouver l'exécutable MicroPython.Impossible de trouvé un périphérique Adafruit CircuitPython.Impossible de trouver une micro:bit connectéeImpossible de trouver un périphérique connecté.Impossible de trouver localhost. Vérifie que tu as '127.0.0.1 localhost' dans ton fichier /etc/hosts.Impossible de charger{}Impossible de renommer le fichier.Impossible d'enregistrer le fichier (problème de disque)Impossible d'enregistrer le fichier (problème d'encodage)Crée un nouveau script Python.Crée un programme en utilisant Python 3 standard.Log courantActuellement Mu fonctionne seulement avec des scripts Python ou des fichiers hex créés avec le MicroPython embarqué.Inondation des données détectée!DéboguerInspecteur pour le débogageDébogue ton programme Python 3.Débogue ton script Python.Erreur débogueur: {}Info débogueur: {}Le débogueur a besoin que tu nommes le script Python pour se lancer.Alerte débogueur: {}Déboguer un programme est deux fois plus difficile que d'écrire un premier programme.DécembreSupprimer (retour en arrière impossible)Supprime '{}' de la micro:bitObsolèteNouveau périphérique {} détectéLa diversité favorise la créativité.Le fichier existe-t-il? S'il existe, as-tu les droits pour le lire? Merci de vérifier et de ré-essayer.Ne t'inquiète pas si ça ne fonctionne pas. Apprend la leçon, corrige ton programme et ré-essaie! :-)Impossible d'enregistrer le fichier. Vérifie que tu as les droits d'écrire sur le disque et qu'il y a assez d'espace disque.Les erreurs ne doivent pas être passées sous silence. Sauf si on le fait de manière explicite.Quand on programme, expliquer à un ami le problème que l'on rencontre, permet souvent de trouver la solution. ;-)Explicite est mieux que implicite.FévrierLe fichier existe déjàLe fichier existe déja: faut-il l'écraser?Le système de fichier ne peut pas fonctionner en même temps que le REPL ou le grapheur.FichiersFichiers sur ton ordinateur:Fichiers sur ta micro:bit:Système de fichier micro:bitRechercher / RemplacerRecherche:Flashage terminé.FlasherFlashe ton programme sur la micro:bitEn train de flasher "{}" sur la micro:bitPlat est mieux qu'imbriqué.PolicesNotes de bas de pagePour rester zen avec Python: importe çaVendrediIndex GénéralRécupère '{}' depuis la micro:bit. Copie dans '{}'.Bon travail! Aucun problème trouvé.Google, Facebook, la NASA, Pixar, Disney et bien d'autres utilisent Python.Débogueur graphiqueBonjour le monde!AideOccurences de "{}" surlignées.Hourra! Le vérificateur n'a trouvé aucun problème.Si l'implémentation est facile à expliquer, c'est probablement une bonne implémentation.Si l'implémentation est difficile à expliquer, c'est qu'elle est mauvaise.Si tu ne sais pas, demande. Si personne ne te répond, cherche!ImagesFace à l’ambiguïté, ne te laisse pas aller à deviner.En théorie, la théorie et la pratique c'est la même chose. En pratique, c'est différent. ;-)Index{} est un fichier?Ca ressemble a un fichier {}. Veux-tu changer le mode de Mu en {}?C'est amusant de programmer.JanvierJuilletJuinLes lignes qui sont des commentaires ou instruction multi-lignes ne peuvent pas avoir de point d'arrêt.ChargerCharge un script Python.Logguer dans {}Crée des jeux avec Pygame Zero.Rend ton programme à la fois utile et amusant.MarsMaiCompresser le code Python avant le flasher?ModeAuteur du module: Code du moduleNiveau du moduleLundiMuAdministration de MuMu ne peut pas lire les caractères dans {}Mu a été créé par Nicholas H. TollerveyMu ne peut pas ouvrir ce fichierMu {}Mode courant de Mu.MusiquesNomLes espaces de nommages sont une super bonne idée. Utilisons les davantage!NouveauBravo! Aucun problème détecté.NovembreMaintenant vaut mieux que jamais. Mais jamais vaut souvent mieux que tout de suite.OctobreOuvrirOuvre une connexion série sur ton périphérique.Ouvrir avec MuOuverture de '{}'On a essayé de le compresser mais ton programme est trop long!Remplace l'exécutable MicroPython par le fichier hex suivant (vide signifie utilise celui par défaut):Généralités: code du modulePermalien vers ce programmePermalien vers cette définitionPermalien vers cette équationPermalien vers cet entêtePermalien vers cet imagePermalien vers ce tableauPermalien vers ce sommaireJouerJoue à ton jeu Pygame Zero.Ne pas déconnecter le périphériques tant que le flashage n'est pas terminé. Regarde les logs pour plus d'informations.Merci de laisser suffisamment de temps à la micro:bit connectée à ton ordinateur. Ceci peut prendre plusieurs secondes. Si le périphérique n'apparaît toujours pas, essaye de débrancher/rebrancher le périphérique ou d'enregistrer ton travail et redémarrer Mu.Merci de vérifier que le périphérique est connecté à l'ordinateur. Le périphérique doit avoir MicroPython (ou CircuitPython) flashé dessus pour que le grapheur fonctionne. Enfin, appuie sur le bouton 'reset' du périphérique et attend quelques secondes avant de ré-essayer.Merci de vérifier que le périphérique est connecté à l'ordinateur. Le périphérique doit avoir MicroPython (ou CircuitPython) flashé dessus pour que le REPL fonctionne. Enfin, appuie sur le bouton 'reset' du périphérique et attend quelques secondes avant de ré-essayer.Merci de vérifier que le périphérique est connecté à l'ordinateur. Le périphérique doit avoir MicroPython flashé dessus pour que le système de fichier fonctionne. Enfin, appuie sur le bouton 'reset' du périphérique et attend quelques secondes avant de ré-essayer.Merci de sélectionner le mode désiré puis cliquer sur "OK". Sinon, cliquer sur "Annuler".Essaie à nouveau, cette fois avec quelque chose dans la boîte de recherche.Graphe les données depuis ton script ou le REPL.Déssine graphique avec les données du REPL.GraphiqueProblème avec le scriptLes programmeurs comptent en commençant par zéro.La programmation se rapproche plus de la résolution d'un problème que de l'écriture d'un programme.La programmation est une forme de magie. Apprend à lancer des sorts avec un programme et tu deviendras un magicien.Met toi dans la peau de tes utilisateurs.Pygame ZeroPython 3Propositions d'Amélioration de Python; PEP %sLe fichiers Python pour les périphériques Adafruit CircuitPython sont stockés directement sur le périphérique. Ainsi, pour pouvoir les modifier il faut avoir un périphérique connecté. En attendant qu'un périphérique soit connecté, Mu utilisera le dossier: {} ... pour ton stocker ton programme.Python3 (Jupyter)Environnement Python 3Tuple de données Python 3QuitterQuitte Mu.REPLLe REPL et le système de fichiers ne peuvent pas fonctionner en même temps.REPL signifie read (lire), evaluate (évaluer), print (afficher), loop (boucler). C'est une manière de dialoguer avec ton ordinateur! ;-)REPL démarré.REPL arrêté.La lisibilité est importante.VersionRemplace (optionnel):Remplacer tout?"{}" remplacé par "{}".{} occurrences de "{}" remplacées par "{}".LancerLance ton script Python.En cours d'exécution: {}SamediEnregistrerEnregistre le script Python courant.Fichier enregistré: {}Auteur de la section: Sélectionner un ModeSeptembreSérieMontre l'aide à propos de Mu dans un navigateur.Montre les polices utilisées par Pygame Zero.Montre les images utilisées par Pygame Zero.Montre les musiques utilisées par Pygame Zero.Montre les sons utilisés par Pygame Zero.Simple est mieux que complexe. Complexe est mieux que compliqué.La simplicité est la sophistication ultime.SonsClairsemé est mieux que bondé.Les cas spécifiques ne sont pas assez spéciaux pour qu'ils ne respectent pas les règles. Néanmoins, l'aspect pratique l'emporte sur la pureté.Commence par répondre au besoins des tes utilisateurs.Démarrage du REPL iPython.EntrerSortirSauterEntre dans une fonction.Sort d'une fonction.Saute une ligne de code.ArrêterArrête le programme en cours d'exécution.Arrête ton jeu Pygame Zero.Arrête ton script Python.Arrêt du REPL iPython (ceci peut prendre un peu de temps).'{}' copié avec succès de la micro:bit sur l'ordinateur.DimancheSymbolesErreur de syntaxe. Python ne comprend pas cette ligne. Vérifie qu'il ne manque pas de caractères!Le REPL et le système de fichiers utilisent tous les deux la même connexion USB série. Un seul des deux peut être actif à la fois. Désactive le système de fichier et ré-essaie.Les variables d'environnement ci-dessous seront définies chaque fois que tu lanceras un script Python 3 Chaque variable d'environnement doit être sur une nouvelle ligne de la forme: NOM=VALEURLe fichier "{}" est déjà ouvert.Le système de fichiers, le REPL et le grapheur utilisent la même connexion USB série. Désactive le REPL et le grapheur et essaie à nouveau.Le grapheur et le système de fichiers utilisent la même connexion USB série. Un seul des deux peut être active à la fois. Désactive le système de fichiers et essaie à nouveau.Le grapheur et le systèle de fichiers ne peuvent pas fonctionner en même temps.Le grapheur est inondé par les donnée ce qui rend Mu peu réactif voir bloqué. Par sécurité, le grapheur a été interrompu. L'inondation se produit lorsque de bloc de données de plus de 1024 octets sont envoyés en boucle au grapheur. Pour corriger ceci, assure toi que ton programme affiche des petits tuples de données entre les appels à 'sleep' pour une courte période de temps.ThèmeTout ton travail n'a pas été enregistré. Si tu fermes l'application, il sera perdu.Il ne devrait y avoir qu'une (et une seule) façon évidente de faire.Un problème est survenu pendant la copie du fichier '{}' sur la micro:bit. Merci de vérifier les logs de Mu pour avoir plus d'informations.Un problème est survenu pendant la suppression du fichier '{}' de la micro:bit. Merci de vérifier les logs de Mu pour avoir plus d'informations.Un problème est survenu pendant le flashage de la micro:bit.Un problème est survenu pendant la lecture du fichier '{}' depuis la micro:bit. Merci de vérifier les logs de Mu pour avoir plus d'informations.Un problème est survenu pendant le listage des fichiers sur la micro:bit. Merci de vérifier les logs de Mu pour avoir plus d'informations. Sinon, essaie de débrancher/rebrancher ta micro:bit, ou bien de redémarrer Mu.Cet éditeur s'appelle Mu (ca se prononce 'miou' ou 'moo').Cet éditeur est un logiciel libre écrit en Python. Tu peux le modifier, ajouter des fonctionnalités ou corriger des bogues si tu le souhaites.Ce nom est déjà utilisé ailleurs dans Python. Si tu utilises ce nom, cela risque de ne pas fonctionner. Essaie avec un nom de fichier différent.Ce nom est déjà utilisé ailleurs dans Python. Si tu utilises ce nom, il est probable que ça ne fonctionnera plus. Essaie avec un nom de fichier différent.JeudiPour comprendre ce qu'est la récursivité. Tu dois d'abord comprend ce qu'est la récursivité.AFaireChange de thème entre jour, nuit ou contraste élevéEssaye de voir les choses avec le point de vue de tes utilisateurs.MardiImpossible de se connecter au déboguer Python. Impossible de convertir tous les caractères. S'il y a entête de fichier pour définir l'encodage, essaye de l'enlever et recommence. Impossible de flasher "{}"Clé de configuration inconnue: latex_elements[%r] ignorée.Utilise CircuitPython avec la gamme de cartes Adafruit.Utilise le REPL pour programmer en direct.Utilise le REPL pour programmer directement sur la micro:bitValeurMercrediBien joué! Pas problème ici.Quand vous rapportez un bug, copiez et collez le contenu du fichier de logs suivant.Les plus sages savent qu'ils ne savent rien.Veux-tu changer le mode de Mu en {}?Ecrit un programme MicroPython pour la micro:bitTu dois fournir quelque chose à chercher.Ton programme a fini de s'exécuter.Ton programme est trop long et le compresseur n'est pas disponible.Ton programme est trop long!Augmente le niveau de zoom (pour rendre le texte plus gros).Diminue le niveau de zoom (pour rendre le texte plus petit).ZoomerDé-zoomer[docs][graphe: %s][graphe][image: %s][image][source]alias de la :classe:`%s`suite de la page précédentesuite sur le page suivante variable d'environnement; %sindex'+' ou '-' manquants dans l'option '%s'.suivantentrée originalepageprécédentvoir %svoir aussi %ssans titrehierhier à %(time)sGrapher {}{} REPL{} [{}:{}]mu-editor-1.0.2+dfsg/mu/locale/fr/LC_MESSAGES/mu.po000066400000000000000000001476441341747546300214310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , 2018. # msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2018-07-09 22:48+0200\n" "PO-Revision-Date: 2018-07-10 11:01+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 2.0.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: .venv/lib/python3.5/site-packages/sphinx/builders/changes.py:85 msgid "Builtins" msgstr "Intégrations" #: .venv/lib/python3.5/site-packages/sphinx/builders/changes.py:87 msgid "Module level" msgstr "Niveau du module" #: .venv/lib/python3.5/site-packages/sphinx/builders/html.py:444 #: .venv/lib/python3.5/site-packages/sphinx/transforms/__init__.py:127 #: .venv/lib/python3.5/site-packages/sphinx/writers/latex.py:500 #: .venv/lib/python3.5/site-packages/sphinx/writers/manpage.py:110 #: .venv/lib/python3.5/site-packages/sphinx/writers/texinfo.py:240 msgid "%b %d, %Y" msgstr "%d %b %Y" #: .venv/lib/python3.5/site-packages/sphinx/builders/html.py:462 msgid "General Index" msgstr "Index Général" #: .venv/lib/python3.5/site-packages/sphinx/builders/html.py:462 msgid "index" msgstr "index" #: .venv/lib/python3.5/site-packages/sphinx/builders/html.py:526 msgid "next" msgstr "suivant" #: .venv/lib/python3.5/site-packages/sphinx/builders/html.py:535 msgid "previous" msgstr "précédent" #: .venv/lib/python3.5/site-packages/sphinx/builders/latex/__init__.py:207 #: .venv/lib/python3.5/site-packages/sphinx/builders/texinfo.py:224 msgid " (in " msgstr " (dans " #: .venv/lib/python3.5/site-packages/sphinx/directives/other.py:168 msgid "Section author: " msgstr "Auteur de la section: " #: .venv/lib/python3.5/site-packages/sphinx/directives/other.py:170 msgid "Module author: " msgstr "Auteur du module: " #: .venv/lib/python3.5/site-packages/sphinx/directives/other.py:172 msgid "Code author: " msgstr "Auteur du code: " #: .venv/lib/python3.5/site-packages/sphinx/directives/other.py:174 msgid "Author: " msgstr "Auteur: " #: .venv/lib/python3.5/site-packages/sphinx/domains/__init__.py:334 msgid "%s %s" msgstr "%s %s" #: .venv/lib/python3.5/site-packages/sphinx/domains/c.py:188 msgid "%s (C function)" msgstr "%s (fonction C)" #: .venv/lib/python3.5/site-packages/sphinx/domains/c.py:190 msgid "%s (C member)" msgstr "%s (membre C)" #: .venv/lib/python3.5/site-packages/sphinx/domains/c.py:192 msgid "%s (C macro)" msgstr "%s (macro C)" #: .venv/lib/python3.5/site-packages/sphinx/domains/c.py:194 msgid "%s (C type)" msgstr "%s (type C)" #: .venv/lib/python3.5/site-packages/sphinx/domains/c.py:196 msgid "%s (C variable)" msgstr "%s (variable C)" #: .venv/lib/python3.5/site-packages/sphinx/domains/cpp.py:5784 msgid "%s (C++ type)" msgstr "%s (type C++)" #: .venv/lib/python3.5/site-packages/sphinx/domains/cpp.py:5794 msgid "%s (C++ concept)" msgstr "%s (concept C++)" #: .venv/lib/python3.5/site-packages/sphinx/domains/cpp.py:5804 msgid "%s (C++ member)" msgstr "%s (membre C++)" #: .venv/lib/python3.5/site-packages/sphinx/domains/cpp.py:5814 msgid "%s (C++ function)" msgstr "%s (fonction C++)" #: .venv/lib/python3.5/site-packages/sphinx/domains/cpp.py:5824 msgid "%s (C++ class)" msgstr "%s (classe C++)" #: .venv/lib/python3.5/site-packages/sphinx/domains/cpp.py:5834 msgid "%s (C++ enum)" msgstr "%s (énum C++)" #: .venv/lib/python3.5/site-packages/sphinx/domains/cpp.py:5854 msgid "%s (C++ enumerator)" msgstr "%s (énumerateur C++)" #: .venv/lib/python3.5/site-packages/sphinx/domains/javascript.py:131 #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:403 msgid "%s() (built-in function)" msgstr "%s() (fonction intégrée)" #: .venv/lib/python3.5/site-packages/sphinx/domains/javascript.py:132 #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:468 msgid "%s() (%s method)" msgstr "%s() (méthode %s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/javascript.py:134 msgid "%s() (class)" msgstr "%s() (classe)" #: .venv/lib/python3.5/site-packages/sphinx/domains/javascript.py:136 msgid "%s (global variable or constant)" msgstr "%s (variable globale ou constante)" #: .venv/lib/python3.5/site-packages/sphinx/domains/javascript.py:138 #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:506 msgid "%s (%s attribute)" msgstr "%s ( attribut %s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/javascript.py:266 #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:584 msgid "%s (module)" msgstr "%s (module)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:404 #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:462 #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:474 #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:487 msgid "%s() (in module %s)" msgstr "%s() (dans le module %s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:407 msgid "%s (built-in variable)" msgstr "%s (built-in variable)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:408 #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:500 msgid "%s (in module %s)" msgstr "%s (dans le module %s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:428 msgid "%s (built-in class)" msgstr "%s (classe intégrée)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:429 msgid "%s (class in %s)" msgstr "%s (classe dans %s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:466 msgid "%s() (%s.%s method)" msgstr "%s() (méthode %s.%s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:478 msgid "%s() (%s.%s static method)" msgstr "%s() (méthode statique %s.%s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:481 msgid "%s() (%s static method)" msgstr "%s() (méthode statique %s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:491 msgid "%s() (%s.%s class method)" msgstr "%s() (méthode de classe %s.%s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:494 msgid "%s() (%s class method)" msgstr "%s() (méthode de classe %s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:504 msgid "%s (%s.%s attribute)" msgstr "%s (attribut %s.%s)" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:692 msgid "Deprecated" msgstr "Obsolète" #: .venv/lib/python3.5/site-packages/sphinx/domains/python.py:892 msgid " (deprecated)" msgstr "(obsolète)" #: .venv/lib/python3.5/site-packages/sphinx/domains/rst.py:65 msgid "%s (directive)" msgstr "%s (directive)" #: .venv/lib/python3.5/site-packages/sphinx/domains/rst.py:67 msgid "%s (role)" msgstr "%s (role)" #: .venv/lib/python3.5/site-packages/sphinx/domains/std.py:100 msgid "environment variable; %s" msgstr " variable d'environnement; %s" #: .venv/lib/python3.5/site-packages/sphinx/domains/std.py:199 msgid "%scommand line option; %s" msgstr "%s option de la ligne de commande; %s" #: .venv/lib/python3.5/site-packages/sphinx/environment/adapters/indexentries.py:85 msgid "see %s" msgstr "voir %s" #: .venv/lib/python3.5/site-packages/sphinx/environment/adapters/indexentries.py:89 msgid "see also %s" msgstr "voir aussi %s" #: .venv/lib/python3.5/site-packages/sphinx/environment/adapters/indexentries.py:159 msgid "Symbols" msgstr "Symboles" #: .venv/lib/python3.5/site-packages/sphinx/ext/autodoc/__init__.py:1129 msgid "Bases: %s" msgstr "Bases: %s" #: .venv/lib/python3.5/site-packages/sphinx/ext/autodoc/__init__.py:1190 msgid "alias of :class:`%s`" msgstr "alias de la :classe:`%s`" #: .venv/lib/python3.5/site-packages/sphinx/ext/doctest.py:132 msgid "missing '+' or '-' in '%s' option." msgstr "'+' ou '-' manquants dans l'option '%s'." #: .venv/lib/python3.5/site-packages/sphinx/ext/doctest.py:137 msgid "'%s' is not a valid option." msgstr "'%s' n'est pas une option valide." #: .venv/lib/python3.5/site-packages/sphinx/ext/doctest.py:151 msgid "'%s' is not a valid pyversion option" msgstr "'%s' n'est pas une option pyversion valide" #: .venv/lib/python3.5/site-packages/sphinx/ext/graphviz.py:377 #: .venv/lib/python3.5/site-packages/sphinx/ext/graphviz.py:386 msgid "[graph: %s]" msgstr "[graphe: %s]" #: .venv/lib/python3.5/site-packages/sphinx/ext/graphviz.py:379 #: .venv/lib/python3.5/site-packages/sphinx/ext/graphviz.py:388 msgid "[graph]" msgstr "[graphe]" #: .venv/lib/python3.5/site-packages/sphinx/ext/imgmath.py:338 #: .venv/lib/python3.5/site-packages/sphinx/ext/jsmath.py:41 #: .venv/lib/python3.5/site-packages/sphinx/ext/mathjax.py:42 msgid "Permalink to this equation" msgstr "Permalien vers cette équation" #: .venv/lib/python3.5/site-packages/sphinx/ext/intersphinx.py:341 msgid "(in %s v%s)" msgstr "(dans %s v%s)" #: .venv/lib/python3.5/site-packages/sphinx/ext/intersphinx.py:343 msgid "(in %s)" msgstr "(dans %s)" #: .venv/lib/python3.5/site-packages/sphinx/ext/linkcode.py:75 #: .venv/lib/python3.5/site-packages/sphinx/ext/viewcode.py:111 msgid "[source]" msgstr "[source]" #: .venv/lib/python3.5/site-packages/sphinx/ext/todo.py:67 msgid "Todo" msgstr "AFaire" #: .venv/lib/python3.5/site-packages/sphinx/ext/todo.py:154 msgid "<>" msgstr "<>" #: .venv/lib/python3.5/site-packages/sphinx/ext/todo.py:157 msgid "(The <> is located in %s, line %d.)" msgstr "(L' <> est située dans %s, ligne %d.)" #: .venv/lib/python3.5/site-packages/sphinx/ext/todo.py:166 msgid "original entry" msgstr "entrée originale" #: .venv/lib/python3.5/site-packages/sphinx/ext/viewcode.py:179 msgid "[docs]" msgstr "[docs]" #: .venv/lib/python3.5/site-packages/sphinx/ext/viewcode.py:193 msgid "Module code" msgstr "Code du module" #: .venv/lib/python3.5/site-packages/sphinx/ext/viewcode.py:199 msgid "

Source code for %s

" msgstr "

Code source de %s

" #: .venv/lib/python3.5/site-packages/sphinx/ext/viewcode.py:225 msgid "Overview: module code" msgstr "Généralités: code du module" #: .venv/lib/python3.5/site-packages/sphinx/ext/viewcode.py:226 msgid "

All modules for which code is available

" msgstr "

Tous les modules pour lesquels le code est disponible

" #: .venv/lib/python3.5/site-packages/sphinx/roles.py:202 msgid "Python Enhancement Proposals; PEP %s" msgstr "Propositions d'Amélioration de Python; PEP %s" #: .venv/lib/python3.5/site-packages/sphinx/writers/html.py:126 #: .venv/lib/python3.5/site-packages/sphinx/writers/html.py:137 #: .venv/lib/python3.5/site-packages/sphinx/writers/html5.py:95 #: .venv/lib/python3.5/site-packages/sphinx/writers/html5.py:106 msgid "Permalink to this definition" msgstr "Permalien vers cette définition" #: .venv/lib/python3.5/site-packages/sphinx/writers/html.py:405 #: .venv/lib/python3.5/site-packages/sphinx/writers/html.py:410 #: .venv/lib/python3.5/site-packages/sphinx/writers/html5.py:351 #: .venv/lib/python3.5/site-packages/sphinx/writers/html5.py:356 msgid "Permalink to this headline" msgstr "Permalien vers cet entête" #: .venv/lib/python3.5/site-packages/sphinx/writers/html.py:414 #: .venv/lib/python3.5/site-packages/sphinx/writers/html5.py:360 msgid "Permalink to this table" msgstr "Permalien vers ce tableau" #: .venv/lib/python3.5/site-packages/sphinx/writers/html.py:466 #: .venv/lib/python3.5/site-packages/sphinx/writers/html5.py:412 msgid "Permalink to this code" msgstr "Permalien vers ce programme" #: .venv/lib/python3.5/site-packages/sphinx/writers/html.py:470 #: .venv/lib/python3.5/site-packages/sphinx/writers/html5.py:416 msgid "Permalink to this image" msgstr "Permalien vers cet image" #: .venv/lib/python3.5/site-packages/sphinx/writers/html.py:472 #: .venv/lib/python3.5/site-packages/sphinx/writers/html5.py:418 msgid "Permalink to this toctree" msgstr "Permalien vers ce sommaire" #: .venv/lib/python3.5/site-packages/sphinx/writers/latex.py:467 #: .venv/lib/python3.5/site-packages/sphinx/writers/texinfo.py:516 msgid "Index" msgstr "Index" #: .venv/lib/python3.5/site-packages/sphinx/writers/latex.py:471 msgid "Release" msgstr "Version" #: .venv/lib/python3.5/site-packages/sphinx/writers/latex.py:639 msgid "continued from previous page" msgstr "suite de la page précédente" #: .venv/lib/python3.5/site-packages/sphinx/writers/latex.py:642 msgid "continues on next page" msgstr "suite sur le page suivante" #: .venv/lib/python3.5/site-packages/sphinx/writers/latex.py:646 msgid "page" msgstr "page" #: .venv/lib/python3.5/site-packages/sphinx/writers/latex.py:696 msgid "Unknown configure key: latex_elements[%r] is ignored." msgstr "Clé de configuration inconnue: latex_elements[%r] ignorée." #: .venv/lib/python3.5/site-packages/sphinx/writers/latex.py:1252 #: .venv/lib/python3.5/site-packages/sphinx/writers/manpage.py:275 #: .venv/lib/python3.5/site-packages/sphinx/writers/texinfo.py:669 msgid "Footnotes" msgstr "Notes de bas de page" #: .venv/lib/python3.5/site-packages/sphinx/writers/manpage.py:331 #: .venv/lib/python3.5/site-packages/sphinx/writers/text.py:713 msgid "[image: %s]" msgstr "[image: %s]" #: .venv/lib/python3.5/site-packages/sphinx/writers/manpage.py:332 #: .venv/lib/python3.5/site-packages/sphinx/writers/text.py:714 msgid "[image]" msgstr "[image]" #: .venv/lib/python3.5/site-packages/tornado/locale.py:288 msgid "April" msgstr "Avril" #: .venv/lib/python3.5/site-packages/tornado/locale.py:288 msgid "February" msgstr "Février" #: .venv/lib/python3.5/site-packages/tornado/locale.py:288 msgid "January" msgstr "Janvier" #: .venv/lib/python3.5/site-packages/tornado/locale.py:288 msgid "March" msgstr "Mars" #: .venv/lib/python3.5/site-packages/tornado/locale.py:289 msgid "August" msgstr "Août" #: .venv/lib/python3.5/site-packages/tornado/locale.py:289 msgid "July" msgstr "Juillet" #: .venv/lib/python3.5/site-packages/tornado/locale.py:289 msgid "June" msgstr "Juin" #: .venv/lib/python3.5/site-packages/tornado/locale.py:289 msgid "May" msgstr "Mai" #: .venv/lib/python3.5/site-packages/tornado/locale.py:290 msgid "December" msgstr "Décembre" #: .venv/lib/python3.5/site-packages/tornado/locale.py:290 msgid "November" msgstr "Novembre" #: .venv/lib/python3.5/site-packages/tornado/locale.py:290 msgid "October" msgstr "Octobre" #: .venv/lib/python3.5/site-packages/tornado/locale.py:290 msgid "September" msgstr "Septembre" #: .venv/lib/python3.5/site-packages/tornado/locale.py:292 msgid "Monday" msgstr "Lundi" #: .venv/lib/python3.5/site-packages/tornado/locale.py:292 msgid "Thursday" msgstr "Jeudi" #: .venv/lib/python3.5/site-packages/tornado/locale.py:292 msgid "Tuesday" msgstr "Mardi" #: .venv/lib/python3.5/site-packages/tornado/locale.py:292 msgid "Wednesday" msgstr "Mercredi" #: .venv/lib/python3.5/site-packages/tornado/locale.py:293 msgid "Friday" msgstr "Vendredi" #: .venv/lib/python3.5/site-packages/tornado/locale.py:293 msgid "Saturday" msgstr "Samedi" #: .venv/lib/python3.5/site-packages/tornado/locale.py:293 msgid "Sunday" msgstr "Dimanche" #: .venv/lib/python3.5/site-packages/tornado/locale.py:358 msgid "%(time)s" msgstr "%(time)s" #: .venv/lib/python3.5/site-packages/tornado/locale.py:361 msgid "yesterday" msgstr "hier" #: .venv/lib/python3.5/site-packages/tornado/locale.py:362 msgid "yesterday at %(time)s" msgstr "hier à %(time)s" #: .venv/lib/python3.5/site-packages/tornado/locale.py:364 msgid "%(weekday)s" msgstr "%(weekday)s" #: .venv/lib/python3.5/site-packages/tornado/locale.py:365 msgid "%(weekday)s at %(time)s" msgstr "%(weekday)s à %(time)s" #: .venv/lib/python3.5/site-packages/tornado/locale.py:367 #: .venv/lib/python3.5/site-packages/tornado/locale.py:409 msgid "%(month_name)s %(day)s" msgstr "%(day)s %(month_name)s" #: .venv/lib/python3.5/site-packages/tornado/locale.py:368 msgid "%(month_name)s %(day)s at %(time)s" msgstr "%(day)s %(month_name)s à %(time)s" #: .venv/lib/python3.5/site-packages/tornado/locale.py:371 msgid "%(month_name)s %(day)s, %(year)s" msgstr "%(day)s %(month_name)s %(year)s" #: .venv/lib/python3.5/site-packages/tornado/locale.py:372 msgid "%(month_name)s %(day)s, %(year)s at %(time)s" msgstr "%(day)s %(month_name)s %(year)s à %(time)s" #: .venv/lib/python3.5/site-packages/tornado/locale.py:403 msgid "%(weekday)s, %(month_name)s %(day)s" msgstr "%(weekday)s %(day)s %(month_name)s " #: .venv/lib/python3.5/site-packages/tornado/locale.py:426 msgid "%(commas)s and %(last)s" msgstr "%(commas)s et %(last)s" #: mu/app.py:66 msgid "Logging to {}" msgstr "Logguer dans {}" #: mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "Le débogueur a besoin que tu nommes le script Python pour se lancer." #: mu/debugger/client.py:106 msgid "" "Connection timed out. Is your machine slow or busy? Free up some of the " "machine's resources and try again." msgstr "" "Echec de la connexion. Es-ce que la machine est lente ou très occupée? " "Libère des ressources sur la machine, puis essaie à nouveau." #: mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "" "Impossible de trouver localhost.\n" "Vérifie que tu as '127.0.0.1 localhost' dans ton fichier /etc/hosts." #: mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "Sélectionner un Mode" #: mu/interface/dialogs.py:57 msgid "" "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel" "\"." msgstr "" "Merci de sélectionner le mode désiré puis cliquer sur \"OK\". Sinon, cliquer " "sur \"Annuler\"." #: mu/interface/dialogs.py:73 msgid "" "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "" "Change le mode à n'importe quel moment en cliquant sur le bouton \"Mode\" " "qui contient le logo de Mu." #: mu/interface/dialogs.py:107 msgid "" "When reporting a bug, copy and paste the content of the following log file." msgstr "" "Quand vous rapportez un bug, copiez et collez le contenu du fichier de logs " "suivant." #: mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python " "3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "Les variables d'environnement ci-dessous seront définies chaque fois que tu " "lanceras un script Python 3\n" "\n" "Chaque variable d'environnement doit être sur une nouvelle ligne de la " "forme:\n" "NOM=VALEUR" #: mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "Compresser le code Python avant le flasher?" #: mu/interface/dialogs.py:153 msgid "" "Override the built-in MicroPython runtime with the following hex file (empty " "means use the default):" msgstr "" "Remplace l'exécutable MicroPython par le fichier hex suivant (vide signifie " "utilise celui par défaut):" #: mu/interface/dialogs.py:175 mu/interface/main.py:973 msgid "Mu Administration" msgstr "Administration de Mu" #: mu/interface/dialogs.py:186 msgid "Current Log" msgstr "Log courant" #: mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Environnement Python 3" #: mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "Configuration BBC micro:bit" #: mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "Rechercher / Remplacer" #: mu/interface/dialogs.py:227 msgid "Find:" msgstr "Recherche:" #: mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "Remplace (optionnel):" #: mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "Remplacer tout?" #: mu/interface/editor.py:222 mu/logic.py:960 msgid "untitled" msgstr "sans titre" #: mu/interface/main.py:68 msgid "Mode" msgstr "Mode" #: mu/interface/main.py:69 msgid "Change Mu's mode of behaviour." msgstr "Change le mode de Mu." #: mu/interface/main.py:71 msgid "New" msgstr "Nouveau" #: mu/interface/main.py:72 msgid "Create a new Python script." msgstr "Crée un nouveau script Python." #: mu/interface/main.py:73 msgid "Load" msgstr "Charger" #: mu/interface/main.py:74 msgid "Load a Python script." msgstr "Charge un script Python." #: mu/interface/main.py:75 msgid "Save" msgstr "Enregistrer" #: mu/interface/main.py:76 msgid "Save the current Python script." msgstr "Enregistre le script Python courant." #: mu/interface/main.py:85 msgid "Zoom-in" msgstr "Zoomer" #: mu/interface/main.py:86 msgid "Zoom in (to make the text bigger)." msgstr "Augmente le niveau de zoom (pour rendre le texte plus gros)." #: mu/interface/main.py:87 msgid "Zoom-out" msgstr "Dé-zoomer" #: mu/interface/main.py:88 msgid "Zoom out (to make the text smaller)." msgstr "Diminue le niveau de zoom (pour rendre le texte plus petit)." #: mu/interface/main.py:89 msgid "Theme" msgstr "Thème" #: mu/interface/main.py:90 msgid "Toggle theme between day, night or high contrast." msgstr "Change de thème entre jour, nuit ou contraste élevé" #: mu/interface/main.py:93 msgid "Check" msgstr "Vérifier" #: mu/interface/main.py:94 msgid "Check your code for mistakes." msgstr "Vérifie que le programme ne contient pas d'erreur." #: mu/interface/main.py:95 msgid "Help" msgstr "Aide" #: mu/interface/main.py:96 msgid "Show help about Mu in a browser." msgstr "Montre l'aide à propos de Mu dans un navigateur." #: mu/interface/main.py:97 msgid "Quit" msgstr "Quitter" #: mu/interface/main.py:98 msgid "Quit Mu." msgstr "Quitte Mu." #: mu/interface/main.py:177 msgid "Mu {}" msgstr "Mu {}" #: mu/interface/main.py:374 msgid "Filesystem on micro:bit" msgstr "Système de fichier micro:bit" #: mu/interface/main.py:433 msgid "Python3 data tuple" msgstr "Tuple de données Python 3" #: mu/interface/main.py:445 msgid "Python3 (Jupyter)" msgstr "Python3 (Jupyter)" #: mu/interface/main.py:452 msgid "{} REPL" msgstr "{} REPL" #: mu/interface/main.py:468 msgid "{} Plotter" msgstr "Grapher {}" #: mu/interface/main.py:509 msgid "Running: {}" msgstr "En cours d'exécution: {}" #: mu/interface/main.py:533 msgid "Debug Inspector" msgstr "Inspecteur pour le débogage" #: mu/interface/main.py:551 msgid "Name" msgstr "Nom" #: mu/interface/main.py:551 msgid "Value" msgstr "Valeur" #: mu/interface/main.py:568 msgid "(A list of {} items.)" msgstr "(Une liste de {} éléments.)" #: mu/interface/main.py:580 msgid "(A dict of {} items.)" msgstr "(Un dictionnaire de {} éléments.)" #: mu/interface/main.py:717 msgid "Mu" msgstr "Mu" #: mu/interface/main.py:966 msgid "Mu's current mode of behaviour." msgstr "Mode courant de Mu." #: mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "Le fichier existe déja: faut-il l'écraser?" #: mu/interface/panes.py:297 msgid "File already exists" msgstr "Le fichier existe déjà" #: mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "Copie '{}' sur la micro:bit." #: mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "'{}' copié avec succès sur la micro:bit." #: mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "Supprimer (retour en arrière impossible)" #: mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "Supprime '{}' de la micro:bit" #: mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "'{}' supprimé avec succès de la micro:bit." #: mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "Récupère '{}' depuis la micro:bit. Copie dans '{}'." #: mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "'{}' copié avec succès de la micro:bit sur l'ordinateur." #: mu/interface/panes.py:409 msgid "Open in Mu" msgstr "Ouvrir avec Mu" #: mu/interface/panes.py:411 msgid "Open" msgstr "Ouvrir" #: mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "Ouverture de '{}'" #: mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "Fichiers sur ta micro:bit:" #: mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "Fichiers sur ton ordinateur:" #: mu/interface/panes.py:527 msgid "" "There was a problem getting the list of files on the micro:bit. Please check " "Mu's logs for technical information. Alternatively, try unplugging/plugging-" "in your micro:bit and/or restarting Mu." msgstr "" "Un problème est survenu pendant le listage des fichiers sur la micro:bit. " "Merci de vérifier les logs de Mu pour avoir plus d'informations. Sinon, " "essaie de débrancher/rebrancher ta micro:bit, ou bien de redémarrer Mu." #: mu/interface/panes.py:538 msgid "" "There was a problem copying the file '{}' onto the micro:bit. Please check " "Mu's logs for more information." msgstr "" "Un problème est survenu pendant la copie du fichier '{}' sur la micro:bit. " "Merci de vérifier les logs de Mu pour avoir plus d'informations." #: mu/interface/panes.py:546 msgid "" "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Un problème est survenu pendant la suppression du fichier '{}' de la micro:" "bit. Merci de vérifier les logs de Mu pour avoir plus d'informations." #: mu/interface/panes.py:554 msgid "" "There was a problem getting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Un problème est survenu pendant la lecture du fichier '{}' depuis la micro:" "bit. Merci de vérifier les logs de Mu pour avoir plus d'informations." #: mu/logic.py:69 msgid "Hello, World!" msgstr "Bonjour le monde!" #: mu/logic.py:70 msgid "" "This editor is free software written in Python. You can modify it, add " "features or fix bugs if you like." msgstr "" "Cet éditeur est un logiciel libre écrit en Python. Tu peux le modifier, " "ajouter des fonctionnalités ou corriger des bogues si tu le souhaites." #: mu/logic.py:72 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "Cet éditeur s'appelle Mu (ca se prononce 'miou' ou 'moo')." #: mu/logic.py:73 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "" "Google, Facebook, la NASA, Pixar, Disney et bien d'autres utilisent Python." #: mu/logic.py:74 msgid "" "Programming is a form of magic. Learn to cast the right spells with code and " "you'll be a wizard." msgstr "" "La programmation est une forme de magie. Apprend à lancer des sorts avec un " "programme et tu deviendras un magicien." #: mu/logic.py:76 msgid "" "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your " "computer! :-)" msgstr "" "REPL signifie read (lire), evaluate (évaluer), print (afficher), loop " "(boucler). C'est une manière de dialoguer avec ton ordinateur! ;-)" #: mu/logic.py:78 msgid "Be brave, break things, learn and have fun!" msgstr "Soit courageux(se), ose casser des choses, apprend et amuse toi!" #: mu/logic.py:79 msgid "Make your software both useful AND fun. Empower your users." msgstr "Rend ton programme à la fois utile et amusant." #: mu/logic.py:80 msgid "For the Zen of Python: import this" msgstr "Pour rester zen avec Python: importe ça" #: mu/logic.py:81 msgid "Diversity promotes creativity." msgstr "La diversité favorise la créativité." #: mu/logic.py:82 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "" "Un esprit ouvert, le goût de l'aventure et le respect des autres sont la clé." #: mu/logic.py:83 msgid "" "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "" "Ne t'inquiète pas si ça ne fonctionne pas. Apprend la leçon, corrige ton " "programme et ré-essaie! :-)" #: mu/logic.py:85 msgid "Coding is collaboration." msgstr "Programmer, c'est collaborer." #: mu/logic.py:86 msgid "Compliment and amplify the good things with code." msgstr "Complimente et amplifie les bonnes choses avec du code." #: mu/logic.py:87 msgid "" "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "" "En théorie, la théorie et la pratique c'est la même chose. En pratique, " "c'est différent. ;-)" #: mu/logic.py:89 msgid "Debugging is twice as hard as writing the code in the first place." msgstr "" "Déboguer un programme est deux fois plus difficile que d'écrire un premier " "programme." #: mu/logic.py:90 msgid "It's fun to program." msgstr "C'est amusant de programmer." #: mu/logic.py:91 msgid "Programming has more to do with problem solving than writing code." msgstr "" "La programmation se rapproche plus de la résolution d'un problème que de " "l'écriture d'un programme." #: mu/logic.py:92 msgid "Start with your users' needs." msgstr "Commence par répondre au besoins des tes utilisateurs." #: mu/logic.py:93 msgid "Try to see things from your users' point of view." msgstr "Essaye de voir les choses avec le point de vue de tes utilisateurs." #: mu/logic.py:94 msgid "Put yourself in your users' shoes." msgstr "Met toi dans la peau de tes utilisateurs." #: mu/logic.py:95 msgid "" "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "" "Quand on programme, expliquer à un ami le problème que l'on rencontre, " "permet souvent de trouver la solution. ;-)" #: mu/logic.py:97 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "Si tu ne sais pas, demande. Si personne ne te répond, cherche!" #: mu/logic.py:98 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "La complexité est ton ennemie. Reste aussi simple que possible." #: mu/logic.py:99 msgid "Beautiful is better than ugly." msgstr "Beau est mieux que laid." #: mu/logic.py:100 msgid "Explicit is better than implicit." msgstr "Explicite est mieux que implicite." #: mu/logic.py:101 msgid "Simple is better than complex. Complex is better than complicated." msgstr "Simple est mieux que complexe. Complexe est mieux que compliqué." #: mu/logic.py:102 msgid "Flat is better than nested." msgstr "Plat est mieux qu'imbriqué." #: mu/logic.py:103 msgid "Sparse is better than dense." msgstr "Clairsemé est mieux que bondé." #: mu/logic.py:104 msgid "Readability counts." msgstr "La lisibilité est importante." #: mu/logic.py:105 msgid "" "Special cases aren't special enough to break the rules. Although " "practicality beats purity." msgstr "" "Les cas spécifiques ne sont pas assez spéciaux pour qu'ils ne respectent pas " "les règles. Néanmoins, l'aspect pratique l'emporte sur la pureté." #: mu/logic.py:107 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "" "Les erreurs ne doivent pas être passées sous silence. Sauf si on le fait de " "manière explicite." #: mu/logic.py:108 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "Face à l’ambiguïté, ne te laisse pas aller à deviner." #: mu/logic.py:109 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "Il ne devrait y avoir qu'une (et une seule) façon évidente de faire." #: mu/logic.py:110 msgid "" "Now is better than never. Although never is often better than *right* now." msgstr "" "Maintenant vaut mieux que jamais. Mais jamais vaut souvent mieux que tout de " "suite." #: mu/logic.py:112 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "" "Si l'implémentation est difficile à expliquer, c'est qu'elle est mauvaise." #: mu/logic.py:113 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "" "Si l'implémentation est facile à expliquer, c'est probablement une bonne " "implémentation." #: mu/logic.py:114 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "" "Les espaces de nommages sont une super bonne idée. Utilisons les davantage!" #: mu/logic.py:115 msgid "Mu was created by Nicholas H.Tollervey." msgstr "Mu a été créé par Nicholas H. Tollervey" #: mu/logic.py:116 msgid "To understand what recursion is, you must first understand recursion." msgstr "" "Pour comprendre ce qu'est la récursivité. Tu dois d'abord comprend ce qu'est " "la récursivité." #: mu/logic.py:117 msgid "" "Algorithm: a word used by programmers when they don't want to explain what " "they did." msgstr "" "Algorithme: un mot utilisé par les programmeurs quand ils ne veulent pas " "expliquer ce qu'ils ont fait." #: mu/logic.py:119 msgid "Programmers count from zero." msgstr "Les programmeurs comptent en commençant par zéro." #: mu/logic.py:120 msgid "Simplicity is the ultimate sophistication." msgstr "La simplicité est la sophistication ultime." #: mu/logic.py:121 msgid "A good programmer is humble." msgstr "Un bon programmeur est humble." #: mu/logic.py:122 msgid "A good programmer is playful." msgstr "Un bon programmeur est joueur." #: mu/logic.py:123 msgid "A good programmer learns to learn." msgstr "Un bon programmeur apprend à apprendre." #: mu/logic.py:124 msgid "A good programmer thinks beyond the obvious." msgstr "Un bon programmeur réfléchit au delà de ce qui est évident." #: mu/logic.py:125 msgid "A good programmer promotes simplicity." msgstr "Un bon programmeur promeut la simplicité." #: mu/logic.py:126 msgid "A good programmer avoids complexity." msgstr "Un bon programmeur évite la complexité." #: mu/logic.py:127 msgid "A good programmer is patient." msgstr "Un bon programmeur est patient." #: mu/logic.py:128 msgid "A good programmer asks questions." msgstr "Un bon programmeur pose des questions." #: mu/logic.py:129 msgid "A good programmer is willing to say, 'I don't know'." msgstr "Un bon programmeur accepte de dire 'je ne sais pas'." #: mu/logic.py:130 msgid "Wisest are they that know they know nothing." msgstr "Les plus sages savent qu'ils ne savent rien." #: mu/logic.py:442 msgid " above this line" msgstr "au dessus de cette ligne" #: mu/logic.py:487 msgid "" "Syntax error. Python cannot understand this line. Check for missing " "characters!" msgstr "" "Erreur de syntaxe. Python ne comprend pas cette ligne. Vérifie qu'il ne " "manque pas de caractères!" #: mu/logic.py:677 msgid "# Write your code here :-)" msgstr "# Ecrit ton programme ici ;-)" #: mu/logic.py:731 msgid "The file \"{}\" is already open." msgstr "Le fichier \"{}\" est déjà ouvert." #: mu/logic.py:743 msgid "Mu cannot read the characters in {}" msgstr "Mu ne peut pas lire les caractères dans {}" #: mu/logic.py:766 msgid "Mu was not able to open this file" msgstr "Mu ne peut pas ouvrir ce fichier" #: mu/logic.py:767 msgid "" "Currently Mu only works with Python source files or hex files created with " "embedded MicroPython code." msgstr "" "Actuellement Mu fonctionne seulement avec des scripts Python ou des fichiers " "hex créés avec le MicroPython embarqué." #: mu/logic.py:773 msgid "Could not load {}" msgstr "Impossible de charger{}" #: mu/logic.py:775 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "Le fichier existe-t-il?\n" "S'il existe, as-tu les droits pour le lire?\n" "\n" "Merci de vérifier et de ré-essayer." #: mu/logic.py:781 msgid "Is this a {} file?" msgstr "{} est un fichier?" #: mu/logic.py:782 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "Ca ressemble a un fichier {}.\n" "\n" "Veux-tu changer le mode de Mu en {}?" #: mu/logic.py:854 msgid "Could not save file (disk problem)" msgstr "Impossible d'enregistrer le fichier (problème de disque)" #: mu/logic.py:855 msgid "" "Error saving file to disk. Ensure you have permission to write the file and " "sufficient disk space." msgstr "" "Impossible d'enregistrer le fichier. Vérifie que tu as les droits d'écrire " "sur le disque et qu'il y a assez d'espace disque." #: mu/logic.py:859 msgid "Could not save file (encoding problem)" msgstr "Impossible d'enregistrer le fichier (problème d'encodage)" #: mu/logic.py:861 msgid "" "Unable to convert all the characters. If you have an encoding line at the " "top of the file, remove it and try again." msgstr "" "Impossible de convertir tous les caractères. S'il y a entête de fichier pour " "définir l'encodage, essaye de l'enlever et recommence. " #: mu/logic.py:870 msgid "Saved file: {}" msgstr "Fichier enregistré: {}" #: mu/logic.py:901 msgid "" "This name is already used by another part of Python. If you use this name, " "things are likely to break. Please try again with a different filename." msgstr "" "Ce nom est déjà utilisé ailleurs dans Python. Si tu utilises ce nom, il est " "probable que ça ne fonctionnera plus. Essaie avec un nom de fichier " "différent." #: mu/logic.py:976 msgid "Good job! No problems found." msgstr "Bon travail! Aucun problème trouvé." #: mu/logic.py:977 msgid "Hurrah! Checker turned up no problems." msgstr "Hourra! Le vérificateur n'a trouvé aucun problème." #: mu/logic.py:978 msgid "Nice one! Zero problems detected." msgstr "Bravo! Aucun problème détecté." #: mu/logic.py:979 msgid "Well done! No problems here." msgstr "Bien joué! Pas problème ici." #: mu/logic.py:980 msgid "Awesome! Zero problems found." msgstr "Fantastique! Aucun problème découvert." #: mu/logic.py:1007 msgid "" "There is un-saved work, exiting the application will cause you to lose it." msgstr "" "Tout ton travail n'a pas été enregistré. Si tu fermes l'application, il sera " "perdu." #: mu/logic.py:1060 msgid "Could not find MicroPython runtime." msgstr "Impossible de trouver l'exécutable MicroPython." #: mu/logic.py:1131 msgid "Changed to {} mode." msgstr "Basculé vers le mode {}" #: mu/logic.py:1176 msgid "Detected new {} device." msgstr "Nouveau périphérique {} détecté" #: mu/logic.py:1183 msgid "Would you like to change Mu to the {} mode?" msgstr "Veux-tu changer le mode de Mu en {}?" #: mu/logic.py:1218 msgid "Cannot Set Breakpoint." msgstr "Impossible de mettre un point d'arrêt." #: mu/logic.py:1219 msgid "" "Lines that are comments or some multi-line statements cannot have " "breakpoints." msgstr "" "Les lignes qui sont des commentaires ou instruction multi-lignes ne peuvent " "pas avoir de point d'arrêt." #: mu/logic.py:1239 msgid "" "This name is already used by another part of Python. If you use that name, " "things are likely to break. Please try again with a different filename." msgstr "" "Ce nom est déjà utilisé ailleurs dans Python. Si tu utilises ce nom, cela " "risque de ne pas fonctionner. Essaie avec un nom de fichier différent." #: mu/logic.py:1256 msgid "Could not rename file." msgstr "Impossible de renommer le fichier." #: mu/logic.py:1257 msgid "A file of that name is already open in Mu." msgstr "A fichier avec ce nom est déjà ouvert dans Mu." #: mu/logic.py:1286 msgid "Replaced \"{}\" with \"{}\"." msgstr "\"{}\" remplacé par \"{}\"." #: mu/logic.py:1290 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "{} occurrences de \"{}\" remplacées par \"{}\"." #: mu/logic.py:1295 mu/logic.py:1302 msgid "Could not find \"{}\"." msgstr "Impossible de trouver \"{}\"." #: mu/logic.py:1300 msgid "Highlighting matches for \"{}\"." msgstr "Occurences de \"{}\" surlignées." #: mu/logic.py:1305 msgid "You must provide something to find." msgstr "Tu dois fournir quelque chose à chercher." #: mu/logic.py:1306 msgid "Please try again, this time with something in the find box." msgstr "" "Essaie à nouveau, cette fois avec quelque chose dans la boîte de recherche." #: mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "Adafruit CircuitPython" #: mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "Utilise CircuitPython avec la gamme de cartes Adafruit." #: mu/modes/adafruit.py:64 msgid "Serial" msgstr "Série" #: mu/modes/adafruit.py:65 msgid "Open a serial connection to your device." msgstr "Ouvre une connexion série sur ton périphérique." #: mu/modes/adafruit.py:72 mu/modes/microbit.py:213 mu/modes/python3.py:136 msgid "Plotter" msgstr "Graphique" #: mu/modes/adafruit.py:73 mu/modes/microbit.py:214 msgid "Plot incoming REPL data." msgstr "Déssine graphique avec les données du REPL." #: mu/modes/adafruit.py:143 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "Impossible de trouvé un périphérique Adafruit CircuitPython." #: mu/modes/adafruit.py:145 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. " "Therefore, to edit these files you need to have the device plugged in. Until " "you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Le fichiers Python pour les périphériques Adafruit CircuitPython sont " "stockés directement sur le périphérique.\n" "Ainsi, pour pouvoir les modifier il faut avoir un périphérique connecté. En " "attendant qu'un périphérique soit connecté, Mu utilisera le dossier:\n" "\n" "{}\n" "\n" "... pour ton stocker ton programme." #: mu/modes/base.py:169 msgid "Data Flood Detected!" msgstr "Inondation des données détectée!" #: mu/modes/base.py:170 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. " "As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent " "to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls " "to 'sleep' for a very short period of time." msgstr "" "Le grapheur est inondé par les donnée ce qui rend Mu peu réactif voir " "bloqué. Par sécurité, le grapheur a été interrompu.\n" "\n" "L'inondation se produit lorsque de bloc de données de plus de 1024 octets " "sont envoyés en boucle au grapheur.\n" "\n" "Pour corriger ceci, assure toi que ton programme affiche des petits tuples " "de données entre les appels à 'sleep' pour une courte période de temps." #: mu/modes/base.py:262 mu/modes/base.py:301 msgid "" "Click on the device's reset button, wait a few seconds and then try again." msgstr "" "Appuie sur le bouton 'reset' du périphérique, attend quelques secondes et " "essaie à nouveau." #: mu/modes/base.py:268 mu/modes/base.py:307 msgid "Could not find an attached device." msgstr "Impossible de trouver un périphérique connecté." #: mu/modes/base.py:269 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Merci de vérifier que le périphérique est connecté à l'ordinateur.\n" "\n" "Le périphérique doit avoir MicroPython (ou CircuitPython) flashé dessus pour " "que le REPL fonctionne.\n" "\n" "Enfin, appuie sur le bouton 'reset' du périphérique et attend quelques " "secondes avant de ré-essayer." #: mu/modes/base.py:308 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Merci de vérifier que le périphérique est connecté à l'ordinateur.\n" "\n" "Le périphérique doit avoir MicroPython (ou CircuitPython) flashé dessus pour " "que le grapheur fonctionne.\n" "\n" "Enfin, appuie sur le bouton 'reset' du périphérique et attend quelques " "secondes avant de ré-essayer." #: mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "Débogueur graphique" #: mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "Débogue ton programme Python 3." #: mu/modes/debugger.py:50 mu/modes/pygamezero.py:109 mu/modes/python3.py:166 msgid "Stop" msgstr "Arrêter" #: mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "Arrête le programme en cours d'exécution." #: mu/modes/debugger.py:57 msgid "Continue" msgstr "Continuer" #: mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "Continue à exécuter le programme." #: mu/modes/debugger.py:64 msgid "Step Over" msgstr "Sauter" #: mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "Saute une ligne de code." #: mu/modes/debugger.py:71 msgid "Step In" msgstr "Entrer" #: mu/modes/debugger.py:72 msgid "Step into a function." msgstr "Entre dans une fonction." #: mu/modes/debugger.py:78 msgid "Step Out" msgstr "Sortir" #: mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "Sort d'une fonction." #: mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "Ton programme a fini de s'exécuter." #: mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "Impossible de se connecter au déboguer Python.\n" #: mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "Info débogueur: {}" #: mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "Alerte débogueur: {}" #: mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "Erreur débogueur: {}" #: mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "BBC micro:bit" #: mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "Ecrit un programme MicroPython pour la micro:bit" #: mu/modes/microbit.py:190 msgid "Flash" msgstr "Flasher" #: mu/modes/microbit.py:191 msgid "Flash your code onto the micro:bit." msgstr "Flashe ton programme sur la micro:bit" #: mu/modes/microbit.py:197 msgid "Files" msgstr "Fichiers" #: mu/modes/microbit.py:198 msgid "Access the file system on the micro:bit." msgstr "Accéder au système de fichiers de la micro:bit" #: mu/modes/microbit.py:204 mu/modes/python3.py:127 msgid "REPL" msgstr "REPL" #: mu/modes/microbit.py:205 msgid "Use the REPL to live-code on the micro:bit." msgstr "Utilise le REPL pour programmer directement sur la micro:bit" #: mu/modes/microbit.py:255 msgid "Unable to flash \"{}\"" msgstr "Impossible de flasher \"{}\"" #: mu/modes/microbit.py:265 msgid "Problem with script" msgstr "Problème avec le script" #: mu/modes/microbit.py:266 msgid "{} [{}:{}]" msgstr "{} [{}:{}]" #: mu/modes/microbit.py:276 msgid "Our minifier tried but your script is too long!" msgstr "On a essayé de le compresser mais ton programme est trop long!" #: mu/modes/microbit.py:281 msgid "Your script is too long and the minifier isn't available" msgstr "Ton programme est trop long et le compresseur n'est pas disponible." #: mu/modes/microbit.py:286 msgid "Your script is too long!" msgstr "Ton programme est trop long!" #: mu/modes/microbit.py:357 msgid "Flashing \"{}\" onto the micro:bit." msgstr "En train de flasher \"{}\" sur la micro:bit" #: mu/modes/microbit.py:359 msgid " Runtime: {}" msgstr "Exécution: {}" #: mu/modes/microbit.py:419 mu/modes/microbit.py:553 msgid "Could not find an attached BBC micro:bit." msgstr "Impossible de trouver une micro:bit connectée" #: mu/modes/microbit.py:420 msgid "" "Please ensure you leave enough time for the BBC micro:bit to be attached and " "configured correctly by your computer. This may take several seconds. " "Alternatively, try removing and re-attaching the device or saving your work " "and restarting Mu if the device remains unfound." msgstr "" "Merci de laisser suffisamment de temps à la micro:bit connectée à ton " "ordinateur. Ceci peut prendre plusieurs secondes. Si le périphérique " "n'apparaît toujours pas, essaye de débrancher/rebrancher le périphérique ou " "d'enregistrer ton travail et redémarrer Mu." #: mu/modes/microbit.py:434 msgid "Finished flashing." msgstr "Flashage terminé." #: mu/modes/microbit.py:476 msgid "There was a problem flashing the micro:bit." msgstr "Un problème est survenu pendant le flashage de la micro:bit." #: mu/modes/microbit.py:477 msgid "" "Please do not disconnect the device until flashing has completed. Please " "check the logs for more information." msgstr "" "Ne pas déconnecter le périphériques tant que le flashage n'est pas terminé. " "Regarde les logs pour plus d'informations." #: mu/modes/microbit.py:498 msgid "REPL and file system cannot work at the same time." msgstr "" "Le REPL et le système de fichiers ne peuvent pas fonctionner en même temps." #: mu/modes/microbit.py:499 msgid "" "The REPL and file system both use the same USB serial connection. Only one " "can be active at any time. Toggle the file system off and try again." msgstr "" "Le REPL et le système de fichiers utilisent tous les deux la même connexion " "USB série. Un seul des deux peut être actif à la fois. Désactive le système " "de fichier et ré-essaie." #: mu/modes/microbit.py:516 msgid "The plotter and file system cannot work at the same time." msgstr "" "Le grapheur et le systèle de fichiers ne peuvent pas fonctionner en même " "temps." #: mu/modes/microbit.py:518 msgid "" "The plotter and file system both use the same USB serial connection. Only " "one can be active at any time. Toggle the file system off and try again." msgstr "" "Le grapheur et le système de fichiers utilisent la même connexion USB série. " "Un seul des deux peut être active à la fois. Désactive le système de " "fichiers et essaie à nouveau." #: mu/modes/microbit.py:530 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "" "Le système de fichier ne peut pas fonctionner en même temps que le REPL ou " "le grapheur." #: mu/modes/microbit.py:532 msgid "" "The file system and the REPL and plotter use the same USB serial connection. " "Toggle the REPL and plotter off and try again." msgstr "" "Le système de fichiers, le REPL et le grapheur utilisent la même connexion " "USB série. Désactive le REPL et le grapheur et essaie à nouveau." #: mu/modes/microbit.py:554 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will " "work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Merci de vérifier que le périphérique est connecté à l'ordinateur.\n" "\n" "Le périphérique doit avoir MicroPython flashé dessus pour que le système de " "fichier fonctionne.\n" "\n" "Enfin, appuie sur le bouton 'reset' du périphérique et attend quelques " "secondes avant de ré-essayer." #: mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "Pygame Zero" #: mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "Crée des jeux avec Pygame Zero." #: mu/modes/pygamezero.py:51 mu/modes/pygamezero.py:101 msgid "Play" msgstr "Jouer" #: mu/modes/pygamezero.py:52 mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "Joue à ton jeu Pygame Zero." #: mu/modes/pygamezero.py:58 msgid "Images" msgstr "Images" #: mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "Montre les images utilisées par Pygame Zero." #: mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "Polices" #: mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "Montre les polices utilisées par Pygame Zero." #: mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "Sons" #: mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "Montre les sons utilisés par Pygame Zero." #: mu/modes/pygamezero.py:79 msgid "Music" msgstr "Musiques" #: mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "Montre les musiques utilisées par Pygame Zero." #: mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "Arrête ton jeu Pygame Zero." #: mu/modes/python3.py:97 msgid "Python 3" msgstr "Python 3" #: mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "Crée un programme en utilisant Python 3 standard." #: mu/modes/python3.py:113 mu/modes/python3.py:158 msgid "Run" msgstr "Lancer" #: mu/modes/python3.py:114 mu/modes/python3.py:159 msgid "Run your Python script." msgstr "Lance ton script Python." #: mu/modes/python3.py:120 msgid "Debug" msgstr "Déboguer" #: mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "Débogue ton script Python." #: mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "Utilise le REPL pour programmer en direct." #: mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "Graphe les données depuis ton script ou le REPL." #: mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "Arrête ton script Python." #: mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "Démarrage du REPL iPython." #: mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "Arrêt du REPL iPython (ceci peut prendre un peu de temps)." #: mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL démarré." #: mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL arrêté." #~ msgid "Please do not disconnect the device until flashing has completed." #~ msgstr "" #~ "Merci de ne pas déconnecté le périphérique tant que le flashage n'est pas " #~ "terminé." mu-editor-1.0.2+dfsg/mu/locale/ja/000077500000000000000000000000001341747546300166265ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/ja/LC_MESSAGES/000077500000000000000000000000001341747546300204135ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/ja/LC_MESSAGES/mu.mo000066400000000000000000001032351341747546300213750ustar00rootroot00000000000000Kl &)#9*O!z$4"O&r,(TDD+ # DKcJ27K1j #)Mi#9)"!XD"&$, Qe]"52GzB "aAKb>RL! " @7 x ~       # !!;!W!"]!-!!?! ""#"&B"@i":"7"#9$#J^##R#$N$$s$x$ $$;$#$%%#0%'T%!|%%%%@% &!&J0&{&(& & &/&d&V'['mw''()*J+;,'P,x,,,,B,` -"n--....2.Y. C/ Q/_/s/ //&/// //0!0 00<0 C0#d0$0#0$0B0*91d1k1[1122!2 *242J2b2|2222=2= 3OI33)444{5Ly669Y7O78J8E49jz9b9+H:at::5;h;6<<E\=1=1=+>s2>>>/>?+$?P?V?Ks?,?+?(@ A@#b@@! A8+AdA"}A$AAAA A(AC'C'8C6`C<CCC@ D0JD6{D0D0D6EQKE6E<EKF:]FnFHG=PGG?G'G3 H4?H*tHH%"I HI0UIcI9If$JBJJzK4K1KK)L6/LDfL5L6L|M+M3MGMS=N:N1NNO*O OO-O1'PYPsPbPPQQVQ%uQ1Q'QQgRSfST0T!T<TW,U U"UU%UUV V+V,2V"_V$V V*V:VCWR^WW W0WF XfRX]X]Y uYZY^Y%K60P#,KPB1߂1rGN+ *5'`003ƅ$**Ju|&sP2})Xxu= 0.Den*M 9G;biC3~{o:'km E(%<U,817[@Qp#RfIv|4Z+Wr6tNg?d" $\!`/O yc_5HlK]LFBz hSwYA-^jqV>aJT Runtime: {} above this line# Write your code here :-)'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Algorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.Awesome! Zero problems found.BBC micro:bit SettingsBe brave, break things, learn and have fun!Beautiful is better than ugly.Cannot Set Breakpoint.Cannot connect to device on port {}Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copied code onto micro:bit.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Debugging is twice as hard as writing the code in the first place.Delete (cannot be undone)Deleting '{}' from micro:bit.Detected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.File already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFor the Zen of Python: import thisGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)Is this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.Lines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.Minify Python code before flashing?ModeMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.Now is better than never. Although never is often better than *right* now.OpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):PlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.Replace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaveSave the current Python script.Saved file: {}Select ModeSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.Syntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way. If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The micro:bit runtime you specified ('{}') does not exist. Please try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.To understand what recursion is, you must first understand recursion.Toggle theme between day, night or high contrast.Try to see things from your users' point of view.Unable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unsupported BBC micro:bit.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You cannot use the filename "{}"You must provide something to find.Your device is newer than this version of Mu. Please update Mu to the latest version to support this device. https://codewith.mu/Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-outuntitled{} PlotterProject-Id-Version: PACKAGE VERSION POT-Creation-Date: 2018-07-13 04:45+JST PO-Revision-Date: 2018-07-13 05:42+JST Last-Translator: Minoru Inachi Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 Language: ja ランタイム: {} この行の上# ここにコードを書いてね :-)'{}' micro:bit へのコピーが成功しました。'{}' micro:bit から '{}' の削除が成功しました。(項目 {} の辞書。)(項目 {} のリスト。)この名前のファイルは Mu で既に開いています。優れたプログラマーは問いかける。優れたプログラマーは複雑さを避ける。優れたプログラマーは謙虚である。優れたプログラマーは病気である。優れたプログラマーには遊び心がある。優れたプログラマーは「わからない」と言っても構わない。優れたプログラマーは学ぶことを学ぶ。優れたプログラマーは単純さを推し進める。優れたプログラマーは当たり前の一つ上を考えている。micro:bit にあるファイルにアクセスします。アルゴリズム: プログラマーが何をしているかを説明したくないときに使う言葉。開かれた心、冒険の精神、多様性の尊重が重要です。驚ろきました! 問題は何も見つかりません。BBC micro:bit 設定勇気を出そう、前に進もう、学び、楽しもう!醜いより美しいほうがいい。ブレイクポイントを設定できません。ポート {} でデバイスに接続できませんMu の動作モードを変更します。Mu のロゴのついた "モード" ボタンをクリックすることにより、いつでもモードを変更できます。モードを {} に変更します。チェックコードの間違いをチェックします。デバイスのリセットボタンを押して数秒待った後に再度試してください。コーディングはコラボレーションである。複雑さは敵である。KISS - keep it simple, stupid! (単純にしておけ、この間抜け!)コードのよいところに感謝し、それを広めよう。接続がタイムアウトしました。マシンが遅いかビジーになっているようです。マシンのリソースを解放して再度試しください。継続Python スクリプトの実行を継続します。micro:bit にコードをコピーしました。micro:bit にコピー中。"{}" が見つかりませんでした。MicroPython ランタイムが見つかりません。CircuitPython デバイスが繋げられていないようです。BBC micro:bit が繋げられていないようですデバイスが繋げられていないようです。localhostが見つかりません。/etc/hosts ファイルに '127.0.0.1 localhost' があるか確認してください。ファイル {} を読み込めません。ファイル名を変更できませんでした。ファイルを保存できませんでした(ディスクの問題)。ファイルを保存できませんでした(エンコーディングの問題)。新しい MicroPython スクリプトを作成します。標準 Python 3 のコードを作成します。現在のログ現在のところ Mu は Python ソースファイルまたは MicroPython コードが埋め込まれた hex ファイルだけを扱えます。データの氾濫を検出しました!デバッグデバッグインスペクタPython 3 コードをデバッグします。Python スクリプトをデバッグします。デバッガエラー: {}デバッガ情報: {}デバッガは実行のために Python スクリプトのファイル名を必要とします。デバッガ警告: {}デバッグ作業は、最初にコードを書くときよりも倍難しい。削除 (元に戻せません)micro:bit から '{}' を削除中。新規の {} デバイスを検出しました。多様性は創造性を促進する。このファイルは存在しますか? 存在していても読込み権限があるでしょうか? 以上を確認して、再度試してみてください。動作しなくても心配するな。その失敗から学び、修正してやり直すのだ! :-)ディスクへのファイルの保存でエラーになりました。ファイルの書込み権とディスクの空きが十分にあるかを確認してください。エラーは隠すな、無視するな。ただし、わざと隠されているのなら見逃せ。友人にプログラムの問題の問題を説明することで、解決策が明らかになることはよくある。 :-)暗示するより明示するほうがいい。ファイルが既にありますファイルが既にあります。上書きしますか?ファイルシステムは REPL やプロッターと同時に利用できません。ファイルコンピュータのファイル:micro:bit のファイル:micro:bit のファイルシステム検索 / 置換検索転送を完了しました。転送コードを micro:bit に転送します。micro:bit に "{}" を転送中。ネストは浅いほうがいい。フォントZen of Python を見る方法: import thismicro:bit から '{}' を取得中。{} にコピー中。よくできました! 問題は見つかりませんでした。Google, Facebook, NASA, Pixar, Disney など多くが Python を使っている。グラフィカルデバッガヘルプ検索した "{}" を強調表示しました。バンザイ! チェッカは問題を検出しませんでした。コードの内容を容易に説明できるのなら、おそらくそれはよい実装である。コードの内容を説明するのが難しいのなら、それは悪い実装である。分からないことがあるなら質問してください。質問はありませんか?イメージ曖昧なものに出逢ったら、その意味を適当に推測してはいけない。理論的には理論と実践は同じであるが、実践的にはそうではない。 ;-)これは {} ファイルですか?これは {} ファイルのようです。 Mu を {} モードに変更しますか?プログラミングは楽しい。コメント行や複数行のステートメントの一部はブレイクポイントに設定できません。開くPython スクリプトを読み込みます。ログ出力先: {}Pygame Zero でゲームを作成します。ソフトウェアを便利で楽しいものにしよう。それがユーザの助けになるのです。転送の前に Python コードを縮小しますか?モードMu 管理Mu は {} の文字を読み込めませんでした。Mu は Nicholas H.Tollervey が作成しました。Mu はこのファイルを開けませんでしたMu の現在の動作モード。音楽名前名前空間は優れたアイデアであるため、積極的に利用すべきである。新規良いですね! 問題の検出はゼロです。ずっとやらないでいるよりは、今やれ。でも、今"すぐ"にやるよりはやらないほうがマシなことが多い。開くデバイスへのシリアル接続を開きます。Mu で開く開き中 '{}'縮小しようとしましたが、スクリプトが長すぎます!組込みの MicroPython ランタイムを以下の hex ファイルで上書きする(空であればデフォルトのものを利用):プレイPygame Zero ゲームをプレイします。転送が完了するまでデバイスを取り外さないでください。詳しくは Mu のログを確認してください。BBC micro:bit を正しく繋げている場合でも、コンピュータがそれを認識するのに十分な時間をおいてください。これには数秒かかることがあります。それでもデバイスが認識されない場合は、デバイス一度取り外して再度繋げるか、スクリプトを保存して Mu を再起動してみてください。デバイスがこのコンピュータに繋げられているかを確認してください。 プロッターが動作するには、MicroPython (または CircuitPython)がデバイスに転送されている必要があります。 最後に、デバイスのリセットボタンを押してから、もう一度試してください。デバイスがこのコンピュータに繋げられているかを確認してください。 REPL が動作するには、MicroPython (または CircuitPython)がデバイスに転送されている必要があります。 最後に、デバイスのリセットボタンを押してから、もう一度試してください。デバイスがこのコンピュータに繋げられているかを確認してください。 ファイルシステムが動作するには、MicroPython がデバイスに転送されている必要があります。 最後に、デバイスのリセットボタンを押してから、再度試してください。使うモードを選択して "OK" をクリックしてください。モードを変更しない場合は "CANCEL" をクリックしてください。今度は検索ボックスに何かを入れて、もう一度お試しください。スクリプトまたは REPL からのデータをプロットします。REPL 入力のデータをプロットします。プロッタースクリプトに問題がありますプログラマーはゼロから数える。プログラミングとは、コードを書くだけにあらず、問題解決するということである。プログラミングは魔法の一種。正しいスペルをコードで書く方法を学ぶと魔法使いになれる。ユーザの立場で考えてください。Adafruit CircuitPython デバイスの Python ファイルはデバイス内に保存するので、デバイスが接続されている必要があります。デバイスを接続するまで、Mu はコードを保存するために次のディレクトリを使います: {}Python3 環境Python3 データタプル終了Mu を終了します。REPL とファイルシステムは同時に利用できません。REPLは、read (読む)、evaluate (評価)、print (印字)、loop (ループ)の略。 それはあなたのコンピュータと話す楽しい手段です! :-)REPL が始動しました。REPL が停止しました。読みやすいことは善である。置換(オプション)すべて置換しますか?"{}" を "{}" で置換する。{} 個の "{}" を "{}" で置換しました。実行Python スクリプトを実行します。実行中: {}保存現在の Python スクリプトを保存します。保存したファイル: {}モードの選択シリアルMu のヘルプをWebブラウザで表示します。Pygame Zero で使うフォントを表示します。Pygame で使うイメージを表示します。Pygame Zero で使う音楽を表示します。Pygame Zero で使う効果音を表示します。複雑であるよりは平易であるほうがいい。それでも、込み入っているよりは複雑であるほうがまし。単純であることは究極の洗練である。 効果音密集しているよりは隙間があるほうがいい。特殊であることはルールを破る理由にならない。しかし、実用性を求めると自然さが失われることがある。ユーザのニーズから始めなさい。iPython REPL を始動します。ステップインステップアウトステップオーバー関数にステップインします。関数からステップアウトします。コードの1行をステップオーバーします。停止コードの実行を停止します。Pygame Zero ゲームを停止します。Python スクリプトを停止します。iPython REPL を停止(少し時間がかかります)。micro:bit からコンピュータへの '{}' のコピーが成功しました。文法エラー。Python はこの行を理解できません。間違った綴りがないか調べてください!REPL とファイルシステムはどちらも USB シリアル接続を利用しますが、有効にできるのは常にどちらか一方です。ファイルシステムの利用を止めて、もう一度試してください。以下に示す環境変数は Python 3 スクリプトを実行する毎に設定されます。 個々の環境変数は次の形式で改行で区切って指定するようにしてください: 名前=値ファイル "{}" は既に開いています。Mu が前提としているファイルエンコーディングは {0} かコンピュータのデフォルトの {1} ですが、他の方法でエンコードされています。 このファイルが別のアプリケーションで保存されたのであれば、「別名で保存」オプションでエンコーディングを {0} を設定して再保存してください。ファイルシステムと REPL とプロッターは同じ USB シリアル接続を利用します。REPL とプロッターの利用を止めて、再度試してください。指定した micro:bit ランタイムは存在しません。もう一度やり直してください。プロッターとファイルシステムはどちらも USB シリアル接続を利用しますが、有効にできるのは常にどちらか一方です。ファイルシステムの利用を止めて、もう一度試してください。プロッターとファイルシステムは同時に利用できません。Mu が無反応でフリーズしてしまうぐらいのデータが溢れています。セーフガードとしてプロッタを停止させました。 溢れているとは、1024バイトを超えるデータセットがプロッターに繰り返し送信されている状態です。 これを解決するには、非常に短時間の 'sleep' 呼び出しの合間にデータの小さなタプルをプリントするようにしてください。テーマ保存していないスクリプトがありますが、アプリケーションを終了すると消えてしまいます。たったひとつの冴えたやりかたがあるはずだ。micro:bit にファイル '{}' をコピーしている際に問題が発生しました。詳しくは Mu のログを確認してください。micro:bit 内のファイル '{}' を削除している際にに問題が発生しました。詳しくは Mu のログを確認してください。micro:bit への転送で問題が発生しました。micro:bit 内のファイル '{}' を取得している際に問題が発生しました。詳しくは Mu のログを確認してください。micro:bit 内のファイルのリストを取得する際に問題が発生しました。技術的な情報は Mu のログを確認してください。または micro:bit のプラグを抜き差しするか、Muを再起動してみてください。このエディタの名前は Mu です('mew' とか 'moo' とか発音します)。このエディタは Python で作成したフリーソフトウェアです。あなたの好きなように変更、機能追加、バグ修正できます。この名前はすでに Python の別のところで使われています。この名前を使うと Python のシステムを壊してしまう可能性があります。別のファイル名でもう一度やり直してください。この名前はすでに Python の別のところで使われています。この名前を使うと Python のシステムを壊してしまう可能性があります。別のファイル名でもう一度やり直してください。再帰とは何かを理解するためには、まず再帰を理解する必要がある。日中、夜、ハイコントラストのテーマを切り替えます。ユーザの視点から物事を見てください。Python デバッガに接続できません。 すべての文字を変換できませんでした。ファイルの先頭にエンコーディング行がある場合は、それを削除してもう一度やり直してください。"{}" を転送できません未サポートの BBC micro:bit。Adafruit がサポートするボードの CircuitPython を使います。ライブコーディングのために REPL を利用します。micro:bit を対話モードで利用します。値よくやりました! 問題ありません。バグの報告の際には、以下のログファイルの内容をコピー&ペーストしてください。賢明であるとは、知らないことを知っていることである。Mu を {} モードに変更しますか?BBC micro:bit の MicroPython を編集。ファイル名 "{}" は使えません検索するものを指定してください。デバイスがこの Mu のバージョンで扱うには新しすぎます。このデバイスをサポートするために Mu を最新バージョンにアップデートしてください。 https://codewith.mu/スクリプトの実行を終了しました。スクリプトが長すぎて縮小できませんスクリプトが長すぎます!拡大(文字を大きく)します。縮小(文字を小さく)します。拡大縮小無題{} プロッターmu-editor-1.0.2+dfsg/mu/locale/ja/LC_MESSAGES/mu.po000066400000000000000000001214671341747546300214070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2018-07-13 04:45+JST\n" "PO-Revision-Date: 2018-07-13 05:42+JST\n" "Last-Translator: Minoru Inachi\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Language: ja\n" #: ./mu/app.py:66 msgid "Logging to {}" msgstr "ログ出力先: {}" #: ./mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "デバッガは実行のために Python スクリプトのファイル名を必要とします。" #: ./mu/debugger/client.py:106 msgid "Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again." msgstr "接続がタイムアウトしました。マシンが遅いかビジーになっているようです。マシンのリソースを解放して再度試しください。" #: ./mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "" "localhostが見つかりません。" "/etc/hosts ファイルに '127.0.0.1 localhost' があるか確認してください。" #: ./mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "モードの選択" #: ./mu/interface/dialogs.py:57 msgid "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel\"." msgstr "使うモードを選択して \"OK\" をクリックしてください。モードを変更しない場合は \"CANCEL\" をクリックしてください。" #: ./mu/interface/dialogs.py:73 msgid "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "Mu のロゴのついた \"モード\" ボタンをクリックすることにより、いつでもモードを変更できます。" #: ./mu/interface/dialogs.py:107 msgid "When reporting a bug, copy and paste the content of the following log file." msgstr "バグの報告の際には、以下のログファイルの内容をコピー&ペーストしてください。" #: ./mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python 3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "以下に示す環境変数は Python 3 スクリプトを実行する毎に設定されます。\n" "\n" "個々の環境変数は次の形式で改行で区切って指定するようにしてください:\n" "名前=値" #: ./mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "転送の前に Python コードを縮小しますか?" #: ./mu/interface/dialogs.py:153 msgid "Override the built-in MicroPython runtime with the following hex file (empty means use the default):" msgstr "組込みの MicroPython ランタイムを以下の hex ファイルで上書きする(空であればデフォルトのものを利用):" #: ./mu/interface/dialogs.py:175 ./mu/interface/main.py:974 msgid "Mu Administration" msgstr "Mu 管理" #: ./mu/interface/dialogs.py:186 msgid "Current Log" msgstr "現在のログ" #: ./mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Python3 環境" #: ./mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "BBC micro:bit 設定" #: ./mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "検索 / 置換" #: ./mu/interface/dialogs.py:227 msgid "Find:" msgstr "検索" #: ./mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "置換(オプション)" #: ./mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "すべて置換しますか?" #: ./mu/interface/editor.py:222 ./mu/logic.py:960 msgid "untitled" msgstr "無題" #: ./mu/interface/main.py:68 msgid "Mode" msgstr "モード" #: ./mu/interface/main.py:69 msgid "Change Mu's mode of behaviour." msgstr "Mu の動作モードを変更します。" #: ./mu/interface/main.py:71 msgid "New" msgstr "新規" #: ./mu/interface/main.py:72 msgid "Create a new Python script." msgstr "新しい MicroPython スクリプトを作成します。" #: ./mu/interface/main.py:73 msgid "Load" msgstr "開く" #: ./mu/interface/main.py:74 msgid "Load a Python script." msgstr "Python スクリプトを読み込みます。" #: ./mu/interface/main.py:75 msgid "Save" msgstr "保存" #: ./mu/interface/main.py:76 msgid "Save the current Python script." msgstr "現在の Python スクリプトを保存します。" #: ./mu/interface/main.py:85 msgid "Zoom-in" msgstr "拡大" #: ./mu/interface/main.py:86 msgid "Zoom in (to make the text bigger)." msgstr "拡大(文字を大きく)します。" #: ./mu/interface/main.py:87 msgid "Zoom-out" msgstr "縮小" #: ./mu/interface/main.py:88 msgid "Zoom out (to make the text smaller)." msgstr "縮小(文字を小さく)します。" #: ./mu/interface/main.py:89 msgid "Theme" msgstr "テーマ" #: ./mu/interface/main.py:90 msgid "Toggle theme between day, night or high contrast." msgstr "日中、夜、ハイコントラストのテーマを切り替えます。" #: ./mu/interface/main.py:93 msgid "Check" msgstr "チェック" #: ./mu/interface/main.py:94 msgid "Check your code for mistakes." msgstr "コードの間違いをチェックします。" #: ./mu/interface/main.py:95 msgid "Help" msgstr "ヘルプ" #: ./mu/interface/main.py:96 msgid "Show help about Mu in a browser." msgstr "Mu のヘルプをWebブラウザで表示します。" #: ./mu/interface/main.py:97 msgid "Quit" msgstr "終了" #: ./mu/interface/main.py:98 msgid "Quit Mu." msgstr "Mu を終了します。" #: ./mu/interface/main.py:177 msgid "Mu {}" msgstr "" #: ./mu/interface/main.py:353 msgid "Cannot connect to device on port {}" msgstr "ポート {} でデバイスに接続できません" #: ./mu/interface/main.py:375 msgid "Filesystem on micro:bit" msgstr "micro:bit のファイルシステム" #: ./mu/interface/main.py:434 msgid "Python3 data tuple" msgstr "Python3 データタプル" #: ./mu/interface/main.py:446 msgid "Python3 (Jupyter)" msgstr "" #: ./mu/interface/main.py:453 msgid "{} REPL" msgstr "" #: ./mu/interface/main.py:469 msgid "{} Plotter" msgstr "{} プロッター" #: ./mu/interface/main.py:510 msgid "Running: {}" msgstr "実行中: {}" #: ./mu/interface/main.py:534 msgid "Debug Inspector" msgstr "デバッグインスペクタ" #: ./mu/interface/main.py:552 msgid "Name" msgstr "名前" #: ./mu/interface/main.py:552 msgid "Value" msgstr "値" #: ./mu/interface/main.py:569 msgid "(A list of {} items.)" msgstr "(項目 {} のリスト。)" #: ./mu/interface/main.py:581 msgid "(A dict of {} items.)" msgstr "(項目 {} の辞書。)" #: ./mu/interface/main.py:718 msgid "Mu" msgstr "" #: ./mu/interface/main.py:967 msgid "Mu's current mode of behaviour." msgstr "Mu の現在の動作モード。" #: ./mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "ファイルが既にあります。上書きしますか?" #: ./mu/interface/panes.py:297 msgid "File already exists" msgstr "ファイルが既にあります" #: ./mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "micro:bit にコピー中。" #: ./mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "'{}' micro:bit へのコピーが成功しました。" #: ./mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "削除 (元に戻せません)" #: ./mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "micro:bit から '{}' を削除中。" #: ./mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "'{}' micro:bit から '{}' の削除が成功しました。" #: ./mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "micro:bit から '{}' を取得中。{} にコピー中。" #: ./mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "micro:bit からコンピュータへの '{}' のコピーが成功しました。" #: ./mu/interface/panes.py:409 msgid "Open in Mu" msgstr "Mu で開く" #: ./mu/interface/panes.py:411 msgid "Open" msgstr "開く" #: ./mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "開き中 '{}'" #: ./mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "micro:bit のファイル:" #: ./mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "コンピュータのファイル:" #: ./mu/interface/panes.py:527 msgid "There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu." msgstr "" "micro:bit 内のファイルのリストを取得する際に問題が発生しました。" "技術的な情報は Mu のログを確認してください。または micro:bit の" "プラグを抜き差しするか、Muを再起動してみてください。" #: ./mu/interface/panes.py:538 msgid "There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information." msgstr "" "micro:bit にファイル '{}' をコピーしている際に問題が発生しました。" "詳しくは Mu のログを確認してください。" #: ./mu/interface/panes.py:546 msgid "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information." msgstr "" "micro:bit 内のファイル '{}' を削除している際にに問題が発生しました。" "詳しくは Mu のログを確認してください。" #: ./mu/interface/panes.py:554 msgid "There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information." msgstr "" "micro:bit 内のファイル '{}' を取得している際に問題が発生しました。" "詳しくは Mu のログを確認してください。" #: ./mu/logic.py:69 msgid "Hello, World!" msgstr "" #: ./mu/logic.py:70 msgid "This editor is free software written in Python. You can modify it, add features or fix bugs if you like." msgstr "このエディタは Python で作成したフリーソフトウェアです。あなたの好きなように変更、機能追加、バグ修正できます。" #: ./mu/logic.py:72 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "このエディタの名前は Mu です('mew' とか 'moo' とか発音します)。" #: ./mu/logic.py:73 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "Google, Facebook, NASA, Pixar, Disney など多くが Python を使っている。" #: ./mu/logic.py:74 msgid "Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard." msgstr "プログラミングは魔法の一種。正しいスペルをコードで書く方法を学ぶと魔法使いになれる。" #: ./mu/logic.py:76 msgid "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)" msgstr "REPLは、read (読む)、evaluate (評価)、print (印字)、loop (ループ)の略。 それはあなたのコンピュータと話す楽しい手段です! :-)" #: ./mu/logic.py:78 msgid "Be brave, break things, learn and have fun!" msgstr "勇気を出そう、前に進もう、学び、楽しもう!" #: ./mu/logic.py:79 msgid "Make your software both useful AND fun. Empower your users." msgstr "ソフトウェアを便利で楽しいものにしよう。それがユーザの助けになるのです。" #: ./mu/logic.py:80 msgid "For the Zen of Python: import this" msgstr "Zen of Python を見る方法: import this" #: ./mu/logic.py:81 msgid "Diversity promotes creativity." msgstr "多様性は創造性を促進する。" #: ./mu/logic.py:82 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "開かれた心、冒険の精神、多様性の尊重が重要です。" #: ./mu/logic.py:83 msgid "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "動作しなくても心配するな。その失敗から学び、修正してやり直すのだ! :-)" #: ./mu/logic.py:85 msgid "Coding is collaboration." msgstr "コーディングはコラボレーションである。" #: ./mu/logic.py:86 msgid "Compliment and amplify the good things with code." msgstr "コードのよいところに感謝し、それを広めよう。" #: ./mu/logic.py:87 msgid "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "理論的には理論と実践は同じであるが、実践的にはそうではない。 ;-)" #: ./mu/logic.py:89 msgid "Debugging is twice as hard as writing the code in the first place." msgstr "デバッグ作業は、最初にコードを書くときよりも倍難しい。" #: ./mu/logic.py:90 msgid "It's fun to program." msgstr "プログラミングは楽しい。" #: ./mu/logic.py:91 msgid "Programming has more to do with problem solving than writing code." msgstr "プログラミングとは、コードを書くだけにあらず、問題解決するということである。" #: ./mu/logic.py:92 msgid "Start with your users' needs." msgstr "ユーザのニーズから始めなさい。" #: ./mu/logic.py:93 msgid "Try to see things from your users' point of view." msgstr "ユーザの視点から物事を見てください。" #: ./mu/logic.py:94 msgid "Put yourself in your users' shoes." msgstr "ユーザの立場で考えてください。" #: ./mu/logic.py:95 msgid "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "友人にプログラムの問題の問題を説明することで、解決策が明らかになることはよくある。 :-)" #: ./mu/logic.py:97 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "分からないことがあるなら質問してください。質問はありませんか?" #: ./mu/logic.py:98 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "複雑さは敵である。KISS - keep it simple, stupid! (単純にしておけ、この間抜け!)" #: ./mu/logic.py:99 msgid "Beautiful is better than ugly." msgstr "醜いより美しいほうがいい。" #: ./mu/logic.py:100 msgid "Explicit is better than implicit." msgstr "暗示するより明示するほうがいい。" #: ./mu/logic.py:101 msgid "Simple is better than complex. Complex is better than complicated." msgstr "複雑であるよりは平易であるほうがいい。それでも、込み入っているよりは複雑であるほうがまし。" #: ./mu/logic.py:102 msgid "Flat is better than nested." msgstr "ネストは浅いほうがいい。" #: ./mu/logic.py:103 msgid "Sparse is better than dense." msgstr "密集しているよりは隙間があるほうがいい。" #: ./mu/logic.py:104 msgid "Readability counts." msgstr "読みやすいことは善である。" #: ./mu/logic.py:105 msgid "Special cases aren't special enough to break the rules. Although practicality beats purity." msgstr "特殊であることはルールを破る理由にならない。しかし、実用性を求めると自然さが失われることがある。" #: ./mu/logic.py:107 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "エラーは隠すな、無視するな。ただし、わざと隠されているのなら見逃せ。" #: ./mu/logic.py:108 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "曖昧なものに出逢ったら、その意味を適当に推測してはいけない。" #: ./mu/logic.py:109 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "たったひとつの冴えたやりかたがあるはずだ。" #: ./mu/logic.py:110 msgid "Now is better than never. Although never is often better than *right* now." msgstr "ずっとやらないでいるよりは、今やれ。でも、今\"すぐ\"にやるよりはやらないほうがマシなことが多い。" #: ./mu/logic.py:112 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "コードの内容を説明するのが難しいのなら、それは悪い実装である。" #: ./mu/logic.py:113 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "コードの内容を容易に説明できるのなら、おそらくそれはよい実装である。" #: ./mu/logic.py:114 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "名前空間は優れたアイデアであるため、積極的に利用すべきである。" #: ./mu/logic.py:115 msgid "Mu was created by Nicholas H.Tollervey." msgstr "Mu は Nicholas H.Tollervey が作成しました。" #: ./mu/logic.py:116 msgid "To understand what recursion is, you must first understand recursion." msgstr "再帰とは何かを理解するためには、まず再帰を理解する必要がある。" #: ./mu/logic.py:117 msgid "Algorithm: a word used by programmers when they don't want to explain what they did." msgstr "アルゴリズム: プログラマーが何をしているかを説明したくないときに使う言葉。" #: ./mu/logic.py:119 msgid "Programmers count from zero." msgstr "プログラマーはゼロから数える。" #: ./mu/logic.py:120 msgid "Simplicity is the ultimate sophistication." msgstr "単純であることは究極の洗練である。 " #: ./mu/logic.py:121 msgid "A good programmer is humble." msgstr "優れたプログラマーは謙虚である。" #: ./mu/logic.py:122 msgid "A good programmer is playful." msgstr "優れたプログラマーには遊び心がある。" #: ./mu/logic.py:123 msgid "A good programmer learns to learn." msgstr "優れたプログラマーは学ぶことを学ぶ。" #: ./mu/logic.py:124 msgid "A good programmer thinks beyond the obvious." msgstr "優れたプログラマーは当たり前の一つ上を考えている。" #: ./mu/logic.py:125 msgid "A good programmer promotes simplicity." msgstr "優れたプログラマーは単純さを推し進める。" #: ./mu/logic.py:126 msgid "A good programmer avoids complexity." msgstr "優れたプログラマーは複雑さを避ける。" #: ./mu/logic.py:127 msgid "A good programmer is patient." msgstr "優れたプログラマーは病気である。" #: ./mu/logic.py:128 msgid "A good programmer asks questions." msgstr "優れたプログラマーは問いかける。" #: ./mu/logic.py:129 msgid "A good programmer is willing to say, 'I don't know'." msgstr "優れたプログラマーは「わからない」と言っても構わない。" #: ./mu/logic.py:130 msgid "Wisest are they that know they know nothing." msgstr "賢明であるとは、知らないことを知っていることである。" #: ./mu/logic.py:442 msgid " above this line" msgstr " この行の上" #: ./mu/logic.py:487 msgid "Syntax error. Python cannot understand this line. Check for missing characters!" msgstr "文法エラー。Python はこの行を理解できません。間違った綴りがないか調べてください!" #: ./mu/logic.py:677 msgid "# Write your code here :-)" msgstr "# ここにコードを書いてね :-)" #: ./mu/logic.py:715 msgid "" "The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way.\n" "\n" "If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}" msgstr "" "Mu が前提としているファイルエンコーディングは {0} かコンピュータのデフォルトの {1} ですが、他の方法でエンコードされています。" "\n" "このファイルが別のアプリケーションで保存されたのであれば、「別名で保存」オプションでエンコーディングを {0} を設定して再保存してください。" #: ./mu/logic.py:731 msgid "The file \"{}\" is already open." msgstr "ファイル \"{}\" は既に開いています。" #: ./mu/logic.py:743 msgid "Mu cannot read the characters in {}" msgstr "Mu は {} の文字を読み込めませんでした。" #: ./mu/logic.py:766 msgid "Mu was not able to open this file" msgstr "Mu はこのファイルを開けませんでした" #: ./mu/logic.py:767 msgid "Currently Mu only works with Python source files or hex files created with embedded MicroPython code." msgstr "現在のところ Mu は Python ソースファイルまたは MicroPython コードが埋め込まれた hex ファイルだけを扱えます。" #: ./mu/logic.py:773 msgid "Could not load {}" msgstr "ファイル {} を読み込めません。" #: ./mu/logic.py:775 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "このファイルは存在しますか?\n" "存在していても読込み権限があるでしょうか?\n" "\n" "以上を確認して、再度試してみてください。" #: ./mu/logic.py:781 msgid "Is this a {} file?" msgstr "これは {} ファイルですか?" #: ./mu/logic.py:782 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "これは {} ファイルのようです。\n" "\n" "Mu を {} モードに変更しますか?" #: ./mu/logic.py:854 msgid "Could not save file (disk problem)" msgstr "ファイルを保存できませんでした(ディスクの問題)。" #: ./mu/logic.py:855 msgid "Error saving file to disk. Ensure you have permission to write the file and sufficient disk space." msgstr "ディスクへのファイルの保存でエラーになりました。ファイルの書込み権とディスクの空きが十分にあるかを確認してください。" #: ./mu/logic.py:859 msgid "Could not save file (encoding problem)" msgstr "ファイルを保存できませんでした(エンコーディングの問題)。" #: ./mu/logic.py:861 msgid "Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again." msgstr "すべての文字を変換できませんでした。ファイルの先頭にエンコーディング行がある場合は、それを削除してもう一度やり直してください。" #: ./mu/logic.py:870 msgid "Saved file: {}" msgstr "保存したファイル: {}" #: ./mu/logic.py:899 ./mu/logic.py:1237 msgid "You cannot use the filename \"{}\"" msgstr "ファイル名 \"{}\" は使えません" #: ./mu/logic.py:901 msgid "This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename." msgstr "この名前はすでに Python の別のところで使われています。この名前を使うと Python のシステムを壊してしまう可能性があります。別のファイル名でもう一度やり直してください。" #: ./mu/logic.py:976 msgid "Good job! No problems found." msgstr "よくできました! 問題は見つかりませんでした。" #: ./mu/logic.py:977 msgid "Hurrah! Checker turned up no problems." msgstr "バンザイ! チェッカは問題を検出しませんでした。" #: ./mu/logic.py:978 msgid "Nice one! Zero problems detected." msgstr "良いですね! 問題の検出はゼロです。" #: ./mu/logic.py:979 msgid "Well done! No problems here." msgstr "よくやりました! 問題ありません。" #: ./mu/logic.py:980 msgid "Awesome! Zero problems found." msgstr "驚ろきました! 問題は何も見つかりません。" #: ./mu/logic.py:1007 msgid "There is un-saved work, exiting the application will cause you to lose it." msgstr "保存していないスクリプトがありますが、アプリケーションを終了すると消えてしまいます。" #: ./mu/logic.py:1060 msgid "Could not find MicroPython runtime." msgstr "MicroPython ランタイムが見つかりません。" #: ./mu/logic.py:1061 msgid "The micro:bit runtime you specified ('{}') does not exist. Please try again." msgstr "指定した micro:bit ランタイムは存在しません。もう一度やり直してください。" #: ./mu/logic.py:1131 msgid "Changed to {} mode." msgstr "モードを {} に変更します。" #: ./mu/logic.py:1176 msgid "Detected new {} device." msgstr "新規の {} デバイスを検出しました。" #: ./mu/logic.py:1183 msgid "Would you like to change Mu to the {} mode?" msgstr "Mu を {} モードに変更しますか?" #: ./mu/logic.py:1218 msgid "Cannot Set Breakpoint." msgstr "ブレイクポイントを設定できません。" #: ./mu/logic.py:1219 msgid "Lines that are comments or some multi-line statements cannot have breakpoints." msgstr "コメント行や複数行のステートメントの一部はブレイクポイントに設定できません。" #: ./mu/logic.py:1239 msgid "This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename." msgstr "この名前はすでに Python の別のところで使われています。この名前を使うと Python のシステムを壊してしまう可能性があります。別のファイル名でもう一度やり直してください。" #: ./mu/logic.py:1256 msgid "Could not rename file." msgstr "ファイル名を変更できませんでした。" #: ./mu/logic.py:1257 msgid "A file of that name is already open in Mu." msgstr "この名前のファイルは Mu で既に開いています。" #: ./mu/logic.py:1286 msgid "Replaced \"{}\" with \"{}\"." msgstr "\"{}\" を \"{}\" で置換する。" #: ./mu/logic.py:1290 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "{} 個の \"{}\" を \"{}\" で置換しました。" #: ./mu/logic.py:1295 ./mu/logic.py:1302 msgid "Could not find \"{}\"." msgstr "\"{}\" が見つかりませんでした。" #: ./mu/logic.py:1300 msgid "Highlighting matches for \"{}\"." msgstr "検索した \"{}\" を強調表示しました。" #: ./mu/logic.py:1305 msgid "You must provide something to find." msgstr "検索するものを指定してください。" #: ./mu/logic.py:1306 msgid "Please try again, this time with something in the find box." msgstr "今度は検索ボックスに何かを入れて、もう一度お試しください。" #: ./mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "" #: ./mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "Adafruit がサポートするボードの CircuitPython を使います。" #: ./mu/modes/adafruit.py:64 msgid "Serial" msgstr "シリアル" #: ./mu/modes/adafruit.py:65 msgid "Open a serial connection to your device." msgstr "デバイスへのシリアル接続を開きます。" #: ./mu/modes/adafruit.py:72 ./mu/modes/microbit.py:215 #: ./mu/modes/python3.py:136 msgid "Plotter" msgstr "プロッター" #: ./mu/modes/adafruit.py:73 ./mu/modes/microbit.py:216 msgid "Plot incoming REPL data." msgstr "REPL 入力のデータをプロットします。" #: ./mu/modes/adafruit.py:143 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "CircuitPython デバイスが繋げられていないようです。" #: ./mu/modes/adafruit.py:145 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Adafruit CircuitPython デバイスの Python ファイルはデバイス内に保存するので、" "デバイスが接続されている必要があります。デバイスを接続するまで、Mu はコードを保存" "するために次のディレクトリを使います:\n" "\n" " {}" #: ./mu/modes/base.py:169 msgid "Data Flood Detected!" msgstr "データの氾濫を検出しました!" #: ./mu/modes/base.py:170 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time." msgstr "" "Mu が無反応でフリーズしてしまうぐらいのデータが溢れています。セーフガードとしてプロッタを停止させました。\n" "\n" "溢れているとは、1024バイトを超えるデータセットがプロッターに繰り返し送信されている状態です。\n" "\n" "これを解決するには、非常に短時間の 'sleep' 呼び出しの合間にデータの小さなタプルをプリントするようにしてください。" #: ./mu/modes/base.py:262 ./mu/modes/base.py:301 msgid "Click on the device's reset button, wait a few seconds and then try again." msgstr "デバイスのリセットボタンを押して数秒待った後に再度試してください。" #: ./mu/modes/base.py:268 ./mu/modes/base.py:307 msgid "Could not find an attached device." msgstr "デバイスが繋げられていないようです。" #: ./mu/modes/base.py:269 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "デバイスがこのコンピュータに繋げられているかを確認してください。\n" "\n" "REPL が動作するには、MicroPython (または CircuitPython)がデバイスに転送されている必要が" "あります。\n" "\n" "最後に、デバイスのリセットボタンを押してから、もう一度試して" "ください。" #: ./mu/modes/base.py:308 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "デバイスがこのコンピュータに繋げられているかを確認してください。\n" "\n" "プロッターが動作するには、MicroPython (または CircuitPython)がデバイスに転送されている必要が" "あります。\n" "\n" "最後に、デバイスのリセットボタンを押してから、もう一度試して" "ください。" #: ./mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "グラフィカルデバッガ" #: ./mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "Python 3 コードをデバッグします。" #: ./mu/modes/debugger.py:50 ./mu/modes/pygamezero.py:109 #: ./mu/modes/python3.py:166 msgid "Stop" msgstr "停止" #: ./mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "コードの実行を停止します。" #: ./mu/modes/debugger.py:57 msgid "Continue" msgstr "継続" #: ./mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "Python スクリプトの実行を継続します。" #: ./mu/modes/debugger.py:64 msgid "Step Over" msgstr "ステップオーバー" #: ./mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "コードの1行をステップオーバーします。" #: ./mu/modes/debugger.py:71 msgid "Step In" msgstr "ステップイン" #: ./mu/modes/debugger.py:72 msgid "Step into a function." msgstr "関数にステップインします。" #: ./mu/modes/debugger.py:78 msgid "Step Out" msgstr "ステップアウト" #: ./mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "関数からステップアウトします。" #: ./mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "スクリプトの実行を終了しました。" #: ./mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "" "Python デバッガに接続できません。\n" "\n" #: ./mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "デバッガ情報: {}" #: ./mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "デバッガ警告: {}" #: ./mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "デバッガエラー: {}" #: ./mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "" #: ./mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "BBC micro:bit の MicroPython を編集。" #: ./mu/modes/microbit.py:192 msgid "Flash" msgstr "転送" #: ./mu/modes/microbit.py:193 msgid "Flash your code onto the micro:bit." msgstr "コードを micro:bit に転送します。" #: ./mu/modes/microbit.py:199 msgid "Files" msgstr "ファイル" #: ./mu/modes/microbit.py:200 msgid "Access the file system on the micro:bit." msgstr "micro:bit にあるファイルにアクセスします。" #: ./mu/modes/microbit.py:206 ./mu/modes/python3.py:127 msgid "REPL" msgstr "" #: ./mu/modes/microbit.py:207 msgid "Use the REPL to live-code on the micro:bit." msgstr "micro:bit を対話モードで利用します。" #: ./mu/modes/microbit.py:257 msgid "Unable to flash \"{}\"" msgstr "\"{}\" を転送できません" #: ./mu/modes/microbit.py:267 msgid "Problem with script" msgstr "スクリプトに問題があります" #: ./mu/modes/microbit.py:268 msgid "{} [{}:{}]" msgstr "" #: ./mu/modes/microbit.py:278 msgid "Our minifier tried but your script is too long!" msgstr "縮小しようとしましたが、スクリプトが長すぎます!" #: ./mu/modes/microbit.py:283 msgid "Your script is too long and the minifier isn't available" msgstr "スクリプトが長すぎて縮小できません" #: ./mu/modes/microbit.py:288 msgid "Your script is too long!" msgstr "スクリプトが長すぎます!" #: ./mu/modes/microbit.py:358 msgid "Flashing \"{}\" onto the micro:bit." msgstr "micro:bit に \"{}\" を転送中。" #: ./mu/modes/microbit.py:360 msgid " Runtime: {}" msgstr "ランタイム: {}" #: ./mu/modes/microbit.py:403 msgid "Unsupported BBC micro:bit." msgstr "未サポートの BBC micro:bit。" #: ./mu/modes/microbit.py:404 msgid "" "Your device is newer than this version of Mu. Please update Mu to the latest version to support this device.\n" "\n" "https://codewith.mu/" msgstr "" "デバイスがこの Mu のバージョンで扱うには新しすぎます。このデバイスをサポートするために Mu を最新バージョンにアップデートしてください。\n" "\n" "https://codewith.mu/" #: ./mu/modes/microbit.py:440 ./mu/modes/microbit.py:576 msgid "Could not find an attached BBC micro:bit." msgstr "BBC micro:bit が繋げられていないようです" #: ./mu/modes/microbit.py:441 msgid "Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound." msgstr "" "BBC micro:bit を正しく繋げている場合でも、コンピュータがそれを認識するのに十分な時間を" "おいてください。これには数秒かかることがあります。それでもデバイスが認識" "されない場合は、デバイス一度取り外して再度繋げるか、スクリプトを保存して " "Mu を再起動してみてください。" #: ./mu/modes/microbit.py:455 msgid "Finished flashing." msgstr "転送を完了しました。" #: ./mu/modes/microbit.py:476 #: ./mu/modes/microbit.py:490 msgid "Copied code onto micro:bit." msgstr "micro:bit にコードをコピーしました。" #: ./mu/modes/microbit.py:499 msgid "There was a problem flashing the micro:bit." msgstr "micro:bit への転送で問題が発生しました。" #: ./mu/modes/microbit.py:500 msgid "Please do not disconnect the device until flashing has completed. Please check the logs for more information." msgstr "" "転送が完了するまでデバイスを取り外さないでください。" "詳しくは Mu のログを確認してください。" #: ./mu/modes/microbit.py:521 msgid "REPL and file system cannot work at the same time." msgstr "REPL とファイルシステムは同時に利用できません。" #: ./mu/modes/microbit.py:522 msgid "The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again." msgstr "" "REPL とファイルシステムはどちらも USB シリアル接続を利用しますが、有効にできるのは常に" "どちらか一方です。ファイルシステムの利用を止めて、もう一度試してください。" #: ./mu/modes/microbit.py:539 msgid "The plotter and file system cannot work at the same time." msgstr "プロッターとファイルシステムは同時に利用できません。" #: ./mu/modes/microbit.py:541 msgid "The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again." msgstr "" "プロッターとファイルシステムはどちらも USB シリアル接続を利用しますが、有効にできるのは常に" "どちらか一方です。ファイルシステムの利用を止めて、もう一度試してください。" #: ./mu/modes/microbit.py:553 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "ファイルシステムは REPL やプロッターと同時に利用できません。" #: ./mu/modes/microbit.py:555 msgid "The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again." msgstr "" "ファイルシステムと REPL とプロッターは同じ USB シリアル接続を利用します。" "REPL とプロッターの利用を止めて、再度試してください。" #: ./mu/modes/microbit.py:577 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "デバイスがこのコンピュータに繋げられているかを確認してください。\n" "\n" "ファイルシステムが動作するには、MicroPython がデバイスに転送されている必要が" "あります。\n" "\n" "最後に、デバイスのリセットボタンを押してから、再度試してください。" #: ./mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "" #: ./mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "Pygame Zero でゲームを作成します。" #: ./mu/modes/pygamezero.py:51 ./mu/modes/pygamezero.py:101 msgid "Play" msgstr "プレイ" #: ./mu/modes/pygamezero.py:52 ./mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "Pygame Zero ゲームをプレイします。" #: ./mu/modes/pygamezero.py:58 msgid "Images" msgstr "イメージ" #: ./mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "Pygame で使うイメージを表示します。" #: ./mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "フォント" #: ./mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "Pygame Zero で使うフォントを表示します。" #: ./mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "効果音" #: ./mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "Pygame Zero で使う効果音を表示します。" #: ./mu/modes/pygamezero.py:79 msgid "Music" msgstr "音楽" #: ./mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "Pygame Zero で使う音楽を表示します。" #: ./mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "Pygame Zero ゲームを停止します。" #: ./mu/modes/python3.py:97 msgid "Python 3" msgstr "" #: ./mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "標準 Python 3 のコードを作成します。" #: ./mu/modes/python3.py:113 ./mu/modes/python3.py:158 msgid "Run" msgstr "実行" #: ./mu/modes/python3.py:114 ./mu/modes/python3.py:159 msgid "Run your Python script." msgstr "Python スクリプトを実行します。" #: ./mu/modes/python3.py:120 msgid "Debug" msgstr "デバッグ" #: ./mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "Python スクリプトをデバッグします。" #: ./mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "ライブコーディングのために REPL を利用します。" #: ./mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "スクリプトまたは REPL からのデータをプロットします。" #: ./mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "Python スクリプトを停止します。" #: ./mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "iPython REPL を始動します。" #: ./mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "iPython REPL を停止(少し時間がかかります)。" #: ./mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL が始動しました。" #: ./mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL が停止しました。" mu-editor-1.0.2+dfsg/mu/locale/pl/000077500000000000000000000000001341747546300166475ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/pl/LC_MESSAGES/000077500000000000000000000000001341747546300204345ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/pl/LC_MESSAGES/mu.mo000066400000000000000000000737501341747546300214260ustar00rootroot00000000000000Q0 1>O&j)*!$4Yv4"& ,1(^TD8 Vd+{#K lJ71@jr# &A#V9z)"XZl"&$ e27LfaKbi>L !X z " @   !)!A!P!V!i!#o!!!!!"!-!("?E"" """&"@":2#7m##9#J#1$RD$$N$$% %$%;A%#}%%%%#%'%!&)&/&O&U&@Z&&!&J& '(' :' E'/R'd'''m(v()*u+JZ,;,', -"-*->-B[-`-"- "...7.'/9/M/`/e/n/2s/Y/ 0 0000 D0Q0&j000 0000 00 1#!1$E1#j1$1B1*1!2(2[E22222 223393>3U3q3=3=3O4V4455{6L67798OP89J9E9b7:+::5;h;&<<EL=1=1=+=s">>>/>>+?@?F?Kc?,?+?(@ 1@#R@v@!@8ATA"mA$AAAA AA AACC,C)C'DFD`D)wD!D&DD! E,E6LE#E$E0E0E.FTEFGF(F GG?2G"rG%G7GGR H`HvH(HVHHCI/bII J.JLJjJJ6JDJ2K/RKfKKL( L3IL}L.L LwLQMpMxMM MMM9M5N#PNtNN'NrNdHOkOLPYfP-PP!QJ#QnQtQQQQQQQ R%R)ERoRxR1R(RGR:SMS]S cS4SOSH TERTT4TDTUX/UUdUVV)V9V]SVfVWW W#1W4UW*WWWWWVWrB>s=s}s=tWt/st#t0t t(uQ+u;}u+u&u% v"2vUv%v= wIw fw#w w w w ww wJ$k}^vN mg*\'.On#~P!d,yuhr?SbV aZ1<&[G/`c T{iWMFf_3EeU>%D8K4wX9Q=( lB]xI5 pCL ;7+Aj6z)R@q-":sY0o|2tH Runtime: {} above this line# Write your code here :-)'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Adafruit CircuitPythonAlgorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.Awesome! Zero problems found.BBC micro:bitBBC micro:bit SettingsBe brave, break things, learn and have fun!Beautiful is better than ugly.Cannot Set Breakpoint.Cannot connect to device on port {}Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copied code onto micro:bit.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Delete (cannot be undone)Deleting '{}' from micro:bit.Detected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.File already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFor the Zen of Python: import thisGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHello, World!HelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)Is this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.Lines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.Minify Python code before flashing?ModeMuMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu {}Mu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.Now is better than never. Although never is often better than *right* now.OpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):PlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Pygame ZeroPython 3Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 (Jupyter)Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPLREPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.Replace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaveSave the current Python script.Saved file: {}Select ModeSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.Syntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way. If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The micro:bit runtime you specified ('{}') does not exist. Please try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.To understand what recursion is, you must first understand recursion.Toggle theme between day, night or high contrast.Try to see things from your users' point of view.Unable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unsupported BBC micro:bit.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You cannot use the filename "{}"You must provide something to find.Your device is newer than this version of Mu. Please update Mu to the latest version to support this device. https://codewith.mu/Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-outuntitled{} Plotter{} REPL{} [{}:{}]Project-Id-Version: PO-Revision-Date: 2018-09-11 18:23+0200 Last-Translator: ABIX Edukacja - Adam Jurkiewicz Language-Team: polski MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Generated-By: pygettext.py 1.5 Language: pl X-Generator: Poedit 2.0.6 Wykonanie: {}powyżej tej linii# Tutaj pisz swój kod, młody padawanie ;-)'{}' skopiowane z sukcesem na micro:bita.'{}' usunięto z sukcesem z micro:bita.(Słownik {} elementów.)(Lista {} elementów.)Plik o tej nazwie jest już otwarty w Mu.Dobry programista zadaje pytania.Dobry programista unika złożoności.Dobry programista jest skromny.Dobry programista jest cierpliwy.Dobry programista jest zabawny.Dobry programista jest gotów powiedzieć: "Nie wiem".Dobry programista uczy się uczyć.Dobry programista promuje prostotę.Dobry programista myśli ponad to, co oczywiste.Uzyskaj dostęp do systemu plików na micro:bit.Adafruit CircuitPythonAlgorytm: słowo używane przez programistów, gdy nie chcą wyjaśnić, co zrobili.Otwarty umysł, duch przygody i szacunek dla różnorodności to klucz.Wspaniale! Zero znalezionych problemów.BBC micro:bitUstawienia BBC micro:bitBądź odważna/odważny, psuj rzeczy, ucz się i miej zabawę!Piękne jest lepsze niż brzydkie.Nie mogę ustawić punktu przerwania.Nie można połączyć się z urządzeniem na porcie {}Zmień tryb działania MuZmień tryb w dowolnym momencie kilkając na przycisk "Tryb" zawierający logo Mu.Zmieniłem na tryb {}SprawdźSprawdź swój kod pod kątem błędów.Naciśnij przycisk reset urządzenia, poczekaj kilka sekund i potem spróbuj ponownie.Programowanie to współpraca.Złożoność jest wrogiem. Zrób, żeby to było proste, głupcze!Komplementuj i wzmacniaj dobre rzeczy w kodzie.Połączenie przekroczyło czas. Czy Twoja maszyna jest wolna lub zajęta? Zwolnij trochę zasobów maszyny i spróbuj ponownie.KontynuujKontynuuj wykonywanie swojego skryptu Pythona.Skopiowana kod na micro:bita.Kopiowanie '{}' na micro:bita.Nie mogę znaleźć "{}".Nie mogłem znaleźć wersji wykonywalnej MicroPythonaNie mogę znaleźć podłączonych urządzeń Adafruit CircuitPythonNie mogę znaleźć podłączonego BBC micro:bita.Nie mogę znaleźć podłączonego urządzenia.Nie mogę znaleźć localhosta. Upewnij się, że masz '127.0.0.1 localhost' w swoim pliku /etc/hosts.Nie mogę otworzyć {}Nie mogę zmienić nazwy pliku.Nie mogę zapisać pliku (problem dysku)Nie można było zapisać pliku (problem kodowania)Stwórz nowy skrypt w Pythonie.Twórz kod używając standardowego Pythona 3.Aktualny LogAktualnie Mu działa tylko z plikami źródłowymi Pythona lub plikami hex stworzonymi z wbudowanym kodem MicroPythona.Przepełnienie danymi wykryte!DebugujInspektor debugowaniaDebuguj swój kod Pythona 3.Debuguj swój skrypt w Pythonie.Błędy debuggera: {}Informacje debuggera: {}Debugger wymaga nazwę pliku skryptu Pythona by działaćOstrzeżenie debuggera: {}Usuń (nie może zostać cofnięte)Usuwanie '{}' z micro:bita.Wykryto nowe urządzenie {}.Różnorodność wspiera kreatywność.Czy plik istnieje? Jeśli tak, to czy masz uprawnienia, żeby go odczytać? Proszę sprawdź i spróbuj ponownie.Nie martw się jeśli to nie zadziała. Wyciągnij z tego naukę, napraw i spróbuj jeszcze raz! :-)Błąd w zapisywaniu na dysk. Upewnij się, że masz uprawnienia do pliku i wystarczającą ilość miejscaBłędy zawsze powinny być sygnalizowane. Chyba że zostaną celowo ukryte.Wytłumaczenie problemu programistycznego przyjacielowi często odkrywa rozwiązanie. :-)Wyrażone wprost jest lepsze niż domniemane.Plik już istniejePlik już istnieje; Nadpisać go?System plików nie może działać w tym samym czasie co REPL lub plotter.PlikiPliki na Twoim komputerze:Pliki na Twoim micro:bit:System plików na micro:bitcieZnajdź / ZastąpZnajdź:Zakończono fleszowanie.FleszujFleszuj swój kod na micro:bita.Fleszowanie "{}" na micro:bita.Płaskie jest lepsze niż wielopoziomowe.CzcionkiDla Zen of Python: import thisPobieranie '{}' z micro:bita. Kopiowanie do '{}'.Dobra robota! Nie znaleziono problemów.Google, Facebook, NASA, Pixar, Disney i wiele innych używają Pythona.Graficzny DebuggerAhoj, przygodo!PomocPodświetlanie wystąpień "{}".Hurra! Sprawdzanie zakończyło się bez problemów.Jeśli rozwiązanie jest łatwo wyjaśnić, to może ono być dobrym pomysłem.Jeśli rozwiązanie jest trudno wyjaśnić, to jest ono złym pomysłem.Jeśli nie wiesz, pytaj. Nie ma nikogo by zapytać? Po prostu znajdźObrazkiW razie niejasności powstrzymaj pokusę zgadywania.W teorii, teoria i praktyka to to samo. W praktyce tak nie jest. ;-)Czy {} jest plikiem?To wygląda, że może być plikiem {}. Czy chciałbyś, żeby Mu zmieniło na tryb {}?Programowanie to zabawa.Linie, które są komentarzami lub wielolinijowymi wyrażeniami nie mogą mieć punktów przerwania.OtwórzOtwórz skrypt w Pythonie.Logowanie do {}Twórz gry z Pygame Zero.Sprawiaj by Twoje oprogramowanie było użyteczne I zabawne. Wzmacniaj swoich użytkowników.Nadpisz wbudowany program MicroPythona następującym plikiem hex (pusty oznacza użycie domyślnego):TrybMuAdministracja MuMu nie może odczytać znaków w {}Mu zostało stworzoone przez Nicholasa H.Tollerveya.Mu nie było w stanie otworzyć tego plikuMu {}Aktualny tryb działania Mu.MuzykaNazwaPrzestrzenie nazw to jeden z niesamowicie genialnych pomysłów -- miejmy ich więcej!NowyDobrze! Zero problemów wykrytych.Teraz jest lepsze niż nigdy. Chociaż nigdy jest często lepsze niż natychmiast.OtwórzOtwórz połączenie szeregowe do Twojego urządzeniaOtwórz w MuOtwieranie '{}'Nasz minifier (co to jest?) próbował, ale Twój skrypt jest zbyt długi!Nadpisz wbudowany program MicroPythona następującym plikiem hex (pusty oznacza użycie domyślnego):GrajGraj w swoją grę Pygame Zero.Proszę nie odłączaj urządzenia dopóki fleszowanie nie zostało ukończone.Proszę upewnij się, że dajesz wystarczająco dużo czasu dla BBC micro:bit, że by został podłączony i skonfigurowany poprawnie przez Twój komputer. To może zająć kilka sekund. Alternatywnie, próbuj odłączyć i podłączyć ponownie urządzenie lub zapisać swoją pracę a następnie zrestartuj Mu, jeśli urządzenie pozostaje niewykryte.Proszę upewnij się, że urządzenie jest podłączone do tego komputera. Musi posiadać wersję MicroPythona (lub CircuitPythona) zflashowaną na nim, zanim Plotter będzie działać. Na końcu, naciśnij przycisk reset na urządzeniu i poczekaj kilka sekund przed ponowną próbą.Proszę upewnij się, że urządzenie jest podłączone do tego komputera. Musi posiadać wersję MicroPythona (lub CircuitPythona) zflashowaną na nim, zanim REPL będzie działać. Na końcu, naciśnij przycisk reset na urządzeniu i poczekaj kilka sekund przed ponowną próbą.Proszę upewnij się, że urządzenie jest podłączone do komputera. Urządzenie musi zawierać sflaszowany Micropython na nim zanim system plików będzie działać. Na końcu naciśnij przycisk reset urządzenia i poczekaj kilka sekund przed ponowną próbą.Proszę wybierz pożądany tryb a następnie kliknij "OK". W przeciwnym razie kliknij "Anuluj".Spróbuj ponownie, tym razem z czymś w polu wyszukiwania.Rysuj dane ze swojego skryptu lub REPLa.Rysuj nadchodzące dane REPLaPlotterProblem ze skryptemProgramiści liczą od zera.Programowanie ma więcej wspólnego z rozwiązywaniem problemów niż pisaniem koduProgramowanie jest formą magii. Naucz się rzucać właściwe zaklęcia z kodem i będziesz czarodziejką/czarodziejem.Wejdź w buty swoich użytkowników.Pygame ZeroPython 3Pliki pythonowe dla urządzeń Adafruit CircuitPython są przechowywane na urządzeniu. W związku z tym, by edytować te pliki potrzebujesz podłączonego urządzenia. Dopóki go nie podłączysz, Mu będzie używał katalogu znalezionego tutaj: {} ...do przechowywania Twojego kodu.Python 3 (Jupyter)Środowisko Pythona 3krotka z danymi Pythona 3ZakończWyjdź z MuREPLREPL i system plików nie mogą działać w tym samym czasie.REPL to skrót od angielskiego read (czytaj), evaluate (ewaluuj), print (wypisuj), loop (zapętlaj). To zabawny sposób by rozmawiać ze swoim komputerem! :-)REPL uruchomiony.REPL zatrzymany.Czytelność się liczy.Zastąp (opcjonalne)Zastąp wszystkie?Zamieniono "{}" na "{}".Zamieniono {} wystąpienia "{}" na "{}".WykonujWykonuj swój skrypt w Pythonie Wykonywanie: {}ZapiszZapisz aktualny skrypt w Pythonie.Zapisano plik: {}Wybierz TrybSzeregowePokaż pomoc na temat Mu w przeglądarce.Pokaż czcionki używane przez Pygame Zero.Pokaż obrazki używane przez Pygame Zero.Pokaż muzykę używaną przez Pygame Zero.Pokaż dźwięki używane przez Pygame Zero.Proste jest lepsze niż złożone. Złożone jest lepsze niż skomplikowane.Prostota jest ostatecznym wyrafinowaniem.DźwiękiRzadkie jest lepsze niż gęste.Sytuacje wyjątkowe nie są na tyle wyjątkowe, aby łamać reguły. Choć praktyczność przeważa nad konsekwencją.Zacznij od potrzeb Twoich użytkowników.Uruchamianie iPython REPLKrok do wewnątrzKrok na zewnątrzPrzekroczKrok do wewnątrz funkcji.Krok na zewnątrz funkcji.Przekrocz linię kodu.ZatrzymajZatrzymaj wykonywany kod.Zatrzymaj swoją grę Pygame Zero.Zatrzymaj swój skrypt w PythonieZatrzymywanie iPython REPL (to może potrwać krótką chwilę czasu).Skopiowałem z powodzeniem '{}' z micro:bita na Twój komputer.Błąd składni. Python nie może zrozumieć tej linii. Sprawdź, czy nie ma brakujących znaków!REPL i system plików oba używają tego samego połączenia szeregowego USB. Tylko jeden może być aktywny w dowolnym momencie. Wyłącz system plików i próbuj ponownie.Zmienne środowiskowe podane poniżej będą ustawiane za każdym razem gdy uruchamiasz skrypt Pythona 3. Każda oddzielna zmienna środowiskowa powinna być w nowej linii i w formacie: NAZWA=WARTOŚĆPlik "{}" jest już otwarty.Plik zawiera znaki Mu oczekuje, że będzie zakodowany jako {0} lub jako domyślne kodowanie komputera {1}, ale które są zakodowane w inny sposób. Jeśli plik ten został zapisany w innej aplikacji, ponownie zapisz plik za pomocą opcji "Zapisz jako" i ustaw kodowanie na {0}System plików i REPL i plotter używają tego samego połączenia szeregowego USB. Wyłącz REPL i plotter i próbuj ponownie.Wersja wykonywalna micro:bit, którą podałeś ('{}') nie istnieje. Proszę spróbuj ponownie.Plotter i system plików oba używają tego samego połączenia szeregowego USB. Tylko jeden może być aktywny w dowolnym momencie. Wyłącz system plików i próbuj ponownie.Plotter i system plików nie mogą być używane w tym samym czasie.Plotter jest przepełniony danymi, które sprawią, że Mu będzie nieresponsywny i się zawiesi. Dla bezpieczeństwa, plotter został zatrzymany Przepełnianie występuje gdy porcje danych są większe niż 1024 bajty i powtórnie wysyłane na plotter. By naprawić to, upewnij się, że Twój kod wypisuje małe krotki danych pomiędzy wywołaniami 'sleep' na krótki okres czasu.MotywJest niezapisana praca, wyjście z aplikacji spowoduje jej utratę.Powinien być jeden -- i najlepiej tylko jeden -- oczywisty sposób na zrobienie danej rzeczy.Był problem z usunięciem '{}' z micro:bita. Proszę sprawdź logi Mu w celu uzyskania więcej informacji.Wystąpił problem z fleszowaniem micro:bita.Był problem z pobraniem listy plików na micro:bitcie. Proszę sprawdź logi Mu dla informacji technicznych. Alternatywnie, spróbuj odłączyc/podłączyć swojego micro:bita i/lub zrestartować Mu.Edytor nazywa się Mu (możesz to wymawiać "mu" lub "muuu").Ten edytor jest wolnym oprogramowaniem napisanym w Pythonie. Możesz go modyfikować, dodawać funkcje lub naprawiać błędy jeśli masz ochotę.Ta nazwa jest już używana przez inną część Pythona. Jeśli użyjesz tej nazwy, najprawdopodobniej coś się popsuje. Spróbuj ponownie z inną nazwą pliku.Ta nazwa jest już używana przez inną część Pythona. Jeśli użyjesz tej nazwy, najprawdopodobniej coś się popsuje. Spróbuj ponownie z inną nazwą pliku.Aby zrozumieć rekurencję, musisz najpierw zrozumieć rekurencję.Przełączaj motyw między dniem, nocą lub wysokim kontrastemSpróbuj zobaczyć rzeczy z punktu widzenia Twoich użytkowników.Nie jestem w stanie połączyć się z debuggerem Pythona. Nie można skonwertować wszystkich znaków. Jeśli masz linie z kodowaniem na początku pliku usuń ją i spróbuj ponownie.Nie mogę fleszować "{}"Niewspierany BBC micro:bit.Używaj CircuitPython na linii płytek AdafruitUżywaj REPL do kodowania na żywo.Używaj REPL do kodowania na żywo na micro:bit.WartośćBardzo dobrze! Żadnych problemów tutajGdy zgłaszasz błąd, kopiuj i wklejaj zawartość następującego pliku logów.Najmądrzejsi są ci, którzy wiedzą, że nic nie wiedzą.Czy chciałbyś przełączyć Mu w tryb {}?Pisz w MicroPython dla BBC micro:bita.Nie możesz używasz nazwy pliku "{}"Musisz podać coś do znalezienia.Twoje urządzenie jest nowsze niż ta wersja Mu. Proszę zaktualizuj Mu do najnowszej wersji by wspierać to urządzenie. https://codewith.mu/Twój skrypt zakończył wykonywanie.Twój skrypt jest za długi i pomniejszacz nie jest dostępnyTwój skrypt jest za długi!Powiększ (by tekst by większy)Pomniejsz (by tekst był mniejszy).PowiększPomniejsznienazwany{} Plotter{} REPL{} [{}:{}]mu-editor-1.0.2+dfsg/mu/locale/pl/LC_MESSAGES/mu.po000066400000000000000000001103211341747546300214130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) PyPolska # Filip Kłębczyk , 2018. # msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2018-09-07 18:34+CEST\n" "PO-Revision-Date: 2018-09-11 18:23+0200\n" "Last-Translator: ABIX Edukacja - Adam Jurkiewicz \n" "Language-Team: polski \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "Generated-By: pygettext.py 1.5\n" "Language: pl\n" "X-Generator: Poedit 2.0.6\n" #: mu/app.py:66 msgid "Logging to {}" msgstr "Logowanie do {}" #: mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "Debugger wymaga nazwę pliku skryptu Pythona by działać" #: mu/debugger/client.py:106 msgid "Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again." msgstr "Połączenie przekroczyło czas. Czy Twoja maszyna jest wolna lub zajęta? Zwolnij trochę zasobów maszyny i spróbuj ponownie." #: mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "" "Nie mogę znaleźć localhosta.\n" "Upewnij się, że masz '127.0.0.1 localhost' w swoim pliku /etc/hosts." #: mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "Wybierz Tryb" #: mu/interface/dialogs.py:57 msgid "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel\"." msgstr "Proszę wybierz pożądany tryb a następnie kliknij \"OK\". W przeciwnym razie kliknij \"Anuluj\"." #: mu/interface/dialogs.py:73 msgid "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "Zmień tryb w dowolnym momencie kilkając na przycisk \"Tryb\" zawierający logo Mu." #: mu/interface/dialogs.py:107 msgid "When reporting a bug, copy and paste the content of the following log file." msgstr "Gdy zgłaszasz błąd, kopiuj i wklejaj zawartość następującego pliku logów." #: mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python 3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "Zmienne środowiskowe podane poniżej będą ustawiane za każdym razem gdy uruchamiasz skrypt Pythona 3.\n" "\n" "Każda oddzielna zmienna środowiskowa powinna być w nowej linii i w formacie:\n" "NAZWA=WARTOŚĆ" #: mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "Nadpisz wbudowany program MicroPythona następującym plikiem hex (pusty oznacza użycie domyślnego):" #: mu/interface/dialogs.py:153 msgid "Override the built-in MicroPython runtime with the following hex file (empty means use the default):" msgstr "Nadpisz wbudowany program MicroPythona następującym plikiem hex (pusty oznacza użycie domyślnego):" #: mu/interface/dialogs.py:175 mu/interface/main.py:977 msgid "Mu Administration" msgstr "Administracja Mu" #: mu/interface/dialogs.py:186 msgid "Current Log" msgstr "Aktualny Log" #: mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Środowisko Pythona 3" #: mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "Ustawienia BBC micro:bit" #: mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "Znajdź / Zastąp" #: mu/interface/dialogs.py:227 msgid "Find:" msgstr "Znajdź:" #: mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "Zastąp (opcjonalne)" #: mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "Zastąp wszystkie?" #: mu/interface/editor.py:222 mu/logic.py:952 msgid "untitled" msgstr "nienazwany" #: mu/interface/main.py:69 msgid "Mode" msgstr "Tryb" #: mu/interface/main.py:70 msgid "Change Mu's mode of behaviour." msgstr "Zmień tryb działania Mu" #: mu/interface/main.py:72 msgid "New" msgstr "Nowy" #: mu/interface/main.py:73 msgid "Create a new Python script." msgstr "Stwórz nowy skrypt w Pythonie." #: mu/interface/main.py:74 msgid "Load" msgstr "Otwórz" #: mu/interface/main.py:75 msgid "Load a Python script." msgstr "Otwórz skrypt w Pythonie." #: mu/interface/main.py:76 msgid "Save" msgstr "Zapisz" #: mu/interface/main.py:77 msgid "Save the current Python script." msgstr "Zapisz aktualny skrypt w Pythonie." #: mu/interface/main.py:86 msgid "Zoom-in" msgstr "Powiększ" #: mu/interface/main.py:87 msgid "Zoom in (to make the text bigger)." msgstr "Powiększ (by tekst by większy)" #: mu/interface/main.py:88 msgid "Zoom-out" msgstr "Pomniejsz" #: mu/interface/main.py:89 msgid "Zoom out (to make the text smaller)." msgstr "Pomniejsz (by tekst był mniejszy)." #: mu/interface/main.py:90 msgid "Theme" msgstr "Motyw" #: mu/interface/main.py:91 msgid "Toggle theme between day, night or high contrast." msgstr "Przełączaj motyw między dniem, nocą lub wysokim kontrastem" #: mu/interface/main.py:94 msgid "Check" msgstr "Sprawdź" #: mu/interface/main.py:95 msgid "Check your code for mistakes." msgstr "Sprawdź swój kod pod kątem błędów." #: mu/interface/main.py:96 msgid "Help" msgstr "Pomoc" #: mu/interface/main.py:97 msgid "Show help about Mu in a browser." msgstr "Pokaż pomoc na temat Mu w przeglądarce." #: mu/interface/main.py:98 msgid "Quit" msgstr "Zakończ" #: mu/interface/main.py:99 msgid "Quit Mu." msgstr "Wyjdź z Mu" #: mu/interface/main.py:178 msgid "Mu {}" msgstr "Mu {}" #: mu/interface/main.py:354 msgid "Cannot connect to device on port {}" msgstr "Nie można połączyć się z urządzeniem na porcie {}" #: mu/interface/main.py:376 msgid "Filesystem on micro:bit" msgstr "System plików na micro:bitcie" #: mu/interface/main.py:435 msgid "Python3 data tuple" msgstr "krotka z danymi Pythona 3" #: mu/interface/main.py:447 msgid "Python3 (Jupyter)" msgstr "Python 3 (Jupyter)" #: mu/interface/main.py:454 msgid "{} REPL" msgstr "{} REPL" #: mu/interface/main.py:470 msgid "{} Plotter" msgstr "{} Plotter" #: mu/interface/main.py:511 msgid "Running: {}" msgstr "Wykonywanie: {}" #: mu/interface/main.py:534 msgid "Debug Inspector" msgstr "Inspektor debugowania" #: mu/interface/main.py:552 msgid "Name" msgstr "Nazwa" #: mu/interface/main.py:552 msgid "Value" msgstr "Wartość" #: mu/interface/main.py:569 msgid "(A list of {} items.)" msgstr "(Lista {} elementów.)" #: mu/interface/main.py:582 msgid "(A dict of {} items.)" msgstr "(Słownik {} elementów.)" #: mu/interface/main.py:720 msgid "Mu" msgstr "Mu" #: mu/interface/main.py:970 msgid "Mu's current mode of behaviour." msgstr "Aktualny tryb działania Mu." #: mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "Plik już istnieje; Nadpisać go?" #: mu/interface/panes.py:297 msgid "File already exists" msgstr "Plik już istnieje" #: mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "Kopiowanie '{}' na micro:bita." #: mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "'{}' skopiowane z sukcesem na micro:bita." #: mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "Usuń (nie może zostać cofnięte)" #: mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "Usuwanie '{}' z micro:bita." #: mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "'{}' usunięto z sukcesem z micro:bita." #: mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "Pobieranie '{}' z micro:bita. Kopiowanie do '{}'." #: mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "Skopiowałem z powodzeniem '{}' z micro:bita na Twój komputer." #: mu/interface/panes.py:409 msgid "Open in Mu" msgstr "Otwórz w Mu" #: mu/interface/panes.py:411 msgid "Open" msgstr "Otwórz" #: mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "Otwieranie '{}'" #: mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "Pliki na Twoim micro:bit:" #: mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "Pliki na Twoim komputerze:" #: mu/interface/panes.py:527 msgid "There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu." msgstr "Był problem z pobraniem listy plików na micro:bitcie. Proszę sprawdź logi Mu dla informacji technicznych. Alternatywnie, spróbuj odłączyc/podłączyć swojego micro:bita i/lub zrestartować Mu." #: mu/interface/panes.py:538 mu/interface/panes.py:546 msgid "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information." msgstr "Był problem z usunięciem '{}' z micro:bita. Proszę sprawdź logi Mu w celu uzyskania więcej informacji." #: mu/interface/panes.py:554 mu/logic.py:68 msgid "Hello, World!" msgstr "Ahoj, przygodo!" #: mu/logic.py:69 msgid "This editor is free software written in Python. You can modify it, add features or fix bugs if you like." msgstr "Ten edytor jest wolnym oprogramowaniem napisanym w Pythonie. Możesz go modyfikować, dodawać funkcje lub naprawiać błędy jeśli masz ochotę." #: mu/logic.py:71 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "Edytor nazywa się Mu (możesz to wymawiać \"mu\" lub \"muuu\")." #: mu/logic.py:72 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "Google, Facebook, NASA, Pixar, Disney i wiele innych używają Pythona." #: mu/logic.py:73 msgid "Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard." msgstr "Programowanie jest formą magii. Naucz się rzucać właściwe zaklęcia z kodem i będziesz czarodziejką/czarodziejem." #: mu/logic.py:75 msgid "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)" msgstr "REPL to skrót od angielskiego read (czytaj), evaluate (ewaluuj), print (wypisuj), loop (zapętlaj). To zabawny sposób by rozmawiać ze swoim komputerem! :-)" #: mu/logic.py:77 msgid "Be brave, break things, learn and have fun!" msgstr "Bądź odważna/odważny, psuj rzeczy, ucz się i miej zabawę!" #: mu/logic.py:78 msgid "Make your software both useful AND fun. Empower your users." msgstr "Sprawiaj by Twoje oprogramowanie było użyteczne I zabawne. Wzmacniaj swoich użytkowników." #: mu/logic.py:79 msgid "For the Zen of Python: import this" msgstr "Dla Zen of Python: import this" #: mu/logic.py:80 msgid "Diversity promotes creativity." msgstr "Różnorodność wspiera kreatywność." #: mu/logic.py:81 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "Otwarty umysł, duch przygody i szacunek dla różnorodności to klucz." #: mu/logic.py:82 msgid "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "Nie martw się jeśli to nie zadziała. Wyciągnij z tego naukę, napraw i spróbuj jeszcze raz! :-)" #: mu/logic.py:84 msgid "Coding is collaboration." msgstr "Programowanie to współpraca." #: mu/logic.py:85 msgid "Compliment and amplify the good things with code." msgstr "Komplementuj i wzmacniaj dobre rzeczy w kodzie." #: mu/logic.py:86 msgid "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "W teorii, teoria i praktyka to to samo. W praktyce tak nie jest. ;-)" #: mu/logic.py:88 mu/logic.py:89 msgid "It's fun to program." msgstr "Programowanie to zabawa." #: mu/logic.py:90 msgid "Programming has more to do with problem solving than writing code." msgstr "Programowanie ma więcej wspólnego z rozwiązywaniem problemów niż pisaniem kodu" #: mu/logic.py:91 msgid "Start with your users' needs." msgstr "Zacznij od potrzeb Twoich użytkowników." #: mu/logic.py:92 msgid "Try to see things from your users' point of view." msgstr "Spróbuj zobaczyć rzeczy z punktu widzenia Twoich użytkowników." #: mu/logic.py:93 msgid "Put yourself in your users' shoes." msgstr "Wejdź w buty swoich użytkowników." #: mu/logic.py:94 msgid "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "Wytłumaczenie problemu programistycznego przyjacielowi często odkrywa rozwiązanie. :-)" #: mu/logic.py:96 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "Jeśli nie wiesz, pytaj. Nie ma nikogo by zapytać? Po prostu znajdź" #: mu/logic.py:97 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "Złożoność jest wrogiem. Zrób, żeby to było proste, głupcze!" #: mu/logic.py:98 msgid "Beautiful is better than ugly." msgstr "Piękne jest lepsze niż brzydkie." #: mu/logic.py:99 msgid "Explicit is better than implicit." msgstr "Wyrażone wprost jest lepsze niż domniemane." #: mu/logic.py:100 msgid "Simple is better than complex. Complex is better than complicated." msgstr "Proste jest lepsze niż złożone. Złożone jest lepsze niż skomplikowane." #: mu/logic.py:101 msgid "Flat is better than nested." msgstr "Płaskie jest lepsze niż wielopoziomowe." #: mu/logic.py:102 msgid "Sparse is better than dense." msgstr "Rzadkie jest lepsze niż gęste." #: mu/logic.py:103 msgid "Readability counts." msgstr "Czytelność się liczy." #: mu/logic.py:104 msgid "Special cases aren't special enough to break the rules. Although practicality beats purity." msgstr "Sytuacje wyjątkowe nie są na tyle wyjątkowe, aby łamać reguły. Choć praktyczność przeważa nad konsekwencją." #: mu/logic.py:106 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "Błędy zawsze powinny być sygnalizowane. Chyba że zostaną celowo ukryte." #: mu/logic.py:107 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "W razie niejasności powstrzymaj pokusę zgadywania." #: mu/logic.py:108 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "Powinien być jeden -- i najlepiej tylko jeden -- oczywisty sposób na zrobienie danej rzeczy." #: mu/logic.py:109 msgid "Now is better than never. Although never is often better than *right* now." msgstr "Teraz jest lepsze niż nigdy. Chociaż nigdy jest często lepsze niż natychmiast." #: mu/logic.py:111 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "Jeśli rozwiązanie jest trudno wyjaśnić, to jest ono złym pomysłem." #: mu/logic.py:112 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "Jeśli rozwiązanie jest łatwo wyjaśnić, to może ono być dobrym pomysłem." #: mu/logic.py:113 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "Przestrzenie nazw to jeden z niesamowicie genialnych pomysłów -- miejmy ich więcej!" #: mu/logic.py:114 msgid "Mu was created by Nicholas H.Tollervey." msgstr "Mu zostało stworzoone przez Nicholasa H.Tollerveya." #: mu/logic.py:115 msgid "To understand what recursion is, you must first understand recursion." msgstr "Aby zrozumieć rekurencję, musisz najpierw zrozumieć rekurencję." #: mu/logic.py:116 msgid "Algorithm: a word used by programmers when they don't want to explain what they did." msgstr "Algorytm: słowo używane przez programistów, gdy nie chcą wyjaśnić, co zrobili." #: mu/logic.py:118 msgid "Programmers count from zero." msgstr "Programiści liczą od zera." #: mu/logic.py:119 msgid "Simplicity is the ultimate sophistication." msgstr "Prostota jest ostatecznym wyrafinowaniem." #: mu/logic.py:120 msgid "A good programmer is humble." msgstr "Dobry programista jest skromny." #: mu/logic.py:121 msgid "A good programmer is playful." msgstr "Dobry programista jest zabawny." #: mu/logic.py:122 msgid "A good programmer learns to learn." msgstr "Dobry programista uczy się uczyć." #: mu/logic.py:123 msgid "A good programmer thinks beyond the obvious." msgstr "Dobry programista myśli ponad to, co oczywiste." #: mu/logic.py:124 msgid "A good programmer promotes simplicity." msgstr "Dobry programista promuje prostotę." #: mu/logic.py:125 msgid "A good programmer avoids complexity." msgstr "Dobry programista unika złożoności." #: mu/logic.py:126 msgid "A good programmer is patient." msgstr "Dobry programista jest cierpliwy." #: mu/logic.py:127 msgid "A good programmer asks questions." msgstr "Dobry programista zadaje pytania." #: mu/logic.py:128 msgid "A good programmer is willing to say, 'I don't know'." msgstr "Dobry programista jest gotów powiedzieć: \"Nie wiem\"." #: mu/logic.py:129 msgid "Wisest are they that know they know nothing." msgstr "Najmądrzejsi są ci, którzy wiedzą, że nic nie wiedzą." #: mu/logic.py:439 msgid " above this line" msgstr "powyżej tej linii" #: mu/logic.py:484 msgid "Syntax error. Python cannot understand this line. Check for missing characters!" msgstr "Błąd składni. Python nie może zrozumieć tej linii. Sprawdź, czy nie ma brakujących znaków!" #: mu/logic.py:669 msgid "# Write your code here :-)" msgstr "# Tutaj pisz swój kod, młody padawanie ;-)" #: mu/logic.py:707 msgid "" "The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way.\n" "\n" "If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}" msgstr "" "Plik zawiera znaki Mu oczekuje, że będzie zakodowany jako {0} lub jako domyślne kodowanie komputera {1}, ale które są zakodowane w inny sposób.\n" "\n" "Jeśli plik ten został zapisany w innej aplikacji, ponownie zapisz plik za pomocą opcji \"Zapisz jako\" i ustaw kodowanie na {0}" #: mu/logic.py:723 msgid "The file \"{}\" is already open." msgstr "Plik \"{}\" jest już otwarty." #: mu/logic.py:735 msgid "Mu cannot read the characters in {}" msgstr "Mu nie może odczytać znaków w {}" #: mu/logic.py:758 msgid "Mu was not able to open this file" msgstr "Mu nie było w stanie otworzyć tego pliku" #: mu/logic.py:759 msgid "Currently Mu only works with Python source files or hex files created with embedded MicroPython code." msgstr "Aktualnie Mu działa tylko z plikami źródłowymi Pythona lub plikami hex stworzonymi z wbudowanym kodem MicroPythona." #: mu/logic.py:765 msgid "Could not load {}" msgstr "Nie mogę otworzyć {}" #: mu/logic.py:767 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "Czy plik istnieje?\n" "Jeśli tak, to czy masz uprawnienia, żeby go odczytać?\n" "\n" "Proszę sprawdź i spróbuj ponownie." #: mu/logic.py:773 msgid "Is this a {} file?" msgstr "Czy {} jest plikiem?" #: mu/logic.py:774 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "To wygląda, że może być plikiem {}.\n" "\n" "Czy chciałbyś, żeby Mu zmieniło na tryb {}?" #: mu/logic.py:846 msgid "Could not save file (disk problem)" msgstr "Nie mogę zapisać pliku (problem dysku)" #: mu/logic.py:847 msgid "Error saving file to disk. Ensure you have permission to write the file and sufficient disk space." msgstr "Błąd w zapisywaniu na dysk. Upewnij się, że masz uprawnienia do pliku i wystarczającą ilość miejsca" #: mu/logic.py:851 msgid "Could not save file (encoding problem)" msgstr "Nie można było zapisać pliku (problem kodowania)" #: mu/logic.py:853 msgid "Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again." msgstr "Nie można skonwertować wszystkich znaków. Jeśli masz linie z kodowaniem na początku pliku usuń ją i spróbuj ponownie." #: mu/logic.py:862 msgid "Saved file: {}" msgstr "Zapisano plik: {}" #: mu/logic.py:891 mu/logic.py:1229 msgid "You cannot use the filename \"{}\"" msgstr "Nie możesz używasz nazwy pliku \"{}\"" #: mu/logic.py:893 msgid "This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename." msgstr "Ta nazwa jest już używana przez inną część Pythona. Jeśli użyjesz tej nazwy, najprawdopodobniej coś się popsuje. Spróbuj ponownie z inną nazwą pliku." #: mu/logic.py:968 msgid "Good job! No problems found." msgstr "Dobra robota! Nie znaleziono problemów." #: mu/logic.py:969 msgid "Hurrah! Checker turned up no problems." msgstr "Hurra! Sprawdzanie zakończyło się bez problemów." #: mu/logic.py:970 msgid "Nice one! Zero problems detected." msgstr "Dobrze! Zero problemów wykrytych." #: mu/logic.py:971 msgid "Well done! No problems here." msgstr "Bardzo dobrze! Żadnych problemów tutaj" #: mu/logic.py:972 msgid "Awesome! Zero problems found." msgstr "Wspaniale! Zero znalezionych problemów." #: mu/logic.py:999 msgid "There is un-saved work, exiting the application will cause you to lose it." msgstr "Jest niezapisana praca, wyjście z aplikacji spowoduje jej utratę." #: mu/logic.py:1052 msgid "Could not find MicroPython runtime." msgstr "Nie mogłem znaleźć wersji wykonywalnej MicroPythona" #: mu/logic.py:1053 msgid "The micro:bit runtime you specified ('{}') does not exist. Please try again." msgstr "Wersja wykonywalna micro:bit, którą podałeś ('{}') nie istnieje. Proszę spróbuj ponownie." #: mu/logic.py:1123 msgid "Changed to {} mode." msgstr "Zmieniłem na tryb {}" #: mu/logic.py:1168 msgid "Detected new {} device." msgstr "Wykryto nowe urządzenie {}." #: mu/logic.py:1175 msgid "Would you like to change Mu to the {} mode?" msgstr "Czy chciałbyś przełączyć Mu w tryb {}?" #: mu/logic.py:1210 msgid "Cannot Set Breakpoint." msgstr "Nie mogę ustawić punktu przerwania." #: mu/logic.py:1211 msgid "Lines that are comments or some multi-line statements cannot have breakpoints." msgstr "Linie, które są komentarzami lub wielolinijowymi wyrażeniami nie mogą mieć punktów przerwania." #: mu/logic.py:1231 msgid "This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename." msgstr "Ta nazwa jest już używana przez inną część Pythona. Jeśli użyjesz tej nazwy, najprawdopodobniej coś się popsuje. Spróbuj ponownie z inną nazwą pliku." #: mu/logic.py:1248 msgid "Could not rename file." msgstr "Nie mogę zmienić nazwy pliku." #: mu/logic.py:1249 msgid "A file of that name is already open in Mu." msgstr "Plik o tej nazwie jest już otwarty w Mu." #: mu/logic.py:1278 msgid "Replaced \"{}\" with \"{}\"." msgstr "Zamieniono \"{}\" na \"{}\"." #: mu/logic.py:1282 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "Zamieniono {} wystąpienia \"{}\" na \"{}\"." #: mu/logic.py:1287 mu/logic.py:1294 msgid "Could not find \"{}\"." msgstr "Nie mogę znaleźć \"{}\"." #: mu/logic.py:1292 msgid "Highlighting matches for \"{}\"." msgstr "Podświetlanie wystąpień \"{}\"." #: mu/logic.py:1297 msgid "You must provide something to find." msgstr "Musisz podać coś do znalezienia." #: mu/logic.py:1298 msgid "Please try again, this time with something in the find box." msgstr "Spróbuj ponownie, tym razem z czymś w polu wyszukiwania." #: mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "Adafruit CircuitPython" #: mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "Używaj CircuitPython na linii płytek Adafruit" #: mu/modes/adafruit.py:71 msgid "Serial" msgstr "Szeregowe" #: mu/modes/adafruit.py:72 msgid "Open a serial connection to your device." msgstr "Otwórz połączenie szeregowe do Twojego urządzenia" #: mu/modes/adafruit.py:79 mu/modes/microbit.py:215 mu/modes/python3.py:136 msgid "Plotter" msgstr "Plotter" #: mu/modes/adafruit.py:80 mu/modes/microbit.py:216 msgid "Plot incoming REPL data." msgstr "Rysuj nadchodzące dane REPLa" #: mu/modes/adafruit.py:150 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "Nie mogę znaleźć podłączonych urządzeń Adafruit CircuitPython" #: mu/modes/adafruit.py:152 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Pliki pythonowe dla urządzeń Adafruit CircuitPython są przechowywane na urządzeniu. W związku z tym, by edytować te pliki potrzebujesz podłączonego urządzenia. Dopóki go nie podłączysz, Mu będzie używał katalogu znalezionego tutaj:\n" "\n" " {}\n" "\n" "...do przechowywania Twojego kodu." #: mu/modes/base.py:177 msgid "Data Flood Detected!" msgstr "Przepełnienie danymi wykryte!" #: mu/modes/base.py:178 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time." msgstr "" "Plotter jest przepełniony danymi, które sprawią, że Mu będzie nieresponsywny i się zawiesi. Dla bezpieczeństwa, plotter został zatrzymany\n" "\n" "Przepełnianie występuje gdy porcje danych są większe niż 1024 bajty i powtórnie wysyłane na plotter.\n" "\n" "By naprawić to, upewnij się, że Twój kod wypisuje małe krotki danych pomiędzy wywołaniami 'sleep' na krótki okres czasu." #: mu/modes/base.py:273 mu/modes/base.py:312 msgid "Click on the device's reset button, wait a few seconds and then try again." msgstr "Naciśnij przycisk reset urządzenia, poczekaj kilka sekund i potem spróbuj ponownie." #: mu/modes/base.py:279 mu/modes/base.py:318 msgid "Could not find an attached device." msgstr "Nie mogę znaleźć podłączonego urządzenia." #: mu/modes/base.py:280 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "Proszę upewnij się, że urządzenie jest podłączone do tego komputera.\n" "\n" "Musi posiadać wersję MicroPythona (lub CircuitPythona) zflashowaną na nim, zanim REPL będzie działać.\n" "\n" "Na końcu, naciśnij przycisk reset na urządzeniu i poczekaj kilka sekund przed ponowną próbą." #: mu/modes/base.py:319 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "Proszę upewnij się, że urządzenie jest podłączone do tego komputera.\n" "\n" "Musi posiadać wersję MicroPythona (lub CircuitPythona) zflashowaną na nim, zanim Plotter będzie działać.\n" "\n" "Na końcu, naciśnij przycisk reset na urządzeniu i poczekaj kilka sekund przed ponowną próbą." #: mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "Graficzny Debugger" #: mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "Debuguj swój kod Pythona 3." #: mu/modes/debugger.py:50 mu/modes/pygamezero.py:109 mu/modes/python3.py:166 msgid "Stop" msgstr "Zatrzymaj" #: mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "Zatrzymaj wykonywany kod." #: mu/modes/debugger.py:57 msgid "Continue" msgstr "Kontynuuj" #: mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "Kontynuuj wykonywanie swojego skryptu Pythona." #: mu/modes/debugger.py:64 msgid "Step Over" msgstr "Przekrocz" #: mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "Przekrocz linię kodu." #: mu/modes/debugger.py:71 msgid "Step In" msgstr "Krok do wewnątrz" #: mu/modes/debugger.py:72 msgid "Step into a function." msgstr "Krok do wewnątrz funkcji." #: mu/modes/debugger.py:78 msgid "Step Out" msgstr "Krok na zewnątrz" #: mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "Krok na zewnątrz funkcji." #: mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "Twój skrypt zakończył wykonywanie." #: mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "" "Nie jestem w stanie połączyć się z debuggerem Pythona.\n" "\n" #: mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "Informacje debuggera: {}" #: mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "Ostrzeżenie debuggera: {}" #: mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "Błędy debuggera: {}" #: mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "BBC micro:bit" #: mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "Pisz w MicroPython dla BBC micro:bita." #: mu/modes/microbit.py:192 msgid "Flash" msgstr "Fleszuj" #: mu/modes/microbit.py:193 msgid "Flash your code onto the micro:bit." msgstr "Fleszuj swój kod na micro:bita." #: mu/modes/microbit.py:199 msgid "Files" msgstr "Pliki" #: mu/modes/microbit.py:200 msgid "Access the file system on the micro:bit." msgstr "Uzyskaj dostęp do systemu plików na micro:bit." #: mu/modes/microbit.py:206 mu/modes/python3.py:127 msgid "REPL" msgstr "REPL" #: mu/modes/microbit.py:207 msgid "Use the REPL to live-code on the micro:bit." msgstr "Używaj REPL do kodowania na żywo na micro:bit." #: mu/modes/microbit.py:257 msgid "Unable to flash \"{}\"" msgstr "Nie mogę fleszować \"{}\"" #: mu/modes/microbit.py:267 msgid "Problem with script" msgstr "Problem ze skryptem" #: mu/modes/microbit.py:268 msgid "{} [{}:{}]" msgstr "{} [{}:{}]" #: mu/modes/microbit.py:278 msgid "Our minifier tried but your script is too long!" msgstr "Nasz minifier (co to jest?) próbował, ale Twój skrypt jest zbyt długi!" #: mu/modes/microbit.py:283 msgid "Your script is too long and the minifier isn't available" msgstr "Twój skrypt jest za długi i pomniejszacz nie jest dostępny" #: mu/modes/microbit.py:288 msgid "Your script is too long!" msgstr "Twój skrypt jest za długi!" #: mu/modes/microbit.py:368 msgid "Flashing \"{}\" onto the micro:bit." msgstr "Fleszowanie \"{}\" na micro:bita." #: mu/modes/microbit.py:370 msgid " Runtime: {}" msgstr " Wykonanie: {}" #: mu/modes/microbit.py:416 msgid "Unsupported BBC micro:bit." msgstr "Niewspierany BBC micro:bit." #: mu/modes/microbit.py:417 msgid "" "Your device is newer than this version of Mu. Please update Mu to the latest version to support this device.\n" "\n" "https://codewith.mu/" msgstr "" "Twoje urządzenie jest nowsze niż ta wersja Mu. Proszę zaktualizuj Mu do najnowszej wersji by wspierać to urządzenie.\n" "\n" "https://codewith.mu/" #: mu/modes/microbit.py:474 mu/modes/microbit.py:611 msgid "Could not find an attached BBC micro:bit." msgstr "Nie mogę znaleźć podłączonego BBC micro:bita." #: mu/modes/microbit.py:475 msgid "Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound." msgstr "" "Proszę upewnij się, że dajesz wystarczająco dużo czasu dla BBC micro:bit, że by został podłączony i skonfigurowany poprawnie przez Twój komputer. To może zająć kilka sekund. Alternatywnie, próbuj odłączyć i podłączyć ponownie urządzenie lub zapisać swoją pracę a następnie " "zrestartuj Mu, jeśli urządzenie pozostaje niewykryte." #: mu/modes/microbit.py:489 msgid "Finished flashing." msgstr "Zakończono fleszowanie." #: mu/modes/microbit.py:524 msgid "Copied code onto micro:bit." msgstr "Skopiowana kod na micro:bita." #: mu/modes/microbit.py:533 msgid "There was a problem flashing the micro:bit." msgstr "Wystąpił problem z fleszowaniem micro:bita." #: mu/modes/microbit.py:534 msgid "Please do not disconnect the device until flashing has completed. Please check the logs for more information." msgstr "Proszę nie odłączaj urządzenia dopóki fleszowanie nie zostało ukończone." #: mu/modes/microbit.py:555 msgid "REPL and file system cannot work at the same time." msgstr "REPL i system plików nie mogą działać w tym samym czasie." #: mu/modes/microbit.py:556 msgid "The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again." msgstr "REPL i system plików oba używają tego samego połączenia szeregowego USB. Tylko jeden może być aktywny w dowolnym momencie. Wyłącz system plików i próbuj ponownie." #: mu/modes/microbit.py:573 msgid "The plotter and file system cannot work at the same time." msgstr "Plotter i system plików nie mogą być używane w tym samym czasie." #: mu/modes/microbit.py:575 msgid "The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again." msgstr "Plotter i system plików oba używają tego samego połączenia szeregowego USB. Tylko jeden może być aktywny w dowolnym momencie. Wyłącz system plików i próbuj ponownie." #: mu/modes/microbit.py:587 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "System plików nie może działać w tym samym czasie co REPL lub plotter." #: mu/modes/microbit.py:589 msgid "The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again." msgstr "System plików i REPL i plotter używają tego samego połączenia szeregowego USB. Wyłącz REPL i plotter i próbuj ponownie." #: mu/modes/microbit.py:612 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before trying again." msgstr "" "Proszę upewnij się, że urządzenie jest podłączone do komputera.\n" "\n" "Urządzenie musi zawierać sflaszowany Micropython na nim zanim system plików będzie działać.\n" "\n" "Na końcu naciśnij przycisk reset urządzenia i poczekaj kilka sekund przed ponowną próbą." #: mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "Pygame Zero" #: mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "Twórz gry z Pygame Zero." #: mu/modes/pygamezero.py:51 mu/modes/pygamezero.py:101 msgid "Play" msgstr "Graj" #: mu/modes/pygamezero.py:52 mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "Graj w swoją grę Pygame Zero." #: mu/modes/pygamezero.py:58 msgid "Images" msgstr "Obrazki" #: mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "Pokaż obrazki używane przez Pygame Zero." #: mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "Czcionki" #: mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "Pokaż czcionki używane przez Pygame Zero." #: mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "Dźwięki" #: mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "Pokaż dźwięki używane przez Pygame Zero." #: mu/modes/pygamezero.py:79 msgid "Music" msgstr "Muzyka" #: mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "Pokaż muzykę używaną przez Pygame Zero." #: mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "Zatrzymaj swoją grę Pygame Zero." #: mu/modes/python3.py:97 msgid "Python 3" msgstr "Python 3" #: mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "Twórz kod używając standardowego Pythona 3." #: mu/modes/python3.py:113 mu/modes/python3.py:158 msgid "Run" msgstr "Wykonuj" #: mu/modes/python3.py:114 mu/modes/python3.py:159 msgid "Run your Python script." msgstr "Wykonuj swój skrypt w Pythonie " #: mu/modes/python3.py:120 msgid "Debug" msgstr "Debuguj" #: mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "Debuguj swój skrypt w Pythonie." #: mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "Używaj REPL do kodowania na żywo." #: mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "Rysuj dane ze swojego skryptu lub REPLa." #: mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "Zatrzymaj swój skrypt w Pythonie" #: mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "Uruchamianie iPython REPL" #: mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "Zatrzymywanie iPython REPL (to może potrwać krótką chwilę czasu)." #: mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL uruchomiony." #: mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL zatrzymany." mu-editor-1.0.2+dfsg/mu/locale/pt_BR/000077500000000000000000000000001341747546300172425ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/pt_BR/LC_MESSAGES/000077500000000000000000000000001341747546300210275ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/pt_BR/LC_MESSAGES/mu.mo000066400000000000000000000751671341747546300220250ustar00rootroot00000000000000[ &))*?!j$4 "?&b,(TDK +#5YKxJG7`1j5#>b~#9) "6XY"&%$A fer7J2\B7aVKb >g L ! !")!@L!!!!!!!!"# "!."P"l""r"-""?" # 3#A#F#&e#@#:#7$@$9G$J$$R$2%NG%%% %%;%#&<&A&D&#V&'z&!&&&&&@&6'!:'J\''(' ' '/'d(((m()!*+,J,;@-'|-----B-`9.". ...////0 020YA0 0 000 00&1,101 H1T1Y1y1 11 1#1$1#2$)2BN2*222[2<3Z3q3y3 3333333 4=%4=c4O445/6N6{U7L7898O8;:JA:E:j:b=;+;a;.<5<h%==!>E>1>1,?+^?s??@/.@^@+|@@@K@,A+DA(pA A#AA!aB8BB"B$BC%C.C 7CBC JCVUCDD D*D'E BEcE3E(E;E1FJFNiF=F@FJ7GOG GG\ HVjH(H HH4IGI+bI0I"IMI0J JJ'TJR|JJ8J: K[K K,K!L:L"ZL,}L?L4L6MlVMM-M7 N?ENNN NaN!%OGOOOhOOOO<OP;,P hPP!P%P}PblQQVPR`R$S-S+BSRnSSSSST &T1T LT)WT#T4TT'T3 U)=UUgUU UU&U4VL=V?VQVW9$WS^WWEWXl'XXX XXHX+$YPYUYXY*nY*Y&YYYZZFZeZjZSZZ0Z [ ![7.[ff[[[w[j\&]]"^_Y`IaLNa6aaa1aN#bsrb'b cc#c d d2dMd Rd^d>cdd6eEeUekeee"eeee ff/fAfRf"Yf-|f.f/f+ gB5g;xgggg-Yhh h hh hh)i*i#0iTiri7iKicjujj k klUmmmBNnnCpCHpRpjpgJq3qjqQrCs^sstU=u6u8u(v,v"v!v0vK)w3uww'wFw.x'Mx'ux$x*xxyCyyz!z=zFzOz Xzdz lzi" 2.4s{#*]_hAN>` Yea'Of|Wo}G%L-1,qy)7J8 k( HCbUmlX&<RK ^\Q~Ixj9Pn0:v$3DBdp?=M6w@tcSFZV/T5uE!g +[rz; Runtime: {} above this line# Write your code here :-)'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Adafruit CircuitPythonAlgorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.Awesome! Zero problems found.BBC micro:bitBBC micro:bit SettingsBe brave, break things, learn and have fun!Beautiful is better than ugly.Cannot Set Breakpoint.Cannot connect to device on port {}Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copied code onto micro:bit.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Debugging is twice as hard as writing the code in the first place.Delete (cannot be undone)Deleting '{}' from micro:bit.Detected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.File already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFor the Zen of Python: import thisGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHello, World!HelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)Is this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.Lines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.Minify Python code before flashing?ModeMuMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu {}Mu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.Now is better than never. Although never is often better than *right* now.OpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):PlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Pygame ZeroPython 3Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 (Jupyter)Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPLREPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.Replace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaveSave the current Python script.Saved file: {}Select ModeSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.Syntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way. If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The micro:bit runtime you specified ('{}') does not exist. Please try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.To understand what recursion is, you must first understand recursion.Toggle theme between day, night or high contrast.Try to see things from your users' point of view.Unable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unsupported BBC micro:bit.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You cannot use the filename "{}"You must provide something to find.Your device is newer than this version of Mu. Please update Mu to the latest version to support this device. https://codewith.mu/Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-outuntitled{} Plotter{} REPL{} [{}:{}]Project-Id-Version: POT-Creation-Date: 2018-07-15 12:49+0100 PO-Revision-Date: 2018-07-15 20:32+0100 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 X-Generator: Poedit 2.0.9 Last-Translator: Plural-Forms: nplurals=2; plural=(n != 1); Language: pt_BR "Runtime": {} acima desta linha# Escreva o seu código aqui :-)'{}' copiado com sucesso para o micro:bit.'{}' excluido com sucesso do micro:bit.(Um dicionário de {} elementos)(Uma lista de {} elementos)Já existe um arquivo aberto pelo Mu com esse nome.Programar bem passa por fazer perguntas.Uma boa programadora (ou programador) evita a complexidade.Um bom programador (ou programadora!) é humilde.Programar bem é ser paciente.Uma boa programadora é divertida! (e um bom programador é divertido, claro!)Programar bem significa estar disposto a dizer 'eu não sei'.Um bom programador (ou programadora, claro!) aprende a aprender.Um bom programador promove a simplicidade (e uma boa programadora também)Uma boa programadora pensa para além do óbvio. (e um bom programador também)Acesse os arquivos no micro:bit.CircuitPython da AdafruitAlgoritmo: uma palavra utilizada por programadores quando não sabem explicar o que fizeram.Uma mente aberta, espírito de aventura e respeito pela diversidade são fundamentais.Maravilhoso! Zero problemas encontrados.micro:bitDefinições do BBC micro:bitSê valente, quebre as coisas, aprenda e diverte-te!Bonito é melhor que feio.Não posso marcar o ponto de interrupção.A conexão com o dispositivo na porta {} falhou.Altera o modo de operação do Mu.Altere o modo a qualquer momento através do botão "Modo", com o logo do Mu.Alterador para o modo {}.VerificarVerifica seu código em busca de erros.Pressiona o botão de RESET no dispositivo, espera uns segundos e tenta novamente.Programar é colaborar.A complexidade é o inimigo. Mantenha as coisas simples!Complemente e amplie as coisas boas com os seus programas.A tentativa de conexão expirou. Seu computador está muito lento ou ocupado? Libere alguns recursos do computador e tente novamente.ContinuarContinua a execução do seu código Python.Código copiado para o micro:bit.Copiando '{}' para o micro:bit.Não foi possível encontrar "{}".O "runtime" MicroPython não foi encontrado.Não foi possível encontrar um dispositivo Adafruit conectado.Não foi possível encontrar um micro:bit conectado.Não foi possível encontrar um dispositivo conectado.Não foi possível localizar localhost. Tenha certeza que '127.0.0.1 localhost' está no arquivo /etc/hosts.Não foi possível abrir {}Não foi possível alterar o nome do arquivo.Não foi possível salvar o arquivo (problema no disco)Não foi possível salvar o arquivo (problema de codificação)Cria um script Python novo.Criar código Python 3.Log AtualO Mu só trabalha com arquivos fontes Python ou arquivos "hex" com código MicroPython embutidos.Detectada informação excessiva!DepurarInspector de DepuraçãoDepurar o seu código Python 3.Depura o seu script Python.Erro do depurador: {}Informação do depurador: {}O depurador requer o nome de um script Python para executar.Aviso do depurador: {}Depurar é duas vezes mais difícil que escrever o código.Excluir (não pode ser desfeito)Excluindo '{}' do micro:bit.Detectado um novo dispositivo {}.A diversidade promove a criatividade.Este arquivo existe? Em caso afirmativo, será que você tem permissões para lê-lo? Verifique por favor e tenta novamente.Não se preocupe se não funcionar. Aprende a lição, faça as correções e tente outra vez! :-)Erro ao salvar o arquivo no disco. Verifica que você tem permissões para salvar o arquivo e que há espaço livre disponível.Os erros nunca devem ser silenciosos. A não ser que sejam explicitamente silenciados.Explicar um problema de programação a um amigo ou amiga revela, muitas vezes, a solução. :-)Explícito é melhor que implícito.O arquivo já existeO arquivo já existe; deseja substituí-lo?Os arquivos não podem ser utilizados ao mesmo tempo com o REPL ou com o gráfico.ArquivosArquivos no computador:Arquivos no micro:bit:Arquivos no micro:bitLocalizar / SubstituirLocalizar:Transferência completada.TransferirTransfere o seu código para o micro:bit.Transferindo "{}" para o micro:bit.Uma estrutura linear é melhor que uma hierárquica.FontesPara obter o Zen do Python: import thisTransferindo '{}' do micro:bit. Copiando para '{}'.Bom trabalho! Nenhum problema encontrado.Google, Facebook, NASA, Pixar, Disney e muitas outras organizações utilizam Python.Depurador VisualOlá, Mundo!AjudaRealce das correspondências com "{}".Boa! A verificação não encontrou nenhum problema.Se a implementação é fácil de explicar, pode ser que seja uma boa ideia.Se a implementação é difícil de explicar, é uma má ideia.Se você não sabe, pergunta. Não tem ninguém a quem perguntar? Então procure.ImagensPerante a ambiguidade, rejeite a tentação de adivinhar.Teoricamente, a teoria e a prática são a mesma coisa. Na prática, não são. ;-)Este é um arquivo {}?Parece que este é um arquivo {} Deseja alterar o Mu para o modo {}?Programar é divertido.As linhas de comentário e alguns comandos multi-linha não podem ser marcados como pontos de interrupção.AbrirAbre um script Python.Log em {}.Criar jogos com o Pygame Zero.Torne os seus programas úteis E divertidos. Empodere os seus usuários.Compactar o código Python antes de enviar?ModoMuAdministração do MuO Mu não consegue ler os caracteres em {}O Mu foi criado por Nicholas H. Tollervey.O Mu não conseguiu abrir este arquivoMu {}Modo atual de operação do Mu.MúsicaNomeOs espaços de nomes são uma ótima ideia -- vamos fazer mais dessas!NovoBoa! Zero problemas detectados.Agora é melhor que nunca. Embora nunca seja muitas vezes melhor que *agora* mesmo.AbrirAbrir uma conexão serial com o seu dispositivo.Abrir no MuAbrindo '{}'O compactador tentou, mas o seu script é muito grande!Substituir o MicroPython embutido com o seguinte arquivo 'hex' (se vazio, não haverá substituição)JogarInicia o seu jogo Pygame Zero.Por favor não desligue o dispositivo até que a transferência seja completada. Verifica o log para mais informação.Por favor assegure que você dê tempo suficiente ao computador para detectar e identificar o micro:bit. Isto pode levar vários segundos. Alternativamente, tente desconectar e reconectar o dispositivo ou salve o seu trabalho e reinicie o Mu.Por favor, verifica que o dispositivo está conectado ao computador. O dispositivo precisa ter uma versão do MicroPython (ou CircuitPython) embutida antes do Gráfico poder funcionar. Por último, pressione o botão de RESET no dispositivo e espera alguns segundos antes de tentar novamente.Por favor, verifica que o dispositivo está conectado ao computador. O dispositivo precisa ter uma versão do MicroPython (ou CircuitPython) embutida antes do REPL poder funcionar. Por último, pressione o botão de RESET no dispositivo e espera alguns segundos antes de tentar novamente.Assegure que o dispositivo está conectado ao computador. O dispositivo tem que ter o MicroPython previamente transferido antes dos arquivos poderem funcionar. Por último, pressiona o botão RESET no dispositivo, aguarde alguns segundos e tenta novamente.Selecione o modo desejado e depois clique em "OK". Caso contrário, clique em "Cancelar".Tenta novamente, por favor, desta vez com algo na caixa de localização.Mostra um gráfico dos dados produzidos pelo seu script Python ou pelo REPL.Mostra um gráfico com dados obtidos a partir do REPL.GráficoProblema com o scriptProgramadores começam a contar a partir do zero.Programar tem mais que ver com resolver problemas do que com escrever código.Programar é uma espécie de magia. Aprenda a lançar as magias certas e vocêserá um especialista em feitiçaria.Coloque-se no lugar dos seus usuários.Pygame ZeroPython 3Os arquivos Python para dispositivos da Adafruit com CircuitPython são armazenados no próprio dispositivo. Assim sendo, para os alterar você terá que ligá-lo. Entretanto, o Mu utiliza esta pasta para guardar os seus scripts: {}Python 3 (Jupyter)Ambiente Python 3Tupla de dados do Python 3SairFecha o Mu.REPLO REPL e os arquivos não podem ser utilizados ao mesmo tempo.REPL vem do Inglês, Read (ler), Evaluate (avaliar), Print (imprimir), Loop (ciclo). É uma forma fácil e divertida de falar com o computador! :-)REPL iniciado.REPL terminado.A legibilidade conta.Substituir (opcional):Substituir todos?"{}" substituído por "{}".{} substituições: "{}" por "{}".ExecutarExecuta o seu script Python.Em execução: {}SalvarSalva o script Python atual.Arquivo salvo: {}Selecione o modoSerialMostra a ajuda do Mu no navegador.Mostra as fontes utilizados pelo Pygame Zero.Mostra as imagens utilizadas pelo Pygame Zero.Mostra as músicas utilizadas pelo Pygame Zero.Mostra os sons utilizados pelo Pygame Zero.Simples é melhor que complexo. Complexo é melhor que complicado.A simplicidade é a forma mais evoluída de sofisticação.SonsEsparso é melhor que denso.Os casos especiais não são suficientemente especiais para infringir as regras. Embora o sentido prático possa superar a pureza.Comece pelas necessidades dos seus usuários.Iniciando o REPL iPython.Para DentroPara ForaAvançarAvança para dentro da função.Avança até sair da função.Avança para a linha de código seguinte.PararInterrompe a execução do código.Pára o seu jogo Pygame Zero.Pára o teu script Python.Parando o REPL iPython (isto pode demorar algum tempo).A cópia de '{}' do micro:bit para o computador foi completada com sucesso.Erro de sintaxe. O Python não entende esta linha. Verifique se faltam algumas letras ou símbolos!O REPL e os arquivos utilizam a mesma conexão USB. Só um deles pode estar ativo de cada vez. Desative os arquivos e tenta novamente.Estas variáveis de ambiente estarão definidas a cada vez que você executar um script Python 3. Cada variável deve estar numa linha, sendo definida da forma: NOME=VALORO arquivo '{}' já está aberto.O arquivo contém caracteres que o Mu espera estarem codificados como {0} ou {1} (o padrão do sistema), mas que parecem estar codificados de outra forma. Se o arquivo foi produzido por outro programa ou aplicação, tenta voltar a salvá-lo com a codificação {0}.Os arquivos, REPL e gráfico utilizam a mesma conexão USB. Só um deles pode estar ativo de cada vez. Desativa o REPL e o gráfico e tenta novamente.O "runtime" micro:bit que você indicou ({}) não existe. Tenta novamente, por favor.O gráfico e os arquivos utilizam a mesma conexão USB. Só um deles pode estar ativo de cada vez. Desative os arquivos e tenta novamente.O gráfico e os arquivos não podem ser utilizados ao mesmo tempo.O gráfico recebeu informação excessiva, o que pode bloquear o Mu ou torná-lo muito lento. Como ressalva, o gráfico foi interrompido. A informação é considerada excessiva quando blocos de informação superiores a 1024 bytes são enviados repetidamente para o gráfico. Uma solução possível é garantir que o código imprima tuplas de informação pequenas, intervaladas com chamadas 'sleep' por curtos períodos de tempo.TemaVocê tem trabalho não salvo. Se sair do Mu você irá perdê-los.Deve haver uma -- e de preferência apenas uma -- forma óbvia de fazer as coisas.Houve uma falha ao copiar o arquivo '{}' para o micro:bit. Verifique os logs do Mu para mais informação.Houve uma falha ao excluir o arquivo '{}' do micro:bit. Verifique os logs do Mu para mais informação.Houve uma falha na transferência para o micro:bit.Houve uma falha ao transferir o arquivo '{}' do micro:bit. Verifique os logs do Mu para mais informação.Falha ao obter a lista de arquivos no micro:bit. Por favor verifica o log do Mu para obter detalhes técnicos. Alternativamente, tente desconectar e reconectar o teu micro:bit ou tenta reiniciar o Mu.Este programa chama-se Mu (podes dizer 'Mu' ou, em Inglês, 'Miu').Este programa é um software livre escrito em Python. Você pode modificá-lo, acrescentar funcionalidades ou corrigir falhas se você desejar.Este nome é utilizado por outra parte do Python. Se você utilizá-lo, provavelmente algumas coisas vão falhar. Tenta novamente com um nome diferente, por favor.Este nome é utilizado por outra parte do Python. Se você utilizar este nome, provavelmente algumas coisas vão falhar. Tenta novamente com um nome diferente, por favor.Para entender o que é recursão, você precisa primeiro entender o que é recursão.Altera o tema do Mu entre dia, noite e alto contraste.Tente ver as coisas pela perspectiva dos teus usuários.Falha ao conectar ao depurador Python. Não foi possível converter todos os caracteres. Se existe uma linha de codificação no topo do arquivo, remove-a e tenta novamente.Não foi possível transferir "{}"Este micro:bit não é suportado.Usar CircuitPython com dispositivos da Adafruit.Usa o REPL para experimentar Python linha a linha, com respostas imediatas.Usa o REPL para programar diretamente no micro:bit.ValorBem feito! Não há problemas por aqui.Quando reportar um bug, inclua o conteúdo do seguinte arquivo de log.Sábios são aqueles que sabem que nada sabem.Você quer alterar o Mu para o modo {}?Escrever MicroPython para um micro:bit.Você não pode utilizar o nome "{}"Você tem que indicar algo para localizar.O seu dispositivo é mais recente que esta versão do Mu. Por favor, atualize o Mu para a última versão para suporta este dispositivo. https://codewith.mu/O seu script terminou.O seu script é muito grande e o compactador não está disponívelO seu script é muito grande!Aumenta o tamanho do texto.Diminui o tamanho do texto.AumentarDiminuirsem nomeGráfico {}REPL {}{} [{}:{}]mu-editor-1.0.2+dfsg/mu/locale/pt_BR/LC_MESSAGES/mu.po000066400000000000000000001132761341747546300220220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2018-07-15 12:49+0100\n" "PO-Revision-Date: 2018-07-15 20:32+0100\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 2.0.9\n" "Last-Translator: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: pt_BR\n" #: mu/app.py:66 msgid "Logging to {}" msgstr "Log em {}." #: mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "O depurador requer o nome de um script Python para executar." #: mu/debugger/client.py:106 msgid "" "Connection timed out. Is your machine slow or busy? Free up some of the " "machine's resources and try again." msgstr "" "A tentativa de conexão expirou. Seu computador está muito lento ou " "ocupado? Libere alguns recursos do computador e tente novamente." #: mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "" "Não foi possível localizar localhost.\n" "Tenha certeza que '127.0.0.1 localhost' está no arquivo /etc/hosts." #: mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "Selecione o modo" #: mu/interface/dialogs.py:57 msgid "" "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel" "\"." msgstr "" "Selecione o modo desejado e depois clique em \"OK\". Caso contrário, clique" " em \"Cancelar\"." #: mu/interface/dialogs.py:73 msgid "" "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "" "Altere o modo a qualquer momento através do botão \"Modo\", com o logo do Mu." #: mu/interface/dialogs.py:107 msgid "" "When reporting a bug, copy and paste the content of the following log file." msgstr "Quando reportar um bug, inclua o conteúdo do seguinte arquivo de log." #: mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python " "3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "Estas variáveis de ambiente estarão definidas a cada vez que você executar um " "script Python 3. Cada variável deve estar numa linha, sendo definida da " "forma:\n" "\n" "NOME=VALOR" #: mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "Compactar o código Python antes de enviar?" #: mu/interface/dialogs.py:153 msgid "" "Override the built-in MicroPython runtime with the following hex file (empty " "means use the default):" msgstr "" "Substituir o MicroPython embutido com o seguinte arquivo 'hex' (se vazio, " "não haverá substituição)" #: mu/interface/dialogs.py:175 mu/interface/main.py:974 msgid "Mu Administration" msgstr "Administração do Mu" #: mu/interface/dialogs.py:186 msgid "Current Log" msgstr "Log Atual" #: mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Ambiente Python 3" #: mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "Definições do BBC micro:bit" #: mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "Localizar / Substituir" #: mu/interface/dialogs.py:227 msgid "Find:" msgstr "Localizar:" #: mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "Substituir (opcional):" #: mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "Substituir todos?" #: mu/interface/editor.py:222 mu/logic.py:960 msgid "untitled" msgstr "sem nome" #: mu/interface/main.py:68 msgid "Mode" msgstr "Modo" #: mu/interface/main.py:69 msgid "Change Mu's mode of behaviour." msgstr "Altera o modo de operação do Mu." #: mu/interface/main.py:71 msgid "New" msgstr "Novo" #: mu/interface/main.py:72 msgid "Create a new Python script." msgstr "Cria um script Python novo." #: mu/interface/main.py:73 msgid "Load" msgstr "Abrir" #: mu/interface/main.py:74 msgid "Load a Python script." msgstr "Abre um script Python." #: mu/interface/main.py:75 msgid "Save" msgstr "Salvar" #: mu/interface/main.py:76 msgid "Save the current Python script." msgstr "Salva o script Python atual." #: mu/interface/main.py:85 msgid "Zoom-in" msgstr "Aumentar" #: mu/interface/main.py:86 msgid "Zoom in (to make the text bigger)." msgstr "Aumenta o tamanho do texto." #: mu/interface/main.py:87 msgid "Zoom-out" msgstr "Diminuir" #: mu/interface/main.py:88 msgid "Zoom out (to make the text smaller)." msgstr "Diminui o tamanho do texto." #: mu/interface/main.py:89 msgid "Theme" msgstr "Tema" #: mu/interface/main.py:90 msgid "Toggle theme between day, night or high contrast." msgstr "Altera o tema do Mu entre dia, noite e alto contraste." #: mu/interface/main.py:93 msgid "Check" msgstr "Verificar" #: mu/interface/main.py:94 msgid "Check your code for mistakes." msgstr "Verifica seu código em busca de erros." #: mu/interface/main.py:95 msgid "Help" msgstr "Ajuda" #: mu/interface/main.py:96 msgid "Show help about Mu in a browser." msgstr "Mostra a ajuda do Mu no navegador." #: mu/interface/main.py:97 msgid "Quit" msgstr "Sair" #: mu/interface/main.py:98 msgid "Quit Mu." msgstr "Fecha o Mu." #: mu/interface/main.py:177 msgid "Mu {}" msgstr "Mu {}" #: mu/interface/main.py:353 msgid "Cannot connect to device on port {}" msgstr "A conexão com o dispositivo na porta {} falhou." #: mu/interface/main.py:375 msgid "Filesystem on micro:bit" msgstr "Arquivos no micro:bit" #: mu/interface/main.py:434 msgid "Python3 data tuple" msgstr "Tupla de dados do Python 3" #: mu/interface/main.py:446 msgid "Python3 (Jupyter)" msgstr "Python 3 (Jupyter)" #: mu/interface/main.py:453 msgid "{} REPL" msgstr "REPL {}" #: mu/interface/main.py:469 msgid "{} Plotter" msgstr "Gráfico {}" #: mu/interface/main.py:510 msgid "Running: {}" msgstr "Em execução: {}" #: mu/interface/main.py:534 msgid "Debug Inspector" msgstr "Inspector de Depuração" #: mu/interface/main.py:552 msgid "Name" msgstr "Nome" #: mu/interface/main.py:552 msgid "Value" msgstr "Valor" #: mu/interface/main.py:569 msgid "(A list of {} items.)" msgstr "(Uma lista de {} elementos)" #: mu/interface/main.py:581 msgid "(A dict of {} items.)" msgstr "(Um dicionário de {} elementos)" #: mu/interface/main.py:718 msgid "Mu" msgstr "Mu" #: mu/interface/main.py:967 msgid "Mu's current mode of behaviour." msgstr "Modo atual de operação do Mu." #: mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "O arquivo já existe; deseja substituí-lo?" #: mu/interface/panes.py:297 msgid "File already exists" msgstr "O arquivo já existe" #: mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "Copiando '{}' para o micro:bit." #: mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "'{}' copiado com sucesso para o micro:bit." #: mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "Excluir (não pode ser desfeito)" #: mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "Excluindo '{}' do micro:bit." #: mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "'{}' excluido com sucesso do micro:bit." #: mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "Transferindo '{}' do micro:bit. Copiando para '{}'." #: mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "A cópia de '{}' do micro:bit para o computador foi completada com sucesso." #: mu/interface/panes.py:409 msgid "Open in Mu" msgstr "Abrir no Mu" #: mu/interface/panes.py:411 msgid "Open" msgstr "Abrir" #: mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "Abrindo '{}'" #: mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "Arquivos no micro:bit:" #: mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "Arquivos no computador:" #: mu/interface/panes.py:527 msgid "" "There was a problem getting the list of files on the micro:bit. Please check " "Mu's logs for technical information. Alternatively, try unplugging/plugging-" "in your micro:bit and/or restarting Mu." msgstr "" "Falha ao obter a lista de arquivos no micro:bit. Por favor verifica o log " "do Mu para obter detalhes técnicos. Alternativamente, tente desconectar e " "reconectar o teu micro:bit ou tenta reiniciar o Mu." #: mu/interface/panes.py:538 msgid "" "There was a problem copying the file '{}' onto the micro:bit. Please check " "Mu's logs for more information." msgstr "" "Houve uma falha ao copiar o arquivo '{}' para o micro:bit. Verifique os logs " "do Mu para mais informação." #: mu/interface/panes.py:546 msgid "" "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Houve uma falha ao excluir o arquivo '{}' do micro:bit. Verifique os logs do " "Mu para mais informação." #: mu/interface/panes.py:554 msgid "" "There was a problem getting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Houve uma falha ao transferir o arquivo '{}' do micro:bit. Verifique os logs " "do Mu para mais informação." #: mu/logic.py:69 msgid "Hello, World!" msgstr "Olá, Mundo!" #: mu/logic.py:70 msgid "" "This editor is free software written in Python. You can modify it, add " "features or fix bugs if you like." msgstr "" "Este programa é um software livre escrito em Python. Você pode modificá-lo, " "acrescentar funcionalidades ou corrigir falhas se você desejar." #: mu/logic.py:72 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "Este programa chama-se Mu (podes dizer 'Mu' ou, em Inglês, 'Miu')." #: mu/logic.py:73 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "" "Google, Facebook, NASA, Pixar, Disney e muitas outras organizações utilizam " "Python." # Desafio: evitar o femenino/masculino "serás um feiticeiro/feiticeira". #: mu/logic.py:74 msgid "" "Programming is a form of magic. Learn to cast the right spells with code and " "you'll be a wizard." msgstr "" "Programar é uma espécie de magia. Aprenda a lançar as magias certas e você" "será um especialista em feitiçaria." #: mu/logic.py:76 msgid "" "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your " "computer! :-)" msgstr "" "REPL vem do Inglês, Read (ler), Evaluate (avaliar), Print (imprimir), Loop " "(ciclo). É uma forma fácil e divertida de falar com o computador! :-)" #: mu/logic.py:78 msgid "Be brave, break things, learn and have fun!" msgstr "Sê valente, quebre as coisas, aprenda e diverte-te!" #: mu/logic.py:79 msgid "Make your software both useful AND fun. Empower your users." msgstr "Torne os seus programas úteis E divertidos. Empodere os seus usuários." #: mu/logic.py:80 msgid "For the Zen of Python: import this" msgstr "Para obter o Zen do Python: import this" #: mu/logic.py:81 msgid "Diversity promotes creativity." msgstr "A diversidade promove a criatividade." #: mu/logic.py:82 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "" "Uma mente aberta, espírito de aventura e respeito pela diversidade são " "fundamentais." #: mu/logic.py:83 msgid "" "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "" "Não se preocupe se não funcionar. Aprende a lição, faça as correções e tente " "outra vez! :-)" #: mu/logic.py:85 msgid "Coding is collaboration." msgstr "Programar é colaborar." #: mu/logic.py:86 msgid "Compliment and amplify the good things with code." msgstr "Complemente e amplie as coisas boas com os seus programas." #: mu/logic.py:87 msgid "" "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "" "Teoricamente, a teoria e a prática são a mesma coisa. Na prática, não " "são. ;-)" #: mu/logic.py:89 msgid "Debugging is twice as hard as writing the code in the first place." msgstr "Depurar é duas vezes mais difícil que escrever o código." #: mu/logic.py:90 msgid "It's fun to program." msgstr "Programar é divertido." #: mu/logic.py:91 msgid "Programming has more to do with problem solving than writing code." msgstr "" "Programar tem mais que ver com resolver problemas do que com escrever código." #: mu/logic.py:92 msgid "Start with your users' needs." msgstr "Comece pelas necessidades dos seus usuários." #: mu/logic.py:93 msgid "Try to see things from your users' point of view." msgstr "Tente ver as coisas pela perspectiva dos teus usuários." #: mu/logic.py:94 msgid "Put yourself in your users' shoes." msgstr "Coloque-se no lugar dos seus usuários." #: mu/logic.py:95 msgid "" "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "" "Explicar um problema de programação a um amigo ou amiga revela, muitas " "vezes, a solução. :-)" #: mu/logic.py:97 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "" "Se você não sabe, pergunta. Não tem ninguém a quem perguntar? Então procure." #: mu/logic.py:98 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "A complexidade é o inimigo. Mantenha as coisas simples!" #: mu/logic.py:99 msgid "Beautiful is better than ugly." msgstr "Bonito é melhor que feio." #: mu/logic.py:100 msgid "Explicit is better than implicit." msgstr "Explícito é melhor que implícito." #: mu/logic.py:101 msgid "Simple is better than complex. Complex is better than complicated." msgstr "Simples é melhor que complexo. Complexo é melhor que complicado." # This was a really tough one (actually, most of the Zen of Python is, in the context of beginners, I'd say) # Would love to discuss with someone: in particular with educators. #: mu/logic.py:102 msgid "Flat is better than nested." msgstr "Uma estrutura linear é melhor que uma hierárquica." #: mu/logic.py:103 msgid "Sparse is better than dense." msgstr "Esparso é melhor que denso." #: mu/logic.py:104 msgid "Readability counts." msgstr "A legibilidade conta." #: mu/logic.py:105 msgid "" "Special cases aren't special enough to break the rules. Although " "practicality beats purity." msgstr "" "Os casos especiais não são suficientemente especiais para infringir as " "regras. Embora o sentido prático possa superar a pureza." #: mu/logic.py:107 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "" "Os erros nunca devem ser silenciosos. A não ser que sejam explicitamente " "silenciados." #: mu/logic.py:108 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "Perante a ambiguidade, rejeite a tentação de adivinhar." #: mu/logic.py:109 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "" "Deve haver uma -- e de preferência apenas uma -- forma óbvia de fazer as " "coisas." #: mu/logic.py:110 msgid "" "Now is better than never. Although never is often better than *right* now." msgstr "" "Agora é melhor que nunca. Embora nunca seja muitas vezes melhor que *agora* " "mesmo." #: mu/logic.py:112 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "Se a implementação é difícil de explicar, é uma má ideia." #: mu/logic.py:113 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "" "Se a implementação é fácil de explicar, pode ser que seja uma boa ideia." #: mu/logic.py:114 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "Os espaços de nomes são uma ótima ideia -- vamos fazer mais dessas!" #: mu/logic.py:115 msgid "Mu was created by Nicholas H.Tollervey." msgstr "O Mu foi criado por Nicholas H. Tollervey." #: mu/logic.py:116 msgid "To understand what recursion is, you must first understand recursion." msgstr "" "Para entender o que é recursão, você precisa primeiro entender o que é " "recursão." #: mu/logic.py:117 msgid "" "Algorithm: a word used by programmers when they don't want to explain what " "they did." msgstr "" "Algoritmo: uma palavra utilizada por programadores quando não sabem explicar " "o que fizeram." #: mu/logic.py:119 msgid "Programmers count from zero." msgstr "Programadores começam a contar a partir do zero." #: mu/logic.py:120 msgid "Simplicity is the ultimate sophistication." msgstr "A simplicidade é a forma mais evoluída de sofisticação." #: mu/logic.py:121 msgid "A good programmer is humble." msgstr "Um bom programador (ou programadora!) é humilde." #: mu/logic.py:122 msgid "A good programmer is playful." msgstr "" "Uma boa programadora é divertida! (e um bom programador é divertido, claro!)" #: mu/logic.py:123 msgid "A good programmer learns to learn." msgstr "Um bom programador (ou programadora, claro!) aprende a aprender." #: mu/logic.py:124 msgid "A good programmer thinks beyond the obvious." msgstr "" "Uma boa programadora pensa para além do óbvio. (e um bom programador também)" #: mu/logic.py:125 msgid "A good programmer promotes simplicity." msgstr "Um bom programador promove a simplicidade (e uma boa programadora também)" #: mu/logic.py:126 msgid "A good programmer avoids complexity." msgstr "Uma boa programadora (ou programador) evita a complexidade." #: mu/logic.py:127 msgid "A good programmer is patient." msgstr "Programar bem é ser paciente." #: mu/logic.py:128 msgid "A good programmer asks questions." msgstr "Programar bem passa por fazer perguntas." #: mu/logic.py:129 msgid "A good programmer is willing to say, 'I don't know'." msgstr "Programar bem significa estar disposto a dizer 'eu não sei'." #: mu/logic.py:130 msgid "Wisest are they that know they know nothing." msgstr "Sábios são aqueles que sabem que nada sabem." #: mu/logic.py:442 msgid " above this line" msgstr " acima desta linha" #: mu/logic.py:487 msgid "" "Syntax error. Python cannot understand this line. Check for missing " "characters!" msgstr "" "Erro de sintaxe. O Python não entende esta linha. Verifique se faltam algumas " "letras ou símbolos!" #: mu/logic.py:677 msgid "# Write your code here :-)" msgstr "# Escreva o seu código aqui :-)" #: mu/logic.py:715 msgid "" "The file contains characters Mu expects to be encoded as {0} or as the " "computer's default encoding {1}, but which are encoded in some other way.\n" "\n" "If this file was saved in another application, re-save the file via the " "'Save as' option and set the encoding to {0}" msgstr "" "O arquivo contém caracteres que o Mu espera estarem codificados como {0} ou " "{1} (o padrão do sistema), mas que parecem estar codificados de " "outra forma.\n" "\n" "Se o arquivo foi produzido por outro programa ou aplicação, tenta voltar a " "salvá-lo com a codificação {0}." #: mu/logic.py:731 msgid "The file \"{}\" is already open." msgstr "O arquivo '{}' já está aberto." #: mu/logic.py:743 msgid "Mu cannot read the characters in {}" msgstr "O Mu não consegue ler os caracteres em {}" #: mu/logic.py:766 msgid "Mu was not able to open this file" msgstr "O Mu não conseguiu abrir este arquivo" #: mu/logic.py:767 msgid "" "Currently Mu only works with Python source files or hex files created with " "embedded MicroPython code." msgstr "" "O Mu só trabalha com arquivos fontes Python ou arquivos \"hex\" com código " "MicroPython embutidos." #: mu/logic.py:773 msgid "Could not load {}" msgstr "Não foi possível abrir {}" #: mu/logic.py:775 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "Este arquivo existe?\n" "Em caso afirmativo, será que você tem permissões para lê-lo?\n" "\n" "Verifique por favor e tenta novamente." #: mu/logic.py:781 msgid "Is this a {} file?" msgstr "Este é um arquivo {}?" #: mu/logic.py:782 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "Parece que este é um arquivo {}\n" "\n" "Deseja alterar o Mu para o modo {}?" #: mu/logic.py:854 msgid "Could not save file (disk problem)" msgstr "Não foi possível salvar o arquivo (problema no disco)" #: mu/logic.py:855 msgid "" "Error saving file to disk. Ensure you have permission to write the file and " "sufficient disk space." msgstr "" "Erro ao salvar o arquivo no disco. Verifica que você tem permissões para " "salvar o arquivo e que há espaço livre disponível." #: mu/logic.py:859 msgid "Could not save file (encoding problem)" msgstr "Não foi possível salvar o arquivo (problema de codificação)" #: mu/logic.py:861 msgid "" "Unable to convert all the characters. If you have an encoding line at the " "top of the file, remove it and try again." msgstr "" "Não foi possível converter todos os caracteres. Se existe uma linha de " "codificação no topo do arquivo, remove-a e tenta novamente." #: mu/logic.py:870 msgid "Saved file: {}" msgstr "Arquivo salvo: {}" #: mu/logic.py:899 mu/logic.py:1237 msgid "You cannot use the filename \"{}\"" msgstr "Você não pode utilizar o nome \"{}\"" #: mu/logic.py:901 msgid "" "This name is already used by another part of Python. If you use this name, " "things are likely to break. Please try again with a different filename." msgstr "" "Este nome é utilizado por outra parte do Python. Se você utilizar este nome, " "provavelmente algumas coisas vão falhar. Tenta novamente com um nome " "diferente, por favor." #: mu/logic.py:976 msgid "Good job! No problems found." msgstr "Bom trabalho! Nenhum problema encontrado." #: mu/logic.py:977 msgid "Hurrah! Checker turned up no problems." msgstr "Boa! A verificação não encontrou nenhum problema." #: mu/logic.py:978 msgid "Nice one! Zero problems detected." msgstr "Boa! Zero problemas detectados." #: mu/logic.py:979 msgid "Well done! No problems here." msgstr "Bem feito! Não há problemas por aqui." #: mu/logic.py:980 msgid "Awesome! Zero problems found." msgstr "Maravilhoso! Zero problemas encontrados." #: mu/logic.py:1007 msgid "" "There is un-saved work, exiting the application will cause you to lose it." msgstr "Você tem trabalho não salvo. Se sair do Mu você irá perdê-los." #: mu/logic.py:1060 msgid "Could not find MicroPython runtime." msgstr "O \"runtime\" MicroPython não foi encontrado." #: mu/logic.py:1061 msgid "" "The micro:bit runtime you specified ('{}') does not exist. Please try again." msgstr "" "O \"runtime\" micro:bit que você indicou ({}) não existe. Tenta novamente, por " "favor." #: mu/logic.py:1131 msgid "Changed to {} mode." msgstr "Alterador para o modo {}." #: mu/logic.py:1176 msgid "Detected new {} device." msgstr "Detectado um novo dispositivo {}." #: mu/logic.py:1183 msgid "Would you like to change Mu to the {} mode?" msgstr "Você quer alterar o Mu para o modo {}?" #: mu/logic.py:1218 msgid "Cannot Set Breakpoint." msgstr "Não posso marcar o ponto de interrupção." #: mu/logic.py:1219 msgid "" "Lines that are comments or some multi-line statements cannot have " "breakpoints." msgstr "" "As linhas de comentário e alguns comandos multi-linha não podem ser marcados " "como pontos de interrupção." #: mu/logic.py:1239 msgid "" "This name is already used by another part of Python. If you use that name, " "things are likely to break. Please try again with a different filename." msgstr "" "Este nome é utilizado por outra parte do Python. Se você utilizá-lo, " "provavelmente algumas coisas vão falhar. Tenta novamente com um nome " "diferente, por favor." #: mu/logic.py:1256 msgid "Could not rename file." msgstr "Não foi possível alterar o nome do arquivo." #: mu/logic.py:1257 msgid "A file of that name is already open in Mu." msgstr "Já existe um arquivo aberto pelo Mu com esse nome." #: mu/logic.py:1286 msgid "Replaced \"{}\" with \"{}\"." msgstr "\"{}\" substituído por \"{}\"." #: mu/logic.py:1290 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "{} substituições: \"{}\" por \"{}\"." #: mu/logic.py:1295 mu/logic.py:1302 msgid "Could not find \"{}\"." msgstr "Não foi possível encontrar \"{}\"." #: mu/logic.py:1300 msgid "Highlighting matches for \"{}\"." msgstr "Realce das correspondências com \"{}\"." #: mu/logic.py:1305 msgid "You must provide something to find." msgstr "Você tem que indicar algo para localizar." #: mu/logic.py:1306 msgid "Please try again, this time with something in the find box." msgstr "Tenta novamente, por favor, desta vez com algo na caixa de localização." #: mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "CircuitPython da Adafruit" #: mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "Usar CircuitPython com dispositivos da Adafruit." #: mu/modes/adafruit.py:64 msgid "Serial" msgstr "Serial" #: mu/modes/adafruit.py:65 msgid "Open a serial connection to your device." msgstr "Abrir uma conexão serial com o seu dispositivo." #: mu/modes/adafruit.py:72 mu/modes/microbit.py:215 mu/modes/python3.py:136 msgid "Plotter" msgstr "Gráfico" #: mu/modes/adafruit.py:73 mu/modes/microbit.py:216 msgid "Plot incoming REPL data." msgstr "Mostra um gráfico com dados obtidos a partir do REPL." #: mu/modes/adafruit.py:143 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "Não foi possível encontrar um dispositivo Adafruit conectado." #: mu/modes/adafruit.py:145 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. " "Therefore, to edit these files you need to have the device plugged in. Until " "you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Os arquivos Python para dispositivos da Adafruit com CircuitPython são " "armazenados no próprio dispositivo. Assim sendo, para os alterar você terá que " "ligá-lo. Entretanto, o Mu utiliza esta pasta para guardar os seus scripts:\n" "\n" "{}" #: mu/modes/base.py:169 msgid "Data Flood Detected!" msgstr "Detectada informação excessiva!" #: mu/modes/base.py:170 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. " "As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent " "to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls " "to 'sleep' for a very short period of time." msgstr "" "O gráfico recebeu informação excessiva, o que pode bloquear o Mu ou torná-lo " "muito lento. Como ressalva, o gráfico foi interrompido.\n" "\n" "A informação é considerada excessiva quando blocos de informação superiores " "a 1024 bytes são enviados repetidamente para o gráfico.\n" "Uma solução possível é garantir que o código imprima tuplas de informação " "pequenas, intervaladas com chamadas 'sleep' por curtos períodos de tempo." #: mu/modes/base.py:262 mu/modes/base.py:301 msgid "" "Click on the device's reset button, wait a few seconds and then try again." msgstr "" "Pressiona o botão de RESET no dispositivo, espera uns segundos e tenta " "novamente." #: mu/modes/base.py:268 mu/modes/base.py:307 msgid "Could not find an attached device." msgstr "Não foi possível encontrar um dispositivo conectado." #: mu/modes/base.py:269 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Por favor, verifica que o dispositivo está conectado ao computador.\n" "\n" "O dispositivo precisa ter uma versão do MicroPython (ou CircuitPython) embutida " "antes do REPL poder funcionar.\n" "\n" "Por último, pressione o botão de RESET no dispositivo e espera alguns segundos " "antes de tentar novamente." #: mu/modes/base.py:308 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Por favor, verifica que o dispositivo está conectado ao computador.\n" "\n" "O dispositivo precisa ter uma versão do MicroPython (ou CircuitPython) embutida " "antes do Gráfico poder funcionar.\n" "\n" "Por último, pressione o botão de RESET no dispositivo e espera alguns segundos " "antes de tentar novamente." #: mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "Depurador Visual" #: mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "Depurar o seu código Python 3." #: mu/modes/debugger.py:50 mu/modes/pygamezero.py:109 mu/modes/python3.py:166 msgid "Stop" msgstr "Parar" #: mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "Interrompe a execução do código." #: mu/modes/debugger.py:57 msgid "Continue" msgstr "Continuar" #: mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "Continua a execução do seu código Python." #: mu/modes/debugger.py:64 msgid "Step Over" msgstr "Avançar" #: mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "Avança para a linha de código seguinte." #: mu/modes/debugger.py:71 msgid "Step In" msgstr "Para Dentro" #: mu/modes/debugger.py:72 msgid "Step into a function." msgstr "Avança para dentro da função." #: mu/modes/debugger.py:78 msgid "Step Out" msgstr "Para Fora" #: mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "Avança até sair da função." #: mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "O seu script terminou." #: mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "" "Falha ao conectar ao depurador Python.\n" "\n" #: mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "Informação do depurador: {}" #: mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "Aviso do depurador: {}" #: mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "Erro do depurador: {}" #: mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "micro:bit" #: mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "Escrever MicroPython para um micro:bit." #: mu/modes/microbit.py:192 msgid "Flash" msgstr "Transferir" #: mu/modes/microbit.py:193 msgid "Flash your code onto the micro:bit." msgstr "Transfere o seu código para o micro:bit." #: mu/modes/microbit.py:199 msgid "Files" msgstr "Arquivos" #: mu/modes/microbit.py:200 msgid "Access the file system on the micro:bit." msgstr "Acesse os arquivos no micro:bit." #: mu/modes/microbit.py:206 mu/modes/python3.py:127 msgid "REPL" msgstr "REPL" #: mu/modes/microbit.py:207 msgid "Use the REPL to live-code on the micro:bit." msgstr "Usa o REPL para programar diretamente no micro:bit." #: mu/modes/microbit.py:257 msgid "Unable to flash \"{}\"" msgstr "Não foi possível transferir \"{}\"" #: mu/modes/microbit.py:267 msgid "Problem with script" msgstr "Problema com o script" #: mu/modes/microbit.py:268 msgid "{} [{}:{}]" msgstr "{} [{}:{}]" #: mu/modes/microbit.py:278 msgid "Our minifier tried but your script is too long!" msgstr "O compactador tentou, mas o seu script é muito grande!" #: mu/modes/microbit.py:283 msgid "Your script is too long and the minifier isn't available" msgstr "O seu script é muito grande e o compactador não está disponível" #: mu/modes/microbit.py:288 msgid "Your script is too long!" msgstr "O seu script é muito grande!" #: mu/modes/microbit.py:368 msgid "Flashing \"{}\" onto the micro:bit." msgstr "Transferindo \"{}\" para o micro:bit." # No obvious translation for runtime. Went technical, but quoted. #: mu/modes/microbit.py:370 msgid " Runtime: {}" msgstr " \"Runtime\": {}" #: mu/modes/microbit.py:416 msgid "Unsupported BBC micro:bit." msgstr "Este micro:bit não é suportado." #: mu/modes/microbit.py:417 msgid "" "Your device is newer than this version of Mu. Please update Mu to the latest " "version to support this device.\n" "\n" "https://codewith.mu/" msgstr "" "O seu dispositivo é mais recente que esta versão do Mu. Por favor, atualize " "o Mu para a última versão para suporta este dispositivo.\n" "\n" "https://codewith.mu/" #: mu/modes/microbit.py:453 mu/modes/microbit.py:589 msgid "Could not find an attached BBC micro:bit." msgstr "Não foi possível encontrar um micro:bit conectado." #: mu/modes/microbit.py:454 msgid "" "Please ensure you leave enough time for the BBC micro:bit to be attached and " "configured correctly by your computer. This may take several seconds. " "Alternatively, try removing and re-attaching the device or saving your work " "and restarting Mu if the device remains unfound." msgstr "" "Por favor assegure que você dê tempo suficiente ao computador para detectar e " "identificar o micro:bit. Isto pode levar vários segundos. Alternativamente, " "tente desconectar e reconectar o dispositivo ou salve o seu trabalho e " "reinicie o Mu." #: mu/modes/microbit.py:468 msgid "Finished flashing." msgstr "Transferência completada." #: mu/modes/microbit.py:503 msgid "Copied code onto micro:bit." msgstr "Código copiado para o micro:bit." #: mu/modes/microbit.py:512 msgid "There was a problem flashing the micro:bit." msgstr "Houve uma falha na transferência para o micro:bit." #: mu/modes/microbit.py:513 msgid "" "Please do not disconnect the device until flashing has completed. Please " "check the logs for more information." msgstr "" "Por favor não desligue o dispositivo até que a transferência seja " "completada. Verifica o log para mais informação." #: mu/modes/microbit.py:534 msgid "REPL and file system cannot work at the same time." msgstr "O REPL e os arquivos não podem ser utilizados ao mesmo tempo." #: mu/modes/microbit.py:535 msgid "" "The REPL and file system both use the same USB serial connection. Only one " "can be active at any time. Toggle the file system off and try again." msgstr "" "O REPL e os arquivos utilizam a mesma conexão USB. Só um deles pode estar " "ativo de cada vez. Desative os arquivos e tenta novamente." #: mu/modes/microbit.py:552 msgid "The plotter and file system cannot work at the same time." msgstr "O gráfico e os arquivos não podem ser utilizados ao mesmo tempo." #: mu/modes/microbit.py:554 msgid "" "The plotter and file system both use the same USB serial connection. Only " "one can be active at any time. Toggle the file system off and try again." msgstr "" "O gráfico e os arquivos utilizam a mesma conexão USB. Só um deles pode " "estar ativo de cada vez. Desative os arquivos e tenta novamente." #: mu/modes/microbit.py:566 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "" "Os arquivos não podem ser utilizados ao mesmo tempo com o REPL ou com o " "gráfico." #: mu/modes/microbit.py:568 msgid "" "The file system and the REPL and plotter use the same USB serial connection. " "Toggle the REPL and plotter off and try again." msgstr "" "Os arquivos, REPL e gráfico utilizam a mesma conexão USB. Só um deles pode " "estar ativo de cada vez. Desativa o REPL e o gráfico e tenta novamente." #: mu/modes/microbit.py:590 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will " "work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Assegure que o dispositivo está conectado ao computador.\n" "\n" "O dispositivo tem que ter o MicroPython previamente transferido antes dos " "arquivos poderem funcionar.\n" "\n" "Por último, pressiona o botão RESET no dispositivo, aguarde alguns segundos e " "tenta novamente." #: mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "Pygame Zero" #: mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "Criar jogos com o Pygame Zero." #: mu/modes/pygamezero.py:51 mu/modes/pygamezero.py:101 msgid "Play" msgstr "Jogar" #: mu/modes/pygamezero.py:52 mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "Inicia o seu jogo Pygame Zero." #: mu/modes/pygamezero.py:58 msgid "Images" msgstr "Imagens" #: mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "Mostra as imagens utilizadas pelo Pygame Zero." #: mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "Fontes" #: mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "Mostra as fontes utilizados pelo Pygame Zero." #: mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "Sons" #: mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "Mostra os sons utilizados pelo Pygame Zero." #: mu/modes/pygamezero.py:79 msgid "Music" msgstr "Música" #: mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "Mostra as músicas utilizadas pelo Pygame Zero." #: mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "Pára o seu jogo Pygame Zero." #: mu/modes/python3.py:97 msgid "Python 3" msgstr "Python 3" #: mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "Criar código Python 3." #: mu/modes/python3.py:113 mu/modes/python3.py:158 msgid "Run" msgstr "Executar" #: mu/modes/python3.py:114 mu/modes/python3.py:159 msgid "Run your Python script." msgstr "Executa o seu script Python." #: mu/modes/python3.py:120 msgid "Debug" msgstr "Depurar" #: mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "Depura o seu script Python." #: mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "" "Usa o REPL para experimentar Python linha a linha, com respostas imediatas." #: mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "" "Mostra um gráfico dos dados produzidos pelo seu script Python ou pelo REPL." #: mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "Pára o teu script Python." #: mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "Iniciando o REPL iPython." # Not sure what/why "this may take a short amount of time" means in this context. Omited, for brevity. #: mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "Parando o REPL iPython (isto pode demorar algum tempo)." #: mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL iniciado." #: mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL terminado." mu-editor-1.0.2+dfsg/mu/locale/pt_PT/000077500000000000000000000000001341747546300172625ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/pt_PT/LC_MESSAGES/000077500000000000000000000000001341747546300210475ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/pt_PT/LC_MESSAGES/mu.mo000066400000000000000000000745471341747546300220460ustar00rootroot00000000000000[ &))*?!j$4 "?&b,(TDK +#5YKxJG7`1j5#>b~#9) "6XY"&%$A fer7J2\B7aVKb >g L ! !")!@L!!!!!!!!"# "!."P"l""r"-""?" # 3#A#F#&e#@#:#7$@$9G$J$$R$2%NG%%% %%;%#&<&A&D&#V&'z&!&&&&&@&6'!:'J\''(' ' '/'d(((m()!*+,J,;@-'|-----B-`9.". ...////0 020YA0 0 000 00&1,101 H1T1Y1y1 11 1#1$1#2$)2BN2*222[2<3Z3q3y3 3333333 4=%4=c4O445/6N6{U7L7898O8;:JA:E:j:b=;+;a;.<5<h%==!>E>1>1,?+^?s??@/.@^@+|@@@K@,A+DA(pA A#AA!aB8BB"B$BC%C.C 7CBC JCVUCDD D*D&EAE_E4wE(E;E1FCFNbF:F@FO-GO}G!GG\ HVfHH HHCIEI"`I.I"IMI#J 7J&AJRhJJ7J: KFK K%K!L(LHL,\L.L#L$L!M#M(=M4fM<MMM NSN!kN NN$N+NOO59OoOBOOO!P%$PyJP_P$QVQ`Q$\RR)RSR SS8SPSgS }SS S)S#S4S 0T);T5eT-TUTU 3U@U&FU,mULU?UM'VuV9}VUV WD(WmWlWWW X Xg?X+XXXX*X+Y'HYpYvYYY=YYYSYSZ.YZ Z Z7ZgZA[G[zf[[\] _N`CU`L`6`a&a0j!j k!lQlmCmmo@oRoi7pep3qd;qqCirr/ssPmt9t9t:2umuu!v00vKav4vv%v<w.Kw#zw'ww!wjxsxCxx!xy-y6y?y HyTy \yi" 2.4s{#*]_hAN>` Yea'Of|Wo}G%L-1,qy)7J8 k( HCbUmlX&<RK ^\Q~Ixj9Pn0:v$3DBdp?=M6w@tcSFZV/T5uE!g +[rz; Runtime: {} above this line# Write your code here :-)'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Adafruit CircuitPythonAlgorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.Awesome! Zero problems found.BBC micro:bitBBC micro:bit SettingsBe brave, break things, learn and have fun!Beautiful is better than ugly.Cannot Set Breakpoint.Cannot connect to device on port {}Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copied code onto micro:bit.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Debugging is twice as hard as writing the code in the first place.Delete (cannot be undone)Deleting '{}' from micro:bit.Detected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.File already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFor the Zen of Python: import thisGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHello, World!HelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)Is this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.Lines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.Minify Python code before flashing?ModeMuMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu {}Mu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.Now is better than never. Although never is often better than *right* now.OpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):PlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Pygame ZeroPython 3Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 (Jupyter)Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPLREPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.Replace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaveSave the current Python script.Saved file: {}Select ModeSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.Syntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way. If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The micro:bit runtime you specified ('{}') does not exist. Please try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.To understand what recursion is, you must first understand recursion.Toggle theme between day, night or high contrast.Try to see things from your users' point of view.Unable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unsupported BBC micro:bit.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You cannot use the filename "{}"You must provide something to find.Your device is newer than this version of Mu. Please update Mu to the latest version to support this device. https://codewith.mu/Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-outuntitled{} Plotter{} REPL{} [{}:{}]Project-Id-Version: POT-Creation-Date: 2018-07-15 12:49+0100 PO-Revision-Date: 2018-07-15 20:32+0100 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 X-Generator: Poedit 2.0.9 Last-Translator: Plural-Forms: nplurals=2; plural=(n != 1); Language: pt_PT "Runtime": {} acima desta linha# Escreve o teu código aqui :-)'{}' copiado com sucesso para o micro:bit.'{}' apagado com sucesso do micro:bit.(dicionário de {} elementos)(lista de {} elementos)Já existe um ficheiro aberto pelo Mu com esse nome.Programar bem passa por fazer perguntas.Uma boa programadora (ou programador) evita a complexidade.Um bom programador (ou programadora!) é humilde.Programar bem é ser paciente.Uma boa programadora é divertida! (e um bom programador é divertido, claro!)Programar bem significa estar disposto a dizer 'não sei'.Um bom programador (ou programadora, claro!) aprende a aprender.Um bom programador promove a simplicidade (e uma boa programadora, pois não!).Uma boa programadora pensa para além do óbvio. (e um bom programador também)Acede aos ficheiros no micro:bit.CircuitPython da AdafruitAlgoritmo: uma palavra utilizada por programadores quando não sabem explicar o que fizeram.Uma mente aberta, espírito de aventura e respeito pela diversidade são fundamentais.Maravilhoso! Tens zero enganos.micro:bitDefinições do micro:bitSê valente, sem medo de partir estas coisas, aprende e diverte-te!Bonito é melhor que feio.Não posso marcar a interrupção.A ligação ao dispositivo na porta {} falhou.Altera o Modo de operação do Mu.Altera o modo em qualquer altura através do botão "Modo", com o logo do Mu.Activado o modo {}.VerificarVerifica se o teu código tem enganos.Pressiona o botão de RESET no dispositivo, espera uns segundos e tenta novamente.Programar é colaborar.A complexidade é o inimigo. Mantém as coisas simples!Complementa e amplia as coisas boas com os teus programas.A tentativa de ligação expirou. Será que o computador está muito lento ou ocupado? Liberta algues recursos do computador e tenta novamente.ContinuarContinua a execução do teu código.Código copiado para o micro:bit.A copiar '{}' para o micro:bit.Não encontro "{}".O "runtime" MicroPython não foi encontrado.Não encontrei um dispositivo Adafruit ligado.Não encontrei um micro:bit ligado.Não encontro um dispositivo ligado.A ligação a 'localhost' falhou.Não consegui carregar {}Não consigo alterar o nome do ficheiro.Não consegui guardar o ficheiro (problema no disco)Não consegui guardar o ficheiro (problema de codificação)Cria um script Python novo.Criar código Python 3.Log ActualO Mu só trabalha com ficheiros Python ou ficheiros "hex" com MicroPython embebido.Detectada informação excessiva!DiagnósticoInspector de DiagnósticoDiagnosticar o teu código Python 3.Inicia o diagnóstico do teu script Python.Erro Diagnóstico: {}Informação Diagnóstico: {}O diagnóstico necessita do nome de um script Python.Aviso Diagnóstico: {}Fazer diagnósticos é muito mais difícil que escrever o código.Apagar (não podes desfazer)A apagar '{}' do micro:bit.Detectado um novo dispositivo {}.A diversidade promove a criatividade.Este ficheiro existe? Em caso afirmativo, será que tens permissões para o ler? Verifica, por favor, e tenta novamente.Não te preocupes se não funcionar. Aprende a lição, faz correcções e tenta outra vez! :-)Erro ao guardar o ficheiro no disco. Verifica que tens permissões para guardar o ficheiro e que há espaço livre disponível.Os erros nunca devem ser silenciosos. A não ser que sejam explicitamente silenciados.Explicar um problema de programação a um amigo ou amiga revela, muitas vezes, a solução. :-)Explícito é melhor que implícito.O ficheiro já existeO ficheiro já existe; escrever por cima?Os ficheiros não podem ser utilizados em simultâneo com o REPL ou com o gráfico.FicheirosFicheiros no computador:Ficheiros no micro:bit:Ficheiros no micro:bitProcurar / SubstituirProcurar:Transferência completada.TransferirTransfere o teu código para o micro:bit.A transferir '{}' para o micro:bit.Uma estrutura linear é melhor que uma hierárquica.TipografiaPara obteres o Zen do Python: import thisA transferir '{}' do micro:bit, com cópia para '{}'.Bom trabalho! Não foram encontrados enganos.Google, Facebook, NASA, Pixar, Disney e muitas outras organizações utilizam Python.Diagnóstico VisualOlá, Mundo!AjudaRealce das correspondências com "{}".Boa! A verificação não encontrou enganos.Se a implementação é fácil de explicar, pode ser que seja uma boa ideia.Se a implementação é difícil de explicar, é uma má ideia.Se não sabes, pergunta. Não tens ninguém a quem perguntar? Então procura.ImagensPerante a ambiguidade, rejeita a tentação de adivinhar.Teoricamente, a teoria e a práctica são a mesma coisa. Na práctica, não são. ;-)Será este um ficheiro {}?Parece que este é um ficheiro {} Queres mudar o Mu para o modo {}?Programar é divertido.As linhas de comentário e alguns comandos multi-linha não podem ser marcados como pontos de interrupção.CarregarCarrega um script Python.Log em {}.Criar jogos com o Pygame Zero.Torna os teus programas úteis e divertidos. Dá novas ferramentas e capacidades aos teus utilizadores.Compactar o código Python antes de enviar?ModoMuAdministração do MuO Mu não consegue ler os caracteres em {}O Mu foi criado pelo Nicholas H. Tollervey.O Mu não conseguiu abrir este ficheiroMu {}Modo de operação do Mu.MúsicaNomeOs espaços de nomes são uma óptima idéia -- vamos a mais!NovoBoa! Zero enganos encontrados.Agora é melhor que nunca. Embora nunca seja muitas vezes melhor que *mesmo* agora.AbrirAbrir uma ligação série ao teu dispositivo.Abrir no MuA abrir '{}'O compactador tentou, mas o teu script é muito grande!Substituir o MicroPython embebido com o seguinte ficheiro 'hex' (se vazio, não haverá substituição)JogarInicia o teu jogo Pygame Zero.Por favor não desligues o dispositivo até que a transferência esteja completada. Verifica o log para mais informação.Garante, por favor, que dás tempo suficiente ao computador para detectar e identificar o micro:bit. Por vezes pode levar vários segundos. Em alternativa, tenta desligar e voltar a ligar o dispositivo ou, guardando o teu trabalho, tenta reiniciar o Mu.Por favor, verifica que o dispositivo está ligado ao computador. Terá que ter uma versão do MicroPython (ou CircuitPython) embebida antes do Gráfico poder funcionar. Por último, pressiona o botão de RESET no dispositivo e espera uns segundos antes de tentares novamente.Por favor, verifica que o dispositivo está ligado ao computador. Terá que ter uma versão do MicroPython (ou CircuitPython) embebida antes do REPL poder funcionar. Por último, pressiona o botão de RESET no dispositivo e espera uns segundos antes de tentares novamente.Garante que o dispositivo está ligado ao computador. O dispositivo tem que ter o MicroPython previamente transferido antes dos ficheiros poderem funcionar. Por último, pressiona o botão RESET no dispositivo, aguarda uns segundos e tenta novamente.Selecciona o modo pretendido e depois faz "OK". Caso contrário, faz "Cancel".Tenta novamente, por favor, desta vez com algo na caixa de procura.Mostra um gráfico dos dados produzidos pelo teu script Python ou pelo REPL.Mostra um gráfico com dados obtidos a partir do REPL.GráficoProblema com o scriptQuem programa começa a contar a partir do zero.Programar tem mais que ver com resolver problemas do que com escrever código.Programar é uma espécie de magia. Aprende a lançar os feitiços certos e serás especialista em feitiçaria.Põe-te no lugar dos teus utilizadores.Pygame ZeroPython 3Os ficheiros Python para dispositivos da Adafruit com CircuitPython são armazenados no próprio dispositivo. Assim sendo, para os alterar terás que o ligar. Entretanto, o Mu utiliza esta pasta para guardar os teus scripts: {}Python 3 (Jupyter)Ambiente Python 3Tuplo Python 3SairFecha o Mu.REPLO REPL e os ficheiros não podem ser utilizados em simultâneo.REPL vem do Inglês, Read (ler), Evaluate (avaliar), Print (imprimir), Loop (ciclo). É uma forma fácil e divertida de falar com o computador! :-)REPL iniciado.REPL terminado.A legibilidade conta.Substituir (opcional):Substituir todos?"{}" substituído por "{}".{} substituições: "{}" por "{}".CorrerExecuta o teu script Python.Em execução: {}GuardarGuarda o script Python visível.Ficheiro guardado: {}Seleciona o modoSérieMostra ajuda acerca do Mu no teu browser web.Mostra os tipos de letra utilizados pelo Pygame Zero.Mostra as imagens utilizadas pelo Pygame Zero.Mostra a música utilizada pelo Pygame Zero.Mostra os sons utilizados pelo Pygame Zero.Simples é melhor que complexo. Complexo é melhor que complicado.A simplicidade é a forma mais evoluída de sofisticação.SonsEsparso é melhor que denso.Os casos especiais não são suficientemente especiais para infringir as regras. Embora o sentido práctico possa superar a pureza.Começa por considerar as necessidades dos teus utilizadores.A iniciar o REPL iPython.Em DetalhePara ForaAdianteAvança para dentro de uma função.Avança até sair da função.Avança para a linha de código seguinte.PararInterrompe a execução do teu código.Pára o teu jogo Pygame Zero.Pára o teu script Python.A parar o REPL iPython.Cópia de '{}' do micro:bit para o computador completada com sucesso.Erro de sintaxe. O Python não entende esta linha. Verifica se faltam algumas letras ou símbolos!O REPL e os ficheiros utilizam a mesma ligação USB. Só um deles pode estar activo de cada vez. Desactiva os ficheiros e tenta novamente.Estas variáveis de ambiente estarão definidas de cada vez que executares um script Python 3. Cada variável deve estar numa linha, sendo definida da forma: NOME=VALORO ficheiro '{}' já está aberto.O ficheiro contém caracteres que o Mu espera estarem codificados como {0} ou {1} (a preferência do computador), mas que parecem estar codificados de outra forma. Se o ficheiro foi produzido por outro programa ou aplicação, tenta voltar a guardá-lo com a codificação {0}.Os ficheiros, REPL e gráfico utilizam a mesma ligação USB. Só um deles pode estar activo de cada vez. Desactiva o REPL e o gráfico, e tenta novamente.O "runtime" micro:bit que indicaste ({}) não existe. Tenta novamente, por favor.O gráfico e os ficheiros utilizam a mesma ligação USB. Só um deles pode estar activo de cada vez. Desactiva os ficheiros e tenta novamente.O gráfico e os ficheiros não podem ser utilizados em simultâneo.O gráfico recebeu informação excessiva, o que pode bloquear o Mu ou torná-lo muito lento. Como salvaguarda, o gráfico foi interrompido. A informação é considerada excessiva quando blocos de informação superiores a 1024 bytes são enviados repetidamente para o gráfico. Uma solução possível é garantir que o código imprime tuplos de informação pequenos, intervalados de invocações 'sleep' por curtos períodos de tempo.AspectoTens trabalho por guardar. Se fechares o Mu, poderás perdê-lo.Deve haver uma -- e de preferência apenas uma -- forma óbvia de fazer as coisas.Houve uma falha a copiar o ficheiro '{}' para o micro:bit. Verifica os logs do Mu para mais informação.Houve uma falha a apagar o ficheiro '{}' no micro:bit. Verifica os logs do Mu para mais informação.Houve uma falha na transferência para o micro:bit.Houve uma falha a obter o ficheiro '{}' do micro:bit. Verifica os logs do Mu para mais informação.Falha ao obter a lista de ficheiros no micro:bit. Por favor verifica o log do Mu para obteres detalhes técnicos. Em alternativa, tenta desligar e voltar ligar o teu micro:bit ou tenta reiniciar o Mu.Este programa chama-se Mu (podes dizer 'Mu' ou, em Inglês, 'Miu').Este programa é software livre, escrito em Python. Podes modificá-lo, acrescentar capacidades, ou corrigir falhas, se quiseres.Este nome é utilizado por outra parte do Python. Se o utilizares, provavelmente algumas coisas vão falhar. Tenta novamente com um nome diferente, por favor.Este nome é utilizado por outra parte do Python. Se o utilizares, provavelmente algumas coisas vão falhar. Tenta novamente com um nome diferente, por favor.Para entender o que é recursão, tens primeiro que entender o que é recursão.Altera o aspecto do Mu entre dia, noite e alto contraste.Tenta ver as coisas na perspectiva dos teus utilizadores.Falha na ligação à ferramenta de diagnóstico Python. Não consegui converter todos os caracteres. Se existe uma linha de codificação no topo do ficheiro, remove-a e tenta novamente.Não consegui transferir "{}"Este micro:bit não é suportado.Usar CircuitPython com dispositivos da Adafruit.Usa o REPL para experimentar Python linha a linha, com respostas imediatas.Usa o REPL para programar directamente no micro:bit.ValorBem feito! Não há enganos por aqui.Quando registares um bug, inclui o conteúdo deste ficheiro.Sábios são aqueles que sabem que nada sabem.Queres alterar o Mu para o modo {}?Escrever MicroPython para um micro:bit.Não podes utilizar o nome '{}'Tens que indicar algo a procurar.O teu dispositivo é mais recente que esta versão do Mu. Por favor, actualiza o Mu. https://codewith.mu/O teu script terminou.O teu script é muito grande e o compactador não está disponívelO teu script é muito grande!Aumenta o tamanho do texto do Mu.Diminui o tamanho do texto Mu.AumentarDiminuirsem nomeGráfico {}REPL {}{} [{}:{}]mu-editor-1.0.2+dfsg/mu/locale/pt_PT/LC_MESSAGES/mu.po000066400000000000000000001126541341747546300220410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2018-07-15 12:49+0100\n" "PO-Revision-Date: 2018-07-15 20:32+0100\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 2.0.9\n" "Last-Translator: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: pt_PT\n" #: mu/app.py:66 msgid "Logging to {}" msgstr "Log em {}." #: mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "O diagnóstico necessita do nome de um script Python." #: mu/debugger/client.py:106 msgid "" "Connection timed out. Is your machine slow or busy? Free up some of the " "machine's resources and try again." msgstr "" "A tentativa de ligação expirou. Será que o computador está muito lento ou " "ocupado? Liberta algues recursos do computador e tenta novamente." #: mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "A ligação a 'localhost' falhou." #: mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "Seleciona o modo" #: mu/interface/dialogs.py:57 msgid "" "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel" "\"." msgstr "" "Selecciona o modo pretendido e depois faz \"OK\". Caso contrário, faz " "\"Cancel\"." #: mu/interface/dialogs.py:73 msgid "" "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "" "Altera o modo em qualquer altura através do botão \"Modo\", com o logo do Mu." #: mu/interface/dialogs.py:107 msgid "" "When reporting a bug, copy and paste the content of the following log file." msgstr "Quando registares um bug, inclui o conteúdo deste ficheiro." #: mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python " "3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "Estas variáveis de ambiente estarão definidas de cada vez que executares um " "script Python 3. Cada variável deve estar numa linha, sendo definida da " "forma:\n" "\n" "NOME=VALOR" #: mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "Compactar o código Python antes de enviar?" #: mu/interface/dialogs.py:153 msgid "" "Override the built-in MicroPython runtime with the following hex file (empty " "means use the default):" msgstr "" "Substituir o MicroPython embebido com o seguinte ficheiro 'hex' (se vazio, " "não haverá substituição)" #: mu/interface/dialogs.py:175 mu/interface/main.py:974 msgid "Mu Administration" msgstr "Administração do Mu" #: mu/interface/dialogs.py:186 msgid "Current Log" msgstr "Log Actual" #: mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Ambiente Python 3" #: mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "Definições do micro:bit" #: mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "Procurar / Substituir" #: mu/interface/dialogs.py:227 msgid "Find:" msgstr "Procurar:" #: mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "Substituir (opcional):" #: mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "Substituir todos?" #: mu/interface/editor.py:222 mu/logic.py:960 msgid "untitled" msgstr "sem nome" #: mu/interface/main.py:68 msgid "Mode" msgstr "Modo" #: mu/interface/main.py:69 msgid "Change Mu's mode of behaviour." msgstr "Altera o Modo de operação do Mu." #: mu/interface/main.py:71 msgid "New" msgstr "Novo" #: mu/interface/main.py:72 msgid "Create a new Python script." msgstr "Cria um script Python novo." #: mu/interface/main.py:73 msgid "Load" msgstr "Carregar" #: mu/interface/main.py:74 msgid "Load a Python script." msgstr "Carrega um script Python." #: mu/interface/main.py:75 msgid "Save" msgstr "Guardar" #: mu/interface/main.py:76 msgid "Save the current Python script." msgstr "Guarda o script Python visível." #: mu/interface/main.py:85 msgid "Zoom-in" msgstr "Aumentar" #: mu/interface/main.py:86 msgid "Zoom in (to make the text bigger)." msgstr "Aumenta o tamanho do texto do Mu." #: mu/interface/main.py:87 msgid "Zoom-out" msgstr "Diminuir" #: mu/interface/main.py:88 msgid "Zoom out (to make the text smaller)." msgstr "Diminui o tamanho do texto Mu." #: mu/interface/main.py:89 msgid "Theme" msgstr "Aspecto" #: mu/interface/main.py:90 msgid "Toggle theme between day, night or high contrast." msgstr "Altera o aspecto do Mu entre dia, noite e alto contraste." #: mu/interface/main.py:93 msgid "Check" msgstr "Verificar" #: mu/interface/main.py:94 msgid "Check your code for mistakes." msgstr "Verifica se o teu código tem enganos." #: mu/interface/main.py:95 msgid "Help" msgstr "Ajuda" #: mu/interface/main.py:96 msgid "Show help about Mu in a browser." msgstr "Mostra ajuda acerca do Mu no teu browser web." #: mu/interface/main.py:97 msgid "Quit" msgstr "Sair" #: mu/interface/main.py:98 msgid "Quit Mu." msgstr "Fecha o Mu." #: mu/interface/main.py:177 msgid "Mu {}" msgstr "Mu {}" #: mu/interface/main.py:353 msgid "Cannot connect to device on port {}" msgstr "A ligação ao dispositivo na porta {} falhou." #: mu/interface/main.py:375 msgid "Filesystem on micro:bit" msgstr "Ficheiros no micro:bit" #: mu/interface/main.py:434 msgid "Python3 data tuple" msgstr "Tuplo Python 3" #: mu/interface/main.py:446 msgid "Python3 (Jupyter)" msgstr "Python 3 (Jupyter)" #: mu/interface/main.py:453 msgid "{} REPL" msgstr "REPL {}" #: mu/interface/main.py:469 msgid "{} Plotter" msgstr "Gráfico {}" #: mu/interface/main.py:510 msgid "Running: {}" msgstr "Em execução: {}" #: mu/interface/main.py:534 msgid "Debug Inspector" msgstr "Inspector de Diagnóstico" #: mu/interface/main.py:552 msgid "Name" msgstr "Nome" #: mu/interface/main.py:552 msgid "Value" msgstr "Valor" #: mu/interface/main.py:569 msgid "(A list of {} items.)" msgstr "(lista de {} elementos)" #: mu/interface/main.py:581 msgid "(A dict of {} items.)" msgstr "(dicionário de {} elementos)" #: mu/interface/main.py:718 msgid "Mu" msgstr "Mu" #: mu/interface/main.py:967 msgid "Mu's current mode of behaviour." msgstr "Modo de operação do Mu." #: mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "O ficheiro já existe; escrever por cima?" #: mu/interface/panes.py:297 msgid "File already exists" msgstr "O ficheiro já existe" #: mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "A copiar '{}' para o micro:bit." #: mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "'{}' copiado com sucesso para o micro:bit." #: mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "Apagar (não podes desfazer)" #: mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "A apagar '{}' do micro:bit." #: mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "'{}' apagado com sucesso do micro:bit." #: mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "A transferir '{}' do micro:bit, com cópia para '{}'." #: mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "Cópia de '{}' do micro:bit para o computador completada com sucesso." #: mu/interface/panes.py:409 msgid "Open in Mu" msgstr "Abrir no Mu" #: mu/interface/panes.py:411 msgid "Open" msgstr "Abrir" #: mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "A abrir '{}'" #: mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "Ficheiros no micro:bit:" #: mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "Ficheiros no computador:" #: mu/interface/panes.py:527 msgid "" "There was a problem getting the list of files on the micro:bit. Please check " "Mu's logs for technical information. Alternatively, try unplugging/plugging-" "in your micro:bit and/or restarting Mu." msgstr "" "Falha ao obter a lista de ficheiros no micro:bit. Por favor verifica o log " "do Mu para obteres detalhes técnicos. Em alternativa, tenta desligar e " "voltar ligar o teu micro:bit ou tenta reiniciar o Mu." #: mu/interface/panes.py:538 msgid "" "There was a problem copying the file '{}' onto the micro:bit. Please check " "Mu's logs for more information." msgstr "" "Houve uma falha a copiar o ficheiro '{}' para o micro:bit. Verifica os logs " "do Mu para mais informação." #: mu/interface/panes.py:546 msgid "" "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Houve uma falha a apagar o ficheiro '{}' no micro:bit. Verifica os logs do " "Mu para mais informação." #: mu/interface/panes.py:554 msgid "" "There was a problem getting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Houve uma falha a obter o ficheiro '{}' do micro:bit. Verifica os logs do Mu " "para mais informação." #: mu/logic.py:69 msgid "Hello, World!" msgstr "Olá, Mundo!" #: mu/logic.py:70 msgid "" "This editor is free software written in Python. You can modify it, add " "features or fix bugs if you like." msgstr "" "Este programa é software livre, escrito em Python. Podes modificá-lo, " "acrescentar capacidades, ou corrigir falhas, se quiseres." #: mu/logic.py:72 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "Este programa chama-se Mu (podes dizer 'Mu' ou, em Inglês, 'Miu')." #: mu/logic.py:73 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "" "Google, Facebook, NASA, Pixar, Disney e muitas outras organizações utilizam " "Python." # Desafio: evitar o femenino/masculino "serás um feiticeiro/feiticeira". #: mu/logic.py:74 msgid "" "Programming is a form of magic. Learn to cast the right spells with code and " "you'll be a wizard." msgstr "" "Programar é uma espécie de magia. Aprende a lançar os feitiços certos e " "serás especialista em feitiçaria." #: mu/logic.py:76 msgid "" "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your " "computer! :-)" msgstr "" "REPL vem do Inglês, Read (ler), Evaluate (avaliar), Print (imprimir), Loop " "(ciclo). É uma forma fácil e divertida de falar com o computador! :-)" #: mu/logic.py:78 msgid "Be brave, break things, learn and have fun!" msgstr "Sê valente, sem medo de partir estas coisas, aprende e diverte-te!" #: mu/logic.py:79 msgid "Make your software both useful AND fun. Empower your users." msgstr "" "Torna os teus programas úteis e divertidos. Dá novas ferramentas e " "capacidades aos teus utilizadores." #: mu/logic.py:80 msgid "For the Zen of Python: import this" msgstr "Para obteres o Zen do Python: import this" #: mu/logic.py:81 msgid "Diversity promotes creativity." msgstr "A diversidade promove a criatividade." #: mu/logic.py:82 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "" "Uma mente aberta, espírito de aventura e respeito pela diversidade são " "fundamentais." #: mu/logic.py:83 msgid "" "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "" "Não te preocupes se não funcionar. Aprende a lição, faz correcções e tenta " "outra vez! :-)" #: mu/logic.py:85 msgid "Coding is collaboration." msgstr "Programar é colaborar." #: mu/logic.py:86 msgid "Compliment and amplify the good things with code." msgstr "Complementa e amplia as coisas boas com os teus programas." #: mu/logic.py:87 msgid "" "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "" "Teoricamente, a teoria e a práctica são a mesma coisa. Na práctica, não " "são. ;-)" #: mu/logic.py:89 msgid "Debugging is twice as hard as writing the code in the first place." msgstr "Fazer diagnósticos é muito mais difícil que escrever o código." #: mu/logic.py:90 msgid "It's fun to program." msgstr "Programar é divertido." #: mu/logic.py:91 msgid "Programming has more to do with problem solving than writing code." msgstr "" "Programar tem mais que ver com resolver problemas do que com escrever código." #: mu/logic.py:92 msgid "Start with your users' needs." msgstr "Começa por considerar as necessidades dos teus utilizadores." #: mu/logic.py:93 msgid "Try to see things from your users' point of view." msgstr "Tenta ver as coisas na perspectiva dos teus utilizadores." #: mu/logic.py:94 msgid "Put yourself in your users' shoes." msgstr "Põe-te no lugar dos teus utilizadores." #: mu/logic.py:95 msgid "" "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "" "Explicar um problema de programação a um amigo ou amiga revela, muitas " "vezes, a solução. :-)" #: mu/logic.py:97 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "" "Se não sabes, pergunta. Não tens ninguém a quem perguntar? Então procura." #: mu/logic.py:98 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "A complexidade é o inimigo. Mantém as coisas simples!" #: mu/logic.py:99 msgid "Beautiful is better than ugly." msgstr "Bonito é melhor que feio." #: mu/logic.py:100 msgid "Explicit is better than implicit." msgstr "Explícito é melhor que implícito." #: mu/logic.py:101 msgid "Simple is better than complex. Complex is better than complicated." msgstr "Simples é melhor que complexo. Complexo é melhor que complicado." # This was a really tough one (actually, most of the Zen of Python is, in the context of beginners, I'd say) # Would love to discuss with someone: in particular with educators. #: mu/logic.py:102 msgid "Flat is better than nested." msgstr "Uma estrutura linear é melhor que uma hierárquica." #: mu/logic.py:103 msgid "Sparse is better than dense." msgstr "Esparso é melhor que denso." #: mu/logic.py:104 msgid "Readability counts." msgstr "A legibilidade conta." #: mu/logic.py:105 msgid "" "Special cases aren't special enough to break the rules. Although " "practicality beats purity." msgstr "" "Os casos especiais não são suficientemente especiais para infringir as " "regras. Embora o sentido práctico possa superar a pureza." #: mu/logic.py:107 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "" "Os erros nunca devem ser silenciosos. A não ser que sejam explicitamente " "silenciados." #: mu/logic.py:108 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "Perante a ambiguidade, rejeita a tentação de adivinhar." #: mu/logic.py:109 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "" "Deve haver uma -- e de preferência apenas uma -- forma óbvia de fazer as " "coisas." #: mu/logic.py:110 msgid "" "Now is better than never. Although never is often better than *right* now." msgstr "" "Agora é melhor que nunca. Embora nunca seja muitas vezes melhor que *mesmo* " "agora." #: mu/logic.py:112 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "Se a implementação é difícil de explicar, é uma má ideia." #: mu/logic.py:113 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "" "Se a implementação é fácil de explicar, pode ser que seja uma boa ideia." #: mu/logic.py:114 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "Os espaços de nomes são uma óptima idéia -- vamos a mais!" #: mu/logic.py:115 msgid "Mu was created by Nicholas H.Tollervey." msgstr "O Mu foi criado pelo Nicholas H. Tollervey." #: mu/logic.py:116 msgid "To understand what recursion is, you must first understand recursion." msgstr "" "Para entender o que é recursão, tens primeiro que entender o que é recursão." #: mu/logic.py:117 msgid "" "Algorithm: a word used by programmers when they don't want to explain what " "they did." msgstr "" "Algoritmo: uma palavra utilizada por programadores quando não sabem explicar " "o que fizeram." #: mu/logic.py:119 msgid "Programmers count from zero." msgstr "Quem programa começa a contar a partir do zero." #: mu/logic.py:120 msgid "Simplicity is the ultimate sophistication." msgstr "A simplicidade é a forma mais evoluída de sofisticação." #: mu/logic.py:121 msgid "A good programmer is humble." msgstr "Um bom programador (ou programadora!) é humilde." #: mu/logic.py:122 msgid "A good programmer is playful." msgstr "" "Uma boa programadora é divertida! (e um bom programador é divertido, claro!)" #: mu/logic.py:123 msgid "A good programmer learns to learn." msgstr "Um bom programador (ou programadora, claro!) aprende a aprender." #: mu/logic.py:124 msgid "A good programmer thinks beyond the obvious." msgstr "" "Uma boa programadora pensa para além do óbvio. (e um bom programador também)" #: mu/logic.py:125 msgid "A good programmer promotes simplicity." msgstr "" "Um bom programador promove a simplicidade (e uma boa programadora, pois " "não!)." #: mu/logic.py:126 msgid "A good programmer avoids complexity." msgstr "Uma boa programadora (ou programador) evita a complexidade." #: mu/logic.py:127 msgid "A good programmer is patient." msgstr "Programar bem é ser paciente." #: mu/logic.py:128 msgid "A good programmer asks questions." msgstr "Programar bem passa por fazer perguntas." #: mu/logic.py:129 msgid "A good programmer is willing to say, 'I don't know'." msgstr "Programar bem significa estar disposto a dizer 'não sei'." #: mu/logic.py:130 msgid "Wisest are they that know they know nothing." msgstr "Sábios são aqueles que sabem que nada sabem." #: mu/logic.py:442 msgid " above this line" msgstr " acima desta linha" #: mu/logic.py:487 msgid "" "Syntax error. Python cannot understand this line. Check for missing " "characters!" msgstr "" "Erro de sintaxe. O Python não entende esta linha. Verifica se faltam algumas " "letras ou símbolos!" #: mu/logic.py:677 msgid "# Write your code here :-)" msgstr "# Escreve o teu código aqui :-)" #: mu/logic.py:715 msgid "" "The file contains characters Mu expects to be encoded as {0} or as the " "computer's default encoding {1}, but which are encoded in some other way.\n" "\n" "If this file was saved in another application, re-save the file via the " "'Save as' option and set the encoding to {0}" msgstr "" "O ficheiro contém caracteres que o Mu espera estarem codificados como {0} ou " "{1} (a preferência do computador), mas que parecem estar codificados de " "outra forma.\n" "\n" "Se o ficheiro foi produzido por outro programa ou aplicação, tenta voltar a " "guardá-lo com a codificação {0}." #: mu/logic.py:731 msgid "The file \"{}\" is already open." msgstr "O ficheiro '{}' já está aberto." #: mu/logic.py:743 msgid "Mu cannot read the characters in {}" msgstr "O Mu não consegue ler os caracteres em {}" #: mu/logic.py:766 msgid "Mu was not able to open this file" msgstr "O Mu não conseguiu abrir este ficheiro" #: mu/logic.py:767 msgid "" "Currently Mu only works with Python source files or hex files created with " "embedded MicroPython code." msgstr "" "O Mu só trabalha com ficheiros Python ou ficheiros \"hex\" com MicroPython " "embebido." #: mu/logic.py:773 msgid "Could not load {}" msgstr "Não consegui carregar {}" #: mu/logic.py:775 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "Este ficheiro existe?\n" "Em caso afirmativo, será que tens permissões para o ler?\n" "\n" "Verifica, por favor, e tenta novamente." #: mu/logic.py:781 msgid "Is this a {} file?" msgstr "Será este um ficheiro {}?" #: mu/logic.py:782 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "Parece que este é um ficheiro {}\n" "\n" "Queres mudar o Mu para o modo {}?" #: mu/logic.py:854 msgid "Could not save file (disk problem)" msgstr "Não consegui guardar o ficheiro (problema no disco)" #: mu/logic.py:855 msgid "" "Error saving file to disk. Ensure you have permission to write the file and " "sufficient disk space." msgstr "" "Erro ao guardar o ficheiro no disco. Verifica que tens permissões para " "guardar o ficheiro e que há espaço livre disponível." #: mu/logic.py:859 msgid "Could not save file (encoding problem)" msgstr "Não consegui guardar o ficheiro (problema de codificação)" #: mu/logic.py:861 msgid "" "Unable to convert all the characters. If you have an encoding line at the " "top of the file, remove it and try again." msgstr "" "Não consegui converter todos os caracteres. Se existe uma linha de " "codificação no topo do ficheiro, remove-a e tenta novamente." #: mu/logic.py:870 msgid "Saved file: {}" msgstr "Ficheiro guardado: {}" #: mu/logic.py:899 mu/logic.py:1237 msgid "You cannot use the filename \"{}\"" msgstr "Não podes utilizar o nome '{}'" #: mu/logic.py:901 msgid "" "This name is already used by another part of Python. If you use this name, " "things are likely to break. Please try again with a different filename." msgstr "" "Este nome é utilizado por outra parte do Python. Se o utilizares, " "provavelmente algumas coisas vão falhar. Tenta novamente com um nome " "diferente, por favor." #: mu/logic.py:976 msgid "Good job! No problems found." msgstr "Bom trabalho! Não foram encontrados enganos." #: mu/logic.py:977 msgid "Hurrah! Checker turned up no problems." msgstr "Boa! A verificação não encontrou enganos." #: mu/logic.py:978 msgid "Nice one! Zero problems detected." msgstr "Boa! Zero enganos encontrados." #: mu/logic.py:979 msgid "Well done! No problems here." msgstr "Bem feito! Não há enganos por aqui." #: mu/logic.py:980 msgid "Awesome! Zero problems found." msgstr "Maravilhoso! Tens zero enganos." #: mu/logic.py:1007 msgid "" "There is un-saved work, exiting the application will cause you to lose it." msgstr "Tens trabalho por guardar. Se fechares o Mu, poderás perdê-lo." #: mu/logic.py:1060 msgid "Could not find MicroPython runtime." msgstr "O \"runtime\" MicroPython não foi encontrado." #: mu/logic.py:1061 msgid "" "The micro:bit runtime you specified ('{}') does not exist. Please try again." msgstr "" "O \"runtime\" micro:bit que indicaste ({}) não existe. Tenta novamente, por " "favor." #: mu/logic.py:1131 msgid "Changed to {} mode." msgstr "Activado o modo {}." #: mu/logic.py:1176 msgid "Detected new {} device." msgstr "Detectado um novo dispositivo {}." #: mu/logic.py:1183 msgid "Would you like to change Mu to the {} mode?" msgstr "Queres alterar o Mu para o modo {}?" #: mu/logic.py:1218 msgid "Cannot Set Breakpoint." msgstr "Não posso marcar a interrupção." #: mu/logic.py:1219 msgid "" "Lines that are comments or some multi-line statements cannot have " "breakpoints." msgstr "" "As linhas de comentário e alguns comandos multi-linha não podem ser marcados " "como pontos de interrupção." #: mu/logic.py:1239 msgid "" "This name is already used by another part of Python. If you use that name, " "things are likely to break. Please try again with a different filename." msgstr "" "Este nome é utilizado por outra parte do Python. Se o utilizares, " "provavelmente algumas coisas vão falhar. Tenta novamente com um nome " "diferente, por favor." #: mu/logic.py:1256 msgid "Could not rename file." msgstr "Não consigo alterar o nome do ficheiro." #: mu/logic.py:1257 msgid "A file of that name is already open in Mu." msgstr "Já existe um ficheiro aberto pelo Mu com esse nome." #: mu/logic.py:1286 msgid "Replaced \"{}\" with \"{}\"." msgstr "\"{}\" substituído por \"{}\"." #: mu/logic.py:1290 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "{} substituições: \"{}\" por \"{}\"." #: mu/logic.py:1295 mu/logic.py:1302 msgid "Could not find \"{}\"." msgstr "Não encontro \"{}\"." #: mu/logic.py:1300 msgid "Highlighting matches for \"{}\"." msgstr "Realce das correspondências com \"{}\"." #: mu/logic.py:1305 msgid "You must provide something to find." msgstr "Tens que indicar algo a procurar." #: mu/logic.py:1306 msgid "Please try again, this time with something in the find box." msgstr "Tenta novamente, por favor, desta vez com algo na caixa de procura." #: mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "CircuitPython da Adafruit" #: mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "Usar CircuitPython com dispositivos da Adafruit." #: mu/modes/adafruit.py:64 msgid "Serial" msgstr "Série" #: mu/modes/adafruit.py:65 msgid "Open a serial connection to your device." msgstr "Abrir uma ligação série ao teu dispositivo." #: mu/modes/adafruit.py:72 mu/modes/microbit.py:215 mu/modes/python3.py:136 msgid "Plotter" msgstr "Gráfico" #: mu/modes/adafruit.py:73 mu/modes/microbit.py:216 msgid "Plot incoming REPL data." msgstr "Mostra um gráfico com dados obtidos a partir do REPL." #: mu/modes/adafruit.py:143 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "Não encontrei um dispositivo Adafruit ligado." #: mu/modes/adafruit.py:145 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. " "Therefore, to edit these files you need to have the device plugged in. Until " "you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Os ficheiros Python para dispositivos da Adafruit com CircuitPython são " "armazenados no próprio dispositivo. Assim sendo, para os alterar terás que o " "ligar. Entretanto, o Mu utiliza esta pasta para guardar os teus scripts:\n" "\n" "{}" #: mu/modes/base.py:169 msgid "Data Flood Detected!" msgstr "Detectada informação excessiva!" #: mu/modes/base.py:170 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. " "As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent " "to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls " "to 'sleep' for a very short period of time." msgstr "" "O gráfico recebeu informação excessiva, o que pode bloquear o Mu ou torná-lo " "muito lento. Como salvaguarda, o gráfico foi interrompido.\n" "\n" "A informação é considerada excessiva quando blocos de informação superiores " "a 1024 bytes são enviados repetidamente para o gráfico.\n" "Uma solução possível é garantir que o código imprime tuplos de informação " "pequenos, intervalados de invocações 'sleep' por curtos períodos de tempo." #: mu/modes/base.py:262 mu/modes/base.py:301 msgid "" "Click on the device's reset button, wait a few seconds and then try again." msgstr "" "Pressiona o botão de RESET no dispositivo, espera uns segundos e tenta " "novamente." #: mu/modes/base.py:268 mu/modes/base.py:307 msgid "Could not find an attached device." msgstr "Não encontro um dispositivo ligado." #: mu/modes/base.py:269 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Por favor, verifica que o dispositivo está ligado ao computador.\n" "\n" "Terá que ter uma versão do MicroPython (ou CircuitPython) embebida antes do " "REPL poder funcionar.\n" "\n" "Por último, pressiona o botão de RESET no dispositivo e espera uns segundos " "antes de tentares novamente." #: mu/modes/base.py:308 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Por favor, verifica que o dispositivo está ligado ao computador.\n" "\n" "Terá que ter uma versão do MicroPython (ou CircuitPython) embebida antes do " "Gráfico poder funcionar.\n" "\n" "Por último, pressiona o botão de RESET no dispositivo e espera uns segundos " "antes de tentares novamente." #: mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "Diagnóstico Visual" #: mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "Diagnosticar o teu código Python 3." #: mu/modes/debugger.py:50 mu/modes/pygamezero.py:109 mu/modes/python3.py:166 msgid "Stop" msgstr "Parar" #: mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "Interrompe a execução do teu código." #: mu/modes/debugger.py:57 msgid "Continue" msgstr "Continuar" #: mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "Continua a execução do teu código." #: mu/modes/debugger.py:64 msgid "Step Over" msgstr "Adiante" #: mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "Avança para a linha de código seguinte." #: mu/modes/debugger.py:71 msgid "Step In" msgstr "Em Detalhe" #: mu/modes/debugger.py:72 msgid "Step into a function." msgstr "Avança para dentro de uma função." #: mu/modes/debugger.py:78 msgid "Step Out" msgstr "Para Fora" #: mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "Avança até sair da função." #: mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "O teu script terminou." #: mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "" "Falha na ligação à ferramenta de diagnóstico Python.\n" "\n" #: mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "Informação Diagnóstico: {}" #: mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "Aviso Diagnóstico: {}" #: mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "Erro Diagnóstico: {}" #: mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "micro:bit" #: mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "Escrever MicroPython para um micro:bit." #: mu/modes/microbit.py:192 msgid "Flash" msgstr "Transferir" #: mu/modes/microbit.py:193 msgid "Flash your code onto the micro:bit." msgstr "Transfere o teu código para o micro:bit." #: mu/modes/microbit.py:199 msgid "Files" msgstr "Ficheiros" #: mu/modes/microbit.py:200 msgid "Access the file system on the micro:bit." msgstr "Acede aos ficheiros no micro:bit." #: mu/modes/microbit.py:206 mu/modes/python3.py:127 msgid "REPL" msgstr "REPL" #: mu/modes/microbit.py:207 msgid "Use the REPL to live-code on the micro:bit." msgstr "Usa o REPL para programar directamente no micro:bit." #: mu/modes/microbit.py:257 msgid "Unable to flash \"{}\"" msgstr "Não consegui transferir \"{}\"" #: mu/modes/microbit.py:267 msgid "Problem with script" msgstr "Problema com o script" #: mu/modes/microbit.py:268 msgid "{} [{}:{}]" msgstr "{} [{}:{}]" #: mu/modes/microbit.py:278 msgid "Our minifier tried but your script is too long!" msgstr "O compactador tentou, mas o teu script é muito grande!" #: mu/modes/microbit.py:283 msgid "Your script is too long and the minifier isn't available" msgstr "O teu script é muito grande e o compactador não está disponível" #: mu/modes/microbit.py:288 msgid "Your script is too long!" msgstr "O teu script é muito grande!" #: mu/modes/microbit.py:368 msgid "Flashing \"{}\" onto the micro:bit." msgstr "A transferir '{}' para o micro:bit." # No obvious translation for runtime. Went technical, but quoted. #: mu/modes/microbit.py:370 msgid " Runtime: {}" msgstr " \"Runtime\": {}" #: mu/modes/microbit.py:416 msgid "Unsupported BBC micro:bit." msgstr "Este micro:bit não é suportado." #: mu/modes/microbit.py:417 msgid "" "Your device is newer than this version of Mu. Please update Mu to the latest " "version to support this device.\n" "\n" "https://codewith.mu/" msgstr "" "O teu dispositivo é mais recente que esta versão do Mu. Por favor, actualiza " "o Mu.\n" "\n" "https://codewith.mu/" #: mu/modes/microbit.py:453 mu/modes/microbit.py:589 msgid "Could not find an attached BBC micro:bit." msgstr "Não encontrei um micro:bit ligado." #: mu/modes/microbit.py:454 msgid "" "Please ensure you leave enough time for the BBC micro:bit to be attached and " "configured correctly by your computer. This may take several seconds. " "Alternatively, try removing and re-attaching the device or saving your work " "and restarting Mu if the device remains unfound." msgstr "" "Garante, por favor, que dás tempo suficiente ao computador para detectar e " "identificar o micro:bit. Por vezes pode levar vários segundos. Em " "alternativa, tenta desligar e voltar a ligar o dispositivo ou, guardando o " "teu trabalho, tenta reiniciar o Mu." #: mu/modes/microbit.py:468 msgid "Finished flashing." msgstr "Transferência completada." #: mu/modes/microbit.py:503 msgid "Copied code onto micro:bit." msgstr "Código copiado para o micro:bit." #: mu/modes/microbit.py:512 msgid "There was a problem flashing the micro:bit." msgstr "Houve uma falha na transferência para o micro:bit." #: mu/modes/microbit.py:513 msgid "" "Please do not disconnect the device until flashing has completed. Please " "check the logs for more information." msgstr "" "Por favor não desligues o dispositivo até que a transferência esteja " "completada. Verifica o log para mais informação." #: mu/modes/microbit.py:534 msgid "REPL and file system cannot work at the same time." msgstr "O REPL e os ficheiros não podem ser utilizados em simultâneo." #: mu/modes/microbit.py:535 msgid "" "The REPL and file system both use the same USB serial connection. Only one " "can be active at any time. Toggle the file system off and try again." msgstr "" "O REPL e os ficheiros utilizam a mesma ligação USB. Só um deles pode estar " "activo de cada vez. Desactiva os ficheiros e tenta novamente." #: mu/modes/microbit.py:552 msgid "The plotter and file system cannot work at the same time." msgstr "O gráfico e os ficheiros não podem ser utilizados em simultâneo." #: mu/modes/microbit.py:554 msgid "" "The plotter and file system both use the same USB serial connection. Only " "one can be active at any time. Toggle the file system off and try again." msgstr "" "O gráfico e os ficheiros utilizam a mesma ligação USB. Só um deles pode " "estar activo de cada vez. Desactiva os ficheiros e tenta novamente." #: mu/modes/microbit.py:566 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "" "Os ficheiros não podem ser utilizados em simultâneo com o REPL ou com o " "gráfico." #: mu/modes/microbit.py:568 msgid "" "The file system and the REPL and plotter use the same USB serial connection. " "Toggle the REPL and plotter off and try again." msgstr "" "Os ficheiros, REPL e gráfico utilizam a mesma ligação USB. Só um deles pode " "estar activo de cada vez. Desactiva o REPL e o gráfico, e tenta novamente." #: mu/modes/microbit.py:590 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will " "work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Garante que o dispositivo está ligado ao computador.\n" "\n" "O dispositivo tem que ter o MicroPython previamente transferido antes dos " "ficheiros poderem funcionar.\n" "\n" "Por último, pressiona o botão RESET no dispositivo, aguarda uns segundos e " "tenta novamente." #: mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "Pygame Zero" #: mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "Criar jogos com o Pygame Zero." #: mu/modes/pygamezero.py:51 mu/modes/pygamezero.py:101 msgid "Play" msgstr "Jogar" #: mu/modes/pygamezero.py:52 mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "Inicia o teu jogo Pygame Zero." #: mu/modes/pygamezero.py:58 msgid "Images" msgstr "Imagens" #: mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "Mostra as imagens utilizadas pelo Pygame Zero." #: mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "Tipografia" #: mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "Mostra os tipos de letra utilizados pelo Pygame Zero." #: mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "Sons" #: mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "Mostra os sons utilizados pelo Pygame Zero." #: mu/modes/pygamezero.py:79 msgid "Music" msgstr "Música" #: mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "Mostra a música utilizada pelo Pygame Zero." #: mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "Pára o teu jogo Pygame Zero." #: mu/modes/python3.py:97 msgid "Python 3" msgstr "Python 3" #: mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "Criar código Python 3." #: mu/modes/python3.py:113 mu/modes/python3.py:158 msgid "Run" msgstr "Correr" #: mu/modes/python3.py:114 mu/modes/python3.py:159 msgid "Run your Python script." msgstr "Executa o teu script Python." #: mu/modes/python3.py:120 msgid "Debug" msgstr "Diagnóstico" #: mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "Inicia o diagnóstico do teu script Python." #: mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "" "Usa o REPL para experimentar Python linha a linha, com respostas imediatas." #: mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "" "Mostra um gráfico dos dados produzidos pelo teu script Python ou pelo REPL." #: mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "Pára o teu script Python." #: mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "A iniciar o REPL iPython." # Not sure what/why "this may take a short amount of time" means in this context. Omited, for brevity. #: mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "A parar o REPL iPython." #: mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL iniciado." #: mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL terminado." mu-editor-1.0.2+dfsg/mu/locale/sv/000077500000000000000000000000001341747546300166645ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/sv/LC_MESSAGES/000077500000000000000000000000001341747546300204515ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/sv/LC_MESSAGES/mu.mo000066400000000000000000000722431341747546300214370ustar00rootroot00000000000000[ &))*?!j$4 "?&b,(TDK +#5YKxJG7`1j5#>b~#9) "6XY"&%$A fer7J2\B7aVKb >g L ! !")!@L!!!!!!!!"# "!."P"l""r"-""?" # 3#A#F#&e#@#:#7$@$9G$J$$R$2%NG%%% %%;%#&<&A&D&#V&'z&!&&&&&@&6'!:'J\''(' ' '/'d(((m()!*+,J,;@-'|-----B-`9.". ...////0 020YA0 0 000 00&1,101 H1T1Y1y1 11 1#1$1#2$)2BN2*222[2<3Z3q3y3 3333333 4=%4=c4O445/6N6{U7L7898O8;:JA:E:j:b=;+;a;.<5<h%==!>E>1>1,?+^?s??@/.@^@+|@@@K@,A+DA(pA A#AA!aB8BB"B$BC%C.C 7CBC JCSUCDDD.D!!ECE[E.sE&E*E!E"F 9F6ZF'F(F2F$G:GZQGLGG H!'H1IH{HH'HHQHKI cI"oIPII4J-5JucJ J'J K#,KPK;kK>K+K'LX:LLL%L-LM 9M ZM^gMMMMMN0NANDSNN1NN NO3O^QOPOP6PLP" Q,Q$>QAcQQQQQQRRR #R"DRgRRR;R$RGSNS ^SlSsS-SJSI TKSTT.TPT&UI>UUJUUUV VC;V'VVVVV$VW!W'WFWLW:QWW!WPWX, X 8XDX=UXxX YY]/YYZ[\S]8]/^F^c^k^!^I^l^%X_ ~___```` ``0`u a a aaa aa-ab#b` Yea'Of|Wo}G%L-1,qy)7J8 k( HCbUmlX&<RK ^\Q~Ixj9Pn0:v$3DBdp?=M6w@tcSFZV/T5uE!g +[rz; Runtime: {} above this line# Write your code here :-)'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Adafruit CircuitPythonAlgorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.Awesome! Zero problems found.BBC micro:bitBBC micro:bit SettingsBe brave, break things, learn and have fun!Beautiful is better than ugly.Cannot Set Breakpoint.Cannot connect to device on port {}Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copied code onto micro:bit.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Debugging is twice as hard as writing the code in the first place.Delete (cannot be undone)Deleting '{}' from micro:bit.Detected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.File already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFor the Zen of Python: import thisGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHello, World!HelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)Is this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.Lines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.Minify Python code before flashing?ModeMuMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu {}Mu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.Now is better than never. Although never is often better than *right* now.OpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):PlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Pygame ZeroPython 3Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 (Jupyter)Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPLREPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.Replace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaveSave the current Python script.Saved file: {}Select ModeSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.Syntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way. If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The micro:bit runtime you specified ('{}') does not exist. Please try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.To understand what recursion is, you must first understand recursion.Toggle theme between day, night or high contrast.Try to see things from your users' point of view.Unable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unsupported BBC micro:bit.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You cannot use the filename "{}"You must provide something to find.Your device is newer than this version of Mu. Please update Mu to the latest version to support this device. https://codewith.mu/Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-outuntitled{} Plotter{} REPL{} [{}:{}]Project-Id-Version: POT-Creation-Date: 2018-08-19 14:09-0700 PO-Revision-Date: 2018-08-21 11:07+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 X-Generator: Poedit 2.1.1 Last-Translator: Plural-Forms: nplurals=2; plural=(n != 1); Language: sv Exekveringsmiljö: {} ovanför den här raden# Skriv din kod här :-)Lyckad kopiering av ‘{}’ till micro:biten.'{}' borttagen från micro:biten.(En dict av {} saker.)(En lista av {} saker.)En fil med det namnet har redan öppnats i Mu.En bra programmerare ställer frågor.En bra programmerare undviker komplexitet.En bra programmerare är ödmjuk.En bra programmerare har tålamod.A bra programmerare är lekfull.A bra programmerare säger gärna: ‘Jag vet inte’.En bra programmerare lär sig lärande.En bra programmerare föredrar enkelhet.En bra programmerare tänker bortom det uppenbara.Accessa filsystemet på micro:biten.Adafruit CircuitPythonAlgoritm: ett ord som används av programmerare när det inte vill förklara vad de gjort.Ett öppet sinne, äventyrslusta och respekt för mångfald är essentiellt.Häftigt! Inga hittade problem.BBC micro:bitInställningar för BBC micro:bitVar modig, ta sönder saker, lär dig och ha kul!Vackert är bättre än fult.Kan inte sätta brytpunkt.Kan inte ansluta till enhet på port {}Ändra Mus utvecklingsläge.Ändra läge närsomhelst genom att klicka på “Läge”-knappen med Mus logga.Ändrat till {}-läget.KontrolleraKontrollera din kod efter misstag.Tryck på enhetens reset-knapp, vänta att par sekunder och försök sedan igen.Att koda är att sammarbeta.Komplexitet är en fiende. Håll det enkelt, dummer!Komplettera och förstärk bra saker med kod.Anslutningen timade ut. Är din maskin långsam eller upptagen? Fria upp några maskinens resurser och försök igen.FortsättFortsätt att köra ditt Python-skript.Kopierar koden till micro:biten.Kopierar ‘{}’ till micro:biten.Kunde inte hitta “{}”.Kunde inte hitta någon exekveringsmiljö för MicroPython.Kunde inte hitta någon ansluten Adafruit CircuitPython-enhet.Kunde inte hitta en ansluten BBC micro:bit.Kunde inte hitta någon ansluten enhet.Kunde inte hitta localhost. Kontrollera att du har ‘127.0.0.1’ i din /etc/hosts fil.Kunde inte ladda {}Kunde inte byta namn på filen.Kunde inte spara filen (disk-problem)Kunde inte spara file (teckenkodningsproblem)Skapa ett nytt Python-skript.Skapa kod med standard Python 3.Aktuell loggFör nuvarande fungerar bara Mu med Python källkodsfiler eller hex-filer med MicroPython-kod.Dataöverflöde upptäckt!DebuggaDebut-inspektörDebugga din Python 3-kod.Debugga ditt Python-skript.Debugger-fel: {}Debugger-info: {}Debuggern måste ha namn på ett Python-skript för att kunna köra.Debugger-varning: {}Debugging är dubbelt så svårt att skiva koden.Ta bort (kan inte ångras)Tar bort '{}' från micro:biten.Upptäckt new {} enhet.Mångfald föder kreativitet.Existerar filen? Om den gör det, har tillåtelse att läsa den? Undersök och försök igen.Oroa dig inte ifall det inte fungerar. Lär dig, lös det och försök igen! :-)Kunde inte spara till disk. Kontrollera att du ha rättighet att skriva till filen och att det finns tillräckligt med diskutrymme.Fel ska aldrig passera tyst. Såvida explicit tystade.Lösningen visar sig ofta när man förklarar sitt problem för en vän. :-)Explicit är bättre än implicit.Filen finns redanFilen finns redan; skriva över den?Filsystemet kan inte användas samtidigt som REPL eller plottern.FilerFiler på din dator:Filer på din micro:bit:Filsystemet på micro:bitSök / ersättSök:Avslutat flashning.FlashaFlasha din kod till micro:biten.Flashar “{}” till micro:biten.Flat är bättre nestlat.FonterFör Python Zen: import thisHämtar ‘{}’ från micro:biten. Kopierar till ‘{}’.Snyggt jobbat! Hittade inga problem.Google, Facebook, NASA, Pixar, Disney och många fler använder Python.Grafisk debuterHello, World!HjälpMarkerar träffar för "{}".Hurra! Hittade inga problem efter kontrollen.Om en implementation är lätt att förklara, så är den nog en god idé.Om en implementation är svår att förklara, så är den en dålig idé.Fråga om du inte vet. Ingen att fråga? Då är det bara att slå upp det.BilderVid tvetydighet, motstå frestelsen att gissa.I teorin så är teori och praktik samma sak. In praktiken, så är de inte det.Är det här en {} fil?Det verkar som det här är en {}-fil. Vill du ändra Mu till {}-läget?Det är kul att programmera.Kommentarsrader eller vissa flerraders statements kan inte ha brytpunkter.ÖppnaÖppna ett Python-skript.Loggar till {}Gör spel med Pygame Zero.Gör din mjukvara både användbar och kul. Stärk dina användare.Minifiera Python-koden innan flashning?LägeMuMu-inställningarMu kan inte läsa tecknen i {}Mu skapades av Nicholas H.Tollervey.Mu kunde inte öppna filenMu {}Mu nuvarande utvecklingsläge.MusikNamnNamnrymder är en kanonidé — låt oss använda dem mer!NyttSnyggt! Noll detekterade problem.Nu är bättre än aldrig. Aldrig är i och för sig ofta bättre än *just* nu.ÖppnaÖppna en seriell anslutning till din enhet.Öppna i MuÖppnar ‘{}’Vår minifierare försökte, men ditt skript är för långt!Skriv öven den inbyggda exekveringsmiljön för MicroPython med den här hex-filen (tomt betyder använd den inbyggda):SpelaSpela ditt Pygame Zero-spel.Koppla inte bort enheten innan flashingen har avslutat. Titta i loggar efter mer information.Lämna tillräckligt med tid för att BBC micro:biten ska hinna anslutas och konfigureras av din datorn. Det kan ta flera sekunder. Alterntivt, försök koppla loss och anslut sedan enheten igen eller spara ditt arbete och start om Mu om enheten fortfarande inte hittas.Kontrollera att enheten är ansluten till den här datorn. Den måste ha en version av MicroPython (eller CircuitPython) flashad på sig innan plotter fungerar. Slutligen, tryck på enhetens reset-knapp och vänta ett par sekunder innan du försöker igen.Kontrollera att enheten är ansluten till den här datorn. Den måste ha en version av MicroPython (eller CircuitPython) flashad på sig innan REPL fungerar. Slutligen, tryck på enhetens reset-knapp och vänta ett par sekunder innan du försöker igen.Kontrollera att enheter är kopplad till den här datorn. Enheten måste ha MicroPython flashat till den innan filsystemet kan fungera. Slutligen, tryck på enhetens reset-knapp och vänta ett par sekunder innan du försöker igen.Välj det önskade läget och klicka på “OK”. Annars, klicka på “Cancel”.Försök igen, den här gången med något i sök-rutan.Plotta data från ditt skript eller från REPL.Plotta inkommande REPL-data.PlotterProblem med skrytetProgrammerare räknar från noll.Programmering har mer med problemlösningar att göra än att skriva kod.Programmering är en form av magi. Lär dig kasta de rätt formlerna med kod och du kommer bli en trollkarl.Sätt dig själv i användarens skor.Pygame ZeroPython 3Python-filer för Adafruit CircuitPython-enheter lagras på enheten. Därför måste du ha enheten ansluten för att kunna ändra filerna. Tills dess att du ansluter en enhet, kommer Mu använda katalogen: {} …för att lagra din kod.Python3 (Jupyter)Python3 miljövariablerPython3 data tupelAvslutaAvsluta Mu.REPLREPL och filsystem kan inte användas samtidigt.REPL är en förkortning för “read, evaluate, print, loop”. Det är ett kul sätt att kommunicera med din dator!REPL startad.REPL stoppad.Läsbarhet räknas.Ersätt (valfritt):Ersätt alla?Ersatte “{}” med “{}”.Ersatte {} träffar av “{}” med “{}”.KörKör ditt Python-skript.Kör: {}SparaSpara det aktuella Python-skriptet.Sparat filen: {}Välj lägeSeriellVisa hjälp om Mu in en webbläsare.Visa fonterna som används av Pygame Zero.Visa bilderna som används av Pygame Zero.Visa musiken som används av Pygame Zero.Visa ljuden som används av Pygame Zero.Enkelt är bättre än komplext. Komplext är bättre än komplicerat.Enkelhet är den ultimata sofistikeringen.LjudGlest är bättre än tätt.Specialfall är inte speciella nog för att bryta reglerna. Pragmatism slår dock renhet.Starta med dina användares behov.Startar iPython REPL.Stega inStega utStega överStega in i en funktion.Stega ut ur en funktion.Stega över en kodrad.StoppStoppa den körande koden.Stoppa ditt Pygame Zero-spel.Stoppa ditt Python-skript.Stoppar iPython REPL (det här kan ta en liten stund).Kopierat ‘{}’ från micro:biten till din dator.Syntaxfel. Python kan inte förstå den här raden. Kontrollera om det saknas tecken!REPL och filsystemet använder båda samma seriella USB-anslutning. Bara en kan vara aktiv åt gången. Stäng av filsystemet och försök igen.Miljövariablerna nedan kommer sättas varje gång du kör ett Python 3-skript. Varje miljövariabel ska vara på sin egen rad och på formen: NAMN=VÄRDEFilen “{}” är redan öppen.Filen innehåller tecken Mu förväntar sig teckenkodas som {0} eller med datorns standardkodning {1}, men är teckenkodad på något annat sätt. Om filen sparades i en annan applikation, spara om den via ‘Spara som’ och sätt teckenkodningen till {0}Filsystemet, REPL och plottern använder samma seriella USB-koppling. Stänga av REPL och plotter och försök igen.Exekveringsmiljön (‘{}’) du angav finns inte. Försök igen.Plottern och filsystemet använder båda samma seriella USB-anslutning. Bara en kan vara aktiv åt gången. Stäng av filsystemet och försök igen.Plottern och filsystem kan inte användas samtidigt.Plottern är överflödad med data, vilket kommer göra frysa Mu och göra den icke-responsiv. Som en säkerhetsåtgärd har plotter stoppats. Överflödning är när datamängder på mer än 1024 bytes kontinuerligt skickas till plotter. För att lösa detta, kontrollera så att din kod skriver små datatupler blandat med anrop till ‘sleep’ med kort tid.TemaDet finns arbete som inte är sparat, om avslutar du applikationen förloras det.Det ska finnas ett — och helst bara ett — uppenbart sätt att göra det.Det var problem med att kopiera filen ‘{}’ till micro:biten. Titta i Mus loggar efter mer information.Det var problem med att ta bort ‘{}’ från micro:biten. Titta i Mus loggar efter mer information.Det var ett problem med att flasha micro:biten.Det var problem med att hämta ‘{}’ från micro:biten. Titta i Mus loggar efter mer information.Det var problem med att hämta fillistan på micro:biten. Titta i Mus loggar efter teknisk information. Alternativt, försök koppla loss och ansluta din micro:bit och/eller start om Mu.Den här editorn heter Mu (Utalas mu).Den här editorn är skriven i Python. Du kan ändra den, lägga till saker eller fixa buggar om du vill.Det här namnet används redan av en annan del av Python. Om du använder det, så kommer saker antagligen inte att fungera. Försök med ett annat filnamn.Det här namnet används redan av en annan del av Python. Om du använder det, så kommer saker antagligen inte att fungera. Försök med ett annat filnamn.För att förstår rekursion, måste du först förstå rekursion.Växla tema mellan dag, natt eller hög kontrast.Försök att se saker från dina användares håll.Kan inte koppla till Python-debuggern Kunde inte konvertera alla tecken. Om du har en teckenkodningsrad i början av filen, ta bort den och försök igen.Kunde inte flasha “{}”Osupportad BBC micro:bit.Använd CircuitPython på utvecklingskort från Adafruit.Använd REPL för live-kodning.Använd REPL för att live-koda på micro:biten.VärdeBra gjort! Inga problem här inte.Vid rapportering av en bugg, kopiera och klistra in innehållet i följande logg-fil.Visast är de som vet att det inte vet någonting.Vill du ändra Mu till {}-läget?Skriv MicroPython för BBC micro:bit.Du kan inte använda filnamnet “{}”Du måste ange något att söka efter.Din enhet är nyare än den här versionen av Mu. Uppdatera Mu till den senaste version för att stödja enheten. https://codewith.mu/Ditt skript har slutat köra.Ditt skript är för långt och minifieraren är inte tillgängligDitt skript är för långt!Zooma in (gör texten större)Zooma ut (gör texten mindre)Zooma inZooma utnamnlös{} Plotter{} REPL{} [{}:{}]mu-editor-1.0.2+dfsg/mu/locale/sv/LC_MESSAGES/mu.po000066400000000000000000001073371341747546300214450ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2018-08-19 14:09-0700\n" "PO-Revision-Date: 2018-08-21 11:07+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 2.1.1\n" "Last-Translator: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: sv\n" #: mu/app.py:66 msgid "Logging to {}" msgstr "Loggar till {}" #: mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "Debuggern måste ha namn på ett Python-skript för att kunna köra." #: mu/debugger/client.py:106 msgid "" "Connection timed out. Is your machine slow or busy? Free up some of the " "machine's resources and try again." msgstr "" "Anslutningen timade ut. Är din maskin långsam eller upptagen? Fria upp några " "maskinens resurser och försök igen." #: mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "" "Kunde inte hitta localhost.\n" "Kontrollera att du har ‘127.0.0.1’ i din /etc/hosts fil." #: mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "Välj läge" #: mu/interface/dialogs.py:57 msgid "" "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel" "\"." msgstr "Välj det önskade läget och klicka på “OK”. Annars, klicka på “Cancel”." #: mu/interface/dialogs.py:73 msgid "" "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "" "Ändra läge närsomhelst genom att klicka på “Läge”-knappen med Mus logga." #: mu/interface/dialogs.py:107 msgid "" "When reporting a bug, copy and paste the content of the following log file." msgstr "" "Vid rapportering av en bugg, kopiera och klistra in innehållet i följande " "logg-fil." #: mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python " "3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "Miljövariablerna nedan kommer sättas varje gång du kör ett Python 3-skript.\n" "\n" "Varje miljövariabel ska vara på sin egen rad och på formen:\n" "NAMN=VÄRDE" #: mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "Minifiera Python-koden innan flashning?" #: mu/interface/dialogs.py:153 msgid "" "Override the built-in MicroPython runtime with the following hex file (empty " "means use the default):" msgstr "" "Skriv öven den inbyggda exekveringsmiljön för MicroPython med den här hex-" "filen (tomt betyder använd den inbyggda):" #: mu/interface/dialogs.py:175 mu/interface/main.py:977 msgid "Mu Administration" msgstr "Mu-inställningar" #: mu/interface/dialogs.py:186 msgid "Current Log" msgstr "Aktuell logg" #: mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Python3 miljövariabler" #: mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "Inställningar för BBC micro:bit" #: mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "Sök / ersätt" #: mu/interface/dialogs.py:227 msgid "Find:" msgstr "Sök:" #: mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "Ersätt (valfritt):" #: mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "Ersätt alla?" #: mu/interface/editor.py:222 mu/logic.py:952 msgid "untitled" msgstr "namnlös" #: mu/interface/main.py:69 msgid "Mode" msgstr "Läge" #: mu/interface/main.py:70 msgid "Change Mu's mode of behaviour." msgstr "Ändra Mus utvecklingsläge." #: mu/interface/main.py:72 msgid "New" msgstr "Nytt" #: mu/interface/main.py:73 msgid "Create a new Python script." msgstr "Skapa ett nytt Python-skript." #: mu/interface/main.py:74 msgid "Load" msgstr "Öppna" #: mu/interface/main.py:75 msgid "Load a Python script." msgstr "Öppna ett Python-skript." #: mu/interface/main.py:76 msgid "Save" msgstr "Spara" #: mu/interface/main.py:77 msgid "Save the current Python script." msgstr "Spara det aktuella Python-skriptet." #: mu/interface/main.py:86 msgid "Zoom-in" msgstr "Zooma in" #: mu/interface/main.py:87 msgid "Zoom in (to make the text bigger)." msgstr "Zooma in (gör texten större)" #: mu/interface/main.py:88 msgid "Zoom-out" msgstr "Zooma ut" #: mu/interface/main.py:89 msgid "Zoom out (to make the text smaller)." msgstr "Zooma ut (gör texten mindre)" #: mu/interface/main.py:90 msgid "Theme" msgstr "Tema" #: mu/interface/main.py:91 msgid "Toggle theme between day, night or high contrast." msgstr "Växla tema mellan dag, natt eller hög kontrast." #: mu/interface/main.py:94 msgid "Check" msgstr "Kontrollera" #: mu/interface/main.py:95 msgid "Check your code for mistakes." msgstr "Kontrollera din kod efter misstag." #: mu/interface/main.py:96 msgid "Help" msgstr "Hjälp" #: mu/interface/main.py:97 msgid "Show help about Mu in a browser." msgstr "Visa hjälp om Mu in en webbläsare." #: mu/interface/main.py:98 msgid "Quit" msgstr "Avsluta" #: mu/interface/main.py:99 msgid "Quit Mu." msgstr "Avsluta Mu." #: mu/interface/main.py:178 msgid "Mu {}" msgstr "Mu {}" #: mu/interface/main.py:354 msgid "Cannot connect to device on port {}" msgstr "Kan inte ansluta till enhet på port {}" #: mu/interface/main.py:376 msgid "Filesystem on micro:bit" msgstr "Filsystemet på micro:bit" #: mu/interface/main.py:435 msgid "Python3 data tuple" msgstr "Python3 data tupel" #: mu/interface/main.py:447 msgid "Python3 (Jupyter)" msgstr "Python3 (Jupyter)" #: mu/interface/main.py:454 msgid "{} REPL" msgstr "{} REPL" #: mu/interface/main.py:470 msgid "{} Plotter" msgstr "{} Plotter" #: mu/interface/main.py:511 msgid "Running: {}" msgstr "Kör: {}" #: mu/interface/main.py:534 msgid "Debug Inspector" msgstr "Debut-inspektör" #: mu/interface/main.py:552 msgid "Name" msgstr "Namn" #: mu/interface/main.py:552 msgid "Value" msgstr "Värde" #: mu/interface/main.py:569 msgid "(A list of {} items.)" msgstr "(En lista av {} saker.)" #: mu/interface/main.py:582 msgid "(A dict of {} items.)" msgstr "(En dict av {} saker.)" #: mu/interface/main.py:720 msgid "Mu" msgstr "Mu" #: mu/interface/main.py:970 msgid "Mu's current mode of behaviour." msgstr "Mu nuvarande utvecklingsläge." #: mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "Filen finns redan; skriva över den?" #: mu/interface/panes.py:297 msgid "File already exists" msgstr "Filen finns redan" #: mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "Kopierar ‘{}’ till micro:biten." #: mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "Lyckad kopiering av ‘{}’ till micro:biten." #: mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "Ta bort (kan inte ångras)" #: mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "Tar bort '{}' från micro:biten." #: mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "'{}' borttagen från micro:biten." #: mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "Hämtar ‘{}’ från micro:biten. Kopierar till ‘{}’." #: mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "Kopierat ‘{}’ från micro:biten till din dator." #: mu/interface/panes.py:409 msgid "Open in Mu" msgstr "Öppna i Mu" #: mu/interface/panes.py:411 msgid "Open" msgstr "Öppna" #: mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "Öppnar ‘{}’" #: mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "Filer på din micro:bit:" #: mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "Filer på din dator:" #: mu/interface/panes.py:527 msgid "" "There was a problem getting the list of files on the micro:bit. Please check " "Mu's logs for technical information. Alternatively, try unplugging/plugging-" "in your micro:bit and/or restarting Mu." msgstr "" "Det var problem med att hämta fillistan på micro:biten. Titta i Mus loggar " "efter teknisk information. Alternativt, försök koppla loss och ansluta din " "micro:bit och/eller start om Mu." #: mu/interface/panes.py:538 msgid "" "There was a problem copying the file '{}' onto the micro:bit. Please check " "Mu's logs for more information." msgstr "" "Det var problem med att kopiera filen ‘{}’ till micro:biten. Titta i Mus " "loggar efter mer information." #: mu/interface/panes.py:546 msgid "" "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Det var problem med att ta bort ‘{}’ från micro:biten. Titta i Mus loggar " "efter mer information." #: mu/interface/panes.py:554 msgid "" "There was a problem getting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "" "Det var problem med att hämta ‘{}’ från micro:biten. Titta i Mus loggar " "efter mer information." #: mu/logic.py:68 msgid "Hello, World!" msgstr "Hello, World!" #: mu/logic.py:69 msgid "" "This editor is free software written in Python. You can modify it, add " "features or fix bugs if you like." msgstr "" "Den här editorn är skriven i Python. Du kan ändra den, lägga till saker " "eller fixa buggar om du vill." #: mu/logic.py:71 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "Den här editorn heter Mu (Utalas mu)." #: mu/logic.py:72 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "Google, Facebook, NASA, Pixar, Disney och många fler använder Python." #: mu/logic.py:73 msgid "" "Programming is a form of magic. Learn to cast the right spells with code and " "you'll be a wizard." msgstr "" "Programmering är en form av magi. Lär dig kasta de rätt formlerna med kod " "och du kommer bli en trollkarl." #: mu/logic.py:75 msgid "" "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your " "computer! :-)" msgstr "" "REPL är en förkortning för “read, evaluate, print, loop”. Det är ett kul " "sätt att kommunicera med din dator!" #: mu/logic.py:77 msgid "Be brave, break things, learn and have fun!" msgstr "Var modig, ta sönder saker, lär dig och ha kul!" #: mu/logic.py:78 msgid "Make your software both useful AND fun. Empower your users." msgstr "Gör din mjukvara både användbar och kul. Stärk dina användare." #: mu/logic.py:79 msgid "For the Zen of Python: import this" msgstr "För Python Zen: import this" #: mu/logic.py:80 msgid "Diversity promotes creativity." msgstr "Mångfald föder kreativitet." #: mu/logic.py:81 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "" "Ett öppet sinne, äventyrslusta och respekt för mångfald är essentiellt." #: mu/logic.py:82 msgid "" "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "" "Oroa dig inte ifall det inte fungerar. Lär dig, lös det och försök igen! :-)" #: mu/logic.py:84 msgid "Coding is collaboration." msgstr "Att koda är att sammarbeta." #: mu/logic.py:85 msgid "Compliment and amplify the good things with code." msgstr "Komplettera och förstärk bra saker med kod." #: mu/logic.py:86 msgid "" "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "" "I teorin så är teori och praktik samma sak. In praktiken, så är de inte det." #: mu/logic.py:88 msgid "Debugging is twice as hard as writing the code in the first place." msgstr "Debugging är dubbelt så svårt att skiva koden." #: mu/logic.py:89 msgid "It's fun to program." msgstr "Det är kul att programmera." #: mu/logic.py:90 msgid "Programming has more to do with problem solving than writing code." msgstr "Programmering har mer med problemlösningar att göra än att skriva kod." #: mu/logic.py:91 msgid "Start with your users' needs." msgstr "Starta med dina användares behov." #: mu/logic.py:92 msgid "Try to see things from your users' point of view." msgstr "Försök att se saker från dina användares håll." #: mu/logic.py:93 msgid "Put yourself in your users' shoes." msgstr "Sätt dig själv i användarens skor." #: mu/logic.py:94 msgid "" "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "" "Lösningen visar sig ofta när man förklarar sitt problem för en vän. :-)" #: mu/logic.py:96 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "Fråga om du inte vet. Ingen att fråga? Då är det bara att slå upp det." #: mu/logic.py:97 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "Komplexitet är en fiende. Håll det enkelt, dummer!" #: mu/logic.py:98 msgid "Beautiful is better than ugly." msgstr "Vackert är bättre än fult." #: mu/logic.py:99 msgid "Explicit is better than implicit." msgstr "Explicit är bättre än implicit." #: mu/logic.py:100 msgid "Simple is better than complex. Complex is better than complicated." msgstr "Enkelt är bättre än komplext. Komplext är bättre än komplicerat." #: mu/logic.py:101 msgid "Flat is better than nested." msgstr "Flat är bättre nestlat." #: mu/logic.py:102 msgid "Sparse is better than dense." msgstr "Glest är bättre än tätt." #: mu/logic.py:103 msgid "Readability counts." msgstr "Läsbarhet räknas." #: mu/logic.py:104 msgid "" "Special cases aren't special enough to break the rules. Although " "practicality beats purity." msgstr "" "Specialfall är inte speciella nog för att bryta reglerna. Pragmatism slår " "dock renhet." #: mu/logic.py:106 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "Fel ska aldrig passera tyst. Såvida explicit tystade." #: mu/logic.py:107 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "Vid tvetydighet, motstå frestelsen att gissa." #: mu/logic.py:108 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "Det ska finnas ett — och helst bara ett — uppenbart sätt att göra det." #: mu/logic.py:109 msgid "" "Now is better than never. Although never is often better than *right* now." msgstr "" "Nu är bättre än aldrig. Aldrig är i och för sig ofta bättre än *just* nu." #: mu/logic.py:111 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "Om en implementation är svår att förklara, så är den en dålig idé." #: mu/logic.py:112 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "Om en implementation är lätt att förklara, så är den nog en god idé." #: mu/logic.py:113 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "Namnrymder är en kanonidé — låt oss använda dem mer!" #: mu/logic.py:114 msgid "Mu was created by Nicholas H.Tollervey." msgstr "Mu skapades av Nicholas H.Tollervey." #: mu/logic.py:115 msgid "To understand what recursion is, you must first understand recursion." msgstr "För att förstår rekursion, måste du först förstå rekursion." #: mu/logic.py:116 msgid "" "Algorithm: a word used by programmers when they don't want to explain what " "they did." msgstr "" "Algoritm: ett ord som används av programmerare när det inte vill förklara " "vad de gjort." #: mu/logic.py:118 msgid "Programmers count from zero." msgstr "Programmerare räknar från noll." #: mu/logic.py:119 msgid "Simplicity is the ultimate sophistication." msgstr "Enkelhet är den ultimata sofistikeringen." #: mu/logic.py:120 msgid "A good programmer is humble." msgstr "En bra programmerare är ödmjuk." #: mu/logic.py:121 msgid "A good programmer is playful." msgstr "A bra programmerare är lekfull." #: mu/logic.py:122 msgid "A good programmer learns to learn." msgstr "En bra programmerare lär sig lärande." #: mu/logic.py:123 msgid "A good programmer thinks beyond the obvious." msgstr "En bra programmerare tänker bortom det uppenbara." #: mu/logic.py:124 msgid "A good programmer promotes simplicity." msgstr "En bra programmerare föredrar enkelhet." #: mu/logic.py:125 msgid "A good programmer avoids complexity." msgstr "En bra programmerare undviker komplexitet." #: mu/logic.py:126 msgid "A good programmer is patient." msgstr "En bra programmerare har tålamod." #: mu/logic.py:127 msgid "A good programmer asks questions." msgstr "En bra programmerare ställer frågor." #: mu/logic.py:128 msgid "A good programmer is willing to say, 'I don't know'." msgstr "A bra programmerare säger gärna: ‘Jag vet inte’." #: mu/logic.py:129 msgid "Wisest are they that know they know nothing." msgstr "Visast är de som vet att det inte vet någonting." #: mu/logic.py:439 msgid " above this line" msgstr " ovanför den här raden" #: mu/logic.py:484 msgid "" "Syntax error. Python cannot understand this line. Check for missing " "characters!" msgstr "" "Syntaxfel. Python kan inte förstå den här raden. Kontrollera om det saknas " "tecken!" #: mu/logic.py:669 msgid "# Write your code here :-)" msgstr "# Skriv din kod här :-)" #: mu/logic.py:707 msgid "" "The file contains characters Mu expects to be encoded as {0} or as the " "computer's default encoding {1}, but which are encoded in some other way.\n" "\n" "If this file was saved in another application, re-save the file via the " "'Save as' option and set the encoding to {0}" msgstr "" "Filen innehåller tecken Mu förväntar sig teckenkodas som {0} eller med " "datorns standardkodning {1}, men är teckenkodad på något annat sätt.\n" "\n" "Om filen sparades i en annan applikation, spara om den via ‘Spara som’ och " "sätt teckenkodningen till {0}" #: mu/logic.py:723 msgid "The file \"{}\" is already open." msgstr "Filen “{}” är redan öppen." #: mu/logic.py:735 msgid "Mu cannot read the characters in {}" msgstr "Mu kan inte läsa tecknen i {}" #: mu/logic.py:758 msgid "Mu was not able to open this file" msgstr "Mu kunde inte öppna filen" #: mu/logic.py:759 msgid "" "Currently Mu only works with Python source files or hex files created with " "embedded MicroPython code." msgstr "" "För nuvarande fungerar bara Mu med Python källkodsfiler eller hex-filer med " "MicroPython-kod." #: mu/logic.py:765 msgid "Could not load {}" msgstr "Kunde inte ladda {}" #: mu/logic.py:767 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "Existerar filen?\n" "Om den gör det, har tillåtelse att läsa den?\n" "\n" "Undersök och försök igen." #: mu/logic.py:773 msgid "Is this a {} file?" msgstr "Är det här en {} fil?" #: mu/logic.py:774 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "Det verkar som det här är en {}-fil.\n" "\n" "Vill du ändra Mu till {}-läget?" #: mu/logic.py:846 msgid "Could not save file (disk problem)" msgstr "Kunde inte spara filen (disk-problem)" #: mu/logic.py:847 msgid "" "Error saving file to disk. Ensure you have permission to write the file and " "sufficient disk space." msgstr "" "Kunde inte spara till disk. Kontrollera att du ha rättighet att skriva till " "filen och att det finns tillräckligt med diskutrymme." #: mu/logic.py:851 msgid "Could not save file (encoding problem)" msgstr "Kunde inte spara file (teckenkodningsproblem)" #: mu/logic.py:853 msgid "" "Unable to convert all the characters. If you have an encoding line at the " "top of the file, remove it and try again." msgstr "" "Kunde inte konvertera alla tecken. Om du har en teckenkodningsrad i början " "av filen, ta bort den och försök igen." #: mu/logic.py:862 msgid "Saved file: {}" msgstr "Sparat filen: {}" #: mu/logic.py:891 mu/logic.py:1229 msgid "You cannot use the filename \"{}\"" msgstr "Du kan inte använda filnamnet “{}”" #: mu/logic.py:893 msgid "" "This name is already used by another part of Python. If you use this name, " "things are likely to break. Please try again with a different filename." msgstr "" "Det här namnet används redan av en annan del av Python. Om du använder det, " "så kommer saker antagligen inte att fungera. Försök med ett annat filnamn." #: mu/logic.py:968 msgid "Good job! No problems found." msgstr "Snyggt jobbat! Hittade inga problem." #: mu/logic.py:969 msgid "Hurrah! Checker turned up no problems." msgstr "Hurra! Hittade inga problem efter kontrollen." #: mu/logic.py:970 msgid "Nice one! Zero problems detected." msgstr "Snyggt! Noll detekterade problem." #: mu/logic.py:971 msgid "Well done! No problems here." msgstr "Bra gjort! Inga problem här inte." #: mu/logic.py:972 msgid "Awesome! Zero problems found." msgstr "Häftigt! Inga hittade problem." #: mu/logic.py:999 msgid "" "There is un-saved work, exiting the application will cause you to lose it." msgstr "" "Det finns arbete som inte är sparat, om avslutar du applikationen förloras " "det." #: mu/logic.py:1052 msgid "Could not find MicroPython runtime." msgstr "Kunde inte hitta någon exekveringsmiljö för MicroPython." #: mu/logic.py:1053 msgid "" "The micro:bit runtime you specified ('{}') does not exist. Please try again." msgstr "Exekveringsmiljön (‘{}’) du angav finns inte. Försök igen." #: mu/logic.py:1123 msgid "Changed to {} mode." msgstr "Ändrat till {}-läget." #: mu/logic.py:1168 msgid "Detected new {} device." msgstr "Upptäckt new {} enhet." #: mu/logic.py:1175 msgid "Would you like to change Mu to the {} mode?" msgstr "Vill du ändra Mu till {}-läget?" #: mu/logic.py:1210 msgid "Cannot Set Breakpoint." msgstr "Kan inte sätta brytpunkt." #: mu/logic.py:1211 msgid "" "Lines that are comments or some multi-line statements cannot have " "breakpoints." msgstr "" "Kommentarsrader eller vissa flerraders statements kan inte ha brytpunkter." #: mu/logic.py:1231 msgid "" "This name is already used by another part of Python. If you use that name, " "things are likely to break. Please try again with a different filename." msgstr "" "Det här namnet används redan av en annan del av Python. Om du använder det, " "så kommer saker antagligen inte att fungera. Försök med ett annat filnamn." #: mu/logic.py:1248 msgid "Could not rename file." msgstr "Kunde inte byta namn på filen." #: mu/logic.py:1249 msgid "A file of that name is already open in Mu." msgstr "En fil med det namnet har redan öppnats i Mu." #: mu/logic.py:1278 msgid "Replaced \"{}\" with \"{}\"." msgstr "Ersatte “{}” med “{}”." #: mu/logic.py:1282 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "Ersatte {} träffar av “{}” med “{}”." #: mu/logic.py:1287 mu/logic.py:1294 msgid "Could not find \"{}\"." msgstr "Kunde inte hitta “{}”." #: mu/logic.py:1292 msgid "Highlighting matches for \"{}\"." msgstr "Markerar träffar för \"{}\"." #: mu/logic.py:1297 msgid "You must provide something to find." msgstr "Du måste ange något att söka efter." #: mu/logic.py:1298 msgid "Please try again, this time with something in the find box." msgstr "Försök igen, den här gången med något i sök-rutan." #: mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "Adafruit CircuitPython" #: mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "Använd CircuitPython på utvecklingskort från Adafruit." #: mu/modes/adafruit.py:71 msgid "Serial" msgstr "Seriell" #: mu/modes/adafruit.py:72 msgid "Open a serial connection to your device." msgstr "Öppna en seriell anslutning till din enhet." #: mu/modes/adafruit.py:79 mu/modes/microbit.py:215 mu/modes/python3.py:136 msgid "Plotter" msgstr "Plotter" #: mu/modes/adafruit.py:80 mu/modes/microbit.py:216 msgid "Plot incoming REPL data." msgstr "Plotta inkommande REPL-data." #: mu/modes/adafruit.py:150 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "Kunde inte hitta någon ansluten Adafruit CircuitPython-enhet." #: mu/modes/adafruit.py:152 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. " "Therefore, to edit these files you need to have the device plugged in. Until " "you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Python-filer för Adafruit CircuitPython-enheter lagras på enheten. Därför " "måste du ha enheten ansluten för att kunna ändra filerna. Tills dess att du " "ansluter en enhet, kommer Mu använda katalogen:\n" "\n" " {}\n" "\n" "…för att lagra din kod." #: mu/modes/base.py:177 msgid "Data Flood Detected!" msgstr "Dataöverflöde upptäckt!" #: mu/modes/base.py:178 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. " "As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent " "to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls " "to 'sleep' for a very short period of time." msgstr "" "Plottern är överflödad med data, vilket kommer göra frysa Mu och göra den " "icke-responsiv. Som en säkerhetsåtgärd har plotter stoppats.\n" "\n" "Överflödning är när datamängder på mer än 1024 bytes kontinuerligt skickas " "till plotter.\n" "\n" "För att lösa detta, kontrollera så att din kod skriver små datatupler " "blandat med anrop till ‘sleep’ med kort tid." #: mu/modes/base.py:273 mu/modes/base.py:312 msgid "" "Click on the device's reset button, wait a few seconds and then try again." msgstr "" "Tryck på enhetens reset-knapp, vänta att par sekunder och försök sedan igen." #: mu/modes/base.py:279 mu/modes/base.py:318 msgid "Could not find an attached device." msgstr "Kunde inte hitta någon ansluten enhet." #: mu/modes/base.py:280 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Kontrollera att enheten är ansluten till den här datorn.\n" "\n" "Den måste ha en version av MicroPython (eller CircuitPython) flashad på sig " "innan REPL fungerar.\n" "\n" "Slutligen, tryck på enhetens reset-knapp och vänta ett par sekunder innan du " "försöker igen." #: mu/modes/base.py:319 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Kontrollera att enheten är ansluten till den här datorn.\n" "\n" "Den måste ha en version av MicroPython (eller CircuitPython) flashad på sig " "innan plotter fungerar.\n" "\n" "Slutligen, tryck på enhetens reset-knapp och vänta ett par sekunder innan du " "försöker igen." #: mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "Grafisk debuter" #: mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "Debugga din Python 3-kod." #: mu/modes/debugger.py:50 mu/modes/pygamezero.py:109 mu/modes/python3.py:166 msgid "Stop" msgstr "Stopp" #: mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "Stoppa den körande koden." #: mu/modes/debugger.py:57 msgid "Continue" msgstr "Fortsätt" #: mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "Fortsätt att köra ditt Python-skript." #: mu/modes/debugger.py:64 msgid "Step Over" msgstr "Stega över" #: mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "Stega över en kodrad." #: mu/modes/debugger.py:71 msgid "Step In" msgstr "Stega in" #: mu/modes/debugger.py:72 msgid "Step into a function." msgstr "Stega in i en funktion." #: mu/modes/debugger.py:78 msgid "Step Out" msgstr "Stega ut" #: mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "Stega ut ur en funktion." #: mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "Ditt skript har slutat köra." #: mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "" "Kan inte koppla till Python-debuggern\n" "\n" #: mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "Debugger-info: {}" #: mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "Debugger-varning: {}" #: mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "Debugger-fel: {}" #: mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "BBC micro:bit" #: mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "Skriv MicroPython för BBC micro:bit." #: mu/modes/microbit.py:192 msgid "Flash" msgstr "Flasha" #: mu/modes/microbit.py:193 msgid "Flash your code onto the micro:bit." msgstr "Flasha din kod till micro:biten." #: mu/modes/microbit.py:199 msgid "Files" msgstr "Filer" #: mu/modes/microbit.py:200 msgid "Access the file system on the micro:bit." msgstr "Accessa filsystemet på micro:biten." #: mu/modes/microbit.py:206 mu/modes/python3.py:127 msgid "REPL" msgstr "REPL" #: mu/modes/microbit.py:207 msgid "Use the REPL to live-code on the micro:bit." msgstr "Använd REPL för att live-koda på micro:biten." #: mu/modes/microbit.py:257 msgid "Unable to flash \"{}\"" msgstr "Kunde inte flasha “{}”" #: mu/modes/microbit.py:267 msgid "Problem with script" msgstr "Problem med skrytet" #: mu/modes/microbit.py:268 msgid "{} [{}:{}]" msgstr "{} [{}:{}]" #: mu/modes/microbit.py:278 msgid "Our minifier tried but your script is too long!" msgstr "Vår minifierare försökte, men ditt skript är för långt!" #: mu/modes/microbit.py:283 msgid "Your script is too long and the minifier isn't available" msgstr "Ditt skript är för långt och minifieraren är inte tillgänglig" #: mu/modes/microbit.py:288 msgid "Your script is too long!" msgstr "Ditt skript är för långt!" #: mu/modes/microbit.py:368 msgid "Flashing \"{}\" onto the micro:bit." msgstr "Flashar “{}” till micro:biten." #: mu/modes/microbit.py:370 msgid " Runtime: {}" msgstr " Exekveringsmiljö: {}" #: mu/modes/microbit.py:416 msgid "Unsupported BBC micro:bit." msgstr "Osupportad BBC micro:bit." #: mu/modes/microbit.py:417 msgid "" "Your device is newer than this version of Mu. Please update Mu to the latest " "version to support this device.\n" "\n" "https://codewith.mu/" msgstr "" "Din enhet är nyare än den här versionen av Mu. Uppdatera Mu till den senaste " "version för att stödja enheten.\n" "\n" "https://codewith.mu/" #: mu/modes/microbit.py:474 mu/modes/microbit.py:611 msgid "Could not find an attached BBC micro:bit." msgstr "Kunde inte hitta en ansluten BBC micro:bit." #: mu/modes/microbit.py:475 msgid "" "Please ensure you leave enough time for the BBC micro:bit to be attached and " "configured correctly by your computer. This may take several seconds. " "Alternatively, try removing and re-attaching the device or saving your work " "and restarting Mu if the device remains unfound." msgstr "" "Lämna tillräckligt med tid för att BBC micro:biten ska hinna anslutas och " "konfigureras av din datorn. Det kan ta flera sekunder. Alterntivt, försök " "koppla loss och anslut sedan enheten igen eller spara ditt arbete och start " "om Mu om enheten fortfarande inte hittas." #: mu/modes/microbit.py:489 msgid "Finished flashing." msgstr "Avslutat flashning." #: mu/modes/microbit.py:524 msgid "Copied code onto micro:bit." msgstr "Kopierar koden till micro:biten." #: mu/modes/microbit.py:533 msgid "There was a problem flashing the micro:bit." msgstr "Det var ett problem med att flasha micro:biten." #: mu/modes/microbit.py:534 msgid "" "Please do not disconnect the device until flashing has completed. Please " "check the logs for more information." msgstr "" "Koppla inte bort enheten innan flashingen har avslutat. Titta i loggar efter " "mer information." #: mu/modes/microbit.py:555 msgid "REPL and file system cannot work at the same time." msgstr "REPL och filsystem kan inte användas samtidigt." #: mu/modes/microbit.py:556 msgid "" "The REPL and file system both use the same USB serial connection. Only one " "can be active at any time. Toggle the file system off and try again." msgstr "" "REPL och filsystemet använder båda samma seriella USB-anslutning. Bara en " "kan vara aktiv åt gången. Stäng av filsystemet och försök igen." #: mu/modes/microbit.py:573 msgid "The plotter and file system cannot work at the same time." msgstr "Plottern och filsystem kan inte användas samtidigt." #: mu/modes/microbit.py:575 msgid "" "The plotter and file system both use the same USB serial connection. Only " "one can be active at any time. Toggle the file system off and try again." msgstr "" "Plottern och filsystemet använder båda samma seriella USB-anslutning. Bara " "en kan vara aktiv åt gången. Stäng av filsystemet och försök igen." #: mu/modes/microbit.py:587 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "Filsystemet kan inte användas samtidigt som REPL eller plottern." #: mu/modes/microbit.py:589 msgid "" "The file system and the REPL and plotter use the same USB serial connection. " "Toggle the REPL and plotter off and try again." msgstr "" "Filsystemet, REPL och plottern använder samma seriella USB-koppling. Stänga " "av REPL och plotter och försök igen." #: mu/modes/microbit.py:612 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will " "work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "Kontrollera att enheter är kopplad till den här datorn.\n" "\n" "Enheten måste ha MicroPython flashat till den innan filsystemet kan " "fungera.\n" "\n" "Slutligen, tryck på enhetens reset-knapp och vänta ett par sekunder innan du " "försöker igen." #: mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "Pygame Zero" #: mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "Gör spel med Pygame Zero." #: mu/modes/pygamezero.py:51 mu/modes/pygamezero.py:101 msgid "Play" msgstr "Spela" #: mu/modes/pygamezero.py:52 mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "Spela ditt Pygame Zero-spel." #: mu/modes/pygamezero.py:58 msgid "Images" msgstr "Bilder" #: mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "Visa bilderna som används av Pygame Zero." #: mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "Fonter" #: mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "Visa fonterna som används av Pygame Zero." #: mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "Ljud" #: mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "Visa ljuden som används av Pygame Zero." #: mu/modes/pygamezero.py:79 msgid "Music" msgstr "Musik" #: mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "Visa musiken som används av Pygame Zero." #: mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "Stoppa ditt Pygame Zero-spel." #: mu/modes/python3.py:97 msgid "Python 3" msgstr "Python 3" #: mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "Skapa kod med standard Python 3." #: mu/modes/python3.py:113 mu/modes/python3.py:158 msgid "Run" msgstr "Kör" #: mu/modes/python3.py:114 mu/modes/python3.py:159 msgid "Run your Python script." msgstr "Kör ditt Python-skript." #: mu/modes/python3.py:120 msgid "Debug" msgstr "Debugga" #: mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "Debugga ditt Python-skript." #: mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "Använd REPL för live-kodning." #: mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "Plotta data från ditt skript eller från REPL." #: mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "Stoppa ditt Python-skript." #: mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "Startar iPython REPL." #: mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "Stoppar iPython REPL (det här kan ta en liten stund)." #: mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL startad." #: mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL stoppad." mu-editor-1.0.2+dfsg/mu/locale/zh_CN/000077500000000000000000000000001341747546300172355ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/zh_CN/LC_MESSAGES/000077500000000000000000000000001341747546300210225ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/locale/zh_CN/LC_MESSAGES/mu.mo000066400000000000000000000713011341747546300220020ustar00rootroot00000000000000[ &))*?!j$4 "?&b,(TDK +#5YKxJG7`1j5#>b~#9) "6XY"&%$A fer7J2\B7aVKb >g L ! !")!@L!!!!!!!!"# "!."P"l""r"-""?" # 3#A#F#&e#@#:#7$@$9G$J$$R$2%NG%%% %%;%#&<&A&D&#V&'z&!&&&&&@&6'!:'J\''(' ' '/'d(((m()!*+,J,;@-'|-----B-`9.". ...////0 020YA0 0 000 00&1,101 H1T1Y1y1 11 1#1$1#2$)2BN2*222[2<3Z3q3y3 3333333 4=%4=c4O445/6N6{U7L7898O8;:JA:E:j:b=;+;a;.<5<h%==!>E>1>1,?+^?s??@/.@^@+|@@@K@,A+DA(pA A#AA!aB8BB"B$BC%C.C 7CBC JCUCD E!E.@E+oEEE(E'F*,F$WF'|F$F6F0G'1G9YG&GGNG< H]H yHH6HHH"H"ID=IIIIII JOJ0oJxJK# K#DK(hKK"K6K'L)LhHLLL$L$L#$M%HM nMe{MMMNN1NONdN0yNN<NN(O>OWwOXOa(PEPQP"Q8Q!HQ4jQQQQQQ RR$R#+R(ORxRR"R(R%RKSSSfSyS#S-SQSH$TTmTT3TRTPUImUU6U VV2VEV=bV&VVV VV%V!W:W@W\WcWHjWWW9WX!X;XLX?aXaXY" YX-YYZs[[\T]0i]*]!] ] ]"]E!^ag^$^ ^^___`` `+`(0`Y```a"a6a"Fa3iaaaaaaa bb/"b%Rb%xb%b%b*bc1c8cKNcccccccdd.d5d"Kdnd>d@dH eUeueWfufllgLg&h-hIh/jQ6j?jij]2k5k]k$lLlrm{mn6n3n$n%oX?ooo4op2 pSpWp>wp6p#p(q :q'[qsqq'r>rWrprrr r rr ri" 2.4s{#*]_hAN>` Yea'Of|Wo}G%L-1,qy)7J8 k( HCbUmlX&<RK ^\Q~Ixj9Pn0:v$3DBdp?=M6w@tcSFZV/T5uE!g +[rz; Runtime: {} above this line# Write your code here :-)'{}' successfully copied to micro:bit.'{}' successfully deleted from micro:bit.(A dict of {} items.)(A list of {} items.)A file of that name is already open in Mu.A good programmer asks questions.A good programmer avoids complexity.A good programmer is humble.A good programmer is patient.A good programmer is playful.A good programmer is willing to say, 'I don't know'.A good programmer learns to learn.A good programmer promotes simplicity.A good programmer thinks beyond the obvious.Access the file system on the micro:bit.Adafruit CircuitPythonAlgorithm: a word used by programmers when they don't want to explain what they did.An open mind, spirit of adventure and respect for diversity are key.Awesome! Zero problems found.BBC micro:bitBBC micro:bit SettingsBe brave, break things, learn and have fun!Beautiful is better than ugly.Cannot Set Breakpoint.Cannot connect to device on port {}Change Mu's mode of behaviour.Change mode at any time by clicking the "Mode" button containing Mu's logo.Changed to {} mode.CheckCheck your code for mistakes.Click on the device's reset button, wait a few seconds and then try again.Coding is collaboration.Complexity is the enemy. KISS - keep it simple, stupid!Compliment and amplify the good things with code.Connection timed out. Is your machine slow or busy? Free up some of the machine's resources and try again.ContinueContinue to run your Python script.Copied code onto micro:bit.Copying '{}' to micro:bit.Could not find "{}".Could not find MicroPython runtime.Could not find an attached Adafruit CircuitPython device.Could not find an attached BBC micro:bit.Could not find an attached device.Could not find localhost. Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.Could not load {}Could not rename file.Could not save file (disk problem)Could not save file (encoding problem)Create a new Python script.Create code using standard Python 3.Current LogCurrently Mu only works with Python source files or hex files created with embedded MicroPython code.Data Flood Detected!DebugDebug InspectorDebug your Python 3 code.Debug your Python script.Debugger error: {}Debugger info: {}Debugger requires a Python script filename to run.Debugger warning: {}Debugging is twice as hard as writing the code in the first place.Delete (cannot be undone)Deleting '{}' from micro:bit.Detected new {} device.Diversity promotes creativity.Does this file exist? If it does, do you have permission to read it? Please check and try again.Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)Error saving file to disk. Ensure you have permission to write the file and sufficient disk space.Errors should never pass silently. Unless explicitly silenced.Explaining a programming problem to a friend often reveals the solution. :-)Explicit is better than implicit.File already existsFile already exists; overwrite it?File system cannot work at the same time as the REPL or plotter.FilesFiles on your computer:Files on your micro:bit:Filesystem on micro:bitFind / ReplaceFind:Finished flashing.FlashFlash your code onto the micro:bit.Flashing "{}" onto the micro:bit.Flat is better than nested.FontsFor the Zen of Python: import thisGetting '{}' from micro:bit. Copying to '{}'.Good job! No problems found.Google, Facebook, NASA, Pixar, Disney and many more use Python.Graphical DebuggerHello, World!HelpHighlighting matches for "{}".Hurrah! Checker turned up no problems.If the implementation is easy to explain, it may be a good idea.If the implementation is hard to explain, it's a bad idea.If you don't know, ask. Nobody to ask? Just look it up.ImagesIn the face of ambiguity, refuse the temptation to guess.In theory, theory and practice are the same. In practice, they're not. ;-)Is this a {} file?It looks like this could be a {} file. Would you like to change Mu to the {}mode?It's fun to program.Lines that are comments or some multi-line statements cannot have breakpoints.LoadLoad a Python script.Logging to {}Make games with Pygame Zero.Make your software both useful AND fun. Empower your users.Minify Python code before flashing?ModeMuMu AdministrationMu cannot read the characters in {}Mu was created by Nicholas H.Tollervey.Mu was not able to open this fileMu {}Mu's current mode of behaviour.MusicNameNamespaces are one honking great idea -- let's do more of those!NewNice one! Zero problems detected.Now is better than never. Although never is often better than *right* now.OpenOpen a serial connection to your device.Open in MuOpening '{}'Our minifier tried but your script is too long!Override the built-in MicroPython runtime with the following hex file (empty means use the default):PlayPlay your Pygame Zero game.Please do not disconnect the device until flashing has completed. Please check the logs for more information.Please ensure you leave enough time for the BBC micro:bit to be attached and configured correctly by your computer. This may take several seconds. Alternatively, try removing and re-attaching the device or saving your work and restarting Mu if the device remains unfound.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the Plotter will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. It must have a version of MicroPython (or CircuitPython) flashed onto it before the REPL will work. Finally, press the device's reset button and wait a few seconds before trying again.Please make sure the device is plugged into this computer. The device must have MicroPython flashed onto it before the file system will work. Finally, press the device's reset button and wait a few seconds before trying again.Please select the desired mode then click "OK". Otherwise, click "Cancel".Please try again, this time with something in the find box.Plot data from your script or the REPL.Plot incoming REPL data.PlotterProblem with scriptProgrammers count from zero.Programming has more to do with problem solving than writing code.Programming is a form of magic. Learn to cast the right spells with code and you'll be a wizard.Put yourself in your users' shoes.Pygame ZeroPython 3Python files for Adafruit CircuitPython devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, Mu will use the directory found here: {} ...to store your code.Python3 (Jupyter)Python3 EnvironmentPython3 data tupleQuitQuit Mu.REPLREPL and file system cannot work at the same time.REPL stands for read, evaluate, print, loop. It's a fun way to talk to your computer! :-)REPL started.REPL stopped.Readability counts.Replace (optional):Replace all?Replaced "{}" with "{}".Replaced {} matches of "{}" with "{}".RunRun your Python script.Running: {}SaveSave the current Python script.Saved file: {}Select ModeSerialShow help about Mu in a browser.Show the fonts used by Pygame Zero.Show the images used by Pygame Zero.Show the music used by Pygame Zero.Show the sounds used by Pygame Zero.Simple is better than complex. Complex is better than complicated.Simplicity is the ultimate sophistication.SoundsSparse is better than dense.Special cases aren't special enough to break the rules. Although practicality beats purity.Start with your users' needs.Starting iPython REPL.Step InStep OutStep OverStep into a function.Step out of a function.Step over a line of code.StopStop the running code.Stop your Pygame Zero game.Stop your Python script.Stopping iPython REPL (this may take a short amount of time).Successfully copied '{}' from the micro:bit to your computer.Syntax error. Python cannot understand this line. Check for missing characters!The REPL and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The environment variables shown below will be set each time you run a Python 3 script. Each separate enviroment variable should be on a new line and of the form: NAME=VALUEThe file "{}" is already open.The file contains characters Mu expects to be encoded as {0} or as the computer's default encoding {1}, but which are encoded in some other way. If this file was saved in another application, re-save the file via the 'Save as' option and set the encoding to {0}The file system and the REPL and plotter use the same USB serial connection. Toggle the REPL and plotter off and try again.The micro:bit runtime you specified ('{}') does not exist. Please try again.The plotter and file system both use the same USB serial connection. Only one can be active at any time. Toggle the file system off and try again.The plotter and file system cannot work at the same time.The plotter is flooded with data which will make Mu unresponsive and freeze. As a safeguard, the plotter has been stopped. Flooding is when chunks of data of more than 1024 bytes are repeatedly sent to the plotter. To fix this, make sure your code prints small tuples of data between calls to 'sleep' for a very short period of time.ThemeThere is un-saved work, exiting the application will cause you to lose it.There should be one-- and preferably only one --obvious way to do it.There was a problem copying the file '{}' onto the micro:bit. Please check Mu's logs for more information.There was a problem deleting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem flashing the micro:bit.There was a problem getting '{}' from the micro:bit. Please check Mu's logs for more information.There was a problem getting the list of files on the micro:bit. Please check Mu's logs for technical information. Alternatively, try unplugging/plugging-in your micro:bit and/or restarting Mu.This editor is called Mu (you say it 'mew' or 'moo').This editor is free software written in Python. You can modify it, add features or fix bugs if you like.This name is already used by another part of Python. If you use that name, things are likely to break. Please try again with a different filename.This name is already used by another part of Python. If you use this name, things are likely to break. Please try again with a different filename.To understand what recursion is, you must first understand recursion.Toggle theme between day, night or high contrast.Try to see things from your users' point of view.Unable to connect to the Python debugger. Unable to convert all the characters. If you have an encoding line at the top of the file, remove it and try again.Unable to flash "{}"Unsupported BBC micro:bit.Use CircuitPython on Adafruit's line of boards.Use the REPL for live coding.Use the REPL to live-code on the micro:bit.ValueWell done! No problems here.When reporting a bug, copy and paste the content of the following log file.Wisest are they that know they know nothing.Would you like to change Mu to the {} mode?Write MicroPython for the BBC micro:bit.You cannot use the filename "{}"You must provide something to find.Your device is newer than this version of Mu. Please update Mu to the latest version to support this device. https://codewith.mu/Your script has finished running.Your script is too long and the minifier isn't availableYour script is too long!Zoom in (to make the text bigger).Zoom out (to make the text smaller).Zoom-inZoom-outuntitled{} Plotter{} REPL{} [{}:{}]Project-Id-Version: Mu Chinese POT-Creation-Date: 2018-08-07 18:21+0800 PO-Revision-Date: 2018-11-19 13:46+0800 Language-Team: 管宁川John (Guan.NingChuan@Gmail.Com) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 X-Generator: Poedit 2.2 Last-Translator: 管宁川John Plural-Forms: nplurals=1; plural=0; Language: zh_CN 运行时:{} 在这行之上# 在这里写上你的代码 :-)“{}”已成功的复制到了 micro:bit 。已成功从 micro:bit 中删除“{}”。( {} 项的字典(dict)。)( {} 项的列表(list)。)该名称的文件已在 Mu 中打开。一个优秀的程序员善于提问。一个优秀的程序员会避免复杂。一个优秀的程序员很谦虚。一个优秀的程序员很有耐心。一个优秀的程序员很有趣。一个优秀的程序员愿意说:“我不懂”。一个优秀的程序员会学习如何学习。一个优秀的程序员崇尚简单。一个优秀的程序员思考不止于表面的问题。访问 micro:bit 上的文件系统。Adafruit CircuitPython算法:程序员在不想解释他们所做的事情时使用的一个词。开阔思路、冒险精神及尊重是多样性的关键。真棒!没发现问题。BBC micro:bitBBC micro:bit 设置要勇敢的打破一切,快乐的学习和玩耍!优美胜于丑陋。无法设置断点。无法在 {} 端口上连接设备改变Mu的运行模式。通过点击有Mu图标的“模式”按钮来随时更改模式。已更改为 {} 模式。检查检查代码中的错误。按一下设备的重置(reset)按钮,等待几秒钟,然后重试。编程需要合作。复杂是敌人。 KISS - keep it simple, stupid!(保持简单和纯粹!)使用代码来赞美和放大美好的东西。连接超时。是你的电脑运行太慢还是运行的东西太多?尝试清理内存或CPU占用再试一次吧。继续继续运行你的 Python 脚本。已将代码复制到 micro:bit 。正在将“{}”复制到 micro:bit 。找不到 ”{}”。找不到 MicroPython 运行时。找不到已连接的 Adafruit CircuitPython 设备。找不到已连接的 BBC micro:bit 。找不到已连接的设备。找不到 localhost 。 请确认你的 /etc/hosts 文件里有这一段:“127.0.0.1 localhost” 。无法加载 {}无法重命名文件。无法保存文件(磁盘问题)无法保存文件(编码问题)创建一个新的 Python 脚本。使用标准 Python 3 编写代码。当前日志目前,Mu 仅适用于使用嵌入式 MicroPython 代码创建的 Python 源文件或 hex 文件。检测到数据泛滥!调试调试检查器调试你的 Python 3 代码。调试你的 Python 脚本。调试器错误:{}调试器信息:{}调试器需要一个Python脚本才能运行。调试器警告:{}在开始的时候,调试代码比写代码要难两倍。删除(无法撤销)正在从 micro:bit 中删除“{}”。检测到新的 {} 设备。多样性促进创造力。这个文件存在吗? 如果存在,你有读取权限吗? 请检查并重试。如果它不起作用,别担心。 看看教程,修复它,然后再试一次!:-)将文件保存到磁盘时出错。 确保你有写入文件的权限和足够的磁盘空间。除非明确地使其沉默,错误永远不应该默默地溜走。与朋友讨论编程中遇到的问题,通常会获得新的解决方案。:-)显式胜于隐式。文件已存在文件已存在,是否覆盖?文件系统无法与REPL或绘图器同时工作。文件在电脑上的文件:在 micro:bit 上的文件:micro:bit 上的文件系统查找 / 替换查找:刷入完成。刷入将代码刷入到 micro:bit 上。正在将“{}”刷入到 micro:bit 。扁平胜于嵌套。字体了解 Python 之禅:import this正在将“{}”复制到 micro:bit 。干得漂亮! 没有发现问题。谷歌、Facebook、NASA、皮克斯、迪士尼等等都在使用Python。图形化调试器你好,世界!帮助高亮显示“{}”的匹配项。诶嘿!检查结果显示,没有问题。如果写的代码很容易清楚表述的话,那很有可能是个好想法。如果写的代码很难清楚表述的话,那就是个糟糕想法。如果你不知道,就提问吧。找不到人问的话,就自己查查看吧。图片面对不明确的定义,拒绝猜测的诱惑。理论上来说,理论和实践都是一样的。 在实践中,并不是。;-)这是一个 {} 文件吗?看起来这可能是一个{}文件。 你想将 Mu 改为{}模式吗?编程是个有趣的事情。作为单行或多行注释语句不能设置断点。加载加载一个 Python 脚本。记录日志到 {}用 Pygame Zero 做游戏。让你的软件既有用又有趣。 为你的用户赋能。在刷入之前缩小 Python 代码?模式MuMu 管理Mu 无法读取 {} 中的字符Mu 由 Nicholas H.Tollervey 创造。Mu 无法打开此文件Mu {}Mu 当前的运行模式。音乐名称命名空间是个绝妙的想法,让我们多多地使用它们吧!新建棒! 检测到0个问题。做比不做好,但立马去做有时还不如不做。打开打开与设备的串口连接。在 Mu 中打开正在打开“{}”我们的简化器尝试过了,但你的脚本实在太长!使用下面的hex文件重写内置的 MicroPython 运行环境(留空使用默认文件):开始开始你的 Pygame Zero 游戏。在刷入完成之前,请不要断开设备。 请查看日志以获取更多信息。请确保您留出了足够的时间让您的计算机正确连接和配置 BBC micro:bit 设备。这可能需要几秒钟的时间。 或者您可以尝试保存文件并重新连接设备,如果仍未发现设备,您还可以尝试重新启动 Mu 。请确保已将设备插入这台电脑。 在绘图器工作之前,设备必须有一个 MicroPython 或 CircuitPython 版本的固件已经刷入。 最后,按一下设备的重置(reset)按钮并等待几秒钟后再重试。请确保已将设备插入这台电脑。 在 REPL 工作之前,设备必须有一个 MicroPython 或 CircuitPython 版本的固件已经刷入。 最后,按一下设备的重置(reset)按钮并等待几秒钟后再重试。请确保已将设备插入此计算机。 在文件系统工作之前,设备必须已输入MicroPython。 最后,按设备的重置(reset)按钮并等待几秒钟后再重试。请选择所需模式,然后单击“确定”。否则,请单击“取消”。请在查找框中输入内容,然后重试。从你的脚本或 REPL 的绘制数据。绘制由 REPL 传入的数据。绘图器脚本问题程序员们都从0开始计数。编程更多地是为了解决问题,而不是单纯的写代码。编程是一种魔法。 学习使用代码施放正确的法术,你将成为一名魔法师。让自己站在用户的位置上。Pygame ZeroPython 3Adafruit CircuitPython 设备的 Python 文件存储在设备上。 因此,要编辑这些文件,需要您插入设备。在插入设备之前,Mu 将使用这个目录:  {} …来存储您的代码。Python3(Jupyter)Python3 环境变量Python3 数据元组退出退出 Mu 。REPLREPL和文件系统不能同时工作。REPL 代表“读取(Read)-求值(Evaluate)-打印(Print)”的循环(Loop)。 这是与您的计算机交谈的一个有趣方式!:-)REPL 已启动。REPL 已停止。可读性应当被重视。替换(可选):全部替换?已将“{}”替换为“{}”。已将{}个“{}”的匹配项替换为“{}”。运行运行你的 Python 脚本。运行脚本:{}保存保存当前 Python 脚本。已保存文件:{}选择模式串口在浏览器中显示关于Mu的帮助内容。显示 Pygame Zero 使用的字体。显示 Pygame Zero 使用的图片。显示 Pygame Zero 使用的音乐。显示 Pygame Zero 使用的音效。简单胜于复杂。复杂胜于难懂。简单是终极的复杂。音效分散胜于密集。尽管实用性会打败纯粹性,特例也不能凌驾于规则之上。从你的用户需求出发。正在启动 iPython REPL 。步入步出步进步入一个函数。步出一个函数。步进一行代码。停止停止运行代码。停止你的 Pygame Zero 游戏。停止你的 Python 脚本。正在停止 iPython REPL (可能需要一点点时间)。已成功从 micro:bit 中,复制“{}”到你的电脑上。语法错误。 Python 无法理解这一行。 检查缺少的字符!REPL和文件系统都使用相同的USB串口通讯。任何时候只能使用其中一个功能。请关闭文件系统,然后重试。每次运行 Python 3 脚本时都会设置下面的环境变量。 每行一个单独的环境变量: 名称 = 值文件“{}”已经打开。文件的编码有问题,该文件所包含字符应为 Mu 的默认编码{0}或计算机的默认编码{1}。 如果此文件是通过另外一个应用程序保存,请通过“另存为”选项重新保存文件,并将编码设置为{0}文件系统、REPL、绘图器使用相同的USB串口通讯。 请关闭REPL和绘图器,然后重试。您指定的 micro:bit 运行时(’{}’)不存在。请再试一次。绘图器和文件系统都使用相同的USB串口通讯。任何时候只能使用其中一个功能。请关闭文件系统,然后重试。绘图器和文件系统无法同时工作。绘图器已经数据泛滥,这将使 Mu 无响应并卡死。作为一种保护措施,绘图器已经停止。 泛滥是指不停的发送超过 1024 字节的大量数据到绘图器。 要解决此问题,请确保您的代码在打印小的元组(tuple)数据的间隔中,调用非常短时间的“sleep”函数。主题你有还没有保存的代码,如果现在退出程序的话将不会保存。只用一种方法,最好只有一种方法来做一件事。将文件“{}”复制到 micro:bit 上时出现问题。 请查看 Mu 的日志以获取更多信息。从 micro:bit 删除“{}”时出现问题。 请查看 Mu 的日志以获取更多信息。刷入程序到 micro:bit 时出现了一个问题。从 micro:bit 获取’{}’时出现问题。 请查看 Mu 的日志以获取更多信息。获取 micro:bit 上的文件列表时出现问题。 请查看Mu的日志以获取技术信息。 或者尝试重新插拔 micro:bit 和重启 Mu 。这个编辑器名为 Mu ,你可以读作“谬(miu)”或“沐(mu)”。这个编辑器是用 Python 编写的免费软件。 您可以根据需要修改,添加功能或修复错误。这个名字已被 Python 的另一部分使用。如果你使用这个名字,可能会出问题。请使用其他文件名重试。这个名字已被 Python 的另一部分使用。如果你使用这个名字,可能会出问题。请使用其他文件名重试。要理解递归是什么,你必须先了解递归。切换日间、夜间或者高对比度的主题。尝试从用户的角度看问题。无法连接到 Python 调试器。 无法转换所有字符。 如果文件顶部有编码行,请将其删除并重试。无法刷入“{}”不支持的 BBC micro:bit 。在 Adafruit 的开发板上使用 CircuitPython 。用 REPL 进行实时编程。使用 REPL 在 micro:bit 上实时编写代码。值做得好! 这里没问题。反馈 bug 时,复制并粘贴以下日志文件的内容。最聪明的是他们知道他们什么都不知道。你想将 Mu 改为 {} 模式吗?为 BBC micro:bit 编写 MicroPython 。你不能使用文件名“{}”你需要提供需要查找的内容。您的设备比此版本的 Mu 更新。 请将 Mu 更新到最新版本以支持此设备。 https://codewith.mu/您的脚本已完成运行。您的脚本太长,简化器不可用你的脚本太长了!放大编辑器文本。缩小编辑器文本。放大缩小无标题{} 绘图器{} REPL{} [{}:{}]mu-editor-1.0.2+dfsg/mu/locale/zh_CN/LC_MESSAGES/mu.po000066400000000000000000020513151341747546300220120ustar00rootroot00000000000000# Mu-Chinese # Copyright (C) 2018 管宁川John # 管宁川John , 2018. # msgid "" msgstr "" "Project-Id-Version: Mu Chinese\n" "POT-Creation-Date: 2018-08-07 18:21+0800\n" "PO-Revision-Date: 2018-11-19 13:46+0800\n" "Language-Team: 管宁川John (Guan.NingChuan@Gmail.Com)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 2.2\n" "Last-Translator: 管宁川John \n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: zh_CN\n" #: mu/app.py:66 msgid "Logging to {}" msgstr "记录日志到 {}" #: mu/app.py:183 msgid "Debugger requires a Python script filename to run." msgstr "调试器需要一个Python脚本才能运行。" #: mu/debugger/client.py:106 msgid "" "Connection timed out. Is your machine slow or busy? Free up some of the " "machine's resources and try again." msgstr "" "连接超时。是你的电脑运行太慢还是运行的东西太多?尝试清理内存或CPU占用再试一次" "吧。" #: mu/debugger/client.py:116 msgid "" "Could not find localhost.\n" "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file." msgstr "" "找不到 localhost 。\n" "请确认你的 /etc/hosts 文件里有这一段:“127.0.0.1 localhost” 。" #: mu/interface/dialogs.py:55 msgid "Select Mode" msgstr "选择模式" #: mu/interface/dialogs.py:57 msgid "" "Please select the desired mode then click \"OK\". Otherwise, click \"Cancel" "\"." msgstr "请选择所需模式,然后单击“确定”。否则,请单击“取消”。" #: mu/interface/dialogs.py:73 msgid "" "Change mode at any time by clicking the \"Mode\" button containing Mu's logo." msgstr "通过点击有Mu图标的“模式”按钮来随时更改模式。" #: mu/interface/dialogs.py:107 msgid "" "When reporting a bug, copy and paste the content of the following log file." msgstr "反馈 bug 时,复制并粘贴以下日志文件的内容。" #: mu/interface/dialogs.py:127 msgid "" "The environment variables shown below will be set each time you run a Python " "3 script.\n" "\n" "Each separate enviroment variable should be on a new line and of the form:\n" "NAME=VALUE" msgstr "" "每次运行 Python 3 脚本时都会设置下面的环境变量。\n" "\n" "每行一个单独的环境变量: \n" "名称 = 值" #: mu/interface/dialogs.py:150 msgid "Minify Python code before flashing?" msgstr "在刷入之前缩小 Python 代码?" #: mu/interface/dialogs.py:153 msgid "" "Override the built-in MicroPython runtime with the following hex file (empty " "means use the default):" msgstr "使用下面的hex文件重写内置的 MicroPython 运行环境(留空使用默认文件):" #: mu/interface/dialogs.py:175 mu/interface/main.py:977 msgid "Mu Administration" msgstr "Mu 管理" #: mu/interface/dialogs.py:186 msgid "Current Log" msgstr "当前日志" #: mu/interface/dialogs.py:189 msgid "Python3 Environment" msgstr "Python3 环境变量" #: mu/interface/dialogs.py:194 msgid "BBC micro:bit Settings" msgstr "BBC micro:bit 设置" #: mu/interface/dialogs.py:223 msgid "Find / Replace" msgstr "查找 / 替换" #: mu/interface/dialogs.py:227 msgid "Find:" msgstr "查找:" #: mu/interface/dialogs.py:233 msgid "Replace (optional):" msgstr "替换(可选):" #: mu/interface/dialogs.py:239 msgid "Replace all?" msgstr "全部替换?" #: mu/interface/editor.py:222 mu/logic.py:952 msgid "untitled" msgstr "无标题" #: mu/interface/main.py:69 msgid "Mode" msgstr "模式" #: mu/interface/main.py:70 msgid "Change Mu's mode of behaviour." msgstr "改变Mu的运行模式。" #: mu/interface/main.py:72 msgid "New" msgstr "新建" #: mu/interface/main.py:73 msgid "Create a new Python script." msgstr "创建一个新的 Python 脚本。" #: mu/interface/main.py:74 msgid "Load" msgstr "加载" #: mu/interface/main.py:75 msgid "Load a Python script." msgstr "加载一个 Python 脚本。" #: mu/interface/main.py:76 msgid "Save" msgstr "保存" #: mu/interface/main.py:77 msgid "Save the current Python script." msgstr "保存当前 Python 脚本。" #: mu/interface/main.py:86 msgid "Zoom-in" msgstr "放大" #: mu/interface/main.py:87 msgid "Zoom in (to make the text bigger)." msgstr "放大编辑器文本。" #: mu/interface/main.py:88 msgid "Zoom-out" msgstr "缩小" #: mu/interface/main.py:89 msgid "Zoom out (to make the text smaller)." msgstr "缩小编辑器文本。" #: mu/interface/main.py:90 msgid "Theme" msgstr "主题" #: mu/interface/main.py:91 msgid "Toggle theme between day, night or high contrast." msgstr "切换日间、夜间或者高对比度的主题。" #: mu/interface/main.py:94 msgid "Check" msgstr "检查" #: mu/interface/main.py:95 msgid "Check your code for mistakes." msgstr "检查代码中的错误。" #: mu/interface/main.py:96 msgid "Help" msgstr "帮助" #: mu/interface/main.py:97 msgid "Show help about Mu in a browser." msgstr "在浏览器中显示关于Mu的帮助内容。" #: mu/interface/main.py:98 msgid "Quit" msgstr "退出" #: mu/interface/main.py:99 msgid "Quit Mu." msgstr "退出 Mu 。" #: mu/interface/main.py:178 msgid "Mu {}" msgstr "Mu {}" #: mu/interface/main.py:354 msgid "Cannot connect to device on port {}" msgstr "无法在 {} 端口上连接设备" #: mu/interface/main.py:376 msgid "Filesystem on micro:bit" msgstr "micro:bit 上的文件系统" #: mu/interface/main.py:435 msgid "Python3 data tuple" msgstr "Python3 数据元组" #: mu/interface/main.py:447 msgid "Python3 (Jupyter)" msgstr "Python3(Jupyter)" #: mu/interface/main.py:454 msgid "{} REPL" msgstr "{} REPL" #: mu/interface/main.py:470 msgid "{} Plotter" msgstr "{} 绘图器" #: mu/interface/main.py:511 msgid "Running: {}" msgstr "运行脚本:{}" #: mu/interface/main.py:534 msgid "Debug Inspector" msgstr "调试检查器" #: mu/interface/main.py:552 msgid "Name" msgstr "名称" #: mu/interface/main.py:552 msgid "Value" msgstr "值" #: mu/interface/main.py:569 msgid "(A list of {} items.)" msgstr "( {} 项的列表(list)。)" #: mu/interface/main.py:582 msgid "(A dict of {} items.)" msgstr "( {} 项的字典(dict)。)" #: mu/interface/main.py:720 msgid "Mu" msgstr "Mu" #: mu/interface/main.py:970 msgid "Mu's current mode of behaviour." msgstr "Mu 当前的运行模式。" #: mu/interface/panes.py:296 msgid "File already exists; overwrite it?" msgstr "文件已存在,是否覆盖?" #: mu/interface/panes.py:297 msgid "File already exists" msgstr "文件已存在" #: mu/interface/panes.py:325 msgid "Copying '{}' to micro:bit." msgstr "正在将“{}”复制到 micro:bit 。" #: mu/interface/panes.py:334 msgid "'{}' successfully copied to micro:bit." msgstr "“{}”已成功的复制到了 micro:bit 。" #: mu/interface/panes.py:340 msgid "Delete (cannot be undone)" msgstr "删除(无法撤销)" #: mu/interface/panes.py:346 msgid "Deleting '{}' from micro:bit." msgstr "正在从 micro:bit 中删除“{}”。" #: mu/interface/panes.py:355 msgid "'{}' successfully deleted from micro:bit." msgstr "已成功从 micro:bit 中删除“{}”。" #: mu/interface/panes.py:385 msgid "Getting '{}' from micro:bit. Copying to '{}'." msgstr "正在将“{}”复制到 micro:bit 。" #: mu/interface/panes.py:396 msgid "Successfully copied '{}' from the micro:bit to your computer." msgstr "已成功从 micro:bit 中,复制“{}”到你的电脑上。" #: mu/interface/panes.py:409 msgid "Open in Mu" msgstr "在 Mu 中打开" #: mu/interface/panes.py:411 msgid "Open" msgstr "打开" #: mu/interface/panes.py:417 msgid "Opening '{}'" msgstr "正在打开“{}”" #: mu/interface/panes.py:457 msgid "Files on your micro:bit:" msgstr "在 micro:bit 上的文件:" #: mu/interface/panes.py:459 msgid "Files on your computer:" msgstr "在电脑上的文件:" #: mu/interface/panes.py:527 msgid "" "There was a problem getting the list of files on the micro:bit. Please check " "Mu's logs for technical information. Alternatively, try unplugging/plugging-" "in your micro:bit and/or restarting Mu." msgstr "" "获取 micro:bit 上的文件列表时出现问题。 请查看Mu的日志以获取技术信息。 或者尝" "试重新插拔 micro:bit 和重启 Mu 。" #: mu/interface/panes.py:538 msgid "" "There was a problem copying the file '{}' onto the micro:bit. Please check " "Mu's logs for more information." msgstr "" "将文件“{}”复制到 micro:bit 上时出现问题。 请查看 Mu 的日志以获取更多信息。" #: mu/interface/panes.py:546 msgid "" "There was a problem deleting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "从 micro:bit 删除“{}”时出现问题。 请查看 Mu 的日志以获取更多信息。" #: mu/interface/panes.py:554 msgid "" "There was a problem getting '{}' from the micro:bit. Please check Mu's logs " "for more information." msgstr "从 micro:bit 获取’{}’时出现问题。 请查看 Mu 的日志以获取更多信息。" #: mu/logic.py:68 msgid "Hello, World!" msgstr "你好,世界!" #: mu/logic.py:69 msgid "" "This editor is free software written in Python. You can modify it, add " "features or fix bugs if you like." msgstr "" "这个编辑器是用 Python 编写的免费软件。 您可以根据需要修改,添加功能或修复错" "误。" #: mu/logic.py:71 msgid "This editor is called Mu (you say it 'mew' or 'moo')." msgstr "这个编辑器名为 Mu ,你可以读作“谬(miu)”或“沐(mu)”。" #: mu/logic.py:72 msgid "Google, Facebook, NASA, Pixar, Disney and many more use Python." msgstr "谷歌、Facebook、NASA、皮克斯、迪士尼等等都在使用Python。" #: mu/logic.py:73 msgid "" "Programming is a form of magic. Learn to cast the right spells with code and " "you'll be a wizard." msgstr "编程是一种魔法。 学习使用代码施放正确的法术,你将成为一名魔法师。" #: mu/logic.py:75 msgid "" "REPL stands for read, evaluate, print, loop. It's a fun way to talk to your " "computer! :-)" msgstr "" "REPL 代表“读取(Read)-求值(Evaluate)-打印(Print)”的循环(Loop)。 这是与您的计算" "机交谈的一个有趣方式!:-)" #: mu/logic.py:77 msgid "Be brave, break things, learn and have fun!" msgstr "要勇敢的打破一切,快乐的学习和玩耍!" #: mu/logic.py:78 msgid "Make your software both useful AND fun. Empower your users." msgstr "让你的软件既有用又有趣。 为你的用户赋能。" #: mu/logic.py:79 msgid "For the Zen of Python: import this" msgstr "了解 Python 之禅:import this" #: mu/logic.py:80 msgid "Diversity promotes creativity." msgstr "多样性促进创造力。" #: mu/logic.py:81 msgid "An open mind, spirit of adventure and respect for diversity are key." msgstr "开阔思路、冒险精神及尊重是多样性的关键。" #: mu/logic.py:82 msgid "" "Don't worry if it doesn't work. Learn the lesson, fix it and try again! :-)" msgstr "如果它不起作用,别担心。 看看教程,修复它,然后再试一次!:-)" #: mu/logic.py:84 msgid "Coding is collaboration." msgstr "编程需要合作。" #: mu/logic.py:85 msgid "Compliment and amplify the good things with code." msgstr "使用代码来赞美和放大美好的东西。" #: mu/logic.py:86 msgid "" "In theory, theory and practice are the same. In practice, they're not. ;-)" msgstr "理论上来说,理论和实践都是一样的。 在实践中,并不是。;-)" #: mu/logic.py:88 msgid "Debugging is twice as hard as writing the code in the first place." msgstr "在开始的时候,调试代码比写代码要难两倍。" #: mu/logic.py:89 msgid "It's fun to program." msgstr "编程是个有趣的事情。" #: mu/logic.py:90 msgid "Programming has more to do with problem solving than writing code." msgstr "编程更多地是为了解决问题,而不是单纯的写代码。" #: mu/logic.py:91 msgid "Start with your users' needs." msgstr "从你的用户需求出发。" #: mu/logic.py:92 msgid "Try to see things from your users' point of view." msgstr "尝试从用户的角度看问题。" #: mu/logic.py:93 msgid "Put yourself in your users' shoes." msgstr "让自己站在用户的位置上。" #: mu/logic.py:94 msgid "" "Explaining a programming problem to a friend often reveals the solution. :-)" msgstr "与朋友讨论编程中遇到的问题,通常会获得新的解决方案。:-)" #: mu/logic.py:96 msgid "If you don't know, ask. Nobody to ask? Just look it up." msgstr "如果你不知道,就提问吧。找不到人问的话,就自己查查看吧。" #: mu/logic.py:97 msgid "Complexity is the enemy. KISS - keep it simple, stupid!" msgstr "复杂是敌人。 KISS - keep it simple, stupid!(保持简单和纯粹!)" #: mu/logic.py:98 msgid "Beautiful is better than ugly." msgstr "优美胜于丑陋。" #: mu/logic.py:99 msgid "Explicit is better than implicit." msgstr "显式胜于隐式。" #: mu/logic.py:100 msgid "Simple is better than complex. Complex is better than complicated." msgstr "简单胜于复杂。复杂胜于难懂。" #: mu/logic.py:101 msgid "Flat is better than nested." msgstr "扁平胜于嵌套。" #: mu/logic.py:102 msgid "Sparse is better than dense." msgstr "分散胜于密集。" #: mu/logic.py:103 msgid "Readability counts." msgstr "可读性应当被重视。" #: mu/logic.py:104 msgid "" "Special cases aren't special enough to break the rules. Although " "practicality beats purity." msgstr "尽管实用性会打败纯粹性,特例也不能凌驾于规则之上。" #: mu/logic.py:106 msgid "Errors should never pass silently. Unless explicitly silenced." msgstr "除非明确地使其沉默,错误永远不应该默默地溜走。" #: mu/logic.py:107 msgid "In the face of ambiguity, refuse the temptation to guess." msgstr "面对不明确的定义,拒绝猜测的诱惑。" #: mu/logic.py:108 msgid "There should be one-- and preferably only one --obvious way to do it." msgstr "只用一种方法,最好只有一种方法来做一件事。" #: mu/logic.py:109 msgid "" "Now is better than never. Although never is often better than *right* now." msgstr "做比不做好,但立马去做有时还不如不做。" #: mu/logic.py:111 msgid "If the implementation is hard to explain, it's a bad idea." msgstr "如果写的代码很难清楚表述的话,那就是个糟糕想法。" #: mu/logic.py:112 msgid "If the implementation is easy to explain, it may be a good idea." msgstr "如果写的代码很容易清楚表述的话,那很有可能是个好想法。" #: mu/logic.py:113 msgid "Namespaces are one honking great idea -- let's do more of those!" msgstr "命名空间是个绝妙的想法,让我们多多地使用它们吧!" #: mu/logic.py:114 msgid "Mu was created by Nicholas H.Tollervey." msgstr "Mu 由 Nicholas H.Tollervey 创造。" #: mu/logic.py:115 msgid "To understand what recursion is, you must first understand recursion." msgstr "要理解递归是什么,你必须先了解递归。" #: mu/logic.py:116 msgid "" "Algorithm: a word used by programmers when they don't want to explain what " "they did." msgstr "算法:程序员在不想解释他们所做的事情时使用的一个词。" #: mu/logic.py:118 msgid "Programmers count from zero." msgstr "程序员们都从0开始计数。" #: mu/logic.py:119 msgid "Simplicity is the ultimate sophistication." msgstr "简单是终极的复杂。" #: mu/logic.py:120 msgid "A good programmer is humble." msgstr "一个优秀的程序员很谦虚。" #: mu/logic.py:121 msgid "A good programmer is playful." msgstr "一个优秀的程序员很有趣。" #: mu/logic.py:122 msgid "A good programmer learns to learn." msgstr "一个优秀的程序员会学习如何学习。" #: mu/logic.py:123 msgid "A good programmer thinks beyond the obvious." msgstr "一个优秀的程序员思考不止于表面的问题。" #: mu/logic.py:124 msgid "A good programmer promotes simplicity." msgstr "一个优秀的程序员崇尚简单。" #: mu/logic.py:125 msgid "A good programmer avoids complexity." msgstr "一个优秀的程序员会避免复杂。" #: mu/logic.py:126 msgid "A good programmer is patient." msgstr "一个优秀的程序员很有耐心。" #: mu/logic.py:127 msgid "A good programmer asks questions." msgstr "一个优秀的程序员善于提问。" #: mu/logic.py:128 msgid "A good programmer is willing to say, 'I don't know'." msgstr "一个优秀的程序员愿意说:“我不懂”。" #: mu/logic.py:129 msgid "Wisest are they that know they know nothing." msgstr "最聪明的是他们知道他们什么都不知道。" #: mu/logic.py:439 msgid " above this line" msgstr " 在这行之上" #: mu/logic.py:484 msgid "" "Syntax error. Python cannot understand this line. Check for missing " "characters!" msgstr "语法错误。 Python 无法理解这一行。 检查缺少的字符!" #: mu/logic.py:669 msgid "# Write your code here :-)" msgstr "# 在这里写上你的代码 :-)" #: mu/logic.py:707 msgid "" "The file contains characters Mu expects to be encoded as {0} or as the " "computer's default encoding {1}, but which are encoded in some other way.\n" "\n" "If this file was saved in another application, re-save the file via the " "'Save as' option and set the encoding to {0}" msgstr "" "文件的编码有问题,该文件所包含字符应为 Mu 的默认编码{0}或计算机的默认编码" "{1}。\n" "\n" "如果此文件是通过另外一个应用程序保存,请通过“另存为”选项重新保存文件,并将编" "码设置为{0}" #: mu/logic.py:723 msgid "The file \"{}\" is already open." msgstr "文件“{}”已经打开。" #: mu/logic.py:735 msgid "Mu cannot read the characters in {}" msgstr "Mu 无法读取 {} 中的字符" #: mu/logic.py:758 msgid "Mu was not able to open this file" msgstr "Mu 无法打开此文件" #: mu/logic.py:759 msgid "" "Currently Mu only works with Python source files or hex files created with " "embedded MicroPython code." msgstr "" "目前,Mu 仅适用于使用嵌入式 MicroPython 代码创建的 Python 源文件或 hex 文件。" #: mu/logic.py:765 msgid "Could not load {}" msgstr "无法加载 {}" #: mu/logic.py:767 msgid "" "Does this file exist?\n" "If it does, do you have permission to read it?\n" "\n" "Please check and try again." msgstr "" "这个文件存在吗?\n" "如果存在,你有读取权限吗?\n" "\n" "请检查并重试。" #: mu/logic.py:773 msgid "Is this a {} file?" msgstr "这是一个 {} 文件吗?" #: mu/logic.py:774 msgid "" "It looks like this could be a {} file.\n" "\n" "Would you like to change Mu to the {}mode?" msgstr "" "看起来这可能是一个{}文件。\n" "\n" "你想将 Mu 改为{}模式吗?" #: mu/logic.py:846 msgid "Could not save file (disk problem)" msgstr "无法保存文件(磁盘问题)" #: mu/logic.py:847 msgid "" "Error saving file to disk. Ensure you have permission to write the file and " "sufficient disk space." msgstr "将文件保存到磁盘时出错。 确保你有写入文件的权限和足够的磁盘空间。" #: mu/logic.py:851 msgid "Could not save file (encoding problem)" msgstr "无法保存文件(编码问题)" #: mu/logic.py:853 msgid "" "Unable to convert all the characters. If you have an encoding line at the " "top of the file, remove it and try again." msgstr "无法转换所有字符。 如果文件顶部有编码行,请将其删除并重试。" #: mu/logic.py:862 msgid "Saved file: {}" msgstr "已保存文件:{}" #: mu/logic.py:891 mu/logic.py:1229 msgid "You cannot use the filename \"{}\"" msgstr "你不能使用文件名“{}”" #: mu/logic.py:893 msgid "" "This name is already used by another part of Python. If you use this name, " "things are likely to break. Please try again with a different filename." msgstr "" "这个名字已被 Python 的另一部分使用。如果你使用这个名字,可能会出问题。请使用" "其他文件名重试。" #: mu/logic.py:968 msgid "Good job! No problems found." msgstr "干得漂亮! 没有发现问题。" #: mu/logic.py:969 msgid "Hurrah! Checker turned up no problems." msgstr "诶嘿!检查结果显示,没有问题。" #: mu/logic.py:970 msgid "Nice one! Zero problems detected." msgstr "棒! 检测到0个问题。" #: mu/logic.py:971 msgid "Well done! No problems here." msgstr "做得好! 这里没问题。" #: mu/logic.py:972 msgid "Awesome! Zero problems found." msgstr "真棒!没发现问题。" #: mu/logic.py:999 msgid "" "There is un-saved work, exiting the application will cause you to lose it." msgstr "你有还没有保存的代码,如果现在退出程序的话将不会保存。" #: mu/logic.py:1052 msgid "Could not find MicroPython runtime." msgstr "找不到 MicroPython 运行时。" #: mu/logic.py:1053 msgid "" "The micro:bit runtime you specified ('{}') does not exist. Please try again." msgstr "您指定的 micro:bit 运行时(’{}’)不存在。请再试一次。" #: mu/logic.py:1123 msgid "Changed to {} mode." msgstr "已更改为 {} 模式。" #: mu/logic.py:1168 msgid "Detected new {} device." msgstr "检测到新的 {} 设备。" #: mu/logic.py:1175 msgid "Would you like to change Mu to the {} mode?" msgstr "你想将 Mu 改为 {} 模式吗?" #: mu/logic.py:1210 msgid "Cannot Set Breakpoint." msgstr "无法设置断点。" #: mu/logic.py:1211 msgid "" "Lines that are comments or some multi-line statements cannot have " "breakpoints." msgstr "作为单行或多行注释语句不能设置断点。" #: mu/logic.py:1231 msgid "" "This name is already used by another part of Python. If you use that name, " "things are likely to break. Please try again with a different filename." msgstr "" "这个名字已被 Python 的另一部分使用。如果你使用这个名字,可能会出问题。请使用" "其他文件名重试。" #: mu/logic.py:1248 msgid "Could not rename file." msgstr "无法重命名文件。" #: mu/logic.py:1249 msgid "A file of that name is already open in Mu." msgstr "该名称的文件已在 Mu 中打开。" #: mu/logic.py:1278 msgid "Replaced \"{}\" with \"{}\"." msgstr "已将“{}”替换为“{}”。" #: mu/logic.py:1282 msgid "Replaced {} matches of \"{}\" with \"{}\"." msgstr "已将{}个“{}”的匹配项替换为“{}”。" #: mu/logic.py:1287 mu/logic.py:1294 msgid "Could not find \"{}\"." msgstr "找不到 ”{}”。" #: mu/logic.py:1292 msgid "Highlighting matches for \"{}\"." msgstr "高亮显示“{}”的匹配项。" #: mu/logic.py:1297 msgid "You must provide something to find." msgstr "你需要提供需要查找的内容。" #: mu/logic.py:1298 msgid "Please try again, this time with something in the find box." msgstr "请在查找框中输入内容,然后重试。" #: mu/modes/adafruit.py:32 msgid "Adafruit CircuitPython" msgstr "Adafruit CircuitPython" #: mu/modes/adafruit.py:33 msgid "Use CircuitPython on Adafruit's line of boards." msgstr "在 Adafruit 的开发板上使用 CircuitPython 。" #: mu/modes/adafruit.py:71 msgid "Serial" msgstr "串口" #: mu/modes/adafruit.py:72 msgid "Open a serial connection to your device." msgstr "打开与设备的串口连接。" #: mu/modes/adafruit.py:79 mu/modes/microbit.py:215 mu/modes/python3.py:136 msgid "Plotter" msgstr "绘图器" #: mu/modes/adafruit.py:80 mu/modes/microbit.py:216 msgid "Plot incoming REPL data." msgstr "绘制由 REPL 传入的数据。" #: mu/modes/adafruit.py:150 msgid "Could not find an attached Adafruit CircuitPython device." msgstr "找不到已连接的 Adafruit CircuitPython 设备。" #: mu/modes/adafruit.py:152 msgid "" "Python files for Adafruit CircuitPython devices are stored on the device. " "Therefore, to edit these files you need to have the device plugged in. Until " "you plug in a device, Mu will use the directory found here:\n" "\n" " {}\n" "\n" "...to store your code." msgstr "" "Adafruit CircuitPython 设备的 Python 文件存储在设备上。 因此,要编辑这些文" "件,需要您插入设备。在插入设备之前,Mu 将使用这个目录:\n" "\n" " {}\n" "\n" "…来存储您的代码。" #: mu/modes/api/adafruit.py:23 msgid "" "_stage.Layer(width, height, graphic, palette, grid) \n" "Keep internal information about a layer of graphics (either a\n" "Grid or a Sprite) in a format suitable for fast rendering\n" "with the render() function.\n" "\n" "\n" "Parameters:\n" "width (int) -- The width of the grid in tiles, or 1 for sprites.\n" "height (int) -- The height of the grid in tiles, or 1 for sprites.\n" "graphic (bytearray) -- The graphic data of the tiles.\n" "palette (bytearray) -- The color palette to be used.\n" "grid (bytearray) -- The contents of the grid map." msgstr "" #: mu/modes/api/adafruit.py:24 msgid "_stage.Layer.frame(frame, rotation) \n" msgstr "" #: mu/modes/api/adafruit.py:25 msgid "_stage.Layer.move(x, y) \n" msgstr "" #: mu/modes/api/adafruit.py:26 msgid "" "_stage.Text(width, height, font, palette, chars) \n" "Keep internal information about a text of text\n" "in a format suitable for fast rendering\n" "with the render() function.\n" "\n" "\n" "Parameters:\n" "width (int) -- The width of the grid in tiles, or 1 for sprites.\n" "height (int) -- The height of the grid in tiles, or 1 for sprites.\n" "font (bytearray) -- The font data of the characters.\n" "palette (bytearray) -- The color palette to be used.\n" "chars (bytearray) -- The contents of the character grid." msgstr "" #: mu/modes/api/adafruit.py:27 msgid "_stage.Text.move(x, y) \n" msgstr "" #: mu/modes/api/adafruit.py:28 msgid "" "_stage.render(x0, y0, x1, y1, layers, buffer, spi) \n" "Render and send to the display a fragment of the screen.\n" "\n" "\n" "\n" "\n" "Parameters:\n" "x0 (int) -- Left edge of the fragment.\n" "y0 (int) -- Top edge of the fragment.\n" "x1 (int) -- Right edge of the fragment.\n" "y1 (int) -- Bottom edge of the fragment.\n" "layers (list) -- A list of the Layer objects.\n" "buffer (bytearray) -- A buffer to use for rendering.\n" "spi (SPI) -- The SPI bus to use.\n" "\n" "\n" "\n" "\n" "\n" "Note that this function only sends the raw pixel data. Setting up\n" "the display for receiving it and handling the chip-select and\n" "data-command pins has to be done outside of it.\n" "There are also no sanity checks, outside of the basic overflow\n" "checking. The caller is responsible for making the passed parameters\n" "valid.\n" "This function is intended for internal use in the stage library\n" "and all the necessary checks are performed there.\n" msgstr "" #: mu/modes/api/adafruit.py:29 mu/modes/api/adafruit.py:30 msgid "" "analogio.AnalogIn(pin) \n" "Use the AnalogIn on the given pin. The reference voltage varies by\n" "platform so use reference_voltage to read the configured setting.\n" "\n" "\n" "Parameters:pin (Pin) -- the pin to read from" msgstr "" #: mu/modes/api/adafruit.py:31 mu/modes/api/adafruit.py:32 msgid "" "analogio.AnalogIn.deinit() \n" "Turn off the AnalogIn and release the pin for other use.\n" msgstr "" #: mu/modes/api/adafruit.py:33 msgid "" "analogio.AnalogIn.reference_voltage() \n" "The maximum voltage measurable. Also known as the reference voltage.\n" "\n" "\n" "\n" "\n" "Returns:the reference voltage\n" "\n" "Return type:float\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:34 msgid "" "analogio.AnalogIn.reference_voltage() \n" "The maximum voltage measurable (also known as the reference voltage) as a\n" "float in Volts.\n" msgstr "" #: mu/modes/api/adafruit.py:35 msgid "" "analogio.AnalogIn.value() \n" "Read the value on the analog pin and return it. The returned value\n" "will be between 0 and 65535 inclusive (16-bit). Even if the underlying\n" "analog to digital converter (ADC) is lower resolution, the result will\n" "be scaled to be 16-bit.\n" "\n" "\n" "\n" "\n" "Returns:the data read\n" "\n" "Return type:int\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:36 msgid "" "analogio.AnalogIn.value() \n" "The value on the analog pin between 0 and 65535 inclusive (16-bit). (read-" "only)\n" "Even if the underlying analog to digital converter (ADC) is lower\n" "resolution, the value is 16-bit.\n" msgstr "" #: mu/modes/api/adafruit.py:37 mu/modes/api/adafruit.py:38 msgid "" "analogio.AnalogOut(pin) \n" "Use the AnalogOut on the given pin.\n" "\n" "\n" "Parameters:pin (Pin) -- the pin to output to" msgstr "" #: mu/modes/api/adafruit.py:39 mu/modes/api/adafruit.py:40 msgid "" "analogio.AnalogOut.deinit() \n" "Turn off the AnalogOut and release the pin for other use.\n" msgstr "" #: mu/modes/api/adafruit.py:41 msgid "" "analogio.AnalogOut.value() \n" "The value on the analog pin. The value must be between 0 and 65535\n" "inclusive (16-bit). Even if the underlying digital to analog converter\n" "is lower resolution, the input must be scaled to be 16-bit.\n" "\n" "\n" "\n" "\n" "Returns:the last value written\n" "\n" "Return type:int\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:42 msgid "" "analogio.AnalogOut.value() \n" "The value on the analog pin between 0 and 65535 inclusive (16-bit). (write-" "only)\n" "Even if the underlying digital to analog converter (DAC) is lower\n" "resolution, the value is 16-bit.\n" msgstr "" #: mu/modes/api/adafruit.py:43 msgid "" "audiobusio.I2SOut(bit_clock, word_select, data, *, left_justified) \n" "Create a I2SOut object associated with the given pins.\n" "\n" "\n" "Parameters:\n" "bit_clock (Pin) -- The bit clock (or serial clock) pin\n" "word_select (Pin) -- The word select (or left/right clock) pin\n" "data (Pin) -- The data pin\n" "left_justified (bool) -- True when data bits are aligned with the word " "select clock. False\n" "when they are shifted by one to match classic I2S protocol." msgstr "" #: mu/modes/api/adafruit.py:44 msgid "" "audiobusio.I2SOut.deinit() \n" "Deinitialises the I2SOut and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:45 msgid "" "audiobusio.I2SOut.paused() \n" "True when playback is paused. (read-only)\n" msgstr "" #: mu/modes/api/adafruit.py:46 msgid "" "audiobusio.I2SOut.playing() \n" "True when the audio sample is being output. (read-only)\n" msgstr "" #: mu/modes/api/adafruit.py:47 msgid "" "audiobusio.PDMIn(clock_pin, data_pin, *, frequency=8000, bit_depth=8, " "mono=True, oversample=64) \n" "Create a PDMIn object associated with the given pins. This allows you to\n" "record audio signals from the given pins. Individual ports may put further\n" "restrictions on the recording parameters.\n" "\n" "\n" "Parameters:\n" "clock_pin (Pin) -- The pin to output the clock to\n" "data_pin (Pin) -- The pin to read the data from\n" "frequency (int) -- Target frequency of the resulting samples. Check " "frequency for real value.\n" "bit_depth (int) -- Final number of bits per sample. Must be divisible by 8\n" "mono (bool) -- True when capturing a single channel of audio, captures two " "channels otherwise\n" "oversample (int) -- Number of single bit samples to decimate into a final " "sample. Must be divisible by 8" msgstr "" #: mu/modes/api/adafruit.py:48 msgid "" "audiobusio.PDMIn(clock_pin, data_pin, *, sample_rate=16000, bit_depth=8, " "mono=True, oversample=64, startup_delay=0.11) \n" "Create a PDMIn object associated with the given pins. This allows you to\n" "record audio signals from the given pins. Individual ports may put further\n" "restrictions on the recording parameters. The overall sample rate is\n" "determined by sample_rate x oversample, and the total must be 1MHz or\n" "higher, so sample_rate must be a minimum of 16000.\n" "\n" "\n" "Parameters:\n" "clock_pin (Pin) -- The pin to output the clock to\n" "data_pin (Pin) -- The pin to read the data from\n" "sample_rate (int) -- Target sample_rate of the resulting samples. Check " "sample_rate for actual value.\n" "Minimum sample_rate is about 16000 Hz.\n" "bit_depth (int) -- Final number of bits per sample. Must be divisible by 8\n" "mono (bool) -- True when capturing a single channel of audio, captures two " "channels otherwise\n" "oversample (int) -- Number of single bit samples to decimate into a final " "sample. Must be divisible by 8\n" "startup_delay (float) -- seconds to wait after starting microphone clock\n" "to allow microphone to turn on. Most require only 0.01s; some require 0.1s. " "Longer is safer.\n" "Must be in range 0.0-1.0 seconds." msgstr "" #: mu/modes/api/adafruit.py:49 msgid "" "audiobusio.PDMIn.deinit() \n" "Deinitialises the PWMOut and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:50 msgid "" "audiobusio.PDMIn.deinit() \n" "Deinitialises the PDMIn and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:51 msgid "" "audiobusio.PDMIn.frequency() \n" "The actual frequency of the recording. This may not match the constructed\n" "frequency due to internal clock limitations.\n" msgstr "" #: mu/modes/api/adafruit.py:52 msgid "" "audiobusio.PDMIn.sample_rate() \n" "The actual sample_rate of the recording. This may not match the constructed\n" "sample rate due to internal clock limitations.\n" msgstr "" #: mu/modes/api/adafruit.py:53 msgid "" "audioio.AudioOut(pin, sample_source) \n" "Create a AudioOut object associated with the given pin. This allows you to\n" "play audio signals out on the given pin. Sample_source must be a bytes-like " "object.\n" "\n" "The sample itself should consist of 16 bit samples and be mono.\n" "Microcontrollers with a lower output resolution will use the highest order\n" "bits to output. For example, the SAMD21 has a 10 bit DAC that ignores the\n" "lowest 6 bits when playing 16 bit samples.\n" "\n" "\n" "Parameters:\n" "pin (Pin) -- The pin to output to\n" "sample_source (bytes-like) -- The source of the sample" msgstr "" #: mu/modes/api/adafruit.py:54 msgid "" "audioio.AudioOut(left_channel, right_channel=None) \n" "Create a AudioOut object associated with the given pin(s). This allows you " "to\n" "play audio signals out on the given pin(s).\n" "\n" "\n" "Parameters:\n" "left_channel (Pin) -- The pin to output the left channel to\n" "right_channel (Pin) -- The pin to output the right channel to" msgstr "" #: mu/modes/api/adafruit.py:55 msgid "" "audioio.AudioOut.deinit() \n" "Deinitialises the PWMOut and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:56 msgid "" "audioio.AudioOut.deinit() \n" "Deinitialises the AudioOut and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:57 msgid "" "audioio.AudioOut.frequency() \n" "32 bit value that dictates how quickly samples are loaded into the DAC\n" "in Hertz (cycles per second). When the sample is looped, this can change\n" "the pitch output without changing the underlying sample.\n" msgstr "" #: mu/modes/api/adafruit.py:58 msgid "" "audioio.AudioOut.paused() \n" "True when playback is paused. (read-only)\n" msgstr "" #: mu/modes/api/adafruit.py:59 msgid "" "audioio.AudioOut.playing() \n" "True when the audio sample is being output.\n" msgstr "" #: mu/modes/api/adafruit.py:60 msgid "" "audioio.AudioOut.playing() \n" "True when an audio sample is being output even if paused. (read-only)\n" msgstr "" #: mu/modes/api/adafruit.py:61 msgid "" "audioio.RawSample(buffer, *, channel_count=1, sample_rate=8000) \n" "Create a RawSample based on the given buffer of signed values. If " "channel_count is more than\n" "1 then each channel’s samples should alternate. In other words, for a two " "channel buffer, the\n" "first sample will be for channel 1, the second sample will be for channel " "two, the third for\n" "channel 1 and so on.\n" "\n" "\n" "Parameters:\n" "buffer (array) -- An array.array with samples\n" "channel_count (int) -- The number of channels in the buffer\n" "sample_rate (int) -- The desired playback sample rate" msgstr "" #: mu/modes/api/adafruit.py:62 msgid "" "audioio.RawSample.deinit() \n" "Deinitialises the AudioOut and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:63 msgid "" "audioio.RawSample.sample_rate() \n" "32 bit value that dictates how quickly samples are played in Hertz (cycles " "per second).\n" "When the sample is looped, this can change the pitch output without changing " "the underlying\n" "sample. This will not change the sample rate of any active playback. Call " "play again to\n" "change it.\n" msgstr "" #: mu/modes/api/adafruit.py:64 msgid "" "audioio.WaveFile(filename) \n" "Load a .wav file for playback with audioio.AudioOut or audiobusio.I2SOut.\n" "\n" "\n" "Parameters:file (bytes-like) -- Already opened wave file" msgstr "" #: mu/modes/api/adafruit.py:65 msgid "" "audioio.WaveFile.deinit() \n" "Deinitialises the WaveFile and releases all memory resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:66 msgid "" "audioio.WaveFile.sample_rate() \n" "32 bit value that dictates how quickly samples are loaded into the DAC\n" "in Hertz (cycles per second). When the sample is looped, this can change\n" "the pitch output without changing the underlying sample.\n" msgstr "" #: mu/modes/api/adafruit.py:67 msgid "" "bitbangio.I2C(scl, sda, *, frequency=400000) \n" "I2C is a two-wire protocol for communicating between devices. At the\n" "physical level it consists of 2 wires: SCL and SDA, the clock and data\n" "lines respectively.\n" "\n" "\n" "Parameters:\n" "scl (Pin) -- The clock pin\n" "sda (Pin) -- The data pin\n" "frequency (int) -- The clock frequency of the bus" msgstr "" #: mu/modes/api/adafruit.py:68 msgid "" "bitbangio.I2C(scl, sda, *, frequency=400000) \n" "I2C is a two-wire protocol for communicating between devices. At the\n" "physical level it consists of 2 wires: SCL and SDA, the clock and data\n" "lines respectively.\n" "\n" "\n" "Parameters:\n" "scl (Pin) -- The clock pin\n" "sda (Pin) -- The data pin\n" "frequency (int) -- The clock frequency of the bus\n" "timeout (int) -- The maximum clock stretching timeout in microseconds" msgstr "" #: mu/modes/api/adafruit.py:69 mu/modes/api/adafruit.py:70 msgid "" "bitbangio.I2C.deinit() \n" "Releases control of the underlying hardware so other classes can use it.\n" msgstr "" #: mu/modes/api/adafruit.py:71 mu/modes/api/adafruit.py:72 msgid "" "bitbangio.OneWire(pin) \n" "Create a OneWire object associated with the given pin. The object\n" "implements the lowest level timing-sensitive bits of the protocol.\n" "\n" "\n" "Parameters:pin (Pin) -- Pin to read pulses from." msgstr "" #: mu/modes/api/adafruit.py:73 mu/modes/api/adafruit.py:74 msgid "" "bitbangio.OneWire.deinit() \n" "Deinitialize the OneWire bus and release any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:75 mu/modes/api/adafruit.py:76 msgid "" "bitbangio.SPI(clock, MOSI=None, MISO=None) \n" "\n" "Parameters:\n" "clock (Pin) -- the pin to use for the clock.\n" "MOSI (Pin) -- the Master Out Slave In pin.\n" "MISO (Pin) -- the Master In Slave Out pin." msgstr "" #: mu/modes/api/adafruit.py:77 mu/modes/api/adafruit.py:78 msgid "" "bitbangio.SPI.deinit() \n" "Turn off the SPI bus.\n" msgstr "" #: mu/modes/api/adafruit.py:79 msgid "" "busio.I2C(scl, sda, *, frequency=400000) \n" "I2C is a two-wire protocol for communicating between devices. At the\n" "physical level it consists of 2 wires: SCL and SDA, the clock and data\n" "lines respectively.\n" "\n" "\n" "Parameters:\n" "scl (Pin) -- The clock pin\n" "sda (Pin) -- The data pin\n" "frequency (int) -- The clock frequency in Hertz" msgstr "" #: mu/modes/api/adafruit.py:80 msgid "" "busio.I2C(scl, sda, *, frequency=400000) \n" "I2C is a two-wire protocol for communicating between devices. At the\n" "physical level it consists of 2 wires: SCL and SDA, the clock and data\n" "lines respectively.\n" "\n" "\n" "Parameters:\n" "scl (Pin) -- The clock pin\n" "sda (Pin) -- The data pin\n" "frequency (int) -- The clock frequency in Hertz\n" "timeout (int) -- The maximum clock stretching timeut - only for bitbang" msgstr "" #: mu/modes/api/adafruit.py:81 mu/modes/api/adafruit.py:82 msgid "" "busio.I2C.deinit() \n" "Releases control of the underlying hardware so other classes can use it.\n" msgstr "" #: mu/modes/api/adafruit.py:83 mu/modes/api/adafruit.py:84 msgid "" "busio.OneWire(pin) \n" "Create a OneWire object associated with the given pin. The object\n" "implements the lowest level timing-sensitive bits of the protocol.\n" "\n" "\n" "Parameters:pin (Pin) -- Pin connected to the OneWire bus" msgstr "" #: mu/modes/api/adafruit.py:85 mu/modes/api/adafruit.py:86 msgid "" "busio.OneWire.deinit() \n" "Deinitialize the OneWire bus and release any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:87 mu/modes/api/adafruit.py:88 msgid "" "busio.SPI(clock, MOSI=None, MISO=None) \n" "\n" "Parameters:\n" "clock (Pin) -- the pin to use for the clock.\n" "MOSI (Pin) -- the Master Out Slave In pin.\n" "MISO (Pin) -- the Master In Slave Out pin." msgstr "" #: mu/modes/api/adafruit.py:89 mu/modes/api/adafruit.py:90 msgid "" "busio.SPI.deinit() \n" "Turn off the SPI bus.\n" msgstr "" #: mu/modes/api/adafruit.py:91 msgid "" "busio.SPI.frequency() \n" "The actual SPI bus frequency. This may not match the frequency requested\n" "due to internal limitations.\n" msgstr "" #: mu/modes/api/adafruit.py:92 msgid "" "busio.UART(tx, rx, *, baudrate=9600, bits=8, parity=None, stop=1, " "timeout=1000, receiver_buffer_size=64) \n" "A common bidirectional serial protocol that uses an an agreed upon speed\n" "rather than a shared clock line.\n" "\n" "\n" "Parameters:\n" "tx (Pin) -- the pin to transmit with\n" "rx (Pin) -- the pin to receive on\n" "baudrate (int) -- the transmit and receive speed" msgstr "" #: mu/modes/api/adafruit.py:93 msgid "" "busio.UART(tx, rx, *, baudrate=9600, bits=8, parity=None, stop=1, " "timeout=1000, receiver_buffer_size=64) \n" "A common bidirectional serial protocol that uses an an agreed upon speed\n" "rather than a shared clock line.\n" "\n" "\n" "Parameters:\n" "tx (Pin) -- the pin to transmit with, or None if this UART is receive-only.\n" "rx (Pin) -- the pin to receive on, or None if this UART is transmit-only.\n" "baudrate (int) -- the transmit and receive speed." msgstr "" #: mu/modes/api/adafruit.py:94 mu/modes/api/adafruit.py:95 msgid "" "busio.UART.Parity() \n" "Enum-like class to define the parity used to verify correct data transfer.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:96 mu/modes/api/adafruit.py:97 msgid "" "busio.UART.Parity.EVEN() \n" "Total number of ones should be even.\n" msgstr "" #: mu/modes/api/adafruit.py:98 mu/modes/api/adafruit.py:99 msgid "" "busio.UART.Parity.ODD() \n" "Total number of ones should be odd.\n" msgstr "" #: mu/modes/api/adafruit.py:100 msgid "" "busio.UART.baudrate() \n" "The current baudrate.\n" msgstr "" #: mu/modes/api/adafruit.py:101 mu/modes/api/adafruit.py:102 msgid "" "busio.UART.deinit() \n" "Deinitialises the UART and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:103 mu/modes/api/adafruit.py:104 msgid "" "digitalio.DigitalInOut(pin) \n" "Create a new DigitalInOut object associated with the pin. Defaults to input\n" "with no pull. Use switch_to_input() and\n" "switch_to_output() to change the direction.\n" "\n" "\n" "Parameters:pin (Pin) -- The pin to control" msgstr "" #: mu/modes/api/adafruit.py:105 mu/modes/api/adafruit.py:106 msgid "" "digitalio.DigitalInOut.Direction() \n" "Enum-like class to define which direction the digital values are\n" "going.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:107 mu/modes/api/adafruit.py:108 msgid "" "digitalio.DigitalInOut.Direction.INPUT() \n" "Read digital data in\n" msgstr "" #: mu/modes/api/adafruit.py:109 mu/modes/api/adafruit.py:110 msgid "" "digitalio.DigitalInOut.Direction.OUTPUT() \n" "Write digital data out\n" msgstr "" #: mu/modes/api/adafruit.py:111 mu/modes/api/adafruit.py:112 msgid "" "digitalio.DigitalInOut.deinit() \n" "Turn off the DigitalInOut and release the pin for other use.\n" msgstr "" #: mu/modes/api/adafruit.py:113 mu/modes/api/adafruit.py:114 msgid "" "digitalio.DigitalInOut.direction() \n" "The direction of the pin.\n" "Setting this will use the defaults from the corresponding\n" "switch_to_input() or switch_to_output() method. If\n" "you want to set pull, value or drive mode prior to switching, then use\n" "those methods instead.\n" msgstr "" #: mu/modes/api/adafruit.py:115 msgid "" "digitalio.DigitalInOut.drive_mode() \n" "Get or set the pin drive mode.\n" msgstr "" #: mu/modes/api/adafruit.py:116 msgid "" "digitalio.DigitalInOut.drive_mode() \n" "The pin drive mode. One of:\n" "\n" "digitalio.DriveMode.PUSH_PULL\n" "digitalio.DriveMode.OPEN_DRAIN\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:117 msgid "" "digitalio.DigitalInOut.pull() \n" "Get or set the pin pull. Values may be digitalio.Pull.UP,\n" "digitalio.Pull.DOWN or None.\n" "\n" "\n" "\n" "\n" "Raises:AttributeError -- if the direction is ~`digitalio.Direction.OUTPUT`.\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:118 msgid "" "digitalio.DigitalInOut.pull() \n" "The pin pull direction. One of:\n" "\n" "digitalio.Pull.UP\n" "digitalio.Pull.DOWN\n" "None\n" "\n" "\n" "\n" "\n" "\n" "Raises:AttributeError -- if direction is OUTPUT.\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:119 mu/modes/api/adafruit.py:120 msgid "" "digitalio.DigitalInOut.value() \n" "The digital logic level of the pin.\n" msgstr "" #: mu/modes/api/adafruit.py:121 mu/modes/api/adafruit.py:122 msgid "" "digitalio.DriveMode() \n" "Enum-like class to define the drive mode used when outputting\n" "digital values.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:123 mu/modes/api/adafruit.py:124 msgid "" "digitalio.DriveMode.OPEN_DRAIN() \n" "Output low digital values but go into high z for digital high. This is\n" "useful for i2c and other protocols that share a digital line.\n" msgstr "" #: mu/modes/api/adafruit.py:125 mu/modes/api/adafruit.py:126 msgid "" "digitalio.DriveMode.PUSH_PULL() \n" "Output both high and low digital values\n" msgstr "" #: mu/modes/api/adafruit.py:127 mu/modes/api/adafruit.py:128 msgid "" "digitalio.Pull() \n" "Enum-like class to define the pull value, if any, used while reading\n" "digital values in.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:129 mu/modes/api/adafruit.py:130 msgid "" "digitalio.Pull.DOWN() \n" "When the input line isn’t being driven the pull down can pull the\n" "state of the line low so it reads as false.\n" msgstr "" #: mu/modes/api/adafruit.py:131 mu/modes/api/adafruit.py:132 msgid "" "digitalio.Pull.UP() \n" "When the input line isn’t being driven the pull up can pull the state\n" "of the line high so it reads as true.\n" msgstr "" #: mu/modes/api/adafruit.py:133 msgid "" "gamepad.GamePad(b1, b2, b3, b4, b5, b6, b7, b8) \n" "Initializes button scanning routines.\n" "\n" "The b1-b8 parameters are DigitalInOut objects, which\n" "immediately get switched to input with a pull-up, and then scanned\n" "regularly for button presses. The order is the same as the order of\n" "bits returned by the get_pressed function. You can re-initialize\n" "it with different keys, then the new object will replace the previous\n" "one.\n" "\n" "The basic feature required here is the ability to poll the keys at\n" "regular intervals (so that de-bouncing is consistent) and fast enough\n" "(so that we don’t miss short button presses) while at the same time\n" "letting the user code run normally, call blocking functions and wait\n" "on delays.\n" "\n" "They button presses are accumulated, until the get_pressed method\n" "is called, at which point the button state is cleared, and the new\n" "button presses start to be recorded.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:134 msgid "" "gamepad.GamePad.deinit() \n" "Disable button scanning.\n" msgstr "" #: mu/modes/api/adafruit.py:135 msgid "" "gamepad.GamePad.get_pressed() \n" "Get the status of buttons pressed since the last call and clear it.\n" "Returns an 8-bit number, with bits that correspond to buttons,\n" "which have been pressed (or held down) since the last call to this\n" "function set to 1, and the remaining bits set to 0. Then it clears\n" "the button state, so that new button presses (or buttons that are\n" "held down) can be recorded for the next call.\n" msgstr "" #: mu/modes/api/adafruit.py:136 msgid "" "math.acos(x) \n" "Return the inverse cosine of x.\n" msgstr "" #: mu/modes/api/adafruit.py:137 msgid "" "math.asin(x) \n" "Return the inverse sine of x.\n" msgstr "" #: mu/modes/api/adafruit.py:138 msgid "" "math.atan(x) \n" "Return the inverse tangent of x.\n" msgstr "" #: mu/modes/api/adafruit.py:139 msgid "" "math.atan2(y, x) \n" "Return the principal value of the inverse tangent of y/x.\n" msgstr "" #: mu/modes/api/adafruit.py:140 msgid "" "math.ceil(x) \n" "Return an integer, being x rounded towards positive infinity.\n" msgstr "" #: mu/modes/api/adafruit.py:141 msgid "" "math.copysign(x, y) \n" "Return x with the sign of y.\n" msgstr "" #: mu/modes/api/adafruit.py:142 msgid "" "math.cos(x) \n" "Return the cosine of x.\n" msgstr "" #: mu/modes/api/adafruit.py:143 msgid "" "math.degrees(x) \n" "Return radians x converted to degrees.\n" msgstr "" #: mu/modes/api/adafruit.py:144 msgid "" "math.exp(x) \n" "Return the exponential of x.\n" msgstr "" #: mu/modes/api/adafruit.py:145 msgid "" "math.fabs(x) \n" "Return the absolute value of x.\n" msgstr "" #: mu/modes/api/adafruit.py:146 msgid "" "math.floor(x) \n" "Return an integer, being x rounded towards negative infinity.\n" msgstr "" #: mu/modes/api/adafruit.py:147 msgid "" "math.fmod(x, y) \n" "Return the remainder of x/y.\n" msgstr "" #: mu/modes/api/adafruit.py:148 msgid "" "math.frexp(x) \n" "Decomposes a floating-point number into its mantissa and exponent.\n" "The returned value is the tuple (m, e) such that x == m * 2**e\n" "exactly. If x == 0 then the function returns (0.0, 0), otherwise\n" "the relation 0.5 <= abs(m) < 1 holds.\n" msgstr "" #: mu/modes/api/adafruit.py:149 msgid "" "math.isfinite(x) \n" "Return True if x is finite.\n" msgstr "" #: mu/modes/api/adafruit.py:150 msgid "" "math.isinf(x) \n" "Return True if x is infinite.\n" msgstr "" #: mu/modes/api/adafruit.py:151 msgid "" "math.isnan(x) \n" "Return True if x is not-a-number\n" msgstr "" #: mu/modes/api/adafruit.py:152 msgid "" "math.ldexp(x, exp) \n" "Return x * (2**exp).\n" msgstr "" #: mu/modes/api/adafruit.py:153 msgid "" "math.modf(x) \n" "Return a tuple of two floats, being the fractional and integral parts of\n" "x. Both return values have the same sign as x.\n" msgstr "" #: mu/modes/api/adafruit.py:154 msgid "" "math.pow(x, y) \n" "Returns x to the power of y.\n" msgstr "" #: mu/modes/api/adafruit.py:155 msgid "" "math.radians(x) \n" "Return degrees x converted to radians.\n" msgstr "" #: mu/modes/api/adafruit.py:156 msgid "" "math.sin(x) \n" "Return the sine of x.\n" msgstr "" #: mu/modes/api/adafruit.py:157 msgid "" "math.sqrt(x) \n" "Returns the square root of x.\n" msgstr "" #: mu/modes/api/adafruit.py:158 msgid "" "math.tan(x) \n" "Return the tangent of x.\n" msgstr "" #: mu/modes/api/adafruit.py:159 msgid "" "math.trunc(x) \n" "Return an integer, being x rounded towards 0.\n" msgstr "" #: mu/modes/api/adafruit.py:160 mu/modes/api/adafruit.py:161 msgid "" "microcontroller.Pin() \n" "Identifies an IO pin on the microcontroller. They are fixed by the\n" "hardware so they cannot be constructed on demand. Instead, use\n" "board or microcontroller.pin to reference the desired pin.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:162 msgid "microcontroller.Processor() \n" msgstr "" #: mu/modes/api/adafruit.py:163 msgid "" "microcontroller.Processor() \n" "You cannot create an instance of microcontroller.Processor.\n" "Use microcontroller.cpu to access the sole instance available.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:164 msgid "" "microcontroller.Processor.frequency() \n" "The CPU operating frequency as an int, in Hertz. (read-only)\n" msgstr "" #: mu/modes/api/adafruit.py:165 msgid "" "microcontroller.Processor.temperature() \n" "The on-chip temperature, in Celsius, as a float. (read-only)\n" "Is None if the temperature is not available.\n" msgstr "" #: mu/modes/api/adafruit.py:166 msgid "" "microcontroller.Processor.uid() \n" "The unique id (aka serial number) of the chip as a bytearray. (read-only)\n" msgstr "" #: mu/modes/api/adafruit.py:167 msgid "" "microcontroller.RunMode() \n" "Enum-like class to define the run mode of the microcontroller and\n" "CircuitPython.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:168 msgid "" "microcontroller.RunMode.BOOTLOADER() \n" "Run the bootloader.\n" msgstr "" #: mu/modes/api/adafruit.py:169 msgid "" "microcontroller.RunMode.NORMAL() \n" "Run CircuitPython as normal.\n" msgstr "" #: mu/modes/api/adafruit.py:170 msgid "" "microcontroller.RunMode.SAFE_MODE() \n" "Run CircuitPython in safe mode. User code will not be run and the\n" "file system will be writeable over USB.\n" msgstr "" #: mu/modes/api/adafruit.py:171 mu/modes/api/adafruit.py:172 msgid "" "multiterminal.clear_secondary_terminal() \n" "Clears the secondary terminal.\n" msgstr "" #: mu/modes/api/adafruit.py:173 mu/modes/api/adafruit.py:174 msgid "" "multiterminal.get_secondary_terminal() \n" "Returns the current secondary terminal.\n" msgstr "" #: mu/modes/api/adafruit.py:175 mu/modes/api/adafruit.py:176 msgid "" "multiterminal.schedule_secondary_terminal_read(socket) \n" "In cases where the underlying OS is doing task scheduling, this notifies\n" "the OS when more data is available on the socket to read. This is useful\n" "as a callback for lwip sockets.\n" msgstr "" #: mu/modes/api/adafruit.py:177 mu/modes/api/adafruit.py:178 msgid "" "multiterminal.set_secondary_terminal(stream) \n" "Read additional input from the given stream and write out back to it.\n" "This doesn’t replace the core stream (usually UART or native USB) but is\n" "mixed in instead.\n" "\n" "\n" "\n" "\n" "Parameters:stream (stream) -- secondary stream\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:179 mu/modes/api/adafruit.py:180 msgid "" "nvm.ByteArray() \n" "Not currently dynamically supported. Access the sole instance through " "microcontroller.nvm.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:181 mu/modes/api/adafruit.py:182 msgid "" "os.chdir(path) \n" "Change current directory.\n" msgstr "" #: mu/modes/api/adafruit.py:183 mu/modes/api/adafruit.py:184 msgid "" "os.getcwd() \n" "Get the current directory.\n" msgstr "" #: mu/modes/api/adafruit.py:185 mu/modes/api/adafruit.py:186 msgid "" "os.listdir(dir) \n" "With no argument, list the current directory. Otherwise list the given " "directory.\n" msgstr "" #: mu/modes/api/adafruit.py:187 mu/modes/api/adafruit.py:188 msgid "" "os.mkdir(path) \n" "Create a new directory.\n" msgstr "" #: mu/modes/api/adafruit.py:189 mu/modes/api/adafruit.py:190 msgid "" "os.remove(path) \n" "Remove a file.\n" msgstr "" #: mu/modes/api/adafruit.py:191 mu/modes/api/adafruit.py:192 msgid "" "os.rename(old_path, new_path) \n" "Rename a file.\n" msgstr "" #: mu/modes/api/adafruit.py:193 mu/modes/api/adafruit.py:194 msgid "" "os.rmdir(path) \n" "Remove a directory.\n" msgstr "" #: mu/modes/api/adafruit.py:195 mu/modes/api/adafruit.py:196 msgid "" "os.stat(path) \n" "Get the status of a file or directory.\n" msgstr "" #: mu/modes/api/adafruit.py:197 mu/modes/api/adafruit.py:198 msgid "" "os.statvfs(path) \n" "Get the status of a fileystem.\n" "Returns a tuple with the filesystem information in the following order:\n" "\n" "\n" "f_bsize -- file system block size\n" "f_frsize -- fragment size\n" "f_blocks -- size of fs in f_frsize units\n" "f_bfree -- number of free blocks\n" "f_bavail -- number of free blocks for unpriviliged users\n" "f_files -- number of inodes\n" "f_ffree -- number of free inodes\n" "f_favail -- number of free inodes for unpriviliged users\n" "f_flag -- mount flags\n" "f_namemax -- maximum filename length\n" "\n" "\n" "Parameters related to inodes: f_files, f_ffree, f_avail\n" "and the f_flags parameter may return 0 as they can be unavailable\n" "in a port-specific implementation.\n" msgstr "" #: mu/modes/api/adafruit.py:199 mu/modes/api/adafruit.py:200 msgid "" "os.sync() \n" "Sync all filesystems.\n" msgstr "" #: mu/modes/api/adafruit.py:201 mu/modes/api/adafruit.py:202 msgid "" "os.uname() \n" "Returns a named tuple of operating specific and CircuitPython port\n" "specific information.\n" msgstr "" #: mu/modes/api/adafruit.py:203 mu/modes/api/adafruit.py:204 msgid "" "os.urandom(size) \n" "Returns a string of size random bytes based on a hardware True Random\n" "Number Generator. When not available, it will raise a NotImplementedError.\n" msgstr "" #: mu/modes/api/adafruit.py:205 mu/modes/api/adafruit.py:206 msgid "" "pulseio.PWMOut(pin, *, duty_cycle=0, frequency=500, " "variable_frequency=False) \n" "Create a PWM object associated with the given pin. This allows you to\n" "write PWM signals out on the given pin. Frequency is fixed after init\n" "unless variable_frequency is True.\n" "\n" "\n" "Parameters:\n" "pin (Pin) -- The pin to output to\n" "duty_cycle (int) -- The fraction of each pulse which is high. 16-bit\n" "frequency (int) -- The target frequency in Hertz (32-bit)\n" "variable_frequency (bool) -- True if the frequency will change over time" msgstr "" #: mu/modes/api/adafruit.py:207 mu/modes/api/adafruit.py:208 msgid "" "pulseio.PWMOut.deinit() \n" "Deinitialises the PWMOut and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:209 mu/modes/api/adafruit.py:210 msgid "" "pulseio.PWMOut.duty_cycle() \n" "16 bit value that dictates how much of one cycle is high (1) versus low\n" "(0). 0xffff will always be high, 0 will always be low and 0x7fff will\n" "be half high and then half low.\n" msgstr "" #: mu/modes/api/adafruit.py:211 mu/modes/api/adafruit.py:212 msgid "" "pulseio.PWMOut.frequency() \n" "32 bit value that dictates the PWM frequency in Hertz (cycles per\n" "second). Only writeable when constructed with variable_frequency=True.\n" msgstr "" #: mu/modes/api/adafruit.py:213 mu/modes/api/adafruit.py:214 msgid "" "pulseio.PulseIn(pin, maxlen=2, *, idle_state=False) \n" "Create a PulseIn object associated with the given pin. The object acts as\n" "a read-only sequence of pulse lengths with a given max length. When it is\n" "active, new pulse lengths are added to the end of the list. When there is\n" "no more room (len() == maxlen) the oldest pulse length is removed to\n" "make room.\n" "\n" "\n" "Parameters:\n" "pin (Pin) -- Pin to read pulses from.\n" "maxlen (int) -- Maximum number of pulse durations to store at once\n" "idle_state (bool) -- Idle state of the pin. At start and after resume\n" "the first recorded pulse will the opposite state from idle." msgstr "" #: mu/modes/api/adafruit.py:215 mu/modes/api/adafruit.py:216 msgid "" "pulseio.PulseIn.deinit() \n" "Deinitialises the PulseIn and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:217 msgid "" "pulseio.PulseIn.maxlen() \n" "Returns the maximum length of the PulseIn. When len() is equal to maxlen,\n" "it is unclear which pulses are active and which are idle.\n" msgstr "" #: mu/modes/api/adafruit.py:218 msgid "" "pulseio.PulseIn.maxlen() \n" "The maximum length of the PulseIn. When len() is equal to maxlen,\n" "it is unclear which pulses are active and which are idle.\n" msgstr "" #: mu/modes/api/adafruit.py:219 msgid "" "pulseio.PulseIn.paused() \n" "True when pulse capture is paused as a result of pause() or an error during " "capture\n" "such as a signal that is too fast.\n" msgstr "" #: mu/modes/api/adafruit.py:220 mu/modes/api/adafruit.py:221 msgid "" "pulseio.PulseOut(carrier) \n" "Create a PulseOut object associated with the given PWM out experience.\n" "\n" "\n" "Parameters:carrier (PWMOut) -- PWMOut that is set to output on the desired " "pin." msgstr "" #: mu/modes/api/adafruit.py:222 mu/modes/api/adafruit.py:223 msgid "" "pulseio.PulseOut.deinit() \n" "Deinitialises the PulseOut and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:224 mu/modes/api/adafruit.py:225 msgid "" "random.choice(seq) \n" "Returns a randomly selected element from the given sequence. Raises\n" "IndexError when the sequence is empty.\n" msgstr "" #: mu/modes/api/adafruit.py:226 mu/modes/api/adafruit.py:227 msgid "" "random.getrandbits(k) \n" "Returns an integer with k random bits.\n" msgstr "" #: mu/modes/api/adafruit.py:228 mu/modes/api/adafruit.py:229 msgid "" "random.randint(a, b) \n" "Returns a randomly selected integer between a and b inclusive. Equivalent\n" "to randrange(a, b + 1, 1)\n" msgstr "" #: mu/modes/api/adafruit.py:230 mu/modes/api/adafruit.py:231 msgid "" "random.random() \n" "Returns a random float between 0 and 1.0.\n" msgstr "" #: mu/modes/api/adafruit.py:232 mu/modes/api/adafruit.py:233 msgid "" "random.randrange(stop) \n" "Returns a randomly selected integer from range(start, stop, step).\n" msgstr "" #: mu/modes/api/adafruit.py:234 mu/modes/api/adafruit.py:235 msgid "" "random.seed(seed) \n" "Sets the starting seed of the random number generation. Further calls to\n" "random will return deterministic results afterwards.\n" msgstr "" #: mu/modes/api/adafruit.py:236 mu/modes/api/adafruit.py:237 msgid "" "random.uniform(a, b) \n" "Returns a random float between a and b. It may or may not be inclusive\n" "depending on float rounding.\n" msgstr "" #: mu/modes/api/adafruit.py:238 msgid "" "rotaryio.IncrementalEncoder(pin_a, pin_b) \n" "Create an IncrementalEncoder object associated with the given pins. It " "tracks the positional\n" "state of an incremental rotary encoder (also known as a quadrature encoder.) " "Position is\n" "relative to the position when the object is contructed.\n" "\n" "\n" "Parameters:\n" "pin_a (Pin) -- First pin to read pulses from.\n" "pin_b (Pin) -- Second pin to read pulses from." msgstr "" #: mu/modes/api/adafruit.py:239 msgid "" "rotaryio.IncrementalEncoder.deinit() \n" "Deinitializes the IncrementalEncoder and releases any hardware resources for " "reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:240 msgid "" "rotaryio.IncrementalEncoder.position() \n" "The current position in terms of pulses. The number of pulses per rotation " "is defined by the\n" "specific hardware.\n" msgstr "" #: mu/modes/api/adafruit.py:241 msgid "" "rtc.RTC() \n" "This class represents the onboard Real Time Clock. It is a singleton and " "will always return the same instance.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:242 msgid "" "rtc.RTC.calibration() \n" "The RTC calibration value.\n" "A positive value speeds up the clock and a negative value slows it down.\n" "Range and value is hardware specific, but one step is often approx. 1 ppm.\n" msgstr "" #: mu/modes/api/adafruit.py:243 msgid "" "rtc.RTC.datetime() \n" "The date and time of the RTC.\n" msgstr "" #: mu/modes/api/adafruit.py:244 msgid "" "rtc.set_time_source(rtc) \n" "Sets the rtc time source used by time.localtime().\n" "The default is rtc.RTC().\n" "Example usage:\n" "import rtc\n" "import time\n" "\n" "class RTC(object):\n" " @property\n" " def datetime(self):\n" " return time.struct_time((2018, 3, 17, 21, 1, 47, 0, 0, 0))\n" "\n" "r = RTC()\n" "rtc.set_time_source(r)\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:245 mu/modes/api/adafruit.py:246 msgid "" "storage.VfsFat(block_device) \n" "Create a new VfsFat filesystem around the given block device.\n" "\n" "\n" "Parameters:block_device -- Block device the the filesystem lives on" msgstr "" #: mu/modes/api/adafruit.py:247 msgid "" "storage.VfsFat.ilistdir(path) \n" "Return an iterator whose values describe files and folders within\n" "path\n" msgstr "" #: mu/modes/api/adafruit.py:248 msgid "" "storage.VfsFat.label() \n" "The filesystem label, up to 11 case-insensitive bytes. Note that\n" "this property can only be set when the device is writable by the\n" "microcontroller.\n" msgstr "" #: mu/modes/api/adafruit.py:249 msgid "" "storage.VfsFat.mkdir(path) \n" "Like os.mkdir\n" msgstr "" #: mu/modes/api/adafruit.py:250 msgid "" "storage.VfsFat.mkfs() \n" "Format the block device, deleting any data that may have been there\n" msgstr "" #: mu/modes/api/adafruit.py:251 msgid "" "storage.VfsFat.mount(readonly, mkfs) \n" "Don’t call this directly, call storage.mount.\n" msgstr "" #: mu/modes/api/adafruit.py:252 msgid "" "storage.VfsFat.open(path, mode) \n" "Like builtin open()\n" msgstr "" #: mu/modes/api/adafruit.py:253 msgid "" "storage.VfsFat.rmdir(path) \n" "Like os.rmdir\n" msgstr "" #: mu/modes/api/adafruit.py:254 msgid "" "storage.VfsFat.stat(path) \n" "Like os.stat\n" msgstr "" #: mu/modes/api/adafruit.py:255 msgid "" "storage.VfsFat.statvfs(path) \n" "Like os.statvfs\n" msgstr "" #: mu/modes/api/adafruit.py:256 msgid "" "storage.VfsFat.umount() \n" "Don’t call this directly, call storage.umount.\n" msgstr "" #: mu/modes/api/adafruit.py:257 msgid "" "storage.erase_filesystem() \n" "Erase and re-create the CIRCUITPY filesystem.\n" "On boards that present USB-visible CIRCUITPY drive (e.g., SAMD21 and " "SAMD51),\n" "then call microcontroller.reset() to restart CircuitPython and have the\n" "host computer remount CIRCUITPY.\n" "This function can be called from the REPL when CIRCUITPY\n" "has become corrupted.\n" "\n" "Warning\n" "All the data on CIRCUITPY will be lost, and\n" "CircuitPython will restart on certain boards.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:258 msgid "" "storage.getmount(mount_path) \n" "Retrieves the mount object associated with the mount path\n" msgstr "" #: mu/modes/api/adafruit.py:259 mu/modes/api/adafruit.py:260 msgid "" "storage.mount(filesystem, mount_path, *, readonly=False) \n" "Mounts the given filesystem object at the given path.\n" "This is the CircuitPython analog to the UNIX mount command.\n" msgstr "" #: mu/modes/api/adafruit.py:261 msgid "" "storage.remount(mount_path, readonly) \n" "Remounts the given path with new parameters.\n" msgstr "" #: mu/modes/api/adafruit.py:262 msgid "" "storage.remount(mount_path, readonly=False) \n" "Remounts the given path with new parameters.\n" msgstr "" #: mu/modes/api/adafruit.py:263 mu/modes/api/adafruit.py:264 msgid "" "storage.umount(mount) \n" "Unmounts the given filesystem object or if mount is a path, then unmount\n" "the filesystem mounted at that location.\n" "This is the CircuitPython analog to the UNIX umount command.\n" msgstr "" #: mu/modes/api/adafruit.py:265 msgid "" "struct.calcsize(fmt) \n" "Return the number of bytes needed to store the given fmt.\n" msgstr "" #: mu/modes/api/adafruit.py:266 msgid "" "struct.pack(fmt, v1, v2, ...) \n" "Pack the values v1, v2, … according to the format string fmt.\n" "The return value is a bytes object encoding the values.\n" msgstr "" #: mu/modes/api/adafruit.py:267 msgid "" "struct.pack_into(fmt, buffer, offset, v1, v2, ...) \n" "Pack the values v1, v2, … according to the format string fmt into a buffer\n" "starting at offset. offset may be negative to count from the end of buffer.\n" msgstr "" #: mu/modes/api/adafruit.py:268 msgid "" "struct.unpack(fmt, data) \n" "Unpack from the data according to the format string fmt. The return value\n" "is a tuple of the unpacked values.\n" msgstr "" #: mu/modes/api/adafruit.py:269 msgid "" "struct.unpack_from(fmt, data, offset) \n" "Unpack from the data starting at offset according to the format string fmt.\n" "offset may be negative to count from the end of buffer. The return value is\n" "a tuple of the unpacked values.\n" msgstr "" #: mu/modes/api/adafruit.py:270 msgid "" "supervisor.Runtime() \n" "You cannot create an instance of supervisor.Runtime.\n" "Use supervisor.runtime to access the sole instance available.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:271 msgid "" "supervisor.Runtime.serial_connected() \n" "Returns the USB serial communication status (read-only).\n" msgstr "" #: mu/modes/api/adafruit.py:272 mu/modes/api/adafruit.py:273 msgid "" "time.struct_time((tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, " "tm_wday, tm_yday, tm_isdst)) \n" "Structure used to capture a date and time. Note that it takes a tuple!\n" "\n" "\n" "Parameters:\n" "tm_year (int) -- the year, 2017 for example\n" "tm_mon (int) -- the month, range [1, 12]\n" "tm_mday (int) -- the day of the month, range [1, 31]\n" "tm_hour (int) -- the hour, range [0, 23]\n" "tm_min (int) -- the minute, range [0, 59]\n" "tm_sec (int) -- the second, range [0, 61]\n" "tm_wday (int) -- the day of the week, range [0, 6], Monday is 0\n" "tm_yday (int) -- the day of the year, range [1, 366], -1 indicates not " "known\n" "tm_isdst (int) -- 1 when in daylight savings, 0 when not, -1 if unknown." msgstr "" #: mu/modes/api/adafruit.py:274 mu/modes/api/adafruit.py:275 msgid "" "touchio.TouchIn(pin) \n" "Use the TouchIn on the given pin.\n" "\n" "\n" "Parameters:pin (Pin) -- the pin to read from" msgstr "" #: mu/modes/api/adafruit.py:276 mu/modes/api/adafruit.py:277 msgid "" "touchio.TouchIn.deinit() \n" "Deinitialises the TouchIn and releases any hardware resources for reuse.\n" msgstr "" #: mu/modes/api/adafruit.py:278 msgid "" "touchio.TouchIn.raw_value() \n" "The raw touch measurement as an int. (read-only)\n" msgstr "" #: mu/modes/api/adafruit.py:279 msgid "" "touchio.TouchIn.threshold() \n" "Minimum raw_value needed to detect a touch (and for value to be True).\n" "When the TouchIn object is created, an initial raw_value is read from the " "pin,\n" "and then threshold is set to be 100 + that value.\n" "You can adjust threshold to make the pin more or less sensitive.\n" msgstr "" #: mu/modes/api/adafruit.py:280 msgid "" "touchio.TouchIn.value() \n" "Whether the touch pad is being touched or not.\n" "\n" "\n" "\n" "\n" "Returns:True when touched, False otherwise.\n" "\n" "Return type:bool\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:281 msgid "" "touchio.TouchIn.value() \n" "Whether the touch pad is being touched or not. (read-only)\n" "True when raw_value > threshold.\n" msgstr "" #: mu/modes/api/adafruit.py:282 mu/modes/api/adafruit.py:283 msgid "" "usb_hid.Device() \n" "Not currently dynamically supported.\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:284 mu/modes/api/adafruit.py:285 msgid "" "usb_hid.Device.send_report(buf) \n" "Send a HID report.\n" msgstr "" #: mu/modes/api/adafruit.py:286 msgid "" "usb_hid.Device.usage() \n" "The functionality of the device. For example Keyboard is 0x06 within the\n" "generic desktop usage page 0x01. Mouse is 0x02 within the same usage\n" "page.\n" "\n" "\n" "\n" "\n" "Returns:the usage within the usage page\n" "\n" "Return type:int\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:287 msgid "" "usb_hid.Device.usage() \n" "The functionality of the device as an int. (read-only)\n" "For example, Keyboard is 0x06 within the generic desktop usage page 0x01.\n" "Mouse is 0x02 within the same usage page.\n" msgstr "" #: mu/modes/api/adafruit.py:288 msgid "" "usb_hid.Device.usage_page() \n" "The usage page of the device. Can be thought of a category.\n" "\n" "\n" "\n" "\n" "Returns:the device’s usage page\n" "\n" "Return type:int\n" "\n" "\n" "\n" msgstr "" #: mu/modes/api/adafruit.py:289 msgid "" "usb_hid.Device.usage_page() \n" "The usage page of the device as an int. Can be thought of a category. (read-" "only)\n" msgstr "" #: mu/modes/api/microbit.py:24 msgid "" "random.getrandbits(n) \n" "Return an integer with n random bits." msgstr "" #: mu/modes/api/microbit.py:25 msgid "" "random.seed(n) \n" "Initialise the random number generator with a known integer 'n'." msgstr "" #: mu/modes/api/microbit.py:26 msgid "" "random.randint(a, b) \n" "Return a random whole number between a and b (inclusive)." msgstr "" #: mu/modes/api/microbit.py:27 msgid "" "random.randrange(stop) \n" "Return a random whole number between 0 and up to (but not including) stop." msgstr "" #: mu/modes/api/microbit.py:28 msgid "" "random.choice(seq) \n" "Return a randomly selected element from a sequence of objects (such as a " "list)." msgstr "" #: mu/modes/api/microbit.py:29 msgid "" "random.random() \n" "Return a random floating point number between 0.0 and 1.0." msgstr "" #: mu/modes/api/microbit.py:30 msgid "" "random.uniform(a, b) \n" "Return a random floating point number between a and b (inclusive)." msgstr "" #: mu/modes/api/microbit.py:32 msgid "" "os.listdir() \n" "Return a list of the names of all the files contained within the local\n" "on-device file system." msgstr "" #: mu/modes/api/microbit.py:33 msgid "" "os.remove(filename) \n" "Remove (delete) the file named filename." msgstr "" #: mu/modes/api/microbit.py:34 msgid "" "os.size(filename) \n" "Return the size, in bytes, of the file named filename." msgstr "" #: mu/modes/api/microbit.py:35 msgid "" "os.uname() \n" "Return information about MicroPython and the device." msgstr "" #: mu/modes/api/microbit.py:37 msgid "sys.version" msgstr "" #: mu/modes/api/microbit.py:38 msgid "sys.version_info" msgstr "" #: mu/modes/api/microbit.py:39 msgid "sys.implementation" msgstr "" #: mu/modes/api/microbit.py:40 msgid "sys.platform" msgstr "" #: mu/modes/api/microbit.py:41 msgid "sys.byteorder" msgstr "" #: mu/modes/api/microbit.py:42 msgid "" "sys.print_exception(ex) \n" "Print to the REPL information about the exception 'ex'." msgstr "" #: mu/modes/api/microbit.py:44 msgid "" "microbit.panic() \n" "Put micro:bit in panic() mode and display an unhappy face.\n" "Press the reset button to exit panic() mode." msgstr "" #: mu/modes/api/microbit.py:45 msgid "" "microbit.sleep(time) \n" "Put micro:bit to sleep for some milliseconds (1 second = 1000 ms) of time.\n" "sleep(2000) gives micro:bit a 2 second nap." msgstr "" #: mu/modes/api/microbit.py:46 msgid "" "microbit.running_time() \n" "Return running_time() in milliseconds since micro:bit's last reset." msgstr "" #: mu/modes/api/microbit.py:47 msgid "" "microbit.temperature() \n" "Return micro:bit's temperature in degrees Celcius." msgstr "" #: mu/modes/api/microbit.py:49 msgid "" "microbit.accelerometer.get_x() \n" "Return micro:bit's tilt (X acceleration) in milli-g's." msgstr "" #: mu/modes/api/microbit.py:50 msgid "" "microbit.accelerometer.get_y() \n" "Return micro:bit's tilt (Y acceleration) in milli-g's." msgstr "" #: mu/modes/api/microbit.py:51 msgid "" "microbit.accelerometer.get_z() \n" "Return micro:bit's up-down motion (Z acceleration) in milli-g's.\n" "Z is a positive number when moving up. Moving down, Z is a negative number." msgstr "" #: mu/modes/api/microbit.py:52 msgid "" "microbit.accelerometer.is_gesture(name) \n" "Return True or False to indicate if the named gesture is currently active.\n" "MicroPython understands the following gestures: 'up', 'down', 'left', " "'right',\n" "'face up', 'face down', 'freefall', '3g', '6g', '8g' and 'shake'." msgstr "" #: mu/modes/api/microbit.py:53 msgid "" "microbit.accelerometer.was_gesture(name) \n" "Return True or False to indicate if the named gesture was active since the\n" "last call.\n" "MicroPython understands the following gestures: 'up', 'down', 'left', " "'right',\n" "'face up', 'face down', 'freefall', '3g', '6g', '8g' and 'shake'." msgstr "" #: mu/modes/api/microbit.py:54 msgid "" "microbit.accelerometer.get_gestures() \n" "Return a list indicating the gesture history. The most recent gesture is " "last.\n" "Calling this method also clears the gesture history.\n" "MicroPython understands the following gestures: 'up', 'down', 'left', " "'right',\n" "'face up', 'face down', 'freefall', '3g', '6g', '8g' and 'shake'." msgstr "" #: mu/modes/api/microbit.py:55 msgid "" "microbit.accelerometer.get_values() \n" "Get the acceleration measurements in all axes at once, as a three-element " "tuple of integers ordered as X, Y, Z." msgstr "" #: mu/modes/api/microbit.py:57 msgid "" "microbit.button_a.is_pressed() \n" "If button A is pressed down, is_pressed() is True, else False." msgstr "" #: mu/modes/api/microbit.py:58 msgid "" "microbit.button_a.was_pressed() \n" "Use was_pressed() to learn if button A was pressed since the last time\n" "was_pressed() was called. Returns True or False." msgstr "" #: mu/modes/api/microbit.py:59 msgid "" "microbit.button_a.get_presses() \n" "Use get_presses() to get the running total of button presses, and also\n" "reset this counter to zero." msgstr "" #: mu/modes/api/microbit.py:60 msgid "" "microbit.button_b.is_pressed() \n" "If button B is pressed down, is_pressed() is True, else False." msgstr "" #: mu/modes/api/microbit.py:61 msgid "" "microbit.button_b.was_pressed() \n" "Use was_pressed() to learn if button B was pressed since the last time\n" "was_pressed() was called. Returns True or False." msgstr "" #: mu/modes/api/microbit.py:62 msgid "" "microbit.button_b.get_presses() \n" "Use get_presses() to get the running total of button presses, and also\n" "reset this counter to zero." msgstr "" #: mu/modes/api/microbit.py:64 msgid "" "microbit.compass.is_calibrated() \n" "If micro:bit's compass is_calibrated() and adjusted for accuracy, return " "True.\n" "If compass hasn't been adjusted for accuracy, return False." msgstr "" #: mu/modes/api/microbit.py:65 msgid "" "microbit.compass.calibrate() \n" "If micro:bit is confused, calibrate() the compass to adjust the its " "accuracy.\n" "Will ask you to rotate the device to draw a circle on the display. " "Afterwards, micro:bit will know which way is north." msgstr "" #: mu/modes/api/microbit.py:66 msgid "" "microbit.compass.clear_calibration() \n" "Reset micro:bit's compass using clear_calibration() command.\n" "Run calibrate() to improve accuracy." msgstr "" #: mu/modes/api/microbit.py:67 msgid "" "microbit.compass.get_x() \n" "Return magnetic field detected along micro:bit's X axis.\n" "Usually, the compass returns the earth's magnetic field in micro-Tesla " "units.\n" "Unless...a strong magnet is nearby!" msgstr "" #: mu/modes/api/microbit.py:68 msgid "" "microbit.compass.get_y() \n" "Return magnetic field detected along micro:bit's Y axis.\n" "Usually, the compass returns the earth's magnetic field in micro-Tesla " "units.\n" "Unless...a strong magnet is nearby!" msgstr "" #: mu/modes/api/microbit.py:69 msgid "" "microbit.compass.get_z() \n" "Return magnetic field detected along micro:bit's Z axis.\n" "Usually, the compass returns the earth's magnetic field in micro-Tesla " "units.\n" "Unless...a strong magnet is nearby!" msgstr "" #: mu/modes/api/microbit.py:70 msgid "" "microbit.compass.get_field_strength() \n" "Return strength of magnetic field around micro:bit." msgstr "" #: mu/modes/api/microbit.py:71 msgid "" "microbit.compass.heading() \n" "Return a number between 0-360 indicating the device's heading. 0 is north." msgstr "" #: mu/modes/api/microbit.py:73 msgid "" "microbit.display.show(x, delay=400, wait=True, loop=False, clear=False) \n" "Use show(x) to print the string or image 'x' to the display. If 'x' is a " "list\n" "of images they will be animated together.\n" "Use 'delay' to specify the speed of frame changes in milliseconds.\n" "If wait is False animation will happen in the background while the program " "continues.\n" "If loop is True the animation will repeat forever.\n" "If clear is True the display will clear at the end of the animation." msgstr "" #: mu/modes/api/microbit.py:74 msgid "" "microbit.display.scroll(string, delay=150, wait=True, loop=False, " "monospace=False) \n" "Use scroll(string) to scroll the string across the display.\n" "Use delay to control how fast the text scrolls.\n" "If wait is False the text will scroll in the background while the program " "continues.\n" "If loop is True the text will repeat forever.\n" "If monospace is True the characters will always take up 5 pixel-columns." msgstr "" #: mu/modes/api/microbit.py:75 msgid "" "microbit.display.clear() \n" "Use clear() to clear micro:bit's display." msgstr "" #: mu/modes/api/microbit.py:76 msgid "" "microbit.display.get_pixel(x, y) \n" "Use get_pixel(x, y) to return the display's brightness at LED pixel (x,y).\n" "Brightness can be from 0 (LED is off) to 9 (maximum LED brightness)." msgstr "" #: mu/modes/api/microbit.py:77 msgid "" "microbit.display.set_pixel(x, y, b) \n" "Use set_pixel(x, y, b) to set the display at LED pixel (x,y) to brightness " "'b'\n" "which can be set between 0 (off) to 9 (full brightness)." msgstr "" #: mu/modes/api/microbit.py:78 msgid "" "microbit.display.on() \n" "Use on() to turn on the display." msgstr "" #: mu/modes/api/microbit.py:79 msgid "" "microbit.display.off() \n" "Use off() to turn off the display." msgstr "" #: mu/modes/api/microbit.py:80 msgid "" "microbit.display.is_on() \n" "Use is_on() to query if the micro:bit's display is on (True) or off (False)." msgstr "" #: mu/modes/api/microbit.py:82 msgid "" "microbit.pin0.is_touched() \n" "If pin0 is_touched() on micro:bit, return True. If nothing is touching the\n" "pin, return False." msgstr "" #: mu/modes/api/microbit.py:83 msgid "" "microbit.pin0.read_digital() \n" "read_digital() value from pin0. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:84 msgid "" "microbit.pin0.write_digital(value) \n" "Set pin0 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:85 msgid "" "microbit.pin0.read_analog() \n" "Read the voltage applied to pin0. Return the reading as a number between\n" "0 (meaning 0v) and 1023 (meaning 3.3v)." msgstr "" #: mu/modes/api/microbit.py:86 msgid "" "microbit.pin0.write_analog(value) \n" "Set pin0 to output a value between 0 and 1023." msgstr "" #: mu/modes/api/microbit.py:87 msgid "" "microbit.pin0.set_analog_period(period) \n" "Set the period of the PWM signal output to period milliseconds." msgstr "" #: mu/modes/api/microbit.py:88 msgid "" "microbit.pin0.set_analog_period_microseconds(period) \n" "Set the period of the PWM signal output to period microseconds." msgstr "" #: mu/modes/api/microbit.py:90 msgid "" "microbit.pin1.is_touched() \n" "If pin1 is_touched() on micro:bit, return True. If nothing is touching the\n" "pin, return False." msgstr "" #: mu/modes/api/microbit.py:91 msgid "" "microbit.pin1.read_digital() \n" "read_digital() value from pin1. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:92 msgid "" "microbit.pin1.write_digital(value) \n" "Set pin1 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:93 msgid "" "microbit.pin1.read_analog() \n" "Read the voltage applied to pin1. Return the reading as a number between\n" "0 (meaning 0v) and 1023 (meaning 3.3v)." msgstr "" #: mu/modes/api/microbit.py:94 msgid "" "microbit.pin1.write_analog(value) \n" "Set pin1 to output a value between 0 and 1023." msgstr "" #: mu/modes/api/microbit.py:95 msgid "" "microbit.pin1.set_analog_period(period) \n" "Set the period of the PWM signal output to period milliseconds." msgstr "" #: mu/modes/api/microbit.py:96 msgid "" "microbit.pin1.set_analog_period_microseconds(period) \n" "Set the period of the PWM signal output to period microseconds." msgstr "" #: mu/modes/api/microbit.py:98 msgid "" "microbit.pin2.is_touched() \n" "If pin2 is_touched() on micro:bit, return True. If nothing is touching the\n" "pin, return False." msgstr "" #: mu/modes/api/microbit.py:99 msgid "" "microbit.pin2.read_digital() \n" "read_digital() value from pin2. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:100 msgid "" "microbit.pin2.write_digital(value) \n" "Set pin2 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:101 msgid "" "microbit.pin2.read_analog() \n" "Read the voltage applied to pin2. Return the reading as a number between\n" "0 (meaning 0v) and 1023 (meaning 3.3v)." msgstr "" #: mu/modes/api/microbit.py:102 msgid "" "microbit.pin2.write_analog(value) \n" "Set pin2 to output a value between 0 and 1023." msgstr "" #: mu/modes/api/microbit.py:103 msgid "" "microbit.pin2.set_analog_period(period) \n" "Set the period of the PWM signal output to period milliseconds." msgstr "" #: mu/modes/api/microbit.py:104 msgid "" "microbit.pin2.set_analog_period_microseconds(period) \n" "Set the period of the PWM signal output to period microseconds." msgstr "" #: mu/modes/api/microbit.py:106 msgid "" "microbit.pin3.read_digital() \n" "read_digital() value from pin3. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:107 msgid "" "microbit.pin2.write_digital(value) \n" "Set pin3 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:108 msgid "" "microbit.pin3.read_analog() \n" "Read the voltage applied to pin3. Return the reading as a number between\n" "0 (meaning 0v) and 1023 (meaning 3.3v)." msgstr "" #: mu/modes/api/microbit.py:109 msgid "" "microbit.pin3.write_analog(value) \n" "Set pin3 to output a value between 0 and 1023." msgstr "" #: mu/modes/api/microbit.py:110 msgid "" "microbit.pin3.set_analog_period(period) \n" "Set the period of the PWM signal output to period milliseconds." msgstr "" #: mu/modes/api/microbit.py:111 msgid "" "microbit.pin3.set_analog_period_microseconds(period) \n" "Set the period of the PWM signal output to period microseconds." msgstr "" #: mu/modes/api/microbit.py:113 msgid "" "microbit.pin4.read_digital() \n" "read_digital() value from pin4. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:114 msgid "" "microbit.pin4.write_digital(value) \n" "Set pin4 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:115 msgid "" "microbit.pin4.read_analog() \n" "Read the voltage applied to pin4. Return the reading as a number between\n" "0 (meaning 0v) and 1023 (meaning 3.3v)." msgstr "" #: mu/modes/api/microbit.py:116 msgid "" "microbit.pin4.write_analog(value) \n" "Set pin4 to output a value between 0 and 1023." msgstr "" #: mu/modes/api/microbit.py:117 msgid "" "microbit.pin4.set_analog_period(period) \n" "Set the period of the PWM signal output to period milliseconds." msgstr "" #: mu/modes/api/microbit.py:118 msgid "" "microbit.pin4.set_analog_period_microseconds(period) \n" "Set the period of the PWM signal output to period microseconds." msgstr "" #: mu/modes/api/microbit.py:120 msgid "" "microbit.pin5.read_digital() \n" "read_digital() value from pin5. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:121 msgid "" "microbit.pin5.write_digital(value) \n" "Set pin5 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:123 msgid "" "microbit.pin6.read_digital() \n" "read_digital() value from pin6. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:124 msgid "" "microbit.pin6.write_digital(value) \n" "Set pin6 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:126 msgid "" "microbit.pin7.read_digital() \n" "read_digital() value from pin7. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:127 msgid "" "microbit.pin7.write_digital(value) \n" "Set pin7 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:129 msgid "" "microbit.pin8.read_digital() \n" "read_digital() value from pin8. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:130 msgid "" "microbit.pin8.write_digital(value) \n" "Set pin8 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:132 msgid "" "microbit.pin9.read_digital() \n" "read_digital() value from pin9. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:133 msgid "" "microbit.pin9.write_digital(value) \n" "Set pin9 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:135 msgid "" "microbit.pin10.read_digital() \n" "read_digital() value from pin10. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:136 msgid "" "microbit.pin10.write_digital(value) \n" "Set pin10 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:137 msgid "" "microbit.pin10.read_analog() \n" "Read the voltage applied to pin10. Return the reading as a number between\n" "0 (meaning 0v) and 1023 (meaning 3.3v)." msgstr "" #: mu/modes/api/microbit.py:138 msgid "" "microbit.pin10.write_analog(value) \n" "Set pin10 to output a value between 0 and 1023." msgstr "" #: mu/modes/api/microbit.py:139 msgid "" "microbit.pin10.set_analog_period(period) \n" "Set the period of the PWM signal output to period milliseconds." msgstr "" #: mu/modes/api/microbit.py:140 msgid "" "microbit.pin10.set_analog_period_microseconds(period) \n" "Set the period of the PWM signal output to period microseconds." msgstr "" #: mu/modes/api/microbit.py:142 msgid "" "microbit.pin11.read_digital() \n" "read_digital() value from pin11. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:143 msgid "" "microbit.pin11.write_digital(value) \n" "Set pin11 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:145 msgid "" "microbit.pin12.read_digital() \n" "read_digital() value from pin12. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:146 msgid "" "microbit.pin12.write_digital(value) \n" "Set pin12 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:148 msgid "" "microbit.pin13.read_digital() \n" "read_digital() value from pin13. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:149 msgid "" "microbit.pin13.write_digital(value) \n" "Set pin13 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:151 msgid "" "microbit.pin14.read_digital() \n" "read_digital() value from pin14. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:152 msgid "" "microbit.pin14.write_digital(value) \n" "Set pin14 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:154 msgid "" "microbit.pin15.read_digital() \n" "read_digital() value from pin15. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:155 msgid "" "microbit.pin15.write_digital(value) \n" "Set pin15 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:157 msgid "" "microbit.pin16.read_digital() \n" "read_digital() value from pin16. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:158 msgid "" "microbit.pin16.write_digital(value) \n" "Set pin16 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:160 msgid "" "microbit.pin19.read_digital() \n" "read_digital() value from pin19. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:161 msgid "" "microbit.pin19.write_digital(value) \n" "Set pin19 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:163 msgid "" "microbit.pin20.read_digital() \n" "read_digital() value from pin20. The reading will be either 0 (lo) or 1 (hi)." msgstr "" #: mu/modes/api/microbit.py:164 msgid "" "microbit.pin20.write_digital(value) \n" "Set pin20 to output high if value is 1, or to low, it it is 0." msgstr "" #: mu/modes/api/microbit.py:166 msgid "" "microbit.i2c.read(address, n, repeat=False) \n" "Use read(address, n) to read 'n' bytes from the device with the 7-bit " "address.\n" "If repeat is True, no stop bit will be sent." msgstr "" #: mu/modes/api/microbit.py:167 msgid "" "microbit.i2c.write(adress, buffer, repeat=False) \n" "Use write(address, buffer) to write to the 'buffer' of the device at the 7-" "bit 'address'.\n" "If repeat is True, no stop bit will be sent." msgstr "" #: mu/modes/api/microbit.py:168 msgid "" "microbit.i2c.init(frequency, scl, sda) \n" "Use init(frequency, scl, sda) to set the bus frequency and pins." msgstr "" #: mu/modes/api/microbit.py:170 msgid "" "microbit.Image(string) \n" "Create and use built-in IMAGES to show on the display. Use:\n" "Image(\n" " '09090:'\n" " '99999:'\n" " '99999:'\n" " '09990:'\n" " '00900:')\n" "...to make a new 5x5 heart image. Numbers go from 0 (off) to 9 (brightest). " "Note\n" "the colon ':' to set the end of a row." msgstr "" #: mu/modes/api/microbit.py:171 msgid "" "microbit.Image.width() \n" "Return the width of the image in pixels." msgstr "" #: mu/modes/api/microbit.py:172 msgid "" "microbit.Image.height() \n" "Return the height of the image in pixels." msgstr "" #: mu/modes/api/microbit.py:173 msgid "" "microbit.Image.get_pixel(x, y) \n" "Use get_pixel(x, y) to return the image's brightness at LED pixel (x,y).\n" "Brightness can be from 0 (LED is off) to 9 (maximum LED brightness)." msgstr "" #: mu/modes/api/microbit.py:174 msgid "" "microbit.Image.set_pixel(x, y, b) \n" "Use set_pixel(x, y, b) to set the LED pixel (x,y) in the image to " "brightness\n" "'b' which can be set between 0 (off) to 9 (full brightness)." msgstr "" #: mu/modes/api/microbit.py:175 msgid "" "microbit.Image.shift_left(n) \n" "Use shift_left(n) to make a copy of the image but moved 'n' pixels to the " "left." msgstr "" #: mu/modes/api/microbit.py:176 msgid "" "microbit.Image.shift_right(n) \n" "Use shift_right(n) to make a copy of the image but moved 'n' pixels to\n" "the right." msgstr "" #: mu/modes/api/microbit.py:177 msgid "" "microbit.Image.shift_up(n) \n" "Use shift_up(n) to make a copy of the image but moved 'n' pixels up." msgstr "" #: mu/modes/api/microbit.py:178 msgid "" "microbit.Image.shift_down(n) \n" "Use shift_down(n) to make a copy of the image but moved 'n' pixels down." msgstr "" #: mu/modes/api/microbit.py:179 msgid "" "microbit.Image.copy() \n" "Use copy() to make a new exact copy of the image." msgstr "" #: mu/modes/api/microbit.py:180 msgid "" "microbit.Image.crop(x1, y1, x2, y2) \n" "Use crop(x1, y1, x2, y2) to make a cut-out copy of the image where " "coordinate\n" "(x1,y1) is the top left corner of the cut-out area and coordinate (x2,y2) is " "the\n" "bottom right corner." msgstr "" #: mu/modes/api/microbit.py:181 msgid "" "microbit.Image.invert() \n" "Use invert() to make a negative copy of the image. Where a pixel was bright " "or\n" "on in the original, it is dim or off in the negative copy." msgstr "" #: mu/modes/api/microbit.py:182 msgid "microbit.Image.HEART" msgstr "" #: mu/modes/api/microbit.py:183 msgid "microbit.Image.HEART_SMALL" msgstr "" #: mu/modes/api/microbit.py:184 msgid "microbit.Image.HAPPY" msgstr "" #: mu/modes/api/microbit.py:185 msgid "microbit.Image.SMILE" msgstr "" #: mu/modes/api/microbit.py:186 msgid "microbit.Image.SAD" msgstr "" #: mu/modes/api/microbit.py:187 msgid "microbit.Image.CONFUSED" msgstr "" #: mu/modes/api/microbit.py:188 msgid "microbit.Image.ANGRY" msgstr "" #: mu/modes/api/microbit.py:189 msgid "microbit.Image.ASLEEP" msgstr "" #: mu/modes/api/microbit.py:190 msgid "microbit.Image.SURPRISED" msgstr "" #: mu/modes/api/microbit.py:191 msgid "microbit.Image.SILLY" msgstr "" #: mu/modes/api/microbit.py:192 msgid "microbit.Image.FABULOUS" msgstr "" #: mu/modes/api/microbit.py:193 msgid "microbit.Image.MEH" msgstr "" #: mu/modes/api/microbit.py:194 msgid "microbit.Image.YES" msgstr "" #: mu/modes/api/microbit.py:195 msgid "microbit.Image.NO" msgstr "" #: mu/modes/api/microbit.py:196 msgid "microbit.Image.CLOCK12" msgstr "" #: mu/modes/api/microbit.py:197 msgid "microbit.Image.CLOCK11" msgstr "" #: mu/modes/api/microbit.py:198 msgid "microbit.Image.CLOCK10" msgstr "" #: mu/modes/api/microbit.py:199 msgid "microbit.Image.CLOCK9" msgstr "" #: mu/modes/api/microbit.py:200 msgid "microbit.Image.CLOCK8" msgstr "" #: mu/modes/api/microbit.py:201 msgid "microbit.Image.CLOCK7" msgstr "" #: mu/modes/api/microbit.py:202 msgid "microbit.Image.CLOCK6" msgstr "" #: mu/modes/api/microbit.py:203 msgid "microbit.Image.CLOCK5" msgstr "" #: mu/modes/api/microbit.py:204 msgid "microbit.Image.CLOCK4" msgstr "" #: mu/modes/api/microbit.py:205 msgid "microbit.Image.CLOCK3" msgstr "" #: mu/modes/api/microbit.py:206 msgid "microbit.Image.CLOCK2" msgstr "" #: mu/modes/api/microbit.py:207 msgid "microbit.Image.CLOCK1" msgstr "" #: mu/modes/api/microbit.py:208 msgid "microbit.Image.ARROW_N" msgstr "" #: mu/modes/api/microbit.py:209 msgid "microbit.Image.ARROW_NE" msgstr "" #: mu/modes/api/microbit.py:210 msgid "microbit.Image.ARROW_E" msgstr "" #: mu/modes/api/microbit.py:211 msgid "microbit.Image.ARROW_SE" msgstr "" #: mu/modes/api/microbit.py:212 msgid "microbit.Image.ARROW_S" msgstr "" #: mu/modes/api/microbit.py:213 msgid "microbit.Image.ARROW_SW" msgstr "" #: mu/modes/api/microbit.py:214 msgid "microbit.Image.ARROW_W" msgstr "" #: mu/modes/api/microbit.py:215 msgid "microbit.Image.ARROW_NW" msgstr "" #: mu/modes/api/microbit.py:216 msgid "microbit.Image.TRIANGLE" msgstr "" #: mu/modes/api/microbit.py:217 msgid "microbit.Image.TRIANGLE_LEFT" msgstr "" #: mu/modes/api/microbit.py:218 msgid "microbit.Image.CHESSBOARD" msgstr "" #: mu/modes/api/microbit.py:219 msgid "microbit.Image.DIAMOND" msgstr "" #: mu/modes/api/microbit.py:220 msgid "microbit.Image.DIAMOND_SMALL" msgstr "" #: mu/modes/api/microbit.py:221 msgid "microbit.Image.SQUARE" msgstr "" #: mu/modes/api/microbit.py:222 msgid "microbit.Image.SQUARE_SMALL" msgstr "" #: mu/modes/api/microbit.py:223 msgid "microbit.Image.RABBIT" msgstr "" #: mu/modes/api/microbit.py:224 msgid "microbit.Image.COW" msgstr "" #: mu/modes/api/microbit.py:225 msgid "microbit.Image.MUSIC_CROTCHET" msgstr "" #: mu/modes/api/microbit.py:226 msgid "microbit.Image.MUSIC_QUAVER" msgstr "" #: mu/modes/api/microbit.py:227 msgid "microbit.Image.MUSIC_QUAVERS" msgstr "" #: mu/modes/api/microbit.py:228 msgid "microbit.Image.PITCHFORK" msgstr "" #: mu/modes/api/microbit.py:229 msgid "microbit.Image.XMAS" msgstr "" #: mu/modes/api/microbit.py:230 msgid "microbit.Image.PACMAN" msgstr "" #: mu/modes/api/microbit.py:231 msgid "microbit.Image.TARGET" msgstr "" #: mu/modes/api/microbit.py:232 msgid "microbit.Image.TSHIRT" msgstr "" #: mu/modes/api/microbit.py:233 msgid "microbit.Image.ROLLERSKATE" msgstr "" #: mu/modes/api/microbit.py:234 msgid "microbit.Image.DUCK" msgstr "" #: mu/modes/api/microbit.py:235 msgid "microbit.Image.HOUSE" msgstr "" #: mu/modes/api/microbit.py:236 msgid "microbit.Image.TORTOISE" msgstr "" #: mu/modes/api/microbit.py:237 msgid "microbit.Image.BUTTERFLY" msgstr "" #: mu/modes/api/microbit.py:238 msgid "microbit.Image.STICKFIGURE" msgstr "" #: mu/modes/api/microbit.py:239 msgid "microbit.Image.GHOST" msgstr "" #: mu/modes/api/microbit.py:240 msgid "microbit.Image.SWORD" msgstr "" #: mu/modes/api/microbit.py:241 msgid "microbit.Image.GIRAFFE" msgstr "" #: mu/modes/api/microbit.py:242 msgid "microbit.Image.SKULL" msgstr "" #: mu/modes/api/microbit.py:243 msgid "microbit.Image.UMBRELLA" msgstr "" #: mu/modes/api/microbit.py:244 msgid "microbit.Image.SNAKE" msgstr "" #: mu/modes/api/microbit.py:245 msgid "microbit.Image.ALL_CLOCKS" msgstr "" #: mu/modes/api/microbit.py:246 msgid "microbit.Image.ALL_ARROWS" msgstr "" #: mu/modes/api/microbit.py:248 msgid "" "microbit.uart.init(baudrate=9600, bits=8, parity=None, stop=1, tx=None, " "rx=None) \n" "Use init() to set up communication using the default values. \n" "Otherwise override the defaults as named arguments." msgstr "" #: mu/modes/api/microbit.py:249 msgid "" "microbit.uart.any() \n" "If there are incoming characters waiting to be read, any() will return " "True.\n" "Otherwise, returns False." msgstr "" #: mu/modes/api/microbit.py:250 msgid "" "microbit.uart.read(n) \n" "Use read() to read characters.\n" "Use read(n) to read, at most, 'n' bytes of data." msgstr "" #: mu/modes/api/microbit.py:251 msgid "" "microbit.uart.readall() \n" "Use readall() to read as much data as possible." msgstr "" #: mu/modes/api/microbit.py:252 msgid "" "microbit.uart.readline() \n" "Use readline() to read a line that ends with a newline character." msgstr "" #: mu/modes/api/microbit.py:253 msgid "" "microbit.uart.readinto(buf, n) \n" "Use readinto(buf) to read bytes into the buffer 'buf'.\n" "Use readinto(buff, n) to read, at most, 'n' number of bytes into 'buf'." msgstr "" #: mu/modes/api/microbit.py:254 msgid "" "microbit.uart.write() \n" "Use write(buf) to write the bytes in buffer 'buf' to the connected device." msgstr "" #: mu/modes/api/microbit.py:256 msgid "" "microbit.spi.init(baudrate=1000000, bits=8, mode=0, sclk=pin13, mosi=pin15, " "miso=pin14) \n" "Set up communication. Override the defaults for baudrate, mode,\n" "SCLK, MOSI and MISO. The default connections are pin13 for SCLK, pin15 for\n" "MOSI and pin14 for MISO." msgstr "" #: mu/modes/api/microbit.py:257 msgid "" "microbit.spi.write(buf) \n" "Use write(buf) to write bytes in buffer 'buf' to the connected device." msgstr "" #: mu/modes/api/microbit.py:258 msgid "" "microbit.spi.read(n) \n" "Use read(n) to read 'n' bytes of data." msgstr "" #: mu/modes/api/microbit.py:259 msgid "" "microbit.spi.write_readinto(out, in) \n" "Use write_readinto(out, in) to write the 'out' buffer to the connected " "device\n" "and read any response into the 'in' buffer. The length of the buffers " "should\n" "be the same. The buffers can be the same object." msgstr "" #: mu/modes/api/microbit.py:261 msgid "" "music.set_tempo(number, bpm) \n" "Make a beat last a 'number' of ticks long and\n" "played at 'bpm' beats per minute." msgstr "" #: mu/modes/api/microbit.py:262 msgid "" "music.pitch(freq, length=-1, pin=microbit.pin0, wait=True) \n" "Make micro:bit play a note at 'freq' frequency for\n" "'length' milliseconds. E.g. pitch(440, 1000) will play concert 'A' for 1 " "second.\n" "If length is a negative number the pitch is played continuously.\n" "Use the optional pin argument to override the default output for the " "speaker.\n" "If wait is False the music will play in the background while the program\n" "continues." msgstr "" #: mu/modes/api/microbit.py:263 msgid "" "music.play(music, pin=microbit.pin0, wait=True, loop=False) \n" "Make micro:bit play 'music' list of notes. Try out the built in music to " "see\n" "how it works. E.g. music.play(music.PUNCHLINE).\n" "Use the optional pin argument to override the default output for the " "speaker.\n" "If wait is False the music will play in the background while the program\n" "continues.\n" "If loop is True, the tune will repeat." msgstr "" #: mu/modes/api/microbit.py:264 msgid "" "music.get_tempo() \n" "Return the number of ticks in a beat and number of beats per minute." msgstr "" #: mu/modes/api/microbit.py:265 msgid "" "music.stop(pin=microbit.pin0) \n" "Stops all music playback on the given pin. If no pin is given, pin0 is " "assumed." msgstr "" #: mu/modes/api/microbit.py:266 msgid "" "music.reset()\n" "If things go wrong, reset() the music to its default settings." msgstr "" #: mu/modes/api/microbit.py:267 msgid "music.DADADADUM" msgstr "" #: mu/modes/api/microbit.py:268 msgid "music.ENTERTAINER" msgstr "" #: mu/modes/api/microbit.py:269 msgid "music.PRELUDE" msgstr "" #: mu/modes/api/microbit.py:270 msgid "music.ODE" msgstr "" #: mu/modes/api/microbit.py:271 msgid "music.NYAN" msgstr "" #: mu/modes/api/microbit.py:272 msgid "music.RINGTONE" msgstr "" #: mu/modes/api/microbit.py:273 msgid "music.FUNK" msgstr "" #: mu/modes/api/microbit.py:274 msgid "music.BLUES" msgstr "" #: mu/modes/api/microbit.py:275 msgid "music.BIRTHDAY" msgstr "" #: mu/modes/api/microbit.py:276 msgid "music.WEDDING" msgstr "" #: mu/modes/api/microbit.py:277 msgid "music.FUNERAL" msgstr "" #: mu/modes/api/microbit.py:278 msgid "music.PUNCHLINE" msgstr "" #: mu/modes/api/microbit.py:279 msgid "music.PYTHON" msgstr "" #: mu/modes/api/microbit.py:280 msgid "music.BADDY" msgstr "" #: mu/modes/api/microbit.py:281 msgid "music.CHASE" msgstr "" #: mu/modes/api/microbit.py:282 msgid "music.BA_DING" msgstr "" #: mu/modes/api/microbit.py:283 msgid "music.WAWAWAWAA" msgstr "" #: mu/modes/api/microbit.py:284 msgid "music.JUMP_UP" msgstr "" #: mu/modes/api/microbit.py:285 msgid "music.JUMP_DOWN" msgstr "" #: mu/modes/api/microbit.py:286 msgid "music.POWER_UP" msgstr "" #: mu/modes/api/microbit.py:287 msgid "music.POWER_DOWN" msgstr "" #: mu/modes/api/microbit.py:289 msgid "antigravity" msgstr "" #: mu/modes/api/microbit.py:291 msgid "" "this.authors() \n" "Use authors() to reveal the names of the people who created this software." msgstr "" #: mu/modes/api/microbit.py:293 msgid "" "love.badaboom()\n" "Hear my soul speak:\n" "The very instant that I saw you, did\n" "My heart fly to your service." msgstr "" #: mu/modes/api/microbit.py:295 msgid "" "neopixel.NeoPixel(pin, n) \n" "Create a list representing a strip of 'n' neopixels controlled from the\n" "specified pin (e.g. microbit.pin0).\n" "Use the resulting object to change each pixel by position (starting from " "0).\n" "Individual pixels are given RGB (red, green, blue) values between 0-255 as " "a\n" "tupe. For example, (255, 255, 255) is white:\n" "\n" "np = neopixel.NeoPixel(microbit.pin0, 8)\n" "np[0] = (255, 0, 128)\n" "np.show()" msgstr "" #: mu/modes/api/microbit.py:296 msgid "" "neopixel.NeoPixel.clear() \n" "Clear all the pixels." msgstr "" #: mu/modes/api/microbit.py:297 msgid "" "neopixel.NeoPixel.show() \n" "Show the pixels. Must be called for any updates to become visible." msgstr "" #: mu/modes/api/microbit.py:299 msgid "" "radio.on() \n" "Turns on the radio. This needs to be called since the radio draws power and\n" "takes up memory that you may otherwise need." msgstr "" #: mu/modes/api/microbit.py:300 msgid "" "radio.off() \n" "Turns off the radio, thus saving power and memory." msgstr "" #: mu/modes/api/microbit.py:301 msgid "" "radio.config(length=32, queue=3, channel=7, power=0, address=0x75626974, " "group=0, data_rate=radio.RATE_1MBIT) \n" "Configures the various settings relating to the radio. The specified " "default\n" "values are sensible.\n" "'length' is the maximum length, in bytes, of a message. It can be up to 251\n" "bytes long.\n" "'queue' is the number of messages to store on the message queue.\n" "'channel' (0-100) defines the channel to which the radio is tuned.\n" "'address' is an arbitrary 32-bit address that's used to filter packets.\n" "'group' is an 8-bit value used with 'address' when filtering packets.\n" "'data_rate' is the throughput speed. It can be one of: radio.RATE_250KbIT,\n" "radio.RATE_1MbIT (the default) or radio.2MBIT." msgstr "" #: mu/modes/api/microbit.py:302 msgid "" "radio.reset() \n" "Reset the settings to their default value." msgstr "" #: mu/modes/api/microbit.py:303 msgid "" "radio.send_bytes(message) \n" "Sends a message containing bytes." msgstr "" #: mu/modes/api/microbit.py:304 msgid "" "radio.receive_bytes() \n" "Receive the next incoming message from the message queue. Returns 'None' if\n" "there are no pending messages. Messages are returned as bytes." msgstr "" #: mu/modes/api/microbit.py:305 msgid "" "radio.send(message) \n" "Send a message string." msgstr "" #: mu/modes/api/microbit.py:306 msgid "" "radio.receive() \n" "Receive the next incoming message from the message queue as a string. " "Returns\n" "'None' if there are no pending messages." msgstr "" #: mu/modes/api/microbit.py:307 msgid "radio.RATE_250KBIT" msgstr "" #: mu/modes/api/microbit.py:308 msgid "radio.RATE_1MBIT" msgstr "" #: mu/modes/api/microbit.py:309 msgid "radio.RATE_2MBIT" msgstr "" #: mu/modes/api/microbit.py:311 msgid "" "audio.play(source, wait=True, pins=(pin0, pin1)) \n" "Play the source to completion where 'source' is an iterable, each element " "of\n" "which must be an AudioFrame instance." msgstr "" #: mu/modes/api/microbit.py:312 msgid "" "audio.AudioFrame()() \n" "Represents a list of 32 samples each of which is a signed byte. It takes " "just\n" "over 4ms to play a single frame." msgstr "" #: mu/modes/api/microbit.py:314 msgid "" "speech.translate(words) \n" "Return a string containing the phonemes for the English words in the string\n" "'words'." msgstr "" #: mu/modes/api/microbit.py:315 msgid "" "speech.say(words, pitch=64, speed=72, mouth=128, throat=128) \n" "Say the English words in the string 'words'. Override the optional pitch,\n" "speed, mouth and throat settings to change the tone of voice." msgstr "" #: mu/modes/api/microbit.py:316 msgid "" "speech.pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128) \n" "Pronounce the phonemes in the string 'phonemes'. Override the optional " "pitch,\n" "speed, mouth and throat settings to change the tone of voice." msgstr "" #: mu/modes/api/microbit.py:317 msgid "" "speech.sing(song, pitch=64, speed=72, mouth=128, throat=128) \n" "Sing the phonemes in the string 'song'. Add pitch information to a phoneme\n" "with a hash followed by a number between 1-255 like this: '#112DOWWWWWWWW'.\n" "Override the optional pitch, speed, mouth and throat settings to change the\n" "tone of voice." msgstr "" #: mu/modes/api/microbit.py:319 msgid "" "math.sqrt(x) \n" "Return the square root of 'x'." msgstr "" #: mu/modes/api/microbit.py:320 msgid "" "math.pow(x, y) \n" "Return 'x' raised to the power 'y'." msgstr "" #: mu/modes/api/microbit.py:321 msgid "" "math.exp(x) \n" "Return math.e**'x'." msgstr "" #: mu/modes/api/microbit.py:322 msgid "" "math.log(x, base=math.e) \n" "With one argument, return the natural logarithm of 'x' (to base e).\n" "With two arguments, return the logarithm of 'x' to the given 'base'." msgstr "" #: mu/modes/api/microbit.py:323 msgid "" "math.cos(x) \n" "Return the cosine of 'x' radians." msgstr "" #: mu/modes/api/microbit.py:324 msgid "" "math.sin(x) \n" "Return the sine of 'x' radians." msgstr "" #: mu/modes/api/microbit.py:325 msgid "" "math.tan(x) \n" "Return the tangent of 'x' radians." msgstr "" #: mu/modes/api/microbit.py:326 msgid "" "math.acos(x) \n" "Return the arc cosine of 'x', in radians." msgstr "" #: mu/modes/api/microbit.py:327 msgid "" "math.asin(x) \n" "Return the arc sine of 'x', in radians." msgstr "" #: mu/modes/api/microbit.py:328 msgid "" "math.atan(x) \n" "Return the arc tangent of 'x', in radians." msgstr "" #: mu/modes/api/microbit.py:329 msgid "" "math.atan2(x, y) \n" "Return atan(y / x), in radians." msgstr "" #: mu/modes/api/microbit.py:330 msgid "" "math.ceil(x) \n" "Return the ceiling of 'x', the smallest integer greater than or equal to 'x'." msgstr "" #: mu/modes/api/microbit.py:331 msgid "" "math.copysign(x, y) \n" "Return a float with the magnitude (absolute value) of 'x' but the sign of " "'y'. " msgstr "" #: mu/modes/api/microbit.py:332 msgid "" "math.fabs(x) \n" "Return the absolute value of 'x'." msgstr "" #: mu/modes/api/microbit.py:333 msgid "" "math.floor(x) \n" "Return the floor of 'x', the largest integer less than or equal to 'x'." msgstr "" #: mu/modes/api/microbit.py:334 msgid "" "math.fmod(x, y) \n" "Return 'x' modulo 'y'." msgstr "" #: mu/modes/api/microbit.py:335 msgid "" "math.frexp(x) \n" "Return the mantissa and exponent of 'x' as the pair (m, e). " msgstr "" #: mu/modes/api/microbit.py:336 msgid "" "math.ldexp(x, i) \n" "Return 'x' * (2**'i')." msgstr "" #: mu/modes/api/microbit.py:337 msgid "" "math.modf(x) \n" "Return the fractional and integer parts of x.\n" "Both results carry the sign of x and are floats." msgstr "" #: mu/modes/api/microbit.py:338 msgid "" "math.isfinite(x) \n" "Return True if 'x' is neither an infinity nor a NaN, and False otherwise." msgstr "" #: mu/modes/api/microbit.py:339 msgid "" "math.isinf(x) \n" "Return True if 'x' is a positive or negative infinity, and False otherwise." msgstr "" #: mu/modes/api/microbit.py:340 msgid "" "math.isnan(x) \n" "Return True if 'x' is a NaN (not a number), and False otherwise." msgstr "" #: mu/modes/api/microbit.py:341 msgid "" "math.trunc(x) \n" "Return the Real value 'x' truncated to an Integral (usually an integer)." msgstr "" #: mu/modes/api/microbit.py:342 msgid "" "math.radians(x) \n" "Convert angle 'x' from degrees to radians." msgstr "" #: mu/modes/api/microbit.py:343 msgid "" "math.degrees(x) \n" "Convert angle 'x' from radians to degrees." msgstr "" #: mu/modes/api/pi.py:23 msgid "" "gpiozero.AnalogInputDevice(*args, **kwargs) \n" "Represents an analog input device connected to SPI (serial interface).\n" "\n" "Typical analog input devices are `analog to digital converters`_ (ADCs).\n" "Several classes are provided for specific ADC chips, including\n" ":class:`MCP3004`, :class:`MCP3008`, :class:`MCP3204`, and :class:`MCP3208`.\n" "\n" "The following code demonstrates reading the first channel of an MCP3008\n" "chip attached to the Pi's SPI pins::\n" "\n" " from gpiozero import MCP3008\n" "\n" " pot = MCP3008(0)\n" " print(pot.value)\n" "\n" "The :attr:`value` attribute is normalized such that its value is always\n" "between 0.0 and 1.0 (or in special cases, such as differential sampling,\n" "-1 to +1). Hence, you can use an analog input to control the brightness of\n" "a :class:`PWMLED` like so::\n" "\n" " from gpiozero import MCP3008, PWMLED\n" "\n" " pot = MCP3008(0)\n" " led = PWMLED(17)\n" " led.source = pot.values\n" "\n" ".. _analog to digital converters: https://en.wikipedia.org/wiki/Analog-to-" "digital_converter" msgstr "" #: mu/modes/api/pi.py:24 msgid "" "gpiozero.AngularServo(*args, **kwargs) \n" "Extends :class:`Servo` and represents a rotational PWM-controlled servo\n" "motor which can be set to particular angles (assuming valid minimum and\n" "maximum angles are provided to the constructor).\n" "\n" "Connect a power source (e.g. a battery pack or the 5V pin) to the power\n" "cable of the servo (this is typically colored red); connect the ground\n" "cable of the servo (typically colored black or brown) to the negative of\n" "your battery pack, or a GND pin; connect the final cable (typically colored\n" "white or orange) to the GPIO pin you wish to use for controlling the servo.\n" "\n" "Next, calibrate the angles that the servo can rotate to. In an interactive\n" "Python session, construct a :class:`Servo` instance. The servo should move\n" "to its mid-point by default. Set the servo to its minimum value, and\n" "measure the angle from the mid-point. Set the servo to its maximum value,\n" "and again measure the angle::\n" "\n" " >>> from gpiozero import Servo\n" " >>> s = Servo(17)\n" " >>> s.min() # measure the angle\n" " >>> s.max() # measure the angle\n" "\n" "You should now be able to construct an :class:`AngularServo` instance\n" "with the correct bounds::\n" "\n" " >>> from gpiozero import AngularServo\n" " >>> s = AngularServo(17, min_angle=-42, max_angle=44)\n" " >>> s.angle = 0.0\n" " >>> s.angle\n" " 0.0\n" " >>> s.angle = 15\n" " >>> s.angle\n" " 15.0\n" "\n" ".. note::\n" "\n" " You can set *min_angle* greater than *max_angle* if you wish to reverse\n" " the sense of the angles (e.g. ``min_angle=45, max_angle=-45``). This\n" " can be useful with servos that rotate in the opposite direction to your\n" " expectations of minimum and maximum.\n" "\n" ":param int pin:\n" " The GPIO pin which the device is attached to. See :ref:`pin_numbering`\n" " for valid pin numbers.\n" "\n" ":param float initial_angle:\n" " Sets the servo's initial angle to the specified value. The default is\n" " 0. The value specified must be between *min_angle* and *max_angle*\n" " inclusive. ``None`` means to start the servo un-controlled (see\n" " :attr:`value`).\n" "\n" ":param float min_angle:\n" " Sets the minimum angle that the servo can rotate to. This defaults to\n" " -90, but should be set to whatever you measure from your servo during\n" " calibration.\n" "\n" ":param float max_angle:\n" " Sets the maximum angle that the servo can rotate to. This defaults to\n" " 90, but should be set to whatever you measure from your servo during\n" " calibration.\n" "\n" ":param float min_pulse_width:\n" " The pulse width corresponding to the servo's minimum position. This\n" " defaults to 1ms.\n" "\n" ":param float max_pulse_width:\n" " The pulse width corresponding to the servo's maximum position. This\n" " defaults to 2ms.\n" "\n" ":param float frame_width:\n" " The length of time between servo control pulses measured in seconds.\n" " This defaults to 20ms which is a common value for servos." msgstr "" #: mu/modes/api/pi.py:25 msgid "" "gpiozero.BadEventHandler() \n" "Error raised when an event handler with an incompatible prototype is " "specified" msgstr "" #: mu/modes/api/pi.py:26 msgid "" "gpiozero.BadQueueLen() \n" "Error raised when non-positive queue length is specified" msgstr "" #: mu/modes/api/pi.py:27 msgid "" "gpiozero.BadWaitTime() \n" "Error raised when an invalid wait time is specified" msgstr "" #: mu/modes/api/pi.py:28 msgid "" "gpiozero.Button(*args, **kwargs) \n" "Extends :class:`DigitalInputDevice` and represents a simple push button\n" "or switch.\n" "\n" "Connect one side of the button to a ground pin, and the other to any GPIO\n" "pin. Alternatively, connect one side of the button to the 3V3 pin, and the\n" "other to any GPIO pin, then set *pull_up* to ``False`` in the\n" ":class:`Button` constructor.\n" "\n" "The following example will print a line of text when the button is pushed::\n" "\n" " from gpiozero import Button\n" "\n" " button = Button(4)\n" " button.wait_for_press()\n" " print(\"The button was pressed!\")\n" "\n" ":param int pin:\n" " The GPIO pin which the button is attached to. See :ref:`pin_numbering`\n" " for valid pin numbers.\n" "\n" ":param bool pull_up:\n" " If ``True`` (the default), the GPIO pin will be pulled high by default.\n" " In this case, connect the other side of the button to ground. If\n" " ``False``, the GPIO pin will be pulled low by default. In this case,\n" " connect the other side of the button to 3V3.\n" "\n" ":param float bounce_time:\n" " If ``None`` (the default), no software bounce compensation will be\n" " performed. Otherwise, this is the length of time (in seconds) that the\n" " component will ignore changes in state after an initial change.\n" "\n" ":param float hold_time:\n" " The length of time (in seconds) to wait after the button is pushed,\n" " until executing the :attr:`when_held` handler. Defaults to ``1``.\n" "\n" ":param bool hold_repeat:\n" " If ``True``, the :attr:`when_held` handler will be repeatedly executed\n" " as long as the device remains active, every *hold_time* seconds. If\n" " ``False`` (the default) the :attr:`when_held` handler will be only be\n" " executed once per hold." msgstr "" #: mu/modes/api/pi.py:29 msgid "" "gpiozero.ButtonBoard(*args, **kwargs) \n" "Extends :class:`CompositeDevice` and represents a generic button board or\n" "collection of buttons.\n" "\n" ":param int \\*pins:\n" " Specify the GPIO pins that the buttons of the board are attached to.\n" " You can designate as many pins as necessary.\n" "\n" ":param bool pull_up:\n" " If ``True`` (the default), the GPIO pins will be pulled high by\n" " default. In this case, connect the other side of the buttons to\n" " ground. If ``False``, the GPIO pins will be pulled low by default. In\n" " this case, connect the other side of the buttons to 3V3. This\n" " parameter can only be specified as a keyword parameter.\n" "\n" ":param float bounce_time:\n" " If ``None`` (the default), no software bounce compensation will be\n" " performed. Otherwise, this is the length of time (in seconds) that the\n" " buttons will ignore changes in state after an initial change. This\n" " parameter can only be specified as a keyword parameter.\n" "\n" ":param float hold_time:\n" " The length of time (in seconds) to wait after any button is pushed,\n" " until executing the :attr:`when_held` handler. Defaults to ``1``. This\n" " parameter can only be specified as a keyword parameter.\n" "\n" ":param bool hold_repeat:\n" " If ``True``, the :attr:`when_held` handler will be repeatedly executed\n" " as long as any buttons remain held, every *hold_time* seconds. If\n" " ``False`` (the default) the :attr:`when_held` handler will be only be\n" " executed once per hold. This parameter can only be specified as a\n" " keyword parameter.\n" "\n" ":param \\*\\*named_pins:\n" " Specify GPIO pins that buttons of the board are attached to,\n" " associating each button with a property name. You can designate as\n" " many pins as necessary and use any names, provided they're not already\n" " in use by something else." msgstr "" #: mu/modes/api/pi.py:30 msgid "" "gpiozero.Buzzer(*args, **kwargs) \n" "Extends :class:`DigitalOutputDevice` and represents a digital buzzer\n" "component.\n" "\n" "Connect the cathode (negative pin) of the buzzer to a ground pin; connect\n" "the other side to any GPIO pin.\n" "\n" "The following example will sound the buzzer::\n" "\n" " from gpiozero import Buzzer\n" "\n" " bz = Buzzer(3)\n" " bz.on()\n" "\n" ":param int pin:\n" " The GPIO pin which the buzzer is attached to. See :ref:`pin_numbering`\n" " for valid pin numbers.\n" "\n" ":param bool active_high:\n" " If ``True`` (the default), the buzzer will operate normally with the\n" " circuit described above. If ``False`` you should wire the cathode to\n" " the GPIO pin, and the anode to a 3V3 pin.\n" "\n" ":param bool initial_value:\n" " If ``False`` (the default), the buzzer will be silent initially. If\n" " ``None``, the buzzer will be left in whatever state the pin is found in\n" " when configured for output (warning: this can be on). If ``True``, the\n" " buzzer will be switched on initially." msgstr "" #: mu/modes/api/pi.py:31 msgid "" "gpiozero.CPUTemperature(*args, **kwargs) \n" "Extends :class:`InternalDevice` to provide a device which is active when\n" "the CPU temperature exceeds the *threshold* value.\n" "\n" "The following example plots the CPU's temperature on an LED bar graph::\n" "\n" " from gpiozero import LEDBarGraph, CPUTemperature\n" " from signal import pause\n" "\n" " # Use minimums and maximums that are closer to \"normal\" usage so the\n" " # bar graph is a bit more \"lively\"\n" " temp = CPUTemperature(min_temp=50, max_temp=90)\n" " graph = LEDBarGraph(5, 6, 13, 19, 25, pwm=True)\n" " graph.source = temp.values\n" " pause()\n" "\n" ":param str sensor_file:\n" " The file from which to read the temperature. This defaults to the\n" " sysfs file :file:`/sys/class/thermal/thermal_zone0/temp`. Whatever\n" " file is specified is expected to contain a single line containing the\n" " temperature in milli-degrees celsius.\n" "\n" ":param float min_temp:\n" " The temperature at which :attr:`value` will read 0.0. This defaults to\n" " 0.0.\n" "\n" ":param float max_temp:\n" " The temperature at which :attr:`value` will read 1.0. This defaults to\n" " 100.0.\n" "\n" ":param float threshold:\n" " The temperature above which the device will be considered \"active\".\n" " This defaults to 80.0." msgstr "" #: mu/modes/api/pi.py:32 msgid "" "gpiozero.CamJamKitRobot(*args, **kwargs) \n" "Extends :class:`Robot` for the `CamJam #3 EduKit`_ robot controller.\n" "\n" "The CamJam robot controller pins are fixed and therefore there's no need\n" "to specify them when constructing this class. The following example drives\n" "the robot forward::\n" "\n" " from gpiozero import CamJamKitRobot\n" "\n" " robot = CamJamKitRobot()\n" " robot.forward()\n" "\n" ".. _CamJam #3 EduKit: http://camjam.me/?page_id=1035" msgstr "" #: mu/modes/api/pi.py:33 msgid "" "gpiozero.CompositeDevice(*args, **kwargs) \n" "Extends :class:`Device`. Represents a device composed of multiple devices\n" "like simple HATs, H-bridge motor controllers, robots composed of multiple\n" "motors, etc.\n" "\n" "The constructor accepts subordinate devices as positional or keyword\n" "arguments. Positional arguments form unnamed devices accessed via the\n" ":attr:`all` attribute, while keyword arguments are added to the device\n" "as named (read-only) attributes.\n" "\n" ":param list _order:\n" " If specified, this is the order of named items specified by keyword\n" " arguments (to ensure that the :attr:`value` tuple is constructed with a\n" " specific order). All keyword arguments *must* be included in the\n" " collection. If omitted, an alphabetically sorted order will be selected\n" " for keyword arguments." msgstr "" #: mu/modes/api/pi.py:34 msgid "" "gpiozero.CompositeDeviceBadDevice() \n" "Error raised when a composite device is constructed with an object that " "doesn't inherit from :class:`Device`" msgstr "" #: mu/modes/api/pi.py:35 msgid "" "gpiozero.CompositeDeviceBadName() \n" "Error raised when a composite device is constructed with a reserved name" msgstr "" #: mu/modes/api/pi.py:36 msgid "" "gpiozero.CompositeDeviceBadOrder() \n" "Error raised when a composite device is constructed with an incomplete order" msgstr "" #: mu/modes/api/pi.py:37 msgid "" "gpiozero.CompositeDeviceError() \n" "Base class for errors specific to the CompositeDevice hierarchy" msgstr "" #: mu/modes/api/pi.py:38 msgid "" "gpiozero.CompositeOutputDevice(*args, **kwargs) \n" "Extends :class:`CompositeDevice` with :meth:`on`, :meth:`off`, and\n" ":meth:`toggle` methods for controlling subordinate output devices. Also\n" "extends :attr:`value` to be writeable.\n" "\n" ":param list _order:\n" " If specified, this is the order of named items specified by keyword\n" " arguments (to ensure that the :attr:`value` tuple is constructed with a\n" " specific order). All keyword arguments *must* be included in the\n" " collection. If omitted, an alphabetically sorted order will be selected\n" " for keyword arguments." msgstr "" #: mu/modes/api/pi.py:39 msgid "" "gpiozero.Device(*args, **kwargs) \n" "Represents a single device of any type; GPIO-based, SPI-based, I2C-based,\n" "etc. This is the base class of the device hierarchy. It defines the\n" "basic services applicable to all devices (specifically thhe :attr:" "`is_active`\n" "property, the :attr:`value` property, and the :meth:`close` method)." msgstr "" #: mu/modes/api/pi.py:40 msgid "" "gpiozero.DeviceClosed() \n" "Error raised when an operation is attempted on a closed device" msgstr "" #: mu/modes/api/pi.py:41 msgid "" "gpiozero.DigitalInputDevice(*args, **kwargs) \n" "Represents a generic input device with typical on/off behaviour.\n" "\n" "This class extends :class:`InputDevice` with machinery to fire the active\n" "and inactive events for devices that operate in a typical digital manner:\n" "straight forward on / off states with (reasonably) clean transitions\n" "between the two.\n" "\n" ":param float bounce_time:\n" " Specifies the length of time (in seconds) that the component will\n" " ignore changes in state after an initial change. This defaults to\n" " ``None`` which indicates that no bounce compensation will be performed." msgstr "" #: mu/modes/api/pi.py:42 msgid "" "gpiozero.DigitalOutputDevice(*args, **kwargs) \n" "Represents a generic output device with typical on/off behaviour.\n" "\n" "This class extends :class:`OutputDevice` with a :meth:`blink` method which\n" "uses an optional background thread to handle toggling the device state\n" "without further interaction." msgstr "" #: mu/modes/api/pi.py:43 msgid "" "gpiozero.DistanceSensor(*args, **kwargs) \n" "Extends :class:`SmoothedInputDevice` and represents an HC-SR04 ultrasonic\n" "distance sensor, as found in the `CamJam #3 EduKit`_.\n" "\n" "The distance sensor requires two GPIO pins: one for the *trigger* (marked\n" "TRIG on the sensor) and another for the *echo* (marked ECHO on the sensor).\n" "However, a voltage divider is required to ensure the 5V from the ECHO pin\n" "doesn't damage the Pi. Wire your sensor according to the following\n" "instructions:\n" "\n" "1. Connect the GND pin of the sensor to a ground pin on the Pi.\n" "\n" "2. Connect the TRIG pin of the sensor a GPIO pin.\n" "\n" "3. Connect a 330Ω resistor from the ECHO pin of the sensor to a different\n" " GPIO pin.\n" "\n" "4. Connect a 470Ω resistor from ground to the ECHO GPIO pin. This forms\n" " the required voltage divider.\n" "\n" "5. Finally, connect the VCC pin of the sensor to a 5V pin on the Pi.\n" "\n" "The following code will periodically report the distance measured by the\n" "sensor in cm assuming the TRIG pin is connected to GPIO17, and the ECHO\n" "pin to GPIO18::\n" "\n" " from gpiozero import DistanceSensor\n" " from time import sleep\n" "\n" " sensor = DistanceSensor(echo=18, trigger=17)\n" " while True:\n" " print('Distance: ', sensor.distance * 100)\n" " sleep(1)\n" "\n" ":param int echo:\n" " The GPIO pin which the ECHO pin is attached to. See\n" " :ref:`pin_numbering` for valid pin numbers.\n" "\n" ":param int trigger:\n" " The GPIO pin which the TRIG pin is attached to. See\n" " :ref:`pin_numbering` for valid pin numbers.\n" "\n" ":param int queue_len:\n" " The length of the queue used to store values read from the sensor.\n" " This defaults to 30.\n" "\n" ":param float max_distance:\n" " The :attr:`value` attribute reports a normalized value between 0 (too\n" " close to measure) and 1 (maximum distance). This parameter specifies\n" " the maximum distance expected in meters. This defaults to 1.\n" "\n" ":param float threshold_distance:\n" " Defaults to 0.3. This is the distance (in meters) that will trigger the\n" " ``in_range`` and ``out_of_range`` events when crossed.\n" "\n" ":param bool partial:\n" " When ``False`` (the default), the object will not return a value for\n" " :attr:`~SmoothedInputDevice.is_active` until the internal queue has\n" " filled with values. Only set this to ``True`` if you require values\n" " immediately after object construction.\n" "\n" ".. _CamJam #3 EduKit: http://camjam.me/?page_id=1035" msgstr "" #: mu/modes/api/pi.py:44 msgid "" "gpiozero.Energenie(*args, **kwargs) \n" "Extends :class:`Device` to represent an `Energenie socket`_ controller.\n" "\n" "This class is constructed with a socket number and an optional initial\n" "state (defaults to ``False``, meaning off). Instances of this class can\n" "be used to switch peripherals on and off. For example::\n" "\n" " from gpiozero import Energenie\n" "\n" " lamp = Energenie(1)\n" " lamp.on()\n" "\n" ":param int socket:\n" " Which socket this instance should control. This is an integer number\n" " between 1 and 4.\n" "\n" ":param bool initial_value:\n" " The initial state of the socket. As Energenie sockets provide no\n" " means of reading their state, you must provide an initial state for\n" " the socket, which will be set upon construction. This defaults to\n" " ``False`` which will switch the socket off.\n" "\n" ".. _Energenie socket: https://energenie4u.co.uk/index.php/catalogue/product/" "ENER002-2PI" msgstr "" #: mu/modes/api/pi.py:45 msgid "" "gpiozero.EnergenieBadSocket() \n" "Error raised when an invalid socket number is passed to :class:`Energenie`" msgstr "" #: mu/modes/api/pi.py:46 msgid "" "gpiozero.EnergenieSocketMissing() \n" "Error raised when socket number is not specified" msgstr "" #: mu/modes/api/pi.py:47 msgid "" "gpiozero.EventsMixin(*args, **kwargs) \n" "Adds edge-detected :meth:`when_activated` and :meth:`when_deactivated`\n" "events to a device based on changes to the :attr:`~Device.is_active`\n" "property common to all devices. Also adds :meth:`wait_for_active` and\n" ":meth:`wait_for_inactive` methods for level-waiting.\n" "\n" ".. note::\n" "\n" " Note that this mixin provides no means of actually firing its events;\n" " call :meth:`_fire_events` in sub-classes when device state changes to\n" " trigger the events. This should also be called once at the end of\n" " initialization to set initial states." msgstr "" #: mu/modes/api/pi.py:48 msgid "" "gpiozero.FishDish(*args, **kwargs) \n" "Extends :class:`TrafficLightsBuzzer` for the `Pi Supply FishDish`_: traffic\n" "light LEDs, a button and a buzzer.\n" "\n" "The FishDish pins are fixed and therefore there's no need to specify them\n" "when constructing this class. The following example waits for the button\n" "to be pressed on the FishDish, then turns on all the LEDs::\n" "\n" " from gpiozero import FishDish\n" "\n" " fish = FishDish()\n" " fish.button.wait_for_press()\n" " fish.lights.on()\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances to represent each\n" " LED. If ``False`` (the default), construct regular :class:`LED`\n" " instances.\n" "\n" ".. _Pi Supply FishDish: https://www.pi-supply.com/product/fish-dish-" "raspberry-pi-led-buzzer-board/" msgstr "" #: mu/modes/api/pi.py:49 msgid "" "gpiozero.GPIODevice(*args, **kwargs) \n" "Extends :class:`Device`. Represents a generic GPIO device and provides\n" "the services common to all single-pin GPIO devices (like ensuring two\n" "GPIO devices do no share a :attr:`pin`).\n" "\n" ":param int pin:\n" " The GPIO pin (in BCM numbering) that the device is connected to. If\n" " this is ``None``, :exc:`GPIOPinMissing` will be raised. If the pin is\n" " already in use by another device, :exc:`GPIOPinInUse` will be raised." msgstr "" #: mu/modes/api/pi.py:50 msgid "" "gpiozero.GPIODeviceClosed() \n" "Deprecated descendent of :exc:`DeviceClosed`" msgstr "" #: mu/modes/api/pi.py:51 msgid "" "gpiozero.GPIODeviceError() \n" "Base class for errors specific to the GPIODevice hierarchy" msgstr "" #: mu/modes/api/pi.py:52 msgid "" "gpiozero.GPIOPinInUse() \n" "Error raised when attempting to use a pin already in use by another device" msgstr "" #: mu/modes/api/pi.py:53 msgid "" "gpiozero.GPIOPinMissing() \n" "Error raised when a pin number is not specified" msgstr "" #: mu/modes/api/pi.py:54 msgid "" "gpiozero.GPIOZeroError() \n" "Base class for all exceptions in GPIO Zero" msgstr "" #: mu/modes/api/pi.py:55 msgid "" "gpiozero.GPIOZeroWarning() \n" "Base class for all warnings in GPIO Zero" msgstr "" #: mu/modes/api/pi.py:56 msgid "" "gpiozero.HoldMixin(*args, **kwargs) \n" "Extends :class:`EventsMixin` to add the :attr:`when_held` event and the\n" "machinery to fire that event repeatedly (when :attr:`hold_repeat` is\n" "``True``) at internals defined by :attr:`hold_time`." msgstr "" #: mu/modes/api/pi.py:57 msgid "" "gpiozero.InputDevice(*args, **kwargs) \n" "Represents a generic GPIO input device.\n" "\n" "This class extends :class:`GPIODevice` to add facilities common to GPIO\n" "input devices. The constructor adds the optional *pull_up* parameter to\n" "specify how the pin should be pulled by the internal resistors. The\n" ":attr:`~GPIODevice.is_active` property is adjusted accordingly so that\n" "``True`` still means active regardless of the :attr:`pull_up` setting.\n" "\n" ":param int pin:\n" " The GPIO pin (in Broadcom numbering) that the device is connected to.\n" " If this is ``None`` a :exc:`GPIODeviceError` will be raised.\n" "\n" ":param bool pull_up:\n" " If ``True``, the pin will be pulled high with an internal resistor. If\n" " ``False`` (the default), the pin will be pulled low." msgstr "" #: mu/modes/api/pi.py:58 msgid "" "gpiozero.InputDeviceError() \n" "Base class for errors specific to the InputDevice hierarchy" msgstr "" #: mu/modes/api/pi.py:59 msgid "" "gpiozero.InternalDevice(*args, **kwargs) \n" "Extends :class:`Device` to provide a basis for devices which have no\n" "specific hardware representation. These are effectively pseudo-devices and\n" "usually represent operating system services like the internal clock, file\n" "systems or network facilities." msgstr "" #: mu/modes/api/pi.py:60 msgid "" "gpiozero.LED(*args, **kwargs) \n" "Extends :class:`DigitalOutputDevice` and represents a light emitting diode\n" "(LED).\n" "\n" "Connect the cathode (short leg, flat side) of the LED to a ground pin;\n" "connect the anode (longer leg) to a limiting resistor; connect the other\n" "side of the limiting resistor to a GPIO pin (the limiting resistor can be\n" "placed either side of the LED).\n" "\n" "The following example will light the LED::\n" "\n" " from gpiozero import LED\n" "\n" " led = LED(17)\n" " led.on()\n" "\n" ":param int pin:\n" " The GPIO pin which the LED is attached to. See :ref:`pin_numbering` for\n" " valid pin numbers.\n" "\n" ":param bool active_high:\n" " If ``True`` (the default), the LED will operate normally with the\n" " circuit described above. If ``False`` you should wire the cathode to\n" " the GPIO pin, and the anode to a 3V3 pin (via a limiting resistor).\n" "\n" ":param bool initial_value:\n" " If ``False`` (the default), the LED will be off initially. If\n" " ``None``, the LED will be left in whatever state the pin is found in\n" " when configured for output (warning: this can be on). If ``True``, the\n" " LED will be switched on initially." msgstr "" #: mu/modes/api/pi.py:61 msgid "" "gpiozero.LEDBarGraph(*args, **kwargs) \n" "Extends :class:`LEDCollection` to control a line of LEDs representing a\n" "bar graph. Positive values (0 to 1) light the LEDs from first to last.\n" "Negative values (-1 to 0) light the LEDs from last to first.\n" "\n" "The following example demonstrates turning on the first two and last two\n" "LEDs in a board containing five LEDs attached to GPIOs 2 through 6::\n" "\n" " from gpiozero import LEDBarGraph\n" " from time import sleep\n" "\n" " graph = LEDBarGraph(2, 3, 4, 5, 6)\n" " graph.value = 2/5 # Light the first two LEDs only\n" " sleep(1)\n" " graph.value = -2/5 # Light the last two LEDs only\n" " sleep(1)\n" " graph.off()\n" "\n" "As with other output devices, :attr:`source` and :attr:`values` are\n" "supported::\n" "\n" " from gpiozero import LEDBarGraph, MCP3008\n" " from signal import pause\n" "\n" " graph = LEDBarGraph(2, 3, 4, 5, 6, pwm=True)\n" " pot = MCP3008(channel=0)\n" " graph.source = pot.values\n" " pause()\n" "\n" ":param int \\*pins:\n" " Specify the GPIO pins that the LEDs of the bar graph are attached to.\n" " You can designate as many pins as necessary.\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances for each pin. If\n" " ``False`` (the default), construct regular :class:`LED` instances. This\n" " parameter can only be specified as a keyword parameter.\n" "\n" ":param bool active_high:\n" " If ``True`` (the default), the :meth:`on` method will set all the\n" " associated pins to HIGH. If ``False``, the :meth:`on` method will set\n" " all pins to LOW (the :meth:`off` method always does the opposite). This\n" " parameter can only be specified as a keyword parameter.\n" "\n" ":param float initial_value:\n" " The initial :attr:`value` of the graph given as a float between -1 and\n" " +1. Defaults to ``0.0``. This parameter can only be specified as a\n" " keyword parameter." msgstr "" #: mu/modes/api/pi.py:62 msgid "" "gpiozero.LEDBoard(*args, **kwargs) \n" "Extends :class:`LEDCollection` and represents a generic LED board or\n" "collection of LEDs.\n" "\n" "The following example turns on all the LEDs on a board containing 5 LEDs\n" "attached to GPIO pins 2 through 6::\n" "\n" " from gpiozero import LEDBoard\n" "\n" " leds = LEDBoard(2, 3, 4, 5, 6)\n" " leds.on()\n" "\n" ":param int \\*pins:\n" " Specify the GPIO pins that the LEDs of the board are attached to. You\n" " can designate as many pins as necessary. You can also specify\n" " :class:`LEDBoard` instances to create trees of LEDs.\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances for each pin. If\n" " ``False`` (the default), construct regular :class:`LED` instances. This\n" " parameter can only be specified as a keyword parameter.\n" "\n" ":param bool active_high:\n" " If ``True`` (the default), the :meth:`on` method will set all the\n" " associated pins to HIGH. If ``False``, the :meth:`on` method will set\n" " all pins to LOW (the :meth:`off` method always does the opposite). This\n" " parameter can only be specified as a keyword parameter.\n" "\n" ":param bool initial_value:\n" " If ``False`` (the default), all LEDs will be off initially. If\n" " ``None``, each device will be left in whatever state the pin is found\n" " in when configured for output (warning: this can be on). If ``True``,\n" " the device will be switched on initially. This parameter can only be\n" " specified as a keyword parameter.\n" "\n" ":param \\*\\*named_pins:\n" " Specify GPIO pins that LEDs of the board are attached to, associating\n" " each LED with a property name. You can designate as many pins as\n" " necessary and use any names, provided they're not already in use by\n" " something else. You can also specify :class:`LEDBoard` instances to\n" " create trees of LEDs." msgstr "" #: mu/modes/api/pi.py:63 msgid "" "gpiozero.LEDCollection(*args, **kwargs) \n" "Extends :class:`CompositeOutputDevice`. Abstract base class for\n" ":class:`LEDBoard` and :class:`LEDBarGraph`." msgstr "" #: mu/modes/api/pi.py:64 msgid "" "gpiozero.LedBorg(*args, **kwargs) \n" "Extends :class:`RGBLED` for the `PiBorg LedBorg`_: an add-on board\n" "containing a very bright RGB LED.\n" "\n" "The LedBorg pins are fixed and therefore there's no need to specify them\n" "when constructing this class. The following example turns the LedBorg\n" "purple::\n" "\n" " from gpiozero import LedBorg\n" "\n" " led = LedBorg()\n" " led.color = (1, 0, 1)\n" "\n" ":param tuple initial_value:\n" " The initial color for the LedBorg. Defaults to black ``(0, 0, 0)``.\n" "\n" ":param bool pwm:\n" " If ``True`` (the default), construct :class:`PWMLED` instances for\n" " each component of the LedBorg. If ``False``, construct regular\n" " :class:`LED` instances, which prevents smooth color graduations.\n" "\n" ".. _PiBorg LedBorg: https://www.piborg.org/ledborg" msgstr "" #: mu/modes/api/pi.py:65 msgid "" "gpiozero.LightSensor(*args, **kwargs) \n" "Extends :class:`SmoothedInputDevice` and represents a light dependent\n" "resistor (LDR).\n" "\n" "Connect one leg of the LDR to the 3V3 pin; connect one leg of a 1µF\n" "capacitor to a ground pin; connect the other leg of the LDR and the other\n" "leg of the capacitor to the same GPIO pin. This class repeatedly discharges\n" "the capacitor, then times the duration it takes to charge (which will vary\n" "according to the light falling on the LDR).\n" "\n" "The following code will print a line of text when light is detected::\n" "\n" " from gpiozero import LightSensor\n" "\n" " ldr = LightSensor(18)\n" " ldr.wait_for_light()\n" " print(\"Light detected!\")\n" "\n" ":param int pin:\n" " The GPIO pin which the sensor is attached to. See :ref:`pin_numbering`\n" " for valid pin numbers.\n" "\n" ":param int queue_len:\n" " The length of the queue used to store values read from the circuit.\n" " This defaults to 5.\n" "\n" ":param float charge_time_limit:\n" " If the capacitor in the circuit takes longer than this length of time\n" " to charge, it is assumed to be dark. The default (0.01 seconds) is\n" " appropriate for a 1µF capacitor coupled with the LDR from the\n" " `CamJam #2 EduKit`_. You may need to adjust this value for different\n" " valued capacitors or LDRs.\n" "\n" ":param float threshold:\n" " Defaults to 0.1. When the mean of all values in the internal queue\n" " rises above this value, the area will be considered \"light\", and all\n" " appropriate events will be fired.\n" "\n" ":param bool partial:\n" " When ``False`` (the default), the object will not return a value for\n" " :attr:`~SmoothedInputDevice.is_active` until the internal queue has\n" " filled with values. Only set this to ``True`` if you require values\n" " immediately after object construction.\n" "\n" ".. _CamJam #2 EduKit: http://camjam.me/?page_id=623" msgstr "" #: mu/modes/api/pi.py:66 msgid "" "gpiozero.LineSensor(*args, **kwargs) \n" "Extends :class:`SmoothedInputDevice` and represents a single pin line " "sensor\n" "like the TCRT5000 infra-red proximity sensor found in the `CamJam #3\n" "EduKit`_.\n" "\n" "A typical line sensor has a small circuit board with three pins: VCC, GND,\n" "and OUT. VCC should be connected to a 3V3 pin, GND to one of the ground\n" "pins, and finally OUT to the GPIO specified as the value of the *pin*\n" "parameter in the constructor.\n" "\n" "The following code will print a line of text indicating when the sensor\n" "detects a line, or stops detecting a line::\n" "\n" " from gpiozero import LineSensor\n" " from signal import pause\n" "\n" " sensor = LineSensor(4)\n" " sensor.when_line = lambda: print('Line detected')\n" " sensor.when_no_line = lambda: print('No line detected')\n" " pause()\n" "\n" ":param int pin:\n" " The GPIO pin which the sensor is attached to. See :ref:`pin_numbering`\n" " for valid pin numbers.\n" "\n" ":param int queue_len:\n" " The length of the queue used to store values read from the sensor. This\n" " defaults to 5.\n" "\n" ":param float sample_rate:\n" " The number of values to read from the device (and append to the\n" " internal queue) per second. Defaults to 100.\n" "\n" ":param float threshold:\n" " Defaults to 0.5. When the mean of all values in the internal queue\n" " rises above this value, the sensor will be considered \"active\" by the\n" " :attr:`~SmoothedInputDevice.is_active` property, and all appropriate\n" " events will be fired.\n" "\n" ":param bool partial:\n" " When ``False`` (the default), the object will not return a value for\n" " :attr:`~SmoothedInputDevice.is_active` until the internal queue has\n" " filled with values. Only set this to ``True`` if you require values\n" " immediately after object construction.\n" "\n" ".. _CamJam #3 EduKit: http://camjam.me/?page_id=1035" msgstr "" #: mu/modes/api/pi.py:67 msgid "" "gpiozero.LocalPin() \n" "Abstract base class representing pins attached locally to a Pi. This forms\n" "the base class for local-only pin interfaces (:class:`RPiGPIOPin`,\n" ":class:`RPIOPin`, and :class:`NativePin`)." msgstr "" #: mu/modes/api/pi.py:68 msgid "" "gpiozero.MCP3001(*args, **kwargs) \n" "The `MCP3001`_ is a 10-bit analog to digital converter with 1 channel\n" "\n" ".. _MCP3001: http://www.farnell.com/datasheets/630400.pdf" msgstr "" #: mu/modes/api/pi.py:69 msgid "" "gpiozero.MCP3002(*args, **kwargs) \n" "The `MCP3002`_ is a 10-bit analog to digital converter with 2 channels\n" "(0-1).\n" "\n" ".. _MCP3002: http://www.farnell.com/datasheets/1599363.pdf" msgstr "" #: mu/modes/api/pi.py:70 msgid "" "gpiozero.MCP3004(*args, **kwargs) \n" "The `MCP3004`_ is a 10-bit analog to digital converter with 4 channels\n" "(0-3).\n" "\n" ".. _MCP3004: http://www.farnell.com/datasheets/808965.pdf" msgstr "" #: mu/modes/api/pi.py:71 msgid "" "gpiozero.MCP3008(*args, **kwargs) \n" "The `MCP3008`_ is a 10-bit analog to digital converter with 8 channels\n" "(0-7).\n" "\n" ".. _MCP3008: http://www.farnell.com/datasheets/808965.pdf" msgstr "" #: mu/modes/api/pi.py:72 msgid "" "gpiozero.MCP3201(*args, **kwargs) \n" "The `MCP3201`_ is a 12-bit analog to digital converter with 1 channel\n" "\n" ".. _MCP3201: http://www.farnell.com/datasheets/1669366.pdf" msgstr "" #: mu/modes/api/pi.py:73 msgid "" "gpiozero.MCP3202(*args, **kwargs) \n" "The `MCP3202`_ is a 12-bit analog to digital converter with 2 channels\n" "(0-1).\n" "\n" ".. _MCP3202: http://www.farnell.com/datasheets/1669376.pdf" msgstr "" #: mu/modes/api/pi.py:74 msgid "" "gpiozero.MCP3204(*args, **kwargs) \n" "The `MCP3204`_ is a 12-bit analog to digital converter with 4 channels\n" "(0-3).\n" "\n" ".. _MCP3204: http://www.farnell.com/datasheets/808967.pdf" msgstr "" #: mu/modes/api/pi.py:75 msgid "" "gpiozero.MCP3208(*args, **kwargs) \n" "The `MCP3208`_ is a 12-bit analog to digital converter with 8 channels\n" "(0-7).\n" "\n" ".. _MCP3208: http://www.farnell.com/datasheets/808967.pdf" msgstr "" #: mu/modes/api/pi.py:76 msgid "" "gpiozero.MCP3301(*args, **kwargs) \n" "The `MCP3301`_ is a signed 13-bit analog to digital converter. Please note\n" "that the MCP3301 always operates in differential mode between its two\n" "channels and the output value is scaled from -1 to +1.\n" "\n" ".. _MCP3301: http://www.farnell.com/datasheets/1669397.pdf" msgstr "" #: mu/modes/api/pi.py:77 msgid "" "gpiozero.MCP3302(*args, **kwargs) \n" "The `MCP3302`_ is a 12/13-bit analog to digital converter with 4 channels\n" "(0-3). When operated in differential mode, the device outputs a signed\n" "13-bit value which is scaled from -1 to +1. When operated in single-ended\n" "mode (the default), the device outputs an unsigned 12-bit value scaled from\n" "0 to 1.\n" "\n" ".. _MCP3302: http://www.farnell.com/datasheets/1486116.pdf" msgstr "" #: mu/modes/api/pi.py:78 msgid "" "gpiozero.MCP3304(*args, **kwargs) \n" "The `MCP3304`_ is a 12/13-bit analog to digital converter with 8 channels\n" "(0-7). When operated in differential mode, the device outputs a signed\n" "13-bit value which is scaled from -1 to +1. When operated in single-ended\n" "mode (the default), the device outputs an unsigned 12-bit value scaled from\n" "0 to 1.\n" "\n" ".. _MCP3304: http://www.farnell.com/datasheets/1486116.pdf" msgstr "" #: mu/modes/api/pi.py:79 msgid "" "gpiozero.MotionSensor(*args, **kwargs) \n" "Extends :class:`SmoothedInputDevice` and represents a passive infra-red\n" "(PIR) motion sensor like the sort found in the `CamJam #2 EduKit`_.\n" "\n" ".. _CamJam #2 EduKit: http://camjam.me/?page_id=623\n" "\n" "A typical PIR device has a small circuit board with three pins: VCC, OUT,\n" "and GND. VCC should be connected to a 5V pin, GND to one of the ground\n" "pins, and finally OUT to the GPIO specified as the value of the *pin*\n" "parameter in the constructor.\n" "\n" "The following code will print a line of text when motion is detected::\n" "\n" " from gpiozero import MotionSensor\n" "\n" " pir = MotionSensor(4)\n" " pir.wait_for_motion()\n" " print(\"Motion detected!\")\n" "\n" ":param int pin:\n" " The GPIO pin which the sensor is attached to. See :ref:`pin_numbering`\n" " for valid pin numbers.\n" "\n" ":param int queue_len:\n" " The length of the queue used to store values read from the sensor. This\n" " defaults to 1 which effectively disables the queue. If your motion\n" " sensor is particularly \"twitchy\" you may wish to increase this value.\n" "\n" ":param float sample_rate:\n" " The number of values to read from the device (and append to the\n" " internal queue) per second. Defaults to 100.\n" "\n" ":param float threshold:\n" " Defaults to 0.5. When the mean of all values in the internal queue\n" " rises above this value, the sensor will be considered \"active\" by the\n" " :attr:`~SmoothedInputDevice.is_active` property, and all appropriate\n" " events will be fired.\n" "\n" ":param bool partial:\n" " When ``False`` (the default), the object will not return a value for\n" " :attr:`~SmoothedInputDevice.is_active` until the internal queue has\n" " filled with values. Only set this to ``True`` if you require values\n" " immediately after object construction." msgstr "" #: mu/modes/api/pi.py:80 msgid "" "gpiozero.Motor(*args, **kwargs) \n" "Extends :class:`CompositeDevice` and represents a generic motor\n" "connected to a bi-directional motor driver circuit (i.e. an `H-bridge`_).\n" "\n" "Attach an `H-bridge`_ motor controller to your Pi; connect a power source\n" "(e.g. a battery pack or the 5V pin) to the controller; connect the outputs\n" "of the controller board to the two terminals of the motor; connect the\n" "inputs of the controller board to two GPIO pins.\n" "\n" ".. _H-bridge: https://en.wikipedia.org/wiki/H_bridge\n" "\n" "The following code will make the motor turn \"forwards\"::\n" "\n" " from gpiozero import Motor\n" "\n" " motor = Motor(17, 18)\n" " motor.forward()\n" "\n" ":param int forward:\n" " The GPIO pin that the forward input of the motor driver chip is\n" " connected to.\n" "\n" ":param int backward:\n" " The GPIO pin that the backward input of the motor driver chip is\n" " connected to.\n" "\n" ":param bool pwm:\n" " If ``True`` (the default), construct :class:`PWMOutputDevice`\n" " instances for the motor controller pins, allowing both direction and\n" " variable speed control. If ``False``, construct\n" " :class:`DigitalOutputDevice` instances, allowing only direction\n" " control." msgstr "" #: mu/modes/api/pi.py:81 msgid "" "gpiozero.OutputDevice(*args, **kwargs) \n" "Represents a generic GPIO output device.\n" "\n" "This class extends :class:`GPIODevice` to add facilities common to GPIO\n" "output devices: an :meth:`on` method to switch the device on, a\n" "corresponding :meth:`off` method, and a :meth:`toggle` method.\n" "\n" ":param int pin:\n" " The GPIO pin (in BCM numbering) that the device is connected to. If\n" " this is ``None`` a :exc:`GPIOPinMissing` will be raised.\n" "\n" ":param bool active_high:\n" " If ``True`` (the default), the :meth:`on` method will set the GPIO to\n" " HIGH. If ``False``, the :meth:`on` method will set the GPIO to LOW (the\n" " :meth:`off` method always does the opposite).\n" "\n" ":param bool initial_value:\n" " If ``False`` (the default), the device will be off initially. If\n" " ``None``, the device will be left in whatever state the pin is found in\n" " when configured for output (warning: this can be on). If ``True``, the\n" " device will be switched on initially." msgstr "" #: mu/modes/api/pi.py:82 msgid "" "gpiozero.OutputDeviceBadValue() \n" "Error raised when ``value`` is set to an invalid value" msgstr "" #: mu/modes/api/pi.py:83 msgid "" "gpiozero.OutputDeviceError() \n" "Base class for errors specified to the OutputDevice hierarchy" msgstr "" #: mu/modes/api/pi.py:84 msgid "" "gpiozero.PWMLED(*args, **kwargs) \n" "Extends :class:`PWMOutputDevice` and represents a light emitting diode\n" "(LED) with variable brightness.\n" "\n" "A typical configuration of such a device is to connect a GPIO pin to the\n" "anode (long leg) of the LED, and the cathode (short leg) to ground, with\n" "an optional resistor to prevent the LED from burning out.\n" "\n" ":param int pin:\n" " The GPIO pin which the LED is attached to. See :ref:`pin_numbering` for\n" " valid pin numbers.\n" "\n" ":param bool active_high:\n" " If ``True`` (the default), the :meth:`on` method will set the GPIO to\n" " HIGH. If ``False``, the :meth:`on` method will set the GPIO to LOW (the\n" " :meth:`off` method always does the opposite).\n" "\n" ":param float initial_value:\n" " If ``0`` (the default), the LED will be off initially. Other values\n" " between 0 and 1 can be specified as an initial brightness for the LED.\n" " Note that ``None`` cannot be specified (unlike the parent class) as\n" " there is no way to tell PWM not to alter the state of the pin.\n" "\n" ":param int frequency:\n" " The frequency (in Hz) of pulses emitted to drive the LED. Defaults\n" " to 100Hz." msgstr "" #: mu/modes/api/pi.py:85 msgid "" "gpiozero.PWMOutputDevice(*args, **kwargs) \n" "Generic output device configured for pulse-width modulation (PWM).\n" "\n" ":param int pin:\n" " The GPIO pin which the device is attached to. See :ref:`pin_numbering`\n" " for valid pin numbers.\n" "\n" ":param bool active_high:\n" " If ``True`` (the default), the :meth:`on` method will set the GPIO to\n" " HIGH. If ``False``, the :meth:`on` method will set the GPIO to LOW (the\n" " :meth:`off` method always does the opposite).\n" "\n" ":param float initial_value:\n" " If ``0`` (the default), the device's duty cycle will be 0 initially.\n" " Other values between 0 and 1 can be specified as an initial duty cycle.\n" " Note that ``None`` cannot be specified (unlike the parent class) as\n" " there is no way to tell PWM not to alter the state of the pin.\n" "\n" ":param int frequency:\n" " The frequency (in Hz) of pulses emitted to drive the device. Defaults\n" " to 100Hz." msgstr "" #: mu/modes/api/pi.py:86 msgid "" "gpiozero.PiBoardInfo(revision, model, pcb_revision, released, soc, " "manufacturer, memory, storage, usb, ethernet, wifi, bluetooth, csi, dsi, " "headers) \n" "This class is a :func:`~collections.namedtuple` derivative used to\n" "represent information about a particular model of Raspberry Pi. While it is\n" "a tuple, it is strongly recommended that you use the following named\n" "attributes to access the data contained within.\n" "\n" ".. automethod:: physical_pin\n" "\n" ".. automethod:: physical_pins\n" "\n" ".. automethod:: pulled_up\n" "\n" ".. attribute:: revision\n" "\n" " A string indicating the revision of the Pi. This is unique to each\n" " revision and can be considered the \"key\" from which all other\n" " attributes are derived. However, in itself the string is fairly\n" " meaningless.\n" "\n" ".. attribute:: model\n" "\n" " A string containing the model of the Pi (for example, \"B\", \"B+\", \"A+" "\",\n" " \"2B\", \"CM\" (for the Compute Module), or \"Zero\").\n" "\n" ".. attribute:: pcb_revision\n" "\n" " A string containing the PCB revision number which is silk-screened onto\n" " the Pi (on some models).\n" "\n" " .. note::\n" "\n" " This is primarily useful to distinguish between the model B\n" " revision 1.0 and 2.0 (not to be confused with the model 2B) which\n" " had slightly different pinouts on their 26-pin GPIO headers.\n" "\n" ".. attribute:: released\n" "\n" " A string containing an approximate release date for this revision of\n" " the Pi (formatted as yyyyQq, e.g. 2012Q1 means the first quarter of\n" " 2012).\n" "\n" ".. attribute:: soc\n" "\n" " A string indicating the SoC (`system on a chip`_) that this revision\n" " of the Pi is based upon.\n" "\n" ".. attribute:: manufacturer\n" "\n" " A string indicating the name of the manufacturer (usually \"Sony\" but " "a\n" " few others exist).\n" "\n" ".. attribute:: memory\n" "\n" " An integer indicating the amount of memory (in Mb) connected to the\n" " SoC.\n" "\n" " .. note::\n" "\n" " This can differ substantially from the amount of RAM available\n" " to the operating system as the GPU's memory is shared with the\n" " CPU. When the camera module is activated, at least 128Mb of RAM\n" " is typically reserved for the GPU.\n" "\n" ".. attribute:: storage\n" "\n" " A string indicating the type of bootable storage used with this\n" " revision of Pi, e.g. \"SD\", \"MicroSD\", or \"eMMC\" (for the Compute\n" " Module).\n" "\n" ".. attribute:: usb\n" "\n" " An integer indicating how many USB ports are physically present on\n" " this revision of the Pi.\n" "\n" " .. note::\n" "\n" " This does *not* include the micro-USB port used to power the Pi.\n" "\n" ".. attribute:: ethernet\n" "\n" " An integer indicating how many Ethernet ports are physically present\n" " on this revision of the Pi.\n" "\n" ".. attribute:: wifi\n" "\n" " A bool indicating whether this revision of the Pi has wifi built-in.\n" "\n" ".. attribute:: bluetooth\n" "\n" " A bool indicating whether this revision of the Pi has bluetooth\n" " built-in.\n" "\n" ".. attribute:: csi\n" "\n" " An integer indicating the number of CSI (camera) ports available on\n" " this revision of the Pi.\n" "\n" ".. attribute:: dsi\n" "\n" " An integer indicating the number of DSI (display) ports available on\n" " this revision of the Pi.\n" "\n" ".. attribute:: headers\n" "\n" " A dictionary which maps header labels to dictionaries which map\n" " physical pin numbers to :class:`PinInfo` tuples. For example, to obtain\n" " information about pin 12 on header P1 you would query\n" " ``headers['P1'][12]``.\n" "\n" ".. _system on a chip: https://en.wikipedia.org/wiki/System_on_a_chip" msgstr "" #: mu/modes/api/pi.py:87 msgid "" "gpiozero.PiLiter(*args, **kwargs) \n" "Extends :class:`LEDBoard` for the `Ciseco Pi-LITEr`_: a strip of 8 very " "bright\n" "LEDs.\n" "\n" "The Pi-LITEr pins are fixed and therefore there's no need to specify them\n" "when constructing this class. The following example turns on all the LEDs\n" "of the Pi-LITEr::\n" "\n" " from gpiozero import PiLiter\n" "\n" " lite = PiLiter()\n" " lite.on()\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances for each pin. If\n" " ``False`` (the default), construct regular :class:`LED` instances.\n" "\n" ":param bool initial_value:\n" " If ``False`` (the default), all LEDs will be off initially. If\n" " ``None``, each device will be left in whatever state the pin is found\n" " in when configured for output (warning: this can be on). If ``True``,\n" " the device will be switched on initially.\n" "\n" ".. _Ciseco Pi-LITEr: http://shop.ciseco.co.uk/pi-liter-8-led-strip-for-the-" "raspberry-pi/" msgstr "" #: mu/modes/api/pi.py:88 msgid "" "gpiozero.PiLiterBarGraph(*args, **kwargs) \n" "Extends :class:`LEDBarGraph` to treat the `Ciseco Pi-LITEr`_ as an\n" "8-segment bar graph.\n" "\n" "The Pi-LITEr pins are fixed and therefore there's no need to specify them\n" "when constructing this class. The following example sets the graph value\n" "to 0.5::\n" "\n" " from gpiozero import PiLiterBarGraph\n" "\n" " graph = PiLiterBarGraph()\n" " graph.value = 0.5\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances for each pin. If\n" " ``False`` (the default), construct regular :class:`LED` instances.\n" "\n" ":param float initial_value:\n" " The initial :attr:`value` of the graph given as a float between -1 and\n" " +1. Defaults to ``0.0``.\n" "\n" ".. _Ciseco Pi-LITEr: http://shop.ciseco.co.uk/pi-liter-8-led-strip-for-the-" "raspberry-pi/" msgstr "" #: mu/modes/api/pi.py:89 msgid "" "gpiozero.PiTraffic(*args, **kwargs) \n" "Extends :class:`TrafficLights` for the `Low Voltage Labs PI-TRAFFIC`_:\n" "vertical traffic lights board when attached to GPIO pins 9, 10, and 11.\n" "\n" "There's no need to specify the pins if the PI-TRAFFIC is connected to the\n" "default pins (9, 10, 11). The following example turns on the amber LED on\n" "the PI-TRAFFIC::\n" "\n" " from gpiozero import PiTraffic\n" "\n" " traffic = PiTraffic()\n" " traffic.amber.on()\n" "\n" "To use the PI-TRAFFIC board when attached to a non-standard set of pins,\n" "simply use the parent class, :class:`TrafficLights`.\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances to represent each\n" " LED. If ``False`` (the default), construct regular :class:`LED`\n" " instances.\n" "\n" ":param bool initial_value:\n" " If ``False`` (the default), all LEDs will be off initially. If\n" " ``None``, each device will be left in whatever state the pin is found\n" " in when configured for output (warning: this can be on). If ``True``,\n" " the device will be switched on initially.\n" "\n" ".. _Low Voltage Labs PI-TRAFFIC: http://lowvoltagelabs.com/products/pi-" "traffic/" msgstr "" #: mu/modes/api/pi.py:90 msgid "" "gpiozero.Pin() \n" "Abstract base class representing a GPIO pin or a pin from an IO extender.\n" "\n" "Descendents should override property getters and setters to accurately\n" "represent the capabilities of pins. The following functions *must* be\n" "overridden:\n" "\n" "* :meth:`_get_function`\n" "* :meth:`_set_function`\n" "* :meth:`_get_state`\n" "\n" "The following functions *may* be overridden if applicable:\n" "\n" "* :meth:`close`\n" "* :meth:`_set_state`\n" "* :meth:`_get_frequency`\n" "* :meth:`_set_frequency`\n" "* :meth:`_get_pull`\n" "* :meth:`_set_pull`\n" "* :meth:`_get_bounce`\n" "* :meth:`_set_bounce`\n" "* :meth:`_get_edges`\n" "* :meth:`_set_edges`\n" "* :meth:`_get_when_changed`\n" "* :meth:`_set_when_changed`\n" "* :meth:`pi_info`\n" "* :meth:`output_with_state`\n" "* :meth:`input_with_pull`\n" "\n" ".. warning::\n" "\n" " Descendents must ensure that pin instances representing the same\n" " physical hardware are identical, right down to object identity. The\n" " framework relies on this to correctly clean up resources at interpreter\n" " shutdown." msgstr "" #: mu/modes/api/pi.py:91 msgid "" "gpiozero.PinEdgeDetectUnsupported() \n" "Error raised when attempting to use edge detection on unsupported pins" msgstr "" #: mu/modes/api/pi.py:92 msgid "" "gpiozero.PinError() \n" "Base class for errors related to pin implementations" msgstr "" #: mu/modes/api/pi.py:93 msgid "" "gpiozero.PinFixedPull() \n" "Error raised when attempting to set the pull of a pin with fixed pull-up" msgstr "" #: mu/modes/api/pi.py:94 msgid "" "gpiozero.PinInfo(number, function, pull_up) \n" "This class is a :func:`~collections.namedtuple` derivative used to\n" "represent information about a pin present on a GPIO header. The following\n" "attributes are defined:\n" "\n" ".. attribute:: number\n" "\n" " An integer containing the physical pin number on the header (starting\n" " from 1 in accordance with convention).\n" "\n" ".. attribute:: function\n" "\n" " A string describing the function of the pin. Some common examples\n" " include \"GND\" (for pins connecting to ground), \"3V3\" (for pins " "which\n" " output 3.3 volts), \"GPIO9\" (for GPIO9 in the Broadcom numbering\n" " scheme), etc.\n" "\n" ".. attribute:: pull_up\n" "\n" " A bool indicating whether the pin has a physical pull-up resistor\n" " permanently attached (this is usually ``False`` but GPIO2 and GPIO3\n" " are *usually* ``True``). This is used internally by gpiozero to raise\n" " errors when pull-down is requested on a pin with a physical pull-up\n" " resistor." msgstr "" #: mu/modes/api/pi.py:95 msgid "" "gpiozero.PinInvalidEdges() \n" "Error raised when attempting to assign an invalid edge detection to a pin" msgstr "" #: mu/modes/api/pi.py:96 msgid "" "gpiozero.PinInvalidFunction() \n" "Error raised when attempting to change the function of a pin to an invalid " "value" msgstr "" #: mu/modes/api/pi.py:97 msgid "" "gpiozero.PinInvalidPull() \n" "Error raised when attempting to assign an invalid pull-up to a pin" msgstr "" #: mu/modes/api/pi.py:98 msgid "" "gpiozero.PinInvalidState() \n" "Error raised when attempting to assign an invalid state to a pin" msgstr "" #: mu/modes/api/pi.py:99 msgid "" "gpiozero.PinMultiplePins() \n" "Error raised when multiple pins support the requested function" msgstr "" #: mu/modes/api/pi.py:100 msgid "" "gpiozero.PinNoPins() \n" "Error raised when no pins support the requested function" msgstr "" #: mu/modes/api/pi.py:101 msgid "" "gpiozero.PinNonPhysical() \n" "Warning raised when a non-physical pin is specified in a constructor" msgstr "" #: mu/modes/api/pi.py:102 msgid "" "gpiozero.PinPWMError() \n" "Base class for errors related to PWM implementations" msgstr "" #: mu/modes/api/pi.py:103 msgid "" "gpiozero.PinPWMFixedValue() \n" "Error raised when attempting to initialize PWM on an input pin" msgstr "" #: mu/modes/api/pi.py:104 msgid "" "gpiozero.PinPWMUnsupported() \n" "Error raised when attempting to activate PWM on unsupported pins" msgstr "" #: mu/modes/api/pi.py:105 msgid "" "gpiozero.PinSetInput() \n" "Error raised when attempting to set a read-only pin" msgstr "" #: mu/modes/api/pi.py:106 msgid "" "gpiozero.PinUnknownPi() \n" "Error raised when gpiozero doesn't recognize a revision of the Pi" msgstr "" #: mu/modes/api/pi.py:107 msgid "" "gpiozero.PinWarning() \n" "Base class for warnings related to pin implementations" msgstr "" #: mu/modes/api/pi.py:108 msgid "" "gpiozero.PingServer(*args, **kwargs) \n" "Extends :class:`InternalDevice` to provide a device which is active when a\n" "*host* on the network can be pinged.\n" "\n" "The following example lights an LED while a server is reachable (note the\n" "use of :attr:`~SourceMixin.source_delay` to ensure the server is not\n" "flooded with pings)::\n" "\n" " from gpiozero import PingServer, LED\n" " from signal import pause\n" "\n" " server = PingServer('my-server')\n" " led = LED(4)\n" " led.source_delay = 1\n" " led.source = server.values\n" " pause()\n" "\n" ":param str host:\n" " The hostname or IP address to attempt to ping." msgstr "" #: mu/modes/api/pi.py:109 msgid "" "gpiozero.RGBLED(*args, **kwargs) \n" "Extends :class:`Device` and represents a full color LED component (composed\n" "of red, green, and blue LEDs).\n" "\n" "Connect the common cathode (longest leg) to a ground pin; connect each of\n" "the other legs (representing the red, green, and blue anodes) to any GPIO\n" "pins. You can either use three limiting resistors (one per anode) or a\n" "single limiting resistor on the cathode.\n" "\n" "The following code will make the LED purple::\n" "\n" " from gpiozero import RGBLED\n" "\n" " led = RGBLED(2, 3, 4)\n" " led.color = (1, 0, 1)\n" "\n" ":param int red:\n" " The GPIO pin that controls the red component of the RGB LED.\n" "\n" ":param int green:\n" " The GPIO pin that controls the green component of the RGB LED.\n" "\n" ":param int blue:\n" " The GPIO pin that controls the blue component of the RGB LED.\n" "\n" ":param bool active_high:\n" " Set to ``True`` (the default) for common cathode RGB LEDs. If you are\n" " using a common anode RGB LED, set this to ``False``.\n" "\n" ":param tuple initial_value:\n" " The initial color for the RGB LED. Defaults to black ``(0, 0, 0)``.\n" "\n" ":param bool pwm:\n" " If ``True`` (the default), construct :class:`PWMLED` instances for\n" " each component of the RGBLED. If ``False``, construct regular\n" " :class:`LED` instances, which prevents smooth color graduations." msgstr "" #: mu/modes/api/pi.py:110 msgid "" "gpiozero.Robot(*args, **kwargs) \n" "Extends :class:`CompositeDevice` to represent a generic dual-motor robot.\n" "\n" "This class is constructed with two tuples representing the forward and\n" "backward pins of the left and right controllers respectively. For example,\n" "if the left motor's controller is connected to GPIOs 4 and 14, while the\n" "right motor's controller is connected to GPIOs 17 and 18 then the following\n" "example will drive the robot forward::\n" "\n" " from gpiozero import Robot\n" "\n" " robot = Robot(left=(4, 14), right=(17, 18))\n" " robot.forward()\n" "\n" ":param tuple left:\n" " A tuple of two GPIO pins representing the forward and backward inputs\n" " of the left motor's controller.\n" "\n" ":param tuple right:\n" " A tuple of two GPIO pins representing the forward and backward inputs\n" " of the right motor's controller." msgstr "" #: mu/modes/api/pi.py:111 msgid "" "gpiozero.RyanteckRobot(*args, **kwargs) \n" "Extends :class:`Robot` for the `Ryanteck MCB`_ robot.\n" "\n" "The Ryanteck MCB pins are fixed and therefore there's no need to specify\n" "them when constructing this class. The following example drives the robot\n" "forward::\n" "\n" " from gpiozero import RyanteckRobot\n" "\n" " robot = RyanteckRobot()\n" " robot.forward()\n" "\n" ".. _Ryanteck MCB: https://ryanteck.uk/add-ons/6-ryanteck-rpi-motor-" "controller-board-0635648607160.html" msgstr "" #: mu/modes/api/pi.py:112 msgid "" "gpiozero.SPIBadArgs() \n" "Error raised when invalid arguments are given while constructing :class:" "`SPIDevice`" msgstr "" #: mu/modes/api/pi.py:113 msgid "" "gpiozero.SPIDevice(*args, **kwargs) \n" "Extends :class:`Device`. Represents a device that communicates via the SPI\n" "protocol.\n" "\n" "See :ref:`spi_args` for information on the keyword arguments that can be\n" "specified with the constructor." msgstr "" #: mu/modes/api/pi.py:114 msgid "" "gpiozero.SPIError() \n" "Base class for errors related to the SPI implementation" msgstr "" #: mu/modes/api/pi.py:115 msgid "" "gpiozero.SPISoftwareFallback() \n" "Warning raised when falling back to the software implementation" msgstr "" #: mu/modes/api/pi.py:116 msgid "" "gpiozero.SPIWarning() \n" "Base class for warnings related to the SPI implementation" msgstr "" #: mu/modes/api/pi.py:117 msgid "" "gpiozero.Servo(*args, **kwargs) \n" "Extends :class:`CompositeDevice` and represents a PWM-controlled servo\n" "motor connected to a GPIO pin.\n" "\n" "Connect a power source (e.g. a battery pack or the 5V pin) to the power\n" "cable of the servo (this is typically colored red); connect the ground\n" "cable of the servo (typically colored black or brown) to the negative of\n" "your battery pack, or a GND pin; connect the final cable (typically colored\n" "white or orange) to the GPIO pin you wish to use for controlling the servo.\n" "\n" "The following code will make the servo move between its minimum, maximum,\n" "and mid-point positions with a pause between each::\n" "\n" " from gpiozero import Servo\n" " from time import sleep\n" "\n" " servo = Servo(17)\n" " while True:\n" " servo.min()\n" " sleep(1)\n" " servo.mid()\n" " sleep(1)\n" " servo.max()\n" " sleep(1)\n" "\n" ":param int pin:\n" " The GPIO pin which the device is attached to. See :ref:`pin_numbering`\n" " for valid pin numbers.\n" "\n" ":param float initial_value:\n" " If ``0`` (the default), the device's mid-point will be set\n" " initially. Other values between -1 and +1 can be specified as an\n" " initial position. ``None`` means to start the servo un-controlled (see\n" " :attr:`value`).\n" "\n" ":param float min_pulse_width:\n" " The pulse width corresponding to the servo's minimum position. This\n" " defaults to 1ms.\n" "\n" ":param float max_pulse_width:\n" " The pulse width corresponding to the servo's maximum position. This\n" " defaults to 2ms.\n" "\n" ":param float frame_width:\n" " The length of time between servo control pulses measured in seconds.\n" " This defaults to 20ms which is a common value for servos." msgstr "" #: mu/modes/api/pi.py:118 msgid "" "gpiozero.SharedMixin() \n" "This mixin marks a class as \"shared\". In this case, the meta-class\n" "(GPIOMeta) will use :meth:`_shared_key` to convert the constructor\n" "arguments to an immutable key, and will check whether any existing\n" "instances match that key. If they do, they will be returned by the\n" "constructor instead of a new instance. An internal reference counter is\n" "used to determine how many times an instance has been \"constructed\" in " "this\n" "way.\n" "\n" "When :meth:`close` is called, an internal reference counter will be\n" "decremented and the instance will only close when it reaches zero." msgstr "" #: mu/modes/api/pi.py:119 msgid "" "gpiozero.SmoothedInputDevice(*args, **kwargs) \n" "Represents a generic input device which takes its value from the mean of a\n" "queue of historical values.\n" "\n" "This class extends :class:`InputDevice` with a queue which is filled by a\n" "background thread which continually polls the state of the underlying\n" "device. The mean of the values in the queue is compared to a threshold\n" "which is used to determine the state of the :attr:`is_active` property.\n" "\n" ".. note::\n" "\n" " The background queue is not automatically started upon construction.\n" " This is to allow descendents to set up additional components before the\n" " queue starts reading values. Effectively this is an abstract base\n" " class.\n" "\n" "This class is intended for use with devices which either exhibit analog\n" "behaviour (such as the charging time of a capacitor with an LDR), or those\n" "which exhibit \"twitchy\" behaviour (such as certain motion sensors).\n" "\n" ":param float threshold:\n" " The value above which the device will be considered \"on\".\n" "\n" ":param int queue_len:\n" " The length of the internal queue which is filled by the background\n" " thread.\n" "\n" ":param float sample_wait:\n" " The length of time to wait between retrieving the state of the\n" " underlying device. Defaults to 0.0 indicating that values are retrieved\n" " as fast as possible.\n" "\n" ":param bool partial:\n" " If ``False`` (the default), attempts to read the state of the device\n" " (from the :attr:`is_active` property) will block until the queue has\n" " filled. If ``True``, a value will be returned immediately, but be\n" " aware that this value is likely to fluctuate excessively." msgstr "" #: mu/modes/api/pi.py:120 msgid "" "gpiozero.SnowPi(*args, **kwargs) \n" "Extends :class:`LEDBoard` for the `Ryanteck SnowPi`_ board.\n" "\n" "The SnowPi pins are fixed and therefore there's no need to specify them\n" "when constructing this class. The following example turns on the eyes, sets\n" "the nose pulsing, and the arms blinking::\n" "\n" " from gpiozero import SnowPi\n" "\n" " snowman = SnowPi(pwm=True)\n" " snowman.eyes.on()\n" " snowman.nose.pulse()\n" " snowman.arms.blink()\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances to represent each\n" " LED. If ``False`` (the default), construct regular :class:`LED`\n" " instances.\n" "\n" ":param bool initial_value:\n" " If ``False`` (the default), all LEDs will be off initially. If\n" " ``None``, each device will be left in whatever state the pin is found\n" " in when configured for output (warning: this can be on). If ``True``,\n" " the device will be switched on initially.\n" "\n" ".. _Ryanteck SnowPi: https://ryanteck.uk/raspberry-pi/114-snowpi-the-gpio-" "snowman-for-raspberry-pi-0635648608303.html" msgstr "" #: mu/modes/api/pi.py:121 msgid "" "gpiozero.SourceMixin(*args, **kwargs) \n" "Adds a :attr:`source` property to the class which, given an iterable, sets\n" ":attr:`value` to each member of that iterable until it is exhausted. This\n" "mixin is generally included in novel output devices to allow their state to\n" "be driven from another device.\n" "\n" ".. note::\n" "\n" " Use this mixin *first* in the parent class list." msgstr "" #: mu/modes/api/pi.py:122 msgid "" "gpiozero.TimeOfDay(*args, **kwargs) \n" "Extends :class:`InternalDevice` to provide a device which is active when\n" "the computer's clock indicates that the current time is between\n" "*start_time* and *end_time* (inclusive) which are :class:`~datetime.time`\n" "instances.\n" "\n" "The following example turns on a lamp attached to an :class:`Energenie`\n" "plug between 7 and 8 AM::\n" "\n" " from datetime import time\n" " from gpiozero import TimeOfDay, Energenie\n" " from signal import pause\n" "\n" " lamp = Energenie(0)\n" " morning = TimeOfDay(time(7), time(8))\n" " morning.when_activated = lamp.on\n" " morning.when_deactivated = lamp.off\n" " pause()\n" "\n" ":param ~datetime.time start_time:\n" " The time from which the device will be considered active.\n" "\n" ":param ~datetime.time end_time:\n" " The time after which the device will be considered inactive.\n" "\n" ":param bool utc:\n" " If ``True`` (the default), a naive UTC time will be used for the\n" " comparison rather than a local time-zone reading." msgstr "" #: mu/modes/api/pi.py:123 msgid "" "gpiozero.TrafficHat(*args, **kwargs) \n" "Extends :class:`TrafficLightsBuzzer` for the `Ryanteck Traffic HAT`_: " "traffic\n" "light LEDs, a button and a buzzer.\n" "\n" "The Traffic HAT pins are fixed and therefore there's no need to specify\n" "them when constructing this class. The following example waits for the\n" "button to be pressed on the Traffic HAT, then turns on all the LEDs::\n" "\n" " from gpiozero import TrafficHat\n" "\n" " hat = TrafficHat()\n" " hat.button.wait_for_press()\n" " hat.lights.on()\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances to represent each\n" " LED. If ``False`` (the default), construct regular :class:`LED`\n" " instances.\n" "\n" ".. _Ryanteck Traffic HAT: https://ryanteck.uk/hats/1-" "traffichat-0635648607122.html" msgstr "" #: mu/modes/api/pi.py:124 msgid "" "gpiozero.TrafficLights(*args, **kwargs) \n" "Extends :class:`LEDBoard` for devices containing red, yellow, and green\n" "LEDs.\n" "\n" "The following example initializes a device connected to GPIO pins 2, 3,\n" "and 4, then lights the amber (yellow) LED attached to GPIO 3::\n" "\n" " from gpiozero import TrafficLights\n" "\n" " traffic = TrafficLights(2, 3, 4)\n" " traffic.amber.on()\n" "\n" ":param int red:\n" " The GPIO pin that the red LED is attached to.\n" "\n" ":param int amber:\n" " The GPIO pin that the amber LED is attached to.\n" "\n" ":param int green:\n" " The GPIO pin that the green LED is attached to.\n" "\n" ":param bool pwm:\n" " If ``True``, construct :class:`PWMLED` instances to represent each\n" " LED. If ``False`` (the default), construct regular :class:`LED`\n" " instances.\n" "\n" ":param bool initial_value:\n" " If ``False`` (the default), all LEDs will be off initially. If\n" " ``None``, each device will be left in whatever state the pin is found\n" " in when configured for output (warning: this can be on). If ``True``,\n" " the device will be switched on initially.\n" "\n" ":param int yellow:\n" " The GPIO pin that the yellow LED is attached to. This is merely an\n" " alias for the ``amber`` parameter - you can't specify both ``amber``\n" " and ``yellow``." msgstr "" #: mu/modes/api/pi.py:125 msgid "" "gpiozero.TrafficLightsBuzzer(*args, **kwargs) \n" "Extends :class:`CompositeOutputDevice` and is a generic class for HATs with\n" "traffic lights, a button and a buzzer.\n" "\n" ":param TrafficLights lights:\n" " An instance of :class:`TrafficLights` representing the traffic lights\n" " of the HAT.\n" "\n" ":param Buzzer buzzer:\n" " An instance of :class:`Buzzer` representing the buzzer on the HAT.\n" "\n" ":param Button button:\n" " An instance of :class:`Button` representing the button on the HAT." msgstr "" #: mu/modes/api/pi.py:126 msgid "" "gpiozero.ValuesMixin() \n" "Adds a :attr:`values` property to the class which returns an infinite\n" "generator of readings from the :attr:`value` property. There is rarely a\n" "need to use this mixin directly as all base classes in GPIO Zero include\n" "it.\n" "\n" ".. note::\n" "\n" " Use this mixin *first* in the parent class list." msgstr "" #: mu/modes/api/pi.py:127 msgid "" "gpiozero.pi_info(revision=None) \n" "Returns a :class:`PiBoardInfo` instance containing information about a\n" "*revision* of the Raspberry Pi.\n" "\n" ":param str revision:\n" " The revision of the Pi to return information about. If this is omitted\n" " or ``None`` (the default), then the library will attempt to determine\n" " the model of Pi it is running on and return information about that." msgstr "" #: mu/modes/api/pi.py:128 msgid "" "picamera.Blue() \n" "Represents the blue component of a :class:`Color` for use in\n" "transformations. Instances of this class can be constructed directly with\n" "a float value, or by querying the :attr:`Color.blue` attribute. Addition,\n" "subtraction, and multiplication are supported with :class:`Color`\n" "instances. For example::\n" "\n" " >>> Color(0, 0, 0) + Blue(0.2)\n" " \n" " >>> Color.from_hls(0.5, 0.5, 1.0) - Blue(1)\n" " \n" " >>> Blue(0.9) * Color('white')\n" " " msgstr "" #: mu/modes/api/pi.py:129 msgid "" "picamera.BufferIO(obj) \n" "A stream which uses a :class:`memoryview` for storage.\n" "\n" "This is used internally by picamera for capturing directly to an existing\n" "object which supports the buffer protocol (like a numpy array). Because the\n" "underlying storage is fixed in size, the stream also has a fixed size and\n" "will raise an :exc:`IOError` exception if an attempt is made to write\n" "beyond the end of the buffer (though seek beyond the end is supported).\n" "\n" "Users should never need this class directly." msgstr "" #: mu/modes/api/pi.py:130 msgid "" "picamera.CircularIO(size) \n" "A thread-safe stream which uses a ring buffer for storage.\n" "\n" "CircularIO provides an in-memory stream similar to the :class:`io.BytesIO`\n" "class. However, unlike :class:`io.BytesIO` its underlying storage is a\n" "`ring buffer`_ with a fixed maximum size. Once the maximum size is reached,\n" "writing effectively loops round to the beginning to the ring and starts\n" "overwriting the oldest content.\n" "\n" "The *size* parameter specifies the maximum size of the stream in bytes. The\n" ":meth:`read`, :meth:`tell`, and :meth:`seek` methods all operate\n" "equivalently to those in :class:`io.BytesIO` whilst :meth:`write` only\n" "differs in the wrapping behaviour described above. A :meth:`read1` method\n" "is also provided for efficient reading of the underlying ring buffer in\n" "write-sized chunks (or less).\n" "\n" "A re-entrant threading lock guards all operations, and is accessible for\n" "external use via the :attr:`lock` attribute.\n" "\n" "The performance of the class is geared toward faster writing than reading\n" "on the assumption that writing will be the common operation and reading the\n" "rare operation (a reasonable assumption for the camera use-case, but not\n" "necessarily for more general usage).\n" "\n" ".. _ring buffer: https://en.wikipedia.org/wiki/Circular_buffer" msgstr "" #: mu/modes/api/pi.py:131 msgid "" "picamera.Color(*args, **kwargs) \n" "The Color class is a tuple which represents a color as red, green, and\n" "blue components.\n" "\n" "The class has a flexible constructor which allows you to create an instance\n" "from a variety of color systems including `RGB`_, `Y'UV`_, `Y'IQ`_, `HLS`_,\n" "and `HSV`_. There are also explicit constructors for each of these systems\n" "to allow you to force the use of a system in your code. For example, an\n" "instance of :class:`Color` can be constructed in any of the following\n" "ways::\n" "\n" " >>> Color('#f00')\n" " \n" " >>> Color('green')\n" " \n" " >>> Color(0, 0, 1)\n" " \n" " >>> Color(hue=0, saturation=1, value=0.5)\n" " \n" " >>> Color(y=0.4, u=-0.05, v=0.615)\n" " \n" "\n" "The specific forms that the default constructor will accept are enumerated\n" "below:\n" "\n" ".. tabularcolumns:: |p{40mm}|p{100mm}|\n" "\n" "+------------------------------+------------------------------------------+\n" "| Style | Description |\n" "+==============================+==========================================+\n" "| Single positional parameter | Equivalent to calling |\n" "| | :meth:`Color.from_string`. |\n" "+------------------------------+------------------------------------------+\n" "| Three positional parameters | Equivalent to calling |\n" "| | :meth:`Color.from_rgb` if all three |\n" "| | parameters are between 0.0 and 1.0, or |\n" "| | :meth:`Color.from_rgb_bytes` otherwise. |\n" "+------------------------------+ |\n" "| Three named parameters: | |\n" "| *r*, *g*, *b* | |\n" "+------------------------------+ |\n" "| Three named parameters: | |\n" "| *red*, *green*, *blue* | |\n" "+------------------------------+------------------------------------------+\n" "| Three named parameters: | Equivalent to calling |\n" "| *y*, *u*, *v* | :meth:`Color.from_yuv` if *y* is between |\n" "| | 0.0 and 1.0, *u* is between -0.436 and |\n" "| | 0.436, and *v* is between -0.615 and |\n" "| | 0.615, or :meth:`Color.from_yuv_bytes` |\n" "| | otherwise. |\n" "+------------------------------+------------------------------------------+\n" "| Three named parameters: | Equivalent to calling |\n" "| *y*, *i*, *q* | :meth:`Color.from_yiq`. |\n" "+------------------------------+------------------------------------------+\n" "| Three named parameters: | Equivalent to calling |\n" "| *h*, *l*, *s* | :meth:`Color.from_hls`. |\n" "+------------------------------+ |\n" "| Three named parameters: | |\n" "| *hue*, *lightness*, | |\n" "| *saturation* | |\n" "+------------------------------+------------------------------------------+\n" "| Three named parameters: | Equivalent to calling |\n" "| *h*, *s*, *v* | :meth:`Color.from_hsv` |\n" "+------------------------------+ |\n" "| Three named parameters: | |\n" "| *hue*, *saturation*, *value* | |\n" "+------------------------------+------------------------------------------+\n" "| Three named parameters: | Equivalent to calling |\n" "| *x*, *y*, *z* | :meth:`Color.from_cie_xyz` |\n" "+------------------------------+------------------------------------------+\n" "| Three named parameters: | Equivalent to calling |\n" "| *l*, *a*, *b* | :meth:`Color.from_cie_lab` |\n" "+------------------------------+------------------------------------------+\n" "| Three named parameters: | Equivalent to calling |\n" "| *l*, *u*, *v* | :meth:`Color.from_cie_luv` |\n" "+------------------------------+------------------------------------------+\n" "\n" "If the constructor parameters do not conform to any of the variants in the\n" "table above, a :exc:`ValueError` will be thrown.\n" "\n" "Internally, the color is *always* represented as 3 float values\n" "corresponding to the red, green, and blue components of the color. These\n" "values take a value from 0.0 to 1.0 (least to full intensity). The class\n" "provides several attributes which can be used to convert one color system\n" "into another::\n" "\n" " >>> Color('#f00').hls\n" " (0.0, 0.5, 1.0)\n" " >>> Color.from_string('green').hue\n" " Hue(deg=120.0)\n" " >>> Color.from_rgb_bytes(0, 0, 255).yuv\n" " (0.114, 0.435912, -0.099978)\n" "\n" "As :class:`Color` derives from tuple, instances are immutable. While this\n" "provides the advantage that they can be used as keys in a dict, it does\n" "mean that colors themselves cannot be directly manipulated (e.g. by\n" "reducing the red component).\n" "\n" "However, several auxilliary classes in the module provide the ability to\n" "perform simple transformations of colors via operators which produce a new\n" ":class:`Color` instance. For example::\n" "\n" " >>> Color('red') - Red(0.5)\n" " \n" " >>> Color('green') + Red(0.5)\n" " \n" " >>> Color.from_hls(0.5, 0.5, 1.0)\n" " \n" " >>> Color.from_hls(0.5, 0.5, 1.0) * Lightness(0.8)\n" " \n" " >>> (Color.from_hls(0.5, 0.5, 1.0) * Lightness(0.8)).hls\n" " (0.5, 0.4, 1.0)\n" "\n" "From the last example above one can see that even attributes not directly\n" "stored by the color (such as lightness) can be manipulated in this fashion.\n" "In this case a :class:`Color` instance is constructed from HLS (hue,\n" "lightness, saturation) values with a lightness of 0.5. This is multiplied\n" "by a :class:`Lightness` instance with a value of 0.8 which constructs a new\n" ":class:`Color` with the same hue and saturation, but a lightness of 0.5 *\n" "0.8 = 0.4.\n" "\n" "If an instance is converted to a string (with :func:`str`) it will return a\n" "string containing the 7-character HTML code for the color (e.g. \"#ff0000\"\n" "for red). As can be seen in the examples above, a similar representation is\n" "returned for :func:`repr`.\n" "\n" ".. _RGB: https://en.wikipedia.org/wiki/RGB_color_space\n" ".. _Y'UV: https://en.wikipedia.org/wiki/YUV\n" ".. _Y'IQ: https://en.wikipedia.org/wiki/YIQ\n" ".. _HLS: https://en.wikipedia.org/wiki/HSL_and_HSV\n" ".. _HSV: https://en.wikipedia.org/wiki/HSL_and_HSV" msgstr "" #: mu/modes/api/pi.py:132 msgid "" "picamera.Green() \n" "Represents the green component of a :class:`Color` for use in\n" "transformations. Instances of this class can be constructed directly with\n" "a float value, or by querying the :attr:`Color.green` attribute. Addition,\n" "subtraction, and multiplication are supported with :class:`Color`\n" "instances. For example::\n" "\n" " >>> Color(0, 0, 0) + Green(0.1)\n" " \n" " >>> Color.from_yuv(1, -0.4, -0.6) - Green(1)\n" " \n" " >>> (Green(0.5) * Color('white')).rgb\n" " (Red(1.0), Green(0.5), Blue(1.0))" msgstr "" #: mu/modes/api/pi.py:133 msgid "" "picamera.Hue(n=None, deg=None, rad=None) \n" "Represents the hue of a :class:`Color` for use in transformations.\n" "Instances of this class can be constructed directly with a float value in\n" "the range [0.0, 1.0) representing an angle around the `HSL hue wheel`_. As\n" "this is a circular mapping, 0.0 and 1.0 effectively mean the same thing,\n" "i.e. out of range values will be normalized into the range [0.0, 1.0).\n" "\n" "The class can also be constructed with the keyword arguments ``deg`` or\n" "``rad`` if you wish to specify the hue value in degrees or radians instead,\n" "respectively. Instances can also be constructed by querying the\n" ":attr:`Color.hue` attribute.\n" "\n" "Addition, subtraction, and multiplication are supported with :class:`Color`\n" "instances. For example::\n" "\n" " >>> Color(1, 0, 0).hls\n" " (0.0, 0.5, 1.0)\n" " >>> (Color(1, 0, 0) + Hue(deg=180)).hls\n" " (0.5, 0.5, 1.0)\n" "\n" "Note that whilst multiplication by a :class:`Hue` doesn't make much sense,\n" "it is still supported. However, the circular nature of a hue value can lead\n" "to suprising effects. In particular, since 1.0 is equivalent to 0.0 the\n" "following may be observed::\n" "\n" " >>> (Hue(1.0) * Color.from_hls(0.5, 0.5, 1.0)).hls\n" " (0.0, 0.5, 1.0)\n" "\n" ".. _HSL hue wheel: https://en.wikipedia.org/wiki/Hue" msgstr "" #: mu/modes/api/pi.py:134 msgid "" "picamera.Lightness() \n" "Represents the lightness of a :class:`Color` for use in transformations.\n" "Instances of this class can be constructed directly with a float value, or\n" "by querying the :attr:`Color.lightness` attribute. Addition, subtraction,\n" "and multiplication are supported with :class:`Color` instances. For\n" "example::\n" "\n" " >>> Color(0, 0, 0) + Lightness(0.1)\n" " \n" " >>> Color.from_rgb_bytes(0x80, 0x80, 0) - Lightness(0.2)\n" " \n" " >>> Lightness(0.9) * Color('wheat')\n" " " msgstr "" #: mu/modes/api/pi.py:135 msgid "" "picamera.PiCamera(camera_num=0, stereo_mode='none', stereo_decimate=False, " "resolution=None, framerate=None, sensor_mode=0, led_pin=None, " "clock_mode='reset', framerate_range=None) \n" "Provides a pure Python interface to the Raspberry Pi's camera module.\n" "\n" "Upon construction, this class initializes the camera. The *camera_num*\n" "parameter (which defaults to 0) selects the camera module that the instance\n" "will represent. Only the Raspberry Pi compute module currently supports\n" "more than one camera.\n" "\n" "The *sensor_mode*, *resolution*, *framerate*, *framerate_range*, and\n" "*clock_mode* parameters provide initial values for the :attr:`sensor_mode`,\n" ":attr:`resolution`, :attr:`framerate`, :attr:`framerate_range`, and\n" ":attr:`clock_mode` attributes of the class (these attributes are all\n" "relatively expensive to set individually, hence setting them all upon\n" "construction is a speed optimization). Please refer to the attribute\n" "documentation for more information and default values.\n" "\n" "The *stereo_mode* and *stereo_decimate* parameters configure dual cameras\n" "on a compute module for sterescopic mode. These parameters can only be set\n" "at construction time; they cannot be altered later without closing the\n" ":class:`PiCamera` instance and recreating it. The *stereo_mode* parameter\n" "defaults to ``'none'`` (no stereoscopic mode) but can be set to\n" "``'side-by-side'`` or ``'top-bottom'`` to activate a stereoscopic mode. If\n" "the *stereo_decimate* parameter is ``True``, the resolution of the two\n" "cameras will be halved so that the resulting image has the same dimensions\n" "as if stereoscopic mode were not being used.\n" "\n" "The *led_pin* parameter can be used to specify the GPIO pin which should be\n" "used to control the camera's LED via the :attr:`led` attribute. If this is\n" "not specified, it should default to the correct value for your Pi platform.\n" "You should only need to specify this parameter if you are using a custom\n" "DeviceTree blob (this is only typical on the `Compute Module`_ platform).\n" "\n" "No preview or recording is started automatically upon construction. Use\n" "the :meth:`capture` method to capture images, the :meth:`start_recording`\n" "method to begin recording video, or the :meth:`start_preview` method to\n" "start live display of the camera's input.\n" "\n" "Several attributes are provided to adjust the camera's configuration. Some\n" "of these can be adjusted while a recording is running, like\n" ":attr:`brightness`. Others, like :attr:`resolution`, can only be adjusted\n" "when the camera is idle.\n" "\n" "When you are finished with the camera, you should ensure you call the\n" ":meth:`close` method to release the camera resources::\n" "\n" " camera = PiCamera()\n" " try:\n" " # do something with the camera\n" " pass\n" " finally:\n" " camera.close()\n" "\n" "The class supports the context manager protocol to make this particularly\n" "easy (upon exiting the :keyword:`with` statement, the :meth:`close` method\n" "is automatically called)::\n" "\n" " with PiCamera() as camera:\n" " # do something with the camera\n" " pass\n" "\n" ".. versionchanged:: 1.8\n" " Added *stereo_mode* and *stereo_decimate* parameters.\n" "\n" ".. versionchanged:: 1.9\n" " Added *resolution*, *framerate*, and *sensor_mode* parameters.\n" "\n" ".. versionchanged:: 1.10\n" " Added *led_pin* parameter.\n" "\n" ".. versionchanged:: 1.11\n" " Added *clock_mode* parameter, and permitted setting of resolution as\n" " appropriately formatted string.\n" "\n" ".. versionchanged:: 1.13\n" " Added *framerate_range* parameter.\n" "\n" ".. _Compute Module: https://www.raspberrypi.org/documentation/hardware/" "computemodule/cmio-camera.md" msgstr "" #: mu/modes/api/pi.py:136 msgid "" "picamera.PiCameraAlphaStripping() \n" "Raised when picamera does alpha-byte stripping." msgstr "" #: mu/modes/api/pi.py:137 msgid "" "picamera.PiCameraAlreadyRecording() \n" "Raised when :meth:`~PiCamera.start_recording` or\n" ":meth:`~PiCamera.record_sequence` are called against a port which already\n" "has an active recording." msgstr "" #: mu/modes/api/pi.py:138 msgid "" "picamera.PiCameraCircularIO(camera, size=None, seconds=None, " "bitrate=17000000, splitter_port=1) \n" "A derivative of :class:`CircularIO` which tracks camera frames.\n" "\n" "PiCameraCircularIO provides an in-memory stream based on a ring buffer. It\n" "is a specialization of :class:`CircularIO` which associates video frame\n" "meta-data with the recorded stream, accessible from the :attr:`frames`\n" "property.\n" "\n" ".. warning::\n" "\n" " The class makes a couple of assumptions which will cause the frame\n" " meta-data tracking to break if they are not adhered to:\n" "\n" " * the stream is only ever appended to - no writes ever start from\n" " the middle of the stream\n" "\n" " * the stream is never truncated (from the right; being ring buffer\n" " based, left truncation will occur automatically); the exception\n" " to this is the :meth:`clear` method.\n" "\n" "The *camera* parameter specifies the :class:`PiCamera` instance that will\n" "be recording video to the stream. If specified, the *size* parameter\n" "determines the maximum size of the stream in bytes. If *size* is not\n" "specified (or ``None``), then *seconds* must be specified instead. This\n" "provides the maximum length of the stream in seconds, assuming a data rate\n" "in bits-per-second given by the *bitrate* parameter (which defaults to\n" "``17000000``, or 17Mbps, which is also the default bitrate used for video\n" "recording by :class:`PiCamera`). You cannot specify both *size* and\n" "*seconds*.\n" "\n" "The *splitter_port* parameter specifies the port of the built-in splitter\n" "that the video encoder will be attached to. This defaults to ``1`` and most\n" "users will have no need to specify anything different. If you do specify\n" "something else, ensure it is equal to the *splitter_port* parameter of the\n" "corresponding call to :meth:`~PiCamera.start_recording`. For example::\n" "\n" " import picamera\n" "\n" " with picamera.PiCamera() as camera:\n" " with picamera.PiCameraCircularIO(camera, splitter_port=2) as " "stream:\n" " camera.start_recording(stream, format='h264', splitter_port=2)\n" " camera.wait_recording(10, splitter_port=2)\n" " camera.stop_recording(splitter_port=2)\n" "\n" ".. attribute:: frames\n" "\n" " Returns an iterator over the frame meta-data.\n" "\n" " As the camera records video to the stream, the class captures the\n" " meta-data associated with each frame (in the form of a\n" " :class:`PiVideoFrame` tuple), discarding meta-data for frames which are\n" " no longer fully stored within the underlying ring buffer. You can use\n" " the frame meta-data to locate, for example, the first keyframe present\n" " in the stream in order to determine an appropriate range to extract." msgstr "" #: mu/modes/api/pi.py:139 msgid "" "picamera.PiCameraClosed() \n" "Raised when a method is called on a camera which has already been closed." msgstr "" #: mu/modes/api/pi.py:140 msgid "" "picamera.PiCameraDeprecated() \n" "Raised when deprecated functionality in picamera is used." msgstr "" #: mu/modes/api/pi.py:141 msgid "" "picamera.PiCameraError() \n" "Base class for PiCamera errors." msgstr "" #: mu/modes/api/pi.py:142 msgid "" "picamera.PiCameraFallback() \n" "Raised when picamera has to fallback on old functionality." msgstr "" #: mu/modes/api/pi.py:143 msgid "" "picamera.PiCameraMMALError(status, prefix='') \n" "Raised when an MMAL operation fails for whatever reason." msgstr "" #: mu/modes/api/pi.py:144 msgid "" "picamera.PiCameraNotRecording() \n" "Raised when :meth:`~PiCamera.stop_recording` or\n" ":meth:`~PiCamera.split_recording` are called against a port which has no\n" "recording active." msgstr "" #: mu/modes/api/pi.py:145 msgid "" "picamera.PiCameraPortDisabled(msg) \n" "Raised when attempting a buffer operation on a disabled port.\n" "\n" "This exception is intended for the common use-case of attempting to get\n" "or send a buffer just when a component is shutting down (e.g. at script\n" "teardown) and simplifies the trivial response (ignore the error and shut\n" "down quietly). For example::\n" "\n" " def _callback(self, port, buf):\n" " try:\n" " buf = self.outputs[0].get_buffer(False)\n" " except PiCameraPortDisabled:\n" " return True # shutting down\n" " # ..." msgstr "" #: mu/modes/api/pi.py:146 msgid "" "picamera.PiCameraResizerEncoding() \n" "Raised when picamera uses a resizer purely for encoding purposes." msgstr "" #: mu/modes/api/pi.py:147 msgid "" "picamera.PiCameraRuntimeError() \n" "Raised when an invalid sequence of operations is attempted with a\n" ":class:`PiCamera` object." msgstr "" #: mu/modes/api/pi.py:148 msgid "" "picamera.PiCameraValueError() \n" "Raised when an invalid value is fed to a :class:`~PiCamera` object." msgstr "" #: mu/modes/api/pi.py:149 msgid "" "picamera.PiCameraWarning() \n" "Base class for PiCamera warnings." msgstr "" #: mu/modes/api/pi.py:150 msgid "" "picamera.PiCookedMultiImageEncoder(parent, camera_port, input_port, format, " "resize, **options) \n" "Encoder for \"cooked\" (encoded) multiple image output.\n" "\n" "This encoder descends from :class:`PiMultiImageEncoder` but includes no\n" "new functionality as video-port based encodes (which is all this class\n" "is used for) don't support Exif tag output." msgstr "" #: mu/modes/api/pi.py:151 msgid "" "picamera.PiCookedOneImageEncoder(parent, camera_port, input_port, format, " "resize, **options) \n" "Encoder for \"cooked\" (encoded) single image output.\n" "\n" "This encoder extends :class:`PiOneImageEncoder` to include Exif tags in the\n" "output." msgstr "" #: mu/modes/api/pi.py:152 msgid "" "picamera.PiCookedVideoEncoder(parent, camera_port, input_port, format, " "resize, **options) \n" "Video encoder for encoded recordings.\n" "\n" "This class is a derivative of :class:`PiVideoEncoder` and only exists to\n" "provide naming symmetry with the image encoder classes." msgstr "" #: mu/modes/api/pi.py:153 msgid "" "picamera.PiEncoder(parent, camera_port, input_port, format, resize, " "**options) \n" "Base implementation of an MMAL encoder for use by PiCamera.\n" "\n" "The *parent* parameter specifies the :class:`PiCamera` instance that has\n" "constructed the encoder. The *camera_port* parameter provides the MMAL\n" "camera port that the encoder should enable for capture (this will be the\n" "still or video port of the camera component). The *input_port* parameter\n" "specifies the MMAL port that the encoder should connect to its input.\n" "Sometimes this will be the same as the camera port, but if other components\n" "are present in the pipeline (e.g. a splitter), it may be different.\n" "\n" "The *format* parameter specifies the format that the encoder should\n" "produce in its output. This is specified as a string and will be one of\n" "the following for image encoders:\n" "\n" "* ``'jpeg'``\n" "* ``'png'``\n" "* ``'gif'``\n" "* ``'bmp'``\n" "* ``'yuv'``\n" "* ``'rgb'``\n" "* ``'rgba'``\n" "* ``'bgr'``\n" "* ``'bgra'``\n" "\n" "And one of the following for video encoders:\n" "\n" "* ``'h264'``\n" "* ``'mjpeg'``\n" "\n" "The *resize* parameter is either ``None`` (indicating no resizing\n" "should take place), or a ``(width, height)`` tuple specifying the\n" "resolution that the output of the encoder should be resized to.\n" "\n" "Finally, the *options* parameter specifies additional keyword arguments\n" "that can be used to configure the encoder (e.g. bitrate for videos, or\n" "quality for images).\n" "\n" ".. attribute:: camera_port\n" "\n" " The :class:`~mmalobj.MMALVideoPort` that needs to be activated and\n" " deactivated in order to start/stop capture. This is not necessarily the\n" " port that the encoder component's input port is connected to (for\n" " example, in the case of video-port based captures, this will be the\n" " camera video port behind the splitter).\n" "\n" ".. attribute:: encoder\n" "\n" " The :class:`~mmalobj.MMALComponent` representing the encoder, or\n" " ``None`` if no encoder component has been created (some encoder classes\n" " don't use an actual encoder component, for example\n" " :class:`PiRawImageMixin`).\n" "\n" ".. attribute:: event\n" "\n" " A :class:`threading.Event` instance used to synchronize operations\n" " (like start, stop, and split) between the control thread and the\n" " callback thread.\n" "\n" ".. attribute:: exception\n" "\n" " If an exception occurs during the encoder callback, this attribute is\n" " used to store the exception until it can be re-raised in the control\n" " thread.\n" "\n" ".. attribute:: format\n" "\n" " The image or video format that the encoder is expected to produce. This\n" " is equal to the value of the *format* parameter.\n" "\n" ".. attribute:: input_port\n" "\n" " The :class:`~mmalobj.MMALVideoPort` that the encoder should be\n" " connected to.\n" "\n" ".. attribute:: output_port\n" "\n" " The :class:`~mmalobj.MMALVideoPort` that produces the encoder's output.\n" " In the case no encoder component is created, this should be the\n" " camera/component output port responsible for producing data. In other\n" " words, this attribute **must** be set on initialization.\n" "\n" ".. attribute:: outputs\n" "\n" " A mapping of ``key`` to ``(output, opened)`` tuples where ``output``\n" " is a file-like object, and ``opened`` is a bool indicating whether or\n" " not we opened the output object (and thus whether we are responsible\n" " for eventually closing it).\n" "\n" ".. attribute:: outputs_lock\n" "\n" " A :func:`threading.Lock` instance used to protect access to\n" " :attr:`outputs`.\n" "\n" ".. attribute:: parent\n" "\n" " The :class:`PiCamera` instance that created this PiEncoder instance.\n" "\n" ".. attribute:: pool\n" "\n" " A pointer to a pool of MMAL buffers.\n" "\n" ".. attribute:: resizer\n" "\n" " The :class:`~mmalobj.MMALResizer` component, or ``None`` if no resizer\n" " component has been created." msgstr "" #: mu/modes/api/pi.py:154 msgid "" "picamera.PiFramerateRange(low, high) \n" "This class is a :func:`~collections.namedtuple` derivative used to store\n" "the low and high limits of a range of framerates. It is recommended that\n" "you access the information stored by this class by attribute rather than\n" "position (for example: ``camera.framerate_range.low`` rather than\n" "``camera.framerate_range[0]``).\n" "\n" ".. attribute:: low\n" "\n" " The lowest framerate that the camera is permitted to use (inclusive).\n" " When the :attr:`~picamera.PiCamera.framerate_range` attribute is\n" " queried, this value will always be returned as a\n" " :class:`~fractions.Fraction`.\n" "\n" ".. attribute:: high\n" "\n" " The highest framerate that the camera is permitted to use (inclusive).\n" " When the :attr:`~picamera.PiCamera.framerate_range` attribute is\n" " queried, this value will always be returned as a\n" " :class:`~fractions.Fraction`.\n" "\n" ".. versionadded:: 1.13" msgstr "" #: mu/modes/api/pi.py:155 msgid "" "picamera.PiImageEncoder(parent, camera_port, input_port, format, resize, " "**options) \n" "Encoder for image capture.\n" "\n" "This derivative of :class:`PiEncoder` extends the :meth:`_create_encoder`\n" "method to configure the encoder for a variety of encoded image outputs\n" "(JPEG, PNG, etc.)." msgstr "" #: mu/modes/api/pi.py:156 msgid "" "picamera.PiMultiImageEncoder(parent, camera_port, input_port, format, " "resize, **options) \n" "Encoder for multiple image capture.\n" "\n" "This class extends :class:`PiImageEncoder` to handle an iterable of outputs\n" "instead of a single output. The :meth:`~PiEncoder._callback_write` method\n" "is extended to terminate capture when the iterable is exhausted, while\n" ":meth:`PiEncoder._open_output` is overridden to begin iteration and rely\n" "on the new :meth:`_next_output` method to advance output to the next item\n" "in the iterable." msgstr "" #: mu/modes/api/pi.py:157 msgid "" "picamera.PiNullSink(parent, source) \n" "Implements an :class:`~mmalobj.MMALNullSink` which can be used in place of\n" "a renderer.\n" "\n" "The *parent* parameter specifies the :class:`PiCamera` instance which\n" "constructed this :class:`~mmalobj.MMALNullSink`. The *source* parameter\n" "specifies the :class:`~mmalobj.MMALPort` which the null-sink should connect\n" "to its input.\n" "\n" "The null-sink can act as a drop-in replacement for :class:`PiRenderer` in\n" "most cases, but obviously doesn't implement attributes like ``alpha``,\n" "``layer``, etc. as it simply dumps any incoming frames. This is also the\n" "reason that this class doesn't derive from :class:`PiRenderer` like all\n" "other classes in this module." msgstr "" #: mu/modes/api/pi.py:158 msgid "" "picamera.PiOneImageEncoder(parent, camera_port, input_port, format, resize, " "**options) \n" "Encoder for single image capture.\n" "\n" "This class simply extends :meth:`~PiEncoder._callback_write` to terminate\n" "capture at frame end (i.e. after a single frame has been received)." msgstr "" #: mu/modes/api/pi.py:159 msgid "" "picamera.PiOverlayRenderer(parent, source, resolution=None, format=None, " "layer=0, alpha=255, fullscreen=True, window=None, crop=None, rotation=0, " "vflip=False, hflip=False) \n" "Represents an :class:`~mmalobj.MMALRenderer` with a static source for\n" "overlays.\n" "\n" "This class descends from :class:`PiRenderer` and adds a static *source* for\n" "the :class:`~mmalobj.MMALRenderer`. The *source* must be an object that\n" "supports the :ref:`buffer protocol ` in one of the supported\n" "formats.\n" "\n" "The optional *resolution* parameter specifies the size of the *source* as a\n" "``(width, height)`` tuple. If this is omitted or ``None`` then the\n" "resolution is assumed to be the same as the parent camera's current\n" ":attr:`~PiCamera.resolution`. The optional *format* parameter specifies the\n" "encoding of the *source*. This can be one of the unencoded formats:\n" "``'yuv'``, ``'rgb'``, ``'rgba'``, ``'bgr'``, or ``'bgra'``. If omitted or\n" "``None``, *format* will be guessed based on the size of *source* (assuming\n" "3 bytes for `RGB`_, and 4 bytes for `RGBA`_).\n" "\n" "The length of *source* must take into account that widths are rounded up to\n" "the nearest multiple of 32, and heights to the nearest multiple of 16. For\n" "example, if *resolution* is ``(1280, 720)``, and *format* is ``'rgb'`` then\n" "*source* must be a buffer with length 1280 x 720 x 3 bytes, or 2,764,800\n" "bytes (because 1280 is a multiple of 32, and 720 is a multiple of 16 no\n" "extra rounding is required). However, if *resolution* is ``(97, 57)``, and\n" "*format* is ``'rgb'`` then *source* must be a buffer with length 128 x 64 x\n" "3 bytes, or 24,576 bytes (pixels beyond column 97 and row 57 in the source\n" "will be ignored).\n" "\n" "The *layer*, *alpha*, *fullscreen*, and *window* parameters are the same\n" "as in :class:`PiRenderer`.\n" "\n" ".. _RGB: https://en.wikipedia.org/wiki/RGB\n" ".. _RGBA: https://en.wikipedia.org/wiki/RGBA_color_space\n" "\n" ".. versionchanged:: 1.13\n" " Added *format* parameter" msgstr "" #: mu/modes/api/pi.py:160 msgid "" "picamera.PiPreviewRenderer(parent, source, resolution=None, layer=2, " "alpha=255, fullscreen=True, window=None, crop=None, rotation=0, vflip=False, " "hflip=False) \n" "Represents an :class:`~mmalobj.MMALRenderer` which uses the camera's\n" "preview as a source.\n" "\n" "This class descends from :class:`PiRenderer` and adds an\n" ":class:`~mmalobj.MMALConnection` to connect the renderer to an MMAL port.\n" "The *source* parameter specifies the :class:`~mmalobj.MMALPort` to connect\n" "to the renderer.\n" "\n" "The *layer*, *alpha*, *fullscreen*, and *window* parameters are the same\n" "as in :class:`PiRenderer`." msgstr "" #: mu/modes/api/pi.py:161 msgid "" "picamera.PiRawImageMixin(parent, camera_port, input_port, format, resize, " "**options) \n" "Mixin class for \"raw\" (unencoded) image capture.\n" "\n" "The :meth:`_callback_write` method is overridden to manually calculate when\n" "to terminate output." msgstr "" #: mu/modes/api/pi.py:162 msgid "" "picamera.PiRawMixin(parent, camera_port, input_port, format, resize, " "**options) \n" "Mixin class for \"raw\" (unencoded) output.\n" "\n" "This mixin class overrides the initializer of :class:`PiEncoder`, along\n" "with :meth:`_create_resizer` and :meth:`_create_encoder` to configure the\n" "pipeline for unencoded output. Specifically, it disables the construction\n" "of an encoder, and sets the output port to the input port passed to the\n" "initializer, unless resizing is required (either for actual resizing, or\n" "for format conversion) in which case the resizer's output is used." msgstr "" #: mu/modes/api/pi.py:163 msgid "" "picamera.PiRawMultiImageEncoder(parent, camera_port, input_port, format, " "resize, **options) \n" "Multiple image encoder for unencoded capture.\n" "\n" "This class is a derivative of :class:`PiMultiImageEncoder` and the\n" ":class:`PiRawImageMixin` class intended for use with\n" ":meth:`~PiCamera.capture_sequence` when it is called with an unencoded\n" "image format.\n" "\n" ".. warning::\n" "\n" " This class creates an inheritance diamond. Take care to determine the\n" " MRO of super-class calls." msgstr "" #: mu/modes/api/pi.py:164 msgid "" "picamera.PiRawOneImageEncoder(parent, camera_port, input_port, format, " "resize, **options) \n" "Single image encoder for unencoded capture.\n" "\n" "This class is a derivative of :class:`PiOneImageEncoder` and the\n" ":class:`PiRawImageMixin` class intended for use with\n" ":meth:`~PiCamera.capture` (et al) when it is called with an unencoded image\n" "format.\n" "\n" ".. warning::\n" "\n" " This class creates an inheritance diamond. Take care to determine the\n" " MRO of super-class calls." msgstr "" #: mu/modes/api/pi.py:165 msgid "" "picamera.PiRawVideoEncoder(parent, camera_port, input_port, format, resize, " "**options) \n" "Video encoder for unencoded recordings.\n" "\n" "This class is a derivative of :class:`PiVideoEncoder` and the\n" ":class:`PiRawMixin` class intended for use with\n" ":meth:`~PiCamera.start_recording` when it is called with an unencoded\n" "format.\n" "\n" ".. warning::\n" "\n" " This class creates an inheritance diamond. Take care to determine the\n" " MRO of super-class calls." msgstr "" #: mu/modes/api/pi.py:166 msgid "" "picamera.PiRenderer(parent, layer=0, alpha=255, fullscreen=True, " "window=None, crop=None, rotation=0, vflip=False, hflip=False) \n" "Wraps :class:`~mmalobj.MMALRenderer` for use by PiCamera.\n" "\n" "The *parent* parameter specifies the :class:`PiCamera` instance that has\n" "constructed this renderer. The *layer* parameter specifies the layer that\n" "the renderer will inhabit. Higher numbered layers obscure lower numbered\n" "layers (unless they are partially transparent). The initial opacity of the\n" "renderer is specified by the *alpha* parameter (which defaults to 255,\n" "meaning completely opaque). The *fullscreen* parameter which defaults to\n" "``True`` indicates whether the renderer should occupy the entire display.\n" "Finally, the *window* parameter (which only has meaning when *fullscreen*\n" "is ``False``) is a four-tuple of ``(x, y, width, height)`` which gives the\n" "screen coordinates that the renderer should occupy when it isn't\n" "full-screen.\n" "\n" "This base class isn't directly used by :class:`PiCamera`, but the two\n" "derivatives defined below, :class:`PiOverlayRenderer` and\n" ":class:`PiPreviewRenderer`, are used to produce overlays and the camera\n" "preview respectively." msgstr "" #: mu/modes/api/pi.py:167 msgid "" "picamera.PiResolution(width, height) \n" "A :func:`~collections.namedtuple` derivative which represents a resolution\n" "with a :attr:`width` and :attr:`height`.\n" "\n" ".. attribute:: width\n" "\n" " The width of the resolution in pixels\n" "\n" ".. attribute:: height\n" "\n" " The height of the resolution in pixels\n" "\n" ".. versionadded:: 1.11" msgstr "" #: mu/modes/api/pi.py:168 msgid "" "picamera.PiVideoEncoder(parent, camera_port, input_port, format, resize, " "**options) \n" "Encoder for video recording.\n" "\n" "This derivative of :class:`PiEncoder` configures itself for H.264 or MJPEG\n" "encoding. It also introduces a :meth:`split` method which is used by\n" ":meth:`~PiCamera.split_recording` and :meth:`~PiCamera.record_sequence` to\n" "redirect future output to a new filename or object. Finally, it also\n" "extends :meth:`PiEncoder.start` and :meth:`PiEncoder._callback_write` to\n" "track video frame meta-data, and to permit recording motion data to a\n" "separate output object." msgstr "" #: mu/modes/api/pi.py:169 msgid "" "picamera.PiVideoFrame(index, frame_type, frame_size, video_size, split_size, " "timestamp, complete) \n" "This class is a :func:`~collections.namedtuple` derivative used to store\n" "information about a video frame. It is recommended that you access the\n" "information stored by this class by attribute name rather than position\n" "(for example: ``frame.index`` rather than ``frame[0]``).\n" "\n" ".. attribute:: index\n" "\n" " Returns the zero-based number of the frame. This is a monotonic counter\n" " that is simply incremented every time the camera starts outputting a\n" " new frame. As a consequence, this attribute cannot be used to detect\n" " dropped frames. Nor does it necessarily represent actual frames; it\n" " will be incremented for SPS headers and motion data buffers too.\n" "\n" ".. attribute:: frame_type\n" "\n" " Returns a constant indicating the kind of data that the frame contains\n" " (see :class:`PiVideoFrameType`). Please note that certain frame types\n" " contain no image data at all.\n" "\n" ".. attribute:: frame_size\n" "\n" " Returns the size in bytes of the current frame. If a frame is written\n" " in multiple chunks, this value will increment while :attr:`index`\n" " remains static. Query :attr:`complete` to determine whether the frame\n" " has been completely output yet.\n" "\n" ".. attribute:: video_size\n" "\n" " Returns the size in bytes of the entire video up to this frame. Note\n" " that this is unlikely to match the size of the actual file/stream\n" " written so far. This is because a stream may utilize buffering which\n" " will cause the actual amount written (e.g. to disk) to lag behind the\n" " value reported by this attribute.\n" "\n" ".. attribute:: split_size\n" "\n" " Returns the size in bytes of the video recorded since the last call to\n" " either :meth:`~PiCamera.start_recording` or\n" " :meth:`~PiCamera.split_recording`. For the reasons explained above,\n" " this may differ from the size of the actual file/stream written so far.\n" "\n" ".. attribute:: timestamp\n" "\n" " Returns the presentation timestamp (PTS) of the frame. This represents\n" " the point in time that the Pi received the first line of the frame from\n" " the camera.\n" "\n" " The timestamp is measured in microseconds (millionths of a second).\n" " When the camera's clock mode is ``'reset'`` (the default), the\n" " timestamp is relative to the start of the video recording. When the\n" " camera's :attr:`~PiCamera.clock_mode` is ``'raw'``, it is relative to\n" " the last system reboot. See :attr:`~PiCamera.timestamp` for more\n" " information.\n" "\n" " .. warning::\n" "\n" " Currently, the camera occasionally returns \"time unknown\" values " "in\n" " this field which picamera represents as ``None``. If you are\n" " querying this property you will need to check the value is not\n" " ``None`` before using it. This happens for SPS header \"frames\",\n" " for example.\n" "\n" ".. attribute:: complete\n" "\n" " Returns a bool indicating whether the current frame is complete or not.\n" " If the frame is complete then :attr:`frame_size` will not increment\n" " any further, and will reset for the next frame.\n" "\n" ".. versionchanged:: 1.5\n" " Deprecated :attr:`header` and :attr:`keyframe` attributes and added the\n" " new :attr:`frame_type` attribute instead.\n" "\n" ".. versionchanged:: 1.9\n" " Added the :attr:`complete` attribute." msgstr "" #: mu/modes/api/pi.py:170 msgid "" "picamera.PiVideoFrameType() \n" "This class simply defines constants used to represent the type of a frame\n" "in :attr:`PiVideoFrame.frame_type`. Effectively it is a namespace for an\n" "enum.\n" "\n" ".. attribute:: frame\n" "\n" " Indicates a predicted frame (P-frame). This is the most common frame\n" " type.\n" "\n" ".. attribute:: key_frame\n" "\n" " Indicates an intra-frame (I-frame) also known as a key frame.\n" "\n" ".. attribute:: sps_header\n" "\n" " Indicates an inline SPS/PPS header (rather than picture data) which is\n" " typically used as a split point.\n" "\n" ".. attribute:: motion_data\n" "\n" " Indicates the frame is inline motion vector data, rather than picture\n" " data.\n" "\n" ".. versionadded:: 1.5" msgstr "" #: mu/modes/api/pi.py:171 msgid "" "picamera.Red() \n" "Represents the red component of a :class:`Color` for use in\n" "transformations. Instances of this class can be constructed directly with a\n" "float value, or by querying the :attr:`Color.red` attribute. Addition,\n" "subtraction, and multiplication are supported with :class:`Color`\n" "instances. For example::\n" "\n" " >>> Color.from_rgb(0, 0, 0) + Red(0.5)\n" " \n" " >>> Color('#f00') - Color('#900').red\n" " \n" " >>> (Red(0.1) * Color('red')).red\n" " Red(0.1)" msgstr "" #: mu/modes/api/pi.py:172 msgid "" "picamera.Saturation() \n" "Represents the saturation of a :class:`Color` for use in transformations.\n" "Instances of this class can be constructed directly with a float value, or\n" "by querying the :attr:`Color.saturation` attribute. Addition, subtraction,\n" "and multiplication are supported with :class:`Color` instances. For\n" "example::\n" "\n" " >>> Color(0.9, 0.9, 0.6) + Saturation(0.1)\n" " \n" " >>> Color('red') - Saturation(1)\n" " \n" " >>> Saturation(0.5) * Color('wheat')\n" " " msgstr "" #: mu/modes/api/pi.py:173 msgid "" "picamera.mmal_check(status, prefix='') \n" "Checks the return status of an mmal call and raises an exception on\n" "failure.\n" "\n" "The *status* parameter is the result of an MMAL call. If *status* is\n" "anything other than MMAL_SUCCESS, a :exc:`PiCameraMMALError` exception is\n" "raised. The optional *prefix* parameter specifies a prefix message to place\n" "at the start of the exception's message to provide some context." msgstr "" #: mu/modes/api/pi.py:174 msgid "" "picamera.str() \n" "str(object='') -> str\n" "str(bytes_or_buffer[, encoding[, errors]]) -> str\n" "\n" "Create a new string object from the given object. If encoding or\n" "errors is specified, then the object must expose a data buffer\n" "that will be decoded using the given encoding and error handler.\n" "Otherwise, returns the result of object.__str__() (if defined)\n" "or repr(object).\n" "encoding defaults to sys.getdefaultencoding().\n" "errors defaults to 'strict'." msgstr "" #: mu/modes/api/pi.py:175 msgid "" "guizero.App(title='guizero', width=500, height=500, layout='auto', " "bgcolor=None) \n" "Toplevel widget of Tk which represents mostly the main window\n" "of an application. It has an associated Tcl interpreter." msgstr "" #: mu/modes/api/pi.py:176 msgid "" "guizero.Box(master, layout='auto', grid=None, align=None) \n" "Frame widget which may contain other widgets and can have a 3D border." msgstr "" #: mu/modes/api/pi.py:177 msgid "" "guizero.ButtonGroup(master, options, selected, horizontal=False, " "command=None, grid=None, align=None) \n" "Frame widget which may contain other widgets and can have a 3D border." msgstr "" #: mu/modes/api/pi.py:178 msgid "" "guizero.CheckBox(master, text, command=None, grid=None, align=None) \n" "Checkbutton widget which is either in on- or off-state." msgstr "" #: mu/modes/api/pi.py:179 msgid "" "guizero.Combo(master, options, selected=None, command=None, grid=None, " "align=None) \n" "OptionMenu which allows the user to select a value from a menu." msgstr "" #: mu/modes/api/pi.py:180 msgid "" "guizero.MenuBar(master, toplevel, options) \n" "Menu widget which allows displaying menu bars, pull-down menus and pop-up " "menus." msgstr "" #: mu/modes/api/pi.py:181 msgid "" "guizero.Picture(master, image, grid=None, align=None) \n" "Label widget which can display text and bitmaps." msgstr "" #: mu/modes/api/pi.py:182 msgid "" "guizero.PushButton(master, command, args=None, text='Button', icon=None, " "pady=10, padx=10, grid=None, align=None) \n" "Button widget." msgstr "" #: mu/modes/api/pi.py:183 msgid "" "guizero.RadioButton(master, text, value, variable, command=None, grid=None, " "align=None) \n" "Radiobutton widget which shows only one of several buttons in on-state." msgstr "" #: mu/modes/api/pi.py:184 msgid "" "guizero.Slider(master, start=0, end=100, horizontal=True, command=None, " "grid=None, align=None) \n" "Scale widget which can display a numerical scale." msgstr "" #: mu/modes/api/pi.py:185 msgid "" "guizero.Text(master, text='', size=12, color='black', font='Helvetica', " "grid=None, align=None) \n" "Label widget which can display text and bitmaps." msgstr "" #: mu/modes/api/pi.py:186 msgid "" "guizero.TextBox(master, text='', width=10, grid=None, align=None) \n" "Entry widget which allows displaying simple text." msgstr "" #: mu/modes/api/pi.py:187 msgid "" "guizero.Tk(screenName=None, baseName=None, className='Tk', useTk=1, sync=0, " "use=None) \n" "Toplevel widget of Tk which represents mostly the main window\n" "of an application. It has an associated Tcl interpreter." msgstr "" #: mu/modes/api/pi.py:188 msgid "" "guizero.Waffle(master, height=3, width=3, dim=20, pad=5, color='white', " "dotty=False, remember=False, grid=None, align=None) \n" "Frame widget which may contain other widgets and can have a 3D border." msgstr "" #: mu/modes/api/pi.py:189 msgid "" "guizero.exit() \n" "exit([status])\n" "\n" "Exit the interpreter by raising SystemExit(status).\n" "If the status is omitted or None, it defaults to zero (i.e., success).\n" "If the status is an integer, it will be used as the system exit status.\n" "If it is another kind of object, it will be printed and the system\n" "exit status will be one (i.e., failure)." msgstr "" #: mu/modes/api/pi.py:190 msgid "" "networkzero.DifferentThreadError() \n" "Common base class for all non-exit exceptions." msgstr "" #: mu/modes/api/pi.py:191 msgid "" "networkzero.InvalidAddressError(address, errno=None) \n" "Common base class for all non-exit exceptions." msgstr "" #: mu/modes/api/pi.py:192 msgid "" "networkzero.NetworkZeroError() \n" "Common base class for all non-exit exceptions." msgstr "" #: mu/modes/api/pi.py:193 msgid "" "networkzero.SocketAlreadyExistsError() \n" "Common base class for all non-exit exceptions." msgstr "" #: mu/modes/api/pi.py:194 msgid "" "networkzero.SocketInterruptedError(after_n_seconds) \n" "Common base class for all non-exit exceptions." msgstr "" #: mu/modes/api/pi.py:195 msgid "" "networkzero.SocketTimedOutError(n_seconds) \n" "Common base class for all non-exit exceptions." msgstr "" #: mu/modes/api/pi.py:196 msgid "" "networkzero.action_and_params(commandline) \n" "Treat a command line as an action followed by parameter\n" "\n" ":param commandline: a string containing at least an action\n" ":returns: action, [param1, param2, ...]" msgstr "" #: mu/modes/api/pi.py:197 msgid "" "networkzero.address(address=None) \n" "Convert one of a number of inputs into a valid ip:port string.\n" "\n" "Elements which are not provided are filled in as follows:\n" " \n" " * IP Address: the system is asked for the set of IP addresses " "associated \n" " with the machine and the first one is used, preferring those matching\n" " `address` if it is a wildcard.\n" " * Port number: a random port is selected from the pool of dynamically-" "available \n" " port numbers.\n" " \n" "This means you can pass any of: nothing; a hostname; an IP address; an IP " "address with wildcards; a port number\n" "\n" "If an IP address is supplied but is invalid, an InvalidAddressError\n" "exception is raised.\n" "\n" ":param address: (optional) Any of: an IP address, a port number, or both\n" "\n" ":returns: a valid ip:port string for this machine" msgstr "" #: mu/modes/api/pi.py:198 msgid "" "networkzero.advertise(name, address=None, fail_if_exists=False, ttl_s=20) \n" "Advertise a name at an address\n" "\n" "Start to advertise service `name` at address `address`. If\n" "the address is not supplied, one is constructed and this is\n" "returned by the function. ie this is a typical use::\n" "\n" " address = nw0.advertise(\"myservice\")\n" " \n" ":param name: any text\n" ":param address: either \"ip:port\" or None\n" ":param fail_if_exists: fail if this name is already registered?\n" ":param ttl_s: the advert will persist for this many seconds other beacons\n" ":returns: the address given or constructed" msgstr "" #: mu/modes/api/pi.py:199 msgid "" "networkzero.bytes_to_string(data) \n" "Take bytes and return a base64-encoded unicode string equivalent\n" "\n" ":param data: a bytes object\n" ":returns: base64-encoded unicode object" msgstr "" #: mu/modes/api/pi.py:200 msgid "" "networkzero.discover(name, wait_for_s=60) \n" "Discover a service by name\n" "\n" "Look for an advert to a named service::\n" "\n" " address = nw0.discover(\"myservice\")\n" " \n" ":param name: any text\n" ":param wait_for_s: how many seconds to wait before giving up\n" ":returns: the address found or None" msgstr "" #: mu/modes/api/pi.py:201 msgid "" "networkzero.discover_all() \n" "Produce a list of all known services and their addresses\n" "\n" "Ask for all known services as a list of 2-tuples: (name, address)\n" "This could, eg, be used to form a dictionary of services::\n" "\n" " services = dict(nw0.discover_all())\n" " \n" ":returns: a list of 2-tuples [(name, address), ...]" msgstr "" #: mu/modes/api/pi.py:202 msgid "" "networkzero.discover_group(group, separator='/', exclude=None) \n" "Produce a list of all services and their addresses in a group\n" "\n" "A group is an optional form of namespace within the discovery mechanism.\n" "If an advertised name has the form it is deemed to\n" "belong to . Note that the service's name is still the full\n" "string . The group concept is simply for discovery and\n" "to assist differentiation, eg, in a classroom group.\n" "\n" ":param group: the name of a group prefix\n" ":param separator: the separator character [/]\n" ":param exclude: an iterable of names to exclude (or None)\n" "\n" ":returns: a list of 2-tuples [(name, address), ...]" msgstr "" #: mu/modes/api/pi.py:203 msgid "" "networkzero.networkzero.config() \n" "Common configuration elements for networkzero" msgstr "" #: mu/modes/api/pi.py:204 msgid "" "networkzero.networkzero.discovery() \n" "Advertise and collect advertisements of network services\n" "\n" "The discovery module offers:\n" "\n" " * A UDP broadcast socket which:\n" " \n" " - Listens for and keeps track of service adverts from this and other \n" " machines & processes\n" " - Broadcasts services advertised by this process\n" "\n" " * A ZeroMQ socket which allow any process on this machine to \n" " communicate with its broadcast socket\n" "\n" "In other words, we have a beacon which listens to instructions\n" "from processes on this machine while sending out and listening \n" "to adverts broadcast to/from all machines on the network.\n" "\n" "The beacon is started automatically in a daemon thread when the first \n" "attempt is made to advertise or discover. If another process already \n" "has a beacon running (ie if this beacon can't bind to its port) this \n" "beacon thread will shut down with no further action.\n" "\n" "The module-level functions to advertise and discover will open a connection\n" "to a ZeroMQ socket on this machine (which might be hosted by this or by " "another\n" "process) and will use this socket to send commands to the beacon thread " "which\n" "will update or return its internal list of advertised services.\n" "\n" "As an additional convenience, the :func:`advertise` function will, if given " "no\n" "specific address, generate a suitable ip:port pair by interrogating the " "system.\n" "This functionality is actually in :func:`networkzero.address` (qv)." msgstr "" #: mu/modes/api/pi.py:205 msgid "" "networkzero.send_message_to(address, message=None, " "wait_for_reply_s=) \n" "Send a message and return the reply\n" "\n" ":param address: a nw0 address (eg from `nw0.discover`)\n" ":param message: any simple Python object, including text & tuples\n" ":param wait_for_reply_s: how many seconds to wait for a reply [default: " "forever]\n" "\n" ":returns: the reply returned from the address or None if out of time" msgstr "" #: mu/modes/api/pi.py:206 msgid "" "networkzero.send_news_to(address, topic, data=None) \n" "Publish news to all subscribers\n" "\n" ":param address: a nw0 address, eg from `nw0.advertise`\n" ":param topic: any text object\n" ":param data: any simple Python object including test & tuples [default: " "empty]" msgstr "" #: mu/modes/api/pi.py:207 msgid "" "networkzero.send_reply_to(address, reply=None) \n" "Reply to a message previously received\n" "\n" ":param address: a nw0 address (eg from `nw0.advertise`)\n" ":param reply: any simple Python object, including text & tuples" msgstr "" #: mu/modes/api/pi.py:208 msgid "" "networkzero.string_to_bytes(data) \n" "Take a base64-encoded unicode string and return the equivalent bytes\n" "\n" ":param data: a base64-encoded unicode object\n" ":returns: the equivalent bytes" msgstr "" #: mu/modes/api/pi.py:209 msgid "" "networkzero.wait_for_message_from(address, wait_for_s=, " "autoreply=False) \n" "Wait for a message\n" "\n" ":param address: a nw0 address (eg from `nw0.advertise`)\n" ":param wait_for_s: how many seconds to wait for a message before giving up " "[default: forever]\n" ":param autoreply: whether to send an empty reply [default: No]\n" "\n" ":returns: the message received from another address or None if out of time" msgstr "" #: mu/modes/api/pi.py:210 msgid "" "networkzero.wait_for_news_from(address, prefix='', wait_for_s=) \n" "Wait for news whose topic starts with `prefix`.\n" "\n" ":param address: a nw0 address, eg from `nw0.discover`\n" ":param prefix: any text object [default: all messages]\n" ":param wait_for_s: how many seconds to wait before giving up [default: " "forever]\n" "\n" ":returns: a 2-tuple of (topic, data) or (None, None) if out of time" msgstr "" #: mu/modes/api/pygamezero.py:23 msgid "" "actor.Actor(image, pos=None, anchor=None, **kwargs) \n" "Rect(left, top, width, height) -> Rect\n" "Rect((left, top), (width, height)) -> Rect\n" "Rect(object) -> Rect\n" "pygame object for storing rectangular coordinates" msgstr "" #: mu/modes/api/pygamezero.py:24 msgid "" "actor.atan2() \n" "atan2(y, x)\n" "\n" "Return the arc tangent (measured in radians) of y/x.\n" "Unlike atan(y/x), the signs of both x and y are considered." msgstr "" #: mu/modes/api/pygamezero.py:25 msgid "" "actor.cos() \n" "cos(x)\n" "\n" "Return the cosine of x (measured in radians)." msgstr "" #: mu/modes/api/pygamezero.py:26 msgid "" "actor.degrees() \n" "degrees(x)\n" "\n" "Convert angle x from radians to degrees." msgstr "" #: mu/modes/api/pygamezero.py:27 msgid "" "actor.pygame() \n" "Pygame is a set of Python modules designed for writing games.\n" "It is written on top of the excellent SDL library. This allows you\n" "to create fully featured games and multimedia programs in the python\n" "language. The package is highly portable, with games running on\n" "Windows, MacOS, OS X, BeOS, FreeBSD, IRIX, and Linux." msgstr "" #: mu/modes/api/pygamezero.py:28 msgid "" "actor.radians() \n" "radians(x)\n" "\n" "Convert angle x from degrees to radians." msgstr "" #: mu/modes/api/pygamezero.py:29 msgid "" "actor.sin() \n" "sin(x)\n" "\n" "Return the sine of x (measured in radians)." msgstr "" #: mu/modes/api/pygamezero.py:30 msgid "" "actor.sqrt() \n" "sqrt(x)\n" "\n" "Return the square root of x." msgstr "" #: mu/modes/api/pygamezero.py:31 msgid "" "actor.transform_anchor(ax, ay, w, h, angle) \n" "Transform anchor based upon a rotation of a surface of size w x h." msgstr "" #: mu/modes/api/pygamezero.py:32 msgid "" "animation.Animation(object, tween='linear', duration=1, on_finished=None, " "**targets) \n" "An animation manager for object attribute animations.\n" "\n" "Each keyword argument given to the Animation on creation (except\n" "\"type\" and \"duration\") will be *tweened* from their current value\n" "on the object to the target value specified.\n" "\n" "If the value is a list or tuple, then each value inside that will\n" "be tweened.\n" "\n" "The update() method is automatically scheduled with the clock for\n" "the duration of the animation." msgstr "" #: mu/modes/api/pygamezero.py:33 msgid "" "animation.each_tick(callback) \n" "Schedule a callback to be called every tick.\n" "\n" "Unlike the standard scheduler functions, the callable is passed the\n" "elapsed clock time since the last call (the same value passed to tick)." msgstr "" #: mu/modes/api/pygamezero.py:34 msgid "" "animation.pow() \n" "pow(x, y)\n" "\n" "Return x**y (x to the power of y)." msgstr "" #: mu/modes/api/pygamezero.py:35 msgid "" "animation.sin() \n" "sin(x)\n" "\n" "Return the sine of x (measured in radians)." msgstr "" #: mu/modes/api/pygamezero.py:36 msgid "" "animation.unschedule(callback) \n" "Unschedule the given callback.\n" "\n" "If scheduled multiple times all instances will be unscheduled." msgstr "" #: mu/modes/api/pygamezero.py:37 msgid "" "clock.Clock() \n" "A clock used for event scheduling.\n" "\n" "When tick() is called, all events scheduled for before now will be called\n" "in order.\n" "\n" "tick() would typically be called from the game loop for the default clock.\n" "\n" "Additional clocks could be created - for example, a game clock that could\n" "be suspended in pause screens. Your code must take care of calling tick()\n" "or not. You could also run the clock at a different rate if desired, by\n" "scaling dt before passing it to tick()." msgstr "" #: mu/modes/api/pygamezero.py:38 msgid "" "clock.Event(time, cb, repeat=None) \n" "An event scheduled for a future time.\n" "\n" "Events are ordered by their scheduled execution time." msgstr "" #: mu/modes/api/pygamezero.py:39 msgid "" "clock.each_tick(callback) \n" "Schedule a callback to be called every tick.\n" "\n" "Unlike the standard scheduler functions, the callable is passed the\n" "elapsed clock time since the last call (the same value passed to tick)." msgstr "" #: mu/modes/api/pygamezero.py:40 msgid "" "clock.heapq() \n" "Heap queue algorithm (a.k.a. priority queue).\n" "\n" "Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\n" "all k, counting elements from 0. For the sake of comparison,\n" "non-existing elements are considered to be infinite. The interesting\n" "property of a heap is that a[0] is always its smallest element.\n" "\n" "Usage:\n" "\n" "heap = [] # creates an empty heap\n" "heappush(heap, item) # pushes a new item on the heap\n" "item = heappop(heap) # pops the smallest item from the heap\n" "item = heap[0] # smallest item on the heap without popping it\n" "heapify(x) # transforms list into a heap, in-place, in linear " "time\n" "item = heapreplace(heap, item) # pops and returns smallest item, and adds\n" " # new item; the heap size is unchanged\n" "\n" "Our API differs from textbook heap algorithms as follows:\n" "\n" "- We use 0-based indexing. This makes the relationship between the\n" " index for a node and the indexes for its children slightly less\n" " obvious, but is more suitable since Python uses 0-based indexing.\n" "\n" "- Our heappop() method returns the smallest item, not the largest.\n" "\n" "These two make it possible to view the heap as a regular Python list\n" "without surprises: heap[0] is the smallest item, and heap.sort()\n" "maintains the heap invariant!" msgstr "" #: mu/modes/api/pygamezero.py:41 msgid "" "clock.method() \n" "method(function, instance)\n" "\n" "Create a bound instance method object." msgstr "" #: mu/modes/api/pygamezero.py:42 msgid "" "clock.schedule(callback, delay) \n" "Schedule callback to be called once, at `delay` seconds from now.\n" "\n" ":param callback: A parameterless callable to be called.\n" ":param delay: The delay before the call (in clock time / seconds)." msgstr "" #: mu/modes/api/pygamezero.py:43 msgid "" "clock.schedule_interval(callback, delay) \n" "Schedule callback to be called every `delay` seconds.\n" "\n" "The first occurrence will be after `delay` seconds.\n" "\n" ":param callback: A parameterless callable to be called.\n" ":param delay: The interval in seconds." msgstr "" #: mu/modes/api/pygamezero.py:44 msgid "" "clock.schedule_unique(callback, delay) \n" "Schedule callback to be called once, at `delay` seconds from now.\n" "\n" "If it was already scheduled, postpone its firing.\n" "\n" ":param callback: A parameterless callable to be called.\n" ":param delay: The delay before the call (in clock time / seconds)." msgstr "" #: mu/modes/api/pygamezero.py:45 msgid "" "clock.tick(dt) \n" "Update the clock time and fire all scheduled events.\n" "\n" ":param dt: The elapsed time in seconds." msgstr "" #: mu/modes/api/pygamezero.py:46 msgid "" "clock.total_ordering(cls) \n" "Class decorator that fills in missing ordering methods" msgstr "" #: mu/modes/api/pygamezero.py:47 msgid "" "clock.unschedule(callback) \n" "Unschedule the given callback.\n" "\n" "If scheduled multiple times all instances will be unscheduled." msgstr "" #: mu/modes/api/pygamezero.py:48 msgid "" "clock.weak_method(method) \n" "Quick weak method ref in case users aren't using Python 3.4" msgstr "" #: mu/modes/api/pygamezero.py:49 msgid "" "keyboard.Keyboard() \n" "The current state of the keyboard.\n" "\n" "Each attribute represents a key. For example, ::\n" "\n" " keyboard.a\n" "\n" "is True if the 'A' key is depressed, and False otherwise." msgstr "" #: mu/modes/api/pygamezero.py:50 msgid "" "keyboard.keys(value, names=None, *, module=None, qualname=None, type=None, " "start=1) \n" "An enumeration." msgstr "" #: mu/modes/api/pygamezero.py:51 msgid "" "keyboard.re() \n" "Support for regular expressions (RE)." msgstr "" #: mu/modes/api/pygamezero.py:52 msgid "" "keyboard.warn() \n" "Issue a warning, or maybe ignore it or raise an exception." msgstr "" #: mu/modes/api/pygamezero.py:53 msgid "" "music.ResourceLoader(subpath) \n" "Abstract resource loader.\n" "\n" "A resource loader is a singleton; resources are loaded from a named\n" "subdirectory of the global 'root'. The `.load()` method actually loads\n" "a resource.\n" "\n" "Additionally, attribute access can be used to access and cache resources.\n" "Dotted paths can be used to traverse directories." msgstr "" #: mu/modes/api/pygamezero.py:54 msgid "" "music.fadeout(seconds) \n" "Fade out and eventually stop the music playback.\n" "\n" ":param seconds: The duration in seconds over which the sound will be faded\n" " out. For example, to fade out over half a second, call\n" " ``music.fadeout(0.5)``." msgstr "" #: mu/modes/api/pygamezero.py:55 msgid "" "music.get_pos() \n" "get_pos() -> time\n" "get the music play time" msgstr "" #: mu/modes/api/pygamezero.py:56 msgid "" "music.get_volume() \n" "get_volume() -> value\n" "get the music volume" msgstr "" #: mu/modes/api/pygamezero.py:57 msgid "" "music.is_playing(name) \n" "Return True if the music is playing and not paused." msgstr "" #: mu/modes/api/pygamezero.py:58 msgid "" "music.pause() \n" "Temporarily stop playback of the music stream.\n" "\n" "Call `unpause()` to resume." msgstr "" #: mu/modes/api/pygamezero.py:59 msgid "" "music.pgzero.constants() \n" "Names for constants returned by Pygame." msgstr "" #: mu/modes/api/pygamezero.py:60 msgid "" "music.play(name) \n" "Play a music file from the music/ directory.\n" "\n" "The music will loop when it finishes playing." msgstr "" #: mu/modes/api/pygamezero.py:61 msgid "" "music.play_once(name) \n" "Play a music file from the music/ directory." msgstr "" #: mu/modes/api/pygamezero.py:62 msgid "" "music.queue(name) \n" "Queue a music file to follow the current track.\n" "\n" "This will load a music file and queue it. A queued music file will begin as\n" "soon as the current music naturally ends. If the current music is ever\n" "stopped or changed, the queued song will be lost." msgstr "" #: mu/modes/api/pygamezero.py:63 msgid "" "music.rewind() \n" "rewind() -> None\n" "restart music" msgstr "" #: mu/modes/api/pygamezero.py:64 msgid "" "music.set_pos() \n" "set_pos(pos) -> None\n" "set position to play from" msgstr "" #: mu/modes/api/pygamezero.py:65 msgid "" "music.set_volume() \n" "set_volume(value) -> None\n" "set the music volume" msgstr "" #: mu/modes/api/pygamezero.py:66 msgid "" "music.stop() \n" "stop() -> None\n" "stop the music playback" msgstr "" #: mu/modes/api/pygamezero.py:67 msgid "" "music.unpause() \n" "Resume playback of the music stream after it has been paused." msgstr "" #: mu/modes/api/pygamezero.py:68 msgid "" "screen.Screen(surface) \n" "Interface to the screen." msgstr "" #: mu/modes/api/pygamezero.py:69 msgid "" "screen.SurfacePainter(screen) \n" "Interface to pygame.draw that is bound to a surface." msgstr "" #: mu/modes/api/pygamezero.py:70 msgid "" "screen.pgzero.ptext() \n" "pygame-text - high-level text rendering with Pygame.\n" "\n" "This module is directly copied from\n" "\n" " https://github.com/cosmologicon/pygame-text\n" "\n" "at revision c04e59b7382a832e117f0598cdcbc1bb3eb26db5\n" "and used under CC0." msgstr "" #: mu/modes/api/pygamezero.py:71 msgid "" "screen.pygame() \n" "Pygame is a set of Python modules designed for writing games.\n" "It is written on top of the excellent SDL library. This allows you\n" "to create fully featured games and multimedia programs in the python\n" "language. The package is highly portable, with games running on\n" "Windows, MacOS, OS X, BeOS, FreeBSD, IRIX, and Linux." msgstr "" #: mu/modes/api/pygamezero.py:72 msgid "" "screen.round_pos(pos) \n" "Round a tuple position so it can be used for drawing." msgstr "" #: mu/modes/api/python3.py:23 msgid "" "argparse.Action(option_strings, dest, nargs=None, const=None, default=None, " "type=None, choices=None, required=False, help=None, metavar=None) \n" "Information about how to convert command line strings to Python objects.\n" "\n" "Action objects are used by an ArgumentParser to represent the information\n" "needed to parse a single argument from one or more strings from the\n" "command line. The keyword arguments to the Action constructor are also\n" "all attributes of Action instances.\n" "\n" "Keyword Arguments:\n" "\n" " - option_strings -- A list of command-line option strings which\n" " should be associated with this action.\n" "\n" " - dest -- The name of the attribute to hold the created object(s)\n" "\n" " - nargs -- The number of command-line arguments that should be\n" " consumed. By default, one argument will be consumed and a single\n" " value will be produced. Other values include:\n" " - N (an integer) consumes N arguments (and produces a list)\n" " - '?' consumes zero or one arguments\n" " - '*' consumes zero or more arguments (and produces a list)\n" " - '+' consumes one or more arguments (and produces a list)\n" " Note that the difference between the default and nargs=1 is that\n" " with the default, a single value will be produced, while with\n" " nargs=1, a list containing a single value will be produced.\n" "\n" " - const -- The value to be produced if the option is specified and the\n" " option uses an action that takes no values.\n" "\n" " - default -- The value to be produced if the option is not specified.\n" "\n" " - type -- A callable that accepts a single string argument, and\n" " returns the converted value. The standard Python types str, int,\n" " float, and complex are useful examples of such callables. If None,\n" " str is used.\n" "\n" " - choices -- A container of values that should be allowed. If not None,\n" " after a command-line argument has been converted to the appropriate\n" " type, an exception will be raised if it is not a member of this\n" " collection.\n" "\n" " - required -- True if the action must always be specified at the\n" " command line. This is only meaningful for optional command-line\n" " arguments.\n" "\n" " - help -- The help string describing the argument.\n" "\n" " - metavar -- The name to be used for the option's argument with the\n" " help string. If None, the 'dest' value will be used as the name." msgstr "" #: mu/modes/api/python3.py:24 msgid "" "argparse.ArgumentDefaultsHelpFormatter(prog, indent_increment=2, " "max_help_position=24, width=None) \n" "Help message formatter which adds default values to argument help.\n" "\n" "Only the name of this class is considered a public API. All the methods\n" "provided by the class are considered an implementation detail." msgstr "" #: mu/modes/api/python3.py:25 msgid "" "argparse.ArgumentError(argument, message) \n" "An error from creating or using an argument (optional or positional).\n" "\n" "The string value of this exception is the message, augmented with\n" "information about the argument that caused it." msgstr "" #: mu/modes/api/python3.py:26 msgid "" "argparse.ArgumentParser(prog=None, usage=None, description=None, " "epilog=None, parents=[], formatter_class=, " "prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, " "conflict_handler='error', add_help=True, allow_abbrev=True) \n" "Object for parsing command line strings into Python objects.\n" "\n" "Keyword Arguments:\n" " - prog -- The name of the program (default: sys.argv[0])\n" " - usage -- A usage message (default: auto-generated from arguments)\n" " - description -- A description of what the program does\n" " - epilog -- Text following the argument descriptions\n" " - parents -- Parsers whose arguments should be copied into this one\n" " - formatter_class -- HelpFormatter class for printing help messages\n" " - prefix_chars -- Characters that prefix optional arguments\n" " - fromfile_prefix_chars -- Characters that prefix files containing\n" " additional arguments\n" " - argument_default -- The default value for all arguments\n" " - conflict_handler -- String indicating how to handle conflicts\n" " - add_help -- Add a -h/-help option\n" " - allow_abbrev -- Allow long options to be abbreviated unambiguously" msgstr "" #: mu/modes/api/python3.py:27 msgid "" "argparse.ArgumentTypeError() \n" "An error from trying to convert a command line string to a type." msgstr "" #: mu/modes/api/python3.py:28 msgid "" "argparse.FileType(mode='r', bufsize=-1, encoding=None, errors=None) \n" "Factory for creating file object types\n" "\n" "Instances of FileType are typically passed as type= arguments to the\n" "ArgumentParser add_argument() method.\n" "\n" "Keyword Arguments:\n" " - mode -- A string indicating how the file is to be opened. Accepts the\n" " same values as the builtin open() function.\n" " - bufsize -- The file's desired buffer size. Accepts the same values as\n" " the builtin open() function.\n" " - encoding -- The file's encoding. Accepts the same values as the\n" " builtin open() function.\n" " - errors -- A string indicating how encoding and decoding errors are to\n" " be handled. Accepts the same value as the builtin open() function." msgstr "" #: mu/modes/api/python3.py:29 msgid "" "argparse.HelpFormatter(prog, indent_increment=2, max_help_position=24, " "width=None) \n" "Formatter for generating usage messages and argument help strings.\n" "\n" "Only the name of this class is considered a public API. All the methods\n" "provided by the class are considered an implementation detail." msgstr "" #: mu/modes/api/python3.py:30 msgid "" "argparse.MetavarTypeHelpFormatter(prog, indent_increment=2, " "max_help_position=24, width=None) \n" "Help message formatter which uses the argument 'type' as the default\n" "metavar value (instead of the argument 'dest')\n" "\n" "Only the name of this class is considered a public API. All the methods\n" "provided by the class are considered an implementation detail." msgstr "" #: mu/modes/api/python3.py:31 msgid "" "argparse.Namespace(**kwargs) \n" "Simple object for storing attributes.\n" "\n" "Implements equality by attribute names and values, and provides a simple\n" "string representation." msgstr "" #: mu/modes/api/python3.py:32 msgid "" "argparse.RawDescriptionHelpFormatter(prog, indent_increment=2, " "max_help_position=24, width=None) \n" "Help message formatter which retains any formatting in descriptions.\n" "\n" "Only the name of this class is considered a public API. All the methods\n" "provided by the class are considered an implementation detail." msgstr "" #: mu/modes/api/python3.py:33 msgid "" "argparse.RawTextHelpFormatter(prog, indent_increment=2, " "max_help_position=24, width=None) \n" "Help message formatter which retains formatting of all help text.\n" "\n" "Only the name of this class is considered a public API. All the methods\n" "provided by the class are considered an implementation detail." msgstr "" #: mu/modes/api/python3.py:34 mu/modes/api/python3.py:35 msgid "" "array.array() \n" "array(typecode [, initializer]) -> array\n" "\n" "Return a new array whose items are restricted by typecode, and\n" "initialized from the optional initializer value, which must be a list,\n" "string or iterable over elements of the appropriate type.\n" "\n" "Arrays represent basic values and behave very much like lists, except\n" "the type of objects stored in them is constrained. The type is specified\n" "at object creation time by using a type code, which is a single character.\n" "The following type codes are defined:\n" "\n" " Type code C Type Minimum size in bytes \n" " 'b' signed integer 1 \n" " 'B' unsigned integer 1 \n" " 'u' Unicode character 2 (see note) \n" " 'h' signed integer 2 \n" " 'H' unsigned integer 2 \n" " 'i' signed integer 2 \n" " 'I' unsigned integer 2 \n" " 'l' signed integer 4 \n" " 'L' unsigned integer 4 \n" " 'q' signed integer 8 (see note) \n" " 'Q' unsigned integer 8 (see note) \n" " 'f' floating point 4 \n" " 'd' floating point 8 \n" "\n" "NOTE: The 'u' typecode corresponds to Python's unicode character. On \n" "narrow builds this is 2-bytes on wide builds this is 4-bytes.\n" "\n" "NOTE: The 'q' and 'Q' type codes are only available if the platform \n" "C compiler used to build Python supports 'long long', or, on Windows, \n" "'__int64'.\n" "\n" "Methods:\n" "\n" "append() -- append a new item to the end of the array\n" "buffer_info() -- return information giving the current memory info\n" "byteswap() -- byteswap all the items of the array\n" "count() -- return number of occurrences of an object\n" "extend() -- extend array by appending multiple elements from an iterable\n" "fromfile() -- read items from a file object\n" "fromlist() -- append items from the list\n" "frombytes() -- append items from the string\n" "index() -- return index of first occurrence of an object\n" "insert() -- insert a new item into the array at a provided position\n" "pop() -- remove and return item (default last)\n" "remove() -- remove first occurrence of an object\n" "reverse() -- reverse the order of the items in the array\n" "tofile() -- write all items to a file object\n" "tolist() -- return the array converted to an ordinary list\n" "tobytes() -- return the array converted to a string\n" "\n" "Attributes:\n" "\n" "typecode -- the typecode character used to create the array\n" "itemsize -- the length in bytes of one array item" msgstr "" #: mu/modes/api/python3.py:36 msgid "" "base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \\t\\n" "\\r\\x0b') \n" "Decode the Ascii85 encoded bytes-like object or ASCII string b.\n" "\n" "foldspaces is a flag that specifies whether the 'y' short sequence should " "be\n" "accepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature " "is\n" "not supported by the \"standard\" Adobe encoding.\n" "\n" "adobe controls whether the input sequence is in Adobe Ascii85 format (i.e.\n" "is framed with <~ and ~>).\n" "\n" "ignorechars should be a byte string containing characters to ignore from " "the\n" "input. This should only contain whitespace characters, and by default\n" "contains all whitespace characters in ASCII.\n" "\n" "The result is returned as a bytes object." msgstr "" #: mu/modes/api/python3.py:37 msgid "" "base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, " "adobe=False) \n" "Encode bytes-like object b using Ascii85 and return a bytes object.\n" "\n" "foldspaces is an optional flag that uses the special short sequence 'y'\n" "instead of 4 consecutive spaces (ASCII 0x20) as supported by 'btoa'. This\n" "feature is not supported by the \"standard\" Adobe encoding.\n" "\n" "wrapcol controls whether the output should have newline (b'\\n') characters\n" "added to it. If this is non-zero, each output line will be at most this\n" "many characters long.\n" "\n" "pad controls whether the input is padded to a multiple of 4 before\n" "encoding. Note that the btoa implementation always pads.\n" "\n" "adobe controls whether the encoded byte sequence is framed with <~ and ~>,\n" "which is used by the Adobe implementation." msgstr "" #: mu/modes/api/python3.py:38 msgid "" "base64.b16decode(s, casefold=False) \n" "Decode the Base16 encoded bytes-like object or ASCII string s.\n" "\n" "Optional casefold is a flag specifying whether a lowercase alphabet is\n" "acceptable as input. For security purposes, the default is False.\n" "\n" "The result is returned as a bytes object. A binascii.Error is raised if\n" "s is incorrectly padded or if there are non-alphabet characters present\n" "in the input." msgstr "" #: mu/modes/api/python3.py:39 msgid "" "base64.b16encode(s) \n" "Encode the bytes-like object s using Base16 and return a bytes object.\n" " " msgstr "" #: mu/modes/api/python3.py:40 msgid "" "base64.b32decode(s, casefold=False, map01=None) \n" "Decode the Base32 encoded bytes-like object or ASCII string s.\n" "\n" "Optional casefold is a flag specifying whether a lowercase alphabet is\n" "acceptable as input. For security purposes, the default is False.\n" "\n" "RFC 3548 allows for optional mapping of the digit 0 (zero) to the\n" "letter O (oh), and for optional mapping of the digit 1 (one) to\n" "either the letter I (eye) or letter L (el). The optional argument\n" "map01 when not None, specifies which letter the digit 1 should be\n" "mapped to (when map01 is not None, the digit 0 is always mapped to\n" "the letter O). For security purposes the default is None, so that\n" "0 and 1 are not allowed in the input.\n" "\n" "The result is returned as a bytes object. A binascii.Error is raised if\n" "the input is incorrectly padded or if there are non-alphabet\n" "characters present in the input." msgstr "" #: mu/modes/api/python3.py:41 msgid "" "base64.b32encode(s) \n" "Encode the bytes-like object s using Base32 and return a bytes object.\n" " " msgstr "" #: mu/modes/api/python3.py:42 msgid "" "base64.b64decode(s, altchars=None, validate=False) \n" "Decode the Base64 encoded bytes-like object or ASCII string s.\n" "\n" "Optional altchars must be a bytes-like object or ASCII string of length 2\n" "which specifies the alternative alphabet used instead of the '+' and '/'\n" "characters.\n" "\n" "The result is returned as a bytes object. A binascii.Error is raised if\n" "s is incorrectly padded.\n" "\n" "If validate is False (the default), characters that are neither in the\n" "normal base-64 alphabet nor the alternative alphabet are discarded prior\n" "to the padding check. If validate is True, these non-alphabet characters\n" "in the input result in a binascii.Error." msgstr "" #: mu/modes/api/python3.py:43 msgid "" "base64.b64encode(s, altchars=None) \n" "Encode the bytes-like object s using Base64 and return a bytes object.\n" "\n" "Optional altchars should be a byte string of length 2 which specifies an\n" "alternative alphabet for the '+' and '/' characters. This allows an\n" "application to e.g. generate url or filesystem safe Base64 strings." msgstr "" #: mu/modes/api/python3.py:44 msgid "" "base64.b85decode(b) \n" "Decode the base85-encoded bytes-like object or ASCII string b\n" "\n" "The result is returned as a bytes object." msgstr "" #: mu/modes/api/python3.py:45 msgid "" "base64.b85encode(b, pad=False) \n" "Encode bytes-like object b in base85 format and return a bytes object.\n" "\n" "If pad is true, the input is padded with b'\\0' so its length is a multiple " "of\n" "4 bytes before encoding." msgstr "" #: mu/modes/api/python3.py:46 msgid "" "base64.binascii() \n" "Conversion between binary data and ASCII" msgstr "" #: mu/modes/api/python3.py:47 msgid "" "base64.decode(input, output) \n" "Decode a file; input and output are binary files." msgstr "" #: mu/modes/api/python3.py:48 msgid "" "base64.decodebytes(s) \n" "Decode a bytestring of base-64 data into a bytes object." msgstr "" #: mu/modes/api/python3.py:49 msgid "" "base64.decodestring(s) \n" "Legacy alias of decodebytes()." msgstr "" #: mu/modes/api/python3.py:50 msgid "" "base64.encode(input, output) \n" "Encode a file; input and output are binary files." msgstr "" #: mu/modes/api/python3.py:51 msgid "" "base64.encodebytes(s) \n" "Encode a bytestring into a bytes object containing multiple lines\n" "of base-64 data." msgstr "" #: mu/modes/api/python3.py:52 msgid "" "base64.encodestring(s) \n" "Legacy alias of encodebytes()." msgstr "" #: mu/modes/api/python3.py:53 msgid "" "base64.main() \n" "Small main program" msgstr "" #: mu/modes/api/python3.py:54 msgid "" "base64.re() \n" "Support for regular expressions (RE).\n" "\n" "This module provides regular expression matching operations similar to\n" "those found in Perl. It supports both 8-bit and Unicode strings; both\n" "the pattern and the strings being processed can contain null bytes and\n" "characters outside the US ASCII range.\n" "\n" "Regular expressions can contain both special and ordinary characters.\n" "Most ordinary characters, like \"A\", \"a\", or \"0\", are the simplest\n" "regular expressions; they simply match themselves. You can\n" "concatenate ordinary characters, so last matches the string 'last'.\n" "\n" "The special characters are:\n" " \".\" Matches any character except a newline.\n" " \"^\" Matches the start of the string.\n" " \"$\" Matches the end of the string or just before the newline at\n" " the end of the string.\n" " \"*\" Matches 0 or more (greedy) repetitions of the preceding RE.\n" " Greedy means that it will match as many repetitions as " "possible.\n" " \"+\" Matches 1 or more (greedy) repetitions of the preceding RE.\n" " \"?\" Matches 0 or 1 (greedy) of the preceding RE.\n" " *?,+?,?? Non-greedy versions of the previous three special characters.\n" " {m,n} Matches from m to n repetitions of the preceding RE.\n" " {m,n}? Non-greedy version of the above.\n" " \"\\\\\" Either escapes special characters or signals a special " "sequence.\n" " [] Indicates a set of characters.\n" " A \"^\" as the first character indicates a complementing set.\n" " \"|\" A|B, creates an RE that will match either A or B.\n" " (...) Matches the RE inside the parentheses.\n" " The contents can be retrieved or matched later in the string.\n" " (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below).\n" " (?:...) Non-grouping version of regular parentheses.\n" " (?P...) The substring matched by the group is accessible by name.\n" " (?P=name) Matches the text matched earlier by the group named name.\n" " (?#...) A comment; ignored.\n" " (?=...) Matches if ... matches next, but doesn't consume the string.\n" " (?!...) Matches if ... doesn't match next.\n" " (?<=...) Matches if preceded by ... (must be fixed length).\n" " (?: big-endian, std. size & alignment\n" " !: same as >\n" "\n" "The remaining chars indicate types of args and must match exactly;\n" "these can be preceded by a decimal repeat count:\n" " x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n" " ?: _Bool (requires C99; if not available, char is used instead)\n" " h:short; H:unsigned short; i:int; I:unsigned int;\n" " l:long; L:unsigned long; f:float; d:double; e:half-float.\n" "Special cases (preceding decimal count indicates length):\n" " s:string (array of char); p: pascal string (with count byte).\n" "Special cases (only available in native format):\n" " n:ssize_t; N:size_t;\n" " P:an integer type that is wide enough to hold a pointer.\n" "Special case (not in native mode unless 'long long' in platform C):\n" " q:long long; Q:unsigned long long\n" "Whitespace between formats is ignored.\n" "\n" "The variable struct.error is an exception raised on errors." msgstr "" #: mu/modes/api/python3.py:58 msgid "" "base64.urlsafe_b64decode(s) \n" "Decode bytes using the URL- and filesystem-safe Base64 alphabet.\n" "\n" "Argument s is a bytes-like object or ASCII string to decode. The result\n" "is returned as a bytes object. A binascii.Error is raised if the input\n" "is incorrectly padded. Characters that are not in the URL-safe base-64\n" "alphabet, and are not a plus '+' or slash '/', are discarded prior to the\n" "padding check.\n" "\n" "The alphabet uses '-' instead of '+' and '_' instead of '/'." msgstr "" #: mu/modes/api/python3.py:59 msgid "" "base64.urlsafe_b64encode(s) \n" "Encode bytes using the URL- and filesystem-safe Base64 alphabet.\n" "\n" "Argument s is a bytes-like object to encode. The result is returned as a\n" "bytes object. The alphabet uses '-' instead of '+' and '_' instead of\n" "'/'." msgstr "" #: mu/modes/api/python3.py:60 msgid "" "collections.ByteString() \n" "This unifies bytes and bytearray.\n" "\n" "XXX Should add all their methods." msgstr "" #: mu/modes/api/python3.py:61 msgid "" "collections.ChainMap(*maps) \n" "A ChainMap groups multiple dicts (or other mappings) together\n" "to create a single, updateable view.\n" "\n" "The underlying mappings are stored in a list. That list is public and can\n" "be accessed or updated using the *maps* attribute. There is no other\n" "state.\n" "\n" "Lookups search the underlying mappings successively until a key is found.\n" "In contrast, writes, updates, and deletions only operate on the first\n" "mapping." msgstr "" #: mu/modes/api/python3.py:62 msgid "" "collections.Counter(*args, **kwds) \n" "Dict subclass for counting hashable items. Sometimes called a bag\n" "or multiset. Elements are stored as dictionary keys and their counts\n" "are stored as dictionary values.\n" "\n" ">>> c = Counter('abcdeabcdabcaba') # count elements from a string\n" "\n" ">>> c.most_common(3) # three most common elements\n" "[('a', 5), ('b', 4), ('c', 3)]\n" ">>> sorted(c) # list all unique elements\n" "['a', 'b', 'c', 'd', 'e']\n" ">>> ''.join(sorted(c.elements())) # list elements with repetitions\n" "'aaaaabbbbcccdde'\n" ">>> sum(c.values()) # total of all counts\n" "15\n" "\n" ">>> c['a'] # count of letter 'a'\n" "5\n" ">>> for elem in 'shazam': # update counts from an iterable\n" "... c[elem] += 1 # by adding 1 to each element's count\n" ">>> c['a'] # now there are seven 'a'\n" "7\n" ">>> del c['b'] # remove all 'b'\n" ">>> c['b'] # now there are zero 'b'\n" "0\n" "\n" ">>> d = Counter('simsalabim') # make another counter\n" ">>> c.update(d) # add in the second counter\n" ">>> c['a'] # now there are nine 'a'\n" "9\n" "\n" ">>> c.clear() # empty the counter\n" ">>> c\n" "Counter()\n" "\n" "Note: If a count is set to zero or reduced to zero, it will remain\n" "in the counter until the entry is deleted or the counter is cleared:\n" "\n" ">>> c = Counter('aaabbc')\n" ">>> c['b'] -= 2 # reduce the count of 'b' by two\n" ">>> c.most_common() # 'b' is still in, but its count is " "zero\n" "[('a', 3), ('c', 1), ('b', 0)]" msgstr "" #: mu/modes/api/python3.py:63 msgid "" "collections.ItemsView(mapping) \n" "A set is a finite, iterable container.\n" "\n" "This class provides concrete generic implementations of all\n" "methods except for __contains__, __iter__ and __len__.\n" "\n" "To override the comparisons (presumably for speed, as the\n" "semantics are fixed), redefine __le__ and __ge__,\n" "then the other operations will automatically follow suit." msgstr "" #: mu/modes/api/python3.py:64 msgid "" "collections.KeysView(mapping) \n" "A set is a finite, iterable container.\n" "\n" "This class provides concrete generic implementations of all\n" "methods except for __contains__, __iter__ and __len__.\n" "\n" "To override the comparisons (presumably for speed, as the\n" "semantics are fixed), redefine __le__ and __ge__,\n" "then the other operations will automatically follow suit." msgstr "" #: mu/modes/api/python3.py:65 msgid "" "collections.MutableSequence() \n" "All the operations on a read-only sequence.\n" "\n" "Concrete subclasses must override __new__ or __init__,\n" "__getitem__, and __len__." msgstr "" #: mu/modes/api/python3.py:66 msgid "" "collections.MutableSet() \n" "A mutable set is a finite, iterable container.\n" "\n" "This class provides concrete generic implementations of all\n" "methods except for __contains__, __iter__, __len__,\n" "add(), and discard().\n" "\n" "To override the comparisons (presumably for speed, as the\n" "semantics are fixed), all you have to do is redefine __le__ and\n" "then the other operations will automatically follow suit." msgstr "" #: mu/modes/api/python3.py:67 msgid "" "collections.OrderedDict() \n" "Dictionary that remembers insertion order" msgstr "" #: mu/modes/api/python3.py:68 msgid "" "collections.Sequence() \n" "All the operations on a read-only sequence.\n" "\n" "Concrete subclasses must override __new__ or __init__,\n" "__getitem__, and __len__." msgstr "" #: mu/modes/api/python3.py:69 msgid "" "collections.Set() \n" "A set is a finite, iterable container.\n" "\n" "This class provides concrete generic implementations of all\n" "methods except for __contains__, __iter__ and __len__.\n" "\n" "To override the comparisons (presumably for speed, as the\n" "semantics are fixed), redefine __le__ and __ge__,\n" "then the other operations will automatically follow suit." msgstr "" #: mu/modes/api/python3.py:70 msgid "" "collections.UserList(initlist=None) \n" "A more or less complete user-defined wrapper around list objects." msgstr "" #: mu/modes/api/python3.py:71 msgid "" "collections.UserString(seq) \n" "All the operations on a read-only sequence.\n" "\n" "Concrete subclasses must override __new__ or __init__,\n" "__getitem__, and __len__." msgstr "" #: mu/modes/api/python3.py:72 msgid "" "collections.defaultdict() \n" "defaultdict(default_factory[, ...]) --> dict with default factory\n" "\n" "The default factory is called without arguments to produce\n" "a new value when a key is not present, in __getitem__ only.\n" "A defaultdict compares equal to a dict with the same items.\n" "All remaining arguments are treated the same as if they were\n" "passed to the dict constructor, including keyword arguments." msgstr "" #: mu/modes/api/python3.py:73 msgid "" "collections.deque() \n" "deque([iterable[, maxlen]]) --> deque object\n" "\n" "A list-like sequence optimized for data accesses near its endpoints." msgstr "" #: mu/modes/api/python3.py:74 msgid "" "collections.namedtuple(typename, field_names, *, verbose=False, " "rename=False, module=None) \n" "Returns a new subclass of tuple with named fields.\n" "\n" ">>> Point = namedtuple('Point', ['x', 'y'])\n" ">>> Point.__doc__ # docstring for the new class\n" "'Point(x, y)'\n" ">>> p = Point(11, y=22) # instantiate with positional args or " "keywords\n" ">>> p[0] + p[1] # indexable like a plain tuple\n" "33\n" ">>> x, y = p # unpack like a regular tuple\n" ">>> x, y\n" "(11, 22)\n" ">>> p.x + p.y # fields also accessible by name\n" "33\n" ">>> d = p._asdict() # convert to a dictionary\n" ">>> d['x']\n" "11\n" ">>> Point(**d) # convert from a dictionary\n" "Point(x=11, y=22)\n" ">>> p._replace(x=100) # _replace() is like str.replace() but " "targets named fields\n" "Point(x=100, y=22)" msgstr "" #: mu/modes/api/python3.py:75 msgid "" "csv.Dialect() \n" "Describe a CSV dialect.\n" "\n" "This must be subclassed (see csv.excel). Valid attributes are:\n" "delimiter, quotechar, escapechar, doublequote, skipinitialspace,\n" "lineterminator, quoting." msgstr "" #: mu/modes/api/python3.py:76 msgid "" "csv.Error() \n" "Common base class for all non-exit exceptions." msgstr "" #: mu/modes/api/python3.py:77 msgid "" "csv.OrderedDict() \n" "Dictionary that remembers insertion order" msgstr "" #: mu/modes/api/python3.py:78 msgid "" "csv.Sniffer() \n" "\"Sniffs\" the format of a CSV file (i.e. delimiter, quotechar)\n" "Returns a Dialect object." msgstr "" #: mu/modes/api/python3.py:79 msgid "" "csv.StringIO(initial_value='', newline='\\n') \n" "Text I/O implementation using an in-memory buffer.\n" "\n" "The initial_value argument sets the value of object. The newline\n" "argument is like the one of TextIOWrapper's constructor." msgstr "" #: mu/modes/api/python3.py:80 msgid "" "csv.excel() \n" "Describe the usual properties of Excel-generated CSV files." msgstr "" #: mu/modes/api/python3.py:81 msgid "" "csv.excel_tab() \n" "Describe the usual properties of Excel-generated TAB-delimited files." msgstr "" #: mu/modes/api/python3.py:82 msgid "" "csv.field_size_limit() \n" "Sets an upper limit on parsed fields.\n" " csv.field_size_limit([limit])\n" "\n" "Returns old limit. If limit is not given, no new limit is set and\n" "the old limit is returned" msgstr "" #: mu/modes/api/python3.py:83 msgid "" "csv.get_dialect() \n" "Return the dialect instance associated with name.\n" "dialect = csv.get_dialect(name)" msgstr "" #: mu/modes/api/python3.py:84 msgid "" "csv.list_dialects() \n" "Return a list of all know dialect names.\n" "names = csv.list_dialects()" msgstr "" #: mu/modes/api/python3.py:85 msgid "" "csv.re() \n" "Support for regular expressions (RE).\n" "\n" "This module provides regular expression matching operations similar to\n" "those found in Perl. It supports both 8-bit and Unicode strings; both\n" "the pattern and the strings being processed can contain null bytes and\n" "characters outside the US ASCII range.\n" "\n" "Regular expressions can contain both special and ordinary characters.\n" "Most ordinary characters, like \"A\", \"a\", or \"0\", are the simplest\n" "regular expressions; they simply match themselves. You can\n" "concatenate ordinary characters, so last matches the string 'last'.\n" "\n" "The special characters are:\n" " \".\" Matches any character except a newline.\n" " \"^\" Matches the start of the string.\n" " \"$\" Matches the end of the string or just before the newline at\n" " the end of the string.\n" " \"*\" Matches 0 or more (greedy) repetitions of the preceding RE.\n" " Greedy means that it will match as many repetitions as " "possible.\n" " \"+\" Matches 1 or more (greedy) repetitions of the preceding RE.\n" " \"?\" Matches 0 or 1 (greedy) of the preceding RE.\n" " *?,+?,?? Non-greedy versions of the previous three special characters.\n" " {m,n} Matches from m to n repetitions of the preceding RE.\n" " {m,n}? Non-greedy version of the above.\n" " \"\\\\\" Either escapes special characters or signals a special " "sequence.\n" " [] Indicates a set of characters.\n" " A \"^\" as the first character indicates a complementing set.\n" " \"|\" A|B, creates an RE that will match either A or B.\n" " (...) Matches the RE inside the parentheses.\n" " The contents can be retrieved or matched later in the string.\n" " (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below).\n" " (?:...) Non-grouping version of regular parentheses.\n" " (?P...) The substring matched by the group is accessible by name.\n" " (?P=name) Matches the text matched earlier by the group named name.\n" " (?#...) A comment; ignored.\n" " (?=...) Matches if ... matches next, but doesn't consume the string.\n" " (?!...) Matches if ... doesn't match next.\n" " (?<=...) Matches if preceded by ... (must be fixed length).\n" " (? date object" msgstr "" #: mu/modes/api/python3.py:93 mu/modes/api/python3.py:94 msgid "" "datetime.datetime() \n" "datetime(year, month, day[, hour[, minute[, second[, microsecond[," "tzinfo]]]]])\n" "\n" "The year, month and day arguments are required. tzinfo may be None, or an\n" "instance of a tzinfo subclass. The remaining arguments may be ints." msgstr "" #: mu/modes/api/python3.py:95 mu/modes/api/python3.py:96 msgid "" "datetime.time() \n" "time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n" "\n" "All arguments are optional. tzinfo may be None, or an instance of\n" "a tzinfo subclass. The remaining arguments may be ints." msgstr "" #: mu/modes/api/python3.py:97 mu/modes/api/python3.py:98 msgid "" "datetime.timedelta() \n" "Difference between two datetime values." msgstr "" #: mu/modes/api/python3.py:99 mu/modes/api/python3.py:100 msgid "" "datetime.timezone() \n" "Fixed offset from UTC implementation of tzinfo." msgstr "" #: mu/modes/api/python3.py:101 mu/modes/api/python3.py:102 msgid "" "datetime.tzinfo() \n" "Abstract base class for time zone info objects." msgstr "" #: mu/modes/api/python3.py:103 msgid "" "functools.WeakKeyDictionary(dict=None) \n" "Mapping class that references keys weakly.\n" "\n" "Entries in the dictionary will be discarded when there is no\n" "longer a strong reference to the key. This can be used to\n" "associate additional data with an object owned by other parts of\n" "an application without adding attributes to those objects. This\n" "can be especially useful with objects that override attribute\n" "accesses." msgstr "" #: mu/modes/api/python3.py:104 msgid "" "functools.cmp_to_key() \n" "Convert a cmp= function into a key= function." msgstr "" #: mu/modes/api/python3.py:105 msgid "" "functools.get_cache_token() \n" "Returns the current ABC cache token.\n" "\n" "The token is an opaque object (supporting equality testing) identifying the\n" "current version of the ABC cache for virtual subclasses. The token changes\n" "with every call to ``register()`` on any ABC." msgstr "" #: mu/modes/api/python3.py:106 msgid "" "functools.lru_cache(maxsize=128, typed=False) \n" "Least-recently-used cache decorator.\n" "\n" "If *maxsize* is set to None, the LRU features are disabled and the cache\n" "can grow without bound.\n" "\n" "If *typed* is True, arguments of different types will be cached separately.\n" "For example, f(3.0) and f(3) will be treated as distinct calls with\n" "distinct results.\n" "\n" "Arguments to the cached function must be hashable.\n" "\n" "View the cache statistics named tuple (hits, misses, maxsize, currsize)\n" "with f.cache_info(). Clear the cache and statistics with f.cache_clear().\n" "Access the underlying function with f.__wrapped__.\n" "\n" "See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used" msgstr "" #: mu/modes/api/python3.py:107 msgid "" "functools.namedtuple(typename, field_names, *, verbose=False, rename=False, " "module=None) \n" "Returns a new subclass of tuple with named fields.\n" "\n" ">>> Point = namedtuple('Point', ['x', 'y'])\n" ">>> Point.__doc__ # docstring for the new class\n" "'Point(x, y)'\n" ">>> p = Point(11, y=22) # instantiate with positional args or " "keywords\n" ">>> p[0] + p[1] # indexable like a plain tuple\n" "33\n" ">>> x, y = p # unpack like a regular tuple\n" ">>> x, y\n" "(11, 22)\n" ">>> p.x + p.y # fields also accessible by name\n" "33\n" ">>> d = p._asdict() # convert to a dictionary\n" ">>> d['x']\n" "11\n" ">>> Point(**d) # convert from a dictionary\n" "Point(x=11, y=22)\n" ">>> p._replace(x=100) # _replace() is like str.replace() but " "targets named fields\n" "Point(x=100, y=22)" msgstr "" #: mu/modes/api/python3.py:108 msgid "" "functools.partial() \n" "partial(func, *args, **keywords) - new function with partial application\n" "of the given arguments and keywords." msgstr "" #: mu/modes/api/python3.py:109 msgid "" "functools.partialmethod(func, *args, **keywords) \n" "Method descriptor with partial application of the given arguments\n" "and keywords.\n" "\n" "Supports wrapping existing descriptors and handles non-descriptor\n" "callables as instance methods." msgstr "" #: mu/modes/api/python3.py:110 msgid "" "functools.recursive_repr(fillvalue='...') \n" "Decorator to make a repr function return fillvalue for a recursive call" msgstr "" #: mu/modes/api/python3.py:111 msgid "" "functools.reduce() \n" "reduce(function, sequence[, initial]) -> value\n" "\n" "Apply a function of two arguments cumulatively to the items of a sequence,\n" "from left to right, so as to reduce the sequence to a single value.\n" "For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n" "((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n" "of the sequence in the calculation, and serves as a default when the\n" "sequence is empty." msgstr "" #: mu/modes/api/python3.py:112 msgid "" "functools.singledispatch(func) \n" "Single-dispatch generic function decorator.\n" "\n" "Transforms a function into a generic function, which can have different\n" "behaviours depending upon the type of its first argument. The decorated\n" "function acts as the default implementation, and additional\n" "implementations can be registered using the register() attribute of the\n" "generic function." msgstr "" #: mu/modes/api/python3.py:113 msgid "" "functools.total_ordering(cls) \n" "Class decorator that fills in missing ordering methods" msgstr "" #: mu/modes/api/python3.py:114 msgid "" "functools.update_wrapper(wrapper, wrapped, assigned='__module__', " "'__name__', '__qualname__', '__doc__', '__annotations__', " "updated='__dict__',) \n" "Update a wrapper function to look like the wrapped function\n" "\n" "wrapper is the function to be updated\n" "wrapped is the original function\n" "assigned is a tuple naming the attributes assigned directly\n" "from the wrapped function to the wrapper function (defaults to\n" "functools.WRAPPER_ASSIGNMENTS)\n" "updated is a tuple naming the attributes of the wrapper that\n" "are updated with the corresponding attribute from the wrapped\n" "function (defaults to functools.WRAPPER_UPDATES)" msgstr "" #: mu/modes/api/python3.py:115 msgid "" "functools.wraps(wrapped, assigned='__module__', '__name__', '__qualname__', " "'__doc__', '__annotations__', updated='__dict__',) \n" "Decorator factory to apply update_wrapper() to a wrapper function\n" "\n" "Returns a decorator that invokes update_wrapper() with the decorated\n" "function as the wrapper argument and the arguments to wraps() as the\n" "remaining arguments. Default arguments are as for update_wrapper().\n" "This is a convenience function to simplify applying partial() to\n" "update_wrapper()." msgstr "" #: mu/modes/api/python3.py:116 msgid "" "hashlib.__hash_new(name, data=b'', **kwargs) \n" "new(name, data=b'') - Return a new hashing object using the named " "algorithm;\n" "optionally initialized with data (which must be bytes)." msgstr "" #: mu/modes/api/python3.py:117 msgid "" "hashlib.blake2b() \n" "Return a new BLAKE2b hash object." msgstr "" #: mu/modes/api/python3.py:118 msgid "" "hashlib.blake2s() \n" "Return a new BLAKE2s hash object." msgstr "" #: mu/modes/api/python3.py:119 msgid "" "hashlib.openssl_md5() \n" "Returns a md5 hash object; optionally initialized with a string" msgstr "" #: mu/modes/api/python3.py:120 msgid "" "hashlib.openssl_sha1() \n" "Returns a sha1 hash object; optionally initialized with a string" msgstr "" #: mu/modes/api/python3.py:121 msgid "" "hashlib.openssl_sha224() \n" "Returns a sha224 hash object; optionally initialized with a string" msgstr "" #: mu/modes/api/python3.py:122 msgid "" "hashlib.openssl_sha256() \n" "Returns a sha256 hash object; optionally initialized with a string" msgstr "" #: mu/modes/api/python3.py:123 msgid "" "hashlib.openssl_sha384() \n" "Returns a sha384 hash object; optionally initialized with a string" msgstr "" #: mu/modes/api/python3.py:124 msgid "" "hashlib.openssl_sha512() \n" "Returns a sha512 hash object; optionally initialized with a string" msgstr "" #: mu/modes/api/python3.py:125 msgid "" "hashlib.pbkdf2_hmac() \n" "pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n" "\n" "Password based key derivation function 2 (PKCS #5 v2.0) with HMAC as\n" "pseudorandom function." msgstr "" #: mu/modes/api/python3.py:126 msgid "" "hashlib.sha3_224(string=None) \n" "Return a new SHA3 hash object with a hashbit length of 28 bytes." msgstr "" #: mu/modes/api/python3.py:127 msgid "" "hashlib.sha3_256() \n" "sha3_256([string]) -> SHA3 object\n" "\n" "Return a new SHA3 hash object with a hashbit length of 32 bytes." msgstr "" #: mu/modes/api/python3.py:128 msgid "" "hashlib.sha3_384() \n" "sha3_384([string]) -> SHA3 object\n" "\n" "Return a new SHA3 hash object with a hashbit length of 48 bytes." msgstr "" #: mu/modes/api/python3.py:129 msgid "" "hashlib.sha3_512() \n" "sha3_512([string]) -> SHA3 object\n" "\n" "Return a new SHA3 hash object with a hashbit length of 64 bytes." msgstr "" #: mu/modes/api/python3.py:130 msgid "" "hashlib.shake_128() \n" "shake_128([string]) -> SHAKE object\n" "\n" "Return a new SHAKE hash object." msgstr "" #: mu/modes/api/python3.py:131 msgid "" "hashlib.shake_256() \n" "shake_256([string]) -> SHAKE object\n" "\n" "Return a new SHAKE hash object." msgstr "" #: mu/modes/api/python3.py:132 msgid "" "itertools.accumulate() \n" "accumulate(iterable[, func]) --> accumulate object\n" "\n" "Return series of accumulated sums (or other binary function results)." msgstr "" #: mu/modes/api/python3.py:133 msgid "" "itertools.chain() \n" "chain(*iterables) --> chain object\n" "\n" "Return a chain object whose .__next__() method returns elements from the\n" "first iterable until it is exhausted, then elements from the next\n" "iterable, until all of the iterables are exhausted." msgstr "" #: mu/modes/api/python3.py:134 msgid "" "itertools.combinations() \n" "combinations(iterable, r) --> combinations object\n" "\n" "Return successive r-length combinations of elements in the iterable.\n" "\n" "combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)" msgstr "" #: mu/modes/api/python3.py:135 msgid "" "itertools.combinations_with_replacement() \n" "combinations_with_replacement(iterable, r) --> combinations_with_replacement " "object\n" "\n" "Return successive r-length combinations of elements in the iterable\n" "allowing individual elements to have successive repeats.\n" "combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC" msgstr "" #: mu/modes/api/python3.py:136 msgid "" "itertools.compress() \n" "compress(data, selectors) --> iterator over selected data\n" "\n" "Return data elements corresponding to true selector elements.\n" "Forms a shorter iterator from selected data elements using the\n" "selectors to choose the data elements." msgstr "" #: mu/modes/api/python3.py:137 msgid "" "itertools.count() \n" "count(start=0, step=1) --> count object\n" "\n" "Return a count object whose .__next__() method returns consecutive values.\n" "Equivalent to:\n" "\n" " def count(firstval=0, step=1):\n" " x = firstval\n" " while 1:\n" " yield x\n" " x += step" msgstr "" #: mu/modes/api/python3.py:138 msgid "" "itertools.cycle() \n" "cycle(iterable) --> cycle object\n" "\n" "Return elements from the iterable until it is exhausted.\n" "Then repeat the sequence indefinitely." msgstr "" #: mu/modes/api/python3.py:139 msgid "" "itertools.dropwhile() \n" "dropwhile(predicate, iterable) --> dropwhile object\n" "\n" "Drop items from the iterable while predicate(item) is true.\n" "Afterwards, return every element until the iterable is exhausted." msgstr "" #: mu/modes/api/python3.py:140 msgid "" "itertools.filterfalse() \n" "filterfalse(function or None, sequence) --> filterfalse object\n" "\n" "Return those items of sequence for which function(item) is false.\n" "If function is None, return the items that are false." msgstr "" #: mu/modes/api/python3.py:141 msgid "" "itertools.groupby() \n" "groupby(iterable[, keyfunc]) -> create an iterator which returns\n" "(key, sub-iterator) grouped by each value of key(value)." msgstr "" #: mu/modes/api/python3.py:142 msgid "" "itertools.islice() \n" "islice(iterable, stop) --> islice object\n" "islice(iterable, start, stop[, step]) --> islice object\n" "\n" "Return an iterator whose next() method returns selected values from an\n" "iterable. If start is specified, will skip all preceding elements;\n" "otherwise, start defaults to zero. Step defaults to one. If\n" "specified as another value, step determines how many values are \n" "skipped between successive calls. Works like a slice() on a list\n" "but returns an iterator." msgstr "" #: mu/modes/api/python3.py:143 msgid "" "itertools.permutations() \n" "permutations(iterable[, r]) --> permutations object\n" "\n" "Return successive r-length permutations of elements in the iterable.\n" "\n" "permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)" msgstr "" #: mu/modes/api/python3.py:144 msgid "" "itertools.product() \n" "product(*iterables, repeat=1) --> product object\n" "\n" "Cartesian product of input iterables. Equivalent to nested for-loops.\n" "\n" "For example, product(A, B) returns the same as: ((x,y) for x in A for y in " "B).\n" "The leftmost iterators are in the outermost for-loop, so the output tuples\n" "cycle in a manner similar to an odometer (with the rightmost element " "changing\n" "on every iteration).\n" "\n" "To compute the product of an iterable with itself, specify the number\n" "of repetitions with the optional repeat keyword argument. For example,\n" "product(A, repeat=4) means the same as product(A, A, A, A).\n" "\n" "product('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\n" "product((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ..." msgstr "" #: mu/modes/api/python3.py:145 msgid "" "itertools.repeat() \n" "repeat(object [,times]) -> create an iterator which returns the object\n" "for the specified number of times. If not specified, returns the object\n" "endlessly." msgstr "" #: mu/modes/api/python3.py:146 msgid "" "itertools.starmap() \n" "starmap(function, sequence) --> starmap object\n" "\n" "Return an iterator whose values are returned from the function evaluated\n" "with an argument tuple taken from the given sequence." msgstr "" #: mu/modes/api/python3.py:147 msgid "" "itertools.takewhile() \n" "takewhile(predicate, iterable) --> takewhile object\n" "\n" "Return successive entries from an iterable as long as the \n" "predicate evaluates to true for each entry." msgstr "" #: mu/modes/api/python3.py:148 msgid "" "itertools.tee() \n" "tee(iterable, n=2) --> tuple of n independent iterators." msgstr "" #: mu/modes/api/python3.py:149 msgid "" "itertools.zip_longest() \n" "zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\n" "\n" "Return a zip_longest object whose .__next__() method returns a tuple where\n" "the i-th element comes from the i-th iterable argument. The .__next__()\n" "method continues until the longest iterable in the argument sequence\n" "is exhausted and then it raises StopIteration. When the shorter iterables\n" "are exhausted, the fillvalue is substituted in their place. The fillvalue\n" "defaults to None or can be specified by a keyword argument." msgstr "" #: mu/modes/api/python3.py:150 msgid "" "json.JSONDecodeError(msg, doc, pos) \n" "Subclass of ValueError with the following additional properties:\n" "\n" "msg: The unformatted error message\n" "doc: The JSON document being parsed\n" "pos: The start index of doc where parsing failed\n" "lineno: The line corresponding to pos\n" "colno: The column corresponding to pos" msgstr "" #: mu/modes/api/python3.py:151 msgid "" "json.JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, " "parse_constant=None, strict=True, object_pairs_hook=None) \n" "Simple JSON decoder\n" "\n" "Performs the following translations in decoding by default:\n" "\n" "+---------------+-------------------+\n" "| JSON | Python |\n" "+===============+===================+\n" "| object | dict |\n" "+---------------+-------------------+\n" "| array | list |\n" "+---------------+-------------------+\n" "| string | str |\n" "+---------------+-------------------+\n" "| number (int) | int |\n" "+---------------+-------------------+\n" "| number (real) | float |\n" "+---------------+-------------------+\n" "| true | True |\n" "+---------------+-------------------+\n" "| false | False |\n" "+---------------+-------------------+\n" "| null | None |\n" "+---------------+-------------------+\n" "\n" "It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as\n" "their corresponding ``float`` values, which is outside the JSON spec." msgstr "" #: mu/modes/api/python3.py:152 msgid "" "json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, " "allow_nan=True, sort_keys=False, indent=None, separators=None, " "default=None) \n" "Extensible JSON encoder for Python data structures.\n" "\n" "Supports the following objects and types by default:\n" "\n" "+-------------------+---------------+\n" "| Python | JSON |\n" "+===================+===============+\n" "| dict | object |\n" "+-------------------+---------------+\n" "| list, tuple | array |\n" "+-------------------+---------------+\n" "| str | string |\n" "+-------------------+---------------+\n" "| int, float | number |\n" "+-------------------+---------------+\n" "| True | true |\n" "+-------------------+---------------+\n" "| False | false |\n" "+-------------------+---------------+\n" "| None | null |\n" "+-------------------+---------------+\n" "\n" "To extend this to recognize other objects, subclass and implement a\n" "``.default()`` method with another method that returns a serializable\n" "object for ``o`` if possible, otherwise it should call the superclass\n" "implementation (to raise ``TypeError``)." msgstr "" #: mu/modes/api/python3.py:153 msgid "" "json.codecs() \n" "codecs -- Python Codec Registry, API and helpers.\n" "\n" "\n" "Written by Marc-Andre Lemburg (mal@lemburg.com).\n" "\n" "(c) Copyright CNRI, All Rights Reserved. NO WARRANTY." msgstr "" #: mu/modes/api/python3.py:154 msgid "" "json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, " "check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, " "default=None, sort_keys=False, **kw) \n" "Serialize ``obj`` as a JSON formatted stream to ``fp`` (a\n" "``.write()``-supporting file-like object).\n" "\n" "If ``skipkeys`` is true then ``dict`` keys that are not basic types\n" "(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped\n" "instead of raising a ``TypeError``.\n" "\n" "If ``ensure_ascii`` is false, then the strings written to ``fp`` can\n" "contain non-ASCII characters if they appear in strings contained in\n" "``obj``. Otherwise, all such characters are escaped in JSON strings.\n" "\n" "If ``check_circular`` is false, then the circular reference check\n" "for container types will be skipped and a circular reference will\n" "result in an ``OverflowError`` (or worse).\n" "\n" "If ``allow_nan`` is false, then it will be a ``ValueError`` to\n" "serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)\n" "in strict compliance of the JSON specification, instead of using the\n" "JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).\n" "\n" "If ``indent`` is a non-negative integer, then JSON array elements and\n" "object members will be pretty-printed with that indent level. An indent\n" "level of 0 will only insert newlines. ``None`` is the most compact\n" "representation.\n" "\n" "If specified, ``separators`` should be an ``(item_separator, " "key_separator)``\n" "tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and\n" "``(',', ': ')`` otherwise. To get the most compact JSON representation,\n" "you should specify ``(',', ':')`` to eliminate whitespace.\n" "\n" "``default(obj)`` is a function that should return a serializable version\n" "of obj or raise TypeError. The default simply raises TypeError.\n" "\n" "If *sort_keys* is true (default: ``False``), then the output of\n" "dictionaries will be sorted by key.\n" "\n" "To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the\n" "``.default()`` method to serialize additional types), specify it with\n" "the ``cls`` kwarg; otherwise ``JSONEncoder`` is used." msgstr "" #: mu/modes/api/python3.py:155 msgid "" "json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, " "allow_nan=True, cls=None, indent=None, separators=None, default=None, " "sort_keys=False, **kw) \n" "Serialize ``obj`` to a JSON formatted ``str``.\n" "\n" "If ``skipkeys`` is true then ``dict`` keys that are not basic types\n" "(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped\n" "instead of raising a ``TypeError``.\n" "\n" "If ``ensure_ascii`` is false, then the return value can contain non-ASCII\n" "characters if they appear in strings contained in ``obj``. Otherwise, all\n" "such characters are escaped in JSON strings.\n" "\n" "If ``check_circular`` is false, then the circular reference check\n" "for container types will be skipped and a circular reference will\n" "result in an ``OverflowError`` (or worse).\n" "\n" "If ``allow_nan`` is false, then it will be a ``ValueError`` to\n" "serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in\n" "strict compliance of the JSON specification, instead of using the\n" "JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).\n" "\n" "If ``indent`` is a non-negative integer, then JSON array elements and\n" "object members will be pretty-printed with that indent level. An indent\n" "level of 0 will only insert newlines. ``None`` is the most compact\n" "representation.\n" "\n" "If specified, ``separators`` should be an ``(item_separator, " "key_separator)``\n" "tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and\n" "``(',', ': ')`` otherwise. To get the most compact JSON representation,\n" "you should specify ``(',', ':')`` to eliminate whitespace.\n" "\n" "``default(obj)`` is a function that should return a serializable version\n" "of obj or raise TypeError. The default simply raises TypeError.\n" "\n" "If *sort_keys* is true (default: ``False``), then the output of\n" "dictionaries will be sorted by key.\n" "\n" "To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the\n" "``.default()`` method to serialize additional types), specify it with\n" "the ``cls`` kwarg; otherwise ``JSONEncoder`` is used." msgstr "" #: mu/modes/api/python3.py:156 msgid "" "json.json.decoder() \n" "Implementation of JSONDecoder" msgstr "" #: mu/modes/api/python3.py:157 msgid "" "json.json.encoder() \n" "Implementation of JSONEncoder" msgstr "" #: mu/modes/api/python3.py:158 msgid "" "json.json.scanner() \n" "JSON token scanner" msgstr "" #: mu/modes/api/python3.py:159 msgid "" "json.load(fp, *, cls=None, object_hook=None, parse_float=None, " "parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) \n" "Deserialize ``fp`` (a ``.read()``-supporting file-like object containing\n" "a JSON document) to a Python object.\n" "\n" "``object_hook`` is an optional function that will be called with the\n" "result of any object literal decode (a ``dict``). The return value of\n" "``object_hook`` will be used instead of the ``dict``. This feature\n" "can be used to implement custom decoders (e.g. JSON-RPC class hinting).\n" "\n" "``object_pairs_hook`` is an optional function that will be called with the\n" "result of any object literal decoded with an ordered list of pairs. The\n" "return value of ``object_pairs_hook`` will be used instead of the ``dict``.\n" "This feature can be used to implement custom decoders that rely on the\n" "order that the key and value pairs are decoded (for example,\n" "collections.OrderedDict will remember the order of insertion). If\n" "``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.\n" "\n" "To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``\n" "kwarg; otherwise ``JSONDecoder`` is used." msgstr "" #: mu/modes/api/python3.py:160 msgid "" "json.loads(s, *, encoding=None, cls=None, object_hook=None, " "parse_float=None, parse_int=None, parse_constant=None, " "object_pairs_hook=None, **kw) \n" "Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance\n" "containing a JSON document) to a Python object.\n" "\n" "``object_hook`` is an optional function that will be called with the\n" "result of any object literal decode (a ``dict``). The return value of\n" "``object_hook`` will be used instead of the ``dict``. This feature\n" "can be used to implement custom decoders (e.g. JSON-RPC class hinting).\n" "\n" "``object_pairs_hook`` is an optional function that will be called with the\n" "result of any object literal decoded with an ordered list of pairs. The\n" "return value of ``object_pairs_hook`` will be used instead of the ``dict``.\n" "This feature can be used to implement custom decoders that rely on the\n" "order that the key and value pairs are decoded (for example,\n" "collections.OrderedDict will remember the order of insertion). If\n" "``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.\n" "\n" "``parse_float``, if specified, will be called with the string\n" "of every JSON float to be decoded. By default this is equivalent to\n" "float(num_str). This can be used to use another datatype or parser\n" "for JSON floats (e.g. decimal.Decimal).\n" "\n" "``parse_int``, if specified, will be called with the string\n" "of every JSON int to be decoded. By default this is equivalent to\n" "int(num_str). This can be used to use another datatype or parser\n" "for JSON integers (e.g. float).\n" "\n" "``parse_constant``, if specified, will be called with one of the\n" "following strings: -Infinity, Infinity, NaN.\n" "This can be used to raise an exception if invalid JSON numbers\n" "are encountered.\n" "\n" "To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``\n" "kwarg; otherwise ``JSONDecoder`` is used.\n" "\n" "The ``encoding`` argument is ignored and deprecated." msgstr "" #: mu/modes/api/python3.py:161 msgid "" "os.OSError() \n" "Base class for I/O related errors." msgstr "" #: mu/modes/api/python3.py:162 msgid "" "os.PathLike() \n" "Abstract base class for implementing the file system path protocol." msgstr "" #: mu/modes/api/python3.py:163 msgid "" "os.WCOREDUMP(status, /) \n" "Return True if the process returning status was dumped to a core file." msgstr "" #: mu/modes/api/python3.py:164 msgid "" "os.WEXITSTATUS(status) \n" "Return the process return code from status." msgstr "" #: mu/modes/api/python3.py:165 msgid "" "os.WIFCONTINUED(status) \n" "Return True if a particular process was continued from a job control stop.\n" "\n" "Return True if the process returning status was continued from a\n" "job control stop." msgstr "" #: mu/modes/api/python3.py:166 msgid "" "os.WIFEXITED(status) \n" "Return True if the process returning status exited via the exit() system " "call." msgstr "" #: mu/modes/api/python3.py:167 msgid "" "os.WIFSIGNALED(status) \n" "Return True if the process returning status was terminated by a signal." msgstr "" #: mu/modes/api/python3.py:168 msgid "" "os.WIFSTOPPED(status) \n" "Return True if the process returning status was stopped." msgstr "" #: mu/modes/api/python3.py:169 msgid "" "os.WSTOPSIG(status) \n" "Return the signal that stopped the process that provided the status value." msgstr "" #: mu/modes/api/python3.py:170 msgid "" "os.WTERMSIG(status) \n" "Return the signal that terminated the process that provided the status value." msgstr "" #: mu/modes/api/python3.py:171 msgid "" "os.abc() \n" "Abstract Base Classes (ABCs) according to PEP 3119." msgstr "" #: mu/modes/api/python3.py:172 msgid "" "os.abort() \n" "Abort the interpreter immediately.\n" "\n" "This function 'dumps core' or otherwise fails in the hardest way possible\n" "on the hosting operating system. This function never returns." msgstr "" #: mu/modes/api/python3.py:173 msgid "" "os.access(path, mode, *, dir_fd=None, effective_ids=False, " "follow_symlinks=True) \n" "Use the real uid/gid to test for access to a path.\n" "\n" " path\n" " Path to be tested; can be string or bytes\n" " mode\n" " Operating-system mode bitfield. Can be F_OK to test existence,\n" " or the inclusive-OR of R_OK, W_OK, and X_OK.\n" " dir_fd\n" " If not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that\n" " directory.\n" " effective_ids\n" " If True, access will use the effective uid/gid instead of\n" " the real uid/gid.\n" " follow_symlinks\n" " If False, and the last element of the path is a symbolic link,\n" " access will examine the symbolic link itself instead of the file\n" " the link points to.\n" "\n" "dir_fd, effective_ids, and follow_symlinks may not be implemented\n" " on your platform. If they are unavailable, using them will raise a\n" " NotImplementedError.\n" "\n" "Note that most operations will use the effective uid/gid, therefore this\n" " routine can be used in a suid/sgid environment to test if the invoking " "user\n" " has the specified access to the path." msgstr "" #: mu/modes/api/python3.py:174 msgid "" "os.chdir(path) \n" "Change the current working directory to the specified path.\n" "\n" "path may always be specified as a string.\n" "On some platforms, path may also be specified as an open file descriptor.\n" " If this functionality is unavailable, using it raises an exception." msgstr "" #: mu/modes/api/python3.py:175 msgid "" "os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True) \n" "Change the access permissions of a file.\n" "\n" " path\n" " Path to be modified. May always be specified as a str or bytes.\n" " On some platforms, path may also be specified as an open file " "descriptor.\n" " If this functionality is unavailable, using it raises an exception.\n" " mode\n" " Operating-system mode bitfield.\n" " dir_fd\n" " If not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that\n" " directory.\n" " follow_symlinks\n" " If False, and the last element of the path is a symbolic link,\n" " chmod will modify the symbolic link itself instead of the file\n" " the link points to.\n" "\n" "It is an error to use dir_fd or follow_symlinks when specifying path as\n" " an open file descriptor.\n" "dir_fd and follow_symlinks may not be implemented on your platform.\n" " If they are unavailable, using them will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:176 msgid "" "os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True) \n" "Change the owner and group id of path to the numeric uid and gid.\\\n" "\n" " path\n" " Path to be examined; can be string, bytes, or open-file-descriptor int.\n" " dir_fd\n" " If not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that\n" " directory.\n" " follow_symlinks\n" " If False, and the last element of the path is a symbolic link,\n" " stat will examine the symbolic link itself instead of the file\n" " the link points to.\n" "\n" "path may always be specified as a string.\n" "On some platforms, path may also be specified as an open file descriptor.\n" " If this functionality is unavailable, using it raises an exception.\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "If follow_symlinks is False, and the last element of the path is a symbolic\n" " link, chown will modify the symbolic link itself instead of the file the\n" " link points to.\n" "It is an error to use dir_fd or follow_symlinks when specifying path as\n" " an open file descriptor.\n" "dir_fd and follow_symlinks may not be implemented on your platform.\n" " If they are unavailable, using them will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:177 msgid "" "os.chroot(path) \n" "Change root directory to path." msgstr "" #: mu/modes/api/python3.py:178 msgid "" "os.close(fd) \n" "Close a file descriptor." msgstr "" #: mu/modes/api/python3.py:179 msgid "" "os.closerange(fd_low, fd_high, /) \n" "Closes all file descriptors in [fd_low, fd_high), ignoring errors." msgstr "" #: mu/modes/api/python3.py:180 msgid "" "os.confstr(name, /) \n" "Return a string-valued system configuration variable." msgstr "" #: mu/modes/api/python3.py:181 msgid "" "os.cpu_count() \n" "Return the number of CPUs in the system; return None if indeterminable.\n" "\n" "This number is not equivalent to the number of CPUs the current process can\n" "use. The number of usable CPUs can be obtained with\n" "``len(os.sched_getaffinity(0))``" msgstr "" #: mu/modes/api/python3.py:182 msgid "" "os.ctermid() \n" "Return the name of the controlling terminal for this process." msgstr "" #: mu/modes/api/python3.py:183 msgid "" "os.device_encoding(fd) \n" "Return a string describing the encoding of a terminal's file descriptor.\n" "\n" "The file descriptor must be attached to a terminal.\n" "If the device is not a terminal, return None." msgstr "" #: mu/modes/api/python3.py:184 msgid "" "os.dup(fd, /) \n" "Return a duplicate of a file descriptor." msgstr "" #: mu/modes/api/python3.py:185 msgid "" "os.dup2(fd, fd2, inheritable=True) \n" "Duplicate file descriptor." msgstr "" #: mu/modes/api/python3.py:186 msgid "" "os.errno() \n" "This module makes available standard errno system symbols.\n" "\n" "The value of each symbol is the corresponding integer value,\n" "e.g., on most systems, errno.ENOENT equals the integer 2.\n" "\n" "The dictionary errno.errorcode maps numeric codes to symbol names,\n" "e.g., errno.errorcode[2] could be the string 'ENOENT'.\n" "\n" "Symbols that are not relevant to the underlying system are not defined.\n" "\n" "To map error codes to error messages, use the function os.strerror(),\n" "e.g. os.strerror(2) could return 'No such file or directory'." msgstr "" #: mu/modes/api/python3.py:187 msgid "" "os.execl(file, *args) \n" "execl(file, *args)\n" "\n" "Execute the executable file with argument list args, replacing the\n" "current process. " msgstr "" #: mu/modes/api/python3.py:188 msgid "" "os.execle(file, *args) \n" "execle(file, *args, env)\n" "\n" "Execute the executable file with argument list args and\n" "environment env, replacing the current process. " msgstr "" #: mu/modes/api/python3.py:189 msgid "" "os.execlp(file, *args) \n" "execlp(file, *args)\n" "\n" "Execute the executable file (which is searched for along $PATH)\n" "with argument list args, replacing the current process. " msgstr "" #: mu/modes/api/python3.py:190 msgid "" "os.execlpe(file, *args) \n" "execlpe(file, *args, env)\n" "\n" "Execute the executable file (which is searched for along $PATH)\n" "with argument list args and environment env, replacing the current\n" "process. " msgstr "" #: mu/modes/api/python3.py:191 msgid "" "os.execv(path, argv, /) \n" "Execute an executable path with arguments, replacing current process.\n" "\n" "path\n" " Path of executable file.\n" "argv\n" " Tuple or list of strings." msgstr "" #: mu/modes/api/python3.py:192 msgid "" "os.execve(path, argv, env) \n" "Execute an executable path with arguments, replacing current process.\n" "\n" "path\n" " Path of executable file.\n" "argv\n" " Tuple or list of strings.\n" "env\n" " Dictionary of strings mapping to strings." msgstr "" #: mu/modes/api/python3.py:193 msgid "" "os.execvp(file, args) \n" "execvp(file, args)\n" "\n" "Execute the executable file (which is searched for along $PATH)\n" "with argument list args, replacing the current process.\n" "args may be a list or tuple of strings. " msgstr "" #: mu/modes/api/python3.py:194 msgid "" "os.execvpe(file, args, env) \n" "execvpe(file, args, env)\n" "\n" "Execute the executable file (which is searched for along $PATH)\n" "with argument list args and environment env , replacing the\n" "current process.\n" "args may be a list or tuple of strings. " msgstr "" #: mu/modes/api/python3.py:195 msgid "" "os.fchdir(fd) \n" "Change to the directory of the given file descriptor.\n" "\n" "fd must be opened on a directory, not a file.\n" "Equivalent to os.chdir(fd)." msgstr "" #: mu/modes/api/python3.py:196 msgid "" "os.fchmod(fd, mode) \n" "Change the access permissions of the file given by file descriptor fd.\n" "\n" "Equivalent to os.chmod(fd, mode)." msgstr "" #: mu/modes/api/python3.py:197 msgid "" "os.fchown(fd, uid, gid) \n" "Change the owner and group id of the file specified by file descriptor.\n" "\n" "Equivalent to os.chown(fd, uid, gid)." msgstr "" #: mu/modes/api/python3.py:198 msgid "" "os.fdatasync(fd) \n" "Force write of fd to disk without forcing update of metadata." msgstr "" #: mu/modes/api/python3.py:199 msgid "" "os.fork() \n" "Fork a child process.\n" "\n" "Return 0 to child process and PID of child to parent process." msgstr "" #: mu/modes/api/python3.py:200 msgid "" "os.forkpty() \n" "Fork a new process with a new pseudo-terminal as controlling tty.\n" "\n" "Returns a tuple of (pid, master_fd).\n" "Like fork(), return pid of 0 to the child process,\n" "and pid of child to the parent process.\n" "To both, return fd of newly opened pseudo-terminal." msgstr "" #: mu/modes/api/python3.py:201 msgid "" "os.fpathconf(fd, name, /) \n" "Return the configuration limit name for the file descriptor fd.\n" "\n" "If there is no limit, return -1." msgstr "" #: mu/modes/api/python3.py:202 msgid "" "os.fsdecode(filename) \n" "Decode filename (an os.PathLike, bytes, or str) from the filesystem\n" "encoding with 'surrogateescape' error handler, return str unchanged. On\n" "Windows, use 'strict' error handler if the file system encoding is\n" "'mbcs' (which is the default encoding)." msgstr "" #: mu/modes/api/python3.py:203 msgid "" "os.fsencode(filename) \n" "Encode filename (an os.PathLike, bytes, or str) to the filesystem\n" "encoding with 'surrogateescape' error handler, return bytes unchanged.\n" "On Windows, use 'strict' error handler if the file system encoding is\n" "'mbcs' (which is the default encoding)." msgstr "" #: mu/modes/api/python3.py:204 msgid "" "os.fspath(path) \n" "Return the file system path representation of the object.\n" "\n" "If the object is str or bytes, then allow it to pass through as-is. If the\n" "object defines __fspath__(), then return the result of that method. All " "other\n" "types raise a TypeError." msgstr "" #: mu/modes/api/python3.py:205 msgid "" "os.fstat(fd) \n" "Perform a stat system call on the given file descriptor.\n" "\n" "Like stat(), but for an open file descriptor.\n" "Equivalent to os.stat(fd)." msgstr "" #: mu/modes/api/python3.py:206 msgid "" "os.fstatvfs(fd, /) \n" "Perform an fstatvfs system call on the given fd.\n" "\n" "Equivalent to statvfs(fd)." msgstr "" #: mu/modes/api/python3.py:207 msgid "" "os.fsync(fd) \n" "Force write of fd to disk." msgstr "" #: mu/modes/api/python3.py:208 msgid "" "os.ftruncate(fd, length, /) \n" "Truncate a file, specified by file descriptor, to a specific length." msgstr "" #: mu/modes/api/python3.py:209 msgid "" "os.fwalk(top='.', topdown=True, onerror=None, *, follow_symlinks=False, " "dir_fd=None) \n" "Directory tree generator.\n" "\n" "This behaves exactly like walk(), except that it yields a 4-tuple\n" "\n" " dirpath, dirnames, filenames, dirfd\n" "\n" "`dirpath`, `dirnames` and `filenames` are identical to walk() output,\n" "and `dirfd` is a file descriptor referring to the directory `dirpath`.\n" "\n" "The advantage of fwalk() over walk() is that it's safe against symlink\n" "races (when follow_symlinks is False).\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and top should be relative; top will then be relative to that directory.\n" " (dir_fd is always supported for fwalk.)\n" "\n" "Caution:\n" "Since fwalk() yields file descriptors, those are only valid until the\n" "next iteration step, so you should dup() them if you want to keep them\n" "for a longer period.\n" "\n" "Example:\n" "\n" "import os\n" "for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):\n" " print(root, \"consumes\", end=\"\")\n" " print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),\n" " end=\"\")\n" " print(\"bytes in\", len(files), \"non-directory files\")\n" " if 'CVS' in dirs:\n" " dirs.remove('CVS') # don't visit CVS directories" msgstr "" #: mu/modes/api/python3.py:210 msgid "" "os.get_blocking() \n" "get_blocking(fd) -> bool\n" "\n" "Get the blocking mode of the file descriptor:\n" "False if the O_NONBLOCK flag is set, True if the flag is cleared." msgstr "" #: mu/modes/api/python3.py:211 msgid "" "os.get_exec_path(env=None) \n" "Returns the sequence of directories that will be searched for the\n" "named executable (similar to a shell) when launching a process.\n" "\n" "*env* must be an environment variable dict or None. If *env* is None,\n" "os.environ will be used." msgstr "" #: mu/modes/api/python3.py:212 msgid "" "os.get_inheritable(fd, /) \n" "Get the close-on-exe flag of the specified file descriptor." msgstr "" #: mu/modes/api/python3.py:213 msgid "" "os.get_terminal_size() \n" "Return the size of the terminal window as (columns, lines).\n" "\n" "The optional argument fd (default standard output) specifies\n" "which file descriptor should be queried.\n" "\n" "If the file descriptor is not connected to a terminal, an OSError\n" "is thrown.\n" "\n" "This function will only be defined if an implementation is\n" "available for this system.\n" "\n" "shutil.get_terminal_size is the high-level function which should \n" "normally be used, os.get_terminal_size is the low-level implementation." msgstr "" #: mu/modes/api/python3.py:214 msgid "" "os.getcwd() \n" "Return a unicode string representing the current working directory." msgstr "" #: mu/modes/api/python3.py:215 msgid "" "os.getcwdb() \n" "Return a bytes string representing the current working directory." msgstr "" #: mu/modes/api/python3.py:216 msgid "" "os.getegid() \n" "Return the current process's effective group id." msgstr "" #: mu/modes/api/python3.py:217 msgid "" "os.getenv(key, default=None) \n" "Get an environment variable, return None if it doesn't exist.\n" "The optional second argument can specify an alternate default.\n" "key, default and the result are str." msgstr "" #: mu/modes/api/python3.py:218 msgid "" "os.getenvb(key, default=None) \n" "Get an environment variable, return None if it doesn't exist.\n" "The optional second argument can specify an alternate default.\n" "key, default and the result are bytes." msgstr "" #: mu/modes/api/python3.py:219 msgid "" "os.geteuid() \n" "Return the current process's effective user id." msgstr "" #: mu/modes/api/python3.py:220 msgid "" "os.getgid() \n" "Return the current process's group id." msgstr "" #: mu/modes/api/python3.py:221 msgid "" "os.getgrouplist() \n" "getgrouplist(user, group) -> list of groups to which a user belongs\n" "\n" "Returns a list of groups to which a user belongs.\n" "\n" " user: username to lookup\n" " group: base group id of the user" msgstr "" #: mu/modes/api/python3.py:222 msgid "" "os.getgroups() \n" "Return list of supplemental group IDs for the process." msgstr "" #: mu/modes/api/python3.py:223 msgid "" "os.getloadavg() \n" "Return average recent system load information.\n" "\n" "Return the number of processes in the system run queue averaged over\n" "the last 1, 5, and 15 minutes as a tuple of three floats.\n" "Raises OSError if the load average was unobtainable." msgstr "" #: mu/modes/api/python3.py:224 msgid "" "os.getlogin() \n" "Return the actual login name." msgstr "" #: mu/modes/api/python3.py:225 msgid "" "os.getpgid(pid) \n" "Call the system call getpgid(), and return the result." msgstr "" #: mu/modes/api/python3.py:226 msgid "" "os.getpgrp() \n" "Return the current process group id." msgstr "" #: mu/modes/api/python3.py:227 msgid "" "os.getpid() \n" "Return the current process id." msgstr "" #: mu/modes/api/python3.py:228 msgid "" "os.getppid() \n" "Return the parent's process id.\n" "\n" "If the parent process has already exited, Windows machines will still\n" "return its id; others systems will return the id of the 'init' process (1)." msgstr "" #: mu/modes/api/python3.py:229 msgid "" "os.getpriority(which, who) \n" "Return program scheduling priority." msgstr "" #: mu/modes/api/python3.py:230 msgid "" "os.getrandom(size, flags=0) \n" "Obtain a series of random bytes." msgstr "" #: mu/modes/api/python3.py:231 msgid "" "os.getresgid() \n" "Return a tuple of the current process's real, effective, and saved group ids." msgstr "" #: mu/modes/api/python3.py:232 msgid "" "os.getresuid() \n" "Return a tuple of the current process's real, effective, and saved user ids." msgstr "" #: mu/modes/api/python3.py:233 msgid "" "os.getsid(pid, /) \n" "Call the system call getsid(pid) and return the result." msgstr "" #: mu/modes/api/python3.py:234 msgid "" "os.getuid() \n" "Return the current process's user id." msgstr "" #: mu/modes/api/python3.py:235 msgid "" "os.getxattr(path, attribute, *, follow_symlinks=True) \n" "Return the value of extended attribute attribute on path.\n" "\n" "path may be either a string or an open file descriptor.\n" "If follow_symlinks is False, and the last element of the path is a symbolic\n" " link, getxattr will examine the symbolic link itself instead of the file\n" " the link points to." msgstr "" #: mu/modes/api/python3.py:236 msgid "" "os.initgroups() \n" "initgroups(username, gid) -> None\n" "\n" "Call the system initgroups() to initialize the group access list with all " "of\n" "the groups of which the specified username is a member, plus the specified\n" "group id." msgstr "" #: mu/modes/api/python3.py:237 msgid "" "os.isatty(fd, /) \n" "Return True if the fd is connected to a terminal.\n" "\n" "Return True if the file descriptor is an open file descriptor\n" "connected to the slave end of a terminal." msgstr "" #: mu/modes/api/python3.py:238 msgid "" "os.kill(pid, signal, /) \n" "Kill a process with a signal." msgstr "" #: mu/modes/api/python3.py:239 msgid "" "os.killpg(pgid, signal, /) \n" "Kill a process group with a signal." msgstr "" #: mu/modes/api/python3.py:240 msgid "" "os.lchown(path, uid, gid) \n" "Change the owner and group id of path to the numeric uid and gid.\n" "\n" "This function will not follow symbolic links.\n" "Equivalent to os.chown(path, uid, gid, follow_symlinks=False)." msgstr "" #: mu/modes/api/python3.py:241 msgid "" "os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, " "follow_symlinks=True) \n" "Create a hard link to a file.\n" "\n" "If either src_dir_fd or dst_dir_fd is not None, it should be a file\n" " descriptor open to a directory, and the respective path string (src or " "dst)\n" " should be relative; the path will then be relative to that directory.\n" "If follow_symlinks is False, and the last element of src is a symbolic\n" " link, link will create a link to the symbolic link itself instead of the\n" " file the link points to.\n" "src_dir_fd, dst_dir_fd, and follow_symlinks may not be implemented on your\n" " platform. If they are unavailable, using them will raise a\n" " NotImplementedError." msgstr "" #: mu/modes/api/python3.py:242 msgid "" "os.listdir(path=None) \n" "Return a list containing the names of the files in the directory.\n" "\n" "path can be specified as either str or bytes. If path is bytes,\n" " the filenames returned will also be bytes; in all other circumstances\n" " the filenames returned will be str.\n" "If path is None, uses the path='.'.\n" "On some platforms, path may also be specified as an open file descriptor;\\\n" " the file descriptor must refer to a directory.\n" " If this functionality is unavailable, using it raises " "NotImplementedError.\n" "\n" "The list is in arbitrary order. It does not include the special\n" "entries '.' and '..' even if they are present in the directory." msgstr "" #: mu/modes/api/python3.py:243 msgid "" "os.listxattr(path=None, *, follow_symlinks=True) \n" "Return a list of extended attributes on path.\n" "\n" "path may be either None, a string, or an open file descriptor.\n" "if path is None, listxattr will examine the current directory.\n" "If follow_symlinks is False, and the last element of the path is a symbolic\n" " link, listxattr will examine the symbolic link itself instead of the file\n" " the link points to." msgstr "" #: mu/modes/api/python3.py:244 msgid "" "os.lockf(fd, command, length, /) \n" "Apply, test or remove a POSIX lock on an open file descriptor.\n" "\n" "fd\n" " An open file descriptor.\n" "command\n" " One of F_LOCK, F_TLOCK, F_ULOCK or F_TEST.\n" "length\n" " The number of bytes to lock, starting at the current position." msgstr "" #: mu/modes/api/python3.py:245 msgid "" "os.lseek(fd, position, how, /) \n" "Set the position of a file descriptor. Return the new position.\n" "\n" "Return the new cursor position in number of bytes\n" "relative to the beginning of the file." msgstr "" #: mu/modes/api/python3.py:246 msgid "" "os.lstat(path, *, dir_fd=None) \n" "Perform a stat system call on the given path, without following symbolic " "links.\n" "\n" "Like stat(), but do not follow symbolic links.\n" "Equivalent to stat(path, follow_symlinks=False)." msgstr "" #: mu/modes/api/python3.py:247 msgid "" "os.major(device, /) \n" "Extracts a device major number from a raw device number." msgstr "" #: mu/modes/api/python3.py:248 msgid "" "os.makedev(major, minor, /) \n" "Composes a raw device number from the major and minor device numbers." msgstr "" #: mu/modes/api/python3.py:249 msgid "" "os.makedirs(name, mode=511, exist_ok=False) \n" "makedirs(name [, mode=0o777][, exist_ok=False])\n" "\n" "Super-mkdir; create a leaf directory and all intermediate ones. Works like\n" "mkdir, except that any intermediate path segment (not just the rightmost)\n" "will be created if it does not exist. If the target directory already\n" "exists, raise an OSError if exist_ok is False. Otherwise no exception is\n" "raised. This is recursive." msgstr "" #: mu/modes/api/python3.py:250 msgid "" "os.minor(device, /) \n" "Extracts a device minor number from a raw device number." msgstr "" #: mu/modes/api/python3.py:251 msgid "" "os.mkdir(path, mode=511, *, dir_fd=None) \n" "Create a directory.\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError.\n" "\n" "The mode argument is ignored on Windows." msgstr "" #: mu/modes/api/python3.py:252 msgid "" "os.mkfifo(path, mode=438, *, dir_fd=None) \n" "Create a \"fifo\" (a POSIX named pipe).\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:253 msgid "" "os.mknod(path, mode=384, device=0, *, dir_fd=None) \n" "Create a node in the file system.\n" "\n" "Create a node in the file system (file, device special file or named pipe)\n" "at path. mode specifies both the permissions to use and the\n" "type of node to be created, being combined (bitwise OR) with one of\n" "S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. If S_IFCHR or S_IFBLK is set on " "mode,\n" "device defines the newly created device special file (probably using\n" "os.makedev()). Otherwise device is ignored.\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:254 msgid "" "os.nice(increment, /) \n" "Add increment to the priority of process and return the new priority." msgstr "" #: mu/modes/api/python3.py:255 msgid "" "os.open(path, flags, mode=511, *, dir_fd=None) \n" "Open a file for low level IO. Returns a file descriptor (integer).\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:256 msgid "" "os.openpty() \n" "Open a pseudo-terminal.\n" "\n" "Return a tuple of (master_fd, slave_fd) containing open file descriptors\n" "for both the master and slave ends." msgstr "" #: mu/modes/api/python3.py:257 msgid "" "os.path.abspath(path) \n" "Return an absolute path." msgstr "" #: mu/modes/api/python3.py:258 msgid "" "os.path.basename(p) \n" "Returns the final component of a pathname" msgstr "" #: mu/modes/api/python3.py:259 msgid "" "os.path.commonpath(paths) \n" "Given a sequence of path names, returns the longest common sub-path." msgstr "" #: mu/modes/api/python3.py:260 msgid "" "os.path.commonprefix(m) \n" "Given a list of pathnames, returns the longest common leading component" msgstr "" #: mu/modes/api/python3.py:261 msgid "" "os.path.dirname(p) \n" "Returns the directory component of a pathname" msgstr "" #: mu/modes/api/python3.py:262 msgid "" "os.path.exists(path) \n" "Test whether a path exists. Returns False for broken symbolic links" msgstr "" #: mu/modes/api/python3.py:263 msgid "" "os.path.expanduser(path) \n" "Expand ~ and ~user constructions. If user or $HOME is unknown,\n" "do nothing." msgstr "" #: mu/modes/api/python3.py:264 msgid "" "os.path.expandvars(path) \n" "Expand shell variables of form $var and ${var}. Unknown variables\n" "are left unchanged." msgstr "" #: mu/modes/api/python3.py:265 msgid "" "os.path.genericpath() \n" "Path operations common to more than one OS\n" "Do not use directly. The OS specific modules import the appropriate\n" "functions from this module themselves." msgstr "" #: mu/modes/api/python3.py:266 msgid "" "os.path.getatime(filename) \n" "Return the last access time of a file, reported by os.stat()." msgstr "" #: mu/modes/api/python3.py:267 msgid "" "os.path.getctime(filename) \n" "Return the metadata change time of a file, reported by os.stat()." msgstr "" #: mu/modes/api/python3.py:268 msgid "" "os.path.getmtime(filename) \n" "Return the last modification time of a file, reported by os.stat()." msgstr "" #: mu/modes/api/python3.py:269 msgid "" "os.path.getsize(filename) \n" "Return the size of a file, reported by os.stat()." msgstr "" #: mu/modes/api/python3.py:270 msgid "" "os.path.isabs(s) \n" "Test whether a path is absolute" msgstr "" #: mu/modes/api/python3.py:271 msgid "" "os.path.isdir(s) \n" "Return true if the pathname refers to an existing directory." msgstr "" #: mu/modes/api/python3.py:272 msgid "" "os.path.isfile(path) \n" "Test whether a path is a regular file" msgstr "" #: mu/modes/api/python3.py:273 msgid "" "os.path.islink(path) \n" "Test whether a path is a symbolic link" msgstr "" #: mu/modes/api/python3.py:274 msgid "" "os.path.ismount(path) \n" "Test whether a path is a mount point" msgstr "" #: mu/modes/api/python3.py:275 msgid "" "os.path.join(a, *p) \n" "Join two or more pathname components, inserting '/' as needed.\n" "If any component is an absolute path, all previous path components\n" "will be discarded. An empty last part will result in a path that\n" "ends with a separator." msgstr "" #: mu/modes/api/python3.py:276 msgid "" "os.path.lexists(path) \n" "Test whether a path exists. Returns True for broken symbolic links" msgstr "" #: mu/modes/api/python3.py:277 msgid "" "os.path.normcase(s) \n" "Normalize case of pathname. Has no effect under Posix" msgstr "" #: mu/modes/api/python3.py:278 msgid "" "os.path.normpath(path) \n" "Normalize path, eliminating double slashes, etc." msgstr "" #: mu/modes/api/python3.py:279 msgid "" "os.path.os() \n" "OS routines for NT or Posix depending on what system we're on.\n" "\n" "This exports:\n" " - all functions from posix or nt, e.g. unlink, stat, etc.\n" " - os.path is either posixpath or ntpath\n" " - os.name is either 'posix' or 'nt'\n" " - os.curdir is a string representing the current directory (always '.')\n" " - os.pardir is a string representing the parent directory (always '..')\n" " - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n" " - os.extsep is the extension separator (always '.')\n" " - os.altsep is the alternate pathname separator (None or '/')\n" " - os.pathsep is the component separator used in $PATH etc\n" " - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r" "\\n')\n" " - os.defpath is the default search path for executables\n" " - os.devnull is the file path of the null device ('/dev/null', etc.)\n" "\n" "Programs that import and use 'os' stand a better chance of being\n" "portable between different platforms. Of course, they must then\n" "only use functions that are defined by all platforms (e.g., unlink\n" "and opendir), and leave all pathname manipulation to os.path\n" "(e.g., split and join)." msgstr "" #: mu/modes/api/python3.py:280 msgid "" "os.path.realpath(filename) \n" "Return the canonical path of the specified filename, eliminating any\n" "symbolic links encountered in the path." msgstr "" #: mu/modes/api/python3.py:281 msgid "" "os.path.relpath(path, start=None) \n" "Return a relative version of a path" msgstr "" #: mu/modes/api/python3.py:282 msgid "" "os.path.samefile(f1, f2) \n" "Test whether two pathnames reference the same actual file" msgstr "" #: mu/modes/api/python3.py:283 msgid "" "os.path.sameopenfile(fp1, fp2) \n" "Test whether two open file objects reference the same file" msgstr "" #: mu/modes/api/python3.py:284 msgid "" "os.path.samestat(s1, s2) \n" "Test whether two stat buffers reference the same file" msgstr "" #: mu/modes/api/python3.py:285 msgid "" "os.path.split(p) \n" "Split a pathname. Returns tuple \"(head, tail)\" where \"tail\" is\n" "everything after the final slash. Either part may be empty." msgstr "" #: mu/modes/api/python3.py:286 msgid "" "os.path.splitdrive(p) \n" "Split a pathname into drive and path. On Posix, drive is always\n" "empty." msgstr "" #: mu/modes/api/python3.py:287 msgid "" "os.path.splitext(p) \n" "Split the extension from a pathname.\n" "\n" "Extension is everything from the last dot to the end, ignoring\n" "leading dots. Returns \"(root, ext)\"; ext may be empty." msgstr "" #: mu/modes/api/python3.py:288 msgid "" "os.path.stat() \n" "Constants/functions for interpreting results of os.stat() and os.lstat().\n" "\n" "Suggested usage: from stat import *" msgstr "" #: mu/modes/api/python3.py:289 msgid "" "os.path.sys() \n" "This module provides access to some objects used or maintained by the\n" "interpreter and to functions that interact strongly with the interpreter.\n" "\n" "Dynamic objects:\n" "\n" "argv -- command line arguments; argv[0] is the script pathname if known\n" "path -- module search path; path[0] is the script directory, else ''\n" "modules -- dictionary of loaded modules\n" "\n" "displayhook -- called to show results in an interactive session\n" "excepthook -- called to handle any uncaught exception other than SystemExit\n" " To customize printing in an interactive session or to install a custom\n" " top-level exception handler, assign other functions to replace these.\n" "\n" "stdin -- standard input file object; used by input()\n" "stdout -- standard output file object; used by print()\n" "stderr -- standard error object; used for error messages\n" " By assigning other file objects (or objects that behave like files)\n" " to these, it is possible to redirect all of the interpreter's I/O.\n" "\n" "last_type -- type of last uncaught exception\n" "last_value -- value of last uncaught exception\n" "last_traceback -- traceback of last uncaught exception\n" " These three are only available in an interactive session after a\n" " traceback has been printed.\n" "\n" "Static objects:\n" "\n" "builtin_module_names -- tuple of module names built into this interpreter\n" "copyright -- copyright notice pertaining to this interpreter\n" "exec_prefix -- prefix used to find the machine-specific Python library\n" "executable -- absolute path of the executable binary of the Python " "interpreter\n" "float_info -- a struct sequence with information about the float " "implementation.\n" "float_repr_style -- string indicating the style of repr() output for floats\n" "hash_info -- a struct sequence with information about the hash algorithm.\n" "hexversion -- version information encoded as a single integer\n" "implementation -- Python implementation information.\n" "int_info -- a struct sequence with information about the int " "implementation.\n" "maxsize -- the largest supported length of containers.\n" "maxunicode -- the value of the largest Unicode code point\n" "platform -- platform identifier\n" "prefix -- prefix used to find the Python library\n" "thread_info -- a struct sequence with information about the thread " "implementation.\n" "version -- the version of this interpreter as a string\n" "version_info -- version information as a named tuple\n" "__stdin__ -- the original stdin; don't touch!\n" "__stdout__ -- the original stdout; don't touch!\n" "__stderr__ -- the original stderr; don't touch!\n" "__displayhook__ -- the original displayhook; don't touch!\n" "__excepthook__ -- the original excepthook; don't touch!\n" "\n" "Functions:\n" "\n" "displayhook() -- print an object to the screen, and save it in builtins._\n" "excepthook() -- print an exception and its traceback to sys.stderr\n" "exc_info() -- return thread-safe information about the current exception\n" "exit() -- exit the interpreter by raising SystemExit\n" "getdlopenflags() -- returns flags to be used for dlopen() calls\n" "getprofile() -- get the global profiling function\n" "getrefcount() -- return the reference count for an object (plus one :-)\n" "getrecursionlimit() -- return the max recursion depth for the interpreter\n" "getsizeof() -- return the size of an object in bytes\n" "gettrace() -- get the global debug tracing function\n" "setcheckinterval() -- control how often the interpreter checks for events\n" "setdlopenflags() -- set the flags to be used for dlopen() calls\n" "setprofile() -- set the global profiling function\n" "setrecursionlimit() -- set the max recursion depth for the interpreter\n" "settrace() -- set the global debug tracing function" msgstr "" #: mu/modes/api/python3.py:290 msgid "" "os.pathconf(path, name) \n" "Return the configuration limit name for the file or directory path.\n" "\n" "If there is no limit, return -1.\n" "On some platforms, path may also be specified as an open file descriptor.\n" " If this functionality is unavailable, using it raises an exception." msgstr "" #: mu/modes/api/python3.py:291 msgid "" "os.pipe() \n" "Create a pipe.\n" "\n" "Returns a tuple of two file descriptors:\n" " (read_fd, write_fd)" msgstr "" #: mu/modes/api/python3.py:292 msgid "" "os.pipe2(flags, /) \n" "Create a pipe with flags set atomically.\n" "\n" "Returns a tuple of two file descriptors:\n" " (read_fd, write_fd)\n" "\n" "flags can be constructed by ORing together one or more of these values:\n" "O_NONBLOCK, O_CLOEXEC." msgstr "" #: mu/modes/api/python3.py:293 msgid "" "os.posix_fadvise(fd, offset, length, advice, /) \n" "Announce an intention to access data in a specific pattern.\n" "\n" "Announce an intention to access data in a specific pattern, thus allowing\n" "the kernel to make optimizations.\n" "The advice applies to the region of the file specified by fd starting at\n" "offset and continuing for length bytes.\n" "advice is one of POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL,\n" "POSIX_FADV_RANDOM, POSIX_FADV_NOREUSE, POSIX_FADV_WILLNEED, or\n" "POSIX_FADV_DONTNEED." msgstr "" #: mu/modes/api/python3.py:294 msgid "" "os.posix_fallocate(fd, offset, length, /) \n" "Ensure a file has allocated at least a particular number of bytes on disk.\n" "\n" "Ensure that the file specified by fd encompasses a range of bytes\n" "starting at offset bytes from the beginning and continuing for length bytes." msgstr "" #: mu/modes/api/python3.py:295 msgid "" "os.posixpath() \n" "Common operations on Posix pathnames.\n" "\n" "Instead of importing this module directly, import os and refer to\n" "this module as os.path. The \"os.path\" name is an alias for this\n" "module on Posix systems; on other systems (e.g. Mac, Windows),\n" "os.path provides the same operations in a manner specific to that\n" "platform, and is an alias to another module (e.g. macpath, ntpath).\n" "\n" "Some of this can actually be useful on non-Posix systems too, e.g.\n" "for manipulation of the pathname component of URLs." msgstr "" #: mu/modes/api/python3.py:296 msgid "" "os.pread(fd, length, offset, /) \n" "Read a number of bytes from a file descriptor starting at a particular " "offset.\n" "\n" "Read length bytes from file descriptor fd, starting at offset bytes from\n" "the beginning of the file. The file offset remains unchanged." msgstr "" #: mu/modes/api/python3.py:297 msgid "" "os.putenv(name, value, /) \n" "Change or add an environment variable." msgstr "" #: mu/modes/api/python3.py:298 msgid "" "os.pwrite(fd, buffer, offset, /) \n" "Write bytes to a file descriptor starting at a particular offset.\n" "\n" "Write buffer to fd, starting at offset bytes from the beginning of\n" "the file. Returns the number of bytes writte. Does not change the\n" "current file offset." msgstr "" #: mu/modes/api/python3.py:299 msgid "" "os.read(fd, length, /) \n" "Read from a file descriptor. Returns a bytes object." msgstr "" #: mu/modes/api/python3.py:300 msgid "" "os.readlink() \n" "readlink(path, *, dir_fd=None) -> path\n" "\n" "Return a string representing the path to which the symbolic link points.\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:301 msgid "" "os.readv(fd, buffers, /) \n" "Read from a file descriptor fd into an iterable of buffers.\n" "\n" "The buffers should be mutable buffers accepting bytes.\n" "readv will transfer data into each buffer until it is full\n" "and then move on to the next buffer in the sequence to hold\n" "the rest of the data.\n" "\n" "readv returns the total number of bytes read,\n" "which may be less than the total capacity of all the buffers." msgstr "" #: mu/modes/api/python3.py:302 msgid "" "os.remove(path, *, dir_fd=None) \n" "Remove a file (same as unlink()).\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:303 msgid "" "os.removedirs(name) \n" "removedirs(name)\n" "\n" "Super-rmdir; remove a leaf directory and all empty intermediate\n" "ones. Works like rmdir except that, if the leaf directory is\n" "successfully removed, directories corresponding to rightmost path\n" "segments will be pruned away until either the whole path is\n" "consumed or an error occurs. Errors during this latter phase are\n" "ignored -- they generally mean that a directory was not empty." msgstr "" #: mu/modes/api/python3.py:304 msgid "" "os.removexattr(path, attribute, *, follow_symlinks=True) \n" "Remove extended attribute attribute on path.\n" "\n" "path may be either a string or an open file descriptor.\n" "If follow_symlinks is False, and the last element of the path is a symbolic\n" " link, removexattr will modify the symbolic link itself instead of the " "file\n" " the link points to." msgstr "" #: mu/modes/api/python3.py:305 msgid "" "os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) \n" "Rename a file or directory.\n" "\n" "If either src_dir_fd or dst_dir_fd is not None, it should be a file\n" " descriptor open to a directory, and the respective path string (src or " "dst)\n" " should be relative; the path will then be relative to that directory.\n" "src_dir_fd and dst_dir_fd, may not be implemented on your platform.\n" " If they are unavailable, using them will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:306 msgid "" "os.renames(old, new) \n" "renames(old, new)\n" "\n" "Super-rename; create directories as necessary and delete any left\n" "empty. Works like rename, except creation of any intermediate\n" "directories needed to make the new pathname good is attempted\n" "first. After the rename, directories corresponding to rightmost\n" "path segments of the old name will be pruned until either the\n" "whole path is consumed or a nonempty directory is found.\n" "\n" "Note: this function can fail with the new directory structure made\n" "if you lack permissions needed to unlink the leaf directory or\n" "file." msgstr "" #: mu/modes/api/python3.py:307 msgid "" "os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None) \n" "Rename a file or directory, overwriting the destination.\n" "\n" "If either src_dir_fd or dst_dir_fd is not None, it should be a file\n" " descriptor open to a directory, and the respective path string (src or " "dst)\n" " should be relative; the path will then be relative to that directory.\n" "src_dir_fd and dst_dir_fd, may not be implemented on your platform.\n" " If they are unavailable, using them will raise a NotImplementedError.\"" msgstr "" #: mu/modes/api/python3.py:308 msgid "" "os.rmdir(path, *, dir_fd=None) \n" "Remove a directory.\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:309 msgid "" "os.scandir() \n" "scandir(path='.') -> iterator of DirEntry objects for given path" msgstr "" #: mu/modes/api/python3.py:310 msgid "" "os.sched_get_priority_max(policy) \n" "Get the maximum scheduling priority for policy." msgstr "" #: mu/modes/api/python3.py:311 msgid "" "os.sched_get_priority_min(policy) \n" "Get the minimum scheduling priority for policy." msgstr "" #: mu/modes/api/python3.py:312 msgid "" "os.sched_getaffinity(pid, /) \n" "Return the affinity of the process identified by pid (or the current process " "if zero).\n" "\n" "The affinity is returned as a set of CPU identifiers." msgstr "" #: mu/modes/api/python3.py:313 msgid "" "os.sched_getparam(pid, /) \n" "Returns scheduling parameters for the process identified by pid.\n" "\n" "If pid is 0, returns parameters for the calling process.\n" "Return value is an instance of sched_param." msgstr "" #: mu/modes/api/python3.py:314 msgid "" "os.sched_getscheduler(pid, /) \n" "Get the scheduling policy for the process identifiedy by pid.\n" "\n" "Passing 0 for pid returns the scheduling policy for the calling process." msgstr "" #: mu/modes/api/python3.py:315 msgid "" "os.sched_param(sched_priority) \n" "Current has only one field: sched_priority\");\n" "\n" "sched_priority\n" " A scheduling parameter." msgstr "" #: mu/modes/api/python3.py:316 msgid "" "os.sched_rr_get_interval(pid, /) \n" "Return the round-robin quantum for the process identified by pid, in " "seconds.\n" "\n" "Value returned is a float." msgstr "" #: mu/modes/api/python3.py:317 msgid "" "os.sched_setaffinity(pid, mask, /) \n" "Set the CPU affinity of the process identified by pid to mask.\n" "\n" "mask should be an iterable of integers identifying CPUs." msgstr "" #: mu/modes/api/python3.py:318 msgid "" "os.sched_setparam(pid, param, /) \n" "Set scheduling parameters for the process identified by pid.\n" "\n" "If pid is 0, sets parameters for the calling process.\n" "param should be an instance of sched_param." msgstr "" #: mu/modes/api/python3.py:319 msgid "" "os.sched_setscheduler(pid, policy, param, /) \n" "Set the scheduling policy for the process identified by pid.\n" "\n" "If pid is 0, the calling process is changed.\n" "param is an instance of sched_param." msgstr "" #: mu/modes/api/python3.py:320 msgid "" "os.sched_yield() \n" "Voluntarily relinquish the CPU." msgstr "" #: mu/modes/api/python3.py:321 msgid "" "os.sendfile() \n" "sendfile(out, in, offset, count) -> byteswritten\n" "sendfile(out, in, offset, count[, headers][, trailers], flags=0)\n" " -> byteswritten\n" "Copy count bytes from file descriptor in to file descriptor out." msgstr "" #: mu/modes/api/python3.py:322 msgid "" "os.set_blocking() \n" "set_blocking(fd, blocking)\n" "\n" "Set the blocking mode of the specified file descriptor.\n" "Set the O_NONBLOCK flag if blocking is False,\n" "clear the O_NONBLOCK flag otherwise." msgstr "" #: mu/modes/api/python3.py:323 msgid "" "os.set_inheritable(fd, inheritable, /) \n" "Set the inheritable flag of the specified file descriptor." msgstr "" #: mu/modes/api/python3.py:324 msgid "" "os.setegid(egid, /) \n" "Set the current process's effective group id." msgstr "" #: mu/modes/api/python3.py:325 msgid "" "os.seteuid(euid, /) \n" "Set the current process's effective user id." msgstr "" #: mu/modes/api/python3.py:326 msgid "" "os.setgid(gid, /) \n" "Set the current process's group id." msgstr "" #: mu/modes/api/python3.py:327 msgid "" "os.setgroups(groups, /) \n" "Set the groups of the current process to list." msgstr "" #: mu/modes/api/python3.py:328 msgid "" "os.setpgid(pid, pgrp, /) \n" "Call the system call setpgid(pid, pgrp)." msgstr "" #: mu/modes/api/python3.py:329 msgid "" "os.setpgrp() \n" "Make the current process the leader of its process group." msgstr "" #: mu/modes/api/python3.py:330 msgid "" "os.setpriority(which, who, priority) \n" "Set program scheduling priority." msgstr "" #: mu/modes/api/python3.py:331 msgid "" "os.setregid(rgid, egid, /) \n" "Set the current process's real and effective group ids." msgstr "" #: mu/modes/api/python3.py:332 msgid "" "os.setresgid(rgid, egid, sgid, /) \n" "Set the current process's real, effective, and saved group ids." msgstr "" #: mu/modes/api/python3.py:333 msgid "" "os.setresuid(ruid, euid, suid, /) \n" "Set the current process's real, effective, and saved user ids." msgstr "" #: mu/modes/api/python3.py:334 msgid "" "os.setreuid(ruid, euid, /) \n" "Set the current process's real and effective user ids." msgstr "" #: mu/modes/api/python3.py:335 msgid "" "os.setsid() \n" "Call the system call setsid()." msgstr "" #: mu/modes/api/python3.py:336 msgid "" "os.setuid(uid, /) \n" "Set the current process's user id." msgstr "" #: mu/modes/api/python3.py:337 msgid "" "os.setxattr(path, attribute, value, flags=0, *, follow_symlinks=True) \n" "Set extended attribute attribute on path to value.\n" "\n" "path may be either a string or an open file descriptor.\n" "If follow_symlinks is False, and the last element of the path is a symbolic\n" " link, setxattr will modify the symbolic link itself instead of the file\n" " the link points to." msgstr "" #: mu/modes/api/python3.py:338 msgid "" "os.spawnl(mode, file, *args) \n" "spawnl(mode, file, *args) -> integer\n" "\n" "Execute file with arguments from args in a subprocess.\n" "If mode == P_NOWAIT return the pid of the process.\n" "If mode == P_WAIT return the process's exit code if it exits normally;\n" "otherwise return -SIG, where SIG is the signal that killed it. " msgstr "" #: mu/modes/api/python3.py:339 msgid "" "os.spawnle(mode, file, *args) \n" "spawnle(mode, file, *args, env) -> integer\n" "\n" "Execute file with arguments from args in a subprocess with the\n" "supplied environment.\n" "If mode == P_NOWAIT return the pid of the process.\n" "If mode == P_WAIT return the process's exit code if it exits normally;\n" "otherwise return -SIG, where SIG is the signal that killed it. " msgstr "" #: mu/modes/api/python3.py:340 msgid "" "os.spawnlp(mode, file, *args) \n" "spawnlp(mode, file, *args) -> integer\n" "\n" "Execute file (which is looked for along $PATH) with arguments from\n" "args in a subprocess with the supplied environment.\n" "If mode == P_NOWAIT return the pid of the process.\n" "If mode == P_WAIT return the process's exit code if it exits normally;\n" "otherwise return -SIG, where SIG is the signal that killed it. " msgstr "" #: mu/modes/api/python3.py:341 msgid "" "os.spawnlpe(mode, file, *args) \n" "spawnlpe(mode, file, *args, env) -> integer\n" "\n" "Execute file (which is looked for along $PATH) with arguments from\n" "args in a subprocess with the supplied environment.\n" "If mode == P_NOWAIT return the pid of the process.\n" "If mode == P_WAIT return the process's exit code if it exits normally;\n" "otherwise return -SIG, where SIG is the signal that killed it. " msgstr "" #: mu/modes/api/python3.py:342 msgid "" "os.spawnv(mode, file, args) \n" "spawnv(mode, file, args) -> integer\n" "\n" "Execute file with arguments from args in a subprocess.\n" "If mode == P_NOWAIT return the pid of the process.\n" "If mode == P_WAIT return the process's exit code if it exits normally;\n" "otherwise return -SIG, where SIG is the signal that killed it. " msgstr "" #: mu/modes/api/python3.py:343 msgid "" "os.spawnve(mode, file, args, env) \n" "spawnve(mode, file, args, env) -> integer\n" "\n" "Execute file with arguments from args in a subprocess with the\n" "specified environment.\n" "If mode == P_NOWAIT return the pid of the process.\n" "If mode == P_WAIT return the process's exit code if it exits normally;\n" "otherwise return -SIG, where SIG is the signal that killed it. " msgstr "" #: mu/modes/api/python3.py:344 msgid "" "os.spawnvp(mode, file, args) \n" "spawnvp(mode, file, args) -> integer\n" "\n" "Execute file (which is looked for along $PATH) with arguments from\n" "args in a subprocess.\n" "If mode == P_NOWAIT return the pid of the process.\n" "If mode == P_WAIT return the process's exit code if it exits normally;\n" "otherwise return -SIG, where SIG is the signal that killed it. " msgstr "" #: mu/modes/api/python3.py:345 msgid "" "os.spawnvpe(mode, file, args, env) \n" "spawnvpe(mode, file, args, env) -> integer\n" "\n" "Execute file (which is looked for along $PATH) with arguments from\n" "args in a subprocess with the supplied environment.\n" "If mode == P_NOWAIT return the pid of the process.\n" "If mode == P_WAIT return the process's exit code if it exits normally;\n" "otherwise return -SIG, where SIG is the signal that killed it. " msgstr "" #: mu/modes/api/python3.py:346 msgid "" "os.stat() \n" "Constants/functions for interpreting results of os.stat() and os.lstat().\n" "\n" "Suggested usage: from stat import *" msgstr "" #: mu/modes/api/python3.py:347 msgid "" "os.stat(path, *, dir_fd=None, follow_symlinks=True) \n" "Perform a stat system call on the given path.\n" "\n" " path\n" " Path to be examined; can be string, bytes, path-like object or\n" " open-file-descriptor int.\n" " dir_fd\n" " If not None, it should be a file descriptor open to a directory,\n" " and path should be a relative string; path will then be relative to\n" " that directory.\n" " follow_symlinks\n" " If False, and the last element of the path is a symbolic link,\n" " stat will examine the symbolic link itself instead of the file\n" " the link points to.\n" "\n" "dir_fd and follow_symlinks may not be implemented\n" " on your platform. If they are unavailable, using them will raise a\n" " NotImplementedError.\n" "\n" "It's an error to use dir_fd or follow_symlinks when specifying path as\n" " an open file descriptor." msgstr "" #: mu/modes/api/python3.py:348 msgid "" "os.stat_float_times() \n" "stat_float_times([newval]) -> oldval\n" "\n" "Determine whether os.[lf]stat represents time stamps as float objects.\n" "\n" "If value is True, future calls to stat() return floats; if it is False,\n" "future calls return ints.\n" "If value is omitted, return the current setting." msgstr "" #: mu/modes/api/python3.py:349 msgid "" "os.stat_result() \n" "stat_result: Result from stat, fstat, or lstat.\n" "\n" "This object may be accessed either as a tuple of\n" " (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n" "or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n" "\n" "Posix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\n" "or st_flags, they are available as attributes only.\n" "\n" "See os.stat for more information." msgstr "" #: mu/modes/api/python3.py:350 msgid "" "os.statvfs(path) \n" "Perform a statvfs system call on the given path.\n" "\n" "path may always be specified as a string.\n" "On some platforms, path may also be specified as an open file descriptor.\n" " If this functionality is unavailable, using it raises an exception." msgstr "" #: mu/modes/api/python3.py:351 msgid "" "os.statvfs_result() \n" "statvfs_result: Result from statvfs or fstatvfs.\n" "\n" "This object may be accessed either as a tuple of\n" " (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, " "namemax),\n" "or via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n" "\n" "See os.statvfs for more information." msgstr "" #: mu/modes/api/python3.py:352 msgid "" "os.strerror(code, /) \n" "Translate an error code to a message string." msgstr "" #: mu/modes/api/python3.py:353 msgid "" "os.symlink(src, dst, target_is_directory=False, *, dir_fd=None) \n" "Create a symbolic link pointing to src named dst.\n" "\n" "target_is_directory is required on Windows if the target is to be\n" " interpreted as a directory. (On Windows, symlink requires\n" " Windows 6.0 or greater, and raises a NotImplementedError otherwise.)\n" " target_is_directory is ignored on non-Windows platforms.\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:354 msgid "" "os.sync() \n" "Force write of everything to disk." msgstr "" #: mu/modes/api/python3.py:355 msgid "" "os.sys() \n" "This module provides access to some objects used or maintained by the\n" "interpreter and to functions that interact strongly with the interpreter.\n" "\n" "Dynamic objects:\n" "\n" "argv -- command line arguments; argv[0] is the script pathname if known\n" "path -- module search path; path[0] is the script directory, else ''\n" "modules -- dictionary of loaded modules\n" "\n" "displayhook -- called to show results in an interactive session\n" "excepthook -- called to handle any uncaught exception other than SystemExit\n" " To customize printing in an interactive session or to install a custom\n" " top-level exception handler, assign other functions to replace these.\n" "\n" "stdin -- standard input file object; used by input()\n" "stdout -- standard output file object; used by print()\n" "stderr -- standard error object; used for error messages\n" " By assigning other file objects (or objects that behave like files)\n" " to these, it is possible to redirect all of the interpreter's I/O.\n" "\n" "last_type -- type of last uncaught exception\n" "last_value -- value of last uncaught exception\n" "last_traceback -- traceback of last uncaught exception\n" " These three are only available in an interactive session after a\n" " traceback has been printed.\n" "\n" "Static objects:\n" "\n" "builtin_module_names -- tuple of module names built into this interpreter\n" "copyright -- copyright notice pertaining to this interpreter\n" "exec_prefix -- prefix used to find the machine-specific Python library\n" "executable -- absolute path of the executable binary of the Python " "interpreter\n" "float_info -- a struct sequence with information about the float " "implementation.\n" "float_repr_style -- string indicating the style of repr() output for floats\n" "hash_info -- a struct sequence with information about the hash algorithm.\n" "hexversion -- version information encoded as a single integer\n" "implementation -- Python implementation information.\n" "int_info -- a struct sequence with information about the int " "implementation.\n" "maxsize -- the largest supported length of containers.\n" "maxunicode -- the value of the largest Unicode code point\n" "platform -- platform identifier\n" "prefix -- prefix used to find the Python library\n" "thread_info -- a struct sequence with information about the thread " "implementation.\n" "version -- the version of this interpreter as a string\n" "version_info -- version information as a named tuple\n" "__stdin__ -- the original stdin; don't touch!\n" "__stdout__ -- the original stdout; don't touch!\n" "__stderr__ -- the original stderr; don't touch!\n" "__displayhook__ -- the original displayhook; don't touch!\n" "__excepthook__ -- the original excepthook; don't touch!\n" "\n" "Functions:\n" "\n" "displayhook() -- print an object to the screen, and save it in builtins._\n" "excepthook() -- print an exception and its traceback to sys.stderr\n" "exc_info() -- return thread-safe information about the current exception\n" "exit() -- exit the interpreter by raising SystemExit\n" "getdlopenflags() -- returns flags to be used for dlopen() calls\n" "getprofile() -- get the global profiling function\n" "getrefcount() -- return the reference count for an object (plus one :-)\n" "getrecursionlimit() -- return the max recursion depth for the interpreter\n" "getsizeof() -- return the size of an object in bytes\n" "gettrace() -- get the global debug tracing function\n" "setcheckinterval() -- control how often the interpreter checks for events\n" "setdlopenflags() -- set the flags to be used for dlopen() calls\n" "setprofile() -- set the global profiling function\n" "setrecursionlimit() -- set the max recursion depth for the interpreter\n" "settrace() -- set the global debug tracing function" msgstr "" #: mu/modes/api/python3.py:356 msgid "" "os.sysconf(name, /) \n" "Return an integer-valued system configuration variable." msgstr "" #: mu/modes/api/python3.py:357 msgid "" "os.system(command) \n" "Execute the command in a subshell." msgstr "" #: mu/modes/api/python3.py:358 msgid "" "os.tcgetpgrp(fd, /) \n" "Return the process group associated with the terminal specified by fd." msgstr "" #: mu/modes/api/python3.py:359 msgid "" "os.tcsetpgrp(fd, pgid, /) \n" "Set the process group associated with the terminal specified by fd." msgstr "" #: mu/modes/api/python3.py:360 msgid "" "os.terminal_size() \n" "A tuple of (columns, lines) for holding terminal window size" msgstr "" #: mu/modes/api/python3.py:361 msgid "" "os.times() \n" "Return a collection containing process timing information.\n" "\n" "The object returned behaves like a named tuple with these fields:\n" " (utime, stime, cutime, cstime, elapsed_time)\n" "All fields are floating point numbers." msgstr "" #: mu/modes/api/python3.py:362 msgid "" "os.times_result() \n" "times_result: Result from os.times().\n" "\n" "This object may be accessed either as a tuple of\n" " (user, system, children_user, children_system, elapsed),\n" "or via the attributes user, system, children_user, children_system,\n" "and elapsed.\n" "\n" "See os.times for more information." msgstr "" #: mu/modes/api/python3.py:363 msgid "" "os.truncate(path, length) \n" "Truncate a file, specified by path, to a specific length.\n" "\n" "On some platforms, path may also be specified as an open file descriptor.\n" " If this functionality is unavailable, using it raises an exception." msgstr "" #: mu/modes/api/python3.py:364 msgid "" "os.ttyname(fd, /) \n" "Return the name of the terminal device connected to 'fd'.\n" "\n" "fd\n" " Integer file descriptor handle." msgstr "" #: mu/modes/api/python3.py:365 msgid "" "os.umask(mask, /) \n" "Set the current numeric umask and return the previous umask." msgstr "" #: mu/modes/api/python3.py:366 msgid "" "os.uname() \n" "Return an object identifying the current operating system.\n" "\n" "The object behaves like a named tuple with the following fields:\n" " (sysname, nodename, release, version, machine)" msgstr "" #: mu/modes/api/python3.py:367 msgid "" "os.uname_result() \n" "uname_result: Result from os.uname().\n" "\n" "This object may be accessed either as a tuple of\n" " (sysname, nodename, release, version, machine),\n" "or via the attributes sysname, nodename, release, version, and machine.\n" "\n" "See os.uname for more information." msgstr "" #: mu/modes/api/python3.py:368 msgid "" "os.unlink(path, *, dir_fd=None) \n" "Remove a file (same as remove()).\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "dir_fd may not be implemented on your platform.\n" " If it is unavailable, using it will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:369 msgid "" "os.unsetenv(name, /) \n" "Delete an environment variable." msgstr "" #: mu/modes/api/python3.py:370 msgid "" "os.urandom(size, /) \n" "Return a bytes object containing random bytes suitable for cryptographic use." msgstr "" #: mu/modes/api/python3.py:371 msgid "" "os.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True) \n" "Set the access and modified time of path.\n" "\n" "path may always be specified as a string.\n" "On some platforms, path may also be specified as an open file descriptor.\n" " If this functionality is unavailable, using it raises an exception.\n" "\n" "If times is not None, it must be a tuple (atime, mtime);\n" " atime and mtime should be expressed as float seconds since the epoch.\n" "If ns is specified, it must be a tuple (atime_ns, mtime_ns);\n" " atime_ns and mtime_ns should be expressed as integer nanoseconds\n" " since the epoch.\n" "If times is None and ns is unspecified, utime uses the current time.\n" "Specifying tuples for both times and ns is an error.\n" "\n" "If dir_fd is not None, it should be a file descriptor open to a directory,\n" " and path should be relative; path will then be relative to that " "directory.\n" "If follow_symlinks is False, and the last element of the path is a symbolic\n" " link, utime will modify the symbolic link itself instead of the file the\n" " link points to.\n" "It is an error to use dir_fd or follow_symlinks when specifying path\n" " as an open file descriptor.\n" "dir_fd and follow_symlinks may not be available on your platform.\n" " If they are unavailable, using them will raise a NotImplementedError." msgstr "" #: mu/modes/api/python3.py:372 msgid "" "os.wait() \n" "Wait for completion of a child process.\n" "\n" "Returns a tuple of information about the child process:\n" " (pid, status)" msgstr "" #: mu/modes/api/python3.py:373 msgid "" "os.wait3(options) \n" "Wait for completion of a child process.\n" "\n" "Returns a tuple of information about the child process:\n" " (pid, status, rusage)" msgstr "" #: mu/modes/api/python3.py:374 msgid "" "os.wait4(pid, options) \n" "Wait for completion of a specific child process.\n" "\n" "Returns a tuple of information about the child process:\n" " (pid, status, rusage)" msgstr "" #: mu/modes/api/python3.py:375 msgid "" "os.waitid(idtype, id, options, /) \n" "Returns the result of waiting for a process or processes.\n" "\n" " idtype\n" " Must be one of be P_PID, P_PGID or P_ALL.\n" " id\n" " The id to wait on.\n" " options\n" " Constructed from the ORing of one or more of WEXITED, WSTOPPED\n" " or WCONTINUED and additionally may be ORed with WNOHANG or WNOWAIT.\n" "\n" "Returns either waitid_result or None if WNOHANG is specified and there are\n" "no children in a waitable state." msgstr "" #: mu/modes/api/python3.py:376 msgid "" "os.waitid_result() \n" "waitid_result: Result from waitid.\n" "\n" "This object may be accessed either as a tuple of\n" " (si_pid, si_uid, si_signo, si_status, si_code),\n" "or via the attributes si_pid, si_uid, and so on.\n" "\n" "See os.waitid for more information." msgstr "" #: mu/modes/api/python3.py:377 msgid "" "os.waitpid(pid, options, /) \n" "Wait for completion of a given child process.\n" "\n" "Returns a tuple of information regarding the child process:\n" " (pid, status)\n" "\n" "The options argument is ignored on Windows." msgstr "" #: mu/modes/api/python3.py:378 msgid "" "os.walk(top, topdown=True, onerror=None, followlinks=False) \n" "Directory tree generator.\n" "\n" "For each directory in the directory tree rooted at top (including top\n" "itself, but excluding '.' and '..'), yields a 3-tuple\n" "\n" " dirpath, dirnames, filenames\n" "\n" "dirpath is a string, the path to the directory. dirnames is a list of\n" "the names of the subdirectories in dirpath (excluding '.' and '..').\n" "filenames is a list of the names of the non-directory files in dirpath.\n" "Note that the names in the lists are just names, with no path components.\n" "To get a full path (which begins with top) to a file or directory in\n" "dirpath, do os.path.join(dirpath, name).\n" "\n" "If optional arg 'topdown' is true or not specified, the triple for a\n" "directory is generated before the triples for any of its subdirectories\n" "(directories are generated top down). If topdown is false, the triple\n" "for a directory is generated after the triples for all of its\n" "subdirectories (directories are generated bottom up).\n" "\n" "When topdown is true, the caller can modify the dirnames list in-place\n" "(e.g., via del or slice assignment), and walk will only recurse into the\n" "subdirectories whose names remain in dirnames; this can be used to prune " "the\n" "search, or to impose a specific order of visiting. Modifying dirnames when\n" "topdown is false is ineffective, since the directories in dirnames have\n" "already been generated by the time dirnames itself is generated. No matter\n" "the value of topdown, the list of subdirectories is retrieved before the\n" "tuples for the directory and its subdirectories are generated.\n" "\n" "By default errors from the os.scandir() call are ignored. If\n" "optional arg 'onerror' is specified, it should be a function; it\n" "will be called with one argument, an OSError instance. It can\n" "report the error to continue with the walk, or raise the exception\n" "to abort the walk. Note that the filename is available as the\n" "filename attribute of the exception object.\n" "\n" "By default, os.walk does not follow symbolic links to subdirectories on\n" "systems that support them. In order to get this functionality, set the\n" "optional argument 'followlinks' to true.\n" "\n" "Caution: if you pass a relative pathname for top, don't change the\n" "current working directory between resumptions of walk. walk never\n" "changes the current directory, and assumes that the client doesn't\n" "either.\n" "\n" "Example:\n" "\n" "import os\n" "from os.path import join, getsize\n" "for root, dirs, files in os.walk('python/Lib/email'):\n" " print(root, \"consumes\", end=\"\")\n" " print(sum([getsize(join(root, name)) for name in files]), end=\"\")\n" " print(\"bytes in\", len(files), \"non-directory files\")\n" " if 'CVS' in dirs:\n" " dirs.remove('CVS') # don't visit CVS directories" msgstr "" #: mu/modes/api/python3.py:379 msgid "" "os.write(fd, data, /) \n" "Write a bytes object to a file descriptor." msgstr "" #: mu/modes/api/python3.py:380 msgid "" "os.writev(fd, buffers, /) \n" "Iterate over buffers, and write the contents of each to a file descriptor.\n" "\n" "Returns the total number of bytes written.\n" "buffers must be a sequence of bytes-like objects." msgstr "" #: mu/modes/api/python3.py:381 msgid "" "random.Random(x=None) \n" "Random number generator base class used by bound module functions.\n" "\n" "Used to instantiate instances of Random to get generators that don't\n" "share state.\n" "\n" "Class Random can also be subclassed if you want to use a different basic\n" "generator of your own devising: in that case, override the following\n" "methods: random(), seed(), getstate(), and setstate().\n" "Optionally, implement a getrandbits() method so that randrange()\n" "can cover arbitrarily large ranges." msgstr "" #: mu/modes/api/python3.py:382 msgid "" "random.SystemRandom(x=None) \n" "Alternate random number generator using sources provided\n" "by the operating system (such as /dev/urandom on Unix or\n" "CryptGenRandom on Windows).\n" "\n" " Not available on all systems (see os.urandom() for details)." msgstr "" #: mu/modes/api/python3.py:383 msgid "" "random.betavariate(alpha, beta) \n" "Beta distribution.\n" "\n" "Conditions on the parameters are alpha > 0 and beta > 0.\n" "Returned values range between 0 and 1." msgstr "" #: mu/modes/api/python3.py:384 msgid "" "random.choice(seq) \n" "Choose a random element from a non-empty sequence." msgstr "" #: mu/modes/api/python3.py:385 msgid "" "random.choices(population, weights=None, *, cum_weights=None, k=1) \n" "Return a k sized list of population elements chosen with replacement.\n" "\n" "If the relative weights or cumulative weights are not specified,\n" "the selections are made with equal probability." msgstr "" #: mu/modes/api/python3.py:386 msgid "" "random.expovariate(lambd) \n" "Exponential distribution.\n" "\n" "lambd is 1.0 divided by the desired mean. It should be\n" "nonzero. (The parameter would be called \"lambda\", but that is\n" "a reserved word in Python.) Returned values range from 0 to\n" "positive infinity if lambd is positive, and from negative\n" "infinity to 0 if lambd is negative." msgstr "" #: mu/modes/api/python3.py:387 msgid "" "random.gammavariate(alpha, beta) \n" "Gamma distribution. Not the gamma function!\n" "\n" "Conditions on the parameters are alpha > 0 and beta > 0.\n" "\n" "The probability distribution function is:\n" "\n" " x ** (alpha - 1) * math.exp(-x / beta)\n" " pdf(x) = --------------------------------------\n" " math.gamma(alpha) * beta ** alpha" msgstr "" #: mu/modes/api/python3.py:388 msgid "" "random.gauss(mu, sigma) \n" "Gaussian distribution.\n" "\n" "mu is the mean, and sigma is the standard deviation. This is\n" "slightly faster than the normalvariate() function.\n" "\n" "Not thread-safe without a lock around calls." msgstr "" #: mu/modes/api/python3.py:389 msgid "" "random.getrandbits() \n" "getrandbits(k) -> x. Generates an int with k random bits." msgstr "" #: mu/modes/api/python3.py:390 msgid "" "random.getstate() \n" "Return internal state; can be passed to setstate() later." msgstr "" #: mu/modes/api/python3.py:391 msgid "" "random.lognormvariate(mu, sigma) \n" "Log normal distribution.\n" "\n" "If you take the natural logarithm of this distribution, you'll get a\n" "normal distribution with mean mu and standard deviation sigma.\n" "mu can have any value, and sigma must be greater than zero." msgstr "" #: mu/modes/api/python3.py:392 msgid "" "random.normalvariate(mu, sigma) \n" "Normal distribution.\n" "\n" "mu is the mean, and sigma is the standard deviation." msgstr "" #: mu/modes/api/python3.py:393 msgid "" "random.paretovariate(alpha) \n" "Pareto distribution. alpha is the shape parameter." msgstr "" #: mu/modes/api/python3.py:394 msgid "" "random.randint(a, b) \n" "Return random integer in range [a, b], including both end points.\n" " " msgstr "" #: mu/modes/api/python3.py:395 msgid "" "random.random() \n" "random() -> x in the interval [0, 1)." msgstr "" #: mu/modes/api/python3.py:396 msgid "" "random.randrange(start, stop=None, step=1, _int=) \n" "Choose a random item from range(start, stop[, step]).\n" "\n" "This fixes the problem with randint() which includes the\n" "endpoint; in Python this is usually not what you want." msgstr "" #: mu/modes/api/python3.py:397 msgid "" "random.sample(population, k) \n" "Chooses k unique random elements from a population sequence or set.\n" "\n" "Returns a new list containing elements from the population while\n" "leaving the original population unchanged. The resulting list is\n" "in selection order so that all sub-slices will also be valid random\n" "samples. This allows raffle winners (the sample) to be partitioned\n" "into grand prize and second place winners (the subslices).\n" "\n" "Members of the population need not be hashable or unique. If the\n" "population contains repeats, then each occurrence is a possible\n" "selection in the sample.\n" "\n" "To choose a sample in a range of integers, use range as an argument.\n" "This is especially fast and space efficient for sampling from a\n" "large population: sample(range(10000000), 60)" msgstr "" #: mu/modes/api/python3.py:398 msgid "" "random.seed(a=None, version=2) \n" "Initialize internal state from hashable object.\n" "\n" "None or no argument seeds from current time or from an operating\n" "system specific randomness source if available.\n" "\n" "If *a* is an int, all bits are used.\n" "\n" "For version 2 (the default), all of the bits are used if *a* is a str,\n" "bytes, or bytearray. For version 1 (provided for reproducing random\n" "sequences from older versions of Python), the algorithm for str and\n" "bytes generates a narrower range of seeds." msgstr "" #: mu/modes/api/python3.py:399 msgid "" "random.setstate(state) \n" "Restore internal state from object returned by getstate()." msgstr "" #: mu/modes/api/python3.py:400 msgid "" "random.shuffle(x, random=None) \n" "Shuffle list x in place, and return None.\n" "\n" "Optional argument random is a 0-argument function returning a\n" "random float in [0.0, 1.0); if it is the default None, the\n" "standard random.random will be used." msgstr "" #: mu/modes/api/python3.py:401 msgid "" "random.triangular(low=0.0, high=1.0, mode=None) \n" "Triangular distribution.\n" "\n" "Continuous distribution bounded by given lower and upper limits,\n" "and having a given mode value in-between.\n" "\n" "http://en.wikipedia.org/wiki/Triangular_distribution" msgstr "" #: mu/modes/api/python3.py:402 msgid "" "random.uniform(a, b) \n" "Get a random number in the range [a, b) or [a, b] depending on rounding." msgstr "" #: mu/modes/api/python3.py:403 msgid "" "random.vonmisesvariate(mu, kappa) \n" "Circular data distribution.\n" "\n" "mu is the mean angle, expressed in radians between 0 and 2*pi, and\n" "kappa is the concentration parameter, which must be greater than or\n" "equal to zero. If kappa is equal to zero, this distribution reduces\n" "to a uniform random angle over the range 0 to 2*pi." msgstr "" #: mu/modes/api/python3.py:404 msgid "" "random.weibullvariate(alpha, beta) \n" "Weibull distribution.\n" "\n" "alpha is the scale parameter and beta is the shape parameter." msgstr "" #: mu/modes/api/python3.py:405 msgid "" "socket.AddressFamily(value, names=None, *, module=None, qualname=None, " "type=None, start=1) \n" "An enumeration." msgstr "" #: mu/modes/api/python3.py:406 msgid "" "socket.AddressInfo(value, names=None, *, module=None, qualname=None, " "type=None, start=1) \n" "An enumeration." msgstr "" #: mu/modes/api/python3.py:407 msgid "" "socket.CMSG_LEN() \n" "CMSG_LEN(length) -> control message length\n" "\n" "Return the total length, without trailing padding, of an ancillary\n" "data item with associated data of the given length. This value can\n" "often be used as the buffer size for recvmsg() to receive a single\n" "item of ancillary data, but RFC 3542 requires portable applications to\n" "use CMSG_SPACE() and thus include space for padding, even when the\n" "item will be the last in the buffer. Raises OverflowError if length\n" "is outside the permissible range of values." msgstr "" #: mu/modes/api/python3.py:408 msgid "" "socket.CMSG_SPACE() \n" "CMSG_SPACE(length) -> buffer size\n" "\n" "Return the buffer size needed for recvmsg() to receive an ancillary\n" "data item with associated data of the given length, along with any\n" "trailing padding. The buffer space needed to receive multiple items\n" "is the sum of the CMSG_SPACE() values for their associated data\n" "lengths. Raises OverflowError if length is outside the permissible\n" "range of values." msgstr "" #: mu/modes/api/python3.py:409 msgid "" "socket.IntEnum(value, names=None, *, module=None, qualname=None, type=None, " "start=1) \n" "Enum where members are also (and must be) ints" msgstr "" #: mu/modes/api/python3.py:410 msgid "" "socket.IntFlag(value, names=None, *, module=None, qualname=None, type=None, " "start=1) \n" "Support for integer-based Flags" msgstr "" #: mu/modes/api/python3.py:411 msgid "" "socket.MsgFlag(value, names=None, *, module=None, qualname=None, type=None, " "start=1) \n" "An enumeration." msgstr "" #: mu/modes/api/python3.py:412 msgid "" "socket.OSError() \n" "Base class for I/O related errors." msgstr "" #: mu/modes/api/python3.py:413 msgid "" "socket.SocketIO(sock, mode) \n" "Raw I/O implementation for stream sockets.\n" "\n" "This class supports the makefile() method on sockets. It provides\n" "the raw I/O interface on top of a socket object." msgstr "" #: mu/modes/api/python3.py:414 msgid "" "socket.SocketKind(value, names=None, *, module=None, qualname=None, " "type=None, start=1) \n" "An enumeration." msgstr "" #: mu/modes/api/python3.py:415 msgid "" "socket.create_connection(address, timeout=, " "source_address=None) \n" "Connect to *address* and return the socket object.\n" "\n" "Convenience function. Connect to *address* (a 2-tuple ``(host,\n" "port)``) and return the socket object. Passing the optional\n" "*timeout* parameter will set the timeout on the socket instance\n" "before attempting to connect. If no *timeout* is supplied, the\n" "global default timeout setting returned by :func:`getdefaulttimeout`\n" "is used. If *source_address* is set it must be a tuple of (host, port)\n" "for the socket to bind as a source address before making the connection.\n" "A host of '' or port 0 tells the OS to use the default." msgstr "" #: mu/modes/api/python3.py:416 msgid "" "socket.dup() \n" "dup(integer) -> integer\n" "\n" "Duplicate an integer socket file descriptor. This is like os.dup(), but " "for\n" "sockets; on some platforms os.dup() won't work for socket file descriptors." msgstr "" #: mu/modes/api/python3.py:417 msgid "" "socket.errno() \n" "This module makes available standard errno system symbols.\n" "\n" "The value of each symbol is the corresponding integer value,\n" "e.g., on most systems, errno.ENOENT equals the integer 2.\n" "\n" "The dictionary errno.errorcode maps numeric codes to symbol names,\n" "e.g., errno.errorcode[2] could be the string 'ENOENT'.\n" "\n" "Symbols that are not relevant to the underlying system are not defined.\n" "\n" "To map error codes to error messages, use the function os.strerror(),\n" "e.g. os.strerror(2) could return 'No such file or directory'." msgstr "" #: mu/modes/api/python3.py:418 msgid "" "socket.fromfd(fd, family, type, proto=0) \n" "fromfd(fd, family, type[, proto]) -> socket object\n" "\n" "Create a socket object from a duplicate of the given file\n" "descriptor. The remaining arguments are the same as for socket()." msgstr "" #: mu/modes/api/python3.py:419 msgid "" "socket.gaierror() \n" "Base class for I/O related errors." msgstr "" #: mu/modes/api/python3.py:420 msgid "" "socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) \n" "Resolve host and port into list of address info entries.\n" "\n" "Translate the host/port argument into a sequence of 5-tuples that contain\n" "all the necessary arguments for creating a socket connected to that " "service.\n" "host is a domain name, a string representation of an IPv4/v6 address or\n" "None. port is a string service name such as 'http', a numeric port number " "or\n" "None. By passing None as the value of host and port, you can pass NULL to\n" "the underlying C API.\n" "\n" "The family, type and proto arguments can be optionally specified in order " "to\n" "narrow the list of addresses returned. Passing zero as a value for each of\n" "these arguments selects the full range of results." msgstr "" #: mu/modes/api/python3.py:421 msgid "" "socket.getdefaulttimeout() \n" "getdefaulttimeout() -> timeout\n" "\n" "Returns the default timeout in seconds (float) for new socket objects.\n" "A value of None indicates that new socket objects have no timeout.\n" "When the socket module is first imported, the default is None." msgstr "" #: mu/modes/api/python3.py:422 msgid "" "socket.getfqdn(name='') \n" "Get fully qualified domain name from name.\n" "\n" "An empty argument is interpreted as meaning the local host.\n" "\n" "First the hostname returned by gethostbyaddr() is checked, then\n" "possibly existing aliases. In case no FQDN is available, hostname\n" "from gethostname() is returned." msgstr "" #: mu/modes/api/python3.py:423 msgid "" "socket.gethostbyaddr() \n" "gethostbyaddr(host) -> (name, aliaslist, addresslist)\n" "\n" "Return the true host name, a list of aliases, and a list of IP addresses,\n" "for a host. The host argument is a string giving a host name or IP number." msgstr "" #: mu/modes/api/python3.py:424 msgid "" "socket.gethostbyname() \n" "gethostbyname(host) -> address\n" "\n" "Return the IP address (a string of the form '255.255.255.255') for a host." msgstr "" #: mu/modes/api/python3.py:425 msgid "" "socket.gethostbyname_ex() \n" "gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n" "\n" "Return the true host name, a list of aliases, and a list of IP addresses,\n" "for a host. The host argument is a string giving a host name or IP number." msgstr "" #: mu/modes/api/python3.py:426 msgid "" "socket.gethostname() \n" "gethostname() -> string\n" "\n" "Return the current host name." msgstr "" #: mu/modes/api/python3.py:427 msgid "" "socket.getnameinfo() \n" "getnameinfo(sockaddr, flags) --> (host, port)\n" "\n" "Get host and port for a sockaddr." msgstr "" #: mu/modes/api/python3.py:428 msgid "" "socket.getprotobyname() \n" "getprotobyname(name) -> integer\n" "\n" "Return the protocol number for the named protocol. (Rarely used.)" msgstr "" #: mu/modes/api/python3.py:429 msgid "" "socket.getservbyname() \n" "getservbyname(servicename[, protocolname]) -> integer\n" "\n" "Return a port number from a service name and protocol name.\n" "The optional protocol name, if given, should be 'tcp' or 'udp',\n" "otherwise any protocol will match." msgstr "" #: mu/modes/api/python3.py:430 msgid "" "socket.getservbyport() \n" "getservbyport(port[, protocolname]) -> string\n" "\n" "Return the service name from a port number and protocol name.\n" "The optional protocol name, if given, should be 'tcp' or 'udp',\n" "otherwise any protocol will match." msgstr "" #: mu/modes/api/python3.py:431 msgid "" "socket.herror() \n" "Base class for I/O related errors." msgstr "" #: mu/modes/api/python3.py:432 msgid "" "socket.htonl() \n" "htonl(integer) -> integer\n" "\n" "Convert a 32-bit integer from host to network byte order." msgstr "" #: mu/modes/api/python3.py:433 msgid "" "socket.htons() \n" "htons(integer) -> integer\n" "\n" "Convert a 16-bit integer from host to network byte order." msgstr "" #: mu/modes/api/python3.py:434 msgid "" "socket.if_indextoname() \n" "if_indextoname(if_index)\n" "\n" "Returns the interface name corresponding to the interface index if_index." msgstr "" #: mu/modes/api/python3.py:435 msgid "" "socket.if_nameindex() \n" "if_nameindex()\n" "\n" "Returns a list of network interface information (index, name) tuples." msgstr "" #: mu/modes/api/python3.py:436 msgid "" "socket.if_nametoindex() \n" "if_nametoindex(if_name)\n" "\n" "Returns the interface index corresponding to the interface name if_name." msgstr "" #: mu/modes/api/python3.py:437 msgid "" "socket.inet_aton() \n" "inet_aton(string) -> bytes giving packed 32-bit IP representation\n" "\n" "Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n" "binary format used in low-level network functions." msgstr "" #: mu/modes/api/python3.py:438 msgid "" "socket.inet_ntoa() \n" "inet_ntoa(packed_ip) -> ip_address_string\n" "\n" "Convert an IP address from 32-bit packed binary format to string format" msgstr "" #: mu/modes/api/python3.py:439 msgid "" "socket.inet_ntop() \n" "inet_ntop(af, packed_ip) -> string formatted IP address\n" "\n" "Convert a packed IP address of the given family to string format." msgstr "" #: mu/modes/api/python3.py:440 msgid "" "socket.inet_pton() \n" "inet_pton(af, ip) -> packed IP address string\n" "\n" "Convert an IP address from string format to a packed string suitable\n" "for use with low-level network functions." msgstr "" #: mu/modes/api/python3.py:441 msgid "" "socket.io() \n" "The io module provides the Python interfaces to stream handling. The\n" "builtin open function is defined in this module.\n" "\n" "At the top of the I/O hierarchy is the abstract base class IOBase. It\n" "defines the basic interface to a stream. Note, however, that there is no\n" "separation between reading and writing to streams; implementations are\n" "allowed to raise an OSError if they do not support a given operation.\n" "\n" "Extending IOBase is RawIOBase which deals simply with the reading and\n" "writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide\n" "an interface to OS files.\n" "\n" "BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its\n" "subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer\n" "streams that are readable, writable, and both respectively.\n" "BufferedRandom provides a buffered interface to random access\n" "streams. BytesIO is a simple stream of in-memory bytes.\n" "\n" "Another IOBase subclass, TextIOBase, deals with the encoding and decoding\n" "of streams into text. TextIOWrapper, which extends it, is a buffered text\n" "interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\n" "is an in-memory stream for text.\n" "\n" "Argument names are not part of the specification, and only the arguments\n" "of open() are intended to be used as keyword arguments.\n" "\n" "data:\n" "\n" "DEFAULT_BUFFER_SIZE\n" "\n" " An int containing the default buffer size used by the module's buffered\n" " I/O classes. open() uses the file's blksize (as obtained by os.stat) if\n" " possible." msgstr "" #: mu/modes/api/python3.py:442 msgid "" "socket.ntohl() \n" "ntohl(integer) -> integer\n" "\n" "Convert a 32-bit integer from network to host byte order." msgstr "" #: mu/modes/api/python3.py:443 msgid "" "socket.ntohs() \n" "ntohs(integer) -> integer\n" "\n" "Convert a 16-bit integer from network to host byte order." msgstr "" #: mu/modes/api/python3.py:444 msgid "" "socket.os() \n" "OS routines for NT or Posix depending on what system we're on.\n" "\n" "This exports:\n" " - all functions from posix or nt, e.g. unlink, stat, etc.\n" " - os.path is either posixpath or ntpath\n" " - os.name is either 'posix' or 'nt'\n" " - os.curdir is a string representing the current directory (always '.')\n" " - os.pardir is a string representing the parent directory (always '..')\n" " - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n" " - os.extsep is the extension separator (always '.')\n" " - os.altsep is the alternate pathname separator (None or '/')\n" " - os.pathsep is the component separator used in $PATH etc\n" " - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r" "\\n')\n" " - os.defpath is the default search path for executables\n" " - os.devnull is the file path of the null device ('/dev/null', etc.)\n" "\n" "Programs that import and use 'os' stand a better chance of being\n" "portable between different platforms. Of course, they must then\n" "only use functions that are defined by all platforms (e.g., unlink\n" "and opendir), and leave all pathname manipulation to os.path\n" "(e.g., split and join)." msgstr "" #: mu/modes/api/python3.py:445 msgid "" "socket.selectors() \n" "Selectors module.\n" "\n" "This module allows high-level and efficient I/O multiplexing, built upon " "the\n" "`select` module primitives." msgstr "" #: mu/modes/api/python3.py:446 msgid "" "socket.setdefaulttimeout() \n" "setdefaulttimeout(timeout)\n" "\n" "Set the default timeout in seconds (float) for new socket objects.\n" "A value of None indicates that new socket objects have no timeout.\n" "When the socket module is first imported, the default is None." msgstr "" #: mu/modes/api/python3.py:447 msgid "" "socket.sethostname() \n" "sethostname(name)\n" "\n" "Sets the hostname to name." msgstr "" #: mu/modes/api/python3.py:448 msgid "" "socket.socket() \n" "socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket " "object\n" "\n" "Open a socket of the given type. The family argument specifies the\n" "address family; it defaults to AF_INET. The type argument specifies\n" "whether this is a stream (SOCK_STREAM, this is the default)\n" "or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n" "specifying the default protocol. Keyword arguments are accepted.\n" "The socket is created as non-inheritable.\n" "\n" "A socket object represents one endpoint of a network connection.\n" "\n" "Methods of socket objects (keyword arguments not allowed):\n" "\n" "_accept() -- accept connection, returning new socket fd and client address\n" "bind(addr) -- bind the socket to a local address\n" "close() -- close the socket\n" "connect(addr) -- connect the socket to a remote address\n" "connect_ex(addr) -- connect, return an error code instead of an exception\n" "dup() -- return a new socket fd duplicated from fileno()\n" "fileno() -- return underlying file descriptor\n" "getpeername() -- return remote address [*]\n" "getsockname() -- return local address\n" "getsockopt(level, optname[, buflen]) -- get socket options\n" "gettimeout() -- return timeout or None\n" "listen([n]) -- start listening for incoming connections\n" "recv(buflen[, flags]) -- receive data\n" "recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n" "recvfrom(buflen[, flags]) -- receive data and sender's address\n" "recvfrom_into(buffer[, nbytes, [, flags])\n" " -- receive data and sender's address (into a buffer)\n" "sendall(data[, flags]) -- send all data\n" "send(data[, flags]) -- send data, may not send all of it\n" "sendto(data[, flags], addr) -- send data to a given address\n" "setblocking(0 | 1) -- set or clear the blocking I/O flag\n" "setsockopt(level, optname, value[, optlen]) -- set socket options\n" "settimeout(None | float) -- set or clear the timeout\n" "shutdown(how) -- shut down traffic in one or both directions\n" "if_nameindex() -- return all network interface indices and names\n" "if_nametoindex(name) -- return the corresponding interface index\n" "if_indextoname(index) -- return the corresponding interface name\n" "\n" " [*] not available on all platforms!" msgstr "" #: mu/modes/api/python3.py:449 msgid "" "socket.socket(family=, type=, proto=0, fileno=None) \n" "A subclass of _socket.socket adding the makefile() method." msgstr "" #: mu/modes/api/python3.py:450 msgid "" "socket.socketpair(family=None, type=, proto=0) \n" "socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n" "Create a pair of socket objects from the sockets returned by the platform\n" "socketpair() function.\n" "The arguments are the same as for socket() except the default family is " "AF_UNIX\n" "if defined on the platform; otherwise, the default is AF_INET." msgstr "" #: mu/modes/api/python3.py:451 msgid "" "socket.sys() \n" "This module provides access to some objects used or maintained by the\n" "interpreter and to functions that interact strongly with the interpreter.\n" "\n" "Dynamic objects:\n" "\n" "argv -- command line arguments; argv[0] is the script pathname if known\n" "path -- module search path; path[0] is the script directory, else ''\n" "modules -- dictionary of loaded modules\n" "\n" "displayhook -- called to show results in an interactive session\n" "excepthook -- called to handle any uncaught exception other than SystemExit\n" " To customize printing in an interactive session or to install a custom\n" " top-level exception handler, assign other functions to replace these.\n" "\n" "stdin -- standard input file object; used by input()\n" "stdout -- standard output file object; used by print()\n" "stderr -- standard error object; used for error messages\n" " By assigning other file objects (or objects that behave like files)\n" " to these, it is possible to redirect all of the interpreter's I/O.\n" "\n" "last_type -- type of last uncaught exception\n" "last_value -- value of last uncaught exception\n" "last_traceback -- traceback of last uncaught exception\n" " These three are only available in an interactive session after a\n" " traceback has been printed.\n" "\n" "Static objects:\n" "\n" "builtin_module_names -- tuple of module names built into this interpreter\n" "copyright -- copyright notice pertaining to this interpreter\n" "exec_prefix -- prefix used to find the machine-specific Python library\n" "executable -- absolute path of the executable binary of the Python " "interpreter\n" "float_info -- a struct sequence with information about the float " "implementation.\n" "float_repr_style -- string indicating the style of repr() output for floats\n" "hash_info -- a struct sequence with information about the hash algorithm.\n" "hexversion -- version information encoded as a single integer\n" "implementation -- Python implementation information.\n" "int_info -- a struct sequence with information about the int " "implementation.\n" "maxsize -- the largest supported length of containers.\n" "maxunicode -- the value of the largest Unicode code point\n" "platform -- platform identifier\n" "prefix -- prefix used to find the Python library\n" "thread_info -- a struct sequence with information about the thread " "implementation.\n" "version -- the version of this interpreter as a string\n" "version_info -- version information as a named tuple\n" "__stdin__ -- the original stdin; don't touch!\n" "__stdout__ -- the original stdout; don't touch!\n" "__stderr__ -- the original stderr; don't touch!\n" "__displayhook__ -- the original displayhook; don't touch!\n" "__excepthook__ -- the original excepthook; don't touch!\n" "\n" "Functions:\n" "\n" "displayhook() -- print an object to the screen, and save it in builtins._\n" "excepthook() -- print an exception and its traceback to sys.stderr\n" "exc_info() -- return thread-safe information about the current exception\n" "exit() -- exit the interpreter by raising SystemExit\n" "getdlopenflags() -- returns flags to be used for dlopen() calls\n" "getprofile() -- get the global profiling function\n" "getrefcount() -- return the reference count for an object (plus one :-)\n" "getrecursionlimit() -- return the max recursion depth for the interpreter\n" "getsizeof() -- return the size of an object in bytes\n" "gettrace() -- get the global debug tracing function\n" "setcheckinterval() -- control how often the interpreter checks for events\n" "setdlopenflags() -- set the flags to be used for dlopen() calls\n" "setprofile() -- set the global profiling function\n" "setrecursionlimit() -- set the max recursion depth for the interpreter\n" "settrace() -- set the global debug tracing function" msgstr "" #: mu/modes/api/python3.py:452 msgid "" "socket.timeout() \n" "Base class for I/O related errors." msgstr "" #: mu/modes/api/python3.py:453 msgid "" "sys.call_tracing() \n" "call_tracing(func, args) -> object\n" "\n" "Call func(*args), while tracing is enabled. The tracing state is\n" "saved, and restored afterwards. This is intended to be called from\n" "a debugger from a checkpoint, to recursively debug some other code." msgstr "" #: mu/modes/api/python3.py:454 msgid "" "sys.callstats() \n" "callstats() -> tuple of integers\n" "\n" "Return a tuple of function call statistics, if CALL_PROFILE was defined\n" "when Python was built. Otherwise, return None.\n" "\n" "When enabled, this function returns detailed, implementation-specific\n" "details about the number of function calls executed. The return value is\n" "a 11-tuple where the entries in the tuple are counts of:\n" "0. all function calls\n" "1. calls to PyFunction_Type objects\n" "2. PyFunction calls that do not create an argument tuple\n" "3. PyFunction calls that do not create an argument tuple\n" " and bypass PyEval_EvalCodeEx()\n" "4. PyMethod calls\n" "5. PyMethod calls on bound methods\n" "6. PyType calls\n" "7. PyCFunction calls\n" "8. generator calls\n" "9. All other calls\n" "10. Number of stack pops performed by call_function()" msgstr "" #: mu/modes/api/python3.py:455 msgid "" "sys.displayhook() \n" "displayhook(object) -> None\n" "\n" "Print an object to sys.stdout and also save it in builtins._" msgstr "" #: mu/modes/api/python3.py:456 msgid "" "sys.exc_info() \n" "exc_info() -> (type, value, traceback)\n" "\n" "Return information about the most recent exception caught by an except\n" "clause in the current stack frame or in an older stack frame." msgstr "" #: mu/modes/api/python3.py:457 msgid "" "sys.excepthook() \n" "excepthook(exctype, value, traceback) -> None\n" "\n" "Handle an exception by displaying it with a traceback on sys.stderr." msgstr "" #: mu/modes/api/python3.py:458 msgid "" "sys.exit() \n" "exit([status])\n" "\n" "Exit the interpreter by raising SystemExit(status).\n" "If the status is omitted or None, it defaults to zero (i.e., success).\n" "If the status is an integer, it will be used as the system exit status.\n" "If it is another kind of object, it will be printed and the system\n" "exit status will be one (i.e., failure)." msgstr "" #: mu/modes/api/python3.py:459 msgid "" "sys.get_asyncgen_hooks() \n" "get_asyncgen_hooks()\n" "\n" "Return a namedtuple of installed asynchronous generators hooks (firstiter, " "finalizer)." msgstr "" #: mu/modes/api/python3.py:460 msgid "" "sys.get_coroutine_wrapper() \n" "get_coroutine_wrapper()\n" "\n" "Return the wrapper for coroutine objects set by sys.set_coroutine_wrapper." msgstr "" #: mu/modes/api/python3.py:461 msgid "" "sys.getallocatedblocks() \n" "getallocatedblocks() -> integer\n" "\n" "Return the number of memory blocks currently allocated, regardless of their\n" "size." msgstr "" #: mu/modes/api/python3.py:462 msgid "" "sys.getcheckinterval() \n" "getcheckinterval() -> current check interval; see setcheckinterval()." msgstr "" #: mu/modes/api/python3.py:463 msgid "" "sys.getdefaultencoding() \n" "getdefaultencoding() -> string\n" "\n" "Return the current default string encoding used by the Unicode \n" "implementation." msgstr "" #: mu/modes/api/python3.py:464 msgid "" "sys.getdlopenflags() \n" "getdlopenflags() -> int\n" "\n" "Return the current value of the flags that are used for dlopen calls.\n" "The flag constants are defined in the os module." msgstr "" #: mu/modes/api/python3.py:465 msgid "" "sys.getfilesystemencodeerrors() \n" "getfilesystemencodeerrors() -> string\n" "\n" "Return the error mode used to convert Unicode filenames in\n" "operating system filenames." msgstr "" #: mu/modes/api/python3.py:466 msgid "" "sys.getfilesystemencoding() \n" "getfilesystemencoding() -> string\n" "\n" "Return the encoding used to convert Unicode filenames in\n" "operating system filenames." msgstr "" #: mu/modes/api/python3.py:467 msgid "" "sys.getprofile() \n" "getprofile()\n" "\n" "Return the profiling function set with sys.setprofile.\n" "See the profiler chapter in the library manual." msgstr "" #: mu/modes/api/python3.py:468 msgid "" "sys.getrecursionlimit() \n" "getrecursionlimit()\n" "\n" "Return the current value of the recursion limit, the maximum depth\n" "of the Python interpreter stack. This limit prevents infinite\n" "recursion from causing an overflow of the C stack and crashing Python." msgstr "" #: mu/modes/api/python3.py:469 msgid "" "sys.getrefcount() \n" "getrefcount(object) -> integer\n" "\n" "Return the reference count of object. The count returned is generally\n" "one higher than you might expect, because it includes the (temporary)\n" "reference as an argument to getrefcount()." msgstr "" #: mu/modes/api/python3.py:470 msgid "" "sys.getsizeof() \n" "getsizeof(object, default) -> int\n" "\n" "Return the size of object in bytes." msgstr "" #: mu/modes/api/python3.py:471 msgid "" "sys.getswitchinterval() \n" "getswitchinterval() -> current thread switch interval; see " "setswitchinterval()." msgstr "" #: mu/modes/api/python3.py:472 msgid "" "sys.gettrace() \n" "gettrace()\n" "\n" "Return the global debug tracing function set with sys.settrace.\n" "See the debugger chapter in the library manual." msgstr "" #: mu/modes/api/python3.py:473 msgid "" "sys.intern() \n" "intern(string) -> string\n" "\n" "``Intern'' the given string. This enters the string in the (global)\n" "table of interned strings whose purpose is to speed up dictionary lookups.\n" "Return the string itself or the previously interned string object with the\n" "same value." msgstr "" #: mu/modes/api/python3.py:474 msgid "" "sys.is_finalizing() \n" "is_finalizing()\n" "Return True if Python is exiting." msgstr "" #: mu/modes/api/python3.py:475 msgid "" "sys.set_asyncgen_hooks() \n" "set_asyncgen_hooks(*, firstiter=None, finalizer=None)\n" "\n" "Set a finalizer for async generators objects." msgstr "" #: mu/modes/api/python3.py:476 msgid "" "sys.set_coroutine_wrapper() \n" "set_coroutine_wrapper(wrapper)\n" "\n" "Set a wrapper for coroutine objects." msgstr "" #: mu/modes/api/python3.py:477 msgid "" "sys.setcheckinterval() \n" "setcheckinterval(n)\n" "\n" "Tell the Python interpreter to check for asynchronous events every\n" "n instructions. This also affects how often thread switches occur." msgstr "" #: mu/modes/api/python3.py:478 msgid "" "sys.setdlopenflags() \n" "setdlopenflags(n) -> None\n" "\n" "Set the flags used by the interpreter for dlopen calls, such as when the\n" "interpreter loads extension modules. Among other things, this will enable\n" "a lazy resolving of symbols when importing a module, if called as\n" "sys.setdlopenflags(0). To share symbols across extension modules, call as\n" "sys.setdlopenflags(os.RTLD_GLOBAL). Symbolic names for the flag modules\n" "can be found in the os module (RTLD_xxx constants, e.g. os.RTLD_LAZY)." msgstr "" #: mu/modes/api/python3.py:479 msgid "" "sys.setprofile() \n" "setprofile(function)\n" "\n" "Set the profiling function. It will be called on each function call\n" "and return. See the profiler chapter in the library manual." msgstr "" #: mu/modes/api/python3.py:480 msgid "" "sys.setrecursionlimit() \n" "setrecursionlimit(n)\n" "\n" "Set the maximum depth of the Python interpreter stack to n. This\n" "limit prevents infinite recursion from causing an overflow of the C\n" "stack and crashing Python. The highest possible limit is platform-\n" "dependent." msgstr "" #: mu/modes/api/python3.py:481 msgid "" "sys.setswitchinterval() \n" "setswitchinterval(n)\n" "\n" "Set the ideal thread switching delay inside the Python interpreter\n" "The actual frequency of switching threads can be lower if the\n" "interpreter executes long sequences of uninterruptible code\n" "(this is implementation-specific and workload-dependent).\n" "\n" "The parameter must represent the desired switching delay in seconds\n" "A typical value is 0.005 (5 milliseconds)." msgstr "" #: mu/modes/api/python3.py:482 msgid "" "sys.settrace() \n" "settrace(function)\n" "\n" "Set the global debug tracing function. It will be called on each\n" "function call. See the debugger chapter in the library manual." msgstr "" #: mu/modes/api/python3.py:483 msgid "" "time.asctime() \n" "asctime([tuple]) -> string\n" "\n" "Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n" "When the time tuple is not present, current time as returned by localtime()\n" "is used." msgstr "" #: mu/modes/api/python3.py:484 msgid "" "time.clock() \n" "clock() -> floating point number\n" "\n" "Return the CPU time or real time since the start of the process or since\n" "the first call to clock(). This has as much precision as the system\n" "records." msgstr "" #: mu/modes/api/python3.py:485 msgid "" "time.clock_getres() \n" "clock_getres(clk_id) -> floating point number\n" "\n" "Return the resolution (precision) of the specified clock clk_id." msgstr "" #: mu/modes/api/python3.py:486 msgid "" "time.clock_gettime() \n" "clock_gettime(clk_id) -> floating point number\n" "\n" "Return the time of the specified clock clk_id." msgstr "" #: mu/modes/api/python3.py:487 msgid "" "time.clock_settime() \n" "clock_settime(clk_id, time)\n" "\n" "Set the time of the specified clock clk_id." msgstr "" #: mu/modes/api/python3.py:488 msgid "" "time.ctime() \n" "ctime(seconds) -> string\n" "\n" "Convert a time in seconds since the Epoch to a string in local time.\n" "This is equivalent to asctime(localtime(seconds)). When the time tuple is\n" "not present, current time as returned by localtime() is used." msgstr "" #: mu/modes/api/python3.py:489 msgid "" "time.get_clock_info() \n" "get_clock_info(name: str) -> dict\n" "\n" "Get information of the specified clock." msgstr "" #: mu/modes/api/python3.py:490 msgid "" "time.gmtime() \n" "gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n" " tm_sec, tm_wday, tm_yday, tm_isdst)\n" "\n" "Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n" "GMT). When 'seconds' is not passed in, convert the current time instead.\n" "\n" "If the platform supports the tm_gmtoff and tm_zone, they are available as\n" "attributes only." msgstr "" #: mu/modes/api/python3.py:491 msgid "" "time.localtime() \n" "localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n" " tm_sec,tm_wday,tm_yday,tm_isdst)\n" "\n" "Convert seconds since the Epoch to a time tuple expressing local time.\n" "When 'seconds' is not passed in, convert the current time instead." msgstr "" #: mu/modes/api/python3.py:492 msgid "" "time.mktime() \n" "mktime(tuple) -> floating point number\n" "\n" "Convert a time tuple in local time to seconds since the Epoch.\n" "Note that mktime(gmtime(0)) will not generally return zero for most\n" "time zones; instead the returned value will either be equal to that\n" "of the timezone or altzone attributes on the time module." msgstr "" #: mu/modes/api/python3.py:493 msgid "" "time.monotonic() \n" "monotonic() -> float\n" "\n" "Monotonic clock, cannot go backward." msgstr "" #: mu/modes/api/python3.py:494 msgid "" "time.perf_counter() \n" "perf_counter() -> float\n" "\n" "Performance counter for benchmarking." msgstr "" #: mu/modes/api/python3.py:495 msgid "" "time.process_time() \n" "process_time() -> float\n" "\n" "Process time for profiling: sum of the kernel and user-space CPU time." msgstr "" #: mu/modes/api/python3.py:496 msgid "" "time.sleep() \n" "sleep(seconds)\n" "\n" "Delay execution for a given number of seconds. The argument may be\n" "a floating point number for subsecond precision." msgstr "" #: mu/modes/api/python3.py:497 msgid "" "time.strftime() \n" "strftime(format[, tuple]) -> string\n" "\n" "Convert a time tuple to a string according to a format specification.\n" "See the library reference manual for formatting codes. When the time tuple\n" "is not present, current time as returned by localtime() is used.\n" "\n" "Commonly used format codes:\n" "\n" "%Y Year with century as a decimal number.\n" "%m Month as a decimal number [01,12].\n" "%d Day of the month as a decimal number [01,31].\n" "%H Hour (24-hour clock) as a decimal number [00,23].\n" "%M Minute as a decimal number [00,59].\n" "%S Second as a decimal number [00,61].\n" "%z Time zone offset from UTC.\n" "%a Locale's abbreviated weekday name.\n" "%A Locale's full weekday name.\n" "%b Locale's abbreviated month name.\n" "%B Locale's full month name.\n" "%c Locale's appropriate date and time representation.\n" "%I Hour (12-hour clock) as a decimal number [01,12].\n" "%p Locale's equivalent of either AM or PM.\n" "\n" "Other codes may be available on your platform. See documentation for\n" "the C library strftime function." msgstr "" #: mu/modes/api/python3.py:498 msgid "" "time.strptime() \n" "strptime(string, format) -> struct_time\n" "\n" "Parse a string to a time tuple according to a format specification.\n" "See the library reference manual for formatting codes (same as\n" "strftime()).\n" "\n" "Commonly used format codes:\n" "\n" "%Y Year with century as a decimal number.\n" "%m Month as a decimal number [01,12].\n" "%d Day of the month as a decimal number [01,31].\n" "%H Hour (24-hour clock) as a decimal number [00,23].\n" "%M Minute as a decimal number [00,59].\n" "%S Second as a decimal number [00,61].\n" "%z Time zone offset from UTC.\n" "%a Locale's abbreviated weekday name.\n" "%A Locale's full weekday name.\n" "%b Locale's abbreviated month name.\n" "%B Locale's full month name.\n" "%c Locale's appropriate date and time representation.\n" "%I Hour (12-hour clock) as a decimal number [01,12].\n" "%p Locale's equivalent of either AM or PM.\n" "\n" "Other codes may be available on your platform. See documentation for\n" "the C library strftime function." msgstr "" #: mu/modes/api/python3.py:499 msgid "" "time.struct_time() \n" "The time value as returned by gmtime(), localtime(), and strptime(), and\n" "accepted by asctime(), mktime() and strftime(). May be considered as a\n" "sequence of 9 integers.\n" "\n" "Note that several fields' values are not the same as those defined by\n" "the C language standard for struct tm. For example, the value of the\n" "field tm_year is the actual year, not year - 1900. See individual\n" "fields' descriptions for details." msgstr "" #: mu/modes/api/python3.py:500 msgid "" "time.time() \n" "time() -> floating point number\n" "\n" "Return the current time in seconds since the Epoch.\n" "Fractions of a second may be present if the system clock provides them." msgstr "" #: mu/modes/api/python3.py:501 msgid "" "time.tzset() \n" "tzset()\n" "\n" "Initialize, or reinitialize, the local timezone to the value stored in\n" "os.environ['TZ']. The TZ environment variable should be specified in\n" "standard Unix timezone format as documented in the tzset man page\n" "(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n" "fall back to UTC. If the TZ environment variable is not set, the local\n" "timezone is set to the systems best guess of wallclock time.\n" "Changing the TZ environment variable without calling tzset *may* change\n" "the local timezone used by methods such as localtime, but this behaviour\n" "should not be relied on." msgstr "" #: mu/modes/api/python3.py:502 msgid "" "turtle.Canvas(master=None, cnf={}, **kw) \n" "Canvas widget to display graphical elements like lines or text." msgstr "" #: mu/modes/api/python3.py:503 mu/modes/api/python3.py:504 msgid "" "turtle.RawTurtle(canvas=None, shape='classic', undobuffersize=1000, " "visible=True) \n" "Animation part of the RawTurtle.\n" "Puts RawTurtle upon a TurtleScreen and provides tools for\n" "its animation." msgstr "" #: mu/modes/api/python3.py:505 msgid "" "turtle.Screen() \n" "Return the singleton screen object.\n" "If none exists at the moment, create a new one and return it,\n" "else return the existing one." msgstr "" #: mu/modes/api/python3.py:506 msgid "" "turtle.ScrolledCanvas(master, width=500, height=350, canvwidth=600, " "canvheight=500) \n" "Modeled after the scrolled canvas class from Grayons's Tkinter book.\n" "\n" "Used as the default canvas, which pops up automatically when\n" "using turtle graphics functions or the Turtle class." msgstr "" #: mu/modes/api/python3.py:507 msgid "" "turtle.Shape(type_, data=None) \n" "Data structure modeling shapes.\n" "\n" "attribute _type is one of \"polygon\", \"image\", \"compound\"\n" "attribute _data is - depending on _type a poygon-tuple,\n" "an image or a list constructed using the addcomponent method." msgstr "" #: mu/modes/api/python3.py:508 msgid "" "turtle.TNavigator(mode='standard') \n" "Navigation part of the RawTurtle.\n" "Implements methods for turtle movement." msgstr "" #: mu/modes/api/python3.py:509 msgid "" "turtle.TPen(resizemode='noresize') \n" "Drawing part of the RawTurtle.\n" "Implements drawing properties." msgstr "" #: mu/modes/api/python3.py:510 msgid "" "turtle.Tbuffer(bufsize=10) \n" "Ring buffer used as undobuffer for RawTurtle objects." msgstr "" #: mu/modes/api/python3.py:511 msgid "" "turtle.Terminator() \n" "Will be raised in TurtleScreen.update, if _RUNNING becomes False.\n" "\n" "This stops execution of a turtle graphics script.\n" "Main purpose: use in the Demo-Viewer turtle.Demo.py." msgstr "" #: mu/modes/api/python3.py:512 mu/modes/api/python3.py:513 msgid "" "turtle.Turtle(shape='classic', undobuffersize=1000, visible=True) \n" "RawTurtle auto-creating (scrolled) canvas.\n" "\n" "When a Turtle object is created or a function derived from some\n" "Turtle method is called a TurtleScreen object is automatically created." msgstr "" #: mu/modes/api/python3.py:514 msgid "" "turtle.TurtleGraphicsError() \n" "Some TurtleGraphics Error\n" " " msgstr "" #: mu/modes/api/python3.py:515 msgid "" "turtle.TurtleScreen(cv, mode='standard', colormode=1.0, delay=10) \n" "Provides screen oriented methods like setbg etc.\n" "\n" "Only relies upon the methods of TurtleScreenBase and NOT\n" "upon components of the underlying graphics toolkit -\n" "which is Tkinter in this case." msgstr "" #: mu/modes/api/python3.py:516 msgid "" "turtle.TurtleScreenBase(cv) \n" "Provide the basic graphics functionality.\n" "Interface between Tkinter and turtle.py.\n" "\n" "To port turtle.py to some different graphics toolkit\n" "a corresponding TurtleScreenBase class has to be implemented." msgstr "" #: mu/modes/api/python3.py:517 msgid "" "turtle.Vec2D(x, y) \n" "A 2 dimensional vector class, used as a helper class\n" "for implementing turtle graphics.\n" "May be useful for turtle graphics programs also.\n" "Derived from tuple, so a vector is a tuple!\n" "\n" "Provides (for a, b vectors, k number):\n" " a+b vector addition\n" " a-b vector subtraction\n" " a*b inner product\n" " k*a and a*k multiplication with scalar\n" " |a| absolute value of a\n" " a.rotate(angle) rotation" msgstr "" #: mu/modes/api/python3.py:518 msgid "" "turtle.addshape(name, shape=None) \n" "Adds a turtle shape to TurtleScreen's shapelist.\n" "\n" "Arguments:\n" "(1) name is the name of a gif-file and shape is None.\n" " Installs the corresponding image shape.\n" " !! Image-shapes DO NOT rotate when turning the turtle,\n" " !! so they do not display the heading of the turtle!\n" "(2) name is an arbitrary string and shape is a tuple\n" " of pairs of coordinates. Installs the corresponding\n" " polygon shape\n" "(3) name is an arbitrary string and shape is a\n" " (compound) Shape object. Installs the corresponding\n" " compound shape.\n" "To use a shape, you have to issue the command shape(shapename).\n" "\n" "call: register_shape(\"turtle.gif\")\n" "--or: register_shape(\"tri\", ((0,0), (10,10), (-10,10)))\n" "\n" "Example:\n" ">>> register_shape(\"triangle\", ((5,-3),(0,5),(-5,-3)))" msgstr "" #: mu/modes/api/python3.py:519 msgid "" "turtle.back(distance) \n" "Move the turtle backward by distance.\n" "\n" "Aliases: back | backward | bk\n" "\n" "Argument:\n" "distance -- a number\n" "\n" "Move the turtle backward by distance ,opposite to the direction the\n" "turtle is headed. Do not change the turtle's heading.\n" "\n" "Example:\n" ">>> position()\n" "(0.00, 0.00)\n" ">>> backward(30)\n" ">>> position()\n" "(-30.00, 0.00)" msgstr "" #: mu/modes/api/python3.py:520 msgid "" "turtle.backward(distance) \n" "Move the turtle backward by distance.\n" "\n" "Aliases: back | backward | bk\n" "\n" "Argument:\n" "distance -- a number\n" "\n" "Move the turtle backward by distance ,opposite to the direction the\n" "turtle is headed. Do not change the turtle's heading.\n" "\n" "Example:\n" ">>> position()\n" "(0.00, 0.00)\n" ">>> backward(30)\n" ">>> position()\n" "(-30.00, 0.00)" msgstr "" #: mu/modes/api/python3.py:521 msgid "" "turtle.begin_fill() \n" "Called just before drawing a shape to be filled.\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> color(\"black\", \"red\")\n" ">>> begin_fill()\n" ">>> circle(60)\n" ">>> end_fill()" msgstr "" #: mu/modes/api/python3.py:522 msgid "" "turtle.begin_poly() \n" "Start recording the vertices of a polygon.\n" "\n" "No argument.\n" "\n" "Start recording the vertices of a polygon. Current turtle position\n" "is first point of polygon.\n" "\n" "Example:\n" ">>> begin_poly()" msgstr "" #: mu/modes/api/python3.py:523 msgid "" "turtle.bgcolor(*args) \n" "Set or return backgroundcolor of the TurtleScreen.\n" "\n" "Arguments (if given): a color string or three numbers\n" "in the range 0..colormode or a 3-tuple of such numbers.\n" "\n" "Example:\n" ">>> bgcolor(\"orange\")\n" ">>> bgcolor()\n" "'orange'\n" ">>> bgcolor(0.5,0,0.5)\n" ">>> bgcolor()\n" "'#800080'" msgstr "" #: mu/modes/api/python3.py:524 msgid "" "turtle.bgpic(picname=None) \n" "Set background image or return name of current backgroundimage.\n" "\n" "Optional argument:\n" "picname -- a string, name of a gif-file or \"nopic\".\n" "\n" "If picname is a filename, set the corresponding image as background.\n" "If picname is \"nopic\", delete backgroundimage, if present.\n" "If picname is None, return the filename of the current backgroundimage.\n" "\n" "Example:\n" ">>> bgpic()\n" "'nopic'\n" ">>> bgpic(\"landscape.gif\")\n" ">>> bgpic()\n" "'landscape.gif'" msgstr "" #: mu/modes/api/python3.py:525 msgid "" "turtle.bk(distance) \n" "Move the turtle backward by distance.\n" "\n" "Aliases: back | backward | bk\n" "\n" "Argument:\n" "distance -- a number\n" "\n" "Move the turtle backward by distance ,opposite to the direction the\n" "turtle is headed. Do not change the turtle's heading.\n" "\n" "Example:\n" ">>> position()\n" "(0.00, 0.00)\n" ">>> backward(30)\n" ">>> position()\n" "(-30.00, 0.00)" msgstr "" #: mu/modes/api/python3.py:526 msgid "" "turtle.bye() \n" "Shut the turtlegraphics window.\n" "\n" "Example:\n" ">>> bye()" msgstr "" #: mu/modes/api/python3.py:527 msgid "" "turtle.circle(radius, extent=None, steps=None) \n" "Draw a circle with given radius.\n" "\n" "Arguments:\n" "radius -- a number\n" "extent (optional) -- a number\n" "steps (optional) -- an integer\n" "\n" "Draw a circle with given radius. The center is radius units left\n" "of the turtle; extent - an angle - determines which part of the\n" "circle is drawn. If extent is not given, draw the entire circle.\n" "If extent is not a full circle, one endpoint of the arc is the\n" "current pen position. Draw the arc in counterclockwise direction\n" "if radius is positive, otherwise in clockwise direction. Finally\n" "the direction of the turtle is changed by the amount of extent.\n" "\n" "As the circle is approximated by an inscribed regular polygon,\n" "steps determines the number of steps to use. If not given,\n" "it will be calculated automatically. Maybe used to draw regular\n" "polygons.\n" "\n" "call: circle(radius) # full circle\n" "--or: circle(radius, extent) # arc\n" "--or: circle(radius, extent, steps)\n" "--or: circle(radius, steps=6) # 6-sided polygon\n" "\n" "Example:\n" ">>> circle(50)\n" ">>> circle(120, 180) # semicircle" msgstr "" #: mu/modes/api/python3.py:528 msgid "" "turtle.clear() \n" "Delete the turtle's drawings from the screen. Do not move \n" "\n" "No arguments.\n" "\n" "Delete the turtle's drawings from the screen. Do not move \n" "State and position of the turtle as well as drawings of other\n" "turtles are not affected.\n" "\n" "Examples:\n" ">>> clear()" msgstr "" #: mu/modes/api/python3.py:529 msgid "" "turtle.clearscreen() \n" "Delete all drawings and all turtles from the TurtleScreen.\n" "\n" "No argument.\n" "\n" "Reset empty TurtleScreen to its initial state: white background,\n" "no backgroundimage, no eventbindings and tracing on.\n" "\n" "Example:\n" ">>> clear()\n" "\n" "Note: this method is not available as function." msgstr "" #: mu/modes/api/python3.py:530 msgid "" "turtle.clearstamp(stampid) \n" "Delete stamp with given stampid\n" "\n" "Argument:\n" "stampid - an integer, must be return value of previous stamp() call.\n" "\n" "Example:\n" ">>> color(\"blue\")\n" ">>> astamp = stamp()\n" ">>> fd(50)\n" ">>> clearstamp(astamp)" msgstr "" #: mu/modes/api/python3.py:531 msgid "" "turtle.clearstamps(n=None) \n" "Delete all or first/last n of turtle's stamps.\n" "\n" "Optional argument:\n" "n -- an integer\n" "\n" "If n is None, delete all of pen's stamps,\n" "else if n > 0 delete first n stamps\n" "else if n < 0 delete last n stamps.\n" "\n" "Example:\n" ">>> for i in range(8):\n" "... stamp(); fd(30)\n" "...\n" ">>> clearstamps(2)\n" ">>> clearstamps(-2)\n" ">>> clearstamps()" msgstr "" #: mu/modes/api/python3.py:532 msgid "" "turtle.clone() \n" "Create and return a clone of the \n" "\n" "No argument.\n" "\n" "Create and return a clone of the turtle with same position, heading\n" "and turtle properties.\n" "\n" "Example (for a Turtle instance named mick):\n" "mick = Turtle()\n" "joe = mick.clone()" msgstr "" #: mu/modes/api/python3.py:533 msgid "" "turtle.color(*args) \n" "Return or set the pencolor and fillcolor.\n" "\n" "Arguments:\n" "Several input formats are allowed.\n" "They use 0, 1, 2, or 3 arguments as follows:\n" "\n" "color()\n" " Return the current pencolor and the current fillcolor\n" " as a pair of color specification strings as are returned\n" " by pencolor and fillcolor.\n" "color(colorstring), color((r,g,b)), color(r,g,b)\n" " inputs as in pencolor, set both, fillcolor and pencolor,\n" " to the given value.\n" "color(colorstring1, colorstring2),\n" "color((r1,g1,b1), (r2,g2,b2))\n" " equivalent to pencolor(colorstring1) and fillcolor(colorstring2)\n" " and analogously, if the other input format is used.\n" "\n" "If turtleshape is a polygon, outline and interior of that polygon\n" "is drawn with the newly set colors.\n" "For mor info see: pencolor, fillcolor\n" "\n" "Example:\n" ">>> color('red', 'green')\n" ">>> color()\n" "('red', 'green')\n" ">>> colormode(255)\n" ">>> color((40, 80, 120), (160, 200, 240))\n" ">>> color()\n" "('#285078', '#a0c8f0')" msgstr "" #: mu/modes/api/python3.py:534 msgid "" "turtle.colormode(cmode=None) \n" "Return the colormode or set it to 1.0 or 255.\n" "\n" "Optional argument:\n" "cmode -- one of the values 1.0 or 255\n" "\n" "r, g, b values of colortriples have to be in range 0..cmode.\n" "\n" "Example:\n" ">>> colormode()\n" "1.0\n" ">>> colormode(255)\n" ">>> pencolor(240,160,80)" msgstr "" #: mu/modes/api/python3.py:535 msgid "" "turtle.config_dict(filename) \n" "Convert content of config-file into dictionary." msgstr "" #: mu/modes/api/python3.py:536 msgid "" "turtle.deepcopy(x, memo=None, _nil=[]) \n" "Deep copy operation on arbitrary Python objects.\n" "\n" "See the module's __doc__ string for more info." msgstr "" #: mu/modes/api/python3.py:537 msgid "" "turtle.degrees(fullcircle=360.0) \n" "Set angle measurement units to degrees.\n" "\n" "Optional argument:\n" "fullcircle - a number\n" "\n" "Set angle measurement units, i. e. set number\n" "of 'degrees' for a full circle. Dafault value is\n" "360 degrees.\n" "\n" "Example:\n" ">>> left(90)\n" ">>> heading()\n" "90\n" "\n" "Change angle measurement unit to grad (also known as gon,\n" "grade, or gradian and equals 1/100-th of the right angle.)\n" ">>> degrees(400.0)\n" ">>> heading()\n" "100" msgstr "" #: mu/modes/api/python3.py:538 msgid "" "turtle.delay(delay=None) \n" "Return or set the drawing delay in milliseconds.\n" "\n" "Optional argument:\n" "delay -- positive integer\n" "\n" "Example:\n" ">>> delay(15)\n" ">>> delay()\n" "15" msgstr "" #: mu/modes/api/python3.py:539 msgid "" "turtle.distance(x, y=None) \n" "Return the distance from the turtle to (x,y) in turtle step units.\n" "\n" "Arguments:\n" "x -- a number or a pair/vector of numbers or a turtle instance\n" "y -- a number None None\n" "\n" "call: distance(x, y) # two coordinates\n" "--or: distance((x, y)) # a pair (tuple) of coordinates\n" "--or: distance(vec) # e.g. as returned by pos()\n" "--or: distance(mypen) # where mypen is another turtle\n" "\n" "Example:\n" ">>> pos()\n" "(0.00, 0.00)\n" ">>> distance(30,40)\n" "50.0\n" ">>> pen = Turtle()\n" ">>> pen.forward(77)\n" ">>> distance(pen)\n" "77.0" msgstr "" #: mu/modes/api/python3.py:540 msgid "" "turtle.dot(size=None, *color) \n" "Draw a dot with diameter size, using color.\n" "\n" "Optional arguments:\n" "size -- an integer >= 1 (if given)\n" "color -- a colorstring or a numeric color tuple\n" "\n" "Draw a circular dot with diameter size, using color.\n" "If size is not given, the maximum of pensize+4 and 2*pensize is used.\n" "\n" "Example:\n" ">>> dot()\n" ">>> fd(50); dot(20, \"blue\"); fd(50)" msgstr "" #: mu/modes/api/python3.py:541 msgid "" "turtle.down() \n" "Pull the pen down -- drawing when moving.\n" "\n" "Aliases: pendown | pd | down\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> pendown()" msgstr "" #: mu/modes/api/python3.py:542 msgid "" "turtle.end_fill() \n" "Fill the shape drawn after the call begin_fill().\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> color(\"black\", \"red\")\n" ">>> begin_fill()\n" ">>> circle(60)\n" ">>> end_fill()" msgstr "" #: mu/modes/api/python3.py:543 msgid "" "turtle.end_poly() \n" "Stop recording the vertices of a polygon.\n" "\n" "No argument.\n" "\n" "Stop recording the vertices of a polygon. Current turtle position is\n" "last point of polygon. This will be connected with the first point.\n" "\n" "Example:\n" ">>> end_poly()" msgstr "" #: mu/modes/api/python3.py:544 msgid "" "turtle.exitonclick() \n" "Go into mainloop until the mouse is clicked.\n" "\n" "No arguments.\n" "\n" "Bind bye() method to mouseclick on TurtleScreen.\n" "If \"using_IDLE\" - value in configuration dictionary is False\n" "(default value), enter mainloop.\n" "If IDLE with -n switch (no subprocess) is used, this value should be\n" "set to True in turtle.cfg. In this case IDLE's mainloop\n" "is active also for the client script.\n" "\n" "This is a method of the Screen-class and not available for\n" "TurtleScreen instances.\n" "\n" "Example:\n" ">>> exitonclick()" msgstr "" #: mu/modes/api/python3.py:545 msgid "" "turtle.fd(distance) \n" "Move the turtle forward by the specified distance.\n" "\n" "Aliases: forward | fd\n" "\n" "Argument:\n" "distance -- a number (integer or float)\n" "\n" "Move the turtle forward by the specified distance, in the direction\n" "the turtle is headed.\n" "\n" "Example:\n" ">>> position()\n" "(0.00, 0.00)\n" ">>> forward(25)\n" ">>> position()\n" "(25.00,0.00)\n" ">>> forward(-75)\n" ">>> position()\n" "(-50.00,0.00)" msgstr "" #: mu/modes/api/python3.py:546 msgid "" "turtle.fillcolor(*args) \n" "Return or set the fillcolor.\n" "\n" "Arguments:\n" "Four input formats are allowed:\n" " - fillcolor()\n" " Return the current fillcolor as color specification string,\n" " possibly in hex-number format (see example).\n" " May be used as input to another color/pencolor/fillcolor call.\n" " - fillcolor(colorstring)\n" " s is a Tk color specification string, such as \"red\" or \"yellow\"\n" " - fillcolor((r, g, b))\n" " *a tuple* of r, g, and b, which represent, an RGB color,\n" " and each of r, g, and b are in the range 0..colormode,\n" " where colormode is either 1.0 or 255\n" " - fillcolor(r, g, b)\n" " r, g, and b represent an RGB color, and each of r, g, and b\n" " are in the range 0..colormode\n" "\n" "If turtleshape is a polygon, the interior of that polygon is drawn\n" "with the newly set fillcolor.\n" "\n" "Example:\n" ">>> fillcolor('violet')\n" ">>> col = pencolor()\n" ">>> fillcolor(col)\n" ">>> fillcolor(0, .5, 0)" msgstr "" #: mu/modes/api/python3.py:547 msgid "" "turtle.filling() \n" "Return fillstate (True if filling, False else).\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> begin_fill()\n" ">>> if filling():\n" "... pensize(5)\n" "... else:\n" "... pensize(3)" msgstr "" #: mu/modes/api/python3.py:548 msgid "" "turtle.forward(distance) \n" "Move the turtle forward by the specified distance.\n" "\n" "Aliases: forward | fd\n" "\n" "Argument:\n" "distance -- a number (integer or float)\n" "\n" "Move the turtle forward by the specified distance, in the direction\n" "the turtle is headed.\n" "\n" "Example:\n" ">>> position()\n" "(0.00, 0.00)\n" ">>> forward(25)\n" ">>> position()\n" "(25.00,0.00)\n" ">>> forward(-75)\n" ">>> position()\n" "(-50.00,0.00)" msgstr "" #: mu/modes/api/python3.py:549 msgid "" "turtle.get_poly() \n" "Return the lastly recorded polygon.\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> p = get_poly()\n" ">>> register_shape(\"myFavouriteShape\", p)" msgstr "" #: mu/modes/api/python3.py:550 msgid "" "turtle.get_shapepoly() \n" "Return the current shape polygon as tuple of coordinate pairs.\n" "\n" "No argument.\n" "\n" "Examples:\n" ">>> shape(\"square\")\n" ">>> shapetransform(4, -1, 0, 2)\n" ">>> get_shapepoly()\n" "((50, -20), (30, 20), (-50, 20), (-30, -20))" msgstr "" #: mu/modes/api/python3.py:551 msgid "" "turtle.getcanvas() \n" "Return the Canvas of this TurtleScreen.\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> cv = getcanvas()\n" ">>> cv\n" "" msgstr "" #: mu/modes/api/python3.py:552 msgid "" "turtle.getmethparlist(ob) \n" "Get strings describing the arguments for the given object\n" "\n" "Returns a pair of strings representing function parameter lists\n" "including parenthesis. The first string is suitable for use in\n" "function definition and the second is suitable for use in function\n" "call. The \"self\" parameter is not included." msgstr "" #: mu/modes/api/python3.py:553 msgid "" "turtle.getpen() \n" "Return the Turtleobject itself.\n" "\n" "No argument.\n" "\n" "Only reasonable use: as a function to return the 'anonymous turtle':\n" "\n" "Example:\n" ">>> pet = getturtle()\n" ">>> pet.fd(50)\n" ">>> pet\n" "\n" ">>> turtles()\n" "[]" msgstr "" #: mu/modes/api/python3.py:554 msgid "" "turtle.getscreen() \n" "Return the TurtleScreen object, the turtle is drawing on.\n" "\n" "No argument.\n" "\n" "Return the TurtleScreen object, the turtle is drawing on.\n" "So TurtleScreen-methods can be called for that object.\n" "\n" "Example:\n" ">>> ts = getscreen()\n" ">>> ts\n" "\n" ">>> ts.bgcolor(\"pink\")" msgstr "" #: mu/modes/api/python3.py:555 msgid "" "turtle.getshapes() \n" "Return a list of names of all currently available turtle shapes.\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> getshapes()\n" "['arrow', 'blank', 'circle', ... , 'turtle']" msgstr "" #: mu/modes/api/python3.py:556 msgid "" "turtle.getturtle() \n" "Return the Turtleobject itself.\n" "\n" "No argument.\n" "\n" "Only reasonable use: as a function to return the 'anonymous turtle':\n" "\n" "Example:\n" ">>> pet = getturtle()\n" ">>> pet.fd(50)\n" ">>> pet\n" "\n" ">>> turtles()\n" "[]" msgstr "" #: mu/modes/api/python3.py:557 msgid "" "turtle.goto(x, y=None) \n" "Move turtle to an absolute position.\n" "\n" "Aliases: setpos | setposition | goto:\n" "\n" "Arguments:\n" "x -- a number or a pair/vector of numbers\n" "y -- a number None\n" "\n" "call: goto(x, y) # two coordinates\n" "--or: goto((x, y)) # a pair (tuple) of coordinates\n" "--or: goto(vec) # e.g. as returned by pos()\n" "\n" "Move turtle to an absolute position. If the pen is down,\n" "a line will be drawn. The turtle's orientation does not change.\n" "\n" "Example:\n" ">>> tp = pos()\n" ">>> tp\n" "(0.00, 0.00)\n" ">>> setpos(60,30)\n" ">>> pos()\n" "(60.00,30.00)\n" ">>> setpos((20,80))\n" ">>> pos()\n" "(20.00,80.00)\n" ">>> setpos(tp)\n" ">>> pos()\n" "(0.00,0.00)" msgstr "" #: mu/modes/api/python3.py:558 msgid "" "turtle.heading() \n" "Return the turtle's current heading.\n" "\n" "No arguments.\n" "\n" "Example:\n" ">>> left(67)\n" ">>> heading()\n" "67.0" msgstr "" #: mu/modes/api/python3.py:559 msgid "" "turtle.hideturtle() \n" "Makes the turtle invisible.\n" "\n" "Aliases: hideturtle | ht\n" "\n" "No argument.\n" "\n" "It's a good idea to do this while you're in the\n" "middle of a complicated drawing, because hiding\n" "the turtle speeds up the drawing observably.\n" "\n" "Example:\n" ">>> hideturtle()" msgstr "" #: mu/modes/api/python3.py:560 msgid "" "turtle.home() \n" "Move turtle to the origin - coordinates (0,0).\n" "\n" "No arguments.\n" "\n" "Move turtle to the origin - coordinates (0,0) and set its\n" "heading to its start-orientation (which depends on mode).\n" "\n" "Example:\n" ">>> home()" msgstr "" #: mu/modes/api/python3.py:561 msgid "" "turtle.ht() \n" "Makes the turtle invisible.\n" "\n" "Aliases: hideturtle | ht\n" "\n" "No argument.\n" "\n" "It's a good idea to do this while you're in the\n" "middle of a complicated drawing, because hiding\n" "the turtle speeds up the drawing observably.\n" "\n" "Example:\n" ">>> hideturtle()" msgstr "" #: mu/modes/api/python3.py:562 msgid "" "turtle.inspect() \n" "Get useful information from live Python objects.\n" "\n" "This module encapsulates the interface provided by the internal special\n" "attributes (co_*, im_*, tb_*, etc.) in a friendlier fashion.\n" "It also provides some help for examining source code and class layout.\n" "\n" "Here are some of the useful functions provided by this module:\n" "\n" " ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),\n" " isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),\n" " isroutine() - check object types\n" " getmembers() - get members of an object that satisfy a given condition\n" "\n" " getfile(), getsourcefile(), getsource() - find an object's source code\n" " getdoc(), getcomments() - get documentation on an object\n" " getmodule() - determine the module that an object came from\n" " getclasstree() - arrange classes so as to represent their hierarchy\n" "\n" " getargvalues(), getcallargs() - get info about function arguments\n" " getfullargspec() - same, with support for Python 3 features\n" " formatargspec(), formatargvalues() - format an argument spec\n" " getouterframes(), getinnerframes() - get info about frames\n" " currentframe() - get the current stack frame\n" " stack(), trace() - get info about frames on the stack or in a traceback\n" "\n" " signature() - get a Signature object for the callable" msgstr "" #: mu/modes/api/python3.py:563 msgid "" "turtle.isdown() \n" "Return True if pen is down, False if it's up.\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> penup()\n" ">>> isdown()\n" "False\n" ">>> pendown()\n" ">>> isdown()\n" "True" msgstr "" #: mu/modes/api/python3.py:564 msgid "" "turtle.isfile(path) \n" "Test whether a path is a regular file" msgstr "" #: mu/modes/api/python3.py:565 msgid "" "turtle.isvisible() \n" "Return True if the Turtle is shown, False if it's hidden.\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> hideturtle()\n" ">>> print isvisible():\n" "False" msgstr "" #: mu/modes/api/python3.py:566 msgid "" "turtle.join(a, *p) \n" "Join two or more pathname components, inserting '/' as needed.\n" "If any component is an absolute path, all previous path components\n" "will be discarded. An empty last part will result in a path that\n" "ends with a separator." msgstr "" #: mu/modes/api/python3.py:567 msgid "" "turtle.left(angle) \n" "Turn turtle left by angle units.\n" "\n" "Aliases: left | lt\n" "\n" "Argument:\n" "angle -- a number (integer or float)\n" "\n" "Turn turtle left by angle units. (Units are by default degrees,\n" "but can be set via the degrees() and radians() functions.)\n" "Angle orientation depends on mode. (See this.)\n" "\n" "Example:\n" ">>> heading()\n" "22.0\n" ">>> left(45)\n" ">>> heading()\n" "67.0" msgstr "" #: mu/modes/api/python3.py:568 msgid "" "turtle.listen(xdummy=None, ydummy=None) \n" "Set focus on TurtleScreen (in order to collect key-events)\n" "\n" "No arguments.\n" "Dummy arguments are provided in order\n" "to be able to pass listen to the onclick method.\n" "\n" "Example:\n" ">>> listen()" msgstr "" #: mu/modes/api/python3.py:569 msgid "" "turtle.lt(angle) \n" "Turn turtle left by angle units.\n" "\n" "Aliases: left | lt\n" "\n" "Argument:\n" "angle -- a number (integer or float)\n" "\n" "Turn turtle left by angle units. (Units are by default degrees,\n" "but can be set via the degrees() and radians() functions.)\n" "Angle orientation depends on mode. (See this.)\n" "\n" "Example:\n" ">>> heading()\n" "22.0\n" ">>> left(45)\n" ">>> heading()\n" "67.0" msgstr "" #: mu/modes/api/python3.py:570 mu/modes/api/python3.py:571 msgid "" "turtle.mainloop() \n" "Starts event loop - calling Tkinter's mainloop function.\n" "\n" "No argument.\n" "\n" "Must be last statement in a turtle graphics program.\n" "Must NOT be used if a script is run from within IDLE in -n mode\n" "(No subprocess) - for interactive use of turtle graphics.\n" "\n" "Example:\n" ">>> mainloop()" msgstr "" #: mu/modes/api/python3.py:572 msgid "" "turtle.math() \n" "This module is always available. It provides access to the\n" "mathematical functions defined by the C standard." msgstr "" #: mu/modes/api/python3.py:573 msgid "" "turtle.mode(mode=None) \n" "Set turtle-mode ('standard', 'logo' or 'world') and perform reset.\n" "\n" "Optional argument:\n" "mode -- one of the strings 'standard', 'logo' or 'world'\n" "\n" "Mode 'standard' is compatible with turtle.py.\n" "Mode 'logo' is compatible with most Logo-Turtle-Graphics.\n" "Mode 'world' uses userdefined 'worldcoordinates'. *Attention*: in\n" "this mode angles appear distorted if x/y unit-ratio doesn't equal 1.\n" "If mode is not given, return the current mode.\n" "\n" " Mode Initial turtle heading positive angles\n" " ------------|-------------------------|-------------------\n" " 'standard' to the right (east) counterclockwise\n" " 'logo' upward (north) clockwise\n" "\n" "Examples:\n" ">>> mode('logo') # resets turtle heading to north\n" ">>> mode()\n" "'logo'" msgstr "" #: mu/modes/api/python3.py:574 msgid "" "turtle.numinput(title, prompt, default=None, minval=None, maxval=None) \n" "Pop up a dialog window for input of a number.\n" "\n" "Arguments: title is the title of the dialog window,\n" "prompt is a text mostly describing what numerical information to input.\n" "default: default value\n" "minval: minimum value for imput\n" "maxval: maximum value for input\n" "\n" "The number input must be in the range minval .. maxval if these are\n" "given. If not, a hint is issued and the dialog remains open for\n" "correction. Return the number input.\n" "If the dialog is canceled, return None.\n" "\n" "Example:\n" ">>> numinput(\"Poker\", \"Your stakes:\", 1000, minval=10, maxval=10000)" msgstr "" #: mu/modes/api/python3.py:575 msgid "" "turtle.onclick(fun, btn=1, add=None) \n" "Bind fun to mouse-click event on this turtle on canvas.\n" "\n" "Arguments:\n" "fun -- a function with two arguments, to which will be assigned\n" " the coordinates of the clicked point on the canvas.\n" "num -- number of the mouse-button defaults to 1 (left mouse button).\n" "add -- True or False. If True, new binding will be added, otherwise\n" " it will replace a former binding.\n" "\n" "Example for the anonymous turtle, i. e. the procedural way:\n" "\n" ">>> def turn(x, y):\n" "... left(360)\n" "...\n" ">>> onclick(turn) # Now clicking into the turtle will turn it.\n" ">>> onclick(None) # event-binding will be removed" msgstr "" #: mu/modes/api/python3.py:576 msgid "" "turtle.ondrag(fun, btn=1, add=None) \n" "Bind fun to mouse-move event on this turtle on canvas.\n" "\n" "Arguments:\n" "fun -- a function with two arguments, to which will be assigned\n" " the coordinates of the clicked point on the canvas.\n" "num -- number of the mouse-button defaults to 1 (left mouse button).\n" "\n" "Every sequence of mouse-move-events on a turtle is preceded by a\n" "mouse-click event on that \n" "\n" "Example:\n" ">>> ondrag(goto)\n" "\n" "Subsequently clicking and dragging a Turtle will move it\n" "across the screen thereby producing handdrawings (if pen is\n" "down)." msgstr "" #: mu/modes/api/python3.py:577 msgid "" "turtle.onkey(fun, key) \n" "Bind fun to key-release event of key.\n" "\n" "Arguments:\n" "fun -- a function with no arguments\n" "key -- a string: key (e.g. \"a\") or key-symbol (e.g. \"space\")\n" "\n" "In order to be able to register key-events, TurtleScreen\n" "must have focus. (See method listen.)\n" "\n" "Example:\n" "\n" ">>> def f():\n" "... fd(50)\n" "... lt(60)\n" "...\n" ">>> onkey(f, \"Up\")\n" ">>> listen()\n" "\n" "Subsequently the turtle can be moved by repeatedly pressing\n" "the up-arrow key, consequently drawing a hexagon" msgstr "" #: mu/modes/api/python3.py:578 msgid "" "turtle.onkeypress(fun, key=None) \n" "Bind fun to key-press event of key if key is given,\n" "or to any key-press-event if no key is given.\n" "\n" "Arguments:\n" "fun -- a function with no arguments\n" "key -- a string: key (e.g. \"a\") or key-symbol (e.g. \"space\")\n" "\n" "In order to be able to register key-events, TurtleScreen\n" "must have focus. (See method listen.)\n" "\n" "Example (for a TurtleScreen instance named screen\n" "and a Turtle instance named turtle):\n" "\n" ">>> def f():\n" "... fd(50)\n" "... lt(60)\n" "...\n" ">>> onkeypress(f, \"Up\")\n" ">>> listen()\n" "\n" "Subsequently the turtle can be moved by repeatedly pressing\n" "the up-arrow key, or by keeping pressed the up-arrow key.\n" "consequently drawing a hexagon." msgstr "" #: mu/modes/api/python3.py:579 msgid "" "turtle.onkeyrelease(fun, key) \n" "Bind fun to key-release event of key.\n" "\n" "Arguments:\n" "fun -- a function with no arguments\n" "key -- a string: key (e.g. \"a\") or key-symbol (e.g. \"space\")\n" "\n" "In order to be able to register key-events, TurtleScreen\n" "must have focus. (See method listen.)\n" "\n" "Example:\n" "\n" ">>> def f():\n" "... fd(50)\n" "... lt(60)\n" "...\n" ">>> onkey(f, \"Up\")\n" ">>> listen()\n" "\n" "Subsequently the turtle can be moved by repeatedly pressing\n" "the up-arrow key, consequently drawing a hexagon" msgstr "" #: mu/modes/api/python3.py:580 msgid "" "turtle.onrelease(fun, btn=1, add=None) \n" "Bind fun to mouse-button-release event on this turtle on canvas.\n" "\n" "Arguments:\n" "fun -- a function with two arguments, to which will be assigned\n" " the coordinates of the clicked point on the canvas.\n" "num -- number of the mouse-button defaults to 1 (left mouse button).\n" "\n" "Example (for a MyTurtle instance named joe):\n" ">>> class MyTurtle(Turtle):\n" "... def glow(self,x,y):\n" "... self.fillcolor(\"red\")\n" "... def unglow(self,x,y):\n" "... self.fillcolor(\"\")\n" "...\n" ">>> joe = MyTurtle()\n" ">>> joe.onclick(joe.glow)\n" ">>> joe.onrelease(joe.unglow)\n" "\n" "Clicking on joe turns fillcolor red, unclicking turns it to\n" "transparent." msgstr "" #: mu/modes/api/python3.py:581 msgid "" "turtle.onscreenclick(fun, btn=1, add=None) \n" "Bind fun to mouse-click event on canvas.\n" "\n" "Arguments:\n" "fun -- a function with two arguments, the coordinates of the\n" " clicked point on the canvas.\n" "num -- the number of the mouse-button, defaults to 1\n" "\n" "Example (for a TurtleScreen instance named screen)\n" "\n" ">>> onclick(goto)\n" ">>> # Subsequently clicking into the TurtleScreen will\n" ">>> # make the turtle move to the clicked point.\n" ">>> onclick(None)" msgstr "" #: mu/modes/api/python3.py:582 msgid "" "turtle.ontimer(fun, t=0) \n" "Install a timer, which calls fun after t milliseconds.\n" "\n" "Arguments:\n" "fun -- a function with no arguments.\n" "t -- a number >= 0\n" "\n" "Example:\n" "\n" ">>> running = True\n" ">>> def f():\n" "... if running:\n" "... fd(50)\n" "... lt(60)\n" "... ontimer(f, 250)\n" "...\n" ">>> f() # makes the turtle marching around\n" ">>> running = False" msgstr "" #: mu/modes/api/python3.py:583 msgid "" "turtle.pd() \n" "Pull the pen down -- drawing when moving.\n" "\n" "Aliases: pendown | pd | down\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> pendown()" msgstr "" #: mu/modes/api/python3.py:584 msgid "" "turtle.pen(pen=None, **pendict) \n" "Return or set the pen's attributes.\n" "\n" "Arguments:\n" " pen -- a dictionary with some or all of the below listed keys.\n" " **pendict -- one or more keyword-arguments with the below\n" " listed keys as keywords.\n" "\n" "Return or set the pen's attributes in a 'pen-dictionary'\n" "with the following key/value pairs:\n" " \"shown\" : True/False\n" " \"pendown\" : True/False\n" " \"pencolor\" : color-string or color-tuple\n" " \"fillcolor\" : color-string or color-tuple\n" " \"pensize\" : positive number\n" " \"speed\" : number in range 0..10\n" " \"resizemode\" : \"auto\" or \"user\" or \"noresize\"\n" " \"stretchfactor\": (positive number, positive number)\n" " \"shearfactor\": number\n" " \"outline\" : positive number\n" " \"tilt\" : number\n" "\n" "This dictionary can be used as argument for a subsequent\n" "pen()-call to restore the former pen-state. Moreover one\n" "or more of these attributes can be provided as keyword-arguments.\n" "This can be used to set several pen attributes in one statement.\n" "\n" "\n" "Examples:\n" ">>> pen(fillcolor=\"black\", pencolor=\"red\", pensize=10)\n" ">>> pen()\n" "{'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,\n" "'pencolor': 'red', 'pendown': True, 'fillcolor': 'black',\n" "'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}\n" ">>> penstate=pen()\n" ">>> color(\"yellow\",\"\")\n" ">>> penup()\n" ">>> pen()\n" "{'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,\n" "'pencolor': 'yellow', 'pendown': False, 'fillcolor': '',\n" "'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}\n" ">>> p.pen(penstate, fillcolor=\"green\")\n" ">>> p.pen()\n" "{'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,\n" "'pencolor': 'red', 'pendown': True, 'fillcolor': 'green',\n" "'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}" msgstr "" #: mu/modes/api/python3.py:585 msgid "" "turtle.pencolor(*args) \n" "Return or set the pencolor.\n" "\n" "Arguments:\n" "Four input formats are allowed:\n" " - pencolor()\n" " Return the current pencolor as color specification string,\n" " possibly in hex-number format (see example).\n" " May be used as input to another color/pencolor/fillcolor call.\n" " - pencolor(colorstring)\n" " s is a Tk color specification string, such as \"red\" or \"yellow\"\n" " - pencolor((r, g, b))\n" " *a tuple* of r, g, and b, which represent, an RGB color,\n" " and each of r, g, and b are in the range 0..colormode,\n" " where colormode is either 1.0 or 255\n" " - pencolor(r, g, b)\n" " r, g, and b represent an RGB color, and each of r, g, and b\n" " are in the range 0..colormode\n" "\n" "If turtleshape is a polygon, the outline of that polygon is drawn\n" "with the newly set pencolor.\n" "\n" "Example:\n" ">>> pencolor('brown')\n" ">>> tup = (0.2, 0.8, 0.55)\n" ">>> pencolor(tup)\n" ">>> pencolor()\n" "'#33cc8c'" msgstr "" #: mu/modes/api/python3.py:586 msgid "" "turtle.pendown() \n" "Pull the pen down -- drawing when moving.\n" "\n" "Aliases: pendown | pd | down\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> pendown()" msgstr "" #: mu/modes/api/python3.py:587 msgid "" "turtle.pensize(width=None) \n" "Set or return the line thickness.\n" "\n" "Aliases: pensize | width\n" "\n" "Argument:\n" "width -- positive number\n" "\n" "Set the line thickness to width or return it. If resizemode is set\n" "to \"auto\" and turtleshape is a polygon, that polygon is drawn with\n" "the same line thickness. If no argument is given, current pensize\n" "is returned.\n" "\n" "Example:\n" ">>> pensize()\n" "1\n" ">>> pensize(10) # from here on lines of width 10 are drawn" msgstr "" #: mu/modes/api/python3.py:588 msgid "" "turtle.penup() \n" "Pull the pen up -- no drawing when moving.\n" "\n" "Aliases: penup | pu | up\n" "\n" "No argument\n" "\n" "Example:\n" ">>> penup()" msgstr "" #: mu/modes/api/python3.py:589 msgid "" "turtle.pos() \n" "Return the turtle's current location (x,y), as a Vec2D-vector.\n" "\n" "Aliases: pos | position\n" "\n" "No arguments.\n" "\n" "Example:\n" ">>> pos()\n" "(0.00, 240.00)" msgstr "" #: mu/modes/api/python3.py:590 msgid "" "turtle.position() \n" "Return the turtle's current location (x,y), as a Vec2D-vector.\n" "\n" "Aliases: pos | position\n" "\n" "No arguments.\n" "\n" "Example:\n" ">>> pos()\n" "(0.00, 240.00)" msgstr "" #: mu/modes/api/python3.py:591 msgid "" "turtle.pu() \n" "Pull the pen up -- no drawing when moving.\n" "\n" "Aliases: penup | pu | up\n" "\n" "No argument\n" "\n" "Example:\n" ">>> penup()" msgstr "" #: mu/modes/api/python3.py:592 msgid "" "turtle.radians() \n" "Set the angle measurement units to radians.\n" "\n" "No arguments.\n" "\n" "Example:\n" ">>> heading()\n" "90\n" ">>> radians()\n" ">>> heading()\n" "1.5707963267948966" msgstr "" #: mu/modes/api/python3.py:593 msgid "" "turtle.read_docstrings(lang) \n" "Read in docstrings from lang-specific docstring dictionary.\n" "\n" "Transfer docstrings, translated to lang, from a dictionary-file\n" "to the methods of classes Screen and Turtle and - in revised form -\n" "to the corresponding functions." msgstr "" #: mu/modes/api/python3.py:594 msgid "" "turtle.readconfig(cfgdict) \n" "Read config-files, change configuration-dict accordingly.\n" "\n" "If there is a turtle.cfg file in the current working directory,\n" "read it from there. If this contains an importconfig-value,\n" "say 'myway', construct filename turtle_mayway.cfg else use\n" "turtle.cfg and read it from the import-directory, where\n" "turtle.py is located.\n" "Update configuration dictionary first according to config-file,\n" "in the import directory, then according to config-file in the\n" "current working directory.\n" "If no config-file is found, the default configuration is used." msgstr "" #: mu/modes/api/python3.py:595 msgid "" "turtle.register_shape(name, shape=None) \n" "Adds a turtle shape to TurtleScreen's shapelist.\n" "\n" "Arguments:\n" "(1) name is the name of a gif-file and shape is None.\n" " Installs the corresponding image shape.\n" " !! Image-shapes DO NOT rotate when turning the turtle,\n" " !! so they do not display the heading of the turtle!\n" "(2) name is an arbitrary string and shape is a tuple\n" " of pairs of coordinates. Installs the corresponding\n" " polygon shape\n" "(3) name is an arbitrary string and shape is a\n" " (compound) Shape object. Installs the corresponding\n" " compound shape.\n" "To use a shape, you have to issue the command shape(shapename).\n" "\n" "call: register_shape(\"turtle.gif\")\n" "--or: register_shape(\"tri\", ((0,0), (10,10), (-10,10)))\n" "\n" "Example:\n" ">>> register_shape(\"triangle\", ((5,-3),(0,5),(-5,-3)))" msgstr "" #: mu/modes/api/python3.py:596 msgid "" "turtle.reset() \n" "Delete the turtle's drawings and restore its default values.\n" "\n" "No argument.\n" "\n" "Delete the turtle's drawings from the screen, re-center the turtle\n" "and set variables to the default values.\n" "\n" "Example:\n" ">>> position()\n" "(0.00,-22.00)\n" ">>> heading()\n" "100.0\n" ">>> reset()\n" ">>> position()\n" "(0.00,0.00)\n" ">>> heading()\n" "0.0" msgstr "" #: mu/modes/api/python3.py:597 msgid "" "turtle.resetscreen() \n" "Reset all Turtles on the Screen to their initial state.\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> reset()" msgstr "" #: mu/modes/api/python3.py:598 msgid "" "turtle.resizemode(rmode=None) \n" "Set resizemode to one of the values: \"auto\", \"user\", \"noresize\".\n" "\n" "(Optional) Argument:\n" "rmode -- one of the strings \"auto\", \"user\", \"noresize\"\n" "\n" "Different resizemodes have the following effects:\n" " - \"auto\" adapts the appearance of the turtle\n" " corresponding to the value of pensize.\n" " - \"user\" adapts the appearance of the turtle according to the\n" " values of stretchfactor and outlinewidth (outline),\n" " which are set by shapesize()\n" " - \"noresize\" no adaption of the turtle's appearance takes place.\n" "If no argument is given, return current resizemode.\n" "resizemode(\"user\") is called by a call of shapesize with arguments.\n" "\n" "\n" "Examples:\n" ">>> resizemode(\"noresize\")\n" ">>> resizemode()\n" "'noresize'" msgstr "" #: mu/modes/api/python3.py:599 msgid "" "turtle.right(angle) \n" "Turn turtle right by angle units.\n" "\n" "Aliases: right | rt\n" "\n" "Argument:\n" "angle -- a number (integer or float)\n" "\n" "Turn turtle right by angle units. (Units are by default degrees,\n" "but can be set via the degrees() and radians() functions.)\n" "Angle orientation depends on mode. (See this.)\n" "\n" "Example:\n" ">>> heading()\n" "22.0\n" ">>> right(45)\n" ">>> heading()\n" "337.0" msgstr "" #: mu/modes/api/python3.py:600 msgid "" "turtle.rt(angle) \n" "Turn turtle right by angle units.\n" "\n" "Aliases: right | rt\n" "\n" "Argument:\n" "angle -- a number (integer or float)\n" "\n" "Turn turtle right by angle units. (Units are by default degrees,\n" "but can be set via the degrees() and radians() functions.)\n" "Angle orientation depends on mode. (See this.)\n" "\n" "Example:\n" ">>> heading()\n" "22.0\n" ">>> right(45)\n" ">>> heading()\n" "337.0" msgstr "" #: mu/modes/api/python3.py:601 msgid "" "turtle.screensize(canvwidth=None, canvheight=None, bg=None) \n" "Resize the canvas the turtles are drawing on.\n" "\n" "Optional arguments:\n" "canvwidth -- positive integer, new width of canvas in pixels\n" "canvheight -- positive integer, new height of canvas in pixels\n" "bg -- colorstring or color-tuple, new backgroundcolor\n" "If no arguments are given, return current (canvaswidth, canvasheight)\n" "\n" "Do not alter the drawing window. To observe hidden parts of\n" "the canvas use the scrollbars. (Can make visible those parts\n" "of a drawing, which were outside the canvas before!)\n" "\n" "Example (for a Turtle instance named turtle):\n" ">>> turtle.screensize(2000,1500)\n" ">>> # e.g. to search for an erroneously escaped turtle ;-)" msgstr "" #: mu/modes/api/python3.py:602 msgid "" "turtle.seth(to_angle) \n" "Set the orientation of the turtle to to_angle.\n" "\n" "Aliases: setheading | seth\n" "\n" "Argument:\n" "to_angle -- a number (integer or float)\n" "\n" "Set the orientation of the turtle to to_angle.\n" "Here are some common directions in degrees:\n" "\n" " standard - mode: logo-mode:\n" "-------------------|--------------------\n" " 0 - east 0 - north\n" " 90 - north 90 - east\n" " 180 - west 180 - south\n" " 270 - south 270 - west\n" "\n" "Example:\n" ">>> setheading(90)\n" ">>> heading()\n" "90" msgstr "" #: mu/modes/api/python3.py:603 msgid "" "turtle.setheading(to_angle) \n" "Set the orientation of the turtle to to_angle.\n" "\n" "Aliases: setheading | seth\n" "\n" "Argument:\n" "to_angle -- a number (integer or float)\n" "\n" "Set the orientation of the turtle to to_angle.\n" "Here are some common directions in degrees:\n" "\n" " standard - mode: logo-mode:\n" "-------------------|--------------------\n" " 0 - east 0 - north\n" " 90 - north 90 - east\n" " 180 - west 180 - south\n" " 270 - south 270 - west\n" "\n" "Example:\n" ">>> setheading(90)\n" ">>> heading()\n" "90" msgstr "" #: mu/modes/api/python3.py:604 msgid "" "turtle.setpos(x, y=None) \n" "Move turtle to an absolute position.\n" "\n" "Aliases: setpos | setposition | goto:\n" "\n" "Arguments:\n" "x -- a number or a pair/vector of numbers\n" "y -- a number None\n" "\n" "call: goto(x, y) # two coordinates\n" "--or: goto((x, y)) # a pair (tuple) of coordinates\n" "--or: goto(vec) # e.g. as returned by pos()\n" "\n" "Move turtle to an absolute position. If the pen is down,\n" "a line will be drawn. The turtle's orientation does not change.\n" "\n" "Example:\n" ">>> tp = pos()\n" ">>> tp\n" "(0.00, 0.00)\n" ">>> setpos(60,30)\n" ">>> pos()\n" "(60.00,30.00)\n" ">>> setpos((20,80))\n" ">>> pos()\n" "(20.00,80.00)\n" ">>> setpos(tp)\n" ">>> pos()\n" "(0.00,0.00)" msgstr "" #: mu/modes/api/python3.py:605 msgid "" "turtle.setposition(x, y=None) \n" "Move turtle to an absolute position.\n" "\n" "Aliases: setpos | setposition | goto:\n" "\n" "Arguments:\n" "x -- a number or a pair/vector of numbers\n" "y -- a number None\n" "\n" "call: goto(x, y) # two coordinates\n" "--or: goto((x, y)) # a pair (tuple) of coordinates\n" "--or: goto(vec) # e.g. as returned by pos()\n" "\n" "Move turtle to an absolute position. If the pen is down,\n" "a line will be drawn. The turtle's orientation does not change.\n" "\n" "Example:\n" ">>> tp = pos()\n" ">>> tp\n" "(0.00, 0.00)\n" ">>> setpos(60,30)\n" ">>> pos()\n" "(60.00,30.00)\n" ">>> setpos((20,80))\n" ">>> pos()\n" "(20.00,80.00)\n" ">>> setpos(tp)\n" ">>> pos()\n" "(0.00,0.00)" msgstr "" #: mu/modes/api/python3.py:606 msgid "" "turtle.settiltangle(angle) \n" "Rotate the turtleshape to point in the specified direction\n" "\n" "Argument: angle -- number\n" "\n" "Rotate the turtleshape to point in the direction specified by angle,\n" "regardless of its current tilt-angle. DO NOT change the turtle's\n" "heading (direction of movement).\n" "\n" "\n" "Examples:\n" ">>> shape(\"circle\")\n" ">>> shapesize(5,2)\n" ">>> settiltangle(45)\n" ">>> stamp()\n" ">>> fd(50)\n" ">>> settiltangle(-45)\n" ">>> stamp()\n" ">>> fd(50)" msgstr "" #: mu/modes/api/python3.py:607 msgid "" "turtle.setundobuffer(size) \n" "Set or disable undobuffer.\n" "\n" "Argument:\n" "size -- an integer or None\n" "\n" "If size is an integer an empty undobuffer of given size is installed.\n" "Size gives the maximum number of turtle-actions that can be undone\n" "by the undo() function.\n" "If size is None, no undobuffer is present.\n" "\n" "Example:\n" ">>> setundobuffer(42)" msgstr "" #: mu/modes/api/python3.py:608 msgid "" "turtle.setup(width=0.5, height=0.75, startx=None, starty=None) \n" "Set the size and position of the main window.\n" "\n" "Arguments:\n" "width: as integer a size in pixels, as float a fraction of the \n" " Default is 50% of \n" "height: as integer the height in pixels, as float a fraction of the\n" " Default is 75% of \n" "startx: if positive, starting position in pixels from the left\n" " edge of the screen, if negative from the right edge\n" " Default, startx=None is to center window horizontally.\n" "starty: if positive, starting position in pixels from the top\n" " edge of the screen, if negative from the bottom edge\n" " Default, starty=None is to center window vertically.\n" "\n" "Examples:\n" ">>> setup (width=200, height=200, startx=0, starty=0)\n" "\n" "sets window to 200x200 pixels, in upper left of screen\n" "\n" ">>> setup(width=.75, height=0.5, startx=None, starty=None)\n" "\n" "sets window to 75% of screen by 50% of screen and centers" msgstr "" #: mu/modes/api/python3.py:609 msgid "" "turtle.setworldcoordinates(llx, lly, urx, ury) \n" "Set up a user defined coordinate-system.\n" "\n" "Arguments:\n" "llx -- a number, x-coordinate of lower left corner of canvas\n" "lly -- a number, y-coordinate of lower left corner of canvas\n" "urx -- a number, x-coordinate of upper right corner of canvas\n" "ury -- a number, y-coordinate of upper right corner of canvas\n" "\n" "Set up user coodinat-system and switch to mode 'world' if necessary.\n" "This performs a reset. If mode 'world' is already active,\n" "all drawings are redrawn according to the new coordinates.\n" "\n" "But ATTENTION: in user-defined coordinatesystems angles may appear\n" "distorted. (see Screen.mode())\n" "\n" "Example:\n" ">>> setworldcoordinates(-10,-0.5,50,1.5)\n" ">>> for _ in range(36):\n" "... left(10)\n" "... forward(0.5)" msgstr "" #: mu/modes/api/python3.py:610 msgid "" "turtle.setx(x) \n" "Set the turtle's first coordinate to x\n" "\n" "Argument:\n" "x -- a number (integer or float)\n" "\n" "Set the turtle's first coordinate to x, leave second coordinate\n" "unchanged.\n" "\n" "Example:\n" ">>> position()\n" "(0.00, 240.00)\n" ">>> setx(10)\n" ">>> position()\n" "(10.00, 240.00)" msgstr "" #: mu/modes/api/python3.py:611 msgid "" "turtle.sety(y) \n" "Set the turtle's second coordinate to y\n" "\n" "Argument:\n" "y -- a number (integer or float)\n" "\n" "Set the turtle's first coordinate to x, second coordinate remains\n" "unchanged.\n" "\n" "Example:\n" ">>> position()\n" "(0.00, 40.00)\n" ">>> sety(-10)\n" ">>> position()\n" "(0.00, -10.00)" msgstr "" #: mu/modes/api/python3.py:612 msgid "" "turtle.shape(name=None) \n" "Set turtle shape to shape with given name / return current shapename.\n" "\n" "Optional argument:\n" "name -- a string, which is a valid shapename\n" "\n" "Set turtle shape to shape with given name or, if name is not given,\n" "return name of current shape.\n" "Shape with name must exist in the TurtleScreen's shape dictionary.\n" "Initially there are the following polygon shapes:\n" "'arrow', 'turtle', 'circle', 'square', 'triangle', 'classic'.\n" "To learn about how to deal with shapes see Screen-method register_shape.\n" "\n" "Example:\n" ">>> shape()\n" "'arrow'\n" ">>> shape(\"turtle\")\n" ">>> shape()\n" "'turtle'" msgstr "" #: mu/modes/api/python3.py:613 msgid "" "turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None) \n" "Set/return turtle's stretchfactors/outline. Set resizemode to \"user\".\n" "\n" "Optional arguments:\n" " stretch_wid : positive number\n" " stretch_len : positive number\n" " outline : positive number\n" "\n" "Return or set the pen's attributes x/y-stretchfactors and/or outline.\n" "Set resizemode to \"user\".\n" "If and only if resizemode is set to \"user\", the turtle will be displayed\n" "stretched according to its stretchfactors:\n" "stretch_wid is stretchfactor perpendicular to orientation\n" "stretch_len is stretchfactor in direction of turtles orientation.\n" "outline determines the width of the shapes's outline.\n" "\n" "Examples:\n" ">>> resizemode(\"user\")\n" ">>> shapesize(5, 5, 12)\n" ">>> shapesize(outline=8)" msgstr "" #: mu/modes/api/python3.py:614 msgid "" "turtle.shapetransform(t11=None, t12=None, t21=None, t22=None) \n" "Set or return the current transformation matrix of the turtle shape.\n" "\n" "Optional arguments: t11, t12, t21, t22 -- numbers.\n" "\n" "If none of the matrix elements are given, return the transformation\n" "matrix.\n" "Otherwise set the given elements and transform the turtleshape\n" "according to the matrix consisting of first row t11, t12 and\n" "second row t21, 22.\n" "Modify stretchfactor, shearfactor and tiltangle according to the\n" "given matrix.\n" "\n" "Examples:\n" ">>> shape(\"square\")\n" ">>> shapesize(4,2)\n" ">>> shearfactor(-0.5)\n" ">>> shapetransform()\n" "(4.0, -1.0, -0.0, 2.0)" msgstr "" #: mu/modes/api/python3.py:615 msgid "" "turtle.shearfactor(shear=None) \n" "Set or return the current shearfactor.\n" "\n" "Optional argument: shear -- number, tangent of the shear angle\n" "\n" "Shear the turtleshape according to the given shearfactor shear,\n" "which is the tangent of the shear angle. DO NOT change the\n" "turtle's heading (direction of movement).\n" "If shear is not given: return the current shearfactor, i. e. the\n" "tangent of the shear angle, by which lines parallel to the\n" "heading of the turtle are sheared.\n" "\n" "Examples:\n" ">>> shape(\"circle\")\n" ">>> shapesize(5,2)\n" ">>> shearfactor(0.5)\n" ">>> shearfactor()\n" ">>> 0.5" msgstr "" #: mu/modes/api/python3.py:616 msgid "" "turtle.showturtle() \n" "Makes the turtle visible.\n" "\n" "Aliases: showturtle | st\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> hideturtle()\n" ">>> showturtle()" msgstr "" #: mu/modes/api/python3.py:617 msgid "" "turtle.speed(speed=None) \n" "Return or set the turtle's speed.\n" "\n" "Optional argument:\n" "speed -- an integer in the range 0..10 or a speedstring (see below)\n" "\n" "Set the turtle's speed to an integer value in the range 0 .. 10.\n" "If no argument is given: return current speed.\n" "\n" "If input is a number greater than 10 or smaller than 0.5,\n" "speed is set to 0.\n" "Speedstrings are mapped to speedvalues in the following way:\n" " 'fastest' : 0\n" " 'fast' : 10\n" " 'normal' : 6\n" " 'slow' : 3\n" " 'slowest' : 1\n" "speeds from 1 to 10 enforce increasingly faster animation of\n" "line drawing and turtle turning.\n" "\n" "Attention:\n" "speed = 0 : *no* animation takes place. forward/back makes turtle jump\n" "and likewise left/right make the turtle turn instantly.\n" "\n" "Example:\n" ">>> speed(3)" msgstr "" #: mu/modes/api/python3.py:618 msgid "" "turtle.split(p) \n" "Split a pathname. Returns tuple \"(head, tail)\" where \"tail\" is\n" "everything after the final slash. Either part may be empty." msgstr "" #: mu/modes/api/python3.py:619 msgid "" "turtle.st() \n" "Makes the turtle visible.\n" "\n" "Aliases: showturtle | st\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> hideturtle()\n" ">>> showturtle()" msgstr "" #: mu/modes/api/python3.py:620 msgid "" "turtle.stamp() \n" "Stamp a copy of the turtleshape onto the canvas and return its id.\n" "\n" "No argument.\n" "\n" "Stamp a copy of the turtle shape onto the canvas at the current\n" "turtle position. Return a stamp_id for that stamp, which can be\n" "used to delete it by calling clearstamp(stamp_id).\n" "\n" "Example:\n" ">>> color(\"blue\")\n" ">>> stamp()\n" "13\n" ">>> fd(50)" msgstr "" #: mu/modes/api/python3.py:621 msgid "" "turtle.sys() \n" "This module provides access to some objects used or maintained by the\n" "interpreter and to functions that interact strongly with the interpreter.\n" "\n" "Dynamic objects:\n" "\n" "argv -- command line arguments; argv[0] is the script pathname if known\n" "path -- module search path; path[0] is the script directory, else ''\n" "modules -- dictionary of loaded modules\n" "\n" "displayhook -- called to show results in an interactive session\n" "excepthook -- called to handle any uncaught exception other than SystemExit\n" " To customize printing in an interactive session or to install a custom\n" " top-level exception handler, assign other functions to replace these.\n" "\n" "stdin -- standard input file object; used by input()\n" "stdout -- standard output file object; used by print()\n" "stderr -- standard error object; used for error messages\n" " By assigning other file objects (or objects that behave like files)\n" " to these, it is possible to redirect all of the interpreter's I/O.\n" "\n" "last_type -- type of last uncaught exception\n" "last_value -- value of last uncaught exception\n" "last_traceback -- traceback of last uncaught exception\n" " These three are only available in an interactive session after a\n" " traceback has been printed.\n" "\n" "Static objects:\n" "\n" "builtin_module_names -- tuple of module names built into this interpreter\n" "copyright -- copyright notice pertaining to this interpreter\n" "exec_prefix -- prefix used to find the machine-specific Python library\n" "executable -- absolute path of the executable binary of the Python " "interpreter\n" "float_info -- a struct sequence with information about the float " "implementation.\n" "float_repr_style -- string indicating the style of repr() output for floats\n" "hash_info -- a struct sequence with information about the hash algorithm.\n" "hexversion -- version information encoded as a single integer\n" "implementation -- Python implementation information.\n" "int_info -- a struct sequence with information about the int " "implementation.\n" "maxsize -- the largest supported length of containers.\n" "maxunicode -- the value of the largest Unicode code point\n" "platform -- platform identifier\n" "prefix -- prefix used to find the Python library\n" "thread_info -- a struct sequence with information about the thread " "implementation.\n" "version -- the version of this interpreter as a string\n" "version_info -- version information as a named tuple\n" "__stdin__ -- the original stdin; don't touch!\n" "__stdout__ -- the original stdout; don't touch!\n" "__stderr__ -- the original stderr; don't touch!\n" "__displayhook__ -- the original displayhook; don't touch!\n" "__excepthook__ -- the original excepthook; don't touch!\n" "\n" "Functions:\n" "\n" "displayhook() -- print an object to the screen, and save it in builtins._\n" "excepthook() -- print an exception and its traceback to sys.stderr\n" "exc_info() -- return thread-safe information about the current exception\n" "exit() -- exit the interpreter by raising SystemExit\n" "getdlopenflags() -- returns flags to be used for dlopen() calls\n" "getprofile() -- get the global profiling function\n" "getrefcount() -- return the reference count for an object (plus one :-)\n" "getrecursionlimit() -- return the max recursion depth for the interpreter\n" "getsizeof() -- return the size of an object in bytes\n" "gettrace() -- get the global debug tracing function\n" "setcheckinterval() -- control how often the interpreter checks for events\n" "setdlopenflags() -- set the flags to be used for dlopen() calls\n" "setprofile() -- set the global profiling function\n" "setrecursionlimit() -- set the max recursion depth for the interpreter\n" "settrace() -- set the global debug tracing function" msgstr "" #: mu/modes/api/python3.py:622 msgid "" "turtle.textinput(title, prompt) \n" "Pop up a dialog window for input of a string.\n" "\n" "Arguments: title is the title of the dialog window,\n" "prompt is a text mostly describing what information to input.\n" "\n" "Return the string input\n" "If the dialog is canceled, return None.\n" "\n" "Example:\n" ">>> textinput(\"NIM\", \"Name of first player:\")" msgstr "" #: mu/modes/api/python3.py:623 msgid "" "turtle.tilt(angle) \n" "Rotate the turtleshape by angle.\n" "\n" "Argument:\n" "angle - a number\n" "\n" "Rotate the turtleshape by angle from its current tilt-angle,\n" "but do NOT change the turtle's heading (direction of movement).\n" "\n" "Examples:\n" ">>> shape(\"circle\")\n" ">>> shapesize(5,2)\n" ">>> tilt(30)\n" ">>> fd(50)\n" ">>> tilt(30)\n" ">>> fd(50)" msgstr "" #: mu/modes/api/python3.py:624 msgid "" "turtle.tiltangle(angle=None) \n" "Set or return the current tilt-angle.\n" "\n" "Optional argument: angle -- number\n" "\n" "Rotate the turtleshape to point in the direction specified by angle,\n" "regardless of its current tilt-angle. DO NOT change the turtle's\n" "heading (direction of movement).\n" "If angle is not given: return the current tilt-angle, i. e. the angle\n" "between the orientation of the turtleshape and the heading of the\n" "turtle (its direction of movement).\n" "\n" "Deprecated since Python 3.1\n" "\n" "Examples:\n" ">>> shape(\"circle\")\n" ">>> shapesize(5,2)\n" ">>> tilt(45)\n" ">>> tiltangle()" msgstr "" #: mu/modes/api/python3.py:625 msgid "" "turtle.time() \n" "This module provides various functions to manipulate time values.\n" "\n" "There are two standard representations of time. One is the number\n" "of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n" "or a floating point number (to represent fractions of seconds).\n" "The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n" "The actual value can be retrieved by calling gmtime(0).\n" "\n" "The other representation is a tuple of 9 integers giving local time.\n" "The tuple items are:\n" " year (including century, e.g. 1998)\n" " month (1-12)\n" " day (1-31)\n" " hours (0-23)\n" " minutes (0-59)\n" " seconds (0-59)\n" " weekday (0-6, Monday is 0)\n" " Julian day (day in the year, 1-366)\n" " DST (Daylight Savings Time) flag (-1, 0 or 1)\n" "If the DST flag is 0, the time is given in the regular time zone;\n" "if it is 1, the time is given in the DST time zone;\n" "if it is -1, mktime() should guess based on the date and time.\n" "\n" "Variables:\n" "\n" "timezone -- difference in seconds between UTC and local standard time\n" "altzone -- difference in seconds between UTC and local DST time\n" "daylight -- whether local time should reflect DST\n" "tzname -- tuple of (standard time zone name, DST time zone name)\n" "\n" "Functions:\n" "\n" "time() -- return current time in seconds since the Epoch as a float\n" "clock() -- return CPU time since process start as a float\n" "sleep() -- delay for a number of seconds given as a float\n" "gmtime() -- convert seconds since Epoch to UTC tuple\n" "localtime() -- convert seconds since Epoch to local time tuple\n" "asctime() -- convert time tuple to string\n" "ctime() -- convert time in seconds to string\n" "mktime() -- convert local time tuple to seconds since Epoch\n" "strftime() -- convert time tuple to string according to format " "specification\n" "strptime() -- parse string to time tuple according to format specification\n" "tzset() -- change the local timezone" msgstr "" #: mu/modes/api/python3.py:626 msgid "" "turtle.title(titlestring) \n" "Set title of turtle-window\n" "\n" "Argument:\n" "titlestring -- a string, to appear in the titlebar of the\n" " turtle graphics window.\n" "\n" "This is a method of Screen-class. Not available for TurtleScreen-\n" "objects.\n" "\n" "Example:\n" ">>> title(\"Welcome to the turtle-zoo!\")" msgstr "" #: mu/modes/api/python3.py:627 msgid "" "turtle.tkinter() \n" "Wrapper functions for Tcl/Tk.\n" "\n" "Tkinter provides classes which allow the display, positioning and\n" "control of widgets. Toplevel widgets are Tk and Toplevel. Other\n" "widgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,\n" "Checkbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox\n" "LabelFrame and PanedWindow.\n" "\n" "Properties of the widgets are specified with keyword arguments.\n" "Keyword arguments have the same name as the corresponding resource\n" "under Tk.\n" "\n" "Widgets are positioned with one of the geometry managers Place, Pack\n" "or Grid. These managers can be called with methods place, pack, grid\n" "available in every Widget.\n" "\n" "Actions are bound to events by resources (e.g. keyword argument\n" "command) or with the method bind.\n" "\n" "Example (Hello, World):\n" "import tkinter\n" "from tkinter.constants import *\n" "tk = tkinter.Tk()\n" "frame = tkinter.Frame(tk, relief=RIDGE, borderwidth=2)\n" "frame.pack(fill=BOTH,expand=1)\n" "label = tkinter.Label(frame, text=\"Hello, World\")\n" "label.pack(fill=X, expand=1)\n" "button = tkinter.Button(frame,text=\"Exit\",command=tk.destroy)\n" "button.pack(side=BOTTOM)\n" "tk.mainloop()" msgstr "" #: mu/modes/api/python3.py:628 msgid "" "turtle.tkinter.simpledialog() \n" "This modules handles dialog boxes.\n" "\n" "It contains the following public symbols:\n" "\n" "SimpleDialog -- A simple but flexible modal dialog box\n" "\n" "Dialog -- a base class for dialogs\n" "\n" "askinteger -- get an integer from the user\n" "\n" "askfloat -- get a float from the user\n" "\n" "askstring -- get a string from the user" msgstr "" #: mu/modes/api/python3.py:629 msgid "" "turtle.towards(x, y=None) \n" "Return the angle of the line from the turtle's position to (x, y).\n" "\n" "Arguments:\n" "x -- a number or a pair/vector of numbers or a turtle instance\n" "y -- a number None None\n" "\n" "call: distance(x, y) # two coordinates\n" "--or: distance((x, y)) # a pair (tuple) of coordinates\n" "--or: distance(vec) # e.g. as returned by pos()\n" "--or: distance(mypen) # where mypen is another turtle\n" "\n" "Return the angle, between the line from turtle-position to position\n" "specified by x, y and the turtle's start orientation. (Depends on\n" "modes - \"standard\" or \"logo\")\n" "\n" "Example:\n" ">>> pos()\n" "(10.00, 10.00)\n" ">>> towards(0,0)\n" "225.0" msgstr "" #: mu/modes/api/python3.py:630 msgid "" "turtle.tracer(n=None, delay=None) \n" "Turns turtle animation on/off and set delay for update drawings.\n" "\n" "Optional arguments:\n" "n -- nonnegative integer\n" "delay -- nonnegative integer\n" "\n" "If n is given, only each n-th regular screen update is really performed.\n" "(Can be used to accelerate the drawing of complex graphics.)\n" "Second arguments sets delay value (see RawTurtle.delay())\n" "\n" "Example:\n" ">>> tracer(8, 25)\n" ">>> dist = 2\n" ">>> for i in range(200):\n" "... fd(dist)\n" "... rt(90)\n" "... dist += 2" msgstr "" #: mu/modes/api/python3.py:631 msgid "" "turtle.turtles() \n" "Return the list of turtles on the \n" "\n" "Example:\n" ">>> turtles()\n" "[]" msgstr "" #: mu/modes/api/python3.py:632 msgid "" "turtle.turtlesize(stretch_wid=None, stretch_len=None, outline=None) \n" "Set/return turtle's stretchfactors/outline. Set resizemode to \"user\".\n" "\n" "Optional arguments:\n" " stretch_wid : positive number\n" " stretch_len : positive number\n" " outline : positive number\n" "\n" "Return or set the pen's attributes x/y-stretchfactors and/or outline.\n" "Set resizemode to \"user\".\n" "If and only if resizemode is set to \"user\", the turtle will be displayed\n" "stretched according to its stretchfactors:\n" "stretch_wid is stretchfactor perpendicular to orientation\n" "stretch_len is stretchfactor in direction of turtles orientation.\n" "outline determines the width of the shapes's outline.\n" "\n" "Examples:\n" ">>> resizemode(\"user\")\n" ">>> shapesize(5, 5, 12)\n" ">>> shapesize(outline=8)" msgstr "" #: mu/modes/api/python3.py:633 msgid "" "turtle.types() \n" "Define names for built-in types that aren't directly accessible as a builtin." msgstr "" #: mu/modes/api/python3.py:634 msgid "" "turtle.undo() \n" "undo (repeatedly) the last turtle action.\n" "\n" "No argument.\n" "\n" "undo (repeatedly) the last turtle action.\n" "Number of available undo actions is determined by the size of\n" "the undobuffer.\n" "\n" "Example:\n" ">>> for i in range(4):\n" "... fd(50); lt(80)\n" "...\n" ">>> for i in range(8):\n" "... undo()\n" "..." msgstr "" #: mu/modes/api/python3.py:635 msgid "" "turtle.undobufferentries() \n" "Return count of entries in the undobuffer.\n" "\n" "No argument.\n" "\n" "Example:\n" ">>> while undobufferentries():\n" "... undo()" msgstr "" #: mu/modes/api/python3.py:636 msgid "" "turtle.up() \n" "Pull the pen up -- no drawing when moving.\n" "\n" "Aliases: penup | pu | up\n" "\n" "No argument\n" "\n" "Example:\n" ">>> penup()" msgstr "" #: mu/modes/api/python3.py:637 msgid "" "turtle.update() \n" "Perform a TurtleScreen update.\n" " " msgstr "" #: mu/modes/api/python3.py:638 msgid "" "turtle.width(width=None) \n" "Set or return the line thickness.\n" "\n" "Aliases: pensize | width\n" "\n" "Argument:\n" "width -- positive number\n" "\n" "Set the line thickness to width or return it. If resizemode is set\n" "to \"auto\" and turtleshape is a polygon, that polygon is drawn with\n" "the same line thickness. If no argument is given, current pensize\n" "is returned.\n" "\n" "Example:\n" ">>> pensize()\n" "1\n" ">>> pensize(10) # from here on lines of width 10 are drawn" msgstr "" #: mu/modes/api/python3.py:639 msgid "" "turtle.window_height() \n" "Return the height of the turtle window.\n" "\n" "Example:\n" ">>> window_height()\n" "480" msgstr "" #: mu/modes/api/python3.py:640 msgid "" "turtle.window_width() \n" "Return the width of the turtle window.\n" "\n" "Example:\n" ">>> window_width()\n" "640" msgstr "" #: mu/modes/api/python3.py:641 msgid "" "turtle.write(arg, move=False, align='left', font='Arial', 8, 'normal') \n" "Write text at the current turtle position.\n" "\n" "Arguments:\n" "arg -- info, which is to be written to the TurtleScreen\n" "move (optional) -- True/False\n" "align (optional) -- one of the strings \"left\", \"center\" or right\"\n" "font (optional) -- a triple (fontname, fontsize, fonttype)\n" "\n" "Write text - the string representation of arg - at the current\n" "turtle position according to align (\"left\", \"center\" or right\")\n" "and with the given font.\n" "If move is True, the pen is moved to the bottom-right corner\n" "of the text. By default, move is False.\n" "\n" "Example:\n" ">>> write('Home = ', True, align=\"center\")\n" ">>> write((0,0), True)" msgstr "" #: mu/modes/api/python3.py:642 msgid "" "turtle.write_docstringdict(filename='turtle_docstringdict') \n" "Create and write docstring-dictionary to file.\n" "\n" "Optional argument:\n" "filename -- a string, used as filename\n" " default value is turtle_docstringdict\n" "\n" "Has to be called explicitly, (not used by the turtle-graphics classes)\n" "The docstring dictionary will be written to the Python script .py\n" "It is intended to serve as a template for translation of the docstrings\n" "into different languages." msgstr "" #: mu/modes/api/python3.py:643 msgid "" "turtle.xcor() \n" "Return the turtle's x coordinate.\n" "\n" "No arguments.\n" "\n" "Example:\n" ">>> reset()\n" ">>> left(60)\n" ">>> forward(100)\n" ">>> print xcor()\n" "50.0" msgstr "" #: mu/modes/api/python3.py:644 msgid "" "turtle.ycor() \n" "Return the turtle's y coordinate\n" "---\n" "No arguments.\n" "\n" "Example:\n" ">>> reset()\n" ">>> left(60)\n" ">>> forward(100)\n" ">>> print ycor()\n" "86.6025403784" msgstr "" #: mu/modes/api/python3.py:645 msgid "" "uuid.UUID(hex=None, bytes=None, bytes_le=None, fields=None, int=None, " "version=None) \n" "Instances of the UUID class represent UUIDs as specified in RFC 4122.\n" "UUID objects are immutable, hashable, and usable as dictionary keys.\n" "Converting a UUID to a string with str() yields something in the form\n" "'12345678-1234-1234-1234-123456789abc'. The UUID constructor accepts\n" "five possible forms: a similar string of hexadecimal digits, or a tuple\n" "of six integer fields (with 32-bit, 16-bit, 16-bit, 8-bit, 8-bit, and\n" "48-bit values respectively) as an argument named 'fields', or a string\n" "of 16 bytes (with all the integer fields in big-endian order) as an\n" "argument named 'bytes', or a string of 16 bytes (with the first three\n" "fields in little-endian order) as an argument named 'bytes_le', or a\n" "single 128-bit integer as an argument named 'int'.\n" "\n" "UUIDs have these read-only attributes:\n" "\n" " bytes the UUID as a 16-byte string (containing the six\n" " integer fields in big-endian byte order)\n" "\n" " bytes_le the UUID as a 16-byte string (with time_low, time_mid,\n" " and time_hi_version in little-endian byte order)\n" "\n" " fields a tuple of the six integer fields of the UUID,\n" " which are also available as six individual attributes\n" " and two derived attributes:\n" "\n" " time_low the first 32 bits of the UUID\n" " time_mid the next 16 bits of the UUID\n" " time_hi_version the next 16 bits of the UUID\n" " clock_seq_hi_variant the next 8 bits of the UUID\n" " clock_seq_low the next 8 bits of the UUID\n" " node the last 48 bits of the UUID\n" "\n" " time the 60-bit timestamp\n" " clock_seq the 14-bit sequence number\n" "\n" " hex the UUID as a 32-character hexadecimal string\n" "\n" " int the UUID as a 128-bit integer\n" "\n" " urn the UUID as a URN as specified in RFC 4122\n" "\n" " variant the UUID variant (one of the constants RESERVED_NCS,\n" " RFC_4122, RESERVED_MICROSOFT, or RESERVED_FUTURE)\n" "\n" " version the UUID version number (1 through 5, meaningful only\n" " when the variant is RFC_4122)" msgstr "" #: mu/modes/api/python3.py:646 msgid "" "uuid.bytes() \n" "bytes(iterable_of_ints) -> bytes\n" "bytes(string, encoding[, errors]) -> bytes\n" "bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\n" "bytes(int) -> bytes object of size given by the parameter initialized with " "null bytes\n" "bytes() -> empty bytes object\n" "\n" "Construct an immutable array of bytes from:\n" " - an iterable yielding integers in range(256)\n" " - a text string encoded using the specified encoding\n" " - any object implementing the buffer API.\n" " - an integer" msgstr "" #: mu/modes/api/python3.py:647 msgid "" "uuid.ctypes() \n" "create and manipulate C data types in Python" msgstr "" #: mu/modes/api/python3.py:648 msgid "" "uuid.getnode() \n" "Get the hardware address as a 48-bit positive integer.\n" "\n" "The first time this runs, it may launch a separate program, which could\n" "be quite slow. If all attempts to obtain the hardware address fail, we\n" "choose a random 48-bit number with its eighth bit set to 1 as recommended\n" "in RFC 4122." msgstr "" #: mu/modes/api/python3.py:649 msgid "" "uuid.int() \n" "int(x=0) -> integer\n" "int(x, base=10) -> integer\n" "\n" "Convert a number or string to an integer, or return 0 if no arguments\n" "are given. If x is a number, return x.__int__(). For floating point\n" "numbers, this truncates towards zero.\n" "\n" "If x is not a number or if base is given, then x must be a string,\n" "bytes, or bytearray instance representing an integer literal in the\n" "given base. The literal can be preceded by '+' or '-' and be surrounded\n" "by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\n" "Base 0 means to interpret the base from the string as an integer literal.\n" ">>> int('0b100', base=0)\n" "4" msgstr "" #: mu/modes/api/python3.py:650 msgid "" "uuid.os() \n" "OS routines for NT or Posix depending on what system we're on.\n" "\n" "This exports:\n" " - all functions from posix or nt, e.g. unlink, stat, etc.\n" " - os.path is either posixpath or ntpath\n" " - os.name is either 'posix' or 'nt'\n" " - os.curdir is a string representing the current directory (always '.')\n" " - os.pardir is a string representing the parent directory (always '..')\n" " - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n" " - os.extsep is the extension separator (always '.')\n" " - os.altsep is the alternate pathname separator (None or '/')\n" " - os.pathsep is the component separator used in $PATH etc\n" " - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r" "\\n')\n" " - os.defpath is the default search path for executables\n" " - os.devnull is the file path of the null device ('/dev/null', etc.)\n" "\n" "Programs that import and use 'os' stand a better chance of being\n" "portable between different platforms. Of course, they must then\n" "only use functions that are defined by all platforms (e.g., unlink\n" "and opendir), and leave all pathname manipulation to os.path\n" "(e.g., split and join)." msgstr "" #: mu/modes/api/python3.py:651 msgid "" "uuid.sys() \n" "This module provides access to some objects used or maintained by the\n" "interpreter and to functions that interact strongly with the interpreter.\n" "\n" "Dynamic objects:\n" "\n" "argv -- command line arguments; argv[0] is the script pathname if known\n" "path -- module search path; path[0] is the script directory, else ''\n" "modules -- dictionary of loaded modules\n" "\n" "displayhook -- called to show results in an interactive session\n" "excepthook -- called to handle any uncaught exception other than SystemExit\n" " To customize printing in an interactive session or to install a custom\n" " top-level exception handler, assign other functions to replace these.\n" "\n" "stdin -- standard input file object; used by input()\n" "stdout -- standard output file object; used by print()\n" "stderr -- standard error object; used for error messages\n" " By assigning other file objects (or objects that behave like files)\n" " to these, it is possible to redirect all of the interpreter's I/O.\n" "\n" "last_type -- type of last uncaught exception\n" "last_value -- value of last uncaught exception\n" "last_traceback -- traceback of last uncaught exception\n" " These three are only available in an interactive session after a\n" " traceback has been printed.\n" "\n" "Static objects:\n" "\n" "builtin_module_names -- tuple of module names built into this interpreter\n" "copyright -- copyright notice pertaining to this interpreter\n" "exec_prefix -- prefix used to find the machine-specific Python library\n" "executable -- absolute path of the executable binary of the Python " "interpreter\n" "float_info -- a struct sequence with information about the float " "implementation.\n" "float_repr_style -- string indicating the style of repr() output for floats\n" "hash_info -- a struct sequence with information about the hash algorithm.\n" "hexversion -- version information encoded as a single integer\n" "implementation -- Python implementation information.\n" "int_info -- a struct sequence with information about the int " "implementation.\n" "maxsize -- the largest supported length of containers.\n" "maxunicode -- the value of the largest Unicode code point\n" "platform -- platform identifier\n" "prefix -- prefix used to find the Python library\n" "thread_info -- a struct sequence with information about the thread " "implementation.\n" "version -- the version of this interpreter as a string\n" "version_info -- version information as a named tuple\n" "__stdin__ -- the original stdin; don't touch!\n" "__stdout__ -- the original stdout; don't touch!\n" "__stderr__ -- the original stderr; don't touch!\n" "__displayhook__ -- the original displayhook; don't touch!\n" "__excepthook__ -- the original excepthook; don't touch!\n" "\n" "Functions:\n" "\n" "displayhook() -- print an object to the screen, and save it in builtins._\n" "excepthook() -- print an exception and its traceback to sys.stderr\n" "exc_info() -- return thread-safe information about the current exception\n" "exit() -- exit the interpreter by raising SystemExit\n" "getdlopenflags() -- returns flags to be used for dlopen() calls\n" "getprofile() -- get the global profiling function\n" "getrefcount() -- return the reference count for an object (plus one :-)\n" "getrecursionlimit() -- return the max recursion depth for the interpreter\n" "getsizeof() -- return the size of an object in bytes\n" "gettrace() -- get the global debug tracing function\n" "setcheckinterval() -- control how often the interpreter checks for events\n" "setdlopenflags() -- set the flags to be used for dlopen() calls\n" "setprofile() -- set the global profiling function\n" "setrecursionlimit() -- set the max recursion depth for the interpreter\n" "settrace() -- set the global debug tracing function" msgstr "" #: mu/modes/api/python3.py:652 msgid "" "uuid.uuid1(node=None, clock_seq=None) \n" "Generate a UUID from a host ID, sequence number, and the current time.\n" "If 'node' is not given, getnode() is used to obtain the hardware\n" "address. If 'clock_seq' is given, it is used as the sequence number;\n" "otherwise a random 14-bit sequence number is chosen." msgstr "" #: mu/modes/api/python3.py:653 msgid "" "uuid.uuid3(namespace, name) \n" "Generate a UUID from the MD5 hash of a namespace UUID and a name." msgstr "" #: mu/modes/api/python3.py:654 msgid "" "uuid.uuid4() \n" "Generate a random UUID." msgstr "" #: mu/modes/api/python3.py:655 msgid "" "uuid.uuid5(namespace, name) \n" "Generate a UUID from the SHA-1 hash of a namespace UUID and a name." msgstr "" #: mu/modes/api/shared.py:24 msgid "" "find(sub, start, end) \n" "Return the lowest index in the string where substring 'sub' is found. The " "optional\n" "'start' and 'end' arguments specify the slice of string to use.\n" "Returns -1 if 'sub' cannot be found." msgstr "" #: mu/modes/api/shared.py:25 msgid "" "rfind(sub, start, end) \n" "Return the highest index in the string where substring 'sub' is found. The " "optional\n" "'start' and 'end' arguments specify the slice of string to use.\n" "Returns -1 if 'sub' cannot be found." msgstr "" #: mu/modes/api/shared.py:26 msgid "" "index(sub, start, end) \n" "Return the lowest index in the string where substring 'sub' is found. The " "optional\n" "'start' and 'end' arguments specify the slice of string to use.\n" "Raises a ValueError if 'sub' cannot be found." msgstr "" #: mu/modes/api/shared.py:27 msgid "" "rindex(sub, start, end) \n" "Return the highest index in the string where substring 'sub' is found. The " "optional\n" "'start' and 'end' arguments specify the slice of string to use.\n" "Raises a ValueError if 'sub' cannot be found." msgstr "" #: mu/modes/api/shared.py:28 msgid "" "join(iterable) \n" "Return a string which is the concatenation of the strings in 'iterable'.\n" "The separator between elements is the string providing this method." msgstr "" #: mu/modes/api/shared.py:29 msgid "" "split(sep=None, maxsplit=-1) \n" "Return a list of the words in a string, using 'sep' as the delimiter " "string.\n" "If 'sep' is not provided, the splitting algorithm uses whitespace.\n" "If the optional 'maxsplit' is provided, splitting will occur 'maxsplit' " "times." msgstr "" #: mu/modes/api/shared.py:30 msgid "" "rsplit(sep=None, maxsplit=-1) \n" "Return a list of the words in a string, using 'sep' as the delimiter " "string.\n" "If 'sep' is not provided, the splitting algorithm uses whitespace.\n" "If the optional 'maxsplit' is provided, splitting will only occur " "'maxsplit'\n" "times from the right." msgstr "" #: mu/modes/api/shared.py:31 msgid "" "startswith(prefix) \n" "Returns True if the string starts with 'prefix'." msgstr "" #: mu/modes/api/shared.py:32 msgid "" "endswith(suffix) \n" "Returns True if the string ends with 'suffix'." msgstr "" #: mu/modes/api/shared.py:33 msgid "" "strip(chars) \n" "Return a copy of the string with the leading and trailing characters " "removed.\n" "The chars argument is a string specifying the set of characters to be " "removed.\n" "If omitted or None, the chars argument defaults to removing whitespace.\n" "The chars argument is not a prefix or suffix; rather, all combinations of " "its values are stripped" msgstr "" #: mu/modes/api/shared.py:34 msgid "" "lstrip(chars) \n" "Return a copy of the string with leading characters removed. The chars " "argument\n" "is a string specifying the set of characters to be removed.\n" "If omitted or None, the chars argument defaults to removing whitespace.\n" "The chars argument is not a prefix; rather, all combinations of its values " "are\n" "stripped" msgstr "" #: mu/modes/api/shared.py:35 msgid "" "rstrip(chars) \n" "Return a copy of the string with trailing characters removed. The chars " "argument\n" "is a string specifying the set of characters to be removed.\n" "If omitted or None, the chars argument defaults to removing whitespace.\n" "The chars argument is not a suffix; rather, all combinations of its values " "are\n" "stripped" msgstr "" #: mu/modes/api/shared.py:36 msgid "" "format(*args, **kwargs) \n" "Perform a string formatting operation. The string on which this method is " "called\n" "can contain literal text or replacement fields delimited by braces {}. Each\n" "replacement field contains either the numeric index of a positional " "argument,\n" "or the name of a keyword argument.\n" "Returns a copy of the string where each replacement field is replaced with " "the\n" "string value of the corresponding argument." msgstr "" #: mu/modes/api/shared.py:37 msgid "" "replace(old, new) \n" "Return a copy of the string with all othe occurrences of 'old' replaced with " "'new'." msgstr "" #: mu/modes/api/shared.py:38 msgid "" "count(sub, start, end) \n" "Return the number of non-overlapping occurrences of substring 'sub'.\n" "Optional arguments 'start' and 'end' specify the slice of the string to use. " msgstr "" #: mu/modes/api/shared.py:39 msgid "" "partition(sep) \n" "Split the string at the first occurrence of 'sep', and return a 3-tuple " "containing\n" "the part before the separator, the separator itself, and the part after the " "separator.\n" "If the separator is not found, return a 3-tuple containing the string " "itself,\n" "followed by two empty strings." msgstr "" #: mu/modes/api/shared.py:40 msgid "" "rpartition(sep) \n" "Split the string at the last occurrence of 'sep', and return a 3-tuple " "containing\n" "the part before the separator, the separator itself, and the part after the " "separator.\n" "If the separator is not found, return a 3-tuple containing two empty " "strings,\n" "followed by the string itself." msgstr "" #: mu/modes/api/shared.py:41 msgid "" "lower() \n" "Return a copy of the string with all the cased characters converted to " "lowercase." msgstr "" #: mu/modes/api/shared.py:42 msgid "" "upper() \n" "Return a copy of the string with all the cased characters converted to " "uppercase." msgstr "" #: mu/modes/api/shared.py:43 msgid "" "isspace() \n" "Return True if there are only whitespace characters in the string and thers " "is\n" "at least one character." msgstr "" #: mu/modes/api/shared.py:44 msgid "" "isalpha() \n" "Return True if all the characters in the string are alphabetic and there is\n" "at least one character." msgstr "" #: mu/modes/api/shared.py:45 msgid "" "isdigit() \n" "Return True if all characters in the string are digits and there is\n" "at least one character." msgstr "" #: mu/modes/api/shared.py:46 msgid "" "isupper() \n" "Return True if all characters in the string are uppercase and there is\n" "at least one character." msgstr "" #: mu/modes/api/shared.py:47 msgid "" "islower() \n" "Return True if all characters in the string are lowercase and there is\n" "at least one character." msgstr "" #: mu/modes/api/shared.py:49 msgid "" "abs(x) \n" "Return the absolute value of the number 'x'." msgstr "" #: mu/modes/api/shared.py:50 msgid "" "all(iterable) \n" "Return True if all elements of iterable are true (or iterable is empty)." msgstr "" #: mu/modes/api/shared.py:51 msgid "" "any(iterable) \n" "Return True if any element of iterable is true. If iterable is empty, return " "False." msgstr "" #: mu/modes/api/shared.py:52 msgid "" "bin(x) \n" "Convert an integer (whole) number into a binary string." msgstr "" #: mu/modes/api/shared.py:53 msgid "" "bool(x) \n" "Return a Boolean value, i.e. one of True or False. The argument 'x' is used " "to\n" "generate the resulting truth value." msgstr "" #: mu/modes/api/shared.py:54 msgid "" "bytearray(seq) \n" "Return a new array of bytes specified by the sequence 'seq' of integers." msgstr "" #: mu/modes/api/shared.py:55 msgid "" "bytes(seq) \n" "Return a new 'bytes' object - an immutable sequence of 'seq' integers." msgstr "" #: mu/modes/api/shared.py:56 msgid "" "callable(object) \n" "Return True if the 'object' appears to be callable. Otherwise return False." msgstr "" #: mu/modes/api/shared.py:57 msgid "" "chr(i) \n" "Return a string representing a character whose Unicode code point is the " "integer 'i'." msgstr "" #: mu/modes/api/shared.py:58 msgid "" "classmethod(function) \n" "Return a class method for a function. Usually used as a decorator:\n" "\n" "class C:\n" " @classmethod\n" " def func(cls): ..." msgstr "" #: mu/modes/api/shared.py:59 msgid "" "dict(): \n" "Create a new dictionary object." msgstr "" #: mu/modes/api/shared.py:60 msgid "" "dir(object) \n" "Return a list of names in the scope of 'object'. If no object is supplied,\n" "returns a ist of names in the current local scope." msgstr "" #: mu/modes/api/shared.py:61 msgid "" "divmod(a, b) \n" "Take two (non complex) numbers and return a pair of numbers consisting of " "the quotient and remainder. For example, divmod(5, 4) results in (1, 1). " "That is, what's is 5 divided by 4? It's 1 remainder 1." msgstr "" #: mu/modes/api/shared.py:62 msgid "" "enumerate(iterable, start=0) \n" "Return an enumerate object from an iterable object.\n" "Each iteration of the resulting object returns a tuple containing a count " "and the value. For example:\n" "\n" "seasons = ['Spring', 'Summer', 'Autumn', 'Winter']\n" "list(enumerate(seasons))\n" "[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]" msgstr "" #: mu/modes/api/shared.py:63 msgid "" "eval(expression, globals=None, locals=None) \n" "The 'expression' string containing a Python expression is parsed and " "evaluated given\n" "the context specified by 'globals' and 'locals' which must be dictionary " "objects." msgstr "" #: mu/modes/api/shared.py:64 msgid "" "exec(object, globals, locals) \n" "This function supports dynamic execution of Python code. The 'object' must " "be\n" "a string containing Python code that can be parsed and evaluated. If " "`globals` and\n" "`locals` are emitted the code is executed in the local scope. Otherwise, " "both\n" "'globals' and 'locals' must be dictionary objects." msgstr "" #: mu/modes/api/shared.py:65 msgid "" "filter(function, iterable) \n" "Construct an iterator from those elements of 'iterable' for which 'function' " "returns True." msgstr "" #: mu/modes/api/shared.py:66 msgid "" "float(x) \n" "Return a floating point number constructed from a number or string 'x'." msgstr "" #: mu/modes/api/shared.py:67 msgid "" "frozenset(iterable) \n" "Return a new frozenset object, optionally with elements taken from " "'iterable'." msgstr "" #: mu/modes/api/shared.py:68 msgid "" "getattr(object, name, default) \n" "Return the value fo the named attribute of 'object'. 'name' must be a " "string.\n" "Optionally return 'default' if 'name' is not an attribute of 'object'." msgstr "" #: mu/modes/api/shared.py:69 msgid "" "globals() \n" "Return a dictionary representing the current global symbol table.\n" "I.e. named objects that are currently in the global scope." msgstr "" #: mu/modes/api/shared.py:70 msgid "" "hasattr(object, name) \n" "Returns True if the 'object' has an attribute called 'name'. 'name' must be " "a string." msgstr "" #: mu/modes/api/shared.py:71 msgid "" "hash(object) \n" "Return a hash value of the object (if it has one). Hash values are integers." msgstr "" #: mu/modes/api/shared.py:72 msgid "" "help(object) \n" "Invoke the built-in help system (intended for interactive use in the REPL." msgstr "" #: mu/modes/api/shared.py:73 msgid "" "hex(x) \n" "Convert an integer 'x' to a lowercase hexadevimal string prefixed with '0x'. " "For example, hex(255) returns '0xff'." msgstr "" #: mu/modes/api/shared.py:74 msgid "" "id(object) \n" "Return the identity of an object. This is an integer that is guaranteed to " "be unique." msgstr "" #: mu/modes/api/shared.py:75 msgid "" "int(x, base=10) \n" "Return an integer constructed from a number or string 'x'. The optional " "'base' (indicating the base of the number) defaults to 10." msgstr "" #: mu/modes/api/shared.py:76 msgid "" "isinstance(object, classinfo) \n" "Return True if the 'object' is an instance of 'classinfo'." msgstr "" #: mu/modes/api/shared.py:77 msgid "" "issubclass(class, classinfo) \n" "Return True if the 'class' is a subclass (direct, indirect or virtual) of " "'classinfo'." msgstr "" #: mu/modes/api/shared.py:78 msgid "" "iter(object) \n" "Return an iterator object for the 'object' (that must support the iteration " "protocol." msgstr "" #: mu/modes/api/shared.py:79 msgid "" "len(object) \n" "Return the length (the number of items) in an 'object'." msgstr "" #: mu/modes/api/shared.py:80 msgid "" "list(iterable) \n" "Return a list, optionally based upon the members of 'iterable'." msgstr "" #: mu/modes/api/shared.py:81 msgid "" "locals() \n" "Return a dictionary representing the current local symbol table. I.e. named " "objects\n" "that are currently in the local scope." msgstr "" #: mu/modes/api/shared.py:82 msgid "" "map(function, iterable) \n" "Return an iterator that applies 'function' to every item of 'iterable', " "yielding the results." msgstr "" #: mu/modes/api/shared.py:83 msgid "" "max(items) \n" "Return the largest item in 'items', which can be either an iterable or two " "or more arguments." msgstr "" #: mu/modes/api/shared.py:84 msgid "" "min(items) \n" "Return the smallest item in 'items', which can be either an iterable or two " "or more arguments." msgstr "" #: mu/modes/api/shared.py:85 msgid "" "next(iterator) \n" "Retrieve the next item from the iterator." msgstr "" #: mu/modes/api/shared.py:86 msgid "" "object() \n" "Return a new featureless object." msgstr "" #: mu/modes/api/shared.py:87 msgid "" "oct(x) \n" "Convert an integer number to an octal (base 8) string." msgstr "" #: mu/modes/api/shared.py:88 msgid "" "open(file, mode='rt') \n" "Open 'file' and return a corresponding file object. The 'mode' is an " "optional\n" "string that specifies how the file is opened:\n" "'r' - open for reading\n" "'w' - open for writing\n" "'b' - binary mode\n" "'t' - text mode." msgstr "" #: mu/modes/api/shared.py:89 msgid "" "ord(c) \n" "Given a string representing one Unicode character, return an integer " "representing the Unicode code point of that character." msgstr "" #: mu/modes/api/shared.py:90 msgid "" "pow(x, y, z) \n" "Return 'x' to the power of 'y'. If the optional 'z' is given, return 'x' to " "the power of 'y' modulo 'z' (giving the remainder)." msgstr "" #: mu/modes/api/shared.py:91 msgid "" "print(*objects, sep=' ', end='\\n') \n" "Print objects, separated by 'sep' and followed by 'end'.\n" "All non-keyword arguments are converted to strings." msgstr "" #: mu/modes/api/shared.py:92 msgid "" "range(start, stop, step) \n" "Return an immutable sequence containing items between 'start' and 'stop' " "with 'step' difference between them." msgstr "" #: mu/modes/api/shared.py:93 msgid "" "repr(object) \n" "Return a string containing a printable representation of an 'object'." msgstr "" #: mu/modes/api/shared.py:94 msgid "" "reversed(seq) \n" "Return a reverse iterator of the sequence 'seq'." msgstr "" #: mu/modes/api/shared.py:95 msgid "" "round(number, ndigits) \n" "Return the floating point 'number' rounded to the (optional) 'ndigits'.\n" "If 'ndigits' is omitted, round to the nearest whole number." msgstr "" #: mu/modes/api/shared.py:96 msgid "" "set(iterable) \n" "Return a new set object, optionally containing elements taken from iterable." msgstr "" #: mu/modes/api/shared.py:97 msgid "" "setattr(object, name, value) \n" "Set the 'value' to the attribute called 'name' on object 'object'. 'name' " "must be a string." msgstr "" #: mu/modes/api/shared.py:98 msgid "" "sorted(iterable, key, reverse) \n" "Return a new sorted list from the items in iterable. The optional 'key' " "specifies\n" "a function used for comparison and the optional 'reverse' is a boolean " "indicating the comparison should be reversed." msgstr "" #: mu/modes/api/shared.py:99 msgid "" "staticmethod(function) \n" "Returns a static method for a function. Usually used as a decorator:\n" "\n" "class C:\n" " @staticmethod\n" "def func(): ..." msgstr "" #: mu/modes/api/shared.py:100 msgid "" "str(object) \n" "Return a string version of 'object'." msgstr "" #: mu/modes/api/shared.py:101 msgid "" "sum(iterable, start=0) \n" "Sums 'start' and items of an iterable from left to right and returns the " "total." msgstr "" #: mu/modes/api/shared.py:102 msgid "" "super(type, object-or-type) \n" "Return a proxy object that delegates method calls to a parent or sibling " "class\n" "of 'type'. This is useful for accessing inherited methods that have been\n" "overridden in a class." msgstr "" #: mu/modes/api/shared.py:103 msgid "" "tuple(iterable) \n" "Return an immutable sequence based upon the items in 'iterable'." msgstr "" #: mu/modes/api/shared.py:104 msgid "" "type(object) \n" "Return the type of an object (i.e. what sort of thing it is)." msgstr "" #: mu/modes/api/shared.py:105 msgid "" "zip(*iterables) \n" "Make an iterator that aggregates elements from each of the passed in " "iterables.\n" "For example:\n" "x = [1, 2, 3]\n" "y = [4, 5, 6]\n" "list(zip(x, y))\n" "[(1, 4), (2, 5), (3, 6)]" msgstr "" #: mu/modes/base.py:177 msgid "Data Flood Detected!" msgstr "检测到数据泛滥!" #: mu/modes/base.py:178 msgid "" "The plotter is flooded with data which will make Mu unresponsive and freeze. " "As a safeguard, the plotter has been stopped.\n" "\n" "Flooding is when chunks of data of more than 1024 bytes are repeatedly sent " "to the plotter.\n" "\n" "To fix this, make sure your code prints small tuples of data between calls " "to 'sleep' for a very short period of time." msgstr "" "绘图器已经数据泛滥,这将使 Mu 无响应并卡死。作为一种保护措施,绘图器已经停" "止。\n" "\n" "泛滥是指不停的发送超过 1024 字节的大量数据到绘图器。\n" "\n" "要解决此问题,请确保您的代码在打印小的元组(tuple)数据的间隔中,调用非常短时间" "的“sleep”函数。" #: mu/modes/base.py:273 mu/modes/base.py:312 msgid "" "Click on the device's reset button, wait a few seconds and then try again." msgstr "按一下设备的重置(reset)按钮,等待几秒钟,然后重试。" #: mu/modes/base.py:279 mu/modes/base.py:318 msgid "Could not find an attached device." msgstr "找不到已连接的设备。" #: mu/modes/base.py:280 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the REPL will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "请确保已将设备插入这台电脑。\n" "\n" "在 REPL 工作之前,设备必须有一个 MicroPython 或 CircuitPython 版本的固件已经" "刷入。\n" "\n" "最后,按一下设备的重置(reset)按钮并等待几秒钟后再重试。" #: mu/modes/base.py:319 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "It must have a version of MicroPython (or CircuitPython) flashed onto it " "before the Plotter will work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "请确保已将设备插入这台电脑。\n" "\n" "在绘图器工作之前,设备必须有一个 MicroPython 或 CircuitPython 版本的固件已经" "刷入。\n" "\n" "最后,按一下设备的重置(reset)按钮并等待几秒钟后再重试。" #: mu/modes/debugger.py:35 msgid "Graphical Debugger" msgstr "图形化调试器" #: mu/modes/debugger.py:36 msgid "Debug your Python 3 code." msgstr "调试你的 Python 3 代码。" #: mu/modes/debugger.py:50 mu/modes/pygamezero.py:109 mu/modes/python3.py:166 msgid "Stop" msgstr "停止" #: mu/modes/debugger.py:51 msgid "Stop the running code." msgstr "停止运行代码。" #: mu/modes/debugger.py:57 msgid "Continue" msgstr "继续" #: mu/modes/debugger.py:58 msgid "Continue to run your Python script." msgstr "继续运行你的 Python 脚本。" #: mu/modes/debugger.py:64 msgid "Step Over" msgstr "步进" #: mu/modes/debugger.py:65 msgid "Step over a line of code." msgstr "步进一行代码。" #: mu/modes/debugger.py:71 msgid "Step In" msgstr "步入" #: mu/modes/debugger.py:72 msgid "Step into a function." msgstr "步入一个函数。" #: mu/modes/debugger.py:78 msgid "Step Out" msgstr "步出" #: mu/modes/debugger.py:79 msgid "Step out of a function." msgstr "步出一个函数。" #: mu/modes/debugger.py:156 msgid "Your script has finished running." msgstr "您的脚本已完成运行。" #: mu/modes/debugger.py:224 msgid "" "Unable to connect to the Python debugger.\n" "\n" msgstr "" "无法连接到 Python 调试器。\n" "\n" #: mu/modes/debugger.py:308 msgid "Debugger info: {}" msgstr "调试器信息:{}" #: mu/modes/debugger.py:314 msgid "Debugger warning: {}" msgstr "调试器警告:{}" #: mu/modes/debugger.py:321 msgid "Debugger error: {}" msgstr "调试器错误:{}" #: mu/modes/microbit.py:168 msgid "BBC micro:bit" msgstr "BBC micro:bit" #: mu/modes/microbit.py:169 msgid "Write MicroPython for the BBC micro:bit." msgstr "为 BBC micro:bit 编写 MicroPython 。" #: mu/modes/microbit.py:192 msgid "Flash" msgstr "刷入" #: mu/modes/microbit.py:193 msgid "Flash your code onto the micro:bit." msgstr "将代码刷入到 micro:bit 上。" #: mu/modes/microbit.py:199 msgid "Files" msgstr "文件" #: mu/modes/microbit.py:200 msgid "Access the file system on the micro:bit." msgstr "访问 micro:bit 上的文件系统。" #: mu/modes/microbit.py:206 mu/modes/python3.py:127 msgid "REPL" msgstr "REPL" #: mu/modes/microbit.py:207 msgid "Use the REPL to live-code on the micro:bit." msgstr "使用 REPL 在 micro:bit 上实时编写代码。" #: mu/modes/microbit.py:257 msgid "Unable to flash \"{}\"" msgstr "无法刷入“{}”" #: mu/modes/microbit.py:267 msgid "Problem with script" msgstr "脚本问题" #: mu/modes/microbit.py:268 msgid "{} [{}:{}]" msgstr "{} [{}:{}]" #: mu/modes/microbit.py:278 msgid "Our minifier tried but your script is too long!" msgstr "我们的简化器尝试过了,但你的脚本实在太长!" #: mu/modes/microbit.py:283 msgid "Your script is too long and the minifier isn't available" msgstr "您的脚本太长,简化器不可用" #: mu/modes/microbit.py:288 msgid "Your script is too long!" msgstr "你的脚本太长了!" #: mu/modes/microbit.py:368 msgid "Flashing \"{}\" onto the micro:bit." msgstr "正在将“{}”刷入到 micro:bit 。" #: mu/modes/microbit.py:370 msgid " Runtime: {}" msgstr " 运行时:{}" #: mu/modes/microbit.py:416 msgid "Unsupported BBC micro:bit." msgstr "不支持的 BBC micro:bit 。" #: mu/modes/microbit.py:417 msgid "" "Your device is newer than this version of Mu. Please update Mu to the latest " "version to support this device.\n" "\n" "https://codewith.mu/" msgstr "" "您的设备比此版本的 Mu 更新。 请将 Mu 更新到最新版本以支持此设备。\n" "\n" "https://codewith.mu/" #: mu/modes/microbit.py:474 mu/modes/microbit.py:611 msgid "Could not find an attached BBC micro:bit." msgstr "找不到已连接的 BBC micro:bit 。" #: mu/modes/microbit.py:475 msgid "" "Please ensure you leave enough time for the BBC micro:bit to be attached and " "configured correctly by your computer. This may take several seconds. " "Alternatively, try removing and re-attaching the device or saving your work " "and restarting Mu if the device remains unfound." msgstr "" "请确保您留出了足够的时间让您的计算机正确连接和配置 BBC micro:bit 设备。这可能" "需要几秒钟的时间。 或者您可以尝试保存文件并重新连接设备,如果仍未发现设备,您" "还可以尝试重新启动 Mu 。" #: mu/modes/microbit.py:489 msgid "Finished flashing." msgstr "刷入完成。" #: mu/modes/microbit.py:524 msgid "Copied code onto micro:bit." msgstr "已将代码复制到 micro:bit 。" #: mu/modes/microbit.py:533 msgid "There was a problem flashing the micro:bit." msgstr "刷入程序到 micro:bit 时出现了一个问题。" #: mu/modes/microbit.py:534 msgid "" "Please do not disconnect the device until flashing has completed. Please " "check the logs for more information." msgstr "在刷入完成之前,请不要断开设备。 请查看日志以获取更多信息。" #: mu/modes/microbit.py:555 msgid "REPL and file system cannot work at the same time." msgstr "REPL和文件系统不能同时工作。" #: mu/modes/microbit.py:556 msgid "" "The REPL and file system both use the same USB serial connection. Only one " "can be active at any time. Toggle the file system off and try again." msgstr "" "REPL和文件系统都使用相同的USB串口通讯。任何时候只能使用其中一个功能。请关闭文" "件系统,然后重试。" #: mu/modes/microbit.py:573 msgid "The plotter and file system cannot work at the same time." msgstr "绘图器和文件系统无法同时工作。" #: mu/modes/microbit.py:575 msgid "" "The plotter and file system both use the same USB serial connection. Only " "one can be active at any time. Toggle the file system off and try again." msgstr "" "绘图器和文件系统都使用相同的USB串口通讯。任何时候只能使用其中一个功能。请关闭" "文件系统,然后重试。" #: mu/modes/microbit.py:587 msgid "File system cannot work at the same time as the REPL or plotter." msgstr "文件系统无法与REPL或绘图器同时工作。" #: mu/modes/microbit.py:589 msgid "" "The file system and the REPL and plotter use the same USB serial connection. " "Toggle the REPL and plotter off and try again." msgstr "" "文件系统、REPL、绘图器使用相同的USB串口通讯。 请关闭REPL和绘图器,然后重试。" #: mu/modes/microbit.py:612 msgid "" "Please make sure the device is plugged into this computer.\n" "\n" "The device must have MicroPython flashed onto it before the file system will " "work.\n" "\n" "Finally, press the device's reset button and wait a few seconds before " "trying again." msgstr "" "请确保已将设备插入此计算机。\n" "\n" "在文件系统工作之前,设备必须已输入MicroPython。\n" "\n" "最后,按设备的重置(reset)按钮并等待几秒钟后再重试。" #: mu/modes/pygamezero.py:35 msgid "Pygame Zero" msgstr "Pygame Zero" #: mu/modes/pygamezero.py:36 msgid "Make games with Pygame Zero." msgstr "用 Pygame Zero 做游戏。" #: mu/modes/pygamezero.py:51 mu/modes/pygamezero.py:101 msgid "Play" msgstr "开始" #: mu/modes/pygamezero.py:52 mu/modes/pygamezero.py:102 msgid "Play your Pygame Zero game." msgstr "开始你的 Pygame Zero 游戏。" #: mu/modes/pygamezero.py:58 msgid "Images" msgstr "图片" #: mu/modes/pygamezero.py:59 msgid "Show the images used by Pygame Zero." msgstr "显示 Pygame Zero 使用的图片。" #: mu/modes/pygamezero.py:65 msgid "Fonts" msgstr "字体" #: mu/modes/pygamezero.py:66 msgid "Show the fonts used by Pygame Zero." msgstr "显示 Pygame Zero 使用的字体。" #: mu/modes/pygamezero.py:72 msgid "Sounds" msgstr "音效" #: mu/modes/pygamezero.py:73 msgid "Show the sounds used by Pygame Zero." msgstr "显示 Pygame Zero 使用的音效。" #: mu/modes/pygamezero.py:79 msgid "Music" msgstr "音乐" #: mu/modes/pygamezero.py:80 msgid "Show the music used by Pygame Zero." msgstr "显示 Pygame Zero 使用的音乐。" #: mu/modes/pygamezero.py:110 msgid "Stop your Pygame Zero game." msgstr "停止你的 Pygame Zero 游戏。" #: mu/modes/python3.py:97 msgid "Python 3" msgstr "Python 3" #: mu/modes/python3.py:98 msgid "Create code using standard Python 3." msgstr "使用标准 Python 3 编写代码。" #: mu/modes/python3.py:113 mu/modes/python3.py:158 msgid "Run" msgstr "运行" #: mu/modes/python3.py:114 mu/modes/python3.py:159 msgid "Run your Python script." msgstr "运行你的 Python 脚本。" #: mu/modes/python3.py:120 msgid "Debug" msgstr "调试" #: mu/modes/python3.py:121 msgid "Debug your Python script." msgstr "调试你的 Python 脚本。" #: mu/modes/python3.py:128 msgid "Use the REPL for live coding." msgstr "用 REPL 进行实时编程。" #: mu/modes/python3.py:137 msgid "Plot data from your script or the REPL." msgstr "从你的脚本或 REPL 的绘制数据。" #: mu/modes/python3.py:167 msgid "Stop your Python script." msgstr "停止你的 Python 脚本。" #: mu/modes/python3.py:230 msgid "Starting iPython REPL." msgstr "正在启动 iPython REPL 。" #: mu/modes/python3.py:234 msgid "Stopping iPython REPL (this may take a short amount of time)." msgstr "正在停止 iPython REPL (可能需要一点点时间)。" #: mu/modes/python3.py:319 msgid "REPL started." msgstr "REPL 已启动。" #: mu/modes/python3.py:328 msgid "REPL stopped." msgstr "REPL 已停止。" mu-editor-1.0.2+dfsg/mu/localedetect.py000066400000000000000000000043411341747546300200010ustar00rootroot00000000000000""" Language detection. Uses the standard library's `locale` module on all platforms, including Windows and Linux, except on macOS where a shell based command is used instead. """ import locale import logging import subprocess import sys _DEFAULT_LANG_CODE = 'en_GB' _logger = logging.getLogger(__name__) def language_code(): """ Returns the user's environment language as a language code string. (examples: 'en_GB', 'en_US', 'pt_PT', 'pt_BR', etc.) """ # Systems running macOS need to use platform specific language detection. this_is_a_mac = sys.platform == 'darwin' try: lang_code = _lang_code_mac() if this_is_a_mac else _lang_code_generic() except Exception: lang_code = _DEFAULT_LANG_CODE _logger.warning('Language detection failed. Using %r', lang_code, exc_info=True) else: if not lang_code: lang_code = _DEFAULT_LANG_CODE _logger.warning('No language detected. Using %r', lang_code) return lang_code def _lang_code_generic(): """ Returns the user's language preference on the Windows and Linux plaforms, using the standard library's `locale` module. """ lang_code, _encoding = locale.getdefaultlocale() return lang_code def _lang_code_mac(): """ Returns the user's language preference as defined in the Language & Region preference pane in macOS's System Preferences. """ # Uses the shell command `defaults read -g AppleLocale` that prints out a # language code to standard output. Assumptions about the command: # - It exists and is in the shell's PATH. # - It accepts those arguments. # - It returns a usable language code. # # Reference documentation: # - The man page for the `defaults` command on macOS. # - The macOS underlying API: # https://developer.apple.com/documentation/foundation/nsuserdefaults. LANG_DETECT_COMMAND = 'defaults read -g AppleLocale' status, output = subprocess.getstatusoutput(LANG_DETECT_COMMAND) if status == 0: # Command was successful. lang_code = output else: _logger.warning('Language detection command failed: %r', output) lang_code = '' return lang_code mu-editor-1.0.2+dfsg/mu/logic.py000066400000000000000000001553231341747546300164550ustar00rootroot00000000000000""" Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). Based upon work done for Puppy IDE by Dan Pope, Nicholas Tollervey and Damien George. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import os import sys import codecs import io import re import json import logging import tempfile import platform import webbrowser import random import locale import shutil import appdirs import site from PyQt5.QtWidgets import QMessageBox from pyflakes.api import check from pycodestyle import StyleGuide, Checker from . import localedetect from mu.resources import path from mu.debugger.utils import is_breakpoint_line from mu import __version__ # The user's home directory. HOME_DIRECTORY = os.path.expanduser('~') # Name of the directory within the home folder to use by default WORKSPACE_NAME = 'mu_code' # The default directory for application data (i.e., configuration). DATA_DIR = appdirs.user_data_dir(appname='mu', appauthor='python') # The default directory for application logs. LOG_DIR = appdirs.user_log_dir(appname='mu', appauthor='python') # The path to the log file for the application. LOG_FILE = os.path.join(LOG_DIR, 'mu.log') # Regex to match pycodestyle (PEP8) output. STYLE_REGEX = re.compile(r'.*:(\d+):(\d+):\s+(.*)') # Regex to match flake8 output. FLAKE_REGEX = re.compile(r'.*:(\d+):\s+(.*)') # Regex to match false positive flake errors if microbit.* is expanded. EXPAND_FALSE_POSITIVE = re.compile(r"^'microbit\.(\w+)' imported but unused$") # The text to which "from microbit import \*" should be expanded. EXPANDED_IMPORT = ("from microbit import pin15, pin2, pin0, pin1, " " pin3, pin6, pin4, i2c, pin5, pin7, pin8, Image, " "pin9, pin14, pin16, reset, pin19, temperature, " "sleep, pin20, button_a, button_b, running_time, " "accelerometer, display, uart, spi, panic, pin13, " "pin12, pin11, pin10, compass") # Port number for debugger. DEBUGGER_PORT = 31415 MOTD = [ # Candidate phrases for the message of the day (MOTD). _('Hello, World!'), _("This editor is free software written in Python. You can modify it, " "add features or fix bugs if you like."), _("This editor is called Mu (you say it 'mew' or 'moo')."), _("Google, Facebook, NASA, Pixar, Disney and many more use Python."), _("Programming is a form of magic. Learn to cast the right spells with " "code and you'll be a wizard."), _("REPL stands for read, evaluate, print, loop. It's a fun way to talk to " "your computer! :-)"), _('Be brave, break things, learn and have fun!'), _("Make your software both useful AND fun. Empower your users."), _('For the Zen of Python: import this'), _('Diversity promotes creativity.'), _("An open mind, spirit of adventure and respect for diversity are key."), _("Don't worry if it doesn't work. Learn the lesson, fix it and try " "again! :-)"), _("Coding is collaboration."), _("Compliment and amplify the good things with code."), _("In theory, theory and practice are the same. In practice, they're " "not. ;-)"), _("Debugging is twice as hard as writing the code in the first place."), _("It's fun to program."), _("Programming has more to do with problem solving than writing code."), _("Start with your users' needs."), _("Try to see things from your users' point of view."), _("Put yourself in your users' shoes."), _("Explaining a programming problem to a friend often reveals the " "solution. :-)"), _("If you don't know, ask. Nobody to ask? Just look it up."), _("Complexity is the enemy. KISS - keep it simple, stupid!"), _("Beautiful is better than ugly."), _("Explicit is better than implicit."), _("Simple is better than complex. Complex is better than complicated."), _("Flat is better than nested."), _("Sparse is better than dense."), _("Readability counts."), _("Special cases aren't special enough to break the rules. " "Although practicality beats purity."), _("Errors should never pass silently. Unless explicitly silenced."), _("In the face of ambiguity, refuse the temptation to guess."), _("There should be one-- and preferably only one --obvious way to do it."), _("Now is better than never. Although never is often better than " "*right* now."), _("If the implementation is hard to explain, it's a bad idea."), _("If the implementation is easy to explain, it may be a good idea."), _("Namespaces are one honking great idea -- let's do more of those!"), _("Mu was created by Nicholas H.Tollervey."), _("To understand what recursion is, you must first understand recursion."), _("Algorithm: a word used by programmers when they don't want to explain " "what they did."), _("Programmers count from zero."), _("Simplicity is the ultimate sophistication."), _("A good programmer is humble."), _("A good programmer is playful."), _("A good programmer learns to learn."), _("A good programmer thinks beyond the obvious."), _("A good programmer promotes simplicity."), _("A good programmer avoids complexity."), _("A good programmer is patient."), _("A good programmer asks questions."), _("A good programmer is willing to say, 'I don't know'."), _("Wisest are they that know they know nothing."), ] NEWLINE = "\n" # # We write all files as UTF-8 unless they arrived with a PEP 263 encoding # cookie, in which case we honour that encoding. # ENCODING = "utf-8" ENCODING_COOKIE_RE = re.compile( "^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)") logger = logging.getLogger(__name__) def write_and_flush(fileobj, content): """ Write content to the fileobj then flush and fsync to ensure the data is, in fact, written. This is especially necessary for USB-attached devices """ fileobj.write(content) fileobj.flush() # # Theoretically this shouldn't work; fsync takes a file descriptor, # not a file object. However, there's obviously some under-the-cover # mechanism which converts one to the other (at least on Windows) # os.fsync(fileobj) def save_and_encode(text, filepath, newline=os.linesep): """ Detect the presence of an encoding cookie and use that encoding; if none is present, do not add one and use the Mu default encoding. If the codec is invalid, log a warning and fall back to the default. """ match = ENCODING_COOKIE_RE.match(text) if match: encoding = match.group(1) try: codecs.lookup(encoding) except LookupError: logger.warning("Invalid codec in encoding cookie: %s", encoding) encoding = ENCODING else: encoding = ENCODING with open(filepath, "w", encoding=encoding, newline='') as f: text_to_write = newline.join(l.rstrip(" ") for l in text.splitlines()) write_and_flush(f, text_to_write) def sniff_encoding(filepath): """Determine the encoding of a file: * If there is a BOM, return the appropriate encoding * If there is a PEP 263 encoding cookie, return the appropriate encoding * Otherwise return None for read_and_decode to attempt several defaults """ boms = [ (codecs.BOM_UTF8, "utf-8-sig"), (codecs.BOM_UTF16_BE, "utf-16"), (codecs.BOM_UTF16_LE, "utf-16"), ] # # Try for a BOM # with open(filepath, "rb") as f: line = f.readline() for bom, encoding in boms: if line.startswith(bom): return encoding # # Look for a PEP 263 encoding cookie # default_encoding = locale.getpreferredencoding() try: uline = line.decode(default_encoding) except UnicodeDecodeError: # # Can't even decode the line in order to match the cookie # pass else: match = ENCODING_COOKIE_RE.match(uline) if match: return match.group(1) # # Fall back to the locale default # return None def sniff_newline_convention(text): """Determine which line-ending convention predominates in the text. Windows usually has U+000D U+000A Posix usually has U+000A But editors can produce either convention from either platform. And a file which has been copied and edited around might even have both! """ candidates = [ ("\r\n", "\r\n"), # Match \n at the start of the string # or \n preceded by any character other than \r ("\n", "^\n|[^\r]\n") ] # # If no lines are present, default to the platform newline # If there's a tie, use the platform default # conventions_found = [(0, 1, os.linesep)] for candidate, pattern in candidates: instances = re.findall(pattern, text) convention = (len(instances), candidate == os.linesep, candidate) conventions_found.append(convention) majority_convention = max(conventions_found) return majority_convention[-1] def read_and_decode(filepath): """ Read the contents of a file, """ sniffed_encoding = sniff_encoding(filepath) # # If sniff_encoding has found enough clues to indicate an encoding, # use that. Otherwise try a series of defaults before giving up. # if sniffed_encoding: logger.debug("Detected encoding %s", sniffed_encoding) candidate_encodings = [sniffed_encoding] else: candidate_encodings = [ENCODING, locale.getpreferredencoding()] with open(filepath, "rb") as f: btext = f.read() for encoding in candidate_encodings: logger.debug("Trying to decode with %s", encoding) try: text = btext.decode(encoding) logger.info("Decoded with %s", encoding) break except UnicodeDecodeError: continue else: raise UnicodeDecodeError(encoding, btext, 0, 0, "Unable to decode") # # Sniff and convert newlines here so that, by the time # the text reaches the editor it is ready to use. Then # convert everything to the Mu internal newline character # newline = sniff_newline_convention(text) logger.debug("Detected newline %r", newline) text = re.sub("\r\n", NEWLINE, text) return text, newline def get_admin_file_path(filename): """ Given an admin related filename, this function will attempt to get the most relevant version of this file (the default location is the application data directory, although a file of the same name in the same directory as the application itself takes preference). If this file isn't found, an empty one is created in the default location. """ # App location depends on being interpreted by normal Python or bundled app_path = sys.executable if getattr(sys, 'frozen', False) else sys.argv[0] app_dir = os.path.dirname(os.path.abspath(app_path)) # The os x bundled application is placed 3 levels deep in the .app folder if platform.system() == 'Darwin' and getattr(sys, 'frozen', False): app_dir = os.path.dirname(os.path.dirname(os.path.dirname(app_dir))) file_path = os.path.join(app_dir, filename) if not os.path.exists(file_path): file_path = os.path.join(DATA_DIR, filename) if not os.path.exists(file_path): try: with open(file_path, 'w') as f: logger.debug('Creating admin file: {}'.format( file_path)) json.dump({}, f) except FileNotFoundError: logger.error('Unable to create admin file: {}'.format( file_path)) return file_path def get_session_path(): """ The session file stores details about the state of Mu from the user's perspective (tabs open, current mode etc...). The session file default location is the application data directory. However, a session file in the same directory as the application itself takes preference. If no session file is detected a blank one in the default location is automatically created. """ return get_admin_file_path('session.json') def get_settings_path(): """ The settings file stores details about the configuration of Mu from an administrators' perspective (default workspace etc...). The settings file default location is the application data directory. However, a settings file in the same directory as the application itself takes preference. If no settings file is detected a blank one in the default location is automatically created. """ return get_admin_file_path('settings.json') def extract_envars(raw): """ Returns a list of environment variables given a string containing NAME=VALUE definitions on separate lines. """ result = [] for line in raw.split('\n'): definition = line.split('=', 1) if len(definition) == 2: result.append([definition[0].strip(), definition[1].strip()]) return result def check_flake(filename, code, builtins=None): """ Given a filename and some code to be checked, uses the PyFlakesmodule to return a dictionary describing issues of code quality per line. See: https://github.com/PyCQA/pyflakes If a list symbols is passed in as "builtins" these are assumed to be additional builtins available when run by Mu. """ import_all = "from microbit import *" in code if import_all: # Massage code so "from microbit import *" is expanded so the symbols # are known to flake. code = code.replace("from microbit import *", EXPANDED_IMPORT) reporter = MuFlakeCodeReporter() check(code, filename, reporter) if builtins: builtins_regex = re.compile(r"^undefined name '(" + '|'.join(builtins) + r")'") feedback = {} for log in reporter.log: if import_all: # Guard to stop unwanted "microbit.* imported but unused" messages. message = log['message'] if EXPAND_FALSE_POSITIVE.match(message): continue if builtins: if builtins_regex.match(log['message']): continue if log['line_no'] not in feedback: feedback[log['line_no']] = [] feedback[log['line_no']].append(log) return feedback def check_pycodestyle(code): """ Given some code, uses the PyCodeStyle module (was PEP8) to return a list of items describing issues of coding style. See: https://pycodestyle.readthedocs.io/en/latest/intro.html """ # PyCodeStyle reads input from files, so make a temporary file containing # the code. code_fd, code_filename = tempfile.mkstemp() os.close(code_fd) save_and_encode(code, code_filename) # Configure which PEP8 rules to ignore. ignore = ('E121', 'E123', 'E126', 'E226', 'E302', 'E305', 'E24', 'E704', 'W291', 'W292', 'W293', 'W391', 'W503', ) style = StyleGuide(parse_argv=False, config_file=False) style.options.ignore = ignore checker = Checker(code_filename, options=style.options) # Re-route stdout to a temporary buffer to be parsed below. temp_out = io.StringIO() sys.stdout = temp_out # Check the code. checker.check_all() # Put stdout back and read the content of the buffer. Remove the temporary # file created at the start. sys.stdout = sys.__stdout__ temp_out.seek(0) results = temp_out.read() temp_out.close() os.remove(code_filename) # Parse the output from the tool into a dictionary of structured data. style_feedback = {} for result in results.split('\n'): matcher = STYLE_REGEX.match(result) if matcher: line_no, col, msg = matcher.groups() line_no = int(line_no) - 1 code, description = msg.split(' ', 1) if code == 'E303': description += _(' above this line') if line_no not in style_feedback: style_feedback[line_no] = [] style_feedback[line_no].append({ 'line_no': line_no, 'column': int(col) - 1, 'message': description.capitalize(), 'code': code, }) return style_feedback class MuFlakeCodeReporter: """ The class instantiates a reporter that creates structured data about code quality for Mu. Used by the PyFlakes module. """ def __init__(self): """ Set up the reporter object to be used to report PyFlake's results. """ self.log = [] def unexpectedError(self, filename, message): """ Called if an unexpected error occured while trying to process the file called filename. The message parameter contains a description of the problem. """ self.log.append({ 'line_no': 0, 'filename': filename, 'message': str(message) }) def syntaxError(self, filename, message, line_no, column, source): """ Records a syntax error in the file called filename. The message argument contains an explanation of the syntax error, line_no indicates the line where the syntax error occurred, column indicates the column on which the error occurred and source is the source code containing the syntax error. """ msg = _('Syntax error. Python cannot understand this line. Check for ' 'missing characters!') self.log.append({ 'message': msg, 'line_no': int(line_no) - 1, # Zero based counting in Mu. 'column': column - 1, 'source': source }) def flake(self, message): """ PyFlakes found something wrong with the code. """ matcher = FLAKE_REGEX.match(str(message)) if matcher: line_no, msg = matcher.groups() self.log.append({ 'line_no': int(line_no) - 1, # Zero based counting in Mu. 'column': 0, 'message': msg, }) else: self.log.append({ 'line_no': 0, 'column': 0, 'message': str(message), }) class REPL: """ Read, Evaluate, Print, Loop. Represents the REPL. Since the logic for the REPL is simply a USB/serial based widget this class only contains a reference to the associated port. """ def __init__(self, port): if os.name == 'posix': # If we're on Linux or OSX reference the port is like this... self.port = "/dev/{}".format(port) elif os.name == 'nt': # On Windows simply return the port (e.g. COM0). self.port = port else: # No idea how to deal with other OS's so fail. raise NotImplementedError('OS not supported.') logger.info('Created new REPL object with port: {}'.format(self.port)) class Editor: """ Application logic for the editor itself. """ def __init__(self, view, status_bar=None): logger.info('Setting up editor.') self._view = view self._status_bar = status_bar self.fs = None self.theme = 'day' self.mode = 'python' self.modes = {} # See set_modes. self.envars = [] # See restore session and show_admin self.minify = False self.microbit_runtime = '' self.connected_devices = set() self.find = '' self.replace = '' self.current_path = '' # Directory of last loaded file. self.global_replace = False self.selecting_mode = False # Flag to stop auto-detection of modes. if not os.path.exists(DATA_DIR): logger.debug('Creating directory: {}'.format(DATA_DIR)) os.makedirs(DATA_DIR) logger.info('Settings path: {}'.format(get_settings_path())) logger.info('Session path: {}'.format(get_session_path())) logger.info('Log directory: {}'.format(LOG_DIR)) logger.info('Data directory: {}'.format(DATA_DIR)) @view.open_file.connect def on_open_file(file): # Open the file self.direct_load(file) def setup(self, modes): """ Define the available modes and ensure there's a default working directory. """ self.modes = modes logger.info('Available modes: {}'.format(', '.join(self.modes.keys()))) # Ensure there is a workspace directory. wd = self.modes['python'].workspace_dir() if not os.path.exists(wd): logger.debug('Creating directory: {}'.format(wd)) os.makedirs(wd) # Ensure PyGameZero assets are copied over. images_path = os.path.join(wd, 'images') fonts_path = os.path.join(wd, 'fonts') sounds_path = os.path.join(wd, 'sounds') music_path = os.path.join(wd, 'music') if not os.path.exists(images_path): logger.debug('Creating directory: {}'.format(images_path)) os.makedirs(images_path) shutil.copy(path('alien.png', 'pygamezero/'), os.path.join(images_path, 'alien.png')) shutil.copy(path('alien_hurt.png', 'pygamezero/'), os.path.join(images_path, 'alien_hurt.png')) if not os.path.exists(fonts_path): logger.debug('Creating directory: {}'.format(fonts_path)) os.makedirs(fonts_path) if not os.path.exists(sounds_path): logger.debug('Creating directory: {}'.format(sounds_path)) os.makedirs(sounds_path) shutil.copy(path('eep.wav', 'pygamezero/'), os.path.join(sounds_path, 'eep.wav')) if not os.path.exists(music_path): logger.debug('Creating directory: {}'.format(music_path)) os.makedirs(music_path) # Start the timer to poll every second for an attached or removed # USB device. self._view.set_usb_checker(1, self.check_usb) def restore_session(self, paths=None): """ Attempts to recreate the tab state from the last time the editor was run. If paths contains a collection of additional paths specified by the user, they are also "restored" at the same time (duplicates will be ignored). """ settings_path = get_session_path() self.change_mode(self.mode) with open(settings_path) as f: try: old_session = json.load(f) except ValueError: logger.error('Settings file {} could not be parsed.'.format( settings_path)) else: logger.info('Restoring session from: {}'.format(settings_path)) logger.debug(old_session) if 'theme' in old_session: self.theme = old_session['theme'] if 'mode' in old_session: old_mode = old_session['mode'] if old_mode in self.modes: self.mode = old_session['mode'] else: # Unknown mode (perhaps an old version?) self.select_mode(None) else: # So ask for the desired mode. self.select_mode(None) if 'paths' in old_session: old_paths = self._abspath(old_session['paths']) launch_paths = self._abspath(paths) if paths else set() for old_path in old_paths: # if the os passed in a file, defer loading it now if old_path in launch_paths: continue self.direct_load(old_path) logger.info('Loaded files.') if 'envars' in old_session: self.envars = old_session['envars'] logger.info('User defined environment variables: ' '{}'.format(self.envars)) if 'minify' in old_session: self.minify = old_session['minify'] logger.info('Minify scripts on micro:bit? ' '{}'.format(self.minify)) if 'microbit_runtime' in old_session: self.microbit_runtime = old_session['microbit_runtime'] if self.microbit_runtime: logger.info('Custom micro:bit runtime path: ' '{}'.format(self.microbit_runtime)) if not os.path.isfile(self.microbit_runtime): self.microbit_runtime = '' logger.warning('The specified micro:bit runtime ' 'does not exist. Using default ' 'runtime instead.') if 'zoom_level' in old_session: self._view.zoom_position = old_session['zoom_level'] self._view.set_zoom() # handle os passed file last, # so it will not be focused over by another tab if paths and len(paths) > 0: self.load_cli(paths) if not self._view.tab_count: py = _('# Write your code here :-)') + NEWLINE tab = self._view.add_tab(None, py, self.modes[self.mode].api(), NEWLINE) tab.setCursorPosition(len(py.split(NEWLINE)), 0) logger.info('Starting with blank file.') self.change_mode(self.mode) self._view.set_theme(self.theme) self.show_status_message(random.choice(MOTD), 10) def toggle_theme(self): """ Switches between themes (night, day or high-contrast). """ if self.theme == 'day': self.theme = 'night' elif self.theme == 'night': self.theme = 'contrast' else: self.theme = 'day' logger.info('Toggle theme to: {}'.format(self.theme)) self._view.set_theme(self.theme) def new(self): """ Adds a new tab to the editor. """ logger.info('Added a new tab.') self._view.add_tab(None, '', self.modes[self.mode].api(), NEWLINE) def _load(self, path): """ Attempt to load a Python script from the passed in path. This path may be a .py file containing Python source code, or a .hex file, created for a micro:bit like device, with the source code embedded therein. This method will work its way around duplicate paths and also attempt to cleanly handle / report / log errors when encountered in a helpful manner. """ logger.info('Loading script from: {}'.format(path)) error = _("The file contains characters Mu expects to be encoded as " "{0} or as the computer's default encoding {1}, but which " "are encoded in some other way.\n\nIf this file was saved " "in another application, re-save the file via the " "'Save as' option and set the encoding to {0}") error = error.format(ENCODING, locale.getpreferredencoding()) # Does the file even exist? if not os.path.isfile(path): logger.info('The file {} does not exist.'.format(path)) return # see if file is open first for widget in self._view.widgets: if widget.path is None: # this widget is an unsaved buffer continue if os.path.samefile(path, widget.path): logger.info('Script already open.') msg = _('The file "{}" is already open.') self._view.show_message(msg.format(os.path.basename(path))) self._view.focus_tab(widget) return name, text, newline, file_mode = None, None, None, None try: if path.lower().endswith('.py'): # Open the file, read the textual content and set the name as # the path to the file. try: text, newline = read_and_decode(path) except UnicodeDecodeError: message = _("Mu cannot read the characters in {}") filename = os.path.basename(path) self._view.show_message(message.format(filename), error) return name = path else: # Delegate the open operation to the Mu modes. Leave the name # as None, thus forcing the user to work out what to name the # recovered script. for mode_name, mode in self.modes.items(): try: text = mode.open_file(path) except Exception as exc: # No worries, log it and try the next mode logger.warning('Error when mode {} try to open the ' '{} file.'.format(mode_name, path), exc_info=exc) else: if text: newline = sniff_newline_convention(text) file_mode = mode_name break else: message = _('Mu was not able to open this file') info = _('Currently Mu only works with Python source ' 'files or hex files created with embedded ' 'MicroPython code.') self._view.show_message(message, info) return except OSError: message = _("Could not load {}").format(path) logger.exception('Could not load {}'.format(path)) info = _("Does this file exist?\nIf it does, do you have " "permission to read it?\n\nPlease check and try again.") self._view.show_message(message, info) else: if file_mode and self.mode != file_mode: device_name = self.modes[file_mode].name message = _('Is this a {} file?').format(device_name) info = _('It looks like this could be a {} file.\n\n' 'Would you like to change Mu to the {}' 'mode?').format(device_name, device_name) if self._view.show_confirmation( message, info, icon='Question') == QMessageBox.Ok: self.change_mode(file_mode) logger.debug(text) self._view.add_tab( name, text, self.modes[self.mode].api(), newline) def get_dialog_directory(self): """ Return the directory folder in which a load/save dialog box should open into. In order of precedence this function will return: 1) The last location used by a load/save dialog. 2) The directory containing the current file. 3) The mode's reported workspace directory. """ if self.current_path and os.path.isdir(self.current_path): folder = self.current_path else: current_file_path = '' workspace_path = self.modes[self.mode].workspace_dir() tab = self._view.current_tab if tab and tab.path: current_file_path = os.path.dirname(os.path.abspath(tab.path)) folder = current_file_path if current_file_path else workspace_path logger.info('Using path for file dialog: {}'.format(folder)) return folder def load(self): """ Loads a Python file from the file system or extracts a Python script from a hex file. """ # Get all supported extensions from the different modes extensions = ['py'] for mode_name, mode in self.modes.items(): if mode.file_extensions: extensions += mode.file_extensions extensions = set([e.lower() for e in extensions]) extensions = '*.{} *.{}'.format(' *.'.join(extensions), ' *.'.join(extensions).upper()) folder = self.get_dialog_directory() path = self._view.get_load_path(folder, extensions) if path: self.current_path = os.path.dirname(os.path.abspath(path)) self._load(path) def direct_load(self, path): """ for loading files passed from command line or the OS launch""" self._load(path) def load_cli(self, paths): """ Given a set of paths, passed in by the user when Mu starts, this method will attempt to load them and log / report a problem if Mu is unable to open a passed in path. """ for p in paths: try: logger.info('Passed-in filename: {}'.format(p)) # abspath will fail for non-paths self.direct_load(os.path.abspath(p)) except Exception as e: logging.warning('Can\'t open file from command line {}'. format(p), exc_info=e) def _abspath(self, paths): """ Safely convert an arrary of paths to their absolute forms and remove duplicate items. """ result = set() for p in paths: try: result.add(os.path.abspath(p)) except Exception as ex: logger.error('Could not get path for {}: {}'.format(p, ex)) return result def save_tab_to_file(self, tab): """ Given a tab, will attempt to save the script in the tab to the path associated with the tab. If there's a problem this will be logged and reported and the tab status will continue to show as Modified. """ logger.info('Saving script to: {}'.format(tab.path)) logger.debug(tab.text()) try: save_and_encode(tab.text(), tab.path, tab.newline) except OSError as e: logger.error(e) error_message = _('Could not save file (disk problem)') information = _("Error saving file to disk. Ensure you have " "permission to write the file and " "sufficient disk space.") except UnicodeEncodeError: error_message = _("Could not save file (encoding problem)") logger.exception(error_message) information = _("Unable to convert all the characters. If you " "have an encoding line at the top of the file, " "remove it and try again.") else: error_message = information = None if error_message: self._view.show_message(error_message, information) else: tab.setModified(False) self.show_status_message(_("Saved file: {}").format(tab.path)) def check_for_shadow_module(self, path): """ Check if the filename in the path is a shadow of a module already in the Python path. For example, many learners will save their first turtle based script as turtle.py, thus causing Python to never find the built in turtle module because of the name conflict. If the filename shadows an existing module, return True, otherwise, return False. """ logger.info('Checking path "{}" for shadow module.'.format(path)) filename = os.path.basename(path).replace('.py', '') return filename in self.modes[self.mode].module_names def save(self): """ Save the content of the currently active editor tab. """ tab = self._view.current_tab if tab is None: # There is no active text editor so abort. return if not tab.path: # Unsaved file. folder = self.get_dialog_directory() path = self._view.get_save_path(folder) if path and self.check_for_shadow_module(path): message = _('You cannot use the filename ' '"{}"').format(os.path.basename(path)) info = _('This name is already used by another part of ' 'Python. If you use this name, things are ' 'likely to break. Please try again with a ' 'different filename.') self._view.show_message(message, info) return tab.path = path if tab.path: # The user specified a path to a file. if os.path.splitext(tab.path)[1] == '': # the user didn't specify an extension, default to .py tab.path += '.py' self.save_tab_to_file(tab) else: # The user cancelled the filename selection. tab.path = None def get_tab(self, path): """ Given a path, returns either an existing tab for the path or creates / loads a new tab for the path. """ normalised_path = os.path.normcase(os.path.abspath(path)) for tab in self._view.widgets: if tab.path: tab_path = os.path.normcase(os.path.abspath(tab.path)) if tab_path == normalised_path: self._view.focus_tab(tab) return tab self.direct_load(path) return self._view.current_tab def zoom_in(self): """ Make the editor's text bigger """ logger.info('Zoom in') self._view.zoom_in() def zoom_out(self): """ Make the editor's text smaller. """ logger.info('Zoom out') self._view.zoom_out() def check_code(self): """ Uses PyFlakes and PyCodeStyle to gather information about potential problems with the code in the current tab. """ tab = self._view.current_tab if tab is None: # There is no active text editor so abort. return tab.has_annotations = not tab.has_annotations if tab.has_annotations: logger.info('Checking code.') self._view.reset_annotations() filename = tab.path if tab.path else _('untitled') builtins = self.modes[self.mode].builtins flake = check_flake(filename, tab.text(), builtins) if flake: logger.info(flake) self._view.annotate_code(flake, 'error') pep8 = check_pycodestyle(tab.text()) if pep8: logger.info(pep8) self._view.annotate_code(pep8, 'style') self._view.show_annotations() tab.has_annotations = bool(flake or pep8) if not tab.has_annotations: # No problems detected, so confirm this with a friendly # message. ok_messages = [ _('Good job! No problems found.'), _('Hurrah! Checker turned up no problems.'), _('Nice one! Zero problems detected.'), _('Well done! No problems here.'), _('Awesome! Zero problems found.'), ] self.show_status_message(random.choice(ok_messages)) else: self._view.reset_annotations() def show_help(self): """ Display browser based help about Mu. """ language_code = localedetect.language_code()[:2] major_version = '.'.join(__version__.split('.')[:2]) url = 'https://codewith.mu/{}/help/{}'.format(language_code, major_version) logger.info('Showing help at %r.', url) webbrowser.open_new(url) def quit(self, *args, **kwargs): """ Exit the application. """ if self._view.modified: # Alert the user to handle unsaved work. msg = _('There is un-saved work, exiting the application will' ' cause you to lose it.') result = self._view.show_confirmation(msg) if result == QMessageBox.Cancel: if args and hasattr(args[0], 'ignore'): # The function is handling an event, so ignore it. args[0].ignore() return paths = [] for widget in self._view.widgets: if widget.path: paths.append(os.path.abspath(widget.path)) if self.modes[self.mode].is_debugger: # If quitting while debugging, make sure everything is cleaned # up. self.modes[self.mode].stop() session = { 'theme': self.theme, 'mode': self.mode, 'paths': paths, 'envars': self.envars, 'minify': self.minify, 'microbit_runtime': self.microbit_runtime, 'zoom_level': self._view.zoom_position, } session_path = get_session_path() with open(session_path, 'w') as out: logger.debug('Session: {}'.format(session)) logger.debug('Saving session to: {}'.format(session_path)) json.dump(session, out, indent=2) # Clean up temporary mu.pth file if needed (Windows only). if sys.platform == 'win32' and 'pythonw.exe' in sys.executable: if site.ENABLE_USER_SITE: site_path = site.USER_SITE path_file = os.path.join(site_path, 'mu.pth') if os.path.exists(path_file): try: os.remove(path_file) logger.info('{} removed.'.format(path_file)) except Exception as ex: logger.error('Unable to delete {}'.format(path_file)) logger.error(ex) logger.info('Quitting.\n\n') sys.exit(0) def show_admin(self, event=None): """ Cause the editor's admin dialog to be displayed to the user. Ensure any changes to the envars is updated. """ logger.info('Showing logs from {}'.format(LOG_FILE)) envars = '\n'.join(['{}={}'.format(name, value) for name, value in self.envars]) settings = { 'envars': envars, 'minify': self.minify, 'microbit_runtime': self.microbit_runtime, } with open(LOG_FILE, 'r', encoding='utf8') as logfile: new_settings = self._view.show_admin(logfile.read(), settings) self.envars = extract_envars(new_settings['envars']) self.minify = new_settings['minify'] runtime = new_settings['microbit_runtime'].strip() if runtime and not os.path.isfile(runtime): self.microbit_runtime = '' message = _('Could not find MicroPython runtime.') information = _("The micro:bit runtime you specified ('{}') " "does not exist. " "Please try again.").format(runtime) self._view.show_message(message, information) else: self.microbit_runtime = runtime def select_mode(self, event=None): """ Select the mode that editor is supposed to be in. """ if self.modes[self.mode].is_debugger: return logger.info('Showing available modes: {}'.format( list(self.modes.keys()))) self.selecting_mode = True # Flag to stop auto-detection of modes. new_mode = self._view.select_mode(self.modes, self.mode) self.selecting_mode = False if new_mode and new_mode != self.mode: logger.info('New mode selected: {}'.format(new_mode)) self.change_mode(new_mode) def change_mode(self, mode): """ Given the name of a mode, will make the necessary changes to put the editor into the new mode. """ # Remove the old mode's REPL / filesystem / plotter if required. old_mode = self.modes[self.mode] if hasattr(old_mode, 'remove_repl'): old_mode.remove_repl() if hasattr(old_mode, 'remove_fs'): old_mode.remove_fs() if hasattr(old_mode, 'remove_plotter'): if old_mode.plotter: old_mode.remove_plotter() # Re-assign to new mode. self.mode = mode # Update buttons. self._view.change_mode(self.modes[mode]) button_bar = self._view.button_bar button_bar.connect('modes', self.select_mode, 'Ctrl+Shift+M') button_bar.connect("new", self.new, "Ctrl+N") button_bar.connect("load", self.load, "Ctrl+O") button_bar.connect("save", self.save, "Ctrl+S") for action in self.modes[mode].actions(): button_bar.connect(action['name'], action['handler'], action['shortcut']) button_bar.connect("zoom-in", self.zoom_in, "Ctrl++") button_bar.connect("zoom-out", self.zoom_out, "Ctrl+-") button_bar.connect("theme", self.toggle_theme, "F1") button_bar.connect("check", self.check_code, "F2") button_bar.connect("help", self.show_help, "Ctrl+H") button_bar.connect("quit", self.quit, "Ctrl+Q") self._view.status_bar.set_mode(mode) # Update references to default file locations. logger.info('Workspace directory: {}'.format( self.modes[mode].workspace_dir())) # Reset remembered current path for load/save dialogs. self.current_path = '' # Ensure auto-save timeouts are set. if self.modes[mode].save_timeout > 0: # Start the timer self._view.set_timer(self.modes[mode].save_timeout, self.autosave) else: # Stop the timer self._view.stop_timer() # Update breakpoint states. if not (self.modes[mode].is_debugger or self.modes[mode].has_debugger): for tab in self._view.widgets: tab.breakpoint_handles = set() tab.reset_annotations() self.show_status_message(_('Changed to {} mode.').format( mode.capitalize())) def autosave(self): """ Cycles through each tab and, if changed, saves it to the filesystem. """ if self._view.modified: # Something has changed, so save it! for tab in self._view.widgets: if tab.path and tab.isModified(): self.save_tab_to_file(tab) logger.info('Autosave detected and saved ' 'changes in {}.'.format(tab.path)) def check_usb(self): """ Ensure connected USB devices are polled. If there's a change and a new recognised device is attached, inform the user via a status message. If a single device is found and Mu is in a different mode ask the user if they'd like to change mode. """ devices = [] device_types = set() # Detect connected devices. for name, mode in self.modes.items(): if hasattr(mode, 'find_device'): # The mode can detect an attached device. port, serial = mode.find_device(with_logging=False) if port: devices.append((name, port)) device_types.add(name) # Remove no-longer connected devices. to_remove = [] for connected in self.connected_devices: if connected not in devices: to_remove.append(connected) for device in to_remove: self.connected_devices.remove(device) # Add newly connected devices. for device in devices: if device not in self.connected_devices: self.connected_devices.add(device) mode_name = device[0] device_name = self.modes[mode_name].name msg = _('Detected new {} device.').format(device_name) self.show_status_message(msg) # Only ask to switch mode if a single device type is connected # and we're not already trying to select a new mode via the # dialog. Cannot change mode if a script is already being run # by the current mode. m = self.modes[self.mode] running = hasattr(m, "runner") and m.runner if (len(device_types) == 1 and self.mode != mode_name and not self.selecting_mode) and not running: msg_body = _('Would you like to change Mu to the {} ' 'mode?').format(device_name) change_confirmation = self._view.show_confirmation( msg, msg_body, icon='Question') if change_confirmation == QMessageBox.Ok: self.change_mode(mode_name) def show_status_message(self, message, duration=5): """ Displays the referenced message for duration seconds. """ self._view.status_bar.set_message(message, duration * 1000) def debug_toggle_breakpoint(self, margin, line, modifiers): """ How to handle the toggling of a breakpoint. """ if (self.modes[self.mode].has_debugger or self.modes[self.mode].is_debugger): tab = self._view.current_tab code = tab.text(line) if self.mode == 'debugger': # The debugger is running. if is_breakpoint_line(code): self.modes['debugger'].toggle_breakpoint(line, tab) return else: # The debugger isn't running. if tab.markersAtLine(line): tab.markerDelete(line, -1) return elif is_breakpoint_line(code): handle = tab.markerAdd(line, tab.BREAKPOINT_MARKER) tab.breakpoint_handles.add(handle) return msg = _('Cannot Set Breakpoint.') info = _("Lines that are comments or some multi-line " "statements cannot have breakpoints.") self._view.show_message(msg, info) def rename_tab(self, tab_id=None): """ How to handle double-clicking a tab in order to rename the file. If activated by the shortcut, activate against the current tab. """ tab = None if tab_id: tab = self._view.tabs.widget(tab_id) else: tab = self._view.current_tab if tab: new_path = self._view.get_save_path(tab.path) if new_path and new_path != tab.path: if self.check_for_shadow_module(new_path): message = _('You cannot use the filename ' '"{}"').format(os.path.basename(new_path)) info = _('This name is already used by another part of ' 'Python. If you use that name, things are ' 'likely to break. Please try again with a ' 'different filename.') self._view.show_message(message, info) return logger.info('Attempting to rename {} to {}'.format(tab.path, new_path)) # The user specified a path to a file. if not os.path.basename(new_path).endswith('.py'): # No extension given, default to .py new_path += '.py' # Check for duplicate path with currently open tab. for other_tab in self._view.widgets: if other_tab.path == new_path: logger.info('Cannot rename, a file of that name is ' 'already open in Mu') message = _('Could not rename file.') information = _("A file of that name is already open " "in Mu.") self._view.show_message(message, information) return # Finally rename tab.path = new_path logger.info('Renamed file to: {}'.format(tab.path)) self.save() def find_replace(self): """ Handle find / replace functionality. If find/replace dialog is dismissed, do nothing. Otherwise, check there's something to find, warn if there isn't. If there is, find (and, optionally, replace) then confirm outcome with a status message. """ result = self._view.show_find_replace(self.find, self.replace, self.global_replace) if result: self.find, self.replace, self.global_replace = result if self.find: if self.replace: replaced = self._view.replace_text(self.find, self.replace, self.global_replace) if replaced == 1: msg = _('Replaced "{}" with "{}".') self.show_status_message(msg.format(self.find, self.replace)) elif replaced > 1: msg = _('Replaced {} matches of "{}" with "{}".') self.show_status_message(msg.format(replaced, self.find, self.replace)) else: msg = _('Could not find "{}".') self.show_status_message(msg.format(self.find)) else: matched = self._view.highlight_text(self.find) if matched: msg = _('Highlighting matches for "{}".') else: msg = _('Could not find "{}".') self.show_status_message(msg.format(self.find)) else: message = _('You must provide something to find.') information = _("Please try again, this time with something " "in the find box.") self._view.show_message(message, information) def toggle_comments(self): """ Ensure all highlighted lines are toggled between comments/uncommented. """ self._view.toggle_comments() mu-editor-1.0.2+dfsg/mu/modes/000077500000000000000000000000001341747546300161045ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/modes/__init__.py000066400000000000000000000004231341747546300202140ustar00rootroot00000000000000from .python3 import PythonMode from .adafruit import AdafruitMode from .microbit import MicrobitMode from .debugger import DebugMode from .pygamezero import PyGameZeroMode __all__ = ['PythonMode', 'AdafruitMode', 'MicrobitMode', 'DebugMode', 'PyGameZeroMode', ] mu-editor-1.0.2+dfsg/mu/modes/adafruit.py000066400000000000000000000167301341747546300202640ustar00rootroot00000000000000""" A mode for working with Adafuit's line of Circuit Python boards. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import os import ctypes from subprocess import check_output from mu.modes.base import MicroPythonMode from mu.modes.api import ADAFRUIT_APIS, SHARED_APIS from mu.interface.panes import CHARTS class AdafruitMode(MicroPythonMode): """ Represents the functionality required by the Adafruit mode. """ name = _('Adafruit CircuitPython') description = _("Use CircuitPython on Adafruit's line of boards.") icon = 'adafruit' save_timeout = 0 #: Don't autosave on Adafruit boards. Casues a restart. connected = True #: is the Adafruit board connected. force_interrupt = False #: NO keyboard interrupt on serial connection. valid_boards = [ (0x239A, 0x8015), # Adafruit Feather M0 CircuitPython (0x239A, 0x8023), # Adafruit Feather M0 Express CircuitPython (0x239A, 0x801B), # Adafruit Feather M0 Express CircuitPython (0x239A, 0x8014), # Adafruit Metro M0 CircuitPython (0x239A, 0x8019), # Adafruit CircuitPlayground Express CircuitPython (0x239A, 0x801D), # Adafruit Gemma M0 (0x239A, 0x801F), # Adafruit Trinket M0 (0x239A, 0x8012), # Adafruit ItsyBitsy M0 (0x239A, 0x8021), # Adafruit Metro M4 (0x239A, 0x8025), # Adafruit Feather RadioFruit (0x239A, 0x8026), # Adafruit Feather M4 (0x239A, 0x8028), # Adafruit pIRKey M0 (0x239A, 0x802A), # Adafruit Feather 52840 (0x239A, 0x802C), # Adafruit Itsy M4 (0x239A, 0x802E), # Adafruit CRICKit M0 (0x239A, 0xD1ED), # Adafruit HalloWing M0 (0x239A, 0x8030), # Adafruit NeoTrellis M4 (0x239A, 0x8032), # Grand Central (0x2B04, 0xC00C), # Particle Argon (0x2B04, 0xC00D), # Particle Boron (0x2B04, 0xC00E), # Particle Xenon (0x239A, 0x8034), # future board (0x239A, 0x8036), # future board (0x239A, 0x8038), # future board (0x239A, 0x803A), # future board (0x239A, 0x803C), # future board (0x239A, 0x803E), # future board (0x239A, None), # Any Adafruit Boards ] # Modules built into CircuitPython which mustn't be used as file names # for source code. module_names = {'storage', 'os', 'touchio', 'microcontroller', 'bitbangio', 'digitalio', 'audiobusio', 'multiterminal', 'nvm', 'pulseio', 'usb_hid', 'analogio', 'time', 'busio', 'random', 'audioio', 'sys', 'math', 'builtins'} def actions(self): """ Return an ordered list of actions provided by this module. An action is a name (also used to identify the icon) , description, and handler. """ buttons = [ { 'name': 'serial', 'display_name': _('Serial'), 'description': _('Open a serial connection to your device.'), 'handler': self.toggle_repl, 'shortcut': 'CTRL+Shift+U', }, ] if CHARTS: buttons.append({ 'name': 'plotter', 'display_name': _('Plotter'), 'description': _('Plot incoming REPL data.'), 'handler': self.toggle_plotter, 'shortcut': 'CTRL+Shift+P', }) return buttons def workspace_dir(self): """ Return the default location on the filesystem for opening and closing files. """ device_dir = None # Attempts to find the path on the filesystem that represents the # plugged in CIRCUITPY board. if os.name == 'posix': # We're on Linux or OSX for mount_command in ['mount', '/sbin/mount']: try: mount_output = check_output(mount_command).splitlines() mounted_volumes = [x.split()[2] for x in mount_output] for volume in mounted_volumes: if volume.endswith(b'CIRCUITPY'): device_dir = volume.decode('utf-8') except FileNotFoundError: next elif os.name == 'nt': # We're on Windows. def get_volume_name(disk_name): """ Each disk or external device connected to windows has an attribute called "volume name". This function returns the volume name for the given disk/device. Code from http://stackoverflow.com/a/12056414 """ vol_name_buf = ctypes.create_unicode_buffer(1024) ctypes.windll.kernel32.GetVolumeInformationW( ctypes.c_wchar_p(disk_name), vol_name_buf, ctypes.sizeof(vol_name_buf), None, None, None, None, 0) return vol_name_buf.value # # In certain circumstances, volumes are allocated to USB # storage devices which cause a Windows popup to raise if their # volume contains no media. Wrapping the check in SetErrorMode # with SEM_FAILCRITICALERRORS (1) prevents this popup. # old_mode = ctypes.windll.kernel32.SetErrorMode(1) try: for disk in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': path = '{}:\\'.format(disk) if (os.path.exists(path) and get_volume_name(path) == 'CIRCUITPY'): return path finally: ctypes.windll.kernel32.SetErrorMode(old_mode) else: # No support for unknown operating systems. raise NotImplementedError('OS "{}" not supported.'.format(os.name)) if device_dir: # Found it! self.connected = True return device_dir else: # Not plugged in? Just return Mu's regular workspace directory # after warning the user. wd = super().workspace_dir() if self.connected: m = _('Could not find an attached Adafruit CircuitPython' ' device.') info = _("Python files for Adafruit CircuitPython devices" " are stored on the device. Therefore, to edit" " these files you need to have the device plugged in." " Until you plug in a device, Mu will use the" " directory found here:\n\n" " {}\n\n...to store your code.") self.view.show_message(m, info.format(wd)) self.connected = False return wd def api(self): """ Return a list of API specifications to be used by auto-suggest and call tips. """ return SHARED_APIS + ADAFRUIT_APIS mu-editor-1.0.2+dfsg/mu/modes/api/000077500000000000000000000000001341747546300166555ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/modes/api/__init__.py000066400000000000000000000005021341747546300207630ustar00rootroot00000000000000from .adafruit import ADAFRUIT_APIS from .microbit import MICROBIT_APIS from .python3 import PYTHON3_APIS from .pi import PI_APIS from .shared import SHARED_APIS from .pygamezero import PYGAMEZERO_APIS __all__ = ['ADAFRUIT_APIS', 'MICROBIT_APIS', 'PYTHON3_APIS', 'PI_APIS', 'SHARED_APIS', 'PYGAMEZERO_APIS', ] mu-editor-1.0.2+dfsg/mu/modes/api/adafruit.py000066400000000000000000001332761341747546300210420ustar00rootroot00000000000000""" Contains definitions for the CircuitPython APIs used on Adafruit boards so they can be used in the editor for autocomplete and call tips. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ ADAFRUIT_APIS = [ _('_stage.Layer(width, height, graphic, palette, grid) \nKeep internal information about a layer of graphics (either a\nGrid or a Sprite) in a format suitable for fast rendering\nwith the render() function.\n\n\nParameters:\nwidth (int) -- The width of the grid in tiles, or 1 for sprites.\nheight (int) -- The height of the grid in tiles, or 1 for sprites.\ngraphic (bytearray) -- The graphic data of the tiles.\npalette (bytearray) -- The color palette to be used.\ngrid (bytearray) -- The contents of the grid map.'), _('_stage.Layer.frame(frame, rotation) \n'), _('_stage.Layer.move(x, y) \n'), _('_stage.Text(width, height, font, palette, chars) \nKeep internal information about a text of text\nin a format suitable for fast rendering\nwith the render() function.\n\n\nParameters:\nwidth (int) -- The width of the grid in tiles, or 1 for sprites.\nheight (int) -- The height of the grid in tiles, or 1 for sprites.\nfont (bytearray) -- The font data of the characters.\npalette (bytearray) -- The color palette to be used.\nchars (bytearray) -- The contents of the character grid.'), _('_stage.Text.move(x, y) \n'), _('_stage.render(x0, y0, x1, y1, layers, buffer, spi) \nRender and send to the display a fragment of the screen.\n\n\n\n\nParameters:\nx0 (int) -- Left edge of the fragment.\ny0 (int) -- Top edge of the fragment.\nx1 (int) -- Right edge of the fragment.\ny1 (int) -- Bottom edge of the fragment.\nlayers (list) -- A list of the Layer objects.\nbuffer (bytearray) -- A buffer to use for rendering.\nspi (SPI) -- The SPI bus to use.\n\n\n\n\n\nNote that this function only sends the raw pixel data. Setting up\nthe display for receiving it and handling the chip-select and\ndata-command pins has to be done outside of it.\nThere are also no sanity checks, outside of the basic overflow\nchecking. The caller is responsible for making the passed parameters\nvalid.\nThis function is intended for internal use in the stage library\nand all the necessary checks are performed there.\n'), _('analogio.AnalogIn(pin) \nUse the AnalogIn on the given pin. The reference voltage varies by\nplatform so use reference_voltage to read the configured setting.\n\n\nParameters:pin (Pin) -- the pin to read from'), _('analogio.AnalogIn(pin) \nUse the AnalogIn on the given pin. The reference voltage varies by\nplatform so use reference_voltage to read the configured setting.\n\n\nParameters:pin (Pin) -- the pin to read from'), _('analogio.AnalogIn.deinit() \nTurn off the AnalogIn and release the pin for other use.\n'), _('analogio.AnalogIn.deinit() \nTurn off the AnalogIn and release the pin for other use.\n'), _('analogio.AnalogIn.reference_voltage() \nThe maximum voltage measurable. Also known as the reference voltage.\n\n\n\n\nReturns:the reference voltage\n\nReturn type:float\n\n\n\n'), _('analogio.AnalogIn.reference_voltage() \nThe maximum voltage measurable (also known as the reference voltage) as a\nfloat in Volts.\n'), _('analogio.AnalogIn.value() \nRead the value on the analog pin and return it. The returned value\nwill be between 0 and 65535 inclusive (16-bit). Even if the underlying\nanalog to digital converter (ADC) is lower resolution, the result will\nbe scaled to be 16-bit.\n\n\n\n\nReturns:the data read\n\nReturn type:int\n\n\n\n'), _('analogio.AnalogIn.value() \nThe value on the analog pin between 0 and 65535 inclusive (16-bit). (read-only)\nEven if the underlying analog to digital converter (ADC) is lower\nresolution, the value is 16-bit.\n'), _('analogio.AnalogOut(pin) \nUse the AnalogOut on the given pin.\n\n\nParameters:pin (Pin) -- the pin to output to'), _('analogio.AnalogOut(pin) \nUse the AnalogOut on the given pin.\n\n\nParameters:pin (Pin) -- the pin to output to'), _('analogio.AnalogOut.deinit() \nTurn off the AnalogOut and release the pin for other use.\n'), _('analogio.AnalogOut.deinit() \nTurn off the AnalogOut and release the pin for other use.\n'), _('analogio.AnalogOut.value() \nThe value on the analog pin. The value must be between 0 and 65535\ninclusive (16-bit). Even if the underlying digital to analog converter\nis lower resolution, the input must be scaled to be 16-bit.\n\n\n\n\nReturns:the last value written\n\nReturn type:int\n\n\n\n'), _('analogio.AnalogOut.value() \nThe value on the analog pin between 0 and 65535 inclusive (16-bit). (write-only)\nEven if the underlying digital to analog converter (DAC) is lower\nresolution, the value is 16-bit.\n'), _('audiobusio.I2SOut(bit_clock, word_select, data, *, left_justified) \nCreate a I2SOut object associated with the given pins.\n\n\nParameters:\nbit_clock (Pin) -- The bit clock (or serial clock) pin\nword_select (Pin) -- The word select (or left/right clock) pin\ndata (Pin) -- The data pin\nleft_justified (bool) -- True when data bits are aligned with the word select clock. False\nwhen they are shifted by one to match classic I2S protocol.'), _('audiobusio.I2SOut.deinit() \nDeinitialises the I2SOut and releases any hardware resources for reuse.\n'), _('audiobusio.I2SOut.paused() \nTrue when playback is paused. (read-only)\n'), _('audiobusio.I2SOut.playing() \nTrue when the audio sample is being output. (read-only)\n'), _('audiobusio.PDMIn(clock_pin, data_pin, *, frequency=8000, bit_depth=8, mono=True, oversample=64) \nCreate a PDMIn object associated with the given pins. This allows you to\nrecord audio signals from the given pins. Individual ports may put further\nrestrictions on the recording parameters.\n\n\nParameters:\nclock_pin (Pin) -- The pin to output the clock to\ndata_pin (Pin) -- The pin to read the data from\nfrequency (int) -- Target frequency of the resulting samples. Check frequency for real value.\nbit_depth (int) -- Final number of bits per sample. Must be divisible by 8\nmono (bool) -- True when capturing a single channel of audio, captures two channels otherwise\noversample (int) -- Number of single bit samples to decimate into a final sample. Must be divisible by 8'), _('audiobusio.PDMIn(clock_pin, data_pin, *, sample_rate=16000, bit_depth=8, mono=True, oversample=64, startup_delay=0.11) \nCreate a PDMIn object associated with the given pins. This allows you to\nrecord audio signals from the given pins. Individual ports may put further\nrestrictions on the recording parameters. The overall sample rate is\ndetermined by sample_rate x oversample, and the total must be 1MHz or\nhigher, so sample_rate must be a minimum of 16000.\n\n\nParameters:\nclock_pin (Pin) -- The pin to output the clock to\ndata_pin (Pin) -- The pin to read the data from\nsample_rate (int) -- Target sample_rate of the resulting samples. Check sample_rate for actual value.\nMinimum sample_rate is about 16000 Hz.\nbit_depth (int) -- Final number of bits per sample. Must be divisible by 8\nmono (bool) -- True when capturing a single channel of audio, captures two channels otherwise\noversample (int) -- Number of single bit samples to decimate into a final sample. Must be divisible by 8\nstartup_delay (float) -- seconds to wait after starting microphone clock\nto allow microphone to turn on. Most require only 0.01s; some require 0.1s. Longer is safer.\nMust be in range 0.0-1.0 seconds.'), _('audiobusio.PDMIn.deinit() \nDeinitialises the PWMOut and releases any hardware resources for reuse.\n'), _('audiobusio.PDMIn.deinit() \nDeinitialises the PDMIn and releases any hardware resources for reuse.\n'), _('audiobusio.PDMIn.frequency() \nThe actual frequency of the recording. This may not match the constructed\nfrequency due to internal clock limitations.\n'), _('audiobusio.PDMIn.sample_rate() \nThe actual sample_rate of the recording. This may not match the constructed\nsample rate due to internal clock limitations.\n'), _('audioio.AudioOut(pin, sample_source) \nCreate a AudioOut object associated with the given pin. This allows you to\nplay audio signals out on the given pin. Sample_source must be a bytes-like object.\n\nThe sample itself should consist of 16 bit samples and be mono.\nMicrocontrollers with a lower output resolution will use the highest order\nbits to output. For example, the SAMD21 has a 10 bit DAC that ignores the\nlowest 6 bits when playing 16 bit samples.\n\n\nParameters:\npin (Pin) -- The pin to output to\nsample_source (bytes-like) -- The source of the sample'), _('audioio.AudioOut(left_channel, right_channel=None) \nCreate a AudioOut object associated with the given pin(s). This allows you to\nplay audio signals out on the given pin(s).\n\n\nParameters:\nleft_channel (Pin) -- The pin to output the left channel to\nright_channel (Pin) -- The pin to output the right channel to'), _('audioio.AudioOut.deinit() \nDeinitialises the PWMOut and releases any hardware resources for reuse.\n'), _('audioio.AudioOut.deinit() \nDeinitialises the AudioOut and releases any hardware resources for reuse.\n'), _('audioio.AudioOut.frequency() \n32 bit value that dictates how quickly samples are loaded into the DAC\nin Hertz (cycles per second). When the sample is looped, this can change\nthe pitch output without changing the underlying sample.\n'), _('audioio.AudioOut.paused() \nTrue when playback is paused. (read-only)\n'), _('audioio.AudioOut.playing() \nTrue when the audio sample is being output.\n'), _('audioio.AudioOut.playing() \nTrue when an audio sample is being output even if paused. (read-only)\n'), _('audioio.RawSample(buffer, *, channel_count=1, sample_rate=8000) \nCreate a RawSample based on the given buffer of signed values. If channel_count is more than\n1 then each channel’s samples should alternate. In other words, for a two channel buffer, the\nfirst sample will be for channel 1, the second sample will be for channel two, the third for\nchannel 1 and so on.\n\n\nParameters:\nbuffer (array) -- An array.array with samples\nchannel_count (int) -- The number of channels in the buffer\nsample_rate (int) -- The desired playback sample rate'), _('audioio.RawSample.deinit() \nDeinitialises the AudioOut and releases any hardware resources for reuse.\n'), _('audioio.RawSample.sample_rate() \n32 bit value that dictates how quickly samples are played in Hertz (cycles per second).\nWhen the sample is looped, this can change the pitch output without changing the underlying\nsample. This will not change the sample rate of any active playback. Call play again to\nchange it.\n'), _('audioio.WaveFile(filename) \nLoad a .wav file for playback with audioio.AudioOut or audiobusio.I2SOut.\n\n\nParameters:file (bytes-like) -- Already opened wave file'), _('audioio.WaveFile.deinit() \nDeinitialises the WaveFile and releases all memory resources for reuse.\n'), _('audioio.WaveFile.sample_rate() \n32 bit value that dictates how quickly samples are loaded into the DAC\nin Hertz (cycles per second). When the sample is looped, this can change\nthe pitch output without changing the underlying sample.\n'), _('bitbangio.I2C(scl, sda, *, frequency=400000) \nI2C is a two-wire protocol for communicating between devices. At the\nphysical level it consists of 2 wires: SCL and SDA, the clock and data\nlines respectively.\n\n\nParameters:\nscl (Pin) -- The clock pin\nsda (Pin) -- The data pin\nfrequency (int) -- The clock frequency of the bus'), _('bitbangio.I2C(scl, sda, *, frequency=400000) \nI2C is a two-wire protocol for communicating between devices. At the\nphysical level it consists of 2 wires: SCL and SDA, the clock and data\nlines respectively.\n\n\nParameters:\nscl (Pin) -- The clock pin\nsda (Pin) -- The data pin\nfrequency (int) -- The clock frequency of the bus\ntimeout (int) -- The maximum clock stretching timeout in microseconds'), _('bitbangio.I2C.deinit() \nReleases control of the underlying hardware so other classes can use it.\n'), _('bitbangio.I2C.deinit() \nReleases control of the underlying hardware so other classes can use it.\n'), _('bitbangio.OneWire(pin) \nCreate a OneWire object associated with the given pin. The object\nimplements the lowest level timing-sensitive bits of the protocol.\n\n\nParameters:pin (Pin) -- Pin to read pulses from.'), _('bitbangio.OneWire(pin) \nCreate a OneWire object associated with the given pin. The object\nimplements the lowest level timing-sensitive bits of the protocol.\n\n\nParameters:pin (Pin) -- Pin to read pulses from.'), _('bitbangio.OneWire.deinit() \nDeinitialize the OneWire bus and release any hardware resources for reuse.\n'), _('bitbangio.OneWire.deinit() \nDeinitialize the OneWire bus and release any hardware resources for reuse.\n'), _('bitbangio.SPI(clock, MOSI=None, MISO=None) \n\nParameters:\nclock (Pin) -- the pin to use for the clock.\nMOSI (Pin) -- the Master Out Slave In pin.\nMISO (Pin) -- the Master In Slave Out pin.'), _('bitbangio.SPI(clock, MOSI=None, MISO=None) \n\nParameters:\nclock (Pin) -- the pin to use for the clock.\nMOSI (Pin) -- the Master Out Slave In pin.\nMISO (Pin) -- the Master In Slave Out pin.'), _('bitbangio.SPI.deinit() \nTurn off the SPI bus.\n'), _('bitbangio.SPI.deinit() \nTurn off the SPI bus.\n'), _('busio.I2C(scl, sda, *, frequency=400000) \nI2C is a two-wire protocol for communicating between devices. At the\nphysical level it consists of 2 wires: SCL and SDA, the clock and data\nlines respectively.\n\n\nParameters:\nscl (Pin) -- The clock pin\nsda (Pin) -- The data pin\nfrequency (int) -- The clock frequency in Hertz'), _('busio.I2C(scl, sda, *, frequency=400000) \nI2C is a two-wire protocol for communicating between devices. At the\nphysical level it consists of 2 wires: SCL and SDA, the clock and data\nlines respectively.\n\n\nParameters:\nscl (Pin) -- The clock pin\nsda (Pin) -- The data pin\nfrequency (int) -- The clock frequency in Hertz\ntimeout (int) -- The maximum clock stretching timeut - only for bitbang'), _('busio.I2C.deinit() \nReleases control of the underlying hardware so other classes can use it.\n'), _('busio.I2C.deinit() \nReleases control of the underlying hardware so other classes can use it.\n'), _('busio.OneWire(pin) \nCreate a OneWire object associated with the given pin. The object\nimplements the lowest level timing-sensitive bits of the protocol.\n\n\nParameters:pin (Pin) -- Pin connected to the OneWire bus'), _('busio.OneWire(pin) \nCreate a OneWire object associated with the given pin. The object\nimplements the lowest level timing-sensitive bits of the protocol.\n\n\nParameters:pin (Pin) -- Pin connected to the OneWire bus'), _('busio.OneWire.deinit() \nDeinitialize the OneWire bus and release any hardware resources for reuse.\n'), _('busio.OneWire.deinit() \nDeinitialize the OneWire bus and release any hardware resources for reuse.\n'), _('busio.SPI(clock, MOSI=None, MISO=None) \n\nParameters:\nclock (Pin) -- the pin to use for the clock.\nMOSI (Pin) -- the Master Out Slave In pin.\nMISO (Pin) -- the Master In Slave Out pin.'), _('busio.SPI(clock, MOSI=None, MISO=None) \n\nParameters:\nclock (Pin) -- the pin to use for the clock.\nMOSI (Pin) -- the Master Out Slave In pin.\nMISO (Pin) -- the Master In Slave Out pin.'), _('busio.SPI.deinit() \nTurn off the SPI bus.\n'), _('busio.SPI.deinit() \nTurn off the SPI bus.\n'), _('busio.SPI.frequency() \nThe actual SPI bus frequency. This may not match the frequency requested\ndue to internal limitations.\n'), _('busio.UART(tx, rx, *, baudrate=9600, bits=8, parity=None, stop=1, timeout=1000, receiver_buffer_size=64) \nA common bidirectional serial protocol that uses an an agreed upon speed\nrather than a shared clock line.\n\n\nParameters:\ntx (Pin) -- the pin to transmit with\nrx (Pin) -- the pin to receive on\nbaudrate (int) -- the transmit and receive speed'), _('busio.UART(tx, rx, *, baudrate=9600, bits=8, parity=None, stop=1, timeout=1000, receiver_buffer_size=64) \nA common bidirectional serial protocol that uses an an agreed upon speed\nrather than a shared clock line.\n\n\nParameters:\ntx (Pin) -- the pin to transmit with, or None if this UART is receive-only.\nrx (Pin) -- the pin to receive on, or None if this UART is transmit-only.\nbaudrate (int) -- the transmit and receive speed.'), _('busio.UART.Parity() \nEnum-like class to define the parity used to verify correct data transfer.\n\n'), _('busio.UART.Parity() \nEnum-like class to define the parity used to verify correct data transfer.\n\n'), _('busio.UART.Parity.EVEN() \nTotal number of ones should be even.\n'), _('busio.UART.Parity.EVEN() \nTotal number of ones should be even.\n'), _('busio.UART.Parity.ODD() \nTotal number of ones should be odd.\n'), _('busio.UART.Parity.ODD() \nTotal number of ones should be odd.\n'), _('busio.UART.baudrate() \nThe current baudrate.\n'), _('busio.UART.deinit() \nDeinitialises the UART and releases any hardware resources for reuse.\n'), _('busio.UART.deinit() \nDeinitialises the UART and releases any hardware resources for reuse.\n'), _('digitalio.DigitalInOut(pin) \nCreate a new DigitalInOut object associated with the pin. Defaults to input\nwith no pull. Use switch_to_input() and\nswitch_to_output() to change the direction.\n\n\nParameters:pin (Pin) -- The pin to control'), _('digitalio.DigitalInOut(pin) \nCreate a new DigitalInOut object associated with the pin. Defaults to input\nwith no pull. Use switch_to_input() and\nswitch_to_output() to change the direction.\n\n\nParameters:pin (Pin) -- The pin to control'), _('digitalio.DigitalInOut.Direction() \nEnum-like class to define which direction the digital values are\ngoing.\n\n'), _('digitalio.DigitalInOut.Direction() \nEnum-like class to define which direction the digital values are\ngoing.\n\n'), _('digitalio.DigitalInOut.Direction.INPUT() \nRead digital data in\n'), _('digitalio.DigitalInOut.Direction.INPUT() \nRead digital data in\n'), _('digitalio.DigitalInOut.Direction.OUTPUT() \nWrite digital data out\n'), _('digitalio.DigitalInOut.Direction.OUTPUT() \nWrite digital data out\n'), _('digitalio.DigitalInOut.deinit() \nTurn off the DigitalInOut and release the pin for other use.\n'), _('digitalio.DigitalInOut.deinit() \nTurn off the DigitalInOut and release the pin for other use.\n'), _('digitalio.DigitalInOut.direction() \nThe direction of the pin.\nSetting this will use the defaults from the corresponding\nswitch_to_input() or switch_to_output() method. If\nyou want to set pull, value or drive mode prior to switching, then use\nthose methods instead.\n'), _('digitalio.DigitalInOut.direction() \nThe direction of the pin.\nSetting this will use the defaults from the corresponding\nswitch_to_input() or switch_to_output() method. If\nyou want to set pull, value or drive mode prior to switching, then use\nthose methods instead.\n'), _('digitalio.DigitalInOut.drive_mode() \nGet or set the pin drive mode.\n'), _('digitalio.DigitalInOut.drive_mode() \nThe pin drive mode. One of:\n\ndigitalio.DriveMode.PUSH_PULL\ndigitalio.DriveMode.OPEN_DRAIN\n\n'), _('digitalio.DigitalInOut.pull() \nGet or set the pin pull. Values may be digitalio.Pull.UP,\ndigitalio.Pull.DOWN or None.\n\n\n\n\nRaises:AttributeError -- if the direction is ~`digitalio.Direction.OUTPUT`.\n\n\n\n'), _('digitalio.DigitalInOut.pull() \nThe pin pull direction. One of:\n\ndigitalio.Pull.UP\ndigitalio.Pull.DOWN\nNone\n\n\n\n\n\nRaises:AttributeError -- if direction is OUTPUT.\n\n\n\n'), _('digitalio.DigitalInOut.value() \nThe digital logic level of the pin.\n'), _('digitalio.DigitalInOut.value() \nThe digital logic level of the pin.\n'), _('digitalio.DriveMode() \nEnum-like class to define the drive mode used when outputting\ndigital values.\n\n'), _('digitalio.DriveMode() \nEnum-like class to define the drive mode used when outputting\ndigital values.\n\n'), _('digitalio.DriveMode.OPEN_DRAIN() \nOutput low digital values but go into high z for digital high. This is\nuseful for i2c and other protocols that share a digital line.\n'), _('digitalio.DriveMode.OPEN_DRAIN() \nOutput low digital values but go into high z for digital high. This is\nuseful for i2c and other protocols that share a digital line.\n'), _('digitalio.DriveMode.PUSH_PULL() \nOutput both high and low digital values\n'), _('digitalio.DriveMode.PUSH_PULL() \nOutput both high and low digital values\n'), _('digitalio.Pull() \nEnum-like class to define the pull value, if any, used while reading\ndigital values in.\n\n'), _('digitalio.Pull() \nEnum-like class to define the pull value, if any, used while reading\ndigital values in.\n\n'), _('digitalio.Pull.DOWN() \nWhen the input line isn’t being driven the pull down can pull the\nstate of the line low so it reads as false.\n'), _('digitalio.Pull.DOWN() \nWhen the input line isn’t being driven the pull down can pull the\nstate of the line low so it reads as false.\n'), _('digitalio.Pull.UP() \nWhen the input line isn’t being driven the pull up can pull the state\nof the line high so it reads as true.\n'), _('digitalio.Pull.UP() \nWhen the input line isn’t being driven the pull up can pull the state\nof the line high so it reads as true.\n'), _('gamepad.GamePad(b1, b2, b3, b4, b5, b6, b7, b8) \nInitializes button scanning routines.\n\nThe b1-b8 parameters are DigitalInOut objects, which\nimmediately get switched to input with a pull-up, and then scanned\nregularly for button presses. The order is the same as the order of\nbits returned by the get_pressed function. You can re-initialize\nit with different keys, then the new object will replace the previous\none.\n\nThe basic feature required here is the ability to poll the keys at\nregular intervals (so that de-bouncing is consistent) and fast enough\n(so that we don’t miss short button presses) while at the same time\nletting the user code run normally, call blocking functions and wait\non delays.\n\nThey button presses are accumulated, until the get_pressed method\nis called, at which point the button state is cleared, and the new\nbutton presses start to be recorded.\n\n'), _('gamepad.GamePad.deinit() \nDisable button scanning.\n'), _('gamepad.GamePad.get_pressed() \nGet the status of buttons pressed since the last call and clear it.\nReturns an 8-bit number, with bits that correspond to buttons,\nwhich have been pressed (or held down) since the last call to this\nfunction set to 1, and the remaining bits set to 0. Then it clears\nthe button state, so that new button presses (or buttons that are\nheld down) can be recorded for the next call.\n'), _('math.acos(x) \nReturn the inverse cosine of x.\n'), _('math.asin(x) \nReturn the inverse sine of x.\n'), _('math.atan(x) \nReturn the inverse tangent of x.\n'), _('math.atan2(y, x) \nReturn the principal value of the inverse tangent of y/x.\n'), _('math.ceil(x) \nReturn an integer, being x rounded towards positive infinity.\n'), _('math.copysign(x, y) \nReturn x with the sign of y.\n'), _('math.cos(x) \nReturn the cosine of x.\n'), _('math.degrees(x) \nReturn radians x converted to degrees.\n'), _('math.exp(x) \nReturn the exponential of x.\n'), _('math.fabs(x) \nReturn the absolute value of x.\n'), _('math.floor(x) \nReturn an integer, being x rounded towards negative infinity.\n'), _('math.fmod(x, y) \nReturn the remainder of x/y.\n'), _('math.frexp(x) \nDecomposes a floating-point number into its mantissa and exponent.\nThe returned value is the tuple (m, e) such that x == m * 2**e\nexactly. If x == 0 then the function returns (0.0, 0), otherwise\nthe relation 0.5 <= abs(m) < 1 holds.\n'), _('math.isfinite(x) \nReturn True if x is finite.\n'), _('math.isinf(x) \nReturn True if x is infinite.\n'), _('math.isnan(x) \nReturn True if x is not-a-number\n'), _('math.ldexp(x, exp) \nReturn x * (2**exp).\n'), _('math.modf(x) \nReturn a tuple of two floats, being the fractional and integral parts of\nx. Both return values have the same sign as x.\n'), _('math.pow(x, y) \nReturns x to the power of y.\n'), _('math.radians(x) \nReturn degrees x converted to radians.\n'), _('math.sin(x) \nReturn the sine of x.\n'), _('math.sqrt(x) \nReturns the square root of x.\n'), _('math.tan(x) \nReturn the tangent of x.\n'), _('math.trunc(x) \nReturn an integer, being x rounded towards 0.\n'), _('microcontroller.Pin() \nIdentifies an IO pin on the microcontroller. They are fixed by the\nhardware so they cannot be constructed on demand. Instead, use\nboard or microcontroller.pin to reference the desired pin.\n\n'), _('microcontroller.Pin() \nIdentifies an IO pin on the microcontroller. They are fixed by the\nhardware so they cannot be constructed on demand. Instead, use\nboard or microcontroller.pin to reference the desired pin.\n\n'), _('microcontroller.Processor() \n'), _('microcontroller.Processor() \nYou cannot create an instance of microcontroller.Processor.\nUse microcontroller.cpu to access the sole instance available.\n\n'), _('microcontroller.Processor.frequency() \nThe CPU operating frequency as an int, in Hertz. (read-only)\n'), _('microcontroller.Processor.temperature() \nThe on-chip temperature, in Celsius, as a float. (read-only)\nIs None if the temperature is not available.\n'), _('microcontroller.Processor.uid() \nThe unique id (aka serial number) of the chip as a bytearray. (read-only)\n'), _('microcontroller.RunMode() \nEnum-like class to define the run mode of the microcontroller and\nCircuitPython.\n\n'), _('microcontroller.RunMode.BOOTLOADER() \nRun the bootloader.\n'), _('microcontroller.RunMode.NORMAL() \nRun CircuitPython as normal.\n'), _('microcontroller.RunMode.SAFE_MODE() \nRun CircuitPython in safe mode. User code will not be run and the\nfile system will be writeable over USB.\n'), _('multiterminal.clear_secondary_terminal() \nClears the secondary terminal.\n'), _('multiterminal.clear_secondary_terminal() \nClears the secondary terminal.\n'), _('multiterminal.get_secondary_terminal() \nReturns the current secondary terminal.\n'), _('multiterminal.get_secondary_terminal() \nReturns the current secondary terminal.\n'), _('multiterminal.schedule_secondary_terminal_read(socket) \nIn cases where the underlying OS is doing task scheduling, this notifies\nthe OS when more data is available on the socket to read. This is useful\nas a callback for lwip sockets.\n'), _('multiterminal.schedule_secondary_terminal_read(socket) \nIn cases where the underlying OS is doing task scheduling, this notifies\nthe OS when more data is available on the socket to read. This is useful\nas a callback for lwip sockets.\n'), _('multiterminal.set_secondary_terminal(stream) \nRead additional input from the given stream and write out back to it.\nThis doesn’t replace the core stream (usually UART or native USB) but is\nmixed in instead.\n\n\n\n\nParameters:stream (stream) -- secondary stream\n\n\n\n'), _('multiterminal.set_secondary_terminal(stream) \nRead additional input from the given stream and write out back to it.\nThis doesn’t replace the core stream (usually UART or native USB) but is\nmixed in instead.\n\n\n\n\nParameters:stream (stream) -- secondary stream\n\n\n\n'), _('nvm.ByteArray() \nNot currently dynamically supported. Access the sole instance through microcontroller.nvm.\n\n'), _('nvm.ByteArray() \nNot currently dynamically supported. Access the sole instance through microcontroller.nvm.\n\n'), _('os.chdir(path) \nChange current directory.\n'), _('os.chdir(path) \nChange current directory.\n'), _('os.getcwd() \nGet the current directory.\n'), _('os.getcwd() \nGet the current directory.\n'), _('os.listdir(dir) \nWith no argument, list the current directory. Otherwise list the given directory.\n'), _('os.listdir(dir) \nWith no argument, list the current directory. Otherwise list the given directory.\n'), _('os.mkdir(path) \nCreate a new directory.\n'), _('os.mkdir(path) \nCreate a new directory.\n'), _('os.remove(path) \nRemove a file.\n'), _('os.remove(path) \nRemove a file.\n'), _('os.rename(old_path, new_path) \nRename a file.\n'), _('os.rename(old_path, new_path) \nRename a file.\n'), _('os.rmdir(path) \nRemove a directory.\n'), _('os.rmdir(path) \nRemove a directory.\n'), _('os.stat(path) \nGet the status of a file or directory.\n'), _('os.stat(path) \nGet the status of a file or directory.\n'), _('os.statvfs(path) \nGet the status of a fileystem.\nReturns a tuple with the filesystem information in the following order:\n\n\nf_bsize -- file system block size\nf_frsize -- fragment size\nf_blocks -- size of fs in f_frsize units\nf_bfree -- number of free blocks\nf_bavail -- number of free blocks for unpriviliged users\nf_files -- number of inodes\nf_ffree -- number of free inodes\nf_favail -- number of free inodes for unpriviliged users\nf_flag -- mount flags\nf_namemax -- maximum filename length\n\n\nParameters related to inodes: f_files, f_ffree, f_avail\nand the f_flags parameter may return 0 as they can be unavailable\nin a port-specific implementation.\n'), _('os.statvfs(path) \nGet the status of a fileystem.\nReturns a tuple with the filesystem information in the following order:\n\n\nf_bsize -- file system block size\nf_frsize -- fragment size\nf_blocks -- size of fs in f_frsize units\nf_bfree -- number of free blocks\nf_bavail -- number of free blocks for unpriviliged users\nf_files -- number of inodes\nf_ffree -- number of free inodes\nf_favail -- number of free inodes for unpriviliged users\nf_flag -- mount flags\nf_namemax -- maximum filename length\n\n\nParameters related to inodes: f_files, f_ffree, f_avail\nand the f_flags parameter may return 0 as they can be unavailable\nin a port-specific implementation.\n'), _('os.sync() \nSync all filesystems.\n'), _('os.sync() \nSync all filesystems.\n'), _('os.uname() \nReturns a named tuple of operating specific and CircuitPython port\nspecific information.\n'), _('os.uname() \nReturns a named tuple of operating specific and CircuitPython port\nspecific information.\n'), _('os.urandom(size) \nReturns a string of size random bytes based on a hardware True Random\nNumber Generator. When not available, it will raise a NotImplementedError.\n'), _('os.urandom(size) \nReturns a string of size random bytes based on a hardware True Random\nNumber Generator. When not available, it will raise a NotImplementedError.\n'), _('pulseio.PWMOut(pin, *, duty_cycle=0, frequency=500, variable_frequency=False) \nCreate a PWM object associated with the given pin. This allows you to\nwrite PWM signals out on the given pin. Frequency is fixed after init\nunless variable_frequency is True.\n\n\nParameters:\npin (Pin) -- The pin to output to\nduty_cycle (int) -- The fraction of each pulse which is high. 16-bit\nfrequency (int) -- The target frequency in Hertz (32-bit)\nvariable_frequency (bool) -- True if the frequency will change over time'), _('pulseio.PWMOut(pin, *, duty_cycle=0, frequency=500, variable_frequency=False) \nCreate a PWM object associated with the given pin. This allows you to\nwrite PWM signals out on the given pin. Frequency is fixed after init\nunless variable_frequency is True.\n\n\nParameters:\npin (Pin) -- The pin to output to\nduty_cycle (int) -- The fraction of each pulse which is high. 16-bit\nfrequency (int) -- The target frequency in Hertz (32-bit)\nvariable_frequency (bool) -- True if the frequency will change over time'), _('pulseio.PWMOut.deinit() \nDeinitialises the PWMOut and releases any hardware resources for reuse.\n'), _('pulseio.PWMOut.deinit() \nDeinitialises the PWMOut and releases any hardware resources for reuse.\n'), _('pulseio.PWMOut.duty_cycle() \n16 bit value that dictates how much of one cycle is high (1) versus low\n(0). 0xffff will always be high, 0 will always be low and 0x7fff will\nbe half high and then half low.\n'), _('pulseio.PWMOut.duty_cycle() \n16 bit value that dictates how much of one cycle is high (1) versus low\n(0). 0xffff will always be high, 0 will always be low and 0x7fff will\nbe half high and then half low.\n'), _('pulseio.PWMOut.frequency() \n32 bit value that dictates the PWM frequency in Hertz (cycles per\nsecond). Only writeable when constructed with variable_frequency=True.\n'), _('pulseio.PWMOut.frequency() \n32 bit value that dictates the PWM frequency in Hertz (cycles per\nsecond). Only writeable when constructed with variable_frequency=True.\n'), _('pulseio.PulseIn(pin, maxlen=2, *, idle_state=False) \nCreate a PulseIn object associated with the given pin. The object acts as\na read-only sequence of pulse lengths with a given max length. When it is\nactive, new pulse lengths are added to the end of the list. When there is\nno more room (len() == maxlen) the oldest pulse length is removed to\nmake room.\n\n\nParameters:\npin (Pin) -- Pin to read pulses from.\nmaxlen (int) -- Maximum number of pulse durations to store at once\nidle_state (bool) -- Idle state of the pin. At start and after resume\nthe first recorded pulse will the opposite state from idle.'), _('pulseio.PulseIn(pin, maxlen=2, *, idle_state=False) \nCreate a PulseIn object associated with the given pin. The object acts as\na read-only sequence of pulse lengths with a given max length. When it is\nactive, new pulse lengths are added to the end of the list. When there is\nno more room (len() == maxlen) the oldest pulse length is removed to\nmake room.\n\n\nParameters:\npin (Pin) -- Pin to read pulses from.\nmaxlen (int) -- Maximum number of pulse durations to store at once\nidle_state (bool) -- Idle state of the pin. At start and after resume\nthe first recorded pulse will the opposite state from idle.'), _('pulseio.PulseIn.deinit() \nDeinitialises the PulseIn and releases any hardware resources for reuse.\n'), _('pulseio.PulseIn.deinit() \nDeinitialises the PulseIn and releases any hardware resources for reuse.\n'), _('pulseio.PulseIn.maxlen() \nReturns the maximum length of the PulseIn. When len() is equal to maxlen,\nit is unclear which pulses are active and which are idle.\n'), _('pulseio.PulseIn.maxlen() \nThe maximum length of the PulseIn. When len() is equal to maxlen,\nit is unclear which pulses are active and which are idle.\n'), _('pulseio.PulseIn.paused() \nTrue when pulse capture is paused as a result of pause() or an error during capture\nsuch as a signal that is too fast.\n'), _('pulseio.PulseOut(carrier) \nCreate a PulseOut object associated with the given PWM out experience.\n\n\nParameters:carrier (PWMOut) -- PWMOut that is set to output on the desired pin.'), _('pulseio.PulseOut(carrier) \nCreate a PulseOut object associated with the given PWM out experience.\n\n\nParameters:carrier (PWMOut) -- PWMOut that is set to output on the desired pin.'), _('pulseio.PulseOut.deinit() \nDeinitialises the PulseOut and releases any hardware resources for reuse.\n'), _('pulseio.PulseOut.deinit() \nDeinitialises the PulseOut and releases any hardware resources for reuse.\n'), _('random.choice(seq) \nReturns a randomly selected element from the given sequence. Raises\nIndexError when the sequence is empty.\n'), _('random.choice(seq) \nReturns a randomly selected element from the given sequence. Raises\nIndexError when the sequence is empty.\n'), _('random.getrandbits(k) \nReturns an integer with k random bits.\n'), _('random.getrandbits(k) \nReturns an integer with k random bits.\n'), _('random.randint(a, b) \nReturns a randomly selected integer between a and b inclusive. Equivalent\nto randrange(a, b + 1, 1)\n'), _('random.randint(a, b) \nReturns a randomly selected integer between a and b inclusive. Equivalent\nto randrange(a, b + 1, 1)\n'), _('random.random() \nReturns a random float between 0 and 1.0.\n'), _('random.random() \nReturns a random float between 0 and 1.0.\n'), _('random.randrange(stop) \nReturns a randomly selected integer from range(start, stop, step).\n'), _('random.randrange(stop) \nReturns a randomly selected integer from range(start, stop, step).\n'), _('random.seed(seed) \nSets the starting seed of the random number generation. Further calls to\nrandom will return deterministic results afterwards.\n'), _('random.seed(seed) \nSets the starting seed of the random number generation. Further calls to\nrandom will return deterministic results afterwards.\n'), _('random.uniform(a, b) \nReturns a random float between a and b. It may or may not be inclusive\ndepending on float rounding.\n'), _('random.uniform(a, b) \nReturns a random float between a and b. It may or may not be inclusive\ndepending on float rounding.\n'), _('rotaryio.IncrementalEncoder(pin_a, pin_b) \nCreate an IncrementalEncoder object associated with the given pins. It tracks the positional\nstate of an incremental rotary encoder (also known as a quadrature encoder.) Position is\nrelative to the position when the object is contructed.\n\n\nParameters:\npin_a (Pin) -- First pin to read pulses from.\npin_b (Pin) -- Second pin to read pulses from.'), _('rotaryio.IncrementalEncoder.deinit() \nDeinitializes the IncrementalEncoder and releases any hardware resources for reuse.\n'), _('rotaryio.IncrementalEncoder.position() \nThe current position in terms of pulses. The number of pulses per rotation is defined by the\nspecific hardware.\n'), _('rtc.RTC() \nThis class represents the onboard Real Time Clock. It is a singleton and will always return the same instance.\n\n'), _('rtc.RTC.calibration() \nThe RTC calibration value.\nA positive value speeds up the clock and a negative value slows it down.\nRange and value is hardware specific, but one step is often approx. 1 ppm.\n'), _('rtc.RTC.datetime() \nThe date and time of the RTC.\n'), _('rtc.set_time_source(rtc) \nSets the rtc time source used by time.localtime().\nThe default is rtc.RTC().\nExample usage:\nimport rtc\nimport time\n\nclass RTC(object):\n @property\n def datetime(self):\n return time.struct_time((2018, 3, 17, 21, 1, 47, 0, 0, 0))\n\nr = RTC()\nrtc.set_time_source(r)\n\n\n'), _('storage.VfsFat(block_device) \nCreate a new VfsFat filesystem around the given block device.\n\n\nParameters:block_device -- Block device the the filesystem lives on'), _('storage.VfsFat(block_device) \nCreate a new VfsFat filesystem around the given block device.\n\n\nParameters:block_device -- Block device the the filesystem lives on'), _('storage.VfsFat.ilistdir(path) \nReturn an iterator whose values describe files and folders within\npath\n'), _('storage.VfsFat.label() \nThe filesystem label, up to 11 case-insensitive bytes. Note that\nthis property can only be set when the device is writable by the\nmicrocontroller.\n'), _('storage.VfsFat.mkdir(path) \nLike os.mkdir\n'), _('storage.VfsFat.mkfs() \nFormat the block device, deleting any data that may have been there\n'), _('storage.VfsFat.mount(readonly, mkfs) \nDon’t call this directly, call storage.mount.\n'), _('storage.VfsFat.open(path, mode) \nLike builtin open()\n'), _('storage.VfsFat.rmdir(path) \nLike os.rmdir\n'), _('storage.VfsFat.stat(path) \nLike os.stat\n'), _('storage.VfsFat.statvfs(path) \nLike os.statvfs\n'), _('storage.VfsFat.umount() \nDon’t call this directly, call storage.umount.\n'), _('storage.erase_filesystem() \nErase and re-create the CIRCUITPY filesystem.\nOn boards that present USB-visible CIRCUITPY drive (e.g., SAMD21 and SAMD51),\nthen call microcontroller.reset() to restart CircuitPython and have the\nhost computer remount CIRCUITPY.\nThis function can be called from the REPL when CIRCUITPY\nhas become corrupted.\n\nWarning\nAll the data on CIRCUITPY will be lost, and\nCircuitPython will restart on certain boards.\n\n'), _('storage.getmount(mount_path) \nRetrieves the mount object associated with the mount path\n'), _('storage.mount(filesystem, mount_path, *, readonly=False) \nMounts the given filesystem object at the given path.\nThis is the CircuitPython analog to the UNIX mount command.\n'), _('storage.mount(filesystem, mount_path, *, readonly=False) \nMounts the given filesystem object at the given path.\nThis is the CircuitPython analog to the UNIX mount command.\n'), _('storage.remount(mount_path, readonly) \nRemounts the given path with new parameters.\n'), _('storage.remount(mount_path, readonly=False) \nRemounts the given path with new parameters.\n'), _('storage.umount(mount) \nUnmounts the given filesystem object or if mount is a path, then unmount\nthe filesystem mounted at that location.\nThis is the CircuitPython analog to the UNIX umount command.\n'), _('storage.umount(mount) \nUnmounts the given filesystem object or if mount is a path, then unmount\nthe filesystem mounted at that location.\nThis is the CircuitPython analog to the UNIX umount command.\n'), _('struct.calcsize(fmt) \nReturn the number of bytes needed to store the given fmt.\n'), _('struct.pack(fmt, v1, v2, ...) \nPack the values v1, v2, … according to the format string fmt.\nThe return value is a bytes object encoding the values.\n'), _('struct.pack_into(fmt, buffer, offset, v1, v2, ...) \nPack the values v1, v2, … according to the format string fmt into a buffer\nstarting at offset. offset may be negative to count from the end of buffer.\n'), _('struct.unpack(fmt, data) \nUnpack from the data according to the format string fmt. The return value\nis a tuple of the unpacked values.\n'), _('struct.unpack_from(fmt, data, offset) \nUnpack from the data starting at offset according to the format string fmt.\noffset may be negative to count from the end of buffer. The return value is\na tuple of the unpacked values.\n'), _('supervisor.Runtime() \nYou cannot create an instance of supervisor.Runtime.\nUse supervisor.runtime to access the sole instance available.\n\n'), _('supervisor.Runtime.serial_connected() \nReturns the USB serial communication status (read-only).\n'), _('time.struct_time((tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst)) \nStructure used to capture a date and time. Note that it takes a tuple!\n\n\nParameters:\ntm_year (int) -- the year, 2017 for example\ntm_mon (int) -- the month, range [1, 12]\ntm_mday (int) -- the day of the month, range [1, 31]\ntm_hour (int) -- the hour, range [0, 23]\ntm_min (int) -- the minute, range [0, 59]\ntm_sec (int) -- the second, range [0, 61]\ntm_wday (int) -- the day of the week, range [0, 6], Monday is 0\ntm_yday (int) -- the day of the year, range [1, 366], -1 indicates not known\ntm_isdst (int) -- 1 when in daylight savings, 0 when not, -1 if unknown.'), _('time.struct_time((tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst)) \nStructure used to capture a date and time. Note that it takes a tuple!\n\n\nParameters:\ntm_year (int) -- the year, 2017 for example\ntm_mon (int) -- the month, range [1, 12]\ntm_mday (int) -- the day of the month, range [1, 31]\ntm_hour (int) -- the hour, range [0, 23]\ntm_min (int) -- the minute, range [0, 59]\ntm_sec (int) -- the second, range [0, 61]\ntm_wday (int) -- the day of the week, range [0, 6], Monday is 0\ntm_yday (int) -- the day of the year, range [1, 366], -1 indicates not known\ntm_isdst (int) -- 1 when in daylight savings, 0 when not, -1 if unknown.'), _('touchio.TouchIn(pin) \nUse the TouchIn on the given pin.\n\n\nParameters:pin (Pin) -- the pin to read from'), _('touchio.TouchIn(pin) \nUse the TouchIn on the given pin.\n\n\nParameters:pin (Pin) -- the pin to read from'), _('touchio.TouchIn.deinit() \nDeinitialises the TouchIn and releases any hardware resources for reuse.\n'), _('touchio.TouchIn.deinit() \nDeinitialises the TouchIn and releases any hardware resources for reuse.\n'), _('touchio.TouchIn.raw_value() \nThe raw touch measurement as an int. (read-only)\n'), _('touchio.TouchIn.threshold() \nMinimum raw_value needed to detect a touch (and for value to be True).\nWhen the TouchIn object is created, an initial raw_value is read from the pin,\nand then threshold is set to be 100 + that value.\nYou can adjust threshold to make the pin more or less sensitive.\n'), _('touchio.TouchIn.value() \nWhether the touch pad is being touched or not.\n\n\n\n\nReturns:True when touched, False otherwise.\n\nReturn type:bool\n\n\n\n'), _('touchio.TouchIn.value() \nWhether the touch pad is being touched or not. (read-only)\nTrue when raw_value > threshold.\n'), _('usb_hid.Device() \nNot currently dynamically supported.\n\n'), _('usb_hid.Device() \nNot currently dynamically supported.\n\n'), _('usb_hid.Device.send_report(buf) \nSend a HID report.\n'), _('usb_hid.Device.send_report(buf) \nSend a HID report.\n'), _('usb_hid.Device.usage() \nThe functionality of the device. For example Keyboard is 0x06 within the\ngeneric desktop usage page 0x01. Mouse is 0x02 within the same usage\npage.\n\n\n\n\nReturns:the usage within the usage page\n\nReturn type:int\n\n\n\n'), _('usb_hid.Device.usage() \nThe functionality of the device as an int. (read-only)\nFor example, Keyboard is 0x06 within the generic desktop usage page 0x01.\nMouse is 0x02 within the same usage page.\n'), _('usb_hid.Device.usage_page() \nThe usage page of the device. Can be thought of a category.\n\n\n\n\nReturns:the device’s usage page\n\nReturn type:int\n\n\n\n'), _('usb_hid.Device.usage_page() \nThe usage page of the device as an int. Can be thought of a category. (read-only)\n'), ] mu-editor-1.0.2+dfsg/mu/modes/api/microbit.py000066400000000000000000000712041341747546300210430ustar00rootroot00000000000000""" Contains definitions for the MicroPython micro:bit related APIs so they can be used in the editor for autocomplete and call tips. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ MICROBIT_APIS = [ # RNG _("random.getrandbits(n) \nReturn an integer with n random bits."), _("random.seed(n) \nInitialise the random number generator with a known integer 'n'."), _("random.randint(a, b) \nReturn a random whole number between a and b (inclusive)."), _("random.randrange(stop) \nReturn a random whole number between 0 and up to (but not including) stop."), _("random.choice(seq) \nReturn a randomly selected element from a sequence of objects (such as a list)."), _("random.random() \nReturn a random floating point number between 0.0 and 1.0."), _("random.uniform(a, b) \nReturn a random floating point number between a and b (inclusive)."), # OS _("os.listdir() \nReturn a list of the names of all the files contained within the local\non-device file system."), _("os.remove(filename) \nRemove (delete) the file named filename."), _("os.size(filename) \nReturn the size, in bytes, of the file named filename."), _("os.uname() \nReturn information about MicroPython and the device."), # SYS _("sys.version"), _("sys.version_info"), _("sys.implementation"), _("sys.platform"), _("sys.byteorder"), _("sys.print_exception(ex) \nPrint to the REPL information about the exception 'ex'."), # System state objects. _("microbit.panic() \nPut micro:bit in panic() mode and display an unhappy face.\nPress the reset button to exit panic() mode."), _("microbit.sleep(time) \nPut micro:bit to sleep for some milliseconds (1 second = 1000 ms) of time.\nsleep(2000) gives micro:bit a 2 second nap."), _("microbit.running_time() \nReturn running_time() in milliseconds since micro:bit's last reset."), _("microbit.temperature() \nReturn micro:bit's temperature in degrees Celcius."), # Accelerometer 3D orientation _("microbit.accelerometer.get_x() \nReturn micro:bit's tilt (X acceleration) in milli-g's."), _("microbit.accelerometer.get_y() \nReturn micro:bit's tilt (Y acceleration) in milli-g's."), _("microbit.accelerometer.get_z() \nReturn micro:bit's up-down motion (Z acceleration) in milli-g's.\nZ is a positive number when moving up. Moving down, Z is a negative number."), _("microbit.accelerometer.is_gesture(name) \nReturn True or False to indicate if the named gesture is currently active.\nMicroPython understands the following gestures: 'up', 'down', 'left', 'right',\n'face up', 'face down', 'freefall', '3g', '6g', '8g' and 'shake'."), _("microbit.accelerometer.was_gesture(name) \nReturn True or False to indicate if the named gesture was active since the\nlast call.\nMicroPython understands the following gestures: 'up', 'down', 'left', 'right',\n'face up', 'face down', 'freefall', '3g', '6g', '8g' and 'shake'."), _("microbit.accelerometer.get_gestures() \nReturn a list indicating the gesture history. The most recent gesture is last.\nCalling this method also clears the gesture history.\nMicroPython understands the following gestures: 'up', 'down', 'left', 'right',\n'face up', 'face down', 'freefall', '3g', '6g', '8g' and 'shake'."), _("microbit.accelerometer.get_values() \nGet the acceleration measurements in all axes at once, as a three-element tuple of integers ordered as X, Y, Z."), # Pushbutton _("microbit.button_a.is_pressed() \nIf button A is pressed down, is_pressed() is True, else False."), _("microbit.button_a.was_pressed() \nUse was_pressed() to learn if button A was pressed since the last time\nwas_pressed() was called. Returns True or False."), _("microbit.button_a.get_presses() \nUse get_presses() to get the running total of button presses, and also\nreset this counter to zero."), _("microbit.button_b.is_pressed() \nIf button B is pressed down, is_pressed() is True, else False."), _("microbit.button_b.was_pressed() \nUse was_pressed() to learn if button B was pressed since the last time\nwas_pressed() was called. Returns True or False."), _("microbit.button_b.get_presses() \nUse get_presses() to get the running total of button presses, and also\nreset this counter to zero."), # Compass 3D direction heading _("microbit.compass.is_calibrated() \nIf micro:bit's compass is_calibrated() and adjusted for accuracy, return True.\nIf compass hasn't been adjusted for accuracy, return False."), _("microbit.compass.calibrate() \nIf micro:bit is confused, calibrate() the compass to adjust the its accuracy.\nWill ask you to rotate the device to draw a circle on the display. Afterwards, micro:bit will know which way is north."), _("microbit.compass.clear_calibration() \nReset micro:bit's compass using clear_calibration() command.\nRun calibrate() to improve accuracy."), _("microbit.compass.get_x() \nReturn magnetic field detected along micro:bit's X axis.\nUsually, the compass returns the earth's magnetic field in micro-Tesla units.\nUnless...a strong magnet is nearby!"), _("microbit.compass.get_y() \nReturn magnetic field detected along micro:bit's Y axis.\nUsually, the compass returns the earth's magnetic field in micro-Tesla units.\nUnless...a strong magnet is nearby!"), _("microbit.compass.get_z() \nReturn magnetic field detected along micro:bit's Z axis.\nUsually, the compass returns the earth's magnetic field in micro-Tesla units.\nUnless...a strong magnet is nearby!"), _("microbit.compass.get_field_strength() \nReturn strength of magnetic field around micro:bit."), _("microbit.compass.heading() \nReturn a number between 0-360 indicating the device's heading. 0 is north."), # Display 5x5 LED grid _("microbit.display.show(x, delay=400, wait=True, loop=False, clear=False) \nUse show(x) to print the string or image 'x' to the display. If 'x' is a list\nof images they will be animated together.\nUse 'delay' to specify the speed of frame changes in milliseconds.\nIf wait is False animation will happen in the background while the program continues.\nIf loop is True the animation will repeat forever.\nIf clear is True the display will clear at the end of the animation."), _("microbit.display.scroll(string, delay=150, wait=True, loop=False, monospace=False) \nUse scroll(string) to scroll the string across the display.\nUse delay to control how fast the text scrolls.\nIf wait is False the text will scroll in the background while the program continues.\nIf loop is True the text will repeat forever.\nIf monospace is True the characters will always take up 5 pixel-columns."), _("microbit.display.clear() \nUse clear() to clear micro:bit's display."), _("microbit.display.get_pixel(x, y) \nUse get_pixel(x, y) to return the display's brightness at LED pixel (x,y).\nBrightness can be from 0 (LED is off) to 9 (maximum LED brightness)."), _("microbit.display.set_pixel(x, y, b) \nUse set_pixel(x, y, b) to set the display at LED pixel (x,y) to brightness 'b'\nwhich can be set between 0 (off) to 9 (full brightness)."), _("microbit.display.on() \nUse on() to turn on the display."), _("microbit.display.off() \nUse off() to turn off the display."), _("microbit.display.is_on() \nUse is_on() to query if the micro:bit's display is on (True) or off (False)."), # Pins _("microbit.pin0.is_touched() \nIf pin0 is_touched() on micro:bit, return True. If nothing is touching the\npin, return False."), _("microbit.pin0.read_digital() \nread_digital() value from pin0. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin0.write_digital(value) \nSet pin0 to output high if value is 1, or to low, it it is 0."), _("microbit.pin0.read_analog() \nRead the voltage applied to pin0. Return the reading as a number between\n0 (meaning 0v) and 1023 (meaning 3.3v)."), _("microbit.pin0.write_analog(value) \nSet pin0 to output a value between 0 and 1023."), _("microbit.pin0.set_analog_period(period) \nSet the period of the PWM signal output to period milliseconds."), _("microbit.pin0.set_analog_period_microseconds(period) \nSet the period of the PWM signal output to period microseconds."), _("microbit.pin1.is_touched() \nIf pin1 is_touched() on micro:bit, return True. If nothing is touching the\npin, return False."), _("microbit.pin1.read_digital() \nread_digital() value from pin1. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin1.write_digital(value) \nSet pin1 to output high if value is 1, or to low, it it is 0."), _("microbit.pin1.read_analog() \nRead the voltage applied to pin1. Return the reading as a number between\n0 (meaning 0v) and 1023 (meaning 3.3v)."), _("microbit.pin1.write_analog(value) \nSet pin1 to output a value between 0 and 1023."), _("microbit.pin1.set_analog_period(period) \nSet the period of the PWM signal output to period milliseconds."), _("microbit.pin1.set_analog_period_microseconds(period) \nSet the period of the PWM signal output to period microseconds."), _("microbit.pin2.is_touched() \nIf pin2 is_touched() on micro:bit, return True. If nothing is touching the\npin, return False."), _("microbit.pin2.read_digital() \nread_digital() value from pin2. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin2.write_digital(value) \nSet pin2 to output high if value is 1, or to low, it it is 0."), _("microbit.pin2.read_analog() \nRead the voltage applied to pin2. Return the reading as a number between\n0 (meaning 0v) and 1023 (meaning 3.3v)."), _("microbit.pin2.write_analog(value) \nSet pin2 to output a value between 0 and 1023."), _("microbit.pin2.set_analog_period(period) \nSet the period of the PWM signal output to period milliseconds."), _("microbit.pin2.set_analog_period_microseconds(period) \nSet the period of the PWM signal output to period microseconds."), _("microbit.pin3.read_digital() \nread_digital() value from pin3. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin2.write_digital(value) \nSet pin3 to output high if value is 1, or to low, it it is 0."), _("microbit.pin3.read_analog() \nRead the voltage applied to pin3. Return the reading as a number between\n0 (meaning 0v) and 1023 (meaning 3.3v)."), _("microbit.pin3.write_analog(value) \nSet pin3 to output a value between 0 and 1023."), _("microbit.pin3.set_analog_period(period) \nSet the period of the PWM signal output to period milliseconds."), _("microbit.pin3.set_analog_period_microseconds(period) \nSet the period of the PWM signal output to period microseconds."), _("microbit.pin4.read_digital() \nread_digital() value from pin4. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin4.write_digital(value) \nSet pin4 to output high if value is 1, or to low, it it is 0."), _("microbit.pin4.read_analog() \nRead the voltage applied to pin4. Return the reading as a number between\n0 (meaning 0v) and 1023 (meaning 3.3v)."), _("microbit.pin4.write_analog(value) \nSet pin4 to output a value between 0 and 1023."), _("microbit.pin4.set_analog_period(period) \nSet the period of the PWM signal output to period milliseconds."), _("microbit.pin4.set_analog_period_microseconds(period) \nSet the period of the PWM signal output to period microseconds."), _("microbit.pin5.read_digital() \nread_digital() value from pin5. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin5.write_digital(value) \nSet pin5 to output high if value is 1, or to low, it it is 0."), _("microbit.pin6.read_digital() \nread_digital() value from pin6. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin6.write_digital(value) \nSet pin6 to output high if value is 1, or to low, it it is 0."), _("microbit.pin7.read_digital() \nread_digital() value from pin7. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin7.write_digital(value) \nSet pin7 to output high if value is 1, or to low, it it is 0."), _("microbit.pin8.read_digital() \nread_digital() value from pin8. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin8.write_digital(value) \nSet pin8 to output high if value is 1, or to low, it it is 0."), _("microbit.pin9.read_digital() \nread_digital() value from pin9. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin9.write_digital(value) \nSet pin9 to output high if value is 1, or to low, it it is 0."), _("microbit.pin10.read_digital() \nread_digital() value from pin10. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin10.write_digital(value) \nSet pin10 to output high if value is 1, or to low, it it is 0."), _("microbit.pin10.read_analog() \nRead the voltage applied to pin10. Return the reading as a number between\n0 (meaning 0v) and 1023 (meaning 3.3v)."), _("microbit.pin10.write_analog(value) \nSet pin10 to output a value between 0 and 1023."), _("microbit.pin10.set_analog_period(period) \nSet the period of the PWM signal output to period milliseconds."), _("microbit.pin10.set_analog_period_microseconds(period) \nSet the period of the PWM signal output to period microseconds."), _("microbit.pin11.read_digital() \nread_digital() value from pin11. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin11.write_digital(value) \nSet pin11 to output high if value is 1, or to low, it it is 0."), _("microbit.pin12.read_digital() \nread_digital() value from pin12. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin12.write_digital(value) \nSet pin12 to output high if value is 1, or to low, it it is 0."), _("microbit.pin13.read_digital() \nread_digital() value from pin13. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin13.write_digital(value) \nSet pin13 to output high if value is 1, or to low, it it is 0."), _("microbit.pin14.read_digital() \nread_digital() value from pin14. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin14.write_digital(value) \nSet pin14 to output high if value is 1, or to low, it it is 0."), _("microbit.pin15.read_digital() \nread_digital() value from pin15. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin15.write_digital(value) \nSet pin15 to output high if value is 1, or to low, it it is 0."), _("microbit.pin16.read_digital() \nread_digital() value from pin16. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin16.write_digital(value) \nSet pin16 to output high if value is 1, or to low, it it is 0."), _("microbit.pin19.read_digital() \nread_digital() value from pin19. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin19.write_digital(value) \nSet pin19 to output high if value is 1, or to low, it it is 0."), _("microbit.pin20.read_digital() \nread_digital() value from pin20. The reading will be either 0 (lo) or 1 (hi)."), _("microbit.pin20.write_digital(value) \nSet pin20 to output high if value is 1, or to low, it it is 0."), # I2C _("microbit.i2c.read(address, n, repeat=False) \nUse read(address, n) to read 'n' bytes from the device with the 7-bit address.\nIf repeat is True, no stop bit will be sent."), _("microbit.i2c.write(adress, buffer, repeat=False) \nUse write(address, buffer) to write to the 'buffer' of the device at the 7-bit 'address'.\nIf repeat is True, no stop bit will be sent."), _("microbit.i2c.init(frequency, scl, sda) \nUse init(frequency, scl, sda) to set the bus frequency and pins."), # Image _("microbit.Image(string) \nCreate and use built-in IMAGES to show on the display. Use:\nImage(\n '09090:'\n '99999:'\n '99999:'\n '09990:'\n '00900:')\n...to make a new 5x5 heart image. Numbers go from 0 (off) to 9 (brightest). Note\nthe colon ':' to set the end of a row."), _("microbit.Image.width() \nReturn the width of the image in pixels."), _("microbit.Image.height() \nReturn the height of the image in pixels."), _("microbit.Image.get_pixel(x, y) \nUse get_pixel(x, y) to return the image's brightness at LED pixel (x,y).\nBrightness can be from 0 (LED is off) to 9 (maximum LED brightness)."), _("microbit.Image.set_pixel(x, y, b) \nUse set_pixel(x, y, b) to set the LED pixel (x,y) in the image to brightness\n'b' which can be set between 0 (off) to 9 (full brightness)."), _("microbit.Image.shift_left(n) \nUse shift_left(n) to make a copy of the image but moved 'n' pixels to the left."), _("microbit.Image.shift_right(n) \nUse shift_right(n) to make a copy of the image but moved 'n' pixels to\nthe right."), _("microbit.Image.shift_up(n) \nUse shift_up(n) to make a copy of the image but moved 'n' pixels up."), _("microbit.Image.shift_down(n) \nUse shift_down(n) to make a copy of the image but moved 'n' pixels down."), _("microbit.Image.copy() \nUse copy() to make a new exact copy of the image."), _("microbit.Image.crop(x1, y1, x2, y2) \nUse crop(x1, y1, x2, y2) to make a cut-out copy of the image where coordinate\n(x1,y1) is the top left corner of the cut-out area and coordinate (x2,y2) is the\nbottom right corner."), _("microbit.Image.invert() \nUse invert() to make a negative copy of the image. Where a pixel was bright or\non in the original, it is dim or off in the negative copy."), _("microbit.Image.HEART"), _("microbit.Image.HEART_SMALL"), _("microbit.Image.HAPPY"), _("microbit.Image.SMILE"), _("microbit.Image.SAD"), _("microbit.Image.CONFUSED"), _("microbit.Image.ANGRY"), _("microbit.Image.ASLEEP"), _("microbit.Image.SURPRISED"), _("microbit.Image.SILLY"), _("microbit.Image.FABULOUS"), _("microbit.Image.MEH"), _("microbit.Image.YES"), _("microbit.Image.NO"), _("microbit.Image.CLOCK12"), _("microbit.Image.CLOCK11"), _("microbit.Image.CLOCK10"), _("microbit.Image.CLOCK9"), _("microbit.Image.CLOCK8"), _("microbit.Image.CLOCK7"), _("microbit.Image.CLOCK6"), _("microbit.Image.CLOCK5"), _("microbit.Image.CLOCK4"), _("microbit.Image.CLOCK3"), _("microbit.Image.CLOCK2"), _("microbit.Image.CLOCK1"), _("microbit.Image.ARROW_N"), _("microbit.Image.ARROW_NE"), _("microbit.Image.ARROW_E"), _("microbit.Image.ARROW_SE"), _("microbit.Image.ARROW_S"), _("microbit.Image.ARROW_SW"), _("microbit.Image.ARROW_W"), _("microbit.Image.ARROW_NW"), _("microbit.Image.TRIANGLE"), _("microbit.Image.TRIANGLE_LEFT"), _("microbit.Image.CHESSBOARD"), _("microbit.Image.DIAMOND"), _("microbit.Image.DIAMOND_SMALL"), _("microbit.Image.SQUARE"), _("microbit.Image.SQUARE_SMALL"), _("microbit.Image.RABBIT"), _("microbit.Image.COW"), _("microbit.Image.MUSIC_CROTCHET"), _("microbit.Image.MUSIC_QUAVER"), _("microbit.Image.MUSIC_QUAVERS"), _("microbit.Image.PITCHFORK"), _("microbit.Image.XMAS"), _("microbit.Image.PACMAN"), _("microbit.Image.TARGET"), _("microbit.Image.TSHIRT"), _("microbit.Image.ROLLERSKATE"), _("microbit.Image.DUCK"), _("microbit.Image.HOUSE"), _("microbit.Image.TORTOISE"), _("microbit.Image.BUTTERFLY"), _("microbit.Image.STICKFIGURE"), _("microbit.Image.GHOST"), _("microbit.Image.SWORD"), _("microbit.Image.GIRAFFE"), _("microbit.Image.SKULL"), _("microbit.Image.UMBRELLA"), _("microbit.Image.SNAKE"), _("microbit.Image.ALL_CLOCKS"), _("microbit.Image.ALL_ARROWS"), # uart _("microbit.uart.init(baudrate=9600, bits=8, parity=None, stop=1, tx=None, rx=None) \nUse init() to set up communication using the default values. \nOtherwise override the defaults as named arguments."), _("microbit.uart.any() \nIf there are incoming characters waiting to be read, any() will return True.\nOtherwise, returns False."), _("microbit.uart.read(n) \nUse read() to read characters.\nUse read(n) to read, at most, 'n' bytes of data."), _("microbit.uart.readall() \nUse readall() to read as much data as possible."), _("microbit.uart.readline() \nUse readline() to read a line that ends with a newline character."), _("microbit.uart.readinto(buf, n) \nUse readinto(buf) to read bytes into the buffer 'buf'.\nUse readinto(buff, n) to read, at most, 'n' number of bytes into 'buf'."), _("microbit.uart.write() \nUse write(buf) to write the bytes in buffer 'buf' to the connected device."), # SPI _("microbit.spi.init(baudrate=1000000, bits=8, mode=0, sclk=pin13, mosi=pin15, miso=pin14) \nSet up communication. Override the defaults for baudrate, mode,\nSCLK, MOSI and MISO. The default connections are pin13 for SCLK, pin15 for\nMOSI and pin14 for MISO."), _("microbit.spi.write(buf) \nUse write(buf) to write bytes in buffer 'buf' to the connected device."), _("microbit.spi.read(n) \nUse read(n) to read 'n' bytes of data."), _("microbit.spi.write_readinto(out, in) \nUse write_readinto(out, in) to write the 'out' buffer to the connected device\nand read any response into the 'in' buffer. The length of the buffers should\nbe the same. The buffers can be the same object."), # Music module _("music.set_tempo(number, bpm) \nMake a beat last a 'number' of ticks long and\nplayed at 'bpm' beats per minute."), _("music.pitch(freq, length=-1, pin=microbit.pin0, wait=True) \nMake micro:bit play a note at 'freq' frequency for\n'length' milliseconds. E.g. pitch(440, 1000) will play concert 'A' for 1 second.\nIf length is a negative number the pitch is played continuously.\nUse the optional pin argument to override the default output for the speaker.\nIf wait is False the music will play in the background while the program\ncontinues."), _("music.play(music, pin=microbit.pin0, wait=True, loop=False) \nMake micro:bit play 'music' list of notes. Try out the built in music to see\nhow it works. E.g. music.play(music.PUNCHLINE).\nUse the optional pin argument to override the default output for the speaker.\nIf wait is False the music will play in the background while the program\ncontinues.\nIf loop is True, the tune will repeat."), _("music.get_tempo() \nReturn the number of ticks in a beat and number of beats per minute."), _("music.stop(pin=microbit.pin0) \nStops all music playback on the given pin. If no pin is given, pin0 is assumed."), _("music.reset()\nIf things go wrong, reset() the music to its default settings."), _("music.DADADADUM"), _("music.ENTERTAINER"), _("music.PRELUDE"), _("music.ODE"), _("music.NYAN"), _("music.RINGTONE"), _("music.FUNK"), _("music.BLUES"), _("music.BIRTHDAY"), _("music.WEDDING"), _("music.FUNERAL"), _("music.PUNCHLINE"), _("music.PYTHON"), _("music.BADDY"), _("music.CHASE"), _("music.BA_DING"), _("music.WAWAWAWAA"), _("music.JUMP_UP"), _("music.JUMP_DOWN"), _("music.POWER_UP"), _("music.POWER_DOWN"), # Antigravity _("antigravity"), # This module _("this.authors() \nUse authors() to reveal the names of the people who created this software."), # Love module _("love.badaboom()\nHear my soul speak:\nThe very instant that I saw you, did\nMy heart fly to your service."), # NeoPixel module _("neopixel.NeoPixel(pin, n) \nCreate a list representing a strip of 'n' neopixels controlled from the\nspecified pin (e.g. microbit.pin0).\nUse the resulting object to change each pixel by position (starting from 0).\nIndividual pixels are given RGB (red, green, blue) values between 0-255 as a\ntupe. For example, (255, 255, 255) is white:\n\nnp = neopixel.NeoPixel(microbit.pin0, 8)\nnp[0] = (255, 0, 128)\nnp.show()"), _("neopixel.NeoPixel.clear() \nClear all the pixels."), _("neopixel.NeoPixel.show() \nShow the pixels. Must be called for any updates to become visible."), # Radio _("radio.on() \nTurns on the radio. This needs to be called since the radio draws power and\ntakes up memory that you may otherwise need."), _("radio.off() \nTurns off the radio, thus saving power and memory."), _("radio.config(length=32, queue=3, channel=7, power=0, address=0x75626974, group=0, data_rate=radio.RATE_1MBIT) \nConfigures the various settings relating to the radio. The specified default\nvalues are sensible.\n'length' is the maximum length, in bytes, of a message. It can be up to 251\nbytes long.\n'queue' is the number of messages to store on the message queue.\n'channel' (0-100) defines the channel to which the radio is tuned.\n'address' is an arbitrary 32-bit address that's used to filter packets.\n'group' is an 8-bit value used with 'address' when filtering packets.\n'data_rate' is the throughput speed. It can be one of: radio.RATE_250KbIT,\nradio.RATE_1MbIT (the default) or radio.2MBIT."), _("radio.reset() \nReset the settings to their default value."), _("radio.send_bytes(message) \nSends a message containing bytes."), _("radio.receive_bytes() \nReceive the next incoming message from the message queue. Returns 'None' if\nthere are no pending messages. Messages are returned as bytes."), _("radio.send(message) \nSend a message string."), _("radio.receive() \nReceive the next incoming message from the message queue as a string. Returns\n'None' if there are no pending messages."), _("radio.RATE_250KBIT"), _("radio.RATE_1MBIT"), _("radio.RATE_2MBIT"), # Audio _("audio.play(source, wait=True, pins=(pin0, pin1)) \nPlay the source to completion where 'source' is an iterable, each element of\nwhich must be an AudioFrame instance."), _("audio.AudioFrame()() \nRepresents a list of 32 samples each of which is a signed byte. It takes just\nover 4ms to play a single frame."), # Speech _("speech.translate(words) \nReturn a string containing the phonemes for the English words in the string\n'words'."), _("speech.say(words, pitch=64, speed=72, mouth=128, throat=128) \nSay the English words in the string 'words'. Override the optional pitch,\nspeed, mouth and throat settings to change the tone of voice."), _("speech.pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128) \nPronounce the phonemes in the string 'phonemes'. Override the optional pitch,\nspeed, mouth and throat settings to change the tone of voice."), _("speech.sing(song, pitch=64, speed=72, mouth=128, throat=128) \nSing the phonemes in the string 'song'. Add pitch information to a phoneme\nwith a hash followed by a number between 1-255 like this: '#112DOWWWWWWWW'.\nOverride the optional pitch, speed, mouth and throat settings to change the\ntone of voice."), # Math functions _("math.sqrt(x) \nReturn the square root of 'x'."), _("math.pow(x, y) \nReturn 'x' raised to the power 'y'."), _("math.exp(x) \nReturn math.e**'x'."), _("math.log(x, base=math.e) \nWith one argument, return the natural logarithm of 'x' (to base e).\nWith two arguments, return the logarithm of 'x' to the given 'base'."), _("math.cos(x) \nReturn the cosine of 'x' radians."), _("math.sin(x) \nReturn the sine of 'x' radians."), _("math.tan(x) \nReturn the tangent of 'x' radians."), _("math.acos(x) \nReturn the arc cosine of 'x', in radians."), _("math.asin(x) \nReturn the arc sine of 'x', in radians."), _("math.atan(x) \nReturn the arc tangent of 'x', in radians."), _("math.atan2(x, y) \nReturn atan(y / x), in radians."), _("math.ceil(x) \nReturn the ceiling of 'x', the smallest integer greater than or equal to 'x'."), _("math.copysign(x, y) \nReturn a float with the magnitude (absolute value) of 'x' but the sign of 'y'. "), _("math.fabs(x) \nReturn the absolute value of 'x'."), _("math.floor(x) \nReturn the floor of 'x', the largest integer less than or equal to 'x'."), _("math.fmod(x, y) \nReturn 'x' modulo 'y'."), _("math.frexp(x) \nReturn the mantissa and exponent of 'x' as the pair (m, e). "), _("math.ldexp(x, i) \nReturn 'x' * (2**'i')."), _("math.modf(x) \nReturn the fractional and integer parts of x.\nBoth results carry the sign of x and are floats."), _("math.isfinite(x) \nReturn True if 'x' is neither an infinity nor a NaN, and False otherwise."), _("math.isinf(x) \nReturn True if 'x' is a positive or negative infinity, and False otherwise."), _("math.isnan(x) \nReturn True if 'x' is a NaN (not a number), and False otherwise."), _("math.trunc(x) \nReturn the Real value 'x' truncated to an Integral (usually an integer)."), _("math.radians(x) \nConvert angle 'x' from degrees to radians."), _("math.degrees(x) \nConvert angle 'x' from radians to degrees."), ] mu-editor-1.0.2+dfsg/mu/modes/api/pi.py000066400000000000000000003357061341747546300176550ustar00rootroot00000000000000""" Contains definitions for Python 3 APIs so they can be used in the editor for autocomplete and call tips. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ PI_APIS = [ _("gpiozero.AnalogInputDevice(*args, **kwargs) \nRepresents an analog input device connected to SPI (serial interface).\n\nTypical analog input devices are `analog to digital converters`_ (ADCs).\nSeveral classes are provided for specific ADC chips, including\n:class:`MCP3004`, :class:`MCP3008`, :class:`MCP3204`, and :class:`MCP3208`.\n\nThe following code demonstrates reading the first channel of an MCP3008\nchip attached to the Pi's SPI pins::\n\n from gpiozero import MCP3008\n\n pot = MCP3008(0)\n print(pot.value)\n\nThe :attr:`value` attribute is normalized such that its value is always\nbetween 0.0 and 1.0 (or in special cases, such as differential sampling,\n-1 to +1). Hence, you can use an analog input to control the brightness of\na :class:`PWMLED` like so::\n\n from gpiozero import MCP3008, PWMLED\n\n pot = MCP3008(0)\n led = PWMLED(17)\n led.source = pot.values\n\n.. _analog to digital converters: https://en.wikipedia.org/wiki/Analog-to-digital_converter"), _("gpiozero.AngularServo(*args, **kwargs) \nExtends :class:`Servo` and represents a rotational PWM-controlled servo\nmotor which can be set to particular angles (assuming valid minimum and\nmaximum angles are provided to the constructor).\n\nConnect a power source (e.g. a battery pack or the 5V pin) to the power\ncable of the servo (this is typically colored red); connect the ground\ncable of the servo (typically colored black or brown) to the negative of\nyour battery pack, or a GND pin; connect the final cable (typically colored\nwhite or orange) to the GPIO pin you wish to use for controlling the servo.\n\nNext, calibrate the angles that the servo can rotate to. In an interactive\nPython session, construct a :class:`Servo` instance. The servo should move\nto its mid-point by default. Set the servo to its minimum value, and\nmeasure the angle from the mid-point. Set the servo to its maximum value,\nand again measure the angle::\n\n >>> from gpiozero import Servo\n >>> s = Servo(17)\n >>> s.min() # measure the angle\n >>> s.max() # measure the angle\n\nYou should now be able to construct an :class:`AngularServo` instance\nwith the correct bounds::\n\n >>> from gpiozero import AngularServo\n >>> s = AngularServo(17, min_angle=-42, max_angle=44)\n >>> s.angle = 0.0\n >>> s.angle\n 0.0\n >>> s.angle = 15\n >>> s.angle\n 15.0\n\n.. note::\n\n You can set *min_angle* greater than *max_angle* if you wish to reverse\n the sense of the angles (e.g. ``min_angle=45, max_angle=-45``). This\n can be useful with servos that rotate in the opposite direction to your\n expectations of minimum and maximum.\n\n:param int pin:\n The GPIO pin which the device is attached to. See :ref:`pin_numbering`\n for valid pin numbers.\n\n:param float initial_angle:\n Sets the servo's initial angle to the specified value. The default is\n 0. The value specified must be between *min_angle* and *max_angle*\n inclusive. ``None`` means to start the servo un-controlled (see\n :attr:`value`).\n\n:param float min_angle:\n Sets the minimum angle that the servo can rotate to. This defaults to\n -90, but should be set to whatever you measure from your servo during\n calibration.\n\n:param float max_angle:\n Sets the maximum angle that the servo can rotate to. This defaults to\n 90, but should be set to whatever you measure from your servo during\n calibration.\n\n:param float min_pulse_width:\n The pulse width corresponding to the servo's minimum position. This\n defaults to 1ms.\n\n:param float max_pulse_width:\n The pulse width corresponding to the servo's maximum position. This\n defaults to 2ms.\n\n:param float frame_width:\n The length of time between servo control pulses measured in seconds.\n This defaults to 20ms which is a common value for servos."), _('gpiozero.BadEventHandler() \nError raised when an event handler with an incompatible prototype is specified'), _('gpiozero.BadQueueLen() \nError raised when non-positive queue length is specified'), _('gpiozero.BadWaitTime() \nError raised when an invalid wait time is specified'), _('gpiozero.Button(*args, **kwargs) \nExtends :class:`DigitalInputDevice` and represents a simple push button\nor switch.\n\nConnect one side of the button to a ground pin, and the other to any GPIO\npin. Alternatively, connect one side of the button to the 3V3 pin, and the\nother to any GPIO pin, then set *pull_up* to ``False`` in the\n:class:`Button` constructor.\n\nThe following example will print a line of text when the button is pushed::\n\n from gpiozero import Button\n\n button = Button(4)\n button.wait_for_press()\n print("The button was pressed!")\n\n:param int pin:\n The GPIO pin which the button is attached to. See :ref:`pin_numbering`\n for valid pin numbers.\n\n:param bool pull_up:\n If ``True`` (the default), the GPIO pin will be pulled high by default.\n In this case, connect the other side of the button to ground. If\n ``False``, the GPIO pin will be pulled low by default. In this case,\n connect the other side of the button to 3V3.\n\n:param float bounce_time:\n If ``None`` (the default), no software bounce compensation will be\n performed. Otherwise, this is the length of time (in seconds) that the\n component will ignore changes in state after an initial change.\n\n:param float hold_time:\n The length of time (in seconds) to wait after the button is pushed,\n until executing the :attr:`when_held` handler. Defaults to ``1``.\n\n:param bool hold_repeat:\n If ``True``, the :attr:`when_held` handler will be repeatedly executed\n as long as the device remains active, every *hold_time* seconds. If\n ``False`` (the default) the :attr:`when_held` handler will be only be\n executed once per hold.'), _("gpiozero.ButtonBoard(*args, **kwargs) \nExtends :class:`CompositeDevice` and represents a generic button board or\ncollection of buttons.\n\n:param int \\*pins:\n Specify the GPIO pins that the buttons of the board are attached to.\n You can designate as many pins as necessary.\n\n:param bool pull_up:\n If ``True`` (the default), the GPIO pins will be pulled high by\n default. In this case, connect the other side of the buttons to\n ground. If ``False``, the GPIO pins will be pulled low by default. In\n this case, connect the other side of the buttons to 3V3. This\n parameter can only be specified as a keyword parameter.\n\n:param float bounce_time:\n If ``None`` (the default), no software bounce compensation will be\n performed. Otherwise, this is the length of time (in seconds) that the\n buttons will ignore changes in state after an initial change. This\n parameter can only be specified as a keyword parameter.\n\n:param float hold_time:\n The length of time (in seconds) to wait after any button is pushed,\n until executing the :attr:`when_held` handler. Defaults to ``1``. This\n parameter can only be specified as a keyword parameter.\n\n:param bool hold_repeat:\n If ``True``, the :attr:`when_held` handler will be repeatedly executed\n as long as any buttons remain held, every *hold_time* seconds. If\n ``False`` (the default) the :attr:`when_held` handler will be only be\n executed once per hold. This parameter can only be specified as a\n keyword parameter.\n\n:param \\*\\*named_pins:\n Specify GPIO pins that buttons of the board are attached to,\n associating each button with a property name. You can designate as\n many pins as necessary and use any names, provided they're not already\n in use by something else."), _('gpiozero.Buzzer(*args, **kwargs) \nExtends :class:`DigitalOutputDevice` and represents a digital buzzer\ncomponent.\n\nConnect the cathode (negative pin) of the buzzer to a ground pin; connect\nthe other side to any GPIO pin.\n\nThe following example will sound the buzzer::\n\n from gpiozero import Buzzer\n\n bz = Buzzer(3)\n bz.on()\n\n:param int pin:\n The GPIO pin which the buzzer is attached to. See :ref:`pin_numbering`\n for valid pin numbers.\n\n:param bool active_high:\n If ``True`` (the default), the buzzer will operate normally with the\n circuit described above. If ``False`` you should wire the cathode to\n the GPIO pin, and the anode to a 3V3 pin.\n\n:param bool initial_value:\n If ``False`` (the default), the buzzer will be silent initially. If\n ``None``, the buzzer will be left in whatever state the pin is found in\n when configured for output (warning: this can be on). If ``True``, the\n buzzer will be switched on initially.'), _('gpiozero.CPUTemperature(*args, **kwargs) \nExtends :class:`InternalDevice` to provide a device which is active when\nthe CPU temperature exceeds the *threshold* value.\n\nThe following example plots the CPU\'s temperature on an LED bar graph::\n\n from gpiozero import LEDBarGraph, CPUTemperature\n from signal import pause\n\n # Use minimums and maximums that are closer to "normal" usage so the\n # bar graph is a bit more "lively"\n temp = CPUTemperature(min_temp=50, max_temp=90)\n graph = LEDBarGraph(5, 6, 13, 19, 25, pwm=True)\n graph.source = temp.values\n pause()\n\n:param str sensor_file:\n The file from which to read the temperature. This defaults to the\n sysfs file :file:`/sys/class/thermal/thermal_zone0/temp`. Whatever\n file is specified is expected to contain a single line containing the\n temperature in milli-degrees celsius.\n\n:param float min_temp:\n The temperature at which :attr:`value` will read 0.0. This defaults to\n 0.0.\n\n:param float max_temp:\n The temperature at which :attr:`value` will read 1.0. This defaults to\n 100.0.\n\n:param float threshold:\n The temperature above which the device will be considered "active".\n This defaults to 80.0.'), _("gpiozero.CamJamKitRobot(*args, **kwargs) \nExtends :class:`Robot` for the `CamJam #3 EduKit`_ robot controller.\n\nThe CamJam robot controller pins are fixed and therefore there's no need\nto specify them when constructing this class. The following example drives\nthe robot forward::\n\n from gpiozero import CamJamKitRobot\n\n robot = CamJamKitRobot()\n robot.forward()\n\n.. _CamJam #3 EduKit: http://camjam.me/?page_id=1035"), _('gpiozero.CompositeDevice(*args, **kwargs) \nExtends :class:`Device`. Represents a device composed of multiple devices\nlike simple HATs, H-bridge motor controllers, robots composed of multiple\nmotors, etc.\n\nThe constructor accepts subordinate devices as positional or keyword\narguments. Positional arguments form unnamed devices accessed via the\n:attr:`all` attribute, while keyword arguments are added to the device\nas named (read-only) attributes.\n\n:param list _order:\n If specified, this is the order of named items specified by keyword\n arguments (to ensure that the :attr:`value` tuple is constructed with a\n specific order). All keyword arguments *must* be included in the\n collection. If omitted, an alphabetically sorted order will be selected\n for keyword arguments.'), _("gpiozero.CompositeDeviceBadDevice() \nError raised when a composite device is constructed with an object that doesn't inherit from :class:`Device`"), _('gpiozero.CompositeDeviceBadName() \nError raised when a composite device is constructed with a reserved name'), _('gpiozero.CompositeDeviceBadOrder() \nError raised when a composite device is constructed with an incomplete order'), _('gpiozero.CompositeDeviceError() \nBase class for errors specific to the CompositeDevice hierarchy'), _('gpiozero.CompositeOutputDevice(*args, **kwargs) \nExtends :class:`CompositeDevice` with :meth:`on`, :meth:`off`, and\n:meth:`toggle` methods for controlling subordinate output devices. Also\nextends :attr:`value` to be writeable.\n\n:param list _order:\n If specified, this is the order of named items specified by keyword\n arguments (to ensure that the :attr:`value` tuple is constructed with a\n specific order). All keyword arguments *must* be included in the\n collection. If omitted, an alphabetically sorted order will be selected\n for keyword arguments.'), _('gpiozero.Device(*args, **kwargs) \nRepresents a single device of any type; GPIO-based, SPI-based, I2C-based,\netc. This is the base class of the device hierarchy. It defines the\nbasic services applicable to all devices (specifically thhe :attr:`is_active`\nproperty, the :attr:`value` property, and the :meth:`close` method).'), _('gpiozero.DeviceClosed() \nError raised when an operation is attempted on a closed device'), _('gpiozero.DigitalInputDevice(*args, **kwargs) \nRepresents a generic input device with typical on/off behaviour.\n\nThis class extends :class:`InputDevice` with machinery to fire the active\nand inactive events for devices that operate in a typical digital manner:\nstraight forward on / off states with (reasonably) clean transitions\nbetween the two.\n\n:param float bounce_time:\n Specifies the length of time (in seconds) that the component will\n ignore changes in state after an initial change. This defaults to\n ``None`` which indicates that no bounce compensation will be performed.'), _('gpiozero.DigitalOutputDevice(*args, **kwargs) \nRepresents a generic output device with typical on/off behaviour.\n\nThis class extends :class:`OutputDevice` with a :meth:`blink` method which\nuses an optional background thread to handle toggling the device state\nwithout further interaction.'), _("gpiozero.DistanceSensor(*args, **kwargs) \nExtends :class:`SmoothedInputDevice` and represents an HC-SR04 ultrasonic\ndistance sensor, as found in the `CamJam #3 EduKit`_.\n\nThe distance sensor requires two GPIO pins: one for the *trigger* (marked\nTRIG on the sensor) and another for the *echo* (marked ECHO on the sensor).\nHowever, a voltage divider is required to ensure the 5V from the ECHO pin\ndoesn't damage the Pi. Wire your sensor according to the following\ninstructions:\n\n1. Connect the GND pin of the sensor to a ground pin on the Pi.\n\n2. Connect the TRIG pin of the sensor a GPIO pin.\n\n3. Connect a 330Ω resistor from the ECHO pin of the sensor to a different\n GPIO pin.\n\n4. Connect a 470Ω resistor from ground to the ECHO GPIO pin. This forms\n the required voltage divider.\n\n5. Finally, connect the VCC pin of the sensor to a 5V pin on the Pi.\n\nThe following code will periodically report the distance measured by the\nsensor in cm assuming the TRIG pin is connected to GPIO17, and the ECHO\npin to GPIO18::\n\n from gpiozero import DistanceSensor\n from time import sleep\n\n sensor = DistanceSensor(echo=18, trigger=17)\n while True:\n print('Distance: ', sensor.distance * 100)\n sleep(1)\n\n:param int echo:\n The GPIO pin which the ECHO pin is attached to. See\n :ref:`pin_numbering` for valid pin numbers.\n\n:param int trigger:\n The GPIO pin which the TRIG pin is attached to. See\n :ref:`pin_numbering` for valid pin numbers.\n\n:param int queue_len:\n The length of the queue used to store values read from the sensor.\n This defaults to 30.\n\n:param float max_distance:\n The :attr:`value` attribute reports a normalized value between 0 (too\n close to measure) and 1 (maximum distance). This parameter specifies\n the maximum distance expected in meters. This defaults to 1.\n\n:param float threshold_distance:\n Defaults to 0.3. This is the distance (in meters) that will trigger the\n ``in_range`` and ``out_of_range`` events when crossed.\n\n:param bool partial:\n When ``False`` (the default), the object will not return a value for\n :attr:`~SmoothedInputDevice.is_active` until the internal queue has\n filled with values. Only set this to ``True`` if you require values\n immediately after object construction.\n\n.. _CamJam #3 EduKit: http://camjam.me/?page_id=1035"), _('gpiozero.Energenie(*args, **kwargs) \nExtends :class:`Device` to represent an `Energenie socket`_ controller.\n\nThis class is constructed with a socket number and an optional initial\nstate (defaults to ``False``, meaning off). Instances of this class can\nbe used to switch peripherals on and off. For example::\n\n from gpiozero import Energenie\n\n lamp = Energenie(1)\n lamp.on()\n\n:param int socket:\n Which socket this instance should control. This is an integer number\n between 1 and 4.\n\n:param bool initial_value:\n The initial state of the socket. As Energenie sockets provide no\n means of reading their state, you must provide an initial state for\n the socket, which will be set upon construction. This defaults to\n ``False`` which will switch the socket off.\n\n.. _Energenie socket: https://energenie4u.co.uk/index.php/catalogue/product/ENER002-2PI'), _('gpiozero.EnergenieBadSocket() \nError raised when an invalid socket number is passed to :class:`Energenie`'), _('gpiozero.EnergenieSocketMissing() \nError raised when socket number is not specified'), _('gpiozero.EventsMixin(*args, **kwargs) \nAdds edge-detected :meth:`when_activated` and :meth:`when_deactivated`\nevents to a device based on changes to the :attr:`~Device.is_active`\nproperty common to all devices. Also adds :meth:`wait_for_active` and\n:meth:`wait_for_inactive` methods for level-waiting.\n\n.. note::\n\n Note that this mixin provides no means of actually firing its events;\n call :meth:`_fire_events` in sub-classes when device state changes to\n trigger the events. This should also be called once at the end of\n initialization to set initial states.'), _("gpiozero.FishDish(*args, **kwargs) \nExtends :class:`TrafficLightsBuzzer` for the `Pi Supply FishDish`_: traffic\nlight LEDs, a button and a buzzer.\n\nThe FishDish pins are fixed and therefore there's no need to specify them\nwhen constructing this class. The following example waits for the button\nto be pressed on the FishDish, then turns on all the LEDs::\n\n from gpiozero import FishDish\n\n fish = FishDish()\n fish.button.wait_for_press()\n fish.lights.on()\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances to represent each\n LED. If ``False`` (the default), construct regular :class:`LED`\n instances.\n\n.. _Pi Supply FishDish: https://www.pi-supply.com/product/fish-dish-raspberry-pi-led-buzzer-board/"), _('gpiozero.GPIODevice(*args, **kwargs) \nExtends :class:`Device`. Represents a generic GPIO device and provides\nthe services common to all single-pin GPIO devices (like ensuring two\nGPIO devices do no share a :attr:`pin`).\n\n:param int pin:\n The GPIO pin (in BCM numbering) that the device is connected to. If\n this is ``None``, :exc:`GPIOPinMissing` will be raised. If the pin is\n already in use by another device, :exc:`GPIOPinInUse` will be raised.'), _('gpiozero.GPIODeviceClosed() \nDeprecated descendent of :exc:`DeviceClosed`'), _('gpiozero.GPIODeviceError() \nBase class for errors specific to the GPIODevice hierarchy'), _('gpiozero.GPIOPinInUse() \nError raised when attempting to use a pin already in use by another device'), _('gpiozero.GPIOPinMissing() \nError raised when a pin number is not specified'), _('gpiozero.GPIOZeroError() \nBase class for all exceptions in GPIO Zero'), _('gpiozero.GPIOZeroWarning() \nBase class for all warnings in GPIO Zero'), _('gpiozero.HoldMixin(*args, **kwargs) \nExtends :class:`EventsMixin` to add the :attr:`when_held` event and the\nmachinery to fire that event repeatedly (when :attr:`hold_repeat` is\n``True``) at internals defined by :attr:`hold_time`.'), _('gpiozero.InputDevice(*args, **kwargs) \nRepresents a generic GPIO input device.\n\nThis class extends :class:`GPIODevice` to add facilities common to GPIO\ninput devices. The constructor adds the optional *pull_up* parameter to\nspecify how the pin should be pulled by the internal resistors. The\n:attr:`~GPIODevice.is_active` property is adjusted accordingly so that\n``True`` still means active regardless of the :attr:`pull_up` setting.\n\n:param int pin:\n The GPIO pin (in Broadcom numbering) that the device is connected to.\n If this is ``None`` a :exc:`GPIODeviceError` will be raised.\n\n:param bool pull_up:\n If ``True``, the pin will be pulled high with an internal resistor. If\n ``False`` (the default), the pin will be pulled low.'), _('gpiozero.InputDeviceError() \nBase class for errors specific to the InputDevice hierarchy'), _('gpiozero.InternalDevice(*args, **kwargs) \nExtends :class:`Device` to provide a basis for devices which have no\nspecific hardware representation. These are effectively pseudo-devices and\nusually represent operating system services like the internal clock, file\nsystems or network facilities.'), _('gpiozero.LED(*args, **kwargs) \nExtends :class:`DigitalOutputDevice` and represents a light emitting diode\n(LED).\n\nConnect the cathode (short leg, flat side) of the LED to a ground pin;\nconnect the anode (longer leg) to a limiting resistor; connect the other\nside of the limiting resistor to a GPIO pin (the limiting resistor can be\nplaced either side of the LED).\n\nThe following example will light the LED::\n\n from gpiozero import LED\n\n led = LED(17)\n led.on()\n\n:param int pin:\n The GPIO pin which the LED is attached to. See :ref:`pin_numbering` for\n valid pin numbers.\n\n:param bool active_high:\n If ``True`` (the default), the LED will operate normally with the\n circuit described above. If ``False`` you should wire the cathode to\n the GPIO pin, and the anode to a 3V3 pin (via a limiting resistor).\n\n:param bool initial_value:\n If ``False`` (the default), the LED will be off initially. If\n ``None``, the LED will be left in whatever state the pin is found in\n when configured for output (warning: this can be on). If ``True``, the\n LED will be switched on initially.'), _('gpiozero.LEDBarGraph(*args, **kwargs) \nExtends :class:`LEDCollection` to control a line of LEDs representing a\nbar graph. Positive values (0 to 1) light the LEDs from first to last.\nNegative values (-1 to 0) light the LEDs from last to first.\n\nThe following example demonstrates turning on the first two and last two\nLEDs in a board containing five LEDs attached to GPIOs 2 through 6::\n\n from gpiozero import LEDBarGraph\n from time import sleep\n\n graph = LEDBarGraph(2, 3, 4, 5, 6)\n graph.value = 2/5 # Light the first two LEDs only\n sleep(1)\n graph.value = -2/5 # Light the last two LEDs only\n sleep(1)\n graph.off()\n\nAs with other output devices, :attr:`source` and :attr:`values` are\nsupported::\n\n from gpiozero import LEDBarGraph, MCP3008\n from signal import pause\n\n graph = LEDBarGraph(2, 3, 4, 5, 6, pwm=True)\n pot = MCP3008(channel=0)\n graph.source = pot.values\n pause()\n\n:param int \\*pins:\n Specify the GPIO pins that the LEDs of the bar graph are attached to.\n You can designate as many pins as necessary.\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances for each pin. If\n ``False`` (the default), construct regular :class:`LED` instances. This\n parameter can only be specified as a keyword parameter.\n\n:param bool active_high:\n If ``True`` (the default), the :meth:`on` method will set all the\n associated pins to HIGH. If ``False``, the :meth:`on` method will set\n all pins to LOW (the :meth:`off` method always does the opposite). This\n parameter can only be specified as a keyword parameter.\n\n:param float initial_value:\n The initial :attr:`value` of the graph given as a float between -1 and\n +1. Defaults to ``0.0``. This parameter can only be specified as a\n keyword parameter.'), _("gpiozero.LEDBoard(*args, **kwargs) \nExtends :class:`LEDCollection` and represents a generic LED board or\ncollection of LEDs.\n\nThe following example turns on all the LEDs on a board containing 5 LEDs\nattached to GPIO pins 2 through 6::\n\n from gpiozero import LEDBoard\n\n leds = LEDBoard(2, 3, 4, 5, 6)\n leds.on()\n\n:param int \\*pins:\n Specify the GPIO pins that the LEDs of the board are attached to. You\n can designate as many pins as necessary. You can also specify\n :class:`LEDBoard` instances to create trees of LEDs.\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances for each pin. If\n ``False`` (the default), construct regular :class:`LED` instances. This\n parameter can only be specified as a keyword parameter.\n\n:param bool active_high:\n If ``True`` (the default), the :meth:`on` method will set all the\n associated pins to HIGH. If ``False``, the :meth:`on` method will set\n all pins to LOW (the :meth:`off` method always does the opposite). This\n parameter can only be specified as a keyword parameter.\n\n:param bool initial_value:\n If ``False`` (the default), all LEDs will be off initially. If\n ``None``, each device will be left in whatever state the pin is found\n in when configured for output (warning: this can be on). If ``True``,\n the device will be switched on initially. This parameter can only be\n specified as a keyword parameter.\n\n:param \\*\\*named_pins:\n Specify GPIO pins that LEDs of the board are attached to, associating\n each LED with a property name. You can designate as many pins as\n necessary and use any names, provided they're not already in use by\n something else. You can also specify :class:`LEDBoard` instances to\n create trees of LEDs."), _('gpiozero.LEDCollection(*args, **kwargs) \nExtends :class:`CompositeOutputDevice`. Abstract base class for\n:class:`LEDBoard` and :class:`LEDBarGraph`.'), _("gpiozero.LedBorg(*args, **kwargs) \nExtends :class:`RGBLED` for the `PiBorg LedBorg`_: an add-on board\ncontaining a very bright RGB LED.\n\nThe LedBorg pins are fixed and therefore there's no need to specify them\nwhen constructing this class. The following example turns the LedBorg\npurple::\n\n from gpiozero import LedBorg\n\n led = LedBorg()\n led.color = (1, 0, 1)\n\n:param tuple initial_value:\n The initial color for the LedBorg. Defaults to black ``(0, 0, 0)``.\n\n:param bool pwm:\n If ``True`` (the default), construct :class:`PWMLED` instances for\n each component of the LedBorg. If ``False``, construct regular\n :class:`LED` instances, which prevents smooth color graduations.\n\n.. _PiBorg LedBorg: https://www.piborg.org/ledborg"), _('gpiozero.LightSensor(*args, **kwargs) \nExtends :class:`SmoothedInputDevice` and represents a light dependent\nresistor (LDR).\n\nConnect one leg of the LDR to the 3V3 pin; connect one leg of a 1µF\ncapacitor to a ground pin; connect the other leg of the LDR and the other\nleg of the capacitor to the same GPIO pin. This class repeatedly discharges\nthe capacitor, then times the duration it takes to charge (which will vary\naccording to the light falling on the LDR).\n\nThe following code will print a line of text when light is detected::\n\n from gpiozero import LightSensor\n\n ldr = LightSensor(18)\n ldr.wait_for_light()\n print("Light detected!")\n\n:param int pin:\n The GPIO pin which the sensor is attached to. See :ref:`pin_numbering`\n for valid pin numbers.\n\n:param int queue_len:\n The length of the queue used to store values read from the circuit.\n This defaults to 5.\n\n:param float charge_time_limit:\n If the capacitor in the circuit takes longer than this length of time\n to charge, it is assumed to be dark. The default (0.01 seconds) is\n appropriate for a 1µF capacitor coupled with the LDR from the\n `CamJam #2 EduKit`_. You may need to adjust this value for different\n valued capacitors or LDRs.\n\n:param float threshold:\n Defaults to 0.1. When the mean of all values in the internal queue\n rises above this value, the area will be considered "light", and all\n appropriate events will be fired.\n\n:param bool partial:\n When ``False`` (the default), the object will not return a value for\n :attr:`~SmoothedInputDevice.is_active` until the internal queue has\n filled with values. Only set this to ``True`` if you require values\n immediately after object construction.\n\n.. _CamJam #2 EduKit: http://camjam.me/?page_id=623'), _('gpiozero.LineSensor(*args, **kwargs) \nExtends :class:`SmoothedInputDevice` and represents a single pin line sensor\nlike the TCRT5000 infra-red proximity sensor found in the `CamJam #3\nEduKit`_.\n\nA typical line sensor has a small circuit board with three pins: VCC, GND,\nand OUT. VCC should be connected to a 3V3 pin, GND to one of the ground\npins, and finally OUT to the GPIO specified as the value of the *pin*\nparameter in the constructor.\n\nThe following code will print a line of text indicating when the sensor\ndetects a line, or stops detecting a line::\n\n from gpiozero import LineSensor\n from signal import pause\n\n sensor = LineSensor(4)\n sensor.when_line = lambda: print(\'Line detected\')\n sensor.when_no_line = lambda: print(\'No line detected\')\n pause()\n\n:param int pin:\n The GPIO pin which the sensor is attached to. See :ref:`pin_numbering`\n for valid pin numbers.\n\n:param int queue_len:\n The length of the queue used to store values read from the sensor. This\n defaults to 5.\n\n:param float sample_rate:\n The number of values to read from the device (and append to the\n internal queue) per second. Defaults to 100.\n\n:param float threshold:\n Defaults to 0.5. When the mean of all values in the internal queue\n rises above this value, the sensor will be considered "active" by the\n :attr:`~SmoothedInputDevice.is_active` property, and all appropriate\n events will be fired.\n\n:param bool partial:\n When ``False`` (the default), the object will not return a value for\n :attr:`~SmoothedInputDevice.is_active` until the internal queue has\n filled with values. Only set this to ``True`` if you require values\n immediately after object construction.\n\n.. _CamJam #3 EduKit: http://camjam.me/?page_id=1035'), _('gpiozero.LocalPin() \nAbstract base class representing pins attached locally to a Pi. This forms\nthe base class for local-only pin interfaces (:class:`RPiGPIOPin`,\n:class:`RPIOPin`, and :class:`NativePin`).'), _('gpiozero.MCP3001(*args, **kwargs) \nThe `MCP3001`_ is a 10-bit analog to digital converter with 1 channel\n\n.. _MCP3001: http://www.farnell.com/datasheets/630400.pdf'), _('gpiozero.MCP3002(*args, **kwargs) \nThe `MCP3002`_ is a 10-bit analog to digital converter with 2 channels\n(0-1).\n\n.. _MCP3002: http://www.farnell.com/datasheets/1599363.pdf'), _('gpiozero.MCP3004(*args, **kwargs) \nThe `MCP3004`_ is a 10-bit analog to digital converter with 4 channels\n(0-3).\n\n.. _MCP3004: http://www.farnell.com/datasheets/808965.pdf'), _('gpiozero.MCP3008(*args, **kwargs) \nThe `MCP3008`_ is a 10-bit analog to digital converter with 8 channels\n(0-7).\n\n.. _MCP3008: http://www.farnell.com/datasheets/808965.pdf'), _('gpiozero.MCP3201(*args, **kwargs) \nThe `MCP3201`_ is a 12-bit analog to digital converter with 1 channel\n\n.. _MCP3201: http://www.farnell.com/datasheets/1669366.pdf'), _('gpiozero.MCP3202(*args, **kwargs) \nThe `MCP3202`_ is a 12-bit analog to digital converter with 2 channels\n(0-1).\n\n.. _MCP3202: http://www.farnell.com/datasheets/1669376.pdf'), _('gpiozero.MCP3204(*args, **kwargs) \nThe `MCP3204`_ is a 12-bit analog to digital converter with 4 channels\n(0-3).\n\n.. _MCP3204: http://www.farnell.com/datasheets/808967.pdf'), _('gpiozero.MCP3208(*args, **kwargs) \nThe `MCP3208`_ is a 12-bit analog to digital converter with 8 channels\n(0-7).\n\n.. _MCP3208: http://www.farnell.com/datasheets/808967.pdf'), _('gpiozero.MCP3301(*args, **kwargs) \nThe `MCP3301`_ is a signed 13-bit analog to digital converter. Please note\nthat the MCP3301 always operates in differential mode between its two\nchannels and the output value is scaled from -1 to +1.\n\n.. _MCP3301: http://www.farnell.com/datasheets/1669397.pdf'), _('gpiozero.MCP3302(*args, **kwargs) \nThe `MCP3302`_ is a 12/13-bit analog to digital converter with 4 channels\n(0-3). When operated in differential mode, the device outputs a signed\n13-bit value which is scaled from -1 to +1. When operated in single-ended\nmode (the default), the device outputs an unsigned 12-bit value scaled from\n0 to 1.\n\n.. _MCP3302: http://www.farnell.com/datasheets/1486116.pdf'), _('gpiozero.MCP3304(*args, **kwargs) \nThe `MCP3304`_ is a 12/13-bit analog to digital converter with 8 channels\n(0-7). When operated in differential mode, the device outputs a signed\n13-bit value which is scaled from -1 to +1. When operated in single-ended\nmode (the default), the device outputs an unsigned 12-bit value scaled from\n0 to 1.\n\n.. _MCP3304: http://www.farnell.com/datasheets/1486116.pdf'), _('gpiozero.MotionSensor(*args, **kwargs) \nExtends :class:`SmoothedInputDevice` and represents a passive infra-red\n(PIR) motion sensor like the sort found in the `CamJam #2 EduKit`_.\n\n.. _CamJam #2 EduKit: http://camjam.me/?page_id=623\n\nA typical PIR device has a small circuit board with three pins: VCC, OUT,\nand GND. VCC should be connected to a 5V pin, GND to one of the ground\npins, and finally OUT to the GPIO specified as the value of the *pin*\nparameter in the constructor.\n\nThe following code will print a line of text when motion is detected::\n\n from gpiozero import MotionSensor\n\n pir = MotionSensor(4)\n pir.wait_for_motion()\n print("Motion detected!")\n\n:param int pin:\n The GPIO pin which the sensor is attached to. See :ref:`pin_numbering`\n for valid pin numbers.\n\n:param int queue_len:\n The length of the queue used to store values read from the sensor. This\n defaults to 1 which effectively disables the queue. If your motion\n sensor is particularly "twitchy" you may wish to increase this value.\n\n:param float sample_rate:\n The number of values to read from the device (and append to the\n internal queue) per second. Defaults to 100.\n\n:param float threshold:\n Defaults to 0.5. When the mean of all values in the internal queue\n rises above this value, the sensor will be considered "active" by the\n :attr:`~SmoothedInputDevice.is_active` property, and all appropriate\n events will be fired.\n\n:param bool partial:\n When ``False`` (the default), the object will not return a value for\n :attr:`~SmoothedInputDevice.is_active` until the internal queue has\n filled with values. Only set this to ``True`` if you require values\n immediately after object construction.'), _('gpiozero.Motor(*args, **kwargs) \nExtends :class:`CompositeDevice` and represents a generic motor\nconnected to a bi-directional motor driver circuit (i.e. an `H-bridge`_).\n\nAttach an `H-bridge`_ motor controller to your Pi; connect a power source\n(e.g. a battery pack or the 5V pin) to the controller; connect the outputs\nof the controller board to the two terminals of the motor; connect the\ninputs of the controller board to two GPIO pins.\n\n.. _H-bridge: https://en.wikipedia.org/wiki/H_bridge\n\nThe following code will make the motor turn "forwards"::\n\n from gpiozero import Motor\n\n motor = Motor(17, 18)\n motor.forward()\n\n:param int forward:\n The GPIO pin that the forward input of the motor driver chip is\n connected to.\n\n:param int backward:\n The GPIO pin that the backward input of the motor driver chip is\n connected to.\n\n:param bool pwm:\n If ``True`` (the default), construct :class:`PWMOutputDevice`\n instances for the motor controller pins, allowing both direction and\n variable speed control. If ``False``, construct\n :class:`DigitalOutputDevice` instances, allowing only direction\n control.'), _('gpiozero.OutputDevice(*args, **kwargs) \nRepresents a generic GPIO output device.\n\nThis class extends :class:`GPIODevice` to add facilities common to GPIO\noutput devices: an :meth:`on` method to switch the device on, a\ncorresponding :meth:`off` method, and a :meth:`toggle` method.\n\n:param int pin:\n The GPIO pin (in BCM numbering) that the device is connected to. If\n this is ``None`` a :exc:`GPIOPinMissing` will be raised.\n\n:param bool active_high:\n If ``True`` (the default), the :meth:`on` method will set the GPIO to\n HIGH. If ``False``, the :meth:`on` method will set the GPIO to LOW (the\n :meth:`off` method always does the opposite).\n\n:param bool initial_value:\n If ``False`` (the default), the device will be off initially. If\n ``None``, the device will be left in whatever state the pin is found in\n when configured for output (warning: this can be on). If ``True``, the\n device will be switched on initially.'), _('gpiozero.OutputDeviceBadValue() \nError raised when ``value`` is set to an invalid value'), _('gpiozero.OutputDeviceError() \nBase class for errors specified to the OutputDevice hierarchy'), _('gpiozero.PWMLED(*args, **kwargs) \nExtends :class:`PWMOutputDevice` and represents a light emitting diode\n(LED) with variable brightness.\n\nA typical configuration of such a device is to connect a GPIO pin to the\nanode (long leg) of the LED, and the cathode (short leg) to ground, with\nan optional resistor to prevent the LED from burning out.\n\n:param int pin:\n The GPIO pin which the LED is attached to. See :ref:`pin_numbering` for\n valid pin numbers.\n\n:param bool active_high:\n If ``True`` (the default), the :meth:`on` method will set the GPIO to\n HIGH. If ``False``, the :meth:`on` method will set the GPIO to LOW (the\n :meth:`off` method always does the opposite).\n\n:param float initial_value:\n If ``0`` (the default), the LED will be off initially. Other values\n between 0 and 1 can be specified as an initial brightness for the LED.\n Note that ``None`` cannot be specified (unlike the parent class) as\n there is no way to tell PWM not to alter the state of the pin.\n\n:param int frequency:\n The frequency (in Hz) of pulses emitted to drive the LED. Defaults\n to 100Hz.'), _("gpiozero.PWMOutputDevice(*args, **kwargs) \nGeneric output device configured for pulse-width modulation (PWM).\n\n:param int pin:\n The GPIO pin which the device is attached to. See :ref:`pin_numbering`\n for valid pin numbers.\n\n:param bool active_high:\n If ``True`` (the default), the :meth:`on` method will set the GPIO to\n HIGH. If ``False``, the :meth:`on` method will set the GPIO to LOW (the\n :meth:`off` method always does the opposite).\n\n:param float initial_value:\n If ``0`` (the default), the device's duty cycle will be 0 initially.\n Other values between 0 and 1 can be specified as an initial duty cycle.\n Note that ``None`` cannot be specified (unlike the parent class) as\n there is no way to tell PWM not to alter the state of the pin.\n\n:param int frequency:\n The frequency (in Hz) of pulses emitted to drive the device. Defaults\n to 100Hz."), _('gpiozero.PiBoardInfo(revision, model, pcb_revision, released, soc, manufacturer, memory, storage, usb, ethernet, wifi, bluetooth, csi, dsi, headers) \nThis class is a :func:`~collections.namedtuple` derivative used to\nrepresent information about a particular model of Raspberry Pi. While it is\na tuple, it is strongly recommended that you use the following named\nattributes to access the data contained within.\n\n.. automethod:: physical_pin\n\n.. automethod:: physical_pins\n\n.. automethod:: pulled_up\n\n.. attribute:: revision\n\n A string indicating the revision of the Pi. This is unique to each\n revision and can be considered the "key" from which all other\n attributes are derived. However, in itself the string is fairly\n meaningless.\n\n.. attribute:: model\n\n A string containing the model of the Pi (for example, "B", "B+", "A+",\n "2B", "CM" (for the Compute Module), or "Zero").\n\n.. attribute:: pcb_revision\n\n A string containing the PCB revision number which is silk-screened onto\n the Pi (on some models).\n\n .. note::\n\n This is primarily useful to distinguish between the model B\n revision 1.0 and 2.0 (not to be confused with the model 2B) which\n had slightly different pinouts on their 26-pin GPIO headers.\n\n.. attribute:: released\n\n A string containing an approximate release date for this revision of\n the Pi (formatted as yyyyQq, e.g. 2012Q1 means the first quarter of\n 2012).\n\n.. attribute:: soc\n\n A string indicating the SoC (`system on a chip`_) that this revision\n of the Pi is based upon.\n\n.. attribute:: manufacturer\n\n A string indicating the name of the manufacturer (usually "Sony" but a\n few others exist).\n\n.. attribute:: memory\n\n An integer indicating the amount of memory (in Mb) connected to the\n SoC.\n\n .. note::\n\n This can differ substantially from the amount of RAM available\n to the operating system as the GPU\'s memory is shared with the\n CPU. When the camera module is activated, at least 128Mb of RAM\n is typically reserved for the GPU.\n\n.. attribute:: storage\n\n A string indicating the type of bootable storage used with this\n revision of Pi, e.g. "SD", "MicroSD", or "eMMC" (for the Compute\n Module).\n\n.. attribute:: usb\n\n An integer indicating how many USB ports are physically present on\n this revision of the Pi.\n\n .. note::\n\n This does *not* include the micro-USB port used to power the Pi.\n\n.. attribute:: ethernet\n\n An integer indicating how many Ethernet ports are physically present\n on this revision of the Pi.\n\n.. attribute:: wifi\n\n A bool indicating whether this revision of the Pi has wifi built-in.\n\n.. attribute:: bluetooth\n\n A bool indicating whether this revision of the Pi has bluetooth\n built-in.\n\n.. attribute:: csi\n\n An integer indicating the number of CSI (camera) ports available on\n this revision of the Pi.\n\n.. attribute:: dsi\n\n An integer indicating the number of DSI (display) ports available on\n this revision of the Pi.\n\n.. attribute:: headers\n\n A dictionary which maps header labels to dictionaries which map\n physical pin numbers to :class:`PinInfo` tuples. For example, to obtain\n information about pin 12 on header P1 you would query\n ``headers[\'P1\'][12]``.\n\n.. _system on a chip: https://en.wikipedia.org/wiki/System_on_a_chip'), _("gpiozero.PiLiter(*args, **kwargs) \nExtends :class:`LEDBoard` for the `Ciseco Pi-LITEr`_: a strip of 8 very bright\nLEDs.\n\nThe Pi-LITEr pins are fixed and therefore there's no need to specify them\nwhen constructing this class. The following example turns on all the LEDs\nof the Pi-LITEr::\n\n from gpiozero import PiLiter\n\n lite = PiLiter()\n lite.on()\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances for each pin. If\n ``False`` (the default), construct regular :class:`LED` instances.\n\n:param bool initial_value:\n If ``False`` (the default), all LEDs will be off initially. If\n ``None``, each device will be left in whatever state the pin is found\n in when configured for output (warning: this can be on). If ``True``,\n the device will be switched on initially.\n\n.. _Ciseco Pi-LITEr: http://shop.ciseco.co.uk/pi-liter-8-led-strip-for-the-raspberry-pi/"), _("gpiozero.PiLiterBarGraph(*args, **kwargs) \nExtends :class:`LEDBarGraph` to treat the `Ciseco Pi-LITEr`_ as an\n8-segment bar graph.\n\nThe Pi-LITEr pins are fixed and therefore there's no need to specify them\nwhen constructing this class. The following example sets the graph value\nto 0.5::\n\n from gpiozero import PiLiterBarGraph\n\n graph = PiLiterBarGraph()\n graph.value = 0.5\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances for each pin. If\n ``False`` (the default), construct regular :class:`LED` instances.\n\n:param float initial_value:\n The initial :attr:`value` of the graph given as a float between -1 and\n +1. Defaults to ``0.0``.\n\n.. _Ciseco Pi-LITEr: http://shop.ciseco.co.uk/pi-liter-8-led-strip-for-the-raspberry-pi/"), _("gpiozero.PiTraffic(*args, **kwargs) \nExtends :class:`TrafficLights` for the `Low Voltage Labs PI-TRAFFIC`_:\nvertical traffic lights board when attached to GPIO pins 9, 10, and 11.\n\nThere's no need to specify the pins if the PI-TRAFFIC is connected to the\ndefault pins (9, 10, 11). The following example turns on the amber LED on\nthe PI-TRAFFIC::\n\n from gpiozero import PiTraffic\n\n traffic = PiTraffic()\n traffic.amber.on()\n\nTo use the PI-TRAFFIC board when attached to a non-standard set of pins,\nsimply use the parent class, :class:`TrafficLights`.\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances to represent each\n LED. If ``False`` (the default), construct regular :class:`LED`\n instances.\n\n:param bool initial_value:\n If ``False`` (the default), all LEDs will be off initially. If\n ``None``, each device will be left in whatever state the pin is found\n in when configured for output (warning: this can be on). If ``True``,\n the device will be switched on initially.\n\n.. _Low Voltage Labs PI-TRAFFIC: http://lowvoltagelabs.com/products/pi-traffic/"), _('gpiozero.Pin() \nAbstract base class representing a GPIO pin or a pin from an IO extender.\n\nDescendents should override property getters and setters to accurately\nrepresent the capabilities of pins. The following functions *must* be\noverridden:\n\n* :meth:`_get_function`\n* :meth:`_set_function`\n* :meth:`_get_state`\n\nThe following functions *may* be overridden if applicable:\n\n* :meth:`close`\n* :meth:`_set_state`\n* :meth:`_get_frequency`\n* :meth:`_set_frequency`\n* :meth:`_get_pull`\n* :meth:`_set_pull`\n* :meth:`_get_bounce`\n* :meth:`_set_bounce`\n* :meth:`_get_edges`\n* :meth:`_set_edges`\n* :meth:`_get_when_changed`\n* :meth:`_set_when_changed`\n* :meth:`pi_info`\n* :meth:`output_with_state`\n* :meth:`input_with_pull`\n\n.. warning::\n\n Descendents must ensure that pin instances representing the same\n physical hardware are identical, right down to object identity. The\n framework relies on this to correctly clean up resources at interpreter\n shutdown.'), _('gpiozero.PinEdgeDetectUnsupported() \nError raised when attempting to use edge detection on unsupported pins'), _('gpiozero.PinError() \nBase class for errors related to pin implementations'), _('gpiozero.PinFixedPull() \nError raised when attempting to set the pull of a pin with fixed pull-up'), _('gpiozero.PinInfo(number, function, pull_up) \nThis class is a :func:`~collections.namedtuple` derivative used to\nrepresent information about a pin present on a GPIO header. The following\nattributes are defined:\n\n.. attribute:: number\n\n An integer containing the physical pin number on the header (starting\n from 1 in accordance with convention).\n\n.. attribute:: function\n\n A string describing the function of the pin. Some common examples\n include "GND" (for pins connecting to ground), "3V3" (for pins which\n output 3.3 volts), "GPIO9" (for GPIO9 in the Broadcom numbering\n scheme), etc.\n\n.. attribute:: pull_up\n\n A bool indicating whether the pin has a physical pull-up resistor\n permanently attached (this is usually ``False`` but GPIO2 and GPIO3\n are *usually* ``True``). This is used internally by gpiozero to raise\n errors when pull-down is requested on a pin with a physical pull-up\n resistor.'), _('gpiozero.PinInvalidEdges() \nError raised when attempting to assign an invalid edge detection to a pin'), _('gpiozero.PinInvalidFunction() \nError raised when attempting to change the function of a pin to an invalid value'), _('gpiozero.PinInvalidPull() \nError raised when attempting to assign an invalid pull-up to a pin'), _('gpiozero.PinInvalidState() \nError raised when attempting to assign an invalid state to a pin'), _('gpiozero.PinMultiplePins() \nError raised when multiple pins support the requested function'), _('gpiozero.PinNoPins() \nError raised when no pins support the requested function'), _('gpiozero.PinNonPhysical() \nWarning raised when a non-physical pin is specified in a constructor'), _('gpiozero.PinPWMError() \nBase class for errors related to PWM implementations'), _('gpiozero.PinPWMFixedValue() \nError raised when attempting to initialize PWM on an input pin'), _('gpiozero.PinPWMUnsupported() \nError raised when attempting to activate PWM on unsupported pins'), _('gpiozero.PinSetInput() \nError raised when attempting to set a read-only pin'), _("gpiozero.PinUnknownPi() \nError raised when gpiozero doesn't recognize a revision of the Pi"), _('gpiozero.PinWarning() \nBase class for warnings related to pin implementations'), _("gpiozero.PingServer(*args, **kwargs) \nExtends :class:`InternalDevice` to provide a device which is active when a\n*host* on the network can be pinged.\n\nThe following example lights an LED while a server is reachable (note the\nuse of :attr:`~SourceMixin.source_delay` to ensure the server is not\nflooded with pings)::\n\n from gpiozero import PingServer, LED\n from signal import pause\n\n server = PingServer('my-server')\n led = LED(4)\n led.source_delay = 1\n led.source = server.values\n pause()\n\n:param str host:\n The hostname or IP address to attempt to ping."), _('gpiozero.RGBLED(*args, **kwargs) \nExtends :class:`Device` and represents a full color LED component (composed\nof red, green, and blue LEDs).\n\nConnect the common cathode (longest leg) to a ground pin; connect each of\nthe other legs (representing the red, green, and blue anodes) to any GPIO\npins. You can either use three limiting resistors (one per anode) or a\nsingle limiting resistor on the cathode.\n\nThe following code will make the LED purple::\n\n from gpiozero import RGBLED\n\n led = RGBLED(2, 3, 4)\n led.color = (1, 0, 1)\n\n:param int red:\n The GPIO pin that controls the red component of the RGB LED.\n\n:param int green:\n The GPIO pin that controls the green component of the RGB LED.\n\n:param int blue:\n The GPIO pin that controls the blue component of the RGB LED.\n\n:param bool active_high:\n Set to ``True`` (the default) for common cathode RGB LEDs. If you are\n using a common anode RGB LED, set this to ``False``.\n\n:param tuple initial_value:\n The initial color for the RGB LED. Defaults to black ``(0, 0, 0)``.\n\n:param bool pwm:\n If ``True`` (the default), construct :class:`PWMLED` instances for\n each component of the RGBLED. If ``False``, construct regular\n :class:`LED` instances, which prevents smooth color graduations.'), _("gpiozero.Robot(*args, **kwargs) \nExtends :class:`CompositeDevice` to represent a generic dual-motor robot.\n\nThis class is constructed with two tuples representing the forward and\nbackward pins of the left and right controllers respectively. For example,\nif the left motor's controller is connected to GPIOs 4 and 14, while the\nright motor's controller is connected to GPIOs 17 and 18 then the following\nexample will drive the robot forward::\n\n from gpiozero import Robot\n\n robot = Robot(left=(4, 14), right=(17, 18))\n robot.forward()\n\n:param tuple left:\n A tuple of two GPIO pins representing the forward and backward inputs\n of the left motor's controller.\n\n:param tuple right:\n A tuple of two GPIO pins representing the forward and backward inputs\n of the right motor's controller."), _("gpiozero.RyanteckRobot(*args, **kwargs) \nExtends :class:`Robot` for the `Ryanteck MCB`_ robot.\n\nThe Ryanteck MCB pins are fixed and therefore there's no need to specify\nthem when constructing this class. The following example drives the robot\nforward::\n\n from gpiozero import RyanteckRobot\n\n robot = RyanteckRobot()\n robot.forward()\n\n.. _Ryanteck MCB: https://ryanteck.uk/add-ons/6-ryanteck-rpi-motor-controller-board-0635648607160.html"), _('gpiozero.SPIBadArgs() \nError raised when invalid arguments are given while constructing :class:`SPIDevice`'), _('gpiozero.SPIDevice(*args, **kwargs) \nExtends :class:`Device`. Represents a device that communicates via the SPI\nprotocol.\n\nSee :ref:`spi_args` for information on the keyword arguments that can be\nspecified with the constructor.'), _('gpiozero.SPIError() \nBase class for errors related to the SPI implementation'), _('gpiozero.SPISoftwareFallback() \nWarning raised when falling back to the software implementation'), _('gpiozero.SPIWarning() \nBase class for warnings related to the SPI implementation'), _("gpiozero.Servo(*args, **kwargs) \nExtends :class:`CompositeDevice` and represents a PWM-controlled servo\nmotor connected to a GPIO pin.\n\nConnect a power source (e.g. a battery pack or the 5V pin) to the power\ncable of the servo (this is typically colored red); connect the ground\ncable of the servo (typically colored black or brown) to the negative of\nyour battery pack, or a GND pin; connect the final cable (typically colored\nwhite or orange) to the GPIO pin you wish to use for controlling the servo.\n\nThe following code will make the servo move between its minimum, maximum,\nand mid-point positions with a pause between each::\n\n from gpiozero import Servo\n from time import sleep\n\n servo = Servo(17)\n while True:\n servo.min()\n sleep(1)\n servo.mid()\n sleep(1)\n servo.max()\n sleep(1)\n\n:param int pin:\n The GPIO pin which the device is attached to. See :ref:`pin_numbering`\n for valid pin numbers.\n\n:param float initial_value:\n If ``0`` (the default), the device's mid-point will be set\n initially. Other values between -1 and +1 can be specified as an\n initial position. ``None`` means to start the servo un-controlled (see\n :attr:`value`).\n\n:param float min_pulse_width:\n The pulse width corresponding to the servo's minimum position. This\n defaults to 1ms.\n\n:param float max_pulse_width:\n The pulse width corresponding to the servo's maximum position. This\n defaults to 2ms.\n\n:param float frame_width:\n The length of time between servo control pulses measured in seconds.\n This defaults to 20ms which is a common value for servos."), _('gpiozero.SharedMixin() \nThis mixin marks a class as "shared". In this case, the meta-class\n(GPIOMeta) will use :meth:`_shared_key` to convert the constructor\narguments to an immutable key, and will check whether any existing\ninstances match that key. If they do, they will be returned by the\nconstructor instead of a new instance. An internal reference counter is\nused to determine how many times an instance has been "constructed" in this\nway.\n\nWhen :meth:`close` is called, an internal reference counter will be\ndecremented and the instance will only close when it reaches zero.'), _('gpiozero.SmoothedInputDevice(*args, **kwargs) \nRepresents a generic input device which takes its value from the mean of a\nqueue of historical values.\n\nThis class extends :class:`InputDevice` with a queue which is filled by a\nbackground thread which continually polls the state of the underlying\ndevice. The mean of the values in the queue is compared to a threshold\nwhich is used to determine the state of the :attr:`is_active` property.\n\n.. note::\n\n The background queue is not automatically started upon construction.\n This is to allow descendents to set up additional components before the\n queue starts reading values. Effectively this is an abstract base\n class.\n\nThis class is intended for use with devices which either exhibit analog\nbehaviour (such as the charging time of a capacitor with an LDR), or those\nwhich exhibit "twitchy" behaviour (such as certain motion sensors).\n\n:param float threshold:\n The value above which the device will be considered "on".\n\n:param int queue_len:\n The length of the internal queue which is filled by the background\n thread.\n\n:param float sample_wait:\n The length of time to wait between retrieving the state of the\n underlying device. Defaults to 0.0 indicating that values are retrieved\n as fast as possible.\n\n:param bool partial:\n If ``False`` (the default), attempts to read the state of the device\n (from the :attr:`is_active` property) will block until the queue has\n filled. If ``True``, a value will be returned immediately, but be\n aware that this value is likely to fluctuate excessively.'), _("gpiozero.SnowPi(*args, **kwargs) \nExtends :class:`LEDBoard` for the `Ryanteck SnowPi`_ board.\n\nThe SnowPi pins are fixed and therefore there's no need to specify them\nwhen constructing this class. The following example turns on the eyes, sets\nthe nose pulsing, and the arms blinking::\n\n from gpiozero import SnowPi\n\n snowman = SnowPi(pwm=True)\n snowman.eyes.on()\n snowman.nose.pulse()\n snowman.arms.blink()\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances to represent each\n LED. If ``False`` (the default), construct regular :class:`LED`\n instances.\n\n:param bool initial_value:\n If ``False`` (the default), all LEDs will be off initially. If\n ``None``, each device will be left in whatever state the pin is found\n in when configured for output (warning: this can be on). If ``True``,\n the device will be switched on initially.\n\n.. _Ryanteck SnowPi: https://ryanteck.uk/raspberry-pi/114-snowpi-the-gpio-snowman-for-raspberry-pi-0635648608303.html"), _('gpiozero.SourceMixin(*args, **kwargs) \nAdds a :attr:`source` property to the class which, given an iterable, sets\n:attr:`value` to each member of that iterable until it is exhausted. This\nmixin is generally included in novel output devices to allow their state to\nbe driven from another device.\n\n.. note::\n\n Use this mixin *first* in the parent class list.'), _("gpiozero.TimeOfDay(*args, **kwargs) \nExtends :class:`InternalDevice` to provide a device which is active when\nthe computer's clock indicates that the current time is between\n*start_time* and *end_time* (inclusive) which are :class:`~datetime.time`\ninstances.\n\nThe following example turns on a lamp attached to an :class:`Energenie`\nplug between 7 and 8 AM::\n\n from datetime import time\n from gpiozero import TimeOfDay, Energenie\n from signal import pause\n\n lamp = Energenie(0)\n morning = TimeOfDay(time(7), time(8))\n morning.when_activated = lamp.on\n morning.when_deactivated = lamp.off\n pause()\n\n:param ~datetime.time start_time:\n The time from which the device will be considered active.\n\n:param ~datetime.time end_time:\n The time after which the device will be considered inactive.\n\n:param bool utc:\n If ``True`` (the default), a naive UTC time will be used for the\n comparison rather than a local time-zone reading."), _("gpiozero.TrafficHat(*args, **kwargs) \nExtends :class:`TrafficLightsBuzzer` for the `Ryanteck Traffic HAT`_: traffic\nlight LEDs, a button and a buzzer.\n\nThe Traffic HAT pins are fixed and therefore there's no need to specify\nthem when constructing this class. The following example waits for the\nbutton to be pressed on the Traffic HAT, then turns on all the LEDs::\n\n from gpiozero import TrafficHat\n\n hat = TrafficHat()\n hat.button.wait_for_press()\n hat.lights.on()\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances to represent each\n LED. If ``False`` (the default), construct regular :class:`LED`\n instances.\n\n.. _Ryanteck Traffic HAT: https://ryanteck.uk/hats/1-traffichat-0635648607122.html"), _("gpiozero.TrafficLights(*args, **kwargs) \nExtends :class:`LEDBoard` for devices containing red, yellow, and green\nLEDs.\n\nThe following example initializes a device connected to GPIO pins 2, 3,\nand 4, then lights the amber (yellow) LED attached to GPIO 3::\n\n from gpiozero import TrafficLights\n\n traffic = TrafficLights(2, 3, 4)\n traffic.amber.on()\n\n:param int red:\n The GPIO pin that the red LED is attached to.\n\n:param int amber:\n The GPIO pin that the amber LED is attached to.\n\n:param int green:\n The GPIO pin that the green LED is attached to.\n\n:param bool pwm:\n If ``True``, construct :class:`PWMLED` instances to represent each\n LED. If ``False`` (the default), construct regular :class:`LED`\n instances.\n\n:param bool initial_value:\n If ``False`` (the default), all LEDs will be off initially. If\n ``None``, each device will be left in whatever state the pin is found\n in when configured for output (warning: this can be on). If ``True``,\n the device will be switched on initially.\n\n:param int yellow:\n The GPIO pin that the yellow LED is attached to. This is merely an\n alias for the ``amber`` parameter - you can't specify both ``amber``\n and ``yellow``."), _('gpiozero.TrafficLightsBuzzer(*args, **kwargs) \nExtends :class:`CompositeOutputDevice` and is a generic class for HATs with\ntraffic lights, a button and a buzzer.\n\n:param TrafficLights lights:\n An instance of :class:`TrafficLights` representing the traffic lights\n of the HAT.\n\n:param Buzzer buzzer:\n An instance of :class:`Buzzer` representing the buzzer on the HAT.\n\n:param Button button:\n An instance of :class:`Button` representing the button on the HAT.'), _('gpiozero.ValuesMixin() \nAdds a :attr:`values` property to the class which returns an infinite\ngenerator of readings from the :attr:`value` property. There is rarely a\nneed to use this mixin directly as all base classes in GPIO Zero include\nit.\n\n.. note::\n\n Use this mixin *first* in the parent class list.'), _('gpiozero.pi_info(revision=None) \nReturns a :class:`PiBoardInfo` instance containing information about a\n*revision* of the Raspberry Pi.\n\n:param str revision:\n The revision of the Pi to return information about. If this is omitted\n or ``None`` (the default), then the library will attempt to determine\n the model of Pi it is running on and return information about that.'), _('picamera.Blue() \nRepresents the blue component of a :class:`Color` for use in\ntransformations. Instances of this class can be constructed directly with\na float value, or by querying the :attr:`Color.blue` attribute. Addition,\nsubtraction, and multiplication are supported with :class:`Color`\ninstances. For example::\n\n >>> Color(0, 0, 0) + Blue(0.2)\n \n >>> Color.from_hls(0.5, 0.5, 1.0) - Blue(1)\n \n >>> Blue(0.9) * Color(\'white\')\n '), _('picamera.BufferIO(obj) \nA stream which uses a :class:`memoryview` for storage.\n\nThis is used internally by picamera for capturing directly to an existing\nobject which supports the buffer protocol (like a numpy array). Because the\nunderlying storage is fixed in size, the stream also has a fixed size and\nwill raise an :exc:`IOError` exception if an attempt is made to write\nbeyond the end of the buffer (though seek beyond the end is supported).\n\nUsers should never need this class directly.'), _('picamera.CircularIO(size) \nA thread-safe stream which uses a ring buffer for storage.\n\nCircularIO provides an in-memory stream similar to the :class:`io.BytesIO`\nclass. However, unlike :class:`io.BytesIO` its underlying storage is a\n`ring buffer`_ with a fixed maximum size. Once the maximum size is reached,\nwriting effectively loops round to the beginning to the ring and starts\noverwriting the oldest content.\n\nThe *size* parameter specifies the maximum size of the stream in bytes. The\n:meth:`read`, :meth:`tell`, and :meth:`seek` methods all operate\nequivalently to those in :class:`io.BytesIO` whilst :meth:`write` only\ndiffers in the wrapping behaviour described above. A :meth:`read1` method\nis also provided for efficient reading of the underlying ring buffer in\nwrite-sized chunks (or less).\n\nA re-entrant threading lock guards all operations, and is accessible for\nexternal use via the :attr:`lock` attribute.\n\nThe performance of the class is geared toward faster writing than reading\non the assumption that writing will be the common operation and reading the\nrare operation (a reasonable assumption for the camera use-case, but not\nnecessarily for more general usage).\n\n.. _ring buffer: https://en.wikipedia.org/wiki/Circular_buffer'), _('picamera.Color(*args, **kwargs) \nThe Color class is a tuple which represents a color as red, green, and\nblue components.\n\nThe class has a flexible constructor which allows you to create an instance\nfrom a variety of color systems including `RGB`_, `Y\'UV`_, `Y\'IQ`_, `HLS`_,\nand `HSV`_. There are also explicit constructors for each of these systems\nto allow you to force the use of a system in your code. For example, an\ninstance of :class:`Color` can be constructed in any of the following\nways::\n\n >>> Color(\'#f00\')\n \n >>> Color(\'green\')\n \n >>> Color(0, 0, 1)\n \n >>> Color(hue=0, saturation=1, value=0.5)\n \n >>> Color(y=0.4, u=-0.05, v=0.615)\n \n\nThe specific forms that the default constructor will accept are enumerated\nbelow:\n\n.. tabularcolumns:: |p{40mm}|p{100mm}|\n\n+------------------------------+------------------------------------------+\n| Style | Description |\n+==============================+==========================================+\n| Single positional parameter | Equivalent to calling |\n| | :meth:`Color.from_string`. |\n+------------------------------+------------------------------------------+\n| Three positional parameters | Equivalent to calling |\n| | :meth:`Color.from_rgb` if all three |\n| | parameters are between 0.0 and 1.0, or |\n| | :meth:`Color.from_rgb_bytes` otherwise. |\n+------------------------------+ |\n| Three named parameters: | |\n| *r*, *g*, *b* | |\n+------------------------------+ |\n| Three named parameters: | |\n| *red*, *green*, *blue* | |\n+------------------------------+------------------------------------------+\n| Three named parameters: | Equivalent to calling |\n| *y*, *u*, *v* | :meth:`Color.from_yuv` if *y* is between |\n| | 0.0 and 1.0, *u* is between -0.436 and |\n| | 0.436, and *v* is between -0.615 and |\n| | 0.615, or :meth:`Color.from_yuv_bytes` |\n| | otherwise. |\n+------------------------------+------------------------------------------+\n| Three named parameters: | Equivalent to calling |\n| *y*, *i*, *q* | :meth:`Color.from_yiq`. |\n+------------------------------+------------------------------------------+\n| Three named parameters: | Equivalent to calling |\n| *h*, *l*, *s* | :meth:`Color.from_hls`. |\n+------------------------------+ |\n| Three named parameters: | |\n| *hue*, *lightness*, | |\n| *saturation* | |\n+------------------------------+------------------------------------------+\n| Three named parameters: | Equivalent to calling |\n| *h*, *s*, *v* | :meth:`Color.from_hsv` |\n+------------------------------+ |\n| Three named parameters: | |\n| *hue*, *saturation*, *value* | |\n+------------------------------+------------------------------------------+\n| Three named parameters: | Equivalent to calling |\n| *x*, *y*, *z* | :meth:`Color.from_cie_xyz` |\n+------------------------------+------------------------------------------+\n| Three named parameters: | Equivalent to calling |\n| *l*, *a*, *b* | :meth:`Color.from_cie_lab` |\n+------------------------------+------------------------------------------+\n| Three named parameters: | Equivalent to calling |\n| *l*, *u*, *v* | :meth:`Color.from_cie_luv` |\n+------------------------------+------------------------------------------+\n\nIf the constructor parameters do not conform to any of the variants in the\ntable above, a :exc:`ValueError` will be thrown.\n\nInternally, the color is *always* represented as 3 float values\ncorresponding to the red, green, and blue components of the color. These\nvalues take a value from 0.0 to 1.0 (least to full intensity). The class\nprovides several attributes which can be used to convert one color system\ninto another::\n\n >>> Color(\'#f00\').hls\n (0.0, 0.5, 1.0)\n >>> Color.from_string(\'green\').hue\n Hue(deg=120.0)\n >>> Color.from_rgb_bytes(0, 0, 255).yuv\n (0.114, 0.435912, -0.099978)\n\nAs :class:`Color` derives from tuple, instances are immutable. While this\nprovides the advantage that they can be used as keys in a dict, it does\nmean that colors themselves cannot be directly manipulated (e.g. by\nreducing the red component).\n\nHowever, several auxilliary classes in the module provide the ability to\nperform simple transformations of colors via operators which produce a new\n:class:`Color` instance. For example::\n\n >>> Color(\'red\') - Red(0.5)\n \n >>> Color(\'green\') + Red(0.5)\n \n >>> Color.from_hls(0.5, 0.5, 1.0)\n \n >>> Color.from_hls(0.5, 0.5, 1.0) * Lightness(0.8)\n \n >>> (Color.from_hls(0.5, 0.5, 1.0) * Lightness(0.8)).hls\n (0.5, 0.4, 1.0)\n\nFrom the last example above one can see that even attributes not directly\nstored by the color (such as lightness) can be manipulated in this fashion.\nIn this case a :class:`Color` instance is constructed from HLS (hue,\nlightness, saturation) values with a lightness of 0.5. This is multiplied\nby a :class:`Lightness` instance with a value of 0.8 which constructs a new\n:class:`Color` with the same hue and saturation, but a lightness of 0.5 *\n0.8 = 0.4.\n\nIf an instance is converted to a string (with :func:`str`) it will return a\nstring containing the 7-character HTML code for the color (e.g. "#ff0000"\nfor red). As can be seen in the examples above, a similar representation is\nreturned for :func:`repr`.\n\n.. _RGB: https://en.wikipedia.org/wiki/RGB_color_space\n.. _Y\'UV: https://en.wikipedia.org/wiki/YUV\n.. _Y\'IQ: https://en.wikipedia.org/wiki/YIQ\n.. _HLS: https://en.wikipedia.org/wiki/HSL_and_HSV\n.. _HSV: https://en.wikipedia.org/wiki/HSL_and_HSV'), _('picamera.Green() \nRepresents the green component of a :class:`Color` for use in\ntransformations. Instances of this class can be constructed directly with\na float value, or by querying the :attr:`Color.green` attribute. Addition,\nsubtraction, and multiplication are supported with :class:`Color`\ninstances. For example::\n\n >>> Color(0, 0, 0) + Green(0.1)\n \n >>> Color.from_yuv(1, -0.4, -0.6) - Green(1)\n \n >>> (Green(0.5) * Color(\'white\')).rgb\n (Red(1.0), Green(0.5), Blue(1.0))'), _("picamera.Hue(n=None, deg=None, rad=None) \nRepresents the hue of a :class:`Color` for use in transformations.\nInstances of this class can be constructed directly with a float value in\nthe range [0.0, 1.0) representing an angle around the `HSL hue wheel`_. As\nthis is a circular mapping, 0.0 and 1.0 effectively mean the same thing,\ni.e. out of range values will be normalized into the range [0.0, 1.0).\n\nThe class can also be constructed with the keyword arguments ``deg`` or\n``rad`` if you wish to specify the hue value in degrees or radians instead,\nrespectively. Instances can also be constructed by querying the\n:attr:`Color.hue` attribute.\n\nAddition, subtraction, and multiplication are supported with :class:`Color`\ninstances. For example::\n\n >>> Color(1, 0, 0).hls\n (0.0, 0.5, 1.0)\n >>> (Color(1, 0, 0) + Hue(deg=180)).hls\n (0.5, 0.5, 1.0)\n\nNote that whilst multiplication by a :class:`Hue` doesn't make much sense,\nit is still supported. However, the circular nature of a hue value can lead\nto suprising effects. In particular, since 1.0 is equivalent to 0.0 the\nfollowing may be observed::\n\n >>> (Hue(1.0) * Color.from_hls(0.5, 0.5, 1.0)).hls\n (0.0, 0.5, 1.0)\n\n.. _HSL hue wheel: https://en.wikipedia.org/wiki/Hue"), _('picamera.Lightness() \nRepresents the lightness of a :class:`Color` for use in transformations.\nInstances of this class can be constructed directly with a float value, or\nby querying the :attr:`Color.lightness` attribute. Addition, subtraction,\nand multiplication are supported with :class:`Color` instances. For\nexample::\n\n >>> Color(0, 0, 0) + Lightness(0.1)\n \n >>> Color.from_rgb_bytes(0x80, 0x80, 0) - Lightness(0.2)\n \n >>> Lightness(0.9) * Color(\'wheat\')\n '), _("picamera.PiCamera(camera_num=0, stereo_mode='none', stereo_decimate=False, resolution=None, framerate=None, sensor_mode=0, led_pin=None, clock_mode='reset', framerate_range=None) \nProvides a pure Python interface to the Raspberry Pi's camera module.\n\nUpon construction, this class initializes the camera. The *camera_num*\nparameter (which defaults to 0) selects the camera module that the instance\nwill represent. Only the Raspberry Pi compute module currently supports\nmore than one camera.\n\nThe *sensor_mode*, *resolution*, *framerate*, *framerate_range*, and\n*clock_mode* parameters provide initial values for the :attr:`sensor_mode`,\n:attr:`resolution`, :attr:`framerate`, :attr:`framerate_range`, and\n:attr:`clock_mode` attributes of the class (these attributes are all\nrelatively expensive to set individually, hence setting them all upon\nconstruction is a speed optimization). Please refer to the attribute\ndocumentation for more information and default values.\n\nThe *stereo_mode* and *stereo_decimate* parameters configure dual cameras\non a compute module for sterescopic mode. These parameters can only be set\nat construction time; they cannot be altered later without closing the\n:class:`PiCamera` instance and recreating it. The *stereo_mode* parameter\ndefaults to ``'none'`` (no stereoscopic mode) but can be set to\n``'side-by-side'`` or ``'top-bottom'`` to activate a stereoscopic mode. If\nthe *stereo_decimate* parameter is ``True``, the resolution of the two\ncameras will be halved so that the resulting image has the same dimensions\nas if stereoscopic mode were not being used.\n\nThe *led_pin* parameter can be used to specify the GPIO pin which should be\nused to control the camera's LED via the :attr:`led` attribute. If this is\nnot specified, it should default to the correct value for your Pi platform.\nYou should only need to specify this parameter if you are using a custom\nDeviceTree blob (this is only typical on the `Compute Module`_ platform).\n\nNo preview or recording is started automatically upon construction. Use\nthe :meth:`capture` method to capture images, the :meth:`start_recording`\nmethod to begin recording video, or the :meth:`start_preview` method to\nstart live display of the camera's input.\n\nSeveral attributes are provided to adjust the camera's configuration. Some\nof these can be adjusted while a recording is running, like\n:attr:`brightness`. Others, like :attr:`resolution`, can only be adjusted\nwhen the camera is idle.\n\nWhen you are finished with the camera, you should ensure you call the\n:meth:`close` method to release the camera resources::\n\n camera = PiCamera()\n try:\n # do something with the camera\n pass\n finally:\n camera.close()\n\nThe class supports the context manager protocol to make this particularly\neasy (upon exiting the :keyword:`with` statement, the :meth:`close` method\nis automatically called)::\n\n with PiCamera() as camera:\n # do something with the camera\n pass\n\n.. versionchanged:: 1.8\n Added *stereo_mode* and *stereo_decimate* parameters.\n\n.. versionchanged:: 1.9\n Added *resolution*, *framerate*, and *sensor_mode* parameters.\n\n.. versionchanged:: 1.10\n Added *led_pin* parameter.\n\n.. versionchanged:: 1.11\n Added *clock_mode* parameter, and permitted setting of resolution as\n appropriately formatted string.\n\n.. versionchanged:: 1.13\n Added *framerate_range* parameter.\n\n.. _Compute Module: https://www.raspberrypi.org/documentation/hardware/computemodule/cmio-camera.md"), _('picamera.PiCameraAlphaStripping() \nRaised when picamera does alpha-byte stripping.'), _('picamera.PiCameraAlreadyRecording() \nRaised when :meth:`~PiCamera.start_recording` or\n:meth:`~PiCamera.record_sequence` are called against a port which already\nhas an active recording.'), _("picamera.PiCameraCircularIO(camera, size=None, seconds=None, bitrate=17000000, splitter_port=1) \nA derivative of :class:`CircularIO` which tracks camera frames.\n\nPiCameraCircularIO provides an in-memory stream based on a ring buffer. It\nis a specialization of :class:`CircularIO` which associates video frame\nmeta-data with the recorded stream, accessible from the :attr:`frames`\nproperty.\n\n.. warning::\n\n The class makes a couple of assumptions which will cause the frame\n meta-data tracking to break if they are not adhered to:\n\n * the stream is only ever appended to - no writes ever start from\n the middle of the stream\n\n * the stream is never truncated (from the right; being ring buffer\n based, left truncation will occur automatically); the exception\n to this is the :meth:`clear` method.\n\nThe *camera* parameter specifies the :class:`PiCamera` instance that will\nbe recording video to the stream. If specified, the *size* parameter\ndetermines the maximum size of the stream in bytes. If *size* is not\nspecified (or ``None``), then *seconds* must be specified instead. This\nprovides the maximum length of the stream in seconds, assuming a data rate\nin bits-per-second given by the *bitrate* parameter (which defaults to\n``17000000``, or 17Mbps, which is also the default bitrate used for video\nrecording by :class:`PiCamera`). You cannot specify both *size* and\n*seconds*.\n\nThe *splitter_port* parameter specifies the port of the built-in splitter\nthat the video encoder will be attached to. This defaults to ``1`` and most\nusers will have no need to specify anything different. If you do specify\nsomething else, ensure it is equal to the *splitter_port* parameter of the\ncorresponding call to :meth:`~PiCamera.start_recording`. For example::\n\n import picamera\n\n with picamera.PiCamera() as camera:\n with picamera.PiCameraCircularIO(camera, splitter_port=2) as stream:\n camera.start_recording(stream, format='h264', splitter_port=2)\n camera.wait_recording(10, splitter_port=2)\n camera.stop_recording(splitter_port=2)\n\n.. attribute:: frames\n\n Returns an iterator over the frame meta-data.\n\n As the camera records video to the stream, the class captures the\n meta-data associated with each frame (in the form of a\n :class:`PiVideoFrame` tuple), discarding meta-data for frames which are\n no longer fully stored within the underlying ring buffer. You can use\n the frame meta-data to locate, for example, the first keyframe present\n in the stream in order to determine an appropriate range to extract."), _('picamera.PiCameraClosed() \nRaised when a method is called on a camera which has already been closed.'), _('picamera.PiCameraDeprecated() \nRaised when deprecated functionality in picamera is used.'), _('picamera.PiCameraError() \nBase class for PiCamera errors.'), _('picamera.PiCameraFallback() \nRaised when picamera has to fallback on old functionality.'), _("picamera.PiCameraMMALError(status, prefix='') \nRaised when an MMAL operation fails for whatever reason."), _('picamera.PiCameraNotRecording() \nRaised when :meth:`~PiCamera.stop_recording` or\n:meth:`~PiCamera.split_recording` are called against a port which has no\nrecording active.'), _('picamera.PiCameraPortDisabled(msg) \nRaised when attempting a buffer operation on a disabled port.\n\nThis exception is intended for the common use-case of attempting to get\nor send a buffer just when a component is shutting down (e.g. at script\nteardown) and simplifies the trivial response (ignore the error and shut\ndown quietly). For example::\n\n def _callback(self, port, buf):\n try:\n buf = self.outputs[0].get_buffer(False)\n except PiCameraPortDisabled:\n return True # shutting down\n # ...'), _('picamera.PiCameraResizerEncoding() \nRaised when picamera uses a resizer purely for encoding purposes.'), _('picamera.PiCameraRuntimeError() \nRaised when an invalid sequence of operations is attempted with a\n:class:`PiCamera` object.'), _('picamera.PiCameraValueError() \nRaised when an invalid value is fed to a :class:`~PiCamera` object.'), _('picamera.PiCameraWarning() \nBase class for PiCamera warnings.'), _('picamera.PiCookedMultiImageEncoder(parent, camera_port, input_port, format, resize, **options) \nEncoder for "cooked" (encoded) multiple image output.\n\nThis encoder descends from :class:`PiMultiImageEncoder` but includes no\nnew functionality as video-port based encodes (which is all this class\nis used for) don\'t support Exif tag output.'), _('picamera.PiCookedOneImageEncoder(parent, camera_port, input_port, format, resize, **options) \nEncoder for "cooked" (encoded) single image output.\n\nThis encoder extends :class:`PiOneImageEncoder` to include Exif tags in the\noutput.'), _('picamera.PiCookedVideoEncoder(parent, camera_port, input_port, format, resize, **options) \nVideo encoder for encoded recordings.\n\nThis class is a derivative of :class:`PiVideoEncoder` and only exists to\nprovide naming symmetry with the image encoder classes.'), _("picamera.PiEncoder(parent, camera_port, input_port, format, resize, **options) \nBase implementation of an MMAL encoder for use by PiCamera.\n\nThe *parent* parameter specifies the :class:`PiCamera` instance that has\nconstructed the encoder. The *camera_port* parameter provides the MMAL\ncamera port that the encoder should enable for capture (this will be the\nstill or video port of the camera component). The *input_port* parameter\nspecifies the MMAL port that the encoder should connect to its input.\nSometimes this will be the same as the camera port, but if other components\nare present in the pipeline (e.g. a splitter), it may be different.\n\nThe *format* parameter specifies the format that the encoder should\nproduce in its output. This is specified as a string and will be one of\nthe following for image encoders:\n\n* ``'jpeg'``\n* ``'png'``\n* ``'gif'``\n* ``'bmp'``\n* ``'yuv'``\n* ``'rgb'``\n* ``'rgba'``\n* ``'bgr'``\n* ``'bgra'``\n\nAnd one of the following for video encoders:\n\n* ``'h264'``\n* ``'mjpeg'``\n\nThe *resize* parameter is either ``None`` (indicating no resizing\nshould take place), or a ``(width, height)`` tuple specifying the\nresolution that the output of the encoder should be resized to.\n\nFinally, the *options* parameter specifies additional keyword arguments\nthat can be used to configure the encoder (e.g. bitrate for videos, or\nquality for images).\n\n.. attribute:: camera_port\n\n The :class:`~mmalobj.MMALVideoPort` that needs to be activated and\n deactivated in order to start/stop capture. This is not necessarily the\n port that the encoder component's input port is connected to (for\n example, in the case of video-port based captures, this will be the\n camera video port behind the splitter).\n\n.. attribute:: encoder\n\n The :class:`~mmalobj.MMALComponent` representing the encoder, or\n ``None`` if no encoder component has been created (some encoder classes\n don't use an actual encoder component, for example\n :class:`PiRawImageMixin`).\n\n.. attribute:: event\n\n A :class:`threading.Event` instance used to synchronize operations\n (like start, stop, and split) between the control thread and the\n callback thread.\n\n.. attribute:: exception\n\n If an exception occurs during the encoder callback, this attribute is\n used to store the exception until it can be re-raised in the control\n thread.\n\n.. attribute:: format\n\n The image or video format that the encoder is expected to produce. This\n is equal to the value of the *format* parameter.\n\n.. attribute:: input_port\n\n The :class:`~mmalobj.MMALVideoPort` that the encoder should be\n connected to.\n\n.. attribute:: output_port\n\n The :class:`~mmalobj.MMALVideoPort` that produces the encoder's output.\n In the case no encoder component is created, this should be the\n camera/component output port responsible for producing data. In other\n words, this attribute **must** be set on initialization.\n\n.. attribute:: outputs\n\n A mapping of ``key`` to ``(output, opened)`` tuples where ``output``\n is a file-like object, and ``opened`` is a bool indicating whether or\n not we opened the output object (and thus whether we are responsible\n for eventually closing it).\n\n.. attribute:: outputs_lock\n\n A :func:`threading.Lock` instance used to protect access to\n :attr:`outputs`.\n\n.. attribute:: parent\n\n The :class:`PiCamera` instance that created this PiEncoder instance.\n\n.. attribute:: pool\n\n A pointer to a pool of MMAL buffers.\n\n.. attribute:: resizer\n\n The :class:`~mmalobj.MMALResizer` component, or ``None`` if no resizer\n component has been created."), _('picamera.PiFramerateRange(low, high) \nThis class is a :func:`~collections.namedtuple` derivative used to store\nthe low and high limits of a range of framerates. It is recommended that\nyou access the information stored by this class by attribute rather than\nposition (for example: ``camera.framerate_range.low`` rather than\n``camera.framerate_range[0]``).\n\n.. attribute:: low\n\n The lowest framerate that the camera is permitted to use (inclusive).\n When the :attr:`~picamera.PiCamera.framerate_range` attribute is\n queried, this value will always be returned as a\n :class:`~fractions.Fraction`.\n\n.. attribute:: high\n\n The highest framerate that the camera is permitted to use (inclusive).\n When the :attr:`~picamera.PiCamera.framerate_range` attribute is\n queried, this value will always be returned as a\n :class:`~fractions.Fraction`.\n\n.. versionadded:: 1.13'), _('picamera.PiImageEncoder(parent, camera_port, input_port, format, resize, **options) \nEncoder for image capture.\n\nThis derivative of :class:`PiEncoder` extends the :meth:`_create_encoder`\nmethod to configure the encoder for a variety of encoded image outputs\n(JPEG, PNG, etc.).'), _('picamera.PiMultiImageEncoder(parent, camera_port, input_port, format, resize, **options) \nEncoder for multiple image capture.\n\nThis class extends :class:`PiImageEncoder` to handle an iterable of outputs\ninstead of a single output. The :meth:`~PiEncoder._callback_write` method\nis extended to terminate capture when the iterable is exhausted, while\n:meth:`PiEncoder._open_output` is overridden to begin iteration and rely\non the new :meth:`_next_output` method to advance output to the next item\nin the iterable.'), _("picamera.PiNullSink(parent, source) \nImplements an :class:`~mmalobj.MMALNullSink` which can be used in place of\na renderer.\n\nThe *parent* parameter specifies the :class:`PiCamera` instance which\nconstructed this :class:`~mmalobj.MMALNullSink`. The *source* parameter\nspecifies the :class:`~mmalobj.MMALPort` which the null-sink should connect\nto its input.\n\nThe null-sink can act as a drop-in replacement for :class:`PiRenderer` in\nmost cases, but obviously doesn't implement attributes like ``alpha``,\n``layer``, etc. as it simply dumps any incoming frames. This is also the\nreason that this class doesn't derive from :class:`PiRenderer` like all\nother classes in this module."), _('picamera.PiOneImageEncoder(parent, camera_port, input_port, format, resize, **options) \nEncoder for single image capture.\n\nThis class simply extends :meth:`~PiEncoder._callback_write` to terminate\ncapture at frame end (i.e. after a single frame has been received).'), _("picamera.PiOverlayRenderer(parent, source, resolution=None, format=None, layer=0, alpha=255, fullscreen=True, window=None, crop=None, rotation=0, vflip=False, hflip=False) \nRepresents an :class:`~mmalobj.MMALRenderer` with a static source for\noverlays.\n\nThis class descends from :class:`PiRenderer` and adds a static *source* for\nthe :class:`~mmalobj.MMALRenderer`. The *source* must be an object that\nsupports the :ref:`buffer protocol ` in one of the supported\nformats.\n\nThe optional *resolution* parameter specifies the size of the *source* as a\n``(width, height)`` tuple. If this is omitted or ``None`` then the\nresolution is assumed to be the same as the parent camera's current\n:attr:`~PiCamera.resolution`. The optional *format* parameter specifies the\nencoding of the *source*. This can be one of the unencoded formats:\n``'yuv'``, ``'rgb'``, ``'rgba'``, ``'bgr'``, or ``'bgra'``. If omitted or\n``None``, *format* will be guessed based on the size of *source* (assuming\n3 bytes for `RGB`_, and 4 bytes for `RGBA`_).\n\nThe length of *source* must take into account that widths are rounded up to\nthe nearest multiple of 32, and heights to the nearest multiple of 16. For\nexample, if *resolution* is ``(1280, 720)``, and *format* is ``'rgb'`` then\n*source* must be a buffer with length 1280 x 720 x 3 bytes, or 2,764,800\nbytes (because 1280 is a multiple of 32, and 720 is a multiple of 16 no\nextra rounding is required). However, if *resolution* is ``(97, 57)``, and\n*format* is ``'rgb'`` then *source* must be a buffer with length 128 x 64 x\n3 bytes, or 24,576 bytes (pixels beyond column 97 and row 57 in the source\nwill be ignored).\n\nThe *layer*, *alpha*, *fullscreen*, and *window* parameters are the same\nas in :class:`PiRenderer`.\n\n.. _RGB: https://en.wikipedia.org/wiki/RGB\n.. _RGBA: https://en.wikipedia.org/wiki/RGBA_color_space\n\n.. versionchanged:: 1.13\n Added *format* parameter"), _("picamera.PiPreviewRenderer(parent, source, resolution=None, layer=2, alpha=255, fullscreen=True, window=None, crop=None, rotation=0, vflip=False, hflip=False) \nRepresents an :class:`~mmalobj.MMALRenderer` which uses the camera's\npreview as a source.\n\nThis class descends from :class:`PiRenderer` and adds an\n:class:`~mmalobj.MMALConnection` to connect the renderer to an MMAL port.\nThe *source* parameter specifies the :class:`~mmalobj.MMALPort` to connect\nto the renderer.\n\nThe *layer*, *alpha*, *fullscreen*, and *window* parameters are the same\nas in :class:`PiRenderer`."), _('picamera.PiRawImageMixin(parent, camera_port, input_port, format, resize, **options) \nMixin class for "raw" (unencoded) image capture.\n\nThe :meth:`_callback_write` method is overridden to manually calculate when\nto terminate output.'), _('picamera.PiRawMixin(parent, camera_port, input_port, format, resize, **options) \nMixin class for "raw" (unencoded) output.\n\nThis mixin class overrides the initializer of :class:`PiEncoder`, along\nwith :meth:`_create_resizer` and :meth:`_create_encoder` to configure the\npipeline for unencoded output. Specifically, it disables the construction\nof an encoder, and sets the output port to the input port passed to the\ninitializer, unless resizing is required (either for actual resizing, or\nfor format conversion) in which case the resizer\'s output is used.'), _('picamera.PiRawMultiImageEncoder(parent, camera_port, input_port, format, resize, **options) \nMultiple image encoder for unencoded capture.\n\nThis class is a derivative of :class:`PiMultiImageEncoder` and the\n:class:`PiRawImageMixin` class intended for use with\n:meth:`~PiCamera.capture_sequence` when it is called with an unencoded\nimage format.\n\n.. warning::\n\n This class creates an inheritance diamond. Take care to determine the\n MRO of super-class calls.'), _('picamera.PiRawOneImageEncoder(parent, camera_port, input_port, format, resize, **options) \nSingle image encoder for unencoded capture.\n\nThis class is a derivative of :class:`PiOneImageEncoder` and the\n:class:`PiRawImageMixin` class intended for use with\n:meth:`~PiCamera.capture` (et al) when it is called with an unencoded image\nformat.\n\n.. warning::\n\n This class creates an inheritance diamond. Take care to determine the\n MRO of super-class calls.'), _('picamera.PiRawVideoEncoder(parent, camera_port, input_port, format, resize, **options) \nVideo encoder for unencoded recordings.\n\nThis class is a derivative of :class:`PiVideoEncoder` and the\n:class:`PiRawMixin` class intended for use with\n:meth:`~PiCamera.start_recording` when it is called with an unencoded\nformat.\n\n.. warning::\n\n This class creates an inheritance diamond. Take care to determine the\n MRO of super-class calls.'), _("picamera.PiRenderer(parent, layer=0, alpha=255, fullscreen=True, window=None, crop=None, rotation=0, vflip=False, hflip=False) \nWraps :class:`~mmalobj.MMALRenderer` for use by PiCamera.\n\nThe *parent* parameter specifies the :class:`PiCamera` instance that has\nconstructed this renderer. The *layer* parameter specifies the layer that\nthe renderer will inhabit. Higher numbered layers obscure lower numbered\nlayers (unless they are partially transparent). The initial opacity of the\nrenderer is specified by the *alpha* parameter (which defaults to 255,\nmeaning completely opaque). The *fullscreen* parameter which defaults to\n``True`` indicates whether the renderer should occupy the entire display.\nFinally, the *window* parameter (which only has meaning when *fullscreen*\nis ``False``) is a four-tuple of ``(x, y, width, height)`` which gives the\nscreen coordinates that the renderer should occupy when it isn't\nfull-screen.\n\nThis base class isn't directly used by :class:`PiCamera`, but the two\nderivatives defined below, :class:`PiOverlayRenderer` and\n:class:`PiPreviewRenderer`, are used to produce overlays and the camera\npreview respectively."), _('picamera.PiResolution(width, height) \nA :func:`~collections.namedtuple` derivative which represents a resolution\nwith a :attr:`width` and :attr:`height`.\n\n.. attribute:: width\n\n The width of the resolution in pixels\n\n.. attribute:: height\n\n The height of the resolution in pixels\n\n.. versionadded:: 1.11'), _('picamera.PiVideoEncoder(parent, camera_port, input_port, format, resize, **options) \nEncoder for video recording.\n\nThis derivative of :class:`PiEncoder` configures itself for H.264 or MJPEG\nencoding. It also introduces a :meth:`split` method which is used by\n:meth:`~PiCamera.split_recording` and :meth:`~PiCamera.record_sequence` to\nredirect future output to a new filename or object. Finally, it also\nextends :meth:`PiEncoder.start` and :meth:`PiEncoder._callback_write` to\ntrack video frame meta-data, and to permit recording motion data to a\nseparate output object.'), _('picamera.PiVideoFrame(index, frame_type, frame_size, video_size, split_size, timestamp, complete) \nThis class is a :func:`~collections.namedtuple` derivative used to store\ninformation about a video frame. It is recommended that you access the\ninformation stored by this class by attribute name rather than position\n(for example: ``frame.index`` rather than ``frame[0]``).\n\n.. attribute:: index\n\n Returns the zero-based number of the frame. This is a monotonic counter\n that is simply incremented every time the camera starts outputting a\n new frame. As a consequence, this attribute cannot be used to detect\n dropped frames. Nor does it necessarily represent actual frames; it\n will be incremented for SPS headers and motion data buffers too.\n\n.. attribute:: frame_type\n\n Returns a constant indicating the kind of data that the frame contains\n (see :class:`PiVideoFrameType`). Please note that certain frame types\n contain no image data at all.\n\n.. attribute:: frame_size\n\n Returns the size in bytes of the current frame. If a frame is written\n in multiple chunks, this value will increment while :attr:`index`\n remains static. Query :attr:`complete` to determine whether the frame\n has been completely output yet.\n\n.. attribute:: video_size\n\n Returns the size in bytes of the entire video up to this frame. Note\n that this is unlikely to match the size of the actual file/stream\n written so far. This is because a stream may utilize buffering which\n will cause the actual amount written (e.g. to disk) to lag behind the\n value reported by this attribute.\n\n.. attribute:: split_size\n\n Returns the size in bytes of the video recorded since the last call to\n either :meth:`~PiCamera.start_recording` or\n :meth:`~PiCamera.split_recording`. For the reasons explained above,\n this may differ from the size of the actual file/stream written so far.\n\n.. attribute:: timestamp\n\n Returns the presentation timestamp (PTS) of the frame. This represents\n the point in time that the Pi received the first line of the frame from\n the camera.\n\n The timestamp is measured in microseconds (millionths of a second).\n When the camera\'s clock mode is ``\'reset\'`` (the default), the\n timestamp is relative to the start of the video recording. When the\n camera\'s :attr:`~PiCamera.clock_mode` is ``\'raw\'``, it is relative to\n the last system reboot. See :attr:`~PiCamera.timestamp` for more\n information.\n\n .. warning::\n\n Currently, the camera occasionally returns "time unknown" values in\n this field which picamera represents as ``None``. If you are\n querying this property you will need to check the value is not\n ``None`` before using it. This happens for SPS header "frames",\n for example.\n\n.. attribute:: complete\n\n Returns a bool indicating whether the current frame is complete or not.\n If the frame is complete then :attr:`frame_size` will not increment\n any further, and will reset for the next frame.\n\n.. versionchanged:: 1.5\n Deprecated :attr:`header` and :attr:`keyframe` attributes and added the\n new :attr:`frame_type` attribute instead.\n\n.. versionchanged:: 1.9\n Added the :attr:`complete` attribute.'), _('picamera.PiVideoFrameType() \nThis class simply defines constants used to represent the type of a frame\nin :attr:`PiVideoFrame.frame_type`. Effectively it is a namespace for an\nenum.\n\n.. attribute:: frame\n\n Indicates a predicted frame (P-frame). This is the most common frame\n type.\n\n.. attribute:: key_frame\n\n Indicates an intra-frame (I-frame) also known as a key frame.\n\n.. attribute:: sps_header\n\n Indicates an inline SPS/PPS header (rather than picture data) which is\n typically used as a split point.\n\n.. attribute:: motion_data\n\n Indicates the frame is inline motion vector data, rather than picture\n data.\n\n.. versionadded:: 1.5'), _('picamera.Red() \nRepresents the red component of a :class:`Color` for use in\ntransformations. Instances of this class can be constructed directly with a\nfloat value, or by querying the :attr:`Color.red` attribute. Addition,\nsubtraction, and multiplication are supported with :class:`Color`\ninstances. For example::\n\n >>> Color.from_rgb(0, 0, 0) + Red(0.5)\n \n >>> Color(\'#f00\') - Color(\'#900\').red\n \n >>> (Red(0.1) * Color(\'red\')).red\n Red(0.1)'), _('picamera.Saturation() \nRepresents the saturation of a :class:`Color` for use in transformations.\nInstances of this class can be constructed directly with a float value, or\nby querying the :attr:`Color.saturation` attribute. Addition, subtraction,\nand multiplication are supported with :class:`Color` instances. For\nexample::\n\n >>> Color(0.9, 0.9, 0.6) + Saturation(0.1)\n \n >>> Color(\'red\') - Saturation(1)\n \n >>> Saturation(0.5) * Color(\'wheat\')\n '), _("picamera.mmal_check(status, prefix='') \nChecks the return status of an mmal call and raises an exception on\nfailure.\n\nThe *status* parameter is the result of an MMAL call. If *status* is\nanything other than MMAL_SUCCESS, a :exc:`PiCameraMMALError` exception is\nraised. The optional *prefix* parameter specifies a prefix message to place\nat the start of the exception's message to provide some context."), _("picamera.str() \nstr(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'."), _("guizero.App(title='guizero', width=500, height=500, layout='auto', bgcolor=None) \nToplevel widget of Tk which represents mostly the main window\nof an application. It has an associated Tcl interpreter."), _("guizero.Box(master, layout='auto', grid=None, align=None) \nFrame widget which may contain other widgets and can have a 3D border."), _('guizero.ButtonGroup(master, options, selected, horizontal=False, command=None, grid=None, align=None) \nFrame widget which may contain other widgets and can have a 3D border.'), _('guizero.CheckBox(master, text, command=None, grid=None, align=None) \nCheckbutton widget which is either in on- or off-state.'), _('guizero.Combo(master, options, selected=None, command=None, grid=None, align=None) \nOptionMenu which allows the user to select a value from a menu.'), _('guizero.MenuBar(master, toplevel, options) \nMenu widget which allows displaying menu bars, pull-down menus and pop-up menus.'), _('guizero.Picture(master, image, grid=None, align=None) \nLabel widget which can display text and bitmaps.'), _("guizero.PushButton(master, command, args=None, text='Button', icon=None, pady=10, padx=10, grid=None, align=None) \nButton widget."), _('guizero.RadioButton(master, text, value, variable, command=None, grid=None, align=None) \nRadiobutton widget which shows only one of several buttons in on-state.'), _('guizero.Slider(master, start=0, end=100, horizontal=True, command=None, grid=None, align=None) \nScale widget which can display a numerical scale.'), _("guizero.Text(master, text='', size=12, color='black', font='Helvetica', grid=None, align=None) \nLabel widget which can display text and bitmaps."), _("guizero.TextBox(master, text='', width=10, grid=None, align=None) \nEntry widget which allows displaying simple text."), _("guizero.Tk(screenName=None, baseName=None, className='Tk', useTk=1, sync=0, use=None) \nToplevel widget of Tk which represents mostly the main window\nof an application. It has an associated Tcl interpreter."), _("guizero.Waffle(master, height=3, width=3, dim=20, pad=5, color='white', dotty=False, remember=False, grid=None, align=None) \nFrame widget which may contain other widgets and can have a 3D border."), _('guizero.exit() \nexit([status])\n\nExit the interpreter by raising SystemExit(status).\nIf the status is omitted or None, it defaults to zero (i.e., success).\nIf the status is an integer, it will be used as the system exit status.\nIf it is another kind of object, it will be printed and the system\nexit status will be one (i.e., failure).'), _('networkzero.DifferentThreadError() \nCommon base class for all non-exit exceptions.'), _('networkzero.InvalidAddressError(address, errno=None) \nCommon base class for all non-exit exceptions.'), _('networkzero.NetworkZeroError() \nCommon base class for all non-exit exceptions.'), _('networkzero.SocketAlreadyExistsError() \nCommon base class for all non-exit exceptions.'), _('networkzero.SocketInterruptedError(after_n_seconds) \nCommon base class for all non-exit exceptions.'), _('networkzero.SocketTimedOutError(n_seconds) \nCommon base class for all non-exit exceptions.'), _('networkzero.action_and_params(commandline) \nTreat a command line as an action followed by parameter\n\n:param commandline: a string containing at least an action\n:returns: action, [param1, param2, ...]'), _('networkzero.address(address=None) \nConvert one of a number of inputs into a valid ip:port string.\n\nElements which are not provided are filled in as follows:\n \n * IP Address: the system is asked for the set of IP addresses associated \n with the machine and the first one is used, preferring those matching\n `address` if it is a wildcard.\n * Port number: a random port is selected from the pool of dynamically-available \n port numbers.\n \nThis means you can pass any of: nothing; a hostname; an IP address; an IP address with wildcards; a port number\n\nIf an IP address is supplied but is invalid, an InvalidAddressError\nexception is raised.\n\n:param address: (optional) Any of: an IP address, a port number, or both\n\n:returns: a valid ip:port string for this machine'), _('networkzero.advertise(name, address=None, fail_if_exists=False, ttl_s=20) \nAdvertise a name at an address\n\nStart to advertise service `name` at address `address`. If\nthe address is not supplied, one is constructed and this is\nreturned by the function. ie this is a typical use::\n\n address = nw0.advertise("myservice")\n \n:param name: any text\n:param address: either "ip:port" or None\n:param fail_if_exists: fail if this name is already registered?\n:param ttl_s: the advert will persist for this many seconds other beacons\n:returns: the address given or constructed'), _('networkzero.bytes_to_string(data) \nTake bytes and return a base64-encoded unicode string equivalent\n\n:param data: a bytes object\n:returns: base64-encoded unicode object'), _('networkzero.discover(name, wait_for_s=60) \nDiscover a service by name\n\nLook for an advert to a named service::\n\n address = nw0.discover("myservice")\n \n:param name: any text\n:param wait_for_s: how many seconds to wait before giving up\n:returns: the address found or None'), _('networkzero.discover_all() \nProduce a list of all known services and their addresses\n\nAsk for all known services as a list of 2-tuples: (name, address)\nThis could, eg, be used to form a dictionary of services::\n\n services = dict(nw0.discover_all())\n \n:returns: a list of 2-tuples [(name, address), ...]'), _("networkzero.discover_group(group, separator='/', exclude=None) \nProduce a list of all services and their addresses in a group\n\nA group is an optional form of namespace within the discovery mechanism.\nIf an advertised name has the form it is deemed to\nbelong to . Note that the service's name is still the full\nstring . The group concept is simply for discovery and\nto assist differentiation, eg, in a classroom group.\n\n:param group: the name of a group prefix\n:param separator: the separator character [/]\n:param exclude: an iterable of names to exclude (or None)\n\n:returns: a list of 2-tuples [(name, address), ...]"), _('networkzero.networkzero.config() \nCommon configuration elements for networkzero'), _("networkzero.networkzero.discovery() \nAdvertise and collect advertisements of network services\n\nThe discovery module offers:\n\n * A UDP broadcast socket which:\n \n - Listens for and keeps track of service adverts from this and other \n machines & processes\n - Broadcasts services advertised by this process\n\n * A ZeroMQ socket which allow any process on this machine to \n communicate with its broadcast socket\n\nIn other words, we have a beacon which listens to instructions\nfrom processes on this machine while sending out and listening \nto adverts broadcast to/from all machines on the network.\n\nThe beacon is started automatically in a daemon thread when the first \nattempt is made to advertise or discover. If another process already \nhas a beacon running (ie if this beacon can't bind to its port) this \nbeacon thread will shut down with no further action.\n\nThe module-level functions to advertise and discover will open a connection\nto a ZeroMQ socket on this machine (which might be hosted by this or by another\nprocess) and will use this socket to send commands to the beacon thread which\nwill update or return its internal list of advertised services.\n\nAs an additional convenience, the :func:`advertise` function will, if given no\nspecific address, generate a suitable ip:port pair by interrogating the system.\nThis functionality is actually in :func:`networkzero.address` (qv)."), _('networkzero.send_message_to(address, message=None, wait_for_reply_s=) \nSend a message and return the reply\n\n:param address: a nw0 address (eg from `nw0.discover`)\n:param message: any simple Python object, including text & tuples\n:param wait_for_reply_s: how many seconds to wait for a reply [default: forever]\n\n:returns: the reply returned from the address or None if out of time'), _('networkzero.send_news_to(address, topic, data=None) \nPublish news to all subscribers\n\n:param address: a nw0 address, eg from `nw0.advertise`\n:param topic: any text object\n:param data: any simple Python object including test & tuples [default: empty]'), _('networkzero.send_reply_to(address, reply=None) \nReply to a message previously received\n\n:param address: a nw0 address (eg from `nw0.advertise`)\n:param reply: any simple Python object, including text & tuples'), _('networkzero.string_to_bytes(data) \nTake a base64-encoded unicode string and return the equivalent bytes\n\n:param data: a base64-encoded unicode object\n:returns: the equivalent bytes'), _('networkzero.wait_for_message_from(address, wait_for_s=, autoreply=False) \nWait for a message\n\n:param address: a nw0 address (eg from `nw0.advertise`)\n:param wait_for_s: how many seconds to wait for a message before giving up [default: forever]\n:param autoreply: whether to send an empty reply [default: No]\n\n:returns: the message received from another address or None if out of time'), _("networkzero.wait_for_news_from(address, prefix='', wait_for_s=) \nWait for news whose topic starts with `prefix`.\n\n:param address: a nw0 address, eg from `nw0.discover`\n:param prefix: any text object [default: all messages]\n:param wait_for_s: how many seconds to wait before giving up [default: forever]\n\n:returns: a 2-tuple of (topic, data) or (None, None) if out of time"), ] mu-editor-1.0.2+dfsg/mu/modes/api/pygamezero.py000066400000000000000000000255611341747546300214220ustar00rootroot00000000000000""" Contains definitions for the PyGame / PyGameZero related APIs so they can be used in the editor for autocomplete and call tips. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ PYGAMEZERO_APIS = [ _('actor.Actor(image, pos=None, anchor=None, **kwargs) \nRect(left, top, width, height) -> Rect\nRect((left, top), (width, height)) -> Rect\nRect(object) -> Rect\npygame object for storing rectangular coordinates'), _('actor.atan2() \natan2(y, x)\n\nReturn the arc tangent (measured in radians) of y/x.\nUnlike atan(y/x), the signs of both x and y are considered.'), _('actor.cos() \ncos(x)\n\nReturn the cosine of x (measured in radians).'), _('actor.degrees() \ndegrees(x)\n\nConvert angle x from radians to degrees.'), _('actor.pygame() \nPygame is a set of Python modules designed for writing games.\nIt is written on top of the excellent SDL library. This allows you\nto create fully featured games and multimedia programs in the python\nlanguage. The package is highly portable, with games running on\nWindows, MacOS, OS X, BeOS, FreeBSD, IRIX, and Linux.'), _('actor.radians() \nradians(x)\n\nConvert angle x from degrees to radians.'), _('actor.sin() \nsin(x)\n\nReturn the sine of x (measured in radians).'), _('actor.sqrt() \nsqrt(x)\n\nReturn the square root of x.'), _('actor.transform_anchor(ax, ay, w, h, angle) \nTransform anchor based upon a rotation of a surface of size w x h.'), _('animation.Animation(object, tween=\'linear\', duration=1, on_finished=None, **targets) \nAn animation manager for object attribute animations.\n\nEach keyword argument given to the Animation on creation (except\n"type" and "duration") will be *tweened* from their current value\non the object to the target value specified.\n\nIf the value is a list or tuple, then each value inside that will\nbe tweened.\n\nThe update() method is automatically scheduled with the clock for\nthe duration of the animation.'), _('animation.each_tick(callback) \nSchedule a callback to be called every tick.\n\nUnlike the standard scheduler functions, the callable is passed the\nelapsed clock time since the last call (the same value passed to tick).'), _('animation.pow() \npow(x, y)\n\nReturn x**y (x to the power of y).'), _('animation.sin() \nsin(x)\n\nReturn the sine of x (measured in radians).'), _('animation.unschedule(callback) \nUnschedule the given callback.\n\nIf scheduled multiple times all instances will be unscheduled.'), _('clock.Clock() \nA clock used for event scheduling.\n\nWhen tick() is called, all events scheduled for before now will be called\nin order.\n\ntick() would typically be called from the game loop for the default clock.\n\nAdditional clocks could be created - for example, a game clock that could\nbe suspended in pause screens. Your code must take care of calling tick()\nor not. You could also run the clock at a different rate if desired, by\nscaling dt before passing it to tick().'), _('clock.Event(time, cb, repeat=None) \nAn event scheduled for a future time.\n\nEvents are ordered by their scheduled execution time.'), _('clock.each_tick(callback) \nSchedule a callback to be called every tick.\n\nUnlike the standard scheduler functions, the callable is passed the\nelapsed clock time since the last call (the same value passed to tick).'), _('clock.heapq() \nHeap queue algorithm (a.k.a. priority queue).\n\nHeaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\nall k, counting elements from 0. For the sake of comparison,\nnon-existing elements are considered to be infinite. The interesting\nproperty of a heap is that a[0] is always its smallest element.\n\nUsage:\n\nheap = [] # creates an empty heap\nheappush(heap, item) # pushes a new item on the heap\nitem = heappop(heap) # pops the smallest item from the heap\nitem = heap[0] # smallest item on the heap without popping it\nheapify(x) # transforms list into a heap, in-place, in linear time\nitem = heapreplace(heap, item) # pops and returns smallest item, and adds\n # new item; the heap size is unchanged\n\nOur API differs from textbook heap algorithms as follows:\n\n- We use 0-based indexing. This makes the relationship between the\n index for a node and the indexes for its children slightly less\n obvious, but is more suitable since Python uses 0-based indexing.\n\n- Our heappop() method returns the smallest item, not the largest.\n\nThese two make it possible to view the heap as a regular Python list\nwithout surprises: heap[0] is the smallest item, and heap.sort()\nmaintains the heap invariant!'), _('clock.method() \nmethod(function, instance)\n\nCreate a bound instance method object.'), _('clock.schedule(callback, delay) \nSchedule callback to be called once, at `delay` seconds from now.\n\n:param callback: A parameterless callable to be called.\n:param delay: The delay before the call (in clock time / seconds).'), _('clock.schedule_interval(callback, delay) \nSchedule callback to be called every `delay` seconds.\n\nThe first occurrence will be after `delay` seconds.\n\n:param callback: A parameterless callable to be called.\n:param delay: The interval in seconds.'), _('clock.schedule_unique(callback, delay) \nSchedule callback to be called once, at `delay` seconds from now.\n\nIf it was already scheduled, postpone its firing.\n\n:param callback: A parameterless callable to be called.\n:param delay: The delay before the call (in clock time / seconds).'), _('clock.tick(dt) \nUpdate the clock time and fire all scheduled events.\n\n:param dt: The elapsed time in seconds.'), _('clock.total_ordering(cls) \nClass decorator that fills in missing ordering methods'), _('clock.unschedule(callback) \nUnschedule the given callback.\n\nIf scheduled multiple times all instances will be unscheduled.'), _("clock.weak_method(method) \nQuick weak method ref in case users aren't using Python 3.4"), _('draw.circle(position, radius, (r, g, b)) \nDraw the outline of a circle.'), _('draw.filled_circle(position, radius, (r, g, b)) \nDraw a filled circle.'), _('draw.filled_rect(rect, (r, g, b)) \nDraw a filled rectangle. Takes a Rect object. For example, Rect((20, 20), (100, 100))'), _('draw.line(start, end, (r, g, b)) \nDraw a line from start to end.'), _('draw.rect(rect, (r, g, b)) \nDraw the outline of a rectangle. Takes a Rect object. For example, Rect((20, 20), (100, 100))'), _('draw.text(text, [pos, ]**kwargs) \nDraw text. There’s an extremely rich API for positioning and formatting text; see Pygame Zero Text Formatting for full details.'), _('draw.textbox(text, rect, **kwargs) \nDraw text, sized to fill the given Rect. There’s an extremely rich API for positioning and formatting text; see Pygame Zero Text Formatting for full details.'), _("keyboard.Keyboard() \nThe current state of the keyboard.\n\nEach attribute represents a key. For example, ::\n\n keyboard.a\n\nis True if the 'A' key is depressed, and False otherwise."), _('keyboard.keys(value, names=None, *, module=None, qualname=None, type=None, start=1) \nAn enumeration.'), _('keyboard.re() \nSupport for regular expressions (RE).'), _('keyboard.warn() \nIssue a warning, or maybe ignore it or raise an exception.'), _("music.ResourceLoader(subpath) \nAbstract resource loader.\n\nA resource loader is a singleton; resources are loaded from a named\nsubdirectory of the global 'root'. The `.load()` method actually loads\na resource.\n\nAdditionally, attribute access can be used to access and cache resources.\nDotted paths can be used to traverse directories."), _('music.fadeout(seconds) \nFade out and eventually stop the music playback.\n\n:param seconds: The duration in seconds over which the sound will be faded\n out. For example, to fade out over half a second, call\n ``music.fadeout(0.5)``.'), _('music.get_pos() \nget_pos() -> time\nget the music play time'), _('music.get_volume() \nget_volume() -> value\nget the music volume'), _('music.is_playing(name) \nReturn True if the music is playing and not paused.'), _('music.pause() \nTemporarily stop playback of the music stream.\n\nCall `unpause()` to resume.'), _('music.pgzero.constants() \nNames for constants returned by Pygame.'), _('music.play(name) \nPlay a music file from the music/ directory.\n\nThe music will loop when it finishes playing.'), _('music.play_once(name) \nPlay a music file from the music/ directory.'), _('music.queue(name) \nQueue a music file to follow the current track.\n\nThis will load a music file and queue it. A queued music file will begin as\nsoon as the current music naturally ends. If the current music is ever\nstopped or changed, the queued song will be lost.'), _('music.rewind() \nrewind() -> None\nrestart music'), _('music.set_pos() \nset_pos(pos) -> None\nset position to play from'), _('music.set_volume() \nset_volume(value) -> None\nset the music volume'), _('music.stop() \nstop() -> None\nstop the music playback'), _('music.unpause() \nResume playback of the music stream after it has been paused.'), _('screen.blit(image, (left, top)) \nDraw the image to the screen at the given position. \nblit() accepts either a Surface or a string as its image parameter. If image is a str then the named image will be loaded from the images/ directory.'), _('screen.clear() \nReset the screen to black.'), _('screen.fill((red, green, blue)) \nFill the screen with a solid color.'), _('screen.Screen(surface) \nInterface to the screen.'), _('screen.SurfacePainter(screen) \nInterface to pygame.draw that is bound to a surface.'), _('screen.pgzero.ptext() \npygame-text - high-level text rendering with Pygame.\n\nThis module is directly copied from\n\n https://github.com/cosmologicon/pygame-text\n\nat revision c04e59b7382a832e117f0598cdcbc1bb3eb26db5\nand used under CC0.'), _('screen.pygame() \nPygame is a set of Python modules designed for writing games.\nIt is written on top of the excellent SDL library. This allows you\nto create fully featured games and multimedia programs in the python\nlanguage. The package is highly portable, with games running on\nWindows, MacOS, OS X, BeOS, FreeBSD, IRIX, and Linux.'), _('screen.round_pos(pos) \nRound a tuple position so it can be used for drawing.'), ] mu-editor-1.0.2+dfsg/mu/modes/api/python3.py000066400000000000000000006743531341747546300206550ustar00rootroot00000000000000""" Contains definitions for Python 3 APIs so they can be used in the editor for autocomplete and call tips. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ PYTHON3_APIS = [ _("argparse.Action(option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None) \nInformation about how to convert command line strings to Python objects.\n\nAction objects are used by an ArgumentParser to represent the information\nneeded to parse a single argument from one or more strings from the\ncommand line. The keyword arguments to the Action constructor are also\nall attributes of Action instances.\n\nKeyword Arguments:\n\n - option_strings -- A list of command-line option strings which\n should be associated with this action.\n\n - dest -- The name of the attribute to hold the created object(s)\n\n - nargs -- The number of command-line arguments that should be\n consumed. By default, one argument will be consumed and a single\n value will be produced. Other values include:\n - N (an integer) consumes N arguments (and produces a list)\n - '?' consumes zero or one arguments\n - '*' consumes zero or more arguments (and produces a list)\n - '+' consumes one or more arguments (and produces a list)\n Note that the difference between the default and nargs=1 is that\n with the default, a single value will be produced, while with\n nargs=1, a list containing a single value will be produced.\n\n - const -- The value to be produced if the option is specified and the\n option uses an action that takes no values.\n\n - default -- The value to be produced if the option is not specified.\n\n - type -- A callable that accepts a single string argument, and\n returns the converted value. The standard Python types str, int,\n float, and complex are useful examples of such callables. If None,\n str is used.\n\n - choices -- A container of values that should be allowed. If not None,\n after a command-line argument has been converted to the appropriate\n type, an exception will be raised if it is not a member of this\n collection.\n\n - required -- True if the action must always be specified at the\n command line. This is only meaningful for optional command-line\n arguments.\n\n - help -- The help string describing the argument.\n\n - metavar -- The name to be used for the option's argument with the\n help string. If None, the 'dest' value will be used as the name."), _('argparse.ArgumentDefaultsHelpFormatter(prog, indent_increment=2, max_help_position=24, width=None) \nHelp message formatter which adds default values to argument help.\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail.'), _('argparse.ArgumentError(argument, message) \nAn error from creating or using an argument (optional or positional).\n\nThe string value of this exception is the message, augmented with\ninformation about the argument that caused it.'), _("argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True) \nObject for parsing command line strings into Python objects.\n\nKeyword Arguments:\n - prog -- The name of the program (default: sys.argv[0])\n - usage -- A usage message (default: auto-generated from arguments)\n - description -- A description of what the program does\n - epilog -- Text following the argument descriptions\n - parents -- Parsers whose arguments should be copied into this one\n - formatter_class -- HelpFormatter class for printing help messages\n - prefix_chars -- Characters that prefix optional arguments\n - fromfile_prefix_chars -- Characters that prefix files containing\n additional arguments\n - argument_default -- The default value for all arguments\n - conflict_handler -- String indicating how to handle conflicts\n - add_help -- Add a -h/-help option\n - allow_abbrev -- Allow long options to be abbreviated unambiguously"), _('argparse.ArgumentTypeError() \nAn error from trying to convert a command line string to a type.'), _("argparse.FileType(mode='r', bufsize=-1, encoding=None, errors=None) \nFactory for creating file object types\n\nInstances of FileType are typically passed as type= arguments to the\nArgumentParser add_argument() method.\n\nKeyword Arguments:\n - mode -- A string indicating how the file is to be opened. Accepts the\n same values as the builtin open() function.\n - bufsize -- The file's desired buffer size. Accepts the same values as\n the builtin open() function.\n - encoding -- The file's encoding. Accepts the same values as the\n builtin open() function.\n - errors -- A string indicating how encoding and decoding errors are to\n be handled. Accepts the same value as the builtin open() function."), _('argparse.HelpFormatter(prog, indent_increment=2, max_help_position=24, width=None) \nFormatter for generating usage messages and argument help strings.\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail.'), _("argparse.MetavarTypeHelpFormatter(prog, indent_increment=2, max_help_position=24, width=None) \nHelp message formatter which uses the argument 'type' as the default\nmetavar value (instead of the argument 'dest')\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail."), _('argparse.Namespace(**kwargs) \nSimple object for storing attributes.\n\nImplements equality by attribute names and values, and provides a simple\nstring representation.'), _('argparse.RawDescriptionHelpFormatter(prog, indent_increment=2, max_help_position=24, width=None) \nHelp message formatter which retains any formatting in descriptions.\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail.'), _('argparse.RawTextHelpFormatter(prog, indent_increment=2, max_help_position=24, width=None) \nHelp message formatter which retains formatting of all help text.\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail.'), _("array.array() \narray(typecode [, initializer]) -> array\n\nReturn a new array whose items are restricted by typecode, and\ninitialized from the optional initializer value, which must be a list,\nstring or iterable over elements of the appropriate type.\n\nArrays represent basic values and behave very much like lists, except\nthe type of objects stored in them is constrained. The type is specified\nat object creation time by using a type code, which is a single character.\nThe following type codes are defined:\n\n Type code C Type Minimum size in bytes \n 'b' signed integer 1 \n 'B' unsigned integer 1 \n 'u' Unicode character 2 (see note) \n 'h' signed integer 2 \n 'H' unsigned integer 2 \n 'i' signed integer 2 \n 'I' unsigned integer 2 \n 'l' signed integer 4 \n 'L' unsigned integer 4 \n 'q' signed integer 8 (see note) \n 'Q' unsigned integer 8 (see note) \n 'f' floating point 4 \n 'd' floating point 8 \n\nNOTE: The 'u' typecode corresponds to Python's unicode character. On \nnarrow builds this is 2-bytes on wide builds this is 4-bytes.\n\nNOTE: The 'q' and 'Q' type codes are only available if the platform \nC compiler used to build Python supports 'long long', or, on Windows, \n'__int64'.\n\nMethods:\n\nappend() -- append a new item to the end of the array\nbuffer_info() -- return information giving the current memory info\nbyteswap() -- byteswap all the items of the array\ncount() -- return number of occurrences of an object\nextend() -- extend array by appending multiple elements from an iterable\nfromfile() -- read items from a file object\nfromlist() -- append items from the list\nfrombytes() -- append items from the string\nindex() -- return index of first occurrence of an object\ninsert() -- insert a new item into the array at a provided position\npop() -- remove and return item (default last)\nremove() -- remove first occurrence of an object\nreverse() -- reverse the order of the items in the array\ntofile() -- write all items to a file object\ntolist() -- return the array converted to an ordinary list\ntobytes() -- return the array converted to a string\n\nAttributes:\n\ntypecode -- the typecode character used to create the array\nitemsize -- the length in bytes of one array item"), _("array.array() \narray(typecode [, initializer]) -> array\n\nReturn a new array whose items are restricted by typecode, and\ninitialized from the optional initializer value, which must be a list,\nstring or iterable over elements of the appropriate type.\n\nArrays represent basic values and behave very much like lists, except\nthe type of objects stored in them is constrained. The type is specified\nat object creation time by using a type code, which is a single character.\nThe following type codes are defined:\n\n Type code C Type Minimum size in bytes \n 'b' signed integer 1 \n 'B' unsigned integer 1 \n 'u' Unicode character 2 (see note) \n 'h' signed integer 2 \n 'H' unsigned integer 2 \n 'i' signed integer 2 \n 'I' unsigned integer 2 \n 'l' signed integer 4 \n 'L' unsigned integer 4 \n 'q' signed integer 8 (see note) \n 'Q' unsigned integer 8 (see note) \n 'f' floating point 4 \n 'd' floating point 8 \n\nNOTE: The 'u' typecode corresponds to Python's unicode character. On \nnarrow builds this is 2-bytes on wide builds this is 4-bytes.\n\nNOTE: The 'q' and 'Q' type codes are only available if the platform \nC compiler used to build Python supports 'long long', or, on Windows, \n'__int64'.\n\nMethods:\n\nappend() -- append a new item to the end of the array\nbuffer_info() -- return information giving the current memory info\nbyteswap() -- byteswap all the items of the array\ncount() -- return number of occurrences of an object\nextend() -- extend array by appending multiple elements from an iterable\nfromfile() -- read items from a file object\nfromlist() -- append items from the list\nfrombytes() -- append items from the string\nindex() -- return index of first occurrence of an object\ninsert() -- insert a new item into the array at a provided position\npop() -- remove and return item (default last)\nremove() -- remove first occurrence of an object\nreverse() -- reverse the order of the items in the array\ntofile() -- write all items to a file object\ntolist() -- return the array converted to an ordinary list\ntobytes() -- return the array converted to a string\n\nAttributes:\n\ntypecode -- the typecode character used to create the array\nitemsize -- the length in bytes of one array item"), _('base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b\' \\t\\n\\r\\x0b\') \nDecode the Ascii85 encoded bytes-like object or ASCII string b.\n\nfoldspaces is a flag that specifies whether the \'y\' short sequence should be\naccepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature is\nnot supported by the "standard" Adobe encoding.\n\nadobe controls whether the input sequence is in Adobe Ascii85 format (i.e.\nis framed with <~ and ~>).\n\nignorechars should be a byte string containing characters to ignore from the\ninput. This should only contain whitespace characters, and by default\ncontains all whitespace characters in ASCII.\n\nThe result is returned as a bytes object.'), _('base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False) \nEncode bytes-like object b using Ascii85 and return a bytes object.\n\nfoldspaces is an optional flag that uses the special short sequence \'y\'\ninstead of 4 consecutive spaces (ASCII 0x20) as supported by \'btoa\'. This\nfeature is not supported by the "standard" Adobe encoding.\n\nwrapcol controls whether the output should have newline (b\'\\n\') characters\nadded to it. If this is non-zero, each output line will be at most this\nmany characters long.\n\npad controls whether the input is padded to a multiple of 4 before\nencoding. Note that the btoa implementation always pads.\n\nadobe controls whether the encoded byte sequence is framed with <~ and ~>,\nwhich is used by the Adobe implementation.'), _('base64.b16decode(s, casefold=False) \nDecode the Base16 encoded bytes-like object or ASCII string s.\n\nOptional casefold is a flag specifying whether a lowercase alphabet is\nacceptable as input. For security purposes, the default is False.\n\nThe result is returned as a bytes object. A binascii.Error is raised if\ns is incorrectly padded or if there are non-alphabet characters present\nin the input.'), _('base64.b16encode(s) \nEncode the bytes-like object s using Base16 and return a bytes object.\n '), _('base64.b32decode(s, casefold=False, map01=None) \nDecode the Base32 encoded bytes-like object or ASCII string s.\n\nOptional casefold is a flag specifying whether a lowercase alphabet is\nacceptable as input. For security purposes, the default is False.\n\nRFC 3548 allows for optional mapping of the digit 0 (zero) to the\nletter O (oh), and for optional mapping of the digit 1 (one) to\neither the letter I (eye) or letter L (el). The optional argument\nmap01 when not None, specifies which letter the digit 1 should be\nmapped to (when map01 is not None, the digit 0 is always mapped to\nthe letter O). For security purposes the default is None, so that\n0 and 1 are not allowed in the input.\n\nThe result is returned as a bytes object. A binascii.Error is raised if\nthe input is incorrectly padded or if there are non-alphabet\ncharacters present in the input.'), _('base64.b32encode(s) \nEncode the bytes-like object s using Base32 and return a bytes object.\n '), _("base64.b64decode(s, altchars=None, validate=False) \nDecode the Base64 encoded bytes-like object or ASCII string s.\n\nOptional altchars must be a bytes-like object or ASCII string of length 2\nwhich specifies the alternative alphabet used instead of the '+' and '/'\ncharacters.\n\nThe result is returned as a bytes object. A binascii.Error is raised if\ns is incorrectly padded.\n\nIf validate is False (the default), characters that are neither in the\nnormal base-64 alphabet nor the alternative alphabet are discarded prior\nto the padding check. If validate is True, these non-alphabet characters\nin the input result in a binascii.Error."), _("base64.b64encode(s, altchars=None) \nEncode the bytes-like object s using Base64 and return a bytes object.\n\nOptional altchars should be a byte string of length 2 which specifies an\nalternative alphabet for the '+' and '/' characters. This allows an\napplication to e.g. generate url or filesystem safe Base64 strings."), _('base64.b85decode(b) \nDecode the base85-encoded bytes-like object or ASCII string b\n\nThe result is returned as a bytes object.'), _("base64.b85encode(b, pad=False) \nEncode bytes-like object b in base85 format and return a bytes object.\n\nIf pad is true, the input is padded with b'\\0' so its length is a multiple of\n4 bytes before encoding."), _('base64.binascii() \nConversion between binary data and ASCII'), _('base64.decode(input, output) \nDecode a file; input and output are binary files.'), _('base64.decodebytes(s) \nDecode a bytestring of base-64 data into a bytes object.'), _('base64.decodestring(s) \nLegacy alias of decodebytes().'), _('base64.encode(input, output) \nEncode a file; input and output are binary files.'), _('base64.encodebytes(s) \nEncode a bytestring into a bytes object containing multiple lines\nof base-64 data.'), _('base64.encodestring(s) \nLegacy alias of encodebytes().'), _('base64.main() \nSmall main program'), _('base64.re() \nSupport for regular expressions (RE).\n\nThis module provides regular expression matching operations similar to\nthose found in Perl. It supports both 8-bit and Unicode strings; both\nthe pattern and the strings being processed can contain null bytes and\ncharacters outside the US ASCII range.\n\nRegular expressions can contain both special and ordinary characters.\nMost ordinary characters, like "A", "a", or "0", are the simplest\nregular expressions; they simply match themselves. You can\nconcatenate ordinary characters, so last matches the string \'last\'.\n\nThe special characters are:\n "." Matches any character except a newline.\n "^" Matches the start of the string.\n "$" Matches the end of the string or just before the newline at\n the end of the string.\n "*" Matches 0 or more (greedy) repetitions of the preceding RE.\n Greedy means that it will match as many repetitions as possible.\n "+" Matches 1 or more (greedy) repetitions of the preceding RE.\n "?" Matches 0 or 1 (greedy) of the preceding RE.\n *?,+?,?? Non-greedy versions of the previous three special characters.\n {m,n} Matches from m to n repetitions of the preceding RE.\n {m,n}? Non-greedy version of the above.\n "\\\\" Either escapes special characters or signals a special sequence.\n [] Indicates a set of characters.\n A "^" as the first character indicates a complementing set.\n "|" A|B, creates an RE that will match either A or B.\n (...) Matches the RE inside the parentheses.\n The contents can be retrieved or matched later in the string.\n (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below).\n (?:...) Non-grouping version of regular parentheses.\n (?P...) The substring matched by the group is accessible by name.\n (?P=name) Matches the text matched earlier by the group named name.\n (?#...) A comment; ignored.\n (?=...) Matches if ... matches next, but doesn\'t consume the string.\n (?!...) Matches if ... doesn\'t match next.\n (?<=...) Matches if preceded by ... (must be fixed length).\n (?: big-endian, std. size & alignment\n !: same as >\n\nThe remaining chars indicate types of args and must match exactly;\nthese can be preceded by a decimal repeat count:\n x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n ?: _Bool (requires C99; if not available, char is used instead)\n h:short; H:unsigned short; i:int; I:unsigned int;\n l:long; L:unsigned long; f:float; d:double; e:half-float.\nSpecial cases (preceding decimal count indicates length):\n s:string (array of char); p: pascal string (with count byte).\nSpecial cases (only available in native format):\n n:ssize_t; N:size_t;\n P:an integer type that is wide enough to hold a pointer.\nSpecial case (not in native mode unless 'long long' in platform C):\n q:long long; Q:unsigned long long\nWhitespace between formats is ignored.\n\nThe variable struct.error is an exception raised on errors."), _("base64.urlsafe_b64decode(s) \nDecode bytes using the URL- and filesystem-safe Base64 alphabet.\n\nArgument s is a bytes-like object or ASCII string to decode. The result\nis returned as a bytes object. A binascii.Error is raised if the input\nis incorrectly padded. Characters that are not in the URL-safe base-64\nalphabet, and are not a plus '+' or slash '/', are discarded prior to the\npadding check.\n\nThe alphabet uses '-' instead of '+' and '_' instead of '/'."), _("base64.urlsafe_b64encode(s) \nEncode bytes using the URL- and filesystem-safe Base64 alphabet.\n\nArgument s is a bytes-like object to encode. The result is returned as a\nbytes object. The alphabet uses '-' instead of '+' and '_' instead of\n'/'."), _('collections.ByteString() \nThis unifies bytes and bytearray.\n\nXXX Should add all their methods.'), _('collections.ChainMap(*maps) \nA ChainMap groups multiple dicts (or other mappings) together\nto create a single, updateable view.\n\nThe underlying mappings are stored in a list. That list is public and can\nbe accessed or updated using the *maps* attribute. There is no other\nstate.\n\nLookups search the underlying mappings successively until a key is found.\nIn contrast, writes, updates, and deletions only operate on the first\nmapping.'), _("collections.Counter(*args, **kwds) \nDict subclass for counting hashable items. Sometimes called a bag\nor multiset. Elements are stored as dictionary keys and their counts\nare stored as dictionary values.\n\n>>> c = Counter('abcdeabcdabcaba') # count elements from a string\n\n>>> c.most_common(3) # three most common elements\n[('a', 5), ('b', 4), ('c', 3)]\n>>> sorted(c) # list all unique elements\n['a', 'b', 'c', 'd', 'e']\n>>> ''.join(sorted(c.elements())) # list elements with repetitions\n'aaaaabbbbcccdde'\n>>> sum(c.values()) # total of all counts\n15\n\n>>> c['a'] # count of letter 'a'\n5\n>>> for elem in 'shazam': # update counts from an iterable\n... c[elem] += 1 # by adding 1 to each element's count\n>>> c['a'] # now there are seven 'a'\n7\n>>> del c['b'] # remove all 'b'\n>>> c['b'] # now there are zero 'b'\n0\n\n>>> d = Counter('simsalabim') # make another counter\n>>> c.update(d) # add in the second counter\n>>> c['a'] # now there are nine 'a'\n9\n\n>>> c.clear() # empty the counter\n>>> c\nCounter()\n\nNote: If a count is set to zero or reduced to zero, it will remain\nin the counter until the entry is deleted or the counter is cleared:\n\n>>> c = Counter('aaabbc')\n>>> c['b'] -= 2 # reduce the count of 'b' by two\n>>> c.most_common() # 'b' is still in, but its count is zero\n[('a', 3), ('c', 1), ('b', 0)]"), _('collections.ItemsView(mapping) \nA set is a finite, iterable container.\n\nThis class provides concrete generic implementations of all\nmethods except for __contains__, __iter__ and __len__.\n\nTo override the comparisons (presumably for speed, as the\nsemantics are fixed), redefine __le__ and __ge__,\nthen the other operations will automatically follow suit.'), _('collections.KeysView(mapping) \nA set is a finite, iterable container.\n\nThis class provides concrete generic implementations of all\nmethods except for __contains__, __iter__ and __len__.\n\nTo override the comparisons (presumably for speed, as the\nsemantics are fixed), redefine __le__ and __ge__,\nthen the other operations will automatically follow suit.'), _('collections.MutableSequence() \nAll the operations on a read-only sequence.\n\nConcrete subclasses must override __new__ or __init__,\n__getitem__, and __len__.'), _('collections.MutableSet() \nA mutable set is a finite, iterable container.\n\nThis class provides concrete generic implementations of all\nmethods except for __contains__, __iter__, __len__,\nadd(), and discard().\n\nTo override the comparisons (presumably for speed, as the\nsemantics are fixed), all you have to do is redefine __le__ and\nthen the other operations will automatically follow suit.'), _('collections.OrderedDict() \nDictionary that remembers insertion order'), _('collections.Sequence() \nAll the operations on a read-only sequence.\n\nConcrete subclasses must override __new__ or __init__,\n__getitem__, and __len__.'), _('collections.Set() \nA set is a finite, iterable container.\n\nThis class provides concrete generic implementations of all\nmethods except for __contains__, __iter__ and __len__.\n\nTo override the comparisons (presumably for speed, as the\nsemantics are fixed), redefine __le__ and __ge__,\nthen the other operations will automatically follow suit.'), _('collections.UserList(initlist=None) \nA more or less complete user-defined wrapper around list objects.'), _('collections.UserString(seq) \nAll the operations on a read-only sequence.\n\nConcrete subclasses must override __new__ or __init__,\n__getitem__, and __len__.'), _('collections.defaultdict() \ndefaultdict(default_factory[, ...]) --> dict with default factory\n\nThe default factory is called without arguments to produce\na new value when a key is not present, in __getitem__ only.\nA defaultdict compares equal to a dict with the same items.\nAll remaining arguments are treated the same as if they were\npassed to the dict constructor, including keyword arguments.'), _('collections.deque() \ndeque([iterable[, maxlen]]) --> deque object\n\nA list-like sequence optimized for data accesses near its endpoints.'), _("collections.namedtuple(typename, field_names, *, verbose=False, rename=False, module=None) \nReturns a new subclass of tuple with named fields.\n\n>>> Point = namedtuple('Point', ['x', 'y'])\n>>> Point.__doc__ # docstring for the new class\n'Point(x, y)'\n>>> p = Point(11, y=22) # instantiate with positional args or keywords\n>>> p[0] + p[1] # indexable like a plain tuple\n33\n>>> x, y = p # unpack like a regular tuple\n>>> x, y\n(11, 22)\n>>> p.x + p.y # fields also accessible by name\n33\n>>> d = p._asdict() # convert to a dictionary\n>>> d['x']\n11\n>>> Point(**d) # convert from a dictionary\nPoint(x=11, y=22)\n>>> p._replace(x=100) # _replace() is like str.replace() but targets named fields\nPoint(x=100, y=22)"), _('csv.Dialect() \nDescribe a CSV dialect.\n\nThis must be subclassed (see csv.excel). Valid attributes are:\ndelimiter, quotechar, escapechar, doublequote, skipinitialspace,\nlineterminator, quoting.'), _('csv.Error() \nCommon base class for all non-exit exceptions.'), _('csv.OrderedDict() \nDictionary that remembers insertion order'), _('csv.Sniffer() \n"Sniffs" the format of a CSV file (i.e. delimiter, quotechar)\nReturns a Dialect object.'), _("csv.StringIO(initial_value='', newline='\\n') \nText I/O implementation using an in-memory buffer.\n\nThe initial_value argument sets the value of object. The newline\nargument is like the one of TextIOWrapper's constructor."), _('csv.excel() \nDescribe the usual properties of Excel-generated CSV files.'), _('csv.excel_tab() \nDescribe the usual properties of Excel-generated TAB-delimited files.'), _('csv.field_size_limit() \nSets an upper limit on parsed fields.\n csv.field_size_limit([limit])\n\nReturns old limit. If limit is not given, no new limit is set and\nthe old limit is returned'), _('csv.get_dialect() \nReturn the dialect instance associated with name.\ndialect = csv.get_dialect(name)'), _('csv.list_dialects() \nReturn a list of all know dialect names.\nnames = csv.list_dialects()'), _('csv.re() \nSupport for regular expressions (RE).\n\nThis module provides regular expression matching operations similar to\nthose found in Perl. It supports both 8-bit and Unicode strings; both\nthe pattern and the strings being processed can contain null bytes and\ncharacters outside the US ASCII range.\n\nRegular expressions can contain both special and ordinary characters.\nMost ordinary characters, like "A", "a", or "0", are the simplest\nregular expressions; they simply match themselves. You can\nconcatenate ordinary characters, so last matches the string \'last\'.\n\nThe special characters are:\n "." Matches any character except a newline.\n "^" Matches the start of the string.\n "$" Matches the end of the string or just before the newline at\n the end of the string.\n "*" Matches 0 or more (greedy) repetitions of the preceding RE.\n Greedy means that it will match as many repetitions as possible.\n "+" Matches 1 or more (greedy) repetitions of the preceding RE.\n "?" Matches 0 or 1 (greedy) of the preceding RE.\n *?,+?,?? Non-greedy versions of the previous three special characters.\n {m,n} Matches from m to n repetitions of the preceding RE.\n {m,n}? Non-greedy version of the above.\n "\\\\" Either escapes special characters or signals a special sequence.\n [] Indicates a set of characters.\n A "^" as the first character indicates a complementing set.\n "|" A|B, creates an RE that will match either A or B.\n (...) Matches the RE inside the parentheses.\n The contents can be retrieved or matched later in the string.\n (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below).\n (?:...) Non-grouping version of regular parentheses.\n (?P...) The substring matched by the group is accessible by name.\n (?P=name) Matches the text matched earlier by the group named name.\n (?#...) A comment; ignored.\n (?=...) Matches if ... matches next, but doesn\'t consume the string.\n (?!...) Matches if ... doesn\'t match next.\n (?<=...) Matches if preceded by ... (must be fixed length).\n (? date object'), _('datetime.date() \ndate(year, month, day) --> date object'), _('datetime.datetime() \ndatetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\nThe year, month and day arguments are required. tzinfo may be None, or an\ninstance of a tzinfo subclass. The remaining arguments may be ints.'), _('datetime.datetime() \ndatetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\nThe year, month and day arguments are required. tzinfo may be None, or an\ninstance of a tzinfo subclass. The remaining arguments may be ints.'), _('datetime.time() \ntime([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n\nAll arguments are optional. tzinfo may be None, or an instance of\na tzinfo subclass. The remaining arguments may be ints.'), _('datetime.time() \ntime([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n\nAll arguments are optional. tzinfo may be None, or an instance of\na tzinfo subclass. The remaining arguments may be ints.'), _('datetime.timedelta() \nDifference between two datetime values.'), _('datetime.timedelta() \nDifference between two datetime values.'), _('datetime.timezone() \nFixed offset from UTC implementation of tzinfo.'), _('datetime.timezone() \nFixed offset from UTC implementation of tzinfo.'), _('datetime.tzinfo() \nAbstract base class for time zone info objects.'), _('datetime.tzinfo() \nAbstract base class for time zone info objects.'), _('functools.WeakKeyDictionary(dict=None) \nMapping class that references keys weakly.\n\nEntries in the dictionary will be discarded when there is no\nlonger a strong reference to the key. This can be used to\nassociate additional data with an object owned by other parts of\nan application without adding attributes to those objects. This\ncan be especially useful with objects that override attribute\naccesses.'), _('functools.cmp_to_key() \nConvert a cmp= function into a key= function.'), _('functools.get_cache_token() \nReturns the current ABC cache token.\n\nThe token is an opaque object (supporting equality testing) identifying the\ncurrent version of the ABC cache for virtual subclasses. The token changes\nwith every call to ``register()`` on any ABC.'), _('functools.lru_cache(maxsize=128, typed=False) \nLeast-recently-used cache decorator.\n\nIf *maxsize* is set to None, the LRU features are disabled and the cache\ncan grow without bound.\n\nIf *typed* is True, arguments of different types will be cached separately.\nFor example, f(3.0) and f(3) will be treated as distinct calls with\ndistinct results.\n\nArguments to the cached function must be hashable.\n\nView the cache statistics named tuple (hits, misses, maxsize, currsize)\nwith f.cache_info(). Clear the cache and statistics with f.cache_clear().\nAccess the underlying function with f.__wrapped__.\n\nSee: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used'), _("functools.namedtuple(typename, field_names, *, verbose=False, rename=False, module=None) \nReturns a new subclass of tuple with named fields.\n\n>>> Point = namedtuple('Point', ['x', 'y'])\n>>> Point.__doc__ # docstring for the new class\n'Point(x, y)'\n>>> p = Point(11, y=22) # instantiate with positional args or keywords\n>>> p[0] + p[1] # indexable like a plain tuple\n33\n>>> x, y = p # unpack like a regular tuple\n>>> x, y\n(11, 22)\n>>> p.x + p.y # fields also accessible by name\n33\n>>> d = p._asdict() # convert to a dictionary\n>>> d['x']\n11\n>>> Point(**d) # convert from a dictionary\nPoint(x=11, y=22)\n>>> p._replace(x=100) # _replace() is like str.replace() but targets named fields\nPoint(x=100, y=22)"), _('functools.partial() \npartial(func, *args, **keywords) - new function with partial application\nof the given arguments and keywords.'), _('functools.partialmethod(func, *args, **keywords) \nMethod descriptor with partial application of the given arguments\nand keywords.\n\nSupports wrapping existing descriptors and handles non-descriptor\ncallables as instance methods.'), _("functools.recursive_repr(fillvalue='...') \nDecorator to make a repr function return fillvalue for a recursive call"), _('functools.reduce() \nreduce(function, sequence[, initial]) -> value\n\nApply a function of two arguments cumulatively to the items of a sequence,\nfrom left to right, so as to reduce the sequence to a single value.\nFor example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n((((1+2)+3)+4)+5). If initial is present, it is placed before the items\nof the sequence in the calculation, and serves as a default when the\nsequence is empty.'), _('functools.singledispatch(func) \nSingle-dispatch generic function decorator.\n\nTransforms a function into a generic function, which can have different\nbehaviours depending upon the type of its first argument. The decorated\nfunction acts as the default implementation, and additional\nimplementations can be registered using the register() attribute of the\ngeneric function.'), _('functools.total_ordering(cls) \nClass decorator that fills in missing ordering methods'), _("functools.update_wrapper(wrapper, wrapped, assigned='__module__', '__name__', '__qualname__', '__doc__', '__annotations__', updated='__dict__',) \nUpdate a wrapper function to look like the wrapped function\n\nwrapper is the function to be updated\nwrapped is the original function\nassigned is a tuple naming the attributes assigned directly\nfrom the wrapped function to the wrapper function (defaults to\nfunctools.WRAPPER_ASSIGNMENTS)\nupdated is a tuple naming the attributes of the wrapper that\nare updated with the corresponding attribute from the wrapped\nfunction (defaults to functools.WRAPPER_UPDATES)"), _("functools.wraps(wrapped, assigned='__module__', '__name__', '__qualname__', '__doc__', '__annotations__', updated='__dict__',) \nDecorator factory to apply update_wrapper() to a wrapper function\n\nReturns a decorator that invokes update_wrapper() with the decorated\nfunction as the wrapper argument and the arguments to wraps() as the\nremaining arguments. Default arguments are as for update_wrapper().\nThis is a convenience function to simplify applying partial() to\nupdate_wrapper()."), _("hashlib.__hash_new(name, data=b'', **kwargs) \nnew(name, data=b'') - Return a new hashing object using the named algorithm;\noptionally initialized with data (which must be bytes)."), _('hashlib.blake2b() \nReturn a new BLAKE2b hash object.'), _('hashlib.blake2s() \nReturn a new BLAKE2s hash object.'), _('hashlib.openssl_md5() \nReturns a md5 hash object; optionally initialized with a string'), _('hashlib.openssl_sha1() \nReturns a sha1 hash object; optionally initialized with a string'), _('hashlib.openssl_sha224() \nReturns a sha224 hash object; optionally initialized with a string'), _('hashlib.openssl_sha256() \nReturns a sha256 hash object; optionally initialized with a string'), _('hashlib.openssl_sha384() \nReturns a sha384 hash object; optionally initialized with a string'), _('hashlib.openssl_sha512() \nReturns a sha512 hash object; optionally initialized with a string'), _('hashlib.pbkdf2_hmac() \npbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n\nPassword based key derivation function 2 (PKCS #5 v2.0) with HMAC as\npseudorandom function.'), _('hashlib.sha3_224(string=None) \nReturn a new SHA3 hash object with a hashbit length of 28 bytes.'), _('hashlib.sha3_256() \nsha3_256([string]) -> SHA3 object\n\nReturn a new SHA3 hash object with a hashbit length of 32 bytes.'), _('hashlib.sha3_384() \nsha3_384([string]) -> SHA3 object\n\nReturn a new SHA3 hash object with a hashbit length of 48 bytes.'), _('hashlib.sha3_512() \nsha3_512([string]) -> SHA3 object\n\nReturn a new SHA3 hash object with a hashbit length of 64 bytes.'), _('hashlib.shake_128() \nshake_128([string]) -> SHAKE object\n\nReturn a new SHAKE hash object.'), _('hashlib.shake_256() \nshake_256([string]) -> SHAKE object\n\nReturn a new SHAKE hash object.'), _('itertools.accumulate() \naccumulate(iterable[, func]) --> accumulate object\n\nReturn series of accumulated sums (or other binary function results).'), _('itertools.chain() \nchain(*iterables) --> chain object\n\nReturn a chain object whose .__next__() method returns elements from the\nfirst iterable until it is exhausted, then elements from the next\niterable, until all of the iterables are exhausted.'), _('itertools.combinations() \ncombinations(iterable, r) --> combinations object\n\nReturn successive r-length combinations of elements in the iterable.\n\ncombinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)'), _("itertools.combinations_with_replacement() \ncombinations_with_replacement(iterable, r) --> combinations_with_replacement object\n\nReturn successive r-length combinations of elements in the iterable\nallowing individual elements to have successive repeats.\ncombinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC"), _('itertools.compress() \ncompress(data, selectors) --> iterator over selected data\n\nReturn data elements corresponding to true selector elements.\nForms a shorter iterator from selected data elements using the\nselectors to choose the data elements.'), _('itertools.count() \ncount(start=0, step=1) --> count object\n\nReturn a count object whose .__next__() method returns consecutive values.\nEquivalent to:\n\n def count(firstval=0, step=1):\n x = firstval\n while 1:\n yield x\n x += step'), _('itertools.cycle() \ncycle(iterable) --> cycle object\n\nReturn elements from the iterable until it is exhausted.\nThen repeat the sequence indefinitely.'), _('itertools.dropwhile() \ndropwhile(predicate, iterable) --> dropwhile object\n\nDrop items from the iterable while predicate(item) is true.\nAfterwards, return every element until the iterable is exhausted.'), _('itertools.filterfalse() \nfilterfalse(function or None, sequence) --> filterfalse object\n\nReturn those items of sequence for which function(item) is false.\nIf function is None, return the items that are false.'), _('itertools.groupby() \ngroupby(iterable[, keyfunc]) -> create an iterator which returns\n(key, sub-iterator) grouped by each value of key(value).'), _('itertools.islice() \nislice(iterable, stop) --> islice object\nislice(iterable, start, stop[, step]) --> islice object\n\nReturn an iterator whose next() method returns selected values from an\niterable. If start is specified, will skip all preceding elements;\notherwise, start defaults to zero. Step defaults to one. If\nspecified as another value, step determines how many values are \nskipped between successive calls. Works like a slice() on a list\nbut returns an iterator.'), _('itertools.permutations() \npermutations(iterable[, r]) --> permutations object\n\nReturn successive r-length permutations of elements in the iterable.\n\npermutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)'), _("itertools.product() \nproduct(*iterables, repeat=1) --> product object\n\nCartesian product of input iterables. Equivalent to nested for-loops.\n\nFor example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\nThe leftmost iterators are in the outermost for-loop, so the output tuples\ncycle in a manner similar to an odometer (with the rightmost element changing\non every iteration).\n\nTo compute the product of an iterable with itself, specify the number\nof repetitions with the optional repeat keyword argument. For example,\nproduct(A, repeat=4) means the same as product(A, A, A, A).\n\nproduct('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\nproduct((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ..."), _('itertools.repeat() \nrepeat(object [,times]) -> create an iterator which returns the object\nfor the specified number of times. If not specified, returns the object\nendlessly.'), _('itertools.starmap() \nstarmap(function, sequence) --> starmap object\n\nReturn an iterator whose values are returned from the function evaluated\nwith an argument tuple taken from the given sequence.'), _('itertools.takewhile() \ntakewhile(predicate, iterable) --> takewhile object\n\nReturn successive entries from an iterable as long as the \npredicate evaluates to true for each entry.'), _('itertools.tee() \ntee(iterable, n=2) --> tuple of n independent iterators.'), _('itertools.zip_longest() \nzip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\n\nReturn a zip_longest object whose .__next__() method returns a tuple where\nthe i-th element comes from the i-th iterable argument. The .__next__()\nmethod continues until the longest iterable in the argument sequence\nis exhausted and then it raises StopIteration. When the shorter iterables\nare exhausted, the fillvalue is substituted in their place. The fillvalue\ndefaults to None or can be specified by a keyword argument.'), _('json.JSONDecodeError(msg, doc, pos) \nSubclass of ValueError with the following additional properties:\n\nmsg: The unformatted error message\ndoc: The JSON document being parsed\npos: The start index of doc where parsing failed\nlineno: The line corresponding to pos\ncolno: The column corresponding to pos'), _('json.JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None) \nSimple JSON decoder\n\nPerforms the following translations in decoding by default:\n\n+---------------+-------------------+\n| JSON | Python |\n+===============+===================+\n| object | dict |\n+---------------+-------------------+\n| array | list |\n+---------------+-------------------+\n| string | str |\n+---------------+-------------------+\n| number (int) | int |\n+---------------+-------------------+\n| number (real) | float |\n+---------------+-------------------+\n| true | True |\n+---------------+-------------------+\n| false | False |\n+---------------+-------------------+\n| null | None |\n+---------------+-------------------+\n\nIt also understands ``NaN``, ``Infinity``, and ``-Infinity`` as\ntheir corresponding ``float`` values, which is outside the JSON spec.'), _('json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None) \nExtensible JSON encoder for Python data structures.\n\nSupports the following objects and types by default:\n\n+-------------------+---------------+\n| Python | JSON |\n+===================+===============+\n| dict | object |\n+-------------------+---------------+\n| list, tuple | array |\n+-------------------+---------------+\n| str | string |\n+-------------------+---------------+\n| int, float | number |\n+-------------------+---------------+\n| True | true |\n+-------------------+---------------+\n| False | false |\n+-------------------+---------------+\n| None | null |\n+-------------------+---------------+\n\nTo extend this to recognize other objects, subclass and implement a\n``.default()`` method with another method that returns a serializable\nobject for ``o`` if possible, otherwise it should call the superclass\nimplementation (to raise ``TypeError``).'), _('json.codecs() \ncodecs -- Python Codec Registry, API and helpers.\n\n\nWritten by Marc-Andre Lemburg (mal@lemburg.com).\n\n(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.'), _("json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) \nSerialize ``obj`` as a JSON formatted stream to ``fp`` (a\n``.write()``-supporting file-like object).\n\nIf ``skipkeys`` is true then ``dict`` keys that are not basic types\n(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped\ninstead of raising a ``TypeError``.\n\nIf ``ensure_ascii`` is false, then the strings written to ``fp`` can\ncontain non-ASCII characters if they appear in strings contained in\n``obj``. Otherwise, all such characters are escaped in JSON strings.\n\nIf ``check_circular`` is false, then the circular reference check\nfor container types will be skipped and a circular reference will\nresult in an ``OverflowError`` (or worse).\n\nIf ``allow_nan`` is false, then it will be a ``ValueError`` to\nserialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)\nin strict compliance of the JSON specification, instead of using the\nJavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).\n\nIf ``indent`` is a non-negative integer, then JSON array elements and\nobject members will be pretty-printed with that indent level. An indent\nlevel of 0 will only insert newlines. ``None`` is the most compact\nrepresentation.\n\nIf specified, ``separators`` should be an ``(item_separator, key_separator)``\ntuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and\n``(',', ': ')`` otherwise. To get the most compact JSON representation,\nyou should specify ``(',', ':')`` to eliminate whitespace.\n\n``default(obj)`` is a function that should return a serializable version\nof obj or raise TypeError. The default simply raises TypeError.\n\nIf *sort_keys* is true (default: ``False``), then the output of\ndictionaries will be sorted by key.\n\nTo use a custom ``JSONEncoder`` subclass (e.g. one that overrides the\n``.default()`` method to serialize additional types), specify it with\nthe ``cls`` kwarg; otherwise ``JSONEncoder`` is used."), _("json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) \nSerialize ``obj`` to a JSON formatted ``str``.\n\nIf ``skipkeys`` is true then ``dict`` keys that are not basic types\n(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped\ninstead of raising a ``TypeError``.\n\nIf ``ensure_ascii`` is false, then the return value can contain non-ASCII\ncharacters if they appear in strings contained in ``obj``. Otherwise, all\nsuch characters are escaped in JSON strings.\n\nIf ``check_circular`` is false, then the circular reference check\nfor container types will be skipped and a circular reference will\nresult in an ``OverflowError`` (or worse).\n\nIf ``allow_nan`` is false, then it will be a ``ValueError`` to\nserialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in\nstrict compliance of the JSON specification, instead of using the\nJavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).\n\nIf ``indent`` is a non-negative integer, then JSON array elements and\nobject members will be pretty-printed with that indent level. An indent\nlevel of 0 will only insert newlines. ``None`` is the most compact\nrepresentation.\n\nIf specified, ``separators`` should be an ``(item_separator, key_separator)``\ntuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and\n``(',', ': ')`` otherwise. To get the most compact JSON representation,\nyou should specify ``(',', ':')`` to eliminate whitespace.\n\n``default(obj)`` is a function that should return a serializable version\nof obj or raise TypeError. The default simply raises TypeError.\n\nIf *sort_keys* is true (default: ``False``), then the output of\ndictionaries will be sorted by key.\n\nTo use a custom ``JSONEncoder`` subclass (e.g. one that overrides the\n``.default()`` method to serialize additional types), specify it with\nthe ``cls`` kwarg; otherwise ``JSONEncoder`` is used."), _('json.json.decoder() \nImplementation of JSONDecoder'), _('json.json.encoder() \nImplementation of JSONEncoder'), _('json.json.scanner() \nJSON token scanner'), _('json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) \nDeserialize ``fp`` (a ``.read()``-supporting file-like object containing\na JSON document) to a Python object.\n\n``object_hook`` is an optional function that will be called with the\nresult of any object literal decode (a ``dict``). The return value of\n``object_hook`` will be used instead of the ``dict``. This feature\ncan be used to implement custom decoders (e.g. JSON-RPC class hinting).\n\n``object_pairs_hook`` is an optional function that will be called with the\nresult of any object literal decoded with an ordered list of pairs. The\nreturn value of ``object_pairs_hook`` will be used instead of the ``dict``.\nThis feature can be used to implement custom decoders that rely on the\norder that the key and value pairs are decoded (for example,\ncollections.OrderedDict will remember the order of insertion). If\n``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.\n\nTo use a custom ``JSONDecoder`` subclass, specify it with the ``cls``\nkwarg; otherwise ``JSONDecoder`` is used.'), _('json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) \nDeserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance\ncontaining a JSON document) to a Python object.\n\n``object_hook`` is an optional function that will be called with the\nresult of any object literal decode (a ``dict``). The return value of\n``object_hook`` will be used instead of the ``dict``. This feature\ncan be used to implement custom decoders (e.g. JSON-RPC class hinting).\n\n``object_pairs_hook`` is an optional function that will be called with the\nresult of any object literal decoded with an ordered list of pairs. The\nreturn value of ``object_pairs_hook`` will be used instead of the ``dict``.\nThis feature can be used to implement custom decoders that rely on the\norder that the key and value pairs are decoded (for example,\ncollections.OrderedDict will remember the order of insertion). If\n``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.\n\n``parse_float``, if specified, will be called with the string\nof every JSON float to be decoded. By default this is equivalent to\nfloat(num_str). This can be used to use another datatype or parser\nfor JSON floats (e.g. decimal.Decimal).\n\n``parse_int``, if specified, will be called with the string\nof every JSON int to be decoded. By default this is equivalent to\nint(num_str). This can be used to use another datatype or parser\nfor JSON integers (e.g. float).\n\n``parse_constant``, if specified, will be called with one of the\nfollowing strings: -Infinity, Infinity, NaN.\nThis can be used to raise an exception if invalid JSON numbers\nare encountered.\n\nTo use a custom ``JSONDecoder`` subclass, specify it with the ``cls``\nkwarg; otherwise ``JSONDecoder`` is used.\n\nThe ``encoding`` argument is ignored and deprecated.'), _('os.OSError() \nBase class for I/O related errors.'), _('os.PathLike() \nAbstract base class for implementing the file system path protocol.'), _('os.WCOREDUMP(status, /) \nReturn True if the process returning status was dumped to a core file.'), _('os.WEXITSTATUS(status) \nReturn the process return code from status.'), _('os.WIFCONTINUED(status) \nReturn True if a particular process was continued from a job control stop.\n\nReturn True if the process returning status was continued from a\njob control stop.'), _('os.WIFEXITED(status) \nReturn True if the process returning status exited via the exit() system call.'), _('os.WIFSIGNALED(status) \nReturn True if the process returning status was terminated by a signal.'), _('os.WIFSTOPPED(status) \nReturn True if the process returning status was stopped.'), _('os.WSTOPSIG(status) \nReturn the signal that stopped the process that provided the status value.'), _('os.WTERMSIG(status) \nReturn the signal that terminated the process that provided the status value.'), _('os.abc() \nAbstract Base Classes (ABCs) according to PEP 3119.'), _("os.abort() \nAbort the interpreter immediately.\n\nThis function 'dumps core' or otherwise fails in the hardest way possible\non the hosting operating system. This function never returns."), _('os.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True) \nUse the real uid/gid to test for access to a path.\n\n path\n Path to be tested; can be string or bytes\n mode\n Operating-system mode bitfield. Can be F_OK to test existence,\n or the inclusive-OR of R_OK, W_OK, and X_OK.\n dir_fd\n If not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that\n directory.\n effective_ids\n If True, access will use the effective uid/gid instead of\n the real uid/gid.\n follow_symlinks\n If False, and the last element of the path is a symbolic link,\n access will examine the symbolic link itself instead of the file\n the link points to.\n\ndir_fd, effective_ids, and follow_symlinks may not be implemented\n on your platform. If they are unavailable, using them will raise a\n NotImplementedError.\n\nNote that most operations will use the effective uid/gid, therefore this\n routine can be used in a suid/sgid environment to test if the invoking user\n has the specified access to the path.'), _('os.chdir(path) \nChange the current working directory to the specified path.\n\npath may always be specified as a string.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.'), _('os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True) \nChange the access permissions of a file.\n\n path\n Path to be modified. May always be specified as a str or bytes.\n On some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.\n mode\n Operating-system mode bitfield.\n dir_fd\n If not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that\n directory.\n follow_symlinks\n If False, and the last element of the path is a symbolic link,\n chmod will modify the symbolic link itself instead of the file\n the link points to.\n\nIt is an error to use dir_fd or follow_symlinks when specifying path as\n an open file descriptor.\ndir_fd and follow_symlinks may not be implemented on your platform.\n If they are unavailable, using them will raise a NotImplementedError.'), _('os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True) \nChange the owner and group id of path to the numeric uid and gid.\\\n\n path\n Path to be examined; can be string, bytes, or open-file-descriptor int.\n dir_fd\n If not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that\n directory.\n follow_symlinks\n If False, and the last element of the path is a symbolic link,\n stat will examine the symbolic link itself instead of the file\n the link points to.\n\npath may always be specified as a string.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, chown will modify the symbolic link itself instead of the file the\n link points to.\nIt is an error to use dir_fd or follow_symlinks when specifying path as\n an open file descriptor.\ndir_fd and follow_symlinks may not be implemented on your platform.\n If they are unavailable, using them will raise a NotImplementedError.'), _('os.chroot(path) \nChange root directory to path.'), _('os.close(fd) \nClose a file descriptor.'), _('os.closerange(fd_low, fd_high, /) \nCloses all file descriptors in [fd_low, fd_high), ignoring errors.'), _('os.confstr(name, /) \nReturn a string-valued system configuration variable.'), _('os.cpu_count() \nReturn the number of CPUs in the system; return None if indeterminable.\n\nThis number is not equivalent to the number of CPUs the current process can\nuse. The number of usable CPUs can be obtained with\n``len(os.sched_getaffinity(0))``'), _('os.ctermid() \nReturn the name of the controlling terminal for this process.'), _("os.device_encoding(fd) \nReturn a string describing the encoding of a terminal's file descriptor.\n\nThe file descriptor must be attached to a terminal.\nIf the device is not a terminal, return None."), _('os.dup(fd, /) \nReturn a duplicate of a file descriptor.'), _('os.dup2(fd, fd2, inheritable=True) \nDuplicate file descriptor.'), _("os.errno() \nThis module makes available standard errno system symbols.\n\nThe value of each symbol is the corresponding integer value,\ne.g., on most systems, errno.ENOENT equals the integer 2.\n\nThe dictionary errno.errorcode maps numeric codes to symbol names,\ne.g., errno.errorcode[2] could be the string 'ENOENT'.\n\nSymbols that are not relevant to the underlying system are not defined.\n\nTo map error codes to error messages, use the function os.strerror(),\ne.g. os.strerror(2) could return 'No such file or directory'."), _('os.execl(file, *args) \nexecl(file, *args)\n\nExecute the executable file with argument list args, replacing the\ncurrent process. '), _('os.execle(file, *args) \nexecle(file, *args, env)\n\nExecute the executable file with argument list args and\nenvironment env, replacing the current process. '), _('os.execlp(file, *args) \nexeclp(file, *args)\n\nExecute the executable file (which is searched for along $PATH)\nwith argument list args, replacing the current process. '), _('os.execlpe(file, *args) \nexeclpe(file, *args, env)\n\nExecute the executable file (which is searched for along $PATH)\nwith argument list args and environment env, replacing the current\nprocess. '), _('os.execv(path, argv, /) \nExecute an executable path with arguments, replacing current process.\n\npath\n Path of executable file.\nargv\n Tuple or list of strings.'), _('os.execve(path, argv, env) \nExecute an executable path with arguments, replacing current process.\n\npath\n Path of executable file.\nargv\n Tuple or list of strings.\nenv\n Dictionary of strings mapping to strings.'), _('os.execvp(file, args) \nexecvp(file, args)\n\nExecute the executable file (which is searched for along $PATH)\nwith argument list args, replacing the current process.\nargs may be a list or tuple of strings. '), _('os.execvpe(file, args, env) \nexecvpe(file, args, env)\n\nExecute the executable file (which is searched for along $PATH)\nwith argument list args and environment env , replacing the\ncurrent process.\nargs may be a list or tuple of strings. '), _('os.fchdir(fd) \nChange to the directory of the given file descriptor.\n\nfd must be opened on a directory, not a file.\nEquivalent to os.chdir(fd).'), _('os.fchmod(fd, mode) \nChange the access permissions of the file given by file descriptor fd.\n\nEquivalent to os.chmod(fd, mode).'), _('os.fchown(fd, uid, gid) \nChange the owner and group id of the file specified by file descriptor.\n\nEquivalent to os.chown(fd, uid, gid).'), _('os.fdatasync(fd) \nForce write of fd to disk without forcing update of metadata.'), _('os.fork() \nFork a child process.\n\nReturn 0 to child process and PID of child to parent process.'), _('os.forkpty() \nFork a new process with a new pseudo-terminal as controlling tty.\n\nReturns a tuple of (pid, master_fd).\nLike fork(), return pid of 0 to the child process,\nand pid of child to the parent process.\nTo both, return fd of newly opened pseudo-terminal.'), _('os.fpathconf(fd, name, /) \nReturn the configuration limit name for the file descriptor fd.\n\nIf there is no limit, return -1.'), _("os.fsdecode(filename) \nDecode filename (an os.PathLike, bytes, or str) from the filesystem\nencoding with 'surrogateescape' error handler, return str unchanged. On\nWindows, use 'strict' error handler if the file system encoding is\n'mbcs' (which is the default encoding)."), _("os.fsencode(filename) \nEncode filename (an os.PathLike, bytes, or str) to the filesystem\nencoding with 'surrogateescape' error handler, return bytes unchanged.\nOn Windows, use 'strict' error handler if the file system encoding is\n'mbcs' (which is the default encoding)."), _('os.fspath(path) \nReturn the file system path representation of the object.\n\nIf the object is str or bytes, then allow it to pass through as-is. If the\nobject defines __fspath__(), then return the result of that method. All other\ntypes raise a TypeError.'), _('os.fstat(fd) \nPerform a stat system call on the given file descriptor.\n\nLike stat(), but for an open file descriptor.\nEquivalent to os.stat(fd).'), _('os.fstatvfs(fd, /) \nPerform an fstatvfs system call on the given fd.\n\nEquivalent to statvfs(fd).'), _('os.fsync(fd) \nForce write of fd to disk.'), _('os.ftruncate(fd, length, /) \nTruncate a file, specified by file descriptor, to a specific length.'), _('os.fwalk(top=\'.\', topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None) \nDirectory tree generator.\n\nThis behaves exactly like walk(), except that it yields a 4-tuple\n\n dirpath, dirnames, filenames, dirfd\n\n`dirpath`, `dirnames` and `filenames` are identical to walk() output,\nand `dirfd` is a file descriptor referring to the directory `dirpath`.\n\nThe advantage of fwalk() over walk() is that it\'s safe against symlink\nraces (when follow_symlinks is False).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and top should be relative; top will then be relative to that directory.\n (dir_fd is always supported for fwalk.)\n\nCaution:\nSince fwalk() yields file descriptors, those are only valid until the\nnext iteration step, so you should dup() them if you want to keep them\nfor a longer period.\n\nExample:\n\nimport os\nfor root, dirs, files, rootfd in os.fwalk(\'python/Lib/email\'):\n print(root, "consumes", end="")\n print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),\n end="")\n print("bytes in", len(files), "non-directory files")\n if \'CVS\' in dirs:\n dirs.remove(\'CVS\') # don\'t visit CVS directories'), _('os.get_blocking() \nget_blocking(fd) -> bool\n\nGet the blocking mode of the file descriptor:\nFalse if the O_NONBLOCK flag is set, True if the flag is cleared.'), _('os.get_exec_path(env=None) \nReturns the sequence of directories that will be searched for the\nnamed executable (similar to a shell) when launching a process.\n\n*env* must be an environment variable dict or None. If *env* is None,\nos.environ will be used.'), _('os.get_inheritable(fd, /) \nGet the close-on-exe flag of the specified file descriptor.'), _('os.get_terminal_size() \nReturn the size of the terminal window as (columns, lines).\n\nThe optional argument fd (default standard output) specifies\nwhich file descriptor should be queried.\n\nIf the file descriptor is not connected to a terminal, an OSError\nis thrown.\n\nThis function will only be defined if an implementation is\navailable for this system.\n\nshutil.get_terminal_size is the high-level function which should \nnormally be used, os.get_terminal_size is the low-level implementation.'), _('os.getcwd() \nReturn a unicode string representing the current working directory.'), _('os.getcwdb() \nReturn a bytes string representing the current working directory.'), _("os.getegid() \nReturn the current process's effective group id."), _("os.getenv(key, default=None) \nGet an environment variable, return None if it doesn't exist.\nThe optional second argument can specify an alternate default.\nkey, default and the result are str."), _("os.getenvb(key, default=None) \nGet an environment variable, return None if it doesn't exist.\nThe optional second argument can specify an alternate default.\nkey, default and the result are bytes."), _("os.geteuid() \nReturn the current process's effective user id."), _("os.getgid() \nReturn the current process's group id."), _('os.getgrouplist() \ngetgrouplist(user, group) -> list of groups to which a user belongs\n\nReturns a list of groups to which a user belongs.\n\n user: username to lookup\n group: base group id of the user'), _('os.getgroups() \nReturn list of supplemental group IDs for the process.'), _('os.getloadavg() \nReturn average recent system load information.\n\nReturn the number of processes in the system run queue averaged over\nthe last 1, 5, and 15 minutes as a tuple of three floats.\nRaises OSError if the load average was unobtainable.'), _('os.getlogin() \nReturn the actual login name.'), _('os.getpgid(pid) \nCall the system call getpgid(), and return the result.'), _('os.getpgrp() \nReturn the current process group id.'), _('os.getpid() \nReturn the current process id.'), _("os.getppid() \nReturn the parent's process id.\n\nIf the parent process has already exited, Windows machines will still\nreturn its id; others systems will return the id of the 'init' process (1)."), _('os.getpriority(which, who) \nReturn program scheduling priority.'), _('os.getrandom(size, flags=0) \nObtain a series of random bytes.'), _("os.getresgid() \nReturn a tuple of the current process's real, effective, and saved group ids."), _("os.getresuid() \nReturn a tuple of the current process's real, effective, and saved user ids."), _('os.getsid(pid, /) \nCall the system call getsid(pid) and return the result.'), _("os.getuid() \nReturn the current process's user id."), _('os.getxattr(path, attribute, *, follow_symlinks=True) \nReturn the value of extended attribute attribute on path.\n\npath may be either a string or an open file descriptor.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, getxattr will examine the symbolic link itself instead of the file\n the link points to.'), _('os.initgroups() \ninitgroups(username, gid) -> None\n\nCall the system initgroups() to initialize the group access list with all of\nthe groups of which the specified username is a member, plus the specified\ngroup id.'), _('os.isatty(fd, /) \nReturn True if the fd is connected to a terminal.\n\nReturn True if the file descriptor is an open file descriptor\nconnected to the slave end of a terminal.'), _('os.kill(pid, signal, /) \nKill a process with a signal.'), _('os.killpg(pgid, signal, /) \nKill a process group with a signal.'), _('os.lchown(path, uid, gid) \nChange the owner and group id of path to the numeric uid and gid.\n\nThis function will not follow symbolic links.\nEquivalent to os.chown(path, uid, gid, follow_symlinks=False).'), _('os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True) \nCreate a hard link to a file.\n\nIf either src_dir_fd or dst_dir_fd is not None, it should be a file\n descriptor open to a directory, and the respective path string (src or dst)\n should be relative; the path will then be relative to that directory.\nIf follow_symlinks is False, and the last element of src is a symbolic\n link, link will create a link to the symbolic link itself instead of the\n file the link points to.\nsrc_dir_fd, dst_dir_fd, and follow_symlinks may not be implemented on your\n platform. If they are unavailable, using them will raise a\n NotImplementedError.'), _("os.listdir(path=None) \nReturn a list containing the names of the files in the directory.\n\npath can be specified as either str or bytes. If path is bytes,\n the filenames returned will also be bytes; in all other circumstances\n the filenames returned will be str.\nIf path is None, uses the path='.'.\nOn some platforms, path may also be specified as an open file descriptor;\\\n the file descriptor must refer to a directory.\n If this functionality is unavailable, using it raises NotImplementedError.\n\nThe list is in arbitrary order. It does not include the special\nentries '.' and '..' even if they are present in the directory."), _('os.listxattr(path=None, *, follow_symlinks=True) \nReturn a list of extended attributes on path.\n\npath may be either None, a string, or an open file descriptor.\nif path is None, listxattr will examine the current directory.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, listxattr will examine the symbolic link itself instead of the file\n the link points to.'), _('os.lockf(fd, command, length, /) \nApply, test or remove a POSIX lock on an open file descriptor.\n\nfd\n An open file descriptor.\ncommand\n One of F_LOCK, F_TLOCK, F_ULOCK or F_TEST.\nlength\n The number of bytes to lock, starting at the current position.'), _('os.lseek(fd, position, how, /) \nSet the position of a file descriptor. Return the new position.\n\nReturn the new cursor position in number of bytes\nrelative to the beginning of the file.'), _('os.lstat(path, *, dir_fd=None) \nPerform a stat system call on the given path, without following symbolic links.\n\nLike stat(), but do not follow symbolic links.\nEquivalent to stat(path, follow_symlinks=False).'), _('os.major(device, /) \nExtracts a device major number from a raw device number.'), _('os.makedev(major, minor, /) \nComposes a raw device number from the major and minor device numbers.'), _('os.makedirs(name, mode=511, exist_ok=False) \nmakedirs(name [, mode=0o777][, exist_ok=False])\n\nSuper-mkdir; create a leaf directory and all intermediate ones. Works like\nmkdir, except that any intermediate path segment (not just the rightmost)\nwill be created if it does not exist. If the target directory already\nexists, raise an OSError if exist_ok is False. Otherwise no exception is\nraised. This is recursive.'), _('os.minor(device, /) \nExtracts a device minor number from a raw device number.'), _('os.mkdir(path, mode=511, *, dir_fd=None) \nCreate a directory.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.\n\nThe mode argument is ignored on Windows.'), _('os.mkfifo(path, mode=438, *, dir_fd=None) \nCreate a "fifo" (a POSIX named pipe).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.'), _('os.mknod(path, mode=384, device=0, *, dir_fd=None) \nCreate a node in the file system.\n\nCreate a node in the file system (file, device special file or named pipe)\nat path. mode specifies both the permissions to use and the\ntype of node to be created, being combined (bitwise OR) with one of\nS_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. If S_IFCHR or S_IFBLK is set on mode,\ndevice defines the newly created device special file (probably using\nos.makedev()). Otherwise device is ignored.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.'), _('os.nice(increment, /) \nAdd increment to the priority of process and return the new priority.'), _('os.open(path, flags, mode=511, *, dir_fd=None) \nOpen a file for low level IO. Returns a file descriptor (integer).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.'), _('os.openpty() \nOpen a pseudo-terminal.\n\nReturn a tuple of (master_fd, slave_fd) containing open file descriptors\nfor both the master and slave ends.'), _('os.path.abspath(path) \nReturn an absolute path.'), _('os.path.basename(p) \nReturns the final component of a pathname'), _('os.path.commonpath(paths) \nGiven a sequence of path names, returns the longest common sub-path.'), _('os.path.commonprefix(m) \nGiven a list of pathnames, returns the longest common leading component'), _('os.path.dirname(p) \nReturns the directory component of a pathname'), _('os.path.exists(path) \nTest whether a path exists. Returns False for broken symbolic links'), _('os.path.expanduser(path) \nExpand ~ and ~user constructions. If user or $HOME is unknown,\ndo nothing.'), _('os.path.expandvars(path) \nExpand shell variables of form $var and ${var}. Unknown variables\nare left unchanged.'), _('os.path.genericpath() \nPath operations common to more than one OS\nDo not use directly. The OS specific modules import the appropriate\nfunctions from this module themselves.'), _('os.path.getatime(filename) \nReturn the last access time of a file, reported by os.stat().'), _('os.path.getctime(filename) \nReturn the metadata change time of a file, reported by os.stat().'), _('os.path.getmtime(filename) \nReturn the last modification time of a file, reported by os.stat().'), _('os.path.getsize(filename) \nReturn the size of a file, reported by os.stat().'), _('os.path.isabs(s) \nTest whether a path is absolute'), _('os.path.isdir(s) \nReturn true if the pathname refers to an existing directory.'), _('os.path.isfile(path) \nTest whether a path is a regular file'), _('os.path.islink(path) \nTest whether a path is a symbolic link'), _('os.path.ismount(path) \nTest whether a path is a mount point'), _("os.path.join(a, *p) \nJoin two or more pathname components, inserting '/' as needed.\nIf any component is an absolute path, all previous path components\nwill be discarded. An empty last part will result in a path that\nends with a separator."), _('os.path.lexists(path) \nTest whether a path exists. Returns True for broken symbolic links'), _('os.path.normcase(s) \nNormalize case of pathname. Has no effect under Posix'), _('os.path.normpath(path) \nNormalize path, eliminating double slashes, etc.'), _("os.path.os() \nOS routines for NT or Posix depending on what system we're on.\n\nThis exports:\n - all functions from posix or nt, e.g. unlink, stat, etc.\n - os.path is either posixpath or ntpath\n - os.name is either 'posix' or 'nt'\n - os.curdir is a string representing the current directory (always '.')\n - os.pardir is a string representing the parent directory (always '..')\n - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n - os.extsep is the extension separator (always '.')\n - os.altsep is the alternate pathname separator (None or '/')\n - os.pathsep is the component separator used in $PATH etc\n - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r\\n')\n - os.defpath is the default search path for executables\n - os.devnull is the file path of the null device ('/dev/null', etc.)\n\nPrograms that import and use 'os' stand a better chance of being\nportable between different platforms. Of course, they must then\nonly use functions that are defined by all platforms (e.g., unlink\nand opendir), and leave all pathname manipulation to os.path\n(e.g., split and join)."), _('os.path.realpath(filename) \nReturn the canonical path of the specified filename, eliminating any\nsymbolic links encountered in the path.'), _('os.path.relpath(path, start=None) \nReturn a relative version of a path'), _('os.path.samefile(f1, f2) \nTest whether two pathnames reference the same actual file'), _('os.path.sameopenfile(fp1, fp2) \nTest whether two open file objects reference the same file'), _('os.path.samestat(s1, s2) \nTest whether two stat buffers reference the same file'), _('os.path.split(p) \nSplit a pathname. Returns tuple "(head, tail)" where "tail" is\neverything after the final slash. Either part may be empty.'), _('os.path.splitdrive(p) \nSplit a pathname into drive and path. On Posix, drive is always\nempty.'), _('os.path.splitext(p) \nSplit the extension from a pathname.\n\nExtension is everything from the last dot to the end, ignoring\nleading dots. Returns "(root, ext)"; ext may be empty.'), _('os.path.stat() \nConstants/functions for interpreting results of os.stat() and os.lstat().\n\nSuggested usage: from stat import *'), _("os.path.sys() \nThis module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function"), _('os.pathconf(path, name) \nReturn the configuration limit name for the file or directory path.\n\nIf there is no limit, return -1.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.'), _('os.pipe() \nCreate a pipe.\n\nReturns a tuple of two file descriptors:\n (read_fd, write_fd)'), _('os.pipe2(flags, /) \nCreate a pipe with flags set atomically.\n\nReturns a tuple of two file descriptors:\n (read_fd, write_fd)\n\nflags can be constructed by ORing together one or more of these values:\nO_NONBLOCK, O_CLOEXEC.'), _('os.posix_fadvise(fd, offset, length, advice, /) \nAnnounce an intention to access data in a specific pattern.\n\nAnnounce an intention to access data in a specific pattern, thus allowing\nthe kernel to make optimizations.\nThe advice applies to the region of the file specified by fd starting at\noffset and continuing for length bytes.\nadvice is one of POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL,\nPOSIX_FADV_RANDOM, POSIX_FADV_NOREUSE, POSIX_FADV_WILLNEED, or\nPOSIX_FADV_DONTNEED.'), _('os.posix_fallocate(fd, offset, length, /) \nEnsure a file has allocated at least a particular number of bytes on disk.\n\nEnsure that the file specified by fd encompasses a range of bytes\nstarting at offset bytes from the beginning and continuing for length bytes.'), _('os.posixpath() \nCommon operations on Posix pathnames.\n\nInstead of importing this module directly, import os and refer to\nthis module as os.path. The "os.path" name is an alias for this\nmodule on Posix systems; on other systems (e.g. Mac, Windows),\nos.path provides the same operations in a manner specific to that\nplatform, and is an alias to another module (e.g. macpath, ntpath).\n\nSome of this can actually be useful on non-Posix systems too, e.g.\nfor manipulation of the pathname component of URLs.'), _('os.pread(fd, length, offset, /) \nRead a number of bytes from a file descriptor starting at a particular offset.\n\nRead length bytes from file descriptor fd, starting at offset bytes from\nthe beginning of the file. The file offset remains unchanged.'), _('os.putenv(name, value, /) \nChange or add an environment variable.'), _('os.pwrite(fd, buffer, offset, /) \nWrite bytes to a file descriptor starting at a particular offset.\n\nWrite buffer to fd, starting at offset bytes from the beginning of\nthe file. Returns the number of bytes writte. Does not change the\ncurrent file offset.'), _('os.read(fd, length, /) \nRead from a file descriptor. Returns a bytes object.'), _('os.readlink() \nreadlink(path, *, dir_fd=None) -> path\n\nReturn a string representing the path to which the symbolic link points.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.'), _('os.readv(fd, buffers, /) \nRead from a file descriptor fd into an iterable of buffers.\n\nThe buffers should be mutable buffers accepting bytes.\nreadv will transfer data into each buffer until it is full\nand then move on to the next buffer in the sequence to hold\nthe rest of the data.\n\nreadv returns the total number of bytes read,\nwhich may be less than the total capacity of all the buffers.'), _('os.remove(path, *, dir_fd=None) \nRemove a file (same as unlink()).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.'), _('os.removedirs(name) \nremovedirs(name)\n\nSuper-rmdir; remove a leaf directory and all empty intermediate\nones. Works like rmdir except that, if the leaf directory is\nsuccessfully removed, directories corresponding to rightmost path\nsegments will be pruned away until either the whole path is\nconsumed or an error occurs. Errors during this latter phase are\nignored -- they generally mean that a directory was not empty.'), _('os.removexattr(path, attribute, *, follow_symlinks=True) \nRemove extended attribute attribute on path.\n\npath may be either a string or an open file descriptor.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, removexattr will modify the symbolic link itself instead of the file\n the link points to.'), _('os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) \nRename a file or directory.\n\nIf either src_dir_fd or dst_dir_fd is not None, it should be a file\n descriptor open to a directory, and the respective path string (src or dst)\n should be relative; the path will then be relative to that directory.\nsrc_dir_fd and dst_dir_fd, may not be implemented on your platform.\n If they are unavailable, using them will raise a NotImplementedError.'), _('os.renames(old, new) \nrenames(old, new)\n\nSuper-rename; create directories as necessary and delete any left\nempty. Works like rename, except creation of any intermediate\ndirectories needed to make the new pathname good is attempted\nfirst. After the rename, directories corresponding to rightmost\npath segments of the old name will be pruned until either the\nwhole path is consumed or a nonempty directory is found.\n\nNote: this function can fail with the new directory structure made\nif you lack permissions needed to unlink the leaf directory or\nfile.'), _('os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None) \nRename a file or directory, overwriting the destination.\n\nIf either src_dir_fd or dst_dir_fd is not None, it should be a file\n descriptor open to a directory, and the respective path string (src or dst)\n should be relative; the path will then be relative to that directory.\nsrc_dir_fd and dst_dir_fd, may not be implemented on your platform.\n If they are unavailable, using them will raise a NotImplementedError."'), _('os.rmdir(path, *, dir_fd=None) \nRemove a directory.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.'), _("os.scandir() \nscandir(path='.') -> iterator of DirEntry objects for given path"), _('os.sched_get_priority_max(policy) \nGet the maximum scheduling priority for policy.'), _('os.sched_get_priority_min(policy) \nGet the minimum scheduling priority for policy.'), _('os.sched_getaffinity(pid, /) \nReturn the affinity of the process identified by pid (or the current process if zero).\n\nThe affinity is returned as a set of CPU identifiers.'), _('os.sched_getparam(pid, /) \nReturns scheduling parameters for the process identified by pid.\n\nIf pid is 0, returns parameters for the calling process.\nReturn value is an instance of sched_param.'), _('os.sched_getscheduler(pid, /) \nGet the scheduling policy for the process identifiedy by pid.\n\nPassing 0 for pid returns the scheduling policy for the calling process.'), _('os.sched_param(sched_priority) \nCurrent has only one field: sched_priority");\n\nsched_priority\n A scheduling parameter.'), _('os.sched_rr_get_interval(pid, /) \nReturn the round-robin quantum for the process identified by pid, in seconds.\n\nValue returned is a float.'), _('os.sched_setaffinity(pid, mask, /) \nSet the CPU affinity of the process identified by pid to mask.\n\nmask should be an iterable of integers identifying CPUs.'), _('os.sched_setparam(pid, param, /) \nSet scheduling parameters for the process identified by pid.\n\nIf pid is 0, sets parameters for the calling process.\nparam should be an instance of sched_param.'), _('os.sched_setscheduler(pid, policy, param, /) \nSet the scheduling policy for the process identified by pid.\n\nIf pid is 0, the calling process is changed.\nparam is an instance of sched_param.'), _('os.sched_yield() \nVoluntarily relinquish the CPU.'), _('os.sendfile() \nsendfile(out, in, offset, count) -> byteswritten\nsendfile(out, in, offset, count[, headers][, trailers], flags=0)\n -> byteswritten\nCopy count bytes from file descriptor in to file descriptor out.'), _('os.set_blocking() \nset_blocking(fd, blocking)\n\nSet the blocking mode of the specified file descriptor.\nSet the O_NONBLOCK flag if blocking is False,\nclear the O_NONBLOCK flag otherwise.'), _('os.set_inheritable(fd, inheritable, /) \nSet the inheritable flag of the specified file descriptor.'), _("os.setegid(egid, /) \nSet the current process's effective group id."), _("os.seteuid(euid, /) \nSet the current process's effective user id."), _("os.setgid(gid, /) \nSet the current process's group id."), _('os.setgroups(groups, /) \nSet the groups of the current process to list.'), _('os.setpgid(pid, pgrp, /) \nCall the system call setpgid(pid, pgrp).'), _('os.setpgrp() \nMake the current process the leader of its process group.'), _('os.setpriority(which, who, priority) \nSet program scheduling priority.'), _("os.setregid(rgid, egid, /) \nSet the current process's real and effective group ids."), _("os.setresgid(rgid, egid, sgid, /) \nSet the current process's real, effective, and saved group ids."), _("os.setresuid(ruid, euid, suid, /) \nSet the current process's real, effective, and saved user ids."), _("os.setreuid(ruid, euid, /) \nSet the current process's real and effective user ids."), _('os.setsid() \nCall the system call setsid().'), _("os.setuid(uid, /) \nSet the current process's user id."), _('os.setxattr(path, attribute, value, flags=0, *, follow_symlinks=True) \nSet extended attribute attribute on path to value.\n\npath may be either a string or an open file descriptor.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, setxattr will modify the symbolic link itself instead of the file\n the link points to.'), _("os.spawnl(mode, file, *args) \nspawnl(mode, file, *args) -> integer\n\nExecute file with arguments from args in a subprocess.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. "), _("os.spawnle(mode, file, *args) \nspawnle(mode, file, *args, env) -> integer\n\nExecute file with arguments from args in a subprocess with the\nsupplied environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. "), _("os.spawnlp(mode, file, *args) \nspawnlp(mode, file, *args) -> integer\n\nExecute file (which is looked for along $PATH) with arguments from\nargs in a subprocess with the supplied environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. "), _("os.spawnlpe(mode, file, *args) \nspawnlpe(mode, file, *args, env) -> integer\n\nExecute file (which is looked for along $PATH) with arguments from\nargs in a subprocess with the supplied environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. "), _("os.spawnv(mode, file, args) \nspawnv(mode, file, args) -> integer\n\nExecute file with arguments from args in a subprocess.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. "), _("os.spawnve(mode, file, args, env) \nspawnve(mode, file, args, env) -> integer\n\nExecute file with arguments from args in a subprocess with the\nspecified environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. "), _("os.spawnvp(mode, file, args) \nspawnvp(mode, file, args) -> integer\n\nExecute file (which is looked for along $PATH) with arguments from\nargs in a subprocess.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. "), _("os.spawnvpe(mode, file, args, env) \nspawnvpe(mode, file, args, env) -> integer\n\nExecute file (which is looked for along $PATH) with arguments from\nargs in a subprocess with the supplied environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. "), _('os.stat() \nConstants/functions for interpreting results of os.stat() and os.lstat().\n\nSuggested usage: from stat import *'), _("os.stat(path, *, dir_fd=None, follow_symlinks=True) \nPerform a stat system call on the given path.\n\n path\n Path to be examined; can be string, bytes, path-like object or\n open-file-descriptor int.\n dir_fd\n If not None, it should be a file descriptor open to a directory,\n and path should be a relative string; path will then be relative to\n that directory.\n follow_symlinks\n If False, and the last element of the path is a symbolic link,\n stat will examine the symbolic link itself instead of the file\n the link points to.\n\ndir_fd and follow_symlinks may not be implemented\n on your platform. If they are unavailable, using them will raise a\n NotImplementedError.\n\nIt's an error to use dir_fd or follow_symlinks when specifying path as\n an open file descriptor."), _('os.stat_float_times() \nstat_float_times([newval]) -> oldval\n\nDetermine whether os.[lf]stat represents time stamps as float objects.\n\nIf value is True, future calls to stat() return floats; if it is False,\nfuture calls return ints.\nIf value is omitted, return the current setting.'), _('os.stat_result() \nstat_result: Result from stat, fstat, or lstat.\n\nThis object may be accessed either as a tuple of\n (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\nor via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\nPosix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\nor st_flags, they are available as attributes only.\n\nSee os.stat for more information.'), _('os.statvfs(path) \nPerform a statvfs system call on the given path.\n\npath may always be specified as a string.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.'), _('os.statvfs_result() \nstatvfs_result: Result from statvfs or fstatvfs.\n\nThis object may be accessed either as a tuple of\n (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax),\nor via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n\nSee os.statvfs for more information.'), _('os.strerror(code, /) \nTranslate an error code to a message string.'), _('os.symlink(src, dst, target_is_directory=False, *, dir_fd=None) \nCreate a symbolic link pointing to src named dst.\n\ntarget_is_directory is required on Windows if the target is to be\n interpreted as a directory. (On Windows, symlink requires\n Windows 6.0 or greater, and raises a NotImplementedError otherwise.)\n target_is_directory is ignored on non-Windows platforms.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.'), _('os.sync() \nForce write of everything to disk.'), _("os.sys() \nThis module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function"), _('os.sysconf(name, /) \nReturn an integer-valued system configuration variable.'), _('os.system(command) \nExecute the command in a subshell.'), _('os.tcgetpgrp(fd, /) \nReturn the process group associated with the terminal specified by fd.'), _('os.tcsetpgrp(fd, pgid, /) \nSet the process group associated with the terminal specified by fd.'), _('os.terminal_size() \nA tuple of (columns, lines) for holding terminal window size'), _('os.times() \nReturn a collection containing process timing information.\n\nThe object returned behaves like a named tuple with these fields:\n (utime, stime, cutime, cstime, elapsed_time)\nAll fields are floating point numbers.'), _('os.times_result() \ntimes_result: Result from os.times().\n\nThis object may be accessed either as a tuple of\n (user, system, children_user, children_system, elapsed),\nor via the attributes user, system, children_user, children_system,\nand elapsed.\n\nSee os.times for more information.'), _('os.truncate(path, length) \nTruncate a file, specified by path, to a specific length.\n\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.'), _("os.ttyname(fd, /) \nReturn the name of the terminal device connected to 'fd'.\n\nfd\n Integer file descriptor handle."), _('os.umask(mask, /) \nSet the current numeric umask and return the previous umask.'), _('os.uname() \nReturn an object identifying the current operating system.\n\nThe object behaves like a named tuple with the following fields:\n (sysname, nodename, release, version, machine)'), _('os.uname_result() \nuname_result: Result from os.uname().\n\nThis object may be accessed either as a tuple of\n (sysname, nodename, release, version, machine),\nor via the attributes sysname, nodename, release, version, and machine.\n\nSee os.uname for more information.'), _('os.unlink(path, *, dir_fd=None) \nRemove a file (same as remove()).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.'), _('os.unsetenv(name, /) \nDelete an environment variable.'), _('os.urandom(size, /) \nReturn a bytes object containing random bytes suitable for cryptographic use.'), _('os.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True) \nSet the access and modified time of path.\n\npath may always be specified as a string.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.\n\nIf times is not None, it must be a tuple (atime, mtime);\n atime and mtime should be expressed as float seconds since the epoch.\nIf ns is specified, it must be a tuple (atime_ns, mtime_ns);\n atime_ns and mtime_ns should be expressed as integer nanoseconds\n since the epoch.\nIf times is None and ns is unspecified, utime uses the current time.\nSpecifying tuples for both times and ns is an error.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, utime will modify the symbolic link itself instead of the file the\n link points to.\nIt is an error to use dir_fd or follow_symlinks when specifying path\n as an open file descriptor.\ndir_fd and follow_symlinks may not be available on your platform.\n If they are unavailable, using them will raise a NotImplementedError.'), _('os.wait() \nWait for completion of a child process.\n\nReturns a tuple of information about the child process:\n (pid, status)'), _('os.wait3(options) \nWait for completion of a child process.\n\nReturns a tuple of information about the child process:\n (pid, status, rusage)'), _('os.wait4(pid, options) \nWait for completion of a specific child process.\n\nReturns a tuple of information about the child process:\n (pid, status, rusage)'), _('os.waitid(idtype, id, options, /) \nReturns the result of waiting for a process or processes.\n\n idtype\n Must be one of be P_PID, P_PGID or P_ALL.\n id\n The id to wait on.\n options\n Constructed from the ORing of one or more of WEXITED, WSTOPPED\n or WCONTINUED and additionally may be ORed with WNOHANG or WNOWAIT.\n\nReturns either waitid_result or None if WNOHANG is specified and there are\nno children in a waitable state.'), _('os.waitid_result() \nwaitid_result: Result from waitid.\n\nThis object may be accessed either as a tuple of\n (si_pid, si_uid, si_signo, si_status, si_code),\nor via the attributes si_pid, si_uid, and so on.\n\nSee os.waitid for more information.'), _('os.waitpid(pid, options, /) \nWait for completion of a given child process.\n\nReturns a tuple of information regarding the child process:\n (pid, status)\n\nThe options argument is ignored on Windows.'), _('os.walk(top, topdown=True, onerror=None, followlinks=False) \nDirectory tree generator.\n\nFor each directory in the directory tree rooted at top (including top\nitself, but excluding \'.\' and \'..\'), yields a 3-tuple\n\n dirpath, dirnames, filenames\n\ndirpath is a string, the path to the directory. dirnames is a list of\nthe names of the subdirectories in dirpath (excluding \'.\' and \'..\').\nfilenames is a list of the names of the non-directory files in dirpath.\nNote that the names in the lists are just names, with no path components.\nTo get a full path (which begins with top) to a file or directory in\ndirpath, do os.path.join(dirpath, name).\n\nIf optional arg \'topdown\' is true or not specified, the triple for a\ndirectory is generated before the triples for any of its subdirectories\n(directories are generated top down). If topdown is false, the triple\nfor a directory is generated after the triples for all of its\nsubdirectories (directories are generated bottom up).\n\nWhen topdown is true, the caller can modify the dirnames list in-place\n(e.g., via del or slice assignment), and walk will only recurse into the\nsubdirectories whose names remain in dirnames; this can be used to prune the\nsearch, or to impose a specific order of visiting. Modifying dirnames when\ntopdown is false is ineffective, since the directories in dirnames have\nalready been generated by the time dirnames itself is generated. No matter\nthe value of topdown, the list of subdirectories is retrieved before the\ntuples for the directory and its subdirectories are generated.\n\nBy default errors from the os.scandir() call are ignored. If\noptional arg \'onerror\' is specified, it should be a function; it\nwill be called with one argument, an OSError instance. It can\nreport the error to continue with the walk, or raise the exception\nto abort the walk. Note that the filename is available as the\nfilename attribute of the exception object.\n\nBy default, os.walk does not follow symbolic links to subdirectories on\nsystems that support them. In order to get this functionality, set the\noptional argument \'followlinks\' to true.\n\nCaution: if you pass a relative pathname for top, don\'t change the\ncurrent working directory between resumptions of walk. walk never\nchanges the current directory, and assumes that the client doesn\'t\neither.\n\nExample:\n\nimport os\nfrom os.path import join, getsize\nfor root, dirs, files in os.walk(\'python/Lib/email\'):\n print(root, "consumes", end="")\n print(sum([getsize(join(root, name)) for name in files]), end="")\n print("bytes in", len(files), "non-directory files")\n if \'CVS\' in dirs:\n dirs.remove(\'CVS\') # don\'t visit CVS directories'), _('os.write(fd, data, /) \nWrite a bytes object to a file descriptor.'), _('os.writev(fd, buffers, /) \nIterate over buffers, and write the contents of each to a file descriptor.\n\nReturns the total number of bytes written.\nbuffers must be a sequence of bytes-like objects.'), _("random.Random(x=None) \nRandom number generator base class used by bound module functions.\n\nUsed to instantiate instances of Random to get generators that don't\nshare state.\n\nClass Random can also be subclassed if you want to use a different basic\ngenerator of your own devising: in that case, override the following\nmethods: random(), seed(), getstate(), and setstate().\nOptionally, implement a getrandbits() method so that randrange()\ncan cover arbitrarily large ranges."), _('random.SystemRandom(x=None) \nAlternate random number generator using sources provided\nby the operating system (such as /dev/urandom on Unix or\nCryptGenRandom on Windows).\n\n Not available on all systems (see os.urandom() for details).'), _('random.betavariate(alpha, beta) \nBeta distribution.\n\nConditions on the parameters are alpha > 0 and beta > 0.\nReturned values range between 0 and 1.'), _('random.choice(seq) \nChoose a random element from a non-empty sequence.'), _('random.choices(population, weights=None, *, cum_weights=None, k=1) \nReturn a k sized list of population elements chosen with replacement.\n\nIf the relative weights or cumulative weights are not specified,\nthe selections are made with equal probability.'), _('random.expovariate(lambd) \nExponential distribution.\n\nlambd is 1.0 divided by the desired mean. It should be\nnonzero. (The parameter would be called "lambda", but that is\na reserved word in Python.) Returned values range from 0 to\npositive infinity if lambd is positive, and from negative\ninfinity to 0 if lambd is negative.'), _('random.gammavariate(alpha, beta) \nGamma distribution. Not the gamma function!\n\nConditions on the parameters are alpha > 0 and beta > 0.\n\nThe probability distribution function is:\n\n x ** (alpha - 1) * math.exp(-x / beta)\n pdf(x) = --------------------------------------\n math.gamma(alpha) * beta ** alpha'), _('random.gauss(mu, sigma) \nGaussian distribution.\n\nmu is the mean, and sigma is the standard deviation. This is\nslightly faster than the normalvariate() function.\n\nNot thread-safe without a lock around calls.'), _('random.getrandbits() \ngetrandbits(k) -> x. Generates an int with k random bits.'), _('random.getstate() \nReturn internal state; can be passed to setstate() later.'), _("random.lognormvariate(mu, sigma) \nLog normal distribution.\n\nIf you take the natural logarithm of this distribution, you'll get a\nnormal distribution with mean mu and standard deviation sigma.\nmu can have any value, and sigma must be greater than zero."), _('random.normalvariate(mu, sigma) \nNormal distribution.\n\nmu is the mean, and sigma is the standard deviation.'), _('random.paretovariate(alpha) \nPareto distribution. alpha is the shape parameter.'), _('random.randint(a, b) \nReturn random integer in range [a, b], including both end points.\n '), _('random.random() \nrandom() -> x in the interval [0, 1).'), _("random.randrange(start, stop=None, step=1, _int=) \nChoose a random item from range(start, stop[, step]).\n\nThis fixes the problem with randint() which includes the\nendpoint; in Python this is usually not what you want."), _('random.sample(population, k) \nChooses k unique random elements from a population sequence or set.\n\nReturns a new list containing elements from the population while\nleaving the original population unchanged. The resulting list is\nin selection order so that all sub-slices will also be valid random\nsamples. This allows raffle winners (the sample) to be partitioned\ninto grand prize and second place winners (the subslices).\n\nMembers of the population need not be hashable or unique. If the\npopulation contains repeats, then each occurrence is a possible\nselection in the sample.\n\nTo choose a sample in a range of integers, use range as an argument.\nThis is especially fast and space efficient for sampling from a\nlarge population: sample(range(10000000), 60)'), _('random.seed(a=None, version=2) \nInitialize internal state from hashable object.\n\nNone or no argument seeds from current time or from an operating\nsystem specific randomness source if available.\n\nIf *a* is an int, all bits are used.\n\nFor version 2 (the default), all of the bits are used if *a* is a str,\nbytes, or bytearray. For version 1 (provided for reproducing random\nsequences from older versions of Python), the algorithm for str and\nbytes generates a narrower range of seeds.'), _('random.setstate(state) \nRestore internal state from object returned by getstate().'), _('random.shuffle(x, random=None) \nShuffle list x in place, and return None.\n\nOptional argument random is a 0-argument function returning a\nrandom float in [0.0, 1.0); if it is the default None, the\nstandard random.random will be used.'), _('random.triangular(low=0.0, high=1.0, mode=None) \nTriangular distribution.\n\nContinuous distribution bounded by given lower and upper limits,\nand having a given mode value in-between.\n\nhttp://en.wikipedia.org/wiki/Triangular_distribution'), _('random.uniform(a, b) \nGet a random number in the range [a, b) or [a, b] depending on rounding.'), _('random.vonmisesvariate(mu, kappa) \nCircular data distribution.\n\nmu is the mean angle, expressed in radians between 0 and 2*pi, and\nkappa is the concentration parameter, which must be greater than or\nequal to zero. If kappa is equal to zero, this distribution reduces\nto a uniform random angle over the range 0 to 2*pi.'), _('random.weibullvariate(alpha, beta) \nWeibull distribution.\n\nalpha is the scale parameter and beta is the shape parameter.'), _('socket.AddressFamily(value, names=None, *, module=None, qualname=None, type=None, start=1) \nAn enumeration.'), _('socket.AddressInfo(value, names=None, *, module=None, qualname=None, type=None, start=1) \nAn enumeration.'), _('socket.CMSG_LEN() \nCMSG_LEN(length) -> control message length\n\nReturn the total length, without trailing padding, of an ancillary\ndata item with associated data of the given length. This value can\noften be used as the buffer size for recvmsg() to receive a single\nitem of ancillary data, but RFC 3542 requires portable applications to\nuse CMSG_SPACE() and thus include space for padding, even when the\nitem will be the last in the buffer. Raises OverflowError if length\nis outside the permissible range of values.'), _('socket.CMSG_SPACE() \nCMSG_SPACE(length) -> buffer size\n\nReturn the buffer size needed for recvmsg() to receive an ancillary\ndata item with associated data of the given length, along with any\ntrailing padding. The buffer space needed to receive multiple items\nis the sum of the CMSG_SPACE() values for their associated data\nlengths. Raises OverflowError if length is outside the permissible\nrange of values.'), _('socket.IntEnum(value, names=None, *, module=None, qualname=None, type=None, start=1) \nEnum where members are also (and must be) ints'), _('socket.IntFlag(value, names=None, *, module=None, qualname=None, type=None, start=1) \nSupport for integer-based Flags'), _('socket.MsgFlag(value, names=None, *, module=None, qualname=None, type=None, start=1) \nAn enumeration.'), _('socket.OSError() \nBase class for I/O related errors.'), _('socket.SocketIO(sock, mode) \nRaw I/O implementation for stream sockets.\n\nThis class supports the makefile() method on sockets. It provides\nthe raw I/O interface on top of a socket object.'), _('socket.SocketKind(value, names=None, *, module=None, qualname=None, type=None, start=1) \nAn enumeration.'), _("socket.create_connection(address, timeout=, source_address=None) \nConnect to *address* and return the socket object.\n\nConvenience function. Connect to *address* (a 2-tuple ``(host,\nport)``) and return the socket object. Passing the optional\n*timeout* parameter will set the timeout on the socket instance\nbefore attempting to connect. If no *timeout* is supplied, the\nglobal default timeout setting returned by :func:`getdefaulttimeout`\nis used. If *source_address* is set it must be a tuple of (host, port)\nfor the socket to bind as a source address before making the connection.\nA host of '' or port 0 tells the OS to use the default."), _("socket.dup() \ndup(integer) -> integer\n\nDuplicate an integer socket file descriptor. This is like os.dup(), but for\nsockets; on some platforms os.dup() won't work for socket file descriptors."), _("socket.errno() \nThis module makes available standard errno system symbols.\n\nThe value of each symbol is the corresponding integer value,\ne.g., on most systems, errno.ENOENT equals the integer 2.\n\nThe dictionary errno.errorcode maps numeric codes to symbol names,\ne.g., errno.errorcode[2] could be the string 'ENOENT'.\n\nSymbols that are not relevant to the underlying system are not defined.\n\nTo map error codes to error messages, use the function os.strerror(),\ne.g. os.strerror(2) could return 'No such file or directory'."), _('socket.fromfd(fd, family, type, proto=0) \nfromfd(fd, family, type[, proto]) -> socket object\n\nCreate a socket object from a duplicate of the given file\ndescriptor. The remaining arguments are the same as for socket().'), _('socket.gaierror() \nBase class for I/O related errors.'), _("socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) \nResolve host and port into list of address info entries.\n\nTranslate the host/port argument into a sequence of 5-tuples that contain\nall the necessary arguments for creating a socket connected to that service.\nhost is a domain name, a string representation of an IPv4/v6 address or\nNone. port is a string service name such as 'http', a numeric port number or\nNone. By passing None as the value of host and port, you can pass NULL to\nthe underlying C API.\n\nThe family, type and proto arguments can be optionally specified in order to\nnarrow the list of addresses returned. Passing zero as a value for each of\nthese arguments selects the full range of results."), _('socket.getdefaulttimeout() \ngetdefaulttimeout() -> timeout\n\nReturns the default timeout in seconds (float) for new socket objects.\nA value of None indicates that new socket objects have no timeout.\nWhen the socket module is first imported, the default is None.'), _("socket.getfqdn(name='') \nGet fully qualified domain name from name.\n\nAn empty argument is interpreted as meaning the local host.\n\nFirst the hostname returned by gethostbyaddr() is checked, then\npossibly existing aliases. In case no FQDN is available, hostname\nfrom gethostname() is returned."), _('socket.gethostbyaddr() \ngethostbyaddr(host) -> (name, aliaslist, addresslist)\n\nReturn the true host name, a list of aliases, and a list of IP addresses,\nfor a host. The host argument is a string giving a host name or IP number.'), _("socket.gethostbyname() \ngethostbyname(host) -> address\n\nReturn the IP address (a string of the form '255.255.255.255') for a host."), _('socket.gethostbyname_ex() \ngethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\nReturn the true host name, a list of aliases, and a list of IP addresses,\nfor a host. The host argument is a string giving a host name or IP number.'), _('socket.gethostname() \ngethostname() -> string\n\nReturn the current host name.'), _('socket.getnameinfo() \ngetnameinfo(sockaddr, flags) --> (host, port)\n\nGet host and port for a sockaddr.'), _('socket.getprotobyname() \ngetprotobyname(name) -> integer\n\nReturn the protocol number for the named protocol. (Rarely used.)'), _("socket.getservbyname() \ngetservbyname(servicename[, protocolname]) -> integer\n\nReturn a port number from a service name and protocol name.\nThe optional protocol name, if given, should be 'tcp' or 'udp',\notherwise any protocol will match."), _("socket.getservbyport() \ngetservbyport(port[, protocolname]) -> string\n\nReturn the service name from a port number and protocol name.\nThe optional protocol name, if given, should be 'tcp' or 'udp',\notherwise any protocol will match."), _('socket.herror() \nBase class for I/O related errors.'), _('socket.htonl() \nhtonl(integer) -> integer\n\nConvert a 32-bit integer from host to network byte order.'), _('socket.htons() \nhtons(integer) -> integer\n\nConvert a 16-bit integer from host to network byte order.'), _('socket.if_indextoname() \nif_indextoname(if_index)\n\nReturns the interface name corresponding to the interface index if_index.'), _('socket.if_nameindex() \nif_nameindex()\n\nReturns a list of network interface information (index, name) tuples.'), _('socket.if_nametoindex() \nif_nametoindex(if_name)\n\nReturns the interface index corresponding to the interface name if_name.'), _('socket.inet_aton() \ninet_aton(string) -> bytes giving packed 32-bit IP representation\n\nConvert an IP address in string format (123.45.67.89) to the 32-bit packed\nbinary format used in low-level network functions.'), _('socket.inet_ntoa() \ninet_ntoa(packed_ip) -> ip_address_string\n\nConvert an IP address from 32-bit packed binary format to string format'), _('socket.inet_ntop() \ninet_ntop(af, packed_ip) -> string formatted IP address\n\nConvert a packed IP address of the given family to string format.'), _('socket.inet_pton() \ninet_pton(af, ip) -> packed IP address string\n\nConvert an IP address from string format to a packed string suitable\nfor use with low-level network functions.'), _("socket.io() \nThe io module provides the Python interfaces to stream handling. The\nbuiltin open function is defined in this module.\n\nAt the top of the I/O hierarchy is the abstract base class IOBase. It\ndefines the basic interface to a stream. Note, however, that there is no\nseparation between reading and writing to streams; implementations are\nallowed to raise an OSError if they do not support a given operation.\n\nExtending IOBase is RawIOBase which deals simply with the reading and\nwriting of raw bytes to a stream. FileIO subclasses RawIOBase to provide\nan interface to OS files.\n\nBufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its\nsubclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer\nstreams that are readable, writable, and both respectively.\nBufferedRandom provides a buffered interface to random access\nstreams. BytesIO is a simple stream of in-memory bytes.\n\nAnother IOBase subclass, TextIOBase, deals with the encoding and decoding\nof streams into text. TextIOWrapper, which extends it, is a buffered text\ninterface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\nis an in-memory stream for text.\n\nArgument names are not part of the specification, and only the arguments\nof open() are intended to be used as keyword arguments.\n\ndata:\n\nDEFAULT_BUFFER_SIZE\n\n An int containing the default buffer size used by the module's buffered\n I/O classes. open() uses the file's blksize (as obtained by os.stat) if\n possible."), _('socket.ntohl() \nntohl(integer) -> integer\n\nConvert a 32-bit integer from network to host byte order.'), _('socket.ntohs() \nntohs(integer) -> integer\n\nConvert a 16-bit integer from network to host byte order.'), _("socket.os() \nOS routines for NT or Posix depending on what system we're on.\n\nThis exports:\n - all functions from posix or nt, e.g. unlink, stat, etc.\n - os.path is either posixpath or ntpath\n - os.name is either 'posix' or 'nt'\n - os.curdir is a string representing the current directory (always '.')\n - os.pardir is a string representing the parent directory (always '..')\n - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n - os.extsep is the extension separator (always '.')\n - os.altsep is the alternate pathname separator (None or '/')\n - os.pathsep is the component separator used in $PATH etc\n - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r\\n')\n - os.defpath is the default search path for executables\n - os.devnull is the file path of the null device ('/dev/null', etc.)\n\nPrograms that import and use 'os' stand a better chance of being\nportable between different platforms. Of course, they must then\nonly use functions that are defined by all platforms (e.g., unlink\nand opendir), and leave all pathname manipulation to os.path\n(e.g., split and join)."), _('socket.selectors() \nSelectors module.\n\nThis module allows high-level and efficient I/O multiplexing, built upon the\n`select` module primitives.'), _('socket.setdefaulttimeout() \nsetdefaulttimeout(timeout)\n\nSet the default timeout in seconds (float) for new socket objects.\nA value of None indicates that new socket objects have no timeout.\nWhen the socket module is first imported, the default is None.'), _('socket.sethostname() \nsethostname(name)\n\nSets the hostname to name.'), _("socket.socket() \nsocket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\nOpen a socket of the given type. The family argument specifies the\naddress family; it defaults to AF_INET. The type argument specifies\nwhether this is a stream (SOCK_STREAM, this is the default)\nor datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\nspecifying the default protocol. Keyword arguments are accepted.\nThe socket is created as non-inheritable.\n\nA socket object represents one endpoint of a network connection.\n\nMethods of socket objects (keyword arguments not allowed):\n\n_accept() -- accept connection, returning new socket fd and client address\nbind(addr) -- bind the socket to a local address\nclose() -- close the socket\nconnect(addr) -- connect the socket to a remote address\nconnect_ex(addr) -- connect, return an error code instead of an exception\ndup() -- return a new socket fd duplicated from fileno()\nfileno() -- return underlying file descriptor\ngetpeername() -- return remote address [*]\ngetsockname() -- return local address\ngetsockopt(level, optname[, buflen]) -- get socket options\ngettimeout() -- return timeout or None\nlisten([n]) -- start listening for incoming connections\nrecv(buflen[, flags]) -- receive data\nrecv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\nrecvfrom(buflen[, flags]) -- receive data and sender's address\nrecvfrom_into(buffer[, nbytes, [, flags])\n -- receive data and sender's address (into a buffer)\nsendall(data[, flags]) -- send all data\nsend(data[, flags]) -- send data, may not send all of it\nsendto(data[, flags], addr) -- send data to a given address\nsetblocking(0 | 1) -- set or clear the blocking I/O flag\nsetsockopt(level, optname, value[, optlen]) -- set socket options\nsettimeout(None | float) -- set or clear the timeout\nshutdown(how) -- shut down traffic in one or both directions\nif_nameindex() -- return all network interface indices and names\nif_nametoindex(name) -- return the corresponding interface index\nif_indextoname(index) -- return the corresponding interface name\n\n [*] not available on all platforms!"), _('socket.socket(family=, type=, proto=0, fileno=None) \nA subclass of _socket.socket adding the makefile() method.'), _('socket.socketpair(family=None, type=, proto=0) \nsocketpair([family[, type[, proto]]]) -> (socket object, socket object)\nCreate a pair of socket objects from the sockets returned by the platform\nsocketpair() function.\nThe arguments are the same as for socket() except the default family is AF_UNIX\nif defined on the platform; otherwise, the default is AF_INET.'), _("socket.sys() \nThis module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function"), _('socket.timeout() \nBase class for I/O related errors.'), _('sys.call_tracing() \ncall_tracing(func, args) -> object\n\nCall func(*args), while tracing is enabled. The tracing state is\nsaved, and restored afterwards. This is intended to be called from\na debugger from a checkpoint, to recursively debug some other code.'), _('sys.callstats() \ncallstats() -> tuple of integers\n\nReturn a tuple of function call statistics, if CALL_PROFILE was defined\nwhen Python was built. Otherwise, return None.\n\nWhen enabled, this function returns detailed, implementation-specific\ndetails about the number of function calls executed. The return value is\na 11-tuple where the entries in the tuple are counts of:\n0. all function calls\n1. calls to PyFunction_Type objects\n2. PyFunction calls that do not create an argument tuple\n3. PyFunction calls that do not create an argument tuple\n and bypass PyEval_EvalCodeEx()\n4. PyMethod calls\n5. PyMethod calls on bound methods\n6. PyType calls\n7. PyCFunction calls\n8. generator calls\n9. All other calls\n10. Number of stack pops performed by call_function()'), _('sys.displayhook() \ndisplayhook(object) -> None\n\nPrint an object to sys.stdout and also save it in builtins._'), _('sys.exc_info() \nexc_info() -> (type, value, traceback)\n\nReturn information about the most recent exception caught by an except\nclause in the current stack frame or in an older stack frame.'), _('sys.excepthook() \nexcepthook(exctype, value, traceback) -> None\n\nHandle an exception by displaying it with a traceback on sys.stderr.'), _('sys.exit() \nexit([status])\n\nExit the interpreter by raising SystemExit(status).\nIf the status is omitted or None, it defaults to zero (i.e., success).\nIf the status is an integer, it will be used as the system exit status.\nIf it is another kind of object, it will be printed and the system\nexit status will be one (i.e., failure).'), _('sys.get_asyncgen_hooks() \nget_asyncgen_hooks()\n\nReturn a namedtuple of installed asynchronous generators hooks (firstiter, finalizer).'), _('sys.get_coroutine_wrapper() \nget_coroutine_wrapper()\n\nReturn the wrapper for coroutine objects set by sys.set_coroutine_wrapper.'), _('sys.getallocatedblocks() \ngetallocatedblocks() -> integer\n\nReturn the number of memory blocks currently allocated, regardless of their\nsize.'), _('sys.getcheckinterval() \ngetcheckinterval() -> current check interval; see setcheckinterval().'), _('sys.getdefaultencoding() \ngetdefaultencoding() -> string\n\nReturn the current default string encoding used by the Unicode \nimplementation.'), _('sys.getdlopenflags() \ngetdlopenflags() -> int\n\nReturn the current value of the flags that are used for dlopen calls.\nThe flag constants are defined in the os module.'), _('sys.getfilesystemencodeerrors() \ngetfilesystemencodeerrors() -> string\n\nReturn the error mode used to convert Unicode filenames in\noperating system filenames.'), _('sys.getfilesystemencoding() \ngetfilesystemencoding() -> string\n\nReturn the encoding used to convert Unicode filenames in\noperating system filenames.'), _('sys.getprofile() \ngetprofile()\n\nReturn the profiling function set with sys.setprofile.\nSee the profiler chapter in the library manual.'), _('sys.getrecursionlimit() \ngetrecursionlimit()\n\nReturn the current value of the recursion limit, the maximum depth\nof the Python interpreter stack. This limit prevents infinite\nrecursion from causing an overflow of the C stack and crashing Python.'), _('sys.getrefcount() \ngetrefcount(object) -> integer\n\nReturn the reference count of object. The count returned is generally\none higher than you might expect, because it includes the (temporary)\nreference as an argument to getrefcount().'), _('sys.getsizeof() \ngetsizeof(object, default) -> int\n\nReturn the size of object in bytes.'), _('sys.getswitchinterval() \ngetswitchinterval() -> current thread switch interval; see setswitchinterval().'), _('sys.gettrace() \ngettrace()\n\nReturn the global debug tracing function set with sys.settrace.\nSee the debugger chapter in the library manual.'), _("sys.intern() \nintern(string) -> string\n\n``Intern'' the given string. This enters the string in the (global)\ntable of interned strings whose purpose is to speed up dictionary lookups.\nReturn the string itself or the previously interned string object with the\nsame value."), _('sys.is_finalizing() \nis_finalizing()\nReturn True if Python is exiting.'), _('sys.set_asyncgen_hooks() \nset_asyncgen_hooks(*, firstiter=None, finalizer=None)\n\nSet a finalizer for async generators objects.'), _('sys.set_coroutine_wrapper() \nset_coroutine_wrapper(wrapper)\n\nSet a wrapper for coroutine objects.'), _('sys.setcheckinterval() \nsetcheckinterval(n)\n\nTell the Python interpreter to check for asynchronous events every\nn instructions. This also affects how often thread switches occur.'), _('sys.setdlopenflags() \nsetdlopenflags(n) -> None\n\nSet the flags used by the interpreter for dlopen calls, such as when the\ninterpreter loads extension modules. Among other things, this will enable\na lazy resolving of symbols when importing a module, if called as\nsys.setdlopenflags(0). To share symbols across extension modules, call as\nsys.setdlopenflags(os.RTLD_GLOBAL). Symbolic names for the flag modules\ncan be found in the os module (RTLD_xxx constants, e.g. os.RTLD_LAZY).'), _('sys.setprofile() \nsetprofile(function)\n\nSet the profiling function. It will be called on each function call\nand return. See the profiler chapter in the library manual.'), _('sys.setrecursionlimit() \nsetrecursionlimit(n)\n\nSet the maximum depth of the Python interpreter stack to n. This\nlimit prevents infinite recursion from causing an overflow of the C\nstack and crashing Python. The highest possible limit is platform-\ndependent.'), _('sys.setswitchinterval() \nsetswitchinterval(n)\n\nSet the ideal thread switching delay inside the Python interpreter\nThe actual frequency of switching threads can be lower if the\ninterpreter executes long sequences of uninterruptible code\n(this is implementation-specific and workload-dependent).\n\nThe parameter must represent the desired switching delay in seconds\nA typical value is 0.005 (5 milliseconds).'), _('sys.settrace() \nsettrace(function)\n\nSet the global debug tracing function. It will be called on each\nfunction call. See the debugger chapter in the library manual.'), _("time.asctime() \nasctime([tuple]) -> string\n\nConvert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\nWhen the time tuple is not present, current time as returned by localtime()\nis used."), _('time.clock() \nclock() -> floating point number\n\nReturn the CPU time or real time since the start of the process or since\nthe first call to clock(). This has as much precision as the system\nrecords.'), _('time.clock_getres() \nclock_getres(clk_id) -> floating point number\n\nReturn the resolution (precision) of the specified clock clk_id.'), _('time.clock_gettime() \nclock_gettime(clk_id) -> floating point number\n\nReturn the time of the specified clock clk_id.'), _('time.clock_settime() \nclock_settime(clk_id, time)\n\nSet the time of the specified clock clk_id.'), _('time.ctime() \nctime(seconds) -> string\n\nConvert a time in seconds since the Epoch to a string in local time.\nThis is equivalent to asctime(localtime(seconds)). When the time tuple is\nnot present, current time as returned by localtime() is used.'), _('time.get_clock_info() \nget_clock_info(name: str) -> dict\n\nGet information of the specified clock.'), _("time.gmtime() \ngmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n tm_sec, tm_wday, tm_yday, tm_isdst)\n\nConvert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\nGMT). When 'seconds' is not passed in, convert the current time instead.\n\nIf the platform supports the tm_gmtoff and tm_zone, they are available as\nattributes only."), _("time.localtime() \nlocaltime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n tm_sec,tm_wday,tm_yday,tm_isdst)\n\nConvert seconds since the Epoch to a time tuple expressing local time.\nWhen 'seconds' is not passed in, convert the current time instead."), _('time.mktime() \nmktime(tuple) -> floating point number\n\nConvert a time tuple in local time to seconds since the Epoch.\nNote that mktime(gmtime(0)) will not generally return zero for most\ntime zones; instead the returned value will either be equal to that\nof the timezone or altzone attributes on the time module.'), _('time.monotonic() \nmonotonic() -> float\n\nMonotonic clock, cannot go backward.'), _('time.perf_counter() \nperf_counter() -> float\n\nPerformance counter for benchmarking.'), _('time.process_time() \nprocess_time() -> float\n\nProcess time for profiling: sum of the kernel and user-space CPU time.'), _('time.sleep() \nsleep(seconds)\n\nDelay execution for a given number of seconds. The argument may be\na floating point number for subsecond precision.'), _("time.strftime() \nstrftime(format[, tuple]) -> string\n\nConvert a time tuple to a string according to a format specification.\nSee the library reference manual for formatting codes. When the time tuple\nis not present, current time as returned by localtime() is used.\n\nCommonly used format codes:\n\n%Y Year with century as a decimal number.\n%m Month as a decimal number [01,12].\n%d Day of the month as a decimal number [01,31].\n%H Hour (24-hour clock) as a decimal number [00,23].\n%M Minute as a decimal number [00,59].\n%S Second as a decimal number [00,61].\n%z Time zone offset from UTC.\n%a Locale's abbreviated weekday name.\n%A Locale's full weekday name.\n%b Locale's abbreviated month name.\n%B Locale's full month name.\n%c Locale's appropriate date and time representation.\n%I Hour (12-hour clock) as a decimal number [01,12].\n%p Locale's equivalent of either AM or PM.\n\nOther codes may be available on your platform. See documentation for\nthe C library strftime function."), _("time.strptime() \nstrptime(string, format) -> struct_time\n\nParse a string to a time tuple according to a format specification.\nSee the library reference manual for formatting codes (same as\nstrftime()).\n\nCommonly used format codes:\n\n%Y Year with century as a decimal number.\n%m Month as a decimal number [01,12].\n%d Day of the month as a decimal number [01,31].\n%H Hour (24-hour clock) as a decimal number [00,23].\n%M Minute as a decimal number [00,59].\n%S Second as a decimal number [00,61].\n%z Time zone offset from UTC.\n%a Locale's abbreviated weekday name.\n%A Locale's full weekday name.\n%b Locale's abbreviated month name.\n%B Locale's full month name.\n%c Locale's appropriate date and time representation.\n%I Hour (12-hour clock) as a decimal number [01,12].\n%p Locale's equivalent of either AM or PM.\n\nOther codes may be available on your platform. See documentation for\nthe C library strftime function."), _("time.struct_time() \nThe time value as returned by gmtime(), localtime(), and strptime(), and\naccepted by asctime(), mktime() and strftime(). May be considered as a\nsequence of 9 integers.\n\nNote that several fields' values are not the same as those defined by\nthe C language standard for struct tm. For example, the value of the\nfield tm_year is the actual year, not year - 1900. See individual\nfields' descriptions for details."), _('time.time() \ntime() -> floating point number\n\nReturn the current time in seconds since the Epoch.\nFractions of a second may be present if the system clock provides them.'), _("time.tzset() \ntzset()\n\nInitialize, or reinitialize, the local timezone to the value stored in\nos.environ['TZ']. The TZ environment variable should be specified in\nstandard Unix timezone format as documented in the tzset man page\n(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\nfall back to UTC. If the TZ environment variable is not set, the local\ntimezone is set to the systems best guess of wallclock time.\nChanging the TZ environment variable without calling tzset *may* change\nthe local timezone used by methods such as localtime, but this behaviour\nshould not be relied on."), _('turtle.Canvas(master=None, cnf={}, **kw) \nCanvas widget to display graphical elements like lines or text.'), _("turtle.RawTurtle(canvas=None, shape='classic', undobuffersize=1000, visible=True) \nAnimation part of the RawTurtle.\nPuts RawTurtle upon a TurtleScreen and provides tools for\nits animation."), _("turtle.RawTurtle(canvas=None, shape='classic', undobuffersize=1000, visible=True) \nAnimation part of the RawTurtle.\nPuts RawTurtle upon a TurtleScreen and provides tools for\nits animation."), _('turtle.Screen() \nReturn the singleton screen object.\nIf none exists at the moment, create a new one and return it,\nelse return the existing one.'), _("turtle.ScrolledCanvas(master, width=500, height=350, canvwidth=600, canvheight=500) \nModeled after the scrolled canvas class from Grayons's Tkinter book.\n\nUsed as the default canvas, which pops up automatically when\nusing turtle graphics functions or the Turtle class."), _('turtle.Shape(type_, data=None) \nData structure modeling shapes.\n\nattribute _type is one of "polygon", "image", "compound"\nattribute _data is - depending on _type a poygon-tuple,\nan image or a list constructed using the addcomponent method.'), _("turtle.TNavigator(mode='standard') \nNavigation part of the RawTurtle.\nImplements methods for turtle movement."), _("turtle.TPen(resizemode='noresize') \nDrawing part of the RawTurtle.\nImplements drawing properties."), _('turtle.Tbuffer(bufsize=10) \nRing buffer used as undobuffer for RawTurtle objects.'), _('turtle.Terminator() \nWill be raised in TurtleScreen.update, if _RUNNING becomes False.\n\nThis stops execution of a turtle graphics script.\nMain purpose: use in the Demo-Viewer turtle.Demo.py.'), _("turtle.Turtle(shape='classic', undobuffersize=1000, visible=True) \nRawTurtle auto-creating (scrolled) canvas.\n\nWhen a Turtle object is created or a function derived from some\nTurtle method is called a TurtleScreen object is automatically created."), _("turtle.Turtle(shape='classic', undobuffersize=1000, visible=True) \nRawTurtle auto-creating (scrolled) canvas.\n\nWhen a Turtle object is created or a function derived from some\nTurtle method is called a TurtleScreen object is automatically created."), _('turtle.TurtleGraphicsError() \nSome TurtleGraphics Error\n '), _("turtle.TurtleScreen(cv, mode='standard', colormode=1.0, delay=10) \nProvides screen oriented methods like setbg etc.\n\nOnly relies upon the methods of TurtleScreenBase and NOT\nupon components of the underlying graphics toolkit -\nwhich is Tkinter in this case."), _('turtle.TurtleScreenBase(cv) \nProvide the basic graphics functionality.\nInterface between Tkinter and turtle.py.\n\nTo port turtle.py to some different graphics toolkit\na corresponding TurtleScreenBase class has to be implemented.'), _('turtle.Vec2D(x, y) \nA 2 dimensional vector class, used as a helper class\nfor implementing turtle graphics.\nMay be useful for turtle graphics programs also.\nDerived from tuple, so a vector is a tuple!\n\nProvides (for a, b vectors, k number):\n a+b vector addition\n a-b vector subtraction\n a*b inner product\n k*a and a*k multiplication with scalar\n |a| absolute value of a\n a.rotate(angle) rotation'), _('turtle.addshape(name, shape=None) \nAdds a turtle shape to TurtleScreen\'s shapelist.\n\nArguments:\n(1) name is the name of a gif-file and shape is None.\n Installs the corresponding image shape.\n !! Image-shapes DO NOT rotate when turning the turtle,\n !! so they do not display the heading of the turtle!\n(2) name is an arbitrary string and shape is a tuple\n of pairs of coordinates. Installs the corresponding\n polygon shape\n(3) name is an arbitrary string and shape is a\n (compound) Shape object. Installs the corresponding\n compound shape.\nTo use a shape, you have to issue the command shape(shapename).\n\ncall: register_shape("turtle.gif")\n--or: register_shape("tri", ((0,0), (10,10), (-10,10)))\n\nExample:\n>>> register_shape("triangle", ((5,-3),(0,5),(-5,-3)))'), _("turtle.back(distance) \nMove the turtle backward by distance.\n\nAliases: back | backward | bk\n\nArgument:\ndistance -- a number\n\nMove the turtle backward by distance ,opposite to the direction the\nturtle is headed. Do not change the turtle's heading.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> backward(30)\n>>> position()\n(-30.00, 0.00)"), _("turtle.backward(distance) \nMove the turtle backward by distance.\n\nAliases: back | backward | bk\n\nArgument:\ndistance -- a number\n\nMove the turtle backward by distance ,opposite to the direction the\nturtle is headed. Do not change the turtle's heading.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> backward(30)\n>>> position()\n(-30.00, 0.00)"), _('turtle.begin_fill() \nCalled just before drawing a shape to be filled.\n\nNo argument.\n\nExample:\n>>> color("black", "red")\n>>> begin_fill()\n>>> circle(60)\n>>> end_fill()'), _('turtle.begin_poly() \nStart recording the vertices of a polygon.\n\nNo argument.\n\nStart recording the vertices of a polygon. Current turtle position\nis first point of polygon.\n\nExample:\n>>> begin_poly()'), _('turtle.bgcolor(*args) \nSet or return backgroundcolor of the TurtleScreen.\n\nArguments (if given): a color string or three numbers\nin the range 0..colormode or a 3-tuple of such numbers.\n\nExample:\n>>> bgcolor("orange")\n>>> bgcolor()\n\'orange\'\n>>> bgcolor(0.5,0,0.5)\n>>> bgcolor()\n\'#800080\''), _('turtle.bgpic(picname=None) \nSet background image or return name of current backgroundimage.\n\nOptional argument:\npicname -- a string, name of a gif-file or "nopic".\n\nIf picname is a filename, set the corresponding image as background.\nIf picname is "nopic", delete backgroundimage, if present.\nIf picname is None, return the filename of the current backgroundimage.\n\nExample:\n>>> bgpic()\n\'nopic\'\n>>> bgpic("landscape.gif")\n>>> bgpic()\n\'landscape.gif\''), _("turtle.bk(distance) \nMove the turtle backward by distance.\n\nAliases: back | backward | bk\n\nArgument:\ndistance -- a number\n\nMove the turtle backward by distance ,opposite to the direction the\nturtle is headed. Do not change the turtle's heading.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> backward(30)\n>>> position()\n(-30.00, 0.00)"), _('turtle.bye() \nShut the turtlegraphics window.\n\nExample:\n>>> bye()'), _('turtle.circle(radius, extent=None, steps=None) \nDraw a circle with given radius.\n\nArguments:\nradius -- a number\nextent (optional) -- a number\nsteps (optional) -- an integer\n\nDraw a circle with given radius. The center is radius units left\nof the turtle; extent - an angle - determines which part of the\ncircle is drawn. If extent is not given, draw the entire circle.\nIf extent is not a full circle, one endpoint of the arc is the\ncurrent pen position. Draw the arc in counterclockwise direction\nif radius is positive, otherwise in clockwise direction. Finally\nthe direction of the turtle is changed by the amount of extent.\n\nAs the circle is approximated by an inscribed regular polygon,\nsteps determines the number of steps to use. If not given,\nit will be calculated automatically. Maybe used to draw regular\npolygons.\n\ncall: circle(radius) # full circle\n--or: circle(radius, extent) # arc\n--or: circle(radius, extent, steps)\n--or: circle(radius, steps=6) # 6-sided polygon\n\nExample:\n>>> circle(50)\n>>> circle(120, 180) # semicircle'), _("turtle.clear() \nDelete the turtle's drawings from the screen. Do not move \n\nNo arguments.\n\nDelete the turtle's drawings from the screen. Do not move \nState and position of the turtle as well as drawings of other\nturtles are not affected.\n\nExamples:\n>>> clear()"), _('turtle.clearscreen() \nDelete all drawings and all turtles from the TurtleScreen.\n\nNo argument.\n\nReset empty TurtleScreen to its initial state: white background,\nno backgroundimage, no eventbindings and tracing on.\n\nExample:\n>>> clear()\n\nNote: this method is not available as function.'), _('turtle.clearstamp(stampid) \nDelete stamp with given stampid\n\nArgument:\nstampid - an integer, must be return value of previous stamp() call.\n\nExample:\n>>> color("blue")\n>>> astamp = stamp()\n>>> fd(50)\n>>> clearstamp(astamp)'), _("turtle.clearstamps(n=None) \nDelete all or first/last n of turtle's stamps.\n\nOptional argument:\nn -- an integer\n\nIf n is None, delete all of pen's stamps,\nelse if n > 0 delete first n stamps\nelse if n < 0 delete last n stamps.\n\nExample:\n>>> for i in range(8):\n... stamp(); fd(30)\n...\n>>> clearstamps(2)\n>>> clearstamps(-2)\n>>> clearstamps()"), _('turtle.clone() \nCreate and return a clone of the \n\nNo argument.\n\nCreate and return a clone of the turtle with same position, heading\nand turtle properties.\n\nExample (for a Turtle instance named mick):\nmick = Turtle()\njoe = mick.clone()'), _("turtle.color(*args) \nReturn or set the pencolor and fillcolor.\n\nArguments:\nSeveral input formats are allowed.\nThey use 0, 1, 2, or 3 arguments as follows:\n\ncolor()\n Return the current pencolor and the current fillcolor\n as a pair of color specification strings as are returned\n by pencolor and fillcolor.\ncolor(colorstring), color((r,g,b)), color(r,g,b)\n inputs as in pencolor, set both, fillcolor and pencolor,\n to the given value.\ncolor(colorstring1, colorstring2),\ncolor((r1,g1,b1), (r2,g2,b2))\n equivalent to pencolor(colorstring1) and fillcolor(colorstring2)\n and analogously, if the other input format is used.\n\nIf turtleshape is a polygon, outline and interior of that polygon\nis drawn with the newly set colors.\nFor mor info see: pencolor, fillcolor\n\nExample:\n>>> color('red', 'green')\n>>> color()\n('red', 'green')\n>>> colormode(255)\n>>> color((40, 80, 120), (160, 200, 240))\n>>> color()\n('#285078', '#a0c8f0')"), _('turtle.colormode(cmode=None) \nReturn the colormode or set it to 1.0 or 255.\n\nOptional argument:\ncmode -- one of the values 1.0 or 255\n\nr, g, b values of colortriples have to be in range 0..cmode.\n\nExample:\n>>> colormode()\n1.0\n>>> colormode(255)\n>>> pencolor(240,160,80)'), _('turtle.config_dict(filename) \nConvert content of config-file into dictionary.'), _("turtle.deepcopy(x, memo=None, _nil=[]) \nDeep copy operation on arbitrary Python objects.\n\nSee the module's __doc__ string for more info."), _("turtle.degrees(fullcircle=360.0) \nSet angle measurement units to degrees.\n\nOptional argument:\nfullcircle - a number\n\nSet angle measurement units, i. e. set number\nof 'degrees' for a full circle. Dafault value is\n360 degrees.\n\nExample:\n>>> left(90)\n>>> heading()\n90\n\nChange angle measurement unit to grad (also known as gon,\ngrade, or gradian and equals 1/100-th of the right angle.)\n>>> degrees(400.0)\n>>> heading()\n100"), _('turtle.delay(delay=None) \nReturn or set the drawing delay in milliseconds.\n\nOptional argument:\ndelay -- positive integer\n\nExample:\n>>> delay(15)\n>>> delay()\n15'), _('turtle.distance(x, y=None) \nReturn the distance from the turtle to (x,y) in turtle step units.\n\nArguments:\nx -- a number or a pair/vector of numbers or a turtle instance\ny -- a number None None\n\ncall: distance(x, y) # two coordinates\n--or: distance((x, y)) # a pair (tuple) of coordinates\n--or: distance(vec) # e.g. as returned by pos()\n--or: distance(mypen) # where mypen is another turtle\n\nExample:\n>>> pos()\n(0.00, 0.00)\n>>> distance(30,40)\n50.0\n>>> pen = Turtle()\n>>> pen.forward(77)\n>>> distance(pen)\n77.0'), _('turtle.dot(size=None, *color) \nDraw a dot with diameter size, using color.\n\nOptional arguments:\nsize -- an integer >= 1 (if given)\ncolor -- a colorstring or a numeric color tuple\n\nDraw a circular dot with diameter size, using color.\nIf size is not given, the maximum of pensize+4 and 2*pensize is used.\n\nExample:\n>>> dot()\n>>> fd(50); dot(20, "blue"); fd(50)'), _('turtle.down() \nPull the pen down -- drawing when moving.\n\nAliases: pendown | pd | down\n\nNo argument.\n\nExample:\n>>> pendown()'), _('turtle.end_fill() \nFill the shape drawn after the call begin_fill().\n\nNo argument.\n\nExample:\n>>> color("black", "red")\n>>> begin_fill()\n>>> circle(60)\n>>> end_fill()'), _('turtle.end_poly() \nStop recording the vertices of a polygon.\n\nNo argument.\n\nStop recording the vertices of a polygon. Current turtle position is\nlast point of polygon. This will be connected with the first point.\n\nExample:\n>>> end_poly()'), _('turtle.exitonclick() \nGo into mainloop until the mouse is clicked.\n\nNo arguments.\n\nBind bye() method to mouseclick on TurtleScreen.\nIf "using_IDLE" - value in configuration dictionary is False\n(default value), enter mainloop.\nIf IDLE with -n switch (no subprocess) is used, this value should be\nset to True in turtle.cfg. In this case IDLE\'s mainloop\nis active also for the client script.\n\nThis is a method of the Screen-class and not available for\nTurtleScreen instances.\n\nExample:\n>>> exitonclick()'), _('turtle.fd(distance) \nMove the turtle forward by the specified distance.\n\nAliases: forward | fd\n\nArgument:\ndistance -- a number (integer or float)\n\nMove the turtle forward by the specified distance, in the direction\nthe turtle is headed.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> forward(25)\n>>> position()\n(25.00,0.00)\n>>> forward(-75)\n>>> position()\n(-50.00,0.00)'), _('turtle.fillcolor(*args) \nReturn or set the fillcolor.\n\nArguments:\nFour input formats are allowed:\n - fillcolor()\n Return the current fillcolor as color specification string,\n possibly in hex-number format (see example).\n May be used as input to another color/pencolor/fillcolor call.\n - fillcolor(colorstring)\n s is a Tk color specification string, such as "red" or "yellow"\n - fillcolor((r, g, b))\n *a tuple* of r, g, and b, which represent, an RGB color,\n and each of r, g, and b are in the range 0..colormode,\n where colormode is either 1.0 or 255\n - fillcolor(r, g, b)\n r, g, and b represent an RGB color, and each of r, g, and b\n are in the range 0..colormode\n\nIf turtleshape is a polygon, the interior of that polygon is drawn\nwith the newly set fillcolor.\n\nExample:\n>>> fillcolor(\'violet\')\n>>> col = pencolor()\n>>> fillcolor(col)\n>>> fillcolor(0, .5, 0)'), _('turtle.filling() \nReturn fillstate (True if filling, False else).\n\nNo argument.\n\nExample:\n>>> begin_fill()\n>>> if filling():\n... pensize(5)\n... else:\n... pensize(3)'), _('turtle.forward(distance) \nMove the turtle forward by the specified distance.\n\nAliases: forward | fd\n\nArgument:\ndistance -- a number (integer or float)\n\nMove the turtle forward by the specified distance, in the direction\nthe turtle is headed.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> forward(25)\n>>> position()\n(25.00,0.00)\n>>> forward(-75)\n>>> position()\n(-50.00,0.00)'), _('turtle.get_poly() \nReturn the lastly recorded polygon.\n\nNo argument.\n\nExample:\n>>> p = get_poly()\n>>> register_shape("myFavouriteShape", p)'), _('turtle.get_shapepoly() \nReturn the current shape polygon as tuple of coordinate pairs.\n\nNo argument.\n\nExamples:\n>>> shape("square")\n>>> shapetransform(4, -1, 0, 2)\n>>> get_shapepoly()\n((50, -20), (30, 20), (-50, 20), (-30, -20))'), _('turtle.getcanvas() \nReturn the Canvas of this TurtleScreen.\n\nNo argument.\n\nExample:\n>>> cv = getcanvas()\n>>> cv\n'), _('turtle.getmethparlist(ob) \nGet strings describing the arguments for the given object\n\nReturns a pair of strings representing function parameter lists\nincluding parenthesis. The first string is suitable for use in\nfunction definition and the second is suitable for use in function\ncall. The "self" parameter is not included.'), _("turtle.getpen() \nReturn the Turtleobject itself.\n\nNo argument.\n\nOnly reasonable use: as a function to return the 'anonymous turtle':\n\nExample:\n>>> pet = getturtle()\n>>> pet.fd(50)\n>>> pet\n\n>>> turtles()\n[]"), _('turtle.getscreen() \nReturn the TurtleScreen object, the turtle is drawing on.\n\nNo argument.\n\nReturn the TurtleScreen object, the turtle is drawing on.\nSo TurtleScreen-methods can be called for that object.\n\nExample:\n>>> ts = getscreen()\n>>> ts\n\n>>> ts.bgcolor("pink")'), _("turtle.getshapes() \nReturn a list of names of all currently available turtle shapes.\n\nNo argument.\n\nExample:\n>>> getshapes()\n['arrow', 'blank', 'circle', ... , 'turtle']"), _("turtle.getturtle() \nReturn the Turtleobject itself.\n\nNo argument.\n\nOnly reasonable use: as a function to return the 'anonymous turtle':\n\nExample:\n>>> pet = getturtle()\n>>> pet.fd(50)\n>>> pet\n\n>>> turtles()\n[]"), _("turtle.goto(x, y=None) \nMove turtle to an absolute position.\n\nAliases: setpos | setposition | goto:\n\nArguments:\nx -- a number or a pair/vector of numbers\ny -- a number None\n\ncall: goto(x, y) # two coordinates\n--or: goto((x, y)) # a pair (tuple) of coordinates\n--or: goto(vec) # e.g. as returned by pos()\n\nMove turtle to an absolute position. If the pen is down,\na line will be drawn. The turtle's orientation does not change.\n\nExample:\n>>> tp = pos()\n>>> tp\n(0.00, 0.00)\n>>> setpos(60,30)\n>>> pos()\n(60.00,30.00)\n>>> setpos((20,80))\n>>> pos()\n(20.00,80.00)\n>>> setpos(tp)\n>>> pos()\n(0.00,0.00)"), _("turtle.heading() \nReturn the turtle's current heading.\n\nNo arguments.\n\nExample:\n>>> left(67)\n>>> heading()\n67.0"), _("turtle.hideturtle() \nMakes the turtle invisible.\n\nAliases: hideturtle | ht\n\nNo argument.\n\nIt's a good idea to do this while you're in the\nmiddle of a complicated drawing, because hiding\nthe turtle speeds up the drawing observably.\n\nExample:\n>>> hideturtle()"), _('turtle.home() \nMove turtle to the origin - coordinates (0,0).\n\nNo arguments.\n\nMove turtle to the origin - coordinates (0,0) and set its\nheading to its start-orientation (which depends on mode).\n\nExample:\n>>> home()'), _("turtle.ht() \nMakes the turtle invisible.\n\nAliases: hideturtle | ht\n\nNo argument.\n\nIt's a good idea to do this while you're in the\nmiddle of a complicated drawing, because hiding\nthe turtle speeds up the drawing observably.\n\nExample:\n>>> hideturtle()"), _("turtle.inspect() \nGet useful information from live Python objects.\n\nThis module encapsulates the interface provided by the internal special\nattributes (co_*, im_*, tb_*, etc.) in a friendlier fashion.\nIt also provides some help for examining source code and class layout.\n\nHere are some of the useful functions provided by this module:\n\n ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),\n isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),\n isroutine() - check object types\n getmembers() - get members of an object that satisfy a given condition\n\n getfile(), getsourcefile(), getsource() - find an object's source code\n getdoc(), getcomments() - get documentation on an object\n getmodule() - determine the module that an object came from\n getclasstree() - arrange classes so as to represent their hierarchy\n\n getargvalues(), getcallargs() - get info about function arguments\n getfullargspec() - same, with support for Python 3 features\n formatargspec(), formatargvalues() - format an argument spec\n getouterframes(), getinnerframes() - get info about frames\n currentframe() - get the current stack frame\n stack(), trace() - get info about frames on the stack or in a traceback\n\n signature() - get a Signature object for the callable"), _("turtle.isdown() \nReturn True if pen is down, False if it's up.\n\nNo argument.\n\nExample:\n>>> penup()\n>>> isdown()\nFalse\n>>> pendown()\n>>> isdown()\nTrue"), _('turtle.isfile(path) \nTest whether a path is a regular file'), _("turtle.isvisible() \nReturn True if the Turtle is shown, False if it's hidden.\n\nNo argument.\n\nExample:\n>>> hideturtle()\n>>> print isvisible():\nFalse"), _("turtle.join(a, *p) \nJoin two or more pathname components, inserting '/' as needed.\nIf any component is an absolute path, all previous path components\nwill be discarded. An empty last part will result in a path that\nends with a separator."), _('turtle.left(angle) \nTurn turtle left by angle units.\n\nAliases: left | lt\n\nArgument:\nangle -- a number (integer or float)\n\nTurn turtle left by angle units. (Units are by default degrees,\nbut can be set via the degrees() and radians() functions.)\nAngle orientation depends on mode. (See this.)\n\nExample:\n>>> heading()\n22.0\n>>> left(45)\n>>> heading()\n67.0'), _('turtle.listen(xdummy=None, ydummy=None) \nSet focus on TurtleScreen (in order to collect key-events)\n\nNo arguments.\nDummy arguments are provided in order\nto be able to pass listen to the onclick method.\n\nExample:\n>>> listen()'), _('turtle.lt(angle) \nTurn turtle left by angle units.\n\nAliases: left | lt\n\nArgument:\nangle -- a number (integer or float)\n\nTurn turtle left by angle units. (Units are by default degrees,\nbut can be set via the degrees() and radians() functions.)\nAngle orientation depends on mode. (See this.)\n\nExample:\n>>> heading()\n22.0\n>>> left(45)\n>>> heading()\n67.0'), _("turtle.mainloop() \nStarts event loop - calling Tkinter's mainloop function.\n\nNo argument.\n\nMust be last statement in a turtle graphics program.\nMust NOT be used if a script is run from within IDLE in -n mode\n(No subprocess) - for interactive use of turtle graphics.\n\nExample:\n>>> mainloop()"), _("turtle.mainloop() \nStarts event loop - calling Tkinter's mainloop function.\n\nNo argument.\n\nMust be last statement in a turtle graphics program.\nMust NOT be used if a script is run from within IDLE in -n mode\n(No subprocess) - for interactive use of turtle graphics.\n\nExample:\n>>> mainloop()"), _('turtle.math() \nThis module is always available. It provides access to the\nmathematical functions defined by the C standard.'), _("turtle.mode(mode=None) \nSet turtle-mode ('standard', 'logo' or 'world') and perform reset.\n\nOptional argument:\nmode -- one of the strings 'standard', 'logo' or 'world'\n\nMode 'standard' is compatible with turtle.py.\nMode 'logo' is compatible with most Logo-Turtle-Graphics.\nMode 'world' uses userdefined 'worldcoordinates'. *Attention*: in\nthis mode angles appear distorted if x/y unit-ratio doesn't equal 1.\nIf mode is not given, return the current mode.\n\n Mode Initial turtle heading positive angles\n ------------|-------------------------|-------------------\n 'standard' to the right (east) counterclockwise\n 'logo' upward (north) clockwise\n\nExamples:\n>>> mode('logo') # resets turtle heading to north\n>>> mode()\n'logo'"), _('turtle.numinput(title, prompt, default=None, minval=None, maxval=None) \nPop up a dialog window for input of a number.\n\nArguments: title is the title of the dialog window,\nprompt is a text mostly describing what numerical information to input.\ndefault: default value\nminval: minimum value for imput\nmaxval: maximum value for input\n\nThe number input must be in the range minval .. maxval if these are\ngiven. If not, a hint is issued and the dialog remains open for\ncorrection. Return the number input.\nIf the dialog is canceled, return None.\n\nExample:\n>>> numinput("Poker", "Your stakes:", 1000, minval=10, maxval=10000)'), _('turtle.onclick(fun, btn=1, add=None) \nBind fun to mouse-click event on this turtle on canvas.\n\nArguments:\nfun -- a function with two arguments, to which will be assigned\n the coordinates of the clicked point on the canvas.\nnum -- number of the mouse-button defaults to 1 (left mouse button).\nadd -- True or False. If True, new binding will be added, otherwise\n it will replace a former binding.\n\nExample for the anonymous turtle, i. e. the procedural way:\n\n>>> def turn(x, y):\n... left(360)\n...\n>>> onclick(turn) # Now clicking into the turtle will turn it.\n>>> onclick(None) # event-binding will be removed'), _('turtle.ondrag(fun, btn=1, add=None) \nBind fun to mouse-move event on this turtle on canvas.\n\nArguments:\nfun -- a function with two arguments, to which will be assigned\n the coordinates of the clicked point on the canvas.\nnum -- number of the mouse-button defaults to 1 (left mouse button).\n\nEvery sequence of mouse-move-events on a turtle is preceded by a\nmouse-click event on that \n\nExample:\n>>> ondrag(goto)\n\nSubsequently clicking and dragging a Turtle will move it\nacross the screen thereby producing handdrawings (if pen is\ndown).'), _('turtle.onkey(fun, key) \nBind fun to key-release event of key.\n\nArguments:\nfun -- a function with no arguments\nkey -- a string: key (e.g. "a") or key-symbol (e.g. "space")\n\nIn order to be able to register key-events, TurtleScreen\nmust have focus. (See method listen.)\n\nExample:\n\n>>> def f():\n... fd(50)\n... lt(60)\n...\n>>> onkey(f, "Up")\n>>> listen()\n\nSubsequently the turtle can be moved by repeatedly pressing\nthe up-arrow key, consequently drawing a hexagon'), _('turtle.onkeypress(fun, key=None) \nBind fun to key-press event of key if key is given,\nor to any key-press-event if no key is given.\n\nArguments:\nfun -- a function with no arguments\nkey -- a string: key (e.g. "a") or key-symbol (e.g. "space")\n\nIn order to be able to register key-events, TurtleScreen\nmust have focus. (See method listen.)\n\nExample (for a TurtleScreen instance named screen\nand a Turtle instance named turtle):\n\n>>> def f():\n... fd(50)\n... lt(60)\n...\n>>> onkeypress(f, "Up")\n>>> listen()\n\nSubsequently the turtle can be moved by repeatedly pressing\nthe up-arrow key, or by keeping pressed the up-arrow key.\nconsequently drawing a hexagon.'), _('turtle.onkeyrelease(fun, key) \nBind fun to key-release event of key.\n\nArguments:\nfun -- a function with no arguments\nkey -- a string: key (e.g. "a") or key-symbol (e.g. "space")\n\nIn order to be able to register key-events, TurtleScreen\nmust have focus. (See method listen.)\n\nExample:\n\n>>> def f():\n... fd(50)\n... lt(60)\n...\n>>> onkey(f, "Up")\n>>> listen()\n\nSubsequently the turtle can be moved by repeatedly pressing\nthe up-arrow key, consequently drawing a hexagon'), _('turtle.onrelease(fun, btn=1, add=None) \nBind fun to mouse-button-release event on this turtle on canvas.\n\nArguments:\nfun -- a function with two arguments, to which will be assigned\n the coordinates of the clicked point on the canvas.\nnum -- number of the mouse-button defaults to 1 (left mouse button).\n\nExample (for a MyTurtle instance named joe):\n>>> class MyTurtle(Turtle):\n... def glow(self,x,y):\n... self.fillcolor("red")\n... def unglow(self,x,y):\n... self.fillcolor("")\n...\n>>> joe = MyTurtle()\n>>> joe.onclick(joe.glow)\n>>> joe.onrelease(joe.unglow)\n\nClicking on joe turns fillcolor red, unclicking turns it to\ntransparent.'), _('turtle.onscreenclick(fun, btn=1, add=None) \nBind fun to mouse-click event on canvas.\n\nArguments:\nfun -- a function with two arguments, the coordinates of the\n clicked point on the canvas.\nnum -- the number of the mouse-button, defaults to 1\n\nExample (for a TurtleScreen instance named screen)\n\n>>> onclick(goto)\n>>> # Subsequently clicking into the TurtleScreen will\n>>> # make the turtle move to the clicked point.\n>>> onclick(None)'), _('turtle.ontimer(fun, t=0) \nInstall a timer, which calls fun after t milliseconds.\n\nArguments:\nfun -- a function with no arguments.\nt -- a number >= 0\n\nExample:\n\n>>> running = True\n>>> def f():\n... if running:\n... fd(50)\n... lt(60)\n... ontimer(f, 250)\n...\n>>> f() # makes the turtle marching around\n>>> running = False'), _('turtle.pd() \nPull the pen down -- drawing when moving.\n\nAliases: pendown | pd | down\n\nNo argument.\n\nExample:\n>>> pendown()'), _('turtle.pen(pen=None, **pendict) \nReturn or set the pen\'s attributes.\n\nArguments:\n pen -- a dictionary with some or all of the below listed keys.\n **pendict -- one or more keyword-arguments with the below\n listed keys as keywords.\n\nReturn or set the pen\'s attributes in a \'pen-dictionary\'\nwith the following key/value pairs:\n "shown" : True/False\n "pendown" : True/False\n "pencolor" : color-string or color-tuple\n "fillcolor" : color-string or color-tuple\n "pensize" : positive number\n "speed" : number in range 0..10\n "resizemode" : "auto" or "user" or "noresize"\n "stretchfactor": (positive number, positive number)\n "shearfactor": number\n "outline" : positive number\n "tilt" : number\n\nThis dictionary can be used as argument for a subsequent\npen()-call to restore the former pen-state. Moreover one\nor more of these attributes can be provided as keyword-arguments.\nThis can be used to set several pen attributes in one statement.\n\n\nExamples:\n>>> pen(fillcolor="black", pencolor="red", pensize=10)\n>>> pen()\n{\'pensize\': 10, \'shown\': True, \'resizemode\': \'auto\', \'outline\': 1,\n\'pencolor\': \'red\', \'pendown\': True, \'fillcolor\': \'black\',\n\'stretchfactor\': (1,1), \'speed\': 3, \'shearfactor\': 0.0}\n>>> penstate=pen()\n>>> color("yellow","")\n>>> penup()\n>>> pen()\n{\'pensize\': 10, \'shown\': True, \'resizemode\': \'auto\', \'outline\': 1,\n\'pencolor\': \'yellow\', \'pendown\': False, \'fillcolor\': \'\',\n\'stretchfactor\': (1,1), \'speed\': 3, \'shearfactor\': 0.0}\n>>> p.pen(penstate, fillcolor="green")\n>>> p.pen()\n{\'pensize\': 10, \'shown\': True, \'resizemode\': \'auto\', \'outline\': 1,\n\'pencolor\': \'red\', \'pendown\': True, \'fillcolor\': \'green\',\n\'stretchfactor\': (1,1), \'speed\': 3, \'shearfactor\': 0.0}'), _('turtle.pencolor(*args) \nReturn or set the pencolor.\n\nArguments:\nFour input formats are allowed:\n - pencolor()\n Return the current pencolor as color specification string,\n possibly in hex-number format (see example).\n May be used as input to another color/pencolor/fillcolor call.\n - pencolor(colorstring)\n s is a Tk color specification string, such as "red" or "yellow"\n - pencolor((r, g, b))\n *a tuple* of r, g, and b, which represent, an RGB color,\n and each of r, g, and b are in the range 0..colormode,\n where colormode is either 1.0 or 255\n - pencolor(r, g, b)\n r, g, and b represent an RGB color, and each of r, g, and b\n are in the range 0..colormode\n\nIf turtleshape is a polygon, the outline of that polygon is drawn\nwith the newly set pencolor.\n\nExample:\n>>> pencolor(\'brown\')\n>>> tup = (0.2, 0.8, 0.55)\n>>> pencolor(tup)\n>>> pencolor()\n\'#33cc8c\''), _('turtle.pendown() \nPull the pen down -- drawing when moving.\n\nAliases: pendown | pd | down\n\nNo argument.\n\nExample:\n>>> pendown()'), _('turtle.pensize(width=None) \nSet or return the line thickness.\n\nAliases: pensize | width\n\nArgument:\nwidth -- positive number\n\nSet the line thickness to width or return it. If resizemode is set\nto "auto" and turtleshape is a polygon, that polygon is drawn with\nthe same line thickness. If no argument is given, current pensize\nis returned.\n\nExample:\n>>> pensize()\n1\n>>> pensize(10) # from here on lines of width 10 are drawn'), _('turtle.penup() \nPull the pen up -- no drawing when moving.\n\nAliases: penup | pu | up\n\nNo argument\n\nExample:\n>>> penup()'), _("turtle.pos() \nReturn the turtle's current location (x,y), as a Vec2D-vector.\n\nAliases: pos | position\n\nNo arguments.\n\nExample:\n>>> pos()\n(0.00, 240.00)"), _("turtle.position() \nReturn the turtle's current location (x,y), as a Vec2D-vector.\n\nAliases: pos | position\n\nNo arguments.\n\nExample:\n>>> pos()\n(0.00, 240.00)"), _('turtle.pu() \nPull the pen up -- no drawing when moving.\n\nAliases: penup | pu | up\n\nNo argument\n\nExample:\n>>> penup()'), _('turtle.radians() \nSet the angle measurement units to radians.\n\nNo arguments.\n\nExample:\n>>> heading()\n90\n>>> radians()\n>>> heading()\n1.5707963267948966'), _('turtle.read_docstrings(lang) \nRead in docstrings from lang-specific docstring dictionary.\n\nTransfer docstrings, translated to lang, from a dictionary-file\nto the methods of classes Screen and Turtle and - in revised form -\nto the corresponding functions.'), _("turtle.readconfig(cfgdict) \nRead config-files, change configuration-dict accordingly.\n\nIf there is a turtle.cfg file in the current working directory,\nread it from there. If this contains an importconfig-value,\nsay 'myway', construct filename turtle_mayway.cfg else use\nturtle.cfg and read it from the import-directory, where\nturtle.py is located.\nUpdate configuration dictionary first according to config-file,\nin the import directory, then according to config-file in the\ncurrent working directory.\nIf no config-file is found, the default configuration is used."), _('turtle.register_shape(name, shape=None) \nAdds a turtle shape to TurtleScreen\'s shapelist.\n\nArguments:\n(1) name is the name of a gif-file and shape is None.\n Installs the corresponding image shape.\n !! Image-shapes DO NOT rotate when turning the turtle,\n !! so they do not display the heading of the turtle!\n(2) name is an arbitrary string and shape is a tuple\n of pairs of coordinates. Installs the corresponding\n polygon shape\n(3) name is an arbitrary string and shape is a\n (compound) Shape object. Installs the corresponding\n compound shape.\nTo use a shape, you have to issue the command shape(shapename).\n\ncall: register_shape("turtle.gif")\n--or: register_shape("tri", ((0,0), (10,10), (-10,10)))\n\nExample:\n>>> register_shape("triangle", ((5,-3),(0,5),(-5,-3)))'), _("turtle.reset() \nDelete the turtle's drawings and restore its default values.\n\nNo argument.\n\nDelete the turtle's drawings from the screen, re-center the turtle\nand set variables to the default values.\n\nExample:\n>>> position()\n(0.00,-22.00)\n>>> heading()\n100.0\n>>> reset()\n>>> position()\n(0.00,0.00)\n>>> heading()\n0.0"), _('turtle.resetscreen() \nReset all Turtles on the Screen to their initial state.\n\nNo argument.\n\nExample:\n>>> reset()'), _('turtle.resizemode(rmode=None) \nSet resizemode to one of the values: "auto", "user", "noresize".\n\n(Optional) Argument:\nrmode -- one of the strings "auto", "user", "noresize"\n\nDifferent resizemodes have the following effects:\n - "auto" adapts the appearance of the turtle\n corresponding to the value of pensize.\n - "user" adapts the appearance of the turtle according to the\n values of stretchfactor and outlinewidth (outline),\n which are set by shapesize()\n - "noresize" no adaption of the turtle\'s appearance takes place.\nIf no argument is given, return current resizemode.\nresizemode("user") is called by a call of shapesize with arguments.\n\n\nExamples:\n>>> resizemode("noresize")\n>>> resizemode()\n\'noresize\''), _('turtle.right(angle) \nTurn turtle right by angle units.\n\nAliases: right | rt\n\nArgument:\nangle -- a number (integer or float)\n\nTurn turtle right by angle units. (Units are by default degrees,\nbut can be set via the degrees() and radians() functions.)\nAngle orientation depends on mode. (See this.)\n\nExample:\n>>> heading()\n22.0\n>>> right(45)\n>>> heading()\n337.0'), _('turtle.rt(angle) \nTurn turtle right by angle units.\n\nAliases: right | rt\n\nArgument:\nangle -- a number (integer or float)\n\nTurn turtle right by angle units. (Units are by default degrees,\nbut can be set via the degrees() and radians() functions.)\nAngle orientation depends on mode. (See this.)\n\nExample:\n>>> heading()\n22.0\n>>> right(45)\n>>> heading()\n337.0'), _('turtle.screensize(canvwidth=None, canvheight=None, bg=None) \nResize the canvas the turtles are drawing on.\n\nOptional arguments:\ncanvwidth -- positive integer, new width of canvas in pixels\ncanvheight -- positive integer, new height of canvas in pixels\nbg -- colorstring or color-tuple, new backgroundcolor\nIf no arguments are given, return current (canvaswidth, canvasheight)\n\nDo not alter the drawing window. To observe hidden parts of\nthe canvas use the scrollbars. (Can make visible those parts\nof a drawing, which were outside the canvas before!)\n\nExample (for a Turtle instance named turtle):\n>>> turtle.screensize(2000,1500)\n>>> # e.g. to search for an erroneously escaped turtle ;-)'), _('turtle.seth(to_angle) \nSet the orientation of the turtle to to_angle.\n\nAliases: setheading | seth\n\nArgument:\nto_angle -- a number (integer or float)\n\nSet the orientation of the turtle to to_angle.\nHere are some common directions in degrees:\n\n standard - mode: logo-mode:\n-------------------|--------------------\n 0 - east 0 - north\n 90 - north 90 - east\n 180 - west 180 - south\n 270 - south 270 - west\n\nExample:\n>>> setheading(90)\n>>> heading()\n90'), _('turtle.setheading(to_angle) \nSet the orientation of the turtle to to_angle.\n\nAliases: setheading | seth\n\nArgument:\nto_angle -- a number (integer or float)\n\nSet the orientation of the turtle to to_angle.\nHere are some common directions in degrees:\n\n standard - mode: logo-mode:\n-------------------|--------------------\n 0 - east 0 - north\n 90 - north 90 - east\n 180 - west 180 - south\n 270 - south 270 - west\n\nExample:\n>>> setheading(90)\n>>> heading()\n90'), _("turtle.setpos(x, y=None) \nMove turtle to an absolute position.\n\nAliases: setpos | setposition | goto:\n\nArguments:\nx -- a number or a pair/vector of numbers\ny -- a number None\n\ncall: goto(x, y) # two coordinates\n--or: goto((x, y)) # a pair (tuple) of coordinates\n--or: goto(vec) # e.g. as returned by pos()\n\nMove turtle to an absolute position. If the pen is down,\na line will be drawn. The turtle's orientation does not change.\n\nExample:\n>>> tp = pos()\n>>> tp\n(0.00, 0.00)\n>>> setpos(60,30)\n>>> pos()\n(60.00,30.00)\n>>> setpos((20,80))\n>>> pos()\n(20.00,80.00)\n>>> setpos(tp)\n>>> pos()\n(0.00,0.00)"), _("turtle.setposition(x, y=None) \nMove turtle to an absolute position.\n\nAliases: setpos | setposition | goto:\n\nArguments:\nx -- a number or a pair/vector of numbers\ny -- a number None\n\ncall: goto(x, y) # two coordinates\n--or: goto((x, y)) # a pair (tuple) of coordinates\n--or: goto(vec) # e.g. as returned by pos()\n\nMove turtle to an absolute position. If the pen is down,\na line will be drawn. The turtle's orientation does not change.\n\nExample:\n>>> tp = pos()\n>>> tp\n(0.00, 0.00)\n>>> setpos(60,30)\n>>> pos()\n(60.00,30.00)\n>>> setpos((20,80))\n>>> pos()\n(20.00,80.00)\n>>> setpos(tp)\n>>> pos()\n(0.00,0.00)"), _('turtle.settiltangle(angle) \nRotate the turtleshape to point in the specified direction\n\nArgument: angle -- number\n\nRotate the turtleshape to point in the direction specified by angle,\nregardless of its current tilt-angle. DO NOT change the turtle\'s\nheading (direction of movement).\n\n\nExamples:\n>>> shape("circle")\n>>> shapesize(5,2)\n>>> settiltangle(45)\n>>> stamp()\n>>> fd(50)\n>>> settiltangle(-45)\n>>> stamp()\n>>> fd(50)'), _('turtle.setundobuffer(size) \nSet or disable undobuffer.\n\nArgument:\nsize -- an integer or None\n\nIf size is an integer an empty undobuffer of given size is installed.\nSize gives the maximum number of turtle-actions that can be undone\nby the undo() function.\nIf size is None, no undobuffer is present.\n\nExample:\n>>> setundobuffer(42)'), _('turtle.setup(width=0.5, height=0.75, startx=None, starty=None) \nSet the size and position of the main window.\n\nArguments:\nwidth: as integer a size in pixels, as float a fraction of the \n Default is 50% of \nheight: as integer the height in pixels, as float a fraction of the\n Default is 75% of \nstartx: if positive, starting position in pixels from the left\n edge of the screen, if negative from the right edge\n Default, startx=None is to center window horizontally.\nstarty: if positive, starting position in pixels from the top\n edge of the screen, if negative from the bottom edge\n Default, starty=None is to center window vertically.\n\nExamples:\n>>> setup (width=200, height=200, startx=0, starty=0)\n\nsets window to 200x200 pixels, in upper left of screen\n\n>>> setup(width=.75, height=0.5, startx=None, starty=None)\n\nsets window to 75% of screen by 50% of screen and centers'), _("turtle.setworldcoordinates(llx, lly, urx, ury) \nSet up a user defined coordinate-system.\n\nArguments:\nllx -- a number, x-coordinate of lower left corner of canvas\nlly -- a number, y-coordinate of lower left corner of canvas\nurx -- a number, x-coordinate of upper right corner of canvas\nury -- a number, y-coordinate of upper right corner of canvas\n\nSet up user coodinat-system and switch to mode 'world' if necessary.\nThis performs a reset. If mode 'world' is already active,\nall drawings are redrawn according to the new coordinates.\n\nBut ATTENTION: in user-defined coordinatesystems angles may appear\ndistorted. (see Screen.mode())\n\nExample:\n>>> setworldcoordinates(-10,-0.5,50,1.5)\n>>> for _ in range(36):\n... left(10)\n... forward(0.5)"), _("turtle.setx(x) \nSet the turtle's first coordinate to x\n\nArgument:\nx -- a number (integer or float)\n\nSet the turtle's first coordinate to x, leave second coordinate\nunchanged.\n\nExample:\n>>> position()\n(0.00, 240.00)\n>>> setx(10)\n>>> position()\n(10.00, 240.00)"), _("turtle.sety(y) \nSet the turtle's second coordinate to y\n\nArgument:\ny -- a number (integer or float)\n\nSet the turtle's first coordinate to x, second coordinate remains\nunchanged.\n\nExample:\n>>> position()\n(0.00, 40.00)\n>>> sety(-10)\n>>> position()\n(0.00, -10.00)"), _('turtle.shape(name=None) \nSet turtle shape to shape with given name / return current shapename.\n\nOptional argument:\nname -- a string, which is a valid shapename\n\nSet turtle shape to shape with given name or, if name is not given,\nreturn name of current shape.\nShape with name must exist in the TurtleScreen\'s shape dictionary.\nInitially there are the following polygon shapes:\n\'arrow\', \'turtle\', \'circle\', \'square\', \'triangle\', \'classic\'.\nTo learn about how to deal with shapes see Screen-method register_shape.\n\nExample:\n>>> shape()\n\'arrow\'\n>>> shape("turtle")\n>>> shape()\n\'turtle\''), _('turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None) \nSet/return turtle\'s stretchfactors/outline. Set resizemode to "user".\n\nOptional arguments:\n stretch_wid : positive number\n stretch_len : positive number\n outline : positive number\n\nReturn or set the pen\'s attributes x/y-stretchfactors and/or outline.\nSet resizemode to "user".\nIf and only if resizemode is set to "user", the turtle will be displayed\nstretched according to its stretchfactors:\nstretch_wid is stretchfactor perpendicular to orientation\nstretch_len is stretchfactor in direction of turtles orientation.\noutline determines the width of the shapes\'s outline.\n\nExamples:\n>>> resizemode("user")\n>>> shapesize(5, 5, 12)\n>>> shapesize(outline=8)'), _('turtle.shapetransform(t11=None, t12=None, t21=None, t22=None) \nSet or return the current transformation matrix of the turtle shape.\n\nOptional arguments: t11, t12, t21, t22 -- numbers.\n\nIf none of the matrix elements are given, return the transformation\nmatrix.\nOtherwise set the given elements and transform the turtleshape\naccording to the matrix consisting of first row t11, t12 and\nsecond row t21, 22.\nModify stretchfactor, shearfactor and tiltangle according to the\ngiven matrix.\n\nExamples:\n>>> shape("square")\n>>> shapesize(4,2)\n>>> shearfactor(-0.5)\n>>> shapetransform()\n(4.0, -1.0, -0.0, 2.0)'), _('turtle.shearfactor(shear=None) \nSet or return the current shearfactor.\n\nOptional argument: shear -- number, tangent of the shear angle\n\nShear the turtleshape according to the given shearfactor shear,\nwhich is the tangent of the shear angle. DO NOT change the\nturtle\'s heading (direction of movement).\nIf shear is not given: return the current shearfactor, i. e. the\ntangent of the shear angle, by which lines parallel to the\nheading of the turtle are sheared.\n\nExamples:\n>>> shape("circle")\n>>> shapesize(5,2)\n>>> shearfactor(0.5)\n>>> shearfactor()\n>>> 0.5'), _('turtle.showturtle() \nMakes the turtle visible.\n\nAliases: showturtle | st\n\nNo argument.\n\nExample:\n>>> hideturtle()\n>>> showturtle()'), _("turtle.speed(speed=None) \nReturn or set the turtle's speed.\n\nOptional argument:\nspeed -- an integer in the range 0..10 or a speedstring (see below)\n\nSet the turtle's speed to an integer value in the range 0 .. 10.\nIf no argument is given: return current speed.\n\nIf input is a number greater than 10 or smaller than 0.5,\nspeed is set to 0.\nSpeedstrings are mapped to speedvalues in the following way:\n 'fastest' : 0\n 'fast' : 10\n 'normal' : 6\n 'slow' : 3\n 'slowest' : 1\nspeeds from 1 to 10 enforce increasingly faster animation of\nline drawing and turtle turning.\n\nAttention:\nspeed = 0 : *no* animation takes place. forward/back makes turtle jump\nand likewise left/right make the turtle turn instantly.\n\nExample:\n>>> speed(3)"), _('turtle.split(p) \nSplit a pathname. Returns tuple "(head, tail)" where "tail" is\neverything after the final slash. Either part may be empty.'), _('turtle.st() \nMakes the turtle visible.\n\nAliases: showturtle | st\n\nNo argument.\n\nExample:\n>>> hideturtle()\n>>> showturtle()'), _('turtle.stamp() \nStamp a copy of the turtleshape onto the canvas and return its id.\n\nNo argument.\n\nStamp a copy of the turtle shape onto the canvas at the current\nturtle position. Return a stamp_id for that stamp, which can be\nused to delete it by calling clearstamp(stamp_id).\n\nExample:\n>>> color("blue")\n>>> stamp()\n13\n>>> fd(50)'), _("turtle.sys() \nThis module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function"), _('turtle.textinput(title, prompt) \nPop up a dialog window for input of a string.\n\nArguments: title is the title of the dialog window,\nprompt is a text mostly describing what information to input.\n\nReturn the string input\nIf the dialog is canceled, return None.\n\nExample:\n>>> textinput("NIM", "Name of first player:")'), _('turtle.tilt(angle) \nRotate the turtleshape by angle.\n\nArgument:\nangle - a number\n\nRotate the turtleshape by angle from its current tilt-angle,\nbut do NOT change the turtle\'s heading (direction of movement).\n\nExamples:\n>>> shape("circle")\n>>> shapesize(5,2)\n>>> tilt(30)\n>>> fd(50)\n>>> tilt(30)\n>>> fd(50)'), _('turtle.tiltangle(angle=None) \nSet or return the current tilt-angle.\n\nOptional argument: angle -- number\n\nRotate the turtleshape to point in the direction specified by angle,\nregardless of its current tilt-angle. DO NOT change the turtle\'s\nheading (direction of movement).\nIf angle is not given: return the current tilt-angle, i. e. the angle\nbetween the orientation of the turtleshape and the heading of the\nturtle (its direction of movement).\n\nDeprecated since Python 3.1\n\nExamples:\n>>> shape("circle")\n>>> shapesize(5,2)\n>>> tilt(45)\n>>> tiltangle()'), _('turtle.time() \nThis module provides various functions to manipulate time values.\n\nThere are two standard representations of time. One is the number\nof seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\nor a floating point number (to represent fractions of seconds).\nThe Epoch is system-defined; on Unix, it is generally January 1st, 1970.\nThe actual value can be retrieved by calling gmtime(0).\n\nThe other representation is a tuple of 9 integers giving local time.\nThe tuple items are:\n year (including century, e.g. 1998)\n month (1-12)\n day (1-31)\n hours (0-23)\n minutes (0-59)\n seconds (0-59)\n weekday (0-6, Monday is 0)\n Julian day (day in the year, 1-366)\n DST (Daylight Savings Time) flag (-1, 0 or 1)\nIf the DST flag is 0, the time is given in the regular time zone;\nif it is 1, the time is given in the DST time zone;\nif it is -1, mktime() should guess based on the date and time.\n\nVariables:\n\ntimezone -- difference in seconds between UTC and local standard time\naltzone -- difference in seconds between UTC and local DST time\ndaylight -- whether local time should reflect DST\ntzname -- tuple of (standard time zone name, DST time zone name)\n\nFunctions:\n\ntime() -- return current time in seconds since the Epoch as a float\nclock() -- return CPU time since process start as a float\nsleep() -- delay for a number of seconds given as a float\ngmtime() -- convert seconds since Epoch to UTC tuple\nlocaltime() -- convert seconds since Epoch to local time tuple\nasctime() -- convert time tuple to string\nctime() -- convert time in seconds to string\nmktime() -- convert local time tuple to seconds since Epoch\nstrftime() -- convert time tuple to string according to format specification\nstrptime() -- parse string to time tuple according to format specification\ntzset() -- change the local timezone'), _('turtle.title(titlestring) \nSet title of turtle-window\n\nArgument:\ntitlestring -- a string, to appear in the titlebar of the\n turtle graphics window.\n\nThis is a method of Screen-class. Not available for TurtleScreen-\nobjects.\n\nExample:\n>>> title("Welcome to the turtle-zoo!")'), _('turtle.tkinter() \nWrapper functions for Tcl/Tk.\n\nTkinter provides classes which allow the display, positioning and\ncontrol of widgets. Toplevel widgets are Tk and Toplevel. Other\nwidgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,\nCheckbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox\nLabelFrame and PanedWindow.\n\nProperties of the widgets are specified with keyword arguments.\nKeyword arguments have the same name as the corresponding resource\nunder Tk.\n\nWidgets are positioned with one of the geometry managers Place, Pack\nor Grid. These managers can be called with methods place, pack, grid\navailable in every Widget.\n\nActions are bound to events by resources (e.g. keyword argument\ncommand) or with the method bind.\n\nExample (Hello, World):\nimport tkinter\nfrom tkinter.constants import *\ntk = tkinter.Tk()\nframe = tkinter.Frame(tk, relief=RIDGE, borderwidth=2)\nframe.pack(fill=BOTH,expand=1)\nlabel = tkinter.Label(frame, text="Hello, World")\nlabel.pack(fill=X, expand=1)\nbutton = tkinter.Button(frame,text="Exit",command=tk.destroy)\nbutton.pack(side=BOTTOM)\ntk.mainloop()'), _('turtle.tkinter.simpledialog() \nThis modules handles dialog boxes.\n\nIt contains the following public symbols:\n\nSimpleDialog -- A simple but flexible modal dialog box\n\nDialog -- a base class for dialogs\n\naskinteger -- get an integer from the user\n\naskfloat -- get a float from the user\n\naskstring -- get a string from the user'), _('turtle.towards(x, y=None) \nReturn the angle of the line from the turtle\'s position to (x, y).\n\nArguments:\nx -- a number or a pair/vector of numbers or a turtle instance\ny -- a number None None\n\ncall: distance(x, y) # two coordinates\n--or: distance((x, y)) # a pair (tuple) of coordinates\n--or: distance(vec) # e.g. as returned by pos()\n--or: distance(mypen) # where mypen is another turtle\n\nReturn the angle, between the line from turtle-position to position\nspecified by x, y and the turtle\'s start orientation. (Depends on\nmodes - "standard" or "logo")\n\nExample:\n>>> pos()\n(10.00, 10.00)\n>>> towards(0,0)\n225.0'), _('turtle.tracer(n=None, delay=None) \nTurns turtle animation on/off and set delay for update drawings.\n\nOptional arguments:\nn -- nonnegative integer\ndelay -- nonnegative integer\n\nIf n is given, only each n-th regular screen update is really performed.\n(Can be used to accelerate the drawing of complex graphics.)\nSecond arguments sets delay value (see RawTurtle.delay())\n\nExample:\n>>> tracer(8, 25)\n>>> dist = 2\n>>> for i in range(200):\n... fd(dist)\n... rt(90)\n... dist += 2'), _('turtle.turtles() \nReturn the list of turtles on the \n\nExample:\n>>> turtles()\n[]'), _('turtle.turtlesize(stretch_wid=None, stretch_len=None, outline=None) \nSet/return turtle\'s stretchfactors/outline. Set resizemode to "user".\n\nOptional arguments:\n stretch_wid : positive number\n stretch_len : positive number\n outline : positive number\n\nReturn or set the pen\'s attributes x/y-stretchfactors and/or outline.\nSet resizemode to "user".\nIf and only if resizemode is set to "user", the turtle will be displayed\nstretched according to its stretchfactors:\nstretch_wid is stretchfactor perpendicular to orientation\nstretch_len is stretchfactor in direction of turtles orientation.\noutline determines the width of the shapes\'s outline.\n\nExamples:\n>>> resizemode("user")\n>>> shapesize(5, 5, 12)\n>>> shapesize(outline=8)'), _("turtle.types() \nDefine names for built-in types that aren't directly accessible as a builtin."), _('turtle.undo() \nundo (repeatedly) the last turtle action.\n\nNo argument.\n\nundo (repeatedly) the last turtle action.\nNumber of available undo actions is determined by the size of\nthe undobuffer.\n\nExample:\n>>> for i in range(4):\n... fd(50); lt(80)\n...\n>>> for i in range(8):\n... undo()\n...'), _('turtle.undobufferentries() \nReturn count of entries in the undobuffer.\n\nNo argument.\n\nExample:\n>>> while undobufferentries():\n... undo()'), _('turtle.up() \nPull the pen up -- no drawing when moving.\n\nAliases: penup | pu | up\n\nNo argument\n\nExample:\n>>> penup()'), _('turtle.update() \nPerform a TurtleScreen update.\n '), _('turtle.width(width=None) \nSet or return the line thickness.\n\nAliases: pensize | width\n\nArgument:\nwidth -- positive number\n\nSet the line thickness to width or return it. If resizemode is set\nto "auto" and turtleshape is a polygon, that polygon is drawn with\nthe same line thickness. If no argument is given, current pensize\nis returned.\n\nExample:\n>>> pensize()\n1\n>>> pensize(10) # from here on lines of width 10 are drawn'), _('turtle.window_height() \nReturn the height of the turtle window.\n\nExample:\n>>> window_height()\n480'), _('turtle.window_width() \nReturn the width of the turtle window.\n\nExample:\n>>> window_width()\n640'), _('turtle.write(arg, move=False, align=\'left\', font=\'Arial\', 8, \'normal\') \nWrite text at the current turtle position.\n\nArguments:\narg -- info, which is to be written to the TurtleScreen\nmove (optional) -- True/False\nalign (optional) -- one of the strings "left", "center" or right"\nfont (optional) -- a triple (fontname, fontsize, fonttype)\n\nWrite text - the string representation of arg - at the current\nturtle position according to align ("left", "center" or right")\nand with the given font.\nIf move is True, the pen is moved to the bottom-right corner\nof the text. By default, move is False.\n\nExample:\n>>> write(\'Home = \', True, align="center")\n>>> write((0,0), True)'), _("turtle.write_docstringdict(filename='turtle_docstringdict') \nCreate and write docstring-dictionary to file.\n\nOptional argument:\nfilename -- a string, used as filename\n default value is turtle_docstringdict\n\nHas to be called explicitly, (not used by the turtle-graphics classes)\nThe docstring dictionary will be written to the Python script .py\nIt is intended to serve as a template for translation of the docstrings\ninto different languages."), _("turtle.xcor() \nReturn the turtle's x coordinate.\n\nNo arguments.\n\nExample:\n>>> reset()\n>>> left(60)\n>>> forward(100)\n>>> print xcor()\n50.0"), _("turtle.ycor() \nReturn the turtle's y coordinate\n---\nNo arguments.\n\nExample:\n>>> reset()\n>>> left(60)\n>>> forward(100)\n>>> print ycor()\n86.6025403784"), _("uuid.UUID(hex=None, bytes=None, bytes_le=None, fields=None, int=None, version=None) \nInstances of the UUID class represent UUIDs as specified in RFC 4122.\nUUID objects are immutable, hashable, and usable as dictionary keys.\nConverting a UUID to a string with str() yields something in the form\n'12345678-1234-1234-1234-123456789abc'. The UUID constructor accepts\nfive possible forms: a similar string of hexadecimal digits, or a tuple\nof six integer fields (with 32-bit, 16-bit, 16-bit, 8-bit, 8-bit, and\n48-bit values respectively) as an argument named 'fields', or a string\nof 16 bytes (with all the integer fields in big-endian order) as an\nargument named 'bytes', or a string of 16 bytes (with the first three\nfields in little-endian order) as an argument named 'bytes_le', or a\nsingle 128-bit integer as an argument named 'int'.\n\nUUIDs have these read-only attributes:\n\n bytes the UUID as a 16-byte string (containing the six\n integer fields in big-endian byte order)\n\n bytes_le the UUID as a 16-byte string (with time_low, time_mid,\n and time_hi_version in little-endian byte order)\n\n fields a tuple of the six integer fields of the UUID,\n which are also available as six individual attributes\n and two derived attributes:\n\n time_low the first 32 bits of the UUID\n time_mid the next 16 bits of the UUID\n time_hi_version the next 16 bits of the UUID\n clock_seq_hi_variant the next 8 bits of the UUID\n clock_seq_low the next 8 bits of the UUID\n node the last 48 bits of the UUID\n\n time the 60-bit timestamp\n clock_seq the 14-bit sequence number\n\n hex the UUID as a 32-character hexadecimal string\n\n int the UUID as a 128-bit integer\n\n urn the UUID as a URN as specified in RFC 4122\n\n variant the UUID variant (one of the constants RESERVED_NCS,\n RFC_4122, RESERVED_MICROSOFT, or RESERVED_FUTURE)\n\n version the UUID version number (1 through 5, meaningful only\n when the variant is RFC_4122)"), _('uuid.bytes() \nbytes(iterable_of_ints) -> bytes\nbytes(string, encoding[, errors]) -> bytes\nbytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\nbytes(int) -> bytes object of size given by the parameter initialized with null bytes\nbytes() -> empty bytes object\n\nConstruct an immutable array of bytes from:\n - an iterable yielding integers in range(256)\n - a text string encoded using the specified encoding\n - any object implementing the buffer API.\n - an integer'), _('uuid.ctypes() \ncreate and manipulate C data types in Python'), _('uuid.getnode() \nGet the hardware address as a 48-bit positive integer.\n\nThe first time this runs, it may launch a separate program, which could\nbe quite slow. If all attempts to obtain the hardware address fail, we\nchoose a random 48-bit number with its eighth bit set to 1 as recommended\nin RFC 4122.'), _("uuid.int() \nint(x=0) -> integer\nint(x, base=10) -> integer\n\nConvert a number or string to an integer, or return 0 if no arguments\nare given. If x is a number, return x.__int__(). For floating point\nnumbers, this truncates towards zero.\n\nIf x is not a number or if base is given, then x must be a string,\nbytes, or bytearray instance representing an integer literal in the\ngiven base. The literal can be preceded by '+' or '-' and be surrounded\nby whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\nBase 0 means to interpret the base from the string as an integer literal.\n>>> int('0b100', base=0)\n4"), _("uuid.os() \nOS routines for NT or Posix depending on what system we're on.\n\nThis exports:\n - all functions from posix or nt, e.g. unlink, stat, etc.\n - os.path is either posixpath or ntpath\n - os.name is either 'posix' or 'nt'\n - os.curdir is a string representing the current directory (always '.')\n - os.pardir is a string representing the parent directory (always '..')\n - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n - os.extsep is the extension separator (always '.')\n - os.altsep is the alternate pathname separator (None or '/')\n - os.pathsep is the component separator used in $PATH etc\n - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r\\n')\n - os.defpath is the default search path for executables\n - os.devnull is the file path of the null device ('/dev/null', etc.)\n\nPrograms that import and use 'os' stand a better chance of being\nportable between different platforms. Of course, they must then\nonly use functions that are defined by all platforms (e.g., unlink\nand opendir), and leave all pathname manipulation to os.path\n(e.g., split and join)."), _("uuid.sys() \nThis module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function"), _("uuid.uuid1(node=None, clock_seq=None) \nGenerate a UUID from a host ID, sequence number, and the current time.\nIf 'node' is not given, getnode() is used to obtain the hardware\naddress. If 'clock_seq' is given, it is used as the sequence number;\notherwise a random 14-bit sequence number is chosen."), _('uuid.uuid3(namespace, name) \nGenerate a UUID from the MD5 hash of a namespace UUID and a name.'), _('uuid.uuid4() \nGenerate a random UUID.'), _('uuid.uuid5(namespace, name) \nGenerate a UUID from the SHA-1 hash of a namespace UUID and a name.'), ] mu-editor-1.0.2+dfsg/mu/modes/api/shared.py000066400000000000000000000321421341747546300204770ustar00rootroot00000000000000""" Contains definitions for the Python APIs shared by all modes so they can be used in the editor for autocomplete and call tips. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ SHARED_APIS = [ # String functions _("find(sub, start, end) \nReturn the lowest index in the string where substring 'sub' is found. The optional\n'start' and 'end' arguments specify the slice of string to use.\nReturns -1 if 'sub' cannot be found."), _("rfind(sub, start, end) \nReturn the highest index in the string where substring 'sub' is found. The optional\n'start' and 'end' arguments specify the slice of string to use.\nReturns -1 if 'sub' cannot be found."), _("index(sub, start, end) \nReturn the lowest index in the string where substring 'sub' is found. The optional\n'start' and 'end' arguments specify the slice of string to use.\nRaises a ValueError if 'sub' cannot be found."), _("rindex(sub, start, end) \nReturn the highest index in the string where substring 'sub' is found. The optional\n'start' and 'end' arguments specify the slice of string to use.\nRaises a ValueError if 'sub' cannot be found."), _("join(iterable) \nReturn a string which is the concatenation of the strings in 'iterable'.\nThe separator between elements is the string providing this method."), _("split(sep=None, maxsplit=-1) \nReturn a list of the words in a string, using 'sep' as the delimiter string.\nIf 'sep' is not provided, the splitting algorithm uses whitespace.\nIf the optional 'maxsplit' is provided, splitting will occur 'maxsplit' times."), _("rsplit(sep=None, maxsplit=-1) \nReturn a list of the words in a string, using 'sep' as the delimiter string.\nIf 'sep' is not provided, the splitting algorithm uses whitespace.\nIf the optional 'maxsplit' is provided, splitting will only occur 'maxsplit'\ntimes from the right."), _("startswith(prefix) \nReturns True if the string starts with 'prefix'."), _("endswith(suffix) \nReturns True if the string ends with 'suffix'."), _("strip(chars) \nReturn a copy of the string with the leading and trailing characters removed.\nThe chars argument is a string specifying the set of characters to be removed.\nIf omitted or None, the chars argument defaults to removing whitespace.\nThe chars argument is not a prefix or suffix; rather, all combinations of its values are stripped"), _("lstrip(chars) \nReturn a copy of the string with leading characters removed. The chars argument\nis a string specifying the set of characters to be removed.\nIf omitted or None, the chars argument defaults to removing whitespace.\nThe chars argument is not a prefix; rather, all combinations of its values are\nstripped"), _("rstrip(chars) \nReturn a copy of the string with trailing characters removed. The chars argument\nis a string specifying the set of characters to be removed.\nIf omitted or None, the chars argument defaults to removing whitespace.\nThe chars argument is not a suffix; rather, all combinations of its values are\nstripped"), _("format(*args, **kwargs) \nPerform a string formatting operation. The string on which this method is called\ncan contain literal text or replacement fields delimited by braces {}. Each\nreplacement field contains either the numeric index of a positional argument,\nor the name of a keyword argument.\nReturns a copy of the string where each replacement field is replaced with the\nstring value of the corresponding argument."), _("replace(old, new) \nReturn a copy of the string with all othe occurrences of 'old' replaced with 'new'."), _("count(sub, start, end) \nReturn the number of non-overlapping occurrences of substring 'sub'.\nOptional arguments 'start' and 'end' specify the slice of the string to use. "), _("partition(sep) \nSplit the string at the first occurrence of 'sep', and return a 3-tuple containing\nthe part before the separator, the separator itself, and the part after the separator.\nIf the separator is not found, return a 3-tuple containing the string itself,\nfollowed by two empty strings."), _("rpartition(sep) \nSplit the string at the last occurrence of 'sep', and return a 3-tuple containing\nthe part before the separator, the separator itself, and the part after the separator.\nIf the separator is not found, return a 3-tuple containing two empty strings,\nfollowed by the string itself."), _("lower() \nReturn a copy of the string with all the cased characters converted to lowercase."), _("upper() \nReturn a copy of the string with all the cased characters converted to uppercase."), _("isspace() \nReturn True if there are only whitespace characters in the string and thers is\nat least one character."), _("isalpha() \nReturn True if all the characters in the string are alphabetic and there is\nat least one character."), _("isdigit() \nReturn True if all characters in the string are digits and there is\nat least one character."), _("isupper() \nReturn True if all characters in the string are uppercase and there is\nat least one character."), _("islower() \nReturn True if all characters in the string are lowercase and there is\nat least one character."), # built-in functions _("abs(x) \nReturn the absolute value of the number 'x'."), _("all(iterable) \nReturn True if all elements of iterable are true (or iterable is empty)."), _("any(iterable) \nReturn True if any element of iterable is true. If iterable is empty, return False."), _("bin(x) \nConvert an integer (whole) number into a binary string."), _("bool(x) \nReturn a Boolean value, i.e. one of True or False. The argument 'x' is used to\ngenerate the resulting truth value."), _("bytearray(seq) \nReturn a new array of bytes specified by the sequence 'seq' of integers."), _("bytes(seq) \nReturn a new 'bytes' object - an immutable sequence of 'seq' integers."), _("callable(object) \nReturn True if the 'object' appears to be callable. Otherwise return False."), _("chr(i) \nReturn a string representing a character whose Unicode code point is the integer 'i'."), _("classmethod(function) \nReturn a class method for a function. Usually used as a decorator:\n\nclass C:\n @classmethod\n def func(cls): ..."), _("dict(): \nCreate a new dictionary object."), _("dir(object) \nReturn a list of names in the scope of 'object'. If no object is supplied,\nreturns a ist of names in the current local scope."), _("divmod(a, b) \nTake two (non complex) numbers and return a pair of numbers consisting of the quotient and remainder. For example, divmod(5, 4) results in (1, 1). That is, what's is 5 divided by 4? It's 1 remainder 1."), _("enumerate(iterable, start=0) \nReturn an enumerate object from an iterable object.\nEach iteration of the resulting object returns a tuple containing a count and the value. For example:\n\nseasons = ['Spring', 'Summer', 'Autumn', 'Winter']\nlist(enumerate(seasons))\n[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]"), _("eval(expression, globals=None, locals=None) \nThe 'expression' string containing a Python expression is parsed and evaluated given\nthe context specified by 'globals' and 'locals' which must be dictionary objects."), _("exec(object, globals, locals) \nThis function supports dynamic execution of Python code. The 'object' must be\na string containing Python code that can be parsed and evaluated. If `globals` and\n`locals` are emitted the code is executed in the local scope. Otherwise, both\n'globals' and 'locals' must be dictionary objects."), _("filter(function, iterable) \nConstruct an iterator from those elements of 'iterable' for which 'function' returns True."), _("float(x) \nReturn a floating point number constructed from a number or string 'x'."), _("frozenset(iterable) \nReturn a new frozenset object, optionally with elements taken from 'iterable'."), _("getattr(object, name, default) \nReturn the value fo the named attribute of 'object'. 'name' must be a string.\nOptionally return 'default' if 'name' is not an attribute of 'object'."), _("globals() \nReturn a dictionary representing the current global symbol table.\nI.e. named objects that are currently in the global scope."), _("hasattr(object, name) \nReturns True if the 'object' has an attribute called 'name'. 'name' must be a string."), _("hash(object) \nReturn a hash value of the object (if it has one). Hash values are integers."), _("help(object) \nInvoke the built-in help system (intended for interactive use in the REPL."), _("hex(x) \nConvert an integer 'x' to a lowercase hexadevimal string prefixed with '0x'. For example, hex(255) returns '0xff'."), _("id(object) \nReturn the identity of an object. This is an integer that is guaranteed to be unique."), _("int(x, base=10) \nReturn an integer constructed from a number or string 'x'. The optional 'base' (indicating the base of the number) defaults to 10."), _("isinstance(object, classinfo) \nReturn True if the 'object' is an instance of 'classinfo'."), _("issubclass(class, classinfo) \nReturn True if the 'class' is a subclass (direct, indirect or virtual) of 'classinfo'."), _("iter(object) \nReturn an iterator object for the 'object' (that must support the iteration protocol."), _("len(object) \nReturn the length (the number of items) in an 'object'."), _("list(iterable) \nReturn a list, optionally based upon the members of 'iterable'."), _("locals() \nReturn a dictionary representing the current local symbol table. I.e. named objects\nthat are currently in the local scope."), _("map(function, iterable) \nReturn an iterator that applies 'function' to every item of 'iterable', yielding the results."), _("max(items) \nReturn the largest item in 'items', which can be either an iterable or two or more arguments."), _("min(items) \nReturn the smallest item in 'items', which can be either an iterable or two or more arguments."), _("next(iterator) \nRetrieve the next item from the iterator."), _("object() \nReturn a new featureless object."), _("oct(x) \nConvert an integer number to an octal (base 8) string."), _("open(file, mode='rt') \nOpen 'file' and return a corresponding file object. The 'mode' is an optional\nstring that specifies how the file is opened:\n'r' - open for reading\n'w' - open for writing\n'b' - binary mode\n't' - text mode."), _("ord(c) \nGiven a string representing one Unicode character, return an integer representing the Unicode code point of that character."), _("pow(x, y, z) \nReturn 'x' to the power of 'y'. If the optional 'z' is given, return 'x' to the power of 'y' modulo 'z' (giving the remainder)."), _("print(*objects, sep=' ', end='\\n') \nPrint objects, separated by 'sep' and followed by 'end'.\nAll non-keyword arguments are converted to strings."), _("range(start, stop, step) \nReturn an immutable sequence containing items between 'start' and 'stop' with 'step' difference between them."), _("repr(object) \nReturn a string containing a printable representation of an 'object'."), _("reversed(seq) \nReturn a reverse iterator of the sequence 'seq'."), _("round(number, ndigits) \nReturn the floating point 'number' rounded to the (optional) 'ndigits'.\nIf 'ndigits' is omitted, round to the nearest whole number."), _("set(iterable) \nReturn a new set object, optionally containing elements taken from iterable."), _("setattr(object, name, value) \nSet the 'value' to the attribute called 'name' on object 'object'. 'name' must be a string."), _("sorted(iterable, key, reverse) \nReturn a new sorted list from the items in iterable. The optional 'key' specifies\na function used for comparison and the optional 'reverse' is a boolean indicating the comparison should be reversed."), _("staticmethod(function) \nReturns a static method for a function. Usually used as a decorator:\n\nclass C:\n @staticmethod\ndef func(): ..."), _("str(object) \nReturn a string version of 'object'."), _("sum(iterable, start=0) \nSums 'start' and items of an iterable from left to right and returns the total."), _("super(type, object-or-type) \nReturn a proxy object that delegates method calls to a parent or sibling class\nof 'type'. This is useful for accessing inherited methods that have been\noverridden in a class."), _("tuple(iterable) \nReturn an immutable sequence based upon the items in 'iterable'."), _("type(object) \nReturn the type of an object (i.e. what sort of thing it is)."), _("zip(*iterables) \nMake an iterator that aggregates elements from each of the passed in iterables.\nFor example:\nx = [1, 2, 3]\ny = [4, 5, 6]\nlist(zip(x, y))\n[(1, 4), (2, 5), (3, 6)]"), ] mu-editor-1.0.2+dfsg/mu/modes/base.py000066400000000000000000000310551341747546300173740ustar00rootroot00000000000000""" Contains the base classes for Mu editor modes. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import json import os import os.path import csv import time import logging import pkgutil from PyQt5.QtSerialPort import QSerialPortInfo from PyQt5.QtCore import QObject from mu.logic import HOME_DIRECTORY, WORKSPACE_NAME, get_settings_path logger = logging.getLogger(__name__) # List of supported board USB IDs. Each board is a tuple of unique USB vendor # ID, USB product ID. BOARD_IDS = set([ (0x0D28, 0x0204), # micro:bit USB VID, PID (0x239A, 0x800B), # Adafruit Feather M0 CDC only USB VID, PID (0x239A, 0x8016), # Adafruit Feather M0 CDC + MSC USB VID, PID (0x239A, 0x8014), # metro m0 PID (0x239A, 0x8019), # circuitplayground m0 PID (0x239A, 0x8015), # circuitplayground m0 PID prototype (0x239A, 0x801B), # feather m0 express PID ]) # Cache module names for filename shadow checking later. MODULE_NAMES = set([name for _, name, _ in pkgutil.iter_modules()]) MODULE_NAMES.add('sys') MODULE_NAMES.add('builtins') def get_default_workspace(): """ Return the location on the filesystem for opening and closing files. The default is to use a directory in the users home folder, however in some network systems this in inaccessible. This allows a key in the settings file to be used to set a custom path. """ sp = get_settings_path() workspace_dir = os.path.join(HOME_DIRECTORY, WORKSPACE_NAME) settings = {} try: with open(sp) as f: settings = json.load(f) except FileNotFoundError: logger.error('Settings file {} does not exist.'.format(sp)) except ValueError: logger.error('Settings file {} could not be parsed.'.format(sp)) else: if 'workspace' in settings: if os.path.isdir(settings['workspace']): workspace_dir = settings['workspace'] else: logger.error( 'Workspace value in the settings file is not a valid' 'directory: {}'.format(settings['workspace'])) return workspace_dir class BaseMode(QObject): """ Represents the common aspects of a mode. """ name = 'UNNAMED MODE' description = 'DESCRIPTION NOT AVAILABLE.' icon = 'help' repl = None plotter = None is_debugger = False has_debugger = False save_timeout = 5 #: Number of seconds to wait before saving work. builtins = None #: Symbols to assume as builtins when checking code style. file_extensions = [] module_names = MODULE_NAMES def __init__(self, editor, view): self.editor = editor self.view = view super().__init__() def actions(self): """ Return an ordered list of actions provided by this module. An action is a name (also used to identify the icon) , description, and handler. """ return NotImplemented def workspace_dir(self): """ Return the location on the filesystem for opening and closing files. The default is to use a directory in the users home folder, however in some network systems this in inaccessible. This allows a key in the settings file to be used to set a custom path. """ return get_default_workspace() def api(self): """ Return a list of API specifications to be used by auto-suggest and call tips. """ return NotImplemented def set_buttons(self, **kwargs): """ Given the names and boolean settings of buttons associated with actions for the current mode, toggles them into the boolean enabled state. """ for k, v in kwargs.items(): if k in self.view.button_bar.slots: self.view.button_bar.slots[k].setEnabled(bool(v)) def return_focus_to_current_tab(self): """ After, eg, stopping the plotter or closing the REPL return the focus to the currently-active tab is there is one. """ if self.view.current_tab: self.view.current_tab.setFocus() def add_plotter(self): """ Mode specific implementation of adding and connecting a plotter to incoming streams of data tuples. """ return NotImplemented def remove_plotter(self): """ If there's an active plotter, hide it. Save any data captured while the plotter was active into a directory called 'data_capture' in the workspace directory. The file contains CSV data and is named with a timestamp for easy identification. """ data_dir = os.path.join(get_default_workspace(), 'data_capture') if not os.path.exists(data_dir): logger.debug('Creating directory: {}'.format(data_dir)) os.makedirs(data_dir) # Save the raw data as CSV filename = "{}.csv".format(time.strftime("%Y%m%d-%H%M%S")) f = os.path.join(data_dir, filename) with open(f, 'w') as csvfile: csv_writer = csv.writer(csvfile) csv_writer.writerows(self.view.plotter_pane.raw_data) self.view.remove_plotter() self.plotter = None logger.info('Removing plotter') self.return_focus_to_current_tab() def on_data_flood(self): """ Handle when the plotter is being flooded by data (which usually causes Mu to become unresponsive). In this case, remove the plotter and display a warning dialog to explain what's happened and how to fix things (usually, put a time.sleep(x) into the code generating the data). """ logger.error('Plotting data flood detected.') self.view.remove_plotter() self.plotter = None msg = _('Data Flood Detected!') info = _("The plotter is flooded with data which will make Mu " "unresponsive and freeze. As a safeguard, the plotter has " "been stopped.\n\n" "Flooding is when chunks of data of more than 1024 bytes are " "repeatedly sent to the plotter.\n\n" "To fix this, make sure your code prints small tuples of " "data between calls to 'sleep' for a very short period of " "time.") self.view.show_message(msg, info) def open_file(self, path): """ Some files are not plain text and each mode can attempt to decode them. """ return None class MicroPythonMode(BaseMode): """ Includes functionality that works with a USB serial based REPL. """ valid_boards = BOARD_IDS force_interrupt = True def find_device(self, with_logging=True): """ Returns the port and serial number for the first MicroPython-ish device found connected to the host computer. If no device is found, returns the tuple (None, None). """ available_ports = QSerialPortInfo.availablePorts() for port in available_ports: pid = port.productIdentifier() vid = port.vendorIdentifier() # Look for the port VID & PID in the list of know board IDs if (vid, pid) in self.valid_boards or \ (vid, None) in self.valid_boards: port_name = port.portName() serial_number = port.serialNumber() if with_logging: logger.info('Found device on port: {}'.format(port_name)) logger.info('Serial number: {}'.format(serial_number)) return (self.port_path(port_name), serial_number) if with_logging: logger.warning('Could not find device.') logger.debug('Available ports:') logger.debug(['PID:0x{:04x} VID:0x{:04x} PORT:{}'.format( p.productIdentifier(), p.vendorIdentifier(), p.portName()) for p in available_ports]) return (None, None) def port_path(self, port_name): if os.name == 'posix': # If we're on Linux or OSX reference the port is like this... return "/dev/{}".format(port_name) elif os.name == 'nt': # On Windows simply return the port (e.g. COM0). return port_name else: # No idea how to deal with other OS's so fail. raise NotImplementedError('OS "{}" not supported.'.format(os.name)) def toggle_repl(self, event): """ Toggles the REPL on and off. """ if self.repl: self.remove_repl() logger.info('Toggle REPL off.') else: self.add_repl() logger.info('Toggle REPL on.') def remove_repl(self): """ If there's an active REPL, disconnect and hide it. """ self.view.remove_repl() self.repl = False def add_repl(self): """ Detect a connected MicroPython based device and, if found, connect to the REPL and display it to the user. """ device_port, serial_number = self.find_device() if device_port: try: self.view.add_micropython_repl(device_port, self.name, self.force_interrupt) logger.info('Started REPL on port: {}'.format(device_port)) self.repl = True except IOError as ex: logger.error(ex) self.repl = False info = _("Click on the device's reset button, wait a few" " seconds and then try again.") self.view.show_message(str(ex), info) except Exception as ex: logger.error(ex) else: message = _('Could not find an attached device.') information = _('Please make sure the device is plugged into this' ' computer.\n\nIt must have a version of' ' MicroPython (or CircuitPython) flashed onto it' ' before the REPL will work.\n\nFinally, press the' " device's reset button and wait a few seconds" ' before trying again.') self.view.show_message(message, information) def toggle_plotter(self, event): """ Toggles the plotter on and off. """ if self.plotter: self.remove_plotter() logger.info('Toggle plotter off.') else: self.add_plotter() logger.info('Toggle plotter on.') def add_plotter(self): """ Check if REPL exists, and if so, enable the plotter pane! """ device_port, serial_number = self.find_device() if device_port: try: self.view.add_micropython_plotter(device_port, self.name, self) logger.info('Started plotter') self.plotter = True except IOError as ex: logger.error(ex) self.plotter = False info = _("Click on the device's reset button, wait a few" " seconds and then try again.") self.view.show_message(str(ex), info) except Exception as ex: logger.error(ex) else: message = _('Could not find an attached device.') information = _('Please make sure the device is plugged into this' ' computer.\n\nIt must have a version of' ' MicroPython (or CircuitPython) flashed onto it' ' before the Plotter will work.\n\nFinally, press' " the device's reset button and wait a few seconds" ' before trying again.') self.view.show_message(message, information) def on_data_flood(self): """ Ensure the REPL is stopped if there is data flooding of the plotter. """ self.remove_repl() super().on_data_flood() mu-editor-1.0.2+dfsg/mu/modes/debugger.py000066400000000000000000000313011341747546300202400ustar00rootroot00000000000000""" The mode Mu is is when it's debugging a Python 3 script. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import logging import os.path from mu.modes.base import BaseMode from mu.logic import DEBUGGER_PORT from mu.debugger.client import Debugger from mu.debugger.utils import is_breakpoint_line logger = logging.getLogger(__name__) class DebugMode(BaseMode): """ Represents the functionality required by the Python 3 visual debugger. """ name = _('Graphical Debugger') description = _('Debug your Python 3 code.') icon = 'python' runner = None is_debugger = True save_timeout = 0 # No need to auto-save when in read-only debug mode. def actions(self): """ Return an ordered list of actions provided by this module. An action is a name (also used to identify the icon) , description, and handler. """ return [ { 'name': 'stop', 'display_name': _('Stop'), 'description': _('Stop the running code.'), 'handler': self.button_stop, 'shortcut': 'Shift+F5', }, { 'name': 'run', 'display_name': _('Continue'), 'description': _('Continue to run your Python script.'), 'handler': self.button_continue, 'shortcut': 'F5', }, { 'name': 'step-over', 'display_name': _('Step Over'), 'description': _('Step over a line of code.'), 'handler': self.button_step_over, 'shortcut': 'F10', }, { 'name': 'step-in', 'display_name': _('Step In'), 'description': _('Step into a function.'), 'handler': self.button_step_in, 'shortcut': 'F11', }, { 'name': 'step-out', 'display_name': _('Step Out'), 'description': _('Step out of a function.'), 'handler': self.button_step_out, 'shortcut': 'Shift+F11', }, ] def api(self): """ Return a list of API specifications to be used by auto-suggest and call tips. """ return [] def start(self): """ Start debugging the current script. """ # Grab the Python file. tab = self.view.current_tab if tab is None: logger.debug('There is no active text editor.') self.stop() return if tab.path is None: # Unsaved file. self.editor.save() if tab.path: # If needed, save the script. if tab.isModified(): self.editor.save_tab_to_file(tab) logger.debug(tab.text()) self.set_buttons(modes=False) envars = self.editor.envars self.runner = self.view.add_python3_runner(tab.path, self.workspace_dir(), debugger=True, envars=envars) self.runner.process.waitForStarted() self.runner.process.finished.connect(self.finished) self.view.add_debug_inspector() self.view.set_read_only(True) self.debugger = Debugger('localhost', DEBUGGER_PORT, proc=self.runner.process) self.debugger.view = self self.debugger.start() else: logger.debug('Current script has not been saved. Aborting debug.') self.stop() def stop(self): """ Stop the debug runner and reset the UI. """ logger.debug('Stopping debugger.') if self.runner: self.runner.process.kill() self.runner.process.waitForFinished() self.runner = None self.debugger = None self.view.remove_python_runner() self.view.remove_debug_inspector() self.set_buttons(modes=True) self.editor.change_mode('python') self.editor.mode = 'python' self.view.set_read_only(False) def finished(self): """ Called when the debugged Python process is finished. """ buttons = {action['name']: False for action in self.actions() if action['name'] != 'stop'} self.set_buttons(**buttons) self.editor.show_status_message(_("Your script has finished running.")) for tab in self.view.widgets: tab.setSelection(0, 0, 0, 0) tab.reset_debugger_highlight() def button_stop(self, event): """ Button clicked to stop the current script and return to Python3 mode. """ self.stop() def button_continue(self, event): """ Button clicked to continue running the script. """ self.view.current_tab.reset_debugger_highlight() self.debugger.do_run() def button_step_over(self, event): """ Button clicked to step over the current line of code. """ self.view.current_tab.reset_debugger_highlight() self.debugger.do_next() def button_step_in(self, event): """ Button clicked to step into the current block of code. """ self.view.current_tab.reset_debugger_highlight() self.debugger.do_step() def button_step_out(self, event): """ Button clicked to step out of the current block of code. """ self.view.current_tab.reset_debugger_highlight() self.debugger.do_return() def toggle_breakpoint(self, line, tab): """ Toggle a breakpoint in the debugger. """ bps = self.debugger.breakpoints(tab.path) breakpoint = bps.get(line + 1, None) if tab.markersAtLine(line): if breakpoint: self.debugger.disable_breakpoint(breakpoint) tab.markerDelete(line, tab.BREAKPOINT_MARKER) else: handle = tab.markerAdd(line, tab.BREAKPOINT_MARKER) tab.breakpoint_handles.add(handle) if breakpoint: self.debugger.enable_breakpoint(breakpoint) else: self.debugger.create_breakpoint(tab.path, line + 1) def debug_on_fail(self, message): """ Called when, for any reason, the debug client was unable to connect to the debug runner. On a Raspberry Pi this is usually because it's an underpowereed machine and it takes time to start the debug runner process. (However, the debug client waits for 10 seconds for the runner to start.) """ # Report the problem. process_runner = self.view.process_runner if process_runner: msg = _("Unable to connect to the Python debugger.\n\n") + message process_runner.append(msg.encode('utf-8')) # Set the state to finished. self.finished() process_runner.finished(1, -1) def debug_on_bootstrap(self): """ Once the debugger is bootstrapped ensure all the current breakpoints are set. Do not set breakpoints (and remove the marker) if: * The marker is not visible (the line is -1) * The marker is not a duplicate of an existing line. * The line with the marker is not a valid breakpoint line. """ for tab in self.view.widgets: break_lines = set() for handle in list(tab.breakpoint_handles): line = tab.markerLine(handle) code = tab.text(line) if line > -1 and line not in break_lines and \ is_breakpoint_line(code): self.debugger.create_breakpoint(tab.path, line + 1) break_lines.add(line) else: tab.breakpoint_handles.remove(handle) tab.markerDelete(line, -1) # Start the script running. self.debugger.do_run() def debug_on_breakpoint_enable(self, breakpoint): """ Handle when a breakpoint is enabled. """ tab = self.view.current_tab if tab.path == breakpoint.filename and \ not tab.markersAtLine(breakpoint.line - 1): tab.markerAdd(breakpoint.line - 1, tab.BREAKPOINT_MARKER) def debug_on_breakpoint_disable(self, breakpoint): """ Handle when a breakpoint is disabled. """ tab = self.view.current_tab tab.markerDelete(breakpoint.line - 1, tab.BREAKPOINT_MARKER) def debug_on_line(self, filename, line): """ Handle when the debugger has moved to the referenced line in the file. """ ignored = ['bdb.py', ] # Files the debugger should ignore. if os.path.basename(filename) in ignored: self.debugger.do_return() return self.view.current_tab.setSelection(0, 0, 0, 0) tab = self.editor.get_tab(filename) tab.debugger_at_line(line - 1) def debug_on_stack(self, stack): """ Handle when the debugger sends an updated stack. """ if stack: locals_dict = {} for frame in stack: for k, v in frame[1]['locals'].items(): locals_dict[k] = v self.view.update_debug_inspector(locals_dict) def debug_on_postmortem(self, args, kwargs): """ Handle when something catastrophic happens to the debugger. """ process_runner = self.view.process_runner for item in args: process_runner.append(item.encode('utf-8')) for k, v in kwargs.items(): msg = '{}: {}'.format(k, v) process_runner.append(msg.encode('utf-8')) def debug_on_info(self, message): """ Handle when the debugger sends an informative textual message. """ self.editor.show_status_message(_("Debugger info: {}").format(message)) def debug_on_warning(self, message): """ Handle when the debugger sends a warning message. """ self.editor.show_status_message(_("Debugger warning: {}").format( message)) def debug_on_error(self, message): """ Handle when the debugger sends an error message. """ self.editor.show_status_message(_("Debugger error: {}").format( message)) def debug_on_call(self, args): """ Handle when the debugger has called a function with the referenced args. Make sure the debugger steps into the function. """ self.debugger.do_step() def debug_on_return(self, return_value): """ Handle when the debugger returns from a function call with the referenced return value. Make sure the debugger steps out of the function to the caller. """ self.debugger.do_step() def debug_on_finished(self): """ Called when the runner has completed running the script to be debugged. """ self.finished() def debug_on_breakpoint_ignore(self, breakpoint, count): """ Handle when a breakpoint is to be ignored by the debugger. Currently an unimplemented extra feature. """ pass def debug_on_breakpoint_clear(self, breakpoint): """ Handle the clearing of the referenced breakpoint. Currently an unimplemented extra feature. """ pass def debug_on_restart(self): """ Handle when the debugger restarts. Currenty an unimplemented extra feature. """ pass def debug_on_exception(self, name, value): """ Handle when the debugger encounters a named exception with an associated value. Clear the highlighted line and allow the script to run until the end so the error message is printed to stdout. """ self.view.current_tab.reset_debugger_highlight() self.debugger.do_run() mu-editor-1.0.2+dfsg/mu/modes/microbit.py000066400000000000000000000706211341747546300202740ustar00rootroot00000000000000""" The mode for working with the BBC micro:bit. Conatains most of the origial functionality from Mu when it was only a micro:bit related editor. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import os import sys import os.path import logging import semver from tokenize import TokenError from mu.logic import HOME_DIRECTORY from mu.contrib import uflash, microfs from mu.modes.api import MICROBIT_APIS, SHARED_APIS from mu.modes.base import MicroPythonMode from mu.interface.panes import CHARTS from PyQt5.QtCore import QObject, QThread, pyqtSignal, QTimer # We can run without nudatus can_minify = True try: import nudatus except ImportError: # pragma: no cover can_minify = False logger = logging.getLogger(__name__) class DeviceFlasher(QThread): """ Used to flash the micro:bit in a non-blocking manner. """ # Emitted when flashing the micro:bit fails for any reason. on_flash_fail = pyqtSignal(str) def __init__(self, paths_to_microbits, python_script, path_to_runtime): """ The paths_to_microbits should be a list containing filesystem paths to attached micro:bits to flash. The python_script should be the text of the script to flash onto the device. The path_to_runtime should be the path of the hex file for the MicroPython runtime to use. If the path_to_runtime is None, the default MicroPython runtime is used by default. """ QThread.__init__(self) self.paths_to_microbits = paths_to_microbits self.python_script = python_script self.path_to_runtime = path_to_runtime def run(self): """ Flash the device. """ try: uflash.flash(paths_to_microbits=self.paths_to_microbits, python_script=self.python_script, path_to_runtime=self.path_to_runtime) except Exception as ex: # Catch everything so Mu can recover from all of the wide variety # of possible exceptions that could happen at this point. logger.error(ex) self.on_flash_fail.emit(str(ex)) class FileManager(QObject): """ Used to manage micro:bit filesystem operations in a manner such that the UI remains responsive. Provides an FTP-ish API. Emits signals on success or failure of different operations. """ # Emitted when the tuple of files on the micro:bit is known. on_list_files = pyqtSignal(tuple) # Emitted when the file with referenced filename is got from the micro:bit. on_get_file = pyqtSignal(str) # Emitted when the file with referenced filename is put onto the micro:bit. on_put_file = pyqtSignal(str) # Emitted when the file with referenced filename is deleted from the # micro:bit. on_delete_file = pyqtSignal(str) # Emitted when Mu is unable to list the files on the micro:bit. on_list_fail = pyqtSignal() # Emitted when the referenced file fails to be got from the micro:bit. on_get_fail = pyqtSignal(str) # Emitted when the referenced file fails to be put onto the micro:bit. on_put_fail = pyqtSignal(str) # Emitted when the referenced file fails to be deleted from the micro:bit. on_delete_fail = pyqtSignal(str) def on_start(self): """ Run when the thread containing this object's instance is started so it can emit the list of files found on the connected micro:bit. """ self.ls() def ls(self): """ List the files on the micro:bit. Emit the resulting tuple of filenames or emit a failure signal. """ try: result = tuple(microfs.ls()) self.on_list_files.emit(result) except Exception as ex: logger.exception(ex) self.on_list_fail.emit() def get(self, microbit_filename, local_filename): """ Get the referenced micro:bit filename and save it to the local filename. Emit the name of the filename when complete or emit a failure signal. """ try: microfs.get(microbit_filename, local_filename) self.on_get_file.emit(microbit_filename) except Exception as ex: logger.error(ex) self.on_get_fail.emit(microbit_filename) def put(self, local_filename): """ Put the referenced local file onto the filesystem on the micro:bit. Emit the name of the file on the micro:bit when complete, or emit a failure signal. """ try: microfs.put(local_filename, target=None) self.on_put_file.emit(os.path.basename(local_filename)) except Exception as ex: logger.error(ex) self.on_put_fail.emit(local_filename) def delete(self, microbit_filename): """ Delete the referenced file on the micro:bit's filesystem. Emit the name of the file when complete, or emit a failure signal. """ try: microfs.rm(microbit_filename) self.on_delete_file.emit(microbit_filename) except Exception as ex: logger.error(ex) self.on_delete_fail.emit(microbit_filename) class MicrobitMode(MicroPythonMode): """ Represents the functionality required by the micro:bit mode. """ name = _('BBC micro:bit') description = _("Write MicroPython for the BBC micro:bit.") icon = 'microbit' fs = None #: Reference to filesystem navigator. flash_thread = None flash_timer = None file_extensions = ['hex'] valid_boards = [ (0x0D28, 0x0204), # micro:bit USB VID, PID ] valid_serial_numbers = [9900, 9901] # Serial numbers of supported boards. python_script = '' def actions(self): """ Return an ordered list of actions provided by this module. An action is a name (also used to identify the icon) , description, and handler. """ buttons = [ { 'name': 'flash', 'display_name': _('Flash'), 'description': _('Flash your code onto the micro:bit.'), 'handler': self.flash, 'shortcut': 'F3', }, { 'name': 'files', 'display_name': _('Files'), 'description': _('Access the file system on the micro:bit.'), 'handler': self.toggle_files, 'shortcut': 'F4', }, { 'name': 'repl', 'display_name': _('REPL'), 'description': _('Use the REPL to live-code on the ' 'micro:bit.'), 'handler': self.toggle_repl, 'shortcut': 'Ctrl+Shift+I', }, ] if CHARTS: buttons.append({ 'name': 'plotter', 'display_name': _('Plotter'), 'description': _('Plot incoming REPL data.'), 'handler': self.toggle_plotter, 'shortcut': 'CTRL+Shift+P', }) return buttons def api(self): """ Return a list of API specifications to be used by auto-suggest and call tips. """ return SHARED_APIS + MICROBIT_APIS def flash(self): """ Takes the currently active tab, compiles the Python script therein into a hex file and flashes it all onto the connected device. WARNING: This method is getting more complex due to several edge cases. Ergo, it's a target for refactoring. """ user_defined_microbit_path = None self.python_script = '' logger.info('Preparing to flash script.') # The first thing to do is check the script is valid and of the # expected length. # Grab the Python script. tab = self.view.current_tab if tab is None: # There is no active text editor. Exit. return # Check the script's contents. python_script = tab.text().encode('utf-8') logger.debug('Python script:') logger.debug(python_script) # Check minification status. minify = False if uflash.get_minifier(): minify = self.editor.minify # Attempt and handle minification. if len(python_script) >= uflash._MAX_SIZE: message = _('Unable to flash "{}"').format(tab.label) if minify and can_minify: orginal = len(python_script) script = python_script.decode('utf-8') try: mangled = nudatus.mangle(script).encode('utf-8') except TokenError as e: msg, (line, col) = e.args logger.debug('Minify failed') logger.exception(e) message = _("Problem with script") information = _("{} [{}:{}]").format(msg, line, col) self.view.show_message(message, information, 'Warning') return saved = orginal - len(mangled) percent = saved / orginal * 100 logger.debug('Script minified, {} bytes ({:.2f}%) saved:' .format(saved, percent)) logger.debug(mangled) python_script = mangled if len(python_script) >= 8192: information = _("Our minifier tried but your " "script is too long!") self.view.show_message(message, information, 'Warning') return elif minify and not can_minify: information = _("Your script is too long and the minifier" " isn't available") self.view.show_message(message, information, 'Warning') return else: information = _("Your script is too long!") self.view.show_message(message, information, 'Warning') return # By this point, there's a valid Python script in "python_script". # Assign this to an attribute for later processing in a different # method. self.python_script = python_script # Next step: find the microbit port and serial number. path_to_microbit = uflash.find_microbit() logger.info('Path to micro:bit: {}'.format(path_to_microbit)) port = None serial_number = None try: port, serial_number = self.find_device() logger.info('Serial port: {}'.format(port)) logger.info('Device serial number: {}'.format(serial_number)) except Exception as ex: logger.warning('Unable to make serial connection to micro:bit.') logger.warning(ex) # Determine the location of the BBC micro:bit. If it can't be found # fall back to asking the user to locate it. if path_to_microbit is None: # Ask the user to locate the device. path_to_microbit = self.view.get_microbit_path(HOME_DIRECTORY) user_defined_microbit_path = path_to_microbit logger.debug('User defined path to micro:bit: {}'.format( user_defined_microbit_path)) # Check the path and that it exists simply because the path maybe based # on stale data. if path_to_microbit and os.path.exists(path_to_microbit): force_flash = False # If set to true, fully flash the device. # If there's no port but there's a path_to_microbit, then we're # probably running on Windows with an old device, so force flash. if not port: force_flash = True if not self.python_script.strip(): # If the script is empty, this is a signal to simply force a # flash. logger.info("Python script empty. Forcing flash.") force_flash = True logger.info("Checking target device.") # Get the version of MicroPython on the device. try: version_info = microfs.version() logger.info(version_info) board_info = version_info['version'].split() if (board_info[0] == 'micro:bit' and board_info[1].startswith('v')): # New style versions, so the correct information will be # in the "release" field. try: # Check the release is a correct semantic version. semver.parse(version_info['release']) board_version = version_info['release'] except ValueError: # If it's an invalid semver, set to unknown version to # force flash. board_version = '0.0.1' else: # 0.0.1 indicates an old unknown version. This is just a # valid arbitrary flag for semver comparison a couple of # lines below. board_version = '0.0.1' logger.info('Board MicroPython: {}'.format(board_version)) logger.info( 'Mu MicroPython: {}'.format(uflash.MICROPYTHON_VERSION)) # If there's an older version of MicroPython on the device, # update it with the one packaged with Mu. if semver.compare(board_version, uflash.MICROPYTHON_VERSION) < 0: force_flash = True except Exception: # Could not get version of MicroPython. This means either the # device has a really old version of MicroPython or is running # something else. In any case, flash MicroPython onto the # device. logger.warning('Could not detect version of MicroPython.') force_flash = True # Check use of custom runtime. rt_hex_path = self.editor.microbit_runtime.strip() message = _('Flashing "{}" onto the micro:bit.').format(tab.label) if (rt_hex_path and os.path.exists(rt_hex_path)): message = message + _(" Runtime: {}").format(rt_hex_path) force_flash = True # Using a custom runtime, so flash it. else: rt_hex_path = None self.editor.microbit_runtime = '' # Check for use of user defined path (to save hex onto local # file system. if user_defined_microbit_path: force_flash = True # If we need to flash the device with a clean hex, do so now. if force_flash: logger.info('Flashing new MicroPython runtime onto device') self.editor.show_status_message(message, 10) self.set_buttons(flash=False) if user_defined_microbit_path or not port: # The user has provided a path to a location on the # filesystem. In this case save the combined hex/script # in the specified path_to_microbit. # Or... Mu has a path to a micro:bit but can't establish # a serial connection, so use the combined hex/script # to flash the device. self.flash_thread = DeviceFlasher([path_to_microbit], self.python_script, rt_hex_path) # Reset python_script so Mu doesn't try to copy it as the # main.py file. self.python_script = '' else: # We appear to need to flash a connected micro:bit device, # so just flash the Python hex with no embedded Python # script, since this will be copied over when the # flashing operation has finished. model_serial_number = int(serial_number[:4]) if rt_hex_path: # If the user has specified a bespoke runtime hex file # assume they know what they're doing and hope for the # best. self.flash_thread = DeviceFlasher([path_to_microbit], b'', rt_hex_path) elif model_serial_number in self.valid_serial_numbers: # The connected board has a serial number that # indicates the MicroPython hex bundled with Mu # supports it. In which case, flash it. self.flash_thread = DeviceFlasher([path_to_microbit], b'', None) else: message = _('Unsupported BBC micro:bit.') information = _("Your device is newer than this " "version of Mu. Please update Mu " "to the latest version to support " "this device.\n\n" "https://codewith.mu/") self.view.show_message(message, information) return if sys.platform == 'win32': # Windows blocks on write. self.flash_thread.finished.connect(self.flash_finished) else: if user_defined_microbit_path: # Call the flash_finished immediately the thread # finishes if Mu is writing the hex file to a user # defined location on the local filesystem. self.flash_thread.finished.connect(self.flash_finished) else: # Other platforms don't block, so schedule the finish # call for 10 seconds (approximately how long flashing # the connected device takes). self.flash_timer = QTimer() self.flash_timer.timeout.connect(self.flash_finished) self.flash_timer.setSingleShot(True) self.flash_timer.start(10000) self.flash_thread.on_flash_fail.connect(self.flash_failed) self.flash_thread.start() else: try: self.copy_main() except IOError as ioex: # There was a problem with the serial communication with # the device, so revert to forced flash... "old style". # THIS IS A HACK! :-( logger.warning('Could not copy file to device.') logger.error(ioex) logger.info('Falling back to old-style flashing.') self.flash_thread = DeviceFlasher([path_to_microbit], self.python_script, rt_hex_path) self.python_script = '' if sys.platform == 'win32': # Windows blocks on write. self.flash_thread.finished.connect(self.flash_finished) else: self.flash_timer = QTimer() self.flash_timer.timeout.connect(self.flash_finished) self.flash_timer.setSingleShot(True) self.flash_timer.start(10000) self.flash_thread.on_flash_fail.connect(self.flash_failed) self.flash_thread.start() except Exception as ex: self.flash_failed(ex) else: # Try to be helpful... essentially there is nothing Mu can do but # prompt for patience while the device is mounted and/or do the # classic "have you tried switching it off and on again?" trick. # This one's for James at the Raspberry Pi Foundation. ;-) message = _('Could not find an attached BBC micro:bit.') information = _("Please ensure you leave enough time for the BBC" " micro:bit to be attached and configured" " correctly by your computer. This may take" " several seconds." " Alternatively, try removing and re-attaching the" " device or saving your work and restarting Mu if" " the device remains unfound.") self.view.show_message(message, information) def flash_finished(self): """ Called when the thread used to flash the micro:bit has finished. """ self.set_buttons(flash=True) self.editor.show_status_message(_("Finished flashing.")) self.flash_thread = None self.flash_timer = None if self.python_script: try: self.copy_main() except Exception as ex: self.flash_failed(ex) def copy_main(self): """ If the attribute self.python_script contains any code, copy it onto the connected micro:bit as main.py, then restart the board (CTRL-D). """ if self.python_script.strip(): script = self.python_script logger.info('Copying main.py onto device') commands = [ "fd = open('main.py', 'wb')", "f = fd.write", ] while script: line = script[:64] commands.append('f(' + repr(line) + ')') script = script[64:] commands.append('fd.close()') logger.info(commands) serial = microfs.get_serial() out, err = microfs.execute(commands, serial) logger.info((out, err)) if err: raise IOError(microfs.clean_error(err)) # Reset the device. serial.write(b'import microbit\r\n') serial.write(b'microbit.reset()\r\n') self.editor.show_status_message(_('Copied code onto micro:bit.')) self.python_script = '' def flash_failed(self, error): """ Called when the thread used to flash the micro:bit encounters a problem. """ logger.error(error) message = _("There was a problem flashing the micro:bit.") information = _("Please do not disconnect the device until flashing" " has completed. Please check the logs for more" " information.") self.view.show_message(message, information, 'Warning') if self.flash_timer: self.flash_timer.stop() self.flash_timer = None self.set_buttons(flash=True) self.flash_thread = None def toggle_repl(self, event): """ Check for the existence of the file pane before toggling REPL. """ if self.fs is None: super().toggle_repl(event) if self.repl: self.set_buttons(flash=False, files=False) elif not (self.repl or self.plotter): self.set_buttons(flash=True, files=True) else: message = _("REPL and file system cannot work at the same time.") information = _("The REPL and file system both use the same USB " "serial connection. Only one can be active " "at any time. Toggle the file system off and " "try again.") self.view.show_message(message, information) def toggle_plotter(self, event): """ Check for the existence of the file pane before toggling plotter. """ if self.fs is None: super().toggle_plotter(event) if self.plotter: self.set_buttons(flash=False, files=False) elif not (self.repl or self.plotter): self.set_buttons(flash=True, files=True) else: message = _("The plotter and file system cannot work at the same " "time.") information = _("The plotter and file system both use the same " "USB serial connection. Only one can be active " "at any time. Toggle the file system off and " "try again.") self.view.show_message(message, information) def toggle_files(self, event): """ Check for the existence of the REPL or plotter before toggling the file system navigator for the micro:bit on or off. """ if (self.repl or self.plotter): message = _("File system cannot work at the same time as the " "REPL or plotter.") information = _("The file system and the REPL and plotter " "use the same USB serial connection. Toggle the " "REPL and plotter off and try again.") self.view.show_message(message, information) else: if self.fs is None: self.add_fs() if self.fs: logger.info('Toggle filesystem on.') self.set_buttons(flash=False, repl=False, plotter=False) else: self.remove_fs() logger.info('Toggle filesystem off.') self.set_buttons(flash=True, repl=True, plotter=True) def add_fs(self): """ Add the file system navigator to the UI. """ # Check for micro:bit port, serial_number = self.find_device() if not port: message = _('Could not find an attached BBC micro:bit.') information = _("Please make sure the device is plugged " "into this computer.\n\nThe device must " "have MicroPython flashed onto it before " "the file system will work.\n\n" "Finally, press the device's reset button " "and wait a few seconds before trying " "again.") self.view.show_message(message, information) return self.file_manager_thread = QThread(self) self.file_manager = FileManager() self.file_manager.moveToThread(self.file_manager_thread) self.file_manager_thread.started.\ connect(self.file_manager.on_start) self.fs = self.view.add_filesystem(self.workspace_dir(), self.file_manager) self.fs.set_message.connect(self.editor.show_status_message) self.fs.set_warning.connect(self.view.show_message) self.file_manager_thread.start() def remove_fs(self): """ Remove the file system navigator from the UI. """ self.view.remove_filesystem() self.file_manager = None self.file_manager_thread = None self.fs = None def on_data_flood(self): """ Ensure the Files button is active before the REPL is killed off when a data flood of the plotter is detected. """ self.set_buttons(files=True) super().on_data_flood() def open_file(self, path): """ Tries to open a MicroPython hex file with an embedded Python script. """ text = None if path.lower().endswith('.hex'): # Try to open the hex and extract the Python script try: with open(path, newline='') as f: text = uflash.extract_script(f.read()) except Exception: return None return text mu-editor-1.0.2+dfsg/mu/modes/pygamezero.py000066400000000000000000000151521341747546300206440ustar00rootroot00000000000000""" The PyGameZero mode for the Mu editor. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import os import logging from mu.modes.base import BaseMode from mu.modes.api import PYTHON3_APIS, SHARED_APIS, PI_APIS, PYGAMEZERO_APIS from mu.resources import load_icon logger = logging.getLogger(__name__) class PyGameZeroMode(BaseMode): """ Represents the functionality required by the PyGameZero mode. """ name = _('Pygame Zero') description = _('Make games with Pygame Zero.') icon = 'pygamezero' runner = None builtins = ['clock', 'music', 'Actor', 'keyboard', 'animate', 'Rect', 'ZRect', 'images', 'sounds', 'mouse', 'keys', 'keymods', 'exit', 'screen'] def actions(self): """ Return an ordered list of actions provided by this module. An action is a name (also used to identify the icon) , description, and handler. """ return [ { 'name': 'play', 'display_name': _('Play'), 'description': _('Play your Pygame Zero game.'), 'handler': self.play_toggle, 'shortcut': 'F5', }, { 'name': 'images', 'display_name': _('Images'), 'description': _('Show the images used by Pygame Zero.'), 'handler': self.show_images, 'shortcut': 'Ctrl+Shift+I', }, { 'name': 'fonts', 'display_name': _('Fonts'), 'description': _('Show the fonts used by Pygame Zero.'), 'handler': self.show_fonts, 'shortcut': 'Ctrl+Shift+F', }, { 'name': 'sounds', 'display_name': _('Sounds'), 'description': _('Show the sounds used by Pygame Zero.'), 'handler': self.show_sounds, 'shortcut': 'Ctrl+Shift+N', }, { 'name': 'music', 'display_name': _('Music'), 'description': _('Show the music used by Pygame Zero.'), 'handler': self.show_music, 'shortcut': 'Ctrl+Shift+M', }, ] def api(self): """ Return a list of API specifications to be used by auto-suggest and call tips. """ return SHARED_APIS + PYTHON3_APIS + PI_APIS + PYGAMEZERO_APIS def play_toggle(self, event): """ Handles the toggling of the play button to start/stop a script. """ if self.runner: self.stop_game() play_slot = self.view.button_bar.slots['play'] play_slot.setIcon(load_icon('play')) play_slot.setText(_('Play')) play_slot.setToolTip(_('Play your Pygame Zero game.')) self.set_buttons(modes=True) else: self.run_game() if self.runner: play_slot = self.view.button_bar.slots['play'] play_slot.setIcon(load_icon('stop')) play_slot.setText(_('Stop')) play_slot.setToolTip(_('Stop your Pygame Zero game.')) self.set_buttons(modes=False) def run_game(self): """ Run the current game. """ # Grab the Python file. tab = self.view.current_tab if tab is None: logger.debug('There is no active text editor.') self.stop_game() return if tab.path is None: # Unsaved file. self.editor.save() if tab.path: # If needed, save the script. if tab.isModified(): self.editor.save_tab_to_file(tab) logger.debug(tab.text()) envars = self.editor.envars args = ['-m', 'pgzero'] self.runner = self.view.add_python3_runner(tab.path, self.workspace_dir(), interactive=False, envars=envars, python_args=args) self.runner.process.waitForStarted() def stop_game(self): """ Stop the currently running game. """ logger.debug('Stopping script.') if self.runner: self.runner.process.kill() self.runner.process.waitForFinished() self.runner = None self.view.remove_python_runner() def show_images(self, event): """ Open the directory containing the image assets used by PyGame Zero. This should open the host OS's file system explorer so users can drag new files into the opened folder. """ image_dir = os.path.join(self.workspace_dir(), 'images') self.view.open_directory_from_os(image_dir) def show_fonts(self, event): """ Open the directory containing the font assets used by PyGame Zero. This should open the host OS's file system explorer so users can drag new files into the opened folder. """ image_dir = os.path.join(self.workspace_dir(), 'fonts') self.view.open_directory_from_os(image_dir) def show_sounds(self, event): """ Open the directory containing the sound assets used by PyGame Zero. This should open the host OS's file system explorer so users can drag new files into the opened folder. """ sound_dir = os.path.join(self.workspace_dir(), 'sounds') self.view.open_directory_from_os(sound_dir) def show_music(self, event): """ Open the directory containing the music assets used by PyGame Zero. This should open the host OS's file system explorer so users can drag new files into the opened folder. """ sound_dir = os.path.join(self.workspace_dir(), 'music') self.view.open_directory_from_os(sound_dir) mu-editor-1.0.2+dfsg/mu/modes/python3.py000066400000000000000000000265011341747546300200660ustar00rootroot00000000000000""" The Python3 mode for the Mu editor. Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import sys import os import logging from mu.modes.base import BaseMode from mu.modes.api import PYTHON3_APIS, SHARED_APIS, PI_APIS from mu.resources import load_icon from mu.interface.panes import CHARTS from qtconsole.manager import QtKernelManager from qtconsole.client import QtKernelClient from PyQt5.QtCore import QObject, QThread, pyqtSignal logger = logging.getLogger(__name__) class KernelRunner(QObject): """ Used to control the iPython kernel in a non-blocking manner so the UI remains responsive. """ kernel_started = pyqtSignal(QtKernelManager, QtKernelClient) kernel_finished = pyqtSignal() # Used to build context with user defined envars when running the REPL. default_envars = os.environ.copy() def __init__(self, cwd, envars): """ Initialise the kernel runner with a target current working directory. """ super().__init__() self.cwd = cwd self.envars = dict(envars) def start_kernel(self): """ Create the expected context, start the kernel, obtain a client and emit a signal when both are started. """ logger.info(sys.path) os.chdir(self.cwd) # Ensure the kernel runs with the expected CWD. # Add user defined envars to os.environ so they can be picked up by # the child process running the kernel. logger.info('Starting iPython kernel with user defined envars: ' '{}'.format(self.envars)) for k, v in self.envars.items(): os.environ[k] = v if sys.platform == 'darwin': parent_dir = os.path.dirname(__file__) if '.app/Contents/Resources/app/mu' in parent_dir: # Mu is running as a macOS app bundle. Ensure the expected # paths are in PYTHONPATH of the subprocess so the kernel can # be found. os.environ['PYTHONPATH'] = ':'.join(sys.path) self.repl_kernel_manager = QtKernelManager() self.repl_kernel_manager.start_kernel() self.repl_kernel_client = self.repl_kernel_manager.client() self.kernel_started.emit(self.repl_kernel_manager, self.repl_kernel_client) def stop_kernel(self): """ Clean up the context, stop the client connections to the kernel, affect an immediate shutdown of the kernel and emit a "finished" signal. """ os.environ.clear() for k, v in self.default_envars.items(): os.environ[k] = v self.repl_kernel_client.stop_channels() self.repl_kernel_manager.shutdown_kernel(now=True) self.kernel_finished.emit() class PythonMode(BaseMode): """ Represents the functionality required by the Python 3 mode. """ name = _('Python 3') description = _('Create code using standard Python 3.') icon = 'python' runner = None has_debugger = True kernel_runner = None stop_kernel = pyqtSignal() def actions(self): """ Return an ordered list of actions provided by this module. An action is a name (also used to identify the icon) , description, and handler. """ buttons = [ { 'name': 'run', 'display_name': _('Run'), 'description': _('Run your Python script.'), 'handler': self.run_toggle, 'shortcut': 'F5', }, { 'name': 'debug', 'display_name': _('Debug'), 'description': _('Debug your Python script.'), 'handler': self.debug, 'shortcut': 'F6', }, { 'name': 'repl', 'display_name': _('REPL'), 'description': _('Use the REPL for live coding.'), 'handler': self.toggle_repl, 'shortcut': 'Ctrl+Shift+I', }, ] if CHARTS: buttons.append({ 'name': 'plotter', 'display_name': _('Plotter'), 'description': _('Plot data from your script or the REPL.'), 'handler': self.toggle_plotter, 'shortcut': 'CTRL+Shift+P', }) return buttons def api(self): """ Return a list of API specifications to be used by auto-suggest and call tips. """ return SHARED_APIS + PYTHON3_APIS + PI_APIS def run_toggle(self, event): """ Handles the toggling of the run button to start/stop a script. """ run_slot = self.view.button_bar.slots['run'] if self.runner: self.stop_script() run_slot.setIcon(load_icon('run')) run_slot.setText(_('Run')) run_slot.setToolTip(_('Run your Python script.')) self.set_buttons(debug=True, modes=True) else: self.run_script() if self.runner: # If the script started, toggle the button state. See #338. run_slot.setIcon(load_icon('stop')) run_slot.setText(_('Stop')) run_slot.setToolTip(_('Stop your Python script.')) self.set_buttons(debug=False, modes=False) def run_script(self): """ Run the current script. """ # Grab the Python file. tab = self.view.current_tab if tab is None: logger.debug('There is no active text editor.') self.stop_script() return if tab.path is None: # Unsaved file. self.editor.save() if tab.path: # If needed, save the script. if tab.isModified(): self.editor.save_tab_to_file(tab) envars = self.editor.envars self.runner = self.view.add_python3_runner(tab.path, self.workspace_dir(), interactive=True, envars=envars) self.runner.process.waitForStarted() if self.kernel_runner: self.set_buttons(plotter=False) elif self.plotter: self.set_buttons(repl=False) def stop_script(self): """ Stop the currently running script. """ logger.debug('Stopping script.') if self.runner: self.runner.process.kill() self.runner.process.waitForFinished() self.runner = None self.view.remove_python_runner() self.set_buttons(plotter=True, repl=True) self.return_focus_to_current_tab() def debug(self, event): """ Debug the script using the debug mode. """ logger.info("Starting debug mode.") self.editor.change_mode('debugger') self.editor.mode = 'debugger' self.editor.modes['debugger'].start() def toggle_repl(self, event): """ Toggles the REPL on and off """ if self.kernel_runner is None: logger.info('Toggle REPL on.') self.editor.show_status_message(_("Starting iPython REPL.")) self.add_repl() else: logger.info('Toggle REPL off.') self.editor.show_status_message(_("Stopping iPython REPL " "(this may take a short amount " "of time).")) self.remove_repl() def add_repl(self): """ Create a new Jupyter REPL session in a non-blocking way. """ self.set_buttons(repl=False) self.kernel_thread = QThread() self.kernel_runner = KernelRunner(cwd=self.workspace_dir(), envars=self.editor.envars) self.kernel_runner.moveToThread(self.kernel_thread) self.kernel_runner.kernel_started.connect(self.on_kernel_start) self.kernel_runner.kernel_finished.connect(self.kernel_thread.quit) self.stop_kernel.connect(self.kernel_runner.stop_kernel) self.kernel_thread.started.connect(self.kernel_runner.start_kernel) self.kernel_thread.finished.connect(self.on_kernel_stop) self.kernel_thread.start() def remove_repl(self): """ Remove the Jupyter REPL session. """ self.view.remove_repl() self.set_buttons(repl=False) # Don't block the GUI self.stop_kernel.emit() self.return_focus_to_current_tab() def toggle_plotter(self): """ Toggles the plotter on and off. """ if self.plotter is None: logger.info('Toggle plotter on.') self.add_plotter() else: logger.info('Toggle plotter off.') self.remove_plotter() def add_plotter(self): """ Add a plotter pane. """ self.view.add_python3_plotter(self) logger.info('Started plotter') self.plotter = True self.set_buttons(debug=False) if self.repl: self.set_buttons(run=False) elif self.runner: self.set_buttons(repl=False) def remove_plotter(self): """ Remove the plotter pane, dump data and clean things up. """ self.set_buttons(run=True, repl=True, debug=True) super().remove_plotter() def on_data_flood(self): """ Ensure the process (REPL or runner) causing the data flood is stopped *before* the base on_data_flood is called to turn off the plotter and tell the user what to fix. """ self.set_buttons(run=True, repl=True, debug=True) if self.kernel_runner: self.remove_repl() elif self.runner: self.run_toggle(None) super().on_data_flood() def on_kernel_start(self, kernel_manager, kernel_client): """ Handles UI update when the kernel runner has started the iPython kernel. """ self.view.add_jupyter_repl(kernel_manager, kernel_client) self.set_buttons(repl=True) if self.runner: self.set_buttons(plotter=False) elif self.plotter: self.set_buttons(run=False, debug=False) self.editor.show_status_message(_("REPL started.")) def on_kernel_stop(self): """ Handles UI updates for when the kernel runner has shut down the running iPython kernel. """ self.repl_kernel_manager = None self.set_buttons(repl=True, plotter=True, run=True) self.editor.show_status_message(_("REPL stopped.")) self.kernel_runner = None mu-editor-1.0.2+dfsg/mu/mu-debug.py000066400000000000000000000011621341747546300170540ustar00rootroot00000000000000#!/usr/bin/env python3 import os import sys from mu.app import debug if sys.platform == 'win32' and 'pythonw.exe' in sys.executable: # Add the python**.zip path to sys.path if running from the version of Mu # installed via the official Windows installer. # See: #612 and #581 for context. py_dir = os.path.dirname(sys.executable) version = '{}{}'.format(*sys.version_info[:2]) zip_file = 'python{}.zip'.format(version) path_to_add = os.path.normcase(os.path.join(py_dir, zip_file)) if os.path.exists(path_to_add): sys.path.append(path_to_add) if __name__ == "__main__": debug() mu-editor-1.0.2+dfsg/mu/resources/000077500000000000000000000000001341747546300170075ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/resources/__init__.py000066400000000000000000000034151341747546300211230ustar00rootroot00000000000000""" Copyright (c) 2015-2017 Nicholas H.Tollervey and others (see the AUTHORS file). Based upon work done for Puppy IDE by Dan Pope, Nicholas Tollervey and Damien George. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ from pkg_resources import resource_filename, resource_string from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtCore import QDir # The following lines add the images and css directories to the search path. QDir.addSearchPath('images', resource_filename(__name__, 'images')) QDir.addSearchPath('css', resource_filename(__name__, 'css')) def path(name, resource_dir="images/"): """Return the filename for the referenced image.""" return resource_filename(__name__, resource_dir + name) def load_icon(name): """Load an icon from the resources directory.""" return QIcon(path(name)) def load_pixmap(name): """Load a pixmap from the resources directory.""" return QPixmap(path(name)) def load_stylesheet(name): """Load a CSS stylesheet from the resources directory.""" return resource_string(__name__, "css/" + name).decode('utf8') def load_font_data(name): """ Load the (binary) content of a font as bytes """ return resource_string(__name__, "fonts/" + name) mu-editor-1.0.2+dfsg/mu/resources/css/000077500000000000000000000000001341747546300175775ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/resources/css/contrast.css000066400000000000000000000130131341747546300221440ustar00rootroot00000000000000QToolBar, QToolButton { background: transparent; margin: 0; padding: 0; } QToolBar::separator { background: #666; width: 1px; margin: 6px 3px; } QToolButton#qt_toolbar_ext_button { qproperty-icon: none; margin: 6px 1px; background: yellow; } QToolButton#qt_toolbar_ext_button:hover { background: white; } QToolButton { padding: 4px 2px; } QToolButton:hover, QMenu::item:selected { background: #666; color: yellow; } QStackedWidget, QWidget, QApplication, QDialog, QLabel, QStatusBar, QTabBar, QMenu, QDockWidget::title, QHeaderView, QHeaderView::section, QListWidget, QTreeView, QTreeView::branch { background-color: black; color: white; } QTextEdit, QPlainTextEdit, QLineEdit { background-color: white; color: black; border: 2px solid white; } QTabBar, QToolBar, QToolButton, QTabBar::close-button, QTabBar::close-button:hover, QsciScintilla, QMenu::item, QMenu::item:selected, QTreeView, QDockWidget, QMainWindow::separator, QScrollBar::handle { border: none; } QDialog, QListWidget, QMessageBox { border: 1px solid white; } QTextEdit:focus, QPlainTextEdit:focus, QLineEdit:focus { border: 2px solid yellow; } QTabBar::tab { border-top: 1px solid #555; border-left: 1px solid #555; border-right: 1px solid #555; border-top-left-radius: 5px; border-top-right-radius: 5px; color: white; padding: 4px 8px; /* Tab Padding */ margin: 0; } QTabBar::tab, QListWidget::item:selected, QListWidget::item:focus, QTreeView::item:selected, QTreeView::item:focus { background: #3b3b3b; } QTabBar::tab::hover, QListWidget::item:hover, QTreeView::item:hover { background: #666; } QTabBar::tab::selected { background: #555; } QTabBar::close-button { image: url(images:close-tab.png); padding: 3px; /* See https://github.com/mu-editor/mu/issues/594 */ /* subcontrol-position: right; */ } QTabBar::close-button:hover { image: url(images:close-tab.png); padding: 3px; background: #c93827; border-radius: 3px; } QTabWidget::pane { border: none; border-top: 1px solid #555; border-bottom: 1px solid #555; } QTabWidget::tab-bar { subcontrol-position: top left; } QListWidget::item:selected, QListWidget::item:hover, QListWidget::item:focus, QTreeView::item:selected, QTreeView::item:hover, QTreeView::item:focus { color: white; } QStatusBar QLabel { padding: 2px; margin: 0; } #AdministrationLabel:hover, #AdministrationLabel:focus { background: #666; } QMenu { border: 3px solid yellow; } QMenu::item { padding: 5px 15px; } QMenu::item:disabled { color: gray; } QMenu::separator { border: none; border-bottom: 2px solid yellow; padding: 0px; margin: 0px; } QCheckBox::indicator { border: 1px solid #FFF; width: 16px; height: 16px; } QCheckBox::indicator:checked { image: url(images:checked.png); } QPushButton { background: #2e2e2e; border: 3px solid #aaa; padding: 6px 12px; /* 1.5 * Tab Padding */ } QPushButton:focus, QPushButton:hover { background: #222; color: yellow; } QPushButton:focus { border: 3px solid yellow; } QPushButton:hover { border: 3px solid white; } QPushButton:pressed { background: #111; } QAbstractScrollArea::corner { border-top: 1px solid #555; /* Border */ border-left: 1px solid #555; /* Border */ } QScrollBar, QAbstractScrollArea::corner { background: black; } QScrollBar:horizontal { height: 21px; border-top: 1px solid #555; /* Border */ margin: 0px 21px; } QScrollBar:vertical { width: 21px; border-left: 1px solid #555; /* Border */ margin: 21px 0px; } QScrollBar::handle { background: white; min-width: 21px; min-height: 21px; } QScrollBar::handle:hover { background: #888; } QScrollBar::add-line, QScrollBar::sub-line { width: 20px; height: 20px; background: #3b3b3b; /* Background Tab */ border: none; subcontrol-origin: margin; } QScrollBar::add-line:hover, QScrollBar::sub-line:hover { background: #888; } QScrollBar::sub-line:horizontal { border-top: 1px solid #555; /* Border */ border-right: 1px solid #555; /* Border */ subcontrol-position: left; image: url(images:scroll-left.png); } QScrollBar::add-line:horizontal, QAbstractScrollArea::corner { border-top: 1px solid #555; /* Border */ border-left: 1px solid #555; /* Border */ subcontrol-position: right; } QScrollBar::add-line:horizontal { image: url(images:scroll-right.png); } QScrollBar::sub-line:vertical { border-left: 1px solid #555; /* Border */ border-bottom: 1px solid #555; /* Border */ image: url(images:scroll-up.png); } QScrollBar::add-line:vertical { border-left: 1px solid #555; /* Border */ border-top: 1px solid #555; /* Border */ image: url(images:scroll-down.png); } QDockWidget::title { text-align: left; border-bottom: 1px solid #555; /* Border */ padding: 5px 8px; /* Tab Padding */ /* + top/bottom border */ margin: 0; } QDockWidget > QWidget { border-bottom: 1px solid #555; /* Border */ } QMainWindow::separator:horizontal { width: 2px; } QMainWindow::separator:vertical { height: 2px; } QHeaderView::section { border-bottom: 1px solid #555; /* Border */ } QTreeView::item, QListWidget::item { padding: 0; margin: 0; } QTreeView::branch:has-children:open { image: url(images:scroll-down.png); } QTreeView::branch:has-children:closed { image: url(images:scroll-right.png); } mu-editor-1.0.2+dfsg/mu/resources/css/day.css000066400000000000000000000135611341747546300210740ustar00rootroot00000000000000QToolBar, QToolButton { background: transparent; margin: 0; padding: 0; } QToolBar::separator { background: #b4b4b4; /* Border */ width: 1px; margin: 6px 3px; } QToolButton#qt_toolbar_ext_button { qproperty-icon: none; margin: 6px 1px; background: #666; } QToolButton#qt_toolbar_ext_button:hover { background: black; } QToolButton { padding: 4px 2px; } QToolButton:hover, QMenu::item:selected { background-color: #cccccc; } QStackedWidget, QWidget, QApplication, QDialog, QLabel, QStatusBar, QTabBar, QMenu, QDockWidget::title, QHeaderView, QHeaderView::section { background: #EEE; color: black; } QTextEdit, QPlainTextEdit, QLineEdit { background-color: #FEFEF7; color: #181818; } QTabBar, QToolBar, QToolButton, QTextEdit, QPlainTextEdit, QLineEdit, QTabBar::close-button, QTabBar::close-button:hover, QsciScintilla, QMenu, QMenu::item, QMenu::item:selected, QTreeView, QDockWidget, QMainWindow::separator, QScrollBar::handle { border: none; } QListWidget, QDialog QTextEdit, QDialog QPlainTextEdit, QDialog QLineEdit { border: 1px solid #b4b4b4; } QTabBar::tab { border-top: 1px solid #b4b4b4; /* Border */ border-left: 1px solid #b4b4b4; /* Border */ border-right: 1px solid #b4b4b4; /* Border */ border-top-left-radius: 5px; border-top-right-radius: 5px; color: black; padding: 4px 8px; /* Tab Padding */ margin: 0; } QTabBar::tab, QListWidget::item:selected, QListWidget::item:focus, QTreeView::item:selected, QTreeView::item:focus { background: #c4c4c4; /* Background Tab */ } QTabBar::tab::hover, QListWidget::item:hover, QTreeView::item:hover { background: #d4d4d4; /* Hover */ } QTabBar::tab::selected { background: #e0e0e0; } QTabBar::close-button { image: url(images:close-tab.png); padding: 3px; /* See https://github.com/mu-editor/mu/issues/594 */ /* subcontrol-position: right; */ } QTabBar::close-button:hover { image: url(images:close-tab.png); padding: 3px; background: #e97867; border-radius: 3px; } QTabWidget::pane { border: none; border-top: 1px solid #b4b4b4; /* Border */ border-bottom: 1px solid #b4b4b4; /* Border */ } QTabWidget::tab-bar { subcontrol-position: top left; } QListWidget, QTreeView, QTreeView::branch { background-color: white; color: black; } QListWidget::item:selected, QListWidget::item:hover, QListWidget::item:focus, QTreeView::item:selected, QTreeView::item:hover, QTreeView::item:focus { color: black; outline: none; } QStatusBar QLabel { padding: 2px; margin: 0; } #AdministrationLabel:hover, #AdministrationLabel:focus { background: #cccccc; } QMenu::item { padding: 5px 15px; } QMenu::item:disabled { color: #b4b4b4; } QMenu::separator { border: none; border-bottom: 1px solid #b4b4b4; padding: 0px; margin: 0px; } QCheckBox::indicator { border: 1px solid #222; width: 16px; height: 16px; } QCheckBox::indicator:checked { image: url(images:checked.png); } QPushButton { background: #c4c4c4; /* Background Tab */ border: 1px solid #b4b4b4; /* Border */ padding: 6px 12px; /* 1.5 * Tab Padding */ margin: 2px; } QPushButton:focus { margin: 1px; border: 2px solid #0f53e7; } QPushButton:hover { background: #d4d4d4; /* Hover */ } QPushButton:pressed { background: #b4b4b4; /* Border */ } QAbstractScrollArea::corner { border-top: 1px solid #b4b4b4; /* Border */ border-left: 1px solid #b4b4b4; /* Border */ } QScrollBar, QAbstractScrollArea::corner { background: #EEE; /* Background */ } QScrollBar:horizontal { height: 21px; border-top: 1px solid #b4b4b4; /* Border */ margin: 0 21px; } QScrollBar:vertical { width: 21px; border-left: 1px solid #b4b4b4; /* Border */ margin: 21px 0; } QScrollBar::handle { background: #c4c4c4; /* Background Tab */ min-width: 21px; min-height: 21px; } QScrollBar::handle:hover { background: #d4d4d4; /* Hover */ } QScrollBar::add-line, QScrollBar::sub-line { width: 20px; height: 20px; background: #eee; /* Background */ border: none; subcontrol-origin: margin; } QScrollBar::add-line:hover, QScrollBar::sub-line:hover { background: #d4d4d4; /* Hover */ } QScrollBar::sub-line:horizontal { border-top: 1px solid #b4b4b4; /* Border */ border-right: 1px solid #b4b4b4; /* Border */ subcontrol-position: left; image: url(images:scroll-left.png); } QScrollBar::add-line:horizontal, QAbstractScrollArea::corner { border-top: 1px solid #b4b4b4; /* Border */ border-left: 1px solid #b4b4b4; /* Border */ subcontrol-position: right; } QScrollBar::add-line:horizontal { image: url(images:scroll-right.png); } QScrollBar::sub-line:vertical { border-left: 1px solid #b4b4b4; /* Border */ border-bottom: 1px solid #b4b4b4; /* Border */ image: url(images:scroll-up.png); } QScrollBar::add-line:vertical { border-left: 1px solid #b4b4b4; /* Border */ border-top: 1px solid #b4b4b4; /* Border */ image: url(images:scroll-down.png); } QDockWidget::title { text-align: left; border-bottom: 1px solid #b4b4b4; /* Border */ padding: 5px 8px; /* Tab Padding */ /* + top/bottom border */ margin: 0; } QDockWidget > QWidget { border-bottom: 1px solid #b4b4b4; /* Border */ } QMainWindow::separator:horizontal { width: 2px; } QMainWindow::separator:vertical { height: 2px; } QHeaderView::section { border-bottom: 1px solid #b4b4b4; /* Border */ } QTreeView::item, QListWidget::item { padding: 0; margin: 0; } QTreeView::branch:has-children:open { image: url(images:scroll-down.png); } QTreeView::branch:has-children:closed { image: url(images:scroll-right.png); } mu-editor-1.0.2+dfsg/mu/resources/css/night.css000066400000000000000000000134341341747546300214270ustar00rootroot00000000000000QToolBar, QToolButton { background: transparent; margin: 0; padding: 0; } QToolBar::separator { background: #6b6b6b; /* Border */ width: 1px; margin: 6px 3px; } QToolButton#qt_toolbar_ext_button { qproperty-icon: none; margin: 6px 1px; background: #eee; } QToolButton#qt_toolbar_ext_button:hover { background: white; } QToolButton { padding: 4px 2px; } QToolButton:hover, QMenu::item:selected { background-color: #333; } QStackedWidget, QWidget, QApplication, QDialog, QLabel, QStatusBar, QTabBar, QMenu, QDockWidget::title, QHeaderView, QHeaderView::section, QListWidget, QTreeView, QTreeView::branch { background: #222; color: white; } QTextEdit, QPlainTextEdit, QLineEdit { background-color: #373737; color: white; } QTabBar, QToolBar, QToolButton, QTextEdit, QPlainTextEdit, QLineEdit, QTabBar::close-button, QTabBar::close-button:hover, QsciScintilla, QMenu::item, QMenu::item:selected, QTreeView, QDockWidget, QMainWindow::separator, QScrollBar::handle { border: none; } QListWidget, QDialog QTextEdit, QDialog QPlainTextEdit, QDialog QLineEdit { border: 1px solid #6b6b6b; } QTabBar::tab { border-top: 1px solid #6b6b6b; /* Border */ border-left: 1px solid #6b6b6b; /* Border */ border-right: 1px solid #6b6b6b; /* Border */ border-top-left-radius: 5px; border-top-right-radius: 5px; color: white; padding: 4px 8px; margin: 0; } QTabBar::tab, QListWidget::item:selected, QListWidget::item:focus, QTreeView::item:selected, QTreeView::item:focus { background: #474747; /* Background Tab */ } QTabBar::tab::hover, QListWidget::item:hover, QTreeView::item:hover { background: #5c5c5c; /* Hover */ } QTabBar::tab::selected { background: #6b6b6b; } QTabBar::close-button { image: url(images:close-tab.png); padding: 3px; /* See https://github.com/mu-editor/mu/issues/594 */ /* subcontrol-position: right; */ } QTabBar::close-button:hover { image: url(images:close-tab.png); padding: 3px; background: #c93827; border-radius: 3px; } QTabWidget::pane { border: none; border-top: 1px solid #6b6b6b; border-bottom: 1px solid #6b6b6b; } QTabWidget::tab-bar { subcontrol-position: top left; } QListWidget::item:selected, QListWidget::item:hover, QListWidget::item:focus, QTreeView::item:selected, QTreeView::item:hover, QTreeView::item:focus { color: white; outline: none; } QStatusBar QLabel { padding: 2px; margin: 0; } #AdministrationLabel:hover, #AdministrationLabel:focus { background: #444; } QMenu { border: 1px solid #6b6b6b; } QMenu::item { padding: 5px 15px; } QMenu::item:disabled { color: #333; } QMenu::separator { border: none; border-bottom: 1px solid #333; padding: 0px; margin: 0px; } QCheckBox::indicator { border: 1px solid #6b6b6b; width: 16px; height: 16px; } QCheckBox::indicator:checked { image: url(images:checked.png); } QPushButton { background: #474747; /* Background Tab */ border: 1px solid #6b6b6b; /* Border */ padding: 6px 12px; /* 1.5 * Tab Padding */ margin: 2px; } QPushButton:focus { margin: 1px; border: 2px solid #929292; } QPushButton:hover { background: #5c5c5c; /* Hover */ } QPushButton:pressed { background: #6b6b6b; /* Border */ } QAbstractScrollArea::corner { border-top: 1px solid #6b6b6b; /* Border */ border-left: 1px solid #6b6b6b; /* Border */ } QScrollBar, QAbstractScrollArea::corner { background: #222; /* Background */ } QScrollBar:horizontal { height: 21px; border-top: 1px solid #6b6b6b; /* Border */ margin: 0 21px; } QScrollBar:vertical { width: 21px; border-left: 1px solid #6b6b6b; /* Border */ margin: 21px 0; } QScrollBar::handle { background: #474747; /* Background Tab */ min-width: 21px; min-height: 21px; } QScrollBar::handle:hover { background: #5c5c5c; /* Hover */ } QScrollBar::add-line, QScrollBar::sub-line { width: 20px; height: 20px; background: #222; /* Background */ border: none; subcontrol-origin: margin; } QScrollBar::add-line:hover, QScrollBar::sub-line:hover { background: #5c5c5c; /* Hover */ } QScrollBar::sub-line:horizontal { border-top: 1px solid #6b6b6b; /* Border */ border-right: 1px solid #6b6b6b; /* Border */ subcontrol-position: left; image: url(images:scroll-left.png); } QScrollBar::add-line:horizontal, QAbstractScrollArea::corner { border-top: 1px solid #6b6b6b; /* Border */ border-left: 1px solid #6b6b6b; /* Border */ subcontrol-position: right; } QScrollBar::add-line:horizontal { image: url(images:scroll-right.png); } QScrollBar::sub-line:vertical { border-left: 1px solid #6b6b6b; /* Border */ border-bottom: 1px solid #6b6b6b; /* Border */ image: url(images:scroll-up.png); } QScrollBar::add-line:vertical { border-left: 1px solid #6b6b6b; /* Border */ border-top: 1px solid #6b6b6b; /* Border */ image: url(images:scroll-down.png); } QDockWidget::title { text-align: left; border-bottom: 1px solid #6b6b6b; /* Border */ padding: 5px 8px; /* Tab Padding */ /* + top/bottom border */ margin: 0; } QDockWidget > QWidget { border-bottom: 1px solid #6b6b6b; /* Border */ } QMainWindow::separator:horizontal { width: 2px; } QMainWindow::separator:vertical { height: 2px; } QHeaderView::section { border-bottom: 1px solid #6b6b6b; /* Border */ } QTreeView::item, QListWidget::item { padding: 0; margin: 0; } QTreeView::branch:has-children:open { image: url(images:scroll-down.png); } QTreeView::branch:has-children:closed { image: url(images:scroll-right.png); } mu-editor-1.0.2+dfsg/mu/resources/images/000077500000000000000000000000001341747546300202545ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/mu/resources/images/adafruit.png000066400000000000000000000346771341747546300226020ustar00rootroot00000000000000PNG  IHDRddpTbKGD3fK[ pHYs  tIME t2 IDATxŽ}mYUs9*>K((H ņM%A-2l?`cJ1"hX!!*E%6)zU=g֜\kϻAF1xs>o?QsH){$l6<@PD{("U  9; s( fFV3AA# "s*}쳽 8DIvG8 v `ff<;*IDPUs TD#q@5ރ A|~, ]78yASz f#i誊")*rJ<϶"`!dDB9)%JYjQERQ1'!by@@VFJ ,~ ǔ3rfmP#)C)aN @̹n`[ǜ@LHQ-RJq~\. "Hў C.RNv٨\NAn\03bvApp|9Gp$9$(3v r4rg Pu09;y'v8r~%$b#Dhy({v = |~rte1UTb}hbc,zPնUSZŶlr6q`95ua( jHY v$9d(\7"/"{mJ8"Y}_8#@ʀH&ဩ\Ad(@@l+\!P\JAbrY8"1" RTHLk! ;盤u lB}r QEP})k&"_M*͆, "# U P(p~@Ll!6 UmzB`dMl3Ɉ)avZ-_Nh m!g! (ECsSJ+URjF0v 1p *DZ9KapEc6YeH9SV%C&1bJ `j~>M33ik9%01Bp$z$q841"SV*ViV 7bH)0hR@0 bV@Er 8y(0{(yq*1g!8j)jާa v#vޏp`oj͘$&!cyN3#U# ):UUU==P5ui9粩1%T60 Ԝ$]r`BRRdH6opM*e1̳#ͭbNP2-4" Up.qhcsDdM);Hjv 5H<3!DH)b9TB!M~'h CfF0y/FKP| ԥ @ Ҍs9HµL* HN'|g^xES~/"8RErU 1T#h2,S`ӳ-x^mK)rJE: H1YAu׸\ϊTQ3Pc/HQqf8Ը-p3DJҒ`??aC`0]Tt es%&kA)7xm%2W!J`b.Ws0 Ro1EP P([Q  ]Dqex{!OdQ˫]z6/b*V%#E$ fP*1f6xM Ây " %ϩT0Yt}hc(RB@, tWk=TSˁԟ{?}ڏK!qh?\;_Tq# cyW5 n_0.aB0lʻ 8bsQM#k8لOL SՕH)5jI5\fwÿdjk#Br6չ)e\Nn70K/(K 36urbRFJB9E۔!\\^ lgij;+%h&QXRsL5QTzHLr[0=A|Encl/bٹ,hC0U ,Ӽ !4t~}v ˲4c[]ftS"im.hsC$/D%mˆrJ6#E鳿{琞eiW"*9g.PKN;0٦%S! T_h 4/k1@$ER9- T@Dk$ B-U1#6]a15iQU( R2}y6C|;/|v cr.yS#4é ػ5HHi'\6McBΩmJD՛'98_s -Wِ0rl)4M׼ͲYݣm laX{:IU1X`\c1DZ ޕR8Wl,ԝ~lY!7 2?=$L `g@[ \+Εt_#n5sܾ@,9k05*/y1)@Wv{4T5HQըycn3,ic4.Xv93$8W# !kUrJfCcZtp+M-rm CXrWgn2F_ D{?1&_'86LE đS4c,dUC_Z JTvabJ%͆KPɔa@ )+NBt$U*UC=LjU޽: "@M"*jO0o(vKPBiG a'%0^ [Ȧj3%R "j<+s5ҹuUTaT lb\hbk[:+vq窭1;X ,kKʿiavo!h151M5xw=1 l1 %` U4_"L\I1W4MjSY1F ?l V"3UK:&K[CIJ^ 4,G**iqA1Y>`Ww992ِ4Zi^jw1f]I9H^XB-;\"T4 R Ϙ'yÓ}\8eɃCF$@VC3Qv") wn!3!JPlhE#ܭ]@0X(VWjdCJW|O.%GgɀVWˆ<8yr0l(Pnt~B[MDMJw`|(p-~ 'JMB.@poÚJ=)p" ?ͬywcf6,Eb*m"OϫeF 6#-($Nؽ浘-hkO}Wz4/ovo˿ VdQPTHݪyx^sa`f]GK. -Vr]gc MkP) (i1I) #0ahb:v{,iY2 Wה7O٬ǒ=ת>͘N/ߵ_!_؁8ɷS ')%9UUn,wctTs}g \|;cG/\KW7^ 0bE?&\zcgbzcv8vϐl0H7r3b͝Kxf0|R9n|fcq3!%8rVvg^sQsOمܾ@q c\~nɏ}!EH~4ƤY*6..?Ao W*dpdjU19T>Q>=0),:0M_߆g>W;RQ*:ω /? =>衸_Ro|4O#0í7ށaG/A2y̋kJN0@"q3hUDaЬ߶Tl)rG ! ш˿"I\ Ko=٠/j0GT }v\wn[gix"V!]5{Q5q'/݉./#Gp{ ޕxϒX\0JYKjM[R9Լ4qe^Waq@\5~bI 8PN@%Ug? 4~W5&u:e1N|~ v~4deЎVbuc+=My8fl6_{-ƗV=<( _lI?8z~ Unc> r%T>{/G|-ZZJgggz\.jlj<*ȭED x ~qH^|AW{?;l 7PV(N0'#51iu-6*RP[`bҰ%g o*e7wyYO|Ocx-6'~@RaF1`RBf~hWb~)5-W$s)B_x.̿[}+y@{ ?08[ gOO1|nAabݽLpwb}a=[o-YTSR6k%I @GN-JO,#"hΥur_6y9gr_OqaE(}hri; utFZp˿?="҃'!>䡐y.vPP)F[͐xp7p 0@1 \QG Epx],E札X}YߤyY?CUslsW숾OcIpg;ݝ?[>cqcgZHhz*ǻ{!=$WCk(B2_cП En ])wBO;K>acĶ*}Їk|(e*IŻ1|oѬےZZK kie4C/B_H_UH!/{߀00 v?p%o𧗠~D؜`0XwҗH)r@7cjkAd˩< Ͽ@IDATTKFKB˥1ø=p͵Y=M}\]aG^P&;%ހq򯇫@d+s7<<)h{ɽ0_ ؏Pf<449J5*l A`W>-w1/w]uf0Yo_{A2|{04dZdh@(l0 f Ӑr-ϿoZ8uD]Xo. qA? p15EЊIG4DG%El ?uEANN7pb;?v |p>5"pa i[-;9A8:?:A`ؿ]l. 5gS8HsW 5aXd Y\˭Kkκ֝Vūy8}-H:J'!19p8aħva |7[$8{7+6bo/D.!-FvnO?ܸ-h64t*5!@%֪Kw chWI|ŋ*YF%ƻhx5. (쵿hv3ZWS"{ pG[ iڃ0[tҜa  n{5.b<>xt JEYL=6zm-rvRZ:p`.)ϥ>""+Y0 RaG(ꚻG.^Y7܂Oleu?=A#3vkmQD[$__0b°A8½/]ntX&Zi0XJfiT+ƖJ O5"0 PCG;-ӫfzЍ{\ۍU"ը=cwD0Ӫo3#N&kHׂ= CJ6RڻfVۓ?3^qU͠~ 4˪j<,UHo,OKw{aVw>g~t3bBrmTE1!5A爗U!W +w7d%77ɼކSN)uUMv{Hgs(Λ/=q)D@ 7&N~Us900y !EWN&$+[ OPPrzLY}3!4BՂaW',(b/z>n:~|=B"eEAQZþ`o/CzkI+͑f^2r3K.~Z7BF3T-)sXqbp}HթahY*aՀ8!~3KyM HB8 fZ&gybKcF$pp7iw̚Oz{C;ڙ< NBs蟼 ~/OCŕ Rk) @ӮtmV^fz5 }-Yf꺞p]zCT90?ϟ0=˟c/Vipc0XeŨblj\FS)=_)" gl!(zQS]~.+N)c~nWSIt8x  ~+6~AB^kۄyhڂ2rI@m/zQ\F ؼ?"|MN ׀݈q8nKS=]9J)_4,=$E;GӴku6uauGJl^sn5O L"ejJCh@4a~KUa9NPWph}pf{ m3B9цIG6HVl0%F8O]ѪUW," Ia[ =|<`ye@Y7KZ\ܒ3YYEZ˪ ֫6u9%6rUt~\9 !?GNl1Y[Pt7zZL_|Pȿ#3_-]Ju^[ h*rKKh[db⒵-4(j3ah'9V .\ +g~B~gLz+.^ Տ .{cFV uƚOg8}ָk^d)2.+ZyUXQn8==s ,cDNcۆ: + b*K{#W]yoؿ<|P*Yk*f*]}=W;LW\7AJۨ‚gv; Р7P~M=e61Z8yI`1rǛ~\oZk  _}}*܇໡0G˘Ҩ>"m[*EPFִN0BLk1`3#in aVP:uq2%9[ RYI m(q+al@=M젂 ]:qkhZGxodi_ ^m6u]xuny -c{L"1Np?w1o#UH~XWyb81ODeCA[pQZYCio6|^<[^tJ-Yuo/^"0ظ~+S,'4OpN~. q#\>TEsa;]OXc.5TpM1Lj8Ms7U W\9NFANb^Um[~'$'t.W9(uvH\8/Z-J\RoWt52r|4c|ӱyO_*^Hb}7{fHJZsfZô×Yj $ȺAҮ,K?BbYѷueCe2Wr\w 2ƁA=Wτdl9:>(^}5tj3z rZ[q[|*eU=;;k06Ozvwz!˒A8;)!Rʢk?'fkc5^.n XvRbܭIP$xjBx^`!;WdD撯(̫nG'yAOmxp9y1TIٜ~Hr?OS]6Z+F; J1WeVn,乥˯r,RB#/. lR|`Wck.ePS,]oFϐyP~㥏!&hɜCks.#*Oů0K`=.UZĹoSJ\U b)֑¸O,R[mJ+DWXf6/:۸cSW&-s[`R8CsD@>y'? b8>(4eZa1blc=) 0[K 16Z5j33YER |p~Q#cV~\<*VTV#FBXŚ R/+Fr9! C'WHXUr Uv(K ڛ9!Wtu5ޣe SV]Е -@U]r.U_Nd ,6ʌ5KS{Ֆ]ʃ"o6&w(n[sfcz9@,mk' 1b3( :  2] 16-]gwy-z]E_}S*NV V4eCTl D&xp=OZ@_)`kg{! rS㸗Aj >k-0rU^U_ Xֱ Kޡ^.P+LՎmcC1GxGHkIqLHqF*# &HNI B~>ϸu_*\Z^7X5|_jbH3W__U T"&(FiQL!*ID%s'rOg+tua:{ ⻗n# F1Jc9LRL*!]!L$b^đ{h:;JXm '3'٧qdKJxʁ(!iaA?d:9.?L?3,ŅpCRB()4j(_+]q *oi#L).Js.4:'ҕyWMdT|GQjYI)x HThH$*w'Ǖ С6J)rŖ E sjtƕx!=j(EVR~P"!˹Qz&ĕ5q5˞vQ EB.>t'=yœٶAmSl9o󢒹-JRLSV+X].~!fh pf0] ^3 Έ?; ;!fI(0b}7YoWBbgbG@R L:jBar B9} |HhHg:u Cx@`,.BEH= ? RM:BCGٺ ak-'A P;$!D]4wА{&wVGWH8"?#Jy~jt]WjMi6s}h{/t\% /Dm{a! Z{ˮ^r78F4-Mߓƾew=1|̹aVVSB:.ǻ# M%7 W{^g9"oT_!?X;[ų;r#Sz?ѳ%+FVCvnT9p"R"g]Rù4!BӾ [Տ$!Mv;Ql[R-nXժX0^t[3xo>ґFiZOwa)3y=Ϣbsm%t^d/ }zYwH=[E[q A5*dOkIG~-?*0גp^.X5k6ò.ηW,j`:N 6d\Rw{QSZN_!\_֒#=yo[͍gyoUk:c҉1Y3Hߠk[[Iim,izjP~ao(;z%殩HO ˪!u^Fw^S Cms8afgeM[!JR=՝&OtMkEچԕ|!'ӚQW5y\سĄtOݫ^4v7T{^RI +(YYmrUiyW1uK2ٺ(fpAe^x-ґ{A݊i+/~ r֐VXE4ZZS:Ɔ5,i*9%]V#_jŚA5HRgSJ+fVR5IvoHSSwNUblwN1[\K]04Dq0_7<XL8ԓwzډFy Cy׹ZUYS5~DqCBѪFEK:ݫZ K('0D%VC7})#*Iﵪ"?34Zs'GfCy\ \ZR3YV+De2VKk~E ClWii Af ChIi"ZH JȊb!zQj UGV0eY7}#UHKTGP15ZUYRE~ %U>^KkG~ʁ!^Nnh-RG> I9Z H0tD4Zs*4Z˾jH#!֪R5~t).)hHtXm2ك!U!-ֲ/E#'Km 7@%ː߬fI],:z-lXARCE:4N7_SGڅ`z(^7 HՌ9+nnp-u)rS16-+:JKMf%Ҋ0^K4!xi(Xn U7^L"B6H-kx ZuvH}CPNڷS3B;jKRКP8J#(޾+AyY+_foږ] (OK=h]8Q;sHՎC!=+{儤rӄr#/잳@)bC'U""|hzKRpWv4ꕙ|HwnxP+QdaWC}.Cn! GZE)rbR P9{mJ~)n@Ujz=XxA)Cl?TTGQܪ}SP l[.f eMߣ^<ӦEe{itLgZIݧ;(jz'! GZE<G:oڈ>cw[ak;t5FVC98Z(EkPSZV0?{F5 [i'E[%!nr!l`ICz&t(OHC}zzy͠ɇfhEZzDՐJ#^-߰Fi-\vˤ#BY bP\Y9X(]BK RK&Xo RKW,ǷYw7o BS)߲uirW.Q^J6^πZ(2K0uk+GU6NݧA ^56ߨ;xKȷE7"yrʐB/b?<_c,jk-w1],)oŢ;C)ԼTyyƂU?b u1 lވw)޸nЊ&yEۆ4ԶT:>n ZZ Ml(+ʗ: ]*R_+{G`Zs h6\7fIg;_TSg(t]1;.__6)x #B'FՐZDfwPP4cRȽfri}eV $u ~w]cM ?h7&7仯'~EuZ=\Qlo(G\iz=:{Q,@ zs!K3,NԲZF}- 70s<^?xjw3o!TyM?tF;.@4D,Zo&t3=Pb1/ KЕR#aM@<Cuv[`tY]xlLuF%? kjc>UufzvBmƒwsdbk%(z6 |a͙]֒IJgl?hL5z+i0*#7p+Au9L| 54"r2 \ ~߾,Er.SH º 0U4Xx!e[Rt2&7 /5]#_F΋վ,`iڶ4B{~3oDK0q/Lr.~lEB-`3Ob7?0=P@9p"v%[fU># tvQAwV4eo7HGō70 cP= LWw){ T|T;IJĤQ(#J3)D%}9SIH lHGdٍt`0=[u_AIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/check.png000066400000000000000000000161741341747546300220500ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  0=ъ IDATxy\UǿվwWkV ;2.##3  23|A@AupE*!餻֮5;~U~O>Bխֹwι &T$4(lj%3EɅQrm;Id@O?jF6"lMh4kZż{yc(,XMQ3[m]E59璳!_p9> ilhX%5;`>jrȹfń!aMkm,eVٚy 9`X"EF} kewAKũvC';_^1!-|]?d[X1!5t+BO`IX'#ZB42c Ar{QlgQr!f]N!]u\ńt&BIʉ`U]d~_ubB:-C8yN875ɑBB|9 锬9=0ߣhc&ty[V/ HWY2k֒dbC1+̠IY`ՓW9 i!SF k썙,7-`K~0 ђ C6f ^5 Zj./=dev ۱DcUxZy:Sz  .WNzI]K $^/[4={ ?g(viy ր@ .PLH'\{>(wh!x" \o ycJP=.rbB3#b2u_=΀`qǓCezbOZwɆ+U5+i|]JxsPw68疟耡`ibm$[wR&7B8 "W܆]<kXÎXQ gW4;(n| T8QR]Em9]u)i4/c/+^fhO=J{z>Ii]/lk>(p!4^.5 [[W_os,$rl l+Q3}i0p ]=njJuCyHU [Q-hFh)9_ _dxRJ %;RxcS3sSy.,:Kj c=P)YHc+{7QrVC&dR:j 0v۔:e F6w(=iTqk!5Dx󕒁4:Y/CPݹvnekLQ" ݷ#joe|ճC W7+>|Ƅh4tXPJNιcN1,p\uaasWUPNꢱU3tY )h=EV Mt? 졇o-8MXfRٰ &0ws<k d »T|Y_! z >F|%k<4 _?w/- A-\-844}sҬ{& >{Ė yo&<]4o N% !.(^(fݔ vm?;%oK%?@;QA,)Ǣn{L@,Gx:Zg;';#,<(i; f]\C^1-Ɔ [Y4\`>,u՜ MlxrH?ͣvE9o䵇֒>#$aA\Rl0fX[X bJ D>l 0{y])V`w Cj=ߦ}]bj9S~4{enLڮe mE>r?yH3]ր+ͅ84:%l76T}B^)ч!<"$녪Nh \q8EOʚ{z\MٝH8x&-OyZ-{{ݸFFG=ep!c5Sς֚Ҿa1HcWD[ٽg /$^f_55E,䪻{914{CC>"܏?PHM+: xI.JxkWva>#3z4;-TfuZAT_]PxrGF|dZi^bצ{m Kb1DhS_^,k>//l[Nlh43k8,wm{ "^\A6WTÚ>79K [r[ bc~GIVtל9}arZwjOmk6 -@ xH#/JF/4Ny|ϒ,Р^ЂUl[Xi,~B#DCbBH"kѽNׅl%%Rҿ |(Z .;K;C*M'z |NJ&T }*%ĐZG6h;vA, #e{46VHB[)ĽXBjّ>,7MzU ng!j {t&{{v\+KQ$/!ljVr=;$r=F~Ei%Y(wܺ4KtKlԒAuMm̓\9_^7ȳVƥiJrij,c\u󤳹w>M4r2j퐪IH0W6{^tPd+ϛƒ޼NZL:uo[1}4V55nIAM||N7Wͯ~ I:O=DCªgĪAnYXyqϮCU \L1[l}[fJo=9۩48WY}+*8!٭S}ǎi.EuP,ɯys֚{QYH+|N6q/aψ?gMOMrl?t>b/#:]J\yFr* }x%x$?J.UR־svɧj 98lW^Yij>`8(c3CC)iHK<샂OoqgbBLykN>5 &)@vE2\s+ƛ4w;xM3`ɼs{<=e4tHnu> !MlyX8 9G3,z"Agsovi :>zq7}9űiXuNZL6}W˙rF£³KYm߂/R҄`զY{j@Qױ->~a|s&wlX<9:iŏGҍ뻇ѹ5D@P,Iu.^ +;;GfT)Ew$:c~,z#"T,LU3G}BnQw:,54x`>_UR0O[~9l.LZdΘ{'YI\ !9嬮yTͅA u"]D`YzrT_ p_8^ͶT?w1[~bV+7eFgy}4]w u7d=yš re޿)e H6\5:7%N= 3'C,,>WH4%U{Q~7ds)kdcE_p2/Pr<@u.EECMTC&8>Wۗ ;J!}%i_`f!RSb#lfМ'ݼ:oH}5Tݿ߂9%OC3S SRWJ}8 .L105ƫ I/"Rdj9ׂS #}ζo/7U|ozm!ZI_Zp7 Wբ$ZnB<]~ #)_P=$ZnTɔC ]$ʿfXUHvpA؜g k_䖢 [PUg /T46|M:nS}UDHd? L(>p\|wy5=\os,̿-P}}O9e߄)Ptdpw_)Ds튊6p𑂚쭌݁zRF6w(7=hUt:6hop4b# W7 L*[/V{ Vq' A-0|R62v;SҔ׿ PH1MS`lXO-N.边h! B{{XR{^bxLwU. }ǃCФs??+x$ Wר5M_ڳApj)uZ'Uu͌-R<k^Ci*4}-rBK{,^֐-ξh6l+Nן,weOɽ#=M'+3C[~p&:`!zjJNl${8Ppߊ5}`;3׏zbOd}'l(e6ðAE@U?Jw5< /@ Ц zH5\lðaz#,p*E:3'!o{ck>d5x Ņa$~/CLI{A-}AgDVc \R}YO/K΋XHs67fsެdo{-Xz 5{ZDRٰԖ Hꯉy%m=des BIvqٍi_"7F_Etnk%?( ?j{6 u^L&D4"Y`08z۶ qX(.`4_tݖmۀnT*!{NӴ&x8uڲ,b+e9ObVy4%~_Z7fgN'5x\($r9N@DUUսv4hif^7w?SDt]x<Z ˲0˲O'Y&(IOOVf9oA""eqRXyM$/CbS6$IҷT*ul6aV}qtW<?bJDP(,?* m@IIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/close-tab.png000066400000000000000000000004031341747546300226300ustar00rootroot00000000000000PNG  IHDRabKGD pHYs;aIDAT8˭ Cni=Q2a&I&8BLK:2z9[U1V\ZzE+X⑛J)\Vb爪swUqi7g$HѦwb#3§%Fb7Qv9D"fvF&2VQ;s>y<9v`T(.Dbo}zp$ lC1ZV+]Ŏ٪PzF>B6>AIl ]a8aاۧO+Ϯ iwԆEBDIv\ ݵ;k.{<"=uJ-?Qj%Kݽ?I~$KWk@B^F FpNt}w>IaxKEҼWHRle=TF>cHr(By_¯`|5b 2tמ$/HTn|[y>X Yr/;(B 86I{c"dH`U\$JY!͈lG_0΋HH%Vq>^QtB|>i| {ߣc]ʖC%C02> 'WAJebt]ybT7TUsj}3Ml'R . it{zz/5ѹcf‡1b'Vgb4ΞI~!5yʀeD[zx8$v HC.m]^qfľKt<QIADoxjFo ]7֥/R9j7\5 [-m4܆?YvJ3=,=ۺ^*?i 4-! pDr S{-4`BZ5^; 5~B3 'W@ukTq34e 1.HcǭGs,sޢ/LBu^PTv+HckzUꐆڤiq]b`So[$W\VdYzёjf4+T8'"x:Z>`>kE(~`8?V?R8ج% |;`2 aHnW1 a_ؠۖ?E iF,NA&( +s] G[%t1] - ]) - 9B(.e0Hx"YTo`M_% -wkWW})XwtFF4$m"dA#'iűAE޳0U.0#?V&1._[n3ARЖCu:#Sk;x/beK׸Yiʂ}ꇮ0>Ͻ6YXUahv &j!}ƽn<'tn~%j#y9tf~C)qZ?iC'gHL] ~zcITEA'KI GЫWZ)FT|`T,,_p,mn;kN jO`]CS?M7 E>XEh|w޺NyMg7==8|~V!}{M '8 7?2~o[cZ ^WN Y{ m{xwtķ[2H=S~zjCYoENfm}V>ZtT(=8?/w4u~lt$n|Sw[~hAǗU ";L* ~KNٗf7d`Ey RA{94r9k8vVEhWrg(k@Ik{o%9TU|_9R1[+7H[4b4HWYvSn#pmԑH,~.ykQ CG_eEKH|)s9)FVoiTQ~97m涋܍MSwp[GMw,y@8:bTROڇνk/MthfYq+8as"۸T;Ɣ2ח4r?=NUi]QMp!xЬ|ͷicMz輜.s&n_x?}UB} Gt 1@H`& !(:Yx޹ (%?s!'Kk-!=yM_?*mUF; NwO*:'%H|OJŠ;}P4EaSGX|l]CQb&J(c}5=oρscᑔ{SZJpp~3Y z&❀d y5mbΤ*7ښ|RJzUjv9&co+ D'g3MDʉIiæ|nHC wfMLnA<;(j`;ݩ+q5;iG~,@*(*T)]ҍq=cΚ_B^_aIA*(BXE.=EG iiQZf R#bsҢ2iI( w؊E.eAe!^Ń>%-nʐ,9Aif-*ZG(eE. Ebۿ(U5֊¨r^5~$2jA8p}^BTyi֖0'ܸdgI jʸVϢ%hf)#YrKC1 |я4&`ᘵpWݻ_^z,k˲xbA6aGb-d k_?`M[N<2-ϟuq0-GXG*.i Ir0kϷkiȤ/EHT}(R-HYYА~ *HNGJT!ӜL6*h-i7kwvUM"a DZbmjM[E??R)Ejśd6UUX+i9n衭'F8 >'*,{9cnY̿ȏ /h^UroN[OW­>-ƭU6:ixG^ZBZ׶V YSiE#'(ڞ@Ykڶ TUAɷoLBt5KjfI- |c,_ⰩJ}b! [Z% ;@#wPn+{*+aSqT`Sf7WTZЄ@w^$a-s W}$`i((_(g_Ufb5Xb<<A PtT\ȋ uY?d0iVS%)pZ}9γ+B3HϠ_ϻa>9_X9wczp4sR0#!gOץƬ`tԕo*BPws!bT? o41RdSoeu;I*; FRecF _I~ּ{/ /MznuѼp$Ϊ lܒg[h_#A;\XN}:/j.|b91!dšv ޿ޛGkX{Nwab$Xk*A~+1I}ȟΆ=R[י ^cO3zf1}KԹ//Lr q)r*Fu}Z+FLB+-c-6(=ι~7Xh|G@%n&WsyqpSvkY-s3ͧ3rTPAGo<ے{< zڬWzܨ?꫗xF%~,g*I)yv#6~||\By<&Ֆs;25Cj=}\wA\w4_F5s#/?CQ^hH1vH= dkwo*`H&G"\[}W@]w7_::]E"YaS)99y8v X1T$t-a~p_pSOD kmKb35m}LxC^x{=t)j=sɱT$i8n<8fxKx\vT%[O!)88tIgr e(apN; {9sF*aޟ#37GG,5 fS8S~,$4x_} " EkoUovuD12M3_DLBc\˩0= EAS3X'N &U/ǰ8%7x=/Hm*S۽t57Yc2y n2-07NM]73 {nkbE+Z~6޲/1^hC[Am0qP'~x"sﲲn\SgC4qIOGz|}3>r$R,[VHHAC)?`I)BPP>h>{a Wcj5 "ϛo 24}~+gc)@f]yW/)}4^Z`l?#Jͨp Us(%  Zs5RI!j^n)p{q SC,U/+-2^0_=O9տ̌1!7EpH\ ݵGjv',v>*ݱՂX)셫ܔ"_DjTS˻B"a[-*U|!VLSta5ftQyƛ3Zc՗OxHxLXrwQ_ [YKNpnǝulfrs#_Qd`1y5d7޲ijZBw%ŷ !.KMgcJ pH* 2yҞРd Y bʤ??54W3IDATj/<K*bU SB [/=gS^z7R3@+ ¹5b2`njK̄xyRK"S6sK, y{h˫kzJGN5<y ISͬ P`xyNWϋϻ4PK{c Ppz&Q~ u lǰ .Eh"Q,y9y tI-7OۊT~sڛNwҚ- g2ƚ]{([@sX Ww .ZCTKI&Qz"y7bRz-*Jps[#IQ$=ڧq$4 l 1@pˌ.-TBFDI^A_CAwOŬ]r-?]%_/G'(-X= 5): 4 TttלqUG.B(8#d'J [@@ȡ3~[+j: [ V8;ZT?-IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/files.png000066400000000000000000000203331341747546300220650ustar00rootroot00000000000000PNG  IHDRP/bKGD pHYs  tIME 6/m. IDATxy\U?W[NB "˰#Ȣ"g<32*QŠlb.HI/ꮭk}[]]UԩΫ{~8ګbRosaFfln9zxQe"]mX,Pmpr̨uRO]ـYIjrt-"X?ϩ ib`4F^AKZVveLAŘ4 HFeFderc$?|͡ӣP7I#WWVinO>xpp ~W|)ŒWz\'xp -<3FO1m >r G(\/H+w?+G9;kG֞I~p 86Iw\Ï"dڡroj>r`L@:)s ޅ+=pv }Lù sJFX#tE[نs֞Q1}֊(dj3x;"PV*X]d7t VtM`eH7_\U,nX2MA<| 7m/jAf+Aj _IxZL:?'H Pbphr:5BH eg!&^0 5nt}gM+52t ԟ@ҌAt9 =eje'r }w=FHPh:ǃ^Sa!H6q}[.#X.=WctxVZc6-I@ӡbBx YCcNF6e;`%%M3 XtHzo5piO @I쑗,,%\3gkO3j1- GJwRw;_t4!t/lQyѤۯIX $;o.:hK8@h\, 4:<3bf,޾'OoC"gf]etTy ,K".9)&ߖۋYLuVNBbp2E.!=|X2C,eҌ n ԌoSjOZfbb?H_Պk{ o{)(f]/~(C4'7ɚSjBC0 \Y-,U<ؕ>ST&귓 {7^䝡}\RbInZ7q 8F]~ ]G;IκWwz"Ad'6BOn'KRJ|\^Ss 9\ ߃ȟԝoyn wKFX͸G o^ó}_f #gqK9ڝ ȑG-ڏUS}Rs}VmA;r:.PIj[^|y xHջ뿭|(J3,]CS/| >MX/._ïjDqi4QxLlژN,jkAC[!uGEH|:UOF]wS~ir$^b#+yn]>yhjᄕ,ȚjmEknR;s lwˁK+)I#dWb牍sQhbt,RW1TwB?vl'Ks @'˦U[yku?À.j<՞L8K wx/;3ݬ:YD'k4\O/[X.4 zXtP*CJ<0ò/lq ӵ-Nj4gqh4j2q۴ .(ۮi\^ G]mzkf^Hcr6EņՊil_T+Hq/>KHogTt RyKSdּv~#7V^z; īĈ?K,: CF1&Fu]VI  o:~z-Kgc6枀 )A*ƻFv+|^@7[$޽eO.߬f/Rwzb!Փ[VSI744iWWr3]<]A' cC|K*oB[wSU .pEV˽ *re\(zA͎* xuZn{9I,3>Չ]y 4} inxgۼ(FEZ,7ƂMŷhVѢcDzX>M_'VEOxdNVc+,['Zhj\7rzz5QUZ G,CT'/R;!ͬS )ycOM>m:ֹ)J tX*έ^R-^҃{ǒr1]YOKD2yA̓YdJyZEnͥKŜǀMu̇/H<5頚1%4L[kjգ S1繫l:k_*#h*n4{ S(tŗ˻zVC9AnA:@yе{ WVK1KjEDk\{߲y>O4| L C2ʿ@a.@߭k[lvMSLEaЄjX*{te@+]P޾А+EydCΟVs/eiMU&r𲬬܇_T=VKʏ0ФF27tܟ_WTc {R#YƏ@Sc|夂OE /,/.hYRE~4P)KdA:^W6|Xo5GqpI˩ͧB_zgApqĤ`1E9kHjH-&:ŋL=v&{r߹ !UGhKq9H"E7BziuwBUm0hCfkgg'WPR4r݊f֜wQ  LJ \w߾-W2MjՆa[RG d/_}yd}6޷_\Va;d6*4,-n x&~jUŬU#(nf 7 Uؚ).㞾TլԈq\~I!ϡC|Qw4qӔK-)o_"+z6{@ Q.”/'[c6-˵Q_Rw]HHݢ~iE?}| ?nwvPxlpOqU6wr9ǝNFljB V䛐ZSVϥ?V˂wic-jI\`OX2|#j| f,(Jt:~~~UY1{9 >|C@;ס#~Y)7wXJ]QA5c'=1! DfuW@1- &wrJtQ%}OO_>S0Smd.| tߖ :w(펶h)LΧ;{tb"^JM%G` }lCYsb*o@gtqAQۀ?;޺]\t锶y =XO친I%S}f=줨lMhH퓜/d~Zps'~t!^|9 aeʔ˹_'<.л:Tz\'y>! ulw<D X u_:tLP'W2er/#pfWeFhg ֶqCc+o=k* [nT10 :kE"lcgs 3y&Ӓ͎J"Y OMYgqIGrΡ,VE,d%XRg侙+>%z'2jhD$_x;!"5!1ȶ`R"- j#q1s8݅OW|*,8ނ/TҷJ'aQ6n`m4Ț=4I1x^t7hVi`A{-B"2;郢R3 ץ\j;Զ"9y{leIHLh- C8 ,ъ9߇`ƕ~|7WLMxŠ\a58Naa;fI=Hrĝ#2En/Y q깒YjG9IP,4~EТ q ok㽇L%(o[`%L:c #k每4X!R?Fyd %9PK*.m:  иX[U a!ف4Z< z%J2j:Nڳ~sH#k`ͅvʺOQ~J,Rޟgwwr즿DG%Pv?sNI〴RgrLO`qT5Ʃn>]ĸ}{ 3Fϸ~rt$[I[*&j8HW\Ok\iULs@oHK%B/&] L.qV]Vdߤ\-zs tXUZ${6-&?h-GO+oK=zj%zjZZF LbLNr[n%z-zZ\/L\IDATN ;==ӷh\ّHbRosaFfl7#Q&;:,jr`mj؋ gIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/flash.png000066400000000000000000000163741341747546300220720ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  6z0IDATx{\U?ԻGNI( "uPa1(=*q& F/An"H0^ݐNw'Gwk"}TU޿LQQQS1t%:yDR֑6#l-dlMd-T6(?3p`D_Ò؋߇5y@*[ B2I[hO%C}EX'wF_ݍ:b:fM]KH%]u+&eu kyaxvJ2VU$Uu1)2k*cP{FwB&Q>I.$]I{ ޚY iIu/ 6lQᲷ4RM$kVi8O1!5jw [)lbTNFu5$=P]SLH - u$kOx} b9_oC13H֬!8޺9 Xν[Ĺ,[Fo뛯dG4mY=$'Q{uɌYKу '(|jEӸ>ҵFs V{XjZ ;'t' C21H!>x/幄ج \b?M3۵ZeB L D@;ab.<Cq=O(&Y(CߚNEyPNn8/C9&_Q@{)/u(&g{n#dߕP,^ !' VVUěn5{bBzs|P8wa ?UB<ˠCP,x0ȮUkomRNΡ-LT WAZp.(?=Fc-ZޅqR$]=c6~HsJxzs>Tp܏m9ZCݕȍ M;;'j?cJE@ΡN<[u< +% id%>t0Ykaנv Y4{ \@0ZG}=p3J2UÂ{nT~+QMD܏ǷH)HÁ~ 59ۍ[NI[c* F#7PmLߏnbxH#u X9ʮu0!)iKNymߥQ1,p ގuOobjasfV/ÛBNnbP]S7<an:ڠ'&Ryй)gs8F7Zy4:EwcRL9W[Ƕ0G$G̓XLH :жe}{LK+ٓO0U9RZvCI& iHmPҒaYvlJVXakyZޒL~P,-ByQXh}yXEY8kZ:^2""kHmXӵK ]`όw=/#k¬鰦Βc~R[ܶoF@+ñ⑃4DvZ/;L k4ϮThPP:hgPde Բ"ctIG5\E弩@@A vCkiBQqFHOEP|Z1CDefdH8neż\A8@A<qfH-GT,BZW.C&,+͗7PtquW,)_P%9Qo}V[ѝr+ jlڸ&/f覍kޚw#s"!]@/Se ꙶư (hygΓ4 }YױSـWN^,WN4jJr<꽸"m!@8@A`#3.M; Aj*W24W# (@9SQ=Wq)sj ʨ7C&JBJT.V4Gƒ?)b}z@5Ǎ$kQEkPM@Of4H(8*T%1 d$tw6EyZG־S5yUz9r&RHPM@O<;PMB a"@ں;?Ҡ4&۱ ōDI*h]ce[XKv'= [mG+3ן[ %u{-:r!WesL~\YZ\ѵu;o d}N= =o|.믧] 2gjPt6ݶ-w|U˳w&n=HZaA}v遾~åIO7\ww쩜Ռh I+:E8HVƣLCM<{F.殟L{m7NI9'.Ќ %"uo;B-wU=)Ir2:-khy\[航'F6e:, (5C,,t 7<cKW^#/ EiB!|qHJ.1GCl w7qy|t[sYH}޺91H5k*9EnlK?K/{F@6^ScnYW{g!̘$yIxRd?*BE{l>>c]eg s[tܺԑܺ*+K[G[qjLzFDmpJWIƈ M7ݽΏMo 7 E\>=o7wUܮ(\jI=yEmmG_iaܝ͎/ ~+/[P9R[г ; ͓6?]VlU @Or9| rG!R0SggtzNԏ4VP;ۦ_lX[Ht@[9< Ҫ _2hbCWwY lL{/Q)@nJL gj{Yw#Yuň:Iҋ>Iϩ R+{6yaCW7[Jxlzaۤ/9BZ|߭+5flzԢvm|gW?~;vՊ'-u֟(r|}"W/@uE3~x\vV.Gkio0=SW6X4ODkC-u-[;#4C[Ѻ+gGDޏ!} Y0hOfSβ;Aw]nAG6ˍ,L,ޚFE}vUVuK[('@I>Wt ?\#E9&E% }עd&*]{,gW?=ywdmyոqTܨ21 ږ p*_fmdށQ wuh߆8m P2D8w+@5U:JᕏB* uLYѦiTU׶* 9 c6d9Ҁjc4kHsoTH~@*?cK_vtsU)>a*%0]&K}_ Rw{TLs e-W& R9a=2`Ě6"T&{a]f 3-(,^bn.QRooQ7۹x\1׆^\\]{ȁ GKQa) A&8^bU6 a4!i=Sj_]nH x]=iҦJCj!Y7-TfRW5J{Cз^:L=!OK"HV+TAM7#}α›7C:d`DB_i|lCF|_\!VEn}7oa #)qzo.jߜ6iF 4Ě6Az7pASѯ 4]Gu|={D~trMI}зAzIMYQܭW)s,~G yD%gMI?h]|'J>9ͷv&Q"531ݷH;!aP8/7&s,&Py`0JnZιoQAxR "7QS9N/YZB`|‘_h9OfLouDF^(:"UE{t+Զ|舨?uk=mi8)3^"7kǨ/ WTD8KSglw-.x#X+G}S5f7b`y I@gR'\_S0iT0U0 XK"&R\#9|-M83qyT pֻhP]8mP5\YihXSs"I3<@*$?qTe )9 Ls2Yk0Z-J+9o/{K嫸[S4VGFv O pCjh\ gt/> 6ck#z7ʉ!py kY% MhGe " VL{9[Z3  ǑQ2:]k30CpZEf\ ͆Gy[X/ӫ> s5`U?mN*}߂{)/u .D\8F7d} iA-UoW'8b)G"'`uxQy쬧xz+Rp|kd{*9hl7F!րym&"YTPԖ jʼnA Dumrs Y7-0, %=qij|4p,"6믩jK3P2_LBDTJK.(<,lc؜EKw-ɺ*v/X~al6 EL d㭛S]aa ؿ&L*9sH}TxkJ&j8 [)lAv]@v I%%3HOTd%a߆-8J ߥ[jHVdj< ]_X'v` ?,FJRT5^TXQ&?ف_z`:摪ZNjUM+**v'[L<% nԔfM]KH%]N<^vˣ=} Kb/j|jM!d/'s!]لBjj5y%9CIQҡc89RIQJՔcS֑6#l-dlMd-T6mq72IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/fonts.png000066400000000000000000000214751341747546300221240ustar00rootroot00000000000000PNG  IHDRP/bKGD pHYs  tIME 972{c IDATxwW:wOOhdK-06`װ&/ /]xdX 6p-+X(O=CuUFa<5U3}|RwUu_{ι+q%1RF' BSDAZTG޵,m)׆kڨo;~lݘI$JU߇RڏRڃRy8k ZGqem|3ٱRoF)lG-lC1F5ZZ+fE30#m:] =&“hQsMj׎#r>F\D̤y- Za3Xw~#v Fbb%iUM[/y73yM#:u#BS >/y'jau2Y믠xA@rR"d>](/GX Qd9qPKލǃU Q_6b D yќd`g5H(]NZbsbsKv?GXt5kWUZYM((%G͢l28MƓwJvw8hu5N1C")0{y ~( Ń`N3S\r݂vz~.c7Ԯ " 5Zi2'PfmׅD)P;D Hv| }y~bBz· `.!ҏC/'). բqm_M0ڲ"h .5 H3 M07ΩJRGu\#jm{&epFCswr%/5\0[n;[5v)֏ofJR#h+m0~ oe_;/m9W,ZH/?iVU.h|°1ÆM<?~#Ԅ ބ/yge< ͱGPł0x3{*zdJ>/԰ |-Xo@km}4!q z(#2ퟟy=Y&_?Z]9OZXzwMX0#IP -BO4薡ޏ+sˡӓz竐T!B׍DO4;E?0&*0/elCZgzz- |׈-VH`Ok5qiXlP'M;o |ZH[e35isPI JIOp6U朂:g&e#,#gŠi&}}r;fgjDqH32{Jy`vjy t}lZۚTP7of|Mi&5"C=E-Uu5K_UI\Gշ i:5!CE? FX ;m&+0 '׈Oz c3@'A Г%YŞneU B/?yWCpY )S`O !{\PFf>h 5Hh{v)[GInI $ep ׆ëoUGbV} BtuN&9(O:p^ck TB]¸R#8I H-Kåk.pPaMou#~5+m:L}JFz>nm')¥ɟ.`,Mi&>x=&IHdך48|;@V~yV, ~ʑgzl tnV,;HE+J?gWn֤$XYw~XY=?iv9;ˢݵj+`ݹ!#;-sѻHŽ ObB~gn5i~R&~6^ვ_8Ҧ3ҩ19wcpʿA,ώٻ Éܔ)%\xߥޅ5~ʹ"G3:cMO.htǁ""ɣ^\daBZ*hkӷދ/uWeLr@G67GHXRbYG^oӿOqoO$d 'nAX.CZyfɕ؋nǴD}ޅTջNZ3hDMn*_]A2̔x{OKåJ}藳ԟB:wr(xA4_*sc{h_oNYs8afM֢җ n{;$P*#wm܅^p t@߹Ԧ}5=0p_ KӀJ)ٴ\̌쾭eYN-qMe_^w4ۜ_h'!ufKet=ކT 6ҩqR_!0-+{!fjb mwV'1|هkR'#?P=w~8%p0SBxTჶ9M_cB}Fmεhh"]`^ 5Y~@4q69cH};ַZ?y/rm$[н}KBaf4;;ZOa}Rٕ6,&{Eӛ@:4 O9w=;KXzہd :(o9P'4Gqhܺa\qVǰ,ɓIK޿a-bXHQeuv!f]TW-S~"y&}CG_2NBq+"E}l7%0geI6lOhzئVy:. @%Ϧeq{ݘTdz{гއRǻMLJT9BE0%E $$H)분LAgQ2^M(ԽٔؐfwJǛ6jQLw$5i*M%t-]=cOx:D&>+GfwYtR?<=KU Ng-GS-b&7߽70r.H.Fβdp<;m)xyy+GqMb6{=s_kH;XnwtlQh;7vRg.>ģ~>N%m ۽#vL48 á=;u4cp,CdLqba?Zztݯ979#( zf^.-葇!UC!Jqٲw(UES97\[e7 MiGofdP<̥ ii_-sٸ <\YSV5<_zABl;UF)9s< 3eM0-zsNڛbzdܼ75U?pX<}&}2icͲiTGseK⮂/;}Sr&5i&5<Z{9ʳo`^>B_]}|0M6-ʌrnyIhC穟tjL*BG*avz҃CI9F>ڎUe(n'!Jdy~N=f;Y(aǡ2Z&rH=>2ҔR8+Ek}eG@َ1xpT]A&OlSlkI%%iK#R=bj&!uA~)ԥ>W()%nosIQ3={yM;0|W$ uZM&2Ev&u0(L9;ų88B&_R$'!䥧w~ъV.kv@! .e7oC~rf"l!-M5U)fE{#==Ǖ.ܽ{3q$isn=񼔼O㬕Kf,dݲfV5Lt{/;J8nQHo{Y)P[C,KA}48A:(!?h*`9k([E [y^~9dS]iR Syr:MlsnGဏ]x^q|:!HJl-TqXfQ5vReΔt-㴎FVz veI7ظtؓCGACQ7L^|9Te`*zxsEE(Nr> tIo=_$sH tMᙄg!n륻we[O<)MVm:6]Qf@*Dє/˞ѽO!wY|נe^fy9V ΘFCqlcʲg;Fha `VamqҤQ|((卶0RJrRy67R&OvxCuIF HyblX<{`\]tb˞a&2*?RG|AJ iI7q`^aRhr)-ԅv__yj"!rEn{pGCֆ"BWwVN:_b)Q)% u5:3Gծ|MTjJNX>g5'ޠt\v5WxŜt⑀&ӔWai@񠳇wX:xiZѝB W Ok;\l qȁڸ6,+(5T(XXEXN+@ a*Ӷu9o%nT7,FR %iY?˷xPi.]uZgR2)S"jS[Xrg  Iyd[OALY;F0I}L!)?] +ZҐ_/[Ke_m2/!7tIwVU6w7Ea9mIyp.>s;ʒZ-Z%(H.NX!nmV|B<`lo)vM'W T~3 <;&TBCI1j'A/Yӎ.X6ȱ6,sȋ_Fa8 M&-7VtC;%B}4gQ Z UF)B05 cIp"0;y™u };l@ixr/&/=ֹе<8Fߨ{^%?nN|  IpXO_&u?9B7Lv}lAʦuBS8}y3떵?.Ld4tsϦntÜu;UU NXm,m.G1u5}xAH=Gw9ovHf<{-{xf2[ݒLDTvdiB,' 7sZG#]q:X3`سlz aR EBB$'T^Ws*/_ƽs.]ΔMV}!mO:w@ O}~6蛲iYp2SUrߊo[91'2>70Aٰ>4I0sei -ɥW3P7/q "K/rW HGS]{#y}9mCS}NEpb~5s0lFZ4@ i]A O@;a4,!$9r E>HGK}P@CJqiYJ᩶X6P[.1ZbyR[NjLy#׬q>U+@STUaMjbq8zqh/TqG >frFoYk9Z~N)@ut6<#K33!K"|*H(@sBAHG$# G~"!? IH$HjPSIHS2LDu2l^'W)KaTu0K_R(׽ }ϛ}T{/<4,r z:ű={čayHҞꏧcإXZ3`@-f6J|:!7rU.Ok19ע WZ}/׿ WP(7,[opi,DpoDϨ81lɡWאy R8;Uޯn1I 8L1 o>NiC oq~ 6xALlvENMCT\d}^wHA߷MqW34V.w;1Zm ,=_q,%V**)@p{&{aw &XMhٵ3r[jw?Uۉ&Ǜ%mW_[ F _}P^2~nԄW9 wNT~Bm^$ ]i:[Yj!5*Juk\͒1jms1ָ\9efV27@/F<_ԠNلXula琪i_UوwQKa/$#@ZGa鿸>kHcM+E. <$# O~t^UZrƕb!uEc.+~?Gk,h@Po7qXUPճuK#8f`GjK U4;N||x֗1kHcr|7<^ЇkP,$ч`{ץ%93DP<=58N~hi}QpǕBfO t'&|7tqҔlXoaV{G mXfiDq՜4*=2O(,Kj:? W{5{铖|׷53漛jvt aT`CBק@qV]11"I5!hsѼ&vPgo1Xv?h ]7mP#5/fn"&+I\GRLjTG>\jh Nd^W)s6v e^9iF]iߍ-+ߐ ,}4_8cR;`NM pN /'/_DXX;N/y;gy~ w;SBŶ%Iw[dhEFh+gacwIOXI߉yR9Y1L_oD<4w' -WBުurVc9;b+ H+_M0w'QPw4^P0IDATuqfR`HoKSI%B#:Y0l,hxv| }u~PwԽgtg!?xYWBlK?Cqb.z~.c7# NjBCܰ3ݐr^*לRjyE )@f| ~-]o@;; j!Ah-d֊F.j3RvBoԢCါ"ٞы).XBU,~oR YU|H+<UNKv?_c"(zӻ믢.X_uiD԰M܁?qK< g "_RU^nҟ_n,(<.!+FaYUw'dfRRKįQlN27c]F,Z왬t*!}ه%3t+(G/s@zdǶJ_n|B_S\j7m^1|EnRmBZk7RlHpGb#[60J~ܦR:Z6Orɽ=M_NCnp/g':fBAYa(7@! dA0iy^W?vhW];ggx,0Qg&d!һ!,$ƒPd[nņ%&w ȗfSQ @|9$S{RA~=L'*6'=;QZ02VV>mA!}9=(ܣw7MgCu4oFBS{H ?NV惦7A ^\{!zzL[V[vt<4s?k?Ag Ws.|#0zU'ٖpW+Hc)􃕽{!tWrD>_eBd= ^9p%SxtT>|ruvB |׻a.U΍*."9]ӛ#g6EmXza`,qk//TjDd |5?\ .OLzEe{BU;OSj&JaC{;~ʂԖBW 7ZGIu} YJC""_,|5|Z3Uc@Z_PHuߎyR&Ʒ.7B6d,hU 欂:kNDv -(2V/Zü*7n|TtK49 7ʻP[#ǔUA ?/Tg7; 4.P=-rZ{lJ/%p/' -ʼ4SO~Gaٚ[%> e;H0X1*<nyam@O|`]e=ɧpMUǪ遟 _N!{mXN giɗpNGz^1 M=-cw/mH0,TǿIr1/ O K_.ӾU$-KJ s8吺x2˂ڀSOi jZKGɧJt\:(tKg[ioOkܴU}  n+-l'H;kymﶗ:]Mk-fR)vf} ZPJCUDwfג~-w)Kvׂ}*VB~D ([ |dkb`N,9`iv֢@uwnGU֒ƧsmVX޲tħGD uFA1K8iZvʺFԽ~eiCAbAW1AQ6OQdP =ڝWWA+ɢVt@8%ww֛\]w%ZCdHчQĽZzT;*gMEG7YpN/8lՏTUPRΩE'4FC2-۝Ujz+,cM 8[R#߃UR~yx;.BKoM4]#/6*H}u5Um%XߏIKEc[䮮fs|:L'3ds|aba @U˩tht7pe7>saXkrFxH~N>`j^kEv5h?AhDy 0LLS`jf *蚊4\Cu6ba+;q5:h>+Azjk\yeHc#;-ovNga6n>3Hx\\ UQUv<7 FFbA+U+Y- rkd{P?=.:8~7+C|{Lq;u |.[ɧq)am&HPK<~IKJ&&&_ǿ潣ds|nb6變Y_drtMeݥkǢj~:H'oI;!kj i0z r5݌Dw/0>D"9Y=bE4Z$5? w1LU=55Ll໿zv " HC R@* ;Ӛįr7mYQSVLxm;PViH[ߎ2?vMfq9N}r(a ҙp͹@nuV+,[jFIeUܨYK5,V:čw^J{؇9r  }xًڋqչhK}iFdolOd4H,:!T%7 􂻛Zss[.U=8tLp8Ikn _Y8cD4!Q(ЮVGѱEzrRkDs;o;4C>q}CS8L [׬⢕=\6)ɺNg͟IW/o #C}2˶{C.`E44\}޶Ȫd,dBdEboMQrC,uP>1]]ͫZs{FXIJrMQ\4<8*K ԃ|n'4#u靃VqTDcSI^?ak3b::DFR+|QZ:.N:wKƢLDSrq 춇x*^wDt!Zp LӘ3e$5+e6 UV!)L-\{GHe8uMj`4\|F/o[`R9~DZȆh4&S>ora 5\)s QP 4?Q aBn7 p$?B Q&u۾L(3{AUt5YG Cr;H~!u946u;Hg֮OŚ_E6A`S@}N5g-dIWKG$tXnASeg.e6FN8Mܞ2A:m︄bӘ5U%؀dYRGeIU7=4>9y+ڏTjbPblVCſ9!;4E49|]1a??_R{t 5["k1RvCUuӉ {1EMv ^|:7z9u&KRUoK0}LZRp͹ $7kH͙(c&e SXsy !0M L!%L'2 -Z\{e 7Qm >)DQ~tM=iM(G (SrWl\o$y1{ÐZTx/vۚ5^ @SۡUf ]yH}Q0!'l1  9B8/U";VV2#ԧ)@+y]ɺNb#Z; ;ZQ vG:h2ã uQ'~Q_1qbg8#TV{z3˔B P\"!.[QhAXuY KA*gq"wB@$l}# 41iE@7 Siw R<)z]ZAK0nEjG ~Zn{)HU H¾OZQꗙYe]Xx()@҂.8y^ڄiȭ, -@#w4^dW独\͊b #^z] ()݊Y]ڇbO؝]oXP$[3gyGIJ.n,B+at[X齰3R -H%ߺdHM}JKtScV*'?[! C֛ 9V%xMio 3m5{+lO׺ f]5v ~!x{t=j+H&nTc iKIw}Qvn>ȍP'F` GKE%:J/9dm82g@Pȴ߆yEEbW:%pCa%smUHݰƷb+zҀkɧKcE2Ɋ,P0p-+fښGϭ&,ýܾ:x܌/D疷BG9Y?/2Tϝ(U)@"[xnAɗ9a[ vGC6Hn+PtKfY=(yAx?Z(szIBy VȩUieOz;ohZ2k,Y-;x+J [ Qj8ARUZ[>$)&Rݷo^=nh>*ziC xWstY9Dd *z>n)_X\:ZQ~ ZvW oa|8 _Xj;PRrU@  Vz: 74VɛZurgn99u}w̔<1Vh?4ϹUaS rM#Sy PDe/7@z#8k8:èl[ 5@3x;:e81Ix>W/4]-7{qCRttW-O)'b'>=(ܣw7MgCu܂juT/ inS\A HC ؝(fzn x1ּ3aܬJ>maް1f{h-sU<+-Oytv?emK"[w{O/W\%tOk.=Jje^, * V|j7vBrUelM%[H{{艿P^Npu ͠=sfDƲsI-AH(i[|OedZo&^~ d/(M*݇\\Y^Vud:Qlz\a(J~՘B1(F+"Gg*)*B6A:7bG S l )"ZdIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/icon.png000066400000000000000000000224651341747546300217230ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs  tIME }M IDATxytUE?w $@CTDPA@1 "j,؊C`kآ M+6(D"Ha r3F{{ν]˥fWN.A!II@ K@o'b;#@P4  C)@ vXlVH B|Tq=f_sHx$])#\ L דvHepyK6p__ߋ[Jp!w CF2.G;b?X63ȕV*%D`ʁ+ `<לb!_,3o6**o90 /}P,qcKĵ< ,n?/'N+U:==~ѳgOwθq㈋C4.Reo>|>Ln7[n󑗗g> x[@-3W2%%.]п*nVqҥر%KP^^NEE0Nށ3.vphoY~ZKOOלN_H8D#GvܩhG 7\.VZZ7x˜g uU{ǴoVs\Zq!-++K&@G d!uӶl٢ ?'33S8q J-8莔MD"|>RIXYC sѪ%Z fgʜ=%t8mZ]]Df),,fΜӔ+B0]B\ ğ**(͝;WTWWk_}(F/Iؙ1Xm֬Yu&F2;܉'JY----f a>8ד,rk4M޽{s Vk+Ex{0ݺuرCjo5^zxgUz`%Ff͚r"#Gh#G t`1yiiiO?y׵`< Wdty!PӴ`(|M03$$$ߓ&2A|WFFqFe]Fee2n8\.l'?.FΪUk#89K52hÀ-Fԯ[n_H?70f#"' gQFqFvߟ={euid pQ?}t ~sgeVI3=DuI*0xb}QnMvmTVVeȵ.ksHPmt۶m\|B0a\lYP:8p^z7 j*&L` Bj  0Q=zw^bbzxA?#==^^zP/ޥ:Hqq~QXXHΝW`q#AoaQgp rsscٳ'Rm6]3:*/Nqq1]tQm?!:F@ _4h۷o7rO gҭ[7*+O , *J ApPQQAU^JvO9 u 0QElذA_<111,_\ ['A?nΝi&#&MRya EAMfO5DEEkONmh آc7`s{VxOT^zTJzO 8gm_SўK9dSIq]Yuη{u0G\Q)]Z4bz Mit2ԞaӷYOвv;fRe@"z;wު> "r]^^8&=N0nݺQVVL1mlĿ1`̙èQBکU_eg۩ m: aX./RojsJ?HHڸ.&trae$$$ryhs%ۻps=!ʵ%v D٧(daexJ;huՓ}ПvБ:^)WUU^St ŃnlyH<,R.HgajSU1lFGcc#6lkN@W #^/ Fo.5cl.+vz1|M^&r3>z.ϕǩDOFU?o 2m۶Y̞E A &RJ[f-_:Gk;11zSO8i歷 (HXf.k~p8TUVPqq.74ESfNMMUa&-kB`sFQ$uN5ѻ-r^|eܑ#F辚,--Pv & G&]l>\BWkM& $:p88e#wU%埭JY;=:M]N$N=Bi?r7M -荿xp#::Z v@n$GP=.Ϧ!4_{Gv;ϺL>cyⱂr? O{ME:?5xرc[c~1LK^VbkSan>St$8R_>  >Sq.OITg@&[2΢p%3G)H<: h0`8`(6WuNiX94ɣS|1HO >>^?7SDu(ݺuTDkF1a 9:?G, @לD} OJk59J  C^N:I 5ۚcK.Ҭ` Zd=u&*֠Gkkk׮Ҭ` :&tYU]I| +^$ DniMA^۟}ӧO5IĥJkĥ|nSPP `x8b41{Icm|;Ўhy+ 1mM]!"8ܚJBDp5ةg/SA ՛HQњcI 5iMt-{^iVAߵ&> |eeeҬ` %iA{*[]Kvv4 w/Gm?4,W qK4S~ZW \c6,=ddcV8o5" z,^Zz ml?s_==MMr(~w G>S&?|Dz APG!hjjRy xPi|ѽU @>_{榉_$iM)᭷ޒx饗tk/EkSO uuu46 fzMEt+..\.fr"Kg1APHmm 3"3?.=& ٿ 3hlSҥKA!?^ZzJ:233n˹APömT=o}GsMظq SlΣ -BcT WSZCC֭|zMp<= Xr SafI Uo9Pl2f D<}^Yv 3\%p ҋ֭Zf=:ho'!N_@hɚQQQAAA or=;ŏd fY 4љ`nI B?~ 3'\khJSE!" r:ֶ%nm4<ҳ-S[`ڔyf]A8Fw-zk4o*,dJKxޚ-X@VxUv|oӧOسgs߷QCo ?cqA8kVź=Bn[jU`yQA x߲eTu.'--MO!魩w(Cc>P,.\HMMxx^T @ SO`96mDcc S_uہf5߸q# B1vXf4 #?,3O0m4!?*Sـ7T0Iܹ9sWAii){*sc (Y x't۰o `ɪL} R~CnW$^ ]6\ŻSɆ TӽNhC*fݺuk:x@ZUTaDxU|LڢFCELQegO?>@F@I#M>}T|K!g탂->kC*>Ib.B㻿P[9T@IXhׯWen q)?+,f̘!^$Xv72ݠg\W^y{7 c„ *ͽroP9`&Rvi2gD=U>^/:u B%ٵkJ-)߫2V[[+ӳe-Zz:EP_/Li>|#F4[zۃ64C`8Tӷo_#bGA;TϱA={ 1]o{ ON;M> `ԨQթ4x>uNE8pxR FVVJuI=tStSS]vFp]wuVf/ 3[4XUUEǎiyWU}!kTz\.OSǎ♂|Q fz^ 7 <%n/A^}#N iGg1b lmF.jkdT㑴B ׏7U>%-9΢E0`v^ ݬo7qh@Ghn>dBy\.k&Ş lb{Yyki˺]TMy<իWf෺@Pi|PZy Fa >K*"7*pkQYgEFF{ fg.a8}7X6y6עJ>dz9+HIIaʔ)l۶-ŷ}Ҟe> *e\y7m dgW݆ngW駟:KIII0-U^_u>VV]B[?#1U\x ~Dq_AQ *Kꀡ\)(d~3E`q.Sb|yo'(_'A66>l H*U #B1R ^} %|%o‰XY&엍?"EtR`0Y+oD @ l)\W.cSm=|p!'{ZT.ޔgٴ;đ, WlF13֦ߘ4&j>. 3zSE!6_S}]{J#hڏB"Ζ>?Vk-# 䘍GvAA:R}OIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/images.png000066400000000000000000000210611341747546300222270ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME4:T IDATxw]U?^fBB(i(U*(VDDi ?AQQ`G  P H -Z !!}2-^7$`k=sG*r9ӇFʅr᭟#$2 i#I!O]mFh-Zڂ^z|:f"CkX^ZZ2]FZmS٦sf it-_ENx9ڨM{sA}% q=t5 jl1J-VkuDֵ>Ę"뇌y54jUdYdG(YVPLh" rqoi#8Ix,H+u8 --8%l:9dj,H++D = ZVZKSJca-0HZT.gN,Hb9 <¹Qi8Ru L,HK2Bty[VsIל\5s֪hdb>xRߢXj.~dAZ>F8}a!;1l`o[Ao= dgf]6>@Oe=GlmXb]>pkyv8gs&r oC k "B썲n<C"gIPtpp$!Y>a| (cP?̅! %Bvjg۩s`p݌YXxO(P\b|UGloM4!*ז&*IqC݉p*8?={hO~҄4>g^9΁1,vqg8`E%F">/M(Háa-8vA1%+U: -[!WN|k i$'ס^*Em%ox]"C[!]iT}(kZ֛E gU(w7ÚۡncJP >DۏvѡU-LOq.?:.߲nꄍ?"9Tm$:nU7FW׷Eڛaҕ) l}(iGzH˄2P 1-9 /(uoS?[ZH˄k7r.AQdRIpm!*~,)%pthpu^)0=-WnX{*l6t tj ΋3݅] t5(Λjk'q RC m΍DI,U6cx;\~\PJN1x/4H i84,]W_"ZT^ބ߂ܬ ?-[Eݞ0@06 б{OykAkjl1[ڬAW؂ pL`K9v猼/aDEEApl0~A #&_IQF]s]{î믪#B~"I_s<4 1]3 jZ3~&7%Mt#<'.oZ[֔ףϒt_A4ehk½k jpmy7\"IdiAM! !FymI}7di?)P% Y6(t粷i}7wOn](쀎,[{lEބIB"AIzlTT`+)7+Ț n%lx AyZM"oH_?gQU$ <? EwTMQAk4sI#Ypp@؆7֯+sNk({VFXR51GYęP6=Ϯ MP!8]1BG>P.zHCadR$/ZE, UTN;jwSqs<;\/ a9uT4?o"̔PRIk32ɉDth[곺͊jƒb5RoL/[hoչmbG=[-mP"Ԧ0P!8Q1 Tk*ff e;MC-?Doe["飉TYm^;2:$/J⭑F 9kr>=Ȣ첍\'&ɕi$# B!d o[JrɎèlizfnYB$NjEof+ e,Eʥij jѸ GBP]}N+c$qLmý^kҽ,wpT>&[`(^]mx6n*Z w1=F[Vș>dKOIXi"^WtLgƴB|n':rv<`7w⡜E6=[l r1IMvi*-/gwI~t7dR|w$xptut\еC6dkȘC*':IURnR)Dr&kk $͍'2NY̮3ɏ ?!ͱgx*3k"sS=h--H@֌ӛ9ՁJ9HR]#1]|*#3XK7KI26 .>`kYH-if`\U|7۳GýItwF\yΝO8OhT{$deװi0P'H2ڈ7H ʪ?p<]t$RY-gE7}wNcb |T_oٺ}ɛ*RQ^?LٜN6W,xk$u9ۍ2@fŸP.Yφ TdmdH%Yxm-IιA)QQ2MnӒ([4P87>s6޼K ReK;Ngu6c5-˘As Wٜ6pܵ[8~%z^V$9cU% -sN9 &KGŲ<[ClNg `+k8-!I&᭝$m԰&K_(˳5yA$ã޸97iBcs#ddzlӎ5Kιm:M #4 %/C2%3w~`49%p~;eMmHڜ~Bs87E#-c8"rWl Jdf>i֡9LUG"GK *.5z?߮ԝids:]o ̐Vdaw9yԤW? o4iH.܅_*y:ۡT2f9-82Cy=@j*%}FC·T]z 154{8ed:z>]SioⰩUaMMa P?wB n7!Qڽ*TCF@r&N)OƳ#;BɣJفUlSlŒ: Megs/zdu*S[jWr>`!C}CN!k8 C?Kg7ge4#eE\P?~0ʷVso*.{:P,F87_>9zH=K9қK:7$Wrqt󏳬(Lص/Ҩ!5'7%3}r޾ˡ1gLl@Ez4?Rj;w>I5(*2"i= m(P]kvdRVԞ5"\|Ax;T ɒmϡ?BsQgފ֞!rͧȫVTm%C)czƼ$ݝ#lEo쐹فRCbzRfn&%OqN벏I,I?x:_?xkۤt| ܚ]r!\x_wTj=~c9-8Xz =gފ֞CQ`p1 [n3,e[ds8 ahwt>FZ%#MoMSq Hn]k!Ôǹďdd:C"+zJ` 9*"Ks =vi,Kka#f8'74۹7Nrj| }pzzݨb7H"RyK9g;@'~]kQ^S, ߫W Խ5{ ,ή?Y{y %Yv3+;xsDX2ȸ5n'|LmeLmiSq5 Ɲ)3/5>T&\sJ)@fׅ[d\3a(q!=믅3d=GKSܙK6]p+au z 3(/Kͯ70EJ_ -X﹚5r0K/ LJ)sҹRΙaM0aY 7n:(%s탳㬼EI41x-A5-L*uސzI9ÚoҖ4l02&jo`TvHgHrV]d:R5Abݖ sq8N)hT%ZM#R)wfVNյvR_/Cim7"v@]#~%,:ѡw[Q/_ 'DQVӁ;Ff<]KCZáeOIJ%7BO"YN@ ήV6h,\hQY\zd+R؜c ^ H"~j]T @Tmz(y{^W(MWi(+7c6KY؆bkk ~\[iH;); KDŽ1<= $=Z 5FFL?8#Wܾdwq;f{_"a%u'Aé:LaԄյv?0{L95HK8nF,,M oClQgbh==.;/~B \#D0vmV l$5Z= "iXlHjˆtqRK Jr+s$ƋV, U}F8Z"(I6~wӍ IDAT@DhC|]3 C\5'W]Q$'aN/djOo^n 6tZa$(|_8dsI>vRUȌ ;-*ߝs&=~&j8Zt!Zp~yX+T9djY5s ,Za"DW%? OXB-B<?ùNw YGp70J=g]P}`w!Y0nfEJ%[(7WWW9"܃`kEd| -=(+74}tp߉5݄Lw`oK~ԭ A&l|G ~3ri{t-זupU7pSڮ]wg1NBp5D/Esvo^҉{I6_t nfS},OY 6A?o(~KֽDۍxh # hxqp6Wd6 u0$+du:/}9t]{"4_ 3܈'50D_-;D:46A88YI454_9w }܀޲xxOjĮc?@d {b|'DY@΁ UF|-y?|~ gi9ǻTZ ~.s zz[ג{ &#W9u0o9[}󲦦 / O? F4}BľGp,M4U0%۟3IBXL'Ρa`IC׍?\.cz_.sv), 3J3aT<>3o2%$( ѷc^sEjx!\a. QtH{EWA]lj UI?-%ƞ¾_s U5p5HLDO@3l0Hek6 31OWoxWZ;>&}z-% &~mMFUWqoYk:AQ0Hr&CMU_ջnm6}ׅa aՈL-1$2'%;klN00%_]8MɚZۊ ێknuWw%q;l|r k8:F4ikG4SzMH۠j 'ow=I(fdXCO^[ִS`k"-><>"c+oݍ֐V?xx]mꆒ ҐڢkѲiYnhXeP3reif[yK*3zhh-٠{6)ׄ%.RиL@ -y]LR[w7zP 5C-YphL"Oɝ⯉|9P/WȓSY>`jЈ c$HKP׈4GqhTz/Cvd!LJ5gZf@u RX##Bj&+rf@CEkdPH8 Ȫ?KzWBKtݑ!$P*RZZ\?~rHo MhT*P ΉC4x`~nfA D<Tvs1Uo]oT4q2H7I:NU*PƋ%ơFG}'+@|P/M!$ޔ4*4+@Sv4 Mn_2*P52zbHIHWzXfeƒuGW{%|en_;\H%ѓ,i$4,?Wipd"=\H]s%>¡k@gWžYmuxYj9jFSBe{L9vʡХ3e"?"Dk:8v<3X*XȋoHe|=yuW1],*:~n'̯0No:ש~,UR>瘙3Y߭ZHO=Ԥ풖t]z=%%TR-3eCr5d^hِ HU{(f +HJ'Kt\R)-i.N.#wX%)tMl%W)) l_.!iIn"JHiYɋXԋVRI~D]:yYdԋV2/Y~4+@ҴzJ敓G`E1JyYRI~t:%^I`~ҁ.4ZNzJ%ɏ]B If\h< GXP*NYYH&,izDh%J#K^d@h< GXs6 IR> Xх,}gakNґ4rކɭ9!D&s[^o|`AH얳Tb}. =5Nn٦׾6n̙t6jԊ -NPٍ =%ޜB9eze'_ޱXA;}zX2kKgrZoji|o_,k4ܜul>v q+cRNlvHi~~kQת8m }Rw5YشsoWvN,%f1vBRD_察T4@WJ,w n_~K*M1}1_[Ӟ znsQ;,y44aI4\d=CItksRT |'KR+5O/oMhdϾtzO(vg0-벳]ܽ%Rl4V%c҇Lᐺ iQM(}4H`QC~RHz-X&yCa,O=~+A=#l N>@;c[us'1NeyqC^; ?[ O$y]\1eͫkb,g[i+Ƀt'Io1Zͫe⵩_#MUlW=CzX3vq6eKjXon?JgZndV4Kv!E*wd? ,ɻh) $Te{V9[K4iHz-] kzI"qYwDQ|Pފ_>{\wjE [eK8it*:zf__K_k= /$5,Z!#2&cIx\ ]wq 9?޸-9Z-/H#c}³ \L΄)ZjE۾/oTƊ%vtwR\44+)Ac+tQJիLH0a xjTRW?@zzT_U:X2|ѫյj9jM@ cB~]cWMy:F8Psfj_*:4,^ RwGg]ecFT(یR.#Ԋ)@sAf}j0r3#r!5֒MW{j/Εj#Ɛ[KoZ!p͸R˺LցϫƮDE^[YМaU5UUm@XLt" ۿ*]vEi;ohV Paoӗ6 qlGl(T(Wc7D!\:r-Z!pu]}eT?lF:[Ԁa ߹oy\Oڿ Wy]D=z?xlNM2aOFm&d򾍼!uj[ &WCjHAQNJ !nn_{w~wJ $E۴HK`]@GQJL@#vަc `{;/Ru-7U*&^tHSwǹ[*YЍ}| kt!UwZz.>; O%۾Lֱ rqcU՗*FV=0}hr<A.=͗CDŒHyIٻ^~VD[:t`-`oS@<7AoüT: 6gLK7t}.U`|~wdD5+KE/V(}7Xbp΅<S&d,62u;ަQI**E[Kt] MD9kC6lĻ0PVu0' _G,ER#)\}_ǒ,PB-ςţ`|wXjfG劀 ΁[F)I h t34*-gʝAkKʹ9uw{Ȧ~-Yh6VEؒf@j?c˴Fs;hhaOl3*N\3= }d .#uL+G_o&?l$ @eS}pw y(5as.|ܴrRc8>kxO!poC1c̑G j.EK H= hx.;ah8Kqײ3 u0$\hdu:/+6n4<:Y8%OX{G ͉775[p/!v#ކeEN{~.#r= QZYYg -06^3pO,{I6_cz]|B .wb>7}79{'؛0rН9ͥ@$ 2!#8gԒ.S {zO'r-9eBEL~'T 1D~ phTWbyi]*н$Uw @CEťEBC6[ ? PpH5\A|juCC Et\HgTd{W|Bf$4$?b/T>Tߐ/Z\5YPPآk*k*:t݅WY3Fa [d5Z˾KH!oӱUצU"6ay=W=ݹl2ޥxOvEB?FסvWYd,zz-3; e?4;4SIg_`GX>m[;9[+9k;&G 6IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/logs.png000066400000000000000000000012761341747546300217340ustar00rootroot00000000000000PNG  IHDRw=bKGD pHYs  tIMEtKIDATHǭ;UW@&X&|a$&>$$FhZ%+DI hE,Dd4$)(Zi! Ha9w.8ZZ4ZD%Y˭GؖtWcf"h]Vq~O1I>Ivb#6%ydW"N2r}IL%Tۊ?v|h-S&q =I{` ϖCVAN zpj$1Rî$W^_EIBd%c_u|$:UnhL͐ϱ$^f _ar[ugvt빙RSUcP>ZAu?: v=R-M?ȋMuĎv?$1j q *XAL_t̤.2Z+e.rOTds9 %ItfH*M?MŮb >虉2x߀lAEbY%ٌ8}>nq$8_O$JlÞy&Y^mٝloٿt;IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/microbit.png000066400000000000000000000127221341747546300225760ustar00rootroot00000000000000PNG  IHDRddpTbKGD pHYs  tIME 7 )ߩ_IDATx\i]U>jLU2TR`@ `Ҡ.[Vv-^"(v*[tEkldDP:!C&HR*)jx{{ϫ$*Ubͫ7{g{?OjkkR*>빳EnJ)WZ"B---_1~[oeaQ-bf棬oc r-Jk3+4a(".\3gd|wY9rigsNZr%9;0ZL5-YdV߳gϦ$<Ȏe֚%'9s^DO"SpwPOO 23SKK 0zJ"E)Rx]#͞-uN/Ѝ0dMRnٲe{(L)"E)RH"E)RH1"8-sY"R As"!iːǶ;l}|Eræebsuo&j u$"ފqO{}F@bQ@ϑ`ܭ ;@ < L2+ڠڪo^75ӊ Ǯlm=4" I@JSNl>DD̢}S辛"1|MaMPwiugg?޻v 6h∙H(NHÈx@S=suԙD$@$1! q%RBb|vyڽYU;>Ȝz3F`,M'vWx՘Xhã&#zLr2/VĭϩHqdOJ!~,hWYuÐ/=tUI@{3{KT%6$0Fw"*TKNNdG[ý3 D z_}|OʐWvҪލ&;Q@|' p w"v#-]$%a}+-TXl[:cL)00@[7afݬ\[$ 麕.߳w%)HĒ2EbG<85V[t^leJYPÓIz :Hz"̀0do,ȳ39IE|M#%LU/xI iї_rߋ+CSp"0 0),;e%k4IaPY`gf cutý.bw>vA!!5 ee1)1)-ߵt`T$+gҺ0aߥGĮh+%v;WǒFTق&sc#`U!<)^"0(hͶ>+~5]; $T" b+@Pv QvJX1$;~(ڬ0Lݑ  J0ACV`"01+(`R0a(a@*{ %Jbk Zi%"J @ ^shD%䎧l_@R\%9]ĪvBOBmPJUv\*Į2e乯2 q|6VB2nyM(|Uc05;6 v0ɢIKsO!s8,հso 80~qi~ JUP"z?n6n1SM_vdU-E%U+2xhCx襟MeJD.uo3Ȇɠ34O/[;2VDa4Vl!p/n@d T9+&xo`qXKICU61 6@ l8q6ͰUU`[fP\qH ٺ%$k dm8 1 u#5S1$ִ`[BscƤF/ArBBoCqU]HTLt {ECλ֋g/lތO}EE/pVÙmgN\/[c"j+(UnR`HD?fݡ0|-VĈ"k?f9Ĥ"| \zٳ ]^i-sTUD^Ppi˅? +w/D-b7)0 ״'`4ACQ TnȑzseWs}o1.)d=*X{3v̅Ӏh=J09ڵ,YL5=򣬇u!6EFM @2lr.kzSZ*H&.Įx#!_۽q*w\0PR|̫6 !״Y[UuP+Y˖m!@`d oW~|owtBǍsH%Laj**rQ%Q"F >|i# !B]l_d@wL@+~>ls|e^ rcCXu5O UomO#m $}Ժb̾;͐KZiu˒B^:E1zoXsZ_Bb3ٗ1y3koТhRtD 0l&H@qyPޭS8:ϲ %ôڌ;~r3`mCBsg/=gOY8n;܆cU(VWwm,{CV@ [{x?z $e9!+Dm¼ϞN}jo AnÍy9BkD]9֦ 2qijq6d\ߒ9)e1ˀE}yQҷz)6o2&66dҩD̸aȒ-/06"%o x Y4TT2ȰmM^DIp Ecɔ?F&oL>ׯ (8\E_6%W28$WnpA3oۚ+a|>b7QJjƝ Y &IFi$@zruqs 1c8ښLd L?YȦNk g( C4 ^3鲅 NVE4o_okt ku@S '%䤇p4@ǓRNpF@NGt җq;wy?2d4ڟdUls2/o85$|U_uHR#GW;?W0gٝd982`p;H]r4.Ib? 0sₛ/.3NX}sۊ{ZtQ+߉o)rH XY9!_|{b5({?Y%L/- DT:)ִvt߾Do 6X$7vu{N/_](Ƭ*2eɞ8=2o.al}aФL8kSj{Zx{F<-5\TxO._Y.FOQ& oi=z=)s{c6v} PP&s&Dm2V!Рf]}b֌tfv"cڽ A{{N0[)0QD݆"m5(~`7gy}~^v 2m4̭X$H"E)RH"E)RH"E)RH"E)R8GGBx~w?=(mp4 D2\IIrDQ WU^}R̻yŏ)IRH1;eIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/modes.png000066400000000000000000000164501341747546300220770ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME IDATxy]UsTRU!0AD4D=|Mд|4Դ62 Ay dԔXw8?NJnݪ:χO޵{LjHjf?10&~Zc+2#iWҗSoۑ6l}!5̄Vҫh`!vhv`)V` Vx%e^gHs> Za= h殺{F[o >+zÄ^ z)|''}fX"̦}=zsf-S1O.j(_'{g"윷4җH#~b-Gzӣҟ{.|u6ȰGa4ƈB"$r7Tm#ִ\Hdb4 ~>;l*J*2Pw]Gq{H]23J+x37׃V -9Vh%%*LzL{@EMNڜ*^TѷQ踒DjlUuy&8 vŠyΔG!k*{O^SǪ_@6C nT 8g^)$ ehuE+~zI=HoC~lqе"lW~m8ȐO%` |pLkdSr! ?C Z5+aw 㚱f֒znz)K{9 :xa ;oȚ& =+;>nכ )K).\iNx&IH dז44x;@E}"@<@`@͚"=?dR2CO1 dSIv%Ų-AHH{7d%,[:I)L"_4` [8y_k! `@' DC~t~'K.Eۿfn%dPԟ{a)e錺Ѷ%mcrw_dAS9zs g lL1ǧ 'z 7B ~~Ik J)iX]͜^khB ӴcT9?Ё@`n^P{o]&&czxl9L8qI@ t=a%%1-iaZ6-0- :[MAN(C$ÿQV(~" iny~=6r*Wo$˝ox˶|7* _It൥X6)L!a~Rc5F g`Zڰ|*#Ŕ{4_4605<{4A</ מYL|4px$-?W# SS1F,\ó zQӿpIؖqgXRO0LHh~xٶ$3^" q;Wrɇrqk gOoF;zx)(zԲz5LG~[@4M 5>y?w=2e|Q'AZ#oi揪1-;~/~^>DkCOD}|pfa:z;yCH3!Q{qohT%yt#4^NA Bə(M eBplg ב>=O]6 -1JѳINzySg0϶%]33Kɓ/rc@w>q8z.8h>v1tm)ar磛j+rwݳYcEQl=ߌ%5ͯ[7CU0-YYEc<?N8aM!??6TdTzqѣIrz}"۷`ED|(s4BدK҄`X˪zSEZºA^qt~ժ'XDf;\Q)IX:WIJk,)+l6hm3MkJx&Ew{Mx$SڲF+PFٱr7⋊SO!B X6ʕSjZMʒcaZ]TTTG^ҁYGXɜlyirR* RNZ4FP>UF+RE#g % ~˽)+pz|ј.AebwL_y^N;eEV\kQtFHt5􏱥^+O3&En҄%ͦ'T#P5 Ɏ\}uYu@T4 /S zɤ&ϣE S#:?2O{ec?aGANǔc'DSz uSO4!/\{ew`eaEVT;P3Д u6rO/76_$ (#}BR|N%%#m _˧~++ZhFB:\T,=l# *ZAtL5!;7=FK2Jgsdٺ]t+R}T]̾ Vaф T; hr=H=ҒE4lSq z ?E1Kѕx@yhnhk!U t%N'feA Ô,lq)@GZ7ytcg&̒j<#-tRJ;#tO 1/vVTGnM4^ht4eӃSET͏hIО*E@KBړ{)#0TBb5#} 4KzVaZ^CR4’^CEXkZMo5ޖ5H+n)yzR]MBpf'O9hGj{N(n6y*iBq%ﶤ ~]N=;x@hxUت;@ Wh7dS.U&=T͸%8o Iԥȍ5a<]Zҗl(OjK.,^Z]%=) jA+tHMP,~kxOƋ&-vCXSǼ4mX=<48䏿fk|Oo.sLyFho@=N҆#^xPJL4txm^jeěIS2OzIDu4!ԟ^>FK('Au7N5m?ER3~CC[oT^1b i3ro[x3gFQ ihԇ{:ޗ怲0rPPnR4pܟn+fgo$ދrك]7WLs!1LnT8kZVd=ʻjj oKd7` cb+Ĕ!uY7yg깤ezq!ݩCy5f(j;/:G(CH6 g5=՛_[s[}7jE5`yCO.Fj&&f|Si3rē5E>ԢjwKsqI=Wz&1ϯNpZz T\ M:pk^ԍoE28I>\W8Q4Ǥ/p~wJ:D/` Îx9[@ mj_(HY4y* }AJ-ƫ7dB>ZnH ,|0'?-{g@|)A]b (].ۿu𬗄p6aZj+wT4޴DZ.t~kagF:1Gm/.ƛi QaW{ɞ Ց>=ߚ6*Vh]q4:%Ű/-|Ww^>%([4޼LZ?͟w=͂H~}9 QXZp1e;?(߸p6]րKub{2#qEV^އR%(;KzW>V{l'\cT ia(,R&xB(zPԓB(RRX ŌC k9\.u6?ÃT>\^@PlXaUVEgry|savT%oMTާOW6~HǙUۣX>0v9C+;#J? oMpUD[Mcqְ̣'`.KXTyeGHhF':~> A4]eg2Iv7.R&aT8a]K@T#>r7TF:bM˧i-}Uw Y/s=c>ZMW>iw}xiciګH[ &L 32ΖPכ*X˪i&rp*Q|qZĤdz}kV~5" ]Wk:x;f4jF$OCT=߮Zd-)NԿU{JO_ԃN*ՎB+)t|U +sUz,8Z.9%o~U˝J_I4֔sJ[_S hY=?Ve9UN?Bpgg蜀tay a&Z'A8w{03~c`O߉'RRjꆍ ύlo+k9C9܁xƣ"_SʇȺ.D~9uE.vR jY_9Ij C t4F䦓? _Nz(^z_ ;YE=6s "/IB BeE*igSv˽I-^(lsɭjg .&޴nYdhzf/J=8z!4w N阱7q^m>{}<3zfDm'Λ;r#/K_I| /W۰GbNJOy_vf F7K_%|-hhWьT/p' ۿ; ;++DԐ~4caLVaev2oА":$䞟z#ގ/a I4x}q7M7IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/music.png000066400000000000000000000207051341747546300221060ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME4+ IDATxy|eUgyNjNQT@Q" 6>EDQVӶ-N`mO@mB[d*梀ʜy:?N*EQSν7Mr~O'qkd|D>O|HfLN~'+%P>Z,biXj+}b&mJ5N6d}f2֊[YY_En> &fCνۈl W=Zj3XLјWK.jY3('ܒaOH$0\yĐPSA=Vq<>#|hB:-L{K#zwj8Fr!<Z/hPr// ^sz,":ɅJrO7h#q7 (ּpRɅt6-<;#K`ы(]FKr!˹Cx~=pj-G.PQuK$i9DŽ'~/; ]ɖ5D#k.3>뜸ܞ{wHKY`՚({%r7r3jٻ EioxJQoЭXy0`$O}}P?*7]YUXmfv c!|"W &4^ԂBCn xrB'w^.NA7͙dS G䩂W $ ? !r-nɅ範wV$+72rԝ@ Wi&!$? ' 9H*J.o=}7tj/wЉx1D%0w#3G`7~q|䛯&\&-xH3# _?NOVwB[:B᭴k* i~wG ʞؿ? uW9>laUOBZP&7r+Zʞط> MsD^ n|OE\i*1$|_E<]zڠSPw/t b@mPeO'vRwJak"BGzaaKPͻ\ Ktl~Y gB&]V^6$P@N&Bu+yizE@]oCʙBϷ8TG֑m5Ҝ4=}Ɉ ˄ ZOFB Is"sHf5+Ps Y/ur@Ud;oVP I/s={8Xzͻ:l*GUuJn4g Mv@zy'j|?t^}@W(B0@tp"!M%s(eܕB4Sv%9oَ%R(U-ĸ]PI:XvڜUy(#5ȵ@$Z[1*:=~yz;.1ƞ3xGomU \]᨟˅e6[ GO޻EUA |÷wZjZ+TGn&3 HS>jsÁnXqȐ_HR"(1/uH}R||`mA]@ԢF/-a\Z\B(| g/sU [y~ cI10°,j>\82 % ը1swXxG]LR}qv6&_4He :)aJЧq奧S˻}K3MW4퐦^/4d/KW *&y`k=G_EhEݢC4߃WUW.6Xw9>LH^o'TB+P'Aߺ9]FSm]'C(da?'_E7- ,eo9rֹ{lw ώmkܸb/sY62iZXBP tÚ>/BGS%+3%kފ m8֏՝c,{Fl6G*#K` a)d vCbiJTK<${Z S9ϋۆN3gd<%BpZej,cD-,i2>*<;/s~m7uyq'|n'=CqI2Sc9kLH^r 0- ulYzF_e=PRU]xbEK?ܒ:lo9~ug`EJ8 Z?ؚfG^JYNV'^~ݰ tBnܹ5}v%эbʐjX%3E rMfYT&BZSĸRrvv%2?caZ…"ݠAzxjL ّnؙG.`c#Ȑ&t7ߩq{ Ro`~&#BM;%vެt| tCԣ$␐⹪ F}fr{l!\Z:ޕPI?yhH-T"gtP!>}pHc Ǜ֞6s"m@dse( 2U Ӊ7RӠA|WU#! UQ*Sk*N ͽ|0H_q8ݥJGAU^j8EmTl hxKȬ)T_#Nn>V.`XG*]ot)+%pzT v [92Fo\Ͼvȍ\Ĉ:,j_Un'I(ף zj* a[sOXB7+U>QJrpd|.eNKz.un 5vey>]l{L!TCO.2S@Sk]ڕ,o!BCt>H2x u6Du<_rA{HSe<"ȲV޶v'wxTeaˏHb?y\>$0"˓MaIK-o__ՙ_j :^i[/%dٮ#*˒_6-]F$u<%udQ%Ysݑ{4Y,A$aݪvNnei[~ # ]`eI""ıveo?y'hQ[ ,C~d ١%u׽+Wo'8В0\Ïi#hWe@Du!u5s2B-vUrY(/2hWe@֠Z Thi01g(&+x= F4裳1ZVu5fAl0@mEN!ug#X E`8vĦ^6a ,KܴSEA%ZҲ XwT;[-7qh䄧Z~w婮J֎q^>ģ/aZX9UEf4SXY쫄R]JYRmҒL@Už*_f}lǴ,\f7-Q0&쫻GjUdЃPIRPF|B..%hP1vэ C\=δ&܃j5џ[Zhg[ޥ/%Ρz\obVW-nvw Lgs,|=cNutȍ9a8%s F۳eqȋ>H`$] & J?cyipÇ GP}ď߫V?*PUY08#aO:P iԔ{ȥ:zq!ugdYFeN]= Ecp/#\lg:<UP*+HIf d:a$*2"i^A/̔ Z:ƒY[t5E9)c;gn=Gݳw q{gHf s:nX~*"A Gu5nU;͵!TE.ޏn ƌw{+P_w[f]C'N~SfSyQ1p3̦eS[y g(\nbXb_*t~!PG!Q;X<ݜ@OS 4{Pn}TD>銷rY_1u6 yh?.hM&2@n wx:o{_+  k)iE&E$-Ty6ltsZQs~nc If 6*2!W^nvnv<飇u4Vg=#/G>΁8B 9VnPN7uYƣ)/m;>_~Rh&ֲwxG^_.cG)I(Ćӏܓ}HG3^ZG_] b[?iߺq EsV6Od4U/E:[$[0yB/KZkXVMDm;Ƌ@qpLf/wْVKƫJ_8l*&7l'%G6NeC@ pP@m|ez# "yI%_4gDow|XjC#lsQÿ@- %cH#ZIkz;Xٲ0-rjew4 ̹}\nJ5òUB~ms0'ۚjB.Sn#+5wi8$5`.fTMK[CJ޼ĚGvNUpQ*R$GAgW ݒ!ªEڬv^M!sq! =)yZ7\v:MAbQOs*x5SVup  N=r,?JyJ>!v8Eח5{(΍w?]#T^K24Uo;UqǞiLJncr9jz(AX vN~VF"Ldo.V@;#A/KEkiw}#1v]r7h9gz _P3O:JXlEas?O˶c)|zI&3Ȳ,{hkZf<Ω!)g.l-hG;ǐb;EpHVսPwKK?ƞ${F3:"K0m 5GYZKSmۭ;q@i>;gdJ̢[4z~&|÷]B*deab2]Lk$;bWd EQy-bA7bo<[tPr/;?PR`-9mKj025kPW$Jr-_A(%p„_r 5k',PDȵCɗ.p2%:Y~(jDcvdm#P+ -fR%=.ÖO:v5Ӏ` .0B\=eep{`U%OfIwvm#A3eFِkڥ\.gn?!jRq6r[K:\ArߘRɴC j8Z7wjP~D{*58_FKŚKS7U[>x~MY>mVl S-Pz ]-;+Jr we'r8.43nK>[EYn!iP*KzDѹy5H tI#.4l筄kIsRtl^9`<w1\#~qd6LVBu˧iͲHǶ g2t|U ÿً&l-OKӞ yYTTw!t~ԈY2壮֓Pqь䫥c[J:KU]6lj=N&Bu+fӱ-T3󚲗,{v&}%pA@gR;)}_F)l{2h2S0"b2IUھ8~@ J G+wRZKApZOJ5=f֜Ž&JWp! Z> -̱UQO*)QgY<oHVk5:0G`nfeߥ[LYceȋ}e"FP.h|K0z_vM؃HھFY*pR> 5HDhg`(co9H8m1o|EAaϯwV$+7}9΃ikՃē00$8mrBU/6n4<=YII˥? c r DNR~?̫z̾xْ 5[%T]U\TM i|C GI-|Zf ;>C%{ONac 9D%nXАƶ ͨ'f&d miO(Q;@ɷU ;gRܮU EJuK91|TF\؎ y>C-UH&Ƅ'~/;fgrbG(\B$Z7'ΥCB-؝p)}Ѧ9s6-5[xbwGyCG^D2µ]sl(FIDAT|Bf*1$bK^EGt;ϛd"&_k^sz9s.HߨBߏZT,ҕ(z|53tޯ U'QS"};:0"aN#ظv^Z$z6$rqӻ#xFtͧ/[+c %4JnJn#Q}}-,h)W.r[%mJ5N6d}6tKZ|˰:k€>A ('*+l55dV+Зj j NǷbێüVuUmWCfcE@o0u ]W*J`:QezYH(F=N j屇jVKswVt$;&%db^ǯ\|y!g;lNkuyTڎ# HjlUu{;†5KmG7Tlf;{CUU5Hߓ۝||)pwq[Ɏ@H΍y fTCR2cp74NYuija\&?|o8rcDȷ\aXe/4I!MՀ֩E ÆYQ7u[yĥ5uj;g_OGv֊eoe:͘$yW\J\zuI҄@}/ !Cf뎃Q[RuXYӀ[A{{U7}&]9;Jk>nj<^kv&7r\HsJ܍f=FW}37dȚC/r_Nn ~y3_%]OifT|R¯an 7́8y Ĭt+k>腴X.ۿp|d".ggѺSQ@ԇ(ϪkIS 3w_[Fy5Q{[՚}”-}Hk>]f>:-':45?"?q6Dި;=seŐzCH|ԝRGPK'̊VtT~^KVwz̡5!u'BHŅ{O/tVT{ݭfMew,iraVzoSh_yV 噿dbnYk;}MRpimHJʎ+Y{QTau\/@~\L+N}gr4;>67}N<&]'ԭhGs[_>|clClC:Rv->Fz bH݉TXυ4s R ߊcdg!t,i21/ݩV+n-cs%+_JJxWP +Va:N7/W'H͏]rO=V<=&UKڍFi CyױZYS5~DaSBsS9{b;3Vݣ'f 76pw$))ZiLLn|} oMVL!ཧ;{  QV}GVn7mz+ȏ('@Zǹo:2}翣X껒,AlH>>I:[`B}WծPN[ǐ0/eua`)b^( KlOii EVChIm"ZH ȲC\*TYP^9Ѫ@C iQ7sYjHL 9T"KȏPV^7t=O}R*<R(r*o:_/uȏ4R5 I~ݎ?c]{cSGiH׺W^pbeUH#,iqnvyYa?4Ny_ق?҈`JWT!u wOm`U)v|T\ǭo8:NHˆLW;SG혖[8H~!bm_}ѺPwj݉sa\m1Ð*U^ ˭v -Z%P]Ta>c!?\ˁA)4TXf7F(%,ͺԵ&]-@f,8_%";ZR䦼d<Zgt4KH˾<Z )5 AwnHC5(sL<^fXaBa Rۚ*Oޯ^fy _q_|JIZҼKy i,-HFw ߠMAڽ! /KXN~կ#ԱN)@)x]>NU*!Xjۓ×Av ~r=cZOI[IbYHJ7U"$d^>Yyӧܛ! zej6teցtN싿!3muUNݫ){ 4b %aGMkByL|րt6(Նș[>?Ɏ WDCTaU'To[9D9p3 ;~nzp'߽\W1y>*ePTdx ˚7uZp:t+Kvb+ЩXfZ0sV[#QQ^ɩ4ܘV*Wr;p+jFaW)FP[v`P9줨B9"]1v! h+_J;+D1WW4^7kݵجhEjCV!ʏ}ލj^0eIWb9+Aj_8 #_VYw\LGT RߚKr SWҕ_}wοp2c_ԙM8W ]*R *g`UfU/ةU7=E R\ϕΜͰS^&j,,JW\OT4;P;/q~M0Cύ&(gP;KoOC5/eQ^r:H "@aZCQO*LK KgW@RsH\ϕ m G=(c?;,@뽚`aUɄQ[SBr'a_9jUI[`_*Sڣ+"fRTj_pHwCB'/Jg\_ wUU%T=yV^GmRu;vr(i߲(.a+ѹB㯥d0Mdqh#[d`rD`5@U݃mWC5{o$[_j0^G>QpyByO;WW*^Lc}Xy20~%;>fXsT}cC`q:GՔU蚎?'| eyjUId&nrd';杰joYJI#"owPjʍ"* W~sjwCզa|)W;Xrǖ}冀 k0VP3}h8fvx]=UfMۮP zEyyvkʂ}%䷫)(tW^8I&?-lw@l~830]ruR!r}#w~ceK'|m>8`6&9a- O:jrRk8q雾3uO<΁6 e2g 1Щz>TxЦtaUzwnDX=B; 'ufݐB%6=8nبf~=!y2OCa{msiKdǐ뽊`lC]qQ[6ّwj&Z;yɎ_B1;*މ% KoYHRs[oK_% O}g<1f ߞkVdζ} M-qnwtȭjsI/#[[,4wf^ F~+ZUQxד;z\ 4LF21'= 㙻yuM&i)t\D\‘XCÅ=<[ p(.=PacR;'~ ;2)\N?b&nnTbZ_!FaTS3L!NJEz&j8Kw wk?b'5̜e }ҳKSUB!>b,G4]6J3f^x AJ(OuMݏ-uH(3Jm'Pj;[Z$[zY<+Kk=GRNxd/ķJW\m0cP ,wog-eρVYC"J.H4QF>rQN2g0mɱ #]ݟfE=XfN8uyIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/play.png000066400000000000000000000364411341747546300217370ustar00rootroot00000000000000PNG  IHDRP/bKGD pHYs  tIME5! IDATxw]u9;fLzBBҫ( ((6tem.UQ HHHBzLs{9{d$SLfn9yi}yPTiOvΙ$6fHl~d; `?J?ՠl@ 0 [-Oc$"G|oRqwF9.@؄ 3' J>LzO^Er"d!J`-*d])P68`ģd{w!fE&\=~9exj*Nh:^@j1s{+o]T)P Ol2R{N? v4_ ԘZ nIu%qh l)l};q'qS)鶽jTExkoÃ"aRZXФ?w5KG+( T $}FaO/зhB 9`q~s)PNFV)Z+%@ə~]{/gY>'7w[O;f4!vFxInϲfJy CX#iapb+=vBySN42/`ñ՚tkH5kg>~]fx♅ʂb>tρ>X6!׷E'n[9chg})9!>⛖} "]KhՈy"WI~c?y4{rFOm!0CpI_Z0s iyņJx8Kϐ05cB<8 t"߃X7آߥ^9o#v"NUYf}!."z/Rye"Zr>EۮWzw&`ĢBy ŕx [1C¯`ǟ \OQeHϙ_I[}dz40}so%NTFkY:TtSߋHTmA% W阮o ߑٟE"۴@ HGڴH?MA'ѿ=4s09Ef ,z~s-"_ gSj*Zyzgv@j702#LsxlL`Jt&P ~sy=_zJq.nw$G L s/E>Tzwd۵4|)L@rA2TUVe L0gjP,Vf?dZ!ӥ)T M,q'wCe9ޚװ;Hx`~Tw#KD_FPpG 'Ahiy* kOH[\M8ϲ:ǯ2n 4!Gv>] ~ sB;ZM>ͷZX忦[e# EV> P>f~RJ >̠K0K&R.Ԟ )$=P|性̐(q+j5h@3ҮNMp۴{_ae |Y1ɘ H$ }OQJ}CSaz U0wNVfh,Kohٺ}^leptwBقs2Hud{dRJl=CL01Mk^~qzsA˥VElɴuabIkn!0 Q"b2}U\}?A*ȴ [% T&H֔Rv/D$ߤy:6ͽd-.'5/+Htgi\ϕ(8 OUVߠ&ܮkn7[nG:`WwIrwn$Wz\=9h_*-縑K; Z;v}mHl5Ob~9_&"fḐN5v}U}Ė8X8?[_|6E+9R|~QhKYJ{)=ES(6,@6\%2m)v}=w1:I NçM,:JσB#:x Tj쾇}]s6o>J}RһׯUĿ(Z]b>Br!i|N52\(>C[c#UV7 Pn5\"`L>h 5hs}U* `#'>h  kImȒەZcHMkL* YPPvNS96I;mulmVp /w&-OXOm|ȒەxCر?V >:VaW4g23'vlϣ)I U~C"K֏VM?]b pԘ$#x4jd䕞 7A;,٬P ;Rp|}OĴ1ZJ2{?I+dɩ†|IPF9;795.4Eٟ& lEnY; 2b;?QQrt~4IU"QoUWwInCωTì :΂ V SUvl>ї}Gj׿^&?|]?C+㤢[,^Re>`G@ԻȾPv T@O*k]Y).F'w^}kR)^DLtVkıd3< 3o*t0(>M('8~,H^Iُqș{TsT<Ϻ`Ol>zo+TAgs?|mÜ%s fJ/*cN+`,-i@m0TbĂT%^y7_{d;R?Soʫ:Ut"]>=|'sSrڱ;1s5J׋F'&pR?ׯTl͗ |U z4SSo-y(wЛYAt-=Q)%R|R=z?r>R*Dre>!R{/YTPtg)7[8o8;#o?^:~_D#}d:4Q_+R|*9KO z:˨oTP/KY@|L<h?W_8c? §AퟎuϬRU"ҡA1^5 oC.!xGkxtDщ.䇉\7*BJ)*A50}ҮBCE9 EnwA91P(9ݭ}xD@p\^f\`4~QFEveu}h rJY[MΈnScnld7/*˱JA.?owςbT R o-w⺔2&J%[]wW[c rlJzO!)GYxgUJRփ}Sg"1HjG$Z |U-2u jJM^HlؚG@Aim,"f ѕ 0Pza7TA'\(Si7A<&=OΡr+c4G)%\Bl29:侨U viSK{/: GӦ`r ˔Rub"fAz@<~Gr6.T̀6RzOĸyUT.@.U&xjW*pB Lcx,ݭm?3kJ8g,NYTGY4ў*'({_JF)e_6*t[;iAçO _T&֦.^ X֮e~aw xzW*29}liBDaGK7ְbn-4hT>-9BVmM>Nfyo$zhūvCKĉ/lj׏m{LxLfTOS>Rd Qٲa^}9{٬\PKy8 <0t<9 qb/7WZna"R juLc}y~3r4 >:z'8sL.=u.:ySƼ5z|սT5Z 4Q0ZƒjG3Qs̩|zIןFON@KAjb3?/[9O]>Osc5U_hYezEd d6LcE>9^'/c)h17\33XJAsV:Ӊ3BUd[y^NuY(j*BWd,8CVQ<~/}|#12e+Y1v | 3 5!)Es5<<;%d_>*oG~/ afVL>H=%`֒}3TFѷZ ɐٟcR0or ?[ɹ"?,SH4tU4uyb힩.ǘ&1@X@h$tbέq@♊޸zS;to=r#8iXܠ"8裬aW(ۦ7"g;R᠏w1$rbjRK ⩘mMi H nVm+5EkE|1"bSY^mw?֦.BCز|)+$cx5_*Ns2|Cvr{1VF_Рtd|Rjޅv$dm*7rً* L|X&E~N^XG.?Kedxa[S7sTqSi0d :S.bz~'fF;{5ȑn^|^k|yiE9wQidżZN[3*hM&j(L܏RvAޯQ&/D+8d@0!tDEAs5E,U9`g(Y{&~#6gCrHusJ&ccmߑQ4wD&T!BLd:K6c8"Mm8iIm^,DM`R~cye ^oE u R1kyE9.mͩ+@ƪE3+@`^di)3է8'Em++MMhAe29{̮) X掾nTףv&&vvJtA$ܖ>yrC>nϫyv^B |"FtP 1Nrl҆dvF29S<\-ܠ̪0Io4E[w G)|2dmli!XEzp,33K[Z&2V^] M:cOScďbkaPWQLuiȮ2>vؼHB@Ti{xn>|uŌ07Ag$cZ}Vm32v9w 1]ߨi~BƝqnON0"?iMd59@xL1o事QRRGH7C&Q՗PQy6rWʺq5u~_ĆZJX8=vwXA/c =붷ڶ0euv'htɴ[PXY?t&֤}ƅ3+%<~/=$ũs xRN⠗=kx. 9d9D:b'Ԕ9,Œٕl;;ɍ!嗖 IXIMZjt̪sڢz^l*GWSR9=|ةL.dDk]4U{PJP֏PiG L8g,ͧϟ|+;Qъ!q$U:$W>p7CJ[Omy9)?pH4pn.Ҡ?CWշG"XgVpͅKyًHnJ-@[e!BKI3>GSh{>6Fu(DOjWq˝O{Ig +,Q:sKLfkeB"[~_EO4_7aYv@u-̥ S˻z!۝/去VEdTZ')ooYn%"T|gr~{i' ^ˍaqKڢ4KfW3pV̯4 1izy,>֓9kLY?> ﵰLc?{DMvY]|V;mQƺRTeu(/~T\ u5eyHlLB5wIiICt5LHe^}%AjB4wFKO_2Mtdw@HٜC6gL(4YfS"/o->IGoݴ|k`F#G vA/'4V1 佗,R9et' m[׈.*_?CeI (G4*ߩW?MEyBlC/ng6WP2"2".?kl<`x\sz^Ÿ̋%28J Jb=1|՗3rI~tC%A{㏊蔨UPB=z s ]>L(%`zHeI\ZĞ=[h.Y짠 CxLCQ˩fps8ea=ޕ X8 !̐HesrG+|C(०,gqIsQY25{B ݏ!t2M 3TB9TrHnߌ)7CT[[:k.8KNC"%GX^*k.+&? & V4xf%TL&Y0wދ)xL=@ﳨ, RU 2͐کqb `UWը'YIoY] IOUQWQtpG8;\KSI"×?n. @pf5%0_]EЦֶ=Al=)p) O:cndhMkH[7kXxo'Jջ-k*w7Op0'{T}ihe+*k'"1 b SIHn5y$rbRu Tf׌a^  ZbkOy ;Bp_:l^|ufv"hԲX}/@/:% ;qnl{Sn4-K"}}ps} }ISc[򟣍hv~A&Yz YyYv⧄,0)>""W}yilRrΦAW1j !af*Mk;"E;]%Gq3J`~dDw=F{~QU|׃6lS۠_fέTߋ~7(ZN*G @I?'@2'*<>${xʟ&UM@:+(Qēd_H rLHlt )Ae0ͬ/yy8 \Uy7"I.zWcJTNwuz<B+ 2C`l(;V1'5_S Ԏ.QA-.$Uu-"Bf\?vM*f1pV~e<26!T :01 ySZtR;%I&=Tߏۥ *?y*~G|}%U o_̛}R-)0%];v{5,+-^ֿ.ՂY$}x&ߗ*_ymKG=BtM:ZŎk> Wi5B%KGRʋF&o.w}j`˴BV-%N M}%R<\(8of^nl/ V*0]k@nu-Qې-׊*ӊ*EKM2D@o jVǎނx?4HA*Jp)9'68惋M@t5Vi ЇtEmPьPU~ NUr*);b5Jz;xfx//SWsbڿi޲W'}Cou a A^,x;ezԶϊ!yIu7P@(R` }:#6jim} $y<*o4u_wxCT C5=}cXKVTC b' .t,'1tWqnἕqDV}OFT_eǎ fQ~ZULzUk?RS3AuES2g옢7cnChpL4HJ7d]_ZBfɴ1ҾtXu 03>_ f0E +WX0ZsKO&Z6(G@C]I/P3]r&2%hi't!Pwu?l׻mੂK㭹Aڢ|C~kJ#I]nNY5G4cC-&MnhqάRfBhnRj1q8r@*UW:c}PcuMBǯ[(i"o7c܆jA|⭻Jf~Zg~ 2 H 4[j zd |DWflDVEAm"]!8oVb2A`T\v]M#~8)m25)eTojERoUث QףRwQ5q '5@ɹ::h+' Ab$vf`| !o {쒽~`)ɾR}MP[?UD#qPj]f~w ާtK]Y=:XJ ]u:Xt:J7A:(Rh`5#SY0 # nP; 2Jj?TH啓4#UBHlb姎X`f-TSX޺]о!@j!`?ŧ_0vz#uYIt9(VA r m&v3dsyV;o ., ZdLc UӴc*i੄˻0ҿ#!"TccArץ,Cv}p2p)3bɸ(>P) = `a=,|փ Y?g:4iks}ZcfZ Ӯ}Ei HhPe40@}В/}@(|UZr'{Th-u?Rq9,j{/udZl%8iv dUL78ڷKњYY v ,:,VFͰ ѯ[o4M zTa#g-ƚ< fޚdw냣I4TGlD_r'uS98: 1:8$ nvgȻ?W! vE›BpqiߡxO$]j\8d ;o'|5@|bMdfL |GG;6 9MpܱDlJSцYK~3 iI67C,]AΡYg} 뵆S9Q`&BmL VvY< =yZf}ao }ߴ֤  kfy9^xVb'M=՚@$zЭ hAeZJ͌OݠM[=ڿŴnϓ9m=ZHp靤vLATM(PXe)| ?!|Ծo\Cң@LD2j9Inʫޏ9$rF4P FPwz{&激.OIO:s֕kz D!lףrgy~VUnq(IdХ''k70|cgKlB'D- Wlv}RqQңVЎ? ig;"f,B9 QG dT9$Za088>J( 燰z}[?<5gP!UW ѥAbO#9JiW`Pd{)ZJIg_34}i1X6|Vjъ-$6m'9/"^% b>=f;jXk5&qlp[eav>#C9cG_ |Yc~12gH? tLz !w4g(bs'Ӫ<2myahK2ԁ hV|N`6Z}o>>,A R#"kF+ظ+Ghr&^. V]Bgt1q(<DŽ3!0WQ|r'"9{%6 $piwJ]XIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/plotter.png000066400000000000000000000137121341747546300224570ustar00rootroot00000000000000PNG  IHDRP/bKGD pHYs  tIME '?߰WIDATxyeE}?u߾w޷faDH Ȣ(@Ȣ9#DN\ A`" 1030kOoݯm[63 u^[{Μקﭺ>W_կZ{Ubz\0YBRb.]#VLg7ՃtniY* q7b6a^(\%K*>tOߋ{9mY.&r^uQ̶{g¸R:ɵ]=BCZN>Azořz|*axܽwgoЭ↘Y(ơ> ܰfnuAArАAu;q>p@_ x @V?ѥ?lu+tҳ}TZO>w K ?SAZYiu]!}9=$cL>RBGCǹ9xJi~&ԳUCPKhzHH@A]x!zf#LZV[v齁`Ѣi!nLd7-c·{n&q9EMi">%pM_{ˡ*G*bk`d5dVs,h H1g YV%=ë!_978l=wu^ K6I8rV.R/~zaaKPͳLߍ4[/}WcF*sI0v}*7['*P`@0Ɵkũ tݰ3Zj? [oX3L v%ZQY0)k\˦c@ZSPۘ鿙`n!MmD?-h*-_-TG[ jn+2׳7ZݼVeC|TgEF4,W`˻QDž0pnhUP27/*BECođ[WFVN |i~򕲖䔼3M-f!Mħoz3Oۿ+ ˾iiͯ/kWCAn1p, GZ+VEg<)PO?t8 V.kٙ~ Vbf&ڿ#.Ұ,A? ۷pOMf.YS?-W8[5$ gV~ZJc[IY!ܰx[}d7aX~\pH#j>޿ҲaXK7 ޴43xtZQAmel,kj{ 51{ݼ3jI>R"g]R4!BӾr$!Mz;Ql[RnXղXa=oMOۙ3xn>ґ9MSmz{qX%[oij=Ϣb=Yj;:/zYuH=E[QȍOC2g߫kIg#?)0үpn ,Yhf!YH i[ iհ\V|a'6xLVR?#u6ZNߪwA\_W֒&{v߶vkqoUk:ӣbcw"L!-Ϊot9#]U=uWe,irjtM^W9Q7b34[K]Sگ5o ! 50pM]c>{wp ީLɚ}[A>T(t_ZpjXmjxY^z~awT Apu2+[{>ibzBQhzG[Qkz~kwCE!ʐR JiYN+WXŚ'pU*;a|ښΕ8\=BN:2ϫ[Ѷ35tZvrc9R9CFb]ќ[knM | kYD|JvwGXOjɚA5H Rg/S9Vd. X J$ч!M^u:ޫa]blO.&ǥ3ZEBǔNA] (]L>J">! 3Mj+LUf FvTyiZO w|*#!uP Xw@!Wj]̓{45T>TZo#۹iEQ+X86Y[cEENBu>ѦfA,iV92P˩//E~9CBRi?ƐHSC:PCQ iMKFlX„UԼ?҈`HGb!# cAUliFt#cp(?6懛CQn ӥ&~K.Y5KaIћ9mTiٰ[QJ # :m5]D8. ӳTkm@fLx/6",-u)rS56-:JKMfΆ%}%6 |YwͺW0l/MJCvB.[q;uЪ/{Eb5Ub<~ZUNH}]KPL4CQ*N)ǝQ+XxL7}]c(&{ǥiҴeږ (OKm-ǯ잳@bC'U"d\4Nyҧܝ! ze&]ʗ쉿!zk0gکR&շpU"g*V( S@)G_j~qOk$`/2(5wH퇈2ۛ7U/O(ul[! eMߥ^<Ӧye{ i4LgZIaW[fQ_yBpUZϳaM#S0zm=(.߇dC'sIӌ~ UG ?' mtOT1P(ȫUm/Dȥ\?]rwܿBPUZͣB}"zz5A&6)zQ6;W~7(U1nSL:"ZΝ8? |P_ zc.l%ZD .T(o"5xJ< S.]ɳߢK i`f=r)4(2ں\2}_SI!*]ؿAv3'npԂ[fcl?DT:Fwȷ\P7woV4Dy.M^gJUɨy~ Pnuq9(G/B <ˮQu_Kɳ ̌5ڤK-&޻}`rp,GðzHX.2V. O {M~X5X1^MC*;}tv33pUcITuJ5K vS,8Ú3*ƭ%S/6fo&~DU9^RWo}TG "ë,n>2XFVNς:RFNkӯ۟[akKO@R+$}CÑ[Wڻs876ޱ%dzl+y. HǥwFG+wSgz>p9kYurgC ᖎyf[;3TS)w't_4ت[GҌ)|,jAxYcfd|a*{cg :/W{YџX}*."9=g,+ Ɵ/T&m$mgC]xpf6=0@U5]dzD&pC;v #+$x4t S,x6J[GeNgVL1tٮ+0 fz!|5Z`& L=W(iu]aFSw82k  6jAy/A)kls%Cdm}G`tEMqQS6wHj|/?Jj =yʀY3@9ky<KAr^ߴ$'7H8S/\% 7x<w;8"V3w1Z32kYbZV[ !뤖d6ZV13x2+E, u1}TzǿۀV< r'gn24I鞾4$v1GuuFIԯp$@C"By"uu떜"ݱ;qM?YM^QC>~B경>!3qO#?|t/" E꺝&k8IW\k;B9'׍4Q5DkKwD(Ϡ9`a צ "=ҙ~gQPt~)'qLCcS-J=fz#@1p< NhkڕlW#$̋82ckoC_Ew8%ߡl[ٔ[>J q7b6a^(zx=L2LRJ%|;IFq0(~8 dzL%a E`6 #VLg7Ճtnim?ZqǑ IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/pygamezero.png000066400000000000000000000134321341747546300231470ustar00rootroot00000000000000PNG  IHDR\\XsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxyřGUf]}jjI$q`]xڶ0bY6;3zwysfb 3ǘHj!}]GUf-V 4W;3"2// ʔ)SL2eʔ)SL2eʔ)SL2eʔ)SL2eʔ)<4y%B\(0Aja'Ŏk.,եFr!e#:4A İ/}BGoY9MH|@HU8)o2Cb0Cib&]%@ؖ|޶mS/=z<.ZA*o#i^UujꪉF¨/%؎T8wBpW@u*DUe BP W$H$SL%R lR=vڵR\»V)߇j[tP$o98KPNQud urzF?De9œye2EQ@jTVu ߗ8nB?fUQu =e9 Np|`۲./yrQwuE5c-kPHgrXs:s* B$3@ "&'FOEU Va%[{f(rq/D5* `ɩ8=m>W J۶mGmQ^ #-@U5R+ーTy{}=k[9磩*݇ߢZyӦD0cDy@ԮC2_$uHd,9xLй^SX~Q#4'Xn+j 9Ha{t/=D؄Bb75hQR'z@G(%S7l|3[¯߱#U\r2KY^*Sryq@Db3RC k\Yx&Hd~:&XӐ_|:@p}$=ICXϝJpµ[8I*>B FRD,:p$}՛;;~dR K3 Fhn'o:0Xjݓ"r= (ZTT.HR`Ú3 6v~{F}7IR*M^rd"8+·ow5UUh~V]GC&qkEz|1| L$Goey^)X#=PKTTĨ7GF;{ky?rc0 jp+vQ ={ FiA-<={y&RP$v}D9E4U}t?&SǕ=ʖ˖,d*j*_Ū͠0xܯIODpB;eS x7EyzZ?NOuL@*#9/O2EƗ3|[Lhij  I. u5Ȕ}ooI ۹H{K e%DZ-E\4bo~3'%cMysS=$)ŗrЛ:r<<_ hN8w,)ںwȏ0-W_|!KGz2^`c#A[WwH`_*E޽?/ A 帎2A=@2}XJ |>OS]鰭(yTE+z^Hgr'^U'G~9wUw/`|j=H~M(4E۸b5Ģ\/ۿ63>!H.3ʖpNc#ױ-ߓoi>ۚNJd9jޝ ^Obz -nfQgw-ŽDäRY*cxrJKQ( hkik}(zs ip"<͚ٛ嫹nGPo|~OZt W|.^^yU\[0Nbm7Ö\L"NQm*HQ L9J۲v.z ~Y6 6l02:>IPӘ ,M BsS=i<-)%l`0~+zOoFI}?v?5ȅݾۖ #%LwO?DpsܧJ6D"9VTTe|^tr'S_W%ߴ,m/4%CAesi^ξ븠|NLu{A'y.9a s@d3i(Gvxһ'%O {l9rDP}cI)Z L o[)$S  |.@&#)kcY69>aA"ВgFb !&S\x1wmƏp=JQY\T\.ypaFO{oSXCt]D2űCZ:45>Ci:҃5>L9b`bt'`,-44sBKmێڢk U47P؊#L#d|l$_'~ɛx*OWTTMyy3%384F޲( خ. ~wp۷oD{ Ht:oAjk.a7\xD"Db#VKQخ{L&Tn鶕*~[`@hjмpF)|)I3LdffLaGJmz_x{/''A|0CcvK+A$" a"=c[6efO$P(OSaΩl5S]XER]SjڻX4L41MMUg?q El!˓NŶLٖcn{:8ln*W[xn /VQmF"Ec'#$ˑN'\&{^]qP?H4Z*b3T:t*ͤIm[ woKiƦx۶M")ap( M<|vlXVv:)>igo[" 3B3LhP h B="mK+ϻ(lu)ޗ[P*P6IaTDZ ߔ=˻~YWP ⓟ}w*[A G!_7s>A)SL2eʔ)SL2eʔ)SL2eʔ)SL2eʔ)S2 +&K>Do%vXTE"i l`(p=ȝbP]p> [Vī `-W_'x$2{)'zsi݄*Q_0Aī/}jگ HdRwҐy@PKM@m# EVG\^ iylEEsbLA5`8o"ip]!vo* k＀Ak+*`P8}c̲ xPcy͵2@0>_ ;@3Z=U+V 9DC"j;I\ .\%Š-%pekH.3<2QS6UXX$6Qb34i*&4ܽ{݃ z Z{`P7m``V`_ʸn[Lm _).kk!%vOxT54iۏ,RGrN.Á>44dΌ'RrUB]cj.@ -ő>,^Oi$&rn_3 crجLAx$טOL$x2SiSɄ.^ Bc߀#zvwKKFI4Aװ+*' OmiL$ue#6٦{Y(̓3V*;R7-ER{%u{ۀ...gLl2w5 Gdگ!p4G%.!lrvau[zstq4$:s 쥄D%Pal!gTt3lLߡ"? H%M7z,ع3`]p@_39KzcY@8idMrLQ \^Z3}p>vOj֙_ؓDg,ٙx` 0%nͮ^o؃?3_FaNZ6]CbsǦ,g!RЕݟKX= ewEXGu3}7kHtV-4 4)p5kx?WK矉"0{]C"gkǜٚ($TJ3%`rF{s!70ZO$egL Z ]`9 A@0ԟ+T?bxHZ>ڣ:{*\3\sh>h4ç__f~Ds6 9cS|3 }_ DYV3ѯXW8{P䦥y5owg?aR7=?5è\`X,94z?)eS2 Vq~0S o~ Ɓ Gg> 1d%8犝CMa;Nr:p4?GF{qtW3r0$Y0ԮZAg2,TmoO`#㶁a5çV bQSaxʍ}'ouܴ2Q{2k}ߑ!cB' < _w,A IE(͔a8k lX )wa \MwYTyý6:7D`9ào|5G+P⹺p3S`~Yf(fˆLok_ >•\g%@|K>ŏ׎w A FdU&/m0 +f@JPBJ 0BpR0ZKfؽt[BZfnE4c}_ϠwLS]f.趁`"37ߢ`x)!W_0GX9i4W`d2<69 02HCS9Xs|]]X Ry H35 a^weٓ.z OIP"esq& PSAGjw1i ѥ5~ ?ϻ7]b\8h24Uޞ^i5#eF^'ar]@'q0zc/1E߄$5yaUHX@hRojϼW`18)Q|i<0ЄXQ0{'>JjG'epxO!"jFB07#k{(:,be `t/d`^$LP'wX.ڷZE*GFE |TƗG-?'!gMU)][A+@gk~3B(h^.}xN:1g4!~o=29x9 >U~0z"ۙGTht?uqBhMDNī/,"l<0L)<~[eK3ڐ_&9&H`ׇtK!HF>{~.'Mf*O'!J51oH.YS=S+B@ ބ3hK-lbi0Z`"[9ӀR3_ieRCbGy8 E3Scht칲iFfl<@9e_;*@>3`2U۲:U_g3 -.+@< OD)DP; b9 }Mb% *|6YS,+VF(gy#tL/&Fvܞ*ӛ{-FE"ǀFzd|hkp鿼^_jmVh[Bؠ[nG?C#"Vt6_ԺaӖ/Ň&gf b*@lBvaj{u&bcµ#  wOۢT1d Kn3޺4DM5  c [՝nv)Q}ҨHi9G#`]FIuCgɺj5;+p5r4JeK#oM㈡A;p?gI0':i[_h]=P` K;6%ep`[zYf> zO2jP2OSL4P^&>0*Ѓ G3q#3 }Z^Cp9iC`;>0؃x΍#͠اZ-Y/)| gbNz -8qf:rX4D㿵gUH]y"! ۛjX ֳ&RרM}`cy0 w_N׏8p0)p"kj5L$ޡ!k x)}CNh'az D:эdFڍU\66a{XjB4M&&t 0Y?; K{IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/quit.png000066400000000000000000000202461341747546300217500ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  % wh IDATx]yUuNϾ  &ĨňQM =jLj[R?jdm^2=;s8(8#vƛZ:?y< $0KeQYr9"u1u![LL'|CD U0H-ABBPCUCTZYLRn * x(pC7^S F!iVo } .N)Y%c7Fp>,֞"d }Vփ}. 38V~$扈'l-`fV+^1eY)oT۹IP߇*~8b鈙&b3 Iebkˡ|w+1隃u 0۫ANQq {VXy&zĬ F!iZ$aucq+F2[`fDtho $KV7#j6ct֌da:^kWX, ɽlCD׾CuJ@ShKM)TVU Ij ?c@4ᣀM.+kJ սI/wkgq(`>"1iBP IaM}B.Ot-Ja2F#8 v-w=Rm[ FVZZɀe,2_佀g#Z x7TֈH]Зd{ip{| :P23c9ߞ:]< y0JO@6kmjTF J &>=tX8VM.A1gz,IGhO}›1ӡ:WoXRA$6*~(z=.k_ >X ( șb\*E \'Gm@Gi%6'}htp^SƋ.y$i}YKB90qW""ID[(8;O?xwC`f J<3W QDuJQs,[S0&cIoI w== ɒ?M*+ SJԔ=!g7yE 8 ؝"T&{&cHs!`cM=(|)ek$$ /Q5e/9=I}6zi 'Ju,+,|F$z\D VQہ꿊as ҋ.=@Fn8'`$[I=Ѷ?Ae@vC/&{[x1JIC$;` x U(dNz^$?BZP"+ڶ],~ p9 IALIdAR~6l]= * g+܏BͤIk~\y(ATZ~zil+ICo.ER"Z AeNTg1)ܿ ISnWXKiW#1甞u9CƵޢ,Vy}m1r~GV['S?F`ԵS\D~sWLPda,\ =Rp6z>WLRg%B?5YlK/]umAԢ:ݔ~$p;Ƶ%86,Wgۏ !%4ezjZ0]hv GZD͟ ڌ'{;<# Nmj;j]sgŐދ"Vl+BCqwUՀ_: . AJtM8:x=bcN+I[3Pק0g{'"1O,G'}C/XIO mV*J~0w}鮳~g&<^͙D}+ʿ$U(P)aκ]iOCJD]+Y-O.q| (` |z{ %9g+N1d .G"MCӑt"[wbүV]/υ?o7|QvLRaydWmYElTuJpzu`᲍AR(:4#*N,SCQv)rb/AL;6헬ٝAƁ(r"I#[qKىIJ6)I}vz',`ID9FoK4vtɚ]m&=~7{"u"X6ehI*98jrƸ!Ԯ0O 5_wPbJI :IS"q ( w̻~,uu;d,IH`2V/q\Ï.L@EM娗|ږrP=H*C9mL_ d h}Ps0$7IAv1a 2 C ЧM.N<`hl ͷ0" *S:/B,JwhZ0` dTz01x':2n>}g+e=W͗ OESN^E6,;[XA?ߩ$ՏuS|9s v42ê W#עg ra,kNhmxtDUyW|OJо ǬSO]elmU;>p<#OkG/OZEĀQ6b\u1a;mMŠ| \>Z,5_]SF3={@x7Sn?$kyEvqgIz ͝*;X̙z>z=uaK(:u3m8۞FV05xs[s^k(/ #а.j 5I |%mR C-^9acXf7IuScLY9ΓoQ.~` Nj)H#F ɊnJعGZX-Р,߂iŕch@h*Uٚ/+8ޢ Z`2yeIq׵غjRT, >ED7ʥHlz=+IRkg(lO! NjthG[=hsġXjujL:XQYhE ꕟ'ERpθQ)jF?a'FR>C; ~d9+#yA`^b93@X :S_(ًhXD݌ٮؕ/m%L4f:fͧE]mLH 9 u p~$@(>xUxm?+nUE$gUS bNIMQ}˘q,}p,psĀR*{0]̤.W}LY0yb2#\0$5{39\Ι *˥EI9I@_q3IdIYLoP?S Tg}%QI _vxkt"(QY*WK&9.Qd%V ̅^ͤ//8F uBAt!a1Kg$WpFZ.P_sqp.T{k+/A]H w#amLt> ` omUH!'D[sI kDsF8`̄ `OpB9 |s=H|pу0 JJ` 0Q~@H*H5@EI*u)sdj[Z%A7 )[s,zqORhHjvKyDMvß5x_wAz"Ծ3*)y炍%xs @xy/0] @@ Xbg"'e\Jy!NbhS` , Ϥ"S>$DԟBu.0 K)R<@$ MWжhz}?M]P0|Ҷ~gM'QtuXwJ[\NZd: VV-7>U$I18Zʨ}@K@ҤՎu* )KQf;b@>%a?Cƕn7ۉXx @U@L@W} :+Rr.C0V‡s7]|kS@5uHތ5U&np=I  Km1!Z2O,cE<jRW2FD tl!;o߱ZUhgF!e `$v< -o3YIOVMMxL:oc80@ j1]/Q" N,šɿMr^|%)}!8tM -4&PY :ѝ R118DIInI=M. J\Ȉ@:kl$IA '{dL ;8L e ܛ] ՞qaD>O+QޅvfD˹fkAF{ƺ\G6`HXaɩG:QaΩLpOqhouNM9!n 09k'QB~?=>VG61ӄ9{ IOc'QW@[& QUV,"f !YYhp|g;W!ni,d:$@"aFf17Ex뱙l~> l*7`++pC7)\/%[/QB= 6R 6rlH A] AW AS^~`BՑx턍7u~.0 = ĝՌ('IDAT Ӱ?\W -OY34&IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/repl.png000066400000000000000000000157721341747546300217400ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  3QxIDATxw\U;wz^R6AUCD+*""^@AE# oF -tH%;{?d3aΝ30;<<)ӡ'a\?dO+!E?y8AF%pH++_Ku Iǽ IiHτ5pH˵;{. :rѵHFұIٝCZ&^{: iww[*$#8VT! 8YET`DҾ ViI,vz +9W-Cv:՗B8EsQ ANe Q Y3fv=MC$ݜBEr%|mR蝱 &r#o&@vldW٫[1 Qb@ =.@,#V{eY;We{cюǩ~piivACLئ Ux7DہG@x]I`A [."L },\'v$`;0\}qwF?%mX 8gcϧ~` - 8OlG_ x_RxU06C8{=}/]r(PDSz<0[ >>-Xzbuh$Ұ#jD%fk@9asѣہTx =Z5"x+,5 il~OMi@ŀcb yLu Jx0^J&K-/ +S쑗] : zcn&Ҡzn~p'>EӀ%g)(0*e>ƛKZҋ=;F-./Q͵a} g"tdASc98'Ó\UX] і{aqN'ҐSj$-@^TM7D# ɉHݰ#iȽIy?scu͜Kү]QPiAb! RS i~'Bo`**i!O;5u^3|0*=ƨRK`qN#iг:D5-d*hp?r3"-K`DҠ;ߜ]j^}TZ3a"ͿQCҀK7B|$:'k5l ^ G xlU73怎sK{C?U0HOPf<Z9,c)dG ͧO!$-+HP<*I9Hr3he}?iY@uSC׆M3TFDh=kt0܆9վoZPhZT0!-`\HvwZh2*8piTxh-:m_hSyYS!mݼT$}?:E!N{]K-ABpCQ4[RC=%2˼UY"?QfY]ֲ$`迷}lןӸ4j&Wz80Fm~Xl#bђ@DCkY-K@jET?E+l>oiC%4wŵR). ~M o ~kGz_E4Z~n@\e,]_hܿET-6i_-r0o(lj+w:? kI*=Rp_DfCAG Yhi<~KٻڴXҠk F:IS n7 X/T0-ƛP8Q9YSaV|/pe~đ`R2J>2C I3e[鼱&PcYij얔euX;yCMdp9t?e4^C:v+Zͭ(3ќ!~cubbʴP ,i梁lgm|kku@A|57Hkqq6\f5@ɁBoeF)^cwj+ٳ o0h W%8,E6L,s| ]$kw/Eװ\]n|gۛ9y㩕۟>_ Ʀl|%i2聪E}Fo0|PV@yBKyTubh萊a-Tlaz|xQNU=S+7")^vHCCQMhN,\NNS!хgO곴NJ~va"$g(3#@7Wsc0[xoa{nqˠI"+|0Q_o:SǨþY9LRZE:6wHk3{1q ou"F74Ixz\ 6.M !c.( \\9g1NE\Ʒ1^p/h̻{'!ҹe4nyd%yYm'8'1MY8)Ƿw w0™Ky2؅eB]˒; e^\ݎ}{^) OqȪ26#~AʱȪe.$qib^Lo~+nduXY!tkZב)Y!}{}'ЙM km ]/3%3mۛd|~yG]^*Bf7N+KH)cK:Jt>y\e+cԍ $ IV&X\OV=ru* i"\ڜ'гx( 0w%ܛ8:͆ю<Q7F~Ha&ce^7TFK9In,wRO֘~@0!EDxAY\ҳAJR>$gk׾G CrN"(~r9\J D,+HVQƉA{D2Nj'X|h̝һ[}r:|{>3w~Ojͮʃ,(M@bĖ1r"xwcW[rVH7u -}Ya'[v{vgtN1noVHWٕ8$!0ZRW>b4rI9.(W^2C)ĕX! VHef#PfZQUYG8zXw( qք|<2v7%Ie\pf=^{Q_",I#< eZR5]QE 4>OhD^Q0:kVjG xf}EQ99wHE$S8)8PR՘yꝹ%hrY]sM?t,1$%eEd \\XR^0B]w_4WCE*9\SRK/KlPU-m'doy?hF)Y=}wqN(2*9 ):txBlnf4r9s ?ޑ5>g=$&DﲸQc9Al@ES@l% yJwΥv)4PZV{ QX3@v?hk&5^la]j !`#@թeV#Vsq}#ܩ]!(oe~~! R6բq6Hx#o3 PYG MZ?|0 O:d 5Xҽ Mfkgs1 lN҆@juN"X.\EE[aj%!U)c;sqҞgCx|oR@*]D$R#o8 o$3):#,c0U[>_k[=G8 +ZjKP?R/ݽ9|>/<*zX':_+^}m$RHw Wt O3~{LŽH?`Grl[끦ʢ>IÃ?:#2\5tHb?9 i_3"cONL՟s-Kēۿc9/@rv&;pQq BJLsTrA/_H[Auȁ#kk_˲"$v3z7W.^dJ62!5s?%ka`GR5Ǔ/f"I7#@oҾ Y]lk`5l$ ijZ\ k$ؔkxtuƦC`ArT_e?8 oE@ߣ_?֓HulWgxCMd <$ضUt06E!٫H, QOX>=nE:4Պ}7DTR a$_^KLe]3wNJ8j!!UOr>QāxM$u=hE/< !V5D7Yo"hfF+Zu!7l`e(zkT#Xӱ9Aju4DbHw긋Yx%:H äs 𼬮@p?>C~w}Gt+7%=@o4}5QsLN#)woP~ʗ:VK9a-_DR4H Vw6'*u+oz~&aVhE+2CjuN!qeڞϳps%˳B1aҫEs):`l]Lƃ=d=@בHw [PEL`lHӖ(Y?5t4 l s1Vta@LRцh4_Z36Ɓwv(U){*yJXm|ˉ nR]Dw QNv>˻|E*0o]֫i*gE׌x󾍼!:H.Pv`e@CQNJ/[4} fD)5~N`G9(k=vj<AFX\dӂU25-" 9yr{*"@wF4ey05.(-3$Ԯ_Cl"WS.>i= EtGZGK%ΣjpޕS װoC줦+!$ѹ|8DMyIRfDZZ5TSSU <'SzT=`@xC~Ju.9( X`9hL9)9\UXj* խ2B2)I][xqn,QŻlSkك@@IRT0#^wM e7L }][v$`;0V!s<7չFMd5L猲llSRR'`:@ j1g)F4FGځ& FR=`A yRmBM2`ȍv5@ sJ1*jR[ʯ'՝Z@t$=-#V{%ΩeBE,~ޠo ķ@# 4jsݗ˞{3QDb$gfwVDW\QOu!{~`\iEy!UgjvXw=ˠBcQ4"i_XZ++> 3R5޿CHtr*?sʭHTXu&j8P]ht奙c-S#XsNHVhp-^.Qeߥv$m"i?לqצ>"6«!߀?ݹ))HYqݎ*I( lh5ĮS?)H v6-4 F7@*Tq.Hzl/n,gALl!BhEE<i㬼#sH'>7R i/H GF*hW"ՃH 9\-Fn3CIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/run.png000066400000000000000000000176121341747546300215750ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  #J$ 3IDATxy\eg}뮮޷@!IeMQƹ8窈ˠ8WQ~@A谓JH dNwz}=?NIB|S|~>>JX:a! 熐r8AҢG?ȁd;?B Tk&ֈ6 I?3>^FG@μ8nkFwvۻ\KːGv 5rj'J%p]6Vy[T {D?&CI<;i%+Ks&y:憋P7 5jq gd;y}h,H++!lcmEbUoi'xC% r#cC(s6\l!= (YITn%ȯ +>j]k.$[s%`dA:p{M<$'Uv l!|/ɂtF,~[7)B2u/YN9*` +زz]K把Y+"S e@%YӵQf"d'8;=JT?oЭiG 5>s#̀>zfn/=t e\텥z"#wl.;|k 0:d!R{!$^щ!{_}#_NIr uY ,$vB9AL^Mx % ғ?;ZK߁Ԣ㿅iBiWU}ω~5{_+708>_շtMjZ9i"pd%)oP8/DO퇑aR{˶R-_[4g!Mg!v@c΄;[JJL8;> )Hq ߁m9Z9"/W0 ޒ9[s9/HsXdH8xt@ˇ!xu ;![:7*9tf $-R܁{hAV*M< l@[ Jdi;p|lp݈+r=g%t}-V $v磪:*A97P܁ꯆTR %wQ6wXdXz?SUٍb CpE-ќKH} MTF# jb B9K3NxPD#ڒUG{h?-yâ;{VU2HS} ,)a|]ٮ|^ il^kPdTQrBL[W&-09poo*gy/tj|.^Œz<bZF%ua}tbD7-8LCcqNJ:q;B B%&ehdTHɴ,G;/,(&^]$b)~~v5{6/g BTw1Qxb4?-y`1_C )e %I:'vUA0M18\`V j|>i|eazM YeaS^7mmSʳ/&Hqkj9{ر1+1Jj>%Pe!82{vKz-8gS7oᬾ*0=x'})mM\v1ں/8xe1Uj9cp)"aiʸ*T~atDU26<U +mQJ. Kf$=%{yFT 97jzA5,)cH"ͯ{iM';B|HRUdpt@թ a9X%l` N7%mifqg/?)R}YHpUvc}W?}5v`YA LB 7 u: vk޾ͧ/UjݛA5] ׂVu7rުyt6"lϭ TLu"gAZB lLCp,h岕Y"mR1mE%2mlٰz Nȏ@KEVMgrKL ʒtV4q][@7-QFDI>bߗU\ zZU=ͬi)- Λ U(~8ɄEF9$!4Ej`wr\2&4ɏPB LI,MdI"/cW嬥<040iI(7b2[Sd:\ڸPQ!,Ys9*Y#-3m|tA&Ǯ*rVu73DjIG5rFgc͵iwܛs]mFf!5ge;)=\w~Z@X#'Mܚ@TK%I xKZ4C\rn;jIMT39KݨL} 3, A<붳qeWm ;B -@LNC h򳲫sVvz#OcnDu!HKrԏ5sR](æPwqљ l"rD8ɨ_]&Hu@}X0GCi 3{Ŵp٭ʍAysށgp't-LtyxBͩ4k<|䲵, 1֐埿IHoxM# !&5Z˂:޴2m̖F4sB mWS?jb'kai|ʒ1Pc-ҳ[Ncnjw=N m i^ӱdZC~.8l^N]}^Ka{ޛ͐V#ZuU^tZ:o Su SD 5gZNk?P+(Q~g,E$tM˸+|btT7.:p.O֫@{+.BBbqGwҳVRzs0S_/nR):$_9ÆoZa:,X՛rΊ,QS1A.l3v[P%5%`PwqYr:'X25lbuT糆Yv \܉9H}9?43e 헩N[LHt6Ϻ%t48wU'뗵Y3E kn+PւF'҇E87iM -e_rBh+]ʹ+;Dqۼ)]*dMBǭFk@]?NRB@RɿϪ5ה9l ;TS!{̝Yo9dEo`B}[[BmW`lxsAL&6iuV>lU>ckB |J;%H}5-RZ7oX Yc]غiJ):t _3OaܼK9x3tL fB*fӈ,Urc݂7wHyzW%`gRKA7Rf]Xp7m RtͅQ=pVW SK |n2}FӐLol+ns%klch ̭7E_SvH\J:P}AVcWb/B߭TL^}-g(8"n_h3ˮXeNT(~RM+C2)N¾OҖ* `(4_4܀/-8}9;{7mi}7CQ sds q^YԪŢ)37bz_> hMQxFm#LNJ!մJ[&9'+AvȂ=AՂ.d֯N)d!Iƛ ?@ (M nohiIl݄r)[sUoJ^a딎kwnd3J)ܰhbA3yxzCh%y w ȹ"wtoN1 Xd$F|RE@ +}7"Tm$q`ϴ4c W87}BWZ`|[t6lici;fIֶ<(1|HRu$nZ9Hث}Tm7@芙*nCXGjop7Œr|l$%*8?6R^ətF!5y̞](AP<)-G("&9s /\"a<;@*z(y3##To#ƿ_S?̚S݋ԯSM4űU59@JdއcMˬF#[ȗxi[̅a.cR>͟|2q,ȣpnƷ= G2.@I^uג X_qiDȐ?}OT5>k^/PQ^nC>vDڢp _mGEw'd"CBϑ}"?_۹j1a?m⡙c-SiUj[1>省􍊏Ŷ" t%@xC˫M~Eb&ƞDWOwnk#?w=3"Ccyz4=gnήd"ij(](WWW\+\^FG@μIF5;]hh%EUG #N?BM~jHZIDL%IFHƏP>Zt akF5kBV[DWqIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/save.png000066400000000000000000000156061341747546300217300ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  sN4IDATxw\ՕU] $ 3 0x`لlǀ1ɌmvYcc91C,c #RJ]5rBWxGW~s=\S3*2jv53z͍(׽$2'ay6Yv4[+_}be6̔m’Kz;jjjj+jfJpw֎\f_HξPEf2u-{XfG5k+9rrexbBZC&K)+YYl'[wY"T5G&-]=_Nu}ޓ[Ҋ7lѵ(h[a 9xWLHu8-"$6lsA~%ńLrįEMn@& ,TLH]z4 VEƿt" ҒX1osSiߙ/X'=Mҍ?b|֊xD1sLФPZH5^볊 i>C6 k앹{ `G;?X}`ذ%!lD͌BRkrh9zY$[*l,p[ڡ]u@r ZZěj6Hl[ BjWY(6I8WNE;|A2Pe0!D^ȫ0D]r#I݄'D1!|L8FVhZKߧ p:N\`9RT++:R\~ỰF_,McO[uOJB1 rk1OQ>f)|s0;+pRSF\m^yt\ 9"/WiZ BWNןc񷕚4΁[_+EeG.0p/ FeN$箖fKjK"KR°&a0tqc)RXhp~53X O&MW^>D($}J@ Q`7tHM)= k;4T<%b}ܔA2:62u'JB n]ZJîd j. mkP2yg[ oӇySUz Q$XT N 53߅/k1U@4 _x+ei4<"\=_ÒڔSlRi)ݼ䜇2/ꛕ4Na",=mTi~ruǑ `ltyi~:`M@Ju{{_1zoA`&z'_LXR΃%㏑}T7sdu~k I9?ӷe=7EY@[ TF|-`~?ss_w/- hZT,)%>Cϭ%M>$ :.zoZ`o5I=55TL5G,g볺NJ%wcb&5'!q@* Zw>o =_ljf*/{C jVg6) ^K3D{nH-ɍr7TzfSf*9%vsC&y͒9$m2jrHvIHnJ^9n,tY}%ɍpP~ߵlpSr- GUI'm#:H"5w aQg?YXEUpƕ =cm*=G%oy-^@bN;xҟ+RE#I:@7y?=&̻5LĒ%lwo(H匛X/9\!)bow9TTy ۇg|ee(@pbx $9Ts i7SXᲹ#eTK4\fI<<_u_gtN-} =z.Y1jMu<ʻMݳ56s5faI9OW㊚llN{/m٪L{#$tQ "/0X >&Bz+KZߙ`jV2_q%68eaOIʎoPsŝ\y mongOI2=cv3" Cˏccg44kܝR|p9`iwI,UǗ#AZ.Vu<_oP2 =w;l ++hmzՈn>w2{7V3A?QB$k:6I5ޭ2ށG-)ߢdW0tͨTOvTz@H\P%i-LՐ3K|!6t* zZkv^-hfI+p1v%oH?rlj뾻(Sիlԟ7 Ro}nD dF#Y=C6$6^U))E$B+O7`\ޥ9w'7ؗ[LU2!KAn%[wS9e +m*E z jr0sr+%r!(ˌ}ZϕZ=őK|]\+};!ٕ;{t:[}$ʲ0\>-/rF+Xm)@sR D?aHTW :ޓz=QTDc4D!_4r".P2f|tRmAb )ߙ:?W2eܤZAטKl^[Aol]Zc SItގP.0> &l [ }\u$:;C iZ$[3~N cQJꏝ/lOa3Qcܝ)Uyra Ͱʆ8`z zc?2#6ΉԇcUjQ铚{6..KE/ nP l1Y}CM˓a}x$ɮ;4(*G% mޯXu4_ǯiz={!jNw \N(Y/B@-PI}=8Ld~`)Q&Ԧ=Z.b\M/"Vڱ9$:c(y" 9xK5_UM8^f>=PW\Rn̩KmkyDz@д6VEZ?f@*?cs˜Fks;(Z\ 3_} ۖBl&3挕9c5Dfx43F5E ٺHt3sIYD's.w|O`(9k/mH~ UnpFŻߧ p:N]sy(&:R\U6llxllp}KbC w<29Γɍ҇-$vll= (^KE{Ew {!lkPDҤpF8]d+I.0"2aa@MT~sn,YxU5 -"J3Zʹ S9kҏ+6A&`E)@z?di:_ć$uX/fg8uNsuTu?&:u] u';kjv'[lCa%>Ļ+Y[ɹs-#Ww<ƥ5_vˏf Bۄ%vVfkGs.B/$g_@uh^ՑMHkDPakn%FEv("w"ƇZЬm[;ڎ -ZY_IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/scroll-down.png000066400000000000000000000007361341747546300232330ustar00rootroot00000000000000PNG  IHDRVΎWsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<[IDAT8푽NP7& :.FLMRyP+CHނɸ.84 &$@2z\@N^M01jD~fB)< Ye]l6b0 D˲RRʖmۓ^GT*&b!K7 })8(~qLJe"|g! w00<̶Eh$I 7>iU!55872KɲT$^:>뚦i(hq|n@Jy1@ |o8n3*Jpdc-Tmwg_oq>ﳣD6IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/scroll-left.png000066400000000000000000000007401341747546300232110ustar00rootroot00000000000000PNG  IHDRVΎWsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<]IDAT8ŔAKAq\Лx-}!{ $C{C/t:JNxECmWYۍ8;|7  #,+:N/HPIP؛f.z  N"˲Dt7 cl6Q>ߝwJZ4M=T)"m,K4MضLV5\.H&QZ(8r88r#!ģr\uZ-H)Ë`4%#NǫVW텪 Fu'!qB<8X,LT*Uݷ7g|Ri>ۗIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/scroll-right.png000066400000000000000000000007161341747546300233770ustar00rootroot00000000000000PNG  IHDRVΎWsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<KIDAT8ԱJPk2n6C+%7p[:f>Ctjb2 ' I*uKj+\"&Qpǁ!v̱5|Ol&BF)n~sFaf Xp+LT+C`Fu]BNUU},k21t]xG4MeEB2Ni˲.lV*CeQi<|$I$p8`0XQJ#)a$ϕ6J^="*d/)Ǒqwmʲ 'BQ/?!@V.~}#ZfoMBIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/scroll-up.png000066400000000000000000000007241341747546300227050ustar00rootroot00000000000000PNG  IHDRVΎWsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<QIDAT8咻NAϰlʄNFEPo`O@6Tƞf @4!!ƈ[ P .Ru9's9R::11Fnt,is~yZl$ttrzo")t;sj,˲PT&Qqu]tbAAvOB߯X<6 VsuE֧l') Rj:12qS^K)8+CRT*9|>;/z4I&AL|t:mFT*u 1DDZ1FDtoV~OI:IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/serial.png000066400000000000000000000162401341747546300222440ustar00rootroot00000000000000PNG  IHDRP/bKGD pHYs  tIMEf-IDATxy\U֭k޷,$} D x_u!|A6gT^  u $ vӝں{mZ>T>Puu99QWG"B-lE^a=Ƿ"ŹrЎWCkC81Z;&,S"N8ȭGn@~ ]pcxfaff{ϲg*C|[h‘~hhރнqņtR݃BKZeƬdmpvIn>aCSE -,Z+`&é. OQO!pPbCZSCjygbF8@>t:jcQL9)dC/"?`(ؐVIT=( o C?@xbC:po8GEʽzɇ CabCZ˹^ٜ85ΞvB iY|!y}(ƨ e'x>3kgF,#6eBb]g+6 C'Cw:hAB{vVwqC bPAB|l#;aWGҪa =U7;L0QxS^鵐xRoVtA~͗>O!Cku**u⪂8 2_w@?EJj9 ^}{](F2x4Op߁{eB#zŊ ξH ܆XY3 t<8|)yN$z9eC"<}-OV? ͋3s03- qÔ) ifO{ ^;Z7O>l Xf`%%E<.TذD9Hi/:.W @fsI?k)i"6 <}ס^*E]%jFS]BcwJF鸶⹫Y"Ax{}tzvo[1t J@xeAޞ+P[Ks1}dU6/($}ʤ4y]zD) `hoi4!%*|3(0o>TyH׻-bS暹-euxE @mdVM+5 i2Z|Ew!ꏷ!+FM7#h j.PEg;fhJ\Roj݅?<[Hэs)j 5/w+[c9"+TWwhT=6u5EeUJC%GcJB o5h~gfa٪RoW@Ann> JVIgܑ tTw ̽g-2{JڬAp‘4;M[0kqX2@zO~fͳh=^u5.s!Z+{j9_aWN 9TEdqGtOBK(y_3fwdY?0YG>!i<6( po[z [U,g_X"N<%5I/S'O?߹?֒&Fkh_[YUU漷5~Q2H]Q !MΪB]YV~441Y8`m(mwTPÉ;&1+ z{ySjr#5.k~ΑopEΩ&w'EkEX{ EHNܻڠٝ6EpYSܚ% rv|y8lM>\ˉdž4J]2- SΚj<AUTfu/Ϡ8*t`w'yuj}ӏm&#oGMy+h[Jh`8ŽSmߖW6f"xuXӥo|SRgO k=Y2 A&W@7 In*|e=R%ڊ -_`M<>K g/rWw R`y*_TK*05-2#;[7Z :Qn{R-Qg&HKPC iIyhMKSxuռc{w4>Z9/zS(Igy*=wR^!oȟlU5tjOZC$DҮJo qC6ULernEVqb-jÉҧ:/RGJvTTdd[x_0qQrCK{49> :Nt`(6ʿ-[Ū՛&-$;>k;+?WGٓI5 MNJf㎚y!w. wtc1~; ];Ĝ/ާyg6{A`~ ߽|}*X"Z=~Hӫ[eIgt='Ln±UآJB>i"QI40>cU],SQn>UF|R5^҃잮q6_0s܍r8rwtq7I@Irf,i"ζ{%֘UTwdK<6(T%IVTx잮ay\NB>.Y>m<;˽1_@zL&RtߴFnDZ(*N4E 9nv9Lk tBbI FA&2*>{NfeDF{GrVPgr򸜄^.[|Tu Ja$-}HI\~Q:KK9<*Br[ ^ >Hjks ~*, 5y[=:߻Y"#Ie91$u4܅3TJ~ M!5|g /(ټNd$E6_4:53%5ˁ3ZjF^i44'xׂF, 6)Ҷ/~8ϼ O=y[jBRT'&NG|lz*A/o5Ƚ_q ŇDI!Vq.O drI hM /T/BRĹU '2$39T G!s/bMټ>b^&H,!4iK :g`p#AUNЄCr#Vnkz>G`|I R9~Vf8%W(io$Υw?Ȩ$rZ;477VIfrA7H RUng%pN='d60`A{ӼyP*H _ҶP9\P #W$pnUx,d] XټmE ?H**ւ5+zocK$N,ILSFߗ1pϔڊ .jM0,=#37+uX§2_4;pv;8T j F?KF4RvKKv ԇBمs4?+%qYTm{Qs{|H59y>W_=)g#GȍgUQC鬄ը)KZI-ir#D]q^!(kD-H(B3qMA/.aFը5ҋ>yz׭4lRc(Bpֱh{ej`菒C}nC! |! B9\|OԼZ'wg#klM!+z+g G|ٟO4Щ7zi;o*h豱fI+p.vhH?tlo([WlSc"_Ƹ;.HJ|[쎜|3.l[A ~"]D ak)7wt.ĵԒL韭=̖Q> ?\%RJn|ڌmվb~F%tI󃒥HVЊBjF8kJzΆEJT;V#q嚀 ђJwQ- BbP]6F,y^W*w6pG}pxT 2 Y(ChJ:&M4qIm{nn~b$wJ>>CA[j Pv$C>C7eo:CGu/Z'dbs)v-˹F0hk U߮o)& {xoWx!Vmݣ]B 6e. mzhf=#5 Z(BkU 2u$%Bv9CU jhS>Q6lt`z6V(Q"A,SJF"$r!]K#PEFVjWv IU}, TR"ev!W%V*T k(H?r:u"m^pH!qb@Ե&F^rI<t! L'pPAwCFF~~vYÀ8= oڥI0 s#E?P_RC(>0OQ"wf|OY2 e};`߲Z|櫚R_?7`Ԭg«&!7o@M':|ͧ`d?ɝjXWjQO ?@˞viF( ΃!;PPPXm0ewPz1Cm1^1K8@9,g-_(XF&洹~ۅtEH;''BU߲n[ S{~BPu~7jB~{H *V0E*QpƍaV5kYX s4(BR,"1P䉀 f=sUK}jQT܃>''53I*!5TO(HTû)A *t*rD@!E˒[<{k1^Mu*r%h?hWU5a Ɩ`|zhg$9O!5<& 5j3UE"j(ާկQ^P6z Qr/H>n9G#XU:w#`y~-B3?Qgy ;7}.J,gOyCj`_v%Pyd`` ^*v^4@^ر1GϟT^ߺxq&)Hj!}Kڤ;,hgg+_&ʫ?pqb΢Ѽsr Hbh^L5u>LMI,g\>H~-p@R=Oe?Q! ]/XP?m'ބڕZRCm1: :rߴ+j =̋~jXQU˽`Bѿ7sȕGH RN]ݍb罧0nrL|{w 0v2|>-OS'ָ5Xb)~REp24:ZR+vϳխ%HP+c1DekJL7 GGlYoHy~"!m]?u^+3KfbTPȥ>fHda\oޏ^@qE rƏ 87Y(SGRn!%͋5?Y=-'\@qC/ky2[e >s6;7,&rƟY+zh4c /ȵ 8~J4u(nuU78UX4}$3;0[O/f*ա=+0nr$ŨBZBzH= )>)t7W8q˴ \w?C`L!~[1kXU^݈I>,'ِO{eE9!0%ZHϞ#~=pU51t;YrFS/Y;HC2V>oEtV}1d.autjb Gi{ppdDa`u F<v-乺sc".>N[mLiWPx|cDQy &{-V @T5Njp?`2U7ُ6b~fghڂ REqKy)_jR{1zS@U ?I1|WH6E0MJ7(Gi'8";O/GuENOBzb =1qz76(9iqJhT\h%8Ysyn . %_JM /؎$VdA(b]ΥNA9XJW7ˍ(<8Op<, HwAYbTeUnrl\Dċ\w pd؁I I@cUq\_cRk0bSxxBKڏ#or)yV)$J`-n{LjhŶcAOjn"$$7(7%NPA8kL;ӟg9$\&tKhL8m'yxbՂ WĐ+ґ4Gushh2{>5&d!5E$?x&)+%_0#ImwV>CCN3_0Wf9o,6m I螤Fhd$V8aS)(?NxS+nOHl9Cyqmyv͎s6`'߿z7T Y熔0pZ@ks!yN o5Zat Fu~KJ]mՆ~Uty{LBR.@T'(\&EVovIh]EH;>>R$I;E 4>L$ɗ24a.ͦ74;,2?m67Rh/cg D R" QwB[/?: *-rT$+D&+Kԋ\ eK/աLЦ;4#;iI ~?FV*)tBhd& 3KKODB@jUQ-eR :43>Ĺb04$7/Du>zv%Dq5яPUk'FpXi5O op%U4?HXcp nG.lbZGd5'@-6| ^5J<>[_rOU?bg[[OKȏ4G 0k "i Q?_77dיK%4Mg0Oлݕ]wWiO'e#knǧ$4nMtLބ) u8Sv=y6sf"9׿ڎnqio3:.'k 1#dHUS؟{ρx` [gaw 8BSRc0x䶫|C)pj)V |Su ꀼT̛t``_Q%~u oJTB0Xv?>]zd(Gnmg?ڈ퇹a&pf5rly!H?;/|MSaɌѭ c3.k(^zh¤) S {nu"GBSx[1C9;4kj:hH(KૢcU;ԛDc1u2)r=+3K슢Kz>E=R>i'[ q=m/UMަ} YK\錿*SGR]Mj B$2HRY94Dr(mr Coa')aX1.^61DOI[iy) M Z<_@yr7*&/߫)֐$kdNW,'pUr5DJ~ EҼPł8Ο[Cv' RJ4.JGh4?綃gQ7VܾHu*5&Ql5J{&G)C:qQ NV͎{NJ_%>%jDkI/H֔Xb?.Z\;GuB2 /7aogTCGps Xs+|-HZ^ldS|XUX/>20!cu(勚cDxtJPHFYg$* o1񞒢gxgnMX:cǤL7#mME@^V)k۴/HT za,Ht }@|Kr7'}ԐAƖg&-'Q%S?6Yr|mIZJQ6D;쵗X9@y&/ LU+\Y: D-$Xլe,A &FQwlgE?WgBPB*(\+/~UAw)(GO_PMK޽9ysK*E'bc4rY49/JT@ qW_o`3~W]zO r+ Y) yPSR@<[h@j !]pSD} !hNw@CY*Oa[,~)`PnLx,a*gƍ>^.H,@j6׫NiZ9 +=I¦&vje,5%S|_0elzv$ǟei YHÿL|TyV@64%CK\w*IT2k,Ȏp;6}G١۬aIc @iAg=C f=#?.@]sSC:\ڕy`'%CV׭KA(lzKÂ,3!kXJ5nD@'-Q#{Ww7>k;%֐;-TҰ:Z,*4-(v#maWpȶԩ$RWj3RîNLjhHDH 4IDATK`&¦Ke!m NhPڔ}aS \T@hӠOAj: .q , Dª{x]JR>T6zvͧ <ϑȣ_{:hAVڐOI!ݟ} L}F<{>h Tf]P"xz_L/:al߆GmEVZm.*Ѭ̓PQm3pMίX&is0W Gb|hϹ9jrT7Pm:,>PʓtTNa|1)'RrdA3U: 8}n0FC|mxcGfCIpS&I:TayS`F(Pf &5'?;@ %-:X)a\<]i`$& TXD + n<Irl5Jy]Cd #}88ɜ8Cx=OtQV܈h'is~\iE'(0r߀T*e V~ sr=5=@\5x*= :WͶl"Ru+9Ҙ%itC7jvMAтܰ1†mO&2LrߗInaSϒlUCቃ*4.m񂳰L4&H kCdoPsT]E&=Uh^ Q D~9乫Cz^ؚnے=Ob8<Qh}ZN,ӈT߆h4HnƟ +-s 7؞W" GYr܍iԐ4رJ؛n@JtgAW@ϓ$C|ˡ ܢ0gliē4رF؛GJx>XѩPy$Qeń݅d4bIX#;ER}X$zނOv D5x;Dx 2zvLt[R]ěaMZ70XN>ESCҀw7^4l溔5yd"wA?FT85*/-)AQꆩ-qYىᕤg1iKUҋ4ljZSsyf#IӌpUfjXt,O\}tAci$ 6~2Ḯj8%cIjm+3Jf4% YN1{>?ye\r{:?-U C4HVn1: ߔ]OI1$$ vmG2,/out/ 2sC:`f1$%E䯰"qF1TIİtup%i5a } &1 &1٬-o?}"_rKFGT/2:󊬓ܳ$}w9+CwJ@O0w=$&ы%zizZEHj>ep_G;d^Va~6;4 L/e <8PxBF%t7;/TBSj k'iWKFa?4_9`K2;E$5^E: (6Q]0铦"6{Na?_D~4< :Kˬ)\|,j=-#;~Ou?%ܞbIIMwTiY(:%8X[70&xk6>ݰi5%,8l1r4h[JD'r^Ou-zH{$ QVo/ًd\vơ!󿳪G_[Ŗ&/BF!-&eN.>yg3=+_s<~_"ȳI_8#+;L% G=AC8>wt;:,vqQS<?{"O]/%)*M~}c:|\|aG2ATwbSoJ3 g68Ro^BxbiB3y⦳9ԔyR0q^|~JAoŘ)ﯶI=|_D\s\Tc걷Y[N,QB?#wmdg2ÒB/>ȯ;7Uu<8u1SKRcdSGq*^KW[y;:t_R`穛qɳp;,)F}menJT }"K}I4G%A~߬k%*.>y6w]y)-Q}O.[Ò7D-ϓVOl2pϕ'S[d܇ƚ6=Ǡwgo>!mPǬd9I=[Z1EEIHnخDb a\vtn|VC{#Pyk6Z-w^0EZI#kґt_ѣ=!~{4ĔAWEلAҘǩoz76Bזᶧ xͨrrB4.N{u hck/%]M6KN(c5?pް~vr8PGJqlk#4H p!}/2va1b ZJЯ3~}|~t rSTvv繏RmXIl2iحfZml-uFJҀC6eXUI$3}?͝ܝ gfpӅಥzpkMO;2>Әƃ&t:Q:B9q>՘U*C)@Wmmem}nbJ,󦳳s۝m!}cbA#&X[AKWa>D2!ﱿmaz2e"-YɻцO__ $ ~{.9_zբbK+kPDB Mz;gMHU_ºrTMK>g:*CK-DLL"VÜ;:UC(’65Mz1an{=~o/Qn[8dkoH 2O,d4A*ƆN4-uG7#KzI:sbڹI+EJB#|Knp?qLiHLagg4,I4 ǁ+*=Pt_R]hC]d"\T;.z%|Z0gV֐$e)h:z#9#ATJ OIj28)8iCQ5um,.m(l|E3'H%4I - !I$Di Ie@|{]Ggb,&ChE_YwO^Uoe)U McSC%?OAYLkOc lɖ:Q{}U?`bEA_ b+4"BԙM% Hu7͓4#xVzu`MJG\QtC1%=E9aGgO.$mE蕤ZM޵l3nXt >:PڻCi_C: :қjΔS._x_޶"[y쫊KqX)H|wӾpL)"iH'-u"ØL:j ΉOv $0 }('+cNR5t{ok"DnN!' #tGsbwԈ^YwH1CQPTf#fS F(j߬-,c5Ҫjn#@/I<u; E)Ngz"QP>rTP걧U m=i04}uۘy/`h6[M:^׷QZT]> "(@MIb7Kuq7O$>>:mGm--`MKUQI3E2c I& _~^'^z#/,_">D%N{mmԷʲldm|I4y$m نQܠ4IOu:WWǒ U6+yMO-]B8 =5u)~Q:(H?( AXD"o?Ho51kJ9 dGkk$8dv̆6I!TdҙgRI-[F*\yINoF4#IT5ƆΔ#t 9a՜%S6^:h<6(򷷨kK69C %I7z'!pyk_YT'\u᯹ht>Ij-Ie; ~x`2/<+ޱlnJy#$Iq3'PO@~ut")'YL?`rtJ2 )4M#\U]?<&$ o UK׷ TyGlw !+*/p4ՖHaCxkZܞ,tlx|1(b MʕʿWn#&) KTU'K䋭$RBnf ITnenլ/XYȟ:8n$lm⚿[7+65%R*<&V( ӫ@?{{#},\ry:y %Q K֖D$gn{/ .52%n;y`Mc>RPeg)2{T 70PS!$-DlcO,]MBՈ6&`7q98ᐉiv |>h`*3yu&$T{H*/if}3ZPZKmDl$SP$ v3+ /a*IX9n36?l\VMҤ4b! .dLjT\nQCRI(-ppOy75gt<}?>7WlGʼor>$mtRMFçG_Dvh*IEH 9Vcy*BE\2kXJ}K7hv#n;cH$VniA(T$,&#?^t$T ӫxv?]0RP˾aUO,]E'ySsK(^|:p>$w"=0ZQYyN(i33{ȓKWe05\zڜS=o'MC=$݇}H<^ҝ".]z<O,b[ȞK Qx}ݽmB1qXz'Aw%}X8_$\Dh-D6jV 5<)Qwed.>){ێ$Բ5\tK˹Ԗ{[FػqX{6EHu Gȉ6}ϳniyK4SY/K)E'8hbEAh}ReJ_c~&^Q-l,y1$CIIJBmv{F1ĈLt"^p.O1IŠ%4ޅ3Rx~kI*t]_W{uJ pTJ&.VyOr7*ыvYeA)8k_$uTI? wr4@b\RH `_3'* vܚ_$0U};"Zv;&h+4.ͯHwYPC諥OҠV{ffwWSIDATbDVCT}6 35̸UCj_P߈w!R7TEPap9[gLRWd)VzewnH&J1<.iB}yj\E!')myVfǛa3jzzWܧ`>{@%n`+x'l&uHaU :G48be?4LRWAi9sx3lmyR⭰Rlr!;T߾_ $NRgARnM ц<9r=$7,90+YWm>K3_n l3%7+tY`:5kYmnrsҞT&K`|cVk?VqeZhd5_?\|Z4!T dk< x52Kσu OMfG>\ARw7^ 0` nsEPYaMZ70ˉއhʠiP[L ] %g牕t'5c?*2h\B5t=R%)(:j~ Fwg"K|tHR gAѐt z[On\0j(Y4T%Вhj"5w,:`aV9K,5;e!ZPtHI녭 MY9`pɸ/< ewjA%/|r j,C9 bɖ7%eκ)9!Ͱumw ӑeP(Y86c"<,@Jċ/2a˰ze{$-݁Pm(L%J>D6߂}6ъqM)^M)a\4%#ا'Z6 @2 GHf7Cx#V' XBv+<1KR@Wv܋1MB6u"G\O2 oV&b—,jK &5'?#3*r˚0Գdhb9 6 `!cs`ayS`Rs^<((3qGˑѣMHO$< GQcH(~;F1-H8"8Gcfl%[k0>Y!%r"jrT7Pm:Y#H{ !)CHСC}QPrKh%bV>)#HVZl?Bnu%999ؾ};ӱvnM;%%Ҳ7)D`I/Q[,<777ё2c f?~g:t#Gܹsq,D3MݻwK< BCC%mA0qDgo^ux3ɓ;=q9r$,YYfyDBHmذ-Y%%%x)cA Nϛ,wg oFUc x^Oz1˹E̓;v0Y駟z'B:gӦM어cK/!::kxWпiۣGb&MzRFFz-СCtC]&XϪƍxJ;w |}}1rV{æM?>ףA>jٲe(,,đ#G0j(tèik׮(7ƍa4)3{9[[[lܸѤȁz|M:WHO&X?[[[|ömD;!yiiioGUHHeh/q>sXXXB=z5k;G"-- OR>LBn9TBG ">|{ndff^WZ_|@Vcܹ}DXXt:B!NOzSOh|駟wRW\?_ Fc߾}9r$;ܾB??^D^^0x``rr?ӟ >e˖|9͛7EWMzzzJ/Z1Ƙ lϞ=l_~&iڲ'x]rKyfϞT*Ufaa,X򺔮``;wdSNernee999_d֭ qd'N`(ޔ|cx6f̘6֖-Z9ryyyI-[aڢ([z53f?s_YY[p!g޽{[ls#{O[7ޠ57(!}2agyfaÆ.X2lРALN 6UVuֱ*hd hc xoG}k3gΘO>bL&}dǏԾoܸYXX|y"]m۶N]'7of&d,((ߟq"VXXh{ALL spp0ldFa=oM6mԢiiiɆ : @ٳM>˜{כxk_̕ϟ7\-V^zi_^W`B!@Ξ=kr IgSNI{73f>>>vL՚%/_z%feeŞ~imձ|? : >sݷcǎO?رcҫybgg'_V9s?߿mذEDDa0_|;d{jW_}exg}]iɓ' .d'N09/ه~hSvzǏz={HOEQdoeSLa|A[zԑ~'&;w.0|p$&&Jۏ?`Y|||p|׭{ظq#JI޴` 4|I؝?BVsuj}Xx} 5yi;LiלCQQocСmn<Ν۩òeˤx#Glu & [nݺnpn}1gD'|s[Ζ.]ٳgʁB O{M [nEiiijOb˖-HNNfW*xW~G/{0vvquuŃ>(-ggg8qO-Za 0_ܹsn咒n˷:|i-ǜf4gI666uiÅ Lg}t_~[g6Ǿ;̭'I < $X`륙47^],,,pI|ذaN:KK˛O>f[ jSGzz:{=[ѵ댌lڴdy̙JGi7lػw/{2g&OMJmsN2Ĭ _YY^/?sm$!B~ڤ)'|W^y*DݢELy nքFeee-wTԝw9_~&˂ ZXkt*{ Bj&rȑngsҼ=N˜vq5Y]^ H &˹cb}1w[o& 3 ѣq GmxZlT<:bcc… ֦nLDh0*-we=\777Ν;XnѼIJ``u׀;M>ڭ#?%%A_w64Ǿ;v& :7oL4۞5՘?>F۷#%%>lԥ{xxHt߷@O{S]ݽ[y'dZm/s s]TBn fŋQQQq%J㏨л:$A0c f~~~xOOOd2<LΑ?NCCC>mXN׫kgͷTju7Kk `071mڴ.lecc-\bk @VxGzjiݺuGIMͯ\]]1u26l`|̝;6lh9KΠwh4&]q)Xoboo{r&s]PBH 4FѼhѢ2A@\\+++:q(L5-))i-Z֤`7bĈ^}]4w,6|rw/]tS9G$!Yf t:6nqln{͟Xv&CH;hcصkW>w!iϦ`뮻4%Mv-M?vḺ/?& n44t:nڢp44EQ_vb_F~~~pi=? Iz=P oҬNNNx̵j*R̚5d.k1pqw11Ǿ;0tMrbccY!Ux{Wbbb1 &ۿ[nlٲiO<İzc 3gΰ)JiHj7onի5z=1bf}a "qF,mR7|ӭRZZjq]QQ<<n?&sM޻wo߯׻-s3 1k @-&7#Ft z͙3E83Je~lh4/\83= ٸqZLb݄ : z[cΝkdR{C>=,++۹s'spp0L٘1ckբ0WZ=W5 S(-ϝ;UVVH5f͚Ǝ˂LN( pBvNH_&1www~ƢrḺ/ʿ ]unQB(! :0ل :UhluϞ=-j -ZOwZfRzjhZwSOua˗/gVVV~O\{ ؃>(ϷvYY{gZZ'+**b[z^W_eUUU՛;y$jdK,aΝ|ֱcO؈#YvvuCS)S;w;c_̑] @zܢJk2CNe'O\]]7cGjj*hoo1Azd*^deeAV8p 8e^\x(Z>dP*4h{|Us싹󯳮zIBZ|2B?~<9xꫯRB!(XrUuuB1 @!MߚDB!PB!Z6PB!BHcaʕIm"3B!PB!駟ownsfgBB(^O۵k(5Q'8qCm{fO!BHQSS9s駟{7pk. 4xyyaРA3fL=n>B!!UUUQ__ߥnK.!##ӧOUHI޸tVXk?!PB!,z{'MNY@TVVx"T*f̘ O?s/_0L>KLL?t/b_?5k 55nnn;v,x 899uQFujŋg!%%=z4{1ٙl۷#663f ̙L~DGGO?E~~><==1vv;޽?z=0o<Ξ=O?+Wj_xGM{qbĈ0 شisuutnt&ڽ{7~g =M~ wFZZ#`„ 8N|LL 6oތ˗$+Vn3!eTB|W/ ={ꐛ EVV:|0uT9III0` ;v`ш1ٗ-[`̘1ŬYo۶m3)ԾXti2coٲ_~e?!yB`FbSN1, @ZyHV\?|XZ1Һ"feeϟc,??`SN5[ӧOg1,55UZqfgg O[W΍̛7`iiiҺRfcc0V+gj1Q'NdXaaa􃃃c?!5TBk2d#F 55gnBBBp#)) ǎ3p7xK.IvBĉ;\B߇Zn;,[ (6in ** 6mBJJ~ڵtxWh=y ȧ~ xgu:m*n Ny8pԌKСCxgh߾}n;΍ypixxx 44EEEj׽mB(!΍huSA4661cbbb 69פ^1~x{쁣#FwsC{`ҺGNɓ'aii/+Wʕ+w|̙3N'OXbT*UdҤIhkfL!BHм`o.MҺ/._ .jkk;Lȑ#iё("77>>>&+j())i!+M233q<<<: ̚j}J%|;ŋ{Yӱo>L04iR9sl:7n4ݶ?! W!tR{5 M +V/͛7㣏>a׮]?mRT30uskk\fnnn:[[[0`4;lT趲իQsG>>>>|8ߏj߿/`֬Yعs'moooK5K'[ՀBH7 0{x瑜Sĉo7ٽ{7BCCz0h dddBq`` \"5jҥK`24Q`֔~ii)jjjId̙t/(56m mۆ @ծBB(R {mՀ P(1cFW.#""iMѣGqi9)) -ߴqt:|g~ood}CCvލ`7NZ#}[fϞ ^琲 (Ϝ9@c;;;;L0gϞO?ԩ'JKKN^BBBm8B 9;; NBIIIk @^|Eڵ HNNƣ>T<pTVVbǎXv-BBB0tP@II nDEEI3… K>Cuu5/ ,@dd$-[_~FXh#>}:"##zjlٲuuuصk >/ _}jkkqi X0aIrCTTΝ '''W_/x{{K[[[GTT-Z; 4M@_LO>J ,Jc* ǵ9#|\[ `Μ9XbJKKqwػw/8[vx !5iS4$!DQD~~>J4T{x7p1=yyy(++Chhhz=QQQVGjއXp!֯_/m ++ >>>is deevCEEa mGMM jI&W\C*,,S둙 WWWUz !3YQ!-[Lי//vk[V_Zv=;_kw4*M[[׶t5q댦(baaVq&>KY@!0e׮]PR֓[ gBj@!y'1rHXYYuj==?!PB!!s hnҤI{zrkLBW_Ř1cKq FY@!B^a̘1mE e!Q'tB!B B B!(xuuB!B!f>x\J9S!PB!v ?ՐxBB0#D娯B BydР ! @!qy!?ff?P5 ĸxyetB:ERA&Iu:d2wzMz=JKKM]F8::b ={8}4˥}8(R9Bno6csӿTJ:` Q^\HG]`AV!rP`j:Y!_>\d Ə_*J*myr\JCaҥ@}}=r9AVF믿x$''ܤ@(!0ȮygmYYYx5 FDƠWZΉsPoRQb 9ὅPXX@&7͛ .z4r^Zj5a+߿?J%ZZ<ؾ};lllPQQT`5(!+L()9#{?E܉(+/ t0ơD(6D )`n<+X}Ri|暿/ TVAFrQgkFNQݼp@H_ψ(  /acc___\|?0.]*>4Ք(5nWSߍhlذ`4h0|̝;VVV& 9r>(ҠT*Q]]3g //O3_* t쩧Z| 0XRbPY]/ԩx#j6R%ZC2Qdelll`R%cN5/ݿ"\8OOFw@mi. "{8i*SB(>M6AP@Rax衇PTTsaڵGpp0z= IyV{NLT &k 4J !Xy̟?5Qs`Ll|,%1hRHD\ Mi4 X7cC1*'NA08 >;x^0zT\ߎrJ" zh5b8nzCPYƑgd?m:8> nn2 ǃ&Gd"8 A `c=BD{E\\ZɜXv-0rH(JßKNSp3j(TUU!99jxG쌂DGGpvv Aj:PWW,,,鐓7`0 22ҤHS~)7: ]vBCC )) ÇLYMy x i?.fsӃ׌Şx :ۡY9Fn^r5j+U#VףJVV0 pvvwW76PYU0*z㹫DQ8@Ɓ1N* FğM DP*͞pR]m<"=6cD HފS?x8j70x .f$w8B,&`AP5d%a L wB)Gn^.4 tz=//0PSU\Q!+`4 yܤl\'|رcT*\Ch4BTbȐ!(((qP(5k> nnn j?A tHHH0 77)))8}4)S1šAAAhhh &itP( "Ξ=~ׯ_cj @ݻQZZj. *2瑜:1g ,`삼l5.ΜMK?w +>pB]9RX-`gJp SP\X nj! PUY;QW[+kK29X&p`\J5ENvrrx.AR /3,5kxz] sN~%5p,EA!!o 'o2/-,p9+σAei ],wi7ꑟ_tXXZa`k`=8|0.&0exg1Ix1^ޞ9*@y|u͚5 ,***Jj`ҤIQ\\HDDDHOOlj'~z=RhhZixz8;;#,, ...8w)}ҤIBAAqaXYYaРA Cii)***,Hdjصkߏɓ'K-`jB: fa4qaaaAAL&Ûo%KB<=p(j&ދ4 J'BT8٣GAQ NĠF;{Iɸ|9%e "=QQqFA{dd"5-*ZmF 8o12"cx_Q_W 5DfLP^^dff$*W܌ <84h+_[:{dcprelfRptsAm}-lsZ$\Cee hCL8Q  f_AAAA= 66 GL7%z  Ý8^\-GNm zAQE ~?yj;{ }jdeRr:rs P[[]J9&e:$ u0tù\JO9xzxAr<.^FlYX- )"T*oy(/o/;vy8QOC8Q4`"|?Զ.[.8ixPVL톬X)=֠AG!cU;"`P ^t1qr&:h뮱ivBNo݌q".2rr1g\"77V*ٻ#Gr: aطoÞ={`0`0~VɓQ\\U__aÆщ@FQ(q+W ] :=m .,DʭP(£?T ye%4V ()(FCY6P]^Ǐ<2 JP tPT\̔lfAg(r!GlLDT^@?wgpr780nPBDȕrpr%5NHJ: AGXe Z1#aaqq?6K:SqKQ!a[ @DAg@Pg]BU}% .P^VPy9O#!B/Щx;ήuCqZ-8 phl-; 7 IDATApq)8pC!(+/~AhP|υR_Ȉ"H,iP3kcsP4ѶAvն7]MgG?Rr (5 Ǐ㡮v$QCZ0Wwr*}45.^~qW~1ZFE a~iy u6MXwњC8& .zυ^H\\L`QWW7Q#bZ9|0e̚5{UUYb^x!{i&Okײ}v/_~( :P(DVV .dddcǎqFW]uIIIR]]Ν;`0`4Yj_|1KG1DG8x<<G kjj>}ztp?Ctq>E& 1TT2 u {@ 1cLUв q; n I[n]]U] kb$ĠSd4-z9tNj%IqvA}^((1avE'\p̞s]ݭש9TG#u +16g,cU9«/E5!:>'PSЅ8Bcc9EEE)CMu?^ɦN5 eZL:c~¾!bYdR1(Zs` h8L_0ӊ9ti|PKδiSx|34(0~g=q8]v2_Whw-ZB : /ͺ) :1P >M267kS)1nB! شiowy'IHHફ"c49z(dgg믿NWWf@ 5kݻ6L&wutvv"O<ć^O[[^z)K.o0L,_s=z~VXy饗xꩧY3fX,Qqh}G`ll-8CPPPPy}49$@FJ2GI,b().)b$쥽 s\,)$TTDESHL$@v.]}9_Zu45{9P{}?zD9 b+*׽pgf4"! *"=:FĩƛX?tOfk !M<_Ls)q1-SH7h`NqnFl!1%Ia, ~:A' skG2 sޅ`/,Gc3xtFn9(S7p *"!!Lm*;'+2hc`TO( aU@Vu " NaRzE#-=}B5Oq|\+  ;PQQ@P(drMJ?3f &&/ʭJqq16m" 3ϰ^~e 'U$A( +"g&55VOEEӦM_2pA-[ƌ3&"=MHoɾSOS"ŤFg)#1$0D6A|ȶ-7ǔtuq!!w* #:Hw *p A8z=TA@^ECHq8]de&7?9skA 9kRNG38Cgwqʦ3Vbgb +*ʘwYhSS$s8| X}׹3y,]Ŷ=u|{b6B!1 q̛7.;w.o6mmm\.^Ge:i\}ռ8Nb:Cbcc;w.6FKww7-b֬Y\~$J@58N=I$55sAjjj8p($E *YӣI7@^HK7\w%Kع=r`2o{)Ͻ:+V}͆wd˿ߨ0FtQt ==] `KOgfěgb.lvLv+­fe爧 ϛ2:xp( (r$pz?9XbIN'%ݍ*hws#]_ _1o<1OK/V4TE7Bee=]$$'(HưׇNnQ5D?FMVDT@BV/b8L;u{qs^(@U| DzzQB>J/$#'$ 53 ?;:@uAS& ٝH NG, *ehGbb2/7pȲM7î]{ysfA"> k!(HkoҲz40DVHp7QgE3 l6\pz$ UW]jEQ"==_~Qx\.:zgtwwt:{/kYf {wz/^|Bk,)Bvv6匎RWW۹;Q.J@58 .]:)I8&  'bbb0 BQU޶~$ǎԲO>-H2S2Xrv{\ѭhΡgξN2$av{ttwz("34Lf#3İL uQRX2'5 2Sv:ilhVzz;:yɧؿk7m$;IMIb h:\O ۄ9FGlDՁȁF:$zFSD諸 HQ#ĠzBAnȜ%gbw"*qx<#̧P Y8PsG|<3OhQ* 0{~Q(?-fzgQ:X=.e]Fkk+uuu144DVVvNZZZfhhŋo}cǎ122BGGI.2***8zm~;/'k())P((ANJII PkEQ(בCEE'>s!66ӸBMM F/H})tΜ &Bà b,YkWQ8{Yye=%E&9P]IC_'A&1f81FT)nIKx3 L!+7UkDZqFΎapZ̚$s ^GՁjOOg׿[oVLb6MyY^YlZőF/>r7g%mcޜl lZY*)]>CCEn"=r ;QԱ`#lԡ^M BIэߧN= Qؑ izFa,'kq ;Ir( *z[QRbDf/;t$Q:%H<%>tK 7iC]&%3J[A;i/䫗^e߸_M˱F??B  ==5 ?k/=EJl%yzUA=Gv`3KjJp[T^u`Q"3R9<4T}&]Ԍ䱣I7)>3ڇxaqxTrѢE\qtwwm۶Ho.b=jCظq#w&8\.^{-<{M:yHt@LL ??"Q A#Iʕ+)--СCuRv}hmm =8@Pܼf2EJLBfYg.Q=?o}ŋQ9YSr =m&ř903(!%D; )ƆdKioYgcܳ/`1V'HV@kk~I9K>k8R4 Z:zDq::Xy'i>҄";'L6oh@}SY+).Njd \qWKL6d5LonB}ưN@heOM3sh22:IșRa JHh h&/7>[Ͻф@@tW:1-x"hAJu62SϜ- -G/(=NQv}~?o-x?o6MN/dOVF*U8=ݿ<O/w^eylںve˨?jL2`i!c\<ω01x<噿a4ޫeѣM@DqNN;@@;ɠJ GxL4z|gΊހOiooGD/_ΪUaƍ \,[*^/֭c۶mw]~ k^c0dǎ:t",ĵiF^^^¿H@I "K,ׯ'66뮻+VevnZZZt5h YC[8o5aѩ$d8ilÑȚ5kHLH0Ӧ@ooDՌtX?_lӣ<!?1z_9Vn Ilڰopnlqkb{u5Ce?. 3AD?|~{?X U@ fo$>>W_}?koyIO6<`UǵߺY49:_>/k!*">Ny|?zM@tHkbiӲ:#5Fh=Jq4TU$0"\ߎ ~۾m:;ٺc7>FQ wݽ T~$v3j (jO;*X ꇘ@z~o+;gc6mQA]Ih桧ތހLP4M#--g}~x/룹^#<2F&mo~c=^KMM 7x#7oF$Id2Q\\i"+Q999\.PhcHbeeĤꚨHLLd̙3rZ[[Oirdɒ/|>$X1Jf{ϝTVu`It_+00ϥ9f1Fv6WxRxyW4VVq͗/▛n@'JwtqM;#6zz:5/(:."vT(N!\PYILLegEɌR: BTVVz\]9y{ﯱ&#$cdYy'ZU*tQ dEhj4){9ˬ3INJ@~sF$z YP?4QP %;d%ልmc{ ?WP7 a^?.ǍY/OD\\7Ntx^a]}X?xzD@?V>~hs Evӓ74a\;W_0Wfԩܹp8~f?d`IΜ'7Ml6~rzMhDS>  &mtuuxnjfRSS/@Bh(LI8z :~;ITy;c8-}Hr8wa4 T Fe8~.\HZx IDATnVng_uy ^5*vd_ŲAؼu ?eg3OJa6=!?Cu;7cPFC:9@HS0!"4F#a9Kz':9s搓c`k>x$)(GZPGF. cT=M((=-Ќ1ƌj;mt6%)/EFj:HBAD@DvN]$'O8BNKo"T##ZFC5vV\pO? .aw~ W=]jeJv:_jЙ0h¸7QEFGGٹs'twuQTP@8$%ESa& h⡇;MfF q(ZD[{+x֬ANEHxpȲ&HcSRƎU PD})6_S =|}Q3T$] uw {)@Tt''*q[9mp؈(jH'mV F0|㿹 EqbeŋO֢*wߤ/r:;;ٹsm> ?я& Ǒ=o1阛nBTUvSZZ:ѢQ#11ӧSPP@uuqqq  :UU].\rItO}dO]Y˾}UPVމgh@'yW}33kii=BB| 08V3aB^i%OFM;>KMh _y?7sۗԏ\^D5lf]4u˴y.,MAMDQZ1oBjy ~-b5?KSCߌbDUeźi8\?:p٥ ++y%R:/㥩(ژr(F@4Md2M,z$  S0$11WY1س}/Y|2܅lBQhGG!0[lz#J(@F\,JQBRu9Ԁ6ԇI/b֙}dx/HqLg uhWQQ1DX0 &ʧ@K)Rv>9R0$IC@=[wf}!w1:8D#5$b0:"2`PDc.2NǞ{IOKrQQQAgg'xGGILZ@Ww7K,3<̦m;1MHJJQ(_۾Ǝ! cpXA b䜒8k[jYP50´FVVia^z06meE4CUUbbb$ F[[ۤN^~e|> v?|I̛7QC$ . ޽{9쳹' ԣ8ws,_:.PSS̙3?\ , 99eş$W Eڷٹm36BZqŬ}};6EP{c4=9k# ! h Y,u]l܌dV>g78SF7m>J$pGhl2r()dQ|*  0[m PYY+)ظ_x 9cp[+@,&#*#"Ed 4|Af6#GQle#5jxoO6Uc`Xǖ0(V;0˯d>:,Yf#==yrQ.^Jӑ# ;ܱw֎65{6}WIqQ1%M&Q4QJ'XߙH@="'s< "+} '!B "DAC>?dggO~ӦM\qAWB5Bd@UB44‚/_| =]4u"XtLϏe`1۶^$.J۹_t?Jn7"$Ν$&Ƃ롩p(D#Q0CTDMBp:֑:Q("/@DNNpwoGT|?zqesg1b ՂB$2ޕ`6"<݄TN<;/Lu0FG^?u a:18gGw) ֏xi)--e۶mDQ?9_5Myy9&m[toX&'xRnv͛K8묳;OHTq2&ޙ`Tx8c3q^$HMN"92;̟i̛K~&=>A-[奣lܼ~q|OaJmS+,(ptcFiD$TQUb2(^/mmm455a4t3sf|Jf:Rə=58~Lج]%Y~{e%v:n"MN8wDZťT%%=AGO\_z{d% aYgAw^Ad1JBClf]=ToȪsBA䍷nPe(fы6 RGKMD>^Γ4(d23q9gc0!PT@0̑09Y'gpLKCU&#@J0"WIOKd32;6 :#w@K|˦-` <( Dd\xn'7ϽrADD4M@:Ͳ̟(Bٗ76YSZ$I"#vF2 t2&KyN9(!(!t=\XZS:N0"0995@ww/(gt{߾} 6l0iQ['`XUUtM73>r {v"ڂ(Cn9Ơ^~Xj,J}#(r@ xGYX^NϢ#y8POX3`b4`]5,c`XTTT?>0J@TQL[k7s,Xc,L{x> Ȉ FZj(g"'g*@J$܉4@ 12TU;)WiȲ6"LB$IbhCu"f?[ᑍ%"2+xB8FTXU› 9،a$A;IT*2g<:rYI2C,7vljJ D i " f%KPTT?<,+ytիW4‘O0jҶnab'..ˎ;e/}K+XV0$0 *,]nK.d1_% Im"ʢcjܫ`5S\3 uu9X9U4SU464@zF(wc6h$q$gJ ˋ,X0*!*2FAB UYtvlٲAըe;(,2#cu f7s@ @kk+3fPN3TU%&8PU En sJXġw673"{+$B FYe̹7]ǯ*F  F49#2j8`ovaFɌ|ʦXB AYU#f``UQQ Q.YL+а:+ F6> 6l`fy,p9 t:à7sAWZ\(塄Ø,f²LBB?0^zǚXjDjt*#ʘXɉJ)E;wtGűd^.mn14:x`gۏgiS4PU\ni Zȇή TQ`e5sKȩ~ʡL]]F`0$InNo /@YY R_ v?O&m,_p8pUW( #)) шd2QWWGee%>o[x-/~ 6lw] PNˊAEE)wvyG9X(Jqfb.rpD֭}n%3QύW\%r~lOȁ$ b^ʔNʉ#!Ha:BdE&B2^>I2㭷jc:(tsP(Be~9zS?p:|%pm=]sk&+6]j) 1ڍa #O`222!qdybPy]:[nnub APF0Z!!:ڗ[D@WCD }BMv?;1^V>l tKqIثF}}ӏ&Iw{?sc,^>/ ƍ쩮;969FDTDqL)ftЩMwN;;1NȑV޾WdePeЂ8՝@54C!,Abl6CÆ.F|}j?eLr2Su8'ʳ& ~z:؍& u$3ט1 $:l?;β?6sLoFH !Tz,W׵+kYuAw*ZWEAEJ$$3LgW]=3NpJI?D1y=m&IrX# atur%r÷G~E:5ʎ]M[*۷`ْ&ő*A1c&Nf _# v1PdPu!,L!5$#KH}%4spmL$iɿ|LP_"?}o%Ȳ$d-Uװ,"ՠt6q8eKYJo7V]Cm &DQm`:B:P\1qɱ8~/_[9rJ8Țu̚3h[NSZ^ҏ?__ { 6,3<`w-v'xdbY!$J= ݂ϕK)~JwO#׿FdEFST,$0$/EP,{?>ͪwaY,_7΃KSS3'X} h?Mu2Em˲4ϮEh0m"!E_###TZ</XYۉ&p=EGGx EҹRNEQ& rH%RhdR]^ꦐJ%uu iRVVիfϞc>$ .bmʕ4(I,tI&AȊXPu re( J ;ՙ^:H.dZ [Ffv`^iMHI|6]HpE~anɰ".(o4pΗs{yx6Ou4$ldI` #7nV0Q0XUU4551009'cz>g}}{<%Kp0sɁW_}u~x櫴 2y{xG& !|x^TUe\~h6q83ϐE)lNJYY~yh˻s Rqp!_ E+#1esgss$瑟b헶f(?"7owf*HX96d 7ܵ ]䂋 OA6,/A6NuG?L1>w( dN/3ͦhu:55i:}f*3-auYHXN0LRaN<{(+)d6EqzQ<.aZpy5kI$˨ضEii)(H R.dMNn|>E̪H/$̞]Ogg'ee!Ldh(J*@Ud҆IUyt2+!1gNl/ZI&sΧ/DQs_KW vC&E@qqKtӇAVQ5-+h|9^EysTR' QaOWC)7Y墚AI7ŶS|OIflZ7eYXtSs4 8_|P‘xW7bk{%#dO.jK(\>  k}j6H5kNcc#a,ڵkYv-ټy3~;_Wp¯|+tMx^nq-$ UUlٲ0_͛73<<,˴M$!DZ,krHakk+aP^^Nccdfes2F:(Yٸq &zoy̘pѡFvY\ç}4~^yp=S ,I8t7e8Q4k.cŲ,^~-Pd !ɵWtWa,!!q4/m\v??l}|?cbb;`$,QyB75FI6<ֱʅ4v8< MhNǟf:7]Tp͍c~It= '!J]e%ld2H2A#ih*XVEy B $(0ٟ0~"u3k ,fN&L ӰI#0-4maʋL̓$,K b A{G;tT2A&%JRZ!(..k\.K<6BUy)L0٬,)Q_[ő#(Luu5$/ry"x:GABH$c bϦ?PV6L<R*ogzwFQdL0yn 4B;;i c$硦%%ݸU;_< 7h&;K2YC !l:b],X/" 0$tl.?6"L[FsֆS1jI滇4`G_LHN Y2e uuu8ps'gIQ?GF$_,o}rB!hmmex<<ih",Y,b1$IBuۇ5kLNGGTj֬YߏeYz뭓M̈́ Ae.RطoCCCL,u@2sq ^-q1GN8FC,>Na}8;>DQe]֯(mIZڷK5/tn_ eۖ9_|]!uw3ZUI<+ngbD`Rևk71拟{ INHKl\[R}##HRa}ȎA2qz|a{p*Ufr}[cWP:gKgdW1A8\LLx a,]=ICW5z{yj~L ԰KJ^`eK2w\vE?^D"1)=AD& |䜱 7odmêU,J,XѣGr\tE̚5 zw^;w.`d2Gltl2-Z֭[I&B%yU>(x*** +5eƌ,\ 7ideLCK.akKᜌqc#ҷPTU&( $l$IE]l,IFƢiс(}8:5S6σ`d,NiYCX`٥"I@opёTEfp?яYb4Mrq2mt<7DKhay2H($+#~#VR\Rc-Tfg蚛J^ [d8k'^ߏeMUôp84 r:b,3swE^m=G苹cT@ g2vtV+xSa;Ǹrvn[eTn0$&9Ye/3xpC$ UzeKd7)sVH8W*B}}=HAd7M" M6ٳ/| nLdAt]GUU*.r}Q>Ν;6mp*-y''ܧLʕ+,xX,Ɨ%N===R@2FI~Ip8*'C?F1*Rpf9T/3jkVZSK& c|>`?% je.?\#:rO34 g˘>J&cdLj:9rsL5BEUG^Z;'[2f˗҅a$Ni(Ⱦ#mゥKPVf%KY4m>={f$CF7=_%q!$[:9@s[/( [8~NC@-6՝[DH~Kd8~xc ˖-a9bcE+. ЯŊ7O=_Ŏ;Xb9?L6ds\w꫋L[ض $!a#e=i|5l~v;'$:6LmM5A㱣t vD|D2PO;0N!BtM('N+񃋪ȼϺT6qQn]IY1l%u zP[[KCCdԪU&;$ z444cq!ZZZ$\.m̚5M6100K/0UUUwcppŋsw()sF" x.K!@fH)0k\-!fɡG( {Y;ST1g<TȀN$l3sOB'@a&ٺg'+xm=tv{AIcI9TK%QH}>#~<"eHbʦ75&í H?Y;.X{u+cUWU}i w($YAlzODPXcZ,٤%sQ "uVb\IbI$a ̚`!KS\az{Y`e2Bm[y;w~~Üh>A ࣳ˖pWR,X߯1v>{H#uMpU56`2*\AS0ښJiNeI%$Cwr P ťerhx&%d)PdM}k`u#\pZ~޷E,ʽta⎕X\^ɖk(YCƕi&"r%#L +jF;vNi'SIћ|_ d ZUQ_:`p\CyI"yzr9/^L0ĶI!3/~혦O<霔"0|򖷠:MMMa =t&49Ș) 8R˖@`(Ŗ%d  pb,Y_A.59VbA2.\ٳx@d$7zikf/0l NY,(ZLt4Ottg>Ʃ!=MWV"TjM t>O4:EJXp!SKPI2!d \A_?ub KT9Cy%BRVSN^]qɝp' ϭ|SQb#}]U vaLz{ ѤE:#6:BOoLV_y}~Y[/-H PV= ˍl\ǃCV(TpL?SBLV._P/,&: x?P^R̹s( xfXHm¤r? }Q^tRHR8aBidi4 ǒ%K&*&Ea|8ph4r9n&fΜ9#GPRR͛d2\y|"zBzZyQ8ܕpd,kQP!{ eEć{_S%9맘l1AO[g4ۉHL\H*ŐY=%DL\$+12BBm۰O;"SQo8@jv3Sp f dќ^*02 \*+yE)$^sj@̤2i\pR&On~%B &( 0c:ect^P^y m$EahEUܹu֑ˤ>}:KKHl߾i&zfɒ8.Ɔ)02ϪK. }|& l~ 4=ly>jHIu \SmTF$Ҍx82;u7=cXM&gy1ᅬiw` M34orFCg۱8: ̞u_*7Fa6Yol]/$`P:%v5 I FBba pǎ̢q0@S,lH$9VsQ}MDSôET_CߏiY8N,kÇE44M1᷅R)֬YgIa~i&/L&ȇ>!0T\.G{{;!g>mD[C!R@&鐀h&Aӛy:TEEUYF s/@6Kgc#u<~n<][yni'2$ a% '܌4'9F"7Le5G<]XTWU` v/+ ?oZ)OmV1m15':_: *Nk&/Wx-Ir@b\U`!cć9{#ٌ C&3KRVǡ8]F:2dhx Uw3˰/{m1,c47`d8JcTVV!2U5lܸΌUTEp*I8\L*#%t>Ͳ /d̹ U|Mn!)2m{1Nz,NUFWU,/YM@]̞5o dh1H3Hx>+8t/^OA~p=Ĥr/s^>"Rr6x57F63.ұ$/J)h2H"JܴYYEA$Ri\N7f6 f\*&٬Z<5ܫ7Fo)SQȼ4_e$wtbb^qM\@R@ YtRwv-ߞ[Z Eq&-$ReU8+zŻ̚]|O|j.9m5'wP:7u4S[]5\md2LƄϝ;w.\s Y,]׹ qn&W_Mss3?4 Y \wu9Yƕ PȀPKň_sS?>oF<>eEUqjg Ec %,Nv`ptg6 0 h*ojERu4)K XJb$K656+~Qoۃw|vmitFS zƐnvkwlZ rt֤ħM\H?q8$yt[_P&%@,ld2M2k12:I"Rp6Asm #& 24f֜%4,dK3@Z[Al**e˖-4̙;_gxp;̝= $PVZLI*kʙ1s! Ie3 BA<_~+salnD/o(`RٰKvGRSU먬,vv!A&Emh"G4De,:@_^0ʫ odžo+ofL-AD_eOfLqr2]>iw`ϜaOW9Y%T-l!#! 9KAm\ŜVrS24@Y`hDS^~{x OfYv₃+`;]3H$(RUjBdYLd֬YNfG&+g EQXz5W]u466266Ʒ-jkk'_)`HztNl/񛩗E{0ׁ =EВs-6b ]w3 85Ãw KeʒdП%gVT2kl bvq#Btu8rKLG)xHIF:!pN0$f̚Iݔ) K/:4\G;9s:{1 ]s 9I Ys"i&k n?3ӏq͙-dr).B 3bʔJJKz9O=EL{ã8n55v:)). GXJҵ/nMƲ,nb'q#dSc(r>؀,c6 $+ +9kT3ͤTH =(YK`>Mؠ0-Y Fd_A xnH6Ya!MH>YXD0w/a",\_Qz>ḽsa}>}h'աd6a[{')CC2ѴML?A2 7? -A4ED@Hg4Kز1o߶JXhў^z H]],h̚5 C:f_* I^"(.O6cٔqq#3gpNGK[յs6߿֯[OIE۲F+jd@Vz]x]N{{{ulB 5m*Nwr`^J#IaӖi:N(طg/Y&k Ta畵 )-#J07jɦ@|Flab|[mDtP3G}x-Nc?_qStx):kM#4,#RHЪ*>]&(,rRvlF"y mp|fM-SM!l%ʐ4L|>/.Ì$p% WZNE8ȱ an=& =ID qR ػETi(5r)02)!g˶Peu"dyV? ͐ڽy3g'Mcs+HI1~A!OR_]/p]qSQQ8r`?/UoEQ '%x"igq< g wKZ8z{c@ۃ,2ȹ˴-MdQ*F\nd*´,LFUd |c%!\{u{Oow`XERջdI%uΉDZ'NsNڹ{s8qlq'vdE,KլBu QgvY,()(i̞kY{ LlSHcׁ XfڻߋS4|34F ,C FGʯ*׼f\% sQo vfpT( Jx+d3h 0 <-@yx ## d H+Ӛ7\IRA 5H 5ǁ[?l;bp=(#HiS_OGW>wٸe;#9\ Eku۬)ϣo<:7$0+6w?:I_}%_=,XX 6BkO'yxCߏlq,XΝ/rŅR,R C6v` tc=w v{zįwn"٩ UW3-b;ӹ"G`LRJR! LbO+^C,Z%l.]W,Xr{El"z ОƐ=k/+qO5ptv6`ǭ$T*wqvuҋ*Iuu1|l !.7t#[w ’ѣ>^0``*2 r^:p#Ht"AxuC,ۯa@j,3 3!N}KW^uA1q`<+y &$Iկr7טs5x2$h :$KH'902NSS+ 01gxN{_17-4i{1ZZ* LdQGx~ޛȌ om/@j*(zioj$`K dA_|}g=$2hjOʁ} 44rp>*mQUh(eZ!󸎍<}A[) cAP[8|]! %sBPc$ v= 2 6D"HB1-pТ>-]O>_!6 =v iX:▋Ȗ>N2+E|O>E(Gk0y+!P4}έ{;eڠP99 k"L0 ?Hr͙A:Hvz|13=vmÝ+/vjM;NL1:|d-G ƻ9r} O>z0C&Sz:S,$c)_{]5WhI.l|e2LN44i$_,ϞwH<RiM>X ʦKXRJw: ]p9.MruR7_D ehB\aö=p1۹w4zC*RiuǸ暫hofltIoկ}l IDATV@}N. W9!)#OO]e*!ސ/{sKsM7fjtK"< HM vIZXDrq/7 M.U ˂ŽE\#OD{E$`lHc2TP,Hע6|c.wywpwR%DDNW`PùZ^j%"@~ix(@"1;nFW_՗'aO2Y2g)۶oZRxaNF3:ă?{/Wv0h1ׅ־[B) P)H3iu0*$ɡC5' J+۷q>@PDH M3}t+\dUWnd}Aa(ym ش/l+VmvZ:i#Jc4E[4WT(<fOLH&ihi);6Jɩ,r(VmG}]Br<.K5cM&W^u=Aerkܓkjj8'T:<3NmI7o<CŒ|<?ݻޮvyLr|OR1Ϸw!?w't{#u]4=5_ woK.ƺ/hF@Z)L[w0pB1M6r =5>@>Ū5'([w2zS^!6tp؄a̺_w Oq~?4%^FBT\0hbJP9w^?--h,dL@ iaP<,% (A( .H ZɡR0 슍<0xJa!K )Z&-4Foolݼ'lZ.S*H%!nj2'IH RUP88{'!J{]H4#Lg&? lkVRuEF`xh%\JDT|GMPuX21뷈5$ABbT@h[ ;~?]kڱ |DS#|9vx+ى er41[׌/b%.jZ^j#FBБG8J$=`ԣt&߁(,2p<nk׮q eň)ccsWKDS8|Ics;—O P{2KS|_ _Yw_"#-Ԋa&m"0 7 [ ; 1Lin[iZX,Zt1%ZĆmLHfC/>o~#" KQ3ud®˱NPono{7V.j\v!XU *0`1@As(WFJ@ FcNPt@ )p%04E.g3214NGc+MY(E.N[{+Hp 1üJCדۊjJdMldaYd [q^F,i@p{g-k# [) E %%3}}^&؎/;Dl s0H5^gyYf˿ LNIhvh`Ub**c^7_ʗ׋\,o44V,F"b=@>0_S%Bqz[n{?XƓt=zx̸"rrki3egD%n#o~bSܵce8Zн6%^LfB! eͭ+DƋX4:϶c'D5cӾ) NlR;Hvvֽ;Xu12##4uurӭM7ꋯd &Rh0 4! $CK)C(0C%@1p/J{/g^r\4B hD4AH4o.Oۅ @y :i!pxB[Q#UE"ݍ7v"M"@hnf=޻ժK2jɇpL[ǎgpZ:I35ˡhiiy=uؔT*"A!_qlG14Wu% Rqf;w?l0C{hDb6VHclڴWd钥X4-$Bt] {= <)߽&Λ?cc4ԧ[ GD1E.\a*UT-PJP*p]eR0%8 u0Nah,!h:dz_w* aP Ģ%|/(L.`9!^b.`ECmb t]P# 5R# 5N@H8J:!D(J$%3}X(#nshf[bLAc]`(]0!͟% oߍ_289t IoWmlھ민|47St\F1 =c.ZޞC`D$e>r^ aʛuMFpf(K(gRKsUF2AڕKI4427 ќFbz{v0L*˱|VZ{!X|dUGq_)Yg~K\L]-DJsNT_3xZ 6& E]O,[ HD S8lf (u^7-mQ?DPÌMt2 9|thNۊ!C<$_݂jw `i0@ Leg u1#}47`zg)){BHROn1<=Bz)g󔴠=z{y'=:J*]DI8#ij'TingՊQ@c7"iT]!!}<CNrVP1=#߸/> : }Ʈhhi!pvz,iyh06]-1&&P*q5po~k/ i(V`B6!PZIsJ6sy~NzlNDk1bjBg:UH)@9~`WAمdCt<ŊK8$(%Zy2An{yZ&ݭMsaxguS ixTڋfg=Bn~DG?s~3)OjF@j1%*¯a)78*H$jh>gO^M? "Hkٹs?-<`f4޼t wq hf>4_aBhA22U`2W! >ri-Bl{i/CYVKIF8 d2w"U  3=5Sk>?{jXv# o'_Qq+BASxXTSV CYC稖H-_]|>B?~SSV=G-Xnc`E4j䣆3`rӤBQ5ӺvH 5gc&C#:jl [UpFhok`~OG3[qWrlxojdtdUVS(:v| }b=ӹ?O8~B bF$\I,"0!ÏgpQ|4Nǣ3[uiDyػ{vA?HG_%{uJ2sלMy>B8}θKՖrgLW] =m4Y"e Xt xveǖl8|Tw]qI%YՍ.%ֆ9hT]:iX,YVGG~##inDJӔBS9ʦ`:{T3rez_=twg2B< OhJַ[qu[).zxRG²,\=DPϊNZNT#fǜg;r::KόܿrLcNؿbXY@Ќm(h iij^; #Fvfy CVF@jjx/Jk\c4}A[nPy'ʢoHL♝hj頳lt*($]=T %B [G=#qnNB)Á8]m|wg8jYyURI\-UוKREݭ^KW2'8|e0DɀMdcpo\0M__4#t[%W3/aQǧCQV_<:Lqi?fB0\JWuؾs+HEp$L $_( +M aZERAiD>g@zM$6h)J(PȚy \'\rf dmER;-5p@P#7aW{PKE#,\Z:*dP-J$fHaQ*W` dc/hc]/CC~v:an`0]R06r +u^=*a^Be7E`d=]/}Glq\Ƞ[owS[b"q5tϠp]g3RW$Z s[!s?j3;ǖ!J UCSJ^iq"g3 SJEb;.--|wu> FL"!ܷa+eӣL'cO6=K/GϾHtx@ ݭU#T)l\P1 VKEL ]+Cz{Ci*uyC5p՗Җ3)S#w0$XV|5 H 5;i^.U!YxoIH(:[ZO7 ( ,])c.ULg[+}lڴ|/P8s?!MyQ֬~hMզ.YjhLG8yEߒU/b3p?hhiV03-ugugk9\s_l8N<^D&>w?D2޹_|m۟'`-*M2#$%T%!lҌ+'縤3%B$yHCCR*L"d&Lv؎" G(4uq IDAT=gR[x3c,h`ֶ׹u.]@{ۮfA{ y&2%lebYA'"e=Q8'(?[( IF#x~2EXMwQ`6IS i ,u\`~|JkZ%3P }AID O <-PH-Is.Ǜ̐U3ٕDS Ɗ/GlǍg7WiiPV!3H5YDSKD7X<%cSH2 CrBvuvFJTh{ϭ -LEsJd"Re,gyi]ILqpADjU \4.xq{j5"xYz7SJ!̠@ AB`aV;QˀPù@ˀm7* ޶6رc'z";vmgɲLo}F'Qv͊T,G=!3 !>^.Ny`0V^@}K+pD8D`iHFfejѿ]Plf^{ JjF@)F\M2LS sn}ϭ ѣCBQ{8oRvǻo}ͭ-ڱ~F 11ɧ.| exZ! c `hҚj-[s#$1:^[iWxj6U¬1_vyU}N#CsٔN/)zDHE.'ӄm۷I_o?c45L0MFFFilm%0ICy"#džqe)/ rdsBC,%Sq42*SD@UH-pDݻvs{n'MyC bn~A& l~1{tu Lx{zP# 5_A@j%X5PÛcxxR X`!qeo[$Yb9&Fi_w>q [cO?s_/tyKK/_'ٳg7#H5RceJ2\X48l_q> |_+.5py <_oEg2HO M(%li*DVpKMfZ{~}2ffM3Nq+9/q{D׳_-Rה>"'V}Ql4f:2J) i 4q=ôԌϊC.Zc' Rq!%!@3f) z -N1p]M.ǎM26rLWW'BOĉDJ%<#QD$MАn&I!Oh4NCs(s9twd+䦙dXz5Ѩ3O?Ɋe&ژfZdx^"_d$ g/öm['y jiș_ ,-W=DIg>Z+}{& b+0䡇smzJ-_ M>飏>飏>ya}jmo䔟 A3|Egw==wEV_7\qم9,]2ƶvЍ[>F}>L c ߇>=w=w̭.ݿ{1ׯ>I+C&+{~dXI>UpSέDcE)Ie8DO.F4eX)lNupz={(V˸~@qt 7$]sLS%#ԻXs۝_G9r|/Fv9xQ/R96= f}% v'Icƒ%Fx[gVge-t:ٍIRc N4- KljbCQ*]>LeF'0TdR9Hc8-ph;FzΩ*ű_as@ʅIim|c"yd# suWl57  32aqtG?' 8tD#8g.ӹ:}ޙ`*H W:$\'W/] 7\O0T_͡Goǿrynr츋3+t@&8kZߋ/9:=GX(nehtxY|Cj J)8:'gV(CjteaPdfVR1WJk_~; &ݾJv`Goͮ h&6w)JtZ]fNXL)<e̵CI5eY!'v(dO)߫'Ґf)c*~V 83<>uǏo͈cǏS,Hq_eLLE(<4M!bf)0$\8"PV:HYb%1elٴCЎc)fd]6sQJ12:ʶ_\ftJʥץZ^M J{cdSIf>{:|&iuM^{ַ?ɡǑez Yh,f&CV| tg3`%|w۷xbjDKHAd;,]1/*AZa2TZ#hC~UVSoTk>C J) zx*q="ę%(&3$Ƥ +W^#d,v裏> H} O扒/eWpw2+~oc TW3Nϲsv,tVYi#LMM1AqR:-| I/Z[>¥\.|zmǡi6dYFN4FaaP \.Kq\V$q1?ر |?`~jyU+6r: E)v+X*MzXc;:Q{/300r/ȱLM~8$1wugcfvuQ% |p1* ) O:E:M2OpC,i9kaEHR؞I*d}Gkn8a0Ձ##R)ё1B\*C$dqªkYr <%efv YtLRA裏g} H}/4 MgxZO+dq1yLͲb Z}~r2Z.R:,_6B܈^$ XZ6K,h]HX,nPsςɇ_>}NAI$:@;o~l/~Gs.h bY<4MDJI%ۑe10 QJEQnͫB\]$aibnQ7uPҥۍBMDxKF #L'O㡝21f0Q7w@=x!q CY!kaCFYLQZtιCv}8mRTe(Yt'4$qBPtҊ`nLf(` N+]o12RctlZaSU(KUB)a/QQw=zLwȻIRdzt~k@x/B>" @5?3,iB%B^q \|.Is=[;~ѪϺUٱdLM^ĝ$-ܳNko5~ M\%KB'?(bOI# I=p-3_$dqzh;R6o<ɣVY!ZM$Ijڐ$ abqZ9.Z8"\P4m>i16)%/7d: m,?.agr(}{Yb {ǢrPÞx]r %2ju)CXv=rn!+W25=Ó*'&cIurRݘJD/r3\YoXkP pEݘO_rj˖S(WC\%FG{aPT>SzR*|@&35u+ٰ~6HGGMBjkc4Q'h1;% ! ÷}_}Yl9M09q=DFaҘb322+aP6<«^:]@r.d'd'3O z9Orޱ\)ɇNH |$﹟NҤnЍ:8Jq]fgp?%WkDNZ!BBi'r',β<BDb"֤I !I q<,&˰Rq9jۤY8*BLs]2P*1h\G`Mr| m R:hjaO4<+"$RJ$BR᪀5+73:e=oBI;E!T GXv+jkNi%>(+V-!@A?+|5Cd>wq)|:_R>RfjRr\qܰJV8B HX։ږͦ/WpvJ}G}G}{ν4mzW[O4{rA^0q{"pGtBA(u|wZVX㇎P8\r%|w`"j=9p JGys=ڻ#[BE%H3ȓOhr1{y O>ZkjebazѨٱc;&pޖ*q"BZZbh ŗ_D٤\ QR𮝸.~qls㸸H@X170444IfQϪQ -YΎM_*[RTbxXdѸR`LF3ݷ(%//EJȒO@" }z}#  Oi q\E#@yI q.R "ky lkccDQq|;w󳯻Ox :F(WorNIXD&axAHyni8ANWJYP,iZqLPGz B! NY$8+%hB.F\'$":Mb$dДeqdޕjST FG(ΰrj_&76x2 IDAT2 RGF^Hk})XFIB|mgggi6x Y(Rpn>ٛw-ȻgSJ.C?G~~e]&A)2m4C8̶&brrss3LOOrq{I׾Zkg?wotg!J)5vؼq S;~/wX]I4R)|Gi(ȲNWE `fvzRy0?'GV}x/$\B،Xd!srݐ,xg䒡\+ٶ7ܝʋ8k;=D#U|λvp-Fi4\R+Ym< D陎`|LjZ&y:iuљXW{ф7.,˓߱* 4 ahp(p$. v 8# |4P*`34Td($M4Y$@tF+|+R#Cx% QTH 8ROEcqT&G)k2<4Ɔ[ 3d%0n; 7pbش"F!3sd&fnM_2m,)!nXbxxL[q2Kv>]^3?zjr'?f< fjD@ CiӍg9vd[ֳᬋxކp+M5?'>^k@xdvQ*d/Zީf'$b8 9Q-QG \G %82(Id|O'J-h5K<8gY~7:xt/Xd .y.\5F٠n,uA4VJ-6i,dPz#lStn_,:G-u4"vЙf>gjq!DXrB 5J%jfY72y! Kp qQ,<I!a)t4f ,ZNZQDTQo')1HSEN<:& ĦX,)IN(=:&Nc@$(/#VHnDI8iQ l2:4)DG6N}18(UZ~6c)#l9 6R^_AM2|.| fh5PyvO$-I)py(7``G$TkU ڕkiDTd#msk'_{ KO~ѱ!~[(sKRgf8I3)I,?UKYbp|B' }' }qI\ $X(4jeW$ox[ɴDI0k,::K)ౝ;9s&B\h*e>l Yt :Pc,]E)5s sB8>;9ygYi ]rJW ł$g]pP[ںBf?RL|$HȲvv}Jqϻ7m_)|^v;wƱh4EJ/wJS*g֚$NHSX#J|AJI^ZKi9 .F"e@Pɨ}7yw%Kحz6MI /jH0qo_! 4I186 K])C\A$Xj7oϳv*^s58rM^{hP98";d)q}=߽ U?X4_G?~u$#7Ro^.|ۃ.dt[m @JIB 5x+Õ$)֮/vTgr^SouJ P*P,j q2vn>֯I`Y$(I4 $!IքA.NJ.䣨q+R$ILV@]˗nPO۩sϰr^Y!M, CjCdsJ8*_BiYv;K1xR $bdxbb#'ؼy#{b\uլXql>w=ׯ#4uR$mN4mDm~h7㛸歿E6HhB'gBEyyؤs`\eBq#w}cM;v!1\p' ?XA"3:r,48^7>@[淿/Jx\y;Ju.y ׾A882wʴ^n3|Do7@{tbȠ=qX,ȥ$xh6xկD!|f[I5EjljL|J "UhgY6eՊu,]G},mz86>B!5mTs(4=ʕ2U8CAES(hY-HHGRB8xNL r*uw+r49tl|.<ƤBD-F >WE6K| C#WV} H}pH빌yKJ&dJ }%|hLʮIȍ|6#X?.81vL!{J Um_`VvwW]2|[~%({-k;gkN褘 ';bѕ*M3Z&J7\?u3i: Lb#cf^kXt9c1[J4Ul&Xf+W]97nn2O?gwwAouy;ibmty> zJkFD RCISKZܞ]p&,1==CGG ູ8n%,_Jԍq\z 'xDŵ{fkw)? ZOX~죏>~2 WI+󳥮H4-2UĈn.oB JEQ-7}=H.۸W_[Oph qԩ+"q\ZRX#?'0:schtbƒU\JxLpYBe:O?d)Q8:9E! m71A,/j6a.q[der.I3C!(P 9)Rv-v:k/)*UڭA2=3ƭgo~ λje0hncE #C^t''Yp:m6?…ʕ˘zk7n'_q5_[$ - }]0P\pe,8 }Ǐ`=waazBY!t:TR[H+ Yt%yG DTosWW|E_cZa J)/[M_;CGZ>t t-o _|'K6_@EjEbpˆΓE)uߑ7e4j9v< CQzOa&J2rV:POqR8kq?㡔Zq`<"8\%hm(v0b!4rq%ɺk(H aSUȬnvXtZS*i[hc5xtr9 Iݸ'# ! _U,~q9%sĀ?DRcCw Lh7ذrJe}.SRxx~be`:`l\AaVlsrFQ]>^k@gD K#$Ҁ[֚M E%/>=hh/%KF$mW z5 |Usk>6r3fy_#?կ}9XcNN-H3' 'rT5e ^P Z9~əÌ/gzj,,VZjv?6Q )ĜtSD9E {=ſ/.ab{ bBR.{ iEqAL8.Rr tfH%zfAd%wъ#3m5^'2" B|ߣui8_lI1'u@& v܄Lw0:`ɒUdC=T!D/{+%T*a/G1<83V9 _Il \ZVl {`$ }G}3:<5ZfE) BYD-띴ˁ/Y+/]ɪmyxΞ\HA% L.I&R"R"K<5 '~BIt&@*ԆG(.6"=sO^đFį៑ZTp\ '=CMD}aO%\*:?蜐nh5ncOS KH+) Dۦ3o(?'HPX(iaʍblXf\X5*tbqRʥVn֡Riz(V*$,˓@[C\@Ƥa i$:X-ma``&I:.R fy6mıcR*'6.\tn{-N[օCiy=x7 %Gv>L$݅NCS2w'2z]FADJIT!KR `4i/PJh)nER B\qb?A!jQ3WMm[IIRFh;}UV83޿W$'ursB _β ksxկaSv ``&R՗󢳯TYF)#I>BG' ?`oh>KBd2mw>6IS?Ɖ4Nu|+_AezϿFk]'ytmn,JJ "3xn@%ISf{.$t2زG?αTA8;i4Kr}G%RLj G=aDQD"4IYFDQD$JE* 0<6LX@(ATlblظe˗9r$'˩\ sq}c vKFdc{Xn]vZm11gNDIliCJ6n>GuםS((j339} _u58裏>飏>~`zvi҉ E6l{peUo/YP8Dmݟ~{܏DHt4"/%PIE艉OEC.JGa˖-#8XJ 1l" b'ΞȻ8q}THms\r;E,k{+%H҄T8 fffPJQVҌ(JHr3F#wt:=<>I-snn@ 6)Zk) DI,Bj \קJJݨC%^7>ömۈw?qk㚓|KZbV˲شi%q<@-`bbSppOXB0PaaAcս)n} h}D ݯWӟˮ-M݇ZO:DdtlɞE6;~hПXa[6Z87Eg_@Xa(8AoQ",22ms{w Cwσܵ1S4 yN+ IDATUWP(BE6} ǎ,esXj1in*̢(1yy]L>jP2wu$A,B-(Nr Y?<5?>x'hl8$q&J(}$ܞ.Dd8a(A@ZT04Zw[;w>LO΢S.WqBP^r>x6OB>NC:_>Dv!ruy޿܀:,[=/_]7}_0U(/2g|A#H8v c/( (S4iW3Ӈ9{zJ΀H0M-ȜHS Bf[&|Q`ڟCk|?D".-OLJ2ϫtksDcm9g -$"H$sŌ ]C#ӌ8ռMk,!"#J͖iGTS?x3g~&]*uaJh):3h7Jo%_z}( K{l)h66u3#BlnsNKX䱡CT- ;_4g|ӟ95E}tN< /q/Dze1ٹs"gY?VuȁVh)=x/}Gئ mMhX7=5U`E!AYo${FfAG~=돇 s-;ϬOM]fkVˣ#Di2٪~T$#|4ibSpxr},\eN񣈠p|*Q**jE$IFn $&8SddH8V(i5ǰ, Om\L aH#KN|HqU;q&N7$a Bh - äPc@.bHIjAqsm-I3a/ijΝ#к|:| 2K|xΞfU$ىbliגGyQx~ַR(~.\IO"4됊vXͲ8x_gh^!%)) |wm oR,[fw)am (%)T~Ў%iM@h_t(5B(a&bQۮ8t'$.p/^ON8A U+V2?|vb/}Oqo >'gs|kWpI#M Cc\Orԉ/!Y~Sd4 c.POvE?/ycl[n0-3WH !~ PyF~vաgC, 8IB!i"Xb4&eFqS@1W$$BI*K57K&qIb0LÑ#U$$qRЩAoO7#C  ,04aAZ& "Z T$*R܏FH)Tj-ئiX4[쵞c=b6$N0A.1aR7N@T&QDaq9"u6xVb(ϝ?1ˠbV-pY>ȄsKg' h)&v%+NpKNǴ;3upNE%Rw|#eΝ[wYBB s >pY/!ɑI@D{Jo6$B6mڔYI'I,1Mn?p'aj 1kW%cqML H֜lܰ#VP:K9Nggu7) OMXѷ͏MO1ӈغi6vblz~lϿ(27ՠj;>7)O=y-TUN8%2x(9xEr>^\4q,B;&N<|F4 iZAxMV`[6ibZq~ff-p%Qh4h4$I:Y N`, 5eQ,VRQBY E-A-ce6GGG099VAheRWI)LLi!R.(%wO~R۶I.x AsEڗW7Cؙ j,4M߻w;|B|/;^ںkfY&BI/./`XO~&V}fblt?q&8SSS##XmQ,&e%1i>Bg@7b&QRKdfItvvPkdD# B0,lA*t \% ry,iSJ"'sݚ  KP(B"MbƦ( T*Rp+Q98:%'(/ꥶh1]yXŒ|kw⨅ؾcfj>O|A#:;i r=zGOW÷x'D=T:qA?uY[>=Ν{Xl1\%x-XϛLNs'%{aHTc]E{nB@?mϒ9;+lxc~):ՔJ%l*'Ҥh ݻv?DJrQIeO) H7Z3Br$Fi( (ĶiPBbö %LDEiFJy4ejz ibYKaV IS5_)2MbH'>Af4 .89Sx̶DB[KH2xvD鳴L`=;-:!P*e]yY<qeQaۙUeYhmHLeIǩUL-0LL"mxmp oFc=7~'i. ߿RwB֬:@0X} Gޛ8Wm^ar>9s-"jI֋}e1P ٠A5K!Dp#o{R a LBh `R-%\ۢP0-MRk G1Mc8*ldRyץ11#H Jiy LKC*F3s&WaX&~c@ -/q Q4,TS0#A)b)mFJ[ʑA+ZB,Hk1 r( :mPpyKƳašˊ,P19! @ΎS t%BHIBu?JfRKL $ZJ2$B IK<.=8si |7󲗞Y{4_LNLU0%JR/P)~1iwZiaR%!gd|[&m8hMڍ\G16ǐ9N Naj b|Ns]\;0^"Q>k٫-1^w^PǷFGgե}&aqAz_.b``zcL6[6f|{|ߧj 뮿]WKsM,n8Møeb`8E"oaA8 ;}R,^Oof>FFJ#MAGYDIb-/EEJ>BCИm݌O'(Ȓ+UFaIhib+O5(6BAn5ƶ-YIαÀA$Qp *GQDV'Ia`YZdtd)L " #J\$}~񋖗EQ"#%)ed@dbq-4ZL ɂ#iB|o>_&J~x}i>2J#Y7׳fi'+u{l#W5[)V,_{m[͛{o"FG,v 7tj8Di! &~O>krhO HWW퐄[r@E08a؎$KGW\ޤR$!X1ǮcђnNuLx~{p\A֑DZS+.3: $!,yIl6BbfIrpm.(+P ke8yJ)8ϐF!\o k4!U| 2-i6~hhwLuߧRyѯz)VDar]hF1ٰr9wNyv>ח{|'ZlOIEeNRk?||G9m2,N`zL#ו,x#c#T 1x'zD}rdcb|ws2'?7nB=ObT&ѯ兵+B~n,I! %&Qi5Ū^$?ήhBzG>N3Ck ct֪7k/{.Iem& m/5ͦ?l4:ɚq/q}wA_w)Nw߄ӳwgSì9*Ͽ~qw19>71UNX/!?8WZv{pq>/w]֮[āqrVǬN4L ]Ev=r+Oape͗a2?R1m !iy/JÐUuBH(577ϓ,d6sB:tH)IUB I:kl[A'Me౼ vub!8ص{'7cN}y,\rZv^Ӫ{VXpFzѱ;\\e|tVZMs Q} ԣ'|Ӹ%sE^'.Qh6l 0I"4fpmiζa ɻͫPd6MFb!2zRh|?"0Љ 4JkyrV;[ N $add@=WG"$MDR?;F] t5YMRY E$%ͪ]=I~^%Z+DaH3kgSI I49f VXkgm& mƯB@` Acy۹??j ţOP,Yh {S[0N2XqЁG*}S#L-w`q/IR$u[ 5urOLG쥔`IcFXNEԸm,ZM{Smrļ|R6.duar3{ rv"o=̙o:7^p^E>uJ!G^%e291Na 4-ʕN<%`hP$bL@ $qaX²r$$$i3Idn]i!RVeI&NºYEC|2o U0W&B $D<{-? IDAT\k7iyq{Xz35 DJT&h )%Zǀ ~z֭[KoDKFm-FW XzzbA XBOe>AĖGaR$Q`a+ST 8HgWG?z5q7Qgɲ-ᔓerv=ƥ?o1<x^B[ O1t E/w5#[')( p'=y2 <\kʳd"GH$#0$4HiQ UTJj0flF%|'QUX:F$(eQQZ6&$[Đ]m& R) i7|/LHIJ 4&I"l$M DZ ?DmF@/rzۋiyA@XEZhZG( gI]ZiJٜLIVYo259M&DADDqsdӛQA_/I`RUQ44Ő! vL u41̔iy Jyr8|!X \eGDҍKD㚊[%iְiIQ*IJeUI)bT* [~y:,sRrE@gG3< SNnwX={量w 6w߹kI4i9-f ZQfͬ<$4'r acbdSN\ ' ޿ⴓNGE1{oXt_NK%RS5zJx ǫNIrX[r7_,)d"]kI@O' K>w0۶\.G* ä63nr̾}-N8Jj߯# Z-mx2@cv.\ S15=1e]8N.J2W,e^8"Iݝ4ҀNF&90ˎḩa̦Mr'bpOTu]l͐/Inj^qX ˴IPHSR((JE a&ICQ6%qϻ1&54j0nb:%:i! BLӤ\.g.aZ$crND)0\2yx_>v }{d$qVLMOmf5|+3_'?!t0szyKIҘfC񼐱 VZ͞=QLoOVC<3x@+΅d SϞ; q*r?!( b:[h6# ' ,AH8 EצWs? שSO; r4nh6###\z|3 lˢʟk[>ׯk6m1䋗]ÞO{\r%刺}p x //X|=UF~ԣlS7<54i$jmh~Ž?cEłslSVrϽ?att.~x&*k(m~z9gA{0!Rs$[?,9=涗:!s 2 ӄX5ITBj:FufEr'Am^N?]۶3q(A =bff( l޲b=[xJW zW>#g=)CC:r4 n}c˖\ߥȒGe^^{~7ǰ,Z8&/2"/`lztWY!l7_vcUC 3 iL`ir1jSHIU# f@#X.1Z -p, ]ј) LOϐsl A⣵VuX(h ̂I4hb !\~r /;_?k# Ugzlko/*6mؘM_VY8ji6g#¤w99ΊGbp5aH @jT*HZhQiYJ ۶W94J:!iX2M_E> IcYcY0mٲ)\|,]V !AYϒmZmFbϾ=\_rlotX1ڀ"gΝiap{.:?|R!v+ . ,j#}KguY*uey Y oj',BC*󵫞@DB)|RksچW Gߦ{N_}l)$I0 uT+x /xVˁFD/#>+>Ugpb G>|7%IS͈#8U=k(?yR k(N'add;A0r6"32kTgزSDQL>W@SOy J ihʕR]}rzLӗ\2R 9҂ny.=7tJK rEg>Iq,|c$JqEC@H=2O\`r?ǟ2y˟~6v 4yzs;Ȣrw羚oZ̪5˱dcSG %Go0r/ l 8e1>9%TZ).`SZB+ uʋHg߮?6@b!L)#Gtl61lAl\#hLML0J6i#Fj6[h64[3( MMG. tu p7Hݝ 8Xx~G{erj !Lƨ{#;آ} iØbrbeDq/'X'R&8v}TˬJ fOq]>LP!4dՋ^['oHߊD_{8i "qRpā#aH By"3a+Fm sگrp&Ŷ]Z5ʷb>O\~㎻gٲeZ-$K6 e˖&Ǝx⇗gFMttÆ.dڍ$qe_xKoIg yS{Zvx+M;X(f[O_e,tp*xdEرb*ذ|1ʽ|"DI;6XԧM(XtX'3͏ñ'e#9cٰzJiy`*8{gU#qǜIıs(]G' mRy!\DJjQ)]a)EҊv(HӘbDLNOPt4[8r$IeXҡX-4(J4`lr ? tuB 85șDj0AXEcVh]yVLʳgvHbr t Z3McHM.GA$;^.DtB H℞~ `llRBVVQ(1,?֤BSfCk#HI:jmpm;v3Uchd7Mkљc$MMɃD> jzNWO7}IO SS8WmV1zp';nñyyochn YRKR4rXTZ_Z$J>x?]]]KtlXv08U b$atüsf)moFm+\'8E8aNz̡U|_Ǝ> o<-sdc^ʳٴI6mzW(0,.~i?#S<<HafƌZ&l<}g%LNNO0T\q)Y%'5߹Q/b̿~{|覷Gp7۶b? X{䑬'aґRo kQa[%z%TplKrv,} dqb?[>8{+SlyWqIS46"Dkx>mm=Xv.NC&J ,ÀTcZ֟+W|]Ï9Q @H΁LuD؎umf+^!"M#y۱')nA-Nytw3xHT `)A!ͦG) q%mCTȹ&I.oc IG*( Mc(4LSb MP4h54k5 S3Qa9JF$ OR$ ڀ q< [~ S+`6jJB5 7)upn \#ތ>5PϭB++^cغy/NMXȕm3ws ittT) l f.O(Vr h'pvpuGfYC"J-fc*纲r9o (tcSRiT)bȕe編v );vW(_<ޮ>k^kgINBBBS""XTcWjE}jZ}mU ($a&@I tr=urk[3}QV\!L-O?@sj=+c$?'4?{&>n1^u'@ܹC|yal0؏i]wa f?o3AN8%'gFNk̇?׼Xl'/J8M+5|[3+X 2oh\Gb?Bg-{wEOne~3QZioT8UsBz!\yx|'PM$5gPW<6A¿;gjVyS |Z6VN2|W(%ɲ8.Zfkt&ŒpVo@jF둉ʰ0`]}&>wѹ_߿ .#;\1 &&:g|Yr%SN;u߭5^c.Gv ,];.]Rl`ty|{mĬ`8ijؽm+>9~iYl)y|w#(2lbU ตzUxr7v0vJ#rCj*KjL :a”Plj*H)qgF?F յXFaL'L':Dz#PJ"svض24b.ycCC$I!-9^RDeTUzuUuxr(>PҦiܹstz<öm\$10p<1!Fnq0ny.at@6$4D!ch`q 'b2^DZ:.a/!BXk!Oc.X&AJ HӔ, Uy&evJ 4nS*59tA\+YKu۟9= 4%A#]4#A)@,RBlwI EE:HlGb:d4BwGbrmA9/Xsf/Ll !q5Gr c+$4h 7])H0 ŋsu1 9&ZeYL3F9= \s ]OqnwV j}O@^n726>+_n?|.xXrz5T*Ʒ{c;b;Nȣoh8;nncON04ޯ{Yl-ַ]{I<UVsBd7GZi{Db OPYNfM2cNrGłvN|+G IDATs䪥~̠7 E\;1oFcp%e~l &? :NXql߱Mܽf6CٵsOܾO;xO;; FF撦E]9zqgyyJAP+nFk 2P |$A)r o5RJ|041 ydvPeo#I4H(18Ԡm@ f+j1$IQ!Gh$Zt˱1nxS$6Q<4M(($O² \T+@4)drr0["`6f`)0HA)8XEף^60IftZ](e``\tcP %4fǎ1zebJ1pA%(C`h´Gu._&LؖGh26I1(o=[h9?ퟘ?)Ll|Ah2/JHA;f(P=^X- YFuN8a2)1ɉҔ$IKp]w@s$\.cE"M$7?׾5~a&''̫^}ccc,omI}Nj¼袋>FGGG%[Y.<8yr'x"7n 5^^<+I*uO93m/MT xլ^s;Z!LMME1E)f?/"l! CrY8+Hӄ4i6I҈+TA1MsY}0 ,_fs0p}ziJ0==iض:XKg-,V iJT6Jh,&9if)m=8ZP8aILVCh0QLfhierZȽ&]#JaD+_0#хK $HqMu-J1 `XXq0=m,]nw{9B6LEG9,\[7Am 4(-׃4,_r$k03¡dLnb(c۷11i2o _p e(Y斞}-(泖 K}Y3ɉrhbM*Je[SN}{ 4Bh ǵBhq{~u?g/c͚5iW\A+!NR\ۦR.oXc+{~K]v; _#c}ا@_z/W.8<Zu]LNN~z8z;?Oȵ` g L3컘Wx靬^-]ʭW\e]OǞF{/ ~+EaC a1m*/˪Q a UqShpȋeLgg\OwckyݛᗓH$Kpxu|stJa*m`GY6L5{MSJchA|# -f&8u j\۠S7hsiN v䒏nvp-ki|>t&Jx.77x]3.j,w"8J;̝;Lb%x;$22-3ot3'ԲdNs;\o<?:4M3zD{nLAireo]ILP&@͘h! { FTK"dEa~IGXkG8SJA=*5|}%[~W\__K<& > FK.Qaڍ(}ky+X\Me.v<ʖ˦M8:TZ̆;1 ǜd"ɉEƵ|zq\~_ NL%^i]˲0 Ngz#Dk׮ezz sٜ&MSic8\EK5qRYu(3Ԕ+%&''@idy珐g`jz/vnl0!QF8UdI7 qfI^yIl$qҴz-B'rr|Bhh=QG~oųi,@QEM[U&vvm kp[qy>x(/!E;}T3tR}/i0t>7;e,riQ[?a'ͅ /=SYIٰ~;^~1Gϛ|O?ƒagyQB* {n'8{GWRqDQ3ÿsݝt%w<3A4 cR V ۶RhQTbiZz2}:6WwP.F= (bnAJA\f aθkYVgX%s6* ۶,a.CA(lcvZFk$jEJm "4OmrzNgLLQ$JC,G:'#!_д^BKZi 2)JDq̊+غu^% #J@JQiJ}WZy1sbZJZk5RsӱZa>`-E+3i(f̓\- isnP:v'meRªN$R/폔bƘ~~VR-ͣVOfãPVmpo'IR\EfRhp]C>kq裏Eᙬ:|1yӛٰ l?2ZP TΖ-[fUPj:ö @ huBLMMjgu|_~7{3Xj%IݾQooKKrV tH[k w~lY}/ i\rvl|GYp1*D>K֟|GwCOKͩ1Ny؞f|b'yj:SmN9ϋ?KecV<qt 'Ƿ}#d3JVy!1L` =a)R@Z!4@?Kj7˶,K-%sIR(0 ,#eaY($^0aEJ\8ze8C%J(Y7w6ɓBK9C QV#&&f|e ֮‹FA<)Iuc:UzQ,M K^R<ύ'\h+|n#OxѠ4 ;0^AG? s^a5l{0l6gJ%]wW9 c/\#v]}GA֚O>?aK=1):JVL;h0z?Sr <~*HcfCN1.MSxkgOs1+eW3Ađ'Ǚd]H͒hƏјoR'8cH3/nH-Z0(bԘ$-zvnZ 5dYc0#q&ΝKa{zR'8N0m(#c< <#S(-(!p@ ؎AQcphϷ6hN7$+\ 3lՀLT2Ll&&@\v,„b8 y3wxQ)y UB7UHЍzh-1 MĽi# 'Bܠ4\eh\Eb`>V s|1 \0T$t#TjNؖM;y裏>%slzrV.8<.bLӤQt3*toܱV \4~mJji>sW\;Nn.qý8Wq 7h޶L6m\sk,^g@EeZ!L 9o\nm|eXm9Zv?@.kHUY{eŊC5rGUlO,7g"R)<ۧi.7e9IRn)%sm> R8mq,&Jcn51=y#s0%*ƲnL\" C5zq/I*\`0<dJ%X8w?⤃kO}VKXBho,& } Wټu'Y24542ٚcqb0ʓ9m300@V}6an @63X.,L:Yҋz2% C&LONќ^Q*繅7=2 C4)8 ۸m;F+h4 I0.g^tg=ltm"DF0rMڋ1 pe`9R LWQ[H4m%)tC'z=#Ag23r[ϡѨ& ##3@Q*jUrİD1`%4=ɶHz r p.^4&JBq~#/(DxyA+MbѢyi4e:,>1g; }۩/_Kcdd.sPC=i+L,Kf8o`jral>|Uka{;w0P7׿\/E!O1AiQqg!y &%HD 4Tjsn!?[A0{nV6خ JU#:$4 YR$(H: A/le1BXeK:g+cLĶ"31Is\,Gj`u@KMԪ5!p]TD^8.XJShw(Thvd8ٴm^o+r Z{3G(WX$cdni6 .# ja SR.Uٽ}ȩkDaD'4w5] )M\4YVtH\qoJz$/=Ț1VX1s΋Y}͏gw^l?{O̔v]p {[Ts,sٶ{K2Pkpc{x% o4&;#K$LNL099E4Sm-ڟ?TʥŰ>' غy=O38T<Λ>ȶ*/#2*~s%.~"ⶻ7rJN9N}тƢL7P0ؽיJFۋ8bxih IDAT"u=p.]–-9#fs<9x9SlݲV?䙀^*l"WiQėNFHMjm?/۝(w{Lɫҳ*k_7JIYm)E/ySJnl4,qcقT\)#B+5Aؽ{l0X.iۅJ}%k#yKer$ znCadd,H҄`()sCQı^L\eEt:?=I,˚=BjZ1h$I%Y&eӚq,,L0JFotӭ2Op]JJGmDqH$R̙Y'ɤFJh)HӜj8NcѮf1+W ,9l!@ GkD0P(,A c!yknmb3qb.abX^\MʱLDzQ(%Rvyh ?}+5Q&& B Kӭq,RF IԂC,lڭ6i0zX[IPj#RQ#W!i!:ئ65Z&a)u]a@8٣d "FZ g%h87`&I.N01´R)`7LŲC$lvz):Ɉ4NiZA7IN54Y 7$jwiT!+t^h$ mɘ0uߣ\18oL~]LacKcMtC0F߼ET*=0d*Ǵ VrKz9St'=,Cqs rm!+~eK%\ ,C 5R(&Z*``h100gY^FdYN1`׎݈S_} a1! n94N?  *N6oXKk${ww",J`8h ;2}G[fEɕ\7? rG_沯9=ǿ ʹ翅3N~,?)%O>$j*~`;.JBS3|A!ǹo~qI%{n?Y=͛6x9?<#~4 r_%s.Ve}8Sg۾-b!zac,LS~Wʋx!%,oGnR*fx 繄av0+U$IsƨZTF/T:N4MjضR *ű=r0z]^ KبXIK0 !INO.#0@J53TLNM``0k((W+IЙ`8&a7PF!hB\tgl@ ZjnN)>X\pi 㔡Ji⸃S+%) 1qØ8fؖEnfAu̮do~7Dy5l<\YH"c *b{HMs%]RB$FGGG V^E_cYNfjvr)Q:.qknnW@1x}q7 a} W#T)& =O ,<qލy~ QdމwWQ.WohG~aXglj'ŋ'dnqѯ7C8sua(Ë{?¥U%~NB! BGVb_C&{$\ضRR$(Ugd8[( ȳ Ӳ IOm͛ˏ!#Ugdht;Rl۾ɩh3u}]NJϺlv*ǟxrAu,.۶mn??0i5N?t(&#:4p~Oi܄_ }/H~KO=IjFV !e@2_ Vـn014#.长ǮG/7\ςQ䤀,WkQڤ&FX6xu81K&EETJ 0TuBڽ.Z( *6/T̴f2m%t:=JkCئM^& ]jQ0=Iےhb6v#\ץ:\ja%Kn(,W ׆X'= ]o[:7ɿz2ӌI05N4=i6Қkn(-Np>$&XE%5Z^Q$f. #O2¾f aB֬?ի^ƚ*,-Z$s&S>wN|7r P588h ?z1C?[>SNeCX^3Z0 C < \/Ay^xObq#S 4]?̷fHb/FOxSh)`RZ}n 4͢Iid%1@0 (ZTӲXyF>h2L,ω}lǥ\b96s(aE!iwBS*8W*1?;%Y14TE Y{cyaXH6F0 R)_| ա SuQ?Cǝ& I1R )aٲe-@n"i>q:j(r&i q?vm81 B0Y#DkIqq-,|a֪4JcJL…/4o9S×Q[VaÚ|~GF=mH.V0?<*'5#lƍiwi hC%fJ2|Ӣ@B匮bT>  ^F\ 0J)a=ub\vx{cOb# >m6n[C+,rl\;O=;mF߰~0ŢӞ Kp΋6oDRohThXr3N{|p˭?\ary!_X~=qO3Cr \r{عq>Oppe) %^q=of׮]uu]n/X >\!B(\#qOAc(E?]]ngƨ ՅKx+L!x1M 6Bxu5y^& |<5T>~ Yz=$iﻘaXdYZDEζ,4-0@><%cl&c4)Q$iN2l!I{ "nM6s`msIӒTkU\cvML MR©9t"RDie}-JGDR8HC34TKÐ5 Q(~Ia)]Vq4z얈F UPOZ4,n߯Pyc9ĐãQmixDq!%0:z!,___Y247 /.\?wnn@k|;]v^uSj۶q?\s B(Oq^|oy+}+r׮Fk/ ` 5Cd*'ͳAk\+ BT3k \c\it|!hEgu=HӘQJB|Lq٢!m$IRZ"0Mj *B 0Bb6PQz<#W"Ѽj100 8.8%W`}\@SMP$FFJ ~?$iS*H+]RL&^:f&z˲m4n.0MsR*!vr<%M6a8Y)풥9*AtZ݀nֺT\Ei)nɢ\I$b|mŊkÈvEo 2)JbJr z6i`ž8%MNiEW%/̑ oR >[F)>Wc.e0wpʹ 6n~ MFؖC$gyxy^ᕣ`"$MS!hԆ}i"MzN@,˰m˴h8zd@3q<s=:4Npl<˘\ MK̷x4i, qIlk8a4QE)Kfq^j:au]fj5R%UFGrJL@#$KS@c9e2ƔA m )jv~O4(A+vMVǵRt.^GiEjUc#Ho/f|/)U<2%¶ sm)M٤TQB* ۲X9]\ϥu;hh oijJ%fc lt ~F 8.%bg.֭=- Y2X{zC!xJP%j* %6h(a1i6nۿIԍ\JV"ŖzZp>x%, Ax|8pO>vq>zp͵cl޼뮻9^ir9dzzA+Ba:z&z0aq]ʗq?#Zܗewlذ6oތRIqJڹO0 z,cot: K<ơ$Ґ+I@KAe!#*XҢIpm-&Ok$$SenJS\vHU,tH{9]B犽{=܊hqZo3=jnFFpʂ J=DaKT*:4IceC},a2Ԩ1qKE^'V B,8& bFky_Aӌ0=8< R1s&6-*kNe˙Ƕǘo{zp4M5K_) K YaJU.LcxQ~ uHӌ[e8\8Ö-$*KRױU|lK/J3/=8cctz|ӟZǬ3.&Ϣ~ޗA 5hL ԰4BKFw|{{y瑇n7-E'z_lʻnvw] C.a߯=uvV|_²L;8r6/yqo,!it1_xv=p{pZ+r M3rE G.ʄ5 Y6ؾJ#͟~+Z Dl1C|X,חxZ:[pmN"'P1+ Eb뺸ʓⰅl$Z81-TjOf#?A'<<ףy`שj6:ˑ<+9+C̥lE[7^0M#2igxd^'T3 +ZMe0Ҩ\1=snEVa|EaN:~*ꣳ8MUNm3{%gqn/11XؠCc##J<[z0|K_կ~5B>>?cɲdi@T W_}5W\q?œv"MU'^Q,CW_*<*2Yƍ_n jxoB}kH)1McN$,m˲z .3=Bo@;Wj86*O|n]rx?3^s\>t#"VH#'c6zRDǃEݦVJ40ՄaH/k$ak85V0@ IJMXN.tfjCU(F P"#!wOL>^p߾؆5ʖiA^mPFQI庋_)Qr:.Í5ߥ6\/o.zr$I^'2l|J!O2"MsTgF+hb Q?r lizE Qu+OSDcWg㦣rb ߻n|)Yu:Ai !FC 7xGA?4mסsEZett={C/edd!qTqeڔa$)23ԸIԇFV.PTC}O—34]<ObEg**/iaHQ&dYTlS YnEA8K9_xrΝxz> LLLi-_46mp- )߼n.RXퟜaoR ۑcfffnB`؎@7&LCs,___'ڽhK2\S|`7mYw>{(I/<#Ɏ=6Wbq\[ٲ4K"\RdO,GH!QP (DxQ<팏S~ЫxAB{>?At-4:4 ~pc(+Eԋp]m!r+\oRʪkA:h!t:؎@I8q@jqC# "baAخ-,ڭyΖ&9ģa ~`X}ʕ2'3A@5݌.d*eJ>ibF&4i7 NNVIQ.W2a&%J u22:Z)ա!Z-$aͺ t :4e#XG'jqZX?{D`.*OaG+ i" wJ Y<.۶)8CؖUҔ8͹y|p6 Uh5RõL.Z(*ͅTS)A L f| SHBk 0:1B9QcY.N6ȲɃ,[<+CC 8Q*^,m (6{>Q$MK6yc1DfͅyFFh@뷉<ˈ H8T ab8S>y&h?_V?= +z>Sw`l'@ٽ8VשPL=pAO;뚔e(iH-aHբ>s(-T*(GcZ>01lIP.W0#GVp !Y,u'◾T_-v>@/c/r䑛ٳg7ZOڵp0448W]Q>hN9֮;0K.a|W'f۱'rgW?a _^~ky/欳c>E]WUWس\kIyS*BBdZE)-TcْnP,zXh6}l;R$qݻuBciwxh5SD!CrԋE2Ҙ$wMuK|An}%c˥d _՜a $iD5Ji&&&صwnط{mnjz{-`BjZcZn 5wy'~<ϋ R|[a߾}ر~~S>'̟~C_%_~9Ž^sI'/~v|;7޸4K8,&,s u>809˞{g6x衇8S%giYqM7-|8nò,nrp2Гkp pŠɐII)q[Cn]Li ieQ)i>qcZ#rRrdYFP:'E0 2s,0sI:Wt=,)@ڒ4˰܄[BnOVeDMJ£^K5%[bMxq~ײknN>tX?q$׍qmܳ/—m[63yXms҉'#R zzoq_<0ypVM4B2mzʩϗlN<N= *a3Σs$<۶m5{3̑gzt!SL1;m,#Z*A8ա\]4{s|7h$mzFfsKK5`GIbMZ#} ^YUxVm 9jca'm$\# ~'zx 6.I4\ф,e(7]L'Y {щMKRV70y N!G_Hm#ujn% ׫K _4ġ߰j՗9di@$+_ ,᧯|@~HӔqߍ&_rCg%\~J%?|&gq"+V硇cúM,0 PRwyeo#@HJVm5ر_z)[mln7?+^JjQRZ-Z4ƻȟ]U3eG߁eBZǶ}Cq:PAkiJ+R)|h7Hvxlp3SO}/HZ|-44{>uqf4<;@C?\ZhwY MBBZilRRTQ"J b C`#&N䰐9J V-8Xa?$R Cy6&>JgOct#y:%.:W9ȓ{?䓷r7n樣R}qu+iM+~ lX{պ`c{J|rt:#cd 3aHZ%U}&R$P,EF|vKѠT:4m~cR.)JLM}Wt0K&[~/;&a~#Rۡ12L/~zTq1gw.xuk7kϽ9l>X QNY6sǝ7lbv 䉽tJk! IDATN;LZ%hr*a;}RXI Ga6R+zAmUpđ˩ B7pM1==|}@'Rrz/ ;+ךt'W6I@ ٯu&B&LMOdHgI!@Uf˪Ajn3/xvʋ G$ I U2==JQ }8RTDF~*LMgjratN*2n!|TU%J53%+RJt]'AJe "a* i Q9sYЋxi$IByIDT{>]]]l߽¼ 8q̡aO嘦MrIkCfE(H_b6A P4 EQaXz9yarFQt(! C2 I't]' Q58 SJãVͷA DbqNM]x &-9<Ğ b;5,]ƞݻ(MNQhIacc%ryAƨJRvaJ%҆WOS.BF )Oɵdm[n1O ,A TUTݞi쑱tKXbIrw :j#9Fsq.QPkLb)kر /\py/` 9Z9˸x̔z…GTN<>x_|?m4_Ţ`lذ;9M$i`7U+?=$Ikf\Et]cמ}[o .P(bŊ`WbG?1?,"ꫯ:ks;Oݿկ~~s>uikkerQHb5dEҷq~H3ȺYTU%#4-)ߚi*$U%mj8f x6Go =|\) owH(JmK#LS/WJ.Q|N[K':R!XSw-ЌI)EP D!I|8@lna,pD/M1- UUqLݭcz!E(J Og[;O\=|tq"}}81MpšS&<&ȵt!RM$ LUdJ(A\%W Nbb_",D#b4K%JTDQHNX 0]U]R,SWE3X]8aA",\O﹉ѳhtmm6cšB{no1+T~L&p]G!S ˴[u084aiV[1U,;7,QwYeКPm&(&(9TjNwO/ݻNv BN4)z.tMBTԜ2N6 Q(Q4MC"Q'):c#LN)ڋ{n];c(g}ϾS>u[x쩛[yz/ miTS.@alh56( eKKcW,5|R8FgYB"B䕉ՄDtv!,?TZa S`D"\jMĘAPpi%4ZYB|Ob$@4*J'yFeaaCXձ4a \)BN\%IUx$R|?&^!(W#"O|o~׾\(ڶ ̓KᓟWps~ꩧLLH,|)^7^C4Kk$>s5yZٴi׹g3iC&cqć>!P.Q|{?kkc2i29UaŜzک%FcnVJ i>2dsY(B? NbtM#QTIiYM1RG*Ih]lzJavB&1SwrV_%TXhBLZVN95"m21uBpw(~#~ ~c׮L`hh2m(E!Ru(Ftqɦ T ҏ&B$V2xuZZ215qeqcp}3IƌU(Jf.$fvDs._LՍDo^MTO# #P 4U mɤØζV2FcهW}Fmo;: SS׾VrρYg77۟tIl޼eskhK^xaoƕW6˵h,g|,Ê}\vpyo/eCwƍgL=%n}x[~]֭[ڵa޼(ZBݽё!E?LwH4BV,=~Ff4([GGW]u'.S_' /, {aǍ踩(sD4\EC-h5OMNsA~= [=xtu<4׿ov.:drĉɏn֜]%0옧6=qkSdY'O:F c Co\VU,:fWk@?ϾB@_ \zC >>8Tԧ{f>x駳}=瞃#=3ski`@#+̀[[ɕun7rwoEQ΍IdǺSֱzj6{]~L\DJŋY@eiDn`phiB!KTTb10Xd ͛i~8'N|gG>WWxi\pۚ qrsC"!qɉ ʕ ;og$ T+Y'thdA Egzĵh6Kd Xʀ$qHqØ r*gaPPf4JSFDز,* eQV) xۨXH?$ hx^@fƇX,b&a a(]ɤj5|'S [`i:b{,Zk֯;7q\'3˾;h( T+3>яpYG<#HbU{50䴓^e]_;ˆL6P!! Y0l6(QM5TMJBtCaQUIAC\\,2st/<EZ΂GDL{]0}3 zxd  1tFI62-m +ZTI~4mPro/< tu{_g dpؘXl=(t{yhƕW^˹k1 ͛7jժ 6ַ}ݳ`ַnF3==>+m SO=ERmm_N:cg'X|K.S筗}^@&SV1m/ϻz\!.{˛ZJ\IXt{/-^P㱧e~HLNӷhR W*H<{];FkMFTlʥk=wbX9(PUDV(ĎKL!S48u<Iy~=j4d^ƞ^a U=o|vAĐHJaHQU4[D#rCzL"IL.P`h`Uǟ(% SC4K!vNE-D$j(MA׻ή,n}5k֡Yx!);T*aT3.FPMϢlIdtD.Q"2;(D&!Tfl; PTZZi.txgD6\ܓ ɤ$1զ(ڂa|aCD~9y?QpkѴI<0sm{6#r,(\_z4MgY'prKcϝOX ?yw+Χ"qL.:^z)\r ,-T116=[Xh!SEN\:z,eނ%^:=}lں3_5ُYv-۶m.9 o{#''&^^LO8S`"*&22T u}JST:'@FˤX9$g\!(/1TØe˗q{>I OVEUQa BL&P={@50-i`(x]WIZ(GSF)L" ܀ @4&K+*'>SbYyOY|_>f 8%K(WqHVeltB\!ɢK908[LCK|FQb!N(.길dR&j~~4RO0s61;6mFW_}5W]u<o|9S1Ԁq9o} }+_[s,mUgK5Z-\}դ-ҭ8ƍysdU|_Lo*]w)' V$ jT+5\S{0Z@_oW{4uMXcБ3OF8x;8G6'CB'Ib(!ͰdQ/+sq'piםÙgcqLUS^TnC`Ɍ# ~yTf6Q5 0TAiAq8q5 fB4]'Ւ Dq`&"p|MW0t_[97ٍmHp Qy_>=K #dzbt_e$zB:+y_蚎SS=dvǢ務l>ӣXFk!8WVںډbMR u B*'\V-S. #ur1I笡qezLT'V%`NXIRb nAS*Jb[&q`㣘!B?I6\ "J9 wV$ӓh@&i8梩*Lf~M%DcϾ;_mN;Pl\}ǑsM&t!!GMFl~;I1gv=CL#c>gBvHI6A?Oxazq200@$6H*mo!],^r4aI\dzz!VO'r6q,"c(-QHb@CCR p<UqL(JP8!_36>N2lNa D$"t]ǜ)ǚ5% $DI"| 5?0Ou H [CU5j:E Oٍ ?ט`tt;ZGo87XwUڅ* V#/-(¢el04t;rڙ/FjTЋIg3wuk.jSdreHZ[t!Iy:}$}P `nm =V' #t3"4>B!eV,cdlL:)dri&ټu3e.Qk:~S1-ELMMb&ٖ,HgRQI6*$ɧD^PCʈ|gRtt)$*)+CD#ju3*S# QsRދwc[:>F=N2N/ṁ2{͉,!!Ffry2d,)$B"2Hr&^ *pڜWz yOa{NOOdp),cTw7Oӿ kͼ-o'dll/۶fe?/9M4 +/,__s/7}O|_ xp266Eww7mmml޼64]YkoIqK5/#`ykƇ?= -DSUp9L竔eCײ%Mo-|R:Zj~Ǘ58Qt:Cai DFc3"bM3ݐ5M QxHb =>S&ʀJiYaH qj5,ۚ 8&N>RYbbA60S&Ġ*_# CvlxDaD|;x :Z՟&]6n~|?R~l٣>)x՘TFG$橎jBlQ066F˞ݣXV)Mh ߪ&x~fl%ؖIGg7'V\ӑmbiw\|!??Nmd! - tm0&m(߯VbX~ƇLjZR6Q4 YX!ZF&4u*Մt*8]LLM`,RZFR.>H(UZZӴU ߤ{aT-FM:U$cZfD9ruئfTFX1V>@!%Q$/*v$P,%g-FH9vEN(x ](э9+GW{5$Ŧa8P(UQ3$YJ* 8On -[`vtfpHkz`'p;p+*LLLRĝw?>Kln5 |'xe`dt/yRiX4)((d3*a/!Qm۶qWm۶**foa`G&m9!1mҶ}sM&~}! t Uh<|(JTJ{!S6;3~OISU?q#&# s}AuRmfѕ y>șg 4/Pq$Z^s Ð(pU8QPȤҘiyaECMR,mmXM}JT.}?FW5Rv TIC= l駫+K&aU&Hi طkyYT-@j,a,B l/{Bš)eP)s*tp!YˤR뎧U82k jH\ ;TN+}JYgN}Iݥ:XŠx҉9A*W-3ZNy),ƫxhϨ?N+WǫDnBqDZc~$HF&)](DupM֗G[Y,bRL.--S9O0^ ՅjepE^y)fTSE X6:SM2&׽1l*X)b)HPfF.I ^6B4y8D\ B0 [6nDo %!A@$nXDQ͝Ƒr7|3]wW_}5<\!lbWCÓO<ģIy>՚3K.nOQ5RpL(V{.SGPj:aۿ3H6%g<@4avj (j,">n᭼e3{ѻ i8͛FY=;!&&́},>y= /2<97MTU-sbRY]S KeLQ'I뺎K[{[~ZAE(/1===nòl,$!#У5J[B/ǭ\`Zpi<)F:F5 Qbd$)K2) =J)_RDmD,XݻwI;p%]1ngxpS7twu151ARgu$H̴FH?ᮟ Wq .D(UbH$dŒUl|9ϒjIp-*DRvq)$S$Iۺ%0F&1iҕf])JcDGMz. mf;2PXOdE&R{izw m[P$qQQr<3 Vz2-D|;OV*SsN}aY,!SXҩ,]eI薅e躆QCw&+ug@׿;Җl>OT34q n=j?eTH=($IO~'HMJiN ?_(lA4͟A,]]$ƅh˲@ Z[3ĉP|z;bL>4&'U0 Pg~cV\I\/::Ve#Bq.OǮ{͊+9nI._72TB%1!K/Ž\MD.E!x쩻1tÐ&Q*džHd6:AKvA0 g4bu||t*mڍnCaxضIeDALw԰s_&r'" ڋI8LB~[$МOIvM /aYO/mGmJ !C4M4˯^TvrͿ'*_p#K, p6x-[4`Bq; Nq׿7k|sɚ5 xgio椵'a6irI'$ _r߽o`rv ~⽟d6&~H K( ArihBx2,=ZQ4|C ?t8utC#( f %T-b_q8`rN=>4砫uy))dY It]'|ia@Eaa H:AAvƊC8gRis``־Wr,xO"#ZVdsyl#K!F4Iͫ.6I -\),cST= SJ%0T=*CKQ ֶjxͅcgc*ixx'hh̥oG4j:+(t2$RsIgE  EϠN^wS)R0jIi*SSQ1QDT"#QMTz)*ut:)t,]E8PJRڻ TkSdBd2L$C\ߧR31u\?F!Ac&f#Aːt6[nd|08Z$:;gITFAQ Uq%o:."2lz-qѰ=1]}=A++H҂"|2JaY4 2ٻ?<ҹ NPeɪd3L&EWB.OHyjĩ&fao? *V=.o)nXF5,$!= y(&N@5ٶ>w7̦- $$s~w((B,q"D@╉яS{.rynE(R5z}xgURr=ѝ4ߜN?shu뚿+O=;v`߾ dLNN8B4mv% ѻp)+VS&DXK%DQn\QIzy^8 b: ضA{g7Ql֙u4*aōn*b<ԉ6E78qW֛a0y;"N# ClaBX)@4Abt*P5J$Sx^8븤aQmFr9jSWk_}+Fnc̓%;2n޼{JUZJ%yl`1cOG0D4 0 &i"Li8`0M# YT{խ[ٿyJ6 ύs[7U)sj긓çjScEھ <L@H ^$Vʴ- 0a&20%4+MkmPtYZ4q譯@h(QoPSTO0D,/_H%ڍ1,4,qϝo知2XL,rh%qF* ~ι˗9xA\#Ns C )nHi&1)u<|;%wU*5fc>G|=gBpQY[[{q瑦B Wv%nx4ͭߐ|Xůh4ԧ>ŗe>/}ir't@&`n2#~|$ׯ-GCر(!"}wdޝ,_BFƴKfxR9av&Y2D6_g_%ߐ|ܘֹ(= G#r"MH.Ǝ;E .z¥6UrLF ۳8R)&:mv,.ȒrB޶p-9B$QpAPrA}jQ"RQL4TaKsYQ P:ȫY:^*4I:B:KKwslTM\!~Rx!ZR1az|#K8u '0==MFlvgw?<|| 9yxGןWýur~I{>O3?3 vI\~J29d } &U/,/7W!cע^A}IA4E/1;[qMڝ s4m($F9"/>N"Wa(fccPItJ_o *,0L 񭓏-QDZ,{ki3I !+Xh4ZPkXAEŸo49K66t\,Ȳ v)vY]ms3Ll5\3lwZ(4ZH"\ R.̠D9g* ۵Xi- Sb&I_l7wtV/!sIaX^b( [L{fIJ\g3 JE!gS=(AJdbЍHcM˴gmP>My)S\倉֛3JS DqLg(ٱoyaXT״ٶ˗3j0K=LKc۠ZaJ,[qyTH#ǐI k/ӘJ4Daõ0\6a9y1V᚛k03$w0UGFV !77#qOk@"Ǹnn{E ܹsU IDAT/Mv(nؼcW+fQ :;)n<9z(;w"bBI`>ڀ?R˷KPa$)0q20{\9$܋0h5Q (M%k\]Y+,"ͦ[7-^uӯQ2.^\n8H)=ܩVL5(QqQ2]d\]LӘ,OZg\cQ0tNrp}"g_$:o֘=S۳dqir0졽+MZ b;߷J)6",JDQo@cΥSWQ9jiƌ&ع *͍6ʐa@cnӲQ)K QX%3OTLpJ.LfXth-rgY>Ϝ|{nWB] 'P&+2 ctI+wi]pK&L6,pפ<#6PD\#Szx4rRCaaocW F%R gHs(A}IPeԪ>Vhх@cWQ܈}Lyh=% ^SeT°ۤ(R,Ab>?(|u].gyuΝ;yg)J;^sߎyum>Jb2p *KK|ȑ#|I!F;wvy~:gΜҥKAD«; 2|ϸv9·ikԫeb:K>Gn9H8qAϡ.Y:͵+h7ױ6kMmc;QHdģa{KyuvCπE©3'9{#CJ&c Q`y0M06Ȃ9XuxmؖivA% h^~},.a3#3{(3l\L}Gy'-輠\`f~wVkR85Zn=tL\%\#J"r ˶c\:ЂfIcajsaK29n ?p)TA5h *%-<"W"¥ XDPT M4$81={Zm3;=Omnha/喽\t,G#rr|m ێGGl" 2M8)r c84< iJ`L$4]<ǴL*UҶ& Fͫ L'E Ǫ2=A48^x|Ϝ~Xqo9>E6Oqt{߷QIBFi 2o</ô$*piyG $I>7M~w=ڵk_˯9fuu]\K-q P; ]WW~ػw8-k ǨT*;wfi6޽G"8! 2|gRsKEwMհ-,1%?Am(aisʹvNC( FQH ! 875t۶h9$׭r;ٽV.^>K/a&(ƁIqLZEHAe|0eidi/Й (4ه7c:[vN{Q2mK{k+\>"B ,I2<)j^XCZ3hU08֘hi9i. $G7X:@پc7VJâ\.aSب\,d#kmvۅ4AӐ HС+ebs~4 :m!Q*k.Y<:MnIt1LKmYNÒd* 2n<+plJJQdz- C% I`Y֘\>M!g#`YRZm(J J5L}Vׯa:mwdu(s,;QiQXX`r"n M7~;V\Aa~~__%cvO?ͯگSrvnI)1 &g/Ca]\u]$yݸv|( ~i:Ǐg8 /p$ᥗ^ĉ8qY}Y~gvr'dB@&`B>Ф:_".^GiMRZXJe2N?ql7Z (13G;@DVaPM~P d]$9ž!11vJ^mNw 䕷B椹I)jӂG"AɝCEaSpHZE iHLC'Ҭ2M<K[ XV0Q0m,&9NHZ ?i򵇿~8Szafoa4TSw ןAG E"Fu !0]hIiG1" }Z&n L2RҞR)WQE?+p|(JbȔ$k”3RX%H_bH015e"jSnOkdT^{,c&Y;$\VF)$jDG`IoLLc;EyeVW1Ǚ  &UכA $r|Q\$}<)%q&iEQPשq8E(6ZN@wҌ P*ǔN~aH45261iI> 28z+뗐` a`6EQBP]l2LΈR qRp00 <&ǧHs$#2\ٷoO}QX|dضp@4ci:y1-Qb%*E3]OoT*H/Hi Ӵ0iID ^;n˝8KFB}'nFůT)50>ou?/7R *FCn D' !MAEDGͳ;,-mccm^h4@!4e)4y#M-! bB?ޱȟn9j/V ?/^dzzqsE7h}sر0ؿ?_Wh,--qqx^VWWi6Z QLfh"v0Փw'1 ^멠Xx9 8{9|0ju NMI eTkUlB#6Mz0g1^^Et=7㏓Jf9tR#,-mTR"KrAaަ5̿|#Ub\׉m_`ueJe71Rr](HI(ZcYcv)ˤYa$yzVRDPQ*`>Ks/}QvKWx%[Wy`vvv\QYWL7(U}}^8^rE(!zY__ųM $RjrH(;TSaBma'@ڰ)` D1JҌFCt$)%Du$\ }:Z'%gBG9P0;3k"MPrpӧo.ԧ^OPwq=U {n# Cazz{] &w` ^& s>q׏|r64%ìxxaYäT.#R$bܱ^Ze߿oaaq\Q*YB+LӥH!@ MFm$NߝiI S!se KiT /SK!21ͱ\+H(!IRL@ؕ뺤qN Lv,L hK/DC,.,e$% GX9P d?lU.&;Ç?R^;3 G8|0d|',//3)yNeZ-8fnnyΞ=ˏȏr!L"x≛ʄ'NKL0VR*,Iz # ULӥ(壄F9-5N±q}m]ǿM KK #$Gen28E+2UPT*4Mdn,1WO9sIdmyؒMkZY6EPq=`D M3 r* A)Qˡo{9r+Wlڃ(%$ca+ vg4yID󮇾GXvN4Caڂ([bzp87RT@ȄJhI%pLClx .^5 8!J($1S* ;9zjyV4ϨVf8F!RJqlu$Fΐt- 0W"K!M dLJb <+ JC:W7ȓ?f!W)Rx)cSv7qn k_333c1шpeYJ%IPT0 9|C͟{d } &x15AiUaHT^6gbp4V0,*9&y(e' #4fvm4qrt} is>&\ci^Be K}β\(ﲴm+5Q! M9v[BaaQ *mEEr,Z6BM")*\8ۦ\y8iG)>lsenmr4˙XYY&M\gvfiz;|2W)B"]ma,_ʨa6aڳ$ Q(쿝>]c YЁ[`Q ؘaXaDZ`XZ 4[\ hwZ$iF!%B ~"SBضGQL5# @Pxq ^>ϐeiRT<!O>$ x"~Z, Ep8[oe ~xl &d &&"BF1 AHvQixJWj7y~Oعk;ISO©t=^:sy ^x͎B` CQ$h㓜*/0 P*xYu: iI692ܹsa0PE4͝CJȊaG(Nx{!>fr"rn=v+{s\VQ݉i8 O>2_Ep]{jC=;p8$/g.]xG$Z- رcM`B@&`$ǛRbZln3Ʋrre+MsgqS -_tMڣ&ZKň$a/q_'720D^HeD'ZCd9SffnD h.cM3=<P1# )9wYW"fHm`(bra{ ٲs};wON/}oFD  De,ɮrreH(1M&a }Aat6$0B*$J:)zI 4W`Ѝ fXYXgաXT۠Rb QDh+~ α z}nmpsy( sCMF!+:!!ӝ&'wp9jDG%|accl"1qrr~ *2AH Vqw4HD }npqiHug{*) L@)B#BwDb`&SS?|<-FsYn̟G]K&_򗙙o}+Ba&GevvJBE2=,ˢT*122>O|z  1$ C 1ě H)1M˴H!-׶P,LSu|ꓟ@km(r.cc%I0s8+BEgQȗXmw4.~4ET92:xE`r֊RHrXB'`X\eüڋ2 4jlmz>RR-cU>JqԒ{vmAH8l.I3t qK>F@ش F>[ǴM*9 ,vH&6p7bwcY{]*&ZXXXHS 04͈ﷄe/T*o^؍LL<܎]l۳鹝,7JUqP vg>t]N<*RJNZHPRZO}cu cXbH@b75 D!M 0l"/7( 8o|3NÇ1=aHKll."N`:x"(ITGh1'QJ͒H7`e ;wR.tQBR`ƖIqL467cmm\#IS("g:)hw:DΟ' xv(DQ kACcL8ƲA%[\7υҒ"q7I"7JFq!|^{8v\|[auw|!b!"!7'c+uYh!1ItlI^sm^{~bzz4a9TJu{1? O>6Ff8y"IUL{5ǎ;  YۉPUS4!I|ߣRny'Vc'(aR,l6xMĘҠc###a UVrIlk qp[ٿA$Rqca{vp|u:m4auy;D(bmy&0Rյu4qh?K\viJ0BhNKP%  <&l+G43]aTBh H[Kj&q̠@ aIX#A(q˦0\EGicUb3@)#c#;-8 ISMci *XB6B| ` )"8ŲLrJ8V]4 6ŒD)FvT1mE(s{(bYyM $u*"?lV &A%KΪ#_㧘ܾ\J H&kˬSn,ay SH{rcII rwn#C$D ʨS !PJJYX"Qv;v |{1>Oq* 1$ C 14Dl}Y _(`XbiyF:k+tZMO/IEK|R˻X*'c^ēЊ"?~Ȗ|DP*I* BEB=?¥Ky#$q$ -~H\4%J[i0MŴ4ȱo!MW.]e4 ;-fw(iXZY&hT%7ZA(V] M'$= :Q#;\|Zu GGƱmU&IUz>^)IQ*Q)WY^NP|&Ʒ2ϓKO%؞Et &A?nDN\1ITԤk]R "q/&k.^;C\a*JTGtMKoMwCɉ:F Xͮpy$0Z]mgۤ{1R4"ze|~;|nò #KڸU@;N@sې)Z[qZ" 61R<~䊰" #@(EIlo9b)AfD i  :#BgW- N[7ǐcllߤZ255޽{ Ð;vO|~bH@b q}hzk/MCRr=1,c Hu`U_чcnP)_H}?8Iܵ0laxD1,V M>8r " O?Z`._4_ع{Ņ&N*6"1II 0%{q>jyA( qSY_[C\ED=$DBh$!Ik1)6Uv Ӱi4 Dq@ky\ o1=7mXtZ*,/,nH“gu8wѠIZo{Ӭmd63k@JyaemX||0!4gBCKخbfb~-HKG.m;!밾v29tTʇxP.즔߅)+%8WyZߩI¶B@ʋ$(2׫Ԙٹ8Ƕ*ݪZJ@JTk6b!b!~" + \\.)R*8<7/nn2hsϲ,nΣRarNϾGȕ4{u"%%5H˴15izr?vel $a'Ĕ.azy! ST$@䩔 aJwciB!,"Fw( Khb\F t[v0 Hm~eX<~KZT'= '2} 9Fx^NC.CIPIePZlP)U(*]kl8f|+7&Cj1a V#$ }z6ˋK#ƱIѫ1 ,X%ꣳ2xI2ή=PZٿqF́dj0pAܡX)WJ!#Wٷ1rŘcx#bUAAaf*& %!ƪ>Q"Mll|7+mw[c.V\U6c9QU^>GHʥ2im\ qr+'f 1%²Qd` adN?G  RxGPP>ě_~#<2pDI ?̩|r$:oc&ZYDI>E0>>ӧqM Pc.a8.\E#5r(뛫]<1 âFXK*"I25)t,d_SiYo]?Tv+/OǸ!V\_Ȟr*{vE2o|Ņ ?wџ/0:XEa:󯑒29 6uǴxؗ)lx 9('ϼN}¹ÒT;XH#Db!BTh-@ KwJMc|j sq9+mK\}VX\Z"ISڷw4>ҍeLOa|f@(E631$ C 1_ʐ 1_i|citBEA I;RPRݎ zS4BȔDD&jp<Ð89(iv)(l~ ?WE |E*m+1}<)G9q<{AE1k70g~;gll"E,IAb6AORMy *URaBn'1 $AF NrΉ7C9qw:Z6H4,A )&~m3G*!C2鉽D"pPJS&G\ݯ rwBMj6($* #&cy &&ܸ~'O 4q=! z2! %FF,--026B(FtrF'sy : 1C2 3.?{C2VH5(kK:L}cOճ31QR-z_ÖŠ2Ki$Cv6i],5lCHxHz=<ٳ\8uj;)K؎4 cM;X}(dR XqĎK S&(!~lzWIDF]IEAHii IDAT# CҸe80:c4L}ApBG!y/0n rq6V)96h؎A-Sg(&9w[t%iZ>nɠlQtP!*2lSpFI9yC`jrrXXV |c,X}۱0,8ryi-ITa l\T$aǴ2V izMKr"qwiz+lrrI|ihnwMض_YHͬ-{>IpA'M q-]&#fxk$R!|4*< _$RRtԪ5m&i(R3\׊99Õ9:IL$bKv))IAHL`a~Ç? r!zl߶ ӴQ*REhS<Pt~NG3`gēO+W9yEfg' M4NXo#Kg _W(kD*VV>A;αq%ץm1i#0"Eiu;Cݲ^sDea}@q w[c~ؠDRV{ 7{>*:~QΞ=R,+Vccc E\ףlbAru~S'Nl}zZe-[6!. CvWK6ݜCLz-6ʠ`$lt6BebSzN^hIs_){ cfHZ0Az4ϼȅ2hoD9uI$|{=4 #8@\F l!ŭ&i˄搦 69KcBHNՏ5mzj Q4T*WOӼ U? l)ﲲr: HsC6Z\8}Q 3f`dxRK8R* 2Iva M b:m@1x{8/z׸t;w'%ڳLOԘrolQ',,SW e/|RW-=(msp2G=4Z7x{>o{|w?'>2 Nt>I)r :_}woYvz ~.^mt-"c$RtuDR {ڨ#,|@hN=(B4s9fgvQL&J4-XW9r0O]\k'Iܙ n02Rk`Z111,k477Hf5rbl,r \8uA s(b!?` 5 xgrɀ);} L RBl ),GBM`Y4VnM NF6#KLMZ `aynBH +\o(0o}NA&u M͈atT 6VrW.ScsزDulׂu{ib6Il ҌHebdԖXr1M{W?_ u,/v$ R/\h6ZH0ZR봚TFj<9n˻tcH$xEE@ lh0MIPfv,ΞU]S{3e$7}nt\eq?uW 2`Q~lvn?R¯g"}[V~#LU 96g?_! njW^ vc*q?9Zܤulq|qOdHӴIc*ˈQBK>Jw8B0FS콂.c6$IH=iL:4>J-jYjHFH#ꕒ%WxWhwZwFT*tQIϳB\D'1" ڿ1O:ns^SrsaIUBQF e%R2HyoVzbKe#C%or- [s rbnnB\[{XeX뜧|OP9\/}رϡ5l}S*ԈZjYA u3cf|J?FY1D0:#ٿ?WZ!Ab>%g.qyի>VǎsAb! r9\q])$I" WZ,FT|AzJ:~I@ɠܸ̠DUfvҴ(WkHa)]5[̌)mZC cTF!IA4eiy۰2O*^:G3^8A!, *D"̔A$Z6&Qcvhc dLT4cStc bz!Ibƍ1^QB/=?t._R}QL8.|m{Ugx?TJ9ϟyl+X^ug/?7Q9FJq™gxٽ{7*nRV)=cg_Ev ׾*c3۱c]hcY򯔯p=qT̔t?\$+ii4$iIA7VKsO1__@Kzm,\d8N-l8łйZR*ٽvV'rewAMM3>=Gγ>K$x_,#M 2llD{| qul۾u\LcLG~y.^</x&N8׮mVpsQfyiX;Rb'"4)mLpW 9 $IX% [Ylyv.iln`;)`$ lBjA$"&UYwD!խzE$㚊! ehN~i}G93m7/?%_9Ah3fŴ :hӐNB f9oU$$*S,R^~=LV|/Cry&0+ېruI4 R̤(0d6a\oyJzSGN*qU_XKNH- (osk8^"4mG^A (W+owqm,-_%J+Rq2 FinZ8;jy)-RK9y8i.^H -Jhv볶YliKdDHHQTj?,mjk9QIԏ)! M[Qg< G@kMZ-/p)BؖI6!b3:‘Gi5TjJp "-u!oCd$qaY6^~6ӲHC d ' 8(%=G6qt+CH J)(v?;#l!IQ!W&L {{Z$b Nȯ?~C<3[8q vbčx}ڿ70t 0x) e>~C s9Z\)cje\% {\npC#9* M:&RH ˋH)4 rB2vX^Y`Ǯ-N# < D+eX>Z4Mm| ʢu&28$J:涣6ãZM2Y\^EKB_jyb>6΁%+MFF7SټyمyF6XX=EIK Ƅ|\[p~5b̕RyrkE, bEl,DTu*;pF&z+᝗ZK %HIlNA8ip#~eΜ>Md}QH=[`ߞJY>Obip,&98 ,BG=Wj<8wubֆg%Eby;=P+/څR Ivuwcුa4$gl)6(f+0kb>;MI=Pb,ֽZv- DREa̼dzL[3/6؃gX11̟^ nߪP}2cF ob =ZPH)V6n,_yh7s4K_; yy^>$Ь }H-Bn(qfB7&YkUW 7" Cl!0& 5y &ʱJYضM@JpvR@* QS# " ~nNۗ",PiWqlK)\C6mbr F74agcwَi^CHA]Gv,V"|VS&eg#MQ ;8 \[d)* q s s ,.,͛i 4Ͽt[F8-isI㊌d\ksk_7a#`b޽yt JqQDAރWǷh4iڠ8atm7o2>4m }^>|Ν;:^?*)σ`!pL`#=@kl(³$+|;Z[b8ɷRS={KO |Db)hHaȻ!:FVٜX/!儤mh#cr Sd?|86xef3+C3oJF<8 :6'*3'xOb?1~OGQ:fe[䷌ҷuV4*ٵ1)#V4NȚH-(|?v,Z'N`afWf1?7O:!"Li%ǰnFΜ9I>׏*Q!vQVҭ ZؒQfÈNIqɤ. |R4"ԫ- V2OиL6$v{V}UR- BL&E+na{}qaLLO& l߷~/e,,ͥ,@x;UZ6|':͇>|gu(=|S&BىeNDoF<%Fk&m#:uI%VBWƨ,tфߚ˓$^FcKkkyhH<Z -ʿa/rb6M;𩷖_all8Zd- 顇~H倎|_Glױit<7lBZ(K˟EK뇾߼8|衍D`RLCZMLX@  %v1ԐNyN/fxlsIVaqT;*|r Ucş:'>qvӛw~04+-2}Y o10<@qpڡҙgiq(|Kf?|b['d`DE %-,p'edy ұ_v:׺B,"|qQqO|q:yTHVfۙ@,#"a14RSMƀmeim>}t6 #N-PНK Ul;@6)'G8O< ,ZP']hbR@ -Ʋ&@),;E+h08MWeH^z=XTD%cg ?c{A0b!1nlrh<0R&9 QwN_o~+84aj-bp|3S^3SC" H-p`"p}_ݴY`HGZN[n;mjjL?0APG0 p,*~G^abssO3T̾=w`~Ʋ$HC#7/J~f=. ,J~{ _6K+ LllnI=mR46ȧTqj AoͺDG`~Eǹp4,'F fȤ )Z*^?Q$\*RuBY&ʸWXYٴe3""IS*4Srm!"E3P,pZH6ST9y#'~W>6K&Li\r~"?bphV51Q۶&^P][F0W#ov Fboi2i>Osibr!DkY!R\9"t'?)?~o~7A>7~A6Mz=CvENZ!LT—03g!8D=CF ibQ-c /q -spωbw.]ucjքALe[j VG9qXB,DWkbO?'$kly<^QCqt|#Ã[,kp8FGK< ҹk.L_ϴEY"F #8Vry陓H`f gR^!fp A_i{x;ߵnPҨ-1?wJXvBՕ 2=Ia0M"T#!gDGY/u)WV\6,lk}%$KF5s=.jzBio!qELX?s1#|x"hrmILDWnC%c@ X!-dj~kqg/I=zma\bJIyꛏ2uqN=WdH=lPmk" C6q:ǶU;Ђ+Ξ bִ3ӂSKi/8v Ol,,QXhiGY;|pY%nSnƱ|vɴ^+Xz6)ʶ-xzw226#.0>:N\g|ѡQe2 F;c02ZTg^xZ}J̾pϝÏxcoVo Gcͱ3002hDu}8c}paX9I5m)H6k#=i(ia&a wǾaz zn\b"tOGʙE)lfTht g1ʙ]) xaT&k,y)g$>A6&0D,KF~)OpīDm( N8([PҩdU3SLp7d H[&Mkf ԃ\kkdak-  @ū<BDyHAW6K3DdlQwm(*ualm;T=pUa$0sO|VRHⱖ66܏={X5-U)Wx\N>oD KMs+)9[ӵ!M2Fc!%7u+ܻ,X?}z\+{4pK|{vg0nath3xcbRfjjt0uW_Cԩy&'R:zV'?o} :v߼2߇H]jcM*bps,Ze*}kX¢Ҏ,TS?jSHE!z ,A&'4Z  m)צQ,)-(`eB(_~1QSԫ5H~ Gd}/q'Jic_'i37Q%~rCN"V&Yqѱw&:ǹSsd % R(%PM*\s4[FFF5 |'\܊+v>vW!²2fmLa) 8&6DC'f,wcTD$A:@v7)Ծ CMV_4|/0{([$hUDya8J/ H/ (:*s&#ݖS񣐕V )uj>;˻jSqԚDD)[c{2D_t>k~>ȶx+Ll9/<\u FL!G0@ݡ\ Qhsu7񵇾%ĩđ[a Ema8XVٔWW&۸) QѬTV\˲C<~uLipB_zDzSԛ23 yWLO(w;'40K&"-oml/!a e+6F1~c}ܰ1 P_X\sx8t&fȥ9|b);9mS(7jX,.H<׸i8 q JDyEaVw:.\'hԚ</iyAS,Z&۟‰\ 1w4 iCcKݳiZYĊ@גF#l0AK94m:N ˶h -h[u"h4Hj&#I'OF,^ط7XOAPBM*׬w굎+:4[5i1^Vx^ hw/E[1Z UW|qOHAB nGb?2 NĴmF]w;`Isaq7p>MudLx{WK __ZdFhlal۶{eHqdمYRr%bu/gnhMaa+,Vȏ&71{7< UmlNeMRiI.SB똥Y O:-qbЗZ!6JEHap(yj 1O4r5y)bKƸB \Af|JX`2-7@dc(5D" b\%Ut=AAm 5Tr Al y y)A'C!?~^a2"0,//cG204`vAmzjm;,ٹt6Fg͆ƶ!·Uճ$.JW)͆Rn>t΢Tq t!Jg)!z6([ -M$Y_BF[euB:Z% c &wˆFsٺuzcx4vi)6lfyiVe) JeqU[G,-^ȉ'2uP$>k 'ȉOD#h),[^gۖK<֮PS7Oׯ5)Z1h|af8dFC?@^ !I)/% 7&d: *)q @aZ5L1zm)a!mX[`4Rj"_ǿMVWc{SPJ+yd?uln1L#Maxd( Y^ZA`qVK$^ B*-'1!B!Ē %J,$PehY^ZXnkRz衇Mu(){ԷPAFR.QFzxO!NyD)5I}chJ3op ?,Wq"m{n`+^HqnNlDF037 |!~ނ}?%hX^Yf7~- 2Q~LFX%VSUHTtT ;gF_<|&_8Ėq@E[.7KWX ,ab2 M, :Q/g~)@tz=XR%OH?)!\u4Jֿ_?Yĭc/i\G9R I@|>s?#/D*s KKq =Fm)1( kAvh#?,^8Iyyᱝ~:W=.=ûm ˲;{LO0+䊵~W$z; =?PգT L̵FkŎbOϰ"ԥ!;Ji6AI~~#_o۱C'Tc4JYhc^܌c9tʱÀQLC0u[XQ C8*diq aۊ9=DK\2uWL#нp̆8m$-(-['`,+$#K hm!Q".i4e׫q@dLc"ՕUB?x#F <7Ksmjv3V_ѬFhBA921_^7}\+YgM7NӏWt(3M,EʆNpͷR').}}%lՏf=c=岬qzӝJ[w=[p_=B{u{!LN(ryK%0Qi7YXahTʯrsYH+NRm%Bx T=冽80}(KҵM!체[q%X\yx_E. ^*6 %mt{oO:ebJ}㷞cpTfw:`;m'9DWIg"m07X' $go,$B6G%9v,w뢞tꡇ",:"PX9_y{C?y>){]M]  w={l׏e՝6VRHбijbn^7x nziӫv{זLײ]/F8>XaenW~~ _]brsss\JzIuDaFtZupv_yk!of{r,C4O޽i >LJ(78 2Ji(@Kzr}8͉SQ13ssv m:Bߣkւfߡwd2Dqw8WA"w FX(#=𮬵qI$/^[&Ne%Y?k𞄣$ 'f9:- >g37];jtw;qW+CǶg/ ıƏ-swd(1;ă]#M㸛 /"% a~Ⱥ.r9p _yr}`0`vfB Ay2?wlfX( ZyxYt٨AW/' R 8yNym*Pv3(lVVq؄ĄHhuLR8"ח[ip] (a#(ȈXK41JE 1 􏲴z SGRi l,ۣZ$]GN5*^CmJB!;H;(!%Tds"tъQZ2rR\mw}~,ka;i(BJZvoplZWeߏVw*ir(Fb޸7S5ؿw??,k32:DPJ^ΦdqaB~f7djfEo!&leN|ضev羚o m˞輇ޥF Xb1sO|EIj`vI~ޓ, t玱6ç5B 7X^a@V3 {_L# Jh31/27 SOŸ}w;#^G&;RJ1$].L/?ɣ/RK? Y' 9N=f [oce̙3gh6[[em[Z^r;زK$,钱5@+Fgq%1Flj%˲wMlNFaxM- Zc;oPY)cG 'i6I0\K@VEĀq+x LBT'Kv3t +T* |]&[ie)1u myđEAl@cK \k+L:%¶ m,Q0Zy>kE[L*֌P;w`O71Fı( #$CFur]div |?G0`b/eSհ,bNG)M.Q^]$0Tzȷ6V6 N`lĎ <38H ͆顇V u1kO? [Ha4;C'eZp# =(fC6ErZfGi-T+od;1•;bsE~c6>p"Wc7-7/)?/"("JyODw0s1;Ƙt4O2F抨-<|>FưG)0U](/.02Tu]M7hnerT%3ӛɦF)wxsƬ H[6&SuV,ʸa?rE,{?셣Vۄ*V:F[Ac[gg:gq,a(Hs\vEj n&l BG8UM4ãD:&4ڷp[mRZc-ydu%̪ګzFwcm,J; nCZ Y3,*4Y!ٚ=tf–MIƒEY )p B[轫k_r˽wx/kj$UٙY/߻||ͱs|R(+"BV4 JyHgB) [#VUđq<\wvGsw$Y R sfϮ2f&pL:h6uerN a`^o203ւ4"q}@#@ mtᩐH$swo'Sx$xgZv!`h 6ʑDQr8ā!g4hɗJR !%s %;O\.`r_L1Oo;xL6B ꁏ^*6zfLtS]D('A⨃I!PpE$?@зabg?gN =od> `߄nP78G=~@: /9Vy2=%b36VX4"!<ϣHhK8 !d^#,,%>BH6BKK~"h]:%h6xKd|ߧRfnzjuKSO%6M'fG<M=UMS() NHuJަ\˔)fws`KM4sIbiw;&G^Xz@D̅ \mL]ϠdRAH2u "bC'v_]_iHУoy bO=/~95}ܺZFyuyṧ_}LOB2KW,]\@8R)W3; O~ Xu2y˝پs/2}nn&KLlF' ޱQk-sL؉p<)67BnRLR,?!Rftf$buIpi75Rku 99dtZ} a(&mTfvf׷:P,0008,/1Uڋd2YZk cfXaܙdYlBKfyrf0 d39jIgʑf}BG(G:.h,\Y$9sGq>{W?\`LR`ӧ?8qm_B#Vvŏի=#^Rehχxcpk-hA,,81˵"]*ӓ<;O-\8+D.;*+MO}g; $Y>Qq [k*RjZ\8q.]ѣG>t)KS/P(#evv/};fyyl&϶={0p?3e>;n74g.TG9wb /p?atlF3X*l07&BTkmoXD:.DB`Lqq;W}O癙{v >90`TenlYnXYai#ɲ\@ B:iDST&H:/QY!6C17A Hap3+dBeeu(r-mPDcu9;Hm8H7& JfV;]+PyX; ᅪy"l6@cZ1cA8s49<:gzl6FT*%:N\>^9d]E{eS'jUDa]G1#QbEfӐͻX4 zыg?ť8J@jkOs^{uBF&s 嚄JfKKDi U"$fpwmGnxwi CYoR}V~"[ۑQJj 9J}1f111133PCϿ@m{#!&&v U!n?$;vf%|q-9Q*L=npIZAsT)da!U(ؔjLs"MgHR΢8N\-ha(<#oeWp;廏}]X\|GJ b :I &w1332MrkGXѢ^kn1W.y"Hdp`'S(Qk,R,_ZCBGܜ mxҧ"@#U]&.-92A|o“ n"JTL-J o4[/dl吾1Ad\`De贑6d胷g$nh +tB$_9 sKϲg!N|vN@J|>G1qDm18F.{Y7jX$Ǟ:c( xC>%=b!q}$^nش&FIɉ9%cr vcqJɢ'|V3 GuYК<,3X\%j~_ÀXr,J\z={ ":QPי>ϱmrıZ:xΞ:;w gLq4;Mbk2wXn^b]HnBi' 1nH`S[nHLZtjF.kUc,2`FG1=',.NZ%AZ 6fRy'6qm;yq]#9ji1ui;rc"v2u}V E f: Ts@ J+rhky^o Oy~bJmzl @DV%ߏb尳O>DszFҹD:OI&wL;rH!#|ߧjN.K1߇+N IDAT%Fصs/Bkc\GnZ^^ػ/KUC Ce\yg[#rl/(J!u]2|zwy&'w211~Cs׽oEe+8\87݁ ?Q>3?{/@me;Q(T FXfFhWe2нî,v? :B/O>W&[o~'ՁIjz }MImx8y *F!h! RJ K@BawRoͣ|K 2R(2(}3С6 qN_% Zǀss%ы^\0I4!O|+<)3#ѯW2::kuJ;U%hy|m}T| ޹$?usܱ%=37PyHo3np'8ʁGy޽!1dsyVVj ~\%"\PRP\cv45:۶321^BIXV] + bRHX֛o"\ZK_: {v 3YcR&{9to>&Gz8 uE[`֤T(&k5 E%shMԖ:DH|m=DPu'g4p\nȨbBXB/p|J_Tn!]HUF[1ȈH((tR-s c+UkS*gOsyCDQz$b\BiRr<K\DH2Fc K5 =L}eELt2hw(" yY^? Љ<xehZd2Y(__~cdž]i%d|>lkwsdv_1~=1q#9uȻ9rعw/|diΜ^oW+w$.8a}$Zɢ 2Jm ã#NLRDS'O#`Env!kDYH%A 8 aAo<ϣWTF&!R*U`c>$wbzB"$QV*Q3:JHpm.ٱzꍘÔ2#iċOY 6~tZi[vӻUwQ8uQ4(|斚ZaߞٽgP)F/[BH}H;Չl;PbŘdX?.׊U!^~Y|l8Vc Z*i~j,-r o4\ Jb3T*Ef.21>,R9ZML:!b( LL#HZGIw=fffzkW/z*Lg~}sQ.%dPV.uS &}P!Z/r1I6RcSl-TI\>v&o'v9lL+hc|W?eCxXdY"a9Eڝ1J~6:P[F fz(r>)N8gevavdp0*_k,GT : :'9{g.¥YbmoFLBcpL.t! 醾l"%hFD<} K2V(# Z ECw 49w8{Qdx{PVj/2d&c31ZQǿvpCI_"oaB(vzԛ0 F8ـQ]ℵf-b\GY/ :>p$A Ph el sPm03&lgV|ZqR'{6ĭV) r 6?vfy~ -)TXR#/ y8Fye"rޞދ^!)H.~S8ւL94NllZ]t+Vqť wS>pMςk#-+xob$mvF4y-afhpJ) DxkM7ť% a <@e+DqeEJ1ILucؔ>/W/uK{i 5"$6%}OY EĢU522:N&wepx'SHZThx "u\榦8w,##(GHޕȌj,Ha7`a-²vC$-F':W-"F'B;Sq166:syNECm4* Kl{^jRy_OQ&ǯpr6q:" G$hZӾ,u#p }n#*8,diЋ^?LtR!} ;vM˻DmRV|k'w.Bax~I6q`18.r&RGbF;ɓ̭0ix}^'BfS,,V fL\6h7RhS}t:!5Z `1"8t1ݻ!hEd396l4W}7uB*A,(q k]"BJNMS.Br%Y)Zv{`,MN Ubr5\!Z10)_*&vL6G ;w90ET8&Q:9â@\I}jzŕ^ Msys/>O1w8.gZ'U3!($<ЀD:IU`+̟rX)uu3LJVA[X+E/l7 "‰Ֆp`'|B!˞;?@<3s|R,諎@5ӿ4f(P?t'KIXX5ضc'ˋ,-Y^R_ ЪR=MRUGJmN' tqnE\Yֶ MCiMsXQP*Q)K[(@dA8A ķi\BvAIfG=y]&cV%mS- cGqc7+k"* QH(v 0 Vz'$: yg׶2v S66FBigd=]Lc R:{:|&q87o綛?cG) M#Th!Ya5|o| B&TlcEBnCg N䥭H W|6)?iAh[]vOeclr]D+$uӶɬEh^nj1H)W"k%Qt3zWe^N?Jr| hT#\WDP[u{~:O0a. 8][^od/dj;T]H/zzc4Op뭷2=s3ܵ[o} AS*DVMݻPlVcfvl:-W0??϶ N8ɻ>aY) 鴙94=#~jʣ$D6-5 u )u?rc[:b^tlŮ 6P6'&;k8$6侔\F"%*GS) {Cw N&12L.}t8hu QpU|d!cΜ>G~˧/x_`]aYe`Jlsnj1w;7%E yM_]^(&̵霬]7~Y'.#Jl,=(/¢E&RM[1ؠ#$֤n")hŘ5`y$JصJڱȵZI]k4\G:w5sll7`v"~L0FyjE/b N<~Cw8xF;Cisﻁ?/pm3ϑe79"à T﷬<_PJ5PκtunJ?my6CUG-07YXp_Mo}+Yק+yޮZ?1"Y'ER Ft֠(56)K~6`v]ILBcѱNƬnS]} Iuc ]kRR,rx_^-jLYqBBJ581Gerrg Zm}>1&{g:`FFf =''hcš- Dl=< w{nV݇-]f)W@6^g+*.=/B( C ;_dDv(Z{qx>p D4Zq!"үnK&Tǎ]ǓOo91&G͵aێI?F_.]9=(}[k|GBo~Jq4){Ov$RfuR~~!?=g`+|$Թq}C{(_?d̜aPVzAjmvWqcDƥċ p㑛y[s{_~;cHM7ԓFJɹs-O aPgvv믿/048qe/.r-7s=;KoA80 UVg>A\&C'CXc&IҮv:,yx kMv;뗏xr"9]i5Th :l`ܟ F'r8W:ù?WF-C@zQ>>DR(\2,fYxjpJ[h0T-WxK>wvFI280Hypщ]8'F^GK6m&w sn'ŕC`c ϣ!+e 4%psǑ;qNg.n)SCFe^d;_,}o)T 4S Lp\" #V:?w@&a4k:NU=<Q XhTi#`D*OAsiO>#})sEqOx!qD"fa"I9]zH~g!6 #=hr +-1H(a{Wԏ @~-eBNcvC>_n*R+nr!᫔h!,B`#dkpyœԦ^&SHk" &hH\*V0\Qq$},_ UOL%†{Yi{%>F|5/]byi( nv.]hp=pEZNr亃!َ2&D:GX݀M!T! bRĪ坖t} J)Ry W~r%\H[ݤ䴹m|-P?K_yV}ϕcMd,@Rgx꩓< \B .#`MZ-FvD^ǚOo$qٳ R<< P,VtD69| xn"1 qQA k!e2֑6beqy= {Gi#7U !VQXB/Qݶ'wVT ̏{$h-B% 1aF_`Mok1Y7',jV) ?>C&ROWYx eza8:0\'N0117B żҬ4yx{) UY.hdQƠRYwssgYڍ5L-&/brӠ !FsEDrAR&27_ϋV#q\Ͽ%lqez֐u}Lg464,wOry__D}E>1~79|`gNwƓGrjP }Af8 ܚꏍc-+5+KT*%r"Uk_Ñ(9o:Fz&wg}Aǿ $!&6W!#4(\J)\>lkW&,Q!QcިȕfAAJIElwNP ` wsN;,lHY`}S ^N0:5 ]c~ы2,-4W^(V]pJFIhNи$q2yJ#ۑt{xm6%݈5i.׼TذvTm1 ?hFZ% CgyyզjcknvA> 龷+Y.ǧγxؘI 'g[DZaĚYߪɆc,F6I.N Ek` 7Ϗ\y~J.寴#(,on۟0:0\ VNP.gg_  ҁN+Dj)b*<ݴ1mfVhwV]X\|N8I_ɧSĩ:1_ff5>9 WY-32:BP jW OA\ViQ`͉9FhԖ[+k,6V)8Ⳝ< <26drmiAT:-<jj~ZcW!z^2!:ҟd6#5tPISz0< ?dj$x>!H.ͳB՛$Vp3>0};q@J,^5ƁvuvF%Kv^ !ɗ)"L~ 1-EKsAJ-sHˡ7$B$r]mW-•kPMނg-p+Dhe:sh%L9ȡCG8CNRn&#\';#|*:Be'^8X?Fh'~_QYbpF*EY>U( 0ubӗU}hGX%s'7~utkB3x-'w'}P'T,IA8 k' XGs:XH]>B.o v- [)kJ~xaՖj(M;)$E$zUD&F#?e&fa4va]õZxDbS L6VML62MEB*DjNf2y\'z>PZx\͊$ +| QB`1ԃY]_Dѫݟ V/|='~/10Rl\,nhaMNz m)D?BuQr91oرc\t iZ7pKKK>}o܋'xoĖ .yw8xtx xuNӧyċ mG`%~i(%*Bl6Xl}@J?eE/\-,\NjrJ#RU!o84ΝmqS0dֺd5krWu;*7G&hX,C'FP5>r?!+3yNT@5btPS gqqrE2|G`' YTa#yVu&$Ud҉W#RRN *ݘј'psEr2Y"@0Cz/~r#9cm1廮j&*vXc<}}LLloz#|3SSSxGT\.1??OP`<+Ku>>(#cc۷w>CCIV'CFxFs'$kܩK,,.~?;ʲpιr윓nr4 cc6dfCx{0 1cdK%mEKjKԹ+x{?ιRKjRK_ZRWݺu Q )p5?>);AR7=y~r I=Z|T\#>KM,i!!8d#$j˦ǁm~%wu/m]t2<>MA{!!R-æMycL`keHtєL7kK)#3JrfC$t<@j ),$lL\R2~@z djb![ho[bt΍uXh f(/2q6q̑#G8r0\wt0<8ѣG V5Ѫ4dX D+8#f9 /d< ?g!P%k|{xr|ϡ!¡F1qNPb\ٝ T*| ,"{Z ƐUDQT<9&&&Z288HoO?j\Ȯo?} Tӓ(-|j|qV衧Іε!U ςeJOuBaޣKi?/%˓fQZJԨC`۫^:1L"`Th Aa}ExN@jV)aD>8TjxΈ0LYQZP$o#f+V̪](x!m9=I*  >)w#N*b+Rc.%K\sq; cl|sZ@StogI$$R&x:t*C)l$).&':ܦFmՓG:ZA-&MXY$^Ir,HHR z˻ix0ưuV* >~;;/CfZZZ9r%:;;AK[dž9n}mbdP .J.,X$QGߥo=RЏ߹{ރ9,bU&M2ҽ%dB"ĺL4R1F&9B}_m(V$'鏈T#`!צ}eZG:¾)V,V[d hC\"W+\jD.QX?%;w5"b 2ړ(CC5:38r?auTJSbI>Hσ*)$oo}ly%-|BXaCk] EG`D:+1i& A݌,C8K gΒ͂fmvJ%ES&iBjκ]ΆN/!L\od2V굝M?MhW*MgcE2~O afTvD&џ{9%_eNշDiexR%? ™tb dRɄC?(I K_JIje*L`<ߔ3֦dq-/  ׊4-5.Q)μSZV?rlchp[6>鿣>0+;/Y|9=2#A~?šu*i塄J"$B8HˀAKPI+RsQ*D / 2>2 _OK1G*8́Qϴ+8|9ُ>JJ᭗~}.z'_ޮN*,A&$=]9tt hcltVރey6Zl926rKecY'$ V^wSRYBz6 BkjLkxG䲙Y c:I)QRs JBrZ&M|r[Ê 7D%u"1 t2`r\(i yRy`άp$-FjLz,NP8rL},<9S>]}Z\_,?uxR5Zlm҉6{bN ?z㇏Noo/!dddnvJOp[‰'E!Hk{;ddx9(ju|v 6fxB'J` >˩,E<;M;t7GΩvg6A$sL. H?Kl A2ZD~Z&ʶE{x]( N$SJ l&XTN[:RZDko\.Dzeصk\p o~9zc>JkW'V8eRg Љ^ 1RN219PTFF*r8feYm62xlcGYLhóuEȀK&Cz.Ђo4}kӲlؾ#rKz[pILFʧSV-etuw׋)E=+׫ bcrl{"L/bSF,B?$$!8-7q:b4ӓS e"_111I>'2d͚N~Cw~egXXj:_{`//ӆ4XTZ甋B311s{5c z~@,BfޠͨV]<8.5Jeێm!"`n`?EC5Jy\H!q#xYCyP>'=R4}rW.^jRWKUo <=X)L5[>zQ<"tl\Â1Wrqni%2.1$r.MsBn}+Ls@"pky7/a H8o?֛n"6<۷SO>0'>A&: )L X m<]+w1 EULcmL}z2la5tfVOy%r\~Q?*c\p-l8H$Is!) 1qCO!}|d#QC(EYV.YEUt`˶l߹uֲa /[Eh8Yi'q"=X=8e硴xɲ>%rB2O~R׉lݻ㌏xﱬ|Ƨ^VDk49b|h%Lb9U]F@=O4`!BJ%u&p[y&Ɲz_cpR'3"0!8Cw;O< FQ-O7!DQ|Qq.yL^83fv08gqΤgM!hPZqzFR7E|?D!Š4һz?3`mx|Rl(ܻqoMZ 9E[W+lj cS\sf6cd)h%3+Z73˲-LOs ?ˊ? .NxΤl9?{g?GWaHKcz[йN! rzN^Z$BlٲAV9x_?(4Zt1ē/ۙmPwg^dsExJx+P.BkZKbE5պkΏ}Wi!M9Z䀼)r%JNĘ0d#%2Aj:+KU1qܜ`q|~LaRsQjY& rTkuzH-v"nXO Y#<2qTx.DZHR"6X~ lCsXHLLq&S#MO'Blij$#rm=xT IDAT\lJ4kUh%0& i䬘alxR$#b_#[o<ԓd5ʳ{v>k*5aAgIq[(cO29 fJ-(M i[ˆ,]/C@> :aM IZDG[s:z c=U.#<\} ,_{y韙q͸GC^^*j"˳Hϗ5 ^Jqq${ABDo=e.*.jaCiuw՛pC(RzVR5LFټ1|Llcdͯ+)c 'HHgrMH =oj`'"]L gblE8yqe*By^l{/~2`mj@HWHDHŋt1^PJ"S0v3{Swy5$R.Co"SgwJu&0<◿5r,:L\Z~c!KRc&)qG8c|8 Yl~R)BkU+.(C!a<2ii>2I؏>e+(QYraLH8)8hoג+__t/Ekg;aJl YAFLG(V*T*+Shվ^ "ClYHS4y<32 #6fgNk.|LYIzw|#my*w%3LjdA!qd?O3w]gLk.@hT+cXb%O A$P(ϛM@fOke0lNdpM%[50=9Ë NNi :26V7Κ*%q"Az>Т-;.kHۧG37|۩śI&0 -*J-- })⣩*s6 ,⹿Kmҙh멋ΈslH4qpz ?˵C9D:&ւbAig|.c-˭y{ȢYP ?JDJzv c#yڴq5]0(QLYKZS3O^# CfRٹ<ݐ^NmiKîqa뚑lھo}xܜsH)@b(z J'#ZƢ_Il︎\chd -W`Ų%DBTMsUWe|{ ʕI.a(ï|ٟ~_Oճlq.Ƌ_-tvtc^0pCX`z|i^M"c Z0r/]8!tlbU+(%Xr$8cZ21)%J$ As@--\v&֬jVFk 0իYj-*>ȗO<ؓw ~t1^4FJ5\|&R+ọ"6kyzNDQ)ɪa.ƹتK7R;:/׊u"Y!od6iw%EI63ڱ ||SlDed'2&ȤF^QV.i:B)YC.kJ ~װ&&a@MSx2!Z9:O42aLZ{&+!Tcۜ Cr 3HlRc{#` O,Y΢gS)B.q<]dhrbNSMPѽdLGV Du<@ko/>/5߉1J I,R58F ck- `j*BAixqKlݾ΋hkMPIɮf=?0Ċu`\=;)k?VeZ/',k.K\{%Ħ #!tU "#'ӻ'Ge 2Ɇ5z7sm?EY2>Pb I (4_'K! ,ZX3D)6tQDVMMQN8'lkj{޼=6QI-zwoEg-ԝzY.j.f]nz7dD֦dg5"O+ī|IA("aR% 6O/ ]GFKb-r&$JXMB"SS"~G@QW)Èbj9tQ&x*,>qcc' \͉l\w>O?f_S4/$z,PQ(<~i"hkketFKw[ʲsaRDaIFQZ ]zS*]=>('GGXrK(K_eg'|Wyv~ xI'\\`yAPdlL5B{ZT_ܔqʵ6s|| 2ULN&rHIZeيR,Ŷ<''kR$U- ސ)LSՉxƼIJTZh?\|Z\%Hp[Ԑ)E+5ΙM~Tﻏ;R yO죧5Zox5j4, dֶ| FKK tww3<<̆ &hddsy8cp1YǺU*Q9~l{~\رgqՏw]uAXRZZ+gXz9Gad$ݬ[;y֎"eyfzZ:h[Ok6V ;G-`bjY*^{uyb͚:j9)dž1F|`[x޵윣 :y_QNGRd9<ߧ^"Ôg\+9c&ufܱ /|1s`br IϵP%44y+ l%bڅcxYbkزrA4b,Z9"u!pK8XQ ф4t\ڄc !RB) %k5tZ%wfm3ْBRb.aLsO׿RT磿 H%Ӣ_5l-(1ƑZ mޥ]|!KWnĎ]&#dk(kMS"Q=pNX$!W$M$+7la"m25W8vYY Tk/΅=zR&y\E8x2 P)`=YPk&٣6q60)Cpd3ԥǽzI  [,Wvz2,qSWN/`U;;$Z%\?ÿ'{봶)dٴy k/nw\LBn Y-BfˮqTH5yjb655QRCH! J 8Q4 GYXI5ٰ(j߾K<<)X+9V5{L5JD)RɤFq!ZLZp$ (3giZ= dYlc1R-ҷr5[mo8qqyC IGW!YqXK'3y2$( ۽zoL~gS4 HD6Wdƒ4n B=4L1c,ߦz'j٬@,S2!b0g0H" CF\=ņe ΡPD|:đ~ xzݠ]ɁQ$YE15|ե<:[wޒ<n̞ MO:Ĵ׫1 {:lg7p#^{=]w{_w,_SOM~ѢbN,_e/`ߡ-㨹k҈TW56#SmZvI #Ɓ~?+'ƒWʾaCD~BGeii-R*J6/"|ܗ 3P.d:[/!DhIz\pUtvqyԙ)^t,k[ eYhD&B!U%XG%Ɂ҂Vd__byˍW2t Gt}FV/ɺ>T*%b0FVXkպ8# 󹀠dZX'5:TJrMs[5h1έ +c~ҿ~VIM4 6m.kA N(B>gA(I1t('du =zLx |)0+.S(Ρ`祗s7t eu7PqS "k5k2 GC*4E]A-a =&j~]Pt))R9T1& N`,xyofsi)lg#8ԫyD)Ʉ%YI )Jc8 :p1 Oޅq軏ꭷaWm 2|㤒y@:jԨ *_3rGxQGNk2x;^[E xz+IA ̱:# ~"s+= $m3 ĉ0\=Pfۯy")e罏m3c{w#'ɭc1 cԢǙ> luCGi iuBS8Ř.g~ƒ_Os6A*!<.|yB |wY74t@ΰA*8pN#JlLD'9FĨO_v0_rh+zQPu*?N_bo2(NUd߰s,u`l!<(ZIlVɞK&@I98q$ƃ \wxۈsų`,k<{&W]ٷp&غu_;7 M1 bRjD!Ȃ~aqV,xF넪#b6NĖMLuc<>F?T{@h5}} k/ -ma@U# Z[[nW$ R0n #vvW)^ Y>u uHQ!46r5{/q8@31ʯ"O~>>tBJ.nJ9es%hrmB-3W\Ö+,I-$;%e\i&! I" 8WtmJ[ |4ݐVT% QS瞡`5Aa6D > IߚDH`ʽ}+$3r7S^3ˍq^@7e?S s45(KFT)ĄeQHƆ`%w'w?#\_>I{Qzny/:E[Im-) J`RjI =*a?'2a#&Yayrۮgj|36c(>62ֵ]TZ?qݻwa5u.g$mp$H) vK>pRL@ʹ2Zj:b(8=6*qP!I4jvg-;=5Owq'89:ָwso'՟giR#G"Z{P٭KlHU[G>.?QBDdFh0HT=CR:ItLCQs~FKm;b )e h@ PRaI 4"$‚X 3a!W h'Q"N{pǛm h/b^Y@I@ B&MB ,ԖQ9UeI 5=ѦOW|;Qk$20^+35^+vXӥjJ{}s  D Xը+( ת#oh c'DO<Eclbgi#%,"I#/<Ֆ#shgy_ZNy_i' SA\kٻw/>U\bU0F IbT(4R ƛr?8|yh159LBbORZɪw]7e<r]B"mRh91Y~QVLZ%VAER aeA;|~(uE H x2k Ǒhcщ.=.AP7(V37X HuBZ(³ Qv*i5#tt/hIGEJL\Aw]>=6 U3ާ51E^dyyiuJNQ1k,jq-^GОf-fՈm7~[Z,EKZTJE֯{6*-Õ`rcWv42cKuEKKK0!v}<ϣhPTրUB5>¦͛!yl6{̝:5^ĞScrrG/Xn|md|{ 4۹q nod [qdέu۝PK'ă$z%&Zx>˹t:s.EףQVjT3b\%yV-+<$/~slܺ 6n؀˾_4OU)0g&B\)cUw4s'2?;KOe 'tztK *r]7XchH6kAyXq=(rp&QCsJ$yAEe5Lqsm0}'X.? ڋ ݔI)\fIx'oCmYF+YPU$Qd᭵ I: L⠣#k`T /YL$vILg aNp۩,.2 X\RlP@4Goy0"EZU 14in;Ÿ!r*8&2ʃ 6pSɟ||~倾\akU8Y\\Ljɹ媵Z0$"FcY`]XGZ;I5\}D6HA9rQ* ǎOviNL AD@h`^O7reGIHoa :=& (4캊<͌]r\k_evt:ٷk[}j+Zfs}ZB^MRaI)ť'u.dߑ;K(iV .D[T㥇HUi~FAa7ɝpr[(Y`_6[X&HH1B !~U_ RE&W^Aۄ"nqp*$zmFmDŽ}KKcQ*7L$UU!-+$ ]Wf|&J}tkFdJaW*8&":nv]|Dwq;v(f:$!% l ± K)Q|D8 %I\A?f[8rmSJ |Zuj v`sf #X~C/m32Z9: <캒ARSbIS;={kwm-7IB]>=8 Ryg8YՍ1i6lBXm=oaO`Iϴ&:˔ucVO bFx;]7N1F;ۇ:qwrMs$dA0?t7"rjh66mvjR|**aI]!@[J@_p;OdU?m[xjޛo.ϳ|aoW̘Er0yLuj DOLPiϿ&KO>ԡ^8ugwsI~IA譻 6pj5У'6S ,'6"6JETFG`r)N!839/1T!o"2!2iM:8&DH@c`0Xf3X^^F)ŦM=߿)ie<+2\eqqGyP5P+TIjך d*a؊~ua~?\SSS{]7CHG]i>ca8s/>{QOl>Jhol6x.#3iv&nM^mp Js"KY }i$?s!m.Vڋ VC{02R`XpX[ykŬ@TT?Ϊ6~ÇVrP<==1~Oߧ^s2==w]'OFqFօZho܊A_obd:>׆(%d+}}"ͷV1oѧ_r!'ia3/ڬ,)/ur15+62?05FGc69~$I=Cࠍ ℊ}|%B\]3&8֬tBaCgVVupYnujULqƾ7 JfHۮ\ǁ Ʀ,'iORt#}L{G0t^G:nz#R1AjI8D(U |B/11oĊlBhb}*"\^Y!dZZ'16$ BKI$crVlERAR5h~i ɓE{[xraRi&8fթa plj c EE:bCd&u;ԩEZLO3m Q"!IRDQ<6r24t\/鋈X3>= yޏϫ\&Fq ~aL(qޭ`,TF6v3fsݍZ4\kT['G'!W!/?}WDyM,v:Մԡص{O4Q4 1Y㡵Qk$@a,//3I`bb Zx&&VVШVZk`I}ŔT*Xq. H$uA; aZ%6s]? G8 ZIdQJ;:,tT93"7&BY{X^l(EXm24+?3gjVDs.3Z^ .02$a q$IfѦ@Q~WPD&} /.餀ʃ6 k,a"m*&V`_eQZ'XmRƇ8wF¡Osb;W:Ggqx0ƤN29#h<)q ˆ_-sKRv-U",̒tI =T¦qD֣96F}b&;+$ԩSE1q{eff0>lQIy"7Ԙ&IB^'3j~wbbhE}Dm^xg`$1Z?#,'=>t-t:` TZ3yZkZ9p֢>LLO&&&%6MZ sյ_?5’U%n įM879,ڈg[&6l%z>|b;Dkt4M¶M9x`,}{oz 02m&'Ƹ XXl,!k# k|&JZ# IDAT0R4][ō+x퇉-R4cգ9Pߥ?;W`MLL0;;[R|nw߯}*0aRat1[~ilVu8ޘ( BXZy|aPH`OXp#%Jzn{ǻ񦛙ٔ_I9든PN}/Gk_"#58 I?c5QP$'BXI.<)#`^W]8Z(An^n=i7p0F_Վs c9A_Gغr L ܻ$Sy'nܱTesKxK <9(^>4Z0h`8c Kxn|5"%ٚ\jȩi292D&̘щyf͹4ǧNo8%QlWLE`SeނǠ@V'h"mQW֫#Z')xy h`0^ɓ'5[n-^_B+E9E]]ѶKI(bzz5V< NIK|Y# lG>:qAXLxˈL,WǴmFFF֪ a)!S1A!i//[kx[}pdk3[l+u q1]EFˬI N=IZ"ځ;`6S*_ A_R/]}qSQ Ʊ$"VH'|iO#w`e:-Ԓ32듓8q) [}><+*9M7 @ɻ5Q֝jlݺna&%M˿x⑇x;:4Jx/ٰy7zw@$$"R('tD_ZY6:-7ȗi*$Ahi%d%Dt"͖m[{Y{8):̉agǞ f:y!.sѤ.@ųAV I΍㝑H=N(Phw`7vy~sm,RZH'^59~d aplVF.`R~ >"oNogo}(Nu䥠75 R!Z{.EsJHtp4K+6!DL/c+ VJH5ǛTg% '撡gl4 qu[@y1X!JR IeIujz0HF' |v(KOu{/STB Sfqq0eQIr8NFrQ6ޫ1_AF.ڡNi$0 }O3Ǩ67Q0RdAI:ho,=o>? ˟u gz^Q_[?JQXK~9BMwI*RAB``5og,2:݀mC2,߿A5.?7cNF&x瘙hplnG\g jv#ԫ>`R%<{[Iet^oQ?kGc,t &c,Z|s4%,J8Xa "BZR3 _`0dž+ =+|BV,..yeQ&e^rK/WNH׺.nxߙWb $I|;] q{Cpqu?UoM2n 6'(|VYmKk1###3O3{Gy3@R)2IQbkouxW1rpa?kma\8.@={ ֨EBRw,ة}T 6zsm0:S1PUa엩! GZnŵ&Ah6-^g%hwF8 oXć>>!? v)C'XXH<.E<[85XObe+ټi'ٯ̡[qe']Wsm8y ஷ^͝wݐLG"jq^cl>ÿ#z Jӏ:co۹g:H!XZZ$ qN8Ǒ 櫿| !jV`EjE<!J"0eb)1%Ab5HE?s q]q+fUזK91[-ƕ}0,E90*#hZ)Sqwp8DQWop=}OQNMNEц<,x (b0-f,KKQ-*gfعgoF^>+W@.!ٌeQ]IK"ӌ` 3rq$ǫ1VHSkuOo3ܺMN8ݓxaVHsEZYJhԛZNMi[[oqX`E{H&R $&)Ӓ: XXX`nn9n3b䕇ロɢ"757ReW8w ȇk+ I0%"hY kq 4 B([ij5j"M (~Xj!m/o+~~2S2ZsXI#jmo0/>mIfVGܗ.7~}ӭTF..ph~XΫy9&Ƕ`aie? o]2lpk3ț/s>v Nk=\ kF:G[PT PBRq;&I%N,= aIjUA1Z8hbG"S},WZ5A|Fu[#H# 5L]e||Lm;r}KK=[Ar2 Drs!u'&sГㅅҖ~KV+ˉ &&&l _߸ ^kb\=X Kl:.#W%ڋszmиȁD7QT-(&mPI9{ Z90*W=em)e1_j3 ?/'^1FD2*Ns6M5Y7D@1NCcE|%bJxT&GNГ/sf?3w3:}A.n*92XBR9)<-jFcߧ4*pyux[71lbatѐє>>ϐt^spueųR[+12U6.%D+7uJ9\b^dr**6odX۶?'""˳Kgz^:o9M#- 5Aϓ4l@§hIMߛܙ3z/sj .1 kR67)2ePW.ԄA ?A4ԙ^S k.68/A '[9qxN߆*yҬ VZkZ a|(G{A@f$?p\m1ZSx4 \[o>4X^ H] k]L.Kk‚T6CFx9FZ zqm(m20X4L?t6bfVԱF`I[nRՁ6eOqM R3LdK8A#BTfM6ʖkV[X P@-Pnemy8kX\js_|\ϧZEQuQ$YRzQƨV?\-~#.p)?"(g2}-J{낻AV ,&T8 '`R:[ 0ݼ:I8N0FSID-+Ɇ̥t0NZk$5g< mV Ǽeɩ rvdظSlkxl|Թ(; 2,"8;ʆrlRYa8"hc I[ƹL#eY{ Twk]}/ˡcy[ [?SVH5X^Zdaq%qM{GߦZ8\PשT*43@ >a(,j!!@χ0\AM{nOR[L؄NiS0(ؼqޙQI,c<mplPs]+9p(RZg'{Z[oh;;[f6ﺁ{{Kk}`,w:H{k{}mBqZAb,J ~Mb$ 6nȤFEjc‘F" ,*a^-e V$ 1xGRY(c eL 6 ,{0,*ˌ\> ~h;ڤj5e||uly2~jem%~iVD|Z̍،.OEnn*MKYFQvYZZ $Iݻ.Ǘtql0bU9GJGޤDBʔMLVD3N&x6 >| VvG)T]͒TҾ@~RY1WH{-ᶛr67.Q$9Xm۹QG^ ,F! KYkFQI1 y&Р&H 4p\fGg6 4M:Da}%M!ܵΘSBAqIF#Uz@46IdqS t|y"'%jRHÁ! VkO._N[^yR.AQ>ܮRH\ ; '};ʾ8Teқ  P0r]NXL^v~OZe0077?O?66FRadd[[orIJf9>de欔Y^ w -fY AyE6?~%ӄ@`zn$ʆ}: IDATORSbıW4T7C.^ c,+nft!yW6Lw!pfLU;It G#Fwx [x9pb%/!HWe:)9 4ں87=nTyqw)Ե-9VwaBk(E<,vgh6(*e L5i{YVP ]Fѩ泙e2r"YQ> f# C0,|aY<11=nIZ_ob4jJ9; x}jZA'~Xg,I~XYb;ǏgnnnE._W%Klϯ<Ò?.]y"o*C'T*LMMh4hZx /l$9WHKxI u@;D[6܄43ʕ߯ HtBUg;;Jm)օ kJ"#U8 vtqjDaijTI@G Fg&]1Gy=]ܯmذ苢~yIUs]z (Q]D47Dc((&&D1FP1*QQ ("H /l~qfvvYvu}?ϳ̝3Rjjj$$cyHxӣ$> },cR*mI;|sdE*%; DŌ '']x36~ Q Blܸ;wV'l“ڒRR@VٰW?ⳙllj۶)'yF>|rsszdeeŔ ۙ-d;2GlP4:(EnҵCkJ>Xxq8(MC4\ZŒ:n}}J:bXQ,=~|& Bks(iFG.rN<,oJ70-RMquoD"1`0i~r{l;~lqǎ:H5j͊=_TzD"}v֭^7sԖMll;X]]ڵk]JKFlOcxKZ 8RxV<"HpgSu@P;D4 6pzDH=}@ P}jEDX?{"hM tUb7i :cQ=2#n2pjpȁt*Fw'܋m_Ϣ|wH'jFt+ʦt&" 0t srba_H7'bTċ bEMvH kٵ$- PT4!dt.Ag4m=_vZH џ< \^=4;wP6 3 ajjjB9sx*-ս֗>_x ڋ: |㟡dJsͳR;9Բ]~TJEEEPXXX|M6qVUUw%zTV)~`c+R"E}ACd{W$Rխ#ex\.r+;[ÍyځR,t ""n*»g`L0aY8eb58^"(]\2Bj*w%1G|.Ah136&510@YD䯺`M ;x~3o'\n7nsB! 1'h;l}4Ym7Nmѩ8y]>Uޭ`0XlVl@69'R97"CmC[nѮ]6mw@LdڵbP.>ݑ%>cz9ⷒSN#OE~~~,]AAAjM} 6y M}v Gqjh$%Wg:nPN>ˡ&`UmƛMe X'ze!Xʢ k71;u6aֱPt։*SWsD-}ljVw,5 +渧0&Fw"(w<wwз"Ehz 6deerb oaGi*++O H%Xo-+~a2UH|{|Kc+Ge9J1-ٴ6WBZ]k׮%'' :k'!_FkSEnD"Xm0И+yucfk.TۼVrͯ @5*}0ɡa:i͝\rP~KT6];·ߢlUa4MOXݗPYYnX%tf;6k?Db(d{M$8"aF|%8~:pgggf4NɝAnnn+\SSCyy9TTTv`[O2{M+ئf۽^o9Mmqe%s:&x!8LVe )Fa|d<դ>2|>n7#!x}]fhM9Y9;;Z36]У*ŧ#:Nuwk:`^)qµepO7a&ttpnBp?M oAUe~ 󼘖a;J ?i>J9Qj euxކms膎`@)6ʹi&!9+PLv\>0k'{3jq'xWt-2>WB֮];vލiTbG &D3jq2\Ϫ©\pH7?oPD 20MDBtСUvmEBSЈXQBDqh:t{ڙ 8ᗇ֚(ZB݈-cZ|_k. ̈́Bi"JЃsZk_#X+,DFְ}H9dA P aJpG,ursscͽT;XostرN?J0"yxrTv0{c1>yb|$aX={|ޖ۴޽gZRn%ƛG 0ucw7x{ɍ.9p$;vtMVVVJTkmm5>w~O=UWWk~X:;4qե#G5[H%h1VR*l/Y[n/ IV:Xz_\O}TrKEEEBQfDޏ,ڎtB8t #4d+Jah&\ϾN[ܑ2|I0$ĜL\5vc]1O[)o+&o#}%hɊann8UD4<p(۫6N3?ŽPeoAXObdJ'a'm.rE^^yyyxd%-*¡{ \`z$SD](B\]ʊm ,ҏkM aI$Tb&~2".3!VJQVV" =rQ5PlD9L=CYQ 3Š Ό(>v4A7~nE\.k.!1p|Z;pyy9UUUTVV.#vFT@4.T z_eYuLDi#zɉmT6vg 1ێv˲p8w65T[+5†&+nϟNu~VXQ l2 DMwىzNNNLXkV^…4,lk"ߵ+**pAxvXFT4QViF#(މwvvv̱;J-i}vd+{V>S|a!FP]]sIȿRmƅJv޷L؛Z}fEi+lѣGVX媓`&UhTMleN"6~{VPGLAGy<Ngl#9MFrXܽEhcmvV*++1pPihԱTG `8 B^v(&H8- /uKCi M3\=VQ['oϗ2KiCCOly3Xs{,~5Nu#?L c+4;שoEMLeBoXFݵ-sU;^;1 BnB~m&pvk ëObDL,((hO W>sJmRbK% QSSC$WbGWR%fLQl?K$B!zMaaa9 NQQnkST _ö9ln$-K;DyXÕhgw8|> j$ c~FRte p껉h^h\OwMWD|M>/2O[e}ٖ̍7߆O~X;Ҩ=N;N\.WVr.[n7555лwXI{7*mZ6TJd֭lh4ϏHgwrͯ Fr-on SM򒅰T&\!%F:95 |MhسژlitAU}E$ÝJLr;r]&M0!\AAI>44ЈWsrb* ]CADAhR%b"nAQ@A&@;!VpIAAAɈ57K>, m $  (   "    %U #N B bEuCQ(€ *X送eY(0dOAAXX].1 "#)_V6EADAhhhdx\n44f E4PBDADAh3Xb:Q,4ykTDsyi| " -t=1ۼYChIIAX@AAQ@AAADAAAAAADAAADAAQ@AAADAAAAAADAAADAAQ@AAADAAAAAADAAADAAQ@AAADAAAAAADAAADAA?^ SЮm8 lj"''v y뭷=c!?nӍ;DžiurKaQGq$ -{wAAyϿxh ʁ'uj{ǔ:?;(WbS]DEG{{x]w}݇E#shO|CMMiPu^`3lPs>ǰCEAA*f99޴+18<fآBzuLGVǝ?K.{w}w:/ epЉ]LJqiСxrZ[EͮnZ|hDLAA k.fB3t̰(K,0\:R kϙ;Jv#RUUw11=)螅-kFssEC'4ÿ; BuuuCv@AA`) KqxG0#&c;a8ü^)VE8Ø'"g 2\uPr;*rc8k׾o.<쬬F?  B+Sǎ w{]5h.’lz -?/ginY<9uίiuv}H108p(  @Ӵ\^n?Pu7oZ/wv1år;45Q|y-oܴ3M"(ݺ`̘1  m++pz:[Cq8k-"04L*P JTi/Jşi]INOI\'kn /اg0ʻtEެ   PR̜NZU痝S<=~d;WUiWkf׻}l(+E_bc)f\)=2˕nٲ%8  B+bܸq   R8^׿83->kpZE\ݛn+{ͼ_h5fФr-*g)&Q,~yܱz-uЁgi\tTUU=   2R(=z4sWW#\݉ƣ+#sX{B\iF@_SU1`08rP@P)OW~Gvn./<j]L0w{n)[]_F`#ff"N/>  JXj A\ 4?%uΣ"Ww@`= }yU|HOG?fux77^eY,X'NݧgDAAZ7o!CX"NέyZg=]8Ӂ2SDˑMw.jZaeKOGpx(:5:n0AAAA_Qm#UU\՛ DG6p^'n G5hFX85,Fz:;Vt]<׿W_"  #6ndsڜ^֥{J`4 ! 2EiXŬY8sݻ7^N:1|p|Ao.$  arJ6[9q6DHT<\b$L6M̲e2dguׯwݺu{O><裭Kߴ|/Ͻm6򗿰tRFԓԟsyfVXVkrwm۶6ǵvZ;Z~{W_} aQ,=>ˤ_rGX.eDߋ!Vo(v,,jwF`"ax͛ǙgIY`Æ Sf׮]tMp ;ZlLQ3b^o0;wk׮ Ǘ/_NϞ=fΜɭoor77˹eƍXEϞ=S~_UUEEEEEEx,|lܸsSVVFaa!ӧO{>`FyG9[='[`Onj3ٳ'~ieLBݙ;wnnݺѽ{wzAϞ=ٳ'ŔЫW/zM޽ټyT|3OŜx≌?N:Ν;sWRZZ5ׇ~8 cǎt҅zh4*'dҤIӇ}ҷo_GΝԩ=P+ӱt޼yt֭޿>U(MՆRV'3r$UV8cV23ΎCө"\U9VR(Ŗh 7}Iģ i>ncQX))ìp:2ꪫ4^{|]tŜ{=Ν;' &0fV^&OG}ow΁G-/,&3ߪU8SӣG`7a:(K VGᣏ>jVrk?DKYfi&6mĢE5jo+g`Μ9pB?x?0~}Kع6d~)'v4硝?rIgl359w`+gY {dn_d0NvN S*ǎ=HᖲV!eCb M ssq?`5#9{[n{[݉_Exܜ{0OU}GamԳH3ꫯiW\qg+0`p@w{_Ȯ\zlذ믿^^ $wQ]]S>i+GKKO2Z_|1@fޅ$;;;o+۽w/aHZ* M`Y.%L9x  ~{e(hh;aܙ(/׬] V:qe5YdO/~Aǎx?yYlN>(}>,cƌ3o(3fs5$|rJz)VZEnn.ÇK/MRQQϊ+pݜqtAuʭX^{ŋӥK>h;ᆪSNs1\~xizj9sD_,qWsνf׮]7 &8p }G}4c̙̞=9MF޽Yd w wM(ra1k,ώ;7n'x^3rH>_|aØ1cF17rg3x`y^}/;MUO0zh: |I w?~<to&%%%x 2]ywcK̜9{/a!k>s}).\]wF?wqq1_vm ߹;yu{饗xgbKKK9:t(~-zb̚5Ç_$>ECqFzݺuu< #G֭O<'NlԊqg}F>}(((#ޛJVҩLt1+SNcTacd2w}O:7w?biӦiZ}7cB&֗_~ɠA8sÜr)2e=P}j{ͽ4[vXe9"U3}=xp#k#l}yI &݅84 ww`r#Q>l_XB3%8ŋUt1c>Wu!߾ P/rZz!5t뮻Njر .\G±m۶)@]xᅱcWVG :T :J}7-R~Ŏ}70 ug+4cx 뺺K=uT~u@g߯:wPGy,+lG4MSWݰawܑ5.s9#<oS\lݻU;85c  ʞtI P۶msI&)@͛7/˕R|pLg*{{6m3}_۶mSG]v%oTz/7pҥK/X@\.uQG%oJYi.2ҭ0a?ΝyCs1 P^{md﬩}ߔqM7Ů>@͘1C{ P7tSciC PSFJ/3FU# Tui}d򌭅E)@uwf%]OS󻜜'~|C=.')Nǩ,å u)#k3d}Cv@۳cǎ^zsNjjj[{U-1i$ǬYx27 _p# }>#8#XjUUUU4H8 =Xf̘w}%z5[RZZRM6djG1uԔ-jrizJԩS4:vC~̜93j>#SꫯNX7[p!\rI)8p ˗/gڴi 6 ˲裏袋ӧ˖-kym9K6O߿?'|2~mx3)S h׮]9lLw@rrr>6QF`/^=쭏kJ9뮻;v,r 1 ӧ3yf3LYS="=\;wތ5*w''5`L<غukXcd#yGAݩ6#T5yŚHU2Ԇ Scy`0A~ 0`s% v9r$sW_9߿ѝs=ùk/ĕEEE >߭[7-Z'''?:5jcѢEw箪^ᅬ ZihgK/_9`Ɔ̕ꋎ3i$n&T,XO?p|̈́a6oLII^sYgѡCM=ӧsGӻw&fSz˸ظq#>,<6lN`͚5 +dΛoŋconh'|r˖-kQџ9s搝֭~IJ?T&3}g-Ȅy'i*;8nƟmLHE4M6123&;}<ݝae'^` VVi^_ * E8|^ O/; )B eн)((`„ _>l gΜ9 :tEgӱ^b}ꫯfժUAp!go~.GNk)멾wi&\.۶mK4h7pCN.qƱ{nfΜ : > vS^9޽;wq˖-CرW^yIavn斋ڵku.]4J1K--Qg|r~!0n8VXO> p:ﬥmuLȄL{ZN`FZ\)jerQV h W x߿c=1"ġgHWW?o￟1cƐٳc9Fd…_SPP)S(--cN~m>x ?l@Յ#;;ݻw=`:&gW]u,Y$a+o}zw}tM UW]şgL¥^ʜ9snk6ݺuGaݺuG$~i斋Hnn.eF=vec̙L8;f3LYkژ te͈>}zNv3.Tks{ ,iTռ؄C7(qGG/e(Lf8x.]ʄ=r#Fo{tҥK&NȚ5k(((`ҥys1;vt2c n77|svc͚5<]ve˖:I!̲, yZ~~>^{-+WOg,]MSοsN^9Yd K,aڴi}ul3=Ν;7 M^]1_bŊF)f_|9@JKVmtؑ?񏔕qwlaC2;kiHK3i͖2Frsrxvtj07}nΒڣwDxz÷yf"1wفMqʋJ|h¬ 9~F: Q@~fƍW\I曉D"tޝz'2vX~!<۷g̙Ms=~~ߧ.`0SO=du1~x&Bߟ#G&(O@㦮~XFt1 #f*^cYzu:~ B16{8q"NJtiꫯ7nȹ瞛Ҍdٲedggvplt47юD"̙3ә'ްstߗ-R>JJJ1b>Jc"mw~:!HBSdיּ)Lm?~+2if¦jK/߭s|PeE"Y=BRXlPj"nؓ0ż6P;рr(ʗ1zhh;,Kr-=Zb*//W6lPo;vԠAԦM2FrdLTÇW@ZaxC0`r8ꩧRj׮]jk2Uܳ>;!`8VCUG͞=[EQuVu(ǣ/]Tj nv7j˖-B[n#T555*7W^QwVj֬YcǎjiΘ12<@0vh;Qax;^]]n6mV`P-ZH]yjƍ ',Y`=SmTVV|jƌ62uTգG:3V̛7O)׫.BOiӦnI*˥f͚+/*@?\YvܩL9+{=(@1B͞=[m۶MXBwy P_}½dZ>SHCCرQ+C*0K/"ꭷR|:Ն z7/2 C7Q ,PjժUNP>}zBLeeoWq[:axϟp|̙ P#GL8ޔa2;kgo7lKއzrL-;Dm>P'tRX=[KUG&ϘRJzRNmTR+MjzH^_:J8AIDAT| οR3;Tcz(4*p|[:ʩ Pąn ( ?!/V~r\_߾}ɓU$iԹع=R@RjSOUNSW>uTF3^zr8*77Wi.\'MTvb~;t:4MSo[lՄ TVVjSO=Umٲ%< * |u]WjT 6bԩzTUUU<_ZotR~LC9Dy PsISQZZUTT OO*;;[N:N;M-X B1~xk@u7Q2-\>3էO뺚0aBWyy5jT^^r:jiܱꫯE] bzO<|&7꫋Lt-SD)[DzW&cM6F&3}gM#M%-Ai̘n,14=֏E_?Yb"CѳgOz_~[o\b7 y1-g\FcӧOgLy yr-cfS>)4 śa sxb{;!69WӫW/v[0#x gLDVZ5Q&E6eB 2U"J EC*AW>2XoA6)U  4N!n]AvCF-.U$ G r $7"" 4&; xeː!Cbeu)! ]Dv9A C  U:J   B$|ؤ\2dl  "|ݠ!;!   dxl62it2"  @5P6dȐ*`iLjIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/step-in.png000066400000000000000000000146301341747546300223450ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  "%IDATxyսǿz_g_QA QKDØh 4%c9>Qy1DyF0/$<Ee}虞^a`nu~pު.K5 AeSQ# jt8Q $z@EOMj4A4@-b mb}m!? PM U>}&܁> i|=* !.&]%w~TPUsVt=D &^% y0OC~D.dj.AƷl|ֲdS:|?䔙aopHsڇR[nHuŻ ئr3`m@D/ yɫ87DK}gj'xY,do,0(l.Xh>w`Bc[d'{Hl*\H-b![mŒup<K/w *0_:Bz tB jݵDKZzN]"끑躼ZY*8nX{B!ebWh<; 20 ;{R Wk&Ui"&,?D'P%n!`Zy!zr00޲;T-[}5 pZiaC/H- FF-Js 4/9"/Ui@hпHuZrwn"Ui,2Hm}7CJf^r3m pW ^VܨDo*ՂV m ?4/RohT;ק k =0'%0#n@V4!(=hnlkJw]w&T-H-+pHZ ]{#cR.6E]w= )і_Uw){H{ H6{a3s\ˈ*@hRjg4H=?Q#$)?|s9df)`/thsUbN^丟9zsL ^n>ԀdrH@ +!(}Tw!v^ikLKsUnhrSHCBLod{9CT( vޖӖ6WGJhd{o4B,W9*.@AnyͷƖ3or LZ,9g3V4,%6:2 dT?mt?vK1e;8A>pHv?NK Įשm"$?$[i$ {fsÎ! j1g`p?-:w-(D-nl6pGq-i*%6t\(ZiWy"'kjx |:ozdm1|RбG0q,t7#^bؒ@9D Qp@-k>=mdO6}j縉284MX` f4>o̳hOuj C!>Iu]$–F*iX_K:W*%^ea," q@? 5+r*aYH 55R9ؠ}WבQ+QSwߙnX"ϙkIc>*?dV\]{Z?"A* 4&%yݻn<946E-# 'Fbny^3rQʘ/TmƫnGhIYSaVZajhAkC CjBF+ѪQ_,l֔`mnD#E7qNRK7p38T݀5}qr4.z'ק鹀b4 oLȎkr Y pv!u2oU;Ջ4R)F伩Be>t[hdN|Tdr>54R!V?7)ɸlߩb|))f* 0m[xoADdU\~V.9vTU_){{\y0A*dzuRW`:݋7*&"_59yOD'y)4H}_"ir }q"\yEL7Xh/cF>FnHf ĤQa(U9g2E\ꐦ2V8$ScrMjT!!6FH(7ß_yW,%!T΀nM5β:̎=cb'-̒n7>_|>!粎*ҰG _)#7BZRETP&h_|w?jn?~ .d` z Qdh W:[ki=Kw8 AzIeГMd 瞧_^!)+ۉBvsW_kG~V<|cY|g+O-ҬcT@bN[H]vD:/e[H+Y,Y}Efa)("`Z ,[%,eWmDωoRḊؒʜ&\z߯p)AђVi"Oyo SF@2V·s)#?Txf+-3p)Qk-AS"& L0DH}LǗ>{B@ ĴZ g?fކo1ْ-\NH+_>W,8n|b vHTJ/C%?עyh3`L}ya;Ub䇊HT浒RuN…΁)TVH(k>'egp@ ?TB}??ɸ qP )?TA,A y'- H{IM(+ gF,<_;HH)Qfasvj'7^|lhfN6KjmILzD_K鞱)S_h,|Ҙ '3hT#䖒~tw9 #jCF+V_)YB0T O+9ps#fBf4R?r$0aHW GL#7u*0B"/j(26`I?j;@`c @;0h2c:ȫsMn>1Eϕ7^T@jgG7(\VvDbtVy [TkYJ솠dK m{C BMP!}e* =W3tHEƨWwY2׊Grby~ R@@劆>]CH?8HMECϲ=9dBH >&N\{kt ڛ!u}f_ µ.gd_ (w(o=Rs]}^]>!xDxCQ g0\{| Pl]}>(|0G*:IT]1^$@=yH]1̮LƷ(AjIC[ӳon3% T}Wdlӣ~1 [mm5V 蹛 ĎxD/0`M~Fq`!v+?. C V[dClށqHz:g{a'Fe|#! TpլxUL0*/8B2 o:O 7^5h͌Vܾ&3;T0@.}6r=0_FE/y uIP_du,@R} 4H62œDBg *OׁvNNIϻ3oL~ܥG\#%kLb3Ah:d'ߕ]G\/Mrdua]7H p jt fe/ Z߄,RэTU52CLҵ{* $orVhc Ew` ;`o{)yRw;,[z|`oP É? tT^ǜvJn_?(=H6pՆ!utt :ޣk\e;~HUW Ecg+ hz >=m9sJ97%`>fg=GKi*>[qhV6rk!ɖ;@F;.2RRfrTp"rۤRpNR / M (vo0Sev<-t~/$v-Ѧ3MKjًi?1HK M2AW.>iv\ojaM7^ :xZRG {RPm37B;JJ':]] (_}04I܊ѶpN^8` L9PG}{*5 پ ⡏ &>-=es5ޛIMjh=pLKy?R#H׀bgm?$̨}H$T֥p+G9%ڻG ^ .(W4=B @^ɶep{#1PMJ=Y;emH.NӖHЂBG۩F-&ݽ'GkOKv=aZX6_Z\@,[!טW.~ f:Y\$~ ͩKo[FУ`]_@@[H? Ss1_U^y_hqs |@@ET>Ts%H5GiEcq<6dNH9[ئVmSy YZlE$pb^j\):sux6JGe=[5Y<6e=hE@0Z`Fz`% 2y N޲d(jbrc^Xqqѣ 6c5[pTp%;ezZV2>ǡ础}`; b#~Hg{)XTp!]b[-x7݄ 6r W_C y1Z-Дn}S[6/(>3&7|Oꯄ;0dY(j !\&yiH_gKY S94 TBd| ʢnQ,2H-#B=b$@EF&pee-6ʡG` ?BS CG&n{Yw/ȌE;'!d9r;2 ۹bV G#!j%0c%*~$|(9esV T|h#% ĄU%ߥ^(ӠxρvVŵiH Jbk (ӝ[Z8뎩vMB:2;LA:O@y" 'VMUNTL1&KI PG@y<\53vˏG B[|bfv (`=h&hhTP3sʎ!EA*d!( ا:F@O 41~@s,=jifi&5m1ܦVIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/step-out.png000066400000000000000000000145731341747546300225540ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  !xIDATxyյz_g@Ad5C !}!1|>>DLD#> F0yemgzzߪFpdqnu~FZ={%:"}eSQ jd(Q $z@EOjifi&5#\Ō(A{3;!wAHA4K34$hDip'fHc[xB]-{K5}&Tt=pH+R HM㯍Xfi<Y :[.BE?d4<@苐/@J hy8AFYdݧ#pH˪+L-D׃ъ4T@{>\u3TpZb` \Aj?ox~!-\= K jk \d|H8ŀsxZ BSC*ءx!_ w8!-ICyN8cK[x"]{) Csʡ :ÖՅL%Z7^MC(NYZ 4}h{x7!x@n- u$ y|[h) S2=@WLt/뚃TU%\%;WQvp}&<^T=@ro-x _D8cPlh;0cD3ω9 r  .D^.c6RM7B8=ֽ+@d~9 ݥ@ 0<y9V N޺pH?{zmnH X~>=q 04{;LBxMjI~V%NK@B6BN`p50Nlo҂d-pKua>h:?4|B灁GTBd6 -sOl;hY Ԝ爼T@J i3NT)y'[osEU ] dsΓjkW zhp1yz@ӥ߹>aXS@?.qu*?T`w] A3SG۹ts IU+w?T sHv؄ CR.67w= ɏD/ટMX`3u,s?\9A2:Pkh Yl!6SG j8I>`MtY 6\@HߛWPvX:(9;go׻y.svķJH[2)Hu7/گ9l . @ېh_wxRF{j9ܕwq 5;rJQmӐh%J il}jzȘgx ,w C 6Au]$F}*iXί%MJW0RkxWsXh?< 5+cCU²,+DAj:rhA1Q+Q3wߙ.XϚkI^*=jV\_{Zӡ? ꧦA* 4f%y]VV C~KguSx#Vj4bn~ 3rqX/TyUU@`+Gpx+E-p?6H[S<=giBF:7 ׁ_֌ Tv#rNP0"E7"TJþ+2ELh1HY )sj9=)d\L] ]RF8q-T<$`7ނ,3ɪ.9}瓱vil=*캘WrF^l^*WL nĂBFubM /ju<uy>w^EA.dƋ:hp7O/F^D;>H6 ^k4ơ(K Ψ9R"22BCݥCάwKHEf<{4ʶk&-GĎYiUmE>?zeFH\ p cd\52L}cԃHx $@c8 b}ǘ 2y6OWm3/A(eek/WϾz6hY@|4 c:H ?lskR3 )ÞГ-'19*7A,l9'HYw>6"R{,nIyD_K3,}d,>sW>dP"@ DcM{}`My9gGe#&*N_Y'Bt3\9(/^Ū#fBf4#Uy$}w}fn;ވ$FnTj#1_{jҿO/⩍.WiiTR6 Wp@]lAT!uMf,~x7z1E^.sL,37t9վ6 )3xiX$>"~8q +س.L :i%[vCP'/- k쁐Gu˅TH]PH`jкrX@+Wqƭ#IpN"tu0ry($ߞw\h(%D_gV 񐇟`@ɗؘ͝xp)( #9*/5d1zQ|a^=tў%|;3lTgrHH >&ɎEgLǼrJQ̓>@yZWwK?~?.#]=WZ|;RlwZun/ -80,cW_{@WPH=x2P妯'rKZ [W=~s:xsg▴ x8vH]uG1EM?~͝ml (j1C[/\%Su'ಹ%93@#̇Hx:w]!;v뀆ܚTttfix̳Ў!fkH#}bE1Qv+Zsx;eojTJ dDC67f>Q5t>Ĩo>zbR$@'ە4uojR]`n(5~>RwM+,bпzxՠu# h}$gH?rl``l=lW*c>^(c uZHP_du,@R}4H6r\Dg *OׁavNN}ܥcwgߘG*GJСLg|: q` zUz)GVuMgA Ƃv`-^,RэT5Wd@u{z gz=P`˥E<;`w Q=d]@ב*KEnU9f~ 'n tTv\\vJv0(=H6 CꮝD5x' vD ̇?R-" KWps c95ĖxzAN f9sn\mv |OfiCʜo#gHݾVlT0|xr 3(%e N'wiI!Wtj\nRRPjH{6xTӍpmJi9Z瓌oa>ۆ\&)t|KF+pkZS^N@ zo`m" w9lφu V0}tuP9Ӓ8jW]K>jܾC:yP4:丣s"Uu}02I܆D kƓbZ8`L8PG.*^}ڮ.`c>ZM=|Rhyc)bѳ@ <3ʆܓ$TD]p+G ~@]ڮ+D^w%Fs?F(X+ǂ#T4{^w4:DR=E=?nzq+a([`ՎUmӐl岀)ѼJ~@B@9ZZ/y{}yYt$ͩK;밒+y9J34}7y $A"X'\S^y$S[m ZK>}%T@>Ts%H5泋JXmjٜP{>PM<8;ڼԄ,mH WrRc8P )!q m0׷|dg"x)A+}IjݻDK"<'%f ?D^L.E'ҍ`o]X2lhxlh; b{p<'tG) n6ۘ75[pFSJIv O$qy` ؎Ljg@q7SKh-, &B/.]B {>\u3*M+>">T)S9ݹ YYȺNnǪJ{BfOi=YI:Oid Ok[!&@Ȗ^A_Mjj >DjVe{tˏF ;|bf'.!(`ݼhfhIP Pr!EB*d ( ȧ: AȾO 4>z@s$R 4 MjWhjpIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/step-over.png000066400000000000000000000146451341747546300227200ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  (/2IDATxyŽǿwf @("<"F 1#x|Q^bfFAL0/Q<ŕQه;s[z00շ΅asU_kH>* = AA2@L$AEϑOT jj*]VIx_bbc $? wPspwy,(pyy2{B!3R Pl8fY1pHRoA9`% K,g"m4E`¯@ )3Ҷ3vE5.O5TWa QEoi^ٳ)CyOMa lUNbl1d=^!x_@w[rȞH] w,ᐎ8L 4 Vٳ)JGiN,^j{_sa {!k!Ҭ99 }1nD ʖ̘ 24= "8eFjFji&]{j=)=`s=` =$;V C) ٩}&jr^/휃Dy\[ޭ 8pl[&,T@|os@'U`kZM8Po7v07sDSYL1 E-ZKw>@*! :"z-V $kְpH?? tPk}/g&@3(Q ,y7{cUHWY=)yHwD%@2:\^i ^G˦zj)YHA-}T1`8f 0?Ƙ_z0C 1#YQ_#%i(O-0[~P>?yJ;@ВSeK`w;) HjRM 5i{*s+2nvD9]}ֱ bS<@Z\G+wڐ2{B҈n wSg6td; lZ^7ȡj@>84{;nIеn bSp'z/|D!yk1UIC iy/sX5PwjbᬜJ ҈o3+H*F߁wkfA遬#jo["g1{sT'w01T-pzǑ4OmC;3+jt1ik Mm3܈XG4AJsij{XȢ YX TBfRԑHԾ \ j9TB+4g*E`@¯?DL@dm:X׋4+TϷ`uWTz|0 ᐚM^8F-F}` >o% :Q߶J- Wmޛ՚@75 RqUyHoQ.ɣe*A4ƒ[9}]\ވ tm17?pR ʘ/TMxT]@`KG谬pb+FM??pU|wg\ӚSݐ/PƉ{s-PUhS55 B9wzyJ8 ҵoP"C7eaEk fF(Gݞ )2ei B/b-piNeX9,bfBGVb!o$.bs{!5`5P)P:_gIC~j [颛/reMN6H/R)/vrqq6\-@~Xxpe`1v^|JW53Mu\E*hKNtHH{"(|5騙2o sᛌ N/`>P >%eЊe+-iLz^\XR6HI:(AxEs#?D ꀴr'! nE^ЪXĜ ]y,=4":̑b VK& AM݄e2X&r0)̇Lȕ }2FKODF@0ބo+RF~9xyEse൱ VHe^\C!A`c|ȏ`Ab 'JhXʷmI̎@ c.t|b 65 I:PR#FCrN +Tͥ_)6~@rƛtR6~TA51nIrH2m2@@Y!e83+S#G͵T۞$T.,%eG&d{+_p2Њ)4Pj.OQYwwL#*)R R-c!c($ G͸1R?*fH,?ҏB@)=|abF=:#>֢Y 8Jп ?,;R:, Uuc15'a]O#MȜ,iݫP_p4@N.h9u uW>`)F^T(G >lL2z{r~Ι8FʅqR~bE6.?dV r@V_bV1=VЫ✽ Fۆy3+_v,vϓrঠ̦<>|l?Ҷ3=(/BrwN!5 @OϽ.}qsUnѫo@ͅ$[:۰nlܶfqoP6:p (HَMF? ϙq9ϙO s@Q70A>;bqJǙ߲\ܱ|R6ݓ*᨝C.n4o:X1o2.;NŠy9DTl2:p߱:uXF.64mt3qlQշw,`؈Ǖ Kfd\8m)QyƮ☮=D,d|˵gb͂',kB%{.:Ϗ//X'>/;V:Vegsxr!*x}!uVN"q 2upǦKcٜ#'/3/o }l pV?e2Wv_1u?T\qV3j'],ĺEg0=^(|?|r>=짎}!{t3P[RU.QM=O !K7#sGe嗞dz˾] V l !uy\a>sFڴReKTݐjlwV@JImz&]˗N W?toRP ͌V|\eu$cH l#@~m5x2_FE%aA*'+_@Zz/Ɋp s E[*>هteպ2lz7^{ۧ +\#`@&@F{oRWE3IV}K;Y *Ov"U/OV_R5 K.Nu-#r سĶUAv/Ҍi Cf=9|q;ztJOV` Ԉdu?FƐH^PX U@COJu꺜 ~0C $QAkD+#80u@g$Ce Fa I-\eb-@74K)/" Fe;R Ժ~\(gp\捆f~dP,dT/*ES*`iTs#bM[*M R[m=ᄽc*0\ˁ2܃nfT-pzeVFmaO0qD;xPy)jiᓪTXӃpUKY?R#E@tl18FދsW頶?MT@q3SQN}?2*Ds+3/Ԁx}pzOz#䬕#P J᙭坲4rND+#B$s hN!ռ}}=YKVw5 :8GK ]>eXX:u/H*yi5^gp5[.)7#6KO52WWKsn#i~mp$Ab5,cn^Fu֮AԈKe@WU}@o>c .${݅#ʈ߻y113vbP ->8{ާY  Ϊ#I^sٻsP-Xg(,y7kI.@&CAÆ)j9Dg&p xYڼkރ/5[Qdz y7M?ߕ}"`AF-[ArH4-q`XOE\n碉y̱4e!;̘d ")K=B,rJѵi￈/C wOwnjD=i,8fu;&hϫ!SvBq5LەNH'T 1!WjNb qJvC=T 1Brgn^OTSTk3TX(1Pl3ʎ!->* = AO 4:8R1ظAEϑOT jj*]Vb?nIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/stop.png000066400000000000000000000204541341747546300217540ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  }u IDATxytՕ?U]IH}񾂍76b@2B$&ɜd!$& lVf16mݒeKjת oVjN>}߻O1morvrf/RSmCR#Hja#p~*hJ5YBSjK?ӥXxp$HoENmCNmF4Z/\]Fs֠yzOfO4޲V(!'>őXQSPzǠTɆ$>DG.+i-iZ)d'-D ?%cB{ %hrtidVJ6W gK8cX[ \D&x) i_#a/~ddJG lHWj_3Im]ֵLpJ6'ζ~gKH"iSy,Xe/ҡklH{rnqF_綺9N2Yn"ِe*\j}I봡ٲH@de֬gLMY:+I} o iO-|?J|ɻ Aw-U (P9dZ=l%!lT̴@RgrhHV֧>{cOw#;n(> ; t0xQ R :!HU܂wW$n(޺Ax~;NIP<$W)D?2 D]Ԣ $/4R!=i ȯ  !0Ty^ҼZY!o k{JlI.Ap8,'[gI!hHx=?YIb(*s[e>kjYK*&I{bpB37ְ`f*!.Rxԯ FڄA/{b`J/̳GWAx1y;M=s2" HcSU ߄lc*_G m2*[|6ڟzj^,& wHm2Sols5 M/ ܣHhTpw3{9a 0]v[Uj5D7ɡ#1>|R@oD5܅m3ajCj˘"o{ + %DgoUL,iy(j)Bawr\XFtPj+'YxjQHjg'RJ`Џd Yj_sڞ9EѮۑ2=g/COU k{FUH |_hdHchmșƞb ㈶5LHî{ꪧsKI}Xd.ԆܕK˾dC[j}vG%9:GB곐F#mp7JO iszWAld ,5-S_ϸ3@06'Kca#==+ny2 ĮOP4F? 6,'S01ISv[!<?@)! RB0Oz)M7OGO@ko=?pH52xG4Xq!- hG0.gviZĮ'A Z݋㠖UwH~G40Ay(yknӼҝ$w]7.@t}u4IB>G($ .:1d-gケ*`دzΒ,96G^=?-g};'wE89QcrӖ?ݝE@o]/ܭmeQu*4xFwH~C"+=ȅCD wkI;_J2Wj5 )$' ެ-osk"/F#-"_*>,g_5?L4Cj!}uoj!d:h|Ny\Kkosmnl@{%$L~Ia?A? ]JP5U#a%ζMsA*SYbm ǐO! Be ~5dc$[T>%᚛&wT}5Gk[ 320wUC?:pV"3(7Kmoo#HnhPD#0$`Z{fك՟U%=W؈5Ͷmܒ \~$=PYjf|mzގ iyp$e]j8_ѹxmHWXյඎ2T^5}{4iد?m}Κ~>c^Jbq|YX +7ᣍ4|,zڇ^c۞6>Ȫ-{{yXO6@_O%ѸT\egOds51ꐟ3Fr!x\~GT o棍F(ӆV2XiA f 7 enFN,}'fՖ&n=&j6R,Oۙdm>=X"Co9w@A>DM4"r騐*UwEZ4jt/^Ŗ6J[<}O/%UzX@P.l]ֳ3 J舿lHP c9IO~y%ML<~/<{}5&c[HKa[S;<.i-H>es!7-n)7WvvkeHGgv/ۼl#T [@Մ|KV#+~, Yǣ~LKΔл ^ZzSڇ[v(]-1~z'YU~/z F_׃PG2+?W9C 9Btg|ƣ>>UwԈݺqw+z~JEGS-cEhoasc[FIIhHW>o~J*"TqH\ţ>&?\#;.̛k őX{8v!g G-|NNY"H{zc,|I|^7KV`k LcL#gCOCK-~NγWWxwg;8?z?"wu4CLb0%pCbc-2ǩ8p)RTG<S=0%:d%]e惐!= u1"arDq_=.{} jAUABuBQ>c8n3GqOM??{| ,D"5 2oNYk0ȍҹTbf!o23;R֕7} Lo}4]Ե@ G|t2r1qn*7%SGRPѣwA穁hE(Rz` &ix]g'Uye&lϽtVEU5qL7|q󦏥& o+4^dá'@Z&2>/%Sz_qU%3ͪ9櫳'XPJv+?@˿km%֙ +ϬmI #; ZR-Uxm~r^Xx"k]zZo-K4hB2))8@?'<RnC]d!{.$r6}fZ OVuKO\o=H#dkH<RUh(>P,x3%x[[cY4X)I:G~pU#kNc5'$,\>_!? A&LgMMJ_.I0g<'֌,$w@ZKAjݿOcꊃfM4j] LɌCp8d%$I-/>֒LgJPj$)`Mls}qF~^$.ɴ ʩ~Rgz]$qhG[+ɪցsA+:@\4Ph~ɪB1㦹#2Hǖt_[-13Э'ygֆ1u.[%j0ȍexdIh}_kiBBzRh sX'<2Ȉ2&*3Yq$62 ^ qљL2'RNUk A^4@%=-ƣK-5q\=UM \7sWK}EFԇ~8{ YU3ΪWfX E ^S~gv9g4_4E.}-Ctp#inYУYԯ]< Oϭ?j5!?7|q<3&6Cy<iG_}O{]˥gsF/r#?:}`3wqנ'КR}T ,)cviyxyCđzO?R_h?.}i]W3(rq_}QxR]fʩu8 ~!ZE=fO<0Ym jЫlt"`,'qC{݈r8)^uv ߜsv& 1cI19ƶCd-_="Snw=[/;$I()fM I0HkK[`U}ʳx tMh L֔r\=m,YUC&Hf.qEik>䖅RNqybp /lg;rOq\7sٰՁL!+LɜL? g,va'J\?X! ~yk-~k\Ү{1'pɔ^ywBHuRtn‹j}+٠-IcH/ll\ݿF*\e#Ç GLe݂_R+n02-7@vcYH݈J2 RϠ%M$‹7 Of|IGxc߻j*Fn_fo-ՉVwf04<ӡ[ {C\$e+ 27z+GKX߹UO)@ܜ [^֋0UcoOW4 ?4DJߜ /gq‹uCX-\Iy;IKb`=]TH3th_ɩ&~#9LB-?\#~.@UC GD|! Rq [mYo(w&LUކ?4LuHN7[ gpm@ðNHl*2}*qv osݰvi_U6 n{+㝪5g=o6z NJ݃ȵs#{m(MfHlp!eH)|3$ÆCr G_PrGxljJ? v;(LJ\у_/9rm΍ҫ(mZSp)>}ꏼkr2yG{]|?H6{BuZB5%s>9-xȃbhmșV1ӆ(_i-`$iz: =~ٜu$܇/4"koդ/]ow"%w®_"ٛ*׿Mx~#wA5P5p0~^j D̤ޱ?)y"³(; ]6ZJoy^gr?Dտ(UnNڢ.> ?fn<誄A[i}K=). !w^Nѹg97J *gyÙi}>K!I'Ǜ?Ɵ (K -<8[e>DU;NAxއ[&AekYgC*e?e$gJ>hA@z0~Z=%w s t!q>f"Ck] Z:or1]gsxi^2 EctOw &9&!>E}ep<ԛ%FI-ţ; ѻK}n ]2@0d\Q,W8 ?iKO:t-ҹwvWI/!M1 !@K2cB.kN@ҥW \?Xeq.h$,%8_kOdyYsHUep3Ʉ,>?;d3/W>ƴ/:'Qbo#g g:w֓ \H73 zUPwu`#wXL`IDATSMqfm%[upt,ǑX#9jJ4T)F-G [#Gz+rjrj3r &Y=GݑmHBAEt}mHjIDJ<)g M!PRn1@k.IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/theme.png000066400000000000000000000226651341747546300220770ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  4b IDATxwx\ՙ?NMѨ!&@(1-?Hɒ6O6@ ,i$@ !$t"۲zigd[w4g}ϼ}y{$ W!:HɡOI )#iI,d LޣfaD+HF.anLFA~dNeTK%}6uu&cFLgHý;yprtvԡ{F\XXRp&⅒{9.FLd~IT"Ut<"L 9˘@MLgr_@ʽL2 ͫ| <%I MyK#L^dd@y/,W <)mc+IVI9[%<2`GW.% 8(gD̠x+I]W+Nl_& -$=/}:$־"t[VI^7>k^1YI(JG {N7޲h7p.M[HcM-l}dŽ9Pq((7|aa-*!V⥟^{4 ,Ogz LpDR:XKV(\m=Ҵ4o`ZPtOw AǃȞ*8X=:7  Gݘ*>c k ~ ]\lmD]T/M9Hhr3;5_l7tB[?!fj5*+MH=[H, Po)*|(E VWr)! lR_RWmPe@]@-fp}JJy igp}I BB^`@- A;PM^k~8N؅l)9Kaֽ0o(Jt@9>\N\Es4oۑPGek eQ"Aϟu5I9i(pH8Z>)wOeՆMזž?SX*,@pߍy/b)? M";``An`%Ѫ{x}Yc+3P Rb͑zce hu/ ,Rz8%m}LCo0 HrA"sm+MHϻ"' {72_v΃?ʏ $s3 ;IhSrH|=9_9jQ=0g,a\NaG91CǥJ @sBX3z5m˚fKaeT5m禡{ݝYEa1)[Cy7K+kePȤ 䩠$z~:tyK ~FOIZ bB zE&,PՌ^PR`=?!Cjx:Iԩ@D+3ٵa{8_[VU͗yoִ7D ER38#~vukDzcIC-TfC\|f$v1nH# Be;et޴d}$52&k*؊ _?p&[52CkvBkz‰KK9$sZe}}m} F:ؚ^Z7@ z%|  ?h?1E4׷56_@G?]Xl*;g o RK$EgZ.2m*:y]p,,.O}j5gpˑsGrJx쐆֏6YTrqO^w/n'OPUԔydfUH)' !@Z'/Y0d*TI-9y(.ޡ'4"l2rA57Yª3m@Ǔ ׽[lmXN<zj}>sܛ&[_=`tT@Y/Syuk3869 г,e7<,{c9*@xKQ!5G?9|чo#j)|U&ͯ{ٲ ٔl\~<֕`ƇH%59>!6]7ȋ F#w1~r]67tM$X"%+YwS M7?ܛ":P7o/d $RukҕsF~z{w{Zz1Zє2srX G%O:=% } /ݽÀO\1%A:D\Oxu[t+K(\y|ѷ54 O> !(,z9>dIC99D{O( PUN+9r_n)%٨[:v^!KNL";>#gaVz"ѡ>PxlfWYRTT5*ـNlZǘc'9ٍ{^Kn 'R χV/mE#pa)EnLlNgWSp+ɔT2sllӑxqDR1+k?SȺ3Yrv3?:]$/+8w;8lİ^%q"1Ú귤 RȒ9fBv?H<}>SQWSD/"Ê:̒d0=:>~$%9Z'`<)|q2nB 2=A:)ig_h<iTPW^8.Hgx(8Q9fY'Hw؀NLXI .vCD+C8lO{ l%I"KG8jjI2jJMd[N@8624lI{X+6"ztb><]L d݇J^MPkEVSSIev5ՀT:ڨId 4GO%R(H[iRfWl{><Ǔ v=`7AFN"9!GIeh0YWZ6bȚvqwD#d"n2$I"TPU5+?gQ JIT$cI^LcGD#z!ha`XIEMj<*r;XqZ5%0myek3o܇*pÌYH͘LRZ7I,.]9cgί&RL Se;G #봤Ϻy6fS$&ȎRuS]L2]0M='';Вs];w*v㰚ӲLDg_$qPqYLL론cYBb7v%mHez 8gQ d[ͼ̻YG<(Y'IfOK/hV51kr^;`@yz3ޜ|YU>.[%5te?ër)[gċ^bہnJG^daIgξ"\vk:&mbY/.B{6ѿ@wlDτa.DV-:sEeiVw4ޛ`F$n\z*F_`e(?/eDз:+1 83rrA5w9IfoK:,Y{:m,3UM ,V6伥r򬖌 F⼺M TyTst9aZ9!vmO1x̯-rċ|N%uχ-[gs;_73K-I65ڶf՗Us9i$ [zx}P YH)*lm曷}Y X>Kj9bIuTUo{Zi`6IGW4qY&R6rrʋ ·$dJe.׉jff3YP[B< V\v B@8` 'ȁ~v6u'}d~xe_>*q[Е*ɨ2nolmcrtoBzZt +UsY\_.7@{|t=-i1EI$S}:h-o6f6ǻ 6_*!qљ(/r'X̬;{'<˷?u! *qKU6V {AjBRQ_Q8bbye˲gkWPqm?()Jm+ur  -͆:~h,* Ҭ{&mv౯_Ǘn8#T%UV/ԛck ,0H n;5df9ǯڭy'masÅ=WZƬ*$-d!_S̍krN}A}f\Eu[P4Aab?iK6ߥWϜg2d՗;Y?eg;@?B(J8 Re Ղi`,H/F)p>#AUk-n_tR͚.A PyUy=]VD::Mco[8kᩫZqp:_Rwҿ˽J2mB`9oq-9;7;#AߨXp!pr?o8 ξ0y 6t{[7v{DE,]?]=#4ǣw|Z2v KIa64w_[rKljjIѓvނ,AutUG"8c$y1fWeS_,L2#|W/K;X75ogok RTfz%Y:{3?`|cV֗xf>j˽:q-8ڊ`,`ϭ]SL7_ FMf96HýDA͠'Z#OW}k|=d&B*(LJW=I~%$DDf>x HU{{#i7rß'Jh){|Gpyუ6q[?wݫlUɜWɔʻ =`$u AŠ\w"VVuنܷ q5$A 􋂃7"tV"]TS(ۻxcG+:}h ƉƒD)Ъ8m|n;e(2bktkV4^}{-m:=`?ɒT˔TCuCn@T'[&% Q&"l&J-2TGrh 7:n:> &LnkOw'聗頾uZQ +qC ]3(}PSZHi,\;*)Q|HBj` ^ ܅R *."zbtTT)y8j?17]KOg2mע?CSGI?8&JmCRlOD9{!R=^u>ΊH)@̂ ^:~mT&7;uQ7RϿzhs>˿N1kNpH7K#:PA-Q! 'Xq.QscF E+0e0 |) /THh=eT kRA8[@Js¾`)̺PY;nr*3!r DQKOiH; {緑pv/l.*NݠJh5u˜*S)=[D#fP|^YSh#>j5Xf&ҥ {CLM\CZ^PD;*2aI/$VN HDžHjtn"s.ڼk΃п@MLح\@ 97+]6 o/s1xVg8i<]ڨm}lFrb_U4/%hoA fp%`iO)-~@dV%Kc.⥟x_ w@{~9=lLViGYZ&C`lɞ>G&@4 hR-83ڔ&n]4+gYȋH׫c eɣ!V9 y&C#ց'vr])&!HL*<ޢK# )l/Li8$n ,=osBH"fPx\8$W(6/;2CnaȉV>ZR5yS&k8 K,OOkJq,#Yx%I9 &,b CBz&/IE$W*YtWݾssv@ []Waf|y'Dyk&ۈ7n܎٦DI'--6Z?˘iL I(: i ~Oz9Zakٵ1s1{aVHnp!詻GS/IJ:K` P?p*K&b]RO=W`*iBGR#$\H5/ށ%xKf-ɇ# iN>M x&la%_3|pHTITn ,pCֵ|xr5N.gi=w` Bf\*w O.z)…tL,Zo¹a|xuN.sJc1֠ ]і5Hlr58guD#ӛ޻nRD|m.#{HOГώ_#4?0ZO0=VwpC bPۯu@vVvܾ^!8̤e\mEc;k> !03l0Fd; ҫ!26\H`g 0]%7ZРjo C^ 2sz/By\r]̪4}`tp!ݩm]ңk-ÇC P;fbA!ZYUm@i…ݾ@w݌$?4 #S܈L_g1$_=_5t4K մ ie|d%y$h8 +/DOGIR{-l_LXH3&}i9[>X}d.?\1 {!ށ'J{anr!3yʂed6ʹͼJLH.| z]h/@;b&= AtnT02-Wy,ѷN:}tz9toW1/|v JfnPt7Qq&V@eh-`mvl;l!ğ+Q@Jz4*_ |ӆԕbO@keG4ٽLVu\(b`g殊t,c6KKjm7G8d2Y+36 50Ps Y4l H@DQu.[-/AGz~=ͻ*razcd>HzBљ1&˪h#P0qUB32P6'/$T;U=VQm{+)tL8,@])}wY4>tä3 C"ٻZ:Qc [r%PZͿzy;l+5; ?nHY̯o#LVQ_U``wɒCj 9k(ҚnEC= FL;hQMgw5gI=T-_4WGZ]PQFcRRooS1-7ǻ5Uw+bM =xO|aS7 lN7o:~MVo8O݊Vakx L]_Yȑ>2,d98jNUZ)T Jv/bXzϬ@e|J.yЄ(nC6x=fڂd^x _{5`5BTH`ҿC-óX ? >KlZ_r׋z@dc;.$hej`L8uh-CNzS|jm;FSD0IJiH/«2|rM9RO @O;/-;7Q u'4*&64Twyf|F!GnM'9U/]E4oY#1?lHS!!艧zN!ӯTWn/42[͂kt6|+^sK5G:6ttr#%XRWJU<סP;ڣO%$w<%e%(OJ V37,!(.UIjGq8SNmAǾz?>@^ >>dS  iM;KWr77-&v0Dfzt@hN! Lo7~΁(%H&}e0:K'㨤B>7CMPfO 4)7eګim5|.߁=ꐪ^w,+EӨ Om,.$KW9^kWN->e<9~vt wm>1=XЂ>Y6]ȋ'Ǝ&KxoÎUoayaY9<ϟ2rEC/; AjnV~3r; j~Bt]'X|O8׋{iKQr;657%s~^^=7WGkdG;˓e0O2o[ܲ|>ǭϚMf |L:')9 qɭۈ,x}Za%|Sptw߀8hm4Z^1h ,͏{ZĒy!8RB`< P :z&r[PYdE[y,g;ґ̦xsR@G߿v=;Yh.4'}BRJLU-, |j'jN4y$7_t4w{UG6 UH˼|NOgIsG+RM@{_iYXHЅh)>x0|CCJROo/rN}j0cj76u<߆g'r,ά؆"OKr~M3Ve^~0@e.]k+ȎJtK/6Hi"}ަ~HU Bߟ)zf0aД ;]yҲ79/lfC'3d`kV }JUѼhh*=54!xVzH%pMܺD3(UGP?{s]7kE:,|^PDY7TbZ09cמc֗!BT?܇{B)w~;ٟ^Ȕ[et×1 hj ;rHR`௎;.X!m kMT"Hs}sq^w(ݳع|i~[yb+rWj?PybB5!x)g͟㸦Nr4ǺJ2 f ,@ዔ /*>{?"jw>4:7\{5_?cY]N-.>i>!*P% c2( >K*D[ڹgX>@*{J`ILz9-W.30סT )@vM{HQm_Ƴ* +ʂ?G VMW+&\$b&'HqE Th_BmJ՝oڥÃ4ٳBV?B$ G1^t Xb+xW;M2ЍS4M &fOܹ{:9 /Tbj5Cz] D|xḧf/Ao_>:-Wv#q3F iU[,v;jXy\(INXu%jҭ7 +d!%2zXylt(e6lE^@i`l-Y֓Erꋊ*W/(Sa(k?MU %۷]z.WHSJ)~C(yѡlW1}Q+V'=۷Sa[/Gxs0R^ђOgD6'/$T;U8RdjY~ "?}``4@< k#To$=e!QiT%ޖF䩲 ՟U [m烎0}қ|+ҨWJv/U#b>EO_=rV 1{G7IJ3Iyd[2~}TO@)T|uʲ!l^fbW󶒞|3>c6ɾ@-Qш0ksJÒH%c oɮ*Q t4jLEdi0{n~Qˎ -ף'.E(4 fpZYM=vz]БIaL7.m%Kx.1 ·smU#iSHAX*!ܲT|a%K{aƮ8=LW>nF}Ž"-7V=*g1$_BGi$vðۺaG&‡Cj=q=`FVR&x ʆ[ O񤗍נjo რj/q3Zʇ[ڏL7Fge&~YB=줖= 0d΀\ +!]ER m}RD zkf-kzD=5Z+2c[BV Ź\ɭdgpI E- x|ZoGˮU< L2Ə=Јz1FcT$Ww6SGǥ%b]8F߃PpE$_{ $Gcs ށ%q))gv|Bf"%0-R/ӘBS4:z+&k8<16ke*3/sNH߭d2X7Q,=cG>A~ӊ?CO<靖F!| T7X86 M><0}Q>BaT76andK xoI/G+_A_Ko Y}0rZ%[#=7֢eסeFwzxAqҰXXtLcf`UGv! tK-߅o{5f aƷ1SIhHQ- #=w^Z, m6b̈́kݱ؉e׍HIENDB`mu-editor-1.0.2+dfsg/mu/resources/images/theme_day.png000066400000000000000000000233411341747546300227240ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME   U  IDATxwyݻIZzGBI %cCcDŽ.qb㓄1ؘ8?l 8hA4#~woٽu1 j;wܻ=s33VBN6#'Z}J@RGOr2y&_sa)EKH'~j>>  Sdx r0r rP2^jbBqLξ ic0nFفl3Us1c&c:\\Ӥ,=uwsd ziRB ]x:^Cg-~wn4!i,M84QI&' os#5 t;ֲHOqΕF-#g@({b(:ֿZA%J^c)*H.aoK=} y GnTQhݠ9{ KPU؛~gZeU>E(QIDaXX8)v`zp۷ƇwT@3Je@k Ooţ fIi i}i[$%0saO wQ_5hKoC ꐝ8/rGJ 09 ?MY\7A͏glTs11OMҐȩ94T&+("BkZAoJ4h7QY=,D%ˡا[+;,fqZL2z5oIJ)斮W u5Cj$t PPƿU,[>?rʅjmGXjVd}$_T>7Q{XvR~ /e7OF}j+HQ6!F:%PN6oOF0ɧ7( {3Ԓ;RO(໩i`wve9$OɎZh&O|(ffәY5m.ڻSoR'zkɚU7)֮W:OMOd  ˲UJ~}c3/I4(i,=KɱvlS[SQuzc >?̊M5UOĭL_`̇54?6Mv` F?:[٢dXH:#qV3`/o;kuٙ?ϭfr<9/#f?IEl^$IkSUuN>aO#+7bFCQ>sl&h=d{٦g픐۷ Shqig(Y"-ys NKY: fVs;^[ƎP1TO0,UlPX4đ<1YNkm;vWL_ZX{ pYĒ|Owa9+OqN6k Qbbf^Z9li VB,DL)î% S4[ ɸOI'6ofbywQV] ySugU\N-@ZbHv8&5;IB᭣}8rv6+c›ETj<ۅ&}q;ऺtU<96-drfT14<ӵp#:ƺ= :N7vg>\@xK1V t@:%6]3<Olbh LĝӿN'$s;̝T/M7Κ]^h&P22: 0ȎkR!6[Zadn߸b弮+ϯj]@tkOGg υ0 Kf;ןʂ!Vuy?b\:'ێ'ZNO݇;MhgIE8ɿܳǾsŐzL,呿|I%Btr">i.,2*9PdX|&_2W,|~:Vm=25YÈ>}xjRӗճ3d/?Ţx_?ݵ;/Eи/9U(qK !a9Κv>R[B7OH*̙PgP2VOP =F͒X2㋍*Y2ׅу 5:!iVTC|U[scT!ȱ[L39N)'O-"T:YtNέb΄303uAj9A}˙:w-G ƍĒ|}lΝTF:ɼIeܶx:O.߄.m=,[ev8XxL[c;Pt^UTdnqQ*mɏoBBj901E~cBrX3Ú֐:VL(cGL(*^ss`=ZS"g+?/LێzH,RAyAfxX0YU!8\pL4m Ȓ48kw_u c2IgN**fo~Ra3"BhkȰǏR`u!S* QTäM&U1DQU&W 5xALkH\|9TzPNYUPVqI8,TT7w]9n5s\%5@,[qXOr&TUifNK*96+7pT"\ܕS/`Dͩ'@*(sk+1ݦ<)ƹJM [Tđu7L&n^|mӡm$e\9DRebݸNe&%tjRw.qǥ3)wՄa5c3+]d[̈yCQ%>'-1l )N%'@F̣>o"cGm5rzP<}TQT*\p ^IC?gn% WNr0]/E=Yf}'OˏdFԸ>^˻9VkI$bd'Uh<ı+6-;pU?3nӠvzyԶN(.I=1b % =17dڂi sz-:5^#]GOJe kHdeֶ9p5ђs?;i6ϭƚ$`h$&Id Z!/}"Xg1}!;*$nC-T,Kuigm]=4uOL%Bƽkra 7m!$xԶt]I[Aw8zb8m'/O.L@&Ro 4akqNf̎u3w}d vigq}ً,Ly:/l{}=^-ÜRԵugm6o:V$I c٪]T?œZtFCM~^`m=gNp&T { FЮP{H$~eʲDG?Ẑq}6j.Ez!3rHLU/ml3+7p+!ifCM2-<꺳 TrZZ= bvo>Mݨ1d3#CBq쬧#l*I&qj b #v}x]Ŵڭfl{j=u,l/vk A>96& t5x@QEBI~:+12vձb!6k'W,Ûk18+mm 4uqK(i0or9[ͅ3+؁zȥN-:@ Rmi~[:bʱr \1hv7ꍟѡ[̼L,㦯LMNkw6}gբB\+ Vp? AjljZ0Soȁ[tx.;H,Mt5 'iXIҢ~&* ݜ7nڄvY8g cF?"h,w,\2{,K,i_+7utG$omv0"߰j;[ih !u۹pΫf2Vq45&=R>= ,>ą3+pf%Κ6}i a1ZL]oo[gL`ۃ<>QwDRem!sKZ$ww> > pݾj9֑.b5;SV3mNO9 tdk5PZyWp,3A\{|y-ϯƞL&)ѯ%N|]/\O&Y9'|@qEsq:@W竨upZZ$ҽJw@R2'@,],[/?w~!&Y#+f٪]y_̌"Js,s;p,X&Bo4?=.vncV Z:Oc.YrtZHt~pLb4,KQVoeZKFzi>zEIrutMVr2o7Nɐ:;MP{3YK8V]N9 /L[QzM}ƜTJH=<)R瀂Z=r\3}[.$I)q7^4yL,rƒ>3mk\j`a״O|9mv }):J9'I֤6]<W6k"O0orWf!zXsW&WJ v_`N-wRi~a 9F v2\TpWQ^!HRsqӘ>(M׺&/ԝ[&ŨXPwo|\u1\~JںPv*XpǜJ n}byfOWm[L/G_V@~hMJ )\J:5?2l5J95a]_!d4dDJ͉?;M%a*vMW W% N+{NgТk7VrHcGNG miP=J_K)0tHO}.!8>@] Hߧ|!uWKhRIbIDATx¡kYIO Q+ZvHI opCAV }] ϕ8oP*ĊGw7GiZJ2Z bW-Ċ7a Rwn)9BIaoBa$!r Å$Ro rH\ӥhC z%DpA}H'WAbD97Hܛ6J I~mM*n%AKiԊY #hӦYXFBhS'KUhPs[(ɩ@hR+˵FS>bʀ̾C !Srb o ǟ".$ z+7VJ H"~읳`#`-5|zv Ps11OM^KP8F/)* nʂ58SOz+;4EENCHA *fOT%R>$)V<`֐r4,QmT*1|.CChz f)'R.! }REZ)[EI}B$aT G?`əˢж/8dNiJ_S ^N HBvao~sxoB [p1M2g݋afČXc_gk׍εUZ4aC %_V2Go aoW$5<'6jyEw LCk>}Bv-rJ+#??i% ›>>@+֐ԄU-DWk8Fao} s㡻k.Ei h2;^Cv{ %4# = [Hm|gjx0X ]+!]JNb(0ln5<ܹO[~)}^9?, *O. CRonU`'hs!q2L'0 uw.o3Tī3q a!BF?A8<p<AT鈚lcHeՕ j{P{ւy2وX/)g,@* jP;WC1d'1Dl1MjgH%2+8C012>d]Av1JFt0m  !Aʁ`eX!l2F4-h{CHp+ՈX } aiJƜ=D\M`xhjB8jme3fE%mϫ`"] eɂUPЗ\(&ҵ]Е"@[hMwVA n3 [PlР=^4 [$=lomv0'~&ޔB-@<i]x /](!oO ѵ?_'2007>%f`0٫Ǟom0| r:`X*17~ 7ֈP"0 G=-D,8穻D ":P;:w[ƪ!R2 ]eMu@;@-(z! iO%`}>[cta˅ XR {te2C R躖@\܂u@ @֬ȥ*pږƤ]m̐ ևN^"\a>Eb}u)N0*j< ֛ye1T7SϿ(F aHyv$ŏl`2Rc?76Җgw9BM@S{S&T> }1zC˝`I *k=$H|D/~܉!v ;Df?(fH%ڻ6 f_ L9BA ͷ+ dɒ3QD@UY/}>`c?14-Ip?q&)&b~Pz E:W_un$Rs8}UiҨ( ~}nZRhzineJ޴ִ8I 8VET~EՇ"1zh?90$Yݻژ ޷qho#Q])+.wv݉Z{<g3|F`"]Y3- tm*xz[9IRM02_(JݻnrMn[=Ew:}te}]vW7g3UTeMMXwB-(N6|+ڎԵaNQ [ (D|oUˆ4X v`;Gv AEc+]e+6#bG#n~}!2A8>H3y+^Y|G@;~Wd!Q1בC6,cImi8 /|LUU.Ɇِcx6lcB4whw׋,vvb''.Ѕ2)eL:̜4 GabUl`'߆OCk'XqyhyB+LoM,_HvS%4¸珟&MP;ƗSq}Ƹ21 |׎?ن ;;O陷6b\e>5|*H {Z~kȚ.M -qMxgc=1sҰOFϋcTYrB3fRJnR钙0?SG`CbƤkLE.3d"?kv`Te,R]Ro^B}m I<Qײ ΀^,m7zeV8<yJ nqx3w؊~CwcF%Oþn> 'o=hCvΟZ {|+9yd^<vэ0َ[/9U~Z資0ˠ E{a~D莺5=e*EsWKS{9a3)%dc{U`4IYU`ѐzRGS$ӯ*:;>qD!nOݰO3}t=]FrRUYyiwެýWMDdLN-8Eq)@4Dʜ5P[E NM21 xԮa)>U 8 )t$t9V=uڮ؎ٓ}7Q돀ظeHZqUNjvR̙H}?AJ 곤W__5ϻ`'BXp*̞<\mW]%tkp\{lnW7aph` dПwOC)ړ,^ BGs'l,IW)liێ}b.v%? J,)o-g>o- >ĖƪMaW:6'ķ?*pژ҄'7~^I&R,|,JK*D `tkNSL fRFA,H&S&Z*B0R]-SH)!1Dn1y _4Bx>Rp` h!yTYUTS'hv:ʉE򄔧㇀K=Ɣ*tq+>ىHTzQP]#OHia`RZRS&TP}ϥfہv|n3$ >~(\,a(s9E"6J%W]N$x9H=ed+J~KhDlkkpE@x`g?6. -f2%*l!O?-Zһ["o/c3HJ1ZH",iDZ{kNQUد oSS>jz )%710gR{% 59\| 2Mn{~s#!ƈ^ɿkΙ{:SC7ݤ bCj32+Ygӿ:FZu0E )99`M)}iг&-op&JKLÐ)| MZ]s&&tm58 zs5 SB:HnLxrcq)`ʨ,ϷEs?\7sOITPe#Hzw^B˲T =x4g3Ną<ʢxm> lQn;_z;I pM1j[Lj"޷(k$Jv`X>ee3`7xBk磺D"F9TaV?C˝@΅1#:VoQP{X> sT,/2O\~]fڵ h|nS"TٟcQ#:؁:h SЪ9X ZeQ`7؎l/:WSF'T>u倝9z}S{!v"'PC9.$lڪQt}ezWJXCN/|fC ŚD拰+3} zii1/оHŶ !*WT۫ IiF#KqŏƥRK(OlXٚDlD$3*Ai?c<,\4)~jN .ٚ<-x 0oA$CI?:sTgׁ[Fiaol+L R|h{W|clLW@7*~q\GɺqU(E h|'*+"% g_MnQ3ZORO } ̶|&i::8>V e[޵ԗŴЗ]@jd(OQ(Z^ui8:/͗ g3QTZ|@ݒ:JQ#@B*G!L f0)wDkagneF}GjHaL(:qX tTYr1 EI9/E2 Jil9ʳhzςUwg}BQ  QI :튢AV8xw1*@ʂ@=o-Rsp&{ȁSV$|Pp"Q_ʻfp&R&bí#PP{8ط=.{2 H8\(9tq3p`t*UEB'.}FmLI ~`u@CBJ 5q)kDF8R0aw/ X 6*pHAY`brNHJ`Ҳ/b¶ rۀU$AO騦1 E&-5)UH@S]XC/.>#;QI*1HOW '}R nIDKF@* `$^SY@ ^~bhZ&8| (@%} -|Gl LZ^o5h%(ȹX+9SbOML' :w[n5D0ăf CD۹ HMX-`9,StM@ǀ{#Sv+_}ɰ!9oڟ*# Or2`#@< x6 MSE ,&{M ^ &0ZH@W0ȣB? ^x&aM z_<=D<8tM-4ŀ&PY : V16E]B@qE8%EmrK4 [`WJY,~]׋`CP a?S &B!*hzH DXW#l.]AԽBXEӌ Dl͓U6@4P;C ©G:a0gɲequ 4+*;Ԕ!u Y0[e5v99JT1Dl1okIDATM͘s@z;Ԟ`..]eE20͸6/ γl%ssu Y˜;9qHmulnn DS5ciCN6o>} U`7T`Ks!GR[K%^u`Cqb 놃T"~tBّH.FF:D>c`b.01O`H%a} z sr@;u]IENDB`mu-editor-1.0.2+dfsg/mu/resources/images/zoom-out.png000066400000000000000000000203511341747546300225540ustar00rootroot00000000000000PNG  IHDRP/bKGDC pHYs  tIME  0, IDATxyߪw]W(q F~1% ~F3j ąhnD ; 2=o]& 2syxxnݪsse_yݝ0qQ" 1LfC~Hpփ mh<CxbYjcTHՕ ZZh}}oiv&xyeTHڝ{\DZhB;$#n1elv'B*Y&wTuoBX `SOtкׂ!a`eu^ kVBYG+'.`Kk }% iJƜD^ ]+` djA4 D3fUD%CMo}`NdC$K.bTHڻkip0"@_] wխ5 @ļ'DHȠ=^2 Ἓd=mB }ײv0ƑRl o*f T @`gZ7kA$ZK2*IZ'$60 (x7/%np8~Ǟ}R0B(vN4V ^ ~R+KX3"`,^~{n&'>IM,ƤO<]omZg"VG3! tn%{S㕤1 CEMCu@@"-k*z! i'`cS9[cta]+ XR !{- eW1C R:B^܂ ÀkY)UZ. I-9{!N - |BuE@/}@2 aT|*Ew57ch"$o%PpwU1a% 6H98Hx X59OJo]lW4 MIP#T$,L@FLͷ$k/~#BNOGh{# Ή`Nds15 &J0@=sUԞuI5'`(RbjLܓXA(pLW!K&Ǝ`)5e]q>xvx!W\E[%@`wbcT.8@s"ƛ-{1P5(:KšURn&R@tb=W(]^?PHN0`s2!%_I/D*TW][&1͞4=|>1@%@*%X`䲄֞f軖%ZI4Ըܫ`F- e*,)0`ˀZrj| @Wб4|.KDPw>@" H}fbh}@ް2<䇒468Bt? CosA;񦑢UEFi,CۣkIC+ ,qR$U@eZ ]  _s Һy)NŒ+N}t$1 F~"M)NB%;H'GTdˊ4쑿'GoKi)B'݇_"MUʓD|yXx +HZ w#,P:y@eҦ!/߽R}I]׫ *5TD|.4_Pޡ7Wé b@cb6 `$%z=]Dʯ|.IJ )s?qCsh_p9`6j&1pE}G+n!~m9bUuoZkm$i\+C*'#|=0Z}78K;{yu`A+@u?OSwRӂ];p͍vZ}0|F`"֬bg]G۳fb*fTZP e @魊{M^ݴf:ww$i0_٠mʝYSh#1]P_\w>RԵa Ƃil–eb4 ƀ@ūf0 zDWQ]0捣;bqk>ӛZM:\2c,~2kl _%]a`(9=^wLe@9~5UqmytX q(0Ot֔ˁJ BhE,ߟ7#ۀu[jeS1rU30ص@LwwKҘEiFm=aHRֆr,ŷNzʢ,ǔQŘXUlXM?g<ϔmMs6b^mQpuU:9ᠺdjO}'[1)e9,̜4GabU~`oG[Kk><̟:Z$?p>ElOHvSe4O%MW=ƗӰqe8}\-8 y6L<'^*QUT&RA~pYY:CC@tټ^ߔgӂǯ;+о4iDqd>FH.'qK+wi*k&!(P& κsĽ<1fLzw/?o\x}neB._ {/>6k,ރ@]Aҵ,`©x0S(2 ; ->I k )TJNh#+ƌF6Nnþ.Ǯ31</zr?Ŋ+R6G 5OY/C`2 aaioU.+ɢaAeYi ]Sev6P{-J gAҍQ.(RhB:Dx:EϾS]Y'TҙcǏ( [)so=[i !Մ)5Y._v7ҍu4YOgOJا.O6+Rhʥ(rKy,R漿UYlcJKN^z 2:Se#:JH?ASoܓGȪ=.] oF=-H{LlG_>{T9 FQЭKttp`MdПwO}'OS"y'Iټt釉; `vKO2!L.y"Y tpl'ӝxRw2oP}܌K"EmB+ųF~ڊ;3[fȉ% B=:Ӱ(̶0nVX]!%mGϤG \v1Z{[Z]<rfHa6R&) m< R S JLzmށlDHT&O02Z]}-9m$i#.߂BΒgKM .5- ~/5arN'T(PtT[N, B{yy'˽͒'#G٠5p+_pO~d.o;_ %!VAC4G0̧-jS6-W 1 hG>Q&PaScq|!t 5FMc2!&,zAyplqӅ'! F߯UBҝ%|Ҹa{ $P&M`7wRt=_(̟:L Z%/ ֬205\c~=cB9v: gčGx<b^4hI /~~6gbB&[sONL럒9 1}@jLwc" POSF Ofy.zꙘ3EzwO@z6*8Č'|_ߦwExYӀg]~ /|Mff\s8GY@p$m7sI KY}4^e4RJ<_6j{m;^_JYpɌ1=@})qP\TTCu[4objߺ9?#&"0mu+X6 sT,o`?dܷ|=s50t) )E?^FI 5 uԷC #4,Z6yYf8-*v4KՔQ)՚:rN|9z]S{~u"ǭP%.${Qr}eVJXWM—=q&lpձR6TPպ-0၎>%x9Ԓs7QF&F;Աi@t'ӝ7M%05=rmA3$+^!΄QioUԁn&$׀(]wA[c|R=K/3}zީiq?ж2>~Ŏ!)WT*IiSGwGfK}Z15Yq+R=$We3*Aiߛc<,~ώJ"M `~R3ze`4@*IiҎv>o$׆P9Su^Q+jE`*XA }rp~8t͹aAGg]J8ܪnU4;め k%f_A|РvG'KɾVG>4HP~5CD\;2Oޯuԗ0]92Ud$OUwJ4{-*͗Mg21);du$@b*G!e*L3A [M5@j+^hY$+yH 9\-\vV\9F<Xzqhu3)eW0qC_DZPA&XPҮ|3A4}joNj h P!Tp[KԚ]Dr8Ҫ0+HԗGnYɤR0\I8쿖ڃ[UuAt)y/Ly rE>fME֩\y(vDnL Cju3GAX}Wv 9)\ % )-%g οUzC@9(\$ \#l cAV`u~`/㔎jʬTtvҜXX_ub٠2|&v [gC_yGR;Rp B:ß^u߻ =O0 <@>!bj ,ιFB* `$AW`RXE@ ~~bj\Op<x@%}-Gl),Ϊ-16 l,% (ȹP+9SlW`3fW;wS`bIȑ<(5TΤ*C>$x:`O)Gi9oI| +Pr3?] b>e@ܗxibJ9"卐VӁ})4>4tVHYAbl HMj. 4f*Z$&KRظa4BEJr^VtCC&P ^,X S޴-5NG(79r͠ "uOkh]W< g\[%Q-uy] DB?|23`:bh}OnC<-2@p@_>}"\xLA;c=ə`r̃3TttMINXA[Poa?b n&'>IM," zM-eYg"KRA3Æ5X F&8gSuWك<M٭kF$ dÆV54ixz0l'AY\ :Xo4;`qVˊ nل^!e`ҙ(ѩ< 0 FyLv1K"k%YH]K O>x`ua8+EC0h(@¢UyĠGt(6'D!IAnI{Z!w ٲ@ۧ,H-T%iDB8Fʞxhx=D^ ]+dkA4 Da;s#yډ-\+ pZu^>k>]Þ" #5S)hu;˝;yy|6}-Ewwn-=ǜvFہNd[1zZr΅ @ϋsm4L L0R ;iSب<1 Oo-9~!uփL ?V1m v66*Gv`W}B靿5#hX iuA |EP`jT kIt)8y\!_螻~Cg0Pr[u 3xZT6W>4ABmHN˃(̡Ҝ,6=4b6-4x0l+yxSBpXE} L^y/.R× {F@nAIRA:e޿3]&HI鞙_|)k7s]p~k#Usm>| F-ũ 6  A2 <76{7ŵΥdbJqn{e[H06h|tyo)R%Y{->9:FE=sm@/k_Bw*#եhbvE@;i K( ɓ?Sh#ԩyGQꁨsZl|?2qz\BY {dOĕ9pHQq;:5SeWyGԹ> 4bدH=zdE eXf|` eReΛ,ݾJGqr4eg vC5XZHbو2 ]3=L)8|淯pTB#d4QvK_ 5X;., J.Гh¾L` /0L[tIlD)lU Rk6Q8m<0V!ބ|ȦG=b-~%J ఢmV_%\OQɗ9N^3E "V`3Hڒ)!,~I5X'ޥ:îو"Ѡ%\Cn-GoI+uGoFӿ~5]R  5Z {d1x\& &)|`\hz?i?oTBIJb|LC\h97rr2o椎 8 qLgD_PWP!8N3ʀa Y;lغ:-0 KwFA3rhM5Y}B@Tmj-g!AFr/LSR8XѳvW5ZYʎ m1:p& wRASGGBk.TBM7ќkMa40ȷ)7 \`T(w0dbel~`=JPdڬN,ϱ*wr6>WEb2>`=Y4PPM0:2sWpѾUةpۨ; eCg=Y~T&NJ;Z|+t)/PghZGDԕS*=&yÜ4F^91z8kpan:n7""?ÙQyZ̀Rv6%#+u=C(/ҁ_}46%»8^Qeb3baA،BJUn>f `wLEHUTU#હ7NfMFadm !RFȸ!&ާ%ڰi4!u|MЫ.h%Ѕ2łzwzdxMM"ĘڞXtc4v@ 0Wݤթ;6w;b6F VIENDB`mu-editor-1.0.2+dfsg/mu/resources/pygamezero/alien_hurt.png000066400000000000000000000054001341747546300240300ustar00rootroot00000000000000PNG  IHDRE\8TxzsRGBgAMA a pHYsod IDATx^՜]k |P(uJC4ŷU. !wPrSH mF8I_HݪZ()rP]HGG$gwgtfg;g?wggygf,o%IC%&@9ߡK:]ulZ!ԳGخ~H *`tg&V )# q2e0$#2ʄإL<X{^J (wTB99G~Y*:Q# b˄ƈ  G/EB7is~]^Xgby_(Ssʋ"f7 "(L.ĕT ¨1 OTWH*ܙK1 rե$a[effs˪k$`;sPs~&<+>F4ts YcH:̈́u#Jh^:0řvKeڐX`SM׃-H)[~Q2 o  P~$x—i)̢W.~uWKӝ ^gseȷ))Ll88r.)sɫ9:]t_K}>ji;0lQ]K (y&u)& `T=Z&6jLٗGߣ/@uI1^m,Z&\bW\'7v򹛧= s ;UO+lT:.]9:J⯤PV"w El陂7ji đEt^.3˲ N劮p1SeشO\/L%sB Z.sBf ֹ64X6u4x)n}ٽ(V،UZri]/co.̓ R#劮sJR!h'73 Fڃ6N^G] 1XoT W?GAt$|ylE[ ٭ٜXܖjtau$Gtƴ meN“*3u86:t$yEt?p,`uDK|%Z$c{b:s6O(bvE\+1_}#UfBT0gh08tc%EiN9u.eu:SK}*SS2~Ơɪ=zyQ;gS' l:5S9+V?_.SbMq)+k;zBfE)s 9 lGH+|aeReOuK6F/})k.j&9ư!sS7U$۰lD{-IO۲{>kgaft"JclH]6 1 9){B:hN"\C(g@O"Znߎ)9 sEr XP= ߑ ֖ƞvX0'v1\}?h= p',J_T'(r1ZF,؈|mϜUY?0Oݶ?]?h %&ZYDpL~r eoWV&ҷمᱰ=54vO:Z|+~i}W (JP8JG:P@&s#2HۤscXQt@e1&᏶UuflEs$Z'#oߊ!JA H-$^s0O.tUpD9 T]-}Aȫ[X\+Rm>#Q6$FU~9D2{C",)䊌)|F>~)8jb .rldGxl4Ɋ#p!!] +Zc 0 CL߅4S\OqLуP/"kLn^"Ё;,XPPG(k ne{ T͋5>(k|PQ&7/Ln^3 ( +5C!gdeMƳĩSܼ|4bP_ Fgπ֡3NyةLn^P #Mk_Yn ߮Ŗ>3/n1hY{gLc꼱s0F>uȁ{5o:)J(ӈatމOeIXݼD͡|ǝk8&uD\ʱJcLd%;O:3&L')3pFy&qêP]g ^ٔUG1G#\MJݴgnau !{հ+OcB"&n U|sfYt TW鼏tPwRE7_FLe B;RY2]7gohbE%7AoPEE%yu{*ƫ[QeIi]GzPGL%L]uˣ-[I%?IENDB`mu-editor-1.0.2+dfsg/requirements.txt000066400000000000000000000004061341747546300176400ustar00rootroot00000000000000appdirs beautifulsoup4 coverage gpiozero guizero matplotlib nudatus qscintilla qtconsole pgzero pigpio Pillow pycodestyle pyflakes pynsist pyqt5 PyQtChart pyserial pytest pytest-cov pytest-random-order>=1.0.0 requests semver scrapy setuptools sphinx twine wheel mu-editor-1.0.2+dfsg/requirements_pi.txt000066400000000000000000000004661341747546300203360ustar00rootroot00000000000000# You also need to apt-get install the packages listed in https://mu.readthedocs.io/en/latest/setup.html#raspberry-pi appdirs beautifulsoup4 coverage guizero pigpio matplotlib nudatus qtconsole Pillow pycodestyle pyflakes pyserial pytest pytest-cov pytest-random-order>=1.0.0 requests scrapy setuptools sphinx mu-editor-1.0.2+dfsg/run.py000077500000000000000000000001251341747546300155330ustar00rootroot00000000000000#!/usr/bin/env python3 from mu.app import run if __name__ == "__main__": run() mu-editor-1.0.2+dfsg/setup.py000066400000000000000000000062411341747546300160710ustar00rootroot00000000000000import platform from setuptools import setup from mu import __version__ with open('README.rst') as f: readme = f.read() # Replace the logo URL in the README with something that works in PyPI logo_url = 'https://mu.readthedocs.io/en/latest/_images/logo.png' readme = readme.replace('docs/logo.png', logo_url) with open('CHANGES.rst') as f: changes = f.read() install_requires = ['pycodestyle==2.4.0', 'pyflakes==2.0.0', 'pyserial==3.4', 'pyqt5==5.11.3', 'qscintilla==2.10.8', 'qtconsole==4.3.1', 'matplotlib==2.2.2', 'pgzero==1.2', 'PyQtChart==5.11.3', 'appdirs>=1.4.3', 'gpiozero>=1.4.1', 'guizero>=0.5.2', 'pigpio>=1.40.post1', 'Pillow>=5.2.0', 'requests>=2.19.1', 'semver>=2.8.0', 'nudatus>=0.0.3', ] # Exclude packages not available for ARM in PyPI/piwheels (Raspberry Pi) try: machine = platform.machine() if machine.lower().startswith('arm'): exclude = ('pyqt5', 'qscintilla', 'qtconsole', 'PyQtChart') install_requires = [requirement for requirement in install_requires if not requirement.startswith(exclude)] except Exception: # Something unexpected happened, so simply keep all requires pass setup( name='mu-editor', version=__version__, description='A simple Python editor for beginner programmers.', long_description='{}\n\n{}'.format(readme, changes), author='Nicholas H.Tollervey', author_email='ntoll@ntoll.org', url='https://github.com/mu-editor/mu', license='GPL3', packages=['mu', 'mu.contrib', 'mu.resources', 'mu.modes', 'mu.debugger', 'mu.interface', 'mu.modes.api', ], install_requires=install_requires, include_package_data=True, zip_safe=False, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Win32 (MS Windows)', 'Environment :: X11 Applications :: Qt', 'Environment :: MacOS X', 'Intended Audience :: Developers', 'Intended Audience :: Education', 'Intended Audience :: End Users/Desktop', 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', 'Operating System :: POSIX', 'Operating System :: MacOS :: MacOS X', 'Operating System :: Microsoft :: Windows', 'Programming Language :: Python :: 3 :: Only', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Topic :: Education', 'Topic :: Games/Entertainment', 'Topic :: Software Development', 'Topic :: Software Development :: Debuggers', 'Topic :: Software Development :: Embedded Systems', 'Topic :: Text Editors', 'Topic :: Text Editors :: Integrated Development Environments (IDE)', ], entry_points={ 'console_scripts': [ "mu-editor = mu.app:run", ], }, options={ # Briefcase packaging options for OSX 'app': { 'formal_name': 'mu-editor', 'bundle': 'mu.codewith.editor', }, 'macos': { 'icon': 'package/icons/mac_icon', } } ) mu-editor-1.0.2+dfsg/tests/000077500000000000000000000000001341747546300155165ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/README.rst000066400000000000000000000013001341747546300171770ustar00rootroot00000000000000Mu Tests ======== We aim for 100% test coverage - it means someone has expressed an opinion about how all the code paths for the application should behave. THIS DOES NOT MEAN THE CODE IS BUG FREE! The tests are organised to mirror the structure of the application itself. To run the test suite, ensure you're in the *root* directory of the repository and run the following command:: $ make check This will run the code style analysis, code quality analysis, test suite and coverage check. To just run each of these use the following commands: * Coding style:: $ make pep8 * Code quality:: $ make pyflakes * Test suite only:: $ make test * Code coverage:: $ make coverage mu-editor-1.0.2+dfsg/tests/__init__.py000066400000000000000000000000001341747546300176150ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/customhextest.hex000077500000000000000000000000171341747546300211440ustar00rootroot00000000000000hexcontentstestmu-editor-1.0.2+dfsg/tests/debugger/000077500000000000000000000000001341747546300173025ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/debugger/__init__.py000066400000000000000000000000001341747546300214010ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/debugger/test_client.py000066400000000000000000000563131341747546300222010ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the debug client. """ import socket import pytest import json import os.path import mu.debugger.client from unittest import mock from PyQt5.QtCore import pyqtBoundSignal def test_Breakpoint_init(): """ Ensure the Breakpoint class is initialised as expected. """ bp = mu.debugger.client.Breakpoint(1, 'filename.py', 10) assert bp.bpnum == 1 assert bp.filename == 'filename.py' assert bp.line == 10 assert bp.enabled is True assert bp.temporary is False assert bp.funcname is None def test_Breakpoint_str(): """ Ensure a string representation of a Breakpoint is meaningful. """ bp = mu.debugger.client.Breakpoint(1, 'filename.py', 10) assert str(bp) == 'filename.py:10' def test_CommandBufferHandler_init(): """ Check the CommandBufferHandler initialises as expected: with two signals and a reference to the debugger client instance. """ mock_debugger = mock.MagicMock() cbh = mu.debugger.client.CommandBufferHandler(mock_debugger) assert isinstance(cbh.on_command, pyqtBoundSignal) assert isinstance(cbh.on_fail, pyqtBoundSignal) assert cbh.debugger == mock_debugger def test_CommandBufferHandler_worker_with_connection_refused_error(): """ Check that the connection will try up to 10 times before emitting an on_fail signal. """ mock_debugger = mock.MagicMock() mock_debugger.host = 'localhost' mock_debugger.port = 9999 mock_socket_factory = mock.MagicMock() mock_socket = mock.MagicMock() mock_socket.connect.side_effect = ConnectionRefusedError() mock_socket_factory.socket.return_value = mock_socket mock_time = mock.MagicMock() mock_debugger = mock.MagicMock() cbh = mu.debugger.client.CommandBufferHandler(mock_debugger) cbh.on_fail = mock.MagicMock() with mock.patch('mu.debugger.client.socket', mock_socket_factory), \ mock.patch('mu.debugger.client.time', mock_time): cbh.worker() msg = ('Connection timed out. Is your machine slow or busy? Free up some ' "of the machine's resources and try again.") cbh.on_fail.emit.assert_called_once_with(msg) assert mock_socket.connect.call_count == 50 assert mock_time.sleep.call_count == 49 def test_CommandBufferHandler_worker_with_address_error(): """ Check that the connection will try up to 10 times before emitting an on_fail signal. """ mock_debugger = mock.MagicMock() mock_debugger.host = 'localhost' mock_debugger.port = 9999 mock_socket_factory = mock.MagicMock() mock_socket = mock.MagicMock() mock_socket.connect.side_effect = OSError() mock_socket_factory.socket.return_value = mock_socket mock_debugger = mock.MagicMock() cbh = mu.debugger.client.CommandBufferHandler(mock_debugger) cbh.on_fail = mock.MagicMock() with mock.patch('mu.debugger.client.socket', mock_socket_factory): cbh.worker() msg = ('Could not find localhost.\n' "Ensure you have '127.0.0.1 localhost' in your /etc/hosts file.") cbh.on_fail.emit.assert_called_once_with(msg) def test_CommandBufferHandler_worker_break_loop(): """ Ensure if the worker receives None from the socket then break out of the loop to end the thread. """ mock_debugger = mock.MagicMock() mock_debugger.host = 'localhost' mock_debugger.port = 9999 mock_socket_factory = mock.MagicMock() mock_socket = mock.MagicMock() mock_socket.recv.return_value = None mock_socket_factory.socket.return_value = mock_socket cbh = mu.debugger.client.CommandBufferHandler(mock_debugger) with mock.patch('mu.debugger.client.socket', mock_socket_factory): cbh.worker() mock_socket.recv.assert_called_once_with(1024) def test_CommandBufferHandler_worker_exception_breaks_loop(): """ Ensure if the worker has an exception thrown from the socket then break out of the loop to end the thread. """ mock_debugger = mock.MagicMock() mock_debugger.host = 'localhost' mock_debugger.port = 9999 mock_socket_factory = mock.MagicMock() mock_socket = mock.MagicMock() mock_socket.recv.side_effect = Exception('Bang!') mock_socket_factory.socket.return_value = mock_socket cbh = mu.debugger.client.CommandBufferHandler(mock_debugger) with mock.patch('mu.debugger.client.socket', mock_socket_factory): cbh.worker() mock_socket.recv.assert_called_once_with(1024) assert cbh.stopped def test_command_buffer_message(): """ Make sure that the command buffer of bytes received with a terminated message results in the expected command, associated arguments and the remainder is correctly populated. """ msg = json.dumps(["bootstrap", {'arg': 'value'}]).encode('utf-8') msg += mu.debugger.client.Debugger.ETX # Splitting the message in two ensures remainder handling is exercised. pos = len(msg) // 2 msg1 = msg[:pos] msg2 = msg[pos:] mock_debugger = mock.MagicMock() mock_debugger.ETX = mu.debugger.client.Debugger.ETX mock_debugger.host = 'localhost' mock_debugger.port = 9999 mock_socket_factory = mock.MagicMock() mock_socket = mock.MagicMock() mock_socket_factory.socket.return_value = mock_socket mock_socket.recv.side_effect = [msg1, msg2, None] cbh = mu.debugger.client.CommandBufferHandler(mock_debugger) cbh.on_command = mock.MagicMock() with mock.patch('mu.debugger.client.socket', mock_socket_factory): cbh.worker() assert mock_debugger.socket.recv.call_count == 3 expected = msg.replace(mu.debugger.client.Debugger.ETX, b'').decode('utf-8') cbh.on_command.emit.assert_called_once_with(expected) def test_Debugger_init(): """ Ensure a the Debugger client class initialises properly. """ db = mu.debugger.client.Debugger('localhost', 1908) assert db.host == 'localhost' assert db.port == 1908 assert db.proc is None assert db.view is None def test_Debugger_start(): """ Ensure the Debugger client starts a session correctly. """ mock_thread_instance = mock.MagicMock() mock_thread = mock.MagicMock(return_value=mock_thread_instance) mock_handler_instance = mock.MagicMock() mock_handler = mock.MagicMock(return_value=mock_handler_instance) with mock.patch('mu.debugger.client.QThread', mock_thread), \ mock.patch('mu.debugger.client.CommandBufferHandler', mock_handler): db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.start() mock_thread.assert_called_once_with(db.view.view) mock_thread_instance.started.connect.assert_called_once_with( mock_handler_instance.worker) mock_thread_instance.start.assert_called_once_with() mock_handler.assert_called_once_with(db) mock_handler_instance.moveToThread.\ assert_called_once_with(mock_thread_instance) mock_handler_instance.on_command.connect.\ assert_called_once_with(db.on_command) mock_handler_instance.on_fail.connect.assert_called_once_with(db.on_fail) def test_Debugger_on_command(): """ Ensure the debug client handles command messages sent from the CommandBufferHandler thread. """ db = mu.debugger.client.Debugger('localhost', 1908) db.on_bootstrap = mock.MagicMock() msg = json.dumps(["bootstrap", {'arg': 'value'}]) db.on_command(msg) db.on_bootstrap.assert_called_once_with(arg='value') def test_Debugger_on_fail(): """ If a failure is emitted ensure it's logged. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() with mock.patch('mu.debugger.client.logger.error') as mock_log: db.on_fail('bang') mock_log.assert_called_once_with('bang') db.view.debug_on_fail.assert_called_once_with('bang') def test_Debugger_stop(): """ Ensure the debugger client stops gracefully. """ db = mu.debugger.client.Debugger('localhost', 1908) db.proc = mock.MagicMock() db.output = mock.MagicMock() db.socket = mock.MagicMock() db.command_handler = mock.MagicMock() db.listener_thread = mock.MagicMock() db.stop() assert db.command_handler.stopped is True db.listener_thread.quit.assert_called_once_with() db.listener_thread.wait.assert_called_once_with() db.proc.wait.assert_called_once_with() db.socket.shutdown.assert_called_once_with(socket.SHUT_WR) def test_Debugger_output(): """ Ensure the "good case" call for output works (there appears to be a working socket connection). """ db = mu.debugger.client.Debugger('localhost', 1908) db.socket = mock.MagicMock() db.output('test', foo='bar') db.socket.sendall.assert_called_once_with(b'["test", {"foo": "bar"}]\x03') def test_Debugger_output_client_error(): """ Ensure that any debug client error is logged. """ db = mu.debugger.client.Debugger('localhost', 1908) db.socket = mock.MagicMock() db.socket.sendall.side_effect = OSError('bang!') with mock.patch('mu.debugger.client.logger.debug') as mock_logger: db.output('test', foo='bar') assert mock_logger.call_count == 2 mock_logger.call_args_list[0][0] == 'Debugger client error.' mock_logger.call_args_list[1][0] == OSError('bang!') def test_Debugger_output_no_client_connection(): """ Ensure that if output is attempted via a disconnected client, it's logged for further information. """ db = mu.debugger.client.Debugger('localhost', 1908) db.socket = mock.MagicMock() db.socket.sendall.side_effect = AttributeError('bang!') with mock.patch('mu.debugger.client.logger.debug') as mock_logger: db.output('test', foo='bar') assert mock_logger.call_count == 2 mock_logger.call_args_list[0][0] == ('Debugger client not connected ' 'to runner.') mock_logger.call_args_list[1][0] == AttributeError('bang!') def test_Debugger_breakpoint_as_tuple(): """ Given a tuple of (filename, line), check the breakpoint method returns an object representing the referenced breakpoint. """ db = mu.debugger.client.Debugger('localhost', 1908) mock_breakpoint = mock.MagicMock() key = os.path.normcase(os.path.abspath('file.py')) db.bp_index = { key: { 666: mock_breakpoint, } } assert db.breakpoint(('file.py', 666)) == mock_breakpoint def test_Debugger_breakpoint_as_breakpoint_number(): """ Given a breakpoint number, check the breakpoint method returns an object representing the referenced breakpoint. """ db = mu.debugger.client.Debugger('localhost', 1908) mock_breakpoint = mock.MagicMock() db.bp_list = { 123: mock_breakpoint, } assert db.breakpoint(123) == mock_breakpoint def test_Debugger_breakpoint_unknown(): """ Ensure the breakpoint method raises an UnknownBreakpoint exception if the referenced breakpoint is, you've guessed it, unknown. """ db = mu.debugger.client.Debugger('localhost', 1908) mock_breakpoint = mock.MagicMock() db.bp_list = { 123: mock_breakpoint, } with pytest.raises(mu.debugger.client.UnknownBreakpoint): db.breakpoint(321) def test_Debugger_breakpoints(): """ Given a filename, ensure all the related breakpoints are returned. """ db = mu.debugger.client.Debugger('localhost', 1908) mock_breakpoint = mock.MagicMock() key = os.path.normcase(os.path.abspath('file.py')) db.bp_index = { key: { 666: mock_breakpoint, } } assert db.breakpoints('file.py') == {666: mock_breakpoint, } def test_Debugger_create_breakpoint(): """ Ensure creating a new breakpoint results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() db.create_breakpoint('file.py', 123) db.output.assert_called_once_with('break', filename='file.py', line=123, temporary=False) def test_Debugger_enable_breakpoint(): """ Ensure enabling a breakpoint results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_breakpoint.bpnum = 123 db.enable_breakpoint(mock_breakpoint) db.output.assert_called_once_with('enable', bpnum=123) def test_Debugger_disable_breakpoint(): """ Ensure disabling a breakpoint results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_breakpoint.bpnum = 123 db.disable_breakpoint(mock_breakpoint) db.output.assert_called_once_with('disable', bpnum=123) def test_Debugger_ignore_breakpoint(): """ Ensure ignoring a breakpoint for "count" iterations results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_breakpoint.bpnum = 123 db.ignore_breakpoint(mock_breakpoint, 4) db.output.assert_called_once_with('ignore', bpnum=123, count=4) def test_Debugger_clear_breakpoint(): """ Ensure clearing a breakpoint results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_breakpoint.bpnum = 123 db.clear_breakpoint(mock_breakpoint) db.output.assert_called_once_with('clear', bpnum=123) def test_Debugger_do_run(): """ Ensure instructing the client to run to the next breakpoint results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() db.do_run() db.output.assert_called_once_with('continue') def test_Debugger_do_step(): """ Ensure instructing the client to step through one stack frame results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() db.do_step() db.output.assert_called_once_with('step') def test_Debugger_do_next(): """ Ensure instructing the client to go to the next line in the stack frame results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() db.do_next() db.output.assert_called_once_with('next') def test_Debugger_do_return(): """ Ensure instructing the client to return to the previous the stack frame results in the expected output call to the debug runner. """ db = mu.debugger.client.Debugger('localhost', 1908) db.output = mock.MagicMock() db.do_return() db.output.assert_called_once_with('return') def test_Debugger_on_bootstrap(): """ Test the debug client responds correctly to a signal from the runner that it has finished setting up. Essentially this just means passing on details of breakpoints to on_breakpoint create. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_breakpoint_create = mock.MagicMock() breakpoints = [ { 'name': 'breakpoint1', }, { 'name': 'breakpoint2', }, ] db.on_bootstrap(breakpoints) assert db.bp_index == {} assert db.bp_list == [True, ] assert db.on_breakpoint_create.call_count == 2 db.view.debug_on_bootstrap.assert_called_once_with() def test_Debugger_on_breakpoint_create(): """ Test the debug client handles the signal that a breakpoint is created in the expected manner, by instantiating a Breakpoint instance and adding it to the bp_index and bp_list datastructures before signalling to the view to display a visual representation of the breakpoint. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_bootstrap([]) data = { 'bpnum': 1, 'filename': 'file.py', 'line': 10, } db.on_breakpoint_create(**data) bp = db.bp_index[os.path.normcase(os.path.abspath('file.py'))][10] assert bp.bpnum == 1 assert bp.filename == 'file.py' assert bp.line == 10 assert bp.enabled is True assert bp.temporary is False assert bp.funcname is None assert bp in db.bp_list db.view.debug_on_breakpoint_enable.assert_called_once_with(bp) def test_Debugger_on_breakpoint_create_disabled(): """ As above, but the runner has signalled the breakpoint exists but is disabled. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_bootstrap([]) data = { 'bpnum': 1, 'filename': 'file.py', 'line': 10, 'enabled': False, } db.on_breakpoint_create(**data) bp = db.bp_index[os.path.normcase(os.path.abspath('file.py'))][10] assert bp.enabled is False db.view.debug_on_breakpoint_disable.assert_called_once_with(bp) def test_Debugger_on_breakpoint_enable(): """ Handle when the runner signals that a breakpoint has transitioned to enabled. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_bootstrap([]) data = { 'bpnum': 1, 'filename': 'file.py', 'line': 10, 'enabled': False, } db.on_breakpoint_create(**data) db.view.reset_mock() db.on_breakpoint_enable(1) bp = db.bp_index[os.path.normcase(os.path.abspath('file.py'))][10] assert bp.enabled is True db.view.debug_on_breakpoint_enable.assert_called_once_with(bp) def test_Debugger_on_breakpoint_disable(): """ Handle when the runner signals that a breakpoint has transitioned to disabled. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_bootstrap([]) data = { 'bpnum': 1, 'filename': os.path.normcase(os.path.abspath('file.py')), 'line': 10, } db.on_breakpoint_create(**data) db.view.reset_mock() db.on_breakpoint_disable(1) bp = db.bp_index[os.path.normcase(os.path.abspath('file.py'))][10] assert bp.enabled is False db.view.debug_on_breakpoint_disable.assert_called_once_with(bp) def test_Debugger_on_breakpoint_ignore(): """ Handle when the runner signals that it will ignore a breakpoint "count" iterations. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_bootstrap([]) data = { 'bpnum': 1, 'filename': 'file.py', 'line': 10, } db.on_breakpoint_create(**data) db.view.reset_mock() db.on_breakpoint_ignore(1, 5) bp = db.bp_index[os.path.normcase(os.path.abspath('file.py'))][10] assert bp.ignore is 5 db.view.debug_on_breakpoint_ignore.assert_called_once_with(bp, 5) def test_Debugger_on_breakpoint_clear(): """ Ensure handling of clearing a breakpoint is passed to the view. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_bootstrap([]) data = { 'bpnum': 1, 'filename': 'file.py', 'line': 10, } db.on_breakpoint_create(**data) db.view.reset_mock() db.on_breakpoint_clear(1) bp = db.bp_index[os.path.normcase(os.path.abspath('file.py'))][10] db.view.debug_on_breakpoint_clear.assert_called_once_with(bp) def test_Debugger_on_stack(): """ Handle the runner sending revised data about the current state of the debug stack. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() stack = mock.MagicMock() db.on_stack(stack) assert db.stack == stack db.view.debug_on_stack.assert_called_once_with(stack) def test_Debugger_on_restart(): """ On restart is passed to the view. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_restart() db.view.debug_on_restart.assert_called_once_with() def test_Debugger_on_call(): """ On call is passed to the view with the calling args. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_call(args={'foo': 'bar'}) db.view.debug_on_call.assert_called_once_with({'foo': 'bar'}) def test_Debugger_on_return(): """ On return is passed to the view with the return value from the function. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_return(True) db.view.debug_on_return.assert_called_once_with(True) def test_Debugger_on_line(): """ Ensure details of the runner moving to the referenced file and line are passed to the view. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_line('file.py', 10) db.view.debug_on_line.assert_called_once_with('file.py', 10) def test_Debugger_on_exception(): """ Ensure the client passes exception details to the view. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_exception('ValueError', 'foo') db.view.debug_on_exception.assert_called_once_with('ValueError', 'foo') def test_Debugger_on_postmortem(): """ Ensure the client passes on the unexpected death of the runner to the view. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_postmortem() db.view.debug_on_postmortem.assert_called_once_with((), {}) def test_Debugger_on_info(): """ Handle the runner sending an informative log message to the client. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() with mock.patch('mu.debugger.client.logger.info') as mock_logger: db.on_info('info') mock_logger.assert_called_once_with('Debug runner says: info') db.view.debug_on_info.assert_called_once_with('info') def test_Debugger_on_warning(): """ Handle the runner sending a warning log message to the client. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() with mock.patch('mu.debugger.client.logger.warning') as mock_logger: db.on_warning('info') mock_logger.assert_called_once_with('Debug runner says: info') db.view.debug_on_warning.assert_called_once_with('info') def test_Debugger_on_error(): """ Handle the runner sending an error log message to the client. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() with mock.patch('mu.debugger.client.logger.error') as mock_logger: db.on_error('info') mock_logger.assert_called_once_with('Debug runner says: info') db.view.debug_on_error.assert_called_once_with('info') def test_Debugger_on_finished(): """ Ensure the client indicates the runner has completed to the view. """ db = mu.debugger.client.Debugger('localhost', 1908) db.view = mock.MagicMock() db.on_finished() db.view.debug_on_finished.assert_called_once_with() mu-editor-1.0.2+dfsg/tests/debugger/test_runner.py000066400000000000000000001034221341747546300222260ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the debug runner. """ import json import pytest import os.path import mu.debugger.runner from unittest import mock def test_command_buffer_break_loop(): """ Ensure if the command_buffer receives None from the socket then break out of the loop end end with a close instruction to the client. """ mock_debugger = mock.MagicMock() mock_debugger.client.recv.return_value = None mu.debugger.runner.command_buffer(mock_debugger) mock_debugger.client.recv.assert_called_once_with(1024) mock_debugger.commands.put.assert_called_once_with(('close', {})) def test_command_buffer_message(): """ Make sure that the command buffer of bytes received with a terminated message results in the expected command, associated arguments and the remainder is correctly populated. """ raw = ["enable", {'bpnum': '1'}] msg = json.dumps(raw).encode('utf-8') msg += mu.debugger.runner.Debugger.ETX # Splitting the message in two ensures remainder handling is exercised. pos = len(msg) // 2 msg1 = msg[:pos] msg2 = msg[pos:] mock_debugger = mock.MagicMock() mock_debugger.ETX = mu.debugger.runner.Debugger.ETX mock_debugger.client.recv.side_effect = [msg1, msg2, None] mu.debugger.runner.command_buffer(mock_debugger) assert mock_debugger.client.recv.call_count == 3 assert mock_debugger.commands.put.call_count == 2 assert mock_debugger.commands.put.call_args_list[0][0][0] == raw assert mock_debugger.commands.put.call_args_list[1][0][0] == ('close', {}) def test_Debugger_init(): """ Ensure the runner's Debugger class initialises as expected. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) assert db._run_state == mu.debugger.runner.DebugState.NOT_STARTED assert db.socket == mock_socket assert db.host == 'localhost' assert db.port == 9999 assert db.mainpyfile == '' assert db.client is None assert db.command_thread is None assert db.commands is None assert db.quitting is None assert db.botframe is None assert db.stopframe is None def test_Debugger_output(): """ Ensure the "good case" call for output works (there appears to be a working socket connection). """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.client = mock.MagicMock() db.output('test', foo='bar') db.client.sendall.assert_called_once_with(b'["test", {"foo": "bar"}]\x03') def test_Debugger_output_client_error(): """ Ensure that any debug client error is logged. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.client = mock.MagicMock() db.client.sendall.side_effect = OSError('bang!') with mock.patch('mu.debugger.runner.logger.debug') as mock_logger: db.output('test', foo='bar') assert mock_logger.call_count == 2 mock_logger.call_args_list[0][0] == 'Debugger client error.' mock_logger.call_args_list[1][0] == OSError('bang!') def test_Debugger_output_no_client_connection(): """ Ensure that if output is attempted via a disconnected client, it's logged for further information. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.client = mock.MagicMock() db.client.sendall.side_effect = AttributeError('bang!') with mock.patch('mu.debugger.runner.logger.debug') as mock_logger: db.output('test', foo='bar') assert mock_logger.call_count == 2 mock_logger.call_args_list[0][0] == ('Debugger client not connected ' 'to runner.') mock_logger.call_args_list[1][0] == AttributeError('bang!') def test_Debugger_output_stack_normal(): """ Ensure that outputting the stack uses the correct frame in a normal situation (the top two frames are always BDB and the runner executing the program being debugged - these should be ignored). """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() frame1 = mock.MagicMock() frame1.f_code.co_filename = '' frame2 = mock.MagicMock() frame2.f_code.co_filename = 'filename.py' frame2.f_locals = {'locals': 'foo'} frame2.f_globals = {'globals': 'bar'} frame2.f_builtins = {'builtins': 'baz'} frame2.f_restricted = 'f_restricted' frame2.f_lasti = 'f_lasti' frame2.f_exc_type = 'f_exc_type' frame2.f_exc_value = 'f_exc_value' frame2.f_exc_traceback = 'f_exc_traceback' db.stack = [ (None, 1), (frame1, 2), (frame2, 3), ] db.curframe = None db.output_stack() expected_stack = [( 3, { 'filename': 'filename.py', 'locals': {'locals': "'foo'"}, 'globals': {'globals': "'bar'"}, 'builtins': {'builtins': "'baz'"}, 'restricted': 'f_restricted', 'lasti': "'f_lasti'", 'exc_type': "'f_exc_type'", 'exc_value': "'f_exc_value'", 'exc_traceback': "'f_exc_traceback'", 'current': False, } )] db.output.assert_called_once_with('stack', stack=expected_stack) def test_Debugger_output_stack_exception(): """ Ensure that outputting the stack uses the currect frame in an exception condition (in addition to BDB and the runner, there are two further frames that should be ignored). """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() frame1 = mock.MagicMock() frame1.f_code.co_filename = '' frame3 = mock.MagicMock() frame3.f_code.co_filename = '' frame4 = mock.MagicMock() frame4.f_code.co_filename = 'filename.py' frame4.f_locals = {'locals': 'foo'} frame4.f_globals = {'globals': 'bar'} frame4.f_builtins = {'builtins': 'baz'} frame4.f_restricted = 'f_restricted' frame4.f_lasti = 'f_lasti' frame4.f_exc_type = 'f_exc_type' frame4.f_exc_value = 'f_exc_value' frame4.f_exc_traceback = 'f_exc_traceback' db.stack = [ (None, 1), (frame1, 2), (None, 3), (frame3, 4), (frame4, 5), ] db.curframe = None db.output_stack() expected_stack = [( 5, { 'filename': 'filename.py', 'locals': {'locals': "'foo'"}, 'globals': {'globals': "'bar'"}, 'builtins': {'builtins': "'baz'"}, 'restricted': 'f_restricted', 'lasti': "'f_lasti'", 'exc_type': "'f_exc_type'", 'exc_value': "'f_exc_value'", 'exc_traceback': "'f_exc_traceback'", 'current': False, } )] db.output.assert_called_once_with('stack', stack=expected_stack) def test_Debugger_reset(): """ Check reset brings about the correct states in certain attributes. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.reset() assert db.line is None # No known line number (yet) assert db.stack == [] # No stack (yet) assert db.curindex == 0 # Current stack index assert db.curframe is None # No current frame (yet) def test_Debugger_setup(): """ Make sure setup resets state and grabs details about the current stack. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.reset = mock.MagicMock() mock_curframe = mock.MagicMock() mock_stack = [ None, (mock_curframe, 1), ] db.get_stack = mock.MagicMock(return_value=(mock_stack, 1)) mock_frame = mock.MagicMock() mock_traceback = mock.MagicMock() db.setup(mock_frame, mock_traceback) db.reset.assert_called_once_with() db.get_stack.assert_called_once_with(mock_frame, mock_traceback) assert db.stack == mock_stack assert db.curindex == 1 assert db.curframe == mock_curframe def test_Debugger_interact_good_case(): """ Ensure a good command from the client to interact with the runner is handled correctly with the arguments passed as expected. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.setup = mock.MagicMock() db.output_stack = mock.MagicMock() db.reset = mock.MagicMock() db.commands = mock.MagicMock() db.commands.get.return_value = ('quit', {'foo': 'bar'}) db.do_quit = mock.MagicMock(return_value=True) db.interact(None, None) db.commands.get.assert_called_once_with(block=True) db.do_quit.assert_called_once_with(foo='bar') def test_Debugger_interact_unknown_command(): """ If the runner receives an unknown command it should respond with an error. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.setup = mock.MagicMock() db.output_stack = mock.MagicMock() db.reset = mock.MagicMock() db.commands = mock.MagicMock() db.commands.get.side_effect = [('foo', {'bar': 'baz'}), ('quit', {'foo': 'bar'})] db.do_quit = mock.MagicMock(return_value=True) db.output = mock.MagicMock() db.interact(None, None) db.output.assert_called_once_with('error', message='Unknown command: foo') def test_Debugger_interact_client_close(): """ If there's a ClientClose exception just raise and handle reconnection to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.setup = mock.MagicMock() db.output_stack = mock.MagicMock() db.reset = mock.MagicMock() db.commands = mock.MagicMock() db.commands.get.side_effect = mu.debugger.runner.ClientClose() db.do_quit = mock.MagicMock(return_value=True) db.socket = mock.MagicMock() mock_client = mock.MagicMock db.socket.accept.return_value = (mock_client, '127.0.0.1') mock_thread_instance = mock.MagicMock() mock_thread = mock.MagicMock(return_value=mock_thread_instance) db.output = mock.MagicMock() mock_queue = mock.MagicMock() mock_queue.get.side_effect = [('quit', {'foo': 'bar'}), ] mock_queue_class = mock.MagicMock(return_value=mock_queue) with mock.patch('mu.debugger.runner.Thread', mock_thread), \ mock.patch('mu.debugger.runner.Queue', mock_queue_class): db.interact(None, None) db.output.assert_called_once_with('bootstrap', breakpoints=[]) assert db.output_stack.call_count == 2 def test_Debugger_interact_restart(): """ If there's a Restart exception, just raise and let the process fail. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.setup = mock.MagicMock() db.output_stack = mock.MagicMock() db.reset = mock.MagicMock() db.commands = mock.MagicMock() db.commands.get.side_effect = [('next', {}), ] db.do_next = mock.MagicMock(side_effect=mu.debugger.runner.Restart()) with pytest.raises(mu.debugger.runner.Restart): db.interact(None, None) def test_Debugger_interact_exception_encountered(): """ If there's a generic exception encountered make sure the runner responds with an appropriate catch-all error message. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.setup = mock.MagicMock() db.output_stack = mock.MagicMock() db.reset = mock.MagicMock() db.commands = mock.MagicMock() db.commands.get.side_effect = [('next', {}), ('quit', {'foo': 'bar'}), ] db.do_next = mock.MagicMock(side_effect=Exception('boom!')) db.do_quit = mock.MagicMock() db.output = mock.MagicMock() db.interact(None, None) expected = 'Unhandled error with command "next": boom!' db.output.assert_called_once_with('error', message=expected) def test_Debugger_user_call_starting(): """ If user_call is called while the runner is still starting, just return None. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db._run_state = mu.debugger.runner.DebugState.STARTING assert db.user_call(None, None) is None def test_Debugger_user_call_started(): """ Assuming the runner has started, ensure the passed in frame and argument list are output and an interact is called. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.stop_here = mock.MagicMock(return_value=True) db.output = mock.MagicMock() db.interact = mock.MagicMock() mock_frame = mock.MagicMock() db.user_call(mock_frame, ['foo', 'bar', 'baz']) db.stop_here.assert_called_once_with(mock_frame) db.output.assert_called_once_with('call', args=['foo', 'bar', 'baz']) db.interact.assert_called_once_with(mock_frame, None) def test_Debugger_user_line_starting_no_line(): """ Do nothing (return None) if the runner is starting and there's no valid line set in the frame. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db._run_state = mu.debugger.runner.DebugState.STARTING db.interact = mock.MagicMock() mock_frame = mock.MagicMock() mock_frame.f_code.co_filename = db.canonic('foo') db.mainpyfile = mock_frame.f_code.co_filename mock_frame.f_lineno = 0 assert db.user_line(mock_frame) is None assert db._run_state == mu.debugger.runner.DebugState.STARTED def test_Debugger_user_line_starting_valid_line(): """ If the runner is starting and there's a valid line set in the frame change state to STARTED, emit details of the line to the client and do an interact on the frame. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.interact = mock.MagicMock() db._run_state = mu.debugger.runner.DebugState.STARTING mock_frame = mock.MagicMock() mock_frame.f_code.co_filename = db.canonic('foo') db.mainpyfile = mock_frame.f_code.co_filename mock_frame.f_lineno = 1 db.user_line(mock_frame) assert db._run_state == mu.debugger.runner.DebugState.STARTED db.output.assert_called_once_with('line', filename=db.canonic('foo'), line=1) db.interact.assert_called_once_with(mock_frame, None) def test_Debugger_user_return_starting(): """ If the runner is starting return None. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db._run_state = mu.debugger.runner.DebugState.STARTING assert db.user_return(None, None) is None def test_Debugger_user_return(): """ If there is a return value associate it with the referenced frame, signal to the client the value of the return and interact with the frame. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.interact = mock.MagicMock() mock_frame = mock.MagicMock() mock_frame.f_locals = {} return_value = 'foo' db.user_return(mock_frame, return_value) assert mock_frame.f_locals['__return__'] == return_value db.output.assert_called_once_with('return', retval=repr(return_value)) db.interact.assert_called_once_with(mock_frame, None) def test_Debugger_user_exception_starting(): """ If the runner is startig return None. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db._run_state = mu.debugger.runner.DebugState.STARTING assert db.user_exception(None, None) is None def test_Debugger_user_exception_string_exc_type(): """ Given details of the exception, with a exc_type that's a string, update the frame, signal to the client and interact with the frame. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.interact = mock.MagicMock() exc_info = ('type', 'value', 'traceback') mock_frame = mock.MagicMock() mock_frame.f_locals = {} db.user_exception(mock_frame, exc_info) assert mock_frame.f_locals['__exception__'] == ('type', 'value') db.output.assert_called_once_with('exception', name='type', value=repr('value')) db.interact.assert_called_once_with(mock_frame, 'traceback') def test_Debugger_user_exception_other_exc_type(): """ Given details of the exception, with a exc_type that's a string, update the frame, signal to the client and interact with the frame. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.interact = mock.MagicMock() mock_type = mock.MagicMock() mock_type.__name__ = 'type' exc_info = (mock_type, 'value', 'traceback') mock_frame = mock.MagicMock() mock_frame.f_locals = {} db.user_exception(mock_frame, exc_info) assert mock_frame.f_locals['__exception__'] == (mock_type, 'value') db.output.assert_called_once_with('exception', name='type', value=repr('value')) db.interact.assert_called_once_with(mock_frame, 'traceback') def test_Debugger_do_break_non_executable_line(): """ If the referenced file and line are not a executable line, output an error message to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.is_executable_line = mock.MagicMock(return_value=False) with mock.patch('mu.debugger.runner.is_breakpoint_line', return_value=False): db.do_break('foo.py', 10) db.output.assert_called_once_with('error', message='foo.py:10 is not executable') def test_Debugger_do_break_causes_error(): """ If any error is encountered while calling set_break, output an error message to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.is_executable_line = mock.MagicMock(return_value=True) db.set_break = mock.MagicMock(return_value='bang!') with mock.patch('mu.debugger.runner.is_breakpoint_line', return_value=True): db.do_break('foo.py', 10) db.output.assert_called_once_with('error', message='bang!') def test_Debugger_do_break(): """ Assuming all is well while setting the breakpoint, ensure the client is informed of the details of the new breakpoint. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.is_executable_line = mock.MagicMock(return_value=True) db.set_break = mock.MagicMock(return_value=None) mock_bp = mock.MagicMock() mock_bp.number = 123 mock_bp.file = 'foo.py' mock_bp.line = 10 mock_bp.temporary = False mock_bp.funcname = 'bar' db.get_breaks = mock.MagicMock(return_value=[mock_bp, ]) with mock.patch('mu.debugger.runner.is_breakpoint_line', return_value=True): db.do_break('foo.py', 10) db.output.assert_called_once_with('breakpoint_create', bpnum=mock_bp.number, filename=mock_bp.file, line=mock_bp.line, temporary=mock_bp.temporary, funcname=mock_bp.funcname) def test_Debugger_do_enable_no_such_breakpoint(): """ If the referenced breakpoint number does not exist send an error message back to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: 1, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_enable('4') db.output.assert_called_once_with('error', message='No breakpoint numbered 4') def test_Debugger_do_enable(): """ Ensure the referenced breakpoint is enabled and a message is sent back to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: mock_breakpoint, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_enable('1') mock_breakpoint.enable.assert_called_once_with() db.output.assert_called_once_with('breakpoint_enable', bpnum=1) def test_Debugger_do_disable_no_such_breakpoint(): """ If the referenced breakpoint number does not exist send an error message back to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: 1, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_disable('4') db.output.assert_called_once_with('error', message='No breakpoint numbered 4') def test_Debugger_do_disable(): """ Ensure the referenced breakpoint is disabled and a message is sent back to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: mock_breakpoint, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_disable('1') mock_breakpoint.disable.assert_called_once_with() db.output.assert_called_once_with('breakpoint_disable', bpnum=1) def test_Debugger_do_ignore_bad_count(): """ If the referenced count value cannot be cast to an integer, ensure just breakpoint_enable is actioned. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: mock_breakpoint, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_ignore(1, "hello") assert mock_breakpoint.ignore == 0 db.output.assert_called_once_with('breakpoint_enable', bpnum=1) def test_Debugger_do_ignore_no_breakpoint(): """ If the referenced breakpoint number does not exist send an error message back to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: mock_breakpoint, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_ignore(4, 1) db.output.assert_called_once_with('error', message='No breakpoint numbered 4') def test_Debugger_do_ignore(): """ In a valid situation, the breakpoint_ignore message is sent to the client and the breakpoint has the ignore value updated. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: mock_breakpoint, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_ignore(1, 5) assert mock_breakpoint.ignore == 5 db.output.assert_called_once_with('breakpoint_ignore', bpnum=1, count=5) def test_Debugger_do_clear_no_breakpoint(): """ If the referenced breakpoint number does not exist send an error message back to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() mock_breakpoint = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: mock_breakpoint, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_clear(4) db.output.assert_called_once_with('error', message='No breakpoint numbered 4') def test_Debugger_do_clear_error_encountered(): """ If an error is encountered while trying to clear the breakpoint, report the error back to the client. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.clear_bpbynumber = mock.MagicMock(return_value='bang!') mock_breakpoint = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: mock_breakpoint, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_clear('1') db.output.assert_called_once_with('error', message='bang!') def test_Debugger_do_clear(): """ In a successful situation, the breakpoint_clear message is sent to the client and the clear_bpbynumber is called with the expected value. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.output = mock.MagicMock() db.clear_bpbynumber = mock.MagicMock(return_value='') mock_breakpoint = mock.MagicMock() mock_bdb = mock.MagicMock() mock_bdb.Breakpoint.bpbynumber = {1: mock_breakpoint, 2: 2, 3: 3, } with mock.patch('mu.debugger.runner.bdb', mock_bdb): db.do_clear('1') db.clear_bpbynumber.assert_called_once_with(1) db.output.assert_called_once_with('breakpoint_clear', bpnum=1) def test_Debugger_do_step(): """ Calls set_step and returns True. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.set_step = mock.MagicMock() assert db.do_step() db.set_step.assert_called_once_with() def test_Debugger_do_next(): """ Calls set_next and return True. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.curframe = mock.MagicMock() db.set_next = mock.MagicMock() assert db.do_next() db.set_next.assert_called_once_with(db.curframe) def test_Debugger_do_restart(): """ Raises Restart """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) with pytest.raises(mu.debugger.runner.Restart): db.do_restart() def test_Debugger_do_return(): """ Calls set_return and returns True """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.curframe = mock.MagicMock() db.set_return = mock.MagicMock() assert db.do_return() db.set_return.assert_called_once_with(db.curframe) def test_Debugger_do_continue_with_breakpoints(): """ Calls set_continue and returns True """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.get_all_breaks = mock.MagicMock(return_value=True) db.set_continue = mock.MagicMock() assert db.do_continue() db.set_continue.assert_called_once_with() def test_Debugger_do_continue_no_breakpoints(): """ Calls set_trace and returns True """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.get_all_breaks = mock.MagicMock(return_value=False) db.set_step = mock.MagicMock() assert db.do_continue() db.set_step.assert_called_once_with() assert db.continue_flag is True def test_Debugger_do_continue_no_breakpoints_continue_flag_set(): """ Calls set_continue and returns True """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.get_all_breaks = mock.MagicMock(return_value=False) db.set_continue = mock.MagicMock() db.continue_flag = True assert db.do_continue() db.set_continue.assert_called_once_with() def test_Debugger_do_quit(): """ Sets _user_requested_quit to True, calles set_quit and returns True. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.set_quit = mock.MagicMock() assert db.do_quit() assert db._user_requested_quit db.set_quit.assert_called_once_with() def test_Debugger_do_close(): """ Tidy up on client close. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.command_thread = mock.MagicMock() with pytest.raises(mu.debugger.runner.ClientClose): db.do_close() assert db.client is None assert db.commands is None db.command_thread.join.assert_called_once_with() def test_Debugger_runscript(): """ Ensure the context for running the script to be debugged is created correctly. """ mock_socket = mock.MagicMock() db = mu.debugger.runner.Debugger(mock_socket, 'localhost', 9999) db.run = mock.MagicMock() db._runscript('x.py') assert db._run_state == mu.debugger.runner.DebugState.STARTING assert db.mainpyfile == db.canonic('x.py') assert db._user_requested_quit db.run.assert_called_once_with('__debug_script__ = open(r"x.py", "rb");' '__debug_code__ = compile(__debug_script__' '.read(), r"x.py", "exec");' 'exec(__debug_code__);' '__debug_script__.close();') def test_run_with_user_requested_quit(): """ Run the debugger and exit because the user requested it. """ mock_debugger = mock.MagicMock() mock_debugger._user_requested_quit = True mock_debugger_class = mock.MagicMock(return_value=mock_debugger) mock_sys = mock.MagicMock() mock_sys.argv = [None, None] mock_sys.path = [None] mock_socket = mock.MagicMock() with mock.patch('mu.debugger.runner.Debugger', mock_debugger_class), \ mock.patch('mu.debugger.runner.sys', mock_sys), \ mock.patch('mu.debugger.runner.socket', mock_socket): mu.debugger.runner.run('localhost', 1908, 'foo.py', 'bar', 'baz') mock_debugger.reset.assert_called_once_with() mock_debugger._runscript.assert_called_once_with('foo.py') mock_debugger.client.shutdown.assert_called_once_with(mock_socket.SHUT_WR) mock_debugger_class.call_args_list[0][0][1] == 'localhost' mock_debugger_class.call_args_list[0][0][2] == 1908 assert mock_sys.argv[0] == 'foo.py' assert mock_sys.argv[1:] == ['bar', 'baz', ] assert mock_sys.path[0] == os.path.dirname('foo.py') def test_run_with_restart_exception(): """ Ensure the logger is called. """ mock_debugger = mock.MagicMock() mock_debugger._runscript.side_effect = [mu.debugger.runner.Restart(), None] mock_debugger._user_requested_quit = True mock_debugger_class = mock.MagicMock(return_value=mock_debugger) mock_sys = mock.MagicMock() mock_sys.argv = [None, None] mock_sys.path = [None] mock_socket = mock.MagicMock() with mock.patch('mu.debugger.runner.Debugger', mock_debugger_class), \ mock.patch('mu.debugger.runner.sys', mock_sys), \ mock.patch('mu.debugger.runner.socket', mock_socket): mu.debugger.runner.run('localhost', 1908, 'foo.py', 'bar', 'baz') assert mock_debugger.output.call_count == 2 assert mock_debugger.output.call_args_list[0][0][0] == 'restart' assert mock_debugger.output.call_args_list[1][0][0] == 'finished' def test_run_with_expected_exception(): """ If a handled exception is triggered, set the client to none and stop. """ mock_debugger = mock.MagicMock() mock_debugger._runscript.side_effect = SystemExit() mock_debugger_class = mock.MagicMock(return_value=mock_debugger) mock_sys = mock.MagicMock() mock_sys.argv = [None, None] mock_sys.path = [None] mock_socket = mock.MagicMock() with mock.patch('mu.debugger.runner.Debugger', mock_debugger_class), \ mock.patch('mu.debugger.runner.sys', mock_sys), \ mock.patch('mu.debugger.runner.socket', mock_socket): mu.debugger.runner.run('localhost', 1908, 'foo.py', 'bar', 'baz') assert mock_debugger.client is None def test_run_with_unexpected_exception(): """ If an unexpected exception is triggered, report via a postmortem message to the client. """ mock_debugger = mock.MagicMock() mock_debugger._runscript.side_effect = [Exception('boom'), None] mock_debugger._user_requested_quit = True mock_debugger_class = mock.MagicMock(return_value=mock_debugger) mock_sys = mock.MagicMock() mock_sys.argv = [None, None] mock_sys.path = [None] mock_socket = mock.MagicMock() with mock.patch('mu.debugger.runner.Debugger', mock_debugger_class), \ mock.patch('mu.debugger.runner.sys', mock_sys), \ mock.patch('mu.debugger.runner.socket', mock_socket): mu.debugger.runner.run('localhost', 1908, 'foo.py', 'bar', 'baz') assert mock_debugger.output.call_count == 1 assert mock_debugger.output.call_args_list[0][0][0] == 'postmortem' mu-editor-1.0.2+dfsg/tests/debugger/test_utils.py000066400000000000000000000033741341747546300220620ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the debug utils. """ from mu.debugger.utils import is_breakpoint_line def test_is_breakpoint_line_valid_code(): """ A simple check to ensure a valid line of Python returns True. """ code = 'print("Hello")' assert is_breakpoint_line(code) def test_is_breakpoint_line_valid_code_with_whitespace(): """ If the line of code is indented with whitespace, ensure it returns True. """ code = ' print("Hello")' assert is_breakpoint_line(code) def test_is_breakpoint_line_valid_blank_line(): """ If the line is blank, you can't set a breakpoint. """ assert is_breakpoint_line(' ') is False def test_is_breakpoint_line_comment(): """ You can't set a breakpoint on a line that is a comment. """ assert is_breakpoint_line('# A comment') is False assert is_breakpoint_line('""" A comment """') is False assert is_breakpoint_line("''' A comment'''") is False def test_is_breakpoint_line_opening_collection(): """ It's common to write things like: foo = [ 'a', 'b', 'c', ] Breakpoints cannot be set on the first line of this statement (for all collection types). """ assert is_breakpoint_line('foo = [') is False assert is_breakpoint_line('foo = {') is False assert is_breakpoint_line('foo = (') is False def test_is_breakpoint_line_closing_collection(): """ It's common to write things like: foo = [ 'a', 'b', 'c', ] Breakpoints cannot be set on the final line of this statement (for all collection types). """ assert is_breakpoint_line(']') is False assert is_breakpoint_line('}') is False assert is_breakpoint_line(')') is False mu-editor-1.0.2+dfsg/tests/interface/000077500000000000000000000000001341747546300174565ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/interface/__init__.py000066400000000000000000000000001341747546300215550ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/interface/test_dialogs.py000066400000000000000000000130521341747546300225120ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the user interface elements of Mu. """ from PyQt5.QtWidgets import QApplication, QDialog, QWidget from unittest import mock from mu.modes import PythonMode, AdafruitMode, MicrobitMode, DebugMode import mu.interface.dialogs import pytest # Required so the QWidget tests don't abort with the message: # "QWidget: Must construct a QApplication before a QWidget" # The QApplication need only be instantiated once. app = QApplication([]) def test_ModeItem_init(): """ Ensure that ModeItem objects are setup correctly. """ name = 'item_name' description = 'item_description' icon = 'icon_name' mock_text = mock.MagicMock() mock_icon = mock.MagicMock() mock_load = mock.MagicMock(return_value=icon) with mock.patch('mu.interface.dialogs.QListWidgetItem.setText', mock_text), \ mock.patch('mu.interface.dialogs.QListWidgetItem.setIcon', mock_icon), \ mock.patch('mu.interface.dialogs.load_icon', mock_load): mi = mu.interface.dialogs.ModeItem(name, description, icon) assert mi.name == name assert mi.description == description assert mi.icon == icon mock_text.assert_called_once_with('{}\n{}'.format(name, description)) mock_load.assert_called_once_with(icon) mock_icon.assert_called_once_with(icon) def test_ModeSelector_setup(): """ Ensure the ModeSelector dialog is setup properly given a list of modes. If a mode has debugger = True it is ignored since debug mode is not a mode to be selected by users. """ editor = mock.MagicMock() view = mock.MagicMock() modes = { 'python': PythonMode(editor, view), 'adafruit': AdafruitMode(editor, view), 'microbit': MicrobitMode(editor, view), 'debugger': DebugMode(editor, view), } current_mode = 'python' mock_item = mock.MagicMock() with mock.patch('mu.interface.dialogs.ModeItem', mock_item): with mock.patch('mu.interface.dialogs.QVBoxLayout'): with mock.patch('mu.interface.dialogs.QListWidget'): ms = mu.interface.dialogs.ModeSelector() ms.setLayout = mock.MagicMock() ms.setup(modes, current_mode) assert ms.setLayout.call_count == 1 assert mock_item.call_count == 3 def test_ModeSelector_select_and_accept(): """ Ensure the accept slot is fired when this event handler is called. """ mock_window = QWidget() ms = mu.interface.dialogs.ModeSelector(mock_window) ms.accept = mock.MagicMock() ms.select_and_accept() ms.accept.assert_called_once_with() def test_ModeSelector_get_mode(): """ Ensure that the ModeSelector will correctly return a selected mode (or raise the expected exception if cancelled). """ mock_window = QWidget() ms = mu.interface.dialogs.ModeSelector(mock_window) ms.result = mock.MagicMock(return_value=QDialog.Accepted) item = mock.MagicMock() item.icon = 'name' ms.mode_list = mock.MagicMock() ms.mode_list.currentItem.return_value = item result = ms.get_mode() assert result == 'name' ms.result.return_value = None with pytest.raises(RuntimeError): ms.get_mode() def test_LogWidget_setup(): """ Ensure the log widget displays the referenced log file string in the expected way. """ log = 'this is the contents of a log file' lw = mu.interface.dialogs.LogWidget() lw.setup(log) assert lw.log_text_area.toPlainText() == log assert lw.log_text_area.isReadOnly() def test_EnvironmentVariablesWidget_setup(): """ Ensure the widget for editing user defined environment variables displays the referenced string in the expected way. """ envars = 'name=value' evw = mu.interface.dialogs.EnvironmentVariablesWidget() evw.setup(envars) assert evw.text_area.toPlainText() == envars assert not evw.text_area.isReadOnly() def test_MicrobitSettingsWidget_setup(): """ Ensure the widget for editing settings related to the BBC microbit displays the referenced settings data in the expected way. """ minify = True custom_runtime_path = '/foo/bar' mbsw = mu.interface.dialogs.MicrobitSettingsWidget() mbsw.setup(minify, custom_runtime_path) assert mbsw.minify.isChecked() assert mbsw.runtime_path.text() == '/foo/bar' def test_AdminDialog_setup(): """ Ensure the admin dialog is setup properly given the content of a log file and envars. """ log = 'this is the contents of a log file' settings = { 'envars': 'name=value', 'minify': True, 'microbit_runtime': '/foo/bar', } mock_window = QWidget() ad = mu.interface.dialogs.AdminDialog(mock_window) ad.setup(log, settings) assert ad.log_widget.log_text_area.toPlainText() == log assert ad.settings() == settings def test_FindReplaceDialog_setup(): """ Ensure the find/replace dialog is setup properly given only the theme as an argument. """ frd = mu.interface.dialogs.FindReplaceDialog() frd.setup() assert frd.find() == '' assert frd.replace() == '' assert frd.replace_flag() is False def test_FindReplaceDialog_setup_with_args(): """ Ensure the find/replace dialog is setup properly given only the theme as an argument. """ find = 'foo' replace = 'bar' flag = True frd = mu.interface.dialogs.FindReplaceDialog() frd.setup(find, replace, flag) assert frd.find() == find assert frd.replace() == replace assert frd.replace_flag() mu-editor-1.0.2+dfsg/tests/interface/test_editor.py000066400000000000000000000565171341747546300223730ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the user interface elements of Mu. """ from unittest import mock import mu.interface.editor import keyword import re from PyQt5.QtCore import Qt, QMimeData, QUrl, QPointF from PyQt5.QtGui import QDropEvent def test_pythonlexer_keywords(): """ Ensure both types of expected keywords are returned from the PythonLexer class. """ lexer = mu.interface.editor.PythonLexer() # 1 = return keywords. assert lexer.keywords(1) == ' '.join(keyword.kwlist + ['self', 'cls']) # 2 = built-in functions. assert lexer.keywords(2) == ' '.join(__builtins__.keys()) # Anything else returns None. assert lexer.keywords(3) is None def test_EditorPane_init(): """ Ensure everything is set and configured given a path and text passed into a new instance of the EditorPane. """ mock_text = mock.MagicMock(return_value=None) mock_modified = mock.MagicMock(return_value=None) mock_configure = mock.MagicMock(return_value=None) with mock.patch('mu.interface.editor.EditorPane.setText', mock_text), \ mock.patch('mu.interface.editor.EditorPane.setModified', mock_modified), \ mock.patch('mu.interface.editor.EditorPane.configure', mock_configure): path = '/foo/bar.py' text = 'print("Hello, World!")' editor = mu.interface.editor.EditorPane(path, text, '\r\n') mock_text.assert_called_once_with(text) mock_modified.assert_called_once_with(False) mock_configure.assert_called_once_with() assert editor.isUtf8() assert editor.newline == '\r\n' def test_EditorPane_configure(): """ Check the expected configuration takes place. NOTE - this is checking the expected attributes are configured, not what the actual configuration values may be. I.e. we're checking that, say, setIndentationWidth is called. """ ep = mu.interface.editor.EditorPane('/foo/bar.py', 'baz') ep.setFont = mock.MagicMock() ep.setUtf8 = mock.MagicMock() ep.setAutoIndent = mock.MagicMock() ep.setIndentationsUseTabs = mock.MagicMock() ep.setIndentationWidth = mock.MagicMock() ep.setTabWidth = mock.MagicMock() ep.setEdgeColumn = mock.MagicMock() ep.setMarginLineNumbers = mock.MagicMock() ep.setMarginWidth = mock.MagicMock() ep.setBraceMatching = mock.MagicMock() ep.SendScintilla = mock.MagicMock() ep.set_theme = mock.MagicMock() ep.markerDefine = mock.MagicMock() ep.indicatorDefine = mock.MagicMock() ep.setMarginSensitivity = mock.MagicMock() ep.setIndicatorDrawUnder = mock.MagicMock() ep.marginClicked = mock.MagicMock() ep.marginClicked.connect = mock.MagicMock() ep.setAnnotationDisplay = mock.MagicMock() ep.selectionChanged = mock.MagicMock() ep.selectionChanged.connect = mock.MagicMock() ep.set_zoom = mock.MagicMock() ep.configure() assert ep.api is None assert ep.setFont.call_count == 1 assert ep.setUtf8.call_count == 1 assert ep.setAutoIndent.call_count == 1 assert ep.setIndentationsUseTabs.call_count == 1 assert ep.setIndentationWidth.call_count == 1 assert ep.setTabWidth.call_count == 1 assert ep.setEdgeColumn.call_count == 1 assert ep.setMarginLineNumbers.call_count == 1 assert ep.setMarginWidth.call_count == 1 assert ep.setBraceMatching.call_count == 1 assert ep.SendScintilla.call_count == 1 assert ep.set_theme.call_count == 1 assert ep.markerDefine.call_count == 1 assert ep.setMarginSensitivity.call_count == 2 assert ep.setIndicatorDrawUnder.call_count == 1 assert ep.setAnnotationDisplay.call_count == 1 assert ep.selectionChanged.connect.call_count == 1 ep.indicatorDefine.assert_has_calls( [mock.call(ep.SquiggleIndicator, ep.check_indicators['error']['id']), mock.call(ep.SquiggleIndicator, ep.check_indicators['style']['id']), mock.call(ep.StraightBoxIndicator, ep.search_indicators['selection']['id'])], any_order=True) assert ep.set_zoom.call_count == 1 def test_Editor_connect_margin(): """ Ensure that the passed in function is connected to the marginClick event. """ mock_fn = mock.MagicMock() ep = mu.interface.editor.EditorPane('/foo/bar.py', 'baz') ep.marginClicked = mock.MagicMock() ep.connect_margin(mock_fn) ep.marginClicked.connect.assert_called_once_with(mock_fn) def test_EditorPane_set_theme(): """ Check all the expected configuration calls are made to ensure the widget's theme is updated. """ api = ['api help text', ] ep = mu.interface.editor.EditorPane('/foo/bar.py', 'baz') ep.lexer = mock.MagicMock() mock_api = mock.MagicMock() with mock.patch('mu.interface.editor.QsciAPIs', return_value=mock_api) as mapi: ep.set_api(api) mapi.assert_called_once_with(ep.lexer) mock_api.add.assert_called_once_with('api help text') mock_api.prepare.assert_called_once_with() def test_EditorPane_set_zoom(): """ Ensure the t-shirt size is turned into a call to parent's zoomTo. """ ep = mu.interface.editor.EditorPane('/foo/bar.py', 'baz') ep.zoomTo = mock.MagicMock() ep.set_zoom('xl') ep.zoomTo.assert_called_once_with(8) def test_EditorPane_label(): """ Ensure the correct label is returned given a set of states: If there's a path, use the basename for the label. Otherwise it's "untitled". If the text is modified append an asterisk. """ ep = mu.interface.editor.EditorPane(None, 'baz') assert ep.label == 'untitled' ep = mu.interface.editor.EditorPane('/foo/bar.py', 'baz') assert ep.label == 'bar.py' ep.isModified = mock.MagicMock(return_value=True) assert ep.label == 'bar.py *' def test_EditorPane_reset_annotations(): """ Ensure annotation state is reset. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.clearAnnotations = mock.MagicMock() ep.markerDeleteAll = mock.MagicMock() ep.reset_search_indicators = mock.MagicMock() ep.reset_check_indicators = mock.MagicMock() ep.reset_annotations() ep.clearAnnotations.assert_called_once_with() ep.markerDeleteAll.assert_called_once_with() ep.reset_search_indicators.assert_called_once_with() ep.reset_check_indicators.assert_called_once_with() def test_EditorPane_reset_check_indicators(): """ Ensure code check indicators are reset. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.clearIndicatorRange = mock.MagicMock() ep.check_indicators = { 'error': { 'id': 19, 'markers': { 1: [{'column': 0, 'line_no': 1, 'message': 'indicator detail'}] }, }, 'style': { 'id': 20, 'markers': { 2: [{'code': 'x', 'column': 0, 'line_no': 1, 'message': 'indicator detail'}] } } } ep.reset_check_indicators() ep.clearIndicatorRange.assert_has_calls( [mock.call(1, 0, 1, 999999, 19), mock.call(1, 0, 1, 999999, 20)], any_order=True) for indicator in ep.check_indicators: assert ep.check_indicators[indicator]['markers'] == {} assert ep.check_indicators[indicator]['markers'] == {} def test_EditorPane_reset_search_indicators(): """ Ensure search indicators are reset. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.clearIndicatorRange = mock.MagicMock() ep.search_indicators = { 'selection': {'id': 10, 'positions': [ {'line_start': 1, 'col_start': 2, 'line_end': 3, 'col_end': 4}, {'line_start': 5, 'col_start': 4, 'line_end': 3, 'col_end': 2} ]} } ep.reset_search_indicators() ep.clearIndicatorRange.assert_has_calls( [mock.call(1, 2, 3, 4, 10), mock.call(5, 4, 3, 2, 10)], any_order=True) for indicator in ep.search_indicators: assert ep.search_indicators[indicator]['positions'] == [] assert ep.search_indicators[indicator]['positions'] == [] def test_EditorPane_annotate_code(): """ Given a dict containing representations of feedback on the code contained within the EditorPane instance, ensure the correct indicators and markers are set. """ feedback = { 17: [{'line_no': 17, 'message': 'Syntax error', 'source': 'for word, pitch in words\n', 'column': 24}, {'line_no': 17, 'message': 'Too many blank lines (4) above this line', 'column': 0, 'code': 'E303'}], 18: [{'line_no': 18, 'message': 'Unexpected indentation', 'column': 4, 'code': 'E113'}], 21: [{'line_no': 21, 'message': 'No newline at end of file', 'column': 50, 'code': 'W292'}]} ep = mu.interface.editor.EditorPane(None, 'baz') ep.markerAdd = mock.MagicMock() ep.ensureLineVisible = mock.MagicMock() ep.fillIndicatorRange = mock.MagicMock() ep.annotate_code(feedback, 'error') assert ep.fillIndicatorRange.call_count == 3 # once for each message. ep.ensureLineVisible.assert_called_once_with(17) # first problem visible def test_EditorPane_debugger_at_line(): """ Ensure the right calls are made to highlight the referenced line with the DEBUG_INDICATOR. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.text = mock.MagicMock(return_value='baz') ep.reset_debugger_highlight = mock.MagicMock() ep.fillIndicatorRange = mock.MagicMock() ep.ensureLineVisible = mock.MagicMock() ep.debugger_at_line(99) ep.reset_debugger_highlight.assert_called_once_with() ep.text.assert_called_once_with(99) ep.fillIndicatorRange.assert_called_once_with(99, 0, 99, 3, ep.DEBUG_INDICATOR) ep.ensureLineVisible.assert_called_once_with(99) def test_EditorPane_debugger_at_line_windows_line_endings(): """ Ensure the right calls are made to highlight the referenced line with the DEBUG_INDICATOR. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.text = mock.MagicMock(return_value='baz\r\n') ep.reset_debugger_highlight = mock.MagicMock() ep.fillIndicatorRange = mock.MagicMock() ep.ensureLineVisible = mock.MagicMock() ep.debugger_at_line(99) ep.reset_debugger_highlight.assert_called_once_with() ep.text.assert_called_once_with(99) ep.fillIndicatorRange.assert_called_once_with(99, 0, 99, 3, ep.DEBUG_INDICATOR) ep.ensureLineVisible.assert_called_once_with(99) def test_EditorPane_reset_debugger_highlight(): """ Ensure all DEBUG_INDICATORs are removed from the editor. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.lines = mock.MagicMock(return_value=3) ep.text = mock.MagicMock(return_value='baz') ep.clearIndicatorRange = mock.MagicMock() ep.reset_debugger_highlight() assert ep.clearIndicatorRange.call_count == 3 assert ep.clearIndicatorRange.call_args_list[0][0] == (0, 0, 0, 3, ep.DEBUG_INDICATOR) def test_EditorPane_show_annotations(): """ Ensure the annotations are shown in "sentence" case and with an arrow to indicate the line to which they refer. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.check_indicators = { 'error': { 'markers': { 1: [ {'message': 'message 1', 'line_no': 1}, {'message': 'message 2', 'line_no': 1}, ] } } } ep.annotate = mock.MagicMock() ep.show_annotations() ep.annotate.assert_called_once_with(1, '\u2191 message 1\n\u2191 message 2', ep.annotationDisplay()) def test_EditorPane_find_next_match(): """ Ensures that the expected arg values are passed through to QsciScintilla for highlighting matched text. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.findFirst = mock.MagicMock(return_value=True) assert ep.find_next_match('foo', from_line=10, from_col=5, case_sensitive=True, wrap_around=False) ep.findFirst.assert_called_once_with('foo', False, True, True, False, forward=True, line=10, index=5, show=False, posix=False) def _ranges_in_text(text, search_for): """Find any instances of `search_for` inside text and return the equivalent Scintilla Ranges of (line_start, column_start, line_end, column_end). For now, we'll ignore the possibility of multi-line ranges which are certainly supported within Scintilla. NB Scintilla appears to use exclusive bounds at both ends, so for the text 'foo bar', 'foo' will give (0, 0, 0, 3). """ for n_line, line in enumerate(text.splitlines()): for match in re.finditer(search_for, line): yield n_line, match.start(), n_line, match.end() def test_EditorPane_highlight_selected_matches_no_selection(): """ Ensure that if the current selection is empty then all highlights are cleared. There's no API for determining which highlighted regions are present in the edit control, so we use the selection indicators structure as a proxy for the indicators set. """ text = "foo bar foo" ep = mu.interface.editor.EditorPane(None, 'baz') ep.setText(text) ep.setSelection(-1, -1, -1, -1) assert ep.search_indicators['selection']['positions'] == [] def test_EditorPane_highlight_selected_spans_two_or_more_lines(): """ Ensure that if the current selection spans two or more lines then all highlights are cleared. There's no API for determining which highlighted regions are present in the edit control, so we use the selection indicators structure as a proxy for the indicators set. """ text = "foo\nbar\nfoo" ep = mu.interface.editor.EditorPane(None, 'baz') ep.setText(text) ep.setSelection(0, 0, 1, 1) assert ep.search_indicators['selection']['positions'] == [] def test_EditorPane_highlight_selected_matches_multi_word(): """ Ensure that if the current selection is not a single word then don't cause a search/highlight call. There's no API for determining which highlighted regions are present in the edit control, so we use the selection indicators structure as a proxy for the indicators set. """ text = "foo bar foo" search_for = "foo bar" ep = mu.interface.editor.EditorPane(None, 'baz') ep.setText(text) for range in _ranges_in_text(text, search_for): break ep.setSelection(*range) assert ep.search_indicators['selection']['positions'] == [] def test_EditorPane_highlight_selected_matches_with_match(): """ Ensure that if the current selection is a single word then it causes the expected search/highlight call. There appears to be no way to iterate over indicators within the editor. So we're using the search_indicators structure as a proxy """ text = "foo bar foo baz foo" search_for = "foo" ep = mu.interface.editor.EditorPane(None, 'baz') ep.setText(text) # # Determine what ranges would be found and highlighted and arbitrarily # use the last one for the selection # expected_ranges = [] selected_range = None for range in _ranges_in_text(text, search_for): if selected_range is None: selected_range = range else: (line_start, col_start, line_end, col_end) = range expected_ranges.append( dict( line_start=line_start, col_start=col_start, line_end=line_end, col_end=col_end ) ) ep.setSelection(*selected_range) assert ep.search_indicators['selection']['positions'] == expected_ranges def test_EditorPane_highlight_selected_matches_incomplete_word(): """ Ensure that if the current selection is not a complete word then no ranges are highlighted. There appears to be no way to iterate over indicators within the editor. So we're using the search_indicators structure as a proxy """ text = "foo bar foo baz foo" search_for = "fo" ep = mu.interface.editor.EditorPane(None, 'baz') ep.setText(text) for range in _ranges_in_text(text, search_for): ep.setSelection(*range) break assert ep.search_indicators['selection']['positions'] == [] def test_EditorPane_highlight_selected_matches_cursor_remains(): """ Ensure that if a selection is made, the text cursor remains in the same place after any matching terms have been highlighted. NB Since this is testing an interaction between our code and the QScintilla control, there is no way to mock this behaviour. """ text = "foo bar foo" search_for = "foo" ep = mu.interface.editor.EditorPane(None, 'baz') ep.setText(text) select_n_chars = 2 # # Find the first of the matching words # Place the cursor at the right-hand end of the match # Extend the selection back a number of characters # Confirm that the cursor is correctly that many characters back from # the end of the matching text (ie that it hasn't been reset) # for line0, index0, line1, index1 in _ranges_in_text(text, search_for): break ep.setCursorPosition(line1, index1) for i in range(select_n_chars): ep.SendScintilla(mu.interface.editor.QsciScintilla.SCI_CHARLEFTEXTEND) assert ep.getCursorPosition() == (line1, index1 - select_n_chars) def test_EditorPane_selection_change_listener(): """ Enusure that is there is a change to the selected text then controll is passed to highlight_selected_matches. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.getSelection = mock.MagicMock(return_value=(1, 1, 2, 2)) ep.highlight_selected_matches = mock.MagicMock() ep.selection_change_listener() assert ep.previous_selection['line_start'] == 1 assert ep.previous_selection['col_start'] == 1 assert ep.previous_selection['line_end'] == 2 assert ep.previous_selection['col_end'] == 2 assert ep.highlight_selected_matches.call_count == 1 def test_EditorPane_drop_event(): """ If there's a drop event associated with files, cause them to be passed into Mu's existing file loading code. """ ep = mu.interface.editor.EditorPane(None, 'baz') m = mock.MagicMock() ep.open_file = mock.MagicMock() ep.open_file.emit = m data = QMimeData() data.setUrls([QUrl('file://test/path.py'), QUrl('file://test/path.hex'), QUrl('file://test/path.txt')]) evt = QDropEvent(QPointF(0, 0), Qt.CopyAction, data, Qt.LeftButton, Qt.NoModifier) ep.dropEvent(evt) # Upstream _load will handle invalid file type (.txt). assert m.call_count == 3 def test_EditorPane_drop_event_not_file(): """ If the drop event isn't for files (for example, it may be for dragging and dropping text into the editor), then pass the handling up to QScintilla. """ ep = mu.interface.editor.EditorPane(None, 'baz') event = mock.MagicMock() event.mimeData().hasUrls.return_value = False event.isAccepted.return_value = False with mock.patch('mu.interface.editor.QsciScintilla.dropEvent') as mock_de: ep.dropEvent(event) mock_de.assert_called_once_with(event) def test_EditorPane_toggle_line_starts_with_hash(): """ If the line starts with a hash ("#") immediately followed by code, then uncomment it. e.g. #foo becomes: foo """ ep = mu.interface.editor.EditorPane(None, 'baz') assert ep.toggle_line(' #foo') == ' foo' def test_EditorPane_toggle_line_starts_with_hash_space(): """ If the line starts with a PEP-8 compliant hash followed by a space ("# ") then uncomment it. e.g. # foo becomes: foo (Note the space is dropped.) """ ep = mu.interface.editor.EditorPane(None, 'baz') assert ep.toggle_line(' # foo') == ' foo' def test_EditorPane_toggle_line_normal_line(): """ If the line is an uncommented line of text, then comment it with hash-space ("# "). e.g. foo becomes # foo """ ep = mu.interface.editor.EditorPane(None, 'baz') assert ep.toggle_line(' foo') == '# foo' def test_EditorPane_toggle_line_whitespace_line(): """ If the line is simply empty or contains only whitespace, then ignore it and return as-is. """ ep = mu.interface.editor.EditorPane(None, 'baz') assert ep.toggle_line(' ') == ' ' def test_EditorPane_toggle_comments_no_selection(): """ If no text is selected, toggle the line currently containing the cursor. """ ep = mu.interface.editor.EditorPane(None, 'baz') ep.hasSelectedText = mock.MagicMock(return_value=False) ep.getCursorPosition = mock.MagicMock(return_value=(1, 0)) ep.text = mock.MagicMock(return_value='foo') ep.setSelection = mock.MagicMock() ep.replaceSelectedText = mock.MagicMock() ep.toggle_comments() assert ep.setSelection.call_count == 2 # Final setSelection call re-selects the changed line. assert mock.call(1, 0, 1, 4) == ep.setSelection.call_args_list[1] ep.replaceSelectedText.assert_called_once_with('# foo') def test_EditorPane_toggle_comments_selected_normal_lines(): """ Check normal lines of code are properly commented and subsequently highlighted. """ ep = mu.interface.editor.EditorPane(None, 'foo\nbar\nbaz') ep.hasSelectedText = mock.MagicMock(return_value=True) ep.getSelection = mock.MagicMock(return_value=(0, 0, 2, 2)) ep.selectedText = mock.MagicMock(return_value='foo\nbar\nbaz') ep.replaceSelectedText = mock.MagicMock() ep.setSelection = mock.MagicMock() ep.toggle_comments() ep.replaceSelectedText.assert_called_once_with('# foo\n# bar\n# baz') ep.setSelection.assert_called_once_with(0, 0, 2, 4) def test_EditorPane_toggle_comments_selected_hash_comment_lines(): """ Check commented lines starting with "#" are now uncommented. """ ep = mu.interface.editor.EditorPane(None, '#foo\n#bar\n#baz') ep.hasSelectedText = mock.MagicMock(return_value=True) ep.getSelection = mock.MagicMock(return_value=(0, 0, 2, 3)) ep.selectedText = mock.MagicMock(return_value='#foo\n#bar\n#baz') ep.replaceSelectedText = mock.MagicMock() ep.setSelection = mock.MagicMock() ep.toggle_comments() ep.replaceSelectedText.assert_called_once_with('foo\nbar\nbaz') ep.setSelection.assert_called_once_with(0, 0, 2, 2) def test_EditorPane_toggle_comments_selected_hash_space_comment_lines(): """ Check commented lines starting with "# " are now uncommented. """ ep = mu.interface.editor.EditorPane(None, '# foo\n# bar\n# baz') ep.hasSelectedText = mock.MagicMock(return_value=True) ep.getSelection = mock.MagicMock(return_value=(0, 0, 2, 4)) ep.selectedText = mock.MagicMock(return_value='# foo\n# bar\n# baz') ep.replaceSelectedText = mock.MagicMock() ep.setSelection = mock.MagicMock() ep.toggle_comments() ep.replaceSelectedText.assert_called_once_with('foo\nbar\nbaz') ep.setSelection.assert_called_once_with(0, 0, 2, 2) mu-editor-1.0.2+dfsg/tests/interface/test_main.py000066400000000000000000002013231341747546300220140ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the user interface elements of Mu. """ from PyQt5.QtWidgets import QAction, QWidget, QFileDialog, QMessageBox from PyQt5.QtCore import Qt, QSize, QIODevice from PyQt5.QtGui import QIcon, QKeySequence from unittest import mock from mu import __version__ import mu.interface.main import mu.interface.themes import mu.interface.editor import pytest def test_ButtonBar_init(): """ Ensure everything is set and configured given a new instance of the ButtonBar. """ mock_movable = mock.MagicMock(return_value=None) mock_icon_size = mock.MagicMock(return_value=None) mock_tool_button_size = mock.MagicMock(return_value=None) mock_context_menu_policy = mock.MagicMock(return_value=None) mock_object_name = mock.MagicMock(return_value=None) mock_reset = mock.MagicMock(return_value=None) with mock.patch('mu.interface.main.ButtonBar.setMovable', mock_movable), \ mock.patch('mu.interface.main.ButtonBar.setIconSize', mock_icon_size), \ mock.patch('mu.interface.main.ButtonBar.setToolButtonStyle', mock_tool_button_size), \ mock.patch('mu.interface.main.ButtonBar.setContextMenuPolicy', mock_context_menu_policy), \ mock.patch('mu.interface.main.ButtonBar.setObjectName', mock_object_name), \ mock.patch('mu.interface.main.ButtonBar.reset', mock_reset): mu.interface.main.ButtonBar(None) mock_movable.assert_called_once_with(False) mock_icon_size.assert_called_once_with(QSize(64, 64)) mock_tool_button_size.assert_called_once_with(3) mock_context_menu_policy.assert_called_once_with(Qt.PreventContextMenu) mock_object_name.assert_called_once_with('StandardToolBar') assert mock_reset.call_count == 1 def test_ButtonBar_reset(): """ Ensure reset clears the slots and actions. """ mock_clear = mock.MagicMock() with mock.patch('mu.interface.main.ButtonBar.clear', mock_clear): b = mu.interface.main.ButtonBar(None) mock_clear.reset_mock() b.slots = {'foo': 'bar'} b.reset() assert b.slots == {} mock_clear.assert_called_once_with() def test_ButtonBar_change_mode(): """ Ensure the expected actions are added to the button bar when the mode is changed. """ mock_reset = mock.MagicMock() mock_add_action = mock.MagicMock() mock_add_separator = mock.MagicMock() actions = [ { 'name': 'foo', 'display_name': 'Foo', 'description': 'bar', }, ] mock_mode = mock.MagicMock() mock_mode.actions.return_value = actions with mock.patch('mu.interface.main.ButtonBar.reset', mock_reset), \ mock.patch('mu.interface.main.ButtonBar.addAction', mock_add_action), \ mock.patch('mu.interface.main.ButtonBar.addSeparator', mock_add_separator): b = mu.interface.main.ButtonBar(None) mock_reset.reset_mock() b.change_mode(mock_mode) mock_reset.assert_called_once_with() assert mock_add_action.call_count == 11 assert mock_add_separator.call_count == 4 def test_ButtonBar_set_responsive_mode(): """ Does the button bar shrink in compact mode and grow out of it? """ mock_icon_size = mock.MagicMock(return_value=None) with mock.patch('mu.interface.main.ButtonBar.setIconSize', mock_icon_size): bb = mu.interface.main.ButtonBar(None) bb.setStyleSheet = mock.MagicMock() bb.set_responsive_mode(1024, 800) mock_icon_size.assert_called_with(QSize(64, 64)) default_font = str(mu.interface.themes.DEFAULT_FONT_SIZE) style = "QWidget{font-size: " + default_font + "px;}" bb.setStyleSheet.assert_called_with(style) bb.set_responsive_mode(939, 800) mock_icon_size.assert_called_with(QSize(48, 48)) bb.setStyleSheet.assert_called_with(style) bb.set_responsive_mode(939, 599) mock_icon_size.assert_called_with(QSize(32, 32)) style = "QWidget{font-size: " + str(10) + "px;}" bb.setStyleSheet.assert_called_with(style) def test_ButtonBar_add_action(): """ Check the appropriately referenced QAction is created by a call to addAction. """ bb = mu.interface.main.ButtonBar(None) with mock.patch('builtins.super') as mock_s: bb.addAction('save', 'Save', 'save stuff') mock_s.assert_called_once_with() assert 'save' in bb.slots assert isinstance(bb.slots['save'], QAction) def test_ButtonBar_connect(): """ Check the named slot is connected to the slot handler. """ bb = mu.interface.main.ButtonBar(None) bb.parentWidget = mock.MagicMock(return_value=QWidget()) bb.addAction('save', 'Save', 'save stuff') bb.slots['save'].pyqtConfigure = mock.MagicMock(return_value=None) bb.slots['save'].setShortcut = mock.MagicMock() mock_handler = mock.MagicMock(return_value=None) bb.connect('save', mock_handler, 'Ctrl+S') slot = bb.slots['save'] slot.pyqtConfigure.assert_called_once_with(triggered=mock_handler) slot.setShortcut.assert_called_once_with(QKeySequence('Ctrl+S')) def test_FileTabs_init(): """ Ensure a FileTabs instance is initialised as expected. """ with mock.patch('mu.interface.main.FileTabs.setTabsClosable') as mstc, \ mock.patch('mu.interface.main.FileTabs.tabCloseRequested') as cr, \ mock.patch('mu.interface.main.FileTabs.currentChanged') as mcc: qtw = mu.interface.main.FileTabs() mstc.assert_called_once_with(True) cr.connect.assert_called_once_with(qtw.removeTab) mcc.connect.assert_called_once_with(qtw.change_tab) def test_FileTabs_removeTab_cancel(): """ Ensure removeTab asks the user for confirmation if there is a modification to the tab. If "cancel" is selected, the parent removeTab is NOT called. """ qtw = mu.interface.main.FileTabs() mock_tab = mock.MagicMock() mock_tab.isModified.return_value = True qtw.widget = mock.MagicMock(return_value=mock_tab) mock_window = mock.MagicMock() mock_window.show_confirmation.return_value = QMessageBox.Cancel qtw.nativeParentWidget = mock.MagicMock(return_value=mock_window) tab_id = 1 with mock.patch('mu.interface.main.QTabWidget.removeTab', return_value='foo') as rt: qtw.removeTab(tab_id) msg = 'There is un-saved work, closing the tab will cause you to ' \ 'lose it.' mock_window.show_confirmation.assert_called_once_with(msg) assert rt.call_count == 0 qtw.widget.assert_called_once_with(tab_id) assert mock_tab.isModified.call_count == 1 def test_FileTabs_removeTab_ok(): """ Ensure removeTab asks the user for confirmation if there is a modification to the tab. If user responds with "OK", the parent removeTab IS called. """ qtw = mu.interface.main.FileTabs() mock_tab = mock.MagicMock() mock_tab.isModified.return_value = True qtw.widget = mock.MagicMock(return_value=mock_tab) mock_window = mock.MagicMock() mock_window.show_confirmation.return_value = QMessageBox.Ok qtw.nativeParentWidget = mock.MagicMock(return_value=mock_window) tab_id = 1 with mock.patch('mu.interface.main.QTabWidget.removeTab', return_value='foo') as rt: qtw.removeTab(tab_id) msg = 'There is un-saved work, closing the tab will cause you to ' \ 'lose it.' mock_window.show_confirmation.assert_called_once_with(msg) rt.assert_called_once_with(tab_id) qtw.widget.assert_called_once_with(tab_id) assert mock_tab.isModified.call_count == 1 def test_FileTabs_change_tab(): """ Ensure change_tab updates the title of the application window with the label from the currently selected file. """ qtw = mu.interface.main.FileTabs() mock_tab = mock.MagicMock() mock_tab.label = "foo" qtw.widget = mock.MagicMock(return_value=mock_tab) mock_window = mock.MagicMock() qtw.nativeParentWidget = mock.MagicMock(return_value=mock_window) tab_id = 1 qtw.change_tab(tab_id) mock_window.update_title.assert_called_once_with(mock_tab.label) def test_FileTabs_change_tab_no_tabs(): """ If there are no tabs left, ensure change_tab updates the title of the application window with the default value (None). """ qtw = mu.interface.main.FileTabs() qtw.widget = mock.MagicMock(return_value=None) mock_window = mock.MagicMock() qtw.nativeParentWidget = mock.MagicMock(return_value=mock_window) qtw.change_tab(0) mock_window.update_title.assert_called_once_with(None) def test_Window_attributes(): """ Expect the title and icon to be set correctly. """ w = mu.interface.main.Window() assert w.title == "Mu {}".format(__version__) assert w.icon == "icon" assert w.zoom_position == 2 assert w.zooms == ('xs', 's', 'm', 'l', 'xl', 'xxl', 'xxxl') def test_Window_resizeEvent(): """ Ensure resize events are passed along to the button bar. """ resizeEvent = mock.MagicMock() size = mock.MagicMock() size.width.return_value = 1024 size.height.return_value = 768 resizeEvent.size.return_value = size w = mu.interface.main.Window() w.button_bar = mock.MagicMock() w.resizeEvent(resizeEvent) w.button_bar.set_responsive_mode.assert_called_with(1024, 768) def test_Window_select_mode_selected(): """ Handle the selection of a new mode. """ mock_mode_selector = mock.MagicMock() mock_selector = mock.MagicMock() mock_selector.get_mode.return_value = 'foo' mock_mode_selector.return_value = mock_selector mock_modes = mock.MagicMock() current_mode = 'python' with mock.patch('mu.interface.main.ModeSelector', mock_mode_selector): w = mu.interface.main.Window() result = w.select_mode(mock_modes, current_mode) assert result == 'foo' mock_selector.setup.assert_called_once_with(mock_modes, current_mode) mock_selector.exec.assert_called_once_with() def test_Window_select_mode_cancelled(): """ Handle the selection of a new mode. """ mock_mode_selector = mock.MagicMock() mock_selector = mock.MagicMock() mock_selector.get_mode.side_effect = ValueError() mock_mode_selector.return_value = mock_selector mock_modes = mock.MagicMock() current_mode = 'python' with mock.patch('mu.interface.main.ModeSelector', mock_mode_selector): w = mu.interface.main.Window() result = w.select_mode(mock_modes, current_mode) assert result is None def test_Window_change_mode(): """ Ensure the change of mode is made by the button_bar. """ mock_mode = mock.MagicMock() api = ['API details', ] mock_mode.api.return_value = api w = mu.interface.main.Window() w.tabs = mock.MagicMock() w.tabs.count = mock.MagicMock(return_value=2) tab1 = mock.MagicMock() tab2 = mock.MagicMock() w.tabs.widget = mock.MagicMock(side_effect=[tab1, tab2]) w.button_bar = mock.MagicMock() w.change_mode(mock_mode) w.button_bar.change_mode.assert_called_with(mock_mode) tab1.set_api.assert_called_once_with(api) tab2.set_api.assert_called_once_with(api) def test_Window_set_zoom(): """ Ensure the correct signal is emitted. """ w = mu.interface.main.Window() w._zoom_in = mock.MagicMock() w.set_zoom() w._zoom_in.emit.assert_called_once_with('m') def test_Window_zoom_in(): """ Ensure the correct signal is emitted. """ w = mu.interface.main.Window() w._zoom_in = mock.MagicMock() w.zoom_in() w._zoom_in.emit.assert_called_once_with('l') def test_Window_zoom_out(): """ Ensure the correct signal is emitted. """ w = mu.interface.main.Window() w._zoom_out = mock.MagicMock() w.zoom_out() w._zoom_out.emit.assert_called_once_with('s') def test_Window_connect_zoom(): """ Ensure the zoom in/out signals are connected to the passed in widget's zoomIn and zoomOut handlers. """ w = mu.interface.main.Window() w._zoom_in = mock.MagicMock() w._zoom_in.connect = mock.MagicMock() w._zoom_out = mock.MagicMock() w._zoom_out.connect = mock.MagicMock() widget = mock.MagicMock() widget.zoomIn = mock.MagicMock() widget.zoomOut = mock.MagicMock() w.connect_zoom(widget) assert w._zoom_in.connect.called_once_with(widget.zoomIn) assert w._zoom_out.connect.called_once_with(widget.zoomOut) def test_Window_current_tab(): """ Ensure the correct tab is extracted from Window.tabs. """ w = mu.interface.main.Window() w.tabs = mock.MagicMock() w.tabs.currentWidget = mock.MagicMock(return_value='foo') assert w.current_tab == 'foo' def test_Window_set_read_only(): """ Ensure all the tabs have the setReadOnly method set to the boolean passed into set_read_only. """ w = mu.interface.main.Window() w.tabs = mock.MagicMock() w.tabs.count = mock.MagicMock(return_value=2) tab1 = mock.MagicMock() tab2 = mock.MagicMock() w.tabs.widget = mock.MagicMock(side_effect=[tab1, tab2]) w.set_read_only(True) assert w.read_only_tabs tab1.setReadOnly.assert_called_once_with(True) tab2.setReadOnly.assert_called_once_with(True) def test_Window_get_load_path(): """ Ensure the QFileDialog is called with the expected arguments and the resulting path is returned. """ mock_fd = mock.MagicMock() path = '/foo/bar.py' mock_fd.getOpenFileName = mock.MagicMock(return_value=(path, True)) w = mu.interface.main.Window() w.widget = mock.MagicMock() with mock.patch('mu.interface.main.QFileDialog', mock_fd): returned_path = w.get_load_path('micropython', '*.py *.hex *.PY *.HEX') assert returned_path == path assert w.previous_folder == '/foo' # Note lack of filename. mock_fd.getOpenFileName.assert_called_once_with( w.widget, 'Open file', 'micropython', '*.py *.hex *.PY *.HEX') def test_Window_get_save_path(): """ Ensure the QFileDialog is called with the expected arguments and the resulting path is returned. """ mock_fd = mock.MagicMock() path = '/foo/bar.py' mock_fd.getSaveFileName = mock.MagicMock(return_value=(path, True)) w = mu.interface.main.Window() w.widget = mock.MagicMock() with mock.patch('mu.interface.main.QFileDialog', mock_fd): returned_path = w.get_save_path('micropython') mock_fd.getSaveFileName.assert_called_once_with(w.widget, 'Save file', 'micropython') assert w.previous_folder == '/foo' # Note lack of filename. assert returned_path == path def test_Window_get_microbit_path(): """ Ensures the QFileDialog is called with the expected arguments and the resulting path is returned. """ mock_fd = mock.MagicMock() path = '/foo' ShowDirsOnly = QFileDialog.ShowDirsOnly mock_fd.getExistingDirectory = mock.MagicMock(return_value=path) mock_fd.ShowDirsOnly = ShowDirsOnly w = mu.interface.main.Window() w.widget = mock.MagicMock() with mock.patch('mu.interface.main.QFileDialog', mock_fd): assert w.get_microbit_path('micropython') == path title = 'Locate BBC micro:bit' mock_fd.getExistingDirectory.assert_called_once_with(w.widget, title, 'micropython', ShowDirsOnly) def test_Window_add_tab(): """ Ensure adding a tab works as expected and the expected on_modified handler is created. """ w = mu.interface.main.Window() w.read_only_tabs = True new_tab_index = 999 w.tabs = mock.MagicMock() w.tabs.addTab = mock.MagicMock(return_value=new_tab_index) w.tabs.currentIndex = mock.MagicMock(return_value=new_tab_index) w.tabs.setCurrentIndex = mock.MagicMock(return_value=None) w.tabs.setTabText = mock.MagicMock(return_value=None) w.connect_zoom = mock.MagicMock(return_value=None) w.set_theme = mock.MagicMock(return_value=None) w.theme = mock.MagicMock() w.api = ['an api help text', ] ep = mu.interface.editor.EditorPane('/foo/bar.py', 'baz') ep.set_api = mock.MagicMock() ep.modificationChanged = mock.MagicMock() ep.modificationChanged.connect = mock.MagicMock(return_value=None) ep.connect_margin = mock.MagicMock() ep.setFocus = mock.MagicMock(return_value=None) ep.setReadOnly = mock.MagicMock() mock_ed = mock.MagicMock(return_value=ep) path = '/foo/bar.py' text = 'print("Hello, World!")' api = ['API definition', ] w.breakpoint_toggle = mock.MagicMock() with mock.patch('mu.interface.main.EditorPane', mock_ed): w.add_tab(path, text, api, '\n') mock_ed.assert_called_once_with(path, text, '\n') w.tabs.addTab.assert_called_once_with(ep, ep.label) w.tabs.setCurrentIndex.assert_called_once_with(new_tab_index) w.connect_zoom.assert_called_once_with(ep) w.set_theme.assert_called_once_with(w.theme) ep.connect_margin.assert_called_once_with(w.breakpoint_toggle) ep.set_api.assert_called_once_with(api) ep.setFocus.assert_called_once_with() ep.setReadOnly.assert_called_once_with(w.read_only_tabs) on_modified = ep.modificationChanged.connect.call_args[0][0] on_modified() w.tabs.setTabText.assert_called_once_with(new_tab_index, ep.label) def test_Window_focus_tab(): """ Given a tab instance, ensure it has focus. """ w = mu.interface.main.Window() w.tabs = mock.MagicMock() w.tabs.indexOf.return_value = 1 tab = mock.MagicMock() w.focus_tab(tab) w.tabs.setCurrentIndex.assert_called_once_with(1) tab.setFocus.assert_called_once_with() def test_Window_tab_count(): """ Ensure the number from Window.tabs.count() is returned. """ w = mu.interface.main.Window() w.tabs = mock.MagicMock() w.tabs.count = mock.MagicMock(return_value=2) assert w.tab_count == 2 w.tabs.count.assert_called_once_with() def test_Window_widgets(): """ Ensure a list derived from calls to Window.tabs.widget(i) is returned. """ w = mu.interface.main.Window() w.tabs = mock.MagicMock() w.tabs.count = mock.MagicMock(return_value=2) tab1 = mock.MagicMock() tab2 = mock.MagicMock() w.tabs.widget = mock.MagicMock(side_effect=[tab1, tab2]) result = w.widgets assert result == [tab1, tab2] w.tabs.count.assert_called_once_with() def test_Window_modified(): """ Ensure the window's modified attribute is derived from the modified state of its tabs. """ w = mu.interface.main.Window() w.tabs = mock.MagicMock() w.tabs.count = mock.MagicMock(return_value=2) widget1 = mock.MagicMock() widget1.isModified = mock.MagicMock(return_value=False) widget2 = mock.MagicMock() widget2.isModified = mock.MagicMock(return_value=False) w.tabs.widget = mock.MagicMock(side_effect=[widget1, widget2]) assert w.modified is False widget2.isModified = mock.MagicMock(return_value=True) w.tabs.widget = mock.MagicMock(side_effect=[widget1, widget2]) assert w.modified def test_Window_on_serial_read(): """ When data is received the data_received signal should emit it. """ w = mu.interface.main.Window() w.serial = mock.MagicMock() w.serial.readAll.return_value = b'Hello' w.data_received = mock.MagicMock() w.on_serial_read() w.data_received.emit.assert_called_once_with(b'Hello') def test_Window_on_stdout_write(): """ Ensure the data_received signal is emitted with the data. """ w = mu.interface.main.Window() w.data_received = mock.MagicMock() w.on_stdout_write(b'hello') w.data_received.emit.assert_called_once_with(b'hello') def test_Window_open_serial_link(): """ Ensure the serial port is opened in the expected manner. """ mock_serial = mock.MagicMock() mock_serial.setPortName = mock.MagicMock(return_value=None) mock_serial.setBaudRate = mock.MagicMock(return_value=None) mock_serial.open = mock.MagicMock(return_value=True) mock_serial.readyRead = mock.MagicMock() mock_serial.readyRead.connect = mock.MagicMock(return_value=None) mock_serial_class = mock.MagicMock(return_value=mock_serial) with mock.patch('mu.interface.main.QSerialPort', mock_serial_class): w = mu.interface.main.Window() w.open_serial_link('COM0') assert w.input_buffer == [] mock_serial.setPortName.assert_called_once_with('COM0') mock_serial.setBaudRate.assert_called_once_with(115200) mock_serial.open.assert_called_once_with(QIODevice.ReadWrite) mock_serial.readyRead.connect.assert_called_once_with(w.on_serial_read) def test_Window_open_serial_link_unable_to_connect(): """ If serial.open fails raise an IOError. """ mock_serial = mock.MagicMock() mock_serial.setPortName = mock.MagicMock(return_value=None) mock_serial.setBaudRate = mock.MagicMock(return_value=None) mock_serial.open = mock.MagicMock(return_value=False) mock_serial_class = mock.MagicMock(return_value=mock_serial) with mock.patch('mu.interface.main.QSerialPort', mock_serial_class): with pytest.raises(IOError): w = mu.interface.main.Window() w.open_serial_link('COM0') def test_Window_open_serial_link_DTR_unset(): """ If data terminal ready (DTR) is unset (as can be the case on some Windows / Qt combinations) then fall back to PySerial to correct. See issues #281 and #302 for details. """ mock_qt_serial = mock.MagicMock() mock_qt_serial.isDataTerminalReady.return_value = False mock_py_serial = mock.MagicMock() mock_serial_class = mock.MagicMock(return_value=mock_qt_serial) with mock.patch('mu.interface.main.QSerialPort', mock_serial_class): with mock.patch('mu.interface.main.serial', mock_py_serial): w = mu.interface.main.Window() w.open_serial_link('COM0') mock_qt_serial.close.assert_called_once_with() assert mock_qt_serial.open.call_count == 2 mock_py_serial.Serial.assert_called_once_with('COM0') mock_pyser = mock_py_serial.Serial('COM0') assert mock_pyser.dtr is True mock_pyser.close.assert_called_once_with() def test_Window_close_serial_link(): """ Ensure the serial link is closed / cleaned up as expected. """ mock_serial = mock.MagicMock() w = mu.interface.main.Window() w.serial = mock_serial w.close_serial_link() mock_serial.close.assert_called_once_with() assert w.serial is None def test_Window_add_filesystem(): """ Ensure the expected settings are updated when adding a file system pane. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.splitter = mock.MagicMock() w.addDockWidget = mock.MagicMock(return_value=None) w.connect_zoom = mock.MagicMock(return_value=None) mock_fs = mock.MagicMock() mock_fs.setFocus = mock.MagicMock(return_value=None) mock_fs_class = mock.MagicMock(return_value=mock_fs) mock_dock = mock.MagicMock() mock_dock_class = mock.MagicMock(return_value=mock_dock) mock_file_manager = mock.MagicMock() with mock.patch('mu.interface.main.FileSystemPane', mock_fs_class), \ mock.patch('mu.interface.main.QDockWidget', mock_dock_class): result = w.add_filesystem('path/to/home', mock_file_manager) mock_fs_class.assert_called_once_with('path/to/home') assert result == mock_fs assert w.fs_pane == mock_fs w.addDockWidget.assert_called_once_with(Qt.BottomDockWidgetArea, mock_dock) mock_fs.setFocus.assert_called_once_with() mock_file_manager.on_list_files.connect.\ assert_called_once_with(mock_fs.on_ls) mock_fs.list_files.connect.assert_called_once_with(mock_file_manager.ls) mock_fs.microbit_fs.put.connect.\ assert_called_once_with(mock_file_manager.put) mock_fs.microbit_fs.delete.connect.\ assert_called_once_with(mock_file_manager.delete) mock_fs.microbit_fs.list_files.connect.\ assert_called_once_with(mock_file_manager.ls) mock_fs.local_fs.get.connect.assert_called_once_with(mock_file_manager.get) mock_fs.local_fs.list_files.connect.\ assert_called_once_with(mock_file_manager.ls) mock_file_manager.on_put_file.connect.\ assert_called_once_with(mock_fs.microbit_fs.on_put) mock_file_manager.on_delete_file.connect.\ assert_called_once_with(mock_fs.microbit_fs.on_delete) mock_file_manager.on_get_file.connect.\ assert_called_once_with(mock_fs.local_fs.on_get) mock_file_manager.on_list_fail.connect.\ assert_called_once_with(mock_fs.on_ls_fail) mock_file_manager.on_put_fail.connect.\ assert_called_once_with(mock_fs.on_put_fail) mock_file_manager.on_delete_fail.connect.\ assert_called_once_with(mock_fs.on_delete_fail) mock_file_manager.on_get_fail.connect.\ assert_called_once_with(mock_fs.on_get_fail) w.connect_zoom.assert_called_once_with(mock_fs) def test_Window_add_filesystem_open_signal(): w = mu.interface.main.Window() w.open_file = mock.MagicMock() mock_open_emit = mock.MagicMock() w.open_file.emit = mock_open_emit pane = w.add_filesystem('homepath', mock.MagicMock()) pane.open_file.emit('test') mock_open_emit.assert_called_once_with('test') def test_Window_add_micropython_repl(): """ Ensure the expected object is instantiated and add_repl is called for a MicroPython based REPL. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.add_repl = mock.MagicMock() def side_effect(self, w=w): w.serial = mock.MagicMock() w.open_serial_link = mock.MagicMock(side_effect=side_effect) w.data_received = mock.MagicMock() mock_repl = mock.MagicMock() mock_repl_class = mock.MagicMock(return_value=mock_repl) with mock.patch('mu.interface.main.MicroPythonREPLPane', mock_repl_class): w.add_micropython_repl('COM0', 'Test REPL') mock_repl_class.assert_called_once_with(serial=w.serial) w.open_serial_link.assert_called_once_with('COM0') assert w.serial.write.call_count == 2 assert w.serial.write.call_args_list[0][0][0] == b'\x02' assert w.serial.write.call_args_list[1][0][0] == b'\x03' w.data_received.connect.assert_called_once_with(mock_repl.process_bytes) w.add_repl.assert_called_once_with(mock_repl, 'Test REPL') def test_Window_add_micropython_repl_no_interrupt(): """ Ensure the expected object is instantiated and add_repl is called for a MicroPython based REPL. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.add_repl = mock.MagicMock() def side_effect(self, w=w): w.serial = mock.MagicMock() w.open_serial_link = mock.MagicMock(side_effect=side_effect) w.data_received = mock.MagicMock() mock_repl = mock.MagicMock() mock_repl_class = mock.MagicMock(return_value=mock_repl) with mock.patch('mu.interface.main.MicroPythonREPLPane', mock_repl_class): w.add_micropython_repl('COM0', 'Test REPL', False) mock_repl_class.assert_called_once_with(serial=w.serial) w.open_serial_link.assert_called_once_with('COM0') assert w.serial.write.call_count == 0 w.data_received.connect.assert_called_once_with(mock_repl.process_bytes) w.add_repl.assert_called_once_with(mock_repl, 'Test REPL') def test_Window_add_micropython_plotter(): """ Ensure the expected object is instantiated and add_plotter is called for a MicroPython based plotter. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.add_plotter = mock.MagicMock() def side_effect(self, w=w): w.serial = mock.MagicMock() w.open_serial_link = mock.MagicMock(side_effect=side_effect) w.data_received = mock.MagicMock() mock_plotter = mock.MagicMock() mock_plotter_class = mock.MagicMock(return_value=mock_plotter) mock_mode = mock.MagicMock() with mock.patch('mu.interface.main.PlotterPane', mock_plotter_class): w.add_micropython_plotter('COM0', 'MicroPython Plotter', mock_mode) mock_plotter_class.assert_called_once_with() w.open_serial_link.assert_called_once_with('COM0') w.data_received.connect.assert_called_once_with(mock_plotter.process_bytes) mock_plotter.data_flood.connect.\ assert_called_once_with(mock_mode.on_data_flood) w.add_plotter.assert_called_once_with(mock_plotter, 'MicroPython Plotter') def test_Window_add_python3_plotter(): """ Ensure the plotter is created correctly when in Python 3 mode. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.add_plotter = mock.MagicMock() w.data_received = mock.MagicMock() mock_plotter = mock.MagicMock() mock_plotter_class = mock.MagicMock(return_value=mock_plotter) mock_mode = mock.MagicMock() with mock.patch('mu.interface.main.PlotterPane', mock_plotter_class): w.add_python3_plotter(mock_mode) w.data_received.connect.assert_called_once_with(mock_plotter.process_bytes) mock_plotter.data_flood.connect.\ assert_called_once_with(mock_mode.on_data_flood) w.add_plotter.assert_called_once_with(mock_plotter, 'Python3 data tuple') def test_Window_add_jupyter_repl(): """ Ensure the expected object is instantiated and add_repl is called for a Jupyter based REPL. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.connect_zoom = mock.MagicMock(return_value=None) w.add_repl = mock.MagicMock() mock_kernel_manager = mock.MagicMock() mock_kernel_client = mock.MagicMock() mock_pane = mock.MagicMock() mock_pane_class = mock.MagicMock(return_value=mock_pane) with mock.patch('mu.interface.main.JupyterREPLPane', mock_pane_class): w.add_jupyter_repl(mock_kernel_manager, mock_kernel_client) mock_pane_class.assert_called_once_with() assert mock_pane.kernel_manager == mock_kernel_manager assert mock_pane.kernel_client == mock_kernel_client assert mock_kernel_manager.kernel.gui == 'qt4' w.add_repl.assert_called_once_with(mock_pane, 'Python3 (Jupyter)') def test_Window_add_repl(): """ Ensure the expected settings are updated. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.connect_zoom = mock.MagicMock(return_value=None) w.addDockWidget = mock.MagicMock() mock_repl_pane = mock.MagicMock() mock_repl_pane.setFocus = mock.MagicMock(return_value=None) mock_dock = mock.MagicMock() mock_dock_class = mock.MagicMock(return_value=mock_dock) with mock.patch('mu.interface.main.QDockWidget', mock_dock_class): w.add_repl(mock_repl_pane, 'Test REPL') assert w.repl_pane == mock_repl_pane mock_repl_pane.setFocus.assert_called_once_with() w.connect_zoom.assert_called_once_with(mock_repl_pane) w.addDockWidget.assert_called_once_with(Qt.BottomDockWidgetArea, mock_dock) def test_Window_add_plotter(): """ Ensure the expected settings are updated. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.addDockWidget = mock.MagicMock() mock_plotter_pane = mock.MagicMock() mock_dock = mock.MagicMock() mock_dock_class = mock.MagicMock(return_value=mock_dock) with mock.patch('mu.interface.main.QDockWidget', mock_dock_class): w.add_plotter(mock_plotter_pane, 'Test Plotter') assert w.plotter_pane == mock_plotter_pane mock_plotter_pane.setFocus.assert_called_once_with() mock_plotter_pane.set_theme.assert_called_once_with(w.theme) w.addDockWidget.assert_called_once_with(Qt.BottomDockWidgetArea, mock_dock) def test_Window_add_python3_runner(): """ Ensure a Python 3 runner (to capture stdin/out/err) is displayed correctly. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.connect_zoom = mock.MagicMock(return_value=None) w.addDockWidget = mock.MagicMock() mock_process_runner = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process_runner) mock_dock = mock.MagicMock() mock_dock_class = mock.MagicMock(return_value=mock_dock) name = 'foo' path = 'bar' with mock.patch('mu.interface.main.PythonProcessPane', mock_process_class), \ mock.patch('mu.interface.main.QDockWidget', mock_dock_class): result = w.add_python3_runner(name, path) assert result == mock_process_runner assert w.process_runner == mock_process_runner assert w.runner == mock_dock w.runner.setWidget.assert_called_once_with(w.process_runner) w.addDockWidget.assert_called_once_with(Qt.BottomDockWidgetArea, mock_dock) def test_Window_add_debug_inspector(): """ Ensure a debug inspector (to display local variables) is displayed correctly. """ w = mu.interface.main.Window() w.theme = mock.MagicMock() w.connect_zoom = mock.MagicMock(return_value=None) w.addDockWidget = mock.MagicMock() mock_debug_inspector = mock.MagicMock() mock_debug_inspector_class = mock.MagicMock( return_value=mock_debug_inspector) mock_model = mock.MagicMock() mock_model_class = mock.MagicMock(return_value=mock_model) mock_dock = mock.MagicMock() mock_dock_class = mock.MagicMock(return_value=mock_dock) with mock.patch('mu.interface.main.DebugInspector', mock_debug_inspector_class), \ mock.patch('mu.interface.main.QStandardItemModel', mock_model_class), \ mock.patch('mu.interface.main.QDockWidget', mock_dock_class): w.add_debug_inspector() assert w.debug_inspector == mock_debug_inspector assert w.debug_model == mock_model mock_debug_inspector.setModel.assert_called_once_with(mock_model) mock_dock.setWidget.assert_called_once_with(mock_debug_inspector) w.addDockWidget.assert_called_once_with(Qt.RightDockWidgetArea, mock_dock) def test_Window_update_debug_inspector(): """ Given a representation of the local objects in the debug runner's call stack. Ensure the debug inspector's model is populated in the correct way to show the different types of value. """ locals_dict = { '__builtins__': ['some', 'builtin', 'methods', ], '__debug_code__': '', '__debug_script__': ' '\r' """ mock_serial = mock.MagicMock() mock_clipboard = mock.MagicMock() mock_clipboard.text.return_value = 'paste\nme!' mock_application = mock.MagicMock() mock_application.clipboard.return_value = mock_clipboard with mock.patch('mu.interface.panes.QApplication', mock_application): rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.paste() mock_serial.write.assert_called_once_with(bytes('paste\rme!', 'utf8')) def test_MicroPythonREPLPane_paste_handle_windows_newlines(): """ Pasting into the REPL should handle '\r\n' properly. '\r\n' -> '\r' """ mock_serial = mock.MagicMock() mock_clipboard = mock.MagicMock() mock_clipboard.text.return_value = 'paste\r\nme!' mock_application = mock.MagicMock() mock_application.clipboard.return_value = mock_clipboard with mock.patch('mu.interface.panes.QApplication', mock_application): rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.paste() mock_serial.write.assert_called_once_with(bytes('paste\rme!', 'utf8')) def test_MicroPythonREPLPane_paste_only_works_if_there_is_something_to_paste(): """ Pasting into the REPL should send bytes via the serial connection. """ mock_serial = mock.MagicMock() mock_clipboard = mock.MagicMock() mock_clipboard.text.return_value = '' mock_application = mock.MagicMock() mock_application.clipboard.return_value = mock_clipboard with mock.patch('mu.interface.panes.QApplication', mock_application): rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.paste() assert mock_serial.write.call_count == 0 def test_MicroPythonREPLPane_context_menu(): """ Ensure the context menu for the REPL is configured correctly for non-OSX platforms. """ mock_serial = mock.MagicMock() mock_platform = mock.MagicMock() mock_platform.system.return_value = 'WinNT' mock_qmenu = mock.MagicMock() mock_qmenu_class = mock.MagicMock(return_value=mock_qmenu) with mock.patch('mu.interface.panes.platform', mock_platform), \ mock.patch('mu.interface.panes.QMenu', mock_qmenu_class), \ mock.patch('mu.interface.panes.QCursor'): rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.context_menu() assert mock_qmenu.addAction.call_count == 2 copy_action = mock_qmenu.addAction.call_args_list[0][0] assert copy_action[0] == 'Copy' assert copy_action[1] == rp.copy assert copy_action[2].toString() == 'Ctrl+Shift+C' paste_action = mock_qmenu.addAction.call_args_list[1][0] assert paste_action[0] == 'Paste' assert paste_action[1] == rp.paste assert paste_action[2].toString() == 'Ctrl+Shift+V' assert mock_qmenu.exec_.call_count == 1 def test_MicroPythonREPLPane_context_menu_darwin(): """ Ensure the context menu for the REPL is configured correctly for non-OSX platforms. """ mock_serial = mock.MagicMock() mock_platform = mock.MagicMock() mock_platform.system.return_value = 'Darwin' mock_qmenu = mock.MagicMock() mock_qmenu_class = mock.MagicMock(return_value=mock_qmenu) with mock.patch('mu.interface.panes.platform', mock_platform), \ mock.patch('mu.interface.panes.QMenu', mock_qmenu_class), \ mock.patch('mu.interface.panes.QCursor'): rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.context_menu() assert mock_qmenu.addAction.call_count == 2 copy_action = mock_qmenu.addAction.call_args_list[0][0] assert copy_action[0] == 'Copy' assert copy_action[1] == rp.copy assert copy_action[2].toString() == 'Ctrl+C' paste_action = mock_qmenu.addAction.call_args_list[1][0] assert paste_action[0] == 'Paste' assert paste_action[1] == rp.paste assert paste_action[2].toString() == 'Ctrl+V' assert mock_qmenu.exec_.call_count == 1 def test_MicroPythonREPLPane_keyPressEvent(): """ Ensure key presses in the REPL are handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_A) data.text = mock.MagicMock(return_value='a') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(bytes('a', 'utf-8')) def test_MicroPythonREPLPane_keyPressEvent_backspace(): """ Ensure backspaces in the REPL are handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_Backspace) data.text = mock.MagicMock(return_value='\b') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(b'\b') def test_MicroPythonREPLPane_keyPressEvent_delete(): """ Ensure delete in the REPL is handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_Delete) data.text = mock.MagicMock(return_value='\b') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(b'\x1B[\x33\x7E') def test_MicroPythonREPLPane_keyPressEvent_up(): """ Ensure up arrows in the REPL are handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_Up) data.text = mock.MagicMock(return_value='1b') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(b'\x1B[A') def test_MicroPythonREPLPane_keyPressEvent_down(): """ Ensure down arrows in the REPL are handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_Down) data.text = mock.MagicMock(return_value='1b') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(b'\x1B[B') def test_MicroPythonREPLPane_keyPressEvent_right(): """ Ensure right arrows in the REPL are handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_Right) data.text = mock.MagicMock(return_value='1b') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(b'\x1B[C') def test_MicroPythonREPLPane_keyPressEvent_left(): """ Ensure left arrows in the REPL are handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_Left) data.text = mock.MagicMock(return_value='1b') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(b'\x1B[D') def test_MicroPythonREPLPane_keyPressEvent_home(): """ Ensure home key in the REPL is handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_Home) data.text = mock.MagicMock(return_value='1b') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(b'\x1B[H') def test_MicroPythonREPLPane_keyPressEvent_end(): """ Ensure end key in the REPL is handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_End) data.text = mock.MagicMock(return_value='1b') data.modifiers = mock.MagicMock(return_value=None) rp.keyPressEvent(data) mock_serial.write.assert_called_once_with(b'\x1B[F') def test_MicroPythonREPLPane_keyPressEvent_CTRL_C_Darwin(): """ Ensure end key in the REPL is handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.copy = mock.MagicMock() data = mock.MagicMock() data.key = mock.MagicMock(return_value=Qt.Key_C) data.text = mock.MagicMock(return_value='1b') data.modifiers.return_value = Qt.ControlModifier | Qt.ShiftModifier rp.keyPressEvent(data) rp.copy.assert_called_once_with() def test_MicroPythonREPLPane_keyPressEvent_CTRL_V_Darwin(): """ Ensure end key in the REPL is handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.paste = mock.MagicMock() data = mock.MagicMock() data.key = mock.MagicMock(return_value=Qt.Key_V) data.text = mock.MagicMock(return_value='1b') data.modifiers.return_value = Qt.ControlModifier | Qt.ShiftModifier rp.keyPressEvent(data) rp.paste.assert_called_once_with() def test_MicroPythonREPLPane_keyPressEvent_meta(): """ Ensure backspaces in the REPL are handled correctly. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_M) data.text = mock.MagicMock(return_value='a') if platform.system() == 'Darwin': data.modifiers = mock.MagicMock(return_value=Qt.MetaModifier) else: data.modifiers = mock.MagicMock(return_value=Qt.ControlModifier) rp.keyPressEvent(data) expected = 1 + Qt.Key_M - Qt.Key_A mock_serial.write.assert_called_once_with(bytes([expected])) def test_MicroPythonREPLPane_process_bytes(): """ Ensure bytes coming from the device to the application are processed as expected. Backspace is enacted, carriage-return is ignored, newline moves the cursor position to the end of the line before enacted and all others are simply inserted. """ mock_serial = mock.MagicMock() mock_tc = mock.MagicMock() mock_tc.movePosition = mock.MagicMock(side_effect=[True, False, True, True]) mock_tc.deleteChar = mock.MagicMock(return_value=None) rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.textCursor = mock.MagicMock(return_value=mock_tc) rp.setTextCursor = mock.MagicMock(return_value=None) rp.insertPlainText = mock.MagicMock(return_value=None) rp.ensureCursorVisible = mock.MagicMock(return_value=None) bs = bytes([8, 13, 10, 65, ]) # \b, \r, \n, 'A' rp.process_bytes(bs) rp.textCursor.assert_called_once_with() assert mock_tc.movePosition.call_count == 4 assert mock_tc.movePosition.call_args_list[0][0][0] == QTextCursor.Down assert mock_tc.movePosition.call_args_list[1][0][0] == QTextCursor.Down assert mock_tc.movePosition.call_args_list[2][0][0] == QTextCursor.Left assert mock_tc.movePosition.call_args_list[3][0][0] == QTextCursor.End assert rp.setTextCursor.call_count == 3 assert rp.setTextCursor.call_args_list[0][0][0] == mock_tc assert rp.setTextCursor.call_args_list[1][0][0] == mock_tc assert rp.setTextCursor.call_args_list[2][0][0] == mock_tc assert rp.insertPlainText.call_count == 2 assert rp.insertPlainText.call_args_list[0][0][0] == chr(10) assert rp.insertPlainText.call_args_list[1][0][0] == chr(65) rp.ensureCursorVisible.assert_called_once_with() def test_MicroPythonREPLPane_process_bytes_VT100(): """ Ensure bytes coming from the device to the application are processed as expected. In this case, make sure VT100 related codes are handled properly. """ mock_serial = mock.MagicMock() mock_tc = mock.MagicMock() mock_tc.movePosition = mock.MagicMock(return_value=False) mock_tc.removeSelectedText = mock.MagicMock() mock_tc.deleteChar = mock.MagicMock(return_value=None) rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.textCursor = mock.MagicMock(return_value=mock_tc) rp.setTextCursor = mock.MagicMock(return_value=None) rp.insertPlainText = mock.MagicMock(return_value=None) rp.ensureCursorVisible = mock.MagicMock(return_value=None) bs = bytes([ 27, 91, ord('1'), ord('A'), # [1A 27, 91, ord('1'), ord('B'), # [1B 27, 91, ord('1'), ord('C'), # [1C 27, 91, ord('1'), ord('D'), # [1D 27, 91, ord('K'), # [K ]) rp.process_bytes(bs) rp.textCursor.assert_called_once_with() assert mock_tc.movePosition.call_count == 6 assert mock_tc.movePosition.call_args_list[0][0][0] == QTextCursor.Down assert mock_tc.movePosition.call_args_list[1][0][0] == QTextCursor.Up assert mock_tc.movePosition.call_args_list[2][0][0] == QTextCursor.Down assert mock_tc.movePosition.call_args_list[3][0][0] == \ QTextCursor.Right assert mock_tc.movePosition.call_args_list[4][0][0] == QTextCursor.Left assert mock_tc.movePosition.call_args_list[5][0][0] == \ QTextCursor.EndOfLine assert mock_tc.movePosition.call_args_list[5][1]['mode'] == \ QTextCursor.KeepAnchor assert rp.setTextCursor.call_count == 5 assert rp.setTextCursor.call_args_list[0][0][0] == mock_tc assert rp.setTextCursor.call_args_list[1][0][0] == mock_tc assert rp.setTextCursor.call_args_list[2][0][0] == mock_tc assert rp.setTextCursor.call_args_list[3][0][0] == mock_tc assert rp.setTextCursor.call_args_list[4][0][0] == mock_tc mock_tc.removeSelectedText.assert_called_once_with() rp.ensureCursorVisible.assert_called_once_with() def test_MicroPythonREPLPane_clear(): """ Ensure setText is called with an empty string. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.setText = mock.MagicMock(return_value=None) rp.clear() rp.setText.assert_called_once_with('') def test_MicroPythonREPLPane_set_font_size(): """ Ensure the font is updated to the expected point size. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) mock_font = mock.MagicMock() rp.font = mock.MagicMock(return_value=mock_font) rp.setFont = mock.MagicMock() rp.set_font_size(123) mock_font.setPointSize.assert_called_once_with(123) rp.setFont.assert_called_once_with(mock_font) def test_MicroPythonREPLPane_set_zoom(): """ Ensure the font size is correctly set from the t-shirt size. """ mock_serial = mock.MagicMock() rp = mu.interface.panes.MicroPythonREPLPane(mock_serial) rp.set_font_size = mock.MagicMock() rp.set_zoom('xxl') expected = mu.interface.panes.PANE_ZOOM_SIZES['xxl'] rp.set_font_size.assert_called_once_with(expected) def test_MuFileList_show_confirm_overwrite_dialog(): """ Ensure the user is notified of an existing file. """ mfl = mu.interface.panes.MuFileList() mock_qmb = mock.MagicMock() mock_qmb.setIcon = mock.MagicMock(return_value=None) mock_qmb.setText = mock.MagicMock(return_value=None) mock_qmb.setWindowTitle = mock.MagicMock(return_value=None) mock_qmb.exec_ = mock.MagicMock(return_value=QMessageBox.Ok) mock_qmb_class = mock.MagicMock(return_value=mock_qmb) mock_qmb_class.Ok = QMessageBox.Ok mock_qmb_class.Information = QMessageBox.Information with mock.patch('mu.interface.panes.QMessageBox', mock_qmb_class): assert mfl.show_confirm_overwrite_dialog() msg = 'File already exists; overwrite it?' mock_qmb.setText.assert_called_once_with(msg) mock_qmb.setWindowTitle.assert_called_once_with('File already exists') mock_qmb.setIcon.assert_called_once_with(QMessageBox.Information) def test_MicrobitFileList_init(): """ Check the widget references the user's home and allows drag and drop. """ mfs = mu.interface.panes.MicrobitFileList('home/path') assert mfs.home == 'home/path' assert mfs.dragDropMode() == mfs.DragDrop def test_MicrobitFileList_dropEvent(): """ Ensure a valid drop event is handled as expected. """ mock_event = mock.MagicMock() source = mu.interface.panes.LocalFileList('homepath') mock_item = mock.MagicMock() mock_item.text.return_value = 'foo.py' source.currentItem = mock.MagicMock(return_value=mock_item) mock_event.source.return_value = source mfs = mu.interface.panes.MicrobitFileList('homepath') mfs.disable = mock.MagicMock() mfs.set_message = mock.MagicMock() mfs.put = mock.MagicMock() # Test mfs.dropEvent(mock_event) fn = os.path.join('homepath', 'foo.py') assert mfs.set_message.emit.call_count == 1 mfs.put.emit.assert_called_once_with(fn) def test_MicrobitFileList_dropEvent_wrong_source(): """ Ensure that only drop events whose origins are LocalFileList objects are handled. """ mock_event = mock.MagicMock() source = mock.MagicMock() mock_event.source.return_value = source mfs = mu.interface.panes.MicrobitFileList('homepath') mfs.findItems = mock.MagicMock() mfs.dropEvent(mock_event) assert mfs.findItems.call_count == 0 def test_MicrobitFileList_on_put(): """ A message and list_files signal should be emitted. """ mfs = mu.interface.panes.MicrobitFileList('homepath') mfs.set_message = mock.MagicMock() mfs.list_files = mock.MagicMock() mfs.on_put('my_file.py') msg = "'my_file.py' successfully copied to micro:bit." mfs.set_message.emit.assert_called_once_with(msg) mfs.list_files.emit.assert_called_once_with() def test_MicrobitFileList_contextMenuEvent(): """ Ensure that the menu displayed when a file on the micro:bit is right-clicked works as expected when activated. """ mock_menu = mock.MagicMock() mock_action = mock.MagicMock() mock_menu.addAction.return_value = mock_action mock_menu.exec_.return_value = mock_action mfs = mu.interface.panes.MicrobitFileList('homepath') mock_current = mock.MagicMock() mock_current.text.return_value = 'foo.py' mfs.currentItem = mock.MagicMock(return_value=mock_current) mfs.disable = mock.MagicMock() mfs.set_message = mock.MagicMock() mfs.delete = mock.MagicMock() mfs.mapToGlobal = mock.MagicMock() mock_event = mock.MagicMock() with mock.patch('mu.interface.panes.QMenu', return_value=mock_menu): mfs.contextMenuEvent(mock_event) mfs.disable.emit.assert_called_once_with() assert mfs.set_message.emit.call_count == 1 mfs.delete.emit.assert_called_once_with('foo.py') def test_MicrobitFileList_on_delete(): """ On delete should emit a message and list_files signal. """ mfs = mu.interface.panes.MicrobitFileList('homepath') mfs.set_message = mock.MagicMock() mfs.list_files = mock.MagicMock() mfs.on_delete('my_file.py') msg = "'my_file.py' successfully deleted from micro:bit." mfs.set_message.emit.assert_called_once_with(msg) mfs.list_files.emit.assert_called_once_with() def test_LocalFileList_init(): """ Ensure the class instantiates with the expected state. """ lfl = mu.interface.panes.LocalFileList('home/path') assert lfl.home == 'home/path' assert lfl.dragDropMode() == lfl.DragDrop def test_LocalFileList_dropEvent(): """ Ensure a valid drop event is handled as expected. """ mock_event = mock.MagicMock() source = mu.interface.panes.MicrobitFileList('homepath') mock_item = mock.MagicMock() mock_item.text.return_value = 'foo.py' source.currentItem = mock.MagicMock(return_value=mock_item) mock_event.source.return_value = source lfs = mu.interface.panes.LocalFileList('homepath') lfs.disable = mock.MagicMock() lfs.set_message = mock.MagicMock() lfs.get = mock.MagicMock() # Test lfs.dropEvent(mock_event) fn = os.path.join('homepath', 'foo.py') lfs.disable.emit.assert_called_once_with() assert lfs.set_message.emit.call_count == 1 lfs.get.emit.assert_called_once_with('foo.py', fn) def test_LocalFileList_dropEvent_wrong_source(): """ Ensure that only drop events whose origins are LocalFileList objects are handled. """ mock_event = mock.MagicMock() source = mock.MagicMock() mock_event.source.return_value = source lfs = mu.interface.panes.LocalFileList('homepath') lfs.findItems = mock.MagicMock() lfs.dropEvent(mock_event) assert lfs.findItems.call_count == 0 def test_LocalFileList_on_get(): """ On get should emit two signals: a message and list_files. """ lfs = mu.interface.panes.LocalFileList('homepath') lfs.set_message = mock.MagicMock() lfs.list_files = mock.MagicMock() lfs.on_get('my_file.py') msg = ("Successfully copied 'my_file.py' from the micro:bit " "to your computer.") lfs.set_message.emit.assert_called_once_with(msg) lfs.list_files.emit.assert_called_once_with() def test_LocalFileList_contextMenuEvent(): """ Ensure that the menu displayed when a local file is right-clicked works as expected when activated. """ mock_menu = mock.MagicMock() mock_action_first = mock.MagicMock() mock_action_second = mock.MagicMock() mock_menu.addAction.side_effect = [mock_action_first, mock_action_second] mock_menu.exec_.return_value = mock_action_first mfs = mu.interface.panes.LocalFileList('homepath') mock_open = mock.MagicMock() mfs.open_file = mock.MagicMock() mfs.open_file.emit = mock_open mock_current = mock.MagicMock() mock_current.text.return_value = 'foo.py' mfs.currentItem = mock.MagicMock(return_value=mock_current) mfs.set_message = mock.MagicMock() mfs.mapToGlobal = mock.MagicMock() mock_event = mock.MagicMock() with mock.patch('mu.interface.panes.QMenu', return_value=mock_menu): mfs.contextMenuEvent(mock_event) assert mfs.set_message.emit.call_count == 0 mock_open.assert_called_once_with(os.path.join('homepath', 'foo.py')) def test_LocalFileList_contextMenuEvent_external(): """ Ensure that the menu displayed when a local file is right-clicked works as expected when activated. """ mock_menu = mock.MagicMock() mock_action = mock.MagicMock() mock_menu.addAction.side_effect = [mock_action, mock.MagicMock()] mock_menu.exec_.return_value = mock_action mfs = mu.interface.panes.LocalFileList('homepath') mock_open = mock.MagicMock() mfs.open_file = mock.MagicMock() mfs.open_file.emit = mock_open mock_current = mock.MagicMock() mock_current.text.return_value = 'foo.qwerty' mfs.currentItem = mock.MagicMock(return_value=mock_current) mfs.set_message = mock.MagicMock() mfs.mapToGlobal = mock.MagicMock() mock_event = mock.MagicMock() with mock.patch('mu.interface.panes.QMenu', return_value=mock_menu): mfs.contextMenuEvent(mock_event) assert mfs.set_message.emit.call_count == 1 assert mock_open.call_count == 0 def test_FileSystemPane_init(): """ Check things are set up as expected. """ home = 'homepath' test_microbit_fs = mu.interface.panes.MicrobitFileList(home) test_microbit_fs.disable = mock.MagicMock() test_microbit_fs.set_message = mock.MagicMock() test_local_fs = mu.interface.panes.LocalFileList(home) test_local_fs.disable = mock.MagicMock() test_local_fs.set_message = mock.MagicMock() mock_mfl = mock.MagicMock(return_value=test_microbit_fs) mock_lfl = mock.MagicMock(return_value=test_local_fs) with mock.patch('mu.interface.panes.MicrobitFileList', mock_mfl), \ mock.patch('mu.interface.panes.LocalFileList', mock_lfl): fsp = mu.interface.panes.FileSystemPane('homepath') assert isinstance(fsp.microbit_label, QLabel) assert isinstance(fsp.local_label, QLabel) assert fsp.microbit_fs == test_microbit_fs assert fsp.local_fs == test_local_fs test_microbit_fs.disable.connect.assert_called_once_with(fsp.disable) test_microbit_fs.set_message.connect.\ assert_called_once_with(fsp.show_message) test_local_fs.disable.connect.assert_called_once_with(fsp.disable) test_local_fs.set_message.connect.\ assert_called_once_with(fsp.show_message) def test_FileSystemPane_disable(): """ The child list widgets are disabled correctly. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.microbit_fs = mock.MagicMock() fsp.local_fs = mock.MagicMock() fsp.disable() fsp.microbit_fs.setDisabled.assert_called_once_with(True) fsp.local_fs.setDisabled.assert_called_once_with(True) fsp.microbit_fs.setAcceptDrops.assert_called_once_with(False) fsp.local_fs.setAcceptDrops.assert_called_once_with(False) def test_FileSystemPane_enable(): """ The child list widgets are enabled correctly. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.microbit_fs = mock.MagicMock() fsp.local_fs = mock.MagicMock() fsp.enable() fsp.microbit_fs.setDisabled.assert_called_once_with(False) fsp.local_fs.setDisabled.assert_called_once_with(False) fsp.microbit_fs.setAcceptDrops.assert_called_once_with(True) fsp.local_fs.setAcceptDrops.assert_called_once_with(True) def test_FileSystemPane_set_theme(): """ Setting theme doesn't error """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.set_theme('test') def test_FileSystemPane_show_message(): """ Ensure the expected message signal is emitted. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.set_message = mock.MagicMock() fsp.show_message('Hello') fsp.set_message.emit.assert_called_once_with('Hello') def test_FileSystemPane_show_warning(): """ Ensure the expected warning signal is emitted. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.set_warning = mock.MagicMock() fsp.show_warning('Hello') fsp.set_warning.emit.assert_called_once_with('Hello') def test_FileSystemPane_on_ls(): """ When lists of files have been obtained from the micro:bit and local filesystem, make sure they're properly processed by the on_ls event handler. """ fsp = mu.interface.panes.FileSystemPane('homepath') microbit_files = ['foo.py', 'bar.py', ] fsp.microbit_fs = mock.MagicMock() fsp.local_fs = mock.MagicMock() fsp.enable = mock.MagicMock() local_files = ['qux.py', 'baz.py', ] mock_listdir = mock.MagicMock(return_value=local_files) mock_isfile = mock.MagicMock(return_value=True) with mock.patch('mu.interface.panes.os.listdir', mock_listdir),\ mock.patch('mu.interface.panes.os.path.isfile', mock_isfile): fsp.on_ls(microbit_files) fsp.microbit_fs.clear.assert_called_once_with() fsp.local_fs.clear.assert_called_once_with() assert fsp.microbit_fs.addItem.call_count == 2 assert fsp.local_fs.addItem.call_count == 2 fsp.enable.assert_called_once_with() def test_FileSystemPane_on_ls_fail(): """ A warning is emitted and the widget disabled if listing files fails. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.show_warning = mock.MagicMock() fsp.disable = mock.MagicMock() fsp.on_ls_fail() assert fsp.show_warning.call_count == 1 fsp.disable.assert_called_once_with() def test_FileSystem_Pane_on_put_fail(): """ A warning is emitted if putting files on the micro:bit fails. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.show_warning = mock.MagicMock() fsp.on_put_fail('foo.py') assert fsp.show_warning.call_count == 1 def test_FileSystem_Pane_on_delete_fail(): """ A warning is emitted if deleting files on the micro:bit fails. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.show_warning = mock.MagicMock() fsp.on_delete_fail('foo.py') assert fsp.show_warning.call_count == 1 def test_FileSystem_Pane_on_get_fail(): """ A warning is emitted if getting files from the micro:bit fails. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.show_warning = mock.MagicMock() fsp.on_get_fail('foo.py') assert fsp.show_warning.call_count == 1 def test_FileSystemPane_set_font_size(): """ Ensure the right size is set as the point size and the text based UI child widgets are updated. """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.font = mock.MagicMock() fsp.microbit_label = mock.MagicMock() fsp.local_label = mock.MagicMock() fsp.microbit_fs = mock.MagicMock() fsp.local_fs = mock.MagicMock() fsp.set_font_size(22) fsp.font.setPointSize.assert_called_once_with(22) fsp.microbit_label.setFont.assert_called_once_with(fsp.font) fsp.local_label.setFont.assert_called_once_with(fsp.font) fsp.microbit_fs.setFont.assert_called_once_with(fsp.font) fsp.local_fs.setFont.assert_called_once_with(fsp.font) def test_FileSystemPane_open_file(): """ FileSystemPane should propogate the open_file signal """ fsp = mu.interface.panes.FileSystemPane('homepath') fsp.open_file = mock.MagicMock() mock_open_emit = mock.MagicMock() fsp.open_file.emit = mock_open_emit fsp.local_fs.open_file.emit('test') mock_open_emit.assert_called_once_with('test') def test_JupyterREPLPane_init(): """ Ensure the widget is setup with the correct defaults. """ jw = mu.interface.panes.JupyterREPLPane() assert jw.console_height == 10 def test_JupyterREPLPane_append_plain_text(): """ Ensure signal and expected bytes are emitted when _append_plain_text is called. """ jw = mu.interface.panes.JupyterREPLPane() jw.on_append_text = mock.MagicMock() jw._append_plain_text('hello') jw.on_append_text.emit.assert_called_once_with('hello'.encode('utf-8')) def test_JupyterREPLPane_set_font_size(): """ Check the new point size is succesfully applied. """ jw = mu.interface.panes.JupyterREPLPane() jw.set_font_size(16) assert jw.font.pointSize() == 16 def test_JupyterREPLPane_set_zoom(): """ Ensure the expected font point size is set from the zoom size. """ jw = mu.interface.panes.JupyterREPLPane() jw.set_font_size = mock.MagicMock() jw.set_zoom('xxl') jw.set_font_size.\ assert_called_once_with(mu.interface.panes.PANE_ZOOM_SIZES['xxl']) def test_JupyterREPLPane_set_theme_day(): """ Make sure the theme is correctly set for day. """ jw = mu.interface.panes.JupyterREPLPane() jw.set_default_style = mock.MagicMock() jw.set_theme('day') jw.set_default_style.assert_called_once_with() def test_JupyterREPLPane_set_theme_night(): """ Make sure the theme is correctly set for night. """ jw = mu.interface.panes.JupyterREPLPane() jw.set_default_style = mock.MagicMock() jw.set_theme('night') jw.set_default_style.assert_called_once_with(colors='nocolor') def test_JupyterREPLPane_set_theme_contrast(): """ Make sure the theme is correctly set for high contrast. """ jw = mu.interface.panes.JupyterREPLPane() jw.set_default_style = mock.MagicMock() jw.set_theme('contrast') jw.set_default_style.assert_called_once_with(colors='nocolor') def test_JupyterREPLPane_setFocus(): """ Ensures setFocus actually occurs to the _control containing the REPL. """ jw = mu.interface.panes.JupyterREPLPane() jw._control = mock.MagicMock() jw.setFocus() jw._control.setFocus.assert_called_once_with() def test_PythonProcessPane_init(): """ Check the font, input_buffer and other initial state is set as expected. """ ppp = mu.interface.panes.PythonProcessPane() assert ppp.font() assert ppp.process is None assert ppp.input_history == [] assert ppp.start_of_current_line == 0 assert ppp.history_position == 0 assert ppp.running is False assert ppp.stdout_buffer == b'' assert ppp.reading_stdout is False def test_PythonProcessPane_start_process(): """ Ensure the default arguments for starting a new process work as expected. Interactive mode is True, no debugger flag nor additional arguments. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans with mock.patch('mu.interface.panes.QProcess', mock_process_class): ppp = mu.interface.panes.PythonProcessPane() ppp.start_process('script.py', 'workspace') assert mock_process_class.call_count == 1 assert ppp.process == mock_process ppp.process.setProcessChannelMode.assert_called_once_with(mock_merge_chans) ppp.process.setWorkingDirectory.assert_called_once_with('workspace') ppp.process.readyRead.connect.\ assert_called_once_with(ppp.try_read_from_stdout) ppp.process.finished.connect.assert_called_once_with(ppp.finished) expected_script = os.path.abspath(os.path.normcase('script.py')) assert ppp.script == expected_script runner = sys.executable expected_args = ['-i', expected_script, ] # called with interactive flag. ppp.process.start.assert_called_once_with(runner, expected_args) assert ppp.running is True def test_PythonProcessPane_start_process_command_args(): """ Ensure that the new process is passed the expected comand line args. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans with mock.patch('mu.interface.panes.QProcess', mock_process_class): ppp = mu.interface.panes.PythonProcessPane() args = ['foo', 'bar', ] ppp.start_process('script.py', 'workspace', command_args=args) runner = sys.executable expected_script = os.path.abspath(os.path.normcase('script.py')) expected_args = ['-i', expected_script, 'foo', 'bar', ] ppp.process.start.assert_called_once_with(runner, expected_args) def test_PythonProcessPane_start_process_debugger(): """ Ensure starting a new process with the debugger flag set to True uses the debug runner to execute the script. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans with mock.patch('mu.interface.panes.QProcess', mock_process_class): ppp = mu.interface.panes.PythonProcessPane() args = ['foo', 'bar', ] ppp.start_process('script.py', 'workspace', debugger=True, command_args=args) mu_dir = os.path.dirname(os.path.abspath(mu.__file__)) runner = os.path.join(mu_dir, 'mu-debug.py') python_exec = sys.executable expected_script = os.path.abspath(os.path.normcase('script.py')) expected_args = [runner, expected_script, 'foo', 'bar', ] ppp.process.start.assert_called_once_with(python_exec, expected_args) def test_PythonProcessPane_start_process_not_interactive(): """ Ensure that if the interactive flag is unset, the "-i" flag passed into the Python process is missing. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans with mock.patch('mu.interface.panes.QProcess', mock_process_class): ppp = mu.interface.panes.PythonProcessPane() args = ['foo', 'bar', ] ppp.start_process('script.py', 'workspace', interactive=False, command_args=args) runner = sys.executable expected_script = os.path.abspath(os.path.normcase('script.py')) expected_args = [expected_script, 'foo', 'bar', ] ppp.process.start.assert_called_once_with(runner, expected_args) def test_PythonProcessPane_start_process_windows_path(): """ If running on Windows via the installer ensure that the expected paths find their way into a temporary mu.pth file. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans mock_sys = mock.MagicMock() mock_sys.platform = 'win32' mock_sys.executable = 'C:\\Program Files\\Mu\\Python\\pythonw.exe' mock_os_p_e = mock.MagicMock(return_value=True) mock_os_makedirs = mock.MagicMock() mock_site = mock.MagicMock() mock_site.ENABLE_USER_SITE = True mock_site.USER_SITE = ('C:\\Users\\foo\\AppData\\Roaming\\Python\\' 'Python36\\site-packages') mock_site.getusersitepackages.return_value = mock_site.USER_SITE mock_open = mock.mock_open() with mock.patch('mu.interface.panes.QProcess', mock_process_class),\ mock.patch('mu.interface.panes.sys', mock_sys),\ mock.patch('mu.interface.panes.os.path.exists', mock_os_p_e),\ mock.patch('mu.interface.panes.os.makedirs', mock_os_makedirs),\ mock.patch('mu.interface.panes.site', mock_site),\ mock.patch('builtins.open', mock_open): ppp = mu.interface.panes.PythonProcessPane() ppp.start_process('script.py', 'workspace', interactive=False) expected_pth = os.path.join(mock_site.USER_SITE, 'mu.pth') mock_os_makedirs.assert_called_once_with(mock_site.USER_SITE, exist_ok=True) mock_open.assert_called_once_with(expected_pth, 'w') expected = [ 'workspace', os.path.normcase(os.path.dirname(os.path.abspath('script.py'))), ] mock_file = mock_open() added_paths = [call[0][0] for call in mock_file.write.call_args_list] for e in expected: assert e + '\n' in added_paths def test_PythonProcessPane_start_process_windows_path_no_user_site(): """ If running on Windows via the installer ensure that the Mu logs the fact it's unable to use the temporary mu.pth file because there is no USER_SITE enabled. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans mock_sys = mock.MagicMock() mock_sys.platform = 'win32' mock_sys.executable = 'C:\\Program Files\\Mu\\Python\\pythonw.exe' mock_os_p_e = mock.MagicMock(return_value=True) mock_site = mock.MagicMock() mock_site.ENABLE_USER_SITE = False mock_log = mock.MagicMock() with mock.patch('mu.interface.panes.QProcess', mock_process_class),\ mock.patch('mu.interface.panes.sys', mock_sys),\ mock.patch('mu.interface.panes.os.path.exists', mock_os_p_e),\ mock.patch('mu.interface.panes.site', mock_site),\ mock.patch('mu.interface.panes.logger', mock_log): ppp = mu.interface.panes.PythonProcessPane() ppp.start_process('script.py', 'workspace', interactive=False) logs = [call[0][0] for call in mock_log.info.call_args_list] expected = ("Unable to set Python paths. Python's USER_SITE not enabled." " Check configuration with administrator.") assert expected in logs def test_PythonProcessPane_start_process_windows_path_with_exception(): """ If running on Windows via the installer ensure that the expected paths find their way into a temporary mu.pth file. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans mock_sys = mock.MagicMock() mock_sys.platform = 'win32' mock_sys.executable = 'C:\\Program Files\\Mu\\Python\\pythonw.exe' mock_os_p_e = mock.MagicMock(return_value=True) mock_site = mock.MagicMock() mock_site.ENABLE_USER_SITE = True mock_site.USER_SITE = ('C:\\Users\\foo\\AppData\\Roaming\\Python\\' 'Python36\\site-packages') mock_open = mock.MagicMock(side_effect=Exception("Boom")) mock_log = mock.MagicMock() with mock.patch('mu.interface.panes.QProcess', mock_process_class),\ mock.patch('mu.interface.panes.sys', mock_sys),\ mock.patch('mu.interface.panes.os.path.exists', mock_os_p_e),\ mock.patch('mu.interface.panes.site', mock_site),\ mock.patch('builtins.open', mock_open),\ mock.patch('mu.interface.panes.logger', mock_log): ppp = mu.interface.panes.PythonProcessPane() ppp.start_process('script.py', 'workspace', interactive=False) logs = [call[0][0] for call in mock_log.error.call_args_list] expected = ("Could not set Python paths with mu.pth file.") assert expected in logs def test_PythonProcessPane_start_process_user_enviroment_variables(): """ Ensure that if environment variables are set, they are set in the context of the new child Python process. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans mock_environment = mock.MagicMock() mock_environment_class = mock.MagicMock() mock_environment_class.systemEnvironment.return_value = mock_environment with mock.patch('mu.interface.panes.QProcess', mock_process_class), \ mock.patch('mu.interface.panes.QProcessEnvironment', mock_environment_class): ppp = mu.interface.panes.PythonProcessPane() envars = [['name', 'value'], ] ppp.start_process('script.py', 'workspace', interactive=False, envars=envars, runner='foo') assert mock_environment.insert.call_count == 3 assert mock_environment.insert.call_args_list[0][0] == ('PYTHONUNBUFFERED', '1') assert mock_environment.insert.call_args_list[1][0] == ('PYTHONIOENCODING', 'utf-8') assert mock_environment.insert.call_args_list[2][0] == ('name', 'value') def test_PythonProcessPane_start_process_darwin_app_pythonpath(): """ When running on OSX as a packaged mu-editor.app, the PYTHONPATH needs to be set so the child processes have access to the packaged libraries and modules. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans mock_environment = mock.MagicMock() mock_environment_class = mock.MagicMock() mock_environment_class.systemEnvironment.return_value = mock_environment mock_path = mock.MagicMock() mock_path.return_value = ('/Applications/mu-editor.app/' 'Contents/Resources/app/mu') with mock.patch('mu.interface.panes.QProcess', mock_process_class), \ mock.patch('mu.interface.panes.QProcessEnvironment', mock_environment_class), \ mock.patch('os.path.dirname', mock_path), \ mock.patch('sys.platform', 'darwin'): ppp = mu.interface.panes.PythonProcessPane() envars = [['name', 'value'], ] ppp.start_process('script.py', 'workspace', interactive=False, envars=envars, runner='foo') assert mock_environment.insert.call_count == 4 assert mock_environment.insert.call_args_list[0][0] == ('PYTHONUNBUFFERED', '1') assert mock_environment.insert.call_args_list[1][0] == ('PYTHONIOENCODING', 'utf-8') assert mock_environment.insert.call_args_list[2][0] == ('PYTHONPATH', ':'.join(sys.path)) assert mock_environment.insert.call_args_list[3][0] == ('name', 'value') def test_PythonProcessPane_start_process_custom_runner(): """ Ensure that if the runner is set, it is used as the command to start the new child Python process. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans with mock.patch('mu.interface.panes.QProcess', mock_process_class): ppp = mu.interface.panes.PythonProcessPane() args = ['foo', 'bar', ] ppp.start_process('script.py', 'workspace', interactive=False, command_args=args, runner='foo') expected_script = os.path.abspath(os.path.normcase('script.py')) expected_args = [expected_script, 'foo', 'bar', ] ppp.process.start.assert_called_once_with('foo', expected_args) def test_PythonProcessPane_start_process_custom_python_args(): """ Ensure that if there are arguments to be passed into the Python runtime starting the child process, these are passed on correctly. """ mock_process = mock.MagicMock() mock_process_class = mock.MagicMock(return_value=mock_process) mock_merge_chans = mock.MagicMock() mock_process_class.MergedChannels = mock_merge_chans with mock.patch('mu.interface.panes.QProcess', mock_process_class): ppp = mu.interface.panes.PythonProcessPane() py_args = ['-m', 'pgzero', ] ppp.start_process('script.py', 'workspace', interactive=False, python_args=py_args) expected_script = os.path.abspath(os.path.normcase('script.py')) expected_args = ['-m', 'pgzero', expected_script] runner = sys.executable ppp.process.start.assert_called_once_with(runner, expected_args) def test_PythonProcessPane_finished(): """ Check the functionality to handle the process finishing is correct. """ ppp = mu.interface.panes.PythonProcessPane() mock_cursor = mock.MagicMock() mock_cursor.insertText = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.setReadOnly = mock.MagicMock() ppp.setTextCursor = mock.MagicMock() ppp.finished(0, 1) assert mock_cursor.insertText.call_count == 2 assert 'exit code: 0' in mock_cursor.insertText.call_args[0][0] assert 'status: 1' in mock_cursor.insertText.call_args[0][0] ppp.setReadOnly.assert_called_once_with(True) ppp.setTextCursor.assert_called_once_with(ppp.textCursor()) def test_PythonProcessPane_context_menu(): """ Ensure the context menu for the REPL is configured correctly for non-OSX platforms. """ mock_platform = mock.MagicMock() mock_platform.system.return_value = 'WinNT' mock_qmenu = mock.MagicMock() mock_qmenu_class = mock.MagicMock(return_value=mock_qmenu) with mock.patch('mu.interface.panes.platform', mock_platform), \ mock.patch('mu.interface.panes.QMenu', mock_qmenu_class), \ mock.patch('mu.interface.panes.QCursor'): ppp = mu.interface.panes.PythonProcessPane() ppp.context_menu() assert mock_qmenu.addAction.call_count == 2 copy_action = mock_qmenu.addAction.call_args_list[0][0] assert copy_action[0] == 'Copy' assert copy_action[1] == ppp.copy assert copy_action[2].toString() == 'Ctrl+Shift+C' paste_action = mock_qmenu.addAction.call_args_list[1][0] assert paste_action[0] == 'Paste' assert paste_action[1] == ppp.paste assert paste_action[2].toString() == 'Ctrl+Shift+V' assert mock_qmenu.exec_.call_count == 1 def test_PythonProcessPane_context_menu_darwin(): """ Ensure the context menu for the REPL is configured correctly for non-OSX platforms. """ mock_platform = mock.MagicMock() mock_platform.system.return_value = 'Darwin' mock_qmenu = mock.MagicMock() mock_qmenu_class = mock.MagicMock(return_value=mock_qmenu) with mock.patch('mu.interface.panes.platform', mock_platform), \ mock.patch('mu.interface.panes.QMenu', mock_qmenu_class), \ mock.patch('mu.interface.panes.QCursor'): ppp = mu.interface.panes.PythonProcessPane() ppp.context_menu() assert mock_qmenu.addAction.call_count == 2 copy_action = mock_qmenu.addAction.call_args_list[0][0] assert copy_action[0] == 'Copy' assert copy_action[1] == ppp.copy assert copy_action[2].toString() == 'Ctrl+C' paste_action = mock_qmenu.addAction.call_args_list[1][0] assert paste_action[0] == 'Paste' assert paste_action[1] == ppp.paste assert paste_action[2].toString() == 'Ctrl+V' assert mock_qmenu.exec_.call_count == 1 def test_PythonProcessPane_paste(): """ Ensure pasted text is handed off to the parse_paste method. """ ppp = mu.interface.panes.PythonProcessPane() ppp.parse_paste = mock.MagicMock() mock_clipboard = mock.MagicMock() mock_clipboard.text.return_value = 'Hello' with mock.patch('mu.interface.panes.QApplication.clipboard', return_value=mock_clipboard): ppp.paste() ppp.parse_paste.assert_called_once_with('Hello') def test_PythonProcessPane_paste_normalize_windows_newlines(): """ Ensure that pasted text containing Windows style line-ends is normalised to '\n'. """ ppp = mu.interface.panes.PythonProcessPane() ppp.parse_paste = mock.MagicMock() mock_clipboard = mock.MagicMock() mock_clipboard.text.return_value = 'h\r\ni' with mock.patch('mu.interface.panes.QApplication.clipboard', return_value=mock_clipboard): ppp.paste() ppp.parse_paste.assert_called_once_with('h\ni') def test_PythonProcessPane_parse_paste(): """ Given some text ensure that the first character is correctly handled and the remaining text to be processed is scheduled to be parsed in the future. Essentially parse_paste pretends to be someone typing in the characters of the pasted text *really fast*, rather than as a single shot dump of data. This is so the event loop can cycle to handle any output from the child process. """ ppp = mu.interface.panes.PythonProcessPane() ppp.parse_input = mock.MagicMock() mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.QTimer', mock_timer): ppp.parse_paste('hello') ppp.parse_input.assert_called_once_with(None, 'h', None) assert mock_timer.singleShot.call_count == 1 def test_PythonProcessPane_parse_paste_non_ascii(): """ Given some non-ascii yet printable text, ensure that the first character is correctly handled and the remaining text to be processed is scheduled to be parsed in the future. """ ppp = mu.interface.panes.PythonProcessPane() ppp.parse_input = mock.MagicMock() mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.QTimer', mock_timer): ppp.parse_paste('ÅÄÖ') ppp.parse_input.assert_called_once_with(None, 'Å', None) assert mock_timer.singleShot.call_count == 1 def test_PythonProcessPane_parse_paste_newline(): """ As above, but ensure the correct handling of a newline character. """ ppp = mu.interface.panes.PythonProcessPane() ppp.parse_input = mock.MagicMock() mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.QTimer', mock_timer): ppp.parse_paste('\nhello') ppp.parse_input.assert_called_once_with(Qt.Key_Enter, '\n', None) assert mock_timer.singleShot.call_count == 1 def test_PythonProcessPane_parse_paste_final_character(): """ As above, but ensure that if there a no more remaining characters to parse in the pasted text, then don't schedule any more recursive calls. """ ppp = mu.interface.panes.PythonProcessPane() ppp.parse_input = mock.MagicMock() mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.QTimer', mock_timer): ppp.parse_paste('\n') ppp.parse_input.assert_called_once_with(Qt.Key_Enter, '\n', None) assert mock_timer.singleShot.call_count == 0 def test_PythonProcessPane_keyPressEvent_a(): """ A character is typed and passed into parse_input in the expected manner. """ ppp = mu.interface.panes.PythonProcessPane() ppp.parse_input = mock.MagicMock() data = mock.MagicMock data.key = mock.MagicMock(return_value=Qt.Key_A) data.text = mock.MagicMock(return_value='a') data.modifiers = mock.MagicMock(return_value=None) ppp.keyPressEvent(data) ppp.parse_input.assert_called_once_with(Qt.Key_A, 'a', None) def test_PythonProcessPane_on_process_halt(): """ Ensure the output from the halted process is dumped to the UI. """ ppp = mu.interface.panes.PythonProcessPane() ppp.process = mock.MagicMock() ppp.process.readAll().data.return_value = b'halted' ppp.append = mock.MagicMock() ppp.on_append_text = mock.MagicMock() ppp.set_start_of_current_line = mock.MagicMock() ppp.on_process_halt() ppp.process.readAll().data.assert_called_once_with() ppp.append.assert_called_once_with(b'halted') ppp.on_append_text.emit.assert_called_once_with(b'halted') ppp.set_start_of_current_line.assert_called_once_with() def test_PythonProcessPane_on_process_halt_badly_formed_bytes(): """ If the bytes read from the child process's stdout starts with a badly formed unicode character (e.g. a fragment of a multi-byte character such as "𠜎"), then ensure the problem bytes at the start of the data are discarded until a valid result can be turned into a string. """ data = "𠜎Hello, World!".encode('utf-8') # Contains a multi-byte char. data = data[1:] # Split the muti-byte character (cause UnicodeDecodeError) ppp = mu.interface.panes.PythonProcessPane() ppp.process = mock.MagicMock() ppp.process.readAll().data.return_value = data ppp.on_append_text = mock.MagicMock() ppp.set_start_of_current_line = mock.MagicMock() ppp.on_process_halt() ppp.process.readAll().data.assert_called_once_with() ppp.on_append_text.emit.assert_called_once_with(b'Hello, World!') ppp.set_start_of_current_line.assert_called_once_with() def test_PythonProcessPane_parse_input_a(): """ Ensure a regular printable character is inserted into the text area. """ ppp = mu.interface.panes.PythonProcessPane() ppp.insert = mock.MagicMock() key = Qt.Key_A text = 'a' modifiers = None ppp.parse_input(key, text, modifiers) ppp.insert.assert_called_once_with(b'a') def test_PythonProcessPane_parse_input_non_ascii(): """ Ensure a non-ascii printable character is inserted into the text area. """ ppp = mu.interface.panes.PythonProcessPane() ppp.insert = mock.MagicMock() key = Qt.Key_A text = 'Å' modifiers = None ppp.parse_input(key, text, modifiers) ppp.insert.assert_called_once_with('Å'.encode('utf-8')) def test_PythonProcessPane_parse_input_ctrl_c(): """ Control-C (SIGINT / KeyboardInterrupt) character is typed. """ ppp = mu.interface.panes.PythonProcessPane() ppp.process = mock.MagicMock() ppp.process.processId.return_value = 123 ppp.running = True key = Qt.Key_C text = '' modifiers = Qt.ControlModifier mock_kill = mock.MagicMock() mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.os.kill', mock_kill), \ mock.patch('mu.interface.panes.QTimer', mock_timer), \ mock.patch('mu.interface.panes.platform.system', return_value='win32'): ppp.parse_input(key, text, modifiers) mock_kill.assert_called_once_with(123, signal.SIGINT) ppp.process.readAll.assert_called_once_with() mock_timer.singleShot.assert_called_once_with(1, ppp.on_process_halt) def test_PythonProcessPane_parse_input_ctrl_d(): """ Control-D (Kill process) character is typed. """ ppp = mu.interface.panes.PythonProcessPane() ppp.process = mock.MagicMock() ppp.running = True key = Qt.Key_D text = '' modifiers = Qt.ControlModifier mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.platform.system', return_value='win32'), \ mock.patch('mu.interface.panes.QTimer', mock_timer): ppp.parse_input(key, text, modifiers) ppp.process.kill.assert_called_once_with() ppp.process.readAll.assert_called_once_with() mock_timer.singleShot.assert_called_once_with(1, ppp.on_process_halt) def test_PythonProcessPane_parse_input_ctrl_c_after_process_finished(): """ Control-C (SIGINT / KeyboardInterrupt) character is typed. """ ppp = mu.interface.panes.PythonProcessPane() ppp.process = mock.MagicMock() ppp.process.processId.return_value = 123 ppp.running = False key = Qt.Key_C text = '' modifiers = Qt.ControlModifier mock_kill = mock.MagicMock() with mock.patch('mu.interface.panes.os.kill', mock_kill), \ mock.patch('mu.interface.panes.platform.system', return_value='win32'): ppp.parse_input(key, text, modifiers) assert mock_kill.call_count == 0 def test_PythonProcessPane_parse_input_ctrl_d_after_process_finished(): """ Control-D (Kill process) character is typed. """ ppp = mu.interface.panes.PythonProcessPane() ppp.process = mock.MagicMock() ppp.running = False key = Qt.Key_D text = '' modifiers = Qt.ControlModifier with mock.patch('mu.interface.panes.platform.system', return_value='win32'): ppp.parse_input(key, text, modifiers) assert ppp.process.kill.call_count == 0 def test_PythonProcessPane_parse_input_up_arrow(): """ Up Arrow causes the input line to be replaced with movement back in command history. """ ppp = mu.interface.panes.PythonProcessPane() ppp.history_back = mock.MagicMock() key = Qt.Key_Up text = '' modifiers = None ppp.parse_input(key, text, modifiers) assert ppp.history_back.call_count == 1 def test_PythonProcessPane_parse_input_down_arrow(): """ Down Arrow causes the input line to be replaced with movement forward through command line. """ ppp = mu.interface.panes.PythonProcessPane() ppp.history_forward = mock.MagicMock() key = Qt.Key_Down text = '' modifiers = None ppp.parse_input(key, text, modifiers) assert ppp.history_forward.call_count == 1 def test_PythonProcessPane_parse_input_right_arrow(): """ Right Arrow causes the cursor to move to the right one place. """ ppp = mu.interface.panes.PythonProcessPane() mock_cursor = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.setTextCursor = mock.MagicMock() key = Qt.Key_Right text = '' modifiers = None ppp.parse_input(key, text, modifiers) mock_cursor.movePosition.assert_called_once_with(QTextCursor.Right) ppp.setTextCursor.assert_called_once_with(mock_cursor) def test_PythonProcessPane_parse_input_left_arrow(): """ Left Arrow causes the cursor to move to the left one place if not at the start of the input line. """ ppp = mu.interface.panes.PythonProcessPane() mock_cursor = mock.MagicMock() mock_cursor.position.return_value = 1 ppp.start_of_current_line = 0 ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.setTextCursor = mock.MagicMock() key = Qt.Key_Left text = '' modifiers = None ppp.parse_input(key, text, modifiers) mock_cursor.movePosition.assert_called_once_with(QTextCursor.Left) ppp.setTextCursor.assert_called_once_with(mock_cursor) def test_PythonProcessPane_parse_input_left_arrow_at_start_of_line(): """ Left Arrow doesn't do anything if the current cursor position is at the start of the input line. """ ppp = mu.interface.panes.PythonProcessPane() mock_cursor = mock.MagicMock() mock_cursor.position.return_value = 1 ppp.start_of_current_line = 1 ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.setTextCursor = mock.MagicMock() key = Qt.Key_Left text = '' modifiers = None ppp.parse_input(key, text, modifiers) assert mock_cursor.movePosition.call_count == 0 assert ppp.setTextCursor.call_count == 0 def test_PythonProcessPane_parse_input_home(): """ Home moves cursor to the start of the input line. """ ppp = mu.interface.panes.PythonProcessPane() ppp.toPlainText = mock.MagicMock(return_value='hello') mock_cursor = mock.MagicMock() ppp.start_of_current_line = 0 ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.setTextCursor = mock.MagicMock() key = Qt.Key_Home text = '' modifiers = None ppp.parse_input(key, text, modifiers) # Move to the end of the line, then move left len of 'hello'. assert mock_cursor.movePosition.call_count == 6 ppp.setTextCursor.assert_called_once_with(mock_cursor) def test_PythonProcessPane_parse_input_end(): """ End moves cursor to the end of the input line. """ ppp = mu.interface.panes.PythonProcessPane() mock_cursor = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.setTextCursor = mock.MagicMock() key = Qt.Key_End text = '' modifiers = None ppp.parse_input(key, text, modifiers) mock_cursor.movePosition.assert_called_once_with(QTextCursor.End) ppp.setTextCursor.assert_called_once_with(mock_cursor) def test_PythonProcessPane_parse_input_paste(): """ Control-Shift-V (paste) character causes a paste to happen. """ ppp = mu.interface.panes.PythonProcessPane() key = Qt.Key_V text = '' modifiers = Qt.ControlModifier | Qt.ShiftModifier ppp.paste = mock.MagicMock() ppp.parse_input(key, text, modifiers) ppp.paste.assert_called_once_with() def test_PythonProcessPane_parse_input_copy(): """ Control-Shift-C (copy) character causes copy to happen. """ ppp = mu.interface.panes.PythonProcessPane() key = Qt.Key_C text = '' modifiers = Qt.ControlModifier | Qt.ShiftModifier ppp.copy = mock.MagicMock() ppp.parse_input(key, text, modifiers) ppp.copy.assert_called_once_with() def test_PythonProcessPane_parse_input_backspace(): """ Backspace call causes a backspace from the character at the cursor position. """ ppp = mu.interface.panes.PythonProcessPane() ppp.backspace = mock.MagicMock() key = Qt.Key_Backspace text = '\b' modifiers = None ppp.parse_input(key, text, modifiers) ppp.backspace.assert_called_once_with() def test_PythonProcessPane_parse_input_delete(): """ Delete deletes the character to the right of the cursor position. """ ppp = mu.interface.panes.PythonProcessPane() ppp.delete = mock.MagicMock() key = Qt.Key_Delete text = '\b' modifiers = None ppp.parse_input(key, text, modifiers) ppp.delete.assert_called_once_with() def test_PythonProcessPane_parse_input_newline(): """ Newline causes the input line to be written to the child process's stdin. """ ppp = mu.interface.panes.PythonProcessPane() ppp.toPlainText = mock.MagicMock(return_value='abc\n') ppp.start_of_current_line = 0 ppp.textCursor = mock.MagicMock() ppp.textCursor().position.return_value = 666 ppp.setTextCursor = mock.MagicMock() ppp.insert = mock.MagicMock() ppp.write_to_stdin = mock.MagicMock() key = Qt.Key_Enter text = '\r' modifiers = None ppp.parse_input(key, text, modifiers) ppp.write_to_stdin.assert_called_once_with(b'abc\n') assert b'abc' in ppp.input_history assert ppp.history_position == 0 # On newline, the start of the current line should be set correctly. assert ppp.start_of_current_line == 4 # len('abc\n') def test_PythonProcessPane_parse_input_newline_ignore_empty_input_in_history(): """ Newline causes the input line to be written to the child process's stdin, but if the resulting line is either empty or only contains whitespace, do not add it to the input_history. """ ppp = mu.interface.panes.PythonProcessPane() ppp.toPlainText = mock.MagicMock(return_value=' \n') ppp.start_of_current_line = 0 ppp.write_to_stdin = mock.MagicMock() key = Qt.Key_Enter text = '\r' modifiers = None ppp.parse_input(key, text, modifiers) ppp.write_to_stdin.assert_called_once_with(b' \n') assert len(ppp.input_history) == 0 assert ppp.history_position == 0 def test_PythonProcessPane_parse_input_newline_with_cursor_midline(): """ Ensure that when the cursor is placed in the middle of a line and enter is pressed the whole line is sent to std_in. """ ppp = mu.interface.panes.PythonProcessPane() ppp.write_to_stdin = mock.MagicMock() ppp.parse_input(None, "abc", None) ppp.parse_input(Qt.Key_Left, None, None) ppp.parse_input(Qt.Key_Enter, '\r', None) ppp.write_to_stdin.assert_called_with(b'abc\n') def test_PythonProcessPane_set_start_of_current_line(): """ Ensure the start of the current line is set to the current length of the text in the editor pane. """ ppp = mu.interface.panes.PythonProcessPane() ppp.toPlainText = mock.MagicMock(return_value="Hello𠜎") ppp.set_start_of_current_line() assert ppp.start_of_current_line == len("Hello𠜎") def test_PythonProcessPane_history_back(): """ Ensure the current input line is replaced by the next item back in time from the current history position. """ ppp = mu.interface.panes.PythonProcessPane() # 'a' was typed first, 'c' is the most recent entry. ppp.input_history = ['a', 'b', 'c', ] ppp.history_position = 0 ppp.replace_input_line = mock.MagicMock() ppp.history_back() ppp.replace_input_line.assert_called_once_with('c') assert ppp.history_position == -1 def test_PythonProcessPane_history_back_at_first_item(): """ Ensure the current input line is replaced by the next item back in time from the current history position. """ ppp = mu.interface.panes.PythonProcessPane() # 'a' was typed first, 'c' is the most recent entry. ppp.input_history = ['a', 'b', 'c', ] ppp.history_position = -3 ppp.replace_input_line = mock.MagicMock() ppp.history_back() ppp.replace_input_line.assert_called_once_with('a') assert ppp.history_position == -3 def test_PythonProcessPane_history_forward(): """ Ensure the current input line is replaced by the next item forward in time from the current history position. """ ppp = mu.interface.panes.PythonProcessPane() # 'a' was typed first, 'c' is the most recent entry. ppp.input_history = ['a', 'b', 'c', ] ppp.history_position = -3 ppp.replace_input_line = mock.MagicMock() ppp.history_forward() ppp.replace_input_line.assert_called_once_with('b') assert ppp.history_position == -2 def test_PythonProcessPane_history_forward_at_last_item(): """ Ensure the current input line is cleared if the history position was at the most recent item. """ ppp = mu.interface.panes.PythonProcessPane() # 'a' was typed first, 'c' is the most recent entry. ppp.input_history = ['a', 'b', 'c', ] ppp.history_position = -1 ppp.replace_input_line = mock.MagicMock() ppp.clear_input_line = mock.MagicMock() ppp.history_forward() ppp.clear_input_line.assert_called_once_with() assert ppp.replace_input_line.call_count == 0 assert ppp.history_position == 0 def test_PythonProcessPane_try_read_from_stdout_not_started(): """ If the process pane is NOT already reading from STDOUT then ensure it starts to. """ ppp = mu.interface.panes.PythonProcessPane() ppp.read_from_stdout = mock.MagicMock() ppp.try_read_from_stdout() assert ppp.reading_stdout is True ppp.read_from_stdout.assert_called_once_with() def test_PythonProcessPane_try_read_from_stdout_has_started(): """ If the process pane is already reading from STDOUT then ensure it doesn't keep trying. """ ppp = mu.interface.panes.PythonProcessPane() ppp.read_from_stdout = mock.MagicMock() ppp.reading_stdout = True ppp.try_read_from_stdout() assert ppp.reading_stdout is True assert ppp.read_from_stdout.call_count == 0 def test_PythonProcessPane_read_from_stdout(): """ Ensure incoming bytes from sub-process's stout are processed correctly. """ ppp = mu.interface.panes.PythonProcessPane() ppp.append = mock.MagicMock() ppp.process = mock.MagicMock() ppp.process.read.return_value = b'hello world' ppp.on_append_text = mock.MagicMock() ppp.set_start_of_current_line = mock.MagicMock() mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.QTimer', mock_timer): ppp.read_from_stdout() assert ppp.append.call_count == 1 ppp.process.read.assert_called_once_with(256) ppp.on_append_text.emit.assert_called_once_with(b'hello world') ppp.set_start_of_current_line.assert_called_once_with() mock_timer.singleShot.assert_called_once_with(2, ppp.read_from_stdout) def test_PythonProcessPane_read_from_stdout_with_stdout_buffer(): """ Ensure incoming bytes from sub-process's stdout are processed correctly if there was a split between reads in a multi-byte character (such as "𠜎"). The buffer is pre-pended to the current read, thus resulting in bytes that can be successfully represented in a UTF based string. """ msg = "Hello 𠜎 world".encode('utf-8') ppp = mu.interface.panes.PythonProcessPane() ppp.stdout_buffer = msg[:7] # Start of msg but split in multi-byte char. ppp.process = mock.MagicMock() ppp.process.read.return_value = msg[7:] # Remainder of msg. ppp.on_append_text = mock.MagicMock() ppp.set_start_of_current_line = mock.MagicMock() mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.QTimer', mock_timer): ppp.read_from_stdout() ppp.process.read.assert_called_once_with(256) ppp.on_append_text.emit.assert_called_once_with(msg) ppp.set_start_of_current_line.assert_called_once_with() mock_timer.singleShot.assert_called_once_with(2, ppp.read_from_stdout) assert ppp.stdout_buffer == b'' def test_PythonProcessPane_read_from_stdout_with_unicode_error(): """ Ensure incoming bytes from sub-process's stdout are processed correctly if there was a split between reads in a multi-byte character (such as "𠜎"). If the read bytes end with a split of a multi-byte character, ensure they are put into the self.stdout_buffer so they can be pre-pended to the next bytes read from the child process. """ msg = "Hello 𠜎 world".encode('utf-8') ppp = mu.interface.panes.PythonProcessPane() ppp.process = mock.MagicMock() ppp.process.read.return_value = msg[:7] # Split the multi-byte character. ppp.on_append_text = mock.MagicMock() ppp.set_start_of_current_line = mock.MagicMock() mock_timer = mock.MagicMock() with mock.patch('mu.interface.panes.QTimer', mock_timer): ppp.read_from_stdout() ppp.process.read.assert_called_once_with(256) assert ppp.on_append_text.emit.call_count == 0 assert ppp.set_start_of_current_line.call_count == 0 mock_timer.singleShot.assert_called_once_with(2, ppp.read_from_stdout) assert ppp.stdout_buffer == msg[:7] def test_PythonProcessPane_read_from_stdout_no_data(): """ If no data is returned, ensure the reading_stdout flag is reset to False. """ ppp = mu.interface.panes.PythonProcessPane() ppp.reading_stdout = True ppp.process = mock.MagicMock() ppp.process.read.return_value = b'' ppp.read_from_stdout() assert ppp.reading_stdout is False def test_PythonProcessPane_write_to_stdin(): """ Ensure input from the user is written to the child process. """ ppp = mu.interface.panes.PythonProcessPane() ppp.process = mock.MagicMock() ppp.write_to_stdin(b'hello') ppp.process.write.assert_called_once_with(b'hello') def test_PythonProcessPane_append(): """ Ensure the referenced byte_stream is added to the textual content of the QTextEdit. """ ppp = mu.interface.panes.PythonProcessPane() mock_cursor = mock.MagicMock() ppp.setTextCursor = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.append(b'hello') mock_cursor.insertText.assert_called_once_with('hello') assert mock_cursor.movePosition.call_count == 2 def test_PythonProcessPane_insert_within_input_line(): """ Ensure text is inserted at the end of the document if the current cursor position is not within the bounds of the input line. """ ppp = mu.interface.panes.PythonProcessPane() mock_cursor = mock.MagicMock() mock_cursor.position.return_value = 1 ppp.start_of_current_line = 100 ppp.setTextCursor = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.insert(b'hello') mock_cursor.movePosition.assert_called_once_with(QTextCursor.End) mock_cursor.insertText.assert_called_once_with('hello') def test_PythonProcessPane_insert(): """ Ensure text is inserted at the current cursor position. """ ppp = mu.interface.panes.PythonProcessPane() mock_cursor = mock.MagicMock() mock_cursor.position.return_value = 100 ppp.start_of_current_line = 1 ppp.setTextCursor = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.insert(b'hello') assert mock_cursor.movePosition.call_count == 0 mock_cursor.insertText.assert_called_once_with('hello') def test_PythonProcessPane_backspace(): """ Make sure that removing a character to the left of the current cursor position works as expected. """ ppp = mu.interface.panes.PythonProcessPane() ppp.start_of_current_line = 123 mock_cursor = mock.MagicMock() mock_cursor.position.return_value = 124 mock_cursor.deletePreviousChar = mock.MagicMock() ppp.setTextCursor = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.backspace() mock_cursor.deletePreviousChar.assert_called_once_with() ppp.setTextCursor.assert_called_once_with(mock_cursor) def test_PythonProcessPane_backspace_at_start_of_input_line(): """ Make sure that removing a character will not work if the cursor is at the left-hand boundary of the input line. """ ppp = mu.interface.panes.PythonProcessPane() ppp.start_of_current_line = 123 mock_cursor = mock.MagicMock() mock_cursor.position.return_value = 123 mock_cursor.deletePreviousChar = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.backspace() assert mock_cursor.deletePreviousChar.call_count == 0 def test_PythonProcessPane_delete(): """ Make sure that removing a character to the right of the current cursor position works as expected. """ ppp = mu.interface.panes.PythonProcessPane() ppp.start_of_current_line = 123 mock_cursor = mock.MagicMock() mock_cursor.position.return_value = 124 mock_cursor.deletePreviousChar = mock.MagicMock() ppp.setTextCursor = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.delete() mock_cursor.deleteChar.assert_called_once_with() ppp.setTextCursor.assert_called_once_with(mock_cursor) def test_PythonProcessPane_delete_at_start_of_input_line(): """ Make sure that removing a character will not work if the cursor is at the left-hand boundary of the input line. """ ppp = mu.interface.panes.PythonProcessPane() ppp.start_of_current_line = 123 mock_cursor = mock.MagicMock() mock_cursor.position.return_value = 122 mock_cursor.deletePreviousChar = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.delete() assert mock_cursor.deleteChar.call_count == 0 def test_PythonProcessPane_clear_input_line(): """ Ensure the input line is cleared back to the start of the input line. """ ppp = mu.interface.panes.PythonProcessPane() ppp.start_of_current_line = 0 ppp.toPlainText = mock.MagicMock(return_value='hello') mock_cursor = mock.MagicMock() ppp.setTextCursor = mock.MagicMock() ppp.textCursor = mock.MagicMock(return_value=mock_cursor) ppp.clear_input_line() assert mock_cursor.deletePreviousChar.call_count == 5 mock_cursor.movePosition.assert_called_once_with(QTextCursor.End) ppp.setTextCursor.assert_called_once_with(mock_cursor) def test_PythonProcessPane_replace_input_line(): """ Ensure that the input line is cleared and then the replacement text is appended to the text area. """ ppp = mu.interface.panes.PythonProcessPane() ppp.clear_input_line = mock.MagicMock() ppp.append = mock.MagicMock() ppp.replace_input_line('hello') ppp.clear_input_line.assert_called_once_with() ppp.append.assert_called_once_with('hello') def test_PythonProcessPane_set_font_size(): """ Ensure the font size is set to the expected point size. """ ppp = mu.interface.panes.PythonProcessPane() mock_font = mock.MagicMock() ppp.font = mock.MagicMock(return_value=mock_font) ppp.setFont = mock.MagicMock() ppp.set_font_size(123) mock_font.setPointSize.assert_called_once_with(123) ppp.setFont.assert_called_once_with(mock_font) def test_PythonProcessPane_set_zoom(): """ Ensure the expected point size is set from the given "t-shirt" size. """ ppp = mu.interface.panes.PythonProcessPane() ppp.set_font_size = mock.MagicMock() ppp.set_zoom('xl') expected = mu.interface.panes.PANE_ZOOM_SIZES['xl'] ppp.set_font_size.assert_called_once_with(expected) def test_PythonProcessPane_set_theme(): """ Setting the theme shouldn't do anything """ ppp = mu.interface.panes.PythonProcessPane() ppp.set_theme('test') def test_DebugInspectorItem(): item = mu.interface.panes.DebugInspectorItem('test') assert item.text() == 'test' assert not item.isEditable() def test_DebugInspector_set_font_size(): """ Check the correct stylesheet values are being set. """ di = mu.interface.panes.DebugInspector() di.setStyleSheet = mock.MagicMock() di.set_font_size(16) style = di.setStyleSheet.call_args[0][0] assert 'font-size: 16pt;' in style assert 'font-family: Monospace;' in style def test_DebugInspector_set_zoom(): """ Ensure the expected point size is set from the given "t-shirt" size. """ di = mu.interface.panes.DebugInspector() di.set_font_size = mock.MagicMock() di.set_zoom('xl') expected = mu.interface.panes.PANE_ZOOM_SIZES['xl'] di.set_font_size.assert_called_once_with(expected) def test_DebugInspector_set_theme(): """ Setting the theme shouldn't do anything """ di = mu.interface.panes.DebugInspector() di.set_theme('test') def test_PlotterPane_init(): """ Ensure the plotter pane is created in the expected manner. """ pp = mu.interface.panes.PlotterPane() assert pp.input_buffer == [] assert pp.raw_data == [] assert pp.max_x == 100 assert pp.max_y == 1000 assert len(pp.data) == 1 assert isinstance(pp.data[0], deque) assert len(pp.series) == 1 assert isinstance(pp.series[0], QLineSeries) assert isinstance(pp.chart, QChart) assert isinstance(pp.axis_x, QValueAxis) assert isinstance(pp.axis_y, QValueAxis) def test_PlotterPane_process_bytes(): """ If a byte representation of a Python tuple containing numeric values, starting at the beginning of a new line and terminating with a new line is received, then the add_data method is called with the resulting Python tuple. """ pp = mu.interface.panes.PlotterPane() pp.add_data = mock.MagicMock() pp.process_bytes(b'(1, 2.3, 4)\r\n') pp.add_data.assert_called_once_with((1, 2.3, 4)) def test_PlotterPane_process_bytes_guards_against_data_flood(): """ If the process_bytes method gets data of more than 1024 bytes then trigger a data_flood signal and ensure the plotter no longer processes incoming bytes. (The assumption is that Mu will clean up once the data_flood signal is emitted.) """ pp = mu.interface.panes.PlotterPane() pp.data_flood = mock.MagicMock() pp.add_data = mock.MagicMock() data_flood = b'X' * 1025 pp.process_bytes(data_flood) assert pp.flooded is True pp.data_flood.emit.assert_called_once_with() assert pp.add_data.call_count == 0 pp.process_bytes(data_flood) assert pp.add_data.call_count == 0 def test_PlotterPane_process_bytes_tuple_not_numeric(): """ If a byte representation of a tuple is received but it doesn't contain numeric values, then the add_data method MUST NOT be called. """ pp = mu.interface.panes.PlotterPane() pp.add_data = mock.MagicMock() pp.process_bytes(b'("a", "b", "c")\r\n') assert pp.add_data.call_count == 0 def test_PlotterPane_process_bytes_overrun_input_buffer(): """ If the incoming bytes are not complete, ensure the input_buffer caches them until the newline is detected. """ pp = mu.interface.panes.PlotterPane() pp.add_data = mock.MagicMock() pp.process_bytes(b'(1, 2.3, 4)\r\n') pp.add_data.assert_called_once_with((1, 2.3, 4)) pp.add_data.reset_mock() pp.process_bytes(b'(1, 2.') assert pp.add_data.call_count == 0 pp.process_bytes(b'3, 4)\r\n') pp.add_data.assert_called_once_with((1, 2.3, 4)) pp.add_data.reset_mock() pp.process_bytes(b'(1, 2.3, 4)\r\n') pp.add_data.assert_called_once_with((1, 2.3, 4)) def test_PlotterPane_add_data(): """ Given a tuple with a single value, ensure it is logged and correctly added to the chart. """ pp = mu.interface.panes.PlotterPane() mock_line_series = mock.MagicMock() pp.series = [mock_line_series, ] pp.add_data((1, )) assert (1, ) in pp.raw_data mock_line_series.clear.assert_called_once_with() for i in range(99): mock_line_series.append.call_args_list[i][0] == (i, 0) mock_line_series.append.call_args_list[99][0] == (99, 1) def test_PlotterPane_add_data_adjust_values_up(): """ If more values than have been encountered before are added to the incoming data then increase the number of QLineSeries instances. """ pp = mu.interface.panes.PlotterPane() pp.series = [mock.MagicMock(), ] pp.chart = mock.MagicMock() with mock.patch('mu.interface.panes.QLineSeries'): pp.add_data((1, 2, 3, 4)) assert len(pp.series) == 4 assert pp.chart.addSeries.call_count == 3 assert pp.chart.setAxisX.call_count == 3 assert pp.chart.setAxisY.call_count == 3 assert len(pp.data) == 4 def test_PlotterPane_add_data_adjust_values_down(): """ If less values are encountered, before they are added to the incoming data then decrease the number of QLineSeries instances. """ pp = mu.interface.panes.PlotterPane() pp.series = [mock.MagicMock(), mock.MagicMock(), mock.MagicMock()] pp.data.append(mock.MagicMock()) pp.data.append(mock.MagicMock()) pp.chart = mock.MagicMock() with mock.patch('mu.interface.panes.QLineSeries'): pp.add_data((1, )) assert len(pp.series) == 1 assert len(pp.data) == 1 assert pp.chart.removeSeries.call_count == 2 def test_PlotterPane_add_data_re_scale_up(): """ If the y axis contains data greater than the current range, then ensure the range is doubled. """ pp = mu.interface.panes.PlotterPane() pp.axis_y = mock.MagicMock() mock_line_series = mock.MagicMock() pp.series = [mock_line_series, ] pp.add_data((1001, )) assert pp.max_y == 2000 pp.axis_y.setRange.assert_called_once_with(-2000, 2000) def test_PlotterPane_add_data_re_scale_down(): """ If the y axis contains data less than half of the current range, then ensure the range is halved. """ pp = mu.interface.panes.PlotterPane() pp.max_y = 4000 pp.axis_y = mock.MagicMock() mock_line_series = mock.MagicMock() pp.series = [mock_line_series, ] pp.add_data((1999, )) assert pp.max_y == 2000 pp.axis_y.setRange.assert_called_once_with(-2000, 2000) def test_PlotterPane_set_label_format_to_float_when_range_small(): """ If the max_y is 5 or less, make sure the label format is set to being a float with two decimal places. """ pp = mu.interface.panes.PlotterPane() pp.max_y = 10 pp.axis_y = mock.MagicMock() mock_line_series = mock.MagicMock() pp.series = [mock_line_series, ] pp.add_data((1, )) assert pp.max_y == 1 pp.axis_y.setRange.assert_called_once_with(-1, 1) pp.axis_y.setLabelFormat.assert_called_once_with("%2.2f") def test_PlotterPane_set_label_format_to_int_when_range_large(): """ If the max_y is 5 or less, make sure the label format is set to being a float with two decimal places. """ pp = mu.interface.panes.PlotterPane() pp.max_y = 5 pp.axis_y = mock.MagicMock() mock_line_series = mock.MagicMock() pp.series = [mock_line_series, ] pp.add_data((10, )) assert pp.max_y == 10 pp.axis_y.setRange.assert_called_once_with(-10, 10) pp.axis_y.setLabelFormat.assert_called_once_with("%d") def test_PlotterPane_set_theme(): """ Ensure the themes for the chart relate correctly to the theme names used by Mu. """ pp = mu.interface.panes.PlotterPane() pp.chart = mock.MagicMock() pp.set_theme('day') pp.chart.setTheme.assert_called_once_with(QChart.ChartThemeLight) pp.chart.setTheme.reset_mock() pp.set_theme('night') pp.chart.setTheme.assert_called_once_with(QChart.ChartThemeDark) pp.chart.setTheme.reset_mock() pp.set_theme('contrast') pp.chart.setTheme.assert_called_once_with(QChart.ChartThemeHighContrast) mu-editor-1.0.2+dfsg/tests/interface/test_themes.py000066400000000000000000000052661341747546300223650ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the user interface elements of Mu. """ from unittest import mock import mu.interface.themes import mu.interface.editor def test_patch_osx_mojave_font_issue_552(): with mock.patch("platform.platform", return_value="Windows"): assert not mu.interface.themes.should_patch_osx_mojave_font() with mock.patch( "platform.platform", return_value="Darwin-18.0.0-x86_64-i386-64bit" ): assert mu.interface.themes.should_patch_osx_mojave_font() def test_constants(): """ Ensure the expected constant values exist. """ assert mu.interface.themes.NIGHT_STYLE assert mu.interface.themes.DAY_STYLE def test_Font(): """ Ensure the Font class works as expected with default and passed in args. """ f = mu.interface.themes.Font() # Defaults assert f.color == '#181818' assert f.paper == '#FEFEF7' assert f.bold is False assert f.italic is False # Passed in arguments f = mu.interface.themes.Font(color='pink', paper='black', bold=True, italic=True) assert f.color == 'pink' assert f.paper == 'black' assert f.bold assert f.italic def test_theme_apply_to(): """ Ensure that the apply_to class method updates the passed in lexer with the expected font settings. """ lexer = mu.interface.editor.PythonLexer() theme = mu.interface.themes.DayTheme() lexer.setFont = mock.MagicMock(return_value=None) lexer.setColor = mock.MagicMock(return_value=None) lexer.setEolFill = mock.MagicMock(return_value=None) lexer.setPaper = mock.MagicMock(return_value=None) theme.apply_to(lexer) assert lexer.setFont.call_count == 17 assert lexer.setColor.call_count == 16 assert lexer.setEolFill.call_count == 16 assert lexer.setPaper.call_count == 16 def test_Font_loading(): with mock.patch("mu.interface.themes.FONT_NAME", "Source Code Pro"): mu.interface.themes.Font._DATABASE = None try: with mock.patch("mu.interface.themes.QFontDatabase") as db: mu.interface.themes.Font().load() mu.interface.themes.Font(bold=True).load() mu.interface.themes.Font(italic=True).load() mu.interface.themes.Font(bold=True, italic=True).load() finally: mu.interface.themes.Font._DATABASE = None db.assert_called_once_with() db().font.assert_has_calls([ mock.call('Source Code Pro', 'Regular', 14), mock.call('Source Code Pro', 'Semibold', 14), mock.call('Source Code Pro', 'Italic', 14), mock.call('Source Code Pro', 'Semibold Italic', 14), ]) mu-editor-1.0.2+dfsg/tests/modes/000077500000000000000000000000001341747546300166255ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/modes/__init__.py000066400000000000000000000000001341747546300207240ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/modes/mount_exists.txt000066400000000000000000000012151341747546300221260ustar00rootroot00000000000000sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=489849,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,relatime,size=787732k,mode=755) /dev/mapper/heraclitus--vg-root on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) /dev/sdb on /media/ntoll/CIRCUITPY type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0077,codepage=437,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2) mu-editor-1.0.2+dfsg/tests/modes/mount_missing.txt000066400000000000000000000006731341747546300222670ustar00rootroot00000000000000sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=489849,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,relatime,size=787732k,mode=755) /dev/mapper/heraclitus--vg-root on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) mu-editor-1.0.2+dfsg/tests/modes/test_adafruit.py000066400000000000000000000136261341747546300220450ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the Adafruit mode. """ import pytest import ctypes from mu.modes.adafruit import AdafruitMode from mu.modes.api import ADAFRUIT_APIS, SHARED_APIS from unittest import mock def test_adafruit_mode(): """ Sanity check for setting up the mode. """ editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) assert am.name == 'Adafruit CircuitPython' assert am.description is not None assert am.icon == 'adafruit' assert am.editor == editor assert am.view == view actions = am.actions() assert len(actions) == 2 assert actions[0]['name'] == 'serial' assert actions[0]['handler'] == am.toggle_repl assert actions[1]['name'] == 'plotter' assert actions[1]['handler'] == am.toggle_plotter assert 'code' not in am.module_names def test_adafruit_mode_no_charts(): """ If QCharts is not available, ensure the plotter feature is not available. """ editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) with mock.patch('mu.modes.adafruit.CHARTS', False): actions = am.actions() assert len(actions) == 1 assert actions[0]['name'] == 'serial' assert actions[0]['handler'] == am.toggle_repl def test_workspace_dir_posix_exists(): """ Simulate being on os.name == 'posix' and a call to "mount" returns a record indicating a connected device. """ editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) with open('tests/modes/mount_exists.txt', 'rb') as fixture_file: fixture = fixture_file.read() with mock.patch('os.name', 'posix'): with mock.patch('mu.modes.adafruit.check_output', return_value=fixture): assert am.workspace_dir() == '/media/ntoll/CIRCUITPY' def test_workspace_dir_posix_no_mount_command(): """ When the user doesn't have administrative privileges on OSX then the mount command isn't on their path. In which case, check Mu uses the more explicit /sbin/mount instead. """ editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) with open('tests/modes/mount_exists.txt', 'rb') as fixture_file: fixture = fixture_file.read() mock_check = mock.MagicMock(side_effect=[FileNotFoundError, fixture]) with mock.patch('os.name', 'posix'), \ mock.patch('mu.modes.adafruit.check_output', mock_check): assert am.workspace_dir() == '/media/ntoll/CIRCUITPY' assert mock_check.call_count == 2 assert mock_check.call_args_list[0][0][0] == 'mount' assert mock_check.call_args_list[1][0][0] == '/sbin/mount' def test_workspace_dir_posix_missing(): """ Simulate being on os.name == 'posix' and a call to "mount" returns a no records associated with a micro:bit device. """ editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) with open('tests/modes/mount_missing.txt', 'rb') as fixture_file: fixture = fixture_file.read() with mock.patch('os.name', 'posix'): with mock.patch('mu.modes.adafruit.check_output', return_value=fixture),\ mock.patch('mu.modes.adafruit.' 'MicroPythonMode.workspace_dir') as mpm: mpm.return_value = 'foo' assert am.workspace_dir() == 'foo' def test_workspace_dir_nt_exists(): """ Simulate being on os.name == 'nt' and a disk with a volume name 'CIRCUITPY' exists indicating a connected device. """ mock_windll = mock.MagicMock() mock_windll.kernel32 = mock.MagicMock() mock_windll.kernel32.GetVolumeInformationW = mock.MagicMock() mock_windll.kernel32.GetVolumeInformationW.return_value = None editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) with mock.patch('os.name', 'nt'): with mock.patch('os.path.exists', return_value=True): return_value = ctypes.create_unicode_buffer('CIRCUITPY') with mock.patch('ctypes.create_unicode_buffer', return_value=return_value): ctypes.windll = mock_windll assert am.workspace_dir() == 'A:\\' def test_workspace_dir_nt_missing(): """ Simulate being on os.name == 'nt' and a disk with a volume name 'CIRCUITPY' does not exist for a device. """ mock_windll = mock.MagicMock() mock_windll.kernel32 = mock.MagicMock() mock_windll.kernel32.GetVolumeInformationW = mock.MagicMock() mock_windll.kernel32.GetVolumeInformationW.return_value = None editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) with mock.patch('os.name', 'nt'): with mock.patch('os.path.exists', return_value=True): return_value = ctypes.create_unicode_buffer(1024) with mock.patch('ctypes.create_unicode_buffer', return_value=return_value), \ mock.patch('mu.modes.adafruit.' 'MicroPythonMode.workspace_dir') as mpm: mpm.return_value = 'foo' ctypes.windll = mock_windll assert am.workspace_dir() == 'foo' def test_workspace_dir_unknown_os(): """ Raises a NotImplementedError if the host OS is not supported. """ editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) with mock.patch('os.name', 'foo'): with pytest.raises(NotImplementedError) as ex: am.workspace_dir() assert ex.value.args[0] == 'OS "foo" not supported.' def test_api(): """ Ensure the correct API definitions are returned. """ editor = mock.MagicMock() view = mock.MagicMock() am = AdafruitMode(editor, view) assert am.api() == SHARED_APIS + ADAFRUIT_APIS mu-editor-1.0.2+dfsg/tests/modes/test_base.py000066400000000000000000000412001341747546300211450ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the BaseMode class. """ import os import mu import pytest from mu.modes.base import BaseMode, MicroPythonMode from unittest import mock def test_base_mode(): """ Sanity check for the parent class of all modes. """ editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) assert bm.name == 'UNNAMED MODE' assert bm.description == 'DESCRIPTION NOT AVAILABLE.' assert bm.icon == 'help' assert bm.is_debugger is False assert bm.editor == editor assert bm.view == view assert bm.actions() == NotImplemented assert bm.workspace_dir() assert bm.api() == NotImplemented assert bm.builtins is None def test_base_mode_workspace_dir(): """ Return settings file workspace value. """ # read from our demo settings.json with mock.patch('mu.modes.base.get_settings_path', return_value='tests/settings.json'), \ mock.patch('os.path.isdir', return_value=True): editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) assert bm.workspace_dir() == '/home/foo/mycode' def test_base_mode_workspace_not_present(): """ No workspace key in settings file, return default folder. """ default_workspace = os.path.join(mu.logic.HOME_DIRECTORY, mu.logic.WORKSPACE_NAME) with mock.patch('mu.modes.base.get_settings_path', return_value='tests/settingswithoutworkspace.json'): editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) assert bm.workspace_dir() == default_workspace def test_base_mode_workspace_invalid_value(): """ Invalid workspace key in settings file, return default folder. """ default_workspace = os.path.join(mu.logic.HOME_DIRECTORY, mu.logic.WORKSPACE_NAME) # read from our demo settings.json with mock.patch('mu.modes.base.get_settings_path', return_value='tests/settings.json'), \ mock.patch('os.path.isdir', return_value=False), \ mock.patch('mu.modes.base.logger', return_value=None) as logger: editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) assert bm.workspace_dir() == default_workspace assert logger.error.call_count == 1 def test_base_mode_workspace_invalid_json(): """ Invalid workspace key in settings file, return default folder. """ default_workspace = os.path.join(mu.logic.HOME_DIRECTORY, mu.logic.WORKSPACE_NAME) mock_open = mock.mock_open(read_data='{"workspace": invalid}') with mock.patch('mu.modes.base.get_settings_path', return_value='a.json'), \ mock.patch('builtins.open', mock_open), \ mock.patch('mu.modes.base.logger', return_value=None) as logger: editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) assert bm.workspace_dir() == default_workspace assert logger.error.call_count == 1 def test_base_mode_workspace_no_settings_file(): """ Invalid settings file, return default folder. """ default_workspace = os.path.join(mu.logic.HOME_DIRECTORY, mu.logic.WORKSPACE_NAME) mock_open = mock.MagicMock(side_effect=FileNotFoundError()) with mock.patch('mu.modes.base.get_settings_path', return_value='tests/settings.json'), \ mock.patch('builtins.open', mock_open), \ mock.patch('mu.modes.base.logger', return_value=None) as logger: editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) assert bm.workspace_dir() == default_workspace assert logger.error.call_count == 1 def test_base_mode_set_buttons(): """ Ensure only buttons for existing actions have their "Enabled" states updates. """ editor = mock.MagicMock() view = mock.MagicMock() view.button_bar.slots = { 'foo': mock.MagicMock(), 'bar': mock.MagicMock() } bm = BaseMode(editor, view) bm.set_buttons(foo=True, bar=False, baz=True) view.button_bar.slots['foo'].setEnabled.assert_called_once_with(True) view.button_bar.slots['bar'].setEnabled.assert_called_once_with(False) assert 'baz' not in view.button_bar.slots def test_base_mode_add_plotter(): """ Ensure the child classes need to implement this. """ editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) assert bm.add_plotter() == NotImplemented def test_base_mode_remove_plotter(): """ Ensure the plotter is removed and data is saved as a CSV file in the expected directory. """ editor = mock.MagicMock() view = mock.MagicMock() view.plotter_pane.raw_data = [1, 2, 3] bm = BaseMode(editor, view) bm.plotter = mock.MagicMock() mock_mkdir = mock.MagicMock() mock_open = mock.mock_open() mock_csv_writer = mock.MagicMock() mock_csv = mock.MagicMock() mock_csv.writer.return_value = mock_csv_writer with mock.patch('mu.modes.base.os.path.exists', return_value=False), \ mock.patch('mu.modes.base.os.makedirs', mock_mkdir), \ mock.patch('builtins.open', mock_open), \ mock.patch('mu.modes.base.csv', mock_csv): bm.remove_plotter() assert bm.plotter is None view.remove_plotter.assert_called_once_with() dd = os.path.join(bm.workspace_dir(), 'data_capture') mock_mkdir.assert_called_once_with(dd) mock_csv_writer.writerows.\ assert_called_once_with(view.plotter_pane.raw_data) def test_base_on_data_flood(): """ Ensure the plotter is removed and a helpful message is displayed to the user. """ editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) bm.on_data_flood() view.remove_plotter.assert_called_once_with() assert view.show_message.call_count == 1 def test_base_mode_open_file(): """ Ensure the the base class returns None to indicate it can't open the file. """ editor = mock.MagicMock() view = mock.MagicMock() bm = BaseMode(editor, view) assert bm.open_file('unused/path') is None def test_micropython_mode_find_device(): """ Ensure it's possible to detect a device and return the expected port. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) mock_port = mock.MagicMock() for vid, pid in mm.valid_boards: mock_port.vid = vid mock_port.productIdentifier = mock.MagicMock() mock_port.productIdentifier.return_value = pid mock_port.vendorIdentifier = mock.MagicMock() mock_port.vendorIdentifier.return_value = vid mock_port.portName = mock.MagicMock(return_value='COM0') mock_port.serialNumber = mock.MagicMock(return_value='12345') mock_os = mock.MagicMock() mock_os.name = 'nt' with mock.patch('mu.modes.base.QSerialPortInfo.availablePorts', return_value=[mock_port, ]), \ mock.patch('mu.modes.base.os', mock_os): assert mm.find_device() == ('COM0', '12345') def test_micropython_mode_find_device_no_ports(): """ There are no connected devices so return None. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) with mock.patch('mu.modes.base.QSerialPortInfo.availablePorts', return_value=[]): assert mm.find_device() == (None, None) def test_micropython_mode_find_device_but_no_device(): """ None of the connected devices is a valid board so return None. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) mock_port = mock.MagicMock() mock_port.productIdentifier = mock.MagicMock(return_value=666) mock_port.vendorIdentifier = mock.MagicMock(return_value=999) mock_port.serialNumber = mock.MagicMock(return_value='123456') with mock.patch('mu.modes.base.QSerialPortInfo.availablePorts', return_value=[mock_port, ]): assert mm.find_device() == (None, None) def test_micropython_mode_port_path_posix(): """ Ensure the correct path for a port_name is returned if the platform is posix. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) with mock.patch('os.name', 'posix'): assert mm.port_path('tty1') == "/dev/tty1" def test_micropython_mode_port_path_nt(): """ Ensure the correct path for a port_name is returned if the platform is nt. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) with mock.patch('os.name', 'nt'): assert mm.port_path('COM0') == "COM0" def test_micropython_mode_port_path_unknown(): """ If the platform is unknown, raise NotImplementedError. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) with mock.patch('os.name', 'foo'): with pytest.raises(NotImplementedError): mm.port_path('bar') def test_micropython_mode_add_repl_no_port(): """ If it's not possible to find a connected micro:bit then ensure a helpful message is enacted. """ editor = mock.MagicMock() view = mock.MagicMock() view.show_message = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.find_device = mock.MagicMock(return_value=(None, None)) mm.add_repl() assert view.show_message.call_count == 1 message = 'Could not find an attached device.' assert view.show_message.call_args[0][0] == message def test_micropython_mode_add_repl_ioerror(): """ Sometimes when attempting to connect to the device there is an IOError because it's still booting up or connecting to the host computer. In this case, ensure a useful message is displayed. """ editor = mock.MagicMock() view = mock.MagicMock() view.show_message = mock.MagicMock() ex = IOError('BOOM') view.add_micropython_repl = mock.MagicMock(side_effect=ex) mm = MicroPythonMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '12345')) mm.add_repl() assert view.show_message.call_count == 1 assert view.show_message.call_args[0][0] == str(ex) def test_micropython_mode_add_repl_exception(): """ Ensure that any non-IOError based exceptions are logged. """ editor = mock.MagicMock() view = mock.MagicMock() ex = Exception('BOOM') view.add_micropython_repl = mock.MagicMock(side_effect=ex) mm = MicroPythonMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '12345')) with mock.patch('mu.modes.base.logger', return_value=None) as logger: mm.add_repl() logger.error.assert_called_once_with(ex) def test_micropython_mode_add_repl(): """ Nothing goes wrong so check the _view.add_micropython_repl gets the expected argument. """ editor = mock.MagicMock() view = mock.MagicMock() view.show_message = mock.MagicMock() view.add_micropython_repl = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '12345')) with mock.patch('os.name', 'nt'): mm.add_repl() assert view.show_message.call_count == 0 assert view.add_micropython_repl.call_args[0][0] == 'COM0' def test_micropython_mode_add_repl_no_force_interrupt(): """ Nothing goes wrong so check the _view.add_micropython_repl gets the expected arguments (including the flag so no keyboard interrupt is called). """ editor = mock.MagicMock() view = mock.MagicMock() view.show_message = mock.MagicMock() view.add_micropython_repl = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.force_interrupt = False mm.find_device = mock.MagicMock(return_value=('COM0', '12345')) with mock.patch('os.name', 'nt'): mm.add_repl() assert view.show_message.call_count == 0 assert view.add_micropython_repl.call_args[0][0] == 'COM0' assert view.add_micropython_repl.call_args[0][2] is False def test_micropython_mode_remove_repl(): """ If there is a repl, make sure it's removed as expected and the state is updated. """ editor = mock.MagicMock() view = mock.MagicMock() view.remove_repl = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.repl = True mm.remove_repl() assert view.remove_repl.call_count == 1 assert mm.repl is False def test_micropython_mode_toggle_repl_on(): """ There is no repl, so toggle on. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.add_repl = mock.MagicMock() mm.repl = None mm.toggle_repl(None) assert mm.add_repl.call_count == 1 def test_micropython_mode_toggle_repl_off(): """ There is a repl, so toggle off. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.remove_repl = mock.MagicMock() mm.repl = True mm.toggle_repl(None) assert mm.remove_repl.call_count == 1 def test_micropython_mode_toggle_plotter_on(): """ There is no plotter, so toggle on. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.add_plotter = mock.MagicMock() mm.plotter = None mm.toggle_plotter(None) assert mm.add_plotter.call_count == 1 def test_micropython_mode_toggle_plotter_off(): """ There is a plotter, so toggle off. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.remove_plotter = mock.MagicMock() mm.plotter = True mm.toggle_plotter(None) assert mm.remove_plotter.call_count == 1 def test_micropython_mode_add_plotter_no_port(): """ If it's not possible to find a connected micro:bit then ensure a helpful message is enacted. """ editor = mock.MagicMock() view = mock.MagicMock() view.show_message = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.find_device = mock.MagicMock(return_value=(None, None)) mm.add_plotter() assert view.show_message.call_count == 1 message = 'Could not find an attached device.' assert view.show_message.call_args[0][0] == message def test_micropython_mode_add_plotter_ioerror(): """ Sometimes when attempting to connect to the device there is an IOError because it's still booting up or connecting to the host computer. In this case, ensure a useful message is displayed. """ editor = mock.MagicMock() view = mock.MagicMock() view.show_message = mock.MagicMock() ex = IOError('BOOM') view.add_micropython_plotter = mock.MagicMock(side_effect=ex) mm = MicroPythonMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '123456')) mm.add_plotter() assert view.show_message.call_count == 1 assert view.show_message.call_args[0][0] == str(ex) def test_micropython_mode_add_plotter_exception(): """ Ensure that any non-IOError based exceptions are logged. """ editor = mock.MagicMock() view = mock.MagicMock() ex = Exception('BOOM') view.add_micropython_plotter = mock.MagicMock(side_effect=ex) mm = MicroPythonMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '12345')) with mock.patch('mu.modes.base.logger', return_value=None) as logger: mm.add_plotter() logger.error.assert_called_once_with(ex) def test_micropython_mode_add_plotter(): """ Nothing goes wrong so check the _view.add_micropython_plotter gets the expected argument. """ editor = mock.MagicMock() view = mock.MagicMock() view.show_message = mock.MagicMock() view.add_micropython_plotter = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '12345')) with mock.patch('os.name', 'nt'): mm.add_plotter() assert view.show_message.call_count == 0 assert view.add_micropython_plotter.call_args[0][0] == 'COM0' def test_micropython_on_data_flood(): """ Ensure that the REPL is removed before calling the base on_data_flood method. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicroPythonMode(editor, view) mm.remove_repl = mock.MagicMock() with mock.patch('builtins.super') as mock_super: mm.on_data_flood() mm.remove_repl.assert_called_once_with() mock_super().on_data_flood.assert_called_once_with() mu-editor-1.0.2+dfsg/tests/modes/test_debug.py000066400000000000000000000536451341747546300213410ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the debug mode. """ from mu.logic import DEBUGGER_PORT from mu.modes.debugger import DebugMode from unittest import mock def test_debug_mode(): """ Sanity check for setting up of the mode. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) assert dm.name == 'Graphical Debugger' assert dm.description is not None assert dm.icon == 'python' assert dm.runner is None assert dm.is_debugger is True assert dm.editor == editor assert dm.view == view assert dm.api() == [] actions = dm.actions() assert len(actions) == 5 assert actions[0]['name'] == 'stop' assert actions[0]['handler'] == dm.button_stop assert actions[1]['name'] == 'run' assert actions[1]['handler'] == dm.button_continue assert actions[2]['name'] == 'step-over' assert actions[2]['handler'] == dm.button_step_over assert actions[3]['name'] == 'step-in' assert actions[3]['handler'] == dm.button_step_in assert actions[4]['name'] == 'step-out' assert actions[4]['handler'] == dm.button_step_out def test_debug_start(): """ Ensure the handling of starting the debugger works as expected. """ editor = mock.MagicMock() editor.envars = [['name', 'value'], ] view = mock.MagicMock() view.current_tab.path = '/foo' view.current_tab.isModified.return_value = True mock_runner = mock.MagicMock() view.add_python3_runner.return_value = mock_runner mock_debugger = mock.MagicMock() mock_debugger_class = mock.MagicMock(return_value=mock_debugger) dm = DebugMode(editor, view) dm.workspace_dir = mock.MagicMock(return_value='/bar') with mock.patch('mu.modes.debugger.Debugger', mock_debugger_class): dm.start() editor.save_tab_to_file.called_once_with(view.current_tab) view.add_python3_runner.assert_called_once_with('/foo', '/bar', debugger=True, envars=[['name', 'value']]) mock_runner.process.waitForStarted.assert_called_once_with() mock_runner.process.finished.connect.assert_called_once_with(dm.finished) view.add_debug_inspector.assert_called_once_with() view.set_read_only.assert_called_once_with(True) mock_debugger_class.assert_called_once_with('localhost', DEBUGGER_PORT, proc=mock_runner.process) assert dm.runner == mock_runner assert dm.debugger == mock_debugger assert mock_debugger.view == dm mock_debugger.start.assert_called_once_with() def test_debug_start_no_tab(): """ If there's no active tab, there can be no runner either. """ editor = mock.MagicMock() view = mock.MagicMock() view.current_tab = None dm = DebugMode(editor, view) dm.start() assert dm.runner is None def test_debug_start_prompt_for_unsaved_file(): """ If the file hasn't been saved yet (it's unnamed), prompt the user to save it. """ editor = mock.MagicMock() view = mock.MagicMock() view.current_tab.path = None dm = DebugMode(editor, view) dm.stop = mock.MagicMock() dm.start() editor.save.assert_called_once_with() assert dm.runner is None dm.stop.assert_called_once_with() def test_debug_stop(): """ Ensure the script runner is cleaned up properly. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) mock_runner = mock.MagicMock() dm.runner = mock_runner dm.stop() assert dm.runner is None assert dm.debugger is None mock_runner.process.kill.assert_called_once_with() mock_runner.process.waitForFinished.assert_called_once_with() view.remove_python_runner.assert_called_once_with() view.remove_debug_inspector.assert_called_once_with() editor.change_mode.assert_called_once_with('python') assert editor.mode == 'python' view.set_read_only.assert_called_once_with(False) def test_debug_finished(): """ Ensure the end-state of the mode is enacted when the running script has finished executing. """ editor = mock.MagicMock() view = mock.MagicMock() view.button_bar.slots = { 'stop': mock.MagicMock(), 'run': mock.MagicMock(), 'step-over': mock.MagicMock(), 'step-in': mock.MagicMock(), 'step-out': mock.MagicMock(), } dm = DebugMode(editor, view) mock_debugger = mock.MagicMock() dm.debugger = mock_debugger mock_debugger.bp_index = [] mock_breakpoint = mock.MagicMock() mock_breakpoint.enabled = True mock_debugger.breakpoints.side_effect = [ { 1: mock_breakpoint, }, {}, ] tab1 = mock.MagicMock() tab1.path = 'foo' tab2 = mock.MagicMock() view.widgets = [tab1, tab2] dm.finished() # Buttons are set to the right state. assert view.button_bar.slots['stop'].setEnabled.call_count == 0 view.button_bar.slots['run'].setEnabled.assert_called_once_with(False) view.button_bar.slots['step-over'].\ setEnabled.assert_called_once_with(False) view.button_bar.slots['step-in'].setEnabled.assert_called_once_with(False) view.button_bar.slots['step-out'].setEnabled.assert_called_once_with(False) # Tabs are set to the right state. tab1.setSelection.assert_called_once_with(0, 0, 0, 0) tab1.reset_debugger_highlight.assert_called_once_with() tab2.setSelection.assert_called_once_with(0, 0, 0, 0) tab2.reset_debugger_highlight.assert_called_once_with() def test_debug_button_stop(): """ Ensure the stop method is called when the stop button is clicked. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.stop = mock.MagicMock() dm.button_stop(None) dm.stop.assert_called_once_with() def test_debug_button_continue(): """ Ensure the do_run method is called when the continue button is clicked. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() dm.button_continue(None) dm.debugger.do_run.assert_called_once_with() assert view.current_tab.reset_debugger_highlight.call_count == 1 def test_debug_button_step_over(): """ Ensure the do_next method is called when the step-over button is clicked. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() dm.button_step_over(None) dm.debugger.do_next.assert_called_once_with() assert view.current_tab.reset_debugger_highlight.call_count == 1 def test_debug_button_step_in(): """ Ensure the do_step method is called when the step-in button is clicked. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() dm.button_step_in(None) dm.debugger.do_step.assert_called_once_with() assert view.current_tab.reset_debugger_highlight.call_count == 1 def test_debug_button_step_out(): """ Ensure the do_return method is called when the step-out button is clicked. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() dm.button_step_out(None) dm.debugger.do_return.assert_called_once_with() assert view.current_tab.reset_debugger_highlight.call_count == 1 def test_debug_toggle_breakpoint_off(): """ If a breakpoint is on, it's toggled off. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) mock_debugger = mock.MagicMock() dm.debugger = mock_debugger mock_breakpoint = mock.MagicMock() mock_debugger.breakpoints.side_effect = [ { 1: mock_breakpoint, }, ] mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.markersAtLine.return_value = True dm.toggle_breakpoint(0, mock_tab) mock_debugger.breakpoints.assert_called_once_with(mock_tab.path) mock_tab.markersAtLine.assert_called_once_with(0) mock_debugger.disable_breakpoint.assert_called_once_with(mock_breakpoint) mock_tab.markerDelete.assert_called_once_with(0, mock_tab.BREAKPOINT_MARKER) def test_debug_toggle_breakpoint_off_no_breakpoint(): """ If a breakpoint appears on a line, but it's not actually been created in the debug runner process (perhaps because the breakpoint was created after the process finished but before the stop button was created) then it's toggled off with no further side-effects. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) mock_debugger = mock.MagicMock() dm.debugger = mock_debugger mock_debugger.breakpoints.side_effect = [ {} ] mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.markersAtLine.return_value = True dm.toggle_breakpoint(0, mock_tab) mock_debugger.breakpoints.assert_called_once_with(mock_tab.path) mock_tab.markersAtLine.assert_called_once_with(0) assert mock_debugger.disable_breakpoint.call_count == 0 mock_tab.markerDelete.assert_called_once_with(0, mock_tab.BREAKPOINT_MARKER) def test_debug_toggle_breakpoint_on_new(): """ If the breakpoint is off but disabled, enable it. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) mock_debugger = mock.MagicMock() dm.debugger = mock_debugger mock_breakpoint = mock.MagicMock() mock_debugger.breakpoints.side_effect = [ { 1: mock_breakpoint, }, ] mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.markersAtLine.return_value = False dm.toggle_breakpoint(0, mock_tab) dm.debugger.enable_breakpoint.assert_called_once_with(mock_breakpoint) def test_debug_toggle_breakpoint_on_existing(): """ If the breakpoint doesn't exist, create it. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) mock_debugger = mock.MagicMock() dm.debugger = mock_debugger mock_debugger.breakpoints.return_value = {} mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.markersAtLine.return_value = False dm.toggle_breakpoint(0, mock_tab) dm.debugger.create_breakpoint.assert_called_once_with(mock_tab.path, 1) def test_debug_on_fail(): """ Ensure an appropriate message is shown to the user and the UI is put into the correct state if the debug client calls this function because it can't connect to the runner. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.finished = mock.MagicMock() dm.debug_on_fail('This is a useful message') assert view.process_runner.append.call_count == 1 # message shown. dm.finished.assert_called_once_with() view.process_runner.finished.assert_called_once_with(1, -1) def test_debug_on_bootstrap(): """ Ensure all the current breakpoints are set and the script is run. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.text.return_value = "print('Hello')" mock_tab.breakpoint_handles = set([0, ]) mock_tab.markerLine.return_value = 0 view.widgets = [mock_tab, ] dm.debug_on_bootstrap() dm.debugger.create_breakpoint.assert_called_once_with(mock_tab.path, 1) dm.debugger.do_run.assert_called_once_with() def test_debug_on_bootstrap_remove_missing_marker_handles(): """ Ensure all marker handles that are not currently associated with a line are removed from the breakpoint_handles set. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.breakpoint_handles = set([0, ]) mock_tab.markerLine.return_value = -1 view.widgets = [mock_tab, ] dm.debug_on_bootstrap() assert dm.debugger.create_breakpoint.call_count == 0 assert 0 not in mock_tab.breakpoint_handles def test_debug_on_bootstrap_ignore_duplicate_handles(): """ Sometimes it's possible for two different handles to be found on a single line due to how Scintilla moves markers around as lines are concatenated. This ensures only one breakpoint is created per marker. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.text.return_value = "print('Hello')" mock_tab.breakpoint_handles = set([0, 1]) mock_tab.markerLine.side_effect = [1, 1] view.widgets = [mock_tab, ] dm.debug_on_bootstrap() assert dm.debugger.create_breakpoint.call_count == 1 def test_debug_on_bootstrap_remove_invalid_breaks(): """ Sometimes it's possible for a marker to end up on a line that is eventually an in-valid breakpoint line. This checks that such markers don't end up with an attempt to set a breakpoint and are ultimately discarded so the visual state of the markers matches the breakpoint state of the debugger. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.breakpoint_handles = set([0, ]) mock_tab.markerLine.return_value = 1 view.widgets = [mock_tab, ] with mock.patch('mu.modes.debugger.is_breakpoint_line', return_value=False): dm.debug_on_bootstrap() assert 0 not in mock_tab.breakpoint_handles mock_tab.markerDelete.assert_called_once_with(1, -1) def test_debug_on_breakpoint_enable(): """ Handle the signal that shows the debug runner has created a breakpoint. """ editor = mock.MagicMock() view = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.markersAtLine.return_value = False mock_tab.path = 'foo' view.current_tab = mock_tab dm = DebugMode(editor, view) mock_breakpoint = mock.MagicMock() mock_breakpoint.filename = 'foo' mock_breakpoint.line = 1 dm.debug_on_breakpoint_enable(mock_breakpoint) mock_tab.markerAdd.assert_called_once_with(mock_breakpoint.line - 1, mock_tab.BREAKPOINT_MARKER) def test_debug_on_breakpoint_enable_different_tab(): """ When the breakpoints are set on bootstrap, some of them may be for tabs that are not the currently visible tab. In any case, when breakpoints are set "on_breakpoint_enable" is called. This check ensures the marker is only created IF the current tab has the same path as the filename associated with the newly created breakpoint. """ editor = mock.MagicMock() view = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.markersAtLine.return_value = False mock_tab.path = 'foo' view.current_tab = mock_tab dm = DebugMode(editor, view) mock_breakpoint = mock.MagicMock() mock_breakpoint.filename = 'bar' mock_breakpoint.line = 1 dm.debug_on_breakpoint_enable(mock_breakpoint) assert mock_tab.markerAdd.call_count == 0 def test_debug_on_breakpoint_enable_marker_already_exists(): """ Handle the signal that shows the debug runner has created a breakpoint during the bootstrapping of the debug runner, so it doesn't add a second marker at the same location as the pre-existing one that caused the breakpoint to be created during bootstrapping. """ editor = mock.MagicMock() view = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.markersAtLine.return_value = True view.current_tab = mock_tab dm = DebugMode(editor, view) mock_breakpoint = mock.MagicMock() mock_breakpoint.line = 1 dm.debug_on_breakpoint_enable(mock_breakpoint) mock_tab.markerAdd.call_count == 0 def test_debug_on_breakpoint_disable(): """ Handle the signal that shows the debug runner has disabled a breakpoint. """ editor = mock.MagicMock() view = mock.MagicMock() mock_tab = mock.MagicMock() view.current_tab = mock_tab dm = DebugMode(editor, view) mock_breakpoint = mock.MagicMock() mock_breakpoint.line = 1 dm.debug_on_breakpoint_disable(mock_breakpoint) mock_tab.markerDelete.assert_called_once_with(mock_breakpoint.line - 1, mock_tab.BREAKPOINT_MARKER) def test_debug_on_line_ignore_file(): """ If the filename is in the ignored bucket, do a return. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() dm.debug_on_line('bdb.py', 100) dm.debugger.do_return.assert_called_once_with() def test_debug_on_line(): """ Ensure the view is updated to the expected tab and the correct line is selected therein. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) mock_tab = mock.MagicMock() editor.get_tab.return_value = mock_tab dm.debug_on_line('foo.py', 100) view.current_tab.setSelection.assert_called_once_with(0, 0, 0, 0) mock_tab.setSelection(99, 0, 100, 0) def test_debug_on_stack_no_stack(): """ In certain rare situations the runner could send an empty stack. ToDo: Look into this. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debug_on_stack([]) assert view.update_debug_inspector.call_count == 0 def test_debug_on_stack(): """ Ensure the expected locals dict is passed to the view so the object inspector is updated properly. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) stack = [ ( 1, { 'locals': { 'a': 'frame1', 'b': 'frame1', } } ), ( 2, { 'locals': { 'b': 'frame2', 'c': 'frame2', } } ) ] dm.debug_on_stack(stack) view.update_debug_inspector.assert_called_once_with({ 'a': 'frame1', 'b': 'frame2', 'c': 'frame2', }) def test_debug_on_postmortem(): """ Ensure that the args and kwargs passed as a context for postmortem and appended to the text area displaying stdout from the Python process. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) args = ['foo', 'bar'] kwargs = { 'baz': 'qux', } dm.debug_on_postmortem(args, kwargs) assert view.process_runner.append.call_count == 3 def test_debug_on_info(): """ Information messages result in a status message being shown by the editor. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debug_on_info('message') expected = 'Debugger info: message' editor.show_status_message.assert_called_once_with(expected) def test_debug_on_warning(): """ Warning messages result in a status message being shown by the editor. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debug_on_warning('message') expected = 'Debugger warning: message' editor.show_status_message.assert_called_once_with(expected) def test_debug_on_error(): """ Error messages result in a status message being shown by the editor. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debug_on_error('message') expected = 'Debugger error: message' editor.show_status_message.assert_called_once_with(expected) def test_debug_on_call(): """ Calling a function causes the debugger to step into the function. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() dm.debug_on_call(None) dm.debugger.do_step.assert_called_once_with() def test_debug_on_return(): """ Returning from a function causes the debugger to step out of the function. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() dm.debug_on_return(None) dm.debugger.do_step.assert_called_once_with() def test_debug_on_finished(): """ When the debugger is finished, the view is reset. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.finished = mock.MagicMock() dm.debug_on_finished() dm.finished.assert_called_once_with() def test_debug_on_breakpoint_ignore(): """ Should do nothing. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) assert dm.debug_on_breakpoint_ignore(None, None) is None def test_debug_on_breakpoint_clear(): """ Should do nothing. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) assert dm.debug_on_breakpoint_clear(None) is None def test_debug_on_restart(): """ Should do nothing. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) assert dm.debug_on_restart() is None def test_debug_on_exception(): """ Since an exception has been signalled, allow the script to run to the end of life so the error is correctly reported via stdout. """ editor = mock.MagicMock() view = mock.MagicMock() dm = DebugMode(editor, view) dm.debugger = mock.MagicMock() dm.debug_on_exception("Exception", "Exception information") dm.debugger.do_run.assert_called_once_with() assert view.current_tab.reset_debugger_highlight.call_count == 1 mu-editor-1.0.2+dfsg/tests/modes/test_microbit.py000066400000000000000000001464561341747546300220660ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the micro:bit mode. """ import os import os.path import pytest from mu.logic import HOME_DIRECTORY from mu.modes.microbit import MicrobitMode, FileManager, DeviceFlasher from mu.modes.api import MICROBIT_APIS, SHARED_APIS from mu.contrib import uflash from unittest import mock from tokenize import TokenError TEST_ROOT = os.path.split(os.path.dirname(__file__))[0] def test_DeviceFlasher_init(): """ Ensure the DeviceFlasher thread is set up correctly. """ df = DeviceFlasher(['path', ], 'script', None) assert df.paths_to_microbits == ['path', ] assert df.python_script == 'script' assert df.path_to_runtime is None def test_DeviceFlasher_run(): """ Ensure the uflash.flash function is called as expected. """ df = DeviceFlasher(['path', ], 'script', None) mock_flash = mock.MagicMock() with mock.patch('mu.modes.microbit.uflash', mock_flash): df.run() mock_flash.flash.assert_called_once_with(paths_to_microbits=['path', ], python_script='script', path_to_runtime=None) def test_DeviceFlasher_run_fail(): """ Ensure the on_flash_fail signal is emitted if an exception is thrown. """ df = DeviceFlasher(['path', ], 'script', None) df.on_flash_fail = mock.MagicMock() mock_flash = mock.MagicMock() mock_flash.flash.side_effect = Exception('Boom') with mock.patch('mu.modes.microbit.uflash', mock_flash): df.run() df.on_flash_fail.emit.assert_called_once_with(str(Exception('Boom'))) def test_FileManager_on_start(): """ When a thread signals it has started, list the files. """ fm = FileManager() fm.ls = mock.MagicMock() fm.on_start() fm.ls.assert_called_once_with() def test_FileManager_ls(): """ The on_list_files signal is emitted with a tuple of files when microfs.ls completes successfully. """ fm = FileManager() fm.on_list_files = mock.MagicMock() mock_ls = mock.MagicMock(return_value=['foo.py', 'bar.py', ]) with mock.patch('mu.modes.microbit.microfs.ls', mock_ls): fm.ls() fm.on_list_files.emit.assert_called_once_with(('foo.py', 'bar.py')) def test_FileManager_ls_fail(): """ The on_list_fail signal is emitted when a problem is encountered. """ fm = FileManager() fm.on_list_fail = mock.MagicMock() with mock.patch('mu.modes.microbit.microfs.ls', side_effect=Exception('boom')): fm.ls() fm.on_list_fail.emit.assert_called_once_with() def test_fileManager_get(): """ The on_get_file signal is emitted with the name of the effected file when microfs.get completes successfully. """ fm = FileManager() fm.on_get_file = mock.MagicMock() mock_get = mock.MagicMock() with mock.patch('mu.modes.microbit.microfs.get', mock_get): fm.get('foo.py', 'bar.py') mock_get.assert_called_once_with('foo.py', 'bar.py') fm.on_get_file.emit.assert_called_once_with('foo.py') def test_FileManager_get_fail(): """ The on_get_fail signal is emitted when a problem is encountered. """ fm = FileManager() fm.on_get_fail = mock.MagicMock() with mock.patch('mu.modes.microbit.microfs.get', side_effect=Exception('boom')): fm.get('foo.py', 'bar.py') fm.on_get_fail.emit.assert_called_once_with('foo.py') def test_FileManager_put(): """ The on_put_file signal is emitted with the name of the effected file when microfs.put completes successfully. """ fm = FileManager() fm.on_put_file = mock.MagicMock() mock_put = mock.MagicMock() path = os.path.join('directory', 'foo.py') with mock.patch('mu.modes.microbit.microfs.put', mock_put): fm.put(path) mock_put.assert_called_once_with(path, target=None) fm.on_put_file.emit.assert_called_once_with('foo.py') def test_FileManager_put_fail(): """ The on_put_fail signal is emitted when a problem is encountered. """ fm = FileManager() fm.on_put_fail = mock.MagicMock() with mock.patch('mu.modes.microbit.microfs.put', side_effect=Exception('boom')): fm.put('foo.py') fm.on_put_fail.emit.assert_called_once_with('foo.py') def test_FileManager_delete(): """ The on_delete_file signal is emitted with the name of the effected file when microfs.rm completes successfully. """ fm = FileManager() fm.on_delete_file = mock.MagicMock() mock_rm = mock.MagicMock() with mock.patch('mu.modes.microbit.microfs.rm', mock_rm): fm.delete('foo.py') mock_rm.assert_called_once_with('foo.py') fm.on_delete_file.emit.assert_called_once_with('foo.py') def test_FileManager_delete_fail(): """ The on_delete_fail signal is emitted when a problem is encountered. """ fm = FileManager() fm.on_delete_fail = mock.MagicMock() with mock.patch('mu.modes.microbit.microfs.rm', side_effect=Exception('boom')): fm.delete('foo.py') fm.on_delete_fail.emit.assert_called_once_with('foo.py') def test_microbit_mode(): """ Sanity check for setting up the mode. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicrobitMode(editor, view) assert mm.name == 'BBC micro:bit' assert mm.description is not None assert mm.icon == 'microbit' assert mm.editor == editor assert mm.view == view actions = mm.actions() assert len(actions) == 4 assert actions[0]['name'] == 'flash' assert actions[0]['handler'] == mm.flash assert actions[1]['name'] == 'files' assert actions[1]['handler'] == mm.toggle_files assert actions[2]['name'] == 'repl' assert actions[2]['handler'] == mm.toggle_repl assert actions[3]['name'] == 'plotter' assert actions[3]['handler'] == mm.toggle_plotter def test_microbit_mode_no_charts(): """ If QCharts is not available, ensure plotter is not displayed. """ editor = mock.MagicMock() view = mock.MagicMock() mm = MicrobitMode(editor, view) with mock.patch('mu.modes.microbit.CHARTS', False): actions = mm.actions() assert len(actions) == 3 assert actions[0]['name'] == 'flash' assert actions[0]['handler'] == mm.flash assert actions[1]['name'] == 'files' assert actions[1]['handler'] == mm.toggle_files assert actions[2]['name'] == 'repl' assert actions[2]['handler'] == mm.toggle_repl def test_flash_no_tab(): """ If there are no active tabs simply return. """ editor = mock.MagicMock() view = mock.MagicMock() view.current_tab = None mm = MicrobitMode(editor, view) assert mm.flash() is None def test_flash_with_attached_device_has_latest_firmware(): """ There's NO need to use the DeviceFlasher if the board already has the latest firmware. In which case, just call copy_main. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': uflash.MICROPYTHON_VERSION, 'version': ("micro:bit v0.1.0-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', return_value=version_info),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('bar', '12345')) mm.copy_main = mock.MagicMock() mm.set_buttons = mock.MagicMock() mm.flash() assert mock_flasher_class.call_count == 0 mm.copy_main.assert_called_once_with() def test_flash_device_has_latest_firmware_encounters_serial_problem_windows(): """ If copy_main encounters an IOError on Windows, revert to old-school flashing. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': uflash.MICROPYTHON_VERSION, 'version': ("micro:bit v0.1.0-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', return_value=version_info),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('bar', '12345')) mm.flash_failed = mock.MagicMock() error = IOError('bang') mm.copy_main = mock.MagicMock(side_effect=error) mm.set_buttons = mock.MagicMock() mm.flash() mm.copy_main.assert_called_once_with() mock_flasher_class.assert_called_once_with(['bar', ], b'foo', None) mock_flasher.finished.connect.\ assert_called_once_with(mm.flash_finished) mock_flasher.on_flash_fail.connect.\ assert_called_once_with(mm.flash_failed) mock_flasher.start.assert_called_once_with() def test_flash_device_has_latest_firmware_encounters_serial_problem_unix(): """ If copy_main encounters an IOError on unix-y, revert to old-school flashing. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': uflash.MICROPYTHON_VERSION, 'version': ("micro:bit v0.1.0-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) mock_timer = mock.MagicMock() mock_timer_class = mock.MagicMock(return_value=mock_timer) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', return_value=version_info),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.QTimer', mock_timer_class), \ mock.patch('mu.modes.microbit.sys.platform', 'linux'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('bar', '12345')) mm.flash_failed = mock.MagicMock() error = IOError('bang') mm.copy_main = mock.MagicMock(side_effect=error) mm.set_buttons = mock.MagicMock() mm.flash() mm.copy_main.assert_called_once_with() mock_flasher_class.assert_called_once_with(['bar', ], b'foo', None) mock_flasher.on_flash_fail.connect.\ assert_called_once_with(mm.flash_failed) mock_flasher.start.assert_called_once_with() assert mm.flash_timer == mock_timer mock_timer.timeout.connect.assert_called_once_with(mm.flash_finished) mock_timer.setSingleShot.assert_called_once_with(True) mock_timer.start.assert_called_once_with(10000) def test_flash_with_attached_device_has_latest_firmware_encounters_problem(): """ If copy_main encounters a non-IOError, handle in a helpful manner. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': uflash.MICROPYTHON_VERSION, 'version': ("micro:bit v0.1.0-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', return_value=version_info),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('bar', '12345')) mm.flash_failed = mock.MagicMock() error = ValueError('bang') mm.copy_main = mock.MagicMock(side_effect=error) mm.set_buttons = mock.MagicMock() mm.flash() assert mock_flasher_class.call_count == 0 mm.copy_main.assert_called_once_with() mm.flash_failed.assert_called_once_with(error) def test_flash_with_attached_device_has_old_firmware(): """ If the device has some unknown old firmware, force flash it. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': '1.0', 'version': ("v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', return_value=version_info),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('bar', '990112345')) mm.copy_main = mock.MagicMock() mm.set_buttons = mock.MagicMock() mm.flash() assert mm.flash_thread == mock_flasher assert editor.show_status_message.call_count == 1 mm.set_buttons.assert_called_once_with(flash=False) mock_flasher_class.assert_called_once_with(['bar', ], b'', None) mock_flasher.finished.connect.\ assert_called_once_with(mm.flash_finished) mock_flasher.on_flash_fail.connect.\ assert_called_once_with(mm.flash_failed) mock_flasher.start.assert_called_once_with() def test_flash_force_with_no_micropython(): """ Ensure the expected calls are made to DeviceFlasher and a helpful status message is enacted if there is no MicroPython firmware on the device. """ mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', side_effect=ValueError('bang')),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '/foo/bar' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('bar', '12345')) mm.set_buttons = mock.MagicMock() mm.flash() assert mm.flash_thread == mock_flasher assert editor.show_status_message.call_count == 1 mm.set_buttons.assert_called_once_with(flash=False) mock_flasher_class.assert_called_once_with(['bar', ], b'', '/foo/bar') mock_flasher.finished.connect.\ assert_called_once_with(mm.flash_finished) mock_flasher.on_flash_fail.connect.\ assert_called_once_with(mm.flash_failed) mock_flasher.start.assert_called_once_with() def test_flash_force_with_unsupported_microbit(): """ If Mu is supposed to flash the device, but the device is, in fact, not one that's supported by the version of MicroPython built into Mu, then display a warning message to the user. """ mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', side_effect=ValueError('bang')),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() # Empty file to force flashing. view.current_tab.text = mock.MagicMock(return_value='') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.microbit_runtime = '' editor.minify = False mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('bar', '1234567890')) mm.set_buttons = mock.MagicMock() mm.flash() assert view.show_message.call_count == 1 def test_flash_force_with_attached_device_as_windows(): """ Ensure the expected calls are made to DeviceFlasher and a helpful status message is enacted as if on Windows. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': '1.0', 'version': ("micro:bit v0.0.9-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', return_value=version_info),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '/foo/bar' mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() mm.find_device = mock.MagicMock(return_value=('bar', '12345')) mm.flash() assert mm.flash_thread == mock_flasher assert editor.show_status_message.call_count == 1 mm.set_buttons.assert_called_once_with(flash=False) mock_flasher_class.assert_called_once_with(['bar', ], b'', '/foo/bar') mock_flasher.finished.connect.\ assert_called_once_with(mm.flash_finished) mock_flasher.on_flash_fail.connect.\ assert_called_once_with(mm.flash_failed) mock_flasher.start.assert_called_once_with() def test_flash_forced_with_attached_device_as_not_windows(): """ Ensure the expected calls are made to DeviceFlasher and a helpful status message is enacted as if not on Windows. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': '1.0', 'version': ("micro:bit v0.0.9-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_timer = mock.MagicMock() mock_timer_class = mock.MagicMock(return_value=mock_timer) mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', return_value=version_info),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'linux'), \ mock.patch('mu.modes.microbit.QTimer', mock_timer_class): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '990112345')) mm.set_buttons = mock.MagicMock() mm.copy_main = mock.MagicMock() mm.flash() assert mm.flash_timer == mock_timer assert editor.show_status_message.call_count == 1 mm.set_buttons.assert_called_once_with(flash=False) mock_flasher_class.assert_called_once_with(['bar', ], b'', None) assert mock_flasher.finished.connect.call_count == 0 mock_timer.timeout.connect.assert_called_once_with(mm.flash_finished) mock_timer.setSingleShot.assert_called_once_with(True) mock_timer.start.assert_called_once_with(10000) mock_flasher.on_flash_fail.connect.\ assert_called_once_with(mm.flash_failed) mock_flasher.start.assert_called_once_with() assert mm.python_script == b'foo' def test_flash_with_attached_device_and_custom_runtime(): """ Ensure the custom runtime is passed into the DeviceFlasher thread. """ mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.base.BaseMode.workspace_dir', return_value=TEST_ROOT), \ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = True editor.microbit_runtime = os.path.join('tests', 'customhextest.hex') mm = MicrobitMode(editor, view) mm.flash() assert editor.show_status_message.call_count == 1 assert os.path.join('tests', 'customhextest.hex') in \ editor.show_status_message.call_args[0][0] assert mock_flasher_class.call_count == 1 def test_flash_with_attached_known_device_and_forced(): """ If the runtime must be flashed, and the serial number for the device is supported, then flash the built-in MicroPython runtime. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': '1.0.0', 'version': ("micro:bit v0.0.9-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_timer = mock.MagicMock() mock_timer_class = mock.MagicMock(return_value=mock_timer) mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.modes.microbit.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.modes.microbit.microfs.version', return_value=version_info),\ mock.patch('mu.modes.microbit.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'linux'), \ mock.patch('mu.modes.microbit.QTimer', mock_timer_class): view = mock.MagicMock() # Trigger force flash with an empty file. view.current_tab.text = mock.MagicMock(return_value='') editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '990112345')) mm.flash() assert mock_flasher_class.call_count == 1 mock_flasher_class.assert_called_once_with(['bar', ], b'', None) def test_force_flash_no_serial_connection(): """ If Mu cannot establish a serial connection to the micro:bit, BUT the path to the micro:bit on the filesystem is known, then fall back to old-school flashing of hex with script appended to the end. """ mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.contrib.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.contrib.microfs.get_serial'),\ mock.patch('mu.contrib.microfs.version', side_effect=IOError('bang')),\ mock.patch('mu.logic.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(side_effect=IOError('bang')) mm.flash() mock_flasher_class.assert_called_once_with(['bar', ], b'foo', None) mock_flasher.finished.connect.\ assert_called_once_with(mm.flash_finished) def test_force_flash_empty_script(): """ If the script to be flashed onto the device is empty, this is a signal to force a full flash of the "vanilla" / empty MicroPython runtime onto the device. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': uflash.MICROPYTHON_VERSION, 'version': ("micro:bit v0.1.0-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.contrib.uflash.find_microbit', return_value='bar'),\ mock.patch('mu.contrib.microfs.get_serial'),\ mock.patch('mu.contrib.microfs.version', return_value=version_info),\ mock.patch('mu.logic.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value=' ') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '990112345')) mm.flash() mock_flasher_class.assert_called_once_with(['bar', ], b'', None) mock_flasher.finished.connect.\ assert_called_once_with(mm.flash_finished) def test_force_flash_user_specified_device_path(): """ Ensure that if a micro:bit is not automatically found by uflash then it prompts the user to locate the device and, assuming a path was given, saves the hex in the expected location. """ version_info = { 'sysname': 'microbit', 'nodename': 'microbit', 'release': uflash.MICROPYTHON_VERSION, 'version': ("micro:bit v0.1.0-b'e10a5ff' on 2018-6-8; MicroPython " "v1.9.2-34-gd64154c73 on 2017-09-01"), 'machine': 'micro:bit with nRF51822', } mock_flasher = mock.MagicMock() mock_flasher_class = mock.MagicMock(return_value=mock_flasher) with mock.patch('mu.contrib.uflash.find_microbit', return_value=None),\ mock.patch('mu.contrib.microfs.get_serial'),\ mock.patch('mu.contrib.microfs.version', return_value=version_info),\ mock.patch('mu.logic.os.path.exists', return_value=True),\ mock.patch('mu.modes.microbit.DeviceFlasher', mock_flasher_class), \ mock.patch('mu.modes.microbit.sys.platform', 'win32'): view = mock.MagicMock() view.get_microbit_path = mock.MagicMock(return_value='bar') view.current_tab.text = mock.MagicMock(return_value='foo') view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False editor.microbit_runtime = '' mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=(None, None)) mm.flash() home = HOME_DIRECTORY view.get_microbit_path.assert_called_once_with(home) mock_flasher_class.assert_called_once_with(['bar', ], b'foo', None) mock_flasher.finished.connect.\ assert_called_once_with(mm.flash_finished) def test_flash_path_specified_does_not_exist(): """ Ensure that if a micro:bit is not automatically found by uflash and the user has previously specified a path to the device, then the hex is saved in the specified location. """ with mock.patch('mu.contrib.uflash.hexlify', return_value=''), \ mock.patch('mu.contrib.uflash.embed_hex', return_value='foo'), \ mock.patch('mu.contrib.uflash.find_microbit', return_value=None),\ mock.patch('mu.logic.os.path.exists', return_value=False),\ mock.patch('mu.logic.os.makedirs', return_value=None), \ mock.patch('mu.contrib.uflash.save_hex', return_value=None) as s: view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='') view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=('COM0', '12345')) mm.user_defined_microbit_path = 'baz' mm.flash() message = 'Could not find an attached BBC micro:bit.' information = ("Please ensure you leave enough time for the BBC" " micro:bit to be attached and configured correctly" " by your computer. This may take several seconds." " Alternatively, try removing and re-attaching the" " device or saving your work and restarting Mu if" " the device remains unfound.") view.show_message.assert_called_once_with(message, information) assert s.call_count == 0 def test_flash_without_device(): """ If no device is found and the user doesn't provide a path then ensure a helpful status message is enacted. """ with mock.patch('mu.contrib.uflash.hexlify', return_value=''), \ mock.patch('mu.contrib.uflash.embed_hex', return_value='foo'), \ mock.patch('mu.contrib.uflash.find_microbit', return_value=None),\ mock.patch('mu.contrib.uflash.save_hex', return_value=None) as s: view = mock.MagicMock() view.get_microbit_path = mock.MagicMock(return_value=None) view.current_tab.text = mock.MagicMock(return_value='') view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=(None, None)) mm.flash() message = 'Could not find an attached BBC micro:bit.' information = ("Please ensure you leave enough time for the BBC" " micro:bit to be attached and configured correctly" " by your computer. This may take several seconds." " Alternatively, try removing and re-attaching the" " device or saving your work and restarting Mu if" " the device remains unfound.") view.show_message.assert_called_once_with(message, information) home = HOME_DIRECTORY view.get_microbit_path.assert_called_once_with(home) assert s.call_count == 0 def test_flash_script_too_big(): """ If the script in the current tab is too big, abort in the expected way. """ view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='x' * 8193) view.current_tab.label = 'foo' view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = True mm = MicrobitMode(editor, view) with mock.patch('mu.modes.microbit.can_minify', True): mm.flash() view.show_message.assert_called_once_with('Unable to flash "foo"', 'Our minifier tried but your ' 'script is too long!', 'Warning') def test_flash_script_too_big_no_minify(): """ If the script in the current tab is too big, abort in the expected way. """ view = mock.MagicMock() view.current_tab.text = mock.MagicMock(return_value='x' * 8193) view.current_tab.label = 'foo' view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = False mm = MicrobitMode(editor, view) with mock.patch('mu.modes.microbit.can_minify', False): mm.flash() view.show_message.assert_called_once_with('Unable to flash "foo"', 'Your script is too long!', 'Warning') def test_flash_finished_copy_main(): """ Ensure state is set back as expected when the flashing thread is finished. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.python_script = 'foo' mm.copy_main = mock.MagicMock() mm.set_buttons = mock.MagicMock() mm.flash_thread = mock.MagicMock() mm.flash_timer = mock.MagicMock() mm.flash_finished() mm.set_buttons.assert_called_once_with(flash=True) editor.show_status_message.assert_called_once_with("Finished flashing.") assert mm.flash_thread is None assert mm.flash_timer is None mm.copy_main.assert_called_once_with() def test_flash_finished_copy_main_encounters_error(): """ If copy_main encounters an error, flash_failed is called. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.flash_failed = mock.MagicMock() mm.python_script = 'foo' error = IOError('boom') mm.copy_main = mock.MagicMock(side_effect=error) mm.set_buttons = mock.MagicMock() mm.flash_thread = mock.MagicMock() mm.flash_timer = mock.MagicMock() mm.flash_finished() mm.set_buttons.assert_called_once_with(flash=True) editor.show_status_message.assert_called_once_with("Finished flashing.") assert mm.flash_thread is None assert mm.flash_timer is None mm.copy_main.assert_called_once_with() mm.flash_failed.assert_called_once_with(error) def test_flash_finished_no_copy(): """ Ensure state is set back as expected when the flashing thread is finished. If no python_script is set, then copy_main is NOT called. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.copy_main = mock.MagicMock() mm.set_buttons = mock.MagicMock() mm.flash_thread = mock.MagicMock() mm.flash_timer = mock.MagicMock() mm.flash_finished() mm.set_buttons.assert_called_once_with(flash=True) editor.show_status_message.assert_called_once_with("Finished flashing.") assert mm.flash_thread is None assert mm.flash_timer is None assert mm.copy_main.call_count == 0 def test_copy_main_no_python_script(): """ If copy_main is called and there's nothing in self.python_script, then don't do anything. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.python_script = '' with mock.patch('mu.modes.microbit.microfs') as mock_microfs: mm.copy_main() assert mock_microfs.execute.call_count == 0 def test_copy_main_with_python_script(): """ If copy_main is called and there's something in self.python_script, then use microfs to write it to the device's on-board filesystem, followed by a soft-reboot. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.python_script = 'import love' with mock.patch('mu.modes.microbit.microfs') as mock_microfs: mock_microfs.execute.return_value = ('', '') mm.copy_main() serial = mock_microfs.get_serial() expected = [ "fd = open('main.py', 'wb')", "f = fd.write", "f('import love')", "fd.close()", ] mock_microfs.execute.assert_called_once_with(expected, serial) serial.write.call_count == 2 assert serial.write.call_args_list[0][0][0] == b'import microbit\r\n' assert serial.write.call_args_list[1][0][0] == b'microbit.reset()\r\n' # The script is re-set to empty. assert mm.python_script == '' def test_copy_main_with_python_script_encounters_device_error(): """ If the device returns an error, then copy_main should raise an IOError. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.python_script = 'import love' with mock.patch('mu.modes.microbit.microfs') as mock_microfs: mock_microfs.execute.return_value = ('', 'BANG!') with pytest.raises(IOError): mm.copy_main() def test_flash_failed(): """ Ensure things are cleaned up if flashing failed. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() mock_timer = mock.MagicMock() mm.flash_timer = mock_timer mm.flash_thread = mock.MagicMock() mm.flash_failed('Boom') assert view.show_message.call_count == 1 mm.set_buttons.assert_called_once_with(flash=True) assert mm.flash_thread is None assert mm.flash_timer is None mock_timer.stop.assert_called_once_with() def test_flash_minify(): view = mock.MagicMock() script = '#' + ('x' * 8193) + '\n' view.current_tab.text = mock.MagicMock(return_value=script) view.show_message = mock.MagicMock() editor = mock.MagicMock() editor.minify = True mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() with mock.patch('mu.modes.microbit.DeviceFlasher'): with mock.patch('nudatus.mangle', return_value='') as m: mm.flash() m.assert_called_once_with(script) ex = TokenError('Bad', (1, 0)) with mock.patch('nudatus.mangle', side_effect=ex) as m: mm.flash() view.show_message.assert_called_once_with('Problem with script', 'Bad [1:0]', 'Warning') def test_flash_minify_no_minify(): view = mock.MagicMock() view.current_tab.label = 'foo' view.show_message = mock.MagicMock() script = '#' + ('x' * 8193) + '\n' view.current_tab.text = mock.MagicMock(return_value=script) editor = mock.MagicMock() editor.minify = True mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() with mock.patch('mu.modes.microbit.can_minify', False): with mock.patch('nudatus.mangle', return_value='') as m: mm.flash() assert m.call_count == 0 view.show_message.assert_called_once_with('Unable to flash "foo"', 'Your script is too long' ' and the minifier ' 'isn\'t available', 'Warning') def test_add_fs(): """ It's possible to add the file system pane if the REPL is inactive. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) with mock.patch('mu.modes.microbit.FileManager') as mock_fm,\ mock.patch('mu.modes.microbit.QThread'): mm.find_device = mock.MagicMock(return_value=('COM0', '12345')) mm.add_fs() workspace = mm.workspace_dir() view.add_filesystem.assert_called_once_with(workspace, mock_fm()) assert mm.fs def test_add_fs_no_device(): """ If there's no device attached then ensure a helpful message is displayed. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.find_device = mock.MagicMock(return_value=(None, None)) mm.add_fs() assert view.show_message.call_count == 1 def test_remove_fs(): """ Removing the file system results in the expected state. """ view = mock.MagicMock() view.remove_repl = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.fs = True mm.remove_fs() assert view.remove_filesystem.call_count == 1 assert mm.fs is None def test_toggle_files_on(): """ If the fs is off, toggle it on. """ view = mock.MagicMock() view.button_bar.slots = { 'repl': mock.MagicMock(), 'plotter': mock.MagicMock(), } editor = mock.MagicMock() mm = MicrobitMode(editor, view) def side_effect(*args, **kwargs): mm.fs = True mm.add_fs = mock.MagicMock(side_effect=side_effect) mm.repl = None mm.fs = None mm.toggle_files(None) assert mm.add_fs.call_count == 1 view.button_bar.slots['repl'].setEnabled.assert_called_once_with(False) view.button_bar.slots['plotter'].setEnabled.assert_called_once_with(False) def test_toggle_files_off(): """ If the fs is on, toggle if off. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.remove_fs = mock.MagicMock() mm.repl = None mm.fs = True mm.toggle_files(None) assert mm.remove_fs.call_count == 1 def test_toggle_files_with_repl(): """ If the REPL is active, ensure a helpful message is displayed. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.add_repl = mock.MagicMock() mm.repl = True mm.fs = None mm.toggle_files(None) assert view.show_message.call_count == 1 def test_toggle_files_with_plotter(): """ If the plotter is active, ensure a helpful message is displayed. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.plotter = True mm.fs = None mm.toggle_files(None) assert view.show_message.call_count == 1 def test_toggle_repl(): """ Ensure the REPL is able to toggle on if there's no file system pane. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() def side_effect(*args, **kwargs): mm.repl = True with mock.patch('mu.modes.microbit.MicroPythonMode.toggle_repl', side_effect=side_effect) as tr: mm.repl = None mm.toggle_repl(None) tr.assert_called_once_with(None) mm.set_buttons.assert_called_once_with(flash=False, files=False) def test_toggle_repl_no_repl_or_plotter(): """ Ensure the file system button is enabled if the repl toggles off and the plotter isn't active. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() def side_effect(*args, **kwargs): mm.repl = False mm.plotter = False with mock.patch('mu.modes.microbit.MicroPythonMode.toggle_repl', side_effect=side_effect) as tr: mm.repl = None mm.toggle_repl(None) tr.assert_called_once_with(None) mm.set_buttons.assert_called_once_with(flash=True, files=True) def test_toggle_repl_with_fs(): """ If the file system is active, show a helpful message instead. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.remove_repl = mock.MagicMock() mm.repl = None mm.fs = True mm.toggle_repl(None) assert view.show_message.call_count == 1 def test_toggle_plotter(): """ Ensure the plotter is toggled on if the file system pane is absent. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() def side_effect(*args, **kwargs): mm.plotter = True with mock.patch('mu.modes.microbit.MicroPythonMode.toggle_plotter', side_effect=side_effect) as tp: mm.plotter = None mm.toggle_plotter(None) tp.assert_called_once_with(None) mm.set_buttons.assert_called_once_with(flash=False, files=False) def test_toggle_plotter_no_repl_or_plotter(): """ Ensure the file system button is enabled if the plotter toggles off and the repl isn't active. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() def side_effect(*args, **kwargs): mm.plotter = False mm.repl = False with mock.patch('mu.modes.microbit.MicroPythonMode.toggle_plotter', side_effect=side_effect) as tp: mm.plotter = None mm.toggle_plotter(None) tp.assert_called_once_with(None) mm.set_buttons.assert_called_once_with(flash=True, files=True) def test_toggle_plotter_with_fs(): """ If the file system is active, show a helpful message instead. """ view = mock.MagicMock() view.show_message = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.remove_plotter = mock.MagicMock() mm.plotter = None mm.fs = True mm.toggle_plotter(None) assert view.show_message.call_count == 1 def test_api(): """ Ensure the right thing comes back from the API. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) api = mm.api() assert api == SHARED_APIS + MICROBIT_APIS def test_on_data_flood(): """ Ensure the "Files" button is re-enabled before calling the base method. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mm.set_buttons = mock.MagicMock() with mock.patch('builtins.super') as mock_super: mm.on_data_flood() mm.set_buttons.assert_called_once_with(files=True) mock_super().on_data_flood.assert_called_once_with() def test_open_hex(): """ Tries to open hex files with uFlash. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mock_open = mock.mock_open() hex_extracted = 'RECOVERED' with mock.patch('builtins.open', mock_open), \ mock.patch('mu.contrib.uflash.extract_script', return_value=hex_extracted) as extract_script: text = mm.open_file('path_to_file.hex') assert text == hex_extracted assert extract_script.call_count == 1 assert mock_open.call_count == 1 mock_open.reset_mock() with mock.patch('builtins.open', mock_open), \ mock.patch('mu.contrib.uflash.extract_script', return_value=hex_extracted) as extract_script: text = mm.open_file('path_to_file.HEX') assert text == hex_extracted assert extract_script.call_count == 1 assert mock_open.call_count == 1 def test_open_ignore_non_hex(): """ Ignores any other than hex file types. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mock_open = mock.mock_open() with mock.patch('builtins.open', mock_open), \ mock.patch('mu.contrib.uflash.extract_script', return_value='Should not be called') as extract_script: text = mm.open_file('path_to_file.py') assert text is None assert extract_script.call_count == 0 assert mock_open.call_count == 0 mock_open.reset_mock() with mock.patch('builtins.open', mock_open), \ mock.patch('mu.contrib.uflash.extract_script', return_value='Should not be called') as extract_script: text = mm.open_file('file_no_extension') assert text is None assert extract_script.call_count == 0 assert mock_open.call_count == 0 def test_open_hex_with_exception(): """ If an exception is encountered when trying to open the hex file, make sure it is swallowed and return None. """ view = mock.MagicMock() editor = mock.MagicMock() mm = MicrobitMode(editor, view) mock_open = mock.mock_open() mock_extract = mock.MagicMock(side_effect=Exception(':(')) with mock.patch('builtins.open', mock_open), \ mock.patch('mu.contrib.uflash.extract_script', mock_extract): text = mm.open_file('path_to_file.hex') assert text is None assert mock_extract.call_count == 1 assert mock_open.call_count == 1 mu-editor-1.0.2+dfsg/tests/modes/test_pygamezero.py000066400000000000000000000163351341747546300224300ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the PyGameZero mode. """ import os.path from mu.modes.pygamezero import PyGameZeroMode from mu.modes.api import PYTHON3_APIS, SHARED_APIS, PI_APIS, PYGAMEZERO_APIS from unittest import mock def test_pgzero_mode(): """ Sanity check for setting up of the mode. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) assert pm.name == 'Pygame Zero' assert pm.description is not None assert pm.icon == 'pygamezero' assert pm.is_debugger is False assert pm.editor == editor assert pm.view == view assert pm.builtins actions = pm.actions() assert len(actions) == 5 assert actions[0]['name'] == 'play' assert actions[0]['handler'] == pm.play_toggle assert actions[1]['name'] == 'images' assert actions[1]['handler'] == pm.show_images assert actions[2]['name'] == 'fonts' assert actions[2]['handler'] == pm.show_fonts assert actions[3]['name'] == 'sounds' assert actions[3]['handler'] == pm.show_sounds assert actions[4]['name'] == 'music' assert actions[4]['handler'] == pm.show_music def test_pgzero_api(): """ Make sure the API definition is as expected. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) result = pm.api() assert result == SHARED_APIS + PYTHON3_APIS + PI_APIS + PYGAMEZERO_APIS def test_pgzero_play_toggle_on(): """ Check the handler for clicking play starts the new process and updates the UI state. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) pm.runner = None def runner(pm=pm): pm.runner = True pm.run_game = mock.MagicMock(side_effect=runner) pm.set_buttons = mock.MagicMock() pm.play_toggle(None) pm.run_game.assert_called_once_with() slot = pm.view.button_bar.slots['play'] assert slot.setIcon.call_count == 1 slot.setText.assert_called_once_with('Stop') slot.setToolTip.assert_called_once_with('Stop your Pygame Zero game.') pm.set_buttons.assert_called_once_with(modes=False) def test_pgzero_play_toggle_on_cancelled(): """ Ensure the button states are correct if playing an unsaved script is cancelled before the process is allowed to start. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) pm.runner = None pm.run_game = mock.MagicMock() pm.play_toggle(None) pm.run_game.assert_called_once_with() slot = pm.view.button_bar.slots['play'] assert slot.setIcon.call_count == 0 def test_pgzero_play_toggle_off(): """ Check the handler for clicking play stops the process and reverts the UI state. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) pm.runner = True pm.stop_game = mock.MagicMock() pm.set_buttons = mock.MagicMock() pm.play_toggle(None) pm.stop_game.assert_called_once_with() slot = pm.view.button_bar.slots['play'] assert slot.setIcon.call_count == 1 slot.setText.assert_called_once_with('Play') slot.setToolTip.assert_called_once_with('Play your Pygame Zero game.') pm.set_buttons.assert_called_once_with(modes=True) def test_pgzero_run_game(): """ Ensure that running the game launches the process as expected. """ editor = mock.MagicMock() editor.envars = [['name', 'value'], ] view = mock.MagicMock() view.current_tab.path = '/foo' view.current_tab.isModified.return_value = True mock_runner = mock.MagicMock() view.add_python3_runner.return_value = mock_runner pm = PyGameZeroMode(editor, view) pm.workspace_dir = mock.MagicMock(return_value='/bar') pm.run_game() editor.save_tab_to_file.called_once_with(view.current_tab) py_args = ['-m', 'pgzero'] view.add_python3_runner.assert_called_once_with('/foo', '/bar', interactive=False, envars=editor.envars, python_args=py_args) mock_runner.process.waitForStarted.assert_called_once_with() def test_pgzero_run_game_no_editor(): """ If there's no active tab, there can be no runner either. """ editor = mock.MagicMock() view = mock.MagicMock() view.current_tab = None pm = PyGameZeroMode(editor, view) pm.stop_game = mock.MagicMock() pm.run_game() assert pm.runner is None pm.stop_game.assert_called_once_with() def test_pgzero_run_game_needs_saving(): """ If the file hasn't been saved yet (it's unnamed), prompt the user to save it. """ editor = mock.MagicMock() view = mock.MagicMock() view.current_tab.path = None pm = PyGameZeroMode(editor, view) pm.stop_game = mock.MagicMock() pm.run_game() editor.save.assert_called_once_with() def test_pgzero_stop_game(): """ Check that the child process is killed, the runner cleaned up and UI is reset. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) mock_runner = mock.MagicMock() pm.runner = mock_runner pm.stop_game() mock_runner.process.kill.assert_called_once_with() mock_runner.process.waitForFinished.assert_called_once_with() assert pm.runner is None view.remove_python_runner.assert_called_once_with() def test_pgzero_stop_game_no_runner(): """ If the game is cancelled before the child process is created ensure nothing breaks and the UI is reset. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) pm.runner = None pm.stop_game() view.remove_python_runner.assert_called_once_with() def test_pgzero_show_images(): """ The view is called to run the OS's file explorer for the given images path. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) pm.show_images(None) image_dir = os.path.join(pm.workspace_dir(), 'images') view.open_directory_from_os.assert_called_once_with(image_dir) def test_pgzero_show_fonts(): """ The view is called to run the OS's file explorer for the given fonts path. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) pm.show_fonts(None) fonts_dir = os.path.join(pm.workspace_dir(), 'fonts') view.open_directory_from_os.assert_called_once_with(fonts_dir) def test_pgzero_show_sounds(): """ The view is called to run the OS's file explorer for the given sounds path. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) pm.show_sounds(None) sounds_dir = os.path.join(pm.workspace_dir(), 'sounds') view.open_directory_from_os.assert_called_once_with(sounds_dir) def test_pgzero_show_music(): """ The view is called to run the OS's file explorer for the given music path. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PyGameZeroMode(editor, view) pm.show_music(None) music_dir = os.path.join(pm.workspace_dir(), 'music') view.open_directory_from_os.assert_called_once_with(music_dir) mu-editor-1.0.2+dfsg/tests/modes/test_python3.py000066400000000000000000000443731341747546300216550ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the Python3 mode. """ import sys from mu.modes.python3 import PythonMode, KernelRunner from mu.modes.api import PYTHON3_APIS, SHARED_APIS, PI_APIS from unittest import mock def test_kernel_runner_start_kernel(): """ Ensure the start_kernel method eventually emits the kernel_started signal with the associated kernel manager and kernel client objects for subsequent use. """ mock_kernel_manager = mock.MagicMock() mock_client = mock.MagicMock() mock_kernel_manager.client.return_value = mock_client envars = [['name', 'value'], ] kr = KernelRunner(cwd='/a/path/to/mu_code', envars=envars) kr.kernel_started = mock.MagicMock() mock_os = mock.MagicMock() mock_os.environ = {} mock_os.path.dirname.return_value = ('/Applications/mu-editor.app' '/Contents/Resources/app/mu') mock_kernel_manager_class = mock.MagicMock() mock_kernel_manager_class.return_value = mock_kernel_manager with mock.patch('mu.modes.python3.os', mock_os), \ mock.patch('mu.modes.python3.QtKernelManager', mock_kernel_manager_class), \ mock.patch('sys.platform', 'darwin'): kr.start_kernel() mock_os.chdir.assert_called_once_with('/a/path/to/mu_code') assert mock_os.environ['name'] == 'value' assert mock_os.environ['PYTHONPATH'] == ':'.join(sys.path) assert kr.repl_kernel_manager == mock_kernel_manager mock_kernel_manager_class.assert_called_once_with() mock_kernel_manager.start_kernel.assert_called_once_with() assert kr.repl_kernel_client == mock_client kr.kernel_started.emit.assert_called_once_with(mock_kernel_manager, mock_client) def test_kernel_runner_stop_kernel(): """ Ensure the stop_kernel method eventually emits the kernel_finished signal once it has stopped the client communication channels and shutdown the kernel in the quickest way possible. """ kr = KernelRunner(cwd='/a/path/to/mu_code', envars=[['name', 'value'], ]) kr.repl_kernel_client = mock.MagicMock() kr.repl_kernel_manager = mock.MagicMock() kr.kernel_finished = mock.MagicMock() mock_os = mock.MagicMock() mock_os.environ = { 'old_mu_context': 'to_be_deleted', } with mock.patch('mu.modes.python3.os', mock_os): kr.stop_kernel() assert 'old_mu_context' not in mock_os.environ assert len(mock_os.environ) == len(kr.default_envars) kr.repl_kernel_client.stop_channels.assert_called_once_with() kr.repl_kernel_manager.shutdown_kernel.assert_called_once_with(now=True) kr.kernel_finished.emit.assert_called_once_with() def test_python_mode(): """ Sanity check for setting up of the mode. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) assert pm.name == 'Python 3' assert pm.description is not None assert pm.icon == 'python' assert pm.is_debugger is False assert pm.editor == editor assert pm.view == view actions = pm.actions() assert len(actions) == 4 assert actions[0]['name'] == 'run' assert actions[0]['handler'] == pm.run_toggle assert actions[1]['name'] == 'debug' assert actions[1]['handler'] == pm.debug assert actions[2]['name'] == 'repl' assert actions[2]['handler'] == pm.toggle_repl assert actions[3]['name'] == 'plotter' assert actions[3]['handler'] == pm.toggle_plotter def test_python_api(): """ Make sure the API definition is as expected. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) result = pm.api() assert result == SHARED_APIS + PYTHON3_APIS + PI_APIS def test_python_run_toggle_on(): """ Check the handler for clicking run starts the new process and updates the UI state. """ editor = mock.MagicMock() view = mock.MagicMock() view.button_bar.slots = { 'debug': mock.MagicMock(), 'modes': mock.MagicMock(), 'run': mock.MagicMock(), } pm = PythonMode(editor, view) pm.runner = None def runner(pm=pm): pm.runner = True pm.run_script = mock.MagicMock(side_effect=runner) pm.run_toggle(None) pm.run_script.assert_called_once_with() slot = pm.view.button_bar.slots['run'] assert slot.setIcon.call_count == 1 slot.setText.assert_called_once_with('Stop') slot.setToolTip.assert_called_once_with('Stop your Python script.') pm.view.button_bar.slots['debug'].setEnabled.assert_called_once_with(False) pm.view.button_bar.slots['modes'].setEnabled.assert_called_once_with(False) def test_python_run_toggle_on_cancelled(): """ Ensure the button states are correct if running an unsaved script is cancelled before the process is allowed to start. See issue #338. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.runner = None pm.run_script = mock.MagicMock() pm.run_toggle(None) pm.run_script.assert_called_once_with() slot = pm.view.button_bar.slots['run'] assert slot.setIcon.call_count == 0 def test_python_run_toggle_off(): """ Check the handler for clicking run stops the process and reverts the UI state. """ editor = mock.MagicMock() view = mock.MagicMock() view.button_bar.slots = { 'debug': mock.MagicMock(), 'modes': mock.MagicMock(), 'run': mock.MagicMock(), } pm = PythonMode(editor, view) pm.runner = True pm.stop_script = mock.MagicMock() pm.run_toggle(None) pm.stop_script.assert_called_once_with() slot = pm.view.button_bar.slots['run'] assert slot.setIcon.call_count == 1 slot.setText.assert_called_once_with('Run') slot.setToolTip.assert_called_once_with('Run your Python script.') pm.view.button_bar.slots['debug'].setEnabled.assert_called_once_with(True) pm.view.button_bar.slots['modes'].setEnabled.assert_called_once_with(True) def test_python_run_script(): """ Ensure that running the script launches the process as expected. """ editor = mock.MagicMock() editor.envars = [['name', 'value']] view = mock.MagicMock() view.current_tab.path = '/foo' view.current_tab.isModified.return_value = True view.current_tab.text = mock.MagicMock(return_value="abc") mock_runner = mock.MagicMock() view.add_python3_runner.return_value = mock_runner pm = PythonMode(editor, view) pm.workspace_dir = mock.MagicMock(return_value='/bar') pm.run_script() editor.save_tab_to_file.assert_called_once_with(view.current_tab) view.add_python3_runner.assert_called_once_with('/foo', '/bar', interactive=True, envars=editor.envars) mock_runner.process.waitForStarted.assert_called_once_with() # Check the buttons are set to the correct state when other aspects of the # mode are also in play. pm.set_buttons = mock.MagicMock() pm.kernel_runner = True pm.run_script() pm.set_buttons.assert_called_once_with(plotter=False) pm.set_buttons.reset_mock() pm.kernel_runner = False pm.plotter = True pm.run_script() pm.set_buttons.assert_called_once_with(repl=False) def test_python_run_script_no_editor(): """ If there's no active tab, there can be no runner either. """ editor = mock.MagicMock() view = mock.MagicMock() view.current_tab = None pm = PythonMode(editor, view) pm.stop_script = mock.MagicMock() pm.run_script() assert pm.runner is None pm.stop_script.assert_called_once_with() def test_python_run_script_needs_saving(): """ If the file hasn't been saved yet (it's unnamed), prompt the user to save it. """ editor = mock.MagicMock() view = mock.MagicMock() view.current_tab.path = None pm = PythonMode(editor, view) pm.stop_script = mock.MagicMock() pm.run_script() editor.save.assert_called_once_with() def test_python_run_script_uses_editor_save(): """The run code uses the common editor save code, invoking encoding checks and useful messages """ editor = mock.MagicMock() view = mock.MagicMock() view.current_tab.IsModified.return_value = True view.current_tab.path = "foo" view.current_tab.text = mock.MagicMock(return_value="foo") pm = PythonMode(editor, view) pm.stop_script = mock.MagicMock() pm.run_script() editor.save_tab_to_file.assert_called_once_with(view.current_tab) def test_python_stop_script(): """ Check that the child process is killed, the runner cleaned up and UI is reset. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) mock_runner = mock.MagicMock() pm.runner = mock_runner pm.stop_script() mock_runner.process.kill.assert_called_once_with() mock_runner.process.waitForFinished.assert_called_once_with() assert pm.runner is None def test_python_stop_resets_focus(): """ Check that, when a child process is killed, the current tab regains focus. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) mock_runner = mock.MagicMock() pm.runner = mock_runner pm.stop_script() view.current_tab.setFocus.assert_called_once_with() def test_python_stop_script_no_runner(): """ If the script is cancelled before the child process is created ensure nothing breaks and the UI is reset. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.runner = None pm.stop_script() view.remove_python_runner.assert_called_once_with() def test_python_debug(): """ Ensure Python3 mode hands over running of the script to the debug mode. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.debug(None) editor.change_mode.assert_called_once_with('debugger') assert editor.mode == 'debugger' editor.modes['debugger'].start.assert_called_once_with() def test_python_toggle_repl(): """ Ensure the REPL handling works as expected. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.add_repl = mock.MagicMock() pm.remove_repl = mock.MagicMock() pm.toggle_repl(None) pm.add_repl.assert_called_once_with() pm.kernel_runner = True pm.toggle_repl(None) pm.remove_repl.assert_called_once_with() def test_python_add_repl(): """ Check the REPL's kernal manager is configured correctly before being handed to the Jupyter widget in the view. """ mock_qthread = mock.MagicMock() mock_kernel_runner = mock.MagicMock() editor = mock.MagicMock() editor.envars = [['name', 'value'], ] view = mock.MagicMock() pm = PythonMode(editor, view) pm.set_buttons = mock.MagicMock() pm.stop_kernel = mock.MagicMock() with mock.patch('mu.modes.python3.QThread', mock_qthread), \ mock.patch('mu.modes.python3.KernelRunner', mock_kernel_runner): pm.add_repl() mock_qthread.assert_called_once_with() mock_kernel_runner.assert_called_once_with(cwd=pm.workspace_dir(), envars=editor.envars) assert pm.kernel_thread == mock_qthread() assert pm.kernel_runner == mock_kernel_runner() pm.set_buttons.assert_called_once_with(repl=False) pm.kernel_runner.moveToThread.assert_called_once_with(pm.kernel_thread) pm.kernel_runner.kernel_started.connect.\ assert_called_once_with(pm.on_kernel_start) pm.kernel_runner.kernel_finished.connect.\ assert_called_once_with(pm.kernel_thread.quit) pm.stop_kernel.connect.\ assert_called_once_with(pm.kernel_runner.stop_kernel) pm.kernel_thread.started.connect.\ assert_called_once_with(pm.kernel_runner.start_kernel) pm.kernel_thread.finished.connect.\ assert_called_once_with(pm.on_kernel_stop) pm.kernel_thread.start.assert_called_once_with() def test_python_remove_repl(): """ Make sure the REPL is removed properly. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.set_buttons = mock.MagicMock() pm.stop_kernel = mock.MagicMock() pm.remove_repl() pm.stop_kernel.emit.assert_called_once_with() pm.set_buttons.assert_called_once_with(repl=False) def test_python_remove_repl_reset_focus(): """ Make sure the REPL is removed properly. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.set_buttons = mock.MagicMock() pm.stop_kernel = mock.MagicMock() pm.remove_repl() pm.stop_kernel.emit.assert_called_once_with() pm.set_buttons.assert_called_once_with(repl=False) view.current_tab.setFocus.assert_called_once_with() def test_python_toggle_plotter(): """ Ensure toggling the plotter causes it to be added/removed. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.add_plotter = mock.MagicMock() pm.remove_plotter = mock.MagicMock() pm.toggle_plotter() pm.add_plotter.assert_called_once_with() pm.plotter = True pm.toggle_plotter() pm.remove_plotter.assert_called_once_with() def test_python_add_plotter(): """ Ensure the plotter is added as expected. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.set_buttons = mock.MagicMock() pm.add_plotter() view.add_python3_plotter.assert_called_once_with(pm) assert pm.plotter pm.set_buttons.assert_called_once_with(debug=False) # Check button states are updated depending on other aspects of the mode # being enabled. # REPL active. pm.set_buttons.reset_mock() pm.repl = True pm.add_plotter() assert pm.set_buttons.call_count == 2 assert pm.set_buttons.call_args_list[0][1]['debug'] is False assert pm.set_buttons.call_args_list[1][1]['run'] is False # Runner active. pm.set_buttons.reset_mock() pm.repl = False pm.runner = True pm.add_plotter() assert pm.set_buttons.call_count == 2 assert pm.set_buttons.call_args_list[0][1]['debug'] is False assert pm.set_buttons.call_args_list[1][1]['repl'] is False def test_python_remove_plotter(): """ Ensure the button states are returned to normal before calling super method. """ editor = mock.MagicMock() view = mock.MagicMock() with mock.patch('builtins.super') as mock_super: pm = PythonMode(editor, view) pm.set_buttons = mock.MagicMock() mock_super.reset_mock() pm.remove_plotter() pm.set_buttons.assert_called_once_with(run=True, repl=True, debug=True) mock_super().remove_plotter.assert_called_once_with() def test_python_remove_plotter_reset_focus(): """ Ensure the button states are returned to normal before calling super method. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.remove_plotter() view.current_tab.setFocus.assert_called_once_with() def test_python_on_data_flood(): """ Ensure that Python 3 mode cleans up correctly after a data flood of the plotter is detected: reset the buttons, stop either the REPL or runner and then call the base method. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.set_buttons = mock.MagicMock() pm.run_toggle = mock.MagicMock() pm.remove_repl = mock.MagicMock() pm.runner = True with mock.patch('builtins.super') as mock_super: pm.on_data_flood() pm.set_buttons.assert_called_once_with(run=True, repl=True, debug=True) pm.run_toggle.assert_called_once_with(None) mock_super().on_data_flood.assert_called_once_with() pm.set_buttons.reset_mock() pm.runner = False pm.kernel_runner = True with mock.patch('builtins.super') as mock_super: pm.on_data_flood() pm.set_buttons.assert_called_once_with(run=True, repl=True, debug=True) pm.remove_repl.assert_called_once_with() mock_super().on_data_flood.assert_called_once_with() def test_python_on_kernel_start(): """ Ensure the handler for when the kernel has started updates the UI such that the kernel manager and kernel client are used to add the Jupyter widget to the UI, the REPL button is re-enabled and a status update is shown. """ editor = mock.MagicMock() view = mock.MagicMock() pm = PythonMode(editor, view) pm.set_buttons = mock.MagicMock() mock_kernel_manager = mock.MagicMock() mock_client = mock.MagicMock() pm.on_kernel_start(mock_kernel_manager, mock_client) view.add_jupyter_repl.assert_called_once_with(mock_kernel_manager, mock_client) pm.set_buttons.assert_called_once_with(repl=True) editor.show_status_message.assert_called_once_with('REPL started.') # Check button states are set according to what other aspects of the mode # are currently enabled. # With Runner enabled. pm.set_buttons.reset_mock() pm.runner = True pm.on_kernel_start(mock_kernel_manager, mock_client) assert pm.set_buttons.call_count == 2 assert pm.set_buttons.call_args_list[0][1]['repl'] is True assert pm.set_buttons.call_args_list[1][1]['plotter'] is False # With Plotter enabled. pm.set_buttons.reset_mock() pm.runner = False pm.plotter = True pm.on_kernel_start(mock_kernel_manager, mock_client) assert pm.set_buttons.call_count == 2 assert pm.set_buttons.call_args_list[0][1]['repl'] is True assert pm.set_buttons.call_args_list[1][1]['run'] is False assert pm.set_buttons.call_args_list[1][1]['debug'] is False def test_python_on_kernel_stop(): """ Ensure everything REPL based is cleaned up when this handler is called. """ editor = mock.MagicMock() view = mock.MagicMock() view.button_bar.slots = { 'repl': mock.MagicMock(), } pm = PythonMode(editor, view) pm.on_kernel_stop() assert pm.repl_kernel_manager is None view.button_bar.slots['repl'].setEnabled.assert_called_once_with(True) editor.show_status_message.assert_called_once_with('REPL stopped.') assert pm.kernel_runner is None mu-editor-1.0.2+dfsg/tests/scripts/000077500000000000000000000000001341747546300172055ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/tests/scripts/.gitignore000066400000000000000000000000061341747546300211710ustar00rootroot00000000000000*.jsonmu-editor-1.0.2+dfsg/tests/scripts/contains_blue.py000066400000000000000000000000161341747546300224010ustar00rootroot00000000000000blue = 'blue' mu-editor-1.0.2+dfsg/tests/scripts/contains_brown.py000066400000000000000000000000201341747546300225740ustar00rootroot00000000000000brown = 'brown' mu-editor-1.0.2+dfsg/tests/scripts/contains_green.py000066400000000000000000000000201341747546300225450ustar00rootroot00000000000000green = 'green' mu-editor-1.0.2+dfsg/tests/scripts/contains_red.py000066400000000000000000000000141341747546300222220ustar00rootroot00000000000000red = 'red' mu-editor-1.0.2+dfsg/tests/session.json000066400000000000000000000001161341747546300200720ustar00rootroot00000000000000{"theme": "night", "paths": ["path/foo.py", "path/bar.py"], "mode": "python"} mu-editor-1.0.2+dfsg/tests/settings.json000066400000000000000000000002151341747546300202470ustar00rootroot00000000000000{"theme": "night", "paths": ["path/foo.py", "path/bar.py"], "workspace": "/home/foo/mycode", "mode": "python", "microbit_runtime_hex": null} mu-editor-1.0.2+dfsg/tests/settingscorrupt.json000077500000000000000000000000101341747546300216620ustar00rootroot00000000000000GARBAGE mu-editor-1.0.2+dfsg/tests/settingswithcustomhex.json000077500000000000000000000002121341747546300231030ustar00rootroot00000000000000{"theme": "night", "paths": ["path/foo.py", "path/bar.py"], "workspace": "/home/foo/mycode", "microbit_runtime_hex": "customhextest.hex"} mu-editor-1.0.2+dfsg/tests/settingswithmissingcustomhex.json000077500000000000000000000002221341747546300244760ustar00rootroot00000000000000{"theme": "night", "paths": ["path/foo.py", "path/bar.py"], "workspace": "/home/foo/mycode", "microbit_runtime_hex": "customhextest-missing.hex"} mu-editor-1.0.2+dfsg/tests/settingswithoutworkspace.json000066400000000000000000000000741341747546300236150ustar00rootroot00000000000000{"theme": "night", "paths": ["path/foo.py", "path/bar.py"]} mu-editor-1.0.2+dfsg/tests/test_app.py000066400000000000000000000126201341747546300177100ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the app script. """ import sys import os.path from unittest import mock from mu.app import excepthook, run, setup_logging, debug, setup_modes from mu.logic import LOG_FILE, LOG_DIR, DEBUGGER_PORT, ENCODING from mu.interface.themes import NIGHT_STYLE, DAY_STYLE, CONTRAST_STYLE def test_setup_logging(): """ Ensure that logging is set up in some way. """ with mock.patch('mu.app.TimedRotatingFileHandler') as log_conf, \ mock.patch('mu.app.os.path.exists', return_value=False),\ mock.patch('mu.app.logging') as logging, \ mock.patch('mu.app.os.makedirs', return_value=None) as mkdir: setup_logging() mkdir.assert_called_once_with(LOG_DIR) log_conf.assert_called_once_with(LOG_FILE, when='midnight', backupCount=5, delay=0, encoding=ENCODING) logging.getLogger.assert_called_once_with() assert sys.excepthook == excepthook def test_setup_modes_with_pgzero(): """ If pgzero is installed, allow Pygame Zero mode. """ with mock.patch('mu.app.pkgutil.iter_modules', return_value=['pgzero', ]): mock_editor = mock.MagicMock() mock_view = mock.MagicMock() modes = setup_modes(mock_editor, mock_view) assert 'pygamezero' in modes def test_setup_modes_without_pgzero(): """ If pgzero is NOT installed, do not add Pygame Zero mode to the list of available modes. """ with mock.patch('mu.app.pkgutil.iter_modules', return_value=['foo', ]): mock_editor = mock.MagicMock() mock_view = mock.MagicMock() modes = setup_modes(mock_editor, mock_view) assert 'pygamezero' not in modes def test_run(): """ Ensure the run function sets things up in the expected way. Why check this? We need to know if something fundamental has inadvertently changed and these tests highlight such a case. Testing the call_count and mock_calls allows us to measure the expected number of instantiations and method calls. """ class DumSig: def __init__(self): @self.connect def default(*args): raise Exception('No signal handler connected') def connect(self, func): self.func = func return func def emit(self, *args): self.func(*args) class Win(mock.MagicMock): load_theme = DumSig() window = Win() with mock.patch('mu.app.setup_logging') as set_log, \ mock.patch('mu.app.QApplication') as qa, \ mock.patch('mu.app.QSplashScreen') as qsp, \ mock.patch('mu.app.Editor') as ed, \ mock.patch('mu.app.load_pixmap'), \ mock.patch('mu.app.Window', window) as win, \ mock.patch('mu.app.QTimer') as timer, \ mock.patch('sys.argv', ['mu']), \ mock.patch('sys.exit') as ex: run() assert set_log.call_count == 1 # foo.call_count is instantiating the class assert qa.call_count == 1 # foo.mock_calls are method calls on the object assert len(qa.mock_calls) == 8 assert qsp.call_count == 1 assert len(qsp.mock_calls) == 2 assert timer.call_count == 1 assert len(timer.mock_calls) == 4 assert ed.call_count == 1 assert len(ed.mock_calls) == 3 assert win.call_count == 1 assert len(win.mock_calls) == 11 assert ex.call_count == 1 window.load_theme.emit('day') qa.assert_has_calls([mock.call().setStyleSheet(DAY_STYLE)]) window.load_theme.emit('night') qa.assert_has_calls([mock.call().setStyleSheet(NIGHT_STYLE)]) window.load_theme.emit('contrast') qa.assert_has_calls([mock.call().setStyleSheet(CONTRAST_STYLE)]) def test_excepthook(): """ Test that custom excepthook logs error and calls sys.exit. """ ex = Exception('BANG') exc_args = (type(ex), ex, ex.__traceback__) with mock.patch('mu.app.logging.error') as error, \ mock.patch('mu.app.sys.exit') as exit: excepthook(*exc_args) error.assert_called_once_with('Unrecoverable error', exc_info=exc_args) exit.assert_called_once_with(1) def test_debug(): """ Ensure the debugger is run with the expected arguments given the filename and other arguments passed in via sys.argv. """ mock_sys = mock.MagicMock() mock_sys.argv = [None, 'foo.py', 'foo', 'bar', 'baz'] mock_runner = mock.MagicMock() with mock.patch('mu.app.sys', mock_sys), \ mock.patch('mu.app.run_debugger', mock_runner): debug() expected_filename = os.path.normcase(os.path.abspath('foo.py')) mock_runner.assert_called_once_with('localhost', DEBUGGER_PORT, expected_filename, ['foo', 'bar', 'baz', ]) def test_debug_no_args(): """ If the debugger is accidentally started with no filename and/or associated args, then emit a friendly message to indicate the problem. """ mock_sys = mock.MagicMock() mock_sys.argv = [None, ] mock_print = mock.MagicMock() with mock.patch('mu.app.sys', mock_sys), \ mock.patch('builtins.print', mock_print): debug() msg = "Debugger requires a Python script filename to run." mock_print.assert_called_once_with(msg) mu-editor-1.0.2+dfsg/tests/test_localedetect.py000066400000000000000000000044111341747546300215570ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the localedetect module. """ from unittest import mock import pytest from mu import localedetect _DEFAULT_LANG_CODE = localedetect._DEFAULT_LANG_CODE _TEST_MATRIX_PLATFORM_DEFAULT = [ # | locale.getdefaultlocale | # | lang_code | char | exception | expected result | ('es_ES', 'UTF-8', None, 'es_ES'), ('fr_FR', 'ISO-8859-1', None, 'fr_FR'), ('', '', None, _DEFAULT_LANG_CODE), (None, None, Exception('ups'), _DEFAULT_LANG_CODE), ] @pytest.mark.parametrize('lang_code, encoding, exc, expected', _TEST_MATRIX_PLATFORM_DEFAULT) def test_language_code_default_platform(lang_code, encoding, exc, expected): """ langdetect.language_code() returns the expected values for multiple combinations of locale.getdefaultlocale() behaviour under non macOS platforms. """ mock_getdefaultlocale = mock.Mock(return_value=(lang_code, encoding), side_effect=exc) with mock.patch('locale.getdefaultlocale', mock_getdefaultlocale),\ mock.patch('sys.platform', 'default'): result = localedetect.language_code() assert mock_getdefaultlocale.call_count == 1 assert result == expected _TEST_MATRIX_PLATFORM_MAC = [ # | subprocess.getstatusoutput | # | status | output | exception | expected result | (0, 'es_ES', None, 'es_ES'), (0, '', None, _DEFAULT_LANG_CODE), (127, '-bash: defaults: command not found', None, _DEFAULT_LANG_CODE), (None, None, Exception('ups'), _DEFAULT_LANG_CODE), ] @pytest.mark.parametrize('status, output, exc, expected', _TEST_MATRIX_PLATFORM_MAC) def test_language_code_mac_platform(status, output, exc, expected): """ langdetect.language_code() returns the expected values for multiple combinations of subprocess.getstatusoutput() behaviour on the macOS platform. """ mock_getstatusoutput = mock.Mock(return_value=(status, output), side_effect=exc) with mock.patch('subprocess.getstatusoutput', mock_getstatusoutput),\ mock.patch('sys.platform', 'darwin'): result = localedetect.language_code() assert mock_getstatusoutput.call_count == 1 assert result == expected mu-editor-1.0.2+dfsg/tests/test_logic.py000066400000000000000000003173261341747546300202400ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the Editor and REPL logic. """ import sys import os import codecs import contextlib import json import locale import re import shutil import subprocess import tempfile from unittest import mock import uuid import pytest import mu.logic from PyQt5.QtWidgets import QMessageBox from PyQt5.QtCore import pyqtSignal, QObject from mu import __version__ SESSION = json.dumps({ 'theme': 'night', 'mode': 'python', 'paths': [ 'path/foo.py', 'path/bar.py', ], 'envars': [ ['name', 'value'], ], }) ENCODING_COOKIE = '# -*- coding: {} -*-{}'.format(mu.logic.ENCODING, mu.logic.NEWLINE) # # Testing support functions # These functions generate testing scenarios or mocks making # the test more readable and easier to spot the element being # tested from among the boilerplate setup code # def _generate_python_files(contents, dirpath): """Generate a series of .py files, one for each element in an iterable contents should be an iterable (typically a list) containing one string for each of a the number of files to be created. The files will be created in the dirpath directory passed in which will neither be created nor destroyed by this function. """ for i, c in enumerate(contents): name = uuid.uuid1().hex filepath = os.path.join(dirpath, "%03d-%s.py" % (1 + i, name)) # # Write using newline="" so line-ending tests can work! # If a binary write is needed (eg for an encoding test) pass # a list of empty strings as contents and then write the bytes # as part of the test. # with open(filepath, "w", encoding=mu.logic.ENCODING, newline="") as f: f.write(c) yield filepath @contextlib.contextmanager def generate_python_files(contents, dirpath=None): """Create a temp directory and populate it with .py files, then remove it """ dirpath = dirpath or tempfile.mkdtemp(prefix="mu-") yield list(_generate_python_files(contents, dirpath)) shutil.rmtree(dirpath) @contextlib.contextmanager def generate_python_file(text="", dirpath=None): """Create a temp directory and populate it with on .py file, then remove it """ dirpath = dirpath or tempfile.mkdtemp(prefix="mu-") for filepath in _generate_python_files([text], dirpath): yield filepath break shutil.rmtree(dirpath) @contextlib.contextmanager def generate_session(theme="day", mode="python", file_contents=None, filepath=None, envars=[['name', 'value'], ], minify=False, microbit_runtime=None, zoom_level=2, **kwargs): """Generate a temporary session file for one test By default, the session file will be created inside a temporary directory which will be removed afterwards. If filepath is specified the session file will be created with that fully-specified path and filename. If an iterable of file contents is specified (referring to text files to be reloaded from a previous session) then files will be created in the a directory with the contents provided. If None is passed to any of the parameters that item will not be included in the session data. Once all parameters have been considered if no session data is present, the file will *not* be created. Any additional kwargs are created as items in the data (eg to generate invalid file contents) The mu.logic.get_session_path function is mocked to return the temporary filepath from this session. The session is yielded to the contextmanager so the typical usage is: with generate_session(mode="night") as session: # do some test assert .mode == session['mode'] """ dirpath = tempfile.mkdtemp(prefix="mu-") session_data = {} if theme: session_data['theme'] = theme if mode: session_data['mode'] = mode if file_contents: paths = _generate_python_files(file_contents, dirpath) session_data['paths'] = list(paths) if envars: session_data['envars'] = envars if minify is not None: session_data['minify'] = minify if microbit_runtime: session_data['microbit_runtime'] = microbit_runtime if zoom_level: session_data['zoom_level'] = zoom_level session_data.update(**kwargs) if filepath is None: filepath = os.path.join(dirpath, "session.json") if session_data: with open(filepath, "w") as f: f.write(json.dumps(session_data)) session = dict(session_data) session['session_filepath'] = filepath with mock.patch("mu.logic.get_session_path", return_value=filepath): yield session shutil.rmtree(dirpath) def mocked_view(text, path, newline): """Create a mocked view with path, newline and text """ view = mock.MagicMock() view.current_tab = mock.MagicMock() view.current_tab.path = path view.current_tab.newline = newline view.current_tab.text = mock.MagicMock(return_value=text) view.add_tab = mock.MagicMock() view.get_save_path = mock.MagicMock(return_value=path) view.get_load_path = mock.MagicMock() view.add_tab = mock.MagicMock() return view def mocked_editor(mode="python", text=None, path=None, newline=None): """Return a mocked editor with a mocked view This is intended to assist the several tests where a mocked editor is needed but where the length of setup code to get there tends to obscure the intent of the test """ view = mocked_view(text, path, newline) ed = mu.logic.Editor(view) ed.select_mode = mock.MagicMock() mock_mode = mock.MagicMock() mock_mode.save_timeout = 5 mock_mode.workspace_dir.return_value = '/fake/path' mock_mode.api.return_value = ["API Specification"] ed.modes = { mode: mock_mode, } return ed def test_CONSTANTS(): """ Ensure the expected constants exist. """ assert mu.logic.HOME_DIRECTORY assert mu.logic.DATA_DIR assert mu.logic.WORKSPACE_NAME def test_write_and_flush(): """ Ensure the write and flush function tries to write to the filesystem and flush so the write happens immediately. """ mock_fd = mock.MagicMock() mock_content = mock.MagicMock() with mock.patch('mu.logic.os.fsync') as fsync: mu.logic.write_and_flush(mock_fd, mock_content) fsync.assert_called_once_with(mock_fd) mock_fd.write.assert_called_once_with(mock_content) mock_fd.flush.assert_called_once_with() def test_save_and_encode(): """ When saving, ensure that encoding cookies are honoured, otherwise fall back to the default encoding (UTF-8 -- as per Python standard practice). """ encoding_cookie = '# -*- coding: latin-1 -*-' text = encoding_cookie + '\n\nprint("Hello")' mock_open = mock.MagicMock() mock_wandf = mock.MagicMock() # Valid cookie with mock.patch('mu.logic.open', mock_open), \ mock.patch('mu.logic.write_and_flush', mock_wandf): mu.logic.save_and_encode(text, 'foo.py') mock_open.assert_called_once_with('foo.py', 'w', encoding='latin-1', newline='') assert mock_wandf.call_count == 1 mock_open.reset_mock() mock_wandf.reset_mock() # Invalid cookie encoding_cookie = '# -*- coding: utf-42 -*-' text = encoding_cookie + '\n\nprint("Hello")' with mock.patch('mu.logic.open', mock_open), \ mock.patch('mu.logic.write_and_flush', mock_wandf): mu.logic.save_and_encode(text, 'foo.py') mock_open.assert_called_once_with('foo.py', 'w', encoding=mu.logic.ENCODING, newline='') assert mock_wandf.call_count == 1 mock_open.reset_mock() mock_wandf.reset_mock() # No cookie text = 'print("Hello")' with mock.patch('mu.logic.open', mock_open), \ mock.patch('mu.logic.write_and_flush', mock_wandf): mu.logic.save_and_encode(text, 'foo.py') mock_open.assert_called_once_with('foo.py', 'w', encoding=mu.logic.ENCODING, newline='') assert mock_wandf.call_count == 1 def test_sniff_encoding_from_BOM(): """ Ensure an expected BOM detected at the start of the referenced file is used to set the expected encoding. """ with mock.patch('mu.logic.open', mock.mock_open(read_data=codecs.BOM_UTF8 + b'# hello')): assert mu.logic.sniff_encoding('foo.py') == 'utf-8-sig' def test_sniff_encoding_from_cookie(): """ If there's a cookie present, then use that to work out the expected encoding. """ encoding_cookie = b'# -*- coding: latin-1 -*-' mock_locale = mock.MagicMock() mock_locale.getpreferredencoding.return_value = 'UTF-8' with mock.patch('mu.logic.open', mock.mock_open(read_data=encoding_cookie)), \ mock.patch('mu.logic.locale', mock_locale): assert mu.logic.sniff_encoding('foo.py') == 'latin-1' def test_sniff_encoding_from_bad_cookie(): """ If there's a cookie present but we can't even read it, then return None. """ encoding_cookie = '# -*- coding: silly-你好 -*-'.encode('utf-8') mock_locale = mock.MagicMock() mock_locale.getpreferredencoding.return_value = 'ascii' with mock.patch('mu.logic.open', mock.mock_open(read_data=encoding_cookie)), \ mock.patch('mu.logic.locale', mock_locale): assert mu.logic.sniff_encoding('foo.py') is None def test_sniff_encoding_fallback_to_locale(): """ If there's no encoding information in the file, just return None. """ mock_locale = mock.MagicMock() mock_locale.getpreferredencoding.return_value = 'ascii' with mock.patch('mu.logic.open', mock.mock_open(read_data=b'# hello')), \ mock.patch('mu.logic.locale', mock_locale): assert mu.logic.sniff_encoding('foo.py') is None def test_sniff_newline_convention(): """ Ensure sniff_newline_convention returns the expected newline convention. """ text = 'the\r\ncat\nsat\non\nthe\r\nmat' assert mu.logic.sniff_newline_convention(text) == '\n' def test_sniff_newline_convention_local(): """ Ensure sniff_newline_convention returns the local newline convention if it cannot determine it from the text. """ text = 'There are no new lines here' assert mu.logic.sniff_newline_convention(text) == os.linesep def test_get_admin_file_path(): """ Finds an admin file in the application location, when Mu is run as if NOT frozen by PyInstaller. """ fake_app_path = os.path.dirname(__file__) fake_app_script = os.path.join(fake_app_path, 'run.py') wrong_fake_path = 'wrong/path/to/executable' fake_local_settings = os.path.join(fake_app_path, 'settings.json') with mock.patch.object(sys, 'executable', wrong_fake_path), \ mock.patch.object(sys, 'argv', [fake_app_script]): result = mu.logic.get_admin_file_path('settings.json') assert result == fake_local_settings def test_get_admin_file_path_frozen(): """ Find an admin file in the application location when it has been frozen using PyInstaller. """ fake_app_path = os.path.dirname(__file__) fake_app_script = os.path.join(fake_app_path, 'mu.exe') wrong_fake_path = 'wrong/path/to/executable' fake_local_settings = os.path.join(fake_app_path, 'settings.json') with mock.patch.object(sys, 'frozen', create=True, return_value=True), \ mock.patch('platform.system', return_value='not_Darwin'), \ mock.patch.object(sys, 'executable', fake_app_script), \ mock.patch.object(sys, 'argv', [wrong_fake_path]): result = mu.logic.get_admin_file_path('settings.json') assert result == fake_local_settings def test_get_admin_file_path_frozen_osx(): """ Find an admin file in the application location when it has been frozen using PyInstaller on macOS (as the path is different in the app bundle). """ fake_app_path = os.path.join(os.path.dirname(__file__), 'a', 'b', 'c') fake_app_script = os.path.join(fake_app_path, 'mu.exe') wrong_fake_path = 'wrong/path/to/executable' fake_local_settings = os.path.abspath(os.path.join( fake_app_path, '..', '..', '..', 'settings.json')) with mock.patch.object(sys, 'frozen', create=True, return_value=True), \ mock.patch('platform.system', return_value='Darwin'), \ mock.patch.object(sys, 'executable', fake_app_script), \ mock.patch.object(sys, 'argv', [wrong_fake_path]): result = mu.logic.get_admin_file_path('settings.json') assert result == fake_local_settings def test_get_admin_file_path_with_data_path(): """ Find an admin file in the data location. """ mock_open = mock.mock_open() mock_exists = mock.MagicMock() mock_exists.side_effect = [False, True] mock_json_dump = mock.MagicMock() with mock.patch('os.path.exists', mock_exists), \ mock.patch('builtins.open', mock_open), \ mock.patch('json.dump', mock_json_dump), \ mock.patch('mu.logic.DATA_DIR', 'fake_path'): result = mu.logic.get_admin_file_path('settings.json') assert result == os.path.join('fake_path', 'settings.json') assert not mock_json_dump.called def test_get_admin_file_path_no_files(): """ No admin file found, so create one. """ mock_open = mock.mock_open() mock_json_dump = mock.MagicMock() with mock.patch('os.path.exists', return_value=False), \ mock.patch('builtins.open', mock_open), \ mock.patch('json.dump', mock_json_dump), \ mock.patch('mu.logic.DATA_DIR', 'fake_path'): result = mu.logic.get_admin_file_path('settings.json') assert result == os.path.join('fake_path', 'settings.json') assert mock_json_dump.call_count == 1 def test_get_admin_file_path_no_files_cannot_create(): """ No admin file found, attempting to create one causes Mu to log and make do. """ mock_open = mock.MagicMock() mock_open.return_value.__enter__.side_effect = FileNotFoundError('Bang') mock_open.return_value.__exit__ = mock.Mock() mock_json_dump = mock.MagicMock() with mock.patch('os.path.exists', return_value=False), \ mock.patch('builtins.open', mock_open), \ mock.patch('json.dump', mock_json_dump), \ mock.patch('mu.logic.DATA_DIR', 'fake_path'), \ mock.patch('mu.logic.logger', return_value=None) as logger: mu.logic.get_admin_file_path('settings.json') msg = 'Unable to create admin file: ' \ 'fake_path{}settings.json'.format(os.path.sep) logger.error.assert_called_once_with(msg) def test_get_session_path(): """ Ensure the result of calling get_admin_file_path with session.json returns the expected result. """ mock_func = mock.MagicMock(return_value='foo') with mock.patch('mu.logic.get_admin_file_path', mock_func): assert mu.logic.get_session_path() == 'foo' mock_func.assert_called_once_with('session.json') def test_get_settings_path(): """ Ensure the result of calling get_admin_file_path with settings.json returns the expected result. """ mock_func = mock.MagicMock(return_value='foo') with mock.patch('mu.logic.get_admin_file_path', mock_func): assert mu.logic.get_settings_path() == 'foo' mock_func.assert_called_once_with('settings.json') def test_extract_envars(): """ Given a correct textual representation, get the expected list representation of user defined environment variables. """ raw = "FOO=BAR\n BAZ = Q=X \n\n\n" expected = mu.logic.extract_envars(raw) assert expected == [ ['FOO', 'BAR'], ['BAZ', 'Q=X'], ] def test_check_flake(): """ Ensure the check_flake method calls PyFlakes with the expected code reporter. """ mock_r = mock.MagicMock() mock_r.log = [{'line_no': 2, 'column': 0, 'message': 'b'}] with mock.patch('mu.logic.MuFlakeCodeReporter', return_value=mock_r), \ mock.patch('mu.logic.check', return_value=None) as mock_check: result = mu.logic.check_flake('foo.py', 'some code') assert result == {2: mock_r.log} mock_check.assert_called_once_with('some code', 'foo.py', mock_r) def test_check_flake_needing_expansion(): """ Ensure the check_flake method calls PyFlakes with the expected code reporter. """ mock_r = mock.MagicMock() msg = "'microbit.foo' imported but unused" mock_r.log = [{'line_no': 2, 'column': 0, 'message': msg}] with mock.patch('mu.logic.MuFlakeCodeReporter', return_value=mock_r), \ mock.patch('mu.logic.check', return_value=None) as mock_check: code = 'from microbit import *' result = mu.logic.check_flake('foo.py', code) assert result == {} mock_check.assert_called_once_with(mu.logic.EXPANDED_IMPORT, 'foo.py', mock_r) def test_check_flake_with_builtins(): """ If a list of assumed builtin symbols is passed, any "undefined name" messages for them are ignored. """ mock_r = mock.MagicMock() mock_r.log = [{'line_no': 2, 'column': 0, 'message': "undefined name 'foo'"}] with mock.patch('mu.logic.MuFlakeCodeReporter', return_value=mock_r), \ mock.patch('mu.logic.check', return_value=None) as mock_check: result = mu.logic.check_flake('foo.py', 'some code', builtins=['foo', ]) assert result == {} mock_check.assert_called_once_with('some code', 'foo.py', mock_r) def test_check_pycodestyle(): """ Ensure the expected result if generated from the PEP8 style validator. """ code = "import foo\n\n\n\n\n\ndef bar():\n pass\n" # Generate E303 result = mu.logic.check_pycodestyle(code) assert len(result) == 1 assert result[6][0]['line_no'] == 6 assert result[6][0]['column'] == 0 assert ' above this line' in result[6][0]['message'] assert result[6][0]['code'] == 'E303' def test_check_pycodestyle_with_non_ascii(): """ Ensure pycodestyle can at least see a file with non-ASCII characters """ code = "x='\u2005'\n" try: mu.logic.check_pycodestyle(code) except Exception as exc: assert False, "Exception was raised: %s" % exc # # Doesn't actually matter what pycodestyle returns; we just want to make # sure it didn't error out # def test_MuFlakeCodeReporter_init(): """ Check state is set up as expected. """ r = mu.logic.MuFlakeCodeReporter() assert r.log == [] def test_MuFlakeCodeReporter_unexpected_error(): """ Check the reporter handles unexpected errors. """ r = mu.logic.MuFlakeCodeReporter() r.unexpectedError('foo.py', 'Nobody expects the Spanish Inquisition!') assert len(r.log) == 1 assert r.log[0]['line_no'] == 0 assert r.log[0]['filename'] == 'foo.py' assert r.log[0]['message'] == 'Nobody expects the Spanish Inquisition!' def test_MuFlakeCodeReporter_syntax_error(): """ Check the reporter handles syntax errors in a humane and kid friendly manner. """ msg = ('Syntax error. Python cannot understand this line. Check for ' 'missing characters!') r = mu.logic.MuFlakeCodeReporter() r.syntaxError('foo.py', 'something incomprehensible to kids', '2', 3, 'source') assert len(r.log) == 1 assert r.log[0]['line_no'] == 1 assert r.log[0]['message'] == msg assert r.log[0]['column'] == 2 assert r.log[0]['source'] == 'source' def test_MuFlakeCodeReporter_flake_matched(): """ Check the reporter handles flake (regular) errors that match the expected message structure. """ r = mu.logic.MuFlakeCodeReporter() err = "foo.py:4: something went wrong" r.flake(err) assert len(r.log) == 1 assert r.log[0]['line_no'] == 3 assert r.log[0]['column'] == 0 assert r.log[0]['message'] == 'something went wrong' def test_MuFlakeCodeReporter_flake_un_matched(): """ Check the reporter handles flake errors that do not conform to the expected message structure. """ r = mu.logic.MuFlakeCodeReporter() err = "something went wrong" r.flake(err) assert len(r.log) == 1 assert r.log[0]['line_no'] == 0 assert r.log[0]['column'] == 0 assert r.log[0]['message'] == 'something went wrong' def test_REPL_posix(): """ The port is set correctly in a posix environment. """ with mock.patch('os.name', 'posix'): r = mu.logic.REPL('ttyACM0') assert r.port == '/dev/ttyACM0' def test_REPL_nt(): """ The port is set correctly in an nt (Windows) environment. """ with mock.patch('os.name', 'nt'): r = mu.logic.REPL('COM0') assert r.port == 'COM0' def test_REPL_unsupported(): """ A NotImplementedError is raised on an unsupported OS. """ with mock.patch('os.name', 'SPARC'): with pytest.raises(NotImplementedError): mu.logic.REPL('tty0') def test_editor_init(): """ Ensure a new instance is set-up correctly and creates the required folders upon first start. """ view = mock.MagicMock() # Check the editor attempts to create required directories if they don't # already exist. with mock.patch('os.path.exists', return_value=False), \ mock.patch('os.makedirs', return_value=None) as mkd: e = mu.logic.Editor(view) assert e._view == view assert e.theme == 'day' assert e.mode == 'python' assert e.modes == {} assert e.envars == [] assert e.minify is False assert e.microbit_runtime == '' assert e.connected_devices == set() assert e.find == '' assert e.replace == '' assert e.global_replace is False assert e.selecting_mode is False assert mkd.call_count == 1 assert mkd.call_args_list[0][0][0] == mu.logic.DATA_DIR def test_editor_setup(): """ An editor should have a modes attribute. """ view = mock.MagicMock() e = mu.logic.Editor(view) mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = 'foo' mock_modes = { 'python': mock_mode, } with mock.patch('os.path.exists', return_value=False), \ mock.patch('os.makedirs', return_value=None) as mkd, \ mock.patch('shutil.copy') as mock_shutil: e.setup(mock_modes) assert mkd.call_count == 5 assert mkd.call_args_list[0][0][0] == 'foo' assert mock_shutil.call_count == 3 assert e.modes == mock_modes view.set_usb_checker.assert_called_once_with(1, e.check_usb) def test_editor_restore_session_existing_runtime(): """ A correctly specified session is restored properly. """ mode, theme = "python", "night" file_contents = ["", ""] ed = mocked_editor(mode) with mock.patch('os.path.isfile', return_value=True): with generate_session(theme, mode, file_contents, microbit_runtime='/foo', zoom_level=5): ed.restore_session() assert ed.theme == theme assert ed._view.add_tab.call_count == len(file_contents) ed._view.set_theme.assert_called_once_with(theme) assert ed.envars == [['name', 'value'], ] assert ed.minify is False assert ed.microbit_runtime == '/foo' assert ed._view.zoom_position == 5 def test_editor_restore_session_missing_runtime(): """ If the referenced microbit_runtime file doesn't exist, reset to '' so Mu uses the built-in runtime. """ mode, theme = "python", "night" file_contents = ["", ""] ed = mocked_editor(mode) with generate_session(theme, mode, file_contents, microbit_runtime='/foo'): ed.restore_session() assert ed.theme == theme assert ed._view.add_tab.call_count == len(file_contents) ed._view.set_theme.assert_called_once_with(theme) assert ed.envars == [['name', 'value'], ] assert ed.minify is False assert ed.microbit_runtime == '' # File does not exist so set to '' def test_editor_restore_session_missing_files(): """ Missing files that were opened tabs in the previous session are safely ignored when attempting to restore them. """ fake_session = os.path.join(os.path.dirname(__file__), 'session.json') view = mock.MagicMock() ed = mu.logic.Editor(view) ed._view.add_tab = mock.MagicMock() mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = '/fake/path' mock_mode.save_timeout = 5 ed.modes = { 'python': mock_mode, } mock_gettext = mock.MagicMock() mock_gettext.return_value = '# Write your code here :-)' get_test_session_path = mock.MagicMock() get_test_session_path.return_value = fake_session with mock.patch('os.path.exists', return_value=True), \ mock.patch('mu.logic.get_session_path', get_test_session_path): ed.restore_session() assert ed._view.add_tab.call_count == 0 def test_editor_restore_session_invalid_mode(): """ As Mu's modes are added and/or renamed, invalid mode names may need to be ignored (this happens regularly when changing versions when developing Mu itself). """ valid_mode, invalid_mode = "python", uuid.uuid1().hex ed = mocked_editor(valid_mode) with generate_session(mode=invalid_mode): ed.restore_session() ed.select_mode.assert_called_once_with(None) def test_editor_restore_session_no_session_file(): """ If there's no prior session file (such as upon first start) then simply start up the editor with an empty untitled tab. """ view = mock.MagicMock() view.tab_count = 0 ed = mu.logic.Editor(view) ed._view.add_tab = mock.MagicMock() ed.select_mode = mock.MagicMock() mock_mode = mock.MagicMock() api = ['API specification', ] mock_mode.api.return_value = api mock_mode.workspace_dir.return_value = '/fake/path' mock_mode.save_timeout = 5 ed.modes = { 'python': mock_mode, } mock_gettext = mock.MagicMock() mock_gettext.return_value = '# Write your code here :-)' with mock.patch('os.path.exists', return_value=False): ed.restore_session() py = '# Write your code here :-)'.format( os.linesep, os.linesep) + mu.logic.NEWLINE ed._view.add_tab.assert_called_once_with(None, py, api, mu.logic.NEWLINE) ed.select_mode.assert_called_once_with(None) def test_editor_restore_session_invalid_file(): """ A malformed JSON file is correctly detected and app behaves the same as if there was no session file. """ view = mock.MagicMock() view.tab_count = 0 ed = mu.logic.Editor(view) ed._view.add_tab = mock.MagicMock() mock_mode = mock.MagicMock() api = ['API specification', ] mock_mode.api.return_value = api mock_mode.workspace_dir.return_value = '/fake/path' mock_mode.save_timeout = 5 ed.modes = { 'python': mock_mode, } mock_open = mock.mock_open( read_data='{"paths": ["path/foo.py", "path/bar.py"]}, invalid: 0}') mock_gettext = mock.MagicMock() mock_gettext.return_value = '# Write your code here :-)' with mock.patch('builtins.open', mock_open), \ mock.patch('os.path.exists', return_value=True): ed.restore_session() py = '# Write your code here :-)' + mu.logic.NEWLINE ed._view.add_tab.assert_called_once_with(None, py, api, mu.logic.NEWLINE) def test_editor_open_focus_passed_file(): """ A file passed in by the OS is opened """ view = mock.MagicMock() view.tab_count = 0 ed = mu.logic.Editor(view) mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = '/fake/path' mock_mode.save_timeout = 5 ed.modes = { 'python': mock_mode, } ed._load = mock.MagicMock() file_path = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'scripts', 'contains_red.py' ) ed.select_mode = mock.MagicMock() with mock.patch("builtins.open", mock.mock_open(read_data="data")): ed.restore_session([file_path]) ed._load.assert_called_once_with(file_path) def test_editor_session_and_open_focus_passed_file(): """ A passed in file is merged with session, opened last so it receives focus It will be the middle position in the session """ view = mock.MagicMock() ed = mu.logic.Editor(view) ed.modes = mock.MagicMock() ed.direct_load = mock.MagicMock() mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = '/fake/path' mock_mode.save_timeout = 5 ed.modes = { 'python': mock_mode, } ed.select_mode = mock.MagicMock() settings = json.dumps({ "paths": ["path/foo.py", "path/bar.py"]}, ) mock_open = mock.mock_open(read_data=settings) with mock.patch('builtins.open', mock_open), \ mock.patch('os.path.exists', return_value=True): ed.restore_session(paths=['path/foo.py']) # direct_load should be called twice (once for each path) assert ed.direct_load.call_count == 2 # However, "foo.py" as the passed_filename should be direct_load-ed # at the end so it has focus, despite being the first file listed in # the restored session. assert ed.direct_load.call_args_list[0][0][0] == os.path.abspath( 'path/bar.py') assert ed.direct_load.call_args_list[1][0][0] == os.path.abspath( 'path/foo.py') def test_toggle_theme_to_night(): """ The current theme is 'day' so toggle to night. Expect the state to be updated and the appropriate call to the UI layer is made. """ view = mock.MagicMock() view.set_theme = mock.MagicMock() ed = mu.logic.Editor(view) ed.theme = 'day' ed.toggle_theme() assert ed.theme == 'night' view.set_theme.assert_called_once_with(ed.theme) def test_toggle_theme_to_day(): """ The current theme is 'contrast' so toggle to day. Expect the state to be updated and the appropriate call to the UI layer is made. """ view = mock.MagicMock() view.set_theme = mock.MagicMock() ed = mu.logic.Editor(view) ed.theme = 'contrast' ed.toggle_theme() assert ed.theme == 'day' view.set_theme.assert_called_once_with(ed.theme) def test_toggle_theme_to_contrast(): """ The current theme is 'night' so toggle to contrast. Expect the state to be updated and the appropriate call to the UI layer is made. """ view = mock.MagicMock() view.set_theme = mock.MagicMock() ed = mu.logic.Editor(view) ed.theme = 'night' ed.toggle_theme() assert ed.theme == 'contrast' view.set_theme.assert_called_once_with(ed.theme) def test_new(): """ Ensure an untitled tab is added to the UI. """ view = mock.MagicMock() view.add_tab = mock.MagicMock() mock_mode = mock.MagicMock() api = ['API specification', ] mock_mode.api.return_value = api ed = mu.logic.Editor(view) ed.modes = { 'python': mock_mode, } ed.new() view.add_tab.assert_called_once_with(None, '', api, mu.logic.NEWLINE) def test_load_checks_file_exists(): """ If the passed in path does not exist, this is logged and no other side effect happens. """ view = mock.MagicMock() ed = mu.logic.Editor(view) with mock.patch('os.path.isfile', return_value=False), \ mock.patch('mu.logic.logger.info') as mock_info: ed._load('not_a_file') msg1 = 'Loading script from: not_a_file' msg2 = 'The file not_a_file does not exist.' assert mock_info.call_args_list[0][0][0] == msg1 assert mock_info.call_args_list[1][0][0] == msg2 def test_load_python_file(): """ If the user specifies a Python file (*.py) then ensure it's loaded and added as a tab. """ text, newline = "python", "\n" ed = mocked_editor() with generate_python_file(text) as filepath: ed._view.get_load_path.return_value = filepath with mock.patch("mu.logic.read_and_decode") as mock_read: mock_read.return_value = text, newline ed.load() mock_read.assert_called_once_with(filepath) ed._view.add_tab.assert_called_once_with( filepath, text, ed.modes[ed.mode].api(), newline) def test_load_python_file_case_insensitive_file_type(): """ If the user specifies a Python file (*.PY) then ensure it's loaded and added as a tab. """ text, newline = "python", "\n" ed = mocked_editor() with generate_python_file(text) as filepath: ed._view.get_load_path.return_value = filepath.upper() with mock.patch("mu.logic.read_and_decode") as mock_read, \ mock.patch('os.path.isfile', return_value=True): mock_read.return_value = text, newline ed.load() mock_read.assert_called_once_with(filepath.upper()) ed._view.add_tab.assert_called_once_with( filepath.upper(), text, ed.modes[ed.mode].api(), newline) def test_load_python_unicode_error(): """ If Mu encounters a UnicodeDecodeError when trying to read and decode the file, it should display a helpful message explaining the problem. """ text = "not utf encoded content" ed = mocked_editor() with generate_python_file(text) as filepath: ed._view.get_load_path.return_value = filepath with mock.patch("mu.logic.read_and_decode") as mock_read: mock_read.side_effect = UnicodeDecodeError('funnycodec', b'\x00\x00', 1, 2, 'A fake reason!') ed.load() assert ed._view.show_message.call_count == 1 def test_no_duplicate_load_python_file(): """ If the user specifies a file already loaded, ensure this is detected. """ brown_script = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'scripts', 'contains_brown.py' ) editor_window = mock.MagicMock() editor_window.show_message = mock.MagicMock() editor_window.focus_tab = mock.MagicMock() editor_window.add_tab = mock.MagicMock() brown_tab = mock.MagicMock() brown_tab.path = brown_script unsaved_tab = mock.MagicMock() unsaved_tab.path = None editor_window.widgets = [unsaved_tab, brown_tab] editor_window.get_load_path = mock.MagicMock(return_value=brown_script) editor_window.current_tab.path = 'path' # Create the "editor" that'll control the "window". editor = mu.logic.Editor(view=editor_window) mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = '/fake/path' editor.modes = { 'python': mock_mode, } editor.load() message = 'The file "{}" is already open.'.format(os.path.basename( brown_script)) editor_window.show_message.assert_called_once_with(message) editor_window.add_tab.assert_not_called() def test_load_other_file(): """ If the user specifies a file supported by a Mu mode (like a .hex file) then ensure it's loaded and added as a tab. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value='foo.hex') view.add_tab = mock.MagicMock() view.show_confirmation = mock.MagicMock() view.current_tab.path = 'path' ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() api = ['API specification', ] file_content = 'PYTHON CODE' mock_py = mock.MagicMock() mock_py.open_file.return_value = None mock_mb = mock.MagicMock() mock_mb.api.return_value = api mock_mb.workspace_dir.return_value = '/fake/path' mock_mb.open_file.return_value = file_content mock_mb.file_extensions = ['hex'] ed.modes = { 'python': mock_py, 'microbit': mock_mb, } ed.mode = 'microbit' with mock.patch('builtins.open', mock.mock_open()), \ mock.patch('os.path.isfile', return_value=True): ed.load() assert view.get_load_path.call_count == 1 assert view.show_confirmation.call_count == 0 assert ed.change_mode.call_count == 0 view.add_tab.assert_called_once_with(None, file_content, api, os.linesep) def test_load_other_file_change_mode(): """ If the user specifies a file supported by a Mu mode (like a .hex file) that is not currently active, then ensure it's loaded, added as a tab, and it asks the user to change mode. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value='foo.hex') view.add_tab = mock.MagicMock() view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Ok) view.current_tab.path = 'path' ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() api = ['API specification', ] file_content = 'PYTHON CODE' mock_py = mock.MagicMock() mock_py.open_file.return_value = None mock_py.api.return_value = api mock_py.workspace_dir.return_value = '/fake/path' mock_mb = mock.MagicMock() mock_mb.api.return_value = api mock_mb.workspace_dir.return_value = '/fake/path' mock_mb.open_file.return_value = file_content mock_mb.file_extensions = ['hex'] ed.modes = { 'python': mock_py, 'microbit': mock_mb, } ed.mode = 'python' with mock.patch('builtins.open', mock.mock_open()), \ mock.patch('os.path.isfile', return_value=True): ed.load() assert view.get_load_path.call_count == 1 assert view.show_confirmation.call_count == 1 assert ed.change_mode.call_count == 1 view.add_tab.assert_called_once_with(None, file_content, api, os.linesep) def test_load_other_file_with_exception(): """ If the user specifies a file supported by a Mu mode (like a .hex file) try to open it and check it ignores it if it throws an unexpected exception. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value='foo.hex') view.add_tab = mock.MagicMock() view.show_confirmation = mock.MagicMock() view.current_tab.path = 'path' ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() mock_mb = mock.MagicMock() mock_mb.workspace_dir.return_value = '/fake/path' mock_mb.open_file = mock.MagicMock(side_effect=Exception(':(')) mock_mb.file_extensions = ['hex'] ed.modes = { 'microbit': mock_mb, } ed.mode = 'microbit' mock_open = mock.mock_open() with mock.patch('builtins.open', mock_open), \ mock.patch('os.path.isfile', return_value=True): ed.load() assert view.get_load_path.call_count == 1 assert view.show_message.call_count == 1 assert view.show_confirmation.call_count == 0 assert ed.change_mode.call_count == 0 assert view.add_tab.call_count == 0 def test_load_not_python_or_hex(): """ If the user tries to open a file that isn't .py or .hex then Mu should report a helpful message. """ view = mock.MagicMock() ed = mu.logic.Editor(view) with mock.patch('os.path.isfile', return_value=True): ed._load('unknown_filetype.foo') assert view.show_message.call_count == 1 def test_load_recovers_from_oserror(): """ If loading the file results in an OSError (for example, the user doesn't have permission to read the file), then a helpful message is displayed. """ text = "python" ed = mocked_editor() with generate_python_file(text) as filepath, \ mock.patch('mu.logic.read_and_decode', side_effect=OSError('boom')): ed._view.get_load_path.return_value = filepath ed.load() assert ed._view.show_message.call_count == 1 # # When loading files Mu makes a note of the majority line-ending convention # in use in the file. When it is saved, that convention is used. # def test_load_stores_newline(): """ When a file is loaded, its newline convention should be held on the tab for use when saving. """ newline = "r\n" text = newline.join("the cat sat on the mat".split()) editor = mocked_editor() with generate_python_file("abc\r\ndef") as filepath: editor._view.get_load_path.return_value = filepath editor.load() assert editor._view.add_tab.called_with( filepath, text, editor.modes[editor.mode].api(), "\r\n") def test_save_restores_newline(): """ When a file is saved the newline convention noted originally should be used. """ newline = "\r\n" test_text = mu.logic.NEWLINE.join( "the cat sat on the mat".split() ) with generate_python_file(test_text) as filepath: with mock.patch("mu.logic.save_and_encode") as mock_save: ed = mocked_editor(text=test_text, newline=newline, path=filepath) ed.save() assert mock_save.called_with(test_text, filepath, newline) def test_save_strips_trailing_spaces(): """ When a file is saved any trailing spaces should be removed from each line leaving any newlines intact. NB we inadvertently strip trailing newlines in any case via save_and_encode """ words = "the cat sat on the mat".split() test_text = mu.logic.NEWLINE.join("%s " % w for w in words) stripped_text = mu.logic.NEWLINE.join(words) with generate_python_file(test_text) as filepath: mu.logic.save_and_encode(test_text, filepath) with open(filepath) as f: assert f.read() == stripped_text def test_load_error(): """ Ensure that anything else is just ignored. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value='foo.py') view.add_tab = mock.MagicMock() view.current_tab.path = 'path' ed = mu.logic.Editor(view) mock_open = mock.MagicMock(side_effect=FileNotFoundError()) mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = '/fake/path' ed.modes = { 'python': mock_mode, } with mock.patch('builtins.open', mock_open): ed.load() assert view.get_load_path.call_count == 1 assert view.add_tab.call_count == 0 def test_load_sets_current_path(): """ When a path has been selected for loading by the OS's file selector, ensure that the directory containing the selected file is set as the self.current_path for re-use later on. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value=os.path.join('path', 'foo.py')) view.current_tab.path = os.path.join('old_path', 'foo.py') ed = mu.logic.Editor(view) ed._load = mock.MagicMock() mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = '/fake/path' mock_mode.file_extensions = ['html', 'css'] ed.modes = { 'python': mock_mode, } ed.load() assert ed.current_path == os.path.abspath('path') def test_load_no_current_path(): """ If there is no self.current_path the default location to look for a file to load is the directory containing the file currently being edited. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value=os.path.join('path', 'foo.py')) view.current_tab.path = os.path.join('old_path', 'foo.py') ed = mu.logic.Editor(view) ed._load = mock.MagicMock() mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = '/fake/path' mock_mode.file_extensions = [] ed.modes = { 'python': mock_mode, } ed.load() expected = os.path.abspath('old_path') view.get_load_path.assert_called_once_with(expected, '*.py *.PY') def test_load_no_current_path_no_current_tab(): """ If there is no self.current_path nor is there a current file being edited then the default location to look for a file to load is the current mode's workspace directory. This used to be the default behaviour, but now acts as a sensible fall-back. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value=os.path.join('path', 'foo.py')) view.current_tab = None ed = mu.logic.Editor(view) ed._load = mock.MagicMock() mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = os.path.join('fake', 'path') mock_mode.file_extensions = [] ed.modes = { 'python': mock_mode, } ed.load() expected = mock_mode.workspace_dir() view.get_load_path.assert_called_once_with(expected, '*.py *.PY') def test_load_has_current_path_does_not_exist(): """ If there is a self.current_path but it doesn't exist, then use the expected fallback as the location to look for a file to load. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value=os.path.join('path', 'foo.py')) view.current_tab = None ed = mu.logic.Editor(view) ed._load = mock.MagicMock() ed.current_path = 'foo' mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = os.path.join('fake', 'path') mock_mode.file_extensions = [] ed.modes = { 'python': mock_mode, } ed.load() expected = mock_mode.workspace_dir() view.get_load_path.assert_called_once_with(expected, '*.py *.PY') def test_load_has_current_path(): """ If there is a self.current_path then use this as the location to look for a file to load. """ view = mock.MagicMock() view.get_load_path = mock.MagicMock(return_value=os.path.join('path', 'foo.py')) view.current_tab = None ed = mu.logic.Editor(view) ed._load = mock.MagicMock() ed.current_path = 'foo' mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = os.path.join('fake', 'path') mock_mode.file_extensions = [] ed.modes = { 'python': mock_mode, } with mock.patch('os.path.isdir', return_value=True): ed.load() view.get_load_path.assert_called_once_with('foo', '*.py *.PY') def test_check_for_shadow_module_with_match(): """ If the name of the file in the path passed into check_for_shadow_module (without the .py file extension) is found in module_names then return True since the filename shadows that of a module found on the Python path. """ view = mock.MagicMock() ed = mu.logic.Editor(view) mock_mode = mock.MagicMock() mock_mode.module_names = set(['foo', 'bar', 'baz']) ed.modes = { 'python': mock_mode, } ed.mode = 'python' assert ed.check_for_shadow_module('/a/long/path/with/foo.py') def test_save_no_tab(): """ If there's no active tab then do nothing. """ view = mock.MagicMock() view.current_tab = None ed = mu.logic.Editor(view) ed.save() # If the code fell through then the tab state would be modified. assert view.current_tab is None def test_save_no_path(): """ If there's no path associated with the tab then request the user provide one. """ text, path, newline = "foo", "foo.py", "\n" ed = mocked_editor(text=text, path=None, newline=newline) ed._view.get_save_path.return_value = path ed.check_for_shadow_module = mock.MagicMock(return_value=False) with mock.patch("mu.logic.save_and_encode") as mock_save: ed.save() mock_save.assert_called_with(text, path, newline) def test_save_no_path_no_path_given(): """ If there's no path associated with the tab and the user cancels providing one, ensure the path is correctly re-set. """ text, newline = "foo", "\n" ed = mocked_editor(text=text, path=None, newline=newline) ed._view.get_save_path.return_value = '' ed.save() # The path isn't the empty string returned from get_save_path. assert ed._view.current_tab.path is None def test_save_path_shadows_module(): """ If the filename in the path shadows a module then display a warning message and abort. """ text, newline = "foo", "\n" ed = mocked_editor(text=text, path=None, newline=newline) ed._view.get_save_path.return_value = '/a/long/path/foo.py' mock_mode = mock.MagicMock() mock_mode.module_names = set(['foo', 'bar', 'baz']) ed.modes = { 'python': mock_mode, } ed.mode = 'python' ed.save() # The path isn't the empty string returned from get_save_path. assert ed._view.show_message.call_count == 1 assert ed._view.current_tab.path is None def test_save_file_with_exception(): """ If the file cannot be written, return an error message. """ view = mock.MagicMock() view.current_tab = mock.MagicMock() view.current_tab.path = 'foo.py' view.current_tab.text = mock.MagicMock(return_value='foo') view.current_tab.setModified = mock.MagicMock(return_value=None) view.show_message = mock.MagicMock() mock_open = mock.MagicMock(side_effect=OSError()) ed = mu.logic.Editor(view) with mock.patch('builtins.open', mock_open): ed.save() assert view.current_tab.setModified.call_count == 0 assert view.show_message.call_count == 1 def test_save_file_with_encoding_error(): """ If Mu encounters a UnicodeEncodeError when trying to write the file, it should display a helpful message explaining the problem. """ text, path, newline = "foo", "foo", "\n" ed = mocked_editor(text=text, path=path, newline=newline) with mock.patch("mu.logic.save_and_encode") as mock_save: mock_save.side_effect = UnicodeEncodeError(mu.logic.ENCODING, "", 0, 0, "Unable to encode") ed.save() assert ed._view.current_tab.setModified.call_count == 0 def test_save_python_file(): """ If the path is a Python file (ending in *.py) then save it and reset the modified flag. """ path, contents, newline = "foo.py", "foo", "\n" view = mock.MagicMock() view.current_tab = mock.MagicMock() view.current_tab.path = path view.current_tab.text = mock.MagicMock(return_value=contents) view.current_tab.newline = "\n" view.get_save_path = mock.MagicMock(return_value=path) view.current_tab.setModified = mock.MagicMock(return_value=None) ed = mu.logic.Editor(view) with mock.patch("mu.logic.save_and_encode") as mock_save: ed.save() mock_save.assert_called_once_with(contents, path, newline) assert view.get_save_path.call_count == 0 view.current_tab.setModified.assert_called_once_with(False) def test_save_with_no_file_extension(): """ If the path doesn't end in *.py then append it to the filename. """ text, path, newline = "foo", "foo", "\n" ed = mocked_editor(text=text, path=path, newline=newline) with mock.patch('mu.logic.save_and_encode') as mock_save: ed.save() mock_save.assert_called_once_with(text, path + ".py", newline) ed._view.get_save_path.call_count == 0 def test_save_with_non_py_file_extension(): """ If the path ends in an extension, save it using the extension """ text, path, newline = "foo", "foo.txt", "\n" ed = mocked_editor(text=text, path=path, newline=newline) ed._view.get_save_path.return_value = path with mock.patch('mu.logic.save_and_encode') as mock_save: ed.save() mock_save.assert_called_once_with(text, path, newline) ed._view.get_save_path.call_count == 0 def test_get_tab_existing_tab(): """ Ensure that an existing tab is returned if its path matches. """ view = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.path = 'foo' view.widgets = [mock_tab, ] ed = mu.logic.Editor(view) view.focus_tab.reset_mock() tab = ed.get_tab('foo') assert tab == mock_tab view.focus_tab.assert_called_once_with(mock_tab) def test_get_tab_new_tab(): """ If the path is not represented by an existing tab, ensure it is loaded and the new tab is returned. """ view = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.path = 'foo' view.widgets = [mock_tab, ] ed = mu.logic.Editor(view) ed.direct_load = mock.MagicMock() tab = ed.get_tab('bar') ed.direct_load.assert_called_once_with('bar') assert tab == view.current_tab def test_get_tab_no_path(): """ Any tabs with no associated path are ignored (i.e. tabs that have been newly created but remain unsaved). """ view = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.path = None view.widgets = [mock_tab, ] ed = mu.logic.Editor(view) ed.direct_load = mock.MagicMock() tab = ed.get_tab('bar') ed.direct_load.assert_called_once_with('bar') assert tab == view.current_tab def test_zoom_in(): """ Ensure the UI layer is zoomed in. """ view = mock.MagicMock() view.zoom_in = mock.MagicMock(return_value=None) ed = mu.logic.Editor(view) ed.zoom_in() assert view.zoom_in.call_count == 1 def test_zoom_out(): """ Ensure the UI layer is zoomed out. """ view = mock.MagicMock() view.zoom_out = mock.MagicMock(return_value=None) ed = mu.logic.Editor(view) ed.zoom_out() assert view.zoom_out.call_count == 1 def test_check_code_on(): """ Checking code correctly results in something the UI layer can parse. """ view = mock.MagicMock() tab = mock.MagicMock() tab.has_annotations = False tab.path = 'foo.py' tab.text.return_value = 'import this\n' view.current_tab = tab flake = {2: {'line_no': 2, 'message': 'a message', }, } pep8 = {2: [{'line_no': 2, 'message': 'another message', }], 3: [{'line_no': 3, 'message': 'yet another message', }]} mock_mode = mock.MagicMock() mock_mode.builtins = None with mock.patch('mu.logic.check_flake', return_value=flake), \ mock.patch('mu.logic.check_pycodestyle', return_value=pep8): ed = mu.logic.Editor(view) ed.modes = {'python': mock_mode, } ed.check_code() assert tab.has_annotations is True view.reset_annotations.assert_called_once_with() view.annotate_code.assert_has_calls([mock.call(flake, 'error'), mock.call(pep8, 'style')], any_order=True) def test_check_code_no_problems(): """ If no problems are found in the code, ensure a status message is shown to the user to confirm the fact. See #337 """ view = mock.MagicMock() tab = mock.MagicMock() tab.has_annotations = False tab.path = 'foo.py' tab.text.return_value = 'import this\n' view.current_tab = tab flake = {} pep8 = {} mock_mode = mock.MagicMock() mock_mode.builtins = None with mock.patch('mu.logic.check_flake', return_value=flake), \ mock.patch('mu.logic.check_pycodestyle', return_value=pep8): ed = mu.logic.Editor(view) ed.show_status_message = mock.MagicMock() ed.modes = {'python': mock_mode, } ed.check_code() assert ed.show_status_message.call_count == 1 def test_check_code_off(): """ If the tab already has annotations, toggle them off. """ view = mock.MagicMock() tab = mock.MagicMock() tab.has_annotations = True view.current_tab = tab ed = mu.logic.Editor(view) ed.check_code() assert tab.has_annotations is False view.reset_annotations.assert_called_once_with() def test_check_code_no_tab(): """ Checking code when there is no tab containing code aborts the process. """ view = mock.MagicMock() view.current_tab = None ed = mu.logic.Editor(view) ed.check_code() assert view.annotate_code.call_count == 0 def test_show_help(): """ Help should attempt to open up the user's browser and point it to the expected help documentation. """ view = mock.MagicMock() ed = mu.logic.Editor(view) with mock.patch('mu.logic.webbrowser.open_new', return_value=None) as wb, \ mock.patch('mu.logic.locale.getdefaultlocale', return_value=('en_GB', 'UTF-8')): ed.show_help() version = '.'.join(__version__.split('.')[:2]) url = 'https://codewith.mu/en/help/{}'.format(version) wb.assert_called_once_with(url) def test_show_help_exploding_getdefaultlocale(): """ Sometimes, on OSX the getdefaultlocale method causes a TypeError or ValueError. Ensure when this happens, Mu defaults to 'en' as the language code. """ view = mock.MagicMock() ed = mu.logic.Editor(view) with mock.patch('mu.logic.webbrowser.open_new', return_value=None) as wb, \ mock.patch('mu.logic.locale.getdefaultlocale', side_effect=TypeError('Boom!')): ed.show_help() version = '.'.join(__version__.split('.')[:2]) url = 'https://codewith.mu/en/help/{}'.format(version) wb.assert_called_once_with(url) def test_quit_modified_cancelled_from_button(): """ If the user quits and there's unsaved work, and they cancel the "quit" then do nothing. """ view = mock.MagicMock() view.modified = True view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Cancel) ed = mu.logic.Editor(view) mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open): ed.quit() assert view.show_confirmation.call_count == 1 assert mock_open.call_count == 0 def test_quit_modified_cancelled_from_event(): """ If the user quits and there's unsaved work, and they cancel the "quit" then do nothing. """ view = mock.MagicMock() view.modified = True view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Cancel) ed = mu.logic.Editor(view) mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open): ed.quit(mock_event) assert view.show_confirmation.call_count == 1 assert mock_event.ignore.call_count == 1 assert mock_open.call_count == 0 def test_quit_modified_ok(): """ If the user quits and there's unsaved work that's ignored then proceed to save the session. """ view = mock.MagicMock() view.modified = True view.show_confirmation = mock.MagicMock(return_value=True) ed = mu.logic.Editor(view) mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = 'foo/bar' mock_mode.get_hex_path.return_value = 'foo/bar' mock_debug_mode = mock.MagicMock() mock_debug_mode.is_debugger = True ed.modes = { 'python': mock_mode, 'microbit': mock_mode, 'debugger': mock_debug_mode, } ed.mode = 'debugger' mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open): ed.quit(mock_event) mock_debug_mode.stop.assert_called_once_with() assert view.show_confirmation.call_count == 1 assert mock_event.ignore.call_count == 0 assert mock_open.call_count == 1 assert mock_open.return_value.write.call_count > 0 def test_quit_save_tabs_with_paths(): """ When saving the session, ensure those tabs with associated paths are logged in the session file. """ view = mock.MagicMock() view.modified = True view.zoom_position = 2 view.show_confirmation = mock.MagicMock(return_value=True) w1 = mock.MagicMock() w1.path = 'foo.py' view.widgets = [w1, ] ed = mu.logic.Editor(view) mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = 'foo/bar' mock_mode.get_hex_path.return_value = 'foo/bar' ed.modes = { 'python': mock_mode, 'microbit': mock_mode, } mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open): ed.quit(mock_event) assert view.show_confirmation.call_count == 1 assert mock_event.ignore.call_count == 0 assert mock_open.call_count == 1 assert mock_open.return_value.write.call_count > 0 recovered = ''.join([i[0][0] for i in mock_open.return_value.write.call_args_list]) session = json.loads(recovered) assert os.path.abspath('foo.py') in session['paths'] def test_quit_save_theme(): """ When saving the session, ensure the theme is logged in the session file. """ view = mock.MagicMock() view.modified = True view.zoom_position = 2 view.show_confirmation = mock.MagicMock(return_value=True) w1 = mock.MagicMock() w1.path = 'foo.py' view.widgets = [w1, ] ed = mu.logic.Editor(view) ed.theme = 'night' mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = 'foo/bar' mock_mode.get_hex_path.return_value = 'foo/bar' ed.modes = { 'python': mock_mode, 'microbit': mock_mode, } mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open): ed.quit(mock_event) assert view.show_confirmation.call_count == 1 assert mock_event.ignore.call_count == 0 assert mock_open.call_count == 1 assert mock_open.return_value.write.call_count > 0 recovered = ''.join([i[0][0] for i in mock_open.return_value.write.call_args_list]) session = json.loads(recovered) assert session['theme'] == 'night' def test_quit_save_envars(): """ When saving the session, ensure the user defined envars are logged in the session file. """ view = mock.MagicMock() view.modified = True view.zoom_position = 2 view.show_confirmation = mock.MagicMock(return_value=True) w1 = mock.MagicMock() w1.path = 'foo.py' view.widgets = [w1, ] ed = mu.logic.Editor(view) ed.theme = 'night' mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = 'foo/bar' mock_mode.get_hex_path.return_value = 'foo/bar' ed.modes = { 'python': mock_mode, 'microbit': mock_mode, } ed.envars = [ ['name1', 'value1'], ['name2', 'value2'], ] mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open): ed.quit(mock_event) assert view.show_confirmation.call_count == 1 assert mock_event.ignore.call_count == 0 assert mock_open.call_count == 1 assert mock_open.return_value.write.call_count > 0 recovered = ''.join([i[0][0] for i in mock_open.return_value.write.call_args_list]) session = json.loads(recovered) assert session['envars'] == [['name1', 'value1'], ['name2', 'value2'], ] def test_quit_save_zoom_level(): """ When saving the session, ensure the zoom level is logged in the session file. """ view = mock.MagicMock() view.modified = True view.zoom_position = 2 view.show_confirmation = mock.MagicMock(return_value=True) w1 = mock.MagicMock() w1.path = 'foo.py' view.widgets = [w1, ] ed = mu.logic.Editor(view) ed.theme = 'night' mock_mode = mock.MagicMock() mock_mode.workspace_dir.return_value = 'foo/bar' mock_mode.get_hex_path.return_value = 'foo/bar' ed.modes = { 'python': mock_mode, 'microbit': mock_mode, } ed.envars = [ ['name1', 'value1'], ['name2', 'value2'], ] mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open): ed.quit(mock_event) assert view.show_confirmation.call_count == 1 assert mock_event.ignore.call_count == 0 assert mock_open.call_count == 1 assert mock_open.return_value.write.call_count > 0 recovered = ''.join([i[0][0] for i in mock_open.return_value.write.call_args_list]) session = json.loads(recovered) assert session['zoom_level'] == 2 def test_quit_cleans_temporary_pth_file_on_windows(): """ If the platform is Windows and Mu is running as installed by the official Windows installer, then check for the existence of mu.pth, and if found, delete it. """ view = mock.MagicMock() view.modified = True view.show_confirmation = mock.MagicMock(return_value=True) w1 = mock.MagicMock() w1.path = 'foo.py' view.widgets = [w1, ] ed = mu.logic.Editor(view) ed.theme = 'night' ed.modes = { 'python': mock.MagicMock(), 'microbit': mock.MagicMock(), } mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) mock_sys = mock.MagicMock() mock_sys.platform = 'win32' mock_sys.executable = 'C:\\Program Files\\Mu\\Python\\pythonw.exe' mock_os_p_e = mock.MagicMock(return_value=True) mock_os_remove = mock.MagicMock() mock_site = mock.MagicMock() mock_site.ENABLE_USER_SITE = True mock_site.USER_SITE = ('C:\\Users\\foo\\AppData\\Roaming\\Python\\' 'Python36\\site-packages') with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open),\ mock.patch('json.dump'),\ mock.patch('mu.logic.sys', mock_sys),\ mock.patch('mu.logic.os.path.exists', mock_os_p_e),\ mock.patch('mu.logic.os.remove', mock_os_remove),\ mock.patch('mu.logic.site', mock_site): ed.quit(mock_event) expected_path = os.path.join(mock_site.USER_SITE, 'mu.pth') mock_os_remove.assert_called_once_with(expected_path) def test_quit_unable_to_clean_temporary_pth_file_on_windows(): """ If the platform is Windows and Mu is running as installed by the official Windows installer, then check for the existence of mu.pth, and if found, attempt to delete it, but in the case of an error, simply log the error for future reference / debugging. """ view = mock.MagicMock() view.modified = True view.show_confirmation = mock.MagicMock(return_value=True) w1 = mock.MagicMock() w1.path = 'foo.py' view.widgets = [w1, ] ed = mu.logic.Editor(view) ed.theme = 'night' ed.modes = { 'python': mock.MagicMock(), 'microbit': mock.MagicMock(), } mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) mock_sys = mock.MagicMock() mock_sys.platform = 'win32' mock_sys.executable = 'C:\\Program Files\\Mu\\Python\\pythonw.exe' mock_os_p_e = mock.MagicMock(return_value=True) mock_os_remove = mock.MagicMock(side_effect=PermissionError('Boom')) mock_site = mock.MagicMock() mock_site.ENABLE_USER_SITE = True mock_site.USER_SITE = ('C:\\Users\\foo\\AppData\\Roaming\\Python\\' 'Python36\\site-packages') mock_log = mock.MagicMock() with mock.patch('sys.exit', return_value=None), \ mock.patch('builtins.open', mock_open),\ mock.patch('json.dump'),\ mock.patch('mu.logic.sys', mock_sys),\ mock.patch('mu.logic.os.path.exists', mock_os_p_e),\ mock.patch('mu.logic.os.remove', mock_os_remove),\ mock.patch('mu.logic.site', mock_site),\ mock.patch('mu.logic.logger', mock_log): ed.quit(mock_event) logs = [call[0][0] for call in mock_log.error.call_args_list] expected_path = os.path.join(mock_site.USER_SITE, 'mu.pth') expected = 'Unable to delete {}'.format(expected_path) assert expected in logs def test_quit_calls_sys_exit(): """ Ensure that sys.exit(0) is called. """ view = mock.MagicMock() view.modified = True view.show_confirmation = mock.MagicMock(return_value=True) w1 = mock.MagicMock() w1.path = 'foo.py' view.widgets = [w1, ] ed = mu.logic.Editor(view) ed.theme = 'night' ed.modes = { 'python': mock.MagicMock(), 'microbit': mock.MagicMock(), } mock_open = mock.MagicMock() mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.write = mock.MagicMock() mock_event = mock.MagicMock() mock_event.ignore = mock.MagicMock(return_value=None) with mock.patch('sys.exit', return_value=None) as ex, \ mock.patch('builtins.open', mock_open): ed.quit(mock_event) ex.assert_called_once_with(0) def test_show_admin(): """ Ensure the expected admin dialog is displayed to the end user. """ view = mock.MagicMock() ed = mu.logic.Editor(view) ed.envars = [['name', 'value'], ] ed.minify = True ed.microbit_runtime = '/foo/bar' settings = { 'envars': 'name=value', 'minify': True, 'microbit_runtime': '/foo/bar' } view.show_admin.return_value = settings mock_open = mock.mock_open() with mock.patch('builtins.open', mock_open), \ mock.patch('os.path.isfile', return_value=True): ed.show_admin(None) mock_open.assert_called_once_with(mu.logic.LOG_FILE, 'r', encoding='utf8') assert view.show_admin.call_count == 1 assert view.show_admin.call_args[0][1] == settings assert ed.envars == [['name', 'value']] assert ed.minify is True assert ed.microbit_runtime == '/foo/bar' def test_show_admin_missing_microbit_runtime(): """ Ensure the microbit_runtime result is '' and a warning message is displayed if the specified microbit_runtime doesn't actually exist. """ view = mock.MagicMock() ed = mu.logic.Editor(view) ed.envars = [['name', 'value'], ] ed.minify = True ed.microbit_runtime = '/foo/bar' settings = { 'envars': 'name=value', 'minify': True, 'microbit_runtime': '/foo/bar' } view.show_admin.return_value = settings mock_open = mock.mock_open() with mock.patch('builtins.open', mock_open), \ mock.patch('os.path.isfile', return_value=False): ed.show_admin(None) mock_open.assert_called_once_with(mu.logic.LOG_FILE, 'r', encoding='utf8') assert view.show_admin.call_count == 1 assert view.show_admin.call_args[0][1] == settings assert ed.envars == [['name', 'value']] assert ed.minify is True assert ed.microbit_runtime == '' assert view.show_message.call_count == 1 def test_select_mode(): """ It's possible to select and update to a new mode. """ view = mock.MagicMock() view.select_mode.return_value = 'foo' mode = mock.MagicMock() mode.is_debugger = False ed = mu.logic.Editor(view) ed.modes = { 'python': mode, } ed.change_mode = mock.MagicMock() ed.select_mode(None) assert view.select_mode.call_count == 1 ed.change_mode.assert_called_once_with('foo') def test_select_mode_debug_mode(): """ It's NOT possible to select and update to a new mode if you're in debug mode. """ view = mock.MagicMock() mode = mock.MagicMock() mode.debugger = True ed = mu.logic.Editor(view) ed.modes = { 'debugger': mode, } ed.mode = 'debugger' ed.change_mode = mock.MagicMock() ed.select_mode(None) assert ed.mode == 'debugger' assert ed.change_mode.call_count == 0 def test_change_mode(): """ It should be possible to change modes in the expected fashion (buttons get correctly connected to event handlers). """ view = mock.MagicMock() mock_button_bar = mock.MagicMock() view.button_bar = mock_button_bar view.change_mode = mock.MagicMock() ed = mu.logic.Editor(view) old_mode = mock.MagicMock() old_mode.save_timeout = 5 old_mode.actions.return_value = [ { 'name': 'name', 'handler': 'handler', 'shortcut': 'Ctrl+X', }, ] mode = mock.MagicMock() mode.save_timeout = 5 mode.actions.return_value = [ { 'name': 'name', 'handler': 'handler', 'shortcut': 'Ctrl+X', }, ] ed.modes = { 'microbit': old_mode, 'python': mode, } ed.mode = 'microbit' ed.change_mode('python') # Check the old mode is closed properly. old_mode.remove_repl.assert_called_once_with() old_mode.remove_fs.assert_called_once_with() old_mode.remove_plotter.assert_called_once_with() # Check the new mode is set up correctly. assert ed.mode == 'python' view.change_mode.assert_called_once_with(mode) assert mock_button_bar.connect.call_count == 11 view.status_bar.set_mode.assert_called_once_with('python') view.set_timer.assert_called_once_with(5, ed.autosave) def test_change_mode_no_timer(): """ It should be possible to change modes in the expected fashion (buttons get correctly connected to event handlers). """ view = mock.MagicMock() mock_button_bar = mock.MagicMock() view.button_bar = mock_button_bar view.change_mode = mock.MagicMock() ed = mu.logic.Editor(view) mode = mock.MagicMock() mode.save_timeout = 0 mode.actions.return_value = [ { 'name': 'name', 'handler': 'handler', 'shortcut': 'Ctrl+X', }, ] ed.modes = { 'python': mode, } ed.change_mode('python') assert ed.mode == 'python' view.change_mode.assert_called_once_with(mode) assert mock_button_bar.connect.call_count == 11 view.status_bar.set_mode.assert_called_once_with('python') view.stop_timer.assert_called_once_with() def test_change_mode_reset_breakpoints(): """ When changing modes, if the new mode does NOT require a debugger, then breakpoints should be reset. """ view = mock.MagicMock() mock_tab = mock.MagicMock() mock_tab.breakpoint_handles = set([1, 2, 3, ]) view.widgets = [mock_tab, ] ed = mu.logic.Editor(view) mode = mock.MagicMock() mode.has_debugger = False mode.is_debugger = False mode.save_timeout = 5 ed.modes = { 'microbit': mode, 'debug': mock.MagicMock(), } ed.mode = 'debug' ed.change_mode('microbit') assert ed.mode == 'microbit' assert mock_tab.breakpoint_handles == set() mock_tab.reset_annotations.assert_called_once_with() def test_autosave(): """ Ensure the autosave callback does the expected things to the tabs. """ view = mock.MagicMock() view.modified = True mock_tab = mock.MagicMock() mock_tab.path = 'foo' mock_tab.isModified.return_value = True view.widgets = [mock_tab, ] ed = mu.logic.Editor(view) with mock.patch('mu.logic.save_and_encode') as mock_save: ed.autosave() assert mock_save.call_count == 1 mock_tab.setModified.assert_called_once_with(False) def test_check_usb(): """ Ensure the check_usb callback actually checks for connected USB devices. """ view = mock.MagicMock() view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Ok) ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() mode_py = mock.MagicMock() mode_py.name = "Python3" mode_py.runner = None mode_py.find_device.return_value = (None, None) mode_mb = mock.MagicMock() mode_mb.name = 'BBC micro:bit' mode_mb.find_device.return_value = ('/dev/ttyUSB0', '12345') ed.modes = { 'microbit': mode_mb, 'python': mode_py, } ed.show_status_message = mock.MagicMock() ed.check_usb() expected = 'Detected new BBC micro:bit device.' ed.show_status_message.assert_called_with(expected) assert view.show_confirmation.called ed.change_mode.assert_called_once_with('microbit') def test_check_usb_change_mode_cancel(): """ Ensure the check_usb doesn't change mode if confirmation cancelled by user. """ view = mock.MagicMock() view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Cancel) ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() mode_py = mock.MagicMock() mode_py.name = "Python3" mode_py.runner = None mode_py.find_device.return_value = (None, None) mode_cp = mock.MagicMock() mode_cp.name = 'CircuitPlayground' mode_cp.find_device.return_value = ('/dev/ttyUSB1', '12345') ed.modes = { 'circuitplayground': mode_cp, 'python': mode_py, } ed.show_status_message = mock.MagicMock() ed.check_usb() expected = 'Detected new CircuitPlayground device.' ed.show_status_message.assert_called_with(expected) assert view.show_confirmation.called ed.change_mode.assert_not_called() def test_check_usb_already_in_mode(): """ Ensure the check_usb doesn't ask to change mode if already selected. """ view = mock.MagicMock() view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Ok) ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() mode_mb = mock.MagicMock() mode_mb.name = 'BBC micro:bit' mode_mb.find_device.return_value = ('/dev/ttyUSB0', '12345') mode_cp = mock.MagicMock() mode_cp.find_device.return_value = (None, None) ed.modes = { 'microbit': mode_mb, 'circuitplayground': mode_cp } ed.mode = 'microbit' ed.show_status_message = mock.MagicMock() ed.check_usb() view.show_confirmation.assert_not_called() ed.change_mode.assert_not_called() def test_check_usb_currently_running_code(): """ Ensure the check_usb doesn't ask to change mode if the current mode is running code. """ view = mock.MagicMock() view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Ok) ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() mode_py = mock.MagicMock() mode_py.name = "Python3" mode_py.runner = True mode_py.find_device.return_value = (None, None) mode_mb = mock.MagicMock() mode_mb.name = 'BBC micro:bit' mode_mb.find_device.return_value = ('/dev/ttyUSB0', '12345') ed.modes = { 'microbit': mode_mb, 'python': mode_py, } ed.show_status_message = mock.MagicMock() ed.check_usb() view.show_confirmation.assert_not_called() ed.change_mode.assert_not_called() def test_check_usb_multiple_devices(): """ Ensure the check_usb doesn't ask to change mode if multiple devices found. """ view = mock.MagicMock() view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Ok) ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() mode_py = mock.MagicMock() mode_py.name = "Python3" mode_py.runner = None mode_py.find_device.return_value = (None, None) mode_mb = mock.MagicMock() mode_mb.name = 'BBC micro:bit' mode_mb.find_device.return_value = ('/dev/ttyUSB0', '12345') mode_cp = mock.MagicMock() mode_cp.name = 'CircuitPlayground' mode_cp.find_device.return_value = ('/dev/ttyUSB1', '54321') ed.modes = { 'microbit': mode_mb, 'circuitplayground': mode_cp, 'python': mode_py, } ed.show_status_message = mock.MagicMock() ed.check_usb() expected_mb = mock.call('Detected new BBC micro:bit device.') expected_cp = mock.call('Detected new CircuitPlayground device.') ed.show_status_message.assert_has_calls((expected_mb, expected_cp), any_order=True) view.show_confirmation.assert_not_called() ed.change_mode.assert_not_called() def test_check_usb_when_selecting_mode_is_silent(): """ Ensure the check_usb doesn't ask to change mode if the user has the mode selection dialog active (indicated by the selecting_mode flag. """ view = mock.MagicMock() view.show_confirmation = mock.MagicMock(return_value=QMessageBox.Cancel) ed = mu.logic.Editor(view) ed.change_mode = mock.MagicMock() mode_py = mock.MagicMock() mode_py.name = "Python3" mode_py.runner = None mode_py.find_device.return_value = (None, None) mode_cp = mock.MagicMock() mode_cp.name = 'CircuitPlayground' mode_cp.find_device.return_value = ('/dev/ttyUSB1', '12345') ed.modes = { 'circuitplayground': mode_cp, 'python': mode_py, } ed.show_status_message = mock.MagicMock() ed.selecting_mode = True ed.check_usb() expected = 'Detected new CircuitPlayground device.' ed.show_status_message.assert_called_with(expected) assert view.show_confirmation.call_count == 0 ed.change_mode.assert_not_called() def test_check_usb_remove_disconnected_devices(): """ Ensure that if a device is no longer connected, it is removed from the set of connected devices. """ view = mock.MagicMock() ed = mu.logic.Editor(view) ed.modes = {} ed.show_status_message = mock.MagicMock() ed.connected_devices = {('microbit', '/dev/ttyACM1')} ed.check_usb() assert len(ed.connected_devices) == 0 def test_show_status_message(): """ Ensure the method calls the status_bar in the view layer. """ msg = "Hello, World!" view = mock.MagicMock() ed = mu.logic.Editor(view) ed.show_status_message(msg, 8) view.status_bar.set_message.assert_called_once_with(msg, 8000) def test_debug_toggle_breakpoint_as_debugger(): """ If a breakpoint is toggled in debug mode, pass it to the toggle_breakpoint method in the debug client. """ view = mock.MagicMock() view.current_tab.text.return_value = 'print("Hello")' ed = mu.logic.Editor(view) mock_debugger = mock.MagicMock() mock_debugger.has_debugger = False mock_debugger.is_debugger = True ed.modes = { 'debugger': mock_debugger, } ed.mode = 'debugger' ed.debug_toggle_breakpoint(1, 10, False) mock_debugger.toggle_breakpoint.assert_called_once_with(10, view.current_tab) def test_debug_toggle_breakpoint_on(): """ Toggle the breakpoint on when not in debug mode by tracking it in the tab.breakpoint_handles set. """ view = mock.MagicMock() view.current_tab.breakpoint_handles = set() view.current_tab.markersAtLine.return_value = False view.current_tab.markerAdd.return_value = 999 # the tracked marker handle. ed = mu.logic.Editor(view) mock_debugger = mock.MagicMock() mock_debugger.has_debugger = True mock_debugger.is_debugger = False ed.modes = { 'python': mock_debugger, } ed.mode = 'python' with mock.patch('mu.logic.is_breakpoint_line', return_value=True): ed.debug_toggle_breakpoint(1, 10, False) view.current_tab.markerAdd.\ assert_called_once_with(10, view.current_tab.BREAKPOINT_MARKER) assert 999 in view.current_tab.breakpoint_handles def test_debug_toggle_breakpoint_off(): """ Toggle the breakpoint off when not in debug mode by tracking it in the tab.breakpoint_handles set. """ view = mock.MagicMock() view.current_tab.breakpoint_handles = set([10, ]) ed = mu.logic.Editor(view) mock_debugger = mock.MagicMock() mock_debugger.has_debugger = True mock_debugger.is_debugger = False ed.modes = { 'python': mock_debugger, } ed.mode = 'python' with mock.patch('mu.logic.is_breakpoint_line', return_value=True): ed.debug_toggle_breakpoint(1, 10, False) view.current_tab.markerDelete.\ assert_called_once_with(10, -1) def test_debug_toggle_breakpoint_on_invalid_breakpoint_line(): """ If a breakpoint is toggled on, it won't work if the line isn't a valid breakpoint line. """ view = mock.MagicMock() view.current_tab.text.return_value = '#print("Hello")' ed = mu.logic.Editor(view) mock_debugger = mock.MagicMock() mock_debugger.has_debugger = False mock_debugger.is_debugger = True ed.modes = { 'debugger': mock_debugger, } ed.mode = 'debugger' ed.debug_toggle_breakpoint(1, 10, False) assert view.show_message.call_count == 1 def test_debug_toggle_breakpoint_off_invalid_breakpoint_line(): """ It should be possible to remove breakpoints from *invalid* breakpoint lines. """ view = mock.MagicMock() view.current_tab.text.return_value = '#print("Hello")' view.current_tab.markersAtLine.return_value = True view.current_tab.breakpoint_handles = set([10, ]) ed = mu.logic.Editor(view) mock_mode = mock.MagicMock() mock_mode.has_debugger = True mock_mode.is_debugger = False ed.modes = { 'python': mock_mode, } ed.mode = 'python' ed.debug_toggle_breakpoint(1, 10, False) view.current_tab.markerDelete.assert_called_once_with(10, -1) def test_rename_tab_no_tab_id(): """ If no tab id is supplied (i.e. this method was triggered by the shortcut instead of the double-click event), then use the tab currently in focus. """ view = mock.MagicMock() view.get_save_path.return_value = 'foo' mock_tab = mock.MagicMock() mock_tab.path = 'old.py' view.current_tab = mock_tab ed = mu.logic.Editor(view) ed.save = mock.MagicMock() ed.check_for_shadow_module = mock.MagicMock(return_value=False) ed.rename_tab() view.get_save_path.assert_called_once_with('old.py') assert mock_tab.path == 'foo.py' ed.save.assert_called_once_with() def test_rename_tab(): """ If there's a tab id, the function being tested is reacting to a double-tap so make sure the expected tab is grabbed from the view. """ view = mock.MagicMock() view.get_save_path.return_value = 'foo' mock_tab = mock.MagicMock() mock_tab.path = 'old.py' view.tabs.widget.return_value = mock_tab ed = mu.logic.Editor(view) ed.save = mock.MagicMock() ed.check_for_shadow_module = mock.MagicMock(return_value=False) ed.rename_tab(1) view.get_save_path.assert_called_once_with('old.py') view.tabs.widget.assert_called_once_with(1) assert mock_tab.path == 'foo.py' ed.save.assert_called_once_with() def test_rename_tab_with_shadow_module(): """ If the user attempts to rename the tab to a filename which shadows a Python module, then a warning should appear and the process aborted. """ view = mock.MagicMock() view.get_save_path.return_value = 'foo' mock_tab = mock.MagicMock() mock_tab.path = 'old.py' view.tabs.widget.return_value = mock_tab ed = mu.logic.Editor(view) ed.save = mock.MagicMock() ed.check_for_shadow_module = mock.MagicMock(return_value=True) ed.rename_tab(1) view.get_save_path.assert_called_once_with('old.py') view.tabs.widget.assert_called_once_with(1) assert view.show_message.call_count == 1 assert mock_tab.path == 'old.py' assert ed.save.call_count == 0 def test_rename_tab_avoid_duplicating_other_tab_name(): """ If the user attempts to rename the tab to a filename used by another tab then show an error message and don't rename anything. """ view = mock.MagicMock() view.get_save_path.return_value = 'foo' mock_other_tab = mock.MagicMock() mock_other_tab.path = 'foo.py' view.widgets = [mock_other_tab, ] mock_tab = mock.MagicMock() mock_tab.path = 'old.py' view.tabs.widget.return_value = mock_tab ed = mu.logic.Editor(view) ed.check_for_shadow_module = mock.MagicMock(return_value=False) ed.rename_tab(1) view.show_message.assert_called_once_with('Could not rename file.', 'A file of that name is already ' 'open in Mu.') assert mock_tab.path == 'old.py' def test_logic_independent_import_logic(): """ It should be possible to import the logic and app modules from the mu package independently of each other. """ subprocess.run([sys.executable, "-c", "from mu import logic"], check=True) def test_logic_independent_import_app(): """ It should be possible to import the logic and app modules from the mu package independently of each other. """ subprocess.run([sys.executable, "-c", "from mu import app"], check=True) # # Tests for newline detection # Mu should detect the majority newline convention # in a loaded file and use that convention when writing # the file out again. Internally all newlines are MU_NEWLINE # def test_read_newline_no_text(): """If the file being loaded is empty, use the platform default newline """ with generate_python_file() as filepath: text, newline = mu.logic.read_and_decode(filepath) assert text.count("\r\n") == 0 assert newline == os.linesep def test_read_newline_all_unix(): """If the file being loaded has only the Unix convention, use that """ with generate_python_file("abc\ndef") as filepath: text, newline = mu.logic.read_and_decode(filepath) assert text.count("\r\n") == 0 assert newline == "\n" def test_read_newline_all_windows(): """If the file being loaded has only the Windows convention, use that """ with generate_python_file("abc\r\ndef") as filepath: text, newline = mu.logic.read_and_decode(filepath) assert text.count("\r\n") == 0 assert newline == "\r\n" def test_read_newline_most_unix(): """If the file being loaded has mostly the Unix convention, use that """ with generate_python_file("\nabc\r\ndef\n") as filepath: text, newline = mu.logic.read_and_decode(filepath) assert text.count("\r\n") == 0 assert newline == "\n" def test_read_newline_most_windows(): """If the file being loaded has mostly the Windows convention, use that """ with generate_python_file("\r\nabc\ndef\r\n") as filepath: text, newline = mu.logic.read_and_decode(filepath) assert text.count("\r\n") == 0 assert newline == "\r\n" def test_read_newline_equal_match(): """If the file being loaded has an equal number of Windows and Unix newlines, use the platform default """ with generate_python_file("\r\nabc\ndef") as filepath: text, newline = mu.logic.read_and_decode(filepath) assert text.count("\r\n") == 0 assert newline == os.linesep # # When writing Mu should honour the line-ending convention found inbound # def test_write_newline_to_unix(): """If the file had Unix newlines it should be saved with Unix newlines (In principle this check is unnecessary as Unix newlines are currently the Mu internal default; but we leave it here in case that situation changes) """ with generate_python_file() as filepath: test_string = "\r\n".join("the cat sat on the mat".split()) mu.logic.save_and_encode(test_string, filepath, "\n") with open(filepath, newline="") as f: text = f.read() assert text.count("\r\n") == 0 assert text.count("\n") == test_string.count("\r\n") def test_write_newline_to_windows(): """If the file had Windows newlines it should be saved with Windows newlines """ with generate_python_file() as filepath: test_string = "\n".join("the cat sat on the mat".split()) mu.logic.save_and_encode(test_string, filepath, "\r\n") with open(filepath, newline="") as f: text = f.read() assert len(re.findall("[^\r]\n", text)) == 0 assert text.count("\r\n") == test_string.count("\n") # # Generate a Unicode test string which includes all the usual # 7-bit characters but also an 8th-bit range which tends to # trip things up between encodings # BYTES_TEST_STRING = bytes(range(0x20, 0x80)) + bytes(range(0xa0, 0xff)) UNICODE_TEST_STRING = BYTES_TEST_STRING.decode("iso-8859-1") # # Tests for encoding detection # Mu should detect: # - BOM (UTF8/16) # - Encoding cooke, eg # -*- coding: utf-8 -*- # - fallback to the platform default (locale.getpreferredencoding()) # def test_read_utf8bom(): """Successfully decode from utf-8 encoded with BOM """ with generate_python_file() as filepath: with open(filepath, "w", encoding="utf-8-sig") as f: f.write(UNICODE_TEST_STRING) text, _ = mu.logic.read_and_decode(filepath) assert text == UNICODE_TEST_STRING def test_read_utf16bebom(): """Successfully decode from utf-16 BE encoded with BOM """ with generate_python_file() as filepath: with open(filepath, "wb") as f: f.write(codecs.BOM_UTF16_BE) f.write(UNICODE_TEST_STRING.encode("utf-16-be")) text, _ = mu.logic.read_and_decode(filepath) assert text == UNICODE_TEST_STRING def test_read_utf16lebom(): """Successfully decode from utf-16 LE encoded with BOM """ with generate_python_file() as filepath: with open(filepath, "wb") as f: f.write(codecs.BOM_UTF16_LE) f.write(UNICODE_TEST_STRING.encode("utf-16-le")) text, _ = mu.logic.read_and_decode(filepath) assert text == UNICODE_TEST_STRING def test_read_encoding_cookie(): """Successfully decode from iso-8859-1 with an encoding cookie """ encoding_cookie = ENCODING_COOKIE.replace( mu.logic.ENCODING, "iso-8859-1") test_string = encoding_cookie + UNICODE_TEST_STRING with generate_python_file() as filepath: with open(filepath, "wb") as f: f.write(test_string.encode("iso-8859-1")) text, _ = mu.logic.read_and_decode(filepath) assert text == test_string def test_read_encoding_mu_default(): """Successfully decode from the mu default """ test_string = UNICODE_TEST_STRING.encode(mu.logic.ENCODING) with generate_python_file() as filepath: with open(filepath, "wb") as f: f.write(test_string) text, _ = mu.logic.read_and_decode(filepath) assert text == UNICODE_TEST_STRING def test_read_encoding_default(): """Successfully decode from the default locale """ test_string = UNICODE_TEST_STRING.encode(locale.getpreferredencoding()) with generate_python_file() as filepath: with open(filepath, "wb") as f: f.write(test_string) text, _ = mu.logic.read_and_decode(filepath) assert text == UNICODE_TEST_STRING def test_read_encoding_unsuccessful(): """Fail to decode encoded text """ # # Have to work quite hard to produce text which will definitely # fail to decode since UTF-8 and cp1252 (the default on this # computer) will, between them, decode nearly anything! # with generate_python_file() as filepath: with open(filepath, "wb") as f: f.write(codecs.BOM_UTF8) f.write(b"\xd8\x00") with pytest.raises(UnicodeDecodeError): text, _ = mu.logic.read_and_decode(filepath) # # When writing, if the text has an encoding cookie, then that encoding # should be used. Otherwise, UTF-8 should be used and no encoding cookie # added # def test_write_encoding_cookie_no_cookie(): """If the text has no cookie of its own utf-8 will be used when saving and no cookie added """ test_string = UNICODE_TEST_STRING with generate_python_file() as filepath: mu.logic.save_and_encode(test_string, filepath) with open(filepath, encoding=mu.logic.ENCODING) as f: for line in f: assert line == test_string break def test_write_encoding_cookie_existing_cookie(): """If the text has a encoding cookie of its own then that encoding will be used when saving and no change made to the cookie """ encoding = "iso-8859-1" cookie = ENCODING_COOKIE.replace(mu.logic.ENCODING, encoding) test_string = cookie + UNICODE_TEST_STRING with generate_python_file() as filepath: mu.logic.save_and_encode(test_string, filepath) with open(filepath, encoding=encoding) as f: assert next(f) == cookie assert next(f) == UNICODE_TEST_STRING def test_write_invalid_codec(): """If an encoding cookie is present but specifies an unknown codec, utf-8 will be used instead """ encoding = "INVALID" cookie = ENCODING_COOKIE.replace(mu.logic.ENCODING, encoding) test_string = cookie + UNICODE_TEST_STRING with generate_python_file() as filepath: mu.logic.save_and_encode(test_string, filepath) with open(filepath, encoding=mu.logic.ENCODING) as f: assert next(f) == cookie assert next(f) == UNICODE_TEST_STRING def test_handle_open_file(): """ Ensure on_open_file event handler fires as expected with the editor's direct_load when the view's open_file signal is emitted. """ class Dummy(QObject): open_file = pyqtSignal(str) view = Dummy() edit = mu.logic.Editor(view) m = mock.MagicMock() edit.direct_load = m view.open_file.emit('/test/path.py') m.assert_called_once_with('/test/path.py') def test_load_cli(): """ Ensure loading paths specified from the command line works as expected. """ mock_view = mock.MagicMock() ed = mu.logic.Editor(mock_view) m = mock.MagicMock() ed.direct_load = m ed.load_cli(['test.py']) m.assert_called_once_with(os.path.abspath('test.py')) m = mock.MagicMock() ed.direct_load = m ed.load_cli([5]) assert m.call_count == 0 def test_abspath(): """ Ensure a set of unique absolute paths is returned, given a list of arbitrary paths. """ ed = mu.logic.Editor(mock.MagicMock()) paths = ['foo', 'bar', 'bar'] result = ed._abspath(paths) assert len(result) == 2 assert os.path.abspath('foo') in result assert os.path.abspath('bar') in result def test_abspath_fail(): """ If given a problematic arbitrary path, _abspath will log the problem but continue to process the "good" paths. """ ed = mu.logic.Editor(mock.MagicMock()) paths = ['foo', 'bar', 5, 'bar'] with mock.patch('mu.logic.logger.error') as mock_error: result = ed._abspath(paths) assert mock_error.call_count == 1 assert len(result) == 2 assert os.path.abspath('foo') in result assert os.path.abspath('bar') in result def test_find_replace_cancelled(): """ If the activated find/replace dialog is cancelled, no status message is displayed. """ mock_view = mock.MagicMock() mock_view.show_find_replace.return_value = False ed = mu.logic.Editor(mock_view) ed.show_status_message = mock.MagicMock() ed.find_replace() ed.show_status_message.call_count == 0 def test_find_replace_no_find(): """ If the user fails to supply something to find, display a modal warning message to explain the problem. """ mock_view = mock.MagicMock() mock_view.show_find_replace.return_value = ('', '', False) ed = mu.logic.Editor(mock_view) ed.show_message = mock.MagicMock() ed.find_replace() msg = 'You must provide something to find.' info = "Please try again, this time with something in the find box." mock_view.show_message.assert_called_once_with(msg, info) def test_find_replace_find_matched(): """ If the user just supplies a find target and it is matched in the code then the expected status message should be shown. """ mock_view = mock.MagicMock() mock_view.show_find_replace.return_value = ('foo', '', False) mock_view.highlight_text.return_value = True ed = mu.logic.Editor(mock_view) ed.show_status_message = mock.MagicMock() ed.find_replace() mock_view.highlight_text.assert_called_once_with('foo') assert ed.find == 'foo' assert ed.replace == '' assert ed.global_replace is False ed.show_status_message.\ assert_called_once_with('Highlighting matches for "foo".') def test_find_replace_find_unmatched(): """ If the user just supplies a find target and it is UN-matched in the code then the expected status message should be shown. """ mock_view = mock.MagicMock() mock_view.show_find_replace.return_value = ('foo', '', False) mock_view.highlight_text.return_value = False ed = mu.logic.Editor(mock_view) ed.show_status_message = mock.MagicMock() ed.find_replace() ed.show_status_message.\ assert_called_once_with('Could not find "foo".') def test_find_replace_replace_no_match(): """ If the user supplies both a find and replace target and the find target is UN-matched in the code, then the expected status message should be shown. """ mock_view = mock.MagicMock() mock_view.show_find_replace.return_value = ('foo', 'bar', False) mock_view.replace_text.return_value = 0 ed = mu.logic.Editor(mock_view) ed.show_status_message = mock.MagicMock() ed.find_replace() assert ed.find == 'foo' assert ed.replace == 'bar' assert ed.global_replace is False mock_view.replace_text.assert_called_once_with('foo', 'bar', False) ed.show_status_message.\ assert_called_once_with('Could not find "foo".') def test_find_replace_replace_single_match(): """ If the user supplies both a find and replace target and the find target is matched once in the code, then the expected status message should be shown. """ mock_view = mock.MagicMock() mock_view.show_find_replace.return_value = ('foo', 'bar', False) mock_view.replace_text.return_value = 1 ed = mu.logic.Editor(mock_view) ed.show_status_message = mock.MagicMock() ed.find_replace() assert ed.find == 'foo' assert ed.replace == 'bar' assert ed.global_replace is False mock_view.replace_text.assert_called_once_with('foo', 'bar', False) ed.show_status_message.\ assert_called_once_with('Replaced "foo" with "bar".') def test_find_replace_replace_multi_match(): """ If the user supplies both a find and replace target and the find target is matched many times in the code, then the expected status message should be shown. """ mock_view = mock.MagicMock() mock_view.show_find_replace.return_value = ('foo', 'bar', True) mock_view.replace_text.return_value = 4 ed = mu.logic.Editor(mock_view) ed.show_status_message = mock.MagicMock() ed.find_replace() assert ed.find == 'foo' assert ed.replace == 'bar' assert ed.global_replace is True mock_view.replace_text.assert_called_once_with('foo', 'bar', True) ed.show_status_message.\ assert_called_once_with('Replaced 4 matches of "foo" with "bar".') def test_toggle_comments(): """ Ensure the method in the view for toggling comments on and off is called. """ mock_view = mock.MagicMock() ed = mu.logic.Editor(mock_view) ed.toggle_comments() mock_view.toggle_comments.assert_called_once_with() mu-editor-1.0.2+dfsg/tests/test_resources.py000066400000000000000000000030531341747546300211420ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for the resources sub-module. """ import mu.resources from unittest import mock from PyQt5.QtGui import QIcon, QPixmap def test_path(): """ Ensure the resource_filename function is called with the expected args and the path function under test returns its result. """ with mock.patch('mu.resources.resource_filename', return_value='bar') as r: assert mu.resources.path('foo') == 'bar' r.assert_called_once_with(mu.resources.__name__, 'images/foo') def test_load_icon(): """ Check the load_icon function returns the expected QIcon object. """ result = mu.resources.load_icon('icon') assert isinstance(result, QIcon) def test_load_pixmap(): """ Check the load_pixmap function returns the expected QPixmap object. """ result = mu.resources.load_pixmap('icon') assert isinstance(result, QPixmap) def test_stylesheet(): """ Ensure the resource_string function is called with the expected args and the load_stylesheet function returns its result. """ with mock.patch('mu.resources.resource_string', return_value=b'foo') as rs: assert 'foo' == mu.resources.load_stylesheet('foo') rs.assert_called_once_with(mu.resources.__name__, 'css/foo') def test_load_font_data(): """ Ensure font data can be loaded """ with mock.patch('mu.resources.resource_string', return_value=b'foo') as rs: assert b'foo' == mu.resources.load_font_data('foo') rs.assert_called_once_with(mu.resources.__name__, 'fonts/foo') mu-editor-1.0.2+dfsg/todo.txt000066400000000000000000000002521341747546300160610ustar00rootroot00000000000000* Minification * Add files to hex * Bug fixes to the debugger * Installer for OSX * Tutorials * Documentation * Website * Add "127.0.0.1 localhost" to /etc/hosts on OSX mu-editor-1.0.2+dfsg/utils/000077500000000000000000000000001341747546300155145ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/utils/README.rst000066400000000000000000000002641341747546300172050ustar00rootroot00000000000000Utilities ========= This directory contains utilities used to help maintain Mu. For example, scripts used to extract API documentation for use in Mu's auto-suggest and tool tips. mu-editor-1.0.2+dfsg/utils/adafruit.json000066400000000000000000001533011341747546300202110ustar00rootroot00000000000000[ {"name": "microcontroller.Processor", "args": [], "description": ""}, {"name": "microcontroller.Pin", "args": [], "description": "Identifies an IO pin on the microcontroller. They are fixed by the\nhardware so they cannot be constructed on demand. Instead, use\nboard or microcontroller.pin to reference the desired pin.\n\n"}, {"name": "multiterminal.get_secondary_terminal", "args": [], "description": "Returns the current secondary terminal.\n"}, {"name": "multiterminal.set_secondary_terminal", "args": ["stream"], "description": "Read additional input from the given stream and write out back to it.\nThis doesn\u2019t replace the core stream (usually UART or native USB) but is\nmixed in instead.\n\n\n\n\nParameters:stream (stream) \u2013 secondary stream\n\n\n\n"}, {"name": "multiterminal.clear_secondary_terminal", "args": [], "description": "Clears the secondary terminal.\n"}, {"name": "multiterminal.schedule_secondary_terminal_read", "args": ["socket"], "description": "In cases where the underlying OS is doing task scheduling, this notifies\nthe OS when more data is available on the socket to read. This is useful\nas a callback for lwip sockets.\n"}, {"name": "pulseio.PulseIn", "args": ["pin", "maxlen=2", "*", "idle_state=False"], "description": "Create a PulseIn object associated with the given pin. The object acts as\na read-only sequence of pulse lengths with a given max length. When it is\nactive, new pulse lengths are added to the end of the list. When there is\nno more room (len() == maxlen) the oldest pulse length is removed to\nmake room.\n\n\nParameters:\npin (Pin) \u2013 Pin to read pulses from.\nmaxlen (int) \u2013 Maximum number of pulse durations to store at once\nidle_state (bool) \u2013 Idle state of the pin. At start and after resume\nthe first recorded pulse will the opposite state from idle."}, {"name": "pulseio.PulseIn.deinit", "args": [], "description": "Deinitialises the PulseIn and releases any hardware resources for reuse.\n"}, {"name": "pulseio.PulseIn.maxlen", "args": null, "description": "Returns the maximum length of the PulseIn. When len() is equal to maxlen,\nit is unclear which pulses are active and which are idle.\n"}, {"name": "os.uname", "args": [], "description": "Returns a named tuple of operating specific and CircuitPython port\nspecific information.\n"}, {"name": "os.chdir", "args": ["path"], "description": "Change current directory.\n"}, {"name": "os.getcwd", "args": [], "description": "Get the current directory.\n"}, {"name": "os.listdir", "args": ["dir"], "description": "With no argument, list the current directory. Otherwise list the given directory.\n"}, {"name": "os.mkdir", "args": ["path"], "description": "Create a new directory.\n"}, {"name": "os.remove", "args": ["path"], "description": "Remove a file.\n"}, {"name": "os.rmdir", "args": ["path"], "description": "Remove a directory.\n"}, {"name": "nvm.ByteArray", "args": [], "description": "Not currently dynamically supported. Access the sole instance through microcontroller.nvm.\n\n"}, {"name": "os.rename", "args": ["old_path", "new_path"], "description": "Rename a file.\n"}, {"name": "os.stat", "args": ["path"], "description": "Get the status of a file or directory.\n"}, {"name": "os.statvfs", "args": ["path"], "description": "Get the status of a fileystem.\nReturns a tuple with the filesystem information in the following order:\n\n\nf_bsize \u2013 file system block size\nf_frsize \u2013 fragment size\nf_blocks \u2013 size of fs in f_frsize units\nf_bfree \u2013 number of free blocks\nf_bavail \u2013 number of free blocks for unpriviliged users\nf_files \u2013 number of inodes\nf_ffree \u2013 number of free inodes\nf_favail \u2013 number of free inodes for unpriviliged users\nf_flag \u2013 mount flags\nf_namemax \u2013 maximum filename length\n\n\nParameters related to inodes: f_files, f_ffree, f_avail\nand the f_flags parameter may return 0 as they can be unavailable\nin a port-specific implementation.\n"}, {"name": "os.sync", "args": [], "description": "Sync all filesystems.\n"}, {"name": "os.urandom", "args": ["size"], "description": "Returns a string of size random bytes based on a hardware True Random\nNumber Generator. When not available, it will raise a NotImplementedError.\n"}, {"name": "digitalio.Pull", "args": [], "description": "Enum-like class to define the pull value, if any, used while reading\ndigital values in.\n\n"}, {"name": "digitalio.Pull.UP", "args": null, "description": "When the input line isn\u2019t being driven the pull up can pull the state\nof the line high so it reads as true.\n"}, {"name": "digitalio.Pull.DOWN", "args": null, "description": "When the input line isn\u2019t being driven the pull down can pull the\nstate of the line low so it reads as false.\n"}, {"name": "digitalio.DriveMode", "args": [], "description": "Enum-like class to define the drive mode used when outputting\ndigital values.\n\n"}, {"name": "digitalio.DriveMode.PUSH_PULL", "args": null, "description": "Output both high and low digital values\n"}, {"name": "digitalio.DriveMode.OPEN_DRAIN", "args": null, "description": "Output low digital values but go into high z for digital high. This is\nuseful for i2c and other protocols that share a digital line.\n"}, {"name": "digitalio.DigitalInOut", "args": ["pin"], "description": "Create a new DigitalInOut object associated with the pin. Defaults to input\nwith no pull. Use switch_to_input() and\nswitch_to_output() to change the direction.\n\n\nParameters:pin (Pin) \u2013 The pin to control"}, {"name": "digitalio.DigitalInOut.Direction", "args": [], "description": "Enum-like class to define which direction the digital values are\ngoing.\n\n"}, {"name": "digitalio.DigitalInOut.Direction.INPUT", "args": null, "description": "Read digital data in\n"}, {"name": "digitalio.DigitalInOut.Direction.OUTPUT", "args": null, "description": "Write digital data out\n"}, {"name": "digitalio.DigitalInOut.deinit", "args": [], "description": "Turn off the DigitalInOut and release the pin for other use.\n"}, {"name": "digitalio.DigitalInOut.direction", "args": null, "description": "The direction of the pin.\nSetting this will use the defaults from the corresponding\nswitch_to_input() or switch_to_output() method. If\nyou want to set pull, value or drive mode prior to switching, then use\nthose methods instead.\n"}, {"name": "digitalio.DigitalInOut.value", "args": null, "description": "The digital logic level of the pin.\n"}, {"name": "digitalio.DigitalInOut.drive_mode", "args": null, "description": "Get or set the pin drive mode.\n"}, {"name": "digitalio.DigitalInOut.pull", "args": null, "description": "Get or set the pin pull. Values may be digitalio.Pull.UP,\ndigitalio.Pull.DOWN or None.\n\n\n\n\nRaises:AttributeError \u2013 if the direction is ~`digitalio.Direction.OUTPUT`.\n\n\n\n"}, {"name": "usb_hid.Device", "args": [], "description": "Not currently dynamically supported.\n\n"}, {"name": "usb_hid.Device.send_report", "args": ["buf"], "description": "Send a HID report.\n"}, {"name": "usb_hid.Device.usage_page", "args": null, "description": "The usage page of the device. Can be thought of a category.\n\n\n\n\nReturns:the device\u2019s usage page\n\nReturn type:int\n\n\n\n"}, {"name": "usb_hid.Device.usage", "args": null, "description": "The functionality of the device. For example Keyboard is 0x06 within the\ngeneric desktop usage page 0x01. Mouse is 0x02 within the same usage\npage.\n\n\n\n\nReturns:the usage within the usage page\n\nReturn type:int\n\n\n\n"}, {"name": "touchio.TouchIn", "args": ["pin"], "description": "Use the TouchIn on the given pin.\n\n\nParameters:pin (Pin) \u2013 the pin to read from"}, {"name": "touchio.TouchIn.deinit", "args": [], "description": "Deinitialises the TouchIn and releases any hardware resources for reuse.\n"}, {"name": "touchio.TouchIn.value", "args": null, "description": "Whether the touch pad is being touched or not.\n\n\n\n\nReturns:True when touched, False otherwise.\n\nReturn type:bool\n\n\n\n"}, {"name": "time.struct_time", "args": ["(tm_year", "tm_mon", "tm_mday", "tm_hour", "tm_min", "tm_sec", "tm_wday", "tm_yday", "tm_isdst)"], "description": "Structure used to capture a date and time. Note that it takes a tuple!\n\n\nParameters:\ntm_year (int) \u2013 the year, 2017 for example\ntm_mon (int) \u2013 the month, range [1, 12]\ntm_mday (int) \u2013 the day of the month, range [1, 31]\ntm_hour (int) \u2013 the hour, range [0, 23]\ntm_min (int) \u2013 the minute, range [0, 59]\ntm_sec (int) \u2013 the second, range [0, 61]\ntm_wday (int) \u2013 the day of the week, range [0, 6], Monday is 0\ntm_yday (int) \u2013 the day of the year, range [1, 366], -1 indicates not known\ntm_isdst (int) \u2013 1 when in daylight savings, 0 when not, -1 if unknown."}, {"name": "storage.mount", "args": ["filesystem", "mount_path", "*", "readonly=False"], "description": "Mounts the given filesystem object at the given path.\nThis is the CircuitPython analog to the UNIX mount command.\n"}, {"name": "storage.umount", "args": ["mount"], "description": "Unmounts the given filesystem object or if mount is a path, then unmount\nthe filesystem mounted at that location.\nThis is the CircuitPython analog to the UNIX umount command.\n"}, {"name": "storage.remount", "args": ["mount_path", "readonly"], "description": "Remounts the given path with new parameters.\n"}, {"name": "storage.VfsFat", "args": ["block_device"], "description": "Create a new VfsFat filesystem around the given block device.\n\n\nParameters:block_device \u2013 Block device the the filesystem lives on"}, {"name": "pulseio.PWMOut", "args": ["pin", "*", "duty_cycle=0", "frequency=500", "variable_frequency=False"], "description": "Create a PWM object associated with the given pin. This allows you to\nwrite PWM signals out on the given pin. Frequency is fixed after init\nunless variable_frequency is True.\n\n\nParameters:\npin (Pin) \u2013 The pin to output to\nduty_cycle (int) \u2013 The fraction of each pulse which is high. 16-bit\nfrequency (int) \u2013 The target frequency in Hertz (32-bit)\nvariable_frequency (bool) \u2013 True if the frequency will change over time"}, {"name": "pulseio.PulseOut", "args": ["carrier"], "description": "Create a PulseOut object associated with the given PWM out experience.\n\n\nParameters:carrier (PWMOut) \u2013 PWMOut that is set to output on the desired pin."}, {"name": "pulseio.PWMOut.deinit", "args": [], "description": "Deinitialises the PWMOut and releases any hardware resources for reuse.\n"}, {"name": "pulseio.PWMOut.duty_cycle", "args": null, "description": "16 bit value that dictates how much of one cycle is high (1) versus low\n(0). 0xffff will always be high, 0 will always be low and 0x7fff will\nbe half high and then half low.\n"}, {"name": "pulseio.PWMOut.frequency", "args": null, "description": "32 bit value that dictates the PWM frequency in Hertz (cycles per\nsecond). Only writeable when constructed with variable_frequency=True.\n"}, {"name": "random.seed", "args": ["seed"], "description": "Sets the starting seed of the random number generation. Further calls to\nrandom will return deterministic results afterwards.\n"}, {"name": "random.getrandbits", "args": ["k"], "description": "Returns an integer with k random bits.\n"}, {"name": "random.randrange", "args": ["stop"], "description": "Returns a randomly selected integer from range(start, stop, step).\n"}, {"name": "random.randint", "args": ["a", "b"], "description": "Returns a randomly selected integer between a and b inclusive. Equivalent\nto randrange(a, b + 1, 1)\n"}, {"name": "random.choice", "args": ["seq"], "description": "Returns a randomly selected element from the given sequence. Raises\nIndexError when the sequence is empty.\n"}, {"name": "random.random", "args": [], "description": "Returns a random float between 0 and 1.0.\n"}, {"name": "pulseio.PulseOut.deinit", "args": [], "description": "Deinitialises the PulseOut and releases any hardware resources for reuse.\n"}, {"name": "random.uniform", "args": ["a", "b"], "description": "Returns a random float between a and b. It may or may not be inclusive\ndepending on float rounding.\n"}, {"name": "busio.UART", "args": ["tx", "rx", "*", "baudrate=9600", "bits=8", "parity=None", "stop=1", "timeout=1000", "receiver_buffer_size=64"], "description": "A common bidirectional serial protocol that uses an an agreed upon speed\nrather than a shared clock line.\n\n\nParameters:\ntx (Pin) \u2013 the pin to transmit with\nrx (Pin) \u2013 the pin to receive on\nbaudrate (int) \u2013 the transmit and receive speed"}, {"name": "busio.SPI", "args": ["clock", "MOSI=None", "MISO=None"], "description": "\nParameters:\nclock (Pin) \u2013 the pin to use for the clock.\nMOSI (Pin) \u2013 the Master Out Slave In pin.\nMISO (Pin) \u2013 the Master In Slave Out pin."}, {"name": "busio.OneWire", "args": ["pin"], "description": "Create a OneWire object associated with the given pin. The object\nimplements the lowest level timing-sensitive bits of the protocol.\n\n\nParameters:pin (Pin) \u2013 Pin connected to the OneWire bus"}, {"name": "busio.OneWire.deinit", "args": [], "description": "Deinitialize the OneWire bus and release any hardware resources for reuse.\n"}, {"name": "busio.I2C", "args": ["scl", "sda", "*", "frequency=400000"], "description": "I2C is a two-wire protocol for communicating between devices. At the\nphysical level it consists of 2 wires: SCL and SDA, the clock and data\nlines respectively.\n\n\nParameters:\nscl (Pin) \u2013 The clock pin\nsda (Pin) \u2013 The data pin\nfrequency (int) \u2013 The clock frequency in Hertz"}, {"name": "busio.UART.deinit", "args": [], "description": "Deinitialises the UART and releases any hardware resources for reuse.\n"}, {"name": "busio.UART.Parity", "args": [], "description": "Enum-like class to define the parity used to verify correct data transfer.\n\n"}, {"name": "busio.UART.Parity.ODD", "args": null, "description": "Total number of ones should be odd.\n"}, {"name": "busio.UART.Parity.EVEN", "args": null, "description": "Total number of ones should be even.\n"}, {"name": "busio.SPI.deinit", "args": [], "description": "Turn off the SPI bus.\n"}, {"name": "busio.I2C.deinit", "args": [], "description": "Releases control of the underlying hardware so other classes can use it.\n"}, {"name": "bitbangio.OneWire", "args": ["pin"], "description": "Create a OneWire object associated with the given pin. The object\nimplements the lowest level timing-sensitive bits of the protocol.\n\n\nParameters:pin (Pin) \u2013 Pin to read pulses from."}, {"name": "bitbangio.OneWire.deinit", "args": [], "description": "Deinitialize the OneWire bus and release any hardware resources for reuse.\n"}, {"name": "bitbangio.SPI", "args": ["clock", "MOSI=None", "MISO=None"], "description": "\nParameters:\nclock (Pin) \u2013 the pin to use for the clock.\nMOSI (Pin) \u2013 the Master Out Slave In pin.\nMISO (Pin) \u2013 the Master In Slave Out pin."}, {"name": "bitbangio.I2C", "args": ["scl", "sda", "*", "frequency=400000"], "description": "I2C is a two-wire protocol for communicating between devices. At the\nphysical level it consists of 2 wires: SCL and SDA, the clock and data\nlines respectively.\n\n\nParameters:\nscl (Pin) \u2013 The clock pin\nsda (Pin) \u2013 The data pin\nfrequency (int) \u2013 The clock frequency of the bus"}, {"name": "bitbangio.SPI.deinit", "args": [], "description": "Turn off the SPI bus.\n"}, {"name": "bitbangio.I2C.deinit", "args": [], "description": "Releases control of the underlying hardware so other classes can use it.\n"}, {"name": "audioio.AudioOut", "args": ["pin", "sample_source"], "description": "Create a AudioOut object associated with the given pin. This allows you to\nplay audio signals out on the given pin. Sample_source must be a bytes-like object.\n\nThe sample itself should consist of 16 bit samples and be mono.\nMicrocontrollers with a lower output resolution will use the highest order\nbits to output. For example, the SAMD21 has a 10 bit DAC that ignores the\nlowest 6 bits when playing 16 bit samples.\n\n\nParameters:\npin (Pin) \u2013 The pin to output to\nsample_source (bytes-like) \u2013 The source of the sample"}, {"name": "audioio.AudioOut.deinit", "args": [], "description": "Deinitialises the PWMOut and releases any hardware resources for reuse.\n"}, {"name": "audioio.AudioOut.playing", "args": null, "description": "True when the audio sample is being output.\n"}, {"name": "audioio.AudioOut.frequency", "args": null, "description": "32 bit value that dictates how quickly samples are loaded into the DAC\nin Hertz (cycles per second). When the sample is looped, this can change\nthe pitch output without changing the underlying sample.\n"}, {"name": "audiobusio.PDMIn", "args": ["clock_pin", "data_pin", "*", "frequency=8000", "bit_depth=8", "mono=True", "oversample=64"], "description": "Create a PDMIn object associated with the given pins. This allows you to\nrecord audio signals from the given pins. Individual ports may put further\nrestrictions on the recording parameters.\n\n\nParameters:\nclock_pin (Pin) \u2013 The pin to output the clock to\ndata_pin (Pin) \u2013 The pin to read the data from\nfrequency (int) \u2013 Target frequency of the resulting samples. Check frequency for real value.\nbit_depth (int) \u2013 Final number of bits per sample. Must be divisible by 8\nmono (bool) \u2013 True when capturing a single channel of audio, captures two channels otherwise\noversample (int) \u2013 Number of single bit samples to decimate into a final sample. Must be divisible by 8"}, {"name": "audiobusio.PDMIn.deinit", "args": [], "description": "Deinitialises the PWMOut and releases any hardware resources for reuse.\n"}, {"name": "audiobusio.PDMIn.frequency", "args": null, "description": "The actual frequency of the recording. This may not match the constructed\nfrequency due to internal clock limitations.\n"}, {"name": "analogio.AnalogOut", "args": ["pin"], "description": "Use the AnalogOut on the given pin.\n\n\nParameters:pin (Pin) \u2013 the pin to output to"}, {"name": "analogio.AnalogOut.deinit", "args": [], "description": "Turn off the AnalogOut and release the pin for other use.\n"}, {"name": "analogio.AnalogOut.value", "args": null, "description": "The value on the analog pin. The value must be between 0 and 65535\ninclusive (16-bit). Even if the underlying digital to analog converter\nis lower resolution, the input must be scaled to be 16-bit.\n\n\n\n\nReturns:the last value written\n\nReturn type:int\n\n\n\n"}, {"name": "analogio.AnalogIn", "args": ["pin"], "description": "Use the AnalogIn on the given pin. The reference voltage varies by\nplatform so use reference_voltage to read the configured setting.\n\n\nParameters:pin (Pin) \u2013 the pin to read from"}, {"name": "analogio.AnalogIn.deinit", "args": [], "description": "Turn off the AnalogIn and release the pin for other use.\n"}, {"name": "analogio.AnalogIn.value", "args": null, "description": "Read the value on the analog pin and return it. The returned value\nwill be between 0 and 65535 inclusive (16-bit). Even if the underlying\nanalog to digital converter (ADC) is lower resolution, the result will\nbe scaled to be 16-bit.\n\n\n\n\nReturns:the data read\n\nReturn type:int\n\n\n\n"}, {"name": "analogio.AnalogIn.reference_voltage", "args": null, "description": "The maximum voltage measurable. Also known as the reference voltage.\n\n\n\n\nReturns:the reference voltage\n\nReturn type:float\n\n\n\n"}, {"name": "_stage.render", "args": ["x0", "y0", "x1", "y1", "layers", "buffer", "spi"], "description": "Render and send to the display a fragment of the screen.\n\n\n\n\nParameters:\nx0 (int) \u2013 Left edge of the fragment.\ny0 (int) \u2013 Top edge of the fragment.\nx1 (int) \u2013 Right edge of the fragment.\ny1 (int) \u2013 Bottom edge of the fragment.\nlayers (list) \u2013 A list of the Layer objects.\nbuffer (bytearray) \u2013 A buffer to use for rendering.\nspi (SPI) \u2013 The SPI bus to use.\n\n\n\n\n\nNote that this function only sends the raw pixel data. Setting up\nthe display for receiving it and handling the chip-select and\ndata-command pins has to be done outside of it.\nThere are also no sanity checks, outside of the basic overflow\nchecking. The caller is responsible for making the passed parameters\nvalid.\nThis function is intended for internal use in the stage library\nand all the necessary checks are performed there.\n"}, {"name": "digitalio.DriveMode", "args": [], "description": "Enum-like class to define the drive mode used when outputting\ndigital values.\n\n"}, {"name": "digitalio.DriveMode.PUSH_PULL", "args": null, "description": "Output both high and low digital values\n"}, {"name": "digitalio.DriveMode.OPEN_DRAIN", "args": null, "description": "Output low digital values but go into high z for digital high. This is\nuseful for i2c and other protocols that share a digital line.\n"}, {"name": "microcontroller.Processor", "args": [], "description": "You cannot create an instance of microcontroller.Processor.\nUse microcontroller.cpu to access the sole instance available.\n\n"}, {"name": "microcontroller.Processor.frequency", "args": null, "description": "The CPU operating frequency as an int, in Hertz. (read-only)\n"}, {"name": "microcontroller.Processor.temperature", "args": null, "description": "The on-chip temperature, in Celsius, as a float. (read-only)\nIs None if the temperature is not available.\n"}, {"name": "microcontroller.Processor.uid", "args": null, "description": "The unique id (aka serial number) of the chip as a bytearray. (read-only)\n"}, {"name": "digitalio.DigitalInOut.Direction", "args": [], "description": "Enum-like class to define which direction the digital values are\ngoing.\n\n"}, {"name": "digitalio.DigitalInOut.Direction.INPUT", "args": null, "description": "Read digital data in\n"}, {"name": "digitalio.DigitalInOut.Direction.OUTPUT", "args": null, "description": "Write digital data out\n"}, {"name": "gamepad.GamePad", "args": ["b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8"], "description": "Initializes button scanning routines.\n\nThe b1-b8 parameters are DigitalInOut objects, which\nimmediately get switched to input with a pull-up, and then scanned\nregularly for button presses. The order is the same as the order of\nbits returned by the get_pressed function. You can re-initialize\nit with different keys, then the new object will replace the previous\none.\n\nThe basic feature required here is the ability to poll the keys at\nregular intervals (so that de-bouncing is consistent) and fast enough\n(so that we don\u2019t miss short button presses) while at the same time\nletting the user code run normally, call blocking functions and wait\non delays.\n\nThey button presses are accumulated, until the get_pressed method\nis called, at which point the button state is cleared, and the new\nbutton presses start to be recorded.\n\n"}, {"name": "gamepad.GamePad.get_pressed", "args": [], "description": "Get the status of buttons pressed since the last call and clear it.\nReturns an 8-bit number, with bits that correspond to buttons,\nwhich have been pressed (or held down) since the last call to this\nfunction set to 1, and the remaining bits set to 0. Then it clears\nthe button state, so that new button presses (or buttons that are\nheld down) can be recorded for the next call.\n"}, {"name": "gamepad.GamePad.deinit", "args": [], "description": "Disable button scanning.\n"}, {"name": "math.acos", "args": ["x"], "description": "Return the inverse cosine of x.\n"}, {"name": "math.asin", "args": ["x"], "description": "Return the inverse sine of x.\n"}, {"name": "math.atan", "args": ["x"], "description": "Return the inverse tangent of x.\n"}, {"name": "math.atan2", "args": ["y", "x"], "description": "Return the principal value of the inverse tangent of y/x.\n"}, {"name": "microcontroller.Pin", "args": [], "description": "Identifies an IO pin on the microcontroller. They are fixed by the\nhardware so they cannot be constructed on demand. Instead, use\nboard or microcontroller.pin to reference the desired pin.\n\n"}, {"name": "math.ceil", "args": ["x"], "description": "Return an integer, being x rounded towards positive infinity.\n"}, {"name": "math.copysign", "args": ["x", "y"], "description": "Return x with the sign of y.\n"}, {"name": "math.cos", "args": ["x"], "description": "Return the cosine of x.\n"}, {"name": "math.degrees", "args": ["x"], "description": "Return radians x converted to degrees.\n"}, {"name": "math.exp", "args": ["x"], "description": "Return the exponential of x.\n"}, {"name": "math.fabs", "args": ["x"], "description": "Return the absolute value of x.\n"}, {"name": "math.floor", "args": ["x"], "description": "Return an integer, being x rounded towards negative infinity.\n"}, {"name": "math.fmod", "args": ["x", "y"], "description": "Return the remainder of x/y.\n"}, {"name": "math.frexp", "args": ["x"], "description": "Decomposes a floating-point number into its mantissa and exponent.\nThe returned value is the tuple (m, e) such that x == m * 2**e\nexactly. If x == 0 then the function returns (0.0, 0), otherwise\nthe relation 0.5 <= abs(m) < 1 holds.\n"}, {"name": "math.isfinite", "args": ["x"], "description": "Return True if x is finite.\n"}, {"name": "math.isinf", "args": ["x"], "description": "Return True if x is infinite.\n"}, {"name": "math.isnan", "args": ["x"], "description": "Return True if x is not-a-number\n"}, {"name": "math.ldexp", "args": ["x", "exp"], "description": "Return x * (2**exp).\n"}, {"name": "digitalio.Pull", "args": [], "description": "Enum-like class to define the pull value, if any, used while reading\ndigital values in.\n\n"}, {"name": "digitalio.Pull.UP", "args": null, "description": "When the input line isn\u2019t being driven the pull up can pull the state\nof the line high so it reads as true.\n"}, {"name": "digitalio.Pull.DOWN", "args": null, "description": "When the input line isn\u2019t being driven the pull down can pull the\nstate of the line low so it reads as false.\n"}, {"name": "digitalio.DigitalInOut", "args": ["pin"], "description": "Create a new DigitalInOut object associated with the pin. Defaults to input\nwith no pull. Use switch_to_input() and\nswitch_to_output() to change the direction.\n\n\nParameters:pin (Pin) \u2013 The pin to control"}, {"name": "math.modf", "args": ["x"], "description": "Return a tuple of two floats, being the fractional and integral parts of\nx. Both return values have the same sign as x.\n"}, {"name": "math.pow", "args": ["x", "y"], "description": "Returns x to the power of y.\n"}, {"name": "math.radians", "args": ["x"], "description": "Return degrees x converted to radians.\n"}, {"name": "math.sin", "args": ["x"], "description": "Return the sine of x.\n"}, {"name": "math.sqrt", "args": ["x"], "description": "Returns the square root of x.\n"}, {"name": "math.tan", "args": ["x"], "description": "Return the tangent of x.\n"}, {"name": "math.trunc", "args": ["x"], "description": "Return an integer, being x rounded towards 0.\n"}, {"name": "digitalio.DigitalInOut.deinit", "args": [], "description": "Turn off the DigitalInOut and release the pin for other use.\n"}, {"name": "digitalio.DigitalInOut.direction", "args": null, "description": "The direction of the pin.\nSetting this will use the defaults from the corresponding\nswitch_to_input() or switch_to_output() method. If\nyou want to set pull, value or drive mode prior to switching, then use\nthose methods instead.\n"}, {"name": "digitalio.DigitalInOut.value", "args": null, "description": "The digital logic level of the pin.\n"}, {"name": "digitalio.DigitalInOut.drive_mode", "args": null, "description": "The pin drive mode. One of:\n\ndigitalio.DriveMode.PUSH_PULL\ndigitalio.DriveMode.OPEN_DRAIN\n\n"}, {"name": "digitalio.DigitalInOut.pull", "args": null, "description": "The pin pull direction. One of:\n\ndigitalio.Pull.UP\ndigitalio.Pull.DOWN\nNone\n\n\n\n\n\nRaises:AttributeError \u2013 if direction is OUTPUT.\n\n\n\n"}, {"name": "busio.UART", "args": ["tx", "rx", "*", "baudrate=9600", "bits=8", "parity=None", "stop=1", "timeout=1000", "receiver_buffer_size=64"], "description": "A common bidirectional serial protocol that uses an an agreed upon speed\nrather than a shared clock line.\n\n\nParameters:\ntx (Pin) \u2013 the pin to transmit with, or None if this UART is receive-only.\nrx (Pin) \u2013 the pin to receive on, or None if this UART is transmit-only.\nbaudrate (int) \u2013 the transmit and receive speed."}, {"name": "busio.SPI", "args": ["clock", "MOSI=None", "MISO=None"], "description": "\nParameters:\nclock (Pin) \u2013 the pin to use for the clock.\nMOSI (Pin) \u2013 the Master Out Slave In pin.\nMISO (Pin) \u2013 the Master In Slave Out pin."}, {"name": "busio.OneWire", "args": ["pin"], "description": "Create a OneWire object associated with the given pin. The object\nimplements the lowest level timing-sensitive bits of the protocol.\n\n\nParameters:pin (Pin) \u2013 Pin connected to the OneWire bus"}, {"name": "busio.UART.deinit", "args": [], "description": "Deinitialises the UART and releases any hardware resources for reuse.\n"}, {"name": "busio.UART.baudrate", "args": null, "description": "The current baudrate.\n"}, {"name": "busio.UART.Parity", "args": [], "description": "Enum-like class to define the parity used to verify correct data transfer.\n\n"}, {"name": "busio.UART.Parity.ODD", "args": null, "description": "Total number of ones should be odd.\n"}, {"name": "busio.UART.Parity.EVEN", "args": null, "description": "Total number of ones should be even.\n"}, {"name": "busio.SPI.deinit", "args": [], "description": "Turn off the SPI bus.\n"}, {"name": "busio.SPI.frequency", "args": null, "description": "The actual SPI bus frequency. This may not match the frequency requested\ndue to internal limitations.\n"}, {"name": "busio.OneWire.deinit", "args": [], "description": "Deinitialize the OneWire bus and release any hardware resources for reuse.\n"}, {"name": "busio.I2C", "args": ["scl", "sda", "*", "frequency=400000"], "description": "I2C is a two-wire protocol for communicating between devices. At the\nphysical level it consists of 2 wires: SCL and SDA, the clock and data\nlines respectively.\n\n\nParameters:\nscl (Pin) \u2013 The clock pin\nsda (Pin) \u2013 The data pin\nfrequency (int) \u2013 The clock frequency in Hertz\ntimeout (int) \u2013 The maximum clock stretching timeut - only for bitbang"}, {"name": "usb_hid.Device", "args": [], "description": "Not currently dynamically supported.\n\n"}, {"name": "usb_hid.Device.send_report", "args": ["buf"], "description": "Send a HID report.\n"}, {"name": "usb_hid.Device.usage_page", "args": null, "description": "The usage page of the device as an int. Can be thought of a category. (read-only)\n"}, {"name": "usb_hid.Device.usage", "args": null, "description": "The functionality of the device as an int. (read-only)\nFor example, Keyboard is 0x06 within the generic desktop usage page 0x01.\nMouse is 0x02 within the same usage page.\n"}, {"name": "busio.I2C.deinit", "args": [], "description": "Releases control of the underlying hardware so other classes can use it.\n"}, {"name": "touchio.TouchIn", "args": ["pin"], "description": "Use the TouchIn on the given pin.\n\n\nParameters:pin (Pin) \u2013 the pin to read from"}, {"name": "touchio.TouchIn.deinit", "args": [], "description": "Deinitialises the TouchIn and releases any hardware resources for reuse.\n"}, {"name": "touchio.TouchIn.value", "args": null, "description": "Whether the touch pad is being touched or not. (read-only)\nTrue when raw_value > threshold.\n"}, {"name": "touchio.TouchIn.raw_value", "args": null, "description": "The raw touch measurement as an int. (read-only)\n"}, {"name": "touchio.TouchIn.threshold", "args": null, "description": "Minimum raw_value needed to detect a touch (and for value to be True).\nWhen the TouchIn object is created, an initial raw_value is read from the pin,\nand then threshold is set to be 100 + that value.\nYou can adjust threshold to make the pin more or less sensitive.\n"}, {"name": "supervisor.Runtime", "args": [], "description": "You cannot create an instance of supervisor.Runtime.\nUse supervisor.runtime to access the sole instance available.\n\n"}, {"name": "supervisor.Runtime.serial_connected", "args": null, "description": "Returns the USB serial communication status (read-only).\n"}, {"name": "struct.calcsize", "args": ["fmt"], "description": "Return the number of bytes needed to store the given fmt.\n"}, {"name": "struct.pack", "args": ["fmt", "v1", "v2", "..."], "description": "Pack the values v1, v2, \u2026 according to the format string fmt.\nThe return value is a bytes object encoding the values.\n"}, {"name": "struct.pack_into", "args": ["fmt", "buffer", "offset", "v1", "v2", "..."], "description": "Pack the values v1, v2, \u2026 according to the format string fmt into a buffer\nstarting at offset. offset may be negative to count from the end of buffer.\n"}, {"name": "struct.unpack", "args": ["fmt", "data"], "description": "Unpack from the data according to the format string fmt. The return value\nis a tuple of the unpacked values.\n"}, {"name": "struct.unpack_from", "args": ["fmt", "data", "offset"], "description": "Unpack from the data starting at offset according to the format string fmt.\noffset may be negative to count from the end of buffer. The return value is\na tuple of the unpacked values.\n"}, {"name": "time.struct_time", "args": ["(tm_year", "tm_mon", "tm_mday", "tm_hour", "tm_min", "tm_sec", "tm_wday", "tm_yday", "tm_isdst)"], "description": "Structure used to capture a date and time. Note that it takes a tuple!\n\n\nParameters:\ntm_year (int) \u2013 the year, 2017 for example\ntm_mon (int) \u2013 the month, range [1, 12]\ntm_mday (int) \u2013 the day of the month, range [1, 31]\ntm_hour (int) \u2013 the hour, range [0, 23]\ntm_min (int) \u2013 the minute, range [0, 59]\ntm_sec (int) \u2013 the second, range [0, 61]\ntm_wday (int) \u2013 the day of the week, range [0, 6], Monday is 0\ntm_yday (int) \u2013 the day of the year, range [1, 366], -1 indicates not known\ntm_isdst (int) \u2013 1 when in daylight savings, 0 when not, -1 if unknown."}, {"name": "rtc.set_time_source", "args": ["rtc"], "description": "Sets the rtc time source used by time.localtime().\nThe default is rtc.RTC().\nExample usage:\nimport rtc\nimport time\n\nclass RTC(object):\n @property\n def datetime(self):\n return time.struct_time((2018, 3, 17, 21, 1, 47, 0, 0, 0))\n\nr = RTC()\nrtc.set_time_source(r)\n\n\n"}, {"name": "rtc.RTC", "args": [], "description": "This class represents the onboard Real Time Clock. It is a singleton and will always return the same instance.\n\n"}, {"name": "rtc.RTC.datetime", "args": null, "description": "The date and time of the RTC.\n"}, {"name": "rtc.RTC.calibration", "args": null, "description": "The RTC calibration value.\nA positive value speeds up the clock and a negative value slows it down.\nRange and value is hardware specific, but one step is often approx. 1 ppm.\n"}, {"name": "storage.mount", "args": ["filesystem", "mount_path", "*", "readonly=False"], "description": "Mounts the given filesystem object at the given path.\nThis is the CircuitPython analog to the UNIX mount command.\n"}, {"name": "storage.umount", "args": ["mount"], "description": "Unmounts the given filesystem object or if mount is a path, then unmount\nthe filesystem mounted at that location.\nThis is the CircuitPython analog to the UNIX umount command.\n"}, {"name": "storage.remount", "args": ["mount_path", "readonly=False"], "description": "Remounts the given path with new parameters.\n"}, {"name": "storage.getmount", "args": ["mount_path"], "description": "Retrieves the mount object associated with the mount path\n"}, {"name": "storage.erase_filesystem", "args": [], "description": "Erase and re-create the CIRCUITPY filesystem.\nOn boards that present USB-visible CIRCUITPY drive (e.g., SAMD21 and SAMD51),\nthen call microcontroller.reset() to restart CircuitPython and have the\nhost computer remount CIRCUITPY.\nThis function can be called from the REPL when CIRCUITPY\nhas become corrupted.\n\nWarning\nAll the data on CIRCUITPY will be lost, and\nCircuitPython will restart on certain boards.\n\n"}, {"name": "storage.VfsFat", "args": ["block_device"], "description": "Create a new VfsFat filesystem around the given block device.\n\n\nParameters:block_device \u2013 Block device the the filesystem lives on"}, {"name": "storage.VfsFat.mkfs", "args": [], "description": "Format the block device, deleting any data that may have been there\n"}, {"name": "storage.VfsFat.open", "args": ["path", "mode"], "description": "Like builtin open()\n"}, {"name": "storage.VfsFat.ilistdir", "args": ["path"], "description": "Return an iterator whose values describe files and folders within\npath\n"}, {"name": "storage.VfsFat.mkdir", "args": ["path"], "description": "Like os.mkdir\n"}, {"name": "storage.VfsFat.rmdir", "args": ["path"], "description": "Like os.rmdir\n"}, {"name": "storage.VfsFat.stat", "args": ["path"], "description": "Like os.stat\n"}, {"name": "storage.VfsFat.statvfs", "args": ["path"], "description": "Like os.statvfs\n"}, {"name": "storage.VfsFat.mount", "args": ["readonly", "mkfs"], "description": "Don\u2019t call this directly, call storage.mount.\n"}, {"name": "storage.VfsFat.umount", "args": [], "description": "Don\u2019t call this directly, call storage.umount.\n"}, {"name": "storage.VfsFat.label", "args": null, "description": "The filesystem label, up to 11 case-insensitive bytes. Note that\nthis property can only be set when the device is writable by the\nmicrocontroller.\n"}, {"name": "random.seed", "args": ["seed"], "description": "Sets the starting seed of the random number generation. Further calls to\nrandom will return deterministic results afterwards.\n"}, {"name": "random.getrandbits", "args": ["k"], "description": "Returns an integer with k random bits.\n"}, {"name": "random.randrange", "args": ["stop"], "description": "Returns a randomly selected integer from range(start, stop, step).\n"}, {"name": "random.randint", "args": ["a", "b"], "description": "Returns a randomly selected integer between a and b inclusive. Equivalent\nto randrange(a, b + 1, 1)\n"}, {"name": "random.choice", "args": ["seq"], "description": "Returns a randomly selected element from the given sequence. Raises\nIndexError when the sequence is empty.\n"}, {"name": "random.random", "args": [], "description": "Returns a random float between 0 and 1.0.\n"}, {"name": "rotaryio.IncrementalEncoder", "args": ["pin_a", "pin_b"], "description": "Create an IncrementalEncoder object associated with the given pins. It tracks the positional\nstate of an incremental rotary encoder (also known as a quadrature encoder.) Position is\nrelative to the position when the object is contructed.\n\n\nParameters:\npin_a (Pin) \u2013 First pin to read pulses from.\npin_b (Pin) \u2013 Second pin to read pulses from."}, {"name": "rotaryio.IncrementalEncoder.deinit", "args": [], "description": "Deinitializes the IncrementalEncoder and releases any hardware resources for reuse.\n"}, {"name": "rotaryio.IncrementalEncoder.position", "args": null, "description": "The current position in terms of pulses. The number of pulses per rotation is defined by the\nspecific hardware.\n"}, {"name": "random.uniform", "args": ["a", "b"], "description": "Returns a random float between a and b. It may or may not be inclusive\ndepending on float rounding.\n"}, {"name": "pulseio.PWMOut", "args": ["pin", "*", "duty_cycle=0", "frequency=500", "variable_frequency=False"], "description": "Create a PWM object associated with the given pin. This allows you to\nwrite PWM signals out on the given pin. Frequency is fixed after init\nunless variable_frequency is True.\n\n\nParameters:\npin (Pin) \u2013 The pin to output to\nduty_cycle (int) \u2013 The fraction of each pulse which is high. 16-bit\nfrequency (int) \u2013 The target frequency in Hertz (32-bit)\nvariable_frequency (bool) \u2013 True if the frequency will change over time"}, {"name": "pulseio.PulseOut", "args": ["carrier"], "description": "Create a PulseOut object associated with the given PWM out experience.\n\n\nParameters:carrier (PWMOut) \u2013 PWMOut that is set to output on the desired pin."}, {"name": "pulseio.PulseOut.deinit", "args": [], "description": "Deinitialises the PulseOut and releases any hardware resources for reuse.\n"}, {"name": "pulseio.PulseIn", "args": ["pin", "maxlen=2", "*", "idle_state=False"], "description": "Create a PulseIn object associated with the given pin. The object acts as\na read-only sequence of pulse lengths with a given max length. When it is\nactive, new pulse lengths are added to the end of the list. When there is\nno more room (len() == maxlen) the oldest pulse length is removed to\nmake room.\n\n\nParameters:\npin (Pin) \u2013 Pin to read pulses from.\nmaxlen (int) \u2013 Maximum number of pulse durations to store at once\nidle_state (bool) \u2013 Idle state of the pin. At start and after resume\nthe first recorded pulse will the opposite state from idle."}, {"name": "pulseio.PWMOut.deinit", "args": [], "description": "Deinitialises the PWMOut and releases any hardware resources for reuse.\n"}, {"name": "pulseio.PWMOut.duty_cycle", "args": null, "description": "16 bit value that dictates how much of one cycle is high (1) versus low\n(0). 0xffff will always be high, 0 will always be low and 0x7fff will\nbe half high and then half low.\n"}, {"name": "pulseio.PWMOut.frequency", "args": null, "description": "32 bit value that dictates the PWM frequency in Hertz (cycles per\nsecond). Only writeable when constructed with variable_frequency=True.\n"}, {"name": "pulseio.PulseIn.deinit", "args": [], "description": "Deinitialises the PulseIn and releases any hardware resources for reuse.\n"}, {"name": "pulseio.PulseIn.maxlen", "args": null, "description": "The maximum length of the PulseIn. When len() is equal to maxlen,\nit is unclear which pulses are active and which are idle.\n"}, {"name": "pulseio.PulseIn.paused", "args": null, "description": "True when pulse capture is paused as a result of pause() or an error during capture\nsuch as a signal that is too fast.\n"}, {"name": "os.uname", "args": [], "description": "Returns a named tuple of operating specific and CircuitPython port\nspecific information.\n"}, {"name": "os.chdir", "args": ["path"], "description": "Change current directory.\n"}, {"name": "os.getcwd", "args": [], "description": "Get the current directory.\n"}, {"name": "os.listdir", "args": ["dir"], "description": "With no argument, list the current directory. Otherwise list the given directory.\n"}, {"name": "os.mkdir", "args": ["path"], "description": "Create a new directory.\n"}, {"name": "os.remove", "args": ["path"], "description": "Remove a file.\n"}, {"name": "nvm.ByteArray", "args": [], "description": "Not currently dynamically supported. Access the sole instance through microcontroller.nvm.\n\n"}, {"name": "os.rmdir", "args": ["path"], "description": "Remove a directory.\n"}, {"name": "os.rename", "args": ["old_path", "new_path"], "description": "Rename a file.\n"}, {"name": "os.stat", "args": ["path"], "description": "Get the status of a file or directory.\n"}, {"name": "os.statvfs", "args": ["path"], "description": "Get the status of a fileystem.\nReturns a tuple with the filesystem information in the following order:\n\n\nf_bsize \u2013 file system block size\nf_frsize \u2013 fragment size\nf_blocks \u2013 size of fs in f_frsize units\nf_bfree \u2013 number of free blocks\nf_bavail \u2013 number of free blocks for unpriviliged users\nf_files \u2013 number of inodes\nf_ffree \u2013 number of free inodes\nf_favail \u2013 number of free inodes for unpriviliged users\nf_flag \u2013 mount flags\nf_namemax \u2013 maximum filename length\n\n\nParameters related to inodes: f_files, f_ffree, f_avail\nand the f_flags parameter may return 0 as they can be unavailable\nin a port-specific implementation.\n"}, {"name": "os.sync", "args": [], "description": "Sync all filesystems.\n"}, {"name": "os.urandom", "args": ["size"], "description": "Returns a string of size random bytes based on a hardware True Random\nNumber Generator. When not available, it will raise a NotImplementedError.\n"}, {"name": "microcontroller.RunMode", "args": [], "description": "Enum-like class to define the run mode of the microcontroller and\nCircuitPython.\n\n"}, {"name": "microcontroller.RunMode.NORMAL", "args": null, "description": "Run CircuitPython as normal.\n"}, {"name": "microcontroller.RunMode.SAFE_MODE", "args": null, "description": "Run CircuitPython in safe mode. User code will not be run and the\nfile system will be writeable over USB.\n"}, {"name": "microcontroller.RunMode.BOOTLOADER", "args": null, "description": "Run the bootloader.\n"}, {"name": "multiterminal.get_secondary_terminal", "args": [], "description": "Returns the current secondary terminal.\n"}, {"name": "multiterminal.set_secondary_terminal", "args": ["stream"], "description": "Read additional input from the given stream and write out back to it.\nThis doesn\u2019t replace the core stream (usually UART or native USB) but is\nmixed in instead.\n\n\n\n\nParameters:stream (stream) \u2013 secondary stream\n\n\n\n"}, {"name": "multiterminal.clear_secondary_terminal", "args": [], "description": "Clears the secondary terminal.\n"}, {"name": "multiterminal.schedule_secondary_terminal_read", "args": ["socket"], "description": "In cases where the underlying OS is doing task scheduling, this notifies\nthe OS when more data is available on the socket to read. This is useful\nas a callback for lwip sockets.\n"}, {"name": "bitbangio.OneWire", "args": ["pin"], "description": "Create a OneWire object associated with the given pin. The object\nimplements the lowest level timing-sensitive bits of the protocol.\n\n\nParameters:pin (Pin) \u2013 Pin to read pulses from."}, {"name": "bitbangio.OneWire.deinit", "args": [], "description": "Deinitialize the OneWire bus and release any hardware resources for reuse.\n"}, {"name": "bitbangio.SPI", "args": ["clock", "MOSI=None", "MISO=None"], "description": "\nParameters:\nclock (Pin) \u2013 the pin to use for the clock.\nMOSI (Pin) \u2013 the Master Out Slave In pin.\nMISO (Pin) \u2013 the Master In Slave Out pin."}, {"name": "bitbangio.SPI.deinit", "args": [], "description": "Turn off the SPI bus.\n"}, {"name": "bitbangio.I2C", "args": ["scl", "sda", "*", "frequency=400000"], "description": "I2C is a two-wire protocol for communicating between devices. At the\nphysical level it consists of 2 wires: SCL and SDA, the clock and data\nlines respectively.\n\n\nParameters:\nscl (Pin) \u2013 The clock pin\nsda (Pin) \u2013 The data pin\nfrequency (int) \u2013 The clock frequency of the bus\ntimeout (int) \u2013 The maximum clock stretching timeout in microseconds"}, {"name": "bitbangio.I2C.deinit", "args": [], "description": "Releases control of the underlying hardware so other classes can use it.\n"}, {"name": "audioio.RawSample", "args": ["buffer", "*", "channel_count=1", "sample_rate=8000"], "description": "Create a RawSample based on the given buffer of signed values. If channel_count is more than\n1 then each channel\u2019s samples should alternate. In other words, for a two channel buffer, the\nfirst sample will be for channel 1, the second sample will be for channel two, the third for\nchannel 1 and so on.\n\n\nParameters:\nbuffer (array) \u2013 An array.array with samples\nchannel_count (int) \u2013 The number of channels in the buffer\nsample_rate (int) \u2013 The desired playback sample rate"}, {"name": "audioio.RawSample.deinit", "args": [], "description": "Deinitialises the AudioOut and releases any hardware resources for reuse.\n"}, {"name": "audioio.RawSample.sample_rate", "args": null, "description": "32 bit value that dictates how quickly samples are played in Hertz (cycles per second).\nWhen the sample is looped, this can change the pitch output without changing the underlying\nsample. This will not change the sample rate of any active playback. Call play again to\nchange it.\n"}, {"name": "audioio.WaveFile", "args": ["filename"], "description": "Load a .wav file for playback with audioio.AudioOut or audiobusio.I2SOut.\n\n\nParameters:file (bytes-like) \u2013 Already opened wave file"}, {"name": "audioio.WaveFile.deinit", "args": [], "description": "Deinitialises the WaveFile and releases all memory resources for reuse.\n"}, {"name": "audioio.WaveFile.sample_rate", "args": null, "description": "32 bit value that dictates how quickly samples are loaded into the DAC\nin Hertz (cycles per second). When the sample is looped, this can change\nthe pitch output without changing the underlying sample.\n"}, {"name": "audiobusio.I2SOut", "args": ["bit_clock", "word_select", "data", "*", "left_justified"], "description": "Create a I2SOut object associated with the given pins.\n\n\nParameters:\nbit_clock (Pin) \u2013 The bit clock (or serial clock) pin\nword_select (Pin) \u2013 The word select (or left/right clock) pin\ndata (Pin) \u2013 The data pin\nleft_justified (bool) \u2013 True when data bits are aligned with the word select clock. False\nwhen they are shifted by one to match classic I2S protocol."}, {"name": "audiobusio.PDMIn", "args": ["clock_pin", "data_pin", "*", "sample_rate=16000", "bit_depth=8", "mono=True", "oversample=64", "startup_delay=0.11"], "description": "Create a PDMIn object associated with the given pins. This allows you to\nrecord audio signals from the given pins. Individual ports may put further\nrestrictions on the recording parameters. The overall sample rate is\ndetermined by sample_rate x oversample, and the total must be 1MHz or\nhigher, so sample_rate must be a minimum of 16000.\n\n\nParameters:\nclock_pin (Pin) \u2013 The pin to output the clock to\ndata_pin (Pin) \u2013 The pin to read the data from\nsample_rate (int) \u2013 Target sample_rate of the resulting samples. Check sample_rate for actual value.\nMinimum sample_rate is about 16000 Hz.\nbit_depth (int) \u2013 Final number of bits per sample. Must be divisible by 8\nmono (bool) \u2013 True when capturing a single channel of audio, captures two channels otherwise\noversample (int) \u2013 Number of single bit samples to decimate into a final sample. Must be divisible by 8\nstartup_delay (float) \u2013 seconds to wait after starting microphone clock\nto allow microphone to turn on. Most require only 0.01s; some require 0.1s. Longer is safer.\nMust be in range 0.0-1.0 seconds."}, {"name": "audiobusio.I2SOut.deinit", "args": [], "description": "Deinitialises the I2SOut and releases any hardware resources for reuse.\n"}, {"name": "audiobusio.I2SOut.playing", "args": null, "description": "True when the audio sample is being output. (read-only)\n"}, {"name": "audiobusio.I2SOut.paused", "args": null, "description": "True when playback is paused. (read-only)\n"}, {"name": "audiobusio.PDMIn.deinit", "args": [], "description": "Deinitialises the PDMIn and releases any hardware resources for reuse.\n"}, {"name": "audiobusio.PDMIn.sample_rate", "args": null, "description": "The actual sample_rate of the recording. This may not match the constructed\nsample rate due to internal clock limitations.\n"}, {"name": "analogio.AnalogOut", "args": ["pin"], "description": "Use the AnalogOut on the given pin.\n\n\nParameters:pin (Pin) \u2013 the pin to output to"}, {"name": "analogio.AnalogOut.deinit", "args": [], "description": "Turn off the AnalogOut and release the pin for other use.\n"}, {"name": "analogio.AnalogOut.value", "args": null, "description": "The value on the analog pin between 0 and 65535 inclusive (16-bit). (write-only)\nEven if the underlying digital to analog converter (DAC) is lower\nresolution, the value is 16-bit.\n"}, {"name": "_stage.Layer", "args": ["width", "height", "graphic", "palette", "grid"], "description": "Keep internal information about a layer of graphics (either a\nGrid or a Sprite) in a format suitable for fast rendering\nwith the render() function.\n\n\nParameters:\nwidth (int) \u2013 The width of the grid in tiles, or 1 for sprites.\nheight (int) \u2013 The height of the grid in tiles, or 1 for sprites.\ngraphic (bytearray) \u2013 The graphic data of the tiles.\npalette (bytearray) \u2013 The color palette to be used.\ngrid (bytearray) \u2013 The contents of the grid map."}, {"name": "_stage.Layer.move", "args": ["x", "y"], "description": ""}, {"name": "_stage.Layer.frame", "args": ["frame", "rotation"], "description": ""}, {"name": "_stage.Text", "args": ["width", "height", "font", "palette", "chars"], "description": "Keep internal information about a text of text\nin a format suitable for fast rendering\nwith the render() function.\n\n\nParameters:\nwidth (int) \u2013 The width of the grid in tiles, or 1 for sprites.\nheight (int) \u2013 The height of the grid in tiles, or 1 for sprites.\nfont (bytearray) \u2013 The font data of the characters.\npalette (bytearray) \u2013 The color palette to be used.\nchars (bytearray) \u2013 The contents of the character grid."}, {"name": "_stage.Text.move", "args": ["x", "y"], "description": ""}, {"name": "audioio.AudioOut", "args": ["left_channel", "right_channel=None"], "description": "Create a AudioOut object associated with the given pin(s). This allows you to\nplay audio signals out on the given pin(s).\n\n\nParameters:\nleft_channel (Pin) \u2013 The pin to output the left channel to\nright_channel (Pin) \u2013 The pin to output the right channel to"}, {"name": "audioio.AudioOut.deinit", "args": [], "description": "Deinitialises the AudioOut and releases any hardware resources for reuse.\n"}, {"name": "audioio.AudioOut.playing", "args": null, "description": "True when an audio sample is being output even if paused. (read-only)\n"}, {"name": "audioio.AudioOut.paused", "args": null, "description": "True when playback is paused. (read-only)\n"}, {"name": "analogio.AnalogIn", "args": ["pin"], "description": "Use the AnalogIn on the given pin. The reference voltage varies by\nplatform so use reference_voltage to read the configured setting.\n\n\nParameters:pin (Pin) \u2013 the pin to read from"}, {"name": "analogio.AnalogIn.deinit", "args": [], "description": "Turn off the AnalogIn and release the pin for other use.\n"}, {"name": "analogio.AnalogIn.value", "args": null, "description": "The value on the analog pin between 0 and 65535 inclusive (16-bit). (read-only)\nEven if the underlying analog to digital converter (ADC) is lower\nresolution, the value is 16-bit.\n"}, {"name": "analogio.AnalogIn.reference_voltage", "args": null, "description": "The maximum voltage measurable (also known as the reference voltage) as a\nfloat in Volts.\n"} ] mu-editor-1.0.2+dfsg/utils/adafruit_api.py000066400000000000000000000131121341747546300205140ustar00rootroot00000000000000""" The scrapy package must be installed. Usage: scrapy runspider adafruit_api.py -o adafruit.json """ import scrapy from bs4 import BeautifulSoup URL = 'https://circuitpython.readthedocs.io/en/3.x/shared-bindings/index.html' class AdafruitSpider(scrapy.Spider): name = 'AdafruitSpider' start_urls = [URL, ] def parse(self, response): """ Scrapes the list of modules associated with CircuitPython. Causes scrapy to follow the links to the module docs and uses a different parser to extract the API information contained therein. """ for next_page in response.css('div.toctree-wrapper li a'): yield response.follow(next_page, self.parse_api) def to_dict(self, name, args, description): """ Returns a dictionary representation of the API element if valid, else returns None. """ if name.endswith('__'): return None return { 'name': name, 'args': args, 'description': description, } def parse_api(self, response): """ Parses a *potential* API documentation page. """ # Find all the function definitions on the page: for func in response.css('dl.function'): # Class details are always first items in dl. func_spec = func.css('dt')[0] func_doc = func.css('dd')[0] # Function name is always first dt fn1 = BeautifulSoup(func_spec.css('code.descclassname').\ extract()[0], 'html.parser').text fn2 = BeautifulSoup(func_spec.css('code.descname').extract()[0], 'html.parser').text func_name = fn1 + fn2 # Args into function args = [] for ems in func_spec.css('em'): args.append(ems.extract().replace('', '').\ replace('', '')) # Function description. soup = BeautifulSoup(func_doc.extract(), 'html.parser') d = self.to_dict(func_name, args, soup.text) if d: yield d # Find all the class definitions on the page: for classes in response.css('dl.class'): # Class details are always first items in dl. class_spec = classes.css('dt')[0] class_doc = classes.css('dd')[0] # Class name is always first dt cn1 = BeautifulSoup(class_spec.css('code.descclassname').\ extract()[0], 'html.parser').text cn2 = BeautifulSoup(class_spec.css('code.descname').extract()[0], 'html.parser').text class_name = cn1 + cn2 # Args into __init__ init_args = [] for ems in class_spec.css('em'): props = 'property' in ems.css('::attr(class)').extract() if not props: init_args.append(ems.extract().replace('', '').\ replace('', '')) # Class description. Everything up to and including the field-list. soup = BeautifulSoup(class_doc.extract(), 'html.parser') contents = soup.contents[0].contents description = '' for child in contents: if child.name == 'p': description += child.text + '\n\n' if child.name == 'table': raw = child.text rows = [r.strip() for r in raw.split('/n') if r.strip()] description += '\n' description += '\n'.join(rows) break if child.name == 'dl': break d = self.to_dict(class_name, init_args, description) if d: yield d # Remaining dt are methods or attributes for methods in classes.css('dl.method'): # Parse and yield methods. method_name = BeautifulSoup(methods.css('code.descname').\ extract()[0], 'html.parser').text if method_name.startswith('__'): break method_name = class_name + '.' + method_name method_args = [] for ems in methods.css('em'): method_args.append(ems.extract().replace('', '').\ replace('', '')) description = BeautifulSoup(methods.css('dd')[0].extract(), 'html.parser').text d = self.to_dict(method_name, method_args, description) if d: yield d for data in classes.css('dl.attribute'): name = BeautifulSoup(data.css('code.descname').extract()[0], 'html.parser').text name = class_name + '.' + name description = BeautifulSoup(data.css('dd')[0].extract(), 'html.parser').text d = self.to_dict(name, None, description) if d: yield d for data in classes.css('dl.data'): name = BeautifulSoup(data.css('code.descname').extract()[0], 'html.parser').text name = class_name + '.' + name description = BeautifulSoup(data.css('dd')[0].extract(), 'html.parser').text d = self.to_dict(name, None, description) if d: yield d mu-editor-1.0.2+dfsg/utils/avatar.py000066400000000000000000000034701341747546300173500ustar00rootroot00000000000000# Grab Gravatar images for the contributors listed in the GIT log. import os import subprocess import shutil import hashlib import requests def get_gravatar(email): """ Given an email, attempt to get the gravatar image associated with it. """ md5 = hashlib.md5(email.encode('utf-8')).hexdigest() url = f"http://www.gravatar.com/avatar/{md5}?d=404&size=90" return requests.get(url, stream=True) def get_github(username): """ Given a GitHub username, attempt to get the user's avatar. """ url = f"https://github.com/{username}.png" return requests.get(url, stream=True) def get_gitlog(): """ Get unique tuples of username / email address from GIT log. """ command = [ "git", "log", '--pretty=format:%an|%ae', ] raw = subprocess.check_output(command, stderr=subprocess.STDOUT).decode('utf-8') lines = raw.split('\n') result = set() for line in lines: username, email = line.split('|') result.add((username, email)) return tuple(result) users = get_gitlog() path = os.path.abspath(os.path.join('.git', 'avatar')) if not os.path.exists(path): os.makedirs(path) for (username, email) in users: print(f"Processing {username} {email}") if "users.noreply.github.com" in email: raw_username, _ = email.split("@") response = get_github(raw_username) _, mime = response.headers['content-type'].split('/') else: response = get_gravatar(email) _, mime = response.headers['content-type'].split('/') if response.status_code == 200: filename = os.path.join(path, f'{username}.{mime}') with open(filename, 'wb') as out_file: print(f"Writing to {filename}") shutil.copyfileobj(response.raw, out_file) mu-editor-1.0.2+dfsg/utils/mkapi.py000077500000000000000000000014541341747546300171760ustar00rootroot00000000000000#!/usr/bin/env python3 """ Takes a JSON representation of an API and emits elements to be inserted into a Python list such that they conform to Scintilla's API description DSL. """ import sys import json if __name__ == '__main__': f = sys.argv[1] with open(f) as api_file: api = json.load(api_file) # Sort the JSON objects so diffing code is easier to do. sorted_api = sorted(api, key=lambda k: k['name']) # Emit a representation of the API information in the format parsed by # the Scintilla. for i in sorted_api: name = i['name'] args = ', '.join(i['args']) if i['args'] else '' description = i['description'].replace('\u2013', '--') content = repr('{}({}) \n{}'.format(name, args, description)) print(' _({}),'.format(content)) mu-editor-1.0.2+dfsg/utils/pgzero_api.json000066400000000000000000000464441341747546300205620ustar00rootroot00000000000000[ { "name": "draw.circle", "args": [ "position", "radius", "(r, g, b)" ], "description": "Draw the outline of a circle." }, { "name": "draw.filled_circle", "args": [ "position", "radius", "(r, g, b)" ], "description": "Draw a filled circle." }, { "name": "draw.filled_rect", "args": [ "rect", "(r, g, b)" ], "description": "Draw a filled rectangle. Takes a Rect object. For example, Rect((20, 20), (100, 100))" }, { "name": "draw.line", "args": [ "start", "end", "(r, g, b)" ], "description": "Draw a line from start to end." }, { "name": "draw.rect", "args": [ "rect", "(r, g, b)" ], "description": "Draw the outline of a rectangle. Takes a Rect object. For example, Rect((20, 20), (100, 100))" }, { "name": "draw.text", "args": [ "text", "[pos, ]**kwargs" ], "description": "Draw text. There’s an extremely rich API for positioning and formatting text; see Pygame Zero Text Formatting for full details." }, { "name": "draw.textbox", "args": [ "text", "rect", "**kwargs" ], "description": "Draw text, sized to fill the given Rect. There’s an extremely rich API for positioning and formatting text; see Pygame Zero Text Formatting for full details." }, { "name": "screen.blit", "args": [ "image", "(left, top)" ], "description": "Draw the image to the screen at the given position. blit() accepts either a Surface or a string as its image parameter. If image is a str then the named image will be loaded from the images/ directory." }, { "name": "screen.clear", "args": [ null ], "description": "Reset the screen to black." }, { "name": "screen.fill", "args": [ "(red, green, blue)" ], "description": "Fill the screen with a solid color." }, { "name": "screen.Screen", "args": [ "surface" ], "description": "Interface to the screen." }, { "name": "screen.SurfacePainter", "args": [ "screen" ], "description": "Interface to pygame.draw that is bound to a surface." }, { "name": "screen.pgzero.ptext", "args": null, "description": "pygame-text - high-level text rendering with Pygame.\n\nThis module is directly copied from\n\n https://github.com/cosmologicon/pygame-text\n\nat revision c04e59b7382a832e117f0598cdcbc1bb3eb26db5\nand used under CC0." }, { "name": "screen.pygame", "args": null, "description": "Pygame is a set of Python modules designed for writing games.\nIt is written on top of the excellent SDL library. This allows you\nto create fully featured games and multimedia programs in the python\nlanguage. The package is highly portable, with games running on\nWindows, MacOS, OS X, BeOS, FreeBSD, IRIX, and Linux." }, { "name": "screen.round_pos", "args": [ "pos" ], "description": "Round a tuple position so it can be used for drawing." }, { "name": "music.ResourceLoader", "args": [ "subpath" ], "description": "Abstract resource loader.\n\nA resource loader is a singleton; resources are loaded from a named\nsubdirectory of the global 'root'. The `.load()` method actually loads\na resource.\n\nAdditionally, attribute access can be used to access and cache resources.\nDotted paths can be used to traverse directories." }, { "name": "music.pgzero.constants", "args": null, "description": "Names for constants returned by Pygame." }, { "name": "music.fadeout", "args": [ "seconds" ], "description": "Fade out and eventually stop the music playback.\n\n:param seconds: The duration in seconds over which the sound will be faded\n out. For example, to fade out over half a second, call\n ``music.fadeout(0.5)``." }, { "name": "music.get_pos", "args": null, "description": "get_pos() -> time\nget the music play time" }, { "name": "music.get_volume", "args": null, "description": "get_volume() -> value\nget the music volume" }, { "name": "music.is_playing", "args": [ "name" ], "description": "Return True if the music is playing and not paused." }, { "name": "music.pause", "args": [ "" ], "description": "Temporarily stop playback of the music stream.\n\nCall `unpause()` to resume." }, { "name": "music.play", "args": [ "name" ], "description": "Play a music file from the music/ directory.\n\nThe music will loop when it finishes playing." }, { "name": "music.play_once", "args": [ "name" ], "description": "Play a music file from the music/ directory." }, { "name": "music.queue", "args": [ "name" ], "description": "Queue a music file to follow the current track.\n\nThis will load a music file and queue it. A queued music file will begin as\nsoon as the current music naturally ends. If the current music is ever\nstopped or changed, the queued song will be lost." }, { "name": "music.rewind", "args": null, "description": "rewind() -> None\nrestart music" }, { "name": "music.set_pos", "args": null, "description": "set_pos(pos) -> None\nset position to play from" }, { "name": "music.set_volume", "args": null, "description": "set_volume(value) -> None\nset the music volume" }, { "name": "music.stop", "args": null, "description": "stop() -> None\nstop the music playback" }, { "name": "music.unpause", "args": [ "" ], "description": "Resume playback of the music stream after it has been paused." }, { "name": "keyboard.Keyboard", "args": [ "" ], "description": "The current state of the keyboard.\n\nEach attribute represents a key. For example, ::\n\n keyboard.a\n\nis True if the 'A' key is depressed, and False otherwise." }, { "name": "keyboard.keys", "args": [ "value", "names=None", "*", "module=None", "qualname=None", "type=None", "start=1" ], "description": "An enumeration." }, { "name": "keyboard.re", "args": null, "description": "Support for regular expressions (RE).\n\nThis module provides regular expression matching operations similar to\nthose found in Perl. It supports both 8-bit and Unicode strings; both\nthe pattern and the strings being processed can contain null bytes and\ncharacters outside the US ASCII range.\n\nRegular expressions can contain both special and ordinary characters.\nMost ordinary characters, like \"A\", \"a\", or \"0\", are the simplest\nregular expressions; they simply match themselves. You can\nconcatenate ordinary characters, so last matches the string 'last'.\n\nThe special characters are:\n \".\" Matches any character except a newline.\n \"^\" Matches the start of the string.\n \"$\" Matches the end of the string or just before the newline at\n the end of the string.\n \"*\" Matches 0 or more (greedy) repetitions of the preceding RE.\n Greedy means that it will match as many repetitions as possible.\n \"+\" Matches 1 or more (greedy) repetitions of the preceding RE.\n \"?\" Matches 0 or 1 (greedy) of the preceding RE.\n *?,+?,?? Non-greedy versions of the previous three special characters.\n {m,n} Matches from m to n repetitions of the preceding RE.\n {m,n}? Non-greedy version of the above.\n \"\\\\\" Either escapes special characters or signals a special sequence.\n [] Indicates a set of characters.\n A \"^\" as the first character indicates a complementing set.\n \"|\" A|B, creates an RE that will match either A or B.\n (...) Matches the RE inside the parentheses.\n The contents can be retrieved or matched later in the string.\n (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below).\n (?:...) Non-grouping version of regular parentheses.\n (?P...) The substring matched by the group is accessible by name.\n (?P=name) Matches the text matched earlier by the group named name.\n (?#...) A comment; ignored.\n (?=...) Matches if ... matches next, but doesn't consume the string.\n (?!...) Matches if ... doesn't match next.\n (?<=...) Matches if preceded by ... (must be fixed length).\n (? 0 and beta > 0.\nReturned values range between 0 and 1." }, { "name": "random.choice", "args": [ "seq" ], "description": "Choose a random element from a non-empty sequence." }, { "name": "random.choices", "args": [ "population", "weights=None", "*", "cum_weights=None", "k=1" ], "description": "Return a k sized list of population elements chosen with replacement.\n\nIf the relative weights or cumulative weights are not specified,\nthe selections are made with equal probability." }, { "name": "random.expovariate", "args": [ "lambd" ], "description": "Exponential distribution.\n\nlambd is 1.0 divided by the desired mean. It should be\nnonzero. (The parameter would be called \"lambda\", but that is\na reserved word in Python.) Returned values range from 0 to\npositive infinity if lambd is positive, and from negative\ninfinity to 0 if lambd is negative." }, { "name": "random.gammavariate", "args": [ "alpha", "beta" ], "description": "Gamma distribution. Not the gamma function!\n\nConditions on the parameters are alpha > 0 and beta > 0.\n\nThe probability distribution function is:\n\n x ** (alpha - 1) * math.exp(-x / beta)\n pdf(x) = --------------------------------------\n math.gamma(alpha) * beta ** alpha" }, { "name": "random.gauss", "args": [ "mu", "sigma" ], "description": "Gaussian distribution.\n\nmu is the mean, and sigma is the standard deviation. This is\nslightly faster than the normalvariate() function.\n\nNot thread-safe without a lock around calls." }, { "name": "random.getrandbits", "args": null, "description": "getrandbits(k) -> x. Generates an int with k random bits." }, { "name": "random.getstate", "args": [ "" ], "description": "Return internal state; can be passed to setstate() later." }, { "name": "random.lognormvariate", "args": [ "mu", "sigma" ], "description": "Log normal distribution.\n\nIf you take the natural logarithm of this distribution, you'll get a\nnormal distribution with mean mu and standard deviation sigma.\nmu can have any value, and sigma must be greater than zero." }, { "name": "random.normalvariate", "args": [ "mu", "sigma" ], "description": "Normal distribution.\n\nmu is the mean, and sigma is the standard deviation." }, { "name": "random.paretovariate", "args": [ "alpha" ], "description": "Pareto distribution. alpha is the shape parameter." }, { "name": "random.randint", "args": [ "a", "b" ], "description": "Return random integer in range [a, b], including both end points.\n " }, { "name": "random.random", "args": null, "description": "random() -> x in the interval [0, 1)." }, { "name": "random.randrange", "args": [ "start", "stop=None", "step=1", "_int=" ], "description": "Choose a random item from range(start, stop[, step]).\n\nThis fixes the problem with randint() which includes the\nendpoint; in Python this is usually not what you want." }, { "name": "random.sample", "args": [ "population", "k" ], "description": "Chooses k unique random elements from a population sequence or set.\n\nReturns a new list containing elements from the population while\nleaving the original population unchanged. The resulting list is\nin selection order so that all sub-slices will also be valid random\nsamples. This allows raffle winners (the sample) to be partitioned\ninto grand prize and second place winners (the subslices).\n\nMembers of the population need not be hashable or unique. If the\npopulation contains repeats, then each occurrence is a possible\nselection in the sample.\n\nTo choose a sample in a range of integers, use range as an argument.\nThis is especially fast and space efficient for sampling from a\nlarge population: sample(range(10000000), 60)" }, { "name": "random.seed", "args": [ "a=None", "version=2" ], "description": "Initialize internal state from hashable object.\n\nNone or no argument seeds from current time or from an operating\nsystem specific randomness source if available.\n\nIf *a* is an int, all bits are used.\n\nFor version 2 (the default), all of the bits are used if *a* is a str,\nbytes, or bytearray. For version 1 (provided for reproducing random\nsequences from older versions of Python), the algorithm for str and\nbytes generates a narrower range of seeds." }, { "name": "random.setstate", "args": [ "state" ], "description": "Restore internal state from object returned by getstate()." }, { "name": "random.shuffle", "args": [ "x", "random=None" ], "description": "Shuffle list x in place, and return None.\n\nOptional argument random is a 0-argument function returning a\nrandom float in [0.0, 1.0); if it is the default None, the\nstandard random.random will be used." }, { "name": "random.triangular", "args": [ "low=0.0", "high=1.0", "mode=None" ], "description": "Triangular distribution.\n\nContinuous distribution bounded by given lower and upper limits,\nand having a given mode value in-between.\n\nhttp://en.wikipedia.org/wiki/Triangular_distribution" }, { "name": "random.uniform", "args": [ "a", "b" ], "description": "Get a random number in the range [a, b) or [a, b] depending on rounding." }, { "name": "random.vonmisesvariate", "args": [ "mu", "kappa" ], "description": "Circular data distribution.\n\nmu is the mean angle, expressed in radians between 0 and 2*pi, and\nkappa is the concentration parameter, which must be greater than or\nequal to zero. If kappa is equal to zero, this distribution reduces\nto a uniform random angle over the range 0 to 2*pi." }, { "name": "random.weibullvariate", "args": [ "alpha", "beta" ], "description": "Weibull distribution.\n\nalpha is the scale parameter and beta is the shape parameter." }, { "name": "sys.call_tracing", "args": null, "description": "call_tracing(func, args) -> object\n\nCall func(*args), while tracing is enabled. The tracing state is\nsaved, and restored afterwards. This is intended to be called from\na debugger from a checkpoint, to recursively debug some other code." }, { "name": "sys.callstats", "args": null, "description": "callstats() -> tuple of integers\n\nReturn a tuple of function call statistics, if CALL_PROFILE was defined\nwhen Python was built. Otherwise, return None.\n\nWhen enabled, this function returns detailed, implementation-specific\ndetails about the number of function calls executed. The return value is\na 11-tuple where the entries in the tuple are counts of:\n0. all function calls\n1. calls to PyFunction_Type objects\n2. PyFunction calls that do not create an argument tuple\n3. PyFunction calls that do not create an argument tuple\n and bypass PyEval_EvalCodeEx()\n4. PyMethod calls\n5. PyMethod calls on bound methods\n6. PyType calls\n7. PyCFunction calls\n8. generator calls\n9. All other calls\n10. Number of stack pops performed by call_function()" }, { "name": "sys.displayhook", "args": null, "description": "displayhook(object) -> None\n\nPrint an object to sys.stdout and also save it in builtins._" }, { "name": "sys.exc_info", "args": null, "description": "exc_info() -> (type, value, traceback)\n\nReturn information about the most recent exception caught by an except\nclause in the current stack frame or in an older stack frame." }, { "name": "sys.excepthook", "args": null, "description": "excepthook(exctype, value, traceback) -> None\n\nHandle an exception by displaying it with a traceback on sys.stderr." }, { "name": "sys.exit", "args": null, "description": "exit([status])\n\nExit the interpreter by raising SystemExit(status).\nIf the status is omitted or None, it defaults to zero (i.e., success).\nIf the status is an integer, it will be used as the system exit status.\nIf it is another kind of object, it will be printed and the system\nexit status will be one (i.e., failure)." }, { "name": "sys.get_asyncgen_hooks", "args": null, "description": "get_asyncgen_hooks()\n\nReturn a namedtuple of installed asynchronous generators hooks (firstiter, finalizer)." }, { "name": "sys.get_coroutine_wrapper", "args": null, "description": "get_coroutine_wrapper()\n\nReturn the wrapper for coroutine objects set by sys.set_coroutine_wrapper." }, { "name": "sys.getallocatedblocks", "args": null, "description": "getallocatedblocks() -> integer\n\nReturn the number of memory blocks currently allocated, regardless of their\nsize." }, { "name": "sys.getcheckinterval", "args": null, "description": "getcheckinterval() -> current check interval; see setcheckinterval()." }, { "name": "sys.getdefaultencoding", "args": null, "description": "getdefaultencoding() -> string\n\nReturn the current default string encoding used by the Unicode \nimplementation." }, { "name": "sys.getdlopenflags", "args": null, "description": "getdlopenflags() -> int\n\nReturn the current value of the flags that are used for dlopen calls.\nThe flag constants are defined in the os module." }, { "name": "sys.getfilesystemencodeerrors", "args": null, "description": "getfilesystemencodeerrors() -> string\n\nReturn the error mode used to convert Unicode filenames in\noperating system filenames." }, { "name": "sys.getfilesystemencoding", "args": null, "description": "getfilesystemencoding() -> string\n\nReturn the encoding used to convert Unicode filenames in\noperating system filenames." }, { "name": "sys.getprofile", "args": null, "description": "getprofile()\n\nReturn the profiling function set with sys.setprofile.\nSee the profiler chapter in the library manual." }, { "name": "sys.getrecursionlimit", "args": null, "description": "getrecursionlimit()\n\nReturn the current value of the recursion limit, the maximum depth\nof the Python interpreter stack. This limit prevents infinite\nrecursion from causing an overflow of the C stack and crashing Python." }, { "name": "sys.getrefcount", "args": null, "description": "getrefcount(object) -> integer\n\nReturn the reference count of object. The count returned is generally\none higher than you might expect, because it includes the (temporary)\nreference as an argument to getrefcount()." }, { "name": "sys.getsizeof", "args": null, "description": "getsizeof(object, default) -> int\n\nReturn the size of object in bytes." }, { "name": "sys.getswitchinterval", "args": null, "description": "getswitchinterval() -> current thread switch interval; see setswitchinterval()." }, { "name": "sys.gettrace", "args": null, "description": "gettrace()\n\nReturn the global debug tracing function set with sys.settrace.\nSee the debugger chapter in the library manual." }, { "name": "sys.intern", "args": null, "description": "intern(string) -> string\n\n``Intern'' the given string. This enters the string in the (global)\ntable of interned strings whose purpose is to speed up dictionary lookups.\nReturn the string itself or the previously interned string object with the\nsame value." }, { "name": "sys.is_finalizing", "args": null, "description": "is_finalizing()\nReturn True if Python is exiting." }, { "name": "sys.set_asyncgen_hooks", "args": null, "description": "set_asyncgen_hooks(*, firstiter=None, finalizer=None)\n\nSet a finalizer for async generators objects." }, { "name": "sys.set_coroutine_wrapper", "args": null, "description": "set_coroutine_wrapper(wrapper)\n\nSet a wrapper for coroutine objects." }, { "name": "sys.setcheckinterval", "args": null, "description": "setcheckinterval(n)\n\nTell the Python interpreter to check for asynchronous events every\nn instructions. This also affects how often thread switches occur." }, { "name": "sys.setdlopenflags", "args": null, "description": "setdlopenflags(n) -> None\n\nSet the flags used by the interpreter for dlopen calls, such as when the\ninterpreter loads extension modules. Among other things, this will enable\na lazy resolving of symbols when importing a module, if called as\nsys.setdlopenflags(0). To share symbols across extension modules, call as\nsys.setdlopenflags(os.RTLD_GLOBAL). Symbolic names for the flag modules\ncan be found in the os module (RTLD_xxx constants, e.g. os.RTLD_LAZY)." }, { "name": "sys.setprofile", "args": null, "description": "setprofile(function)\n\nSet the profiling function. It will be called on each function call\nand return. See the profiler chapter in the library manual." }, { "name": "sys.setrecursionlimit", "args": null, "description": "setrecursionlimit(n)\n\nSet the maximum depth of the Python interpreter stack to n. This\nlimit prevents infinite recursion from causing an overflow of the C\nstack and crashing Python. The highest possible limit is platform-\ndependent." }, { "name": "sys.setswitchinterval", "args": null, "description": "setswitchinterval(n)\n\nSet the ideal thread switching delay inside the Python interpreter\nThe actual frequency of switching threads can be lower if the\ninterpreter executes long sequences of uninterruptible code\n(this is implementation-specific and workload-dependent).\n\nThe parameter must represent the desired switching delay in seconds\nA typical value is 0.005 (5 milliseconds)." }, { "name": "sys.settrace", "args": null, "description": "settrace(function)\n\nSet the global debug tracing function. It will be called on each\nfunction call. See the debugger chapter in the library manual." }, { "name": "os.PathLike", "args": [ "" ], "description": "Abstract base class for implementing the file system path protocol." }, { "name": "os.WCOREDUMP", "args": [ "status", "/" ], "description": "Return True if the process returning status was dumped to a core file." }, { "name": "os.WEXITSTATUS", "args": [ "status" ], "description": "Return the process return code from status." }, { "name": "os.WIFCONTINUED", "args": [ "status" ], "description": "Return True if a particular process was continued from a job control stop.\n\nReturn True if the process returning status was continued from a\njob control stop." }, { "name": "os.WIFEXITED", "args": [ "status" ], "description": "Return True if the process returning status exited via the exit() system call." }, { "name": "os.WIFSIGNALED", "args": [ "status" ], "description": "Return True if the process returning status was terminated by a signal." }, { "name": "os.WIFSTOPPED", "args": [ "status" ], "description": "Return True if the process returning status was stopped." }, { "name": "os.WSTOPSIG", "args": [ "status" ], "description": "Return the signal that stopped the process that provided the status value." }, { "name": "os.WTERMSIG", "args": [ "status" ], "description": "Return the signal that terminated the process that provided the status value." }, { "name": "os.abc", "args": null, "description": "Abstract Base Classes (ABCs) according to PEP 3119." }, { "name": "os.abort", "args": [ "" ], "description": "Abort the interpreter immediately.\n\nThis function 'dumps core' or otherwise fails in the hardest way possible\non the hosting operating system. This function never returns." }, { "name": "os.access", "args": [ "path", "mode", "*", "dir_fd=None", "effective_ids=False", "follow_symlinks=True" ], "description": "Use the real uid/gid to test for access to a path.\n\n path\n Path to be tested; can be string or bytes\n mode\n Operating-system mode bitfield. Can be F_OK to test existence,\n or the inclusive-OR of R_OK, W_OK, and X_OK.\n dir_fd\n If not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that\n directory.\n effective_ids\n If True, access will use the effective uid/gid instead of\n the real uid/gid.\n follow_symlinks\n If False, and the last element of the path is a symbolic link,\n access will examine the symbolic link itself instead of the file\n the link points to.\n\ndir_fd, effective_ids, and follow_symlinks may not be implemented\n on your platform. If they are unavailable, using them will raise a\n NotImplementedError.\n\nNote that most operations will use the effective uid/gid, therefore this\n routine can be used in a suid/sgid environment to test if the invoking user\n has the specified access to the path." }, { "name": "os.chdir", "args": [ "path" ], "description": "Change the current working directory to the specified path.\n\npath may always be specified as a string.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception." }, { "name": "os.chmod", "args": [ "path", "mode", "*", "dir_fd=None", "follow_symlinks=True" ], "description": "Change the access permissions of a file.\n\n path\n Path to be modified. May always be specified as a str or bytes.\n On some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.\n mode\n Operating-system mode bitfield.\n dir_fd\n If not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that\n directory.\n follow_symlinks\n If False, and the last element of the path is a symbolic link,\n chmod will modify the symbolic link itself instead of the file\n the link points to.\n\nIt is an error to use dir_fd or follow_symlinks when specifying path as\n an open file descriptor.\ndir_fd and follow_symlinks may not be implemented on your platform.\n If they are unavailable, using them will raise a NotImplementedError." }, { "name": "os.chown", "args": [ "path", "uid", "gid", "*", "dir_fd=None", "follow_symlinks=True" ], "description": "Change the owner and group id of path to the numeric uid and gid.\\\n\n path\n Path to be examined; can be string, bytes, or open-file-descriptor int.\n dir_fd\n If not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that\n directory.\n follow_symlinks\n If False, and the last element of the path is a symbolic link,\n stat will examine the symbolic link itself instead of the file\n the link points to.\n\npath may always be specified as a string.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, chown will modify the symbolic link itself instead of the file the\n link points to.\nIt is an error to use dir_fd or follow_symlinks when specifying path as\n an open file descriptor.\ndir_fd and follow_symlinks may not be implemented on your platform.\n If they are unavailable, using them will raise a NotImplementedError." }, { "name": "os.chroot", "args": [ "path" ], "description": "Change root directory to path." }, { "name": "os.close", "args": [ "fd" ], "description": "Close a file descriptor." }, { "name": "os.closerange", "args": [ "fd_low", "fd_high", "/" ], "description": "Closes all file descriptors in [fd_low, fd_high), ignoring errors." }, { "name": "os.confstr", "args": [ "name", "/" ], "description": "Return a string-valued system configuration variable." }, { "name": "os.cpu_count", "args": [ "" ], "description": "Return the number of CPUs in the system; return None if indeterminable.\n\nThis number is not equivalent to the number of CPUs the current process can\nuse. The number of usable CPUs can be obtained with\n``len(os.sched_getaffinity(0))``" }, { "name": "os.ctermid", "args": [ "" ], "description": "Return the name of the controlling terminal for this process." }, { "name": "os.device_encoding", "args": [ "fd" ], "description": "Return a string describing the encoding of a terminal's file descriptor.\n\nThe file descriptor must be attached to a terminal.\nIf the device is not a terminal, return None." }, { "name": "os.dup", "args": [ "fd", "/" ], "description": "Return a duplicate of a file descriptor." }, { "name": "os.dup2", "args": [ "fd", "fd2", "inheritable=True" ], "description": "Duplicate file descriptor." }, { "name": "os.errno", "args": null, "description": "This module makes available standard errno system symbols.\n\nThe value of each symbol is the corresponding integer value,\ne.g., on most systems, errno.ENOENT equals the integer 2.\n\nThe dictionary errno.errorcode maps numeric codes to symbol names,\ne.g., errno.errorcode[2] could be the string 'ENOENT'.\n\nSymbols that are not relevant to the underlying system are not defined.\n\nTo map error codes to error messages, use the function os.strerror(),\ne.g. os.strerror(2) could return 'No such file or directory'." }, { "name": "os.OSError", "args": null, "description": "Base class for I/O related errors." }, { "name": "os.execl", "args": [ "file", "*args" ], "description": "execl(file, *args)\n\nExecute the executable file with argument list args, replacing the\ncurrent process. " }, { "name": "os.execle", "args": [ "file", "*args" ], "description": "execle(file, *args, env)\n\nExecute the executable file with argument list args and\nenvironment env, replacing the current process. " }, { "name": "os.execlp", "args": [ "file", "*args" ], "description": "execlp(file, *args)\n\nExecute the executable file (which is searched for along $PATH)\nwith argument list args, replacing the current process. " }, { "name": "os.execlpe", "args": [ "file", "*args" ], "description": "execlpe(file, *args, env)\n\nExecute the executable file (which is searched for along $PATH)\nwith argument list args and environment env, replacing the current\nprocess. " }, { "name": "os.execv", "args": [ "path", "argv", "/" ], "description": "Execute an executable path with arguments, replacing current process.\n\npath\n Path of executable file.\nargv\n Tuple or list of strings." }, { "name": "os.execve", "args": [ "path", "argv", "env" ], "description": "Execute an executable path with arguments, replacing current process.\n\npath\n Path of executable file.\nargv\n Tuple or list of strings.\nenv\n Dictionary of strings mapping to strings." }, { "name": "os.execvp", "args": [ "file", "args" ], "description": "execvp(file, args)\n\nExecute the executable file (which is searched for along $PATH)\nwith argument list args, replacing the current process.\nargs may be a list or tuple of strings. " }, { "name": "os.execvpe", "args": [ "file", "args", "env" ], "description": "execvpe(file, args, env)\n\nExecute the executable file (which is searched for along $PATH)\nwith argument list args and environment env , replacing the\ncurrent process.\nargs may be a list or tuple of strings. " }, { "name": "os.fchdir", "args": [ "fd" ], "description": "Change to the directory of the given file descriptor.\n\nfd must be opened on a directory, not a file.\nEquivalent to os.chdir(fd)." }, { "name": "os.fchmod", "args": [ "fd", "mode" ], "description": "Change the access permissions of the file given by file descriptor fd.\n\nEquivalent to os.chmod(fd, mode)." }, { "name": "os.fchown", "args": [ "fd", "uid", "gid" ], "description": "Change the owner and group id of the file specified by file descriptor.\n\nEquivalent to os.chown(fd, uid, gid)." }, { "name": "os.fdatasync", "args": [ "fd" ], "description": "Force write of fd to disk without forcing update of metadata." }, { "name": "os.fork", "args": [ "" ], "description": "Fork a child process.\n\nReturn 0 to child process and PID of child to parent process." }, { "name": "os.forkpty", "args": [ "" ], "description": "Fork a new process with a new pseudo-terminal as controlling tty.\n\nReturns a tuple of (pid, master_fd).\nLike fork(), return pid of 0 to the child process,\nand pid of child to the parent process.\nTo both, return fd of newly opened pseudo-terminal." }, { "name": "os.fpathconf", "args": [ "fd", "name", "/" ], "description": "Return the configuration limit name for the file descriptor fd.\n\nIf there is no limit, return -1." }, { "name": "os.fsdecode", "args": [ "filename" ], "description": "Decode filename (an os.PathLike, bytes, or str) from the filesystem\nencoding with 'surrogateescape' error handler, return str unchanged. On\nWindows, use 'strict' error handler if the file system encoding is\n'mbcs' (which is the default encoding)." }, { "name": "os.fsencode", "args": [ "filename" ], "description": "Encode filename (an os.PathLike, bytes, or str) to the filesystem\nencoding with 'surrogateescape' error handler, return bytes unchanged.\nOn Windows, use 'strict' error handler if the file system encoding is\n'mbcs' (which is the default encoding)." }, { "name": "os.fspath", "args": [ "path" ], "description": "Return the file system path representation of the object.\n\nIf the object is str or bytes, then allow it to pass through as-is. If the\nobject defines __fspath__(), then return the result of that method. All other\ntypes raise a TypeError." }, { "name": "os.fstat", "args": [ "fd" ], "description": "Perform a stat system call on the given file descriptor.\n\nLike stat(), but for an open file descriptor.\nEquivalent to os.stat(fd)." }, { "name": "os.fstatvfs", "args": [ "fd", "/" ], "description": "Perform an fstatvfs system call on the given fd.\n\nEquivalent to statvfs(fd)." }, { "name": "os.fsync", "args": [ "fd" ], "description": "Force write of fd to disk." }, { "name": "os.ftruncate", "args": [ "fd", "length", "/" ], "description": "Truncate a file, specified by file descriptor, to a specific length." }, { "name": "os.fwalk", "args": [ "top='.'", "topdown=True", "onerror=None", "*", "follow_symlinks=False", "dir_fd=None" ], "description": "Directory tree generator.\n\nThis behaves exactly like walk(), except that it yields a 4-tuple\n\n dirpath, dirnames, filenames, dirfd\n\n`dirpath`, `dirnames` and `filenames` are identical to walk() output,\nand `dirfd` is a file descriptor referring to the directory `dirpath`.\n\nThe advantage of fwalk() over walk() is that it's safe against symlink\nraces (when follow_symlinks is False).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and top should be relative; top will then be relative to that directory.\n (dir_fd is always supported for fwalk.)\n\nCaution:\nSince fwalk() yields file descriptors, those are only valid until the\nnext iteration step, so you should dup() them if you want to keep them\nfor a longer period.\n\nExample:\n\nimport os\nfor root, dirs, files, rootfd in os.fwalk('python/Lib/email'):\n print(root, \"consumes\", end=\"\")\n print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),\n end=\"\")\n print(\"bytes in\", len(files), \"non-directory files\")\n if 'CVS' in dirs:\n dirs.remove('CVS') # don't visit CVS directories" }, { "name": "os.get_blocking", "args": null, "description": "get_blocking(fd) -> bool\n\nGet the blocking mode of the file descriptor:\nFalse if the O_NONBLOCK flag is set, True if the flag is cleared." }, { "name": "os.get_exec_path", "args": [ "env=None" ], "description": "Returns the sequence of directories that will be searched for the\nnamed executable (similar to a shell) when launching a process.\n\n*env* must be an environment variable dict or None. If *env* is None,\nos.environ will be used." }, { "name": "os.get_inheritable", "args": [ "fd", "/" ], "description": "Get the close-on-exe flag of the specified file descriptor." }, { "name": "os.get_terminal_size", "args": null, "description": "Return the size of the terminal window as (columns, lines).\n\nThe optional argument fd (default standard output) specifies\nwhich file descriptor should be queried.\n\nIf the file descriptor is not connected to a terminal, an OSError\nis thrown.\n\nThis function will only be defined if an implementation is\navailable for this system.\n\nshutil.get_terminal_size is the high-level function which should \nnormally be used, os.get_terminal_size is the low-level implementation." }, { "name": "os.getcwd", "args": [ "" ], "description": "Return a unicode string representing the current working directory." }, { "name": "os.getcwdb", "args": [ "" ], "description": "Return a bytes string representing the current working directory." }, { "name": "os.getegid", "args": [ "" ], "description": "Return the current process's effective group id." }, { "name": "os.getenv", "args": [ "key", "default=None" ], "description": "Get an environment variable, return None if it doesn't exist.\nThe optional second argument can specify an alternate default.\nkey, default and the result are str." }, { "name": "os.getenvb", "args": [ "key", "default=None" ], "description": "Get an environment variable, return None if it doesn't exist.\nThe optional second argument can specify an alternate default.\nkey, default and the result are bytes." }, { "name": "os.geteuid", "args": [ "" ], "description": "Return the current process's effective user id." }, { "name": "os.getgid", "args": [ "" ], "description": "Return the current process's group id." }, { "name": "os.getgrouplist", "args": null, "description": "getgrouplist(user, group) -> list of groups to which a user belongs\n\nReturns a list of groups to which a user belongs.\n\n user: username to lookup\n group: base group id of the user" }, { "name": "os.getgroups", "args": [ "" ], "description": "Return list of supplemental group IDs for the process." }, { "name": "os.getloadavg", "args": [ "" ], "description": "Return average recent system load information.\n\nReturn the number of processes in the system run queue averaged over\nthe last 1, 5, and 15 minutes as a tuple of three floats.\nRaises OSError if the load average was unobtainable." }, { "name": "os.getlogin", "args": [ "" ], "description": "Return the actual login name." }, { "name": "os.getpgid", "args": [ "pid" ], "description": "Call the system call getpgid(), and return the result." }, { "name": "os.getpgrp", "args": [ "" ], "description": "Return the current process group id." }, { "name": "os.getpid", "args": [ "" ], "description": "Return the current process id." }, { "name": "os.getppid", "args": [ "" ], "description": "Return the parent's process id.\n\nIf the parent process has already exited, Windows machines will still\nreturn its id; others systems will return the id of the 'init' process (1)." }, { "name": "os.getpriority", "args": [ "which", "who" ], "description": "Return program scheduling priority." }, { "name": "os.getrandom", "args": [ "size", "flags=0" ], "description": "Obtain a series of random bytes." }, { "name": "os.getresgid", "args": [ "" ], "description": "Return a tuple of the current process's real, effective, and saved group ids." }, { "name": "os.getresuid", "args": [ "" ], "description": "Return a tuple of the current process's real, effective, and saved user ids." }, { "name": "os.getsid", "args": [ "pid", "/" ], "description": "Call the system call getsid(pid) and return the result." }, { "name": "os.getuid", "args": [ "" ], "description": "Return the current process's user id." }, { "name": "os.getxattr", "args": [ "path", "attribute", "*", "follow_symlinks=True" ], "description": "Return the value of extended attribute attribute on path.\n\npath may be either a string or an open file descriptor.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, getxattr will examine the symbolic link itself instead of the file\n the link points to." }, { "name": "os.initgroups", "args": null, "description": "initgroups(username, gid) -> None\n\nCall the system initgroups() to initialize the group access list with all of\nthe groups of which the specified username is a member, plus the specified\ngroup id." }, { "name": "os.isatty", "args": [ "fd", "/" ], "description": "Return True if the fd is connected to a terminal.\n\nReturn True if the file descriptor is an open file descriptor\nconnected to the slave end of a terminal." }, { "name": "os.kill", "args": [ "pid", "signal", "/" ], "description": "Kill a process with a signal." }, { "name": "os.killpg", "args": [ "pgid", "signal", "/" ], "description": "Kill a process group with a signal." }, { "name": "os.lchown", "args": [ "path", "uid", "gid" ], "description": "Change the owner and group id of path to the numeric uid and gid.\n\nThis function will not follow symbolic links.\nEquivalent to os.chown(path, uid, gid, follow_symlinks=False)." }, { "name": "os.link", "args": [ "src", "dst", "*", "src_dir_fd=None", "dst_dir_fd=None", "follow_symlinks=True" ], "description": "Create a hard link to a file.\n\nIf either src_dir_fd or dst_dir_fd is not None, it should be a file\n descriptor open to a directory, and the respective path string (src or dst)\n should be relative; the path will then be relative to that directory.\nIf follow_symlinks is False, and the last element of src is a symbolic\n link, link will create a link to the symbolic link itself instead of the\n file the link points to.\nsrc_dir_fd, dst_dir_fd, and follow_symlinks may not be implemented on your\n platform. If they are unavailable, using them will raise a\n NotImplementedError." }, { "name": "os.listdir", "args": [ "path=None" ], "description": "Return a list containing the names of the files in the directory.\n\npath can be specified as either str or bytes. If path is bytes,\n the filenames returned will also be bytes; in all other circumstances\n the filenames returned will be str.\nIf path is None, uses the path='.'.\nOn some platforms, path may also be specified as an open file descriptor;\\\n the file descriptor must refer to a directory.\n If this functionality is unavailable, using it raises NotImplementedError.\n\nThe list is in arbitrary order. It does not include the special\nentries '.' and '..' even if they are present in the directory." }, { "name": "os.listxattr", "args": [ "path=None", "*", "follow_symlinks=True" ], "description": "Return a list of extended attributes on path.\n\npath may be either None, a string, or an open file descriptor.\nif path is None, listxattr will examine the current directory.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, listxattr will examine the symbolic link itself instead of the file\n the link points to." }, { "name": "os.lockf", "args": [ "fd", "command", "length", "/" ], "description": "Apply, test or remove a POSIX lock on an open file descriptor.\n\nfd\n An open file descriptor.\ncommand\n One of F_LOCK, F_TLOCK, F_ULOCK or F_TEST.\nlength\n The number of bytes to lock, starting at the current position." }, { "name": "os.lseek", "args": [ "fd", "position", "how", "/" ], "description": "Set the position of a file descriptor. Return the new position.\n\nReturn the new cursor position in number of bytes\nrelative to the beginning of the file." }, { "name": "os.lstat", "args": [ "path", "*", "dir_fd=None" ], "description": "Perform a stat system call on the given path, without following symbolic links.\n\nLike stat(), but do not follow symbolic links.\nEquivalent to stat(path, follow_symlinks=False)." }, { "name": "os.major", "args": [ "device", "/" ], "description": "Extracts a device major number from a raw device number." }, { "name": "os.makedev", "args": [ "major", "minor", "/" ], "description": "Composes a raw device number from the major and minor device numbers." }, { "name": "os.makedirs", "args": [ "name", "mode=511", "exist_ok=False" ], "description": "makedirs(name [, mode=0o777][, exist_ok=False])\n\nSuper-mkdir; create a leaf directory and all intermediate ones. Works like\nmkdir, except that any intermediate path segment (not just the rightmost)\nwill be created if it does not exist. If the target directory already\nexists, raise an OSError if exist_ok is False. Otherwise no exception is\nraised. This is recursive." }, { "name": "os.minor", "args": [ "device", "/" ], "description": "Extracts a device minor number from a raw device number." }, { "name": "os.mkdir", "args": [ "path", "mode=511", "*", "dir_fd=None" ], "description": "Create a directory.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.\n\nThe mode argument is ignored on Windows." }, { "name": "os.mkfifo", "args": [ "path", "mode=438", "*", "dir_fd=None" ], "description": "Create a \"fifo\" (a POSIX named pipe).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError." }, { "name": "os.mknod", "args": [ "path", "mode=384", "device=0", "*", "dir_fd=None" ], "description": "Create a node in the file system.\n\nCreate a node in the file system (file, device special file or named pipe)\nat path. mode specifies both the permissions to use and the\ntype of node to be created, being combined (bitwise OR) with one of\nS_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. If S_IFCHR or S_IFBLK is set on mode,\ndevice defines the newly created device special file (probably using\nos.makedev()). Otherwise device is ignored.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError." }, { "name": "os.nice", "args": [ "increment", "/" ], "description": "Add increment to the priority of process and return the new priority." }, { "name": "os.open", "args": [ "path", "flags", "mode=511", "*", "dir_fd=None" ], "description": "Open a file for low level IO. Returns a file descriptor (integer).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError." }, { "name": "os.openpty", "args": [ "" ], "description": "Open a pseudo-terminal.\n\nReturn a tuple of (master_fd, slave_fd) containing open file descriptors\nfor both the master and slave ends." }, { "name": "os.posixpath", "args": null, "description": "Common operations on Posix pathnames.\n\nInstead of importing this module directly, import os and refer to\nthis module as os.path. The \"os.path\" name is an alias for this\nmodule on Posix systems; on other systems (e.g. Mac, Windows),\nos.path provides the same operations in a manner specific to that\nplatform, and is an alias to another module (e.g. macpath, ntpath).\n\nSome of this can actually be useful on non-Posix systems too, e.g.\nfor manipulation of the pathname component of URLs." }, { "name": "os.pathconf", "args": [ "path", "name" ], "description": "Return the configuration limit name for the file or directory path.\n\nIf there is no limit, return -1.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception." }, { "name": "os.pipe", "args": [ "" ], "description": "Create a pipe.\n\nReturns a tuple of two file descriptors:\n (read_fd, write_fd)" }, { "name": "os.pipe2", "args": [ "flags", "/" ], "description": "Create a pipe with flags set atomically.\n\nReturns a tuple of two file descriptors:\n (read_fd, write_fd)\n\nflags can be constructed by ORing together one or more of these values:\nO_NONBLOCK, O_CLOEXEC." }, { "name": "os.posix_fadvise", "args": [ "fd", "offset", "length", "advice", "/" ], "description": "Announce an intention to access data in a specific pattern.\n\nAnnounce an intention to access data in a specific pattern, thus allowing\nthe kernel to make optimizations.\nThe advice applies to the region of the file specified by fd starting at\noffset and continuing for length bytes.\nadvice is one of POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL,\nPOSIX_FADV_RANDOM, POSIX_FADV_NOREUSE, POSIX_FADV_WILLNEED, or\nPOSIX_FADV_DONTNEED." }, { "name": "os.posix_fallocate", "args": [ "fd", "offset", "length", "/" ], "description": "Ensure a file has allocated at least a particular number of bytes on disk.\n\nEnsure that the file specified by fd encompasses a range of bytes\nstarting at offset bytes from the beginning and continuing for length bytes." }, { "name": "os.pread", "args": [ "fd", "length", "offset", "/" ], "description": "Read a number of bytes from a file descriptor starting at a particular offset.\n\nRead length bytes from file descriptor fd, starting at offset bytes from\nthe beginning of the file. The file offset remains unchanged." }, { "name": "os.putenv", "args": [ "name", "value", "/" ], "description": "Change or add an environment variable." }, { "name": "os.pwrite", "args": [ "fd", "buffer", "offset", "/" ], "description": "Write bytes to a file descriptor starting at a particular offset.\n\nWrite buffer to fd, starting at offset bytes from the beginning of\nthe file. Returns the number of bytes writte. Does not change the\ncurrent file offset." }, { "name": "os.read", "args": [ "fd", "length", "/" ], "description": "Read from a file descriptor. Returns a bytes object." }, { "name": "os.readlink", "args": null, "description": "readlink(path, *, dir_fd=None) -> path\n\nReturn a string representing the path to which the symbolic link points.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError." }, { "name": "os.readv", "args": [ "fd", "buffers", "/" ], "description": "Read from a file descriptor fd into an iterable of buffers.\n\nThe buffers should be mutable buffers accepting bytes.\nreadv will transfer data into each buffer until it is full\nand then move on to the next buffer in the sequence to hold\nthe rest of the data.\n\nreadv returns the total number of bytes read,\nwhich may be less than the total capacity of all the buffers." }, { "name": "os.remove", "args": [ "path", "*", "dir_fd=None" ], "description": "Remove a file (same as unlink()).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError." }, { "name": "os.removedirs", "args": [ "name" ], "description": "removedirs(name)\n\nSuper-rmdir; remove a leaf directory and all empty intermediate\nones. Works like rmdir except that, if the leaf directory is\nsuccessfully removed, directories corresponding to rightmost path\nsegments will be pruned away until either the whole path is\nconsumed or an error occurs. Errors during this latter phase are\nignored -- they generally mean that a directory was not empty." }, { "name": "os.removexattr", "args": [ "path", "attribute", "*", "follow_symlinks=True" ], "description": "Remove extended attribute attribute on path.\n\npath may be either a string or an open file descriptor.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, removexattr will modify the symbolic link itself instead of the file\n the link points to." }, { "name": "os.rename", "args": [ "src", "dst", "*", "src_dir_fd=None", "dst_dir_fd=None" ], "description": "Rename a file or directory.\n\nIf either src_dir_fd or dst_dir_fd is not None, it should be a file\n descriptor open to a directory, and the respective path string (src or dst)\n should be relative; the path will then be relative to that directory.\nsrc_dir_fd and dst_dir_fd, may not be implemented on your platform.\n If they are unavailable, using them will raise a NotImplementedError." }, { "name": "os.renames", "args": [ "old", "new" ], "description": "renames(old, new)\n\nSuper-rename; create directories as necessary and delete any left\nempty. Works like rename, except creation of any intermediate\ndirectories needed to make the new pathname good is attempted\nfirst. After the rename, directories corresponding to rightmost\npath segments of the old name will be pruned until either the\nwhole path is consumed or a nonempty directory is found.\n\nNote: this function can fail with the new directory structure made\nif you lack permissions needed to unlink the leaf directory or\nfile." }, { "name": "os.replace", "args": [ "src", "dst", "*", "src_dir_fd=None", "dst_dir_fd=None" ], "description": "Rename a file or directory, overwriting the destination.\n\nIf either src_dir_fd or dst_dir_fd is not None, it should be a file\n descriptor open to a directory, and the respective path string (src or dst)\n should be relative; the path will then be relative to that directory.\nsrc_dir_fd and dst_dir_fd, may not be implemented on your platform.\n If they are unavailable, using them will raise a NotImplementedError.\"" }, { "name": "os.rmdir", "args": [ "path", "*", "dir_fd=None" ], "description": "Remove a directory.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError." }, { "name": "os.scandir", "args": null, "description": "scandir(path='.') -> iterator of DirEntry objects for given path" }, { "name": "os.sched_get_priority_max", "args": [ "policy" ], "description": "Get the maximum scheduling priority for policy." }, { "name": "os.sched_get_priority_min", "args": [ "policy" ], "description": "Get the minimum scheduling priority for policy." }, { "name": "os.sched_getaffinity", "args": [ "pid", "/" ], "description": "Return the affinity of the process identified by pid (or the current process if zero).\n\nThe affinity is returned as a set of CPU identifiers." }, { "name": "os.sched_getparam", "args": [ "pid", "/" ], "description": "Returns scheduling parameters for the process identified by pid.\n\nIf pid is 0, returns parameters for the calling process.\nReturn value is an instance of sched_param." }, { "name": "os.sched_getscheduler", "args": [ "pid", "/" ], "description": "Get the scheduling policy for the process identifiedy by pid.\n\nPassing 0 for pid returns the scheduling policy for the calling process." }, { "name": "os.sched_param", "args": [ "sched_priority" ], "description": "Current has only one field: sched_priority\");\n\nsched_priority\n A scheduling parameter." }, { "name": "os.sched_rr_get_interval", "args": [ "pid", "/" ], "description": "Return the round-robin quantum for the process identified by pid, in seconds.\n\nValue returned is a float." }, { "name": "os.sched_setaffinity", "args": [ "pid", "mask", "/" ], "description": "Set the CPU affinity of the process identified by pid to mask.\n\nmask should be an iterable of integers identifying CPUs." }, { "name": "os.sched_setparam", "args": [ "pid", "param", "/" ], "description": "Set scheduling parameters for the process identified by pid.\n\nIf pid is 0, sets parameters for the calling process.\nparam should be an instance of sched_param." }, { "name": "os.sched_setscheduler", "args": [ "pid", "policy", "param", "/" ], "description": "Set the scheduling policy for the process identified by pid.\n\nIf pid is 0, the calling process is changed.\nparam is an instance of sched_param." }, { "name": "os.sched_yield", "args": [ "" ], "description": "Voluntarily relinquish the CPU." }, { "name": "os.sendfile", "args": null, "description": "sendfile(out, in, offset, count) -> byteswritten\nsendfile(out, in, offset, count[, headers][, trailers], flags=0)\n -> byteswritten\nCopy count bytes from file descriptor in to file descriptor out." }, { "name": "os.set_blocking", "args": null, "description": "set_blocking(fd, blocking)\n\nSet the blocking mode of the specified file descriptor.\nSet the O_NONBLOCK flag if blocking is False,\nclear the O_NONBLOCK flag otherwise." }, { "name": "os.set_inheritable", "args": [ "fd", "inheritable", "/" ], "description": "Set the inheritable flag of the specified file descriptor." }, { "name": "os.setegid", "args": [ "egid", "/" ], "description": "Set the current process's effective group id." }, { "name": "os.seteuid", "args": [ "euid", "/" ], "description": "Set the current process's effective user id." }, { "name": "os.setgid", "args": [ "gid", "/" ], "description": "Set the current process's group id." }, { "name": "os.setgroups", "args": [ "groups", "/" ], "description": "Set the groups of the current process to list." }, { "name": "os.setpgid", "args": [ "pid", "pgrp", "/" ], "description": "Call the system call setpgid(pid, pgrp)." }, { "name": "os.setpgrp", "args": [ "" ], "description": "Make the current process the leader of its process group." }, { "name": "os.setpriority", "args": [ "which", "who", "priority" ], "description": "Set program scheduling priority." }, { "name": "os.setregid", "args": [ "rgid", "egid", "/" ], "description": "Set the current process's real and effective group ids." }, { "name": "os.setresgid", "args": [ "rgid", "egid", "sgid", "/" ], "description": "Set the current process's real, effective, and saved group ids." }, { "name": "os.setresuid", "args": [ "ruid", "euid", "suid", "/" ], "description": "Set the current process's real, effective, and saved user ids." }, { "name": "os.setreuid", "args": [ "ruid", "euid", "/" ], "description": "Set the current process's real and effective user ids." }, { "name": "os.setsid", "args": [ "" ], "description": "Call the system call setsid()." }, { "name": "os.setuid", "args": [ "uid", "/" ], "description": "Set the current process's user id." }, { "name": "os.setxattr", "args": [ "path", "attribute", "value", "flags=0", "*", "follow_symlinks=True" ], "description": "Set extended attribute attribute on path to value.\n\npath may be either a string or an open file descriptor.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, setxattr will modify the symbolic link itself instead of the file\n the link points to." }, { "name": "os.spawnl", "args": [ "mode", "file", "*args" ], "description": "spawnl(mode, file, *args) -> integer\n\nExecute file with arguments from args in a subprocess.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. " }, { "name": "os.spawnle", "args": [ "mode", "file", "*args" ], "description": "spawnle(mode, file, *args, env) -> integer\n\nExecute file with arguments from args in a subprocess with the\nsupplied environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. " }, { "name": "os.spawnlp", "args": [ "mode", "file", "*args" ], "description": "spawnlp(mode, file, *args) -> integer\n\nExecute file (which is looked for along $PATH) with arguments from\nargs in a subprocess with the supplied environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. " }, { "name": "os.spawnlpe", "args": [ "mode", "file", "*args" ], "description": "spawnlpe(mode, file, *args, env) -> integer\n\nExecute file (which is looked for along $PATH) with arguments from\nargs in a subprocess with the supplied environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. " }, { "name": "os.spawnv", "args": [ "mode", "file", "args" ], "description": "spawnv(mode, file, args) -> integer\n\nExecute file with arguments from args in a subprocess.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. " }, { "name": "os.spawnve", "args": [ "mode", "file", "args", "env" ], "description": "spawnve(mode, file, args, env) -> integer\n\nExecute file with arguments from args in a subprocess with the\nspecified environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. " }, { "name": "os.spawnvp", "args": [ "mode", "file", "args" ], "description": "spawnvp(mode, file, args) -> integer\n\nExecute file (which is looked for along $PATH) with arguments from\nargs in a subprocess.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. " }, { "name": "os.spawnvpe", "args": [ "mode", "file", "args", "env" ], "description": "spawnvpe(mode, file, args, env) -> integer\n\nExecute file (which is looked for along $PATH) with arguments from\nargs in a subprocess with the supplied environment.\nIf mode == P_NOWAIT return the pid of the process.\nIf mode == P_WAIT return the process's exit code if it exits normally;\notherwise return -SIG, where SIG is the signal that killed it. " }, { "name": "os.stat", "args": null, "description": "Constants/functions for interpreting results of os.stat() and os.lstat().\n\nSuggested usage: from stat import *" }, { "name": "os.stat", "args": [ "path", "*", "dir_fd=None", "follow_symlinks=True" ], "description": "Perform a stat system call on the given path.\n\n path\n Path to be examined; can be string, bytes, path-like object or\n open-file-descriptor int.\n dir_fd\n If not None, it should be a file descriptor open to a directory,\n and path should be a relative string; path will then be relative to\n that directory.\n follow_symlinks\n If False, and the last element of the path is a symbolic link,\n stat will examine the symbolic link itself instead of the file\n the link points to.\n\ndir_fd and follow_symlinks may not be implemented\n on your platform. If they are unavailable, using them will raise a\n NotImplementedError.\n\nIt's an error to use dir_fd or follow_symlinks when specifying path as\n an open file descriptor." }, { "name": "os.stat_float_times", "args": null, "description": "stat_float_times([newval]) -> oldval\n\nDetermine whether os.[lf]stat represents time stamps as float objects.\n\nIf value is True, future calls to stat() return floats; if it is False,\nfuture calls return ints.\nIf value is omitted, return the current setting." }, { "name": "os.stat_result", "args": null, "description": "stat_result: Result from stat, fstat, or lstat.\n\nThis object may be accessed either as a tuple of\n (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\nor via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\nPosix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\nor st_flags, they are available as attributes only.\n\nSee os.stat for more information." }, { "name": "os.statvfs", "args": [ "path" ], "description": "Perform a statvfs system call on the given path.\n\npath may always be specified as a string.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception." }, { "name": "os.statvfs_result", "args": null, "description": "statvfs_result: Result from statvfs or fstatvfs.\n\nThis object may be accessed either as a tuple of\n (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax),\nor via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n\nSee os.statvfs for more information." }, { "name": "os.strerror", "args": [ "code", "/" ], "description": "Translate an error code to a message string." }, { "name": "os.symlink", "args": [ "src", "dst", "target_is_directory=False", "*", "dir_fd=None" ], "description": "Create a symbolic link pointing to src named dst.\n\ntarget_is_directory is required on Windows if the target is to be\n interpreted as a directory. (On Windows, symlink requires\n Windows 6.0 or greater, and raises a NotImplementedError otherwise.)\n target_is_directory is ignored on non-Windows platforms.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError." }, { "name": "os.sync", "args": [ "" ], "description": "Force write of everything to disk." }, { "name": "os.sys", "args": null, "description": "This module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function" }, { "name": "os.sysconf", "args": [ "name", "/" ], "description": "Return an integer-valued system configuration variable." }, { "name": "os.system", "args": [ "command" ], "description": "Execute the command in a subshell." }, { "name": "os.tcgetpgrp", "args": [ "fd", "/" ], "description": "Return the process group associated with the terminal specified by fd." }, { "name": "os.tcsetpgrp", "args": [ "fd", "pgid", "/" ], "description": "Set the process group associated with the terminal specified by fd." }, { "name": "os.terminal_size", "args": null, "description": "A tuple of (columns, lines) for holding terminal window size" }, { "name": "os.times", "args": [ "" ], "description": "Return a collection containing process timing information.\n\nThe object returned behaves like a named tuple with these fields:\n (utime, stime, cutime, cstime, elapsed_time)\nAll fields are floating point numbers." }, { "name": "os.times_result", "args": null, "description": "times_result: Result from os.times().\n\nThis object may be accessed either as a tuple of\n (user, system, children_user, children_system, elapsed),\nor via the attributes user, system, children_user, children_system,\nand elapsed.\n\nSee os.times for more information." }, { "name": "os.truncate", "args": [ "path", "length" ], "description": "Truncate a file, specified by path, to a specific length.\n\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception." }, { "name": "os.ttyname", "args": [ "fd", "/" ], "description": "Return the name of the terminal device connected to 'fd'.\n\nfd\n Integer file descriptor handle." }, { "name": "os.umask", "args": [ "mask", "/" ], "description": "Set the current numeric umask and return the previous umask." }, { "name": "os.uname", "args": [ "" ], "description": "Return an object identifying the current operating system.\n\nThe object behaves like a named tuple with the following fields:\n (sysname, nodename, release, version, machine)" }, { "name": "os.uname_result", "args": null, "description": "uname_result: Result from os.uname().\n\nThis object may be accessed either as a tuple of\n (sysname, nodename, release, version, machine),\nor via the attributes sysname, nodename, release, version, and machine.\n\nSee os.uname for more information." }, { "name": "os.unlink", "args": [ "path", "*", "dir_fd=None" ], "description": "Remove a file (same as remove()).\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError." }, { "name": "os.unsetenv", "args": [ "name", "/" ], "description": "Delete an environment variable." }, { "name": "os.urandom", "args": [ "size", "/" ], "description": "Return a bytes object containing random bytes suitable for cryptographic use." }, { "name": "os.utime", "args": [ "path", "times=None", "*", "ns=None", "dir_fd=None", "follow_symlinks=True" ], "description": "Set the access and modified time of path.\n\npath may always be specified as a string.\nOn some platforms, path may also be specified as an open file descriptor.\n If this functionality is unavailable, using it raises an exception.\n\nIf times is not None, it must be a tuple (atime, mtime);\n atime and mtime should be expressed as float seconds since the epoch.\nIf ns is specified, it must be a tuple (atime_ns, mtime_ns);\n atime_ns and mtime_ns should be expressed as integer nanoseconds\n since the epoch.\nIf times is None and ns is unspecified, utime uses the current time.\nSpecifying tuples for both times and ns is an error.\n\nIf dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\nIf follow_symlinks is False, and the last element of the path is a symbolic\n link, utime will modify the symbolic link itself instead of the file the\n link points to.\nIt is an error to use dir_fd or follow_symlinks when specifying path\n as an open file descriptor.\ndir_fd and follow_symlinks may not be available on your platform.\n If they are unavailable, using them will raise a NotImplementedError." }, { "name": "os.wait", "args": [ "" ], "description": "Wait for completion of a child process.\n\nReturns a tuple of information about the child process:\n (pid, status)" }, { "name": "os.wait3", "args": [ "options" ], "description": "Wait for completion of a child process.\n\nReturns a tuple of information about the child process:\n (pid, status, rusage)" }, { "name": "os.wait4", "args": [ "pid", "options" ], "description": "Wait for completion of a specific child process.\n\nReturns a tuple of information about the child process:\n (pid, status, rusage)" }, { "name": "os.waitid", "args": [ "idtype", "id", "options", "/" ], "description": "Returns the result of waiting for a process or processes.\n\n idtype\n Must be one of be P_PID, P_PGID or P_ALL.\n id\n The id to wait on.\n options\n Constructed from the ORing of one or more of WEXITED, WSTOPPED\n or WCONTINUED and additionally may be ORed with WNOHANG or WNOWAIT.\n\nReturns either waitid_result or None if WNOHANG is specified and there are\nno children in a waitable state." }, { "name": "os.waitid_result", "args": null, "description": "waitid_result: Result from waitid.\n\nThis object may be accessed either as a tuple of\n (si_pid, si_uid, si_signo, si_status, si_code),\nor via the attributes si_pid, si_uid, and so on.\n\nSee os.waitid for more information." }, { "name": "os.waitpid", "args": [ "pid", "options", "/" ], "description": "Wait for completion of a given child process.\n\nReturns a tuple of information regarding the child process:\n (pid, status)\n\nThe options argument is ignored on Windows." }, { "name": "os.walk", "args": [ "top", "topdown=True", "onerror=None", "followlinks=False" ], "description": "Directory tree generator.\n\nFor each directory in the directory tree rooted at top (including top\nitself, but excluding '.' and '..'), yields a 3-tuple\n\n dirpath, dirnames, filenames\n\ndirpath is a string, the path to the directory. dirnames is a list of\nthe names of the subdirectories in dirpath (excluding '.' and '..').\nfilenames is a list of the names of the non-directory files in dirpath.\nNote that the names in the lists are just names, with no path components.\nTo get a full path (which begins with top) to a file or directory in\ndirpath, do os.path.join(dirpath, name).\n\nIf optional arg 'topdown' is true or not specified, the triple for a\ndirectory is generated before the triples for any of its subdirectories\n(directories are generated top down). If topdown is false, the triple\nfor a directory is generated after the triples for all of its\nsubdirectories (directories are generated bottom up).\n\nWhen topdown is true, the caller can modify the dirnames list in-place\n(e.g., via del or slice assignment), and walk will only recurse into the\nsubdirectories whose names remain in dirnames; this can be used to prune the\nsearch, or to impose a specific order of visiting. Modifying dirnames when\ntopdown is false is ineffective, since the directories in dirnames have\nalready been generated by the time dirnames itself is generated. No matter\nthe value of topdown, the list of subdirectories is retrieved before the\ntuples for the directory and its subdirectories are generated.\n\nBy default errors from the os.scandir() call are ignored. If\noptional arg 'onerror' is specified, it should be a function; it\nwill be called with one argument, an OSError instance. It can\nreport the error to continue with the walk, or raise the exception\nto abort the walk. Note that the filename is available as the\nfilename attribute of the exception object.\n\nBy default, os.walk does not follow symbolic links to subdirectories on\nsystems that support them. In order to get this functionality, set the\noptional argument 'followlinks' to true.\n\nCaution: if you pass a relative pathname for top, don't change the\ncurrent working directory between resumptions of walk. walk never\nchanges the current directory, and assumes that the client doesn't\neither.\n\nExample:\n\nimport os\nfrom os.path import join, getsize\nfor root, dirs, files in os.walk('python/Lib/email'):\n print(root, \"consumes\", end=\"\")\n print(sum([getsize(join(root, name)) for name in files]), end=\"\")\n print(\"bytes in\", len(files), \"non-directory files\")\n if 'CVS' in dirs:\n dirs.remove('CVS') # don't visit CVS directories" }, { "name": "os.write", "args": [ "fd", "data", "/" ], "description": "Write a bytes object to a file descriptor." }, { "name": "os.writev", "args": [ "fd", "buffers", "/" ], "description": "Iterate over buffers, and write the contents of each to a file descriptor.\n\nReturns the total number of bytes written.\nbuffers must be a sequence of bytes-like objects." }, { "name": "json.JSONDecodeError", "args": [ "msg", "doc", "pos" ], "description": "Subclass of ValueError with the following additional properties:\n\nmsg: The unformatted error message\ndoc: The JSON document being parsed\npos: The start index of doc where parsing failed\nlineno: The line corresponding to pos\ncolno: The column corresponding to pos" }, { "name": "json.JSONDecoder", "args": [ "*", "object_hook=None", "parse_float=None", "parse_int=None", "parse_constant=None", "strict=True", "object_pairs_hook=None" ], "description": "Simple JSON decoder\n\nPerforms the following translations in decoding by default:\n\n+---------------+-------------------+\n| JSON | Python |\n+===============+===================+\n| object | dict |\n+---------------+-------------------+\n| array | list |\n+---------------+-------------------+\n| string | str |\n+---------------+-------------------+\n| number (int) | int |\n+---------------+-------------------+\n| number (real) | float |\n+---------------+-------------------+\n| true | True |\n+---------------+-------------------+\n| false | False |\n+---------------+-------------------+\n| null | None |\n+---------------+-------------------+\n\nIt also understands ``NaN``, ``Infinity``, and ``-Infinity`` as\ntheir corresponding ``float`` values, which is outside the JSON spec." }, { "name": "json.JSONEncoder", "args": [ "*", "skipkeys=False", "ensure_ascii=True", "check_circular=True", "allow_nan=True", "sort_keys=False", "indent=None", "separators=None", "default=None" ], "description": "Extensible JSON encoder for Python data structures.\n\nSupports the following objects and types by default:\n\n+-------------------+---------------+\n| Python | JSON |\n+===================+===============+\n| dict | object |\n+-------------------+---------------+\n| list, tuple | array |\n+-------------------+---------------+\n| str | string |\n+-------------------+---------------+\n| int, float | number |\n+-------------------+---------------+\n| True | true |\n+-------------------+---------------+\n| False | false |\n+-------------------+---------------+\n| None | null |\n+-------------------+---------------+\n\nTo extend this to recognize other objects, subclass and implement a\n``.default()`` method with another method that returns a serializable\nobject for ``o`` if possible, otherwise it should call the superclass\nimplementation (to raise ``TypeError``)." }, { "name": "json.codecs", "args": null, "description": "codecs -- Python Codec Registry, API and helpers.\n\n\nWritten by Marc-Andre Lemburg (mal@lemburg.com).\n\n(c) Copyright CNRI, All Rights Reserved. NO WARRANTY." }, { "name": "json.json.decoder", "args": null, "description": "Implementation of JSONDecoder" }, { "name": "json.dump", "args": [ "obj", "fp", "*", "skipkeys=False", "ensure_ascii=True", "check_circular=True", "allow_nan=True", "cls=None", "indent=None", "separators=None", "default=None", "sort_keys=False", "**kw" ], "description": "Serialize ``obj`` as a JSON formatted stream to ``fp`` (a\n``.write()``-supporting file-like object).\n\nIf ``skipkeys`` is true then ``dict`` keys that are not basic types\n(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped\ninstead of raising a ``TypeError``.\n\nIf ``ensure_ascii`` is false, then the strings written to ``fp`` can\ncontain non-ASCII characters if they appear in strings contained in\n``obj``. Otherwise, all such characters are escaped in JSON strings.\n\nIf ``check_circular`` is false, then the circular reference check\nfor container types will be skipped and a circular reference will\nresult in an ``OverflowError`` (or worse).\n\nIf ``allow_nan`` is false, then it will be a ``ValueError`` to\nserialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)\nin strict compliance of the JSON specification, instead of using the\nJavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).\n\nIf ``indent`` is a non-negative integer, then JSON array elements and\nobject members will be pretty-printed with that indent level. An indent\nlevel of 0 will only insert newlines. ``None`` is the most compact\nrepresentation.\n\nIf specified, ``separators`` should be an ``(item_separator, key_separator)``\ntuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and\n``(',', ': ')`` otherwise. To get the most compact JSON representation,\nyou should specify ``(',', ':')`` to eliminate whitespace.\n\n``default(obj)`` is a function that should return a serializable version\nof obj or raise TypeError. The default simply raises TypeError.\n\nIf *sort_keys* is true (default: ``False``), then the output of\ndictionaries will be sorted by key.\n\nTo use a custom ``JSONEncoder`` subclass (e.g. one that overrides the\n``.default()`` method to serialize additional types), specify it with\nthe ``cls`` kwarg; otherwise ``JSONEncoder`` is used." }, { "name": "json.dumps", "args": [ "obj", "*", "skipkeys=False", "ensure_ascii=True", "check_circular=True", "allow_nan=True", "cls=None", "indent=None", "separators=None", "default=None", "sort_keys=False", "**kw" ], "description": "Serialize ``obj`` to a JSON formatted ``str``.\n\nIf ``skipkeys`` is true then ``dict`` keys that are not basic types\n(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped\ninstead of raising a ``TypeError``.\n\nIf ``ensure_ascii`` is false, then the return value can contain non-ASCII\ncharacters if they appear in strings contained in ``obj``. Otherwise, all\nsuch characters are escaped in JSON strings.\n\nIf ``check_circular`` is false, then the circular reference check\nfor container types will be skipped and a circular reference will\nresult in an ``OverflowError`` (or worse).\n\nIf ``allow_nan`` is false, then it will be a ``ValueError`` to\nserialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in\nstrict compliance of the JSON specification, instead of using the\nJavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).\n\nIf ``indent`` is a non-negative integer, then JSON array elements and\nobject members will be pretty-printed with that indent level. An indent\nlevel of 0 will only insert newlines. ``None`` is the most compact\nrepresentation.\n\nIf specified, ``separators`` should be an ``(item_separator, key_separator)``\ntuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and\n``(',', ': ')`` otherwise. To get the most compact JSON representation,\nyou should specify ``(',', ':')`` to eliminate whitespace.\n\n``default(obj)`` is a function that should return a serializable version\nof obj or raise TypeError. The default simply raises TypeError.\n\nIf *sort_keys* is true (default: ``False``), then the output of\ndictionaries will be sorted by key.\n\nTo use a custom ``JSONEncoder`` subclass (e.g. one that overrides the\n``.default()`` method to serialize additional types), specify it with\nthe ``cls`` kwarg; otherwise ``JSONEncoder`` is used." }, { "name": "json.json.encoder", "args": null, "description": "Implementation of JSONEncoder" }, { "name": "json.load", "args": [ "fp", "*", "cls=None", "object_hook=None", "parse_float=None", "parse_int=None", "parse_constant=None", "object_pairs_hook=None", "**kw" ], "description": "Deserialize ``fp`` (a ``.read()``-supporting file-like object containing\na JSON document) to a Python object.\n\n``object_hook`` is an optional function that will be called with the\nresult of any object literal decode (a ``dict``). The return value of\n``object_hook`` will be used instead of the ``dict``. This feature\ncan be used to implement custom decoders (e.g. JSON-RPC class hinting).\n\n``object_pairs_hook`` is an optional function that will be called with the\nresult of any object literal decoded with an ordered list of pairs. The\nreturn value of ``object_pairs_hook`` will be used instead of the ``dict``.\nThis feature can be used to implement custom decoders that rely on the\norder that the key and value pairs are decoded (for example,\ncollections.OrderedDict will remember the order of insertion). If\n``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.\n\nTo use a custom ``JSONDecoder`` subclass, specify it with the ``cls``\nkwarg; otherwise ``JSONDecoder`` is used." }, { "name": "json.loads", "args": [ "s", "*", "encoding=None", "cls=None", "object_hook=None", "parse_float=None", "parse_int=None", "parse_constant=None", "object_pairs_hook=None", "**kw" ], "description": "Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance\ncontaining a JSON document) to a Python object.\n\n``object_hook`` is an optional function that will be called with the\nresult of any object literal decode (a ``dict``). The return value of\n``object_hook`` will be used instead of the ``dict``. This feature\ncan be used to implement custom decoders (e.g. JSON-RPC class hinting).\n\n``object_pairs_hook`` is an optional function that will be called with the\nresult of any object literal decoded with an ordered list of pairs. The\nreturn value of ``object_pairs_hook`` will be used instead of the ``dict``.\nThis feature can be used to implement custom decoders that rely on the\norder that the key and value pairs are decoded (for example,\ncollections.OrderedDict will remember the order of insertion). If\n``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.\n\n``parse_float``, if specified, will be called with the string\nof every JSON float to be decoded. By default this is equivalent to\nfloat(num_str). This can be used to use another datatype or parser\nfor JSON floats (e.g. decimal.Decimal).\n\n``parse_int``, if specified, will be called with the string\nof every JSON int to be decoded. By default this is equivalent to\nint(num_str). This can be used to use another datatype or parser\nfor JSON integers (e.g. float).\n\n``parse_constant``, if specified, will be called with one of the\nfollowing strings: -Infinity, Infinity, NaN.\nThis can be used to raise an exception if invalid JSON numbers\nare encountered.\n\nTo use a custom ``JSONDecoder`` subclass, specify it with the ``cls``\nkwarg; otherwise ``JSONDecoder`` is used.\n\nThe ``encoding`` argument is ignored and deprecated." }, { "name": "json.json.scanner", "args": null, "description": "JSON token scanner" }, { "name": "socket.AddressFamily", "args": [ "value", "names=None", "*", "module=None", "qualname=None", "type=None", "start=1" ], "description": "An enumeration." }, { "name": "socket.AddressInfo", "args": [ "value", "names=None", "*", "module=None", "qualname=None", "type=None", "start=1" ], "description": "An enumeration." }, { "name": "socket.CMSG_LEN", "args": null, "description": "CMSG_LEN(length) -> control message length\n\nReturn the total length, without trailing padding, of an ancillary\ndata item with associated data of the given length. This value can\noften be used as the buffer size for recvmsg() to receive a single\nitem of ancillary data, but RFC 3542 requires portable applications to\nuse CMSG_SPACE() and thus include space for padding, even when the\nitem will be the last in the buffer. Raises OverflowError if length\nis outside the permissible range of values." }, { "name": "socket.CMSG_SPACE", "args": null, "description": "CMSG_SPACE(length) -> buffer size\n\nReturn the buffer size needed for recvmsg() to receive an ancillary\ndata item with associated data of the given length, along with any\ntrailing padding. The buffer space needed to receive multiple items\nis the sum of the CMSG_SPACE() values for their associated data\nlengths. Raises OverflowError if length is outside the permissible\nrange of values." }, { "name": "socket.IntEnum", "args": [ "value", "names=None", "*", "module=None", "qualname=None", "type=None", "start=1" ], "description": "Enum where members are also (and must be) ints" }, { "name": "socket.IntFlag", "args": [ "value", "names=None", "*", "module=None", "qualname=None", "type=None", "start=1" ], "description": "Support for integer-based Flags" }, { "name": "socket.MsgFlag", "args": [ "value", "names=None", "*", "module=None", "qualname=None", "type=None", "start=1" ], "description": "An enumeration." }, { "name": "socket.SocketIO", "args": [ "sock", "mode" ], "description": "Raw I/O implementation for stream sockets.\n\nThis class supports the makefile() method on sockets. It provides\nthe raw I/O interface on top of a socket object." }, { "name": "socket.SocketKind", "args": [ "value", "names=None", "*", "module=None", "qualname=None", "type=None", "start=1" ], "description": "An enumeration." }, { "name": "socket.socket", "args": null, "description": "socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\nOpen a socket of the given type. The family argument specifies the\naddress family; it defaults to AF_INET. The type argument specifies\nwhether this is a stream (SOCK_STREAM, this is the default)\nor datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\nspecifying the default protocol. Keyword arguments are accepted.\nThe socket is created as non-inheritable.\n\nA socket object represents one endpoint of a network connection.\n\nMethods of socket objects (keyword arguments not allowed):\n\n_accept() -- accept connection, returning new socket fd and client address\nbind(addr) -- bind the socket to a local address\nclose() -- close the socket\nconnect(addr) -- connect the socket to a remote address\nconnect_ex(addr) -- connect, return an error code instead of an exception\ndup() -- return a new socket fd duplicated from fileno()\nfileno() -- return underlying file descriptor\ngetpeername() -- return remote address [*]\ngetsockname() -- return local address\ngetsockopt(level, optname[, buflen]) -- get socket options\ngettimeout() -- return timeout or None\nlisten([n]) -- start listening for incoming connections\nrecv(buflen[, flags]) -- receive data\nrecv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\nrecvfrom(buflen[, flags]) -- receive data and sender's address\nrecvfrom_into(buffer[, nbytes, [, flags])\n -- receive data and sender's address (into a buffer)\nsendall(data[, flags]) -- send all data\nsend(data[, flags]) -- send data, may not send all of it\nsendto(data[, flags], addr) -- send data to a given address\nsetblocking(0 | 1) -- set or clear the blocking I/O flag\nsetsockopt(level, optname, value[, optlen]) -- set socket options\nsettimeout(None | float) -- set or clear the timeout\nshutdown(how) -- shut down traffic in one or both directions\nif_nameindex() -- return all network interface indices and names\nif_nametoindex(name) -- return the corresponding interface index\nif_indextoname(index) -- return the corresponding interface name\n\n [*] not available on all platforms!" }, { "name": "socket.create_connection", "args": [ "address", "timeout=", "source_address=None" ], "description": "Connect to *address* and return the socket object.\n\nConvenience function. Connect to *address* (a 2-tuple ``(host,\nport)``) and return the socket object. Passing the optional\n*timeout* parameter will set the timeout on the socket instance\nbefore attempting to connect. If no *timeout* is supplied, the\nglobal default timeout setting returned by :func:`getdefaulttimeout`\nis used. If *source_address* is set it must be a tuple of (host, port)\nfor the socket to bind as a source address before making the connection.\nA host of '' or port 0 tells the OS to use the default." }, { "name": "socket.dup", "args": null, "description": "dup(integer) -> integer\n\nDuplicate an integer socket file descriptor. This is like os.dup(), but for\nsockets; on some platforms os.dup() won't work for socket file descriptors." }, { "name": "socket.errno", "args": null, "description": "This module makes available standard errno system symbols.\n\nThe value of each symbol is the corresponding integer value,\ne.g., on most systems, errno.ENOENT equals the integer 2.\n\nThe dictionary errno.errorcode maps numeric codes to symbol names,\ne.g., errno.errorcode[2] could be the string 'ENOENT'.\n\nSymbols that are not relevant to the underlying system are not defined.\n\nTo map error codes to error messages, use the function os.strerror(),\ne.g. os.strerror(2) could return 'No such file or directory'." }, { "name": "socket.OSError", "args": null, "description": "Base class for I/O related errors." }, { "name": "socket.fromfd", "args": [ "fd", "family", "type", "proto=0" ], "description": "fromfd(fd, family, type[, proto]) -> socket object\n\nCreate a socket object from a duplicate of the given file\ndescriptor. The remaining arguments are the same as for socket()." }, { "name": "socket.gaierror", "args": null, "description": "Base class for I/O related errors." }, { "name": "socket.getaddrinfo", "args": [ "host", "port", "family=0", "type=0", "proto=0", "flags=0" ], "description": "Resolve host and port into list of address info entries.\n\nTranslate the host/port argument into a sequence of 5-tuples that contain\nall the necessary arguments for creating a socket connected to that service.\nhost is a domain name, a string representation of an IPv4/v6 address or\nNone. port is a string service name such as 'http', a numeric port number or\nNone. By passing None as the value of host and port, you can pass NULL to\nthe underlying C API.\n\nThe family, type and proto arguments can be optionally specified in order to\nnarrow the list of addresses returned. Passing zero as a value for each of\nthese arguments selects the full range of results." }, { "name": "socket.getdefaulttimeout", "args": null, "description": "getdefaulttimeout() -> timeout\n\nReturns the default timeout in seconds (float) for new socket objects.\nA value of None indicates that new socket objects have no timeout.\nWhen the socket module is first imported, the default is None." }, { "name": "socket.getfqdn", "args": [ "name=''" ], "description": "Get fully qualified domain name from name.\n\nAn empty argument is interpreted as meaning the local host.\n\nFirst the hostname returned by gethostbyaddr() is checked, then\npossibly existing aliases. In case no FQDN is available, hostname\nfrom gethostname() is returned." }, { "name": "socket.gethostbyaddr", "args": null, "description": "gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\nReturn the true host name, a list of aliases, and a list of IP addresses,\nfor a host. The host argument is a string giving a host name or IP number." }, { "name": "socket.gethostbyname", "args": null, "description": "gethostbyname(host) -> address\n\nReturn the IP address (a string of the form '255.255.255.255') for a host." }, { "name": "socket.gethostbyname_ex", "args": null, "description": "gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\nReturn the true host name, a list of aliases, and a list of IP addresses,\nfor a host. The host argument is a string giving a host name or IP number." }, { "name": "socket.gethostname", "args": null, "description": "gethostname() -> string\n\nReturn the current host name." }, { "name": "socket.getnameinfo", "args": null, "description": "getnameinfo(sockaddr, flags) --> (host, port)\n\nGet host and port for a sockaddr." }, { "name": "socket.getprotobyname", "args": null, "description": "getprotobyname(name) -> integer\n\nReturn the protocol number for the named protocol. (Rarely used.)" }, { "name": "socket.getservbyname", "args": null, "description": "getservbyname(servicename[, protocolname]) -> integer\n\nReturn a port number from a service name and protocol name.\nThe optional protocol name, if given, should be 'tcp' or 'udp',\notherwise any protocol will match." }, { "name": "socket.getservbyport", "args": null, "description": "getservbyport(port[, protocolname]) -> string\n\nReturn the service name from a port number and protocol name.\nThe optional protocol name, if given, should be 'tcp' or 'udp',\notherwise any protocol will match." }, { "name": "socket.herror", "args": null, "description": "Base class for I/O related errors." }, { "name": "socket.htonl", "args": null, "description": "htonl(integer) -> integer\n\nConvert a 32-bit integer from host to network byte order." }, { "name": "socket.htons", "args": null, "description": "htons(integer) -> integer\n\nConvert a 16-bit integer from host to network byte order." }, { "name": "socket.if_indextoname", "args": null, "description": "if_indextoname(if_index)\n\nReturns the interface name corresponding to the interface index if_index." }, { "name": "socket.if_nameindex", "args": null, "description": "if_nameindex()\n\nReturns a list of network interface information (index, name) tuples." }, { "name": "socket.if_nametoindex", "args": null, "description": "if_nametoindex(if_name)\n\nReturns the interface index corresponding to the interface name if_name." }, { "name": "socket.inet_aton", "args": null, "description": "inet_aton(string) -> bytes giving packed 32-bit IP representation\n\nConvert an IP address in string format (123.45.67.89) to the 32-bit packed\nbinary format used in low-level network functions." }, { "name": "socket.inet_ntoa", "args": null, "description": "inet_ntoa(packed_ip) -> ip_address_string\n\nConvert an IP address from 32-bit packed binary format to string format" }, { "name": "socket.inet_ntop", "args": null, "description": "inet_ntop(af, packed_ip) -> string formatted IP address\n\nConvert a packed IP address of the given family to string format." }, { "name": "socket.inet_pton", "args": null, "description": "inet_pton(af, ip) -> packed IP address string\n\nConvert an IP address from string format to a packed string suitable\nfor use with low-level network functions." }, { "name": "socket.io", "args": null, "description": "The io module provides the Python interfaces to stream handling. The\nbuiltin open function is defined in this module.\n\nAt the top of the I/O hierarchy is the abstract base class IOBase. It\ndefines the basic interface to a stream. Note, however, that there is no\nseparation between reading and writing to streams; implementations are\nallowed to raise an OSError if they do not support a given operation.\n\nExtending IOBase is RawIOBase which deals simply with the reading and\nwriting of raw bytes to a stream. FileIO subclasses RawIOBase to provide\nan interface to OS files.\n\nBufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its\nsubclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer\nstreams that are readable, writable, and both respectively.\nBufferedRandom provides a buffered interface to random access\nstreams. BytesIO is a simple stream of in-memory bytes.\n\nAnother IOBase subclass, TextIOBase, deals with the encoding and decoding\nof streams into text. TextIOWrapper, which extends it, is a buffered text\ninterface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\nis an in-memory stream for text.\n\nArgument names are not part of the specification, and only the arguments\nof open() are intended to be used as keyword arguments.\n\ndata:\n\nDEFAULT_BUFFER_SIZE\n\n An int containing the default buffer size used by the module's buffered\n I/O classes. open() uses the file's blksize (as obtained by os.stat) if\n possible." }, { "name": "socket.ntohl", "args": null, "description": "ntohl(integer) -> integer\n\nConvert a 32-bit integer from network to host byte order." }, { "name": "socket.ntohs", "args": null, "description": "ntohs(integer) -> integer\n\nConvert a 16-bit integer from network to host byte order." }, { "name": "socket.os", "args": null, "description": "OS routines for NT or Posix depending on what system we're on.\n\nThis exports:\n - all functions from posix or nt, e.g. unlink, stat, etc.\n - os.path is either posixpath or ntpath\n - os.name is either 'posix' or 'nt'\n - os.curdir is a string representing the current directory (always '.')\n - os.pardir is a string representing the parent directory (always '..')\n - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n - os.extsep is the extension separator (always '.')\n - os.altsep is the alternate pathname separator (None or '/')\n - os.pathsep is the component separator used in $PATH etc\n - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r\\n')\n - os.defpath is the default search path for executables\n - os.devnull is the file path of the null device ('/dev/null', etc.)\n\nPrograms that import and use 'os' stand a better chance of being\nportable between different platforms. Of course, they must then\nonly use functions that are defined by all platforms (e.g., unlink\nand opendir), and leave all pathname manipulation to os.path\n(e.g., split and join)." }, { "name": "socket.selectors", "args": null, "description": "Selectors module.\n\nThis module allows high-level and efficient I/O multiplexing, built upon the\n`select` module primitives." }, { "name": "socket.setdefaulttimeout", "args": null, "description": "setdefaulttimeout(timeout)\n\nSet the default timeout in seconds (float) for new socket objects.\nA value of None indicates that new socket objects have no timeout.\nWhen the socket module is first imported, the default is None." }, { "name": "socket.sethostname", "args": null, "description": "sethostname(name)\n\nSets the hostname to name." }, { "name": "socket.socket", "args": [ "family=", "type=", "proto=0", "fileno=None" ], "description": "A subclass of _socket.socket adding the makefile() method." }, { "name": "socket.socketpair", "args": [ "family=None", "type=", "proto=0" ], "description": "socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nCreate a pair of socket objects from the sockets returned by the platform\nsocketpair() function.\nThe arguments are the same as for socket() except the default family is AF_UNIX\nif defined on the platform; otherwise, the default is AF_INET." }, { "name": "socket.sys", "args": null, "description": "This module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function" }, { "name": "socket.timeout", "args": null, "description": "Base class for I/O related errors." }, { "name": "datetime.date", "args": null, "description": "date(year, month, day) --> date object" }, { "name": "datetime.datetime", "args": null, "description": "datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\nThe year, month and day arguments are required. tzinfo may be None, or an\ninstance of a tzinfo subclass. The remaining arguments may be ints." }, { "name": "datetime.time", "args": null, "description": "time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n\nAll arguments are optional. tzinfo may be None, or an instance of\na tzinfo subclass. The remaining arguments may be ints." }, { "name": "datetime.timedelta", "args": null, "description": "Difference between two datetime values." }, { "name": "datetime.timezone", "args": null, "description": "Fixed offset from UTC implementation of tzinfo." }, { "name": "datetime.tzinfo", "args": null, "description": "Abstract base class for time zone info objects." }, { "name": "collections.ByteString", "args": [ "" ], "description": "This unifies bytes and bytearray.\n\nXXX Should add all their methods." }, { "name": "collections.ChainMap", "args": [ "*maps" ], "description": "A ChainMap groups multiple dicts (or other mappings) together\nto create a single, updateable view.\n\nThe underlying mappings are stored in a list. That list is public and can\nbe accessed or updated using the *maps* attribute. There is no other\nstate.\n\nLookups search the underlying mappings successively until a key is found.\nIn contrast, writes, updates, and deletions only operate on the first\nmapping." }, { "name": "collections.Counter", "args": [ "*args", "**kwds" ], "description": "Dict subclass for counting hashable items. Sometimes called a bag\nor multiset. Elements are stored as dictionary keys and their counts\nare stored as dictionary values.\n\n>>> c = Counter('abcdeabcdabcaba') # count elements from a string\n\n>>> c.most_common(3) # three most common elements\n[('a', 5), ('b', 4), ('c', 3)]\n>>> sorted(c) # list all unique elements\n['a', 'b', 'c', 'd', 'e']\n>>> ''.join(sorted(c.elements())) # list elements with repetitions\n'aaaaabbbbcccdde'\n>>> sum(c.values()) # total of all counts\n15\n\n>>> c['a'] # count of letter 'a'\n5\n>>> for elem in 'shazam': # update counts from an iterable\n... c[elem] += 1 # by adding 1 to each element's count\n>>> c['a'] # now there are seven 'a'\n7\n>>> del c['b'] # remove all 'b'\n>>> c['b'] # now there are zero 'b'\n0\n\n>>> d = Counter('simsalabim') # make another counter\n>>> c.update(d) # add in the second counter\n>>> c['a'] # now there are nine 'a'\n9\n\n>>> c.clear() # empty the counter\n>>> c\nCounter()\n\nNote: If a count is set to zero or reduced to zero, it will remain\nin the counter until the entry is deleted or the counter is cleared:\n\n>>> c = Counter('aaabbc')\n>>> c['b'] -= 2 # reduce the count of 'b' by two\n>>> c.most_common() # 'b' is still in, but its count is zero\n[('a', 3), ('c', 1), ('b', 0)]" }, { "name": "collections.ItemsView", "args": [ "mapping" ], "description": "A set is a finite, iterable container.\n\nThis class provides concrete generic implementations of all\nmethods except for __contains__, __iter__ and __len__.\n\nTo override the comparisons (presumably for speed, as the\nsemantics are fixed), redefine __le__ and __ge__,\nthen the other operations will automatically follow suit." }, { "name": "collections.KeysView", "args": [ "mapping" ], "description": "A set is a finite, iterable container.\n\nThis class provides concrete generic implementations of all\nmethods except for __contains__, __iter__ and __len__.\n\nTo override the comparisons (presumably for speed, as the\nsemantics are fixed), redefine __le__ and __ge__,\nthen the other operations will automatically follow suit." }, { "name": "collections.MutableSequence", "args": [ "" ], "description": "All the operations on a read-only sequence.\n\nConcrete subclasses must override __new__ or __init__,\n__getitem__, and __len__." }, { "name": "collections.MutableSet", "args": [ "" ], "description": "A mutable set is a finite, iterable container.\n\nThis class provides concrete generic implementations of all\nmethods except for __contains__, __iter__, __len__,\nadd(), and discard().\n\nTo override the comparisons (presumably for speed, as the\nsemantics are fixed), all you have to do is redefine __le__ and\nthen the other operations will automatically follow suit." }, { "name": "collections.OrderedDict", "args": null, "description": "Dictionary that remembers insertion order" }, { "name": "collections.Sequence", "args": [ "" ], "description": "All the operations on a read-only sequence.\n\nConcrete subclasses must override __new__ or __init__,\n__getitem__, and __len__." }, { "name": "collections.Set", "args": [ "" ], "description": "A set is a finite, iterable container.\n\nThis class provides concrete generic implementations of all\nmethods except for __contains__, __iter__ and __len__.\n\nTo override the comparisons (presumably for speed, as the\nsemantics are fixed), redefine __le__ and __ge__,\nthen the other operations will automatically follow suit." }, { "name": "collections.UserList", "args": [ "initlist=None" ], "description": "A more or less complete user-defined wrapper around list objects." }, { "name": "collections.UserString", "args": [ "seq" ], "description": "All the operations on a read-only sequence.\n\nConcrete subclasses must override __new__ or __init__,\n__getitem__, and __len__." }, { "name": "collections.defaultdict", "args": null, "description": "defaultdict(default_factory[, ...]) --> dict with default factory\n\nThe default factory is called without arguments to produce\na new value when a key is not present, in __getitem__ only.\nA defaultdict compares equal to a dict with the same items.\nAll remaining arguments are treated the same as if they were\npassed to the dict constructor, including keyword arguments." }, { "name": "collections.deque", "args": null, "description": "deque([iterable[, maxlen]]) --> deque object\n\nA list-like sequence optimized for data accesses near its endpoints." }, { "name": "collections.namedtuple", "args": [ "typename", "field_names", "*", "verbose=False", "rename=False", "module=None" ], "description": "Returns a new subclass of tuple with named fields.\n\n>>> Point = namedtuple('Point', ['x', 'y'])\n>>> Point.__doc__ # docstring for the new class\n'Point(x, y)'\n>>> p = Point(11, y=22) # instantiate with positional args or keywords\n>>> p[0] + p[1] # indexable like a plain tuple\n33\n>>> x, y = p # unpack like a regular tuple\n>>> x, y\n(11, 22)\n>>> p.x + p.y # fields also accessible by name\n33\n>>> d = p._asdict() # convert to a dictionary\n>>> d['x']\n11\n>>> Point(**d) # convert from a dictionary\nPoint(x=11, y=22)\n>>> p._replace(x=100) # _replace() is like str.replace() but targets named fields\nPoint(x=100, y=22)" }, { "name": "datetime.date", "args": null, "description": "date(year, month, day) --> date object" }, { "name": "datetime.datetime", "args": null, "description": "datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\nThe year, month and day arguments are required. tzinfo may be None, or an\ninstance of a tzinfo subclass. The remaining arguments may be ints." }, { "name": "datetime.time", "args": null, "description": "time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n\nAll arguments are optional. tzinfo may be None, or an instance of\na tzinfo subclass. The remaining arguments may be ints." }, { "name": "datetime.timedelta", "args": null, "description": "Difference between two datetime values." }, { "name": "datetime.timezone", "args": null, "description": "Fixed offset from UTC implementation of tzinfo." }, { "name": "datetime.tzinfo", "args": null, "description": "Abstract base class for time zone info objects." }, { "name": "array.array", "args": null, "description": "array(typecode [, initializer]) -> array\n\nReturn a new array whose items are restricted by typecode, and\ninitialized from the optional initializer value, which must be a list,\nstring or iterable over elements of the appropriate type.\n\nArrays represent basic values and behave very much like lists, except\nthe type of objects stored in them is constrained. The type is specified\nat object creation time by using a type code, which is a single character.\nThe following type codes are defined:\n\n Type code C Type Minimum size in bytes \n 'b' signed integer 1 \n 'B' unsigned integer 1 \n 'u' Unicode character 2 (see note) \n 'h' signed integer 2 \n 'H' unsigned integer 2 \n 'i' signed integer 2 \n 'I' unsigned integer 2 \n 'l' signed integer 4 \n 'L' unsigned integer 4 \n 'q' signed integer 8 (see note) \n 'Q' unsigned integer 8 (see note) \n 'f' floating point 4 \n 'd' floating point 8 \n\nNOTE: The 'u' typecode corresponds to Python's unicode character. On \nnarrow builds this is 2-bytes on wide builds this is 4-bytes.\n\nNOTE: The 'q' and 'Q' type codes are only available if the platform \nC compiler used to build Python supports 'long long', or, on Windows, \n'__int64'.\n\nMethods:\n\nappend() -- append a new item to the end of the array\nbuffer_info() -- return information giving the current memory info\nbyteswap() -- byteswap all the items of the array\ncount() -- return number of occurrences of an object\nextend() -- extend array by appending multiple elements from an iterable\nfromfile() -- read items from a file object\nfromlist() -- append items from the list\nfrombytes() -- append items from the string\nindex() -- return index of first occurrence of an object\ninsert() -- insert a new item into the array at a provided position\npop() -- remove and return item (default last)\nremove() -- remove first occurrence of an object\nreverse() -- reverse the order of the items in the array\ntofile() -- write all items to a file object\ntolist() -- return the array converted to an ordinary list\ntobytes() -- return the array converted to a string\n\nAttributes:\n\ntypecode -- the typecode character used to create the array\nitemsize -- the length in bytes of one array item" }, { "name": "array.array", "args": null, "description": "array(typecode [, initializer]) -> array\n\nReturn a new array whose items are restricted by typecode, and\ninitialized from the optional initializer value, which must be a list,\nstring or iterable over elements of the appropriate type.\n\nArrays represent basic values and behave very much like lists, except\nthe type of objects stored in them is constrained. The type is specified\nat object creation time by using a type code, which is a single character.\nThe following type codes are defined:\n\n Type code C Type Minimum size in bytes \n 'b' signed integer 1 \n 'B' unsigned integer 1 \n 'u' Unicode character 2 (see note) \n 'h' signed integer 2 \n 'H' unsigned integer 2 \n 'i' signed integer 2 \n 'I' unsigned integer 2 \n 'l' signed integer 4 \n 'L' unsigned integer 4 \n 'q' signed integer 8 (see note) \n 'Q' unsigned integer 8 (see note) \n 'f' floating point 4 \n 'd' floating point 8 \n\nNOTE: The 'u' typecode corresponds to Python's unicode character. On \nnarrow builds this is 2-bytes on wide builds this is 4-bytes.\n\nNOTE: The 'q' and 'Q' type codes are only available if the platform \nC compiler used to build Python supports 'long long', or, on Windows, \n'__int64'.\n\nMethods:\n\nappend() -- append a new item to the end of the array\nbuffer_info() -- return information giving the current memory info\nbyteswap() -- byteswap all the items of the array\ncount() -- return number of occurrences of an object\nextend() -- extend array by appending multiple elements from an iterable\nfromfile() -- read items from a file object\nfromlist() -- append items from the list\nfrombytes() -- append items from the string\nindex() -- return index of first occurrence of an object\ninsert() -- insert a new item into the array at a provided position\npop() -- remove and return item (default last)\nremove() -- remove first occurrence of an object\nreverse() -- reverse the order of the items in the array\ntofile() -- write all items to a file object\ntolist() -- return the array converted to an ordinary list\ntobytes() -- return the array converted to a string\n\nAttributes:\n\ntypecode -- the typecode character used to create the array\nitemsize -- the length in bytes of one array item" }, { "name": "itertools.accumulate", "args": null, "description": "accumulate(iterable[, func]) --> accumulate object\n\nReturn series of accumulated sums (or other binary function results)." }, { "name": "itertools.chain", "args": null, "description": "chain(*iterables) --> chain object\n\nReturn a chain object whose .__next__() method returns elements from the\nfirst iterable until it is exhausted, then elements from the next\niterable, until all of the iterables are exhausted." }, { "name": "itertools.combinations", "args": null, "description": "combinations(iterable, r) --> combinations object\n\nReturn successive r-length combinations of elements in the iterable.\n\ncombinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)" }, { "name": "itertools.combinations_with_replacement", "args": null, "description": "combinations_with_replacement(iterable, r) --> combinations_with_replacement object\n\nReturn successive r-length combinations of elements in the iterable\nallowing individual elements to have successive repeats.\ncombinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC" }, { "name": "itertools.compress", "args": null, "description": "compress(data, selectors) --> iterator over selected data\n\nReturn data elements corresponding to true selector elements.\nForms a shorter iterator from selected data elements using the\nselectors to choose the data elements." }, { "name": "itertools.count", "args": null, "description": "count(start=0, step=1) --> count object\n\nReturn a count object whose .__next__() method returns consecutive values.\nEquivalent to:\n\n def count(firstval=0, step=1):\n x = firstval\n while 1:\n yield x\n x += step" }, { "name": "itertools.cycle", "args": null, "description": "cycle(iterable) --> cycle object\n\nReturn elements from the iterable until it is exhausted.\nThen repeat the sequence indefinitely." }, { "name": "itertools.dropwhile", "args": null, "description": "dropwhile(predicate, iterable) --> dropwhile object\n\nDrop items from the iterable while predicate(item) is true.\nAfterwards, return every element until the iterable is exhausted." }, { "name": "itertools.filterfalse", "args": null, "description": "filterfalse(function or None, sequence) --> filterfalse object\n\nReturn those items of sequence for which function(item) is false.\nIf function is None, return the items that are false." }, { "name": "itertools.groupby", "args": null, "description": "groupby(iterable[, keyfunc]) -> create an iterator which returns\n(key, sub-iterator) grouped by each value of key(value)." }, { "name": "itertools.islice", "args": null, "description": "islice(iterable, stop) --> islice object\nislice(iterable, start, stop[, step]) --> islice object\n\nReturn an iterator whose next() method returns selected values from an\niterable. If start is specified, will skip all preceding elements;\notherwise, start defaults to zero. Step defaults to one. If\nspecified as another value, step determines how many values are \nskipped between successive calls. Works like a slice() on a list\nbut returns an iterator." }, { "name": "itertools.permutations", "args": null, "description": "permutations(iterable[, r]) --> permutations object\n\nReturn successive r-length permutations of elements in the iterable.\n\npermutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)" }, { "name": "itertools.product", "args": null, "description": "product(*iterables, repeat=1) --> product object\n\nCartesian product of input iterables. Equivalent to nested for-loops.\n\nFor example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\nThe leftmost iterators are in the outermost for-loop, so the output tuples\ncycle in a manner similar to an odometer (with the rightmost element changing\non every iteration).\n\nTo compute the product of an iterable with itself, specify the number\nof repetitions with the optional repeat keyword argument. For example,\nproduct(A, repeat=4) means the same as product(A, A, A, A).\n\nproduct('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\nproduct((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ..." }, { "name": "itertools.repeat", "args": null, "description": "repeat(object [,times]) -> create an iterator which returns the object\nfor the specified number of times. If not specified, returns the object\nendlessly." }, { "name": "itertools.starmap", "args": null, "description": "starmap(function, sequence) --> starmap object\n\nReturn an iterator whose values are returned from the function evaluated\nwith an argument tuple taken from the given sequence." }, { "name": "itertools.takewhile", "args": null, "description": "takewhile(predicate, iterable) --> takewhile object\n\nReturn successive entries from an iterable as long as the \npredicate evaluates to true for each entry." }, { "name": "itertools.tee", "args": null, "description": "tee(iterable, n=2) --> tuple of n independent iterators." }, { "name": "itertools.zip_longest", "args": null, "description": "zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\n\nReturn a zip_longest object whose .__next__() method returns a tuple where\nthe i-th element comes from the i-th iterable argument. The .__next__()\nmethod continues until the longest iterable in the argument sequence\nis exhausted and then it raises StopIteration. When the shorter iterables\nare exhausted, the fillvalue is substituted in their place. The fillvalue\ndefaults to None or can be specified by a keyword argument." }, { "name": "functools.WeakKeyDictionary", "args": [ "dict=None" ], "description": "Mapping class that references keys weakly.\n\nEntries in the dictionary will be discarded when there is no\nlonger a strong reference to the key. This can be used to\nassociate additional data with an object owned by other parts of\nan application without adding attributes to those objects. This\ncan be especially useful with objects that override attribute\naccesses." }, { "name": "functools.cmp_to_key", "args": null, "description": "Convert a cmp= function into a key= function." }, { "name": "functools.get_cache_token", "args": [ "" ], "description": "Returns the current ABC cache token.\n\nThe token is an opaque object (supporting equality testing) identifying the\ncurrent version of the ABC cache for virtual subclasses. The token changes\nwith every call to ``register()`` on any ABC." }, { "name": "functools.lru_cache", "args": [ "maxsize=128", "typed=False" ], "description": "Least-recently-used cache decorator.\n\nIf *maxsize* is set to None, the LRU features are disabled and the cache\ncan grow without bound.\n\nIf *typed* is True, arguments of different types will be cached separately.\nFor example, f(3.0) and f(3) will be treated as distinct calls with\ndistinct results.\n\nArguments to the cached function must be hashable.\n\nView the cache statistics named tuple (hits, misses, maxsize, currsize)\nwith f.cache_info(). Clear the cache and statistics with f.cache_clear().\nAccess the underlying function with f.__wrapped__.\n\nSee: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used" }, { "name": "functools.namedtuple", "args": [ "typename", "field_names", "*", "verbose=False", "rename=False", "module=None" ], "description": "Returns a new subclass of tuple with named fields.\n\n>>> Point = namedtuple('Point', ['x', 'y'])\n>>> Point.__doc__ # docstring for the new class\n'Point(x, y)'\n>>> p = Point(11, y=22) # instantiate with positional args or keywords\n>>> p[0] + p[1] # indexable like a plain tuple\n33\n>>> x, y = p # unpack like a regular tuple\n>>> x, y\n(11, 22)\n>>> p.x + p.y # fields also accessible by name\n33\n>>> d = p._asdict() # convert to a dictionary\n>>> d['x']\n11\n>>> Point(**d) # convert from a dictionary\nPoint(x=11, y=22)\n>>> p._replace(x=100) # _replace() is like str.replace() but targets named fields\nPoint(x=100, y=22)" }, { "name": "functools.partial", "args": null, "description": "partial(func, *args, **keywords) - new function with partial application\nof the given arguments and keywords." }, { "name": "functools.partialmethod", "args": [ "func", "*args", "**keywords" ], "description": "Method descriptor with partial application of the given arguments\nand keywords.\n\nSupports wrapping existing descriptors and handles non-descriptor\ncallables as instance methods." }, { "name": "functools.recursive_repr", "args": [ "fillvalue='...'" ], "description": "Decorator to make a repr function return fillvalue for a recursive call" }, { "name": "functools.reduce", "args": null, "description": "reduce(function, sequence[, initial]) -> value\n\nApply a function of two arguments cumulatively to the items of a sequence,\nfrom left to right, so as to reduce the sequence to a single value.\nFor example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n((((1+2)+3)+4)+5). If initial is present, it is placed before the items\nof the sequence in the calculation, and serves as a default when the\nsequence is empty." }, { "name": "functools.singledispatch", "args": [ "func" ], "description": "Single-dispatch generic function decorator.\n\nTransforms a function into a generic function, which can have different\nbehaviours depending upon the type of its first argument. The decorated\nfunction acts as the default implementation, and additional\nimplementations can be registered using the register() attribute of the\ngeneric function." }, { "name": "functools.total_ordering", "args": [ "cls" ], "description": "Class decorator that fills in missing ordering methods" }, { "name": "functools.update_wrapper", "args": [ "wrapper", "wrapped", "assigned='__module__'", "'__name__'", "'__qualname__'", "'__doc__'", "'__annotations__'", "updated='__dict__'," ], "description": "Update a wrapper function to look like the wrapped function\n\nwrapper is the function to be updated\nwrapped is the original function\nassigned is a tuple naming the attributes assigned directly\nfrom the wrapped function to the wrapper function (defaults to\nfunctools.WRAPPER_ASSIGNMENTS)\nupdated is a tuple naming the attributes of the wrapper that\nare updated with the corresponding attribute from the wrapped\nfunction (defaults to functools.WRAPPER_UPDATES)" }, { "name": "functools.wraps", "args": [ "wrapped", "assigned='__module__'", "'__name__'", "'__qualname__'", "'__doc__'", "'__annotations__'", "updated='__dict__'," ], "description": "Decorator factory to apply update_wrapper() to a wrapper function\n\nReturns a decorator that invokes update_wrapper() with the decorated\nfunction as the wrapper argument and the arguments to wraps() as the\nremaining arguments. Default arguments are as for update_wrapper().\nThis is a convenience function to simplify applying partial() to\nupdate_wrapper()." }, { "name": "os.path.abspath", "args": [ "path" ], "description": "Return an absolute path." }, { "name": "os.path.basename", "args": [ "p" ], "description": "Returns the final component of a pathname" }, { "name": "os.path.commonpath", "args": [ "paths" ], "description": "Given a sequence of path names, returns the longest common sub-path." }, { "name": "os.path.commonprefix", "args": [ "m" ], "description": "Given a list of pathnames, returns the longest common leading component" }, { "name": "os.path.dirname", "args": [ "p" ], "description": "Returns the directory component of a pathname" }, { "name": "os.path.exists", "args": [ "path" ], "description": "Test whether a path exists. Returns False for broken symbolic links" }, { "name": "os.path.expanduser", "args": [ "path" ], "description": "Expand ~ and ~user constructions. If user or $HOME is unknown,\ndo nothing." }, { "name": "os.path.expandvars", "args": [ "path" ], "description": "Expand shell variables of form $var and ${var}. Unknown variables\nare left unchanged." }, { "name": "os.path.genericpath", "args": null, "description": "Path operations common to more than one OS\nDo not use directly. The OS specific modules import the appropriate\nfunctions from this module themselves." }, { "name": "os.path.getatime", "args": [ "filename" ], "description": "Return the last access time of a file, reported by os.stat()." }, { "name": "os.path.getctime", "args": [ "filename" ], "description": "Return the metadata change time of a file, reported by os.stat()." }, { "name": "os.path.getmtime", "args": [ "filename" ], "description": "Return the last modification time of a file, reported by os.stat()." }, { "name": "os.path.getsize", "args": [ "filename" ], "description": "Return the size of a file, reported by os.stat()." }, { "name": "os.path.isabs", "args": [ "s" ], "description": "Test whether a path is absolute" }, { "name": "os.path.isdir", "args": [ "s" ], "description": "Return true if the pathname refers to an existing directory." }, { "name": "os.path.isfile", "args": [ "path" ], "description": "Test whether a path is a regular file" }, { "name": "os.path.islink", "args": [ "path" ], "description": "Test whether a path is a symbolic link" }, { "name": "os.path.ismount", "args": [ "path" ], "description": "Test whether a path is a mount point" }, { "name": "os.path.join", "args": [ "a", "*p" ], "description": "Join two or more pathname components, inserting '/' as needed.\nIf any component is an absolute path, all previous path components\nwill be discarded. An empty last part will result in a path that\nends with a separator." }, { "name": "os.path.lexists", "args": [ "path" ], "description": "Test whether a path exists. Returns True for broken symbolic links" }, { "name": "os.path.normcase", "args": [ "s" ], "description": "Normalize case of pathname. Has no effect under Posix" }, { "name": "os.path.normpath", "args": [ "path" ], "description": "Normalize path, eliminating double slashes, etc." }, { "name": "os.path.os", "args": null, "description": "OS routines for NT or Posix depending on what system we're on.\n\nThis exports:\n - all functions from posix or nt, e.g. unlink, stat, etc.\n - os.path is either posixpath or ntpath\n - os.name is either 'posix' or 'nt'\n - os.curdir is a string representing the current directory (always '.')\n - os.pardir is a string representing the parent directory (always '..')\n - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n - os.extsep is the extension separator (always '.')\n - os.altsep is the alternate pathname separator (None or '/')\n - os.pathsep is the component separator used in $PATH etc\n - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r\\n')\n - os.defpath is the default search path for executables\n - os.devnull is the file path of the null device ('/dev/null', etc.)\n\nPrograms that import and use 'os' stand a better chance of being\nportable between different platforms. Of course, they must then\nonly use functions that are defined by all platforms (e.g., unlink\nand opendir), and leave all pathname manipulation to os.path\n(e.g., split and join)." }, { "name": "os.path.realpath", "args": [ "filename" ], "description": "Return the canonical path of the specified filename, eliminating any\nsymbolic links encountered in the path." }, { "name": "os.path.relpath", "args": [ "path", "start=None" ], "description": "Return a relative version of a path" }, { "name": "os.path.samefile", "args": [ "f1", "f2" ], "description": "Test whether two pathnames reference the same actual file" }, { "name": "os.path.sameopenfile", "args": [ "fp1", "fp2" ], "description": "Test whether two open file objects reference the same file" }, { "name": "os.path.samestat", "args": [ "s1", "s2" ], "description": "Test whether two stat buffers reference the same file" }, { "name": "os.path.split", "args": [ "p" ], "description": "Split a pathname. Returns tuple \"(head, tail)\" where \"tail\" is\neverything after the final slash. Either part may be empty." }, { "name": "os.path.splitdrive", "args": [ "p" ], "description": "Split a pathname into drive and path. On Posix, drive is always\nempty." }, { "name": "os.path.splitext", "args": [ "p" ], "description": "Split the extension from a pathname.\n\nExtension is everything from the last dot to the end, ignoring\nleading dots. Returns \"(root, ext)\"; ext may be empty." }, { "name": "os.path.stat", "args": null, "description": "Constants/functions for interpreting results of os.stat() and os.lstat().\n\nSuggested usage: from stat import *" }, { "name": "os.path.sys", "args": null, "description": "This module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function" }, { "name": "csv.Dialect", "args": [ "" ], "description": "Describe a CSV dialect.\n\nThis must be subclassed (see csv.excel). Valid attributes are:\ndelimiter, quotechar, escapechar, doublequote, skipinitialspace,\nlineterminator, quoting." }, { "name": "csv.Error", "args": null, "description": "Common base class for all non-exit exceptions." }, { "name": "csv.OrderedDict", "args": null, "description": "Dictionary that remembers insertion order" }, { "name": "csv.Sniffer", "args": [ "" ], "description": "\"Sniffs\" the format of a CSV file (i.e. delimiter, quotechar)\nReturns a Dialect object." }, { "name": "csv.StringIO", "args": [ "initial_value=''", "newline='\\n'" ], "description": "Text I/O implementation using an in-memory buffer.\n\nThe initial_value argument sets the value of object. The newline\nargument is like the one of TextIOWrapper's constructor." }, { "name": "csv.excel", "args": [ "" ], "description": "Describe the usual properties of Excel-generated CSV files." }, { "name": "csv.excel_tab", "args": [ "" ], "description": "Describe the usual properties of Excel-generated TAB-delimited files." }, { "name": "csv.field_size_limit", "args": null, "description": "Sets an upper limit on parsed fields.\n csv.field_size_limit([limit])\n\nReturns old limit. If limit is not given, no new limit is set and\nthe old limit is returned" }, { "name": "csv.get_dialect", "args": null, "description": "Return the dialect instance associated with name.\ndialect = csv.get_dialect(name)" }, { "name": "csv.list_dialects", "args": null, "description": "Return a list of all know dialect names.\nnames = csv.list_dialects()" }, { "name": "csv.re", "args": null, "description": "Support for regular expressions (RE).\n\nThis module provides regular expression matching operations similar to\nthose found in Perl. It supports both 8-bit and Unicode strings; both\nthe pattern and the strings being processed can contain null bytes and\ncharacters outside the US ASCII range.\n\nRegular expressions can contain both special and ordinary characters.\nMost ordinary characters, like \"A\", \"a\", or \"0\", are the simplest\nregular expressions; they simply match themselves. You can\nconcatenate ordinary characters, so last matches the string 'last'.\n\nThe special characters are:\n \".\" Matches any character except a newline.\n \"^\" Matches the start of the string.\n \"$\" Matches the end of the string or just before the newline at\n the end of the string.\n \"*\" Matches 0 or more (greedy) repetitions of the preceding RE.\n Greedy means that it will match as many repetitions as possible.\n \"+\" Matches 1 or more (greedy) repetitions of the preceding RE.\n \"?\" Matches 0 or 1 (greedy) of the preceding RE.\n *?,+?,?? Non-greedy versions of the previous three special characters.\n {m,n} Matches from m to n repetitions of the preceding RE.\n {m,n}? Non-greedy version of the above.\n \"\\\\\" Either escapes special characters or signals a special sequence.\n [] Indicates a set of characters.\n A \"^\" as the first character indicates a complementing set.\n \"|\" A|B, creates an RE that will match either A or B.\n (...) Matches the RE inside the parentheses.\n The contents can be retrieved or matched later in the string.\n (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below).\n (?:...) Non-grouping version of regular parentheses.\n (?P...) The substring matched by the group is accessible by name.\n (?P=name) Matches the text matched earlier by the group named name.\n (?#...) A comment; ignored.\n (?=...) Matches if ... matches next, but doesn't consume the string.\n (?!...) Matches if ... doesn't match next.\n (?<=...) Matches if preceded by ... (must be fixed length).\n (? string\n\nConvert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\nWhen the time tuple is not present, current time as returned by localtime()\nis used." }, { "name": "time.clock", "args": null, "description": "clock() -> floating point number\n\nReturn the CPU time or real time since the start of the process or since\nthe first call to clock(). This has as much precision as the system\nrecords." }, { "name": "time.clock_getres", "args": null, "description": "clock_getres(clk_id) -> floating point number\n\nReturn the resolution (precision) of the specified clock clk_id." }, { "name": "time.clock_gettime", "args": null, "description": "clock_gettime(clk_id) -> floating point number\n\nReturn the time of the specified clock clk_id." }, { "name": "time.clock_settime", "args": null, "description": "clock_settime(clk_id, time)\n\nSet the time of the specified clock clk_id." }, { "name": "time.ctime", "args": null, "description": "ctime(seconds) -> string\n\nConvert a time in seconds since the Epoch to a string in local time.\nThis is equivalent to asctime(localtime(seconds)). When the time tuple is\nnot present, current time as returned by localtime() is used." }, { "name": "time.get_clock_info", "args": null, "description": "get_clock_info(name: str) -> dict\n\nGet information of the specified clock." }, { "name": "time.gmtime", "args": null, "description": "gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n tm_sec, tm_wday, tm_yday, tm_isdst)\n\nConvert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\nGMT). When 'seconds' is not passed in, convert the current time instead.\n\nIf the platform supports the tm_gmtoff and tm_zone, they are available as\nattributes only." }, { "name": "time.localtime", "args": null, "description": "localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n tm_sec,tm_wday,tm_yday,tm_isdst)\n\nConvert seconds since the Epoch to a time tuple expressing local time.\nWhen 'seconds' is not passed in, convert the current time instead." }, { "name": "time.mktime", "args": null, "description": "mktime(tuple) -> floating point number\n\nConvert a time tuple in local time to seconds since the Epoch.\nNote that mktime(gmtime(0)) will not generally return zero for most\ntime zones; instead the returned value will either be equal to that\nof the timezone or altzone attributes on the time module." }, { "name": "time.monotonic", "args": null, "description": "monotonic() -> float\n\nMonotonic clock, cannot go backward." }, { "name": "time.perf_counter", "args": null, "description": "perf_counter() -> float\n\nPerformance counter for benchmarking." }, { "name": "time.process_time", "args": null, "description": "process_time() -> float\n\nProcess time for profiling: sum of the kernel and user-space CPU time." }, { "name": "time.sleep", "args": null, "description": "sleep(seconds)\n\nDelay execution for a given number of seconds. The argument may be\na floating point number for subsecond precision." }, { "name": "time.strftime", "args": null, "description": "strftime(format[, tuple]) -> string\n\nConvert a time tuple to a string according to a format specification.\nSee the library reference manual for formatting codes. When the time tuple\nis not present, current time as returned by localtime() is used.\n\nCommonly used format codes:\n\n%Y Year with century as a decimal number.\n%m Month as a decimal number [01,12].\n%d Day of the month as a decimal number [01,31].\n%H Hour (24-hour clock) as a decimal number [00,23].\n%M Minute as a decimal number [00,59].\n%S Second as a decimal number [00,61].\n%z Time zone offset from UTC.\n%a Locale's abbreviated weekday name.\n%A Locale's full weekday name.\n%b Locale's abbreviated month name.\n%B Locale's full month name.\n%c Locale's appropriate date and time representation.\n%I Hour (12-hour clock) as a decimal number [01,12].\n%p Locale's equivalent of either AM or PM.\n\nOther codes may be available on your platform. See documentation for\nthe C library strftime function." }, { "name": "time.strptime", "args": null, "description": "strptime(string, format) -> struct_time\n\nParse a string to a time tuple according to a format specification.\nSee the library reference manual for formatting codes (same as\nstrftime()).\n\nCommonly used format codes:\n\n%Y Year with century as a decimal number.\n%m Month as a decimal number [01,12].\n%d Day of the month as a decimal number [01,31].\n%H Hour (24-hour clock) as a decimal number [00,23].\n%M Minute as a decimal number [00,59].\n%S Second as a decimal number [00,61].\n%z Time zone offset from UTC.\n%a Locale's abbreviated weekday name.\n%A Locale's full weekday name.\n%b Locale's abbreviated month name.\n%B Locale's full month name.\n%c Locale's appropriate date and time representation.\n%I Hour (12-hour clock) as a decimal number [01,12].\n%p Locale's equivalent of either AM or PM.\n\nOther codes may be available on your platform. See documentation for\nthe C library strftime function." }, { "name": "time.struct_time", "args": null, "description": "The time value as returned by gmtime(), localtime(), and strptime(), and\naccepted by asctime(), mktime() and strftime(). May be considered as a\nsequence of 9 integers.\n\nNote that several fields' values are not the same as those defined by\nthe C language standard for struct tm. For example, the value of the\nfield tm_year is the actual year, not year - 1900. See individual\nfields' descriptions for details." }, { "name": "time.time", "args": null, "description": "time() -> floating point number\n\nReturn the current time in seconds since the Epoch.\nFractions of a second may be present if the system clock provides them." }, { "name": "time.tzset", "args": null, "description": "tzset()\n\nInitialize, or reinitialize, the local timezone to the value stored in\nos.environ['TZ']. The TZ environment variable should be specified in\nstandard Unix timezone format as documented in the tzset man page\n(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\nfall back to UTC. If the TZ environment variable is not set, the local\ntimezone is set to the systems best guess of wallclock time.\nChanging the TZ environment variable without calling tzset *may* change\nthe local timezone used by methods such as localtime, but this behaviour\nshould not be relied on." }, { "name": "argparse.Action", "args": [ "option_strings", "dest", "nargs=None", "const=None", "default=None", "type=None", "choices=None", "required=False", "help=None", "metavar=None" ], "description": "Information about how to convert command line strings to Python objects.\n\nAction objects are used by an ArgumentParser to represent the information\nneeded to parse a single argument from one or more strings from the\ncommand line. The keyword arguments to the Action constructor are also\nall attributes of Action instances.\n\nKeyword Arguments:\n\n - option_strings -- A list of command-line option strings which\n should be associated with this action.\n\n - dest -- The name of the attribute to hold the created object(s)\n\n - nargs -- The number of command-line arguments that should be\n consumed. By default, one argument will be consumed and a single\n value will be produced. Other values include:\n - N (an integer) consumes N arguments (and produces a list)\n - '?' consumes zero or one arguments\n - '*' consumes zero or more arguments (and produces a list)\n - '+' consumes one or more arguments (and produces a list)\n Note that the difference between the default and nargs=1 is that\n with the default, a single value will be produced, while with\n nargs=1, a list containing a single value will be produced.\n\n - const -- The value to be produced if the option is specified and the\n option uses an action that takes no values.\n\n - default -- The value to be produced if the option is not specified.\n\n - type -- A callable that accepts a single string argument, and\n returns the converted value. The standard Python types str, int,\n float, and complex are useful examples of such callables. If None,\n str is used.\n\n - choices -- A container of values that should be allowed. If not None,\n after a command-line argument has been converted to the appropriate\n type, an exception will be raised if it is not a member of this\n collection.\n\n - required -- True if the action must always be specified at the\n command line. This is only meaningful for optional command-line\n arguments.\n\n - help -- The help string describing the argument.\n\n - metavar -- The name to be used for the option's argument with the\n help string. If None, the 'dest' value will be used as the name." }, { "name": "argparse.ArgumentDefaultsHelpFormatter", "args": [ "prog", "indent_increment=2", "max_help_position=24", "width=None" ], "description": "Help message formatter which adds default values to argument help.\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail." }, { "name": "argparse.ArgumentError", "args": [ "argument", "message" ], "description": "An error from creating or using an argument (optional or positional).\n\nThe string value of this exception is the message, augmented with\ninformation about the argument that caused it." }, { "name": "argparse.ArgumentParser", "args": [ "prog=None", "usage=None", "description=None", "epilog=None", "parents=[]", "formatter_class=", "prefix_chars='-'", "fromfile_prefix_chars=None", "argument_default=None", "conflict_handler='error'", "add_help=True", "allow_abbrev=True" ], "description": "Object for parsing command line strings into Python objects.\n\nKeyword Arguments:\n - prog -- The name of the program (default: sys.argv[0])\n - usage -- A usage message (default: auto-generated from arguments)\n - description -- A description of what the program does\n - epilog -- Text following the argument descriptions\n - parents -- Parsers whose arguments should be copied into this one\n - formatter_class -- HelpFormatter class for printing help messages\n - prefix_chars -- Characters that prefix optional arguments\n - fromfile_prefix_chars -- Characters that prefix files containing\n additional arguments\n - argument_default -- The default value for all arguments\n - conflict_handler -- String indicating how to handle conflicts\n - add_help -- Add a -h/-help option\n - allow_abbrev -- Allow long options to be abbreviated unambiguously" }, { "name": "argparse.ArgumentTypeError", "args": null, "description": "An error from trying to convert a command line string to a type." }, { "name": "argparse.FileType", "args": [ "mode='r'", "bufsize=-1", "encoding=None", "errors=None" ], "description": "Factory for creating file object types\n\nInstances of FileType are typically passed as type= arguments to the\nArgumentParser add_argument() method.\n\nKeyword Arguments:\n - mode -- A string indicating how the file is to be opened. Accepts the\n same values as the builtin open() function.\n - bufsize -- The file's desired buffer size. Accepts the same values as\n the builtin open() function.\n - encoding -- The file's encoding. Accepts the same values as the\n builtin open() function.\n - errors -- A string indicating how encoding and decoding errors are to\n be handled. Accepts the same value as the builtin open() function." }, { "name": "argparse.HelpFormatter", "args": [ "prog", "indent_increment=2", "max_help_position=24", "width=None" ], "description": "Formatter for generating usage messages and argument help strings.\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail." }, { "name": "argparse.MetavarTypeHelpFormatter", "args": [ "prog", "indent_increment=2", "max_help_position=24", "width=None" ], "description": "Help message formatter which uses the argument 'type' as the default\nmetavar value (instead of the argument 'dest')\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail." }, { "name": "argparse.Namespace", "args": [ "**kwargs" ], "description": "Simple object for storing attributes.\n\nImplements equality by attribute names and values, and provides a simple\nstring representation." }, { "name": "argparse.RawDescriptionHelpFormatter", "args": [ "prog", "indent_increment=2", "max_help_position=24", "width=None" ], "description": "Help message formatter which retains any formatting in descriptions.\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail." }, { "name": "argparse.RawTextHelpFormatter", "args": [ "prog", "indent_increment=2", "max_help_position=24", "width=None" ], "description": "Help message formatter which retains formatting of all help text.\n\nOnly the name of this class is considered a public API. All the methods\nprovided by the class are considered an implementation detail." }, { "name": "base64.a85decode", "args": [ "b", "*", "foldspaces=False", "adobe=False", "ignorechars=b' \\t\\n\\r\\x0b'" ], "description": "Decode the Ascii85 encoded bytes-like object or ASCII string b.\n\nfoldspaces is a flag that specifies whether the 'y' short sequence should be\naccepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature is\nnot supported by the \"standard\" Adobe encoding.\n\nadobe controls whether the input sequence is in Adobe Ascii85 format (i.e.\nis framed with <~ and ~>).\n\nignorechars should be a byte string containing characters to ignore from the\ninput. This should only contain whitespace characters, and by default\ncontains all whitespace characters in ASCII.\n\nThe result is returned as a bytes object." }, { "name": "base64.a85encode", "args": [ "b", "*", "foldspaces=False", "wrapcol=0", "pad=False", "adobe=False" ], "description": "Encode bytes-like object b using Ascii85 and return a bytes object.\n\nfoldspaces is an optional flag that uses the special short sequence 'y'\ninstead of 4 consecutive spaces (ASCII 0x20) as supported by 'btoa'. This\nfeature is not supported by the \"standard\" Adobe encoding.\n\nwrapcol controls whether the output should have newline (b'\\n') characters\nadded to it. If this is non-zero, each output line will be at most this\nmany characters long.\n\npad controls whether the input is padded to a multiple of 4 before\nencoding. Note that the btoa implementation always pads.\n\nadobe controls whether the encoded byte sequence is framed with <~ and ~>,\nwhich is used by the Adobe implementation." }, { "name": "base64.b16decode", "args": [ "s", "casefold=False" ], "description": "Decode the Base16 encoded bytes-like object or ASCII string s.\n\nOptional casefold is a flag specifying whether a lowercase alphabet is\nacceptable as input. For security purposes, the default is False.\n\nThe result is returned as a bytes object. A binascii.Error is raised if\ns is incorrectly padded or if there are non-alphabet characters present\nin the input." }, { "name": "base64.b16encode", "args": [ "s" ], "description": "Encode the bytes-like object s using Base16 and return a bytes object.\n " }, { "name": "base64.b32decode", "args": [ "s", "casefold=False", "map01=None" ], "description": "Decode the Base32 encoded bytes-like object or ASCII string s.\n\nOptional casefold is a flag specifying whether a lowercase alphabet is\nacceptable as input. For security purposes, the default is False.\n\nRFC 3548 allows for optional mapping of the digit 0 (zero) to the\nletter O (oh), and for optional mapping of the digit 1 (one) to\neither the letter I (eye) or letter L (el). The optional argument\nmap01 when not None, specifies which letter the digit 1 should be\nmapped to (when map01 is not None, the digit 0 is always mapped to\nthe letter O). For security purposes the default is None, so that\n0 and 1 are not allowed in the input.\n\nThe result is returned as a bytes object. A binascii.Error is raised if\nthe input is incorrectly padded or if there are non-alphabet\ncharacters present in the input." }, { "name": "base64.b32encode", "args": [ "s" ], "description": "Encode the bytes-like object s using Base32 and return a bytes object.\n " }, { "name": "base64.b64decode", "args": [ "s", "altchars=None", "validate=False" ], "description": "Decode the Base64 encoded bytes-like object or ASCII string s.\n\nOptional altchars must be a bytes-like object or ASCII string of length 2\nwhich specifies the alternative alphabet used instead of the '+' and '/'\ncharacters.\n\nThe result is returned as a bytes object. A binascii.Error is raised if\ns is incorrectly padded.\n\nIf validate is False (the default), characters that are neither in the\nnormal base-64 alphabet nor the alternative alphabet are discarded prior\nto the padding check. If validate is True, these non-alphabet characters\nin the input result in a binascii.Error." }, { "name": "base64.b64encode", "args": [ "s", "altchars=None" ], "description": "Encode the bytes-like object s using Base64 and return a bytes object.\n\nOptional altchars should be a byte string of length 2 which specifies an\nalternative alphabet for the '+' and '/' characters. This allows an\napplication to e.g. generate url or filesystem safe Base64 strings." }, { "name": "base64.b85decode", "args": [ "b" ], "description": "Decode the base85-encoded bytes-like object or ASCII string b\n\nThe result is returned as a bytes object." }, { "name": "base64.b85encode", "args": [ "b", "pad=False" ], "description": "Encode bytes-like object b in base85 format and return a bytes object.\n\nIf pad is true, the input is padded with b'\\0' so its length is a multiple of\n4 bytes before encoding." }, { "name": "base64.binascii", "args": null, "description": "Conversion between binary data and ASCII" }, { "name": "base64.decode", "args": [ "input", "output" ], "description": "Decode a file; input and output are binary files." }, { "name": "base64.decodebytes", "args": [ "s" ], "description": "Decode a bytestring of base-64 data into a bytes object." }, { "name": "base64.decodestring", "args": [ "s" ], "description": "Legacy alias of decodebytes()." }, { "name": "base64.encode", "args": [ "input", "output" ], "description": "Encode a file; input and output are binary files." }, { "name": "base64.encodebytes", "args": [ "s" ], "description": "Encode a bytestring into a bytes object containing multiple lines\nof base-64 data." }, { "name": "base64.encodestring", "args": [ "s" ], "description": "Legacy alias of encodebytes()." }, { "name": "base64.main", "args": [ "" ], "description": "Small main program" }, { "name": "base64.re", "args": null, "description": "Support for regular expressions (RE).\n\nThis module provides regular expression matching operations similar to\nthose found in Perl. It supports both 8-bit and Unicode strings; both\nthe pattern and the strings being processed can contain null bytes and\ncharacters outside the US ASCII range.\n\nRegular expressions can contain both special and ordinary characters.\nMost ordinary characters, like \"A\", \"a\", or \"0\", are the simplest\nregular expressions; they simply match themselves. You can\nconcatenate ordinary characters, so last matches the string 'last'.\n\nThe special characters are:\n \".\" Matches any character except a newline.\n \"^\" Matches the start of the string.\n \"$\" Matches the end of the string or just before the newline at\n the end of the string.\n \"*\" Matches 0 or more (greedy) repetitions of the preceding RE.\n Greedy means that it will match as many repetitions as possible.\n \"+\" Matches 1 or more (greedy) repetitions of the preceding RE.\n \"?\" Matches 0 or 1 (greedy) of the preceding RE.\n *?,+?,?? Non-greedy versions of the previous three special characters.\n {m,n} Matches from m to n repetitions of the preceding RE.\n {m,n}? Non-greedy version of the above.\n \"\\\\\" Either escapes special characters or signals a special sequence.\n [] Indicates a set of characters.\n A \"^\" as the first character indicates a complementing set.\n \"|\" A|B, creates an RE that will match either A or B.\n (...) Matches the RE inside the parentheses.\n The contents can be retrieved or matched later in the string.\n (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below).\n (?:...) Non-grouping version of regular parentheses.\n (?P...) The substring matched by the group is accessible by name.\n (?P=name) Matches the text matched earlier by the group named name.\n (?#...) A comment; ignored.\n (?=...) Matches if ... matches next, but doesn't consume the string.\n (?!...) Matches if ... doesn't match next.\n (?<=...) Matches if preceded by ... (must be fixed length).\n (?: big-endian, std. size & alignment\n !: same as >\n\nThe remaining chars indicate types of args and must match exactly;\nthese can be preceded by a decimal repeat count:\n x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n ?: _Bool (requires C99; if not available, char is used instead)\n h:short; H:unsigned short; i:int; I:unsigned int;\n l:long; L:unsigned long; f:float; d:double; e:half-float.\nSpecial cases (preceding decimal count indicates length):\n s:string (array of char); p: pascal string (with count byte).\nSpecial cases (only available in native format):\n n:ssize_t; N:size_t;\n P:an integer type that is wide enough to hold a pointer.\nSpecial case (not in native mode unless 'long long' in platform C):\n q:long long; Q:unsigned long long\nWhitespace between formats is ignored.\n\nThe variable struct.error is an exception raised on errors." }, { "name": "base64.urlsafe_b64decode", "args": [ "s" ], "description": "Decode bytes using the URL- and filesystem-safe Base64 alphabet.\n\nArgument s is a bytes-like object or ASCII string to decode. The result\nis returned as a bytes object. A binascii.Error is raised if the input\nis incorrectly padded. Characters that are not in the URL-safe base-64\nalphabet, and are not a plus '+' or slash '/', are discarded prior to the\npadding check.\n\nThe alphabet uses '-' instead of '+' and '_' instead of '/'." }, { "name": "base64.urlsafe_b64encode", "args": [ "s" ], "description": "Encode bytes using the URL- and filesystem-safe Base64 alphabet.\n\nArgument s is a bytes-like object to encode. The result is returned as a\nbytes object. The alphabet uses '-' instead of '+' and '_' instead of\n'/'." }, { "name": "hashlib.blake2b", "args": null, "description": "Return a new BLAKE2b hash object." }, { "name": "hashlib.blake2s", "args": null, "description": "Return a new BLAKE2s hash object." }, { "name": "hashlib.openssl_md5", "args": null, "description": "Returns a md5 hash object; optionally initialized with a string" }, { "name": "hashlib.__hash_new", "args": [ "name", "data=b''", "**kwargs" ], "description": "new(name, data=b'') - Return a new hashing object using the named algorithm;\noptionally initialized with data (which must be bytes)." }, { "name": "hashlib.pbkdf2_hmac", "args": null, "description": "pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n\nPassword based key derivation function 2 (PKCS #5 v2.0) with HMAC as\npseudorandom function." }, { "name": "hashlib.openssl_sha1", "args": null, "description": "Returns a sha1 hash object; optionally initialized with a string" }, { "name": "hashlib.openssl_sha224", "args": null, "description": "Returns a sha224 hash object; optionally initialized with a string" }, { "name": "hashlib.openssl_sha256", "args": null, "description": "Returns a sha256 hash object; optionally initialized with a string" }, { "name": "hashlib.openssl_sha384", "args": null, "description": "Returns a sha384 hash object; optionally initialized with a string" }, { "name": "hashlib.sha3_224", "args": [ "string=None" ], "description": "Return a new SHA3 hash object with a hashbit length of 28 bytes." }, { "name": "hashlib.sha3_256", "args": null, "description": "sha3_256([string]) -> SHA3 object\n\nReturn a new SHA3 hash object with a hashbit length of 32 bytes." }, { "name": "hashlib.sha3_384", "args": null, "description": "sha3_384([string]) -> SHA3 object\n\nReturn a new SHA3 hash object with a hashbit length of 48 bytes." }, { "name": "hashlib.sha3_512", "args": null, "description": "sha3_512([string]) -> SHA3 object\n\nReturn a new SHA3 hash object with a hashbit length of 64 bytes." }, { "name": "hashlib.openssl_sha512", "args": null, "description": "Returns a sha512 hash object; optionally initialized with a string" }, { "name": "hashlib.shake_128", "args": null, "description": "shake_128([string]) -> SHAKE object\n\nReturn a new SHAKE hash object." }, { "name": "hashlib.shake_256", "args": null, "description": "shake_256([string]) -> SHAKE object\n\nReturn a new SHAKE hash object." }, { "name": "uuid.UUID", "args": [ "hex=None", "bytes=None", "bytes_le=None", "fields=None", "int=None", "version=None" ], "description": "Instances of the UUID class represent UUIDs as specified in RFC 4122.\nUUID objects are immutable, hashable, and usable as dictionary keys.\nConverting a UUID to a string with str() yields something in the form\n'12345678-1234-1234-1234-123456789abc'. The UUID constructor accepts\nfive possible forms: a similar string of hexadecimal digits, or a tuple\nof six integer fields (with 32-bit, 16-bit, 16-bit, 8-bit, 8-bit, and\n48-bit values respectively) as an argument named 'fields', or a string\nof 16 bytes (with all the integer fields in big-endian order) as an\nargument named 'bytes', or a string of 16 bytes (with the first three\nfields in little-endian order) as an argument named 'bytes_le', or a\nsingle 128-bit integer as an argument named 'int'.\n\nUUIDs have these read-only attributes:\n\n bytes the UUID as a 16-byte string (containing the six\n integer fields in big-endian byte order)\n\n bytes_le the UUID as a 16-byte string (with time_low, time_mid,\n and time_hi_version in little-endian byte order)\n\n fields a tuple of the six integer fields of the UUID,\n which are also available as six individual attributes\n and two derived attributes:\n\n time_low the first 32 bits of the UUID\n time_mid the next 16 bits of the UUID\n time_hi_version the next 16 bits of the UUID\n clock_seq_hi_variant the next 8 bits of the UUID\n clock_seq_low the next 8 bits of the UUID\n node the last 48 bits of the UUID\n\n time the 60-bit timestamp\n clock_seq the 14-bit sequence number\n\n hex the UUID as a 32-character hexadecimal string\n\n int the UUID as a 128-bit integer\n\n urn the UUID as a URN as specified in RFC 4122\n\n variant the UUID variant (one of the constants RESERVED_NCS,\n RFC_4122, RESERVED_MICROSOFT, or RESERVED_FUTURE)\n\n version the UUID version number (1 through 5, meaningful only\n when the variant is RFC_4122)" }, { "name": "uuid.bytes", "args": null, "description": "bytes(iterable_of_ints) -> bytes\nbytes(string, encoding[, errors]) -> bytes\nbytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\nbytes(int) -> bytes object of size given by the parameter initialized with null bytes\nbytes() -> empty bytes object\n\nConstruct an immutable array of bytes from:\n - an iterable yielding integers in range(256)\n - a text string encoded using the specified encoding\n - any object implementing the buffer API.\n - an integer" }, { "name": "uuid.ctypes", "args": null, "description": "create and manipulate C data types in Python" }, { "name": "uuid.getnode", "args": [ "" ], "description": "Get the hardware address as a 48-bit positive integer.\n\nThe first time this runs, it may launch a separate program, which could\nbe quite slow. If all attempts to obtain the hardware address fail, we\nchoose a random 48-bit number with its eighth bit set to 1 as recommended\nin RFC 4122." }, { "name": "uuid.int", "args": null, "description": "int(x=0) -> integer\nint(x, base=10) -> integer\n\nConvert a number or string to an integer, or return 0 if no arguments\nare given. If x is a number, return x.__int__(). For floating point\nnumbers, this truncates towards zero.\n\nIf x is not a number or if base is given, then x must be a string,\nbytes, or bytearray instance representing an integer literal in the\ngiven base. The literal can be preceded by '+' or '-' and be surrounded\nby whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\nBase 0 means to interpret the base from the string as an integer literal.\n>>> int('0b100', base=0)\n4" }, { "name": "uuid.os", "args": null, "description": "OS routines for NT or Posix depending on what system we're on.\n\nThis exports:\n - all functions from posix or nt, e.g. unlink, stat, etc.\n - os.path is either posixpath or ntpath\n - os.name is either 'posix' or 'nt'\n - os.curdir is a string representing the current directory (always '.')\n - os.pardir is a string representing the parent directory (always '..')\n - os.sep is the (or a most common) pathname separator ('/' or '\\\\')\n - os.extsep is the extension separator (always '.')\n - os.altsep is the alternate pathname separator (None or '/')\n - os.pathsep is the component separator used in $PATH etc\n - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r\\n')\n - os.defpath is the default search path for executables\n - os.devnull is the file path of the null device ('/dev/null', etc.)\n\nPrograms that import and use 'os' stand a better chance of being\nportable between different platforms. Of course, they must then\nonly use functions that are defined by all platforms (e.g., unlink\nand opendir), and leave all pathname manipulation to os.path\n(e.g., split and join)." }, { "name": "uuid.sys", "args": null, "description": "This module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function" }, { "name": "uuid.uuid1", "args": [ "node=None", "clock_seq=None" ], "description": "Generate a UUID from a host ID, sequence number, and the current time.\nIf 'node' is not given, getnode() is used to obtain the hardware\naddress. If 'clock_seq' is given, it is used as the sequence number;\notherwise a random 14-bit sequence number is chosen." }, { "name": "uuid.uuid3", "args": [ "namespace", "name" ], "description": "Generate a UUID from the MD5 hash of a namespace UUID and a name." }, { "name": "uuid.uuid4", "args": [ "" ], "description": "Generate a random UUID." }, { "name": "uuid.uuid5", "args": [ "namespace", "name" ], "description": "Generate a UUID from the SHA-1 hash of a namespace UUID and a name." }, { "name": "turtle.Canvas", "args": [ "master=None", "cnf={}", "**kw" ], "description": "Canvas widget to display graphical elements like lines or text." }, { "name": "turtle.Turtle", "args": [ "shape='classic'", "undobuffersize=1000", "visible=True" ], "description": "RawTurtle auto-creating (scrolled) canvas.\n\nWhen a Turtle object is created or a function derived from some\nTurtle method is called a TurtleScreen object is automatically created." }, { "name": "turtle.RawTurtle", "args": [ "canvas=None", "shape='classic'", "undobuffersize=1000", "visible=True" ], "description": "Animation part of the RawTurtle.\nPuts RawTurtle upon a TurtleScreen and provides tools for\nits animation." }, { "name": "turtle.RawTurtle", "args": [ "canvas=None", "shape='classic'", "undobuffersize=1000", "visible=True" ], "description": "Animation part of the RawTurtle.\nPuts RawTurtle upon a TurtleScreen and provides tools for\nits animation." }, { "name": "turtle.Screen", "args": [ "" ], "description": "Return the singleton screen object.\nIf none exists at the moment, create a new one and return it,\nelse return the existing one." }, { "name": "turtle.ScrolledCanvas", "args": [ "master", "width=500", "height=350", "canvwidth=600", "canvheight=500" ], "description": "Modeled after the scrolled canvas class from Grayons's Tkinter book.\n\nUsed as the default canvas, which pops up automatically when\nusing turtle graphics functions or the Turtle class." }, { "name": "turtle.Shape", "args": [ "type_", "data=None" ], "description": "Data structure modeling shapes.\n\nattribute _type is one of \"polygon\", \"image\", \"compound\"\nattribute _data is - depending on _type a poygon-tuple,\nan image or a list constructed using the addcomponent method." }, { "name": "turtle.tkinter", "args": null, "description": "Wrapper functions for Tcl/Tk.\n\nTkinter provides classes which allow the display, positioning and\ncontrol of widgets. Toplevel widgets are Tk and Toplevel. Other\nwidgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,\nCheckbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox\nLabelFrame and PanedWindow.\n\nProperties of the widgets are specified with keyword arguments.\nKeyword arguments have the same name as the corresponding resource\nunder Tk.\n\nWidgets are positioned with one of the geometry managers Place, Pack\nor Grid. These managers can be called with methods place, pack, grid\navailable in every Widget.\n\nActions are bound to events by resources (e.g. keyword argument\ncommand) or with the method bind.\n\nExample (Hello, World):\nimport tkinter\nfrom tkinter.constants import *\ntk = tkinter.Tk()\nframe = tkinter.Frame(tk, relief=RIDGE, borderwidth=2)\nframe.pack(fill=BOTH,expand=1)\nlabel = tkinter.Label(frame, text=\"Hello, World\")\nlabel.pack(fill=X, expand=1)\nbutton = tkinter.Button(frame,text=\"Exit\",command=tk.destroy)\nbutton.pack(side=BOTTOM)\ntk.mainloop()" }, { "name": "turtle.TNavigator", "args": [ "mode='standard'" ], "description": "Navigation part of the RawTurtle.\nImplements methods for turtle movement." }, { "name": "turtle.TPen", "args": [ "resizemode='noresize'" ], "description": "Drawing part of the RawTurtle.\nImplements drawing properties." }, { "name": "turtle.Tbuffer", "args": [ "bufsize=10" ], "description": "Ring buffer used as undobuffer for RawTurtle objects." }, { "name": "turtle.Terminator", "args": null, "description": "Will be raised in TurtleScreen.update, if _RUNNING becomes False.\n\nThis stops execution of a turtle graphics script.\nMain purpose: use in the Demo-Viewer turtle.Demo.py." }, { "name": "turtle.Turtle", "args": [ "shape='classic'", "undobuffersize=1000", "visible=True" ], "description": "RawTurtle auto-creating (scrolled) canvas.\n\nWhen a Turtle object is created or a function derived from some\nTurtle method is called a TurtleScreen object is automatically created." }, { "name": "turtle.TurtleGraphicsError", "args": null, "description": "Some TurtleGraphics Error\n " }, { "name": "turtle.TurtleScreen", "args": [ "cv", "mode='standard'", "colormode=1.0", "delay=10" ], "description": "Provides screen oriented methods like setbg etc.\n\nOnly relies upon the methods of TurtleScreenBase and NOT\nupon components of the underlying graphics toolkit -\nwhich is Tkinter in this case." }, { "name": "turtle.TurtleScreenBase", "args": [ "cv" ], "description": "Provide the basic graphics functionality.\nInterface between Tkinter and turtle.py.\n\nTo port turtle.py to some different graphics toolkit\na corresponding TurtleScreenBase class has to be implemented." }, { "name": "turtle.Vec2D", "args": [ "x", "y" ], "description": "A 2 dimensional vector class, used as a helper class\nfor implementing turtle graphics.\nMay be useful for turtle graphics programs also.\nDerived from tuple, so a vector is a tuple!\n\nProvides (for a, b vectors, k number):\n a+b vector addition\n a-b vector subtraction\n a*b inner product\n k*a and a*k multiplication with scalar\n |a| absolute value of a\n a.rotate(angle) rotation" }, { "name": "turtle.addshape", "args": [ "name", "shape=None" ], "description": "Adds a turtle shape to TurtleScreen's shapelist.\n\nArguments:\n(1) name is the name of a gif-file and shape is None.\n Installs the corresponding image shape.\n !! Image-shapes DO NOT rotate when turning the turtle,\n !! so they do not display the heading of the turtle!\n(2) name is an arbitrary string and shape is a tuple\n of pairs of coordinates. Installs the corresponding\n polygon shape\n(3) name is an arbitrary string and shape is a\n (compound) Shape object. Installs the corresponding\n compound shape.\nTo use a shape, you have to issue the command shape(shapename).\n\ncall: register_shape(\"turtle.gif\")\n--or: register_shape(\"tri\", ((0,0), (10,10), (-10,10)))\n\nExample:\n>>> register_shape(\"triangle\", ((5,-3),(0,5),(-5,-3)))" }, { "name": "turtle.back", "args": [ "distance" ], "description": "Move the turtle backward by distance.\n\nAliases: back | backward | bk\n\nArgument:\ndistance -- a number\n\nMove the turtle backward by distance ,opposite to the direction the\nturtle is headed. Do not change the turtle's heading.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> backward(30)\n>>> position()\n(-30.00, 0.00)" }, { "name": "turtle.backward", "args": [ "distance" ], "description": "Move the turtle backward by distance.\n\nAliases: back | backward | bk\n\nArgument:\ndistance -- a number\n\nMove the turtle backward by distance ,opposite to the direction the\nturtle is headed. Do not change the turtle's heading.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> backward(30)\n>>> position()\n(-30.00, 0.00)" }, { "name": "turtle.begin_fill", "args": [ "" ], "description": "Called just before drawing a shape to be filled.\n\nNo argument.\n\nExample:\n>>> color(\"black\", \"red\")\n>>> begin_fill()\n>>> circle(60)\n>>> end_fill()" }, { "name": "turtle.begin_poly", "args": [ "" ], "description": "Start recording the vertices of a polygon.\n\nNo argument.\n\nStart recording the vertices of a polygon. Current turtle position\nis first point of polygon.\n\nExample:\n>>> begin_poly()" }, { "name": "turtle.bgcolor", "args": [ "*args" ], "description": "Set or return backgroundcolor of the TurtleScreen.\n\nArguments (if given): a color string or three numbers\nin the range 0..colormode or a 3-tuple of such numbers.\n\nExample:\n>>> bgcolor(\"orange\")\n>>> bgcolor()\n'orange'\n>>> bgcolor(0.5,0,0.5)\n>>> bgcolor()\n'#800080'" }, { "name": "turtle.bgpic", "args": [ "picname=None" ], "description": "Set background image or return name of current backgroundimage.\n\nOptional argument:\npicname -- a string, name of a gif-file or \"nopic\".\n\nIf picname is a filename, set the corresponding image as background.\nIf picname is \"nopic\", delete backgroundimage, if present.\nIf picname is None, return the filename of the current backgroundimage.\n\nExample:\n>>> bgpic()\n'nopic'\n>>> bgpic(\"landscape.gif\")\n>>> bgpic()\n'landscape.gif'" }, { "name": "turtle.bk", "args": [ "distance" ], "description": "Move the turtle backward by distance.\n\nAliases: back | backward | bk\n\nArgument:\ndistance -- a number\n\nMove the turtle backward by distance ,opposite to the direction the\nturtle is headed. Do not change the turtle's heading.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> backward(30)\n>>> position()\n(-30.00, 0.00)" }, { "name": "turtle.bye", "args": [ "" ], "description": "Shut the turtlegraphics window.\n\nExample:\n>>> bye()" }, { "name": "turtle.circle", "args": [ "radius", "extent=None", "steps=None" ], "description": "Draw a circle with given radius.\n\nArguments:\nradius -- a number\nextent (optional) -- a number\nsteps (optional) -- an integer\n\nDraw a circle with given radius. The center is radius units left\nof the turtle; extent - an angle - determines which part of the\ncircle is drawn. If extent is not given, draw the entire circle.\nIf extent is not a full circle, one endpoint of the arc is the\ncurrent pen position. Draw the arc in counterclockwise direction\nif radius is positive, otherwise in clockwise direction. Finally\nthe direction of the turtle is changed by the amount of extent.\n\nAs the circle is approximated by an inscribed regular polygon,\nsteps determines the number of steps to use. If not given,\nit will be calculated automatically. Maybe used to draw regular\npolygons.\n\ncall: circle(radius) # full circle\n--or: circle(radius, extent) # arc\n--or: circle(radius, extent, steps)\n--or: circle(radius, steps=6) # 6-sided polygon\n\nExample:\n>>> circle(50)\n>>> circle(120, 180) # semicircle" }, { "name": "turtle.clear", "args": [ "" ], "description": "Delete the turtle's drawings from the screen. Do not move \n\nNo arguments.\n\nDelete the turtle's drawings from the screen. Do not move \nState and position of the turtle as well as drawings of other\nturtles are not affected.\n\nExamples:\n>>> clear()" }, { "name": "turtle.clearscreen", "args": [ "" ], "description": "Delete all drawings and all turtles from the TurtleScreen.\n\nNo argument.\n\nReset empty TurtleScreen to its initial state: white background,\nno backgroundimage, no eventbindings and tracing on.\n\nExample:\n>>> clear()\n\nNote: this method is not available as function." }, { "name": "turtle.clearstamp", "args": [ "stampid" ], "description": "Delete stamp with given stampid\n\nArgument:\nstampid - an integer, must be return value of previous stamp() call.\n\nExample:\n>>> color(\"blue\")\n>>> astamp = stamp()\n>>> fd(50)\n>>> clearstamp(astamp)" }, { "name": "turtle.clearstamps", "args": [ "n=None" ], "description": "Delete all or first/last n of turtle's stamps.\n\nOptional argument:\nn -- an integer\n\nIf n is None, delete all of pen's stamps,\nelse if n > 0 delete first n stamps\nelse if n < 0 delete last n stamps.\n\nExample:\n>>> for i in range(8):\n... stamp(); fd(30)\n...\n>>> clearstamps(2)\n>>> clearstamps(-2)\n>>> clearstamps()" }, { "name": "turtle.clone", "args": [ "" ], "description": "Create and return a clone of the \n\nNo argument.\n\nCreate and return a clone of the turtle with same position, heading\nand turtle properties.\n\nExample (for a Turtle instance named mick):\nmick = Turtle()\njoe = mick.clone()" }, { "name": "turtle.color", "args": [ "*args" ], "description": "Return or set the pencolor and fillcolor.\n\nArguments:\nSeveral input formats are allowed.\nThey use 0, 1, 2, or 3 arguments as follows:\n\ncolor()\n Return the current pencolor and the current fillcolor\n as a pair of color specification strings as are returned\n by pencolor and fillcolor.\ncolor(colorstring), color((r,g,b)), color(r,g,b)\n inputs as in pencolor, set both, fillcolor and pencolor,\n to the given value.\ncolor(colorstring1, colorstring2),\ncolor((r1,g1,b1), (r2,g2,b2))\n equivalent to pencolor(colorstring1) and fillcolor(colorstring2)\n and analogously, if the other input format is used.\n\nIf turtleshape is a polygon, outline and interior of that polygon\nis drawn with the newly set colors.\nFor mor info see: pencolor, fillcolor\n\nExample:\n>>> color('red', 'green')\n>>> color()\n('red', 'green')\n>>> colormode(255)\n>>> color((40, 80, 120), (160, 200, 240))\n>>> color()\n('#285078', '#a0c8f0')" }, { "name": "turtle.colormode", "args": [ "cmode=None" ], "description": "Return the colormode or set it to 1.0 or 255.\n\nOptional argument:\ncmode -- one of the values 1.0 or 255\n\nr, g, b values of colortriples have to be in range 0..cmode.\n\nExample:\n>>> colormode()\n1.0\n>>> colormode(255)\n>>> pencolor(240,160,80)" }, { "name": "turtle.config_dict", "args": [ "filename" ], "description": "Convert content of config-file into dictionary." }, { "name": "turtle.deepcopy", "args": [ "x", "memo=None", "_nil=[]" ], "description": "Deep copy operation on arbitrary Python objects.\n\nSee the module's __doc__ string for more info." }, { "name": "turtle.degrees", "args": [ "fullcircle=360.0" ], "description": "Set angle measurement units to degrees.\n\nOptional argument:\nfullcircle - a number\n\nSet angle measurement units, i. e. set number\nof 'degrees' for a full circle. Dafault value is\n360 degrees.\n\nExample:\n>>> left(90)\n>>> heading()\n90\n\nChange angle measurement unit to grad (also known as gon,\ngrade, or gradian and equals 1/100-th of the right angle.)\n>>> degrees(400.0)\n>>> heading()\n100" }, { "name": "turtle.delay", "args": [ "delay=None" ], "description": "Return or set the drawing delay in milliseconds.\n\nOptional argument:\ndelay -- positive integer\n\nExample:\n>>> delay(15)\n>>> delay()\n15" }, { "name": "turtle.distance", "args": [ "x", "y=None" ], "description": "Return the distance from the turtle to (x,y) in turtle step units.\n\nArguments:\nx -- a number or a pair/vector of numbers or a turtle instance\ny -- a number None None\n\ncall: distance(x, y) # two coordinates\n--or: distance((x, y)) # a pair (tuple) of coordinates\n--or: distance(vec) # e.g. as returned by pos()\n--or: distance(mypen) # where mypen is another turtle\n\nExample:\n>>> pos()\n(0.00, 0.00)\n>>> distance(30,40)\n50.0\n>>> pen = Turtle()\n>>> pen.forward(77)\n>>> distance(pen)\n77.0" }, { "name": "turtle.mainloop", "args": [ "" ], "description": "Starts event loop - calling Tkinter's mainloop function.\n\nNo argument.\n\nMust be last statement in a turtle graphics program.\nMust NOT be used if a script is run from within IDLE in -n mode\n(No subprocess) - for interactive use of turtle graphics.\n\nExample:\n>>> mainloop()" }, { "name": "turtle.dot", "args": [ "size=None", "*color" ], "description": "Draw a dot with diameter size, using color.\n\nOptional arguments:\nsize -- an integer >= 1 (if given)\ncolor -- a colorstring or a numeric color tuple\n\nDraw a circular dot with diameter size, using color.\nIf size is not given, the maximum of pensize+4 and 2*pensize is used.\n\nExample:\n>>> dot()\n>>> fd(50); dot(20, \"blue\"); fd(50)" }, { "name": "turtle.down", "args": [ "" ], "description": "Pull the pen down -- drawing when moving.\n\nAliases: pendown | pd | down\n\nNo argument.\n\nExample:\n>>> pendown()" }, { "name": "turtle.end_fill", "args": [ "" ], "description": "Fill the shape drawn after the call begin_fill().\n\nNo argument.\n\nExample:\n>>> color(\"black\", \"red\")\n>>> begin_fill()\n>>> circle(60)\n>>> end_fill()" }, { "name": "turtle.end_poly", "args": [ "" ], "description": "Stop recording the vertices of a polygon.\n\nNo argument.\n\nStop recording the vertices of a polygon. Current turtle position is\nlast point of polygon. This will be connected with the first point.\n\nExample:\n>>> end_poly()" }, { "name": "turtle.exitonclick", "args": [ "" ], "description": "Go into mainloop until the mouse is clicked.\n\nNo arguments.\n\nBind bye() method to mouseclick on TurtleScreen.\nIf \"using_IDLE\" - value in configuration dictionary is False\n(default value), enter mainloop.\nIf IDLE with -n switch (no subprocess) is used, this value should be\nset to True in turtle.cfg. In this case IDLE's mainloop\nis active also for the client script.\n\nThis is a method of the Screen-class and not available for\nTurtleScreen instances.\n\nExample:\n>>> exitonclick()" }, { "name": "turtle.fd", "args": [ "distance" ], "description": "Move the turtle forward by the specified distance.\n\nAliases: forward | fd\n\nArgument:\ndistance -- a number (integer or float)\n\nMove the turtle forward by the specified distance, in the direction\nthe turtle is headed.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> forward(25)\n>>> position()\n(25.00,0.00)\n>>> forward(-75)\n>>> position()\n(-50.00,0.00)" }, { "name": "turtle.fillcolor", "args": [ "*args" ], "description": "Return or set the fillcolor.\n\nArguments:\nFour input formats are allowed:\n - fillcolor()\n Return the current fillcolor as color specification string,\n possibly in hex-number format (see example).\n May be used as input to another color/pencolor/fillcolor call.\n - fillcolor(colorstring)\n s is a Tk color specification string, such as \"red\" or \"yellow\"\n - fillcolor((r, g, b))\n *a tuple* of r, g, and b, which represent, an RGB color,\n and each of r, g, and b are in the range 0..colormode,\n where colormode is either 1.0 or 255\n - fillcolor(r, g, b)\n r, g, and b represent an RGB color, and each of r, g, and b\n are in the range 0..colormode\n\nIf turtleshape is a polygon, the interior of that polygon is drawn\nwith the newly set fillcolor.\n\nExample:\n>>> fillcolor('violet')\n>>> col = pencolor()\n>>> fillcolor(col)\n>>> fillcolor(0, .5, 0)" }, { "name": "turtle.filling", "args": [ "" ], "description": "Return fillstate (True if filling, False else).\n\nNo argument.\n\nExample:\n>>> begin_fill()\n>>> if filling():\n... pensize(5)\n... else:\n... pensize(3)" }, { "name": "turtle.forward", "args": [ "distance" ], "description": "Move the turtle forward by the specified distance.\n\nAliases: forward | fd\n\nArgument:\ndistance -- a number (integer or float)\n\nMove the turtle forward by the specified distance, in the direction\nthe turtle is headed.\n\nExample:\n>>> position()\n(0.00, 0.00)\n>>> forward(25)\n>>> position()\n(25.00,0.00)\n>>> forward(-75)\n>>> position()\n(-50.00,0.00)" }, { "name": "turtle.get_poly", "args": [ "" ], "description": "Return the lastly recorded polygon.\n\nNo argument.\n\nExample:\n>>> p = get_poly()\n>>> register_shape(\"myFavouriteShape\", p)" }, { "name": "turtle.get_shapepoly", "args": [ "" ], "description": "Return the current shape polygon as tuple of coordinate pairs.\n\nNo argument.\n\nExamples:\n>>> shape(\"square\")\n>>> shapetransform(4, -1, 0, 2)\n>>> get_shapepoly()\n((50, -20), (30, 20), (-50, 20), (-30, -20))" }, { "name": "turtle.getcanvas", "args": [ "" ], "description": "Return the Canvas of this TurtleScreen.\n\nNo argument.\n\nExample:\n>>> cv = getcanvas()\n>>> cv\n" }, { "name": "turtle.getmethparlist", "args": [ "ob" ], "description": "Get strings describing the arguments for the given object\n\nReturns a pair of strings representing function parameter lists\nincluding parenthesis. The first string is suitable for use in\nfunction definition and the second is suitable for use in function\ncall. The \"self\" parameter is not included." }, { "name": "turtle.getpen", "args": [ "" ], "description": "Return the Turtleobject itself.\n\nNo argument.\n\nOnly reasonable use: as a function to return the 'anonymous turtle':\n\nExample:\n>>> pet = getturtle()\n>>> pet.fd(50)\n>>> pet\n\n>>> turtles()\n[]" }, { "name": "turtle.getscreen", "args": [ "" ], "description": "Return the TurtleScreen object, the turtle is drawing on.\n\nNo argument.\n\nReturn the TurtleScreen object, the turtle is drawing on.\nSo TurtleScreen-methods can be called for that object.\n\nExample:\n>>> ts = getscreen()\n>>> ts\n\n>>> ts.bgcolor(\"pink\")" }, { "name": "turtle.getshapes", "args": [ "" ], "description": "Return a list of names of all currently available turtle shapes.\n\nNo argument.\n\nExample:\n>>> getshapes()\n['arrow', 'blank', 'circle', ... , 'turtle']" }, { "name": "turtle.getturtle", "args": [ "" ], "description": "Return the Turtleobject itself.\n\nNo argument.\n\nOnly reasonable use: as a function to return the 'anonymous turtle':\n\nExample:\n>>> pet = getturtle()\n>>> pet.fd(50)\n>>> pet\n\n>>> turtles()\n[]" }, { "name": "turtle.goto", "args": [ "x", "y=None" ], "description": "Move turtle to an absolute position.\n\nAliases: setpos | setposition | goto:\n\nArguments:\nx -- a number or a pair/vector of numbers\ny -- a number None\n\ncall: goto(x, y) # two coordinates\n--or: goto((x, y)) # a pair (tuple) of coordinates\n--or: goto(vec) # e.g. as returned by pos()\n\nMove turtle to an absolute position. If the pen is down,\na line will be drawn. The turtle's orientation does not change.\n\nExample:\n>>> tp = pos()\n>>> tp\n(0.00, 0.00)\n>>> setpos(60,30)\n>>> pos()\n(60.00,30.00)\n>>> setpos((20,80))\n>>> pos()\n(20.00,80.00)\n>>> setpos(tp)\n>>> pos()\n(0.00,0.00)" }, { "name": "turtle.heading", "args": [ "" ], "description": "Return the turtle's current heading.\n\nNo arguments.\n\nExample:\n>>> left(67)\n>>> heading()\n67.0" }, { "name": "turtle.hideturtle", "args": [ "" ], "description": "Makes the turtle invisible.\n\nAliases: hideturtle | ht\n\nNo argument.\n\nIt's a good idea to do this while you're in the\nmiddle of a complicated drawing, because hiding\nthe turtle speeds up the drawing observably.\n\nExample:\n>>> hideturtle()" }, { "name": "turtle.home", "args": [ "" ], "description": "Move turtle to the origin - coordinates (0,0).\n\nNo arguments.\n\nMove turtle to the origin - coordinates (0,0) and set its\nheading to its start-orientation (which depends on mode).\n\nExample:\n>>> home()" }, { "name": "turtle.ht", "args": [ "" ], "description": "Makes the turtle invisible.\n\nAliases: hideturtle | ht\n\nNo argument.\n\nIt's a good idea to do this while you're in the\nmiddle of a complicated drawing, because hiding\nthe turtle speeds up the drawing observably.\n\nExample:\n>>> hideturtle()" }, { "name": "turtle.inspect", "args": null, "description": "Get useful information from live Python objects.\n\nThis module encapsulates the interface provided by the internal special\nattributes (co_*, im_*, tb_*, etc.) in a friendlier fashion.\nIt also provides some help for examining source code and class layout.\n\nHere are some of the useful functions provided by this module:\n\n ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),\n isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),\n isroutine() - check object types\n getmembers() - get members of an object that satisfy a given condition\n\n getfile(), getsourcefile(), getsource() - find an object's source code\n getdoc(), getcomments() - get documentation on an object\n getmodule() - determine the module that an object came from\n getclasstree() - arrange classes so as to represent their hierarchy\n\n getargvalues(), getcallargs() - get info about function arguments\n getfullargspec() - same, with support for Python 3 features\n formatargspec(), formatargvalues() - format an argument spec\n getouterframes(), getinnerframes() - get info about frames\n currentframe() - get the current stack frame\n stack(), trace() - get info about frames on the stack or in a traceback\n\n signature() - get a Signature object for the callable" }, { "name": "turtle.isdown", "args": [ "" ], "description": "Return True if pen is down, False if it's up.\n\nNo argument.\n\nExample:\n>>> penup()\n>>> isdown()\nFalse\n>>> pendown()\n>>> isdown()\nTrue" }, { "name": "turtle.isfile", "args": [ "path" ], "description": "Test whether a path is a regular file" }, { "name": "turtle.isvisible", "args": [ "" ], "description": "Return True if the Turtle is shown, False if it's hidden.\n\nNo argument.\n\nExample:\n>>> hideturtle()\n>>> print isvisible():\nFalse" }, { "name": "turtle.join", "args": [ "a", "*p" ], "description": "Join two or more pathname components, inserting '/' as needed.\nIf any component is an absolute path, all previous path components\nwill be discarded. An empty last part will result in a path that\nends with a separator." }, { "name": "turtle.left", "args": [ "angle" ], "description": "Turn turtle left by angle units.\n\nAliases: left | lt\n\nArgument:\nangle -- a number (integer or float)\n\nTurn turtle left by angle units. (Units are by default degrees,\nbut can be set via the degrees() and radians() functions.)\nAngle orientation depends on mode. (See this.)\n\nExample:\n>>> heading()\n22.0\n>>> left(45)\n>>> heading()\n67.0" }, { "name": "turtle.listen", "args": [ "xdummy=None", "ydummy=None" ], "description": "Set focus on TurtleScreen (in order to collect key-events)\n\nNo arguments.\nDummy arguments are provided in order\nto be able to pass listen to the onclick method.\n\nExample:\n>>> listen()" }, { "name": "turtle.lt", "args": [ "angle" ], "description": "Turn turtle left by angle units.\n\nAliases: left | lt\n\nArgument:\nangle -- a number (integer or float)\n\nTurn turtle left by angle units. (Units are by default degrees,\nbut can be set via the degrees() and radians() functions.)\nAngle orientation depends on mode. (See this.)\n\nExample:\n>>> heading()\n22.0\n>>> left(45)\n>>> heading()\n67.0" }, { "name": "turtle.mainloop", "args": [ "" ], "description": "Starts event loop - calling Tkinter's mainloop function.\n\nNo argument.\n\nMust be last statement in a turtle graphics program.\nMust NOT be used if a script is run from within IDLE in -n mode\n(No subprocess) - for interactive use of turtle graphics.\n\nExample:\n>>> mainloop()" }, { "name": "turtle.math", "args": null, "description": "This module is always available. It provides access to the\nmathematical functions defined by the C standard." }, { "name": "turtle.mode", "args": [ "mode=None" ], "description": "Set turtle-mode ('standard', 'logo' or 'world') and perform reset.\n\nOptional argument:\nmode -- one of the strings 'standard', 'logo' or 'world'\n\nMode 'standard' is compatible with turtle.py.\nMode 'logo' is compatible with most Logo-Turtle-Graphics.\nMode 'world' uses userdefined 'worldcoordinates'. *Attention*: in\nthis mode angles appear distorted if x/y unit-ratio doesn't equal 1.\nIf mode is not given, return the current mode.\n\n Mode Initial turtle heading positive angles\n ------------|-------------------------|-------------------\n 'standard' to the right (east) counterclockwise\n 'logo' upward (north) clockwise\n\nExamples:\n>>> mode('logo') # resets turtle heading to north\n>>> mode()\n'logo'" }, { "name": "turtle.numinput", "args": [ "title", "prompt", "default=None", "minval=None", "maxval=None" ], "description": "Pop up a dialog window for input of a number.\n\nArguments: title is the title of the dialog window,\nprompt is a text mostly describing what numerical information to input.\ndefault: default value\nminval: minimum value for imput\nmaxval: maximum value for input\n\nThe number input must be in the range minval .. maxval if these are\ngiven. If not, a hint is issued and the dialog remains open for\ncorrection. Return the number input.\nIf the dialog is canceled, return None.\n\nExample:\n>>> numinput(\"Poker\", \"Your stakes:\", 1000, minval=10, maxval=10000)" }, { "name": "turtle.onclick", "args": [ "fun", "btn=1", "add=None" ], "description": "Bind fun to mouse-click event on this turtle on canvas.\n\nArguments:\nfun -- a function with two arguments, to which will be assigned\n the coordinates of the clicked point on the canvas.\nnum -- number of the mouse-button defaults to 1 (left mouse button).\nadd -- True or False. If True, new binding will be added, otherwise\n it will replace a former binding.\n\nExample for the anonymous turtle, i. e. the procedural way:\n\n>>> def turn(x, y):\n... left(360)\n...\n>>> onclick(turn) # Now clicking into the turtle will turn it.\n>>> onclick(None) # event-binding will be removed" }, { "name": "turtle.ondrag", "args": [ "fun", "btn=1", "add=None" ], "description": "Bind fun to mouse-move event on this turtle on canvas.\n\nArguments:\nfun -- a function with two arguments, to which will be assigned\n the coordinates of the clicked point on the canvas.\nnum -- number of the mouse-button defaults to 1 (left mouse button).\n\nEvery sequence of mouse-move-events on a turtle is preceded by a\nmouse-click event on that \n\nExample:\n>>> ondrag(goto)\n\nSubsequently clicking and dragging a Turtle will move it\nacross the screen thereby producing handdrawings (if pen is\ndown)." }, { "name": "turtle.onkey", "args": [ "fun", "key" ], "description": "Bind fun to key-release event of key.\n\nArguments:\nfun -- a function with no arguments\nkey -- a string: key (e.g. \"a\") or key-symbol (e.g. \"space\")\n\nIn order to be able to register key-events, TurtleScreen\nmust have focus. (See method listen.)\n\nExample:\n\n>>> def f():\n... fd(50)\n... lt(60)\n...\n>>> onkey(f, \"Up\")\n>>> listen()\n\nSubsequently the turtle can be moved by repeatedly pressing\nthe up-arrow key, consequently drawing a hexagon" }, { "name": "turtle.onkeypress", "args": [ "fun", "key=None" ], "description": "Bind fun to key-press event of key if key is given,\nor to any key-press-event if no key is given.\n\nArguments:\nfun -- a function with no arguments\nkey -- a string: key (e.g. \"a\") or key-symbol (e.g. \"space\")\n\nIn order to be able to register key-events, TurtleScreen\nmust have focus. (See method listen.)\n\nExample (for a TurtleScreen instance named screen\nand a Turtle instance named turtle):\n\n>>> def f():\n... fd(50)\n... lt(60)\n...\n>>> onkeypress(f, \"Up\")\n>>> listen()\n\nSubsequently the turtle can be moved by repeatedly pressing\nthe up-arrow key, or by keeping pressed the up-arrow key.\nconsequently drawing a hexagon." }, { "name": "turtle.onkeyrelease", "args": [ "fun", "key" ], "description": "Bind fun to key-release event of key.\n\nArguments:\nfun -- a function with no arguments\nkey -- a string: key (e.g. \"a\") or key-symbol (e.g. \"space\")\n\nIn order to be able to register key-events, TurtleScreen\nmust have focus. (See method listen.)\n\nExample:\n\n>>> def f():\n... fd(50)\n... lt(60)\n...\n>>> onkey(f, \"Up\")\n>>> listen()\n\nSubsequently the turtle can be moved by repeatedly pressing\nthe up-arrow key, consequently drawing a hexagon" }, { "name": "turtle.onrelease", "args": [ "fun", "btn=1", "add=None" ], "description": "Bind fun to mouse-button-release event on this turtle on canvas.\n\nArguments:\nfun -- a function with two arguments, to which will be assigned\n the coordinates of the clicked point on the canvas.\nnum -- number of the mouse-button defaults to 1 (left mouse button).\n\nExample (for a MyTurtle instance named joe):\n>>> class MyTurtle(Turtle):\n... def glow(self,x,y):\n... self.fillcolor(\"red\")\n... def unglow(self,x,y):\n... self.fillcolor(\"\")\n...\n>>> joe = MyTurtle()\n>>> joe.onclick(joe.glow)\n>>> joe.onrelease(joe.unglow)\n\nClicking on joe turns fillcolor red, unclicking turns it to\ntransparent." }, { "name": "turtle.onscreenclick", "args": [ "fun", "btn=1", "add=None" ], "description": "Bind fun to mouse-click event on canvas.\n\nArguments:\nfun -- a function with two arguments, the coordinates of the\n clicked point on the canvas.\nnum -- the number of the mouse-button, defaults to 1\n\nExample (for a TurtleScreen instance named screen)\n\n>>> onclick(goto)\n>>> # Subsequently clicking into the TurtleScreen will\n>>> # make the turtle move to the clicked point.\n>>> onclick(None)" }, { "name": "turtle.ontimer", "args": [ "fun", "t=0" ], "description": "Install a timer, which calls fun after t milliseconds.\n\nArguments:\nfun -- a function with no arguments.\nt -- a number >= 0\n\nExample:\n\n>>> running = True\n>>> def f():\n... if running:\n... fd(50)\n... lt(60)\n... ontimer(f, 250)\n...\n>>> f() # makes the turtle marching around\n>>> running = False" }, { "name": "turtle.pd", "args": [ "" ], "description": "Pull the pen down -- drawing when moving.\n\nAliases: pendown | pd | down\n\nNo argument.\n\nExample:\n>>> pendown()" }, { "name": "turtle.pen", "args": [ "pen=None", "**pendict" ], "description": "Return or set the pen's attributes.\n\nArguments:\n pen -- a dictionary with some or all of the below listed keys.\n **pendict -- one or more keyword-arguments with the below\n listed keys as keywords.\n\nReturn or set the pen's attributes in a 'pen-dictionary'\nwith the following key/value pairs:\n \"shown\" : True/False\n \"pendown\" : True/False\n \"pencolor\" : color-string or color-tuple\n \"fillcolor\" : color-string or color-tuple\n \"pensize\" : positive number\n \"speed\" : number in range 0..10\n \"resizemode\" : \"auto\" or \"user\" or \"noresize\"\n \"stretchfactor\": (positive number, positive number)\n \"shearfactor\": number\n \"outline\" : positive number\n \"tilt\" : number\n\nThis dictionary can be used as argument for a subsequent\npen()-call to restore the former pen-state. Moreover one\nor more of these attributes can be provided as keyword-arguments.\nThis can be used to set several pen attributes in one statement.\n\n\nExamples:\n>>> pen(fillcolor=\"black\", pencolor=\"red\", pensize=10)\n>>> pen()\n{'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,\n'pencolor': 'red', 'pendown': True, 'fillcolor': 'black',\n'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}\n>>> penstate=pen()\n>>> color(\"yellow\",\"\")\n>>> penup()\n>>> pen()\n{'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,\n'pencolor': 'yellow', 'pendown': False, 'fillcolor': '',\n'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}\n>>> p.pen(penstate, fillcolor=\"green\")\n>>> p.pen()\n{'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,\n'pencolor': 'red', 'pendown': True, 'fillcolor': 'green',\n'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}" }, { "name": "turtle.pencolor", "args": [ "*args" ], "description": "Return or set the pencolor.\n\nArguments:\nFour input formats are allowed:\n - pencolor()\n Return the current pencolor as color specification string,\n possibly in hex-number format (see example).\n May be used as input to another color/pencolor/fillcolor call.\n - pencolor(colorstring)\n s is a Tk color specification string, such as \"red\" or \"yellow\"\n - pencolor((r, g, b))\n *a tuple* of r, g, and b, which represent, an RGB color,\n and each of r, g, and b are in the range 0..colormode,\n where colormode is either 1.0 or 255\n - pencolor(r, g, b)\n r, g, and b represent an RGB color, and each of r, g, and b\n are in the range 0..colormode\n\nIf turtleshape is a polygon, the outline of that polygon is drawn\nwith the newly set pencolor.\n\nExample:\n>>> pencolor('brown')\n>>> tup = (0.2, 0.8, 0.55)\n>>> pencolor(tup)\n>>> pencolor()\n'#33cc8c'" }, { "name": "turtle.pendown", "args": [ "" ], "description": "Pull the pen down -- drawing when moving.\n\nAliases: pendown | pd | down\n\nNo argument.\n\nExample:\n>>> pendown()" }, { "name": "turtle.pensize", "args": [ "width=None" ], "description": "Set or return the line thickness.\n\nAliases: pensize | width\n\nArgument:\nwidth -- positive number\n\nSet the line thickness to width or return it. If resizemode is set\nto \"auto\" and turtleshape is a polygon, that polygon is drawn with\nthe same line thickness. If no argument is given, current pensize\nis returned.\n\nExample:\n>>> pensize()\n1\n>>> pensize(10) # from here on lines of width 10 are drawn" }, { "name": "turtle.penup", "args": [ "" ], "description": "Pull the pen up -- no drawing when moving.\n\nAliases: penup | pu | up\n\nNo argument\n\nExample:\n>>> penup()" }, { "name": "turtle.pos", "args": [ "" ], "description": "Return the turtle's current location (x,y), as a Vec2D-vector.\n\nAliases: pos | position\n\nNo arguments.\n\nExample:\n>>> pos()\n(0.00, 240.00)" }, { "name": "turtle.position", "args": [ "" ], "description": "Return the turtle's current location (x,y), as a Vec2D-vector.\n\nAliases: pos | position\n\nNo arguments.\n\nExample:\n>>> pos()\n(0.00, 240.00)" }, { "name": "turtle.pu", "args": [ "" ], "description": "Pull the pen up -- no drawing when moving.\n\nAliases: penup | pu | up\n\nNo argument\n\nExample:\n>>> penup()" }, { "name": "turtle.radians", "args": [ "" ], "description": "Set the angle measurement units to radians.\n\nNo arguments.\n\nExample:\n>>> heading()\n90\n>>> radians()\n>>> heading()\n1.5707963267948966" }, { "name": "turtle.read_docstrings", "args": [ "lang" ], "description": "Read in docstrings from lang-specific docstring dictionary.\n\nTransfer docstrings, translated to lang, from a dictionary-file\nto the methods of classes Screen and Turtle and - in revised form -\nto the corresponding functions." }, { "name": "turtle.readconfig", "args": [ "cfgdict" ], "description": "Read config-files, change configuration-dict accordingly.\n\nIf there is a turtle.cfg file in the current working directory,\nread it from there. If this contains an importconfig-value,\nsay 'myway', construct filename turtle_mayway.cfg else use\nturtle.cfg and read it from the import-directory, where\nturtle.py is located.\nUpdate configuration dictionary first according to config-file,\nin the import directory, then according to config-file in the\ncurrent working directory.\nIf no config-file is found, the default configuration is used." }, { "name": "turtle.register_shape", "args": [ "name", "shape=None" ], "description": "Adds a turtle shape to TurtleScreen's shapelist.\n\nArguments:\n(1) name is the name of a gif-file and shape is None.\n Installs the corresponding image shape.\n !! Image-shapes DO NOT rotate when turning the turtle,\n !! so they do not display the heading of the turtle!\n(2) name is an arbitrary string and shape is a tuple\n of pairs of coordinates. Installs the corresponding\n polygon shape\n(3) name is an arbitrary string and shape is a\n (compound) Shape object. Installs the corresponding\n compound shape.\nTo use a shape, you have to issue the command shape(shapename).\n\ncall: register_shape(\"turtle.gif\")\n--or: register_shape(\"tri\", ((0,0), (10,10), (-10,10)))\n\nExample:\n>>> register_shape(\"triangle\", ((5,-3),(0,5),(-5,-3)))" }, { "name": "turtle.reset", "args": [ "" ], "description": "Delete the turtle's drawings and restore its default values.\n\nNo argument.\n\nDelete the turtle's drawings from the screen, re-center the turtle\nand set variables to the default values.\n\nExample:\n>>> position()\n(0.00,-22.00)\n>>> heading()\n100.0\n>>> reset()\n>>> position()\n(0.00,0.00)\n>>> heading()\n0.0" }, { "name": "turtle.resetscreen", "args": [ "" ], "description": "Reset all Turtles on the Screen to their initial state.\n\nNo argument.\n\nExample:\n>>> reset()" }, { "name": "turtle.resizemode", "args": [ "rmode=None" ], "description": "Set resizemode to one of the values: \"auto\", \"user\", \"noresize\".\n\n(Optional) Argument:\nrmode -- one of the strings \"auto\", \"user\", \"noresize\"\n\nDifferent resizemodes have the following effects:\n - \"auto\" adapts the appearance of the turtle\n corresponding to the value of pensize.\n - \"user\" adapts the appearance of the turtle according to the\n values of stretchfactor and outlinewidth (outline),\n which are set by shapesize()\n - \"noresize\" no adaption of the turtle's appearance takes place.\nIf no argument is given, return current resizemode.\nresizemode(\"user\") is called by a call of shapesize with arguments.\n\n\nExamples:\n>>> resizemode(\"noresize\")\n>>> resizemode()\n'noresize'" }, { "name": "turtle.right", "args": [ "angle" ], "description": "Turn turtle right by angle units.\n\nAliases: right | rt\n\nArgument:\nangle -- a number (integer or float)\n\nTurn turtle right by angle units. (Units are by default degrees,\nbut can be set via the degrees() and radians() functions.)\nAngle orientation depends on mode. (See this.)\n\nExample:\n>>> heading()\n22.0\n>>> right(45)\n>>> heading()\n337.0" }, { "name": "turtle.rt", "args": [ "angle" ], "description": "Turn turtle right by angle units.\n\nAliases: right | rt\n\nArgument:\nangle -- a number (integer or float)\n\nTurn turtle right by angle units. (Units are by default degrees,\nbut can be set via the degrees() and radians() functions.)\nAngle orientation depends on mode. (See this.)\n\nExample:\n>>> heading()\n22.0\n>>> right(45)\n>>> heading()\n337.0" }, { "name": "turtle.screensize", "args": [ "canvwidth=None", "canvheight=None", "bg=None" ], "description": "Resize the canvas the turtles are drawing on.\n\nOptional arguments:\ncanvwidth -- positive integer, new width of canvas in pixels\ncanvheight -- positive integer, new height of canvas in pixels\nbg -- colorstring or color-tuple, new backgroundcolor\nIf no arguments are given, return current (canvaswidth, canvasheight)\n\nDo not alter the drawing window. To observe hidden parts of\nthe canvas use the scrollbars. (Can make visible those parts\nof a drawing, which were outside the canvas before!)\n\nExample (for a Turtle instance named turtle):\n>>> turtle.screensize(2000,1500)\n>>> # e.g. to search for an erroneously escaped turtle ;-)" }, { "name": "turtle.seth", "args": [ "to_angle" ], "description": "Set the orientation of the turtle to to_angle.\n\nAliases: setheading | seth\n\nArgument:\nto_angle -- a number (integer or float)\n\nSet the orientation of the turtle to to_angle.\nHere are some common directions in degrees:\n\n standard - mode: logo-mode:\n-------------------|--------------------\n 0 - east 0 - north\n 90 - north 90 - east\n 180 - west 180 - south\n 270 - south 270 - west\n\nExample:\n>>> setheading(90)\n>>> heading()\n90" }, { "name": "turtle.setheading", "args": [ "to_angle" ], "description": "Set the orientation of the turtle to to_angle.\n\nAliases: setheading | seth\n\nArgument:\nto_angle -- a number (integer or float)\n\nSet the orientation of the turtle to to_angle.\nHere are some common directions in degrees:\n\n standard - mode: logo-mode:\n-------------------|--------------------\n 0 - east 0 - north\n 90 - north 90 - east\n 180 - west 180 - south\n 270 - south 270 - west\n\nExample:\n>>> setheading(90)\n>>> heading()\n90" }, { "name": "turtle.setpos", "args": [ "x", "y=None" ], "description": "Move turtle to an absolute position.\n\nAliases: setpos | setposition | goto:\n\nArguments:\nx -- a number or a pair/vector of numbers\ny -- a number None\n\ncall: goto(x, y) # two coordinates\n--or: goto((x, y)) # a pair (tuple) of coordinates\n--or: goto(vec) # e.g. as returned by pos()\n\nMove turtle to an absolute position. If the pen is down,\na line will be drawn. The turtle's orientation does not change.\n\nExample:\n>>> tp = pos()\n>>> tp\n(0.00, 0.00)\n>>> setpos(60,30)\n>>> pos()\n(60.00,30.00)\n>>> setpos((20,80))\n>>> pos()\n(20.00,80.00)\n>>> setpos(tp)\n>>> pos()\n(0.00,0.00)" }, { "name": "turtle.setposition", "args": [ "x", "y=None" ], "description": "Move turtle to an absolute position.\n\nAliases: setpos | setposition | goto:\n\nArguments:\nx -- a number or a pair/vector of numbers\ny -- a number None\n\ncall: goto(x, y) # two coordinates\n--or: goto((x, y)) # a pair (tuple) of coordinates\n--or: goto(vec) # e.g. as returned by pos()\n\nMove turtle to an absolute position. If the pen is down,\na line will be drawn. The turtle's orientation does not change.\n\nExample:\n>>> tp = pos()\n>>> tp\n(0.00, 0.00)\n>>> setpos(60,30)\n>>> pos()\n(60.00,30.00)\n>>> setpos((20,80))\n>>> pos()\n(20.00,80.00)\n>>> setpos(tp)\n>>> pos()\n(0.00,0.00)" }, { "name": "turtle.settiltangle", "args": [ "angle" ], "description": "Rotate the turtleshape to point in the specified direction\n\nArgument: angle -- number\n\nRotate the turtleshape to point in the direction specified by angle,\nregardless of its current tilt-angle. DO NOT change the turtle's\nheading (direction of movement).\n\n\nExamples:\n>>> shape(\"circle\")\n>>> shapesize(5,2)\n>>> settiltangle(45)\n>>> stamp()\n>>> fd(50)\n>>> settiltangle(-45)\n>>> stamp()\n>>> fd(50)" }, { "name": "turtle.setundobuffer", "args": [ "size" ], "description": "Set or disable undobuffer.\n\nArgument:\nsize -- an integer or None\n\nIf size is an integer an empty undobuffer of given size is installed.\nSize gives the maximum number of turtle-actions that can be undone\nby the undo() function.\nIf size is None, no undobuffer is present.\n\nExample:\n>>> setundobuffer(42)" }, { "name": "turtle.setup", "args": [ "width=0.5", "height=0.75", "startx=None", "starty=None" ], "description": "Set the size and position of the main window.\n\nArguments:\nwidth: as integer a size in pixels, as float a fraction of the \n Default is 50% of \nheight: as integer the height in pixels, as float a fraction of the\n Default is 75% of \nstartx: if positive, starting position in pixels from the left\n edge of the screen, if negative from the right edge\n Default, startx=None is to center window horizontally.\nstarty: if positive, starting position in pixels from the top\n edge of the screen, if negative from the bottom edge\n Default, starty=None is to center window vertically.\n\nExamples:\n>>> setup (width=200, height=200, startx=0, starty=0)\n\nsets window to 200x200 pixels, in upper left of screen\n\n>>> setup(width=.75, height=0.5, startx=None, starty=None)\n\nsets window to 75% of screen by 50% of screen and centers" }, { "name": "turtle.setworldcoordinates", "args": [ "llx", "lly", "urx", "ury" ], "description": "Set up a user defined coordinate-system.\n\nArguments:\nllx -- a number, x-coordinate of lower left corner of canvas\nlly -- a number, y-coordinate of lower left corner of canvas\nurx -- a number, x-coordinate of upper right corner of canvas\nury -- a number, y-coordinate of upper right corner of canvas\n\nSet up user coodinat-system and switch to mode 'world' if necessary.\nThis performs a reset. If mode 'world' is already active,\nall drawings are redrawn according to the new coordinates.\n\nBut ATTENTION: in user-defined coordinatesystems angles may appear\ndistorted. (see Screen.mode())\n\nExample:\n>>> setworldcoordinates(-10,-0.5,50,1.5)\n>>> for _ in range(36):\n... left(10)\n... forward(0.5)" }, { "name": "turtle.setx", "args": [ "x" ], "description": "Set the turtle's first coordinate to x\n\nArgument:\nx -- a number (integer or float)\n\nSet the turtle's first coordinate to x, leave second coordinate\nunchanged.\n\nExample:\n>>> position()\n(0.00, 240.00)\n>>> setx(10)\n>>> position()\n(10.00, 240.00)" }, { "name": "turtle.sety", "args": [ "y" ], "description": "Set the turtle's second coordinate to y\n\nArgument:\ny -- a number (integer or float)\n\nSet the turtle's first coordinate to x, second coordinate remains\nunchanged.\n\nExample:\n>>> position()\n(0.00, 40.00)\n>>> sety(-10)\n>>> position()\n(0.00, -10.00)" }, { "name": "turtle.shape", "args": [ "name=None" ], "description": "Set turtle shape to shape with given name / return current shapename.\n\nOptional argument:\nname -- a string, which is a valid shapename\n\nSet turtle shape to shape with given name or, if name is not given,\nreturn name of current shape.\nShape with name must exist in the TurtleScreen's shape dictionary.\nInitially there are the following polygon shapes:\n'arrow', 'turtle', 'circle', 'square', 'triangle', 'classic'.\nTo learn about how to deal with shapes see Screen-method register_shape.\n\nExample:\n>>> shape()\n'arrow'\n>>> shape(\"turtle\")\n>>> shape()\n'turtle'" }, { "name": "turtle.shapesize", "args": [ "stretch_wid=None", "stretch_len=None", "outline=None" ], "description": "Set/return turtle's stretchfactors/outline. Set resizemode to \"user\".\n\nOptional arguments:\n stretch_wid : positive number\n stretch_len : positive number\n outline : positive number\n\nReturn or set the pen's attributes x/y-stretchfactors and/or outline.\nSet resizemode to \"user\".\nIf and only if resizemode is set to \"user\", the turtle will be displayed\nstretched according to its stretchfactors:\nstretch_wid is stretchfactor perpendicular to orientation\nstretch_len is stretchfactor in direction of turtles orientation.\noutline determines the width of the shapes's outline.\n\nExamples:\n>>> resizemode(\"user\")\n>>> shapesize(5, 5, 12)\n>>> shapesize(outline=8)" }, { "name": "turtle.shapetransform", "args": [ "t11=None", "t12=None", "t21=None", "t22=None" ], "description": "Set or return the current transformation matrix of the turtle shape.\n\nOptional arguments: t11, t12, t21, t22 -- numbers.\n\nIf none of the matrix elements are given, return the transformation\nmatrix.\nOtherwise set the given elements and transform the turtleshape\naccording to the matrix consisting of first row t11, t12 and\nsecond row t21, 22.\nModify stretchfactor, shearfactor and tiltangle according to the\ngiven matrix.\n\nExamples:\n>>> shape(\"square\")\n>>> shapesize(4,2)\n>>> shearfactor(-0.5)\n>>> shapetransform()\n(4.0, -1.0, -0.0, 2.0)" }, { "name": "turtle.shearfactor", "args": [ "shear=None" ], "description": "Set or return the current shearfactor.\n\nOptional argument: shear -- number, tangent of the shear angle\n\nShear the turtleshape according to the given shearfactor shear,\nwhich is the tangent of the shear angle. DO NOT change the\nturtle's heading (direction of movement).\nIf shear is not given: return the current shearfactor, i. e. the\ntangent of the shear angle, by which lines parallel to the\nheading of the turtle are sheared.\n\nExamples:\n>>> shape(\"circle\")\n>>> shapesize(5,2)\n>>> shearfactor(0.5)\n>>> shearfactor()\n>>> 0.5" }, { "name": "turtle.showturtle", "args": [ "" ], "description": "Makes the turtle visible.\n\nAliases: showturtle | st\n\nNo argument.\n\nExample:\n>>> hideturtle()\n>>> showturtle()" }, { "name": "turtle.tkinter.simpledialog", "args": null, "description": "This modules handles dialog boxes.\n\nIt contains the following public symbols:\n\nSimpleDialog -- A simple but flexible modal dialog box\n\nDialog -- a base class for dialogs\n\naskinteger -- get an integer from the user\n\naskfloat -- get a float from the user\n\naskstring -- get a string from the user" }, { "name": "turtle.speed", "args": [ "speed=None" ], "description": "Return or set the turtle's speed.\n\nOptional argument:\nspeed -- an integer in the range 0..10 or a speedstring (see below)\n\nSet the turtle's speed to an integer value in the range 0 .. 10.\nIf no argument is given: return current speed.\n\nIf input is a number greater than 10 or smaller than 0.5,\nspeed is set to 0.\nSpeedstrings are mapped to speedvalues in the following way:\n 'fastest' : 0\n 'fast' : 10\n 'normal' : 6\n 'slow' : 3\n 'slowest' : 1\nspeeds from 1 to 10 enforce increasingly faster animation of\nline drawing and turtle turning.\n\nAttention:\nspeed = 0 : *no* animation takes place. forward/back makes turtle jump\nand likewise left/right make the turtle turn instantly.\n\nExample:\n>>> speed(3)" }, { "name": "turtle.split", "args": [ "p" ], "description": "Split a pathname. Returns tuple \"(head, tail)\" where \"tail\" is\neverything after the final slash. Either part may be empty." }, { "name": "turtle.st", "args": [ "" ], "description": "Makes the turtle visible.\n\nAliases: showturtle | st\n\nNo argument.\n\nExample:\n>>> hideturtle()\n>>> showturtle()" }, { "name": "turtle.stamp", "args": [ "" ], "description": "Stamp a copy of the turtleshape onto the canvas and return its id.\n\nNo argument.\n\nStamp a copy of the turtle shape onto the canvas at the current\nturtle position. Return a stamp_id for that stamp, which can be\nused to delete it by calling clearstamp(stamp_id).\n\nExample:\n>>> color(\"blue\")\n>>> stamp()\n13\n>>> fd(50)" }, { "name": "turtle.sys", "args": null, "description": "This module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else ''\nmodules -- dictionary of loaded modules\n\ndisplayhook -- called to show results in an interactive session\nexcepthook -- called to handle any uncaught exception other than SystemExit\n To customize printing in an interactive session or to install a custom\n top-level exception handler, assign other functions to replace these.\n\nstdin -- standard input file object; used by input()\nstdout -- standard output file object; used by print()\nstderr -- standard error object; used for error messages\n By assigning other file objects (or objects that behave like files)\n to these, it is possible to redirect all of the interpreter's I/O.\n\nlast_type -- type of last uncaught exception\nlast_value -- value of last uncaught exception\nlast_traceback -- traceback of last uncaught exception\n These three are only available in an interactive session after a\n traceback has been printed.\n\nStatic objects:\n\nbuiltin_module_names -- tuple of module names built into this interpreter\ncopyright -- copyright notice pertaining to this interpreter\nexec_prefix -- prefix used to find the machine-specific Python library\nexecutable -- absolute path of the executable binary of the Python interpreter\nfloat_info -- a struct sequence with information about the float implementation.\nfloat_repr_style -- string indicating the style of repr() output for floats\nhash_info -- a struct sequence with information about the hash algorithm.\nhexversion -- version information encoded as a single integer\nimplementation -- Python implementation information.\nint_info -- a struct sequence with information about the int implementation.\nmaxsize -- the largest supported length of containers.\nmaxunicode -- the value of the largest Unicode code point\nplatform -- platform identifier\nprefix -- prefix used to find the Python library\nthread_info -- a struct sequence with information about the thread implementation.\nversion -- the version of this interpreter as a string\nversion_info -- version information as a named tuple\n__stdin__ -- the original stdin; don't touch!\n__stdout__ -- the original stdout; don't touch!\n__stderr__ -- the original stderr; don't touch!\n__displayhook__ -- the original displayhook; don't touch!\n__excepthook__ -- the original excepthook; don't touch!\n\nFunctions:\n\ndisplayhook() -- print an object to the screen, and save it in builtins._\nexcepthook() -- print an exception and its traceback to sys.stderr\nexc_info() -- return thread-safe information about the current exception\nexit() -- exit the interpreter by raising SystemExit\ngetdlopenflags() -- returns flags to be used for dlopen() calls\ngetprofile() -- get the global profiling function\ngetrefcount() -- return the reference count for an object (plus one :-)\ngetrecursionlimit() -- return the max recursion depth for the interpreter\ngetsizeof() -- return the size of an object in bytes\ngettrace() -- get the global debug tracing function\nsetcheckinterval() -- control how often the interpreter checks for events\nsetdlopenflags() -- set the flags to be used for dlopen() calls\nsetprofile() -- set the global profiling function\nsetrecursionlimit() -- set the max recursion depth for the interpreter\nsettrace() -- set the global debug tracing function" }, { "name": "turtle.textinput", "args": [ "title", "prompt" ], "description": "Pop up a dialog window for input of a string.\n\nArguments: title is the title of the dialog window,\nprompt is a text mostly describing what information to input.\n\nReturn the string input\nIf the dialog is canceled, return None.\n\nExample:\n>>> textinput(\"NIM\", \"Name of first player:\")" }, { "name": "turtle.tilt", "args": [ "angle" ], "description": "Rotate the turtleshape by angle.\n\nArgument:\nangle - a number\n\nRotate the turtleshape by angle from its current tilt-angle,\nbut do NOT change the turtle's heading (direction of movement).\n\nExamples:\n>>> shape(\"circle\")\n>>> shapesize(5,2)\n>>> tilt(30)\n>>> fd(50)\n>>> tilt(30)\n>>> fd(50)" }, { "name": "turtle.tiltangle", "args": [ "angle=None" ], "description": "Set or return the current tilt-angle.\n\nOptional argument: angle -- number\n\nRotate the turtleshape to point in the direction specified by angle,\nregardless of its current tilt-angle. DO NOT change the turtle's\nheading (direction of movement).\nIf angle is not given: return the current tilt-angle, i. e. the angle\nbetween the orientation of the turtleshape and the heading of the\nturtle (its direction of movement).\n\nDeprecated since Python 3.1\n\nExamples:\n>>> shape(\"circle\")\n>>> shapesize(5,2)\n>>> tilt(45)\n>>> tiltangle()" }, { "name": "turtle.time", "args": null, "description": "This module provides various functions to manipulate time values.\n\nThere are two standard representations of time. One is the number\nof seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\nor a floating point number (to represent fractions of seconds).\nThe Epoch is system-defined; on Unix, it is generally January 1st, 1970.\nThe actual value can be retrieved by calling gmtime(0).\n\nThe other representation is a tuple of 9 integers giving local time.\nThe tuple items are:\n year (including century, e.g. 1998)\n month (1-12)\n day (1-31)\n hours (0-23)\n minutes (0-59)\n seconds (0-59)\n weekday (0-6, Monday is 0)\n Julian day (day in the year, 1-366)\n DST (Daylight Savings Time) flag (-1, 0 or 1)\nIf the DST flag is 0, the time is given in the regular time zone;\nif it is 1, the time is given in the DST time zone;\nif it is -1, mktime() should guess based on the date and time.\n\nVariables:\n\ntimezone -- difference in seconds between UTC and local standard time\naltzone -- difference in seconds between UTC and local DST time\ndaylight -- whether local time should reflect DST\ntzname -- tuple of (standard time zone name, DST time zone name)\n\nFunctions:\n\ntime() -- return current time in seconds since the Epoch as a float\nclock() -- return CPU time since process start as a float\nsleep() -- delay for a number of seconds given as a float\ngmtime() -- convert seconds since Epoch to UTC tuple\nlocaltime() -- convert seconds since Epoch to local time tuple\nasctime() -- convert time tuple to string\nctime() -- convert time in seconds to string\nmktime() -- convert local time tuple to seconds since Epoch\nstrftime() -- convert time tuple to string according to format specification\nstrptime() -- parse string to time tuple according to format specification\ntzset() -- change the local timezone" }, { "name": "turtle.title", "args": [ "titlestring" ], "description": "Set title of turtle-window\n\nArgument:\ntitlestring -- a string, to appear in the titlebar of the\n turtle graphics window.\n\nThis is a method of Screen-class. Not available for TurtleScreen-\nobjects.\n\nExample:\n>>> title(\"Welcome to the turtle-zoo!\")" }, { "name": "turtle.towards", "args": [ "x", "y=None" ], "description": "Return the angle of the line from the turtle's position to (x, y).\n\nArguments:\nx -- a number or a pair/vector of numbers or a turtle instance\ny -- a number None None\n\ncall: distance(x, y) # two coordinates\n--or: distance((x, y)) # a pair (tuple) of coordinates\n--or: distance(vec) # e.g. as returned by pos()\n--or: distance(mypen) # where mypen is another turtle\n\nReturn the angle, between the line from turtle-position to position\nspecified by x, y and the turtle's start orientation. (Depends on\nmodes - \"standard\" or \"logo\")\n\nExample:\n>>> pos()\n(10.00, 10.00)\n>>> towards(0,0)\n225.0" }, { "name": "turtle.tracer", "args": [ "n=None", "delay=None" ], "description": "Turns turtle animation on/off and set delay for update drawings.\n\nOptional arguments:\nn -- nonnegative integer\ndelay -- nonnegative integer\n\nIf n is given, only each n-th regular screen update is really performed.\n(Can be used to accelerate the drawing of complex graphics.)\nSecond arguments sets delay value (see RawTurtle.delay())\n\nExample:\n>>> tracer(8, 25)\n>>> dist = 2\n>>> for i in range(200):\n... fd(dist)\n... rt(90)\n... dist += 2" }, { "name": "turtle.turtles", "args": [ "" ], "description": "Return the list of turtles on the \n\nExample:\n>>> turtles()\n[]" }, { "name": "turtle.turtlesize", "args": [ "stretch_wid=None", "stretch_len=None", "outline=None" ], "description": "Set/return turtle's stretchfactors/outline. Set resizemode to \"user\".\n\nOptional arguments:\n stretch_wid : positive number\n stretch_len : positive number\n outline : positive number\n\nReturn or set the pen's attributes x/y-stretchfactors and/or outline.\nSet resizemode to \"user\".\nIf and only if resizemode is set to \"user\", the turtle will be displayed\nstretched according to its stretchfactors:\nstretch_wid is stretchfactor perpendicular to orientation\nstretch_len is stretchfactor in direction of turtles orientation.\noutline determines the width of the shapes's outline.\n\nExamples:\n>>> resizemode(\"user\")\n>>> shapesize(5, 5, 12)\n>>> shapesize(outline=8)" }, { "name": "turtle.types", "args": null, "description": "Define names for built-in types that aren't directly accessible as a builtin." }, { "name": "turtle.undo", "args": [ "" ], "description": "undo (repeatedly) the last turtle action.\n\nNo argument.\n\nundo (repeatedly) the last turtle action.\nNumber of available undo actions is determined by the size of\nthe undobuffer.\n\nExample:\n>>> for i in range(4):\n... fd(50); lt(80)\n...\n>>> for i in range(8):\n... undo()\n..." }, { "name": "turtle.undobufferentries", "args": [ "" ], "description": "Return count of entries in the undobuffer.\n\nNo argument.\n\nExample:\n>>> while undobufferentries():\n... undo()" }, { "name": "turtle.up", "args": [ "" ], "description": "Pull the pen up -- no drawing when moving.\n\nAliases: penup | pu | up\n\nNo argument\n\nExample:\n>>> penup()" }, { "name": "turtle.update", "args": [ "" ], "description": "Perform a TurtleScreen update.\n " }, { "name": "turtle.width", "args": [ "width=None" ], "description": "Set or return the line thickness.\n\nAliases: pensize | width\n\nArgument:\nwidth -- positive number\n\nSet the line thickness to width or return it. If resizemode is set\nto \"auto\" and turtleshape is a polygon, that polygon is drawn with\nthe same line thickness. If no argument is given, current pensize\nis returned.\n\nExample:\n>>> pensize()\n1\n>>> pensize(10) # from here on lines of width 10 are drawn" }, { "name": "turtle.window_height", "args": [ "" ], "description": "Return the height of the turtle window.\n\nExample:\n>>> window_height()\n480" }, { "name": "turtle.window_width", "args": [ "" ], "description": "Return the width of the turtle window.\n\nExample:\n>>> window_width()\n640" }, { "name": "turtle.write", "args": [ "arg", "move=False", "align='left'", "font='Arial'", "8", "'normal'" ], "description": "Write text at the current turtle position.\n\nArguments:\narg -- info, which is to be written to the TurtleScreen\nmove (optional) -- True/False\nalign (optional) -- one of the strings \"left\", \"center\" or right\"\nfont (optional) -- a triple (fontname, fontsize, fonttype)\n\nWrite text - the string representation of arg - at the current\nturtle position according to align (\"left\", \"center\" or right\")\nand with the given font.\nIf move is True, the pen is moved to the bottom-right corner\nof the text. By default, move is False.\n\nExample:\n>>> write('Home = ', True, align=\"center\")\n>>> write((0,0), True)" }, { "name": "turtle.write_docstringdict", "args": [ "filename='turtle_docstringdict'" ], "description": "Create and write docstring-dictionary to file.\n\nOptional argument:\nfilename -- a string, used as filename\n default value is turtle_docstringdict\n\nHas to be called explicitly, (not used by the turtle-graphics classes)\nThe docstring dictionary will be written to the Python script .py\nIt is intended to serve as a template for translation of the docstrings\ninto different languages." }, { "name": "turtle.xcor", "args": [ "" ], "description": "Return the turtle's x coordinate.\n\nNo arguments.\n\nExample:\n>>> reset()\n>>> left(60)\n>>> forward(100)\n>>> print xcor()\n50.0" }, { "name": "turtle.ycor", "args": [ "" ], "description": "Return the turtle's y coordinate\n---\nNo arguments.\n\nExample:\n>>> reset()\n>>> left(60)\n>>> forward(100)\n>>> print ycor()\n86.6025403784" } ]
  • Français
  • fs'|r%<W5}mpqrEXuY#N!M7__G !L"BV"|Օ+CcE-@N&ƨ=@ .xPEDdD޸2JIJ 8Xxh bvXRE;DY,:0}b U8_[LŗݧN 2?uI8IWs sA v$}a"< 0$B}d!C  >c>ψ,D)r$;1KƑ`=7ZBȯ"z`VU#t9c/yo\zr3:"w.h09:RAS5+t (]N;!j#"GQI4~r%# Ph,0OD*e\8]jVa@g}Q1 $@ D!R:_B 60A6/&zD m:R%!:)(jRJΤ :2 M#Ts!LUA5|\l o{ @6N5]BzA`fGqJA`LB4'<"v"D aG (D̈|z@II҈SA"=xh*QdFOeRe~]\xĭS jo[:rSRN)JaoEG١BL ͈<>Yv!?eU=1mGf~)Y^q۟.rZ:Cc.GQCN[B4A*>3#;T#B 86{B|d^5[3_rFD(o `PI?̑,~ (,4#6)g]` |>]?ދpnB1b Y{6^8$xB  :Ĝ/6.-cK\!b P^̐|҉fs7lY)D?\Yn8 ;Syc :#koŪ15T`ip eDy @tf(-r҇A :f*%Ĺ/lE7tۅך4n A>CDK-ē&f“bDV dXȯb8/%P F$ۈqq> j$̐0w"ѲG3egYwS`F=ED9Y70m y~0 @DZ@?J R;S@qjA]goA:,p~a&Ȁz{13QMyQ ЙEbIѫ?1x:2"NGy" pK `@/N K:3m&udZD! A3D# ra 3 H ">0@#$].+Rԍc6f4' Zl6-zqVŐ#&kZw]pqLa0r`Ѐ:.A 1{?'d}^!~7`2p}~h=h:x1!m:сQ{KV Pr`NP ResW|u!"4oҁXu;K.)@Ad(K\Ur1h]8ErUof q8_!&%7k? ~!J#v0P JvAW"Mu:5|'`k }'rчAiqjw< a] }ae40V8 ` (RO rv>QwJ& GPP"@@pF7Lv]x!E@c`4{sз".ڕ< эWLˢ4xb0h V8;!А0y n0 wvزyp )aV^%Z&]GyCw4$K&%t/ ^w{W =hB]#ِUГ0AR7'54a)%G# 4J rOpЕ!a*%(㰕wAHAd1 갍Xx Aq[(T9r@PZp'ܣ)g`H]6N]V&xeiXRk x8!u9pI[0 ?(` 7$e|v##XG=i "T Ly%YDA(/X?I#C`1+Pf1 PRX&aҀ]$,umy ATf77U;:z1xFב9Iv9t4{ ',Ese@ Os=*oTU8:_zIhBf/b*c-:~1YL1*QoZ/@ BL RJnx-LSRŘt|#?EY7hrq2sr  €V+ b:-hѡ#9b/{8%n 1.;:kj')q8RS6 A ‚xA"3*F@_J)0s@s3!xa SgQ&'Q X/+<{`7KDM'- h'l  B bJMP:Agհ+A!0wP;b,K~rqQ[d)~C qE ۹\"!ka,ַd 롂$w6!#'u%{RC{Y. {K+Kǫ{˻8~~?aB;3v];K[?NTg~"  o &Igѭ{eeQ B7HU@!;Q:XKޗᲾދ,@i8C)  G,8~R *6B0<!Cy: qc~ˢtRA:A콜Cl#< khO - *G[fY@a.ÎPHc!6' "=hL#3fI0x =W>FLOrDžlA& p BpQ56+v1 ! ^K"DMWuz>V*:a̔̎ Bf=VDzJ)ɝ߀͕͔yq0х^~?_ g?_g "{ ` *V 2003%.#9/yAC_'N I`NPPQN U"\9A 8bW-jKBdMTok't_빹[<{^!ZOm6^! dϹw̡t?UOO j0(aQKo2=*2raBc?_~_;?_؟ڿ?_??_>h"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETREkUU^ŚUV?VXe͞EVZmݾW\uMy^}p9p FXUr.3P@\PCE4QEeQG4RI'RK/4SM77TlGTqsaUW_5VYgV[o5W]wUz6Xa%XcE6YeeYgݵ~TVqGh6eAUlч[tŖV7^y祷^{7_}Y6kV[n}}vVMןuvGaEb/8c7Y[i XdYݶ[Wy_ eo9gwFc@Yڒ_v5eycYw:j:_:-$}GrvFwygXiţmɶc tl݆bGyII$u g;`P`8nS`~rmo-qu[﷟8P8lV@6Ё`%8A VЂ`5AvaEAVkhF5qBc"`G#w6%  vy{c6v͈GDbD&6щObmŎ9/l Pg848F2QWZ ` ')`MgUA JP;nKZs\۵.<( %jǪrA ߛ 1zVG91` 8[FP0a (p x0ر=@ pF@ }cغq#8;<fkAF3ӝJ$79`x8QDK|`vGRB$ +w` IWx6wV-/!PDx@&f1(?1tPB Yav) ʐ~(; v㨿K;Fa@y -f(F9@uӭo9=t ]^M2t 8Gz"pH L[#r[j:œ>k)?}]=Y*?v5uipe΀K>%tcm0F7unoX:wP\Ε5[zi! 칦8 ԧvռEVFDJ>K.;tl>! vA 0VcEܑ \p jƍh-Ud ΰCvpsɜ؎=l"dZ*Q3H,- ev刬3z gd,e2WƲ2" :X6}kw^(e9+H.b15x<VQY1JHf N,H=0Gt)hʽA2=5aʱk> G(ھK  +sl];޳2^ؑ.ۻ/ Cdc1!:mWl;G9S}[퀂R|m9s̮s ;?zЅ>tG?:㚢W<ƅ&L8Ɓ6|c0uDAmK4~@6}lc4~o$҃.o tǀJQ4l2e:|ۑr#x5[Ec\l:GlET39ҬsH}e?{G"u{$RcկdXlrq9Ā`f9/Șฺ̱hҗh}æf"\c؃1chRX#:"2,hg4Rsz;v[:bq$4DTdt;$= 0 쓺sp@>qh<%%,',aC0B@ha$Fx%K:.܁PW3?,x)B@`÷C;q5X3,HD›"%g[!:/|Bp/MNOPQ$R4SDTTUdVt% qEp v`;}%ZK3^dF^lr8v0n)pk^Y!L JlDÂ9z?r(; %Ѥ)elhzr 0nﱥLpsȆ{.dnȌȍȎȏɐɑ$ɒ4ɓDɔTɕdI^A֓ũq q5ˆ.k&9bg 8ʠd<3z|gJʨ|P̆dʨ<ʩ, a4gPJ|\K&yʳYJlG7vhJiJQph}?hd(+& =ȃ; ox!z lfo&@D0Sy낰h' kN"i=ogo: m:ooO =ཐp'r"Wr*9%w'o)*9nŠm+.o 017s䈃6Jr3wpj``7!n*q?Gxd0?p%X L '覙?#t ][0yx&(`usfl ~'edWx {(y=8`l/`ya{8cQh x,Of7 zΗw {{WAwׇؗ٧ڷfHp|'7@}$!wGy 8~8+8;8K>9[~9k9{9衋>:饛~:ꩫ:뭻:>;~;;; ?<<+<;>髿>>?????(< 2| #( R 3 r C(&!(!F<"%2N|"()RV"-r^"(1f<#Ө5n|#(9ұv#=~# )A<$"E2|$$#)IR$&3Mr$(C)Q<%*SU|%,c)˻YҲ%.s]򲗾%0)a<&2e2|&4)iRּ&6mr&8)q椥Å1)X#yEPl O} %^ρ)yЛs&Q(a6T?EI# ɝDN_}$-)JSa.})Lc*S*3I=! ,W! , O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуN|3Uֆ# ŊiEr LI@BgIu% / 44C-gYJy D݆$|AcM% tRu]9eDg(Pb7#A58=ȑSW]%]@:/MFH #ZSfԜ9^8$GA"` IgINz?fyvgJ7>#Ѡ~ EɴΗ@ )fnEN; DjhH3R % ?#@BJ-ybjIρh,)lIg9oĠaJhrEڪ?-yNz-a0\=SO:4J/ӎE|*0)V:Il|sKQ{T-@n+И!cE(c^E1oCO QQlutoH;56R?o;?^@(,E露l춇w\3,w$DusO;~DQ=58AotxJ8v8A"Fn͵,j#B^sNW߭_4n]G+T]mrI<4piuo(2 tIGZg_ ,!G/M?Z{&! %?qyW= }^ %nxA7U&`VB|"J &Erѻȩ İ#vȬHLG$0abތ#iAlÒ$VĢI"~qhjS1"EЇ 4¦\Hd~q'w {҆\iA]p@F%E$/@X~ PM4ɢ$Qj 9cfI4#NچzC"/@б6$e.KG ;&A% &-2:4Ƭ9v g4x<0 d )9yB?&<# ͆R*2&N  ܳ$@&]F#t/h'N@HNId!,7 dtR @qB2¤,0P%Wch2$7E@BJXazNH@J**'^4Y`D SYWH@?Ɓ "!@R-Rk,Z}A ɯ{dU aT"Z]MQ΄ɹHrV h ]FlGd珉 ;ět y,5Qt$(Fx(-$(h98ؓfx%Drcyd' *Y+†u*IMZ$EZ?4׽ŌG xv#7DmI9` p]̮nb9yL%el4k;ĕ30f$ɑb8 +Y(b;yŞhV *Ahcݐ1/ L3h P]0I变8f "7HjS+ͱy?I M\@gtBiBW apJ|tb xcG,꒤׿&Q sخ b d*; 9Y M)0  AauU1[m9$5O9&WX",ᑀ5r bEt0Pqs~qdZM"d!l N"{ ƌWf0:B[_2d Y4eu&x *zcM |x 0%H@a\s==PkJӪqvHPEA"Ί  Ȃ 7GbDז<*eo+T͟XFs"{?SJ;]m$|ndH 9tm$jSȗF0"3S@H8JUgQFQfL^f@$q~1|([iB[^8XViTC}Yz" '7| Oy'tT1PH>w"LJAHB2* pFqhVq0}7PF ([HW|A~ uQ wThF_J f+`zrц'"uxIKxoZ@RgxZ s^GopT#XC<`817OPpGe_"q*('!P;犧A l&! wq11(`'`cxV !AP%`r!0oh(6qiwvR{H4r4 &nIpvBytkyG!`97&Wxf{)` /pY6l&I:$wc;eWd%gwO4 pKh5!{J1 +B`AI>GN5(ap61 y7  '&l5l YI!(!ܘ@mB6vw)ob|4[Iy?6  Ur$q.+F~P%8t>0hBR8+z|I mz(|P 7 )3tN Z`8@&ht8D!il&&~50&x@ (IqH`Yq)E"w*!4xʅ&nY:vC0i@)E&) e<bZzO&M.yqq@! S!&:$RP$oQgѣ>* 6N/_xYUgh "I XP:M U ^qCK8X5P%sw25 U&7_FPHZp8 `B5b:&f` zׄzB0`qj?')<|*$G`*P%[513s 6I-ijF@@@R|pY4Lʫ$&lϦH|Pp*@9+%FHVqr0iU+PH{:1yrby11<QenL.pfh(A"$+H:?` +z?"J=]B3[) 4 1K0Pvxd(^h D_6@ | rbN8&wIk[pU "tD A aa1 p GEG*5J 5,><""(~<(.* \Gq14Ve!(&;BdZDSI7F6}Ax6Khu՚rQra ГVA-Dɖ;h==vs3p1($";fr vMxpzj>D|+IaBPȚ*?)wD#A!_,3ًBCo` bc:A,άó @T |CDg"Q(94!SM#Q {^Ma7 1y;L_c(]( =1 Ќ)bBC<@B/5 1 k<l VHkɳA-qr fBB84+baԠ@J8!$0`PZ(06}J!\ P<" F@݅ ` 1Bv  }MQ0]GM- &0)]s m5 #}!N{=\DА"ZBق`B؛&0q$W@ <}/I1 aayPpES!A r2Ս~1v İ2Fq%HMCBa mMH}W(%J]D{, Gn ~F+q!@!+` +M5R /^!!%&ݳNQ 3:$<.\ . !2ۢ=}b8I -A1f$!愑2&ݤ&K~Ƒ O>Y& I^{eg!Ⰻqɐ*A^@.!{.cNL΂(i )Q cCZ̹]ѻA]MZEA =tn(n 2+Wݳl0[%՞Pkֆu!D+F7 @>7 lL еe ?"WF-Бp p.4ZE&_A7 ;GrNA*%ZQ'0#l 68 C_VXZ\^`b?d_fhdjnpBt_vp4x|~O@?_/oz_#aYС)~<2)s oT&NO qO`Qa,m/o }| qfn!6ǟ&n<n?ɏ N D0@3D)QD-^ĘQco6~R$SHZ8Ң-]S̏hJTM=}SPETRM*eiQ^x&V]z{0հe͞EKlڧnUi-[MwKk nWpިFXbƍ?Ydʕ-_ƜYfΝ=ZtϥMFZjG[lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^G^zݿ_|ϝR_~0@$@D0AdA9g *A /y˰C?1DG$D DDWwa1FsgÉ1aGs%qGD2I H Q2J)stqJ-4"+$L߲43M5dM7߄3NJM9S1ps<W^ PCPE+Te4RutU`E:G!(MRL1L4U` V l"ZT5W̦W\{K*j ]n `YdV%:}􉖠k 'Aǝk7jg3knn6p-wQw}Ewata6gbe$^^v,Y`aG0g"*ٜ+c9Qv7٢}(\: z*QzmUZ ZܣO$8Ϊ$vƤ삂d(W(v<1\Xd޹fz19n sgr(hN(F \3}PR OhA ix@s(_v0Nl ! 2 7[gQ ޜ`A1 ġl@0ݠ/=cM *yiA!;$RV#ʧy (Ȅ3 EOQ.# )Yv`a]0a<• 8J掉8CB &-jJ,09*DtL>.A׬pɛ?4ЁZr}L_ɷ#.񋉳m8CiGL hdq`9Bs;G go+AxAgp& +^qm9ƶ.\@G5A;jq&lǘ8@t 0@`,rd !AqweEJiwsǕ*C %2!E&* BW-#YjJ'fD  aӆ4X%䎟 @"J mܼC!rGDf8bY zyv9 3(BHyP ΜўڝqWx1qwxA>r'p3YESRn8jT;YEhvbL;pF`n[ܜ]R.GzwSI] >ց/r[.{HιJ0KF.JDy{A`]5ʖCDK"{wnwJiSsu|%$"HH z(~5OLz/a?{ɞM"N\=ez?fJs>?KƊ>)x{lߧ}d~ r~Hr}dD D|vuk(qy?=f?0Tq!@r @x@٢w"h"+`y0 ' ǘ$hz>@|BSg100(R@.XpABB  cq(IC0a!A-×A /܈)C&R!` -.uZ:3äh"JIB乮K4J!+)3ՁD99,?0bBL"sSłXJs "&A@*:Xc;Z$Ptj`Fc<]^n9 u)VzfE n1ŧ@opd f6?p\x"eďX!i ?Un@~\L fȂ yÍ(II? zȬ6$0>(\ fHHq̋ҳɗhǐؖkuɠCԗId= Y ##pʺ`a y kJJ6 rş8/LKj˃I  ݌1ݶ!@_ M 8^E_0e(\?_(\_ T_F`&fv 99vI4߾EaUvaz !&"6#F$V%f&v'()*+,-./01&263F4V5f6v789:;<=>?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^_`a&b6cFdVeffvghijklmnopq&r6sFtVufvvwxyz{|}~&6FVfv臆舖芶&6FVfv闆阖陦隶&6FVfv꧆ꨖꩦꪶ&6FVfv뷆븖빦뺶&6FVfvdžȖɦʶ&6FVfv׆ؖ٦ڶ~&6FVi(dXiN&Ľ6>g\kc`>;vԾ޽[Jf7G眓! ,W! , DH`T" ͠Ç#J8ŋ3jȱG STF||*)T~Icȑ%O\ē5 J$MbD K0eb\ETIODH*V,fs]˶m C5lݻx"%SR ~P$,4F;{wT3#UV4C]zӦJƧN |d\۸l9VkV0b7~+|tqУCD;r͉/Ĉsz. ZjmVSL'~c >}yQ߁R~Eݝ(V73} 8P-U z, QĤZ~-XTHFx 7P%֜G73?ӎD4)x Bim$OC< dh::"dk9əfbu-TK;4Ҟ"(_@xh?Vms˭i 43=QX;TFnF+`A$$:*+P7Honp"ĂI|+K.CdqPC,@0k1lZer_,@ 2H'==+PH4FGmL Z^4`-d;$Kl] up-i)! x.xP n8OPs_=A`A䘳L%4.'q]3rA5B0xi()%j6 &2Y2mP<-ۉALd/r,0 Î53͞JkTZ^NE9x;@ {[0bNs bg;6?z/xe@+805(2@&W*2.&Q(@T DP<|F4H,02JtsӓĚ1GL"Ǿg`@[ SH5z5"4!9"oxlF8!! \Qu"]6A;"I GtڈFx'#հBU$8F#YnU2[G+xz9cBL"VU:\"AniL6(kX?˗nIoHcbSp0JrՐn@sj݆Yѹc-p!v,xf1/J*:p3r5AP4х="u ~G6t<7O.^1L MZmR^}G*qKPq0bCdm`,cb˦k"g\H @m& `>j_WH ''ߠhC Pd9\##љ/7\O=;]FQ9@+ h})qվ63nd:,6\)&A I t S@Go #?Iiv˼ 92EzPh? P{amG*hCG5ulܐINӄ۸Y\L*x4*;ۄk!:p-!旈ZLlpټfGҀx87Pm8FС@E G.p8<9@l| w kVh}հAw4r9kdP3l; &`ܵ WMrxڙ#hW>!]hG9ӤO@͓$|`L{gWBD47SFqv4J4"Lzy^3AAwO"L4-I}='!rPf!U%"-h 4[4^t(T,|c7{xT|Fn`kh(V6lp+|\<@.npak-3"6GYֆyA)o+"(4"Um`` y5z3qhq(X1 P&q2_|4؋x4wDrB0\3zF#HוASC6:A8aȁ!RobS 2A 4\MvD!q@|(Y6b)gRAEɀ ({%'A51%#')QB(I2@ m)7 6 hDfe%hNQ3s 1`wt+aydisXiYɀXҚQwї<"Qv1)9B}0:1) & Mf 0,!"f 0ab7Y ,1+ p6J1eFYH?9)jE*i*/_q=cQq!+ni2Z(A"e!i@PJi*g:՟YZ6- :Er!$cJ1ڨ:Zz;d9z4ڪ*4:"Yʪ4 0&ڪ@:H#*sԚ2ך`zjֺ 1Ь 9iJ1@1*6m0 C mpzp {:j #: 5ڮdӫCa. 3iPO7 ʣ6ٙ JI3({-K/ [63A1/{ʲ9@B;D[F{HJL۴NPR;T[V{XZ\۵^`b;d[f{hjl۶npr;t[v{xz|۷~;[{۸;[{۹;[{ۺ;[Kc cл!bck9@  +ٰ 9mjP'Kj[~о~$d(s އ-9Ktj,Yl˿$ 9 Z(, + x ~9bw%˜۾',)tB-|2h4<4tk+P7pu)oЌ 7$@z@MP|b9Ĝċ-B:dui3Mn@`^1HPP kƚI ,Q|`#a yG6|@r`    ɎIL#[uHPrZYDl5ׅa<ܾ u AȶC @6\о &-J0o,0}(x~w0|kΒ !BzhP5 c ѷh( +)5^D* $0,P u`FP}k ,`fUh}d #q c7 Aq_20\<@ 0)3P_Q-yMQwIG!ʦ|$P# =.G&E[r ;)5=hvP,?- ~_0aׄhd/MFwL Ƞ-բ%00;S JM,irO~ zо.wRuGfr-x,0(%H~, +yJ/=p 5 ܿk%ԳqX ((xC/,^%#,فPHJLNPR>T^V~XZQ{0Od:`>L~:(C@Â`mv,o3` 9G0~%7%(`,xEWr|--p,`ǀQϝ} q Ŭ~W/=3F~I\>^~Ȟʾ)~C,ԃM"$XI+=`vǒ pƮ1Zf֕RռPN*~+#4dWS,O*=X 6H9(]@ @@+a|d2PBEuDE:<>@!N:L|04PaHx(P a)H a* u $rLc>_ ,χ&3P0x^ּ~Q̮p'9}{`}"ZRp,_ ܍`麗DKuǞ9Vmp|Gt بo^~'?` ?U^ŚUV]~VXe͞EVZd=W\u[{b髆ؿsYAX_?6)y^bLrj$HR' !yꋨavsUs]pGnoxz7agуp8g!OaK1[tAޙ Rzѣ%2ZmjA0B 'B +C 7C믽aB Ι"}lEk(qGe,\J@$ʝQ,Er1:)*NJ|tgG˲a)& liǟ/sRG<"/7bG:*rKtDHFw'yNqr Y# @TSOE5UUWeCW_5ַBE (ZDyzt̸vlGߨtEjXDÏL#Hsr**J& y4epFU `'-mKG1xlRưdTsJKS,ҟBJ)(@"[A*VOF9eWfBY_9fJHĿH(ELxw1Z^L::J\EMNIZcvhd!63ْ+R-Z /YT ;^U2j$ m3 @h?hdڒn9qgqe'qv d;H"*&l;~p6NkW?)6WÔ&ljsG;3cBڟ& b72UQ{/a eІp܌?j_ ȮEYK B I+7@/IVC",0Jp>eê`".hP@@,e)؛a 9HB冇!*Cqe941nҒiY!Ҥ"Kvғ!"E)9F\YbJҕdғ|JZҖe.afJFReŠ*o9̯pDf2ϢKfƊ9/#:eVӘf6fvUϴt"+$$g*'BMoӝg<9Oz.WEfҙOXtP6ԡWN 9ڡuiHE:RTէIGYQt- )[̩|s,4JuSԧD>?Ә/FѻdԥFQhFGNƔCM7$VxC͙Rցro}MKEZֹ8PE2JмERJX k^ҀN8\5SnVukRkYue[gU"+nU,[7ƒ}cR^AͩgKY uEjAWfvMazXԾ}jU{چvmfsbXJ֣5nz[\rZ#:^7Z*f;,Ս.cZh |`wͯiq]]g3{Ă׵M`^ߖ%{zU]mTլDկnk:ƺ5'W[56+\;!?fb=oG3\Z)E/}#կMFqY1Ekb\wĈű 9*VR_s.9F} 27rdvt\TgwJ+ `J05VsY;:.}stL|61yA-h6ҷ!q}Rc--:(_\:2ZWC.fC3Ϯz|CxÑ6[][f6w?+ a?u܈rVl$hP`PvOkkZf;mږִ* 2ihC=/m_595 ߎ[cϰ(qV9b/#qȇȑOrn;oqƙg>?}Ͽ>2N!!'y76S5Q4ë7 |?s9*¿Dr =yX 1 $=`XKs@ǫyU˳TBK)kukAy*B@J+D0)13A*z%D5|4̋aY1}1,29Dڱ ˜a?4ïKD%?7|CsB㥀'2>[1ʆyy8M;=2Q=%;-rDGL]CJCMP|_FE\EpŹ+>EU hr[++B hF-iqjk@)@*Agpf$yGG3GGCGS:gBd 6cxl EhdEl0 H<3Cޣ?[H=4AlXl(EG&#+J2_ܽݲjIċRGbC=O,#GɻjM#I1H{JJ&슡IF6-Q-AZ AM^UF dc[()n<|#=_% d;7C `cNN{N;tl|Fh lC4 RkҬΥ^>Ke&ѾGg*fP:&j6&vl&nC`e fvn^~fnXenn/eKk鑲:Ԇ[5V/0c.E L`>&)N/6ViFJl W?FbDc50SpIE'HWJIjyE>nbUqlZZu_s&c3S S-=K=ںeMqDg)GV8&LV؇=2 W >3r]\1^\'r#@3g:!s+_D-s*)L;X,?2d}垵r27RJs]~E&xu[(t8N(rAsvE<4^Y_!gjᴎ^.EM=-[ۻvS1i-LLl.Momcѽra3wuq_O|P\]0oqpM9X^v݄]qjUZh}ٿpi?皛@ON.9G $wT>tv_?.\v1vffC\=NߛV)1N5zSZRtOwvpY.r"ANnպs/mtzGxsuJc:``ZUy 37L5r8USx^h뤼m[F]SW;\u|? __Y&{Ώxm{)hF6Dbg!6說;tX6qzxdĒ [vr&M udɑ.U94'ҤJR$ʑ)ԨRRU*֬ZWϡAeƤV&ϕ+2TkmXd%;,Z*ےݢ`YLӺETm 7dO؜_zN YӲl/ eت:-=6Q`^I\Mt֊I2;Ρ1[yTjQ1jlzRtpHoξ|䵤?6 /dcH!^]~5iƟnRjao^w Iӽsi"qV} GY>}\G!h,v#f9݈̅wЁwk%h_9(ah_w`y睔m^z 'uNaٹ'1g{:(z( hr&(KٛZ z):jnH꥓V):٪l:+jLfp:L`*,2V]z-j-z-;.{.骻.J;-XY.{///rgz0 +0 ;0/:032k1{1R |2)2-<2%25|39C s3A =4Eʳ24M;4HIP[}5Yk$Za=6Pw=36m= u}7t7 ޅN+۷ڌK>9m;>W97}y>:饻 \:;'ꑪ~{ky;<+3S>髿>>??4_???(o< *| R`K& r C(&!(!F<"%2N|"()RV"-r^"(1f<#Ө5n|#(9ұv#=~# )A<$"E2|$$#)IR$&3Mr$(C)Q<%*SU|%,c)YҲ%.s]򲗾%0)a<&2e2|&4)iRּ&6mr&8)q<':өu|'<)yҳ'>}'@*Ё=(BЅ2}(D#*щR(F3эr(HC*ґ&=)JSҕ.})Lc*әҴ6)Nsӝ>)P*ԡF=*Rԥ2N}*T*թRV*Vխr^*X*ֱf=+ZӪֵn}+\*׹ҵv+^׽~+`+=,b2},d#+R,f3r,hC+ђ=-jSղ}-lc+Ҷ-ns򶷾-p+=.r2}.t+Rֽ.vr.x+񒷼=/zӫ}/|+ҷ/~/,>03~0#, S03 s0C,Ė&>1S.~1c,Ӹ61s>1,!F>2%3NVn6Eg?Hi&j =q}e(A : 'AU2@%syj'C0͑LZ\>@z`zW?f*ќTi=|D 'twl- > 瘧䬰&UJ@J:ٓ:N9@-Z`2μWγ}b,7&14 B|y22t:3/OJFe Wq#;ѹ&W,\F ԋ7ʭD+1ިi9v;4C~ӦirD~=̓v=E|γ2]DNcaoO 6 ;K6D<:3F&-PW@ $@W/t:iWu.^QpIqNP蠓4D.;N[LŘ'N 2/ob{9}cD!/_I5K_1 Vd Ӊ"f[4:U $^ 8:9'l`$Hi_q >n"ig WCc.H 7 0v; )`PF(+-c! Wpm-F\ؑьSܢF&8#a \Pc_$:ձJȶ5c 1=)r,&WR-4뤍;=N JK]eb pfG% @O|`*Ee _Bx@"6\I#uYR!PK_)(qt eqR\rB͌&Cg޹xK k..lH6MC p> #FL%0'HON u@!L@0#ck#ʌ* xڼ=#Γ7'?LSa2 L@#'΁HG?H4>hgN֚}`.yFC!4%pn0݋xz"4#lP֍l!&@jfD,QDK2dU[VyJ l K m`*mq:#(CԡfD'G@Z ȞЉ칎#b1tAT^1/Co837oETA Y߽X-gGfQ:h<M5-~ЋTW|]!Gb~ 'SwlP0H~t 8_jDŐ3d9A|``!, lezY"mH;*%sF0T~8cW72k#o'O*3?6*`2`<`9Z㺥Msz U,ATIidlu>~욤4d&ahr">\t~wcNЦ8PdP Kr0NP Mdn|u!$u83*)p@DU$H~..0+h>o5of ]8_!#&4j ? I Cv0P GvAۇLu7}'`k y'tчhqYgB= \\ Հ}e40V8 ` @B (`gAJGL'4@im .Iu Yw)jP6}wQs4/r] ! 6x4L`C* N0 vޥyp &O:Yvq+uƥ!wIbd" XbGrp3:yww*rSE @ !qAlm[p~@+@6~3 G% rO!*&(vG1夙1 ЎXBCg5`vLVs&~'أ)g`KyeNXt&xAeauW(lj x8trL[0 G?T:Q,9!|v% cXyB=hBqT Lv%)D1(?9#C`It+PfQ OR8&i>l,|pYԂy1`U/1ѣ5xfQ9Hxv"^s4{()hc@ Nr 4b'oU::_:IA"!Ah6/b1c/8 7fQLri'aQ4 Ejiܒ4<5rZ)Iw73Z*Pu*&9(R@qq k zj8h b:ib8~)'8 z@ũ!r7QSrj jæ B6 1ojrU6"3*F@4pu9;~C-P1q!841 =vcI|~"Y(/ۚ"ţ'G?AMЄ Q>Ϣro"G篱`\@qSASkJX!DKP= _2g z%+ )%qb1iC-">i2K/ h0BW^ НǵAѪ1 ;P2a'2qyKo/Ya;![w{`'{ !T+'Jṗ$2ļ༒!W'a )M!O$!*#@,pk[Puų B#uU@ ;';ߢEKڗ"Ƌjt1q`1bO P0,B“q>R# (  Z.|M,F6H_A##_)ݩqJA. f;w0,4 *i'q Y`A.ƻG-P.5(ȕFUr ڳ[Y 0c2 L_\?.&I 9aoҐ u6H R#?w!G4Y8 \cf eTό9,}bGVܲ ެ24=PI1VAG -h;^zGA&-M)Fa+,. ӷ4 =޼̀SDs{)>|*0F(-HB5 1  rPG]p!Ҷ@%1+ MWb p-vgFI`k}4؂A?| s- `(M}&Eҏa*k+Q jҌ ܴ=,&:B>?6My,a *' {q].cU\3 ѭOLP" #| #m FR1a _(R+!}Iv "b*2I $'~%*.0/n%2"n !CQ,=w͎<-N+o 83B i퓬 #^MA./AcQ cY) D0筳>v^ +n j45w~ 8i NP !!BKA p~扂0%1CA` cM ݾGY~ + N^nd1Ё ᗡ9w+:#.8NfݗtQ۾. !|[UvB+.??_ ?_| "?$_&(?|#)"ȭ# ``2A c._8)z R~@]U^OLOjOX_iA G?a_-zzqg{;_SO=/!%mpF@K @w JR%.;:OLQ?şʿf؟[?_?_o^ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEeΛ'RM>UTU^ŚUV]~VXe͞EVZmݾW\k}kq FXbƍ?Ydʕ-gPխ_g Aؽxx͟G^zݿ N9ǟel/@WRI%Rx@!T/0C 7C?1Dɔ1#EW|N>Y1F` Pc7rG!hd;oR@G' tJ+JXJ/\#G˄L5KLd3ο(j+Ƀd3GC9ާ?-!HBIPQ! ,qc72J-DB+aT_@b\Dx+{r  RdڢAKPxR"?d{h2?@BVIx`FG׹j1V©S}kLFj>v6rt f+H?%&W ]@I4Iw'qB)B>(th?‰ ?8omHT)j)UφIttT!GǀJusӘ J5pOV]B:֊JO~"A~\Vf %Fw+=dTj9bDH%ɺXYe@iLM }29ɕ5 q^K$!m*]*n&[8mA-2ֶ-*jʂ(LLKK|;^“)BI=g+¸V R3o;֕AvZZYw٥sGp]CthE搒{2Թ˭EGvT73-y'ڽO{\7%:[*/awqEt=hBЇFthF7ф^hJptQiN˝uE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5dÒ6t789:;<=>?@A$B4CD<.EXFID[LJAMD!@IPk#MALĂ@4U BS7@XALaQ_98a$b4c#qEL! ,W! ,O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуNs>*kÃbŴ"Ը LX)d\ UV U3]0É7~2hϦXr\sbVd/&W]b*bcQzSDMenj X+Ey ^<ƎKU7ѫ{q(dÁf@$ËE4M3dKvGe.gRtMaIx~XSɇxYm9UD_(b7#A5H=בSW]%Ѐ]@:/MFDʄ"ZSfĜ^4$G=_đIgINz?æyvgj7>#Ѡ~Z EɰΗ@ )fnEN; Dj㌤B3Pr |ެ|s({@.[hz٪i`Λ'-hZkzDQ@r ;X.D8*Aj4gy::vĥ& ҋ@c 6V:I,~sKQ{TK)@n+И!cE(c^E1oCO QQlutoH;56?k+?^@erIoLtwKk5zXܑcFx|7es\d8G/{M8sxaG&u5׎EN A{9Ak_wDhd};HT]mrI4piuo(2 tMGZg_ic ,!G/]?Z{?&+!&Bqy W= }^ %0ot7U& 2 O]DI(}X.z9UA>fp$ӟ <`RBjDys!Ax3TDHq$TKE~qޣaS $EЇ-Y\Hd~i'Џv]x`iA]p?Fm7th`B O0ѩ7Y$Q#t ,)f]yIۼCsH>@JZĖl.KU D&I"t+cVKCh3DNMc3V`^C<H2t_5ji0&s33$ D$f!-iCݹU?'6~zkp,NW L3]FS7KDoHe ]޳>1N@tMW (Vk7`h3i, WH& {\{lI|r}w0djwFa l` 6b+ĺ-% &+mjdJf|^-K$+=8u$53\]"Q7mnhȼ&e0ջzQ̐`H; ] e3 .`Hx]iU(;$("vQjgEzNd^ך#9y k?U_@.\~[AL$SeL#3b|Hivk}1 d!<Ǖ@}F"]f*Й ȱ}>Y S ıA{`4m|J DW|~ 5([qi?V[]8рFiT3}z"q_ztmAF5I h.x2'&q81LhTA@FXK pFah dq }7PF(X[FW{78qBma\'~EefU I fm|q60@IKhoZ@P(xX(fp[z":_u6I="4Sx#8WT%rkyR H1Uhi2l&! Drq10(`'0cAu!F !P%pr_Uhpl}1p WO:I_zJ1 +C(B`@I>'N5~ah(P6E1 "  $&ilX—Iq6 o,4cvP&ė7udqs0`P&pi(bTsI8F&9 ٨N Fv"  |0H0 !14ihtqaI!il&&~30&x@ (Ip(@*jq)D"v*Q%4wʅ&oaY;0sBI7i@)$J&  e<aʡdtFd8be!=S=( J7C j1L E0&iP)t<*(6N/0_vIEgh "4: XNM Tys^aCޕGvHM9!O7 y .C&v8Qx|lJ%qY1cva(6 :vJp`PM'Qecvl~ƪ tj^R:Zs亰aAܒ6hb4!@3 Knl_ڱ Phh& !` @QqA I(7ӊIcy p6;N֠PE{2(CRDxXJ84SQq c JQ@Fb_ )4з5H UqbJ[MOZcHm &|'7ɾ 4Nq“t, c1 p PGB5 %L̄:-TY5L$('AF\'~CcY\3,™>|#(Š% @;@$&1!.Tɴ!Aa V!2,dɘ=]<1:VlB!a& }n7qy `dVMIQBp*>"Bʱx%14*&V@ь6|E}F1,  T lSTxf"Qa48ӳ~5Q9vsN lEʃ+ m( -1}^!#L q tyQ#&G4N#(='bXmn!'Q_+gjEC3-lK 6BQӑ0`D!7/ ؼe @A*Mq`F@uK #p @}6.R  0)=و9l٘WٿD1p3{}׾|Z Z!qٷqPBw&@q$!]@ <~#JA{ q1yPPE 'ם\&!aEJ 2Fq%  =Cv# q*}MHjQX"SR !n ~$F!+!@!+` =]";R޴NQQ }?$B.@`- 2L~Ra8-Q <OTX.Z8F <1o2&&Q^ UߐV% O.{E~"8֑ b6z.{;1~v灮?E4~hJ΂a$(!  -!Ow3:,!_KA ]̎+ΞvkJr, xp=Ut X7 0n@F/@. \(anEQS ao/*2F-1בp uLuE'QN,%ZQ'4A/1"W>"J/$$S_XZ\^`b?d_fhjl?Lpr?rOtxz|v~y_gf_tOŏ?;ס-^<D?T=9q{m 0ށ?6Ra,mOΏ_xM m kn"O<ɿ??> /˯@@ DPBC,h0U"^ĘQF=~ 0 H%MnUjP.Q`u[;~TkX--VZCѶ-IJW; h^'ʜVW} uYbƍ?Ydʕ-_ƜYfΝ=Zm,ҥIFZj֭;6ZlڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^x+^zݿ_|C;~0@$@D0AdAy&/0COC?1DG$DOWdq>rEg$!'tF,r:\(Gw2I%B 5rgI)$.ʁٱG*pL3gL5dM7߄3N9y243ϴO>4PRIWLPEPCe4RI'RK/4ӒH 145ԄSTSk6RS_m qgdV]EֈdWau`cXeDYtdUe=gUFq*C}.g \ؙra@: $ŖqB!#(~F1;svD\҅EyYq3( vUoder&^2&YFFU y|J] 9"BZ Zɢ`An=CGrI#'v&)RڠyA-ȅ \*bǔ.a+w|=hdc̭[K |!hr:Gv)77|}~≧/v8{7PVh9־$~#, Һ$vpہ/HfaS $ވ`g%Q'y$a K@l\HRƣM1~RwZzU -< lb`} Pam#G F}i?Bh90 ) yƬ Okl_PAŌ5ϊRZB@J h*'yC 8ɸ6!Z_1:B u{ʁw9(@?&iX 9'DHmK_l6ccQWA;7B$W@!V.VG i!,\Hˠ貈4X7u-LuܿYfn&4.taI{hkH3d2i:z'BFq" bԁ\(OIIm_H?g.`͈4]!mE i'DUu!GKiAS$HX ?t\ڔ ?ys e͘O5:& u X1r1ȡU*5 I!Ub \Vөզ$xUk]s5XJqTj5[шei8,Z*t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+ڈI8,\1O1\D?R0CS H &!89d :4=VI @x LZCbJd&JkE><yejwzD %,CSW 4=CO"+h"(U;dЦ?؎@47ن7otoʹdL9PO;#~ L@`20ݛ˶+Y\QyAI/P?jL-DyC̔?B7LЎ8C9seH[<6LD;ѷi~zc7mDhld3j,ћBs@ɘE7-PJyjmGV_֌WLd{L .ъ:EWk..0w&PW7ʮH3%bJ^pE*hݽ{G$& 񮽅\L^/>|GȓSo?aƒ6Q|qӞR3I2 בi>c$ >buɟ>Ad%!1_; AB#H+8LS6xdBe,$y .&xͫגGDc90₠\o'Go\Af~&GjH!uq @&j @)P6GXYΐ"NZ'F+PUc("D֧"E(L'` hD]N.Nu 1+6#\B4l} K6;9$Sr@R?¥M#Phv#@V7)#(3#[4ۛw ]"36u 2eH /4̈7I ủX$gZ@#T3N8{\ĂGpw"gl-FnK.P5vBJNЁ /(Jh#tFjf-Ϻe,_1{H1n+!3qBXԔYv߉43]Ea nĩ,c4ǂc vhQ7>7P6mC13"FͤpC͆(x9(X,sI'S6E(7hpnpbLK1t觋z+@ Q)h89@t* Wp(Nr3x8%> CU#qIqJ 0Q!Htw_+n59C` ` Fр{o @dY\Z5Y( s@1MNh`; { ^F~QW\KvCxQ-ZX7FV~|Pv%͙5Wb:eCT9A R-^U # jqSsN+q1"b#@:l(퓺䑸O\ E1  r^/r([uxE+Z++kL{ջ{X!]AkS0J+BIPjA:#jtʻ2X0A }+Q-Zckl?A;2^1 slT!%<;QC#0u1APa1ljP 1۝a.AS;'LLC,L$Bg|7 ^\?硿@y_k@ `E :S]`=Q '0a8X$" 4s0klI1B+4,1I׼̑*rƔta :RB0_}La :@<*K M5v5ThKYI2B ɭe˘MJYq ![$tK8a[.^ 0T3<$u?+- 4@ >0s IFB)J-p Ǭm: 8=a>:H* 'I E 10׃'{q R]؇=( wLoq=1Fj] --2 1-L4Q bD;8QGS!͔0 Hf9!/B !YOTR\@ [S1Bd^?g3J`WZg>{ Wn*FhznQ.ʹIA h(*R` zIT Ҁ1ЪqE% #CQꛃͤ'ἐz^U Ī.,߰}-ԁ-%!K}Ppx;b* &7պ>^~E?_~ ?_~}e oO!q9Pӻ5m`-@.*;"O<;_並ǴCLN@f?VQUtjA af+CWg&p6`s]q\}O~ mp9O~ 06W 93ok'A O8_Iqo¯{ȟQ?_؟ڿ?_A?_&Z"@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>eq 4&UV]~기e͞EVZmݾW\uś}sFXbΑ]x+3ƜYf CV82eʜMFZ@"ӀZlڵ#h8m޽}9G|di͝?]tխ_Ǟ58s^xٲ&gziz*UR^ǟ_R/@$@D0Ad01#  # /lC'D "+J p1q_l P#7qRcGlA?GI R??lyKR ,K3ϤwD0"sK4s35ٔ2!&:TL7 9Ssr)g&@RR@7FaEy DB!$ 1TSNiOC}II$G(,h-Æ4Xm񪦚y }HNgS v*VQ(iw&Gb*!2 s}_ ]reт(G"p'T ]lXE8GUiՖ|fDE``()h/"8C!AH+FE8^-D%;9m`mvZvs&gJ!bsQ(aPDnRW86zb[r٥pU&Z!}"ghv8r-7i2cXO8X]_g Z\ȟUAL TInf-f.fTuLnvᒒq!BRy$1VIxYb gZu :fU Y"ʋG lN @UP%ڱ.2@ N1QTk Ֆ&*$ K>4BxaJ8ãl0"pD 8Ij&$Hd~r B"-Avp 멋HB4I! O N*mrt'ѤH0#hF.BP%Ućio臺9FF&HD PwX{I >f!v Q2݀Eǃbʱr Ex5IO"KxGhTp;r` dh (},RMR$'JxRһd b&1s0$;r,QrL #/9yx>(͓C2<;c\G̃*,H*0CU@7S <F)iOT>e uylS"ȉVNG4_픤hYq q`LSp3gUv:*5qlTy*TCSUgaMTw5)\UYKDNE*Wޕ"^Wa׸J jC)P5Atx%9Q8CiVCִ2)c'Ǚʤ*BZڅDv K\/[ҵi6lirt=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,0O@i-1T0\G !pC29C] \L4l=C惃;`C=̐@?dF88pHIDT#(D6 ! ,O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =4A 5+LJM&PkbT^-"uybc *Eh :۴3AM v1WI Q0pLW<=heR-NzH{}5\` T@eۏ?# 4N0DGQ2 4@VQ.~ۨ>}W%a#SdE(ys'B4'p, ?o$H4CЕe+A Ґ5`N_t)A&D0tN[ۻd+FVE2G0FIo7wQ{w_w ,uE3N nQwW8HdST<9M1 8AuC,A ѹv,Μ Y;DWZ~Qȉ"2 <{^QnU[j4W@H/?G/]?G<γHG%i,.( IgAGHr>O ph&i"Ȕ07?NH b"IVj0g0aFvP$vF98Ddy !i(הSꮓq+a9A8 mGNvVЙpfdl4x<0 d )|H5sMR1,A7A9A >PzR`JPS@T=d)72 dq DRP A˧ trrwCjP"3O`*!bDZ̐P1Q)+CTPJ9 ʲP"e@hSS S''^3Ta‰DU4պH@?Ɓt/=2M Ӄ@׎8MVw*V6р4b@pLsUf  D+gcُteW$I*GL_+5R$@BzQjk`k) a࣑ #(P:_f $k#r34B̘ ٴh |PH62$+nG~q򩐴TpyG_W @Z4Nk{rdPYMZ]pד)xKUȒj7~c"mPƸA2YMtBR +\+C^hT-EG"3)q"_ar"c6Hm[j[Q̏sdc&pc"n)ԡ"0 .8w}E9NzDi;Th@>"Hdn({==?IsS hmS$A^ |6wR'/`[nPC]HY7;Oh*[ YOFcj>= 8ly<&fDiqE!#Mh1L~ߺRtzNGزNs!>r w'_/Fp)1cssukQ'V3 g'T~F|# G4n`gp!rhth1۱7WjHeu6`&sІէi!#x^VqEw/{ӱ`s @w2hc0 0 q*0uhh%BXtk`(~Iщ81X<`A{P!Dk!G4Txx 40Nf[h&X"w~I1 'w2&N grNQh0r\(To8 zp7`ڰ`Td(("#G%:to!)?aVCW|PG c,2 77yQ1P2  7x Y;i]%'>P u N1W;(| }iy3n@\Hד5|xsW} iWp%I? %=CUG$@ Q 6pl qWVqhҚ2#,9&mAORwCyn#dvGi:?q&ZM&Cy*%jRQi@'ӟyL E0z| 7 &1` Z 6#(a&J*Tl8=Hiz^Ƒ)Xqumgu bѤl9&Fq|@k^I萆Y:/6L6 EIVap`oɸmXTQh:9F'(3&yYgM!=9y u KZ3F6pDƅ$a(ĐsF@@_|PH#է1 Q(L&o^TA ?{>7JO ("I%!_8H$::Y(sStQy1*e58rH!0& fPGHh!yͳ,1W̓m6,ykVHQlßa>ӲA %vW;}ǯJ~ j: S'O6";ZFAcΔ6BFi 0 9p9aFU2r7E8A0//3mȰ$0k>2w1'C <4R" H:+5Maڰ \8pP;)*^!6GEAF=m0]6 N;-(b_SbJ WҘ.ǡG=Ic Н\`4Dr74iO|!"Ap@ .Z9dt D( F8UC}*x܀RO] j@ -)-S-d0=Qړ* UPQښ@*D=HÝJљ R!`t@C6OJ80͌Pf/aP[-P BReٟ-үpݘ$-rຝ yK >) F]$Af xf#Փ-pxVar0F* D 3^4(ɽQ"kѤaQq^Z.=#Rqr'!_<f+X h0q=Sjۡ7pQN }N*.@aǑ萑{5M?W NٛDR҈n%tBP~@qq$meF|=~~o^Ip 9c7A`"",&p:¤^p-=?_ "?$Gi%*,(02?048:6>@= /uLOGo ǡ c kOO^j!=P"`j=~0Ak?X?u vKGaU i?hoU Pm;G mpz`,zToS v<;|M. ??oM B_mm. ؿ5I۱fW1?_L f;AC@@ DPB >QD-^ĘQF=~RH%MDRJ-]S&X5m֜SN=}TPo,TRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`… FXb1Ydʕ-_ƜYfΝ==wgҥMFZj֭][lڵmƝ[wAXlpť m\r͝?]tTǞ]Drm>; ǝxe; |y~@500AK;/ '3+0C 7C?Q9F0DOl WTE_,T^y%Tl1GFo1H!$H#D2`R b 1`јRI- ElGLͱ 8g 5h4;O7qaPRPK/(4 QL?!?S 5UU7h8tUYW-U XQFFq|h }qȱ*Jb'yaf]Fx{4Wm'"Vd!2Cnj9n'у%=v[yFAB :6w%h}s@pCz t~͈vU;GQaC7nXC_rdrWi;ނXH1KW_]X䬗ќGZ8^yy/!kV~Hv]bh}&@xSQ兜9^n% g ZfGҭpY"PCnJ0_a^{&YtVw]!/Yae(႒3Љ *? ºn-`193Q 6(4ZrE2h-Z9`(ςǔ&AFdnZtPRcmmZ?ɵP"3iv4T$ 6}&Ic cQ:5SjbQaL=ƔЪ:\TIdKDuw5]XbB1*a= 茉Ν"*uT2ĩt>FݔAMd}ecZҏv|'6[ΕKu]%rز^E>9P "YT Rǖ> -ֵIk>Z qmnS)ַnp;\׸Enr\6׹υnt;]V׺nv]mw;^׼ R^׽:E;߻+o~cQip<`V*%pr_7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt 7@%@#>R>  ؏t#[>A䛁8 {%=CBKH"T'Y(*+1 ! ,W! ,O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJNSJdJJfWBKݘEk,+Uʕ,G<ڐ_O,db/Gx!ξS EUp *Z*.]C$y"I/@q |@Y߈]vR'ys߭|%6O{:׋wcBBP_J4P+q-]}g 4LHхn'@}A4{ŧQiӇ_u"L̈ӋIߍ\t U@BF?Dui#L3r@]JO3OE@j_N8fgRm)P>g?Hi&j =q}e(A : 'AU2@%syj'C0͑LZ\>@z`zW?f*ќTi=|D 'twl- > 瘧䬰&UJ@J:ٓ:N9@-Z`2μWγ}b,7&14 B|y22t:3/OJFe Wq#;ѹ&W,\F ԋ7ʭD+1ިi9v;4C~ӦirD~=̓v=E|γ2]DNcaoO 6 ;K6D<:3F&-PW@ $@W/t:iWu.^QpIqNP蠓4D.;N[LŘ'N 2/ob{9}cD!/_I5K_1 Vd Ӊ"f[4:U $^ 8:9'l`$Hi_q >n"ig WCc.H 7 0v; )`PF(+-c! Wpm-F\ؑьSܢF&8#a \Pc_$:ձJȶ5c 1=)r,&WR-4뤍;=N JK]eb pfG% @O|`*Ee _Bx@"6\I#uYR!PK_)(qt eqR\rB͌&Cg޹xK k..lH6MC p> #FL%0'HON u@!L@0#ck#ʌ* xڼ=#Γ7'?LSa2 L@#'΁HG?H4>hgN֚}`.yFC!4%pn0݋xz"4#lP֍l!&@jfD,QDK2dU[VyJ l K m`*mq:#(CԡfD'G@Z ȞЉ칎#b1tAT^1/Co837oETA Y߽X-gGfQ:h<M5-~ЋTW|]!Gb~ 'SwlP0H~t 8_jDŐ3d9A|``!, lezY"mH;*%sF0T~8cW72k#o'O*3?6*`2`<`9Z㺥Msz U,ATIidlu>~욤4d&ahr">\t~wcNЦ8PdP Kr0NP Mdn|u!$u83*)p@DU$H~..0+h>o5of ]8_!#&4j ? I Cv0P GvAۇLu7}'`k y'tчhqYgB= \\ Հ}e40V8 ` @B (`gAJGL'4@im .Iu Yw)jP6}wQs4/r] ! 6x4L`C* N0 vޥyp &O:Yvq+uƥ!wIbd" XbGrp3:yww*rSE @ !qAlm[p~@+@6~3 G% rO!*&(vG1夙1 ЎXBCg5`vLVs&~'أ)g`KyeNXt&xAeauW(lj x8trL[0 G?T:Q,9!|v% cXyB=hBqT Lv%)D1(?9#C`It+PfQ OR8&i>l,|pYԂy1`U/1ѣ5xfQ9Hxv"^s4{()hc@ Nr 4b'oU::_:IA"!Ah6/b1c/8 7fQLri'aQ4 Ejiܒ4<5rZ)Iw73Z*Pu*&9(R@qq k zj8h b:ib8~)'8 z@ũ!r7QSrj jæ B6 1ojrU6"3*F@4pu9;~C-P1q!841 =vcI|~"Y(/ۚ"ţ'G?AMЄ Q>Ϣro"G篱`\@qSASkJX!DKP= _2g z%+ )%qb1iC-">i2K/ h0BW^ НǵAѪ1 ;P2a'2qyKo/Ya;![w{`'{ !T+'Jṗ$2ļ༒!W'a )M!O$!*#@,pk[Puų B#uU@ ;';ߢEKڗ"Ƌjt1q`1bO P0,B“q>R# (  Z.|M,F6H_A##_)ݩqJA. f;w0,4 *i'q Y`A.ƻG-P.5(ȕFUr ڳ[Y 0c2 L_\?.&I 9aoҐ u6H R#?w!G4Y8 \cf eTό9,}bGVܲ ެ24=PI1VAG -h;^zGA&-M)Fa+,. ӷ4 =޼̀SDs{)>|*0F(-HB5 1  rPG]p!Ҷ@%1+ MWb p-vgFI`k}4؂A?| s- `(M}&Eҏa*k+Q jҌ ܴ=,&:B>?6My,a *' {q].cU\3 ѭOLP" #| #m FR1a _(R+!}Iv "b*2I $'~%*.0/n%2"n !CQ,=w͎<-N+o 83B i퓬 #^MA./AcQ cY) D0筳>v^ +n j45w~ 8i NP !!BKA p~扂0%1CA` cM ݾGY~ + N^nd1Ё ᗡ9w+:#.8NfݗtQ۾. !|[UvB+.??_ ?_| "?$_&(?|#)"ȭ# ``2A c._8)z R~@]U^OLOjOX_iA G?a_-zzqg{;_SO=/!%mpF@K @w JR%.;:OLQ?şʿf؟[?_?_o^ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEeΛ'RM>UTU^ŚUV]~VXe͞EVZmݾW\k}kq FXbƍ?Ydʕ-gPխ_g Aؽxx͟G^zݿ N9ǟel/@WRI%Rx@!T/0C 7C?1ٔ ` ED1O4@S1F0H 5{C60e9w.dp2J) ? ).(3̿L(j$iɃ4˂4ΕqE*@N L;=II(Ғ0'!9 RF?jaL+bGr<!} `A(UC5!}!ؓZhHw.8ȟ@]=+a9ؙ#%mz"Er6Z}ZdRUwcb'mv~֙{MH܌)辨؃ )r J9 4}OFїFU&pszWa~EՅx}(.h *9)]ge}e9#BM $i)XeGZb j BgHt8Y%瑤^%gg%Ab-q nY9&&hKup"c~-IHh b g^vf ?t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW>EbB0/bz|T :i5ZwIz>}i*^oAP{^#҉{7pp~?}; ! ,O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуNs>*kÃbŴ"Ը LX)d\ UV U3]0É7~2hϦXr\sbVd/&W]b*bcQzSDMenj X+Ey ^<ƎKU7ѫ{q(dÁf@$ËE4M3dKvGe.gRtMaIx~XSɇxYm9UD_(b7#A5H=בSW]%Ѐ]@:/MFDʄ"ZSfĜ^4$G=_đIgINz?æyvgj7>#Ѡ~Z EɰΗ@ )fnEN; Dj㌤B3Pr |ެ|s({@.[hz٪i`Λ'-hZkzDQ@r ;X.D8*Aj4gy::vĥ& ҋ@c 6V:I,~sKQ{TK)@n+И!cE(c^E1oCO QQlutoH;56?k+?^@erIoLtwKk5zXܑcFx|7es\d8G/{M8sxaG&u5׎EN A{9Ak_wDhd};HT]mrI4piuo(2 tMGZg_ic ,!G/]?Z{?&+!&Bqy W= }^ %0ot7U& 2 O]DI(}X.z9UA>fp$ӟ <`RBjDys!Ax3TDHq$TKE~qޣaS $EЇ-Y\Hd~i'Џv]x`iA]p?Fm7th`B O0ѩ7Y$Q#t ,)f]yIۼCsH>@JZĖl.KU D&I"t+cVKCh3DNMc3V`^C<H2t_5ji0&s33$ D$f!-iCݹU?'6~zkp,NW L3]FS7KDoHe ]޳>1N@tMW (Vk7`h3i, WH& {\{lI|r}w0djwFa l` 6b+ĺ-% &+mjdJf|^-K$+=8u$53\]"Q7mnhȼ&e0ջzQ̐`H; ] e3 .`Hx]iU(;$("vQjgEzNd^ך#9y k?U_@.\~[AL$SeL#3b|Hivk}1 d!<Ǖ@}F"]f*Й ȱ}>Y S ıA{`4m|J DW|~ 5([qi?V[]8рFiT3}z"q_ztmAF5I h.x2'&q81LhTA@FXK pFah dq }7PF(X[FW{78qBma\'~EefU I fm|q60@IKhoZ@P(xX(fp[z":_u6I="4Sx#8WT%rkyR H1Uhi2l&! Drq10(`'0cAu!F !P%pr_Uhpl}1p WO:I_zJ1 +C(B`@I>'N5~ah(P6E1 "  $&ilX—Iq6 o,4cvP&ė7udqs0`P&pi(bTsI8F&9 ٨N Fv"  |0H0 !14ihtqaI!il&&~30&x@ (Ip(@*jq)D"v*Q%4wʅ&oaY;0sBI7i@)$J&  e<aʡdtFd8be!=S=( J7C j1L E0&iP)t<*(6N/0_vIEgh "4: XNM Tys^aCޕGvHM9!O7 y .C&v8Qx|lJ%qY1cva(6 :vJp`PM'Qecvl~ƪ tj^R:Zs亰aAܒ6hb4!@3 Knl_ڱ Phh& !` @QqA I(7ӊIcy p6;N֠PE{2(CRDxXJ84SQq c JQ@Fb_ )4з5H UqbJ[MOZcHm &|'7ɾ 4Nq“t, c1 p PGB5 %L̄:-TY5L$('AF\'~CcY\3,™>|#(Š% @;@$&1!.Tɴ!Aa V!2,dɘ=]<1:VlB!a& }n7qy `dVMIQBp*>"Bʱx%14*&V@ь6|E}F1,  T lSTxf"Qa48ӳ~5Q9vsN lEʃ+ m( -1}^!#L q tyQ#&G4N#(='bXmn!'Q_+gjEC3-lK 6BQӑ0`D!7/ ؼe @A*Mq`F@uK #p @}6.R  0)=و9l٘WٿD1p3{}׾|Z Z!qٷqPBw&@q$!]@ <~#JA{ q1yPPE 'ם\&!aEJ 2Fq%  =Cv# q*}MHjQX"SR !n ~$F!+!@!+` =]";R޴NQQ }?$B.@`- 2L~Ra8-Q <OTX.Z8F <1o2&&Q^ UߐV% O.{E~"8֑ b6z.{;1~v灮?E4~hJ΂a$(!  -!Ow3:,!_KA ]̎+ΞvkJr, xp=Ut X7 0n@F/@. \(anEQS ao/*2F-1בp uLuE'QN,%ZQ'4A/1"W>"J/$$S_XZ\^`b?d_fhjl?Lpr?rOtxz|v~y_gf_tOŏ?;ס-^<D?T=9q{m 0ށ?6Ra,mOΏ_xM m kn"O<ɿ??> /˯@@ DPBC,h0U"^ĘQF=~ 0 H%MnUjP.Q`u[;~TkX--VZCѶ-IJW; h^'ʜVW} uYbƍ?Ydʕ-_ƜYfΝ=Zm,ҥIFZj֭;6ZlڵmƝ[n޽}\pōG\r͝?/Fti_Ǟ]vݽR̟G/8zϼs'\ǟ_?yo/@lOC@ds@0'Ĉ< 70<G$@ DWd/3l1Fgi1G9  D9gzqqr) `, H-r}tz9*ôr #մ@375=RrSs94p`OjPO0,2q#TS54 rȁ'dUL/OYg-с!1SiyƉrUDԔ,L9uNy8U93~5Lo]V i%\А4HDx48`1Kv㨴G(]*+.=GCM$ lߠS @\ %d@US!#\x EGA:Da@TH <12c$MCR?t d^ eT3'`.WTP#RdX)t9<0ci 'hcv8[oDsR[q`"`@XԁC["wDQwg G*aprpbh'b?6hs?{Bg;EY q֧QmgaJ"M's0%Ym wpEaeNs![7A 2ERTqF  bbir`X;0q$ dX Ўqlp}GDB"TЉO @ X[ |5`nq0bo`1e@ ~ڰUZgD$I"%9ɗH1I:8Kpq { 3x@|2(hPPNhU @>HDSDIf6#L'\TVַ-&JU:T:FRZ&HWEjTIrT&dM TUP5\kXUլg818o}V֕&35Bpҋ⏯vlX0ֱt?NRs3zSYBmhE;ZҒdhC+mjGZF`#MƲ@ⳭnMh+YCN1׹.Bؑ܃!GEH#R,bOAG2 B9Ž-U)#"Ϭ /_xrHlo·ąo3HB oyH80)h8Nw! D  J{DݑW 0R2ax gb WE<);C_ApxyhYBNI&-M0Lrk^t#R>4 _"oILg$ 眓݀΀3+*@}b&o[6rx(hR%4Z ۂ. ΂ACۣE1 xۃ0 nMhXU鎨 b 8=7͗v47ךu `,gd6O^_pЎp <L++䵎h R< aqIlP,,PH@L$vF s#|tݟ:9]4C`HޓNRr"Fl$xvDxtۋHdArOWw맛K%J9Bx<z<#n04K]݋`ĺjh>{w9MDﺛ EYRdOm߱Bgz?$PZ`!\>d't/#;>{ŏ3]#~Xķ%xY=z?!HAԗVsso~_#KKFx`Cӈdؿ# @ B@-4A;dt !$"4#D$T%d&tf»'*+,7=-/Cj 2=3T5dC9i89:\1 y= =?@A$B4CDDTEdFtGHIJt*PKDXNŏP$E+SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklmnopq$r4sDtTudvtwxyz{|}~Ȁȁ$Ȃ4ȃDȄTȅdȆtȇȈȉȊȌȍȎȏɐɑ$ɒ4ɓDɔTɕdɖtɗɘəɚɛɜɝɞɟʠʡ$ʢ4ʣDʤTʥdʦtʧʨʩʪʫʬʭʮʯ˰˱$˲4˳D˴T˵d˶t˷˸˹˺˻˼˽˾˿$4DTdtDŽȔɤʴ$4DTdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4UӉ5e6u789:;<=>?@A%ˆ#T1FMG˧BQŘTP HNTV܉T,Iј0--@MU5 K[Չ|\^_-D1݉! ,O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ETtUDV̪6fκx]YsRku/Ng4xbIbpDyt +DsLu,]]J.X-DY#¯NnYWrr9{1tqfz5cؓkgIчy|E/=P.~i }GPKؗ`RQg 4bJd&JkE><yejwzD %,CSW 4=CO"+h"(U;dЦ?؎@47ن7otoʹdL9PO;#~ L@`20ݛ˶+Y\QyAI/P?jL-DyC̔?B7LЎ8C9seH[<6LD;ѷi~zc7mDhld3j,ћBs@ɘE7-PJyjmGV_֌WLd{L .ъ:EWk..0w&PW7ʮH3%bJ^pE*hݽ{G$& 񮽅\L^/>|GȓSo?aƒ6Q|qӞR3I2 בi>c$ >buɟ>Ad%!1_; AB#H+8LS6xdBe,$y .&xͫגGDc90₠\o'Go\Af~&GjH!uq @&j @)P6GXYΐ"NZ'F+PUc("D֧"E(L'` hD]N.Nu 1+6#\B4l} K6;9$Sr@R?¥M#Phv#@V7)#(3#[4ۛw ]"36u 2eH /4̈7I ủX$gZ@#T3N8{\ĂGpw"gl-FnK.P5vBJNЁ /(Jh#tFjf-Ϻe,_1{H1n+!3qBXԔYv߉43]Ea nĩ,c4ǂc vhQ7>7P6mC13"FͤpC͆(x9(X,sI'S6E(7hpnpbLK1t觋z+@ Q)h89@t* Wp(Nr3x8%> CU#qIqJ 0Q!Htw_+n59C` ` Fр{o @dY\Z5Y( s@1MNh`; { ^F~QW\KvCxQ-ZX7FV~|Pv%͙5Wb:eCT9A R-^U # jqSsN+q1"b#@:l(퓺䑸O\ E1  r^/r([uxE+Z++kL{ջ{X!]AkS0J+BIPjA:#jtʻ2X0A }+Q-Zckl?A;2^1 slT!%<;QC#0u1APa1ljP 1۝a.AS;'LLC,L$Bg|7 ^\?硿@y_k@ `E :S]`=Q '0a8X$" 4s0klI1B+4,1I׼̑*rƔta :RB0_}La :@<*K M5v5ThKYI2B ɭe˘MJYq ![$tK8a[.^ 0T3<$u?+- 4@ >0s IFB)J-p Ǭm: 8=a>:H* 'I E 10׃'{q R]؇=( wLoq=1Fj] --2 1-L4Q bD;8QGS!͔0 Hf9!/B !YOTR\@ [S1Bd^?g3J`WZg>{ Wn*FhznQ.ʹIA h(*R` zIT Ҁ1ЪqE% #CQꛃͤ'ἐz^U Ī.,߰}-ԁ-%!K}Ppx;b* &7պ>^~E?_~ ?_~}e oO!q9Pӻ5m`-@.*;"O<;_並ǴCLN@f?VQUtjA af+CWg&p6`s]q\}O~ mp9O~ 06W 93ok'A O8_Iqo¯{ȟQ?_؟ڿԯ?__Ac) ?_@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UT#/V;nAz\Wf^E{vZ ^} ؃z!vxn츱?YX83Vp {VDr)FZ@4q0]l-Hg\ru%HୁchclsPp׾:)vݿ"t / pͻ: Ro3ZB>0 d41/<r ("8 PBOD1E( vS38$P  j @5KhA:NE!$ȝGTl6q$40&8LH1$Lcɂ l(9ȏ.r33,p b˼$PC=3R7 ?@ jm@R-A=ETSO=J=+- +TUc*P6XaObE6cNe6Bk+QZkŶlͶ[oEUI1HzTpe]%\tP]{ŷ$x__&< F8aA:xa'6RC/Xo ?4cG& KF9e4T9l[fe9oѲʈ}h{F)GY~-gh1d{.ȏ[Evz' G(:c= nLBP v*v8HpNA'Hb$G(L`)y?w~ Cg)G$#2 BCy+@Q&Fю~ LѾs;''y(*džO#A,C_EvGN:)ǁHw@`" РxeO:9̕0̀RA"'C&K+ɶ`$s27i6$z$f8+"(ExCl2r%HGF㌾T +pӠY#OO Q?#iӈXLj`Zȡ f@p*)VAuJ.-!Ӈa¾y(Q~]AD)zHRYQ5H?҅qGgJvJ"Nj[9H24RzoW"|2"HD䌑kElI¡]ݧBqkC,k.%h4;ڢua]̎^*)9kz yY#6ַA1a'Ҏ~P,~Lk۬ ȍHmoItso] ;^򢭼Eozջ^׽o|;_׾o~_׿p<`Fp`7 ^:` Wp鏈jqX8ZEUb/>?PZEvmc?rt=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*Ba@ i+/DEyT|< 05?6t7sq3T@1,C84>8Hi$2h:CDĈDdFtG4R;D! ,W! ,O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =4A 5+LJM&PkbT^-"uybc *Eh :۴3AM v1WI Q0pLW<=heR-NzH{}5\` T@eۏ?# 4N0DGQ2 4@VQ.~ۨ>}W%a#SdE(ys'B4'p, ?o$H4CЕe+A Ґ5`N_t)A&D0tN[ۻd+FVE2G0FIo7wQ{w_w ,uE3N nQwW8HdST<9M1 8AuC,A ѹv,Μ Y;DWZ~Qȉ"2 <{^QnU[j4W@H/?G/]?G<γHG%i,.( IgAGHr>O ph&i"Ȕ07?NH b"IVj0g0aFvP$vF98Ddy !i(הSꮓq+a9A8 mGNvVЙpfdl4x<0 d )|H5sMR1,A7A9A >PzR`JPS@T=d)72 dq DRP A˧ trrwCjP"3O`*!bDZ̐P1Q)+CTPJ9 ʲP"e@hSS S''^3Ta‰DU4պH@?Ɓt/=2M Ӄ@׎8MVw*V6р4b@pLsUf  D+gcُteW$I*GL_+5R$@BzQjk`k) a࣑ #(P:_f $k#r34B̘ ٴh |PH62$+nG~q򩐴TpyG_W @Z4Nk{rdPYMZ]pד)xKUȒj7~c"mPƸA2YMtBR +\+C^hT-EG"3)q"_ar"c6Hm[j[Q̏sdc&pc"n)ԡ"0 .8w}E9NzDi;Th@>"Hdn({==?IsS hmS$A^ |6wR'/`[nPC]HY7;Oh*[ YOFcj>= 8ly<&fDiqE!#Mh1L~ߺRtzNGزNs!>r w'_/Fp)1cssukQ'V3 g'T~F|# G4n`gp!rhth1۱7WjHeu6`&sІէi!#x^VqEw/{ӱ`s @w2hc0 0 q*0uhh%BXtk`(~Iщ81X<`A{P!Dk!G4Txx 40Nf[h&X"w~I1 'w2&N grNQh0r\(To8 zp7`ڰ`Td(("#G%:to!)?aVCW|PG c,2 77yQ1P2  7x Y;i]%'>P u N1W;(| }iy3n@\Hד5|xsW} iWp%I? %=CUG$@ Q 6pl qWVqhҚ2#,9&mAORwCyn#dvGi:?q&ZM&Cy*%jRQi@'ӟyL E0z| 7 &1` Z 6#(a&J*Tl8=Hiz^Ƒ)Xqumgu bѤl9&Fq|@k^I萆Y:/6L6 EIVap`oɸmXTQh:9F'(3&yYgM!=9y u KZ3F6pDƅ$a(ĐsF@@_|PH#է1 Q(L&o^TA ?{>7JO ("I%!_8H$::Y(sStQy1*e58rH!0& fPGHh!yͳ,1W̓m6,ykVHQlßa>ӲA %vW;}ǯJ~ j: S'O6";ZFAcΔ6BFi 0 9p9aFU2r7E8A0//3mȰ$0k>2w1'C <4R" H:+5Maڰ \8pP;)*^!6GEAF=m0]6 N;-(b_SbJ WҘ.ǡG=Ic Н\`4Dr74iO|!"Ap@ .Z9dt D( F8UC}*x܀RO] j@ -)-S-d0=Qړ* UPQښ@*D=HÝJљ R!`t@C6OJ80͌Pf/aP[-P BReٟ-үpݘ$-rຝ yK >) F]$Af xf#Փ-pxVar0F* D 3^4(ɽQ"kѤaQq^Z.=#Rqr'!_<f+X h0q=Sjۡ7pQN }N*.@aǑ萑{5M?W NٛDR҈n%tBP~@qq$meF|=~~o^Ip 9c7A`"",&p:¤^p-=?_ "?$Gi%*,(02?048:6>@= /uLOGo ǡ c kOO^j!=P"`j=~0Ak?X?u vKGaU i?hoU Pm;G mpz`,zToS v<;|M. ??oM B_mm. ؿ5I۱fW1?_L f;AC@@ DPB >QD-^ĘQF=~RH%MDRJ-]S&X5m֜SN=}TPo,TRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFZj֭][lh6n7mō`sMpխ__8n8~>yy 6!uݫ>}; 0I0@JIN Λ"rZ?"0C !# Tp2"26dE:TOsDaN3 ]$Ⱦ:PShH+K<NJ$.3!(%"cE,߄. Slꎡ@n(:zCv;8ET-s':4uH3QM7 K=ptrQ0Uq<}nF!SNgV[oq̵W_kWa%Xc*T^y%GD6ZiRYg6[m[o7 C 11e]> Yt޵ | 5-rsHAfaHAqb3#b?HdO6H$enqFg`ܪy(Ă)Nv9@-H 6cVi$rHVheAfG -bgؙrdr0)ue#2[N{ؙgvay$ ħ")9FPXm2F;pQY [D1%Kz1jnșNoχ]&=Q"# Š! h!FFWd< vHd# (K0m $*B$ Q(~43lG?><{Ab9w#=z tRL䔢>Q6-DvG5-Z0 gD#͂t΁Hl%~p\f?xIvr G-3"q*B⏼a)ЎiVXфlvL7)?A $rznq2Y:^NbfAf!P|@V2:,1m"P2T.0UC 2VÙAXVu`|]06H;*_n #lfge0mz2jִWt=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt 6 ;b ;h!>R@#dLTÔ,@3=CKH"T%dBZ&()d1eA ! ,W! ,O(0U*b\Ȱ5#JHÊ3jȱǏ_ @j*R 09,yrD1s2lΟ0/8$ψ8.4H@i JIN}s`גQDJNSJdJJfWBKݘEk,+Uʕ,G<ڐ_O,db/Gx!ξS EUp *Z*.]C$y"I/@q |@Y߈]vR'ys߭|%6O{:׋wcBBP_J4P+q-]}g 4LHхn'@}A4{ŧQiӇ_u"L̈ӋIߍ\t U@BF?Dui#L3r@]JO3OE@j_N8fgRm)P>g?Hi&j =q}e(A : 'AU2@%syj'C0͑LZ\>@z`zW?f*ќTi=|D 'twl- > 瘧䬰&UJ@J:ٓ:N9@-Z`2μWγ}b,7&14 B|y22t:3/OJFe Wq#;ѹ&W,\F ԋ7ʭD+1ިi9v;4C~ӦirD~=̓v=E|γ2]DNcaoO 6 ;K6D<:3F&-PW@ $@W/t:iWu.^QpIqNP蠓4D.;N[LŘ'N 2/ob{9}cD!/_I5K_1 Vd Ӊ"f[4:U $^ 8:9'l`$Hi_q >n"ig WCc.H 7 0v; )`PF(+-c! Wpm-F\ؑьSܢF&8#a \Pc_$:ձJȶ5c 1=)r,&WR-4뤍;=N JK]eb pfG% @O|`*Ee _Bx@"6\I#uYR!PK_)(qt eqR\rB͌&Cg޹xK k..lH6MC p> #FL%0'HON u@!L@0#ck#ʌ* xڼ=#Γ7'?LSa2 L@#'΁HG?H4>hgN֚}`.yFC!4%pn0݋xz"4#lP֍l!&@jfD,QDK2dU[VyJ l K m`*mq:#(CԡfD'G@Z ȞЉ칎#b1tAT^1/Co837oETA Y߽X-gGfQ:h<M5-~ЋTW|]!Gb~ 'SwlP0H~t 8_jDŐ3d9A|``!, lezY"mH;*%sF0T~8cW72k#o'O*3?6*`2`<`9Z㺥Msz U,ATIidlu>~욤4d&ahr">\t~wcNЦ8PdP Kr0NP Mdn|u!$u83*)p@DU$H~..0+h>o5of ]8_!#&4j ? I Cv0P GvAۇLu7}'`k y'tчhqYgB= \\ Հ}e40V8 ` @B (`gAJGL'4@im .Iu Yw)jP6}wQs4/r] ! 6x4L`C* N0 vޥyp &O:Yvq+uƥ!wIbd" XbGrp3:yww*rSE @ !qAlm[p~@+@6~3 G% rO!*&(vG1夙1 ЎXBCg5`vLVs&~'أ)g`KyeNXt&xAeauW(lj x8trL[0 G?T:Q,9!|v% cXyB=hBqT Lv%)D1(?9#C`It+PfQ OR8&i>l,|pYԂy1`U/1ѣ5xfQ9Hxv"^s4{()hc@ Nr 4b'oU::_:IA"!Ah6/b1c/8 7fQLri'aQ4 Ejiܒ4<5rZ)Iw73Z*Pu*&9(R@qq k zj8h b:ib8~)'8 z@ũ!r7QSrj jæ B6 1ojrU6"3*F@4pu9;~C-P1q!841 =vcI|~"Y(/ۚ"ţ'G?AMЄ Q>Ϣro"G篱`\@qSASkJX!DKP= _2g z%+ )%qb1iC-">i2K/ h0BW^ НǵAѪ1 ;P2a'2qyKo/Ya;![w{`'{ !T+'Jṗ$2ļ༒!W'a )M!O$!*#@,pk[Puų B#uU@ ;';ߢEKڗ"Ƌjt1q`1bO P0,B“q>R# (  Z.|M,F6H_A##_)ݩqJA. f;w0,4 *i'q Y`A.ƻG-P.5(ȕFUr ڳ[Y 0c2 L_\?.&I 9aoҐ u6H R#?w!G4Y8 \cf eTό9,}bGVܲ ެ24=PI1VAG -h;^zGA&-M)Fa+,. ӷ4 =޼̀SDs{)>|*0F(-HB5 1  rPG]p!Ҷ@%1+ MWb p-vgFI`k}4؂A?| s- `(M}&Eҏa*k+Q jҌ ܴ=,&:B>?6My,a *' {q].cU\3 ѭOLP" #| #m FR1a _(R+!}Iv "b*2I $'~%*.0/n%2"n !CQ,=w͎<-N+o 83B i퓬 #^MA./AcQ cY) D0筳>v^ +n j45w~ 8i NP !!BKA p~扂0%1CA` cM ݾGY~ + N^nd1Ё ᗡ9w+:#.8NfݗtQ۾. !|[UvB+.??_ ?_| "?$_&(?|#)"ȭ# ``2A c._8)z R~@]U^OLOjOX_iA G?a_-zzqg{;_SO=/!%mpF@K @w JR%.;:OLQ?şʿf؟[?_?_@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TPEETRM>UTU^ŚUV]~VXe͞EVZi7ys 睓;FXbzk7`}!/cΝ=q޼q4ZHP[lY/LbqHᴍG|h!8Ўrݽ'a>>^z''(8}g$C%N82> (=:"@8*ci 9# H/B?!OJDhDgƬB3ȘXNj.NJ8F'r9rt$).J1$L3D3M5dM7߄3N9礳N;|TR ^3PA(=PEeQG4RI'ҁ@ 1,54T5 H 5DE5+0U5VY=#@rlV]w5.Z} W^%[-6Ye؁vYi326ۘqNj%Hte$Fu\_TuRW q7-'brs~(^' P G4.s^[!aWz&},c!#e B!v!@/8 1ve'ZD,˘cyj+!ez0닁rp'.ݖvig4 ⡣rQ@ ?d$?j5%@@{&9*4Z\jBUj_D(%y!"f g`@p=/x%Kbvp"c2Iwhؑ@h'Bf{ρ2ID=o '2('[A7g ؀A7\-1@Ո"BPI %c(49&P!q[fCti ` PYAlRҗ60n T ,05 YW--[PEb1˼Bv!@:٢ĕ ;GRcc rqsY]&IT2q૨җ}#G+rdARJ"$q8ʧ'^$\:4Ჯ~f;ėU2/yN_W?ėl!C܉ s\z!AN6(1!>=3|6DDrOtk)K8zQ/\Sh.TWL!BQ^ aHu=Iwԥ)A2Jr!iTx_˦R*VGdeի5W;լgEkZպVխok\:Wծwk^Wկl`;XְvadzX6ֱldI^Ulf%8jֳܙǾ:YҖִEmjƵL\qNֶmnu[ַnp;\׸Enr\6׹υnt;], )nv} j׻.w׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{{~?|G~|7L}Q'§S!8LG;L~|CaS4@@Tdd0R;> ! ,W! ,O(0V,RZMŋ3jȱǏ CIdNJወ0UTIL8ɛ87@0̩@DDƝzJSd*RN 뢵/j2H kуNs>*kÃbŴ"Ը LX)d\ UV U3]0É7~2hϦXr\sbVd/&W]b*bcQzSDMenj X+Ey ^<ƎKU7ѫ{q(dÁf@$ËE4M3dKvGe.gRtMaIx~XSɇxYm9UD_(b7#A5H=בSW]%Ѐ]@:/MFDʄ"ZSfĜ^4$G=_đIgINz?æyvgj7>#Ѡ~Z EɰΗ@ )fnEN; Dj㌤B3Pr |ެ|s({@.[hz٪i`Λ'-hZkzDQ@r ;X.D8*Aj4gy::vĥ& ҋ@c 6V:I,~sKQ{TK)@n+И!cE(c^E1oCO QQlutoH;56?k+?^@erIoLtwKk5zXܑcFx|7es\d8G/{M8sxaG&u5׎EN A{9Ak_wDhd};HT]mrI4piuo(2 tMGZg_ic ,!G/]?Z{?&+!&Bqy W= }^ %0ot7U& 2 O]DI(}X.z9UA>fp$ӟ <`RBjDys!Ax3TDHq$TKE~qޣaS $EЇ-Y\Hd~i'Џv]x`iA]p?Fm7th`B O0ѩ7Y$Q#t ,)f]yIۼCsH>@JZĖl.KU D&I"t+cVKCh3DNMc3V`^C<H2t_5ji0&s33$ D$f!-iCݹU?'6~zkp,NW L3]FS7KDoHe ]޳>1N@tMW (Vk7`h3i, WH& {\{lI|r}w0djwFa l` 6b+ĺ-% &+mjdJf|^-K$+=8u$53\]"Q7mnhȼ&e0ջzQ̐`H; ] e3 .`Hx]iU(;$("vQjgEzNd^ך#9y k?U_@.\~[AL$SeL#3b|Hivk}1 d!<Ǖ@}F"]f*Й ȱ}>Y S ıA{`4m|J DW|~ 5([qi?V[]8рFiT3}z"q_ztmAF5I h.x2'&q81LhTA@FXK pFah dq }7PF(X[FW{78qBma\'~EefU I fm|q60@IKhoZ@P(xX(fp[z":_u6I="4Sx#8WT%rkyR H1Uhi2l&! Drq10(`'0cAu!F !P%pr_Uhpl}1p WO:I_zJ1 +C(B`@I>'N5~ah(P6E1 "  $&ilX—Iq6 o,4cvP&ė7udqs0`P&pi(bTsI8F&9 ٨N Fv"  |0H0 !14ihtqaI!il&&~30&x@ (Ip(@*jq)D"v*Q%4wʅ&oaY;0sBI7i@)$J&  e<aʡdtFd8be!=S=( J7C j1L E0&iP)t<*(6N/0_vIEgh "4: XNM Tys^aCޕGvHM9!O7 y .C&v8Qx|lJ%qY1cva(6 :vJp`PM'Qecvl~ƪ tj^R:Zs亰aAܒ6hb4!@3 Knl_ڱ Phh& !` @QqA I(7ӊIcy p6;N֠PE{2(CRDxXJ84SQq c JQ@Fb_ )4з5H UqbJ[MOZcHm &|'7ɾ 4Nq“t, c1 p PGB5 %L̄:-TY5L$('AF\'~CcY\3,™>|#(Š% @;@$&1!.Tɴ!Aa V!2,dɘ=]<1:VlB!a& }n7qy `dVMIQBp*>"Bʱx%14*&V@ь6|E}F1,  T lSTxf"Qa48ӳ~5Q9vsN lEʃ+ m( -1}^!#L q tyQ#&G4N#(='bXmn!'Q_+gjEC3-lK 6BQӑ0`D!7/ ؼe @A*Mq`F@uK #p @}6.R  0)=و9l٘WٿD1p3{}׾|Z Z!qٷqPBw&@q$!]@ <~#JA{ q1yPPE 'ם\&!aEJ 2Fq%  =Cv# q*}MHjQX"SR !n ~$F!+!@!+` =]";R޴NQQ }?$B.@`- 2L~Ra8-Q <OTX.Z8F <1o2&&Q^ UߐV% O.{E~"8֑ b6z.{;1~v灮?E4~hJ΂a$(!  -!Ow3:,!_KA ]̎+ΞvkJr, xp=Ut X7 0n@F/@. \(anEQS ao/*2F-1בp uLuE'QN,%ZQ'4A/1"W>"J/$$S_XZ\^`b?d_fhjl?Lpr?rOtxz|v~y_gf_tOŏ?;ס-^<D?T=9q{m 0ށ?6Ra,mOΏ_xM m kn"O<ɿ??> /˯@@ DPBC,h0U"^ĘQF=~ 0 H%MnUjP.Q`u[;~TkX--VZCѶ-IJW; h^'ʜVW} uYbƍ?Ydʕ-_ƜYfΝ=Zm,ҥIFZj֭;6ZlڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^x͟G^zݿ_|ǟ_~0@$@Dy9q"Z0!0A 7L :gq)Ȇ!E -̐C_EA< 2E u,(D<1H!ǃf4)`quF9$vxN}b2|3YHv>.QHFB.ՅE( v:Ke?[Š7⭈?򷠦wXbf[Oĸ/ ")[ FPXh:҇rAΆʅ1%KzʝNG cPD"M{m;EF}!ڟz 'ť*| s}W{M9!sZ¦ ď:d\_}FgHy8 r!y7Y&* B'x9ɋ_] La;#( G OH:#bG p?wÖ }|.}zU~ -<2? ZB%@8!pPK;096g1,+ g7+3F!*Aʑt:KhAn"]yU_hmk\ DLծwk^Wկl`;XְElbX6ֱseR;YD=?YVv00RЖִEmj1 ֵˀֶѬ@H{[ַez[׸E &׹iis;]V׺nv]v׻ox;^׼Eoz*PSH6P_UV_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}ꯙD[O>awRW\!zw]{LB.|*K[xT@.{t-e?ۉ! ,W! ,O(0U*b\Ȱ5#JHᵊ3jȱǏ H V*R@X+crI$ʉ*edΟ2HɔC!ZEP@f@q4 zcO0 p-ETtUDV̪6fκx]YsRku/Ng4xbIbpDyt +DsLu,]]J.X-DY#¯NnYWrr9{1tqfz5cؓkgIчy|E/=P.~i }GPKؗ`RQg 4bJd&JkE><yejwzD %,CSW 4=CO"+h"(U;dЦ?؎@47ن7otoʹdL9PO;#~ L@`20ݛ˶+Y\QyAI/P?jL-DyC̔?B7LЎ8C9seH[<6LD;ѷi~zc7mDhld3j,ћBs@ɘE7-PJyjmGV_֌WLd{L .ъ:EWk..0w&PW7ʮH3%bJ^pE*hݽ{G$& 񮽅\L^/>|GȓSo?aƒ6Q|qӞR3I2 בi>c$ >buɟ>Ad%!1_; AB#H+8LS6xdBe,$y .&xͫגGDc90₠\o'Go\Af~&GjH!uq @&j @)P6GXYΐ"NZ'F+PUc("D֧"E(L'` hD]N.Nu 1+6#\B4l} K6;9$Sr@R?¥M#Phv#@V7)#(3#[4ۛw ]"36u 2eH /4̈7I ủX$gZ@#T3N8{\ĂGpw"gl-FnK.P5vBJNЁ /(Jh#tFjf-Ϻe,_1{H1n+!3qBXԔYv߉43]Ea nĩ,c4ǂc vhQ7>7P6mC13"FͤpC͆(x9(X,sI'S6E(7hpnpbLK1t觋z+@ Q)h89@t* Wp(Nr3x8%> CU#qIqJ 0Q!Htw_+n59C` ` Fр{o @dY\Z5Y( s@1MNh`; { ^F~QW\KvCxQ-ZX7FV~|Pv%͙5Wb:eCT9A R-^U # jqSsN+q1"b#@:l(퓺䑸O\ E1  r^/r([uxE+Z++kL{ջ{X!]AkS0J+BIPjA:#jtʻ2X0A }+Q-Zckl?A;2^1 slT!%<;QC#0u1APa1ljP 1۝a.AS;'LLC,L$Bg|7 ^\?硿@y_k@ `E :S]`=Q '0a8X$" 4s0klI1B+4,1I׼̑*rƔta :RB0_}La :@<*K M5v5ThKYI2B ɭe˘MJYq ![$tK8a[.^ 0T3<$u?+- 4@ >0s IFB)J-p Ǭm: 8=a>:H* 'I E 10׃'{q R]؇=( wLoq=1Fj] --2 1-L4Q bD;8QGS!͔0 Hf9!/B !YOTR\@ [S1Bd^?g3J`WZg>{ Wn*FhznQ.ʹIA h(*R` zIT Ҁ1ЪqE% #CQꛃͤ'ἐz^U Ī.,߰}-ԁ-%!K}Ppx;b* &7պ>^~E?_~ ?_~}e oO!q9Pӻ5m`-@.*;"O<;_並ǴCLN@f?VQUtjA af+CWg&p6`s]q\}O~ mp9O~ 06W 93ok'A O8_Iqo¯{ȟQ?_؟ڿ?_?_@@ DPB >QD-^ĘQF=~RH%MDRJ-]SL5męSN=}TК%TRM>UTU^ŚU֐qVXe"HdξW\"xEUۑX`…úK{ܸ3?YrO$C%Nq=Z4D* ]6٘!];pcƝ[zѤ7-oō ȝ?cq_Ǟ]vݽ^x͟G^zݻ*Uz_~׿?$@D0AdAEC .ƈx0C 7(D8D1Ń H 5lC6bQxQEw 1  HG$yd#0rI'ҽJ*2K14K/D20dM!)\M;cGH0d $CNCrE! =s,pRHBEet"y0:93T[eKՆS)4v O5YtZ |Sj'~L`)yGwtH #('k~ IVҔ%_},y@!#J a vZ@ <~s#̜S%Z` ١~EhRg}!-W ,궛H<3Mi=$FJm)ۘU<)ߙҧ] !r׍P;aacd*1i;Z'z"&0%@(-e1Ꙝ bǁ/HCV"u(r&% IlIv>ViqsHBz|h%(Y3t &F~]`8&zDyrȂo ",ơB|H~Wك@R֑|fkYe2k!۔g?zDQSB _79XB !"jV !fS?1,vЇSU\duiPZHlLЧ;DILRiL!CKC>^JC6.$Q`F׳-dsءC!SхaP!:ip F Ar Zbz_./>K`v єZ+}\&n3ȇ qX@1GBņY]˃CR\;(,2D D$cÒ()B͌fJ߄2/"Dd.A!Qf>;Ϳ YNl:rЄo񔈑'*RmTJgQ(СLbNll=φXs4'D6G9T,!I b҆!*eCt<4kuwiTJ8q J~H59Uxq:dr]EkT)BdgMk\L%m̚Xk^Wv}l`;XְFsG8se С!4hя iJCt#ajӛ?=ꩄZԤF/jVԭue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5dô6t789:;<=>?@A$B4CDDTEdFtGHIJKLMNOPQT6Q0!Uddz2LWCBZ [l]^ CZBYE.$F_ A8bFP/aDjFkmn8Rg! ,O(0V, 04AHŋ3jȱǏ Cq@|A|*)TL8pɛ85R%A.ả@DD)Ɲzl2N"%(A^Y.WT\ t =4A 5+LJM&PkbT^-"uybc *Eh :۴3AM v1WI Q0pLW<=heR-NzH{}5\` T@eۏ?# 4N0DGQ2 4@VQ.~ۨ>}W%a#SdE(ys'B4'p, ?o$H4CЕe+A Ґ5`N_t)A&D0tN[ۻd+FVE2G0FIo7wQ{w_w ,uE3N nQwW8HdST<9M1 8AuC,A ѹv,Μ Y;DWZ~Qȉ"2 <{^QnU[j4W@H/?G/]?G<γHG%i,.( IgAGHr>O ph&i"Ȕ07?NH b"IVj0g0aFvP$vF98Ddy !i(הSꮓq+a9A8 mGNvVЙpfdl4x<0 d )|H5sMR1,A7A9A >PzR`JPS@T=d)72 dq DRP A˧ trrwCjP"3O`*!bDZ̐P1Q)+CTPJ9 ʲP"e@hSS S''^3Ta‰DU4պH@?Ɓt/=2M Ӄ@׎8MVw*V6р4b@pLsUf  D+gcُteW$I*GL_+5R$@BzQjk`k) a࣑ #(P:_f $k#r34B̘ ٴh |PH62$+nG~q򩐴TpyG_W @Z4Nk{rdPYMZ]pד)xKUȒj7~c"mPƸA2YMtBR +\+C^hT-EG"3)q"_ar"c6Hm[j[Q̏sdc&pc"n)ԡ"0 .8w}E9NzDi;Th@>"Hdn({==?IsS hmS$A^ |6wR'/`[nPC]HY7;Oh*[ YOFcj>= 8ly<&fDiqE!#Mh1L~ߺRtzNGزNs!>r w'_/Fp)1cssukQ'V3 g'T~F|# G4n`gp!rhth1۱7WjHeu6`&sІէi!#x^VqEw/{ӱ`s @w2hc0 0 q*0uhh%BXtk`(~Iщ81X<`A{P!Dk!G4Txx 40Nf[h&X"w~I1 'w2&N grNQh0r\(To8 zp7`ڰ`Td(("#G%:to!)?aVCW|PG c,2 77yQ1P2  7x Y;i]%'>P u N1W;(| }iy3n@\Hד5|xsW} iWp%I? %=CUG$@ Q 6pl qWVqhҚ2#,9&mAORwCyn#dvGi:?q&ZM&Cy*%jRQi@'ӟyL E0z| 7 &1` Z 6#(a&J*Tl8=Hiz^Ƒ)Xqumgu bѤl9&Fq|@k^I萆Y:/6L6 EIVap`oɸmXTQh:9F'(3&yYgM!=9y u KZ3F6pDƅ$a(ĐsF@@_|PH#է1 Q(L&o^TA ?{>7JO ("I%!_8H$::Y(sStQy1*e58rH!0& fPGHh!yͳ,1W̓m6,ykVHQlßa>ӲA %vW;}ǯJ~ j: S'O6";ZFAcΔ6BFi 0 9p9aFU2r7E8A0//3mȰ$0k>2w1'C <4R" H:+5Maڰ \8pP;)*^!6GEAF=m0]6 N;-(b_SbJ WҘ.ǡG=Ic Н\`4Dr74iO|!"Ap@ .Z9dt D( F8UC}*x܀RO] j@ -)-S-d0=Qړ* UPQښ@*D=HÝJљ R!`t@C6OJ80͌Pf/aP[-P BReٟ-үpݘ$-rຝ yK >) F]$Af xf#Փ-pxVar0F* D 3^4(ɽQ"kѤaQq^Z.=#Rqr'!_<f+X h0q=Sjۡ7pQN }N*.@aǑ萑{5M?W NٛDR҈n%tBP~@qq$meF|=~~o^Ip 9c7A`"",&p:¤^p-=?_ "?$Gi%*,(02?048:6>@= /uLOGo ǡ c kOO^j!=P"`j=~0Ak?X?u vKGaU i?hoU Pm;G mpz`,zToS v<;|M. ??oM B_mm. ؿ5I۱fW1?_L f;AC@@ DPB >QD-^ĘQF=~RH%MDRJ-]S&X5m֜SN=}TPo,TRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFZj֭][lڵmƝ[n޲\I?C\r \b\sͭ_>82ٽ~ɜGoDҿ\N27Qv0@F@< dA0B 'B /0C 7TRyRCOK$E_1FgF)C1C F! i&2H'j6 5,:ǝ-g,D"IM7 #1 `7D3NO? >3CFq j vtc΁̌PMG2C}j:v TFJtSUA .#5v!B\uBe~"vu\!Tt G*'OWBwv/T'bX!>HF6]@Eua y$YqbKAZi |")tAa!lWCb_PyL Ntys1f~p=Pc!g6*'Wgr?WL? (?ю\Y;Lk[h^Eg)S~WaG!Zc%Zנ6dr$LzfgGzxၰ؈s,0bY`H)2%NS*N7LhX:]8qEoY8Wi5 }*(1vW%3A dAB5CҎM|*9q;v!-1܂H`fQwn FsH*R.M!ZhX9.1 89B($"ԉ$ L H6JЇ  bq1rhόG '4kjTOޗ>"$`|K-rJ@ v=,!rDGcVDp!# F,)6xģCzQ^vFSF# bs @)ÒfB5c!:ե4VUJhMVqi.Yh6њVSl~i05 lL3Y?f2L  | q|W?#R5i?,)"OQ]#~!D *&DY.#b=$ D̺ӏvȞ pwKO+KgG HGn֩=;>k:TQͮdCjV#@lRI2ZpL\'Gt).Ϛ'_jY2<溄dF3[B4+kvsg9, y^ʒ hBkυFUhF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5dÕ6t789:;<=>?@A$B4C\(/D4WFARD$!OP5.Q+)LD8hEt4YbE"T0`Fa4cDd$IĀ! ,WH*\ȰÇ#J8b(jȱǏ CIɓ(S\ɲ˗0 ƊfXPՄkf̟@ JѣH*]gUbJիXjʵׂP ۸s>zvAy mJ $O!УK*A Y[=s  5h蛩Wٵk*} @ ~ʹ_\_ PI XZuSRuA54M3P,Uu55,R~BbfwɁ zgd3S'q9T*h@ H(KTRhaYn@_&AczbP&XɥY7)Q A@"B)(肨TRB )i#ՃA1>dy5_/6` 1'`RI% 4\"t1W](HYgeCf&mAHwY굵-AV a7<e (Ҹ [e[ӧytjd 2D^=?PO>7 2> +d@Yy"2',YlE36{C*d</{ #P{TѴ lODM-#]) 0j7?@7>cpBL/AxtTw?-<53%x.\ E ]UDdd78nrtzA :D@>SHVd@R>@ 5C]#O=x>ucГ:܀nۇ R?[^>Eꆂ=n/'"CV !P#p$ >zfPj1+3;Pv#vCJ Qye*SD|cGѸNnPb;sP8@aAV> <9:ҏj+bB 匵S#ǖDQ SHU"G u< &^xɫBhHވDڄ&4&% b|c)*T2CL޺ăd" qw`\(E)20= MU{vͣ'aAÆ'Ӭ&9mʰ Pf9@n\I8bMrdi@cla2.i N2dF10 2ʂѐYa>.Y *dH#0P0;hEyjY /$.CR{Df7сJ0R9ESXT#@iRBN4 BWTf R:T<5!tM ]$×8ṽ =)=>q /Ef*+T1C-@Ò"ĸFA̚ԉ|4~D L9̅pHxcD)عփoL5 QeGTbBrs35r Ty!Bfԏ6+~*`D|&l!ۑxh2y 2Q[xIT4nC=\"Hr]8-.t Բ v)5{C'~ F7! 7-,0s2 vkmZW MX";±kSanyƅ0Gݖ|#NEA2Ѐ>bC:0,{bĆ;XCArӢ' 0i8R27?2s,?xyH({QOd0ވ+=' І6PhBqR7 &ѻSN-& $@ #ɯiZ#L4 io#&|D mD7p-YM/Z`8&:wni5b.,Ct$vI 2p \@"XWY $V A}$kD'V"ȵ7l@-%kD .@l []BQx \V{&0 ^LC[V^+q$4p&Pn0Ԍʐ F~wʴsRT.J#Me7qG& <DJ=)]y7UbN`!!ށ@ =7t*CgH=ͥ~ӝNd&% @ Xc;{\KY<>AL w<>!6?=`zR R#^#iW~#}(ayXqC ~VAQ F҇ rpG& l Q>FX%QrtQ RpĆ|*0f8>5,y0sw!D(G!m4HJ%R#BO(h@*8PWȄGsxHAuA:̀ C1oZAA ,{ ɐdunqHu r=(s 1 '+DS Y%@m pc(FϵHR'XHL3Y`%ᇣ2d$QtM xe ]Oz# ҍ Ad&II7Aqvsr8 [~687gA2[3 :PdC7E AC&5 ,YA $Ix*W[ }L `B$+ ||,)6*Р> &ЋhWpuQ =Bz~Đ3`hfY NPo`l q u|+>A%^{[~Y?5I< +hsTglȈ=Wb!S2<{ t&iyGt} pvCs p7 qr ,jDQ p=ch0E !Z'{$x!!B1;gH%'i֞pSnpsp?{% zW%A@˃`OЏ`bF#z+iֱ#ц`!1P Q) I zUfE`cե **@zxXd*uInE Z/A у0A;kTU4ИupPuIB+!0}҇(9zZ^ FHz. qC&1`c1rs\pHW prfAfZe1 j!easp98b֚scMX z!POjj 'q2~ƭTA>)G)"Q#xjuԚVay:fr "-"nE -&Ȑ4|&YQ4m3t -P  kP nױ(◎xl')Ijk4&;m,C3.qa FqmڐjgIP  H!p P-B +)т' *B>Ej {fu ZXV (oc&#!P"@@RMĭfK+{:}(;c@-1.jw(TJXTL[ A P 'tL GA̗(F+ [sq (FZ0 R:ՐKq `Z#'9I'(b걇Bc @\aZ &E'6A/ѿ!G`~@+@Q~Mgŗwpj &vuST Z_'@t#0jh@ ` .L,)%q ` FQKQJ!eA1 ꐙ zIJj|!!b א@TWF'pη +%7֥8v `YCs3۶imP ) ~P=PDL`ƺLf\ HB Az>,A  /[AA1u!߾ALNDO%qA% [ `D' W9OY{=#{Foޣ15 `'TDk$7V$$ѬY/M}ɣG >]Ć=ԧE=~RȏGs1cN$] iџ?{A &L3i^8sdcz*N(`=uah.@/PV_"!0}5hWXׇGCAxADjf zwܿyaGu׀Ak נĭ ,YQ}ПW={m{;o˱oqmF@WZS>?RS*iͬCRSD(;L´Ed& /}#s5B &kt@L0洁4ɣ"#oZ/ϥx o1hȈ*B۵W4/5G!bau m[ir"Wt `yȗ=6 'k= 51 FQO0!_!&M0]k QEe*Tf3h!3i{!{!iFssv}n(hoW#aƛ:3Ku!ɓ_nϢ;&j%S!d»U[eMֈji \ ؄EIF "dVD!A#/ʈB T.ܡnb,c~9,W~+xwq!ށ};[|[{;ž"oh|3GH'ԋ^@#t+]M HNZ\"@8b{i` :aDBX$ړ\D儮ތ׾紐z\ 3=w[!IhQ)ۻPA (ӓE ,Xb2FBD!}IL' Kl= `6CN۽t,87E}-UGYg-qa]Ž @"0 ,Hm9a5P@ / K$|׿n欙?\`@ΛAఀNԲNaRM .*;!6@ z^` q,6+bU٧=L 1m;\1aI 8BT|!\@L @P]WfsJ]ZF1.@2Y`f& Nm -'=0ʱż&dAl7an~0(:79@dzJoKt-hRoP@92Z!eNf8`Z,̹aɃKRa}u*UTkk@"Q[jFbi'׵-jpufnpק^\xGxN}_7g3ЅWåNy\k'GyUQ/,#j<َyu9yЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>w>̵EZF荗 KwIcItvJ'c [@KQ،V4vpʆʆ`pDP |4Ey D:Wz:{ EUFt}~1sT$e Ke Wֈ(MwEtXKלeTwI5W@͕NGVxGXH GX }0F@֠5ُ`VA ͍[pHU8*2H?xE}ZSyZ0΋eWϘcPKH7[g1Zbu\\cIH#8$Fp%ܾaK84X[gЇȿ VۥWm4hQF`78tޤE[yDKX88.E[`|@H.ۋ\W_ sѻO=glE`:ի3` ส`  V&a .~@av*aan !&"6#F$V%f&v'()*+,-./01&263F4V5f6v789:;<=>?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^_`a&b6cFdVeffvghijklmnopq&r6sFtVufvvwxyz{|}~&6FVfv臆舖芶&6FVfv闆阖陦隶&6FVfv꧆ꨖꩦꪶ&6FVfv뷆븖빦뺶&6FVfvdžȖɦʶ&6FVfv׆ؖ٦ڶ&6FVfv&6FVfv'7GWgw '7GWgw !'"%1X@..^EA#k=+o|Kn0!0C(.1o/2o+OnjTP.Q.F87;sJ<>?3s2! ,WH*\ȰÇ#J8ј@c)jȱǏ CIɓ(S\ɲ˗0J*V,Nɳϟ@ JѣH ڴӧPJJժʵׯ`Ê+6Ows6YjʝKݻxը޽y L?T\@B0FL˘3ѱ@Dq5MNiZSfA3T Y<xNUl4ԌY]ԩ3{`Q`%"S ,X>Vk @~ djᤓkD2(7tmǝ/Vo@`x'_xW(Ȣ8^JxQb-أx|h+zv#ABI&ߑQWT1[<" >: [I l87'U:*,IlEUJ7@qL2 J34#@ i=iBUlfU84iOXSIH~@S?3:"[(YD6TtkAD"-C oЪ9r:ɵ<ð7B dЫNi]Pd5.)PUP̏*-:*'A$3$u;$b/oM4C1R#2Ca^!G};yO@2W k*+DQps44-0s3G 8( RA h{R^BP G;AܲK0`B 0z@TH?ѾK IC/ cwr7q JGsE5:&5(8A2( (@'BH*#!RŋQ9zBMnc:j"EH6H*(PPKJp>!HDt.88/Azse为i(AiIC<H2GD$aKz SDZ&i t͌A7}Q @ B1 dK+y^z $jG8Fg87$&arwPy V~ D;3ۈ#'fb [H ]Η"Ql @H\i sF.Iea.J{E 6E CdeY8H(AK UJ-M DrdVRkl)]< HiH(NH@xHqqb3pL y+>,?DְjA9H27֗GMUr/q'm@Fc/̕J=H/R{1b @Zt: pXSw`Pul%1?? p Ps' W}+ |SwO~ 7ktq ȁxհ#%yPSi1c D|LpLZh<37Iu5OߑUї&p?%D#NQtQR UP(׀0(T`Q| 1.WA qrk *(n4kO K$lH׉Јwmh0uj)  tm u'vaX+HZ%W`6p& u'$!ӰcWwĄaq ` @c6ad<i(gs|52x^)08}~x6.Ħ 9֦"P:S_IcVt| `9 @*3 # 4hK@&u.!0 q.121ưR1v<( 2Qo{  {ta2xĔ2U=5+bgIqA”˜&\xm Ѳ Qc]aVѮ1Bw2q:] fɁ }a^&_ x{;s=Fa|Yv:(A=sG~!%a A:+44O9Cs\01PY|*Q.$L@F$~1!`0 f`b͉Ԣ[P!V"7alizgo|3jo/%39ACDآ%R 1sq%-a62"kM^}ߝ %31woYR 3UD-M? F7 q$_&O8+ OU _mw q>I $p PHtg#ϢW 64}(q7В} H7Й^Ns-R% 0QO!2b-X9p/!SBj(*.!:D@ _W?p$&- Qn!Q$P!"ІQl"@ ^H6ʽa- m#!" E  fOpƾ|@ 0"A%bC0ys; /*!?kcye@@ $H B 2t5rX%S% !$5j$JTAEe+U*`DGO<M IJjsG`OLq^+Bd$_lHjfJ$*bXX"JԃUCuV@P+A} 4 ]XK@Xdu0eΝ R*c=0,_8@c:w* ͤn8 N59@0̓!'D2.ӫN0{3Sn!⁲iwλ5k{XVJ!TP!F z4#d HL `s@Q8j !&<)C @`t1lM%!,2uD"i!M lå#B$1QB كPQހr2 f xy22x %SS4N4TFTf{(B pDV LTS(B0SLWhE{NܳȞ:T 8yRRi#TFh5lI1s]yϢ)w w"IyEڂVɶ|L04(faPnI;:<[?9dG&dOF4%> 64n*eo9gwWEc0cfi:j~e@3PcL'Wj&lϞ:bP wcژC'=monhl8xXb 'Ęܻ;p'r^YIRQ@Q/G=uWgYIt [tI6?kxy,‰3RqMA-HdYxGi`tyc.x#?@ .ސ|o_FA|C`Q  ]qP j 6%? 'B!$a嘷 ]s`  VHBMNn6(> k=P!1O~ӟh@:P&=hAPmhD%jE%VthF54*qiHE:RԤ'EiJURԥ/iLe:SԦ7iNuSԧ?jP:TըGEjRT6թOjT:UVժŜ91vիR;8լ=;9U7cgk\rR) W2$~p9 dkbַ b%!$h:v8NֳWlJEmjCȪֵL;ΡWֶIC6n[ַnp;\׸Enr+ܙ`\nt\-Snv]v׻f#;^# +yې6 m)|;߃C pG:׿p<" q0cF0&[΅>1d(m`b'~$EX) (q0Fd@|}cGL#! vK$$ @)La 9F!NH?-jr|*x%zpsCȄbm q1 ey22j .?d]."I4;K#-Bq7\-iH=y{!&TgQy\2?˘ҏ;@}p4#m}\ 278d{z#耲>`Ld=As. o@;ʎphi'?zkP@ >@a#sOc|Q/?1d NwL3gH5eAFmEH$X}|2wˁ н@5$!|2"2N+=<÷K>#;Ȳ~=[y4}K2 @#&"cKB Ċz4F00# ?1Fȱ{jh: 5<DA3'<94r,00 ¹@Ac pgC:; wл<=/)SCN42tΘ7xBB$;YC`6C 6TIÚzDk: AqcDJT(CPCE?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡ%ڢ5ڣEڤUڥeڦuڧڨکڪګڬڭڮگ۰۱%۲5۳E۴U۵e۶u۷-MD[W۽RXbyzWՐ ,EUܥTvZS/W[\ rJXaڃ [8}5] Ue \}U! ,SH*\ȰÇ#J0OzܡȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴ)H=~DuJիXM`XYzMkȋ =kT`"PW*\ ī7X}έr*n2-2 kg KWkB3f YJpOf=M#aVe&g၍;`sw 唎 BI큹ަ>ɗ K nM\ SNAҔ=G] 0/R0ԛAc )Ќ IЀP_D-0-:uxK?lO;UK<0d kRЪ*J$N*=Fy+AAD : $+AcESo@ 'bN2Bd2OX)μiZAJs/BQ}=AD !<>\ kG)!J@$jWeZ0*1I*{*#41ZR:RuUT@>8Z$q p-z]Y6i61XI6 z3GUc'3/T 1*'`/$pzw-a'@M7f&yxgeDi APHIs%X69GOk,% (խ+ZWu^w>\ dz&ĩ18&-Gb4 Cs4Q;DV*{{dz q"w6 KyF˥0@ )uwu2 ~ EpKxy˲3KBQ cQF5Xb F!&1ii"  KD@m˧)ks| ` ` E2M2x м$amQ A[dWp[Rྫ ]TB#]b ,  nQڐ$VQ* x* ,$;0y;0mhsEQR0HS*D = !U3/G5+aлwAt!CM 1e+ q1XɌ39!x39A>A-[q ~@ (  Ug*բA)gBq|˹|*Hf+1Źȗ=t,1>T8*%E ! `S 2O&AXS.b /N3!*J ͐LP 1 ӧ2K.4?:h p y+  3p j6DQb ޟbma @ Y2mP~=~;W]NnDJ]+x/&03E\ Aè䵉a5#!(A `1qg+eP; Jr.Av>1| l"$AɞBn N>@^#Brz 93 ^ q;!pv! ?G !#b ,&31fΑ;r@_#Cր}d~oF, JR恢v F v9A #R6@kl@y?p g@C=p3>q.4U!–Ja-5A&EQ+ s+$"Je&\`GP5A (gua I)A {@uyOPt0WW~RRcڏ\/p Ҁ !r>O< %L@@ 2PB zkWc9ĘQ8~e62n[r͝?a;sXy9)8 K`r͟G^a7Ϝ3V$.~ yX0@$ #9xc#+@ 'B /ꎎCZ([0ESE_DDEDD/z Tt,RT$)kƎh0D' ҲTZJ1rL3aR#APK@2TLe L?,/>ڀc⼱L@et.*AF'I<"C#I)IM{"S.9݌QȂIeU!?J‚Z"o/QRI#ӯN$56Y[tׁC(Qv!vR5H֍p6:۩D15n^PWl𓺹HVxeJa\^?!)zIb #~Is[BM8c͕ib c+tW!H/Xn9fDfo9#sg7_g8?i:jj:kk;l&lF;mfm߆;n离n;oo#z y p>{{?|'|w"m } W!ߧ~?@67@ jHSH@C GX@ VЂ`5Avl;yЄq#[ =F O'!gBB1f%Fv4b3_Dp!@b?bLq;H@ÅR" 8Bx^!g s8<'( Ž@ xpFXwAD ǩ-y1] thbvh;L?Ĩ:C^d%wǁ` d@ΘӉ ,9Y5FP/`K8J\>MbM$rFz1R2$\Fٓn3:S0d`I/=9&9:`v8 `J3ِwu$c qeB`eчQ<@ `V*̩D&6-Z8m%v t8FOr#Hr< FFٓ=qSjLqRt 0$*:2<28%K2=PihNV:!bA@C_ d#ed[He7BFV l`QO+l'-aZ9YdΐB@UD#@f:W!T`B:N=R*%ǜ;]؎vdu3ƶ2$Im@V Vs(:F܁pwƕI@`.՚…4Qd,IBB;wCAT8s|8!!~wxo!9 N&eyc6o6y?8#%m D*0Ac#$KD 'yHW0T arr:42w2DBƼNtfBv9#rsU]97ЕI;Mҗ={f iX&6Bent/RUu%B$J:IJ1\:Mu=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5d6t789:;<=>?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklFJ Cmq!jâCv$xy(I:Ls|G ;`/$&:uDždȍȈȉ$C! ,O(0V, 04AHŋ3jȱǏ 16Zȓ'ħWBɄWɳJ,])͞q ԉ)RdNj ˘3k.T*R55r@֩L ,T650!Xbu"U+^,lő 3ި2FY|w ɠ+_jtb?NlwuS1UX(BZ j+x]saS-$G("{2]nP@#Io%ԜG&.*t(UQzAcM%C?бTE&j"D*Bb.xŘьSW2qqՒ ^y1Es$AH8P|ԢMeFKxiCP?d7Z4?9uVtg{7>e^䊐QIџzVY3ϜNF<)xtaiinBdݖJ.Yb Zѡ=DHF-yN>(^{Ԕ (t5iF$Ot&I{^z >$)g #=wiH0jG@O=cFo dY7?gM' g>,'cNbx2 1G$Qq t/F|)\,[3LCO"cT(t=7?/o4ICxaĬ:P0& (BDAu^G<z3NמS9-fzIbT9ySDK,D{c{_tym9bEΩ!S4௯VEw:HsS<而)O5 Ժw~GFտ:=n[;;B29B/ʾ՜=-cpk$ jO^!e\ҕK#2SEƗUBA2@%j4. FAEo!1SZ04ZWp'$aG<)&!Aġ&nGBhiASr?sʆUA-:q'`3BDinv(ib# R \O.OiHOw R=)G8YF!ppO!V/ROH*ndn,6Jĕ$H˦<8DdГ~ܦAS Ԓ9`8*]^)ŨLX,R6>4NB*O2 8Q(b,714XE 'g)4(IS[4iB*Č0#} %C쩜hn \tblT N6ƣD Sy7VQBiG _(Ox 5Wxj(' ~D$v" Lr&Hm[{1d#@Ԟs  IβP"$g0@hDZb,k_D030;.@H!}"925]gٴD^hb)_`[@f׍o"H AA$]zA8 1xw#6e5`;gMܩQGՃl<^|fk0w2XG5gˁ $$.8H'RY~(=W>2^N_D(%aS$A>x'6_j/` \XQV\h;UD "~ygFE0v! j 6x`Le]r-ALfS14?v2Dg0w%Wo(trdoO5((C-"̠Z=хYK q@nAOH*>D,wEV'I3(\w7xaoPs(a`pW `Ul͇!CfhfO@u4xdHAgAxpEpUak#'BhW6`;A17s5 |xR ȁ1ȂٳR׏d9c6 @w/)q)F&&c'>PoYzc ARdr gّ ~1"  1 3י`a4YSPTqKoi[`& A5K @ Q 6ȕpE\p[9vZr(8Id5b&q&>I1SIp)/p]!Ȁ\vq4*c|DJN(6])N2+e d8 KaúdzP {0JRJwk5W.>3 y Jκ0ˌ 10˷ADCqD }Mq=` 4TdJ1,>Sfr` $]!'\f|{7PYp#8YSr!( "GDmtQCz0f9Hr , 0ݜ p ] ^ ;Gήw({3M<.@!~|FvGBIWMY$*)P_-: 2~ m ^Ӓ[e\;3dq u-J{ܖ31L/ۢѲ3  P[*+ 3",a@`@ UhA!0 o;z =«M6-od. +#c J'N5 g"1a4E 0=* Dr TЁ @ g w ܼ} PߒL wE^/Bފ ZT!湂îg.aRa/baFކ}Xr F1/ j0Y}lgp À1B|L%a!H ,zA N | {H> L=" Bl2<j޿^Vq~^beAbmD Oz? 0. nўT>N?a "+?1QqJ .$^<0>@VF0 FбMZ[ H` 0Ɛq@E+,*$(3;M1` Aٿht).Enޑ?ŔB 9vi/`wn~F qWUB[o%!S װ<>//kUw+'0 Swpp1xKGO?w< b(^ĘQF=~GRCDRJ+Gv,R˗WScL=/bM@ETRM5 08NhXe͞EVZmݾ7nTLϟ8pX FXbƍ?F g5c'\ 6,dҥMFZj֎G(eEM8sށ8{4Zr͝?=8H2#wvcr䥟G^z[%+NΠB 8(#@D0.h#?@ .޸ÿDn{{?|'|Gn;_?|e~?~ 2(2P c_ֺ#8$q(Ђ 35} j =(0^9u] y!P͙Іb.#\7"]4e3(H}""  j%E?(B x@a)d^ A9,i6%x ҕ͓ByH4ҕ$UFS@#GgZvy.HVDjiQB[29Ug3B ,?B<"3H-;NZ3&^ҴC+,EC$E ~2QG  -  ,TaGF87%$X"@.}(mjiVɰem.E_4JơD_z0i5lfيvJkj_ڐI}bԼp*'2ߧV)R*[xMtX x=8x58oyE>r'GyUr!eus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5d6t789:;<=>?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklmnopq$r4sDtTudvtwxyz{|}~Ȁȁ$Ȃ4ȃDȄTȅdȆtȇȈȉȊȧȌȍȎȏɐɑ$ɒ4ɓDɔTɕdɖtɗɘəɚɛɜɝɞɟDp(!C$|ÒqFRPJef4 ʫJÉ9A!WF 1+Ds uA"rUx@{3?!A DWA vbL):"z.3zN;(F =@ :#EdD@\@@$>]fh-Ϛ?3#3OE@jaHxg ϝkDߟwR k(Y@@Ш&!#T2BCDiKO kS"@lOJ4) Z>b)*(IKGB<Y+C6ѳ+iD -Ӊ*=#;RT ʐ;N;.:Њ $( &[22t:3/YJq,2$zr+.;Q.s,\WP ԋ7 D +1iC;r5C~C追iD=#qg=eywG80#1Fp.8~}xE@>MGKN|:<-p2SۂuEj @*B7g^þ~i/Ka#AeqIAOuDMXO[L2FOcc4˦;2̾gWdKd=Ȫ>I*7hĻD O"5BZ/&( $:YgHû:g 0*!~3(!+ڢz1'F!HvA'NL'`De~."?I'2A#,=$rp1q#H(z"E-1P\5F6=Wԧw@JP0#pkb#"[Q Ė0&[>0$擌7'ILcA2 L@#'сHG?/`^Atڊi )\5d. GVrD Y!Nk]F-ABL ͈<>a?tw hd=@*(z^ЂyoN^vw [9F!u\k%r8A|?"DBה1wDx[RV"l$rڜ֌R?1tH ŖT 1Fgy1$5FᲈI#%H GcD CD X+JNЁ ! /~q?R"Q[[N WHL'-oD̚%EJ ,p(<ݣ 6#QT&Y@S铝H21 aT 3)u9-Eo32}g??=f* $O6@gtkH| =&\![H4'R>MAA%≬@ ^<|$reH qux{~dn$5N[o1wT9,+t)U`ƞڎ.&o7gYW'2wϠڌ%EUz@)`b/ 0+ӄ|; =p !<p%~K/<sg,Tx 0Cqf åhW4Tt|:Q ot ! Ar}=Bf atq&) 2 g &62o S@r4B6x1z-z}ŠQ8X=!=[AQ`A+A f§@bCqaA7$2h8>Y JfQ u8HhՐhl !ڰh{X)LX(uH;vMEGoՇtkeU<B%|g _!e'<9@{Io5 QM({0P vBFu+ [& '`k tQ1cq:YXn8#: i& P طFp ()VO /rsnv ck}qJ1htpx"@Pg@t9QCrI! Y`a*#|(*vE.=@] fǥ:Q=b:󄗡} 0 8paMq rInag>uy }?ai#&k#0 B|X Xej)b5 qpE_0t~@+9f;) :  ArO@!*H(ЛfKU1 u1\yHkZ6QPy9|f7vcc*g Qx&hGqy"8v7Nq+W}E(˒Ǚab cQ11x @ZR{j[ça (C:6T&0SHSr pѤR<Yp-*9rCAv-H:lR~ [Fzpz1E:vdF( UQp\pw4:1&C|1D=$Ct*y 1\JV =plmЕH;ay ah5ѭZ4)p:djmF;\h3?[E7hvtRu0r ௥$dojS;hֳA3С:?3/gqw?9)GzA7nLw5a`q94(D$BI q䰰V`'&Q :, 1q9<0 `?p pLnXYQLЅ%A #3D8@7_k\zk h@'ۚk  Cx`#/Qkk~ D .:knaн&TCBE5srm6%'&d5^? 4*[咱q!6 JjQ;lB-ߋ;fUv6Ƶ0!F(kaA4KCh,Ps -d=FҐ K(fc%5;tQ@Rp+~xU8 CAIFܶ!VҌ(x\GZOcA< B dؗQ~0lt=KzX3 CF B.`"<=-@ \ 0+~~'=a!=Wi+\ύ<3 @Qrݸfq#΀̀" ֡~80- b] u Qp `/w a *q bu I 7}iqM) |i*A{pn9q=?nBNfJA Bqr @a XN.Or@~ymQ z1A Ca+1*?2s 0p0o~@L7#*aޠ -nNj*1 tU)nϊ1ꤶK!05^=Rk=$ ,0 vP {t8w#졦 &>+ 3b *nza}*g#՚1@q"!SV.0AQF> pPlI $% u2H_CK tǡbDWQ1u j^O}Ni$d#A 2 %QmO.9P 0*޵@TCvw Gn?a׋@N] ~jQ}1\=+{uAfa@ 6p m/a2 LxqxaMnB=)_+x@`<` g??_?@/ď[iɣ'O rQD-^ĘQF=~RH%MDRJ-]S&;q`x"}3Ɔ;!DTRM>UTUP&xd.XAmJRGW\u6O8J@)+iCaѼ?Ydʕ.$-tHr=z.Ij֭]vBHC XZ.x"jōG\$@?CJFw[͟<'7j#*v(ejnB/@"e0A0;9ΰ.PJeSP*;tCGt* ;BċHIBFo1G%; w#* J8$1#9zrHAP&,EJ--nI%L$rK4dS%)Tڊ5B̳ϸh/lJ*UOEMMh4DD \$RT,,#T#Ӕ uRR_UNEէĴDD15Xa%XcE6YeeV0Yi6Yh6[m[o7\q%\sE7]ue]w߅7^y祷^{7_}_8`&`F8afa8b'b/8c7c?9d69GdOT&e_ƫdPvȁ9g:g3v:hȠR:i]Y1X:jW穯z$zi9k p&lF;mfm߆;nVWTnЛo'pG<c . T҈wr 4I50:h$VG ~')Btc)t>gt&d 0x,'>wwue,_fƧ# !%<v29F_B|S#\ ;@ِQ2pFXG$O"G̏x!H<ɐ2x.t2͆<$Lfrs(E| `[EPI4ƎT!XѷP"ݢ;#RCdVωd4pLb/D @CK%Rŧ2DH9̎CR9B# d(Р4kIΡ1wqG;bOv^P2r4vlH?8#,cɑ:v뼺<~:'c?k? v9C1kV)Qح` lRi:ǵY;*FƶaӤcCi~T ]uTMo͈iZZyb[CtϼAohu$7#E |1"_^D]|#zr!N3B6"kZLqJ K8?<G !7-F2N$7O6vrt=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5do6t789:;1(ǑEXc ̕;  FtG2/A$@D<{@Mܿa EHDT58PVtWqP1! , WH*\ȰÇ#JHŋ-jȱǏ CIɓ(S\ɲ˗01‚jիWo L*V<*YhQ7}*ӧPJJիX6`M>o zֳhӪ]˶۷pK.ϛ<~K* Ls*^̸ǐ#$w.*TBrn ,A7S},B&)'vJ'7{矁^V $v~i5j *MO3@m,A\Zi'2ZCS)rz[x] @L>aJ!$!)N"``I! %z*F7n(hv\gI"=c 4c"UdJnQNv( RI%𒌤&`2L-f kN )mt%$4ԘlRfʬ˨b\BvSW}՛L|)P"P뢋]"Sv%|Œ-UzrA[s=׽7f3Q] ܃4 {u<"h4$ + Kda}t64vFt^v# +jpAdS 㣎D#7A#'F3֌E/Qb} IG 2HBքO- I1Awm ;(f 9ɸƫh \,#!a j& ra '^~❧r2#N$_7Ȑ6bwùp(^H'u"m+t!EWbi=ff(a4b QD!5Xb IJI1 ՑS',HøZ}i^ C{\jՔb-C9E3A LNZbfĘ{8d~F%&D &p 7Q>0ȆRr RXf5$w RB/ dfZ~2$.aēPy&S7l5q;y4R!ZEIaP^|sRǟIASQRW$t C#:ъ^4oL&G8JTx,5:BA2 sEDJWҗv)3=(6©@eC&+x i,˖]˩ w־)t,SQSpdLwRxbt<ƪb* 3CId9P&fHN4>A f" PADɉ3RHhR<?}p#PEHMhA uxr1A~c:K Nɍ}AZ!n ?  @ dhDohz@=4w{<r {D Θ_wa@AB "sA}g͠ s/z1|@J ',jbGbIA Y@ h%܆a`  p#m5+4A<@afraf)(Ks70y6(H xVagrF@@LkvH bՙ雟s0_ʉ9_1 S[Bzfyf74 @ J!*%0.#k9$h >hvƇ)H0 P<Ȑ12z r pn]>'h) B"h5~qP you*Ҁp IuX [JDY9Đ=) 9ImV3 ` %ocaʨ Y;!P :9qIp}  DB2jS_r?ǫhZ` BZ :~?gԪjzJ |1*`J]ƇaDta􊂎ƚĤR)T:w PŭԕՕz@Wd@ Jp p 0"]4# ambZ &BVf tР9  |Aֱ pX*yjm*`d22B]k`ǴmZdil#U ;(/Đahʟ͖'v "#gM86u wܦrW6][j8>P J Kt[:k0\րl)"a뻓h8Q\ɠpg r!fzt䖋p0z U*;6q5p[r ^ۃJLN§۷Fvd `jyp)© 3(ɫ9Us ' B`]"$mв¸3ҹ=*'ff.(`ch%G,V|a EHƐ WHY} 'DZnȮk_ o tqs .p+3\@=.m{a N O =~t !N@GyHy@2P Q8FP4B{#zQ >n ;|w ͮGDP 3-B3# 5i i}`[;r$41 />  Д= #q{0 E  *GƋn=~2b# HQ>_*`?L8n8Gh] @@b[߆ z'/V/ F1 j28kp* hm@#, O ~_28~ 3 -@;)9nܿz;J^2OIaPC& iHm]>иn '\ F9ZhGf6`_E 6ܖ ef /FD '~+`^`tzg֪UR +V9jX+w߿;'ȉ0HΟ;+#56lX5GRnz5LQf֡cS,ǃ s#ń rD.UYyԛ]o i_ 1m~]1@,"\io}\s NGC%[3.:&D&0#CV,,$6E8C/j+(;jn<›## '] ؃:}~dz{sA_R:[x◳d~ل4=<%OI1T*Ì'IBvŒI,A]OgK}kT)5\Q@zYkL]>9 LQ)TIL!M弯NbkӝCNJD?r,44C'12:׽[iΨJ򐇪z +x@!$j$HH )+Ӥ,bh؇E-3@|Lpnysȸ d"Xwq) D@},~$3ts8g9L:E }b /JWd1D(=D 9EIKQU/H3)@+HlR^P͔]Ce <)=?4tDWRc(8 P>@xQ:p)^B5@YlA~B-_uD'H ^h S,Q"C<= YK:٩d.?D;?#%#32K)p'#H+ 0 v;0d5P4''+X Ds~xr%C @HH /,\a#m!pSKS O kJ\b\SoG\r5k TʇI@A @&;юqHˊ J? ^@$($DRuY*:U ~7J S_Z$ ~FZb!GJ xXo roj u(l.@-ٲxI+T'KJ-Xef8-G)sNdnG|Y`FmG1d*3 R֑zcbjV0ߪ@p  6< TW9AWb}S$A{7? .h?1msLd9;G ) @0"C(B : :L~\;$!A=? ", +e"o3<6́?HLHqrH/ΑԞÅj)+: BxΕ}$40^P#]|3ģ5cR$G[yc^x) ysf 5jxJZrG! |µN& &^V%bqU 8F(HA Κlv`.\UvʺtH^ԁo+PYҎ9bx\ۻi1 <6`Pnڠw5'.O+=$;h?0YtґTC)0CjRA|8H5C]Kd̃sQmw*a~/]$a53",qYRE@LX$&TC:J N@G=΃m޽ kX5> 11S?puAR(AԉxՉ wr#O`,0h|xRŴ! qD0` ]?=`7MT8;2!zsG2Q0(>Sr>>_؂'@|Gl 72U8G9X8;`ьq0I,X5أr6%k`fP)jS SF|xy0߲#X( 2qSMIÈA5*n/ 8P:Bt2=iP{P-=ZRWU9eOP "N8C`8 rQ|2ՄR U8%훇pٗ= #S 'U(u)%*} s aҺĎ TTh5*6%Hʀ=(5HM8ۓI:b (4mMnԽPNRQ 89( (H5p\Kf @M>ʥ'Vc<%tպH_hДbFb59xjaߒ[ U^UfDh%bi _98ŸUp\:ȼ TZ(RhoY8p`ĀS o+ _Xљ C~cRlZ3)Dj0A w3pA׻epkddObPH9R,t`%)8MџY7hh3K Ȁ BwHm(s2L3 f&Tgvٖݒ-AޮфbRRݦmsA{^05CPej̽xtZ P4"T]$"t8K82(s18xٙʘ'CX>dHI>3`)p7 "$Y-ofO@HsT/mRB8c M.48+I`"F-'CGI";{cH;q~ḨͦtBmGqt>1Cy))pɜ0 PXJ$N]}Pp8iBk25F"J>[BU9OX,Є^?/gX^@Hj91_` JaGD@T*3A>ذ ALm @T2|BnhhDH>$:TVShIvvQ 'X@&vkE#ExS1r ~l.S Cj$};E?,dΚ@pNQwrs<ɻyhph1\Hsgه? ԃ E?P F_X35p!goц ?0g8)1q|SxIa!a@j)I6Ё-pa #9Th5=DJ@9^!rBxxA SΆ,X,`pvM'!;Gg9u3Ypw!I$YHH@H|h-^_MV coa8_fthMFClk`d;MK4xo1-E<lB`t]UT % ݼӧo޹yphܹ ϟa\БBf* I^C:MTmR&4@N~*Q6(CxNLʐ+-8ugWbIt趤A%.LP't)_!h0[,[7s^%7~ks[V͐A &?}vya/ǴaYO֔Q时譺r"E<|R ]]Z cr*TS}JH "x%H0AaDŽ,HZIFe r \@Ҍ5tzI]0 */ERJO{enݲJ-7OCy&!6VzQl|tO! wLwey&in9&j Sq xyAƹD+i&B N jC ~5۠NPI%X#<,֏Z f _x@v%e?hI2BJB YҐ!MX>c"QqNH"Ya7\YgV*m8rEw9ׂyav D"^xe3E\YqCJZdApP<[O0BVqIry\$&G5#ׇ8zVFg ('_*ه~T.S4?HBYx 6xN,| qS:h5czhG?HJC@;e8j &yOjU",W43L@c֨LOTN0I8DDpM:EJSBޠE㾙4M_GSD4L@TΚt_w Tқ:Ld LWsRW`ZN2lrf N`$sYϚG:K`і) 8\bDx 3T{z5"f`" YH!L*2! ,΁-ZC^<*6ƆSI{qbkEaL> .8F "~K&` kW H7( J-o}N@)EN(ސF*JF25҈L3pthi૆?:0RKmg=zpB׾"Gא2 @MP `+9ܘ̄Ci~iE3tG>C3=6 @!HBVٽ"N`-AOѤt4-sA[z~.Q=3JyA=3c&,J/,1-6#}A᱓t#Yi:ȡ}(| c\f'hf@Ѓf".1D[PLJk؎DP ~BG09PA HWch+E*B\PFTPKjRuNDrz'xG-j1EjɌe éЈGTG{.jcZ=yY1>moxgC^$};VNJ޿8D S++8}L$ {EqS?8(T`a'-z2xC `-ᙙM-XDT̩Vd ڛ=䂾QB0$^6T Ȋ @A?i^@G.|H3@-<ّ]K>XD&f0  H!F%F (^B ;C=qaIġ'6JxOFNaB5:`3`¸봃cȞ\,aSE!㠐N i#\chC;sm Y,܁J3\s\Dp.=*_у9(H"܁dC1NPA C6<<8WRTƴi Re-͸B2]AG `Z!"@,GSN}ؤiFaNI mf(lEJIH>0%4 dC&^9336$ _?C0߽B.\|T OvPVJTD8F$Z1-3h"a:,hYh[\DfafDeb E@tjԽB0B`N$^8;Ii<< q?epă[I82E/h5@$ ʤ.9Y49gj- 4\C!PE tPC,B6$0ؚ`Ȧ?,#Tt8$ %| NqB.8l؏C;|fXeN9C6ؚdC<pL!(Ic5 CljcҔސf܁L$0`=8D %sJ"fnx&H&*jD%jPttPz9 KCHs̈́c,lBAC:=C"gq`>4$+B}B`\),2X=ȶ)5-<() `NԲxjEi W-4 Cւ-]3)m⩉BQBX;hko0jمEP@H&afi*Hl2,ΚbQBGJ #%ip-~m.,L)lFP+D5 %LTs"bo8C6.4<.~ZnH*l!L"lXJ<+no?nBK#+Qa̫nq/.B l! 2 /ܢ(lVƷI.hBUD"4D (&ɒn j$Bg.:İ-t~xZZC/؃-l`.LӲ:`2@Ę=h"ܙГ m/-B^RBKF m=IWJ8Y)%+ +H4CO.7=!n:& =Z:gsT BXn%bB" G;f=t.3zq2D"=18 b[*,1 P:Fiƃ#Cۂ,TejF1^oʌ0"A/I~q}W>xZ*[h?2BA=h`,B*|(C*]X8ҪE,= D+.ý,30hlq%TB!ACB׃9ف2E]Q=D204Ta$.EUGR3$tCStVEw[FqV0C&n"NgJރ&Z%[YY&T4Bc^F55!QWR[ƑSsě/=VS8܂-Ŷmf-4O'4tZ KwmV8ʕ:c2$9=h2I3Ù@s,Hf9 YB4#Y$Rt_o}i8oCI%reNi#;H3lSFGLH*7w][=9w2iMY'X+M߶@8pǯq1uXw4Vv:8d%=󥛑piMj%N3CRT`OnqҚ*(vǰ-Wh’x4UKhfksvÀI;tCj*@?nuOIʚzD"LC#C2Ld:VfX;|tGO 8lCt)@6 ÄLz7Mm++짣st.Dd39yZA#e(U6!B:[1b|i1Vį_ZF OB/HC_hT;oK4(-oLK;IntR4s!KOKڏTf4o衱>ɨEmZV3Sl@.kQSk$Y1tJ>]ZYQHω83ˎ?I6SUfeVUUFs̊ vaѬuKYA k>:ix*"K7<ӏ^[УYPt^bۼƇJӸ!m%c9fB蜢9:"fM^\ ҚrEX/ Vc&TDAJXHC8? Q$d&w/uK,ɒ<+8z@X3[EEa 5'\%E49Dq((s1BdB5at︆G#xK*״!HAPqfw XED&pܸTv+a_Nx-leHC:߀H"V\,jAJ<ȀJ3w>1 byXG Z7Ƞ4N1WrG>.F@o5HۙƮ)s:bNwbA)~X6e)* qPI ʍtՕ](ߗ$+` fC"0*-c@3zKƪ0v]sfw|3ˮŠIUc3bs[₆T+7 k}{[65Nq:>^31IfKn =!_z _}Py0p /'!/ Ȁ$k,p9=8` $b g DРڏz.l f.(pn`zEn}y P  @@\{tʸf¶ l~ A 3P3@ 00a3H  C {F9pb 1 bH|/" -E8wB@<"1 c$m/cy 3-p ]qQ2q#`l Р+xFJsm``//~Ӑ[-Ŧڀ`7(^Y>"@ J3  "ɤ>*H$` 6 ?6fLr#X .,L2 CH &N2@`lƣ#\ Kd&Uf 'TQHjՠ2B" @  [r.1r/@q#@ Ē`x%V@ 0Ⱦ:`Hj10@ @ r`j 08> @b+">\  h?!G4垲/R,a! ,!, RA3I RHp`j6`%R.2H$AA:GR" DR)'0IR˾h !` Sj/,/,S!-2 />_ڠ#v  |xR sD` Zp\cm E$Q3sʱ, 97G)2$F f-~] z3$ $ $_5Eń. T.@ K/25&.A)FJ=%/>_R>О`q  NQ9Ѿ4$sH³#@WQ݌@6  JM?fA1DQ `` +@]  _$OTl.k@H*@ 6B(*!#zrRTKg+l`J;8HN{Xni!n3u_ @` `\3@  @"\b @Ra\`_\ 6Sr@ =Y` 8B=>B=r@` b3  Va5iim qK7hvAVkSHaQ& ,!U- eAO ~ WR \X%! X V#}lHS5sn l+VԻ m!s FUª^1I @R @ $ lV 6h% (!@@,"y`n,S7.:@aw}1`x CSYs_f,a, |"SbwE,@}LX3}_.:fq6v ՓL @%@\~- W18tHaXbvZUA h؆qX d-!1@2 zW DTEͰj@q4 `A+OUs yy*w^F7`*3 0 4oAv`#wy-=fhJ!!R6 "[J``# a9Sa `#a\/x A!p#A8Q@tAy\7X-#A`SI[YSAUY\8$-?buq;uV! `#T\ST2`28; -MOc7" 8z @,87H@rQ9<@ vtKSTo7rT`@t1 ( @2#| 2cg/9g}#f)8#AcYuR tju9$rH3CԀC d]F0 2dB;/bOQҀoʵvow:L4/:Q7v[شcA=AodSVDg5a`fDo?"앺$!ֺR~u X/{DAsxSaB_E /@֕qZez3- ~`.#92su@xG2;$|Sbr>3o p{ z`Ul>Gnu @tu\\6Mך5~3_09nZ"`@ʛ\ṶG  m# \SX (P[+na;Y`:>Z.U+oY/{n`Ӂ+o 2bHH·d69] թxA\ d{Z|]03 8X ,3 vW4īpsr`#j56wa  cg6ѓao!!˼W=Z^Y/,vpg@,Aoroj\?+]n!-/̿C4H!Dmwa/~'I-A0^]^-9Bb7 =[t |;&4%ao!z#4e `+-aoi0 ` ` ~`8vXoyX4BtE 6" _~/dbsȓ/Z{$ع4$.`j5dRA`_ۧjy8ke vݹҠiqN~ƙeVUYMczҮK>l"9ZmE<'fx? ȕA4 b. '!љV9v"Ur(@έTs BT30pā;zc*tP")'HuDQ tC\j@`@D 8Љ猤3% zL9RpA~E#Nd`%r!!Y5гi sBcx% Dd X8A :ѤKwEʴլ[~1@=y)ۦwdû7hG.VG9%:m*jh }SUz_Opd[ɻ}]gYG KPE}ΥFHeW] d@G ,h`U"(rbkb6F[6&mf[hąh_xQxJ[HdG1Gw! u &ziheB%tIx%vQ{e%͹Yrt^q"}e]}!ޖg&Z,<'"B!vw7~ jJjZzlo\A8%妥k lwJzl. *dFW(Ynm~ jXzn枋niwdhk[`΋o1oM,Y'k[OLqf]qo̱ r"Lrrr*clr. s2 Ҍs:s=sBMtFtJ/tN? uROMuV_uZou^ vbMvfvjvn wrMwvߍwzw~ xNxx/x?y3_quFpD\sN誯glN{Gg81G{?.Od^|9/}z_}o}~O~柏~O+%>ߏ71 c X l 7q#H6$ i7H  g :;;-~X?*P5 14Cg8Cl9@~"BEa"F0GKUdA_#5&npHG; Wࣻ7Ԁ#0bm8H`&?)##HC9 4#:rʗ)#ظ,W(0di@9}TΓ,_*Ie&2yHbj0)z&ѥ,y< iiGџk|駪@#~&kJ AGNu@=M!H=2QRB2-hAJ?bo Uz ];CU`+6AE ּT1TB r]"bէUy=#`sH) @^Q7~ ّt34P|5LQ݊" 0(Z-y.8OeGl 蘱i~4؁&NJΡAʉzaKwnM+]7|uKMkҰ6fl]Oz5uئ 38jX;jU6=՘9DKǛ&jU4rx?}o 2܌0n/:]0?򐋼dO|,o_|4om;<{i y,i -.M"~!$ >+&~..i02h-1;7ACNG>}2nJI).S^kUnFYOZ1~^dfnh>jln>Xrtvx[K.MpNㆾ㈎z>^~蒞蔾|H聎鞮雞\^ꤎ⦞N^n㸎ᶞ.뻮>^~ʞ >^~ڞ=^}=^}=_} ͽ=_}"=&_}*.2=6߿V?A/COEoqIKMOQ/SOUoWY[]_a/cOeogi]/moq/sOuowy{/:/*s3%Oc3r5$1,)1._1-,nܒ_.u k/Oox! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂r̉@mJѣH*]ʴӡpi_ރ/>YA6>,iEAW-$\<Ҿ~_A7 _a "S@Ҵ|q;2d'ks %p@l(#`\9$@^Sh}/:x!x^ thaQH:ћCya19rd;=|C}ԣ ̀1 @= ddJ Ȝ?(ΉI -Bd$ƈVa*AE =XACw47iB j "Cc` 1 CfG;)kZNRDԐ*d7J@u΄+OWä;qB4~ Q-+<B9}n3bDHA$G uCU H4hH$dt,?5aB-vmԘUgAl }hȰ4 $<`sԄSt5[LG;Ar4\V¹h!z"\wVP5Gc[:-DgQZ3taɈ&HRLaAk0)-!Yhv=!)bc#wһ24LHPVjiOrS w*8 tz]Z(qIv (>j. ٬&l^Q1mzR.:䚔 "T kH; @@3j `0N:S w nJ +hѝu!"^OF$n^"Ln 5ƸSV9"xYsxȠ\[N$ĺ{z]c%;H ^+2X(݄ޔwJĭ#6{dEn2y+9}!QbzrP|/ub(դWi9ƾ@DTLj7!t*d@rG%O ~&_eel>~ۇJ֘GZͤkz $|l:v5l^{Jv>cIȜ)))T|f-$]Kݼ4$y]rqrCPH'"rn4dv 5@>Oаr|R^۞Pp 돞ϪܜředFᅌ8<8@xaVP\ 5Q8i|ъ`G|XyI^Փ\j 4?p''HuyH֊HOHpvuaG6 րMA՜5,N<[?;H>ExpB8 ]lqxss` P@kWl !Lz ,FguMP}$H[XToqU_>( ȀTcr} - CGs`>r%5{F`eBdY:=kxa. #>gAGا%a4tTFXFh{o-lXƄO_f`7 O?:0 & S!!yX"}Xr40'@F(JT08(H} Av,K2v 'b li\}ɣa;Hf@(1r-2 r I@%3 DYS =Ӈ]=h~ CNxO`tUҦy8gpٰWFoh=X6_H0~(D-lAf<I*Qd @W I'xH}!.~}Ge(Nrt[(}GISft{pG7>42DGFG%! hq(\g Q9tFtUׄB`*g ukg0JkEh=GkpAxԸU9r%P A/Ga(:a|8zZHu1PQ m[9)T)x ZsXKB(5yp"2#&@3Mp e zs`+'4XEL0j꓉S! z  "Y2X+z2r[ >)!ٳ/#>u !VU!j'acN   rcaFR @UY$VQ24@y!I@jtk* Vna0(6>}C ϰ1 mFf c ' J!  K 4&&0)&l|҆!f#c2wm*2'XPf  '2ԍ躤)WƎ9SV Q#Cd9Z~JC  Z))p8 L|>H͖  {$bxY7׉  Qx5YyOK4yxGr&(p;%Vn)tԅP γ|bV>Гy1!rlDQTUP[aL:gE)6$“  *勾;D`Nַ~z $;1%*'Z@eAuY0节g4?1ah)p{L* `@`&wd۳J #LWClw ,hLkG⹑` aɷϐ'q_dY8x`ȝYr @Kc0Z@7}NKrODXuY,xY1;F3ʾۿ FV_tV)">MLa(Y հ͑Q6"3̹ƧZ jƂl{ Lj c3WKT`H+Ы♑ o9N){A0 M 7pl7hחg]:OL>@@gM) Mh+8yA6Mwbε>5, 8nO\i8##Nqܔԯrܮel| Q4ӭ'RA^L bڰbZWd&q  G8L1~>q0}ON-<|pF||T*.`N`/vO 'd ?X #8F8A-*4$Ym>߀P*IJ-  r?MYmF( &ع -! ) ыO&VkKvz!,LQU`%zb \+NXKvKv\V*#S 2tqг`+@iH Qk`0L( _G+F-],#FE@{&eDtIb͝:~c˃+'N .'|%ГRz hˇm'F8R/1 tb80P9U 0m\nY()ɒI&K[؁n.h; t)uێٳ0Zr  <9p^~$}\@G B{fjv8YG=t~0sgyܹ ֒n[(~+0o^Y 02 b-,ɟ苬$9+ >@ ~:p'y ﯏Dt0@![jY:XJ`J$,{)PAK-T&⦞^{+"pZ I." ʫE ><'OSt#7 1@'@up w9  002IІ3q  $H(k)8`q2 @& `+& aԹs-{_8Z]jpI>DH[S(k:"<'sFy~GT,8π_BX"++; AБHqN*'"(WG1( N"(D385 BaC5$12]D0ěh XA૑#(ȖяIfKr9rXΡOdX,  &Iߓ$IqBH52:d@*6tJ;τrKpT擛><FsO%)wh+K2ؚ[wRnNjd qGcAH Ҵ<>iU,@ૡ0Q%Ǘl!IN6Tc3N{s| HNJX`vaPđ9عGL؉pfF)٩O۵YA=3LNGM ^{5)&*xLC@ͼ;GCB8[)cZ^pTםppB8 L }lI[O'%XC{p[ A/^|b0L Jq >]?mPAXHe[)^4Gw%=Fd K& K^_ V_cd紆\$Six][pe.''ˏ-\f'OJe9HjRo97j:WBv5LnG<H1 4#IZCB E=UcK7Cf$^phn:lsϵ m2[̒dP7]XZȻi["'bAa -٦7 .g\s|4.ΡS2ə|Zh.ueȜ8R 9v#+ p%ph^xyLI'LD,^%g%wآ\6ڟؐ?{R3)43%+=򿖠roQ)9xӃ#K" Q' 2 sУPP Z5I<Eʃ;HAy&5zȇNAA ʲT(.@ӝXм3@+F "фD:+F#tJ-фJPȅl db|—W=L) S2)#0d4{! q XG*c z=t:&`#Aã_@|>I4FȀqJ,DJD@ &1L DLI(ʧYIEBCCc0N>ɠ̝p$L, =Fŧ6$sPFd@Lty @oK)Wd 8oh$NE|Q QCƳ-)Ŕ<*+ň^ʦYj=z*\,^ܖ E8!/$F`АZ豚yЊ`ݢGZK"idm Um }#XŊ Q[Xbo؇BsCe=Pu kHh+q0V>)TZ.uԷąUZl8QTcHJUd*9 U?R jַĈ|X,~h~)kYUx݉2b̃F`|3  ꞁhI;$8a ܗ+`ʟP픂 Zmuѝ=\8QͦɮEZ:>M} =MUӁpx DA,s4Ѓ æ-|Rr U 3)r bER` =DWc dh+z> t ek@34!q6|ށxƹ nR6@eU&D&[UXWa^c aF1٫`Hy#I-d+ dDI)cƔp 3dfP@Vf`pCN da8} pMG~ J=xdfd{&.ee.(hz6(It-ӖOB _=e\zeb,q>\j!cDvgSBRX E9 )܂E  `Pܺ0Q `@Xؒ#v (H RZH`@/T?ghD4q := ĦQfllɀk][`hFgO|x.VQhc n R) `gR10>XHlԦBՆ=È\xjE\fK$(ilu[ȅP낐7 ۚޣVk0T` ] ("lN4>&%ȀFlĂB􅇺сH Z Vlp[,"И GZ =fRnh[̣މNX^@/smW=` z0gŗٞnwOmVb\ٶ>~j iB X>>1)ph6B;.BESF~S8bg|;G"Pv tr!#X x!a=ԁBǁA1pYSW-]*tN8p"RE]m$ч!pv9#AdX c)X=jEoe[SP.^i[j[9&LHH&m&q9g*I'y'}'NyF (袉:(JZZZ"^)z):*z***:+z+++ ;,{,*,:,J;-Z{-j-z-;.{.骻..;/{//6sN L +|.9Q@퐳0g{8gX1ڒAm1%#B a2-;.Ӯꥻ#,ȚoA={ʉÛy߮"^?@<_A,}L#JCP9k>%;\9ˍ}o4@Say+`;=b_ #nF{x@0~ nB` hAdbJȒڭ6d`) a :.cv;rˈ?fD4@@tc J`:qbƈ N܈>?Ir1 G㨗ƶY&|\?t02 BT2'_@"!mEu p *Os#/94Z\ ' +`Ji},a $L%^ Hi@ q8xmp _tXQN&&, qbB9aUZR gɒ~T&$BHw +.I>A DI @?"$1$ ύ2CPn|!AI`0@#HF GPՄ$- 8ʄ?юn oe P`JTLC%B jD |2G&;XS fJՕd" 7WwRuaspUR#*_INFOD5N4v$6vrpWIEĆ]Ǹ$s gqϾҔE:qC ،v gTP{HAҎf&KH5Qilik49 I9(*PI8bR11Kid;E/c%+m·$ SD_ԙ2q"|+օC!ڒУ&rI e xظ?ċ<1AR^a)L%4$ 'S&S\|`eu-nf̭s 33Ӭ5n~3,9ӹv3=~3-AІ>4E3ю~4#-ISҖ43MsӞ4C-QԦ>5SUծ~5c-YӺֶ5s]׾5-a>6e3~6-iS־6ms6-q>7ӭu~7-yӻ7}7.?838#.S83s8C.򑓼&?9S򕳼.9c.Ӽ69s>9Ѓ.F?:ғ3N:ԣ.SV:ֳs^:.f?;Ӯn;.ӽv;~;/?<3<#/S<3sNbBp k .`eC_Jp#P?+<_>Ogd⇓}_)WDŇJ1I´k$b-BFdPeKLhJJd _ʄu@F A`` Eh}G|FAAApAʄ 8J@ʸADXDW_4SFĂhSEDRAt8YDRIJ)`\S)0@ @ iAHM|RLEA@D #FԓDD($CE`&HH|bYp! 0 @XJ\@ ]'$/Jl!GIvHwhD,^E.ш&F*Bh12#&2H@"8S4RX!tc@AE#dp=J9VH棐d? b ^֧8NmW(A DFaYDvJE.EBJFjF&JG~$0?x?xHHW$OJoQԤiؙ]Mx^SNa$A) NN^3"^QFehSM0YPdiJ 1pFhOCJg%@Od4AeJ[N8U^Q2@6DV0M [L8EO6]&%4UfXJJfN?C.@~,)*` (0E(iR 'O@ 4 ,j3X@;D d-V:oZچs@,$.k8Xp,V[ Ao:<8@xꗥbgxFqZʧ 8xo?8,* 9؏րKB.yfNp2,j^Hʮ岨r3r`2L,sydNK D3?3`0sN&55lft38{839_ :smd\%N:e?8%gD3AwV&fֳ='@! )YjFtAZ%?dC-Hf2JDKgYAMҁH\fۀI4^(?H[A[1p4́H$I4NECCZc9H(ROAhkO&n@`F7w+g0l(N%>:xifG`ZRE~;@P jVqql<m!8P ,w($DBw$tIuإaD~8Sw3~bA 5tA"BD(ucQDbXOGPTؑ=Շ:-Gh>@}bBvoݲ$HL-6`TJBLHD(b AZ"C,Dhr.295U+2T pXyaZS Hgf>"B0q= aq4G&j, IKmƥC=&AKekӶj*:5B֐HSR: ĥTИ %ՉP59 1(--> #JeK?H4 F - dM5 $l-GHM.O?> 4|B:̐;!`cqP9pyStW9J. yKC<jJ 7yN '>DwkD@hP>9wx4B^"C$1뎒 ]gA_N ?isT~YaP>HL۰2X%d KIH4S|91èXgO!Rs(=c* y 8j-Ov#O{/GDQzIHʤf(;+Vr }WQ4t+VG!}Iy#u4B>~9l` =h 1Gt2A, $]䥠 hBs &и_nE*DVkM~v1 .'!b5J;<a87!+Ȑ:eS-=;ǂ &H*ҩB(Bf(j}Rq!.%E 9RHBkIr\~!ΚN$+q.Wʼn D1v B딦)BNPdP'93B)℁RoSWBO$vf1V,-w"ef`!E>qbF :tc]Ig}Ej*DgBA8A!SK{9(r7P|"v2I$J͘S!8JX @}88=kinä:_ZHA b9Tgu! q)m[+.H0-s pWhQg_41RF3x tKpSq5z֫:An HFsJ#‘CB" sE8j!|R,b#>ON}w@q6N$H CGJ}Bf],(2AkC)$n1+ s "@#P(@ {)~ E`BCx)@ &@08&&v"Ђ!R~ "~C'\‡r:8 Pja t9' `>&=Gd}7H'\-q~p#jQknWpy^!;a1 *2tt Z$:Ф0[- 5C pi(My51brMazQ2 1:*TF;J$h^àhw=v/Nja}4itq"1QB7 7PCè% k!dwnbQh;@XL떈Q !X\$S8>B\T{r6_Q!0d 'XGwe &717Kq"qG4Oqƅj36U?4QJӌ!(\W"KE7LK=d Q VPt'8 awG[\?#pw@=SG\1hlKq!! R bBbI׏ۃPVdQW,r&$p}a0ڀJ/Jq7 gO?W{/x7P[5ZI&tTؕ 1_v0UU*$p!DЈ}WyYw~Pb,yC$Zp) 7 鎡)"[֙B uO|zp̥I9(!d `u ^ @tY0JMwGq(sf6p yM&H/|?j !G47Z!RhMDpV gQp&Q_8} 1Z?bL+|5Ur`nz`yUb 峋W?a9 UGqHF &Q)[Q:?ah( 2 '3uLT7D (:g~:vtK: Ј:vB8eȘp{$Oj`+ѩqy݈JArwi$Q^?Q{t L 8Ca N ݪ:S}D' A7O&Hw@gMG1G)7PEqn4p[s|{YS^ѓ01ތv/%Nz6 }Z}[Ր/TEsY^ҧ )ͪH"ᓅ`Y:(ԲOaqG1i 9dn-CEA $`oO2MԜnmWu"P?* KF9Rȗ;:yN[S+N|aN՚`d `@z};MTp!J$+gL`{Q 9]P P-b=gL A|] gS[ 7ÍE6ɗ dجޘ#)șh&L1+-Ru@sbCxyP 73t`` zWq(jGS > ewTavU`:'kcwgp:7pFjqKZ vMcQ~7-C1^<"Tf-M  dn^) c~>WM `Fɧh0ni(n^ !2 FBWW8q~|pP vE*#G<| ^\uo+++F%j2N6jg3}KO rI~,17-I A[Q(AW1 @dj#^]*>gХR+:dmBX>Y2qԇrc?G_[ }|& DZn:q`"WvF[. rIn ]&q#>tcr.P ,\rp7_5ܪ%NQ\^!' OF1791/6@o Q(q2|u/ gS4PBL q  BBaN)NK3#tN@L7~Ҹu&Sz,NЧ!A L>qi?C*Bɠ+t- P ؠo*QF4 exO7$WpVJ=J'@Sh( ꃨo?-U05?! rH Yx\K4SZUSN!7y1(Zz IQiON rˁD]  sW2`dIu ‘*Du߁ZN_PZIqɟce(f:̲#ׁ'ϝzqS7S}"(5hfީ`CwҪEcLtw;~NEȑJF>bΔ@M0 2D'-ZJ6Ir4pc}B ; 0BAv* jΟy|곋h#,ҌÐX{-^6TbM7.j}qQtszR0dJ#zjKz.$ӡ/-BO=2HKy& k害e0N2; 1A S"e1JC/ŔP,8Kt3婡:μƪjVgKq %I"HyN-JfGi#+M+.wT#բgvj3r3dZ,s$S[+T·;OtpȯJ%SSETmVGP(%Fdc6_BBe%XQj3LTР)ovhmlNw>Ⴀ!zA-tMk@"y )%~+<,H@b&"q"zN~.D;1֤x ],Z'?ŐPˌBbC,CX[JĒ[T݁,!hbXM.Z$ѤC␞u:=e 4[T< @B񁆋˛}w?}i/ADHq!ddXw!كw1PAtxPc!ts4  MN n!ͣlql5N!bs;aH_.t )#L]r.KEQ"{ m"ˆ@‖-'(H[<"AHwx݅GQ']4"v$FkR\"#)ѫ(4k#S)vZj;g͙D:$+bDA)$l nxJHOX)6U @:8J&Faڥ":f2ip!E5C(9=,#$j zyN/A܇ck숃.HE<!DA23D |mⓉNRPe:;ȏSIÑj0_FNʩNzR@ǝ!Zƕ.u%EVtMH,4Ys EE#ȍrwQFς(Ƀ,SH%nYK^rL<,Sk|'YI*?mф6A2N0[2ք8I0uN!x!lm"@~JG$+ҹR6xr;̶HC95N]\ثW3"ic`u8؋V#n $Z֌nZ!ߞ)x Sr$bh`/>' ~kWD\#/6zk0ݭ mܞ]pC5Q1vuܑ.t4gF4 ;^-ʦ@OFHzurrFe?NPsvJ`sռf6osX@wsg> RgBЇFtM^,]t%,Oҗl؋iNwzҤxE=s.f#!ԯ5Xltx!÷v=lbcju@AiݑJz[3yf3վJ]lno۝r22M =vm =H{[ - އzvHHqpz7^_$BQ mp[d@s89<LeWԣ9s`zudyu2k5=sR1S:_ ˨{ڜC2wl[(뇺C*FcJ  t= cq~7 Dt}:;k]?thRs Մzʆ)@}-@)OLנW| @_ 8P;ω; 'I*.C&nB~hgَc=9bgJAIeCJ:'Po&cw|BOHُtz~6˻DG+|33Td@B 0 @E@ 4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5d6sx79̳$;<:=d3r %Á^B4Ħ"p CdF3pKGJ$E+"MK!EPE<SDEHlHVtWXYZ[\]^d{6aL– FbDdTedftg 1p=jl߰m#6! Gn$ǂsH B(vcsxLBxz$B?|\|t{GǕG&dGp2y884\4Ph+ \)ƙV$u\"@ȏA84;pH`Tɚ|2sK+Q3?@A&B6CFDVEfFvGHIJKLMNOPQ&Rc/SnqTeim#_eM[7].b3 b6cFf3df)f* ysj3be7AXUAsJX`gfh>UU7U<3?vTʦT;Ff}$29-P45BhnN(=chyhXh V&{#@0U+Shm&鞸 8ikY +(F{PCf&j:4-jσ'ѯ| [FV뵖߳ґaJԲ>Ti5 k2ÈNKpx5|uH [95|!YF}eώRҖV@UX99M vkN>nm@y y6qk&* e w 5POFVSq+0:n-poPnm$eVmXdMv\G8 귮T Gl mR 8n>kfe7{@v:d{ > 7mE mfNqk`̰mYnTP6 T@馉o4F$oPsH[qXpǿphBysX/D gwr PFD:O3}Au>SfnA_V_YZ[\>YІx]oCa@hdwMcqgM!TIICgx`v!ʝ$y5u''3 Կ' ӬL=0[UvؘnPoxdy ۑ7GWgw'7GWgw'7GWgw'7GWgwLJȗɧʷ'7GWg}&jOgwk?݃jj5yv>y47uV&"~ ]+z! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸LPA̹3c:lf-ii!ӧed(@"EU"S2K‚EƲI~qIvP}Q S rI|[HFKDX$եG_J$f,cBTfAK7{BŊ`棌a 5<P %U*_Am~4gY3US١i5:(W|izv%>"YЖ 'By<#4j"4ňfkOmѨ8iBS+o,?O$-2F3*57 ;䫐=$%kPuJNTmKJ7L} ?%ALj l?˂u2ND?IJ,4T,нͤrO(41}T;gE)-A:zcSDzm@fO?<OY-Q]+R i-סDOժ=7ќ/57C~2:#wSqoCD `T琗=H6>gDY MD4ҭ$;щB@&@Iu Y/ oVq4t0G>ؑA%!EA팰dpALGz}d&&q$ %0l)S  UfB*I Et-=cGTa1rgFLY1 1k`ORH$q,!?2GE+>$8ZG|'߈r qc "= w^qI>!.v؎ AHX@1$,Mrr%'`]1%*ؐpai@rΆrxY(^/_0d R.w ; 9~! #?З;V#+S2E+8RH"PZt^RIx ŖA<#PPf6AINDi9GGP!$WRZiS&D@#_؈AZCQKMGUL#(0*Q=IJ#5{]͵ 0ZT>rD!2Ki!%*zkuhsx5ҙ?Nv!UBڐNdS$Lv2b %Ie"Hg: :Աc(T`Wٜv!jHPʬBAόkR&X,`"0G%YĐvDllGzhԾEk1T ;[ H|+dvA 5(Pe[!·<QDD+ChC$·;CG [mxGX/$_B8,Deg +z-THf(,W9]sQ2w|<9Ymb񐘜g+>KtѺw:4 GV3bt҄!;+B8}2NP&DI.E%0C'[ ;: "e~Y"eW0da X8֯<CK;*VkWRkLpDБ`"+ z2d`EB:`4[7_3a@6>S{Sy Rg}CEgq|'TzC `"x>6tz5~v ~g/W!;٦Z(j C3 @+i/Q4F1P >8V wvAJ{ʸ* s* i.=< DTG}q X'.S{r 2e8dYyGqb1%4vLd&u D @ a`p16Db/^p"u{⑒E s !PiA u& P Gcp %9YO Zr& vLIB=-8F#hO؛ ᖿi% 7xؒVbY`y *fR x557YnI mH#a> ѡ )o=ZE@9y6sFX |W$CrpRQiugH7Њa`S.RƢ }P *Ui3:qz0@AUqj2C5Btq'x } YcQe&!T QXNq\Xif2#0*z4:ƸZ*pRܩ.jVa[21 ֧{JzzƥI,$w +8Z34Y %0 o ZG엍@*jwa!WTDe :E0MdXr`C,aT.,ѤJEp s'c1 qp>RAEuoi5Ft`^@hMq"[!Qf"!wћ6K\d !+&/8L )f8k4Sj4ozzR)´" q q0RI jy ]#Q=2B&*=t/WϪTy a^ pRc bTAJ^WzkeSٽ)1k/r" >z CVnqczq2@LLabfyxAeӻ|I(1 8٦_`ѰUSڑ$c+N lra Nu|BaIALo*Rd:cA DFmMi Hzr=>{@u qYE%aK46`,ێfšفEux'ƽ@!TV3P| T%3o |\khRh}cQ|pDh4IOe i=rFJ+G<:e%wPzp? [Be'T0 V|,l qOQ3 T d2Ml ͽU̵_'dPT?qrF-5CsH5 w$ypd$Ru/E?<ǥ 7GHG1ҋI. . )=` |}|_,H3{{ Kyo'0y1ر:YO;͜p acr#M5y "ՙ31  ]$`m9`~q0^8|_ 湀 # k1lˇ:?# !%áF*cWY}NT(c'+- @ $MZC3}(,R7y$S\%A+f|K0%'~2g=H0"6 Q-P_}' AAr. #Q Cf=S3B%6ceuHS[U=4Q/1 ՠu#ih0ĄS3U{ 2l#d 4y*T3os@>: <<><2&ecyl QN`r9BUI֭}'l#,IH5 !ez z0 GÄXREnq ` Q"IIu  FQ\;5'YQ97{A>Ұt~}1"А 1<3j])Դ^4C^1j|PVx3.^p0P`9s T I'aapdlUml u<[ #q6 PC` !T 1'"m[H  E/rɎ%Uu`) N-p vNe5I S!K֥1v$-RC{| &@ >^M Q3 U Y1)ꕚA?(C&`R a/ 5,,RN3) O j 1L%A Zd1/JAqȅ(Bq]@0V"aZ g >hZf 2яd 9HBҐDd"HF6ґd$%9IJVҒ$qLvғ:BB)OҔ$AJe,rqA%^@8df0;bK:dDf2#2[*ә$=AJhV3g5Mnvӛg89NrӜDg:g"J#;ONxӞg>OXarˀ6QΨЂG^y4hF5QvԣiHT'#' I aRt^`#eQLԦ?!=ZŽ@EtJ,v#)rt^V}>A-y;|z4Vl鯰Jg@KXWݪdEAA1r8 x0ȵ!<'PW0=+=TrU\;z,sHWѯ:$BAGA/)^RY*|(H#6T)Ҿ2g#ՙ5"?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklmnopq$r4sDtTudvtwxyz{|}lǵ6Ȃ4ȃDȄTȅdȆtȇȐ蠈ȊT=Q"1!yH9ɋ cz% pJtʹyh 4 &2I,Il K$L¼@D̉ƄLí魊E LLOq, rL9LդJMج "۸@Nӳ=7k45+(Ӵ2NsL ^&{tK N4N4c(CR::*!l4NB )!G0H8Lȳ$ώO#L@/TN`I (yI޼>SPXA%|sPT+$ NޤMHHfJ xua(XOQb1+-./01%25Sd3E#zP5ECh,Sv ;7 zS> ;.AӆBEh)LF{y)LI޲0RQA R5SETUUeVuWXYZ[\]^_`a%b5cEdUeefughijklmnopq%r5sEtUuevuwxyz{|}~؀؁%؂5؃E؄U؅e؆u؇؈؉x؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٗ٘UVYx!0OٟiY\EKpY_}jMQ(֥ ګZ,Ѭڮگ%V! ,W! ,WH*\ȰÇ#JHg0bȱǏ CIɓ(S\ɲ˗-a"*̂ryϟ@ JѣH|JӧPJJիX2ʵׯ`ÊKVցP]˶۷pڹx˷_wnǐ#K|00P…SIϔL|hfA͚]Go+f*RO y2 ƫ Vݚ_=Q@AX-X^MyUuXg D'&<0dc4%EtFs%]rʅ!1U sԩ ʪK3?*҉sS3@kWEJJ-t@K.yNf 'Q@,m@&@z34Z/Q.K/Co[? lWI3Ͱҋ@c?@N!Ui'McA D4IP?% NA@4sD5tO?3C<@ADCjD?=*U *?(OrGXZȽ6EgH4@$]3IG -=Q4q;P_RT ]@;8 vゝ]U]U m-=+v~CZ ey̺DA !)5ER7Y8ٴʧEM_" 2wxDtJ8D Yq-T$ !G$2 a3#yRa`3>%a_2Nؓ**DMԿWND@nMC0[T =wic$صb-lW I9ђTp!LqR/(fdӮQ=X"-)#Yso 8 Bc`Y ?D#rEei6\K2uDPrʎ8QUIxR y5]L M J0>yx%-&96DT%+ 4-,1 SIbCp2GĬSyT*q@]2 ޔ @)r[`͢\H%D3Ssbip;$@S4C9)x +)D,]A6ӁbE O!Gt.ddh<Qz Hjx AAԩԥiM9b֦DSE=jFhM@XꐶdO3G0zؾ[0~BuML "pŦK" g 4cDA0@h4cd{DV+ADc}V6H~Y7 d 1B%7RXEN-Yں~L eX^ &"+] fb]#]j !i% $.yu&G%\6$␓vҔX$kT#~f> 4 _YQ-@ka E b`\Lwp$DC\;VB esl5&Hds( D&h L`Z8+ŽOgxT< c3=2ū,TD̐|?v{ݒ=rKsHƛ0+@A "]+/w$nBQbrRB.#İ?$ h"]Gr̨8&p3!@H$ڕf%8P"M44I(`ǰ/QX{6`#,SuBPy!|Z Gr$&Y\"`Λ{IBhqCtj.mI܄d! :(2 LG c\+sggڻǵ# x#Rd 5Cu%OœDJ{` _vDZ8Ub>W! da^Uxp  &h5?;1-¦_dYD:z@D0P_rC΃ 6 Z~Ym]S*9@tJtFm籌A;ԕ{zaCڝ"5lΚrD%݉`r0=+ ~VKnص.f|_7RBZ ,}#A}c}\% ^UpwFfu&^vtaDn.QY |D!Cqff*Ђy !W%Ape ̆d,'&8A{NSVq $rBA [UlG2x[G(( ( CC'hqeoG~,D\Gbhutp<%%X04Tb@f )QAGq@q` )U7 R)f 'aj 7s2;m-a߀P#+1 ] f K}&Џڠ+Ip 9 a )t$O@IAu 1b"Q@׃+1x2pUWdŨ<1p&m45dO7a1p)psgÉ1{DyQ)#0ُ!1 ;+B`Fn1$JSY )SIe*iNVБ4pY#7M8q9 UC!4PISw7ԆR m*Y lAKABa^Qe#0LNa]à?Wl``axDh9(z%r%VXYg\4tYw)`0  0 cbipHF[HQGT 7:`~X1092yX@ 2ax j97dYwјE |>! * :@t$q ;wy phpp ?N 4qLJ jpPmjc p_bp`DP шRP>250dqC.-YB y /}h/K@qLSHtNJ\X!VqYժ lDX&?L1ak-!Q mZYx 065+WDJGPUg@pJfcE%k  wRG1AvtejDbMZ|DMF4sg΂Q4 lӋ[ 0U~9UTe(1TUWD芖>Øx ଫ7nWQF;*8l@iW2|>!RiK j2 !Yנ)[#1i 8N8Ъ?1 % 2;XNTPkC1t;0N]Xe@ٰ9 k=µb@ ƟH f;7dUA|t,M{DŴ Ks[' Ӏw ԗF4#+%I  y8,n~B 0+φt BHcԋTm1{7D ۸D1"!#Yde!5 iH8W#2$q쑲(F2۽q3`'"̣GIFlt8K$,K7|+à o6kdK]a/"NPv9#qG) z>/J[@ Ұg݅tzGz&rR jQ Ց  aCʻ%" (W "+A' SIMd1£#'U$t#pa9(qؤű !\ SS  U?Iq,&pC9`E^IW3a%Ѥ" s. "'ð J,$^ ]n_R 쐎`%)*q^^料UU B$e"V+b.-v5ʾQ1 GZQ w0ۂ0v@jF-T8*ȞG}ln%S IOK M~>Lpҽ1󌱩 2Pk_P= <_+ӰI  qP~ݙɷ%|@υ`[OQ!>aj#y HO אQD-^ĘQF=~RH%MDpRJ-]SL5m@ETPEETM#K9Zp}ӥCE1x2BC8ㅓSg×ం:8қÇ? AЃP_Bd(!Ev 4x )X^7ZT'`'J"C?Ȑ@ rҎD^q `ly%MY!w @+iv C))LT* Y#y| Q4 .#<< rюv4VX"3cPC`IU-'fԜ;PHBV&;P4 ~hSU0T!OTQ">I8ط(/ J#@UZ}7.3Ԕbhd "V-g[բ"osJİGV/-Uխx7:LqhFH!OF׼ْL{^>ojkWo~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7i{u1-n?zЅ>tGGzҕtc+O>Dm^@f@LVzgUg03;aJ&kwXRѱ,=0tݭw@zwI*ބ9(ˢ+.Ow<]Ё|ww50yB@՟$>K]ɶ~G!H`?Ǯ7"| Cp@D B<=(F$ @‹R@HJĈpēMtDP9ˆE,Da?@ERq@zdcv+e M6At@ţG>¤ː&OB ixAŊaEyʅd5<4ڈz!hIQZ zW9Pd J4gGX]aI-T^OnByhGy#OiTU:4> /u ?p@D6& Q [qg%?SP3B%.q?ztnnY *<W"(TĶ9Fq7:TcؼJވ" 9<uQ,'T?LP;.mUЁI}'}ˁ7Mx?Du@IJ6UH;I%nj 2 "(OsN:OÄH,RKPSA%Kp.{`!VR?;Er$țD!c@ /b 3yϼM΃I,h!TPO({L6||/ }CE kK؇/|jѐj \dYHqn)>v6!b!jѝsqUlv-PTPR] $Ž|+!&i((Յ I* ƆQt\rQLH 0_g8$:x" 9q R.P9/ T&_H^X!%d[? |M|M+`L IHKjgjr bAyҊ>d4ˁDB\^ $rʹS |H Ę8:Ŧx X׏ҏ 4p pD@QȳЏnlڦDChRR?u5Th|AFUΒLQ["!l$tO y%"D,$] W,xX\H)̐xGns'b|(g* ))8bVH569J~Ŀ ьDF+AR14S ;=aMX -̕\ ?rX|*7oW;_ D 1J|[L=TC0 Ɠ !Xs,tˆNy>sN^.ۗ{;qܢ JdhH$&#MzI-@A0ǻ2a!ŧ)r0_ze'M5)fț4?dEq(c#'sӜ4!ª}7V?oNI{Qc(dd-OCtXϞ[Gr f@ox DhzbǾ$mQHGP$D|pP/wh }$.zW7~(elj7cs$I;pwrDp A~faw/ynT 4Y&`2 2u=+Qf XzQ6(k CsĄOufzE#aqR65SJ!F@_"*G7pPSO`kyA2D0xw(Ec` ` xUQn( wWl Wwq  p_&-q[40p NWBB(`Q} dIO21e7(T}pA!5E[H?ue0aAXgPe'\@_H7`lm! fс CЏSrHxCbcTT@u~ՍR0"woizS&0I69hec|F"yAk`& 1  96`l[~@+0E`a*m(*Y 6HXfz*9!̡00'6i|xCN!c AGNe* S<x.!xV@M!k&a;? -|3FQ!wѦc@ iEk0g0HVBc`!)%MiV0qyoL@L CMwYwv$y4E'Y(bО6`DjiV tX7PTQGC R Zua 1V^\i`4E Ttwb"CsHBU &&jMb49}S*oQk|8v~검K ,V)B$=AJF)#N*'rZPC10:o hKRu'x!O$I@0B2p(Y"_w>U0G1p>!dK2:O"W~*j-O+9&pq^S>oOT)_Km%Bd5>J9ty=F@";?ɤ$;ؔKzbYCm 1 P0;ԯ;6ՠ r.Pq>;& j2(ǤBO0`$@V!5>T6B#gtI'sd+ajv ,D3Aa~TD5bdB512&r>h#a)) a' @3AFhXa/XiKTP0"VE  3)6%a&= ;E&C2eɊc,! #eн^n ! S u0+AËU[0#>B*i7IB }->*3[ ;l%L`1'ƿ a%9V23 zC!"4 + Ik3+P WQ4/ $9AVg܂A(FpldҺdj5Dz"I( 2<=3qH хܥItlA, -qɦLhgJ  =R6 85!@ D3 y !9țtAе<ɞƴ@ gA @@`1 31]R[!SŹ3_` \Ѧgt•hLA}\<[ , M@" @={` $G/F8 [#A-f 2 ?", ,Ma' b ๅI890N)+A,X += FA[ۺMΑ<Ъ@ *qp7(shv0 0x+!?ѧEa ] :Q)7#Q![Ӷ,qqD}gb=w+!Da!?́*  0K%lP- (-7 -ܖ@!5Nn 3*X,6)5U~R; q !"+*+ @*hu w0#m1Q2 2Be)R΁21'!Rےh,B!οw RB V.1 Aqx@ѓr?=.wbȿ΀~`S=as0 b12 q[$bN@~T0b+q S q; ǎɴ^H. 'iAX !&fj(Q9_) ]8囎"QW,!ǐyUҲV?G/@|~T^lnpa#orxzy`#{?D5e_n4_t?zM|(Ӆiy1IA#??_N?}1/6r\O_)2ág>OT-;-1AW `P(@EJUPB >,8CD-25AR &RH%MtRJ-],Aǖ męS': VT4l`#EUT @jA-"U؜@EVXHi-w.%xިfMH ^ F0r: Y1Cƌ Pt敄&YhҥMFZj֭][lڵmƝ[n[pōGnx͝?]tխ_Ǟ]vݽ^x͟G^zݿ_|ǟ_~0@$@D0AdA0B 'B /0C 7C?1DG$DOD1EWd9Egl$Fw0ƁqvH#fGF,;ءm`'mv( ~gB&qQ٦#:ޢid\+z !}An%:acЧi ď~tROR<$0%@pYjU"bǁ/q)Q(hCwvd&wDlJ[g 聁aAՆ w[KGg&dYyH_E 8 x! $AZ0?z$A$2 eUbطz dKZZ4jHҥVdwQ$8&i6:YV7f!8$^aTS[ds8`, 1r2\%{ G ޛCNאdsW @#Xh9b_,`,hEܡ:s! bi-hAr̪ 2cT9X #A Ot=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZ#E P%3#ʗ]LhA "RDhE'vD!dy]Q"AH uh)91ę CLmw{k!L]NTrWDG-̸S*H@w } ix|=' E3X2˫|EPԷW+3{dٕoyu'|ደ?͉nֺ<{9_=ofWjY_Cp\O{n*ch W?)5[gOl4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5dÌ6t789:;<=>?@A$B4CDDTEdFtGHID6 PQlKT$׃;PE$5Ml]û^`a-˘L! ,W! ,W! ,WH*\ȰÇ#JHg0bȱǏ CIɓ(S\ɲ˗-a"*̂ryϟ@ JѣH|JӧPJJիX2ʵׯ`ÊKVցP]˶۷pڹx˷_wnǐ#K00P…SIϔӬitiA͚b3K&E@'ku\Drv۱}reM k0uyUjjj (V޺=$kA&Gtqť2_D_O5鹤Du ǙC R{Xu@x8+7P:MwzGA|aHQ3Jѐ/B/yDHQR%Y&fV06$T:5WI鑊WR$gGtJtep*%X`K-)RC5'ZfT>@5q4-$?Qs jK3?pҨ*@3:,V %hRi?#?Z3[rKOެɉ8ХlrjAУk.Xzk/HFVŏv@n2CSclQo<4ю;4(kFtNAJEPS$2I)C2A-|;J;3C4d3A83QPų՟y]6O Hů f@5ɀiOE=H Cئ܃oB_iȏ#f})A[Mbw 9Aؑ8$fXUDVV!'h_v,R%ĽiGsqӁ`Y @lj (HpDX"wCQ_`/I8 A!-y9cD]G1GجU-`-"Pb8"KFH>DyWs#i4O Z,o0 W,aDRpGNpN%cç#rDheqt`R`;÷e̐j Qܒ]愌H[&ə/OduʲAa6Dbl=גZ78*;R[W-TP҃ZX ?h^ʷ;3nSݶp5GJL q>Qo&gE֣Ti:lpca:,ܭ֎)>2bS]%^G X,_c RR gA8VN+6!ڨQ= /` Tx X'( S݊{^?q{o3^B$3Dd?>j>ʧw6p H(e|Bw?fCmG;Eв,HClxȓEtB g@pbW&bSw,'DqAy7Ζz s?q Q-*%N@N7 2PQZhar1!x -Xxz }01(i>Xy@?U! 6}.*6 R&jn3А' | a$HqFe%@ ߀E)pz a <D;C!w ^v,L~0 0 *0hZ8Btk(&aap ffEKN%j}'p 2[WX=&mLt7[D+uOyB ~]/ | 1RTEFSÐK7(`zq#sqY X4y"A]I! 0 03EN#M@DjB%YARG_V$_F a}|7E e~%@à+8F tAW y}|r%@gG EaAF0))0I5RgZD VTS׉ QhM 'peTY^g  İ`Otc 9l[u)!F A fV~=!S)ωW"И!|IPyR4V^4AQccN0snT 2piggq@DEL E& Lڀ|!+Ph1-IY`qp` qNqiNw:y}$J@!16؂Q[z lfzo T(j|! 9L6ypP SsTyQ`q1щT$sAO-q%!5bafkG   &!0>')f HV!cC*a,G:2\3ʛ kQ*bzVkHU@ fM }sV|)&QMpLyt|*[DFqVE" eUJ>kT<:C T^+VğArEaaBV,?.*sv@P@A4kW!?NzƲ2*&* 1s(񱅘ڄ ]GtVԮ#+Q|УHqkZʅ*s( ",[_uf#).FeG+!ED )˔8ʒP!`; Oa~x~??aQh FtcP %wrf-PFa a ejH<Q a:k^K4k@rPgu1Tz{;R;FzkE*Anrp`&T"(`+0bj!LLfǽK{:B5D#V$, ` G^sRra⻋# ;u($[A &q "[@|:C4IU'{EwT1 V%0.8KtV 0 xăGhiaS:Z6KyBpA|^C0%Ⱒ%A^cI4,: ` UB P!Fx6\ȀF[ F6,PL) Q@BFZmL\8":0F2%o#lDVCHCH3[˻5ѾLn撏Sn0Mw|A |#w 5s|t ̞P9b @K@hpAQ%j" A /G8^8-A_i]}pFLވ @^<`#^EF6@6;l zJ%Q9osyq  Pn R*e$R"{H!b#R/" !`L-"Բ FQ# LQ% N>1S^!;2PZH"  u LO eCW.5U%912[UT U3P ð چN"1.j$QqH1( 3(Q~V a$zl$7d ,k87wJ\"wv.|q& \dJ:I'};!Q ,1 nB'7Mf>6q IM  z !L@ A "2caŎyRQ^wP a.˵F. .&&Dj Q0a=NP/R&kR\)p ѝ tO^,o;96h[-1|QCq Vnhk횱?V'֙aQwq > `?_<:~{AaV/ȟʿ_]앎0؟9SiP?ΏA2a@@ DPB >QD-^Ę =~ld%#MDRJ-]SA3SN;$STCETɛy \UTUUV|-Xc*E˾W\y(/]d Dm_ s━ԅ[.-pz %AEJ+SHOZ*)AL4А *f<Pغ`S Ґ[ؘy@$RC B8v'Y⡷g$2Ut2z~М{{,?o?p& i jAA /0C 7C?1DG$DOd,UDE_1ƙV\QFo1GwG2H!$H#D2I%dI'2J)J+2K-K/3L1$L3D3M5dM7߄3N9礳N;3O=O?4PA%PCE4QE:gEt$H/4GrZbR9'SQG%pj"5UUG<É9 uUYg口;"V]w Ty69RaE64IYg6ZiZk6[m[oWs[s we]w߅7^y祷^{6jc|q'XF8afa8b'VGav=G^ yP_%e6AbXvf Ysdf+x G,'b`@G8cy5{/!qJڡ@|z9-YXxD1%Kz8ʝ<c]!g:*rg Gzz7֛Eisv|nFj=y'w # ]ҚғxzKx(+Z{ ,: {x< rW~" >"ǔ:/hO\BzPY #yK;>|S }-qY*pn)EEu!c7 q\ f vBVځ@Th091< ~BBhVn I~aCap6!] ΋H" n*1 $q >r,Ў =m|ar( Ԉ f5n my!hDR(#An28$"ĈE0"A#AB|TA<:up0ʭ/αK,5]Qn!= NR|ZD-fʁC@KeyEgEt%7~nvD,eHv0v9|BĆ\=FW"CY֜d Y(<*:t<"p!I%*(xrhhQN Mȧ͍"$ɥD҈T ~ZP:iG/ԢG=J2_FĜ5SZ@H G':X )w2mldIJֲQe/YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnwG$qo[^cЍhnvw=ozwd =S{q*p!"iS.rO8:A"ˤA#JQN3hEr$QNrDh9OJk@5Et?-OD ٨WWǺvtY eɞ*#+̾F}rYIyx":F.d{3}(g)o%3$o?@Ta~,߮1z/ӻqޕ}E@"~ZM{L:8`wopV.W AȤ?M+?p!.*am-y+\?B.߿?$DP|td,@ Ԋ@$A0\T`̈\ш4z B!"4B@$T@& yB(A*,-./01$243D4T5d6t789:;<=>?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklmnFR:AܹD=Ċudv5M-]Þ(;z]|nC Q6 Z4BVhrԝ_[wX#̭&P6 f+'Q{].5 2.'} ه~ QT,x5W]Wm@m:|G-'k!-r@0钋?  YPMPrXX,e 44c7^GGRRI5Y]}imT_zevnWWcgQn6ňfTryZd H 'P29RjOS;KBzkD1R}C@ϱW#TܢTc4GK 8Кo tZ#h?u.ND?6n2$/#A(< T,Wǹ'pA N;JpQ JЇ6fK4,A{_C <3@rD+rOKo,PK@6#ByXsQC!hAH=̃jVJ;CQQ!b/oS0dC,bUoh}$v*Gqnh A:+Ch1du>f8 DbalDω{`ݤ{sYPi]:8 O萕@(AĄ(T 2™0adHC5d!aXt(q D?x) I?%ZɆAԖ> q E5;i kB8"hJ.AFt C ֒Tf;tlp!)oj(C Xx !lg t΋)$0 MYbaFS $rr |q,tl >D~bU 4_E 9A0(:2 C0 D[Al&Q;QLclF'bÂ$5(HO#!P^GN%;m oyPC>YG (Ԟ jUY*,JQ\@5QCɳRt%"D%45+Pa p Zb4SBW$XH8@"d7[U"d#d tucA~đ A+D19#-2qkO M!0XA`\,$~%|Hh?w!!ha.%> tBAҦc(5g[S]1  L :!)a(T`0U"76Z"}CM* QuI/%M7o;B_H!pSL"gV"p? /,&3C1weZQ'Z%V+$!qk&HXrCE rIx}5$KeJ.7f+*3x /[L^Re挝R11f)Iݞ+<^D # Y^Vm7ɹY%l-|}iKFD >e?Mra+H0_m 6H_S`8X^ꃨa@Tĵ>:t$  `i+ "BkW7BM^ Bh|# DY%V|(68C.vs^9EnwHLt6˹ t0:%~Xɮy Gr3LZ +H)BD QzߴlT u_'~ q} g, DsLh j7qZ;bSa0)`g*Z80  Ǔ}1y rQS'0Ћ4XuSyg&xnLx%X;!vVN4P _*JxI_ ]q}P\m Xk7Ͱ =RXgqwqKy%@g, 4= @pu0j!Е_!VpI4#9<M/CQN#i)WP 1a7cЛQ Q]Dt1ahq<8WP(~'O !ٜR!&L0 QPA S   s'ҙ| @Vԙm ydg݉1I{C4@K(Nah 5R!&aTC)Tj ARD7%Rq (jT I ~KXT'qH4 F!>X#+5:'?߰--;WgH^)|`qc "q}`BQoaP#ˑ[hy(7}^%KQWТ!QDIw>)pJY U*Bpfx}ӣ-Iy,I!(x@T2а'4"]HY3 >U˚ZԂqK!d !Ayx/ m pL$/: *o8է-1 pGH;di}{ X)@B9%wr athxK38q.tGq: PEe 7RET%B[U%q$+p1CKS(A/dT 4 KZʄ w@#ypcIW,4k&K0 DQPr1 |I!'a:Oe;g^KH/ Z<>0K8.gw[P/{;c(qG@$VBD2 X3,G bYAs&+pȐBVPJ*@k:57282A@BE_2%\1<Qe K.BXQ1.$(&T;O{zQwo0#"p G23a`akJa&f` # l <q$dqp.q#^FjTnFD1,- c~Â5#jХ 2!q5V;q=F1E@%aǫʔu` 9AkV|PfL@[ Ȏ,0~2<`ɡkq'& 1~n"ЄZ`9 o\PƎб[)BRtkǷ h}FT  A 6@͹-{,,pP4Hp HVÿ-8  Y7n  . d k9iu"Q2^2 @` j&*.L\H6)ۑ M^A ӤB ?L.L"P '$0M-iWa` 5dp 1/Sss rk ZO`  W><!w! +.0%Ѓ 0ԂnHН`e~q+DRr[)p >)$1&_f}th,  %<i}^^ Q%!ꈁ[TW Sv~5 |$9"+ )JXNN)H%._:+"a IR?T_9#pY V^`O:7fhIq#>jpr_%D=xz,?$ҜDUoL\agADO?y,/&_?Oow#_/q?ő?*Łr<NT!~rn?1JTA*T DPB >QD-JrQF p#ETJ@Htx @HY tN=}RpE19TRE&mUTS65 5@*U+BS[Pr8ZZTR< u^}7/޾p ɵk®"1`y'GƜYfΝ=ZhҥMFZj֭][lC6\[n޽}ōG\r͝?]tխ_Ǟ]vݽ^x͟G^zݿ_|ǟ_~0@$@D0AdA0B 'B /0C 7C?1DG$DODq*rIEK<"xF7d 'b4rn2 !DA2#q2J!20RK/qhL3;3dM7߄3N9礳N;3O=O_y+^PC#T=QG4RI'RK/4SMd!54TQpǠy QWeUW_5VYgV[optŵqEJW_Ua) ՃTeZ3ʑZo/v  ւE!m݇ǠxjRݡ'lH ݿ @Kf`=`IPyq <P)JXaw[mqIy;~y gp>y![B vXBz*g)֠@C!iݫ]fa:"x6"z*Gʱ複d׏95%@90c*vhb9hP wxG""nZ!}8șzةϩWwG7T -m/`Kvp"cmJؑ  HרG I F RSitYBwgp "ظB7XTJҀ U4 xy  % r@!$g9m$GH􆐧f!LzBI)+X3GLVs$М('-d^EE BdHR,^9;ЁHV@wcqdj7x-," #ap?"%dpLjtj "-[!D;ơ֌wM;1~#aK;<VԈt+¶̅4Mt!jGH"%B5vVa^# ?f6'ĩ?c`ҩ;sDj;yF4Y!c];'i 0ox>F +5cE%BGbV)@52 <MiDhZϊ!Ct=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկuel@XOۀk^׿v=lbFvlf{F-pL㘹(26r~ 3!6tR14i#Tr?d%yKXw7so} Io27Vc'qx%ٰL\: xC6j\7E>rfȱyr&SchF͑tw|HG~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+ ??(!:,$24Cު6BK256l@/7( Q[#@9 :.zՠBIWlhT7@|BE64)V lB D7AsUj2DUs@vg4 +DO;T0QJPv҈Q5gJtNAp s@ԏI%Gt2A)TpK+32AC43A6?esBLr4_u@ZOTw EIjQ`SI͉KCK'K|PtHRK#t,m4w 7|dWIMleUP#'rvt@{pIJG@d`B/A[RӠ(~)*MDZTNj) |GGdJI =aҫIn=Cm,bH*;C10MDFtwT /%q X T)`I d` 5x0*"  SmQ1/1!@Jnj^RX< /R?u !EBEӃ&ʯ"OL]Ҏq NJI<6Ȁ k~ VZANF;`)EA&(/QR"[Nq8U%iAa !E-&`|/( T 㐈TAe]@dWc8L$I<}%>Q:t-. @%VS- '<LW $1hz Y`@;%SBT/"ρBs4z d3UY`$9 yT "ThGwڮ =>*|#%AyфdDyHqR da@@4s\߻D'U,"RO%@@hA1F$T Txu`acDbYrʹW@>U9H"T>"pKRfPA:~O&0ՇTժI! JW:K<#IaBu ; vU %HUy9=\$0eujϏLD0X ʼnEސD 5H: , @(X(5eqeAL4 a(rT!pd 2tYc'D12$H-قh E;K"PxO^;"XJD ɇKqu"z[A~WOB_侎E.[pG&$ ޜ?VIzȰH;=en4p-OA%>A&mKfH52w}~, ;1I斄`p/TRy6B:v#rB w!`ZGr&YDC:s bPo"|Т J?za-]!Y@ 7nȩHK*z Z\p\z [`B!yHD~Ax:<0CJ XfȹS @XRN&;ljbҖ7@7DF7BXe;u-YZ8Y Jzy4t0Ku<R?qe63'dMH֠Nss-NJKUTo:+k@N `p $wQ_NR3<[@ 9449;}$n{ W@ )NcF12A8]Ws6!/Ew7.cR!N`B&_m8kx&A'/K !b*a4ݺ~^ɰwR kvAA WGykA Q~h 3){z!!oEw{g4Wamnz 5V36xB+b }*pKkBp |PAcq @&e )3n1%d,߀`J!+`e! ' ,H·sA3 iuz 8=Gp 8 Q( fAv$OHc@1Uo bSm"a?^a0u2p,_!" 6]f=ZMt\8ve8<7_ԋQ(#(!1 `*B`HGd/00E!aI6NV&kUD/79  L4o!ajFg**Հyqhx}4]Xq{0:hU1 smc`Џr8tS%.r%W7X4oGey[0  ɉ0 j9]:gD9YH@F3l[GqQᗀ; ͸yqK@|F 2r ْ1tpKYhF Q"PnFnY5h tIPiLp*'{Ʌk5<ਓ"1VOxkљY 4hy}'`1f0* 7 (EP:1 qJC 9)Zu!NS դ/ ,ٗKِJ ^GE/1fg釅59Uxk2CcFhY1>L1i.Q P0hV@b߀ A^C :lGPg@p!hK OSNu) f7fi ЧK 71 M" jYGx40Ĉ!VnK`j5` 8Z|SGѮfm 0hy}1yv zqŮ,խ =3"%>0 ס/ PvE:;rsA:B( 0*JQ`. zyA@AFNSv`q+ <01N "CUo.+QEaZk;liI1t:+ <(WqjAE)Dv 6420Y|!5`;41[\Q1q72#q (!=IVK@ QYATr[b& q0B00zFው˨).!Z{Qq3ńD.BaxKmJ[q ^|Q!!զ6G%1Qb,+~\a ,c q@t l[r$7uK#"BpJDH1(s.d \ aʄJiu10#f\DBX9Aq.uIː  P1v%F#]#0Gk̫cU8T`uvq"2a !S*`bԜQ.#KT!-[rP"FGIX* @@<- Lb7= '1 z Q  $Q[L;q&,AF+F@ #gޱ.1֟bQ1X-W! 0$ $!8| 0f&]u0 ^0MDa A07Յc͉" 'SPh k 36A* fZ5?jAQ"p 3]8(A.sӣ !- OS  Db` ׋MaMe!0u,ǥ$(=:yb&ð mKD~ SR ! N#.Aqi.D~%k $Q`ѧP"S -Mn.MM= [~+ӰI .Ѵ !v> F>PN!{>x F4aG װ;]s2e>" Ϸ, 1 AG8^#g0*q QՃ@q HaT@֣H!ArQ_npr_vx~`A_w`#a96bYg?~o!\lyx_+©o/dv6.:*_o&OH2=q|b/Jy #-+1i馟, Oa(@8 DPTfZQD-^ĘBF+xˣDI)#]Fẗ:E gǖ4}ta ETRMpU*E1S}:#@àEo\Ո(pqe[`"uޝy`TDk`… lc 7Lx㩷"/|XОvmZY4^:4=Zꌗ% }ZKӤb-ܽ}\pōG\r͝?]tխW]{ݽ^x۷G^zݿ_|ǟ_~0@$@D0AdA0B 'B /0C 7C?1DG$DOD1EWdE_1FgFo1GwG2H!$H#ydI3J1h (+Dr!#L3 '@K4߄20ȯ8sA2̳O? l)$PPEeQG4RI'RK/4SM7T^y-:%Ԧ> 2SWeUW_5VYgV[o6jc\՟q'7E6YeeYg6Zi/GaY|jeRXreu+]ysa~󧟗( vН7`9VI_s=֟w}aXD[߁V-<BFHyl(-lrA`.̅~1%Kz8̝bg c|")^h Gߞ\чy+.,jhZ߈i PynUy#=gK$I[@P q* a.6k^#:"y 눔| ]|!vZ0K7=R/ MHq{*t)ZF] Af@?z$Q_ G`9Җx)_T@]XҎ~/"z#h"M"r-4Pcl6مDz<'084"~?"-` @%r@ @/Ptq_D"kF!l#AbĈD` b+%q" $2~%A$B*= ` º r :1Å8m!MA5^133q c%%bo]l3;F,.$_t;Ea!~c'UlQ"t=hBЇFthF7яt%=iJWN${5]-l]kӟuE=jRԧFuUjV2LbfTN҉]+zq YăîАMe6M-T)ӆol[*,Yf7Do:&swU:^)o~^LY5;7EpfIOq2|)R-bDv4Ap.i͜abG7T0h%C)//"mCEf+r1J۱ڠ.G7$zVŞ>T2Dd\ Tb}m`a㮚G|x7|%?yW|5/mRzҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdtji{+ ! 4- ! :_k?8>D?A#-4/0Cr 𳉀! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸̳!kYw6ZuU"S2K$!ihe3uխ'P'k4kr o̽7ϩ|^!C#d*9sEZZh_| :'P,Lr,G} W~wp9Kw!#zW}V)ݽSPr`e@wQwH6a'QfeQ`C% Q:z#Ly6AdCZ$^OeXLBZ*e 44ڸ^GEAUit$^lVfGSnԕ]MI-@^OnBqhGy#PiԏP:4> /U ?LOsMAvJЧ}347 ;zUhL AbN2d -OJ(TJD@c ғG?V>O=5*T-PKJ<W"(Ԯ9Fi7>4XJވ"Ҕ )<мH<-,lMO ,. s2*VLB)=BV AF5N;CNN7Re4tN;JTFP2A:NU=( +t#[O'U֝kST&Fʡ#d@YѤvA;?Y :"1T0)Q 9uѰ$>>b%C> D!@~/b 3a_ɷ -̧P[LjO{\&|9E"7%s䓗JA`E5yE^RBELF7K0DRB[*89Jp2"f(i` ;HARP!!KP LQD GK^A>/P X;'#lm':R"p"8ЁF).9MA"oQjΩ'xNd2) I& 1H+l| nZbqO2 $ cF\l 0K.qLUZ9Hp+b@Nn ěѠбSy# '3S-hH`?* @m&ꑅb' I|^uqyDViR6W9"4&uJw\‚ rD)ʑb4!}DHj}56j@Z~@+CP_*k/khE%'HsV&xFM̡ 71/IXWD4 ")0Vua#z@6@<)e+Lwi4MAi&:; 6/(9" {GA5k7 |nQٗ\ƌ@C1Pu9Bza!)p%)i4wy!xVL@L yub1uxWs 9u`Мq6 {8WKtL*hḋI2$K!! 2@]S9EH"QF )A1C PqtxbqCO7G1 MK#EdH79ar\=YP@aw Y.ALI$z38@e: P 06ՠ QTOE&5ܠ"Rv VoU4)*DJbD1Hs8#J QL*$wתE7/"h'41{A|U1&U Sy{PxSp0@IHzq0G>d+Pq<2gڵW;B a'F3A$GH/ULK^`Jt/ؐ"1(dSFƑ -wl'$#UA,q 0?6*1"`0)@vHe@f{0#<: ̻%c2R7PQ!'Kݻq` pl׋   z8zя i0 1/Dr2 +>qRrk +;8#+2kUP$[58 b. |!@BW :$[q&A3! T4qu5wtp("P 5z$@Аmlsq3 a  <0sА  !{@Rn:,$č@ `,eA @x-3a ^SWcV - 9{18sHmƀɄp-5NA,1L " @ k`  <.G7 6@"f 2 ? B, M= -q rk>jFH90!%}!HI7& U  qF!<@ 0)n!Bpvkf-cl" R Ë> r% W ~!QQqa  Y 8:7$k:- 61ˁWRцq u1?X܀$k2 0 pl`I9m - Xэ,n=X) ì@J2_'b,_A #B!niA`!q1rd M0X}ϱ]2!'B7q s,5  Wh0#~ѱ!_>b[<'f@w B `jN1 aO0D zh=n R=!薞x|0 E.a#N 2\ bVZ>sb0Ҡq d{ns q 'Nn 5`LX ]`ߗ)5!n ߠ- )rsL,trQWI,Ie)rQƓ;^/ -(*,.4i4_6b4b=>@-vS 1BJ>(aLR?T_VX˭\^otHd_8_c?i_Li`y1Arkv^?r_?_"_o{E|O#ŽE_(=a\v0"Nqa_<eU!/3 NH3yJ@Q@ 6\@ 9?%!ۓ?0ޏ  @ C`pGA*@ 0c\Ib,` ra,;fL9r`7Hvݠ2Lk6(=reiS~Bq|fש6q] AѼ$#ʒ楴#Y;W"Ep(@Hᾆ(x5ѕssHR`i;(GJ&ӻ?8%;F#6!?.e9D >A9T' ڬfjQ<4É5 E7sTCd] cP"kE''Bq!j4;QF,&;%ҏK!pGE8ƱMHZx~0&O!0ZC0$ԠAv93XieCT/=Yy-EX0_S_ND &F)M"w9&Z~#&4/M88zC_;_WmR =vσS ?-rGV=ygQvԣiHwtf& `iJURԥ/iLe:SԦ7iNuSԧ?jP:TըGEjRT6թOjT:UVժWjVUvի_kX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%Dm&n,3Nd4-ƂCo:z"EhN4%(#H.g9aCEw#˚(j8y.A"i| T@:%:.VG>-9Pu'$" 7Hn!5i{C?Ěy>x ǏnԩZg\׼N3<[,ylxzK GQկ^-w}Oek?{%{[$t;+_|\q|%7o,%Y~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5dCP45 6Ԉk<=Tb9|@xD><8A 4 @4IڹJLM+`D: ! ,W! ,WH*\ȰÇ#JHg0bȱǏ CIɓ(S\ɲ˗-a"*̂ryϟ@ JѣH|JӧPJJիX2ʵׯ`ÊKVցP]˶۷pڹx˷_wnǐ#K00P…SIϔӬitiA͚b3K&E@'ku\Drv۱}reM k0uyUjjj (V޺=$kA&Gtqť2_D_O5鹤Du ǙC R{Xu@x8+7P:MwzGA|aHQ3Jѐ/B/yDHQR%Y&fV06$T:5WI鑊WR$gGtJtep*%X`K-)RC5'ZfT>@5q4-$?Qs jK3?pҨ*@3:,V %hRi?#?Z3[rKOެɉ8ХlrjAУk.Xzk/HFVŏv@n2CSclQo<4ю;4(kFtNAJEPS$2I)C2A-|;J;3C4d3A83QPų՟y]6Ox v d\>wq"\K Dx`F7z&GZ39 1EJ: )c d`UFiC~鑐IeH"*hdm$B;SC#)*NF 4)2Rh)lM$LzūH{*X>r,i6]x*:R?~CNQ;kAX^;AA8D8ːX(״LDVŘV!'H_v,R%ĺimCҁ`Y @ld(H=pDX"wCQ_֠nI8 A!-ɝX1I<ӳѫAɑy$6+DJF؁/w! H$/HͰ$BJ E+B ;hѻۑGuD.- C%5I#b@([߅U&dT!dl%'F*2I<畄,36\)2# А R +@8&' 3 蹖x! JP Ͷ JzA+)!`Bb ʴA@F$ a4:pG3iIPC8Z4VϼܺDQ*S$rdBǁ(DEЇh$*&ylcwFُӴmK}&.@ :C^pe L@@ 0> Gt=R3?u< 9A J|eb- kGG1'@ Ƿl7 hͻ2y {="eDO?~!lvw( lV :ֵ^?ؙ8:^B GsDFd'2oms7ʓBo9!==fB%)_V!ӫ/0eY^ă!4{o} m~,-Sdi9R#DO0C>[#}r $bWsDa~ R U% gRit ~&~~Wux%X6mq Qb-CFm qks(a,qPmgarj |iQ6 yIu n1+ TTLZ րowHÁD3" ڐKT+' p @ 9i#q@8Bxtk(V}'_ } ^ignS=a:P&}Vq@fu0 !|!N7x#E;'0j! )S !QDFSðJ7(px!#a;3p470 Ea{lH| t1J7А,f4ä?KSmAA?u{%DeuJqUV$1 qd2-I$Grj6`'>PtDqX4wI#(`А_АD^Ss A 1LLTP)DKU!іux*w'd1)]Aff İ`Hr> 8V6ZR)XFa A HM|=!.)V~d"IPyRx!]4A`ըeK0sql  2piJod@baJX QRPh ԩ n&@ Amq˩6kFA@BoP qRjTw^q1S$AU}1N-q%Р! 5BAf qj'   rVm*Y>UF~jn&R#!iPṁ(aԘR@qW,fM 0{diG_cǴ$qwi QL'bu_Hte DUb|iT;!G G(+M r`E1BU,e(֠qgP/ jDt*âbaq(!`4 @wZtM$+Q|VFjBR)ZT!)..ac(Uw~ + 9ʒfP|@; ëQ|U&eQnW+EvĀQ urf-RG a ~ejH@/~ ab>[ LZAK8w!S=9gI;T6ZFu>*Anrj`!4WO#*dcqv(&5TR5DM$, ߀ gG_ֺt!,;ry ;X(JA &q [ +MC49Uf&-1@^G;_U"B?UC0}y{*vyH oZy\KB A;M4$†1%\:c3q P%` ;QD@9Ȁv6[ u6(L+xC@,YK\38:052%o#l.ûGPCH3[ȏ5q2GftlSe f,V oCi+ t:9b `J@s!HЖ;t SlU¶M 2 p$ Aķ)n̅q-<Vd4j Q ds⠥T½b%F  P@k aOɨ *1 !9╁pAt. ը.&!Dj X Z~[1鵀0!=/!OtQNƞp ⡝ C.^*^9n6H,A|QsBq %nHkK/U!3>2O1ct_v `x<:|v;>a ?_10?_9rRiO?!2?_oOE/?_##şIo&_J8B(El_z+@TQ DPB >QD-^(R=~RH Sr`GT5x dSP:E )FD>Ig PBxV!VG1c1:#˗S]46ՀV WB6 ۽ F8.al6|c0b7?9!).vF2j!]N[6Bح_~iRuVQ)nōG\r͝?]tխ_Ǟ]vc}x͟G=|ݿ_|ǟ_~0@$@D0AdA0B 'B /0C 7C?1DG$DOD1EWdE_1FgFo1GwG2H!$H#D2I%y2J32KAh *-$Dr!L5 'PHL64@:A23PA l+E4QFQG4RI'RK/4SM7SO?5^y.BE5UF-5U_5VYgV[o5W]wu6j^՟q'9eYg6ZiZkŶ&Fq1j(z!vEwI3ЇFĄ3]yc-w^}cgrEbg}n[9 e(2֟eU*cf[o]Xd<ht)` ΝFPcv Vvj܁1 m6ǔ.0wmyb) .b%a+.x갺y2ĬHnaG+ZNNp N=>V̠. ¾f(IshRHx'`ƥTX'"q>6qSpv舰\y lz(E!v47}R_' M!k. vNQGo$8N"E9?ZA>٧S!BP -J8`:?z$]IkГB!HK[JQ1EqQbb,hR*"sW qUZjX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuK Qկ"ַuuk^׿v=lbC4aqۜj@m=yuز :"\Im8aX;?JoܝxsZuyE㏝bLՔQ`* :{8G-sj]=i3O9CM%yUa @F9b| 1|7χ~'WI2௿}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4.u@Sy@;@ 5;rCSt4DA@C46dDHT  x>K,1MNDҪ 숀! ,W! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸LPA̹3c:lf-iiFJL,U Y,>5M-]Þ(;z]|nC Q6 Z4BVhrԝ_[wX#̭&P6 f+'Q{].5 2.'} ه~ QT,x5W]Wm@m:|G-'k!-r@0钋?  YPMPrXX,e 44c7^GGRRI5Y]}imT_zevnWWcgQn6ňfTryZd H 'P29RjOS;KBzkD1R}C@ϱW#TܢTc4GK 8Кo tZ#h?u.ND?6n2$/#A(< T,Wǹ'pA N;JpQ JЇ6fK4,A{_C <3@rD+rOKo,PK@6#ByXsQC!hAH=̃jVJdh8:6R}iʥ<*R`Aq-A X?:pɦ7EGNН(D&sIr1 r6Q!A|ś'Vá(/NpH 7QrMF#HRL$OT, ] f EC . (С)Rx#yJ)FIX *%, e@<$n$`Ɛ@U!PUxs4nW19 ?Hct"\XӑUeDZئLDh$b k>G? $pW^B9VxbJB XxU6gF)A]8SN`"(iԡIqD'E@Z#q]KJ͇$HPʬB0z/Sj!cGzY&!ަE=D&!qu >!+V q/@2^[30=%"4DQ+S[ BG 0!EN#!"b"2#:DǓ9#fTlɳYGb(&,rby!Ol胬L`%n v :Ǖ!5rn eIXqS#D*Alr9$H C\d l , {CM$ZJE#D% -}&։#%tEV dp 8&JД-#2L)!Ek v3z7^%U$`yGm#vɎ6F4$hʁj@- mNː~a&Ȁjc )bQW?χus}[\E qF?fUѶg1w 1Hy,kԆ8}-WHLMU/":L۸b i|B>waoFxvbW}$& F/&$| :{R/}d3 M$G0C ďL"8IȢ\?D"Q~1gi{"(Hk? pC &Jʾ N`I!}ՅRkbVx} }~7{H8~aq^gnfr`~ aC6]!r)$+p@sP #N 1vA%3 z x gn1w%T̰qJ1kS y g?& =!40p vAAPO xr%]%@saA3M)_8VzYATҰq zxhQ8Y=T1\ng Tv(̰zk/U`ga!GsÌfKW [GPYr;I}uЇSa )PW+Y80 “߈w PS' 谉AF Dg-vC`hzXĘ 4H؍t?&N40 |w^*`I+Ď V8 Oɔ 0 zR ۡ#~u h6_7V0Qk_HÑ@8040 ?7'=he $K"Yzk9$M$3Q-h)G@P5vq3 )1Kt dp1@uiIqQbvwɚR!&L0y Qab@> S % s'| )UW ׈ c1I{C4{rZs, }ipT1jTC=t !q /EՀxfJE{'qG4F!ԉ>8#+4:aGG'߰-jCɢMm)|AC9}٣")_jmQP#ˑP{XXF8zJVqPDqIсUz(IX 2*y#qd{dD(y,r4H!(5nT2а'4‰*1>1A[jʊ4 qЏaaEI !Bi/k Kv$/6R x31 pJAGa;{ҪqG Hz[:%wq\r&]5#>f к"׋C/0R\,Q)TwNvKyu`0#{ "F2Om(qi>w`b`#k-e:q$拝 aWY1EUCpɡCr]6P P 1,XA`DZ#qU2[!=61M%2ſ_|·d 9A<+:@p r 7< }& 1~3nj#"ýS`9 TLJ0 &ʻl a>F4Ƿ q{GT  eAWr4,!̴ 70eӼYɐaP-Dl;Ȑ[p٪Ֆ ޜ Q,<pPfGP nHV󽖼-,[ Y㐲j  . 2ӎś@B'èȺ*c1.0 P@ a C-'yPhE~n+dq`l zOF>Ɯ0ёK)B]ca! 4TMrQɏ2 P+Ҡ ]"=  :><u! ]z^0%˃ 0QG4oH~q+DRR[)p >)$1&.a9A\h, @ 쁞nj.ڞAnԖGx~l|.u_J7Ϯ lG !ݞG+@ˎ4DR{4\e$q-/6@q2_683@B?dqsDJL7"qR?T_Q2n4V\^/ 0_?d_MaflCO"yn?t]u&5iPy!E_?̮m?y,/&?AorZ##O?ő_?J!qp<1?dT!r~?$ueScx8 .0S @K DPB >QD-. E=~RHHtQT-QʗoB!͚=}lx'PIJTRM>#'3Ȗ.YnLeuXbMJVZmݾW\uśW^}X`… 6UqZč?YdȋRƜYfΝ=ZhҥMFZj֭][lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^x͟G^zݿ_|ǟ_~ɝ/@  @0pvaB ;g3.Ƞ"Dې8EcgQ9zIFw px2H!$H#D2I%dI'2J)M|NzeJ-+ȒK1$L3D3M5dM7ߤPN;Lȝ' 4PA%PCE4QEeԾyzQIcF. dH'U8F.ud>3TU#v*Ugmԭ' x ^4`GUt'ՒZ SZ9taz&},i YmA$eB!v!ǁ@/@ۅ(<@?YE$b7+vf؁i_ U,GӁ񃏅NG~UjUqݒᇊTVx@},Fh *=)]X?zR^TE֔ b6}r:jv8.} G!c~jF&YtImn!}@z)qQHτs9+Kup"cJP(9!b gfT,~t$)*cONh4G虘†(Vjl~y/m D/66lpEcg[۫ #OKQ01(!$W)H*@*9BAb#<,Y"haRHe,Y{?֎vL@GDr}xJb;ĄXÕ~cLByYMA1mRLb93"#;7{R">IJSS/BɤH .Ԥ&'ԥKe:S)H^CXIԧ?jP:TըGEjRT6թOjT:UVժWjVUvի_kX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇvL6p)DGmht%=iJWҗt5iNwӟuPEԜ QbԠC,LզI""P!pht퐌:ظ>l$[/vvfgFD5ж6hbW32v{lqpɹSmu;;9㩻!7)wћEC2oH ^)tBS@pH-Uyҋb| R7I.NLnR>"xEti[K$i@ȏzILQtMǞ#0tqxrqO9+ 1 GϠIo:D>vU])MzdDdC?,{H>)xTXo|^D* 1yw}E?zҗG=Ck=}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdtd+vC?r[p>Е!9 d&tR5B)*?#7ȃ@->1X4'D4/S6t725+! ,WH*\ȰÇ#JHg0bȱǏ CIɓ(S\ɲ˗-a"*̂ryϟ@ JѣH|JӧPJJիX2ʵׯ`ÊKVցP]˶۷pڹx˷_wnǐ#K|00P…SIϔL|hfA͚`ㆷY3) :.zՠBIWlhT7@|BE64)V lB D7AsUj2DUs@vg4 +DO;T0QJPv҈Q5gJtNAp s@ԏI%Gt2A)TpK+32AC43A6?esBLr4_u@ZOTw EIjQ`SI͉KCK'K|PtHRK#t,m4w 7|dWIMleUP#'rvt@{pIJG@d`B/A[RӠ(~)*MDZTNj) |GGdJI =aҫIn=Cm,bH*;C10MDFtwT /%q X T)`I d` 5x0*"  SmQ1/1!@Jnj^RX< /R?u !EBEӃ&ʯ"OL]Ҏq NJI<6Ȁ k~ VZANF;`)EA&(/QR"[Nq8U%iAa !E-&`|/( T 㐈TAe]@dWc8L$I<}%>Q:t-. @%VS- '<LW $1hz Y`@;%SBT/"ρBs4z d3UY`$9 yT "ThGwڮ =>*|#%AyфdDyHqR da@@4s\߻D'U,"RO%@@hA1F$T Txu`acDbYrʹW@>U9H"T>"pKRfPA:~O&0ՇTժI! JW:K<#IaBu ; vU %HUy9=\$0eujϏLD0X ʼnEސD 5H: , @(X(5eqeAL4 a(rT!pd 2tYc'D12$H-قh E;K"PxO^;"XJD ɇKqu"z[A~WOB_侎E.[pG&$ ޜ?VIzȰH;=en4p-OA%>A&mKfH52w}~, ;1I斄`p/TRy6B:v#rB w!`ZGr&YDC:s bPo"|Т J?za-]!Y@ 7nȩHK*z Z\p\z [`B!yHD~Ax:<0CJ XfȹS @XRN&;ljbҖ7@7DF7BXe;u-YZ8Y Jzy4t0Ku<R?qe63'dMH֠Nss-NJKUTo:+k@N `p $wQ_NR3<[@ 9449;}$n{ W@ )NcF12A8]Ws6!/Ew7.cR!N`B&_m8kx&A'/K !b*a4ݺ~^ɰwR kvAA WGykA Q~h 3){z!!oEw{g4Wamnz 5V36xB+b }*pKkBp |PAcq @&e )3n1%d,߀`J!+`e! ' ,H·sA3 iuz 8=Gp 8 Q( fAv$OHc@1Uo bSm"a?^a0u2p,_!" 6]f=ZMt\8ve8<7_ԋQ(#(!1 `*B`HGd/00E!aI6NV&kUD/79  L4o!ajFg**Հyqhx}4]Xq{0:hU1 smc`Џr8tS%.r%W7X4oGey[0  ɉ0 j9]:gD9YH@F3l[GqQᗀ; ͸yqK@|F 2r ْ1tpKYhF Q"PnFnY5h tIPiLp*'{Ʌk5<ਓ"1VOxkљY 4hy}'`1f0* 7 (EP:1 qJC 9)Zu!NS դ/ ,ٗKِJ ^GE/1fg釅59Uxk2CcFhY1>L1i.Q P0hV@b߀ A^C :lGPg@p!hK OSNu) f7fi ЧK 71 M" jYGx40Ĉ!VnK`j5` 8Z|SGѮfm 0hy}1yv zqŮ,խ =3"%>0 ס/ PvE:;rsA:B( 0*JQ`. zyA@AFNSv`q+ <01N "CUo.+QEaZk;liI1t:+ <(WqjAE)Dv 6420Y|!5`;41[\Q1q72#q (!=IVK@ QYATr[b& q0B00zFው˨).!Z{Qq3ńD.BaxKmJ[q ^|Q!!զ6G%1Qb,+~\a ,c q@t l[r$7uK#"BpJDH1(s.d \ aʄJiu10#f\DBX9Aq.uIː  P1v%F#]#0Gk̫cU8T`uvq"2a !S*`bԜQ.#KT!-[rP"FGIX* @@<- Lb7= '1 z Q  $Q[L;q&,AF+F@ #gޱ.1֟bQ1X-W! 0$ $!8| 0f&]u0 ^0MDa A07Յc͉" 'SPh k 36A* fZ5?jAQ"p 3]8(A.sӣ !- OS  Db` ׋MaMe!0u,ǥ$(=:yb&ð mKD~ SR ! N#.Aqi.D~%k $Q`ѧP"S -Mn.MM= [~+ӰI .Ѵ !v> F>PN!{>x F4aG װ;]s2e>" Ϸ, 1 AG8^#g0*q QՃ@q HaT@֣H!ArQ_npr_vx~`A_w`#a96bYg?~o!\lyx_+©o/dv6.:*_o&OH2=q|b/Jy #-+1i馟, Oa(@8 DPTfZQD-^ĘBF+xˣDI)#]Fẗ:E gǖ4}ta Ƞ@M>FTU/@-zBcJdїx=h ś聁H I* S{Xb@"8 SII9 57ݴg^Ɩ@dЭ fl׵m{Y۽i&pZfM\r͝?]tխ_Ǟ]vݽ^̟7O^zݿ=ǟ_~0@$@D0AdA0B 'B /0C 7C?1DG$DOD1EWdE_1FgFo1GwG2H!$H#D2I%dI'2J)ʗΙJ-42x7"Z:xcf`ѹ(l҈dhG;Thp.1Bė! 0M@K!Ŋdo{B<1S#a.Xu{c?'q!#:氌UCf]!9| B6z&~8!D0F9RhBMeYdJGr0u`#G?Q*?(uk4 bM5ZkgxHȈ4?Q9A!<)x^$hYf:QXr$_;>̷ӝyٶy tjAQzrR`DBNÖu\\^~ʨ5 n4C!]BHڑZZ4#r {RHKTOݑ7' UF5iUjVUvի_kX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE'aԧʅjVկue=kZַu|&ux`DȱBhjеl3G݆O*lpg.{Н"ݽ1 CwC"úM6+>pg+,xpd/ޛ!"ND<3L)oT1Ϗۛ-G[gPykq_xIa~sdQA|PqI)]3Wm3VdgaRs$QnC&)p̃ sUR3bρ*꒸OsƧ|5yw}E?zҗG}Uzփy}$H}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$q7(()- *t:f9BK:r"h???YB,d60s89 ! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸̳!kYw6ZuU"S2K$!ihe3uխ'P'k4kr o̽7ϩ|^!C#d*9sEZZh_| :'P,Lr,G} W~wp9Kw!#zW}V)ݽSPr`e@wQwH6a'QfeQ`C% Q:z#Ly6AdCZ$^OeXLBZ*e 44ڸ^GEAUit$^lVfGSnԕ]MI-@^OnBqhGy#PiԏP:4> /U ?LOsMAvJЧ}347 ;zUhL AbN2d -OJ(TJD@c ғG?V>O=5*T-PKJ<W"(Ԯ9Fi7>4XJވ"Ҕ )<мH<-,lMO ,. s2*VLB)=BV AF5N;CNN7Re4tN;JTFP2A:NU=( +t#[O'U֝kST&Fʡ#d@YѤvA;?Y :"1T0)Q 9uѰ$>>b%C> D!@~/b 3a_ɷ -̧P[LjO{\&|9E"7%s䓗JA`E5yE^RBELF7K0DRB[*89Jp2"f(i` ;HARP!!KP LQD GK^A>/P X;'#lm':R"p"8ЁF).9MA"oQjΩ'xNd2) I& 1H+l| nZbqO2 $ cF\l 0K.qLUZ9Hp+b@Nn ěѠбSy# '3S-hH`?* @m&ꑅb' I|^uqyDViR6W9"4&uJw\‚ rD)ʑb4!}DHj}56j@Z~@+CP_*k/khE%'HsV&xFM̡ 71/IXWD4 ")0Vua#z@6@<)e+Lwi4MAi&:; 6/(9" {GA5k7 |nQٗ\ƌ@C1Pu9Bza!)p%)i4wy!xVL@L yub1uxWs 9u`Мq6 {8WKtL*hḋI2$K!! 2@]S9EH"QF )A1C PqtxbqCO7G1 MK#EdH79ar\=YP@aw Y.ALI$z38@e: P 06ՠ QTOE&5ܠ"Rv VoU4)*DJbD1Hs8#J QL*$wתE7/"h'41{A|U1&U Sy{PxSp0@IHzq0G>d+Pq<2gڵW;B a'F3A$GH/ULK^`Jt/ؐ"1(dSFƑ -wl'$#UA,q 0?6*1"`0)@vHe@f{0#<: ̻%c2R7PQ!'Kݻq` pl׋   z8zя i0 1/Dr2 +>qRrk +;8#+2kUP$[58 b. |!@BW :$[q&A3! T4qu5wtp("P 5z$@Аmlsq3 a  <0sА  !{@Rn:,$č@ `,eA @x-3a ^SWcV - 9{18sHmƀɄp-5NA,1L " @ k`  <.G7 6@"f 2 ? B, M= -q rk>jFH90!%}!HI7& U  qF!<@ 0)n!Bpvkf-cl" R Ë> r% W ~!QQqa  Y 8:7$k:- 61ˁWRцq u1?X܀$k2 0 pl`I9m - Xэ,n=X) ì@J2_'b,_A #B!niA`!q1rd M0X}ϱ]2!'B7q s,5  Wh0#~ѱ!_>b[<'f@w B `jN1 aO0D zh=n R=!薞x|0 E.a#N 2\ bVZ>sb0Ҡq d{ns q 'Nn 5`LX ]`ߗ)5!n ߠ- )rsL,trQWI,Ie)rQƓ;^/ -(*,.4i4_6b4b=>@-vS 1BJ>(aLR?T_VX˭\^otHd_8_c?i_Li`y1Arkv^?r_?_"_o{E|O#ŽE_(=a\v0"Nqa_<eU!/3 NH3yJ@QqLɟLaTS=C3Pkq 7 ds*2'@@2PB "tQD-^*- "$Q )@RJ-]SLIDYaNyyA&E4H;mUTU^ŚUV]~VXe͞EVZmݾWnKuśW^}Ej.`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFZj֭][lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^x͟G^^rֿǟ߼{N l$s9@̎ *(h'h 7䐸10DygFD1EGE_1FgFo1GwGW^) WD2I,2#2J)J+2K-K H 5$̄hL7߄3N9礳N;3O=cG3adF-OĐMA'mBM}`6)UF@%hT%!5Ce3G* 0*TGM W,hr&BӝO]Zp Irtexfl/\()i!%Pw"qsYeeVE?@EG*;Am`mvت_r_ueh^ facπ#: Jt|dөx*T 0v!}U刜A%:']ac'@ ď~]yK|S"0%@WYaU˜ bǁ/qڳ)^ZHQ℈.H%ۡ҇&^G䂦Κ,wʟl]`8tD(~a ",FS^ѹݢ~$`*#ͯB'(r>C _j ZF #z _=B[ s;Zl"w!? aK< ~߆)X=Ziq@0ɥ![S@ *$m @vC"z8@,h/rh# 9DMu0^c@?p E # jn@P A>42\hĄq DLH?%Ɔ{Kxv "O#@BVѱF*s&=nTyKJ$g I^E!H@eLɣTnO:PE _,jh.$%2)"QY&TYM8̙l4KBybDp3~,EHD]1lZ; NXzdHejbC%:QVԢ9'{miHE:RԤ'EiJURԥ/iLe:SԦ7iNuSԧ?jP:TըGEjRT6թOjT:UVժWjVUvի_kX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBРeARC/&$8SF?$0JK#*B-)Qҥ̩iTEխN >CX:FaJr|M ɯ=l֌$ ̞L< mjWƶlOf;,z6֘'fS%&_BtHAh%2Ĉj%e˲BYd.n{Wp&RGDHoP! $}D-!7ސp#Q- 3_e={Y?U#`&\?*hcsEZX!զKDIC8-%@j`q+1Ns{>gL{ gxL0ބ? 6sīE/@5q4-$?Qs jK3?pҨ*@3:,V %hRi?#?Z3[rKOެɉ8ХlrjAУk.Xzk/HFVŏv@n2CSclQo<4ю;4(kFtNAJEPS$2I)C2A-|;J;3C4d3A83QPų՟y]6Ox v d\>wq"\K Dx`F7z&GZ39 1EJ: )c d`UFiC~鑐IeH"*hdm$B;SC#)*NF 4)2Rh)lM$LzūH{*X>r,i6]x*:R?~CNQ;kAX^;AA8D8ːX(״LDVŘV!'H_v,R%ĺimCҁ`Y @ld(H=pDX"wCQ_֠nI8 A!-ɝX1I<ӳѫAɑy$6+DJF؁/w! H$/HͰ$BJ E+B ;hѻۑGuD.- C%5I#b@([߅U&dT!dl%'F*2I<畄,36\)2# А R +@8&' 3 蹖x! JP Ͷ JzA+)!`Bb ʴA@F$ a4:pG3iIPC8Z4VϼܺDQ*S$rdBǁ(DEЇh$*&ylcwFُӴmK}&.@ :C^pe L@@ 0> Gt=R3?u< 9A J|eb- kGG1'@ Ƿl7 hͻ2y {="eDO?~!lvw( lV :ֵ^?ؙ8:^B GsDFd'2oms7ʓBo9!==fB%)_V!ӫ/0eY^ă!4{o} m~,-Sdi9R#DO0C>[#}r $bWsDa~ R U% gRit ~&~~Wux%X6mq Qb-CFm qks(a,qPmgarj |iQ6 yIu n1+ TTLZ րowHÁD3" ڐKT+' p @ 9i#q@8Bxtk(V}'_ } ^ignS=a:P&}Vq@fu0 !|!N7x#E;'0j! )S !QDFSðJ7(px!#a;3p470 Ea{lH| t1J7А,f4ä?KSmAA?u{%DeuJqUV$1 qd2-I$Grj6`'>PtDqX4wI#(`А_АD^Ss A 1LLTP)DKU!іux*w'd1)]Aff İ`Hr> 8V6ZR)XFa A HM|=!.)V~d"IPyRx!]4A`ըeK0sql  2piJod@baJX QRPh ԩ n&@ Amq˩6kFA@BoP qRjTw^q1S$AU}1N-q%Р! 5BAf qj'   rVm*Y>UF~jn&R#!iPṁ(aԘR@qW,fM 0{diG_cǴ$qwi QL'bu_Hte DUb|iT;!G G(+M r`E1BU,e(֠qgP/ jDt*âbaq(!`4 @wZtM$+Q|VFjBR)ZT!)..ac(Uw~ + 9ʒfP|@; ëQ|U&eQnW+EvĀQ urf-RG a ~ejH@/~ ab>[ LZAK8w!S=9gI;T6ZFu>*Anrj`!4WO#*dcqv(&5TR5DM$, ߀ gG_ֺt!,;ry ;X(JA &q [ +MC49Uf&-1@^G;_U"B?UC0}y{*vyH oZy\KB A;M4$†1%\:c3q P%` ;QD@9Ȁv6[ u6(L+xC@,YK\38:052%o#l.ûGPCH3[ȏ5q2GftlSe f,V oCi+ t:9b `J@s!HЖ;t SlU¶M 2 p$ Aķ)n̅q-<Vd4j Q ds⠥T½b%F  P@k aOɨ *1 !9╁pAt. ը.&!Dj X Z~[1鵀0!=/!OtQNƞp ⡝ C.^*^9n6H,A|QsBq %nHkK/U!3>2O1ct_v `x<:|v;>a ?_10?_9rRiO?!2?_oOE/?_##şIo&_J8B(El_z+@TQ DPB >QD-^(R=~RH Sr`GT5x dSP:E )FD>Ig P^t]~<|9A]S 8kՐu*T`끁RX`… DцJ\TZ>"+#f*ґE$-ZԦQQױmE]n޽}\pōG\r͝?]XխW]vݽ;~x͟G^zݿ_|ǟ_~0@$@D0AdA0B 'B /0C 7C?1DG$DOD1EWdE_1FgFo1GwG2ΙGH#t1<I'$Prq΁2K--$23 pb3M5 [3N9$9Svi2O?t/l%PCE4QEeQG4RI'RK#WRO?-M9TSOE5UUWeUW_5VYk#6j5Tw@SWa%XcE6YeeYgkbG^"bYo4C}(jK3EWyբsӅ>~V$vEȑ `\ۺ X"^ Vm_!օEC8A穪>p:yl(|+hb!d&yL s׆|" șʁAikkr򜊓"!vhve.&*O}#)^ LF>&`J~IUz"" Ǩb1e+vrdX$brί-Ҁh@zeh*"qr_;@xy#GA>`0G =# r}' !ӒVBg FRcf! BG/8s0^ $8#x;BG9 IUR!(Dюo <Ņ!!' !!`*2„|Y3=ʐq?=Î A:H`r{D6z$c8n,)GuC|Ȑ$-^U"ym۪ؐ5o8EQj_H3Xni eE6.%.ǡ0b̥ekPGo63MFXMݫ[7Q}l9BNj(2Y@ ?tYOl%=*BsFdzH(=2hꑋ3@]@; W^"#BIԧ! DCq`q?E*Τ6BXtSz"@uWjVUvի_kX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟ,8"GPZYchjVկue=kZַuum\!5ҩ`yXȱA*耒p'óClR!ֶtL;+7cnuw'>Js x["-roà١Hm-T.7|Ntx%n2ux5>㊝XՐk_"_7g7g%o9qV]i+[73>MyUb\ 8F7ezWB Dw5YzYvffZȶ^}ُ3@ٶ`?6մ|5yw}E?zҗG}Uzַ6pr}e#^}}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"DtK??{#?x #)rBSos4B/d?`3$,DH8 9;<֐! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸LPA̹3c:lf-iiFJL,U Y,>5M-]Þ(;z]|nC Q6 Z4BVhrԝ_[wX#̭&P6 f+'Q{].5 2.'} ه~ QT,x5W]Wm@m:|G-'k!-r@0钋?  YPMPrXX,e 44c7^GGRRI5Y]}imT_zevnWWcgQn6ňfTryZd H 'P29RjOS;KBzkD1R}C@ϱW#TܢTc4GK 8Кo tZ#h?u.ND?6n2$/#A(< T,Wǹ'pA N;JpQ JЇ6fK4,A{_C <3@rD+rOKo,PK@6#ByXsQC!hAH=̃jVJdh8:6R}iʥ<*R`Aq-A X?:pɦ7EGNН(D&sIr1 r6Q!A|ś'Vá(/NpH 7QrMF#HRL$OT, ] f EC . (С)Rx#yJ)FIX *%, e@<$n$`Ɛ@U!PUxs4nW19 ?Hct"\XӑUeDZئLDh$b k>G? $pW^B9VxbJB XxU6gF)A]8SN`"(iԡIqD'E@Z#q]KJ͇$HPʬB0z/Sj!cGzY&!ަE=D&!qu >!+V q/@2^[30=%"4DQ+S[ BG 0!EN#!"b"2#:DǓ9#fTlɳYGb(&,rby!Ol胬L`%n v :Ǖ!5rn eIXqS#D*Alr9$H C\d l , {CM$ZJE#D% -}&։#%tEV dp 8&JД-#2L)!Ek v3z7^%U$`yGm#vɎ6F4$hʁj@- mNː~a&Ȁjc )bQW?χus}[\E qF?fUѶg1w 1Hy,kԆ8}-WHLMU/":L۸b i|B>waoFxvbW}$& F/&$| :{R/}d3 M$G0C ďL"8IȢ\?D"Q~1gi{"(Hk? pC &Jʾ N`I!}ՅRkbVx} }~7{H8~aq^gnfr`~ aC6]!r)$+p@sP #N 1vA%3 z x gn1w%T̰qJ1kS y g?& =!40p vAAPO xr%]%@saA3M)_8VzYATҰq zxhQ8Y=T1\ng Tv(̰zk/U`ga!GsÌfKW [GPYr;I}uЇSa )PW+Y80 “߈w PS' 谉AF Dg-vC`hzXĘ 4H؍t?&N40 |w^*`I+Ď V8 Oɔ 0 zR ۡ#~u h6_7V0Qk_HÑ@8040 ?7'=he $K"Yzk9$M$3Q-h)G@P5vq3 )1Kt dp1@uiIqQbvwɚR!&L0y Qab@> S % s'| )UW ׈ c1I{C4{rZs, }ipT1jTC=t !q /EՀxfJE{'qG4F!ԉ>8#+4:aGG'߰-jCɢMm)|AC9}٣")_jmQP#ˑP{XXF8zJVqPDqIсUz(IX 2*y#qd{dD(y,r4H!(5nT2а'4‰*1>1A[jʊ4 qЏaaEI !Bi/k Kv$/6R x31 pJAGa;{ҪqG Hz[:%wq\r&]5#>f к"׋C/0R\,Q)TwNvKyu`0#{ "F2Om(qi>w`b`#k-e:q$拝 aWY1EUCpɡCr]6P P 1,XA`DZ#qU2[!=61M%2ſ_|·d 9A<+:@p r 7< }& 1~3nj#"ýS`9 TLJ0 &ʻl a>F4Ƿ q{GT  eAWr4,!̴ 70eӼYɐaP-Dl;Ȑ[p٪Ֆ ޜ Q,<pPfGP nHV󽖼-,[ Y㐲j  . 2ӎś@B'èȺ*c1.0 P@ a C-'yPhE~n+dq`l zOF>Ɯ0ёK)B]ca! 4TMrQɏ2 P+Ҡ ]"=  :><u! ]z^0%˃ 0QG4oH~q+DRR[)p >)$1&.a9A\h, @ 쁞nj.ڞAnԖGx~l|.u_J7Ϯ lG !ݞG+@ˎ4DR{4\e$q-/6@q2_683@B?dqsDJL7"qR?T_Q2n4V\^/ 0_?d_MaflCO"yn?t]u&5iPy!E_?̮m?y,/&?AorZ##O?ő_?J!qp<1?dT!r~?$?[NueScx8 .0Sq @ DP@%r™U -^ĘQF= G%MDRʅX&)`*/Qފ2ͅRBPEiHR1RU^ŚU֣.]rMuX4+Y[׺ @jHmśW^}X`… FXbƍ?Ydf-YfΝ=|.hҥMFZj֭][lڵmƝ[n޽}\pōG\r͝?]tխ_Ǟ]vݽ^x͟G^zݿ_|ǟ_~0@$@D&| C D e:/)v(QHmbgnܡW2aS$ $yC*e :gz^ }6B[ONQ" ($ C4KZHBod+.mWѐBGf1`+J !L  v:72N FVFP ) u$*G$咖H-kG;2t#k(9>T1 hbA(-KZK A Pt=hBЇFthF7яt%=iJk&Us6hӟuE=jRԧFuUjVՀLjԨ)y ArMk@~4kؤbqG85VHHtlĚڷ6UrmdۥWmxܬ[v]lɶ=oz5'ͺ- pG'\&}$= N$xd wьS Vii9E.kLNIj|q*)9Lp."Ne#X11.. K*E~OCT6d"^S/HɱI1<uMmSA7%$i'9ڧ^ϊ d?| Wh!bpˮi9!@ + 2p =#?!w3|U-Ug`8K&QE?7&O//7>ŋ|-6w|?o Q"__;Kg ?ϟ*VЯ# DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5dÆ6t789:;<=>?@A$B4CDDTEdFtDз7|7 c{MNl[H$E$D|<THE\ QLW[\^_, ! ,W! , FH*\ȰÇ#JHE.jȱǏ CIɓ(S\ɲ˗0cʜI͛8sLxkUTb`3ᵢHK 4@,TRIOܻ^֐AjۻtU jQS5MիU­ۻy]K&nI.È#:ShKiPRB!TɕdZBӥK(L"E hڵ#knZmoك-M\)vZLS@1xio +V³r Z2UKZݻwyA|ނy|j t lsEX(v\ <#"Ұ'[3&ی?&]*W$s' BsG U ϲA!y:0PW=6}04Dשn D2{Rq` Bc290щi D`<9AeP,>#C.B PVҁzDb5aCZG>Ba^EHTbnH'@ #(PҒH MJ A&fʋo㒠he1uo_r<(\1pE0<kȣ?r k: t1o!'Reiă5;+ T N9'nbVdJ,9A>t$th`(gE^S0(cXGB~\4B=R 0f @5)#UF<^;*W7q@9$t{)O5!;-(p thE yhHR[e.C3G' LA'7#p8tG="AWCQyΛ2YiPW4V$\cz"Sݒ6r3u>1HCH%W@$ϙYUW"ڠ ڋL$SX5r8~s0pW *ȂUz/YU/HOŒAS k jl= NLDUF{8_E֗ آ7dc<O L@-0!op':؋cI7Œ`?'`oMܓg@8/œ>IE巂]]Wlff  7f( 9}@ XC *{|YE6wke`p  apN.v-Q- vfxFx80M.FFfj! [Tw`& ÕR r _Jf^EXT_|17jbCS?E-_~_'&PP_fz0"U WL[K2\(!`re87h mDe .l  l^eWO~8xr@LWP~(;lH[;d9ayu3U QQȢ삣)X$ۑ.U FM0`/˄C':kadаނp8EYK( 0DS! q8L7RP +ۏUuI4E" *(/$aZҸ_D`Ҹ.KE06` *@%%,9nA)G  ~:e EY!L/mB E]Q_iVhK"-7341Gﰛ2!]26.%%<p`jYР$+@k&{˨FBhM(RUZ04tynXzSKe'v``4h4f[# :#L.6)Q-5Ʀ4 QdARu|QYC5፜vsPOp& 8ZR"$6QZЀyDdQz6V' F=` CG/f0> w 2~lKU*!O'a0AB. q43ـ9Lj:( U-Z¹}apE6[<hCʴL4%yJ3.8D;#OeL{v V ys4 ,v.MQyU:ėYt|́,az2|iK)ިhLYb51FqU3Kd4T($VX-q2>G{G7yMs' 4֜_ a4Ia};A\BNO$q ^eMLHyCKPd AV ~4i3Եd:DCĆ,"S=iС\T7VY8d>bfkN7D 4,:˝P,)/=cKzw0>y` --d0[` 3K9&>QI0F3* `!>QAN~3V5ۜcc#q8WUJS-%l谮dA   WC4D `!Lc<&$ A9B{Cmvb q{=9r.Ypd|7(%0cڜ) @ BC4sL:U6.0 ؝  _ 022aCbp^u>`1|dn[E 0q?~q.Pdy @A+N,T#,r/ E/m5V ~ď-y/%1{]$ aŎ:5x2!O}a e>59I3 @ Mh*̴270 ڡ @ $Nˎn!z]06 /_܂`, # mn!E#VW y ,_N\fb Z |d#:0 M$\ SR%B b%2`9Q:OQKa1Sp &ALTb4oԫkiAk0Q 8(~L4#P b ~/"$b"ٞ ` wQr,ܠ <'ŭO)U4T5"q )3ځ#Gxj= )ŲS #9Eܛ0 LZ 4'S DX҈cdx+]ACi:ujŊjUCd„֫=<*TbTRט>yNP5(QV~*N fgJ͹&4kX!ԕTkѣnX_uA9IfȰ 0`0%PćDW"EJ\J %ʒ4aeJxհu)S೶>f<%]*ѽWSajAd~$$L3 š1 #B+ѤӪN=ϰ<φNIEG#E4QEM  `4RI'RK/4SM75Hh 8%TSOE5UUWe5AO)Vo5W]wW_RhjXcE6Ye/)PfZkŶ;Il%\sEm@3҅7^yV=}` `Hs"8"4 R2u8bS!b#_2xXa 3ۤd#qexX%C8@3(e JYh,h53:fȣ,88~+8\ fmC4#H;p=j`@ : ;mgqJC}! #@#pӠJmOG=0\C91Byt>x 8cP* gmtg}>{7h->΃czo$@"ْdܞR?Au R Y̗;-z9+r:1 "T gD*u Rwxju93"@C9dvǬp?: 8At" *%5dKx,`̺"Y~3mwD83ѐӛ^wud]9;d$%9IΒ%5IN ` ;9JRRY ;1Sҕe,e9KZҖe.uK^җf09LbӘDf2Lf6әτf49MjVӚf6Mnvӛg89NrӜDg:չNvӝg<9OzӞg>O~ӟh@:PԠEhBP6ԡhD%:QVԢhF5QvԣiHE:RԤ'EiJURԥ/iLe:SԦ7iNuS`#0aU#Z ;SR꧋`P)JCSE4>Qnլtr"dx)PAY媧HX #jHwjLs= Y $-MU\Aʎ@ BAzv ֘.~e+v)(`pذ8 ‚AۍcQj@<>h))- 芅8ALvp]<zvdm{^| Ki  ۲ 8X0e :^) >XBh "u1.0EuhB*fr-sUL+lsAhihiGO|++! M ,5=cl+0lr\R;pv*cPaX{jA[.c lAȑd-q90g P3s }h`9ȰcztAn)УVI!6T}=ItA$\^7K}_@A 2j&ۼ@]'&LDݵ~#[,ǸC(VY0sȮ@f[s֌X Droa.DȊtm)AZm8ʼn d*tm}dd v@[[d9_,4?3LZϥU{WVuj\{1gG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5d6t789:;<=>?@A$B4CDDTEdFtGHIJKLMN)KYOLpEUdVtWXXd[\]^_`a$b4cDdTedftghijkFf TlUopZr4sDtTudvtwxGylnFq|Gr~Ȁȁ$Ȃ4ȃ\zndžtHXGȉȊȌhTH|ȏ|Ȉȑ$ɒ4ɓDɔTI`{ɗG[əɚɛɜtƖɞ Gɠʡ$ʢ4ʀITJZɣtʧʨʩŤ\ʫdEʭʮʯHJJ4˳D˴Tj˱\ʲ\˸˹KlKI˽˾KKI4DL LILDŽȔLt\L ɦLfLlH$Ҝ|Mdt͹D|ڴ۔ؔ͘ENMW W,NƤTdΰdž<llNFdEMTJMTM9ԫ\$UFELmAERm_tUUES] UUU!XaV[?=UUW-\EgUgUiEiERefu_UhqegNUd5GCn'^4l^5Wy]dCwI^W_WJEkWc|m9 G-T`%FTpWLM5tdMX8חT֐}UYUj%`XEYVႰaaa va!^a".a#a$`%`&`'v`(>`)`*f_+`,[-f_.a/n]b2S0>_1b4Q5_6c7P8^9^c:^P;^^?c@OAV^BcCND&^EdFR3bI>RJ.bKvRL>bMRNNbORP^bQRRnbSST~bU>SVbWnSXbYSZb[T\FeT._]>cF-1ffvd߅D]}6fdܭGff9_ffjn<.g>Mgo^wm?~gԝgt~Bgggyg Eh]Hnh~hkh hphhu,hz/h2VJ.4iN7^i~Nh}i韝=hn:ii=ij-j>M]jnj=L@~jÍj곭NCjk-k>kPFNk]kn뿝븭kk}RITKV.M>XNO^ZnQ~\S^f`n߾Nܼ&ӽkv6̖fRkҞ\Rm^lhF*f7nqX7P60FVfv&6FVq1xo1'7GWgw z*''qV4Wgw !rfΏ@#$Ab'W (*++R$,g.Rh/R 1/$b@#3ga5gsFI 28O"#K ! ,W! ,W! ,WH*\ȰÇ#JHg0bȱǏ CIɓ(S\ɲ˗-a"*̂ryϟ@ JѣH|JӧPJJիX2ʵׯ`ÊKVցP]˶۷pڹx˷_wn˸ǐ#7 pTmJ̹4k@Ahqu!C XRԟ|Xy8+7P:ŒOGz!PyQcAS (P@3r@+(`6BeRdzd&LYTeKh6њ HX6U@64$L:T!rfa5]A|~TG:^)AJvDzԟ_-hUCF(bVPy@%NO??D&4@V4ݪQxf,bCTQ߂[,=;?Ҿ4X:n낔&1)Ec> :$pBILT@?#?Z3xrKOެ隺|DM4`?0?SA͙R,jЮ d2XBϾYlo!Y?RppWz ilA[P=OE@IC[DL6J`@dnpPj4C4VTKq ,;NBCx&NtK3dy9(ě5%?MY (Ќ*35KR () :RӋPa!)_zd =M;-MG7O=c⾁O cA쇿.1Yb+͠:!2笧%L|8`"Hr[.!8r#sGtl Yƍ>@I{LCXf zl M In;L' U(m"˜ c#b@1$V$VR q>*!J!pS IhA9|χgt"{t f0#-/@)+RāL0$2ZQ 08]2!G0E* [CDVEu,Hr0k-i]lWYcUlbqoW|>Ҕ=#ZN84(7'z{C'AYrf;; &l/$=5-x6pB0AJPaQ{mH2,O8?"ENUMX2 $1`#BuvlW{rs4!$A:o kVGY@Atݜ*y(*$C*b#RA A|")4#B*LGmK x=s=(\P'FL; 76njW,1Ep,, +g}`+fٟ -2EV$(=˺:~yhL @nvY`V@jKVZafƊ u rڲ`@ڃ &UU'| A6|fE Ƈ92 kEZY=dedf  ``P@1N|@;a&FA> g#^dO1УqD)XƮޜjnbOT.CT<?$Șr(\#r=ӍcԙKwzBo4]A+5[a߆ԹmC >k 2@E>~t!{.6qo#xl_8TGs@ׁhaAׂ੆%>8lB>  X"<扼 Wl5m'7H; m(^R +HyDX=ԂhuAL)$G!C s 0lzfPL:nC!\!EG 7Ed=]!:hחٜ*h$= I0 e%"G~~/2G9V 37λKDHƨ>'Hd/`Ve+{@"c§$IO CMZ_ b հB `"zA@73PtFa`72.N |R_`&pnXdE@ rLw+xY'xX ha0ڀv@ i &P&GEWg6/ (G ky 1&ap ~+`Py(pX>s}g mvՆp*7)K".(YEX/bp^d49ClERzׅp 3(TWkAhf`gօ=1N5M(oHN`5@*=%oygWf=TAf%!$.6EE_Y0iыW!mUO5`H8 &؎QbylC88PJŌ() #@A/sJuxg7}WOSr(0/1}5f#wӧsշ2g4-@5nLXW:` `7oqQcs4 ̢sBz0(1ka~dh8%J1s QGhSGf6C)}Pd2^ޓQe(VDr,1 K-c&}^ hs|Yv &I_1o2EJGTo ֛&>0i@٘Q Op@`n ᙌ+o%!.7 RZ'*Y;1`I a ᖥUq@(lc/ EL pT ICL ڀZ%-0 0 0i*p5:)?BC:tcA!{ jxxsw`v>a â&cLʔ#% eV&)= PpvF C1!>u (+pB GNt)( qaaVGtW: 1 D !#=P㗼Y Gڹ2 wsHՀ1r00d) 4xrXoj9P,kDMIR T@VHGmHp< g-^! A%p+2P2:H Vqs^'>Pz(HdK  P 3 q P*ʳJB5 S;OJ'w\rx% İȞ*!a*dk00i0@FYQFq\dk0dB`1RKY !=iB ׸kQRPi+n ;Т ˊ\(Nx,_8ӻc1NP>); ikw1dx˃1cDs!@Ch: j5g Sb1rp/0r%@:?k3 +x P ;epU` 7ùm0ŀMZnkGP LBqlYq ap`wny&5C)x# ^3]swz!{׸b+$Vlc <]@*1k*Om>c޴ =Vַ6L$w"[GT11&:[F7M7@ Ҁ=9S&sCcvUvYk"#3vPC`IZ+#'N"qH(6Cz2ߎdҋ @ !8!e֠ IK{=F l$魒kQ#,be/8) ְ&` ^.N3ݤ+L|'@ v^!g;JNc(h8޳޲`Y$bD#1N%^4&B'>Q̗ !\㐾խyhC"> ڼ /][?7A.A Z+V*DPB >1aIj.WQXdM:-.'QJn4 Q0L~g!Hu|k . O<+*ŭl*qUӾX AW3pC ܇a 0/ĵmqvWZkNgbʕ"{ffQTі)%KѤM:%ʵ:Nk`\">a!j;@pQ Ho|=iW֎Uk63_` WB%R!C( hK\ t>Ƣ p:!($)* [~CZ:A0>K%I @D#!Q_<(##:@z8D/;H oҭY'&E%Y]^V΅.f1Bxx%N!5 欖|E袇\T+u)j5߄%6^y@ T̴M %f$gG\7\ToQ2wBԠ[Y!OցV[n0gD9uFu }kvauw2s:`z'xG>ygy[@,pz>{h`G?}g}ٷ6ߧ~?`a\@6Ё DP$ `5AvPVspcW` UЅCBS$ {^h<5'VlaB шA30U- 8W|@ nwdx,ьgCp=0CpxicVܡ! @-@!c A<.ґ ǃ@Ȓ;[@hG8! ex \19`(J 1TS\I@/@-Pϔa dfLjlgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUŞ(mlgCQ-ȁ% `n;\`$nrK38A r;݇gDnv[]n׻9l ^.7 (ozջ^׽o|;_׾/&-t:׿yݯ;`Fp`7FmCBWx绊;bawqE2v9Yk0{MpeH.HPr@xN=# hf9BwpʹzeUG;d*Ns2vIB @b5vevSO>tn[^;S|!xe|2;ߐσGBsCD 9B[%(|ʈE0My=t_ky޹gHPAKD4M=wc(S6t^ jpzkC|ݯú]#i_2>Y0|6``=;=pqP,)Pʛ 3D >03۳i@Oc?CFX@6T;86x!dAs4 A%?=t AC(T3T'̉q8>k;¾B53ÜC Ģ1d…C?0̉ٛ=%2~p74 +T@˷C1"JӳCKLOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghijklmnopq$r4sDtTudvtwxyz{|}~Ȁȁ$Ȃ4ȃDȄTȅdȆtȇȈȉȊȌȍȎȏɐɑ$ɒ4ɓDɔTɕdɖtɗɘəɚɛɜɝɞɟʠʡ$ʢ4ʣDʤTʥdʦtʧʨʩʪʫʬʭʮʯ˰˱$˲4˳D˴T˵d˶t˷˸˹˺˻˼˽˾˿$4DTdtDŽȔɤʴ$4DTdtׄؔ٤ڴ$4DTdt$4DTdt%5EUeu %5EUeu !%"5#E$U%e&u'()*+,-./01%253E4U5e6u789:;<=>?@A%B5CEDUEeFuGHIJKLMNOPQ%R5SETUUeVuWXYZ[".U1x]Nҡ"$!Jfug1ˁ4wr./(km)!5lo"yue}Tvxy%/ҧ! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸LȘ3kl6]ͬ%Yd W+X]5CU"S2K‚EBƲoZݽ/nP8qS?z0f\;F jԉ:/U)4maZ17tz&UlğDxO 4ȸD@& :xI'RxWPUg5%<1el%:|GZ9 B)8IyHzFKD7eG[DO]%DaDr T)V@Y# YId,!DZ: &' 7|vYUf^Z)i^8pcAxG>de$Ԏ?OcК"9Eax¬BS+lHN? ҴvP۪odu3;UH8'+UR>grDGd`d#ң@QT7r\@c7ϱ HF%Os tMG3lTLT7Ad 2Ćl@vĴDkH55/,=dJoG@s쏾![R r 9bE,= V] =̣-VuB w}RD1.%B3;^PU=̒ ?cҲ~] 47@X>$IttN_ .aTWs_EG뙝(D&Iss1.adAtY4Vvh do$rMpr$[U c(6&pYrĸE*2ː}!$_Z,r"֚6J7nz3/7u"|"Wi=d-CY ]^J,˓J-+r18M"WIRs6Bޟ!@ |HP!t+^R9| 9tD#` ^̇Į!QG}ZXx'U BD Ԇd@L 媶 8xFW'΁tF!Bu"r8+,&yy!J"|0ỹ-HEJ,ڀ PAUeuăQ,6c覸GU,"_~?Jj.ObY%86Vl8S>9Fqe>rTN!>/Sl0:xA@lCxhR!׶ֽ \(#]޼WwĶ+Xwf^=oFB Ibm+ﴈ[Bq<#I kn59j>Dؙ~;?X` "и`?&K81A8n(0%892k >H*_d^*=+)99] WK PدDС"+2N7$DE@;Dd";?QDёAgrAnD+"XpX(1]п4o#r ژ@Áh>"@>ط!@+`Pc@a5[0Wq90 @'`)%]N4C`w6<mQQ~Tx_cpm l4  ڠd6Ȁ5 m\7zCeC%M*!|| {q1OAv4H8K4O _!adBQa8t0h~EiFk8sRT&qf@rшs1/ x%~z1fr4tG{8| c gRw>[zhu|U~jT )A^ ʄ^Ճh-Aez a1.{g p8`h0֛9 a%dΩVU4rV1|ŚOCG7 8 R`H`BRTp! %!qɤ87S !=H !0_!/ q8#Ah[x1`Q_ NN\ Q虓jm*DH-c0 es:TPJRn3@D}pdbQRQyxсj~uU 7BeF֨xq!P0R@L L0PU_0>4kQ0pi A*a_a "h|ѪeZ=" 0Cr/HjjA?Ե>Kqq 2*>ѧzX Ԉj-K~(c7@]F!Ȋ>7>eGUI fc kTP2ıPIj!qtX_vcRS j/ DHN){׌I!2@хCI@WPa Qy1@tt0#.:DDQ:fvC,Tu-)w a#OrW63u/!ʢW:S k +%\;ԩ 1 0M@q*+\Y4ՠEՔ*ۍ A'T}ֿ9LK4dQ 3.!NdFBaO0r;*D; %$A<_| AIrW" u8[^;teE 6Ł8Cq3\<'waKу/ <'y8 !0.Iv~+$ a_"RZ<kr{AˌQ,%_\!!8 0#p1կ &+k 60 A$۽Vp*,^@@;/>>_ &1- ?bM#+ɰJ2* <ߙQ L$#+ Y2 lO' B/S 35a|f 5GϱEQD$!Q8@o- wPA A &+"o8|?@B  {0mF`V>Q|a_RnOQR 1+on"COb%`׵ 4*իW* D)2(bw,%M"T0V,XVh+4uL0ÈO|Kt$RM+,@ܸ U[\je˗0zZUMU\u)*kw!Uq Jdx4I= TB.pթ7Ʃo0Ʈc[5†^[lڵ ޱ[n޽}\pōsN? ]tխ_Ǟ=:&^x͟G^nvI_|Sy[0@$P6,)0AdA՛ǽ'B /p8Rp):1DG$$I()$B@1F:eq5:ȣq1G!!o $8PKbI)Ү3J C2L { 8#2ŔK6+M9̊2 <_ r@$JjCE?;5(L, 5#MU5 %UQeR\q)VI :> rP鴃P7ZdisR   #93R>PSv/ҝgT̪%Iw1T4t[K⎻us^b:T$֒LLxa-S?9eW^|egS䚡Icz'-:ifi:jj:kk;l&lF;mfm߆;n离n;ooz駧z>{{￧v|' 1g}߇?~秿~f 5Ը)W$~DTJRf&M5"Jژq8u|F`)>2iy)@'C L"Hb&ҕe]h"Srt.d'Ђ.XX]aa?yljQ?$8I"D@7j##. hJPs 9s < Q~򭔻$y . p $&N[I v ,a.r0} EKz:JJJ " 4)Cσ, 53hilg~EC YנYk0$UC#P.5dYH0BTjRJ]$ N2eF.٨e9 .Q>ўf]ΡqG;~{&;L0 9r55H?8mw{ "Ew4fШZ>2m0B{wo] GwetUL$Hbe\6})e>X$2C*OlK?^ wDڈ|bg?Ճ":dQ냡CI|0%92bK"I 2oD;>3c.H#yfCj,eXy3a4 ]C#y)ӊkA2hR3C>(R:@{vue=kcYuik^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5d6t789:;<=>?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDTTUdVtWXYZ[\]^_`a$b4cDdTedftghiFyIjT14FmG˳0$7.| ptw*6Ls?LU8(_IFqu1EI'b+ф!yчWsd k" 4'c`/ LTb~F X $F2|VAOb$on7ЇL)vmdެBN5ѓsP!ktI =Gc@,VŠbJ;GCn%\D';HF#T@DҔ=Ғb,u έJc L#FKRP@0\4pF\a&()-2v~^\h i&:buE x\V"51[1p8z% ҞA[,B%ŗQq8uGP@K!AGΣL\$:Qy@_adqEE?_~ٓa&*P%2[zF5!<"R ?]<#<W`mǺeA&u%@9ER|6nVB#Y™>w#H-۠-dk408K@C\!K3׈@s ߝHOru f2>ĥR@  LW=hJz79C>9X-Dw L_j xt'By:D|q%^ٳI`4IɛH+HV2A "F!+x$an,^ԕM# c !+cA6TcBt|FA*# \K)BGzr],@+[Nw u-=ڹ%F5͔ iO7rk # *ht3 DM^Hq"c Ab F M@yvJkA.}(YaB(vy ݃d! :Ճp|'QșJ$ WH& 0+xw}G9G/ɀ .@kl=!:+4ALl6CX-CY csMsH7T7} @>x\r:Jǖ^yjd D `Ab fgךlpb1ィup#"f#h!ȲL9{&Y!OeD>aB8B&؀[ScQjl'g; )}#}gye a_7!mF!jpre'Mp/^Ddw!w CLW_ R6iGpj!/ 'S!+~de4 1q#v%eq\5yAR"v`{! ~GRo!iYVn 46Gh^X` !6)q Qavy86f'm8 =!$whv(8NmAYrDqxGD(S~(@:Hbw |gAy!rrP *hu3VJ-1 4R^q0a Co5芑0 g~2mf~#Q\=p 9 g) )$O,I5K׌+я"]2px&b0Iq'cHSaaLt8So!k IӨV8 zW!*#m!1 UB`]96899sY 'yxtēAAM 1Zif1\89 OD1gwR 7d5#o0nf[Xiӆ]^I*bu6 5wy7&\'('>PI+SeQ{sQ?0 )12zwΑp u蚗1)FQ1ja/M&BQɈ֊d122qİ I)0!yLwY9^w*T3:AA3D7qhЋq"ppc7yFY(x\h&PHZLp*'jFi'~GB4v&7>١^EPVw).z&r`t>PQ0D 8P!RP!GQS:7bU,+qk&a*y(S nJq:tڍrc1Z{4X&[_=k7UAY%E\:4Q R&+Q Tmr*DH&ch596Y"G8,q%w@HrB=x.e͐J !'%LM'AH7z0liKW|Ud.f r-z(sQFŮ%='f'I|99^`dHZje / #sfts=!ji  ہ7q `pU P" 0ZK;@s[d[o?dE86R C^ c-*^ ǂ3xEB M-+2 N ᶳ;5 07 PYE\&+0>rnaD ) B@a,˨/7%+K}y"p$1`+ ۚ7aN!"أanE2 qp \fSol]>maFbE#ZPF9w$4Y1Zf A?65C E 8/q kt^86IX&tR kQ FCeUTTX|2ZZ aWÐN1dƓK@+ȷ|#s<\jY~Dl<]9Ee$ ֠ RWlQ?@KBc=^+$+7lRQϺ3˛,0` =Aq ì++{%f%. zb>sokڬ0YѸ{ 0~!"C7~-ϾUlRόw:r0 QzJ0s"`"M)Q'Tc5Rr0)^]-`̐у< Ļ܇ $qd-G i, <@0tLBe\  Pc FQ2* a+biHuh0p! dmr5!c@<u]P `Jm óEí}(3a)@wq%"@ j]Lr!   JG]ӎV13DE ̠ aۦ @ 4 <` _נ%Ӑ0=T "DD1[26%  3cDq  :*VAը1` G2 %a'iAaA6י ta5AjqAO^%\c2( j$椅rJBP2=8;BA41-&& MGt^k+lrM!Ur^.)t2 # Oa V8QSu} aR Ss}0lў諮WIe#e"Vj힎"S ND#^0cAl>^jaZT-ЀQ|q \"Ύ%[2>1N z?/! !p M2KpMP҂. 2IBn0y7 K; l 1 !awqA .jAjJn! QkdC.p s*K`5N~ /. 7pQD-^ĘQF=~R;yxfJ-]SL5męSg<%,*PEE()M>xGICB*VQ\VQRLǞE{V=T] W\śצTdʤ"pwE.Xbƍgd1# \ q&ؚ5Yn<='=zH'Zسm>;ǵ\Spb D ĝ?Mt D}yu9X͝!q:UDNwo( bK-E}I*딉[T#d-ފr@ hN#o /:<]PT@B`E\,Igƕ+ z 92kȁ@dC#+B2[BI"P&R)rJ*¤,GzT %7:SK$%M57̪<ڢ3O=O֚OA% όcQEPDF4SM7SO?5TQG%TSOE5UUWeUW_5VYgV[o5W]wW_6Xa%XcE6YeeYg6ZiZk6[m[o7\q%\sye^ܥh x{1r+`v '_x,&1b/Ί1c9g^G&4)9eWfe_9fgfo9gez9hy*F:ifi:jnڰjGs &lF;mfmrF˟u `݋yoWHopW!@ g|1y1,hrbG7<m.\,*I\yaAI .K_`)HgFPXyvم[ hoIy.ǔ.(wFY7uxwe#ʯve:>Q:$#r>cpB~5d.!hB"C >PQ{t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?/)CT@:Ȼ \ D/ 9@SAsoϋKу[A*3l3=! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸LȘ3kl6]ͬ%kjD2EeT=PvCi&ꖬ]OO^גh%ؗ.oO+ ^a?#dJyE>ʕA]>Z9Bh姕jTDP0r,StW2wUg5;)U ,A}>q@zd>VN2 IHvH$ъXT=y.TeD]Z*ŊbEyJd5<8cO>ҙA NA" TK0hveEРwע5$Txb8@_nBzGyNyP??P QU*gLvl%?(Qu[-M\olўTӎpe-иHcLx#C9X0q1 ԬBp1D7ĩB8k?@jve=]t>KJ_'ϖ-iPP+C !2wQ3=0Hu4G &.H7B3@y#KW5n>߶X >2DlSzCMMiЍ :Q! $aB ĦC\Q|S D4L 3&Kb@(H.NQ4 ƂI&;BO \ A 3 P5 I,hT<0(0<LUņLAu W0V!>.+򹛬!).0%҇57|1,a!&N ^nb)-a[H+&-u㐡n.XTIҮ.$E+i\c" *yH,'RGg]p D`B;?%ɆA,ّnAh5!B4I#&* /$ԂK'@䊐A5BjA&>\^7#P e? )̂nXC  Azd 4]3MTSZ-" 3HDRHc#Ǹa/&uH&L#(P'R&on YPL<[$0zziBd|GA:6oi<&,S)U$H(T-6ف3g~t !ɄPRTrĮZ*#yET׈X SkZFIޭnR{,硍DqZ( eH@Cr1O=񩐴@ո[S+p ө,Bь3tu^[Q̥+\T($;&d'i D gtH%*/b%/tyux mC"\w4ׅG=QyU4&J{];uBXIApVQ[.Ad@pP̲5dH'*y%Vԇ<‡BNLmPEeaP܎rS+3$xmeJdKPd2W$lυΏlD W^܏@C}ȉ%P2WV?󱜚[ /^8/A^U`ÿ(>!;*n Ghih4Tax8T4V"8}ٜ7_74jɠ g'k7!tF 򁉠LJAnJ7D&9p8 " d^X vq#c$>oBNt5DEk' ؜b@3 a@~Qk7OG6ٲ$\y@J`o{hEErɖf Њv&X'?NA}4 mmtF6nFBXB/+0qDW67.PtK$B ]3J?ĀE1,2R: wLįN=E 985#!+~{yG&0:90 *GvvnĨZ " ^P7v& 4XQ ѬDQ ]:!,G+P i*2DxJڀK}#H@wCRs)ح7R)i0J5x.% 0I0s` t70߀ f]`1,77Qax-A]; ׊6_SvD[ z?-ksw Wx@-1VdVu'MKGq: P1\Wb6ՠ 1PASa;4-0YsRq#!<]DP?@jQxtj03B8KQdśhm&R.7mn?A_F|w /QdHAk͔n`aKDNKwt/u00{k;rA ;+pmqHv7K/Ndp!q(S4۳l /w@3.! .d! 3d =5'l% >LB )5F+|o1'!qa<10i G@cQ'q{aq` С!rJhU~L` a<~P2fm>EF0:,Fw25j%1hQGp:kD%Sz%&8$R 4a+d]͑+ # ,Hҭa - @ǝf%*q$ԍ".,RQ1yPQfpT,P` Sݍ!ϑ'-ZR+MXaE(`MV:-dJA 40C'k?q7[lO&"0}/ hF5Qi+^T!)"Vb4c ^."% )>w B n&(ÀUŢ@배Ch pa s]μ.ATu׻` `z # 6^gݙ^@3L ! d^ q >&/o yi[ '~da# L BN뛑+"&, xC>_A/!Iy!$'. _eb?d_fh#ohnpy#Tqxz:5?&Q$cꄟ?_sOBI2II(l?)MO1~@A1^cIȟ"#.zP o]_%: /t#/J#a9q@@ DPB >QDS $=~R$A R]RJ-]SLyTH(Q8i*!'DQy(PM'ZrZ0@CQ^=xAҐm`)9rQ Z `muMDjAgVE dbƍru2FlG.f'-3Q T?.Zjw乓zcCkcz삋ղPO\<9G*? YXyG& ug矈\$pDug}ny@$J a vZ@ <~s#e_r \ivA؁j'du&#‚ }k(ᷩ aeƮVH}>n!g)Lasع!['vukByAL KX;q gFYyA vܵՙ%jy$ "|( gga%WyW\AlǻsW Kp(Q`C x! @#XZmUA}I@$QEp ehbH Dp{R҂/ЂtksCl!#HZ< rי&<.GK2 DǴ-d@@E/х9+@t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ޽zah'?4A?|5QǽѹSBK3:|w_p~?~;v6OE! ,W! ,WH*\ȰÇ#JHg0bȱǏ CIɓ(S\ɲ˗-a"*̂ryϟ@ JѣH|JӧPJJիX2ʵׯ`ÊKVցP]˶۷pڹx˷_wn˸ǐ#7 pTmJ̹4k@Ahv&"kA&EQ|h0YtQ%}ɇKBDWpSzXe'x8+Ί>|G<]NЖ BcK- G45ԔUy.!ҕ"JleRIنՌ h5c?Ӑe~TKaCFК 鑋W:QhGJT@:&X:y T b)a>BzZGB #5G =:?Rʐ R(3@ϹXJ.IkNC<Kj͸I-=yNm 'BяZ} ClUbZ>dj VB@N1D Urvuk'ЭY [B4 G䣏m &N#T^ 9](MB NA%iy6JclP͒ C,JD!?dD')cU D;$<zwIZċ{1iKT]t*C(9!,.j2(Y W%_ :QJI%pe S6$S>G t3`j4ƀ LJ5A25")yDV)%T7".,d?LU*_!PQf tI0X(ρW9L#)n-%";EbC8^dnb$-Es@AР< ĠeꑠP!8E`2͆[Hø$3O%WTZ`L5$k:!Ch IEHbTL QzeL刈Z8D ׈!Vh|.xu 8I$N E&L [=udf@][L͖+9ntN -Hف' )4P{&oW6;@e`"?!EoA6"q92.NEjB4ȡhMq䉷 r-_+D!yyrb"g"Olv]%tmxmx 2 |@bGDI]$tm"|l{ds/W L_d qx'j+$v|'f!rf*ee"D4I5ʕl8/}% 8lsbF2PT# yTUz  Mr|} n"c漐XT3[w& ܒVcBuFH5P,w"-7-3|V&|89?K3}Tc .ALZn;oQA>h慌1%=H{C"SSM#,a Xk>"":[ Lh.}цr= f )w2`f @ j`47.>Xֱ\r_{. dY.ׇRGW @>uv* _$vsgEWYI:(Olpv@ɱFyڙ:q(h/Ll{<>!>S_/W @,p 6Q B&؀<?aaK:6=1Bv\mF~Q# xasf1d_E! wcNy*QvhurxC3E VԦHVhs4 11g=d>Fx{[m}JwG7uQ} ~tuZagV7gcsCG }%u% %0HRhn<>!|3ma Q-7OoA1/S 7*{&W5@ Rn | ~,1K! 1`. pr!4+\ Y7L +=w!|CtCA y,QB p @ e#;B؎tk(tTu炂!c.Hk%`mGEdu`l q! TQ70Co)nq %|J%jJvwU Nhc* }qa#:'t7}1,! 2 ׏Q/XH0Y \U2Ts! 0 l}oԊ$Q!Gm(a*@Ar]8׌wkg5fV'`+$@`-e' `И!wP)6ur%4xDŽʹ(QP!@l)GlI EYRE T))ҩ萀JqN&92sk@ Ŧ!wW N9TV/^ז -g1<!-qJ! PxjPzR7}a`4ؠda9xz)O ( 2pJ7'ty-GWژq\ QRPmh!Z: 9 ]:TBwLJpU emzF[3UcL573~Q!t8ڕKx̓gQhmH'W%@%~9wꁦsP UaV|b:XK).Q-q%!e7RfQn HZ3v ]>5gLFr#!5>T>&c jʒtAq#R}&av0: OetL9 ,ۦ>u q&z G!|QUr])\O hgz^DuҒ2 8 p 336wxw7+v0z,,\3ug? hk 1PPYEOHEQ|TѱHva(aPA1vqU t\3l18-{{0 t=q.e - 4+Oq-p{;*D>ѳC 14"xQ*j @! j>ASqL@'IQ%i+ыNL:h ~`?v*Aqp^DPR1#`,tI1{CUSc5uH-  J"ogi 1^C~:-wG+.#A QGP$!/c<;a@ v]q1u%0(1qL|THѷqv&02J)w,|2tGi4t#Cȥ(돈:#k\D`0q]+%Q"b,>`qb 󐡢@uKgb4 9ųL4݊6Ӥ5a|Ѐ =AΧs7C  frsRp @bc!3+8%pjߒ VH#2+C$q 0E"&Q1Q$ ٤%RgNAW + ,@@ 4ɉlA P_q&q&0%@ m !Yct & M^@;+4< q` q!ݲ}jB{!=-ɦq ; #=DK`Y=}  aJtAQ`Mc!7 #S;p0XL0";`rD 3g k*8&5_wa*rO1]Z2* XL D LcޱN`znH^^TA}^ |IL/ "q%DiY @!q . GoI0̐l99+=EQQ!Bq D } ")wRWQQ1 `?_?=@O60ȟʿHL0؟Q"A2-^ĘQtRH%MDRJ-]S̗lh uST;}TЃz 0'=F>Uԗ9^ŚU;VeƊ5U,T3{W\uV *me( $Ȝ.-()rJN]HNB>oa؝e*OyeNq^h*//_;c/$)>R$P@0A0B 'B /0C 7C?$ -EDOD1řFQE_1FgFo1GwG2H!$H#D2I%dI'2J)J+2K-K/3L1$L3D3M5dM7߄3N9礳N;3O=O?4PA:gAEt$XD4FrZbQ9'RM7p*4TQ9< tTUW"UYg Pi59Q]v4 XcE6YeeYg6ZiZkWCZov[%\sE7]ue]w߅6jcxq'T8`&`F8aGa5 =7 yLO1Ab߈H6Yscرe!x G,'8b_0Gߝی8bA'5z/!1 ڡ@lz5YXtD1%Kzʝ~;c !gB*qg K:z'E~is6|n *=y'v<$ ΃wjTKx (/{ ,B j{w8{ b~" ="ǔ:/hK<yiN;={ }-pXq*Pm)Eu!c7 1\F nV@4g09;1$}>BXfn A}aƑBao.|!= ƋH" N*1 q =r Ѝ EM{YLp,*v$5f]y!hDBCR 4RX7㏀,#B'bJR!=p|#(p;G t_ :-pG YrNX%HrH;j LԈHJV׏׭N1 anp02 d͇dQ+tτq%:xF 9)yTՠ0Zȴ{Ќ(Bt=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վvo{>ww{w|?xG|x7|%?yW|5yw}E?zҗG}Uzַ}e?{.YT%ݠR[!,_χ~WۓHj򗞆{}`Nn'gz" "X7ևAR! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸LȘ3kl6]ͬ%Yd%$4@͐bU:̒`쬐Alu{ڷ{w텾 sHF،kYB=:奏 :@] _aZl>嚀&kDDwO 4ȸğ@%=RlWPz\Mt O_#+]QwHZh *'`C6GgD z(Ѓ==Q/ӔT ѕiiD+X U#P@H<=KAq- ՞]$i&E֘gգU%#>(Wm0iwv%>X-O; IBӎ@jZG 'b29lO4KOZx>lJ3F7 ;{g1@%*ծA-ӲO<+9)kB3@\++ ҅k@ca7UK1LHF%UrLGH[L7MB+SAvDH1D@HO<=ԪJ_G@cOoR =j 6Bo+t-Уwn5%({KsTK"?M,NUУ,=vC @TE4Tm?rp; $-I;30R:!){Ildm _GN_ҳĴGJb/&(͏#a l-(>bB 0!h]#lɨM6hX*t!JJTL`,f3z+DdoF.H!"ZF{,>AAbF]ø(r &K#H!k\ rHw?ǮǗk10H?tl-%%BV1˗Ы"EjM.Ht CJbגd dq_F֏Zl8Ir eH&ARK\!*KG\!D& Y%raDmp33BA$H@ zHLp~I%e$eB ܁dJ|YxU2d9_5Ju 6 8x$fUDsF!Bu"r8_-'"e-C>,<Ѵp!UȪgPAeAdWX׼Q 8"օ?Y^Mh 6p[6>%VW_!k&J0U" H Ob=&="2m :xA5'9G%HC!ch#:Eԇ 3#gІ62ovL#d]Ej>/ I* 郬/C틘BdMWfJƹaq *$})A @##Af\<";dūd ,Yv`FVߑm]VɲiaB j4z >2tȷ$  `!~s,mCVtx,QKUW6! 72#{I>m[}sy<|pW \]^S#쉟6fanS/ŌLo){#5_88A_BW5p#^@I?Bx&}'0&#з0r~CQns7%&F'|Rj0` W1V&3lafՑxEe!a#p*8b`_#Gofr #,7*kudJ:cPz1a&D `{{h p4n(Vr H| 1ln= `lᆇ& fh Հ0406 ` @VB(ЄF!]GrЅ@Rbȇ%jm% /# A?(QmU(Q'8E wY_E4 1caJz}NX Gr%FWhh 6P}WnGXy! @P- ?)@v# x%"V@,hZXM'>5`h@EXQI E6I8]7X~@+0*g5('a,р)k  ) aٕ 0 T ݡ$t vGV9hɓ/Q{%q~+zQJ@ u0u!_!VpwM 1X}iهs%eWiw=.DtQT(i9Ǎb z A\ )'ѕVcب}d4pe1@ki~YGQqw'7A)-apsj4sBh [ !P0RoRah46 dk/e!*X표 "pc5A.ӎә+GU4 Z0}L&n.':iDjh՛"6J$/Ќ"EՠufDR2@p5VF!Y0) AqЋSYF'@߀U,>'PHCW@T="c*֗BjNJTB5$Ga1r|Ia1'5E)= dufv?祠չKF2>z@aJ&n"kJwCЀ)H3N;>&tWƺ21An%NQBj--l P.`؝ЇA)0-: >7m|3 )84+Hʠ%g'$:aI(Qԭ%1rjkqq JNq7Uz[&U_Dq-qFM$)Q1tH;tY5.DH$$u/%bkT#Qc4zA7:m+t[B4`;A+yP1kknעD1IP%x;+J6)0=>p+;-k:" p g+m(*s+yl 7:a A q#DS1S]YDŽ0G!G[bINq(1s{&>$  u)tL[p5չn`ͥ #Rh_<6u񹿁o;@tHNsDaGNV P )*h!5[~u DjH`pDD@eNT-\~W5%+:297d,1fc yFPoB"sK7 H !a M5&2X0 K*q Rz|Jf ˱ n AM {~hJ L y̥, 0ɣ+\jl^"Ƽ7L2\ ·*>l ܒ4qA1@h !8KO W$T=o3c #2iau"6W# A @` ?F/s 8 vkZYP OMVur2+"d* < , "  Bo|@ <4M*rq! P,Ҁ$L n.ö* y_A a|cQ Qϣ 2X1|^P5%|=”+BR|A!2/Aqp R[q " t Q(0kQAy5*M #l UQ،:<&Q,ҭ)Ϩ##+ɠG+aA1:1, G0!!+ PO2 lA ;m5aMRsm u B^)E G1wALA JR|] =Aw! -GG  0̩*KD~ 2oaUR1AӳR pܯR,B_H(~ Z>%@g}FI#F.>#` Q!\X ʮ<r^Dr8ހp>Ċ~Q.j4nR]R1ӲnrH2,J7a?#p` 7$_&P$#,.'A5T0_68 `9>5@?D_F?rCLWI~La<Nn5Q(^?NyncoczoUIpproK4?z$qb +z{e_0_V9!A?-< A~`^Cyx.QQD-^ĘQF=~RH%MDRJ-]SL5męSN=}TЋ%TRM>ѣR^ŚUV]~VXe͞EVZmݾW\uśW^}X`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFZj֭][lڵmƝ[n޽}\xdrG(]B0/؎t݃wxPp\yacp{[o_=/@3;D0AdA0B 'B /0C z啁 %W6$D:0MdE_1FgFo1G8H 5t2ȉ)hNH%dI'2J)J+aG,r2Fad@ٲK5-c$LG:Ҡ$פBz.bgr⬳ޜ}(`I(4Z!})RZHwS?1gjg$%U8R!`gr(b PMhscՎ3N[D{TR^ebmv~-șkUU1Rr,(?H(N=ֻ6a&Kz]jU'^mQ4t\池r, ]2% C `z%#NM ̐)BfZj Rؠ:ǟ?Se0-D؅T^H% r:ڠ7s(e " A>%ٕPQ]`'GM!Y$vb6~I #bmᮨ1 I^=\(Z栲 zf߆8a"#7E0(#1|0u&QJ`aFՉNwtܘkγr7gwHDt.Ќ^{GȸU1!z*Z(DR E?5d|C( R:א툈;Ёq@'wcq!&(H%,!,7UܼЈ!dPIh '+~p!#<;Ƒ6 k: ~UC;6 t@*|PܐF+hGޣF1" 2/FJY[# ?Z2=TA20ms$D\Y5I:sc#gi9 0X6hƲ 4`-B&(+2p $gvLCYI!;5Nj,hF<)dӟh@2-fhBP6ԡhD%:QVԢhF5QvԣiHE:RԤ'EiJURԥ/iLe:SԦ7iNuSԧ?jP:TըGEjRT6թOjT:UVժWjVUvի_kX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yl I0B %&HIpNA0WWwo3z7 .1N;>w{.SR]@@! ,WH*\ȰÇ#JHg0bȱǏ CIɓ(S\ɲ˗-a"*̂ryϟ@ JѣH|JӧPJJիX2ʵׯ`ÊKVցP]˶۷pڹx˷_wn˸ǐ#7 pTmJ̹4FAh 5pQǿ>bO$W WC>*!,Yb8r9H- d}/ya1d~ S)_!CCeE4 2#dU0,b?' sKlHDm3ו$-%чɶu1؎,HH3 B@zƒYq5vܒK=F{a$Lǐ%$yFPEKKבC&8* ֎e,3! ,aBJA FJLR)iD3GK_ X,1͏L a#V`1 G-Nz U*w-AG~OCYA1M3Tq8VȨGZ!I y!<ς# 1C51 tBR1 mRDgD)KF5 ũB5"xD<`jSw҈DU S9AH"McâPH c )7Zg"@B#Y™>&@Ge-dd468X,CZ!KSֈ3m}BrP *+'ׇUY"J-R9XR*BvT=Rv BȱA} K":m!/I:YYF H}qZ}@M Z|)H䩐v< bE؛2#y'BUa%w6! n^#amAeAd  ;\SO$<(3#U{JD ɇK!yV[A(ҤU\$M k 1q#d͕< ␶r.N?ʏ]E)AtGHhd5"a}=+ Й!?"EDԌ6/Qp~z_ LiІCgF0"ڠAzc 1@atV =R0c0P ȍeB䇒&i7O~'=H0*RkMZw}{p{ [`B:uDZu4 l#~\7kFo/w%dN!s gGb7@IWsTeDWy&G#? q\ !6)~}!!rjg{X^lm78" G/85wxEPG&dzą$rXahTH@"i | dkA &'1h <Aq3f,щ߀ɰL!+ye  g <$AXP fz Ҩ M23 0*0BЍ"QWIB阎tk(Qc$s$Qm($' i v1u a" rE15%dN7щH)WFL3 A{pmw@0`O'*"&Q@|$IB8@,! 2S4=hBa 1 YA!!mGo(mqC: gr15/E1 <2?rv>9@fwy%O'>Pi/is\ӧlp4Q # 0  [ٍ0 OZoy0`iiuU803I{Y`%qtd12@ ט*uvs@buw])*1tCK+{y:q$G dĕ1f&PiLp*'Ef4s'D3&GfOP|яe ?шwje*5(1Lӟ2"8`(EPQ sC 9ZҹV:۔!I(S ɂCʟ+vrc1caa2KFPzW!5ZFJR AQV84 Q ;i/ 6H&cP)2Xl GkHХd GP4We3@J !'%lP&1HoEb56|ʠ>@cjz^V\-z([Z_X*7h7\bAP52vr>YH`>b`aHl  [rN뵭paeqy8#@F?!'i@xy0u@rP O" XZ;Ӯw6QaDX$M8P;-i. %Ƀ.u* ŘEB vD <ۋi&5e  S !+~0 ӑP 0}녭 +spG6jv@b!Px=0Ժ.kJѳIw0+/CJ Abˀuj.V$p;O = B)yWioy#[qp f$; =4>4[1zblc,X Fu5:GleG2K[WfyrMA[}814¸q j[86 3D' 1`43F-Vo{GqB| O܂X!1C+T qT(cTbu3E ^x*,k{QL]3qyP@Rt# ֠ UElfG\K`x|?ӌI+q&+;#b };WB""  ++m Ůw I,ıB.lz>3Ÿl,^ŸKׅ0!BW44#+m%0w @Ŋ[Q`ʌu:r0!&IU%`" )D[+0A JuH<3Lj۾>x],fPI ͈, '*]NN* )R'NfX"ctd>QQTPPt@jH&þͼNN% ' q fJAKL̸~Ayh ao zڑG @ׄ0 ` 1 q-a"€;j 0a a AZn@J} !a dt@p s* K`5^N F.{ q7ű<^ZgƐQRq F{G!Ga! 4 \b?d/Phjd1Plr?t_vxz|~C` Z^oYg?Cex!?RS }dyn9.0K*c!=<\sc0Ƨ_O7b/ #Aq!?N9oL30/$)a Q.@@ D0!)Nr0--^ĘQF SI*H"RJ-]RL@LyH%S-ݙe.DL5hR"V]"< P!!YUZDپ;2q9YAv Mwe_#$W1Wp*G_~ K1C4j֭vF زkڵmƝ[n޽}\pōG\r͝]zխ_Ǟ]vӧs^x͟G^zݿ_|ǟ_~0@$@D0AdA0B 'B /0C 7C?1DG$DOD1EWdE_1FgFo1GwGs H#kL"$8I'W$g%hs2 -3+D3c "Ԅ3RN; sijO?K#?%PCE4QEeQG4RI'R{啩VSOTS>%TSOE5UUWeUW_5V ZeU:ǝ5Xa%XcE6YeeYaGtj 2%vI}v#`%IvƵrυE͟~R ]}c~K {m[hWeiv`AiCG {ۧꋒ/bʷm!$2آ@~8b'ȅJy1ǔ.3w|E!6neZ-ymnr:Gv9pz1:Zyi&%|2,j YyU}2FzHy8x rnla{%**Bp9؀7lS^NVK2RrV'Iqi ŲsF,6} @h@៫hb/*ϼҺy^} vO!s6HOWaW Ҏ~/!z`> }M!r4Ikͷ^ƲمBz %G2284"~x? I*` 40%r@ +os9_B"3^F6L0#9aĈDD+a+FFjaD^ZKB؏$\DÆ1`XAJG?= JC?V̓,\"(8s`5XE9 pd$1fNusl=)xӐYgvd"Bœ@ΌR P|J rxJtD!/RbȔ5iϜT4iP:TըGEjRT6թOjT:UVժWjVUvի_kX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>r'GyUr/ye>s7yus?zЅ>tGGzҕt7Ozԥ>uWWzֵuw_{>vgG{վv%).[wob&sJx Bx+CxZ W@3CMbBvzg|E_8G}:3$ ! ,W! ,WH*\ȰÇ#JHDc0bȱǏ CIɓ(S\ɲ˗-W"̂ryϟ@ JѣHLӧPJJի ybʵׯ`ÊRXȪ]˶۷p2$E Zx˷ߓyy*Ti*^̸LȘ3kl6]ͬ%kjD2EeT=PvCi&ꖬ]OO^גh%ؗ.oO+ ^a?#dJyE>ʕA]>Z9Bh姕jTDP0r,StW2wUg5;)U ,A}>q@zd>VN2 IHvH$ъXT=y.TeD]Z*ŊbEyJd5<8cO>ҙA NA" TK0hveEРwע5$Txb8@_nBzGyNyP??P QU*gLvl%?(Qu[-M\olўTӎpe-иHcLx#C9X0q1 ԬBp1D7ĩB8k?@jve=]t>KJ_'ϖ-iPP+C !2wQ3=0Hu4G &.H7B3@y#KW5n>߶X >2DlSzCMMiCx;@&@l:gN:"|ODÄH,E)X)'J:r$S %p?VP$HA(d;/ f0#:jX
H`PVx6/J +Hă4VsUpc" <8duHqi,ɕ>ƨa"Ⱥg!qzyvsxl B2%&!}ҳˊ0bDE@hɘ J #ɆY%yLeIaDv[YZxIr D*\ Ѧ^:A!%W}*̇(Qs@3 ө/7E*Z) e?HKnXC =z$1bLiճ ?$$rs tpڟ:(xP")'3cH hP5])&NQX-L=R=4!2K#Op - ҴC@ cSa* NrMDvIҝ:D|)[d:StV8]T°#x;iCDcuMSJ\~%<9  T 9!7v}[PIHVB"gCkhnMLAD38 "׫^Ox5n%u JHb`"KF|ґJ$QFɑ\LŮQ<Z0O$M xԣ庝>Z رĺ ĻɭHJ -iP> DD2p@ (Jٚpzygx뒅 DC(' * +,uе(}X mHb%]%(H-*G;Ml^p?,_H*L\qG>3 IhM/ /e_՚ P6{${@Rqle@"rSkuѨ8rAL)]@,&$(3A>0 Y 憌zPE] @,+`Y (z2dc(-~NNlAbDbR5mfQ5AbqVm\ ^ "!Ѐ m *n]ML_T~E6d G:e~)݉S/ {ADԝ]$ fAi}-\7yk+kcRrTkG n0{+@2a\d&;Mt8(w|h @b;W&Al2!*"zwHzkC(9B Dw yx#}3!0dHMMW+0?C Kbw} {_s ,t$?!k結 ~߷D-=W'}b6dpUY0Fe{ 6g8ӧ% TF(}\q+;#0dVa y4K@QR~) 8Kl2 Ֆsa@+eXyC{'р 1ImdgWh=xYTh2Ek# hHNRqywe5`}$[3uL6rtd< swzm!4x/Q0 pozq  dgy^ a{H((40(6 ` tOB(`G!`yosRpч;E[{Hs(8!@iJ5qByp\@_ A]33%gQ _xe%AFu8h (6P~HG]X&V1cqk( )Ifd{M@fq+ڤ>C+(X23-4%j&R.`7"JXDg 1UBaHaQ6eCUw,Q{[kfk{xA s@bjs7kx/ZijВ!(SքZ#q4 .! .`^6Hk% KB '?D·kQ'1ƭS2 Mroܲ*"ޠRS{ժ+= 4S 9} V d21 А ҇pҕn1hhZ<h27tȴSbpPTF6P108Lvq6$V` \] 7q[A ‚" @a 'c-2bsDZ{qVF 2 B. L=/q ;VhQ# s`Ի#UbL 'BmA yP&AvaE:,7Ն;/S!@3ȃaB2@b Ȁ4p*n 'm+葾fVRQ+F!\"(%=A-0" 'Lߡ)*yLPu-,O #կ֍۶ɑ'-AS}x  d%"+,ѭph.qA3y7?q7k%M0-0 shE5Qi}S!2!)"V4# q㰐*xD(?"R"yw1LA =Gn1 w # 86  121zA`NM` @zb 6hgN>"$4#  ! A^a~nq? a.h= ~娞r_. aօ:^B L mXNA"&,a _CnA/I!$'~5T?_:[} ]:J aQ "M2>(*,.02?4?tQ^:_9/?2 irHxA_L RcIp\^oQ6f#qbg(Ap?!~4t%đV?#OsR 7! c3pG7m_ET@a! 6{ 9B&e/0@2_σG_L_Jr7$?AhLo @@ DPB >QD-^ĘQF=~RH%EBI-]SL5męSgK*wTPEETRM>UTU^ŚUV]~VXe͞EVZmݾW\uśW^}X`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFZj֭][lڵmƝ[(s}HdGdoN lGNtwv8Ng|3^_~g0@$@D0AdA0B 'WV"%W(C,PCG$DOD1EWdE_1ƨ H 5d1GhNG!$H#D2I%dI'}J+1sEa )R= DEr"yLN<"<`r~3Pt sF~L`)yGw䈞E5G$iL@ \'2 bׇ;7?v>e5TA5&d` YA~&EhLg&}T!d-Ru ,09) @0K@6eԦpT&lvjw\'rύ_cc@ ď~f/X"|0%@55ۍ1j bǁ/H՝)HYS V TOGu""y_ڹ }iHBy^"ųe~ :娋& K\uz E"J# .%(GHYfFp l w/h[Q΂ohh&sXysf\)ׄZhJ׊꽢  j?zzuR"&Jچ|!x (K F<dO G;wMB)lSj9<}< "3 S !Q`J&De d T>c!<*x@@(< q*ŃCL6\;P;l"22PX9q1+^X.}4ˏQCBVH7BK'˦tȴO(ĚH<- !eBGr"``?K.ɏȸDIdP#GJ9e-9[q"xV)_,&!-rd:$u/.Dg:չNvҲNzӞg>O~ӟh@:PԠEhBP6ԡhD%:QVԢhF5QvԣiHE:RԤ'EiJURԥ/iLe:SԦ7iNuSԧ?jP:TըGEjRT6թOjT:UVժWjVUvի_kX:VլgEkZպVխok\:Wծwk^Wկl`;XְElbX6ֱld%;YVֲlf5YvֳmhE;ZҖִEmjUZֵֶmle;[ֶmnu[ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^׽o|;_׾o~_׿p<`Fp`7p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv=mjWvmnww=nrFwսnvw=ozwo~x>pGxp7x%>qWx5qwyE>rNg%lfNIsggH6A?JMe<FOё: onR5DgzֵZ8l_{3J I=1;mu-editor-1.0.2+dfsg/docs/changes.rst000066400000000000000000000000351341747546300174440ustar00rootroot00000000000000.. include:: ../CHANGES.rst mu-editor-1.0.2+dfsg/docs/code_of_conduct.rst000066400000000000000000000000441341747546300211510ustar00rootroot00000000000000.. include:: ../CODE_OF_CONDUCT.rst mu-editor-1.0.2+dfsg/docs/conf.py000066400000000000000000000135221341747546300166060ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Mu documentation build configuration file, created by # sphinx-quickstart on Wed Oct 18 16:36:40 2017. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os import shlex # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('..')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The master toctree document. master_doc = 'index' # General information about the project. project = 'Mu' copyright = '2017-2018, Nicholas H.Tollervey' author = 'Nicholas H.Tollervey' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # from mu import __version__ as full_version # The short X.Y version. version = '.'.join(full_version.split('.')[:3]) # The full version, including alpha/beta/rc tags. release = full_version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'alabaster' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { 'description': 'A Python code editor for beginner programmers.', 'logo_name': True, 'logo_text_align': 'center', 'github_user': 'mu-editor', 'github_repo': 'mu', } html_sidebars = { '**': [ 'about.html', 'navigation.html', 'searchbox.html', ] } # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = 'icon.png' # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = 'Mudoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'Mu.tex', 'Mu Documentation', 'Nicholas H.Tollervey', 'manual'), ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'mu', 'Mu Documentation', [author], 1) ] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'Mu', 'Mu Documentation', author, 'Mu', 'One line description of project.', 'Miscellaneous'), ] def remove_module_docstring(app, what, name, obj, options, lines): if what == "module": del lines[:] def setup(app): app.connect("autodoc-process-docstring", remove_module_docstring) mu-editor-1.0.2+dfsg/docs/contributing.rst000066400000000000000000000000411341747546300205400ustar00rootroot00000000000000.. include:: ../CONTRIBUTING.rst mu-editor-1.0.2+dfsg/docs/copyright.rst000066400000000000000000000054021341747546300200470ustar00rootroot00000000000000Copyright Information --------------------- Mu Copyright ============ Mu, its source code and associated assets are copyright Nicholas H.Tollervey and others (those who have made significant contributions to Mu can be found in this list of :doc:`authors`). Notes on Image Copyright Status =============================== All images used in Mu's developer documentation fall under Mu's copyright status, except for the following images sourced from third parties: beautifully_useless.jpg +++++++++++++++++++++++ Permission was sought and obtained from Katerina Kamprani (the creator of `the uncomfortable `_):: Hello Nicholas, Thank you very much for asking and for your kind words. As long as there is no commercial use of the image, and since you mention my project, it is absolutely fine! I am very happy the images help to prove a point! Many greetings from Athens, Greece, Katerina circuit_playground.jpg ++++++++++++++++++++++ Permission was sought and obtained from `Adafruit Industries `_, the source of the image:: yup! 100%! please use! > Hi Folks, > > Is it OK to use a picture of a Circuit Playground Express taken > from your website in the developer docs for Mu. Like this..? > > https://mu.readthedocs.io/en/latest/modes.html#adafruit-mode pygame.png ++++++++++ Permission was sought and obtained from René Dudfield, the current core maintainer of `Pygame `_:: public domain Go for it! Feel free to do whatever weird(and not weird) things you like with it. It's a modification (by me) of a logo by Gareth Noyce, who also put the logo files in public domain. Gareth Noyce said of the logo files: They're public domain but I'd like attribution if they're used anywhere. Just a "logo by Gareth Noyce" would do, but I won't be complaining if people forget. :)' python.png ++++++++++ This is a copy of the Python logo owned by the `Python Software Foundation `_ (PSF). Mu was originally written by a PSF Fellow on behalf of the PSF as part of the PSF's contribution to the BBC's micro:bit project. Furthermore, the PSF say of the `use of the Python logo `_): "Projects and companies that use Python are encouraged to incorporate the Python logo on their websites, brochures, packaging, and elsewhere to indicate suitability for use with Python or implementation in Python. Use of the "two snakes" logo element alone, without the accompanying wordmark is permitted on the same terms as the combined logo. In general, we want the logo to be used as widely as possible to indicate use of Python or suitability for Python." mu-editor-1.0.2+dfsg/docs/debugger.rst000066400000000000000000000127501341747546300176270ustar00rootroot00000000000000Python Runner/Debugger ====================== An obvious requirement for a Python editor is to run your Python code. For standard Python, Mu does this in two ways: * With the Python runner (press the "Run" button). * With the graphical debugger (click the "Debug" button). .. note:: For MicroPython based modes, the code is run on the attached embedded device and not directly by Mu. For example, saving your code on an Adafruit board restarts the device and Circuit Python evaluates your code. Both the Python runner and grapical debugger were created with the financial support of the Raspberry Pi Foundation. If you are creating a new standard Python mode for Mu, you should *at least* make available the Python runner (please see :doc:`modes` for more information about how to do this). Both methods of running Python code essentially work in the same way: they fire up a new child process and connect its stdin, stdout, stderr to the ``PythonProcessPane`` found in the ``mu.interface.panes`` namespace so you're able to interact with it in a terminal like environment. However, the Python runner starts immediately whereas the debugger has to set up a bunch of debug-related scaffolding, which makes it start slower. This is especially noticeable on the less powerful Raspberry Pi machine. Basically, if you just want to run your script, use the Python runner. Python Runner +++++++++++++ The essentials of the Python runner are in the afore mentioned ``PythonProcessPane`` class. The ``start_process`` method is used to create the new child process. The resulting process becomes a ``process`` attribute on the instance of the ``PythonProcessPane``. You have some control over how the child process behaves. * You should supply the ``script_name`` to run. * You must also provide a ``working_directory`` within which the script will run (this is usually the user's ``mu_code`` directory). * The ``interactive`` flag (which defaults to ``True``) will mean the user will drop into a simple Python REPL when the script completes. The default is at the request of the Raspberry Pi Foundation who explain that it is often handy for beginner developers to run their script and then explore the resulting context interactively. * If the ``debugger`` flag is set to ``True`` (the default is ``False``) then the debug runner (see below) is started in a child process for the referenced script. This overrides the ``interactive`` flag to being ``False``. * Any ``command_args`` for the referenced script should be a list of strings. The default is no ``command_args`` (i.e. None). Handlers are configured to handle various events, such as when the process finishes or when a user type a character. The ``PythonProcessPane`` includes basic command history and input editing features. It'll also respond to CTRL-C and CTRL-D. Copy and paste can be accessed via a context menu. Graphical Debugger ++++++++++++++++++ The graphical debugger exists to give beginner programmers an easy way to observe their code while it is running and allows you to use breakpoints, step over and into code as well as use a simple object inspector to view the status of objects in scope. .. image:: mu-debugger.png When a user clicks the "Debug" button Mu transitions to "debug" mode which exposes the functionality of the debugger client which, in turn, communicates with the debug runner process which is actually driving the user's script. The debugger is designed to be as simple as possible in order to introduce beginner programmers to the basic concepts of a debugger in the easiest way. It does **NOT** strive to be extensive or particularly powerful. Rather, its aim is to encourage beginner programmers to explore their code while it is running. In this sense if conforms to the Mu outlook of providing the first steps for a beginner programmer with a view to them quickly graduating to a "proper" development environment once they've found their feet. Most of the debugger's functionality can be found in the ``mu.debugger`` namespace. Coordination is done in the ``mu.modes.debugger.DebugMode`` class. Debug Client ------------ The debug client exists within the Mu process. It spins up an instance of the ``mu.debugger.client.CommandBufferHandler`` class in a separate thread to handle inter-process communication in a non-blocking manner, so the UI thread is never blocked. The ``mu.debugger.client.Debugger`` class is used to react to incoming events from, and as an API for Mu to issue commands to the debug runner. It uses a reference to a ``view`` object to update the user inteface as events are detected. Debug Runner ------------ The debug runner exists on a new child process and makes use of Python's `bdb debugger framework `_. It spins up a new thread to run the ``command_buffer`` function that listens for incoming commands. The most interesting aspects of the runner are found in the ``mu.debugger.runner.Debugger`` class which inherits from the ``bdb.Bdb`` class found in Python's standard library. It responds to commands from the client and sends messages when various events occur during the debugging process. These messages are picked up by the debug client and reflected in Mu's UI. The ``mu.debugger.runner.run`` function is the entry point for the debug runner and, as specified in Mu's ``setup.py``, is accessed via the ``mu-debug`` command. This command expects at least one argument: the name of the script to be debugged. Any further arguments are passed on to the script to be debugged. mu-editor-1.0.2+dfsg/docs/design.rst000066400000000000000000000006261341747546300173130ustar00rootroot00000000000000Design Decisions ---------------- The following documents concern the decision making aspects behind various aspects of Mu. This is a recent practice (started by Tim Golden) so these documents do not cover many aspects of Mu. However, moving forward newer technical decisions will be documented in this way. .. toctree:: :maxdepth: 2 design/file_reading_and_writing.rst design/line-endings mu-editor-1.0.2+dfsg/docs/design/000077500000000000000000000000001341747546300165555ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/docs/design/file_reading_and_writing.rst000066400000000000000000000056541341747546300243160ustar00rootroot00000000000000Reading and writing code files ============================== Decision -------- By default Mu will save files encoded as UTF-8 without a PEP 263 encoding cookie. However, if the file as loaded started with an encoding cookie, then the file will be saved again with that encoding. When reading files, Mu will detect UTF8/16 BOMs and encoding cookies. In their absence, UTF-8 will be attempted. If that fails, the OS default will be used (ie locale.getpreferredencoding()). If the file cannot be decoded according to these rules, refuse to guess. Instead, produce an informative error popup. Background ---------- Originally Mu used the built-in open() function for reading and writing its files without specifying an encoding. In that situation Python would request the preferred encoding for the locale and use that. If the user then used a character in their code which had no mapping in that encoding, the save/autosave functionality would raise an uncaught exception and the user would lose their code. Discussion and Implementation ----------------------------- It was initially suggested that we simply read/write everything as UTF-8 which can encode the entire universe of Unicode codepoints. However, files which had previously been saved by Mu under a different encoding might produce mojibake or simply raise UnicodeDecodeError. To overcome the difficulty of using UTF-8 going forwards without losing backwards compatibility, the compromise was adopted of *writing* UTF-8 with an encoding cookie, while *reading* according to the rules above. It will still possible for a file to fail decoding on the way in (eg because the locale-default encoding is used, but the file is encoded otherwise). In that situation we might have attempted to reload using, eg, latin-1 which can decode every byte to *something*. But the result would have been mojibake and -- crucially -- the autosave mechanism would have kicked in 30 seconds later, overwriting the user's original file for good. Instead it was decided to offer an informative message box which could explain the situation in enough terms to offer the user a way forward without risking the integrity of their code. UPDATE: After initial implementation of the encoding cookie, it was thought that it was too arcane for beginner coders. It was decided then to save as UTF-8 by default, although without a cookie. But if a file already has an encoding cookie, that should be preserved and the encoding honoured. Implemented via: ~~~~~~~~~~~~~~~~ * https://github.com/mu-editor/mu/pull/390 * https://github.com/mu-editor/mu/pull/399 * https://github.com/mu-editor/mu/pull/418 Discussion in: ~~~~~~~~~~~~~~ (Initial) * https://github.com/mu-editor/mu/issues/370 * https://github.com/mu-editor/mu/pull/364 * https://github.com/mu-editor/mu/pull/371 (Later) * https://github.com/mu-editor/mu/issues/402 * https://github.com/mu-editor/mu/issues/696 mu-editor-1.0.2+dfsg/docs/design/line-endings.rst000066400000000000000000000052221341747546300216640ustar00rootroot00000000000000Line-endings ============ Decision -------- Use \n internally in Mu. Detect the majority line-ending when loading a file and store it on the tab object within the editor. Then use that newline convention when saving. By default, eg for a new / empty file, use the platform line-ending. Background ---------- Mu is designed to run on any platform which supports Python / Qt. This includes Windows and any \*nix variant, including OS/X. Windows traditionally uses \r\n (ASCII 13 + ASCII 10) for line-endings while \*nix usually recognises a single \n (ASCII 10). Although many editors now detect and adapt to either convention, it's common enough for beginners to use, eg, Windows notepad which only honours and only generates the \r\n convention. When reading / writing files, Python offers several forms of line-ending manipulation via the newline= parameter in the built-in open() function. Mu originally used Universal newlines (newline=None; the default), but then switched to retaining newlines (newline="") in PR #133 The effect of this last change is to retain whatever convention or mix of conventions is present in the source file. In effect it is overriding any newline manipulation to present to the editor control the characters originally present in the file. When the file is saved, the same characters are written out. However this creates a quandary when programatically manipulating the editor text: do we use the most widespread \n as a line-ending; or do we use the platform convention `os.linesep`; or do we use the convention used in the file itself, which may or may not follow the platform convention? Discussion and Implementation ----------------------------- My proposal here is that Mu operate its own line-ending manipulation. When reading the file, note the majority line-ending convention but convert wholly to \n. When writing the file, use the convention noted on the way in. This is essentially the same as we would do when reading encoded Unicode from a file. This way the line-endings are honoured so that, eg, a file can be read/written in Notepad without problems. And the Mu code can be sure of using \n as a line-ending convention when manipulating the text. In terms of the current implementation, the convention from the incoming file could presumably be stored on the tab object. Implemented via: ~~~~~~~~~~~~~~~~ * https://github.com/mu-editor/mu/pull/390 * https://github.com/mu-editor/mu/pull/399 Discussion in: ~~~~~~~~~~~~~~ * (original change) https://github.com/mu-editor/mu/pull/133 * https://github.com/mu-editor/mu/pull/371 * https://github.com/mu-editor/mu/issues/380 mu-editor-1.0.2+dfsg/docs/design/template-decision.txt000066400000000000000000000012361341747546300227260ustar00rootroot00000000000000Meaningful Title ================ Decision -------- A brief summary of what Mu does given the context of the title. Background ---------- As many paragraphs as needed to describe the situation that caused this decision to be made. Discussion and Implementation ----------------------------- As many paragraphs as needed to explain the approach taken and implementation thereof. Implemented via: ~~~~~~~~~~~~~~~~ * (A list of URLs to GitHub pull requests or Git commits.) * https://github.com/mu-editor/mu/pull/390 Discussion in: ~~~~~~~~~~~~~~ * (A list of URLs to GitHub issues, mailing list discussions etc...) * https://github.com/mu-editor/mu/issues/380 mu-editor-1.0.2+dfsg/docs/first-steps.rst000066400000000000000000000122561341747546300203270ustar00rootroot00000000000000Suggested First Steps --------------------- We love helpful, collaborative and friendly contributions! If you would like to ease into contributing to Mu we'd like to suggest the following things to try out, depending upon your skills and interests. If your contribution includes changes to code or documentation, you should read :doc:`contributing` to learn about our expectations for submitting changes and improvements. Bug Reports +++++++++++ If you think you have found a problem, then we want to hear about it! We keep track of issues via our `GitHub repository `_. You'll need to have an account on GitHub (joining GitHub is `very easy `_) in order to submit such feedback. When you `create an issue `_ we expect certain pieces of information from you: * What you were doing (including all the necessary steps needed to recreate the situation you encountered). * What you expected to happen, what actually happened and why you think this difference is problematic. * Attach a copy of the logs generated by Mu (click on the cog icon in the bottom-right corner of Mu to display these logs, click on the logs and use CTRL-A to select all, then CTRL-C to copy and CTRL-V to paste the contents into the issue). Please try to be precise and provide as much information as possible. For what are obvious reaons, I hope you can see why we're unable to respond to issues that say some variation of, "when I click this button, it breaks". ;-) Coding ++++++ The first thing to do is follow the instructions for :doc:`setup`. You should read the explanation of :doc:`architecture` to learn how Mu fits together. As of time of writing, Mu is a very small project with only around 4000 lines of Python code. However, it's important to know where to find different aspects of Mu's functionality and understand why Mu was put together in the way that it has been. Assuming you've read and understood the architecture documentation an obvious and simple way to get started is to change the code in ``logic.py`` to suggest an alternative (better) message of the day. When Mu starts up, so the user sees that the status bar may contain textual messages from the application, a "message of the day" is displayed. These messages are defined near the top of ``logic.py``. If you'd rather try something more substantial, why not explore the `list of currently open issues `_, fix one of them and create a pull request for your solution? Translations ++++++++++++ Mu uses Python's standard libraries and tools to translate the application into other languages. If you are fluent in a language that is currently not covered by Mu, then we would love you to help by providing us with a translation. Full details of this process can be found in our guide on the :doc:`translations`. Documentation +++++++++++++ The documentation associated with Mu is not limited to addressing technical aspects of the editor (like the documentation you're reading right now). Our documentation encompasses tutorials, how-to guides, learning resources and other non-technical information for our users. Such non-technical documentation is a part of `Mu's website `_. If you are a teacher, learner or other interested party who wishes to contribute a tutorial, how-to or learning resource you should learn how to make such changes by reading the guide to :doc:`website`. User Experience Research ++++++++++++++++++++++++ Our users are at the centre of everything we do. We have two sorts of user in mind: * Beginner programmers with little or no experience using a development environment. * Those who support beginner programmers: teachers, club leaders, parents and other mentors. When it comes to teaching and learning sometimes you just have to do what the experienced person says: for example, the professional musician explaining to the beginner how to hold an instrument "correctly". There is some notion of correctness that the experienced person understands is the best way to do something. This also applies to learning to write code: we need to find ways to introduce the practice and conventions of programming in an effective manner. As Alan Kay said of Papert: "He realized, 'Oh, we could take the real content out here as a version in the child's world that is still the real thing.' It's not a fake version of math. It's kind of like little league, or even T-ball. In sports they do this all the time. In music, they do it all the time. The idea is, you never let the child do something that isn't the real thing -- but you have to work your ass off to figure out what the real thing is in the context of the way their minds are working at that developmental level." -- `Alan Kay `_ How do we know what "the real thing" is in the context of a code editor for a beginner programmer? That's where :doc:`user-experience` comes in and we would love contributions from professional developers, beginner programmers and teachers to make sure Mu is an effective educational tool. mu-editor-1.0.2+dfsg/docs/icon.png000066400000000000000000000224651341747546300167530ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs  tIME }M IDATxytUE?w $@CTDPA@1 "j,؊C`kآ M+6(D"Ha r3F{{ν]˥fWN.A!II@ K@o'b;#@P4  C)@ vXlVH B|Tq=f_sHx$])#\ L דvHepyK6p__ߋ[Jp!w CF2.G;b?X63ȕV*%D`ʁ+ `<לb!_,3o6**o90 /}P,qcKĵ< ,n?/'N+U:==~ѳgOwθq㈋C4.Reo>|>Ln7[n󑗗g> x[@-3W2%%.]п*nVqҥر%KP^^NEE0Nށ3.vphoY~ZKOOלN_H8D#GvܩhG 7\.VZZ7x˜g uU{ǴoVs\Zq!-++K&@G d!uӶl٢ ?'33S8q J-8莔MD"|>RIXYC sѪ%Z fgʜ=%t8mZ]]Df),,fΜӔ+B0]B\ ğ**(͝;WTWWk_}(F/Iؙ1Xm֬Yu&F2;܉'JY----f a>8ד,rk4M޽{s Vk+Ex{0ݺuرCjo5^zxgUz`%Ff͚r"#Gh#G t`1yiiiO?y׵`< Wdty!PӴ`(|M03$$$ߓ&2A|WFFqFe]Fee2n8\.l'?.FΪUk#89K52hÀ-Fԯ[n_H?70f#"' gQFqFvߟ={euid pQ?}t ~sgeVI3=DuI*0xb}QnMvmTVVeȵ.ksHPmt۶m\|B0a\lYP:8p^z7 j*&L` Bj  0Q=zw^bbzxA?#==^^zP/ޥ:Hqq~QXXHΝW`q#AoaQgp rsscٳ'Rm6]3:*/Nqq1]tQm?!:F@ _4h۷o7rO gҭ[7*+O , *J ApPQQAU^JvO9 u 0QElذA_<111,_\ ['A?nΝi&#&MRya EAMfO5DEEkONmh آc7`s{VxOT^zTJzO 8gm_SўK9dSIq]Yuη{u0G\Q)]Z4bz Mit2ԞaӷYOвv;fRe@"z;wު> "r]^^8&=N0nݺQVVL1mlĿ1`̙èQBکU_eg۩ m: aX./RojsJ?HHڸ.&trae$$$ryhs%ۻps=!ʵ%v D٧(daexJ;huՓ}ПvБ:^)WUU^St ŃnlyH<,R.HgajSU1lFGcc#6lkN@W #^/ Fo.5cl.+vz1|M^&r3>z.ϕǩDOFU?o 2m۶Y̞E A &RJ[f-_:Gk;11zSO8i歷 (HXf.k~p8TUVPqq.74ESfNMMUa&-kB`sFQ$uN5ѻ-r^|eܑ#F辚,--Pv & G&]l>\BWkM& $:p88e#wU%埭JY;=:M]N$N=Bi?r7M -荿xp#::Z v@n$GP=.Ϧ!4_{Gv;ϺL>cyⱂr? O{ME:?5xرc[c~1LK^VbkSan>St$8R_>  >Sq.OITg@&[2΢p%3G)H<: h0`8`(6WuNiX94ɣS|1HO >>^?7SDu(ݺuTDkF1a 9:?G, @לD} OJk59J  C^N:I 5ۚcK.Ҭ` Zd=u&*֠Gkkk׮Ҭ` :&tYU]I| +^$ DniMA^۟}ӧO5IĥJkĥ|nSPP `x8b41{Icm|;Ўhy+ 1mM]!"8ܚJBDp5ةg/SA ՛HQњcI 5iMt-{^iVAߵ&> |eeeҬ` %iA{*[]Kvv4 w/Gm?4,W qK4S~ZW \c6,=ddcV8o5" z,^Zz ml?s_==MMr(~w G>S&?|Dz APG!hjjRy xPi|ѽU @>_{榉_$iM)᭷ޒx饗tk/EkSO uuu46 fzMEt+..\.fr"Kg1APHmm 3"3?.=& ٿ 3hlSҥKA!?^ZzJ:233n˹APömT=o}GsMظq SlΣ -BcT WSZCC֭|zMp<= Xr SafI Uo9Pl2f D<}^Yv 3\%p ҋ֭Zf=:ho'!N_@hɚQQQAAA or=;ŏd fY 4љ`nI B?~ 3'\khJSE!" r:ֶ%nm4<ҳ-S[`ڔyf]A8Fw-zk4o*,dJKxޚ-X@VxUv|oӧOسgs߷QCo ?cqA8kVź=Bn[jU`yQA x߲eTu.'--MO!魩w(Cc>P,.\HMMxx^T @ SO`96mDcc S_uہf5߸q# B1vXf4 #?,3O0m4!?*Sـ7T0Iܹ9sWAii){*sc (Y x't۰o `ɪL} R~CnW$^ ]6\ŻSɆ TӽNhC*fݺuk:x@ZUTaDxU|LڢFCELQegO?>@F@I#M>}T|K!g탂->kC*>Ib.B㻿P[9T@IXhׯWen q)?+,f̘!^$Xv72ݠg\W^y{7 c„ *ͽroP9`&Rvi2gD=U>^/:u B%ٵkJ-)߫2V[[+ӳe-Zz:EP_/Li>|#F4[zۃ64C`8Tӷo_#bGA;TϱA={ 1]o{ ON;M> `ԨQթ4x>uNE8pxR FVVJuI=tStSS]vFp]wuVf/ 3[4XUUEǎiyWU}!kTz\.OSǎ♂|Q fz^ 7 <%n/A^}#N iGg1b lmF.jkdT㑴B ׏7U>%-9΢E0`v^ ݬo7qh@Ghn>dBy\.k&Ş lb{Yyki˺]TMy<իWf෺@Pi|PZy Fa >K*"7*pkQYgEFF{ fg.a8}7X6y6עJ>dz9+HIIaʔ)l۶-ŷ}Ҟe> *e\y7m dgW݆ngW駟:KIII0-U^_u>VV]B[?#1U\x ~Dq_AQ *Kꀡ\)(d~3E`q.Sb|yo'(_'A66>l H*U #B1R ^} %|%o‰XY&엍?"EtR`0Y+oD @ l)\W.cSm=|p!'{ZT.ޔgٴ;đ, WlF13֦ߘ4&j>. 3zSE!6_S}]{J#hڏB"Ζ>?Vk-# 䘍GvAA:R}OIENDB`mu-editor-1.0.2+dfsg/docs/icon_brief/000077500000000000000000000000001341747546300174035ustar00rootroot00000000000000mu-editor-1.0.2+dfsg/docs/icon_brief/README.txt000066400000000000000000000111631341747546300211030ustar00rootroot00000000000000Mu Icon List / Requirements =========================== Mu is a code editor for beginner programmers. It's likely to be used by kids as young as eight as well as beginner adults and teachers. Mu currently has three different modes: 1. Standard Python - for regular Python development. 2. BBC micro:bit - for MicroPython development on the BBC micro:bit. 3. Adafruit - for CircuitPython development on Adafruit boards. In addition, Mu has two themes: "day" and "night". The day theme is simply the standard look for the application, whereas the night theme is an intentionally high-contrast theme for those with visual impairments or for users of shonky projectors. I've included some screenshots: * mu-annotated.png - A screenshot of Mu with some annotations describing the placement of icons within the UI. This also shows "day" mode. * mu-high-contrast.png - An example of the "night" mode. * mu-adafruit.png / mu-microbit.png / mu-python.png - Examples of how the icons change between modes. * mu-running.png - An example of how the UI (currently) looks when Mu is running a script (note the "stop" icon). * mu-mode-select.png - The dialog that pops up when you change mode. All the screenshots are a 100% sized view of the editor. The look of the icons should be simple, playful and friendly. The UI needs to appeal to beginners so mustn't appear intimidating. The gold (#ffcc00) / blue (#336699) colours currently used are those associated with the Python brand. Since this is a Python code editor, the colours are useful to make this sort of association. In terms of the list of icons and their context within the application as per the screenshots above, the requirements are as follows: New - creates a new Python file. Load - load an existing file from the filesystem. Save - Save the current existing file to the filesystem. Run - Only used in Python mode: execute the current script. Stop - Only used in Python mode: stop the currently executing script. Flash - Only used in micro:bit mode: copy (flash) your code onto the device. Files - Only used in micro:bit mode: open a file explorer representing the filesystem on the micro:bit device. REPL - Used by all modes. A REPL (Read Evaluate Print Loop) is a way to type Python commands directly into the computer. If you ever used an old BBC micro before we had Windows based UI then you'll know what I mean. In any case, here's an example of someone using a similar Python REPL: https://youtu.be/QgaPZG_OzW0?t=2m20s ZoomIn - to make the text in the editor pane bigger. ZoomOut - to make the text in the editor pane smaller. Theme (Day) - toggle to the default "day" theme. Theme (Night) - toggle to the high-contrast "night" theme. Check - perform a helpful check of the code in the editor window. Help - open up online help. Quit - stop Mu. At the bottom-right of the editor is a small "cog" icon. If you click on it then a window pops up containing the logs Mu has written for your coding session. We use logs to work out what's been going on for debugging purposes and teachers use logs to check on how learners have interacted with the editor. In addition we need three additional icons (that don't yet exist). These are of the debugger: step over - step over the current line of code (moving the debugger forward one line). step in - step into a function that's called in the current line of code (moving the debugger to the location of the called function). step out - step out of a function (moving the debugger back to the original code that called the current function). The debug-icons.png image contains visual representations of step over, step in and step out that are typical of many debuggers. It would be really good to have high-contrast versions of the icons to use with the "night" theme. Mu is "responsive" in that the size of the icons changes as the application is resized on the desktop. Some Pi users have very low resolution screens and so we make this adjustment for their sake. We use three sizes of icon to achieve this effect: 64x64, 48x48 and 32x32 (measured in pixels). Finally, we want others to be able to create their own modes in the future. As a result they're likely going to have to create their own icons for as-yet-unknown functionality. The current icons are all based upon FontAwesome for this very reason: there's a good selection of stock icons to choose from with an existing "look" for those who need to start from scratch. I (Nicholas) am a programmer - I can't do design, I can only describe intentions and uses for things with perhaps some guidance on personality. I trust you, the designer, to make something that both looks awesome yet is also useful too. :-) Thanks! mu-editor-1.0.2+dfsg/docs/icon_brief/debug-icons.png000066400000000000000000000040111341747546300223040ustar00rootroot00000000000000PNG  IHDR+isBIT|dtEXtSoftwaregnome-screenshot>IDATx[O[3S(Nk ŪH(4TIAM>_~ g1*QL `  9UO)uޙY{wKq'@0t DhE B#(A@FP"4"m@,XPX,`YV{000~քa| p\-By۠( z%'޽{׋pp=žS$IXXXo߰@ @^^`6qEԀII ^xeb1@4F$Aww74M85M NL0|tFׯ$ > +D088 Q XV hZG]x^}cn7ݻw`8ݍkKǏ>Oq\MGGGX,SBECCC0lp:0`Y*mb"v177'A$arrz7o"a?FEQ0L(//ωVEsss\Zk'8B-˲hmmnGqqqajQ__ łaD" NKxXJ,4 "[2(Bee%:;;q…D 'z022"-@Rrt&ُPшf\~]x1::6jv===(,,e?`XՅj"?$ID\E4^ Ӊs(yOQ*\Ÿ (p vjVEkk+888|t}M͛7X\\ PըEww7H&"<O\RPP:L_~E__xpBMhll e鰾.GP(P(hjjhhkk#"K h4* \r%,cxŰߏHROLYMJSZZ|HVPPF4JJJh4 aP[[4d#EQ0xAJ._^LOO8LJd|>9CNh4p:6EeYyG3W| %ߠRE-RZZZdUj9rap8<|p8 ^3EHh4<Z33 >hE B#(A@FP"4"DIIfIENDB`mu-editor-1.0.2+dfsg/docs/icon_brief/mu-adafruit.png000066400000000000000000001413671341747546300223430ustar00rootroot00000000000000PNG  IHDRXsBIT|dtEXtSoftwaregnome-screenshot> IDATxgՕ{ݻM1`B`:< I7 O$!@:$!Ztccqm{jsMۼF.h4s͹GaQr!B!B!b_[Q`V `@QQO=G}4TT!B!B!ZYp!_שjs6p w#c&iQB!B!BSa`oᄏqznD"LDkw%B!B!B!Di[~A-ZP]RR¶mۈb}\T!B!B!Bt2l0*++1}Q !B!B!D,Guyy9YYY}[*!B!B!B&0x`B!B!B!|>PJiaB!B!Ba!B!B!B @B!B!B1I @!B!B!$ B!B!B `B!Sn9>ďCìO緋#^×sɍ˱'E]I+夙uƐ}w%0N?~,;WOzIz&T/n`w uBpɝR^ώ:~|'g|U< 7-ygFNLQ0NW䴶LpB!Bd1D/o>ǂKz>xuwNĿ_,{_r/q#tOTs柞3uL{G)E{)~B7:w;Of'KyxFDVmU۩@N? x* K3l|nᜑLFQj_/d˪ArtźW:nu7;qU4q?oმ.P/W~?DZ kyx~v {9\uWV`";{U[V%L! ՊB!؟=+?wu3jȴ-cdB!D9( |ӯl!u3gqtNzӕMvnN7cǏh2Dax:N?Y99˹'ᄂz:M$x-Mc39б_As$] ur҉Lrlcpy=-fI]t|cz>qȬ'?MƓP𬞭`n繛㮹8|QԾ~~i { O|griqTB!Btpϝ3|P6l5]5]ϺRZ;ֶ!By>'/dq?9\V 4P#ZgW>>]"1 n3_fҍTΉ_[PS{gfKgIذnuԴ-մ&`r%2=/`sʷ} V̺k)_㪯I˟ec9Tmf=Y"KÌI8 Rkܲ 1L{u֓Wq'VJ%B!D{JJG? 7P:x0ξ!im[B!sY3扷^RV7ˋҕBm "+l/BVn,6HԄp7q9e)vSOiu 4՝%4 gh..§4 u h^[[5T<~%?#;w0L>E!B..>= XkjߥIB!]eU\{=li`֭\sϳ)*0{XB!b=+{'&:|lV Sͮ8=+≳͗YR_yeagq6,:0W3OCВUp`(.cW<#0Q}%wREhL~:UGJS1}Zӿ7=B#Ɔd$$B!wpSK_%=27\%S׳v."ŧrycPqwR]W/-ơ1}d{vl6?5kBl G׳9l%}1䫏Gn7m#{]_āU̘Q4z < ?}8Fm\@ ՝rbBY 87yl<)ꋘ^\ŇOǕbCmygftyl~O^c0}u8SY{u(:S'}~a+6졺]G:ʅ/:y A;RV^Ïvaw%C5|nyٌ#Gd#F *^_UaD6lhtAamdt %"H5Se ݌#Gt+Fd*^׃4F;rЎBL⮑㈹F]4ߓ/J)tnJa2wCf\h9!`x=aQG)ȱ~;H!BRݝAj\tcJʋvN#}"1x᳹ĽKQ*%xoX5x(#5h"Ѯ!h(yﲿ &u8Ơ/rGAո @ŪPf mp ,:u(98Y@3xbЎB4*%#:3w\%+f ?=haDs@[[?9?mhCqWjgcUt: , ?Y1[>)B!( {7`ոk_0a#kS䝍iؼRqq>NS;fց4]@}2 v'j;*++cҤITWWgt?<qxj_}"j>'AcĽSR?:m\oa4Gaں}O4t"٧W["+!޺W3-cp׽3I杤ͦrNLg)1Dr  _>M\B!Mָ2ଛf cĬDsO!5 T@a }FVUwtI8o0qg|Q&;ʤҳ?ԟ "}"S,uo˚ϤZux^S7 0MFTk gK\'Awxkn @*ܵ/ | :Z~@%;pD[(rB!B d:`kw֑ *gqʃmin:\L8Leqۉ8Y9f\`]!g5NNxh{&*x~Zv@`ĜwǚiITtW7Ppܔ CƪNZíb5o>%c3u~*4'dU?^׃IWUw\z3@6qƶy W`.$ ߯ 3<#Ȳ~ke :?wlmӑEC5R'B!/Z>rf@t ZMа?ϡqX%qd %ATVY:2zތZA5P -Uqp;`0{)UDOn;VW(eywg` V'QA|{9MC!H9|=耎[P@յ.Py2=#_1Kc=rXD c/oqZȺEvuFa#Pt qk8? _?q־6jkهi tQ^] *ZռZR!k a= (WS`Qûa9DY1_6V J;_H(ּtB!B2Qz e;_3 gZ<1ã _x[>…%sNF=+Wy/;z,: "hP9jރN60c {RC_|^WP;l?<{CiPtUxYMVٟ1";k x(:XtFk\>?/:l(EWc:?)L܁dUīQjL#/~}T h?2[Q@*"lMdw Y.Tdk-{*\9GZjo}~&pvૺGb:Ѧu򎄢!$+`ғIgDvCڸ t'Xb}R!B=tl;v K*g- Vk=\~J#юF9@OdD3[pDt9ӡ2kdq&Fj7ž@띦ЎB?&?xH7mP#:Myk,Ux *ev2:_LMM/3 G~)0] {O"Q\5wN[օgà(KV'mSV ! \DJR&-5;dU Е~AS}t~<qGWs'*7MA׭ n1= l*(ࠟb{hO !B!_ 8;~PUUz$Zmu ?gjm';0)$k0|8  N +`ǽаG'%WҘs. w(Vc==hc;ۑez?:ָ⯸+15Nkt[MZ-&Y3ۈ:޺_9{4~}B!B ~{#dcnߤ>pvY8euB[r*@l&?6z~I  ) }TGM&A'Mi">Zvw#F;:h3w(}2{frqw򀮿h< oG /vS;P1 uW`11a)q|jXб}&¸; aM{ U|Wق#^N1g@z$-mVߵ^:? hqN\ayS(kAR+WS -t!٢}R!BK?dWxC&s[# N& oY#GoFFmw#^ᇱ}P5a`1P 356SL;[##{ e](厲}2{f gZirD'cyBsG {L /:R+o"~0\4r3\8q(O[}Y_ \iF Dj9 t&gM IVٔigMoA[dM XHY"}R!BK;Ug;>T _ F?zY9!hakcFdʙG3]Dᆳ<w;m9!XhX q1Q4۷ڑaueQo_Co7t-I3ߠ@Y:GR)MpGfgxќm3rׂ{lJNk{G-gWG Zw?zr iޱ6FGd$'B!o=/T=q¾s`롪VxVbSaMUh\r_CRV߃{HGJ|tLː&iGKO7jvQ|FM0f]7#u-gum79ŗn[qVTl IDAT`WuUƄJQnflo|~*bdU=n=2߀mPO*@;-6x+E%/B!BXR :|6M>yʱ:P_XemC!wcP_L35%>z+q:/qw#qZNVSa:EҎ,YԊ /I0B;r^5YJYݑ7v[^wSݥ௸u &O{+=\ȶʘ5)x-t ^Ы7Շ].].>)B!2$.TnAŝI2]jYW?,KkӞ0ڿÚxgB ـa:NRoX$Mۘ$;rG/Y&ުGQfCľB9oJbq z:f:"c+"k" &aB~ Yŗ7-q /?b6SFtOkPDcRrq?Jԕ4AųBE+sW(3!A*VEפw`\qˬݖ \5҃5aOKk۽ʑe\E )5㊬KkӽuZ'9'8g批+6>)B!x *uAe6Z7Mwv+*kPbW6ixOlXtfZk>^fڎ,T:7[hݎ*ʪAlM?@ *\uo'.y+z5Z P޺M੬낳7k[g?غ.i2Zܵ%vdY)P WW_+SkVm.;?>>o|5*]3Soz‘ղHW0̺jom&o/٘Gu}#O[^f&|ܛAϰٮ&Rh>Du}P7܃;md ø@y}!Ajali󽫗B!BɹUZ^3Rpp[x5pȸ\qt=Wu l]fp׽Jcڔҍx^igm?΍Σ!aJqΜð3 (W,rbDw`tv]獶i"6Խ+׫z2B͊{غ@c(1ax!' aܰB g\ }Xׅ4M*lno>ij܌L7,O]*߆x-`c?W`ƭڔȞ֚ ;yeZ,LM}hSʹ:?`(ngoi(JT4ni9&W8sJQ&{>YU.n,n ËQ/'B!S{ԕ0/3J`9K:pl.&*caL({ہ<UVmոٜpM>\~P5y(Nho9  o,,Mb;u6(3a_2vUܻp- .p;0or0'L+2Tކ7:ڦΌG6Fbl3;[:3$ǹGOk'N0g!Ptl"p?'=7A.ۧOeņ=< 沓58/R0bz V~xј{^Z2zbf ,K'0;mSųv15jܻǜOiZ>k45F[oiz֑ /I/ekAlno=f΢~t#M[>?9alݜfG/=v_$scR^$Z+rŝ/b6ן3ْ0'#]z߻eݕٝy<0g}0:݆3mj$'N Sjs9>[.=u(~E_l6H~l4oi;i0w=vaw{W?Z~glߎl8?z'N!g.֚gʷvκ'=W1EKIٌ3H痉d]0̯yc.\qˬݾk|9w}o!d>)B!zHGq&.>IguL [{~j#o_TPZm;]z *<v?LB -!9gߗv޶Ө?5 љTP ~Z홦/}sEql/Xul{=q .G6ן+Ib6ʺ`]:Mt(0QY"nl7~8;zR˨H,Ζ=5h @mYsT2"݈aDww-[ON4C' 􍝔=Sa4˭X74Gpו6zB!BGOFzn ް_>+[t#Ȇ=X9K6XŶ?3frC! #C7`?gEqj :yܬ>:к@A߃eCP"vԝt^ n^'M bqU %ڳ~XmGF6q4&u;{8|P8W?Z]O/Lxg 3o%?簔-MgM=պ$Ԛ_Yʶ>$9hDNU!9 |\y8g3x ye$!F0C jLH?Ķ:|^W^pnWkh,nRЈֺwh;*_j٘v S07?<]ڴR2!cS(/Ei {D@p3Il~9 Ͽp$GM:XگŖݵ,Y[p,/{K}2h#w_wƛg#sԣ0fN7%HB!b`Qgs Yc2Q5:6uԴ#'F]H)/t{kWI:փ,0˅OI0JYi.*_i]dcD`!vdˊ {Gb.9%,2{~$vԝtꯪ꠼#8# )h ҧTm~Xm "' F~e٢/q# 3$;ӁR2MKzU\tdṙnS2.orl`΢5 ˲hDAy̾ lYݲ|j^sިxerB '? $ M-ل֚𒎝#{7Mֱ@#'i[O#1,YT:;O"Ht:U4cu㋎d>T9 3qX@cbB x\p m{B)T'D{  Ü$<``FB(L'/g%ly+9 ߫ 'B![ LL︊ck`ػ`kx BƽX[Mit#^ W3ՎɮʆiG '6U@2Pӡca(r}PPYb+f[#؈tL,;[0wWQYX/R{HO+{ ͗[+x5|}13Z\aݓm (tpqĸf`BǬ^Z3bP.g")Y7) ubldGyL_2k.<2 ']ռ/~%W]pD 'B![򽩧M~3چŤu>2,\gJ)/O=ŋg8Dw7O/[!O~Ȫ-oNѶSt0fH-5i4hky5c_%O?&[Ԧa9q4ҮvԆ-BJysDش~'L͂e"FsUք?l/8cɼs?p*.n7]r,GbimU͖vmc`༤ۧkky[囹UkC96{˷$,^R%zX^YYau'lfCz#ڮc=44Fnrk+7IW(ulַ3Xz`O{{oN?t#E(8?WOY {w%EJ[(%T)h\Cmҝ3+M[}Cof}27yu odgR,΢/%L'CS+ I!B!֣^ N\*Jy+7זvȯS*bsƗrѩݱu8*T]M*t0%OM#ZglG.瞫{_gge9;3`\'n)u4>age}Hi5avVq94쬬)0Ug[ƄIf[eB:P2}LJEy>4n}wjmr#GU]FO!Rm֬R~ 7:ԗT& tL;0 PO7b*j{IQֱbv鷷P$gѸp+lgu^y;1㮧ʢ&JJq̩LUby$;:0;v'a͜69hcJSTQYGNז,YY5LN2pB!B l= viLW !483߭ Mp W4=#;QgFkfrd{2( ׎ڰPʭ=%v9f j9|C'k_> C1y\z9Yiv^OoGEbr9 /Ԛmr79P=~2R0 .:~2K<$!PQ$:ԗ$ԇf:`d1J)Vnsv+'3vhpxvv3kp-ޙDhmjGBZ;d*jz}!VJIvQcO 7]8b):$ &͠i򯷖k0ۼ}03ܻכ9RBS:Lo`G{M2vhuivSJ?`g"!:3gGf0oo J9H [ VV,&|!= )0}E&B!B-Ob?7`Ouk-t}|^eO-1yT pVn^/6ѥ0@(¢UۉM"с;*J EbVgcQ1U89r8J w@m}P8FBvs&ܣ&h;rp413 t3NAc$FEm$`u^z4}u_qN8?C)De5O흤|&ʔ V IDATc휫 0.gy\Sy| 8x`iN,wB B!"Sz0rGYRuq;QJ)Y4|d3PZ'hGG؎ftS&3(:=AQmTK׏c7bBzs^]sȭ=] wP(嫌^ɛlcW>wl +-N$g[Y-cp>{}:n~r};|F]v6%ņx^ǭߑy{] ^|<6`wUwx+cP )W)V4^%ydgv[eש9|n~7; i4PY;[o{LݴW=5RS*,ט&[y&f(-x(0::e}.Oݦ58_~n45voIWe>)B!zc3+C> qxݒcH,㨭_eFs#R._kiQfF;FqzXGv`x#r )`U3o0?P8e;kRKbW;j l%-J+ō5$ϰ\JF4zZs6~-ɷiv9^ےE)w1u8C6,k[ѥIw6",^#aلa86tQu'1(7AlY/6uXUpF6*ަc{]L763wfatcM[w9GMdpav[(q-{jYђ))hG6tzGL7SH ffkL?{6o/.υ;݈~SkץxlE%,Ky 'B![NIc6F | >Ͼwt?fR)y\]vHcӎsQGZDWhGkUS^vGpNc̐|f_u-]WZA`8/DzNqn]~2Nr"?Qmt{H<jԺLophQ.O"5 5fp3jpBt)wAC \gWeϿ=.]Ek^h'Y=r)::Zp|[.' e7n䃕[9e'*y}q;*}wN/ H/*JQޱk]벖wwv,kEQi"I' Ho1i7 MroravkҬsϏs#Ӵ2Oj8oN=%>Ȱ9wVv^ezؙ[mJ֗!9 0;0y{~ٰeKGvkZ ,KTV3{h`Ⱪڊm x򃟹|^ a0ܺ0grMD)%W]+@X1}pƊ/  248jKO} F8a=a@pԕo B ϴ7OE-%*}.4=^>]g[Dݓ`'B!m|s-)BPvpv*ԥ5SXu{x)#%S3uDO:k$3[udwؙsf91iXL԰]T4%5$̹8:-`>FJ:6%׍xeGԵSq"v?Rg جk J ۈ!^~LgK7SP\f٭|Rԕ=0[EhkwP##{%63, (͆ʏSAnՠukbVn{[zt;Rna)_7vzErڸ> T^~r U-2;4ёfr Yn-9-62Ʌjk&+d+3RtMc0GJۙ6pVaoB:}yܱh,]ω c@c;o>)長`兒]f@ HBxˢ>um`x*Iÿja횊mhF.;yhUn];K AO !B!6jJdg 0ϭ #ͯ%+7o1kw?O5RT1!=չE$KxYҳ33:בRPwaoϖG+dpßЧ,}ɯg]&kB=K /;-{[h0##ǦTEM{SPJNaI=:/ Q̞2_M)dfpѷ*;s KyvLڭ<`:T~5,}:Q]皙#X9'x@W?L̬՘%,Y|'PG"!R^׌F^3[! ^(8qhwO_g+ 3븾u~F4c"<<+'P;b#جm9+̞z/P @[߭Թ@lc&O[{(QY&̜y`.;]+5TR eK@]5Mq}xJ] j݁iY<> [tYm\: 'B!m_'aZ*07CkJ SsV ь=Nٺ+OS$_6#nǨw]k}6 ET=*(vrKFE8luB\AP猩X,npCo\}bl6K(*uѿ[) 4]Y,}kkw/Hc@.v<skԮiQ =Jl:5lkXn?o<]3'2*IKSb4V]`^1wfq(kzHݚ@)]cOcO=6,ɍMY-ܱd.`<Ώ9˥'!6ҿ( C|s:]Bs$v7Q [yPjih{m&Oe>[i7(=8#W d+U75yUl+uyo կkYyױ0oB!m+v@ْ\Ur,uh~")yNU7ْ9eL9͇5Kw Z9Xvz4O;c$vdq57=ޝؑrnb=K ˯Kr,LTEי6g#,VR~V?.>[k9SāU;jm}[_'JBcGk99ulo.2Rd⍼3Sb¹QkAO !B!64!8>XgzYڃ6nS!色ġyWnYm[@t]Y-"mKnIYO Zeg}4|֣u;hFVnɨlϺY aQR~e} [bꆯ_[m¯P-Z 㑫&+pцw* #Y|dbyshI@k/]8{B"y?q0ȣkcY[u K*g1;BD܈k骛,qV<b/ى]7$ѫ'3w~9?w1/~cRS5vXtb';3sX3m1B)կ3;i36T%'|?%1> h4b-\|<75{d~ɣz6>yM`u8 :5@b6Y@)|_ȶ('8|BL̞_OJRmd޲?8WL}|q0u;rK95gzZ-:w\0lO !B!4QQu6dAE8lhPȰ =d*SV(sG`~Ƃ̀/7G◭u[O@vg~C>[SSQdX`;:r KyK}_+W~gx>-^s oś|og--# wظ1LʫVrsF Z'`Ƙ\p 꺳!k[# s4wxT$ u^4F3םC,a㮃 @8<#ujz$B!8:ia9oﺇ]nsql`ߓ?*4n6q5h7*%&ztW+X8:nxa뷟Πߤy6oܦ_ [zT,CNNN yG;R~[~VRoo5 “L!.ڏUӉwg~&ro 5 Exʉص8a%ͫd{ְgUy8reR R΅ηNڽAgUĞ.mX"S4R誐s߇R`O~o-1 9peUDu KS>Y zTTHClbJ ]B!m_||< zvŜzop;M4ϵ3foJ#oYF~9/բ3wct\|(9QAzTΘӤ ꟦i\>}(W6K#k%~r bN쟪7CMwcēN%9XTg~$&Sjj!MCCjOxn_2\,[}Dn720i>6B}g6'n]vdœύOdtJ&*܎͢cDŘ|puȦ>)B!h3᎙=ʍ,:tS<*15 5wSe/!qDɬ}q{EנCbt99>k6Jcf65akP]g(j -tf(ҘXK 2Q}4M_Df 7= +t'L9µfvUxQ|l+9U2^eAנ2ܐyUfbg`1APoMi8c|VR  !W}RLӥTq;#SOK>`'י8yT/IMnA)%.3͘f]TQƧB!BɃgc-XG8'x)\?dX3AmAi ;|傑 {σ%ꈟY-Btk\>ݑoҮ5_ӄbY,:<xUx˜6gl9{ʍ}t #/,ѿ[Ou 5sN^W盷>zFQk㌝{4fnS[O'R¤?.lM{zо6[}zl]pƜNXNٌCMOYN{[yT7*uL;GvyMӈ ?Z>)B!h{<$ʭ'jwFk+\cpŝ['g~=S0}7o0GUi>Ei4z4R~MiNn?.>nIun)W dܼN~]yӸxcf5|6>MsqƝ>9Y( 1W9 3|z0֡[$Sw:^{w3`fGz*sԻjUCpm2#vg6yvV^B!BOYጙ^msbԓ"NX{|6{8OiTnSj}b 'uKR\`S*/V+,M GMSY~/H%Eܳ=K#C3W3|+y(b5MHq}ٯVnkJCnBIM^:gTc|˝ о(e{}r+3jJ!Tߚ}zT$AUR.- 2R 8uh~_TO !B!F 2pnF// >NQ0#|a\aCq;f'ƞCt'l>ĞGcsV'St_cA_i;#|foy(i| IDAT k n1ȟmWjvoKMM-s(Ty aU;-%^ҚcV\ߚ}jc.ܰfG{(0ہ᪲@;f UrB!BJwqi_AƋpe8!9Ph8/[=OhNi%s+9"`E=+{`ǝ}ɚ`>LWD=,>֧K^ʯQx\f^м,3G+KF@J.F ^[JVefv<@(2i}+>A_Fi5xm]hZa}kPw FdՀ*#U=ӬkUMްF5|:}R!B!LoQ{bfaq}h@@h#}BOdf|Bo lE?U^pB"OGY8t'q8wlVX)Ni IG {CzTTTDbb" Y~ b;lZVփs/Ď?*Cc0].AJrO61"+ya0|G$\wB)Ru (i=tGPo|y{w%1h쌰ƶy)Hi`艭t%ZLM3 { 3>-;X;>)B!8=M YpG͝=P=,QGCp퇝@>MQT7|0Ѫ.ܐ,ѷe2G n |_JIM"'P)jh5(R=jlGY~#[A6PJCaՖԂױ꼶N([֢徝{Kv<.8~ Vh:<֭D>ݳݵ÷~9B9l [x3ѓ(N MY$Шo>oX V ()rz\#jw`#,q܍'x/I!B!Q͂'b$6&4ρy?Ax*;4C2pxK~ EsPzDPðc^Zef9E =(þ'NLMii*QAQS:B\rGWptj0^{nRηs(1g<)/DhQJy\4Xb(n?c@3'|VO:kw#s%Ɯ%Aa?78};hO'u>}Z2*{ fl- k xݰ9VB4-E`]]ǔa.ts&r1k !B!ڒ9pGډN}ћߙ EK3-n1s}L!P7r4Es0f9#FxūT4A(sqB%BXEp ;[a4/6!DCd=BKqx9ie!Z~[~=&_B:K61X (2;ú=yIyNwB0, W94QXX۫l̀l3UPXjfPv?dL)%ֲj#4}ַw%f`|~iY_ Mðv[r4UZ>]`#kW[)0["[?%h7gu^!BV aO (͆;l]>Q GB=ͯfҲ j\Mx֓XJ7߱R!\h7 )!GT:u$V֖iG}R!Bq􊏏l &KٯW橭|Vjc4vmz8(avNsC`-^Vfc͎vAlCRp3s{ŋTJon^T=r_CW^QGe;llv8&L/O޺˯l-g=U3~9=o^"1gU4e42[yKGP&(LKq_0I0/& ͭfyշ2;Kϑfy)4%\ڡIU`O( "eyoe5LtG_b0g8~ ,-4Wfe\4!r0f$;ͨ*#(k.l[ Jw*5ʖ3J#'x4'B!GtU+9{s{9Bcv@?xA*>gR@S9h]q>Ck| `qg _ѨLJf3G5S̎ KY>|䘣\NoIʼnkRhxQwHT#o9u\!RQGO; {{'}6>(<=;/VmY:j:_ 9N= 5-Su^!Bі5K *ݛ=+ ܁PWw9W)Cpitaa-Zf;6Ɯ;bLlNGeA\[mR~IË>C/P̧FPz$QF7_3Ǣ~;m +t^W#\4Wpc+ZJXWAo->( ,,E?a/͕VnPm3aE@({G\QqEkiƒLB!B4l>J/lIÆ ʧTk(4o6U8^6BGP [gܑcqEE:@uG-w<@ia>5WGY[/Z͓](_ixܙ؋V3{7Q3u8O0%>$S5rau^#UhFP.qpy[73I3j"3`4z3t#'<`e@YaX +b4[WT3'B!G Pn,LX=}h4|Ҭ(K3^G{aO9o ]`unCw@we*E3Д ^[' ['<T k<?-~#q=eŰwkOk}֣(a˖ .,?8@恷(@FH_s4=X]ӱLy0PGa +ҧ,4 4~]X\;w[[`#(K4a= ;ʖҢZ}SZC F gMP )[g|n5%1xKK6j3ϛ]O !B!^B-ܑH } !B!-'>>(B!B!BF@B!B!BцI @!B!B!h$ B!B!BaB!B!B!0 !B!B!mJN7[E!/\8Y/W& JYztSJVEB!B:P9rn: ==>#a9(ԸYq>V–NLNgͺD8 O|| 3脋y 3(3S^4tˊ1ghRŶ3˟,ZgU|:T;__ '=oK"g/[ý;cJJme@rP\#$Zp.12e3o8ϻw$kއod]JFYh*]9 Cg$Sϻ98>\!^ !B!ZXТ ww3Guhpm?7Xn{EBT ZK\k`?ΞMKx0>ͼQcgs[̬2I\nsێv:/]=rZiFݹsU\333Xʙtt7\ KK"'ͼ/dV rbb?6blQ ;XGzYyn}n*C}eemmLxɜt&î~O~]Ê^)=rщVM~fL }.r}O.ĥs.Y?lpYd&?BB!B4;kc_;=1g~eBM-YC o  hk=4݁áptaE72b. apTD+뵰8vp$vu\7UnX)LCQT/{h%FO|6>؂Qs Wy6x} f6UmVElci?;,:-z52CJYr._'yy?sE0ϿwN˺=&r⓬XVeYdIB!BX#@'~]czag"}Cg nzg` '7_>xkՁn] kXZ_yFjLYfOo;1{ӣ{&^˫ >iph\6q]{2b_f6Х__,ǻkkM_g>tO `!gÌvsWgc2TZ1섇56.ztF@5>N0H讳km r^}2zv%u4n|z3[L 6$_rekLq...|,tט yfy^q3gSw'Z}9W?[t5Yw}pڝASo\]K8i}M:׼>Wrψ>\}/gغA&ҢՃ}M8Ē]ҹ'#y%~êI9/~}ݻg|W+JW5VcLȿ!˽d~];9vrf:oG=zYI!BlZf`gw+ՒRĻt{k*Z]=˒<%n;۾LH hW]kż&6*^墫`S8ٹc/}wԁ70.xVZj$8/_x!=o1co\?]f1+u}ssF&_gFWu:G) Ǎ3o7?A.9(;U's*:+׋]Ǟ/n쇭N'` 2?9NNL{S_۫uz#|f# w7]&WG^0 PY?/FmFJGr Xm/}ALU!NDlJFl~=>+u >妄E8X6N>}1W~ݞ>X֍ פ=͙ʖ go@C[ qߖȱv'WRe} Yϳx6~y{=kU$5v4O8[LX>Ƌ޺R}~%r#8Xw; 練nnC[kjyYOcRر;8ycDm|w+B!8ZL gw=EyֿۛO&a%z%\4&m^g(eټ_w-2¼L?e@z{W<ᢇg 8:d(3jbvmc`ߧc+tЉMkŹ&K}kRw҅w,(Yt`TbZd?Е}[wb֙}Y<`d|s֌uԹڍqDe5=)tH{椘ke8ܳ;Lνwh?g%41F~:&?~S*ϦW-OL(RO`GN:g*}È6iCa 0יӒZV'0OXX cݾ @nV^Ir.~GVl9AliAqBj,aѽ>?Żwr{qko9w1#- #[z<ONф%`܍<qɅc::p3I[PV_2*K=?/JCǑF.:'WSҡe:y{}Ǘt }2E̜SSzLkjno:iczO_FmϷƂ덠]?½MxPFk=;!B!Ѩ Yyl>Qw>2ݹb\`Szy==tcX<,Y;70xdr(11zBi8p >ʣsL ]nQhб>a03 ,R8'y+ظ/$7zvy/fWiELK^Gkkly/>޺`2tĞU<ֱF v^w=l:S_6;Pj5v 0@K231Eڰ)w}/S-u94lzV.Vfvڬh:B٨Lvb\j:lN:8z>4lv+{b6,BڳUjD\Z*@]}1k}SŚ9߲yH<Ž]=C}阻oj+{ IDATheRTSp`8Woҟ0=U>˙rбcY/$]o^iDg]0vbr,7ۄVxnB!BUv 㦇Υॿqz| g]Uo;>+O?~͂XdtHbɃX5!^DɧXS?U֫OSywp3ؼ:N|RF^25=f _t<-qkg6ɢ;W;YǮ/[wT\eIn_>yܷ4=k{97 87slkP6ZD2Il]%hν1fA׽xj$=8;C\Ȏ]UW[^ ZޑSƗfQ^#~uxJ225w;>Ke]6Net;qVR6;I~U.{)v;F }QP4rŃ7lv u'h+B!uk11v'lm9[xx{J 0do_}KGo>M4i>߆sVsȃ5 ~ɻ?a[oV>Y֏qQD׎ D]BSaWyx[]6[ezuN2zK<J au6$&D28m53goqg[)r{VN=J+ٻokPF?֌`}Zm sɸo&W<-w&?w"uүY~Im,ip-٬Ȟ"'Emp֡B!"d|-S;|*탸8iCҋ2Ǚɒ]ر=S:zLӘѪ(s.*`'W_9ox7mWI׈?G.ևA̻\V 3yLșNK _~cxO`\;k{O Fs0orҶ;ۯ?.zW nHv㳶?LN.\_k,1n Abj!ȼ/a5*f֛ ˫Zy~d(v6~ly̧Q*0B!B [8Ds0DymZVV}!''U"tIl˼lyr7N'  11ml!B!Dߺ3D5OB!A!B!kshSelH } !B!-KB!B!B!D&k!B!B!mT||B!B!B!2 !B!B!mB!B!B6LB!B!B!D&!B!B! -}B!B!B! P-}B!B!B!(sFbs>JBB111!B!B!h4@XÇV\ !B!B!o./A4|p[0B!B!BA: BB!B!B?J<!B!B!B B!wQZr.:޸ Q1KbzLcl9:Jzzrrjo+51mI%&Mbz%UP("  3?,FDq}Z~}(`BB@Scٰ1~uUw4JSc*erV1 r|zY{]sT*{OC}ڏ5~TҴ2w|lwT҆s{Ou۽v]wO2e.L`wx, aP.Hr 7zۿ7o[ļs'*TV492{NC-3!=/ȯ7& soƏL>x5;{'O-f=[o~ǭ`~F:2 ZSN>5!펀dAۿx s?|K&J-3/ƦI-݌k_<1?Y|.`w}Ku<8g|梜>vHzJ ټh~o|_9sch}6rӲ%goϹ{9?=鏟}n;th}*1Gd19̏7^ˮPSys66esRΜTm4 im^2mUUUJҡCTuJS%UUm;& {(ݺwK 'fi}dee*ijjj9׳Kc6|hx$GXyR?9175nIwqҴ>o˛JC^O?|iq&ÆUsdY[ƿcɀ!e5zDx73ݠu82[\4 f:t-M#/ʋ<U]ӽk%+~#E5zDǽ;ֺט|<#fNyLe!gLΟvy k 棟̩{>rWdoeWȫGly{n&_:7p|/ )^ÿ᜼wgs:\ذ#3mڌvМs?~q<5rξi㪒Tn|h>Mu{$;t-OoaPÂwZnw+@9Z4 @T*9`7pGL P0! Wt~eڴi= Sf͚t9]tiުL2%^xwL6-~ONk^o}#أy4hPRT{(ӦNg P0! &@J%7xc!=UVn=r˗n.\GWS桇jaP!=k+$I,YoUǩT*ꪫr׿~?OU֖-[ /d͚5Yz___l9;Csg̙= W{RdݺuիW{UUU[[~}۪slsι˳aÆ 8pe˖-T*m>'zrH.׿3x`;||K_}k{T*ڵk7'[&7nLcc۾АM6?I O͛)ScXƏ 6$I|?׿t93ĝ RWW?]tQX&M+Vlwo~1cؼysg?Y /ŶϲeR[[}fر9ꨣZ5\TrfΥ^+WO~\z9CfYti~a'M| _h^_O~1bD׮ꪜ{1bD̙ٳggӧO<6]]__Yfիӻw 80zj3bŊt1tPN;w͙6mZ,Y-[d9cv8]=nSNYbEᄐKѣsI'C O<|+Yzuf̘>J%vX;/_<3g/9b̙yr'ggqF,^x>p!G?Q7'9f˖-Iy 裏΄e˖%I-[gIw]6v[*JF;W_Mnݚ93o4<̛7m},MMMYlYf͚'_~ͯ5;|ze˖宻k38=UUU0aBάYf=w3C i޶zL4);wαݻgѢEz9餓8ު>7|s}ٌ3&#G+={k׮ 7ܐ?>&LO_> d9蠃83gN~K.iylٲ%&MիsǦ_~Y|e;m-Y$-GÇgѢEyR]]>Mؼys^|W &7HNZ7gΜq:th>򑏤CYpa~/СC2k֬444d֬Y<TWWgȐ!;w@}B@{ٳggW_s5K읱u{s.]dҥI![nsymweVoK/ñlLzG@wxtcccn'_~yB~xz{'ǏoՒFG3{MMM?~ƎϧGǸ#h4ZL.]/mQTr-d˖-s:caÆXWW;3̧?t1IrQGߞ+;xꫯ3fL=׿n1=n3.k^Ǐ5\y5֎.7tSN?Qa[W=ܓ>:guVÇ)w}.n:tC9$O?vw*vXMJb'ZEI֭K޽9aÆ[c;6mڔ^{-guV뮬[9>nn1N+Wk .yv#GΊ+Z5ܩS7.sɩ|u>7f̘1nܸ1/BN8UUU9SOf…m6me]K"@Z*˗/駟gԩS۞}Ol[;2eʔ,_yyo]q'6;Oޜ4߿/_q466f;Ix444!FʢER[[ۦ;䢋.w믿xo}[ܹ۾֫W4447hq,!]466>k֬IiӦ֦su9ѣGt)֭ҥKӡC >~[I着T*Vc]Y۸wvmHJT*wV[nk׮رc>۷{mtmc,ň#2bĈ\s5?䩧… s}Immmlْ$ys}+WcǎmZ5}ou~*&L 7ܐ_~9J:vÇgKUo}66mj1ܩS営u}O:+V{<[jҥKuիWqﱽѯ_466fKJKڑ 6Cly*~ߥ MMMٰaCz5|jjjiӦ\9 0 +WL]][~ ' ʃ>Klz-<0ssGn~z=2`̞=;6mj^T*Æ k޻w-ƼiӦ)훙3gn&7}f͚4555O0 yW}x4hPf͚I뺺Z*'NL4sNn\wu9~eƍYdIV\|+mʄ r!gvs9'&M_ &{Yxq.\O>r,Fܹss7fܸqٰaCϟc6_]'t1~9]w]9/z,X_=_WӵkTWW笳ʔ)S_"cƌIccc̙UVK.igy&?}(ݻwϢEvƱ'ǝ;Q]]>;'OΏs1ݻw֬Ys_~94,Y$IsϵXo1O?tN9]~l~|Bɓo|#ɛdIr'IO[֭ː!C|>})={l`}M.]R__}٧x.s=yS[[=zdihhh!555+3cƌ|xsKᄍ+3mڴM]]]o\|:th}>}yGrO>932lذp;` IDAT򗿜3fdѢEySSSK.i^7?IF}'3f}ݗ:䠃y睷ݚ}L:5=PwCSTm7==9Ço߾1cFzlܸ9x֡C3gNN86y455eȑJR馛rg9#{L  e{7 'xn`5kĉs1Ǵp:ujN;L2%^xg4mڴT*7{ܺu_2G4e[jU^{ 3gN:t֭{ܽޛ~SfBsͣ>wy5jT{ Ź瞛+:i xߘ8qb&NÀv׹sq)L RM(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &@(`BL P0! &8}p S4V!h"Dg1VvN6֪N:L&fr- ra:nn~<>uy=&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aB&@aBwߑXK<.\x$$/|ߚ$3f8b$5jԑ^p, ֽ677gܹ:u\8ׯl޼yX__\B{7 .O?<Ƞzzzs$֭[s 7?a]s4z{{ȇߟ[n%ɳ9Ӳjժ=~ۿ+<@vڕ$9sff̘qX֛$BIʕ+s=L6-͇=^ {Ԕ|ͷ~46짾<fs5=yEu77<Som,NSg/f?My˳'O\5k7'_ɗ|- O?}ٙӧg4iRv{ngggF=Ļ80(-Y|kO}bQmzO55$}=Yk3 'fQ?O9?~hdժU;::rgҤIƻlٲlٲexOOOz >|2T~~Ϻ[:?MK7 x}Gn'.;?gxBNyitl{`w3愉2mn>xOF7]<صyI27K?_Wޔ[GWUߔ͋>Nh~r.HuIǿ+ٲ-׿{RflflG;ܻkwӓ+WoL_ֶ$|ϟ?h|ӟ4> BCߓ[ s/I#μs[\ |//-7}}9|xLwWdC9-??WW1 |{ͺ{ɩ-I>=6/aEn̅_.u ;|So6qE{s,_<?cwn#s&N8xȺurwd…!0d3gB}uZɹo<+}?Z۞xIS˯w6ùĜr֛fdoj3.9q2{CY$i~ūޕsN9> ;7q')S!!jdE'lΆ 5=q{nZ%efI˴/ _߳ ދ2Sʓ.˂ve3{ŷ%"P9^*/^.Eweyo@sܴ+W.*gy'McyԳ;#ʴ5EiZOxweߖyKb/3vrn~7gE[;#睛~gǾ}NkkkM6h|͹x^:WΒ%Ko}+O<ĠǍ1c &PSjlLhϑ6wر#^{mo~@󴷷K/͸q/8Zr<eɒ%gŠ+s΃}#c=hM0!x+|{#^wyhooɓ3lذ45 CSSSs'gȑϏwuu5Ja$x={v:<9sfƎ-[dٲep 25*[n͊+2z̚5밯[}tYgh%I2jԨL2eP?~|F$1bD͛5yǏ?1c km=r㛒4z{{CfPYSƑ^phI0UgIENDB`mu-editor-1.0.2+dfsg/docs/icon_brief/mu-annotated_ui.png000066400000000000000000002374301341747546300232130ustar00rootroot00000000000000PNG  IHDRXbKGD pHYs  tIME6a6' IDATxw|[ϹWv;!d)at/ʯ-Pmt -t0*l ;$$$d콼$k{~\ۑlDZ-Y<+D{sV80 B!B!B!nZ | X Я_?y;8^/J)I2!B!B!ZYh_רh|jFnf~cYmc۶B!B!Ba-=h 8oo'`6ZkI9!B!B!Z7M?묳,^Z;v$B!B!B^r1x`1qB!B!B!X,c=8R222$eB!B!B>"0`gEB!B!B! ($EB!B!B>ߐB!B!B!.B!B!B!0B!B!B!0B!B!B!0B!=S}~=t;t{ħCEq^틣 [8N=KX/g~w.=SϹox?og?xݺ ^tJ Mt ԕ;_粻PTQt]|3 XcB!D&B!T*gRb's?<{;z>{n~dbŌdg0\=4;Nb_qo扵u{Kٻ>B!"!Bѳf[Ëpcu/ܲyYAr/w0\KSm.#/m&:hw<<8|<>kS}}Otxt>3{*å#B!zN9_Cq{$yB!DOf? ^`eqv^-?rN+%/#o?E\T%sfUQɡB!"E Ħ[ƛƛذq#y矓zoY B!z:arR{<5{-M ŜtL`kⷘy Pʡ\t2Vگ/r_WhqaqyD>Ǔ+ -Rzћwn˼MΉ7ߜFQwq-oKB!)ѿ^~شy p̻X\{@B!̡{Q |AÆf[6>~$kLcW2T3a!j\va ,K}/hsO[ZkS^v\g'/R.\s~|R^gz0Xjm$B! &nt&۹ƛ_fү B!o*O=vWNpa"K)J|U=59&y-65X6q TɼbϨa |:94N4] FzV\"̵O7O3ઋ^a3ϙ8k)<+]o/ɘBL9[!3 -3cy-ֿȟ rda-ޘ&]ĹOt4(ltB~YLLW+z' 6r%|e/ɳ\wZN?z_Ccpؐ/S!B ;f 3se&76lܘ{ˊ!B7#Ϯ1m 1q ?x y2]kMhǧ̝.Rw!#* I ;X)˻n|$z>s[9l0KVXOĒraڶ瞝V4lAqt*iZP;3Ɠ=}i>+7jhq%GN;0]Zjpr\ -+jpe~ļ㈪pb{F5U( c_aZeuV%AU[үR`*0"pE6aDw5 BYU(l,0AXAhpbqX*닑^ب^\ѭM=(eՂ4Ѓ6fg {g41ўx S);Jjq{~+nk*Z vȩ'D '?FbԓB!BtgtEEEz?l]7wrT;P>o ѬSyƠ /R4ʪ\73 b( m`<8{ a8@$b'sD+_n(]Y!fThP`7 &(| #1p`dH}ʪv_x-{B+Q ;`o{,r:Ь9Ԙ&?pYޟ@9݊'>RTd3LgьÉdH=Lamc Jq@#`G˄11 <'y4Q!D3aԓ_zR!Bt)((H@aW~o\TtWʛ? {.`֯W2NwFnCϽ^YqО3OMk0~x*++Ci{ W`̣HƎÅvceL>bP.RV%ƤDo .[= #E4Y$yb&қ'%:ܵocoD5\, lg:KTTDq>WZ[wϔ nkp?nXmIUL$FH=(B!niZKU?f.؁."s:ܯ5Tϝuq>%?5)h=3pEDӣG] -ܱ-xk_]3tla2f2j v*߁BkyC4H"y%1ևcL3੝EL쎧%By 1l5xkf᭙ݰJNu3z•O8|9a[a<~"dLv @#B!=MŸ/vP֗ (Ț#]ؾAh -%PEbCzHdž70QVM M1I#{Q#j?${6akz[mqN ' :`'v.4v^##HȞcƺ,m;cN|YuP+zorwv4thw!~_'9G"U]ؾ3 09Pg@P7O _>3rvбZg3jCRg@ew{$fl,m{ńg dX8 +wAh=|=mԓ ;pr ӰkW W[NeM!@u3(5z8`q3&;%MklQûnDv8Â7 f@6s]L(+ιROr^!Bktx+@_ 8|11_/~&=fa+_~Gwl(ӈ7N#LJ( U Fg78נuLkԵdT=zV,fJ9'@% vęY?zBCV;'ƲO"5k3ƺJiGco oYKF_0"[k!$wdNr}:vf$W/Bp-~E,XviQO*Q2v: /J>ɲ9(Vgfk4%?9[+z YnTd-k2] ![ώbWVNuҶI[3(lZԅZ}`h?o]2Cr芿 >??Dw*)1 KP5gE+/S< ?3bJ;I^Q !Bѳt k,WVZ(OE+}H-G3WVY+O?Sӷ=CJu-oq墾#=.bUNVgҦ2R l!.zZ0k ߫]e`,H>S Q/vJE~N+Sq֋楩v6hY5ْ%-c93w'T "ݒZJ,w_{" csA P~s~ףGO'f+{띷0Zg%E̟и,ʪNx3X^mg&JNTQƛ+RHQROr^!B7ߜt!ko0CZ6S`b#2]̌'C*gr|;& wx-_JQVg?C]335\-PظPд4@{dn8ۻ0w]Md#Y+ސ~iPP.ө,gx{¬Ge-rvX˪dc7wN'ӯ4+WAW[4Eg7˽CJ ~%yiv̲pս_Z;CkysP:j&\]D3Jz{dgb٭۷a/hn1l*3K#Nuqg2rY{,FS.hBC?L=ə!^ 5ŒCßa&`sOʪb>Fe}"m|epC;Kߙ]ʁ%$n#pl =^u[ƗrO`yř9G;e`DaZ2$ Hn >ެEoiʟmh~9 ~z ,ǔj>֙Qʫq\Gpc{FbH=٣y!B!zt5k0(ÑMm1 4 Ƅ݅i% Wl{~aU%>ad¨?:{h`Q9 /x^Vm\ٸK١]5q̢ІQg;L]E־?`ԯ#acq9s5o?jOceuJ*Ls%e}sb2r3 HM/e6qιq+\y4bY(٭t> cmX5ѝ]U} IDAT o1 lF6c%1י@@6~gUXw[g[j2KY1fsmMqְ:sVTbeؾqXb'{H9/B!Do@@F+xo`p l8{FRʩݚp< HGeU91fxaԝyX='8G͌Ӹ bRO !BE5W1#KCBVΑxk_GWJȨx‹U=y:ޘ0;z37 $c,yg; (sr4Tmx CSc%$%n\ n$΍1/IO C j_ţ-銣e&Yv6?6aЛm+zeA¨߈/v Iq]p PSW'&X_6uۦ]Ꙗ[ }o1_h`]oh]}!Viz#/ngKѥ=h;fF /WJexMztSI!B!zð5Y:ܹV?fW a?umw͌'ewHb1g8ڴ4g f_(qעdT> Vh'R~;ZSY"tϬ9W3mdzêLꭽKYh_J?Wj܁ MU~]ک`J>[*V_A)Ppv3m[ᗏ߿ȹXs棵x\},(݆5`ȏ3jzM~prU;WԓZkx#3ny$OYex@I!B!z VZZ"1RzaZk,ƲKyG2kwOw: {omiYv'vta5t_+4ц]TGeAm/qWـ ۟VZCNu, _ eMv)=FttvUaUy'-eUZ9ҕGZӥPiH?_+TNOyߘf]*0J(0*:.T8htw}mY[~z=\u;[Q{& ̈TatדxgY6,ݜP*WܕɥkWOm CQO€yowpd(:POemuV*y@quB0ɃYOVs?:Hu [)\O !B:y @W; ho`]40i>w>+uwa]q <5QAt=ޚWun:>Z[K](D-+O4RYp6k'[`Ft tQ[w0ڎ(ρ!\ND[Vq?Æq)L^8:M`r.X羴 "93ޚYiJSuu EXq/+7cjQLCQg߼ ψXNl;t^66mk2< 1L= ;1W|TVuS=ypYhzk6 *p}g}Fa@n`[ko}FAe]MBӺ2YlrUKz\4u  A [nZiw%.^[ m0eL1pG2+Up*} 5ݓM\9_!fz6DM0eCzR!Bި=⭛Duħ؊Mxp3?ݰ 9}ڨ~`9P4w%w ZeQٚ` Ly}j;=.uHS?CSq)mefghkW6+;ViKQau FhU|OdO#;J)b͂[hN=f,>g*pBP?;Ux;,1O|C=嵼` .t! q]fO?_ݛhK3#Y.^ݕMJQS&RO\g 1>"[p?#;s[Ɨ+'n]^mcŦ}(EYYiO T*^n|ͥ>NoyweBgnV q*@> O@5 sm[9ehe'7e諰1gԽC,td-dk}-jJC=)B!DoV+Ƕ+ @}he)mQ{]Y3̄¯@ g :k _-7?Nu +؟>8;}3.Eqv-Dٵq}~J)RGc`-W @}oCL(Du`j$?"g6;^ቷVPQj(Xi>?}`jS]~v=eoSfv߲ztvpW_-?¼O7Wam3}_Ax#&9P^|^\/80c)2qDQ9ǓYx Ȧ}F#q9{V{{TT:+iܖ9Bz2l *}{kϜ^P8I!B!zv3l@[vvoBڵ"̞,EOūw4hβ5Zʣe 6y5kXmڡ8J@v?=M a(J/2u񍂬I!G*%cNH?O,cj wb} Hq[QmH?Z9txZ~\4uN][t'*\wj6{8OϚ}n~}|SYzA|\r҄o5jٰ}Kh<)T[{f}yM=Go3j5d15lT?f0zpAˣlj(emuiP ;iPY&DY<22<.Ftڏ?dUb7bgL[k9` 7ldm.9{Kj:[ +}9ssO2TA Mf*㭽=o˝O@4rr4cS"S|ZQnGXֺ)=nPhY{+q֑cˏӡn'> bP?4lz.am̲ {S^MtebB!Bfj=XY=G9B{k4h)fl{AY8W^Țusoߒiv RJ/OMM#;پ!}կ.C(5qf֡trPfޒr"{ƽosaC3`.85uM3zܡOvy-۰_>2Ҫ`NqA4&.KQZ3<=wUY>ɜ2u  E|{OWmOz~|y 2<=*?kVNu q $#F'2~hC15&*quЫK9dx!GO|pfMs4\^MFtF 9S0O˲9ќ(ض aҨ]%PMf8g4#݈`D`&* pjtAL;;J$e:xHCS&(b=MGq)SUtlFa&3As(n{VXh̴b' kSeVnUoלչлB!7kׯ~wd#JoGɚ[ÞJljW H|SۛV @#<0}ΔW(uK@ފUVQ$jQOX_%r3xݮn63ʄҖ=t+΅'7N;aŹpԉfעt}L&'V:i:ّg-7m1Ž>7\x$*뜳MҺ; _"HUWm0mcWفڲJɤQ/ן@U'235+|tǼp Źǎ:Car,VtUpŸLcx?" hcOyKx,+ß{zfkڿƦؼwn%7p5<GGGbܥ[Zs )j8[tIy@G=g=‘z}UZuO7壵Ln/m5+Ks}sKf">Rwgj#Pn3&d~ 6Ŝ㢚HoP_]Lo~]xTG)1,3[^O]ŹGepQN''B!7ݬ Czwsoq~4f$$lOMF8 st*Fw[Y͞[j% 'ڷ˲H"U0!p ;˪<8x=sm&h!fQZ5(mC/1~fZ3; a(R~}8;4:1aN`PBRS}YxyM˷qIzD5r/UVdCS;O\?]~2ߟjӁZìE8رv>6ZyIȎf AWo-8u{AAyu(gsoHܽL> ނ(/.XCyMbJqaØ6n < |YΚ-w2-),Qe21}͜< EKX<.Z3.nW)cotÄmAh+d|I*t3JW23q_|t~KN={*yiڦk^~sȎbB!Bbhހu~y{̲yOYflC3{ѺSsGt~M/hʘbW[lssf[i7n%q 3_ G5.ex; wH!xv8qpz^ Cw.-ϐ4 ePF=yiVngQ/n:H͖=Uc9y/38{udgI ?p0.__1 {gv\y˔W8С=&R~[TY>C6 ñgN74Xb+xHjS~f(xt=,fm )`ǡ#8Qx@M( uJ6:=:/Q|nƶrm2.o/cՖ} `t9ۿ:ÈImSo Wl/~ssm濿?=>%U$ņi͟]"Pc.B(o,CRVh8y Y>3(g̦84|}Yɘe2:oH碖"͟4`ĸEx=1F)4nP+ΙE@371h+a{:ɚ`YӬY'|qGsI5($?jSP$_^ޕ۩Q mk\-K' /LYu7lΜU gKS?ptM>rtz󧎒0hpBmW0uqOϩ '`}hy۲28eVYk}8uꈄp@@B!wi_OݬӇSy&%g8jg!F/?8K&hpa6\{6cR=8:`Kv)LGyqZ./=g rl=fƱM7 '%=0A;yfqœc)H{<.nheΖe](Ң{F瑓m3nOePF_Բg`4{x z\|. ;.93)+uP:3"jY> s Vpa90?]`+t;Qӛ?Sg4ŕA`]0ԅs.:R&5vNIQ=!C[_}1 ?1 ظ*_N0fz JϴB!qIu5#ymgv =FL?zge>U{ LfRf\& /"3qzk ;JjQ! ",^eYw@a$tֺMӧdhuZJ4oqC-BA?73 i ڍ۷>n ;]shgx҄>^l72 #1ʪ-xNvprΤ0ϏH]?O۰@L/; h66 ?{^E5~+! KDXw}mmZvXI! 鹹mf?&$@M=O3g{y99#[<}d[O X6d [ef @ z "3jdi.&7j^t2U,xzfPE2Awrsl84yң#y۔j躎|?q񑎆gArA:f[v޹61|x#߮1x d.塷#!琒 7]9\:zs1^vu,^ʁ"z$Esͩ'7o|s1fbMwe7 [ljiն}a#z#ai39*y`j"S 6pI] ˫1H2^@rlDH J~mypDG涗WN 5)Fsԣ@ZHAOYORJUMQ-E9uL/f*K5ƍr=h4(jQKvKb%j2+-G@ A^s]2/; wbڈtؙ]U?&n?)49wJ'xXR{;hQz(TzT3;,iGR44;^*964X=#Y%Nq%HBGGfu:SvS%>YnM-Vcz:BiGTQltA|EFբ%.Ze|2bVQUEi zuE&:?GNQ v{Y%#赞1(J_a#a'!dVl<3Ofi9-ZkG*s.!r5&ffpZ"K˂5>2fxO-rpfEbLX.*j;TĎ3kUgj8Co-ɴiMrˎOLp fIOӆ ؽ0F)> b525]`nq^Kʃ^ktf@  (ѠV7xw:YLȿ>[EbL4 O呷PaGR4_~2f-/~G~>[VΛП/oU4ם,&8w n#ᴙj@݇xEJNׄY)Iz܎|B.lĪf_3У߶erٓӻF)>F_ԣ1ƲEdX @uN }Me u,mSXjKUؙ_(lzU-((qSPZަt,TK C(ӆ1O2VBjram6RZ옴>_ht.DL utµNGE5#(xP?5MI6?_TZzנlK ]iTK^pm[7S씡ݙ1oVn/WY}R~G$b"LƔ瓙W½]@|ݸ2gek6}|H4`=~sCN0wj1jKSŋ~(]G9]G7'"[Kc{MF҉ZNN :ށbxEPaE}RƕlyR @ h+೤clHzCĈ%ҵƵU$~K c0@7ԳW:F^kQk_Xf妃c6 ^|zt}ew4~M[KJ\^~ۖY{sNdž=X0WUۖң.͝2@=t?f,&& KCII }jnTӁJ獩jj1+\5c(ōsE:0+FQү[|۪$I\2u䏽A}?; LM$:܆ϯP!qׯ?MSjZ3POѬ=]u-1{/ǣs|*(u[^àD12E.6!R>Z=8ypYZ= >ߒ J% zJfHnbB1HgQhί[3xlRK [x I5:eqMBoTUy55ޓ$)$}kۚ8>u% }0fw@\ 7O H:ʹ%@Bvj^'S"9뤾|jssK?70^gc]'M͓@ A{^ՔnG-[>y,5dG6bdE1V UY@sVmPϻ ѰI|H6gBtn?w IJ;rnU~>_'@Whĝ,uE+kg@ q_7xUN‘b*:5!& E>2=$zP~&EKuCeZAܼ/_]s7M#!6;y9$Ib4]^t%>pLϯ (iPЛyvIƜV)/d|ֆ>IhDdʋߌҸ +O\3GYywz~x'dD8K뺎ׯ`>q؋'>K3_J+7ʶ|_3'CS6G"I'Hi͌’u{)uyKBV2~%,Wcr(Yѓe Y*LtY~ҵƎNPyI|`Vn>Կi'ⲩIկ:%|t3.XkgJlո،@ @Оdg5pPhVj1$0)mHkYѕh$p !Lvk+nЫkkwdU$-’rQN }XVmO6ӥm[fcމ sZ\x#ќCQWnJׂ1!I$K,WAݎ؄3%Pc+I-cmXvO*cQa6n2/}OljS1iԄs~e>0HGQ}VA.d|,Y8wB?<-t5$SZ^yS?vVW,%%𠘎 ,0خ>j0w:ݙ<6w)|AI#!ʉ"<*`vGutF]شek ( C'469:U 4IT/Ks9ٺ?e䏽d.9@@Ƨ6}$0ȓeW>{:ID#}NJ&2Nj5;'~Tɒ[z&18=N1aȒDn {۶L Jj5)2]4ԤV#@ #R/l7"CjF:7U;m?ϸ5 &w R2Œ[Vw]0#ylR^Ѽ~i/?jX#;ףnh9m]y˃^.7ӣ1DΚ@ޗ&7Btb$ņsɔA176դlQ/|bKO5Uzve">]Oni1۫>:Qǚۭf8o SƼ5MӋK 擥kw⎗๛`@7wGtC tn.N7*]$N܍A`߮A~QY #$swfn/s]=X&ȓae&77yϫ9Р:lf?m2ua?y.{w&̀.8IR7}du$ΓB6>Co,!Qu0aeDd̟潹a?&p Ee<^s$d4=uXjh|4~IoV$(~ @hUkݨW:=_?\TOiLҽrjyR @ h;෤| 򿇄 ғ։Y@Z`h$N Nuq-yK֞ \Xd~yBm x;969vg`>2({UA5LMԣY.l$F2-GGp(Y ?DTT?LQ:Np r0~($ls:vY#)wؼ/ɲ͎,K LM3G5%xigۙ"J˽ȒD\Fˆ>F؍ӌPjM&M{sjLM2Qa6"!ngR|nh籐Pys8$ $}y<26m%vM 1or@ @Wx&c+xz9Pp8?'尙y쪉-'[$ta^> tK$o@Yo |v>9ӏl%O}Q7dU~=d6&QJB$o{FM!ң#P e,KCׄH1Ql GV_G g(MZ~ts\/2m[б&EwJSf Et^;r7N%:jsMZ m IDAT߂ Mr$('ũcz;}Ÿq+ }<"vc`L8m~Xzh~I6^mPΤr>\>mNk#@ Ҡ7T/f+_zTƵ61+ZdȨ1V"KgRdJ{zd~׶`9OD3'7JB7r6V3sdžMxY<|ɤ&EN@sCnJd1|= kmmJU3rkL:˶4sC*Vԥ_xi ُV3?s9rckc> K I}]{:8!Gj7 'ՁI_dg$7;S! 4n7`s͓6K ÇᱫNa$LJf`VdLf&)&1psM<)@ G^SELReCwfD J7k\GDLFSנ6[pfsQ{$Ņ澯p6 ̸#/iM]F#/vpI5H~$L##N¥Pڹhxc1Bǚ@[,s^LPa8Sr$QY`nqyIDߔ8q*{.*T%c;!O7T,VZ/C'k evx#gmMڜ}$M-1޺.B!ү٘K~DVbOk?NZ]7$ؔ'fٶom;]DjWvڳ` oQsF*Fg$I8mc'yR @ ho48'':B ovroqo䄦-§Yksvm22Ӗyp[-Ꮉ1#(-=ELddx9< A4}$^ǘ&^Xǔ$I\1}0c\:7=G9bq\.ʰHߔ8޸td}L9#XWʵ)xZ{̍*f6sƿ!9\'BT9mWڎ}Ejnl*5Fֻ}/^koMޝ%I@ +IDBB75Oۿjcgc’'&oS%;1WS##/sLƝn8$DY-,?oYa8gR׶V$c{3o2&E>?1WثB6 >(X^|WR׍sHPMuMmSh֖_w⋿ dsem_NJWB)]_ m@ @pШT"M㊿]Q/* ˃[;${H~k7 Oŧ{ `SyG+(r4eqwlv,3F*|YsA2㎽gnd11F[H~QņMuiucndsZ'% eqД$({%*j)# ѨDRw }ڱ$֑"g7}tJV@4ELm'62O @  x{m)Iw5Ædj[Wy ud;Jxb J$T W@6Ng_tn[uu<`2tS,eF#C{KڭyTʈv7H~,7* |uPoc~w`IG^-lUu!5~Xʖ!i zQKJD۳%`σ= m;J$1~5Gc5{@mE^Qg~ߣƎ̸ogb][3ϺeT[̾Hj|P{knDJVG2㊻MryU@ @x[19(5V{"ǴCePԬ+7QP1@\oxp v=Vq&\kmWz @hqN Eͭ$uus#ǵƑrރ/ h s#XDzQ{k[8;h8k#׶)hK!Pܟo8#F4u(Z quzk݃wE@ƜT "O6/=WFGylh<sq1>TFlhtߐ*wHшg1#Yd_w89W}Mblv^ @ ho49s݉˨EݨQ>ֽRo6y(Rc:GS/46~M@RR`3 AqO.XtV!# u22ۍfң:tɄ> ŗoT3)up?#ЖNiT%AR9F:v1e |aώS[_՜nTksV-Em# YBǰoF:Pfr8eIO7wkۇ sWsci.([t: +O4b1mqзG)Ѩ]wOH1 <&[ZG>jz?e;0DS>Ko1O!;/@ 'X8#1{ ^ T$T׌m߻Z >9貣y}-J -Wr bzoiin~ >g8 ΄'r7QIQS@H&|!(($dͱ`ֲA'kE{JgAY].V5Qǎ"?oUnMkqkk Ւ$P7;grcWg:`FsP"puڿOJoɟ_](qcOk_<Z6WM Фo+Majr,fꝚdߡl 0E5 u_b(}xksv^ @ h?&DL=Ⱦ7"_`4sw 8=s4e s9k ^w{ G22*]{ mYp wt=B֫p45 HVaF ފP`Q֣ьzkˁ/yi&kÞ{qσ)ğQ@]L ?:Gr Z)Ouƣx@ :111 O>%`kM]C2Mtx~c~ssv<1WR>p?Gދ\^\I&;pEٴme!Kckw`j %;m[#!8z2'F0Z[[Hxw[q@HkF ԰G]ԊlFiB#+P~+񄟊&9OkE[Jؙɏ/[_wko~ #Hהld]kS_;O'4S|ŵ{ˠ!/ݨU1άWQBl,yTkD<&ms|f9 yY†@lm`|6$ 8 ^\/5uBfFordWh^Ґ//8Qa2IbFZw gz@ < vϡxwS6pF 5ꎚAn#ñW(GjI,NTk!}]Z{kugUb6cÁ[ pmՆ֛ye?r:k$gQҖѣ=FyV֣P;x~돊5SQ;ږj8@8;jg(fNp7+4#P.͖;Zl}MIe8_T=QKg>*lpvK e coF0H_rtڜ&B.[SwҖY |8D{oC^jy 'c6c,^ #' 9؛QMIb|Z 0?U/lQ֣bh_㳡0vXa+xɛUHȰvcH$W쨐6tbTx%r } 8 Hx<1vNFGL/@ 5`8<ʱ|#dX6M Qėg,Fr U7 d{ /G( ;jldYEfG2 Kq6jyu;6T[_ʣDFoCf# oQs8$݃ͳ wASkg2V9N]&Céj84:#%tS,)wLAu ۪ұ/,gز(|!Y^Ά#R2 Vn2gh:˾̄?|Q7u9vmDa-]$_f=0eI0zT@܆T̓z̓;㎺Of>n9ŵ{(m8Cv(P ٘@@ ?\_X1Ui|&34Hl|^ZU|Ocț"M}>~9V̓ @ mfk& A+k ;ELy.>9M;9$4Lk\9dHBty6IhX۴z\Nʫ1QhV"]GJ%^RnJ64|rB5:*:&l}Ñ`)Y賊-z92}Q⷟6=>k7XAfQqވYv<T뛭ft@@Iwc.^䇊r82uMu>4|a@ Kjo.D~ $)HބKLe"ieͰ298cLȚ$ͯGA)-G:݋|P\ iFbU F<dtفnK6s<.cGU-c7]+}\ػ#3ى9 w-rh>݅t!h§ BLZj|J0-Vm[k&.BCQsG$oReov wĨm[: 9U @ T-4&N̥K0@"-$9m =va IZgWEڈDsq"9][4s">{KrUO!kEXܫ1EvARXC@2bE7š:kġ6:Vi.L-X\0G7:m}mۯ"V`.[;7jhTkxaJL,ht/&>,e?a._lTreƱnIgy~s7IGԷ62>CceL,e+PܛYH)+ d+fj19Lb@ Њ~? wg? {I-@%ffJBᷤMv <;PLHZEGFW"ݒjNF3'㷤YRL1zzTȔJ$ %ԩU@ ?d7{ʍZǺ/w.L^DǂN3aڗQ\^NNd$I-I d>w7&Nd_/hf!Kt  '%M ;>䅆ۋݍۇ3Zb#,J8)՜jIonNlRI:Cl@@uNdτ"s&ǀ^)cDL/@ YF @ b| @ C, @ @ AE@ @ @ @@ @ @ @ @ #@ @ @ t`D @ @ @ x^zt-~! @ iqOmX۔ʶN!/p @ m p~R,IgmǛ=a~ϷFExnr\r`ғ{'; 4P߆CLL 1$eC+INU$&Nx )5l хn}3{xKȦ!A#(Y4YA-ox.xۓذ$!Hb.}YYd_?ΨgV9b_We-x*peV~,LvWF9K>g{=5Woy4P%u\\kVV&_?ӹ(m,_x2oWˆ%74ĥq-gWZ,aa³ȨO98?JXzfխS8,]<߾=S{f4:P1f|M,緅oYV>b2W^wycǧ0b @ Sb;>;+).~xC<8{(v(NM# V V{MO 2B1YX2VkW]r'= ljDZ(+V|37|[n)L_4 IDAT#26s {~&5?O6?V~r )S^d3a-gΨt}_j2Zq5ӆktF4Wa>>,qvc7,&#\Qmn?Dtxem-~x)sNGSءUկpôNŐʯumMbp'ѿ{ ǜŜR_>+ln["?qÐ5|4<[q?' *o_џ =)n@ :͂$yn.{-\׮=Y|:_#e,ǏDWcŽ\<'f΢GfVuv)oop .m O~̞ݫyy&}k[.{Yi =6tG{S?^Tӆpsx{EVAOvg>"w|!C,r>H:wdi*ߏ"w;4RYG+Cak緿}\y,u4ՏSyJfq޸e]PN?4J;87Y;o|m;E=VJ3hP"3yoo˓ICvɂpnN@ Bn%?ϲƺuㇼdngIV/1,\tN~Gͪy+{]6y:dfڿC-?Fs?ʂ%zky$Gu$NLkuD&>ySwţ{,̬)I JEBre)ܾғga@6Yюs;M瓜@B.,[קկFCHw`)dڏ[Ń;HRh߃~$#*=X5{` 2dԥcyv_&F{gejTotl7' 3Sl'Ɔt}{3Q|pA*puNo1{ 6["'NM=h.m۟w#Aasw:{Y=NNދSڷ<ͷqɚ㪄xTa)-~OL})b;_}\/5S8ğ`UEjV^搥{Enˆgƥѧޝ{<빎w?vT RIydeΓ*C?˒~70T&;g^u?2czCŸFv9Su#m:~]kO@ A}Wlx._~G>HV7ԯ;7W/ Jf?-[֍_uK|scILбCYťQܒcHP z)?x.Yz}x.@E%;#sW:Ky-Ic1\zF|1ݜOg'_<8[Ex}n>4z~yٗ2ۯ2'HE:4~NĻ\3F'7Xf t1_.y)2I鶠k=b9?&X:=e,9}Rǰ_5l,zM]@⏳cd2c} %^zϗ^Gw 7zJ6鵔Y2pلiG^Evi2cStԝet.\/ESյWsErv}Jt '*}id{ lXk=ܷxCN`t&@ >۟8W۫Xbc፭{ٻoK2 gJ_cy,2IL15%8@IH$^ 8DyqދŜ׬޺]_ClhdvФ,9b^2X xpd[a}J?{_E;)H@ (UD! u]U}UY+V}("EDJ(Q4 mi1trC.i7Mrzdf̙sΝ9ߙ37kU?hW{uͭ7(*mak镧?\I`Yʻ#?|T^sM|OjiMY<fܐB]{*m/=V&M}JW򼺱jGac@*5@)B[luYbFاP_wΫZ _ O RdTSj1h1ALߙ\G|2hP_5- mz:`sNjԴ6U<3@vVCFަiZ)pJfT)^-{~NzMv *MxD݄ ԽVz^::3FTmZhUJ:ZإJk(vT{vVvF<}`Ej7̿m1RnQmO8Z9j:kr?6яkm:䤝ӲyX}MlRnz$v^B)yOPcP*-O29:}N$YT9?q>vj 2 j^1_{&v8F-(59K RRh=Ie<Rځ%fd+= OkR4]]w%i. ȑt`0\xKkO׌[ڪQrGE5V7+'{oN֖SDh u|@C֣[noIV=7nE=0MF+bUZywQÞ~{_'OӂSvϧ?hm^$Z_< o^7]Q=ީ/ٯ @P[)}[u?A/~/o3Ps>ޟuzojWj\{ b4glջVv=;-E?@m;AK C?{s1zL^yGf`^`'mDu3EC[AYn:Lrr25lʼ535lX6YJM Txx 6EDDM琤ծI5YN5"**"";e0|A> $I6m&A$NMcw\pAWjjΜ9CTHM6T,I槟~$Ջ7o$[EDDHMMu]+-0crի*‡Տ(4lr21P$='`T  Wq?@^4:E#ag+0 C?WV!Ɩ<4I:=2\gsyJG/ ~K6|1.,7&W;}G.;V12~c]g|$#S9Λ0)-]иK҂_RrA |k:x@{V]ˎu]VXA6V~>ʒJOCnYљEoiN=Z.XRĽVݿѮ?RUƨUm}oK=joE={^k-F#G*]*Pnj; l`^avhmY.۞kӑڷDB^ll  YI8FW] `Y,IdlF|A\Zk)?e~s\y6#Ve|+w>p~q.d_Peϒ+cߑ|nqG51FF8.Kd+8eO~/*p(%%EwYY8]jj6lXרQCwԼybRNN U6m4n8}j޼ZlI*`~;nݪ~XZғO>YeΖ1F5k֔do/o IP^^^sssI&j߾N𲲲D +Rǎս{w-ZHTqg೼3fGlǓ :uJȐ$%''+Pffj׮]yFFFJ ۵pBtMի$ `9mԸqc~e1c9R5 dz.\ I7kLwӰTYFJOOWÆ uUW+,Wó1Fի;SǏ>Нwީ6mOOOիuaeeeQFkԮ]BۍfӃ>4ѣ>}nVuiܔ)S4fuUڼyΜ9H1BWigggkÆ :pΜ9uy2dBCC qڵ:rմiS :T 4(4 .hժUڷorrrԲeKӧr},(88XGʕ+uQG4h]oV[lc=3ghڵ:x1j׮Ca IDATQ>LǎfSƍuזxwLY_^?Xb]k݅O*w>낀wyGA;;;Jo*''G߹s~rݙpy(IJLLT^* `ѣu)ժU+܈#twء۷9nI6Mڰa ǎG}zkQXXtR>}ZÇ/s}X~iɒ%JNN.۶mS:uԺuagΜь3TF Wk֮]giȐ!4hPl͛7OWLLu'NN:ٳg5k,eggW^ׯRSSe;vL&Mo޹sϟMS^^kĉN3f̙3۷T,*},h߾}ڵk:vΝ;k׮]ZnBCCջw … _駟I&ׯΟ?"nAJHHЇ~ &CZGͦ 6(77W6lp{֭[k۶mpqjCx?ڼy4vziӦ;,lW8 8|5kÇKKA#7+<<\˗/W^եQ=zjm޼٩fiǎꪫȍ1%I:ݻWsO~իW/M6M۷o[,͝;W_SP &ݹsgl6-[J6mhϞ=BqviժU2> E)))["ˣ:}FK*%%%?_~(.LǏӧ5nܸF[nݺiٲe:rHճgOkȐ!Ww߿_ɟ6##CҀ-Ґ!CuV%$$T8=@N<$](88i  *)))۷+P[{Qðas #//O;wv)(Jݵk.WIەZܹsz7Kǟ'ըQqҹ8Jl%''+::ZJOOW5 *;)88X))):|Թsg-]TJMMUhhBBB<>N8!I7o͛W4G޽qFܹ3۶mjѢScɓ'%I7.4pժU+ڵի;~$?}IvIlRyyy:{zU> f͚wT\seywE˲J ԩzyq<3"-- P\햌FP]viX"ܫZ-RDDu5nXjР9K yG.j4׭[W:uO?eggk5jtEmYNF}Eivuڂ]$IRnn1.Ǫ؞Eoذac```aB!@ _(4\#(E׮]յkWM6Mo_~E ?~|tYf?~\ꖥ<wbrB!p~i֬Y:vN8@uiFI_Q~teff:5,wT8tȑR:jiJzBBBTV-9sLѓQ6Ƹ⤥) mSP/<PlJKKSxx${y>CDD233u Yf:~<p\y]҃###բE }Evz"uW(>>^;vP.] f͚i,pjn:YN:[Ν;TWƍaÆZ~}`fnZ5kԆ \}w[Sw֭~:uʩ>}tEUyz7rÇ+** |g;\0ӔWddet5kl8qBt4nذA:++K'O԰a.Y5k,{ըQ#eddh߾}:~{ 5ZZ~iս[47|f̘ӧ_~]vޭ]{Nݱt]۶mӜ9sԳgOiǎꪫ򯮯 ٳ{O>ҹssN;wN?j֬P9R .)>>^'Oĉ2dݫ>HWڵk.={*O>[m6EEEiرfӾ}$Ip{iϞ=8}w]:tnMjrT芪(GÆ w)###?rGkF0`ᅲfSn¥}?Wa1,IfܹիձcGjER-يKV'_>:uX) 彚o|^{iذaӧ+;G...NC… 5~xϴj*cԳgO*~'%%E|Zl޽{S!J#?w2Վgc0p+O | aPT-Jm\m@_ؗFzCA7,vKAGT| daP)xxxm<'5@(AETAFTAGA`x PAAAB AC oųc,}"#Dq5~ w# JD""I 4pfW" 0G72 3d=J00~ pT)0~ _D#0~ ! !?&  v9% #0\e< '@r5EU4R@C(rr]}0PYx(paA0^ ʂ0^ _FCTxOI]%"4DoLjB'0Հ ܅0 ܉0 ܍0 _GCTWd7pNJF0Ռ *aAՆ& f~]}0&PP:hHD*@Չ0 a*A@u`DJCq! pAxAxAༀ0. _Xއ0n@0D0@ހ0Dx<~1sϹ.&6"6(FpA -pAx3c\ A |aPA@-բeRydO.u~Uť5>t?kqPM TcJo,DPe/oTcdMAjzF@qj/\oWtnj֮ z/$mYϫsϩiϞj֦ۖaV5J^=ڵeYAt|ȴm+3yLJtʌ+&Ӡdf_ ;&FWerr ݲd23ezȾ:udbce{\]feϺue k&L<3YܹsիWcǎ._EMs0c<-*rR:.'c._.IIС2/#?(x\ ^VϞ%@coP.Ys=I.ƍeΜbbd%%9Os-,p\ &k"r4_,2FGK۶Ɋ(z8[e͟o۲dlnW/'k|.bO"~qqq:t.\ǻǕ"hr7wU?:6wﮐ}Tw]_-[tb,NHЯw,Ì'/s2rr^+٘K?4s9sdeΕ9u~ƍ2{ڹSz%"+)IE ked֬6ovbN~JY;yRfLpYkHӦ~]|2M@˾m$dLzu?p@fsd|>` ɼLr? s-]ٸ3o厀8w厀FcǪ֭:л|=h.lck׺T￯#F8+2#SdEE4k&+1e5 d <Ymȴk'k^Nd-WF4ݗ_ʊu@!kv?u=fΔ5iLL-[]2MNʴN]RK*w뵨q^MdkQYMʄJOk^־}27$# ,  + ո#pAPA9;vt3ϙoTNF)/$D)e$Yz2LDLz2+}qӾ̭ڧzMUdƍiT&8XV-.]dzJf6t27,j̢CB+eOejִ/{w_dըQ|"s2ۗ=f~,eXR^ݶ#Yc/Cd}~:ȼ4c{ޅ+;N.6ܹsիWcǎԊ-Z<'?}.lwWСCpB?sT3 IKq! :oTaW >E #0G%# j+leA! Jx@x+ 60#ʇ0+ʏ0*0*0cha?U >a@"aG!a _ @UT*@1R*a@!T jAPAjT)@# 2AP%'4iMB^ P* A3T @ sAA A3AƕF{˲J@l؄E"x>r#xr!v4a@1?D/E" (A5ޏ0X@P$ ( [Kh |D >09+"aQ@AB/vG|ApF?BOOafB3WE;p > !rh0 zl IDATC|A%! ^ /FsaE",!!E/A@yjD@EHPQ/@ſO @#]"q!U @<A0xP<&8PTeyI?ւ?Tv"4k&pi^P'e)'=8Օc!J@>%Eez t.s2yJ8[gdrb'' zQwF]־}2:I~+kYaaBCe .m ӱ}3_{)C2 ԩ#+sPO?k/zuy\6",߅ 2/,#jwL̫/S}}V ʲwԱ}u &ץg<(3v d~0XfGw@c=uJ?wL`Ϝ)se ٻ=, *dI2sUllV^;R+ZhA%l^+kzG=#;Ӯ][ho5"kDGK۶Ɋ7u9s.ƍÝ{뭲ϷmYl6N^VϞNts4l~ِ!R\,G (qse={5{vO̙3RL$QvWnݲܹex˲n%//dL8Oꫲ&O;V….ɝX4Tw/rqqq:t.\sG6b=dH hV"{^]&9^~喒ߗW^$ӢSjӺZAz),{\usEiߟdDZ;~+#+pY5j?+YG_/et$+!A_?Y? a}6mdڵ1 dƖNɊiǗ]쎀=dm.ᇲy3gʚ4-[˸i}=*iSPYaۻ^&O{2`[֩S'Yw[Ne/ge(CY֭o׶?I2#FȊsz˚0AfY6'wzdP]]~GA@1PV&2RVr̉ Yۧ=}Gٳջ4ٳ.Yj֔eo-wSl&'˪_yemT(H(my%n'A^ҵ5O瘶\h tْ?@3yF֭T[8hht4G1~P!{GO>)s_Wro2T^+ӿUWo$ӹ4jIwqU2F wrwnwV]E%Z>E/nfϖ9sF&7W&9I*۾ҥ-^o}|T՝Z+hHץ, R$څEeu~k_mYmQ.S 6&,,@mDeuh $??N$3d|(/ Rʭ\ݥcrg)Ež+⋑jklheڇUTHǜ4rr|jUkƌ[$vU9"eg8~Hk*귞9Ih=z$ήE3rӦ%>I=% gwʕ޽~7)!M1P L`n,<|[B#h}HvɞxBv6mkd?kW @MlYǎLKa]~}(Yn4YFo_ԩ \3G6vS'Yŋϗƹŵn-ʞ~Z%KOʒ͘H ;z=4o^Y*. S'ĉ15eۘv`=hgK$$S* %ܮ]r'NrO=%z\8D$A <}~XnL*$"N: 'O^{~Z8~ңʽڴ{ys(?=ZF"4cK/?ƏB ;xC[ڶ̔fifYr{Y=<){Y..d99kֲ=d<%oy졇d\"KK SX(6Ӧl?BcG[W|3dپGe6̙>a}{=&9ayaܻϳ}{.hg)x)(GRm V$ޚN},1`T-g=pn߉IV%СrkR'?ϑ劋e/,w]ӼOqc+"_Scn"3ƍ9+m"׮]d5J22gI[]w]bƪscGM7a1CLCe5|I6g܃+hQ ?SV_q5u&},n6㴡=.Vi\*7;MNNdvm( ?_܁Ҍ~rKȺw-]*;tuewޑOmkeee)m(ΝSd{rs媪g%"Ǜ /D:t-Xxl|Yvr6H=Wuv}mWE5Kv/;%-SWhhhH{k:M$"^J 2# zofiirO˪.0z*Vd^/ W_W͕#?ɮ^nvrFoUWɮZ42+rsáCr].\~&0'k7C)eg˽Vdmw?M)WV^6;A徖}| ?SV_qޚN>dRmiCM4{@ƄsgGe~*׵k4~*|c:t?v .W^/rIىu8!=Td6o{&JcG-9";}Zvhr;ϜoϞ~n]mkDI\FСryyқo;w.Lu}%+m ^{k:MѱXWJ n- e…_f͒8 O֣[d.;qO6ZT$pꫥǤIMdeeɓ8?_.7O\VQ!+-͝[拘_Ҫ/hk'efJ| M=mN~YT$71~9elbp4ujddS"+,uZV&Z7$29k2?Tx4Ur~S?|JeZ 9s4`,6v#AXZ9Bzĺ88ٻJ"Gѷ_~TP קO͕[25ݻK%%r^mdٳ~c^|1r]feheڇUTHվ<_Z_c|ۘ1rK_I?SV_~m ֔uڼ`܄ F /6bhß|"tm&r}HvɞxBv6mkd?kW @MlYǎLKe]~H6j[7YZ,#CַlTYIIb3G6vS'YŋϗyZ eO?-ʒeef̈ $r_Ν}~zɞ|R7/(T[iex٣qE.lPJYZ7# *z!iV}|G_K.4Fr#ҥѣrUUmd/T^.]~ڷ'$R˖Iii;Kxҫ%/|+VHmH=&7ywt$iZ ~ɶR˓^zIڳgOiXiʔ ~")=]=Z5K.33jyX~ls_߹Wq3yH&wK/=}tᅾO,7lXVX(Ko!UVJSOIB$Xƞ74И>O@{I@ HUUIÆɽzw={1wHsBc;ֳ̤qbv}-[ڵ̫fP9s|0/ΗrW~s;"/^,7n^Y^GM7dGHrD+"ʛt=:.ꫲ;Oƫx?jⴳ^I9IjnJKnʐF1 ho4)r.kV/#٩S-[d#F4.mdkAxϗ[DֽlR١C~-[d˽4}zݼ-3u5/m~$e%%eI[W ./OwO^em =O3rȮBq/d6HoY< vd;DCC_g;kQߎoqGJ6jlNm^}62!6Z4z@$˲JJdĉ#` ܘyEn_/}lf#'wU+-k6~?cndree6o*w']vYֵܧu%o7xϗ>zK֧ܟ,{Llժp=~ObL'eNb=wmz۳Gvm~8i@}-5گ;tHkW}aBeHyCm, R ho4)J$ڴ+/<(wbѣr;+Ѕzܪ\EEd^5.dYor5(#hkdrN]DGBrF.WQ!;vLCpc.z'[O҄r鉟D!?lq>mziףl\~zؙ3~%K҈YʐXDC採fj\L8+mObq'mXG[o"OD꩎K.SRM]f i~?Ԕ).{=?pcM&7mo׹_!U <@ H^zlX,t7WVӷߎc~46?soϞ~n]mkDJܼ92ݦMMWO^*i22 ϭsgآE#GdOˎM Mؾ@*ԩ矗**d۶j~S?&>\6ol~Yy/Sil\ـ ;4NQ,Ma2ExaXP:52~9il&YYlFi䦫A]k`C e'NʤUxH=8߮)}e>eh5A@ <3|}sDHUUICȭ_#A Mi(e"ҝU{]`lɓfώSp?(mpykSߏ**j}NTP ת);[4#G-_^xX?D7;{ǘl}Dg}sQym#dI6v܋/F͕[22}#myg@@SJK^{M6s,+K.̔^}5px٣:w]t L"٨Qndii Y߾Se%% 8?_6rS4yn-ʞ~:\g:weÇsЩlDi&'wҝwJMtloξz=4o^sƎeA6~|H=oGQ/ В# zH{I\#-\(R!̙#=u\~THR@KDh"Gᇥ瞣2 _ @CpO9ɓ d˺t=,aeOxr /:Z!{) .gg_וtS eÆi#0@Vc(F+-Cd.gڶiJKi. 3g?"9y-*s{"11CֽG?[(r]Q+.LSR"^{MVP+}4e+\nǎpe{KI Ww{3eɶlk.tYr7ٱcgnǏ˵o/)>}zz8otVِ![宻NgO?+~K#ϝ+wl=iH}dw;߯}?ի%I6k[);䊋 <(?_֮܆ {f~wKuW͟/d{wҥ~'OʶlyG>=qp_痛7 ܗ_Jo=%۹޽\*gÉ#櫲ӧ_#Mco&w5.ԯ{b̑oo/_|/ƏE45ee;$ǣמ=͛T _ IDAT/$7z_F'߶bE2`F " pB髹W^뿖kZ +po[v-r|Y˗}l@_np"ka$);;KGlj_.UnZT^d%%~{h|avp_nϿ:^W=|s"T?UW4|oe\пiˤPvҦM~otg_jgȞ}Vo23v?4r?^yyuG 2u$n i~ڵ)Sd]&{C%bL<ֻ'01 O4IYYr| ۳Gzm?ׁsΝ>۷OΖM6MNwe%+*m&m[ߊ<y̝;z}|-e? u!7t\^~Ν~vݺ/\&2M*?k``rOKgk [-9";}Zvhz̚Id@0/.6'UO" 7~;꿥]nUW#crfrgHSȵjM1h[ہѣөþU+iP?Cv ~۰A6rsgYFW/ٓOJ[Kee},ٌRAAwGu&KKW6ujx"x\|wo7GnmsƎu$A6~xq;׾4, @.'-̔o/<8̗ dqJٌl6m3eUU >_+:2>K/=*u~F9sh/ mukYGl ɑ--ocX.'Gn2ÇN~p֭}TDܧ+){䑺Adc4HWf͒J;Jfr<~LON^xAbmb8OTyt!Uȏ~$W=YEEwmIݺU{j^P1Cֽ{# 78ෟ8!1Nz-_U}A=}&E{׳lHW^G;W وrL^++nX!%%RIdr5#䛐[?s=+\nǎpg%]dΡvdI䆽{|ɶl 0<.RƎ^z1~<΢G*W/߳f;Om. iZ3:5Js޽\*go>j"yFW6n}l7hHv۶֮Ʌ)Mr x5CO~ #$T k^\q}١Ceڵ۰AzMJJdǏB[WjX9-Y"]tIٖ-y'r(+^hcf:u[^6tܷEWItRjSrZ%woU@{_!ۼ9O^۵+bg2}ɲz+|ۺUO>처kWO?MɜCze7՚퓻*W˕ur7ՅoH9}^[z2TPPAiʕ; B ɲ1cj b=zH˖w˹Pk3goI k(}ץ|#zD1ʜ7'4yp׮8#H!!7tS}γN{L NJEdGN=ڸ\y_G6m6UOf+`,߳A~ݶfMd"2'scG !|2h9@"6dPvℬLZoM+IUd5ׇ.k'ef '6@ÇIMdeeÓF>EOftmk e]&[7]OƘ1~9elbp4ujd"2'sC.7)/UTJKes ͛?0!9)*6fܒ%r˖J`c^|1runʕgO;tk#Gl"9RnȴL. ^|Q=ܴiuĨ굢B<8rHrZ%o ʜ9ɓfώsrq]҇ fR6l)Y!KҼyD>MNg$͙#;֯A6~xq:weÇ23}'F7EOjֿ?K<=MO[ eO?-ʒ%1#2L$SdϡϗFu&KKy+:UR糧@G@ Z?_d?,7s&K/IK#wUTH#xFz;vLz%THs'p&p]HhќS>e:T[ߢNiڶJYz#͝KeвQ 9yn%b@F #@1Y0Hu@ D@F #@ `04w姬Z;~\_?Y۶%{ g̃bU_;9t!UhIw[o wKw-r}蠍Nn]}o^}񅬬LVP oi@ Ђ̝+gO7nUm[Lo6o-g4o^k@'e< EvE\uve/ ɑu kZ֣GdǏGϷ\CK.), iF6`ly/꺚嫬͘!Ζefe3gʪb ?Fo+/+l^6xw+(8OY}`Oe7~86m9^ʚDK+>ܗK>NmM|]@rlҥջwojEW\A%@3c7(W\,{e|ڍk| vr+VD{wDS's8%K߷e\v)|ܗ_Fl#-MںUb -r{VY) ,W\e7$ȅ2%lYd9s|?^E/Ko?SV_6UUIÆɽ-k2%'ijPH6yKIY)UPPAiʕ;hAGirr"ֶslF?І +3,u.[Tv萿#zYr#M^7mdkAs)wn\Uּm~Ē":,eLv~] W"̚%;zԗyvw^-7U}Irϗ}ǖ-#9c'ȾpݸQڹn^ mMqRQ@G@ NUU]}{kJvO껛_}U?_J.7W֧ܟ$ze7 }rW]%j|W͍ u* ki]G@~rv~{|%Vdmw?M)WV^6;A徖} ?SV_Ζ+)r'=(k[/Y#7lX85klɶ&^dO>)͛I\ח$4d3g,3S#{զ-kmkWXvmMw$~it<)i8o|z= hx3/zH#WDTG@3e#F>\'sG r!U<իի묷뮓 4= [Vv-K/j%*ٴig}@G|hССT @ Z#` ٣ʮRָ:jʺn@34O=%3] ?>8_FGK/IlrYE%_F>\9)D@g3dٲLY6̙-[d:H оwg?cJ%<)0A־Kcɢao/ ɑu kZ֣GdǏ'~_6bm[_Hvd}wRV^.{!% zZ4+.PR"^{MVP Tڨ**Feĉ/WSV=-[{ Y҃2I-Y{3eɶlk.q&9"p܁>͉/);x𜶃-_' h䊋 <(?_֮܆ s%[Z6L^~ @R=~O4}ݻe}&~nѢ,u.[ԗIwޑO8g]qlF_6l|3s]q7n&[VVV&嗼D в_ɍ/ץ?HiI[-Y"%]xfѩ-WSԯ{yFeȐ_V~9g܍7ʵm+#vPӜ9rCef^CZR6/I>mMw-]tkwT/TN۽ۯ 9IcI&ioܶrrx u_~)<)}/WcvӺu]FW}^WYYTױ#@l={uuY&5X~\Ut]^H} 49cG+r<6mjq7q}Вlc)ŋe…ԩiI[4I'wt=sS[/d ?e**dse.=&6m6n&Onq7u}Ђ9ItRjݻ7"+Y~rUR}UTHվ˼HrZ%6/*ssF[J?(mdٳ2%9"eg8iH+Zycw;@sTPPAiʕ;h\RaeYYtYF>cFdF?g)Sdӧ\ /9R֩rT"٨Qndii}ʦN,׹T\,>\>qxq1##@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@  ' IDAT`0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@ `0@F #@wUU[ōD`!;DijDC+"X lNsy>#`Eh#P i-llm (W \~EJ +\k1c̹1F#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@# 4m:MĹh;h3 p ](:*eŲѣe-Zڴ=,D^}U!kR E6y쫯"Ӳe7 kLִoٲ4%%Yz,9٧IOM*;u*8mdYY>6md?8yCu9׈C]u#Z͛˲eտÎ={w_-d߮?zl+d7m*GjU ;I`eggkժU޽;$uؑF@dD46l…Al ?I#G͛2SZN.%%)i` d%%Rf\^^$w!5n,;xPKn4'[U=L;źѴsضʶE mZTP }yyA9s¶_P#gD+{n]%Հh" >}lfٗ_ƎvΞ-7o,-M`uoiʔʯr߰>]k ǐ!>ʹiryy^ٿ_6{,%Enj|ڜ{eW]%[Fײ5k/-b]h9^oҶYZvrwK99v_ǒ%${yþ>@v}5VUJذa}meg˝:%u'̈0͈n޳GCYr\Qw-r| ϗ7( ۾]sgWmR.WP 3&t޽>X=`ٳ~G>Ll-ʪa)匦ö]ut=]X.;[v5r~}yUnV٠AM7IR߾r TlD@8 ׮+y@ kNKH8J;lrŕ^Κ4;y2M/׶m4IIr'N6m:h䊋er'Oʎkٲ4ݑ#T'rFaۮ 6}yYJ1Bn|t.ݻzme*ngHӦII[EU@ԕ$j:]II oJw3|9llPy_0@*,-_.0Avr.=DE+pMuO$7iܦM"5<gOI}<Wn!uSزeiotG+包^/??ڵ~۩Sk.)In@iӤ o={Jw< zsn]3Gviu'J y1ʒ͚%+,?.;yRelLY>1rN(e?zYv?6bN ;Wv{ei4uƍˎK]X]c]Xƍ]++* )ӏ} [b'EEٳU|~ˎ}Z9U3lA9RRdiN)̺:5עX# mx_\N[nժɓRf\7I22\&MdK{fŋeɝ:u;źѶsy=Ζ[(8mZTPp~k3M!7o^z%ѣ &pakGQϐzͫ!jk97}lJٰad˒d={&NT~~һʦN%KL%'22dK4 Ҋg-M?uvv<٠AMec)S[^=c\Θ}u+ѣeZ:{9~5[Z6tukWnL5G'e?˕A=C1CiR6j4wn}!1"?_=,#Cn4u# 6d_Q޽3Po4 #ddIvر4 FK|쮻d˚4u,4Iӟb:G?pcD!ʫ/sõaDq@q@8J}*%FWHv JlX^P5OEj$3/b1"@dQzӥ"?F {w+w MĈ'd eEE%dV龢".1QvDi&snŲѣe-Zڴ=жclYf>ͣʊCD#KO%'˚6N:zRziBA_FdU<^\J 3,#CֲϳKɲmT*Hs}mdYY~H?Ɲ P/2@;0"\bن RFif@Wr-ZH7ʝ='&FvPn994%IvtrwǎIl YYI)|wer|B|!E6l_o63F7/mԩ~juRR.JElDQOvԯ\cǤNv@Fk$F_ߐ;{V󟃏GbvͲ/͙Szvu([Fײի *5m\^#d͞-KI[ZzᅚW7E[Pm~Cϟ=[nm߾I5".%EKnN֭ҦM~uLiFٮ]r۷Kr͛GwBBE^%\5jIi<믥e͚IÇW~n͸K|6Kާ|kI`sgfrOK/rjIoD/kW}睊S`\'9s m+{\aHIÇ5kV={}aM_m%ܧZ פj@g9Lg9'͜.VS'[VVTc?b#vܹ/K'zʕg/|]48i$η͚%+,?.;yRelLY>QD">h8Y~1Y~4n\6k$9I`eggkժU޽; %uؑF@ܱڵ{۴Xr?X/+0MJٷC S\C|38ɓ-ddHrMĦ^.,ӪU0Zڽ[IYreҭmx[/pQ(g:u 3}޽ N3dŲFNAs\ 0@-'m[Ye|'v5wG|֭Ν[WJJJnʠhz Sz?.{iY-Z23eo]D#KOi6N:UyW^ &LDyVqlhߞmȞ|RfV}',XlZJݻw?;v4x{Ip#\ *srgʑ# EϞҺur))AyiXz}&PhgIrw> ce/{^ 4@.5U6|oȞyFM*7ylE"ٳRNrɮV**vk tPxrK>PK?\D̔ ;JGDӎQ_&Ly{=l…g̐{sss5`-ZHÇgDP/{O%;qBn,Լ˖/ɝ=͞-7o,-M`vuoiʔYذaumeg75+z='{cGٚ5^-mPڸ1(Jd׿ԁ*>-W_9ڵyߖ9z_矗>6M./Ͽ K/=["z _;vj7s^͛cpaD@@\snfD@r\q ]m*4H&?uP߾G'XrTΞ-ʯa;F} o&֯fy=(*@}(拗tqׯ_|jIڹSdg~ uɒ}v|32Dq=ѿ+\>HoOV/Fz\βn|SZwYwڵ[\?_MVPL \1,쳪i;z1T9OO/ܾǎ%תUŝ]ӻL$7iܦMrueT4׻mԿOʕMe=ză+[$BS<5/o- Q&.\ϥ'q\۱]PTyQ5>9[7=7{)I? Ͽt~s3Gvi!)gTz:mx֮^]N@m/}?~ᲦMeMJÇWڴ)YT<|~[XXKJ8Pnڴ6nۮ]w*lYpDҎQ^&LD Fۉe<)[^Vn-{odf eǏ|l͜)ǧ tЧH~ p󬧦ʕ^/05̸qkeEE5k^)n$i 7)Jo)r}\JܱcyOjeG>DMAe+VȎI{4bN ;Wv{ei4UޅM$hł``;uJnU$8סYB6~܋/Vq1=-…!v>4tܛoVZ e+-M*( .ϗ;im='7iR7&E}-KrG6=#Y,x^骑ۻ9IDAT{,~y4;aE )7WIȞ*1]hD9Αb`rK+:U֫,1Q,Ȑ-]y>ӧy܇ u kX$S6qbB3fx@*kR6j4wnLO Ӗ|zuk)/O땚*3&5+ѣeZW˫$x$ZyvoQDֺys~ rtF~wޑVukݺ~3i,^BbgK$9'' @$.m"D_߿#Dfϖ{aُ,7ujݬK^+O;q#Gt:Fz.]Xz15 S`"#8PG]gyvC,1QȐfΤ1hK39ZvX#8F 8F @5_Kum/P!MG|bʙu#cz={wYrE Yfӽ,#Cֲ,!A֥ldW_U3=qŸӰtz[*WT%&NWqlh_6mdO>)+X!<ؗiSY>U3*;M`ڛHxmmclYfL>*+._uVR"ɑiSyT٩S!eOw?>{ܼy4قnQO)SO[oۿo}s@om,Kر~_]6LqmlS_L" LTUXi4y<ݲekȾZzaCdSe6M./Ͽ}Kfϖȭ^-B<ׯ-_.+*:PHƈ0xb]m*4H&)#CWWnEdr}}\β۲%wotlDidˍ!ֻ~{ >6{>(zQ{Ua@qB.!6+=AmgHӦII[B9k*PUcЦQD=rDeGȥVO4$'|g{6IIe rZEUF!7`TX^0Avr.=OAǷ+)>meiRR^vm*mwN̔6n%}Ͼll>:%s˛4In$M*tGRΘUeElCmCjWKJ8Pnڴҹ7n۞=%Is6mU?>3̔;}ZzE_W|6g!ӲÇC&[gD}uΩ mM:mŗ%i w׮~;OZ,8MmW}l ٱc"ib (cmVl,Yaqɓ-[d3g>mU9s|r@9'͜Z?"%'iƌ 60-ʕH9ŢM#+oǍ]++*Y#y{0A6wAĉijWX# @\ 5e$1Bn+KЫ,''8P"F*F@]Ĉ11111@}~}[d<4~4ul6@HiCJMH?mZA jkD8Pzu4jb#ڴ5o.ΖVLꫲ Y˖Y.ɓe_}UbѲ-|9|RclYfGN[R"ɑ˒eMSN Y׶meeG? oFɓ…FKA p scF`@\Q@F0\T@j!;D@n!1QkD$;^sF.FT@q@ncT@X,p@ @`T@%`@Ui@adycQYuq$ o`A 5 uZi|ʎ07kLj@|r.NĈ@|+ g#?@cuY'CM8 ėz&@yį %W bj @Q bD~'805R@#@#@#@#@#@#@kT~wZvĉEā}$馛nUC$)%% X0q@qM@ڵ+hq w~I\}}?{9̙3|͛h"Rf'>}rss%zO?ҷ{-[Ӓ[nE7tS955@13(///&O{V5?iOjj*SP眶n'3E?TT*5Z_vߔ //#:s&=_(#-[g^sIJJҭު Z bAHX[=O=sOu(-*ꔔk6䱄uA7pn)!!!d:e˖ZF<Xr muycI+;?yoNG`L~iPZZZ]viժU:zh={XM63"PaC-~==fzzWtiez8-U8٭}H߽ ;ŃWn7*]{ w꺫]oՈ֡*fڳg l29s&XBBB $]q뮻*?~?jƍڵkW->5/mƺw%Z{>pB/YV˵GtE=[1اԸ__}%Ф)QI:AS7ҳ7`t =3O#lDvLiz)uZ̷+-… vZV8֮]AW8nfڽ{hѢErbݗ۶nji/Sl pziɊ&{ȍJ,ӆtwoW.wh԰*S:-{2wjVW#ӞwzC/չ Z\EҮPg*Ke o߾ʶܹEi#5[\DLm@ot eg6KhL[/]v3w[ڔvڻԛukSNVY4Urt)$WzV$&MM#łKV%ZsN%-Y/&տ$u;5h 5 TX `޽U_n#j-H@Zl}7a,WKV5נ!30߹Jv׆å'Wg~m z#;_:T8~۷/ۃ9ԡCp ;k jWʾVQz}))6%nԨzGѫ.]SNBmݺ5d>m۶UVj$ 4" /8qB?~A$&&*;;[m۶r25q>쒥{]A3gw߽  *))ԮtUV\q5lP[Y~/ƍZ jՙnr7԰oW޽OLLԕW^$9*w)11Q]tQѣDסCt-M6:zVZ]vk߾.HjٲnZ-ojjq7,3SÆ~,CJJ:w\!pe)%%EԬY3eff? B Tq.UVA5xL @JMMe`♓d4"OqX IENDB`mu-editor-1.0.2+dfsg/docs/icon_brief/mu-high-contrast.png000066400000000000000000001537631341747546300233210ustar00rootroot00000000000000PNG  IHDRXsBIT|dtEXtSoftwaregnome-screenshot> IDATxy|T߹fodHؔ}GPDŭuվUkZVVUkmժXwQYdٷ@B}d$d̝$|wpsssd B!B!Bկ0[׿Ŵip8(zHB!B!B9]שcʕ\ve7}4 Jwy'> ׋B!B!B!DwiiX,.{챦[ۀN~_vz{G,B!B!BnuܹsfժUe 9|0 |B!B!B!j%--"4^B!B!B!I1Q^PP@XXXB!B!B!LSUUERR1"t!B!B!D. (z`B!B!BaC!B!B!!$!B!B!$&!B!B!$&!B!B!$&!B7}g3ml<5~υf1̅jU}`G㮫csɭ4t~_߻<Μw!߾ Wc;GW{[N=B`?_K^KV~JzfQrάx:!B!BKB!)5wbQ|or%ku~Ww|]mHf@'䡟>ҢZ]oz~x'/8 r(CT'B!7B!DEհuwɿ7J">:Wg[@|}oR}cO׿>ϟS{oW[NMK=~7 #B!N f7ee[6sVP۶{pB!Bo& S~QӹV17Ļx硹Da纗K٤V?}-\_QJQqKGS~%k- Q p0sb֯]ѫ>+׷PXL8:nt4q#\8g/$|u7~xW}Ɵ~1j }:W~ʩ:1f⵬ەG+w7ヤ)޺}.oiw=_]V>2ך^~W$ˠ r3&r]3'Q5:ĚV*B!,s@ln'?Rv!c-}dB!Dߦb8HZͫ>=^y2-2Ju^̡;7VуJTxss8 f}NXdϻ~r%gSHHbr0z AVp/qIz!0̙ fˏ:r2=+>f搭.oAS.F]#nɏqxXڽ򻏊wz~e>O|^>_1r>gB!?iݷnn{>ԶeDB!#g%z9`|^9fB;A$x.oKv~f᰷7 !B" *(Lc) 5.%]ұ}9xOD-Ա O5uJ=̍^q>8Ԫa&s!Bs,7<,/1nk B)ο Oy@5~ ~6+t͞wǦ: 'M EG|g,fJ9fAC Vc@&Nϊ}C'/fPS_=2UD "⡠ˠc7op5bf5wvBlB!tyws?,?,&c:ĭ?+mˈ!BqP `᳽r/y5m?,֟={ڶB!'-~zs9Cnadt;[ĶOXN,] /[II?3uw%qc.Xn綳a/0)e("%+oeXG~ʿ_q|痋cJ$'d_mΣrw_m(g3ȼxl{6 :XVeZʢދFb߷_=jx[W>[n<3WQ6dSRJ!Bce}RߞfeAm[zeee(B!1Uq煿axKHB!BDDDȈ!B!B!d&!B!B!$&!B!B!$&s!B!B!')#@!B!B!8I @!B!B!8I @!B!B!8I @!B!B!8I @!B!B!8Y<OoB!B!B!B PSS!B!B!BTTq!B!B!"ᄏC!B!B!!`?^B!B!B!Dh}B!B!B! !B!B!'1 !B!B!'1 !B!B!'1 !B!B!'1ko89)8眑1i$FՠJQz=x+HteCPPƚMG:[;V[r#3(UcLYeo[hPd6("@p;ؾ'O%dS+'%MAy7Sd%XOzr0<+2"ü;5 #S e`Kʖ}VG:ڋۧ2r NrRq1C#I+gxc4V<(O)kdՏC]&=Qgx<=(O) /k9RYnش;^Sq H1sr:NV<nˊ/SR59ʫwOtק墺:$v:bL('cxN54'+ĭraը )u=$.yN !BqbP>~Y|3^gxz%QZ^жt夼Ɏ>^l}Em۬%9=1sHĢUG[+WmcoUաyI#ۏİt|.4&6p s&1,)cbttݨk e|A)hl`YQxPRɋTԹOܫI |k^"DգUmP~.G3kS=$ǺQr7X(FzȱZ !8ޑi̛l'ѱj#vt-0 z<@n^q03<<1hh;3'D2}tJrìh4kF T4@$ۏ2>RO~Q ״c@<'B!8_gg1{TNհ~Yԫ$YtKk1y|{bXJq fѱq,&/srMG)YУh:Y-dgD,'1j0.DI6 *'{" ;B}CP z:'oJfOI.Ba-] 8^XeWT2qP.#(kLѨX6uz/Hc!oy}YFpx7NUąW5uYQZbvlV>:Ӂ !Bqb i b0sj6W_Z/.vf{ڍw{'pI\;߃KgzF{T>ޒ3o𑂐3߄zF „SY&daԣtc=uCtPxnwׅ2kvj*c&%E5*7/ѨVY<i>Eť!ߧ4Mcʄ\ ѩѼeZjl>:Wu;zC|u Z_Yzom7`.3RX0eX-:}Aget~MG^ xpZzWO>/B!ĉ/dh-DtؠK8-Q F"= rB^K oL๷8p5vOkdS;lD5t/4^uG}<5wH*K>9BMrzOQG}H4b#wI FrԃmhjW6PQ` E <΃ڃFYocmTuhZxOUW{*LM`oʽ*T 4Xc-޸YŒp%i3ӹ|/ځҔ({*8Rk\Ǡ>uƳ:VfԱf1n.-5+$pr1Og ؍KQI9*:h(5}xuǿV=$Z?Wȑf"3ܰµn7qMF;_4cEq\/SaUviJ3>fC[u `]N^@aG^ |SB!BBX03{TXt"NI12нB~_BWI[&-?in+h4o')FDOFiήw79wBZ(_c:rjFwrDz*[F M9)\qf! h4j45k!#r"Dle]A{/ FTBe+v|ƎƆpnKS[wz}Uhh^i>@xp7ч I !t>=&ץko* g6(_^t⳽ùgNׅ { DN0Xpf|^7]Px;N擕) 9jD_Oz.[Q"Fkn t]\aVn(Kt4M*f7@IS ^y ޕ}Vuc\o0QV>ULuc(ߤB!';SaN+x چUuл4q0e}p5w*?|357a∬xq<oPV%*\ZxKftiU@ Wj4{[ |&z>Ew.BUl 8<8@RFCFtH>^Of1bzhlI䑗juW&6lMWYǺW~{ğc ^~Z8'.v+[sA2A5z$}C6 ["n(w<=}c\nYöbU'.o%hO0j,DTzNG;GПR[gH  dr׷X=Էѐ"'ڃo}PJ1fX,w_ 3.h5ZN6 L#`ҝI{ncD]rwF#X97;T¯_fet1@79)B!δ@@<0Fj2^AC eƋC FVtʆ񳧪ؽPhJ)f]hE3zd'_c e=jB{p{,=XE}}Ͽ\zT1>cȬFQ#ҹZң ihj pBoC\djMSe_@kPUccJS㊑.6^b] 3uUfձ.g_'UfrMS q!;d5ʍw@{)8jx񋑼🕽؟_ߘFV:4Z?t:n83//k4 {khbeODsP/O}?̬ ص+(KAY_zn @)59;/%UlT Oˌӎ0ʧ| U8tJ,[ףفosR!BLMM x#óSyHR]_y2DM^j@iN-GrNZ/V@YSYNaq'iyLvsǢ<´`ݐ#Y(xѴAF, G2b+Ez4ipzk:W?o2^3~QlRFٹc&i̷"Z1a;9=oձWQ:-?,;0!tҕ_ N6YY_bmWBK{de1Fh͇,#H=Vk+QXU^ i~dE/]_#>Y4gc1 gG6rS*nk⢣I1MFS\cݡ^J),p( 6:փ`X$^{}kNd(327Zlל|-dm4n˽ZUz-c3+QCٰgG n!ɾŷ~0vHQ0-bf#󠴸[r1qv) 2[ZQ41 FgW=ϯf kV#kc VVcFkLg<'5SƮÝ?' |ӟB!B dDuڗ(e4Ĝ}*i)ctVtQ\RvteS]hzeO,~1 Ke8k(mL^5b(nM IDAT>NLL%f֣`F kHiѰxA=)4z2FDnVs([=L9#v Ȁ^L"'G!|I]~٬i6`7z&\н ͦш=ØK|7ql\)f9?֏~mk -Dֳ&b lh * ܒό٬awO֪]{ 8sBwMdXCsok'cJ56tO5:hTl0Ry5l/G' ,I!B!N~œV_;C1aU %bgi^0g44=eLN!H-H.hађRF:Ӡlƥ#dAfW!S^cPyY(FCxZq Ro0M=s= 4r-nfOq MO^hPG/[l.H{ Dƴbb]CQbǟfZNT}㨉,/e: 5#\F> <^0N[ƨޮo=p}vPJq(FYiƱ)SGsE2&n XLePAbB!!@#atʶ/ IC-9L< )+DOBC2ɆKʵl@Դ1oӍ^ '3Vx9͡ jg~ XH3BPir:,}E#ҋPbY; R#A_V5 *րx JS堬]Xu,t@;,~6ҵ|CʯΚbU&nlwJ#Ø ܚ>V3ut+rRVSm:0c\ZP81dMb&첾h(0|p }F7o 5]HO⾫شe]7&OB$EeU=,1 mشjƀ$!OMӸL"[7)QKX:3uxw\sB!⛧-kϏZȸo04Ʊ:,cXk@MMa#m'KИ/t˽FCmb`|N&VQp"\1W*']7z&_wM2&_N\Ds/L:>ĸwq:=ro*l55?2Q . 9&ǚ+5asJEb3&NZQ]!U&S8Ɓܴq!>ꛮxuFm9nd:Oه=sHzћ/_  76>ӍJ0s~&zB!⛩ہS7դn'}\cO6Y}̩Am5n -͇>&22=U<^k}<&a=T|iw52d5 9xoGHy"H'22Ey[Mи(xVF,sSq~l7wֳe1;SK13QHgBq̘2̼[߽.|}5Lnr*Z1F$^ڇu1MP…;KE)u,:#=}xus5B!'n]=_CzK"ƛ}L184O)W~hV}۸0#@x^t3z給,C#{ )a;7ݿ [zH1 gs';v A=L -Xps7ꊮTPUM59Z2{T1b+[^gRv.t) ƳjƳBgڠ=#WͷyZ܇ubfB~d)(g\*km>[a?Y߯Yݹ/k(q A;ۖzN68‹n߽ͮχ#D1>t][ WPQ0#@fItbΘ\ꛞzNkp]/s/G[ A<'B!8Qu+0y`$>lטĜMt]3RiƱ,wb[5$ğk5|#+/`3^'XmfвלST=}*=>e<dEK!G::0uc<^{mnz=0 dƱ7QXW%pf铇14Uc_U=XO]M)Ft]'q( C-')Uƽj^:- igt}C5YSWOYU-%5TPQ]g$H3^axX0͊XCwO>'K+ky_PPVMYUOK-B!'n-=߅Wp3_8BS۶F Npڃ kGi0{t9k62j܈6kp3Kq+zkw67$ڶ3zX.{s=U:k[3a6~xAVeh }WRŁRn6rDQGR%KSJ'זּs7.IԱCu B{Vָٴ'-qXUX4EB8e08-!,Hm] e"6cON15x:av2I9o@RUP1x&e&*Fye}3mhT_됰qr[߽^ ^_Wl'!*0ܢ ԕRWr۟>@aYU>u]09χWk5x/NuYO&_3☒FRژȜg=Z;v|J+jolwڭNaьf~S" =?dqE hx)(';=sR!BY-1NΝZ#;CMyǷ ݹ H`A0nu9$p4 pT.L8)&ይOS!:t5sX0%%9.'= =w16dc 5[Tkng]Tt8n0,#3ڮ#QP WmO67hIsckR$Ƹ8oP.9HysS ~n^ygf|c1ipoFnEay5 *c2"#h#LQY5; ˪1-GRR(~ @ⅠH`(?GI zYr'>/|⊎[g>掿~ _/&վ~gq -'O/[E+o5Ų̻+՘sx0FBlTKtf4B$!ŭL{.w7{ qa\0}[0G8YmN%1\uqf׏0kyḫoݥ:KVjH~3t9-򴘫I{1 <5<j #O4,ߚÝO̱ S()s\Cݿ sò yM9R-ॏdNjmsR!B]9i>z6OƎ9–V)L"CMj[?}v'Exuz{=Ͻi-.(VȤq~mFQb̝jzuc٦ MSV__Ι9"FoP0*=(MXp,?w__/|JAY_u|!{m;f^042[{̬'#]۬ߕw٣E왥 JsIAJFg@(uӧ>~uͮc*(ǖVs ''2c sR!B]]nV0T'\U4*77/^IrR[\Ƀ/୕;vX&M~X\T|t0X~ڽ1])=owBi~1.b"]a3zuZtk;m$DpRࡨj<>!\xl7kӷae+aW.miWhqaX-%5Pݪǫ[bh4- ϲ͋\ZNR6OuBG:th Vp  ds3G(!לic]+@^)i a8SO0ulړo_ ls&g%4ZNRVDԭ.(w7z976 нȦ(ذ;1S)]NլڬXU=;rUָY Cwٰ;ܢJ< BB!d[sJ0E$d9xir֒$X'k4$\9 b\_y{YJemL{F ;g9/t#}CݡECRkKQpiIlRF޴'!GN ;=FO#TIZN*;nw`؆ݹes,qY!cf]l>^YMH'W5c<)ue[|!T[%",&ߐV߸W_)eUAMS̝0͓7x)(u{[jlux H`pq3M7Mm{ݐ!Y{~:DM+:Yq?+dBj J˦h[/X(C'p9vEus#=YMr#̫oUPZmd ]NiwDE@;>v+#ƀcS?vD8m=y笔bA\3 Q.ʫxeV|O4xtv' !w\ÌIq݅Ȋ%YLU7k0X 4I .X)6zB!B :}%9L27fZ#w1EZѽjB`{+| @Wow7`Lٍ--ǻ}jfz_ZE~z6v_ZE]}C%zԙQbh,>2v8'pCo??@nQ8RZ#;{uVcj9=gjWWN!cf]eUu??$W+̀~:WRZYKƄ,ljf ;]7o)Ioum+uyg}{F,l~u홌JiY-d&=8e`w=,*|n˙&ʂ3=|,Tcd_Y{~*OK=F]ʭN%*\.]:0z[_uM?FMIצΙ51uWEu>#?-~[“"?Ӂ5 C)`1g\\'| jQ:3% $D-OelVO @)+1lTILd-=,Y;Rp̝u5ƴf^hKB!'N8!{'AƹyZu뫚UxWNx-=z",:}Dp¡㋼hݛ9Tչز׷ -ZgوGOD=̬qPЌrG1G@S>M\6\G(Z(ryZWp‰ݍ 3-Yn6uNT,#?8v̔zج/Nw?'۹GݤQVfp-dɪ>"?_4o<?-i^/iC6}yV̈́kG|(;H@JbLOGf]9}TFG#;=ڽӾ`XvuWR9);G19Uߺo^r;]XIUk`<8Ÿn>pg;Dgf-DAh9m3?|p[}nPj>p,&@PRY8u -VYw6#ۺ)u#:+K`r6iQ\B!B :}C<6 h eʤk}-8/ Ǧ߻΃yZ4'PRUIW{]rhi3i6WCU<^/EmRjt:Ex<AԣXjs ㍗^HVXVSKڽ\y(Mn訁-~м86fԱ0;bK0'sWQ~ڷwh=ߝ3 [N=BktAXNf&ߤ(O4/w];_i}]{p;?] IDATm:r' fc 33fM U--`O-Oa"5Λe\8VI|r:d$Es%S}{qn gM˂?wި3[u]=RL9qCRlA^hKA|}sG O^*MbbDNs&g3oRVsz30S5n)yN~с=s ²7Xۦi>^##HE&-eg¾XyyE7?/='B!8tHk8Ȫv0!gg /|%+wR1Yܰp[PȚNVl;QKc}IsW`6G